@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.
Files changed (57) hide show
  1. package/AGENTS.md +11 -1
  2. package/CHANGELOG.md +74 -0
  3. package/CONSUMING.md +2 -2
  4. package/DESIGN.md +24 -24
  5. package/NOTICE.md +1 -1
  6. package/README.md +20 -12
  7. package/UPGRADING.md +22 -1
  8. package/dist/chunks/{empty-state-DNoThgfV.js → empty-state-ChC_xZfg.js} +109 -92
  9. package/dist/chunks/{form-By82qZcC.js → form-zCZ_B83I.js} +16 -16
  10. package/dist/css-contract.json +1 -0
  11. package/dist/fonts/ibm-plex-mono-400.woff2 +0 -0
  12. package/dist/fonts.css +5 -5
  13. package/dist/form.js +1 -1
  14. package/dist/hirobius-ui.js +1254 -1181
  15. package/dist/manifest.js +5 -4
  16. package/dist/patterns.js +164 -162
  17. package/dist/styles.css +1 -1
  18. package/dist/tokens.css +1 -1
  19. package/dist/tokens.js +14 -1
  20. package/dist/types/src/app/components/asset-img.d.ts +1 -0
  21. package/dist/types/src/app/components/button.d.ts +1 -1
  22. package/dist/types/src/app/components/callout.d.ts +2 -1
  23. package/dist/types/src/app/components/card.d.ts +5 -3
  24. package/dist/types/src/app/components/code-block.d.ts +1 -0
  25. package/dist/types/src/app/components/combobox.d.ts +1 -1
  26. package/dist/types/src/app/components/data-table-section.d.ts +1 -0
  27. package/dist/types/src/app/components/destructive-section.d.ts +1 -0
  28. package/dist/types/src/app/components/divider.d.ts +1 -1
  29. package/dist/types/src/app/components/form-actions.d.ts +1 -0
  30. package/dist/types/src/app/components/form.d.ts +1 -0
  31. package/dist/types/src/app/components/grid.d.ts +1 -1
  32. package/dist/types/src/app/components/icon.d.ts +1 -1
  33. package/dist/types/src/app/components/metric-tiles.d.ts +2 -0
  34. package/dist/types/src/app/components/page-header.d.ts +1 -0
  35. package/dist/types/src/app/components/page.d.ts +1 -0
  36. package/dist/types/src/app/components/reveal.d.ts +1 -0
  37. package/dist/types/src/app/components/stack.d.ts +1 -1
  38. package/dist/types/src/app/components/tabs.d.ts +3 -1
  39. package/dist/types/src/app/context/hds-theme.d.ts +1 -1
  40. package/dist/types/src/app/design-system/generated-token-refs.d.ts +13 -0
  41. package/dist/types/src/app/design-system/generated-token-values.d.ts +14 -1
  42. package/dist/types/src/app/hooks/useInteractionState.d.ts +7 -1
  43. package/dist/types/src/index.d.ts +47 -0
  44. package/dist/variables.css +33 -22
  45. package/docs/CONSUMING.md +2 -2
  46. package/hirobius.tokens.json +87 -40
  47. package/llms.txt +29 -7
  48. package/package.json +7 -6
  49. package/public/hds-manifest.json +257 -99
  50. package/public/llms/components.txt +1 -1
  51. package/public/llms-full.txt +54 -32
  52. package/public/llms.txt +29 -7
  53. package/src/app/data/component-api.json +51 -18
  54. package/upgrade/index.json +8 -1
  55. package/upgrade/releases/0.23.0.json +259 -0
  56. package/upgrade/schema.json +114 -1
  57. package/dist/fonts/geist-mono-400.woff2 +0 -0
@@ -108,7 +108,7 @@ Triggers an action when activated.
108
108
  - variant: "primary" | "secondary" | "tertiary" | null
109
109
 
110
110
  ### Callout
111
- Tone-driven side-rule callout for status, quotes, hypotheses.
111
+ Tone-driven tinted callout for notes, quotes, hypotheses — the same feedback fill language as Alert, without Alert's icon or status role.
112
112
  - italic: boolean = false
113
113
  - tone: 'accent' | 'info' | 'success' | 'warning' | 'danger' = info
114
114
 
@@ -1,6 +1,6 @@
1
1
  # Hirobius Design System
2
2
 
3
- Generated: 2026-10-07T16:09:09.631Z
3
+ Generated: 2026-10-09T14:36:17.779Z
4
4
  Primary sources: `public/hds-manifest.json`, `src/app/data/component-api.json`, `hirobius.tokens.json`
5
5
 
6
6
  ## Agents Using The Package: Start Here
@@ -9,6 +9,16 @@ Primary sources: `public/hds-manifest.json`, `src/app/data/component-api.json`,
9
9
  - MCP server `hds` ships in the package: run `npx hds-mcp` (stdio). Tools: `list_core`, `search_components`, `get_component`, `search_tokens`; each answer is under 2 KB.
10
10
  - Lint before you finish: `import hds from '@hirobius/design-system/eslint-plugin'` and spread `hds.configs.recommended` into `eslint.config.mjs`.
11
11
 
12
+ ## Voice
13
+
14
+ How these docs speak. Every page, and every agent writing for HDS, follows it. Source: `content/docs/voice.mdx` (published at `/docs/voice`).
15
+
16
+ - Use plain words a reader already knows. Name a thing by what it does, not by how it is built.
17
+ - Keep sentences short, one idea each.
18
+ - Tell the reader what to do. Leave out brand adjectives.
19
+ - Keep maintainer references off public pages: issue and ADR numbers, script names, internal counts.
20
+ - Don't use: "systems-first".
21
+
12
22
  ## Pick By Need
13
23
 
14
24
  One answer per need. Use the components after the arrow; what follows "Not:" is what agents reached for instead, which is the wrong answer for that need even where it has a purpose of its own. Generated from `mcp/guide.mjs`, the same list as `AGENTS.md`.
@@ -149,42 +159,54 @@ One line per component that declares when to use it (`@usage` / `@useInstead` in
149
159
 
150
160
  Alert: [core] Show a persistent inline message with a severity, next to the content it concerns. Use instead: ToastProvider, Badge
151
161
  AlertDialog: Confirm a destructive or irreversible action (delete, archive, remove) before it runs, with Cancel and Action buttons. Use instead: Dialog, ToastProvider
162
+ AssetImg: Show an image that scales to its frame, with a placeholder if it fails to load.
152
163
  Avatar: [core] Show a person or entity as an image with an initials fallback. Use instead: Icon, Badge
153
164
  Badge: [core] Label a status, state or count with a compact neutral or semantic chip, or a dot. Use instead: Tag, Alert
154
165
  Box: [core] Build one-off layout that no named layout primitive covers, using token keys through `sx`. Use instead: Stack, Grid, Container
155
166
  Breadcrumb: [core] Show where the current page sits in a hierarchy and link back up it. Use instead: Tabs, Pagination
156
- Button: [core] Trigger an action (submit, save, open a dialog) with a text label and optional icons; for an icon-only control pass iconOnly with iconLeft and label; for an on/off toggle pass pressed. Use instead: InlineLink
167
+ Button: [core] 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. Use instead: InlineLink
157
168
  Card: [core] Group related content on a raised surface with header, body, footer and metric slots, or as one selectable option. Use instead: Surface, Card.Metric
158
169
  CardMetric: Show one headline figure (a KPI, a count, a total) with its label inside a Card. Use instead: MetricTiles
159
170
  Checkbox: [core] Let people tick one or more independent options, or a parent choice that is partly selected. Use instead: Toggle, Radio
171
+ CodeBlock: Show a code sample with a copy button, optionally collapsed.
160
172
  Combobox: [core] Pick one value, or several with `multiple`, from a long list of options, with a search field that filters as you type. Use instead: Select, Menu
161
173
  Container: [core] Constrain a page region to the content or maximum width and centre it. Use instead: Stack, Grid, Box
174
+ DataTableSection: Put a heading and toolbar above a Table.
175
+ DestructiveSection: Put a dangerous action, such as delete, in its own section with a warning and a confirm step.
162
176
  Dialog: [core] Interrupt the page with a modal that needs a decision or focused input before people continue. Use instead: Tooltip, Alert, ToastProvider, AlertDialog
163
177
  Disclosure: [core] Hide optional explanatory content behind a heading that people can expand. Use instead: Tabs
164
- Divider: [core] Separate two regions of content with a thin semantic rule. Use instead: Stack, Surface
178
+ Divider: [core] Separate two blocks of content with a thin line. Use instead: Stack, Surface
165
179
  EmptyState: [core] Say that a list, grid or section has no data yet, with a title and an optional description. Use instead: Skeleton, Alert
180
+ ErrorPattern: Show an error with a short message and a Back button, in place or as a full page.
166
181
  Field: [core] Show a labelled read-only value, such as a name and its value in a detail view. Use instead: Input, Card.Metric
167
- Grid: [core] Lay out content in responsive columns with token-governed gaps, or align nested content with subgrid. Use instead: Stack, Box
182
+ Form: Wrap form fields so they stack with even spacing.
183
+ FormActions: Lay out a form's buttons in a fixed order: danger on the left, then secondary, then primary on the right.
184
+ Grid: [core] Lay out content in columns that adapt to the screen width, or line up nested content with subgrid. Use instead: Stack, Box
168
185
  HdsRouterProvider: [core] Wrap the app root once so HDS links and navigation use your client router; with no provider they stay plain anchors.
169
186
  HdsThemeProvider: [core] Wrap an app or region once to set theme, density and other root attributes for everything inside it. Use instead: Surface
170
- Icon: [core] Draw a Lucide glyph at a size and colour from the design tokens. Use instead: Button, Avatar
187
+ Icon: [core] Show a Lucide icon at a set size and color. Use instead: Button, Avatar
171
188
  InlineLink: [core] Link to a route or external URL from inside body copy. Use instead: Button, Text
172
189
  Input: [core] Collect a single line of text, a number, an email, a password, a date or a time, with label, helper and error slots. Use instead: Textarea, Select, Combobox
173
190
  Kbd: [core] Show a keyboard key or shortcut hint inline, as a native kbd element. Use instead: Text
174
191
  Menu: [core] Offer a list of actions from a trigger, closed until opened. Use instead: Select
192
+ MetricTile: Show one key number with its label, inside a MetricTiles row.
193
+ MetricTiles: Show a row of key numbers, one tile each.
194
+ Page: Wrap a screen in the standard width and padding.
195
+ PageHeader: Open a screen with its title, plus optional breadcrumb, status and actions.
175
196
  Pagination: [core] Move between pages of a long result set, with truncated page numbers. Use instead: Breadcrumb
176
197
  Popover: [core] Anchor interactive content, such as a short form, a filter set or a picker, to a trigger people click to open. Use instead: Tooltip, Menu, Dialog
177
198
  Progress: [core] Show how far a task has got, as a bar or ring that is determinate or indeterminate. Use instead: Spinner, Skeleton
178
199
  Radio: [core] Choose exactly one option from a small set that should stay visible together. Use instead: Checkbox, Select, SegmentedControl
200
+ Reveal: Fade content in as it scrolls into view.
179
201
  SegmentedControl: [core] Switch between two to five mutually exclusive views or modes in a compact row. Use instead: Radio, Tabs, Select
180
202
  Select: [core] Choose one value from a short list of options in a form field. Use instead: Menu, Combobox
181
203
  Skeleton: [core] Reserve the shape of content that is still loading, so the layout does not jump. Use instead: Progress, Spinner
182
204
  Slider: [core] Pick a number within a known range by dragging, when the exact value matters less than the position. Use instead: Input
183
205
  Spinner: [core] Show that something is loading when the wait is short or has no measurable end. Use instead: Progress, Skeleton
184
- Stack: [core] Space a row or column of content with token gaps and simple flex alignment. Use instead: Grid, Surface
206
+ Stack: [core] Space items in a row or column with even gaps. Use instead: Grid, Surface
185
207
  Stat: Show one headline figure inline, inside prose or a dense list, with its label and an optional sub-line. Use instead: MetricTiles, Card.Metric, StatusTile
186
208
  StatusTile: Show a titled status block with optional notes and a trailing badge or affordance. Use instead: MetricTiles, Card.Metric, StatusListItem
187
- Surface: [core] Wrap content in a padded, background-bearing inset surface with no header or footer anatomy. Use instead: Card, Stack
209
+ Surface: [core] Give a block of content a background and padding, with no header or footer. Use instead: Card, Stack
188
210
  Table: [core] Show rows of structured data in aligned columns, with optional sorting. Use instead: Field, Stack
189
211
  Tabs: [core] Switch between panels of related content in the same place, one visible at a time. Use instead: SegmentedControl, Disclosure
190
212
  Tag: [core] Show an interactive filter or category chip that people can toggle. Use instead: Badge
@@ -379,14 +401,14 @@ A machine- and human-readable specification of the Hirobius Design System for AI
379
401
 
380
402
  ## Overview
381
403
 
382
- Hirobius is a clean, systems-first visual language that bridges digital precision and physical fabrication through a high-contrast monochromatic palette and a single accent that each tenant sets — neutral by default (#208). Its personality is disciplined, tactile, and quietly technical: structure is explicit, motion is purposeful, and visual noise is stripped away. Whitespace is treated as material, not leftover space, so every screen should feel deliberate, breathable, and exact.
404
+ Hirobius is a clean, systems-first visual language that bridges digital precision and physical fabrication through a high-contrast monochromatic neutral palette and a single accent that each tenant sets — a bright apple green by default. Its personality is disciplined, tactile, and quietly technical: structure is explicit, motion is purposeful, and visual noise is stripped away. Whitespace is treated as material, not leftover space, so every screen should feel deliberate, breathable, and exact.
383
405
 
384
406
  ## Colors
385
407
 
386
408
  <!-- auto:start:colors -->
387
409
  **One accent — one neutral system.**
388
410
 
389
- - **Accent** (`#111111`): CTAs, active states, selected focus rings, and the single brand accent. `semantic.accent.rest` — a per-tenant knob, not a fixed hue (#208).
411
+ - **Accent** (`#66B239`): CTAs, active states, selected focus rings, and the single brand accent. `semantic.accent.rest` — a per-tenant knob, not a fixed hue (#208).
390
412
  - **Neutral**: backgrounds, surfaces, borders, text. True monochromatic — `primitive.color.neutral.50` through `950`. Use `semantic.color.surface.*`, `semantic.color.content.*`, `semantic.color.border.*`; never reach directly for primitives in components.
391
413
  - **Feedback — Error** (`#B91C1C`): destructive confirms, error banners, validation failures. `semantic.color.feedback.error`.
392
414
  - **Feedback — Success** (`#047857`): positive confirmations, completed states. `semantic.color.feedback.success`.
@@ -403,7 +425,7 @@ HDS ships three typefaces — each with a distinct and exclusive role:
403
425
 
404
426
  - **Display / Heading font**: Satoshi. Bound exclusively to the `display` and `title` styles. Never used for body copy or UI labels.
405
427
  - **Body / UI font**: Satoshi. All prose, labels, small text, captions, and UI copy.
406
- - **Mono font**: Geist Mono. Reserved for tokens, code, technical callouts, and metric readouts.
428
+ - **Mono font**: IBM Plex Mono. Reserved for tokens, code, technical callouts, and metric readouts.
407
429
 
408
430
  Weights declared: `400` regular, `500` medium, `700` bold. Heading styles (display · title) use `700` bold; body, UI, and caption use `400` regular / `500` medium.
409
431
 
@@ -465,14 +487,14 @@ Depth is communicated through 4 elevation roles bundled by `semantic.elevation.*
465
487
 
466
488
  ### Elevation roles
467
489
 
468
- | Surface | Role token | Background | Shadow | Border |
469
- | -------------------------------------- | ----------------------------- | ----------------- | ----------------- | ------------------- |
470
- | Card / panel resting | `semantic.elevation.flat` | `surface.page` | none | `border.subtle` 1px |
471
- | Card / panel lifted (interactive only) | `semantic.elevation.raised` | `surface.raised` | `shadow.subtle` | none |
472
- | Popover / dropdown / tooltip | `semantic.elevation.floating` | `surface.raised` | `shadow.floating` | none |
473
- | Dialog / sheet / modal | `semantic.elevation.overlay` | `surface.overlay` | `shadow.overlay` | none |
490
+ | Surface | Role token | Background | Shadow | Border |
491
+ | -------------------------------------- | ----------------------------- | ----------------- | ----------------- | -------------------------------------------------------- |
492
+ | Card / panel resting | `semantic.elevation.flat` | `surface.page` | none | none by default; opt-in 1px (`bordered`/`tone`/`accent`) |
493
+ | Card / panel lifted (interactive only) | `semantic.elevation.raised` | `surface.raised` | `shadow.subtle` | none |
494
+ | Popover / dropdown / tooltip | `semantic.elevation.floating` | `surface.raised` | `shadow.floating` | none |
495
+ | Dialog / sheet / modal | `semantic.elevation.overlay` | `surface.overlay` | `shadow.overlay` | none |
474
496
 
475
- Cards default to `flat`. They lift to `raised` only on interactive hover or when explicitly elevated above siblings. Never combine `raised` with a border — depth is one mechanism (border OR shadow), not both stacked.
497
+ Cards default to `flat`. They lift to `raised` only on interactive hover or when explicitly elevated above siblings. Never combine `raised` with a border — depth is one mechanism (border OR shadow), not both stacked. The default `Card` variant is **borderless** (12d-3 outline rule: repeated outlined cards crowd a layout, so the edge is not the default) — a resting 1px border is **opt-in** via `bordered`, a feedback `tone`, or the `accent` variant (`border.default` / feedback color / `border.accent` respectively). Rely on whitespace, dividers, and rails for grouping; reach for `bordered` only for a genuinely discrete standalone object.
476
498
 
477
499
  Overlays (Dialog, AlertDialog, Menu, Popover, Select, Tooltip) portal into the nearest `data-hds` scope, so they inherit its theme (for example `<div data-hds data-theme="dark">`); pass `container` on the Content part to override.
478
500
 
@@ -515,9 +537,9 @@ Default most interactive feedback to `productive` (150ms, decelerate). Reserve `
515
537
  | --- | --- | --- | --- |
516
538
  | **Buttons** (`Button`) | `8px` (`semantic.radius.action`) | default · hover · focus · active · disabled · loading | Three variants: primary (accent-filled), secondary (outline), tertiary (ghost). Primary uses `semantic.accent.*` ramp per state. Pressed is a 5% `semantic.color.state.pressed.overlay` wash over the fill (`role.pressed-overlay`: black in light, white in dark), not a brightness filter. Icon-only buttons (`iconOnly`) follow the same token surface. Icon-only actions use `Button iconOnly` with a `label` and an `Icon` from `@hirobius/design-system/icons` in `iconLeft`. |
517
539
  | **Inputs** (`Input`) | `8px` (`semantic.radius.action`) | default · focus · filled · error · disabled · loading | Border-driven treatment; no filled background by default. Focus uses `semantic.color.border.accent` plus a 2px outline offset. Error swaps to `component.input.borderError`. |
518
- | **Cards** (`Card`) | `12px` (`rounded-lg`, role radius + 4px) | default · hover (optional parallax) · pressed (when interactive) | Cards default to `elevation.flat` (1px border `border.subtle`, no shadow). Interactive cards lift to `elevation.raised` (shadow.subtle, no border) on hover. Bind via `semantic.elevation.{role}` — never raw box-shadow values. Radius: `rounded-lg` (role radius + 4 px, follows the tenant knob) — never a hard-coded value. Padding: `var(--semantic-space-surface-padding)`. Title: `heading3`. Meta: `caption` + `var(--semantic-color-content-secondary)`. Hover (interactive): `scale(1.02)` transform + lift to raised. Never: gradients, glow, frosted glass, tinted surfaces, decorative overlays, or inner shadows. |
540
+ | **Cards** (`Card`) | `12px` (`rounded-lg`, role radius + 4px) | default · hover (optional parallax) · pressed (when interactive) | Cards default to `elevation.flat` (borderless by default; an opt-in 1px border via `bordered`/`tone`/`accent`, no shadow). Interactive cards lift to `elevation.raised` (shadow.subtle, no border) on hover. Bind via `semantic.elevation.{role}` — never raw box-shadow values. Radius: `rounded-lg` (role radius + 4 px, follows the tenant knob) — never a hard-coded value. Padding: `var(--semantic-space-surface-padding)`. Title: `heading3`. Meta: `caption` + `var(--semantic-color-content-secondary)`. Hover (interactive): `scale(1.02)` transform + lift to raised. Never: gradients, glow, frosted glass, tinted surfaces, decorative overlays, or inner shadows. |
519
541
  | **Badges** (`Badge`) | `8px` (`primitive.radius.4`) | neutral · accent · feedback (error/success/warning/info) | Single-line status markers. Feedback colors come from `semantic.color.feedback.*`. Never used as decorative chrome. |
520
- | **Alerts** (`Alert`) | `8px` (via `hds.borderRadius.4`) | info · success · warning · error | Inline banner pattern with icon + message + optional action. Tone is carried by left-border color, not by tinted fills. |
542
+ | **Alerts** (`Alert`) | `8px` (via `hds.borderRadius.4`) | info · success · warning · error | Inline banner pattern with icon + message + optional action. Tone is carried by a tinted feedback fill (`bg-feedback-bg-*`, matching Badge), NOT a left-border stripe. Callout shares this fill language and differs only by role (no icon, no status role, optional italic). |
521
543
  | **Disclosures** (`Disclosure`) | `8px` (`hds.borderRadius.action`) | collapsed · expanded · hover · focus | Accordion primitive. Expansion uses `semantic.motion.productive`; no spring bounce. Dividers follow `semantic.color.border.subtle`. |
522
544
  | **Toggles** (`Toggle`) | `full` (pill track + circular thumb) | off · on · focus · disabled | Accent-filled track in the on state; neutral track otherwise. Track + thumb transitions share `semantic.motion.productive`. |
523
545
  | **Segmented Control** (`SegmentedControl`) | Outer `12px` · inner segments `8px` | rest · hover · selected · disabled | Selected segment fills with the accent; unselected segments are transparent. Use for 2–5 mutually exclusive options; beyond that, prefer `Select`. |
@@ -529,16 +551,16 @@ See `public/hds-manifest.json` and `src/app/data/component-api.json` for the ful
529
551
 
530
552
  Every HDS card surface must conform to this anatomy exactly. No creative interpretation is permitted on any of these properties.
531
553
 
532
- | Property | Required value | Forbidden |
533
- | ------------------------ | -------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- |
534
- | Background | `var(--semantic-color-surface-raised)` | Any gradient, tinted fill, or custom color |
535
- | Border | `1px solid var(--semantic-color-border-default)` | `box-shadow` as an elevation substitute |
536
- | Border radius | `rounded-lg` (`role.radius` + 4 px: 12 px by default, follows the tenant) | `var(--component-card-radius)`, `rounded-full`, or any hard-coded value |
537
- | Padding | `var(--semantic-space-component-padding)` or `<HdsSurface padding="component">` | Raw pixel values or ad hoc insets |
538
- | Shadow | Resting cards: none (`elevation.flat`). Interactive lifted state: `shadow.subtle` via `elevation.raised` | Raw `box-shadow` values, `drop-shadow`, glow, or any depth effect not bound to a role token |
539
- | Title | `hds.typeStyles.title` / `<Text variant="title">` | Any other type style for the primary card heading |
540
- | Subtitle / meta | `hds.typeStyles.caption` + `var(--semantic-color-content-secondary)` | Primary content color or body size for secondary text |
541
- | Hover (interactive only) | `transform: scale(1.02)` | Background fill change, border color shift, or opacity fade on hover |
554
+ | Property | Required value | Forbidden |
555
+ | ------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- |
556
+ | Background | `var(--semantic-color-surface-raised)` | Any gradient, tinted fill, or custom color |
557
+ | Border | Default variant: **borderless**. Opt-in (`bordered`/`tone`/`accent`): 1px solid the matching token (`border.default` / feedback color / `border.accent`). Never border + shadow together. | `box-shadow` as an elevation substitute; a border on the default variant (use `bordered`) |
558
+ | Border radius | `rounded-lg` (`role.radius` + 4 px: 12 px by default, follows the tenant) | `var(--component-card-radius)`, `rounded-full`, or any hard-coded value |
559
+ | Padding | `var(--semantic-space-component-padding)` or `<HdsSurface padding="component">` | Raw pixel values or ad hoc insets |
560
+ | Shadow | Resting cards: none (`elevation.flat`). Interactive lifted state: `shadow.subtle` via `elevation.raised` | Raw `box-shadow` values, `drop-shadow`, glow, or any depth effect not bound to a role token |
561
+ | Title | `hds.typeStyles.title` / `<Text variant="title">` | Any other type style for the primary card heading |
562
+ | Subtitle / meta | `hds.typeStyles.caption` + `var(--semantic-color-content-secondary)` | Primary content color or body size for secondary text |
563
+ | Hover (interactive only) | `transform: scale(1.02)` | Background fill change, border color shift, or opacity fade on hover |
542
564
 
543
565
  Never use on any card surface: gradient backgrounds, glow effects, frosted glass (`backdrop-filter: blur`), decorative overlays, gradient borders, colored or tinted backgrounds, inner shadows, patterned fills, shimmer or noise effects.
544
566
 
@@ -582,7 +604,7 @@ Three more needs are props on an existing component, not components of their own
582
604
  ## Do's and Don'ts
583
605
 
584
606
  - Don't invent new corner behavior for interactive controls; buttons, inputs, disclosures, and similar action surfaces should follow the shared action radius (`semantic.radius.action`).
585
- - Don't introduce additional accent hues; Hirobius uses exactly one accent, resolved from `semantic.accent.rest`, over a true monochromatic neutral system. The accent is a per-tenant knob (#208) and defaults to neutral — read the token, never assume a hue.
607
+ - Don't introduce additional accent hues; Hirobius uses exactly one accent, resolved from `semantic.accent.rest`, over a true monochromatic neutral system. The accent is a per-tenant knob (#208) and defaults to a bright apple green — read the token, never assume a hue.
586
608
  - Don't tint neutrals warm or cool; greys should remain genuinely neutral and high-contrast.
587
609
  - Don't reach for shadow values directly — bind to a `semantic.elevation.*` role so surface + shadow + border stay paired. Cards default to `flat` (border, no shadow). Popovers/tooltips/dropdowns use `floating`. Dialogs/sheets use `overlay`.
588
610
  - Don't hardcode colors, spacing, radius, or typography values when governed tokens already exist.
@@ -601,7 +623,7 @@ Unresolved rules that the live repo cannot yet answer confidently are tracked in
601
623
  <!-- auto:start:build-meta -->
602
624
  ---
603
625
 
604
- > Generated from `hirobius.tokens.json` (389 tokens) and `public/hds-manifest.json` by `scripts/build-design-md.mjs`.
626
+ > Generated from `hirobius.tokens.json` (400 tokens) and `public/hds-manifest.json` by `scripts/build-design-md.mjs`.
605
627
  > Hand-edit `DESIGN.source.md`; this file (`DESIGN.md`) is overwritten by `pnpm tokens`.
606
628
  <!-- auto:end:build-meta -->
607
629
 
@@ -699,7 +721,7 @@ Triggers an action when activated.
699
721
  - variant: "primary" | "secondary" | "tertiary" | null
700
722
 
701
723
  ### Callout
702
- Tone-driven side-rule callout for status, quotes, hypotheses.
724
+ Tone-driven tinted callout for notes, quotes, hypotheses — the same feedback fill language as Alert, without Alert's icon or status role.
703
725
  - italic: boolean = false
704
726
  - tone: 'accent' | 'info' | 'success' | 'warning' | 'danger' = info
705
727
 
package/public/llms.txt CHANGED
@@ -1,6 +1,6 @@
1
1
  # Hirobius Design System
2
2
 
3
- Generated: 2026-10-07T16:09:09.631Z
3
+ Generated: 2026-10-09T13:43:23.079Z
4
4
  Primary sources: `public/hds-manifest.json`, `src/app/data/component-api.json`, `hirobius.tokens.json`
5
5
 
6
6
  ## Agents Using The Package: Start Here
@@ -9,6 +9,16 @@ Primary sources: `public/hds-manifest.json`, `src/app/data/component-api.json`,
9
9
  - MCP server `hds` ships in the package: run `npx hds-mcp` (stdio). Tools: `list_core`, `search_components`, `get_component`, `search_tokens`; each answer is under 2 KB.
10
10
  - Lint before you finish: `import hds from '@hirobius/design-system/eslint-plugin'` and spread `hds.configs.recommended` into `eslint.config.mjs`.
11
11
 
12
+ ## Voice
13
+
14
+ How these docs speak. Every page, and every agent writing for HDS, follows it. Source: `content/docs/voice.mdx` (published at `/docs/voice`).
15
+
16
+ - Use plain words a reader already knows. Name a thing by what it does, not by how it is built.
17
+ - Keep sentences short, one idea each.
18
+ - Tell the reader what to do. Leave out brand adjectives.
19
+ - Keep maintainer references off public pages: issue and ADR numbers, script names, internal counts.
20
+ - Don't use: "systems-first".
21
+
12
22
  ## Pick By Need
13
23
 
14
24
  One answer per need. Use the components after the arrow; what follows "Not:" is what agents reached for instead, which is the wrong answer for that need even where it has a purpose of its own. Generated from `mcp/guide.mjs`, the same list as `AGENTS.md`.
@@ -149,42 +159,54 @@ One line per component that declares when to use it (`@usage` / `@useInstead` in
149
159
 
150
160
  Alert: [core] Show a persistent inline message with a severity, next to the content it concerns. Use instead: ToastProvider, Badge
151
161
  AlertDialog: Confirm a destructive or irreversible action (delete, archive, remove) before it runs, with Cancel and Action buttons. Use instead: Dialog, ToastProvider
162
+ AssetImg: Show an image that scales to its frame, with a placeholder if it fails to load.
152
163
  Avatar: [core] Show a person or entity as an image with an initials fallback. Use instead: Icon, Badge
153
164
  Badge: [core] Label a status, state or count with a compact neutral or semantic chip, or a dot. Use instead: Tag, Alert
154
165
  Box: [core] Build one-off layout that no named layout primitive covers, using token keys through `sx`. Use instead: Stack, Grid, Container
155
166
  Breadcrumb: [core] Show where the current page sits in a hierarchy and link back up it. Use instead: Tabs, Pagination
156
- Button: [core] Trigger an action (submit, save, open a dialog) with a text label and optional icons; for an icon-only control pass iconOnly with iconLeft and label; for an on/off toggle pass pressed. Use instead: InlineLink
167
+ Button: [core] 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. Use instead: InlineLink
157
168
  Card: [core] Group related content on a raised surface with header, body, footer and metric slots, or as one selectable option. Use instead: Surface, Card.Metric
158
169
  CardMetric: Show one headline figure (a KPI, a count, a total) with its label inside a Card. Use instead: MetricTiles
159
170
  Checkbox: [core] Let people tick one or more independent options, or a parent choice that is partly selected. Use instead: Toggle, Radio
171
+ CodeBlock: Show a code sample with a copy button, optionally collapsed.
160
172
  Combobox: [core] Pick one value, or several with `multiple`, from a long list of options, with a search field that filters as you type. Use instead: Select, Menu
161
173
  Container: [core] Constrain a page region to the content or maximum width and centre it. Use instead: Stack, Grid, Box
174
+ DataTableSection: Put a heading and toolbar above a Table.
175
+ DestructiveSection: Put a dangerous action, such as delete, in its own section with a warning and a confirm step.
162
176
  Dialog: [core] Interrupt the page with a modal that needs a decision or focused input before people continue. Use instead: Tooltip, Alert, ToastProvider, AlertDialog
163
177
  Disclosure: [core] Hide optional explanatory content behind a heading that people can expand. Use instead: Tabs
164
- Divider: [core] Separate two regions of content with a thin semantic rule. Use instead: Stack, Surface
178
+ Divider: [core] Separate two blocks of content with a thin line. Use instead: Stack, Surface
165
179
  EmptyState: [core] Say that a list, grid or section has no data yet, with a title and an optional description. Use instead: Skeleton, Alert
180
+ ErrorPattern: Show an error with a short message and a Back button, in place or as a full page.
166
181
  Field: [core] Show a labelled read-only value, such as a name and its value in a detail view. Use instead: Input, Card.Metric
167
- Grid: [core] Lay out content in responsive columns with token-governed gaps, or align nested content with subgrid. Use instead: Stack, Box
182
+ Form: Wrap form fields so they stack with even spacing.
183
+ FormActions: Lay out a form's buttons in a fixed order: danger on the left, then secondary, then primary on the right.
184
+ Grid: [core] Lay out content in columns that adapt to the screen width, or line up nested content with subgrid. Use instead: Stack, Box
168
185
  HdsRouterProvider: [core] Wrap the app root once so HDS links and navigation use your client router; with no provider they stay plain anchors.
169
186
  HdsThemeProvider: [core] Wrap an app or region once to set theme, density and other root attributes for everything inside it. Use instead: Surface
170
- Icon: [core] Draw a Lucide glyph at a size and colour from the design tokens. Use instead: Button, Avatar
187
+ Icon: [core] Show a Lucide icon at a set size and color. Use instead: Button, Avatar
171
188
  InlineLink: [core] Link to a route or external URL from inside body copy. Use instead: Button, Text
172
189
  Input: [core] Collect a single line of text, a number, an email, a password, a date or a time, with label, helper and error slots. Use instead: Textarea, Select, Combobox
173
190
  Kbd: [core] Show a keyboard key or shortcut hint inline, as a native kbd element. Use instead: Text
174
191
  Menu: [core] Offer a list of actions from a trigger, closed until opened. Use instead: Select
192
+ MetricTile: Show one key number with its label, inside a MetricTiles row.
193
+ MetricTiles: Show a row of key numbers, one tile each.
194
+ Page: Wrap a screen in the standard width and padding.
195
+ PageHeader: Open a screen with its title, plus optional breadcrumb, status and actions.
175
196
  Pagination: [core] Move between pages of a long result set, with truncated page numbers. Use instead: Breadcrumb
176
197
  Popover: [core] Anchor interactive content, such as a short form, a filter set or a picker, to a trigger people click to open. Use instead: Tooltip, Menu, Dialog
177
198
  Progress: [core] Show how far a task has got, as a bar or ring that is determinate or indeterminate. Use instead: Spinner, Skeleton
178
199
  Radio: [core] Choose exactly one option from a small set that should stay visible together. Use instead: Checkbox, Select, SegmentedControl
200
+ Reveal: Fade content in as it scrolls into view.
179
201
  SegmentedControl: [core] Switch between two to five mutually exclusive views or modes in a compact row. Use instead: Radio, Tabs, Select
180
202
  Select: [core] Choose one value from a short list of options in a form field. Use instead: Menu, Combobox
181
203
  Skeleton: [core] Reserve the shape of content that is still loading, so the layout does not jump. Use instead: Progress, Spinner
182
204
  Slider: [core] Pick a number within a known range by dragging, when the exact value matters less than the position. Use instead: Input
183
205
  Spinner: [core] Show that something is loading when the wait is short or has no measurable end. Use instead: Progress, Skeleton
184
- Stack: [core] Space a row or column of content with token gaps and simple flex alignment. Use instead: Grid, Surface
206
+ Stack: [core] Space items in a row or column with even gaps. Use instead: Grid, Surface
185
207
  Stat: Show one headline figure inline, inside prose or a dense list, with its label and an optional sub-line. Use instead: MetricTiles, Card.Metric, StatusTile
186
208
  StatusTile: Show a titled status block with optional notes and a trailing badge or affordance. Use instead: MetricTiles, Card.Metric, StatusListItem
187
- Surface: [core] Wrap content in a padded, background-bearing inset surface with no header or footer anatomy. Use instead: Card, Stack
209
+ Surface: [core] Give a block of content a background and padding, with no header or footer. Use instead: Card, Stack
188
210
  Table: [core] Show rows of structured data in aligned columns, with optional sorting. Use instead: Field, Stack
189
211
  Tabs: [core] Switch between panels of related content in the same place, one visible at a time. Use instead: SegmentedControl, Disclosure
190
212
  Tag: [core] Show an interactive filter or category chip that people can toggle. Use instead: Badge