@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.
Files changed (140) hide show
  1. package/README.md +124 -0
  2. package/bundle/.gitkeep +0 -0
  3. package/bundle/components/AbstractTree.md +198 -0
  4. package/bundle/components/AccordionBase.md +227 -0
  5. package/bundle/components/Alert.md +317 -0
  6. package/bundle/components/Amount.md +225 -0
  7. package/bundle/components/AmountField.md +289 -0
  8. package/bundle/components/Avatar.md +209 -0
  9. package/bundle/components/Badge.md +277 -0
  10. package/bundle/components/Body.md +167 -0
  11. package/bundle/components/Button.md +230 -0
  12. package/bundle/components/ButtonDropdown.md +159 -0
  13. package/bundle/components/ButtonIcon.md +122 -0
  14. package/bundle/components/Calendar.md +445 -0
  15. package/bundle/components/Card.md +374 -0
  16. package/bundle/components/CarouselExtended.md +250 -0
  17. package/bundle/components/Checkbox.md +126 -0
  18. package/bundle/components/CheckboxTree.md +280 -0
  19. package/bundle/components/CheckboxTreeExtended.md +321 -0
  20. package/bundle/components/CheckboxXGroup.md +68 -0
  21. package/bundle/components/CheckboxYGroup.md +67 -0
  22. package/bundle/components/Chip.md +404 -0
  23. package/bundle/components/ChipGroup.md +179 -0
  24. package/bundle/components/Col.md +221 -0
  25. package/bundle/components/CollapsableTree.md +255 -0
  26. package/bundle/components/Confirm.md +343 -0
  27. package/bundle/components/DateField.md +371 -0
  28. package/bundle/components/DatePickerExtended.md +342 -0
  29. package/bundle/components/DateRange.md +275 -0
  30. package/bundle/components/DesignTokens.md +385 -0
  31. package/bundle/components/Divider.md +196 -0
  32. package/bundle/components/DocumentNumberEdit.md +280 -0
  33. package/bundle/components/Dropdown.md +433 -0
  34. package/bundle/components/Ellipsis.md +208 -0
  35. package/bundle/components/EmptyView.md +99 -0
  36. package/bundle/components/ExpandAnimation.md +281 -0
  37. package/bundle/components/Footer.md +339 -0
  38. package/bundle/components/FormField.md +326 -0
  39. package/bundle/components/FormGroup.md +99 -0
  40. package/bundle/components/Gap.md +113 -0
  41. package/bundle/components/Header.md +280 -0
  42. package/bundle/components/HelpBox.md +154 -0
  43. package/bundle/components/IconWrapper.md +145 -0
  44. package/bundle/components/Island.md +197 -0
  45. package/bundle/components/IslandAccordion.md +230 -0
  46. package/bundle/components/IslandWidget.md +233 -0
  47. package/bundle/components/KeyDownListener.md +157 -0
  48. package/bundle/components/LightBox.md +322 -0
  49. package/bundle/components/Link.md +161 -0
  50. package/bundle/components/List.md +247 -0
  51. package/bundle/components/ListMaster.md +204 -0
  52. package/bundle/components/Loader.md +161 -0
  53. package/bundle/components/LoaderScreen.md +134 -0
  54. package/bundle/components/Marker.md +127 -0
  55. package/bundle/components/MarkerStatus.md +148 -0
  56. package/bundle/components/MediaWidth.md +169 -0
  57. package/bundle/components/MobileView.md +120 -0
  58. package/bundle/components/ModalWindow.md +308 -0
  59. package/bundle/components/MonthYearField.md +168 -0
  60. package/bundle/components/MultiselectField.md +213 -0
  61. package/bundle/components/Notification.md +233 -0
  62. package/bundle/components/NumberField.md +178 -0
  63. package/bundle/components/OrderedList.md +169 -0
  64. package/bundle/components/Overlay.md +237 -0
  65. package/bundle/components/Page.md +246 -0
  66. package/bundle/components/Pagination.md +298 -0
  67. package/bundle/components/Portal.md +119 -0
  68. package/bundle/components/Radio.md +174 -0
  69. package/bundle/components/Row.md +125 -0
  70. package/bundle/components/SMSField.md +160 -0
  71. package/bundle/components/SegmentedControl.md +235 -0
  72. package/bundle/components/SelectExtendedField.md +322 -0
  73. package/bundle/components/SelectField.md +213 -0
  74. package/bundle/components/Skeleton.md +129 -0
  75. package/bundle/components/Slider.md +157 -0
  76. package/bundle/components/SliderExtended.md +210 -0
  77. package/bundle/components/SliderRange.md +160 -0
  78. package/bundle/components/SmallInput.md +101 -0
  79. package/bundle/components/Spoiler.md +121 -0
  80. package/bundle/components/StatusTracker.md +151 -0
  81. package/bundle/components/Step.md +121 -0
  82. package/bundle/components/Stepper.md +163 -0
  83. package/bundle/components/Suggest.md +160 -0
  84. package/bundle/components/SuggestField.md +157 -0
  85. package/bundle/components/SwipeableArea.md +144 -0
  86. package/bundle/components/Table.md +199 -0
  87. package/bundle/components/Tabs.md +152 -0
  88. package/bundle/components/TabsExtended.md +273 -0
  89. package/bundle/components/TabsLine.md +189 -0
  90. package/bundle/components/Tag.md +135 -0
  91. package/bundle/components/TagColor.md +121 -0
  92. package/bundle/components/TagGroup.md +100 -0
  93. package/bundle/components/TextField.md +152 -0
  94. package/bundle/components/TextareaField.md +124 -0
  95. package/bundle/components/ThemeProvider.md +181 -0
  96. package/bundle/components/Tooltip.md +254 -0
  97. package/bundle/components/TopOverlay.md +145 -0
  98. package/bundle/components/TreeView.md +224 -0
  99. package/bundle/components/Triggers.md +121 -0
  100. package/bundle/guides/codestyle.md +205 -0
  101. package/bundle/guides/commits.md +166 -0
  102. package/bundle/guides/context.md +277 -0
  103. package/bundle/guides/stories.md +618 -0
  104. package/bundle/guides/template.md +154 -0
  105. package/bundle/guides/tests.md +301 -0
  106. package/bundle/icons.json +4156 -0
  107. package/bundle/manifest.json +796 -0
  108. package/bundle/release-notes/1.1.0.mdx +26 -0
  109. package/bundle/release-notes/1.1.1.mdx +14 -0
  110. package/bundle/release-notes/1.10.0.mdx +43 -0
  111. package/bundle/release-notes/1.11.0.mdx +19 -0
  112. package/bundle/release-notes/1.12.0.mdx +21 -0
  113. package/bundle/release-notes/1.13.0.mdx +43 -0
  114. package/bundle/release-notes/1.14.0.mdx +29 -0
  115. package/bundle/release-notes/1.15.0.mdx +56 -0
  116. package/bundle/release-notes/1.16.0.mdx +55 -0
  117. package/bundle/release-notes/1.17.0.mdx +15 -0
  118. package/bundle/release-notes/1.18.0.mdx +24 -0
  119. package/bundle/release-notes/1.19.0.mdx +48 -0
  120. package/bundle/release-notes/1.19.1.mdx +9 -0
  121. package/bundle/release-notes/1.2.0.mdx +80 -0
  122. package/bundle/release-notes/1.20.0.mdx +48 -0
  123. package/bundle/release-notes/1.21.0.mdx +66 -0
  124. package/bundle/release-notes/1.22.0.mdx +75 -0
  125. package/bundle/release-notes/1.23.0.mdx +50 -0
  126. package/bundle/release-notes/1.24.0.mdx +59 -0
  127. package/bundle/release-notes/1.25.0.mdx +52 -0
  128. package/bundle/release-notes/1.26.0.mdx +11 -0
  129. package/bundle/release-notes/1.3.0.mdx +21 -0
  130. package/bundle/release-notes/1.4.0.mdx +37 -0
  131. package/bundle/release-notes/1.5.0.mdx +24 -0
  132. package/bundle/release-notes/1.6.0.mdx +37 -0
  133. package/bundle/release-notes/1.6.1.mdx +11 -0
  134. package/bundle/release-notes/1.7.0.mdx +29 -0
  135. package/bundle/release-notes/1.8.0.mdx +38 -0
  136. package/bundle/release-notes/1.9.0.mdx +28 -0
  137. package/dist/index.d.ts +2 -0
  138. package/dist/index.js +324 -0
  139. package/dist/index.js.map +1 -0
  140. 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 | Создан документ |