@sberbusiness/triplex-next-mcp-server 1.50.0-beta → 1.53.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/README.md +1 -0
  2. package/bundle/components/AlertProcess.md +6 -3
  3. package/bundle/components/AlertProcessSpoiler.md +216 -0
  4. package/bundle/components/Badge.md +4 -3
  5. package/bundle/components/ButtonDropdown.md +5 -3
  6. package/bundle/components/Carousel.md +671 -0
  7. package/bundle/components/CarouselExtended.md +7 -5
  8. package/bundle/components/CarouselIndicators.md +666 -0
  9. package/bundle/components/CarouselItem.md +579 -0
  10. package/bundle/components/CarouselNextButton.md +633 -0
  11. package/bundle/components/CarouselPrevButton.md +633 -0
  12. package/bundle/components/CarouselViewport.md +631 -0
  13. package/bundle/components/CheckboxTreeExtended.md +21 -7
  14. package/bundle/components/CheckboxTreeExtendedCheckbox.md +591 -0
  15. package/bundle/components/CheckboxTreeExtendedNode.md +577 -0
  16. package/bundle/components/Chip.md +1 -0
  17. package/bundle/components/ChipDatePicker.md +332 -0
  18. package/bundle/components/ChipDatePickerTarget.md +316 -0
  19. package/bundle/components/ChipMonthYearPicker.md +4 -3
  20. package/bundle/components/ChipMonthYearPickerTarget.md +318 -0
  21. package/bundle/components/ChipMultiselect.md +63 -73
  22. package/bundle/components/ChipSelect.md +385 -0
  23. package/bundle/components/ChipSelectTarget.md +388 -0
  24. package/bundle/components/ChipSuggest.md +10 -16
  25. package/bundle/components/ChipSuggestTarget.md +506 -0
  26. package/bundle/components/CollapsibleTree.md +2 -1
  27. package/bundle/components/CollapsibleTreeExtended.md +2 -1
  28. package/bundle/components/DateField.md +4 -2
  29. package/bundle/components/DatePickerExtended.md +16 -14
  30. package/bundle/components/DateRange.md +17 -10
  31. package/bundle/components/Dropdown.md +36 -63
  32. package/bundle/components/EmptyView.md +9 -4
  33. package/bundle/components/ExpandAnimation.md +9 -5
  34. package/bundle/components/FormField.md +1 -1
  35. package/bundle/components/ImageGallery.md +19 -52
  36. package/bundle/components/ImageGalleryExtended.md +123 -139
  37. package/bundle/components/ListItemControlsButtonDropdown.md +3 -2
  38. package/bundle/components/LoaderSmall.md +5 -4
  39. package/bundle/components/MonthYearRange.md +334 -0
  40. package/bundle/components/MultiselectField.md +81 -143
  41. package/bundle/components/Notification.md +2 -1
  42. package/bundle/components/NotificationGrouped.md +174 -0
  43. package/bundle/components/NumberField.md +259 -116
  44. package/bundle/components/OrderedList.md +149 -112
  45. package/bundle/components/Overlay.md +3 -2
  46. package/bundle/components/PageIndicators.md +306 -0
  47. package/bundle/components/Pagination.md +81 -3
  48. package/bundle/components/PaginationExtended.md +160 -0
  49. package/bundle/components/Portal.md +5 -2
  50. package/bundle/components/Puller.md +375 -0
  51. package/bundle/components/SMSField.md +277 -102
  52. package/bundle/components/SelectExtendedField.md +11 -7
  53. package/bundle/components/SelectField.md +7 -4
  54. package/bundle/components/SmartSpot.md +259 -0
  55. package/bundle/components/Step.md +2 -1
  56. package/bundle/components/Stepper.md +7 -7
  57. package/bundle/components/Suggest.md +7 -6
  58. package/bundle/components/SuggestField.md +8 -6
  59. package/bundle/components/TableBasic.md +12 -14
  60. package/bundle/components/Tooltip.md +9 -8
  61. package/bundle/guides/commits.md +4 -1
  62. package/bundle/guides/context.md +5 -5
  63. package/bundle/guides/stories.md +29 -21
  64. package/bundle/manifest.json +145 -13
  65. package/bundle/release-notes/1.50.0.mdx +4 -0
  66. package/bundle/release-notes/1.51.0.mdx +57 -0
  67. package/bundle/release-notes/1.52.0.mdx +55 -0
  68. package/bundle/release-notes/1.53.0.mdx +60 -0
  69. package/bundle/release-notes/1.54.0.mdx +45 -0
  70. package/bundle/release-notes/1.55.0.mdx +7 -0
  71. package/bundle/tokens.json +377 -222
  72. package/dist/index.js +39 -1
  73. package/dist/index.js.map +1 -1
  74. package/package.json +1 -1
package/README.md CHANGED
@@ -45,6 +45,7 @@ MCP-сервер для дизайн-системы Triplex. Предостав
45
45
  | `get_tokens(component?, group?)` | Дизайн-токены: индекс групп, токены компонента или группа целиком — с путями `Группа.Токен` и значениями тем |
46
46
  | `list_icons(query?, size?, limit?)` | Иконки из `@sberbusiness/icons-next` с фильтрами по подстроке в имени и размеру (защита от галлюцинаций имён) |
47
47
  | `get_guidelines` | Гайдлайны кодогенерации на Triplex для ИИ-агентов (правила `TPX-G-NN` из `docs/mcp/guidelines.md` triplex-next) |
48
+ | `get_release_notes(version?)` | Release notes указанной версии Triplex в исходном MDX. Без аргументов используется версия bundle. |
48
49
 
49
50
  Флаг `ai_ready: true` означает, что у компонента есть полноценная AI-документация
50
51
  (`*-AI.md` с frontmatter, секциями и примерами). Для остальных компонентов сервер
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  component: AlertProcess
3
3
  category: Alert
4
- related: [AlertContext]
4
+ related: [AlertProcessSpoiler, AlertContext]
5
5
  tokens:
6
6
  - AlertProcess.Info_Background
7
7
  - AlertProcess.Warning_Background
@@ -56,7 +56,8 @@ ARIA-роли не выставляет.
56
56
  ### AlertProcess.Spoiler
57
57
 
58
58
  Раскрывающийся блок внутри `AlertProcess`. **Полностью управляемый** — своего
59
- состояния не хранит.
59
+ состояния не хранит. Полный контракт, ограничения и примеры —
60
+ [AlertProcessSpoiler-ai.md](./AlertProcessSpoiler-ai.md).
60
61
 
61
62
  | Prop | Тип | По умолчанию | Описание |
62
63
  | ----------------------------- | ------------------------- | ------------ | -------------------------------------------------------------------- |
@@ -195,7 +196,8 @@ AlertProcess.Feature_Background // фон для type=FEATURE
195
196
  `role="alert"`, иконка + короткий текст, без фона и кнопок. Не поддерживает
196
197
  `EAlertType.FEATURE`.
197
198
  - `AlertProcessSpoiler` — субкомпонент, доступный только как
198
- `AlertProcess.Spoiler`. Собственного AI.md не имеет, описан здесь.
199
+ `AlertProcess.Spoiler`. Подробности — в
200
+ [AlertProcessSpoiler-ai.md](./AlertProcessSpoiler-ai.md).
199
201
  - `EAlertType` — общий enum типов семейства. `AlertProcess` использует его целиком.
200
202
  - `EAlertProcessBorderRadius` — enum скруглений, экспортируется из barrel.
201
203
  - `ALERT_TYPE_TO_CLASS_NAME_MAP` (`AlertTypeUtils.tsx`) — общий с `AlertContext`
@@ -249,6 +251,7 @@ AlertProcess.Feature_Background // фон для type=FEATURE
249
251
  | 2026-08-10 | Создан документ. AI-рефакторинг: `AlertProcessSpoiler` переведён на `forwardRef` и перестал затирать `className` собственными классами; из него убрана ссылка на несуществующий CSS-класс `styles.spoiler`; в `AlertProcess` убрано дублирующее присваивание `AlertProcess.Spoiler`, `renderIcon` приведён к `\|\|` как в `AlertContext`, добавлены JSDoc на props с дефолтами и явный `children`; из LESS удалено мёртвое правило `.alertTypeFeature .themeIcon { padding-top: 0 }`. Unit-тесты разбиты на `AlertProcess.test.tsx`и`AlertProcessSpoiler.test.tsx`и расширены с 11 до 34 кейсов. Stories переведены на modern pattern — файлы примеров без суффикса`Example`. Публичный API не изменён. |
250
252
  | 2026-08-11 | По ревью PR #520: из `AlertProcessSpoiler` убрана пустая обёртка-`<div>` — контент и кнопка раскрытия стали соседними элементами, корневым элементом компонента стал элемент контента (он и раньше получал `className` / `ref` / `...rest`). На кнопке раскрытия выставлен `aria-expanded`. Тесты дополнены до 37 кейсов. Публичный API не изменён. |
251
253
  | 2026-08-28 | Скругление варианта `MD` увеличено с 12px до 16px в `styles/AlertProcess.module.less`. |
254
+ | 2026-10-19 | По TRI-160 добавлена связь с отдельной документацией `AlertProcessSpoiler`, проверены существующие примеры и контракт атома |
252
255
 
253
256
  ---
254
257
 
@@ -0,0 +1,216 @@
1
+ ---
2
+ component: AlertProcessSpoiler
3
+ category: Alert
4
+ related: [AlertProcess, ButtonIcon]
5
+ tokens: []
6
+ stories: stories/Alerts/AlertProcess.stories.tsx
7
+ version: "1.0"
8
+ ---
9
+
10
+ # AlertProcessSpoiler
11
+
12
+ ## Назначение
13
+
14
+ Раскрываемые подробности процессного уведомления. Публично доступен как
15
+ `AlertProcess.Spoiler`: хранение состояния открытия остаётся у потребителя,
16
+ а компонент выводит содержимое и кнопку с кареткой внутри `AlertProcess`.
17
+
18
+ Используй когда: часть сообщения `AlertProcess` нужно свернуть, оставив
19
+ основной текст уведомления видимым.
20
+
21
+ Не используй когда: нужен самостоятельный спойлер вне уведомления — для
22
+ этого есть `Spoiler`. Для содержимого выше 1000px текущая анимация не подходит:
23
+ раскрытый блок ограничен `max-height` и обрежет лишнее.
24
+
25
+ ### Публичный путь использования
26
+
27
+ Импортируй родителя из публичного пакета и обращайся к статическому полю:
28
+
29
+ ```tsx
30
+ import React, { useState } from "react";
31
+ import { AlertProcess, EAlertType, ETextSize, Text } from "@sberbusiness/triplex-next";
32
+
33
+ export const ProcessDetails = () => {
34
+ const [open, setOpen] = useState(false);
35
+
36
+ return (
37
+ <AlertProcess type={EAlertType.INFO}>
38
+ <Text size={ETextSize.B3}>Заявление принято.</Text>
39
+ <AlertProcess.Spoiler open={open} onOpen={setOpen}>
40
+ <Text size={ETextSize.B3}>Результат появится после проверки документов.</Text>
41
+ </AlertProcess.Spoiler>
42
+ </AlertProcess>
43
+ );
44
+ };
45
+ ```
46
+
47
+ Именованные экспорты `AlertProcessSpoiler` и `IAlertProcessSpoilerProps` в
48
+ публичном barrel отсутствуют. Для получения типа props через публичный API
49
+ используй `React.ComponentProps<typeof AlertProcess.Spoiler>`.
50
+
51
+ ---
52
+
53
+ ## Варианты и props
54
+
55
+ Обязательных props нет. `IAlertProcessSpoilerProps` определён в
56
+ `AlertProcess/components/AlertProcessSpoiler.tsx` и наследует атрибуты `<div>`.
57
+
58
+ | Prop | По умолчанию | Назначение и ограничения |
59
+ |---|---|---|
60
+ | `open` | `undefined` (закрыт) | Управляет раскрытием содержимого и поворотом каретки. Собственного состояния открытия нет |
61
+ | `onOpen` | — | При нажатии кнопки получает следующее значение `!open`. Потребитель должен обновить `open`; без этого вид не меняется |
62
+ | `children` | — | Раскрываемое содержимое. Типографику и цвет текста задаёт потребитель |
63
+ | `className` | — | Объединяется с классами блока содержимого через `clsx` |
64
+ | `ref` | — | Ссылка на `HTMLDivElement` раскрываемого содержимого |
65
+ | Остальные атрибуты `<div>` | — | Передаются блоку содержимого, включая `id`, `aria-*` и обработчики событий. До кнопки раскрытия они не доходят |
66
+
67
+ Ни `open` без `onOpen`, ни `onOpen` без обновления внешнего состояния не
68
+ делают компонент неконтролируемым. `defaultOpen`, собственных размеров,
69
+ тем и prop для отключения кнопки у него нет.
70
+
71
+ ---
72
+
73
+ ## Дизайн-токены
74
+
75
+ Собственных дизайн-токенов нет, поэтому `tokens: []`. Правила спойлера в
76
+ `AlertProcess/styles/AlertProcess.module.less` задают высоту, прозрачность,
77
+ позиционирование и поворот каретки без обращения к токенам.
78
+
79
+ Фон уведомления задаётся токенами родителя `AlertProcess` в зависимости от
80
+ его `type` — см. [AlertProcess-ai.md](./AlertProcess-ai.md). Фокус кнопки
81
+ использует `Button.Icon_Shadow_Focus` через вложенный `ButtonIcon` — см.
82
+ [ButtonIcon-ai.md](../Button/ButtonIcon-ai.md). Цвет каретки определяется
83
+ `paletteIndex={5}` иконки. Оформление текста приходит из `children`.
84
+
85
+ Переопределение токенов зависимостей через `ThemeProvider` описано в
86
+ [ThemeProvider-ai.md](../ThemeProvider/ThemeProvider-ai.md), раздел
87
+ «Как переопределять токены».
88
+
89
+ ---
90
+
91
+ ## Инварианты
92
+
93
+ - Публичный путь — `AlertProcess.Spoiler`, назначаемый родителю через
94
+ `Object.assign`. Отдельного экспорта атома из `Alert/index.ts` нет.
95
+ - `forwardRef<HTMLDivElement, IAlertProcessSpoilerProps>` обязателен;
96
+ `displayName` — `AlertProcessSpoiler`. Ref указывает на содержимое,
97
+ а не на кнопку или её обёртку.
98
+ - Рендерятся два соседних `<div>` без общей обёртки: содержимое и блок
99
+ кнопки. `className` и `...rest` получает только содержимое. Перенос кнопки
100
+ внутрь него скроет её при сворачивании.
101
+ - Полностью управляемый контракт `open` / `onOpen(!open)` сохраняется.
102
+ Нажатие кнопки само по себе состояние не меняет.
103
+ - Через приватный `AlertProcessContext` при монтировании вызывается
104
+ `setHasSpoiler(true)`, при размонтировании — `setHasSpoiler(false)`.
105
+ Родитель добавляет `withSpoiler` и резервирует `min-height: 40px`
106
+ под кнопку независимо от `open`. Спойлер может находиться на любой
107
+ глубине внутри родителя.
108
+ - В одном `AlertProcess` используй один спойлер: контекст хранит булев
109
+ признак, а не число экземпляров. Размонтирование одного из нескольких
110
+ сбросит резерв высоты для оставшихся.
111
+ - Стили содержимого зависят от предков `.alertProcess` и
112
+ `.alertProcessContentBlock`; кнопка позиционируется абсолютно относительно
113
+ родителя. Самостоятельное использование вне `AlertProcess` не обеспечивает
114
+ эту раскладку.
115
+ - Классы `expandableContent`, `expandButton`, `expanded` и `withSpoiler`
116
+ участвуют в контракте DOM и тестах. Раскрытие анимируется за 0.3s через
117
+ `max-height: 0 → 1000px` и `opacity: 0 → 1`; каретка поворачивается на 180°.
118
+
119
+ ---
120
+
121
+ ## Accessibility
122
+
123
+ - Кнопка — нативный `<button type="button">` внутри `ButtonIcon`:
124
+ доступна по `Tab`, активируется клавишами `Enter` / `Space` и мышью.
125
+ Собственного управления фокусом и клавиатурных обработчиков нет.
126
+ - На кнопке выставляется `aria-expanded={Boolean(open)}`. Атрибут
127
+ отражает prop, а не факт последнего нажатия.
128
+ - Доступное имя кнопки и `aria-controls` сейчас не задаются. Props спойлера
129
+ уходят на содержимое: переданный `aria-label` попадёт на блок содержимого, а `id` не
130
+ создаст связь с кнопкой. Публичного prop для атрибутов кнопки нет.
131
+ - Свёрнутое содержимое остаётся в DOM и скрывается только высотой,
132
+ прозрачностью и `overflow`. `hidden`, `inert` и `aria-hidden` автоматически
133
+ не выставляются: содержимое остаётся доступно скринридеру, а вложенные
134
+ интерактивные элементы могут получать фокус по `Tab` даже при `open=false`.
135
+ - Ни спойлер, ни родитель не добавляют `role="alert"` или live-region.
136
+ Это текущее ограничение реализации; отдельный контракт доступности
137
+ потребует изменения компонента.
138
+
139
+ ---
140
+
141
+ ## Связанные компоненты
142
+
143
+ - [AlertProcess](./AlertProcess-ai.md) — родитель: предоставляет контекст,
144
+ фон, раскладку и публичное поле `Spoiler`.
145
+ - [ButtonIcon](../Button/ButtonIcon-ai.md) — внутренняя кнопка раскрытия;
146
+ обеспечивает нативное поведение кнопки и оформление фокуса.
147
+
148
+ ---
149
+
150
+ ## Stories
151
+
152
+ Основные истории: `stories/Alerts/AlertProcess.stories.tsx`
153
+ Файлы примеров: `stories/Alerts/examples/AlertProcess/`
154
+
155
+ Используются существующие modern examples родителя. Отдельный stories-файл
156
+ атому не требуется.
157
+
158
+ | Story | Example file | Что демонстрирует |
159
+ |---|---|---|
160
+ | `WithSpoiler` | `WithSpoiler.tsx` | Публичный `AlertProcess.Spoiler`, внешнее состояние через `useState`, начальное закрытое состояние и переключение |
161
+ | `VisualTests` | `VisualTests.tsx` | Раскрытое состояние с `open={true}` для скриншот-регрессии |
162
+
163
+ Baseline закрытого и раскрытого состояний уже хранятся в `__screenshots__/`:
164
+ `alerts-alertprocess--with-spoiler--{xs,xl}.png` и
165
+ `alerts-alertprocess--visual-tests--{xs,xl}.png`.
166
+
167
+ Unit-тесты: `AlertProcess/__tests__/AlertProcessSpoiler.test.tsx` проверяет
168
+ управляемое состояние, аргументы callback, `aria-expanded`, DOM-соседство,
169
+ `className`, атрибуты и ref. `AlertProcess/__tests__/AlertProcess.test.tsx`
170
+ проверяет публичное поле `Spoiler` и резерв высоты при монтировании и
171
+ размонтировании атома. Код и stories уже прошли рефакторинг в задаче TRI-7;
172
+ для TRI-160 повторно проверено соответствие текущему DoD.
173
+
174
+ ---
175
+
176
+ ## История изменений
177
+
178
+ | Дата | Изменение |
179
+ |---|---|
180
+ | 2026-10-19 | Создан документ по TRI-160. Проверены самостоятельный контракт атома, выполненный рефакторинг, тесты и существующие примеры родителя |
181
+
182
+ ---
183
+
184
+ ## Примеры использования
185
+
186
+ ### WithSpoiler
187
+
188
+ `stories/Alerts/examples/AlertProcess/WithSpoiler.tsx`
189
+
190
+ ```tsx
191
+ import React, { useState } from "react";
192
+ import { AlertProcess, EAlertType, EFontType, ETextSize, Text } from "@sberbusiness/triplex-next";
193
+
194
+ export const WithSpoiler = () => {
195
+ const [expanded, setExpanded] = useState(false);
196
+
197
+ return (
198
+ <div style={{ maxWidth: "750px" }}>
199
+ <AlertProcess type={EAlertType.INFO}>
200
+ <Text size={ETextSize.B3} type={EFontType.PRIMARY}>
201
+ По вопросам финмониторинга обращайтесь в рабочие дни с 03:00 до 21:00 МСК с мобильного телефона по
202
+ номеру 0321, доб. 6. Звонки по России бесплатные.
203
+ </Text>
204
+ <AlertProcess.Spoiler open={expanded} onOpen={setExpanded}>
205
+ <Text size={ETextSize.B3} type={EFontType.PRIMARY}>
206
+ У вас нет прав на подписание и отправку заявления в страховую компанию. Подписывать заявления, а
207
+ также заверять документы, имеет право генеральный директор на основании устава, владелец ИП на
208
+ основании доверенности.
209
+ </Text>
210
+ </AlertProcess.Spoiler>
211
+ </AlertProcess>
212
+ </div>
213
+ );
214
+ };
215
+ ```
216
+
@@ -114,7 +114,7 @@ Badge.Background
114
114
  - **`BadgeDot` доступен только как `Badge.Dot`.** Barrel (`src/components/Badge/index.ts`)
115
115
  экспортирует `Badge` и типы; отдельного именованного экспорта `BadgeDot` нет — так его
116
116
  и импортируют внутренние потребители: `Marker`, `Chip`, `DropdownListItem`,
117
- `DropdownMobileListItem`, `TabsLineItem`, `TabsExtendedTabButton`.
117
+ `PullerListItem`, `TabsLineItem`, `TabsExtendedTabButton`.
118
118
  Добавление именованного экспорта — расширение публичного API.
119
119
  - **`IBadgeDotProps` — не только props точки.** `Marker` строит из него свой публичный
120
120
  интерфейс: `IMarkerProps extends IBadgeDotProps` (`src/components/Marker/Marker.tsx:9`).
@@ -150,7 +150,7 @@ Badge.Background
150
150
  — либо продублировать смысл текстом рядом. Если точка декоративна и дублирует
151
151
  видимый текст — передай `aria-hidden`.
152
152
  **Внутри библиотеки этого пока нет:** `Chip`, `DropdownListItem`,
153
- `DropdownMobileListItem`, `TabsLineItem` и `TabsExtendedTabButton` рендерят
153
+ `PullerListItem`, `TabsLineItem` и `TabsExtendedTabButton` рендерят
154
154
  `<Badge.Dot size={...} className={styles.notificationIcon} />` — без `aria-hidden`
155
155
  и без роли с именем. Точка там означает «есть новые уведомления», и подписью
156
156
  рядом этот смысл не дублируется, то есть для скринридера информация теряется.
@@ -166,7 +166,7 @@ Badge.Background
166
166
  цветами; наследует `IBadgeDotProps`.
167
167
  - `Chip` (`src/components/Chip/Chip.tsx:108`) — рендерит `Badge.Dot` как значок
168
168
  уведомления при `showNotificationIcon`.
169
- - `DropdownListItem`, `DropdownMobileListItem` — то же самое для пунктов выпадающего
169
+ - `DropdownListItem`, `PullerListItem` — то же самое для пунктов выпадающего
170
170
  списка.
171
171
  - `TabsLineItem` (`src/components/TabsLine/components/TabsLineItem.tsx:78`),
172
172
  `TabsExtendedTabButton` (`src/components/TabsExtended/components/TabsExtendedTabButton.tsx:51`)
@@ -215,6 +215,7 @@ Badge.Background
215
215
  |---|---|
216
216
  | 2026-08-12 | Создан документ. AI-рефакторинг: JSDoc на всех props `IBadgeProps` / `IBadgeDotProps` / `IBadgeContentProps` с указанием размеров в px, в `IBadgeProps` добавлен явный `children` (тип совпадает с унаследованным из `React.HTMLAttributes`), расширены JSDoc компонентов и внутренних обёрток. Unit-тесты расширены с 12 до 45 кейсов: `Badge.test.tsx` вырос с 12 до 23 кейсов, рядом добавлены `BadgeDot.test.tsx` (7), `BadgeContent.test.tsx` (9) и `BadgeAffixes.test.tsx` (6) — покрыты логика снятия отступов контента, нерендеринг частей с falsy-значением, порядок частей разметки, проброс `...rest` и `ref`. Публичный API, DOM-разметка и визуальное поведение не изменены. |
217
217
  | 2026-09-29 | Аудит симметрии `related` (TRI-156): из `related` убраны имена без строки в `docs/ai/ROADMAP.md` (`DropdownListItem`, `DropdownMobileListItem`, `TabsLineItem`, `TabsExtendedTabButton`); из `related` убраны несимметричные имена (`Text`, `Caption`) и потребитель `Chip` — он рендерит `Badge.Dot`, ссылка стоит с его стороны. Пояснения к убранным именам сохранены прозой в «Связанные компоненты»; публичный API и поведение не затронуты. |
218
+ | 2026-10-21 | Переход на `Puller` (TRIPLEX-961): `DropdownMobileListItem` переименован в `PullerListItem`. |
218
219
 
219
220
  ---
220
221
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  component: ButtonDropdown
3
3
  category: Buttons
4
- related: [Button, ButtonDropdownExtended, Dropdown]
4
+ related: [Button, ButtonDropdownExtended, Dropdown, Puller]
5
5
  tokens: []
6
6
  stories: stories/Buttons/ButtonDropdown.stories.tsx
7
7
  version: "1.0"
@@ -56,7 +56,7 @@ version: "1.0"
56
56
 
57
57
  - Для `EButtonDotsTheme` prop `block` запрещён типизацией (`never`).
58
58
  - Dots-режим использует иконку `Dotshorizontal*` вместо текстового контента кнопки.
59
- - Desktop рендерит `DropdownList` с `DropdownList.Item`; mobile через `mobileViewProps` рендерит `DropdownMobileHeader` + `DropdownMobileList`.
59
+ - Desktop рендерит `DropdownList` с `DropdownList.Item`; mobile через `pullerProps` рендерит `PullerHeader` + `PullerList`.
60
60
 
61
61
  ---
62
62
 
@@ -90,7 +90,8 @@ version: "1.0"
90
90
 
91
91
  - `Button` (`src/components/Button/Button.tsx`) — базовый триггер, на котором построен `ButtonDropdown`.
92
92
  - `ButtonDropdownExtended` (`src/components/Button/ButtonDropdownExtended.tsx`) — управляет открытием/закрытием dropdown через render-функции `renderButton` и `renderDropdown`.
93
- - `Dropdown` (`src/components/Dropdown`) — контейнер и пункты списка для desktop/mobile представления.
93
+ - `Dropdown` (`src/components/Dropdown`) — контейнер и пункты списка для desktop-представления.
94
+ - `Puller` (`src/components/Puller`) — мобильное представление: `PullerHeader`, `PullerClose`, `PullerBody`, `PullerList`, `PullerListItem`.
94
95
 
95
96
  ---
96
97
 
@@ -123,6 +124,7 @@ version: "1.0"
123
124
  | 2026-07-28 | AI-рефакторинг: dots- и обычный триггер объединены в один `renderButton` (общая a11y-обвязка), тема кнопки и палитра каретки выведены через мапы вместо `as`-каста и `switch`, удалено обращение к несуществующему CSS-классу `buttonDropdownMenu` (в LESS его не было, в сборке значение было `undefined`). Публичный API и разметка не изменились. Unit-тесты расширены до 32 кейсов. |
124
125
  | 2026-07-29 | Правки по ревью PR #482: типы триггера и props-интерфейсы вариантов теперь экспортируются (`TButtonDropdownButtonTheme`, `TButtonDropdownTheme`, `IButtonDropdownBaseProps`, `IButtonDotsProps`) — по конвенции все типы barrel-компонентов публичны; поведение не изменилось. |
125
126
  | 2026-07-29 | Отработка находок AI-рефакторинга: починен перехват пробела на триггере (сравнение по `event.code`; `Space` явно переключает dropdown), `label` опции больше не утекает в DOM-атрибут элемента списка, легализован controlled-режим — публичные props `opened` / `setOpened` (ранее `opened` работал только через нетипизированный spread). |
127
+ | 2026-10-21 | Переход на `Puller` (TRIPLEX-961): мобильная версия собрана из частей `Puller` (бывший `DropdownMobile*`). |
126
128
 
127
129
  ---
128
130