@snack-uikit/chips 0.12.9 → 0.13.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 (73) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/README.md +22 -104
  3. package/dist/components/ChipAssist/styles.module.css +1 -1
  4. package/dist/components/ChipChoice/components/ChipChoiceBase/ChipChoiceBase.d.ts +20 -0
  5. package/dist/components/ChipChoice/components/ChipChoiceBase/ChipChoiceBase.js +65 -0
  6. package/dist/components/ChipChoice/components/ChipChoiceBase/index.d.ts +1 -0
  7. package/dist/components/ChipChoice/components/ChipChoiceBase/index.js +1 -0
  8. package/dist/components/ChipChoice/components/{ChipChoiceCustom → ChipChoiceBase}/styles.module.css +18 -10
  9. package/dist/components/ChipChoice/components/ChipChoiceCustom.d.ts +25 -0
  10. package/dist/components/ChipChoice/components/ChipChoiceCustom.js +38 -0
  11. package/dist/components/ChipChoice/components/ChipChoiceDate.d.ts +3 -2
  12. package/dist/components/ChipChoice/components/ChipChoiceDate.js +19 -9
  13. package/dist/components/ChipChoice/components/ChipChoiceDateRange.d.ts +3 -2
  14. package/dist/components/ChipChoice/components/ChipChoiceDateRange.js +18 -8
  15. package/dist/components/ChipChoice/components/ChipChoiceMultiple.d.ts +8 -0
  16. package/dist/components/ChipChoice/components/ChipChoiceMultiple.js +87 -0
  17. package/dist/components/ChipChoice/components/ChipChoiceSingle.d.ts +7 -13
  18. package/dist/components/ChipChoice/components/ChipChoiceSingle.js +64 -22
  19. package/dist/components/ChipChoice/components/index.d.ts +1 -1
  20. package/dist/components/ChipChoice/components/index.js +1 -1
  21. package/dist/components/ChipChoice/constants.d.ts +3 -2
  22. package/dist/components/ChipChoice/constants.js +2 -1
  23. package/dist/components/ChipChoice/hooks.d.ts +11 -0
  24. package/dist/components/ChipChoice/hooks.js +35 -0
  25. package/dist/components/ChipChoice/index.d.ts +5 -4
  26. package/dist/components/ChipChoice/index.js +3 -2
  27. package/dist/components/ChipChoice/styles.module.css +9 -5
  28. package/dist/components/ChipChoice/types.d.ts +55 -7
  29. package/dist/components/ChipChoice/utils/index.d.ts +2 -0
  30. package/dist/components/ChipChoice/utils/index.js +2 -0
  31. package/dist/components/ChipChoice/utils/options.d.ts +9 -0
  32. package/dist/components/ChipChoice/utils/options.js +32 -0
  33. package/dist/components/ChipChoice/utils/typeGuards.d.ts +6 -0
  34. package/dist/components/ChipChoice/utils/typeGuards.js +15 -0
  35. package/dist/components/ChipChoice/utils/utils.d.ts +18 -0
  36. package/dist/components/ChipChoice/utils/utils.js +29 -0
  37. package/dist/components/ChipChoiceRow/components/constants.d.ts +2 -1
  38. package/dist/components/ChipChoiceRow/components/constants.js +2 -1
  39. package/dist/components/ChipChoiceRow/types.d.ts +11 -5
  40. package/dist/components/ChipToggle/styles.module.css +1 -1
  41. package/package.json +13 -7
  42. package/src/components/ChipChoice/components/ChipChoiceBase/ChipChoiceBase.tsx +149 -0
  43. package/src/components/ChipChoice/components/ChipChoiceBase/index.ts +1 -0
  44. package/src/components/ChipChoice/components/{ChipChoiceCustom → ChipChoiceBase}/styles.module.scss +11 -5
  45. package/src/components/ChipChoice/components/ChipChoiceCustom.tsx +89 -0
  46. package/src/components/ChipChoice/components/ChipChoiceDate.tsx +42 -18
  47. package/src/components/ChipChoice/components/ChipChoiceDateRange.tsx +43 -18
  48. package/src/components/ChipChoice/components/ChipChoiceMultiple.tsx +157 -0
  49. package/src/components/ChipChoice/components/ChipChoiceSingle.tsx +123 -62
  50. package/src/components/ChipChoice/components/index.ts +1 -1
  51. package/src/components/ChipChoice/constants.ts +3 -2
  52. package/src/components/ChipChoice/hooks.ts +61 -0
  53. package/src/components/ChipChoice/index.ts +7 -13
  54. package/src/components/ChipChoice/styles.module.scss +11 -5
  55. package/src/components/ChipChoice/types.ts +105 -7
  56. package/src/components/ChipChoice/utils/index.ts +3 -0
  57. package/src/components/ChipChoice/utils/options.tsx +58 -0
  58. package/src/components/ChipChoice/utils/typeGuards.ts +35 -0
  59. package/src/components/ChipChoice/utils/utils.ts +60 -0
  60. package/src/components/ChipChoiceRow/components/constants.ts +2 -1
  61. package/src/components/ChipChoiceRow/types.ts +18 -10
  62. package/dist/components/ChipChoice/components/ChipChoiceCustom/ChipChoiceCustom.d.ts +0 -23
  63. package/dist/components/ChipChoice/components/ChipChoiceCustom/ChipChoiceCustom.js +0 -75
  64. package/dist/components/ChipChoice/components/ChipChoiceCustom/index.d.ts +0 -1
  65. package/dist/components/ChipChoice/components/ChipChoiceCustom/index.js +0 -1
  66. package/dist/components/ChipChoice/components/ChipChoiceMulti.d.ts +0 -14
  67. package/dist/components/ChipChoice/components/ChipChoiceMulti.js +0 -44
  68. package/dist/components/ChipChoice/utils.d.ts +0 -14
  69. package/dist/components/ChipChoice/utils.js +0 -26
  70. package/src/components/ChipChoice/components/ChipChoiceCustom/ChipChoiceCustom.tsx +0 -188
  71. package/src/components/ChipChoice/components/ChipChoiceCustom/index.ts +0 -1
  72. package/src/components/ChipChoice/components/ChipChoiceMulti.tsx +0 -90
  73. package/src/components/ChipChoice/utils.ts +0 -48
package/CHANGELOG.md CHANGED
@@ -3,6 +3,24 @@
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.13.0 (2024-04-23)
7
+
8
+
9
+ ### Bug Fixes
10
+
11
+ * **FF-01:** fix pseudo background ([ee468df](https://github.com/cloud-ru-tech/snack-uikit/commit/ee468df9494a81c7948fb20a647a87bdd0b1e980))
12
+ * **PDS-59:** multi-value formatter ([f606ef2](https://github.com/cloud-ru-tech/snack-uikit/commit/f606ef2d3866dfc0f2630302732825cb9e5fb83c))
13
+ * **PDS-59:** upd tests ([df72712](https://github.com/cloud-ru-tech/snack-uikit/commit/df7271268ac1621316dbb98b274e3d6602515b23))
14
+
15
+
16
+ ### BREAKING CHANGES
17
+
18
+
19
+ * **PDS-59:** change droplist -> list package ([f63f48a](https://github.com/cloud-ru-tech/snack-uikit/commit/f63f48a394470243a7410933d5e97aaa50317154))
20
+
21
+
22
+
23
+
6
24
  ## 0.12.9 (2024-04-22)
7
25
 
8
26
  ### Only dependencies have been changed
package/README.md CHANGED
@@ -1,6 +1,7 @@
1
1
  # Chips
2
2
 
3
3
  ## Installation
4
+
4
5
  `npm i @snack-uikit/chips`
5
6
 
6
7
  [Changelog](./CHANGELOG.md)
@@ -89,138 +90,55 @@ import { PlaceholderSVG } from '@snack-uikit/icons';
89
90
  ### Props
90
91
  | name | type | default value | description |
91
92
  |------|------|---------------|-------------|
92
- | onClick* | `MouseEventHandler<HTMLButtonElement>` | - | Колбек обработки клика |
93
- | label* | `string` | - | Лейбл |
94
- | disabled | `boolean` | - | Деактивирован ли компонент |
95
- | loading | `boolean` | - | Состояние загрузки |
96
- | icon | `ReactElement<any, string \| JSXElementConstructor<any>>` | - | Иконка |
97
- | className | `string` | - | CSS-класс |
98
- | tabIndex | `number` | - | HTML tab index |
99
- | size | enum Size: `"xs"`, `"s"`, `"m"`, `"l"` | s | Размер |
100
93
  ## ChipToggle
101
94
  Чип с состоянием выбран/не выбран
102
95
  ### Props
103
96
  | name | type | default value | description |
104
97
  |------|------|---------------|-------------|
105
- | onChange* | `(checked: boolean, e: ChangeEvent<HTMLInputElement>) => void` | - | Колбек смены значения |
106
- | checked* | `boolean` | - | Отмечен ли компонент |
107
- | label* | `string` | - | Лейбл |
108
- | disabled | `boolean` | - | Деактивирован ли компонент |
109
- | loading | `boolean` | - | Состояние загрузки |
110
- | icon | `ReactElement<any, string \| JSXElementConstructor<any>>` | - | Иконка |
111
- | className | `string` | - | CSS-класс |
112
- | tabIndex | `number` | - | HTML tab index |
113
- | size | enum Size: `"xs"`, `"s"`, `"m"`, `"l"` | s | Размер |
114
98
  ## ChipChoice.Custom
115
99
  ### Props
116
100
  | name | type | default value | description |
117
101
  |------|------|---------------|-------------|
118
- | label | `string` | - | Лейбл |
119
- | disabled | `boolean` | - | Деактивирован ли компонент |
120
- | loading | `boolean` | - | Состояние загрузки |
121
- | icon | `ReactElement<any, string \| JSXElementConstructor<any>>` | - | Иконка |
122
- | className | `string` | - | CSS-класс |
123
- | tabIndex | `number` | - | HTML tab index |
124
- | size | enum Size: `"xs"`, `"s"`, `"m"`, `"l"` | - | Размер |
125
- | onClick | `MouseEventHandler<HTMLButtonElement \| HTMLDivElement>` | - | Колбек обработки клика |
126
- | showClearButton | `boolean` | true | Отображение кнопки очистки значения |
127
- | placement | enum Placement: `"left"`, `"left-start"`, `"left-end"`, `"right"`, `"right-start"`, `"right-end"`, `"top"`, `"top-start"`, `"top-end"`, `"bottom"`, `"bottom-start"`, `"bottom-end"` | - | Расположение выпадающего меню |
128
- | widthStrategy | enum PopoverWidthStrategy: `"auto"`, `"gte"`, `"eq"` | gte | Стратегия управления шириной контейнера поповера <br> - `auto` - соответствует ширине контента, <br> - `gte` - Great Than or Equal, равен ширине таргета или больше ее, если контент в поповере шире, <br> - `eq` - Equal, строго равен ширине таргета. |
129
- | valueToRender | `ReactNode` | - | Отображаемое значение |
130
- | value | `string \| Date \| string[] \| [Date, Date]` | - | Фактическое значение. Используется для отображения кнопки очистки, если свойство <strong>showClearButton=true</strong> |
131
- | onClearButtonClick | `MouseEventHandler<HTMLButtonElement>` | - | Колбек для клика по кнопке очистки |
132
- | children | `ReactNode \| ((props: { handleDroplistItemKeyDown: (e: KeyboardEvent<Element>, cb?: KeyboardEventHandler) => void; closeDroplist(): void; }) => ReactNode)` | - | Контент выпадающего меню <br> <br> Принимает <strong>ReactNode</strong> <br> Или функцию с аргументами: <br> <strong>handleDroplistItemKeyDown</strong>: Обработчик нажатия клавиши на элемент выпадающего меню <br> <strong>closeDroplist</strong>: Метод для закрытия выпадающего меню |
133
102
  ## ChipChoice.Single
134
103
  ### Props
135
104
  | name | type | default value | description |
136
105
  |------|------|---------------|-------------|
137
- | options* | `FilterOption[]` | - | Массив опций |
138
- | label | `string` | - | Лейбл |
139
- | disabled | `boolean` | - | Деактивирован ли компонент |
140
- | loading | `boolean` | - | Состояние загрузки |
141
- | icon | `ReactElement<any, string \| JSXElementConstructor<any>>` | - | Иконка |
142
- | className | `string` | - | CSS-класс |
143
- | tabIndex | `number` | - | HTML tab index |
144
- | size | enum Size: `"xs"`, `"s"`, `"m"`, `"l"` | - | Размер |
145
- | onClick | `MouseEventHandler<HTMLButtonElement \| HTMLDivElement>` | - | Колбек обработки клика |
146
- | showClearButton | `boolean` | true | Отображение кнопки очистки значения |
147
- | placement | enum Placement: `"left"`, `"left-start"`, `"left-end"`, `"right"`, `"right-start"`, `"right-end"`, `"top"`, `"top-start"`, `"top-end"`, `"bottom"`, `"bottom-start"`, `"bottom-end"` | - | Расположение выпадающего меню |
148
- | widthStrategy | enum PopoverWidthStrategy: `"auto"`, `"gte"`, `"eq"` | gte | Стратегия управления шириной контейнера поповера <br> - `auto` - соответствует ширине контента, <br> - `gte` - Great Than or Equal, равен ширине таргета или больше ее, если контент в поповере шире, <br> - `eq` - Equal, строго равен ширине таргета. |
149
- | value | `string` | - | Значение компонента |
150
- | defaultValue | `string` | - | Значение компонента по умолчанию |
151
- | onChange | `(value: string) => void` | - | Колбек смены значения |
152
- | valueFormatter | `(option?: FilterOption) => string` | - | Колбек формирующий строковое представление выбранного значения. Принимает выбранное значение. По умолчанию для отображения используется FilterOption.label |
153
- ## ChipChoice.Multi
106
+ ## ChipChoice.Multiple
154
107
  ### Props
155
108
  | name | type | default value | description |
156
109
  |------|------|---------------|-------------|
157
- | options* | `FilterOption[]` | - | Массив опций |
158
- | label | `string` | - | Лейбл |
159
- | disabled | `boolean` | - | Деактивирован ли компонент |
160
- | loading | `boolean` | - | Состояние загрузки |
161
- | icon | `ReactElement<any, string \| JSXElementConstructor<any>>` | - | Иконка |
162
- | className | `string` | - | CSS-класс |
163
- | tabIndex | `number` | - | HTML tab index |
164
- | size | enum Size: `"xs"`, `"s"`, `"m"`, `"l"` | - | Размер |
165
- | onClick | `MouseEventHandler<HTMLButtonElement \| HTMLDivElement>` | - | Колбек обработки клика |
166
- | showClearButton | `boolean` | true | Отображение кнопки очистки значения |
167
- | placement | enum Placement: `"left"`, `"left-start"`, `"left-end"`, `"right"`, `"right-start"`, `"right-end"`, `"top"`, `"top-start"`, `"top-end"`, `"bottom"`, `"bottom-start"`, `"bottom-end"` | - | Расположение выпадающего меню |
168
- | widthStrategy | enum PopoverWidthStrategy: `"auto"`, `"gte"`, `"eq"` | gte | Стратегия управления шириной контейнера поповера <br> - `auto` - соответствует ширине контента, <br> - `gte` - Great Than or Equal, равен ширине таргета или больше ее, если контент в поповере шире, <br> - `eq` - Equal, строго равен ширине таргета. |
169
- | value | `string[]` | - | Значение компонента |
170
- | defaultValue | `string[]` | - | Значение компонента по умолчанию |
171
- | onChange | `(value: string[]) => void` | - | Колбек смены значения |
172
- | valueFormatter | `(options: FilterOption[]) => string` | - | Колбек формирующий строковое представление выбранного значения. Принимает массив выбранных значений. По умолчанию для отображения используется кол-во выбранных значений. |
173
110
  ## ChipChoice.Date
174
111
  ### Props
175
112
  | name | type | default value | description |
176
113
  |------|------|---------------|-------------|
177
- | label | `string` | - | Лейбл |
178
- | disabled | `boolean` | - | Деактивирован ли компонент |
179
- | loading | `boolean` | - | Состояние загрузки |
180
- | icon | `ReactElement<any, string \| JSXElementConstructor<any>>` | - | Иконка |
181
- | className | `string` | - | CSS-класс |
182
- | tabIndex | `number` | - | HTML tab index |
183
- | size | enum Size: `"xs"`, `"s"`, `"m"`, `"l"` | - | Размер |
184
- | onClick | `MouseEventHandler<HTMLButtonElement \| HTMLDivElement>` | - | Колбек обработки клика |
185
- | showClearButton | `boolean` | true | Отображение кнопки очистки значения |
186
- | placement | enum Placement: `"left"`, `"left-start"`, `"left-end"`, `"right"`, `"right-start"`, `"right-end"`, `"top"`, `"top-start"`, `"top-end"`, `"bottom"`, `"bottom-start"`, `"bottom-end"` | - | Расположение выпадающего меню |
187
- | widthStrategy | enum PopoverWidthStrategy: `"auto"`, `"gte"`, `"eq"` | gte | Стратегия управления шириной контейнера поповера <br> - `auto` - соответствует ширине контента, <br> - `gte` - Great Than or Equal, равен ширине таргета или больше ее, если контент в поповере шире, <br> - `eq` - Equal, строго равен ширине таргета. |
188
- | value | `Date` | - | Значение компонента |
189
- | defaultValue | `Date` | - | Значение компонента по-умолчанию |
190
- | onChange | `(value: Date) => void` | - | Колбек смены значения |
191
- | valueFormatter | `(value?: Date) => string` | - | Колбек формирующий строковое представление выбранного значения. Принимает выбранное значение |
192
114
  ## ChipChoice.DateRange
193
115
  ### Props
194
116
  | name | type | default value | description |
195
117
  |------|------|---------------|-------------|
196
- | label | `string` | - | Лейбл |
197
- | disabled | `boolean` | - | Деактивирован ли компонент |
198
- | loading | `boolean` | - | Состояние загрузки |
199
- | icon | `ReactElement<any, string \| JSXElementConstructor<any>>` | - | Иконка |
200
- | className | `string` | - | CSS-класс |
201
- | tabIndex | `number` | - | HTML tab index |
202
- | size | enum Size: `"xs"`, `"s"`, `"m"`, `"l"` | - | Размер |
203
- | onClick | `MouseEventHandler<HTMLButtonElement \| HTMLDivElement>` | - | Колбек обработки клика |
204
- | showClearButton | `boolean` | true | Отображение кнопки очистки значения |
205
- | placement | enum Placement: `"left"`, `"left-start"`, `"left-end"`, `"right"`, `"right-start"`, `"right-end"`, `"top"`, `"top-start"`, `"top-end"`, `"bottom"`, `"bottom-start"`, `"bottom-end"` | - | Расположение выпадающего меню |
206
- | widthStrategy | enum PopoverWidthStrategy: `"auto"`, `"gte"`, `"eq"` | gte | Стратегия управления шириной контейнера поповера <br> - `auto` - соответствует ширине контента, <br> - `gte` - Great Than or Equal, равен ширине таргета или больше ее, если контент в поповере шире, <br> - `eq` - Equal, строго равен ширине таргета. |
207
- | value | `Range` | - | Значение компонента |
208
- | defaultValue | `Range` | - | Значение компонента по умолчанию |
209
- | onChange | `(value: Range) => void` | - | Колбек смены значения |
210
- | valueFormatter | `(value?: Range) => string` | - | Колбек формирующий строковое представление выбранного значения. Принимает массив выбранных значений |
118
+ ## isAccordionOption
119
+ ### Props
120
+ | name | type | default value | description |
121
+ |------|------|---------------|-------------|
122
+ ## isBaseOption
123
+ ### Props
124
+ | name | type | default value | description |
125
+ |------|------|---------------|-------------|
126
+ ## isGroupOption
127
+ ### Props
128
+ | name | type | default value | description |
129
+ |------|------|---------------|-------------|
130
+ ## isGroupSelectOption
131
+ ### Props
132
+ | name | type | default value | description |
133
+ |------|------|---------------|-------------|
134
+ ## isNextListOption
135
+ ### Props
136
+ | name | type | default value | description |
137
+ |------|------|---------------|-------------|
211
138
  ## ChipChoiceRow
212
139
  ### Props
213
140
  | name | type | default value | description |
214
141
  |------|------|---------------|-------------|
215
- | filters* | `OmitBetter<ChipChoiceProps, "size" \| "onChange" \| "value" \| "defaultValue">[]` | - | Массив чипов |
216
- | value | `FiltersState` | - | Состояние фильтров |
217
- | defaultValue | `Partial<TState>` | - | Начальное состояние фильтров |
218
- | onChange | `(filters: TState) => void` | - | Колбек изменения состояния фильтров |
219
- | size | enum ChipChoiceRowSize: `"xs"`, `"s"`, `"m"` | s | Размер |
220
- | className | `string` | - | CSS-класс |
221
- | showClearAllButton | `boolean` | true | Скрыть/показать кнопку очиски |
222
- | clearAllButtonLabel | `string` | 'Clear all' | Текст кнопки очистки |
223
142
 
224
143
 
225
144
  [//]: DOCUMENTATION_SECTION_END
226
-
@@ -16,7 +16,7 @@
16
16
  outline:0;
17
17
  outline-offset:0;
18
18
  color:var(--sys-neutral-text-support, #656771);
19
- background-color:var(--sys-neutral-background1-level, #fafafc);
19
+ background-color:var(--sys-neutral-background1-level, #fdfdff);
20
20
  border-color:var(--sys-neutral-decor-default, #dfe2ec);
21
21
  }
22
22
  .assistChip .spinner{
@@ -0,0 +1,20 @@
1
+ import { KeyboardEvent, MouseEventHandler, ReactNode } from 'react';
2
+ import { ChipChoiceCommonProps } from '../../types';
3
+ export type ChipChoiceBaseProps = Pick<ChipChoiceCommonProps, 'loading' | 'tabIndex' | 'showClearButton' | 'disabled' | 'icon' | 'label' | 'size' | 'onClick' | 'className'> & {
4
+ /** Отображаемое значение */
5
+ valueToRender?: ReactNode;
6
+ /** Фактическое значение. Используется для отображения кнопки очистки, если свойство <strong>showClearButton=true</strong> */
7
+ value?: any;
8
+ /** Колбек для клика по кнопке очистки */
9
+ onClearButtonClick?: MouseEventHandler<HTMLButtonElement>;
10
+ onKeyDown?(e: KeyboardEvent<HTMLDivElement>): void;
11
+ };
12
+ export declare const ChipChoiceBase: import("react").ForwardRefExoticComponent<Pick<ChipChoiceCommonProps, "icon" | "size" | "label" | "disabled" | "loading" | "onClick" | "className" | "tabIndex" | "showClearButton"> & {
13
+ /** Отображаемое значение */
14
+ valueToRender?: ReactNode;
15
+ /** Фактическое значение. Используется для отображения кнопки очистки, если свойство <strong>showClearButton=true</strong> */
16
+ value?: any;
17
+ /** Колбек для клика по кнопке очистки */
18
+ onClearButtonClick?: MouseEventHandler<HTMLButtonElement> | undefined;
19
+ onKeyDown?(e: KeyboardEvent<HTMLDivElement>): void;
20
+ } & import("react").RefAttributes<HTMLDivElement>>;
@@ -0,0 +1,65 @@
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, jsxs as _jsxs } from "react/jsx-runtime";
13
+ import cn from 'classnames';
14
+ import mergeRefs from 'merge-refs';
15
+ import { forwardRef, useRef, useState } from 'react';
16
+ import { Sun } from '@snack-uikit/loaders';
17
+ import { extractSupportProps } from '@snack-uikit/utils';
18
+ import { CHIP_CHOICE_TEST_IDS, SIZE, VARIANT } from '../../../../constants';
19
+ import { ButtonClearValue } from '../../../../helperComponents';
20
+ import { BUTTON_CLEAR_VALUE_SIZE_MAP } from '../../constants';
21
+ import styles from './styles.module.css';
22
+ export const ChipChoiceBase = forwardRef((_a, ref) => {
23
+ var { size = SIZE.S, disabled, loading, icon, label, valueToRender, value, onClick, className, tabIndex = 0, onClearButtonClick, onKeyDown, showClearButton: showClearButtonProp = true } = _a, rest = __rest(_a, ["size", "disabled", "loading", "icon", "label", "valueToRender", "value", "onClick", "className", "tabIndex", "onClearButtonClick", "onKeyDown", "showClearButton"]);
24
+ const variant = icon && size !== SIZE.Xs ? VARIANT.IconBefore : VARIANT.LabelOnly;
25
+ const spinnerSize = size === SIZE.Xs ? 'xs' : 's';
26
+ const localRef = useRef(null);
27
+ const clearButtonRef = useRef(null);
28
+ const [isDroplistOpened, setIsDroplistOpened] = useState(false);
29
+ const handleChipClick = e => {
30
+ if (loading || disabled)
31
+ return;
32
+ onClick === null || onClick === void 0 ? void 0 : onClick(e);
33
+ !isDroplistOpened && setIsDroplistOpened(true);
34
+ };
35
+ const handleChipKeyDown = e => {
36
+ var _a;
37
+ onKeyDown === null || onKeyDown === void 0 ? void 0 : onKeyDown(e);
38
+ if (e.key === 'ArrowRight') {
39
+ (_a = clearButtonRef.current) === null || _a === void 0 ? void 0 : _a.focus();
40
+ e.stopPropagation();
41
+ e.preventDefault();
42
+ }
43
+ };
44
+ const handleClearButtonClick = e => {
45
+ onClearButtonClick === null || onClearButtonClick === void 0 ? void 0 : onClearButtonClick(e);
46
+ };
47
+ const handleClearButtonKeyDown = e => {
48
+ var _a;
49
+ switch (e.key) {
50
+ case 'ArrowLeft': {
51
+ (_a = localRef.current) === null || _a === void 0 ? void 0 : _a.focus();
52
+ return;
53
+ }
54
+ case 'Enter':
55
+ case ' ': {
56
+ e.stopPropagation();
57
+ return;
58
+ }
59
+ default:
60
+ break;
61
+ }
62
+ };
63
+ const showClearButton = showClearButtonProp && (value instanceof Date || Boolean(value));
64
+ return (_jsxs("div", Object.assign({}, extractSupportProps(rest), { role: 'button', ref: mergeRefs(localRef, ref), className: cn(styles.choiceChip, className), "data-size": size, "data-variant": variant, "data-loading": loading || undefined, "data-disabled": (!loading && disabled) || undefined, onClick: handleChipClick, onKeyDown: handleChipKeyDown, tabIndex: tabIndex, children: [variant === VARIANT.IconBefore && (_jsx("span", { className: styles.icon, "data-test-id": CHIP_CHOICE_TEST_IDS.icon, children: icon })), _jsxs("span", { className: styles.labelLayout, children: [label && (_jsx("span", { className: styles.label, "data-test-id": CHIP_CHOICE_TEST_IDS.label, children: label + ': ' })), loading ? (_jsx("span", { className: styles.spinner, "data-test-id": CHIP_CHOICE_TEST_IDS.spinner, children: _jsx(Sun, { size: spinnerSize }) })) : (_jsx("span", { className: styles.value, "data-test-id": CHIP_CHOICE_TEST_IDS.value, children: valueToRender !== null && valueToRender !== void 0 ? valueToRender : value }))] }), !disabled && !loading && showClearButton && (_jsx(ButtonClearValue, { size: BUTTON_CLEAR_VALUE_SIZE_MAP[size], onClick: handleClearButtonClick, "data-test-id": CHIP_CHOICE_TEST_IDS.clearButton, onKeyDown: handleClearButtonKeyDown, ref: clearButtonRef }))] })));
65
+ });
@@ -0,0 +1 @@
1
+ export * from './ChipChoiceBase';
@@ -0,0 +1 @@
1
+ export * from './ChipChoiceBase';
@@ -1,4 +1,5 @@
1
- .label, .value{
1
+ .label,
2
+ .value{
2
3
  display:inline-flex;
3
4
  align-items:center;
4
5
  }
@@ -20,7 +21,7 @@
20
21
  border-style:solid;
21
22
  outline:0;
22
23
  outline-offset:0;
23
- background-color:var(--sys-neutral-background1-level, #fafafc);
24
+ background-color:var(--sys-neutral-background1-level, #fdfdff);
24
25
  border-color:var(--sys-neutral-decor-default, #dfe2ec);
25
26
  }
26
27
  .choiceChip .spinner{
@@ -117,7 +118,8 @@
117
118
  padding-right:var(--space-chips-label-layout-padding-l, 12px);
118
119
  gap:var(--space-chips-label-layout-gap, 2px);
119
120
  }
120
- .choiceChip .label, .choiceChip .value{
121
+ .choiceChip .label,
122
+ .choiceChip .value{
121
123
  color:var(--sys-neutral-text-support, #656771);
122
124
  }
123
125
  .choiceChip .icon{
@@ -177,7 +179,8 @@
177
179
  background-color:var(--sys-neutral-background, #f1f2f6);
178
180
  border-color:var(--sys-neutral-decor-disabled, #e8eaf1);
179
181
  }
180
- .choiceChip[data-disabled] .label, .choiceChip[data-disabled] .value{
182
+ .choiceChip[data-disabled] .label,
183
+ .choiceChip[data-disabled] .value{
181
184
  color:var(--sys-neutral-text-light, #868892);
182
185
  }
183
186
  .choiceChip[data-loading]{
@@ -190,7 +193,8 @@
190
193
  align-items:center;
191
194
  justify-content:center;
192
195
  }
193
- .choiceChip[data-loading] .label, .choiceChip[data-loading] .value{
196
+ .choiceChip[data-loading] .label,
197
+ .choiceChip[data-loading] .value{
194
198
  color:var(--sys-neutral-text-support, #656771);
195
199
  }
196
200
 
@@ -198,7 +202,8 @@
198
202
  --offset:var(--space-drop-list-drop-offset, 4px);
199
203
  }
200
204
 
201
- .label, .value{
205
+ .label,
206
+ .value{
202
207
  display:inline-flex;
203
208
  align-items:center;
204
209
  }
@@ -220,7 +225,7 @@
220
225
  border-style:solid;
221
226
  outline:0;
222
227
  outline-offset:0;
223
- background-color:var(--sys-neutral-background1-level, #fafafc);
228
+ background-color:var(--sys-neutral-background1-level, #fdfdff);
224
229
  border-color:var(--sys-neutral-decor-default, #dfe2ec);
225
230
  }
226
231
  .choiceChip .spinner{
@@ -317,7 +322,8 @@
317
322
  padding-right:var(--space-chips-label-layout-padding-l, 12px);
318
323
  gap:var(--space-chips-label-layout-gap, 2px);
319
324
  }
320
- .choiceChip .label, .choiceChip .value{
325
+ .choiceChip .label,
326
+ .choiceChip .value{
321
327
  color:var(--sys-neutral-text-support, #656771);
322
328
  }
323
329
  .choiceChip .icon{
@@ -377,7 +383,8 @@
377
383
  background-color:var(--sys-neutral-background, #f1f2f6);
378
384
  border-color:var(--sys-neutral-decor-disabled, #e8eaf1);
379
385
  }
380
- .choiceChip[data-disabled] .label, .choiceChip[data-disabled] .value{
386
+ .choiceChip[data-disabled] .label,
387
+ .choiceChip[data-disabled] .value{
381
388
  color:var(--sys-neutral-text-light, #868892);
382
389
  }
383
390
  .choiceChip[data-loading]{
@@ -393,7 +400,8 @@
393
400
  align-items:center;
394
401
  justify-content:center;
395
402
  }
396
- .choiceChip[data-loading] .label, .choiceChip[data-loading] .value{
403
+ .choiceChip[data-loading] .label,
404
+ .choiceChip[data-loading] .value{
397
405
  color:var(--sys-neutral-text-support, #656771);
398
406
  }
399
407
 
@@ -0,0 +1,25 @@
1
+ import { ReactNode } from 'react';
2
+ import { ChipChoiceCommonProps } from '../types';
3
+ type AnyType = any;
4
+ export type CustomContentRenderProps<T = AnyType> = {
5
+ closeDroplist(): void;
6
+ value: T;
7
+ onChange?(value: T): void;
8
+ };
9
+ export type ChipChoiceCustomProps = ChipChoiceCommonProps & {
10
+ /** Отображаемое значение */
11
+ valueRender?(value: AnyType): ReactNode;
12
+ /** Фактическое значение. Используется для отображения кнопки очистки, если свойство <strong>showClearButton=true</strong> */
13
+ value?: AnyType;
14
+ onChange?(value: AnyType): void;
15
+ /** Контент выпадающего меню
16
+ <br>
17
+ <br> Принимает <strong>ReactNode</strong>
18
+ <br> Или функцию с аргументами:
19
+ <br> <strong>handleDroplistItemKeyDown</strong>: Обработчик нажатия клавиши на элемент выпадающего меню
20
+ <br> <strong>closeDroplist</strong>: Метод для закрытия выпадающего меню
21
+ */
22
+ content?: (props: CustomContentRenderProps) => ReactNode;
23
+ };
24
+ export declare function ChipChoiceCustom({ size, value: valueProp, onChange: onChangeProp, placement, widthStrategy, content, valueRender, ...rest }: ChipChoiceCustomProps): import("react/jsx-runtime").JSX.Element;
25
+ export {};
@@ -0,0 +1,38 @@
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, useRef, useState } from 'react';
14
+ import { Dropdown } from '@snack-uikit/dropdown';
15
+ import { useValueControl } from '@snack-uikit/utils';
16
+ import { CHIP_CHOICE_TEST_IDS, SIZE } from '../../../constants';
17
+ import { useHandleOnKeyDown } from '../hooks';
18
+ import { ChipChoiceBase } from './ChipChoiceBase';
19
+ export function ChipChoiceCustom(_a) {
20
+ var _b;
21
+ var { size = SIZE.S, value: valueProp, onChange: onChangeProp, placement = 'bottom-start', widthStrategy = 'gte', content, valueRender } = _a, rest = __rest(_a, ["size", "value", "onChange", "placement", "widthStrategy", "content", "valueRender"]);
22
+ const localRef = useRef(null);
23
+ const [value, setValue] = useValueControl({
24
+ value: valueProp,
25
+ onChange: onChangeProp,
26
+ });
27
+ const [open, setOpen] = useState(false);
28
+ const handleOnKeyDown = useHandleOnKeyDown({ setOpen });
29
+ const closeDroplist = useCallback(() => {
30
+ setOpen(false);
31
+ setTimeout(() => { var _a; return (_a = localRef.current) === null || _a === void 0 ? void 0 : _a.focus(); }, 0);
32
+ }, []);
33
+ const clearValue = () => {
34
+ setValue === null || setValue === void 0 ? void 0 : setValue(undefined);
35
+ closeDroplist();
36
+ };
37
+ return (_jsx(Dropdown, { trigger: 'click', widthStrategy: widthStrategy, placement: placement, outsideClick: true, triggerRef: localRef, open: open, onOpenChange: setOpen, "data-test-id": CHIP_CHOICE_TEST_IDS.droplist, content: typeof content === 'function' ? content({ closeDroplist, value, onChange: setValue }) : content, children: _jsx(ChipChoiceBase, Object.assign({}, rest, { valueToRender: (_b = valueRender === null || valueRender === void 0 ? void 0 : valueRender(value)) !== null && _b !== void 0 ? _b : value, onClearButtonClick: clearValue, ref: localRef, value: value, size: size, onKeyDown: handleOnKeyDown() })) }));
38
+ }
@@ -1,3 +1,4 @@
1
+ import { ReactNode } from 'react';
1
2
  import { ChipChoiceCommonProps } from '../types';
2
3
  export type ChipChoiceDateProps = ChipChoiceCommonProps & {
3
4
  /** Значение компонента */
@@ -7,6 +8,6 @@ export type ChipChoiceDateProps = ChipChoiceCommonProps & {
7
8
  /** Колбек смены значения */
8
9
  onChange?(value: Date): void;
9
10
  /** Колбек формирующий строковое представление выбранного значения. Принимает выбранное значение */
10
- valueFormatter?(value?: Date): string;
11
+ valueRender?(value?: Date): ReactNode;
11
12
  };
12
- export declare function ChipChoiceDate({ size, value, defaultValue, onChange, valueFormatter, ...rest }: ChipChoiceDateProps): import("react/jsx-runtime").JSX.Element;
13
+ export declare function ChipChoiceDate({ size, value, defaultValue, onChange, valueRender, dropDownClassName, ...rest }: ChipChoiceDateProps): import("react/jsx-runtime").JSX.Element;
@@ -10,22 +10,32 @@ var __rest = (this && this.__rest) || function (s, e) {
10
10
  return t;
11
11
  };
12
12
  import { jsx as _jsx } from "react/jsx-runtime";
13
- import { useUncontrolledProp } from 'uncontrollable';
13
+ import { useCallback, useRef, useState } from 'react';
14
14
  import { Calendar } from '@snack-uikit/calendar';
15
+ import { Dropdown } from '@snack-uikit/dropdown';
15
16
  import { useLocale } from '@snack-uikit/locale';
16
- import { SIZE } from '../../../constants';
17
+ import { useValueControl } from '@snack-uikit/utils';
18
+ import { CHIP_CHOICE_TEST_IDS, SIZE } from '../../../constants';
17
19
  import { CALENDAR_SIZE_MAP } from '../constants';
18
- import { ChipChoiceCustom } from './ChipChoiceCustom';
20
+ import { useHandleOnKeyDown } from '../hooks';
21
+ import { ChipChoiceBase } from './ChipChoiceBase';
19
22
  export function ChipChoiceDate(_a) {
20
- var { size = SIZE.S, value, defaultValue, onChange, valueFormatter } = _a, rest = __rest(_a, ["size", "value", "defaultValue", "onChange", "valueFormatter"]);
21
- const [selectedValue, setSelectedValue] = useUncontrolledProp(value, defaultValue, onChange);
23
+ var { size = SIZE.S, value, defaultValue, onChange, valueRender, dropDownClassName } = _a, rest = __rest(_a, ["size", "value", "defaultValue", "onChange", "valueRender", "dropDownClassName"]);
24
+ const [selectedValue, setSelectedValue] = useValueControl({ value, defaultValue, onChange });
25
+ const localRef = useRef(null);
26
+ const [open, setOpen] = useState(false);
27
+ const handleOnKeyDown = useHandleOnKeyDown({ setOpen });
28
+ const closeDroplist = useCallback(() => {
29
+ setOpen(false);
30
+ setTimeout(() => { var _a; return (_a = localRef.current) === null || _a === void 0 ? void 0 : _a.focus(); }, 0);
31
+ }, []);
22
32
  const { t } = useLocale('Chips');
23
- const valueToRender = valueFormatter
24
- ? valueFormatter(selectedValue)
33
+ const valueToRender = valueRender
34
+ ? valueRender(selectedValue)
25
35
  : (selectedValue && new Date(selectedValue).toLocaleDateString()) || t('allLabel');
26
36
  const clearValue = () => setSelectedValue(undefined);
27
- return (_jsx(ChipChoiceCustom, Object.assign({ onClearButtonClick: clearValue, value: selectedValue, valueToRender: valueToRender, size: size }, rest, { children: ({ closeDroplist }) => (_jsx(Calendar, { mode: 'date', size: CALENDAR_SIZE_MAP[size], value: selectedValue, onChangeValue: value => {
37
+ return (_jsx(Dropdown, { content: _jsx(Calendar, { mode: 'date', size: CALENDAR_SIZE_MAP[size], value: selectedValue, onChangeValue: value => {
28
38
  setSelectedValue(value);
29
39
  closeDroplist();
30
- }, navigationStartRef: element => element === null || element === void 0 ? void 0 : element.focus(), onFocusLeave: closeDroplist })) })));
40
+ }, navigationStartRef: element => element === null || element === void 0 ? void 0 : element.focus(), onFocusLeave: closeDroplist }), 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() })) }));
31
41
  }
@@ -1,3 +1,4 @@
1
+ import { ReactNode } from 'react';
1
2
  import { ChipChoiceCommonProps } from '../types';
2
3
  type Range = [Date, Date];
3
4
  export type ChipChoiceDateRangeProps = ChipChoiceCommonProps & {
@@ -8,7 +9,7 @@ export type ChipChoiceDateRangeProps = ChipChoiceCommonProps & {
8
9
  /** Колбек смены значения */
9
10
  onChange?(value: Range): void;
10
11
  /** Колбек формирующий строковое представление выбранного значения. Принимает массив выбранных значений */
11
- valueFormatter?(value?: Range): string;
12
+ valueRender?(value?: Range): ReactNode;
12
13
  };
13
- export declare function ChipChoiceDateRange({ size, value, defaultValue, onChange, valueFormatter, ...rest }: ChipChoiceDateRangeProps): import("react/jsx-runtime").JSX.Element;
14
+ export declare function ChipChoiceDateRange({ size, value, defaultValue, onChange, valueRender, dropDownClassName, ...rest }: ChipChoiceDateRangeProps): import("react/jsx-runtime").JSX.Element;
14
15
  export {};
@@ -10,12 +10,15 @@ var __rest = (this && this.__rest) || function (s, e) {
10
10
  return t;
11
11
  };
12
12
  import { jsx as _jsx } from "react/jsx-runtime";
13
+ import { useCallback, useRef, useState } from 'react';
13
14
  import { useUncontrolledProp } from 'uncontrollable';
14
15
  import { Calendar } from '@snack-uikit/calendar';
16
+ import { Dropdown } from '@snack-uikit/dropdown';
15
17
  import { useLocale } from '@snack-uikit/locale';
16
- import { DEFAULT_EMPTY_VALUE, SIZE } from '../../../constants';
18
+ import { CHIP_CHOICE_TEST_IDS, DEFAULT_EMPTY_VALUE, SIZE } from '../../../constants';
17
19
  import { CALENDAR_SIZE_MAP } from '../constants';
18
- import { ChipChoiceCustom } from './ChipChoiceCustom';
20
+ import { useHandleOnKeyDown } from '../hooks';
21
+ import { ChipChoiceBase } from './ChipChoiceBase';
19
22
  function defaultRangeFormatter({ value, allLabel }) {
20
23
  if (!value || !value.length)
21
24
  return allLabel;
@@ -23,18 +26,25 @@ function defaultRangeFormatter({ value, allLabel }) {
23
26
  return `${from.toLocaleDateString()} ${DEFAULT_EMPTY_VALUE} ${to.toLocaleDateString()}`;
24
27
  }
25
28
  export function ChipChoiceDateRange(_a) {
26
- var { size = SIZE.S, value, defaultValue, onChange, valueFormatter } = _a, rest = __rest(_a, ["size", "value", "defaultValue", "onChange", "valueFormatter"]);
29
+ var { size = SIZE.S, value, defaultValue, onChange, valueRender, dropDownClassName } = _a, rest = __rest(_a, ["size", "value", "defaultValue", "onChange", "valueRender", "dropDownClassName"]);
27
30
  const [selectedValue, setSelectedValue] = useUncontrolledProp(value, defaultValue, onChange);
28
31
  const { t } = useLocale('Chips');
29
- const valueToRender = valueFormatter
30
- ? valueFormatter(selectedValue)
32
+ const valueToRender = valueRender
33
+ ? valueRender(selectedValue)
31
34
  : defaultRangeFormatter({ value: selectedValue, allLabel: t('allLabel') });
32
35
  const clearValue = () => setSelectedValue(undefined);
33
- return (_jsx(ChipChoiceCustom, Object.assign({ value: selectedValue, valueToRender: valueToRender, onClearButtonClick: clearValue, size: size }, rest, { children: ({ closeDroplist }) => (_jsx(Calendar, { mode: 'range', size: CALENDAR_SIZE_MAP[size], value: selectedValue, onChangeValue: range => {
34
- setSelectedValue(range);
36
+ const localRef = useRef(null);
37
+ const [open, setOpen] = useState(false);
38
+ const closeDroplist = useCallback(() => {
39
+ setOpen(false);
40
+ setTimeout(() => { var _a; return (_a = localRef.current) === null || _a === void 0 ? void 0 : _a.focus(); }, 0);
41
+ }, []);
42
+ const handleOnKeyDown = useHandleOnKeyDown({ setOpen });
43
+ return (_jsx(Dropdown, { content: _jsx(Calendar, { mode: 'range', size: CALENDAR_SIZE_MAP[size], value: selectedValue, onChangeValue: value => {
44
+ setSelectedValue(value);
35
45
  closeDroplist();
36
46
  },
37
47
  // bug with focus
38
48
  // navigationStartRef={element => element?.focus()}
39
- onFocusLeave: closeDroplist })) })));
49
+ onFocusLeave: closeDroplist }), outsideClick: true, triggerRef: localRef, open: open, "data-test-id": CHIP_CHOICE_TEST_IDS.droplist, onOpenChange: setOpen, className: dropDownClassName, children: _jsx(ChipChoiceBase, Object.assign({}, rest, { ref: localRef, onClearButtonClick: clearValue, value: selectedValue, valueToRender: valueToRender, size: size, onKeyDown: handleOnKeyDown() })) }));
40
50
  }
@@ -0,0 +1,8 @@
1
+ import { ChipChoiceMultipleProps, ContentRenderProps } from '../types';
2
+ import { FlattenOption } from '../utils';
3
+ export type ChipChoiceMultipleValueFormatterProps<T extends ContentRenderProps = ContentRenderProps> = {
4
+ value: FlattenOption<T>[];
5
+ total: number;
6
+ allLabel: string;
7
+ };
8
+ export declare function ChipChoiceMultiple<T extends ContentRenderProps = ContentRenderProps>({ value: valueProp, defaultValue, options, onChange: onChangeProp, valueRender, size, label, searchable, contentRender, dropDownClassName, showClearButton, ...rest }: ChipChoiceMultipleProps<T>): import("react/jsx-runtime").JSX.Element;