@sberbusiness/triplex-next-mcp-server 0.24.0-beta2 → 1.40.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 (73) hide show
  1. package/README.md +10 -0
  2. package/bundle/components/AlertContext.md +268 -0
  3. package/bundle/components/BodyPage.md +186 -0
  4. package/bundle/components/Button.md +93 -85
  5. package/bundle/components/ButtonDropdown.md +36 -70
  6. package/bundle/components/ButtonDropdownExtended.md +422 -0
  7. package/bundle/components/ButtonIcon.md +41 -48
  8. package/bundle/components/Caption.md +291 -0
  9. package/bundle/components/Checkbox.md +43 -122
  10. package/bundle/components/CheckboxXGroup.md +109 -46
  11. package/bundle/components/CheckboxYGroup.md +77 -49
  12. package/bundle/components/CodeText.md +197 -0
  13. package/bundle/components/Col.md +311 -162
  14. package/bundle/components/CollapsibleTree.md +584 -0
  15. package/bundle/components/CollapsibleTreeExtended.md +422 -0
  16. package/bundle/components/Dropdown.md +748 -346
  17. package/bundle/components/EmptyView.md +14 -15
  18. package/bundle/components/FooterPage.md +203 -0
  19. package/bundle/components/Gap.md +115 -57
  20. package/bundle/components/HeaderPage.md +226 -0
  21. package/bundle/components/HelpBox.md +45 -84
  22. package/bundle/components/ImageGallery.md +423 -0
  23. package/bundle/components/ImageGalleryExtended.md +606 -0
  24. package/bundle/components/LightBox.md +2252 -233
  25. package/bundle/components/List.md +216 -183
  26. package/bundle/components/ListActionItem.md +157 -0
  27. package/bundle/components/ListItem.md +276 -0
  28. package/bundle/components/ListItemControlsButton.md +103 -0
  29. package/bundle/components/ListItemControlsButtonDropdown.md +107 -0
  30. package/bundle/components/ListItemSelectable.md +99 -0
  31. package/bundle/components/ListItemTable.md +390 -0
  32. package/bundle/components/ListMaster.md +876 -156
  33. package/bundle/components/ListMasterFooter.md +80 -0
  34. package/bundle/components/ListMasterHeader.md +86 -0
  35. package/bundle/components/ListSortable.md +153 -0
  36. package/bundle/components/ListSortableItem.md +175 -0
  37. package/bundle/components/ListTableItem.md +391 -0
  38. package/bundle/components/ModalWindow.md +427 -237
  39. package/bundle/components/MonthYearField.md +145 -109
  40. package/bundle/components/Notification.md +625 -155
  41. package/bundle/components/Overlay.md +271 -170
  42. package/bundle/components/Page.md +284 -186
  43. package/bundle/components/Pagination.md +206 -229
  44. package/bundle/components/Portal.md +131 -67
  45. package/bundle/components/Row.md +171 -69
  46. package/bundle/components/Text.md +320 -0
  47. package/bundle/components/TextField.md +364 -97
  48. package/bundle/components/Title.md +296 -0
  49. package/bundle/guides/codestyle.md +38 -11
  50. package/bundle/guides/commits.md +119 -26
  51. package/bundle/guides/context.md +34 -30
  52. package/bundle/guides/stories.md +110 -40
  53. package/bundle/guides/template.md +3 -7
  54. package/bundle/guides/tests.md +48 -2
  55. package/bundle/manifest.json +275 -30
  56. package/bundle/release-notes/1.26.0.mdx +33 -2
  57. package/bundle/release-notes/1.27.0.mdx +43 -0
  58. package/bundle/release-notes/1.28.0.mdx +25 -0
  59. package/bundle/release-notes/1.29.0.mdx +47 -0
  60. package/bundle/release-notes/1.30.0.mdx +56 -0
  61. package/bundle/release-notes/1.31.0.mdx +52 -0
  62. package/bundle/release-notes/1.32.0.mdx +35 -0
  63. package/bundle/release-notes/1.33.0.mdx +61 -0
  64. package/bundle/release-notes/1.34.0.mdx +35 -0
  65. package/bundle/release-notes/1.35.0.mdx +21 -0
  66. package/bundle/release-notes/1.35.1.mdx +11 -0
  67. package/bundle/release-notes/1.36.0.mdx +21 -0
  68. package/bundle/release-notes/1.37.0.mdx +71 -0
  69. package/bundle/release-notes/1.38.0.mdx +36 -0
  70. package/bundle/release-notes/1.39.0.mdx +66 -0
  71. package/bundle/release-notes/1.40.0.mdx +27 -0
  72. package/bundle/release-notes/1.41.0.mdx +7 -0
  73. package/package.json +1 -1
@@ -0,0 +1,584 @@
1
+ ---
2
+ component: CollapsibleTree
3
+ category: CollapsibleTree
4
+ related: [CollapsibleTreeExtended, CollapsibleTreeNodeHeader, CollapsibleTreeNodeLabel, TreeView, AccordionBase]
5
+ tokens:
6
+ - --triplex-next-CollapsibleTree-Header_Background_Hover
7
+ - --triplex-next-CollapsibleTree-Header_Shadow_Focus
8
+ stories: stories/CollapsibleTree/CollapsibleTree.stories.tsx
9
+ version: "1.0"
10
+ ---
11
+
12
+ # CollapsibleTree
13
+
14
+ ## Назначение
15
+
16
+ Готовое дерево с раскрывающимися ветками и типовым UI узла: кнопка-заголовок с
17
+ шевроном-индикатором раскрытия, hover и focus-visible на интерактивной строке.
18
+ Обёртка над [`CollapsibleTreeExtended`](../CollapsibleTreeExtended/CollapsibleTreeExtended-ai.md).
19
+
20
+ Структура задаётся декларативно через массив `nodes`: ветка
21
+ (`ICollapsibleTreeNodeBranch`) с `label` и опциональными `children`, либо лист
22
+ (`ICollapsibleTreeNodeLeaf`) с произвольным `content`. На верхнем уровне
23
+ допустимы только ветки.
24
+
25
+ Используй `CollapsibleTree` когда: достаточно типового UI «папка/файл», нужен
26
+ шеврон, hover и focus-visible, и хочется задавать структуру через данные.
27
+
28
+ Используй `CollapsibleTreeExtended` когда: нужен нестандартный UI узла —
29
+ своя иконка раскрытия, кастомный header, особое поведение клика, layout с
30
+ несколькими колонками, полный контроль состояния раскрытия из родителя.
31
+
32
+ ---
33
+
34
+ ## Варианты и props
35
+
36
+ ### `CollapsibleTree`
37
+
38
+ | Prop | Тип | По умолчанию | Описание |
39
+ |---|---|---|---|
40
+ | `nodes` | `ICollapsibleTreeNodeBranch[]` | — | Данные дерева. На верхнем уровне — только ветки; листья — внутри `children` ветки |
41
+ | `children` | `never` | — | Запрещён — структура задаётся через `nodes` |
42
+ | `...HTMLUListElementAttributes` | — | — | Атрибуты `<ul>`, наследуются от `CollapsibleTreeExtended` → `TreeView` |
43
+
44
+ ### Модель данных
45
+
46
+ `ICollapsibleTreeNodeBranch` — ветка:
47
+
48
+ | Поле | Тип | Описание |
49
+ |---|---|---|
50
+ | `id` | `string` | Уникальный идентификатор узла в дереве |
51
+ | `label` | `React.ReactNode` | Содержимое заголовка. Для типовой типографики — оборачивай в `CollapsibleTreeNodeLabel` |
52
+ | `children` | `TCollapsibleTreeNode[]` | Дочерние узлы. Пустой массив / `undefined` — ветка отображается без шеврона и не раскрывается |
53
+ | `defaultOpened` | `boolean` | Начальное состояние раскрытия |
54
+ | `disabled` | `boolean` | Отключает узел: кнопка заголовка неактивна, шеврон отображается приглушённым цветом. Шеврон и `aria-expanded` сохраняются. Для приглушённого текста передавай `type={EFontType.DISABLED}` в `CollapsibleTreeNodeLabel` внутри `label` |
55
+
56
+ `ICollapsibleTreeNodeLeaf` — лист:
57
+
58
+ | Поле | Тип | Описание |
59
+ |---|---|---|
60
+ | `id` | `string` | Уникальный идентификатор узла в дереве |
61
+ | `content` | `React.ReactNode` | Произвольный контент листа |
62
+
63
+ Type guard: `isCollapsibleTreeNodeLeaf(node)` — `"content" in node`.
64
+
65
+ ### `CollapsibleTreeNodeHeader`
66
+
67
+ Кнопка-заголовок для интеграции с кастомным `renderHeader` у
68
+ `CollapsibleTreeExtended`. Принимает provide-props из `CollapsibleTreeExtended.Node`
69
+ (`opened`, `toggle`, `hasChildNodes`, `animating`, `activeNode`, `isLastNode`)
70
+ и все стандартные `React.ButtonHTMLAttributes<HTMLButtonElement>`. Внутри
71
+ `CollapsibleTree` подставляется автоматически.
72
+
73
+ | Поведение | Условие |
74
+ |---|---|
75
+ | `disabled={true}` на `<button>` | `hasChildNodes === false` либо проп `disabled === true` |
76
+ | `aria-expanded={opened}` | `hasChildNodes === true` (для листьев не ставится, при `disabled` сохраняется) |
77
+ | Шеврон отрендерен | `hasChildNodes === true` (в том числе при `disabled`) |
78
+ | Класс `interactive` | `hasChildNodes === true && !disabled` |
79
+ | Глобальный класс `hoverable` | всегда — управляет цветом шеврона через стили `@sberbusiness/icons-next` (как в `IconWrapper`) |
80
+ | Глобальный класс `active` | `hasChildNodes === true && opened === true` — цвет шеврона раскрытого узла (у леаф-нод `opened` всегда `true` из-за хака `LeafNode`, поэтому им класс не ставится) |
81
+ | Глобальный класс `disabled` | проп `disabled === true` — приглушает цвет шеврона |
82
+ | Класс `chevron.opened` | `opened === true` |
83
+ | `toggle(!opened)` вызывается | по клику, только при `hasChildNodes === true && !disabled` |
84
+ | Кастомный `onClick` | вызывается всегда после `toggle` |
85
+
86
+ Проп `disabled` (из `ButtonHTMLAttributes`) — единственный HTML-атрибут,
87
+ который header интерпретирует сам: он добавляет визуальное disabled-состояние
88
+ и блокирует `toggle`. Передать `disabled={false}` для узла без детей нельзя —
89
+ внутренняя логика важнее (`disabled || !hasChildNodes`).
90
+
91
+ ### `CollapsibleTreeNodeLabel`
92
+
93
+ Обёртка над `Text` для лейбла ветки. Дефолты — `size=B1`, `weight=SEMIBOLD`.
94
+
95
+ | Prop | Тип | По умолчанию | Описание |
96
+ |---|---|---|---|
97
+ | `size` | `ETextSize` | `B1` | Размер текста |
98
+ | `weight` | `EFontWeightText` | `SEMIBOLD` | Толщина шрифта |
99
+ | `...TTextProps` | — | — | Все props `Text<"span">` кроме `tag` и `size` (тэг зафиксирован как `span`) |
100
+
101
+ ---
102
+
103
+ ## Дизайн-токены
104
+
105
+ ```text
106
+ --triplex-next-CollapsibleTree-Header_Background_Hover
107
+ --triplex-next-CollapsibleTree-Header_Shadow_Focus
108
+ ```
109
+
110
+ Цвета disabled-состояния задаются без собственных токенов: шеврон — глобальным
111
+ классом `disabled` на кнопке заголовка (класс `hoverable` стоит всегда, стили `@sberbusiness/icons-next`),
112
+ текст — `type={EFontType.DISABLED}` у `CollapsibleTreeNodeLabel` на стороне потребителя.
113
+
114
+ Анимация раскрытия и базовая семантика дерева наследуются от
115
+ `CollapsibleTreeExtended` / `TreeView` / `AccordionBase` — своих токенов на
116
+ анимацию у `CollapsibleTree` нет.
117
+
118
+ ---
119
+
120
+ ## Инварианты
121
+
122
+ - **`CollapsibleTree` — FC без `forwardRef`.** Под капотом class-компонент
123
+ `TreeView`, ref не пробрасывается осмысленно. Тот же инвариант, что у
124
+ `CollapsibleTreeExtended` и `CollapsibleTreeLeafNode` (тоже проксируют в
125
+ class-компонент).
126
+ - **`CollapsibleTreeNodeHeader` — `forwardRef<HTMLButtonElement>`** — ref
127
+ идёт на корневой `<button>`, чтобы потребитель мог управлять фокусом
128
+ заголовка (например, программно фокусировать конкретный узел).
129
+ - **`CollapsibleTreeLeafContent` — `forwardRef<HTMLDivElement>`** — ref на
130
+ корневой `<div>` контента листа (стандартный контракт для контейнерных
131
+ компонентов).
132
+ - **`CollapsibleTreeNodeLabel` — `forwardRef<HTMLSpanElement>`** — нужен для
133
+ измерения ширины лейбла потребителем.
134
+ - **Публичные экспорты barrel** (`src/components/CollapsibleTree/index.ts`):
135
+ `CollapsibleTree`, `CollapsibleTreeNodeHeader`, `CollapsibleTreeNodeLabel`,
136
+ все типы из `types.ts` (`ICollapsibleTreeNodeBranch`, `ICollapsibleTreeNodeLeaf`,
137
+ `TCollapsibleTreeNode`, `isCollapsibleTreeNodeLeaf`). Менять имена нельзя.
138
+ - **Внутренние компоненты** — `CollapsibleTreeBranchNode`, `CollapsibleTreeLeafNode`,
139
+ `CollapsibleTreeLeafContent` — намеренно НЕ в barrel. Если внешнему
140
+ потребителю нужен кастомный лист или ветка — это сигнал использовать
141
+ `CollapsibleTreeExtended` напрямую, а не расширять `CollapsibleTree`.
142
+ - **Диспетчер ветка/лист инлайнится в `CollapsibleTreeBranchNode`** — выбор
143
+ через `isCollapsibleTreeNodeLeaf(child)` прямо в `renderBody`. Раньше был
144
+ отдельный `CollapsibleTreeNode.tsx`, но это создавало циклическую
145
+ зависимость `BranchNode ↔ Node` (madge `deps:cycles`). Не возвращать.
146
+ - **`children: never` на `CollapsibleTree`** — структура задаётся только через
147
+ `nodes`. Передача `children` запрещена типом.
148
+ - **`CollapsibleTreeBranchNode` хранит локальный `opened`** — инициализируется
149
+ из `node.defaultOpened ?? false`. Чтобы программно менять раскрытие извне —
150
+ используй `CollapsibleTreeExtended` (controlled-режим через `opened` /
151
+ `toggle`).
152
+ - **`CollapsibleTreeLeafNode` использует «семантический хак»** — передаёт в
153
+ `CollapsibleTreeExtended.Node` `opened={true}` и `toggle=noop`. Это
154
+ намеренное решение по контракту API `Extended.Node` (renderBody возвращает
155
+ `null`, шеврон не рендерится потому, что `hasChildNodes === false`).
156
+ Не переписывать без обсуждения с командой.
157
+ - **Корневой DOM** — `<ul>` от `TreeView`, узлы — `<li>`.
158
+
159
+ ---
160
+
161
+ ## Accessibility
162
+
163
+ - Семантика дерева наследуется от `TreeView` — корневой `<ul>`, узлы `<li>`,
164
+ ветки оборачиваются в `<ul role="group">` через `TreeView.Group` при наличии
165
+ детей.
166
+ - Клавиатурная навигация по дереву (стрелки, Home/End, раскрытие/сворачивание)
167
+ обрабатывается на уровне `TreeView` — `CollapsibleTree` ничего не добавляет
168
+ сверху.
169
+ - `CollapsibleTreeNodeHeader` рендерит нативный `<button>` с
170
+ `aria-expanded={opened}` для веток с детьми; для веток без детей и листьев
171
+ кнопка `disabled` и `aria-expanded` не выставляется.
172
+ - Лейбл (`label` в `ICollapsibleTreeNodeBranch`) — это видимая текстовая
173
+ подпись, которая служит accessible name кнопки-заголовка. Если в `label`
174
+ передаётся не-текстовый контент (иконка, badge) — потребитель **обязан**
175
+ обеспечить accessible name через `aria-label` на самой кнопке заголовка
176
+ через `CollapsibleTreeExtended` (для типового UI таких кейсов не бывает).
177
+ - Свёрнутая ветка получает `visibility: hidden` на body через
178
+ `CollapsibleTreeExtended` — Tab не уходит в скрытое содержимое.
179
+ - Фокус-стиль — `:focus-visible` через токен
180
+ `--triplex-next-CollapsibleTree-Header_Shadow_Focus`.
181
+
182
+ ---
183
+
184
+ ## Связанные компоненты
185
+
186
+ - [`CollapsibleTreeExtended`](../CollapsibleTreeExtended/CollapsibleTreeExtended-ai.md)
187
+ — низкоуровневая база с произвольным `renderHeader`/`renderBody`.
188
+ `CollapsibleTree` — типовая обёртка над ней.
189
+ - `CollapsibleTreeNodeHeader` (этот же barrel) — кнопка-заголовок с шевроном,
190
+ доступна для использования в кастомном `renderHeader` у `CollapsibleTreeExtended`.
191
+ - `CollapsibleTreeNodeLabel` (этот же barrel) — типографика заголовка
192
+ (`Text` со span-тегом, дефолты B1 / SEMIBOLD). Используй внутри `label`
193
+ ветки или в кастомном header'е, когда нужен другой `size`/`weight`.
194
+ - `TreeView` (`src/components/TreeView`) — нижний слой: семантика дерева,
195
+ абстрактное дерево нод, фокус, активная нода, клавиатурная навигация.
196
+ - `AccordionBase` (`src/components/AccordionBase`) — анимация раскрытия,
197
+ используется внутри каждой ветки через `CollapsibleTreeExtended`.
198
+
199
+ ---
200
+
201
+ ## Stories
202
+
203
+ Основные истории: `stories/CollapsibleTree/CollapsibleTree.stories.tsx`
204
+ Файлы примеров: `stories/CollapsibleTree/examples/`
205
+
206
+ | Story | Example file | Что демонстрирует |
207
+ |---|---|---|
208
+ | `Playground` | — | Интерактивный контрол `nodes` |
209
+ | `Default` | `Default.tsx` | Базовое плоское дерево «папка/файл» |
210
+ | `Opened` | `Opened.tsx` | Стартово раскрытая ветка через `defaultOpened` |
211
+ | `Nested` | `Nested.tsx` | Многоуровневое дерево с вложенными ветками |
212
+ | `Custom label` | `CustomLabel.tsx` | Переопределение `size`/`weight` через `CollapsibleTreeNodeLabel` |
213
+ | `Disabled` | `Disabled.tsx` | Отключённый узел через `disabled: true` |
214
+ | `VisualTests` | `VisualTestsExample.tsx` | Четыре состояния в одном кадре — для baseline-скриншотов |
215
+
216
+ ---
217
+
218
+ ## История изменений
219
+
220
+ | Дата | Изменение |
221
+ |---|---|
222
+ | 2026-05-15 | Создан документ. Зафиксирован «семантический хак» `LeafNode` (`opened=true + toggle=noop`), список внутренних компонентов вне barrel, инварианты по `forwardRef` |
223
+ | 2026-05-15 | `CollapsibleTreeNodeHeader` и `CollapsibleTreeLeafContent` переведены на `forwardRef` (DOM-ref на `<button>` и `<div>` соответственно). Защищены инварианты `<button>` (`type`, `disabled`, `aria-expanded`) от перетирания через `{...props}` |
224
+ | 2026-07-06 | Шеврон открытого узла теперь указывает вверх (`rotate(-90deg)`), а не вниз |
225
+ | 2026-07-06 | Добавлено свойство `disabled` у `ICollapsibleTreeNodeBranch` и поддержка пропа `disabled` в `CollapsibleTreeNodeHeader`. Без новых токенов: шеврон приглушается глобальными классами `hoverable disabled` (icons-next), текст — через `type={EFontType.DISABLED}` у лейбла |
226
+ | 2026-07-14 | Глобальный класс `hoverable` (icons-next) на кнопке заголовка теперь стоит всегда, а не только при `disabled` — для корректной окраски шеврона. Добавлен класс `active` на раскрытый узел с детьми (по паттерну `IconWrapper`/`Button`) |
227
+
228
+ ---
229
+
230
+ ## Примеры использования
231
+
232
+ ### Default
233
+
234
+ `stories/CollapsibleTree/examples/Default.tsx`
235
+
236
+ ```tsx
237
+ import React from "react";
238
+ import {
239
+ CollapsibleTree,
240
+ CollapsibleTreeNodeLabel,
241
+ ETextSize,
242
+ ICollapsibleTreeNodeBranch,
243
+ Text,
244
+ } from "@sberbusiness/triplex-next";
245
+
246
+ const nodes: ICollapsibleTreeNodeBranch[] = [
247
+ {
248
+ id: "folder-1",
249
+ label: <CollapsibleTreeNodeLabel>Folder text</CollapsibleTreeNodeLabel>,
250
+ children: [
251
+ {
252
+ id: "file-1",
253
+ content: (
254
+ <>
255
+ <Text size={ETextSize.B1} tag="span">
256
+ File text
257
+ </Text>
258
+ <Text size={ETextSize.B1} tag="span">
259
+ File text
260
+ </Text>
261
+ </>
262
+ ),
263
+ },
264
+ ],
265
+ },
266
+ {
267
+ id: "folder-2",
268
+ label: <CollapsibleTreeNodeLabel>Folder text</CollapsibleTreeNodeLabel>,
269
+ children: [
270
+ {
271
+ id: "file-2",
272
+ content: (
273
+ <Text size={ETextSize.B1} tag="span">
274
+ File text
275
+ </Text>
276
+ ),
277
+ },
278
+ ],
279
+ },
280
+ {
281
+ id: "folder-3",
282
+ label: <CollapsibleTreeNodeLabel>Folder text</CollapsibleTreeNodeLabel>,
283
+ children: [
284
+ {
285
+ id: "file-3",
286
+ content: (
287
+ <Text size={ETextSize.B1} tag="span">
288
+ File text
289
+ </Text>
290
+ ),
291
+ },
292
+ ],
293
+ },
294
+ ];
295
+
296
+ export const Default = () => (
297
+ <div style={{ maxWidth: 320 }}>
298
+ <CollapsibleTree nodes={nodes} />
299
+ </div>
300
+ );
301
+ ```
302
+
303
+ ### Opened
304
+
305
+ `stories/CollapsibleTree/examples/Opened.tsx`
306
+
307
+ ```tsx
308
+ import React from "react";
309
+ import {
310
+ CollapsibleTree,
311
+ CollapsibleTreeNodeLabel,
312
+ ETextSize,
313
+ ICollapsibleTreeNodeBranch,
314
+ Text,
315
+ } from "@sberbusiness/triplex-next";
316
+
317
+ const nodes: ICollapsibleTreeNodeBranch[] = [
318
+ {
319
+ id: "folder-1",
320
+ label: <CollapsibleTreeNodeLabel>Folder text</CollapsibleTreeNodeLabel>,
321
+ children: [
322
+ {
323
+ id: "file-1",
324
+ content: (
325
+ <Text size={ETextSize.B1} tag="span">
326
+ File text
327
+ </Text>
328
+ ),
329
+ },
330
+ ],
331
+ },
332
+ {
333
+ id: "folder-2",
334
+ label: <CollapsibleTreeNodeLabel>Folder text</CollapsibleTreeNodeLabel>,
335
+ defaultOpened: true,
336
+ children: [
337
+ {
338
+ id: "file-2",
339
+ content: (
340
+ <Text size={ETextSize.B1} tag="span">
341
+ File text
342
+ </Text>
343
+ ),
344
+ },
345
+ ],
346
+ },
347
+ {
348
+ id: "folder-3",
349
+ label: <CollapsibleTreeNodeLabel>Folder text</CollapsibleTreeNodeLabel>,
350
+ children: [
351
+ {
352
+ id: "file-3",
353
+ content: (
354
+ <Text size={ETextSize.B1} tag="span">
355
+ File text
356
+ </Text>
357
+ ),
358
+ },
359
+ ],
360
+ },
361
+ ];
362
+
363
+ export const Opened = () => (
364
+ <div style={{ maxWidth: 320 }}>
365
+ <CollapsibleTree nodes={nodes} />
366
+ </div>
367
+ );
368
+ ```
369
+
370
+ ### Nested
371
+
372
+ `stories/CollapsibleTree/examples/Nested.tsx`
373
+
374
+ ```tsx
375
+ import React from "react";
376
+ import {
377
+ CollapsibleTree,
378
+ CollapsibleTreeNodeLabel,
379
+ ETextSize,
380
+ ICollapsibleTreeNodeBranch,
381
+ Text,
382
+ } from "@sberbusiness/triplex-next";
383
+
384
+ const nodes: ICollapsibleTreeNodeBranch[] = [
385
+ {
386
+ id: "folder-1",
387
+ label: <CollapsibleTreeNodeLabel>Folder text</CollapsibleTreeNodeLabel>,
388
+ children: [
389
+ {
390
+ id: "file-1",
391
+ content: (
392
+ <Text size={ETextSize.B1} tag="span">
393
+ File text
394
+ </Text>
395
+ ),
396
+ },
397
+ ],
398
+ },
399
+ {
400
+ id: "folder-2",
401
+ label: <CollapsibleTreeNodeLabel>Folder text</CollapsibleTreeNodeLabel>,
402
+ defaultOpened: true,
403
+ children: [
404
+ {
405
+ id: "folder-2-1",
406
+ label: <CollapsibleTreeNodeLabel>Folder text</CollapsibleTreeNodeLabel>,
407
+ defaultOpened: true,
408
+ children: [
409
+ {
410
+ id: "file-2-1-1",
411
+ content: (
412
+ <Text size={ETextSize.B1} tag="span">
413
+ File text
414
+ </Text>
415
+ ),
416
+ },
417
+ ],
418
+ },
419
+ ],
420
+ },
421
+ {
422
+ id: "folder-3",
423
+ label: <CollapsibleTreeNodeLabel>Folder text</CollapsibleTreeNodeLabel>,
424
+ defaultOpened: true,
425
+ children: [
426
+ {
427
+ id: "file-3",
428
+ content: (
429
+ <Text size={ETextSize.B1} tag="span">
430
+ File text
431
+ </Text>
432
+ ),
433
+ },
434
+ ],
435
+ },
436
+ ];
437
+
438
+ export const Nested = () => (
439
+ <div style={{ maxWidth: 420 }}>
440
+ <CollapsibleTree nodes={nodes} />
441
+ </div>
442
+ );
443
+ ```
444
+
445
+ ### Custom label
446
+
447
+ `stories/CollapsibleTree/examples/CustomLabel.tsx`
448
+
449
+ ```tsx
450
+ import React from "react";
451
+ import {
452
+ CollapsibleTree,
453
+ CollapsibleTreeNodeLabel,
454
+ EFontWeightText,
455
+ ETextSize,
456
+ ICollapsibleTreeNodeBranch,
457
+ Text,
458
+ } from "@sberbusiness/triplex-next";
459
+
460
+ const nodes: ICollapsibleTreeNodeBranch[] = [
461
+ {
462
+ id: "folder-1",
463
+ label: <CollapsibleTreeNodeLabel size={ETextSize.B3}>Folder text (B3)</CollapsibleTreeNodeLabel>,
464
+ children: [
465
+ {
466
+ id: "file-1",
467
+ content: (
468
+ <Text size={ETextSize.B3} tag="span">
469
+ File text
470
+ </Text>
471
+ ),
472
+ },
473
+ ],
474
+ },
475
+ {
476
+ id: "folder-2",
477
+ label: (
478
+ <CollapsibleTreeNodeLabel size={ETextSize.B2} weight={EFontWeightText.REGULAR}>
479
+ Folder text (B2, regular)
480
+ </CollapsibleTreeNodeLabel>
481
+ ),
482
+ defaultOpened: true,
483
+ children: [
484
+ {
485
+ id: "file-2",
486
+ content: (
487
+ <Text size={ETextSize.B2} tag="span">
488
+ File text
489
+ </Text>
490
+ ),
491
+ },
492
+ ],
493
+ },
494
+ {
495
+ id: "folder-3",
496
+ label: <CollapsibleTreeNodeLabel size={ETextSize.B1}>Folder text (B1, default)</CollapsibleTreeNodeLabel>,
497
+ children: [
498
+ {
499
+ id: "file-3",
500
+ content: (
501
+ <Text size={ETextSize.B1} tag="span">
502
+ File text
503
+ </Text>
504
+ ),
505
+ },
506
+ ],
507
+ },
508
+ ];
509
+
510
+ export const CustomLabel = () => (
511
+ <div style={{ maxWidth: 360 }}>
512
+ <CollapsibleTree nodes={nodes} />
513
+ </div>
514
+ );
515
+ ```
516
+
517
+ ### Disabled
518
+
519
+ `stories/CollapsibleTree/examples/Disabled.tsx`
520
+
521
+ ```tsx
522
+ import React from "react";
523
+ import {
524
+ CollapsibleTree,
525
+ CollapsibleTreeNodeLabel,
526
+ EFontType,
527
+ ETextSize,
528
+ ICollapsibleTreeNodeBranch,
529
+ Text,
530
+ } from "@sberbusiness/triplex-next";
531
+
532
+ const nodes: ICollapsibleTreeNodeBranch[] = [
533
+ {
534
+ id: "folder-1",
535
+ label: <CollapsibleTreeNodeLabel>Folder text</CollapsibleTreeNodeLabel>,
536
+ children: [
537
+ {
538
+ id: "file-1",
539
+ content: (
540
+ <Text size={ETextSize.B1} tag="span">
541
+ File text
542
+ </Text>
543
+ ),
544
+ },
545
+ ],
546
+ },
547
+ {
548
+ id: "folder-2",
549
+ label: <CollapsibleTreeNodeLabel type={EFontType.DISABLED}>Disabled folder</CollapsibleTreeNodeLabel>,
550
+ disabled: true,
551
+ children: [
552
+ {
553
+ id: "file-2",
554
+ content: (
555
+ <Text size={ETextSize.B1} tag="span">
556
+ File text
557
+ </Text>
558
+ ),
559
+ },
560
+ ],
561
+ },
562
+ {
563
+ id: "folder-3",
564
+ label: <CollapsibleTreeNodeLabel>Folder text</CollapsibleTreeNodeLabel>,
565
+ children: [
566
+ {
567
+ id: "file-3",
568
+ content: (
569
+ <Text size={ETextSize.B1} tag="span">
570
+ File text
571
+ </Text>
572
+ ),
573
+ },
574
+ ],
575
+ },
576
+ ];
577
+
578
+ export const Disabled = () => (
579
+ <div style={{ maxWidth: 320 }}>
580
+ <CollapsibleTree nodes={nodes} />
581
+ </div>
582
+ );
583
+ ```
584
+