@sberbusiness/triplex-next-mcp-server 0.36.0-beta0 → 1.41.0-beta
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundle/components/AlertContext.md +268 -0
- package/bundle/components/Button.md +5 -2
- package/bundle/components/ButtonDropdown.md +9 -1
- package/bundle/components/ButtonDropdownExtended.md +422 -0
- package/bundle/components/ButtonIcon.md +7 -1
- package/bundle/components/Calendar.md +183 -368
- package/bundle/components/Caption.md +291 -0
- package/bundle/components/Chip.md +310 -314
- package/bundle/components/CodeText.md +197 -0
- package/bundle/components/Col.md +311 -162
- package/bundle/components/CollapsibleTree.md +6 -3
- package/bundle/components/CollapsibleTreeExtended.md +6 -2
- package/bundle/components/Dropdown.md +748 -346
- package/bundle/components/FormField.md +468 -232
- package/bundle/components/IconWrapper.md +142 -89
- package/bundle/components/Island.md +221 -129
- package/bundle/components/KeyDownListener.md +215 -102
- package/bundle/components/LightBox.md +2252 -233
- package/bundle/components/List.md +26 -1
- package/bundle/components/ListActionItem.md +157 -0
- package/bundle/components/ListItem.md +34 -9
- package/bundle/components/ListItemSelectable.md +2 -2
- package/bundle/components/ListMaster.md +4 -5
- package/bundle/components/ListTableItem.md +391 -0
- package/bundle/components/LoaderMiddle.md +265 -0
- package/bundle/components/LoaderScreen.md +178 -81
- package/bundle/components/Notification.md +21 -21
- package/bundle/components/Page.md +1 -0
- package/bundle/components/Portal.md +131 -67
- package/bundle/components/Row.md +171 -69
- package/bundle/components/Text.md +320 -0
- package/bundle/components/TextField.md +364 -97
- package/bundle/components/ThemeProvider.md +305 -117
- package/bundle/components/Title.md +296 -0
- package/bundle/components/Tooltip.md +421 -181
- package/bundle/guides/commits.md +126 -24
- package/bundle/guides/context.md +1 -1
- package/bundle/guides/tests.md +42 -0
- package/bundle/manifest.json +109 -23
- package/bundle/release-notes/1.37.0.mdx +42 -1
- package/bundle/release-notes/1.38.0.mdx +36 -0
- package/bundle/release-notes/1.39.0.mdx +66 -0
- package/bundle/release-notes/1.40.0.mdx +27 -0
- package/bundle/release-notes/1.41.0.mdx +83 -0
- package/bundle/release-notes/1.42.0.mdx +7 -0
- package/package.json +1 -1
package/bundle/components/Col.md
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
component: Col
|
|
3
3
|
category: Layout
|
|
4
|
-
|
|
5
|
-
figma-file: ""
|
|
6
|
-
related: [Row, Page, Gap]
|
|
4
|
+
related: [Row, Gap]
|
|
7
5
|
tokens: []
|
|
8
6
|
stories: stories/Col/Col.stories.tsx
|
|
9
7
|
version: "1.0"
|
|
@@ -13,209 +11,360 @@ version: "1.0"
|
|
|
13
11
|
|
|
14
12
|
## Назначение
|
|
15
13
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
для компенсации padding'ов Col).
|
|
14
|
+
Колонка адаптивной 12-колоночной сетки (по модели Bootstrap 4). Задаёт ширину,
|
|
15
|
+
отступ слева и видимость содержимого на разных диапазонах экранов. Используется
|
|
16
|
+
только внутри `Row` — горизонтальный отступ между колонками (gutter) получает из
|
|
17
|
+
`RowContext`.
|
|
21
18
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
19
|
+
Используй когда: нужно разместить контент в адаптивной сетке — распределить
|
|
20
|
+
блоки по ширине страницы, менять раскладку по breakpoint'ам, скрывать колонки
|
|
21
|
+
на отдельных диапазонах экранов.
|
|
25
22
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
---
|
|
33
|
-
|
|
34
|
-
## Файловая структура
|
|
35
|
-
|
|
36
|
-
```text
|
|
37
|
-
src/components/Col/
|
|
38
|
-
├── Col.tsx # React.FC, нет forwardRef
|
|
39
|
-
├── index.ts # Barrel
|
|
40
|
-
├── styles/Col.module.less # LESS миксин createCol(), генерирует классы
|
|
41
|
-
└── __tests__/
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
Особенности:
|
|
45
|
-
- **Нет forwardRef** — FC без ref-форвардинга. Это известный AI-ready debt.
|
|
46
|
-
Не добавлять точечно.
|
|
47
|
-
- **LESS-миксин `createCol(@resolutionType)`** — генерирует 12 column-классов
|
|
48
|
-
и 12 offset-классов для каждого breakpoint'а. Добавление нового breakpoint —
|
|
49
|
-
одна строка в LESS.
|
|
50
|
-
- **Bootstrap-подобный API**: `col-1..12`, `col-sm-1..12`, `col-md-*`, `col-lg-*`, `col-xl-*`,
|
|
51
|
-
`offset-*`, `d-none`, `d-block`.
|
|
23
|
+
Не используй когда:
|
|
24
|
+
- Колонка находится вне `Row` — без контекста применится дефолтный gutter, а
|
|
25
|
+
flex-раскладка родителя не гарантируется.
|
|
26
|
+
- Нужен вертикальный отступ между блоками — используй `Gap`.
|
|
27
|
+
- Нужна произвольная (не кратная 1/12) ширина — управляй стилями контейнера
|
|
28
|
+
напрямую.
|
|
52
29
|
|
|
53
30
|
---
|
|
54
31
|
|
|
55
32
|
## Варианты и props
|
|
56
33
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
**Base (применяется на всех разрешениях):**
|
|
34
|
+
Обязательных props нет — `<Col>` без props занимает всю ширину (`size` по
|
|
35
|
+
умолчанию `12`).
|
|
60
36
|
|
|
61
|
-
|
|
62
|
-
|---|---|---|---|
|
|
63
|
-
| `size` | `TColumnSize` (1..12) | `12` | Ширина колонки в 12-ти колоночной сетке. |
|
|
64
|
-
| `offset` | `TOffsetSize` (0..11) | — | Отступ слева в колонках. |
|
|
65
|
-
| `hidden` | `boolean` | — | `display: none !important`. |
|
|
66
|
-
| `block` | `boolean` | — | `display: block !important`. |
|
|
67
|
-
|
|
68
|
-
**Responsive (каждый breakpoint-префикс дублирует все 4):**
|
|
37
|
+
### Группы props
|
|
69
38
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
| md | `sizeMd` | `offsetMd` | `hiddenMd` | `blockMd` | `(min-width: @screen-md)` |
|
|
74
|
-
| lg | `sizeLg` | `offsetLg` | `hiddenLg` | `blockLg` | `(min-width: @screen-lg)` |
|
|
75
|
-
| xl | `sizeXl` | `offsetXl` | `hiddenXl` | `blockXl` | `(min-width: @screen-xl)` |
|
|
39
|
+
Каждая группа существует в пяти вариантах: базовый (все экраны, mobile-first) и
|
|
40
|
+
breakpoint-модификаторы `*Sm`, `*Md`, `*Lg`, `*Xl`, действующие «от breakpoint
|
|
41
|
+
и шире». Более узкий breakpoint перекрывается более широким.
|
|
76
42
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
|
80
|
-
|
|
81
|
-
| `
|
|
82
|
-
| `
|
|
83
|
-
| `...HTMLDivAttributes` | — | Все
|
|
43
|
+
| Группа | Тип | По умолчанию | Описание |
|
|
44
|
+
|---|---|---|---|
|
|
45
|
+
| `size`, `sizeSm/Md/Lg/Xl` | `TColumnSize` (1–12) | `size = 12` | Ширина колонки в долях сетки: `flex-basis`/`max-width` = N/12 |
|
|
46
|
+
| `offset`, `offsetSm/Md/Lg/Xl` | `TOffsetSize` (0–11) | — | Отступ слева (`margin-left`) в долях сетки; `0` — валидное значение, сбрасывает отступ на breakpoint'е |
|
|
47
|
+
| `hidden`, `hiddenSm/Md/Lg/Xl` | `boolean` | — | Скрывает колонку (`display: none !important`) от breakpoint'а и шире |
|
|
48
|
+
| `block`, `blockSm/Md/Lg/Xl` | `boolean` | — | Принудительно показывает колонку (`display: block !important`) от breakpoint'а и шире; в паре с `hidden` даёт диапазонную видимость |
|
|
49
|
+
| `...HTMLDivAttributes` | — | — | Все стандартные атрибуты `<div>`, включая `className` (мерджится с grid-классами через `clsx`) |
|
|
84
50
|
|
|
85
|
-
###
|
|
51
|
+
### Breakpoint'ы
|
|
86
52
|
|
|
87
|
-
|
|
88
|
-
-
|
|
53
|
+
Значения из `src/helpers/less/breakpoints.less` (media query `min-width`,
|
|
54
|
+
mobile-first):
|
|
89
55
|
|
|
90
|
-
|
|
56
|
+
| Суффикс | Диапазон |
|
|
57
|
+
|---|---|
|
|
58
|
+
| — (базовый) | все экраны, от 0 |
|
|
59
|
+
| `Sm` | ≥576px |
|
|
60
|
+
| `Md` | ≥768px |
|
|
61
|
+
| `Lg` | ≥992px |
|
|
62
|
+
| `Xl` | ≥1200px |
|
|
63
|
+
|
|
64
|
+
### Особенности поведения
|
|
65
|
+
|
|
66
|
+
- Паттерн диапазонной видимости: `hidden` + `blockMd` = колонка скрыта на
|
|
67
|
+
xs/sm и видима с md и шире.
|
|
68
|
+
- `hidden` **переопределяет одноимённый нативный HTML-атрибут** с другой
|
|
69
|
+
семантикой: prop добавляет CSS-класс `d-none`, а не атрибут `hidden` на div.
|
|
70
|
+
Выставить нативный атрибут через Col нельзя — это исторический публичный
|
|
71
|
+
контракт.
|
|
72
|
+
- Gutter (горизонтальный `padding` колонки) задаётся не props, а `Row`:
|
|
73
|
+
`RowContext.gridHorizontalGap` (`EComponentSize.SM` = 8px,
|
|
74
|
+
`EComponentSize.MD` = 12px; дефолт контекста — SM). Col лишь применяет
|
|
75
|
+
соответствующий класс, устанавливающий `--grid-horizontal-gap`.
|
|
91
76
|
|
|
92
77
|
---
|
|
93
78
|
|
|
94
|
-
##
|
|
95
|
-
|
|
96
|
-
### `getClassNames` helper
|
|
97
|
-
|
|
98
|
-
```ts
|
|
99
|
-
function getClassNames({ block, hidden, offset, prefix, size }) {
|
|
100
|
-
const prefixAsPart = prefix ? `${prefix}-` : "";
|
|
101
|
-
const prefixVisibility = prefix ? `-${prefix}` : "";
|
|
102
|
-
// ...
|
|
103
|
-
if (size) classes.push(`col-${prefixAsPart}${size}`);
|
|
104
|
-
if (offset !== undefined) classes.push(`offset-${prefixAsPart}${offset}`);
|
|
105
|
-
if (block) classes.push(`d-block${prefixVisibility}`);
|
|
106
|
-
if (hidden) classes.push(`d-none${prefixVisibility}`);
|
|
107
|
-
}
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
**Асимметрия префиксов**: `col-sm-6` (префикс в середине), но `d-block-sm`
|
|
111
|
-
(префикс в конце). Это Bootstrap-ная конвенция, повторённая один-в-один.
|
|
112
|
-
Не менять без миграции пользователей.
|
|
113
|
-
|
|
114
|
-
### Классы собираются в массив → `styles[...]`
|
|
115
|
-
|
|
116
|
-
```ts
|
|
117
|
-
const mappedClasses = classNames.map((c) => styles[c]).filter(Boolean);
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
Имена классов — это ключи в LESS module объекте. `filter(Boolean)`
|
|
121
|
-
защищает от опечаток (если бы класс не существовал → `undefined`).
|
|
79
|
+
## Дизайн-токены
|
|
122
80
|
|
|
123
|
-
|
|
81
|
+
Собственных CSS-переменных дизайн-темы (`--triplex-next-*`) компонент не
|
|
82
|
+
использует. Ширины и отступы вычисляются в LESS как доли `100% / 12`; gutter —
|
|
83
|
+
локальная переменная `--grid-horizontal-gap`, значение которой берётся из LESS-
|
|
84
|
+
переменных `@grid-horizontal-gap-SM` (8px) / `@grid-horizontal-gap-MD` (12px)
|
|
85
|
+
в `src/styles/components/grid.less`.
|
|
124
86
|
|
|
125
|
-
|
|
126
|
-
На узких экранах (без sm/md/lg overrides) колонка всегда full-width,
|
|
127
|
-
что даёт mobile-first сетку.
|
|
87
|
+
---
|
|
128
88
|
|
|
129
|
-
|
|
89
|
+
## Инварианты
|
|
130
90
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
91
|
+
- **`forwardRef`** — обязателен, не убирать. `ref` пробрасывается на корневой
|
|
92
|
+
`<div>`.
|
|
93
|
+
- **Имена всех 20 responsive-props** (`size*`, `offset*`, `hidden*`, `block*`)
|
|
94
|
+
и типы **`TColumnSize`**, **`TOffsetSize`** — публичное API, экспортируются
|
|
95
|
+
из barrel. Изменение перечня значений — breaking change.
|
|
96
|
+
- **Дефолт `size = 12`** — колонка без props занимает всю ширину.
|
|
97
|
+
- **Корневой элемент `<div>`** и мердж `className` потребителя с
|
|
98
|
+
grid-классами — не менять.
|
|
99
|
+
- **Схема генерации классов** `col-{prefix}-N` / `offset-{prefix}-N` /
|
|
100
|
+
`d-none-{prefix}` / `d-block-{prefix}` в `Col.module.less` — классы
|
|
101
|
+
резолвятся через `styles[c]`-маппинг; переименование селекторов ломает
|
|
102
|
+
раскладку и тесты.
|
|
103
|
+
- **Зависимость от `RowContext`** — источник gutter'а. Не заменять на prop.
|
|
104
|
+
- Breakpoint-значения (576/768/992/1200) — общие для библиотеки
|
|
105
|
+
(`breakpoints.less`), не задавать локальные.
|
|
135
106
|
|
|
136
|
-
|
|
137
|
-
item родителя). Без important не переопределяли бы.
|
|
107
|
+
---
|
|
138
108
|
|
|
139
|
-
|
|
109
|
+
## Accessibility
|
|
140
110
|
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
111
|
+
- Неинтерактивный layout-контейнер: без ARIA-роли, keyboard navigation и
|
|
112
|
+
focus management не применимы.
|
|
113
|
+
- Скрытие через `hidden*` использует `display: none` — контент скрытой колонки
|
|
114
|
+
недоступен и для screen reader'ов (в отличие от visually-hidden паттернов).
|
|
115
|
+
Это ожидаемое поведение адаптивной сетки.
|
|
116
|
+
- Потребитель может передать `role`, `aria-*`, `data-*` через spread.
|
|
146
117
|
|
|
147
|
-
|
|
148
|
-
**Если добавить XXL** — одна строка `.createCol(xxl-);` в media-query.
|
|
118
|
+
---
|
|
149
119
|
|
|
150
|
-
|
|
120
|
+
## Связанные компоненты
|
|
151
121
|
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
122
|
+
- `Row` (`src/components/Row/`) — обязательный родитель: flex-контейнер строки,
|
|
123
|
+
провайдер `RowContext.gridHorizontalGap`.
|
|
124
|
+
- `Gap` (`src/components/Gap/`) — вертикальный отступ между блоками; используй
|
|
125
|
+
вместо сетки, когда нужен только отступ.
|
|
155
126
|
|
|
156
127
|
---
|
|
157
128
|
|
|
158
|
-
##
|
|
129
|
+
## Stories
|
|
130
|
+
|
|
131
|
+
Основные истории: `stories/Col/Col.stories.tsx`
|
|
132
|
+
Файлы примеров: `stories/Col/examples/`
|
|
159
133
|
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
- **Нет forwardRef** — документированный debt. Не добавлять точечно.
|
|
134
|
+
| Story | Example file | Что демонстрирует |
|
|
135
|
+
|---|---|---|
|
|
136
|
+
| `Playground` | `PlaygroundExample.tsx` | Интерактивный контроль `size`, `offset`, `hidden`, `block` |
|
|
137
|
+
| `Default` | `DefaultExample.tsx` | Колонка без props — ширина по умолчанию (12/12) |
|
|
138
|
+
| `DifferentSizes` | `DifferentSizesExample.tsx` | Разные значения `size`, включая дефолтный |
|
|
139
|
+
| `ResponsiveSizes` | `ResponsiveSizesExample.tsx` | Адаптивные ширины `sizeSm/Md/Lg/Xl` |
|
|
140
|
+
| `WithOffsets` | `WithOffsetsExample.tsx` | Отступы слева через `offset` |
|
|
141
|
+
| `ResponsiveOffsets` | `ResponsiveOffsetsExample.tsx` | Адаптивные отступы `offsetSm/Md/Lg/Xl` |
|
|
142
|
+
| `HiddenColumns` | `HiddenColumnsExample.tsx` | Скрытие колонок на диапазонах экранов (`hidden*` + `block*`) |
|
|
143
|
+
| `VisualTests` | `VisualTestsExample.tsx` | Скриншот-регрессия основных состояний |
|
|
171
144
|
|
|
172
145
|
---
|
|
173
146
|
|
|
174
|
-
##
|
|
147
|
+
## История изменений
|
|
175
148
|
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
ожидаемо для скрытия элементов по breakpoint'у.
|
|
180
|
-
- **Порядок DOM = порядок источника**. Если нужно визуально переставить
|
|
181
|
-
колонки (order), использовать `order` CSS — Col этого не делает сам.
|
|
149
|
+
| Дата | Изменение |
|
|
150
|
+
|---|---|
|
|
151
|
+
| 2026-07-28 | Создан документ. AI-рефакторинг (TRI-28): добавлен `forwardRef` на корневой `<div>`, JSDoc на `TColumnSize`/`TOffsetSize`/все props `IColProps`, rest-props переименован в `htmlDivAttributes`, расширены unit-тесты (49 кейсов: forwardRef, полный перебор size/offset, falsy-ветки). Публичный API не менялся. |
|
|
182
152
|
|
|
183
153
|
---
|
|
184
154
|
|
|
185
|
-
##
|
|
155
|
+
## Примеры использования
|
|
186
156
|
|
|
187
|
-
|
|
188
|
-
`@screen-sm/md/lg/xl`), не CSS-токены.
|
|
157
|
+
### Default
|
|
189
158
|
|
|
190
|
-
|
|
159
|
+
`stories/Col/examples/DefaultExample.tsx`
|
|
191
160
|
|
|
192
|
-
|
|
161
|
+
```tsx
|
|
162
|
+
import React from "react";
|
|
163
|
+
import { Col, Row } from "@sberbusiness/triplex-next";
|
|
193
164
|
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
165
|
+
export const DefaultExample = () => (
|
|
166
|
+
<Row style={{ width: "600px" }}>
|
|
167
|
+
<Col>
|
|
168
|
+
<div style={{ padding: "16px", textAlign: "center", backgroundColor: "rgb(255, 217, 160)" }}>
|
|
169
|
+
default size (size-12)
|
|
170
|
+
</div>
|
|
171
|
+
</Col>
|
|
172
|
+
</Row>
|
|
173
|
+
);
|
|
174
|
+
```
|
|
202
175
|
|
|
203
|
-
|
|
176
|
+
### DifferentSizes
|
|
177
|
+
|
|
178
|
+
`stories/Col/examples/DifferentSizesExample.tsx`
|
|
179
|
+
|
|
180
|
+
```tsx
|
|
181
|
+
import React from "react";
|
|
182
|
+
import { Col, Row } from "@sberbusiness/triplex-next";
|
|
183
|
+
|
|
184
|
+
export const DifferentSizesExample = () => (
|
|
185
|
+
<>
|
|
186
|
+
<Row style={{ width: "600px" }}>
|
|
187
|
+
<Col>
|
|
188
|
+
<div style={{ padding: "16px", textAlign: "center", backgroundColor: "rgb(255, 217, 160)" }}>
|
|
189
|
+
default size (size-12)
|
|
190
|
+
</div>
|
|
191
|
+
</Col>
|
|
192
|
+
</Row>
|
|
193
|
+
|
|
194
|
+
<Row style={{ width: "600px" }}>
|
|
195
|
+
<Col size={2}>
|
|
196
|
+
<div style={{ padding: "16px", textAlign: "center", backgroundColor: "rgb(255, 217, 160)" }}>
|
|
197
|
+
size-2
|
|
198
|
+
</div>
|
|
199
|
+
</Col>
|
|
200
|
+
<Col size={3}>
|
|
201
|
+
<div style={{ padding: "16px", textAlign: "center", backgroundColor: "rgb(255, 217, 160)" }}>
|
|
202
|
+
size-3
|
|
203
|
+
</div>
|
|
204
|
+
</Col>
|
|
205
|
+
<Col size={6}>
|
|
206
|
+
<div style={{ padding: "16px", textAlign: "center", backgroundColor: "rgb(255, 217, 160)" }}>
|
|
207
|
+
size-6
|
|
208
|
+
</div>
|
|
209
|
+
</Col>
|
|
210
|
+
</Row>
|
|
211
|
+
</>
|
|
212
|
+
);
|
|
213
|
+
```
|
|
204
214
|
|
|
205
|
-
|
|
206
|
-
|
|
215
|
+
### ResponsiveSizes
|
|
216
|
+
|
|
217
|
+
`stories/Col/examples/ResponsiveSizesExample.tsx`
|
|
218
|
+
|
|
219
|
+
```tsx
|
|
220
|
+
import React from "react";
|
|
221
|
+
import { Col, Gap, Row } from "@sberbusiness/triplex-next";
|
|
222
|
+
|
|
223
|
+
export const ResponsiveSizesExample = () => (
|
|
224
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "16px" }}>
|
|
225
|
+
<Row>
|
|
226
|
+
<Col sizeSm={6} sizeMd={5} sizeLg={4} sizeXl={3}>
|
|
227
|
+
<div style={{ padding: "16px", textAlign: "center", backgroundColor: "rgb(255, 217, 160)" }}>
|
|
228
|
+
<div>Размеры колонки на разных экранах: sm - 6, md - 5, lg - 4, xl - 3</div>
|
|
229
|
+
</div>
|
|
230
|
+
<Gap size={16} />
|
|
231
|
+
</Col>
|
|
232
|
+
|
|
233
|
+
<Col sizeSm={7} sizeMd={8} sizeLg={9} sizeXl={10}>
|
|
234
|
+
<div style={{ padding: "16px", textAlign: "center", backgroundColor: "rgb(255, 217, 160)" }}>
|
|
235
|
+
<div>Размеры колонки на разных экранах: sm - 7, md - 8, lg - 9, xl - 10</div>
|
|
236
|
+
</div>
|
|
237
|
+
</Col>
|
|
238
|
+
</Row>
|
|
239
|
+
</div>
|
|
240
|
+
);
|
|
241
|
+
```
|
|
207
242
|
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
243
|
+
### WithOffsets
|
|
244
|
+
|
|
245
|
+
`stories/Col/examples/WithOffsetsExample.tsx`
|
|
246
|
+
|
|
247
|
+
```tsx
|
|
248
|
+
import React from "react";
|
|
249
|
+
import { Col, Row } from "@sberbusiness/triplex-next";
|
|
250
|
+
|
|
251
|
+
export const WithOffsetsExample = () => (
|
|
252
|
+
<div style={{ display: "flex", flexDirection: "column" }}>
|
|
253
|
+
<Row style={{ flexWrap: "nowrap" }}>
|
|
254
|
+
<Col size={4}>
|
|
255
|
+
<div style={{ padding: "16px", textAlign: "center", backgroundColor: "rgb(255, 217, 160)" }}>
|
|
256
|
+
size-4
|
|
257
|
+
</div>
|
|
258
|
+
</Col>
|
|
259
|
+
<Col size={4} offset={3}>
|
|
260
|
+
<div style={{ padding: "16px", textAlign: "center", backgroundColor: "rgb(255, 217, 160)" }}>
|
|
261
|
+
size-4 offset-3
|
|
262
|
+
</div>
|
|
263
|
+
</Col>
|
|
264
|
+
</Row>
|
|
265
|
+
|
|
266
|
+
<Row style={{ flexWrap: "nowrap" }}>
|
|
267
|
+
<Col size={3} offset={3}>
|
|
268
|
+
<div style={{ padding: "16px", textAlign: "center", backgroundColor: "rgb(255, 217, 160)" }}>
|
|
269
|
+
size-3 offset-3
|
|
270
|
+
</div>
|
|
271
|
+
</Col>
|
|
272
|
+
<Col size={3} offset={1}>
|
|
273
|
+
<div style={{ padding: "16px", textAlign: "center", backgroundColor: "rgb(255, 217, 160)" }}>
|
|
274
|
+
size-3 offset-1
|
|
275
|
+
</div>
|
|
276
|
+
</Col>
|
|
277
|
+
</Row>
|
|
278
|
+
|
|
279
|
+
<Row>
|
|
280
|
+
<Col size={6} offset={2}>
|
|
281
|
+
<div style={{ padding: "16px", textAlign: "center", backgroundColor: "rgb(255, 217, 160)" }}>
|
|
282
|
+
size-6 offset-2
|
|
283
|
+
</div>
|
|
284
|
+
</Col>
|
|
285
|
+
</Row>
|
|
286
|
+
</div>
|
|
287
|
+
);
|
|
288
|
+
```
|
|
214
289
|
|
|
215
|
-
|
|
290
|
+
### ResponsiveOffsets
|
|
291
|
+
|
|
292
|
+
`stories/Col/examples/ResponsiveOffsetsExample.tsx`
|
|
293
|
+
|
|
294
|
+
```tsx
|
|
295
|
+
import React from "react";
|
|
296
|
+
import { Col, Row } from "@sberbusiness/triplex-next";
|
|
297
|
+
|
|
298
|
+
export const ResponsiveOffsetsExample = () => (
|
|
299
|
+
<div style={{ display: "flex", flexDirection: "column" }}>
|
|
300
|
+
<Row>
|
|
301
|
+
<Col sizeMd={6} offsetMd={3}>
|
|
302
|
+
<div style={{ padding: "16px", backgroundColor: "rgb(255, 217, 160)", textAlign: "center" }}>
|
|
303
|
+
<div>sizeMd=6</div>
|
|
304
|
+
<div>offsetMd=3</div>
|
|
305
|
+
</div>
|
|
306
|
+
</Col>
|
|
307
|
+
</Row>
|
|
308
|
+
|
|
309
|
+
<Row>
|
|
310
|
+
<Col sizeSm={6} offsetSm={4}>
|
|
311
|
+
<div style={{ padding: "16px", backgroundColor: "rgb(255, 217, 160)", textAlign: "center" }}>
|
|
312
|
+
<div>sizeSm=6</div>
|
|
313
|
+
<div>offsetSm=4</div>
|
|
314
|
+
</div>
|
|
315
|
+
</Col>
|
|
316
|
+
</Row>
|
|
317
|
+
</div>
|
|
318
|
+
);
|
|
319
|
+
```
|
|
216
320
|
|
|
217
|
-
|
|
321
|
+
### HiddenColumns
|
|
322
|
+
|
|
323
|
+
`stories/Col/examples/HiddenColumnsExample.tsx`
|
|
324
|
+
|
|
325
|
+
```tsx
|
|
326
|
+
import React from "react";
|
|
327
|
+
import { Col, Gap, Row } from "@sberbusiness/triplex-next";
|
|
328
|
+
|
|
329
|
+
export const HiddenColumnsExample = () => (
|
|
330
|
+
<div style={{ display: "flex", flexDirection: "column" }}>
|
|
331
|
+
<Row>
|
|
332
|
+
<Col>
|
|
333
|
+
<div style={{ padding: "16px", backgroundColor: "rgb(255, 217, 160)", textAlign: "center" }}>
|
|
334
|
+
Свойство hidden не установлено
|
|
335
|
+
</div>
|
|
336
|
+
</Col>
|
|
337
|
+
</Row>
|
|
338
|
+
|
|
339
|
+
<Row>
|
|
340
|
+
<Col hiddenSm>
|
|
341
|
+
<div style={{ padding: "16px", backgroundColor: "rgb(255, 217, 160)", textAlign: "center" }}>
|
|
342
|
+
Свойство hidden установлено для экрана sm
|
|
343
|
+
</div>
|
|
344
|
+
<Gap size={16} />
|
|
345
|
+
</Col>
|
|
346
|
+
|
|
347
|
+
<Col hiddenMd>
|
|
348
|
+
<div style={{ padding: "16px", backgroundColor: "rgb(255, 217, 160)", textAlign: "center" }}>
|
|
349
|
+
Свойство hidden установлено для экрана md
|
|
350
|
+
</div>
|
|
351
|
+
<Gap size={16} />
|
|
352
|
+
</Col>
|
|
353
|
+
|
|
354
|
+
<Col hiddenLg>
|
|
355
|
+
<div style={{ padding: "16px", backgroundColor: "rgb(255, 217, 160)", textAlign: "center" }}>
|
|
356
|
+
Свойство hidden установлено для экрана lg
|
|
357
|
+
</div>
|
|
358
|
+
<Gap size={16} />
|
|
359
|
+
</Col>
|
|
360
|
+
|
|
361
|
+
<Col hiddenXl>
|
|
362
|
+
<div style={{ padding: "16px", backgroundColor: "rgb(255, 217, 160)", textAlign: "center" }}>
|
|
363
|
+
Свойство hidden установлено для экрана xl
|
|
364
|
+
</div>
|
|
365
|
+
</Col>
|
|
366
|
+
</Row>
|
|
367
|
+
</div>
|
|
368
|
+
);
|
|
369
|
+
```
|
|
218
370
|
|
|
219
|
-
| Дата | Изменение |
|
|
220
|
-
|---|---|
|
|
221
|
-
| 2026-04-18 | Создан документ |
|
|
@@ -76,7 +76,9 @@ Type guard: `isCollapsibleTreeNodeLeaf(node)` — `"content" in node`.
|
|
|
76
76
|
| `aria-expanded={opened}` | `hasChildNodes === true` (для листьев не ставится, при `disabled` сохраняется) |
|
|
77
77
|
| Шеврон отрендерен | `hasChildNodes === true` (в том числе при `disabled`) |
|
|
78
78
|
| Класс `interactive` | `hasChildNodes === true && !disabled` |
|
|
79
|
-
|
|
|
79
|
+
| Глобальный класс `hoverable` | всегда — управляет цветом шеврона через стили `@sberbusiness/icons-next` (как в `IconWrapper`) |
|
|
80
|
+
| Глобальный класс `active` | `hasChildNodes === true && opened === true` — цвет шеврона раскрытого узла (у леаф-нод `opened` всегда `true` из-за хака `LeafNode`, поэтому им класс не ставится) |
|
|
81
|
+
| Глобальный класс `disabled` | проп `disabled === true` — приглушает цвет шеврона |
|
|
80
82
|
| Класс `chevron.opened` | `opened === true` |
|
|
81
83
|
| `toggle(!opened)` вызывается | по клику, только при `hasChildNodes === true && !disabled` |
|
|
82
84
|
| Кастомный `onClick` | вызывается всегда после `toggle` |
|
|
@@ -105,8 +107,8 @@ Type guard: `isCollapsibleTreeNodeLeaf(node)` — `"content" in node`.
|
|
|
105
107
|
--triplex-next-CollapsibleTree-Header_Shadow_Focus
|
|
106
108
|
```
|
|
107
109
|
|
|
108
|
-
Цвета disabled-состояния задаются без собственных токенов: шеврон —
|
|
109
|
-
|
|
110
|
+
Цвета disabled-состояния задаются без собственных токенов: шеврон — глобальным
|
|
111
|
+
классом `disabled` на кнопке заголовка (класс `hoverable` стоит всегда, стили `@sberbusiness/icons-next`),
|
|
110
112
|
текст — `type={EFontType.DISABLED}` у `CollapsibleTreeNodeLabel` на стороне потребителя.
|
|
111
113
|
|
|
112
114
|
Анимация раскрытия и базовая семантика дерева наследуются от
|
|
@@ -221,6 +223,7 @@ Type guard: `isCollapsibleTreeNodeLeaf(node)` — `"content" in node`.
|
|
|
221
223
|
| 2026-05-15 | `CollapsibleTreeNodeHeader` и `CollapsibleTreeLeafContent` переведены на `forwardRef` (DOM-ref на `<button>` и `<div>` соответственно). Защищены инварианты `<button>` (`type`, `disabled`, `aria-expanded`) от перетирания через `{...props}` |
|
|
222
224
|
| 2026-07-06 | Шеврон открытого узла теперь указывает вверх (`rotate(-90deg)`), а не вниз |
|
|
223
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`) |
|
|
224
227
|
|
|
225
228
|
---
|
|
226
229
|
|
|
@@ -186,6 +186,7 @@ FC-обёртка над `TreeView` без собственных props.
|
|
|
186
186
|
|---|---|
|
|
187
187
|
| 2026-05-15 | Создан документ. Зафиксирован фикс controlled-инварианта (режим вычисляется на каждом рендере) и пополнение stories (`Playground`, `VisualTests`) |
|
|
188
188
|
| 2026-07-06 | В story-примерах шеврон открытого узла теперь указывает вверх (`rotate(-90deg)`), а не вниз — синхронно с `CollapsibleTree` |
|
|
189
|
+
| 2026-07-14 | В story-примерах на кнопку заголовка добавлены глобальные классы icons-next: `hoverable` всегда и `active` при `opened` — цвет иконки раскрытия, синхронно с `CollapsibleTreeNodeHeader` |
|
|
189
190
|
|
|
190
191
|
---
|
|
191
192
|
|
|
@@ -260,7 +261,8 @@ const TreeNode: React.FC<ITreeNodeProps> = ({ node, prevNode, nextNode }) => {
|
|
|
260
261
|
hasChildNodes ? (
|
|
261
262
|
<button
|
|
262
263
|
type="button"
|
|
263
|
-
|
|
264
|
+
// Глобальные классы @sberbusiness/icons-next "hoverable" и "active" — задают цвет шеврона.
|
|
265
|
+
className={clsx("collapsible-tree-extended-example-header", "hoverable", { active: opened })}
|
|
264
266
|
onClick={() => setOpened(!opened)}
|
|
265
267
|
aria-expanded={opened}
|
|
266
268
|
>
|
|
@@ -314,6 +316,7 @@ export const DefaultExample = () => (
|
|
|
314
316
|
|
|
315
317
|
```tsx
|
|
316
318
|
import React from "react";
|
|
319
|
+
import clsx from "clsx";
|
|
317
320
|
import { MinusStrokeSrvIcon24, PlusStrokeSrvIcon24 } from "@sberbusiness/icons-next";
|
|
318
321
|
import { CollapsibleTreeExtended, EFontWeightText, ETextSize, Text } from "@sberbusiness/triplex-next";
|
|
319
322
|
import "./CustomToggleExample.less";
|
|
@@ -366,7 +369,8 @@ const TreeNode: React.FC<ITreeNodeProps> = ({ node, prevNode, nextNode }) => {
|
|
|
366
369
|
hasChildNodes ? (
|
|
367
370
|
<button
|
|
368
371
|
type="button"
|
|
369
|
-
|
|
372
|
+
// Глобальные классы @sberbusiness/icons-next "hoverable" и "active" — задают цвет иконки.
|
|
373
|
+
className={clsx("custom-toggle-example-header", "hoverable", { active: opened })}
|
|
370
374
|
onClick={() => setOpened(!opened)}
|
|
371
375
|
aria-expanded={opened}
|
|
372
376
|
>
|