@hirobius/design-system 0.19.0 → 0.20.0

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 (144) hide show
  1. package/CONSUMING.md +9 -6
  2. package/DESIGN.md +7 -5
  3. package/README.md +14 -11
  4. package/codemods/hds-prefix.mjs +231 -0
  5. package/codemods/jsx-fold.mjs +515 -0
  6. package/codemods/not-found-pattern.mjs +71 -0
  7. package/codemods/patterns-subpath.mjs +242 -81
  8. package/codemods/patterns-subpath.names.json +41 -15
  9. package/codemods/removed-0.20.json +194 -0
  10. package/codemods/tile-grid.mjs +283 -0
  11. package/codemods/unrewritable.mjs +291 -0
  12. package/dist/chunks/DemoStateContext-Cz5TmrYu.js +32 -0
  13. package/dist/chunks/empty-state-BBqhCx0S.js +1217 -0
  14. package/dist/chunks/{form-BvNNnJ0t.js → form-COP3vK9_.js} +29 -27
  15. package/dist/contexts.js +157 -78
  16. package/dist/form.js +1 -1
  17. package/dist/hirobius-ui.js +1826 -5503
  18. package/dist/manifest.js +12 -13
  19. package/dist/patterns.js +820 -561
  20. package/dist/styles.css +1 -1
  21. package/dist/tokens.css +1 -1
  22. package/dist/tokens.js +29 -8
  23. package/dist/types/src/app/components/avatar-group.d.ts +1 -2
  24. package/dist/types/src/app/components/badge.d.ts +8 -3
  25. package/dist/types/src/app/components/blockquote.d.ts +1 -2
  26. package/dist/types/src/app/components/box-sx.d.ts +110 -13
  27. package/dist/types/src/app/components/box.d.ts +6 -3
  28. package/dist/types/src/app/components/breadcrumb.d.ts +0 -5
  29. package/dist/types/src/app/components/button.d.ts +33 -4
  30. package/dist/types/src/app/components/card.d.ts +7 -8
  31. package/dist/types/src/app/components/combobox.d.ts +47 -11
  32. package/dist/types/src/app/components/container.d.ts +2 -2
  33. package/dist/types/src/app/components/data-table-section.d.ts +1 -1
  34. package/dist/types/src/app/components/dialog.d.ts +7 -1
  35. package/dist/types/src/app/components/disclosure.d.ts +1 -5
  36. package/dist/types/src/app/components/field.d.ts +1 -2
  37. package/dist/types/src/app/components/grid.d.ts +10 -6
  38. package/dist/types/src/app/components/hds-tooltip.d.ts +12 -2
  39. package/dist/types/src/app/components/inline-code.d.ts +1 -2
  40. package/dist/types/src/app/components/input.d.ts +8 -5
  41. package/dist/types/src/app/components/kbd.d.ts +1 -2
  42. package/dist/types/src/app/components/metadata-list.d.ts +1 -2
  43. package/dist/types/src/app/components/page-header.d.ts +0 -2
  44. package/dist/types/src/app/components/popover.d.ts +8 -0
  45. package/dist/types/src/app/components/progress.d.ts +33 -6
  46. package/dist/types/src/app/components/segmented-control.d.ts +2 -26
  47. package/dist/types/src/app/components/select.d.ts +10 -1
  48. package/dist/types/src/app/components/skeleton.d.ts +2 -3
  49. package/dist/types/src/app/components/spinner.d.ts +1 -2
  50. package/dist/types/src/app/components/stack.d.ts +4 -1
  51. package/dist/types/src/app/components/stat.d.ts +1 -2
  52. package/dist/types/src/app/components/status-dot.d.ts +18 -4
  53. package/dist/types/src/app/components/status-list-item.d.ts +1 -2
  54. package/dist/types/src/app/components/surface.d.ts +2 -3
  55. package/dist/types/src/app/components/switcher.d.ts +1 -1
  56. package/dist/types/src/app/components/table.d.ts +1 -15
  57. package/dist/types/src/app/components/tag.d.ts +0 -6
  58. package/dist/types/src/app/components/text.d.ts +1 -2
  59. package/dist/types/src/app/components/textarea.d.ts +1 -2
  60. package/dist/types/src/app/components/toast.d.ts +1 -2
  61. package/dist/types/src/app/components/tooltip.d.ts +1 -1
  62. package/dist/types/src/app/context/DemoStateContext.d.ts +1 -1
  63. package/dist/types/src/app/context/RouterContext.d.ts +5 -5
  64. package/dist/types/src/app/data/manifest-types.d.ts +6 -5
  65. package/dist/types/src/app/design-system/generated-token-refs.d.ts +8 -0
  66. package/dist/types/src/app/design-system/generated-token-values.d.ts +1 -0
  67. package/dist/types/src/app/design-system/tokens.d.ts +22 -3
  68. package/dist/types/src/icons.d.ts +1 -1
  69. package/dist/types/src/index.d.ts +33 -124
  70. package/dist/types/src/patterns.d.ts +20 -25
  71. package/dist/variables.css +6 -0
  72. package/docs/CONSUMING.md +21 -13
  73. package/hirobius.tokens.json +48 -15
  74. package/llms.txt +19 -20
  75. package/package.json +18 -22
  76. package/public/hds-manifest.json +2400 -6488
  77. package/public/llms/components.txt +41 -423
  78. package/public/llms/layout.txt +4 -4
  79. package/public/llms-full.txt +67 -448
  80. package/public/llms.txt +19 -20
  81. package/src/app/data/component-api.json +1379 -3271
  82. package/dist/chunks/LanguageContext-CH_bwzCq.js +0 -83
  83. package/dist/chunks/TokenDisplayContext-evZi_214.js +0 -18
  84. package/dist/chunks/activity-feed-DIMeUJpW.js +0 -21950
  85. package/dist/types/src/app/components/activity-feed.d.ts +0 -73
  86. package/dist/types/src/app/components/app-shell.d.ts +0 -40
  87. package/dist/types/src/app/components/aspect-ratio.d.ts +0 -25
  88. package/dist/types/src/app/components/bleed.d.ts +0 -39
  89. package/dist/types/src/app/components/button-group.d.ts +0 -22
  90. package/dist/types/src/app/components/calendar.d.ts +0 -22
  91. package/dist/types/src/app/components/carousel.d.ts +0 -26
  92. package/dist/types/src/app/components/center.d.ts +0 -36
  93. package/dist/types/src/app/components/cinematic-link.d.ts +0 -18
  94. package/dist/types/src/app/components/circular-progress.d.ts +0 -28
  95. package/dist/types/src/app/components/cluster.d.ts +0 -39
  96. package/dist/types/src/app/components/command-palette.d.ts +0 -46
  97. package/dist/types/src/app/components/component-instance-matrix.d.ts +0 -27
  98. package/dist/types/src/app/components/context-menu.d.ts +0 -78
  99. package/dist/types/src/app/components/cover.d.ts +0 -43
  100. package/dist/types/src/app/components/date-input.d.ts +0 -31
  101. package/dist/types/src/app/components/date-range-input.d.ts +0 -34
  102. package/dist/types/src/app/components/date-time-input.d.ts +0 -30
  103. package/dist/types/src/app/components/doc-link-card.d.ts +0 -32
  104. package/dist/types/src/app/components/error-boundary.d.ts +0 -25
  105. package/dist/types/src/app/components/file-input.d.ts +0 -30
  106. package/dist/types/src/app/components/foundation-swatch.d.ts +0 -45
  107. package/dist/types/src/app/components/frame.d.ts +0 -38
  108. package/dist/types/src/app/components/heading-stack.d.ts +0 -52
  109. package/dist/types/src/app/components/history-card.d.ts +0 -12
  110. package/dist/types/src/app/components/hover-card.d.ts +0 -46
  111. package/dist/types/src/app/components/icon-button.d.ts +0 -22
  112. package/dist/types/src/app/components/image-lightbox.d.ts +0 -14
  113. package/dist/types/src/app/components/input-group.d.ts +0 -23
  114. package/dist/types/src/app/components/multi-selector.d.ts +0 -40
  115. package/dist/types/src/app/components/nav-group.d.ts +0 -29
  116. package/dist/types/src/app/components/nav-item.d.ts +0 -33
  117. package/dist/types/src/app/components/not-found-pattern.d.ts +0 -1
  118. package/dist/types/src/app/components/overflow-list.d.ts +0 -21
  119. package/dist/types/src/app/components/selectable-card.d.ts +0 -29
  120. package/dist/types/src/app/components/side-nav.d.ts +0 -23
  121. package/dist/types/src/app/components/sketch.d.ts +0 -19
  122. package/dist/types/src/app/components/stacked-card-rail.d.ts +0 -32
  123. package/dist/types/src/app/components/stepper-field.d.ts +0 -12
  124. package/dist/types/src/app/components/stepper.d.ts +0 -33
  125. package/dist/types/src/app/components/text-lockup.d.ts +0 -38
  126. package/dist/types/src/app/components/tile-grid.d.ts +0 -17
  127. package/dist/types/src/app/components/time-input.d.ts +0 -24
  128. package/dist/types/src/app/components/toggle-button.d.ts +0 -32
  129. package/dist/types/src/app/components/token.d.ts +0 -90
  130. package/dist/types/src/app/components/tokenUtils.d.ts +0 -38
  131. package/dist/types/src/app/components/tokenizer.d.ts +0 -24
  132. package/dist/types/src/app/components/toolbar.d.ts +0 -36
  133. package/dist/types/src/app/components/top-nav.d.ts +0 -23
  134. package/dist/types/src/app/components/tree-list.d.ts +0 -30
  135. package/dist/types/src/app/data/nav-model.d.ts +0 -39
  136. package/dist/types/src/app/hooks/useFocusVisible.d.ts +0 -9
  137. package/dist/types/src/app/layouts/CaseStudyLayout.d.ts +0 -20
  138. package/dist/types/src/app/layouts/DocLayout.d.ts +0 -14
  139. package/dist/types/src/app/layouts/EmbeddedDocLayoutContext.d.ts +0 -6
  140. package/dist/types/src/app/layouts/HdsDocsShell.d.ts +0 -72
  141. package/dist/types/src/app/layouts/HdsSystemDocLayout.d.ts +0 -14
  142. package/dist/types/src/app/lib/hds-search.d.ts +0 -45
  143. package/dist/types/src/app/lib/nav-active.d.ts +0 -16
  144. package/dist/types/src/app/lib/navLevels.d.ts +0 -4
@@ -1,6 +1,6 @@
1
1
  # Hirobius Design System
2
2
 
3
- Generated: 2026-09-30T14:27:19.090Z
3
+ Generated: 2026-10-01T15:12:20.594Z
4
4
  Primary sources: `public/hds-manifest.json`, `src/app/data/component-api.json`, `hirobius.tokens.json`
5
5
 
6
6
  ## System Architecture
@@ -42,33 +42,31 @@ One line per component that declares when to use it (`@usage` / `@useInstead` in
42
42
 
43
43
  Alert: Show a persistent inline message with a severity, next to the content it concerns. Use instead: ToastProvider, Badge
44
44
  Avatar: Show a person or entity as an image with an initials fallback. Use instead: Icon, Badge
45
- Badge: Label a status, state or count with a compact neutral or semantic chip. Use instead: Tag, Alert
45
+ Badge: Label a status, state or count with a compact neutral or semantic chip, or a dot. Use instead: Tag, Alert
46
46
  Box: Build one-off layout that no named layout primitive covers, using token keys through `sx`. Use instead: Stack, Grid, Container
47
47
  Breadcrumb: Show where the current page sits in a hierarchy and link back up it. Use instead: Tabs, Pagination
48
- Button: Trigger an action (submit, save, open a dialog) with a text label and optional icons; for an icon-only control pass iconOnly with iconLeft. Use instead: InlineLink
49
- ButtonGroup: Attach related Buttons into one segmented row or column that reads as a single control. Use instead: SegmentedControl, Stack
50
- Card: Group related content on a raised surface with header, body, footer and metric slots. Use instead: Surface, Card.Metric
48
+ Button: Trigger an action (submit, save, open a dialog) with a text label and optional icons; for an icon-only control pass iconOnly with iconLeft and label; for an on/off toggle pass pressed. Use instead: InlineLink
49
+ Card: Group related content on a raised surface with header, body, footer and metric slots, or as one selectable option. Use instead: Surface, Card.Metric
51
50
  CardMetric: Show one headline figure (a KPI, a count, a total) with its label inside a Card.
52
51
  Checkbox: Let people tick one or more independent options, or a parent choice that is partly selected. Use instead: Toggle, Radio
53
- Combobox: Pick one value from a long list of options, with a search field that filters as you type. Use instead: Select, Menu
52
+ Combobox: Pick one value, or several with `multiple`, from a long list of options, with a search field that filters as you type. Use instead: Select, Menu
54
53
  Container: Constrain a page region to the content or maximum width and centre it. Use instead: Stack, Grid, Box
55
- ContextMenu: Offer actions for an item on right-click, or the equivalent keyboard gesture. Use instead: Menu
56
- Dialog: Interrupt the page with a modal that needs a decision or focused input before people continue. Use instead: HoverCard, Alert, ToastProvider
54
+ Dialog: Interrupt the page with a modal that needs a decision or focused input before people continue. Use instead: Tooltip, Alert, ToastProvider
57
55
  Disclosure: Hide optional explanatory content behind a heading that people can expand. Use instead: Tabs
58
56
  Divider: Separate two regions of content with a thin semantic rule. Use instead: Stack, Surface
59
57
  EmptyState: Say that a list, grid or section has no data yet, with a title and an optional description. Use instead: Skeleton, Alert
60
58
  Field: Show a labelled read-only value, such as a name and its value in a detail view. Use instead: Input, Card.Metric
61
59
  Grid: Lay out content in responsive columns with token-governed gaps, or align nested content with subgrid. Use instead: Stack, Box
60
+ HdsRouterProvider: Wrap the app root once so HDS links and navigation use your client router; with no provider they stay plain anchors.
62
61
  HdsThemeProvider: Wrap an app or region once to set theme, density and other root attributes for everything inside it. Use instead: Surface
63
- HoverCard: Preview extra detail about a link or mention when it is hovered or focused, without navigating. Use instead: Dialog, Tooltip
64
62
  Icon: Draw a Lucide glyph at a size and colour from the design tokens. Use instead: Button, Avatar
65
- IconButton: Trigger an action from a compact icon-only control, always with an accessible label. Use instead: Button
66
63
  InlineLink: Link to a route or external URL from inside body copy. Use instead: Button, Text
67
- Input: Collect a single line of text, a number, an email or a password, with label, helper and error slots. Use instead: Textarea, Select, Combobox
64
+ Input: Collect a single line of text, a number, an email, a password, a date or a time, with label, helper and error slots. Use instead: Textarea, Select, Combobox
68
65
  Kbd: Show a keyboard key or shortcut hint inline, as a native kbd element. Use instead: Text
69
66
  Menu: Offer a list of actions from a trigger, closed until opened. Use instead: Select
70
67
  Pagination: Move between pages of a long result set, with truncated page numbers. Use instead: Breadcrumb
71
- Progress: Show how far a task has got, as a bar that is determinate or indeterminate. Use instead: Spinner, Skeleton
68
+ Popover: Anchor interactive content, such as a short form, a filter set or a picker, to a trigger people click to open. Use instead: Tooltip, Menu, Dialog
69
+ Progress: Show how far a task has got, as a bar or ring that is determinate or indeterminate. Use instead: Spinner, Skeleton
72
70
  Radio: Choose exactly one option from a small set that should stay visible together. Use instead: Checkbox, Select, SegmentedControl
73
71
  SegmentedControl: Switch between two to five mutually exclusive views or modes in a compact row. Use instead: Radio, Tabs, Select
74
72
  Select: Choose one value from a short list of options in a form field. Use instead: Menu, Combobox
@@ -86,6 +84,7 @@ Text: Set any text on the type ramp, with the element chosen by `as`. Use instea
86
84
  Textarea: Collect multi-line free text such as a message, note or description. Use instead: Input
87
85
  ToastProvider: Confirm an action with a brief message that appears and dismisses itself, through useToast. Use instead: Alert, Dialog
88
86
  Toggle: Switch one setting on or off, with the effect applying immediately. Use instead: Checkbox, Radio
87
+ Tooltip: Name an icon-only control, or add a short hint that appears on hover and keyboard focus. Use instead: Popover, Text
89
88
  VisuallyHidden: Give assistive technology a label or description that sighted people do not need to see. Use instead: Text
90
89
 
91
90
  ## Tokens (Primary Source Of Truth)
@@ -111,16 +110,16 @@ VisuallyHidden: Give assistive technology a label or description that sighted pe
111
110
 
112
111
  Canonical skeleton, outermost to innermost:
113
112
 
114
- 1. `Page` (or `Container`/`Center` for a full-bleed, non-page surface) for the outermost width constraint. Never import `Container` directly inside `src/app/pages/**` — use `Page`, which wraps it and owns vertical rhythm.
113
+ 1. `Page` (from `@hirobius/design-system/patterns`; or `Container` for a full-bleed, non-page surface, with a `Box` inside it for a horizontal gutter) for the outermost width constraint. Never import `Container` directly inside `src/app/pages/**` — use `Page`, which wraps it and owns vertical rhythm.
115
114
  2. `Stack` (vertical rhythm between sections) or `Grid` (two-dimensional/column layout) for the structural skeleton. One section = one Section/Stack — never add a second wrapper to fake a section boundary.
116
- 3. Reach for a named every-layout primitive before hand-rolling flex/grid math for a common intent: `Cluster` (wrapping row of same-ish things), `Center` (centered max-width column with optional gutter), `Sidebar` (fixed-width rail + fluid content, no media query), `Switcher` (row that flips to a column below a threshold, no media query), `Cover` (full-height shell with a centered main region), `Frame` (aspect-ratio-locked clipped media box), `Bleed` (controlled negative margin to escape a parent padding).
115
+ 3. Reach for a named layout primitive before hand-rolling flex/grid math for a common intent: `Stack direction="row" wrap="wrap"` (wrapping row of same-ish things), `Sidebar` (fixed-width rail + fluid content, no media query), `Switcher` (row that flips to a column below a threshold, no media query). A full-height shell with a centered main region, an aspect-ratio-locked media box or a negative margin that escapes a parent padding is a `Box` with `style` (not `sx`, which applies on the client only).
117
116
  4. `Surface` for any background-bearing, padded wrapper (card, panel, inset). Never a raw element with backgroundColor + padding hand-rolled inline.
118
117
  5. Use the screen patterns (`@hirobius/design-system/patterns`) for the parts every screen repeats: `PageHeader` once at the top (breadcrumb, `heading2` title, status, actions), `MetricTiles` for any row of headline numbers, `FormActions` for a form footer (primary right-most and last in DOM order, destructive on the far left), `DataTableSection` for a titled table (toolbar slot, consumer row actions, empty state, scrolls on narrow widths without a caller `minWidth`), and `DestructiveSection` last for an irreversible action (danger button, then an `AlertDialog` confirm). Pick between `MetricTiles`, `Stat`, `Card.Metric` and `StatusTile`, and between `Card` and `Surface`, with the "Which one, when" table in `DESIGN.md`.
119
118
  6. `Box` `sx` LAST — only for genuinely one-off layout that no named primitive covers. `sx` spacing/color keys MUST be HDS token keys, never raw hex/px.
120
119
 
121
120
  Negative rules (apply everywhere, checked by `scripts/audit-tokens.mjs --full`, `check-hardcoded-spacing.mjs`, `check-hardcoded-colors.mjs`):
122
121
 
123
- - No inline margins on children to fake spacing between siblings — gap/spacing on the parent (Stack/Grid/Cluster/Switcher/Sidebar/Cover) owns rhythm, not margin on the child.
122
+ - No inline margins on children to fake spacing between siblings — gap/spacing on the parent (Stack/Grid/Switcher/Sidebar) owns rhythm, not margin on the child.
124
123
  - No raw px or hex values in any layout or color prop — every spacing value comes from the semantic gap scale (`tight | normal | inset | spacious`, or a component/subgrid step) and every color comes from a `semantic.color.*` token.
125
124
  - No repeated outlined cards as the default structure for roadmap/status/process/overview UI — use open bands, dividers, rails, disclosures, and whitespace instead.
126
125
 
@@ -175,7 +174,7 @@ When building any card component or card-like surface, ALL of the following rule
175
174
 
176
175
  Cards default to `elevation.flat`. Popovers/tooltips/dropdowns use `elevation.floating`. Dialogs/sheets use `elevation.overlay`. Interactive cards lift to `elevation.raised` on hover. Never combine `raised` with a border — depth is one mechanism (border OR shadow), not both stacked.
177
176
 
178
- Overlays (Dialog, AlertDialog, Menu, ContextMenu, Popover, Select, HoverCard, Tooltip) portal into the nearest `data-hds` scope, so they inherit its theme (for example `<div data-hds data-theme="dark">`); pass `container` on the Content part to override.
177
+ Overlays (Dialog, AlertDialog, Menu, Popover, Select, Tooltip) portal into the nearest `data-hds` scope, so they inherit its theme (for example `<div data-hds data-theme="dark">`); pass `container` on the Content part to override.
179
178
 
180
179
  ## Slices And Full Bundle
181
180
 
@@ -219,19 +218,19 @@ On-demand only (load only if explicitly requested or the task clearly requires i
219
218
  Icons come from the curated subpath `@hirobius/design-system/icons`; nothing extra to install.
220
219
 
221
220
  ```tsx
222
- import { IconButton } from '@hirobius/design-system';
221
+ import { Button, Icon } from '@hirobius/design-system';
223
222
  import { Ellipsis } from '@hirobius/design-system/icons';
224
223
 
225
- <IconButton icon={Ellipsis} label="Row actions" />
224
+ <Button iconOnly label="Row actions" iconLeft={<Icon icon={Ellipsis} />} />
226
225
  ```
227
226
 
228
- Rule: icon-only actions (row menus, close, edit) use `IconButton`; do not hand-roll a button with a glyph or text "...".
227
+ Rule: icon-only actions (row menus, close, edit) use `Button iconOnly` with a `label` and an `Icon` in `iconLeft`; do not hand-roll a button with a glyph or text "...".
229
228
 
230
229
  Names: Archive, ArrowDown, ArrowLeft, ArrowRight, ArrowUp, Bell, Bookmark, Calendar, Check, ChevronDown, ChevronLeft, ChevronRight, ChevronUp, CircleAlert, CircleCheck, CircleHelp, Clock, Copy, Download, Ellipsis, EllipsisVertical, ExternalLink, Eye, EyeOff, FileText, Funnel, Heart, House, Image, Info, Link, Lock, LogIn, LogOut, Mail, Menu, Minus, Pencil, Plus, RefreshCw, Save, Search, Settings, Share, Star, Trash2, TriangleAlert, Upload, User, X
231
230
 
232
231
  Legacy names map to canonical ones: MoreHorizontal -> Ellipsis, MoreVertical -> EllipsisVertical, AlertTriangle -> TriangleAlert, Home -> House, Filter -> Funnel.
233
232
 
234
- Name collisions: `Calendar` and `Menu` share names with HDS components; alias the icon: `import { Calendar as CalendarIcon, Menu as MenuIcon } from '@hirobius/design-system/icons'`. For an icon outside the set, install `lucide-react@0.487.0` (same version keeps the `LucideIcon` type identical).
233
+ Name collisions: `Menu` shares a name with an HDS component; alias the icon: `import { Menu as MenuIcon } from '@hirobius/design-system/icons'`. For an icon outside the set, install `lucide-react@0.487.0` (same version keeps the `LucideIcon` type identical).
235
234
 
236
235
  ## Token Rules
237
236
 
@@ -356,7 +355,7 @@ Depth is communicated through 4 elevation roles bundled by `semantic.elevation.*
356
355
 
357
356
  Cards default to `flat`. They lift to `raised` only on interactive hover or when explicitly elevated above siblings. Never combine `raised` with a border — depth is one mechanism (border OR shadow), not both stacked.
358
357
 
359
- Overlays (Dialog, AlertDialog, Menu, ContextMenu, Popover, Select, HoverCard, Tooltip) portal into the nearest `data-hds` scope, so they inherit its theme (for example `<div data-hds data-theme="dark">`); pass `container` on the Content part to override.
358
+ Overlays (Dialog, AlertDialog, Menu, Popover, Select, Tooltip) portal into the nearest `data-hds` scope, so they inherit its theme (for example `<div data-hds data-theme="dark">`); pass `container` on the Content part to override.
360
359
 
361
360
  ## Motion
362
361
 
@@ -387,7 +386,7 @@ Default most interactive feedback to `productive` (150ms, decelerate). Reserve `
387
386
 
388
387
  | Token | Value | Purpose |
389
388
  | --- | --- | --- |
390
- | `semantic.motion.distance` | `24px` | Travel distance for a scroll-reveal translateY offset. Coincides in value with semantic.space.scale.md today, but names a motion travel distance rather than a spacing tier (hds#242). |
389
+ | `semantic.motion.distance` | `24px` | Scroll-reveal translateY travel distance. Equals semantic.space.scale.md today, but names motion travel, not a spacing tier (hds#242). |
391
390
  <!-- auto:end:motion -->
392
391
 
393
392
  ## Components
@@ -395,7 +394,7 @@ Default most interactive feedback to `productive` (150ms, decelerate). Reserve `
395
394
  <!-- auto:start:components -->
396
395
  | Component | Radius | States | Guidance |
397
396
  | --- | --- | --- | --- |
398
- | **Buttons** (`Button`) | `8px` (`semantic.radius.action`) | default · hover · focus · active · disabled · loading | Three variants: primary (accent-filled), secondary (outline), tertiary (ghost). Primary uses `semantic.accent.*` ramp per state. Icon buttons (`IconButton`) follow the same token surface. Icon-only actions use `IconButton` with an icon from `@hirobius/design-system/icons`. |
397
+ | **Buttons** (`Button`) | `8px` (`semantic.radius.action`) | default · hover · focus · active · disabled · loading | Three variants: primary (accent-filled), secondary (outline), tertiary (ghost). Primary uses `semantic.accent.*` ramp per state. Pressed is a 5% `semantic.color.state.pressed.overlay` wash over the fill (`role.pressed-overlay`: black in light, white in dark), not a brightness filter. Icon-only buttons (`iconOnly`) follow the same token surface. Icon-only actions use `Button iconOnly` with a `label` and an `Icon` from `@hirobius/design-system/icons` in `iconLeft`. |
399
398
  | **Inputs** (`Input`) | `8px` (`semantic.radius.action`) | default · focus · filled · error · disabled · loading | Border-driven treatment; no filled background by default. Focus uses `semantic.color.border.accent` plus a 2px outline offset. Error swaps to `component.input.borderError`. |
400
399
  | **Cards** (`Card`) | `12px` (`rounded-lg`, role radius + 4px) | default · hover (optional parallax) · pressed (when interactive) | Cards default to `elevation.flat` (1px border `border.subtle`, no shadow). Interactive cards lift to `elevation.raised` (shadow.subtle, no border) on hover. Bind via `semantic.elevation.{role}` — never raw box-shadow values. Radius: `rounded-lg` (role radius + 4 px, follows the tenant knob) — never a hard-coded value. Padding: `var(--semantic-space-surface-padding)`. Title: `heading3`. Meta: `caption` + `var(--semantic-color-content-secondary)`. Hover (interactive): `scale(1.02)` transform + lift to raised. Never: gradients, glow, frosted glass, tinted surfaces, decorative overlays, or inner shadows. |
401
400
  | **Badges** (`Badge`) | `8px` (`primitive.radius.4`) | neutral · accent · feedback (error/success/warning/info) | Single-line status markers. Feedback colors come from `semantic.color.feedback.*`. Never used as decorative chrome. |
@@ -442,11 +441,13 @@ Pick by what the thing is. The first four rows are for a headline number or a st
442
441
  | `Stat` | An inline number inside prose or a dense list. | `MetricTiles` when the number stands alone in a row of its own. |
443
442
  | `Card.Metric` | A metric inside an existing `Card` only. | `MetricTiles` when there is no enclosing `Card`. |
444
443
  | `StatusTile` | State with notes and a trailing badge, never a number. | `MetricTiles` when the tile is a number; `StatusTile` never carries a value. |
445
- | `Card` | A titled or interactive content object (header, body, footer, or selectable). | `Surface` when there is no title and nothing to press. |
444
+ | `Card` | A titled or interactive content object (header, body, footer, `selectable`). | `Surface` when there is no title and nothing to press. |
446
445
  | `Surface` | A plain padded background around content that has no header of its own. | `Card` when the content is titled or interactive. |
447
446
  | `DestructiveSection` | The one irreversible action on a screen, with an explanation and a confirm. | `FormActions` `destructive` slot for a delete beside a form's own buttons. |
448
447
  | `DataTableSection` | A titled table with a toolbar, row actions and an empty state. | `Table` alone when there is no heading, toolbar or empty state to show. |
449
448
 
449
+ Three more needs are props on an existing component, not components of their own. A card people pick from a set is a `Card` with `selectable`, `selected` and `onSelectedChange`, announced as a checkbox. A wrapping row of equal tiles that are not headline numbers is a `Grid` with `layout="auto-fill"` and `minItemWidth`. A state shown only as a colored marker, with no notes, is a `Badge` with `dot` and a `label` that names the state.
450
+
450
451
  `Card` and `Surface` share one container radius, `rounded-lg` (`role.radius` + 4 px: 12 px by default, 4 px under `brutalist-demo`). Dialogs and alert dialogs use it too. Never read `--component-card-radius` for a container; it ignores the tenant.
451
452
 
452
453
  `MetricTiles` has `min(tiles, 4)` columns, so a row never leaves an empty column, and every tile has one fixed min-height with the value in `heading2`, the label as an eyebrow and the sub line in `caption`. Its tone comes from the fixed feedback vocabulary: `neutral | success | warning | danger | info`.
@@ -481,7 +482,7 @@ Unresolved rules that the live repo cannot yet answer confidently are tracked in
481
482
  <!-- auto:start:build-meta -->
482
483
  ---
483
484
 
484
- > Generated from `hirobius.tokens.json` (381 tokens) and `public/hds-manifest.json` by `scripts/build-design-md.mjs`.
485
+ > Generated from `hirobius.tokens.json` (385 tokens) and `public/hds-manifest.json` by `scripts/build-design-md.mjs`.
485
486
  > Hand-edit `DESIGN.source.md`; this file (`DESIGN.md`) is overwritten by `pnpm tokens`.
486
487
  <!-- auto:end:build-meta -->
487
488
 
@@ -491,10 +492,6 @@ Unresolved rules that the live repo cannot yet answer confidently are tracked in
491
492
 
492
493
  Compact: name, first line of description, then prop: type = default. Full detail in `src/app/data/component-api.json`.
493
494
 
494
- ### ActivityFeed
495
- ActivityFeed — chronological system event log. Renders a list of activity events using white space as the sole separator. No dividers, no borders between items…
496
- - events: ActivityEvent[] = [ { id: 'evt-001', title: 'File Uploade…
497
-
498
495
  ### Alert
499
496
  Alert - compact feedback surface with contextual severity.
500
497
  - children: ReactNode
@@ -508,11 +505,6 @@ AlertDialog root + parts. Controlled via `open`/`onOpenChange`, or uncontrolled
508
505
  - onOpenChange: ((open: boolean) => void)
509
506
  - open: boolean
510
507
 
511
- ### AspectRatio
512
- Locks its single child to the given width-to-height `ratio` so media reserves its box up front and never causes layout shift while it loads.
513
- - asChild: boolean
514
- - ratio: number = 1
515
-
516
508
  ### AssetImg
517
509
  AssetImg - responsive asset frame with fallback placeholder handling. Contexts: default, lightbox, and detail.
518
510
  - alt: string
@@ -550,16 +542,10 @@ Renders up to `max` overlapping avatars followed by a `+N` overflow chip.
550
542
  ### Badge
551
543
  Compact metadata/status chip. Tone is the only styling input.
552
544
  - as: ElementType<any, keyof IntrinsicElements> = span
553
- - tone: "neutral" | "danger" | "success" | "warning" | "info" | "inProgress" | null
554
-
555
- ### Bleed
556
- Bleed — controlled negative-margin full-bleed within a padded container. Every Layout reference: https://every-layout.dev/layouts/the-stack/ (bleed is the inve…
557
- - amount: 'tight' | 'normal' | 'inset' | 'spacious' = normal
558
- - as: ElementType<any, keyof IntrinsicElements> = div
559
- - axis: 'x' | 'y' | 'both' = x
560
- - children: ReactNode
561
- - className: string
562
- - style: CSSProperties
545
+ - dot: boolean = false
546
+ - label: string
547
+ - size: "sm" | "md" | "lg"
548
+ - tone: "success" | "danger" | "warning" | "info" | "neutral" | "inProgress" | null
563
549
 
564
550
  ### Blockquote
565
551
  A quoted passage; pass `cite` for the source URL and `attribution` for a byline.
@@ -580,23 +566,19 @@ Breadcrumb trail. Links route through the HDS router seam (plain anchors with no
580
566
  ### Button
581
567
  Triggers an action when activated.
582
568
  - asChild: boolean = false
569
+ - defaultPressed: boolean
583
570
  - disabled: boolean
584
571
  - iconLeft: ReactNode
585
572
  - iconOnly: boolean = false
586
573
  - iconRight: ReactNode
587
574
  - label: string
588
575
  - loading: boolean = false
576
+ - onPressedChange: ((pressed: boolean) => void)
577
+ - pressed: boolean
589
578
  - size: "sm" | "md" | "lg" | null
590
- - tone: "neutral" | "danger" | "success" | "warning" | "info" | null
579
+ - tone: "success" | "danger" | "warning" | "info" | "neutral" | null
591
580
  - variant: "primary" | "secondary" | "tertiary" | null
592
581
 
593
- ### ButtonGroup
594
- Groups Button (or button-like) children into a single attached segment.
595
- - orientation: "horizontal" | "vertical" | null
596
-
597
- ### Calendar
598
- Renders an accessible month grid; compose it inside a Popover for the date inputs.
599
-
600
582
  ### Callout
601
583
  Tone-driven side-rule callout for status, quotes, hypotheses.
602
584
  - italic: boolean = false
@@ -608,7 +590,10 @@ Tagged per-export, not on the file block: this module exports eight components a
608
590
  - bordered: boolean = false
609
591
  - gap: GapOption = tight
610
592
  - noPadding: boolean = false
593
+ - onSelectedChange: ((selected: boolean) => void)
611
594
  - padding: PaddingOption = component
595
+ - selectable: boolean = false
596
+ - selected: boolean = false
612
597
  - tone: 'neutral' | 'danger' | 'success' | 'warning' | 'info' = neutral
613
598
  - variant: 'default' | 'accent' = default
614
599
 
@@ -642,21 +627,6 @@ Card — surface container with slot anatomy (12d-card-anatomy). Slot anatomy (D
642
627
  ### CardTitle
643
628
  Card — surface container with slot anatomy (12d-card-anatomy). Slot anatomy (DESIGN.md §"Card Anatomy"). Status, progress, and metadata are layout-bearing — th…
644
629
 
645
- ### Carousel
646
- Renders children as a snap-scrolling track with Prev/Next scroll buttons.
647
- - ariaLabel: string = Carousel
648
- - children: ReactNode
649
- - showControls: boolean = true
650
-
651
- ### Center
652
- Center — max-width column, auto-centered horizontally. Every Layout reference: https://every-layout.dev/layouts/center/
653
- - as: ElementType<any, keyof IntrinsicElements> = div
654
- - children: ReactNode
655
- - className: string
656
- - gutter: 'tight' | 'normal' | 'inset' | 'spacious'
657
- - maxWidth: 'content' | 'max' = content
658
- - style: CSSProperties
659
-
660
630
  ### Checkbox
661
631
  Checkbox — custom-drawn checkbox with check / indeterminate glyph.
662
632
  - checked: boolean
@@ -664,30 +634,6 @@ Checkbox — custom-drawn checkbox with check / indeterminate glyph.
664
634
  - label: string
665
635
  - onChange: (v: boolean) => void
666
636
 
667
- ### CinematicLink
668
- CinematicLink - cinematic editorial link treatment for portfolio surfaces.
669
- - children: string
670
- - href: string
671
-
672
- ### CircularProgress
673
- A circular progress ring; pass `value`/`max` or set `indeterminate`.
674
- - indeterminate: boolean = false
675
- - label: string
676
- - max: number = 100
677
- - size: "sm" | "md" | "lg" = md
678
- - tone: "neutral" | "danger" | "success" | "warning" | "info" | null
679
- - value: number = 0
680
-
681
- ### Cluster
682
- Cluster — wrapping horizontal group with even gaps. Every Layout reference: https://every-layout.dev/layouts/cluster/
683
- - align: 'start' | 'center' | 'end' | 'stretch' = center
684
- - as: ElementType<any, keyof IntrinsicElements> = div
685
- - children: ReactNode
686
- - className: string
687
- - gap: 'tight' | 'normal' | 'inset' | 'spacious' = tight
688
- - justify: 'start' | 'center' | 'end' | 'space-between' = start
689
- - style: CSSProperties
690
-
691
637
  ### CodeBlock
692
638
  CodeBlock - code display with copy button and optional collapsible toggle.
693
639
  - className: string
@@ -700,32 +646,20 @@ CodeBlock - code display with copy button and optional collapsible toggle.
700
646
  - variant: "inline" | "block" = block
701
647
 
702
648
  ### Combobox
703
- Combobox — searchable single-select (Popover + filtered listbox). A select-with-search built on the HDS Popover. The trigger shows the current selection; openi…
649
+ Combobox — searchable single- or multi-select (Popover + filtered listbox). A select-with-search built on the HDS Popover. The trigger shows the current select…
650
+ - aria-describedby: string
651
+ - aria-invalid: boolean
704
652
  - aria-label: string
705
653
  - className: string
706
654
  - disabled: boolean = false
707
655
  - emptyMessage: string = No results
708
- - onChange: (value: string) => void
656
+ - id: string
657
+ - multiple: boolean
658
+ - onChange: ((value: string) => void) | ((value: string[]) => void)
709
659
  - options: ComboboxOption[]
710
660
  - placeholder: string = Select…
711
661
  - searchPlaceholder: string = Search…
712
- - value: string | null
713
-
714
- ### CommandPalette
715
- Mountable trigger + dialog. Drop into header slot; component manages its own open state and Cmd-K / Ctrl-K global keybinding.
716
- - className: string
717
-
718
- ### ComponentInstanceMatrix
719
- ComponentInstanceMatrix — responsive specimen matrix for variant and state parity.
720
- - componentName: string
721
- - dimensionX: string
722
- - dimensionY: string
723
- - freezeRowState: boolean = false
724
- - isMobile: boolean
725
- - renderInstance: (rowKey: string, columnKey: string) => ReactNode
726
- - rowLabelTone: "primary" | "secondary" = primary
727
- - rowLabelWidth: number = 120
728
- - title: string
662
+ - value: string | readonly string[] | null
729
663
 
730
664
  ### Container
731
665
  Container — semantic width-constrained layout. Centers content horizontally and applies semantic max-width constraints. - maxWidth options: 'content' (760px pr…
@@ -735,67 +669,17 @@ Container — semantic width-constrained layout. Centers content horizontally an
735
669
  - padding: string = var(--semantic-space-surface-padding)
736
670
  - style: CSSProperties
737
671
 
738
- ### ContextMenu
739
- ContextMenu root + parts. Wrap the right-clickable area in `ContextMenu.Trigger`. Controlled via `onOpenChange`.
740
- - children: React.ReactNode
741
- - dir: ("ltr" | "rtl")
742
- - modal: boolean
743
- - onOpenChange: ((open: boolean) => void)
744
- - open: boolean
745
-
746
- ### Cover
747
- Cover — vertical shell with an auto-centered main region. Every Layout reference: https://every-layout.dev/layouts/cover/
748
- - as: ElementType<any, keyof IntrinsicElements> = div
749
- - centerSlot: ReactNode
750
- - children: ReactNode
751
- - className: string
752
- - footer: ReactNode
753
- - gap: 'tight' | 'normal' | 'inset' | 'spacious' = normal
754
- - header: ReactNode
755
- - minHeight: string = 100svh
756
- - style: CSSProperties
757
-
758
672
  ### DataTableSection
759
673
  Section heading and toolbar over a `Table`. Row actions are consumer nodes in a trailing column, the table scrolls horizontally on narrow widths without a `min…
760
674
  - actionsLabel: string = Actions
761
675
  - columns: TableColumn[]
762
676
  - emptyDescription: ReactNode
763
677
  - emptyTitle: ReactNode = Nothing here yet
764
- - level: 2 | 3 | 4 | 5 | 6 = 2
678
+ - level: 6 | 3 | 4 | 2 | 5 = 2
765
679
  - rows: DataTableSectionRow[]
766
680
  - title: ReactNode
767
681
  - toolbar: ReactNode
768
682
 
769
- ### DateInput
770
- Text field + calendar popover for picking a single date.
771
- - aria-label: string
772
- - disabled: boolean = false
773
- - displayFormat: string = yyyy-MM-dd
774
- - id: string
775
- - onChange: ((date: Date) => void) | undefined
776
- - placeholder: string
777
- - value: Date
778
-
779
- ### DateRangeInput
780
- DateRangeInput — date-range field composing the existing Popover with Calendar in range mode, so picking a start/end date reads as one overlay pattern with Com…
781
- - aria-label: string
782
- - disabled: boolean = false
783
- - displayFormat: string = yyyy-MM-dd
784
- - id: string
785
- - numberOfMonths: number = 2
786
- - onChange: ((range: DateRange) => void) | undefined
787
- - placeholder: string = Select date range
788
- - value: DateRange
789
-
790
- ### DateTimeInput
791
- Text date field + calendar popover, paired with a native time field, producing one Date.
792
- - aria-label: string
793
- - dateFormat: string = yyyy-MM-dd
794
- - disabled: boolean = false
795
- - id: string
796
- - onChange: ((date: Date) => void) | undefined
797
- - value: Date
798
-
799
683
  ### DestructiveSection
800
684
  Titled danger zone: a title, an explanation, and one danger `Button` that opens an `AlertDialog`. Pressing the button never runs the action; only the dialog's …
801
685
  - actionLabel: ReactNode
@@ -803,7 +687,7 @@ Titled danger zone: a title, an explanation, and one danger `Button` that opens
803
687
  - confirmBody: ReactNode
804
688
  - confirmLabel: string
805
689
  - description: ReactNode
806
- - level: 2 | 3 | 4 | 5 | 6 = 2
690
+ - level: 6 | 3 | 4 | 2 | 5 = 2
807
691
  - onConfirm: () => void
808
692
  - title: ReactNode
809
693
 
@@ -881,19 +765,6 @@ Divider — semantic separator between content regions.
881
765
  - strong: boolean
882
766
  - variant: "strong" | "default" | null
883
767
 
884
- ### DocLinkCard
885
- DocLinkCard - navigation card for editorial and documentation cross-links.
886
- - accent: boolean = false
887
- - affordance: "up-right" | "right" | "left" = up-right
888
- - description: string
889
- - disabled: boolean = false
890
- - href: string
891
- - icon: LucideIcon
892
- - meta: string
893
- - metaStyle: "caption" | "ui" = caption
894
- - title: string
895
- - variant: "feature" | "pager" = feature
896
-
897
768
  ### EmptyState
898
769
  EmptyState — consistent no-data placeholder for lists, grids, and sections.
899
770
  - className: string
@@ -905,17 +776,9 @@ Caption label paired with a value — used in metadata grids and read-only forms
905
776
  - children: React.ReactNode
906
777
  - label: string
907
778
  - mono: boolean | null
908
- - tone: "neutral" | "danger" | "success" | "warning" | "info" | null
779
+ - tone: "success" | "danger" | "warning" | "info" | "neutral" | null
909
780
  - value: ReactNode
910
781
 
911
- ### FileInput
912
- A dashed dropzone that opens the native file picker or accepts a drag-and-drop.
913
- - accept: string
914
- - disabled: boolean
915
- - label: ReactNode = Click to upload or drag and drop
916
- - multiple: boolean
917
- - onFiles: ((files: File[]) => void)
918
-
919
782
  ### Form
920
783
  Styled `<form>` with consistent vertical field rhythm. Tagged per-export: FormField and FormFieldShell share this module and have no Figma node, so a file-leve…
921
784
 
@@ -946,50 +809,22 @@ Presentational label + control slot + helper/error markup. Renders `children` ve
946
809
  - label: string
947
810
  - required: boolean = false
948
811
 
949
- ### FoundationSwatch
950
- FoundationSwatch - governed foundation specimen for color and semantic role previews.
951
- - background: string
952
- - bordered: boolean = false
953
- - details: string[]
954
- - foreground: string = var(--semantic-color-content-primary)
955
- - hidePreviewLabel: boolean = false
956
- - label: string
957
- - note: ReactNode
958
- - previewPosition: 'bottom-left' | 'top-left' | 'center' = center
959
- - specimen: ReactNode
960
- - swatchVar: string
961
- - tokenDisplayPreset: 'depth1' | 'depth2' | 'full' = depth2
962
- - tokenPath: string
963
- - value: string
964
-
965
- ### Frame
966
- Frame — aspect-ratio-locked, token-clipped media box. Every Layout reference: https://every-layout.dev/layouts/frame/
967
- - as: ElementType<any, keyof IntrinsicElements> = div
968
- - children: ReactNode
969
- - className: string
970
- - radius: 'none' | 'sm' | 'md' | 'full' = md
971
- - ratio: number = 16 / 9
972
- - style: CSSProperties
973
-
974
812
  ### Grid
975
813
  Grid — responsive grid composition primitive. Enforces semantic gap and column values. No arbitrary CSS grid. - layout='fixed': responsive base (collapses via …
976
814
  - as: ElementType<any, keyof IntrinsicElements> = div
977
815
  - children: ReactNode
978
816
  - className: string
979
817
  - columns: number = 12
980
- - gap: 'tight' | 'normal' | 'inset' | 'spacious' = inset
981
- - layout: 'fixed' | 'auto-fit' = fixed
818
+ - gap: 'medium' | 'tight' | 'normal' | 'inset' | 'spacious' = inset
819
+ - layout: 'fixed' | 'auto-fit' | 'auto-fill' = fixed
820
+ - minItemWidth: string
982
821
  - style: CSSProperties
983
822
  - subgrid: boolean = false
984
823
 
985
- ### HdsDocsShell
986
- HdsDocsShell — three-region docs shell (left nav rail, content, right TOC rail), driven by grid columns that default to 0 and are set per breakpoint. hds#280 s…
824
+ ### HdsRouterProvider
825
+ Provide a router adapter to all HDS components below. Wrap your app root once.
826
+ - adapter: HdsRouterAdapter
987
827
  - children: ReactNode
988
- - className: string
989
- - leftRail: ReactNode
990
- - rightRail: ReactNode
991
- - style: CSSProperties
992
- - topOffset: string = 0px
993
828
 
994
829
  ### HdsThemeProvider
995
830
  Renders a `data-hds` scope wrapper that carries the four theming dials as root attributes + CSS vars, and exposes them to `useHdsTheme()`.
@@ -1003,25 +838,6 @@ Renders a `data-hds` scope wrapper that carries the four theming dials as root a
1003
838
  - style: CSSProperties
1004
839
  - theme: 'light' | 'dark'
1005
840
 
1006
- ### HeadingStack
1007
- HeadingStack — enforced vertical rhythm for heading + subheading pairs. Automatically handles gap and secondary color, preventing manual stacking. - Heading le…
1008
- - as: ElementType = div
1009
- - gap: HdsHeadingGap = px8
1010
- - heading: string
1011
- - headingAs: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6'
1012
- - level: HdsHeadingLevel
1013
- - subheading: string
1014
- - subheadingAs: 'p' | 'div' | 'span' = p
1015
-
1016
- ### HoverCard
1017
- HoverCard root + parts. Controlled via `open`/`onOpenChange`, or uncontrolled with `defaultOpen`; tune timing with `openDelay`/`closeDelay`.
1018
- - children: React.ReactNode
1019
- - closeDelay: number
1020
- - defaultOpen: boolean
1021
- - onOpenChange: ((open: boolean) => void)
1022
- - open: boolean
1023
- - openDelay: number
1024
-
1025
841
  ### Icon
1026
842
  Icon — semantic icon wrapper for Lucide icons.
1027
843
  - aria-hidden: boolean | "true" | "false" = true
@@ -1032,22 +848,6 @@ Icon — semantic icon wrapper for Lucide icons.
1032
848
  - style: CSSProperties
1033
849
  - weight: "fill" | "bold" | "light" | "thin" | "regular" | "duotone"
1034
850
 
1035
- ### IconButton
1036
- IconButton ” icon-only action trigger built on the shared Button primitive.
1037
- - aria-label: string
1038
- - asChild: boolean
1039
- - disabled: boolean
1040
- - icon: LucideIcon
1041
- - iconColor: string
1042
- - iconLeft: ReactNode
1043
- - iconRight: ReactNode
1044
- - iconSize: IconSize
1045
- - label: string
1046
- - loading: boolean
1047
- - size: "sm" | "md" | "lg"
1048
- - tone: "neutral" | "danger" | "success" | "warning" | "info" | null
1049
- - variant: "primary" | "secondary" | "tertiary" | null
1050
-
1051
851
  ### InlineCode
1052
852
  InlineCode — inline code chip for token paths, file paths, and code-adjacent prose.
1053
853
  - children: ReactNode
@@ -1073,34 +873,17 @@ Input — text field primitive with label, helper, and error slots.
1073
873
  - label: string
1074
874
  - leadingVisual: ReactNode
1075
875
  - loading: boolean = false
876
+ - prefix: ReactNode
1076
877
  - size: InputSize = md
878
+ - suffix: ReactNode
1077
879
  - textStyle: "body" | "mono" = body
1078
880
  - trailingVisual: ReactNode
1079
- - type: 'text' | 'email' | 'password' | 'search' | 'tel' | 'url' | 'number' = text
1080
-
1081
- ### InputGroup
1082
- A single-line input with optional `leading`/`trailing` adornments.
1083
- - className: string
1084
- - leading: ReactNode
1085
- - size: "sm" | "md" | "lg" | null
1086
- - trailing: ReactNode
881
+ - type: 'text' | 'email' | 'password' | 'search' | 'tel' | 'url' | 'number' | 'date' | … = text
1087
882
 
1088
883
  ### Kbd
1089
884
  Renders a keyboard key or shortcut token, e.g. `<Kbd>⌘K</Kbd>`.
1090
885
  - size: "sm" | "md" | "lg" | null
1091
886
 
1092
- ### Lightbox
1093
- Lightbox — full-bleed image viewer built on Radix Dialog. Full-bleed image viewer built on Radix Dialog (raw primitives, not the card `Dialog` wrapper — a ligh…
1094
- - alt: string
1095
- - caption: string
1096
- - captionHref: string
1097
- - captionLabel: string
1098
- - naturalHeight: number
1099
- - naturalWidth: number
1100
- - onClose: () => void
1101
- - open: boolean
1102
- - src: string
1103
-
1104
887
  ### Menu
1105
888
  Menu root + parts. Controlled via `open`/`onOpenChange`, or uncontrolled with `defaultOpen`.
1106
889
  - children: React.ReactNode
@@ -1128,44 +911,6 @@ One metric tile: eyebrow label, `heading2` value, caption sub line, on a raised
1128
911
  A row of `MetricTile`s. The grid has `min(tiles, 4)` columns, so three tiles fill three columns and never leave an empty fourth. The default for any row of hea…
1129
912
  - children: ReactNode
1130
913
 
1131
- ### MultiSelector
1132
- MultiSelector — multi-select dropdown composing the existing Popover with a checkbox option list, so choosing several values from a fixed set reads as one over…
1133
- - className: string
1134
- - disabled: boolean = false
1135
- - onChange: (next: string[]) => void
1136
- - options: MultiSelectorOption[]
1137
- - placeholder: string = Select…
1138
- - value: string[]
1139
-
1140
- ### NavGroup
1141
- NavGroup - labeled navigation group for stacks of nav items.
1142
- - children: ReactNode
1143
- - className: string
1144
- - collapsible: boolean = false
1145
- - contentStyle: CSSProperties
1146
- - getExact: ((item: NavItem) => boolean)
1147
- - items: NavItem[]
1148
- - label: string
1149
- - level: NavLevel = section
1150
- - onNavigate: (() => void)
1151
- - style: CSSProperties
1152
- - variant: 'side' | 'toc' = side
1153
-
1154
- ### NavItem
1155
- NavItem - navigation row primitive for sidebars, table of contents, and list navigation.
1156
- - active: boolean = false
1157
- - disabled: boolean = false
1158
- - label: string
1159
- - level: NavLevel = root
1160
- - onNavigate: ((event: MouseEvent<HTMLAnchorElement, MouseEvent>) => void)
1161
- - variant: NavVariant = side
1162
-
1163
- ### OverflowList
1164
- Renders up to `max` children followed by a `+N` overflow chip (or custom node).
1165
- - children: ReactNode
1166
- - max: number
1167
- - renderOverflow: ((count: number) => ReactNode)
1168
-
1169
914
  ### Page
1170
915
  Page — standard page shell. Wraps page content in Container (width constraint) and applies the canonical vertical padding so content breathes against the viewp…
1171
916
  - children: ReactNode
@@ -1207,10 +952,13 @@ Popover root + parts. Controlled via `open`/`onOpenChange`, or uncontrolled with
1207
952
  - open: boolean
1208
953
 
1209
954
  ### Progress
1210
- Linear progress. Determinate when `value` is a number, else indeterminate.
955
+ Linear bar or circular ring. Determinate when `value` is a number, else indeterminate.
1211
956
  - label: string = Progress
957
+ - max: number = 100
1212
958
  - size: "sm" | "md" | "lg" | null
959
+ - tone: "success" | "danger" | "warning" | "info" | "neutral" = neutral
1213
960
  - value: number | null = null
961
+ - variant: "linear" | "circular" = linear
1214
962
 
1215
963
  ### Radio
1216
964
  Radio — radio button with animated selection indicator.
@@ -1241,30 +989,16 @@ SegmentedControl " segmented selection input for compact mutually-exclusive choi
1241
989
 
1242
990
  ### Select
1243
991
  Select — dropdown selector built on Radix Select (ADR-001 Radix convention). Radix owns the listbox a11y contract: managed focus + active-descendant, typeahead…
992
+ - aria-describedby: string
993
+ - aria-invalid: boolean
1244
994
  - container: HTMLElement | null
995
+ - id: string
1245
996
  - label: string
1246
997
  - onChange: (v: string) => void
1247
998
  - options: { value: string; label: string; }[]
1248
999
  - showLabel: boolean = true
1249
1000
  - value: string
1250
1001
 
1251
- ### SelectableCard
1252
- A card-shaped single checkbox — click or activate to toggle selection.
1253
- - disabled: boolean
1254
- - onSelectedChange: ((selected: boolean) => void)
1255
- - selected: boolean = false
1256
-
1257
- ### SideNav
1258
- SideNav - sidebar navigation row primitive. Two levels: root — top-level section link. Full-width row using the shared nav label type style. nested — child pag…
1259
- - active: boolean = false
1260
- - disabled: boolean = false
1261
- - href: string
1262
- - indent: number | boolean = 0
1263
- - label: string
1264
- - level: 'root' | 'nested' = nested
1265
- - onNavigate: ((event: MouseEvent<HTMLAnchorElement, MouseEvent>) => void)
1266
- - titleLabel: boolean = false
1267
-
1268
1002
  ### Sidebar
1269
1003
  Sidebar — fixed-width rail beside fluid content, no media query. Every Layout reference: https://every-layout.dev/layouts/sidebar/
1270
1004
  - as: ElementType<any, keyof IntrinsicElements> = div
@@ -1279,15 +1013,9 @@ Sidebar — fixed-width rail beside fluid content, no media query. Every Layout
1279
1013
  ### Skeleton
1280
1014
  Decorative loading placeholder. Marked aria-hidden — announce the loading state on the surrounding region (e.g. aria-busy) rather than per skeleton.
1281
1015
  - height: string | number
1282
- - variant: "text" | "rectangular" | "circular" | null = rectangular
1016
+ - variant: "text" | "circular" | "rectangular" | null = rectangular
1283
1017
  - width: string | number
1284
1018
 
1285
- ### Sketch
1286
- Sketch — shared shell for generative canvases and WebGL sketches.
1287
- - children: ReactNode
1288
- - controls: ReactNode
1289
- - title: string
1290
-
1291
1019
  ### Slider
1292
1020
  Slider — range slider with label and value display.
1293
1021
  - label: string
@@ -1314,28 +1042,18 @@ Stack — one-dimensional layout primitive.
1314
1042
  - style: CSSProperties
1315
1043
  - wrap: FlexWrap
1316
1044
 
1317
- ### StackedCardRail
1318
- StackedCardRail — horizontally-scrolling stacked card carousel. Scroll mechanism: vertical scroll on an absolutely-positioned inner container is mapped to hori…
1319
- - cards: StackedCardRailCard[]
1320
-
1321
1045
  ### Stat
1322
1046
  Headline metric — large value, uppercase caption label, optional sub-line.
1323
1047
  - label: string
1324
1048
  - sub: ReactNode
1325
- - tone: "neutral" | "danger" | "success" | "warning" | "info" | null
1049
+ - tone: "success" | "danger" | "warning" | "info" | "neutral" | null
1326
1050
  - value: ReactNode
1327
1051
 
1328
- ### StatusDot
1329
- A small solid dot conveying a semantic status via `tone`.
1330
- - label: string
1331
- - size: "sm" | "md" | "lg" | null
1332
- - tone: "neutral" | "danger" | "success" | "warning" | "info" | "inProgress" | null
1333
-
1334
1052
  ### StatusListItem
1335
1053
  Status dot + title row with optional muted notes and trailing slot (e.g. badge).
1336
1054
  - notes: ReactNode[]
1337
1055
  - title: ReactNode
1338
- - tone: "neutral" | "danger" | "success" | "warning" | "info" | null
1056
+ - tone: "success" | "danger" | "warning" | "info" | "neutral" | null
1339
1057
  - trailing: ReactNode
1340
1058
 
1341
1059
  ### StatusTile
@@ -1345,23 +1063,6 @@ Block-layout sibling of StatusListItem. Renders a raised surface tile with title
1345
1063
  - tone: 'success' | 'warning' | 'danger' | 'info' | 'neutral' = neutral
1346
1064
  - trailing: ReactNode
1347
1065
 
1348
- ### Stepper
1349
- Step indicator for multi-step flows. Purely presentational — no navigation.
1350
- - activeStep: number
1351
- - orientation: "horizontal" | "vertical" = horizontal
1352
- - steps: Step[]
1353
-
1354
- ### StepperField
1355
- StepperField ” numeric input with decrement/increment controls. Classification baseline: Material Design, Chakra UI, and Ant Design treat steppers as numeric i…
1356
- - inputStep: number
1357
- - label: string
1358
- - max: number
1359
- - min: number
1360
- - onChange: (value: number) => void
1361
- - precision: number
1362
- - step: number
1363
- - value: number
1364
-
1365
1066
  ### Surface
1366
1067
  Surface — governed inset surface primitive. Enforces the "Surface Inset" rule: backgrounds MUST have internal padding. - Default padding: px24 (cards) | px16 (…
1367
1068
  - as: ElementType<any, keyof IntrinsicElements> = div
@@ -1429,24 +1130,12 @@ Tag — interactive filter and category chip. The outer <button> carries the acc
1429
1130
 
1430
1131
  ### Text
1431
1132
  Text — polymorphic typography primitive spanning the full HDS type ramp.
1432
- - as: "symbol" | "object" | "map" | "filter" | "title" | "a" | "button" | "div" | "fo… = defaultTagMap[variant]
1133
+ - as: "symbol" | "object" | "title" | "a" | "button" | "div" | "form" | "h2" | "h3" |… = defaultTagMap[variant]
1433
1134
  - children: ReactNode
1434
1135
  - className: string
1435
1136
  - style: CSSProperties
1436
1137
  - variant: TextVariant
1437
1138
 
1438
- ### TextLockup
1439
- TextLockup - governed title-and-description pairing primitive.
1440
- - align: 'left' | 'center' = left
1441
- - as: ElementType = div
1442
- - description: ReactNode
1443
- - descriptionAs: 'div' | 'p' | 'span' = div
1444
- - eyebrow: string
1445
- - id: string
1446
- - size: 'hero' | 'heroXl' | 'section' | 'metric' | 'detail' | 'numbered'
1447
- - title: string
1448
- - titleAs: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'p' | 'span'
1449
-
1450
1139
  ### Textarea
1451
1140
  Textarea — multi-line text field primitive with label, helper, and error slots. Mirrors Input's shell + token skin as a native `<textarea>`. Figma parity: the …
1452
1141
  - className: string
@@ -1458,15 +1147,6 @@ Textarea — multi-line text field primitive with label, helper, and error slots
1458
1147
  - resize: TextareaResize = vertical
1459
1148
  - textareaClassName: string
1460
1149
 
1461
- ### TileGrid
1462
- Auto-fill responsive grid for status/micro tiles. Wraps tile children in a one-line grid declaration so pages don't repeat the auto-fill minmax recipe.
1463
- - gap: "sm" | "md" | "xs" = sm
1464
- - minTileWidth: string = 260px
1465
-
1466
- ### TimeInput
1467
- A native time field skinned with HDS input chrome. Value is a `HH:mm` string.
1468
- - size: "sm" | "md" | "lg" | null
1469
-
1470
1150
  ### Timestamp
1471
1151
  Presents a date/time with a machine-readable `dateTime` for accessibility.
1472
1152
  - date: string | number | Date
@@ -1486,54 +1166,6 @@ Toggle — boolean on/off toggle with animated thumb.
1486
1166
  - label: string
1487
1167
  - onChange: (v: boolean) => void
1488
1168
 
1489
- ### ToggleButton
1490
- A single two-state toggle button exposing a native `aria-pressed` contract — use for one independent on/off control such as bold, mute, or pin.
1491
- - asChild: boolean
1492
- - defaultPressed: boolean
1493
- - onPressedChange: ((pressed: boolean) => void)
1494
- - pressed: boolean
1495
- - size: "sm" | "md" | "lg" | null
1496
- - variant: "secondary" | "ghost" | null
1497
-
1498
- ### Token
1499
- Token - reflective token specimen for unified node-based token views. The `variant` axis (node | diagram — diagram is a deprecated alias that resolves to the s…
1500
- - accentColor: string
1501
- - aria-label: string
1502
- - className: string
1503
- - description: ReactNode
1504
- - fullWidth: boolean
1505
- - isSelected: boolean
1506
- - isSourceNode: boolean
1507
- - label: string
1508
- - leadingSlot: ReactNode
1509
- - nodeRef: ((el: HTMLElement | null) => void)
1510
- - nowrap: boolean
1511
- - onClick: (() => void) | (() => void)
1512
- - pathDisplayDepth: number
1513
- - pathDisplayLeadingDot: boolean
1514
- - pathDisplayMode: "full" | "compressed"
1515
- - rawValue: ReactNode
1516
- - swatchVar: string
1517
- - tokenPath: string
1518
- - truncateFromStart: boolean
1519
- - value: string
1520
- - variant: "node" | "diagram"
1521
-
1522
- ### Tokenizer
1523
- A bordered field of Tag chips followed by a text input for adding more.
1524
- - className: string
1525
- - disabled: boolean
1526
- - onChange: (next: string[]) => void
1527
- - placeholder: string
1528
- - value: string[]
1529
-
1530
- ### Toolbar
1531
- Toolbar root. Groups related controls with a single roving tab-stop. Supports the native `orientation` prop (`horizontal` | `vertical`).
1532
- - asChild: boolean
1533
- - dir: ("ltr" | "rtl")
1534
- - loop: boolean
1535
- - orientation: "horizontal" | "vertical"
1536
-
1537
1169
  ### Tooltip
1538
1170
  Tooltip root. Bakes in the Radix Provider so a single `<Tooltip>` is self-contained — no app-level provider required. Controlled via `open`/`onOpenChange`, or …
1539
1171
  - children: React.ReactNode
@@ -1543,19 +1175,6 @@ Tooltip root. Bakes in the Radix Provider so a single `<Tooltip>` is self-contai
1543
1175
  - onOpenChange: ((open: boolean) => void)
1544
1176
  - open: boolean
1545
1177
 
1546
- ### TopNav
1547
- Top navigation bar with brand, nav, and trailing action slots.
1548
- - brand: ReactNode
1549
- - children: ReactNode
1550
- - sticky: boolean
1551
- - trailing: ReactNode
1552
-
1553
- ### TreeList
1554
- Renders a hierarchical `role="tree"` list; nodes with children get an expand/collapse toggle.
1555
- - defaultExpandedIds: string[]
1556
- - items: TreeNode[]
1557
- - onSelect: ((id: string) => void)
1558
-
1559
1178
  ### VisuallyHidden
1560
1179
  Renders its children off-screen (Tailwind `sr-only`) so they are announced by screen readers without occupying visual space — e.g. a text label for an icon-onl…
1561
1180
  - as: ElementType<any, keyof IntrinsicElements> = span