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