@sberbusiness/triplex-next-mcp-server 1.45.0-beta → 1.48.0-beta

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 (60) hide show
  1. package/README.md +7 -7
  2. package/bundle/components/AmountField.md +222 -323
  3. package/bundle/components/Avatar.md +138 -146
  4. package/bundle/components/CardAction.md +615 -0
  5. package/bundle/components/CardStatic.md +402 -0
  6. package/bundle/components/CheckboxTree.md +157 -215
  7. package/bundle/components/CheckboxTreeExtended.md +7 -7
  8. package/bundle/components/Chip.md +7 -6
  9. package/bundle/components/ChipGroup.md +1 -1
  10. package/bundle/components/ChipMonthYearPicker.md +344 -0
  11. package/bundle/components/ChipMultiselect.md +1251 -0
  12. package/bundle/components/ChipOptions.md +329 -0
  13. package/bundle/components/ChipSort.md +333 -0
  14. package/bundle/components/ChipSuggest.md +588 -0
  15. package/bundle/components/CollapsibleTree.md +8 -4
  16. package/bundle/components/CollapsibleTreeExtended.md +8 -6
  17. package/bundle/components/Confirm.md +346 -281
  18. package/bundle/components/DateField.md +222 -303
  19. package/bundle/components/DatePickerExtended.md +3 -1
  20. package/bundle/components/DateRange.md +351 -210
  21. package/bundle/components/FooterPage.md +1 -0
  22. package/bundle/components/FormField.md +14 -5
  23. package/bundle/components/FormGroup.md +3 -2
  24. package/bundle/components/HelpBox.md +7 -1
  25. package/bundle/components/IslandAccordion.md +443 -152
  26. package/bundle/components/IslandWidget.md +622 -157
  27. package/bundle/components/LightBox.md +8 -0
  28. package/bundle/components/ListMaster.md +2 -2
  29. package/bundle/components/ListTableItem.md +6 -6
  30. package/bundle/components/MaskedField.md +2 -1
  31. package/bundle/components/MonthYearField.md +18 -5
  32. package/bundle/components/Slider.md +389 -97
  33. package/bundle/components/SliderRange.md +486 -105
  34. package/bundle/components/StatusTracker.md +386 -94
  35. package/bundle/components/Stepper.md +355 -102
  36. package/bundle/components/StepperExtended.md +633 -0
  37. package/bundle/components/SuggestField.md +1049 -96
  38. package/bundle/components/SwipeableArea.md +7 -7
  39. package/bundle/components/Tabs.md +265 -92
  40. package/bundle/components/TabsExtended.md +18 -18
  41. package/bundle/components/TabsLine.md +301 -127
  42. package/bundle/components/TagColor.md +187 -66
  43. package/bundle/components/TagGroup.md +184 -48
  44. package/bundle/components/TextareaField.md +278 -70
  45. package/bundle/components/TopOverlay.md +17 -1
  46. package/bundle/components/TreeView.md +16 -7
  47. package/bundle/components/TriggerClickOnKeyDownEvent.md +277 -0
  48. package/bundle/components/UploadZone.md +318 -0
  49. package/bundle/guides/codestyle.md +16 -1
  50. package/bundle/guides/commits.md +47 -1
  51. package/bundle/guides/tests.md +23 -2
  52. package/bundle/manifest.json +92 -24
  53. package/bundle/release-notes/1.46.0.mdx +59 -0
  54. package/bundle/release-notes/1.47.0.mdx +122 -0
  55. package/bundle/release-notes/1.48.0.mdx +68 -0
  56. package/bundle/release-notes/1.49.0.mdx +7 -0
  57. package/bundle/tokens.json +3 -3
  58. package/dist/index.js +220 -6
  59. package/dist/index.js.map +1 -1
  60. package/package.json +1 -1
@@ -0,0 +1,344 @@
1
+ ---
2
+ component: ChipMonthYearPicker
3
+ category: Chips
4
+ related: [Chip, ChipDatePicker, ChipGroup, MonthYearField, DatePickerExtended]
5
+ tokens: []
6
+ stories: stories/Chips/ChipMonthYearPicker.stories.tsx
7
+ version: "1.0"
8
+ ---
9
+
10
+ # ChipMonthYearPicker
11
+
12
+ ## Назначение
13
+
14
+ Выбор месяца и года в виде чипса: в свёрнутом виде показывает название фильтра либо
15
+ выбранный месяц, по нажатию открывает календарь, сразу открытый на сетке месяцев
16
+ (`ECalendarPickType.MONTH_YEAR`). Ввода с клавиатуры нет — значение меняется только
17
+ выбором в календаре.
18
+
19
+ Используй когда: в панели фильтров нужен период гранулярности «месяц» (отчётный период,
20
+ месяц выписки) и результат должен читаться прямо на чипсе.
21
+ Не используй когда: нужна конкретная дата (`ChipDatePicker`), нужен диапазон месяцев
22
+ (`MonthYearRange`) или поле в форме с лейблом и статусом валидации (`MonthYearField`).
23
+
24
+ Компонент управляемый: `value` и `onChange` держит потребитель. Рекомендуется
25
+ располагать внутри `ChipGroup` — он задаёт отступы и режим одной строки.
26
+
27
+ ---
28
+
29
+ ## Варианты и props
30
+
31
+ `IChipMonthYearPickerProps` — это `IMonthYearFieldProps` без props поля формы
32
+ (`status`, `label`, `onClear`, `targetProps`) и без `pickType` (зафиксирован
33
+ компонентом), плюс `type` / `disabled` от `IChipProps` и собственные `label`,
34
+ `displayedValue`, `clearButtonProps`. То есть все props `DatePickerExtended`
35
+ (`alignment`, `limitRange`, `disabledDays`, `defaultViewDate`, `onDropdownOpen` /
36
+ `onDropdownClose`, `focusTrapProps`, кнопки навигации календаря) доступны и уходят
37
+ в него спредом.
38
+
39
+ `label` переопределён по сравнению с `MonthYearField`: там это лейбл поля из
40
+ `TextField`, здесь — **обязательный** текст самого чипса в невыбранном состоянии.
41
+
42
+ Неизвестные компоненту атрибуты (`data-*`, `aria-*`, `id`, обработчики `<div>`)
43
+ попадают на корневой `<div>` `DatePickerExtended`, а не на чипс-таргет.
44
+
45
+ ### Обязательные props
46
+
47
+ | Prop | Тип | Описание |
48
+ |---|---|---|
49
+ | `value` | `string` | Значение в формате `format`. Пустая строка либо непарсимое/выходящее за `limitRange` значение = «не выбрано» |
50
+ | `label` | `React.ReactNode` | Текст чипса, пока значение не выбрано |
51
+ | `onChange` | `(value: string) => void` | Вызывается с датой в формате `format` при выборе месяца и с `""` при очистке |
52
+
53
+ ### Опциональные props
54
+
55
+ | Prop | Тип | По умолчанию | Описание |
56
+ |---|---|---|---|
57
+ | `format` | `string` | `"YYYYMMDD"` (`dateFormatYYYYMMDD`) | Транспортный формат `value`. На отображение не влияет |
58
+ | `limitRange` | `IDateLimitRange` | `globalLimitRange` (1900-01-01 … 2199-12-31) | Границы выбора. Значение вне диапазона считается невыбранным |
59
+ | `displayedValue` | `React.ReactNode` | — | Показывается вместо отформатированного значения, **только когда значение выбрано** |
60
+ | `placeholder` | `string` | — | Подсказка в поле шапки мобильного дропдауна. В самом чипсе не видна |
61
+ | `size` | `EComponentSize` | `MD` (дефолт `Chip`) | Размер чипса, иконки очистки и стрелки |
62
+ | `type` | `EChipType` | `TYPE_1` | Визуальный тип чипса |
63
+ | `disabled` | `boolean` | `false` | Блокирует открытие календаря и очистку |
64
+ | `clearButtonProps` | `Omit<IChipClearButtonProps, "size" \| "disabled" \| "onClick" \| "onKeyDown">` | — | Props кнопки очистки; основное назначение — задать `aria-label`. `size` и `disabled` наследуются от чипса и не переопределяются |
65
+ | `alignment` | `EDropdownAlignment` | `LEFT` | Выравнивание дропдауна относительно чипса |
66
+ | `className` | `string` | — | Дополнительный класс корневого `<div>`, мержится с `.chipGroupItem` |
67
+
68
+ ### Отображаемое значение
69
+
70
+ Порядок вычисления того, что видно на чипсе:
71
+
72
+ ```text
73
+ selected = getPickerValues(value, format, limitRange).calendarDate !== null
74
+ чипс = selected ? (displayedValue ?? value в формате "MMM YYYY") : label
75
+ ```
76
+
77
+ - формат отображения — `inputMonthYearFormat` (`"MMM YYYY"`) из
78
+ `MonthYearField/constants.ts`, локализуется глобальной локалью `moment`
79
+ (`Jan 1970` по умолчанию, `янв. 1970` при `moment.locale("ru")`). Он **не**
80
+ зависит от `format` — тот описывает только транспортное значение;
81
+ - `value`, которое не парсится по `format` или выходит за `limitRange`, молча
82
+ трактуется как «не выбрано»: показывается `label`, исключения не бросаются;
83
+ - `displayedValue` при пустом `value` игнорируется — приоритет всегда у `label`.
84
+
85
+ ### Постфикс чипса
86
+
87
+ Правый слот переключается по тому же `selected`: выбранное значение → `ChipClearButton`
88
+ (очистка), невыбранное → `ChipDropdownArrow`, повёрнутая при открытом дропдауне.
89
+ Отдельной кнопки-календаря, как в `MonthYearField`, у чипса нет.
90
+
91
+ ---
92
+
93
+ ## Дизайн-токены
94
+
95
+ Собственных токенов у компонента нет: в `styles/Chip.module.less` ему принадлежит
96
+ только `.chipGroupItem` (`display: inline-block`). Весь визуал приходит из компонентов,
97
+ на которых он построен:
98
+
99
+ - чипс-таргет — `Chip` (группа `Chip`: фон, цвет, тень фокуса, состояния `selected` и `disabled`);
100
+ - кнопка очистки и стрелка — `ChipClearButton` / `ChipDropdownArrow` поверх `ButtonIcon`
101
+ и `IconWrapper`, палитра иконок задаётся `paletteIndex`, а не токеном;
102
+ - календарь и выпадающий блок — `Calendar` (группа `Calendar`) и `Dropdown`.
103
+
104
+ Полный список токенов чипса — в `Chip-ai.md` → «Дизайн-токены», календаря —
105
+ в `Calendar-ai.md`.
106
+
107
+ ---
108
+
109
+ ## Инварианты
110
+
111
+ - **`forwardRef`** — не убирать. `ref` указывает на корневой `<div>` `DatePickerExtended`,
112
+ а не на чипс-таргет. Цель `ref` не менять — на ней держится тест `Should forward ref correctly`.
113
+ - **`pickType` зафиксирован** значением `ECalendarPickType.MONTH_YEAR` и исключён из props
114
+ (`Omit`). Возможность выбрать день здесь не открывать — для этого есть `ChipDatePicker`.
115
+ - **`label` обязателен и переопределяет опциональный `label` из `IMonthYearFieldProps`** —
116
+ без него у чипса нет невыбранного состояния.
117
+ - **Пустая строка — контракт очистки.** Кнопка очистки вызывает `onChange("")`;
118
+ отдельного `onClear` (как в `MonthYearField`) у компонента намеренно нет.
119
+ - **`className` мержится через `clsx` с `.chipGroupItem`** на корневом `<div>` —
120
+ общий маркер семейства Chip*. Не удалять и не заменять спредом `...rest`.
121
+ - **Значение вне `limitRange` не является ошибкой** — оно показывается как невыбранное.
122
+ Компонент библиотеки не бросает исключений в рантайме.
123
+ - **Barrel `src/components/Chip/index.ts`** экспортирует `ChipMonthYearPicker`,
124
+ `ChipMonthYearPickerTarget` и их интерфейсы — сохранять.
125
+ - **Story ids `chips-chipmonthyearpicker--*`** завязаны на baseline-скриншоты
126
+ в `__screenshots__/` — переименование story требует обновления baseline.
127
+
128
+ ---
129
+
130
+ ## Accessibility
131
+
132
+ - Таргет — `<span role="button">` из `Chip` с `aria-expanded`, отражающим состояние
133
+ дропдауна. Доступное имя берётся из содержимого чипса (`label` либо значение).
134
+ - **Клавиатура на чипсе:** Enter и Space открывают и закрывают календарь с
135
+ `preventDefault()` (гасят прокрутку и «клик» по пробелу). Escape на открытом
136
+ дропдауне закрывает его (`DatePickerExtended`). `onKeyDown`, переданный в
137
+ `ChipMonthYearPicker`, в чипс-таргет не пробрасывается — он попадает на корневой
138
+ `<div>` `DatePickerExtended` вместе с остальным `...rest` и ловит всплывающие
139
+ события. Собственный `onKeyDown` экспортируемого `ChipMonthYearPickerTarget`
140
+ вызывается на любую клавишу, как у базового `Chip`; Enter/Space дополнительно
141
+ переключают дропдаун, если чипс не `disabled`. Навигация по сетке месяцев —
142
+ стрелки (шаг: ±1 месяц по горизонтали, ±3 по вертикали, PageUp/PageDown — ±1 год),
143
+ внутри `CalendarViewMonths`.
144
+ - **Кнопка очистки** гасит всплытие Enter/Space и клика, поэтому активируется сама,
145
+ а не открывает календарь. Своего текста у неё нет: задать доступное имя обязан
146
+ потребитель через `clearButtonProps={{ "aria-label": "…" }}` — библиотека
147
+ мультиязычная и текст не хардкодит.
148
+ Её `disabled` не переопределяется из `clearButtonProps` (исключён из типа) —
149
+ на задизейбленном чипсе очистка всегда недоступна.
150
+ - **Фокус:** дропдаун — `role="dialog"` с `aria-modal` и `FocusTrap`. При открытии
151
+ с клавиатуры фокус уходит в календарь и возвращается на чипс при закрытии; при
152
+ открытии мышью фокус не перехватывается (`mouseUsedRef` в `DatePickerExtended`).
153
+ - `disabled` у `Chip` не нативный: `pointer-events: none` плюс `tabIndex={-1}`.
154
+ Дополнительно таргет сам игнорирует клик и Enter/Space, а `ChipClearButton`
155
+ получает `disabled`. Программно диспатченные события всё же дойдут до DOM —
156
+ см. `Chip-ai.md`.
157
+ - В мобильном режиме календарь показывается как мобильный `Dropdown`: в шапке —
158
+ поле `readOnly` с выбранным значением и `placeholder`, справа — кнопка закрытия.
159
+
160
+ ---
161
+
162
+ ## Связанные компоненты
163
+
164
+ - `Chip` — база таргета: классы состояний, фокус, `role="button"`, ограничения `disabled`
165
+ - `ChipDatePicker` — альтернатива для выбора конкретной даты; тот же чипс-таргет,
166
+ но с маскированным ручным вводом и связанным с ним локальным состоянием
167
+ - `ChipGroup` — рекомендуемый контейнер: отступы, перенос строк, режим `oneLine`
168
+ - `MonthYearField` — тот же выбор месяца в виде поля формы; источник
169
+ `IMonthYearFieldProps` и утилит `MonthYearPickerUtils`
170
+ - `DatePickerExtended` — база: владеет состоянием открытости, дропдауном, календарём
171
+ и корневым `<div>`; получает `renderTarget` и `renderDropdownHeaderTarget`
172
+ - `ChipMonthYearPickerTarget` — чипс-таргет этого компонента (экспортируется, но
173
+ собственного AI.md не имеет): читает открытость из `DatePickerExtendedContext`,
174
+ переключает её по клику и Enter/Space, рендерит `ChipClearButton` либо
175
+ `ChipDropdownArrow` в `postfix`
176
+
177
+ ---
178
+
179
+ ## Stories
180
+
181
+ Основные истории: `stories/Chips/ChipMonthYearPicker.stories.tsx`
182
+ Файлы примеров: `stories/Chips/examples/ChipMonthYearPicker/`
183
+
184
+ | Story | Example file | Что демонстрирует |
185
+ |---|---|---|
186
+ | `Playground` | `PlaygroundExample.tsx` | Интерактивный контроль `type`, `size`, `label`, `placeholder`, `displayedValue`, `disabled` |
187
+ | `Default` | `DefaultExample.tsx` | Базовое управляемое использование: `value` + `onChange` + `aria-label` кнопки очистки |
188
+ | `Types` | `TypesExample.tsx` | `TYPE_1` и `TYPE_2` |
189
+ | `Sizes` | `SizesExample.tsx` | Размеры SM / MD / LG |
190
+ | `WithCustomDisplayedValue` | `WithCustomDisplayedValueExample.tsx` | Подмена отображаемого значения через `displayedValue` |
191
+ | `VisualTests` | `VisualTestsExample.tsx` | Скриншот-регрессия: три размера с выбранным значением, у последнего открыт календарь |
192
+
193
+ ---
194
+
195
+ ## История изменений
196
+
197
+ | Дата | Изменение |
198
+ |---|---|
199
+ | 2026-09-07 | Создан компонент и документ (AI-Ready Phase 1) |
200
+
201
+ ---
202
+
203
+ ## Примеры использования
204
+
205
+ ### Default
206
+
207
+ `stories/Chips/examples/ChipMonthYearPicker/DefaultExample.tsx`
208
+
209
+ ```tsx
210
+ import React, { useState } from "react";
211
+ import { ChipMonthYearPicker, EComponentSize, EDropdownAlignment } from "@sberbusiness/triplex-next";
212
+
213
+ export const DefaultExample = () => {
214
+ const [value, setValue] = useState("");
215
+ return (
216
+ <ChipMonthYearPicker
217
+ value={value}
218
+ label="MonthYear label"
219
+ placeholder="Select to proceed"
220
+ onChange={setValue}
221
+ alignment={EDropdownAlignment.LEFT}
222
+ size={EComponentSize.MD}
223
+ clearButtonProps={{ "aria-label": "Очистить" }}
224
+ />
225
+ );
226
+ };
227
+ ```
228
+
229
+ ### Types
230
+
231
+ `stories/Chips/examples/ChipMonthYearPicker/TypesExample.tsx`
232
+
233
+ ```tsx
234
+ import React, { useState } from "react";
235
+ import { ChipMonthYearPicker, EChipType, EDropdownAlignment } from "@sberbusiness/triplex-next";
236
+
237
+ type TypeItemProps = {
238
+ type: EChipType;
239
+ label: string;
240
+ };
241
+
242
+ const TypeItem = ({ type, label }: TypeItemProps) => {
243
+ const [value, setValue] = useState("");
244
+
245
+ return (
246
+ <div>
247
+ <div style={{ marginBottom: 8, fontSize: 16, fontWeight: 700 }}>{label}</div>
248
+ <ChipMonthYearPicker
249
+ value={value}
250
+ label="MonthYear label"
251
+ placeholder="Select to proceed"
252
+ clearButtonProps={{ "aria-label": "Очистить" }}
253
+ type={type}
254
+ alignment={EDropdownAlignment.LEFT}
255
+ onChange={setValue}
256
+ />
257
+ </div>
258
+ );
259
+ };
260
+
261
+ const typeOptions = Object.values(EChipType).map((type) => ({
262
+ value: type,
263
+ label: type.toUpperCase(),
264
+ }));
265
+
266
+ export const TypesExample = () => (
267
+ <div style={{ display: "flex", flexDirection: "column", gap: 12 }}>
268
+ {typeOptions.map(({ value, label }) => (
269
+ <TypeItem key={value} type={value} label={label} />
270
+ ))}
271
+ </div>
272
+ );
273
+ ```
274
+
275
+ ### Sizes
276
+
277
+ `stories/Chips/examples/ChipMonthYearPicker/SizesExample.tsx`
278
+
279
+ ```tsx
280
+ import React, { useState } from "react";
281
+ import { ChipMonthYearPicker, EComponentSize, EDropdownAlignment } from "@sberbusiness/triplex-next";
282
+
283
+ type SizeItemProps = {
284
+ size: EComponentSize;
285
+ label: string;
286
+ };
287
+
288
+ const SizeItem = ({ size, label }: SizeItemProps) => {
289
+ const [value, setValue] = useState("");
290
+
291
+ return (
292
+ <div>
293
+ <div style={{ marginBottom: 8, fontSize: 16, fontWeight: 700 }}>{label}</div>
294
+ <ChipMonthYearPicker
295
+ size={size}
296
+ alignment={EDropdownAlignment.LEFT}
297
+ value={value}
298
+ label="MonthYear label"
299
+ placeholder="Select to proceed"
300
+ clearButtonProps={{ "aria-label": "Очистить" }}
301
+ onChange={setValue}
302
+ />
303
+ </div>
304
+ );
305
+ };
306
+
307
+ const sizeOptions = Object.values(EComponentSize).map((size) => ({
308
+ value: size,
309
+ label: size.toUpperCase(),
310
+ }));
311
+
312
+ export const SizesExample = () => (
313
+ <div style={{ display: "flex", flexDirection: "column", gap: 12 }}>
314
+ {sizeOptions.map(({ value, label }) => (
315
+ <SizeItem key={value} size={value} label={label} />
316
+ ))}
317
+ </div>
318
+ );
319
+ ```
320
+
321
+ ### WithCustomDisplayedValue
322
+
323
+ `stories/Chips/examples/ChipMonthYearPicker/WithCustomDisplayedValueExample.tsx`
324
+
325
+ ```tsx
326
+ import React, { useState } from "react";
327
+ import { ChipMonthYearPicker, EComponentSize, EDropdownAlignment } from "@sberbusiness/triplex-next";
328
+
329
+ export const WithCustomDisplayedValueExample = () => {
330
+ const [value, setValue] = useState("19700101");
331
+ return (
332
+ <ChipMonthYearPicker
333
+ value={value}
334
+ label="MonthYear label"
335
+ placeholder="Select to proceed"
336
+ onChange={setValue}
337
+ alignment={EDropdownAlignment.LEFT}
338
+ size={EComponentSize.MD}
339
+ displayedValue="MonthYear value"
340
+ />
341
+ );
342
+ };
343
+ ```
344
+