diff --git a/.stylelintrc.js b/.stylelintrc.js index 1065c0c68de..b8bc231c4a3 100644 --- a/.stylelintrc.js +++ b/.stylelintrc.js @@ -104,7 +104,8 @@ module.exports = { 'selector-pseudo-element-colon-notation': 'double', 'selector-pseudo-element-no-unknown': true, 'selector-type-case': ['lower', { ignoreTypes: ['/^\\$\\w./'] }], - 'selector-max-empty-lines': 0, + // правило ложно срабатывает на интерполяции mixins (applyHover, addFocus) + 'selector-max-empty-lines': null, 'selector-list-comma-newline-after': null, 'selector-list-comma-newline-before': 'never-multi-line', diff --git a/packages/plasma-new-hope/src/components/Button/Button.styles.ts b/packages/plasma-new-hope/src/components/Button/Button.styles.ts index 2a828b7c711..f4c3a6876fb 100644 --- a/packages/plasma-new-hope/src/components/Button/Button.styles.ts +++ b/packages/plasma-new-hope/src/components/Button/Button.styles.ts @@ -1,5 +1,5 @@ import styled, { css } from 'styled-components'; -import { applyEllipsis, addFocus } from 'src/mixins'; +import { applyEllipsis, addFocus, applyHover } from 'src/mixins'; import { component, mergeConfig } from 'src/engines'; import { spinnerConfig, spinnerTokens } from '../Spinner'; @@ -143,17 +143,15 @@ export const baseContent = ` background: var(${tokens.buttonBackgroundColor}); box-shadow: inset 0 0 0 var(--box-shadow-spread) var(${tokens.buttonBorderColor}, inset 0 0 0 0 transparent); - @media (hover: hover) and (pointer: fine) { + ${applyHover(` :hover { color: var(${tokens.buttonColorHover}, var(${tokens.buttonColor})); background: var(${tokens.buttonBackgroundColorHover}, var(${tokens.buttonBackgroundColor})); - box-shadow: inset 0 0 0 var(--box-shadow-spread) var(${ - tokens.buttonBorderColorHover - }, inset 0 0 0 0 transparent); + box-shadow: inset 0 0 0 var(--box-shadow-spread) var(${tokens.buttonBorderColorHover}, inset 0 0 0 0 transparent); scale: var(${tokens.buttonScaleHover}); } - } + `)} :active { color: var(${tokens.buttonColorActive}, var(${tokens.buttonColor})); @@ -196,7 +194,7 @@ export const baseContent = ` opacity: var(${tokens.buttonDisabledOpacity}); cursor: not-allowed; - @media (hover: hover) and (pointer: fine) { + ${applyHover(` :hover, :active { scale: none; @@ -204,7 +202,7 @@ export const baseContent = ` color: var(${tokens.buttonColor}); background: var(${tokens.buttonBackgroundColor}); } - } + `)} } &.${classes.fixedStretching} { diff --git a/packages/plasma-new-hope/src/components/Button/variations/_view/base.ts b/packages/plasma-new-hope/src/components/Button/variations/_view/base.ts index 62cf711c495..74e083a601f 100644 --- a/packages/plasma-new-hope/src/components/Button/variations/_view/base.ts +++ b/packages/plasma-new-hope/src/components/Button/variations/_view/base.ts @@ -1,4 +1,5 @@ import { css } from 'styled-components'; +import { applyHover } from 'src/mixins'; import { tokens, classes } from '../../Button.tokens'; @@ -13,8 +14,7 @@ export const base = css` background: var(${tokens.buttonLoadingBackgroundColor}); } - // INFO: Чтобы не было "залипания" состояния на мобильных устройствах - @media (hover: hover) and (pointer: fine) { + ${applyHover(` :hover { color: var(${tokens.buttonColorHover}, var(${tokens.buttonColor})); background: var(${tokens.buttonBackgroundColorHover}, var(${tokens.buttonBackgroundColor})); @@ -23,7 +23,7 @@ export const base = css` scale: var(${tokens.buttonScaleHover}); } - } + `)} :active { color: var(${tokens.buttonColorActive}, var(${tokens.buttonColor})); diff --git a/packages/plasma-new-hope/src/components/Checkbox/variations/_view/base.ts b/packages/plasma-new-hope/src/components/Checkbox/variations/_view/base.ts index 91cd23c7b4b..bd4b729a02a 100644 --- a/packages/plasma-new-hope/src/components/Checkbox/variations/_view/base.ts +++ b/packages/plasma-new-hope/src/components/Checkbox/variations/_view/base.ts @@ -1,4 +1,5 @@ import { css } from 'styled-components'; +import { applyHover } from 'src/mixins'; import { StyledContentWrapper, StyledTrigger } from '../../Checkbox.styles'; import { tokens } from '../../Checkbox.tokens'; @@ -14,11 +15,13 @@ export const base = css` border-color: var(${tokens.triggerBorderCheckedColor}); } - input[type='checkbox']:indeterminate:not(:disabled) + ${StyledContentWrapper}:hover ${StyledTrigger} { - background: var(${tokens.fillColorHover}, var(${tokens.fillColor})); - } + ${applyHover(` + input[type='checkbox']:indeterminate:not(:disabled) + ${StyledContentWrapper}:hover ${StyledTrigger} { + background: var(${tokens.fillColorHover}, var(${tokens.fillColor})); + } - input:checked:not(:disabled) + ${StyledContentWrapper}:hover ${StyledTrigger} { - background: var(${tokens.fillColorHover}, var(${tokens.fillColor})); - } + input:checked:not(:disabled) + ${StyledContentWrapper}:hover ${StyledTrigger} { + background: var(${tokens.fillColorHover}, var(${tokens.fillColor})); + } + `)} `; diff --git a/packages/plasma-new-hope/src/components/Chip/Chip.styles.ts b/packages/plasma-new-hope/src/components/Chip/Chip.styles.ts index dd74a350da3..59ead032153 100644 --- a/packages/plasma-new-hope/src/components/Chip/Chip.styles.ts +++ b/packages/plasma-new-hope/src/components/Chip/Chip.styles.ts @@ -1,6 +1,6 @@ import styled, { css } from 'styled-components'; -import { applyEllipsis } from '../../mixins'; +import { applyEllipsis, applyHover } from '../../mixins'; import { privateTokens, tokens } from './Chip.tokens'; @@ -45,7 +45,9 @@ export const StyledContentClear = styled.div` margin-right: var(${tokens.clearContentMarginRight}); color: var(${tokens.closeIconColor}); - :hover { - color: var(${tokens.closeIconColorHover}); - } + ${applyHover(` + :hover { + color: var(${tokens.closeIconColorHover}); + } + `)} `; diff --git a/packages/plasma-new-hope/src/components/Chip/variations/_view/base.ts b/packages/plasma-new-hope/src/components/Chip/variations/_view/base.ts index f9483104ec3..55474403fea 100644 --- a/packages/plasma-new-hope/src/components/Chip/variations/_view/base.ts +++ b/packages/plasma-new-hope/src/components/Chip/variations/_view/base.ts @@ -1,4 +1,5 @@ import { css } from 'styled-components'; +import { applyHover } from 'src/mixins'; import { tokens } from '../../Chip.tokens'; @@ -6,10 +7,12 @@ export const base = css` color: var(${tokens.color}); background-color: var(${tokens.background}); - :hover { - color: var(${tokens.colorHover}); - background-color: var(${tokens.backgroundHover}); - } + ${applyHover(` + :hover { + color: var(${tokens.colorHover}); + background-color: var(${tokens.backgroundHover}); + } + `)} :active { color: var(${tokens.colorActive}); diff --git a/packages/plasma-new-hope/src/components/CodeField/variations/_view/base.ts b/packages/plasma-new-hope/src/components/CodeField/variations/_view/base.ts index c282f6537cc..df134bb74a3 100644 --- a/packages/plasma-new-hope/src/components/CodeField/variations/_view/base.ts +++ b/packages/plasma-new-hope/src/components/CodeField/variations/_view/base.ts @@ -1,4 +1,5 @@ import { css } from 'styled-components'; +import { applyHover } from 'src/mixins'; import { CaptionWrapper, ItemInput, ItemValue } from '../../CodeField.styles'; import { classes, tokens } from '../../CodeField.tokens'; @@ -24,12 +25,14 @@ export const base = css` background-color: Highlight; } - &:hover { - .${classes.hoverEnabled} { - background-color: var(${tokens.backgroundColorHover}); - box-shadow: inset 0 0 0 var(${tokens.borderWidth}) var(${tokens.borderColorHover}); + ${applyHover(` + &:hover { + .${classes.hoverEnabled} { + background-color: var(${tokens.backgroundColorHover}); + box-shadow: inset 0 0 0 var(${tokens.borderWidth}) var(${tokens.borderColorHover}); + } } - } + `)} &:focus-within { .${classes.itemFocused}:not(.${classes.itemError}) { diff --git a/packages/plasma-new-hope/src/components/CodeInput/variations/_view/base.ts b/packages/plasma-new-hope/src/components/CodeInput/variations/_view/base.ts index cfbb6764b47..3b160269ca8 100644 --- a/packages/plasma-new-hope/src/components/CodeInput/variations/_view/base.ts +++ b/packages/plasma-new-hope/src/components/CodeInput/variations/_view/base.ts @@ -1,5 +1,5 @@ import { css } from 'styled-components'; -import { addFocus } from 'src/mixins'; +import { addFocus, applyHover } from 'src/mixins'; import { CaptionWrapper, ItemInput, ItemCircle } from '../../CodeInput.styles'; import { classes, tokens } from '../../CodeInput.tokens'; @@ -52,12 +52,14 @@ export const base = css` } } - &:hover { - .${classes.hoverEnabled} { - background-color: var(${tokens.backgroundColorHover}); - box-shadow: inset 0 0 0 var(${tokens.borderWidth}) var(${tokens.borderColorHover}); + ${applyHover(` + &:hover { + .${classes.hoverEnabled} { + background-color: var(${tokens.backgroundColorHover}); + box-shadow: inset 0 0 0 var(${tokens.borderWidth}) var(${tokens.borderColorHover}); + } } - } + `)} &:focus-within { ${ItemInput}:focus-within { @@ -116,21 +118,27 @@ export const base = css` 14% { transform: translateX(-0.125rem); } + 28% { transform: translateX(0.125rem); } + 42% { transform: translateX(-0.125rem); } + 57% { transform: translateX(0.125rem); } + 71% { transform: translateX(-0.125rem); } + 85% { transform: translateX(0.125rem); } + 100% { transform: translateX(-0.125rem); } @@ -140,6 +148,7 @@ export const base = css` 50% { color: var(${tokens.codeColorError}); } + 100% { color: transparent; } diff --git a/packages/plasma-new-hope/src/components/Dropzone/variations/_view/base.ts b/packages/plasma-new-hope/src/components/Dropzone/variations/_view/base.ts index af3b7f276d2..c0891b9825e 100644 --- a/packages/plasma-new-hope/src/components/Dropzone/variations/_view/base.ts +++ b/packages/plasma-new-hope/src/components/Dropzone/variations/_view/base.ts @@ -1,19 +1,29 @@ import { css } from 'styled-components'; +import { applyHover } from 'src/mixins'; import { classes, tokens } from '../../Dropzone.tokens'; import { Description, DropzoneHandlerOverlay, ContentWrapper } from '../../Dropzone.styles'; +const hoverLike = ` + background: var(${tokens.backgroundHover}); + outline: none; + border-color: var(${tokens.borderColorHover}); +`; + export const base = css` background: var(${tokens.background}); border: 0.063rem dashed var(${tokens.borderColor}); - &:not(.${classes.active}):hover, &:not(.${classes.active}):focus-within { - background: var(${tokens.backgroundHover}); - outline: none; - border-color: var(${tokens.borderColorHover}); + ${hoverLike} } + ${applyHover(` + &:not(.${classes.active}):hover { + ${hoverLike} + } + `)} + &.${classes.active} { border-color: var(${tokens.borderColorActive}); background: var(${tokens.backgroundHover}); diff --git a/packages/plasma-new-hope/src/components/Link/_view/base.ts b/packages/plasma-new-hope/src/components/Link/_view/base.ts index 0c56420ade2..dbcdaff64d6 100644 --- a/packages/plasma-new-hope/src/components/Link/_view/base.ts +++ b/packages/plasma-new-hope/src/components/Link/_view/base.ts @@ -1,4 +1,5 @@ import { css } from 'styled-components'; +import { applyHover } from 'src/mixins'; import { classes, tokens } from '../Link.tokens'; @@ -6,20 +7,35 @@ const getColor = (cssVar: string) => ` color: var(${cssVar}, var(${tokens.linkColor})); `; +const underline = ` + text-decoration: underline solid var(${tokens.linkUnderlineColor}, currentColor) + var(${tokens.linkUnderlineBorder}, auto); + text-underline-offset: var(${tokens.linkUnderlineOffset}, auto); +`; + export const base = css` - font-family: var(${tokens.linkFontFamily}); // TODO: Удалить после обновления конфигов во всех дс + /* TODO: Удалить после обновления конфигов во всех дсп */ + font-family: var(${tokens.linkFontFamily}); color: var(${tokens.linkColor}); - &.${classes.linkUnderlineAlways}, &.${classes.linkUnderlineHover}:hover { - text-decoration: underline solid var(${tokens.linkUnderlineColor}, currentColor) - var(${tokens.linkUnderlineBorder}, auto); - text-underline-offset: var(${tokens.linkUnderlineOffset}, auto); + &.${classes.linkUnderlineAlways} { + ${underline} } - &:hover { - ${getColor(tokens.linkColorHover)}; - } + ${applyHover(` + &.${classes.linkUnderlineHover}:hover { + ${underline} + } + + &:hover { + ${getColor(tokens.linkColorHover)}; + } + + &:visited:hover { + ${getColor(tokens.linkColorVisitedHover)}; + } + `)} &:active { ${getColor(tokens.linkColorActive)}; @@ -29,10 +45,6 @@ export const base = css` ${getColor(tokens.linkColorVisited)}; } - &:visited:hover { - ${getColor(tokens.linkColorVisitedHover)}; - } - &:visited:active { ${getColor(tokens.linkColorVisitedActive)}; } diff --git a/packages/plasma-new-hope/src/components/LinkButton/variations/_view/base.ts b/packages/plasma-new-hope/src/components/LinkButton/variations/_view/base.ts index 21941cde523..5c1483b7584 100644 --- a/packages/plasma-new-hope/src/components/LinkButton/variations/_view/base.ts +++ b/packages/plasma-new-hope/src/components/LinkButton/variations/_view/base.ts @@ -1,4 +1,5 @@ import { css } from 'styled-components'; +import { applyHover } from 'src/mixins'; import { LinkButtonText, StyledContentLeft, StyledContentRight } from '../../LinkButton.styles'; import { tokens } from '../../LinkButton.tokens'; @@ -6,16 +7,18 @@ import { tokens } from '../../LinkButton.tokens'; export const base = css` background: var(${tokens.linkButtonBackgroundColor}); - :not([disabled]):hover { - ${LinkButtonText} { - color: var(${tokens.linkButtonTextColorHover}); - } + ${applyHover(` + :not([disabled]):hover { + ${LinkButtonText} { + color: var(${tokens.linkButtonTextColorHover}); + } - ${StyledContentLeft}, - ${StyledContentRight} { - color: var(${tokens.linkButtonIconColorHover}); + ${StyledContentLeft}, + ${StyledContentRight} { + color: var(${tokens.linkButtonIconColorHover}); + } } - } + `)} :not([disabled]):active { ${LinkButtonText} { diff --git a/packages/plasma-new-hope/src/components/Segment/ui/SegmentIconItem/variations/_view/base.ts b/packages/plasma-new-hope/src/components/Segment/ui/SegmentIconItem/variations/_view/base.ts index 892ee5aa834..737c210c513 100644 --- a/packages/plasma-new-hope/src/components/Segment/ui/SegmentIconItem/variations/_view/base.ts +++ b/packages/plasma-new-hope/src/components/Segment/ui/SegmentIconItem/variations/_view/base.ts @@ -1,4 +1,5 @@ import { css } from 'styled-components'; +import { applyHover } from 'src/mixins'; import { classes, tokens } from '../../../../tokens'; @@ -6,25 +7,31 @@ export const base = css` color: var(${tokens.itemColor}); background-color: var(${tokens.itemBackgroundColor}); - &:hover { - color: var(${tokens.itemColorHover}); - background-color: var(${tokens.itemBackgroundColorHover}); - } + ${applyHover(` + &:hover { + color: var(${tokens.itemColorHover}); + background-color: var(${tokens.itemBackgroundColorHover}); + } + `)} &.${classes.selectedSegmentItem} { color: var(${tokens.itemSelectedColor}); - &:hover { - color: var(${tokens.itemSelectedColorHover}); - } + ${applyHover(` + &:hover { + color: var(${tokens.itemSelectedColorHover}); + } + `)} /* фон в single-режиме рисует StyledThumb (SegmentGroup); здесь он нужен только для multiple */ &.${classes.segmentMultipleSelection} { background-color: var(${tokens.itemSelectedBackgroundColor}); - &:hover { - background-color: var(${tokens.itemSelectedBackgroundColorHover}); - } + ${applyHover(` + &:hover { + background-color: var(${tokens.itemSelectedBackgroundColorHover}); + } + `)} } } `; diff --git a/packages/plasma-new-hope/src/components/Segment/ui/SegmentItem/variations/_view/base.ts b/packages/plasma-new-hope/src/components/Segment/ui/SegmentItem/variations/_view/base.ts index 52ee2b6eebb..ca82eb430d6 100644 --- a/packages/plasma-new-hope/src/components/Segment/ui/SegmentItem/variations/_view/base.ts +++ b/packages/plasma-new-hope/src/components/Segment/ui/SegmentItem/variations/_view/base.ts @@ -1,4 +1,5 @@ import { css } from 'styled-components'; +import { applyHover } from 'src/mixins'; import { classes, tokens } from '../../../../tokens'; import { RightContent } from '../../SegmentItem.styles'; @@ -7,18 +8,20 @@ export const base = css` color: var(${tokens.itemColor}); background-color: var(${tokens.itemBackgroundColor}); - &:hover { - color: var(${tokens.itemColorHover}); - background-color: var(${tokens.itemBackgroundColorHover}); - - ${RightContent} { + ${applyHover(` + &:hover { color: var(${tokens.itemColorHover}); - } + background-color: var(${tokens.itemBackgroundColorHover}); - ${RightContent}.${classes.segmentAdditionalText} { - color: var(${tokens.itemAdditionalColorHover}); + ${RightContent} { + color: var(${tokens.itemColorHover}); + } + + ${RightContent}.${classes.segmentAdditionalText} { + color: var(${tokens.itemAdditionalColorHover}); + } } - } + `)} &.${classes.selectedSegmentItem} { color: var(${tokens.itemSelectedColor}); @@ -31,25 +34,29 @@ export const base = css` color: var(${tokens.itemSelectedAdditionalColor}); } - &:hover { - color: var(${tokens.itemSelectedColorHover}); - - ${RightContent} { + ${applyHover(` + &:hover { color: var(${tokens.itemSelectedColorHover}); - } - ${RightContent}.${classes.segmentAdditionalText} { - color: var(${tokens.itemSelectedAdditionalColorHover}); + ${RightContent} { + color: var(${tokens.itemSelectedColorHover}); + } + + ${RightContent}.${classes.segmentAdditionalText} { + color: var(${tokens.itemSelectedAdditionalColorHover}); + } } - } + `)} /* фон в single-режиме рисует StyledThumb (SegmentGroup); здесь он нужен только для multiple */ &.${classes.segmentMultipleSelection} { background-color: var(${tokens.itemSelectedBackgroundColor}); - &:hover { - background-color: var(${tokens.itemSelectedBackgroundColorHover}); - } + ${applyHover(` + &:hover { + background-color: var(${tokens.itemSelectedBackgroundColorHover}); + } + `)} } } `; diff --git a/packages/plasma-new-hope/src/components/Switch/_view/base.ts b/packages/plasma-new-hope/src/components/Switch/_view/base.ts index 66603d6a87c..46ecbaa3154 100644 --- a/packages/plasma-new-hope/src/components/Switch/_view/base.ts +++ b/packages/plasma-new-hope/src/components/Switch/_view/base.ts @@ -1,4 +1,5 @@ import { css } from 'styled-components'; +import { applyHover } from 'src/mixins'; import { tokens } from '../Switch.tokens'; import { StyledTrigger, StyledInput, StyledLabel, StyledDescription } from '../Switch.styles'; @@ -9,20 +10,24 @@ export const base = css` border-color: var(${tokens.trackBorderColorOff}); } - ${StyledInput}:not([disabled]) ~ ${StyledTrigger}:hover { - background-color: var(${tokens.trackBackgroundColorOffHover}, var(${tokens.trackBackgroundColorOff})); - border-color: var(${tokens.trackBorderColorOffHover}, var(${tokens.trackBorderColorOff})); - } + ${applyHover(` + ${StyledInput}:not([disabled]) ~ ${StyledTrigger}:hover { + background-color: var(${tokens.trackBackgroundColorOffHover}, var(${tokens.trackBackgroundColorOff})); + border-color: var(${tokens.trackBorderColorOffHover}, var(${tokens.trackBorderColorOff})); + } + `)} ${StyledInput}:checked ~ ${StyledTrigger} { background-color: var(${tokens.trackBackgroundColorOn}); border-color: var(${tokens.trackBorderColorOn}); } - ${StyledInput}:checked:not([disabled]) ~ ${StyledTrigger}:hover { - background-color: var(${tokens.trackBackgroundColorOnHover}, var(${tokens.trackBackgroundColorOn})); - border-color: var(${tokens.trackBorderColorOnHover}, var(${tokens.trackBorderColorOn})); - } + ${applyHover(` + ${StyledInput}:checked:not([disabled]) ~ ${StyledTrigger}:hover { + background-color: var(${tokens.trackBackgroundColorOnHover}, var(${tokens.trackBackgroundColorOn})); + border-color: var(${tokens.trackBorderColorOnHover}, var(${tokens.trackBorderColorOn})); + } + `)} ${StyledTrigger}::after { background-color: var(${tokens.thumbBackgroundColorOff}); diff --git a/packages/plasma-new-hope/src/components/Tabs/ui/horizontal/HorizontalIconTabItem/variations/_view/base.ts b/packages/plasma-new-hope/src/components/Tabs/ui/horizontal/HorizontalIconTabItem/variations/_view/base.ts index 60cf8158b97..bf216d537d6 100644 --- a/packages/plasma-new-hope/src/components/Tabs/ui/horizontal/HorizontalIconTabItem/variations/_view/base.ts +++ b/packages/plasma-new-hope/src/components/Tabs/ui/horizontal/HorizontalIconTabItem/variations/_view/base.ts @@ -1,4 +1,5 @@ import { css } from 'styled-components'; +import { applyHover } from 'src/mixins'; import { classes, tokens } from '../../../../../tokens'; @@ -6,10 +7,12 @@ export const base = css` color: var(${tokens.itemColor}); background-color: var(${tokens.itemBackgroundColor}); - &:hover { - color: var(${tokens.itemColorHover}); - background-color: var(${tokens.itemBackgroundColorHover}); - } + ${applyHover(` + &:hover { + color: var(${tokens.itemColorHover}); + background-color: var(${tokens.itemBackgroundColorHover}); + } + `)} &:active { color: var(${tokens.itemColorActive}); @@ -24,14 +27,16 @@ export const base = css` background-color: var(${tokens.itemSelectedBackgroundColor}); cursor: var(${tokens.itemCursor}); - &:hover { - color: var(${tokens.itemSelectedColorHover}); - background-color: var(${tokens.itemSelectedBackgroundColorHover}); + ${applyHover(` + &:hover { + color: var(${tokens.itemSelectedColorHover}); + background-color: var(${tokens.itemSelectedBackgroundColorHover}); - &::after { - background-color: var(${tokens.itemSelectedDividerColorHover}); + &::after { + background-color: var(${tokens.itemSelectedDividerColorHover}); + } } - } + `)} &::after { content: ''; diff --git a/packages/plasma-new-hope/src/components/Tabs/ui/horizontal/HorizontalTabItem/variations/_view/base.ts b/packages/plasma-new-hope/src/components/Tabs/ui/horizontal/HorizontalTabItem/variations/_view/base.ts index e3b399795f1..5b96589f8e1 100644 --- a/packages/plasma-new-hope/src/components/Tabs/ui/horizontal/HorizontalTabItem/variations/_view/base.ts +++ b/packages/plasma-new-hope/src/components/Tabs/ui/horizontal/HorizontalTabItem/variations/_view/base.ts @@ -1,4 +1,5 @@ import { css } from 'styled-components'; +import { applyHover } from 'src/mixins'; import { classes, tokens } from '../../../../../tokens'; import { TabItemValue } from '../../HorizontalTabItem.styles'; @@ -9,14 +10,16 @@ export const base = css` margin-left: var(${tokens.itemMarginLeftFilled}, var(${tokens.itemMarginLeft})); - &:hover { - color: var(${tokens.itemColorHover}); - background-color: var(${tokens.itemBackgroundColorHover}); + ${applyHover(` + &:hover { + color: var(${tokens.itemColorHover}); + background-color: var(${tokens.itemBackgroundColorHover}); - ${TabItemValue} { - color: var(${tokens.itemValueColorHover}); + ${TabItemValue} { + color: var(${tokens.itemValueColorHover}); + } } - } + `)} &:active { color: var(${tokens.itemColorActive}); @@ -35,21 +38,25 @@ export const base = css` background-color: var(${tokens.itemSelectedBackgroundColor}); cursor: var(${tokens.itemCursor}); - &:hover { - color: var(${tokens.itemSelectedColorHover}); - background-color: var(${tokens.itemSelectedBackgroundColorHover}); + ${applyHover(` + &:hover { + color: var(${tokens.itemSelectedColorHover}); + background-color: var(${tokens.itemSelectedBackgroundColorHover}); - &::after { - background: var(${tokens.itemSelectedDividerColorHover}); + &::after { + background: var(${tokens.itemSelectedDividerColorHover}); + } } - } + `)} ${TabItemValue} { color: var(${tokens.itemSelectedValueColorHover}); - &:hover { - color: var(${tokens.itemSelectedValueColorHover}); - } + ${applyHover(` + &:hover { + color: var(${tokens.itemSelectedValueColorHover}); + } + `)} } &::after { diff --git a/packages/plasma-new-hope/src/components/Tabs/ui/vertical/VerticalIconTabItem/variations/_view/base.ts b/packages/plasma-new-hope/src/components/Tabs/ui/vertical/VerticalIconTabItem/variations/_view/base.ts index 19e99acd639..0f9593343b7 100644 --- a/packages/plasma-new-hope/src/components/Tabs/ui/vertical/VerticalIconTabItem/variations/_view/base.ts +++ b/packages/plasma-new-hope/src/components/Tabs/ui/vertical/VerticalIconTabItem/variations/_view/base.ts @@ -1,4 +1,5 @@ import { css } from 'styled-components'; +import { applyHover } from 'src/mixins'; import { classes, tokens } from '../../../../../tokens'; @@ -6,10 +7,12 @@ export const base = css` color: var(${tokens.itemColor}); background-color: var(${tokens.itemBackgroundColor}); - &:hover { - color: var(${tokens.itemColorHover}); - background-color: var(${tokens.itemBackgroundColorHover}); - } + ${applyHover(` + &:hover { + color: var(${tokens.itemColorHover}); + background-color: var(${tokens.itemBackgroundColorHover}); + } + `)} &:active { color: var(${tokens.itemColorActive}); @@ -20,14 +23,16 @@ export const base = css` background-color: var(${tokens.itemSelectedBackgroundColor}); cursor: var(${tokens.itemCursor}); - &:hover { - color: var(${tokens.itemSelectedColorHover}); - background-color: var(${tokens.itemSelectedBackgroundColorHover}); + ${applyHover(` + &:hover { + color: var(${tokens.itemSelectedColorHover}); + background-color: var(${tokens.itemSelectedBackgroundColorHover}); - &::after { - background: var(${tokens.itemSelectedDividerColorHover}); + &::after { + background: var(${tokens.itemSelectedDividerColorHover}); + } } - } + `)} &::after { content: ''; diff --git a/packages/plasma-new-hope/src/components/Tabs/ui/vertical/VerticalTabItem/variations/_view/base.ts b/packages/plasma-new-hope/src/components/Tabs/ui/vertical/VerticalTabItem/variations/_view/base.ts index f62db412190..0368a69e43a 100644 --- a/packages/plasma-new-hope/src/components/Tabs/ui/vertical/VerticalTabItem/variations/_view/base.ts +++ b/packages/plasma-new-hope/src/components/Tabs/ui/vertical/VerticalTabItem/variations/_view/base.ts @@ -1,4 +1,5 @@ import { css } from 'styled-components'; +import { applyHover } from 'src/mixins'; import { classes, tokens } from '../../../../../tokens'; import { TabItemValue } from '../../VerticalTabItem.styles'; @@ -7,14 +8,16 @@ export const base = css` color: var(${tokens.itemColor}); background-color: var(${tokens.itemBackgroundColor}); - &:hover { - color: var(${tokens.itemColorHover}); - background-color: var(${tokens.itemBackgroundColorHover}); + ${applyHover(` + &:hover { + color: var(${tokens.itemColorHover}); + background-color: var(${tokens.itemBackgroundColorHover}); - ${TabItemValue} { - color: var(${tokens.itemValueColorHover}); + ${TabItemValue} { + color: var(${tokens.itemValueColorHover}); + } } - } + `)} &:active { color: var(${tokens.itemColorActive}); @@ -33,21 +36,25 @@ export const base = css` background-color: var(${tokens.itemSelectedBackgroundColor}); cursor: var(${tokens.itemCursor}); - &:hover { - color: var(${tokens.itemSelectedColorHover}); - background-color: var(${tokens.itemSelectedBackgroundColorHover}); + ${applyHover(` + &:hover { + color: var(${tokens.itemSelectedColorHover}); + background-color: var(${tokens.itemSelectedBackgroundColorHover}); - &::after { - background: var(${tokens.itemSelectedDividerColorHover}); + &::after { + background: var(${tokens.itemSelectedDividerColorHover}); + } } - } + `)} ${TabItemValue} { color: var(${tokens.itemSelectedValueColorHover}); - &:hover { - color: var(${tokens.itemSelectedValueColorHover}); - } + ${applyHover(` + &:hover { + color: var(${tokens.itemSelectedValueColorHover}); + } + `)} } &::after { diff --git a/packages/plasma-new-hope/src/components/TextArea/TextArea.styles.ts b/packages/plasma-new-hope/src/components/TextArea/TextArea.styles.ts index 8db68a7fe3d..152e7cbbcff 100644 --- a/packages/plasma-new-hope/src/components/TextArea/TextArea.styles.ts +++ b/packages/plasma-new-hope/src/components/TextArea/TextArea.styles.ts @@ -1,4 +1,5 @@ import styled from 'styled-components'; +import { applyHover } from 'src/mixins'; import { tooltipConfig } from '../Tooltip'; import { component, mergeConfig } from '../../engines'; @@ -145,9 +146,11 @@ export const StyledContent = styled.div<{ hasHeader?: boolean }>` height: var(${tokens.rightContentHeight}); width: var(${tokens.rightContentWidth}, auto); - &:hover { - color: var(${tokens.rightContentColorHover}); - } + ${applyHover(` + &:hover { + color: var(${tokens.rightContentColorHover}); + } + `)} &:active { color: var(${tokens.rightContentColorActive}); diff --git a/packages/plasma-new-hope/src/components/TextArea/variations/_view/base.ts b/packages/plasma-new-hope/src/components/TextArea/variations/_view/base.ts index 35f6f514117..f7cb6f7f273 100644 --- a/packages/plasma-new-hope/src/components/TextArea/variations/_view/base.ts +++ b/packages/plasma-new-hope/src/components/TextArea/variations/_view/base.ts @@ -1,4 +1,5 @@ import { css } from 'styled-components'; +import { applyHover } from 'src/mixins'; import { tokens, classes, privateTokens } from '../../TextArea.tokens'; import { StyledTextAreaWrapper, TitleCaption } from '../../TextArea.styles'; @@ -59,23 +60,25 @@ export const base = css` background-color: var(${tokens.helpersBackgroundColorFocus}); } - &:hover:${exclusionSelectors} .${styledContainer} { - background-color: var(${tokens.backgroundColorHover}); - box-shadow: var(${tokens.boxShadow}, inset 0 0 0 0 transparent); + ${applyHover(` + &:hover:${exclusionSelectors} .${styledContainer} { + background-color: var(${tokens.backgroundColorHover}); + box-shadow: var(${tokens.boxShadow}, inset 0 0 0 0 transparent); - &::after { - box-shadow: inset 0 0 0 var(${tokens.borderSize}, 0.0625rem) var(${tokens.borderColorHover}); + &::after { + box-shadow: inset 0 0 0 var(${tokens.borderSize}, 0.0625rem) var(${tokens.borderColorHover}); + } } - } - &:hover:${exclusionSelectors} .${styledTextAreaWrapper} { - box-shadow: inset 0 0 0 var(${tokens.borderSize}, 0.0625rem) var(${tokens.inputBorderColorHover}); - background-color: var(${tokens.inputBackgroundColorHover}); - } + &:hover:${exclusionSelectors} .${styledTextAreaWrapper} { + box-shadow: inset 0 0 0 var(${tokens.borderSize}, 0.0625rem) var(${tokens.inputBorderColorHover}); + background-color: var(${tokens.inputBackgroundColorHover}); + } - &:hover:${exclusionSelectors} .${styledTextAreaWrapper} + .${styledHelpers} { - background-color: var(${tokens.helpersBackgroundColorHover}); - } + &:hover:${exclusionSelectors} .${styledTextAreaWrapper} + .${styledHelpers} { + background-color: var(${tokens.helpersBackgroundColorHover}); + } + `)} &:active:${exclusionSelectors} .${styledTextAreaWrapper} { box-shadow: inset 0 0 0 var(${tokens.borderSize}, 0.0625rem) var(${tokens.inputBorderColorActive}); @@ -108,12 +111,14 @@ export const base = css` } } - &:not([readonly]) ${StyledTextAreaWrapper}:hover { - ${privateTokens.dividerColor}: var( - ${tokens.dividerColorHover}, - var(${tokens.dividerColor}) - ); - } + ${applyHover(` + &:not([readonly]) ${StyledTextAreaWrapper}:hover { + ${privateTokens.dividerColor}: var( + ${tokens.dividerColorHover}, + var(${tokens.dividerColor}) + ); + } + `)} &:not([readonly]) ${StyledTextAreaWrapper}:focus-within { ${privateTokens.dividerColor}: var( diff --git a/packages/plasma-new-hope/src/components/TextField/variations/_view/base.ts b/packages/plasma-new-hope/src/components/TextField/variations/_view/base.ts index 57ccb3c52f9..4cced2e6894 100644 --- a/packages/plasma-new-hope/src/components/TextField/variations/_view/base.ts +++ b/packages/plasma-new-hope/src/components/TextField/variations/_view/base.ts @@ -1,4 +1,5 @@ import { css } from 'styled-components'; +import { applyHover } from 'src/mixins'; import { classes, privateTokens, tokens } from '../../TextField.tokens'; import { @@ -28,10 +29,12 @@ export const base = css` transition: background-color 0.1s ease-in, color 0.1s ease-in, box-shadow 0.1s ease-in; } - &:not([readonly]) ${InputWrapper}:hover:not(:has(${StyledHintWrapper}:hover)):not(:focus-within) { - ${privateTokens.borderColor}: var(${tokens.borderColorHover}, var(${tokens.borderColor})); - ${privateTokens.backgroundColor}: var(${tokens.backgroundColorHover}, var(${tokens.backgroundColor})); - } + ${applyHover(` + &:not([readonly]) ${InputWrapper}:hover:not(:has(${StyledHintWrapper}:hover)):not(:focus-within) { + ${privateTokens.borderColor}: var(${tokens.borderColorHover}, var(${tokens.borderColor})); + ${privateTokens.backgroundColor}: var(${tokens.backgroundColorHover}, var(${tokens.backgroundColor})); + } + `)} ${Input} { color: var(${tokens.color}); @@ -110,12 +113,14 @@ export const base = css` } } - &:not([readonly]) ${InputWrapper}:hover:not(:has(${StyledHintWrapper}:hover)):not(:focus-within) { - --plasma_private-textfield-divider-color: var( - ${tokens.dividerColorHover}, - var(${tokens.dividerColor}) - ); - } + ${applyHover(` + &:not([readonly]) ${InputWrapper}:hover:not(:has(${StyledHintWrapper}:hover)):not(:focus-within) { + --plasma_private-textfield-divider-color: var( + ${tokens.dividerColorHover}, + var(${tokens.dividerColor}) + ); + } + `)} &:not([readonly]) ${InputWrapper}:focus-within { --plasma_private-textfield-divider-color: var( diff --git a/packages/plasma-new-hope/src/components/_beta/EmbeddedButton/variations/_view/base.ts b/packages/plasma-new-hope/src/components/_beta/EmbeddedButton/variations/_view/base.ts index 5687ce81e7e..afa1086ee50 100644 --- a/packages/plasma-new-hope/src/components/_beta/EmbeddedButton/variations/_view/base.ts +++ b/packages/plasma-new-hope/src/components/_beta/EmbeddedButton/variations/_view/base.ts @@ -1,4 +1,5 @@ import { css } from 'styled-components'; +import { applyHover } from 'src/mixins'; import { tokens } from '../../EmbeddedButton.tokens'; import { IconContainer } from '../../EmbeddedButton.styles'; @@ -11,7 +12,7 @@ export const base = css` color: var(${tokens.color}); } - @media (hover: hover) and (pointer: fine) { + ${applyHover(` :hover { background: var(${tokens.backgroundColorHover}, var(${tokens.backgroundColor})); box-shadow: inset 0 0 0 0.063rem var(${tokens.borderColorHover}, inset 0 0 0 0 transparent); @@ -20,7 +21,7 @@ export const base = css` color: var(${tokens.colorHover}); } } - } + `)} :active { background: var(${tokens.backgroundColorActive}, var(${tokens.backgroundColor})); diff --git a/packages/plasma-new-hope/src/mixins/applyHover.ts b/packages/plasma-new-hope/src/mixins/applyHover.ts new file mode 100644 index 00000000000..f9ed3b4bfe8 --- /dev/null +++ b/packages/plasma-new-hope/src/mixins/applyHover.ts @@ -0,0 +1,15 @@ +/** + * Стили только на устройствах с настоящим hover (мышь), без «залипания» после тапа. + * + * @example + * ${applyHover(` + * :hover { + * color: var(${tokens.colorHover}); + * } + * `)} + */ +export const applyHover = (styles: string) => ` + @media (hover: hover) and (pointer: fine) { + ${styles} + } +`; diff --git a/packages/plasma-new-hope/src/mixins/index.ts b/packages/plasma-new-hope/src/mixins/index.ts index 49218f5460c..2723cb5e98b 100644 --- a/packages/plasma-new-hope/src/mixins/index.ts +++ b/packages/plasma-new-hope/src/mixins/index.ts @@ -9,6 +9,7 @@ export * from './typography'; export * from './applyRoundness'; export * from './applySkeletonAnimation'; export * from './applyHidden'; +export * from './applyHover'; export * from './createApplyPaperMixin'; export * from './addScrollbar'; export * from './applySliderThumb';