@hjmds/react 1.7.0 → 1.9.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 (96) hide show
  1. package/README.md +21 -0
  2. package/THIRD_PARTY_NOTICES.md +57 -0
  3. package/dist/advanced-display.d.ts +3 -1
  4. package/dist/advanced-display.d.ts.map +1 -1
  5. package/dist/advanced-display.js +2 -2
  6. package/dist/advanced-display.js.map +1 -1
  7. package/dist/affix.d.ts +10 -0
  8. package/dist/affix.d.ts.map +1 -0
  9. package/dist/affix.js +51 -0
  10. package/dist/affix.js.map +1 -0
  11. package/dist/carousel-motion.d.ts +13 -0
  12. package/dist/carousel-motion.d.ts.map +1 -0
  13. package/dist/carousel-motion.js +35 -0
  14. package/dist/carousel-motion.js.map +1 -0
  15. package/dist/celebration.d.ts +8 -0
  16. package/dist/celebration.d.ts.map +1 -0
  17. package/dist/celebration.js +51 -0
  18. package/dist/celebration.js.map +1 -0
  19. package/dist/color-picker.d.ts +18 -0
  20. package/dist/color-picker.d.ts.map +1 -0
  21. package/dist/color-picker.js +40 -0
  22. package/dist/color-picker.js.map +1 -0
  23. package/dist/content-transition.d.ts +18 -0
  24. package/dist/content-transition.d.ts.map +1 -0
  25. package/dist/content-transition.js +33 -0
  26. package/dist/content-transition.js.map +1 -0
  27. package/dist/context-menu.d.ts.map +1 -1
  28. package/dist/context-menu.js +36 -9
  29. package/dist/context-menu.js.map +1 -1
  30. package/dist/date-picker.d.ts.map +1 -1
  31. package/dist/date-picker.js +39 -1
  32. package/dist/date-picker.js.map +1 -1
  33. package/dist/evidence.d.ts +106 -2
  34. package/dist/evidence.d.ts.map +1 -1
  35. package/dist/evidence.js +136 -64
  36. package/dist/evidence.js.map +1 -1
  37. package/dist/layout.d.ts.map +1 -1
  38. package/dist/layout.js +3 -2
  39. package/dist/layout.js.map +1 -1
  40. package/dist/masonry.d.ts +14 -0
  41. package/dist/masonry.d.ts.map +1 -0
  42. package/dist/masonry.js +13 -0
  43. package/dist/masonry.js.map +1 -0
  44. package/dist/menu-morph.d.ts +12 -0
  45. package/dist/menu-morph.d.ts.map +1 -0
  46. package/dist/menu-morph.js +80 -0
  47. package/dist/menu-morph.js.map +1 -0
  48. package/dist/menubar.d.ts.map +1 -1
  49. package/dist/menubar.js +24 -15
  50. package/dist/menubar.js.map +1 -1
  51. package/dist/modal.d.ts +1 -0
  52. package/dist/modal.d.ts.map +1 -1
  53. package/dist/modal.js.map +1 -1
  54. package/dist/navigation.d.ts.map +1 -1
  55. package/dist/navigation.js +13 -1
  56. package/dist/navigation.js.map +1 -1
  57. package/dist/overlays.d.ts.map +1 -1
  58. package/dist/overlays.js +33 -2
  59. package/dist/overlays.js.map +1 -1
  60. package/dist/qr-code.d.ts +11 -0
  61. package/dist/qr-code.d.ts.map +1 -0
  62. package/dist/qr-code.js +14 -0
  63. package/dist/qr-code.js.map +1 -0
  64. package/dist/sortable.d.ts +14 -0
  65. package/dist/sortable.d.ts.map +1 -0
  66. package/dist/sortable.js +87 -0
  67. package/dist/sortable.js.map +1 -0
  68. package/dist/statistic-motion.d.ts +12 -0
  69. package/dist/statistic-motion.d.ts.map +1 -0
  70. package/dist/statistic-motion.js +23 -0
  71. package/dist/statistic-motion.js.map +1 -0
  72. package/dist/styles.css +166 -134
  73. package/dist/styles.layered.css +166 -134
  74. package/dist/swipe-actions.d.ts +13 -0
  75. package/dist/swipe-actions.d.ts.map +1 -0
  76. package/dist/swipe-actions.js +25 -0
  77. package/dist/swipe-actions.js.map +1 -0
  78. package/dist/theme.d.ts.map +1 -1
  79. package/dist/theme.js +2 -1
  80. package/dist/theme.js.map +1 -1
  81. package/dist/thinking-orb.d.ts +9 -0
  82. package/dist/thinking-orb.d.ts.map +1 -0
  83. package/dist/thinking-orb.js +86 -0
  84. package/dist/thinking-orb.js.map +1 -0
  85. package/dist/tree.d.ts.map +1 -1
  86. package/dist/tree.js +14 -3
  87. package/dist/tree.js.map +1 -1
  88. package/dist/virtual-list.d.ts +14 -0
  89. package/dist/virtual-list.d.ts.map +1 -0
  90. package/dist/virtual-list.js +48 -0
  91. package/dist/virtual-list.js.map +1 -0
  92. package/dist/watermark.d.ts +12 -0
  93. package/dist/watermark.d.ts.map +1 -0
  94. package/dist/watermark.js +10 -0
  95. package/dist/watermark.js.map +1 -0
  96. package/package.json +122 -5
package/dist/styles.css CHANGED
@@ -1,3 +1,4 @@
1
+ /* Broad neutral and pale-brand surfaces use the theme canvas. Selection stays visible through borders; primary actions and compact state marks retain their semantic fills. */
1
2
  .hjm-root,
2
3
  .hjm-root *,
3
4
  .hjm-root *::before,
@@ -70,14 +71,14 @@
70
71
  overflow-wrap: anywhere;
71
72
  border: 1px solid transparent;
72
73
  border-radius: var(--hjm-radius-lg);
73
- background: var(--hjm-color-surface);
74
+ background: var(--hjm-color-bg);
74
75
  }
75
76
  /* A child image would otherwise spill past the rounded corner. An elevated tone
76
77
  opts out because clipping cuts off its own shadow. */
77
78
  .hjm-surface[data-clips="true"] { overflow: hidden; }
78
79
  .hjm-surface[data-tone="raised"] { background: var(--hjm-color-bg); box-shadow: 0 4px 12px rgb(0 0 0 / 12%); }
79
- .hjm-surface[data-tone="accent"] { background: var(--hjm-color-surface-accent); }
80
- .hjm-surface[data-tone="sunken"] { background: var(--hjm-color-surface-alt); }
80
+ .hjm-surface[data-tone="accent"] { background: var(--hjm-color-bg); }
81
+ .hjm-surface[data-tone="sunken"] { background: var(--hjm-color-bg); }
81
82
  .hjm-surface[data-tone="subtle"] { background: var(--hjm-color-bg); }
82
83
  .hjm-surface[data-bordered="true"] { border-color: var(--hjm-color-border); }
83
84
  .hjm-surface[data-tone="accent"][data-bordered="true"] { border-color: color-mix(in srgb, var(--hjm-color-primary) 30%, transparent); }
@@ -165,7 +166,7 @@
165
166
  max-inline-size: 100%;
166
167
  overflow: hidden;
167
168
  border-radius: var(--hjm-radius-md);
168
- background: var(--hjm-color-surface-alt);
169
+ background: var(--hjm-color-bg);
169
170
  vertical-align: middle;
170
171
  }
171
172
  .hjm-image__asset,
@@ -179,7 +180,7 @@
179
180
  display: grid;
180
181
  place-items: center;
181
182
  color: var(--hjm-color-text-muted);
182
- background: var(--hjm-color-surface-alt);
183
+ background: var(--hjm-color-bg);
183
184
  }
184
185
  .hjm-image__fallback-icon { display: inline-grid; place-items: center; }
185
186
 
@@ -230,7 +231,7 @@
230
231
  line-height: var(--hjm-type-body-large-line-height);
231
232
  }
232
233
  .hjm-button[data-tone="primary"], .hjm-icon-button[data-tone="primary"] { color: var(--hjm-color-on-primary); background: var(--hjm-color-primary); }
233
- .hjm-button[data-tone="secondary"], .hjm-icon-button[data-tone="secondary"] { color: var(--hjm-color-text); background: var(--hjm-color-surface-alt); border-color: var(--hjm-color-border-control); }
234
+ .hjm-button[data-tone="secondary"], .hjm-icon-button[data-tone="secondary"] { color: var(--hjm-color-text); background: var(--hjm-color-bg); border-color: var(--hjm-color-border-control); }
234
235
  .hjm-button[data-tone="ghost"], .hjm-icon-button[data-tone="ghost"] { color: var(--hjm-color-text-muted); background: transparent; }
235
236
  .hjm-button[data-tone="danger"], .hjm-icon-button[data-tone="danger"] { color: var(--hjm-color-on-danger); background: var(--hjm-color-danger-fill); }
236
237
  /* A link-tone control is inline copy; the size axis' padding would push it out
@@ -238,7 +239,7 @@
238
239
  .hjm-button[data-tone="link"] { color: var(--hjm-color-content-brand); background: transparent; padding-inline: 0; }
239
240
  /* Toggle treatment: aria-pressed already carried the state, so without a paired
240
241
  visual every consumer painted the selected background in product styles. */
241
- .hjm-button[data-selected="true"], .hjm-icon-button[data-selected="true"] { color: var(--hjm-color-content-brand); background: var(--hjm-color-surface-accent); border-color: var(--hjm-color-content-brand); }
242
+ .hjm-button[data-selected="true"], .hjm-icon-button[data-selected="true"] { color: var(--hjm-color-content-brand); background: var(--hjm-color-bg); border-color: var(--hjm-color-content-brand); }
242
243
  .hjm-button:active:not(:disabled):not([aria-disabled="true"]), .hjm-icon-button:active:not(:disabled):not([aria-disabled="true"]) { opacity: var(--hjm-button-pressed-opacity); }
243
244
  .hjm-button:disabled, .hjm-icon-button:disabled { cursor: not-allowed; opacity: var(--hjm-button-disabled-opacity); }
244
245
  /* 라벨은 자르지 않고 두 줄까지 접는다(buttonRecipe.label). 잘린 행동 라벨은 무엇을 하는
@@ -281,11 +282,15 @@
281
282
  .hjm-switch:focus-visible .hjm-switch__track,
282
283
  .hjm-segmented__item:has(input:focus-visible),
283
284
  .hjm-tabs__tab:focus-visible,
284
- .hjm-list-row:focus-visible {
285
+ .hjm-list-row:focus-visible,
286
+ .hjm-virtual-list:focus-visible,
287
+ .hjm-virtual-list__row:focus-visible {
285
288
  outline: var(--hjm-focus-width) solid var(--hjm-color-focus);
286
289
  outline-offset: var(--hjm-focus-offset);
287
290
  }
288
291
 
292
+ /* Input interiors use the theme canvas (white in light mode), not tinted
293
+ surfaces. Focus and selection still use blue borders and compact indicators. */
289
294
  .hjm-field { display: grid; gap: var(--hjm-space-xs); min-inline-size: 0; }
290
295
  .hjm-field__label { color: var(--hjm-color-text-body); font-weight: var(--hjm-font-weight-semibold); }
291
296
  .hjm-field__control {
@@ -293,9 +298,9 @@
293
298
  align-items: center;
294
299
  min-block-size: var(--hjm-control-field-height);
295
300
  padding-inline: var(--hjm-space-md);
296
- border: var(--hjm-field-border-width) solid var(--hjm-color-text-muted);
301
+ border: var(--hjm-field-border-width) solid var(--hjm-color-border-control);
297
302
  border-radius: var(--hjm-radius-md);
298
- background: var(--hjm-color-surface);
303
+ background: var(--hjm-color-bg);
299
304
  }
300
305
  .hjm-field[data-variant="inset"] .hjm-field__control { background: var(--hjm-color-bg); }
301
306
  .hjm-field[data-shape="large"] .hjm-field__control { border-radius: var(--hjm-radius-lg); }
@@ -338,7 +343,7 @@
338
343
  .hjm-field__affix { display: inline-flex; align-items: center; color: var(--hjm-color-text-muted); }
339
344
  .hjm-field__description, .hjm-choice__description { color: var(--hjm-color-text-muted); font-size: var(--hjm-type-label-size); line-height: var(--hjm-type-label-line-height); }
340
345
  .hjm-field__error { color: var(--hjm-color-danger); font-size: var(--hjm-type-label-size); line-height: var(--hjm-type-label-line-height); }
341
- .hjm-search-field__clear { inline-size: 32px; block-size: 32px; display: inline-grid; place-items: center; border: 0; border-radius: 50%; color: inherit; background: transparent; font: inherit; cursor: pointer; }
346
+ .hjm-search-field__clear { inline-size: var(--hjm-control-min-touch-target); block-size: var(--hjm-control-min-touch-target); display: inline-grid; place-items: center; border: 0; border-radius: 50%; color: inherit; background: transparent; font: inherit; cursor: pointer; }
342
347
  .hjm-search-field__spinner { inline-size: 32px; block-size: 32px; display: inline-grid; place-items: center; color: var(--hjm-color-content-brand); }
343
348
  .hjm-search-field__spinner:empty::before { content: ""; inline-size: 1em; block-size: 1em; border: 2px solid currentColor; border-inline-end-color: transparent; border-radius: 50%; animation: hjm-spin 800ms linear infinite; }
344
349
  .hjm-password-field--large .hjm-field__control { min-block-size: var(--hjm-control-button-large); padding-inline: var(--hjm-space-lg); }
@@ -394,6 +399,7 @@
394
399
  (var(--hjm-otp-slot-size) * var(--hjm-otp-length)) +
395
400
  (var(--hjm-otp-gap) * (var(--hjm-otp-length) - 1))
396
401
  );
402
+ /* Numeric codes keep their entry order in RTL (docs/otp-field.md); mirroring digits would reorder the code. */
397
403
  direction: ltr;
398
404
  }
399
405
  .hjm-otp-field__control[data-size="large"] {
@@ -427,10 +433,10 @@
427
433
  display: grid;
428
434
  place-items: center;
429
435
  padding-block: var(--hjm-space-xxs);
430
- border: 1px solid var(--hjm-color-text-muted);
436
+ border: 1px solid var(--hjm-color-border-control);
431
437
  border-radius: var(--hjm-radius-md);
432
438
  color: var(--hjm-color-text);
433
- background: var(--hjm-color-surface);
439
+ background: var(--hjm-color-bg);
434
440
  font-size: var(--hjm-type-title-size);
435
441
  line-height: var(--hjm-type-title-line-height);
436
442
  font-weight: var(--hjm-font-weight-semibold);
@@ -497,7 +503,7 @@
497
503
  text-decoration: none;
498
504
  overflow-wrap: anywhere;
499
505
  }
500
- .hjm-bottom-navigation__item:hover { background: var(--hjm-color-surface-alt); }
506
+ .hjm-bottom-navigation__item:hover { background: var(--hjm-color-bg); }
501
507
  .hjm-bottom-navigation__item:active { background: var(--hjm-bottom-navigation-pressed-background); }
502
508
  .hjm-bottom-navigation__item:focus-visible {
503
509
  outline: 2px solid var(--hjm-color-content-brand);
@@ -581,8 +587,8 @@
581
587
  .hjm-number-field__stepper[data-direction="increment"] {
582
588
  border-inline-start: 1px solid var(--hjm-color-border);
583
589
  }
584
- .hjm-number-field__stepper:hover:not(:disabled) { background: var(--hjm-color-surface-alt); }
585
- .hjm-number-field__stepper:active:not(:disabled) { background: var(--hjm-color-surface-accent); }
590
+ .hjm-number-field__stepper:hover:not(:disabled) { background: var(--hjm-color-bg); }
591
+ .hjm-number-field__stepper:active:not(:disabled) { background: var(--hjm-color-bg); }
586
592
  .hjm-number-field__stepper:disabled { cursor: not-allowed; opacity: 0.5; }
587
593
  .hjm-number-field__stepper:focus-visible {
588
594
  outline: 2px solid var(--hjm-color-content-brand);
@@ -698,7 +704,8 @@
698
704
  }
699
705
  .hjm-slider__input:disabled { cursor: not-allowed; }
700
706
 
701
- .hjm-choice { display: inline-flex; align-items: center; gap: var(--hjm-space-sm); min-block-size: 56px; padding: var(--hjm-space-sm) var(--hjm-space-md); border: 1px solid var(--hjm-color-border); border-radius: var(--hjm-radius-md); background: var(--hjm-color-surface); cursor: pointer; }
707
+ /* Long choice labels wrap within the parent. */
708
+ .hjm-choice { display: inline-flex; align-items: center; gap: var(--hjm-space-sm); min-block-size: 56px; max-inline-size: 100%; padding: var(--hjm-space-sm) var(--hjm-space-md); border: 1px solid var(--hjm-color-border); border-radius: var(--hjm-radius-md); background: var(--hjm-color-bg); cursor: pointer; }
702
709
  .hjm-choice[data-disabled="true"] { opacity: 0.5; cursor: not-allowed; }
703
710
  .hjm-choice[data-readonly="true"] { cursor: default; }
704
711
  .hjm-choice[data-presentation="plain"] { padding: 0; border-color: transparent; background: transparent; }
@@ -706,11 +713,11 @@
706
713
  .hjm-choice[data-presentation="card"][data-state="checked"],
707
714
  .hjm-choice[data-presentation="card"][data-state="mixed"],
708
715
  .hjm-choice[data-presentation="grouped"][data-state="checked"],
709
- .hjm-choice[data-presentation="grouped"][data-state="mixed"] { border-color: var(--hjm-color-content-brand); background: var(--hjm-color-surface-accent); }
716
+ .hjm-choice[data-presentation="grouped"][data-state="mixed"] { border-color: var(--hjm-color-content-brand); background: var(--hjm-color-bg); }
710
717
  .hjm-choice[data-size="small"] { min-block-size: 44px; gap: var(--hjm-space-xs); padding: var(--hjm-space-xs) var(--hjm-space-sm); }
711
718
  .hjm-choice[data-size="small"][data-presentation="plain"] { padding: 0; }
712
719
  .hjm-choice__input { position: absolute; opacity: 0; inline-size: 1px; block-size: 1px; }
713
- .hjm-choice__indicator { flex: 0 0 24px; display: grid; place-items: center; inline-size: 24px; block-size: 24px; margin-block-start: 2px; border: 2px solid var(--hjm-color-text-muted); background: var(--hjm-color-surface); }
720
+ .hjm-choice__indicator { flex: 0 0 24px; display: grid; place-items: center; inline-size: 24px; block-size: 24px; margin-block-start: 2px; border: 2px solid var(--hjm-color-text-muted); background: var(--hjm-color-bg); }
714
721
  .hjm-choice[data-size="small"] .hjm-choice__indicator { flex-basis: 20px; inline-size: 20px; block-size: 20px; }
715
722
  .hjm-choice__leading { flex: 0 0 auto; display: inline-flex; align-items: center; justify-content: center; color: var(--hjm-color-text-muted); }
716
723
  .hjm-choice[data-kind="checkbox"] .hjm-choice__indicator { border-radius: var(--hjm-radius-sm); }
@@ -727,7 +734,7 @@
727
734
  .hjm-radio-group legend { margin-block-end: var(--hjm-space-xs); font-weight: var(--hjm-font-weight-semibold); }
728
735
  .hjm-radio-group__items { display: flex; flex-direction: column; gap: var(--hjm-space-xs); }
729
736
  .hjm-radio-group[data-presentation="plain"] .hjm-radio-group__items { gap: var(--hjm-space-xxs); }
730
- .hjm-radio-group[data-presentation="grouped"] .hjm-radio-group__items { gap: 0; overflow: hidden; border: 1px solid var(--hjm-color-border); border-radius: var(--hjm-radius-lg); background: var(--hjm-color-surface); }
737
+ .hjm-radio-group[data-presentation="grouped"] .hjm-radio-group__items { gap: 0; overflow: hidden; border: 1px solid var(--hjm-color-border); border-radius: var(--hjm-radius-lg); background: var(--hjm-color-bg); }
731
738
  .hjm-radio-group[data-orientation="horizontal"] .hjm-radio-group__items { flex-direction: row; flex-wrap: wrap; gap: var(--hjm-space-md); }
732
739
  .hjm-radio-group[data-orientation="horizontal"][data-presentation="plain"] .hjm-radio-group__items { gap: var(--hjm-space-sm); }
733
740
  .hjm-radio-group[data-orientation="horizontal"][data-presentation="grouped"] .hjm-radio-group__items { gap: 0; }
@@ -735,17 +742,14 @@
735
742
  .hjm-checkbox-group legend { margin-block-end: var(--hjm-space-xs); font-weight: var(--hjm-font-weight-semibold); }
736
743
  .hjm-checkbox-group__items { display: flex; flex-direction: column; gap: var(--hjm-space-xs); }
737
744
  .hjm-checkbox-group[data-presentation="plain"] .hjm-checkbox-group__items { gap: var(--hjm-space-xxs); }
738
- .hjm-checkbox-group[data-presentation="grouped"] .hjm-checkbox-group__items { gap: 0; overflow: hidden; border: 1px solid var(--hjm-color-border); border-radius: var(--hjm-radius-lg); background: var(--hjm-color-surface); }
745
+ .hjm-checkbox-group[data-presentation="grouped"] .hjm-checkbox-group__items { gap: 0; overflow: hidden; border: 1px solid var(--hjm-color-border); border-radius: var(--hjm-radius-lg); background: var(--hjm-color-bg); }
739
746
  .hjm-checkbox-group[data-orientation="horizontal"] .hjm-checkbox-group__items { flex-direction: row; flex-wrap: wrap; gap: var(--hjm-space-md); }
740
747
  .hjm-checkbox-group[data-orientation="horizontal"][data-presentation="plain"] .hjm-checkbox-group__items { gap: var(--hjm-space-sm); }
741
748
  .hjm-checkbox-group[data-orientation="horizontal"][data-presentation="grouped"] .hjm-checkbox-group__items { gap: 0; }
742
749
 
743
750
  .hjm-switch { display: inline-flex; align-items: center; gap: var(--hjm-space-sm); min-block-size: var(--hjm-control-min-touch-target); padding: 0; border: 0; color: inherit; background: transparent; font: inherit; cursor: pointer; }
744
- /* A disabled switch still has to report what it is set to, so `switchRecipe.colors`
745
- swaps hue instead of fading the row — a flat `opacity` made on and off nearly
746
- identical, and it would also double-fade the calibrated 38% on-track. The fade is
747
- kept on the label alone, so the row still reads disabled at a glance while the
748
- control keeps the contrast its colours were chosen for. */
751
+ /* Disabled switch colors preserve on/off contrast; row opacity would erase state
752
+ and double-fade the calibrated38% track. Only the label fades (switchRecipe.colors). */
749
753
  .hjm-switch:disabled { cursor: not-allowed; }
750
754
  .hjm-switch:disabled .hjm-switch__label { opacity: 0.5; }
751
755
  .hjm-switch:disabled .hjm-switch__track { background: var(--hjm-color-border); box-shadow: inset 0 0 0 1px var(--hjm-color-border); }
@@ -775,33 +779,17 @@
775
779
  [dir="rtl"] .hjm-switch[data-state="checked"] .hjm-switch__thumb { transform: translateX(calc(-1 * var(--hjm-switch-track-offset))); }
776
780
 
777
781
  .hjm-segmented { min-inline-size: 0; padding: 0; border: 0; }
778
- .hjm-segmented__items { display: flex; min-inline-size: 0; gap: 2px; padding: 2px; border-radius: var(--hjm-radius-md); background: var(--hjm-color-surface-alt); overflow-x: auto; }
782
+ .hjm-segmented__items { display: flex; min-inline-size: 0; gap: 2px; padding: 2px; border-radius: var(--hjm-radius-md); background: var(--hjm-color-bg); overflow-x: auto; }
779
783
  .hjm-segmented__item { position: relative; flex: 1 1 0; min-inline-size: max-content; min-block-size: var(--hjm-control-min-touch-target); display: grid; place-items: center; padding: var(--hjm-space-xs) var(--hjm-space-sm); border-radius: calc(var(--hjm-radius-md) - 2px); color: var(--hjm-color-text-muted); cursor: pointer; }
780
784
  .hjm-segmented__item input { position: absolute; opacity: 0; }
781
- .hjm-segmented__item[data-state="checked"] { color: var(--hjm-color-text); background: var(--hjm-color-surface-accent); font-weight: var(--hjm-font-weight-semibold); }
785
+ .hjm-segmented__item[data-state="checked"] { box-shadow: inset 0 0 0 1px var(--hjm-color-content-brand); color: var(--hjm-color-text); background: var(--hjm-color-bg); font-weight: var(--hjm-font-weight-semibold); }
782
786
  .hjm-segmented__item[data-disabled="true"] { opacity: 0.5; cursor: not-allowed; }
783
787
 
784
- /* segmentedControlRecipe.adaptive.largeTextLayout = "stacked": equal-width
785
- segments stop being comparable once large text wraps a syllable per line, and
786
- on a narrow viewport the row overflows into a horizontal scroller instead.
787
- React Native reads the recipe and stacks; this renderer had no translation of
788
- it, so one contract rendered two layouts.
789
-
790
- There are two triggers because web has two large-text signals. A browser
791
- user changes the default font size, which `em` in a media query reads
792
- directly; a product that declares `textScale` to the provider publishes
793
- `data-large-text`, which is the recipe's `stackAtFontScale` resolved once
794
- (a stylesheet cannot compare the raw number). Before #20 only the first
795
- existed, so the declared axis reached RN and not this renderer. 11em is 176px at 100% (no real viewport, so the
796
- row is untouched) and 352px at 200%. Measured on the sea view: the row is
797
- 195px at 100%, 263px at 150% and 333px at 200%, so 320px/200% overflowed
798
- (10em) while 360px/200% did not (11.25em) — the threshold sits between them.
799
- Stacking releases two row-only declarations: `flex: 1 1 0` would collapse an
800
- auto-height column to its padding, and `max-content` would stop a long label
801
- from wrapping inside its own full-width row.
802
-
803
- `renderers.ssr.test.tsx` fails if the recipe stops declaring "stacked" while
804
- these rules remain, so the two do not drift apart silently. */
788
+ /* segmentedControlRecipe.adaptive.largeTextLayout stacks oversized labels, matching RN.
789
+ Both browser font size (em query) and provider data-large-text must trigger it (#20).
790
+ 11em = 176px at100%, 352px at200%: measured row333px fits360px but overflows320px.
791
+ Reset flex and max-content in columns to avoid collapsed height and unwrapped labels.
792
+ renderers.ssr.test.tsx checks that the recipe still declares stacked. */
805
793
  @media (max-width: 11em) {
806
794
  .hjm-segmented__items { flex-direction: column; overflow-x: visible; }
807
795
  .hjm-segmented__item { flex: 0 0 auto; min-inline-size: 0; }
@@ -828,11 +816,11 @@
828
816
  .hjm-tabs[data-orientation="vertical"] .hjm-tabs__tab[data-state="selected"]::after { inset-block: 0; inset-inline-start: auto; inset-inline-end: 0; inline-size: 2px; block-size: auto; }
829
817
 
830
818
  .hjm-badge, .hjm-tag { display: inline-flex; align-items: center; gap: var(--hjm-space-xxs); max-inline-size: 100%; overflow-wrap: anywhere; }
831
- .hjm-badge { min-block-size: 24px; padding: 2px var(--hjm-space-xs); border: 1px solid transparent; border-radius: var(--hjm-radius-full); color: var(--hjm-color-text-muted); background: var(--hjm-color-surface-alt); font-size: var(--hjm-type-caption-size); line-height: var(--hjm-type-caption-line-height); font-weight: var(--hjm-font-weight-bold); }
819
+ .hjm-badge { min-block-size: 24px; padding: 2px var(--hjm-space-xs); border: 1px solid transparent; border-radius: var(--hjm-radius-full); color: var(--hjm-color-text-muted); background: var(--hjm-color-bg); font-size: var(--hjm-type-caption-size); line-height: var(--hjm-type-caption-line-height); font-weight: var(--hjm-font-weight-bold); }
832
820
  .hjm-badge[data-size="small"] { min-block-size: 20px; font-size: var(--hjm-type-caption-size); }
833
821
  .hjm-badge[data-tone="strong"] { color: var(--hjm-color-bg); background: var(--hjm-color-text); }
834
822
  .hjm-badge[data-tone="brand"] { color: var(--hjm-color-content-brand); }
835
- .hjm-badge[data-tone="info"], .hjm-tag[data-tone="info"] { color: var(--hjm-accent-info); background: color-mix(in srgb, var(--hjm-accent-info) 14%, transparent); border-color: color-mix(in srgb, var(--hjm-accent-info) 30%, transparent); }
823
+ .hjm-badge[data-tone="info"], .hjm-tag[data-tone="info"] { color: var(--hjm-accent-info); background: var(--hjm-color-bg); border-color: color-mix(in srgb, var(--hjm-accent-info) 30%, transparent); }
836
824
  .hjm-badge[data-tone="success"], .hjm-tag[data-tone="success"] { color: var(--hjm-accent-success); background: color-mix(in srgb, var(--hjm-accent-success) 14%, transparent); border-color: color-mix(in srgb, var(--hjm-accent-success) 30%, transparent); }
837
825
  .hjm-badge[data-tone="warning"] { color: var(--hjm-accent-warning); background: color-mix(in srgb, var(--hjm-accent-warning) 14%, transparent); border-color: color-mix(in srgb, var(--hjm-accent-warning) 30%, transparent); }
838
826
  .hjm-badge[data-tone="attention"], .hjm-tag[data-tone="attention"] { color: var(--hjm-accent-attention); background: color-mix(in srgb, var(--hjm-accent-attention) 14%, transparent); border-color: color-mix(in srgb, var(--hjm-accent-attention) 30%, transparent); }
@@ -844,9 +832,9 @@
844
832
  .hjm-badge[data-variant="outline"][data-tone="warning"] { border-color: color-mix(in srgb, var(--hjm-accent-warning) 30%, transparent); }
845
833
  .hjm-badge[data-variant="outline"][data-tone="attention"] { border-color: color-mix(in srgb, var(--hjm-accent-attention) 30%, transparent); }
846
834
  .hjm-badge[data-variant="outline"][data-tone="danger"] { border-color: color-mix(in srgb, var(--hjm-color-danger) 30%, transparent); }
847
- .hjm-tag { min-block-size: 20px; padding-inline: var(--hjm-space-xxs); border: 1px solid transparent; border-radius: var(--hjm-radius-sm); color: var(--hjm-color-text-muted); background: var(--hjm-color-surface-alt); font-size: var(--hjm-type-caption-size); line-height: var(--hjm-type-caption-line-height); font-weight: var(--hjm-font-weight-semibold); }
848
- .hjm-tag[data-tone="brand"] { color: var(--hjm-color-content-brand); background: var(--hjm-color-surface-accent); }
849
- .hjm-tag[data-tone="info"] { background: color-mix(in srgb, var(--hjm-accent-info) 10%, transparent); }
835
+ .hjm-tag { min-block-size: 20px; padding-inline: var(--hjm-space-xxs); border: 1px solid transparent; border-radius: var(--hjm-radius-sm); color: var(--hjm-color-text-muted); background: var(--hjm-color-bg); font-size: var(--hjm-type-caption-size); line-height: var(--hjm-type-caption-line-height); font-weight: var(--hjm-font-weight-semibold); }
836
+ .hjm-tag[data-tone="brand"] { color: var(--hjm-color-content-brand); background: var(--hjm-color-bg); }
837
+ .hjm-tag[data-tone="info"] { background: var(--hjm-color-bg); }
850
838
  .hjm-tag[data-tone="success"] { background: color-mix(in srgb, var(--hjm-accent-success) 10%, transparent); }
851
839
  .hjm-tag[data-tone="attention"] { background: color-mix(in srgb, var(--hjm-accent-attention) 10%, transparent); }
852
840
  .hjm-icon { display: inline-block; flex: 0 0 auto; vertical-align: middle; }
@@ -859,7 +847,8 @@
859
847
  .hjm-icon[data-tone="warning"] { color: var(--hjm-accent-warning); }
860
848
  .hjm-icon[data-tone="danger"] { color: var(--hjm-color-danger); }
861
849
  .hjm-icon[data-tone="inverse"] { color: var(--hjm-color-on-primary); }
862
- .hjm-counter-badge { display: inline-grid; place-items: center; min-inline-size: 20px; block-size: 20px; padding-inline: var(--hjm-space-xs); border-radius: var(--hjm-radius-full); color: var(--hjm-color-bg); background: var(--hjm-color-text); font-size: var(--hjm-type-caption-size); line-height: 1; font-weight: var(--hjm-font-weight-bold); font-variant-numeric: tabular-nums; }
850
+ /* Counts must not flex-shrink below their text and padding in narrow rows. */
851
+ .hjm-counter-badge { flex-shrink: 0; display: inline-grid; place-items: center; min-inline-size: 20px; block-size: 20px; padding-inline: var(--hjm-space-xs); border-radius: var(--hjm-radius-full); color: var(--hjm-color-bg); background: var(--hjm-color-text); font-size: var(--hjm-type-caption-size); line-height: 1; font-weight: var(--hjm-font-weight-bold); font-variant-numeric: tabular-nums; }
863
852
  .hjm-counter-badge[data-size="small"] { min-inline-size: 16px; block-size: 16px; padding-inline: var(--hjm-space-xxs); }
864
853
  .hjm-counter-badge[data-tone="brand"] { color: var(--hjm-color-on-primary); background: var(--hjm-color-primary); }
865
854
  .hjm-counter-badge[data-tone="danger"] { color: var(--hjm-color-on-danger); background: var(--hjm-color-danger-fill); }
@@ -886,7 +875,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
886
875
  .hjm-list-row[data-density="relaxed"][data-lines="two"] { min-block-size: var(--hjm-list-row-relaxed-two-line); }
887
876
  .hjm-list-row[data-density="spacious"] { min-block-size: var(--hjm-list-row-spacious-one-line); padding-inline: var(--hjm-list-row-spacious-padding-inline); padding-block: var(--hjm-list-row-spacious-padding-block); }
888
877
  .hjm-list-row[data-density="spacious"][data-lines="two"] { min-block-size: var(--hjm-list-row-spacious-two-line); }
889
- .hjm-list-row[data-state="selected"] { background: var(--hjm-color-surface-accent); }
878
+ .hjm-list-row[data-state="selected"] { background: var(--hjm-color-bg); box-shadow: inset 0 0 0 1px var(--hjm-color-content-brand); }
890
879
  .hjm-list-row[data-state="disabled"] { opacity: 0.5; cursor: not-allowed; }
891
880
  .hjm-list-row__leading, .hjm-list-row__trailing { flex: 0 0 auto; }
892
881
  /* `leadingSize` was declared by the recipe but unbound, so consumers rebuilt
@@ -908,16 +897,16 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
908
897
  .hjm-section__header { align-items: stretch; flex-direction: column; }
909
898
  }
910
899
 
911
- .hjm-chip { min-block-size: var(--hjm-control-min-touch-target); display: inline-flex; align-items: center; gap: var(--hjm-space-xs); padding-inline: var(--hjm-space-sm); border: 1px solid var(--hjm-color-border); border-radius: 999px; background: var(--hjm-color-surface); color: var(--hjm-color-text-body); font: inherit; font-weight: var(--hjm-font-weight-medium); cursor: pointer; }
900
+ .hjm-chip { min-block-size: var(--hjm-control-min-touch-target); display: inline-flex; align-items: center; gap: var(--hjm-space-xs); padding-inline: var(--hjm-space-sm); border: 1px solid var(--hjm-color-border); border-radius: 999px; background: var(--hjm-color-bg); color: var(--hjm-color-text-body); font: inherit; font-weight: var(--hjm-font-weight-medium); cursor: pointer; }
912
901
  .hjm-chip[data-size="small"] { min-block-size: 36px; padding-inline: var(--hjm-space-xs); }
913
- .hjm-chip[data-selected] { border-color: var(--hjm-color-content-brand); background: var(--hjm-color-surface-accent); color: var(--hjm-color-content-brand); }
902
+ .hjm-chip[data-selected] { border-color: var(--hjm-color-content-brand); background: var(--hjm-color-bg); color: var(--hjm-color-content-brand); }
914
903
  .hjm-chip:disabled { opacity: 0.5; cursor: not-allowed; }
915
904
  .hjm-chip:focus-visible { outline: var(--hjm-focus-width) solid var(--hjm-color-focus); outline-offset: var(--hjm-focus-offset); }
916
905
  .hjm-chip__indicator, .hjm-chip__leading, .hjm-chip__trailing { display: inline-flex; flex: 0 0 auto; }
917
906
  .hjm-chip__label { overflow-wrap: anywhere; }
918
907
 
919
908
  .hjm-list { overflow: hidden; min-inline-size: 0; }
920
- .hjm-list[data-appearance="grouped"] { border-radius: var(--hjm-radius-lg); background: var(--hjm-color-surface); }
909
+ .hjm-list[data-appearance="grouped"] { border-radius: var(--hjm-radius-lg); background: var(--hjm-color-bg); }
921
910
  .hjm-list__item { min-inline-size: 0; }
922
911
  .hjm-list[data-separator="full"] > .hjm-list__item + .hjm-list__item { border-block-start: 1px solid var(--hjm-color-border); }
923
912
  /* Indent only the divider: moving the row shifted every title after the first
@@ -926,7 +915,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
926
915
  .hjm-list[data-separator="indented"] > .hjm-list__item + .hjm-list__item::before { content: ""; position: absolute; inset-block-start: 0; inset-inline: var(--hjm-space-xl) 0; border-block-start: 1px solid var(--hjm-color-border); pointer-events: none; }
927
916
 
928
917
  .hjm-statistic { display: grid; gap: var(--hjm-space-xxs); min-inline-size: 0; color: var(--hjm-color-text-body); }
929
- .hjm-statistic[data-presentation="surface"] { padding: var(--hjm-space-md); border: 1px solid var(--hjm-color-border); border-radius: var(--hjm-radius-md); background: var(--hjm-color-surface); }
918
+ .hjm-statistic[data-presentation="surface"] { padding: var(--hjm-space-md); border: 1px solid var(--hjm-color-border); border-radius: var(--hjm-radius-md); background: var(--hjm-color-bg); }
930
919
  .hjm-statistic[data-density="compact"] { gap: 2px; }
931
920
  .hjm-statistic__label { color: var(--hjm-color-text-muted); font-weight: var(--hjm-font-weight-medium); overflow-wrap: anywhere; }
932
921
  .hjm-statistic__value-row { display: flex; align-items: baseline; flex-wrap: wrap; gap: var(--hjm-space-xxs); min-inline-size: 0; }
@@ -941,7 +930,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
941
930
  .hjm-statistic-group { grid-template-columns: minmax(0, 1fr); }
942
931
  }
943
932
 
944
- .hjm-notice { display: flex; flex-wrap: wrap; align-items: flex-start; gap: var(--hjm-space-sm); padding: var(--hjm-space-md); border: 1px solid; border-radius: var(--hjm-radius-md); color: var(--hjm-color-text-body); background: var(--hjm-color-surface); border-color: var(--hjm-color-border); }
933
+ .hjm-notice { display: flex; flex-wrap: wrap; align-items: flex-start; gap: var(--hjm-space-sm); padding: var(--hjm-space-md); border: 1px solid; border-radius: var(--hjm-radius-md); color: var(--hjm-color-text-body); background: var(--hjm-color-bg); border-color: var(--hjm-color-border); }
945
934
  .hjm-notice[data-tone="info"] { border-color: var(--hjm-accent-info); }
946
935
  .hjm-notice[data-tone="success"] { border-color: var(--hjm-accent-success); background: color-mix(in srgb, var(--hjm-accent-success) 10%, var(--hjm-color-bg)); }
947
936
  .hjm-notice[data-tone="warning"] { border-color: var(--hjm-accent-warning); background: color-mix(in srgb, var(--hjm-accent-warning) 10%, var(--hjm-color-bg)); }
@@ -962,7 +951,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
962
951
  .hjm-result[data-status="success"] .hjm-result__icon:empty::before { content: "✓"; }
963
952
  .hjm-result[data-status="failure"] .hjm-result__icon { color: var(--hjm-color-danger); background: color-mix(in srgb, var(--hjm-color-danger) 12%, transparent); }
964
953
  .hjm-result[data-status="failure"] .hjm-result__icon:empty::before { content: "!"; }
965
- .hjm-result[data-status="info"] .hjm-result__icon { color: var(--hjm-accent-info); background: color-mix(in srgb, var(--hjm-accent-info) 12%, transparent); }
954
+ .hjm-result[data-status="info"] .hjm-result__icon { color: var(--hjm-accent-info); background: var(--hjm-color-bg); }
966
955
  .hjm-result__title { margin: 0; color: var(--hjm-color-text); font-size: var(--hjm-type-title-large-size); line-height: var(--hjm-type-title-large-line-height); overflow-wrap: anywhere; }
967
956
  .hjm-result__description { max-inline-size: 40rem; margin: 0; color: var(--hjm-color-text-muted); overflow-wrap: anywhere; }
968
957
  .hjm-result__actions { display: flex; flex-wrap: wrap; justify-content: center; gap: var(--hjm-space-sm); margin-block-start: var(--hjm-space-xs); }
@@ -1036,7 +1025,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1036
1025
  .hjm-spinner[data-size="small"] { font-size: 14px; }
1037
1026
  .hjm-spinner[data-size="medium"] { font-size: 20px; }
1038
1027
  .hjm-spinner[data-size="large"] { font-size: 28px; }
1039
- .hjm-skeleton { display: block; inline-size: 100%; min-block-size: var(--hjm-space-xxl); border-radius: var(--hjm-radius-md); background: var(--hjm-color-surface-alt); }
1028
+ .hjm-skeleton { border: 1px solid var(--hjm-color-border); display: block; inline-size: 100%; min-block-size: var(--hjm-space-xxl); border-radius: var(--hjm-radius-md); background: var(--hjm-color-bg); }
1040
1029
  .hjm-skeleton[data-shape="text"] { min-block-size: var(--hjm-space-md); border-radius: var(--hjm-radius-sm); }
1041
1030
  .hjm-skeleton[data-shape="circle"] { inline-size: var(--hjm-skeleton-circle-size); block-size: var(--hjm-skeleton-circle-size); border-radius: var(--hjm-radius-full); }
1042
1031
  .hjm-skeleton[data-animated="true"] { animation: hjm-pulse var(--hjm-skeleton-duration) var(--hjm-skeleton-easing) infinite alternate; }
@@ -1056,7 +1045,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1056
1045
  overflow: hidden;
1057
1046
  border: 1px solid var(--hjm-color-border);
1058
1047
  border-radius: var(--hjm-radius-lg);
1059
- background: var(--hjm-color-surface);
1048
+ background: var(--hjm-color-bg);
1060
1049
  box-shadow: 0 16px 48px rgb(0 0 0 / 28%);
1061
1050
  }
1062
1051
  .hjm-command-palette__search {
@@ -1080,7 +1069,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1080
1069
  padding-inline: var(--hjm-space-sm);
1081
1070
  border-radius: var(--hjm-radius-sm);
1082
1071
  }
1083
- .hjm-command-palette__item[aria-selected="true"] { background: var(--hjm-color-surface-accent); }
1072
+ .hjm-command-palette__item[aria-selected="true"] { background: var(--hjm-color-bg); box-shadow: inset 0 0 0 1px var(--hjm-color-content-brand); }
1084
1073
  .hjm-command-palette__item[aria-disabled="true"] { color: var(--hjm-color-text-weak); }
1085
1074
  .hjm-command-palette__item[data-tone="danger"] { color: var(--hjm-color-danger); }
1086
1075
  .hjm-command-palette__copy { display: flex; min-inline-size: 0; flex: 1 1 auto; flex-wrap: wrap; align-items: baseline; gap: var(--hjm-space-xs); overflow-wrap: anywhere; }
@@ -1124,6 +1113,9 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1124
1113
  color: var(--hjm-color-on-primary);
1125
1114
  font-size: var(--hjm-type-label-size);
1126
1115
  }
1116
+ /* 44px hit slop without growing the mark (2026-09-30 audit WR-0930-5/7) */
1117
+ .hjm-data-table__check, .hjm-data-table__sort, .hjm-transfer-list__select-all { position: relative; }
1118
+ .hjm-data-table__check::after, .hjm-data-table__sort::after, .hjm-transfer-list__select-all::after { content: ""; position: absolute; inset: calc(50% - var(--hjm-control-min-touch-target) / 2); }
1127
1119
  .hjm-data-table__check[aria-checked="true"],
1128
1120
  .hjm-data-table__check[aria-checked="mixed"] { border-color: var(--hjm-color-primary); background: var(--hjm-color-primary); }
1129
1121
  .hjm-data-table__sort:focus-visible,
@@ -1160,7 +1152,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1160
1152
  border-radius: var(--hjm-radius-sm);
1161
1153
  overflow-wrap: anywhere;
1162
1154
  }
1163
- .hjm-mentions__option[aria-selected="true"] { background: var(--hjm-color-surface-accent); }
1155
+ .hjm-mentions__option[aria-selected="true"] { background: var(--hjm-color-bg); box-shadow: inset 0 0 0 1px var(--hjm-color-content-brand); }
1164
1156
  .hjm-mentions__description { color: var(--hjm-color-text-muted); font-size: var(--hjm-type-label-size); }
1165
1157
  .hjm-mentions__empty { margin: 0; padding: var(--hjm-space-xs); color: var(--hjm-color-text-muted); }
1166
1158
 
@@ -1217,7 +1209,12 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1217
1209
  border-radius: var(--hjm-radius-sm);
1218
1210
  overflow-wrap: anywhere;
1219
1211
  }
1220
- .hjm-transfer-list__option[aria-selected="true"] { background: var(--hjm-color-surface-accent); }
1212
+ /* The label is a flex item; reset its intrinsic min-width so long localized values wrap inside a narrow panel. */
1213
+ .hjm-transfer-list__option > span:last-child { min-inline-size: 0; overflow-wrap: anywhere; }
1214
+ /* Panel headings and empty-state copy share the same narrow column as rows. */
1215
+ .hjm-transfer-list__title,
1216
+ .hjm-transfer-list__empty { min-inline-size: 0; overflow-wrap: anywhere; }
1217
+ .hjm-transfer-list__option[aria-selected="true"] { background: var(--hjm-color-bg); box-shadow: inset 0 0 0 1px var(--hjm-color-content-brand); }
1221
1218
  .hjm-transfer-list__option[aria-disabled="true"] { color: var(--hjm-color-text-weak); }
1222
1219
  .hjm-transfer-list__option:focus-visible,
1223
1220
  .hjm-transfer-list__empty:focus-visible,
@@ -1226,12 +1223,8 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1226
1223
  .hjm-transfer-list__actions { display: flex; flex-direction: column; gap: var(--hjm-space-xs); padding-block-start: var(--hjm-space-xl); }
1227
1224
 
1228
1225
  /* AuthProviderButton ------------------------------------------------------ */
1229
- /*
1230
- Brand fills come in as custom properties from the provider guideline table,
1231
- never from the theme: recoloring them would fail provider review. HJM keeps
1232
- the height, radius, target and focus ring so a stack of providers lines up,
1233
- and the ring is drawn outside the fill so it survives every brand color.
1234
- */
1226
+ /* Provider guideline colors cannot follow the theme without failing provider review.
1227
+ HJM owns geometry and an outer focus ring that remains visible on every brand fill. */
1235
1228
  .hjm-auth-provider-button {
1236
1229
  display: flex;
1237
1230
  align-items: center;
@@ -1283,10 +1276,14 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1283
1276
  selection semantics underneath. The hovered preview uses the same states, so
1284
1277
  there is one set of rules rather than a committed and a provisional set.
1285
1278
  */
1279
+ /* Each hit/hover layer belongs to its own day. Without this containing block
1280
+ the last absolute layer covered the whole preview and stole pointer clicks. */
1281
+ .hjm-date-range .hjm-calendar__day { position: relative; isolation: isolate; }
1282
+ .hjm-date-range .hjm-calendar__day-label { position: relative; z-index: 1; pointer-events: none; }
1286
1283
  .hjm-date-range__cell { position: absolute; inset: 0; border-radius: var(--hjm-radius-sm); pointer-events: auto; }
1287
- .hjm-date-range__cell[data-range="between"] { background: var(--hjm-color-surface-accent); }
1284
+ .hjm-date-range__cell[data-range="between"] { box-shadow: inset 0 -2px var(--hjm-color-content-brand); background: var(--hjm-color-bg); }
1288
1285
  .hjm-date-range__cell[data-range="start"],
1289
- .hjm-date-range__cell[data-range="end"] { background: var(--hjm-color-surface-accent); outline: 2px solid var(--hjm-color-focus); }
1286
+ .hjm-date-range__cell[data-range="end"] { background: var(--hjm-color-bg); outline: 2px solid var(--hjm-color-focus); }
1290
1287
  .hjm-date-range__cell[data-range="none"] { background: transparent; }
1291
1288
 
1292
1289
  /* AvatarGroup: overlap comes from the recipe ratio, not a per-size pixel value. */
@@ -1301,7 +1298,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1301
1298
  padding-inline: var(--hjm-space-xxs);
1302
1299
  border: 2px solid var(--hjm-color-bg);
1303
1300
  border-radius: var(--hjm-radius-full);
1304
- background: var(--hjm-color-surface-alt);
1301
+ background: var(--hjm-color-bg);
1305
1302
  color: var(--hjm-color-text-muted);
1306
1303
  font-size: var(--hjm-type-label-size);
1307
1304
  }
@@ -1321,7 +1318,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1321
1318
  .hjm-text-format[data-kind="code"] {
1322
1319
  padding-inline: var(--hjm-space-xxs);
1323
1320
  border-radius: var(--hjm-radius-sm);
1324
- background: var(--hjm-color-surface-alt);
1321
+ background: var(--hjm-color-bg);
1325
1322
  font-family: var(--hjm-font-family-code, ui-monospace, SFMono-Regular, Consolas, monospace);
1326
1323
  }
1327
1324
  .hjm-text-format[data-kind="kbd"] {
@@ -1346,6 +1343,9 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1346
1343
  position: absolute;
1347
1344
  inset-block-start: var(--hjm-skip-nav-offset);
1348
1345
  inset-inline-start: var(--hjm-skip-nav-offset);
1346
+ /* A localized skip label can be longer than a narrow viewport; keep the focused link on-screen. */
1347
+ box-sizing: border-box;
1348
+ max-inline-size: calc(100vw - var(--hjm-skip-nav-offset) * 2);
1349
1349
  z-index: 1300;
1350
1350
  display: inline-flex;
1351
1351
  align-items: center;
@@ -1355,6 +1355,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1355
1355
  background: var(--hjm-color-primary);
1356
1356
  color: var(--hjm-color-on-primary);
1357
1357
  text-decoration: none;
1358
+ overflow-wrap: anywhere;
1358
1359
  transform: translateY(calc(-100% - var(--hjm-skip-nav-offset) * 2));
1359
1360
  }
1360
1361
  .hjm-skip-nav:focus-visible,
@@ -1428,7 +1429,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1428
1429
  min-block-size: 100%;
1429
1430
  padding: var(--hjm-space-sm) var(--hjm-space-xs);
1430
1431
  border-inline-end: 1px solid var(--hjm-color-border);
1431
- background: var(--hjm-color-surface-alt);
1432
+ background: var(--hjm-color-bg);
1432
1433
  overflow: auto;
1433
1434
  }
1434
1435
  .hjm-sidebar__toggle {
@@ -1449,6 +1450,8 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1449
1450
  color: var(--hjm-color-text-muted);
1450
1451
  font-size: var(--hjm-type-label-size);
1451
1452
  font-weight: var(--hjm-type-label-weight);
1453
+ /* The rail has a fixed width; wrap long localized headings so their meaning stays visible instead of clipping or widening the shell. */
1454
+ overflow-wrap: anywhere;
1452
1455
  }
1453
1456
  .hjm-sidebar__list { display: flex; flex-direction: column; gap: var(--hjm-sidebar-gap); margin: 0; padding: 0; list-style: none; }
1454
1457
  .hjm-sidebar__item {
@@ -1463,10 +1466,10 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1463
1466
  overflow-wrap: anywhere;
1464
1467
  }
1465
1468
  .hjm-sidebar__item[aria-current="page"] {
1466
- background: var(--hjm-color-surface-accent);
1469
+ background: var(--hjm-color-bg);
1467
1470
  color: var(--hjm-color-content-brand);
1468
1471
  font-weight: var(--hjm-font-weight-semibold);
1469
- }
1472
+ box-shadow: inset 0 0 0 1px var(--hjm-color-content-brand); }
1470
1473
  .hjm-sidebar__item[aria-disabled="true"] { color: var(--hjm-color-text-weak); }
1471
1474
  .hjm-sidebar__item:focus-visible,
1472
1475
  .hjm-sidebar__toggle:focus-visible { outline: 2px solid var(--hjm-color-focus); outline-offset: -2px; }
@@ -1490,7 +1493,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1490
1493
  padding-inline: var(--hjm-toggle-padding);
1491
1494
  border: 1px solid var(--hjm-color-border-control);
1492
1495
  border-radius: var(--hjm-toggle-radius);
1493
- background: var(--hjm-color-surface);
1496
+ background: var(--hjm-color-bg);
1494
1497
  color: var(--hjm-color-text-body);
1495
1498
  font: inherit;
1496
1499
  cursor: pointer;
@@ -1498,7 +1501,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1498
1501
  /* The pressed state is announced by aria-pressed; color only reinforces it. */
1499
1502
  .hjm-toggle-group__item[aria-pressed="true"] {
1500
1503
  border-color: var(--hjm-color-focus);
1501
- background: var(--hjm-color-surface-accent);
1504
+ background: var(--hjm-color-bg);
1502
1505
  color: var(--hjm-color-content-brand);
1503
1506
  font-weight: var(--hjm-font-weight-semibold);
1504
1507
  }
@@ -1529,7 +1532,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1529
1532
  min-block-size: var(--hjm-tags-tag-min-height);
1530
1533
  padding-inline: var(--hjm-space-xs);
1531
1534
  border-radius: var(--hjm-radius-full);
1532
- background: var(--hjm-color-surface-alt);
1535
+ background: var(--hjm-color-bg);
1533
1536
  color: var(--hjm-color-text-body);
1534
1537
  overflow-wrap: anywhere;
1535
1538
  }
@@ -1554,7 +1557,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1554
1557
  min-inline-size: var(--hjm-tags-remove-target);
1555
1558
  min-block-size: var(--hjm-tags-remove-target);
1556
1559
  }
1557
- .hjm-tags-input__tag { position: relative; }
1560
+ .hjm-tags-input__tag { position: relative; border: 1px solid var(--hjm-color-border-control); }
1558
1561
  .hjm-tags-input__input {
1559
1562
  flex: 1 1 8ch;
1560
1563
  min-inline-size: 8ch;
@@ -1585,7 +1588,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1585
1588
  cursor: pointer;
1586
1589
  overflow-wrap: anywhere;
1587
1590
  }
1588
- .hjm-tags-input__suggestion[aria-selected="true"] { background: var(--hjm-color-surface-accent); }
1591
+ .hjm-tags-input__suggestion[aria-selected="true"] { box-shadow: inset 0 0 0 1px var(--hjm-color-content-brand); background: var(--hjm-color-bg); }
1589
1592
  .hjm-tags-input__suggestion[aria-disabled="true"] { color: var(--hjm-color-text-weak); cursor: default; }
1590
1593
  .hjm-tags-input__description { margin: 0; color: var(--hjm-color-text-muted); font-size: var(--hjm-type-label-size); }
1591
1594
  .hjm-tags-input[data-disabled] .hjm-tags-input__frame { opacity: 0.6; cursor: default; }
@@ -1665,7 +1668,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1665
1668
  gap: var(--hjm-space-sm);
1666
1669
  padding: var(--hjm-space-sm) var(--hjm-space-md);
1667
1670
  border-radius: var(--hjm-radius-md);
1668
- background: var(--hjm-color-surface-alt);
1671
+ background: var(--hjm-color-bg);
1669
1672
  font-size: var(--hjm-type-body-large-size);
1670
1673
  line-height: var(--hjm-type-body-large-line-height);
1671
1674
  }
@@ -1717,12 +1720,8 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1717
1720
  .hjm-agreement__detail:focus-visible { outline: 2px solid var(--hjm-color-focus); outline-offset: 2px; }
1718
1721
 
1719
1722
  /* Tree -------------------------------------------------------------------- */
1720
- /*
1721
- A flat list of treeitems with aria-level, not nested group elements: the
1722
- roving tab stop and the contract's visible-node navigation both operate on one
1723
- resolved array, and WAI-ARIA accepts either shape. Indentation is presentation
1724
- only — depth is announced, never inferred from the padding.
1725
- */
1723
+ /* Flat aria-level treeitems match the contract's visible-node array and roving focus.
1724
+ WAI-ARIA permits this shape; depth is announced rather than inferred from indentation. */
1726
1725
  .hjm-tree { display: flex; flex-direction: column; }
1727
1726
  .hjm-tree__node {
1728
1727
  display: flex;
@@ -1735,7 +1734,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1735
1734
  color: var(--hjm-color-text);
1736
1735
  cursor: default;
1737
1736
  }
1738
- .hjm-tree__node[aria-selected="true"] { background: var(--hjm-color-surface-accent); }
1737
+ .hjm-tree__node[aria-selected="true"] { background: var(--hjm-color-bg); box-shadow: inset 0 0 0 1px var(--hjm-color-content-brand); }
1739
1738
  .hjm-tree__node[aria-disabled="true"] { color: var(--hjm-color-text-weak); }
1740
1739
  .hjm-tree__node:focus-visible { outline: 2px solid var(--hjm-color-focus); outline-offset: -2px; }
1741
1740
  .hjm-tree__indent { flex: 0 0 auto; inline-size: calc(var(--hjm-tree-depth) * var(--hjm-tree-indent)); }
@@ -1809,7 +1808,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1809
1808
  align-items: center;
1810
1809
  justify-content: center;
1811
1810
  padding: var(--hjm-space-md);
1812
- background: rgb(0 0 0 / 58%);
1811
+ background: var(--hjm-backdrop-modal);
1813
1812
  overscroll-behavior: contain;
1814
1813
  }
1815
1814
  .hjm-dialog,
@@ -1858,6 +1857,8 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1858
1857
  overflow-wrap: anywhere;
1859
1858
  }
1860
1859
  .hjm-dialog > .hjm-dialog__description { padding-inline: var(--hjm-space-lg); }
1860
+ /* Consumer-authored identifiers can be unbroken; keep modal body text inside the narrow viewport. */
1861
+ .hjm-dialog__body { overflow-wrap: anywhere; }
1861
1862
  .hjm-dialog__body,
1862
1863
  .hjm-sheet__body { padding: var(--hjm-space-lg); }
1863
1864
  .hjm-dialog__footer,
@@ -1976,12 +1977,8 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1976
1977
  .hjm-sheet[data-placement="end"] {
1977
1978
  block-size: calc(100dvh - (2 * var(--hjm-space-md)));
1978
1979
  }
1979
- /*
1980
- SidePanel docks to a logical viewport edge, so it drops the floating radius the
1981
- Dialog/Sheet cards keep (sidePanelRecipe.content.radius is null) and spans the
1982
- full block size. The non-modal panel has no backdrop element at all — the page
1983
- behind it stays interactive — so it positions itself instead of a positioner.
1984
- */
1980
+ /* sidePanelRecipe.content.radius=null: dock at a logical edge with full block height.
1981
+ Non-modal panels position themselves; no backdrop may block the interactive page. */
1985
1982
  .hjm-side-panel-positioner { padding: 0; }
1986
1983
  .hjm-side-panel-positioner[data-edge="start"] { justify-content: flex-start; }
1987
1984
  .hjm-side-panel-positioner[data-edge="end"] { justify-content: flex-end; }
@@ -1995,7 +1992,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1995
1992
  border: 1px solid var(--hjm-color-border);
1996
1993
  border-radius: 0;
1997
1994
  color: var(--hjm-color-text);
1998
- background: var(--hjm-color-surface);
1995
+ background: var(--hjm-color-bg);
1999
1996
  box-shadow: 0 16px 48px rgb(0 0 0 / 28%);
2000
1997
  }
2001
1998
  .hjm-side-panel[data-modal="false"] {
@@ -2047,13 +2044,9 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2047
2044
  padding: var(--hjm-space-sm) var(--hjm-space-lg)
2048
2045
  max(var(--hjm-space-sm), env(safe-area-inset-bottom, 0px));
2049
2046
  }
2050
- /*
2051
- Tour keeps the veil and the card in separate portals: the veil must cover the
2052
- page while the card is positioned against its anchor, and the shared anchored
2053
- popup helper owns the card's coordinates. The highlight is a ring drawn at the
2054
- measured anchor box — decoration only, so it is hidden from assistive tech.
2055
- */
2056
- .hjm-tour-backdrop { position: fixed; inset: 0; background: rgb(0 0 0 / 58%); pointer-events: auto; }
2047
+ /* Separate portals let Tour's veil cover the page while the shared popup helper anchors
2048
+ its card. The measured highlight ring is decorative and hidden from assistive tech. */
2049
+ .hjm-tour-backdrop { position: fixed; inset: 0; background: var(--hjm-backdrop-modal); pointer-events: auto; }
2057
2050
  .hjm-tour-highlight {
2058
2051
  position: fixed;
2059
2052
  border-radius: var(--hjm-radius-md);
@@ -2064,12 +2057,15 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2064
2057
  display: flex;
2065
2058
  flex-direction: column;
2066
2059
  gap: var(--hjm-space-sm);
2060
+ /* The anchored popup is viewport-height bounded; scrolling keeps long translations and actions usable without truncating copy or detaching controls. */
2061
+ overflow-y: auto;
2062
+ overscroll-behavior: contain;
2067
2063
  box-sizing: border-box;
2068
2064
  padding: var(--hjm-space-md);
2069
2065
  border: 1px solid var(--hjm-color-border);
2070
2066
  border-radius: var(--hjm-radius-md);
2071
2067
  color: var(--hjm-color-text);
2072
- background: var(--hjm-color-surface);
2068
+ background: var(--hjm-color-bg);
2073
2069
  box-shadow: 0 16px 48px rgb(0 0 0 / 28%);
2074
2070
  pointer-events: auto;
2075
2071
  }
@@ -2105,7 +2101,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2105
2101
  padding: var(--hjm-space-xxs);
2106
2102
  border: 1px solid var(--hjm-color-border);
2107
2103
  border-radius: var(--hjm-radius-md);
2108
- background: var(--hjm-color-surface);
2104
+ background: var(--hjm-color-bg);
2109
2105
  box-shadow: 0 8px 24px rgb(0 0 0 / 18%);
2110
2106
  }
2111
2107
  .hjm-menu__item {
@@ -2125,7 +2121,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2125
2121
  }
2126
2122
  .hjm-menu__content[data-density="comfortable"] .hjm-menu__item { min-block-size: 3.5rem; }
2127
2123
  .hjm-menu__item:hover,
2128
- .hjm-menu__item[data-focus="true"] { background: var(--hjm-color-surface-alt); }
2124
+ .hjm-menu__item[data-focus="true"] { background: var(--hjm-color-bg); box-shadow: inset 0 0 0 1px var(--hjm-color-content-brand); }
2129
2125
  .hjm-menu__item[data-tone="danger"] { color: var(--hjm-color-danger); }
2130
2126
  .hjm-menu__item[data-state="selected"] { color: var(--hjm-color-content-brand); font-weight: var(--hjm-font-weight-semibold); }
2131
2127
  .hjm-menu__item:disabled { opacity: 0.5; cursor: not-allowed; }
@@ -2150,13 +2146,13 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2150
2146
  .hjm-select__indicator { flex: 0 0 auto; color: var(--hjm-color-text-muted); pointer-events: none; }
2151
2147
  .hjm-select__busy-indicator { flex: 0 0 auto; inline-size: 1em; block-size: 1em; border: 2px solid var(--hjm-color-content-brand); border-inline-end-color: transparent; border-radius: 50%; animation: hjm-spin 800ms linear infinite; }
2152
2148
  .hjm-select__native + .hjm-select__indicator { margin-inline-start: calc(-1 * var(--hjm-space-lg)); }
2153
- .hjm-select__listbox { position: fixed; z-index: 800; max-inline-size: min(26.25rem, calc(100vw - (2 * var(--hjm-space-md)))); max-block-size: 22.5rem; overflow: auto; padding: var(--hjm-space-xxs); border: 1px solid var(--hjm-color-border); border-radius: var(--hjm-radius-md); background: var(--hjm-color-surface); box-shadow: 0 8px 24px rgb(0 0 0 / 18%); }
2149
+ .hjm-select__listbox { position: fixed; z-index: 800; max-inline-size: min(26.25rem, calc(100vw - (2 * var(--hjm-space-md)))); max-block-size: 22.5rem; overflow: auto; padding: var(--hjm-space-xxs); border: 1px solid var(--hjm-color-border); border-radius: var(--hjm-radius-md); background: var(--hjm-color-bg); box-shadow: 0 8px 24px rgb(0 0 0 / 18%); }
2154
2150
  .hjm-select__section-label { padding: var(--hjm-space-xs) var(--hjm-space-sm); color: var(--hjm-color-text-muted); font-size: var(--hjm-type-label-size); font-weight: var(--hjm-font-weight-semibold); }
2155
2151
  .hjm-select__option, .hjm-select__message { min-block-size: var(--hjm-control-min-touch-target); display: flex; align-items: center; gap: var(--hjm-space-sm); padding: var(--hjm-space-xs) var(--hjm-space-sm); border-radius: var(--hjm-radius-sm); overflow-wrap: anywhere; }
2156
2152
  .hjm-select[data-density="comfortable"] .hjm-select__option,
2157
2153
  .hjm-select__listbox[data-density="comfortable"] .hjm-select__option { min-block-size: 3.5rem; }
2158
2154
  .hjm-select__option { cursor: pointer; }
2159
- .hjm-select__option[data-active="true"] { background: var(--hjm-color-surface-alt); }
2155
+ .hjm-select__option[data-active="true"] { box-shadow: inset 0 0 0 1px var(--hjm-color-content-brand); background: var(--hjm-color-bg); }
2160
2156
  .hjm-select__option[data-state="selected"] { color: var(--hjm-color-content-brand); font-weight: var(--hjm-font-weight-bold); }
2161
2157
  .hjm-select__option[data-state="disabled"] { opacity: 0.5; cursor: not-allowed; }
2162
2158
  .hjm-select__option-copy { min-inline-size: 0; flex: 1 1 auto; display: grid; gap: var(--hjm-space-xxs); }
@@ -2182,7 +2178,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2182
2178
  padding: var(--hjm-space-xxs);
2183
2179
  border: 1px solid var(--hjm-color-border);
2184
2180
  border-radius: var(--hjm-radius-md);
2185
- background: var(--hjm-color-surface);
2181
+ background: var(--hjm-color-bg);
2186
2182
  box-shadow: 0 8px 24px rgb(0 0 0 / 18%);
2187
2183
  }
2188
2184
  .hjm-combobox__option,
@@ -2197,7 +2193,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2197
2193
  .hjm-combobox[data-density="comfortable"] .hjm-combobox__option,
2198
2194
  .hjm-combobox__listbox[data-density="comfortable"] .hjm-combobox__option { min-block-size: 3.5rem; }
2199
2195
  .hjm-combobox__option { cursor: pointer; }
2200
- .hjm-combobox__option[data-state="active"] { background: var(--hjm-color-surface-alt); }
2196
+ .hjm-combobox__option[data-state="active"] { box-shadow: inset 0 0 0 1px var(--hjm-color-content-brand); background: var(--hjm-color-bg); }
2201
2197
  .hjm-combobox__option[data-state="selected"] { color: var(--hjm-color-content-brand); font-weight: var(--hjm-font-weight-bold); }
2202
2198
  .hjm-combobox__option[data-state="disabled"] { opacity: 0.5; cursor: not-allowed; }
2203
2199
  .hjm-combobox__message { color: var(--hjm-color-text-muted); }
@@ -2241,7 +2237,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2241
2237
  cursor: pointer;
2242
2238
  }
2243
2239
  .hjm-accordion[data-density="compact"] .hjm-accordion__trigger { min-block-size: var(--hjm-control-min-touch-target); padding-block: var(--hjm-space-xs); }
2244
- .hjm-accordion__trigger:hover { background: var(--hjm-color-surface-alt); }
2240
+ .hjm-accordion__trigger:hover { background: var(--hjm-color-bg); }
2245
2241
  .hjm-accordion__trigger:disabled { opacity: 0.5; cursor: not-allowed; }
2246
2242
  .hjm-accordion__title { min-inline-size: 0; overflow-wrap: anywhere; }
2247
2243
  .hjm-accordion__indicator { flex: 0 0 auto; color: var(--hjm-color-text-muted); }
@@ -2255,7 +2251,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2255
2251
  border: 1px solid var(--hjm-color-border);
2256
2252
  border-radius: 50%;
2257
2253
  color: var(--hjm-color-text-muted);
2258
- background: var(--hjm-color-surface-alt);
2254
+ background: var(--hjm-color-bg);
2259
2255
  font-weight: var(--hjm-font-weight-bold);
2260
2256
  }
2261
2257
  .hjm-avatar[data-size="small"] { inline-size: 2rem; block-size: 2rem; font-size: var(--hjm-type-label-size); }
@@ -2278,10 +2274,10 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2278
2274
  .hjm-table__caption { padding: var(--hjm-space-sm); color: var(--hjm-color-text); font-weight: var(--hjm-font-weight-bold); text-align: start; }
2279
2275
  .hjm-table__header,
2280
2276
  .hjm-table__cell { padding: var(--hjm-space-sm); border-block-end: 1px solid var(--hjm-color-border); text-align: start; vertical-align: top; overflow-wrap: anywhere; }
2281
- .hjm-table__header { color: var(--hjm-color-text); background: var(--hjm-color-surface-alt); }
2277
+ .hjm-table__header { color: var(--hjm-color-text); background: var(--hjm-color-bg); }
2282
2278
  .hjm-table__header[data-align="center"], .hjm-table__cell[data-align="center"] { text-align: center; }
2283
2279
  .hjm-table__header[data-align="end"], .hjm-table__cell[data-align="end"] { text-align: end; }
2284
- .hjm-table__row:hover { background: var(--hjm-color-surface-alt); }
2280
+ .hjm-table__row:hover { background: var(--hjm-color-bg); }
2285
2281
  .hjm-table__sort { display: inline-flex; align-items: center; gap: var(--hjm-space-xxs); padding: var(--hjm-space-xxs); border: 0; color: inherit; background: transparent; font: inherit; font-weight: inherit; cursor: pointer; }
2286
2282
  .hjm-table__empty { padding: var(--hjm-space-xl); color: var(--hjm-color-text-muted); text-align: center; }
2287
2283
 
@@ -2306,7 +2302,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2306
2302
  border-radius: var(--hjm-radius-md);
2307
2303
  }
2308
2304
  .hjm-pagination__item { color: var(--hjm-color-text-body); background: transparent; font: inherit; cursor: pointer; }
2309
- .hjm-pagination__item:hover:not([aria-disabled="true"]) { background: var(--hjm-color-surface-alt); }
2305
+ .hjm-pagination__item:hover:not([aria-disabled="true"]) { background: var(--hjm-color-bg); }
2310
2306
  .hjm-pagination__item[data-state="current"] { border-color: var(--hjm-color-content-brand); color: var(--hjm-color-content-brand); font-weight: var(--hjm-font-weight-bold); }
2311
2307
  .hjm-pagination__item[aria-disabled="true"] { opacity: 0.5; cursor: not-allowed; }
2312
2308
  .hjm-pagination__ellipsis { color: var(--hjm-color-text-muted); }
@@ -2323,10 +2319,10 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2323
2319
  .hjm-steps { display: grid; grid-template-columns: repeat(var(--hjm-steps-count, auto-fit), minmax(0, 1fr)); gap: var(--hjm-space-xs); margin: 0; padding: 0; list-style: none; }
2324
2320
  .hjm-steps__step { min-inline-size: 0; display: grid; gap: var(--hjm-space-xs); }
2325
2321
  .hjm-steps__rail { display: flex; align-items: center; min-inline-size: 0; }
2326
- .hjm-steps__indicator { flex: 0 0 auto; inline-size: 1.5rem; block-size: 1.5rem; display: grid; place-items: center; border: 1px solid var(--hjm-color-border); border-radius: 50%; color: var(--hjm-color-text-muted); background: var(--hjm-color-surface); font-size: var(--hjm-type-label-size); font-weight: var(--hjm-font-weight-bold); }
2322
+ .hjm-steps__indicator { flex: 0 0 auto; inline-size: 1.5rem; block-size: 1.5rem; display: grid; place-items: center; border: 1px solid var(--hjm-color-border); border-radius: 50%; color: var(--hjm-color-text-muted); background: var(--hjm-color-bg); font-size: var(--hjm-type-label-size); font-weight: var(--hjm-font-weight-bold); }
2327
2323
  .hjm-steps__connector { flex: 1 1 auto; block-size: 1px; background: var(--hjm-color-border); }
2328
2324
  .hjm-steps__step[data-status="current"] .hjm-steps__indicator { border: 2px solid var(--hjm-color-content-brand); color: var(--hjm-color-content-brand); }
2329
- .hjm-steps__step[data-status="complete"] .hjm-steps__indicator { border-color: var(--hjm-accent-success); color: var(--hjm-accent-success); background: var(--hjm-color-surface-alt); }
2325
+ .hjm-steps__step[data-status="complete"] .hjm-steps__indicator { border-color: var(--hjm-accent-success); color: var(--hjm-accent-success); background: var(--hjm-color-bg); }
2330
2326
  .hjm-steps__step[data-status="complete"] .hjm-steps__connector { background: var(--hjm-color-content-brand); }
2331
2327
  .hjm-steps__step[data-status="error"] .hjm-steps__indicator { border: 2px solid var(--hjm-color-danger); color: var(--hjm-color-danger); background: var(--hjm-color-danger-fill); }
2332
2328
  .hjm-steps__copy { min-inline-size: 0; display: grid; gap: var(--hjm-space-xxs); padding-inline-end: var(--hjm-space-sm); }
@@ -2337,8 +2333,8 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2337
2333
 
2338
2334
  .hjm-file-picker { display: grid; gap: var(--hjm-space-xs); }
2339
2335
  .hjm-file-picker__label { color: var(--hjm-color-text); font-weight: var(--hjm-font-weight-semibold); }
2340
- .hjm-file-picker__dropzone { min-block-size: 8rem; display: grid; place-items: center; gap: var(--hjm-space-sm); padding: var(--hjm-space-xl); border: 1px dashed var(--hjm-color-border); border-radius: var(--hjm-radius-lg); color: var(--hjm-color-text-muted); background: var(--hjm-color-surface); text-align: center; }
2341
- .hjm-file-picker[data-dragging] .hjm-file-picker__dropzone { border-color: var(--hjm-color-focus); background: var(--hjm-color-surface-accent); }
2336
+ .hjm-file-picker__dropzone { min-block-size: 8rem; display: grid; place-items: center; gap: var(--hjm-space-sm); padding: var(--hjm-space-xl); border: 1px dashed var(--hjm-color-border); border-radius: var(--hjm-radius-lg); color: var(--hjm-color-text-muted); background: var(--hjm-color-bg); text-align: center; }
2337
+ .hjm-file-picker[data-dragging] .hjm-file-picker__dropzone { border-color: var(--hjm-color-focus); background: var(--hjm-color-bg); }
2342
2338
  .hjm-file-picker__dropzone button { min-block-size: var(--hjm-control-min-touch-target); padding-inline: var(--hjm-space-md); border: 0; border-radius: var(--hjm-radius-md); color: var(--hjm-color-content-brand); background: transparent; font: inherit; font-weight: var(--hjm-font-weight-bold); cursor: pointer; }
2343
2339
  .hjm-file-picker__hint { color: var(--hjm-color-text-muted); }
2344
2340
  .hjm-file-picker__error { color: var(--hjm-color-danger); }
@@ -2360,12 +2356,12 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2360
2356
  .hjm-date-picker { display: grid; gap: var(--hjm-space-xs); }
2361
2357
  .hjm-date-picker__label { color: var(--hjm-color-text); font-weight: var(--hjm-font-weight-semibold); }
2362
2358
  .hjm-date-picker__anchor { position: relative; display: flex; align-items: center; }
2363
- .hjm-date-picker__trigger { inline-size: 100%; min-block-size: var(--hjm-control-min-touch-target); display: flex; align-items: center; gap: var(--hjm-space-sm); padding-inline: var(--hjm-space-md) 3rem; border: 1px solid var(--hjm-color-border); border-radius: var(--hjm-radius-md); color: var(--hjm-color-text-body); background: var(--hjm-color-surface); font: inherit; text-align: start; cursor: pointer; }
2359
+ .hjm-date-picker__trigger { inline-size: 100%; min-block-size: var(--hjm-control-min-touch-target); display: flex; align-items: center; gap: var(--hjm-space-sm); padding-inline: var(--hjm-space-md) 3rem; border: 1px solid var(--hjm-color-border); border-radius: var(--hjm-radius-md); color: var(--hjm-color-text-body); background: var(--hjm-color-bg); font: inherit; text-align: start; cursor: pointer; }
2364
2360
  .hjm-date-picker[data-size="large"] .hjm-date-picker__trigger { min-block-size: 3.5rem; padding-inline-start: var(--hjm-space-lg); }
2365
2361
  .hjm-date-picker[data-invalid] .hjm-date-picker__trigger { border-color: var(--hjm-color-danger); }
2366
2362
  .hjm-date-picker__trigger [data-placeholder] { color: var(--hjm-color-text-muted); }
2367
2363
  .hjm-date-picker__clear { position: absolute; inset-inline-end: 0; inline-size: var(--hjm-control-min-touch-target); block-size: var(--hjm-control-min-touch-target); border: 0; color: var(--hjm-color-text-muted); background: transparent; font: inherit; cursor: pointer; }
2368
- .hjm-date-picker__popover { position: absolute; z-index: 800; inset-block-start: calc(100% + var(--hjm-space-xs)); inset-inline-start: 0; inline-size: min(22.5rem, calc(100vw - 2rem)); padding: var(--hjm-space-sm); border: 1px solid var(--hjm-color-border); border-radius: var(--hjm-radius-lg); color: var(--hjm-color-text); background: var(--hjm-color-surface); box-shadow: 0 8px 24px rgb(0 0 0 / 18%); }
2364
+ .hjm-date-picker__popover { position: absolute; z-index: 800; inset-block-start: calc(100% + var(--hjm-space-xs)); inset-inline-start: 0; inline-size: min(22.5rem, calc(100vw - 2rem)); padding: var(--hjm-space-sm); border: 1px solid var(--hjm-color-border); border-radius: var(--hjm-radius-lg); color: var(--hjm-color-text); background: var(--hjm-color-bg); box-shadow: 0 8px 24px rgb(0 0 0 / 18%); }
2369
2365
  .hjm-date-picker__description { color: var(--hjm-color-text-muted); }
2370
2366
  .hjm-date-picker__error { color: var(--hjm-color-danger); }
2371
2367
 
@@ -2462,7 +2458,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2462
2458
  .hjm-top-bar[data-large-text="true"] { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); }
2463
2459
  .hjm-top-bar[data-large-text="true"] .hjm-top-bar__title { grid-column: 1 / -1; grid-row: 2; padding-block: var(--hjm-space-xs); text-align: start; }
2464
2460
  .hjm-top-bar[data-large-text="true"] .hjm-top-bar__trailing { grid-column: 2; grid-row: 1; }
2465
- .hjm-bottom-cta { display: grid; gap: var(--hjm-bottom-cta-gap); min-block-size: var(--hjm-bottom-cta-min-height); padding: var(--hjm-bottom-cta-padding-top) var(--hjm-bottom-cta-padding-inline) max(var(--hjm-bottom-cta-padding-bottom), env(safe-area-inset-bottom, 0px), var(--hjm-bottom-cta-safe-area)); border-block-start: 1px solid var(--hjm-color-border); background: var(--hjm-color-surface); }
2461
+ .hjm-bottom-cta { display: grid; gap: var(--hjm-bottom-cta-gap); min-block-size: var(--hjm-bottom-cta-min-height); padding: var(--hjm-bottom-cta-padding-top) var(--hjm-bottom-cta-padding-inline) max(var(--hjm-bottom-cta-padding-bottom), env(safe-area-inset-bottom, 0px), var(--hjm-bottom-cta-safe-area)); border-block-start: 1px solid var(--hjm-color-border); background: var(--hjm-color-bg); }
2466
2462
  .hjm-bottom-cta[data-position="sticky"] { position: sticky; inset-block-end: 0; z-index: 1; }
2467
2463
  .hjm-bottom-cta__description { margin: 0; font-size: var(--hjm-type-caption-size); line-height: var(--hjm-type-caption-line-height); color: var(--hjm-color-text-muted); overflow-wrap: anywhere; }
2468
2464
  .hjm-bottom-cta__actions { display: flex; flex-wrap: wrap; gap: var(--hjm-bottom-cta-gap); }
@@ -2563,32 +2559,68 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2563
2559
  /* Both surfaces reuse the menu's floating look; only the anchor differs. */
2564
2560
  .hjm-context-menu-host { min-inline-size: 0; }
2565
2561
  .hjm-context-menu-host:focus-visible { outline: 2px solid var(--hjm-color-focus); outline-offset: 2px; }
2566
- .hjm-context-menu { position: fixed; max-inline-size: min(24rem, 90vw); max-block-size: calc(100dvh - (2 * var(--hjm-space-md))); overflow: auto; padding: var(--hjm-space-xxs); border: 1px solid var(--hjm-color-border); border-radius: var(--hjm-radius-md); background: var(--hjm-color-surface); box-shadow: 0 8px 24px rgb(0 0 0 / 18%); }
2562
+ .hjm-context-menu { position: fixed; max-inline-size: min(24rem, 90vw); max-block-size: calc(100dvh - (2 * var(--hjm-space-md))); overflow: auto; padding: var(--hjm-space-xxs); border: 1px solid var(--hjm-color-border); border-radius: var(--hjm-radius-md); background: var(--hjm-color-bg); box-shadow: 0 8px 24px rgb(0 0 0 / 18%); }
2567
2563
  .hjm-context-menu__item { min-block-size: var(--hjm-control-min-touch-target); display: flex; align-items: center; justify-content: space-between; gap: var(--hjm-space-sm); padding: var(--hjm-space-xs) var(--hjm-space-sm); border-radius: var(--hjm-radius-sm); color: var(--hjm-color-text-body); cursor: pointer; }
2568
- .hjm-context-menu__item[data-active] { background: var(--hjm-color-surface-alt); }
2564
+ /* Wrap long labels so commands stay readable inside the viewport-bounded menu; truncation was rejected because it hides command meaning. */
2565
+ .hjm-context-menu__item > span { min-inline-size: 0; overflow-wrap: anywhere; }
2566
+ .hjm-context-menu__item[data-active] { background: var(--hjm-color-bg); box-shadow: inset 0 0 0 1px var(--hjm-color-content-brand); }
2569
2567
  .hjm-context-menu__item[data-tone="danger"] { color: var(--hjm-color-danger); }
2570
2568
  .hjm-context-menu__item[aria-disabled="true"] { opacity: 0.5; cursor: not-allowed; }
2571
- .hjm-context-menu__shortcut { color: var(--hjm-color-text-muted); font-size: var(--hjm-type-label-size); }
2569
+ .hjm-context-menu__shortcut { flex: 0 0 auto; white-space: nowrap; color: var(--hjm-color-text-muted); font-size: var(--hjm-type-label-size); }
2572
2570
 
2573
2571
  .hjm-menubar { display: flex; flex-wrap: wrap; align-items: center; gap: var(--hjm-menubar-gap); min-block-size: var(--hjm-menubar-min-height); padding-inline: var(--hjm-menubar-padding); }
2574
2572
  .hjm-menubar__menu { position: relative; }
2575
2573
  .hjm-menubar__label { min-block-size: var(--hjm-control-min-touch-target); padding-inline: var(--hjm-menubar-label-padding); border: 0; border-radius: var(--hjm-menubar-label-radius); background: transparent; color: var(--hjm-color-text-body); font: inherit; cursor: pointer; }
2576
- .hjm-menubar__label[data-open] { background: var(--hjm-color-surface-accent); }
2574
+ .hjm-menubar__label[data-open] { background: var(--hjm-color-bg); box-shadow: inset 0 0 0 1px var(--hjm-color-content-brand); }
2577
2575
  .hjm-menubar__label:disabled { opacity: 0.5; cursor: not-allowed; }
2578
2576
  .hjm-menubar__label:focus-visible { outline: 2px solid var(--hjm-color-focus); outline-offset: 2px; }
2579
- .hjm-menubar__panel { position: absolute; inset-block-start: 100%; inset-inline-start: 0; z-index: 900; min-inline-size: 13.75rem; max-inline-size: min(24rem, 90vw); padding: var(--hjm-space-xxs); border: 1px solid var(--hjm-color-border); border-radius: var(--hjm-radius-md); background: var(--hjm-color-surface); box-shadow: 0 8px 24px rgb(0 0 0 / 18%); }
2577
+ .hjm-menubar__panel { position: absolute; inset-block-start: 100%; inset-inline-start: 0; z-index: 900; min-inline-size: 13.75rem; max-inline-size: min(24rem, 90vw); padding: var(--hjm-space-xxs); border: 1px solid var(--hjm-color-border); border-radius: var(--hjm-radius-md); background: var(--hjm-color-bg); box-shadow: 0 8px 24px rgb(0 0 0 / 18%); }
2580
2578
  .hjm-menubar__item { min-block-size: var(--hjm-control-min-touch-target); display: flex; align-items: center; justify-content: space-between; gap: var(--hjm-space-sm); padding: var(--hjm-space-xs) var(--hjm-space-sm); border-radius: var(--hjm-radius-sm); color: var(--hjm-color-text-body); cursor: pointer; }
2581
- .hjm-menubar__item[data-active] { background: var(--hjm-color-surface-alt); }
2579
+ .hjm-menubar__item[data-active] { background: var(--hjm-color-bg); box-shadow: inset 0 0 0 1px var(--hjm-color-content-brand); }
2582
2580
  .hjm-menubar__item[data-tone="danger"] { color: var(--hjm-color-danger); }
2583
2581
  .hjm-menubar__item[aria-disabled="true"] { opacity: 0.5; cursor: not-allowed; }
2584
2582
  .hjm-menubar__shortcut { color: var(--hjm-color-text-muted); font-size: var(--hjm-type-label-size); }
2585
2583
 
2586
2584
  /* Asset frame ------------------------------------------------------------ */
2587
2585
  .hjm-asset { position: relative; display: inline-flex; flex: 0 0 auto; }
2588
- .hjm-asset__frame { inline-size: var(--hjm-asset-size); block-size: var(--hjm-asset-size); display: grid; place-items: center; overflow: hidden; border: var(--hjm-stroke-default) solid var(--hjm-color-border); border-radius: var(--hjm-asset-radius); background: var(--hjm-color-surface-alt); }
2586
+ .hjm-asset__frame { inline-size: var(--hjm-asset-size); block-size: var(--hjm-asset-size); display: grid; place-items: center; overflow: hidden; border: var(--hjm-stroke-default) solid var(--hjm-color-border); border-radius: var(--hjm-asset-radius); background: var(--hjm-color-bg); }
2589
2587
  .hjm-asset__media { inline-size: 100%; block-size: 100%; display: grid; place-items: center; }
2590
2588
  .hjm-asset__media > * { max-inline-size: 100%; max-block-size: 100%; }
2591
2589
  /* The accessory hangs off the outer corner so it never covers the frame's middle. */
2592
2590
  .hjm-asset__accessory { position: absolute; inset-block-end: var(--hjm-asset-accessory-offset); inset-inline-end: var(--hjm-asset-accessory-offset); transform: translate(25%, 25%); display: inline-flex; }
2593
2591
  .hjm-asset-group { display: inline-flex; align-items: center; }
2594
2592
  .hjm-asset-group > .hjm-asset + .hjm-asset { margin-inline-start: var(--hjm-asset-overlap); }
2593
+
2594
+ /* Bloom owns geometry only; HJM owns target size, theme and keyboard focus. */
2595
+ .hjm-menu-morph { position: relative; z-index: 1; }
2596
+ .hjm-menu-morph [role="button"]:focus-visible, .hjm-menu-morph__item:focus-visible { outline: 2px solid var(--hjm-color-focus); outline-offset: -2px; }
2597
+ .hjm-menu-morph__item { display: flex; width: 100%; align-items: center; gap: var(--hjm-space-sm); min-height: var(--hjm-control-min-touch-target); padding: var(--hjm-space-sm); border: 0; background: transparent; color: inherit; font: inherit; text-align: start; cursor: pointer; }
2598
+ .hjm-menu-morph__item:hover, .hjm-menu-morph__item:focus { background: var(--hjm-color-bg); }
2599
+ .hjm-menu-morph__item[data-tone="danger"] { color: var(--hjm-color-danger); }
2600
+ .hjm-menu-morph__item:disabled { opacity: 0.5; cursor: not-allowed; }
2601
+
2602
+ /* Selected colors are user data; control surfaces keep the same canvas tokens as other inputs. */
2603
+ .hjm-color-picker { border: 1px solid var(--hjm-color-border); border-radius: var(--hjm-radius-md); background: var(--hjm-color-bg); color: var(--hjm-color-text); padding: 1rem; margin: 0; min-inline-size: 0; overflow-wrap: anywhere; }
2604
+ .hjm-color-picker legend { max-inline-size: 100%; overflow-wrap: anywhere; }
2605
+ .hjm-color-picker__row { display: flex; flex-wrap: wrap; gap: 0.75rem; }
2606
+ .hjm-color-picker label { display: flex; flex-direction: column; gap: 0.5rem; min-inline-size: 0; }
2607
+ .hjm-color-picker__hex { flex: 1 1 10rem; }
2608
+ .hjm-color-picker input { box-sizing: border-box; min-block-size: var(--hjm-color-picker-target); min-inline-size: 0; max-inline-size: 100%; border: 1px solid var(--hjm-color-border); border-radius: var(--hjm-radius-md); background: var(--hjm-color-bg); color: var(--hjm-color-text); font: inherit; }
2609
+ .hjm-color-picker input[type="text"] { inline-size: 100%; padding-inline: 0.5rem; }
2610
+ .hjm-color-picker input[type="color"] { inline-size: 3rem; padding: 0.25rem; }
2611
+ .hjm-color-picker__opacity { margin-block-start: 0.75rem; }
2612
+ .hjm-color-picker__opacity input[type="range"] { accent-color: var(--hjm-color-primary); }
2613
+ .hjm-color-picker__preview { block-size: 1.5rem; margin-block-start: 0.75rem; border: 1px solid var(--hjm-color-border); border-radius: var(--hjm-radius-md); }
2614
+ .hjm-color-picker__presets { display: flex; flex-wrap: wrap; gap: 0.5rem; margin-block-start: 0.75rem; }
2615
+ .hjm-color-picker__presets button { display: inline-flex; align-items: center; gap: 0.5rem; min-block-size: var(--hjm-color-picker-target); max-inline-size: 100%; overflow-wrap: anywhere; border: 1px solid var(--hjm-color-border); border-radius: var(--hjm-radius-md); padding: 0.5rem; background: var(--hjm-color-bg); color: var(--hjm-color-text); font: inherit; cursor: pointer; }
2616
+ .hjm-color-picker__presets button[aria-pressed="true"] { border-color: var(--hjm-color-primary); }
2617
+ .hjm-color-picker__swatch { inline-size: 1rem; block-size: 1rem; flex-shrink: 0; border: 1px solid var(--hjm-color-border); }
2618
+ .hjm-color-picker :is(input, button):focus-visible { outline: 2px solid var(--hjm-color-primary); outline-offset: 2px; }
2619
+ .hjm-color-picker__error { color: var(--hjm-color-danger); margin-block: 0.5rem; }
2620
+ .hjm-color-picker:disabled { opacity: 0.5; }
2621
+ /* SVG labels are decorative and print with the content; neither selection nor pointer input is intercepted. */
2622
+ .hjm-watermark { position: relative; isolation: isolate; }
2623
+ .hjm-watermark__content { position: relative; z-index: 0; overflow-wrap: anywhere; }
2624
+ .hjm-watermark__overlay { position: absolute; inset: 0; z-index: 1; pointer-events: none; user-select: none; overflow: hidden; color: var(--hjm-color-text-sub); font: inherit; }
2625
+ .hjm-affix { color: var(--hjm-color-text); background: var(--hjm-color-bg); overflow-wrap: anywhere; }
2626
+ .hjm-affix__marker { display: block; block-size: 0; pointer-events: none; }