@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
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); }
@@ -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; }
@@ -1160,7 +1149,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1160
1149
  border-radius: var(--hjm-radius-sm);
1161
1150
  overflow-wrap: anywhere;
1162
1151
  }
1163
- .hjm-mentions__option[aria-selected="true"] { background: var(--hjm-color-surface-accent); }
1152
+ .hjm-mentions__option[aria-selected="true"] { background: var(--hjm-color-bg); box-shadow: inset 0 0 0 1px var(--hjm-color-content-brand); }
1164
1153
  .hjm-mentions__description { color: var(--hjm-color-text-muted); font-size: var(--hjm-type-label-size); }
1165
1154
  .hjm-mentions__empty { margin: 0; padding: var(--hjm-space-xs); color: var(--hjm-color-text-muted); }
1166
1155
 
@@ -1217,7 +1206,12 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1217
1206
  border-radius: var(--hjm-radius-sm);
1218
1207
  overflow-wrap: anywhere;
1219
1208
  }
1220
- .hjm-transfer-list__option[aria-selected="true"] { background: var(--hjm-color-surface-accent); }
1209
+ /* The label is a flex item; reset its intrinsic min-width so long localized values wrap inside a narrow panel. */
1210
+ .hjm-transfer-list__option > span:last-child { min-inline-size: 0; overflow-wrap: anywhere; }
1211
+ /* Panel headings and empty-state copy share the same narrow column as rows. */
1212
+ .hjm-transfer-list__title,
1213
+ .hjm-transfer-list__empty { min-inline-size: 0; overflow-wrap: anywhere; }
1214
+ .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
1215
  .hjm-transfer-list__option[aria-disabled="true"] { color: var(--hjm-color-text-weak); }
1222
1216
  .hjm-transfer-list__option:focus-visible,
1223
1217
  .hjm-transfer-list__empty:focus-visible,
@@ -1226,12 +1220,8 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1226
1220
  .hjm-transfer-list__actions { display: flex; flex-direction: column; gap: var(--hjm-space-xs); padding-block-start: var(--hjm-space-xl); }
1227
1221
 
1228
1222
  /* 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
- */
1223
+ /* Provider guideline colors cannot follow the theme without failing provider review.
1224
+ HJM owns geometry and an outer focus ring that remains visible on every brand fill. */
1235
1225
  .hjm-auth-provider-button {
1236
1226
  display: flex;
1237
1227
  align-items: center;
@@ -1283,10 +1273,14 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1283
1273
  selection semantics underneath. The hovered preview uses the same states, so
1284
1274
  there is one set of rules rather than a committed and a provisional set.
1285
1275
  */
1276
+ /* Each hit/hover layer belongs to its own day. Without this containing block
1277
+ the last absolute layer covered the whole preview and stole pointer clicks. */
1278
+ .hjm-date-range .hjm-calendar__day { position: relative; isolation: isolate; }
1279
+ .hjm-date-range .hjm-calendar__day-label { position: relative; z-index: 1; pointer-events: none; }
1286
1280
  .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); }
1281
+ .hjm-date-range__cell[data-range="between"] { box-shadow: inset 0 -2px var(--hjm-color-content-brand); background: var(--hjm-color-bg); }
1288
1282
  .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); }
1283
+ .hjm-date-range__cell[data-range="end"] { background: var(--hjm-color-bg); outline: 2px solid var(--hjm-color-focus); }
1290
1284
  .hjm-date-range__cell[data-range="none"] { background: transparent; }
1291
1285
 
1292
1286
  /* AvatarGroup: overlap comes from the recipe ratio, not a per-size pixel value. */
@@ -1301,7 +1295,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1301
1295
  padding-inline: var(--hjm-space-xxs);
1302
1296
  border: 2px solid var(--hjm-color-bg);
1303
1297
  border-radius: var(--hjm-radius-full);
1304
- background: var(--hjm-color-surface-alt);
1298
+ background: var(--hjm-color-bg);
1305
1299
  color: var(--hjm-color-text-muted);
1306
1300
  font-size: var(--hjm-type-label-size);
1307
1301
  }
@@ -1321,7 +1315,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1321
1315
  .hjm-text-format[data-kind="code"] {
1322
1316
  padding-inline: var(--hjm-space-xxs);
1323
1317
  border-radius: var(--hjm-radius-sm);
1324
- background: var(--hjm-color-surface-alt);
1318
+ background: var(--hjm-color-bg);
1325
1319
  font-family: var(--hjm-font-family-code, ui-monospace, SFMono-Regular, Consolas, monospace);
1326
1320
  }
1327
1321
  .hjm-text-format[data-kind="kbd"] {
@@ -1346,6 +1340,9 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1346
1340
  position: absolute;
1347
1341
  inset-block-start: var(--hjm-skip-nav-offset);
1348
1342
  inset-inline-start: var(--hjm-skip-nav-offset);
1343
+ /* A localized skip label can be longer than a narrow viewport; keep the focused link on-screen. */
1344
+ box-sizing: border-box;
1345
+ max-inline-size: calc(100vw - var(--hjm-skip-nav-offset) * 2);
1349
1346
  z-index: 1300;
1350
1347
  display: inline-flex;
1351
1348
  align-items: center;
@@ -1355,6 +1352,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1355
1352
  background: var(--hjm-color-primary);
1356
1353
  color: var(--hjm-color-on-primary);
1357
1354
  text-decoration: none;
1355
+ overflow-wrap: anywhere;
1358
1356
  transform: translateY(calc(-100% - var(--hjm-skip-nav-offset) * 2));
1359
1357
  }
1360
1358
  .hjm-skip-nav:focus-visible,
@@ -1428,7 +1426,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1428
1426
  min-block-size: 100%;
1429
1427
  padding: var(--hjm-space-sm) var(--hjm-space-xs);
1430
1428
  border-inline-end: 1px solid var(--hjm-color-border);
1431
- background: var(--hjm-color-surface-alt);
1429
+ background: var(--hjm-color-bg);
1432
1430
  overflow: auto;
1433
1431
  }
1434
1432
  .hjm-sidebar__toggle {
@@ -1449,6 +1447,8 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1449
1447
  color: var(--hjm-color-text-muted);
1450
1448
  font-size: var(--hjm-type-label-size);
1451
1449
  font-weight: var(--hjm-type-label-weight);
1450
+ /* The rail has a fixed width; wrap long localized headings so their meaning stays visible instead of clipping or widening the shell. */
1451
+ overflow-wrap: anywhere;
1452
1452
  }
1453
1453
  .hjm-sidebar__list { display: flex; flex-direction: column; gap: var(--hjm-sidebar-gap); margin: 0; padding: 0; list-style: none; }
1454
1454
  .hjm-sidebar__item {
@@ -1463,10 +1463,10 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1463
1463
  overflow-wrap: anywhere;
1464
1464
  }
1465
1465
  .hjm-sidebar__item[aria-current="page"] {
1466
- background: var(--hjm-color-surface-accent);
1466
+ background: var(--hjm-color-bg);
1467
1467
  color: var(--hjm-color-content-brand);
1468
1468
  font-weight: var(--hjm-font-weight-semibold);
1469
- }
1469
+ box-shadow: inset 0 0 0 1px var(--hjm-color-content-brand); }
1470
1470
  .hjm-sidebar__item[aria-disabled="true"] { color: var(--hjm-color-text-weak); }
1471
1471
  .hjm-sidebar__item:focus-visible,
1472
1472
  .hjm-sidebar__toggle:focus-visible { outline: 2px solid var(--hjm-color-focus); outline-offset: -2px; }
@@ -1490,7 +1490,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1490
1490
  padding-inline: var(--hjm-toggle-padding);
1491
1491
  border: 1px solid var(--hjm-color-border-control);
1492
1492
  border-radius: var(--hjm-toggle-radius);
1493
- background: var(--hjm-color-surface);
1493
+ background: var(--hjm-color-bg);
1494
1494
  color: var(--hjm-color-text-body);
1495
1495
  font: inherit;
1496
1496
  cursor: pointer;
@@ -1498,7 +1498,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1498
1498
  /* The pressed state is announced by aria-pressed; color only reinforces it. */
1499
1499
  .hjm-toggle-group__item[aria-pressed="true"] {
1500
1500
  border-color: var(--hjm-color-focus);
1501
- background: var(--hjm-color-surface-accent);
1501
+ background: var(--hjm-color-bg);
1502
1502
  color: var(--hjm-color-content-brand);
1503
1503
  font-weight: var(--hjm-font-weight-semibold);
1504
1504
  }
@@ -1529,7 +1529,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1529
1529
  min-block-size: var(--hjm-tags-tag-min-height);
1530
1530
  padding-inline: var(--hjm-space-xs);
1531
1531
  border-radius: var(--hjm-radius-full);
1532
- background: var(--hjm-color-surface-alt);
1532
+ background: var(--hjm-color-bg);
1533
1533
  color: var(--hjm-color-text-body);
1534
1534
  overflow-wrap: anywhere;
1535
1535
  }
@@ -1554,7 +1554,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1554
1554
  min-inline-size: var(--hjm-tags-remove-target);
1555
1555
  min-block-size: var(--hjm-tags-remove-target);
1556
1556
  }
1557
- .hjm-tags-input__tag { position: relative; }
1557
+ .hjm-tags-input__tag { position: relative; border: 1px solid var(--hjm-color-border-control); }
1558
1558
  .hjm-tags-input__input {
1559
1559
  flex: 1 1 8ch;
1560
1560
  min-inline-size: 8ch;
@@ -1585,7 +1585,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1585
1585
  cursor: pointer;
1586
1586
  overflow-wrap: anywhere;
1587
1587
  }
1588
- .hjm-tags-input__suggestion[aria-selected="true"] { background: var(--hjm-color-surface-accent); }
1588
+ .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
1589
  .hjm-tags-input__suggestion[aria-disabled="true"] { color: var(--hjm-color-text-weak); cursor: default; }
1590
1590
  .hjm-tags-input__description { margin: 0; color: var(--hjm-color-text-muted); font-size: var(--hjm-type-label-size); }
1591
1591
  .hjm-tags-input[data-disabled] .hjm-tags-input__frame { opacity: 0.6; cursor: default; }
@@ -1665,7 +1665,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1665
1665
  gap: var(--hjm-space-sm);
1666
1666
  padding: var(--hjm-space-sm) var(--hjm-space-md);
1667
1667
  border-radius: var(--hjm-radius-md);
1668
- background: var(--hjm-color-surface-alt);
1668
+ background: var(--hjm-color-bg);
1669
1669
  font-size: var(--hjm-type-body-large-size);
1670
1670
  line-height: var(--hjm-type-body-large-line-height);
1671
1671
  }
@@ -1717,12 +1717,8 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1717
1717
  .hjm-agreement__detail:focus-visible { outline: 2px solid var(--hjm-color-focus); outline-offset: 2px; }
1718
1718
 
1719
1719
  /* 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
- */
1720
+ /* Flat aria-level treeitems match the contract's visible-node array and roving focus.
1721
+ WAI-ARIA permits this shape; depth is announced rather than inferred from indentation. */
1726
1722
  .hjm-tree { display: flex; flex-direction: column; }
1727
1723
  .hjm-tree__node {
1728
1724
  display: flex;
@@ -1735,7 +1731,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1735
1731
  color: var(--hjm-color-text);
1736
1732
  cursor: default;
1737
1733
  }
1738
- .hjm-tree__node[aria-selected="true"] { background: var(--hjm-color-surface-accent); }
1734
+ .hjm-tree__node[aria-selected="true"] { background: var(--hjm-color-bg); box-shadow: inset 0 0 0 1px var(--hjm-color-content-brand); }
1739
1735
  .hjm-tree__node[aria-disabled="true"] { color: var(--hjm-color-text-weak); }
1740
1736
  .hjm-tree__node:focus-visible { outline: 2px solid var(--hjm-color-focus); outline-offset: -2px; }
1741
1737
  .hjm-tree__indent { flex: 0 0 auto; inline-size: calc(var(--hjm-tree-depth) * var(--hjm-tree-indent)); }
@@ -1809,7 +1805,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1809
1805
  align-items: center;
1810
1806
  justify-content: center;
1811
1807
  padding: var(--hjm-space-md);
1812
- background: rgb(0 0 0 / 58%);
1808
+ background: var(--hjm-backdrop-modal);
1813
1809
  overscroll-behavior: contain;
1814
1810
  }
1815
1811
  .hjm-dialog,
@@ -1858,6 +1854,8 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1858
1854
  overflow-wrap: anywhere;
1859
1855
  }
1860
1856
  .hjm-dialog > .hjm-dialog__description { padding-inline: var(--hjm-space-lg); }
1857
+ /* Consumer-authored identifiers can be unbroken; keep modal body text inside the narrow viewport. */
1858
+ .hjm-dialog__body { overflow-wrap: anywhere; }
1861
1859
  .hjm-dialog__body,
1862
1860
  .hjm-sheet__body { padding: var(--hjm-space-lg); }
1863
1861
  .hjm-dialog__footer,
@@ -1976,12 +1974,8 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1976
1974
  .hjm-sheet[data-placement="end"] {
1977
1975
  block-size: calc(100dvh - (2 * var(--hjm-space-md)));
1978
1976
  }
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
- */
1977
+ /* sidePanelRecipe.content.radius=null: dock at a logical edge with full block height.
1978
+ Non-modal panels position themselves; no backdrop may block the interactive page. */
1985
1979
  .hjm-side-panel-positioner { padding: 0; }
1986
1980
  .hjm-side-panel-positioner[data-edge="start"] { justify-content: flex-start; }
1987
1981
  .hjm-side-panel-positioner[data-edge="end"] { justify-content: flex-end; }
@@ -1995,7 +1989,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1995
1989
  border: 1px solid var(--hjm-color-border);
1996
1990
  border-radius: 0;
1997
1991
  color: var(--hjm-color-text);
1998
- background: var(--hjm-color-surface);
1992
+ background: var(--hjm-color-bg);
1999
1993
  box-shadow: 0 16px 48px rgb(0 0 0 / 28%);
2000
1994
  }
2001
1995
  .hjm-side-panel[data-modal="false"] {
@@ -2047,13 +2041,9 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2047
2041
  padding: var(--hjm-space-sm) var(--hjm-space-lg)
2048
2042
  max(var(--hjm-space-sm), env(safe-area-inset-bottom, 0px));
2049
2043
  }
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; }
2044
+ /* Separate portals let Tour's veil cover the page while the shared popup helper anchors
2045
+ its card. The measured highlight ring is decorative and hidden from assistive tech. */
2046
+ .hjm-tour-backdrop { position: fixed; inset: 0; background: var(--hjm-backdrop-modal); pointer-events: auto; }
2057
2047
  .hjm-tour-highlight {
2058
2048
  position: fixed;
2059
2049
  border-radius: var(--hjm-radius-md);
@@ -2064,12 +2054,15 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2064
2054
  display: flex;
2065
2055
  flex-direction: column;
2066
2056
  gap: var(--hjm-space-sm);
2057
+ /* The anchored popup is viewport-height bounded; scrolling keeps long translations and actions usable without truncating copy or detaching controls. */
2058
+ overflow-y: auto;
2059
+ overscroll-behavior: contain;
2067
2060
  box-sizing: border-box;
2068
2061
  padding: var(--hjm-space-md);
2069
2062
  border: 1px solid var(--hjm-color-border);
2070
2063
  border-radius: var(--hjm-radius-md);
2071
2064
  color: var(--hjm-color-text);
2072
- background: var(--hjm-color-surface);
2065
+ background: var(--hjm-color-bg);
2073
2066
  box-shadow: 0 16px 48px rgb(0 0 0 / 28%);
2074
2067
  pointer-events: auto;
2075
2068
  }
@@ -2105,7 +2098,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2105
2098
  padding: var(--hjm-space-xxs);
2106
2099
  border: 1px solid var(--hjm-color-border);
2107
2100
  border-radius: var(--hjm-radius-md);
2108
- background: var(--hjm-color-surface);
2101
+ background: var(--hjm-color-bg);
2109
2102
  box-shadow: 0 8px 24px rgb(0 0 0 / 18%);
2110
2103
  }
2111
2104
  .hjm-menu__item {
@@ -2125,7 +2118,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2125
2118
  }
2126
2119
  .hjm-menu__content[data-density="comfortable"] .hjm-menu__item { min-block-size: 3.5rem; }
2127
2120
  .hjm-menu__item:hover,
2128
- .hjm-menu__item[data-focus="true"] { background: var(--hjm-color-surface-alt); }
2121
+ .hjm-menu__item[data-focus="true"] { background: var(--hjm-color-bg); box-shadow: inset 0 0 0 1px var(--hjm-color-content-brand); }
2129
2122
  .hjm-menu__item[data-tone="danger"] { color: var(--hjm-color-danger); }
2130
2123
  .hjm-menu__item[data-state="selected"] { color: var(--hjm-color-content-brand); font-weight: var(--hjm-font-weight-semibold); }
2131
2124
  .hjm-menu__item:disabled { opacity: 0.5; cursor: not-allowed; }
@@ -2150,13 +2143,13 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2150
2143
  .hjm-select__indicator { flex: 0 0 auto; color: var(--hjm-color-text-muted); pointer-events: none; }
2151
2144
  .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
2145
  .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%); }
2146
+ .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
2147
  .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
2148
  .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
2149
  .hjm-select[data-density="comfortable"] .hjm-select__option,
2157
2150
  .hjm-select__listbox[data-density="comfortable"] .hjm-select__option { min-block-size: 3.5rem; }
2158
2151
  .hjm-select__option { cursor: pointer; }
2159
- .hjm-select__option[data-active="true"] { background: var(--hjm-color-surface-alt); }
2152
+ .hjm-select__option[data-active="true"] { box-shadow: inset 0 0 0 1px var(--hjm-color-content-brand); background: var(--hjm-color-bg); }
2160
2153
  .hjm-select__option[data-state="selected"] { color: var(--hjm-color-content-brand); font-weight: var(--hjm-font-weight-bold); }
2161
2154
  .hjm-select__option[data-state="disabled"] { opacity: 0.5; cursor: not-allowed; }
2162
2155
  .hjm-select__option-copy { min-inline-size: 0; flex: 1 1 auto; display: grid; gap: var(--hjm-space-xxs); }
@@ -2182,7 +2175,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2182
2175
  padding: var(--hjm-space-xxs);
2183
2176
  border: 1px solid var(--hjm-color-border);
2184
2177
  border-radius: var(--hjm-radius-md);
2185
- background: var(--hjm-color-surface);
2178
+ background: var(--hjm-color-bg);
2186
2179
  box-shadow: 0 8px 24px rgb(0 0 0 / 18%);
2187
2180
  }
2188
2181
  .hjm-combobox__option,
@@ -2197,7 +2190,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2197
2190
  .hjm-combobox[data-density="comfortable"] .hjm-combobox__option,
2198
2191
  .hjm-combobox__listbox[data-density="comfortable"] .hjm-combobox__option { min-block-size: 3.5rem; }
2199
2192
  .hjm-combobox__option { cursor: pointer; }
2200
- .hjm-combobox__option[data-state="active"] { background: var(--hjm-color-surface-alt); }
2193
+ .hjm-combobox__option[data-state="active"] { box-shadow: inset 0 0 0 1px var(--hjm-color-content-brand); background: var(--hjm-color-bg); }
2201
2194
  .hjm-combobox__option[data-state="selected"] { color: var(--hjm-color-content-brand); font-weight: var(--hjm-font-weight-bold); }
2202
2195
  .hjm-combobox__option[data-state="disabled"] { opacity: 0.5; cursor: not-allowed; }
2203
2196
  .hjm-combobox__message { color: var(--hjm-color-text-muted); }
@@ -2241,7 +2234,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2241
2234
  cursor: pointer;
2242
2235
  }
2243
2236
  .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); }
2237
+ .hjm-accordion__trigger:hover { background: var(--hjm-color-bg); }
2245
2238
  .hjm-accordion__trigger:disabled { opacity: 0.5; cursor: not-allowed; }
2246
2239
  .hjm-accordion__title { min-inline-size: 0; overflow-wrap: anywhere; }
2247
2240
  .hjm-accordion__indicator { flex: 0 0 auto; color: var(--hjm-color-text-muted); }
@@ -2255,7 +2248,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2255
2248
  border: 1px solid var(--hjm-color-border);
2256
2249
  border-radius: 50%;
2257
2250
  color: var(--hjm-color-text-muted);
2258
- background: var(--hjm-color-surface-alt);
2251
+ background: var(--hjm-color-bg);
2259
2252
  font-weight: var(--hjm-font-weight-bold);
2260
2253
  }
2261
2254
  .hjm-avatar[data-size="small"] { inline-size: 2rem; block-size: 2rem; font-size: var(--hjm-type-label-size); }
@@ -2278,10 +2271,10 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2278
2271
  .hjm-table__caption { padding: var(--hjm-space-sm); color: var(--hjm-color-text); font-weight: var(--hjm-font-weight-bold); text-align: start; }
2279
2272
  .hjm-table__header,
2280
2273
  .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); }
2274
+ .hjm-table__header { color: var(--hjm-color-text); background: var(--hjm-color-bg); }
2282
2275
  .hjm-table__header[data-align="center"], .hjm-table__cell[data-align="center"] { text-align: center; }
2283
2276
  .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); }
2277
+ .hjm-table__row:hover { background: var(--hjm-color-bg); }
2285
2278
  .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
2279
  .hjm-table__empty { padding: var(--hjm-space-xl); color: var(--hjm-color-text-muted); text-align: center; }
2287
2280
 
@@ -2306,7 +2299,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2306
2299
  border-radius: var(--hjm-radius-md);
2307
2300
  }
2308
2301
  .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); }
2302
+ .hjm-pagination__item:hover:not([aria-disabled="true"]) { background: var(--hjm-color-bg); }
2310
2303
  .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
2304
  .hjm-pagination__item[aria-disabled="true"] { opacity: 0.5; cursor: not-allowed; }
2312
2305
  .hjm-pagination__ellipsis { color: var(--hjm-color-text-muted); }
@@ -2323,10 +2316,10 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2323
2316
  .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
2317
  .hjm-steps__step { min-inline-size: 0; display: grid; gap: var(--hjm-space-xs); }
2325
2318
  .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); }
2319
+ .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
2320
  .hjm-steps__connector { flex: 1 1 auto; block-size: 1px; background: var(--hjm-color-border); }
2328
2321
  .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); }
2322
+ .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
2323
  .hjm-steps__step[data-status="complete"] .hjm-steps__connector { background: var(--hjm-color-content-brand); }
2331
2324
  .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
2325
  .hjm-steps__copy { min-inline-size: 0; display: grid; gap: var(--hjm-space-xxs); padding-inline-end: var(--hjm-space-sm); }
@@ -2337,8 +2330,8 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2337
2330
 
2338
2331
  .hjm-file-picker { display: grid; gap: var(--hjm-space-xs); }
2339
2332
  .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); }
2333
+ .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; }
2334
+ .hjm-file-picker[data-dragging] .hjm-file-picker__dropzone { border-color: var(--hjm-color-focus); background: var(--hjm-color-bg); }
2342
2335
  .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
2336
  .hjm-file-picker__hint { color: var(--hjm-color-text-muted); }
2344
2337
  .hjm-file-picker__error { color: var(--hjm-color-danger); }
@@ -2360,12 +2353,12 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2360
2353
  .hjm-date-picker { display: grid; gap: var(--hjm-space-xs); }
2361
2354
  .hjm-date-picker__label { color: var(--hjm-color-text); font-weight: var(--hjm-font-weight-semibold); }
2362
2355
  .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; }
2356
+ .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
2357
  .hjm-date-picker[data-size="large"] .hjm-date-picker__trigger { min-block-size: 3.5rem; padding-inline-start: var(--hjm-space-lg); }
2365
2358
  .hjm-date-picker[data-invalid] .hjm-date-picker__trigger { border-color: var(--hjm-color-danger); }
2366
2359
  .hjm-date-picker__trigger [data-placeholder] { color: var(--hjm-color-text-muted); }
2367
2360
  .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%); }
2361
+ .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
2362
  .hjm-date-picker__description { color: var(--hjm-color-text-muted); }
2370
2363
  .hjm-date-picker__error { color: var(--hjm-color-danger); }
2371
2364
 
@@ -2462,7 +2455,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2462
2455
  .hjm-top-bar[data-large-text="true"] { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); }
2463
2456
  .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
2457
  .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); }
2458
+ .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
2459
  .hjm-bottom-cta[data-position="sticky"] { position: sticky; inset-block-end: 0; z-index: 1; }
2467
2460
  .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
2461
  .hjm-bottom-cta__actions { display: flex; flex-wrap: wrap; gap: var(--hjm-bottom-cta-gap); }
@@ -2563,32 +2556,42 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2563
2556
  /* Both surfaces reuse the menu's floating look; only the anchor differs. */
2564
2557
  .hjm-context-menu-host { min-inline-size: 0; }
2565
2558
  .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%); }
2559
+ .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
2560
  .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); }
2561
+ /* Wrap long labels so commands stay readable inside the viewport-bounded menu; truncation was rejected because it hides command meaning. */
2562
+ .hjm-context-menu__item > span { min-inline-size: 0; overflow-wrap: anywhere; }
2563
+ .hjm-context-menu__item[data-active] { background: var(--hjm-color-bg); box-shadow: inset 0 0 0 1px var(--hjm-color-content-brand); }
2569
2564
  .hjm-context-menu__item[data-tone="danger"] { color: var(--hjm-color-danger); }
2570
2565
  .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); }
2566
+ .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
2567
 
2573
2568
  .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
2569
  .hjm-menubar__menu { position: relative; }
2575
2570
  .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); }
2571
+ .hjm-menubar__label[data-open] { background: var(--hjm-color-bg); box-shadow: inset 0 0 0 1px var(--hjm-color-content-brand); }
2577
2572
  .hjm-menubar__label:disabled { opacity: 0.5; cursor: not-allowed; }
2578
2573
  .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%); }
2574
+ .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
2575
  .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); }
2576
+ .hjm-menubar__item[data-active] { background: var(--hjm-color-bg); box-shadow: inset 0 0 0 1px var(--hjm-color-content-brand); }
2582
2577
  .hjm-menubar__item[data-tone="danger"] { color: var(--hjm-color-danger); }
2583
2578
  .hjm-menubar__item[aria-disabled="true"] { opacity: 0.5; cursor: not-allowed; }
2584
2579
  .hjm-menubar__shortcut { color: var(--hjm-color-text-muted); font-size: var(--hjm-type-label-size); }
2585
2580
 
2586
2581
  /* Asset frame ------------------------------------------------------------ */
2587
2582
  .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); }
2583
+ .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
2584
  .hjm-asset__media { inline-size: 100%; block-size: 100%; display: grid; place-items: center; }
2590
2585
  .hjm-asset__media > * { max-inline-size: 100%; max-block-size: 100%; }
2591
2586
  /* The accessory hangs off the outer corner so it never covers the frame's middle. */
2592
2587
  .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
2588
  .hjm-asset-group { display: inline-flex; align-items: center; }
2594
2589
  .hjm-asset-group > .hjm-asset + .hjm-asset { margin-inline-start: var(--hjm-asset-overlap); }
2590
+
2591
+ /* Bloom owns geometry only; HJM owns target size, theme and keyboard focus. */
2592
+ .hjm-menu-morph { position: relative; z-index: 1; }
2593
+ .hjm-menu-morph [role="button"]:focus-visible, .hjm-menu-morph__item:focus-visible { outline: 2px solid var(--hjm-color-focus); outline-offset: -2px; }
2594
+ .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; }
2595
+ .hjm-menu-morph__item:hover, .hjm-menu-morph__item:focus { background: var(--hjm-color-bg); }
2596
+ .hjm-menu-morph__item[data-tone="danger"] { color: var(--hjm-color-danger); }
2597
+ .hjm-menu-morph__item:disabled { opacity: 0.5; cursor: not-allowed; }