@sberbusiness/triplex-next-mcp-server 0.36.0-beta0 → 1.41.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 (46) hide show
  1. package/bundle/components/AlertContext.md +268 -0
  2. package/bundle/components/Button.md +5 -2
  3. package/bundle/components/ButtonDropdown.md +9 -1
  4. package/bundle/components/ButtonDropdownExtended.md +422 -0
  5. package/bundle/components/ButtonIcon.md +7 -1
  6. package/bundle/components/Calendar.md +183 -368
  7. package/bundle/components/Caption.md +291 -0
  8. package/bundle/components/Chip.md +310 -314
  9. package/bundle/components/CodeText.md +197 -0
  10. package/bundle/components/Col.md +311 -162
  11. package/bundle/components/CollapsibleTree.md +6 -3
  12. package/bundle/components/CollapsibleTreeExtended.md +6 -2
  13. package/bundle/components/Dropdown.md +748 -346
  14. package/bundle/components/FormField.md +468 -232
  15. package/bundle/components/IconWrapper.md +142 -89
  16. package/bundle/components/Island.md +221 -129
  17. package/bundle/components/KeyDownListener.md +215 -102
  18. package/bundle/components/LightBox.md +2252 -233
  19. package/bundle/components/List.md +26 -1
  20. package/bundle/components/ListActionItem.md +157 -0
  21. package/bundle/components/ListItem.md +34 -9
  22. package/bundle/components/ListItemSelectable.md +2 -2
  23. package/bundle/components/ListMaster.md +4 -5
  24. package/bundle/components/ListTableItem.md +391 -0
  25. package/bundle/components/LoaderMiddle.md +265 -0
  26. package/bundle/components/LoaderScreen.md +178 -81
  27. package/bundle/components/Notification.md +21 -21
  28. package/bundle/components/Page.md +1 -0
  29. package/bundle/components/Portal.md +131 -67
  30. package/bundle/components/Row.md +171 -69
  31. package/bundle/components/Text.md +320 -0
  32. package/bundle/components/TextField.md +364 -97
  33. package/bundle/components/ThemeProvider.md +305 -117
  34. package/bundle/components/Title.md +296 -0
  35. package/bundle/components/Tooltip.md +421 -181
  36. package/bundle/guides/commits.md +126 -24
  37. package/bundle/guides/context.md +1 -1
  38. package/bundle/guides/tests.md +42 -0
  39. package/bundle/manifest.json +109 -23
  40. package/bundle/release-notes/1.37.0.mdx +42 -1
  41. package/bundle/release-notes/1.38.0.mdx +36 -0
  42. package/bundle/release-notes/1.39.0.mdx +66 -0
  43. package/bundle/release-notes/1.40.0.mdx +27 -0
  44. package/bundle/release-notes/1.41.0.mdx +83 -0
  45. package/bundle/release-notes/1.42.0.mdx +7 -0
  46. package/package.json +1 -1
@@ -0,0 +1,268 @@
1
+ ---
2
+ component: AlertContext
3
+ category: Alert
4
+ related: [AlertProcess]
5
+ tokens:
6
+ - --triplex-next-AlertContext-Info_Color
7
+ - --triplex-next-AlertContext-Warning_Color
8
+ - --triplex-next-AlertContext-Error_Color
9
+ - --triplex-next-AlertContext-System_Color
10
+ stories: stories/Alerts/AlertContext.stories.tsx
11
+ version: "1.0"
12
+ ---
13
+
14
+ # AlertContext
15
+
16
+ ## Назначение
17
+
18
+ Инлайновое контекстное предупреждение: строка «иконка + короткий текст», которая
19
+ поясняет или уточняет соседний элемент интерфейса. Рендерится в `<span>` с
20
+ `role="alert"`, иконка выбирается автоматически по `type`, текст оборачивается в
21
+ `Text` с размером `ETextSize.B4`.
22
+
23
+ Используй когда: нужно дать пояснение, предупреждение или сообщение об ошибке
24
+ рядом с полем, кнопкой или блоком контента — без рамки, фона и кнопки закрытия.
25
+
26
+ Не используй когда: нужен полноценный блок-уведомление с фоном, скруглением,
27
+ ссылками, спойлером и кнопкой закрытия — это `AlertProcess`. Для всплывающих
28
+ уведомлений поверх интерфейса — `Notification`.
29
+
30
+ ---
31
+
32
+ ## Варианты и props
33
+
34
+ ### Обязательные props
35
+
36
+ | Prop | Тип | Описание |
37
+ | ------ | ----------------------------------------- | ------------------------------------------------------------------------------------------------------------ |
38
+ | `type` | `Exclude<EAlertType, EAlertType.FEATURE>` | Тип предупреждения: `INFO` / `WARNING` / `ERROR` / `SYSTEM`. Определяет и иконку по умолчанию, и цвет текста |
39
+
40
+ ### Опциональные props
41
+
42
+ | Prop | Тип | По умолчанию | Описание |
43
+ | ------------------------------ | ----------------- | ---------------- | -------------------------------------------------------------------------- |
44
+ | `renderIcon` | `React.ReactNode` | иконка по `type` | Полностью заменяет иконку по умолчанию |
45
+ | `children` | `React.ReactNode` | — | Текст предупреждения. Всегда оборачивается в `Text`, наружу не «протекает» |
46
+ | `...HTMLSpanElementAttributes` | — | — | Все стандартные атрибуты `<span>` |
47
+
48
+ ### Ограничения по типам
49
+
50
+ - `EAlertType.FEATURE` **не поддерживается** и исключён на уровне типа
51
+ (`Exclude<EAlertType, EAlertType.FEATURE>`). Класса `.alertTypeFeature` в
52
+ `AlertContext.module.less` нет — общий `ALERT_TYPE_TO_CLASS_NAME_MAP` содержит
53
+ ветку `FEATURE` только ради `AlertProcess`. Если обойти типизацию (`as`) и
54
+ передать `FEATURE`, компонент отрендерится без иконки и без цветового класса.
55
+ - Иконки по умолчанию фиксированы: `InfoStrokeStsIcon16` (`paletteIndex={3}`),
56
+ `WarningStrokeStsIcon16` (`2`), `ErrorStrokeStsIcon16` (`1`),
57
+ `SystemStrokeStsIcon16` (`4`). Менять `paletteIndex` нельзя — они согласованы
58
+ с цветовыми токенами.
59
+
60
+ ---
61
+
62
+ ## Дизайн-токены
63
+
64
+ ```text
65
+ --triplex-next-AlertContext-Info_Color // цвет текста для type=INFO
66
+ --triplex-next-AlertContext-Warning_Color // цвет текста для type=WARNING
67
+ --triplex-next-AlertContext-Error_Color // цвет текста для type=ERROR
68
+ --triplex-next-AlertContext-System_Color // цвет текста для type=SYSTEM
69
+ ```
70
+
71
+ Значения — в `src/components/DesignTokens/components/AlertContext.ts`. Обрати
72
+ внимание: `Info_Color`, `Warning_Color` и `System_Color` ссылаются на один и тот
73
+ же нейтральный цвет (`ColorDarkNeutralAlpha.0` / `ColorNeutralAlpha.0`),
74
+ выделен цветом только `Error_Color`. Типы различаются прежде всего иконкой, а не
75
+ цветом текста.
76
+
77
+ Размеры шрифта токенами не задаются — типографику целиком определяет `Text`
78
+ с `ETextSize.B4` (класс `.b4` в `Typography/styles/Text.module.less`).
79
+
80
+ ---
81
+
82
+ ## Инварианты
83
+
84
+ - **`forwardRef`** — обязателен, target — `HTMLSpanElement`. Не убирать.
85
+ - **Корневой элемент `<span>` с `role="alert"`** — не менять ни тег, ни роль.
86
+ Тег `<span>` выбран ради валидности вложения в инлайновый контекст, но
87
+ `display: flex` делает элемент **блочным** flex-контейнером: из текстового
88
+ потока он выпадает. Не рассчитывай на инлайновое обтекание.
89
+ - **`type` исключает `EAlertType.FEATURE`** — сужение типа публичное, расширять
90
+ без добавления стилей и иконки нельзя.
91
+ - **`renderIcon` переопределяет иконку через `||`, а не `??`** — намеренно:
92
+ falsy-значение (`false`, `null`) означает «показать иконку по умолчанию». Замена
93
+ на `??` изменит поведение для `renderIcon={false}`.
94
+ - **CSS-классы `alertContext`, `alertContextText`, `alertTypeInfo`,
95
+ `alertTypeWarning`, `alertTypeError`, `alertTypeSystem`** — проверяются в
96
+ unit-тестах, не переименовывать.
97
+ - **`Text` получает только `size` и `className`** — никакого `type`. Цвет —
98
+ зона ответственности `AlertContext`, см. «Подводные камни». Тест
99
+ `does not set the mapped Typography font type class on text` охраняет это
100
+ правило. В DOM класс `primary` при этом присутствует: `Text` подставляет
101
+ `EFontType.PRIMARY` по умолчанию — на цвет он не влияет, его перекрывает
102
+ локальное правило.
103
+ - **`ALERT_TYPE_TO_CLASS_NAME_MAP`** (`AlertTypeUtils.tsx`) — общий с
104
+ `AlertProcess` и экспортируется из barrel. Его форма (`Record<EAlertType,
105
+ (styles) => string>`) — часть публичного API, менять нельзя без breaking change.
106
+
107
+ ---
108
+
109
+ ## Подводные камни
110
+
111
+ - **Цвет текста задаётся локальным правилом, а `type` у `Text` намеренно не
112
+ передаётся.** Цвет берётся из `.alertContext.alertTypeX .alertContextText`
113
+ (токены `AlertContext-*`). Раньше компонент дополнительно передавал в `Text`
114
+ вычисленный `EFontType`, но это было мёртвым кодом: локальное правило имеет
115
+ специфичность (0,3,0) и всегда перекрывает `.typography.info` (0,2,0) из
116
+ `Typography.module.less`. Хуже того, значения расходились — см. таблицу ниже.
117
+ Не возвращай `type` у `Text`: цвет от этого не изменится, но код начнёт
118
+ документировать неверное намерение. Обратное тоже неверно — не убирай
119
+ LESS-правила «раз цвет и так задаёт `Text`»: тогда текст станет `primary`.
120
+
121
+ | `type` | `AlertContext-*` (действует) | `Typography-*` (не действует) |
122
+ |---|---|---|
123
+ | `INFO` | нейтральный `rgba(31,31,34,1)` / `rgba(255,255,255,1)` | синий `#0E57CC` / `#1297FE` |
124
+ | `WARNING` | нейтральный, те же значения | оранжевый `#EF4C01` / `#FF7A17` |
125
+ | `ERROR` | `#D10032` / `#F80C45` | `#D10032` / `#F80C45` — совпадает |
126
+ | `SYSTEM` | нейтральный, альфа `1` | `SECONDARY`: альфа `.65` / `.55` |
127
+
128
+ - **Из `.alertContext` удалены `font-size: 12px` / `line-height: 16px`**
129
+ (2026-07-27) как мёртвые правила: типографику текста задаёт `Text` через
130
+ класс `.b4` на самом текстовом элементе, а собственное объявление потомка
131
+ всегда бьёт наследуемое от родителя. На иконки влияния не было — они
132
+ рендерятся как `<svg width="16" height="16">` с px-атрибутами.
133
+ **Остаточный риск:** если потребитель передаёт в `renderIcon` не-svg элемент
134
+ с текстом, его типографика после удаления изменится — раньше он наследовал от
135
+ `.alertContext` 12px/16px, теперь наследует размер шрифта родителя страницы.
136
+ Штатный сценарий (`renderIcon` = иконка из `@sberbusiness/icons-next`) не
137
+ затронут.
138
+ - **`role="alert"` присутствует в DOM с момента монтирования.** Live-region,
139
+ добавленный в дерево вместе со своим содержимым, скринридеры часто не
140
+ анонсируют. Если нужно гарантированное озвучивание при динамическом появлении
141
+ сообщения — держи `AlertContext` смонтированным и меняй `children`, а не
142
+ монтируй компонент целиком.
143
+
144
+ ---
145
+
146
+ ## Accessibility
147
+
148
+ - Корневой `<span>` имеет `role="alert"` — это `aria-live="assertive"` region:
149
+ изменение содержимого прерывает текущую речь скринридера.
150
+ - Иконка декоративная и не имеет текстовой альтернативы — весь смысл должен
151
+ быть в `children`. Не полагайся на цвет и иконку как на единственный носитель
152
+ информации о серьёзности сообщения.
153
+ - Компонент неинтерактивен: не получает фокус, не обрабатывает клавиатуру,
154
+ собственных `aria-*` атрибутов сверх `role` не выставляет. Любые `aria-label`
155
+ / `aria-describedby` пробрасываются через `...rest`.
156
+ - При связывании с полем формы передавай `id` и ссылайся на него из поля через
157
+ `aria-describedby`.
158
+
159
+ ---
160
+
161
+ ## Связанные компоненты
162
+
163
+ - `AlertProcess` — блочное уведомление того же семейства: фон, скругление,
164
+ кнопка закрытия, спойлер, ссылки. Поддерживает `EAlertType.FEATURE`.
165
+ - `EAlertType` — общий enum типов для всего семейства. `AlertContext`
166
+ использует его подмножество.
167
+ - `ALERT_TYPE_TO_CLASS_NAME_MAP` (`AlertTypeUtils.tsx`) — общий маппинг типа в
168
+ CSS-класс, разделяемый с `AlertProcess`. Собственного AI.md не имеет.
169
+ - `Text` — рендерит текст предупреждения (`ETextSize.B4`). Цвет им не
170
+ управляется: prop `type` намеренно не передаётся.
171
+ - `Notification` — всплывающее уведомление поверх интерфейса, а не инлайновое.
172
+
173
+ ---
174
+
175
+ ## Stories
176
+
177
+ Основные истории: `stories/Alerts/AlertContext.stories.tsx`
178
+ Файлы примеров: `stories/Alerts/examples/AlertContext/`
179
+
180
+ | Story | Example file | Что демонстрирует |
181
+ | ---------------- | -------------------- | ---------------------------------------------------------------- |
182
+ | `Playground` | `Playground.tsx` | Интерактивный контроль `type` и `children` |
183
+ | `Default` | `Default.tsx` | Базовое предупреждение с типом `INFO` |
184
+ | `Types` | `Types.tsx` | Все поддерживаемые типы: `INFO` / `WARNING` / `ERROR` / `SYSTEM` |
185
+ | `WithCustomIcon` | `WithCustomIcon.tsx` | Замена иконки через `renderIcon` |
186
+
187
+ Скриншот-тесты: baseline лежат в `__screenshots__/` как
188
+ `alerts-alertcontext--{default,types,with-custom-icon}--{xs,xl}.png`.
189
+ `Playground` исключён из скриншот-тестов через `testRunner: { skip: true }`
190
+ (по `docs/ai/stories-guide.md` — всегда), его визуальная регрессия не покрыта.
191
+ Устаревшие `alerts-alertcontext--playground--{xs,xl}.png` удалены: скрипт
192
+ `scripts/checkOrphanScreenshots.ts` такие файлы не ловит — `parameters` нет в
193
+ `storybook-static/index.json`, поэтому skip-стори считаются ожидаемыми.
194
+ Отдельная `VisualTests` story не создавалась — у компонента нет состояний,
195
+ требующих взаимодействия (hover / focus / disabled / loading отсутствуют).
196
+ Непокрытый визуальный кейс — перенос текста на несколько строк.
197
+
198
+ ---
199
+
200
+ ## История изменений
201
+
202
+ | Дата | Изменение |
203
+ | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
204
+ | 2026-07-27 | Создан документ. AI-рефакторинг: switch иконок заменён на `TYPE_TO_DEFAULT_ICON_MAP`, в `IAlertContextProps` добавлен явный `children`, из `.alertContext` удалены мёртвые `font-size` / `line-height`, из `Text` убран prop `type` вместе с маппингом `EFontType` (перекрывался специфичностью и расходился по значениям с токенами `AlertContext-*`). Unit-тесты расширены с 6 до 25 кейсов. Файлы примеров в `stories/Alerts/examples/AlertContext/` переименованы под modern pattern — без суффикса `Example`. Публичный API не менялся. |
205
+
206
+ ---
207
+
208
+ ## Примеры использования
209
+
210
+ ### Default
211
+
212
+ `stories/Alerts/examples/AlertContext/Default.tsx`
213
+
214
+ ```tsx
215
+ import React from "react";
216
+ import { AlertContext, EAlertType } from "@sberbusiness/triplex-next";
217
+
218
+ export const Default = () => (
219
+ <div style={{ maxWidth: "750px" }}>
220
+ <AlertContext type={EAlertType.INFO}>
221
+ This message provides context or highlights important information to note.
222
+ </AlertContext>
223
+ </div>
224
+ );
225
+ ```
226
+
227
+ ### Types
228
+
229
+ `stories/Alerts/examples/AlertContext/Types.tsx`
230
+
231
+ ```tsx
232
+ import React from "react";
233
+ import { AlertContext, EAlertType } from "@sberbusiness/triplex-next";
234
+
235
+ const TYPES = Object.values(EAlertType).filter((type) => type !== EAlertType.FEATURE);
236
+
237
+ export const Types = () => (
238
+ <div style={{ display: "flex", flexDirection: "column", gap: "16px", maxWidth: "750px" }}>
239
+ {TYPES.map((type) => (
240
+ <div key={type}>
241
+ <div style={{ marginBottom: "8px", fontSize: "16px", fontWeight: "700" }}>{type.toUpperCase()}</div>
242
+ <AlertContext type={type}>
243
+ This message provides context or highlights important information to note.
244
+ </AlertContext>
245
+ </div>
246
+ ))}
247
+ </div>
248
+ );
249
+ ```
250
+
251
+ ### WithCustomIcon
252
+
253
+ `stories/Alerts/examples/AlertContext/WithCustomIcon.tsx`
254
+
255
+ ```tsx
256
+ import React from "react";
257
+ import { AlertContext, EAlertType } from "@sberbusiness/triplex-next";
258
+ import { WaitStrokeStsIcon16 } from "@sberbusiness/icons-next";
259
+
260
+ export const WithCustomIcon = () => (
261
+ <div style={{ maxWidth: "750px" }}>
262
+ <AlertContext type={EAlertType.INFO} renderIcon={<WaitStrokeStsIcon16 paletteIndex={4} />}>
263
+ This message provides context or highlights important information to note.
264
+ </AlertContext>
265
+ </div>
266
+ );
267
+ ```
268
+
@@ -87,12 +87,12 @@ version: "1.0"
87
87
  | Prop | Тип | Описание |
88
88
  |---|---|---|
89
89
  | `theme` | `EButtonTheme` | Визуальный стиль |
90
- | `size` | `EComponentSize` | Размер |
91
90
 
92
91
  ### Опциональные props (`Button`)
93
92
 
94
93
  | Prop | Тип | По умолчанию | Описание |
95
94
  |---|---|---|---|
95
+ | `size` | `EComponentSize` | `MD` | Размер |
96
96
  | `block` | `boolean` | `false` | Полноширинный режим |
97
97
  | `loading` | `boolean` | `false` | Состояние загрузки: скрывает контент через `visibility: hidden`, показывает спиннер, ставит `tabIndex={-1}` |
98
98
  | `icon` | `React.ReactElement` | — | Иконка слева от текста; если без `children` — кнопка становится квадратной (icon-only) |
@@ -145,7 +145,7 @@ version: "1.0"
145
145
  - Нативный `<button>` — полная поддержка клавиатуры (Tab, Enter, Space) без дополнительных атрибутов.
146
146
  - **`ButtonIcon`**: иконочная кнопка без видимого текста — потребитель **обязан** передать `aria-label` через `...rest`. Библиотека мультиязычная, текст не хардкодится.
147
147
  - **`loading`**: устанавливает `tabIndex={-1}` — кнопка исключается из tab-порядка. Если нужна доступность состояния загрузки для скринридеров, потребитель добавляет `aria-busy="true"` через props.
148
- - **`aria-expanded`**: управляет визуальным состоянием «раскрыто» (добавляет CSS-классы `.expanded`, `.active`). Передаётся потребителем при использовании кнопки как триггера dropdown. Отдельного prop `expanded` нет — используй стандартный HTML-атрибут.
148
+ - **`aria-expanded`**: управляет визуальным состоянием «раскрыто» (добавляет CSS-классы `.expanded`, `.active`). Раскрытым считается только значение `true` или `"true"` — строковое `"false"` трактуется как закрытое состояние (тип атрибута `Booleanish`). Передаётся потребителем при использовании кнопки как триггера dropdown. Отдельного prop `expanded` нет — используй стандартный HTML-атрибут.
149
149
  - Фокус-стиль через `:focus-visible` — виден только при клавиатурной навигации.
150
150
 
151
151
  ---
@@ -185,6 +185,9 @@ version: "1.0"
185
185
  |---|---|
186
186
  | 2026-03-31 | Создан документ (пилот AI-Ready) |
187
187
  | 2026-04-27 | Приведён в соответствие с `docs/ai/template-ai.md`: убраны секции «Файловая структура» и «Ключевые особенности реализации», переструктурированы props, добавлена колонка `Example file` в таблице Stories |
188
+ | 2026-07-15 | Добавлен `vertical-align: middle` корневому классу `.button` — icon-only кнопка (`icon` без `children`) смещалась по вертикали относительно соседней текстовой кнопки из-за baseline-выравнивания inline-элементов; `middle` также центрирует кнопку относительно строки инлайн-текста |
189
+ | 2026-07-28 | AI-рефакторинг (TRI-13): codestyle-чистка `Button.tsx` (JSDoc компонента, поясняющие комментарии, эквивалентные упрощения в `clsx`), unit-тесты расширены с 10 до 24 кейсов; публичный API и поведение не изменены |
190
+ | 2026-07-28 | Правки по ревью PR #481 (TRI-13): исправлена трактовка строкового `aria-expanded="false"` (больше не считается раскрытым состоянием); `size` стал опциональным с default `EComponentSize.MD` (типы приведены в соответствие с реализацией); `ButtonBase` убран из barrel-экспорта `index.ts` — импорт только по прямому пути `components/Button/ButtonBase` |
188
191
 
189
192
  ---
190
193
 
@@ -36,7 +36,10 @@ version: "1.0"
36
36
  | `selected` | `IButtonDropdownOption` | — | Предвыбранная опция для подсветки в списке |
37
37
  | `disabled` | `boolean` | `false` | Блокирует кнопку и открытие списка |
38
38
  | `buttonAttributes` | `React.ButtonHTMLAttributes<HTMLButtonElement>` | — | Дополнительные HTML-атрибуты нативной кнопки (включая `aria-label`) |
39
+ | `dropdownAttributes` | `React.HTMLAttributes<HTMLDivElement> & DataAttributes` | — | HTML-атрибуты выпадающего блока, включая `data-*`; `className` мержится с внутренними классами; применяется в desktop-отображении |
39
40
  | `block` | `boolean` | `false` | Полноширинный режим (только для non-dots тем) |
41
+ | `opened` | `boolean` | — | Управляемое состояние открытости dropdown (controlled-режим); задаётся в паре с `setOpened`, без него состояние зафиксировано |
42
+ | `setOpened` | `(opened: boolean) => void` | — | Обработчик изменения состояния открытости (пара к `opened`) |
40
43
  | `className` | `string` | — | Дополнительный CSS-класс контейнера |
41
44
  | `...rest` | `React.HTMLAttributes<HTMLDivElement>` | — | Атрибуты корневого `<div>` компонента |
42
45
 
@@ -77,7 +80,7 @@ version: "1.0"
77
80
 
78
81
  - Триггер строится на `Button` (нативный `<button>`), базовая keyboard-навигация сохраняется.
79
82
  - Кнопка получает `aria-haspopup="menu"`, `aria-expanded`, `aria-controls`. Связка trigger/list осуществляется через `instanceId` (`uniqueId()`); `aria-activedescendant` синхронизируется через `DropdownListContext`.
80
- - На кнопке перехватываются `Space`, `ArrowUp`, `ArrowDown` с `preventDefault`. `ArrowUp` / `ArrowDown` открывают dropdown, если он закрыт. Dropdown закрывается по `Escape` и (из-за `closeOnTab`) по `Tab`.
83
+ - На кнопке перехватываются `Space`, `ArrowUp`, `ArrowDown` с `preventDefault` (сравнение по `event.code`, как в `ButtonDropdownExtended`). `Space` явно переключает dropdown (нативная click-активация отменена `preventDefault`), `ArrowUp` / `ArrowDown` открывают его, если закрыт. Dropdown закрывается по `Escape` и (из-за `closeOnTab`) по `Tab`.
81
84
  - Компонент **не хардкодит** aria-тексты: при необходимости `aria-label` нужно передавать через `buttonAttributes`. Для корректной доступности меню потребитель должен передавать понятные `label` для `options`.
82
85
  - На mobile-заголовке dropdown отображается `children` триггера; если в продукте нужен локализованный отдельный заголовок, его нужно задавать на уровне композиции (через `ButtonDropdownExtended`).
83
86
 
@@ -115,6 +118,11 @@ version: "1.0"
115
118
  |---|---|
116
119
  | 2026-04-15 | Создан документ AI-ready для `ButtonDropdown`. |
117
120
  | 2026-04-27 | Приведён в соответствие с `docs/ai/template-ai.md`: убраны секции «Файловая структура» и «Ключевые особенности реализации», их содержимое перенесено в `Ограничения по темам` и `Accessibility`, добавлена колонка `Example file`. |
121
+ | 2026-07-09 | Добавлено свойство `dropdownAttributes` — HTML-атрибуты выпадающего блока (в том числе возможность поднять `z-index` через `style`). |
122
+ | 2026-07-15 | В `ButtonDropdownExtended` `vertical-align: top` заменён на `middle` (синхронно с `Button`) — общая опорная точка для кнопок разной высоты и центрирование относительно строки инлайн-текста. |
123
+ | 2026-07-28 | AI-рефакторинг: dots- и обычный триггер объединены в один `renderButton` (общая a11y-обвязка), тема кнопки и палитра каретки выведены через мапы вместо `as`-каста и `switch`, удалено обращение к несуществующему CSS-классу `buttonDropdownMenu` (в LESS его не было, в сборке значение было `undefined`). Публичный API и разметка не изменились. Unit-тесты расширены до 32 кейсов. |
124
+ | 2026-07-29 | Правки по ревью PR #482: типы триггера и props-интерфейсы вариантов теперь экспортируются (`TButtonDropdownButtonTheme`, `TButtonDropdownTheme`, `IButtonDropdownBaseProps`, `IButtonDotsProps`) — по конвенции все типы barrel-компонентов публичны; поведение не изменилось. |
125
+ | 2026-07-29 | Отработка находок AI-рефакторинга: починен перехват пробела на триггере (сравнение по `event.code`; `Space` явно переключает dropdown), `label` опции больше не утекает в DOM-атрибут элемента списка, легализован controlled-режим — публичные props `opened` / `setOpened` (ранее `opened` работал только через нетипизированный spread). |
118
126
 
119
127
  ---
120
128