@hirobius/design-system 0.19.1 → 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.
- package/CONSUMING.md +9 -6
- package/DESIGN.md +7 -5
- package/README.md +14 -11
- package/codemods/hds-prefix.mjs +231 -0
- package/codemods/jsx-fold.mjs +515 -0
- package/codemods/not-found-pattern.mjs +71 -0
- package/codemods/patterns-subpath.mjs +242 -81
- package/codemods/patterns-subpath.names.json +41 -15
- package/codemods/removed-0.20.json +194 -0
- package/codemods/tile-grid.mjs +283 -0
- package/codemods/unrewritable.mjs +291 -0
- package/dist/chunks/DemoStateContext-Cz5TmrYu.js +32 -0
- package/dist/chunks/empty-state-BBqhCx0S.js +1217 -0
- package/dist/contexts.js +157 -78
- package/dist/hirobius-ui.js +1517 -5270
- package/dist/manifest.js +12 -13
- package/dist/patterns.js +780 -513
- package/dist/styles.css +1 -1
- package/dist/tokens.css +1 -1
- package/dist/tokens.js +29 -8
- package/dist/types/src/app/components/avatar-group.d.ts +1 -2
- package/dist/types/src/app/components/badge.d.ts +8 -3
- package/dist/types/src/app/components/blockquote.d.ts +1 -2
- package/dist/types/src/app/components/box-sx.d.ts +110 -13
- package/dist/types/src/app/components/box.d.ts +6 -3
- package/dist/types/src/app/components/breadcrumb.d.ts +0 -5
- package/dist/types/src/app/components/button.d.ts +33 -4
- package/dist/types/src/app/components/card.d.ts +7 -8
- package/dist/types/src/app/components/combobox.d.ts +47 -11
- package/dist/types/src/app/components/container.d.ts +2 -2
- package/dist/types/src/app/components/data-table-section.d.ts +1 -1
- package/dist/types/src/app/components/dialog.d.ts +7 -1
- package/dist/types/src/app/components/disclosure.d.ts +1 -5
- package/dist/types/src/app/components/field.d.ts +1 -2
- package/dist/types/src/app/components/grid.d.ts +10 -6
- package/dist/types/src/app/components/hds-tooltip.d.ts +12 -2
- package/dist/types/src/app/components/inline-code.d.ts +1 -2
- package/dist/types/src/app/components/input.d.ts +8 -5
- package/dist/types/src/app/components/kbd.d.ts +1 -2
- package/dist/types/src/app/components/metadata-list.d.ts +1 -2
- package/dist/types/src/app/components/page-header.d.ts +0 -2
- package/dist/types/src/app/components/popover.d.ts +8 -0
- package/dist/types/src/app/components/progress.d.ts +33 -6
- package/dist/types/src/app/components/segmented-control.d.ts +2 -26
- package/dist/types/src/app/components/select.d.ts +10 -1
- package/dist/types/src/app/components/skeleton.d.ts +2 -3
- package/dist/types/src/app/components/spinner.d.ts +1 -2
- package/dist/types/src/app/components/stack.d.ts +4 -1
- package/dist/types/src/app/components/stat.d.ts +1 -2
- package/dist/types/src/app/components/status-dot.d.ts +18 -4
- package/dist/types/src/app/components/status-list-item.d.ts +1 -2
- package/dist/types/src/app/components/surface.d.ts +2 -3
- package/dist/types/src/app/components/switcher.d.ts +1 -1
- package/dist/types/src/app/components/table.d.ts +1 -15
- package/dist/types/src/app/components/tag.d.ts +0 -6
- package/dist/types/src/app/components/text.d.ts +1 -2
- package/dist/types/src/app/components/textarea.d.ts +1 -2
- package/dist/types/src/app/components/toast.d.ts +1 -2
- package/dist/types/src/app/components/tooltip.d.ts +1 -1
- package/dist/types/src/app/context/DemoStateContext.d.ts +1 -1
- package/dist/types/src/app/context/RouterContext.d.ts +5 -5
- package/dist/types/src/app/data/manifest-types.d.ts +6 -5
- package/dist/types/src/app/design-system/generated-token-refs.d.ts +8 -0
- package/dist/types/src/app/design-system/generated-token-values.d.ts +1 -0
- package/dist/types/src/app/design-system/tokens.d.ts +22 -3
- package/dist/types/src/icons.d.ts +1 -1
- package/dist/types/src/index.d.ts +33 -124
- package/dist/types/src/patterns.d.ts +20 -25
- package/dist/variables.css +6 -0
- package/docs/CONSUMING.md +21 -13
- package/hirobius.tokens.json +48 -15
- package/llms.txt +19 -20
- package/package.json +17 -22
- package/public/hds-manifest.json +2405 -6537
- package/public/llms/components.txt +41 -423
- package/public/llms/layout.txt +4 -4
- package/public/llms-full.txt +67 -448
- package/public/llms.txt +19 -20
- package/src/app/data/component-api.json +1379 -3271
- package/dist/chunks/LanguageContext-BxdCwiFg.js +0 -95
- package/dist/chunks/TokenDisplayContext-DKYJMVWk.js +0 -26
- package/dist/chunks/activity-feed-BGQ6v3wc.js +0 -22040
- package/dist/types/src/app/components/activity-feed.d.ts +0 -73
- package/dist/types/src/app/components/app-shell.d.ts +0 -40
- package/dist/types/src/app/components/aspect-ratio.d.ts +0 -25
- package/dist/types/src/app/components/bleed.d.ts +0 -39
- package/dist/types/src/app/components/button-group.d.ts +0 -22
- package/dist/types/src/app/components/calendar.d.ts +0 -22
- package/dist/types/src/app/components/carousel.d.ts +0 -26
- package/dist/types/src/app/components/center.d.ts +0 -36
- package/dist/types/src/app/components/cinematic-link.d.ts +0 -18
- package/dist/types/src/app/components/circular-progress.d.ts +0 -28
- package/dist/types/src/app/components/cluster.d.ts +0 -39
- package/dist/types/src/app/components/command-palette.d.ts +0 -46
- package/dist/types/src/app/components/component-instance-matrix.d.ts +0 -27
- package/dist/types/src/app/components/context-menu.d.ts +0 -78
- package/dist/types/src/app/components/cover.d.ts +0 -43
- package/dist/types/src/app/components/date-input.d.ts +0 -31
- package/dist/types/src/app/components/date-range-input.d.ts +0 -34
- package/dist/types/src/app/components/date-time-input.d.ts +0 -30
- package/dist/types/src/app/components/doc-link-card.d.ts +0 -32
- package/dist/types/src/app/components/error-boundary.d.ts +0 -25
- package/dist/types/src/app/components/file-input.d.ts +0 -30
- package/dist/types/src/app/components/foundation-swatch.d.ts +0 -45
- package/dist/types/src/app/components/frame.d.ts +0 -38
- package/dist/types/src/app/components/heading-stack.d.ts +0 -52
- package/dist/types/src/app/components/history-card.d.ts +0 -12
- package/dist/types/src/app/components/hover-card.d.ts +0 -46
- package/dist/types/src/app/components/icon-button.d.ts +0 -22
- package/dist/types/src/app/components/image-lightbox.d.ts +0 -14
- package/dist/types/src/app/components/input-group.d.ts +0 -23
- package/dist/types/src/app/components/multi-selector.d.ts +0 -40
- package/dist/types/src/app/components/nav-group.d.ts +0 -29
- package/dist/types/src/app/components/nav-item.d.ts +0 -33
- package/dist/types/src/app/components/not-found-pattern.d.ts +0 -1
- package/dist/types/src/app/components/overflow-list.d.ts +0 -21
- package/dist/types/src/app/components/selectable-card.d.ts +0 -29
- package/dist/types/src/app/components/side-nav.d.ts +0 -23
- package/dist/types/src/app/components/sketch.d.ts +0 -19
- package/dist/types/src/app/components/stacked-card-rail.d.ts +0 -32
- package/dist/types/src/app/components/stepper-field.d.ts +0 -12
- package/dist/types/src/app/components/stepper.d.ts +0 -33
- package/dist/types/src/app/components/text-lockup.d.ts +0 -38
- package/dist/types/src/app/components/tile-grid.d.ts +0 -17
- package/dist/types/src/app/components/time-input.d.ts +0 -24
- package/dist/types/src/app/components/toggle-button.d.ts +0 -32
- package/dist/types/src/app/components/token.d.ts +0 -90
- package/dist/types/src/app/components/tokenUtils.d.ts +0 -38
- package/dist/types/src/app/components/tokenizer.d.ts +0 -24
- package/dist/types/src/app/components/toolbar.d.ts +0 -36
- package/dist/types/src/app/components/top-nav.d.ts +0 -23
- package/dist/types/src/app/components/tree-list.d.ts +0 -30
- package/dist/types/src/app/data/nav-model.d.ts +0 -39
- package/dist/types/src/app/hooks/useFocusVisible.d.ts +0 -9
- package/dist/types/src/app/layouts/CaseStudyLayout.d.ts +0 -20
- package/dist/types/src/app/layouts/DocLayout.d.ts +0 -14
- package/dist/types/src/app/layouts/EmbeddedDocLayoutContext.d.ts +0 -6
- package/dist/types/src/app/layouts/HdsDocsShell.d.ts +0 -72
- package/dist/types/src/app/layouts/HdsSystemDocLayout.d.ts +0 -14
- package/dist/types/src/app/lib/hds-search.d.ts +0 -45
- package/dist/types/src/app/lib/nav-active.d.ts +0 -16
- package/dist/types/src/app/lib/navLevels.d.ts +0 -4
package/public/llms-full.txt
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Hirobius Design System
|
|
2
2
|
|
|
3
|
-
Generated: 2026-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
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/
|
|
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,
|
|
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 {
|
|
221
|
+
import { Button, Icon } from '@hirobius/design-system';
|
|
223
222
|
import { Ellipsis } from '@hirobius/design-system/icons';
|
|
224
223
|
|
|
225
|
-
<
|
|
224
|
+
<Button iconOnly label="Row actions" iconLeft={<Icon icon={Ellipsis} />} />
|
|
226
225
|
```
|
|
227
226
|
|
|
228
|
-
Rule: icon-only actions (row menus, close, edit) use `
|
|
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: `
|
|
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,
|
|
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` |
|
|
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 (`
|
|
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,
|
|
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` (
|
|
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
|
-
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
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: "
|
|
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
|
|
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
|
-
-
|
|
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:
|
|
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:
|
|
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: "
|
|
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
|
-
###
|
|
986
|
-
|
|
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
|
|
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" | "
|
|
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: "
|
|
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: "
|
|
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" | "
|
|
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
|