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