@snack-uikit/chips 0.17.0 → 0.19.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 +28 -0
- package/README.md +22 -1
- package/dist/cjs/components/ChipChoice/components/ChipChoiceBase/styles.module.css +6 -6
- package/dist/cjs/components/ChipChoice/components/ChipChoiceDate.d.ts +9 -2
- package/dist/cjs/components/ChipChoice/components/ChipChoiceDate.js +46 -10
- package/dist/cjs/components/ChipChoice/components/ChipChoiceDateRange.js +2 -1
- package/dist/cjs/components/ChipChoice/components/ChipChoiceTime.d.ts +12 -0
- package/dist/cjs/components/ChipChoice/components/ChipChoiceTime.js +123 -0
- package/dist/cjs/components/ChipChoice/components/index.d.ts +1 -0
- package/dist/cjs/components/ChipChoice/components/index.js +2 -1
- package/dist/cjs/components/ChipChoice/constants.d.ts +4 -1
- package/dist/cjs/components/ChipChoice/constants.js +10 -2
- package/dist/cjs/components/ChipChoice/index.d.ts +3 -2
- package/dist/cjs/components/ChipChoice/index.js +1 -0
- package/dist/cjs/components/ChipChoiceRow/components/constants.d.ts +1 -0
- package/dist/cjs/components/ChipChoiceRow/components/constants.js +1 -0
- package/dist/cjs/components/ChipChoiceRow/types.d.ts +7 -1
- package/dist/esm/components/ChipChoice/components/ChipChoiceBase/styles.module.css +6 -6
- package/dist/esm/components/ChipChoice/components/ChipChoiceDate.d.ts +9 -2
- package/dist/esm/components/ChipChoice/components/ChipChoiceDate.js +35 -10
- package/dist/esm/components/ChipChoice/components/ChipChoiceDateRange.js +3 -3
- package/dist/esm/components/ChipChoice/components/ChipChoiceTime.d.ts +12 -0
- package/dist/esm/components/ChipChoice/components/ChipChoiceTime.js +64 -0
- package/dist/esm/components/ChipChoice/components/index.d.ts +1 -0
- package/dist/esm/components/ChipChoice/components/index.js +1 -0
- package/dist/esm/components/ChipChoice/constants.d.ts +4 -1
- package/dist/esm/components/ChipChoice/constants.js +8 -0
- package/dist/esm/components/ChipChoice/index.d.ts +3 -2
- package/dist/esm/components/ChipChoice/index.js +2 -1
- package/dist/esm/components/ChipChoiceRow/components/constants.d.ts +1 -0
- package/dist/esm/components/ChipChoiceRow/components/constants.js +1 -0
- package/dist/esm/components/ChipChoiceRow/types.d.ts +7 -1
- package/package.json +8 -8
- package/src/components/ChipAssist/styles.module.scss +29 -30
- package/src/components/ChipChoice/components/ChipChoiceBase/styles.module.scss +23 -40
- package/src/components/ChipChoice/components/ChipChoiceDate.tsx +62 -12
- package/src/components/ChipChoice/components/ChipChoiceDateRange.tsx +3 -2
- package/src/components/ChipChoice/components/ChipChoiceTime.tsx +125 -0
- package/src/components/ChipChoice/components/index.ts +1 -0
- package/src/components/ChipChoice/constants.ts +11 -1
- package/src/components/ChipChoice/index.ts +10 -1
- package/src/components/ChipChoice/styles.module.scss +32 -31
- package/src/components/ChipChoiceRow/components/constants.ts +1 -0
- package/src/components/ChipChoiceRow/styles.module.scss +2 -2
- package/src/components/ChipChoiceRow/types.ts +5 -0
- package/src/components/ChipToggle/styles.module.scss +45 -46
- package/src/helperComponents/ButtonClearValue/styles.module.scss +14 -14
- package/src/styles.module.scss +11 -11
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { TimePickerProps } from '@snack-uikit/calendar';
|
|
3
|
+
import { ChipChoiceCommonProps } from '../types';
|
|
4
|
+
type TimeValue = TimePickerProps['value'];
|
|
5
|
+
export type ChipChoiceTimeProps = Omit<ChipChoiceCommonProps, 'widthStrategy'> & Pick<TimePickerProps, 'value' | 'defaultValue' | 'showSeconds'> & {
|
|
6
|
+
/** Колбек смены значения */
|
|
7
|
+
onChange?(value: TimeValue): void;
|
|
8
|
+
/** Колбек формирующий строковое представление выбранного значения. Принимает выбранное значение */
|
|
9
|
+
valueRender?(value?: TimeValue): ReactNode;
|
|
10
|
+
};
|
|
11
|
+
export declare function ChipChoiceTime({ size, value, defaultValue, onChange, valueRender, dropDownClassName, showSeconds, placement, ...rest }: ChipChoiceTimeProps): import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
2
|
+
var t = {};
|
|
3
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
4
|
+
t[p] = s[p];
|
|
5
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
6
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
7
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
8
|
+
t[p[i]] = s[p[i]];
|
|
9
|
+
}
|
|
10
|
+
return t;
|
|
11
|
+
};
|
|
12
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
13
|
+
import { useCallback, useMemo, useRef, useState } from 'react';
|
|
14
|
+
import { TimePicker } from '@snack-uikit/calendar';
|
|
15
|
+
import { Dropdown } from '@snack-uikit/dropdown';
|
|
16
|
+
import { useLocale } from '@snack-uikit/locale';
|
|
17
|
+
import { useValueControl } from '@snack-uikit/utils';
|
|
18
|
+
import { CHIP_CHOICE_TEST_IDS, SIZE } from '../../../constants';
|
|
19
|
+
import { DEFAULT_LOCALE, TIME_PICKER_SIZE_MAP } from '../constants';
|
|
20
|
+
import { useHandleOnKeyDown } from '../hooks';
|
|
21
|
+
import { ChipChoiceBase } from './ChipChoiceBase';
|
|
22
|
+
const getStringTimeValue = (time, { showSeconds, locale }) => {
|
|
23
|
+
var _a, _b, _c;
|
|
24
|
+
if (!time) {
|
|
25
|
+
return '';
|
|
26
|
+
}
|
|
27
|
+
const date = new Date();
|
|
28
|
+
date.setHours((_a = time.hours) !== null && _a !== void 0 ? _a : 0);
|
|
29
|
+
date.setMinutes((_b = time.minutes) !== null && _b !== void 0 ? _b : 0);
|
|
30
|
+
date.setSeconds((_c = time.seconds) !== null && _c !== void 0 ? _c : 0);
|
|
31
|
+
return date.toLocaleTimeString(locale, {
|
|
32
|
+
hour: 'numeric',
|
|
33
|
+
minute: 'numeric',
|
|
34
|
+
second: showSeconds ? 'numeric' : undefined,
|
|
35
|
+
});
|
|
36
|
+
};
|
|
37
|
+
export function ChipChoiceTime(_a) {
|
|
38
|
+
var { size = SIZE.S, value, defaultValue, onChange, valueRender, dropDownClassName, showSeconds = true, placement } = _a, rest = __rest(_a, ["size", "value", "defaultValue", "onChange", "valueRender", "dropDownClassName", "showSeconds", "placement"]);
|
|
39
|
+
const [selectedValue, setSelectedValue] = useValueControl({ value, defaultValue, onChange });
|
|
40
|
+
const localRef = useRef(null);
|
|
41
|
+
const [open, setOpen] = useState(false);
|
|
42
|
+
const handleOnKeyDown = useHandleOnKeyDown({ setOpen });
|
|
43
|
+
const closeDroplist = useCallback(() => {
|
|
44
|
+
setOpen(false);
|
|
45
|
+
setTimeout(() => { var _a; return (_a = localRef.current) === null || _a === void 0 ? void 0 : _a.focus(); }, 0);
|
|
46
|
+
}, []);
|
|
47
|
+
const { t } = useLocale('Chips');
|
|
48
|
+
const valueToRender = useMemo(() => {
|
|
49
|
+
if (valueRender) {
|
|
50
|
+
return valueRender(selectedValue);
|
|
51
|
+
}
|
|
52
|
+
if (!selectedValue)
|
|
53
|
+
return t('allLabel');
|
|
54
|
+
return getStringTimeValue(selectedValue, { showSeconds, locale: DEFAULT_LOCALE });
|
|
55
|
+
}, [selectedValue, showSeconds, t, valueRender]);
|
|
56
|
+
const clearValue = () => setSelectedValue(undefined);
|
|
57
|
+
const handleChangeValue = useCallback((value) => {
|
|
58
|
+
setSelectedValue(value);
|
|
59
|
+
closeDroplist();
|
|
60
|
+
}, [closeDroplist, setSelectedValue]);
|
|
61
|
+
const navigationStartRef = useRef(null);
|
|
62
|
+
const focusNavigationStartItem = () => setTimeout(() => { var _a; return (_a = navigationStartRef.current) === null || _a === void 0 ? void 0 : _a.focus(); }, 0);
|
|
63
|
+
return (_jsx(Dropdown, { content: _jsx(TimePicker, { size: TIME_PICKER_SIZE_MAP[size], value: selectedValue, fitToContainer: false, onChangeValue: handleChangeValue, navigationStartRef: navigationStartRef, onFocusLeave: closeDroplist, showSeconds: showSeconds }), placement: placement, widthStrategy: 'auto', outsideClick: true, triggerRef: localRef, open: open, onOpenChange: setOpen, className: dropDownClassName, "data-test-id": CHIP_CHOICE_TEST_IDS.droplist, children: _jsx(ChipChoiceBase, Object.assign({}, rest, { ref: localRef, onClearButtonClick: clearValue, value: selectedValue, valueToRender: valueToRender, size: size, onKeyDown: handleOnKeyDown(focusNavigationStartItem) })) }));
|
|
64
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CalendarProps } from '@snack-uikit/calendar';
|
|
1
|
+
import { CalendarProps, TimePickerProps } from '@snack-uikit/calendar';
|
|
2
2
|
import { DroplistProps } from '@snack-uikit/list';
|
|
3
3
|
import { Size } from '../../types';
|
|
4
4
|
export declare const BUTTON_CLEAR_VALUE_SIZE_MAP: {
|
|
@@ -8,11 +8,14 @@ export declare const BUTTON_CLEAR_VALUE_SIZE_MAP: {
|
|
|
8
8
|
l: "xs";
|
|
9
9
|
};
|
|
10
10
|
export declare const CALENDAR_SIZE_MAP: Record<Size, CalendarProps['size']>;
|
|
11
|
+
export declare const TIME_PICKER_SIZE_MAP: Record<Size, TimePickerProps['size']>;
|
|
11
12
|
export declare const DROPLIST_SIZE_MAP: Record<Size, DroplistProps['size']>;
|
|
12
13
|
export declare const CHIP_CHOICE_TYPE: {
|
|
13
14
|
readonly Multiple: "multiple";
|
|
14
15
|
readonly Date: "date";
|
|
16
|
+
readonly DateTime: "date-time";
|
|
15
17
|
readonly DateRange: "date-range";
|
|
16
18
|
readonly Single: "single";
|
|
17
19
|
readonly Custom: "custom";
|
|
18
20
|
};
|
|
21
|
+
export declare const DEFAULT_LOCALE: Intl.Locale;
|
|
@@ -11,6 +11,12 @@ export const CALENDAR_SIZE_MAP = {
|
|
|
11
11
|
[SIZE.M]: 'm',
|
|
12
12
|
[SIZE.L]: 'm',
|
|
13
13
|
};
|
|
14
|
+
export const TIME_PICKER_SIZE_MAP = {
|
|
15
|
+
[SIZE.Xs]: 's',
|
|
16
|
+
[SIZE.S]: 's',
|
|
17
|
+
[SIZE.M]: 'm',
|
|
18
|
+
[SIZE.L]: 'l',
|
|
19
|
+
};
|
|
14
20
|
export const DROPLIST_SIZE_MAP = {
|
|
15
21
|
[SIZE.Xs]: 's',
|
|
16
22
|
[SIZE.S]: 's',
|
|
@@ -20,7 +26,9 @@ export const DROPLIST_SIZE_MAP = {
|
|
|
20
26
|
export const CHIP_CHOICE_TYPE = {
|
|
21
27
|
Multiple: 'multiple',
|
|
22
28
|
Date: 'date',
|
|
29
|
+
DateTime: 'date-time',
|
|
23
30
|
DateRange: 'date-range',
|
|
24
31
|
Single: 'single',
|
|
25
32
|
Custom: 'custom',
|
|
26
33
|
};
|
|
34
|
+
export const DEFAULT_LOCALE = new Intl.Locale('ru-RU');
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
import { ChipChoiceCustom, ChipChoiceCustomProps, ChipChoiceDate, ChipChoiceDateProps, ChipChoiceDateRange, ChipChoiceDateRangeProps, ChipChoiceMultiple, ChipChoiceSingle, CustomContentRenderProps } from './components';
|
|
1
|
+
import { ChipChoiceCustom, ChipChoiceCustomProps, ChipChoiceDate, ChipChoiceDateProps, ChipChoiceDateRange, ChipChoiceDateRangeProps, ChipChoiceMultiple, ChipChoiceSingle, ChipChoiceTime, ChipChoiceTimeProps, CustomContentRenderProps } from './components';
|
|
2
2
|
export type { FilterOption, ChipChoiceMultipleProps, ChipChoiceSingleProps, ContentRenderProps } from './types';
|
|
3
|
-
export type { ChipChoiceCustomProps, ChipChoiceDateProps, ChipChoiceDateRangeProps, CustomContentRenderProps };
|
|
3
|
+
export type { ChipChoiceCustomProps, ChipChoiceDateProps, ChipChoiceDateRangeProps, CustomContentRenderProps, ChipChoiceTimeProps, };
|
|
4
4
|
export declare namespace ChipChoice {
|
|
5
5
|
const Custom: typeof ChipChoiceCustom;
|
|
6
6
|
const Single: typeof ChipChoiceSingle;
|
|
7
7
|
const Multiple: typeof ChipChoiceMultiple;
|
|
8
8
|
const Date: typeof ChipChoiceDate;
|
|
9
9
|
const DateRange: typeof ChipChoiceDateRange;
|
|
10
|
+
const Time: typeof ChipChoiceTime;
|
|
10
11
|
}
|
|
11
12
|
export { isAccordionOption, isBaseOption, isGroupOption, isGroupSelectOption, isNextListOption } from './utils';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ChipChoiceCustom, ChipChoiceDate, ChipChoiceDateRange, ChipChoiceMultiple, ChipChoiceSingle, } from './components';
|
|
1
|
+
import { ChipChoiceCustom, ChipChoiceDate, ChipChoiceDateRange, ChipChoiceMultiple, ChipChoiceSingle, ChipChoiceTime, } from './components';
|
|
2
2
|
export var ChipChoice;
|
|
3
3
|
(function (ChipChoice) {
|
|
4
4
|
ChipChoice.Custom = ChipChoiceCustom;
|
|
@@ -6,5 +6,6 @@ export var ChipChoice;
|
|
|
6
6
|
ChipChoice.Multiple = ChipChoiceMultiple;
|
|
7
7
|
ChipChoice.Date = ChipChoiceDate;
|
|
8
8
|
ChipChoice.DateRange = ChipChoiceDateRange;
|
|
9
|
+
ChipChoice.Time = ChipChoiceTime;
|
|
9
10
|
})(ChipChoice || (ChipChoice = {}));
|
|
10
11
|
export { isAccordionOption, isBaseOption, isGroupOption, isGroupSelectOption, isNextListOption } from './utils';
|
|
@@ -2,6 +2,7 @@ export declare const MAP_CHIP_TYPE_TO_COMPONENT: {
|
|
|
2
2
|
single: typeof import("../../ChipChoice/components").ChipChoiceSingle;
|
|
3
3
|
multiple: typeof import("../../ChipChoice/components").ChipChoiceMultiple;
|
|
4
4
|
date: typeof import("../../ChipChoice/components").ChipChoiceDate;
|
|
5
|
+
"date-time": typeof import("../../ChipChoice/components").ChipChoiceDate;
|
|
5
6
|
"date-range": typeof import("../../ChipChoice/components").ChipChoiceDateRange;
|
|
6
7
|
custom: typeof import("../../ChipChoice/components").ChipChoiceCustom;
|
|
7
8
|
};
|
|
@@ -4,6 +4,7 @@ export const MAP_CHIP_TYPE_TO_COMPONENT = {
|
|
|
4
4
|
[CHIP_CHOICE_TYPE.Single]: ChipChoice.Single,
|
|
5
5
|
[CHIP_CHOICE_TYPE.Multiple]: ChipChoice.Multiple,
|
|
6
6
|
[CHIP_CHOICE_TYPE.Date]: ChipChoice.Date,
|
|
7
|
+
[CHIP_CHOICE_TYPE.DateTime]: ChipChoice.Date,
|
|
7
8
|
[CHIP_CHOICE_TYPE.DateRange]: ChipChoice.DateRange,
|
|
8
9
|
[CHIP_CHOICE_TYPE.Custom]: ChipChoice.Custom,
|
|
9
10
|
};
|
|
@@ -15,6 +15,12 @@ type ChipChoiceSingleType = {
|
|
|
15
15
|
type ChipChoiceDateType = {
|
|
16
16
|
type: typeof CHIP_CHOICE_TYPE.Date;
|
|
17
17
|
} & ChipChoiceDateProps;
|
|
18
|
+
type ChipChoiceDateTimeType = {
|
|
19
|
+
type: typeof CHIP_CHOICE_TYPE.DateTime;
|
|
20
|
+
} & Omit<ChipChoiceDateProps, 'mode'> & {
|
|
21
|
+
mode: 'date-time';
|
|
22
|
+
showSeconds?: boolean;
|
|
23
|
+
};
|
|
18
24
|
type ChipChoiceDateRangeType = {
|
|
19
25
|
type: typeof CHIP_CHOICE_TYPE.DateRange;
|
|
20
26
|
} & ChipChoiceDateRangeProps;
|
|
@@ -23,7 +29,7 @@ type ChipChoiceCustomType = {
|
|
|
23
29
|
} & ChipChoiceCustomProps;
|
|
24
30
|
export type ChipChoiceProps = {
|
|
25
31
|
id: string;
|
|
26
|
-
} & (ChipChoiceMultipleType | ChipChoiceSingleType | ChipChoiceDateType | ChipChoiceDateRangeType | ChipChoiceCustomType);
|
|
32
|
+
} & (ChipChoiceMultipleType | ChipChoiceSingleType | ChipChoiceDateType | ChipChoiceDateTimeType | ChipChoiceDateRangeType | ChipChoiceCustomType);
|
|
27
33
|
export type OmitBetter<T, K extends keyof any> = T extends any ? Pick<T, Exclude<keyof T, K>> : never;
|
|
28
34
|
export type FilterValue = Parameters<ChipChoiceProps['onChange']>[number];
|
|
29
35
|
export {};
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"access": "public"
|
|
5
5
|
},
|
|
6
6
|
"title": "Chips",
|
|
7
|
-
"version": "0.
|
|
7
|
+
"version": "0.19.0",
|
|
8
8
|
"sideEffects": [
|
|
9
9
|
"*.css",
|
|
10
10
|
"*.woff",
|
|
@@ -36,12 +36,12 @@
|
|
|
36
36
|
"license": "Apache-2.0",
|
|
37
37
|
"scripts": {},
|
|
38
38
|
"dependencies": {
|
|
39
|
-
"@snack-uikit/button": "0.
|
|
40
|
-
"@snack-uikit/calendar": "0.
|
|
41
|
-
"@snack-uikit/dropdown": "0.
|
|
42
|
-
"@snack-uikit/icons": "0.
|
|
43
|
-
"@snack-uikit/list": "0.
|
|
44
|
-
"@snack-uikit/loaders": "0.
|
|
39
|
+
"@snack-uikit/button": "0.19.1",
|
|
40
|
+
"@snack-uikit/calendar": "0.11.0",
|
|
41
|
+
"@snack-uikit/dropdown": "0.4.0",
|
|
42
|
+
"@snack-uikit/icons": "0.24.0",
|
|
43
|
+
"@snack-uikit/list": "0.21.0",
|
|
44
|
+
"@snack-uikit/loaders": "0.7.1",
|
|
45
45
|
"@snack-uikit/utils": "3.5.0",
|
|
46
46
|
"classnames": "2.3.2",
|
|
47
47
|
"fuzzy-search": "3.2.1",
|
|
@@ -54,5 +54,5 @@
|
|
|
54
54
|
"peerDependencies": {
|
|
55
55
|
"@snack-uikit/locale": "*"
|
|
56
56
|
},
|
|
57
|
-
"gitHead": "
|
|
57
|
+
"gitHead": "b7163c6f939105eb34cabec64c9e983ac7958c26"
|
|
58
58
|
}
|
|
@@ -1,60 +1,59 @@
|
|
|
1
|
-
@
|
|
2
|
-
@
|
|
3
|
-
@import '../../styles.module';
|
|
1
|
+
@use '@snack-uikit/figma-tokens/build/scss/components/styles-tokens-chips-chipAssist';
|
|
2
|
+
@use '../../styles.module';
|
|
4
3
|
|
|
5
4
|
$sizes: 'xs', 's', 'm', 'l';
|
|
6
5
|
|
|
7
6
|
$typography: (
|
|
8
|
-
'xs':
|
|
9
|
-
's':
|
|
10
|
-
'm':
|
|
11
|
-
'l':
|
|
7
|
+
'xs': styles-tokens-chips-chipAssist.$sans-label-s,
|
|
8
|
+
's': styles-tokens-chips-chipAssist.$sans-label-m,
|
|
9
|
+
'm': styles-tokens-chips-chipAssist.$sans-label-l,
|
|
10
|
+
'l': styles-tokens-chips-chipAssist.$sans-label-l,
|
|
12
11
|
);
|
|
13
12
|
|
|
14
13
|
.assistChip {
|
|
15
|
-
@include chip-defaults;
|
|
16
|
-
@include chip-anatomy-styles(
|
|
14
|
+
@include styles.chip-defaults;
|
|
15
|
+
@include styles.chip-anatomy-styles(styles-tokens-chips-chipAssist.$chip-assist, $sizes, $typography);
|
|
17
16
|
|
|
18
|
-
color:
|
|
19
|
-
background-color:
|
|
20
|
-
border-color:
|
|
17
|
+
color: styles-tokens-chips-chipAssist.$sys-neutral-text-support;
|
|
18
|
+
background-color: styles-tokens-chips-chipAssist.$sys-neutral-background1-level;
|
|
19
|
+
border-color: styles-tokens-chips-chipAssist.$sys-neutral-decor-default;
|
|
21
20
|
|
|
22
21
|
.icon {
|
|
23
|
-
color:
|
|
22
|
+
color: styles-tokens-chips-chipAssist.$sys-neutral-text-light;
|
|
24
23
|
}
|
|
25
24
|
|
|
26
25
|
&:hover {
|
|
27
|
-
color:
|
|
28
|
-
background-color:
|
|
29
|
-
border-color:
|
|
26
|
+
color: styles-tokens-chips-chipAssist.$sys-neutral-text-main;
|
|
27
|
+
background-color: styles-tokens-chips-chipAssist.$sys-neutral-background2-level;
|
|
28
|
+
border-color: styles-tokens-chips-chipAssist.$sys-neutral-decor-hovered;
|
|
30
29
|
}
|
|
31
30
|
|
|
32
31
|
&:focus-visible {
|
|
33
|
-
@include chip-outline;
|
|
32
|
+
@include styles.chip-outline;
|
|
34
33
|
|
|
35
|
-
color:
|
|
36
|
-
background-color:
|
|
37
|
-
border-color:
|
|
34
|
+
color: styles-tokens-chips-chipAssist.$sys-neutral-text-main;
|
|
35
|
+
background-color: styles-tokens-chips-chipAssist.$sys-neutral-background2-level;
|
|
36
|
+
border-color: styles-tokens-chips-chipAssist.$sys-neutral-decor-hovered;
|
|
38
37
|
}
|
|
39
38
|
|
|
40
39
|
&:active {
|
|
41
|
-
color:
|
|
42
|
-
background-color:
|
|
43
|
-
border-color:
|
|
40
|
+
color: styles-tokens-chips-chipAssist.$sys-neutral-text-main;
|
|
41
|
+
background-color: styles-tokens-chips-chipAssist.$sys-neutral-background;
|
|
42
|
+
border-color: styles-tokens-chips-chipAssist.$sys-neutral-decor-activated;
|
|
44
43
|
}
|
|
45
44
|
|
|
46
45
|
&:disabled {
|
|
47
46
|
cursor: not-allowed;
|
|
48
|
-
color:
|
|
49
|
-
background-color:
|
|
50
|
-
border-color:
|
|
47
|
+
color: styles-tokens-chips-chipAssist.$sys-neutral-text-light;
|
|
48
|
+
background-color: styles-tokens-chips-chipAssist.$sys-neutral-background;
|
|
49
|
+
border-color: styles-tokens-chips-chipAssist.$sys-neutral-decor-hovered;
|
|
51
50
|
}
|
|
52
51
|
|
|
53
52
|
&[data-loading] {
|
|
54
|
-
@include chip-loading-state(
|
|
53
|
+
@include styles.chip-loading-state(styles-tokens-chips-chipAssist.$chip-assist, '&[data-variant="label-only"]', label);
|
|
55
54
|
|
|
56
|
-
color:
|
|
57
|
-
background-color:
|
|
58
|
-
border-color:
|
|
55
|
+
color: styles-tokens-chips-chipAssist.$sys-neutral-text-main;
|
|
56
|
+
background-color: styles-tokens-chips-chipAssist.$sys-neutral-background;
|
|
57
|
+
border-color: styles-tokens-chips-chipAssist.$sys-neutral-decor-activated;
|
|
59
58
|
}
|
|
60
59
|
}
|
|
@@ -1,22 +1,5 @@
|
|
|
1
|
-
@
|
|
2
|
-
@
|
|
3
|
-
@import '../../styles.module';
|
|
4
|
-
|
|
5
|
-
$sizes: 'xs', 's', 'm', 'l';
|
|
6
|
-
|
|
7
|
-
$labelTypography: (
|
|
8
|
-
'xs': $light-label-s,
|
|
9
|
-
's': $light-label-m,
|
|
10
|
-
'm': $light-label-m,
|
|
11
|
-
'l': $light-label-l,
|
|
12
|
-
);
|
|
13
|
-
|
|
14
|
-
$valueTypography: (
|
|
15
|
-
'xs': $sans-label-s,
|
|
16
|
-
's': $sans-label-m,
|
|
17
|
-
'm': $sans-label-l,
|
|
18
|
-
'l': $sans-label-l,
|
|
19
|
-
);
|
|
1
|
+
@use '@snack-uikit/figma-tokens/build/scss/components/styles-tokens-chips-chipChoice';
|
|
2
|
+
@use '../../styles.module';
|
|
20
3
|
|
|
21
4
|
.label,
|
|
22
5
|
.value {
|
|
@@ -25,25 +8,25 @@ $valueTypography: (
|
|
|
25
8
|
}
|
|
26
9
|
|
|
27
10
|
.choiceChip {
|
|
28
|
-
@include chip-defaults;
|
|
29
|
-
@include chip-anatomy-styles(
|
|
11
|
+
@include styles.chip-defaults;
|
|
12
|
+
@include styles.chip-anatomy-styles(styles-tokens-chips-chipChoice.$chip-choice, styles.$sizes, styles.$labelTypography);
|
|
30
13
|
|
|
31
|
-
background-color:
|
|
32
|
-
border-color:
|
|
14
|
+
background-color: styles-tokens-chips-chipChoice.$sys-neutral-background1-level;
|
|
15
|
+
border-color: styles-tokens-chips-chipChoice.$sys-neutral-decor-default;
|
|
33
16
|
|
|
34
17
|
.label,
|
|
35
18
|
.value {
|
|
36
|
-
color:
|
|
19
|
+
color: styles-tokens-chips-chipChoice.$sys-neutral-text-support;
|
|
37
20
|
}
|
|
38
21
|
|
|
39
22
|
.icon {
|
|
40
|
-
color:
|
|
23
|
+
color: styles-tokens-chips-chipChoice.$sys-neutral-text-light;
|
|
41
24
|
}
|
|
42
25
|
|
|
43
|
-
@each $size in
|
|
26
|
+
@each $size in styles.$sizes {
|
|
44
27
|
&[data-size='#{$size}'] {
|
|
45
28
|
.value {
|
|
46
|
-
@include composite-var(
|
|
29
|
+
@include styles-tokens-chips-chipChoice.composite-var(styles.$valueTypography, $size);
|
|
47
30
|
}
|
|
48
31
|
}
|
|
49
32
|
}
|
|
@@ -51,46 +34,46 @@ $valueTypography: (
|
|
|
51
34
|
&:hover,
|
|
52
35
|
&:active,
|
|
53
36
|
&:focus-visible {
|
|
54
|
-
background-color:
|
|
55
|
-
border-color:
|
|
37
|
+
background-color: styles-tokens-chips-chipChoice.$sys-neutral-background2-level;
|
|
38
|
+
border-color: styles-tokens-chips-chipChoice.$sys-neutral-decor-hovered;
|
|
56
39
|
|
|
57
40
|
.label {
|
|
58
|
-
color:
|
|
41
|
+
color: styles-tokens-chips-chipChoice.$sys-neutral-text-support;
|
|
59
42
|
}
|
|
60
43
|
|
|
61
44
|
.value {
|
|
62
|
-
color:
|
|
45
|
+
color: styles-tokens-chips-chipChoice.$sys-neutral-text-main;
|
|
63
46
|
}
|
|
64
47
|
}
|
|
65
48
|
|
|
66
49
|
&:focus-visible {
|
|
67
|
-
@include chip-outline;
|
|
50
|
+
@include styles.chip-outline;
|
|
68
51
|
}
|
|
69
52
|
|
|
70
53
|
&[data-disabled] {
|
|
71
54
|
cursor: not-allowed;
|
|
72
|
-
background-color:
|
|
73
|
-
border-color:
|
|
55
|
+
background-color: styles-tokens-chips-chipChoice.$sys-neutral-background;
|
|
56
|
+
border-color: styles-tokens-chips-chipChoice.$sys-neutral-decor-disabled;
|
|
74
57
|
|
|
75
58
|
.label,
|
|
76
59
|
.value {
|
|
77
|
-
color:
|
|
60
|
+
color: styles-tokens-chips-chipChoice.$sys-neutral-text-light;
|
|
78
61
|
}
|
|
79
62
|
}
|
|
80
63
|
|
|
81
64
|
&[data-loading] {
|
|
82
|
-
@include chip-loading-state(
|
|
65
|
+
@include styles.chip-loading-state(styles-tokens-chips-chipChoice.$chip-choice, '&:not([data-label])', value, null, true);
|
|
83
66
|
|
|
84
|
-
background-color:
|
|
85
|
-
border-color:
|
|
67
|
+
background-color: styles-tokens-chips-chipChoice.$sys-neutral-background;
|
|
68
|
+
border-color: styles-tokens-chips-chipChoice.$sys-neutral-decor-activated;
|
|
86
69
|
|
|
87
70
|
.label,
|
|
88
71
|
.value {
|
|
89
|
-
color:
|
|
72
|
+
color: styles-tokens-chips-chipChoice.$sys-neutral-text-support;
|
|
90
73
|
}
|
|
91
74
|
}
|
|
92
75
|
}
|
|
93
76
|
|
|
94
77
|
.triggerClassName {
|
|
95
|
-
--offset: #{
|
|
78
|
+
--offset: #{styles-tokens-chips-chipChoice.$space-drop-list-drop-offset};
|
|
96
79
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ReactNode, useCallback, useRef, useState } from 'react';
|
|
1
|
+
import { ReactNode, useCallback, useMemo, useRef, useState } from 'react';
|
|
2
2
|
|
|
3
3
|
import { Calendar, CalendarProps } from '@snack-uikit/calendar';
|
|
4
4
|
import { Dropdown } from '@snack-uikit/dropdown';
|
|
@@ -6,11 +6,16 @@ import { useLocale } from '@snack-uikit/locale';
|
|
|
6
6
|
import { useValueControl } from '@snack-uikit/utils';
|
|
7
7
|
|
|
8
8
|
import { CHIP_CHOICE_TEST_IDS, SIZE } from '../../../constants';
|
|
9
|
-
import { CALENDAR_SIZE_MAP } from '../constants';
|
|
9
|
+
import { CALENDAR_SIZE_MAP, DEFAULT_LOCALE } from '../constants';
|
|
10
10
|
import { useHandleOnKeyDown } from '../hooks';
|
|
11
11
|
import { ChipChoiceCommonProps } from '../types';
|
|
12
12
|
import { ChipChoiceBase } from './ChipChoiceBase';
|
|
13
13
|
|
|
14
|
+
type ChipChoiceDateWithSeconds = {
|
|
15
|
+
mode?: 'date-time';
|
|
16
|
+
showSeconds?: boolean;
|
|
17
|
+
};
|
|
18
|
+
|
|
14
19
|
export type ChipChoiceDateProps = ChipChoiceCommonProps & {
|
|
15
20
|
/** Значение компонента */
|
|
16
21
|
value?: Date;
|
|
@@ -21,7 +26,12 @@ export type ChipChoiceDateProps = ChipChoiceCommonProps & {
|
|
|
21
26
|
/** Колбек формирующий строковое представление выбранного значения. Принимает выбранное значение */
|
|
22
27
|
valueRender?(value?: Date): ReactNode;
|
|
23
28
|
mode?: Exclude<CalendarProps['mode'], 'range'>;
|
|
24
|
-
}
|
|
29
|
+
} & (
|
|
30
|
+
| ChipChoiceDateWithSeconds
|
|
31
|
+
| {
|
|
32
|
+
mode?: 'date' | 'month';
|
|
33
|
+
}
|
|
34
|
+
);
|
|
25
35
|
|
|
26
36
|
export function ChipChoiceDate({
|
|
27
37
|
size = SIZE.S,
|
|
@@ -31,10 +41,14 @@ export function ChipChoiceDate({
|
|
|
31
41
|
valueRender,
|
|
32
42
|
dropDownClassName,
|
|
33
43
|
mode = 'date',
|
|
44
|
+
placement,
|
|
45
|
+
widthStrategy,
|
|
34
46
|
...rest
|
|
35
47
|
}: ChipChoiceDateProps) {
|
|
36
48
|
const [selectedValue, setSelectedValue] = useValueControl<Date>({ value, defaultValue, onChange });
|
|
37
49
|
|
|
50
|
+
const showSeconds = mode === 'date-time' ? ((rest as ChipChoiceDateWithSeconds).showSeconds ?? true) : undefined;
|
|
51
|
+
|
|
38
52
|
const localRef = useRef<HTMLDivElement>(null);
|
|
39
53
|
|
|
40
54
|
const [open, setOpen] = useState<boolean>(false);
|
|
@@ -47,12 +61,46 @@ export function ChipChoiceDate({
|
|
|
47
61
|
|
|
48
62
|
const { t } = useLocale('Chips');
|
|
49
63
|
|
|
50
|
-
const valueToRender =
|
|
51
|
-
|
|
52
|
-
|
|
64
|
+
const valueToRender = useMemo(() => {
|
|
65
|
+
if (valueRender) {
|
|
66
|
+
return valueRender(selectedValue);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
if (!selectedValue) return t('allLabel');
|
|
70
|
+
|
|
71
|
+
const date = new Date(selectedValue);
|
|
72
|
+
|
|
73
|
+
if (mode === 'date-time') {
|
|
74
|
+
return date.toLocaleString(DEFAULT_LOCALE, {
|
|
75
|
+
year: 'numeric',
|
|
76
|
+
month: 'numeric',
|
|
77
|
+
day: 'numeric',
|
|
78
|
+
hour: '2-digit',
|
|
79
|
+
minute: '2-digit',
|
|
80
|
+
second: showSeconds ? '2-digit' : undefined,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
return date.toLocaleDateString(DEFAULT_LOCALE, {
|
|
85
|
+
year: 'numeric',
|
|
86
|
+
month: 'numeric',
|
|
87
|
+
day: mode === 'date' ? 'numeric' : undefined,
|
|
88
|
+
});
|
|
89
|
+
}, [mode, selectedValue, showSeconds, t, valueRender]);
|
|
53
90
|
|
|
54
91
|
const clearValue = () => setSelectedValue(undefined);
|
|
55
92
|
|
|
93
|
+
const handleChangeValue = useCallback(
|
|
94
|
+
(value: Date) => {
|
|
95
|
+
setSelectedValue(value);
|
|
96
|
+
closeDroplist();
|
|
97
|
+
},
|
|
98
|
+
[closeDroplist, setSelectedValue],
|
|
99
|
+
);
|
|
100
|
+
|
|
101
|
+
const navigationStartRef = useRef<HTMLButtonElement>(null);
|
|
102
|
+
const focusNavigationStartItem = () => setTimeout(() => navigationStartRef.current?.focus(), 0);
|
|
103
|
+
|
|
56
104
|
return (
|
|
57
105
|
<Dropdown
|
|
58
106
|
content={
|
|
@@ -60,14 +108,16 @@ export function ChipChoiceDate({
|
|
|
60
108
|
mode={mode}
|
|
61
109
|
size={CALENDAR_SIZE_MAP[size]}
|
|
62
110
|
value={selectedValue}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
}}
|
|
67
|
-
navigationStartRef={element => element?.focus()}
|
|
111
|
+
fitToContainer={false}
|
|
112
|
+
onChangeValue={handleChangeValue}
|
|
113
|
+
navigationStartRef={navigationStartRef}
|
|
68
114
|
onFocusLeave={closeDroplist}
|
|
115
|
+
showSeconds={showSeconds}
|
|
116
|
+
locale={DEFAULT_LOCALE}
|
|
69
117
|
/>
|
|
70
118
|
}
|
|
119
|
+
placement={placement}
|
|
120
|
+
widthStrategy={widthStrategy}
|
|
71
121
|
outsideClick
|
|
72
122
|
triggerRef={localRef}
|
|
73
123
|
open={open}
|
|
@@ -82,7 +132,7 @@ export function ChipChoiceDate({
|
|
|
82
132
|
value={selectedValue}
|
|
83
133
|
valueToRender={valueToRender}
|
|
84
134
|
size={size}
|
|
85
|
-
onKeyDown={handleOnKeyDown()}
|
|
135
|
+
onKeyDown={handleOnKeyDown(focusNavigationStartItem)}
|
|
86
136
|
/>
|
|
87
137
|
</Dropdown>
|
|
88
138
|
);
|
|
@@ -6,7 +6,7 @@ import { Dropdown } from '@snack-uikit/dropdown';
|
|
|
6
6
|
import { useLocale } from '@snack-uikit/locale';
|
|
7
7
|
|
|
8
8
|
import { CHIP_CHOICE_TEST_IDS, DEFAULT_EMPTY_VALUE, SIZE } from '../../../constants';
|
|
9
|
-
import { CALENDAR_SIZE_MAP } from '../constants';
|
|
9
|
+
import { CALENDAR_SIZE_MAP, DEFAULT_LOCALE } from '../constants';
|
|
10
10
|
import { useHandleOnKeyDown } from '../hooks';
|
|
11
11
|
import { ChipChoiceCommonProps } from '../types';
|
|
12
12
|
import { ChipChoiceBase } from './ChipChoiceBase';
|
|
@@ -34,7 +34,7 @@ function defaultRangeFormatter({ value, allLabel }: DefaultRangeFormatterProps)
|
|
|
34
34
|
|
|
35
35
|
const [from, to] = value;
|
|
36
36
|
|
|
37
|
-
return `${from.toLocaleDateString()} ${DEFAULT_EMPTY_VALUE} ${to.toLocaleDateString()}`;
|
|
37
|
+
return `${from.toLocaleDateString(DEFAULT_LOCALE)} ${DEFAULT_EMPTY_VALUE} ${to.toLocaleDateString(DEFAULT_LOCALE)}`;
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
export function ChipChoiceDateRange({
|
|
@@ -78,6 +78,7 @@ export function ChipChoiceDateRange({
|
|
|
78
78
|
setSelectedValue(value);
|
|
79
79
|
closeDroplist();
|
|
80
80
|
}}
|
|
81
|
+
locale={DEFAULT_LOCALE}
|
|
81
82
|
// bug with focus
|
|
82
83
|
// navigationStartRef={element => element?.focus()}
|
|
83
84
|
onFocusLeave={closeDroplist}
|