@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,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 | Создан документ |
|