@hirobius/design-system 0.21.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 (117) hide show
  1. package/AGENTS.md +13 -1
  2. package/CHANGELOG.md +1043 -0
  3. package/CONSUMING.md +25 -11
  4. package/DESIGN.md +24 -24
  5. package/MIGRATIONS.md +603 -0
  6. package/NOTICE.md +1 -1
  7. package/README.md +22 -12
  8. package/UPGRADING.md +243 -0
  9. package/codemods/hds-prefix.mjs +28 -13
  10. package/codemods/jsx-fold.mjs +28 -13
  11. package/codemods/lib/atomic-write.mjs +28 -0
  12. package/codemods/lib/installed-version.mjs +354 -0
  13. package/codemods/lib/project.mjs +395 -0
  14. package/codemods/lib/record.mjs +110 -0
  15. package/codemods/lib/scan.mjs +323 -0
  16. package/codemods/lib/semver.mjs +57 -0
  17. package/codemods/not-found-pattern.mjs +3 -3
  18. package/codemods/patterns-subpath.mjs +28 -12
  19. package/codemods/registry.mjs +67 -0
  20. package/codemods/tile-grid.mjs +3 -3
  21. package/codemods/upgrade.mjs +909 -0
  22. package/dist/chunks/{empty-state-DNoThgfV.js → empty-state-ChC_xZfg.js} +109 -92
  23. package/dist/chunks/{form-By82qZcC.js → form-zCZ_B83I.js} +16 -16
  24. package/dist/css-contract.json +1 -0
  25. package/dist/fonts/ibm-plex-mono-400.woff2 +0 -0
  26. package/dist/fonts.css +5 -5
  27. package/dist/form.js +1 -1
  28. package/dist/hirobius-ui.js +1254 -1181
  29. package/dist/manifest.js +6 -5
  30. package/dist/patterns.js +164 -162
  31. package/dist/styles.css +1 -1
  32. package/dist/tokens.css +1 -1
  33. package/dist/tokens.js +14 -1
  34. package/dist/types/src/app/components/alert-dialog.d.ts +1 -1
  35. package/dist/types/src/app/components/alert.d.ts +1 -1
  36. package/dist/types/src/app/components/asset-img.d.ts +2 -1
  37. package/dist/types/src/app/components/avatar-group.d.ts +1 -1
  38. package/dist/types/src/app/components/avatar.d.ts +1 -1
  39. package/dist/types/src/app/components/badge.d.ts +1 -1
  40. package/dist/types/src/app/components/blockquote.d.ts +1 -1
  41. package/dist/types/src/app/components/breadcrumb.d.ts +1 -1
  42. package/dist/types/src/app/components/button.d.ts +2 -2
  43. package/dist/types/src/app/components/callout.d.ts +3 -2
  44. package/dist/types/src/app/components/card.d.ts +6 -4
  45. package/dist/types/src/app/components/checkbox.d.ts +1 -1
  46. package/dist/types/src/app/components/code-block.d.ts +2 -1
  47. package/dist/types/src/app/components/combobox.d.ts +2 -2
  48. package/dist/types/src/app/components/data-table-section.d.ts +2 -1
  49. package/dist/types/src/app/components/destructive-section.d.ts +2 -1
  50. package/dist/types/src/app/components/dialog.d.ts +1 -1
  51. package/dist/types/src/app/components/disclosure.d.ts +1 -1
  52. package/dist/types/src/app/components/divider.d.ts +2 -2
  53. package/dist/types/src/app/components/empty-state.d.ts +1 -1
  54. package/dist/types/src/app/components/field.d.ts +1 -1
  55. package/dist/types/src/app/components/form-actions.d.ts +2 -1
  56. package/dist/types/src/app/components/form.d.ts +2 -1
  57. package/dist/types/src/app/components/grid.d.ts +1 -1
  58. package/dist/types/src/app/components/hds-tooltip.d.ts +1 -1
  59. package/dist/types/src/app/components/icon.d.ts +2 -2
  60. package/dist/types/src/app/components/inline-link.d.ts +1 -1
  61. package/dist/types/src/app/components/input.d.ts +1 -1
  62. package/dist/types/src/app/components/kbd.d.ts +1 -1
  63. package/dist/types/src/app/components/menu.d.ts +1 -1
  64. package/dist/types/src/app/components/metadata-list.d.ts +1 -1
  65. package/dist/types/src/app/components/metric-tiles.d.ts +3 -1
  66. package/dist/types/src/app/components/page-header.d.ts +1 -0
  67. package/dist/types/src/app/components/page.d.ts +1 -0
  68. package/dist/types/src/app/components/pagination.d.ts +1 -1
  69. package/dist/types/src/app/components/popover.d.ts +1 -1
  70. package/dist/types/src/app/components/progress.d.ts +1 -1
  71. package/dist/types/src/app/components/radio.d.ts +1 -1
  72. package/dist/types/src/app/components/reveal.d.ts +1 -0
  73. package/dist/types/src/app/components/select.d.ts +1 -1
  74. package/dist/types/src/app/components/skeleton.d.ts +1 -1
  75. package/dist/types/src/app/components/slider.d.ts +1 -1
  76. package/dist/types/src/app/components/spinner.d.ts +1 -1
  77. package/dist/types/src/app/components/stack.d.ts +1 -1
  78. package/dist/types/src/app/components/stat.d.ts +1 -1
  79. package/dist/types/src/app/components/status-list-item.d.ts +1 -1
  80. package/dist/types/src/app/components/status-tile.d.ts +1 -1
  81. package/dist/types/src/app/components/table.d.ts +1 -1
  82. package/dist/types/src/app/components/tabs.d.ts +4 -2
  83. package/dist/types/src/app/components/tag.d.ts +1 -1
  84. package/dist/types/src/app/components/text.d.ts +1 -1
  85. package/dist/types/src/app/components/textarea.d.ts +1 -1
  86. package/dist/types/src/app/components/timestamp.d.ts +1 -1
  87. package/dist/types/src/app/components/toast.d.ts +1 -1
  88. package/dist/types/src/app/components/toggle.d.ts +1 -1
  89. package/dist/types/src/app/context/hds-theme.d.ts +1 -1
  90. package/dist/types/src/app/design-system/generated-token-refs.d.ts +13 -0
  91. package/dist/types/src/app/design-system/generated-token-values.d.ts +14 -1
  92. package/dist/types/src/app/hooks/useInteractionState.d.ts +7 -1
  93. package/dist/types/src/index.d.ts +126 -32
  94. package/dist/variables.css +33 -22
  95. package/docs/CONSUMING.md +2 -2
  96. package/hirobius.tokens.json +173 -79
  97. package/llms.txt +29 -7
  98. package/mcp/catalog.mjs +10 -7
  99. package/mcp/core-set.mjs +66 -0
  100. package/mcp/guide.mjs +9 -52
  101. package/package.json +28 -11
  102. package/public/hds-manifest.json +365 -207
  103. package/public/llms/components.txt +1 -1
  104. package/public/llms-full.txt +54 -32
  105. package/public/llms.txt +29 -7
  106. package/src/app/data/component-api.json +104 -71
  107. package/upgrade/index.json +215 -0
  108. package/upgrade/releases/0.17.0.json +962 -0
  109. package/upgrade/releases/0.18.0.json +8 -0
  110. package/upgrade/releases/0.19.0.json +233 -0
  111. package/upgrade/releases/0.19.1.json +8 -0
  112. package/upgrade/releases/0.20.0.json +5108 -0
  113. package/upgrade/releases/0.21.0.json +538 -0
  114. package/upgrade/releases/0.22.0.json +94 -0
  115. package/upgrade/releases/0.23.0.json +259 -0
  116. package/upgrade/schema.json +1102 -0
  117. package/dist/fonts/geist-mono-400.woff2 +0 -0
package/MIGRATIONS.md ADDED
@@ -0,0 +1,603 @@
1
+ # Migrations
2
+
3
+ How HDS deprecates and removes public API, and the removals shipped so far.
4
+ Token renames live in
5
+ [TOKEN_MIGRATION.md](https://github.com/hirobius/hds/blob/main/TOKEN_MIGRATION.md)
6
+ (not in the package).
7
+
8
+ ## The cycle
9
+
10
+ 1. **Deprecate.** The new path ships and the old one keeps working. The old one
11
+ carries `@deprecated` and `@removeIn` JSDoc that names the replacement.
12
+ 2. **Give a codemod.** A script in `codemods/` rewrites consumer code, supports
13
+ `--check` (exit 1 when a rewrite is needed, writes nothing) and `--dry-run`,
14
+ and has unit tests against fixture files.
15
+ 3. **Run it on a real consumer.** The dry-run diff is filed as an issue on the
16
+ consumer's repo. HDS never pushes to it.
17
+ 4. **Remove** at the announced window. Before 1.0 a removal may ship in a 0.x
18
+ minor: semver allows the break, and a caret range such as `^0.19` never
19
+ resolves to 0.20. Each one is announced here in a dated section, one row per
20
+ removed name, with the codemod where a consumer imports the name. From 1.0 on,
21
+ removals ship only in a major. ADR-014's 2026-10-01 amendment records the rule
22
+ (hds#389).
23
+
24
+ ## Pattern components move to `/patterns`
25
+
26
+ - **Deprecated in:** 0.17 (hds#254). 21 pattern-tier components are still
27
+ exported from the package root, each marked `@deprecated`. They are also
28
+ exported from `@hirobius/design-system/patterns`.
29
+ - **Removed from the root in:** 0.20.0 (hds#389 R1). The root no longer
30
+ exports these 21 components or anything else from their modules (props types,
31
+ parts, hooks, `*Variants`). `/patterns` keeps six of them with every name:
32
+ AssetImg, CodeBlock, ErrorPattern, Form, Page and Reveal. The other 15 are
33
+ removed outright in the same release, from `/patterns` too (hds#394 wave 4a).
34
+ See [0.20.0 removals](#0200-removals-2026-10-01).
35
+ - **Codemod:** `codemods/patterns-subpath.mjs`, also installed as the
36
+ `hds-patterns-subpath` binary. The names it moves are everything
37
+ `/patterns` exports and the root does not (`pnpm codemod:names`), never
38
+ listed by hand. A name of the 15 removed modules has nowhere to move: the
39
+ codemod reports a named import or re-export of it as removed in 0.20.0 for
40
+ a manual edit, and `--check` exits 1 (the list is
41
+ `codemods/removed-0.20.json`). A removed name read through a namespace
42
+ import or a dynamic `import()` is left to the type checker.
43
+
44
+ ```bash
45
+ # Preview what would change, writes nothing
46
+ npx -p @hirobius/design-system@^0.20.0 hds-patterns-subpath --root . --dry-run
47
+
48
+ # CI guard: exit 1 while any root pattern import remains
49
+ npx -p @hirobius/design-system@^0.20.0 hds-patterns-subpath --root . --check
50
+
51
+ # Rewrite in place
52
+ npx -p @hirobius/design-system@^0.20.0 hds-patterns-subpath --root .
53
+ ```
54
+
55
+ Other named imports stay on the root. Aliases (`Page as Screen`), `type`
56
+ modifiers and multi-line layout are kept, and a pattern name joins an existing
57
+ `/patterns` import instead of adding a second one. Default plus named imports
58
+ (`import HDS, { Page }`), `export { Page } from` re-exports and indented imports
59
+ are handled. `--dry-run` prints each import line before (`-`) and after (`+`).
60
+ Some statements hide the names, so the codemod cannot rewrite them; `--check`
61
+ exits 1 and lists them for a manual edit: `export * from '@hirobius/design-system'`,
62
+ and a namespace import (`import * as HDS`) or a dynamic `import()`, `require()`,
63
+ `vi.mock`, `jest.mock` (and the other test-runner loaders) of the root in a file
64
+ that reads a pattern name off something: `HDS.Page`, `m['Page']`,
65
+ `import('@hirobius/design-system').then((m) => m.Page)`,
66
+ `const { Page } = require(…)`. A bare `Page`, such as the `/patterns` import the
67
+ codemod wrote, does not count, so a migrated file passes `--check`.
68
+ Comments in the braces move with their specifier, and an import after `;` or a
69
+ comment on its line is read too (hds#434). A file the codemod cannot read to its
70
+ end is listed as unreadable and keeps `--check` at exit 1: in JSX text, a lone
71
+ backtick or a `/*` (as in `src/*.ts`) opens a template or comment that never
72
+ closes, so write it as ``{'`'}`` or `{'/*'}`.
73
+ `node_modules`, `dist` and `.git` are skipped.
74
+
75
+ Upgrade the package to 0.17 first: `/patterns` does not exist in 0.16.
76
+
77
+ ### First consumer run
78
+
79
+ The first consumer app to run it pins `^0.16.0`. A read-only dry run on
80
+ 2026-09-29 found 11 import sites in 11 files, all four names being `Page`,
81
+ `ErrorPattern`, `AssetImg` and `CodeBlock`. A second dry run on 2026-10-01
82
+ found the same 11 sites; with StatusTile on `/patterns` (hds#395) it moves 12,
83
+ the extra one a second import statement in a file that already imports Page.
84
+
85
+ ## Spacing names move to the t-shirt scale
86
+
87
+ - **Deprecated in:** 0.17 (hds#206). Spacing is one scale,
88
+ `semantic.space.scale.{xs,sm,md,lg,xl}` (8/16/24/32/48px). The old names
89
+ keep computing exactly what they did, at both densities, and carry
90
+ `$deprecated` in `hirobius.tokens.json`.
91
+ - **Removed in:** not yet, and not in 0.20.0. Before 1.0 it may go in a 0.x
92
+ minor (step 4), but no window is set: steps 2 and 3 come first, and removing
93
+ the token paths also deletes their Figma variables.
94
+ - **Warning:** in a development build, Box `sx`'s `'tight'` to `'spacious'`
95
+ each log one `[HDS deprecation]` console warning naming the step to use.
96
+ Production builds stay silent. The token paths cannot warn at runtime.
97
+ - **Codemod:** `scripts/codemod-spacing-vocabulary.mjs` rewrites the token
98
+ references below, but only inside HDS's own `src/`. A consumer codemod in
99
+ `codemods/` with `--root`, `--check` and `--dry-run` does not exist yet.
100
+
101
+ | Old | New |
102
+ | ---------------------------------------------------- | ---------------------------------- |
103
+ | `semantic.space.component.gap` | `semantic.space.scale.xs` |
104
+ | `semantic.space.layout.tight` | `semantic.space.scale.sm` |
105
+ | `semantic.space.layout.normal` | `semantic.space.scale.md` |
106
+ | `semantic.space.layout.inset` | `semantic.space.scale.lg` |
107
+ | `semantic.space.layout.spacious` | `semantic.space.scale.xl` |
108
+ | `semantic.space.component.padding` | `semantic.space.surface.padding` |
109
+ | `semantic.space.layout.gutter` | `semantic.space.region.gutter` |
110
+ | Box `sx` `'tight'` `'normal'` `'inset'` `'spacious'` | `'sm'` `'md'` `'lg'` `'xl'` |
111
+ | Box `sx` integer `2` `4` `6` `8` `12` (4px units) | `'xs'` `'sm'` `'md'` `'lg'` `'xl'` |
112
+
113
+ The CSS variables follow the paths (`--semantic-space-layout-tight` becomes
114
+ `--semantic-space-scale-sm`). `surface.padding` and `region.gutter` are not
115
+ scale steps: tenants and `theme.css` override them at runtime, always with a
116
+ scale step.
117
+
118
+ Compact density: each swap in the table is pixel-identical at the default
119
+ density, but not under `data-density="compact"`. `component.gap`,
120
+ `layout.tight|normal|inset|spacious`, Box `sx`'s `'tight'` to `'spacious'` and
121
+ Box `sx` integers are fixed pixels. The `scale.*` steps that replace them
122
+ tighten one step under compact (8, 16, 24, 32, 48px become 6, 12, 20, 24,
123
+ 40px). Moving to the scale therefore tightens compact screens, the way Stack's
124
+ gaps already do. To keep the old compact pixels exactly, use the fixed step
125
+ instead: `hds.space.px8|px16|px24|px32|px48`, or
126
+ `--primitive-space-2|4|6|8|12`.
127
+
128
+ Stack's `gap` keeps its old names for now, because its `'xs'` is the 2px
129
+ subgrid step, not `scale.xs`. Its `'tight'` to `'spacious'` read the scale
130
+ steps, so unlike Box `sx`'s same four names they tighten under compact. That
131
+ difference stays until both sets of names are removed. Stack's numbers (raw px)
132
+ and anything else untyped callers pass render what they did before.
133
+
134
+ Upgrade first: Box `sx` takes `'xs'` to `'xl'` only from the first release after
135
+ 0.19.1. On 0.19.1 and earlier the string passes through, so `p: 'sm'` becomes
136
+ `padding: sm`, which is invalid CSS and renders no padding.
137
+
138
+ `hds.density.*` (the `hds` token bridge) is deprecated from that release too,
139
+ with the same removal window (`@removeIn 1.0.0`). Its names sit one step off the
140
+ scale, and each replacement computes the same pixels at both densities:
141
+
142
+ | Old | New |
143
+ | ------------------------------------------- | ------------------------------------------------------------------ |
144
+ | `hds.density.sm` (`var(--hds-space-sm)`) | `hds.semantic.space.scale.xs` |
145
+ | `hds.density.md` (`var(--hds-space-md)`) | `hds.semantic.space.scale.sm` |
146
+ | `hds.density.lg` (`var(--hds-space-lg)`) | `hds.semantic.space.scale.md` |
147
+ | `hds.density.xl` (`var(--hds-space-xl)`) | `hds.semantic.space.scale.lg` |
148
+ | `hds.density.xl2` (`var(--hds-space-2xl)`) | `hds.semantic.space.scale.xl` |
149
+ | `hds.density.xs`, `hds.density.xl3`, `.xl4` | no scale step; `hds.space.px4`, `px64`, `px80` (not density-aware) |
150
+
151
+ ## 0.20.0 removals (2026-10-01)
152
+
153
+ The first removal batches under step 4. hds#389 R1 removes names deprecated in
154
+ an earlier 0.x release: 79 root names that moved to `/patterns`, six `Hds*`
155
+ aliases and five docs/lab components (12 names). hds#394 wave 4a then removes,
156
+ without a deprecation release, 32 components no consumer imports (87 names,
157
+ from the root and `/patterns`) and makes the 38 remaining root `*Variants` cva
158
+ helpers private (hds#389's 2026-10-01 decision update). Wave 4b removes 13
159
+ components that fold into a survivor hds#393 shipped (27 root names; StatusDot
160
+ stays for now). hds#395 (B5) removes the two that a consumer app renders,
161
+ NotFoundPattern and TileGrid (3 root names), each with a codemod of its own,
162
+ and moves StatusTile from the root to `/patterns` (3 names). Nothing else left
163
+ the public API. The one consumer app that imports components pins a caret range
164
+ below 0.20, so nothing breaks until it upgrades; run the codemods first.
165
+
166
+ ```bash
167
+ # Preview, then rewrite in place. `-p` runs the bins from the 0.20 package
168
+ # (hds-prefix first ships in 0.20.0), so npx never looks the bin name up on
169
+ # its own in the registry. Works before or after you upgrade.
170
+ npx -p @hirobius/design-system@^0.20.0 hds-patterns-subpath --root . --dry-run
171
+ npx -p @hirobius/design-system@^0.20.0 hds-prefix --root . --dry-run
172
+ npx -p @hirobius/design-system@^0.20.0 hds-not-found-pattern --root . --dry-run
173
+ npx -p @hirobius/design-system@^0.20.0 hds-tile-grid --root . --dry-run
174
+ npx -p @hirobius/design-system@^0.20.0 hds-patterns-subpath --root .
175
+ npx -p @hirobius/design-system@^0.20.0 hds-prefix --root .
176
+ npx -p @hirobius/design-system@^0.20.0 hds-not-found-pattern --root .
177
+ npx -p @hirobius/design-system@^0.20.0 hds-tile-grid --root .
178
+ ```
179
+
180
+ The four run in any order and reach the same files. Each one's `--check`
181
+ exits 0 once nothing is left for it, and `hds-patterns-subpath --check` also
182
+ stays at 1 while a NotFoundPattern or TileGrid import remains.
183
+
184
+ After upgrading, the installed copies run without a download:
185
+ `pnpm exec hds-prefix --root .`, or
186
+ `node node_modules/@hirobius/design-system/codemods/hds-prefix.mjs --root .`.
187
+
188
+ ### Pattern components leave the root
189
+
190
+ The 21 pattern modules are no longer re-exported from the package root (hds#254).
191
+ Six of them (AssetImg, CodeBlock, ErrorPattern, Form, Page, Reveal) export every
192
+ name unchanged on `@hirobius/design-system/patterns`; their names are below. The
193
+ other 15 are removed outright in the same release, from `/patterns` too: their
194
+ names are under [Components removed with no survivor](#components-removed-with-no-survivor-hds394-wave-4a).
195
+
196
+ | Removed from `@hirobius/design-system` | Use instead | Codemod |
197
+ | -------------------------------------- | ------------------------------------------------------------------- | ---------------------------------------------------------------------- |
198
+ | `AssetImg` | `AssetImg` from `@hirobius/design-system/patterns` | `npx -p @hirobius/design-system@^0.20.0 hds-patterns-subpath --root .` |
199
+ | `AssetImgProps` | `AssetImgProps` from `@hirobius/design-system/patterns` | `npx -p @hirobius/design-system@^0.20.0 hds-patterns-subpath --root .` |
200
+ | `blockCodeTextVariants` | `blockCodeTextVariants` from `@hirobius/design-system/patterns` | `npx -p @hirobius/design-system@^0.20.0 hds-patterns-subpath --root .` |
201
+ | `blockContainerVariants` | `blockContainerVariants` from `@hirobius/design-system/patterns` | `npx -p @hirobius/design-system@^0.20.0 hds-patterns-subpath --root .` |
202
+ | `blockHeaderVariants` | `blockHeaderVariants` from `@hirobius/design-system/patterns` | `npx -p @hirobius/design-system@^0.20.0 hds-patterns-subpath --root .` |
203
+ | `chevronVariants` | `chevronVariants` from `@hirobius/design-system/patterns` | `npx -p @hirobius/design-system@^0.20.0 hds-patterns-subpath --root .` |
204
+ | `CodeBlock` | `CodeBlock` from `@hirobius/design-system/patterns` | `npx -p @hirobius/design-system@^0.20.0 hds-patterns-subpath --root .` |
205
+ | `CodeBlockProps` | `CodeBlockProps` from `@hirobius/design-system/patterns` | `npx -p @hirobius/design-system@^0.20.0 hds-patterns-subpath --root .` |
206
+ | `collapsibleToggleVariants` | `collapsibleToggleVariants` from `@hirobius/design-system/patterns` | `npx -p @hirobius/design-system@^0.20.0 hds-patterns-subpath --root .` |
207
+ | `copyButtonVariants` | `copyButtonVariants` from `@hirobius/design-system/patterns` | `npx -p @hirobius/design-system@^0.20.0 hds-patterns-subpath --root .` |
208
+ | `ErrorPattern` | `ErrorPattern` from `@hirobius/design-system/patterns` | `npx -p @hirobius/design-system@^0.20.0 hds-patterns-subpath --root .` |
209
+ | `ErrorPatternProps` | `ErrorPatternProps` from `@hirobius/design-system/patterns` | `npx -p @hirobius/design-system@^0.20.0 hds-patterns-subpath --root .` |
210
+ | `FieldWiring` | `FieldWiring` from `@hirobius/design-system/patterns` | `npx -p @hirobius/design-system@^0.20.0 hds-patterns-subpath --root .` |
211
+ | `FieldWiringInput` | `FieldWiringInput` from `@hirobius/design-system/patterns` | `npx -p @hirobius/design-system@^0.20.0 hds-patterns-subpath --root .` |
212
+ | `Form` | `Form` from `@hirobius/design-system/patterns` | `npx -p @hirobius/design-system@^0.20.0 hds-patterns-subpath --root .` |
213
+ | `FormField` | `FormField` from `@hirobius/design-system/patterns` | `npx -p @hirobius/design-system@^0.20.0 hds-patterns-subpath --root .` |
214
+ | `FormFieldProps` | `FormFieldProps` from `@hirobius/design-system/patterns` | `npx -p @hirobius/design-system@^0.20.0 hds-patterns-subpath --root .` |
215
+ | `FormFieldShell` | `FormFieldShell` from `@hirobius/design-system/patterns` | `npx -p @hirobius/design-system@^0.20.0 hds-patterns-subpath --root .` |
216
+ | `FormFieldShellProps` | `FormFieldShellProps` from `@hirobius/design-system/patterns` | `npx -p @hirobius/design-system@^0.20.0 hds-patterns-subpath --root .` |
217
+ | `FormProps` | `FormProps` from `@hirobius/design-system/patterns` | `npx -p @hirobius/design-system@^0.20.0 hds-patterns-subpath --root .` |
218
+ | `inlineCodeTextVariants` | `inlineCodeTextVariants` from `@hirobius/design-system/patterns` | `npx -p @hirobius/design-system@^0.20.0 hds-patterns-subpath --root .` |
219
+ | `inlineWrapperVariants` | `inlineWrapperVariants` from `@hirobius/design-system/patterns` | `npx -p @hirobius/design-system@^0.20.0 hds-patterns-subpath --root .` |
220
+ | `Page` | `Page` from `@hirobius/design-system/patterns` | `npx -p @hirobius/design-system@^0.20.0 hds-patterns-subpath --root .` |
221
+ | `PageProps` | `PageProps` from `@hirobius/design-system/patterns` | `npx -p @hirobius/design-system@^0.20.0 hds-patterns-subpath --root .` |
222
+ | `prePanelVariants` | `prePanelVariants` from `@hirobius/design-system/patterns` | `npx -p @hirobius/design-system@^0.20.0 hds-patterns-subpath --root .` |
223
+ | `Reveal` | `Reveal` from `@hirobius/design-system/patterns` | `npx -p @hirobius/design-system@^0.20.0 hds-patterns-subpath --root .` |
224
+ | `RevealAnimation` | `RevealAnimation` from `@hirobius/design-system/patterns` | `npx -p @hirobius/design-system@^0.20.0 hds-patterns-subpath --root .` |
225
+ | `RevealProps` | `RevealProps` from `@hirobius/design-system/patterns` | `npx -p @hirobius/design-system@^0.20.0 hds-patterns-subpath --root .` |
226
+ | `useFieldWiring` | `useFieldWiring` from `@hirobius/design-system/patterns` | `npx -p @hirobius/design-system@^0.20.0 hds-patterns-subpath --root .` |
227
+
228
+ ### `Hds*` aliases
229
+
230
+ The six `Hds`-prefixed spellings (hds#315) are gone; each component is exported
231
+ under its bare name only. The `hds-prefix` codemod (`codemods/hds-prefix.mjs`)
232
+ rewrites the import specifier and nothing else: `import { HdsCheckbox }` becomes
233
+ `import { Checkbox as HdsCheckbox }`, so the file keeps its local name and every
234
+ reference (JSX tags, values, `typeof`, spreads, string keys) still resolves to
235
+ the same component. An existing alias stays (`HdsSelect as Pick` becomes
236
+ `Select as Pick`), `type` modifiers, comments and layout are kept, and a
237
+ re-export keeps its own export name (`export { Toggle as HdsToggle }`). Only
238
+ imports whose source is exactly `@hirobius/design-system` change. Renaming the
239
+ local binding to `Checkbox` afterwards is optional and a manual edit. Running it
240
+ twice changes nothing. It cannot see through `export * from '@hirobius/design-system'`,
241
+ or through a namespace import or a dynamic `import()`, `require()`, `vi.mock` or
242
+ `jest.mock` of the root in a file that reads an alias off something
243
+ (`HDS.HdsSlider`, `m['HdsToggle']`, `const { HdsRadio } = require(…)`);
244
+ `--check` exits 1 and lists those for a manual edit.
245
+ It also lists a file it cannot read to its end, as `hds-patterns-subpath` does.
246
+
247
+ | Removed from `@hirobius/design-system` | Use instead | Codemod |
248
+ | -------------------------------------- | ----------- | ------------------------------------------------------------ |
249
+ | `HdsCheckbox` | `Checkbox` | `npx -p @hirobius/design-system@^0.20.0 hds-prefix --root .` |
250
+ | `HdsRadio` | `Radio` | `npx -p @hirobius/design-system@^0.20.0 hds-prefix --root .` |
251
+ | `HdsSelect` | `Select` | `npx -p @hirobius/design-system@^0.20.0 hds-prefix --root .` |
252
+ | `HdsSlider` | `Slider` | `npx -p @hirobius/design-system@^0.20.0 hds-prefix --root .` |
253
+ | `HdsToggle` | `Toggle` | `npx -p @hirobius/design-system@^0.20.0 hds-prefix --root .` |
254
+ | `HdsTooltip` | `Tooltip` | `npx -p @hirobius/design-system@^0.20.0 hds-prefix --root .` |
255
+
256
+ A consumer app imports `HdsCheckbox` in one file. A read-only dry run on
257
+ 2026-10-01 rewrites that import to `Checkbox as HdsCheckbox` and leaves its JSX
258
+ tag as written; no other `Hds*` alias is imported.
259
+
260
+ ### Docs and lab components
261
+
262
+ Five components that existed to build the HDS docs and token lab (hds#232,
263
+ deprecated in 0.16) are deleted, source and stories included. No consumer
264
+ imports any of them, so there is no codemod. Their two drawings in the Figma
265
+ staging file were never promoted and leave the promotion list.
266
+
267
+ | Removed from `@hirobius/design-system` | Use instead | Codemod |
268
+ | -------------------------------------- | ------------------------------------------------------------------------------------------------------------ | ---------------------------- |
269
+ | `CinematicLink` | No replacement; the animated editorial link treatment is dropped. A plain link in body copy is `InlineLink`. | none: no consumer imports it |
270
+ | `CinematicLinkProps` | No replacement; dropped with `CinematicLink`. | none: no consumer imports it |
271
+ | `ComponentInstanceMatrix` | No replacement; the docs-page variant and state specimen matrix is dropped. | none: no consumer imports it |
272
+ | `FoundationSwatch` | No replacement; the colour-token specimen swatch is dropped. | none: no consumer imports it |
273
+ | `FoundationSwatchProps` | No replacement; dropped with `FoundationSwatch`. | none: no consumer imports it |
274
+ | `Sketch` | No replacement; the generative-canvas page shell is dropped. | none: no consumer imports it |
275
+ | `SketchProps` | No replacement; dropped with `Sketch`. | none: no consumer imports it |
276
+ | `Token` | No replacement; the token-path node specimen is dropped. | none: no consumer imports it |
277
+ | `TokenProps` | No replacement; dropped with `Token`. | none: no consumer imports it |
278
+ | `tokenLabelVariants` | No replacement; dropped with `Token`. | none: no consumer imports it |
279
+ | `tokenNodeInlineVariants` | No replacement; dropped with `Token`. | none: no consumer imports it |
280
+ | `tokenShellVariants` | No replacement; dropped with `Token`. | none: no consumer imports it |
281
+
282
+ ### Components removed with no survivor (hds#394 wave 4a)
283
+
284
+ Thirty-two components fail hds#389's survival rule and have no replacement in
285
+ HDS (ADR-034 covers the date pickers). None is imported by a consumer: the
286
+ consumer app that imports components has 0 import sites for any of them, and
287
+ the other consumers import only `variables.css` or do not depend on HDS. So
288
+ there is no codemod to run. `hds-patterns-subpath --check` reports a named import or
289
+ re-export of any of these names from the root or from `/patterns` as "removed
290
+ in 0.20.0, no replacement" for a manual edit (the list is
291
+ `codemods/removed-0.20.json`). It reads named imports only: a removed name read
292
+ through a namespace import or a dynamic `import()` is left to the type checker.
293
+ Their stories, manifest specs, Figma disposition rows, Code Connect exemptions
294
+ and staging-promotion entries go with them, and so do the `styles.css` and
295
+ `tokens.css` rules only they used: `.hds-doc-link-card` (DocLinkCard),
296
+ `.hds-stepper-input` (StepperField), `.hds-doc-section-header` and
297
+ `.hds-doc-section-copy-icon` (TextLockup), and `.hds-page-enter` with its
298
+ keyframes (HdsSystemDocLayout). ButtonGroup, ContextMenu and
299
+ HoverCard also leave the curated core set; with Menu, Popover, Tooltip and HdsRouterProvider added (hds#393) it is 43 components.
300
+
301
+ | Removed | From | Use instead | Codemod |
302
+ | --------------------------- | ----------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------ |
303
+ | `activityAvatarVariants` | `/patterns` | No replacement; dropped with `ActivityFeed`. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
304
+ | `ActivityEvent` | `/patterns` | No replacement; dropped with `ActivityFeed`. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
305
+ | `ActivityFeed` | `/patterns` | No replacement; the activity feed is dropped. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
306
+ | `ActivityFeedProps` | `/patterns` | No replacement; dropped with `ActivityFeed`. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
307
+ | `ActivityStatus` | `/patterns` | No replacement; dropped with `ActivityFeed`. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
308
+ | `ActivityTone` | `/patterns` | No replacement; dropped with `ActivityFeed`. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
309
+ | `activityToneVariants` | `/patterns` | No replacement; dropped with `ActivityFeed`. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
310
+ | `AppShell` | `/patterns` | No replacement; the app shell is dropped. Compose `Sidebar` for a navigation and content split. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
311
+ | `AppShellProps` | `/patterns` | No replacement; dropped with `AppShell`. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
312
+ | `appShellVariants` | `/patterns` | No replacement; dropped with `AppShell`. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
313
+ | `ButtonGroup` | root | No replacement; the joined button row is dropped. Lay buttons out with `Stack direction="row"`. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
314
+ | `ButtonGroupProps` | root | No replacement; dropped with `ButtonGroup`. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
315
+ | `buttonGroupVariants` | root | No replacement; dropped with `ButtonGroup`. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
316
+ | `Calendar` | `/patterns` | The calendar picker is dropped (ADR-034). Use `Input type="date"`. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
317
+ | `CalendarProps` | `/patterns` | No replacement; dropped with `Calendar`. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
318
+ | `Carousel` | `/patterns` | No replacement; the carousel is dropped. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
319
+ | `carouselControlVariants` | `/patterns` | No replacement; dropped with `Carousel`. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
320
+ | `CarouselProps` | `/patterns` | No replacement; dropped with `Carousel`. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
321
+ | `CaseStudyLayout` | root | No replacement; the case-study page template is dropped. Compose `Container` and `Stack`. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
322
+ | `CaseStudyLayoutProps` | root | No replacement; dropped with `CaseStudyLayout`. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
323
+ | `cmdkDescriptionVariants` | `/patterns` | No replacement; dropped with `CommandPalette`. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
324
+ | `cmdkKindBadgeVariants` | `/patterns` | No replacement; dropped with `CommandPalette`. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
325
+ | `cmdkRowVariants` | `/patterns` | No replacement; dropped with `CommandPalette`. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
326
+ | `CommandPalette` | `/patterns` | No replacement; the command palette is dropped. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
327
+ | `CommandPaletteProps` | `/patterns` | No replacement; dropped with `CommandPalette`. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
328
+ | `ContextMenu` | root | No replacement; the right-click menu is dropped. `Menu` covers a menu behind a visible trigger. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
329
+ | `DateInput` | root | The date picker is dropped (ADR-034). Use `Input type="date"`. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
330
+ | `DateInputProps` | root | No replacement; dropped with `DateInput`. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
331
+ | `DateRangeInput` | root | The date-range picker is dropped (ADR-034). Use two `Input type="date"` fields. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
332
+ | `DateRangeInputProps` | root | No replacement; dropped with `DateRangeInput`. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
333
+ | `DateTimeInput` | root | The date-and-time picker is dropped (ADR-034). Use `Input type="datetime-local"`. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
334
+ | `DateTimeInputProps` | root | No replacement; dropped with `DateTimeInput`. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
335
+ | `defaultActivityEvents` | `/patterns` | No replacement; dropped with `ActivityFeed`. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
336
+ | `DocLinkCard` | `/patterns` | No replacement; the docs link card is dropped. Compose `Card` and `InlineLink`. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
337
+ | `DocLinkCardProps` | `/patterns` | No replacement; dropped with `DocLinkCard`. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
338
+ | `docLinkCardVariants` | `/patterns` | No replacement; dropped with `DocLinkCard`. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
339
+ | `ErrorBoundary` | root | No replacement; the render-error boundary is dropped. Use a React error boundary of your own with `ErrorPattern` (`/patterns`) as its fallback. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
340
+ | `ErrorBoundaryProps` | root | No replacement; dropped with `ErrorBoundary`. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
341
+ | `FileInput` | `/patterns` | No replacement; the styled file picker is dropped. Use a native `<input type="file">`. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
342
+ | `FileInputProps` | `/patterns` | No replacement; dropped with `FileInput`. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
343
+ | `fileInputVariants` | `/patterns` | No replacement; dropped with `FileInput`. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
344
+ | `HdsDocsShell` | root | No replacement; the docs-site shell (nav and contents rails) is dropped. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
345
+ | `HdsDocsShellProps` | root | No replacement; dropped with `HdsDocsShell`. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
346
+ | `HdsSystemDocLayout` | root | No replacement; the docs-page column layout is dropped. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
347
+ | `HeadingStack` | root | `Stack` + `Text`: a heading `Text` and a `text-muted-foreground` body `Text` in a `Stack gap="gap"` (docs/rules/REACT_COMPONENTS.md). | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
348
+ | `headingStackLevelVariants` | root | `Stack` + `Text`: a heading `Text` and a `text-muted-foreground` body `Text` in a `Stack gap="gap"` (docs/rules/REACT_COMPONENTS.md). | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
349
+ | `HeadingStackProps` | root | `Stack` + `Text`: a heading `Text` and a `text-muted-foreground` body `Text` in a `Stack gap="gap"` (docs/rules/REACT_COMPONENTS.md). | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
350
+ | `headingStackVariants` | root | `Stack` + `Text`: a heading `Text` and a `text-muted-foreground` body `Text` in a `Stack gap="gap"` (docs/rules/REACT_COMPONENTS.md). | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
351
+ | `HistoryCard` | root | No replacement; the commit-history card is dropped. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
352
+ | `HistoryCardCommit` | root | No replacement; dropped with `HistoryCard`. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
353
+ | `HistoryCardProps` | root | No replacement; dropped with `HistoryCard`. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
354
+ | `HoverCard` | root | No replacement; the hover preview card is dropped. `Tooltip` covers a short hint, `Popover` richer content. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
355
+ | `Lightbox` | `/patterns` | No replacement; the full-screen image viewer is dropped. `AssetImg` stays. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
356
+ | `LightboxProps` | `/patterns` | No replacement; dropped with `Lightbox`. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
357
+ | `NavGroup` | root | No replacement; the collapsible navigation group is dropped. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
358
+ | `navGroupLabelVariants` | root | No replacement; dropped with `NavGroup`. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
359
+ | `NavGroupProps` | root | No replacement; dropped with `NavGroup`. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
360
+ | `navIndicatorVariants` | `/patterns` | No replacement; dropped with `NavItem`. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
361
+ | `NavItem` | `/patterns` | No replacement; the navigation item is dropped. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
362
+ | `navItemVariants` | `/patterns` | No replacement; dropped with `NavItem`. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
363
+ | `NavProps` | `/patterns` | No replacement; dropped with `NavItem`. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
364
+ | `OverflowList` | `/patterns` | No replacement; the "+N" overflow list is dropped. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
365
+ | `OverflowListProps` | `/patterns` | No replacement; dropped with `OverflowList`. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
366
+ | `SideNav` | `/patterns` | No replacement; the side navigation is dropped. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
367
+ | `SideNavLevel` | `/patterns` | No replacement; dropped with `SideNav`. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
368
+ | `SideNavProps` | `/patterns` | No replacement; dropped with `SideNav`. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
369
+ | `sideNavVariants` | `/patterns` | No replacement; dropped with `SideNav`. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
370
+ | `StackedCardRail` | `/patterns` | No replacement; the pinned card rail is dropped. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
371
+ | `StackedCardRailCard` | `/patterns` | No replacement; dropped with `StackedCardRail`. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
372
+ | `StackedCardRailProps` | `/patterns` | No replacement; dropped with `StackedCardRail`. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
373
+ | `Step` | `/patterns` | No replacement; dropped with `Stepper`. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
374
+ | `stepMarkerVariants` | `/patterns` | No replacement; dropped with `Stepper`. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
375
+ | `Stepper` | `/patterns` | No replacement; the step indicator is dropped. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
376
+ | `StepperField` | root | No replacement; the number stepper is dropped. Use `Input type="number"`. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
377
+ | `StepperFieldProps` | root | No replacement; dropped with `StepperField`. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
378
+ | `StepperProps` | `/patterns` | No replacement; dropped with `Stepper`. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
379
+ | `TextLockup` | root | `Stack` + `Text`: a heading `Text` and a `text-muted-foreground` body `Text` in a `Stack gap="gap"` (docs/rules/REACT_COMPONENTS.md). | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
380
+ | `TextLockupProps` | root | `Stack` + `Text`: a heading `Text` and a `text-muted-foreground` body `Text` in a `Stack gap="gap"` (docs/rules/REACT_COMPONENTS.md). | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
381
+ | `Tokenizer` | root | No replacement; the token (chip) input is dropped. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
382
+ | `TokenizerProps` | root | No replacement; dropped with `Tokenizer`. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
383
+ | `Toolbar` | `/patterns` | No replacement; the toolbar is dropped. A row of buttons is `Stack direction="row"`. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
384
+ | `ToolbarComponent` | `/patterns` | No replacement; dropped with `Toolbar`. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
385
+ | `TopNav` | `/patterns` | No replacement; the top navigation bar is dropped. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
386
+ | `TopNavProps` | `/patterns` | No replacement; dropped with `TopNav`. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
387
+ | `TreeList` | `/patterns` | No replacement; the tree list is dropped. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
388
+ | `TreeListProps` | `/patterns` | No replacement; dropped with `TreeList`. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
389
+ | `TreeNode` | `/patterns` | No replacement; dropped with `TreeList`. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
390
+
391
+ ### Components folded into a survivor (hds#394 wave 4b)
392
+
393
+ Thirteen components fold into a survivor that hds#393 shipped, so 0.20.0 removes
394
+ them from the root with their props types. Each row gives the survivor and maps
395
+ every prop; `tests/prune-wave-4b-survivors.test.tsx` renders each recipe. No
396
+ consumer imports any of the thirteen, so there is no rewrite codemod: `hds-patterns-subpath --check` reports a named import of one for a
397
+ manual edit and names its survivor ("removed in 0.20.0, use Button iconOnly
398
+ …", from `replaced` in `codemods/removed-0.20.json`). The layout recipes use
399
+ `Box` with `style`, not `sx`, because `sx` injects its rule on the client only
400
+ and server-rendered HTML would lose the layout. Spacing comes from the token
401
+ bridge (`import hds from '@hirobius/design-system/tokens'`): the old `tight`,
402
+ `normal`, `inset` and `spacious` are `hds.semantic.space.scale.sm`, `.md`,
403
+ `.lg` and `.xl`. Their stories, manifest specs, Figma disposition rows and
404
+ staging-promotion entries go with them.
405
+
406
+ StatusDot is not removed. Badge `dot` takes its `tone`, `size` and `label`, but
407
+ a consumer app passes StatusDot a `style`, and Badge takes no `style` (it is className-only, `check-no-style-prop`), so no
408
+ codemod can rewrite that import mechanically. It is deprecated instead, for
409
+ removal in 0.21.0: see [StatusDot is deprecated](#statusdot-is-deprecated-removed-in-0210-hds395).
410
+
411
+ | Removed | Use instead | Codemod |
412
+ | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- |
413
+ | `AspectRatio` | `Box` with `style`: `<Box style={{ aspectRatio: '16 / 9' }}>`. `ratio={r}` becomes `style.aspectRatio` (`String(r)` or `'16 / 9'`). Radix positioned the child absolutely; give it `width: '100%'` and `height: '100%'` instead. | none: no consumer imports it; `hds-patterns-subpath --check` names the survivor |
414
+ | `AspectRatioProps` | `BoxProps` | none: no consumer imports it; `hds-patterns-subpath --check` names the survivor |
415
+ | `Bleed` | `Box` with `style`: ``<Box style={{ marginInline: `calc(-1 * ${hds.semantic.space.scale.md})` }}>``. `amount` becomes the scale step it negated (`tight` sm, `normal` md, `inset` lg, `spacious` xl). `axis="x"` (default) is `marginInline`, `"y"` is `marginBlock`, `"both"` is `margin`. `as`, `className` and `style` are Box's. | none: no consumer imports it; `hds-patterns-subpath --check` names the survivor |
416
+ | `BleedProps` | `BoxProps` | none: no consumer imports it; `hds-patterns-subpath --check` names the survivor |
417
+ | `Center` | `Container` + `Box`: `<Container maxWidth="content">` with `<Box style={{ paddingInline: hds.semantic.space.scale.md }}>` inside for the gutter. `maxWidth` is the same (Center defaulted to `'content'`, Container defaults to `'max'`: pass it). `gutter` becomes the inner Box's `paddingInline` step. For `as` or `ref`, use one `Box` with `style={{ marginInline: 'auto', maxWidth: 'var(--semantic-layout-width-content)' }}`. | none: no consumer imports it; `hds-patterns-subpath --check` names the survivor |
418
+ | `CenterProps` | `ContainerProps` (and `BoxProps` for the gutter) | none: no consumer imports it; `hds-patterns-subpath --check` names the survivor |
419
+ | `CircularProgress` | `<Progress variant="circular">`. `value`, `max`, `size` (sm 16px, md 24px, lg 32px), `tone` and `label` are the same; `indeterminate` becomes leaving `value` out. `label` now defaults to `'Progress'`. | none: no consumer imports it; `hds-patterns-subpath --check` names the survivor |
420
+ | `CircularProgressProps` | `ProgressProps` | none: no consumer imports it; `hds-patterns-subpath --check` names the survivor |
421
+ | `Cluster` | `<Stack direction="row" wrap="wrap" align="center">`. `gap` reads the same steps with the same `tight` default. Pass `align` (Cluster defaulted to `center`, a Stack row to `stretch`). `justify`, `as`, `className`, `style` and `ref` are the same. | none: no consumer imports it; `hds-patterns-subpath --check` names the survivor |
422
+ | `ClusterProps` | `StackProps` | none: no consumer imports it; `hds-patterns-subpath --check` names the survivor |
423
+ | `Cover` | `Box` with `style`: `<Box style={{ display: 'flex', flexDirection: 'column', minHeight: '100svh', gap: hds.semantic.space.scale.md }}>`, with the main region in `<Box style={{ marginBlock: 'auto', width: '100%' }}>`. `minHeight` and `gap` (as a scale step) move into `style`. `header` and `footer` become a `<Box style={{ flexShrink: 0 }}>` before and after the main region, and `centerSlot` or `children` its content. `Stack direction="column"` with `style={{ minHeight }}` is the same shell. | none: no consumer imports it; `hds-patterns-subpath --check` names the survivor |
424
+ | `CoverProps` | `BoxProps` | none: no consumer imports it; `hds-patterns-subpath --check` names the survivor |
425
+ | `Frame` | `Box` with `style`: `<Box style={{ aspectRatio: '16 / 9', overflow: 'hidden', borderRadius: hds.borderRadius.md }}>`. `ratio` becomes `style.aspectRatio`, `radius` becomes `hds.borderRadius.sm`, `.md` (default), `.full` or `[0]` (`none`). Give the media `width: '100%'`, `height: '100%'` and `objectFit: 'cover'`. | none: no consumer imports it; `hds-patterns-subpath --check` names the survivor |
426
+ | `FrameProps` | `BoxProps` | none: no consumer imports it; `hds-patterns-subpath --check` names the survivor |
427
+ | `IconButton` | `<Button iconOnly label="…" iconLeft={<Icon icon={X} size="medium" />} />`. `icon` moves into `iconLeft` as an `Icon`, sized `small`, `medium` or `large` for a `sm`, `md` or `lg` button (`iconSize` is the Icon's `size`, `iconColor` its `color`). `label` or `aria-label` becomes `label`, which names the button. `variant`, `size`, `disabled` and the other button props are the same. | none: no consumer imports it; `hds-patterns-subpath --check` names the survivor |
428
+ | `IconButtonProps` | `ButtonProps` | none: no consumer imports it; `hds-patterns-subpath --check` names the survivor |
429
+ | `InputGroup` | `<Input prefix={…} suffix={…} />`. `leading` becomes `prefix` and `trailing` `suffix`; `size`, `disabled` and the native input props are the same, and `className` is still the outer wrapper's. Input adds `label`, `helperText` and `errorMessage`. | none: no consumer imports it; `hds-patterns-subpath --check` names the survivor |
430
+ | `InputGroupProps` | `InputProps` | none: no consumer imports it; `hds-patterns-subpath --check` names the survivor |
431
+ | `MultiSelector` | `<Combobox multiple options={…} value={…} onChange={…} />`. `options` (`{ value, label }`), `value` (`string[]`), `onChange(next)`, `placeholder`, `disabled` and `className` are the same, and the trigger still reads "N selected". Combobox adds search and a removable chip per value. | none: no consumer imports it; `hds-patterns-subpath --check` names the survivor |
432
+ | `MultiSelectorOption` | `ComboboxOption` | none: no consumer imports it; `hds-patterns-subpath --check` names the survivor |
433
+ | `MultiSelectorProps` | `ComboboxMultipleProps` | none: no consumer imports it; `hds-patterns-subpath --check` names the survivor |
434
+ | `SelectableCard` | `<Card selectable selected={…} onSelectedChange={…}>`. `selected` and `onSelectedChange` are the same. `disabled` becomes `aria-disabled` with no `onSelectedChange`, since the card is a `div` with `role="checkbox"`, not a `button`. `data-state="checked"` becomes `data-selected="true"`. It toggles on click or Space only: Enter no longer toggles it (the ARIA checkbox pattern uses Space), so code or tests that press Enter must press Space. | none: no consumer imports it; `hds-patterns-subpath --check` names the survivor |
435
+ | `SelectableCardProps` | `CardProps` | none: no consumer imports it; `hds-patterns-subpath --check` names the survivor |
436
+ | `TimeInput` | `<Input type="time" />`. `size`, `value` (`HH:mm`), `onChange`, `min`, `max`, `step` and the other native props are the same, and like TimeInput it shows no clear button. Input adds `label`, `helperText` and `errorMessage`. | none: no consumer imports it; `hds-patterns-subpath --check` names the survivor |
437
+ | `TimeInputProps` | `InputProps` | none: no consumer imports it; `hds-patterns-subpath --check` names the survivor |
438
+ | `ToggleButton` | `<Button pressed={…} onPressedChange={…}>`. `pressed`, `defaultPressed`, `onPressedChange`, `size`, `disabled` and `aria-label` are the same, as is `variant="secondary"`; `variant="ghost"` becomes `variant="tertiary"`. `data-state="on"` becomes `data-pressed="true"`. | none: no consumer imports it; `hds-patterns-subpath --check` names the survivor |
439
+ | `ToggleButtonProps` | `ButtonProps` | none: no consumer imports it; `hds-patterns-subpath --check` names the survivor |
440
+
441
+ ### Components a consumer renders, each with a codemod (hds#395 B5)
442
+
443
+ A consumer app imports three names in hds#389's prune set: NotFoundPattern,
444
+ TileGrid and StatusTile. Under the decision update a name a consumer imports
445
+ goes in 0.20.0 once a codemod rewrites every site it has, so each has one:
446
+
447
+ - **NotFoundPattern** took no props and rendered
448
+ `<ErrorPattern displayText="404" message="Page not found" />`. The
449
+ `hds-not-found-pattern` codemod (`codemods/not-found-pattern.mjs`) writes that
450
+ element in its place and imports ErrorPattern from `/patterns`. It joins an
451
+ existing `/patterns` import, reuses an ErrorPattern the file already
452
+ imports, and keeps an alias as the file's name (`NotFoundPattern as Missing`
453
+ becomes `ErrorPattern as Missing`). Attributes the tag already has (`key`)
454
+ stay. A spread, or a `displayText` or `message` NotFoundPattern ignored, is
455
+ left for a manual edit.
456
+ - **TileGrid** folds into `Grid`, which renders its recipe since hds#393:
457
+ `<TileGrid minTileWidth="280px">` becomes
458
+ `<Grid layout="auto-fill" minItemWidth="280px" gap="medium">`. TileGrid's
459
+ `gap="sm"` (12px, its default) is Grid's fixed 12px `medium` step, and
460
+ TileGrid's 260px default width is written out because Grid defaults to
461
+ 280px. An expression width that can be undefined keeps that fallback:
462
+ `minTileWidth={w}` becomes `minItemWidth={w ?? '260px'}`. One that never is
463
+ (a string or template literal, or a conditional whose branches all are) is
464
+ written through as it is, since TypeScript rejects `??` on it (TS2869), and
465
+ one the codemod does not read (a concatenation, a cast) is left for a manual
466
+ edit. The `hds-tile-grid` codemod
467
+ (`codemods/tile-grid.mjs`) makes the rewrite, and the rendered tracks and
468
+ gap are the same as TileGrid's under every tenant and density
469
+ (`scripts/__tests__/grid-tile-grid-parity.test.mjs`, in Chromium, for each
470
+ tag that consumer renders). It leaves for a manual edit `gap="xs"` and `gap="md"`: TileGrid
471
+ fixed them at 8px and 16px, and Grid's nearest steps, `tight` and `normal`,
472
+ tighten to 6px and 12px under compact density. It does the same for a gap
473
+ or spread it cannot read, a self-closing tag (Grid needs children) and an
474
+ import of `TileGridProps`.
475
+ - **StatusTile** is not removed. It leaves the root for `/patterns`
476
+ (hds#389 D5), with `StatusTileProps` and `StatusTileTone`, and
477
+ `hds-patterns-subpath` moves the import like any other `/patterns` name.
478
+
479
+ Both new codemods keep comments and layout, change only imports whose source
480
+ is exactly `@hirobius/design-system`, and change nothing on a second run. A
481
+ file with any use they cannot rewrite (`typeof TileGrid`, a value use, a
482
+ re-export, a namespace or dynamic import that reads the name, or a file they
483
+ cannot read to its end) is left as written, and `--check` exits 1 and lists
484
+ it. That includes JSX text with the bare name in it
485
+ (`<p>Use a TileGrid here</p>`): the codemods read JSX text as code, so they
486
+ stop rather than guess; reword the text or rewrite the file by hand. Their
487
+ stories, manifest specs and Figma disposition rows go with them.
488
+
489
+ | Removed from `@hirobius/design-system` | Use instead | Codemod |
490
+ | -------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------- |
491
+ | `NotFoundPattern` | `<ErrorPattern displayText="404" message="Page not found" />` from `@hirobius/design-system/patterns` | `npx -p @hirobius/design-system@^0.20.0 hds-not-found-pattern --root .` |
492
+ | `TileGrid` | `<Grid layout="auto-fill" minItemWidth="…" gap="medium">` (`minTileWidth` is `minItemWidth`, 260px when unset; `gap="sm"` is `"medium"`) | `npx -p @hirobius/design-system@^0.20.0 hds-tile-grid --root .` |
493
+ | `TileGridProps` | `GridProps` | none: the codemod lists an import of it for a manual edit; no consumer imports it |
494
+ | `StatusTile` | `StatusTile` from `@hirobius/design-system/patterns` | `npx -p @hirobius/design-system@^0.20.0 hds-patterns-subpath --root .` |
495
+ | `StatusTileProps` | `StatusTileProps` from `@hirobius/design-system/patterns` | `npx -p @hirobius/design-system@^0.20.0 hds-patterns-subpath --root .` |
496
+ | `StatusTileTone` | `StatusTileTone` from `@hirobius/design-system/patterns` | `npx -p @hirobius/design-system@^0.20.0 hds-patterns-subpath --root .` |
497
+
498
+ A read-only dry run on 2026-10-01 in that consumer app rewrites:
499
+ `hds-not-found-pattern` 1 file, 1 site; `hds-tile-grid` 2 files, 7 sites (6
500
+ and 1). `hds-patterns-subpath` now moves 12 import sites in the same 11 files:
501
+ one file imports StatusTile in a second statement, next to the one that imports
502
+ Page. With `hds-prefix` that is 14 files, and each codemod's `--check` exits 0
503
+ after the run.
504
+
505
+ ### StatusDot is deprecated (removed in 0.21.0, hds#395)
506
+
507
+ StatusDot stays in 0.20.0 and is deprecated: its JSDoc and StatusDotProps'
508
+ carry `@deprecated` with `@removeIn 0.21.0`, so an editor strikes both
509
+ through, and in a development build it logs one `[HDS deprecation]` console
510
+ warning. Its survivor is `<Badge dot>`: `tone` (all
511
+ six), `size` (`sm`, `md` by default, `lg`) and `label` (a `role="status"` with
512
+ that `aria-label`; decorative without one) are the same, and so is the dot.
513
+
514
+ | Deprecated | Use instead | Codemod |
515
+ | ---------------- | --------------------------------------------- | ------------------------------------------------------------ |
516
+ | `StatusDot` | `<Badge dot tone={…} size={…} label={…} />` | none: a `style` has no Badge mapping, so the edit is by hand |
517
+ | `StatusDotProps` | `BadgeProps` (`dot`, `tone`, `size`, `label`) | none |
518
+
519
+ There is no codemod because Badge takes no `style` (it is className-only,
520
+ `check-no-style-prop`), and a consumer app passes StatusDot one:
521
+ `<StatusDot tone={stateTone(row.state)} style={s.dot} />`, where `s.dot` is
522
+ `{ marginTop: hds.space.px8 }`. Before 0.21.0 it first replaces `style={…}`
523
+ with a wrapper or a `className`, then swaps the component:
524
+
525
+ ```tsx
526
+ // A wrapper. display: flex makes it the dot's height, not a line box's.
527
+ <span style={{ display: 'flex', ...s.dot }}>
528
+ <Badge dot tone={stateTone(row.state)} />
529
+ </span>
530
+
531
+ // Or a class the app owns.
532
+ <Badge dot tone={stateTone(row.state)} className="fleet-audit-dot" />
533
+ ```
534
+
535
+ ### Root `*Variants` helpers become private (hds#394)
536
+
537
+ The root no longer exports any `*Variants` cva helper. Each one still styles
538
+ its own component inside the package; it is just not public API any more, so a
539
+ component's look changes only through its props. No consumer imports one. `hds-patterns-subpath --check` reports an import of one
540
+ for a manual edit. The `/patterns` modules keep their exports, `*Variants`
541
+ included. The helpers of the removed components above are listed in that table.
542
+
543
+ | Removed from `@hirobius/design-system` | Module | Use instead | Codemod |
544
+ | -------------------------------------- | ------------------- | --------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------ |
545
+ | `badgeVariants` | `badge` | No replacement; the cva helper is private to its module. Style through the component's props. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
546
+ | `blockquoteVariants` | `blockquote` | No replacement; the cva helper is private to its module. Style through the component's props. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
547
+ | `buttonVariants` | `button` | No replacement; the cva helper is private to its module. Style through the component's props. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
548
+ | `cardVariants` | `card` | No replacement; the cva helper is private to its module. Style through the component's props. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
549
+ | `circularProgressVariants` | `circular-progress` | No replacement; the cva helper is private to its module. Style through the component's props. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
550
+ | `crumbLabelVariants` | `breadcrumb` | No replacement; the cva helper is private to its module. Style through the component's props. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
551
+ | `disclosureTriggerVariants` | `disclosure` | No replacement; the cva helper is private to its module. Style through the component's props. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
552
+ | `fieldValueVariants` | `field` | No replacement; the cva helper is private to its module. Style through the component's props. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
553
+ | `hdsTimeInputVariants` | `time-input` | No replacement; the cva helper is private to its module. Style through the component's props. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
554
+ | `hdsToggleButtonVariants` | `toggle-button` | No replacement; the cva helper is private to its module. Style through the component's props. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
555
+ | `inlineCodeVariants` | `inline-code` | No replacement; the cva helper is private to its module. Style through the component's props. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
556
+ | `inputVariants` | `input` | No replacement; the cva helper is private to its module. Style through the component's props. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
557
+ | `kbdVariants` | `kbd` | No replacement; the cva helper is private to its module. Style through the component's props. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
558
+ | `metadataListVariants` | `metadata-list` | No replacement; the cva helper is private to its module. Style through the component's props. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
559
+ | `overflowBubbleVariants` | `avatar-group` | No replacement; the cva helper is private to its module. Style through the component's props. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
560
+ | `progressTrackVariants` | `progress` | No replacement; the cva helper is private to its module. Style through the component's props. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
561
+ | `segmentedControlDescriptionVariants` | `segmented-control` | No replacement; the cva helper is private to its module. Style through the component's props. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
562
+ | `segmentedControlFocusRingVariants` | `segmented-control` | No replacement; the cva helper is private to its module. Style through the component's props. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
563
+ | `segmentedControlIndicatorVariants` | `segmented-control` | No replacement; the cva helper is private to its module. Style through the component's props. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
564
+ | `segmentedControlItemVariants` | `segmented-control` | No replacement; the cva helper is private to its module. Style through the component's props. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
565
+ | `segmentedControlLabelVariants` | `segmented-control` | No replacement; the cva helper is private to its module. Style through the component's props. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
566
+ | `segmentedControlRailVariants` | `segmented-control` | No replacement; the cva helper is private to its module. Style through the component's props. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
567
+ | `segmentedControlWrapperVariants` | `segmented-control` | No replacement; the cva helper is private to its module. Style through the component's props. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
568
+ | `selectableCardVariants` | `selectable-card` | No replacement; the cva helper is private to its module. Style through the component's props. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
569
+ | `skeletonVariants` | `skeleton` | No replacement; the cva helper is private to its module. Style through the component's props. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
570
+ | `spinnerVariants` | `spinner` | No replacement; the cva helper is private to its module. Style through the component's props. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
571
+ | `statusDotVariants` | `status-dot` | No replacement; the cva helper is private to its module. Style through the component's props. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
572
+ | `statusListItemDotVariants` | `status-list-item` | No replacement; the cva helper is private to its module. Style through the component's props. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
573
+ | `statVariants` | `stat` | No replacement; the cva helper is private to its module. Style through the component's props. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
574
+ | `surfaceVariants` | `surface` | No replacement; the cva helper is private to its module. Style through the component's props. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
575
+ | `tableDataCellVariants` | `table` | No replacement; the cva helper is private to its module. Style through the component's props. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
576
+ | `tableHeaderCellVariants` | `table` | No replacement; the cva helper is private to its module. Style through the component's props. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
577
+ | `tableSortButtonVariants` | `table` | No replacement; the cva helper is private to its module. Style through the component's props. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
578
+ | `tagButtonVariants` | `tag` | No replacement; the cva helper is private to its module. Style through the component's props. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
579
+ | `tagPillVariants` | `tag` | No replacement; the cva helper is private to its module. Style through the component's props. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
580
+ | `textareaVariants` | `textarea` | No replacement; the cva helper is private to its module. Style through the component's props. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
581
+ | `textVariants` | `text` | No replacement; the cva helper is private to its module. Style through the component's props. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
582
+ | `toastIconVariants` | `toast` | No replacement; the cva helper is private to its module. Style through the component's props. | none: no consumer imports it; `hds-patterns-subpath --check` reports an import |
583
+
584
+ ## 0.21.0 removals (2026-10-07)
585
+
586
+ ADR-014's 2026-10-08 amendment (hds#465) lets a removal ship with a manual step
587
+ when the upgrade command can find every use. StatusDot is the first.
588
+
589
+ ### StatusDot (hds#465)
590
+
591
+ StatusDot and StatusDotProps were deprecated in 0.20.0 with `@removeIn 0.21.0`
592
+ (see [StatusDot is deprecated](#statusdot-is-deprecated-removed-in-0210-hds395)).
593
+ Both are gone from the package root. The last consumer app that used them
594
+ swaps them for Badge in its own repository.
595
+
596
+ | Removed | Use instead | Codemod |
597
+ | ---------------- | --------------------------------------------- | ------------------------------------------------------------ |
598
+ | `StatusDot` | `<Badge dot tone={…} size={…} label={…} />` | none: a `style` has no Badge mapping, so the edit is by hand |
599
+ | `StatusDotProps` | `BadgeProps` (`dot`, `tone`, `size`, `label`) | none |
600
+
601
+ From 0.22.0, `npx @hirobius/design-system@latest upgrade` finds each use by
602
+ import and by JSX tag. Move any `style` to a wrapper or a `className` first,
603
+ as the 0.20.0 section shows.