@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,157 @@
1
+ ---
2
+ component: Slider
3
+ category: Form Controls
4
+ figma-node: ""
5
+ figma-file: ""
6
+ related: [SliderExtended, SliderRange]
7
+ tokens: []
8
+ stories: stories/Slider/Slider.stories.tsx
9
+ version: "1.0"
10
+ ---
11
+
12
+ # Slider
13
+
14
+ ## Назначение
15
+
16
+ Готовый слайдер с **одним** ползунком: фиксированная компоновка
17
+ `SliderExtended` (`Rail` → `Dot` → `Track` → `Marks`), tooltip над dot'ом
18
+ если передан `renderTooltipContent`. Под капотом — `SliderExtended` с
19
+ ровно одним `Dot`.
20
+
21
+ Используй когда: нужно выбрать одно числовое значение в диапазоне
22
+ `min..max`. Для двух точек (диапазон) — `SliderRange`. Для нестандартной
23
+ компоновки (свой Tooltip, отдельные Marks) — `SliderExtended`.
24
+
25
+ ---
26
+
27
+ ## Файловая структура
28
+
29
+ ```text
30
+ src/components/Slider/
31
+ ├── Slider.tsx # FC; склейка SliderExtended + Dot + Tooltip + Marks
32
+ ├── index.ts # Barrel
33
+ └── __tests__/
34
+ ```
35
+
36
+ ---
37
+
38
+ ## Варианты и props
39
+
40
+ ### `ISliderProps`
41
+
42
+ ```ts
43
+ extends Omit<ISliderExtendedProps, "onChange" | "step">
44
+ extends Pick<ISliderExtendedDotProps, "onChange" | "value">
45
+ ```
46
+
47
+ | Prop | Тип | Default | Описание |
48
+ |---|---|---|---|
49
+ | `value` | `number` | — | Текущее значение dot'а. |
50
+ | `onChange` | `(value: number) => void` | — | Изменение значения. |
51
+ | `marks` | `ISliderMark[]` | — | Метки под полосой (`{ value, label }`). |
52
+ | `step?` | `number \| number[]` | `1` | Длина шага или явный массив значений. |
53
+ | `renderTooltipContent?` | `(value: number) => ReactNode` | — | Если передан — рендерится `Tooltip` над dot'ом. |
54
+ | `size` | `EComponentSize.MD \| LG` | — (обязателен из ISliderExtendedProps) | Только MD/LG. |
55
+ | `min` / `max` | `number` | — | От SliderExtended. |
56
+ | `disabled?` / `reverse?` | `boolean` | — | От SliderExtended. |
57
+ | `children?` | `never` | — | Запрещено. |
58
+
59
+ ### `ISliderMark`
60
+
61
+ ```ts
62
+ { value: number; label: ReactNode }
63
+ ```
64
+
65
+ `value` должен быть в `[min, max]`.
66
+
67
+ ### `step`
68
+
69
+ - **`number`** — обычный шаг: для `min=0, max=100, step=1` — 100 шагов.
70
+ - **`number[]`** — явный массив возможных значений, **первый = `min`**, **последний = `max`** (контракт).
71
+
72
+ ---
73
+
74
+ ## Ключевые особенности реализации
75
+
76
+ ### Жёстко зашитая структура
77
+
78
+ ```tsx
79
+ <SliderExtended step={step} size={size} {...rest}>
80
+ <SliderExtended.Rail />
81
+ <SliderExtended.Dot value={value} onChange={onChange}>
82
+ {renderTooltipContent && <SliderExtended.Tooltip ...>{renderTooltipContent(value)}</SliderExtended.Tooltip>}
83
+ </SliderExtended.Dot>
84
+ <SliderExtended.Track />
85
+ <SliderExtended.Marks>
86
+ {marks.map(m => <SliderExtended.Mark key={m.value} value={m.value}>{m.label}</SliderExtended.Mark>)}
87
+ </SliderExtended.Marks>
88
+ </SliderExtended>
89
+ ```
90
+
91
+ - Порядок: Rail → Dot → Track → Marks. Изменение порядка — менять `Slider.tsx`.
92
+ - Tooltip — вложен в Dot, рендерится только при `renderTooltipContent`.
93
+
94
+ ### `step` default `1`
95
+
96
+ - Если потребитель не передал — `1`.
97
+
98
+ ### `Tooltip` — над **самим** dot'ом, не на hover
99
+
100
+ - Рендерится при наличии `renderTooltipContent`. По UX — обычно показывается всегда (см. SliderExtendedTooltip-логику).
101
+
102
+ ### **`children: never`**
103
+
104
+ - Внутрь Slider'а нельзя положить кастомные элементы — для этого использовать SliderExtended.
105
+
106
+ ### **`FC, не forwardRef`**
107
+
108
+ - Ref не пробрасывается.
109
+
110
+ ---
111
+
112
+ ## Инварианты
113
+
114
+ - **Один Dot, фиксированная структура** — Rail/Dot/Track/Marks. Менять только через SliderExtended.
115
+ - **`step` default `1`**.
116
+ - **`marks: ISliderMark[]`** — обязателен, может быть `[]`.
117
+ - **`renderTooltipContent?`** — опционально; без него Tooltip не рендерится.
118
+ - **`size: MD | LG`** — `SM` не поддерживается.
119
+ - **`children: never`**.
120
+ - **`value` ∈ `[min, max]`** — потребитель ответственен (валидации нет).
121
+ - **Если `step` — массив**, первое значение = `min`, последнее = `max`.
122
+ - **`FC, не forwardRef`**.
123
+
124
+ ---
125
+
126
+ ## Accessibility
127
+
128
+ - Наследуется от `SliderExtended.Dot` (см. SliderExtended-AI; обычно `<span>` с `tabIndex`).
129
+ - Keyboard navigation — стрелки (детали в SliderExtendedDot).
130
+
131
+ ---
132
+
133
+ ## Дизайн-токены
134
+
135
+ Нет собственных — наследуются от `SliderExtended`.
136
+
137
+ ---
138
+
139
+ ## Связанные компоненты
140
+
141
+ - `SliderExtended` — низкоуровневая основа (slots).
142
+ - `SliderRange` — два ползунка.
143
+
144
+ ---
145
+
146
+ ## Stories
147
+
148
+ `stories/Slider/Slider.stories.tsx`
149
+ Примеры: `stories/Slider/examples/`
150
+
151
+ ---
152
+
153
+ ## История изменений
154
+
155
+ | Дата | Изменение |
156
+ |---|---|
157
+ | 2026-04-18 | Создан документ |
@@ -0,0 +1,210 @@
1
+ ---
2
+ component: SliderExtended
3
+ category: Form Controls
4
+ figma-node: ""
5
+ figma-file: ""
6
+ related: [Slider, SliderRange]
7
+ tokens:
8
+ - --triplex-next-Slider-Rail_Background
9
+ - --triplex-next-Slider-Rail_Background_Disabled
10
+ - --triplex-next-Slider-Track_Background_Default
11
+ - --triplex-next-Slider-Track_Background_Hover
12
+ - --triplex-next-Slider-Track_Background_Disabled
13
+ - --triplex-next-Slider-Dot_Background_Default
14
+ - --triplex-next-Slider-Dot_Background_Hover
15
+ - --triplex-next-Slider-Dot_Background_Select
16
+ - --triplex-next-Slider-Dot_Background_Disabled
17
+ - --triplex-next-Slider-Dot_Inner_Background
18
+ - --triplex-next-Slider-Dot_Inner_Background_Disabled
19
+ - --triplex-next-Slider-Dot_Focus
20
+ - --triplex-next-Slider-Mark_Dot_Background_Default
21
+ - --triplex-next-Slider-Mark_Dot_Background_Selected
22
+ - --triplex-next-Slider-Mark_Dot_Background_Selected_Disabled
23
+ - --triplex-next-Slider-Tooltip_Background
24
+ - --triplex-next-Slider-Tooltip_Color
25
+ stories: stories/Slider/SliderExtended.stories.tsx
26
+ version: "1.0"
27
+ ---
28
+
29
+ # SliderExtended
30
+
31
+ ## Назначение
32
+
33
+ Низкоуровневая основа слайдера со slot-компонентами
34
+ (`Rail`, `Dot`, `Track`, `Marks`, `Mark`, `Tooltip`). Контекст хранит состояние
35
+ `dots`, `steps`, `railNode`, `focused`. Потребитель сам собирает структуру.
36
+
37
+ Используй когда: нужна нестандартная компоновка (произвольное число `Dot`,
38
+ кастомный `Tooltip`, своя шкала `Marks`). Для готовых сценариев — `Slider`
39
+ (один ползунок) или `SliderRange` (два ползунка).
40
+
41
+ ---
42
+
43
+ ## Файловая структура
44
+
45
+ ```text
46
+ src/components/SliderExtended/
47
+ ├── SliderExtended.tsx # FC с Provider + render children
48
+ ├── SliderExtendedContext.ts # ISliderExtendedContext, ISliderExtendedDot, ISliderExtendedStep
49
+ ├── SliderExtendedUtils.ts # getNormalizedValue, getNearestStep, getStepIndexByNormalizedValue...
50
+ ├── components/
51
+ │ ├── SliderExtendedRail.tsx
52
+ │ ├── SliderExtendedMoveHandler.tsx
53
+ │ ├── SliderExtendedDot/
54
+ │ │ ├── SliderExtendedDot.tsx
55
+ │ │ ├── SliderExtendedDotActions.ts
56
+ │ │ └── useSliderExtendedDotTabIndex.tsx
57
+ │ ├── SliderExtendedMarks/
58
+ │ │ ├── SliderExtendedMarks.tsx
59
+ │ │ ├── SliderExtendedMark.tsx
60
+ │ │ └── SliderExtendedMarkActions.ts
61
+ │ ├── SliderExtendedTooltip/SliderExtendedTooltip.tsx
62
+ │ └── SliderExtendedTrack/
63
+ │ ├── SliderExtendedTrack.tsx
64
+ │ └── SliderExtendedTrackActions.ts
65
+ ├── styles/
66
+ └── index.ts
67
+ ```
68
+
69
+ ---
70
+
71
+ ## Slot-компоненты
72
+
73
+ | Slot | Обязателен | Назначение |
74
+ |---|---|---|
75
+ | `SliderExtended.Rail` | ✅ | Полоса-подложка. Клик по rail перемещает ближайший `Dot` на ближайший `step`. |
76
+ | `SliderExtended.Dot` | ✅ (≥1) | Ползунок. Управление мышью/touch/клавиатурой. |
77
+ | `SliderExtended.Track` | опционально | Полоса между двумя `Dot` (закрашенная зона). Если `dots.length < 2` — не рендерит ничего. |
78
+ | `SliderExtended.Marks` | опционально | Контейнер для `Mark` — шкала под rail. |
79
+ | `SliderExtended.Mark` | опционально | Отдельная метка на шкале (`value`, `children`). Клик → ближайший Dot едет на value. |
80
+ | `SliderExtended.Tooltip` | опционально | Тултип над Dot (рендерится внутри `<Dot>`). |
81
+
82
+ ---
83
+
84
+ ## Варианты и props
85
+
86
+ ### `ISliderExtendedProps` (корневой)
87
+
88
+ | Prop | Тип | Default | Описание |
89
+ |---|---|---|---|
90
+ | `min` | `number` | — | Минимальное значение. |
91
+ | `max` | `number` | — | Максимальное значение. |
92
+ | `step` | `number \| number[]` | — | Шаг или массив возможных значений (первый = `min`, последний = `max`). |
93
+ | `size` | `EComponentSize.MD \| LG` | — | Только MD и LG. `SM` запрещён. |
94
+ | `disabled?` | `boolean` | `false` | Блокирует интеракции. |
95
+ | `reverse?` | `boolean` | `false` | Реверсивная ориентация (min справа). |
96
+ | `...HTMLAttributes<HTMLDivElement>` | — | — | Прокидываются на корневой `div`. |
97
+
98
+ ### `ISliderExtendedDotProps`
99
+
100
+ | Prop | Тип | Описание |
101
+ |---|---|---|
102
+ | `value` | `number` | Текущее значение точки. Должно принадлежать `[min, max]`. |
103
+ | `onChange` | `(value: number) => void` | Вызывается при drag/keyboard/click-on-rail. |
104
+ | `...HTMLAttributes<HTMLSpanElement>` | `Omit<..., "onChange" \| "value">` | Прокидываются на `<span role="slider">`. |
105
+
106
+ ### `ISliderExtendedTrackProps`
107
+
108
+ | Prop | Тип | Default | Описание |
109
+ |---|---|---|---|
110
+ | `draggable?` | `boolean` | `true` | Разрешает перетаскивание Track целиком. Работает только при `dots.length > 1`. |
111
+ | `children` | `never` | — | Запрещено. |
112
+
113
+ ### `ISliderExtendedMarkProps`
114
+
115
+ | Prop | Тип | Описание |
116
+ |---|---|---|
117
+ | `value` | `number` | Позиция метки на шкале. Клик по dot/text метки — ближайший Dot едет на value. |
118
+ | `children` | `ReactNode` | Лейбл метки (оборачивается в `Text` с размером зависимо от `size`). |
119
+
120
+ ### `ISliderExtendedTooltipProps`
121
+
122
+ | Prop | Тип | Описание |
123
+ |---|---|---|
124
+ | `value?` | `number` | Нужен для расчёта `offset` — сдвига тела tooltip от края, чтобы он не «вылезал» за край rail. |
125
+
126
+ ### `ISliderExtendedRailProps`
127
+
128
+ | Prop | Тип | Описание |
129
+ |---|---|---|
130
+ | `children` | `never` | Запрещено. Rail — только полоса. |
131
+
132
+ ---
133
+
134
+ ## Контекст (`ISliderExtendedContext`)
135
+
136
+ Все slot-компоненты работают через `SliderExtendedContext`. Основные поля:
137
+ `addDot / removeDot / updateDot`, `dots`, `steps`, `railNode`, `focused`,
138
+ `isHoverOrDragTrack`, `min`, `max`, `reverse`, `disabled`, `size`.
139
+
140
+ `steps` генерируются в `useLayoutEffect` из `step` / `min` / `max`:
141
+ - `step: number` → `[...range(min, max, step), max]`
142
+ - `step: number[]` → используется как есть
143
+
144
+ Нормализованное значение = `(value - min) / (max - min) * 100` (в %).
145
+ `SliderExtended` рендерит `null`, пока `steps.length === 0`.
146
+
147
+ ---
148
+
149
+ ## Инварианты
150
+
151
+ - **Порядок slot'ов в DOM важен визуально** — Rail под всем, Dot поверх Track, Marks — отдельный блок.
152
+ - **`size: MD | LG`** — `SM` не поддерживается.
153
+ - **`Dot.value` ∈ `[min, max]`** — валидации нет, ответственность на потребителе.
154
+ - **`step: number[]`** — первое значение = `min`, последнее = `max` (контракт, не проверяется).
155
+ - **Track рендерит `null`, если `dots.length < 2`** — не путать с `display:none`.
156
+ - **`Track.children: never`, `Rail.children: never`** — это layout-примитивы.
157
+ - **`role="slider"` на Dot, `role="button"` на Track** — не менять.
158
+ - **FC, не forwardRef** на всех компонентах семейства.
159
+ - **`KeyDownListener` подключается только когда компонент в фокусе** (Dot/Track) — иначе стрелки по странице будут перехватывать все слайдеры на странице.
160
+ - **`throttle(handleMouseMove, 50)` / `throttle(handleMouseMove, 100)`** — значения подобраны под плавность, менять с проверкой.
161
+
162
+ ---
163
+
164
+ ## Accessibility
165
+
166
+ - `SliderExtended.Dot` — `<span role="slider">` с `aria-valuemin`, `aria-valuenow`, `aria-valuemax`.
167
+ - `SliderExtended.Track` — `<span role="button">` (перетаскиваемый диапазон).
168
+ - Keyboard:
169
+ - `ArrowLeft` / `ArrowDown` — на предыдущий step.
170
+ - `ArrowRight` / `ArrowUp` — на следующий step.
171
+ - `preventDefault` на обработчиках — страница не скроллится при навигации.
172
+ - Фокус:
173
+ - `useSliderExtendedDotTabIndex` управляет `tabIndex` у Dot (в focus заходит только один Dot за раз).
174
+ - `Track` получает `tabIndex={2}` только когда `dots.length > 1 && focusedSlider`.
175
+ - Потребитель должен обеспечить осмысленный `aria-label` / `aria-labelledby` на root-элементе, если слайдер не в `FormField`.
176
+
177
+ ---
178
+
179
+ ## Связанные компоненты
180
+
181
+ - `Slider` — готовый single-dot слайдер поверх SliderExtended.
182
+ - `SliderRange` — готовый range-слайдер с двумя Dot.
183
+ - `Tooltip`, `FormField` — часто используются рядом.
184
+
185
+ ---
186
+
187
+ ## Stories
188
+
189
+ Основные истории: `stories/Slider/SliderExtended.stories.tsx`
190
+ Файлы примеров: `stories/Slider/examples/SliderExtended/`
191
+
192
+ | Story | Example file | Что демонстрирует |
193
+ |---|---|---|
194
+ | `Playground` | `PlaygroundExample.tsx` | Интерактивные controls базовой конфигурации |
195
+ | `Default` | `DefaultExample.tsx` | Один Dot + Marks |
196
+ | `Range` | `RangeExample.tsx` | Два Dot + Track |
197
+ | `RangeWithTooltip` | `RangeWithTooltipExample.tsx` | Range + Tooltip на обоих Dot |
198
+ | `WithCustomSteps` | `WithCustomStepsExample.tsx` | `step` как массив значений |
199
+ | `WithoutTooltip` | `WithoutTooltipExample.tsx` | Минимальная конфигурация |
200
+ | `Disabled` | `DisabledExample.tsx` | Состояние disabled |
201
+ | `Reverse` | `ReverseExample.tsx` | Реверсивная ориентация |
202
+ | `Amounts` | `AmountsExample.tsx` | Нелинейная шкала через `step: number[]` |
203
+
204
+ ---
205
+
206
+ ## История изменений
207
+
208
+ | Дата | Изменение |
209
+ |---|---|
210
+ | 2026-04-18 | Создан документ |
@@ -0,0 +1,160 @@
1
+ ---
2
+ component: SliderRange
3
+ category: Form Controls
4
+ figma-node: ""
5
+ figma-file: ""
6
+ related: [Slider, SliderExtended]
7
+ tokens: []
8
+ stories: stories/Slider/SliderRange.stories.tsx
9
+ version: "1.0"
10
+ ---
11
+
12
+ # SliderRange
13
+
14
+ ## Назначение
15
+
16
+ Готовый слайдер с **двумя** ползунками и закрашенной полосой между ними.
17
+ Фиксированная компоновка: `Rail → Dot₁ → Track → Dot₂ → Marks`.
18
+
19
+ Используй когда: нужно выбрать **диапазон** `[a, b]` из `[min, max]`.
20
+ Для одного значения — `Slider`. Для нестандартной компоновки — `SliderExtended`.
21
+
22
+ ---
23
+
24
+ ## Файловая структура
25
+
26
+ ```text
27
+ src/components/SliderRange/
28
+ ├── SliderRange.tsx # class component, склейка SliderExtended + два Dot + Track
29
+ ├── index.ts # Barrel
30
+ └── __tests__/
31
+ ```
32
+
33
+ ---
34
+
35
+ ## Варианты и props
36
+
37
+ ### `ISliderRangeProps`
38
+
39
+ Extends `Omit<ISliderExtendedProps, "onChange" | "step">`.
40
+
41
+ | Prop | Тип | Default | Описание |
42
+ |---|---|---|---|
43
+ | `values` | `TSliderRangeValues` (`[number, number]`) | — | Значения обоих ползунков. Оба ∈ `[min, max]`. |
44
+ | `onChange` | `(values: [number, number]) => void` | — | Вызывается с **отсортированным** массивом: `[меньший, больший]`. |
45
+ | `marks` | `ISliderRangeMark[]` | — | Метки `{value, label}` под rail. Обязателен, может быть `[]`. |
46
+ | `step?` | `number \| number[]` | `1` | Шаг или массив возможных значений (первый = `min`, последний = `max`). |
47
+ | `draggableTrack?` | `boolean` | `true` | Track можно перетаскивать (двигает оба Dot одновременно). |
48
+ | `renderTooltipContent?` | `(value: number) => ReactNode` | — | Если передан — Tooltip рендерится над **каждым** Dot. |
49
+ | `size` | `EComponentSize.MD \| LG` | — (из ISliderExtendedProps) | Только MD и LG. |
50
+ | `min` / `max` | `number` | — | От SliderExtended. |
51
+ | `disabled?` / `reverse?` | `boolean` | — | От SliderExtended. |
52
+ | `children` | `never` | — | Запрещено. |
53
+
54
+ ### `TSliderRangeValues`
55
+
56
+ ```ts
57
+ type TSliderRangeValues = [number, number];
58
+ ```
59
+
60
+ Публичный контракт: в `onChange` всегда приходит **отсортированный** массив
61
+ `[min, max]`. Внутри (во время drag) значения могут «переставляться» — это
62
+ состояние `innerValues` и наружу не видно.
63
+
64
+ ### `ISliderRangeMark`
65
+
66
+ ```ts
67
+ { value: number; label: ReactNode }
68
+ ```
69
+
70
+ `value` ∈ `[min, max]`.
71
+
72
+ ---
73
+
74
+ ## Ключевые особенности реализации
75
+
76
+ ### Class component
77
+
78
+ В отличие от `Slider` (FC) и `SliderExtended` (FC), `SliderRange` — **`React.Component`**.
79
+ Причина: хранение `innerValues` и логика `validateValues` / `componentDidUpdate`
80
+ со сравнением предыдущих props по `values.join("")`.
81
+
82
+ ### `innerValues` — внутреннее состояние
83
+
84
+ - При drag левый Dot может «перепрыгнуть» правый → во внутреннем состоянии
85
+ `innerValues[0] > innerValues[1]`, но в `onChange` наружу летит уже отсортированный массив.
86
+ - При получении новых `values` извне логика восстанавливает соответствие
87
+ (см. `componentDidUpdate`): если Dot'ы «поменялись», innerValues сохраняются
88
+ в правильном порядке для их Dot-экземпляров.
89
+
90
+ ### `validateValues`
91
+
92
+ Если `values[0] > values[1]` — компонент **автоматически** зовёт `onChange`
93
+ с отсортированным массивом. Конструктор и `componentDidUpdate` вызывают
94
+ валидацию на каждом rerender.
95
+
96
+ ### Жёсткая структура
97
+
98
+ ```tsx
99
+ <SliderExtended step={step} size={size} {...rest}>
100
+ <SliderExtended.Rail />
101
+ <SliderExtended.Dot key="1" value={innerValues[0]} onChange={...}>
102
+ {renderTooltipContent && <SliderExtended.Tooltip value={innerValues[0]}>...</SliderExtended.Tooltip>}
103
+ </SliderExtended.Dot>
104
+ <SliderExtended.Track draggable={draggableTrack} />
105
+ <SliderExtended.Dot key="2" value={innerValues[1]} onChange={...}>
106
+ {renderTooltipContent && <SliderExtended.Tooltip value={innerValues[1]}>...</SliderExtended.Tooltip>}
107
+ </SliderExtended.Dot>
108
+ <SliderExtended.Marks>
109
+ {marks.map(m => <SliderExtended.Mark key={m.value} value={m.value}>{m.label}</SliderExtended.Mark>)}
110
+ </SliderExtended.Marks>
111
+ </SliderExtended>
112
+ ```
113
+
114
+ ---
115
+
116
+ ## Инварианты
117
+
118
+ - **Два Dot, жёсткая структура** — менять только через SliderExtended.
119
+ - **`onChange` получает отсортированный `[a, b]`** — публичный контракт.
120
+ - **`marks: ISliderRangeMark[]`** — обязателен (может быть `[]`).
121
+ - **`step` default `1`**.
122
+ - **`size: MD | LG`** — `SM` не поддерживается.
123
+ - **`children: never`**.
124
+ - **`values`: оба ∈ `[min, max]`** — потребитель отвечает.
125
+ - **Если `step` — массив**, первое = `min`, последнее = `max`.
126
+ - **`SliderRange` — class component** (не FC, не forwardRef). Ref не пробрасывается.
127
+ - **`renderTooltipContent`** вызывается ДВАЖДЫ за рендер (по разу на Dot) — функция должна быть чистой.
128
+
129
+ ---
130
+
131
+ ## Accessibility
132
+
133
+ - Наследуется от `SliderExtended.Dot` — оба Dot имеют `role="slider"`,
134
+ `aria-valuemin/now/max`.
135
+ - `Track` (между Dot'ами) — `role="button"`, `tabIndex={2}` когда слайдер в фокусе:
136
+ можно двигать весь диапазон с клавиатуры.
137
+ - Keyboard: `ArrowLeft/Right/Up/Down` на focused Dot перемещают его на step;
138
+ на focused Track — двигают оба Dot'а.
139
+
140
+ ---
141
+
142
+ ## Связанные компоненты
143
+
144
+ - `Slider` — один Dot.
145
+ - `SliderExtended` — низкоуровневая основа.
146
+
147
+ ---
148
+
149
+ ## Stories
150
+
151
+ `stories/Slider/SliderRange.stories.tsx`
152
+ Примеры: `stories/Slider/examples/SliderRange/`
153
+
154
+ ---
155
+
156
+ ## История изменений
157
+
158
+ | Дата | Изменение |
159
+ |---|---|
160
+ | 2026-04-18 | Создан документ |
@@ -0,0 +1,101 @@
1
+ ---
2
+ component: SmallInput
3
+ category: Form Controls (internal)
4
+ figma-node: ""
5
+ figma-file: ""
6
+ related: [TextField]
7
+ tokens:
8
+ - --triplex-next-SmallInput-Background
9
+ - --triplex-next-SmallInput-Color
10
+ - --triplex-next-SmallInput-PlaceholderColor
11
+ - --triplex-next-SmallInput-Shadow
12
+ stories: ""
13
+ version: "1.0"
14
+ ---
15
+
16
+ # SmallInput
17
+
18
+ ## Назначение
19
+
20
+ Примитивное уменьшенное поле ввода (`<input type="text">`) без рамки, для
21
+ использования внутри составных компонентов шапки/панелей (исторически —
22
+ `HeaderPage`). Все props — стандартные `React.InputHTMLAttributes<HTMLInputElement>`
23
+ плюс `className`.
24
+
25
+ Используй когда: нужен компактный input внутри другого контейнера, где
26
+ полноценный `TextField` избыточен. В формах использовать `TextField` /
27
+ `TextareaField`.
28
+
29
+ Не используй когда: нужен valid/error-стейт, label, floating label, префиксы/
30
+ суффиксы — для этого есть `TextField`.
31
+
32
+ ---
33
+
34
+ ## Файловая структура
35
+
36
+ ```text
37
+ src/components/SmallInput/
38
+ ├── SmallInput.tsx # forwardRef<HTMLInputElement, ISmallInputProps>
39
+ ├── index.ts # Barrel
40
+ └── styles/SmallInput.module.less
41
+ ```
42
+
43
+ ---
44
+
45
+ ## Варианты и props
46
+
47
+ ### `ISmallInputProps`
48
+
49
+ ```ts
50
+ extends React.InputHTMLAttributes<HTMLInputElement>
51
+ ```
52
+
53
+ Нет собственных props — полностью прозрачная обёртка над `<input>`:
54
+
55
+ | Prop | Источник | Описание |
56
+ |---|---|---|
57
+ | `type` | — | **Всегда `"text"`** (хардкод, любой переданный игнорируется). |
58
+ | `className` | React | Мёржится с внутренним `styles.smallInput` через `clsx`. |
59
+ | `ref` | forwardRef | `HTMLInputElement`. |
60
+ | `...rest` | HTMLInputAttributes | Прокидываются как есть (`value`, `onChange`, `placeholder`, `disabled`, ...). |
61
+
62
+ ---
63
+
64
+ ## Инварианты
65
+
66
+ - **`forwardRef<HTMLInputElement>`** — не убирать; потребители зависят от ref.
67
+ - **`type="text"`** захардкожен — другие типы не поддерживаются.
68
+ - **Нет собственного state** — всегда управляемый через внешний `value`/`onChange`
69
+ (или стандартный uncontrolled через `defaultValue`).
70
+ - **Стили минимальны** — компонент рассчитан на вложение в контейнеры,
71
+ которые диктуют размер.
72
+
73
+ ---
74
+
75
+ ## Accessibility
76
+
77
+ - Стандартный `<input>`, наследует accessibility поведения браузера.
78
+ - Потребитель обязан обеспечить `aria-label` / `aria-labelledby`, если вход
79
+ используется без видимого `<label>` рядом.
80
+
81
+ ---
82
+
83
+ ## Связанные компоненты
84
+
85
+ - `TextField` — полноценный input с label/error/hint.
86
+ - `Header` / `HeaderPage` — исторические потребители SmallInput.
87
+
88
+ ---
89
+
90
+ ## Stories
91
+
92
+ Отдельных stories нет — компонент внутренний, демонстрируется через stories
93
+ потребителей (Header и т.п.).
94
+
95
+ ---
96
+
97
+ ## История изменений
98
+
99
+ | Дата | Изменение |
100
+ |---|---|
101
+ | 2026-04-18 | Создан документ |