@sberbusiness/triplex-next-mcp-server 1.50.0-beta → 1.53.1
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/README.md +1 -0
- package/bundle/components/AlertProcess.md +6 -3
- package/bundle/components/AlertProcessSpoiler.md +216 -0
- package/bundle/components/Badge.md +4 -3
- package/bundle/components/ButtonDropdown.md +5 -3
- package/bundle/components/Carousel.md +671 -0
- package/bundle/components/CarouselExtended.md +7 -5
- package/bundle/components/CarouselIndicators.md +666 -0
- package/bundle/components/CarouselItem.md +579 -0
- package/bundle/components/CarouselNextButton.md +633 -0
- package/bundle/components/CarouselPrevButton.md +633 -0
- package/bundle/components/CarouselViewport.md +631 -0
- package/bundle/components/CheckboxTreeExtended.md +21 -7
- package/bundle/components/CheckboxTreeExtendedCheckbox.md +591 -0
- package/bundle/components/CheckboxTreeExtendedNode.md +577 -0
- package/bundle/components/Chip.md +1 -0
- package/bundle/components/ChipDatePicker.md +332 -0
- package/bundle/components/ChipDatePickerTarget.md +316 -0
- package/bundle/components/ChipMonthYearPicker.md +4 -3
- package/bundle/components/ChipMonthYearPickerTarget.md +318 -0
- package/bundle/components/ChipMultiselect.md +63 -73
- package/bundle/components/ChipSelect.md +385 -0
- package/bundle/components/ChipSelectTarget.md +388 -0
- package/bundle/components/ChipSuggest.md +10 -16
- package/bundle/components/ChipSuggestTarget.md +506 -0
- package/bundle/components/CollapsibleTree.md +2 -1
- package/bundle/components/CollapsibleTreeExtended.md +2 -1
- package/bundle/components/DateField.md +4 -2
- package/bundle/components/DatePickerExtended.md +16 -14
- package/bundle/components/DateRange.md +17 -10
- package/bundle/components/Dropdown.md +36 -63
- package/bundle/components/EmptyView.md +9 -4
- package/bundle/components/ExpandAnimation.md +9 -5
- package/bundle/components/FormField.md +1 -1
- package/bundle/components/ImageGallery.md +19 -52
- package/bundle/components/ImageGalleryExtended.md +123 -139
- package/bundle/components/ListItemControlsButtonDropdown.md +3 -2
- package/bundle/components/LoaderSmall.md +5 -4
- package/bundle/components/MonthYearRange.md +334 -0
- package/bundle/components/MultiselectField.md +81 -143
- package/bundle/components/Notification.md +2 -1
- package/bundle/components/NotificationGrouped.md +174 -0
- package/bundle/components/NumberField.md +259 -116
- package/bundle/components/OrderedList.md +149 -112
- package/bundle/components/Overlay.md +3 -2
- package/bundle/components/PageIndicators.md +306 -0
- package/bundle/components/Pagination.md +81 -3
- package/bundle/components/PaginationExtended.md +160 -0
- package/bundle/components/Portal.md +5 -2
- package/bundle/components/Puller.md +375 -0
- package/bundle/components/SMSField.md +277 -102
- package/bundle/components/SelectExtendedField.md +11 -7
- package/bundle/components/SelectField.md +7 -4
- package/bundle/components/SmartSpot.md +259 -0
- package/bundle/components/Step.md +2 -1
- package/bundle/components/Stepper.md +7 -7
- package/bundle/components/Suggest.md +7 -6
- package/bundle/components/SuggestField.md +8 -6
- package/bundle/components/TableBasic.md +12 -14
- package/bundle/components/Tooltip.md +9 -8
- package/bundle/guides/commits.md +4 -1
- package/bundle/guides/context.md +5 -5
- package/bundle/guides/stories.md +29 -21
- package/bundle/manifest.json +145 -13
- package/bundle/release-notes/1.50.0.mdx +4 -0
- package/bundle/release-notes/1.51.0.mdx +57 -0
- package/bundle/release-notes/1.52.0.mdx +55 -0
- package/bundle/release-notes/1.53.0.mdx +60 -0
- package/bundle/release-notes/1.54.0.mdx +45 -0
- package/bundle/release-notes/1.55.0.mdx +7 -0
- package/bundle/tokens.json +377 -222
- package/dist/index.js +39 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
component: ChipMonthYearPicker
|
|
3
3
|
category: Chips
|
|
4
|
-
related: [Chip, ChipDatePicker, MonthYearField, DatePickerExtended]
|
|
4
|
+
related: [ChipMonthYearPickerTarget, Chip, ChipDatePicker, MonthYearField, DatePickerExtended]
|
|
5
5
|
tokens: []
|
|
6
6
|
stories: stories/Chips/ChipMonthYearPicker.stories.tsx
|
|
7
7
|
version: "1.0"
|
|
@@ -169,8 +169,8 @@ selected = getPickerValues(value, format, limitRange).calendarDate !== null
|
|
|
169
169
|
`IMonthYearFieldProps` и утилит `MonthYearPickerUtils`
|
|
170
170
|
- `DatePickerExtended` — база: владеет состоянием открытости, дропдауном, календарём
|
|
171
171
|
и корневым `<div>`; получает `renderTarget` и `renderDropdownHeaderTarget`
|
|
172
|
-
- `ChipMonthYearPickerTarget` — чипс-таргет этого
|
|
173
|
-
|
|
172
|
+
- `ChipMonthYearPickerTarget` — публичный чипс-таргет этого компонента; см.
|
|
173
|
+
[ChipMonthYearPickerTarget-ai.md](./ChipMonthYearPickerTarget-ai.md). Читает открытость из `DatePickerExtendedContext`,
|
|
174
174
|
переключает её по клику и Enter/Space, рендерит `ChipClearButton` либо
|
|
175
175
|
`ChipDropdownArrow` в `postfix`
|
|
176
176
|
|
|
@@ -198,6 +198,7 @@ selected = getPickerValues(value, format, limitRange).calendarDate !== null
|
|
|
198
198
|
|---|---|
|
|
199
199
|
| 2026-09-07 | Создан компонент и документ (AI-Ready Phase 1) |
|
|
200
200
|
| 2026-09-29 | Аудит симметрии `related` (TRI-156): из `related` убраны несимметричные имена (`ChipGroup`). Пояснения к убранным именам сохранены прозой в «Связанные компоненты»; публичный API и поведение не затронуты. |
|
|
201
|
+
| 2026-10-21 | Добавлена связь с самостоятельной AI-документацией `ChipMonthYearPickerTarget`. |
|
|
201
202
|
|
|
202
203
|
---
|
|
203
204
|
|
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
---
|
|
2
|
+
component: ChipMonthYearPickerTarget
|
|
3
|
+
category: Chips
|
|
4
|
+
related: [ChipMonthYearPicker, Chip, DatePickerExtended]
|
|
5
|
+
tokens: []
|
|
6
|
+
stories: stories/Chips/ChipMonthYearPicker.stories.tsx
|
|
7
|
+
version: "1.0"
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# ChipMonthYearPickerTarget
|
|
11
|
+
|
|
12
|
+
## Назначение
|
|
13
|
+
|
|
14
|
+
Публичный чипс-таргет выбора месяца: показывает переданный контент, переключает
|
|
15
|
+
открытость календаря через `DatePickerExtendedContext` и заменяет стрелку кнопкой
|
|
16
|
+
очистки при `selected`.
|
|
17
|
+
|
|
18
|
+
Используй когда: нужен собственный target в `renderTarget` компонента
|
|
19
|
+
`DatePickerExtended`, например с иконкой, уведомлением или обработчиками самого
|
|
20
|
+
чипса. Для готового управляемого выбора месяца используй `ChipMonthYearPicker`.
|
|
21
|
+
Не используй когда: нужен самостоятельный календарь или форматирование значения —
|
|
22
|
+
таргет не хранит дату, не парсит её и не выбирает режим календаря.
|
|
23
|
+
|
|
24
|
+
Публичные named imports: `ChipMonthYearPickerTarget` и
|
|
25
|
+
`IChipMonthYearPickerTargetProps` из `@sberbusiness/triplex-next`.
|
|
26
|
+
|
|
27
|
+
Минимальная управляемая композиция:
|
|
28
|
+
|
|
29
|
+
```tsx
|
|
30
|
+
const [pickedDate, setPickedDate] = useState<moment.Moment | null>(null);
|
|
31
|
+
const label = pickedDate ? pickedDate.format("MMM YYYY") : "Выберите месяц";
|
|
32
|
+
|
|
33
|
+
<DatePickerExtended
|
|
34
|
+
pickType={ECalendarPickType.MONTH_YEAR}
|
|
35
|
+
pickedDate={pickedDate}
|
|
36
|
+
onDateChange={setPickedDate}
|
|
37
|
+
renderTarget={() => (
|
|
38
|
+
<ChipMonthYearPickerTarget
|
|
39
|
+
selected={pickedDate !== null}
|
|
40
|
+
onClear={() => setPickedDate(null)}
|
|
41
|
+
clearButtonProps={{ "aria-label": "Очистить месяц" }}
|
|
42
|
+
>
|
|
43
|
+
{label}
|
|
44
|
+
</ChipMonthYearPickerTarget>
|
|
45
|
+
)}
|
|
46
|
+
renderDropdownHeaderTarget={() => label}
|
|
47
|
+
/>;
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## Варианты и props
|
|
53
|
+
|
|
54
|
+
Наследует `IChipProps`. Собственные props — обязательный `onClear` и опциональный
|
|
55
|
+
`clearButtonProps`. Дату, отображаемый текст и `selected` синхронизирует потребитель;
|
|
56
|
+
сам `selected` не вычисляется из контекста.
|
|
57
|
+
|
|
58
|
+
### Обязательные props
|
|
59
|
+
|
|
60
|
+
| Prop | Тип | Описание |
|
|
61
|
+
|---|---|---|
|
|
62
|
+
| `onClear` | `() => void` | Вызывается без аргументов при активации кнопки очистки. Потребитель сам сбрасывает дату, текст и `selected` |
|
|
63
|
+
|
|
64
|
+
### Опциональные props
|
|
65
|
+
|
|
66
|
+
| Prop | По умолчанию | Описание |
|
|
67
|
+
|---|---|---|
|
|
68
|
+
| `children` | — | Содержимое чипса: название фильтра либо уже отформатированный месяц |
|
|
69
|
+
| `selected` | `false` | Выбранный стиль и кнопка очистки вместо стрелки; не меняет `children` |
|
|
70
|
+
| `disabled` | `false` | Блокирует переключение календаря и нативную кнопку очистки |
|
|
71
|
+
| `clearButtonProps` | — | Атрибуты `ChipClearButton`, включая доступное имя, `title`, `shape`, `active`. `size`, `disabled`, `onClick`, `onKeyDown` исключены из типа и задаются таргетом после spread |
|
|
72
|
+
| `size` | `EComponentSize.MD` | Размер чипса и его правой иконки: SM / MD / LG |
|
|
73
|
+
| `type` | `EChipType.TYPE_1` | Визуальный тип из `Chip`: TYPE_1 / TYPE_2 |
|
|
74
|
+
| `prefix`, `showNotificationIcon` | — / `false` | Левый слот и индикатор уведомления из `Chip` |
|
|
75
|
+
| `postfix` | Стрелка либо очистка | Явное значение заменяет внутренний правый слот, в том числе кнопку очистки |
|
|
76
|
+
| `onClick` | — | Получает событие после переключения открытости. При `disabled` не вызывается |
|
|
77
|
+
| `onKeyDown` | — | Получает все всплывшие до таргета клавиши после внутренней обработки, включая события на `disabled`-таргете |
|
|
78
|
+
| `className`, HTML-/`data-*`-/`aria-*`-атрибуты | — | Передаются в корневой `span` через `Chip`; `className` мержится с базовыми классами |
|
|
79
|
+
|
|
80
|
+
### Контекст и приоритет props
|
|
81
|
+
|
|
82
|
+
`DatePickerExtended` предоставляет `dropdownOpen` и `setDropdownOpen`.
|
|
83
|
+
Клик и Enter/Space вызывают `setDropdownOpen(!dropdownOpen)`, если таргет не
|
|
84
|
+
`disabled`. `mouseUsedRef` таргет не меняет: различие мыши и клавиатуры определяет
|
|
85
|
+
контейнер `DatePickerExtended`.
|
|
86
|
+
|
|
87
|
+
Вне provider используется значение контекста по умолчанию: `dropdownOpen=false`,
|
|
88
|
+
setter ничего не делает. Самостоятельный target поэтому не открывает календарь.
|
|
89
|
+
Возвращай таргет из `renderTarget`, как в примере выше; создавать свой
|
|
90
|
+
`Context.Provider` для обычной композиции не требуется.
|
|
91
|
+
|
|
92
|
+
`aria-expanded` по умолчанию отражает контекст. Внешние `aria-expanded` и `postfix`
|
|
93
|
+
идут в `restProps` после внутренних значений и имеют приоритет. При их подмене
|
|
94
|
+
потребитель отвечает за соответствие атрибута реальной открытости и доступность
|
|
95
|
+
очистки. `onClick`/`onKeyDown` деструктурируются отдельно и внутренние обработчики
|
|
96
|
+
не заменяют.
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## Дизайн-токены
|
|
101
|
+
|
|
102
|
+
Собственного LESS-модуля и собственных токенов нет, поэтому `tokens: []`.
|
|
103
|
+
Внешний вид наследуется от `Chip`: фон, цвет, selected/disabled и тень фокуса —
|
|
104
|
+
группа `Chip`. `ChipClearButton` также использует `Chip.Shadow_Focus`;
|
|
105
|
+
`ChipDropdownArrow` задаёт только поворот, а цвета иконок определяет `paletteIndex`.
|
|
106
|
+
|
|
107
|
+
Полный список токенов — [Chip-ai.md](./Chip-ai.md#дизайн-токены).
|
|
108
|
+
Переопределение через `ThemeProvider` описано в
|
|
109
|
+
[ThemeProvider-ai.md](../ThemeProvider/ThemeProvider-ai.md#как-переопределять-токены).
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## Инварианты
|
|
114
|
+
|
|
115
|
+
- Сохранять `forwardRef<HTMLSpanElement>`: ref указывает на корневой `span` из
|
|
116
|
+
`Chip`, а не на контейнер `DatePickerExtended` и не на кнопку очистки.
|
|
117
|
+
- Сохранять публичные named exports компонента и интерфейса в barrel семейства
|
|
118
|
+
`Chip`, имена props и их типы.
|
|
119
|
+
- Таргет не владеет выбранной датой и не меняет `selected` или `children` после
|
|
120
|
+
`onClear`; это ответственность потребителя.
|
|
121
|
+
- Открытость берётся из `DatePickerExtendedContext`, выбранность — из props.
|
|
122
|
+
Не объединять эти независимые состояния.
|
|
123
|
+
- Клик на очистке останавливает всплытие и вызывает только `onClear()` без события;
|
|
124
|
+
Enter/Space на ней не должны переключать календарь.
|
|
125
|
+
- Служебные props кнопки очистки задаются после `clearButtonProps`: её размер,
|
|
126
|
+
disabled и обработчики не переопределяются этой настройкой.
|
|
127
|
+
- Приоритет внешних `postfix` и `aria-expanded` сохранять.
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## Accessibility
|
|
132
|
+
|
|
133
|
+
- Корень — `span` с `role="button"`, `tabIndex=0` либо `-1` при `disabled` по
|
|
134
|
+
умолчанию. Это не нативная кнопка: атрибут `disabled` на `span` не ставится.
|
|
135
|
+
Остальные HTML-/ARIA-атрибуты наследуются от `Chip` и могут быть переопределены
|
|
136
|
+
потребителем. `aria-haspopup` автоматически не добавляется.
|
|
137
|
+
- Доступное имя таргета задаётся содержимым либо внешним `aria-label`.
|
|
138
|
+
Иконке очистки обязательно передать доступное имя через
|
|
139
|
+
`clearButtonProps={{ "aria-label": "Очистить месяц" }}`.
|
|
140
|
+
- Enter/Space на активном таргете переключают открытость с `preventDefault()`.
|
|
141
|
+
Другие клавиши только передаются в `onKeyDown`. При `disabled` переключения нет,
|
|
142
|
+
но пользовательский `onKeyDown` всё равно вызывается; базовый `Chip` дополнительно
|
|
143
|
+
предотвращает стандартное действие Space даже в disabled-состоянии.
|
|
144
|
+
- Enter/Space на кнопке очистки останавливают всплытие `keydown`; нативная активация
|
|
145
|
+
кнопки создаёт клик, который также не всплывает. У `disabled`-таргета эта кнопка
|
|
146
|
+
получает нативный `disabled`.
|
|
147
|
+
- Escape, ловушка фокуса календаря и возврат фокуса принадлежат `DatePickerExtended`,
|
|
148
|
+
сам таргет ими не управляет.
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
152
|
+
## Связанные компоненты
|
|
153
|
+
|
|
154
|
+
- `ChipMonthYearPicker` — готовый родитель: вычисляет `selected`, форматирует месяц
|
|
155
|
+
и превращает `onClear()` в `onChange("")`; см.
|
|
156
|
+
[ChipMonthYearPicker-ai.md](./ChipMonthYearPicker-ai.md).
|
|
157
|
+
- `Chip` — база props и разметки, размеров, типов, слотов, индикатора и состояний;
|
|
158
|
+
см. [Chip-ai.md](./Chip-ai.md).
|
|
159
|
+
- `DatePickerExtended` — provider открытости, календарь и управление фокусом;
|
|
160
|
+
для month/year-композиции ему задают `pickType=ECalendarPickType.MONTH_YEAR`;
|
|
161
|
+
см. [DatePickerExtended-ai.md](../DatePickerExtended/DatePickerExtended-ai.md).
|
|
162
|
+
- `ChipClearButton` и `ChipDropdownArrow` — внутреннее наполнение правого слота:
|
|
163
|
+
очистка при `selected`, иначе стрелка с поворотом по открытости контекста.
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
## Stories
|
|
168
|
+
|
|
169
|
+
Основные истории: `stories/Chips/ChipMonthYearPicker.stories.tsx`
|
|
170
|
+
Файлы примеров: `stories/Chips/examples/ChipMonthYearPicker/`
|
|
171
|
+
|
|
172
|
+
Используются существующие истории родителя: `ChipMonthYearPicker` рендерит этот таргет.
|
|
173
|
+
Отдельный stories-файл атому не требуется. Пример ручной композиции через
|
|
174
|
+
`renderTarget` приведён выше в этом документе.
|
|
175
|
+
|
|
176
|
+
| Story | Example file | Что демонстрирует |
|
|
177
|
+
|---|---|---|
|
|
178
|
+
| `Playground` | `PlaygroundExample.tsx` | Таргет с контролами `type`, `size`, `disabled`; выбор месяца включает `selected` и кнопку очистки |
|
|
179
|
+
| `Default` | `DefaultExample.tsx` | Управляемое значение и `aria-label` кнопки очистки через `clearButtonProps` |
|
|
180
|
+
| `Types` | `TypesExample.tsx` | TYPE_1 / TYPE_2 таргет без выбора, со стрелкой |
|
|
181
|
+
| `Sizes` | `SizesExample.tsx` | SM / MD / LG таргет без выбора, со стрелкой |
|
|
182
|
+
| `VisualTests` | `VisualTestsExample.tsx` | Выбранный таргет трёх размеров с кнопкой очистки; play раскрывает календарь последнего |
|
|
183
|
+
|
|
184
|
+
Состояния `disabled`, hover, focus и prefix/postfix-слоты отрисовывает `Chip`;
|
|
185
|
+
они покрыты stories `stories/Chips/Chip.stories.tsx`.
|
|
186
|
+
|
|
187
|
+
Контракт таргета покрывает `src/components/Chip/__tests__/ChipMonthYearPickerTarget.test.tsx`;
|
|
188
|
+
календарный выбор и связь с датой — существующие тесты `ChipMonthYearPicker` и
|
|
189
|
+
`DatePickerExtended`.
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
193
|
+
## История изменений
|
|
194
|
+
|
|
195
|
+
| Дата | Изменение |
|
|
196
|
+
|---|---|
|
|
197
|
+
| 2026-10-21 | Создан документ; подтверждены публичный API, контекст, приоритет props и клавиатурный контракт. Добавлены тесты таргета без изменения production-кода. |
|
|
198
|
+
|
|
199
|
+
---
|
|
200
|
+
|
|
201
|
+
## Примеры использования
|
|
202
|
+
|
|
203
|
+
### Default
|
|
204
|
+
|
|
205
|
+
`stories/Chips/examples/ChipMonthYearPicker/DefaultExample.tsx`
|
|
206
|
+
|
|
207
|
+
```tsx
|
|
208
|
+
import React, { useState } from "react";
|
|
209
|
+
import { ChipMonthYearPicker, EComponentSize, EDropdownAlignment } from "@sberbusiness/triplex-next";
|
|
210
|
+
|
|
211
|
+
export const DefaultExample = () => {
|
|
212
|
+
const [value, setValue] = useState("");
|
|
213
|
+
return (
|
|
214
|
+
<ChipMonthYearPicker
|
|
215
|
+
value={value}
|
|
216
|
+
label="MonthYear label"
|
|
217
|
+
placeholder="Select to proceed"
|
|
218
|
+
onChange={setValue}
|
|
219
|
+
alignment={EDropdownAlignment.LEFT}
|
|
220
|
+
size={EComponentSize.MD}
|
|
221
|
+
clearButtonProps={{ "aria-label": "Очистить" }}
|
|
222
|
+
/>
|
|
223
|
+
);
|
|
224
|
+
};
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
### Types
|
|
228
|
+
|
|
229
|
+
`stories/Chips/examples/ChipMonthYearPicker/TypesExample.tsx`
|
|
230
|
+
|
|
231
|
+
```tsx
|
|
232
|
+
import React, { useState } from "react";
|
|
233
|
+
import { ChipMonthYearPicker, EChipType, EDropdownAlignment } from "@sberbusiness/triplex-next";
|
|
234
|
+
|
|
235
|
+
type TypeItemProps = {
|
|
236
|
+
type: EChipType;
|
|
237
|
+
label: string;
|
|
238
|
+
};
|
|
239
|
+
|
|
240
|
+
const TypeItem = ({ type, label }: TypeItemProps) => {
|
|
241
|
+
const [value, setValue] = useState("");
|
|
242
|
+
|
|
243
|
+
return (
|
|
244
|
+
<div>
|
|
245
|
+
<div style={{ marginBottom: 8, fontSize: 16, fontWeight: 700 }}>{label}</div>
|
|
246
|
+
<ChipMonthYearPicker
|
|
247
|
+
value={value}
|
|
248
|
+
label="MonthYear label"
|
|
249
|
+
placeholder="Select to proceed"
|
|
250
|
+
clearButtonProps={{ "aria-label": "Очистить" }}
|
|
251
|
+
type={type}
|
|
252
|
+
alignment={EDropdownAlignment.LEFT}
|
|
253
|
+
onChange={setValue}
|
|
254
|
+
/>
|
|
255
|
+
</div>
|
|
256
|
+
);
|
|
257
|
+
};
|
|
258
|
+
|
|
259
|
+
const typeOptions = Object.values(EChipType).map((type) => ({
|
|
260
|
+
value: type,
|
|
261
|
+
label: type.toUpperCase(),
|
|
262
|
+
}));
|
|
263
|
+
|
|
264
|
+
export const TypesExample = () => (
|
|
265
|
+
<div style={{ display: "flex", flexDirection: "column", gap: 12 }}>
|
|
266
|
+
{typeOptions.map(({ value, label }) => (
|
|
267
|
+
<TypeItem key={value} type={value} label={label} />
|
|
268
|
+
))}
|
|
269
|
+
</div>
|
|
270
|
+
);
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
### Sizes
|
|
274
|
+
|
|
275
|
+
`stories/Chips/examples/ChipMonthYearPicker/SizesExample.tsx`
|
|
276
|
+
|
|
277
|
+
```tsx
|
|
278
|
+
import React, { useState } from "react";
|
|
279
|
+
import { ChipMonthYearPicker, EComponentSize, EDropdownAlignment } from "@sberbusiness/triplex-next";
|
|
280
|
+
|
|
281
|
+
type SizeItemProps = {
|
|
282
|
+
size: EComponentSize;
|
|
283
|
+
label: string;
|
|
284
|
+
};
|
|
285
|
+
|
|
286
|
+
const SizeItem = ({ size, label }: SizeItemProps) => {
|
|
287
|
+
const [value, setValue] = useState("");
|
|
288
|
+
|
|
289
|
+
return (
|
|
290
|
+
<div>
|
|
291
|
+
<div style={{ marginBottom: 8, fontSize: 16, fontWeight: 700 }}>{label}</div>
|
|
292
|
+
<ChipMonthYearPicker
|
|
293
|
+
size={size}
|
|
294
|
+
alignment={EDropdownAlignment.LEFT}
|
|
295
|
+
value={value}
|
|
296
|
+
label="MonthYear label"
|
|
297
|
+
placeholder="Select to proceed"
|
|
298
|
+
clearButtonProps={{ "aria-label": "Очистить" }}
|
|
299
|
+
onChange={setValue}
|
|
300
|
+
/>
|
|
301
|
+
</div>
|
|
302
|
+
);
|
|
303
|
+
};
|
|
304
|
+
|
|
305
|
+
const sizeOptions = Object.values(EComponentSize).map((size) => ({
|
|
306
|
+
value: size,
|
|
307
|
+
label: size.toUpperCase(),
|
|
308
|
+
}));
|
|
309
|
+
|
|
310
|
+
export const SizesExample = () => (
|
|
311
|
+
<div style={{ display: "flex", flexDirection: "column", gap: 12 }}>
|
|
312
|
+
{sizeOptions.map(({ value, label }) => (
|
|
313
|
+
<SizeItem key={value} size={value} label={label} />
|
|
314
|
+
))}
|
|
315
|
+
</div>
|
|
316
|
+
);
|
|
317
|
+
```
|
|
318
|
+
|
|
@@ -218,11 +218,11 @@ Postfix переключается тем же флагом `selected`: `ChipDro
|
|
|
218
218
|
import React, { useMemo, useState } from "react";
|
|
219
219
|
import {
|
|
220
220
|
MultiselectField,
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
221
|
+
PullerHeader,
|
|
222
|
+
PullerInput,
|
|
223
|
+
PullerClose,
|
|
224
|
+
PullerBody,
|
|
225
|
+
PullerFooter,
|
|
226
226
|
EDropdownAlignment,
|
|
227
227
|
Button,
|
|
228
228
|
EButtonTheme,
|
|
@@ -329,21 +329,19 @@ export const DefaultExample = () => {
|
|
|
329
329
|
ref={dropdownRef}
|
|
330
330
|
alignment={EDropdownAlignment.LEFT}
|
|
331
331
|
focusTrapProps={{ focusTrapOptions: { initialFocus: false } }}
|
|
332
|
-
|
|
332
|
+
pullerProps={{
|
|
333
333
|
children: (
|
|
334
334
|
<>
|
|
335
|
-
<
|
|
336
|
-
|
|
337
|
-
>
|
|
338
|
-
<DropdownMobileInput
|
|
335
|
+
<PullerHeader controlButtons={<PullerClose onClick={() => setOpened(false)} />}>
|
|
336
|
+
<PullerInput
|
|
339
337
|
autoFocus={true}
|
|
340
338
|
placeholder="Type to proceed"
|
|
341
339
|
value={filter}
|
|
342
340
|
onChange={handleFilterChange}
|
|
343
341
|
/>
|
|
344
|
-
</
|
|
345
|
-
<
|
|
346
|
-
<
|
|
342
|
+
</PullerHeader>
|
|
343
|
+
<PullerBody>{renderDropdownContent()}</PullerBody>
|
|
344
|
+
<PullerFooter>
|
|
347
345
|
<Button
|
|
348
346
|
theme={EButtonTheme.GENERAL}
|
|
349
347
|
size={EComponentSize.SM}
|
|
@@ -358,7 +356,7 @@ export const DefaultExample = () => {
|
|
|
358
356
|
>
|
|
359
357
|
Button link text
|
|
360
358
|
</Button>
|
|
361
|
-
</
|
|
359
|
+
</PullerFooter>
|
|
362
360
|
</>
|
|
363
361
|
),
|
|
364
362
|
}}
|
|
@@ -402,11 +400,11 @@ import clsx from "clsx";
|
|
|
402
400
|
import {
|
|
403
401
|
MultiselectField,
|
|
404
402
|
EComponentSize,
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
403
|
+
PullerHeader,
|
|
404
|
+
PullerInput,
|
|
405
|
+
PullerClose,
|
|
406
|
+
PullerBody,
|
|
407
|
+
PullerFooter,
|
|
410
408
|
EDropdownAlignment,
|
|
411
409
|
Button,
|
|
412
410
|
EButtonTheme,
|
|
@@ -517,21 +515,19 @@ const TypeItem = ({ type, label }: TypeItemProps) => {
|
|
|
517
515
|
ref={dropdownRef}
|
|
518
516
|
alignment={EDropdownAlignment.LEFT}
|
|
519
517
|
focusTrapProps={{ focusTrapOptions: { initialFocus: false } }}
|
|
520
|
-
|
|
518
|
+
pullerProps={{
|
|
521
519
|
children: (
|
|
522
520
|
<>
|
|
523
|
-
<
|
|
524
|
-
|
|
525
|
-
>
|
|
526
|
-
<DropdownMobileInput
|
|
521
|
+
<PullerHeader controlButtons={<PullerClose onClick={() => setOpened(false)} />}>
|
|
522
|
+
<PullerInput
|
|
527
523
|
autoFocus={true}
|
|
528
524
|
placeholder="Type to proceed"
|
|
529
525
|
value={filter}
|
|
530
526
|
onChange={handleFilterChange}
|
|
531
527
|
/>
|
|
532
|
-
</
|
|
533
|
-
<
|
|
534
|
-
<
|
|
528
|
+
</PullerHeader>
|
|
529
|
+
<PullerBody>{renderDropdownContent()}</PullerBody>
|
|
530
|
+
<PullerFooter>
|
|
535
531
|
<Button
|
|
536
532
|
theme={EButtonTheme.GENERAL}
|
|
537
533
|
size={EComponentSize.SM}
|
|
@@ -546,7 +542,7 @@ const TypeItem = ({ type, label }: TypeItemProps) => {
|
|
|
546
542
|
>
|
|
547
543
|
Button link text
|
|
548
544
|
</Button>
|
|
549
|
-
</
|
|
545
|
+
</PullerFooter>
|
|
550
546
|
</>
|
|
551
547
|
),
|
|
552
548
|
}}
|
|
@@ -604,11 +600,11 @@ import clsx from "clsx";
|
|
|
604
600
|
import {
|
|
605
601
|
EComponentSize,
|
|
606
602
|
MultiselectField,
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
603
|
+
PullerHeader,
|
|
604
|
+
PullerInput,
|
|
605
|
+
PullerClose,
|
|
606
|
+
PullerBody,
|
|
607
|
+
PullerFooter,
|
|
612
608
|
EDropdownAlignment,
|
|
613
609
|
Button,
|
|
614
610
|
EButtonTheme,
|
|
@@ -719,21 +715,19 @@ const SizeItem = ({ size, label }: SizeItemProps) => {
|
|
|
719
715
|
ref={dropdownRef}
|
|
720
716
|
alignment={EDropdownAlignment.LEFT}
|
|
721
717
|
focusTrapProps={{ focusTrapOptions: { initialFocus: false } }}
|
|
722
|
-
|
|
718
|
+
pullerProps={{
|
|
723
719
|
children: (
|
|
724
720
|
<>
|
|
725
|
-
<
|
|
726
|
-
|
|
727
|
-
>
|
|
728
|
-
<DropdownMobileInput
|
|
721
|
+
<PullerHeader controlButtons={<PullerClose onClick={() => setOpened(false)} />}>
|
|
722
|
+
<PullerInput
|
|
729
723
|
autoFocus={true}
|
|
730
724
|
placeholder="Type to proceed"
|
|
731
725
|
value={filter}
|
|
732
726
|
onChange={handleFilterChange}
|
|
733
727
|
/>
|
|
734
|
-
</
|
|
735
|
-
<
|
|
736
|
-
<
|
|
728
|
+
</PullerHeader>
|
|
729
|
+
<PullerBody>{renderDropdownContent()}</PullerBody>
|
|
730
|
+
<PullerFooter>
|
|
737
731
|
<Button
|
|
738
732
|
theme={EButtonTheme.GENERAL}
|
|
739
733
|
size={EComponentSize.SM}
|
|
@@ -748,7 +742,7 @@ const SizeItem = ({ size, label }: SizeItemProps) => {
|
|
|
748
742
|
>
|
|
749
743
|
Button link text
|
|
750
744
|
</Button>
|
|
751
|
-
</
|
|
745
|
+
</PullerFooter>
|
|
752
746
|
</>
|
|
753
747
|
),
|
|
754
748
|
}}
|
|
@@ -819,15 +813,15 @@ import {
|
|
|
819
813
|
ChipMultiselect,
|
|
820
814
|
ETextSize,
|
|
821
815
|
Text,
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
816
|
+
PullerHeader,
|
|
817
|
+
PullerInput,
|
|
818
|
+
PullerClose,
|
|
819
|
+
PullerBody,
|
|
820
|
+
PullerFooter,
|
|
827
821
|
EDropdownAlignment,
|
|
828
822
|
Button,
|
|
829
823
|
EButtonTheme,
|
|
830
|
-
|
|
824
|
+
PullerLoader,
|
|
831
825
|
} from "@sberbusiness/triplex-next";
|
|
832
826
|
import { CHIP_MULTISELECT_OPTIONS } from "./storyConstants";
|
|
833
827
|
|
|
@@ -919,26 +913,26 @@ export const LoadingExample = () => {
|
|
|
919
913
|
ref={dropdownRef}
|
|
920
914
|
alignment={EDropdownAlignment.LEFT}
|
|
921
915
|
focusTrapProps={{ focusTrapOptions: { initialFocus: false } }}
|
|
922
|
-
|
|
916
|
+
pullerProps={{
|
|
923
917
|
children: (
|
|
924
918
|
<>
|
|
925
|
-
<
|
|
919
|
+
<PullerHeader
|
|
926
920
|
controlButtons={
|
|
927
921
|
<>
|
|
928
|
-
<
|
|
929
|
-
<
|
|
922
|
+
<PullerLoader />
|
|
923
|
+
<PullerClose onClick={() => setOpened(false)} />
|
|
930
924
|
</>
|
|
931
925
|
}
|
|
932
926
|
>
|
|
933
|
-
<
|
|
927
|
+
<PullerInput
|
|
934
928
|
autoFocus={true}
|
|
935
929
|
placeholder="Type to proceed"
|
|
936
930
|
value={filter}
|
|
937
931
|
onChange={handleFilterChange}
|
|
938
932
|
/>
|
|
939
|
-
</
|
|
940
|
-
<
|
|
941
|
-
<
|
|
933
|
+
</PullerHeader>
|
|
934
|
+
<PullerBody>{renderDropdownContent()}</PullerBody>
|
|
935
|
+
<PullerFooter>
|
|
942
936
|
<Button
|
|
943
937
|
theme={EButtonTheme.GENERAL}
|
|
944
938
|
size={EComponentSize.SM}
|
|
@@ -953,7 +947,7 @@ export const LoadingExample = () => {
|
|
|
953
947
|
>
|
|
954
948
|
Button link text
|
|
955
949
|
</Button>
|
|
956
|
-
</
|
|
950
|
+
</PullerFooter>
|
|
957
951
|
</>
|
|
958
952
|
),
|
|
959
953
|
}}
|
|
@@ -997,11 +991,11 @@ export const LoadingExample = () => {
|
|
|
997
991
|
import React, { useState } from "react";
|
|
998
992
|
import {
|
|
999
993
|
MultiselectField,
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
994
|
+
PullerHeader,
|
|
995
|
+
PullerInput,
|
|
996
|
+
PullerClose,
|
|
997
|
+
PullerBody,
|
|
998
|
+
PullerFooter,
|
|
1005
999
|
Button,
|
|
1006
1000
|
EButtonTheme,
|
|
1007
1001
|
EComponentSize,
|
|
@@ -1192,18 +1186,14 @@ export const WithCheckboxTreeExample = () => {
|
|
|
1192
1186
|
focusTrapProps={{
|
|
1193
1187
|
focusTrapOptions: { initialFocus: false },
|
|
1194
1188
|
}}
|
|
1195
|
-
|
|
1189
|
+
pullerProps={{
|
|
1196
1190
|
children: (
|
|
1197
1191
|
<>
|
|
1198
|
-
<
|
|
1199
|
-
<
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
/>
|
|
1204
|
-
</DropdownMobileHeader>
|
|
1205
|
-
<DropdownMobileBody>{renderDropdownContent()}</DropdownMobileBody>
|
|
1206
|
-
<DropdownMobileFooter>
|
|
1192
|
+
<PullerHeader controlButtons={<PullerClose onClick={() => setOpened(false)} />}>
|
|
1193
|
+
<PullerInput placeholder="Type to proceed" value={filter} onChange={handleFilterChange} />
|
|
1194
|
+
</PullerHeader>
|
|
1195
|
+
<PullerBody>{renderDropdownContent()}</PullerBody>
|
|
1196
|
+
<PullerFooter>
|
|
1207
1197
|
<Button
|
|
1208
1198
|
theme={EButtonTheme.GENERAL}
|
|
1209
1199
|
size={EComponentSize.SM}
|
|
@@ -1214,7 +1204,7 @@ export const WithCheckboxTreeExample = () => {
|
|
|
1214
1204
|
<Button theme={EButtonTheme.LINK} size={EComponentSize.SM} onClick={handleClickClearFilter}>
|
|
1215
1205
|
Button link text
|
|
1216
1206
|
</Button>
|
|
1217
|
-
</
|
|
1207
|
+
</PullerFooter>
|
|
1218
1208
|
</>
|
|
1219
1209
|
),
|
|
1220
1210
|
}}
|