@sberbusiness/triplex-next-mcp-server 0.24.0-beta1
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 +124 -0
- package/bundle/.gitkeep +0 -0
- package/bundle/components/AbstractTree.md +198 -0
- package/bundle/components/AccordionBase.md +227 -0
- package/bundle/components/Alert.md +317 -0
- package/bundle/components/Amount.md +225 -0
- package/bundle/components/AmountField.md +289 -0
- package/bundle/components/Avatar.md +209 -0
- package/bundle/components/Badge.md +277 -0
- package/bundle/components/Body.md +167 -0
- package/bundle/components/Button.md +230 -0
- package/bundle/components/ButtonDropdown.md +159 -0
- package/bundle/components/ButtonIcon.md +122 -0
- package/bundle/components/Calendar.md +445 -0
- package/bundle/components/Card.md +374 -0
- package/bundle/components/CarouselExtended.md +250 -0
- package/bundle/components/Checkbox.md +126 -0
- package/bundle/components/CheckboxTree.md +280 -0
- package/bundle/components/CheckboxTreeExtended.md +321 -0
- package/bundle/components/CheckboxXGroup.md +68 -0
- package/bundle/components/CheckboxYGroup.md +67 -0
- package/bundle/components/Chip.md +404 -0
- package/bundle/components/ChipGroup.md +179 -0
- package/bundle/components/Col.md +221 -0
- package/bundle/components/CollapsableTree.md +255 -0
- package/bundle/components/Confirm.md +343 -0
- package/bundle/components/DateField.md +371 -0
- package/bundle/components/DatePickerExtended.md +342 -0
- package/bundle/components/DateRange.md +275 -0
- package/bundle/components/DesignTokens.md +385 -0
- package/bundle/components/Divider.md +196 -0
- package/bundle/components/DocumentNumberEdit.md +280 -0
- package/bundle/components/Dropdown.md +433 -0
- package/bundle/components/Ellipsis.md +208 -0
- package/bundle/components/EmptyView.md +99 -0
- package/bundle/components/ExpandAnimation.md +281 -0
- package/bundle/components/Footer.md +339 -0
- package/bundle/components/FormField.md +326 -0
- package/bundle/components/FormGroup.md +99 -0
- package/bundle/components/Gap.md +113 -0
- package/bundle/components/Header.md +280 -0
- package/bundle/components/HelpBox.md +154 -0
- package/bundle/components/IconWrapper.md +145 -0
- package/bundle/components/Island.md +197 -0
- package/bundle/components/IslandAccordion.md +230 -0
- package/bundle/components/IslandWidget.md +233 -0
- package/bundle/components/KeyDownListener.md +157 -0
- package/bundle/components/LightBox.md +322 -0
- package/bundle/components/Link.md +161 -0
- package/bundle/components/List.md +247 -0
- package/bundle/components/ListMaster.md +204 -0
- package/bundle/components/Loader.md +161 -0
- package/bundle/components/LoaderScreen.md +134 -0
- package/bundle/components/Marker.md +127 -0
- package/bundle/components/MarkerStatus.md +148 -0
- package/bundle/components/MediaWidth.md +169 -0
- package/bundle/components/MobileView.md +120 -0
- package/bundle/components/ModalWindow.md +308 -0
- package/bundle/components/MonthYearField.md +168 -0
- package/bundle/components/MultiselectField.md +213 -0
- package/bundle/components/Notification.md +233 -0
- package/bundle/components/NumberField.md +178 -0
- package/bundle/components/OrderedList.md +169 -0
- package/bundle/components/Overlay.md +237 -0
- package/bundle/components/Page.md +246 -0
- package/bundle/components/Pagination.md +298 -0
- package/bundle/components/Portal.md +119 -0
- package/bundle/components/Radio.md +174 -0
- package/bundle/components/Row.md +125 -0
- package/bundle/components/SMSField.md +160 -0
- package/bundle/components/SegmentedControl.md +235 -0
- package/bundle/components/SelectExtendedField.md +322 -0
- package/bundle/components/SelectField.md +213 -0
- package/bundle/components/Skeleton.md +129 -0
- package/bundle/components/Slider.md +157 -0
- package/bundle/components/SliderExtended.md +210 -0
- package/bundle/components/SliderRange.md +160 -0
- package/bundle/components/SmallInput.md +101 -0
- package/bundle/components/Spoiler.md +121 -0
- package/bundle/components/StatusTracker.md +151 -0
- package/bundle/components/Step.md +121 -0
- package/bundle/components/Stepper.md +163 -0
- package/bundle/components/Suggest.md +160 -0
- package/bundle/components/SuggestField.md +157 -0
- package/bundle/components/SwipeableArea.md +144 -0
- package/bundle/components/Table.md +199 -0
- package/bundle/components/Tabs.md +152 -0
- package/bundle/components/TabsExtended.md +273 -0
- package/bundle/components/TabsLine.md +189 -0
- package/bundle/components/Tag.md +135 -0
- package/bundle/components/TagColor.md +121 -0
- package/bundle/components/TagGroup.md +100 -0
- package/bundle/components/TextField.md +152 -0
- package/bundle/components/TextareaField.md +124 -0
- package/bundle/components/ThemeProvider.md +181 -0
- package/bundle/components/Tooltip.md +254 -0
- package/bundle/components/TopOverlay.md +145 -0
- package/bundle/components/TreeView.md +224 -0
- package/bundle/components/Triggers.md +121 -0
- package/bundle/guides/codestyle.md +205 -0
- package/bundle/guides/commits.md +166 -0
- package/bundle/guides/context.md +277 -0
- package/bundle/guides/stories.md +618 -0
- package/bundle/guides/template.md +154 -0
- package/bundle/guides/tests.md +301 -0
- package/bundle/icons.json +4156 -0
- package/bundle/manifest.json +796 -0
- package/bundle/release-notes/1.1.0.mdx +26 -0
- package/bundle/release-notes/1.1.1.mdx +14 -0
- package/bundle/release-notes/1.10.0.mdx +43 -0
- package/bundle/release-notes/1.11.0.mdx +19 -0
- package/bundle/release-notes/1.12.0.mdx +21 -0
- package/bundle/release-notes/1.13.0.mdx +43 -0
- package/bundle/release-notes/1.14.0.mdx +29 -0
- package/bundle/release-notes/1.15.0.mdx +56 -0
- package/bundle/release-notes/1.16.0.mdx +55 -0
- package/bundle/release-notes/1.17.0.mdx +15 -0
- package/bundle/release-notes/1.18.0.mdx +24 -0
- package/bundle/release-notes/1.19.0.mdx +48 -0
- package/bundle/release-notes/1.19.1.mdx +9 -0
- package/bundle/release-notes/1.2.0.mdx +80 -0
- package/bundle/release-notes/1.20.0.mdx +48 -0
- package/bundle/release-notes/1.21.0.mdx +66 -0
- package/bundle/release-notes/1.22.0.mdx +75 -0
- package/bundle/release-notes/1.23.0.mdx +50 -0
- package/bundle/release-notes/1.24.0.mdx +59 -0
- package/bundle/release-notes/1.25.0.mdx +52 -0
- package/bundle/release-notes/1.26.0.mdx +11 -0
- package/bundle/release-notes/1.3.0.mdx +21 -0
- package/bundle/release-notes/1.4.0.mdx +37 -0
- package/bundle/release-notes/1.5.0.mdx +24 -0
- package/bundle/release-notes/1.6.0.mdx +37 -0
- package/bundle/release-notes/1.6.1.mdx +11 -0
- package/bundle/release-notes/1.7.0.mdx +29 -0
- package/bundle/release-notes/1.8.0.mdx +38 -0
- package/bundle/release-notes/1.9.0.mdx +28 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +324 -0
- package/dist/index.js.map +1 -0
- package/package.json +51 -0
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
---
|
|
2
|
+
component: Spoiler
|
|
3
|
+
category: Disclosure
|
|
4
|
+
figma-node: ""
|
|
5
|
+
figma-file: ""
|
|
6
|
+
related: [AccordionBase, Button]
|
|
7
|
+
tokens: []
|
|
8
|
+
stories: stories/Spoiler/Spoiler.stories.tsx
|
|
9
|
+
version: "1.0"
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Spoiler
|
|
13
|
+
|
|
14
|
+
## Назначение
|
|
15
|
+
|
|
16
|
+
Раскрывающаяся область с link-кнопкой-триггером сверху. Текст триггера
|
|
17
|
+
переключается между `labelExpand` / `labelCollapse`, содержимое скрывается
|
|
18
|
+
CSS-классом (`hidden`) — DOM не размонтируется.
|
|
19
|
+
|
|
20
|
+
Используй когда: нужно показать/скрыть блок вспомогательной информации
|
|
21
|
+
через простой inline-триггер (не секцию-«аккордеон»).
|
|
22
|
+
Не используй когда: нужна секционированная навигация с несколькими
|
|
23
|
+
панелями — используй `AccordionBase`.
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## Файловая структура
|
|
28
|
+
|
|
29
|
+
```text
|
|
30
|
+
src/components/Spoiler/
|
|
31
|
+
├── Spoiler.tsx # forwardRef<HTMLDivElement, TSpoilerProps>
|
|
32
|
+
├── index.ts
|
|
33
|
+
└── styles/Spoiler.module.less
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## Варианты и props
|
|
39
|
+
|
|
40
|
+
`TSpoilerProps = ISpoilerControlledProps | ISpoilerUncontrolledProps`.
|
|
41
|
+
|
|
42
|
+
### Общие (`ISpoilerBaseProps`)
|
|
43
|
+
|
|
44
|
+
| Prop | Тип | Default | Описание |
|
|
45
|
+
|---|---|---|---|
|
|
46
|
+
| `labelExpand` | `string` | — | Текст кнопки в свернутом состоянии. |
|
|
47
|
+
| `labelCollapse?` | `string` | — | Текст кнопки в раскрытом состоянии. Если не задан — кнопка показывает `labelExpand` всегда. |
|
|
48
|
+
| `onToggle?` | `(expanded: boolean) => void` | — | Колбэк изменения состояния. Вызывается ВСЕГДА (и в controlled, и в uncontrolled). |
|
|
49
|
+
| `rightBlock?` | `ReactNode` | — | Доп. контент справа от триггера в шапке. |
|
|
50
|
+
| `size?` | `EComponentSize` | `MD` | `SM` → icon-16, `MD`/`LG` → icon-20. |
|
|
51
|
+
| `...HTMLAttributes<HTMLDivElement>` | — | — | Прокидываются на корень. |
|
|
52
|
+
|
|
53
|
+
### Controlled (`ISpoilerControlledProps`)
|
|
54
|
+
|
|
55
|
+
| Prop | Тип | Описание |
|
|
56
|
+
|---|---|---|
|
|
57
|
+
| `expanded` | `boolean` | Контролируемое состояние. |
|
|
58
|
+
| `toggle` | `(next: boolean) => void` | Контролирующий handler. Обязателен если передан `expanded`. |
|
|
59
|
+
|
|
60
|
+
### Uncontrolled (`ISpoilerUncontrolledProps`)
|
|
61
|
+
|
|
62
|
+
| Prop | Тип | Описание |
|
|
63
|
+
|---|---|---|
|
|
64
|
+
| `expanded` | `never` | Запрещено. |
|
|
65
|
+
| `toggle` | `never` | Запрещено. |
|
|
66
|
+
|
|
67
|
+
Различение controlled/uncontrolled — по `expanded !== undefined` внутри компонента.
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## Иконка
|
|
72
|
+
|
|
73
|
+
| Size | Icon |
|
|
74
|
+
|---|---|
|
|
75
|
+
| `SM` | `CaretdownStrokeSrvIcon16` (paletteIndex=5) |
|
|
76
|
+
| `MD` | `CaretdownStrokeSrvIcon20` (paletteIndex=5) |
|
|
77
|
+
| `LG` | `CaretdownStrokeSrvIcon20` (paletteIndex=5) |
|
|
78
|
+
|
|
79
|
+
Поворот иконки — через CSS (`styles.opened` на root применяет transform к `.caretIcon`).
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## Инварианты
|
|
84
|
+
|
|
85
|
+
- **`forwardRef<HTMLDivElement>`** — не убирать.
|
|
86
|
+
- **Триггер — `Button` с `theme={EButtonTheme.LINK}`** и размером `size` из props. Замена на `ButtonIcon` / `Link` — breaking change.
|
|
87
|
+
- **Контент не размонтируется** при сворачивании — скрывается классом `styles.hidden`. Это сохраняет state детей между раскрытиями; потребитель должен учитывать, что скрытый контент остаётся в DOM (focusability, форм-валидация).
|
|
88
|
+
- **`aria-expanded` на Button, `aria-controls` → id контента, `id` контента** — генерируется через `uniqueId()` один раз в `useRef`. Не переопределять.
|
|
89
|
+
- **`onToggle` вызывается всегда** — даже в controlled варианте (удобно для аналитики рядом с `toggle`).
|
|
90
|
+
- **`labelCollapse` опционален** — если не задан, открытое состояние покажет `labelExpand`. Это допустимо, но нетипично.
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## Accessibility
|
|
95
|
+
|
|
96
|
+
- `aria-expanded={open}` и `aria-controls={instanceId}` связывают триггер-кнопку с контентом.
|
|
97
|
+
- Контент получает `id={instanceId.current}` — уникальный per-instance.
|
|
98
|
+
- Триггер — нативная `<button>` (через `Button` → `theme=LINK`), стандартные keyboard-обработчики (Enter/Space).
|
|
99
|
+
- Скрытый контент остаётся в DOM (не `display:none` → `hidden` класс; точная CSS-имплементация — в `Spoiler.module.less`). Проверь перед изменением, не должен ли контент быть недоступен для screen reader'а.
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## Связанные компоненты
|
|
104
|
+
|
|
105
|
+
- `AccordionBase` — многосекционный аккордеон.
|
|
106
|
+
- `Button` — триггер (LINK theme).
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## Stories
|
|
111
|
+
|
|
112
|
+
`stories/Spoiler/Spoiler.stories.tsx`
|
|
113
|
+
Примеры: `stories/Spoiler/examples/`
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## История изменений
|
|
118
|
+
|
|
119
|
+
| Дата | Изменение |
|
|
120
|
+
|---|---|
|
|
121
|
+
| 2026-04-18 | Создан документ |
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
---
|
|
2
|
+
component: StatusTracker
|
|
3
|
+
category: Data Display
|
|
4
|
+
figma-node: ""
|
|
5
|
+
figma-file: ""
|
|
6
|
+
related: [MarkerStatus, Alert, Card]
|
|
7
|
+
tokens:
|
|
8
|
+
- --triplex-next-StatusTracker-Approved_Background
|
|
9
|
+
- --triplex-next-StatusTracker-Approved_Color
|
|
10
|
+
- --triplex-next-StatusTracker-Rejected_Background
|
|
11
|
+
- --triplex-next-StatusTracker-Rejected_Color
|
|
12
|
+
- --triplex-next-StatusTracker-Waiting_Background
|
|
13
|
+
- --triplex-next-StatusTracker-Waiting_Color
|
|
14
|
+
- --triplex-next-StatusTracker-Warning_Background
|
|
15
|
+
- --triplex-next-StatusTracker-Draft_Background
|
|
16
|
+
- --triplex-next-StatusTracker-Border_Color
|
|
17
|
+
stories: stories/StatusTracker/StatusTracker.stories.tsx
|
|
18
|
+
version: "1.0"
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
# StatusTracker
|
|
22
|
+
|
|
23
|
+
## Назначение
|
|
24
|
+
|
|
25
|
+
Карточка статуса документа с цветной отметкой (бекграунд слева) соответствующей
|
|
26
|
+
типу. Композитный компонент: `Media` (иконка/превью) + `Header` (заголовок/
|
|
27
|
+
сумма/описание) + `Body` (статус/алерт) + `Footer` (кнопки/описание).
|
|
28
|
+
|
|
29
|
+
Используй когда: нужно показать state документа/заявки с акцентированной
|
|
30
|
+
цветовой меткой (типовой виджет списка документов).
|
|
31
|
+
Не используй когда: нужна просто инлайн-отметка статуса — возьми `MarkerStatus`.
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## Файловая структура
|
|
36
|
+
|
|
37
|
+
```text
|
|
38
|
+
src/components/StatusTracker/
|
|
39
|
+
├── StatusTracker.tsx # корневой + композиция (Media/Header/Body/Footer)
|
|
40
|
+
├── enums.ts # EStatusTrackerType, EStatusTrackerVerticalAlign
|
|
41
|
+
├── components/
|
|
42
|
+
│ ├── StatusTrackerMedia.tsx
|
|
43
|
+
│ ├── StatusTrackerHeader.tsx # + Title, Sum, Description
|
|
44
|
+
│ ├── StatusTrackerBody.tsx # + Alert, Status
|
|
45
|
+
│ ├── StatusTrackerFooter.tsx # + Button, Description
|
|
46
|
+
│ ├── StatusTrackerTitle.tsx
|
|
47
|
+
│ ├── StatusTrackerSum.tsx
|
|
48
|
+
│ ├── StatusTrackerDescription.tsx
|
|
49
|
+
│ ├── StatusTrackerStatus.tsx
|
|
50
|
+
│ ├── StatusTrackerAlert.tsx
|
|
51
|
+
│ └── StatusTrackerButton.tsx
|
|
52
|
+
├── styles/
|
|
53
|
+
└── index.ts
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## Slot-композиция
|
|
59
|
+
|
|
60
|
+
```
|
|
61
|
+
<StatusTracker type verticalAlign?>
|
|
62
|
+
<StatusTracker.Media>...</StatusTracker.Media>
|
|
63
|
+
<StatusTracker.Header>
|
|
64
|
+
<StatusTracker.Header.Title>...</Title>
|
|
65
|
+
<StatusTracker.Header.Sum>...</Sum>
|
|
66
|
+
<StatusTracker.Header.Description>...</Description>
|
|
67
|
+
</StatusTracker.Header>
|
|
68
|
+
<StatusTracker.Body>
|
|
69
|
+
<StatusTracker.Body.Status>...</Status>
|
|
70
|
+
<StatusTracker.Body.Alert>...</Alert>
|
|
71
|
+
</StatusTracker.Body>
|
|
72
|
+
<StatusTracker.Footer>
|
|
73
|
+
<StatusTracker.Footer.Button>...</Button>
|
|
74
|
+
<StatusTracker.Footer.Description>...</Description>
|
|
75
|
+
</StatusTracker.Footer>
|
|
76
|
+
</StatusTracker>
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Все slot'ы — `forwardRef<HTMLDivElement>` и прокидывают `HTMLAttributes<HTMLDivElement>`.
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## Варианты и props
|
|
84
|
+
|
|
85
|
+
### `IStatusTrackerProps`
|
|
86
|
+
|
|
87
|
+
| Prop | Тип | Default | Описание |
|
|
88
|
+
|---|---|---|---|
|
|
89
|
+
| `type` | `EStatusTrackerType` | — | Цветовой тип метки (DRAFT, WAITING, WARNING, REJECTED, APPROVED). |
|
|
90
|
+
| `verticalAlign?` | `EStatusTrackerVerticalAlign` | `TOP` | Вертикальное выравнивание children: TOP/MIDDLE/BOTTOM. |
|
|
91
|
+
| `...HTMLAttributes<HTMLDivElement>` | — | — | Стандартные атрибуты корня. |
|
|
92
|
+
|
|
93
|
+
### `EStatusTrackerType`
|
|
94
|
+
|
|
95
|
+
| Value | Поведение |
|
|
96
|
+
|---|---|
|
|
97
|
+
| `DRAFT` | Нейтральный draft-фон (`--StatusTracker-Draft_Background`). В `typeToClassNameMap` **не маппится** — цветная метка не рендерится (background остаётся базовым). |
|
|
98
|
+
| `WAITING` | Жёлто-серый. |
|
|
99
|
+
| `WARNING` | Оранжевый (только background). |
|
|
100
|
+
| `REJECTED` | Красный. |
|
|
101
|
+
| `APPROVED` | Зелёный. |
|
|
102
|
+
|
|
103
|
+
### `EStatusTrackerVerticalAlign`
|
|
104
|
+
|
|
105
|
+
| Value | Поведение |
|
|
106
|
+
|---|---|
|
|
107
|
+
| `TOP` | Default — выравнивание сверху (класс не применяется). |
|
|
108
|
+
| `MIDDLE` | `styles.verticalAlignMiddle`. |
|
|
109
|
+
| `BOTTOM` | `styles.verticalAlignBottom`. |
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## Инварианты
|
|
114
|
+
|
|
115
|
+
- **`forwardRef<HTMLDivElement>`** на корне и каждом slot'е — не убирать.
|
|
116
|
+
- **Все slot'ы используют один CSS-класс `statusTrackerChild`** — они взаимозаменяемы на уровне layout, порядок в DOM определяет порядок рендера.
|
|
117
|
+
- **Двухслойный background (`statusTrackerBackground` + `statusTrackerColor`)** — нужен для анимации перехода между типами (ключ `key={type}` на background-div ре-монтирует слой при смене type → анимация). При изменении анимации учти `key`.
|
|
118
|
+
- **`DRAFT` не имеет цветовой модификации** в `typeToClassNameMap` — draft = базовый стиль wrapper'а, без цветной полосы.
|
|
119
|
+
- **Композиция через `Object.assign`** — slot'ы выставляются на корневом forwardRef. Не менять форму `StatusTracker.Header.Title` и пр.
|
|
120
|
+
- **Публичные enum'ы** (`EStatusTrackerType`, `EStatusTrackerVerticalAlign`) — изменение имён значений = breaking change.
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## Accessibility
|
|
125
|
+
|
|
126
|
+
- Без собственных ARIA-атрибутов — это визуальный layout.
|
|
127
|
+
- Рекомендуется: передать `role="article"` или `role="region"` с `aria-label` на корневой `<div>`, если компонент используется как самостоятельная карточка; либо обернуть в `<li>` внутри списка документов.
|
|
128
|
+
- Цвет статуса — не единственный канал передачи информации; `StatusTracker.Body.Status` обычно содержит текст с названием статуса.
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
## Связанные компоненты
|
|
133
|
+
|
|
134
|
+
- `MarkerStatus` — инлайн-маркер статуса.
|
|
135
|
+
- `Alert` — слот `StatusTrackerAlert` внутри.
|
|
136
|
+
- `Card` — схожая layout-обёртка для произвольного контента.
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
## Stories
|
|
141
|
+
|
|
142
|
+
Основные истории: `stories/StatusTracker/StatusTracker.stories.tsx`
|
|
143
|
+
Примеры: `stories/StatusTracker/examples/`
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
## История изменений
|
|
148
|
+
|
|
149
|
+
| Дата | Изменение |
|
|
150
|
+
|---|---|
|
|
151
|
+
| 2026-04-18 | Создан документ |
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
---
|
|
2
|
+
component: Step
|
|
3
|
+
category: Navigation
|
|
4
|
+
figma-node: ""
|
|
5
|
+
figma-file: ""
|
|
6
|
+
related: [Stepper, Tooltip]
|
|
7
|
+
tokens:
|
|
8
|
+
- --triplex-next-Step-Background_Default
|
|
9
|
+
- --triplex-next-Step-Background_Active
|
|
10
|
+
- --triplex-next-Step-Background_Done
|
|
11
|
+
- --triplex-next-Step-Background_Warning
|
|
12
|
+
- --triplex-next-Step-Background_Error
|
|
13
|
+
- --triplex-next-Step-Background_Disabled
|
|
14
|
+
- --triplex-next-Step-Color_Default
|
|
15
|
+
- --triplex-next-Step-Color_Active
|
|
16
|
+
- --triplex-next-Step-Color_Done
|
|
17
|
+
- --triplex-next-Step-Color_Warning
|
|
18
|
+
- --triplex-next-Step-Color_Error
|
|
19
|
+
- --triplex-next-Step-Color_Disabled
|
|
20
|
+
stories: ""
|
|
21
|
+
version: "1.0"
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
# Step
|
|
25
|
+
|
|
26
|
+
## Назначение
|
|
27
|
+
|
|
28
|
+
Визуальный «кружок с номером шага» для stepper-интерфейсов. Показывает статус
|
|
29
|
+
(`default`/`active`/`done`/`warning`/`error`/`disabled`) через цветовой стейт.
|
|
30
|
+
Опционально оборачивается в `Tooltip` (hover), если передан `children`.
|
|
31
|
+
|
|
32
|
+
Используй когда: нужен отдельный индикатор шага (например, внутри кастомного
|
|
33
|
+
stepper-а). Для готового пошагового виджета — `Stepper`.
|
|
34
|
+
Не используй когда: нужен текстовый label шага — добавь его рядом, `Step`
|
|
35
|
+
отрисовывает только номер в кружке.
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## Файловая структура
|
|
40
|
+
|
|
41
|
+
```text
|
|
42
|
+
src/components/Step/
|
|
43
|
+
├── Step.tsx # FC
|
|
44
|
+
├── enums.ts # EStepStatus, EStepPosition
|
|
45
|
+
├── index.ts
|
|
46
|
+
└── styles/Step.module.less
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Также экспортируется утилита `calcPosition(stepCount, i)` — вычисляет
|
|
50
|
+
`EStepPosition` (первый/последний/в середине) для списка шагов.
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## Варианты и props
|
|
55
|
+
|
|
56
|
+
### `IStepProps`
|
|
57
|
+
|
|
58
|
+
| Prop | Тип | Default | Описание |
|
|
59
|
+
|---|---|---|---|
|
|
60
|
+
| `step` | `number` | — | Число, отображаемое внутри кружка. |
|
|
61
|
+
| `status` | `EStepStatus` | — | Цветовой стейт (см. ниже). |
|
|
62
|
+
| `position?` | `EStepPosition` | `Default` | Влияет на `alignTip` опционального Tooltip'а. |
|
|
63
|
+
| `children?` | `ReactNode` | — | Контент Tooltip'а. Если не передан — Tooltip не рендерится. |
|
|
64
|
+
| `...HTMLAttributes<HTMLDivElement>` | — | — | Прокидываются на корневой `<div>`. |
|
|
65
|
+
|
|
66
|
+
### `EStepStatus`
|
|
67
|
+
|
|
68
|
+
`DEFAULT` / `DONE` / `ACTIVE` / `ERROR` / `WARNING` / `DISABLED`.
|
|
69
|
+
|
|
70
|
+
Маппинг на CSS-классы 1-к-1 через `statusToClassNameMap`.
|
|
71
|
+
|
|
72
|
+
### `EStepPosition`
|
|
73
|
+
|
|
74
|
+
| Value | Поведение (alignTip) |
|
|
75
|
+
|---|---|
|
|
76
|
+
| `XFirst` | `ETooltipAlign.START` |
|
|
77
|
+
| `Default` | `ETooltipAlign.CENTER` |
|
|
78
|
+
| `XLast` | `ETooltipAlign.END` |
|
|
79
|
+
|
|
80
|
+
`calcPosition(total, i)` возвращает `XFirst`/`XLast`/`Default` для удобства
|
|
81
|
+
сборки списка шагов.
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
## Инварианты
|
|
86
|
+
|
|
87
|
+
- **Рендер числа через `<Text size=B1 weight=SEMIBOLD>`** — фикс типографики для совпадения с дизайном.
|
|
88
|
+
- **Tooltip рендерится только при наличии `children`** — без children компонент возвращает голый `<div>`.
|
|
89
|
+
- **Tooltip: `toggleType="hover"`, `size=SM`** — не менять без согласования.
|
|
90
|
+
- **Step — `FC`**, ref не пробрасывается (корневой div доступен только через обёртку Tooltip — по-разному в двух ветках рендера).
|
|
91
|
+
- **Публичные enums** (`EStepStatus`, `EStepPosition`) + функция `calcPosition` — часть публичного API.
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## Accessibility
|
|
96
|
+
|
|
97
|
+
- Компонент — чисто визуальный (`<div>` с числом); сам по себе ARIA-ролью не наделён.
|
|
98
|
+
- В составе stepper-а потребитель обязан обеспечить семантику (`role="list"` / `role="listitem"` / `aria-current="step"` на активном шаге). См. `Stepper-AI`.
|
|
99
|
+
- Tooltip показывается только на hover — для пользователей клавиатуры текст подсказки недоступен. Если содержимое tooltip важно, дублируй его видимым лейблом рядом со Step.
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## Связанные компоненты
|
|
104
|
+
|
|
105
|
+
- `Stepper` — готовый виджет пошаговой навигации, использует Step внутри через `StepperStep` / `StepperStepIcon`.
|
|
106
|
+
- `Tooltip` — оборачивает Step при наличии children.
|
|
107
|
+
- `Typography.Text` — используется для рендера номера.
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## Stories
|
|
112
|
+
|
|
113
|
+
Отдельных stories нет (используется внутри stories `Stepper`).
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## История изменений
|
|
118
|
+
|
|
119
|
+
| Дата | Изменение |
|
|
120
|
+
|---|---|
|
|
121
|
+
| 2026-04-18 | Создан документ |
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
---
|
|
2
|
+
component: Stepper
|
|
3
|
+
category: Navigation
|
|
4
|
+
figma-node: ""
|
|
5
|
+
figma-file: ""
|
|
6
|
+
related: [Step, CarouselExtended, ButtonIcon]
|
|
7
|
+
tokens: []
|
|
8
|
+
stories: stories/Stepper/Stepper.stories.tsx
|
|
9
|
+
version: "1.0"
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Stepper
|
|
13
|
+
|
|
14
|
+
## Назначение
|
|
15
|
+
|
|
16
|
+
Горизонтальный список шагов оформления с активным шагом, пройденными и
|
|
17
|
+
непройденными. Обёрнут в `CarouselExtended` — при overflow добавляются
|
|
18
|
+
кнопки-скроллеры и авто-прокрутка к выбранному шагу (с адаптивом по
|
|
19
|
+
breakpoint `SM_MAX`: scroll-to-center vs scroll-to-edge).
|
|
20
|
+
|
|
21
|
+
Используй когда: нужна готовая пошаговая навигация (например, оформление
|
|
22
|
+
заявки). Для ручной сборки из шагов без карусели — `StepperExtended`.
|
|
23
|
+
Для отдельного кружка шага — `Step`.
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## Файловая структура
|
|
28
|
+
|
|
29
|
+
```text
|
|
30
|
+
src/components/Stepper/
|
|
31
|
+
├── Stepper.tsx # FC, оборачивает StepperExtended в CarouselExtended
|
|
32
|
+
├── StepperExtended.tsx # FC + Provider (tablist), без карусели
|
|
33
|
+
├── StepperStep.tsx # FC + StepperStep.Icon; li role=button
|
|
34
|
+
├── StepperStepIcon.tsx
|
|
35
|
+
├── StepperWrapper.tsx # статичная обёртка
|
|
36
|
+
├── StepperExtendedContext.ts
|
|
37
|
+
├── RightBorderArrow.tsx # угловой «стрелочный» separator между шагами
|
|
38
|
+
├── enums.ts # EStepperSize, EStepperStepType, EStepperStepIconType
|
|
39
|
+
└── styles/
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## Публичный API
|
|
45
|
+
|
|
46
|
+
### `Stepper` — готовый виджет
|
|
47
|
+
|
|
48
|
+
| Prop | Тип | Default | Описание |
|
|
49
|
+
|---|---|---|---|
|
|
50
|
+
| `steps` | `IStepperStep[]` | — | Массив шагов: `id`, `type`, `icon?`, `disabled?`, `label?`. |
|
|
51
|
+
| `size?` | `EStepperSize` | `SM` | SM / MD / LG. |
|
|
52
|
+
| `selectedStepId?` | `string` | — | Id выбранного шага. |
|
|
53
|
+
| `onSelectStep` | `(id: string) => void` | — | Колбэк выбора. |
|
|
54
|
+
| `children` | `never` | — | Запрещено — шаги передаются через `steps`. |
|
|
55
|
+
|
|
56
|
+
`IStepperStep`:
|
|
57
|
+
```ts
|
|
58
|
+
{ id: string; type: EStepperStepType; label?: ReactNode; icon?: ReactNode; disabled?: boolean }
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### `StepperExtended` — без карусели
|
|
62
|
+
|
|
63
|
+
Для ручной сборки (напр. в вертикальном layout).
|
|
64
|
+
|
|
65
|
+
| Prop | Тип | Default | Описание |
|
|
66
|
+
|---|---|---|---|
|
|
67
|
+
| `size?` | `EStepperSize` | `SM` | Прокидывается в Context. |
|
|
68
|
+
| `selectedStepId?` | `string` | — | Id активного шага. |
|
|
69
|
+
| `onSelectStep` | `(id: string) => void` | — | Колбэк. |
|
|
70
|
+
| `forwardedRef?` | `Ref<HTMLOListElement>` | — | Ref на `<ol role="tablist">`. |
|
|
71
|
+
| `children` | `ReactNode` | — | `StepperExtended.Step` (`StepperStep`). |
|
|
72
|
+
|
|
73
|
+
### `StepperStep` (`Stepper.Step` / `StepperExtended.Step`)
|
|
74
|
+
|
|
75
|
+
| Prop | Тип | Описание |
|
|
76
|
+
|---|---|---|
|
|
77
|
+
| `id` | `string` | Уникальный id (матчится с `selectedStepId`). |
|
|
78
|
+
| `type` | `EStepperStepType` | `NEUTRAL` / `ERROR` / `WARNING` (применяет цветовой модификатор, если !disabled). |
|
|
79
|
+
| `disabled?` | `boolean` | Блокирует выбор. |
|
|
80
|
+
| `icon?` | `ReactNode` | Обычно `<StepperStep.Icon type={EStepperStepIconType} />`. |
|
|
81
|
+
| `isInActiveStep?` | `boolean` | Непройденный шаг (индекс > selectedIndex). В `Stepper` выставляется автоматически. |
|
|
82
|
+
| `forwardedRef?` | `Ref<HTMLLIElement>` | Ref на `<li>`. В `Stepper` используется для авто-скролла. |
|
|
83
|
+
| `children` | `ReactNode` | Лейбл шага. |
|
|
84
|
+
|
|
85
|
+
Статус шага определяется композицией:
|
|
86
|
+
- `active` = `id === selectedId`
|
|
87
|
+
- `inactive` = `isInActiveStep`
|
|
88
|
+
- `completed` = `!active && !inactive`
|
|
89
|
+
- `error`/`warning` применяются поверх, когда `!disabled`.
|
|
90
|
+
|
|
91
|
+
### `StepperStep.Icon`
|
|
92
|
+
|
|
93
|
+
| Prop | Тип | Описание |
|
|
94
|
+
|---|---|---|
|
|
95
|
+
| `type` | `EStepperStepIconType` | `FILLED` / `SUCCESS` / `ERROR` / `WARNING` / `WAIT`. |
|
|
96
|
+
|
|
97
|
+
### `Stepper.Wrapper` / `StepperExtended.Wrapper`
|
|
98
|
+
|
|
99
|
+
Простой `<div>` с `className="stepperWrapper"` — layout-контейнер для размещения Stepper в шапке/панели.
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## Контекст (`StepperExtendedContext`)
|
|
104
|
+
|
|
105
|
+
Хранит `selectedId`, `size`, `onSelectStep`. `StepperStep` — потребитель этого контекста.
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## Логика выравнивания в Stepper
|
|
110
|
+
|
|
111
|
+
При смене `selectedStepId`:
|
|
112
|
+
1. `getBoundingClientRect` для carousel и шага.
|
|
113
|
+
2. На узких экранах (`max-width: SM_MAX`) → scroll по центру выбранного шага.
|
|
114
|
+
3. На широких → scroll к краю (left/right) с паддингом `32px` (`paddingLeft/Right`).
|
|
115
|
+
|
|
116
|
+
Кнопки scroll'а рендерятся через `CarouselExtended.buttonPrev/Next` с `aria-label="Прокрутить назад" / "Прокрутить вперёд"`.
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
## Инварианты
|
|
121
|
+
|
|
122
|
+
- **`<ol role="tablist">`** на StepperExtended, **`<li role="button">`** на StepperStep — ARIA-роли.
|
|
123
|
+
- **`aria-current`** применяется только к активному шагу (`progress ? true : undefined`). Для неактивных — должен быть `undefined`, не `false`.
|
|
124
|
+
- **`tabIndex={disabled ? -1 : 0}`** на `<li>` — не ронять.
|
|
125
|
+
- **Keyboard: Enter/Space** выбирают шаг. `Space` — с `preventDefault()` чтобы страница не скроллилась.
|
|
126
|
+
- **`Stepper.children: never`** — API через `steps`.
|
|
127
|
+
- **Публичные enums** (`EStepperSize`, `EStepperStepType`, `EStepperStepIconType`) — breaking change.
|
|
128
|
+
- **`Stepper.Wrapper === StepperWrapper`** и **`Stepper.Step === StepperStep`** — дублируются на `Stepper` и `StepperExtended`, не удалять.
|
|
129
|
+
- **`RightBorderArrow`** рендерится после контента каждого шага — визуальный separator. Не заменять inline-псевдоэлементом без проверки нарезки.
|
|
130
|
+
- **Корневой `<ol>` — не кнопка**; клик открывается на `<li>` через `role="button"` (W3C-некомпатибельно по-строгому, но принятая конвенция проекта).
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## Accessibility
|
|
135
|
+
|
|
136
|
+
- `role="tablist"` / `role="button"` (`<li>` не tab — сделано по-проектному).
|
|
137
|
+
- `aria-disabled={disabled}`, `aria-current={progress ? true : undefined}`.
|
|
138
|
+
- Keyboard: Enter/Space — выбор шага. Стрелки — **не обрабатываются** (используется carousel-прокрутка). Переход Tab-ом: по одному шагу.
|
|
139
|
+
- Авто-прокрутка при `selectedStepId` может сбить фокус визуально — но focus на `<li>` сохраняется, шаг всегда будет в видимой области.
|
|
140
|
+
- Потребитель должен обеспечить осмысленные labels шагов (`label` или `children`) — не полагаться на номер.
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
## Связанные компоненты
|
|
145
|
+
|
|
146
|
+
- `Step` — отдельный кружок шага (не используется внутри Stepper).
|
|
147
|
+
- `CarouselExtended` — обёртка в `Stepper`.
|
|
148
|
+
- `ButtonIcon`, `IconWrapper` — UI.
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
152
|
+
## Stories
|
|
153
|
+
|
|
154
|
+
Основные истории: `stories/Stepper/Stepper.stories.tsx`
|
|
155
|
+
Примеры: `stories/Stepper/examples/`
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
## История изменений
|
|
160
|
+
|
|
161
|
+
| Дата | Изменение |
|
|
162
|
+
|---|---|
|
|
163
|
+
| 2026-04-18 | Создан документ |
|