@hirobius/design-system 0.20.0 → 0.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/AGENTS.md +123 -0
  2. package/CONSUMING.md +4 -2
  3. package/DESIGN.md +28 -17
  4. package/NOTICE.md +1 -1
  5. package/README.md +37 -5
  6. package/dist/chunks/empty-state-DNoThgfV.js +1227 -0
  7. package/dist/chunks/form-By82qZcC.js +66 -0
  8. package/dist/fonts/geist-mono-400.woff2 +0 -0
  9. package/dist/fonts/satoshi-400.woff2 +0 -0
  10. package/dist/fonts/satoshi-500.woff2 +0 -0
  11. package/dist/fonts/satoshi-700.woff2 +0 -0
  12. package/dist/fonts.css +53 -0
  13. package/dist/form.js +1 -1
  14. package/dist/hirobius-ui.js +876 -877
  15. package/dist/manifest.js +1 -1
  16. package/dist/patterns.js +189 -170
  17. package/dist/styles.css +2 -2
  18. package/dist/tokens.css +1 -1
  19. package/dist/tokens.js +136 -57
  20. package/dist/types/src/app/components/alert-dialog.d.ts +5 -0
  21. package/dist/types/src/app/components/asset-img.d.ts +1 -0
  22. package/dist/types/src/app/components/avatar-group.d.ts +1 -0
  23. package/dist/types/src/app/components/badge.d.ts +1 -1
  24. package/dist/types/src/app/components/blockquote.d.ts +1 -0
  25. package/dist/types/src/app/components/button.d.ts +2 -0
  26. package/dist/types/src/app/components/card.d.ts +3 -2
  27. package/dist/types/src/app/components/data-table-section.d.ts +1 -0
  28. package/dist/types/src/app/components/destructive-section.d.ts +1 -0
  29. package/dist/types/src/app/components/dialog.d.ts +1 -0
  30. package/dist/types/src/app/components/error-pattern.d.ts +6 -1
  31. package/dist/types/src/app/components/form-actions.d.ts +1 -0
  32. package/dist/types/src/app/components/form-control.d.ts +10 -0
  33. package/dist/types/src/app/components/grid.d.ts +5 -0
  34. package/dist/types/src/app/components/icon.d.ts +1 -0
  35. package/dist/types/src/app/components/kbd.d.ts +1 -0
  36. package/dist/types/src/app/components/metadata-list.d.ts +1 -0
  37. package/dist/types/src/app/components/metric-tiles.d.ts +1 -0
  38. package/dist/types/src/app/components/progress.d.ts +1 -1
  39. package/dist/types/src/app/components/skeleton.d.ts +1 -1
  40. package/dist/types/src/app/components/stat.d.ts +4 -3
  41. package/dist/types/src/app/components/status-tile.d.ts +3 -2
  42. package/dist/types/src/app/components/table.d.ts +5 -0
  43. package/dist/types/src/app/components/text.d.ts +53 -6
  44. package/dist/types/src/app/components/timestamp.d.ts +1 -0
  45. package/dist/types/src/app/data/manifest-types.d.ts +4 -0
  46. package/dist/types/src/app/design-system/generated-token-refs.d.ts +37 -28
  47. package/dist/types/src/app/design-system/generated-token-values.d.ts +3 -0
  48. package/dist/types/src/app/design-system/tokens.d.ts +117 -15
  49. package/dist/types/src/index.d.ts +43 -40
  50. package/dist/variables.css +41 -33
  51. package/docs/CONSUMING.md +63 -39
  52. package/hirobius.tokens.json +77 -73
  53. package/llms.txt +158 -50
  54. package/mcp/catalog.mjs +366 -0
  55. package/mcp/guide.mjs +315 -0
  56. package/mcp/hds-mcp.mjs +49 -0
  57. package/mcp/server.mjs +94 -0
  58. package/package.json +35 -9
  59. package/public/hds-manifest.json +348 -254
  60. package/public/llms/components.txt +4 -3
  61. package/public/llms/layout.txt +1 -1
  62. package/public/llms-full.txt +190 -70
  63. package/public/llms.txt +158 -50
  64. package/scripts/eslint-plugin-hds/index.d.mts +29 -0
  65. package/scripts/eslint-plugin-hds/index.mjs +55 -0
  66. package/scripts/eslint-plugin-hds/package.json +30 -0
  67. package/scripts/eslint-plugin-hds/rules/no-raw-controls.mjs +47 -0
  68. package/scripts/eslint-plugin-hds/rules/no-raw-hex.mjs +70 -0
  69. package/scripts/eslint-plugin-hds/rules/no-raw-px-spacing.mjs +125 -0
  70. package/scripts/eslint-plugin-hds/rules/prefer-hds-layout-primitive.mjs +54 -0
  71. package/scripts/eslint-plugin-hds/rules/sx-token-first.mjs +111 -0
  72. package/scripts/eslint-plugin-hds/rules/utils.mjs +66 -0
  73. package/src/app/data/component-api.json +114 -53
  74. package/dist/chunks/empty-state-BBqhCx0S.js +0 -1217
  75. package/dist/chunks/form-COP3vK9_.js +0 -66
  76. package/dist/types/src/app/components/status-dot.d.ts +0 -39
package/dist/tokens.js CHANGED
@@ -134,7 +134,8 @@ const a = {
134
134
  "3xl": "30px",
135
135
  "4xl": "36px",
136
136
  "5xl": "48px",
137
- "6xl": "60px"
137
+ "6xl": "60px",
138
+ code: "13px"
138
139
  },
139
140
  weight: {
140
141
  regular: "400",
@@ -147,7 +148,9 @@ const a = {
147
148
  tight: "1.25",
148
149
  snug: "1.375",
149
150
  normal: "1.5",
150
- relaxed: "1.625"
151
+ relaxed: "1.625",
152
+ display: "1.05",
153
+ body: "1.6"
151
154
  },
152
155
  letterSpacing: {
153
156
  tight: "-0.01em",
@@ -258,26 +261,12 @@ const a = {
258
261
  letterSpacing: "var(--semantic-typography-display-letter-spacing)",
259
262
  lineHeight: "var(--semantic-typography-display-line-height)"
260
263
  },
261
- h1: {
262
- fontFamily: "var(--semantic-typography-h1-font-family)",
263
- fontSize: "var(--semantic-typography-h1-font-size)",
264
- fontWeight: "var(--semantic-typography-h1-font-weight)",
265
- letterSpacing: "var(--semantic-typography-h1-letter-spacing)",
266
- lineHeight: "var(--semantic-typography-h1-line-height)"
267
- },
268
- h2: {
269
- fontFamily: "var(--semantic-typography-h2-font-family)",
270
- fontSize: "var(--semantic-typography-h2-font-size)",
271
- fontWeight: "var(--semantic-typography-h2-font-weight)",
272
- letterSpacing: "var(--semantic-typography-h2-letter-spacing)",
273
- lineHeight: "var(--semantic-typography-h2-line-height)"
274
- },
275
- h3: {
276
- fontFamily: "var(--semantic-typography-h3-font-family)",
277
- fontSize: "var(--semantic-typography-h3-font-size)",
278
- fontWeight: "var(--semantic-typography-h3-font-weight)",
279
- letterSpacing: "var(--semantic-typography-h3-letter-spacing)",
280
- lineHeight: "var(--semantic-typography-h3-line-height)"
264
+ title: {
265
+ fontFamily: "var(--semantic-typography-title-font-family)",
266
+ fontSize: "var(--semantic-typography-title-font-size)",
267
+ fontWeight: "var(--semantic-typography-title-font-weight)",
268
+ letterSpacing: "var(--semantic-typography-title-letter-spacing)",
269
+ lineHeight: "var(--semantic-typography-title-line-height)"
281
270
  },
282
271
  body: {
283
272
  fontFamily: "var(--semantic-typography-body-font-family)",
@@ -302,14 +291,6 @@ const a = {
302
291
  letterSpacing: "var(--semantic-typography-caption-letter-spacing)",
303
292
  lineHeight: "var(--semantic-typography-caption-line-height)"
304
293
  },
305
- eyebrow: {
306
- fontFamily: "var(--semantic-typography-eyebrow-font-family)",
307
- fontSize: "var(--semantic-typography-eyebrow-font-size)",
308
- fontWeight: "var(--semantic-typography-eyebrow-font-weight)",
309
- letterSpacing: "var(--semantic-typography-eyebrow-letter-spacing)",
310
- lineHeight: "var(--semantic-typography-eyebrow-line-height)",
311
- textTransform: "var(--semantic-typography-eyebrow-text-transform)"
312
- },
313
294
  mono: {
314
295
  fontFamily: "var(--semantic-typography-mono-font-family)",
315
296
  fontSize: "var(--semantic-typography-mono-font-size)",
@@ -538,52 +519,150 @@ const o = "var(--primitive-typography-family-primary)", n = "var(--primitive-typ
538
519
  }
539
520
  },
540
521
  typography: {
522
+ /** @deprecated hds#483 — use `typeStyles.ui`.
523
+ * @removeIn 1.0.0 */
541
524
  label: i.semantic.typography.ui,
525
+ /** @deprecated hds#483 — use `typeStyles.ui`.
526
+ * @removeIn 1.0.0 */
542
527
  labelDescriptive: i.semantic.typography.ui,
528
+ /** @deprecated hds#483 — use `typeStyles.mono`.
529
+ * @removeIn 1.0.0 */
543
530
  labelTechnical: i.semantic.typography.mono
544
531
  }
545
532
  },
546
533
  // Each style object spreads directly into a React inline style prop.
547
534
  // CSS vars resolve at paint time — no hardcoded pixel values.
548
535
  typeStyles: {
549
- // ── Canonical composites (Adrian directive 2026-05-04) ────────────────────
550
- // 7 roles. body/ui/eyebrow/mono carry maxWidth: 60ch where appropriate.
551
- // Eyebrow bakes text-transform: uppercase + caps tracking into the token —
552
- // never re-apply textTransform inline. Casing changes are eyebrow-only.
536
+ // ── The 5-role ramp plus mono (hds#483) ───────────────────────────────────
537
+ // display 48 / title 24 / body 16 / ui 14 / caption 12 / mono 13. body, ui
538
+ // and mono carry maxWidth: 60ch. Casing is never changed inline.
553
539
  display: i.semantic.typography.display,
554
- h1: i.semantic.typography.h1,
555
- h2: i.semantic.typography.h2,
556
- h3: i.semantic.typography.h3,
540
+ title: i.semantic.typography.title,
557
541
  body: i.semantic.typography.body,
558
542
  ui: i.semantic.typography.ui,
559
- eyebrow: i.semantic.typography.eyebrow,
560
- mono: i.semantic.typography.mono,
561
- // ── Migration aliases → canonical composites ──────────────────────────────
562
- // Pre-2026-05-04 names map to the new roles. small → ui; the eyebrow-pattern
563
- // callsites migrate explicitly to typeStyles.eyebrow as part of the
564
- // ops-dashboard sweep. caption now resolves to its own 12/16 composite
565
- // (semantic.typography.caption, matching Figma) rather than aliasing ui.
566
- small: i.semantic.typography.ui,
567
543
  caption: i.semantic.typography.caption,
568
- heading1: i.semantic.typography.h1,
569
- heading2: i.semantic.typography.h2,
570
- heading3: i.semantic.typography.h3,
571
- technical: i.semantic.typography.mono,
572
- badge: i.semantic.typography.eyebrow,
573
- micro: i.semantic.typography.eyebrow,
544
+ mono: i.semantic.typography.mono,
545
+ // ── Deprecated aliases → the six roles ────────────────────────────────────
546
+ // Every pre-cut name still resolves, to the role it now points at.
547
+ /**
548
+ * @deprecated hds#483 — use `typeStyles.title`.
549
+ * @removeIn 1.0.0
550
+ */
551
+ h1: i.semantic.typography.title,
552
+ /**
553
+ * @deprecated hds#483 — use `typeStyles.title`.
554
+ * @removeIn 1.0.0
555
+ */
556
+ h2: i.semantic.typography.title,
557
+ /**
558
+ * @deprecated hds#483 — use `typeStyles.title`.
559
+ * @removeIn 1.0.0
560
+ */
561
+ h3: i.semantic.typography.title,
562
+ /**
563
+ * @deprecated hds#483 — use `typeStyles.title`.
564
+ * @removeIn 1.0.0
565
+ */
566
+ heading1: i.semantic.typography.title,
567
+ /**
568
+ * @deprecated hds#483 — use `typeStyles.title`.
569
+ * @removeIn 1.0.0
570
+ */
571
+ heading2: i.semantic.typography.title,
572
+ /**
573
+ * @deprecated hds#483 — use `typeStyles.title`.
574
+ * @removeIn 1.0.0
575
+ */
576
+ heading3: i.semantic.typography.title,
577
+ /**
578
+ * @deprecated hds#483 — use `typeStyles.title`.
579
+ * @removeIn 1.0.0
580
+ */
581
+ headingHero: i.semantic.typography.title,
582
+ /**
583
+ * @deprecated hds#483 — use `typeStyles.title`.
584
+ * @removeIn 1.0.0
585
+ */
586
+ headingSection: i.semantic.typography.title,
587
+ /**
588
+ * @deprecated hds#483 — use `typeStyles.title`.
589
+ * @removeIn 1.0.0
590
+ */
591
+ display2: i.semantic.typography.title,
592
+ /**
593
+ * @deprecated hds#483 — use `typeStyles.display`.
594
+ * @removeIn 1.0.0
595
+ */
574
596
  displayXl: i.semantic.typography.display,
597
+ /**
598
+ * @deprecated hds#483 — use `typeStyles.display`.
599
+ * @removeIn 1.0.0
600
+ */
575
601
  display1: i.semantic.typography.display,
576
- display2: i.semantic.typography.h1,
577
- headingHero: i.semantic.typography.h1,
578
- headingSection: i.semantic.typography.h3,
579
- title: i.semantic.typography.body,
602
+ /**
603
+ * @deprecated hds#483 — use `typeStyles.body`.
604
+ * @removeIn 1.0.0
605
+ */
580
606
  body2: i.semantic.typography.body,
607
+ /**
608
+ * @deprecated hds#483 — use `typeStyles.body`.
609
+ * @removeIn 1.0.0
610
+ */
581
611
  bodyLarge: i.semantic.typography.body,
612
+ /**
613
+ * @deprecated hds#483 — use `typeStyles.ui`.
614
+ * @removeIn 1.0.0
615
+ */
616
+ small: i.semantic.typography.ui,
617
+ /**
618
+ * @deprecated hds#483 — use `typeStyles.ui`.
619
+ * @removeIn 1.0.0
620
+ */
582
621
  bodySmall: i.semantic.typography.ui,
583
- monoXs: i.semantic.typography.mono,
584
- monoSm: i.semantic.typography.mono,
622
+ /**
623
+ * @deprecated hds#483 — use `typeStyles.ui`.
624
+ * @removeIn 1.0.0
625
+ */
585
626
  label: i.semantic.typography.ui,
627
+ /**
628
+ * @deprecated hds#483 — use `typeStyles.ui`.
629
+ * @removeIn 1.0.0
630
+ */
586
631
  labelDescriptive: i.semantic.typography.ui,
632
+ /**
633
+ * @deprecated hds#483 — use `typeStyles.caption`.
634
+ * @removeIn 1.0.0
635
+ */
636
+ eyebrow: i.semantic.typography.caption,
637
+ /**
638
+ * @deprecated hds#483 — use `typeStyles.caption`.
639
+ * @removeIn 1.0.0
640
+ */
641
+ badge: i.semantic.typography.caption,
642
+ /**
643
+ * @deprecated hds#483 — use `typeStyles.caption`.
644
+ * @removeIn 1.0.0
645
+ */
646
+ micro: i.semantic.typography.caption,
647
+ /**
648
+ * @deprecated hds#483 — use `typeStyles.mono`.
649
+ * @removeIn 1.0.0
650
+ */
651
+ technical: i.semantic.typography.mono,
652
+ /**
653
+ * @deprecated hds#483 — use `typeStyles.mono`.
654
+ * @removeIn 1.0.0
655
+ */
656
+ monoXs: i.semantic.typography.mono,
657
+ /**
658
+ * @deprecated hds#483 — use `typeStyles.mono`.
659
+ * @removeIn 1.0.0
660
+ */
661
+ monoSm: i.semantic.typography.mono,
662
+ /**
663
+ * @deprecated hds#483 — use `typeStyles.mono`.
664
+ * @removeIn 1.0.0
665
+ */
587
666
  labelTechnical: i.semantic.typography.mono
588
667
  },
589
668
  // ── Icons ────────────────────────────────────────────────────────────────────
@@ -2,6 +2,7 @@
2
2
  * AlertDialog — modal confirmation dialog on Radix AlertDialog.
3
3
  * @category Overlays
4
4
  * @tier primitive
5
+ * @figma https://www.figma.com/design/2VgBbVpKiDnu0aftJEVyBQ/HDS-Tokens-Components-Copy?node-id=2035-24
5
6
  * @doc-exempt: no Overlays doc page yet — add demo when the overlays page is created
6
7
  *
7
8
  * Radix AlertDialog (@radix-ui/react-alert-dialog) themed with the overlay role
@@ -58,6 +59,10 @@ interface AlertDialogComponent extends React.FC<React.ComponentProps<typeof Aler
58
59
  /**
59
60
  * AlertDialog root + parts. Controlled via `open`/`onOpenChange`, or
60
61
  * uncontrolled with `defaultOpen`.
62
+ * @usage Confirm a destructive or irreversible action (delete, archive, remove) before it runs, with Cancel and Action buttons.
63
+ * @whenNot A modal that collects input or shows content, or a confirmation after the action is done.
64
+ * @useInstead Dialog a modal with a form or other content
65
+ * @useInstead ToastProvider a brief confirmation after the action
61
66
  * @public
62
67
  */
63
68
  export declare const AlertDialog: AlertDialogComponent;
@@ -3,6 +3,7 @@
3
3
  * Contexts: default, lightbox, and detail.
4
4
  * @category Display
5
5
  * @tier primitive
6
+ * @figma https://www.figma.com/design/2VgBbVpKiDnu0aftJEVyBQ/HDS-Tokens-Components-Copy?node-id=2041-67
6
7
  */
7
8
  import { CSSProperties } from 'react';
8
9
  import type React from 'react';
@@ -2,6 +2,7 @@
2
2
  * AvatarGroup — an overlapping cluster of Avatars with an overflow count.
3
3
  * @category Display
4
4
  * @tier primitive
5
+ * @figma https://www.figma.com/design/2VgBbVpKiDnu0aftJEVyBQ/HDS-Tokens-Components-Copy?node-id=2030-63
5
6
  */
6
7
  import * as React from 'react';
7
8
  import { type VariantProps } from 'class-variance-authority';
@@ -22,7 +22,7 @@ export interface BadgeProps extends Omit<React.HTMLAttributes<HTMLSpanElement>,
22
22
  dot?: boolean;
23
23
  /** Dot diameter; used only with `dot`. */
24
24
  size?: 'sm' | 'md' | 'lg';
25
- /** Names the dot: role="status" with this aria-label. Without it the dot is aria-hidden. */
25
+ /** Names a `dot` badge: role="img" with this aria-label. Without it the dot is aria-hidden. A text badge ignores it: put the text in `children`. */
26
26
  label?: string;
27
27
  }
28
28
  /** Compact metadata/status chip. Tone is the only styling input. */
@@ -2,6 +2,7 @@
2
2
  * Blockquote — quoted passage with an optional attribution.
3
3
  * @category Typography
4
4
  * @tier primitive
5
+ * @figma https://www.figma.com/design/2VgBbVpKiDnu0aftJEVyBQ/HDS-Tokens-Components-Copy?node-id=2024-18
5
6
  */
6
7
  import * as React from 'react';
7
8
  import { type VariantProps } from 'class-variance-authority';
@@ -40,6 +40,8 @@ declare const buttonVariants: (props?: ({
40
40
  type ButtonVariantProps = VariantProps<typeof buttonVariants>;
41
41
  /** @public */
42
42
  export interface ButtonProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'disabled'>, Omit<ButtonVariantProps, 'iconOnly'> {
43
+ /** Visual treatment: `primary`, `secondary` or `tertiary`. Defaults to `secondary` (an outline), so pass `primary` for the main action. */
44
+ variant?: ButtonVariantProps['variant'];
43
45
  /** Render the button chrome onto a single child element for link semantics. */
44
46
  asChild?: boolean;
45
47
  /** Optional accessible label used when children are not suitable as the name. */
@@ -22,7 +22,7 @@
22
22
  * zone (right-aligned, holds <Badge> / <Tag> for status, never raw spans).
23
23
  * - Progress: full-width 4px bar in a reserved 16px vertical rail. Owns its
24
24
  * spacing — never crowds adjacent prose.
25
- * - Metric: single label-uppercase + big value (h2) + optional sub-line.
25
+ * - Metric: single label + big value (title) + optional sub-line.
26
26
  * Reserved vertical block. Use multiple side-by-side via flex/grid container.
27
27
  * - Body: prose, lists, structured content. NO inline status, progress, or
28
28
  * thin colored bars. Group sections via separate <Card.Body> blocks.
@@ -130,9 +130,10 @@ export interface CardMetricProps extends React.HTMLAttributes<HTMLDivElement> {
130
130
  tone?: CardTone;
131
131
  }
132
132
  /**
133
- * Card.Metric — one uppercase label, a large value and an optional sub-line inside a Card.
133
+ * Card.Metric — one label, a large value and an optional sub-line inside a Card.
134
134
  * @usage Show one headline figure (a KPI, a count, a total) with its label inside a Card.
135
135
  * @whenNot A metric outside a Card, or several figures that share one label.
136
+ * @useInstead MetricTiles a row of headline numbers with no enclosing Card
136
137
  */
137
138
  declare const CardMetric: React.ForwardRefExoticComponent<CardMetricProps & React.RefAttributes<HTMLDivElement>>;
138
139
  /**
@@ -2,6 +2,7 @@
2
2
  * DataTableSection - a titled table with a toolbar, row actions and an empty state.
3
3
  * @category Display
4
4
  * @tier pattern
5
+ * @figma https://www.figma.com/design/2VgBbVpKiDnu0aftJEVyBQ/HDS-Tokens-Components-Copy?node-id=2075-268
5
6
  */
6
7
  import * as React from 'react';
7
8
  import { type TableColumn } from './table.js';
@@ -2,6 +2,7 @@
2
2
  * DestructiveSection - the one place a screen puts an irreversible action.
3
3
  * @category Actions
4
4
  * @tier pattern
5
+ * @figma https://www.figma.com/design/2VgBbVpKiDnu0aftJEVyBQ/HDS-Tokens-Components-Copy?node-id=2076-3
5
6
  */
6
7
  import * as React from 'react';
7
8
  /** @public */
@@ -84,6 +84,7 @@ interface DialogComponent extends React.FC<DialogProps> {
84
84
  * @useInstead Tooltip a short hint on hover or focus
85
85
  * @useInstead Alert a message that needs no reply
86
86
  * @useInstead ToastProvider a brief confirmation
87
+ * @useInstead AlertDialog confirming a destructive or irreversible action
87
88
  * @slot trigger The element that opens the dialog (Dialog.Trigger).
88
89
  * @slot overlay The scrim that dims the page behind the dialog (Dialog.Overlay).
89
90
  * @slot surface The modal surface (Dialog.Content).
@@ -3,8 +3,13 @@ export type ErrorPatternProps = {
3
3
  displayText?: string;
4
4
  /** Supporting message explaining the recovery state to the user. */
5
5
  message?: string;
6
+ /**
7
+ * Fill the viewport height and centre the surface in it, for a routed error page.
8
+ * Off by default: the pattern then fits its container and never exceeds it.
9
+ */
10
+ fullPage?: boolean;
6
11
  };
7
12
  /**
8
13
  * @public
9
14
  */
10
- export declare function ErrorPattern({ displayText, message, }: ErrorPatternProps): import("react/jsx-runtime").JSX.Element;
15
+ export declare function ErrorPattern({ displayText, message, fullPage, }: ErrorPatternProps): import("react/jsx-runtime").JSX.Element;
@@ -2,6 +2,7 @@
2
2
  * FormActions - the footer row of a form: primary right-most, secondary to its left.
3
3
  * @category Actions
4
4
  * @tier pattern
5
+ * @figma https://www.figma.com/design/2VgBbVpKiDnu0aftJEVyBQ/HDS-Tokens-Components-Copy?node-id=2075-87
5
6
  */
6
7
  import * as React from 'react';
7
8
  /** @public */
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Shared width contract for text-entry form controls (Input, Textarea, Select,
3
+ * Combobox, Slider): they fill their container up to a maximum, so a field in
4
+ * a wide Surface does not stretch to 1152px (hds#522).
5
+ *
6
+ * The cap is 40rem by default. Override it per tree or per control by setting
7
+ * the `--hds-form-control-max-width` custom property (any CSS length, or
8
+ * `none`), or pass `className="max-w-none"` where the control takes one.
9
+ */
10
+ export declare const FORM_CONTROL_WIDTH = "w-full max-w-[var(--hds-form-control-max-width,40rem)]";
@@ -50,6 +50,11 @@ export interface GridProps extends React.HTMLAttributes<HTMLDivElement> {
50
50
  style?: CSSProperties;
51
51
  /** Escape hatch: only use when tokenized props cannot express the required wrapper class. */
52
52
  className?: string;
53
+ /**
54
+ * Cross-axis alignment of items in a row. Defaults to 'start': items hug their
55
+ * own height. Pass 'stretch' where a row of tiles must share one height.
56
+ */
57
+ align?: 'start' | 'center' | 'end' | 'stretch';
53
58
  /** Element rendered as the outer wrapper. Defaults to 'div'. */
54
59
  as?: React.ElementType;
55
60
  }
@@ -2,6 +2,7 @@
2
2
  * Icon — semantic icon wrapper for Lucide icons.
3
3
  * @category Display
4
4
  * @tier primitive
5
+ * @figma https://www.figma.com/design/2VgBbVpKiDnu0aftJEVyBQ/HDS-Tokens-Components-Copy?node-id=27-2
5
6
  * @usage Draw a Lucide glyph at a size and colour from the design tokens.
6
7
  * @whenNot A control someone can activate, or a picture that carries content.
7
8
  * @useInstead Button a clickable control, with iconOnly for an icon-only one
@@ -2,6 +2,7 @@
2
2
  * Kbd — inline keyboard key / shortcut hint rendered as a native <kbd>.
3
3
  * @category Display
4
4
  * @tier primitive
5
+ * @figma https://www.figma.com/design/2VgBbVpKiDnu0aftJEVyBQ/HDS-Tokens-Components-Copy?node-id=2026-9
5
6
  * @usage Show a keyboard key or shortcut hint inline, as a native kbd element.
6
7
  * @whenNot Code samples, or a control that runs the shortcut.
7
8
  * @useInstead Text inline code and other typography
@@ -3,6 +3,7 @@
3
3
  * Owner, Updated…). The idiomatic replacement for badge-stickers-on-prose.
4
4
  * @category Display
5
5
  * @tier pattern
6
+ * @figma https://www.figma.com/design/2VgBbVpKiDnu0aftJEVyBQ/HDS-Tokens-Components-Copy?node-id=2041-47
6
7
  * @public
7
8
  */
8
9
  import * as React from 'react';
@@ -22,6 +22,7 @@ export interface MetricTileProps extends Omit<React.HTMLAttributes<HTMLDivElemen
22
22
  * surface at one fixed min-height. Wraps `Card.Metric` (the sibling with the
23
23
  * eyebrow / h2 / caption scale) and adds the surface and the fixed height, so a
24
24
  * tile needs no enclosing `Card`.
25
+ * @figma https://www.figma.com/design/2VgBbVpKiDnu0aftJEVyBQ/HDS-Tokens-Components-Copy?node-id=2075-114
25
26
  */
26
27
  export declare const MetricTile: React.ForwardRefExoticComponent<MetricTileProps & React.RefAttributes<HTMLDivElement>>;
27
28
  /** @public */
@@ -15,7 +15,7 @@ declare const progressTrackVariants: (props?: ({
15
15
  } & import("class-variance-authority/dist/types").ClassProp) | undefined) => string;
16
16
  declare const PROGRESS_TONES: {
17
17
  readonly neutral: {
18
- readonly bar: "bg-accent";
18
+ readonly bar: "bg-primary";
19
19
  readonly ring: "text-primary";
20
20
  };
21
21
  readonly danger: {
@@ -18,7 +18,7 @@ type SkeletonVariantProps = VariantProps<typeof skeletonVariants>;
18
18
  export interface SkeletonProps extends React.HTMLAttributes<HTMLDivElement>, SkeletonVariantProps {
19
19
  /** Explicit width (number → px, or any CSS length). */
20
20
  width?: number | string;
21
- /** Explicit height (number → px, or any CSS length). For `text`, defaults to 1em. */
21
+ /** Explicit height (number → px, or any CSS length). For `text`, defaults to 1em; for `rectangular`, 5rem. */
22
22
  height?: number | string;
23
23
  }
24
24
  /**
@@ -16,9 +16,10 @@ export interface StatProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'c
16
16
  sub?: React.ReactNode;
17
17
  }
18
18
  /**
19
- * Headline metric — large value, uppercase caption label, optional sub-line.
20
- * @usage Show one standalone headline figure with its label and an optional sub-line.
21
- * @whenNot A figure inside a Card, or a status with a trailing badge.
19
+ * Headline metric — large value, caption label, optional sub-line.
20
+ * @usage Show one headline figure inline, inside prose or a dense list, with its label and an optional sub-line.
21
+ * @whenNot A row of headline numbers on a screen, a figure inside a Card, or a status with a trailing badge.
22
+ * @useInstead MetricTiles a row of headline numbers (one MetricTile per number)
22
23
  * @useInstead Card.Metric a figure inside a Card (hds#254 folds Stat into the Card slot)
23
24
  * @useInstead StatusTile a titled status with notes and a trailing badge
24
25
  */
@@ -20,8 +20,9 @@ export interface StatusTileProps extends Omit<React.HTMLAttributes<HTMLDivElemen
20
20
  * — every tile should look the same so feedback signals stay reserved for
21
21
  * genuinely interrupting states.
22
22
  * @usage Show a titled status block with optional notes and a trailing badge or affordance.
23
- * @whenNot A single headline figure, or a row inside a list.
24
- * @useInstead Card.Metric a headline figure (hds#254 folds StatusTile into the Card slot)
23
+ * @whenNot A headline number (never a value), or a row inside a list.
24
+ * @useInstead MetricTiles a row of headline numbers
25
+ * @useInstead Card.Metric a headline figure inside a Card (hds#254 folds StatusTile into the Card slot)
25
26
  * @useInstead StatusListItem a status row inside a list
26
27
  */
27
28
  export declare const StatusTile: React.ForwardRefExoticComponent<StatusTileProps & React.RefAttributes<HTMLDivElement>>;
@@ -75,6 +75,11 @@ export declare function Table({ columns, rows, caption, captionAction, descripti
75
75
  * default, compact inside `[data-density="compact"]`); pass a value to fix it.
76
76
  */
77
77
  density?: TableDensity;
78
+ /**
79
+ * Drop the scroll region's own inset. On by default: every cell already carries the
80
+ * surface inset, so a padded region doubled it (48px at the edges, hds#522). Pass
81
+ * `flush={false}` to restore the extra region padding.
82
+ */
78
83
  flush?: boolean;
79
84
  stickyHeader?: boolean;
80
85
  }): import("react/jsx-runtime").JSX.Element;
@@ -3,6 +3,7 @@
3
3
  *
4
4
  * @category Typography
5
5
  * @tier primitive
6
+ * @figma https://www.figma.com/design/2VgBbVpKiDnu0aftJEVyBQ/HDS-Tokens-Components-Copy?node-id=2022-31
6
7
  * @usage Set any text on the type ramp, with the element chosen by `as`.
7
8
  * @whenNot Navigation links, or a keyboard hint.
8
9
  * @useInstead InlineLink a link inside body copy
@@ -10,12 +11,58 @@
10
11
  * @doc-exempt: typography primitive is documented through the Typography ramp page (TypographyPage), not as a standalone component card
11
12
  */
12
13
  import { type CSSProperties, type ElementType, type HTMLAttributes, type ReactNode } from 'react';
13
- import { type VariantProps } from 'class-variance-authority';
14
- declare const textVariants: (props?: ({
15
- variant?: "display" | "caption" | "body" | "heading1" | "heading2" | "heading3" | "ui" | "eyebrow" | "technical" | "badge" | "docLede" | "docBody" | "docSmall" | "docCode" | null | undefined;
16
- } & import("class-variance-authority/dist/types").ClassProp) | undefined) => string;
17
- type TextVariantProps = VariantProps<typeof textVariants>;
18
- type TextVariant = NonNullable<TextVariantProps['variant']>;
14
+ /** The six roles of the type ramp, plus the deprecated names that still resolve. */
15
+ export type TextVariant = 'display' | 'title' | 'body' | 'ui' | 'caption' | 'mono'
16
+ /**
17
+ * @deprecated hds#483 — use `title`.
18
+ * @removeIn 1.0.0
19
+ */
20
+ | 'heading1'
21
+ /**
22
+ * @deprecated hds#483 — use `title`.
23
+ * @removeIn 1.0.0
24
+ */
25
+ | 'heading2'
26
+ /**
27
+ * @deprecated hds#483 — use `title`.
28
+ * @removeIn 1.0.0
29
+ */
30
+ | 'heading3'
31
+ /**
32
+ * @deprecated hds#483 — use `mono`.
33
+ * @removeIn 1.0.0
34
+ */
35
+ | 'technical'
36
+ /**
37
+ * @deprecated hds#483 — use `caption`.
38
+ * @removeIn 1.0.0
39
+ */
40
+ | 'eyebrow'
41
+ /**
42
+ * @deprecated hds#483 — use `caption`.
43
+ * @removeIn 1.0.0
44
+ */
45
+ | 'badge'
46
+ /**
47
+ * @deprecated hds#483 — use `body`.
48
+ * @removeIn 1.0.0
49
+ */
50
+ | 'docLede'
51
+ /**
52
+ * @deprecated hds#483 — use `body`.
53
+ * @removeIn 1.0.0
54
+ */
55
+ | 'docBody'
56
+ /**
57
+ * @deprecated hds#483 — use `ui`.
58
+ * @removeIn 1.0.0
59
+ */
60
+ | 'docSmall'
61
+ /**
62
+ * @deprecated hds#483 — use `mono`.
63
+ * @removeIn 1.0.0
64
+ */
65
+ | 'docCode';
19
66
  type TextTag = 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'p' | 'span' | 'div';
20
67
  /** @public */
21
68
  export type TextProps = {
@@ -2,6 +2,7 @@
2
2
  * Timestamp — renders a date/time as a semantic <time> element.
3
3
  * @category Display
4
4
  * @tier primitive
5
+ * @figma https://www.figma.com/design/2VgBbVpKiDnu0aftJEVyBQ/HDS-Tokens-Components-Copy?node-id=2031-11
5
6
  */
6
7
  import * as React from 'react';
7
8
  /** @public */
@@ -78,6 +78,8 @@ export type ManifestComponentSpec = {
78
78
  hidden?: boolean;
79
79
  docExempt?: boolean;
80
80
  tier?: string;
81
+ /** In the ratified core set (hds#254, ADR-031). Present only as `true`; independent of `tier`. */
82
+ core?: true;
81
83
  stability?: 'stable' | 'beta';
82
84
  consumers?: string[];
83
85
  tokenMapping?: Record<string, string>;
@@ -129,6 +131,8 @@ export type ManifestApiComponent = {
129
131
  hidden?: boolean;
130
132
  figmaUrl?: string | null;
131
133
  description?: string;
134
+ /** In the ratified core set (hds#254, ADR-031). Present only as `true`. */
135
+ core?: true;
132
136
  usage?: ManifestUsage;
133
137
  keyboard?: ManifestKeyboardEntry[];
134
138
  aiRules?: string;