@hirobius/design-system 0.19.1 → 0.21.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 (175) hide show
  1. package/AGENTS.md +123 -0
  2. package/CONSUMING.md +11 -6
  3. package/DESIGN.md +34 -21
  4. package/NOTICE.md +1 -1
  5. package/README.md +48 -13
  6. package/codemods/hds-prefix.mjs +231 -0
  7. package/codemods/jsx-fold.mjs +515 -0
  8. package/codemods/not-found-pattern.mjs +71 -0
  9. package/codemods/patterns-subpath.mjs +242 -81
  10. package/codemods/patterns-subpath.names.json +41 -15
  11. package/codemods/removed-0.20.json +194 -0
  12. package/codemods/tile-grid.mjs +283 -0
  13. package/codemods/unrewritable.mjs +291 -0
  14. package/dist/chunks/DemoStateContext-Cz5TmrYu.js +32 -0
  15. package/dist/chunks/empty-state-DNoThgfV.js +1227 -0
  16. package/dist/chunks/form-By82qZcC.js +66 -0
  17. package/dist/contexts.js +157 -78
  18. package/dist/fonts/geist-mono-400.woff2 +0 -0
  19. package/dist/fonts/satoshi-400.woff2 +0 -0
  20. package/dist/fonts/satoshi-500.woff2 +0 -0
  21. package/dist/fonts/satoshi-700.woff2 +0 -0
  22. package/dist/fonts.css +53 -0
  23. package/dist/form.js +1 -1
  24. package/dist/hirobius-ui.js +1600 -5354
  25. package/dist/manifest.js +12 -13
  26. package/dist/patterns.js +796 -510
  27. package/dist/styles.css +2 -2
  28. package/dist/tokens.css +1 -1
  29. package/dist/tokens.js +165 -65
  30. package/dist/types/src/app/components/alert-dialog.d.ts +5 -0
  31. package/dist/types/src/app/components/asset-img.d.ts +1 -0
  32. package/dist/types/src/app/components/avatar-group.d.ts +2 -2
  33. package/dist/types/src/app/components/badge.d.ts +8 -3
  34. package/dist/types/src/app/components/blockquote.d.ts +2 -2
  35. package/dist/types/src/app/components/box-sx.d.ts +110 -13
  36. package/dist/types/src/app/components/box.d.ts +6 -3
  37. package/dist/types/src/app/components/breadcrumb.d.ts +0 -5
  38. package/dist/types/src/app/components/button.d.ts +35 -4
  39. package/dist/types/src/app/components/card.d.ts +10 -10
  40. package/dist/types/src/app/components/combobox.d.ts +47 -11
  41. package/dist/types/src/app/components/container.d.ts +2 -2
  42. package/dist/types/src/app/components/data-table-section.d.ts +2 -1
  43. package/dist/types/src/app/components/destructive-section.d.ts +1 -0
  44. package/dist/types/src/app/components/dialog.d.ts +8 -1
  45. package/dist/types/src/app/components/disclosure.d.ts +1 -5
  46. package/dist/types/src/app/components/error-pattern.d.ts +6 -1
  47. package/dist/types/src/app/components/field.d.ts +1 -2
  48. package/dist/types/src/app/components/form-actions.d.ts +1 -0
  49. package/dist/types/src/app/components/form-control.d.ts +10 -0
  50. package/dist/types/src/app/components/grid.d.ts +15 -6
  51. package/dist/types/src/app/components/hds-tooltip.d.ts +12 -2
  52. package/dist/types/src/app/components/icon.d.ts +1 -0
  53. package/dist/types/src/app/components/inline-code.d.ts +1 -2
  54. package/dist/types/src/app/components/input.d.ts +8 -5
  55. package/dist/types/src/app/components/kbd.d.ts +2 -2
  56. package/dist/types/src/app/components/metadata-list.d.ts +2 -2
  57. package/dist/types/src/app/components/metric-tiles.d.ts +1 -0
  58. package/dist/types/src/app/components/page-header.d.ts +0 -2
  59. package/dist/types/src/app/components/popover.d.ts +8 -0
  60. package/dist/types/src/app/components/progress.d.ts +33 -6
  61. package/dist/types/src/app/components/segmented-control.d.ts +2 -26
  62. package/dist/types/src/app/components/select.d.ts +10 -1
  63. package/dist/types/src/app/components/skeleton.d.ts +3 -4
  64. package/dist/types/src/app/components/spinner.d.ts +1 -2
  65. package/dist/types/src/app/components/stack.d.ts +4 -1
  66. package/dist/types/src/app/components/stat.d.ts +5 -5
  67. package/dist/types/src/app/components/status-list-item.d.ts +1 -2
  68. package/dist/types/src/app/components/status-tile.d.ts +3 -2
  69. package/dist/types/src/app/components/surface.d.ts +2 -3
  70. package/dist/types/src/app/components/switcher.d.ts +1 -1
  71. package/dist/types/src/app/components/table.d.ts +6 -15
  72. package/dist/types/src/app/components/tag.d.ts +0 -6
  73. package/dist/types/src/app/components/text.d.ts +54 -8
  74. package/dist/types/src/app/components/textarea.d.ts +1 -2
  75. package/dist/types/src/app/components/timestamp.d.ts +1 -0
  76. package/dist/types/src/app/components/toast.d.ts +1 -2
  77. package/dist/types/src/app/components/tooltip.d.ts +1 -1
  78. package/dist/types/src/app/context/DemoStateContext.d.ts +1 -1
  79. package/dist/types/src/app/context/RouterContext.d.ts +5 -5
  80. package/dist/types/src/app/data/manifest-types.d.ts +10 -5
  81. package/dist/types/src/app/design-system/generated-token-refs.d.ts +45 -28
  82. package/dist/types/src/app/design-system/generated-token-values.d.ts +4 -0
  83. package/dist/types/src/app/design-system/tokens.d.ts +139 -18
  84. package/dist/types/src/icons.d.ts +1 -1
  85. package/dist/types/src/index.d.ts +76 -164
  86. package/dist/types/src/patterns.d.ts +20 -25
  87. package/dist/variables.css +47 -33
  88. package/docs/CONSUMING.md +80 -48
  89. package/hirobius.tokens.json +125 -88
  90. package/llms.txt +166 -59
  91. package/mcp/catalog.mjs +366 -0
  92. package/mcp/guide.mjs +315 -0
  93. package/mcp/hds-mcp.mjs +49 -0
  94. package/mcp/server.mjs +94 -0
  95. package/package.json +48 -27
  96. package/public/hds-manifest.json +2667 -6705
  97. package/public/llms/components.txt +45 -426
  98. package/public/llms/layout.txt +5 -5
  99. package/public/llms-full.txt +245 -506
  100. package/public/llms.txt +166 -59
  101. package/scripts/eslint-plugin-hds/index.d.mts +29 -0
  102. package/scripts/eslint-plugin-hds/index.mjs +55 -0
  103. package/scripts/eslint-plugin-hds/package.json +30 -0
  104. package/scripts/eslint-plugin-hds/rules/no-raw-controls.mjs +47 -0
  105. package/scripts/eslint-plugin-hds/rules/no-raw-hex.mjs +70 -0
  106. package/scripts/eslint-plugin-hds/rules/no-raw-px-spacing.mjs +125 -0
  107. package/scripts/eslint-plugin-hds/rules/prefer-hds-layout-primitive.mjs +54 -0
  108. package/scripts/eslint-plugin-hds/rules/sx-token-first.mjs +111 -0
  109. package/scripts/eslint-plugin-hds/rules/utils.mjs +66 -0
  110. package/src/app/data/component-api.json +1082 -2913
  111. package/dist/chunks/LanguageContext-BxdCwiFg.js +0 -95
  112. package/dist/chunks/TokenDisplayContext-DKYJMVWk.js +0 -26
  113. package/dist/chunks/activity-feed-BGQ6v3wc.js +0 -22040
  114. package/dist/chunks/form-COP3vK9_.js +0 -66
  115. package/dist/types/src/app/components/activity-feed.d.ts +0 -73
  116. package/dist/types/src/app/components/app-shell.d.ts +0 -40
  117. package/dist/types/src/app/components/aspect-ratio.d.ts +0 -25
  118. package/dist/types/src/app/components/bleed.d.ts +0 -39
  119. package/dist/types/src/app/components/button-group.d.ts +0 -22
  120. package/dist/types/src/app/components/calendar.d.ts +0 -22
  121. package/dist/types/src/app/components/carousel.d.ts +0 -26
  122. package/dist/types/src/app/components/center.d.ts +0 -36
  123. package/dist/types/src/app/components/cinematic-link.d.ts +0 -18
  124. package/dist/types/src/app/components/circular-progress.d.ts +0 -28
  125. package/dist/types/src/app/components/cluster.d.ts +0 -39
  126. package/dist/types/src/app/components/command-palette.d.ts +0 -46
  127. package/dist/types/src/app/components/component-instance-matrix.d.ts +0 -27
  128. package/dist/types/src/app/components/context-menu.d.ts +0 -78
  129. package/dist/types/src/app/components/cover.d.ts +0 -43
  130. package/dist/types/src/app/components/date-input.d.ts +0 -31
  131. package/dist/types/src/app/components/date-range-input.d.ts +0 -34
  132. package/dist/types/src/app/components/date-time-input.d.ts +0 -30
  133. package/dist/types/src/app/components/doc-link-card.d.ts +0 -32
  134. package/dist/types/src/app/components/error-boundary.d.ts +0 -25
  135. package/dist/types/src/app/components/file-input.d.ts +0 -30
  136. package/dist/types/src/app/components/foundation-swatch.d.ts +0 -45
  137. package/dist/types/src/app/components/frame.d.ts +0 -38
  138. package/dist/types/src/app/components/heading-stack.d.ts +0 -52
  139. package/dist/types/src/app/components/history-card.d.ts +0 -12
  140. package/dist/types/src/app/components/hover-card.d.ts +0 -46
  141. package/dist/types/src/app/components/icon-button.d.ts +0 -22
  142. package/dist/types/src/app/components/image-lightbox.d.ts +0 -14
  143. package/dist/types/src/app/components/input-group.d.ts +0 -23
  144. package/dist/types/src/app/components/multi-selector.d.ts +0 -40
  145. package/dist/types/src/app/components/nav-group.d.ts +0 -29
  146. package/dist/types/src/app/components/nav-item.d.ts +0 -33
  147. package/dist/types/src/app/components/not-found-pattern.d.ts +0 -1
  148. package/dist/types/src/app/components/overflow-list.d.ts +0 -21
  149. package/dist/types/src/app/components/selectable-card.d.ts +0 -29
  150. package/dist/types/src/app/components/side-nav.d.ts +0 -23
  151. package/dist/types/src/app/components/sketch.d.ts +0 -19
  152. package/dist/types/src/app/components/stacked-card-rail.d.ts +0 -32
  153. package/dist/types/src/app/components/status-dot.d.ts +0 -25
  154. package/dist/types/src/app/components/stepper-field.d.ts +0 -12
  155. package/dist/types/src/app/components/stepper.d.ts +0 -33
  156. package/dist/types/src/app/components/text-lockup.d.ts +0 -38
  157. package/dist/types/src/app/components/tile-grid.d.ts +0 -17
  158. package/dist/types/src/app/components/time-input.d.ts +0 -24
  159. package/dist/types/src/app/components/toggle-button.d.ts +0 -32
  160. package/dist/types/src/app/components/token.d.ts +0 -90
  161. package/dist/types/src/app/components/tokenUtils.d.ts +0 -38
  162. package/dist/types/src/app/components/tokenizer.d.ts +0 -24
  163. package/dist/types/src/app/components/toolbar.d.ts +0 -36
  164. package/dist/types/src/app/components/top-nav.d.ts +0 -23
  165. package/dist/types/src/app/components/tree-list.d.ts +0 -30
  166. package/dist/types/src/app/data/nav-model.d.ts +0 -39
  167. package/dist/types/src/app/hooks/useFocusVisible.d.ts +0 -9
  168. package/dist/types/src/app/layouts/CaseStudyLayout.d.ts +0 -20
  169. package/dist/types/src/app/layouts/DocLayout.d.ts +0 -14
  170. package/dist/types/src/app/layouts/EmbeddedDocLayoutContext.d.ts +0 -6
  171. package/dist/types/src/app/layouts/HdsDocsShell.d.ts +0 -72
  172. package/dist/types/src/app/layouts/HdsSystemDocLayout.d.ts +0 -14
  173. package/dist/types/src/app/lib/hds-search.d.ts +0 -45
  174. package/dist/types/src/app/lib/nav-active.d.ts +0 -16
  175. package/dist/types/src/app/lib/navLevels.d.ts +0 -4
@@ -20,10 +20,6 @@ This file intentionally does not embed prop tables or long-form API docs.
20
20
 
21
21
  Compact: name, first line of description, then prop: type = default. Full detail in `src/app/data/component-api.json`.
22
22
 
23
- ### ActivityFeed
24
- ActivityFeed — chronological system event log. Renders a list of activity events using white space as the sole separator. No dividers, no borders between items…
25
- - events: ActivityEvent[] = [ { id: 'evt-001', title: 'File Uploade…
26
-
27
23
  ### Alert
28
24
  Alert - compact feedback surface with contextual severity.
29
25
  - children: ReactNode
@@ -37,11 +33,6 @@ AlertDialog root + parts. Controlled via `open`/`onOpenChange`, or uncontrolled
37
33
  - onOpenChange: ((open: boolean) => void)
38
34
  - open: boolean
39
35
 
40
- ### AspectRatio
41
- 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.
42
- - asChild: boolean
43
- - ratio: number = 1
44
-
45
36
  ### AssetImg
46
37
  AssetImg - responsive asset frame with fallback placeholder handling. Contexts: default, lightbox, and detail.
47
38
  - alt: string
@@ -79,16 +70,10 @@ Renders up to `max` overlapping avatars followed by a `+N` overflow chip.
79
70
  ### Badge
80
71
  Compact metadata/status chip. Tone is the only styling input.
81
72
  - as: ElementType<any, keyof IntrinsicElements> = span
82
- - tone: "neutral" | "danger" | "success" | "warning" | "info" | "inProgress" | null
83
-
84
- ### Bleed
85
- Bleed — controlled negative-margin full-bleed within a padded container. Every Layout reference: https://every-layout.dev/layouts/the-stack/ (bleed is the inve…
86
- - amount: 'tight' | 'normal' | 'inset' | 'spacious' = normal
87
- - as: ElementType<any, keyof IntrinsicElements> = div
88
- - axis: 'x' | 'y' | 'both' = x
89
- - children: ReactNode
90
- - className: string
91
- - style: CSSProperties
73
+ - dot: boolean = false
74
+ - label: string
75
+ - size: "sm" | "md" | "lg"
76
+ - tone: "success" | "danger" | "warning" | "info" | "neutral" | "inProgress" | null
92
77
 
93
78
  ### Blockquote
94
79
  A quoted passage; pass `cite` for the source URL and `attribution` for a byline.
@@ -109,23 +94,19 @@ Breadcrumb trail. Links route through the HDS router seam (plain anchors with no
109
94
  ### Button
110
95
  Triggers an action when activated.
111
96
  - asChild: boolean = false
97
+ - defaultPressed: boolean
112
98
  - disabled: boolean
113
99
  - iconLeft: ReactNode
114
100
  - iconOnly: boolean = false
115
101
  - iconRight: ReactNode
116
102
  - label: string
117
103
  - loading: boolean = false
104
+ - onPressedChange: ((pressed: boolean) => void)
105
+ - pressed: boolean
118
106
  - size: "sm" | "md" | "lg" | null
119
- - tone: "neutral" | "danger" | "success" | "warning" | "info" | null
107
+ - tone: "success" | "danger" | "warning" | "info" | "neutral" | null
120
108
  - variant: "primary" | "secondary" | "tertiary" | null
121
109
 
122
- ### ButtonGroup
123
- Groups Button (or button-like) children into a single attached segment.
124
- - orientation: "horizontal" | "vertical" | null
125
-
126
- ### Calendar
127
- Renders an accessible month grid; compose it inside a Popover for the date inputs.
128
-
129
110
  ### Callout
130
111
  Tone-driven side-rule callout for status, quotes, hypotheses.
131
112
  - italic: boolean = false
@@ -137,7 +118,10 @@ Tagged per-export, not on the file block: this module exports eight components a
137
118
  - bordered: boolean = false
138
119
  - gap: GapOption = tight
139
120
  - noPadding: boolean = false
121
+ - onSelectedChange: ((selected: boolean) => void)
140
122
  - padding: PaddingOption = component
123
+ - selectable: boolean = false
124
+ - selected: boolean = false
141
125
  - tone: 'neutral' | 'danger' | 'success' | 'warning' | 'info' = neutral
142
126
  - variant: 'default' | 'accent' = default
143
127
 
@@ -155,7 +139,7 @@ Card — surface container with slot anatomy (12d-card-anatomy). Slot anatomy (D
155
139
  - metadata: ReactNode
156
140
 
157
141
  ### CardMetric
158
- Card.Metric — one uppercase label, a large value and an optional sub-line inside a Card.
142
+ Card.Metric — one label, a large value and an optional sub-line inside a Card.
159
143
  - label: ReactNode
160
144
  - sub: ReactNode
161
145
  - tone: 'neutral' | 'danger' | 'success' | 'warning' | 'info' = neutral
@@ -171,21 +155,6 @@ Card — surface container with slot anatomy (12d-card-anatomy). Slot anatomy (D
171
155
  ### CardTitle
172
156
  Card — surface container with slot anatomy (12d-card-anatomy). Slot anatomy (DESIGN.md §"Card Anatomy"). Status, progress, and metadata are layout-bearing — th…
173
157
 
174
- ### Carousel
175
- Renders children as a snap-scrolling track with Prev/Next scroll buttons.
176
- - ariaLabel: string = Carousel
177
- - children: ReactNode
178
- - showControls: boolean = true
179
-
180
- ### Center
181
- Center — max-width column, auto-centered horizontally. Every Layout reference: https://every-layout.dev/layouts/center/
182
- - as: ElementType<any, keyof IntrinsicElements> = div
183
- - children: ReactNode
184
- - className: string
185
- - gutter: 'tight' | 'normal' | 'inset' | 'spacious'
186
- - maxWidth: 'content' | 'max' = content
187
- - style: CSSProperties
188
-
189
158
  ### Checkbox
190
159
  Checkbox — custom-drawn checkbox with check / indeterminate glyph.
191
160
  - checked: boolean
@@ -193,30 +162,6 @@ Checkbox — custom-drawn checkbox with check / indeterminate glyph.
193
162
  - label: string
194
163
  - onChange: (v: boolean) => void
195
164
 
196
- ### CinematicLink
197
- CinematicLink - cinematic editorial link treatment for portfolio surfaces.
198
- - children: string
199
- - href: string
200
-
201
- ### CircularProgress
202
- A circular progress ring; pass `value`/`max` or set `indeterminate`.
203
- - indeterminate: boolean = false
204
- - label: string
205
- - max: number = 100
206
- - size: "sm" | "md" | "lg" = md
207
- - tone: "neutral" | "danger" | "success" | "warning" | "info" | null
208
- - value: number = 0
209
-
210
- ### Cluster
211
- Cluster — wrapping horizontal group with even gaps. Every Layout reference: https://every-layout.dev/layouts/cluster/
212
- - align: 'start' | 'center' | 'end' | 'stretch' = center
213
- - as: ElementType<any, keyof IntrinsicElements> = div
214
- - children: ReactNode
215
- - className: string
216
- - gap: 'tight' | 'normal' | 'inset' | 'spacious' = tight
217
- - justify: 'start' | 'center' | 'end' | 'space-between' = start
218
- - style: CSSProperties
219
-
220
165
  ### CodeBlock
221
166
  CodeBlock - code display with copy button and optional collapsible toggle.
222
167
  - className: string
@@ -229,32 +174,20 @@ CodeBlock - code display with copy button and optional collapsible toggle.
229
174
  - variant: "inline" | "block" = block
230
175
 
231
176
  ### Combobox
232
- Combobox — searchable single-select (Popover + filtered listbox). A select-with-search built on the HDS Popover. The trigger shows the current selection; openi…
177
+ Combobox — searchable single- or multi-select (Popover + filtered listbox). A select-with-search built on the HDS Popover. The trigger shows the current select…
178
+ - aria-describedby: string
179
+ - aria-invalid: boolean
233
180
  - aria-label: string
234
181
  - className: string
235
182
  - disabled: boolean = false
236
183
  - emptyMessage: string = No results
237
- - onChange: (value: string) => void
184
+ - id: string
185
+ - multiple: boolean
186
+ - onChange: ((value: string) => void) | ((value: string[]) => void)
238
187
  - options: ComboboxOption[]
239
188
  - placeholder: string = Select…
240
189
  - searchPlaceholder: string = Search…
241
- - value: string | null
242
-
243
- ### CommandPalette
244
- Mountable trigger + dialog. Drop into header slot; component manages its own open state and Cmd-K / Ctrl-K global keybinding.
245
- - className: string
246
-
247
- ### ComponentInstanceMatrix
248
- ComponentInstanceMatrix — responsive specimen matrix for variant and state parity.
249
- - componentName: string
250
- - dimensionX: string
251
- - dimensionY: string
252
- - freezeRowState: boolean = false
253
- - isMobile: boolean
254
- - renderInstance: (rowKey: string, columnKey: string) => ReactNode
255
- - rowLabelTone: "primary" | "secondary" = primary
256
- - rowLabelWidth: number = 120
257
- - title: string
190
+ - value: string | readonly string[] | null
258
191
 
259
192
  ### Container
260
193
  Container — semantic width-constrained layout. Centers content horizontally and applies semantic max-width constraints. - maxWidth options: 'content' (760px pr…
@@ -264,67 +197,17 @@ Container — semantic width-constrained layout. Centers content horizontally an
264
197
  - padding: string = var(--semantic-space-surface-padding)
265
198
  - style: CSSProperties
266
199
 
267
- ### ContextMenu
268
- ContextMenu root + parts. Wrap the right-clickable area in `ContextMenu.Trigger`. Controlled via `onOpenChange`.
269
- - children: React.ReactNode
270
- - dir: ("ltr" | "rtl")
271
- - modal: boolean
272
- - onOpenChange: ((open: boolean) => void)
273
- - open: boolean
274
-
275
- ### Cover
276
- Cover — vertical shell with an auto-centered main region. Every Layout reference: https://every-layout.dev/layouts/cover/
277
- - as: ElementType<any, keyof IntrinsicElements> = div
278
- - centerSlot: ReactNode
279
- - children: ReactNode
280
- - className: string
281
- - footer: ReactNode
282
- - gap: 'tight' | 'normal' | 'inset' | 'spacious' = normal
283
- - header: ReactNode
284
- - minHeight: string = 100svh
285
- - style: CSSProperties
286
-
287
200
  ### DataTableSection
288
201
  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…
289
202
  - actionsLabel: string = Actions
290
203
  - columns: TableColumn[]
291
204
  - emptyDescription: ReactNode
292
205
  - emptyTitle: ReactNode = Nothing here yet
293
- - level: 2 | 3 | 4 | 5 | 6 = 2
206
+ - level: 6 | 3 | 4 | 2 | 5 = 2
294
207
  - rows: DataTableSectionRow[]
295
208
  - title: ReactNode
296
209
  - toolbar: ReactNode
297
210
 
298
- ### DateInput
299
- Text field + calendar popover for picking a single date.
300
- - aria-label: string
301
- - disabled: boolean = false
302
- - displayFormat: string = yyyy-MM-dd
303
- - id: string
304
- - onChange: ((date: Date) => void) | undefined
305
- - placeholder: string
306
- - value: Date
307
-
308
- ### DateRangeInput
309
- 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…
310
- - aria-label: string
311
- - disabled: boolean = false
312
- - displayFormat: string = yyyy-MM-dd
313
- - id: string
314
- - numberOfMonths: number = 2
315
- - onChange: ((range: DateRange) => void) | undefined
316
- - placeholder: string = Select date range
317
- - value: DateRange
318
-
319
- ### DateTimeInput
320
- Text date field + calendar popover, paired with a native time field, producing one Date.
321
- - aria-label: string
322
- - dateFormat: string = yyyy-MM-dd
323
- - disabled: boolean = false
324
- - id: string
325
- - onChange: ((date: Date) => void) | undefined
326
- - value: Date
327
-
328
211
  ### DestructiveSection
329
212
  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 …
330
213
  - actionLabel: ReactNode
@@ -332,7 +215,7 @@ Titled danger zone: a title, an explanation, and one danger `Button` that opens
332
215
  - confirmBody: ReactNode
333
216
  - confirmLabel: string
334
217
  - description: ReactNode
335
- - level: 2 | 3 | 4 | 5 | 6 = 2
218
+ - level: 6 | 3 | 4 | 2 | 5 = 2
336
219
  - onConfirm: () => void
337
220
  - title: ReactNode
338
221
 
@@ -410,19 +293,6 @@ Divider — semantic separator between content regions.
410
293
  - strong: boolean
411
294
  - variant: "strong" | "default" | null
412
295
 
413
- ### DocLinkCard
414
- DocLinkCard - navigation card for editorial and documentation cross-links.
415
- - accent: boolean = false
416
- - affordance: "up-right" | "right" | "left" = up-right
417
- - description: string
418
- - disabled: boolean = false
419
- - href: string
420
- - icon: LucideIcon
421
- - meta: string
422
- - metaStyle: "caption" | "ui" = caption
423
- - title: string
424
- - variant: "feature" | "pager" = feature
425
-
426
296
  ### EmptyState
427
297
  EmptyState — consistent no-data placeholder for lists, grids, and sections.
428
298
  - className: string
@@ -434,17 +304,9 @@ Caption label paired with a value — used in metadata grids and read-only forms
434
304
  - children: React.ReactNode
435
305
  - label: string
436
306
  - mono: boolean | null
437
- - tone: "neutral" | "danger" | "success" | "warning" | "info" | null
307
+ - tone: "success" | "danger" | "warning" | "info" | "neutral" | null
438
308
  - value: ReactNode
439
309
 
440
- ### FileInput
441
- A dashed dropzone that opens the native file picker or accepts a drag-and-drop.
442
- - accept: string
443
- - disabled: boolean
444
- - label: ReactNode = Click to upload or drag and drop
445
- - multiple: boolean
446
- - onFiles: ((files: File[]) => void)
447
-
448
310
  ### Form
449
311
  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…
450
312
 
@@ -475,50 +337,23 @@ Presentational label + control slot + helper/error markup. Renders `children` ve
475
337
  - label: string
476
338
  - required: boolean = false
477
339
 
478
- ### FoundationSwatch
479
- FoundationSwatch - governed foundation specimen for color and semantic role previews.
480
- - background: string
481
- - bordered: boolean = false
482
- - details: string[]
483
- - foreground: string = var(--semantic-color-content-primary)
484
- - hidePreviewLabel: boolean = false
485
- - label: string
486
- - note: ReactNode
487
- - previewPosition: 'bottom-left' | 'top-left' | 'center' = center
488
- - specimen: ReactNode
489
- - swatchVar: string
490
- - tokenDisplayPreset: 'depth1' | 'depth2' | 'full' = depth2
491
- - tokenPath: string
492
- - value: string
493
-
494
- ### Frame
495
- Frame — aspect-ratio-locked, token-clipped media box. Every Layout reference: https://every-layout.dev/layouts/frame/
496
- - as: ElementType<any, keyof IntrinsicElements> = div
497
- - children: ReactNode
498
- - className: string
499
- - radius: 'none' | 'sm' | 'md' | 'full' = md
500
- - ratio: number = 16 / 9
501
- - style: CSSProperties
502
-
503
340
  ### Grid
504
341
  Grid — responsive grid composition primitive. Enforces semantic gap and column values. No arbitrary CSS grid. - layout='fixed': responsive base (collapses via …
342
+ - align: "center" | "end" | "start" | "stretch" = start
505
343
  - as: ElementType<any, keyof IntrinsicElements> = div
506
344
  - children: ReactNode
507
345
  - className: string
508
346
  - columns: number = 12
509
- - gap: 'tight' | 'normal' | 'inset' | 'spacious' = inset
510
- - layout: 'fixed' | 'auto-fit' = fixed
347
+ - gap: 'medium' | 'tight' | 'normal' | 'inset' | 'spacious' = inset
348
+ - layout: 'fixed' | 'auto-fit' | 'auto-fill' = fixed
349
+ - minItemWidth: string
511
350
  - style: CSSProperties
512
351
  - subgrid: boolean = false
513
352
 
514
- ### HdsDocsShell
515
- 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…
353
+ ### HdsRouterProvider
354
+ Provide a router adapter to all HDS components below. Wrap your app root once.
355
+ - adapter: HdsRouterAdapter
516
356
  - children: ReactNode
517
- - className: string
518
- - leftRail: ReactNode
519
- - rightRail: ReactNode
520
- - style: CSSProperties
521
- - topOffset: string = 0px
522
357
 
523
358
  ### HdsThemeProvider
524
359
  Renders a `data-hds` scope wrapper that carries the four theming dials as root attributes + CSS vars, and exposes them to `useHdsTheme()`.
@@ -532,25 +367,6 @@ Renders a `data-hds` scope wrapper that carries the four theming dials as root a
532
367
  - style: CSSProperties
533
368
  - theme: 'light' | 'dark'
534
369
 
535
- ### HeadingStack
536
- HeadingStack — enforced vertical rhythm for heading + subheading pairs. Automatically handles gap and secondary color, preventing manual stacking. - Heading le…
537
- - as: ElementType = div
538
- - gap: HdsHeadingGap = px8
539
- - heading: string
540
- - headingAs: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6'
541
- - level: HdsHeadingLevel
542
- - subheading: string
543
- - subheadingAs: 'p' | 'div' | 'span' = p
544
-
545
- ### HoverCard
546
- HoverCard root + parts. Controlled via `open`/`onOpenChange`, or uncontrolled with `defaultOpen`; tune timing with `openDelay`/`closeDelay`.
547
- - children: React.ReactNode
548
- - closeDelay: number
549
- - defaultOpen: boolean
550
- - onOpenChange: ((open: boolean) => void)
551
- - open: boolean
552
- - openDelay: number
553
-
554
370
  ### Icon
555
371
  Icon — semantic icon wrapper for Lucide icons.
556
372
  - aria-hidden: boolean | "true" | "false" = true
@@ -561,22 +377,6 @@ Icon — semantic icon wrapper for Lucide icons.
561
377
  - style: CSSProperties
562
378
  - weight: "fill" | "bold" | "light" | "thin" | "regular" | "duotone"
563
379
 
564
- ### IconButton
565
- IconButton ” icon-only action trigger built on the shared Button primitive.
566
- - aria-label: string
567
- - asChild: boolean
568
- - disabled: boolean
569
- - icon: LucideIcon
570
- - iconColor: string
571
- - iconLeft: ReactNode
572
- - iconRight: ReactNode
573
- - iconSize: IconSize
574
- - label: string
575
- - loading: boolean
576
- - size: "sm" | "md" | "lg"
577
- - tone: "neutral" | "danger" | "success" | "warning" | "info" | null
578
- - variant: "primary" | "secondary" | "tertiary" | null
579
-
580
380
  ### InlineCode
581
381
  InlineCode — inline code chip for token paths, file paths, and code-adjacent prose.
582
382
  - children: ReactNode
@@ -602,34 +402,17 @@ Input — text field primitive with label, helper, and error slots.
602
402
  - label: string
603
403
  - leadingVisual: ReactNode
604
404
  - loading: boolean = false
405
+ - prefix: ReactNode
605
406
  - size: InputSize = md
407
+ - suffix: ReactNode
606
408
  - textStyle: "body" | "mono" = body
607
409
  - trailingVisual: ReactNode
608
- - type: 'text' | 'email' | 'password' | 'search' | 'tel' | 'url' | 'number' = text
609
-
610
- ### InputGroup
611
- A single-line input with optional `leading`/`trailing` adornments.
612
- - className: string
613
- - leading: ReactNode
614
- - size: "sm" | "md" | "lg" | null
615
- - trailing: ReactNode
410
+ - type: 'text' | 'email' | 'password' | 'search' | 'tel' | 'url' | 'number' | 'date' | … = text
616
411
 
617
412
  ### Kbd
618
413
  Renders a keyboard key or shortcut token, e.g. `<Kbd>⌘K</Kbd>`.
619
414
  - size: "sm" | "md" | "lg" | null
620
415
 
621
- ### Lightbox
622
- 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…
623
- - alt: string
624
- - caption: string
625
- - captionHref: string
626
- - captionLabel: string
627
- - naturalHeight: number
628
- - naturalWidth: number
629
- - onClose: () => void
630
- - open: boolean
631
- - src: string
632
-
633
416
  ### Menu
634
417
  Menu root + parts. Controlled via `open`/`onOpenChange`, or uncontrolled with `defaultOpen`.
635
418
  - children: React.ReactNode
@@ -657,44 +440,6 @@ One metric tile: eyebrow label, `heading2` value, caption sub line, on a raised
657
440
  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…
658
441
  - children: ReactNode
659
442
 
660
- ### MultiSelector
661
- 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…
662
- - className: string
663
- - disabled: boolean = false
664
- - onChange: (next: string[]) => void
665
- - options: MultiSelectorOption[]
666
- - placeholder: string = Select…
667
- - value: string[]
668
-
669
- ### NavGroup
670
- NavGroup - labeled navigation group for stacks of nav items.
671
- - children: ReactNode
672
- - className: string
673
- - collapsible: boolean = false
674
- - contentStyle: CSSProperties
675
- - getExact: ((item: NavItem) => boolean)
676
- - items: NavItem[]
677
- - label: string
678
- - level: NavLevel = section
679
- - onNavigate: (() => void)
680
- - style: CSSProperties
681
- - variant: 'side' | 'toc' = side
682
-
683
- ### NavItem
684
- NavItem - navigation row primitive for sidebars, table of contents, and list navigation.
685
- - active: boolean = false
686
- - disabled: boolean = false
687
- - label: string
688
- - level: NavLevel = root
689
- - onNavigate: ((event: MouseEvent<HTMLAnchorElement, MouseEvent>) => void)
690
- - variant: NavVariant = side
691
-
692
- ### OverflowList
693
- Renders up to `max` children followed by a `+N` overflow chip (or custom node).
694
- - children: ReactNode
695
- - max: number
696
- - renderOverflow: ((count: number) => ReactNode)
697
-
698
443
  ### Page
699
444
  Page — standard page shell. Wraps page content in Container (width constraint) and applies the canonical vertical padding so content breathes against the viewp…
700
445
  - children: ReactNode
@@ -736,10 +481,13 @@ Popover root + parts. Controlled via `open`/`onOpenChange`, or uncontrolled with
736
481
  - open: boolean
737
482
 
738
483
  ### Progress
739
- Linear progress. Determinate when `value` is a number, else indeterminate.
484
+ Linear bar or circular ring. Determinate when `value` is a number, else indeterminate.
740
485
  - label: string = Progress
486
+ - max: number = 100
741
487
  - size: "sm" | "md" | "lg" | null
488
+ - tone: "success" | "danger" | "warning" | "info" | "neutral" = neutral
742
489
  - value: number | null = null
490
+ - variant: "linear" | "circular" = linear
743
491
 
744
492
  ### Radio
745
493
  Radio — radio button with animated selection indicator.
@@ -770,30 +518,16 @@ SegmentedControl " segmented selection input for compact mutually-exclusive choi
770
518
 
771
519
  ### Select
772
520
  Select — dropdown selector built on Radix Select (ADR-001 Radix convention). Radix owns the listbox a11y contract: managed focus + active-descendant, typeahead…
521
+ - aria-describedby: string
522
+ - aria-invalid: boolean
773
523
  - container: HTMLElement | null
524
+ - id: string
774
525
  - label: string
775
526
  - onChange: (v: string) => void
776
527
  - options: { value: string; label: string; }[]
777
528
  - showLabel: boolean = true
778
529
  - value: string
779
530
 
780
- ### SelectableCard
781
- A card-shaped single checkbox — click or activate to toggle selection.
782
- - disabled: boolean
783
- - onSelectedChange: ((selected: boolean) => void)
784
- - selected: boolean = false
785
-
786
- ### SideNav
787
- 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…
788
- - active: boolean = false
789
- - disabled: boolean = false
790
- - href: string
791
- - indent: number | boolean = 0
792
- - label: string
793
- - level: 'root' | 'nested' = nested
794
- - onNavigate: ((event: MouseEvent<HTMLAnchorElement, MouseEvent>) => void)
795
- - titleLabel: boolean = false
796
-
797
531
  ### Sidebar
798
532
  Sidebar — fixed-width rail beside fluid content, no media query. Every Layout reference: https://every-layout.dev/layouts/sidebar/
799
533
  - as: ElementType<any, keyof IntrinsicElements> = div
@@ -808,15 +542,9 @@ Sidebar — fixed-width rail beside fluid content, no media query. Every Layout
808
542
  ### Skeleton
809
543
  Decorative loading placeholder. Marked aria-hidden — announce the loading state on the surrounding region (e.g. aria-busy) rather than per skeleton.
810
544
  - height: string | number
811
- - variant: "text" | "rectangular" | "circular" | null = rectangular
545
+ - variant: "text" | "circular" | "rectangular" | null = rectangular
812
546
  - width: string | number
813
547
 
814
- ### Sketch
815
- Sketch — shared shell for generative canvases and WebGL sketches.
816
- - children: ReactNode
817
- - controls: ReactNode
818
- - title: string
819
-
820
548
  ### Slider
821
549
  Slider — range slider with label and value display.
822
550
  - label: string
@@ -843,28 +571,18 @@ Stack — one-dimensional layout primitive.
843
571
  - style: CSSProperties
844
572
  - wrap: FlexWrap
845
573
 
846
- ### StackedCardRail
847
- StackedCardRail — horizontally-scrolling stacked card carousel. Scroll mechanism: vertical scroll on an absolutely-positioned inner container is mapped to hori…
848
- - cards: StackedCardRailCard[]
849
-
850
574
  ### Stat
851
- Headline metric — large value, uppercase caption label, optional sub-line.
575
+ Headline metric — large value, caption label, optional sub-line.
852
576
  - label: string
853
577
  - sub: ReactNode
854
- - tone: "neutral" | "danger" | "success" | "warning" | "info" | null
578
+ - tone: "success" | "danger" | "warning" | "info" | "neutral" | null
855
579
  - value: ReactNode
856
580
 
857
- ### StatusDot
858
- A small solid dot conveying a semantic status via `tone`.
859
- - label: string
860
- - size: "sm" | "md" | "lg" | null
861
- - tone: "neutral" | "danger" | "success" | "warning" | "info" | "inProgress" | null
862
-
863
581
  ### StatusListItem
864
582
  Status dot + title row with optional muted notes and trailing slot (e.g. badge).
865
583
  - notes: ReactNode[]
866
584
  - title: ReactNode
867
- - tone: "neutral" | "danger" | "success" | "warning" | "info" | null
585
+ - tone: "success" | "danger" | "warning" | "info" | "neutral" | null
868
586
  - trailing: ReactNode
869
587
 
870
588
  ### StatusTile
@@ -874,23 +592,6 @@ Block-layout sibling of StatusListItem. Renders a raised surface tile with title
874
592
  - tone: 'success' | 'warning' | 'danger' | 'info' | 'neutral' = neutral
875
593
  - trailing: ReactNode
876
594
 
877
- ### Stepper
878
- Step indicator for multi-step flows. Purely presentational — no navigation.
879
- - activeStep: number
880
- - orientation: "horizontal" | "vertical" = horizontal
881
- - steps: Step[]
882
-
883
- ### StepperField
884
- StepperField ” numeric input with decrement/increment controls. Classification baseline: Material Design, Chakra UI, and Ant Design treat steppers as numeric i…
885
- - inputStep: number
886
- - label: string
887
- - max: number
888
- - min: number
889
- - onChange: (value: number) => void
890
- - precision: number
891
- - step: number
892
- - value: number
893
-
894
595
  ### Surface
895
596
  Surface — governed inset surface primitive. Enforces the "Surface Inset" rule: backgrounds MUST have internal padding. - Default padding: px24 (cards) | px16 (…
896
597
  - as: ElementType<any, keyof IntrinsicElements> = div
@@ -919,7 +620,7 @@ Table - structured data table primitive for documentation and compact UI matrice
919
620
  - columns: TableColumn[]
920
621
  - density: 'compact' | 'comfortable'
921
622
  - description: ReactNode
922
- - flush: boolean = false
623
+ - flush: boolean = true
923
624
  - labelledBy: string
924
625
  - minWidth: string | number
925
626
  - rows: TableRow[]
@@ -958,24 +659,12 @@ Tag — interactive filter and category chip. The outer <button> carries the acc
958
659
 
959
660
  ### Text
960
661
  Text — polymorphic typography primitive spanning the full HDS type ramp.
961
- - as: "symbol" | "object" | "map" | "filter" | "title" | "a" | "button" | "div" | "fo… = defaultTagMap[variant]
662
+ - as: "symbol" | "object" | "title" | "a" | "button" | "div" | "form" | "h2" | "h3" |… = defaultTagMap[variant]
962
663
  - children: ReactNode
963
664
  - className: string
964
665
  - style: CSSProperties
965
666
  - variant: TextVariant
966
667
 
967
- ### TextLockup
968
- TextLockup - governed title-and-description pairing primitive.
969
- - align: 'left' | 'center' = left
970
- - as: ElementType = div
971
- - description: ReactNode
972
- - descriptionAs: 'div' | 'p' | 'span' = div
973
- - eyebrow: string
974
- - id: string
975
- - size: 'hero' | 'heroXl' | 'section' | 'metric' | 'detail' | 'numbered'
976
- - title: string
977
- - titleAs: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'p' | 'span'
978
-
979
668
  ### Textarea
980
669
  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 …
981
670
  - className: string
@@ -987,15 +676,6 @@ Textarea — multi-line text field primitive with label, helper, and error slots
987
676
  - resize: TextareaResize = vertical
988
677
  - textareaClassName: string
989
678
 
990
- ### TileGrid
991
- 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.
992
- - gap: "sm" | "md" | "xs" = sm
993
- - minTileWidth: string = 260px
994
-
995
- ### TimeInput
996
- A native time field skinned with HDS input chrome. Value is a `HH:mm` string.
997
- - size: "sm" | "md" | "lg" | null
998
-
999
679
  ### Timestamp
1000
680
  Presents a date/time with a machine-readable `dateTime` for accessibility.
1001
681
  - date: string | number | Date
@@ -1015,54 +695,6 @@ Toggle — boolean on/off toggle with animated thumb.
1015
695
  - label: string
1016
696
  - onChange: (v: boolean) => void
1017
697
 
1018
- ### ToggleButton
1019
- 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.
1020
- - asChild: boolean
1021
- - defaultPressed: boolean
1022
- - onPressedChange: ((pressed: boolean) => void)
1023
- - pressed: boolean
1024
- - size: "sm" | "md" | "lg" | null
1025
- - variant: "secondary" | "ghost" | null
1026
-
1027
- ### Token
1028
- 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…
1029
- - accentColor: string
1030
- - aria-label: string
1031
- - className: string
1032
- - description: ReactNode
1033
- - fullWidth: boolean
1034
- - isSelected: boolean
1035
- - isSourceNode: boolean
1036
- - label: string
1037
- - leadingSlot: ReactNode
1038
- - nodeRef: ((el: HTMLElement | null) => void)
1039
- - nowrap: boolean
1040
- - onClick: (() => void) | (() => void)
1041
- - pathDisplayDepth: number
1042
- - pathDisplayLeadingDot: boolean
1043
- - pathDisplayMode: "full" | "compressed"
1044
- - rawValue: ReactNode
1045
- - swatchVar: string
1046
- - tokenPath: string
1047
- - truncateFromStart: boolean
1048
- - value: string
1049
- - variant: "node" | "diagram"
1050
-
1051
- ### Tokenizer
1052
- A bordered field of Tag chips followed by a text input for adding more.
1053
- - className: string
1054
- - disabled: boolean
1055
- - onChange: (next: string[]) => void
1056
- - placeholder: string
1057
- - value: string[]
1058
-
1059
- ### Toolbar
1060
- Toolbar root. Groups related controls with a single roving tab-stop. Supports the native `orientation` prop (`horizontal` | `vertical`).
1061
- - asChild: boolean
1062
- - dir: ("ltr" | "rtl")
1063
- - loop: boolean
1064
- - orientation: "horizontal" | "vertical"
1065
-
1066
698
  ### Tooltip
1067
699
  Tooltip root. Bakes in the Radix Provider so a single `<Tooltip>` is self-contained — no app-level provider required. Controlled via `open`/`onOpenChange`, or …
1068
700
  - children: React.ReactNode
@@ -1072,19 +704,6 @@ Tooltip root. Bakes in the Radix Provider so a single `<Tooltip>` is self-contai
1072
704
  - onOpenChange: ((open: boolean) => void)
1073
705
  - open: boolean
1074
706
 
1075
- ### TopNav
1076
- Top navigation bar with brand, nav, and trailing action slots.
1077
- - brand: ReactNode
1078
- - children: ReactNode
1079
- - sticky: boolean
1080
- - trailing: ReactNode
1081
-
1082
- ### TreeList
1083
- Renders a hierarchical `role="tree"` list; nodes with children get an expand/collapse toggle.
1084
- - defaultExpandedIds: string[]
1085
- - items: TreeNode[]
1086
- - onSelect: ((id: string) => void)
1087
-
1088
707
  ### VisuallyHidden
1089
708
  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…
1090
709
  - as: ElementType<any, keyof IntrinsicElements> = span