@sberbusiness/triplex-next-mcp-server 1.44.0-beta → 1.46.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 (89) hide show
  1. package/README.md +7 -6
  2. package/bundle/components/AlertContext.md +11 -8
  3. package/bundle/components/AlertProcess.md +13 -10
  4. package/bundle/components/Badge.md +6 -3
  5. package/bundle/components/Button.md +46 -43
  6. package/bundle/components/ButtonDropdownExtended.md +3 -2
  7. package/bundle/components/ButtonIcon.md +7 -4
  8. package/bundle/components/Calendar.md +62 -59
  9. package/bundle/components/Caption.md +26 -23
  10. package/bundle/components/CardAction.md +615 -0
  11. package/bundle/components/Checkbox.md +32 -29
  12. package/bundle/components/CheckboxTreeExtended.md +9 -5
  13. package/bundle/components/Chip.md +51 -47
  14. package/bundle/components/ChipMonthYearPicker.md +344 -0
  15. package/bundle/components/ChipMultiselect.md +1251 -0
  16. package/bundle/components/ChipOptions.md +329 -0
  17. package/bundle/components/ChipSort.md +333 -0
  18. package/bundle/components/ChipSuggest.md +587 -0
  19. package/bundle/components/CodeText.md +26 -23
  20. package/bundle/components/Col.md +1 -2
  21. package/bundle/components/CollapsibleTree.md +8 -5
  22. package/bundle/components/DateField.md +222 -303
  23. package/bundle/components/DatePickerExtended.md +3 -1
  24. package/bundle/components/Dropdown.md +33 -28
  25. package/bundle/components/EmptyView.md +12 -5
  26. package/bundle/components/FooterPage.md +6 -2
  27. package/bundle/components/FormField.md +47 -42
  28. package/bundle/components/FormGroup.md +192 -52
  29. package/bundle/components/Header.md +491 -211
  30. package/bundle/components/HeaderPage.md +6 -2
  31. package/bundle/components/HelpBox.md +7 -1
  32. package/bundle/components/ImageGallery.md +33 -34
  33. package/bundle/components/ImageGalleryExtended.md +33 -34
  34. package/bundle/components/Island.md +16 -13
  35. package/bundle/components/IslandAccordion.md +443 -152
  36. package/bundle/components/IslandWidget.md +622 -157
  37. package/bundle/components/LightBox.md +14 -12
  38. package/bundle/components/Link.md +211 -96
  39. package/bundle/components/ListActionItem.md +7 -4
  40. package/bundle/components/ListItem.md +11 -8
  41. package/bundle/components/ListItemControlsButton.md +16 -13
  42. package/bundle/components/ListItemControlsButtonDropdown.md +9 -6
  43. package/bundle/components/ListItemSelectable.md +7 -4
  44. package/bundle/components/ListMasterFooter.md +8 -5
  45. package/bundle/components/ListMasterHeader.md +8 -5
  46. package/bundle/components/ListSortableItem.md +11 -8
  47. package/bundle/components/ListTableItem.md +7 -4
  48. package/bundle/components/LoaderMiddle.md +7 -4
  49. package/bundle/components/LoaderScreen.md +11 -8
  50. package/bundle/components/LoaderSmall.md +7 -4
  51. package/bundle/components/Marker.md +184 -69
  52. package/bundle/components/MarkerStatus.md +206 -88
  53. package/bundle/components/MaskedField.md +4 -5
  54. package/bundle/components/MasterTable.md +602 -0
  55. package/bundle/components/ModalWindow.md +7 -4
  56. package/bundle/components/MonthYearField.md +3 -1
  57. package/bundle/components/MultiselectField.md +2183 -132
  58. package/bundle/components/Notification.md +12 -9
  59. package/bundle/components/Overlay.md +9 -4
  60. package/bundle/components/Page.md +2 -2
  61. package/bundle/components/Pagination.md +15 -8
  62. package/bundle/components/Row.md +1 -1
  63. package/bundle/components/SelectExtendedField.md +3 -3
  64. package/bundle/components/SelectField.md +466 -148
  65. package/bundle/components/SliderExtended.md +39 -36
  66. package/bundle/components/SmallInput.md +194 -51
  67. package/bundle/components/Suggest.md +535 -99
  68. package/bundle/components/SwipeableArea.md +428 -79
  69. package/bundle/components/TableBasic.md +19 -11
  70. package/bundle/components/TabsExtended.md +24 -21
  71. package/bundle/components/Tag.md +6 -2
  72. package/bundle/components/Text.md +28 -25
  73. package/bundle/components/TextField.md +3 -4
  74. package/bundle/components/ThemeProvider.md +50 -1
  75. package/bundle/components/Title.md +26 -23
  76. package/bundle/components/Tooltip.md +24 -21
  77. package/bundle/components/TopOverlay.md +7 -4
  78. package/bundle/guides/codestyle.md +3 -0
  79. package/bundle/guides/context.md +84 -12
  80. package/bundle/guides/guidelines.md +321 -0
  81. package/bundle/guides/template.md +22 -12
  82. package/bundle/manifest.json +75 -17
  83. package/bundle/release-notes/1.45.0.mdx +117 -0
  84. package/bundle/release-notes/1.46.0.mdx +66 -0
  85. package/bundle/release-notes/1.47.0.mdx +7 -0
  86. package/bundle/tokens.json +6362 -0
  87. package/dist/index.js +177 -28
  88. package/dist/index.js.map +1 -1
  89. package/package.json +1 -1
@@ -3,20 +3,20 @@ component: Checkbox
3
3
  category: Inputs
4
4
  related: [CheckboxXGroup, CheckboxYGroup, CheckboxTree, CheckboxTreeExtended]
5
5
  tokens:
6
- - --triplex-next-Checkbox-Background_Default
7
- - --triplex-next-Checkbox-BorderColor_Default
8
- - --triplex-next-Checkbox-Checkmark_Fill_Default
9
- - --triplex-next-Checkbox-Background_Hover
10
- - --triplex-next-Checkbox-BorderColor_Hover
11
- - --triplex-next-Checkbox-Background_Checked_Default
12
- - --triplex-next-Checkbox-BorderColor_Checked_Default
13
- - --triplex-next-Checkbox-Background_Disabled
14
- - --triplex-next-Checkbox-BorderColor_Disabled
15
- - --triplex-next-Checkbox-Background_Checked_Disabled
16
- - --triplex-next-Checkbox-BorderColor_Checked_Disabled
17
- - --triplex-next-Checkbox-Checkmark_Fill_Disabled
18
- - --triplex-next-Checkbox-BorderColor_Focus
19
- - --triplex-next-Checkbox-Background_Checked_Hover
6
+ - Checkbox.Background_Default
7
+ - Checkbox.BorderColor_Default
8
+ - Checkbox.Checkmark_Fill_Default
9
+ - Checkbox.Background_Hover
10
+ - Checkbox.BorderColor_Hover
11
+ - Checkbox.Background_Checked_Default
12
+ - Checkbox.BorderColor_Checked_Default
13
+ - Checkbox.Background_Disabled
14
+ - Checkbox.BorderColor_Disabled
15
+ - Checkbox.Background_Checked_Disabled
16
+ - Checkbox.BorderColor_Checked_Disabled
17
+ - Checkbox.Checkmark_Fill_Disabled
18
+ - Checkbox.BorderColor_Focus
19
+ - Checkbox.Background_Checked_Hover
20
20
  stories: stories/Checkbox/Checkbox.stories.tsx
21
21
  version: "1.0"
22
22
  ---
@@ -62,21 +62,24 @@ version: "1.0"
62
62
 
63
63
  ## Дизайн-токены
64
64
 
65
- ```
66
- --triplex-next-Checkbox-Background_Default
67
- --triplex-next-Checkbox-BorderColor_Default
68
- --triplex-next-Checkbox-Checkmark_Fill_Default
69
- --triplex-next-Checkbox-Background_Hover
70
- --triplex-next-Checkbox-BorderColor_Hover
71
- --triplex-next-Checkbox-Background_Checked_Default
72
- --triplex-next-Checkbox-BorderColor_Checked_Default
73
- --triplex-next-Checkbox-Background_Disabled
74
- --triplex-next-Checkbox-BorderColor_Disabled
75
- --triplex-next-Checkbox-Background_Checked_Disabled
76
- --triplex-next-Checkbox-BorderColor_Checked_Disabled
77
- --triplex-next-Checkbox-Checkmark_Fill_Disabled
78
- --triplex-next-Checkbox-BorderColor_Focus
79
- --triplex-next-Checkbox-Background_Checked_Hover
65
+ Переопределяются через `ThemeProvider` (prop `tokens`) — см. `ThemeProvider-ai.md` →
66
+ «Как переопределять токены». Значения по умолчанию — `src/components/DesignTokens/components/Checkbox.ts`.
67
+
68
+ ```text
69
+ Checkbox.Background_Default
70
+ Checkbox.BorderColor_Default
71
+ Checkbox.Checkmark_Fill_Default
72
+ Checkbox.Background_Hover
73
+ Checkbox.BorderColor_Hover
74
+ Checkbox.Background_Checked_Default
75
+ Checkbox.BorderColor_Checked_Default
76
+ Checkbox.Background_Disabled
77
+ Checkbox.BorderColor_Disabled
78
+ Checkbox.Background_Checked_Disabled
79
+ Checkbox.BorderColor_Checked_Disabled
80
+ Checkbox.Checkmark_Fill_Disabled
81
+ Checkbox.BorderColor_Focus
82
+ Checkbox.Background_Checked_Hover
80
83
  ```
81
84
 
82
85
  ---
@@ -3,7 +3,7 @@ component: CheckboxTreeExtended
3
3
  category: Inputs
4
4
  related: [CheckboxTree, CollapsibleTreeExtended, Checkbox]
5
5
  tokens:
6
- - --triplex-next-Checkbox-BorderColor_Focus
6
+ - Checkbox.BorderColor_Focus
7
7
  stories: stories/CheckboxTreeExtended/CheckboxTreeExtended.stories.tsx
8
8
  version: "1.0"
9
9
  ---
@@ -88,11 +88,15 @@ render-функции узла.
88
88
 
89
89
  ## Дизайн-токены
90
90
 
91
- Собственных токенов компонент не вводит. Единственная CSS-переменная в стилях —
92
- у стрелки раскрытия (см. «Инварианты», сейчас не отрисовывается):
91
+ Переопределяются через `ThemeProvider` (prop `tokens`) — см. `ThemeProvider-ai.md` →
92
+ «Как переопределять токены». Значения по умолчанию — `src/components/DesignTokens/components/Checkbox.ts`.
93
93
 
94
- ```
95
- --triplex-next-Checkbox-BorderColor_Focus
94
+ Собственных токенов компонент не вводит. Единственный токен в стилях — общий
95
+ `Checkbox.BorderColor_Focus`: тот же токен рисует фокус чекбокса, а здесь —
96
+ `:focus-visible` стрелки раскрытия (см. «Инварианты», сейчас не отрисовывается):
97
+
98
+ ```text
99
+ Checkbox.BorderColor_Focus
96
100
  ```
97
101
 
98
102
  Размеры и цвета самих чекбоксов приходят из `Checkbox`, вертикальные отступы
@@ -1,27 +1,27 @@
1
1
  ---
2
2
  component: Chip
3
3
  category: Chips
4
- related: [ChipGroup, ChipIcon, ChipOptions, ChipSelect, ChipMultiselect, ChipSort, ChipSuggest, ChipDatePicker, ChipClearButton, ChipDropdownArrow, Badge, IconWrapper]
4
+ related: [ChipGroup, ChipIcon, ChipOptions, ChipSelect, ChipMultiselect, ChipSort, ChipSuggest, ChipDatePicker, ChipMonthYearPicker, ChipClearButton, ChipDropdownArrow, Badge, IconWrapper]
5
5
  tokens:
6
- - --triplex-next-Chip-Background_Type1_Default
7
- - --triplex-next-Chip-Background_Type1_Hover
8
- - --triplex-next-Chip-Background_Type2_Default
9
- - --triplex-next-Chip-Background_Type2_Hover
10
- - --triplex-next-Chip-Background_Active
11
- - --triplex-next-Chip-Background_Disabled
12
- - --triplex-next-Chip-Background_Selected_Default
13
- - --triplex-next-Chip-Background_Selected_Hover
14
- - --triplex-next-Chip-Background_Selected_Active
15
- - --triplex-next-Chip-Background_Selected_Disabled
16
- - --triplex-next-Chip-Color_Default
17
- - --triplex-next-Chip-Color_Hover
18
- - --triplex-next-Chip-Color_Active
19
- - --triplex-next-Chip-Color_Disabled
20
- - --triplex-next-Chip-Color_Selected_Default
21
- - --triplex-next-Chip-Color_Selected_Hover
22
- - --triplex-next-Chip-Color_Selected_Active
23
- - --triplex-next-Chip-Color_Selected_Disabled
24
- - --triplex-next-Chip-Shadow_Focus
6
+ - Chip.Background_Type1_Default
7
+ - Chip.Background_Type1_Hover
8
+ - Chip.Background_Type2_Default
9
+ - Chip.Background_Type2_Hover
10
+ - Chip.Background_Active
11
+ - Chip.Background_Disabled
12
+ - Chip.Background_Selected_Default
13
+ - Chip.Background_Selected_Hover
14
+ - Chip.Background_Selected_Active
15
+ - Chip.Background_Selected_Disabled
16
+ - Chip.Color_Default
17
+ - Chip.Color_Hover
18
+ - Chip.Color_Active
19
+ - Chip.Color_Disabled
20
+ - Chip.Color_Selected_Default
21
+ - Chip.Color_Selected_Hover
22
+ - Chip.Color_Selected_Active
23
+ - Chip.Color_Selected_Disabled
24
+ - Chip.Shadow_Focus
25
25
  stories: stories/Chips/Chip.stories.tsx
26
26
  version: "1.0"
27
27
  ---
@@ -33,7 +33,7 @@ version: "1.0"
33
33
  Компактный интерактивный элемент-«чипс»: выполняет действие по нажатию и отображает
34
34
  выбранное (`selected`) состояние. Одновременно служит базой для всего семейства Chip*
35
35
  — поверх него построены `ChipIcon`, `ChipOptions`, а также target-элементы
36
- `ChipSelect`, `ChipMultiselect`, `ChipSuggest`, `ChipDatePicker`.
36
+ `ChipSelect`, `ChipMultiselect`, `ChipSuggest`, `ChipDatePicker`, `ChipMonthYearPicker`.
37
37
 
38
38
  Используй когда: нужен переключаемый фильтр, тег или компактная кнопка-действие
39
39
  в ряду однотипных элементов.
@@ -99,7 +99,7 @@ version: "1.0"
99
99
  вызовут `onClick` / `onKeyDown`. Не полагайся на `disabled` как на защиту в логике —
100
100
  проверяй флаг в самом обработчике, если это критично.
101
101
  - **`selected` и `disabled` совместимы** — есть отдельные токены
102
- `--triplex-next-Chip-*_Selected_Disabled`.
102
+ `Chip.*_Selected_Disabled`.
103
103
  - Ширина ограничена: `min-width: 40px`, `max-width: 264px`. Длинный `children`
104
104
  обрезается многоточием, а не переносится.
105
105
 
@@ -107,28 +107,31 @@ version: "1.0"
107
107
 
108
108
  ## Дизайн-токены
109
109
 
110
- Паттерн: `--triplex-next-Chip-{Property}_{Modifier}_{State}`
110
+ Переопределяются через `ThemeProvider` (prop `tokens`) — см. `ThemeProvider-ai.md` →
111
+ «Как переопределять токены». Значения по умолчанию — `src/components/DesignTokens/components/Chip.ts`.
112
+
113
+ Паттерн: `Chip.{Property}_{Modifier}_{State}`
111
114
 
112
115
  ```text
113
- --triplex-next-Chip-Background_Type1_Default
114
- --triplex-next-Chip-Background_Type1_Hover
115
- --triplex-next-Chip-Background_Type2_Default
116
- --triplex-next-Chip-Background_Type2_Hover
117
- --triplex-next-Chip-Background_Active
118
- --triplex-next-Chip-Background_Disabled
119
- --triplex-next-Chip-Background_Selected_Default
120
- --triplex-next-Chip-Background_Selected_Hover
121
- --triplex-next-Chip-Background_Selected_Active
122
- --triplex-next-Chip-Background_Selected_Disabled
123
- --triplex-next-Chip-Color_Default
124
- --triplex-next-Chip-Color_Hover
125
- --triplex-next-Chip-Color_Active
126
- --triplex-next-Chip-Color_Disabled
127
- --triplex-next-Chip-Color_Selected_Default
128
- --triplex-next-Chip-Color_Selected_Hover
129
- --triplex-next-Chip-Color_Selected_Active
130
- --triplex-next-Chip-Color_Selected_Disabled
131
- --triplex-next-Chip-Shadow_Focus
116
+ Chip.Background_Type1_Default
117
+ Chip.Background_Type1_Hover
118
+ Chip.Background_Type2_Default
119
+ Chip.Background_Type2_Hover
120
+ Chip.Background_Active
121
+ Chip.Background_Disabled
122
+ Chip.Background_Selected_Default
123
+ Chip.Background_Selected_Hover
124
+ Chip.Background_Selected_Active
125
+ Chip.Background_Selected_Disabled
126
+ Chip.Color_Default
127
+ Chip.Color_Hover
128
+ Chip.Color_Active
129
+ Chip.Color_Disabled
130
+ Chip.Color_Selected_Default
131
+ Chip.Color_Selected_Hover
132
+ Chip.Color_Selected_Active
133
+ Chip.Color_Selected_Disabled
134
+ Chip.Shadow_Focus
132
135
  ```
133
136
 
134
137
  Токены `_Type1_` / `_Type2_` существуют только для `Background` в состояниях
@@ -149,7 +152,7 @@ Default и Hover. Цвет текста (`Color_*`) от типа не зави
149
152
  - **Класс `.chipGroupItem`** выставляется всегда, наравне с `.chip`. Объявлен
150
153
  в `styles/Chip.module.less` и служит общим маркером «элемент верхнего уровня
151
154
  в ряду чипсов»: его проставляют себе все члены семейства — `Chip`, `ChipSort`,
152
- `ChipMultiselect`, `ChipSelect`, `ChipDatePicker`, `ChipSuggest`. Причём
155
+ `ChipMultiselect`, `ChipSelect`, `ChipDatePicker`, `ChipMonthYearPicker`, `ChipSuggest`. Причём
153
156
  `.chipGroupItem` не всегда совпадает с `.chip`: в `ChipSelect` / `ChipMultiselect`
154
157
  `.chip` лежит внутри элемента с `.chipGroupItem`. Раскладка `ChipGroup` на этот
155
158
  класс не опирается — в её стилях он не встречается. Не удалять и не переименовывать.
@@ -174,8 +177,8 @@ Default и Hover. Цвет текста (`Color_*`) от типа не зави
174
177
  компонент не генерирует (у `<span role="button">` нет нативного поведения кнопки),
175
178
  внешний `onKeyDown` вызывается всегда и после `preventDefault`. Если чипс должен
176
179
  срабатывать с клавиатуры, потребитель обрабатывает Enter/Space сам через `onKeyDown`.
177
- Обёртки семейства (`ChipSelect`, `ChipSuggest`, `ChipDatePicker`) делают это на своём уровне.
178
- - Фокус-стиль через `:focus-visible` (`--triplex-next-Chip-Shadow_Focus`) — виден только
180
+ Обёртки семейства (`ChipSelect`, `ChipSuggest`, `ChipDatePicker`, `ChipMonthYearPicker`) делают это на своём уровне.
181
+ - Фокус-стиль через `:focus-visible` (`Chip.Shadow_Focus`) — виден только
179
182
  при клавиатурной навигации. Нативная обводка на корневом элементе намеренно отключена
180
183
  (`outline: none` в LESS) в пользу `box-shadow` — убирать правило нельзя, иначе фокус
181
184
  отрисуется дважды.
@@ -203,8 +206,8 @@ Default и Hover. Цвет текста (`Color_*`) от типа не зави
203
206
  - `ChipDropdownArrow` — стрелка дропдауна для `postfix`; объявлена как `React.FC`
204
207
  (не `forwardRef`), собственных обработчиков не имеет. Props: **обязательный**
205
208
  `rotated: boolean` (даёт класс `.rotated`) и `size?: EComponentSize`
206
- - `ChipSelect`, `ChipMultiselect`, `ChipSuggest`, `ChipDatePicker`, `ChipSort` —
207
- составные компоненты, использующие `Chip` как target-элемент дропдауна
209
+ - `ChipSelect`, `ChipMultiselect`, `ChipSuggest`, `ChipDatePicker`, `ChipMonthYearPicker`,
210
+ `ChipSort` — составные компоненты, использующие `Chip` как target-элемент дропдауна
208
211
  - `Badge` (`Badge.Dot`) — значок уведомлений при `showNotificationIcon`
209
212
  - `IconWrapper` — обёртка `prefix` / `postfix`, добавляет классы `hoverable` / `disabled`,
210
213
  управляющие цветом иконки при взаимодействии
@@ -236,6 +239,7 @@ Default и Hover. Цвет текста (`Color_*`) от типа не зави
236
239
  | 2026-07-29 | Создан документ (TRI-26, AI-Ready Phase 1) |
237
240
  | 2026-07-29 | AI-рефакторинг (TRI-26): codestyle-чистка `Chip.tsx` (константы-маппинги в UPPER_SNAKE_CASE, эквивалентные упрощения в `clsx`, JSDoc на `children` и `handleKeyDown`), unit-тесты расширены с 5 до 22 кейсов; публичный API, DOM и визуал не изменены |
238
241
  | 2026-07-29 | Правки по ревью PR #487: уточнена атрибуция класса `.chipGroupItem` (его проставляет семейство Chip*, а не раскладка `ChipGroup`) и описание API `ChipClearButton` / `ChipDropdownArrow` |
242
+ | 2026-09-07 | В семейство добавлен `ChipMonthYearPicker` — упомянут в списках потребителей `Chip` и `.chipGroupItem` |
239
243
 
240
244
  ---
241
245
 
@@ -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="мм.гггг"
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="мм.гггг"
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="мм.гггг"
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="мм.гггг"
336
+ onChange={setValue}
337
+ alignment={EDropdownAlignment.LEFT}
338
+ size={EComponentSize.MD}
339
+ displayedValue="MonthYear value"
340
+ />
341
+ );
342
+ };
343
+ ```
344
+