@hirobius/design-system 0.22.0 → 0.23.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/AGENTS.md +11 -1
- package/CHANGELOG.md +74 -0
- package/CONSUMING.md +2 -2
- package/DESIGN.md +24 -24
- package/NOTICE.md +1 -1
- package/README.md +20 -12
- package/UPGRADING.md +22 -1
- package/dist/chunks/{empty-state-DNoThgfV.js → empty-state-ChC_xZfg.js} +109 -92
- package/dist/chunks/{form-By82qZcC.js → form-zCZ_B83I.js} +16 -16
- package/dist/css-contract.json +1 -0
- package/dist/fonts/ibm-plex-mono-400.woff2 +0 -0
- package/dist/fonts.css +5 -5
- package/dist/form.js +1 -1
- package/dist/hirobius-ui.js +1254 -1181
- package/dist/manifest.js +5 -4
- package/dist/patterns.js +164 -162
- package/dist/styles.css +1 -1
- package/dist/tokens.css +1 -1
- package/dist/tokens.js +14 -1
- package/dist/types/src/app/components/asset-img.d.ts +1 -0
- package/dist/types/src/app/components/button.d.ts +1 -1
- package/dist/types/src/app/components/callout.d.ts +2 -1
- package/dist/types/src/app/components/card.d.ts +5 -3
- package/dist/types/src/app/components/code-block.d.ts +1 -0
- package/dist/types/src/app/components/combobox.d.ts +1 -1
- package/dist/types/src/app/components/data-table-section.d.ts +1 -0
- package/dist/types/src/app/components/destructive-section.d.ts +1 -0
- package/dist/types/src/app/components/divider.d.ts +1 -1
- package/dist/types/src/app/components/form-actions.d.ts +1 -0
- package/dist/types/src/app/components/form.d.ts +1 -0
- package/dist/types/src/app/components/grid.d.ts +1 -1
- package/dist/types/src/app/components/icon.d.ts +1 -1
- package/dist/types/src/app/components/metric-tiles.d.ts +2 -0
- package/dist/types/src/app/components/page-header.d.ts +1 -0
- package/dist/types/src/app/components/page.d.ts +1 -0
- package/dist/types/src/app/components/reveal.d.ts +1 -0
- package/dist/types/src/app/components/stack.d.ts +1 -1
- package/dist/types/src/app/components/tabs.d.ts +3 -1
- package/dist/types/src/app/context/hds-theme.d.ts +1 -1
- package/dist/types/src/app/design-system/generated-token-refs.d.ts +13 -0
- package/dist/types/src/app/design-system/generated-token-values.d.ts +14 -1
- package/dist/types/src/app/hooks/useInteractionState.d.ts +7 -1
- package/dist/types/src/index.d.ts +47 -0
- package/dist/variables.css +33 -22
- package/docs/CONSUMING.md +2 -2
- package/hirobius.tokens.json +87 -40
- package/llms.txt +29 -7
- package/package.json +7 -6
- package/public/hds-manifest.json +257 -99
- package/public/llms/components.txt +1 -1
- package/public/llms-full.txt +54 -32
- package/public/llms.txt +29 -7
- package/src/app/data/component-api.json +51 -18
- package/upgrade/index.json +8 -1
- package/upgrade/releases/0.23.0.json +259 -0
- package/upgrade/schema.json +114 -1
- package/dist/fonts/geist-mono-400.woff2 +0 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"generatedAt": "2026-10-
|
|
2
|
+
"generatedAt": "2026-10-10T03:04:03.405Z",
|
|
3
3
|
"source": "react-docgen-typescript@2.4.0",
|
|
4
4
|
"components": {
|
|
5
5
|
"Alert": {
|
|
@@ -95,6 +95,9 @@
|
|
|
95
95
|
"AssetImg": {
|
|
96
96
|
"filePath": "src/app/components/asset-img.tsx",
|
|
97
97
|
"description": "AssetImg - responsive asset frame with fallback placeholder handling. Contexts: default, lightbox, and detail.",
|
|
98
|
+
"usage": {
|
|
99
|
+
"when": "Show an image that scales to its frame, with a placeholder if it fails to load."
|
|
100
|
+
},
|
|
98
101
|
"category": "Display",
|
|
99
102
|
"hidden": false,
|
|
100
103
|
"figmaUrl": "https://www.figma.com/design/2VgBbVpKiDnu0aftJEVyBQ/HDS-Tokens-Components?node-id=2041-67",
|
|
@@ -456,7 +459,7 @@
|
|
|
456
459
|
"description": "Triggers an action when activated.",
|
|
457
460
|
"core": true,
|
|
458
461
|
"usage": {
|
|
459
|
-
"when": "
|
|
462
|
+
"when": "Run an action, such as submit, save or open a dialog. For an icon-only control pass iconOnly, iconLeft and label; for an on/off toggle pass pressed.",
|
|
460
463
|
"whenNot": "Navigating to another page, where a link is the correct element.",
|
|
461
464
|
"useInstead": [
|
|
462
465
|
{
|
|
@@ -554,7 +557,7 @@
|
|
|
554
557
|
},
|
|
555
558
|
"Callout": {
|
|
556
559
|
"filePath": "src/app/components/callout.tsx",
|
|
557
|
-
"description": "Tone-driven
|
|
560
|
+
"description": "Tone-driven tinted callout for notes, quotes, hypotheses — the same feedback fill language as Alert, without Alert's icon or status role.",
|
|
558
561
|
"category": "Feedback",
|
|
559
562
|
"hidden": false,
|
|
560
563
|
"figmaUrl": "https://www.figma.com/design/2VgBbVpKiDnu0aftJEVyBQ/HDS-Tokens-Components?node-id=88-85",
|
|
@@ -669,28 +672,28 @@
|
|
|
669
672
|
},
|
|
670
673
|
"CardBody": {
|
|
671
674
|
"filePath": "src/app/components/card.tsx",
|
|
672
|
-
"description": "Card — surface container with slot anatomy (12d-card-anatomy). Slot anatomy (DESIGN.md §\"Card Anatomy\"). Status, progress, and metadata are layout-bearing — they live in slots, never inline next to prose. <Card variant=\"accent\"> <Card.Header metadata={<Badge tone=\"warning\">in-progress</Badge>}> <Card.Title>Discovery phase</Card.Title> <Card.Description>Stakeholder interviews and audit prep.</Card.Description> </Card.Header> <Card.Progress value={42} max={100} label=\"5 / 12 tasks\" /> <Card.Metric label=\"Retainer\" value=\"$3,500\" sub=\"Active\" /> <Card.Body>…</Card.Body> <Card.Footer>…</Card.Footer> </Card> Slot reservations: - Header: title (h3) + optional description (caption) + optional metadata zone (right-aligned, holds <Badge> / <Tag> for status, never raw spans). - Progress: full-width 4px bar in a reserved 16px vertical rail. Owns its spacing — never crowds adjacent prose. - Metric: single label + big value (title) + optional sub-line. Reserved vertical block. Use multiple side-by-side via flex/grid container. - Body: prose, lists, structured content. NO inline status, progress, or thin colored bars. Group sections via separate <Card.Body> blocks. - Footer: actions, secondary metadata, timestamps. `variant`: 'default' (borderless) | 'accent' (2px accent border) — the structural axis, for highlighted entries like \"recommended package\". `tone`: neutral | danger | success | warning | info — the fixed feedback axis (#60 variant contract), for status-driven cards where the border IS the signal. `variant`/`tone` together replace hand-rolled `pkgHighlight`-style overrides. Legacy props (padding / gap / noPadding / as / style) are retained. Existing callers that pass raw children continue to work; new callers should prefer compound parts + `padding=\"none\"`.
|
|
675
|
+
"description": "Card — surface container with slot anatomy (12d-card-anatomy). Slot anatomy (DESIGN.md §\"Card Anatomy\"). Status, progress, and metadata are layout-bearing — they live in slots, never inline next to prose. <Card variant=\"accent\"> <Card.Header metadata={<Badge tone=\"warning\">in-progress</Badge>}> <Card.Title>Discovery phase</Card.Title> <Card.Description>Stakeholder interviews and audit prep.</Card.Description> </Card.Header> <Card.Progress value={42} max={100} label=\"5 / 12 tasks\" /> <Card.Metric label=\"Retainer\" value=\"$3,500\" sub=\"Active\" /> <Card.Body>…</Card.Body> <Card.Footer>…</Card.Footer> </Card> Slot reservations: - Header: title (h3) + optional description (caption) + optional metadata zone (right-aligned, holds <Badge> / <Tag> for status, never raw spans). - Progress: full-width 4px bar in a reserved 16px vertical rail. Owns its spacing — never crowds adjacent prose. - Metric: single label + big value (title) + optional sub-line. Reserved vertical block. Use multiple side-by-side via flex/grid container. - Body: prose, lists, structured content. NO inline status, progress, or thin colored bars. Group sections via separate <Card.Body> blocks. - Footer: actions, secondary metadata, timestamps. `variant`: 'default' (borderless) | 'accent' (2px accent border) — the structural axis, for highlighted entries like \"recommended package\". `tone`: neutral | danger | success | warning | info — the fixed feedback axis (#60 variant contract), for status-driven cards where the border IS the signal. `variant`/`tone` together replace hand-rolled `pkgHighlight`-style overrides. Legacy props (padding / gap / noPadding / as / style) are retained. Existing callers that pass raw children continue to work; new callers should prefer compound parts + `padding=\"none\"`. The default variant is BORDERLESS at rest (12d-3 outline rule) — depth comes from whitespace/dividers, not an edge. A resting 1px border is opt-in via `bordered` (border.default), a feedback `tone`, or `accent` (border.accent). Elevation tokens are not bound by default — pass `className=\"shadow-...\"` for a hover/floating treatment on interactive cards.",
|
|
673
676
|
"category": "Display",
|
|
674
677
|
"hidden": false,
|
|
675
678
|
"props": []
|
|
676
679
|
},
|
|
677
680
|
"CardDescription": {
|
|
678
681
|
"filePath": "src/app/components/card.tsx",
|
|
679
|
-
"description": "Card — surface container with slot anatomy (12d-card-anatomy). Slot anatomy (DESIGN.md §\"Card Anatomy\"). Status, progress, and metadata are layout-bearing — they live in slots, never inline next to prose. <Card variant=\"accent\"> <Card.Header metadata={<Badge tone=\"warning\">in-progress</Badge>}> <Card.Title>Discovery phase</Card.Title> <Card.Description>Stakeholder interviews and audit prep.</Card.Description> </Card.Header> <Card.Progress value={42} max={100} label=\"5 / 12 tasks\" /> <Card.Metric label=\"Retainer\" value=\"$3,500\" sub=\"Active\" /> <Card.Body>…</Card.Body> <Card.Footer>…</Card.Footer> </Card> Slot reservations: - Header: title (h3) + optional description (caption) + optional metadata zone (right-aligned, holds <Badge> / <Tag> for status, never raw spans). - Progress: full-width 4px bar in a reserved 16px vertical rail. Owns its spacing — never crowds adjacent prose. - Metric: single label + big value (title) + optional sub-line. Reserved vertical block. Use multiple side-by-side via flex/grid container. - Body: prose, lists, structured content. NO inline status, progress, or thin colored bars. Group sections via separate <Card.Body> blocks. - Footer: actions, secondary metadata, timestamps. `variant`: 'default' (borderless) | 'accent' (2px accent border) — the structural axis, for highlighted entries like \"recommended package\". `tone`: neutral | danger | success | warning | info — the fixed feedback axis (#60 variant contract), for status-driven cards where the border IS the signal. `variant`/`tone` together replace hand-rolled `pkgHighlight`-style overrides. Legacy props (padding / gap / noPadding / as / style) are retained. Existing callers that pass raw children continue to work; new callers should prefer compound parts + `padding=\"none\"`.
|
|
682
|
+
"description": "Card — surface container with slot anatomy (12d-card-anatomy). Slot anatomy (DESIGN.md §\"Card Anatomy\"). Status, progress, and metadata are layout-bearing — they live in slots, never inline next to prose. <Card variant=\"accent\"> <Card.Header metadata={<Badge tone=\"warning\">in-progress</Badge>}> <Card.Title>Discovery phase</Card.Title> <Card.Description>Stakeholder interviews and audit prep.</Card.Description> </Card.Header> <Card.Progress value={42} max={100} label=\"5 / 12 tasks\" /> <Card.Metric label=\"Retainer\" value=\"$3,500\" sub=\"Active\" /> <Card.Body>…</Card.Body> <Card.Footer>…</Card.Footer> </Card> Slot reservations: - Header: title (h3) + optional description (caption) + optional metadata zone (right-aligned, holds <Badge> / <Tag> for status, never raw spans). - Progress: full-width 4px bar in a reserved 16px vertical rail. Owns its spacing — never crowds adjacent prose. - Metric: single label + big value (title) + optional sub-line. Reserved vertical block. Use multiple side-by-side via flex/grid container. - Body: prose, lists, structured content. NO inline status, progress, or thin colored bars. Group sections via separate <Card.Body> blocks. - Footer: actions, secondary metadata, timestamps. `variant`: 'default' (borderless) | 'accent' (2px accent border) — the structural axis, for highlighted entries like \"recommended package\". `tone`: neutral | danger | success | warning | info — the fixed feedback axis (#60 variant contract), for status-driven cards where the border IS the signal. `variant`/`tone` together replace hand-rolled `pkgHighlight`-style overrides. Legacy props (padding / gap / noPadding / as / style) are retained. Existing callers that pass raw children continue to work; new callers should prefer compound parts + `padding=\"none\"`. The default variant is BORDERLESS at rest (12d-3 outline rule) — depth comes from whitespace/dividers, not an edge. A resting 1px border is opt-in via `bordered` (border.default), a feedback `tone`, or `accent` (border.accent). Elevation tokens are not bound by default — pass `className=\"shadow-...\"` for a hover/floating treatment on interactive cards.",
|
|
680
683
|
"category": "Display",
|
|
681
684
|
"hidden": false,
|
|
682
685
|
"props": []
|
|
683
686
|
},
|
|
684
687
|
"CardFooter": {
|
|
685
688
|
"filePath": "src/app/components/card.tsx",
|
|
686
|
-
"description": "Card — surface container with slot anatomy (12d-card-anatomy). Slot anatomy (DESIGN.md §\"Card Anatomy\"). Status, progress, and metadata are layout-bearing — they live in slots, never inline next to prose. <Card variant=\"accent\"> <Card.Header metadata={<Badge tone=\"warning\">in-progress</Badge>}> <Card.Title>Discovery phase</Card.Title> <Card.Description>Stakeholder interviews and audit prep.</Card.Description> </Card.Header> <Card.Progress value={42} max={100} label=\"5 / 12 tasks\" /> <Card.Metric label=\"Retainer\" value=\"$3,500\" sub=\"Active\" /> <Card.Body>…</Card.Body> <Card.Footer>…</Card.Footer> </Card> Slot reservations: - Header: title (h3) + optional description (caption) + optional metadata zone (right-aligned, holds <Badge> / <Tag> for status, never raw spans). - Progress: full-width 4px bar in a reserved 16px vertical rail. Owns its spacing — never crowds adjacent prose. - Metric: single label + big value (title) + optional sub-line. Reserved vertical block. Use multiple side-by-side via flex/grid container. - Body: prose, lists, structured content. NO inline status, progress, or thin colored bars. Group sections via separate <Card.Body> blocks. - Footer: actions, secondary metadata, timestamps. `variant`: 'default' (borderless) | 'accent' (2px accent border) — the structural axis, for highlighted entries like \"recommended package\". `tone`: neutral | danger | success | warning | info — the fixed feedback axis (#60 variant contract), for status-driven cards where the border IS the signal. `variant`/`tone` together replace hand-rolled `pkgHighlight`-style overrides. Legacy props (padding / gap / noPadding / as / style) are retained. Existing callers that pass raw children continue to work; new callers should prefer compound parts + `padding=\"none\"`.
|
|
689
|
+
"description": "Card — surface container with slot anatomy (12d-card-anatomy). Slot anatomy (DESIGN.md §\"Card Anatomy\"). Status, progress, and metadata are layout-bearing — they live in slots, never inline next to prose. <Card variant=\"accent\"> <Card.Header metadata={<Badge tone=\"warning\">in-progress</Badge>}> <Card.Title>Discovery phase</Card.Title> <Card.Description>Stakeholder interviews and audit prep.</Card.Description> </Card.Header> <Card.Progress value={42} max={100} label=\"5 / 12 tasks\" /> <Card.Metric label=\"Retainer\" value=\"$3,500\" sub=\"Active\" /> <Card.Body>…</Card.Body> <Card.Footer>…</Card.Footer> </Card> Slot reservations: - Header: title (h3) + optional description (caption) + optional metadata zone (right-aligned, holds <Badge> / <Tag> for status, never raw spans). - Progress: full-width 4px bar in a reserved 16px vertical rail. Owns its spacing — never crowds adjacent prose. - Metric: single label + big value (title) + optional sub-line. Reserved vertical block. Use multiple side-by-side via flex/grid container. - Body: prose, lists, structured content. NO inline status, progress, or thin colored bars. Group sections via separate <Card.Body> blocks. - Footer: actions, secondary metadata, timestamps. `variant`: 'default' (borderless) | 'accent' (2px accent border) — the structural axis, for highlighted entries like \"recommended package\". `tone`: neutral | danger | success | warning | info — the fixed feedback axis (#60 variant contract), for status-driven cards where the border IS the signal. `variant`/`tone` together replace hand-rolled `pkgHighlight`-style overrides. Legacy props (padding / gap / noPadding / as / style) are retained. Existing callers that pass raw children continue to work; new callers should prefer compound parts + `padding=\"none\"`. The default variant is BORDERLESS at rest (12d-3 outline rule) — depth comes from whitespace/dividers, not an edge. A resting 1px border is opt-in via `bordered` (border.default), a feedback `tone`, or `accent` (border.accent). Elevation tokens are not bound by default — pass `className=\"shadow-...\"` for a hover/floating treatment on interactive cards.",
|
|
687
690
|
"category": "Display",
|
|
688
691
|
"hidden": false,
|
|
689
692
|
"props": []
|
|
690
693
|
},
|
|
691
694
|
"CardHeader": {
|
|
692
695
|
"filePath": "src/app/components/card.tsx",
|
|
693
|
-
"description": "Card — surface container with slot anatomy (12d-card-anatomy). Slot anatomy (DESIGN.md §\"Card Anatomy\"). Status, progress, and metadata are layout-bearing — they live in slots, never inline next to prose. <Card variant=\"accent\"> <Card.Header metadata={<Badge tone=\"warning\">in-progress</Badge>}> <Card.Title>Discovery phase</Card.Title> <Card.Description>Stakeholder interviews and audit prep.</Card.Description> </Card.Header> <Card.Progress value={42} max={100} label=\"5 / 12 tasks\" /> <Card.Metric label=\"Retainer\" value=\"$3,500\" sub=\"Active\" /> <Card.Body>…</Card.Body> <Card.Footer>…</Card.Footer> </Card> Slot reservations: - Header: title (h3) + optional description (caption) + optional metadata zone (right-aligned, holds <Badge> / <Tag> for status, never raw spans). - Progress: full-width 4px bar in a reserved 16px vertical rail. Owns its spacing — never crowds adjacent prose. - Metric: single label + big value (title) + optional sub-line. Reserved vertical block. Use multiple side-by-side via flex/grid container. - Body: prose, lists, structured content. NO inline status, progress, or thin colored bars. Group sections via separate <Card.Body> blocks. - Footer: actions, secondary metadata, timestamps. `variant`: 'default' (borderless) | 'accent' (2px accent border) — the structural axis, for highlighted entries like \"recommended package\". `tone`: neutral | danger | success | warning | info — the fixed feedback axis (#60 variant contract), for status-driven cards where the border IS the signal. `variant`/`tone` together replace hand-rolled `pkgHighlight`-style overrides. Legacy props (padding / gap / noPadding / as / style) are retained. Existing callers that pass raw children continue to work; new callers should prefer compound parts + `padding=\"none\"`.
|
|
696
|
+
"description": "Card — surface container with slot anatomy (12d-card-anatomy). Slot anatomy (DESIGN.md §\"Card Anatomy\"). Status, progress, and metadata are layout-bearing — they live in slots, never inline next to prose. <Card variant=\"accent\"> <Card.Header metadata={<Badge tone=\"warning\">in-progress</Badge>}> <Card.Title>Discovery phase</Card.Title> <Card.Description>Stakeholder interviews and audit prep.</Card.Description> </Card.Header> <Card.Progress value={42} max={100} label=\"5 / 12 tasks\" /> <Card.Metric label=\"Retainer\" value=\"$3,500\" sub=\"Active\" /> <Card.Body>…</Card.Body> <Card.Footer>…</Card.Footer> </Card> Slot reservations: - Header: title (h3) + optional description (caption) + optional metadata zone (right-aligned, holds <Badge> / <Tag> for status, never raw spans). - Progress: full-width 4px bar in a reserved 16px vertical rail. Owns its spacing — never crowds adjacent prose. - Metric: single label + big value (title) + optional sub-line. Reserved vertical block. Use multiple side-by-side via flex/grid container. - Body: prose, lists, structured content. NO inline status, progress, or thin colored bars. Group sections via separate <Card.Body> blocks. - Footer: actions, secondary metadata, timestamps. `variant`: 'default' (borderless) | 'accent' (2px accent border) — the structural axis, for highlighted entries like \"recommended package\". `tone`: neutral | danger | success | warning | info — the fixed feedback axis (#60 variant contract), for status-driven cards where the border IS the signal. `variant`/`tone` together replace hand-rolled `pkgHighlight`-style overrides. Legacy props (padding / gap / noPadding / as / style) are retained. Existing callers that pass raw children continue to work; new callers should prefer compound parts + `padding=\"none\"`. The default variant is BORDERLESS at rest (12d-3 outline rule) — depth comes from whitespace/dividers, not an edge. A resting 1px border is opt-in via `bordered` (border.default), a feedback `tone`, or `accent` (border.accent). Elevation tokens are not bound by default — pass `className=\"shadow-...\"` for a hover/floating treatment on interactive cards.",
|
|
694
697
|
"category": "Display",
|
|
695
698
|
"hidden": false,
|
|
696
699
|
"props": [
|
|
@@ -747,7 +750,7 @@
|
|
|
747
750
|
},
|
|
748
751
|
"CardProgress": {
|
|
749
752
|
"filePath": "src/app/components/card.tsx",
|
|
750
|
-
"description": "Card — surface container with slot anatomy (12d-card-anatomy). Slot anatomy (DESIGN.md §\"Card Anatomy\"). Status, progress, and metadata are layout-bearing — they live in slots, never inline next to prose. <Card variant=\"accent\"> <Card.Header metadata={<Badge tone=\"warning\">in-progress</Badge>}> <Card.Title>Discovery phase</Card.Title> <Card.Description>Stakeholder interviews and audit prep.</Card.Description> </Card.Header> <Card.Progress value={42} max={100} label=\"5 / 12 tasks\" /> <Card.Metric label=\"Retainer\" value=\"$3,500\" sub=\"Active\" /> <Card.Body>…</Card.Body> <Card.Footer>…</Card.Footer> </Card> Slot reservations: - Header: title (h3) + optional description (caption) + optional metadata zone (right-aligned, holds <Badge> / <Tag> for status, never raw spans). - Progress: full-width 4px bar in a reserved 16px vertical rail. Owns its spacing — never crowds adjacent prose. - Metric: single label + big value (title) + optional sub-line. Reserved vertical block. Use multiple side-by-side via flex/grid container. - Body: prose, lists, structured content. NO inline status, progress, or thin colored bars. Group sections via separate <Card.Body> blocks. - Footer: actions, secondary metadata, timestamps. `variant`: 'default' (borderless) | 'accent' (2px accent border) — the structural axis, for highlighted entries like \"recommended package\". `tone`: neutral | danger | success | warning | info — the fixed feedback axis (#60 variant contract), for status-driven cards where the border IS the signal. `variant`/`tone` together replace hand-rolled `pkgHighlight`-style overrides. Legacy props (padding / gap / noPadding / as / style) are retained. Existing callers that pass raw children continue to work; new callers should prefer compound parts + `padding=\"none\"`.
|
|
753
|
+
"description": "Card — surface container with slot anatomy (12d-card-anatomy). Slot anatomy (DESIGN.md §\"Card Anatomy\"). Status, progress, and metadata are layout-bearing — they live in slots, never inline next to prose. <Card variant=\"accent\"> <Card.Header metadata={<Badge tone=\"warning\">in-progress</Badge>}> <Card.Title>Discovery phase</Card.Title> <Card.Description>Stakeholder interviews and audit prep.</Card.Description> </Card.Header> <Card.Progress value={42} max={100} label=\"5 / 12 tasks\" /> <Card.Metric label=\"Retainer\" value=\"$3,500\" sub=\"Active\" /> <Card.Body>…</Card.Body> <Card.Footer>…</Card.Footer> </Card> Slot reservations: - Header: title (h3) + optional description (caption) + optional metadata zone (right-aligned, holds <Badge> / <Tag> for status, never raw spans). - Progress: full-width 4px bar in a reserved 16px vertical rail. Owns its spacing — never crowds adjacent prose. - Metric: single label + big value (title) + optional sub-line. Reserved vertical block. Use multiple side-by-side via flex/grid container. - Body: prose, lists, structured content. NO inline status, progress, or thin colored bars. Group sections via separate <Card.Body> blocks. - Footer: actions, secondary metadata, timestamps. `variant`: 'default' (borderless) | 'accent' (2px accent border) — the structural axis, for highlighted entries like \"recommended package\". `tone`: neutral | danger | success | warning | info — the fixed feedback axis (#60 variant contract), for status-driven cards where the border IS the signal. `variant`/`tone` together replace hand-rolled `pkgHighlight`-style overrides. Legacy props (padding / gap / noPadding / as / style) are retained. Existing callers that pass raw children continue to work; new callers should prefer compound parts + `padding=\"none\"`. The default variant is BORDERLESS at rest (12d-3 outline rule) — depth comes from whitespace/dividers, not an edge. A resting 1px border is opt-in via `bordered` (border.default), a feedback `tone`, or `accent` (border.accent). Elevation tokens are not bound by default — pass `className=\"shadow-...\"` for a hover/floating treatment on interactive cards.",
|
|
751
754
|
"category": "Display",
|
|
752
755
|
"hidden": false,
|
|
753
756
|
"props": [
|
|
@@ -781,7 +784,7 @@
|
|
|
781
784
|
},
|
|
782
785
|
"CardTitle": {
|
|
783
786
|
"filePath": "src/app/components/card.tsx",
|
|
784
|
-
"description": "Card — surface container with slot anatomy (12d-card-anatomy). Slot anatomy (DESIGN.md §\"Card Anatomy\"). Status, progress, and metadata are layout-bearing — they live in slots, never inline next to prose. <Card variant=\"accent\"> <Card.Header metadata={<Badge tone=\"warning\">in-progress</Badge>}> <Card.Title>Discovery phase</Card.Title> <Card.Description>Stakeholder interviews and audit prep.</Card.Description> </Card.Header> <Card.Progress value={42} max={100} label=\"5 / 12 tasks\" /> <Card.Metric label=\"Retainer\" value=\"$3,500\" sub=\"Active\" /> <Card.Body>…</Card.Body> <Card.Footer>…</Card.Footer> </Card> Slot reservations: - Header: title (h3) + optional description (caption) + optional metadata zone (right-aligned, holds <Badge> / <Tag> for status, never raw spans). - Progress: full-width 4px bar in a reserved 16px vertical rail. Owns its spacing — never crowds adjacent prose. - Metric: single label + big value (title) + optional sub-line. Reserved vertical block. Use multiple side-by-side via flex/grid container. - Body: prose, lists, structured content. NO inline status, progress, or thin colored bars. Group sections via separate <Card.Body> blocks. - Footer: actions, secondary metadata, timestamps. `variant`: 'default' (borderless) | 'accent' (2px accent border) — the structural axis, for highlighted entries like \"recommended package\". `tone`: neutral | danger | success | warning | info — the fixed feedback axis (#60 variant contract), for status-driven cards where the border IS the signal. `variant`/`tone` together replace hand-rolled `pkgHighlight`-style overrides. Legacy props (padding / gap / noPadding / as / style) are retained. Existing callers that pass raw children continue to work; new callers should prefer compound parts + `padding=\"none\"`.
|
|
787
|
+
"description": "Card — surface container with slot anatomy (12d-card-anatomy). Slot anatomy (DESIGN.md §\"Card Anatomy\"). Status, progress, and metadata are layout-bearing — they live in slots, never inline next to prose. <Card variant=\"accent\"> <Card.Header metadata={<Badge tone=\"warning\">in-progress</Badge>}> <Card.Title>Discovery phase</Card.Title> <Card.Description>Stakeholder interviews and audit prep.</Card.Description> </Card.Header> <Card.Progress value={42} max={100} label=\"5 / 12 tasks\" /> <Card.Metric label=\"Retainer\" value=\"$3,500\" sub=\"Active\" /> <Card.Body>…</Card.Body> <Card.Footer>…</Card.Footer> </Card> Slot reservations: - Header: title (h3) + optional description (caption) + optional metadata zone (right-aligned, holds <Badge> / <Tag> for status, never raw spans). - Progress: full-width 4px bar in a reserved 16px vertical rail. Owns its spacing — never crowds adjacent prose. - Metric: single label + big value (title) + optional sub-line. Reserved vertical block. Use multiple side-by-side via flex/grid container. - Body: prose, lists, structured content. NO inline status, progress, or thin colored bars. Group sections via separate <Card.Body> blocks. - Footer: actions, secondary metadata, timestamps. `variant`: 'default' (borderless) | 'accent' (2px accent border) — the structural axis, for highlighted entries like \"recommended package\". `tone`: neutral | danger | success | warning | info — the fixed feedback axis (#60 variant contract), for status-driven cards where the border IS the signal. `variant`/`tone` together replace hand-rolled `pkgHighlight`-style overrides. Legacy props (padding / gap / noPadding / as / style) are retained. Existing callers that pass raw children continue to work; new callers should prefer compound parts + `padding=\"none\"`. The default variant is BORDERLESS at rest (12d-3 outline rule) — depth comes from whitespace/dividers, not an edge. A resting 1px border is opt-in via `bordered` (border.default), a feedback `tone`, or `accent` (border.accent). Elevation tokens are not bound by default — pass `className=\"shadow-...\"` for a hover/floating treatment on interactive cards.",
|
|
785
788
|
"category": "Display",
|
|
786
789
|
"hidden": false,
|
|
787
790
|
"props": []
|
|
@@ -838,6 +841,9 @@
|
|
|
838
841
|
"CodeBlock": {
|
|
839
842
|
"filePath": "src/app/components/code-block.tsx",
|
|
840
843
|
"description": "CodeBlock - code display with copy button and optional collapsible toggle.",
|
|
844
|
+
"usage": {
|
|
845
|
+
"when": "Show a code sample with a copy button, optionally collapsed."
|
|
846
|
+
},
|
|
841
847
|
"category": "Display",
|
|
842
848
|
"hidden": false,
|
|
843
849
|
"figmaUrl": "https://www.figma.com/design/2VgBbVpKiDnu0aftJEVyBQ/HDS-Tokens-Components?node-id=89-154",
|
|
@@ -921,7 +927,7 @@
|
|
|
921
927
|
},
|
|
922
928
|
{
|
|
923
929
|
"keys": "ArrowDown/ArrowUp",
|
|
924
|
-
"effect": "Moves the active option and wraps at the ends."
|
|
930
|
+
"effect": "Moves the active option, skipping disabled ones, and wraps at the ends."
|
|
925
931
|
},
|
|
926
932
|
{
|
|
927
933
|
"keys": "Character",
|
|
@@ -1091,6 +1097,9 @@
|
|
|
1091
1097
|
"DataTableSection": {
|
|
1092
1098
|
"filePath": "src/app/components/data-table-section.tsx",
|
|
1093
1099
|
"description": "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 `minWidth` from the caller, and zero rows shows an `EmptyState`.",
|
|
1100
|
+
"usage": {
|
|
1101
|
+
"when": "Put a heading and toolbar above a Table."
|
|
1102
|
+
},
|
|
1094
1103
|
"category": "Display",
|
|
1095
1104
|
"hidden": false,
|
|
1096
1105
|
"figmaUrl": "https://www.figma.com/design/2VgBbVpKiDnu0aftJEVyBQ/HDS-Tokens-Components?node-id=2075-268",
|
|
@@ -1151,6 +1160,9 @@
|
|
|
1151
1160
|
"DestructiveSection": {
|
|
1152
1161
|
"filePath": "src/app/components/destructive-section.tsx",
|
|
1153
1162
|
"description": "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 confirm does. Place it last on the screen, below the form.",
|
|
1163
|
+
"usage": {
|
|
1164
|
+
"when": "Put a dangerous action, such as delete, in its own section with a warning and a confirm step."
|
|
1165
|
+
},
|
|
1154
1166
|
"category": "Actions",
|
|
1155
1167
|
"hidden": false,
|
|
1156
1168
|
"figmaUrl": "https://www.figma.com/design/2VgBbVpKiDnu0aftJEVyBQ/HDS-Tokens-Components?node-id=2076-3",
|
|
@@ -1594,7 +1606,7 @@
|
|
|
1594
1606
|
"description": "Divider — semantic separator between content regions.",
|
|
1595
1607
|
"core": true,
|
|
1596
1608
|
"usage": {
|
|
1597
|
-
"when": "Separate two
|
|
1609
|
+
"when": "Separate two blocks of content with a thin line.",
|
|
1598
1610
|
"whenNot": "Spacing alone would do, or the separation needs a container.",
|
|
1599
1611
|
"useInstead": [
|
|
1600
1612
|
{
|
|
@@ -1738,6 +1750,9 @@
|
|
|
1738
1750
|
"Form": {
|
|
1739
1751
|
"filePath": "src/app/components/form.tsx",
|
|
1740
1752
|
"description": "Styled `<form>` with consistent vertical field rhythm. Tagged per-export: FormField and FormFieldShell share this module and have no Figma node, so a file-level @figma would claim this one for all three.",
|
|
1753
|
+
"usage": {
|
|
1754
|
+
"when": "Wrap form fields so they stack with even spacing."
|
|
1755
|
+
},
|
|
1741
1756
|
"category": "Inputs",
|
|
1742
1757
|
"hidden": false,
|
|
1743
1758
|
"figmaUrl": "https://www.figma.com/design/2VgBbVpKiDnu0aftJEVyBQ/HDS-Tokens-Components?node-id=85-94",
|
|
@@ -1746,6 +1761,9 @@
|
|
|
1746
1761
|
"FormActions": {
|
|
1747
1762
|
"filePath": "src/app/components/form-actions.tsx",
|
|
1748
1763
|
"description": "Form footer with one fixed order: destructive (far left, if any), then secondary, then primary last and right-most. Gap is the tight layout token.",
|
|
1764
|
+
"usage": {
|
|
1765
|
+
"when": "Lay out a form's buttons in a fixed order: danger on the left, then secondary, then primary on the right."
|
|
1766
|
+
},
|
|
1749
1767
|
"category": "Actions",
|
|
1750
1768
|
"hidden": false,
|
|
1751
1769
|
"figmaUrl": "https://www.figma.com/design/2VgBbVpKiDnu0aftJEVyBQ/HDS-Tokens-Components?node-id=2075-87",
|
|
@@ -1884,7 +1902,7 @@
|
|
|
1884
1902
|
"description": "Grid — responsive grid composition primitive. Enforces semantic gap and column values. No arbitrary CSS grid. - layout='fixed': responsive base (collapses via CSS at tablet/mobile). `columns` sets desktop count (default 12). Tablet/mobile clamp to min(8, cols) and min(4, cols) respectively. - layout='auto-fit': responsive card wrapping via auto-fit. - layout='auto-fill': tile wrapping at `minItemWidth` (TileGrid's recipe; 0.20.0 removed TileGrid). - subgrid=true: sets gridTemplateColumns:'subgrid' for nested alignment. Usage (default responsive 12-col): <Grid> <Grid.Item colSpan={6}>…</Grid.Item> <Grid.Item colSpan={6}>…</Grid.Item> </Grid> Usage (responsive auto-fit): <Grid layout=\"auto-fit\"> <Card /> <Card /> </Grid>",
|
|
1885
1903
|
"core": true,
|
|
1886
1904
|
"usage": {
|
|
1887
|
-
"when": "Lay out content in
|
|
1905
|
+
"when": "Lay out content in columns that adapt to the screen width, or line up nested content with subgrid.",
|
|
1888
1906
|
"whenNot": "A single row or column, or styling a surface.",
|
|
1889
1907
|
"useInstead": [
|
|
1890
1908
|
{
|
|
@@ -2072,7 +2090,7 @@
|
|
|
2072
2090
|
"description": "Icon — semantic icon wrapper for Lucide icons.",
|
|
2073
2091
|
"core": true,
|
|
2074
2092
|
"usage": {
|
|
2075
|
-
"when": "
|
|
2093
|
+
"when": "Show a Lucide icon at a set size and color.",
|
|
2076
2094
|
"whenNot": "A control someone can activate, or a picture that carries content.",
|
|
2077
2095
|
"useInstead": [
|
|
2078
2096
|
{
|
|
@@ -2405,6 +2423,9 @@
|
|
|
2405
2423
|
"MetricTile": {
|
|
2406
2424
|
"filePath": "src/app/components/metric-tiles.tsx",
|
|
2407
2425
|
"description": "One metric tile: eyebrow label, `heading2` value, caption sub line, on a raised surface at one fixed min-height. Wraps `Card.Metric` (the sibling with the eyebrow / h2 / caption scale) and adds the surface and the fixed height, so a tile needs no enclosing `Card`.",
|
|
2426
|
+
"usage": {
|
|
2427
|
+
"when": "Show one key number with its label, inside a MetricTiles row."
|
|
2428
|
+
},
|
|
2408
2429
|
"category": "Display",
|
|
2409
2430
|
"hidden": false,
|
|
2410
2431
|
"figmaUrl": "https://www.figma.com/design/2VgBbVpKiDnu0aftJEVyBQ/HDS-Tokens-Components?node-id=2075-114",
|
|
@@ -2439,6 +2460,9 @@
|
|
|
2439
2460
|
"MetricTiles": {
|
|
2440
2461
|
"filePath": "src/app/components/metric-tiles.tsx",
|
|
2441
2462
|
"description": "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 headline numbers on a screen; use `Stat` only for an inline number inside prose or a dense list, `Card.Metric` only inside an existing `Card`, and `StatusTile` for state with notes (never a number).",
|
|
2463
|
+
"usage": {
|
|
2464
|
+
"when": "Show a row of key numbers, one tile each."
|
|
2465
|
+
},
|
|
2442
2466
|
"category": "Display",
|
|
2443
2467
|
"hidden": false,
|
|
2444
2468
|
"props": [
|
|
@@ -2453,6 +2477,9 @@
|
|
|
2453
2477
|
"Page": {
|
|
2454
2478
|
"filePath": "src/app/components/page.tsx",
|
|
2455
2479
|
"description": "Page — standard page shell. Wraps page content in Container (width constraint) and applies the canonical vertical padding so content breathes against the viewport edges on scroll. Use as the outermost element of any new page so vertical rhythm is consistent across the system without per-page reinvention. Footer: every page mounted under HDSLayout (the standard route shell) gets a shared footer rendered after this component's content, with bottom space below the footer owned by the layout shell. Page intentionally does not render its own footer — the shell is the single source of truth. Use Container directly only for full-bleed surfaces (sketches, hero sections, embedded canvases) where the page owns its own vertical padding. Usage: <Page> <Stack direction=\"column\" gap=\"spacious\">...</Stack> </Page> <Page maxWidth=\"content\" paddingY=\"compact\"> <article>...</article> </Page>",
|
|
2480
|
+
"usage": {
|
|
2481
|
+
"when": "Wrap a screen in the standard width and padding."
|
|
2482
|
+
},
|
|
2456
2483
|
"category": "Layout",
|
|
2457
2484
|
"hidden": false,
|
|
2458
2485
|
"props": [
|
|
@@ -2493,6 +2520,9 @@
|
|
|
2493
2520
|
"PageHeader": {
|
|
2494
2521
|
"filePath": "src/app/components/page-header.tsx",
|
|
2495
2522
|
"description": "Screen header: breadcrumb slot, the title at the one canonical page-title size (`heading2`), a status slot and an actions slot. Every screen has exactly one. `display` and `h1` type are reserved for marketing and landing surfaces.",
|
|
2523
|
+
"usage": {
|
|
2524
|
+
"when": "Open a screen with its title, plus optional breadcrumb, status and actions."
|
|
2525
|
+
},
|
|
2496
2526
|
"category": "Layout",
|
|
2497
2527
|
"hidden": false,
|
|
2498
2528
|
"props": [
|
|
@@ -2736,6 +2766,9 @@
|
|
|
2736
2766
|
"Reveal": {
|
|
2737
2767
|
"filePath": "src/app/components/reveal.tsx",
|
|
2738
2768
|
"description": "Reveal — reveal-on-scroll primitive via CSS scroll-driven animation.",
|
|
2769
|
+
"usage": {
|
|
2770
|
+
"when": "Fade content in as it scrolls into view."
|
|
2771
|
+
},
|
|
2739
2772
|
"aiRules": "Content is fully visible by DEFAULT; the effect applies only where `animation-timeline` is supported AND the user has not requested reduced motion (both fall back to visible, never stuck hidden). Pick `animation` from the fixed set — do not hand-roll keyframes. For momentum/inertia scrolling wrap the app in `SmoothScroll`; for a scroll-progress value in JS use `useScrollProgress` — both from `@hirobius/design-system/scroll`. See ADR-021.",
|
|
2740
2773
|
"category": "Motion",
|
|
2741
2774
|
"hidden": false,
|
|
@@ -3178,7 +3211,7 @@
|
|
|
3178
3211
|
"description": "Stack — one-dimensional layout primitive.",
|
|
3179
3212
|
"core": true,
|
|
3180
3213
|
"usage": {
|
|
3181
|
-
"when": "Space a row or column
|
|
3214
|
+
"when": "Space items in a row or column with even gaps.",
|
|
3182
3215
|
"whenNot": "Multi-column layout, or giving content a background or padding.",
|
|
3183
3216
|
"useInstead": [
|
|
3184
3217
|
{
|
|
@@ -3395,7 +3428,7 @@
|
|
|
3395
3428
|
"description": "Surface — governed inset surface primitive. Enforces the \"Surface Inset\" rule: backgrounds MUST have internal padding. - Default padding: px24 (cards) | px16 (items) - Default border: none (elevation model — use shadow for lift) - Radius: `rounded-lg` (role radius + 4px), the one container radius shared with Card - shadow prop: applies a two-layer elevation shadow for card lift Usage: <Surface>Card content</Surface> <Surface padding=\"item\">Compact item</Surface> <Surface shadow>Lifted card with elevation shadow.</Surface>",
|
|
3396
3429
|
"core": true,
|
|
3397
3430
|
"usage": {
|
|
3398
|
-
"when": "
|
|
3431
|
+
"when": "Give a block of content a background and padding, with no header or footer.",
|
|
3399
3432
|
"whenNot": "Page layout, section spacing, width constraints, or content that needs slots.",
|
|
3400
3433
|
"useInstead": [
|
|
3401
3434
|
{
|
|
@@ -3712,7 +3745,7 @@
|
|
|
3712
3745
|
},
|
|
3713
3746
|
"TabsContent": {
|
|
3714
3747
|
"filePath": "src/app/components/tabs.tsx",
|
|
3715
|
-
"description": "Tabs — Radix-backed underline tabs (Root, List, Trigger, Content). Underline pattern math: - TabsList carries `border-b border-border/40` (the divider, half-strength so it anchors the strip without competing with content). - TabsTrigger has `border-b-2 border-transparent -mb-px` at rest. The `-mb-px` offsets the trigger DOWN by 1px so the trigger sits on top of the list divider; the active 2px bottom border visually REPLACES that 1px segment instead of stacking on it. - Active state pairs the underline with a soft `bg-accent/5` tint that extends down into TabsContent — the active tab visually \"claims\" its content panel (folder-tab affordance, modern-soft). Overflow: TabsList is horizontally scrollable (`overflow-x-auto whitespace-nowrap`) for cases like /ops/atlas with 8 tabs at narrow viewports. Scrollbar chrome is hidden cross-browser (-webkit / firefox / IE).",
|
|
3748
|
+
"description": "Tabs — Radix-backed underline tabs (Root, List, Trigger, Content). Underline pattern math: - TabsList carries `border-b border-border/40` (the divider, half-strength so it anchors the strip without competing with content). - TabsTrigger has `border-b-2 border-transparent -mb-px` at rest. The `-mb-px` offsets the trigger DOWN by 1px so the trigger sits on top of the list divider; the active 2px bottom border visually REPLACES that 1px segment instead of stacking on it. - Active state pairs the underline with a soft `bg-accent/5` tint that extends down into TabsContent — the active tab visually \"claims\" its content panel (folder-tab affordance, modern-soft). Overflow: TabsList is horizontally scrollable (`overflow-x-auto whitespace-nowrap`) for cases like /ops/atlas with 8 tabs at narrow viewports. Scrollbar chrome is hidden cross-browser (-webkit / firefox / IE). The trigger's focus ring is `ring-inset` because `overflow-x-auto` clips anything drawn outside the list box (an outer ring was cut on the first/last tab).",
|
|
3716
3749
|
"category": "Navigation",
|
|
3717
3750
|
"hidden": false,
|
|
3718
3751
|
"props": [
|
|
@@ -3738,7 +3771,7 @@
|
|
|
3738
3771
|
},
|
|
3739
3772
|
"TabsList": {
|
|
3740
3773
|
"filePath": "src/app/components/tabs.tsx",
|
|
3741
|
-
"description": "Tabs — Radix-backed underline tabs (Root, List, Trigger, Content). Underline pattern math: - TabsList carries `border-b border-border/40` (the divider, half-strength so it anchors the strip without competing with content). - TabsTrigger has `border-b-2 border-transparent -mb-px` at rest. The `-mb-px` offsets the trigger DOWN by 1px so the trigger sits on top of the list divider; the active 2px bottom border visually REPLACES that 1px segment instead of stacking on it. - Active state pairs the underline with a soft `bg-accent/5` tint that extends down into TabsContent — the active tab visually \"claims\" its content panel (folder-tab affordance, modern-soft). Overflow: TabsList is horizontally scrollable (`overflow-x-auto whitespace-nowrap`) for cases like /ops/atlas with 8 tabs at narrow viewports. Scrollbar chrome is hidden cross-browser (-webkit / firefox / IE).",
|
|
3774
|
+
"description": "Tabs — Radix-backed underline tabs (Root, List, Trigger, Content). Underline pattern math: - TabsList carries `border-b border-border/40` (the divider, half-strength so it anchors the strip without competing with content). - TabsTrigger has `border-b-2 border-transparent -mb-px` at rest. The `-mb-px` offsets the trigger DOWN by 1px so the trigger sits on top of the list divider; the active 2px bottom border visually REPLACES that 1px segment instead of stacking on it. - Active state pairs the underline with a soft `bg-accent/5` tint that extends down into TabsContent — the active tab visually \"claims\" its content panel (folder-tab affordance, modern-soft). Overflow: TabsList is horizontally scrollable (`overflow-x-auto whitespace-nowrap`) for cases like /ops/atlas with 8 tabs at narrow viewports. Scrollbar chrome is hidden cross-browser (-webkit / firefox / IE). The trigger's focus ring is `ring-inset` because `overflow-x-auto` clips anything drawn outside the list box (an outer ring was cut on the first/last tab).",
|
|
3742
3775
|
"category": "Navigation",
|
|
3743
3776
|
"hidden": false,
|
|
3744
3777
|
"props": [
|
|
@@ -3758,7 +3791,7 @@
|
|
|
3758
3791
|
},
|
|
3759
3792
|
"TabsTrigger": {
|
|
3760
3793
|
"filePath": "src/app/components/tabs.tsx",
|
|
3761
|
-
"description": "Tabs — Radix-backed underline tabs (Root, List, Trigger, Content). Underline pattern math: - TabsList carries `border-b border-border/40` (the divider, half-strength so it anchors the strip without competing with content). - TabsTrigger has `border-b-2 border-transparent -mb-px` at rest. The `-mb-px` offsets the trigger DOWN by 1px so the trigger sits on top of the list divider; the active 2px bottom border visually REPLACES that 1px segment instead of stacking on it. - Active state pairs the underline with a soft `bg-accent/5` tint that extends down into TabsContent — the active tab visually \"claims\" its content panel (folder-tab affordance, modern-soft). Overflow: TabsList is horizontally scrollable (`overflow-x-auto whitespace-nowrap`) for cases like /ops/atlas with 8 tabs at narrow viewports. Scrollbar chrome is hidden cross-browser (-webkit / firefox / IE).",
|
|
3794
|
+
"description": "Tabs — Radix-backed underline tabs (Root, List, Trigger, Content). Underline pattern math: - TabsList carries `border-b border-border/40` (the divider, half-strength so it anchors the strip without competing with content). - TabsTrigger has `border-b-2 border-transparent -mb-px` at rest. The `-mb-px` offsets the trigger DOWN by 1px so the trigger sits on top of the list divider; the active 2px bottom border visually REPLACES that 1px segment instead of stacking on it. - Active state pairs the underline with a soft `bg-accent/5` tint that extends down into TabsContent — the active tab visually \"claims\" its content panel (folder-tab affordance, modern-soft). Overflow: TabsList is horizontally scrollable (`overflow-x-auto whitespace-nowrap`) for cases like /ops/atlas with 8 tabs at narrow viewports. Scrollbar chrome is hidden cross-browser (-webkit / firefox / IE). The trigger's focus ring is `ring-inset` because `overflow-x-auto` clips anything drawn outside the list box (an outer ring was cut on the first/last tab).",
|
|
3762
3795
|
"category": "Navigation",
|
|
3763
3796
|
"hidden": false,
|
|
3764
3797
|
"props": [
|
package/upgrade/index.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"package": "@hirobius/design-system",
|
|
3
|
-
"latest": "0.
|
|
3
|
+
"latest": "0.23.0",
|
|
4
4
|
"floor": "0.16.0",
|
|
5
5
|
"versions": [
|
|
6
6
|
{
|
|
@@ -51,6 +51,13 @@
|
|
|
51
51
|
"bump": "minor",
|
|
52
52
|
"breaking": 1,
|
|
53
53
|
"summary": "3 changes to make by hand (1 breaking), 1 that looks different and 2 deprecations."
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"version": "0.23.0",
|
|
57
|
+
"date": "2026-10-10",
|
|
58
|
+
"bump": "minor",
|
|
59
|
+
"breaking": 0,
|
|
60
|
+
"summary": "14 that look different."
|
|
54
61
|
}
|
|
55
62
|
],
|
|
56
63
|
"deprecated": [
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "0.23.0",
|
|
3
|
+
"date": "2026-10-10",
|
|
4
|
+
"bump": "minor",
|
|
5
|
+
"summary": "14 that look different.",
|
|
6
|
+
"backfilled": false,
|
|
7
|
+
"steps": [
|
|
8
|
+
{
|
|
9
|
+
"id": "0.23.0/value-changed/--semantic-accent-content",
|
|
10
|
+
"kind": "value-changed",
|
|
11
|
+
"impact": "look",
|
|
12
|
+
"plain": "Accent-intent text and icons (such as links) now render in a dark apple green instead of a dark neutral.",
|
|
13
|
+
"detect": {
|
|
14
|
+
"cssVars": [
|
|
15
|
+
"--semantic-accent-content"
|
|
16
|
+
],
|
|
17
|
+
"cssVarWrites": [
|
|
18
|
+
"--semantic-accent-content"
|
|
19
|
+
]
|
|
20
|
+
},
|
|
21
|
+
"facts": [
|
|
22
|
+
"css-var-changed:--semantic-accent-content::root",
|
|
23
|
+
"css-var-changed:--semantic-accent-content:[data-theme=\"dark\"]",
|
|
24
|
+
"css-var-changed:--semantic-accent-content:[data-theme=dark]"
|
|
25
|
+
],
|
|
26
|
+
"source": "CHANGELOG.md:40"
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"id": "0.23.0/value-changed/--semantic-accent-contentHover",
|
|
30
|
+
"kind": "value-changed",
|
|
31
|
+
"impact": "look",
|
|
32
|
+
"plain": "Hovered accent text now shifts to a darker apple green instead of a darker neutral.",
|
|
33
|
+
"detect": {
|
|
34
|
+
"cssVars": [
|
|
35
|
+
"--semantic-accent-contentHover"
|
|
36
|
+
],
|
|
37
|
+
"cssVarWrites": [
|
|
38
|
+
"--semantic-accent-contentHover"
|
|
39
|
+
]
|
|
40
|
+
},
|
|
41
|
+
"facts": [
|
|
42
|
+
"css-var-changed:--semantic-accent-contentHover::root",
|
|
43
|
+
"css-var-changed:--semantic-accent-contentHover:[data-theme=\"dark\"]",
|
|
44
|
+
"css-var-changed:--semantic-accent-contentHover:[data-theme=dark]"
|
|
45
|
+
],
|
|
46
|
+
"source": "CHANGELOG.md:40"
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"id": "0.23.0/value-changed/--semantic-accent-hover",
|
|
50
|
+
"kind": "value-changed",
|
|
51
|
+
"impact": "look",
|
|
52
|
+
"plain": "The accent fill on hover is now a deeper apple green instead of a dark neutral.",
|
|
53
|
+
"detect": {
|
|
54
|
+
"cssVars": [
|
|
55
|
+
"--semantic-accent-hover"
|
|
56
|
+
],
|
|
57
|
+
"cssVarWrites": [
|
|
58
|
+
"--semantic-accent-hover"
|
|
59
|
+
]
|
|
60
|
+
},
|
|
61
|
+
"facts": [
|
|
62
|
+
"css-var-changed:--semantic-accent-hover::root",
|
|
63
|
+
"css-var-changed:--semantic-accent-hover:[data-theme=\"dark\"]",
|
|
64
|
+
"css-var-changed:--semantic-accent-hover:[data-theme=dark]"
|
|
65
|
+
],
|
|
66
|
+
"source": "CHANGELOG.md:40"
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"id": "0.23.0/value-changed/--semantic-accent-pressed",
|
|
70
|
+
"kind": "value-changed",
|
|
71
|
+
"impact": "look",
|
|
72
|
+
"plain": "The accent fill while pressed is now a darker apple green instead of a near-black neutral.",
|
|
73
|
+
"detect": {
|
|
74
|
+
"cssVars": [
|
|
75
|
+
"--semantic-accent-pressed"
|
|
76
|
+
],
|
|
77
|
+
"cssVarWrites": [
|
|
78
|
+
"--semantic-accent-pressed"
|
|
79
|
+
]
|
|
80
|
+
},
|
|
81
|
+
"facts": [
|
|
82
|
+
"css-var-changed:--semantic-accent-pressed::root",
|
|
83
|
+
"css-var-changed:--semantic-accent-pressed:[data-theme=\"dark\"]",
|
|
84
|
+
"css-var-changed:--semantic-accent-pressed:[data-theme=dark]"
|
|
85
|
+
],
|
|
86
|
+
"source": "CHANGELOG.md:40"
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
"id": "0.23.0/value-changed/--semantic-accent-rest",
|
|
90
|
+
"kind": "value-changed",
|
|
91
|
+
"impact": "look",
|
|
92
|
+
"plain": "Interactive accent fills at rest (primary buttons, selected controls) now render in a bright apple green instead of a dark neutral, paired with dark on-accent text.",
|
|
93
|
+
"detect": {
|
|
94
|
+
"cssVars": [
|
|
95
|
+
"--semantic-accent-rest"
|
|
96
|
+
],
|
|
97
|
+
"cssVarWrites": [
|
|
98
|
+
"--semantic-accent-rest"
|
|
99
|
+
]
|
|
100
|
+
},
|
|
101
|
+
"facts": [
|
|
102
|
+
"css-var-changed:--semantic-accent-rest::root",
|
|
103
|
+
"css-var-changed:--semantic-accent-rest:[data-theme=\"dark\"]",
|
|
104
|
+
"css-var-changed:--semantic-accent-rest:[data-theme=dark]"
|
|
105
|
+
],
|
|
106
|
+
"source": "CHANGELOG.md:40"
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
"id": "0.23.0/value-changed/--semantic-accent-subtle",
|
|
110
|
+
"kind": "value-changed",
|
|
111
|
+
"impact": "look",
|
|
112
|
+
"plain": "The low-emphasis accent tint (hover and selection backgrounds) is now a faint apple green instead of a neutral tint.",
|
|
113
|
+
"detect": {
|
|
114
|
+
"cssVars": [
|
|
115
|
+
"--semantic-accent-subtle"
|
|
116
|
+
],
|
|
117
|
+
"cssVarWrites": [
|
|
118
|
+
"--semantic-accent-subtle"
|
|
119
|
+
]
|
|
120
|
+
},
|
|
121
|
+
"facts": [
|
|
122
|
+
"css-var-changed:--semantic-accent-subtle::root",
|
|
123
|
+
"css-var-changed:--semantic-accent-subtle:[data-theme=\"dark\"]",
|
|
124
|
+
"css-var-changed:--semantic-accent-subtle:[data-theme=dark]"
|
|
125
|
+
],
|
|
126
|
+
"source": "CHANGELOG.md:40"
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
"id": "0.23.0/value-changed/--semantic-color-border-accent",
|
|
130
|
+
"kind": "value-changed",
|
|
131
|
+
"impact": "look",
|
|
132
|
+
"plain": "Accent borders now render in apple green instead of a dark neutral.",
|
|
133
|
+
"detect": {
|
|
134
|
+
"cssVars": [
|
|
135
|
+
"--semantic-color-border-accent"
|
|
136
|
+
],
|
|
137
|
+
"cssVarWrites": [
|
|
138
|
+
"--semantic-color-border-accent"
|
|
139
|
+
]
|
|
140
|
+
},
|
|
141
|
+
"facts": [
|
|
142
|
+
"css-var-changed:--semantic-color-border-accent::root",
|
|
143
|
+
"css-var-changed:--semantic-color-border-accent:[data-theme=\"dark\"]",
|
|
144
|
+
"css-var-changed:--semantic-color-border-accent:[data-theme=dark]"
|
|
145
|
+
],
|
|
146
|
+
"source": "CHANGELOG.md:40"
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
"id": "0.23.0/value-changed/--semantic-color-content-accent",
|
|
150
|
+
"kind": "value-changed",
|
|
151
|
+
"impact": "look",
|
|
152
|
+
"plain": "Accent-intent text and icons on page and card surfaces now render in a dark apple green instead of a neutral.",
|
|
153
|
+
"detect": {
|
|
154
|
+
"cssVars": [
|
|
155
|
+
"--semantic-color-content-accent"
|
|
156
|
+
],
|
|
157
|
+
"cssVarWrites": [
|
|
158
|
+
"--semantic-color-content-accent"
|
|
159
|
+
]
|
|
160
|
+
},
|
|
161
|
+
"facts": [
|
|
162
|
+
"css-var-changed:--semantic-color-content-accent::root",
|
|
163
|
+
"css-var-changed:--semantic-color-content-accent:[data-theme=\"dark\"]",
|
|
164
|
+
"css-var-changed:--semantic-color-content-accent:[data-theme=dark]"
|
|
165
|
+
],
|
|
166
|
+
"source": "CHANGELOG.md:40"
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
"id": "0.23.0/value-changed/--semantic-color-content-onAccent",
|
|
170
|
+
"kind": "value-changed",
|
|
171
|
+
"impact": "look",
|
|
172
|
+
"plain": "Text and icons on accent fills are now a dark neutral instead of white, because the accent fill is a bright apple green that needs dark text for contrast.",
|
|
173
|
+
"detect": {
|
|
174
|
+
"cssVars": [
|
|
175
|
+
"--semantic-color-content-onAccent"
|
|
176
|
+
],
|
|
177
|
+
"cssVarWrites": [
|
|
178
|
+
"--semantic-color-content-onAccent"
|
|
179
|
+
]
|
|
180
|
+
},
|
|
181
|
+
"facts": [
|
|
182
|
+
"css-var-changed:--semantic-color-content-onAccent::root"
|
|
183
|
+
],
|
|
184
|
+
"source": "CHANGELOG.md:40"
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
"id": "0.23.0/value-changed/--semantic-color-surface-accent",
|
|
188
|
+
"kind": "value-changed",
|
|
189
|
+
"impact": "look",
|
|
190
|
+
"plain": "Accent background surfaces now render in a bright apple green instead of a dark neutral.",
|
|
191
|
+
"detect": {
|
|
192
|
+
"cssVars": [
|
|
193
|
+
"--semantic-color-surface-accent"
|
|
194
|
+
],
|
|
195
|
+
"cssVarWrites": [
|
|
196
|
+
"--semantic-color-surface-accent"
|
|
197
|
+
]
|
|
198
|
+
},
|
|
199
|
+
"facts": [
|
|
200
|
+
"css-var-changed:--semantic-color-surface-accent::root",
|
|
201
|
+
"css-var-changed:--semantic-color-surface-accent:[data-theme=\"dark\"]",
|
|
202
|
+
"css-var-changed:--semantic-color-surface-accent:[data-theme=dark]"
|
|
203
|
+
],
|
|
204
|
+
"source": "CHANGELOG.md:40"
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
"id": "0.23.0/value-changed/--semantic-color-surface-accentSubtle",
|
|
208
|
+
"kind": "value-changed",
|
|
209
|
+
"impact": "look",
|
|
210
|
+
"plain": "Faint accent background surfaces are now a pale apple green instead of a neutral tint.",
|
|
211
|
+
"detect": {
|
|
212
|
+
"cssVars": [
|
|
213
|
+
"--semantic-color-surface-accentSubtle"
|
|
214
|
+
],
|
|
215
|
+
"cssVarWrites": [
|
|
216
|
+
"--semantic-color-surface-accentSubtle"
|
|
217
|
+
]
|
|
218
|
+
},
|
|
219
|
+
"facts": [
|
|
220
|
+
"css-var-changed:--semantic-color-surface-accentSubtle::root",
|
|
221
|
+
"css-var-changed:--semantic-color-surface-accentSubtle:[data-theme=\"dark\"]",
|
|
222
|
+
"css-var-changed:--semantic-color-surface-accentSubtle:[data-theme=dark]"
|
|
223
|
+
],
|
|
224
|
+
"source": "CHANGELOG.md:40"
|
|
225
|
+
},
|
|
226
|
+
{
|
|
227
|
+
"id": "0.23.0/look/alert-callout-fill",
|
|
228
|
+
"kind": "look",
|
|
229
|
+
"impact": "look",
|
|
230
|
+
"plain": "Callout now renders as a tinted feedback fill (rounded, no left stripe) matching Alert, with the accent tone using a neutral muted fill.",
|
|
231
|
+
"source": "CHANGELOG.md:31"
|
|
232
|
+
},
|
|
233
|
+
{
|
|
234
|
+
"id": "0.23.0/look/mono-font-ibm-plex",
|
|
235
|
+
"kind": "look",
|
|
236
|
+
"impact": "look",
|
|
237
|
+
"plain": "Code text now draws in IBM Plex Mono instead of Geist Mono, so if you preload or self-host geist-mono-400.woff2, point it at ibm-plex-mono-400.woff2 from fonts.css instead.",
|
|
238
|
+
"detect": {
|
|
239
|
+
"regex": [
|
|
240
|
+
"Geist Mono",
|
|
241
|
+
"geist-mono"
|
|
242
|
+
]
|
|
243
|
+
},
|
|
244
|
+
"facts": [
|
|
245
|
+
"css-var-changed:--hds-font-family-mono::root",
|
|
246
|
+
"css-var-changed:--primitive-typography-family-mono::root",
|
|
247
|
+
"font-face-removed:Geist Mono/400/normal"
|
|
248
|
+
],
|
|
249
|
+
"source": "CHANGELOG.md:19"
|
|
250
|
+
},
|
|
251
|
+
{
|
|
252
|
+
"id": "0.23.0/look/table-align-reduced-motion",
|
|
253
|
+
"kind": "look",
|
|
254
|
+
"impact": "look",
|
|
255
|
+
"plain": "Table data cells vertically center their content (badge/status slots no longer float above text) and the caption gains spacing above the table; loading spinners and the progress bar stop animating under prefers-reduced-motion.",
|
|
256
|
+
"source": "CHANGELOG.md:73"
|
|
257
|
+
}
|
|
258
|
+
]
|
|
259
|
+
}
|