prime-ui-kit 0.2.5 → 0.3.1

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 (244) hide show
  1. package/README.md +161 -35
  2. package/dist/components/accordion/Accordion.d.ts +70 -0
  3. package/dist/components/accordion/Accordion.d.ts.map +1 -0
  4. package/dist/components/avatar/Avatar.d.ts +58 -0
  5. package/dist/components/avatar/Avatar.d.ts.map +1 -0
  6. package/dist/components/badge/Badge.d.ts +51 -0
  7. package/dist/components/badge/Badge.d.ts.map +1 -0
  8. package/dist/components/banner/Banner.d.ts +78 -0
  9. package/dist/components/banner/Banner.d.ts.map +1 -0
  10. package/dist/components/breadcrumb/Breadcrumb.d.ts +47 -0
  11. package/dist/components/breadcrumb/Breadcrumb.d.ts.map +1 -0
  12. package/dist/components/button/Button.d.ts +57 -0
  13. package/dist/components/button/Button.d.ts.map +1 -0
  14. package/dist/components/button-group/ButtonGroup.d.ts +34 -0
  15. package/dist/components/button-group/ButtonGroup.d.ts.map +1 -0
  16. package/dist/components/card/Card.d.ts +234 -0
  17. package/dist/components/card/Card.d.ts.map +1 -0
  18. package/dist/components/checkbox/Checkbox.d.ts +42 -0
  19. package/dist/components/checkbox/Checkbox.d.ts.map +1 -0
  20. package/dist/components/code-block/CodeBlock.d.ts +17 -0
  21. package/dist/components/code-block/CodeBlock.d.ts.map +1 -0
  22. package/dist/components/color-picker/ColorPicker.d.ts +76 -0
  23. package/dist/components/color-picker/ColorPicker.d.ts.map +1 -0
  24. package/dist/components/color-picker/ColorPickerRac.d.ts +76 -0
  25. package/dist/components/color-picker/ColorPickerRac.d.ts.map +1 -0
  26. package/dist/components/command-menu/CommandMenu.d.ts +74 -0
  27. package/dist/components/command-menu/CommandMenu.d.ts.map +1 -0
  28. package/dist/components/data-table/DataTable.d.ts +78 -0
  29. package/dist/components/data-table/DataTable.d.ts.map +1 -0
  30. package/dist/components/datepicker/Datepicker.d.ts +104 -0
  31. package/dist/components/datepicker/Datepicker.d.ts.map +1 -0
  32. package/dist/components/digit-input/DigitInput.d.ts +21 -0
  33. package/dist/components/digit-input/DigitInput.d.ts.map +1 -0
  34. package/dist/components/divider/Divider.d.ts +26 -0
  35. package/dist/components/divider/Divider.d.ts.map +1 -0
  36. package/dist/components/drawer/Drawer.d.ts +71 -0
  37. package/dist/components/drawer/Drawer.d.ts.map +1 -0
  38. package/dist/components/dropdown/Dropdown.d.ts +147 -0
  39. package/dist/components/dropdown/Dropdown.d.ts.map +1 -0
  40. package/dist/components/dropdown/dropdownGeometry.d.ts +10 -0
  41. package/dist/components/dropdown/dropdownGeometry.d.ts.map +1 -0
  42. package/dist/components/dropdown/menuKeyboard.d.ts +4 -0
  43. package/dist/components/dropdown/menuKeyboard.d.ts.map +1 -0
  44. package/dist/components/dropdown/useDropdownPosition.d.ts +18 -0
  45. package/dist/components/dropdown/useDropdownPosition.d.ts.map +1 -0
  46. package/dist/components/example-frame/ExampleFrame.d.ts +53 -0
  47. package/dist/components/example-frame/ExampleFrame.d.ts.map +1 -0
  48. package/dist/components/file-upload/FileUpload.d.ts +176 -0
  49. package/dist/components/file-upload/FileUpload.d.ts.map +1 -0
  50. package/dist/components/hint/Hint.d.ts +27 -0
  51. package/dist/components/hint/Hint.d.ts.map +1 -0
  52. package/dist/components/index.css +6101 -5759
  53. package/dist/components/index.css.map +4 -4
  54. package/dist/components/index.d.ts +95 -2679
  55. package/dist/components/index.d.ts.map +1 -0
  56. package/dist/components/index.js +8510 -7659
  57. package/dist/components/index.js.map +4 -4
  58. package/dist/components/input/Input.d.ts +73 -0
  59. package/dist/components/input/Input.d.ts.map +1 -0
  60. package/dist/components/kbd/Kbd.d.ts +15 -0
  61. package/dist/components/kbd/Kbd.d.ts.map +1 -0
  62. package/dist/components/label/Label.d.ts +29 -0
  63. package/dist/components/label/Label.d.ts.map +1 -0
  64. package/dist/components/link-button/LinkButton.d.ts +18 -0
  65. package/dist/components/link-button/LinkButton.d.ts.map +1 -0
  66. package/dist/components/modal/Modal.d.ts +58 -0
  67. package/dist/components/modal/Modal.d.ts.map +1 -0
  68. package/dist/components/notification/Notification.d.ts +42 -0
  69. package/dist/components/notification/Notification.d.ts.map +1 -0
  70. package/dist/components/notification/NotificationStore.d.ts +18 -0
  71. package/dist/components/notification/NotificationStore.d.ts.map +1 -0
  72. package/dist/components/page-content/PageContent.d.ts +51 -0
  73. package/dist/components/page-content/PageContent.d.ts.map +1 -0
  74. package/dist/components/pagination/Pagination.d.ts +19 -0
  75. package/dist/components/pagination/Pagination.d.ts.map +1 -0
  76. package/dist/components/popover/Popover.d.ts +48 -0
  77. package/dist/components/popover/Popover.d.ts.map +1 -0
  78. package/dist/components/popover/popoverGeometry.d.ts +6 -0
  79. package/dist/components/popover/popoverGeometry.d.ts.map +1 -0
  80. package/dist/components/popover/usePopoverPosition.d.ts +18 -0
  81. package/dist/components/popover/usePopoverPosition.d.ts.map +1 -0
  82. package/dist/components/progress-bar/ProgressBar.d.ts +14 -0
  83. package/dist/components/progress-bar/ProgressBar.d.ts.map +1 -0
  84. package/dist/components/progress-circle/ProgressCircle.d.ts +33 -0
  85. package/dist/components/progress-circle/ProgressCircle.d.ts.map +1 -0
  86. package/dist/components/radio/Radio.d.ts +40 -0
  87. package/dist/components/radio/Radio.d.ts.map +1 -0
  88. package/dist/components/scroll-container/ScrollContainer.d.ts +42 -0
  89. package/dist/components/scroll-container/ScrollContainer.d.ts.map +1 -0
  90. package/dist/components/segmented-control/SegmentedControl.d.ts +40 -0
  91. package/dist/components/segmented-control/SegmentedControl.d.ts.map +1 -0
  92. package/dist/components/segmented-progress-bar/SegmentedProgressBar.d.ts +22 -0
  93. package/dist/components/segmented-progress-bar/SegmentedProgressBar.d.ts.map +1 -0
  94. package/dist/components/select/Select.d.ts +84 -0
  95. package/dist/components/select/Select.d.ts.map +1 -0
  96. package/dist/components/select/selectListbox.d.ts +13 -0
  97. package/dist/components/select/selectListbox.d.ts.map +1 -0
  98. package/dist/components/slider/Slider.d.ts +23 -0
  99. package/dist/components/slider/Slider.d.ts.map +1 -0
  100. package/dist/components/stepper/HorizontalStepper.d.ts +41 -0
  101. package/dist/components/stepper/HorizontalStepper.d.ts.map +1 -0
  102. package/dist/components/stepper/Stepper.d.ts +77 -0
  103. package/dist/components/stepper/Stepper.d.ts.map +1 -0
  104. package/dist/components/stepper/VerticalStepper.d.ts +41 -0
  105. package/dist/components/stepper/VerticalStepper.d.ts.map +1 -0
  106. package/dist/components/stepper/stepperAlignContext.d.ts +11 -0
  107. package/dist/components/stepper/stepperAlignContext.d.ts.map +1 -0
  108. package/dist/components/switch/Switch.d.ts +48 -0
  109. package/dist/components/switch/Switch.d.ts.map +1 -0
  110. package/dist/components/tabs/Tabs.d.ts +69 -0
  111. package/dist/components/tabs/Tabs.d.ts.map +1 -0
  112. package/dist/components/tag/Tag.d.ts +29 -0
  113. package/dist/components/tag/Tag.d.ts.map +1 -0
  114. package/dist/components/textarea/Textarea.d.ts +43 -0
  115. package/dist/components/textarea/Textarea.d.ts.map +1 -0
  116. package/dist/components/tooltip/Tooltip.d.ts +47 -0
  117. package/dist/components/tooltip/Tooltip.d.ts.map +1 -0
  118. package/dist/components/typography/Typography.d.ts +30 -0
  119. package/dist/components/typography/Typography.d.ts.map +1 -0
  120. package/dist/hooks/useControllableState.d.ts +8 -0
  121. package/dist/hooks/useControllableState.d.ts.map +1 -0
  122. package/dist/hooks/useEscapeKey.d.ts +7 -0
  123. package/dist/hooks/useEscapeKey.d.ts.map +1 -0
  124. package/dist/hooks/useFieldIds.d.ts +17 -0
  125. package/dist/hooks/useFieldIds.d.ts.map +1 -0
  126. package/dist/hooks/useFocusTrap.d.ts +16 -0
  127. package/dist/hooks/useFocusTrap.d.ts.map +1 -0
  128. package/dist/hooks/useMergedRefs.d.ts +3 -0
  129. package/dist/hooks/useMergedRefs.d.ts.map +1 -0
  130. package/dist/hooks/useOutsideClick.d.ts +16 -0
  131. package/dist/hooks/useOutsideClick.d.ts.map +1 -0
  132. package/dist/hooks/useOverlayModal.d.ts +7 -0
  133. package/dist/hooks/useOverlayModal.d.ts.map +1 -0
  134. package/dist/hooks/usePosition.d.ts +41 -0
  135. package/dist/hooks/usePosition.d.ts.map +1 -0
  136. package/dist/hooks/useResponsiveMonths.d.ts +18 -0
  137. package/dist/hooks/useResponsiveMonths.d.ts.map +1 -0
  138. package/dist/hooks/useScrollLock.d.ts +8 -0
  139. package/dist/hooks/useScrollLock.d.ts.map +1 -0
  140. package/dist/icons/Icon.d.ts +13 -0
  141. package/dist/icons/Icon.d.ts.map +1 -0
  142. package/dist/icons/index.d.ts +40 -0
  143. package/dist/icons/index.d.ts.map +1 -0
  144. package/dist/index.css +6101 -5759
  145. package/dist/index.css.map +4 -4
  146. package/dist/index.d.ts +4 -8
  147. package/dist/index.d.ts.map +1 -0
  148. package/dist/index.js +8509 -7660
  149. package/dist/index.js.map +4 -4
  150. package/dist/internal/ControlSizeContext.d.ts +17 -0
  151. package/dist/internal/ControlSizeContext.d.ts.map +1 -0
  152. package/dist/internal/DividerContentContext.d.ts +4 -0
  153. package/dist/internal/DividerContentContext.d.ts.map +1 -0
  154. package/dist/internal/OverlayPortalLayerContext.d.ts +13 -0
  155. package/dist/internal/OverlayPortalLayerContext.d.ts.map +1 -0
  156. package/dist/internal/Portal.d.ts +8 -0
  157. package/dist/internal/Portal.d.ts.map +1 -0
  158. package/dist/internal/context.d.ts +11 -0
  159. package/dist/internal/context.d.ts.map +1 -0
  160. package/dist/internal/cx.d.ts +2 -0
  161. package/dist/internal/cx.d.ts.map +1 -0
  162. package/dist/internal/data-attributes.d.ts +6 -0
  163. package/dist/internal/data-attributes.d.ts.map +1 -0
  164. package/dist/internal/highlightTsxHtml.d.ts +3 -0
  165. package/dist/internal/highlightTsxHtml.d.ts.map +1 -0
  166. package/dist/internal/layoutPxFromPrimitives.d.ts +13 -0
  167. package/dist/internal/layoutPxFromPrimitives.d.ts.map +1 -0
  168. package/dist/internal/mergeRefs.d.ts +4 -0
  169. package/dist/internal/mergeRefs.d.ts.map +1 -0
  170. package/dist/internal/runtimeUnits.d.ts +3 -0
  171. package/dist/internal/runtimeUnits.d.ts.map +1 -0
  172. package/dist/internal/scrollAncestors.d.ts +3 -0
  173. package/dist/internal/scrollAncestors.d.ts.map +1 -0
  174. package/dist/internal/slot.d.ts +19 -0
  175. package/dist/internal/slot.d.ts.map +1 -0
  176. package/dist/internal/states.d.ts +87 -0
  177. package/dist/internal/states.d.ts.map +1 -0
  178. package/dist/layout/app-shell/AppShell.d.ts +54 -0
  179. package/dist/layout/app-shell/AppShell.d.ts.map +1 -0
  180. package/dist/layout/index.d.ts +7 -0
  181. package/dist/layout/index.d.ts.map +1 -0
  182. package/dist/layout/sidebar/Sidebar.d.ts +241 -0
  183. package/dist/layout/sidebar/Sidebar.d.ts.map +1 -0
  184. package/dist/layout/sidebar/SidebarRoot.d.ts +51 -0
  185. package/dist/layout/sidebar/SidebarRoot.d.ts.map +1 -0
  186. package/dist/layout/sidebar/sidebar-context.d.ts +19 -0
  187. package/dist/layout/sidebar/sidebar-context.d.ts.map +1 -0
  188. package/dist/layout/sidebar/sidebarLayout.d.ts +12 -0
  189. package/dist/layout/sidebar/sidebarLayout.d.ts.map +1 -0
  190. package/dist/tokens/primitives.d.ts +390 -0
  191. package/dist/tokens/primitives.d.ts.map +1 -0
  192. package/dist/tokens/semantic.d.ts +732 -0
  193. package/dist/tokens/semantic.d.ts.map +1 -0
  194. package/dist/tokens/themes/dark.d.ts +143 -0
  195. package/dist/tokens/themes/dark.d.ts.map +1 -0
  196. package/dist/tokens/themes/light.d.ts +16 -0
  197. package/dist/tokens/themes/light.d.ts.map +1 -0
  198. package/package.json +9 -4
  199. package/src/components/accordion/COMPONENT.md +137 -0
  200. package/src/components/avatar/COMPONENT.md +100 -0
  201. package/src/components/badge/COMPONENT.md +78 -0
  202. package/src/components/banner/COMPONENT.md +118 -0
  203. package/src/components/breadcrumb/COMPONENT.md +94 -0
  204. package/src/components/button/COMPONENT.md +80 -0
  205. package/src/components/button-group/COMPONENT.md +83 -0
  206. package/src/components/card/COMPONENT.md +489 -0
  207. package/src/components/checkbox/COMPONENT.md +98 -0
  208. package/src/components/code-block/COMPONENT.md +58 -0
  209. package/src/components/color-picker/COMPONENT.md +149 -0
  210. package/src/components/command-menu/COMPONENT.md +167 -0
  211. package/src/components/data-table/COMPONENT.md +113 -0
  212. package/src/components/datepicker/COMPONENT.md +137 -0
  213. package/src/components/digit-input/COMPONENT.md +68 -0
  214. package/src/components/divider/COMPONENT.md +70 -0
  215. package/src/components/drawer/COMPONENT.md +149 -0
  216. package/src/components/dropdown/COMPONENT.md +192 -0
  217. package/src/components/file-upload/COMPONENT.md +200 -0
  218. package/src/components/hint/COMPONENT.md +67 -0
  219. package/src/components/input/COMPONENT.md +119 -0
  220. package/src/components/kbd/COMPONENT.md +59 -0
  221. package/src/components/label/COMPONENT.md +94 -0
  222. package/src/components/link-button/COMPONENT.md +60 -0
  223. package/src/components/modal/COMPONENT.md +105 -0
  224. package/src/components/notification/COMPONENT.md +120 -0
  225. package/src/components/pagination/COMPONENT.md +61 -0
  226. package/src/components/popover/COMPONENT.md +93 -0
  227. package/src/components/progress-bar/COMPONENT.md +59 -0
  228. package/src/components/progress-circle/COMPONENT.md +63 -0
  229. package/src/components/radio/COMPONENT.md +95 -0
  230. package/src/components/segmented-control/COMPONENT.md +86 -0
  231. package/src/components/segmented-progress-bar/COMPONENT.md +75 -0
  232. package/src/components/select/COMPONENT.md +175 -0
  233. package/src/components/slider/COMPONENT.md +62 -0
  234. package/src/components/stepper/COMPONENT.md +186 -0
  235. package/src/components/switch/COMPONENT.md +98 -0
  236. package/src/components/tabs/COMPONENT.md +114 -0
  237. package/src/components/tag/COMPONENT.md +67 -0
  238. package/src/components/textarea/COMPONENT.md +98 -0
  239. package/src/components/tooltip/COMPONENT.md +87 -0
  240. package/src/components/typography/COMPONENT.md +89 -0
  241. package/src/styles/theme-dark.css +43 -0
  242. package/src/styles/theme-light.css +43 -0
  243. package/src/styles/tokens.css +23 -4
  244. package/src/styles/tokens.test.ts +0 -27
@@ -0,0 +1,86 @@
1
+ # SegmentedControl
2
+
3
+ **Проектирование по умолчанию:** при проектировании экранов и примеров изначально выбирай **`m`** для `size` (где есть ось размера), если явно не оговорено иное.
4
+
5
+ ## About
6
+
7
+ A single-choice control: a horizontal `radiogroup` whose options are segment buttons, with a floating pill indicator under the active segment.
8
+
9
+ - **Use** when there are few mutually exclusive options that should stay visible (period toggles, layout mode, compact filters).
10
+ - **Use** with **`SegmentedControl.Icon`** plus visible or visually hidden text when a segment is icon-led.
11
+ - **Do not use** for long lists or many options—prefer [Select](../select/COMPONENT.md) or a dropdown.
12
+ - **Do not use** when each choice should show its own panel and tab keyboard model—prefer [Tabs](../tabs/COMPONENT.md).
13
+ - **Do not use** for independent or multi-select actions—prefer [Button group](../button-group/COMPONENT.md) or other patterns.
14
+ - **Do not use** expecting a vertical stack or orientation prop; layout is horizontal only.
15
+
16
+ ## Composition
17
+
18
+ - **`SegmentedControl.Root`** — outer `div` with **`role="radiogroup"`**, **`data-size`**, focus and arrow-key handling, **`ControlSizeProvider`** for descendants, and a decorative indicator layer (`aria-hidden`).
19
+ - **`SegmentedControl.Item`** — direct children of **`Root`** (and only in that role for correct behavior). Each item is a **`button`** with **`role="radio"`**; order in the tree is the visual order of segments.
20
+ - **`SegmentedControl.Icon`** — optional **`span`** with **`aria-hidden="true"`** inside an **`Item`**; pair with visible label text or an accessible name in **`Item`** **`children`**.
21
+
22
+ ### Minimal example
23
+
24
+ ```tsx
25
+ import { SegmentedControl } from "prime-ui-kit";
26
+
27
+ export function Example() {
28
+ return (
29
+ <SegmentedControl.Root defaultValue="a">
30
+ <SegmentedControl.Item value="a">A</SegmentedControl.Item>
31
+ <SegmentedControl.Item value="b">B</SegmentedControl.Item>
32
+ </SegmentedControl.Root>
33
+ );
34
+ }
35
+ ```
36
+
37
+ ## Rules
38
+
39
+ - **Controlled:** pass **`value`** and handle changes with **`onValueChange`**. **Uncontrolled:** use **`defaultValue`** (defaults to **`""`**).
40
+ - **`defaultValue=""`** (and no controlled **`value`**) means **no** segment is selected; **`Root`** gets **`tabIndex={0}`** so the group can be focused until a segment is chosen.
41
+ - Values are **strings**; mapping to app enums or unions is the consumer’s responsibility.
42
+ - **`disabled`** on **`Root`** sets **`aria-disabled`** on the group and **`data-disabled`**; all segments are inactive.
43
+ - **`disabled`** on an **`Item`** skips that segment for **Left/Right** arrow navigation among enabled radios.
44
+ - **Roving tabindex:** **Tab** focuses the group (when nothing is selected) or the checked segment; **ArrowLeft** / **ArrowRight** move selection and focus across enabled items.
45
+ - **`SegmentedControl.Icon`** is **`aria-hidden`**; the segment’s accessible name must come from **`Item`** **`children`** (visible text and/or visually hidden text). **`Item`** does not forward extra attributes—there is no **`…rest`**—so you cannot set **`aria-label`** on the segment via props.
46
+ - **No `asChild`** and no merging **`Root`** with an arbitrary element.
47
+ - **`Root`** does **not** forward arbitrary HTML attributes (**`aria-label`**, **`style`**, etc.); wrap **`Root`** in another element when you need extra semantics or layout hooks.
48
+ - The indicator position follows the active segment’s layout; updates use **`ResizeObserver`** and **`MutationObserver`** on the root—avoid unpredictable segment size changes without expecting a reflow/recalc.
49
+
50
+ ## API
51
+
52
+ ### SegmentedControl.Root
53
+
54
+ | Prop | Type | Default | Required | Description |
55
+ |------|------|---------|----------|-------------|
56
+ | value | `string` | — | No | Selected value in controlled mode |
57
+ | defaultValue | `string` | `""` | No | Initial value when uncontrolled; empty string means no segment selected |
58
+ | onValueChange | `(value: string) => void` | — | No | Called when the selected value changes |
59
+ | disabled | `boolean` | `false` | No | Disables the entire group |
60
+ | size | `"s" \| "m" \| "l" \| "xl"` | `"m"` | No | Segment dimensions and typography |
61
+ | children | `React.ReactNode` | — | Yes | `Item` nodes (and their content) |
62
+ | className | `string` | — | No | Extra class on the container |
63
+
64
+ ### SegmentedControl.Item
65
+
66
+ | Prop | Type | Default | Required | Description |
67
+ |------|------|---------|----------|-------------|
68
+ | value | `string` | — | Yes | Segment identifier |
69
+ | disabled | `boolean` | `false` | No | Disables this segment |
70
+ | children | `React.ReactNode` | — | Yes | Label and/or `SegmentedControl.Icon` |
71
+ | className | `string` | — | No | Extra class on the button |
72
+
73
+ ### SegmentedControl.Icon
74
+
75
+ | Prop | Type | Default | Required | Description |
76
+ |------|------|---------|----------|-------------|
77
+ | children | `React.ReactNode` | — | Yes | Icon node |
78
+ | className | `string` | — | No | Extra class on the `span` |
79
+ | …rest | `Omit<React.HTMLAttributes<HTMLSpanElement>, "children">` | — | No | Other `span` attributes |
80
+
81
+ ## Related
82
+
83
+ - [Tabs](../tabs/COMPONENT.md) — separate panels and tab keyboard model.
84
+ - [Button group](../button-group/COMPONENT.md) — grouped actions, not a single required choice.
85
+ - [Radio](../radio/COMPONENT.md) — standalone radio field primitive.
86
+ - [Select](../select/COMPONENT.md) — many options or list in a dropdown.
@@ -0,0 +1,75 @@
1
+ # SegmentedProgressBar
2
+
3
+ **Проектирование по умолчанию:** при проектировании экранов и примеров изначально выбирай **`m`** для `size` (где есть ось размера), если явно не оговорено иное.
4
+
5
+ ## About
6
+
7
+ A horizontal **stacked** bar: one segment per category, with widths proportional to each segment’s **`value`** (weight). Use semantic **`tone`** colors for status (success, warning, danger, etc.) and optional labels for tooltips and assistive-tech descriptions.
8
+
9
+ - **Use** for part-to-whole breakdowns—e.g. job outcomes (errors / pending / success), survey responses, or storage by type.
10
+ - **Use** with **`segmentGap="none"`** (default) for a continuous bar; use **`segmentGap="hairline"`** when segments should read as distinct columns with a 1px separator.
11
+ - **Use** with **`label`** when the bar needs a visible title; the **distribution** string is still exposed to screen readers via **`aria-describedby`**.
12
+ - **Do not use** for a single continuous fraction of one task—use [ProgressBar](../progress-bar/COMPONENT.md) (native `<progress>`).
13
+ - **Do not use** for interactive selection—use [SegmentedControl](../segmented-control/COMPONENT.md).
14
+ - **Do not use** for discrete steps—use [Stepper](../stepper/COMPONENT.md).
15
+
16
+ ## Composition
17
+
18
+ - **`SegmentedProgressBar`** is a single-part namespace: only **`SegmentedProgressBar.Root`** is public.
19
+ - **`SegmentedProgressBar.Root`** renders a wrapper `div` with `data-size` and `data-segment-gap`, an optional **`label`**, a visually hidden **`<span>`** with the distribution text when **`label`** is set, and a **`role="group"`** track containing one **`div`** per segment.
20
+
21
+ ### Minimal example
22
+
23
+ ```tsx
24
+ import { SegmentedProgressBar } from "prime-ui-kit";
25
+
26
+ export function Example() {
27
+ return (
28
+ <SegmentedProgressBar.Root
29
+ segments={[
30
+ { value: 30, label: "Errors", tone: "danger" },
31
+ { value: 25, label: "Pending", tone: "warning" },
32
+ { value: 35, label: "Success", tone: "success" },
33
+ { value: 10, label: "Other", tone: "neutral" },
34
+ ]}
35
+ />
36
+ );
37
+ }
38
+ ```
39
+
40
+ ## Rules
41
+
42
+ - **Weights** are **non-negative**; each **`value`** is clamped to **`≥ 0`**. Invalid numbers are treated as **`0`**.
43
+ - **Segment sizes** follow **`value[i] / sum(values)`** via **`flex-grow`** on the track (not `%` width), so layout stays correct in shrink-to-fit parents (e.g. playground `stack` preview). If the sum is **`0`**, the track is empty (track background only).
44
+ - **Percentages** in the accessibility description are **rounded** to whole numbers.
45
+ - **`segmentGap`** defaults to **`none`** (no gap between fills). **`hairline`** задаёт **`gap: 1px`** на треке; фон трека — **`--prime-sys-color-border-subtle`**, сегменты лежат поверх (видна «линия» между заливками). При **`none`** фон трека — **`surface-accentSoft`**.
46
+ - **`tone`** defaults to **`primary`** when omitted; allowed values: **`primary`**, **`success`**, **`warning`**, **`danger`**, **`neutral`**.
47
+ - **`label`** on each segment is passed to **`title`** on the segment for tooltips; it also appears in the **distribution** string for assistive tech when provided.
48
+ - The bar is **not** a single native **`progressbar`**; the track is **`role="group"`** with **`aria-label`** (no visible label) or **`aria-labelledby`** + **`aria-describedby`** (with label).
49
+
50
+ ## API
51
+
52
+ ### SegmentedProgressBar.Root
53
+
54
+ | Prop | Type | Default | Required | Description |
55
+ |------|------|---------|----------|-------------|
56
+ | `segments` | `SegmentedProgressSegment[]` | — | Yes | Non-negative weights; layout is proportional to the sum. |
57
+ | `label` | `string` | — | No | Text above the track; when set, the group uses **`aria-labelledby`** and **`aria-describedby`**. |
58
+ | `size` | `"s" \| "m" \| "l" \| "xl"` | `"m"` | No | Track height and label typography (same scale as ProgressBar). |
59
+ | `segmentGap` | `"none" \| "hairline"` | `"none"` | No | Gap between segment fills. |
60
+ | `className` | `string` | — | No | Class on the outer wrapper. |
61
+ | `ref` | `React.Ref<HTMLDivElement>` | — | No | Ref to the **`role="group"`** track element. |
62
+
63
+ ### SegmentedProgressSegment
64
+
65
+ | Field | Type | Required | Description |
66
+ |-------|------|----------|-------------|
67
+ | `value` | `number` | Yes | Weight **`≥ 0`**; contributes to proportion. |
68
+ | `label` | `string` | No | Tooltip and assistive-tech segment label. |
69
+ | `tone` | `"primary" \| "success" \| "warning" \| "danger" \| "neutral"` | No | Default **`primary`**. |
70
+
71
+ ## Related
72
+
73
+ - [ProgressBar](../progress-bar/COMPONENT.md) — single determinate progress on `<progress>`.
74
+ - [ProgressCircle](../progress-circle/COMPONENT.md) — circular fraction.
75
+ - [Typography](../typography/COMPONENT.md) — headings and legends beside the bar.
@@ -0,0 +1,175 @@
1
+ # Select
2
+
3
+ **Проектирование по умолчанию:** при проектировании экранов и примеров изначально выбирай **`m`** для `size` (где есть ось размера), если явно не оговорено иное.
4
+
5
+ ## About
6
+
7
+ A single-select field: by default (**`native`** `false`) it is a combobox — a trigger shows the current choice or a placeholder, and a portaled listbox lets the user pick one string value from predefined options. With **`native`** `true`, **`Select.Root`** renders a native **`<select>`** with **`<option>`** / **`<optgroup>`** built from the same **`Select.Item`** (and optional **`Select.Group`**) tree.
8
+
9
+ - **Use** for forms, settings, and filters where exactly one option must be chosen from a closed set (role, country, theme, interval, and similar fields).
10
+ - **Use** when a compact trigger label is enough and the full list should open on demand with keyboard support.
11
+ - **Use** optional `Select.Group`, `Select.GroupLabel`, and `Select.Separator` to structure long option lists.
12
+ - **Do not use** for multi-select, inline search, or async loading of options; this primitive is single-choice only with static item children.
13
+ - **Do not use** when the user must type arbitrary text; use an input-style control instead.
14
+ - **Do not use** for command or action menus; use [Dropdown](../dropdown/COMPONENT.md) when choices are actions, not a single form value.
15
+
16
+ ## Composition
17
+
18
+ - **`Select.Root`** — owns value (controlled or uncontrolled), `size`, `hasError`, `disabled`, **`placeholder`**, and **`native`**. When **`native`** is `false`, it also owns open state and highlight. Wrap everything else.
19
+ - **`Select.Trigger`** — (non-**`native`** only) the combobox `button` (fixed chevron on the right). Put **`Select.Value`** inside; optionally **`Select.TriggerIcon`** before **`Select.Value`**.
20
+ - **`Select.Value`** — (non-**`native`** only) displays the selected item label, otherwise falls back to the raw value or **`placeholder`** (hint styling when empty).
21
+ - **`Select.Content`** — when **`native`** is `false`: portaled **`role="listbox"`**; rendered in the tree always but hidden when closed. Place **`Select.Item`** rows (and optional groups/separators) inside. Must come after the trigger in the document for a predictable structure. When **`native`** is `true`, **`Select.Content`** is optional as a structural wrapper; only **`Select.Item`** (and groups) contribute to the DOM **`<select>`**.
22
+ - **`Select.Item`** — one option per row; optional **`Select.ItemIcon`** children are recognized by component type and rendered before the text. Use **`label`** when the trigger should show different text than the row content.
23
+ - **`Select.Group`** / **`Select.GroupLabel`** / **`Select.Separator`** — optional structure inside **`Select.Content`**.
24
+
25
+ ### Minimal example
26
+
27
+ ```tsx
28
+ import { Select } from "prime-ui-kit";
29
+
30
+ export function Example() {
31
+ return (
32
+ <Select.Root size="m" placeholder="Choose">
33
+ <Select.Trigger>
34
+ <Select.Value />
35
+ </Select.Trigger>
36
+ <Select.Content>
37
+ <Select.Item value="a">Option A</Select.Item>
38
+ <Select.Item value="b">Option B</Select.Item>
39
+ </Select.Content>
40
+ </Select.Root>
41
+ );
42
+ }
43
+ ```
44
+
45
+ ### Native `<select>` (`native`)
46
+
47
+ ```tsx
48
+ import { Select } from "prime-ui-kit";
49
+
50
+ export function NativeExample() {
51
+ return (
52
+ <Select.Root native size="m" placeholder="Choose">
53
+ <Select.Item value="a">Option A</Select.Item>
54
+ <Select.Item value="b">Option B</Select.Item>
55
+ </Select.Root>
56
+ );
57
+ }
58
+ ```
59
+
60
+ You can wrap items in **`Select.Content`** for parity with the composable tree; behavior is the same.
61
+
62
+ ## Rules
63
+
64
+ - **`native`** — default **`false`**. **`true`**: one **`<select>`** with kit styling; **`Select.Trigger`**, **`Select.Value`**, **`Select.Content`** portal, and listbox keyboard behavior are not used (the platform handles the dropdown). Options are collected by walking **`children`** for **`Select.Item`** (and **`Select.Group`** / **`Select.GroupLabel`** → **`<optgroup>`**; **`Select.Separator`** is skipped). **`placeholder`** adds a first **`<option value="">`**; do not use **`value=""`** on an **`Select.Item`** if you rely on that placeholder. **`Select.ItemIcon`** / **`Select.TriggerIcon`** are not represented in the native control.
65
+ - **Controlled:** set **`value`** and **`onChange`** together. **Uncontrolled:** use **`defaultValue`** (or neither for an empty initial value). Values are always **`string`**; map numbers or enums to strings yourself.
66
+ - **`onChange`** runs only when the value changes to a defined string (same contract as internal controllable state).
67
+ - **`disabled`** on **`Select.Root`** prevents opening the list and selecting; the trigger is inactive.
68
+ - **`disabled`** on **`Select.Item`** skips that option for pointer selection and for arrow-key navigation among enabled options only.
69
+ - **`hasError`** on **`Select.Root`** applies error styling to the trigger; there is no separate **`variant`** prop.
70
+ - **`Select.Content`** uses **`Portal`**, which attaches after the first client layout effect; until option nodes mount, **`selectedLabel`** may be unset and **`Select.Value`** can briefly show the raw **`value`** instead of an item’s **`label`**—effects on **`Select.Item`** then call **`onInitLabel`** to align the trigger text.
71
+ - **`Select.Content`** is portaled; on open the listbox receives focus, **`useOutsideClick`** and **Escape** close it. Arrow **Up**/**Down**, **Home**/**End** move highlight; **Enter** or **Space** selects the highlighted enabled item; **Escape** closes from the listbox handler as well.
72
+ - **`Select.Trigger`** is **`role="combobox"`** with **`aria-expanded`**, **`aria-haspopup="listbox"`**, and **`aria-controls`** pointing at the listbox **`id`**. Items expose **`role="option"`**, **`aria-selected`**, and **`aria-disabled`** when disabled.
73
+ - If there is no visible text label on the trigger, set **`aria-label`** on **`Select.Trigger`**. For an external [Label](../label/COMPONENT.md), give the label a stable **`id`** and set **`aria-labelledby`** on **`Select.Trigger`** to that **`id`** (the trigger’s **`id`** is generated inside the component).
74
+ - List position (e.g. flipping above/below) is resolved internally from viewport space; there are no public **`side`** / **`align`** props on **`Select.Content`**.
75
+
76
+ ## API
77
+
78
+ ### Select.Root
79
+
80
+ | Prop | Type | Default | Required | Description |
81
+ |------|------|---------|----------|-------------|
82
+ | size | `"s" \| "m" \| "l" \| "xl"` | `"m"` | No | Trigger and list sizing tokens |
83
+ | value | `string` | — | No | Controlled selected value |
84
+ | defaultValue | `string` | — | No | Initial value when uncontrolled |
85
+ | onChange | `(value: string) => void` | — | No | Fires after a new value is selected |
86
+ | disabled | `boolean` | — | No | Disables the trigger and selection |
87
+ | placeholder | `string` | — | No | Shown in the trigger when no value is selected |
88
+ | hasError | `boolean` | `false` | No | Error styling on the trigger |
89
+ | native | `boolean` | `false` | No | **`true`**: native **`<select>`**; **`false`**: combobox + portaled listbox |
90
+ | children | `React.ReactNode` | — | Yes | Typically **`Select.Trigger`** and **`Select.Content`** (non-**`native`**); **`Select.Item`** tree (**`native`**) |
91
+
92
+ ### Select.Trigger
93
+
94
+ `forwardRef` to the underlying **`button`**. Props omit **`id`**, **`type`**, and **`role`** (set by the implementation).
95
+
96
+ | Prop | Type | Default | Required | Description |
97
+ |------|------|---------|----------|-------------|
98
+ | children | `React.ReactNode` | — | No | Usually **`Select.Value`** and optionally **`Select.TriggerIcon`** |
99
+ | className | `string` | — | No | Additional class on the button |
100
+ | disabled | `boolean` | — | No | Native disabled; final state also respects **`Select.Root`** **`disabled`** |
101
+ | ref | `React.Ref<HTMLButtonElement>` | — | No | Ref to the button element |
102
+ | …rest | `Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, "id" \| "type" \| "role">` | — | No | e.g. **`aria-label`**, **`aria-labelledby`**, event handlers |
103
+
104
+ ### Select.Value
105
+
106
+ | Prop | Type | Default | Required | Description |
107
+ |------|------|---------|----------|-------------|
108
+ | className | `string` | — | No | Class on the value / placeholder span |
109
+
110
+ ### Select.TriggerIcon
111
+
112
+ | Prop | Type | Default | Required | Description |
113
+ |------|------|---------|----------|-------------|
114
+ | children | `React.ReactNode` | — | No | Icon or other content to the left of the value |
115
+ | className | `string` | — | No | Wrapper class |
116
+ | …rest | `React.HTMLAttributes<HTMLSpanElement>` | — | No | Other **`span`** attributes |
117
+
118
+ ### Select.Content
119
+
120
+ | Prop | Type | Default | Required | Description |
121
+ |------|------|---------|----------|-------------|
122
+ | className | `string` | — | No | Class on the portaled listbox container |
123
+ | children | `React.ReactNode` | — | Yes | Items, groups, and separators |
124
+
125
+ ### Select.Item
126
+
127
+ `forwardRef` to the option root **`div`**.
128
+
129
+ | Prop | Type | Default | Required | Description |
130
+ |------|------|---------|----------|-------------|
131
+ | value | `string` | — | Yes | Submitted / controlled string value |
132
+ | label | `string` | — | No | Text shown in the trigger; otherwise derived from non-icon children or **`value`** |
133
+ | disabled | `boolean` | — | No | Option not selectable |
134
+ | className | `string` | — | No | Class on the option row |
135
+ | children | `React.ReactNode` | — | Yes | Label content and optional **`Select.ItemIcon`** |
136
+ | ref | `React.Ref<HTMLDivElement>` | — | No | Ref on the option root |
137
+
138
+ ### Select.ItemIcon
139
+
140
+ | Prop | Type | Default | Required | Description |
141
+ |------|------|---------|----------|-------------|
142
+ | children | `React.ReactNode` | — | No | Icon before the item text |
143
+ | className | `string` | — | No | Wrapper class |
144
+ | …rest | `React.HTMLAttributes<HTMLSpanElement>` | — | No | Other **`span`** attributes |
145
+
146
+ ### Select.Group
147
+
148
+ | Prop | Type | Default | Required | Description |
149
+ |------|------|---------|----------|-------------|
150
+ | className | `string` | — | No | Class on the **`role="group"`** container |
151
+ | children | `React.ReactNode` | — | No | Group label and items |
152
+ | …rest | `React.HTMLAttributes<HTMLDivElement>` | — | No | Other **`div`** attributes |
153
+
154
+ ### Select.GroupLabel
155
+
156
+ | Prop | Type | Default | Required | Description |
157
+ |------|------|---------|----------|-------------|
158
+ | className | `string` | — | No | Class on the label |
159
+ | children | `React.ReactNode` | — | No | Group heading text |
160
+ | …rest | `React.HTMLAttributes<HTMLDivElement>` | — | No | Other **`div`** attributes |
161
+
162
+ ### Select.Separator
163
+
164
+ | Prop | Type | Default | Required | Description |
165
+ |------|------|---------|----------|-------------|
166
+ | className | `string` | — | No | Class on the **`hr`** |
167
+ | …rest | `React.HTMLAttributes<HTMLHRElement>` | — | No | Other **`hr`** attributes |
168
+
169
+ ## Related
170
+
171
+ - [Label](../label/COMPONENT.md) — visible field label; pair with **`aria-labelledby`** on **`Select.Trigger`** when needed.
172
+ - [Hint](../hint/COMPONENT.md) — helper or error text below the field.
173
+ - [Input](../input/COMPONENT.md) — free-form text when a fixed list is not appropriate.
174
+ - [Dropdown](../dropdown/COMPONENT.md) — action menus, not single form values.
175
+ - [Modal](../modal/COMPONENT.md) / [Drawer](../drawer/COMPONENT.md) — nested focus and stacking when the select sits inside overlays.
@@ -0,0 +1,62 @@
1
+ # Slider
2
+
3
+ **Проектирование по умолчанию:** при проектировании экранов и примеров изначально выбирай **`m`** для `size` (где есть ось размера), если явно не оговорено иное.
4
+
5
+ ## About
6
+
7
+ Horizontal range control built on the native `input type="range"`, with optional text label and kit sizing (`s`–`xl`).
8
+
9
+ - **Use** when the user should pick a number along a continuous or stepped interval (volume, brightness, percentages, temperature bands) and dragging the track is appropriate.
10
+ - **Use** when native range keyboard and pointer behavior is sufficient and you want minimal custom logic.
11
+ - **Do not use** for vertical sliders; the implementation is horizontal only.
12
+ - **Do not use** when you need a value thumb label, icons, or other slots on the track—compose with surrounding layout and text.
13
+ - **Do not use** expecting built-in error, required, loading, or read-only modes; handle those with form primitives and hints around the control.
14
+ - **Do not use** when a small set of fixed choices fits radio or segmented controls better than a continuous range.
15
+
16
+ ## Composition
17
+
18
+ - **`Slider`** is a single-part API: **`Slider.Root`** wraps **`ControlSizeProvider`**, an optional **`label`** (`label` + `htmlFor` linked to the input), and one **`input type="range"`** styled as the track.
19
+ - The root `div` carries **`data-size`** from **`size`**; there are no other exported subcomponents.
20
+
21
+ ### Minimal example
22
+
23
+ ```tsx
24
+ import { Slider } from "prime-ui-kit";
25
+
26
+ export function Example() {
27
+ return <Slider.Root />;
28
+ }
29
+ ```
30
+
31
+ ## Rules
32
+
33
+ - **Controlled:** pass **`value`** and **`onChange`**; **uncontrolled:** pass **`defaultValue`** (or omit both value props—effective initial value is **`min`**, clamped to **`[min, max]`**).
34
+ - **`min`**, **`max`**, and **`step`** default to **`0`**, **`100`**, and **`1`**; fractional **`step`** values are allowed.
35
+ - Displayed value is **clamped** to **`[min, max]`**; if the browser emits a non-numeric value, the update is ignored.
36
+ - With **`label`**, the visible label is associated with the input via **`id`** / **`htmlFor`**. Without **`label`**, set **`aria-label`** (or an external accessible name), or assistive technologies may not get a proper name.
37
+ - **`disabled`** sets the native **`disabled`** state on the range input.
38
+ - There is no **`asChild`** or portal behavior; focus and **`focus-visible`** styling follow the native control and theme.
39
+
40
+ ## API
41
+
42
+ ### Slider.Root
43
+
44
+ | Prop | Type | Default | Required | Description |
45
+ |------|------|---------|----------|-------------|
46
+ | value | `number` | — | No | Controlled value |
47
+ | defaultValue | `number` | — | No | Initial value when uncontrolled; if omitted, the internal initial value is `min` (clamped to `[min, max]`) |
48
+ | min | `number` | `0` | No | Minimum value |
49
+ | max | `number` | `100` | No | Maximum value |
50
+ | step | `number` | `1` | No | Step increment (may be fractional) |
51
+ | disabled | `boolean` | — | No | Disables the range input |
52
+ | onChange | `(value: number) => void` | — | No | Called when the value updates |
53
+ | label | `string` | — | No | Visible label above the track; wires `htmlFor` / `id` on the input |
54
+ | size | `"s" \| "m" \| "l" \| "xl"` | `"m"` | No | Track, thumb, and label scale |
55
+ | className | `string` | — | No | Class on the root `div` |
56
+ | aria-label | `string` | — | No | Accessible name when there is no `label` |
57
+
58
+ ## Related
59
+
60
+ - [Label](../label/COMPONENT.md)
61
+ - [Hint](../hint/COMPONENT.md)
62
+ - [DigitInput](../digit-input/COMPONENT.md)
@@ -0,0 +1,186 @@
1
+ # Stepper
2
+
3
+ **Проектирование по умолчанию:** при проектировании экранов и примеров изначально выбирай **`m`** для `size` (где есть ось размера), если явно не оговорено иное.
4
+
5
+ ## About
6
+
7
+ Multi-step progress UI: a high-level **`Stepper`** on a semantic ordered list (`<ol>` / `<li>`), plus primitive **`HorizontalStepper`** and **`VerticalStepper`** layouts where each row owns an explicit visual **`state`**.
8
+
9
+ - **Use** for wizards, checkout or form stages, and any flow where discrete steps should read clearly in order.
10
+ - **Use** **`Stepper`** when **`currentStep`** (and optional per-step **`status`**) should drive numbering and completed/active/pending visuals.
11
+ - **Use** **`HorizontalStepper`** / **`VerticalStepper`** when step logic lives in the app (store, API) and you set **`state`** on each **`Item`** yourself.
12
+ - **Do not use** as a page hierarchy control; prefer breadcrumbs for site structure.
13
+ - **Do not use** when a single continuous fraction matters more than discrete steps; consider a progress bar.
14
+ - **Do not use** primitive rails alone when you need a native **ordered list** semantics for steps—wrap with appropriate roles/markup or use **`Stepper.Root`**.
15
+
16
+ ## Composition
17
+
18
+ - **`Stepper.Root`** — `<ol>`; provides **`orientation`**, **`currentStep`**, **`size`**, and a per-render counter for automatic step indices. Children: **`Stepper.Step`** (alias **`Stepper.Item`**) and, in horizontal flows, **`Stepper.SeparatorIcon`** between steps.
19
+ - **`Stepper.Step` / `Stepper.Item`** — `<li>` wrapping a **`<button>`**; supplies step context (**`status`**, **`index`**) to **`Indicator`** and **`Content`**. Optional **`Stepper.Arrow`** after content is common in **vertical** orientation.
20
+ - **`Stepper.Indicator` / `Stepper.ItemIndicator`** — **`span`**; default shows **1-based index** or a checkmark when completed; **`aria-hidden`**. Maps high-level **`error`** to **`data-legacy-status="error"`** for styling.
21
+ - **`Stepper.Content`** — title and optional description beside the indicator.
22
+ - **`Stepper.SeparatorIcon`** — `<li>` with a chevron between horizontal steps (delegates to **`HorizontalStepper.SeparatorIcon`**).
23
+ - **`Stepper.Arrow`** — vertical arrow icon (delegates to **`VerticalStepper.Arrow`**).
24
+ - **`HorizontalStepper.Root`** — non-semantic **`div`** rail; children: **`SeparatorIcon`** and **`Item`** buttons, each with **`ItemIndicator`** inside.
25
+ - **`VerticalStepper.Root`** — non-semantic **`div`** column; children: **`Item`** rows with **`ItemIndicator`**, label text, and optional **`Arrow`**.
26
+
27
+ ### Minimal example
28
+
29
+ ```tsx
30
+ import { Stepper } from "prime-ui-kit";
31
+
32
+ export function Example() {
33
+ return (
34
+ <Stepper.Root>
35
+ <Stepper.Step>
36
+ <Stepper.Indicator />
37
+ <Stepper.Content title="Step one" />
38
+ </Stepper.Step>
39
+ </Stepper.Root>
40
+ );
41
+ }
42
+ ```
43
+
44
+ ## Rules
45
+
46
+ - **`Stepper.Root`**: **`currentStep`** defaults to **`0`**; indices before it are **`completed`**, equal index is **`active`**, after are **`pending`**. Override any step with **`status`** on **`Stepper.Step`** (e.g. **`error`**).
47
+ - **`Stepper.Step`** without **`index`** consumes the next auto index in child order; mixing explicit **`index`** and auto indices requires careful ordering.
48
+ - **`SeparatorIcon`** is intended for **`orientation="horizontal"`**; it is not the vertical connector pattern.
49
+ - Primitives use **`StepperAlignItemState`**: **`default`** \| **`active`** \| **`completed`** only—no built-in **`error`**; use **`Stepper`** for **`error`** or custom indicator content.
50
+ - Active step sets **`aria-current="step"`** on the **`Stepper`** step button; indicators and separators use **`aria-hidden`** where the label carries meaning—keep titles/descriptions meaningful for assistive tech.
51
+ - **`HorizontalStepper`** / **`VerticalStepper`** do not emit **`<ol>`** / **`<li>`**; add list semantics externally if required.
52
+ - Step transitions, validation, and routing are **app-owned**; the kit handles presentation and button interactions only.
53
+
54
+ ## API
55
+
56
+ Exported types include **`StepStatus`**, **`StepperOrientation`**, **`StepperSize`**, and **`StepperAlignItemState`** (for primitives).
57
+
58
+ ### Stepper.Root
59
+
60
+ | Prop | Type | Default | Required | Description |
61
+ |------|------|---------|----------|-------------|
62
+ | orientation | `"horizontal" \| "vertical"` | `"vertical"` | No | Layout of the step list |
63
+ | currentStep | `number` | `0` | No | Active step index for default statuses |
64
+ | size | `"s" \| "m" \| "l" \| "xl"` | `"m"` | No | Control tier for the subtree |
65
+ | children | `React.ReactNode` | — | Yes | Steps and optional **`SeparatorIcon`** |
66
+ | className | `string` | — | No | Class on **`<ol>`** |
67
+
68
+ ### Stepper.Step (Stepper.Item)
69
+
70
+ | Prop | Type | Default | Required | Description |
71
+ |------|------|---------|----------|-------------|
72
+ | index | `number` | auto | No | Step index for status and indicator |
73
+ | status | `StepStatus` | from **`currentStep`** | No | **`pending`** \| **`active`** \| **`completed`** \| **`error`** |
74
+ | type | `"button" \| "submit" \| "reset"` | `"button"` | No | **`button`** **`type`** |
75
+ | disabled | `boolean` | — | No | Disables the step button |
76
+ | className | `string` | — | No | Class on **`<button>`** |
77
+ | children | `React.ReactNode` | — | Yes | Indicator, content, optional arrow |
78
+ | …rest | `Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, "type">` | — | No | Other button attributes (**`ref`** supported) |
79
+
80
+ ### Stepper.Indicator (Stepper.ItemIndicator)
81
+
82
+ | Prop | Type | Default | Required | Description |
83
+ |------|------|---------|----------|-------------|
84
+ | children | `React.ReactNode` | index / checkmark | No | Custom indicator content |
85
+ | className | `string` | — | No | Class on **`span`** |
86
+
87
+ ### Stepper.Content
88
+
89
+ | Prop | Type | Default | Required | Description |
90
+ |------|------|---------|----------|-------------|
91
+ | title | `string` | — | Yes | Primary label |
92
+ | description | `string` | — | No | Secondary text |
93
+ | className | `string` | — | No | Wrapper class |
94
+
95
+ ### Stepper.SeparatorIcon
96
+
97
+ | Prop | Type | Default | Required | Description |
98
+ |------|------|---------|----------|-------------|
99
+ | className | `string` | — | No | Class on the inner icon |
100
+
101
+ ### Stepper.Arrow
102
+
103
+ | Prop | Type | Default | Required | Description |
104
+ |------|------|---------|----------|-------------|
105
+ | as | `React.ElementType` | `IconChevronRight` | No | Icon component |
106
+ | className | `string` | — | No | Class on the icon |
107
+ | …rest | props of **`as`** | — | No | Forwarded to the icon |
108
+
109
+ ### HorizontalStepper.Root
110
+
111
+ | Prop | Type | Default | Required | Description |
112
+ |------|------|---------|----------|-------------|
113
+ | size | `"s" \| "m" \| "l" \| "xl"` | `"m"` | No | Control tier |
114
+ | className | `string` | — | No | Class on **`div`** |
115
+ | children | `React.ReactNode` | — | No | Rail content |
116
+ | …rest | `React.HTMLAttributes<HTMLDivElement>` | — | No | Container attributes |
117
+
118
+ ### HorizontalStepper.SeparatorIcon
119
+
120
+ | Prop | Type | Default | Required | Description |
121
+ |------|------|---------|----------|-------------|
122
+ | as | `React.ElementType` | `IconChevronRight` | No | Separator icon component |
123
+ | className | `string` | — | No | Class on the SVG |
124
+ | …rest | `Omit<React.ComponentPropsWithoutRef<T>, "as" \| "className">` | — | No | Forwarded to **`as`** |
125
+
126
+ ### HorizontalStepper.Item
127
+
128
+ | Prop | Type | Default | Required | Description |
129
+ |------|------|---------|----------|-------------|
130
+ | state | `StepperAlignItemState` | `"default"` | No | **`default`** \| **`active`** \| **`completed`** |
131
+ | type | `"button" \| "submit" \| "reset"` | `"button"` | No | **`button`** **`type`** |
132
+ | className | `string` | — | No | Class on **`<button>`** |
133
+ | children | `React.ReactNode` | — | No | Indicator and label |
134
+ | …rest | `Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, "type">` | — | No | Other button attributes (**`ref`** supported) |
135
+
136
+ ### HorizontalStepper.ItemIndicator
137
+
138
+ | Prop | Type | Default | Required | Description |
139
+ |------|------|---------|----------|-------------|
140
+ | state | `StepperAlignItemState` | from context | No | Visual override |
141
+ | className | `string` | — | No | Class on **`div`** |
142
+ | children | `React.ReactNode` | checkmark when completed | No | Circle contents when not completed |
143
+ | …rest | `React.HTMLAttributes<HTMLDivElement>` | — | No | **`div`** attributes |
144
+
145
+ ### VerticalStepper.Root
146
+
147
+ | Prop | Type | Default | Required | Description |
148
+ |------|------|---------|----------|-------------|
149
+ | size | `"s" \| "m" \| "l" \| "xl"` | `"m"` | No | Control tier |
150
+ | className | `string` | — | No | Class on **`div`** |
151
+ | children | `React.ReactNode` | — | No | Vertical items |
152
+ | …rest | `React.HTMLAttributes<HTMLDivElement>` | — | No | Container attributes |
153
+
154
+ ### VerticalStepper.Arrow
155
+
156
+ | Prop | Type | Default | Required | Description |
157
+ |------|------|---------|----------|-------------|
158
+ | as | `React.ElementType` | `IconChevronRight` | No | Icon component |
159
+ | className | `string` | — | No | Class on the icon |
160
+ | …rest | `Omit<React.ComponentPropsWithoutRef<T>, "as" \| "className">` | — | No | Forwarded to **`as`** |
161
+
162
+ ### VerticalStepper.Item
163
+
164
+ | Prop | Type | Default | Required | Description |
165
+ |------|------|---------|----------|-------------|
166
+ | state | `StepperAlignItemState` | `"default"` | No | Row state |
167
+ | type | `"button" \| "submit" \| "reset"` | `"button"` | No | **`button`** **`type`** |
168
+ | className | `string` | — | No | Class on **`<button>`** |
169
+ | children | `React.ReactNode` | — | No | Indicator, text, optional arrow |
170
+ | …rest | `Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, "type">` | — | No | Other button attributes (**`ref`** supported) |
171
+
172
+ ### VerticalStepper.ItemIndicator
173
+
174
+ | Prop | Type | Default | Required | Description |
175
+ |------|------|---------|----------|-------------|
176
+ | state | `StepperAlignItemState` | from context | No | Indicator state |
177
+ | className | `string` | — | No | Class on **`div`** |
178
+ | children | `React.ReactNode` | checkmark when completed | No | Circle contents when not completed |
179
+ | …rest | `React.HTMLAttributes<HTMLDivElement>` | — | No | **`div`** attributes |
180
+
181
+ ## Related
182
+
183
+ - [Button](../button/COMPONENT.md) — next/back actions next to a controlled stepper
184
+ - [Modal](../modal/COMPONENT.md) and [Drawer](../drawer/COMPONENT.md) — wizard shells
185
+ - [Breadcrumb](../breadcrumb/COMPONENT.md) — hierarchy, not linear stages
186
+ - [Progress bar](../progress-bar/COMPONENT.md) — continuous progress instead of discrete steps