@snack-uikit/toggles 0.11.0 → 0.12.1-preview-d1a63029.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11 -0
- package/README.md +2 -1
- package/dist/cjs/components/Favorite/Favorite.d.ts +4 -1
- package/dist/cjs/components/Favorite/Favorite.js +8 -4
- package/dist/cjs/components/Favorite/styles.module.css +6 -0
- package/dist/cjs/components/TogglePrivate/TogglePrivate.d.ts +1 -0
- package/dist/cjs/components/TogglePrivate/TogglePrivate.js +5 -2
- package/dist/cjs/constants.d.ts +1 -0
- package/dist/cjs/constants.js +2 -1
- package/dist/cjs/types.d.ts +3 -1
- package/dist/esm/components/Favorite/Favorite.d.ts +4 -1
- package/dist/esm/components/Favorite/Favorite.js +5 -3
- package/dist/esm/components/Favorite/styles.module.css +6 -0
- package/dist/esm/components/TogglePrivate/TogglePrivate.d.ts +1 -0
- package/dist/esm/components/TogglePrivate/TogglePrivate.js +2 -2
- package/dist/esm/constants.d.ts +1 -0
- package/dist/esm/constants.js +1 -0
- package/dist/esm/types.d.ts +3 -1
- package/package.json +3 -3
- package/src/components/Checkbox/styles.module.scss +24 -26
- package/src/components/Favorite/Favorite.tsx +8 -2
- package/src/components/Favorite/styles.module.scss +11 -12
- package/src/components/Radio/styles.module.scss +19 -22
- package/src/components/Switch/styles.module.scss +25 -27
- package/src/components/TogglePrivate/TogglePrivate.tsx +3 -0
- package/src/components/TogglePrivate/styles.module.scss +5 -7
- package/src/components/styles.module.scss +5 -5
- package/src/constants.ts +1 -0
- package/src/helperComponents/Spinner/styles.module.scss +3 -4
- package/src/types.ts +3 -1
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,17 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
# 0.12.0 (2024-10-28)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### Features
|
|
10
|
+
|
|
11
|
+
* **FF-5782:** sass use/forward approach ([3e53869](https://github.com/cloud-ru-tech/snack-uikit/commit/3e53869ace864a7718e434b7f410c15dbd911cd5))
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
6
17
|
# 0.11.0 (2024-10-28)
|
|
7
18
|
|
|
8
19
|
|
package/README.md
CHANGED
|
@@ -151,7 +151,8 @@ return (
|
|
|
151
151
|
| className | `string` | - | CSS-класс |
|
|
152
152
|
| size | enum Size: `"s"`, `"m"` | m | Размер |
|
|
153
153
|
| inputRef | `RefObject<HTMLInputElement>` | - | |
|
|
154
|
-
| icon | enum FavoriteIcon: `"star"`, `"heart"` | heart | Иконка |
|
|
154
|
+
| icon | enum FavoriteIcon: `"star"`, `"heart"`, `"pin"` | heart | Иконка |
|
|
155
|
+
| onKeyDown | `KeyboardEventHandler<HTMLDivElement>` | - | Колбек нажатия клавиши клавиатуры |
|
|
155
156
|
## ToggleGroup
|
|
156
157
|
### Props
|
|
157
158
|
| name | type | default value | description |
|
|
@@ -1,6 +1,9 @@
|
|
|
1
|
+
import { KeyboardEventHandler } from 'react';
|
|
1
2
|
import { FavoriteIcon, ToggleProps } from '../../types';
|
|
2
3
|
export type FavoriteProps = ToggleProps & {
|
|
3
4
|
/** Иконка */
|
|
4
5
|
icon?: FavoriteIcon;
|
|
6
|
+
/** Колбек нажатия клавиши клавиатуры */
|
|
7
|
+
onKeyDown?: KeyboardEventHandler<HTMLDivElement>;
|
|
5
8
|
};
|
|
6
|
-
export declare function Favorite({ inputRef, 'data-test-id': dataTestId, size, icon, ...restProps }: FavoriteProps): import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
export declare function Favorite({ inputRef, 'data-test-id': dataTestId, size, icon, onKeyDown, ...restProps }: FavoriteProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -26,25 +26,29 @@ const TogglePrivate_1 = require("../TogglePrivate");
|
|
|
26
26
|
const styles_module_scss_1 = __importDefault(require('./styles.module.css'));
|
|
27
27
|
const CHECKED_ICONS = {
|
|
28
28
|
[constants_1.FAVORITE_ICON.Star]: icons_1.StarFilledSVG,
|
|
29
|
-
[constants_1.FAVORITE_ICON.Heart]: icons_1.HeartFilledSVG
|
|
29
|
+
[constants_1.FAVORITE_ICON.Heart]: icons_1.HeartFilledSVG,
|
|
30
|
+
[constants_1.FAVORITE_ICON.Pin]: icons_1.PinnedSVG
|
|
30
31
|
};
|
|
31
32
|
const UNCHECKED_ICONS = {
|
|
32
33
|
[constants_1.FAVORITE_ICON.Star]: icons_1.StarSVG,
|
|
33
|
-
[constants_1.FAVORITE_ICON.Heart]: icons_1.HeartSVG
|
|
34
|
+
[constants_1.FAVORITE_ICON.Heart]: icons_1.HeartSVG,
|
|
35
|
+
[constants_1.FAVORITE_ICON.Pin]: icons_1.UnPinnedSVG
|
|
34
36
|
};
|
|
35
37
|
function Favorite(_a) {
|
|
36
38
|
var {
|
|
37
39
|
inputRef,
|
|
38
40
|
'data-test-id': dataTestId,
|
|
39
41
|
size = constants_1.SIZE.M,
|
|
40
|
-
icon = constants_1.FAVORITE_ICON.Heart
|
|
42
|
+
icon = constants_1.FAVORITE_ICON.Heart,
|
|
43
|
+
onKeyDown
|
|
41
44
|
} = _a,
|
|
42
|
-
restProps = __rest(_a, ["inputRef", 'data-test-id', "size", "icon"]);
|
|
45
|
+
restProps = __rest(_a, ["inputRef", 'data-test-id', "size", "icon", "onKeyDown"]);
|
|
43
46
|
const iconSize = (0, react_1.useMemo)(() => (0, utils_1.getIconSize)(size), [size]);
|
|
44
47
|
return (0, jsx_runtime_1.jsx)(TogglePrivate_1.TogglePrivate, Object.assign({}, restProps, {
|
|
45
48
|
"data-test-id": dataTestId,
|
|
46
49
|
ref: inputRef,
|
|
47
50
|
size: size,
|
|
51
|
+
onKeyDown: onKeyDown,
|
|
48
52
|
render: function Favorite(visualState) {
|
|
49
53
|
const Icon = visualState.checked ? CHECKED_ICONS[icon] : UNCHECKED_ICONS[icon];
|
|
50
54
|
const data = (0, utils_1.getVisualStateAttributes)(Object.assign(Object.assign({}, visualState), {
|
|
@@ -45,6 +45,12 @@
|
|
|
45
45
|
.icon:not([data-disabled=true])[data-icon=heart][data-checked=true][data-focusvisible=true], .icon:not([data-disabled=true])[data-icon=heart][data-checked=true][data-hover=true]{
|
|
46
46
|
color:var(--sys-red-accent-hovered, #bd4844);
|
|
47
47
|
}
|
|
48
|
+
.icon:not([data-disabled=true])[data-icon=pin][data-checked=true]{
|
|
49
|
+
color:var(--sys-primary-accent-default, #794ed3);
|
|
50
|
+
}
|
|
51
|
+
.icon:not([data-disabled=true])[data-icon=pin][data-checked=true][data-focusvisible=true], .icon:not([data-disabled=true])[data-icon=pin][data-checked=true][data-hover=true]{
|
|
52
|
+
color:var(--sys-primary-accent-hovered, #6851a6);
|
|
53
|
+
}
|
|
48
54
|
.icon[data-disabled=true]{
|
|
49
55
|
color:var(--sys-neutral-text-disabled, #aaaebd);
|
|
50
56
|
}
|
|
@@ -17,4 +17,5 @@ export declare const TogglePrivate: import("react").ForwardRefExoticComponent<{
|
|
|
17
17
|
onClick?: import("react").MouseEventHandler<HTMLInputElement>;
|
|
18
18
|
onBlur?: import("react").FocusEventHandler<HTMLInputElement>;
|
|
19
19
|
onFocus?: import("react").FocusEventHandler<HTMLInputElement>;
|
|
20
|
+
onKeyDown?: import("react").KeyboardEventHandler<HTMLDivElement>;
|
|
20
21
|
} & import("react").RefAttributes<HTMLInputElement>>;
|
|
@@ -36,9 +36,10 @@ exports.TogglePrivate = (0, react_1.forwardRef)(function TogglePrivate(_a, ref)
|
|
|
36
36
|
className,
|
|
37
37
|
size = constants_1.SIZE.M,
|
|
38
38
|
mode = constants_1.MODE.Checkbox,
|
|
39
|
+
onKeyDown,
|
|
39
40
|
'data-test-id': testId
|
|
40
41
|
} = _a,
|
|
41
|
-
otherProps = __rest(_a, ["render", "checked", "defaultChecked", "onChange", "onBlur", "onFocus", "disabled", "className", "size", "mode", 'data-test-id']);
|
|
42
|
+
otherProps = __rest(_a, ["render", "checked", "defaultChecked", "onChange", "onBlur", "onFocus", "disabled", "className", "size", "mode", "onKeyDown", 'data-test-id']);
|
|
42
43
|
const [checked, setChecked] = (0, uncontrollable_1.useUncontrolledProp)(checkedProp, Boolean(defaultChecked), onChange);
|
|
43
44
|
const [focusVisible, setFocusVisible] = (0, react_1.useState)(false);
|
|
44
45
|
const [hover, setHover] = (0, react_1.useState)(false);
|
|
@@ -50,11 +51,13 @@ exports.TogglePrivate = (0, react_1.forwardRef)(function TogglePrivate(_a, ref)
|
|
|
50
51
|
size
|
|
51
52
|
};
|
|
52
53
|
return (0, jsx_runtime_1.jsxs)("span", Object.assign({
|
|
54
|
+
role: mode,
|
|
53
55
|
className: (0, classnames_1.default)(className, styles_module_scss_1.default.toggleLayout),
|
|
54
56
|
"data-size": size,
|
|
55
57
|
"data-test-id": testId,
|
|
56
58
|
onMouseEnter: () => setHover(true),
|
|
57
|
-
onMouseLeave: () => setHover(false)
|
|
59
|
+
onMouseLeave: () => setHover(false),
|
|
60
|
+
onKeyDown: onKeyDown
|
|
58
61
|
}, (0, utils_1.getVisualStateAttributes)(visualState), {
|
|
59
62
|
children: [render(visualState), (0, jsx_runtime_1.jsx)("input", Object.assign({}, otherProps, {
|
|
60
63
|
"data-test-id": `${testId}-native-input`,
|
package/dist/cjs/constants.d.ts
CHANGED
package/dist/cjs/constants.js
CHANGED
package/dist/cjs/types.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { FocusEventHandler, MouseEventHandler, ReactNode, RefObject } from 'react';
|
|
1
|
+
import { FocusEventHandler, KeyboardEventHandler, MouseEventHandler, ReactNode, RefObject } from 'react';
|
|
2
2
|
import { ValueOf, WithSupportProps } from '@snack-uikit/utils';
|
|
3
3
|
import { FAVORITE_ICON, MODE, SELECTION_MODE, SIZE } from './constants';
|
|
4
4
|
export type Size = ValueOf<typeof SIZE>;
|
|
@@ -45,6 +45,8 @@ export type TogglePrivateProps = WithSupportProps<{
|
|
|
45
45
|
onBlur?: FocusEventHandler<HTMLInputElement>;
|
|
46
46
|
/** Колбек приобретения фокуса */
|
|
47
47
|
onFocus?: FocusEventHandler<HTMLInputElement>;
|
|
48
|
+
/** Колбек нажатия клавиши клавиатуры */
|
|
49
|
+
onKeyDown?: KeyboardEventHandler<HTMLDivElement>;
|
|
48
50
|
}>;
|
|
49
51
|
export type ToggleProps = WithSupportProps<Pick<TogglePrivateProps, 'id' | 'name' | 'value' | 'tabIndex' | 'autofocus' | 'checked' | 'defaultChecked' | 'disabled' | 'onChange' | 'onClick' | 'onBlur' | 'onFocus' | 'className' | 'size'> & {
|
|
50
52
|
inputRef?: RefObject<HTMLInputElement>;
|
|
@@ -1,6 +1,9 @@
|
|
|
1
|
+
import { KeyboardEventHandler } from 'react';
|
|
1
2
|
import { FavoriteIcon, ToggleProps } from '../../types';
|
|
2
3
|
export type FavoriteProps = ToggleProps & {
|
|
3
4
|
/** Иконка */
|
|
4
5
|
icon?: FavoriteIcon;
|
|
6
|
+
/** Колбек нажатия клавиши клавиатуры */
|
|
7
|
+
onKeyDown?: KeyboardEventHandler<HTMLDivElement>;
|
|
5
8
|
};
|
|
6
|
-
export declare function Favorite({ inputRef, 'data-test-id': dataTestId, size, icon, ...restProps }: FavoriteProps): import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
export declare function Favorite({ inputRef, 'data-test-id': dataTestId, size, icon, onKeyDown, ...restProps }: FavoriteProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -11,7 +11,7 @@ var __rest = (this && this.__rest) || function (s, e) {
|
|
|
11
11
|
};
|
|
12
12
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
13
13
|
import { useMemo } from 'react';
|
|
14
|
-
import { HeartFilledSVG, HeartSVG, StarFilledSVG, StarSVG } from '@snack-uikit/icons';
|
|
14
|
+
import { HeartFilledSVG, HeartSVG, PinnedSVG, StarFilledSVG, StarSVG, UnPinnedSVG } from '@snack-uikit/icons';
|
|
15
15
|
import { FAVORITE_ICON, SIZE } from '../../constants';
|
|
16
16
|
import { getIconSize, getVisualStateAttributes } from '../../utils';
|
|
17
17
|
import { TogglePrivate } from '../TogglePrivate';
|
|
@@ -19,15 +19,17 @@ import styles from './styles.module.css';
|
|
|
19
19
|
const CHECKED_ICONS = {
|
|
20
20
|
[FAVORITE_ICON.Star]: StarFilledSVG,
|
|
21
21
|
[FAVORITE_ICON.Heart]: HeartFilledSVG,
|
|
22
|
+
[FAVORITE_ICON.Pin]: PinnedSVG,
|
|
22
23
|
};
|
|
23
24
|
const UNCHECKED_ICONS = {
|
|
24
25
|
[FAVORITE_ICON.Star]: StarSVG,
|
|
25
26
|
[FAVORITE_ICON.Heart]: HeartSVG,
|
|
27
|
+
[FAVORITE_ICON.Pin]: UnPinnedSVG,
|
|
26
28
|
};
|
|
27
29
|
export function Favorite(_a) {
|
|
28
|
-
var { inputRef, 'data-test-id': dataTestId, size = SIZE.M, icon = FAVORITE_ICON.Heart } = _a, restProps = __rest(_a, ["inputRef", 'data-test-id', "size", "icon"]);
|
|
30
|
+
var { inputRef, 'data-test-id': dataTestId, size = SIZE.M, icon = FAVORITE_ICON.Heart, onKeyDown } = _a, restProps = __rest(_a, ["inputRef", 'data-test-id', "size", "icon", "onKeyDown"]);
|
|
29
31
|
const iconSize = useMemo(() => getIconSize(size), [size]);
|
|
30
|
-
return (_jsx(TogglePrivate, Object.assign({}, restProps, { "data-test-id": dataTestId, ref: inputRef, size: size, render: function Favorite(visualState) {
|
|
32
|
+
return (_jsx(TogglePrivate, Object.assign({}, restProps, { "data-test-id": dataTestId, ref: inputRef, size: size, onKeyDown: onKeyDown, render: function Favorite(visualState) {
|
|
31
33
|
const Icon = visualState.checked ? CHECKED_ICONS[icon] : UNCHECKED_ICONS[icon];
|
|
32
34
|
const data = getVisualStateAttributes(Object.assign(Object.assign({}, visualState), { icon }));
|
|
33
35
|
return (_jsx("div", Object.assign({ className: styles.container }, data, { children: _jsx(Icon, Object.assign({ className: styles.icon }, data, { size: iconSize })) })));
|
|
@@ -45,6 +45,12 @@
|
|
|
45
45
|
.icon:not([data-disabled=true])[data-icon=heart][data-checked=true][data-focusvisible=true], .icon:not([data-disabled=true])[data-icon=heart][data-checked=true][data-hover=true]{
|
|
46
46
|
color:var(--sys-red-accent-hovered, #bd4844);
|
|
47
47
|
}
|
|
48
|
+
.icon:not([data-disabled=true])[data-icon=pin][data-checked=true]{
|
|
49
|
+
color:var(--sys-primary-accent-default, #794ed3);
|
|
50
|
+
}
|
|
51
|
+
.icon:not([data-disabled=true])[data-icon=pin][data-checked=true][data-focusvisible=true], .icon:not([data-disabled=true])[data-icon=pin][data-checked=true][data-hover=true]{
|
|
52
|
+
color:var(--sys-primary-accent-hovered, #6851a6);
|
|
53
|
+
}
|
|
48
54
|
.icon[data-disabled=true]{
|
|
49
55
|
color:var(--sys-neutral-text-disabled, #aaaebd);
|
|
50
56
|
}
|
|
@@ -17,4 +17,5 @@ export declare const TogglePrivate: import("react").ForwardRefExoticComponent<{
|
|
|
17
17
|
onClick?: import("react").MouseEventHandler<HTMLInputElement>;
|
|
18
18
|
onBlur?: import("react").FocusEventHandler<HTMLInputElement>;
|
|
19
19
|
onFocus?: import("react").FocusEventHandler<HTMLInputElement>;
|
|
20
|
+
onKeyDown?: import("react").KeyboardEventHandler<HTMLDivElement>;
|
|
20
21
|
} & import("react").RefAttributes<HTMLInputElement>>;
|
|
@@ -17,7 +17,7 @@ import { MODE, SIZE } from '../../constants';
|
|
|
17
17
|
import { getVisualStateAttributes } from '../../utils';
|
|
18
18
|
import styles from './styles.module.css';
|
|
19
19
|
export const TogglePrivate = forwardRef(function TogglePrivate(_a, ref) {
|
|
20
|
-
var { render, checked: checkedProp, defaultChecked, onChange, onBlur, onFocus, disabled, className, size = SIZE.M, mode = MODE.Checkbox, 'data-test-id': testId } = _a, otherProps = __rest(_a, ["render", "checked", "defaultChecked", "onChange", "onBlur", "onFocus", "disabled", "className", "size", "mode", 'data-test-id']);
|
|
20
|
+
var { render, checked: checkedProp, defaultChecked, onChange, onBlur, onFocus, disabled, className, size = SIZE.M, mode = MODE.Checkbox, onKeyDown, 'data-test-id': testId } = _a, otherProps = __rest(_a, ["render", "checked", "defaultChecked", "onChange", "onBlur", "onFocus", "disabled", "className", "size", "mode", "onKeyDown", 'data-test-id']);
|
|
21
21
|
const [checked, setChecked] = useUncontrolledProp(checkedProp, Boolean(defaultChecked), onChange);
|
|
22
22
|
const [focusVisible, setFocusVisible] = useState(false);
|
|
23
23
|
const [hover, setHover] = useState(false);
|
|
@@ -28,7 +28,7 @@ export const TogglePrivate = forwardRef(function TogglePrivate(_a, ref) {
|
|
|
28
28
|
hover,
|
|
29
29
|
size,
|
|
30
30
|
};
|
|
31
|
-
return (_jsxs("span", Object.assign({ className: cn(className, styles.toggleLayout), "data-size": size, "data-test-id": testId, onMouseEnter: () => setHover(true), onMouseLeave: () => setHover(false) }, getVisualStateAttributes(visualState), { children: [render(visualState), _jsx("input", Object.assign({}, otherProps, { "data-test-id": `${testId}-native-input`, ref: ref, type: mode, className: styles.togglePrivate, checked: checked, disabled: disabled, onChange: e => setChecked(e.target.checked), onFocus: event => {
|
|
31
|
+
return (_jsxs("span", Object.assign({ role: mode, className: cn(className, styles.toggleLayout), "data-size": size, "data-test-id": testId, onMouseEnter: () => setHover(true), onMouseLeave: () => setHover(false), onKeyDown: onKeyDown }, getVisualStateAttributes(visualState), { children: [render(visualState), _jsx("input", Object.assign({}, otherProps, { "data-test-id": `${testId}-native-input`, ref: ref, type: mode, className: styles.togglePrivate, checked: checked, disabled: disabled, onChange: e => setChecked(e.target.checked), onFocus: event => {
|
|
32
32
|
setFocusVisible(event.target.matches(':focus-visible'));
|
|
33
33
|
onFocus === null || onFocus === void 0 ? void 0 : onFocus(event);
|
|
34
34
|
}, onBlur: event => {
|
package/dist/esm/constants.d.ts
CHANGED
package/dist/esm/constants.js
CHANGED
package/dist/esm/types.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { FocusEventHandler, MouseEventHandler, ReactNode, RefObject } from 'react';
|
|
1
|
+
import { FocusEventHandler, KeyboardEventHandler, MouseEventHandler, ReactNode, RefObject } from 'react';
|
|
2
2
|
import { ValueOf, WithSupportProps } from '@snack-uikit/utils';
|
|
3
3
|
import { FAVORITE_ICON, MODE, SELECTION_MODE, SIZE } from './constants';
|
|
4
4
|
export type Size = ValueOf<typeof SIZE>;
|
|
@@ -45,6 +45,8 @@ export type TogglePrivateProps = WithSupportProps<{
|
|
|
45
45
|
onBlur?: FocusEventHandler<HTMLInputElement>;
|
|
46
46
|
/** Колбек приобретения фокуса */
|
|
47
47
|
onFocus?: FocusEventHandler<HTMLInputElement>;
|
|
48
|
+
/** Колбек нажатия клавиши клавиатуры */
|
|
49
|
+
onKeyDown?: KeyboardEventHandler<HTMLDivElement>;
|
|
48
50
|
}>;
|
|
49
51
|
export type ToggleProps = WithSupportProps<Pick<TogglePrivateProps, 'id' | 'name' | 'value' | 'tabIndex' | 'autofocus' | 'checked' | 'defaultChecked' | 'disabled' | 'onChange' | 'onClick' | 'onBlur' | 'onFocus' | 'className' | 'size'> & {
|
|
50
52
|
inputRef?: RefObject<HTMLInputElement>;
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"access": "public"
|
|
5
5
|
},
|
|
6
6
|
"title": "Toggles",
|
|
7
|
-
"version": "0.
|
|
7
|
+
"version": "0.12.1-preview-d1a63029.0",
|
|
8
8
|
"sideEffects": [
|
|
9
9
|
"*.css",
|
|
10
10
|
"*.woff",
|
|
@@ -36,11 +36,11 @@
|
|
|
36
36
|
"license": "Apache-2.0",
|
|
37
37
|
"scripts": {},
|
|
38
38
|
"dependencies": {
|
|
39
|
-
"@snack-uikit/icons": "0.
|
|
39
|
+
"@snack-uikit/icons": "0.24.0",
|
|
40
40
|
"@snack-uikit/utils": "3.5.0",
|
|
41
41
|
"classnames": "2.3.2",
|
|
42
42
|
"merge-refs": "1.2.1",
|
|
43
43
|
"uncontrollable": "8.0.0"
|
|
44
44
|
},
|
|
45
|
-
"gitHead": "
|
|
45
|
+
"gitHead": "167f0c505b9958dc320111f7ee9e8ed2ebc58796"
|
|
46
46
|
}
|
|
@@ -1,61 +1,59 @@
|
|
|
1
|
-
@
|
|
2
|
-
@
|
|
3
|
-
@
|
|
4
|
-
|
|
5
|
-
$sizes: 's', 'm';
|
|
1
|
+
@use '@snack-uikit/figma-tokens/build/scss/components/styles-tokens-toggles';
|
|
2
|
+
@use '@snack-uikit/figma-tokens/build/scss/components/styles-tokens-element';
|
|
3
|
+
@use '../styles.module';
|
|
6
4
|
|
|
7
5
|
$icon-sizes: (
|
|
8
|
-
's':
|
|
9
|
-
'm':
|
|
6
|
+
's': styles-tokens-element.$icon-xs,
|
|
7
|
+
'm': styles-tokens-element.$icon-s,
|
|
10
8
|
);
|
|
11
9
|
|
|
12
10
|
.container {
|
|
13
|
-
@include container('checkbox');
|
|
11
|
+
@include styles.container('checkbox');
|
|
14
12
|
}
|
|
15
13
|
|
|
16
14
|
.box {
|
|
17
15
|
box-sizing: border-box;
|
|
18
|
-
background-color: simple-var(
|
|
19
|
-
border-color: simple-var(
|
|
16
|
+
background-color: styles-tokens-toggles.simple-var(styles-tokens-toggles.$theme-variables, 'sys', 'neutral', 'background2-level');
|
|
17
|
+
border-color: styles-tokens-toggles.simple-var(styles-tokens-toggles.$theme-variables, 'sys', 'neutral', 'decor-activated');
|
|
20
18
|
border-style: solid; // это наверное должно быть в композитном токене box
|
|
21
19
|
|
|
22
20
|
&[data-checked=false] {
|
|
23
21
|
&[data-focusvisible=true],
|
|
24
22
|
&[data-hover=true] {
|
|
25
|
-
background-color: simple-var(
|
|
26
|
-
border-color: simple-var(
|
|
23
|
+
background-color: styles-tokens-toggles.simple-var(styles-tokens-toggles.$theme-variables, 'sys', 'neutral', 'background2-level');
|
|
24
|
+
border-color: styles-tokens-toggles.simple-var(styles-tokens-toggles.$theme-variables, 'sys', 'neutral', 'accent-hovered');
|
|
27
25
|
}
|
|
28
26
|
|
|
29
27
|
&[data-disabled=true] {
|
|
30
|
-
background-color: simple-var(
|
|
31
|
-
border-color: simple-var(
|
|
28
|
+
background-color: styles-tokens-toggles.simple-var(styles-tokens-toggles.$theme-variables, 'sys', 'neutral', 'decor-disabled');
|
|
29
|
+
border-color: styles-tokens-toggles.simple-var(styles-tokens-toggles.$theme-variables, 'sys', 'neutral', 'decor-default');
|
|
32
30
|
}
|
|
33
31
|
}
|
|
34
32
|
|
|
35
33
|
&[data-indeterminate=true],
|
|
36
34
|
&[data-checked=true] {
|
|
37
|
-
background-color: simple-var(
|
|
38
|
-
border-color: simple-var(
|
|
35
|
+
background-color: styles-tokens-toggles.simple-var(styles-tokens-toggles.$theme-variables, 'sys', 'primary', 'accent-default');
|
|
36
|
+
border-color: styles-tokens-toggles.simple-var(styles-tokens-toggles.$theme-variables, 'sys', 'primary', 'accent-default');
|
|
39
37
|
|
|
40
38
|
&[data-focusvisible=true],
|
|
41
39
|
&[data-hover=true] {
|
|
42
|
-
background-color: simple-var(
|
|
43
|
-
border-color: simple-var(
|
|
40
|
+
background-color: styles-tokens-toggles.simple-var(styles-tokens-toggles.$theme-variables, 'sys', 'primary', 'accent-hovered');
|
|
41
|
+
border-color: styles-tokens-toggles.simple-var(styles-tokens-toggles.$theme-variables, 'sys', 'primary', 'accent-hovered');
|
|
44
42
|
}
|
|
45
43
|
|
|
46
44
|
&[data-disabled=true] {
|
|
47
|
-
background-color: simple-var(
|
|
48
|
-
border-color: simple-var(
|
|
45
|
+
background-color: styles-tokens-toggles.simple-var(styles-tokens-toggles.$theme-variables, 'sys', 'neutral', 'text-disabled');
|
|
46
|
+
border-color: styles-tokens-toggles.simple-var(styles-tokens-toggles.$theme-variables, 'sys', 'neutral', 'text-disabled');
|
|
49
47
|
}
|
|
50
48
|
}
|
|
51
49
|
|
|
52
|
-
@each $size in
|
|
50
|
+
@each $size in styles.$sizes {
|
|
53
51
|
&[data-size='#{$size}'] {
|
|
54
|
-
@include composite-var(
|
|
52
|
+
@include styles-tokens-toggles.composite-var(styles-tokens-toggles.$toggles, $size, 'checkbox', 'box');
|
|
55
53
|
|
|
56
54
|
svg {
|
|
57
|
-
width: simple-var($icon-sizes, $size) !important; /* stylelint-disable-line declaration-no-important */
|
|
58
|
-
height: simple-var($icon-sizes, $size) !important; /* stylelint-disable-line declaration-no-important */
|
|
55
|
+
width: styles-tokens-toggles.simple-var($icon-sizes, $size) !important; /* stylelint-disable-line declaration-no-important */
|
|
56
|
+
height: styles-tokens-toggles.simple-var($icon-sizes, $size) !important; /* stylelint-disable-line declaration-no-important */
|
|
59
57
|
}
|
|
60
58
|
}
|
|
61
59
|
}
|
|
@@ -71,7 +69,7 @@ $icon-sizes: (
|
|
|
71
69
|
width: 100%;
|
|
72
70
|
height: 100%;
|
|
73
71
|
|
|
74
|
-
color: simple-var(
|
|
72
|
+
color: styles-tokens-toggles.simple-var(styles-tokens-toggles.$theme-variables, 'sys', 'primary', 'on-accent');
|
|
75
73
|
|
|
76
74
|
&[data-indeterminate=true],
|
|
77
75
|
&[data-checked=true] {
|
|
@@ -79,6 +77,6 @@ $icon-sizes: (
|
|
|
79
77
|
}
|
|
80
78
|
|
|
81
79
|
&[data-disabled=true] {
|
|
82
|
-
color: simple-var(
|
|
80
|
+
color: styles-tokens-toggles.simple-var(styles-tokens-toggles.$theme-variables, 'sys', 'neutral', 'decor-disabled');
|
|
83
81
|
}
|
|
84
82
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { useMemo } from 'react';
|
|
1
|
+
import { KeyboardEventHandler, useMemo } from 'react';
|
|
2
2
|
|
|
3
|
-
import { HeartFilledSVG, HeartSVG, StarFilledSVG, StarSVG } from '@snack-uikit/icons';
|
|
3
|
+
import { HeartFilledSVG, HeartSVG, PinnedSVG, StarFilledSVG, StarSVG, UnPinnedSVG } from '@snack-uikit/icons';
|
|
4
4
|
|
|
5
5
|
import { FAVORITE_ICON, SIZE } from '../../constants';
|
|
6
6
|
import { FavoriteIcon, ToggleProps } from '../../types';
|
|
@@ -11,16 +11,20 @@ import styles from './styles.module.scss';
|
|
|
11
11
|
const CHECKED_ICONS = {
|
|
12
12
|
[FAVORITE_ICON.Star]: StarFilledSVG,
|
|
13
13
|
[FAVORITE_ICON.Heart]: HeartFilledSVG,
|
|
14
|
+
[FAVORITE_ICON.Pin]: PinnedSVG,
|
|
14
15
|
};
|
|
15
16
|
|
|
16
17
|
const UNCHECKED_ICONS = {
|
|
17
18
|
[FAVORITE_ICON.Star]: StarSVG,
|
|
18
19
|
[FAVORITE_ICON.Heart]: HeartSVG,
|
|
20
|
+
[FAVORITE_ICON.Pin]: UnPinnedSVG,
|
|
19
21
|
};
|
|
20
22
|
|
|
21
23
|
export type FavoriteProps = ToggleProps & {
|
|
22
24
|
/** Иконка */
|
|
23
25
|
icon?: FavoriteIcon;
|
|
26
|
+
/** Колбек нажатия клавиши клавиатуры */
|
|
27
|
+
onKeyDown?: KeyboardEventHandler<HTMLDivElement>;
|
|
24
28
|
};
|
|
25
29
|
|
|
26
30
|
export function Favorite({
|
|
@@ -28,6 +32,7 @@ export function Favorite({
|
|
|
28
32
|
'data-test-id': dataTestId,
|
|
29
33
|
size = SIZE.M,
|
|
30
34
|
icon = FAVORITE_ICON.Heart,
|
|
35
|
+
onKeyDown,
|
|
31
36
|
...restProps
|
|
32
37
|
}: FavoriteProps) {
|
|
33
38
|
const iconSize = useMemo(() => getIconSize(size), [size]);
|
|
@@ -38,6 +43,7 @@ export function Favorite({
|
|
|
38
43
|
data-test-id={dataTestId}
|
|
39
44
|
ref={inputRef}
|
|
40
45
|
size={size}
|
|
46
|
+
onKeyDown={onKeyDown}
|
|
41
47
|
render={function Favorite(visualState) {
|
|
42
48
|
const Icon = visualState.checked ? CHECKED_ICONS[icon] : UNCHECKED_ICONS[icon];
|
|
43
49
|
const data = getVisualStateAttributes({ ...visualState, icon });
|
|
@@ -1,39 +1,38 @@
|
|
|
1
|
-
@
|
|
2
|
-
@
|
|
3
|
-
@import '../styles.module';
|
|
1
|
+
@use '@snack-uikit/figma-tokens/build/scss/components/styles-tokens-toggles';
|
|
2
|
+
@use '../styles.module';
|
|
4
3
|
|
|
5
|
-
$sizes: 's', 'm';
|
|
6
4
|
$icons: (
|
|
7
5
|
'star': 'yellow',
|
|
8
6
|
'heart': 'red',
|
|
7
|
+
'pin': 'primary',
|
|
9
8
|
);
|
|
10
9
|
|
|
11
10
|
.container {
|
|
12
|
-
@include container('favourite');
|
|
11
|
+
@include styles.container('favourite');
|
|
13
12
|
|
|
14
|
-
outline-color: simple-var(
|
|
13
|
+
outline-color: styles-tokens-toggles.simple-var(styles-tokens-toggles.$theme-variables, 'sys', 'available', 'complementary');
|
|
15
14
|
|
|
16
15
|
&[data-checked='true'] {
|
|
17
|
-
outline-color: simple-var(
|
|
16
|
+
outline-color: styles-tokens-toggles.simple-var(styles-tokens-toggles.$theme-variables, 'sys', 'available', 'complementary');
|
|
18
17
|
}
|
|
19
18
|
}
|
|
20
19
|
|
|
21
20
|
.icon {
|
|
22
|
-
color: simple-var(
|
|
21
|
+
color: styles-tokens-toggles.simple-var(styles-tokens-toggles.$theme-variables, 'sys', 'neutral', 'text-light');
|
|
23
22
|
|
|
24
23
|
&:not([data-disabled='true']) {
|
|
25
24
|
&[data-hover='true'] {
|
|
26
|
-
color: simple-var(
|
|
25
|
+
color: styles-tokens-toggles.simple-var(styles-tokens-toggles.$theme-variables, 'sys', 'neutral', 'text-support');
|
|
27
26
|
}
|
|
28
27
|
|
|
29
28
|
@each $icon, $color in $icons {
|
|
30
29
|
&[data-icon='#{$icon}'] {
|
|
31
30
|
&[data-checked='true'] {
|
|
32
|
-
color: simple-var(
|
|
31
|
+
color: styles-tokens-toggles.simple-var(styles-tokens-toggles.$theme-variables, 'sys', $color, 'accent-default');
|
|
33
32
|
|
|
34
33
|
&[data-focusvisible='true'],
|
|
35
34
|
&[data-hover='true'] {
|
|
36
|
-
color: simple-var(
|
|
35
|
+
color: styles-tokens-toggles.simple-var(styles-tokens-toggles.$theme-variables, 'sys', $color, 'accent-hovered');
|
|
37
36
|
}
|
|
38
37
|
}
|
|
39
38
|
}
|
|
@@ -41,6 +40,6 @@ $icons: (
|
|
|
41
40
|
}
|
|
42
41
|
|
|
43
42
|
&[data-disabled='true'] {
|
|
44
|
-
color:
|
|
43
|
+
color: styles-tokens-toggles.$sys-neutral-text-disabled;
|
|
45
44
|
}
|
|
46
45
|
}
|
|
@@ -1,11 +1,8 @@
|
|
|
1
|
-
@
|
|
2
|
-
@
|
|
3
|
-
@import '../styles.module';
|
|
4
|
-
|
|
5
|
-
$sizes: 's', 'm';
|
|
1
|
+
@use '@snack-uikit/figma-tokens/build/scss/components/styles-tokens-toggles';
|
|
2
|
+
@use '../styles.module';
|
|
6
3
|
|
|
7
4
|
.container {
|
|
8
|
-
@include container('radio');
|
|
5
|
+
@include styles.container('radio');
|
|
9
6
|
}
|
|
10
7
|
|
|
11
8
|
.box {
|
|
@@ -13,37 +10,37 @@ $sizes: 's', 'm';
|
|
|
13
10
|
|
|
14
11
|
box-sizing: border-box;
|
|
15
12
|
|
|
16
|
-
background-color: simple-var(
|
|
17
|
-
border-color: simple-var(
|
|
13
|
+
background-color: styles-tokens-toggles.simple-var(styles-tokens-toggles.$theme-variables, 'sys', 'neutral', 'background2-level');
|
|
14
|
+
border-color: styles-tokens-toggles.simple-var(styles-tokens-toggles.$theme-variables, 'sys', 'neutral', 'decor-activated');
|
|
18
15
|
border-style: solid; // это наверное должно быть в композитном токене box
|
|
19
16
|
|
|
20
|
-
@each $size in
|
|
17
|
+
@each $size in styles.$sizes {
|
|
21
18
|
&[data-size='#{$size}'] {
|
|
22
|
-
@include composite-var(
|
|
19
|
+
@include styles-tokens-toggles.composite-var(styles-tokens-toggles.$toggles, $size, 'radio', 'box');
|
|
23
20
|
}
|
|
24
21
|
}
|
|
25
22
|
|
|
26
23
|
&[data-focusvisible=true],
|
|
27
24
|
&[data-hover=true] {
|
|
28
|
-
background-color: simple-var(
|
|
29
|
-
border-color: simple-var(
|
|
25
|
+
background-color: styles-tokens-toggles.simple-var(styles-tokens-toggles.$theme-variables, 'sys', 'neutral', 'background2-level');
|
|
26
|
+
border-color: styles-tokens-toggles.simple-var(styles-tokens-toggles.$theme-variables, 'sys', 'neutral', 'accent-hovered');
|
|
30
27
|
}
|
|
31
28
|
|
|
32
29
|
&[data-disabled=true] {
|
|
33
|
-
background-color: simple-var(
|
|
34
|
-
border-color: simple-var(
|
|
30
|
+
background-color: styles-tokens-toggles.simple-var(styles-tokens-toggles.$theme-variables, 'sys', 'neutral', 'decor-disabled');
|
|
31
|
+
border-color: styles-tokens-toggles.simple-var(styles-tokens-toggles.$theme-variables, 'sys', 'neutral', 'decor-default');
|
|
35
32
|
}
|
|
36
33
|
|
|
37
34
|
&[data-checked=true] {
|
|
38
|
-
border-color: simple-var(
|
|
35
|
+
border-color: styles-tokens-toggles.simple-var(styles-tokens-toggles.$theme-variables, 'sys', 'primary', 'accent-default');
|
|
39
36
|
|
|
40
37
|
&[data-focusvisible=true],
|
|
41
38
|
&[data-hover=true] {
|
|
42
|
-
border-color: simple-var(
|
|
39
|
+
border-color: styles-tokens-toggles.simple-var(styles-tokens-toggles.$theme-variables, 'sys', 'primary', 'accent-hovered');
|
|
43
40
|
}
|
|
44
41
|
|
|
45
42
|
&[data-disabled=true] {
|
|
46
|
-
border-color: simple-var(
|
|
43
|
+
border-color: styles-tokens-toggles.simple-var(styles-tokens-toggles.$theme-variables, 'sys', 'neutral', 'decor-default');
|
|
47
44
|
}
|
|
48
45
|
}
|
|
49
46
|
}
|
|
@@ -54,23 +51,23 @@ $sizes: 's', 'm';
|
|
|
54
51
|
left: 50%;
|
|
55
52
|
transform: translate(-50%, -50%);
|
|
56
53
|
|
|
57
|
-
background-color: simple-var(
|
|
54
|
+
background-color: styles-tokens-toggles.simple-var(styles-tokens-toggles.$theme-variables, 'sys', 'primary', 'accent-default');
|
|
58
55
|
|
|
59
56
|
&[data-hover=true] {
|
|
60
|
-
background-color: simple-var(
|
|
57
|
+
background-color: styles-tokens-toggles.simple-var(styles-tokens-toggles.$theme-variables, 'sys', 'primary', 'accent-hovered');
|
|
61
58
|
}
|
|
62
59
|
|
|
63
60
|
&[data-disabled=true] {
|
|
64
|
-
background-color: simple-var(
|
|
61
|
+
background-color: styles-tokens-toggles.simple-var(styles-tokens-toggles.$theme-variables, 'sys', 'neutral', 'text-disabled');
|
|
65
62
|
}
|
|
66
63
|
|
|
67
64
|
&[data-checked=false] {
|
|
68
65
|
display: none;
|
|
69
66
|
}
|
|
70
67
|
|
|
71
|
-
@each $size in
|
|
68
|
+
@each $size in styles.$sizes {
|
|
72
69
|
&[data-size='#{$size}'] {
|
|
73
|
-
@include composite-var(
|
|
70
|
+
@include styles-tokens-toggles.composite-var(styles-tokens-toggles.$toggles, $size, 'radio', 'flag');
|
|
74
71
|
}
|
|
75
72
|
}
|
|
76
73
|
}
|
|
@@ -1,41 +1,39 @@
|
|
|
1
|
-
@
|
|
2
|
-
@
|
|
3
|
-
@import '../styles.module';
|
|
1
|
+
@use '@snack-uikit/figma-tokens/build/scss/components/styles-tokens-toggles';
|
|
2
|
+
@use '../styles.module';
|
|
4
3
|
|
|
5
|
-
$sizes: 's', 'm';
|
|
6
4
|
$switchAnimationDuration: 0.1s;
|
|
7
5
|
|
|
8
6
|
.container {
|
|
9
|
-
@include container('switch');
|
|
7
|
+
@include styles.container('switch');
|
|
10
8
|
}
|
|
11
9
|
|
|
12
10
|
.box {
|
|
13
11
|
position: relative;
|
|
14
|
-
background-color: simple-var(
|
|
12
|
+
background-color: styles-tokens-toggles.simple-var(styles-tokens-toggles.$theme-variables, 'sys', 'neutral', 'decor-activated');
|
|
15
13
|
|
|
16
|
-
@each $size in
|
|
14
|
+
@each $size in styles.$sizes {
|
|
17
15
|
&[data-size='#{$size}'] {
|
|
18
|
-
@include composite-var(
|
|
16
|
+
@include styles-tokens-toggles.composite-var(styles-tokens-toggles.$toggles, $size, 'switch', 'box');
|
|
19
17
|
}
|
|
20
18
|
}
|
|
21
19
|
|
|
22
20
|
&[data-hover='true'] {
|
|
23
|
-
background-color: simple-var(
|
|
21
|
+
background-color: styles-tokens-toggles.simple-var(styles-tokens-toggles.$theme-variables, 'sys', 'neutral', 'accent-hovered');
|
|
24
22
|
}
|
|
25
23
|
|
|
26
24
|
&[data-disabled='true'] {
|
|
27
|
-
background-color: simple-var(
|
|
25
|
+
background-color: styles-tokens-toggles.simple-var(styles-tokens-toggles.$theme-variables, 'sys', 'neutral', 'decor-default');
|
|
28
26
|
}
|
|
29
27
|
|
|
30
28
|
&[data-checked='true'] {
|
|
31
|
-
background-color: simple-var(
|
|
29
|
+
background-color: styles-tokens-toggles.simple-var(styles-tokens-toggles.$theme-variables, 'sys', 'primary', 'accent-default');
|
|
32
30
|
|
|
33
31
|
&[data-hover='true'] {
|
|
34
|
-
background-color: simple-var(
|
|
32
|
+
background-color: styles-tokens-toggles.simple-var(styles-tokens-toggles.$theme-variables, 'sys', 'primary', 'accent-hovered');
|
|
35
33
|
}
|
|
36
34
|
|
|
37
35
|
&[data-disabled='true'] {
|
|
38
|
-
background-color: simple-var(
|
|
36
|
+
background-color: styles-tokens-toggles.simple-var(styles-tokens-toggles.$theme-variables, 'sys', 'neutral', 'decor-default');
|
|
39
37
|
}
|
|
40
38
|
}
|
|
41
39
|
}
|
|
@@ -52,32 +50,32 @@ $switchAnimationDuration: 0.1s;
|
|
|
52
50
|
transition-duration: $switchAnimationDuration;
|
|
53
51
|
transition-property: left;
|
|
54
52
|
|
|
55
|
-
@each $size in
|
|
53
|
+
@each $size in styles.$sizes {
|
|
56
54
|
&[data-size='#{$size}'] {
|
|
57
|
-
@include composite-var(
|
|
55
|
+
@include styles-tokens-toggles.composite-var(styles-tokens-toggles.$toggles, $size, 'switch', 'container-flag');
|
|
58
56
|
&[data-checked='true'] {
|
|
59
|
-
left: calc(100% - #{simple-var(
|
|
57
|
+
left: calc(100% - #{styles-tokens-toggles.simple-var(styles-tokens-toggles.$toggles, $size, 'switch', 'container-flag', 'width')});
|
|
60
58
|
}
|
|
61
59
|
}
|
|
62
60
|
}
|
|
63
61
|
}
|
|
64
62
|
|
|
65
63
|
.flag {
|
|
66
|
-
background-color: simple-var(
|
|
64
|
+
background-color: styles-tokens-toggles.simple-var(styles-tokens-toggles.$theme-variables, 'sys', 'neutral', 'background2-level');
|
|
67
65
|
|
|
68
|
-
@each $size in
|
|
66
|
+
@each $size in styles.$sizes {
|
|
69
67
|
&[data-size='#{$size}'] {
|
|
70
|
-
@include composite-var(
|
|
68
|
+
@include styles-tokens-toggles.composite-var(styles-tokens-toggles.$toggles, $size, 'switch', 'flag');
|
|
71
69
|
}
|
|
72
70
|
}
|
|
73
71
|
|
|
74
72
|
&[data-focusvisible=true],
|
|
75
73
|
&[data-hover=true] {
|
|
76
|
-
background-color: simple-var(
|
|
74
|
+
background-color: styles-tokens-toggles.simple-var(styles-tokens-toggles.$theme-variables, 'sys', 'neutral', 'on-accent');
|
|
77
75
|
}
|
|
78
76
|
|
|
79
77
|
&[data-disabled='true'] {
|
|
80
|
-
background-color: simple-var(
|
|
78
|
+
background-color: styles-tokens-toggles.simple-var(styles-tokens-toggles.$theme-variables, 'sys', 'neutral', 'background2-level');
|
|
81
79
|
}
|
|
82
80
|
}
|
|
83
81
|
|
|
@@ -89,29 +87,29 @@ $switchAnimationDuration: 0.1s;
|
|
|
89
87
|
|
|
90
88
|
display: flex;
|
|
91
89
|
|
|
92
|
-
color: simple-var(
|
|
90
|
+
color: styles-tokens-toggles.simple-var(styles-tokens-toggles.$theme-variables, 'sys', 'neutral', 'text-disabled');
|
|
93
91
|
|
|
94
92
|
fill: transparent;
|
|
95
93
|
|
|
96
94
|
transition: opacity $switchAnimationDuration linear;
|
|
97
95
|
|
|
98
96
|
&[data-hover='true'] {
|
|
99
|
-
color: simple-var(
|
|
97
|
+
color: styles-tokens-toggles.simple-var(styles-tokens-toggles.$theme-variables, 'sys', 'neutral', 'accent-hovered');
|
|
100
98
|
}
|
|
101
99
|
|
|
102
100
|
&[data-checked='true'] {
|
|
103
|
-
color: simple-var(
|
|
101
|
+
color: styles-tokens-toggles.simple-var(styles-tokens-toggles.$theme-variables, 'sys', 'primary', 'accent-default');
|
|
104
102
|
|
|
105
103
|
&[data-hover='true'] {
|
|
106
|
-
color: simple-var(
|
|
104
|
+
color: styles-tokens-toggles.simple-var(styles-tokens-toggles.$theme-variables, 'sys', 'primary', 'accent-hovered');
|
|
107
105
|
}
|
|
108
106
|
}
|
|
109
107
|
|
|
110
108
|
&[data-disabled='true'] {
|
|
111
|
-
color: simple-var(
|
|
109
|
+
color: styles-tokens-toggles.simple-var(styles-tokens-toggles.$theme-variables, 'sys', 'neutral', 'text-disabled');
|
|
112
110
|
|
|
113
111
|
&[data-hover='true'] {
|
|
114
|
-
color: simple-var(
|
|
112
|
+
color: styles-tokens-toggles.simple-var(styles-tokens-toggles.$theme-variables, 'sys', 'neutral', 'text-disabled');
|
|
115
113
|
}
|
|
116
114
|
}
|
|
117
115
|
}
|
|
@@ -19,6 +19,7 @@ export const TogglePrivate = forwardRef<HTMLInputElement, TogglePrivateProps>(fu
|
|
|
19
19
|
className,
|
|
20
20
|
size = SIZE.M,
|
|
21
21
|
mode = MODE.Checkbox,
|
|
22
|
+
onKeyDown,
|
|
22
23
|
'data-test-id': testId,
|
|
23
24
|
...otherProps
|
|
24
25
|
},
|
|
@@ -38,11 +39,13 @@ export const TogglePrivate = forwardRef<HTMLInputElement, TogglePrivateProps>(fu
|
|
|
38
39
|
|
|
39
40
|
return (
|
|
40
41
|
<span
|
|
42
|
+
role={mode}
|
|
41
43
|
className={cn(className, styles.toggleLayout)}
|
|
42
44
|
data-size={size}
|
|
43
45
|
data-test-id={testId}
|
|
44
46
|
onMouseEnter={() => setHover(true)}
|
|
45
47
|
onMouseLeave={() => setHover(false)}
|
|
48
|
+
onKeyDown={onKeyDown}
|
|
46
49
|
{...getVisualStateAttributes(visualState)}
|
|
47
50
|
>
|
|
48
51
|
{render(visualState)}
|
|
@@ -1,11 +1,9 @@
|
|
|
1
|
-
@
|
|
2
|
-
@
|
|
3
|
-
|
|
4
|
-
$sizes: 's', 'm';
|
|
1
|
+
@use '@snack-uikit/figma-tokens/build/scss/components/styles-tokens-toggles';
|
|
2
|
+
@use '@snack-uikit/figma-tokens/build/scss/components/styles-tokens-element';
|
|
5
3
|
|
|
6
4
|
$icon-sizes: (
|
|
7
|
-
's':
|
|
8
|
-
'm':
|
|
5
|
+
's': styles-tokens-element.$icon-xs,
|
|
6
|
+
'm': styles-tokens-element.$icon-s,
|
|
9
7
|
);
|
|
10
8
|
|
|
11
9
|
.toggleLayout {
|
|
@@ -21,7 +19,7 @@ $icon-sizes: (
|
|
|
21
19
|
|
|
22
20
|
&[data-disabled=true] {
|
|
23
21
|
cursor: not-allowed;
|
|
24
|
-
color:
|
|
22
|
+
color: styles-tokens-toggles.$sys-neutral-text-disabled;
|
|
25
23
|
}
|
|
26
24
|
}
|
|
27
25
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
@
|
|
2
|
-
@
|
|
1
|
+
@use '@snack-uikit/figma-tokens/build/scss/components/styles-tokens-element';
|
|
2
|
+
@use '@snack-uikit/figma-tokens/build/scss/components/styles-tokens-toggles';
|
|
3
3
|
|
|
4
4
|
$sizes: 's', 'm';
|
|
5
5
|
|
|
@@ -11,14 +11,14 @@ $sizes: 's', 'm';
|
|
|
11
11
|
|
|
12
12
|
@each $size in $sizes {
|
|
13
13
|
&[data-size='#{$size}'] {
|
|
14
|
-
@include composite-var(
|
|
14
|
+
@include styles-tokens-toggles.composite-var(styles-tokens-toggles.$toggles, $size, $component, 'container');
|
|
15
15
|
}
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
&[data-focusvisible=true] {
|
|
19
|
-
@include outline-var(
|
|
19
|
+
@include styles-tokens-toggles.outline-var(styles-tokens-element.$container-focused-s);
|
|
20
20
|
&[data-size='s'] {
|
|
21
|
-
outline-offset: simple-var(
|
|
21
|
+
outline-offset: styles-tokens-toggles.simple-var(styles-tokens-toggles.$theme-variables, 'border-width', 'state-focus', 's');
|
|
22
22
|
}
|
|
23
23
|
}
|
|
24
24
|
}
|
package/src/constants.ts
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
@
|
|
2
|
-
|
|
1
|
+
@use '@snack-uikit/figma-tokens/build/scss/styles-theme-variables';
|
|
3
2
|
|
|
4
3
|
.spinner {
|
|
5
4
|
pointer-events: none;
|
|
6
|
-
width:
|
|
7
|
-
height:
|
|
5
|
+
width: styles-theme-variables.$dimension-2m;
|
|
6
|
+
height: styles-theme-variables.$dimension-2m;
|
|
8
7
|
animation: spin 1s ease-in-out infinite;
|
|
9
8
|
|
|
10
9
|
& > path {
|
package/src/types.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { FocusEventHandler, MouseEventHandler, ReactNode, RefObject } from 'react';
|
|
1
|
+
import { FocusEventHandler, KeyboardEventHandler, MouseEventHandler, ReactNode, RefObject } from 'react';
|
|
2
2
|
|
|
3
3
|
import { ValueOf, WithSupportProps } from '@snack-uikit/utils';
|
|
4
4
|
|
|
@@ -51,6 +51,8 @@ export type TogglePrivateProps = WithSupportProps<{
|
|
|
51
51
|
onBlur?: FocusEventHandler<HTMLInputElement>;
|
|
52
52
|
/** Колбек приобретения фокуса */
|
|
53
53
|
onFocus?: FocusEventHandler<HTMLInputElement>;
|
|
54
|
+
/** Колбек нажатия клавиши клавиатуры */
|
|
55
|
+
onKeyDown?: KeyboardEventHandler<HTMLDivElement>;
|
|
54
56
|
}>;
|
|
55
57
|
|
|
56
58
|
export type ToggleProps = WithSupportProps<
|