@hirobius/design-system 0.20.0 → 0.22.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 (130) hide show
  1. package/AGENTS.md +125 -0
  2. package/CHANGELOG.md +969 -0
  3. package/CONSUMING.md +27 -11
  4. package/DESIGN.md +28 -17
  5. package/MIGRATIONS.md +603 -0
  6. package/NOTICE.md +1 -1
  7. package/README.md +39 -5
  8. package/UPGRADING.md +222 -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 +1227 -0
  23. package/dist/chunks/form-By82qZcC.js +66 -0
  24. package/dist/fonts/geist-mono-400.woff2 +0 -0
  25. package/dist/fonts/satoshi-400.woff2 +0 -0
  26. package/dist/fonts/satoshi-500.woff2 +0 -0
  27. package/dist/fonts/satoshi-700.woff2 +0 -0
  28. package/dist/fonts.css +53 -0
  29. package/dist/form.js +1 -1
  30. package/dist/hirobius-ui.js +876 -877
  31. package/dist/manifest.js +3 -3
  32. package/dist/patterns.js +189 -170
  33. package/dist/styles.css +2 -2
  34. package/dist/tokens.css +1 -1
  35. package/dist/tokens.js +136 -57
  36. package/dist/types/src/app/components/alert-dialog.d.ts +5 -0
  37. package/dist/types/src/app/components/alert.d.ts +1 -1
  38. package/dist/types/src/app/components/asset-img.d.ts +1 -0
  39. package/dist/types/src/app/components/avatar-group.d.ts +1 -0
  40. package/dist/types/src/app/components/avatar.d.ts +1 -1
  41. package/dist/types/src/app/components/badge.d.ts +2 -2
  42. package/dist/types/src/app/components/blockquote.d.ts +1 -0
  43. package/dist/types/src/app/components/breadcrumb.d.ts +1 -1
  44. package/dist/types/src/app/components/button.d.ts +3 -1
  45. package/dist/types/src/app/components/callout.d.ts +1 -1
  46. package/dist/types/src/app/components/card.d.ts +4 -3
  47. package/dist/types/src/app/components/checkbox.d.ts +1 -1
  48. package/dist/types/src/app/components/code-block.d.ts +1 -1
  49. package/dist/types/src/app/components/combobox.d.ts +1 -1
  50. package/dist/types/src/app/components/data-table-section.d.ts +1 -0
  51. package/dist/types/src/app/components/destructive-section.d.ts +1 -0
  52. package/dist/types/src/app/components/dialog.d.ts +2 -1
  53. package/dist/types/src/app/components/disclosure.d.ts +1 -1
  54. package/dist/types/src/app/components/divider.d.ts +1 -1
  55. package/dist/types/src/app/components/empty-state.d.ts +1 -1
  56. package/dist/types/src/app/components/error-pattern.d.ts +6 -1
  57. package/dist/types/src/app/components/field.d.ts +1 -1
  58. package/dist/types/src/app/components/form-actions.d.ts +1 -0
  59. package/dist/types/src/app/components/form-control.d.ts +10 -0
  60. package/dist/types/src/app/components/form.d.ts +1 -1
  61. package/dist/types/src/app/components/grid.d.ts +5 -0
  62. package/dist/types/src/app/components/hds-tooltip.d.ts +1 -1
  63. package/dist/types/src/app/components/icon.d.ts +1 -0
  64. package/dist/types/src/app/components/inline-link.d.ts +1 -1
  65. package/dist/types/src/app/components/input.d.ts +1 -1
  66. package/dist/types/src/app/components/kbd.d.ts +1 -0
  67. package/dist/types/src/app/components/menu.d.ts +1 -1
  68. package/dist/types/src/app/components/metadata-list.d.ts +1 -0
  69. package/dist/types/src/app/components/metric-tiles.d.ts +1 -0
  70. package/dist/types/src/app/components/pagination.d.ts +1 -1
  71. package/dist/types/src/app/components/popover.d.ts +1 -1
  72. package/dist/types/src/app/components/progress.d.ts +2 -2
  73. package/dist/types/src/app/components/radio.d.ts +1 -1
  74. package/dist/types/src/app/components/select.d.ts +1 -1
  75. package/dist/types/src/app/components/skeleton.d.ts +2 -2
  76. package/dist/types/src/app/components/slider.d.ts +1 -1
  77. package/dist/types/src/app/components/spinner.d.ts +1 -1
  78. package/dist/types/src/app/components/stat.d.ts +5 -4
  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 +4 -3
  81. package/dist/types/src/app/components/table.d.ts +6 -1
  82. package/dist/types/src/app/components/tabs.d.ts +1 -1
  83. package/dist/types/src/app/components/tag.d.ts +1 -1
  84. package/dist/types/src/app/components/text.d.ts +53 -6
  85. package/dist/types/src/app/components/textarea.d.ts +1 -1
  86. package/dist/types/src/app/components/timestamp.d.ts +1 -0
  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/data/manifest-types.d.ts +4 -0
  90. package/dist/types/src/app/design-system/generated-token-refs.d.ts +37 -28
  91. package/dist/types/src/app/design-system/generated-token-values.d.ts +3 -0
  92. package/dist/types/src/app/design-system/tokens.d.ts +117 -15
  93. package/dist/types/src/index.d.ts +122 -72
  94. package/dist/variables.css +41 -33
  95. package/docs/CONSUMING.md +63 -39
  96. package/hirobius.tokens.json +163 -112
  97. package/llms.txt +158 -50
  98. package/mcp/catalog.mjs +369 -0
  99. package/mcp/core-set.mjs +66 -0
  100. package/mcp/guide.mjs +272 -0
  101. package/mcp/hds-mcp.mjs +49 -0
  102. package/mcp/server.mjs +94 -0
  103. package/package.json +53 -11
  104. package/public/hds-manifest.json +430 -336
  105. package/public/llms/components.txt +4 -3
  106. package/public/llms/layout.txt +1 -1
  107. package/public/llms-full.txt +190 -70
  108. package/public/llms.txt +158 -50
  109. package/scripts/eslint-plugin-hds/index.d.mts +29 -0
  110. package/scripts/eslint-plugin-hds/index.mjs +55 -0
  111. package/scripts/eslint-plugin-hds/package.json +30 -0
  112. package/scripts/eslint-plugin-hds/rules/no-raw-controls.mjs +47 -0
  113. package/scripts/eslint-plugin-hds/rules/no-raw-hex.mjs +70 -0
  114. package/scripts/eslint-plugin-hds/rules/no-raw-px-spacing.mjs +125 -0
  115. package/scripts/eslint-plugin-hds/rules/prefer-hds-layout-primitive.mjs +54 -0
  116. package/scripts/eslint-plugin-hds/rules/sx-token-first.mjs +111 -0
  117. package/scripts/eslint-plugin-hds/rules/utils.mjs +66 -0
  118. package/src/app/data/component-api.json +154 -93
  119. package/upgrade/index.json +208 -0
  120. package/upgrade/releases/0.17.0.json +962 -0
  121. package/upgrade/releases/0.18.0.json +8 -0
  122. package/upgrade/releases/0.19.0.json +233 -0
  123. package/upgrade/releases/0.19.1.json +8 -0
  124. package/upgrade/releases/0.20.0.json +5108 -0
  125. package/upgrade/releases/0.21.0.json +538 -0
  126. package/upgrade/releases/0.22.0.json +94 -0
  127. package/upgrade/schema.json +989 -0
  128. package/dist/chunks/empty-state-BBqhCx0S.js +0 -1217
  129. package/dist/chunks/form-COP3vK9_.js +0 -66
  130. package/dist/types/src/app/components/status-dot.d.ts +0 -39
@@ -0,0 +1,538 @@
1
+ {
2
+ "version": "0.21.0",
3
+ "date": "2026-10-07",
4
+ "bump": "minor",
5
+ "summary": "StatusDot is removed, fonts move to an opt-in fonts.css, the type ramp is cut to 5 roles; AGENTS.md, hds-mcp and the ESLint plugin ship.",
6
+ "backfilled": true,
7
+ "steps": [
8
+ {
9
+ "id": "0.21.0/removed/--semantic-typography-eyebrow-text-transform",
10
+ "kind": "removed",
11
+ "impact": "look",
12
+ "plain": "The CSS variable --semantic-typography-eyebrow-text-transform is gone, so set text-transform: uppercase yourself where a label must stay uppercase.",
13
+ "detect": {
14
+ "cssVars": [
15
+ "--semantic-typography-eyebrow-text-transform"
16
+ ]
17
+ },
18
+ "source": "CHANGELOG.md:41"
19
+ },
20
+ {
21
+ "id": "0.21.0/removed/StatusDot",
22
+ "kind": "removed",
23
+ "impact": "breaking",
24
+ "plain": "StatusDot and StatusDotProps are removed, so replace each <StatusDot tone size label> with <Badge dot tone size label> (BadgeProps for the type), moving any style to a wrapper element or a className first.",
25
+ "detect": {
26
+ "imports": [
27
+ {
28
+ "from": "@hirobius/design-system",
29
+ "names": [
30
+ "StatusDot",
31
+ "StatusDotProps"
32
+ ]
33
+ }
34
+ ],
35
+ "jsx": [
36
+ "StatusDot"
37
+ ]
38
+ },
39
+ "facts": [
40
+ "removed:.:StatusDot",
41
+ "removed:.:StatusDotProps"
42
+ ],
43
+ "source": "CHANGELOG.md:40"
44
+ },
45
+ {
46
+ "id": "0.21.0/deprecated/Text-variants",
47
+ "kind": "deprecated",
48
+ "impact": "none",
49
+ "plain": "The Text variants heading1, heading2, heading3, technical, eyebrow, badge, docLede, docBody, docSmall and docCode still work but are deprecated; use title, mono, caption, body or ui instead.",
50
+ "detect": {
51
+ "regex": [
52
+ "<Text\\b[^>]*\\bvariant=\\{?\\s*[\"'](?:heading[123]|technical|eyebrow|badge|docLede|docBody|docSmall|docCode)[\"']"
53
+ ]
54
+ },
55
+ "removeIn": "1.0.0",
56
+ "facts": [
57
+ "added:.:TextVariant"
58
+ ],
59
+ "source": "CHANGELOG.md:41"
60
+ },
61
+ {
62
+ "id": "0.21.0/deprecated/typeStyles-aliases",
63
+ "kind": "deprecated",
64
+ "impact": "none",
65
+ "plain": "The hds.typeStyles keys from before the ramp (h1 to h3, heading1 to heading3, eyebrow, badge, micro, technical, small, label and the rest) and hds.semantic.typography label, labelDescriptive and labelTechnical still work but are deprecated; use display, title, body, ui, caption or mono instead.",
66
+ "detect": {
67
+ "regex": [
68
+ "\\btypeStyles\\.(?:h[123]|heading[123]|headingHero|headingSection|display[12]|displayXl|body2|bodyLarge|small|bodySmall|label|labelDescriptive|labelTechnical|eyebrow|badge|micro|technical|monoXs|monoSm)\\b",
69
+ "\\bsemantic\\.typography\\.(?:label|labelDescriptive|labelTechnical)\\b"
70
+ ]
71
+ },
72
+ "removeIn": "1.0.0",
73
+ "source": "CHANGELOG.md:41"
74
+ },
75
+ {
76
+ "id": "0.21.0/look/AssetImg-fallback",
77
+ "kind": "look",
78
+ "impact": "look",
79
+ "plain": "AssetImg without a src now shows a fallback that fits its container.",
80
+ "detect": {
81
+ "imports": [
82
+ {
83
+ "from": "@hirobius/design-system/patterns",
84
+ "names": [
85
+ "AssetImg"
86
+ ]
87
+ }
88
+ ],
89
+ "jsx": [
90
+ "AssetImg"
91
+ ]
92
+ },
93
+ "source": "CHANGELOG.md:15"
94
+ },
95
+ {
96
+ "id": "0.21.0/look/Button-pressed",
97
+ "kind": "look",
98
+ "impact": "look",
99
+ "plain": "A pressed toggle Button now fills with the accent surface, so it reads as on.",
100
+ "detect": {
101
+ "regex": [
102
+ "<Button\\b[^>]*\\bpressed\\b"
103
+ ]
104
+ },
105
+ "source": "CHANGELOG.md:15"
106
+ },
107
+ {
108
+ "id": "0.21.0/look/Card-Surface-StatusTile-height",
109
+ "kind": "look",
110
+ "impact": "look",
111
+ "plain": "Card, Surface and StatusTile no longer fill their parent's height, so give the parent a stretching layout (Grid align=\"stretch\") where one must fill it.",
112
+ "detect": {
113
+ "jsx": [
114
+ "Card",
115
+ "Surface",
116
+ "StatusTile"
117
+ ]
118
+ },
119
+ "source": "CHANGELOG.md:15"
120
+ },
121
+ {
122
+ "id": "0.21.0/look/CodeBlock-padding",
123
+ "kind": "look",
124
+ "impact": "look",
125
+ "plain": "CodeBlock pads its code 16px instead of 80px.",
126
+ "detect": {
127
+ "imports": [
128
+ {
129
+ "from": "@hirobius/design-system/patterns",
130
+ "names": [
131
+ "CodeBlock"
132
+ ]
133
+ }
134
+ ],
135
+ "jsx": [
136
+ "CodeBlock"
137
+ ]
138
+ },
139
+ "source": "CHANGELOG.md:15"
140
+ },
141
+ {
142
+ "id": "0.21.0/look/Dialog-margin",
143
+ "kind": "look",
144
+ "impact": "look",
145
+ "plain": "Dialog and AlertDialog now keep a 16px margin from the screen edge and scroll inside when taller than the screen.",
146
+ "detect": {
147
+ "jsx": [
148
+ "Dialog",
149
+ "AlertDialog"
150
+ ]
151
+ },
152
+ "source": "CHANGELOG.md:15"
153
+ },
154
+ {
155
+ "id": "0.21.0/look/Disclosure-card",
156
+ "kind": "look",
157
+ "impact": "look",
158
+ "plain": "Disclosure variant=\"card\" no longer clips its content or leaves empty space when closed.",
159
+ "detect": {
160
+ "jsx": [
161
+ "Disclosure"
162
+ ]
163
+ },
164
+ "source": "CHANGELOG.md:15"
165
+ },
166
+ {
167
+ "id": "0.21.0/look/Divider-vertical",
168
+ "kind": "look",
169
+ "impact": "look",
170
+ "plain": "A vertical Divider now stretches across its row without needing a parent height.",
171
+ "detect": {
172
+ "regex": [
173
+ "<Divider\\b[^>]*\\borientation=\\{?\\s*[\"']vertical[\"']"
174
+ ]
175
+ },
176
+ "source": "CHANGELOG.md:15"
177
+ },
178
+ {
179
+ "id": "0.21.0/look/ErrorPattern-fullPage",
180
+ "kind": "look",
181
+ "impact": "look",
182
+ "plain": "ErrorPattern now fits its container instead of filling the viewport height, so pass fullPage where it is a whole error page.",
183
+ "detect": {
184
+ "imports": [
185
+ {
186
+ "from": "@hirobius/design-system/patterns",
187
+ "names": [
188
+ "ErrorPattern"
189
+ ]
190
+ }
191
+ ],
192
+ "jsx": [
193
+ "ErrorPattern"
194
+ ]
195
+ },
196
+ "source": "CHANGELOG.md:15"
197
+ },
198
+ {
199
+ "id": "0.21.0/look/FormActions-primary",
200
+ "kind": "look",
201
+ "impact": "look",
202
+ "plain": "A Button with no variant in FormActions primary now renders as primary, so pass variant where you want another style there.",
203
+ "detect": {
204
+ "imports": [
205
+ {
206
+ "from": "@hirobius/design-system/patterns",
207
+ "names": [
208
+ "FormActions"
209
+ ]
210
+ }
211
+ ],
212
+ "jsx": [
213
+ "FormActions"
214
+ ]
215
+ },
216
+ "source": "CHANGELOG.md:15"
217
+ },
218
+ {
219
+ "id": "0.21.0/look/Grid-align-start",
220
+ "kind": "look",
221
+ "impact": "look",
222
+ "plain": "Grid now aligns its items to the start and Grid.Item no longer sets height: 100%, so pass align=\"stretch\" to a Grid whose Cards, Surfaces or StatusTiles must share one height.",
223
+ "detect": {
224
+ "imports": [
225
+ {
226
+ "from": "@hirobius/design-system",
227
+ "names": [
228
+ "Grid"
229
+ ]
230
+ }
231
+ ],
232
+ "jsx": [
233
+ "Grid",
234
+ "Grid.Item"
235
+ ]
236
+ },
237
+ "source": "CHANGELOG.md:15"
238
+ },
239
+ {
240
+ "id": "0.21.0/look/MetadataList-horizontal",
241
+ "kind": "look",
242
+ "impact": "look",
243
+ "plain": "A horizontal MetadataList now sizes its term column to its content.",
244
+ "detect": {
245
+ "jsx": [
246
+ "MetadataList"
247
+ ]
248
+ },
249
+ "source": "CHANGELOG.md:15"
250
+ },
251
+ {
252
+ "id": "0.21.0/look/Progress-fill",
253
+ "kind": "look",
254
+ "impact": "look",
255
+ "plain": "Progress now shows its neutral fill on a visible track, and its sm bar is 6px tall.",
256
+ "detect": {
257
+ "jsx": [
258
+ "Progress"
259
+ ]
260
+ },
261
+ "source": "CHANGELOG.md:15"
262
+ },
263
+ {
264
+ "id": "0.21.0/look/SegmentedControl-hug",
265
+ "kind": "look",
266
+ "impact": "look",
267
+ "plain": "SegmentedControl md segments now hug their labels in a 40px rail (sm 32px), so every segment shows instead of one filling the rail.",
268
+ "detect": {
269
+ "jsx": [
270
+ "SegmentedControl"
271
+ ]
272
+ },
273
+ "source": "CHANGELOG.md:15"
274
+ },
275
+ {
276
+ "id": "0.21.0/look/Select-matches-Input",
277
+ "kind": "look",
278
+ "impact": "look",
279
+ "plain": "Select now matches Input (40px tall, 44px on small screens, the same fill and an up-down chevron), and the built-in labels of Input, Textarea and Select are 14px like a FormField label.",
280
+ "detect": {
281
+ "jsx": [
282
+ "Select",
283
+ "Input",
284
+ "Textarea"
285
+ ]
286
+ },
287
+ "source": "CHANGELOG.md:15"
288
+ },
289
+ {
290
+ "id": "0.21.0/look/Skeleton-rectangular",
291
+ "kind": "look",
292
+ "impact": "look",
293
+ "plain": "A rectangular Skeleton is now 5rem tall by default and uses the sunken surface fill, so it shows on a Card.",
294
+ "detect": {
295
+ "jsx": [
296
+ "Skeleton"
297
+ ]
298
+ },
299
+ "source": "CHANGELOG.md:15"
300
+ },
301
+ {
302
+ "id": "0.21.0/look/Slider-track",
303
+ "kind": "look",
304
+ "impact": "look",
305
+ "plain": "Slider's track is now an 8px bar with a visible fill instead of a padded 48px slab.",
306
+ "detect": {
307
+ "jsx": [
308
+ "Slider"
309
+ ]
310
+ },
311
+ "source": "CHANGELOG.md:15"
312
+ },
313
+ {
314
+ "id": "0.21.0/look/Stat-align",
315
+ "kind": "look",
316
+ "impact": "look",
317
+ "plain": "Stat now aligns its content to the start.",
318
+ "detect": {
319
+ "jsx": [
320
+ "Stat"
321
+ ]
322
+ },
323
+ "source": "CHANGELOG.md:15"
324
+ },
325
+ {
326
+ "id": "0.21.0/look/Table-flush",
327
+ "kind": "look",
328
+ "impact": "look",
329
+ "plain": "Table no longer pads its scroll region by default, so pass flush={false} where you want the old inset back.",
330
+ "detect": {
331
+ "jsx": [
332
+ "Table"
333
+ ]
334
+ },
335
+ "source": "CHANGELOG.md:15"
336
+ },
337
+ {
338
+ "id": "0.21.0/look/control-rows",
339
+ "kind": "look",
340
+ "impact": "look",
341
+ "plain": "Checkbox, Radio and Toggle rows now share one inset and height.",
342
+ "detect": {
343
+ "jsx": [
344
+ "Checkbox",
345
+ "Radio",
346
+ "Toggle"
347
+ ]
348
+ },
349
+ "source": "CHANGELOG.md:15"
350
+ },
351
+ {
352
+ "id": "0.21.0/look/form-control-width",
353
+ "kind": "look",
354
+ "impact": "look",
355
+ "plain": "Input, Textarea, Select, Combobox and Slider are now at most 40rem wide, so set --hds-form-control-max-width or add max-w-none to the control's className where one must be wider.",
356
+ "detect": {
357
+ "jsx": [
358
+ "Input",
359
+ "Textarea",
360
+ "Select",
361
+ "Combobox",
362
+ "Slider"
363
+ ]
364
+ },
365
+ "source": "CHANGELOG.md:15"
366
+ },
367
+ {
368
+ "id": "0.21.0/look/touch-targets",
369
+ "kind": "look",
370
+ "impact": "look",
371
+ "plain": "On touch screens, Checkbox, Radio and Toggle rows, the Pagination page buttons and the CodeBlock copy button are now at least 44px tall.",
372
+ "detect": {
373
+ "jsx": [
374
+ "Checkbox",
375
+ "Radio",
376
+ "Toggle",
377
+ "Pagination",
378
+ "CodeBlock"
379
+ ]
380
+ },
381
+ "source": "CHANGELOG.md:15"
382
+ },
383
+ {
384
+ "id": "0.21.0/look/type-ramp",
385
+ "kind": "look",
386
+ "impact": "look",
387
+ "plain": "Headings (h1 to h3, heading1 to heading3) now render at 24px, display at 48px, body at 16px with 1.6 leading and mono at 13px, and eyebrow, badge and micro text is no longer uppercase.",
388
+ "detect": {
389
+ "jsx": [
390
+ "Text"
391
+ ],
392
+ "regex": [
393
+ "\\btypeStyles\\b",
394
+ "var\\(\\s*--semantic-typography-"
395
+ ]
396
+ },
397
+ "source": "CHANGELOG.md:41"
398
+ },
399
+ {
400
+ "id": "0.21.0/behavior/Alert-role",
401
+ "kind": "behavior",
402
+ "impact": "behavior",
403
+ "plain": "An info or success Alert now has role=\"status\" instead of role=\"alert\", so tests that find it by role must look for status.",
404
+ "detect": {
405
+ "jsx": [
406
+ "Alert"
407
+ ]
408
+ },
409
+ "source": "CHANGELOG.md:15"
410
+ },
411
+ {
412
+ "id": "0.21.0/behavior/Badge-dot-role",
413
+ "kind": "behavior",
414
+ "impact": "behavior",
415
+ "plain": "A labelled dot Badge now has role=\"img\" instead of role=\"status\", so tests that find it by role must look for img.",
416
+ "detect": {
417
+ "regex": [
418
+ "<Badge\\b[^>]*\\bdot\\b"
419
+ ]
420
+ },
421
+ "source": "CHANGELOG.md:15"
422
+ },
423
+ {
424
+ "id": "0.21.0/behavior/Badge-label-warning",
425
+ "kind": "behavior",
426
+ "impact": "none",
427
+ "plain": "A Badge with label but no dot now warns once in development, because label only names a dot badge, so put the text in children instead.",
428
+ "detect": {
429
+ "regex": [
430
+ "<Badge\\b(?![^>]*\\bdot\\b)[^>]*\\blabel="
431
+ ]
432
+ },
433
+ "source": "CHANGELOG.md:15"
434
+ },
435
+ {
436
+ "id": "0.21.0/behavior/Button-Card-tone-className",
437
+ "kind": "behavior",
438
+ "impact": "behavior",
439
+ "plain": "A className on Button or Card can now override the colours a tone sets, so check any toned Button or Card that also passes colour classes.",
440
+ "detect": {
441
+ "regex": [
442
+ "<(?:Button|Card)\\b(?=[^>]*\\btone=)(?=[^>]*\\bclassName=)"
443
+ ]
444
+ },
445
+ "source": "CHANGELOG.md:53"
446
+ },
447
+ {
448
+ "id": "0.21.0/behavior/Combobox-focus",
449
+ "kind": "behavior",
450
+ "impact": "behavior",
451
+ "plain": "Combobox now returns focus to its trigger after Escape or a pick.",
452
+ "detect": {
453
+ "jsx": [
454
+ "Combobox"
455
+ ]
456
+ },
457
+ "source": "CHANGELOG.md:15"
458
+ },
459
+ {
460
+ "id": "0.21.0/behavior/Toggle-role-switch",
461
+ "kind": "behavior",
462
+ "impact": "behavior",
463
+ "plain": "Toggle's input now has role=\"switch\", so tests that find it by role checkbox must look for switch.",
464
+ "detect": {
465
+ "jsx": [
466
+ "Toggle"
467
+ ]
468
+ },
469
+ "source": "CHANGELOG.md:15"
470
+ },
471
+ {
472
+ "id": "0.21.0/behavior/eslint-no-raw-controls",
473
+ "kind": "behavior",
474
+ "impact": "breaking",
475
+ "plain": "The HDS ESLint plugin's recommended config now fails raw <button>, <input>, <select>, <textarea> and <form> (hds/no-raw-controls), so use Button, Input, Select, Textarea and Form instead or set the rule to 'off'.",
476
+ "detect": {
477
+ "bareImports": [
478
+ "@hirobius/eslint-plugin-hds"
479
+ ]
480
+ },
481
+ "source": "CHANGELOG.md:7"
482
+ },
483
+ {
484
+ "id": "0.21.0/behavior/one-tab-stop",
485
+ "kind": "behavior",
486
+ "impact": "behavior",
487
+ "plain": "Checkbox, Radio and Toggle now take one tab stop each instead of two, so keyboard tests that press Tab twice per control must press it once.",
488
+ "detect": {
489
+ "jsx": [
490
+ "Checkbox",
491
+ "Radio",
492
+ "Toggle"
493
+ ]
494
+ },
495
+ "source": "CHANGELOG.md:15"
496
+ },
497
+ {
498
+ "id": "0.21.0/exports/./eslint-plugin",
499
+ "kind": "exports",
500
+ "impact": "additive",
501
+ "plain": "The ESLint plugin now ships in the package, so import hds from '@hirobius/design-system/eslint-plugin' and drop the separate @hirobius/eslint-plugin-hds dependency.",
502
+ "detect": {
503
+ "bareImports": [
504
+ "@hirobius/eslint-plugin-hds"
505
+ ]
506
+ },
507
+ "done": {
508
+ "regex": [
509
+ "@hirobius/design-system/eslint-plugin['\"]"
510
+ ]
511
+ },
512
+ "facts": [
513
+ "exports-key-added:./eslint-plugin"
514
+ ],
515
+ "source": "CHANGELOG.md:7"
516
+ },
517
+ {
518
+ "id": "0.21.0/manual/fonts-css",
519
+ "kind": "manual",
520
+ "impact": "look",
521
+ "plain": "Add import '@hirobius/design-system/fonts.css' next to your tokens.css or styles.css import, or text renders in the system font instead of Satoshi and Geist Mono.",
522
+ "detect": {
523
+ "regex": [
524
+ "@hirobius/design-system/(?:tokens|styles)\\.css['\"]"
525
+ ]
526
+ },
527
+ "done": {
528
+ "regex": [
529
+ "@hirobius/design-system/fonts\\.css['\"]"
530
+ ]
531
+ },
532
+ "facts": [
533
+ "exports-key-added:./fonts.css"
534
+ ],
535
+ "source": "CHANGELOG.md:28"
536
+ }
537
+ ]
538
+ }
@@ -0,0 +1,94 @@
1
+ {
2
+ "version": "0.22.0",
3
+ "date": "2026-10-08",
4
+ "bump": "minor",
5
+ "summary": "3 changes to make by hand (1 breaking), 1 that looks different and 2 deprecations.",
6
+ "backfilled": false,
7
+ "steps": [
8
+ {
9
+ "id": "0.22.0/deprecated/Divider.strong",
10
+ "kind": "deprecated",
11
+ "impact": "none",
12
+ "plain": "Divider's strong prop, deprecated since before 0.16.0, still works; use variant=\"strong\" instead.",
13
+ "detect": {
14
+ "regex": [
15
+ "<Divider\\b[^>]*\\sstrong\\b"
16
+ ]
17
+ },
18
+ "removeIn": "1.0.0",
19
+ "source": "CHANGELOG.md:26"
20
+ },
21
+ {
22
+ "id": "0.22.0/deprecated/InlineCode.compact",
23
+ "kind": "deprecated",
24
+ "impact": "none",
25
+ "plain": "InlineCode's compact prop, deprecated since before 0.16.0, still works; use density=\"compact\" instead.",
26
+ "detect": {
27
+ "regex": [
28
+ "<InlineCode\\b[^>]*\\scompact\\b"
29
+ ]
30
+ },
31
+ "removeIn": "1.0.0",
32
+ "source": "CHANGELOG.md:26"
33
+ },
34
+ {
35
+ "id": "0.22.0/value-changed/manifest-figma-file-key",
36
+ "kind": "value-changed",
37
+ "impact": "behavior",
38
+ "plain": "The figmaUrl of each component in the ./manifest export (public/hds-manifest.json) now points at file 2VgBbVpKiDnu0aftJEVyBQ, \"HDS Tokens & Components\"; node ids are unchanged, so a stored link needs only the new file key.",
39
+ "detect": {
40
+ "regex": [
41
+ "\\bfigmaUrl\\b"
42
+ ]
43
+ },
44
+ "source": "CHANGELOG.md:24"
45
+ },
46
+ {
47
+ "id": "0.22.0/value-changed/tokens-json-dtcg",
48
+ "kind": "value-changed",
49
+ "impact": "breaking",
50
+ "plain": "The raw tokens (the tokens export and hirobius.tokens.json) are strict DTCG now, so read semantic.motion.*.$value.timingFunction instead of .easing, and the elastic spring and each semantic.elevation level from $extensions[\"com.hirobius.hds\"].$value.",
51
+ "detect": {
52
+ "imports": [
53
+ {
54
+ "from": "@hirobius/design-system",
55
+ "names": [
56
+ "tokens"
57
+ ]
58
+ }
59
+ ],
60
+ "regex": [
61
+ "hirobius\\.tokens\\.json"
62
+ ]
63
+ },
64
+ "source": "CHANGELOG.md:19"
65
+ },
66
+ {
67
+ "id": "0.22.0/look/component-tag-lineHeight",
68
+ "kind": "look",
69
+ "impact": "look",
70
+ "plain": "--component-tag-lineHeight is now 1.5 instead of an invalid value the browser ignored, so text that reads it gets that line height.",
71
+ "detect": {
72
+ "cssVars": [
73
+ "--component-tag-lineHeight"
74
+ ],
75
+ "regex": [
76
+ "\\bcomponent\\.tag\\.lineHeight\\b"
77
+ ]
78
+ },
79
+ "source": "CHANGELOG.md:19"
80
+ },
81
+ {
82
+ "id": "0.22.0/behavior/hds-mcp-core-flag",
83
+ "kind": "behavior",
84
+ "impact": "behavior",
85
+ "plain": "The hds-mcp get_component tool now marks core: true only on the 43 ratified core components and recommended: true on the wider set AGENTS.md recommends, and list_core names its set, so read recommended where you relied on core for that wider set.",
86
+ "detect": {
87
+ "regex": [
88
+ "\\bhds-mcp\\b"
89
+ ]
90
+ },
91
+ "source": "CHANGELOG.md:23"
92
+ }
93
+ ]
94
+ }