@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.
Files changed (48) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/README.md +22 -1
  3. package/dist/cjs/components/ChipChoice/components/ChipChoiceBase/styles.module.css +6 -6
  4. package/dist/cjs/components/ChipChoice/components/ChipChoiceDate.d.ts +9 -2
  5. package/dist/cjs/components/ChipChoice/components/ChipChoiceDate.js +46 -10
  6. package/dist/cjs/components/ChipChoice/components/ChipChoiceDateRange.js +2 -1
  7. package/dist/cjs/components/ChipChoice/components/ChipChoiceTime.d.ts +12 -0
  8. package/dist/cjs/components/ChipChoice/components/ChipChoiceTime.js +123 -0
  9. package/dist/cjs/components/ChipChoice/components/index.d.ts +1 -0
  10. package/dist/cjs/components/ChipChoice/components/index.js +2 -1
  11. package/dist/cjs/components/ChipChoice/constants.d.ts +4 -1
  12. package/dist/cjs/components/ChipChoice/constants.js +10 -2
  13. package/dist/cjs/components/ChipChoice/index.d.ts +3 -2
  14. package/dist/cjs/components/ChipChoice/index.js +1 -0
  15. package/dist/cjs/components/ChipChoiceRow/components/constants.d.ts +1 -0
  16. package/dist/cjs/components/ChipChoiceRow/components/constants.js +1 -0
  17. package/dist/cjs/components/ChipChoiceRow/types.d.ts +7 -1
  18. package/dist/esm/components/ChipChoice/components/ChipChoiceBase/styles.module.css +6 -6
  19. package/dist/esm/components/ChipChoice/components/ChipChoiceDate.d.ts +9 -2
  20. package/dist/esm/components/ChipChoice/components/ChipChoiceDate.js +35 -10
  21. package/dist/esm/components/ChipChoice/components/ChipChoiceDateRange.js +3 -3
  22. package/dist/esm/components/ChipChoice/components/ChipChoiceTime.d.ts +12 -0
  23. package/dist/esm/components/ChipChoice/components/ChipChoiceTime.js +64 -0
  24. package/dist/esm/components/ChipChoice/components/index.d.ts +1 -0
  25. package/dist/esm/components/ChipChoice/components/index.js +1 -0
  26. package/dist/esm/components/ChipChoice/constants.d.ts +4 -1
  27. package/dist/esm/components/ChipChoice/constants.js +8 -0
  28. package/dist/esm/components/ChipChoice/index.d.ts +3 -2
  29. package/dist/esm/components/ChipChoice/index.js +2 -1
  30. package/dist/esm/components/ChipChoiceRow/components/constants.d.ts +1 -0
  31. package/dist/esm/components/ChipChoiceRow/components/constants.js +1 -0
  32. package/dist/esm/components/ChipChoiceRow/types.d.ts +7 -1
  33. package/package.json +8 -8
  34. package/src/components/ChipAssist/styles.module.scss +29 -30
  35. package/src/components/ChipChoice/components/ChipChoiceBase/styles.module.scss +23 -40
  36. package/src/components/ChipChoice/components/ChipChoiceDate.tsx +62 -12
  37. package/src/components/ChipChoice/components/ChipChoiceDateRange.tsx +3 -2
  38. package/src/components/ChipChoice/components/ChipChoiceTime.tsx +125 -0
  39. package/src/components/ChipChoice/components/index.ts +1 -0
  40. package/src/components/ChipChoice/constants.ts +11 -1
  41. package/src/components/ChipChoice/index.ts +10 -1
  42. package/src/components/ChipChoice/styles.module.scss +32 -31
  43. package/src/components/ChipChoiceRow/components/constants.ts +1 -0
  44. package/src/components/ChipChoiceRow/styles.module.scss +2 -2
  45. package/src/components/ChipChoiceRow/types.ts +5 -0
  46. package/src/components/ChipToggle/styles.module.scss +45 -46
  47. package/src/helperComponents/ButtonClearValue/styles.module.scss +14 -14
  48. 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
+ }
@@ -3,3 +3,4 @@ export * from './ChipChoiceSingle';
3
3
  export * from './ChipChoiceMultiple';
4
4
  export * from './ChipChoiceDate';
5
5
  export * from './ChipChoiceDateRange';
6
+ export * from './ChipChoiceTime';
@@ -3,3 +3,4 @@ export * from './ChipChoiceSingle';
3
3
  export * from './ChipChoiceMultiple';
4
4
  export * from './ChipChoiceDate';
5
5
  export * from './ChipChoiceDateRange';
6
+ export * from './ChipChoiceTime';
@@ -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.17.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.18.0",
40
- "@snack-uikit/calendar": "0.9.0",
41
- "@snack-uikit/dropdown": "0.3.0",
42
- "@snack-uikit/icons": "0.23.0",
43
- "@snack-uikit/list": "0.19.0",
44
- "@snack-uikit/loaders": "0.6.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": "62cc21d8606a61a78f80e3a7455b20d6f38474fa"
57
+ "gitHead": "b7163c6f939105eb34cabec64c9e983ac7958c26"
58
58
  }
@@ -1,60 +1,59 @@
1
- @import '@snack-uikit/figma-tokens/build/scss/components/styles-tokens-chips-chipAssist';
2
- @import '@snack-uikit/figma-tokens/build/scss/components/styles-tokens-element';
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': $sans-label-s,
9
- 's': $sans-label-m,
10
- 'm': $sans-label-l,
11
- 'l': $sans-label-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($chip-assist, $sizes, $typography);
14
+ @include styles.chip-defaults;
15
+ @include styles.chip-anatomy-styles(styles-tokens-chips-chipAssist.$chip-assist, $sizes, $typography);
17
16
 
18
- color: $sys-neutral-text-support;
19
- background-color: $sys-neutral-background1-level;
20
- border-color: $sys-neutral-decor-default;
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: $sys-neutral-text-light;
22
+ color: styles-tokens-chips-chipAssist.$sys-neutral-text-light;
24
23
  }
25
24
 
26
25
  &:hover {
27
- color: $sys-neutral-text-main;
28
- background-color: $sys-neutral-background2-level;
29
- border-color: $sys-neutral-decor-hovered;
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: $sys-neutral-text-main;
36
- background-color: $sys-neutral-background2-level;
37
- border-color: $sys-neutral-decor-hovered;
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: $sys-neutral-text-main;
42
- background-color: $sys-neutral-background;
43
- border-color: $sys-neutral-decor-activated;
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: $sys-neutral-text-light;
49
- background-color: $sys-neutral-background;
50
- border-color: $sys-neutral-decor-hovered;
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($chip-assist, '&[data-variant="label-only"]', label);
53
+ @include styles.chip-loading-state(styles-tokens-chips-chipAssist.$chip-assist, '&[data-variant="label-only"]', label);
55
54
 
56
- color: $sys-neutral-text-main;
57
- background-color: $sys-neutral-background;
58
- border-color: $sys-neutral-decor-activated;
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
- @import '@snack-uikit/figma-tokens/build/scss/components/styles-tokens-chips-chipChoice';
2
- @import '@snack-uikit/figma-tokens/build/scss/components/styles-tokens-element';
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($chip-choice, $sizes, $labelTypography);
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: $sys-neutral-background1-level;
32
- border-color: $sys-neutral-decor-default;
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: $sys-neutral-text-support;
19
+ color: styles-tokens-chips-chipChoice.$sys-neutral-text-support;
37
20
  }
38
21
 
39
22
  .icon {
40
- color: $sys-neutral-text-light;
23
+ color: styles-tokens-chips-chipChoice.$sys-neutral-text-light;
41
24
  }
42
25
 
43
- @each $size in $sizes {
26
+ @each $size in styles.$sizes {
44
27
  &[data-size='#{$size}'] {
45
28
  .value {
46
- @include composite-var($valueTypography, $size);
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: $sys-neutral-background2-level;
55
- border-color: $sys-neutral-decor-hovered;
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: $sys-neutral-text-support;
41
+ color: styles-tokens-chips-chipChoice.$sys-neutral-text-support;
59
42
  }
60
43
 
61
44
  .value {
62
- color: $sys-neutral-text-main;
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: $sys-neutral-background;
73
- border-color: $sys-neutral-decor-disabled;
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: $sys-neutral-text-light;
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($chip-choice, '&:not([data-label])', value, null, true);
65
+ @include styles.chip-loading-state(styles-tokens-chips-chipChoice.$chip-choice, '&:not([data-label])', value, null, true);
83
66
 
84
- background-color: $sys-neutral-background;
85
- border-color: $sys-neutral-decor-activated;
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: $sys-neutral-text-support;
72
+ color: styles-tokens-chips-chipChoice.$sys-neutral-text-support;
90
73
  }
91
74
  }
92
75
  }
93
76
 
94
77
  .triggerClassName {
95
- --offset: #{$space-drop-list-drop-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 = valueRender
51
- ? valueRender(selectedValue)
52
- : (selectedValue && new Date(selectedValue).toLocaleDateString()) || t('allLabel');
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
- onChangeValue={(value: Date) => {
64
- setSelectedValue(value);
65
- closeDroplist();
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}