@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.
- package/README.md +7 -6
- package/bundle/components/AlertContext.md +11 -8
- package/bundle/components/AlertProcess.md +13 -10
- package/bundle/components/Badge.md +6 -3
- package/bundle/components/Button.md +46 -43
- package/bundle/components/ButtonDropdownExtended.md +3 -2
- package/bundle/components/ButtonIcon.md +7 -4
- package/bundle/components/Calendar.md +62 -59
- package/bundle/components/Caption.md +26 -23
- package/bundle/components/CardAction.md +615 -0
- package/bundle/components/Checkbox.md +32 -29
- package/bundle/components/CheckboxTreeExtended.md +9 -5
- package/bundle/components/Chip.md +51 -47
- package/bundle/components/ChipMonthYearPicker.md +344 -0
- package/bundle/components/ChipMultiselect.md +1251 -0
- package/bundle/components/ChipOptions.md +329 -0
- package/bundle/components/ChipSort.md +333 -0
- package/bundle/components/ChipSuggest.md +587 -0
- package/bundle/components/CodeText.md +26 -23
- package/bundle/components/Col.md +1 -2
- package/bundle/components/CollapsibleTree.md +8 -5
- package/bundle/components/DateField.md +222 -303
- package/bundle/components/DatePickerExtended.md +3 -1
- package/bundle/components/Dropdown.md +33 -28
- package/bundle/components/EmptyView.md +12 -5
- package/bundle/components/FooterPage.md +6 -2
- package/bundle/components/FormField.md +47 -42
- package/bundle/components/FormGroup.md +192 -52
- package/bundle/components/Header.md +491 -211
- package/bundle/components/HeaderPage.md +6 -2
- package/bundle/components/HelpBox.md +7 -1
- package/bundle/components/ImageGallery.md +33 -34
- package/bundle/components/ImageGalleryExtended.md +33 -34
- package/bundle/components/Island.md +16 -13
- package/bundle/components/IslandAccordion.md +443 -152
- package/bundle/components/IslandWidget.md +622 -157
- package/bundle/components/LightBox.md +14 -12
- package/bundle/components/Link.md +211 -96
- package/bundle/components/ListActionItem.md +7 -4
- package/bundle/components/ListItem.md +11 -8
- package/bundle/components/ListItemControlsButton.md +16 -13
- package/bundle/components/ListItemControlsButtonDropdown.md +9 -6
- package/bundle/components/ListItemSelectable.md +7 -4
- package/bundle/components/ListMasterFooter.md +8 -5
- package/bundle/components/ListMasterHeader.md +8 -5
- package/bundle/components/ListSortableItem.md +11 -8
- package/bundle/components/ListTableItem.md +7 -4
- package/bundle/components/LoaderMiddle.md +7 -4
- package/bundle/components/LoaderScreen.md +11 -8
- package/bundle/components/LoaderSmall.md +7 -4
- package/bundle/components/Marker.md +184 -69
- package/bundle/components/MarkerStatus.md +206 -88
- package/bundle/components/MaskedField.md +4 -5
- package/bundle/components/MasterTable.md +602 -0
- package/bundle/components/ModalWindow.md +7 -4
- package/bundle/components/MonthYearField.md +3 -1
- package/bundle/components/MultiselectField.md +2183 -132
- package/bundle/components/Notification.md +12 -9
- package/bundle/components/Overlay.md +9 -4
- package/bundle/components/Page.md +2 -2
- package/bundle/components/Pagination.md +15 -8
- package/bundle/components/Row.md +1 -1
- package/bundle/components/SelectExtendedField.md +3 -3
- package/bundle/components/SelectField.md +466 -148
- package/bundle/components/SliderExtended.md +39 -36
- package/bundle/components/SmallInput.md +194 -51
- package/bundle/components/Suggest.md +535 -99
- package/bundle/components/SwipeableArea.md +428 -79
- package/bundle/components/TableBasic.md +19 -11
- package/bundle/components/TabsExtended.md +24 -21
- package/bundle/components/Tag.md +6 -2
- package/bundle/components/Text.md +28 -25
- package/bundle/components/TextField.md +3 -4
- package/bundle/components/ThemeProvider.md +50 -1
- package/bundle/components/Title.md +26 -23
- package/bundle/components/Tooltip.md +24 -21
- package/bundle/components/TopOverlay.md +7 -4
- package/bundle/guides/codestyle.md +3 -0
- package/bundle/guides/context.md +84 -12
- package/bundle/guides/guidelines.md +321 -0
- package/bundle/guides/template.md +22 -12
- package/bundle/manifest.json +75 -17
- package/bundle/release-notes/1.45.0.mdx +117 -0
- package/bundle/release-notes/1.46.0.mdx +66 -0
- package/bundle/release-notes/1.47.0.mdx +7 -0
- package/bundle/tokens.json +6362 -0
- package/dist/index.js +177 -28
- package/dist/index.js.map +1 -1
- 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
|
-
-
|
|
7
|
-
-
|
|
8
|
-
-
|
|
9
|
-
-
|
|
10
|
-
-
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
14
|
-
-
|
|
15
|
-
-
|
|
16
|
-
-
|
|
17
|
-
-
|
|
18
|
-
-
|
|
19
|
-
-
|
|
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
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
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
|
-
-
|
|
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
|
-
|
|
92
|
-
|
|
91
|
+
Переопределяются через `ThemeProvider` (prop `tokens`) — см. `ThemeProvider-ai.md` →
|
|
92
|
+
«Как переопределять токены». Значения по умолчанию — `src/components/DesignTokens/components/Checkbox.ts`.
|
|
93
93
|
|
|
94
|
-
|
|
95
|
-
|
|
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
|
-
-
|
|
7
|
-
-
|
|
8
|
-
-
|
|
9
|
-
-
|
|
10
|
-
-
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
14
|
-
-
|
|
15
|
-
-
|
|
16
|
-
-
|
|
17
|
-
-
|
|
18
|
-
-
|
|
19
|
-
-
|
|
20
|
-
-
|
|
21
|
-
-
|
|
22
|
-
-
|
|
23
|
-
-
|
|
24
|
-
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
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` (
|
|
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`, `
|
|
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
|
+
|