@hirobius/design-system 0.9.0 → 0.11.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/dist/tokens.js CHANGED
@@ -285,6 +285,13 @@ const a = {
285
285
  lineHeight: "var(--semantic-typography-ui-line-height)",
286
286
  maxWidth: "var(--semantic-typography-ui-max-width)"
287
287
  },
288
+ caption: {
289
+ fontFamily: "var(--semantic-typography-caption-font-family)",
290
+ fontSize: "var(--semantic-typography-caption-font-size)",
291
+ fontWeight: "var(--semantic-typography-caption-font-weight)",
292
+ letterSpacing: "var(--semantic-typography-caption-letter-spacing)",
293
+ lineHeight: "var(--semantic-typography-caption-line-height)"
294
+ },
288
295
  eyebrow: {
289
296
  fontFamily: "var(--semantic-typography-eyebrow-font-family)",
290
297
  fontSize: "var(--semantic-typography-eyebrow-font-size)",
@@ -499,11 +506,12 @@ const o = "var(--primitive-typography-family-primary)", n = "var(--primitive-typ
499
506
  eyebrow: i.semantic.typography.eyebrow,
500
507
  mono: i.semantic.typography.mono,
501
508
  // ── Migration aliases → canonical composites ──────────────────────────────
502
- // Pre-2026-05-04 names map to the new roles. small → ui; caption → ui
503
- // (sentence-case secondary text); the eyebrow-pattern callsites migrate
504
- // explicitly to typeStyles.eyebrow as part of the ops-dashboard sweep.
509
+ // Pre-2026-05-04 names map to the new roles. small → ui; the eyebrow-pattern
510
+ // callsites migrate explicitly to typeStyles.eyebrow as part of the
511
+ // ops-dashboard sweep. caption now resolves to its own 12/16 composite
512
+ // (semantic.typography.caption, matching Figma) rather than aliasing ui.
505
513
  small: i.semantic.typography.ui,
506
- caption: i.semantic.typography.ui,
514
+ caption: i.semantic.typography.caption,
507
515
  heading1: i.semantic.typography.h1,
508
516
  heading2: i.semantic.typography.h2,
509
517
  heading3: i.semantic.typography.h3,
@@ -0,0 +1,45 @@
1
+ /**
2
+ * HdsTooltip — accessible hover/focus tooltip on Radix (Overlays).
3
+ * @category Overlays
4
+ * @tier primitive
5
+ * @doc-exempt: no Overlays doc page yet — add demo when the overlays page is created
6
+ *
7
+ * Radix Tooltip (@radix-ui/react-tooltip) themed with role tokens. Provides
8
+ * Floating-UI collision-aware positioning, ARIA wiring, keyboard focus support,
9
+ * open/close delay, and portal mounting out of the box. Unlike the legacy
10
+ * `Tooltip` (an @internal image-expand pill bound to AssetImg), this is the
11
+ * general-purpose accessible tooltip for labelling controls.
12
+ *
13
+ * <HdsTooltip>
14
+ * <HdsTooltip.Trigger asChild>
15
+ * <IconButton icon={Link} aria-label="Copy link" />
16
+ * </HdsTooltip.Trigger>
17
+ * <HdsTooltip.Content>Copy link</HdsTooltip.Content>
18
+ * </HdsTooltip>
19
+ *
20
+ * Skin: inverse surface bubble (semantic.color.surface.inverse) + inverse
21
+ * content text (semantic.color.content.inverse) — these are a designed pair, so
22
+ * the bubble reads correctly in BOTH themes (dark bubble/light text in light
23
+ * mode, light bubble/dark text in dark mode). Radius 4 (primitive.radius.4),
24
+ * shadow-overlay, and a matching arrow. Text reuses the caption type composite.
25
+ */
26
+ import * as React from 'react';
27
+ import * as TooltipPrimitive from '@radix-ui/react-tooltip';
28
+ /** @public */
29
+ export type HdsTooltipContentProps = React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>;
30
+ declare const HdsTooltipContent: React.ForwardRefExoticComponent<Omit<TooltipPrimitive.TooltipContentProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
31
+ interface HdsTooltipComponent extends React.FC<React.ComponentProps<typeof TooltipPrimitive.Root> & {
32
+ /** Hover-open delay in ms (Radix Provider). Default 300. */
33
+ delayDuration?: number;
34
+ }> {
35
+ Trigger: typeof TooltipPrimitive.Trigger;
36
+ Content: typeof HdsTooltipContent;
37
+ }
38
+ /**
39
+ * Tooltip root. Bakes in the Radix Provider so a single `<HdsTooltip>` is
40
+ * self-contained — no app-level provider required. Controlled via
41
+ * `open`/`onOpenChange`, or uncontrolled with `defaultOpen`.
42
+ * @public
43
+ */
44
+ declare const HdsTooltip: HdsTooltipComponent;
45
+ export { HdsTooltip };
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Textarea — multi-line text field primitive with label, helper, and error slots.
3
+ * @category Inputs
4
+ * @tier primitive
5
+ *
6
+ * Mirrors Input's shell + token skin as a native `<textarea>`. Figma parity:
7
+ * the four states Default / Focus / Error / Disabled map to the focus-ring,
8
+ * `error`, and `disabled` treatments below.
9
+ */
10
+ import * as React from 'react';
11
+ import { type VariantProps } from 'class-variance-authority';
12
+ declare const textareaVariants: (props?: {
13
+ resize?: "none" | "both" | "vertical";
14
+ invalid?: boolean;
15
+ } & import("class-variance-authority/dist/types").ClassProp) => string;
16
+ /** @public */
17
+ export type TextareaResize = NonNullable<VariantProps<typeof textareaVariants>['resize']>;
18
+ export interface TextareaProps extends Omit<React.TextareaHTMLAttributes<HTMLTextAreaElement>, 'disabled'> {
19
+ /** Field label rendered above the textarea. */
20
+ label?: string;
21
+ /** Supporting helper text rendered below when not in error. */
22
+ helperText?: string;
23
+ /** Disable interaction. */
24
+ disabled?: boolean;
25
+ /** Mark the field as invalid (sets aria-invalid + destructive border). */
26
+ error?: boolean;
27
+ /** Error message rendered below the textarea when `error` is true. */
28
+ errorMessage?: string;
29
+ /** User resize affordance. Defaults to vertical-only. */
30
+ resize?: TextareaResize;
31
+ /** Class hook for the outer wrapper. */
32
+ className?: string;
33
+ /** Class hook for the textarea element itself. */
34
+ textareaClassName?: string;
35
+ }
36
+ export declare const Textarea: React.ForwardRefExoticComponent<TextareaProps & React.RefAttributes<HTMLTextAreaElement>>;
37
+ /** @internal — CVA variant helper; compose via Textarea props instead. */
38
+ export { textareaVariants };
@@ -0,0 +1,68 @@
1
+ /**
2
+ * HdsThemeProvider — framework-agnostic theming contract for HDS.
3
+ * @category Theming
4
+ * @tier primitive
5
+ * @doc-exempt: API/contract primitive, documented in README (no doc page yet)
6
+ *
7
+ * HDS theming is driven entirely by root attributes + CSS custom properties, so
8
+ * it works with ZERO JavaScript (the Astro / static path just sets the same
9
+ * attributes on a layout element). The four override "dials":
10
+ *
11
+ * dial attribute / var values default
12
+ * ─────── ──────────────────────── ───────────────────────────── ──────────
13
+ * theme data-theme "dark" (light = unset) light
14
+ * density data-density "compact" (comfortable = unset) comfortable
15
+ * brand data-brand + data-tenant overlay slug (e.g. "acme") base
16
+ * font --hds-font-family(-mono) any CSS font-family value Satoshi / Geist Mono
17
+ *
18
+ * This provider is a thin, typed convenience that renders a `data-hds` scope
19
+ * wrapper carrying those attributes — it does NOT own state, storage, or a
20
+ * toggle (that is the in-app ThemeContext's job). Styles do not require it; it
21
+ * exists so React apps can set the contract declaratively and read it back via
22
+ * `useHdsTheme()`.
23
+ *
24
+ * <HdsThemeProvider theme="dark" density="compact" brand="acme">
25
+ * <App />
26
+ * </HdsThemeProvider>
27
+ *
28
+ * Equivalent zero-JS markup:
29
+ * <div data-hds data-theme="dark" data-density="compact" data-brand="acme">…</div>
30
+ */
31
+ import * as React from 'react';
32
+ /** @public */
33
+ export type HdsTheme = 'light' | 'dark';
34
+ /** @public */
35
+ export type HdsDensity = 'comfortable' | 'compact';
36
+ /** @public */
37
+ export interface HdsThemeValue {
38
+ /** Colour theme. `"dark"` activates the dark token overrides; omit for light. */
39
+ theme?: HdsTheme;
40
+ /** Spacing density. `"compact"` activates the compact overrides; omit for comfortable. */
41
+ density?: HdsDensity;
42
+ /** Brand-overlay slug (compiled `[data-brand]`/`[data-tenant]` block). Omit for the base brand. */
43
+ brand?: string;
44
+ /** Body font-family override (`--hds-font-family`). */
45
+ fontFamily?: string;
46
+ /** Monospace font-family override (`--hds-font-family-mono`). */
47
+ fontFamilyMono?: string;
48
+ }
49
+ /**
50
+ * Read the nearest HdsThemeProvider's active dial values. Returns an empty
51
+ * object when no provider is present (styles still work off the defaults).
52
+ * @public
53
+ */
54
+ export declare function useHdsTheme(): HdsThemeValue;
55
+ /** @public */
56
+ export interface HdsThemeProviderProps extends HdsThemeValue {
57
+ children: React.ReactNode;
58
+ /** Wrapper element type for the `data-hds` scope. Default `"div"`. */
59
+ as?: React.ElementType;
60
+ className?: string;
61
+ style?: React.CSSProperties;
62
+ }
63
+ /**
64
+ * Renders a `data-hds` scope wrapper that carries the four theming dials as
65
+ * root attributes + CSS vars, and exposes them to `useHdsTheme()`.
66
+ * @public
67
+ */
68
+ export declare function HdsThemeProvider({ theme, density, brand, fontFamily, fontFamilyMono, as: Comp, className, style, children, }: HdsThemeProviderProps): import("react/jsx-runtime").JSX.Element;
@@ -384,6 +384,13 @@ export declare const tokenRefs: {
384
384
  readonly lineHeight: "var(--semantic-typography-ui-line-height)";
385
385
  readonly maxWidth: "var(--semantic-typography-ui-max-width)";
386
386
  };
387
+ readonly caption: {
388
+ readonly fontFamily: "var(--semantic-typography-caption-font-family)";
389
+ readonly fontSize: "var(--semantic-typography-caption-font-size)";
390
+ readonly fontWeight: "var(--semantic-typography-caption-font-weight)";
391
+ readonly letterSpacing: "var(--semantic-typography-caption-letter-spacing)";
392
+ readonly lineHeight: "var(--semantic-typography-caption-line-height)";
393
+ };
387
394
  readonly eyebrow: {
388
395
  readonly fontFamily: "var(--semantic-typography-eyebrow-font-family)";
389
396
  readonly fontSize: "var(--semantic-typography-eyebrow-font-size)";
@@ -16,6 +16,7 @@ export * from './app/components/dialog';
16
16
  export * from './app/components/divider';
17
17
  export * from './app/components/menu';
18
18
  export * from './app/components/popover';
19
+ export * from './app/components/hds-tooltip';
19
20
  export * from './app/components/doc-link-card';
20
21
  export * from './app/components/grid';
21
22
  export * from './app/components/heading-stack';
@@ -24,6 +25,7 @@ export * from './app/components/icon';
24
25
  export * from './app/components/inline-code';
25
26
  export * from './app/components/inline-link';
26
27
  export * from './app/components/input';
28
+ export * from './app/components/textarea';
27
29
  export * from './app/components/checkbox';
28
30
  export * from './app/components/radio';
29
31
  export * from './app/components/slider';
@@ -1557,6 +1559,19 @@ export declare const tokens: {
1557
1559
  };
1558
1560
  $description: string;
1559
1561
  };
1562
+ caption: {
1563
+ $value: {
1564
+ fontFamily: string;
1565
+ fontSize: {
1566
+ value: number;
1567
+ unit: string;
1568
+ };
1569
+ fontWeight: string;
1570
+ letterSpacing: string;
1571
+ lineHeight: string;
1572
+ };
1573
+ $description: string;
1574
+ };
1560
1575
  eyebrow: {
1561
1576
  $value: {
1562
1577
  fontFamily: string;
@@ -2315,5 +2330,7 @@ export declare const tokens: {
2315
2330
  };
2316
2331
  };
2317
2332
  export { cn } from './lib/utils';
2333
+ export { HdsThemeProvider, useHdsTheme } from './app/context/hds-theme';
2334
+ export type { HdsTheme, HdsDensity, HdsThemeValue, HdsThemeProviderProps, } from './app/context/hds-theme';
2318
2335
  export { HdsRouterProvider, useHdsRouter } from './app/context/RouterContext';
2319
2336
  export type { HdsRouterAdapter, HdsRouterProviderProps, HdsLinkComponent, HdsLinkProps, HdsNavigateOptions, } from './app/context/RouterContext';
@@ -273,6 +273,12 @@
273
273
  --semantic-typography-ui-letter-spacing: var(--primitive-typography-letterSpacing-normal);
274
274
  --semantic-typography-ui-line-height: 24px;
275
275
  --semantic-typography-ui-max-width: 60ch;
276
+ /* semantic.typography.caption */
277
+ --semantic-typography-caption-font-family: var(--primitive-typography-family-primary);
278
+ --semantic-typography-caption-font-size: 12px;
279
+ --semantic-typography-caption-font-weight: var(--primitive-typography-weight-medium);
280
+ --semantic-typography-caption-letter-spacing: var(--primitive-typography-letterSpacing-normal);
281
+ --semantic-typography-caption-line-height: 16px;
276
282
  /* semantic.typography.eyebrow */
277
283
  --semantic-typography-eyebrow-font-family: var(--primitive-typography-family-primary);
278
284
  --semantic-typography-eyebrow-font-size: var(--primitive-typography-size-xs);
@@ -1504,6 +1504,19 @@
1504
1504
  },
1505
1505
  "$description": "UI text for nav, labels, captions. Satoshi medium, 15px, line-height 24px."
1506
1506
  },
1507
+ "caption": {
1508
+ "$value": {
1509
+ "fontFamily": "{primitive.typography.family.primary}",
1510
+ "fontSize": {
1511
+ "value": 12,
1512
+ "unit": "px"
1513
+ },
1514
+ "fontWeight": "{primitive.typography.weight.medium}",
1515
+ "letterSpacing": "{primitive.typography.letterSpacing.normal}",
1516
+ "lineHeight": "16px"
1517
+ },
1518
+ "$description": "Caption / helper text. Satoshi medium, 12px, line-height 16px. Matches the Figma typography/caption text style."
1519
+ },
1507
1520
  "eyebrow": {
1508
1521
  "$value": {
1509
1522
  "fontFamily": "{primitive.typography.family.primary}",
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@hirobius/design-system",
3
3
  "description": "Hirobius Design Systems Architecture: token-governed React components, documentation surfaces, and distribution tooling.",
4
4
  "private": false,
5
- "version": "0.9.0",
5
+ "version": "0.11.0",
6
6
  "engines": {
7
7
  "node": ">=20",
8
8
  "pnpm": ">=8"
@@ -57,16 +57,10 @@
57
57
  "import": "./dist/mui.js",
58
58
  "default": "./dist/mui.js"
59
59
  },
60
- "./protocol": {
61
- "import": "./protocol/envelope.mjs",
62
- "default": "./protocol/envelope.mjs"
63
- },
64
60
  "./package.json": "./package.json"
65
61
  },
66
62
  "files": [
67
63
  "dist",
68
- "protocol/envelope.mjs",
69
- "protocol/figma-snapshot.schema.json",
70
64
  "hirobius.tokens.json",
71
65
  "public/hds-manifest.json"
72
66
  ],
@@ -105,6 +99,7 @@
105
99
  "@radix-ui/react-tabs": "^1.1.13",
106
100
  "@radix-ui/react-toast": "^1.2.17",
107
101
  "@radix-ui/react-toggle-group": "^1.1.13",
102
+ "@radix-ui/react-tooltip": "^1.1.8",
108
103
  "class-variance-authority": "^0.7.1",
109
104
  "clsx": "^2.1.1",
110
105
  "lucide-react": "0.487.0",
@@ -178,6 +173,7 @@
178
173
  "vite": "6.4.2",
179
174
  "vite-bundle-visualizer": "^1.2.1",
180
175
  "vitest": "^4.1.0",
176
+ "yaml": "^2.8.1",
181
177
  "zod": "^4.4.3",
182
178
  "zustand": "^5.0.12"
183
179
  },
@@ -216,7 +212,7 @@
216
212
  "_comment:link-integrity": "check:doc-refs and check:routes both validate internal link integrity (different surfaces: doc refs vs route links). Kept dormant/manual-only to prevent pre-commit cascade.",
217
213
  "_comment:security-baseline": "check:security validates OWASP baseline patterns. Dormant/manual-only — candidate for integration into security-focused CI lane, not pretest.",
218
214
  "_comment:token-integrity": "check:css-values, check:token-structure validate token system correctness. Dormant/manual-only due to overlapping scope with check:fast and existing token validators.",
219
- "_comment:editorconfig-version": "check:mojibake pins EC_VERSION=v3.7.0. The editorconfig-checker@6.1.x npm wrapper expects binary v3.7.0 but downloads the latest Go release (v3.8.0, 2026-06-25), so a fresh install fails with a version mismatch (binary != config). Pinning the download to the wrapper's expected version keeps CI + pre-commit green. Bump both together when upgrading the npm package. All editorconfig-checker calls route through check:mojibake.",
215
+ "_comment:editorconfig-version": "check:mojibake routes through scripts/lib/mojibake.mjs, which pins EC_VERSION=v3.7.0. The editorconfig-checker@6.1.x npm wrapper expects binary v3.7.0 but downloads the latest Go release (v3.8.0, 2026-06-25), so a fresh install fails with a version mismatch (binary != config). Pinning the download to the wrapper's expected version keeps CI + pre-commit green. Bump both together when upgrading the npm package. The wrapper also SKIPS gracefully (like check:secrets) when the binary download is network-blocked (remote agent sessions), so hooks no longer need --no-verify (#18/#52); the gate still enforces wherever the binary is present.",
220
216
  "api:check": "node scripts/audit-component-integrity.mjs --api",
221
217
  "api:update": "node scripts/audit-component-integrity.mjs --api --update-baseline",
222
218
  "assets:convert": "node scripts/convert-incoming-assets.mjs",
@@ -226,7 +222,6 @@
226
222
  "audit:sbom": "node scripts/audit-sbom.mjs",
227
223
  "audit:sidecar": "node scripts/generate-security-posture.mjs",
228
224
  "audit:style-dictionary": "bash scripts/poc/style-dictionary-poc/run.sh",
229
- "bridge": "node --env-file=.env.local scripts/hds-bridge.mjs",
230
225
  "build": "pnpm sync:health && node scripts/sync-icons.mjs && vite build --configLoader native",
231
226
  "build:ssr": "vite build --ssr src/entry-server.tsx --outDir .ssr-cache --configLoader native",
232
227
  "build:prerender": "pnpm build && pnpm build:ssr && node scripts/prerender.mjs",
@@ -276,13 +271,13 @@
276
271
  "check:lockfile": "pnpm install --frozen-lockfile --offline --prefer-offline --ignore-scripts --silent 2>/dev/null || (echo 'Lockfile drift: run pnpm install' && exit 1)",
277
272
  "check:manifest-drift": "node scripts/check-manifest-drift.mjs",
278
273
  "check:micromotion": "node scripts/check-motion.mjs",
279
- "check:mojibake": "EC_VERSION=v3.7.0 pnpm exec editorconfig-checker",
274
+ "check:mojibake": "node scripts/lib/mojibake.mjs",
280
275
  "check:mono-roles": "node scripts/check-mono-roles.mjs",
281
276
  "check:motion": "node scripts/check-reduced-motion.mjs",
282
277
  "check:page-shell": "node scripts/check-page-shell.mjs",
283
278
  "check:refs": "node scripts/check-ref-forwarding.mjs",
284
279
  "check:registry": "node scripts/check-registry.mjs",
285
- "check:release": "pnpm check:full && node scripts/check-style-discipline.mjs && pnpm build && pnpm perf:budget && pnpm test:a11y && pnpm test:visual && pnpm test:responsive && pnpm test:collision && pnpm check:size",
280
+ "check:release": "pnpm check:full && node scripts/check-style-discipline.mjs && pnpm build && pnpm test:a11y && pnpm test:visual && pnpm test:responsive && pnpm test:collision && pnpm check:size",
286
281
  "check:routes": "node scripts/check-link-integrity.mjs --route-links-only",
287
282
  "check:secrets": "node scripts/check-secrets.mjs",
288
283
  "check:security": "node scripts/check-security-baseline.mjs",
@@ -306,11 +301,11 @@
306
301
  "docs:changelogs": "node scripts/generate-component-changelogs.mjs",
307
302
  "docs:llms": "node scripts/generate-llms-txt.mjs",
308
303
  "figma-variables": "node scripts/build-figma-variables.mjs",
309
- "figma:bridge:smoke": "node scripts/figma-bridge-smoke.mjs",
310
304
  "figma:diff": "node scripts/figma-diff.mjs",
311
305
  "figma:snapshot": "node scripts/normalize-figma-snapshot.mjs",
312
306
  "figma:stream": "node scripts/llm-stream-bridge.mjs",
313
307
  "guardrail:firing-stats": "node scripts/refresh-firing-stats.mjs",
308
+ "harvest:design-md": "node scripts/harvest-design-md.mjs",
314
309
  "heal": "node scripts/self-heal.mjs",
315
310
  "heal:smoke": "node scripts/self-heal.mjs --smoke",
316
311
  "health-commit": "pnpm check:semantic-report && node scripts/print-health-commit.mjs",
@@ -322,7 +317,6 @@
322
317
  "manifest:generate": "node scripts/generate-manifest.mjs && node scripts/generate-component-api.mjs && node scripts/enrich-manifest.mjs",
323
318
  "manifest:project": "node scripts/generate-manifest-projection.mjs",
324
319
  "nav:generate": "node scripts/generate-nav-model.mjs",
325
- "perf:budget": "node -e \"require('fs').readdirSync('.lighthouseci').filter(f=>f.startsWith('lhr-')).forEach(f=>require('fs').unlinkSync('.lighthouseci/'+f))\" 2>/dev/null; lhci collect --config=.lighthouserc.json && lhci assert --config=.lighthouserc.json; find . -maxdepth 1 -type d -name 'C:*' -exec rm -rf {} + 2>/dev/null; true",
326
320
  "prebuild": "node scripts/validate-manifest.mjs",
327
321
  "prebuild:lib": "node scripts/generate-component-api.mjs",
328
322
  "pretest": "node scripts/validate-manifest.mjs && node scripts/check-manifest-drift.mjs && node scripts/check-manifest-schema-semver.mjs && node scripts/audit-component-integrity.mjs --completeness && node scripts/check-source-canon.mjs && node scripts/check-binding-drift.mjs && node scripts/test-figma-masters-snapshot.mjs && node scripts/test-doc-pages-snapshot.mjs && node scripts/check-registry.mjs && node scripts/check-tenant-tokens.mjs && knip --no-exit-code",
@@ -330,6 +324,7 @@
330
324
  "roadmap:data": "node scripts/build-roadmap-data.mjs && node scripts/verify-roadmap-sync.mjs",
331
325
  "roadmap:verify": "node scripts/verify-roadmap-sync.mjs",
332
326
  "roadmap:watch": "node scripts/watch-roadmap.mjs",
327
+ "hds:new": "node scripts/scaffold-component.mjs",
333
328
  "scaffold:component": "node scripts/scaffold-component.mjs",
334
329
  "scaffold:tenant": "node scripts/scaffold-tenant.mjs",
335
330
  "sitemap:generate": "node scripts/generate-sitemap.mjs",
@@ -2,7 +2,7 @@
2
2
  "name": "Hirobius Design System",
3
3
  "description": "Three-tier design token system for Adrian Milsap's portfolio site. Tokens flow primitive → semantic → component. All visual decisions trace back to hirobius.tokens.json.",
4
4
  "version": "1",
5
- "generated": "2026-07-01T06:53:00.024Z",
5
+ "generated": "2026-07-03T08:57:17.539Z",
6
6
  "source": "hirobius.tokens.json",
7
7
  "format": "W3C DTCG 2025.10",
8
8
  "docs": "https://adrianmilsap.com/hds",
@@ -63,6 +63,7 @@
63
63
  "HdsCheckbox",
64
64
  "HdsRadio",
65
65
  "HdsSlider",
66
+ "HdsThemeProvider",
66
67
  "HdsToggle",
67
68
  "HeadingStack",
68
69
  "Icon",
@@ -986,6 +987,10 @@
986
987
  "name": "Text",
987
988
  "filePath": "src/app/components/text.tsx"
988
989
  },
990
+ {
991
+ "name": "Textarea",
992
+ "filePath": "src/app/components/textarea.tsx"
993
+ },
989
994
  {
990
995
  "name": "TextLockup",
991
996
  "filePath": "src/app/components/text-lockup.tsx"
@@ -2216,6 +2221,7 @@
2216
2221
  },
2217
2222
  "consumers": [
2218
2223
  "src/app/components/componentPreviewRegistry.tsx",
2224
+ "src/app/components/hds-tooltip.tsx",
2219
2225
  "src/app/components/inline-code.tsx",
2220
2226
  "src/app/components/page-footer.tsx",
2221
2227
  "src/app/components/pagination.tsx",
@@ -4652,6 +4658,7 @@
4652
4658
  "src/app/components/dialog.tsx",
4653
4659
  "src/app/components/error-pattern.tsx",
4654
4660
  "src/app/components/foundation-swatch.tsx",
4661
+ "src/app/components/hds-tooltip.tsx",
4655
4662
  "src/app/components/heading-anchor.tsx",
4656
4663
  "src/app/components/info-page.tsx",
4657
4664
  "src/app/components/nav-item.tsx",
@@ -5267,6 +5274,7 @@
5267
5274
  "src/app/components/combobox.tsx",
5268
5275
  "src/app/components/form.tsx",
5269
5276
  "src/app/components/input.tsx",
5277
+ "src/app/components/textarea.tsx",
5270
5278
  "src/app/pages/docs/patterns/HdsField.tsx",
5271
5279
  "src/form/hds-form.tsx",
5272
5280
  "src/stories/field.stories.tsx",
@@ -6131,7 +6139,8 @@
6131
6139
  "src/app/components/componentPreviewRegistry.tsx",
6132
6140
  "src/app/components/controls.tsx",
6133
6141
  "src/app/components/select.test.tsx",
6134
- "src/app/data/hdsEditorial.tsx"
6142
+ "src/app/data/hdsEditorial.tsx",
6143
+ "src/stories/select.stories.tsx"
6135
6144
  ],
6136
6145
  "tokenMapping": {
6137
6146
  "label": "semantic.typography.small",
@@ -6865,6 +6874,77 @@
6865
6874
  "requiredProps": [],
6866
6875
  "a11yRules": []
6867
6876
  },
6877
+ "HdsThemeProvider": {
6878
+ "category": "Theming",
6879
+ "categorySource": "jsdoc",
6880
+ "governedCategory": true,
6881
+ "hidden": false,
6882
+ "docExempt": true,
6883
+ "filePath": "src/app/context/hds-theme.tsx",
6884
+ "description": "Renders a `data-hds` scope wrapper that carries the four theming dials as root attributes + CSS vars, and exposes them to `useHdsTheme()`.",
6885
+ "figmaUrl": null,
6886
+ "figmaId": null,
6887
+ "figmaLink": "TODO:hds-master:HdsThemeProvider",
6888
+ "tier": "primitive",
6889
+ "preview": {
6890
+ "exportName": "HdsThemeProvider",
6891
+ "sizing": "panel"
6892
+ },
6893
+ "consumers": [
6894
+ "src/index.ts"
6895
+ ],
6896
+ "tokenMapping": {},
6897
+ "variantAxes": [],
6898
+ "componentProperties": [],
6899
+ "props": {
6900
+ "as": {
6901
+ "type": "ElementType<any, keyof IntrinsicElements>",
6902
+ "default": "div"
6903
+ },
6904
+ "brand": {
6905
+ "type": "string",
6906
+ "optional": true
6907
+ },
6908
+ "className": {
6909
+ "type": "string",
6910
+ "optional": true
6911
+ },
6912
+ "density": {
6913
+ "type": "enum",
6914
+ "values": [
6915
+ "comfortable",
6916
+ "compact"
6917
+ ],
6918
+ "optional": true
6919
+ },
6920
+ "fontFamily": {
6921
+ "type": "string",
6922
+ "optional": true
6923
+ },
6924
+ "fontFamilyMono": {
6925
+ "type": "string",
6926
+ "optional": true
6927
+ },
6928
+ "style": {
6929
+ "type": "CSSProperties",
6930
+ "optional": true
6931
+ },
6932
+ "theme": {
6933
+ "type": "enum",
6934
+ "values": [
6935
+ "light",
6936
+ "dark"
6937
+ ],
6938
+ "optional": true
6939
+ }
6940
+ },
6941
+ "allowedChildren": [
6942
+ "*"
6943
+ ],
6944
+ "propConstraints": {},
6945
+ "requiredProps": [],
6946
+ "a11yRules": []
6947
+ },
6868
6948
  "HdsPhosphor": {
6869
6949
  "category": "Compiler",
6870
6950
  "filePath": "scripts/hds-jsx-compiler.mjs",
@@ -7958,7 +8038,9 @@
7958
8038
  "consumers": [
7959
8039
  "src/app/components/asset-img.tsx",
7960
8040
  "src/app/components/doc-sections.tsx",
7961
- "src/app/data/hdsEditorial.tsx"
8041
+ "src/app/components/hds-tooltip.tsx",
8042
+ "src/app/data/hdsEditorial.tsx",
8043
+ "src/stories/hds-tooltip.stories.tsx"
7962
8044
  ],
7963
8045
  "tokenMapping": {},
7964
8046
  "variantAxes": [],
@@ -8024,7 +8106,9 @@
8024
8106
  "description": "SideNav - sidebar navigation row primitive. Two levels: root — top-level section link. Full-width row using the shared nav label type style. nested — child page link. Keeps the same full-width hit area and label type treatment, with indentation handled via inner padding only. No indicator bar (reserved for HdsTocNav). Idle text = content-secondary → primary on hover/active. Accent surface fill on active state.",
8025
8107
  "figmaUrl": null,
8026
8108
  "figmaId": null,
8027
- "consumers": [],
8109
+ "consumers": [
8110
+ "src/stories/side-nav.stories.tsx"
8111
+ ],
8028
8112
  "tokenMapping": {},
8029
8113
  "props": {},
8030
8114
  "allowedChildren": [
@@ -10216,6 +10300,19 @@
10216
10300
  "maxWidth": "60ch"
10217
10301
  }
10218
10302
  },
10303
+ {
10304
+ "path": "semantic.typography.caption",
10305
+ "cssVar": "--semantic-typography-caption",
10306
+ "type": "typography",
10307
+ "description": "Caption / helper text. Satoshi medium, 12px, line-height 16px. Matches the Figma typography/caption text style.",
10308
+ "composite": {
10309
+ "fontFamily": "Satoshi, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif",
10310
+ "fontSize": "12px",
10311
+ "fontWeight": "500",
10312
+ "letterSpacing": "0em",
10313
+ "lineHeight": "16px"
10314
+ }
10315
+ },
10219
10316
  {
10220
10317
  "path": "semantic.typography.eyebrow",
10221
10318
  "cssVar": "--semantic-typography-eyebrow",