@sberbusiness/triplex-next-mcp-server 1.41.0-beta → 1.43.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 (41) hide show
  1. package/bundle/components/AlertProcess.md +460 -0
  2. package/bundle/components/Amount.md +145 -169
  3. package/bundle/components/Badge.md +155 -219
  4. package/bundle/components/Body.md +108 -116
  5. package/bundle/components/Button.md +1 -0
  6. package/bundle/components/CarouselExtended.md +355 -194
  7. package/bundle/components/Checkbox.md +7 -1
  8. package/bundle/components/CheckboxTreeExtended.md +149 -248
  9. package/bundle/components/CheckboxXGroup.md +2 -0
  10. package/bundle/components/CheckboxYGroup.md +7 -2
  11. package/bundle/components/ChipGroup.md +195 -126
  12. package/bundle/components/ComposedKeyDownListener.md +323 -0
  13. package/bundle/components/FooterPage.md +2 -1
  14. package/bundle/components/HeaderPage.md +2 -1
  15. package/bundle/components/Island.md +100 -12
  16. package/bundle/components/KeyDownListener.md +11 -72
  17. package/bundle/components/LightBox.md +6 -0
  18. package/bundle/components/LoaderSmall.md +230 -0
  19. package/bundle/components/MaskedField.md +481 -0
  20. package/bundle/components/MediaWidth.md +252 -108
  21. package/bundle/components/MobileView.md +192 -68
  22. package/bundle/components/ModalWindow.md +3 -1
  23. package/bundle/components/Notification.md +21 -3
  24. package/bundle/components/Page.md +3 -1
  25. package/bundle/components/Pagination.md +20 -0
  26. package/bundle/components/SelectExtendedField.md +691 -236
  27. package/bundle/components/SliderExtended.md +358 -222
  28. package/bundle/components/TabsExtended.md +380 -194
  29. package/bundle/components/UnorderedList.md +254 -0
  30. package/bundle/components/UnorderedListExtended.md +255 -0
  31. package/bundle/components/WindowResizeListener.md +249 -0
  32. package/bundle/guides/commits.md +66 -3
  33. package/bundle/guides/context.md +26 -0
  34. package/bundle/guides/stories.md +3 -1
  35. package/bundle/guides/template.md +1 -1
  36. package/bundle/manifest.json +64 -21
  37. package/bundle/release-notes/1.41.1.mdx +18 -0
  38. package/bundle/release-notes/1.42.0.mdx +81 -0
  39. package/bundle/release-notes/1.43.0.mdx +94 -0
  40. package/bundle/release-notes/1.44.0.mdx +7 -0
  41. package/package.json +1 -1
@@ -0,0 +1,254 @@
1
+ ---
2
+ component: UnorderedList
3
+ category: UnorderedList
4
+ related: [UnorderedListExtended, OrderedList, Text]
5
+ tokens: []
6
+ stories: stories/UnorderedList/UnorderedList.stories.tsx
7
+ version: "1.0"
8
+ ---
9
+
10
+ # UnorderedList
11
+
12
+ ## Назначение
13
+
14
+ Маркированный список с data-driven API: содержимое описывается массивом `items`, а не JSX-разметкой.
15
+ Компонент разворачивает каждый элемент массива в `UnorderedListExtended.Item` с обязательным
16
+ маркером-обёрткой перед содержимым.
17
+
18
+ Используй когда: список строится из данных (map по массиву), а каждому элементу достаточно текста,
19
+ свойств типографики `Text` и опционального маркера.
20
+
21
+ Не используй когда:
22
+ - Элементы списка — сложная композиция из нескольких блоков или интерактивных элементов, которую
23
+ удобнее собирать JSX-ом. Для этого есть `UnorderedListExtended` с составным API
24
+ (`UnorderedListExtended.Item`, `UnorderedListExtended.Item.Marker`).
25
+ - Нужен нумерованный список — используй `OrderedList`.
26
+ - Нужен список записей с действиями, выделением, сортировкой — это `List` и его семейство,
27
+ а не типографический маркированный список.
28
+
29
+ ---
30
+
31
+ ## Варианты и props
32
+
33
+ ### Обязательные props
34
+
35
+ Обязательных props нет: `<UnorderedList />` без `items` отрендерит пустой `<ul>`.
36
+
37
+ ### Опциональные props
38
+
39
+ | Prop | Тип | По умолчанию | Описание |
40
+ |---|---|---|---|
41
+ | `items` | `IUnorderedListItemProps[]` | — | Конфигурация элементов списка. Содержимое элемента задаётся его `children`. |
42
+
43
+ `IUnorderedListProps` расширяет `Omit<IUnorderedListExtendedProps, "children">`, то есть принимает
44
+ все стандартные атрибуты `<ul>` (`className`, `style`, `aria-*`, обработчики событий) и **не**
45
+ принимает `children` — это часть data-driven контракта.
46
+
47
+ ### Элемент списка (`IUnorderedListItemProps`)
48
+
49
+ Наследует свойства элемента расширенного списка (`Partial<Omit<TTextProps<"li">, "tag">>`), то есть
50
+ всю типографику `Text` (`size`, `type`, `weight`, `line`, `underline`, `strikethrough`) и стандартные
51
+ атрибуты `<li>`, плюс:
52
+
53
+ | Prop | Тип | По умолчанию | Описание |
54
+ |---|---|---|---|
55
+ | `marker` | `React.ReactNode` | маркер-точка | Кастомный маркер элемента. |
56
+
57
+ Особенности, которые не видны из типов:
58
+
59
+ - **Размер текста элемента** по умолчанию — `ETextSize.B3` (дефолт задаёт `UnorderedListExtended.Item`).
60
+ - **React-ключ** элемента вычисляется как `key ?? id ?? index`. Явный `key` в объекте элемента
61
+ вырезается из props и не попадает в DOM, а `id` — попадает (это обычный HTML-атрибут).
62
+ - **`DataAttributes`** подмешаны в `IUnorderedListItemProps` намеренно: элементы задаются объектами
63
+ в массиве, а не JSX-атрибутами, поэтому без этого типа `data-*` на элементе не прошли бы проверку типов.
64
+ - **`ref` элемента** можно передать прямо в объекте элемента — `UnorderedListItem` объявлен через
65
+ `forwardRef`, а React вырезает `ref` из spread-props. Поведение поддерживаемое и покрыто тестом
66
+ (`__tests__/UnorderedList.test.tsx` → «forwards ref passed inside an item object to the li element»).
67
+
68
+ ---
69
+
70
+ ## Дизайн-токены
71
+
72
+ Собственных CSS-переменных у компонента нет: разметку и стили даёт `UnorderedListExtended`
73
+ (`styles/UnorderedListExtended*.module.less` — только layout: `display`, `gap`, отступы, размер точки).
74
+ Цвет текста и маркера приходит из типографики `Text` через prop `type`: маркер по умолчанию залит
75
+ `currentcolor`, поэтому меняется вместе с цветом текста элемента.
76
+
77
+ Обёртка маркера тянется на высоту строки элемента (`min-height: 1lh` с фолбэком `20px` для браузеров
78
+ без единицы `lh`), поэтому маркер центрируется по первой строке при любом `size`. Высота — минимум,
79
+ а не фиксированное значение: маркер выше строки (например, иконка 20px при `B4`) не обрезается.
80
+
81
+ ---
82
+
83
+ ## Инварианты
84
+
85
+ - **`forwardRef`** на `UnorderedList` — не убирать. Ref указывает на корневой `<ul>`
86
+ (тот же элемент, что получает `className`, `...rest` и `data-tx`).
87
+ - **`items` — единственный собственный prop.** `children` исключён типом (`Omit<..., "children">`):
88
+ переход на data-driven API был breaking change в 1.43.0, возврат `children` ломает контракт.
89
+ - **Маркер-обёртка рендерится всегда**, даже если `marker` не передан: дефолтную точку рисует сам
90
+ `UnorderedListExtended.Item.Marker` при `children === undefined`. Условный рендер обёртки уберёт
91
+ маркер у всех элементов без `marker`.
92
+ - **Порядок в элементе**: маркер, затем содержимое. Изменение порядка — наблюдаемое изменение DOM.
93
+ - **Вертикальное выравнивание маркера** задаётся высотой обёртки, а не фиксированными вертикальными
94
+ отступами точки: отступы под конкретную строку (`20px` для `B2`/`B3`) снова сместят маркер на `B1` и `B4`.
95
+ - **Порядок вычисления ключа** `key ?? id ?? index` — менять только осознанно: смена ключей
96
+ перемонтирует элементы у потребителей.
97
+ - **`UnorderedListItem` не экспортируется** из barrel `src/components/UnorderedList/index.ts` —
98
+ это внутренняя деталь. Публичны только `UnorderedList`, `IUnorderedListProps`
99
+ и `IUnorderedListItemProps`; их имена — часть публичного API.
100
+ - **`displayName`**: `"UnorderedList"` и `"UnorderedListItem"` — не менять.
101
+
102
+ ---
103
+
104
+ ## Accessibility
105
+
106
+ - Семантика штатная: корневой элемент — `<ul>` (`role="list"`), элементы — `<li>` (`role="listitem"`).
107
+ Дополнительных ARIA-атрибутов компонент не выставляет.
108
+ - Маркер лежит в обычном `<span>` и **не** скрыт от скринридеров. Текстовый маркер (например, `"1."`)
109
+ будет озвучен; если маркер декоративный (иконка), скрывай его сам — передавай в `marker` узел
110
+ с `aria-hidden="true"`.
111
+ - Компонент не интерактивный: фокус-менеджмента и клавиатурных обработчиков нет.
112
+ - Язык не хардкодится: весь текст приходит от потребителя через `children` элементов.
113
+
114
+ ---
115
+
116
+ ## Связанные компоненты
117
+
118
+ - `UnorderedListExtended` — тот же маркированный список, но с составным JSX-API
119
+ (`UnorderedListExtended.Item`, `UnorderedListExtended.Item.Marker`). `UnorderedList` — тонкая
120
+ data-driven обёртка над ним, и `IUnorderedListProps` наследует его props. Типичная точка выбора:
121
+ данные → `UnorderedList`, произвольная композиция → `UnorderedListExtended`.
122
+ - `Text` — типографика элемента списка. `UnorderedListExtended.Item` рендерится как `Text` с `tag="li"`,
123
+ поэтому props элемента (`size`, `type`, `weight`, `line`) — это props `Text`.
124
+ - `UnorderedListItem` (`src/components/UnorderedList/UnorderedListItem.tsx`) — внутренний элемент списка
125
+ без отдельного AI.md: `forwardRef`-обёртка, которая добавляет маркер перед содержимым и пробрасывает
126
+ остальные props в `UnorderedListExtended.Item`. Наружу не экспортируется.
127
+ - `OrderedList` — нумерованный список для той же задачи, когда важен порядок пунктов.
128
+
129
+ ---
130
+
131
+ ## Stories
132
+
133
+ Основные истории: `stories/UnorderedList/UnorderedList.stories.tsx`
134
+ Файлы примеров: `stories/UnorderedList/examples/`
135
+
136
+ | Story | Example file | Что демонстрирует |
137
+ |---|---|---|
138
+ | `Playground` | `Playground.tsx` | Интерактивный контроль `items` плюс размер, тип и кастомный маркер для всех элементов |
139
+ | `Default` | `Default.tsx` | Минимальный список с маркерами по умолчанию |
140
+ | `CustomMarkerText` | `CustomMarkerText.tsx` | Кастомные маркеры-иконки и разные типы текста элементов |
141
+ | `Sizes` | `Sizes.tsx` | Размеры текста элементов `ETextSize.B1`–`B4` |
142
+ | `VisualTests` | `VisualTests.tsx` | Скриншот-покрытие: маркеры по умолчанию, иконки, текстовые маркеры, перенос длинного текста, типы, толщина и интерлиньяж, список из одного элемента |
143
+
144
+ `Default`, `CustomMarkerText` и `Sizes` исключены из скриншот-тестов (`testRunner: { skip: true }`) —
145
+ они рендерят то же самое, что одноимённые истории `UnorderedListExtended` (baseline совпадали
146
+ побайтово). Собственное визуальное покрытие компонента даёт `VisualTests`; выравнивание маркера
147
+ по размерам типографики покрыто скриншотом `UnorderedListExtended` → `Sizes`, там же живут
148
+ и стили маркера.
149
+
150
+ ---
151
+
152
+ ## История изменений
153
+
154
+ | Дата | Изменение |
155
+ |---|---|
156
+ | 2026-08-20 | Исправлено вертикальное центрирование маркера: обёртка маркера тянется на высоту строки текста (`min-height: 1lh`) вместо вертикальных отступов точки под строку `20px`. На `B1` маркер смещался на 2px вверх, на `B4` — на 2px вниз. Правка в `UnorderedListExtended`, затрагивает оба компонента. |
157
+ | 2026-08-20 | Тесты маркера переведены со structural-проверок по LESS-классам `UnorderedListExtended` на проверку структуры DOM; добавлен тест на `ref`, переданный внутри объекта элемента. |
158
+ | 2026-08-20 | Создан документ. AI-рефакторинг: уточнены JSDoc компонента, элемента и props (`items`, `marker`); расширены unit-тесты (пустой список, маркер по умолчанию, типографика элемента, вычисление React-ключа) и добавлен файл тестов `UnorderedListItem`; stories переведены на modern pattern — добавлены `Playground`, `Sizes`, `VisualTests`. Публичный API не менялся. |
159
+
160
+ ---
161
+
162
+ ## Примеры использования
163
+
164
+ ### Default
165
+
166
+ `stories/UnorderedList/examples/Default.tsx`
167
+
168
+ ```tsx
169
+ import React from "react";
170
+ import { UnorderedList } from "@sberbusiness/triplex-next";
171
+
172
+ export const Default = () => (
173
+ <UnorderedList
174
+ items={[{ children: "List item text" }, { children: "List item text" }, { children: "List item text" }]}
175
+ />
176
+ );
177
+ ```
178
+
179
+ ### CustomMarkerText
180
+
181
+ `stories/UnorderedList/examples/CustomMarkerText.tsx`
182
+
183
+ ```tsx
184
+ import React from "react";
185
+ import { UnorderedList, EFontType } from "@sberbusiness/triplex-next";
186
+ import { CheckboxtickStrokeSrvIcon20 } from "@sberbusiness/icons-next";
187
+
188
+ export const CustomMarkerText = () => (
189
+ <div style={{ maxWidth: 200 }}>
190
+ <UnorderedList
191
+ items={[
192
+ {
193
+ type: EFontType.PRIMARY,
194
+ marker: <CheckboxtickStrokeSrvIcon20 paletteIndex={0} />,
195
+ children: "Анализ рисков по 115-ФЗ",
196
+ },
197
+ {
198
+ type: EFontType.PRIMARY,
199
+ marker: <CheckboxtickStrokeSrvIcon20 paletteIndex={0} />,
200
+ children: "Рекомендации с учётом отрасли",
201
+ },
202
+ {
203
+ type: EFontType.PRIMARY,
204
+ marker: <CheckboxtickStrokeSrvIcon20 paletteIndex={0} />,
205
+ children: "Проверка данных ФНС и других госисточников",
206
+ },
207
+ {
208
+ type: EFontType.PRIMARY,
209
+ marker: <CheckboxtickStrokeSrvIcon20 paletteIndex={0} />,
210
+ children: "Оценка финансовой устойчивости компании",
211
+ },
212
+ {
213
+ type: EFontType.TERTIARY,
214
+ marker: <CheckboxtickStrokeSrvIcon20 paletteIndex={5} />,
215
+ children: "Личный менеджер",
216
+ },
217
+ {
218
+ type: EFontType.TERTIARY,
219
+ marker: <CheckboxtickStrokeSrvIcon20 paletteIndex={5} />,
220
+ children: "Помощь при запросах и отказах от банка по операциям",
221
+ },
222
+ ]}
223
+ />
224
+ </div>
225
+ );
226
+ ```
227
+
228
+ ### Sizes
229
+
230
+ `stories/UnorderedList/examples/Sizes.tsx`
231
+
232
+ ```tsx
233
+ import React from "react";
234
+ import { UnorderedList, ETextSize } from "@sberbusiness/triplex-next";
235
+
236
+ const SIZES = Object.values(ETextSize);
237
+
238
+ export const Sizes = () => (
239
+ <div style={{ maxWidth: "300px", display: "flex", flexDirection: "column", gap: "24px" }}>
240
+ {SIZES.map((size) => (
241
+ <div key={size}>
242
+ <div style={{ marginBottom: "8px", fontSize: "16px", fontWeight: "700" }}>{size}</div>
243
+ <UnorderedList
244
+ items={[
245
+ { size, children: "List item text" },
246
+ { size, children: "List item text" },
247
+ ]}
248
+ />
249
+ </div>
250
+ ))}
251
+ </div>
252
+ );
253
+ ```
254
+
@@ -0,0 +1,255 @@
1
+ ---
2
+ component: UnorderedListExtended
3
+ category: UnorderedListExtended
4
+ related: [UnorderedList, OrderedList, Text]
5
+ tokens: []
6
+ stories: stories/UnorderedListExtended/UnorderedListExtended.stories.tsx
7
+ version: "1.0"
8
+ ---
9
+
10
+ # UnorderedListExtended
11
+
12
+ ## Назначение
13
+
14
+ Маркированный список с составным JSX-API: элементы собираются вручную через `UnorderedListExtended.Item`,
15
+ маркер добавляется явно первым потомком элемента — `UnorderedListExtended.Item.Marker`.
16
+
17
+ Используй когда: элемент списка — композиция из нескольких узлов (ссылка, бейдж, вложенный блок),
18
+ маркеры разнородны внутри одного списка, или часть элементов должна остаться без маркера.
19
+
20
+ Не используй когда:
21
+ - Список строится из данных и каждому элементу достаточно текста и одного маркера — это `UnorderedList`
22
+ с массивом `items`, он сам разворачивает элементы и сам добавляет обёртку маркера.
23
+ - Нужен нумерованный список — используй `OrderedList`.
24
+ - Нужен список записей с действиями, выделением, сортировкой — это `List` и его семейство,
25
+ а не типографический маркированный список.
26
+
27
+ ---
28
+
29
+ ## Варианты и props
30
+
31
+ ### Обязательные props
32
+
33
+ Обязательных props нет ни у одной части составного API.
34
+
35
+ ### Собственные props
36
+
37
+ Собственных props нет ни у списка, ни у элемента, ни у обёртки маркера — все три интерфейса
38
+ пустые и наследуют чужие:
39
+
40
+ | Компонент | Интерфейс | Что принимает |
41
+ |---|---|---|
42
+ | `UnorderedListExtended` | `IUnorderedListExtendedProps` | Стандартные атрибуты `<ul>` |
43
+ | `UnorderedListExtended.Item` | `IUnorderedListExtendedItemProps` | Типографику `Text` без `tag` плюс стандартные атрибуты `<li>` |
44
+ | `UnorderedListExtended.Item.Marker` | `IUnorderedListExtendedItemMarkerProps` | Стандартные атрибуты `<span>` |
45
+
46
+ Особенности, которые не видны из типов:
47
+
48
+ - **Размер текста элемента** по умолчанию — `ETextSize.B3`; это единственный дефолт во всём компоненте.
49
+ - **Маркер опционален.** Элемент без `UnorderedListExtended.Item.Marker` рендерится вообще без обёртки
50
+ маркера — текст начинается от левого края. Это ключевое отличие от `UnorderedList`, где обёртка
51
+ добавляется всегда.
52
+ - **Маркер-точка рисуется только при `children === undefined`.** `<Marker />` даёт точку,
53
+ а `<Marker>{null}</Marker>` или `<Marker>{false}</Marker>` — пустую обёртку. Проверка строгая
54
+ (`children === undefined`), поэтому условный маркер вида `{cond && <Icon />}` внутри `Marker`
55
+ при `cond === false` не откатится на точку.
56
+ - **`tag` элемента исключён типом** (`Omit<TTextProps<"li">, "tag">`): элемент всегда `<li>`.
57
+
58
+ ---
59
+
60
+ ## Дизайн-токены
61
+
62
+ Собственных CSS-переменных нет. Цвет текста и маркера приходит из типографики `Text` через prop `type`
63
+ элемента: точка залита `currentcolor`, поэтому меняется вместе с цветом текста.
64
+
65
+ Стили — только layout: у списка сброс `margin`/`padding`/`list-style`, у элемента `display: flex`
66
+ с `align-items: flex-start` и `gap: 4px` (плюс `margin-top: 8px` между соседями), у обёртки маркера
67
+ центрирование содержимого.
68
+
69
+ Обёртка маркера тянется на высоту строки элемента (`min-height: 1lh` с фолбэком `20px` для браузеров
70
+ без единицы `lh`), поэтому маркер центрируется по первой строке при любом `size`. Высота — минимум,
71
+ а не фиксированное значение: маркер выше строки (иконка 20px при `B4`) не обрезается.
72
+
73
+ ---
74
+
75
+ ## Инварианты
76
+
77
+ - **`forwardRef`** на всех трёх компонентах — не убирать. Ref указывает на корневой элемент
78
+ (`<ul>`, `<li>`, `<span>` соответственно) — тот же, что получает `className`, `...rest` и `data-tx`.
79
+ - **Составной API через `Object.assign`**: `UnorderedListExtended.Item` и `UnorderedListExtended.Item.Marker` —
80
+ публичные точки входа. Разбиение на отдельные именованные экспорты сломает контракт потребителей.
81
+ - **Маркер-обёртка не добавляется автоматически.** Список не оборачивает и не инспектирует своих детей;
82
+ добавление неявного маркера сломает элементы, задуманные без него.
83
+ - **Строгая проверка `children === undefined`** в маркере — не заменять на проверку на falsy:
84
+ `<Marker>{null}</Marker>` обязан давать пустую обёртку, а не точку.
85
+ - **Вертикальное выравнивание маркера** задаётся высотой обёртки, а не фиксированными вертикальными
86
+ отступами точки: отступы под конкретную строку (`20px` для `B2`/`B3`) сместят маркер на `B1` и `B4`.
87
+ - **`displayName`**: `"UnorderedListExtended"`, `"UnorderedListExtendedItem"`,
88
+ `"UnorderedListExtendedItemMarker"` — не менять.
89
+ - **Barrel `index.ts`** экспортирует типы и `UnorderedListExtended`; субкомпоненты наружу отдельно
90
+ не экспортируются — только через статические свойства.
91
+
92
+ ---
93
+
94
+ ## Accessibility
95
+
96
+ - Семантика штатная: корневой элемент — `<ul>` (`role="list"`), элементы — `<li>` (`role="listitem"`).
97
+ Дополнительных ARIA-атрибутов компонент не выставляет.
98
+ - Маркер лежит в обычном `<span>` и **не** скрыт от скринридеров. Текстовый маркер (например, `"1."`)
99
+ будет озвучен; для декоративного маркера-иконки передавай `aria-hidden="true"` — либо на сам
100
+ `UnorderedListExtended.Item.Marker`, либо на вложенную иконку.
101
+ - Компонент не интерактивный: фокус-менеджмента и клавиатурных обработчиков нет.
102
+ - Язык не хардкодится: весь текст приходит от потребителя.
103
+
104
+ ---
105
+
106
+ ## Связанные компоненты
107
+
108
+ - `UnorderedList` — тот же маркированный список с data-driven API (`items`). Реализован как тонкая
109
+ обёртка над `UnorderedListExtended`: разворачивает каждый элемент массива в `Item` и всегда добавляет
110
+ `Item.Marker`. Типичная точка выбора: данные → `UnorderedList`, произвольная композиция →
111
+ `UnorderedListExtended`. Правки в разметке и стилях здесь видны и в `UnorderedList`.
112
+ - `Text` — типографика элемента. `UnorderedListExtended.Item` рендерится как `Text` с `tag="li"`,
113
+ поэтому props элемента (`size`, `type`, `weight`, `line`) — это props `Text`.
114
+ - `OrderedList` — нумерованный список для той же задачи, когда важен порядок пунктов.
115
+
116
+ ---
117
+
118
+ ## Stories
119
+
120
+ Основные истории: `stories/UnorderedListExtended/UnorderedListExtended.stories.tsx`
121
+ Файлы примеров: `stories/UnorderedListExtended/examples/`
122
+
123
+ | Story | Example file | Что демонстрирует |
124
+ |---|---|---|
125
+ | `Default` | `Default.tsx` | Минимальный список с маркерами по умолчанию |
126
+ | `CustomMarkerText` | `CustomMarkerText.tsx` | Кастомные маркеры-иконки и разные типы текста элементов |
127
+ | `Sizes` | `Sizes.tsx` | Размеры текста элементов `ETextSize.B1`–`B4` |
128
+ | `VisualTests` | `VisualTests.tsx` | Скриншот-покрытие: маркеры по умолчанию, элементы без маркера, иконки, текстовые маркеры, перенос длинного текста, типы, толщина и интерлиньяж, смешанные маркеры в одном списке |
129
+
130
+ Story `Playground` намеренно нет: собственных props у компонента нет, Controls нечем заполнить —
131
+ `docs/ai/stories-guide.md` → «Когда не создавать Playground». По той же причине из docs page убраны
132
+ блоки `Props`/`ArgTypes`.
133
+
134
+ ---
135
+
136
+ ## История изменений
137
+
138
+ | Дата | Изменение |
139
+ |---|---|
140
+ | 2026-08-20 | Создан документ. AI-рефакторинг: уточнены JSDoc компонентов и интерфейсов; добавлены unit-тесты на субкомпоненты `Item` и `Item.Marker`; stories переведены на modern pattern — добавлены `Sizes` и `VisualTests`. Исправлено вертикальное центрирование маркера: обёртка тянется на высоту строки текста вместо вертикальных отступов точки. Публичный API не менялся. |
141
+
142
+ ---
143
+
144
+ ## Примеры использования
145
+
146
+ ### Default
147
+
148
+ `stories/UnorderedListExtended/examples/Default.tsx`
149
+
150
+ ```tsx
151
+ import React from "react";
152
+ import { UnorderedListExtended } from "@sberbusiness/triplex-next";
153
+
154
+ export const Default = () => (
155
+ <UnorderedListExtended>
156
+ <UnorderedListExtended.Item>
157
+ <UnorderedListExtended.Item.Marker />
158
+ List item text
159
+ </UnorderedListExtended.Item>
160
+ <UnorderedListExtended.Item>
161
+ <UnorderedListExtended.Item.Marker />
162
+ List item text
163
+ </UnorderedListExtended.Item>
164
+ <UnorderedListExtended.Item>
165
+ <UnorderedListExtended.Item.Marker />
166
+ List item text
167
+ </UnorderedListExtended.Item>
168
+ </UnorderedListExtended>
169
+ );
170
+ ```
171
+
172
+ ### CustomMarkerText
173
+
174
+ `stories/UnorderedListExtended/examples/CustomMarkerText.tsx`
175
+
176
+ ```tsx
177
+ import React from "react";
178
+ import { UnorderedListExtended, EFontType } from "@sberbusiness/triplex-next";
179
+ import { CheckboxtickStrokeSrvIcon20 } from "@sberbusiness/icons-next";
180
+
181
+ export const CustomMarkerText = () => (
182
+ <div style={{ maxWidth: 200 }}>
183
+ <UnorderedListExtended>
184
+ <UnorderedListExtended.Item type={EFontType.PRIMARY}>
185
+ <UnorderedListExtended.Item.Marker>
186
+ <CheckboxtickStrokeSrvIcon20 paletteIndex={0} />
187
+ </UnorderedListExtended.Item.Marker>
188
+ Анализ рисков по 115-ФЗ
189
+ </UnorderedListExtended.Item>
190
+ <UnorderedListExtended.Item type={EFontType.PRIMARY}>
191
+ <UnorderedListExtended.Item.Marker>
192
+ <CheckboxtickStrokeSrvIcon20 paletteIndex={0} />
193
+ </UnorderedListExtended.Item.Marker>
194
+ Рекомендации с учётом отрасли
195
+ </UnorderedListExtended.Item>
196
+ <UnorderedListExtended.Item type={EFontType.PRIMARY}>
197
+ <UnorderedListExtended.Item.Marker>
198
+ <CheckboxtickStrokeSrvIcon20 paletteIndex={0} />
199
+ </UnorderedListExtended.Item.Marker>
200
+ Проверка данных ФНС и других госисточников
201
+ </UnorderedListExtended.Item>
202
+ <UnorderedListExtended.Item type={EFontType.PRIMARY}>
203
+ <UnorderedListExtended.Item.Marker>
204
+ <CheckboxtickStrokeSrvIcon20 paletteIndex={0} />
205
+ </UnorderedListExtended.Item.Marker>
206
+ Оценка финансовой устойчивости компании
207
+ </UnorderedListExtended.Item>
208
+ <UnorderedListExtended.Item type={EFontType.TERTIARY}>
209
+ <UnorderedListExtended.Item.Marker>
210
+ <CheckboxtickStrokeSrvIcon20 paletteIndex={5} />
211
+ </UnorderedListExtended.Item.Marker>
212
+ Личный менеджер
213
+ </UnorderedListExtended.Item>
214
+ <UnorderedListExtended.Item type={EFontType.TERTIARY}>
215
+ <UnorderedListExtended.Item.Marker>
216
+ <CheckboxtickStrokeSrvIcon20 paletteIndex={5} />
217
+ </UnorderedListExtended.Item.Marker>
218
+ Помощь при запросах и отказах от банка по операциям
219
+ </UnorderedListExtended.Item>
220
+ </UnorderedListExtended>
221
+ </div>
222
+ );
223
+ ```
224
+
225
+ ### Sizes
226
+
227
+ `stories/UnorderedListExtended/examples/Sizes.tsx`
228
+
229
+ ```tsx
230
+ import React from "react";
231
+ import { UnorderedListExtended, ETextSize } from "@sberbusiness/triplex-next";
232
+
233
+ const SIZES = Object.values(ETextSize);
234
+
235
+ export const Sizes = () => (
236
+ <div style={{ maxWidth: "300px", display: "flex", flexDirection: "column", gap: "24px" }}>
237
+ {SIZES.map((size) => (
238
+ <div key={size}>
239
+ <div style={{ marginBottom: "8px", fontSize: "16px", fontWeight: "700" }}>{size}</div>
240
+ <UnorderedListExtended>
241
+ <UnorderedListExtended.Item size={size}>
242
+ <UnorderedListExtended.Item.Marker />
243
+ List item text
244
+ </UnorderedListExtended.Item>
245
+ <UnorderedListExtended.Item size={size}>
246
+ <UnorderedListExtended.Item.Marker />
247
+ List item text
248
+ </UnorderedListExtended.Item>
249
+ </UnorderedListExtended>
250
+ </div>
251
+ ))}
252
+ </div>
253
+ );
254
+ ```
255
+