@hjmds/react 1.27.1 → 1.28.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 (75) hide show
  1. package/dist/actions.d.ts +26 -4
  2. package/dist/actions.d.ts.map +1 -1
  3. package/dist/actions.js +4 -4
  4. package/dist/actions.js.map +1 -1
  5. package/dist/auth-screen.d.ts +32 -2
  6. package/dist/auth-screen.d.ts.map +1 -1
  7. package/dist/auth-screen.js +52 -4
  8. package/dist/auth-screen.js.map +1 -1
  9. package/dist/chart.d.ts +1 -1
  10. package/dist/chart.js.map +1 -1
  11. package/dist/collection-editing.d.ts.map +1 -1
  12. package/dist/collection-editing.js +5 -4
  13. package/dist/collection-editing.js.map +1 -1
  14. package/dist/communication.js +1 -1
  15. package/dist/communication.js.map +1 -1
  16. package/dist/data-table.d.ts +2 -2
  17. package/dist/data-table.d.ts.map +1 -1
  18. package/dist/data-table.js.map +1 -1
  19. package/dist/display.d.ts.map +1 -1
  20. package/dist/display.js +9 -3
  21. package/dist/display.js.map +1 -1
  22. package/dist/evidence.d.ts +1 -1
  23. package/dist/evidence.js +2 -2
  24. package/dist/evidence.js.map +1 -1
  25. package/dist/feedback.d.ts +10 -0
  26. package/dist/feedback.d.ts.map +1 -1
  27. package/dist/feedback.js +6 -1
  28. package/dist/feedback.js.map +1 -1
  29. package/dist/index.d.ts +1 -1
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +1 -1
  32. package/dist/index.js.map +1 -1
  33. package/dist/internal/list-row-scroll-room.d.ts +16 -0
  34. package/dist/internal/list-row-scroll-room.d.ts.map +1 -0
  35. package/dist/internal/list-row-scroll-room.js +17 -0
  36. package/dist/internal/list-row-scroll-room.js.map +1 -0
  37. package/dist/internal/screen-exit.d.ts.map +1 -1
  38. package/dist/internal/screen-exit.js +2 -1
  39. package/dist/internal/screen-exit.js.map +1 -1
  40. package/dist/notification-bell.d.ts +4 -1
  41. package/dist/notification-bell.d.ts.map +1 -1
  42. package/dist/notification-bell.js +5 -2
  43. package/dist/notification-bell.js.map +1 -1
  44. package/dist/overlays.js +2 -2
  45. package/dist/overlays.js.map +1 -1
  46. package/dist/saved-items.js +1 -1
  47. package/dist/saved-items.js.map +1 -1
  48. package/dist/screen-flows.d.ts +2 -2
  49. package/dist/screen-flows.d.ts.map +1 -1
  50. package/dist/screen-flows.js +14 -13
  51. package/dist/screen-flows.js.map +1 -1
  52. package/dist/screens.d.ts +1 -1
  53. package/dist/screens.d.ts.map +1 -1
  54. package/dist/screens.js +2 -2
  55. package/dist/screens.js.map +1 -1
  56. package/dist/selection.d.ts.map +1 -1
  57. package/dist/selection.js +2 -2
  58. package/dist/selection.js.map +1 -1
  59. package/dist/styles.css +271 -125
  60. package/dist/styles.layered.css +271 -125
  61. package/dist/theme.d.ts.map +1 -1
  62. package/dist/theme.js +40 -4
  63. package/dist/theme.js.map +1 -1
  64. package/dist/toast.d.ts.map +1 -1
  65. package/dist/toast.js +4 -1
  66. package/dist/toast.js.map +1 -1
  67. package/dist/top.js +1 -1
  68. package/dist/top.js.map +1 -1
  69. package/dist/upload-item.d.ts.map +1 -1
  70. package/dist/upload-item.js +1 -1
  71. package/dist/upload-item.js.map +1 -1
  72. package/dist/virtual-list.d.ts.map +1 -1
  73. package/dist/virtual-list.js +5 -1
  74. package/dist/virtual-list.js.map +1 -1
  75. package/package.json +3 -3
@@ -62,9 +62,9 @@
62
62
  .hjm-text[data-variant="title"] { font-size: var(--hjm-type-title-size); line-height: var(--hjm-type-title-line-height); }
63
63
  .hjm-text[data-variant="titleLarge"] { font-size: var(--hjm-type-title-large-size); line-height: var(--hjm-type-title-large-line-height); }
64
64
  .hjm-text[data-variant="heading"] { font-size: var(--hjm-type-heading-size); line-height: var(--hjm-type-heading-line-height); }
65
- .hjm-text[data-emphasis="regular"] { font-weight: var(--hjm-font-weight-regular); }
66
- .hjm-text[data-emphasis="medium"] { font-weight: var(--hjm-font-weight-semibold); }
67
- .hjm-text[data-emphasis="strong"] { font-weight: var(--hjm-font-weight-bold); }
65
+ .hjm-text[data-emphasis="regular"] { font-weight: var(--hjm-text-emphasis-regular); }
66
+ .hjm-text[data-emphasis="medium"] { font-weight: var(--hjm-text-emphasis-medium); }
67
+ .hjm-text[data-emphasis="strong"] { font-weight: var(--hjm-text-emphasis-strong); }
68
68
  .hjm-text[data-tone="primary"] { color: var(--hjm-color-text); }
69
69
  .hjm-text[data-tone="body"] { color: var(--hjm-color-text-body); }
70
70
  .hjm-text[data-tone="muted"] { color: var(--hjm-color-text-muted); }
@@ -162,7 +162,7 @@
162
162
  border-radius: var(--hjm-radius-md);
163
163
  color: var(--hjm-color-on-primary);
164
164
  background: var(--hjm-color-primary);
165
- font-weight: var(--hjm-font-weight-semibold);
165
+ font-weight: var(--hjm-text-emphasis-medium);
166
166
  text-decoration: none;
167
167
  transform: translateY(calc(-100% - (2 * var(--hjm-space-sm))));
168
168
  transition: transform var(--hjm-motion-fast);
@@ -214,7 +214,7 @@
214
214
  .hjm-icon-button,
215
215
  .hjm-link {
216
216
  font: inherit;
217
- font-weight: var(--hjm-font-weight-semibold);
217
+ font-weight: var(--hjm-text-emphasis-medium);
218
218
  transition: background-color var(--hjm-motion-fast), color var(--hjm-motion-fast), opacity var(--hjm-motion-fast), transform var(--hjm-motion-fast);
219
219
  }
220
220
  .hjm-button,
@@ -304,6 +304,23 @@
304
304
  .hjm-icon-button[data-size="small"] { inline-size: var(--hjm-control-button-small); block-size: var(--hjm-control-button-small); min-inline-size: 0; min-block-size: 0; }
305
305
  .hjm-icon-button[data-size="small"]::after { content: ""; position: absolute; inset: calc(-1 * var(--hjm-space-xxs)); }
306
306
  .hjm-icon-button[data-size="large"] { inline-size: var(--hjm-control-button-large); block-size: var(--hjm-control-button-large); }
307
+ /* Edge alignment (iconButtonRecipe.edge / resolveButtonEdgeOverhang, 2026-10-17 measured audit): a ghost control on a
308
+ container edge keeps its hit area but overhangs that edge, so its glyph slot or label sits on the inset like text.
309
+ Framed tones never get an overhang variable and stay put. Logical margins mirror in RTL. */
310
+ .hjm-icon-button[data-tone="ghost"] { --hjm-edge-overhang: var(--hjm-icon-button-edge-medium); }
311
+ .hjm-icon-button[data-tone="ghost"][data-size="small"] { --hjm-edge-overhang: var(--hjm-icon-button-edge-small); }
312
+ .hjm-icon-button[data-tone="ghost"][data-size="large"] { --hjm-edge-overhang: var(--hjm-icon-button-edge-large); }
313
+ /* + 1px: every Web button keeps a 1px transparent frame border (.hjm-button above) inside which the padding starts;
314
+ Native ghost buttons have no border, so their overhang is the padding alone. */
315
+ .hjm-button[data-tone="ghost"] { --hjm-edge-overhang: calc(var(--hjm-button-edge-medium) + 1px); }
316
+ .hjm-button[data-tone="ghost"][data-size="small"] { --hjm-edge-overhang: calc(var(--hjm-button-edge-small) + 1px); }
317
+ .hjm-button[data-tone="ghost"][data-size="large"] { --hjm-edge-overhang: calc(var(--hjm-button-edge-large) + 1px); }
318
+ :is(.hjm-icon-button, .hjm-button):is([data-edge="start"], [data-edge="both"]) { margin-inline-start: calc(-1 * var(--hjm-edge-overhang, 0px)); }
319
+ :is(.hjm-icon-button, .hjm-button):is([data-edge="end"], [data-edge="both"]) { margin-inline-end: calc(-1 * var(--hjm-edge-overhang, 0px)); }
320
+ /* NotificationBell wraps a default (ghost, medium) IconButton with a badge anchored to its own end, so the bell root
321
+ takes the same overhang and the badge keeps the icon's corner (2026-10-17 1.27.2 adoption: Spint's top-bar bell). */
322
+ .hjm-notification-bell:is([data-edge="start"], [data-edge="both"]) { margin-inline-start: calc(-1 * var(--hjm-icon-button-edge-medium)); }
323
+ .hjm-notification-bell:is([data-edge="end"], [data-edge="both"]) { margin-inline-end: calc(-1 * var(--hjm-icon-button-edge-medium)); }
307
324
  .hjm-link { display: inline-flex; align-items: center; gap: var(--hjm-space-xxs); max-inline-size: 100%; min-inline-size: 0; overflow-wrap: anywhere; color: var(--hjm-color-content-brand); text-underline-offset: 0.18em; }
308
325
  .hjm-link[data-tone="neutral"] { color: var(--hjm-color-text-body); }
309
326
  .hjm-link[data-variant="standalone"] { min-block-size: var(--hjm-control-min-touch-target); min-inline-size: var(--hjm-control-min-touch-target); justify-content: center; text-decoration: none; }
@@ -323,12 +340,15 @@
323
340
  outline: var(--hjm-focus-width) solid var(--hjm-color-focus);
324
341
  outline-offset: var(--hjm-focus-offset);
325
342
  }
343
+ /* An edge-aligned control overhangs into the container padding, where an outer ring can be clipped by the container's
344
+ overflow (lists, cards); draw the ring inside its own box instead, as the Toast close does. */
345
+ :is(.hjm-icon-button, .hjm-button)[data-edge]:focus-visible, .hjm-notification-bell[data-edge] > .hjm-icon-button:focus-visible { outline-offset: calc(-1 * var(--hjm-focus-width)); }
326
346
 
327
347
  /* Input interiors use the theme canvas (white in light mode), not tinted
328
348
  surfaces. Focus and selection still use blue borders and compact indicators. */
329
349
  .hjm-field {
330
350
  font-family: var(--hjm-font-family-ui, inherit); display: grid; gap: var(--hjm-space-xs); min-inline-size: 0; }
331
- .hjm-field__label { color: var(--hjm-color-text-body); font-weight: var(--hjm-font-weight-semibold); }
351
+ .hjm-field__label { color: var(--hjm-color-text-body); font-weight: var(--hjm-text-emphasis-medium); }
332
352
  .hjm-field__control {
333
353
  display: flex;
334
354
  align-items: center;
@@ -467,7 +487,7 @@
467
487
  background: var(--hjm-color-bg);
468
488
  font-size: var(--hjm-type-title-size);
469
489
  line-height: var(--hjm-type-title-line-height);
470
- font-weight: var(--hjm-font-weight-semibold);
490
+ font-weight: var(--hjm-text-emphasis-medium);
471
491
  }
472
492
  .hjm-otp-field__control[data-size="large"] .hjm-otp-field__slot { font-size: var(--hjm-type-title-large-size); line-height: var(--hjm-type-title-large-line-height); }
473
493
  .hjm-otp-field__slot[data-state="filled"] { border-color: var(--hjm-color-content-brand); }
@@ -556,8 +576,8 @@
556
576
  .hjm-bottom-navigation__indicator[data-state="selected"] > :first-child { transform: scale(1.06); }
557
577
  /* Icon-only items center the indicator in the density's minimum height instead of leaving an empty label row. */
558
578
  .hjm-bottom-navigation[data-labels="hidden"] .hjm-bottom-navigation__item { justify-content: center; }
559
- .hjm-bottom-navigation__label { font-size: var(--hjm-type-caption-size); line-height: var(--hjm-type-caption-line-height); font-weight: var(--hjm-font-weight-semibold); }
560
- .hjm-bottom-navigation__item[data-state="selected"] .hjm-bottom-navigation__label { font-weight: var(--hjm-font-weight-bold); }
579
+ .hjm-bottom-navigation__label { font-size: var(--hjm-type-caption-size); line-height: var(--hjm-type-caption-line-height); font-weight: var(--hjm-text-emphasis-medium); }
580
+ .hjm-bottom-navigation__item[data-state="selected"] .hjm-bottom-navigation__label { font-weight: var(--hjm-font-weight-semibold); }
561
581
  .hjm-bottom-navigation__badge {
562
582
  position: absolute;
563
583
  inset-block-start: calc(-1 * var(--hjm-space-xxs));
@@ -767,9 +787,9 @@
767
787
  .hjm-choice[data-state="mixed"] .hjm-choice__indicator::after, .hjm-choice__indicator[data-state="mixed"]::after { content: ""; inline-size: 10px; block-size: 2px; background: var(--hjm-color-on-primary); }
768
788
  .hjm-choice__copy { display: grid; gap: var(--hjm-space-xxs); padding-block: 2px; }
769
789
  .hjm-choice[data-state="checked"] .hjm-choice__copy > :first-child,
770
- .hjm-choice[data-state="mixed"] .hjm-choice__copy > :first-child { font-weight: var(--hjm-font-weight-bold); }
790
+ .hjm-choice[data-state="mixed"] .hjm-choice__copy > :first-child { font-weight: var(--hjm-font-weight-semibold); }
771
791
  .hjm-radio-group { min-inline-size: 0; padding: 0; border: 0; }
772
- .hjm-radio-group legend { margin-block-end: var(--hjm-space-xs); font-weight: var(--hjm-font-weight-semibold); }
792
+ .hjm-radio-group legend { margin-block-end: var(--hjm-space-xs); font-weight: var(--hjm-text-emphasis-medium); }
773
793
  .hjm-radio-group__items { display: flex; flex-direction: column; gap: var(--hjm-space-xs); }
774
794
  .hjm-radio-group[data-presentation="plain"] .hjm-radio-group__items { gap: var(--hjm-space-xxs); }
775
795
  .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); }
@@ -777,7 +797,7 @@
777
797
  .hjm-radio-group[data-orientation="horizontal"][data-presentation="plain"] .hjm-radio-group__items { gap: var(--hjm-space-sm); }
778
798
  .hjm-radio-group[data-orientation="horizontal"][data-presentation="grouped"] .hjm-radio-group__items { gap: 0; }
779
799
  .hjm-checkbox-group { min-inline-size: 0; margin: 0; padding: 0; border: 0; }
780
- .hjm-checkbox-group legend { margin-block-end: var(--hjm-space-xs); font-weight: var(--hjm-font-weight-semibold); }
800
+ .hjm-checkbox-group legend { margin-block-end: var(--hjm-space-xs); font-weight: var(--hjm-text-emphasis-medium); }
781
801
  .hjm-checkbox-group__items { display: flex; flex-direction: column; gap: var(--hjm-space-xs); }
782
802
  .hjm-checkbox-group[data-presentation="plain"] .hjm-checkbox-group__items { gap: var(--hjm-space-xxs); }
783
803
  .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); }
@@ -799,8 +819,9 @@
799
819
  .hjm-switch__copy { display: flex; flex-direction: column; gap: var(--hjm-space-xxs); min-inline-size: 0; text-align: start; overflow-wrap: anywhere; }
800
820
  .hjm-switch__description { color: var(--hjm-color-text-muted); font-size: var(--hjm-type-caption-size); line-height: var(--hjm-type-caption-line-height); }
801
821
  .hjm-switch[data-presentation="row"] { display: flex; inline-size: 100%; justify-content: space-between; }
802
- /* switchRecipe.rowTwoLineMinHeight (= list-row comfortable two-line 68), same as Native for a described switch. */
803
- .hjm-switch[data-two-line="true"] { min-block-size: var(--hjm-switch-row-two-line-min-height); }
822
+ /* A described switch: copy + switchRecipe.rowPaddingVertical 8 on both sides, min rowTwoLineMinHeight 56, same as Native.
823
+ Stacked switch rows carry this spacing themselves; containers add no gap between them (2026-10-17). */
824
+ .hjm-switch[data-two-line="true"] { min-block-size: var(--hjm-switch-row-two-line-min-height); padding-block: var(--hjm-switch-row-padding-vertical); }
804
825
  .hjm-switch[data-presentation="row"] .hjm-switch__copy { order: -1; flex: 1; }
805
826
  /* Inherited layout variables reset at nested providers and keep ./selection independent. */
806
827
  .hjm-root { --hjm-switch-row-direction: row; --hjm-switch-row-align: center; --hjm-switch-copy-flex: 1; }
@@ -821,15 +842,24 @@
821
842
  /* margin: 0 resets the UA fieldset 2px inline margin (as the other HJM fieldsets do); it offset the track from the parent edges. */
822
843
  .hjm-segmented { min-inline-size: 0; margin: 0; padding: 0; border: 0; }
823
844
  /* segmentedControlRecipe (2026-10-06 follow-up): track padding/gap spacing.xxs 4, radius lg, 1px border; item radius md,
824
- medium 44 · padding md, small 36 · padding sm with a 4px vertical hit slop. Web had drawn a 2px track with radius md,
825
- no small size, and a 1px selected ring; Native already read the recipe. */
826
- .hjm-segmented__items { display: flex; min-inline-size: 0; gap: var(--hjm-space-xxs); padding: var(--hjm-space-xxs); border: 1px solid var(--hjm-color-border); border-radius: var(--hjm-radius-lg); background: var(--hjm-color-bg); overflow-x: auto; }
827
- .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; gap: var(--hjm-space-xxs); padding: 0 var(--hjm-space-md); border-radius: var(--hjm-radius-md); color: var(--hjm-color-text-muted); font-weight: var(--hjm-font-weight-semibold); cursor: pointer; }
828
- .hjm-segmented[data-size="small"]:not([data-presentation="pills"]) .hjm-segmented__item { min-block-size: 36px; padding-inline: var(--hjm-space-sm); font-size: var(--hjm-type-label-size); line-height: var(--hjm-type-label-line-height); }
845
+ padding md (medium) / sm (small). Web had drawn a 2px track with radius md, no small size, and a 1px selected ring;
846
+ Native already read the recipe. */
847
+ /* 2026-10-17 ("높이 맞춰"): the connected control's OUTER height is the Button/Chip height of its size
848
+ (--hjm-segmented-height, segmentedControlRecipe.sizes.height); options get that minus the 4 padding + 1 border on
849
+ each side and reach the 44 target with an invisible vertical ::after. The scroller sits outside the drawn track and
850
+ reaches past a short track by negative margin, so neither the hit area is clipped nor the layout grows. */
851
+ .hjm-segmented { --hjm-segmented-height: var(--hjm-control-button-medium); }
852
+ .hjm-segmented[data-size="small"] { --hjm-segmented-height: var(--hjm-control-button-small); }
853
+ .hjm-segmented__scroller { min-inline-size: 0; overflow-x: auto; }
854
+ .hjm-segmented:where(:not([data-presentation="pills"]):not([data-presentation="text"])) .hjm-segmented__scroller { --hjm-segmented-outer-slop: max(0px, (var(--hjm-control-min-touch-target) - var(--hjm-segmented-height)) / 2); padding-block: var(--hjm-segmented-outer-slop); margin-block: calc(-1 * var(--hjm-segmented-outer-slop)); }
855
+ .hjm-segmented:where(:not([data-presentation="pills"]):not([data-presentation="text"])) .hjm-segmented__items { inline-size: max-content; min-inline-size: 100%; }
856
+ .hjm-segmented__items { display: flex; min-inline-size: 0; gap: var(--hjm-space-xxs); padding: var(--hjm-space-xxs); border: 1px solid var(--hjm-color-border); border-radius: var(--hjm-radius-lg); background: var(--hjm-color-bg); }
857
+ .hjm-segmented__item { position: relative; flex: 1 1 0; min-inline-size: max-content; min-block-size: calc(var(--hjm-segmented-height) - 2 * (var(--hjm-space-xxs) + 1px)); display: grid; place-items: center; gap: var(--hjm-space-xxs); padding: 0 var(--hjm-space-md); border-radius: var(--hjm-radius-md); color: var(--hjm-color-text-muted); font-weight: var(--hjm-text-emphasis-medium); cursor: pointer; }
858
+ .hjm-segmented[data-size="small"]:not([data-presentation="pills"]) .hjm-segmented__item { padding-inline: var(--hjm-space-sm); font-size: var(--hjm-type-label-size); line-height: var(--hjm-type-label-line-height); }
829
859
  /* Vertical only: neighbours are 4px apart, so a horizontal slop would overlap the next option's target. */
830
- .hjm-segmented[data-size="small"]:not([data-presentation="pills"]) .hjm-segmented__item::after { content: ""; position: absolute; inset: -4px 0; }
860
+ .hjm-segmented:where(:not([data-presentation="pills"]):not([data-presentation="text"])) .hjm-segmented__item::after { content: ""; position: absolute; inset: calc((var(--hjm-segmented-height) - 2 * (var(--hjm-space-xxs) + 1px) - var(--hjm-control-min-touch-target)) / 2) 0; }
831
861
  .hjm-segmented__item input { position: absolute; opacity: 0; }
832
- .hjm-segmented__item[data-state="checked"] { box-shadow: inset 0 0 0 2px var(--hjm-color-focus); color: var(--hjm-color-content-brand); background: var(--hjm-color-bg); font-weight: var(--hjm-font-weight-bold); }
862
+ .hjm-segmented__item[data-state="checked"] { box-shadow: inset 0 0 0 2px var(--hjm-color-focus); color: var(--hjm-color-content-brand); background: var(--hjm-color-bg); font-weight: var(--hjm-font-weight-semibold); }
833
863
  .hjm-segmented__item[data-disabled="true"] { opacity: 0.5; cursor: not-allowed; }
834
864
 
835
865
  /* segmentedControlRecipe.adaptive.largeTextLayout stacks oversized labels, matching RN.
@@ -840,17 +870,19 @@
840
870
  Pills are excluded (segmentedControlRecipe.pills.largeTextLayout "wrap", 1.13.1): they wrap in a block and
841
871
  stay one line in a scroll rail. Stacking them turned a filter rail into a tall column (utilverse, 2026-10-06). */
842
872
  @media (max-width: 11em) {
843
- .hjm-segmented:not([data-presentation="pills"]) .hjm-segmented__items { flex-direction: column; overflow-x: visible; }
844
- .hjm-segmented:not([data-presentation="pills"]) .hjm-segmented__item { flex: 0 0 auto; min-inline-size: 0; }
873
+ .hjm-segmented:not([data-presentation="pills"]) .hjm-segmented__items { flex-direction: column; overflow-x: visible; inline-size: auto; }
874
+ .hjm-segmented:not([data-presentation="pills"]) .hjm-segmented__item { flex: 0 0 auto; min-inline-size: 0; min-block-size: var(--hjm-control-min-touch-target); }
875
+ .hjm-segmented:not([data-presentation="pills"]) .hjm-segmented__item::after { inset: 0; }
845
876
  }
846
- [data-large-text="true"] .hjm-segmented:not([data-presentation="pills"]) .hjm-segmented__items { flex-direction: column; overflow-x: visible; }
847
- [data-large-text="true"] .hjm-segmented:not([data-presentation="pills"]) .hjm-segmented__item { flex: 0 0 auto; min-inline-size: 0; }
877
+ [data-large-text="true"] .hjm-segmented:not([data-presentation="pills"]) .hjm-segmented__items { flex-direction: column; overflow-x: visible; inline-size: auto; }
878
+ [data-large-text="true"] .hjm-segmented:not([data-presentation="pills"]) .hjm-segmented__item { flex: 0 0 auto; min-inline-size: 0; min-block-size: var(--hjm-control-min-touch-target); }
879
+ [data-large-text="true"] .hjm-segmented:not([data-presentation="pills"]) .hjm-segmented__item::after { inset: 0; }
848
880
 
849
881
  .hjm-tabs { min-inline-size: 0; }
850
882
  .hjm-tabs__list { display: flex; gap: var(--hjm-space-xs); min-inline-size: 0; overflow-x: auto; border-block-end: 1px solid var(--hjm-color-border); }
851
883
  .hjm-tabs[data-overflow="clip"] .hjm-tabs__list { overflow: hidden; }
852
884
  .hjm-tabs[data-layout="fitted"] .hjm-tabs__tab { flex: 1 1 0; }
853
- .hjm-tabs__tab { position: relative; min-block-size: 48px; padding: var(--hjm-space-xs) var(--hjm-space-md); border: 0; color: var(--hjm-color-text-muted); background: transparent; font: inherit; font-weight: var(--hjm-font-weight-semibold); white-space: nowrap; cursor: pointer; }
885
+ .hjm-tabs__tab { position: relative; min-block-size: 48px; padding: var(--hjm-space-xs) var(--hjm-space-md); border: 0; color: var(--hjm-color-text-muted); background: transparent; font: inherit; font-weight: var(--hjm-text-emphasis-medium); white-space: nowrap; cursor: pointer; }
854
886
  .hjm-tabs[data-size="small"] .hjm-tabs__tab { min-block-size: 44px; padding-inline: var(--hjm-space-sm); font-size: var(--hjm-type-label-size); line-height: var(--hjm-type-label-line-height); }
855
887
  .hjm-tabs__leading { display: inline-flex; flex: 0 0 auto; align-items: center; margin-inline-end: var(--hjm-space-xs); }
856
888
  .hjm-tabs__tab[data-state="selected"] { color: var(--hjm-color-text); }
@@ -865,7 +897,7 @@
865
897
  .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; }
866
898
 
867
899
  .hjm-badge, .hjm-tag { display: inline-flex; align-items: center; gap: var(--hjm-space-xxs); max-inline-size: 100%; overflow-wrap: anywhere; }
868
- .hjm-badge { min-block-size: 24px; padding: 2px var(--hjm-space-xs); border: 1px solid var(--hjm-color-border); 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); }
900
+ .hjm-badge { min-block-size: 24px; padding: 2px var(--hjm-space-xs); border: 1px solid var(--hjm-color-border); 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-text-emphasis-medium); }
869
901
  .hjm-badge[data-size="small"] { min-block-size: 20px; padding-inline: var(--hjm-space-xxs); font-size: var(--hjm-type-caption-size); } /* badgeRecipe.sizes.small.paddingHorizontal xxs 4 (2026-10-06; Web had kept medium's 8) */
870
902
  .hjm-badge[data-tone="strong"] { color: var(--hjm-color-bg); background: var(--hjm-color-text); border-color: transparent; } /* neutral/brand plates are canvas-white and need badgeRecipe's border to stay visible (2026-10-17) */
871
903
  .hjm-badge[data-tone="brand"] { color: var(--hjm-color-content-brand); }
@@ -881,7 +913,7 @@
881
913
  .hjm-badge[data-variant="outline"][data-tone="warning"] { border-color: color-mix(in srgb, var(--hjm-accent-warning) 30%, transparent); }
882
914
  .hjm-badge[data-variant="outline"][data-tone="attention"] { border-color: color-mix(in srgb, var(--hjm-accent-attention) 30%, transparent); }
883
915
  .hjm-badge[data-variant="outline"][data-tone="danger"] { border-color: color-mix(in srgb, var(--hjm-color-danger) 30%, transparent); }
884
- .hjm-tag { min-block-size: 20px; padding-inline: var(--hjm-space-xxs); border: 1px solid var(--hjm-color-border); 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); }
916
+ .hjm-tag { min-block-size: 20px; padding-inline: var(--hjm-space-xxs); border: 1px solid var(--hjm-color-border); 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-text-emphasis-medium); }
885
917
  .hjm-tag[data-tone="brand"] { color: var(--hjm-color-content-brand); background: var(--hjm-color-bg); }
886
918
  .hjm-tag[data-tone="info"] { background: var(--hjm-color-bg); }
887
919
  .hjm-tag[data-tone="success"] { background: color-mix(in srgb, var(--hjm-accent-success) 10%, transparent); }
@@ -897,7 +929,7 @@
897
929
  .hjm-icon[data-tone="danger"] { color: var(--hjm-color-danger); }
898
930
  .hjm-icon[data-tone="inverse"] { color: var(--hjm-color-on-primary); }
899
931
  /* Counts must not flex-shrink below their text and padding in narrow rows. */
900
- .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; }
932
+ .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-text-emphasis-medium); font-variant-numeric: tabular-nums; }
901
933
  .hjm-counter-badge[data-size="small"] { min-inline-size: 16px; block-size: 16px; padding-inline: var(--hjm-space-xxs); }
902
934
  .hjm-counter-badge[data-tone="brand"] { color: var(--hjm-color-on-primary); background: var(--hjm-color-primary); }
903
935
  .hjm-counter-badge[data-tone="danger"] { color: var(--hjm-color-on-danger); background: var(--hjm-color-danger-fill); }
@@ -912,31 +944,53 @@
912
944
  .hjm-card__header { display: flex; align-items: flex-start; gap: var(--hjm-space-sm); min-inline-size: 0; }
913
945
  .hjm-card__leading { flex: 0 0 auto; display: inline-grid; place-items: center; line-height: 1; }
914
946
  .hjm-card__copy { flex: 1 1 auto; min-inline-size: 0; display: grid; gap: var(--hjm-space-xs); }
915
- .hjm-card__title { margin: 0; color: var(--hjm-color-text); font-size: var(--hjm-type-title-size); line-height: var(--hjm-type-title-line-height); overflow-wrap: anywhere; }
947
+ /* cardRecipe.title.emphasis "strong": without a weight the h2–h6 element fell back to the UA bold (700). */
948
+ .hjm-card__title { margin: 0; color: var(--hjm-color-text); font-size: var(--hjm-type-title-size); line-height: var(--hjm-type-title-line-height); font-weight: var(--hjm-text-emphasis-strong); overflow-wrap: anywhere; }
916
949
  .hjm-card__description { margin: 0; overflow-wrap: anywhere; }
917
950
  .hjm-card__actions { display: flex; flex-wrap: wrap; gap: var(--hjm-space-sm); padding: 0 var(--hjm-space-md) var(--hjm-space-md); }
918
951
  /* Row rhythm reads the recipe density variables so the stylesheet does not
919
952
  carry a second copy of the same numbers. */
920
- .hjm-list-row { inline-size: 100%; display: flex; align-items: center; gap: var(--hjm-list-row-gap); min-block-size: var(--hjm-list-row-comfortable-one-line); padding-inline: var(--hjm-list-row-comfortable-padding-inline); padding-block: var(--hjm-list-row-comfortable-padding-block); border: 0; color: inherit; background: transparent; text-align: start; text-decoration: none; font: inherit; }
953
+ /* Inline placement (listRowRecipe.surfaceBleed, 2026-10-17 user decision): the row text sits on the container's content
954
+ edge and the row box — hover/pressed/selected fill, focus ring, hit area — bleeds outward by the density's inline
955
+ padding. The padding used to sit inside the container's content box, so row text started at 16 + 8 = 24 while section
956
+ titles and result headers started at 16. Containers need that much inline room (screen gutter, card/sheet padding). */
957
+ .hjm-list-row { --hjm-list-row-inline: var(--hjm-list-row-comfortable-padding-inline); inline-size: calc(100% + 2 * var(--hjm-list-row-inline)); margin-inline: calc(-1 * var(--hjm-list-row-inline)); display: flex; align-items: center; gap: var(--hjm-list-row-gap); min-block-size: var(--hjm-list-row-comfortable-one-line); padding-inline: var(--hjm-list-row-inline); padding-block: var(--hjm-list-row-comfortable-padding-block); border: 0; color: inherit; background: transparent; text-align: start; text-decoration: none; font: inherit; }
921
958
  button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
922
959
  .hjm-list-row[data-lines="two"] { min-block-size: var(--hjm-list-row-comfortable-two-line); }
923
- .hjm-list-row[data-density="compact"] { min-block-size: var(--hjm-list-row-compact-one-line); padding-inline: var(--hjm-list-row-compact-padding-inline); padding-block: var(--hjm-list-row-compact-padding-block); }
960
+ .hjm-list-row[data-density="compact"] { --hjm-list-row-inline: var(--hjm-list-row-compact-padding-inline); min-block-size: var(--hjm-list-row-compact-one-line); padding-block: var(--hjm-list-row-compact-padding-block); }
924
961
  .hjm-list-row[data-density="compact"][data-lines="two"] { min-block-size: var(--hjm-list-row-compact-two-line); }
925
962
  /* The two wider steps read the same generated variables; no numbers here. */
926
- .hjm-list-row[data-density="relaxed"] { min-block-size: var(--hjm-list-row-relaxed-one-line); padding-inline: var(--hjm-list-row-relaxed-padding-inline); padding-block: var(--hjm-list-row-relaxed-padding-block); }
963
+ .hjm-list-row[data-density="relaxed"] { --hjm-list-row-inline: var(--hjm-list-row-relaxed-padding-inline); min-block-size: var(--hjm-list-row-relaxed-one-line); padding-block: var(--hjm-list-row-relaxed-padding-block); }
927
964
  .hjm-list-row[data-density="relaxed"][data-lines="two"] { min-block-size: var(--hjm-list-row-relaxed-two-line); }
928
- .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); }
965
+ .hjm-list-row[data-density="spacious"] { --hjm-list-row-inline: var(--hjm-list-row-spacious-padding-inline); min-block-size: var(--hjm-list-row-spacious-one-line); padding-block: var(--hjm-list-row-spacious-padding-block); }
929
966
  .hjm-list-row[data-density="spacious"][data-lines="two"] { min-block-size: var(--hjm-list-row-spacious-two-line); }
930
967
  .hjm-list-row[data-state="selected"] { background: var(--hjm-color-bg); box-shadow: inset 0 0 0 1px var(--hjm-color-content-brand); }
931
968
  .hjm-list-row[data-state="disabled"] { opacity: 0.5; cursor: not-allowed; }
969
+ /* trailingAction: one surface for the row command and its separate action, as Native. The frame takes the bleed; the
970
+ command keeps the start padding and the action the end padding, so the action box ends on the content edge (an
971
+ `edge="end"` IconButton then puts its glyph on that line). */
972
+ .hjm-list-row-frame { --hjm-list-row-inline: var(--hjm-list-row-comfortable-padding-inline); display: flex; align-items: center; gap: var(--hjm-list-row-gap); inline-size: calc(100% + 2 * var(--hjm-list-row-inline)); margin-inline: calc(-1 * var(--hjm-list-row-inline)); }
973
+ .hjm-list-row-frame[data-density="compact"] { --hjm-list-row-inline: var(--hjm-list-row-compact-padding-inline); }
974
+ .hjm-list-row-frame[data-density="relaxed"] { --hjm-list-row-inline: var(--hjm-list-row-relaxed-padding-inline); }
975
+ .hjm-list-row-frame[data-density="spacious"] { --hjm-list-row-inline: var(--hjm-list-row-spacious-padding-inline); }
976
+ .hjm-list-row-frame[data-state="selected"] { background: var(--hjm-color-bg); box-shadow: inset 0 0 0 1px var(--hjm-color-content-brand); }
977
+ .hjm-list-row-frame[data-state="disabled"] { opacity: 0.5; }
978
+ .hjm-list-row-frame > .hjm-list-row { flex: 1 1 auto; min-inline-size: 0; inline-size: auto; margin-inline: 0; padding-inline-end: 0; }
979
+ .hjm-list-row-frame > .hjm-list-row[data-state] { background: transparent; box-shadow: none; opacity: 1; }
980
+ .hjm-list-row-frame > .hjm-list-row[data-state="disabled"] { cursor: not-allowed; }
981
+ .hjm-list-row__action { flex: 0 0 auto; display: flex; align-items: center; padding-inline-end: var(--hjm-list-row-inline); }
932
982
  .hjm-list-row__leading, .hjm-list-row__trailing { flex: 0 0 auto; }
983
+ /* Trailing was a blockified span, so an inline svg/switch sat on the text
984
+ baseline 2–2.5px above the row center (2026-10-17 measured audit); a flex
985
+ box centers any trailing node like Native's row-centered View. */
986
+ .hjm-list-row__trailing { display: flex; align-items: center; }
933
987
  /* `leadingSize` was declared by the recipe but unbound, so consumers rebuilt
934
988
  the avatar box in product styles. */
935
989
  .hjm-list-row__leading { display: flex; align-items: center; justify-content: center; inline-size: var(--hjm-list-row-leading-size); block-size: var(--hjm-list-row-leading-size); overflow: hidden; }
936
990
  .hjm-list-row__leading[data-shape="circle"] { border-radius: var(--hjm-radius-full); }
937
991
  .hjm-list-row__content { flex: 1 1 auto; min-inline-size: 0; display: grid; gap: var(--hjm-space-xxs); }
938
992
  /* listRowRecipe title bodyLarge / description body (2026-10-17: Web inherited 14 for both while Native used the recipe). */
939
- .hjm-list-row__title { color: var(--hjm-color-text-body); font-size: var(--hjm-type-body-large-size); line-height: var(--hjm-type-body-large-line-height); font-weight: var(--hjm-font-weight-bold); overflow-wrap: anywhere; }
993
+ .hjm-list-row__title { color: var(--hjm-color-text-body); font-size: var(--hjm-type-body-large-size); line-height: var(--hjm-type-body-large-line-height); font-weight: var(--hjm-type-title-weight); overflow-wrap: anywhere; }
940
994
  .hjm-list-row[data-tone="danger"] .hjm-list-row__title { color: var(--hjm-color-danger); }
941
995
  .hjm-list-row__description, .hjm-list-row__trailing { color: var(--hjm-color-text-muted); overflow-wrap: anywhere; }
942
996
  .hjm-list-row__description { font-size: var(--hjm-type-body-size); line-height: var(--hjm-type-body-line-height); }
@@ -946,7 +1000,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
946
1000
  .hjm-section__copy { display: grid; flex: 1 1 auto; gap: var(--hjm-space-xxs); min-inline-size: 0; }
947
1001
  /* sectionRecipe.title is the `title` variant (18/26 bold) and description the `caption` variant (11/16), as Native draws them.
948
1002
  Until 2026-10-06 Web inherited body (14) for both, so the same Section header was smaller on Web. */
949
- .hjm-section__title { margin: 0; color: var(--hjm-color-text-body); font-size: var(--hjm-type-title-size); line-height: var(--hjm-type-title-line-height); font-weight: var(--hjm-font-weight-bold); overflow-wrap: anywhere; }
1003
+ .hjm-section__title { margin: 0; color: var(--hjm-color-text-body); font-size: var(--hjm-type-title-size); line-height: var(--hjm-type-title-line-height); font-weight: var(--hjm-type-title-weight); overflow-wrap: anywhere; }
950
1004
  .hjm-section__description { color: var(--hjm-color-text-muted); font-size: var(--hjm-type-caption-size); line-height: var(--hjm-type-caption-line-height); overflow-wrap: anywhere; }
951
1005
  .hjm-section__action { flex: 0 0 auto; }
952
1006
  .hjm-section__content { min-inline-size: 0; }
@@ -962,7 +1016,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
962
1016
  recipe-only sizes as custom properties so theme.ts does not pull this opt-in contract into every graph. */
963
1017
  /* fit-content: a column Stack stretched the pill to its max width with empty space after the label; Native sizes it
964
1018
  to its content (2026-10-17 review F N13). Unlike align-self it keeps vertical centering in a TopBar row. */
965
- .hjm-activity-chip { display: inline-flex; align-items: center; gap: var(--hjm-space-xxs); min-block-size: var(--hjm-control-min-touch-target); inline-size: fit-content; max-inline-size: var(--hjm-activity-chip-max-width); min-inline-size: 0; padding-block: 0; padding-inline: var(--hjm-space-xxs) var(--hjm-space-sm); border: 1px solid var(--hjm-color-border); border-radius: 999px; color: var(--hjm-color-text); background: var(--hjm-color-surface); font: inherit; font-size: var(--hjm-type-label-size, 0.75rem); line-height: var(--hjm-type-label-line-height, 1.5); font-weight: var(--hjm-font-weight-bold); cursor: pointer; }
1019
+ .hjm-activity-chip { display: inline-flex; align-items: center; gap: var(--hjm-space-xxs); min-block-size: var(--hjm-control-min-touch-target); inline-size: fit-content; max-inline-size: var(--hjm-activity-chip-max-width); min-inline-size: 0; padding-block: 0; padding-inline: var(--hjm-space-xxs) var(--hjm-space-sm); border: 1px solid var(--hjm-color-border); border-radius: 999px; color: var(--hjm-color-text); background: var(--hjm-color-surface); font: inherit; font-size: var(--hjm-type-label-size, 0.75rem); line-height: var(--hjm-type-label-line-height, 1.5); font-weight: var(--hjm-text-emphasis-medium); cursor: pointer; }
966
1020
  /* Without media the pill keeps the symmetric label inset; the media hugs the start edge like an avatar chip. */
967
1021
  .hjm-activity-chip:not([data-media]) { padding-inline-start: var(--hjm-space-sm); }
968
1022
  .hjm-activity-chip[data-emphasis="emphasis"] { border-color: var(--hjm-color-primary); color: var(--hjm-color-on-primary); background: var(--hjm-color-primary); }
@@ -971,7 +1025,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
971
1025
  .hjm-activity-chip__media { flex: none; display: grid; place-items: center; inline-size: var(--hjm-activity-chip-media-size); block-size: var(--hjm-activity-chip-media-size); overflow: hidden; border-radius: 50%; }
972
1026
  .hjm-activity-chip__media > :is(img, svg) { inline-size: 100%; block-size: 100%; object-fit: contain; }
973
1027
  .hjm-activity-chip__label { min-inline-size: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
974
- .hjm-chip { position: relative; 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-md); 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; }
1028
+ .hjm-chip { position: relative; 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-md); 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-text-emphasis-medium); cursor: pointer; }
975
1029
  .hjm-chip[data-size="small"] { min-block-size: 36px; padding-inline: var(--hjm-space-sm); gap: var(--hjm-space-xxs); }
976
1030
  .hjm-chip[data-size="small"]::after { content: ""; position: absolute; inset: -4px 0; }
977
1031
  .hjm-chip[data-selected] { border-color: var(--hjm-color-content-brand); background: var(--hjm-color-bg); color: var(--hjm-color-content-brand); }
@@ -980,14 +1034,21 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
980
1034
  .hjm-chip__indicator, .hjm-chip__leading, .hjm-chip__trailing { display: inline-flex; flex: 0 0 auto; }
981
1035
  .hjm-chip__label { overflow-wrap: anywhere; }
982
1036
 
983
- .hjm-list { overflow: hidden; min-inline-size: 0; }
984
- .hjm-list[data-appearance="grouped"] { border-radius: var(--hjm-radius-lg); background: var(--hjm-color-bg); }
1037
+ /* A plain list does not clip: its rows bleed their surface into the container inset (listRowRecipe.surfaceBleed).
1038
+ A grouped list clips to its rounded surface, so it keeps that bleed as inline padding (listRecipe.grouped). */
1039
+ .hjm-list { min-inline-size: 0; }
1040
+ .hjm-list[data-appearance="grouped"] { overflow: hidden; padding-inline: var(--hjm-list-grouped-padding-inline); border-radius: var(--hjm-radius-lg); background: var(--hjm-color-bg); }
985
1041
  .hjm-list__item { min-inline-size: 0; }
986
- .hjm-list[data-separator="full"] > .hjm-list__item + .hjm-list__item { border-block-start: 1px solid var(--hjm-color-border); }
987
1042
  /* Indent only the divider: moving the row shifted every title after the first
988
- and narrowed its text column in the notification-settings composition. */
989
- .hjm-list[data-separator="indented"] > .hjm-list__item + .hjm-list__item { position: relative; }
990
- .hjm-list[data-separator="indented"] > .hjm-list__item + .hjm-list__item::before { content: ""; position: absolute; inset-block-start: 0; inset-inline: calc(var(--hjm-space-xs) + 40px + var(--hjm-space-sm)) 0; border-block-start: 1px solid var(--hjm-color-border); pointer-events: none; } /* listRecipe.separators.indented.insetStart = row padding 8 + leading 40 + sm 12 = 60, as Native (2026-10-17) */
1043
+ and narrowed its text column in the notification-settings composition. Insets are measured from the list content
1044
+ edge (where the row text sits) and come from listRecipe.separators: full spans the row surface; indented follows
1045
+ the text column of the row above (the separator belongs to that row, as Native draws it after the row) — 52 after a
1046
+ row with leading (ListRow root `data-leading`), 0 after one without, ending on the content edge (2026-10-17). */
1047
+ .hjm-list:is([data-separator="full"], [data-separator="indented"]) > .hjm-list__item + .hjm-list__item { position: relative; }
1048
+ .hjm-list:is([data-separator="full"], [data-separator="indented"]) > .hjm-list__item + .hjm-list__item::before { content: ""; position: absolute; inset-block-start: 0; border-block-start: 1px solid var(--hjm-color-border); pointer-events: none; }
1049
+ .hjm-list[data-separator="full"] > .hjm-list__item + .hjm-list__item::before { inset-inline: var(--hjm-list-separator-full-start) var(--hjm-list-separator-full-end); }
1050
+ .hjm-list[data-separator="indented"] > .hjm-list__item + .hjm-list__item::before { inset-inline: var(--hjm-list-separator-indented-start) var(--hjm-list-separator-indented-end); }
1051
+ .hjm-list[data-separator="indented"] > .hjm-list__item:has(> [data-leading]) + .hjm-list__item::before { inset-inline-start: var(--hjm-list-separator-indented-leading-start); }
991
1052
 
992
1053
  /* statisticRecipe.density (2026-10-06 follow-up): line gap comfortable xs 8 · compact xxs 4, surface padding md 16 · sm 12,
993
1054
  group gap xs 8. Web had drawn 4/2, a fixed 16 and 12, Native read the recipe. */
@@ -999,14 +1060,14 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
999
1060
  (compact `title`) heavy, affix `body` semibold in content.body, hint and trend `caption` (trend bold). Until 2026-10-06
1000
1061
  Web drew a body-size medium label, a title-size value at both densities (scaled twice by --hjm-text-scale, which the
1001
1062
  --hjm-type-* sizes already include) and muted affixes. */
1002
- .hjm-statistic__label { color: var(--hjm-color-text-muted); font-size: var(--hjm-type-label-size); line-height: var(--hjm-type-label-line-height); font-weight: var(--hjm-font-weight-semibold); overflow-wrap: anywhere; }
1063
+ .hjm-statistic__label { color: var(--hjm-color-text-muted); font-size: var(--hjm-type-label-size); line-height: var(--hjm-type-label-line-height); font-weight: var(--hjm-text-emphasis-medium); overflow-wrap: anywhere; }
1003
1064
  .hjm-statistic[data-density="compact"] .hjm-statistic__label { font-size: var(--hjm-type-caption-size); line-height: var(--hjm-type-caption-line-height); }
1004
1065
  .hjm-statistic__value-row { display: flex; align-items: baseline; flex-wrap: wrap; gap: var(--hjm-space-xxs); min-inline-size: 0; }
1005
- .hjm-statistic__value { color: var(--hjm-color-text); font-size: var(--hjm-type-heading-size); line-height: var(--hjm-type-heading-line-height); font-weight: var(--hjm-font-weight-heavy); font-variant-numeric: tabular-nums; overflow-wrap: anywhere; }
1066
+ .hjm-statistic__value { color: var(--hjm-color-text); font-size: var(--hjm-type-heading-size); line-height: var(--hjm-type-heading-line-height); font-weight: var(--hjm-font-weight-semibold); font-variant-numeric: tabular-nums; overflow-wrap: anywhere; }
1006
1067
  .hjm-statistic[data-density="compact"] .hjm-statistic__value { font-size: var(--hjm-type-title-size); line-height: var(--hjm-type-title-line-height); }
1007
- .hjm-statistic__affix { color: var(--hjm-color-text-body); font-size: var(--hjm-type-body-size); line-height: var(--hjm-type-body-line-height); font-weight: var(--hjm-font-weight-semibold); }
1068
+ .hjm-statistic__affix { color: var(--hjm-color-text-body); font-size: var(--hjm-type-body-size); line-height: var(--hjm-type-body-line-height); font-weight: var(--hjm-text-emphasis-medium); }
1008
1069
  .hjm-statistic__hint { color: var(--hjm-color-text-muted); font-size: var(--hjm-type-caption-size); line-height: var(--hjm-type-caption-line-height); }
1009
- .hjm-statistic__trend { display: inline-flex; align-items: center; gap: var(--hjm-space-xxs); font-size: var(--hjm-type-caption-size); line-height: var(--hjm-type-caption-line-height); font-weight: var(--hjm-font-weight-bold); overflow-wrap: anywhere; }
1070
+ .hjm-statistic__trend { display: inline-flex; align-items: center; gap: var(--hjm-space-xxs); font-size: var(--hjm-type-caption-size); line-height: var(--hjm-type-caption-line-height); font-weight: var(--hjm-text-emphasis-medium); overflow-wrap: anywhere; }
1010
1071
  .hjm-statistic__trend[data-tone="success"] { color: var(--hjm-accent-success); }
1011
1072
  .hjm-statistic__trend[data-tone="warning"] { color: var(--hjm-accent-warning); }
1012
1073
  .hjm-statistic__trend[data-tone="danger"] { color: var(--hjm-color-danger); }
@@ -1023,20 +1084,30 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1023
1084
  .hjm-notice[data-tone="danger"] { border-color: var(--hjm-color-danger); background: color-mix(in srgb, var(--hjm-color-danger) 10%, var(--hjm-color-bg)); }
1024
1085
  /* Reserve readable copy; wrap the action instead of crushing its label. */
1025
1086
  .hjm-notice__content { flex: 1 1 60%; min-inline-size: 0; display: grid; gap: var(--hjm-space-xxs); }
1087
+ /* First-line anchor (2026-10-17 measured audit): the inline action (contract: Button size="small") centered 8px
1088
+ below the title's first line and the icon box had no rule at all. Icon, first line and action now share one
1089
+ anchor — the line box (1lh) alone, or the small-button height when an action sits on the row. Extra lines
1090
+ grow downward; Native keeps the action under the copy (docs/usage/components/notice.md). */
1091
+ .hjm-notice { --hjm-notice-anchor: 1lh; }
1092
+ .hjm-notice:has(> .hjm-notice__action) { --hjm-notice-anchor: var(--hjm-control-button-small); }
1093
+ .hjm-notice__icon { flex: 0 0 auto; display: flex; align-items: center; justify-content: center; min-inline-size: 1.25rem; block-size: var(--hjm-notice-anchor); }
1094
+ .hjm-notice__content > :first-child { margin-block-start: calc((var(--hjm-notice-anchor) - 1lh) / 2); }
1026
1095
  .hjm-notice__action { flex: 0 0 auto; max-inline-size: 100%; }
1027
1096
  .hjm-notice__title, .hjm-notice__description { overflow-wrap: anywhere; }
1097
+ /* noticeRecipe/emptyStateRecipe title weight; the <strong> otherwise draws the UA bold (700). */
1098
+ .hjm-notice__title { font-weight: var(--hjm-type-title-weight); }
1028
1099
 
1029
1100
  /* emptyStateRecipe.density.regular paddingVertical xxxl 40 (2026-10-06; Web had xxl 32, Native read the recipe). */
1030
1101
  /* Like Native, a regular empty state fills the rest of a flex host and centers in it; compact (cards, sheets) stays content-high. */
1031
1102
  .hjm-empty-state { display: grid; flex-grow: 1; align-content: center; justify-items: center; gap: var(--hjm-space-xs); padding: var(--hjm-space-xxxl) var(--hjm-space-xl); color: var(--hjm-color-text-muted); text-align: center; }
1032
1103
  .hjm-empty-state[data-density="compact"] { flex-grow: 0; padding-block: var(--hjm-space-xl); }
1033
- .hjm-empty-state__title { color: var(--hjm-color-text); }
1104
+ .hjm-empty-state__title { color: var(--hjm-color-text); font-weight: var(--hjm-type-title-weight); }
1034
1105
  .hjm-result { display: grid; justify-items: center; gap: var(--hjm-space-sm); padding: var(--hjm-space-xxxl) var(--hjm-space-xl); text-align: center; }
1035
- .hjm-result__icon { inline-size: 3.5rem; block-size: 3.5rem; display: grid; place-items: center; border-radius: var(--hjm-radius-full); font-size: 1.5rem; font-weight: var(--hjm-font-weight-bold); }
1106
+ .hjm-result__icon { inline-size: 3.5rem; block-size: 3.5rem; display: grid; place-items: center; border-radius: var(--hjm-radius-full); font-size: 1.5rem; font-weight: var(--hjm-text-emphasis-medium); }
1036
1107
  .hjm-result[data-status="success"] .hjm-result__icon { color: var(--hjm-accent-success); background: color-mix(in srgb, var(--hjm-accent-success) 12%, transparent); }
1037
1108
  .hjm-result[data-status="failure"] .hjm-result__icon { color: var(--hjm-color-danger); background: color-mix(in srgb, var(--hjm-color-danger) 12%, transparent); }
1038
1109
  .hjm-result[data-status="info"] .hjm-result__icon { color: var(--hjm-accent-info); background: var(--hjm-color-bg); }
1039
- .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; }
1110
+ .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); font-weight: var(--hjm-type-title-large-weight); overflow-wrap: anywhere; }
1040
1111
  .hjm-result__description { max-inline-size: 40rem; margin: 0; color: var(--hjm-color-text-muted); overflow-wrap: anywhere; }
1041
1112
  .hjm-result__actions { display: flex; flex-wrap: wrap; justify-content: center; gap: var(--hjm-space-sm); margin-block-start: var(--hjm-space-xs); }
1042
1113
  .hjm-progress { display: grid; gap: var(--hjm-space-xs); }
@@ -1102,7 +1173,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1102
1173
  .hjm-list-row--loading [data-placeholder] {
1103
1174
  display: block;
1104
1175
  border-radius: var(--hjm-radius-sm);
1105
- background: var(--hjm-color-surface-alt);
1176
+ background: var(--hjm-skeleton-background); /* same placeholder fill as Skeleton */
1106
1177
  }
1107
1178
  .hjm-list-row--loading .hjm-list-row__title[data-placeholder] {
1108
1179
  block-size: var(--hjm-type-body-large-line-height);
@@ -1110,7 +1181,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1110
1181
  .hjm-list-row--loading .hjm-list-row__description[data-placeholder] {
1111
1182
  block-size: var(--hjm-type-body-line-height);
1112
1183
  }
1113
- .hjm-list-row--loading .hjm-list-row__leading[data-placeholder] { background: var(--hjm-color-surface-alt); }
1184
+ .hjm-list-row--loading .hjm-list-row__leading[data-placeholder] { background: var(--hjm-skeleton-background); }
1114
1185
  .hjm-list-row--loading .hjm-list-row__trailing[data-placeholder] { block-size: var(--hjm-type-caption-line-height); }
1115
1186
  .hjm-spinner { display: inline-flex; align-items: center; justify-content: center; color: var(--hjm-color-content-brand); }
1116
1187
  .hjm-spinner[data-tone="neutral"] { color: var(--hjm-color-text-muted); }
@@ -1118,10 +1189,15 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1118
1189
  .hjm-spinner[data-size="small"] { font-size: 14px; }
1119
1190
  .hjm-spinner[data-size="medium"] { font-size: 20px; }
1120
1191
  .hjm-spinner[data-size="large"] { font-size: 28px; }
1121
- .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); }
1192
+ /* Filled placeholder (recipe background, 2026-10-17): a canvas fill + hairline was invisible on white. */
1193
+ .hjm-skeleton { display: block; inline-size: 100%; min-block-size: var(--hjm-space-xxl); border-radius: var(--hjm-radius-md); background: var(--hjm-skeleton-background); }
1122
1194
  .hjm-skeleton[data-shape="text"] { min-block-size: var(--hjm-space-md); border-radius: var(--hjm-radius-sm); }
1123
- .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); }
1124
- .hjm-skeleton[data-animated="true"] { animation: hjm-pulse var(--hjm-skeleton-duration) var(--hjm-skeleton-easing) infinite alternate; }
1195
+ .hjm-skeleton[data-shape="circle"] { flex: none; inline-size: var(--hjm-skeleton-circle-size); block-size: var(--hjm-skeleton-circle-size); border-radius: var(--hjm-radius-full); }
1196
+ .hjm-skeleton[data-shape="media"] { min-block-size: 0; aspect-ratio: var(--hjm-skeleton-media-aspect); }
1197
+ .hjm-skeleton[data-shape="button"] { min-block-size: var(--hjm-skeleton-button-height); }
1198
+ .hjm-skeleton-lines { display: flex; flex-direction: column; gap: var(--hjm-skeleton-lines-gap); inline-size: 100%; }
1199
+ .hjm-skeleton-lines > [data-last] { inline-size: var(--hjm-skeleton-last-line-width); }
1200
+ .hjm-skeleton[data-animated="true"], .hjm-skeleton-lines[data-animated="true"] { animation: hjm-pulse var(--hjm-skeleton-duration) var(--hjm-skeleton-easing) infinite alternate; }
1125
1201
 
1126
1202
  /* CommandPalette ---------------------------------------------------------- */
1127
1203
  /*
@@ -1186,7 +1262,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1186
1262
  }
1187
1263
  .hjm-data-table[data-density="compact"] .hjm-data-table__table th,
1188
1264
  .hjm-data-table[data-density="compact"] .hjm-data-table__table td { padding: var(--hjm-space-xs) var(--hjm-space-sm); }
1189
- .hjm-data-table__table th { color: var(--hjm-color-text-muted); font-weight: var(--hjm-font-weight-semibold); }
1265
+ .hjm-data-table__table th { color: var(--hjm-color-text-muted); font-weight: var(--hjm-text-emphasis-medium); }
1190
1266
  .hjm-data-table__selector { inline-size: var(--hjm-control-min-touch-target); }
1191
1267
  .hjm-data-table__sort {
1192
1268
  display: inline-flex;
@@ -1227,7 +1303,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1227
1303
  .hjm-data-table__table .hjm-data-table__pinned { position: sticky; z-index: 1; background: var(--hjm-color-bg); }
1228
1304
  .hjm-data-table__table .hjm-data-table__pinned-edge { box-shadow: inset -1px 0 0 var(--hjm-color-border); }
1229
1305
  .hjm-data-table__table .hjm-data-table__pinned-edge:dir(rtl) { box-shadow: inset 1px 0 0 var(--hjm-color-border); }
1230
- .hjm-data-table__table tfoot td { border-block-start: 1px solid var(--hjm-color-border); border-block-end: 0; font-weight: var(--hjm-font-weight-semibold); }
1306
+ .hjm-data-table__table tfoot td { border-block-start: 1px solid var(--hjm-color-border); border-block-end: 0; font-weight: var(--hjm-text-emphasis-medium); }
1231
1307
 
1232
1308
  /* DataTable family (2026-10-14): header bands, row groups, sub-row indent, tone/heat, bounded
1233
1309
  height. Colors mirror dataTableFamilyRecipe; heat is a background-image so pinned cells keep
@@ -1241,7 +1317,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1241
1317
  background: var(--hjm-color-surface-alt);
1242
1318
  color: var(--hjm-color-text-muted);
1243
1319
  font-size: var(--hjm-type-label-size);
1244
- font-weight: var(--hjm-font-weight-bold);
1320
+ font-weight: var(--hjm-text-emphasis-medium);
1245
1321
  text-align: start;
1246
1322
  }
1247
1323
  /* The label stays in view while a wide table scrolls sideways. */
@@ -1258,37 +1334,37 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1258
1334
  .hjm-table-family { min-inline-size: 0; overflow-x: auto; border-radius: var(--hjm-radius-md); background: var(--hjm-color-surface); }
1259
1335
  .hjm-line-score__table, .hjm-matrix-table__table { inline-size: 100%; border-collapse: collapse; font-variant-numeric: tabular-nums; }
1260
1336
  .hjm-line-score__table th, .hjm-line-score__table td { padding: var(--hjm-space-xs) var(--hjm-space-xxs); text-align: center; white-space: nowrap; }
1261
- .hjm-line-score__table thead th { color: var(--hjm-color-text-muted); font-size: var(--hjm-type-label-size); font-weight: var(--hjm-font-weight-bold); }
1262
- .hjm-line-score__table th.hjm-line-score__team { padding-inline: var(--hjm-space-sm); text-align: start; color: var(--hjm-color-text-muted); font-weight: var(--hjm-font-weight-semibold); }
1337
+ .hjm-line-score__table thead th { color: var(--hjm-color-text-muted); font-size: var(--hjm-type-label-size); font-weight: var(--hjm-text-emphasis-medium); }
1338
+ .hjm-line-score__table th.hjm-line-score__team { padding-inline: var(--hjm-space-sm); text-align: start; color: var(--hjm-color-text-muted); font-weight: var(--hjm-text-emphasis-medium); }
1263
1339
  .hjm-line-score__team-content { display: inline-flex; align-items: center; gap: var(--hjm-space-xs); }
1264
- .hjm-line-score__table tr[data-leader] th.hjm-line-score__team { color: var(--hjm-color-text); font-weight: var(--hjm-font-weight-bold); }
1340
+ .hjm-line-score__table tr[data-leader] th.hjm-line-score__team { color: var(--hjm-color-text); font-weight: var(--hjm-font-weight-semibold); }
1265
1341
  .hjm-line-score { --hjm-line-score-total-width: 30px; scroll-padding-inline-end: calc(var(--hjm-line-score-total-width) * var(--hjm-line-score-total-count, 0)); }
1266
1342
  .hjm-line-score__table .hjm-line-score__team, .hjm-line-score__table .hjm-line-score__total { position: sticky; z-index: 1; background: var(--hjm-color-surface); }
1267
1343
  .hjm-line-score__table .hjm-line-score__team { inset-inline-start: 0; }
1268
1344
  .hjm-line-score__table td.hjm-line-score__period { min-inline-size: 26px; color: var(--hjm-color-text-sub); }
1269
- .hjm-line-score__table td[data-scored] { color: var(--hjm-color-text); font-weight: var(--hjm-font-weight-bold); }
1345
+ .hjm-line-score__table td[data-scored] { color: var(--hjm-color-text); font-weight: var(--hjm-text-emphasis-medium); }
1270
1346
  .hjm-line-score__table [data-current] { background: var(--hjm-table-family-selected); }
1271
1347
  .hjm-line-score__table th[data-current] { color: var(--hjm-color-content-brand); }
1272
- .hjm-line-score__total { inline-size: var(--hjm-line-score-total-width); min-inline-size: var(--hjm-line-score-total-width); color: var(--hjm-color-text-muted); font-weight: var(--hjm-font-weight-semibold); }
1348
+ .hjm-line-score__total { inline-size: var(--hjm-line-score-total-width); min-inline-size: var(--hjm-line-score-total-width); color: var(--hjm-color-text-muted); font-weight: var(--hjm-text-emphasis-medium); }
1273
1349
  /* A collapsed-table border stays with the table, not the pinned cell, so the edge is an inset shadow. */
1274
1350
  .hjm-line-score__total-edge { box-shadow: inset 1px 0 0 var(--hjm-color-border); }
1275
1351
  .hjm-line-score__total-edge:dir(rtl) { box-shadow: inset -1px 0 0 var(--hjm-color-border); }
1276
- .hjm-line-score__table tbody .hjm-line-score__total-edge { color: var(--hjm-color-text); font-weight: var(--hjm-font-weight-bold); }
1352
+ .hjm-line-score__table tbody .hjm-line-score__total-edge { color: var(--hjm-color-text); font-weight: var(--hjm-font-weight-semibold); }
1277
1353
  .hjm-matrix-table__table th, .hjm-matrix-table__table td { padding: var(--hjm-space-xs); text-align: center; white-space: nowrap; border-block-start: 1px solid var(--hjm-color-border); }
1278
- .hjm-matrix-table__table thead th { border-block-start: 0; color: var(--hjm-color-text-muted); font-size: var(--hjm-type-label-size); font-weight: var(--hjm-font-weight-bold); }
1279
- .hjm-matrix-table__table tbody th { text-align: start; padding-inline: var(--hjm-space-sm); color: var(--hjm-color-text); font-weight: var(--hjm-font-weight-bold); border-inline-end: 1px solid var(--hjm-color-border); }
1354
+ .hjm-matrix-table__table thead th { border-block-start: 0; color: var(--hjm-color-text-muted); font-size: var(--hjm-type-label-size); font-weight: var(--hjm-text-emphasis-medium); }
1355
+ .hjm-matrix-table__table tbody th { text-align: start; padding-inline: var(--hjm-space-sm); color: var(--hjm-color-text); font-weight: var(--hjm-text-emphasis-medium); border-inline-end: 1px solid var(--hjm-color-border); }
1280
1356
  .hjm-matrix-table__table td { color: var(--hjm-color-text-muted); }
1281
1357
  .hjm-matrix-table__table thead td { border-block-start: 0; }
1282
1358
  .hjm-matrix-table__self { background: var(--hjm-color-surface-alt); }
1283
1359
  .hjm-matrix-table__table tr[data-highlighted] > * { background-color: var(--hjm-table-family-selected); }
1284
1360
  .hjm-comparison-table { padding-block: var(--hjm-space-xs); }
1285
- .hjm-comparison-table__sides { display: flex; justify-content: space-between; padding: var(--hjm-space-xs) var(--hjm-space-md); font-weight: var(--hjm-font-weight-bold); }
1361
+ .hjm-comparison-table__sides { display: flex; justify-content: space-between; padding: var(--hjm-space-xs) var(--hjm-space-md); font-weight: var(--hjm-text-emphasis-medium); }
1286
1362
  .hjm-comparison-table__rows { margin: 0; padding: 0; list-style: none; }
1287
1363
  .hjm-comparison-table__row { display: grid; gap: var(--hjm-space-xs); padding: var(--hjm-space-sm) var(--hjm-space-md); border-block-start: 1px solid var(--hjm-color-border); }
1288
1364
  .hjm-comparison-table__rows:first-child > :first-child { border-block-start: 0; }
1289
1365
  .hjm-comparison-table__values { display: grid; grid-template-columns: 1fr auto 1fr; align-items: center; gap: var(--hjm-space-sm); font-variant-numeric: tabular-nums; color: var(--hjm-color-text-sub); }
1290
1366
  .hjm-comparison-table__values > :last-child { text-align: end; }
1291
- .hjm-comparison-table__values > [data-win] { color: var(--hjm-color-text); font-weight: var(--hjm-font-weight-bold); }
1367
+ .hjm-comparison-table__values > [data-win] { color: var(--hjm-color-text); font-weight: var(--hjm-text-emphasis-medium); }
1292
1368
  .hjm-comparison-table__label { color: var(--hjm-color-text); font-size: var(--hjm-type-label-size); }
1293
1369
  .hjm-comparison-table__bars { display: grid; grid-template-columns: 1fr 1fr; gap: var(--hjm-space-sm); block-size: 5px; }
1294
1370
  .hjm-comparison-table__track { display: flex; justify-content: flex-end; border-radius: 2px; background: var(--hjm-color-surface-alt); overflow: hidden; }
@@ -1314,8 +1390,8 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1314
1390
  .hjm-chart__cursor { stroke: var(--hjm-chart-axis-label); }
1315
1391
  .hjm-chart__dot { stroke: var(--hjm-color-bg); }
1316
1392
  .hjm-chart__label { fill: var(--hjm-chart-axis-label); font-family: inherit; font-size: var(--hjm-type-caption-size); }
1317
- .hjm-chart__label[data-focused], .hjm-chart__axis-name, .hjm-chart__value { fill: var(--hjm-chart-legend-label); font-weight: var(--hjm-font-weight-semibold); }
1318
- .hjm-chart__extreme { font-weight: var(--hjm-font-weight-semibold); }
1393
+ .hjm-chart__label[data-focused], .hjm-chart__axis-name, .hjm-chart__value { fill: var(--hjm-chart-legend-label); font-weight: var(--hjm-text-emphasis-medium); }
1394
+ .hjm-chart__extreme { font-weight: var(--hjm-text-emphasis-medium); }
1319
1395
  .hjm-chart__bubble {
1320
1396
  position: absolute;
1321
1397
  inset-block-start: 0;
@@ -1327,7 +1403,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1327
1403
  color: var(--hjm-chart-tooltip-content);
1328
1404
  font-size: var(--hjm-type-caption-size);
1329
1405
  line-height: var(--hjm-type-caption-line-height);
1330
- font-weight: var(--hjm-font-weight-bold);
1406
+ font-weight: var(--hjm-text-emphasis-medium);
1331
1407
  white-space: nowrap;
1332
1408
  pointer-events: none;
1333
1409
  }
@@ -1335,7 +1411,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1335
1411
  .hjm-chart__pie-center { position: absolute; inset: 0; display: grid; place-items: center; text-align: center; pointer-events: none; }
1336
1412
  .hjm-chart__slice[role="button"], .hjm-chart--pie .hjm-chart__slice[data-id] { cursor: pointer; }
1337
1413
  .hjm-chart__slice:focus-visible { outline: none; stroke: var(--hjm-color-focus); stroke-width: var(--hjm-focus-width); }
1338
- .hjm-chart__slice-label { fill: #ffffff; font-family: inherit; font-size: var(--hjm-type-caption-size); font-weight: var(--hjm-font-weight-bold); }
1414
+ .hjm-chart__slice-label { fill: #ffffff; font-family: inherit; font-size: var(--hjm-type-caption-size); font-weight: var(--hjm-text-emphasis-medium); }
1339
1415
  .hjm-chart__axis-titles { display: flex; justify-content: space-between; color: var(--hjm-chart-axis-label); font-size: var(--hjm-type-caption-size); line-height: var(--hjm-type-caption-line-height); }
1340
1416
  .hjm-chart-legend {
1341
1417
  display: flex;
@@ -1368,7 +1444,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1368
1444
  .hjm-chart-legend__button:focus-visible { outline: var(--hjm-focus-width) solid var(--hjm-color-focus); outline-offset: var(--hjm-focus-offset); }
1369
1445
  .hjm-chart-legend__swatch { flex: none; inline-size: 10px; block-size: 10px; border-radius: 3px; }
1370
1446
  .hjm-chart-legend[data-interactive] .hjm-chart-legend__label { flex: 1; }
1371
- .hjm-chart-legend__value { font-weight: var(--hjm-font-weight-bold); font-variant-numeric: tabular-nums; }
1447
+ .hjm-chart-legend__value { font-weight: var(--hjm-text-emphasis-medium); font-variant-numeric: tabular-nums; }
1372
1448
 
1373
1449
  /* Mentions ---------------------------------------------------------------- */
1374
1450
  /*
@@ -1429,7 +1505,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1429
1505
  padding-inline: var(--hjm-space-sm);
1430
1506
  border-block-end: 1px solid var(--hjm-color-border);
1431
1507
  }
1432
- .hjm-transfer-list__title { font-weight: var(--hjm-font-weight-bold); overflow-wrap: anywhere; }
1508
+ .hjm-transfer-list__title { font-weight: var(--hjm-type-title-weight); overflow-wrap: anywhere; }
1433
1509
  .hjm-transfer-list__select-all { display: grid; place-items: center; flex: 0 0 auto; padding: 0; border: 0; background: transparent; }
1434
1510
  /* These rows center the indicator, so drop the 2px top offset Checkbox uses to sit on its first text line. */
1435
1511
  .hjm-transfer-list__select-all > .hjm-choice__indicator,
@@ -1682,6 +1758,42 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1682
1758
  margin-block-start: var(--hjm-auth-screen-footer-gap);
1683
1759
  text-align: center;
1684
1760
  }
1761
+ /* 히어로 문구와 정책 링크(AuthScreenHero·AuthScreenFooter). 글자 단계·간격은 계약 값이다. */
1762
+ .hjm-auth-screen__copy { display: flex; flex-direction: column; align-items: center; inline-size: 100%; }
1763
+ .hjm-auth-screen__footer-content { display: flex; flex-direction: column; align-items: center; inline-size: 100%; }
1764
+ .hjm-auth-screen__links {
1765
+ display: flex;
1766
+ flex-wrap: wrap;
1767
+ justify-content: center;
1768
+ align-items: center;
1769
+ column-gap: var(--hjm-auth-screen-link-gap);
1770
+ }
1771
+ /* 2026-10-17 "간격 줄여": 보이는 간격은 gap + 구분점뿐이다. 44 터치 높이는 배경 없는 min-block-size,
1772
+ 가로 터치 폭은 보이지 않는 가상 요소가 구분점 앞까지 넓힌다 — 버튼 안쪽 여백으로 만들면 글자 사이가 다시 벌어진다. */
1773
+ .hjm-auth-screen__link {
1774
+ position: relative;
1775
+ display: inline-flex;
1776
+ align-items: center;
1777
+ min-block-size: var(--hjm-auth-screen-link-target);
1778
+ margin: 0;
1779
+ padding: 0;
1780
+ border: 0;
1781
+ background: none;
1782
+ font-family: var(--hjm-font-family-ui, inherit);
1783
+ text-decoration: underline;
1784
+ text-underline-offset: 0.18em;
1785
+ cursor: pointer;
1786
+ }
1787
+ .hjm-auth-screen__link::after {
1788
+ content: "";
1789
+ position: absolute;
1790
+ inset-block: 0;
1791
+ inset-inline: calc(var(--hjm-auth-screen-link-gap) * -1);
1792
+ }
1793
+ .hjm-auth-screen__link:focus-visible {
1794
+ outline: var(--hjm-focus-width) solid var(--hjm-color-focus);
1795
+ outline-offset: var(--hjm-focus-offset);
1796
+ }
1685
1797
 
1686
1798
  /* Sidebar ----------------------------------------------------------------- */
1687
1799
  .hjm-sidebar {
@@ -1731,7 +1843,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1731
1843
  .hjm-sidebar__item[aria-current="page"] {
1732
1844
  background: var(--hjm-color-bg);
1733
1845
  color: var(--hjm-color-content-brand);
1734
- font-weight: var(--hjm-font-weight-semibold);
1846
+ font-weight: var(--hjm-text-emphasis-strong);
1735
1847
  box-shadow: inset 0 0 0 1px var(--hjm-color-content-brand); }
1736
1848
  .hjm-sidebar__item[aria-disabled="true"] { color: var(--hjm-color-text-weak); }
1737
1849
  .hjm-sidebar__item:focus-visible,
@@ -1766,7 +1878,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1766
1878
  border-color: var(--hjm-color-focus);
1767
1879
  background: var(--hjm-color-bg);
1768
1880
  color: var(--hjm-color-content-brand);
1769
- font-weight: var(--hjm-font-weight-semibold);
1881
+ font-weight: var(--hjm-text-emphasis-strong);
1770
1882
  }
1771
1883
  .hjm-toggle-group__item:disabled { cursor: default; color: var(--hjm-color-text-weak); }
1772
1884
  .hjm-toggle-group__item:focus-visible { outline: 2px solid var(--hjm-color-focus); outline-offset: 2px; }
@@ -2105,12 +2217,18 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2105
2217
  title line-height or patched this private selector to achieve this alignment. */
2106
2218
  .hjm-sheet__header { align-items: center; }
2107
2219
  .hjm-sheet__header > div { min-inline-size: 0; }
2220
+ /* Sheets have no visible title (2026-10-17 user decision); a header holds only the description and/or ×,
2221
+ and the × stays at the inline end even when there is no description. */
2222
+ .hjm-sheet__header > div { flex: 1 1 auto; }
2223
+ .hjm-sheet__header > .hjm-dialog__close { margin-inline-start: auto; }
2224
+ /* Overlay titles render h2: without an explicit weight they fell back to the UA bold (700) instead of
2225
+ the recipe's title weight (2026-10-17 lighter scale). */
2108
2226
  .hjm-dialog__title,
2109
- .hjm-sheet__title,
2110
2227
  .hjm-alert-dialog__title {
2111
2228
  margin: 0;
2112
2229
  font-size: var(--hjm-type-title-size);
2113
2230
  line-height: var(--hjm-type-title-line-height);
2231
+ font-weight: var(--hjm-type-title-weight);
2114
2232
  overflow-wrap: anywhere;
2115
2233
  }
2116
2234
  .hjm-dialog__description,
@@ -2205,7 +2323,9 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2205
2323
  }
2206
2324
  .hjm-sheet__header,
2207
2325
  .hjm-sheet__footer { flex: 0 0 auto; }
2208
- .hjm-sheet > .hjm-sheet__header { min-block-size: var(--hjm-control-min-touch-target); gap: var(--hjm-space-sm); padding: 0 var(--hjm-space-lg); }
2326
+ /* The header sits inside the drag zone (.hjm-sheet__drag, 2026-10-16), so a direct-child selector stopped matching and
2327
+ the Dialog's 20px top padding leaked in; scope by the sheet instead. */
2328
+ .hjm-sheet .hjm-sheet__header { min-block-size: var(--hjm-control-min-touch-target); gap: var(--hjm-space-sm); padding: 0 var(--hjm-space-lg); }
2209
2329
  .hjm-sheet > .hjm-sheet__footer { padding: var(--hjm-space-sm) var(--hjm-space-lg) 0; }
2210
2330
  .hjm-sheet__body {
2211
2331
  min-block-size: 0;
@@ -2298,6 +2418,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2298
2418
  margin: 0;
2299
2419
  font-size: var(--hjm-type-title-size);
2300
2420
  line-height: var(--hjm-type-title-line-height);
2421
+ font-weight: var(--hjm-type-title-weight);
2301
2422
  overflow-wrap: anywhere;
2302
2423
  }
2303
2424
  .hjm-side-panel__description {
@@ -2350,7 +2471,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2350
2471
  pointer-events: auto;
2351
2472
  }
2352
2473
  .hjm-tour__counter { margin: 0; color: var(--hjm-color-text-muted); font-size: var(--hjm-type-label-size); }
2353
- .hjm-tour__title { margin: var(--hjm-space-xxs) 0 0; font-size: var(--hjm-type-title-size); line-height: var(--hjm-type-title-line-height); overflow-wrap: anywhere; }
2474
+ .hjm-tour__title { margin: var(--hjm-space-xxs) 0 0; font-size: var(--hjm-type-title-size); line-height: var(--hjm-type-title-line-height); font-weight: var(--hjm-type-title-weight); overflow-wrap: anywhere; }
2354
2475
  .hjm-tour__description { margin: var(--hjm-space-xs) 0 0; color: var(--hjm-color-text-body); overflow-wrap: anywhere; }
2355
2476
  .hjm-tour__actions { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: var(--hjm-space-xs); }
2356
2477
  .hjm-tour:focus-visible { outline: 2px solid var(--hjm-color-focus); outline-offset: 2px; }
@@ -2409,12 +2530,12 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2409
2530
  .hjm-menu__item:hover,
2410
2531
  .hjm-menu__item[data-focus="true"] { background: var(--hjm-color-bg); box-shadow: inset 0 0 0 1px var(--hjm-color-content-brand); }
2411
2532
  .hjm-menu__item[data-tone="danger"] { color: var(--hjm-color-danger); }
2412
- .hjm-menu__item[data-state="selected"] { color: var(--hjm-color-content-brand); font-weight: var(--hjm-font-weight-semibold); }
2533
+ .hjm-menu__item[data-state="selected"] { color: var(--hjm-color-content-brand); font-weight: var(--hjm-text-emphasis-strong); }
2413
2534
  .hjm-menu__item:disabled { opacity: 0.5; cursor: not-allowed; }
2414
2535
  .hjm-menu__state-message { min-block-size: var(--hjm-control-min-touch-target); display: flex; align-items: center; padding: var(--hjm-space-xs) var(--hjm-space-sm); color: var(--hjm-color-text-muted); overflow-wrap: anywhere; }
2415
- .hjm-menu__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); }
2536
+ .hjm-menu__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-text-emphasis-medium); }
2416
2537
  .hjm-menu__separator { block-size: 1px; margin: var(--hjm-space-xxs) var(--hjm-space-xs); background: var(--hjm-color-border); }
2417
- .hjm-menu__danger-indicator { flex: 0 0 auto; color: var(--hjm-color-danger); font-weight: var(--hjm-font-weight-bold); }
2538
+ .hjm-menu__danger-indicator { flex: 0 0 auto; color: var(--hjm-color-danger); font-weight: var(--hjm-text-emphasis-medium); }
2418
2539
  .hjm-menu__copy { flex: 1 1 auto; min-inline-size: 0; display: grid; gap: var(--hjm-space-xxs); }
2419
2540
  .hjm-menu__description { color: var(--hjm-color-text-muted); font-size: var(--hjm-type-label-size); }
2420
2541
  .hjm-menu__leading,
@@ -2436,13 +2557,13 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2436
2557
  .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; }
2437
2558
  .hjm-select__native + .hjm-select__indicator { margin-inline-start: calc(-1 * var(--hjm-space-lg)); }
2438
2559
  .hjm-select__listbox { position: fixed; z-index: var(--hjm-layer-dropdown); max-inline-size: min(26.25rem, calc(100vw - (2 * var(--hjm-space-md)))); max-block-size: 22.5rem; overflow: auto; padding: var(--hjm-select-popover-padding, var(--hjm-space-xs)); /* selectRecipe.popover.padding 8 (was 4 until 2026-10-06) */ border: 1px solid var(--hjm-color-border); border-radius: var(--hjm-radius-md); background: var(--hjm-color-bg); box-shadow: var(--hjm-shadow-floating); }
2439
- .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); }
2560
+ .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-text-emphasis-medium); }
2440
2561
  .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; }
2441
2562
  .hjm-select[data-density="comfortable"] .hjm-select__option,
2442
2563
  .hjm-select__listbox[data-density="comfortable"] .hjm-select__option { min-block-size: 3.5rem; }
2443
2564
  .hjm-select__option { cursor: pointer; }
2444
2565
  .hjm-select__option[data-active="true"] { box-shadow: inset 0 0 0 1px var(--hjm-color-content-brand); background: var(--hjm-color-bg); }
2445
- .hjm-select__option[data-state="selected"] { color: var(--hjm-color-content-brand); font-weight: var(--hjm-font-weight-bold); }
2566
+ .hjm-select__option[data-state="selected"] { color: var(--hjm-color-content-brand); font-weight: var(--hjm-font-weight-semibold); }
2446
2567
  .hjm-select__option[data-state="disabled"] { opacity: 0.5; cursor: not-allowed; }
2447
2568
  .hjm-select__option-copy { min-inline-size: 0; flex: 1 1 auto; display: grid; gap: var(--hjm-space-xxs); }
2448
2569
  .hjm-select__option-description, .hjm-select__message { color: var(--hjm-color-text-muted); font-size: var(--hjm-type-label-size); }
@@ -2483,7 +2604,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2483
2604
  .hjm-combobox__listbox[data-density="comfortable"] .hjm-combobox__option { min-block-size: 3.5rem; }
2484
2605
  .hjm-combobox__option { cursor: pointer; }
2485
2606
  .hjm-combobox__option[data-state="active"] { box-shadow: inset 0 0 0 1px var(--hjm-color-content-brand); background: var(--hjm-color-bg); }
2486
- .hjm-combobox__option[data-state="selected"] { color: var(--hjm-color-content-brand); font-weight: var(--hjm-font-weight-bold); }
2607
+ .hjm-combobox__option[data-state="selected"] { color: var(--hjm-color-content-brand); font-weight: var(--hjm-font-weight-semibold); }
2487
2608
  .hjm-combobox__option[data-state="disabled"] { opacity: 0.5; cursor: not-allowed; }
2488
2609
  .hjm-combobox__message { color: var(--hjm-color-text-muted); }
2489
2610
  .hjm-form__fieldset { min-inline-size: 0; margin: 0; padding: 0; border: 0; }
@@ -2493,18 +2614,22 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2493
2614
  .hjm-form__actions { display: flex; flex-wrap: wrap; gap: var(--hjm-space-sm); margin-block-start: var(--hjm-space-sm); }
2494
2615
 
2495
2616
  /* Advanced display ------------------------------------------------------- */
2496
- .hjm-timeline { display: grid; gap: var(--hjm-space-md); margin: 0; padding: 0; list-style: none; }
2617
+ /* timelineRecipe label/description are `body`; binding it here lets the rail and timestamp derive from the same line box. */
2618
+ .hjm-timeline { display: grid; gap: var(--hjm-space-md); margin: 0; padding: 0; list-style: none; font-size: var(--hjm-type-body-size); line-height: var(--hjm-type-body-line-height); }
2497
2619
  .hjm-timeline__item { min-inline-size: 0; display: grid; grid-template-columns: 1rem minmax(0, 1fr); gap: var(--hjm-space-sm); }
2498
2620
  .hjm-timeline__rail { position: relative; display: flex; justify-content: center; }
2499
- .hjm-timeline__dot { position: relative; z-index: 1; inline-size: 0.625rem; block-size: 0.625rem; margin-block-start: 0.25rem; border: 1px solid transparent; border-radius: var(--hjm-radius-full); background: var(--hjm-color-text-muted); }
2621
+ /* Dot, label first line and timestamp share the label's first line box (2026-10-17 measured audit: centers 396/397/398.5).
2622
+ The rail inherits the label's line height, so 1lh is that line box. */
2623
+ .hjm-timeline__dot { position: relative; z-index: 1; inline-size: 0.625rem; block-size: 0.625rem; margin-block-start: calc((1lh - 0.625rem) / 2); border: 1px solid transparent; border-radius: var(--hjm-radius-full); background: var(--hjm-color-text-muted); }
2500
2624
  .hjm-timeline__item[data-tone="info"] .hjm-timeline__dot { border-color: var(--hjm-accent-info); background: var(--hjm-accent-info); }
2501
2625
  .hjm-timeline__item[data-tone="success"] .hjm-timeline__dot { border-color: var(--hjm-accent-success); background: var(--hjm-accent-success); }
2502
2626
  .hjm-timeline__item[data-tone="attention"] .hjm-timeline__dot { border-color: var(--hjm-accent-attention); background: var(--hjm-accent-attention); }
2503
- .hjm-timeline__connector { position: absolute; inset-block: 0.875rem calc(-1 * var(--hjm-space-md)); inline-size: 1px; background: var(--hjm-color-border); }
2627
+ .hjm-timeline__connector { position: absolute; inset-block: calc((1lh + 0.625rem) / 2) calc(-1 * var(--hjm-space-md)); inline-size: 1px; background: var(--hjm-color-border); }
2504
2628
  .hjm-timeline__content { min-inline-size: 0; display: grid; gap: var(--hjm-space-xxs); padding-block-end: var(--hjm-space-xxs); }
2505
- .hjm-timeline__heading { min-inline-size: 0; display: flex; flex-wrap: wrap; align-items: baseline; justify-content: space-between; gap: var(--hjm-space-xxs) var(--hjm-space-sm); }
2506
- .hjm-timeline__label { color: var(--hjm-color-text); font-weight: var(--hjm-font-weight-semibold); overflow-wrap: anywhere; }
2507
- .hjm-timeline__timestamp { color: var(--hjm-color-text-muted); font-size: var(--hjm-type-caption-size); line-height: var(--hjm-type-caption-line-height); }
2629
+ .hjm-timeline__heading { min-inline-size: 0; display: flex; flex-wrap: wrap; align-items: flex-start; justify-content: space-between; gap: var(--hjm-space-xxs) var(--hjm-space-sm); }
2630
+ .hjm-timeline__label { color: var(--hjm-color-text); font-weight: var(--hjm-text-emphasis-medium); overflow-wrap: anywhere; }
2631
+ /* Baseline sharing put the smaller caption 1.5px under the label's center; center it on the label's first line instead. */
2632
+ .hjm-timeline__timestamp { margin-block-start: calc((var(--hjm-type-body-line-height) - var(--hjm-type-caption-line-height)) / 2); color: var(--hjm-color-text-muted); font-size: var(--hjm-type-caption-size); line-height: var(--hjm-type-caption-line-height); }
2508
2633
  .hjm-timeline__description { color: var(--hjm-color-text-body); white-space: pre-wrap; overflow-wrap: anywhere; }
2509
2634
  .hjm-accordion { border-block-start: 1px solid var(--hjm-color-border); }
2510
2635
  .hjm-accordion__item { border-block-end: 1px solid var(--hjm-color-border); }
@@ -2521,7 +2646,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2521
2646
  color: var(--hjm-color-text-body);
2522
2647
  background: transparent;
2523
2648
  font: inherit;
2524
- font-weight: var(--hjm-font-weight-bold);
2649
+ font-weight: var(--hjm-type-title-weight);
2525
2650
  text-align: start;
2526
2651
  cursor: pointer;
2527
2652
  }
@@ -2541,7 +2666,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2541
2666
  border-radius: 50%;
2542
2667
  color: var(--hjm-color-text-muted);
2543
2668
  background: var(--hjm-color-bg);
2544
- font-weight: var(--hjm-font-weight-bold);
2669
+ font-weight: var(--hjm-text-emphasis-strong);
2545
2670
  }
2546
2671
  .hjm-avatar[data-size="small"] { inline-size: 2rem; block-size: 2rem; font-size: var(--hjm-type-label-size); }
2547
2672
  .hjm-avatar[data-size="large"] { inline-size: 3rem; block-size: 3rem; }
@@ -2556,11 +2681,11 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2556
2681
  .hjm-divider[data-orientation="horizontal"][data-inset="both"] { margin-inline: var(--hjm-space-md); inline-size: calc(100% - (2 * var(--hjm-space-md))); }
2557
2682
  .hjm-description-list { display: grid; grid-template-columns: repeat(var(--hjm-description-columns), minmax(0, 1fr)); gap: var(--hjm-space-sm); margin: 0; }
2558
2683
  .hjm-description-list__item { min-inline-size: 0; display: grid; gap: var(--hjm-space-xxs); }
2559
- .hjm-description-list__label { color: var(--hjm-color-text-muted); font-size: var(--hjm-type-label-size); font-weight: var(--hjm-font-weight-semibold); }
2684
+ .hjm-description-list__label { color: var(--hjm-color-text-muted); font-size: var(--hjm-type-label-size); font-weight: var(--hjm-text-emphasis-medium); }
2560
2685
  .hjm-description-list__value { margin: 0; color: var(--hjm-color-text); overflow-wrap: anywhere; }
2561
2686
  .hjm-table-scroll { max-inline-size: 100%; overflow: auto; outline-offset: 2px; }
2562
2687
  .hjm-table { inline-size: 100%; border-collapse: collapse; color: var(--hjm-color-text-body); }
2563
- .hjm-table__caption { padding: var(--hjm-space-sm); color: var(--hjm-color-text); font-weight: var(--hjm-font-weight-bold); text-align: start; }
2688
+ .hjm-table__caption { padding: var(--hjm-space-sm); color: var(--hjm-color-text); font-weight: var(--hjm-type-title-weight); text-align: start; }
2564
2689
  .hjm-table__header,
2565
2690
  .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; }
2566
2691
  .hjm-table__header { color: var(--hjm-color-text); background: var(--hjm-color-bg); }
@@ -2575,7 +2700,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2575
2700
  .hjm-pagination__list { display: flex; align-items: center; flex-wrap: wrap; gap: var(--hjm-space-xxs); margin: 0; padding: 0; list-style: none; }
2576
2701
  .hjm-breadcrumb__item { display: inline-flex; align-items: center; gap: var(--hjm-space-xxs); min-inline-size: 0; }
2577
2702
  .hjm-breadcrumb__link { color: var(--hjm-color-text-muted); text-underline-offset: 0.18em; overflow-wrap: anywhere; }
2578
- .hjm-breadcrumb__current { color: var(--hjm-color-text); font-weight: var(--hjm-font-weight-semibold); overflow-wrap: anywhere; }
2703
+ .hjm-breadcrumb__current { color: var(--hjm-color-text); font-weight: var(--hjm-text-emphasis-medium); overflow-wrap: anywhere; }
2579
2704
  .hjm-breadcrumb__separator { color: var(--hjm-color-text-weak); }
2580
2705
  [dir="rtl"] .hjm-breadcrumb__separator[data-default="true"],
2581
2706
  [dir="rtl"] .hjm-pagination__previous > span,
@@ -2592,13 +2717,13 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2592
2717
  }
2593
2718
  .hjm-pagination__item { color: var(--hjm-color-text-body); background: transparent; font: inherit; cursor: pointer; }
2594
2719
  .hjm-pagination__item:hover:not([aria-disabled="true"]) { background: var(--hjm-color-bg); }
2595
- .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); }
2720
+ .hjm-pagination__item[data-state="current"] { border-color: var(--hjm-color-content-brand); color: var(--hjm-color-content-brand); font-weight: var(--hjm-text-emphasis-strong); }
2596
2721
  .hjm-pagination__item[aria-disabled="true"] { opacity: 0.5; cursor: not-allowed; }
2597
2722
  .hjm-pagination__ellipsis { color: var(--hjm-color-text-muted); }
2598
2723
  .hjm-load-more { display: grid; justify-items: center; gap: var(--hjm-space-sm); padding-block: var(--hjm-space-lg); text-align: center; }
2599
2724
  .hjm-load-more[data-density="compact"] { gap: var(--hjm-space-xs); padding-block: var(--hjm-space-sm); }
2600
2725
  .hjm-load-more__sentinel { inline-size: 1px; block-size: 1px; }
2601
- .hjm-load-more__trigger { 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; }
2726
+ .hjm-load-more__trigger { 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-text-emphasis-medium); cursor: pointer; }
2602
2727
  .hjm-load-more__status, .hjm-load-more__error { display: flex; align-items: center; justify-content: center; flex-wrap: wrap; gap: var(--hjm-space-sm); color: var(--hjm-color-text-muted); }
2603
2728
  .hjm-load-more__error { color: var(--hjm-color-danger); }
2604
2729
  .hjm-load-more__end { color: var(--hjm-color-text-muted); font-size: var(--hjm-type-caption-size); }
@@ -2608,23 +2733,23 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2608
2733
  .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; }
2609
2734
  .hjm-steps__step { min-inline-size: 0; display: grid; align-content: start; gap: var(--hjm-space-xs); }
2610
2735
  .hjm-steps__rail { display: flex; align-items: center; min-inline-size: 0; }
2611
- .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); }
2736
+ .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-text-emphasis-medium); }
2612
2737
  .hjm-steps__connector { flex: 1 1 auto; block-size: 1px; background: var(--hjm-color-border); }
2613
2738
  .hjm-steps__step[data-status="current"] .hjm-steps__indicator { border: 2px solid var(--hjm-color-content-brand); color: var(--hjm-color-content-brand); }
2614
2739
  .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); }
2615
2740
  .hjm-steps__step[data-status="complete"] .hjm-steps__connector { background: var(--hjm-color-content-brand); }
2616
2741
  .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); }
2617
2742
  .hjm-steps__copy { min-inline-size: 0; display: grid; gap: var(--hjm-space-xxs); padding-inline-end: var(--hjm-space-sm); }
2618
- .hjm-steps__label { color: var(--hjm-color-text); font-size: var(--hjm-type-label-size); line-height: var(--hjm-type-label-line-height); font-weight: var(--hjm-font-weight-semibold); overflow-wrap: anywhere; }
2743
+ .hjm-steps__label { color: var(--hjm-color-text); font-size: var(--hjm-type-label-size); line-height: var(--hjm-type-label-line-height); font-weight: var(--hjm-text-emphasis-medium); overflow-wrap: anywhere; }
2619
2744
  .hjm-steps__step[data-status="pending"] .hjm-steps__label { color: var(--hjm-color-text-muted); }
2620
2745
  .hjm-steps__step[data-status="error"] .hjm-steps__label { color: var(--hjm-color-danger); }
2621
2746
  .hjm-steps__description { color: var(--hjm-color-text-muted); font-size: var(--hjm-type-caption-size); overflow-wrap: anywhere; }
2622
2747
 
2623
2748
  .hjm-file-picker { display: grid; gap: var(--hjm-space-xs); }
2624
- .hjm-file-picker__label { color: var(--hjm-color-text); font-weight: var(--hjm-font-weight-semibold); }
2749
+ .hjm-file-picker__label { color: var(--hjm-color-text); font-weight: var(--hjm-text-emphasis-medium); }
2625
2750
  .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; }
2626
2751
  .hjm-file-picker[data-dragging] .hjm-file-picker__dropzone { border-color: var(--hjm-color-focus); background: var(--hjm-color-bg); }
2627
- .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; }
2752
+ .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-text-emphasis-medium); cursor: pointer; }
2628
2753
  .hjm-file-picker__hint { color: var(--hjm-color-text-muted); }
2629
2754
  .hjm-file-picker__error { color: var(--hjm-color-danger); }
2630
2755
 
@@ -2643,7 +2768,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2643
2768
  .hjm-upload-item__action { flex: 0 0 auto; margin-inline-start: auto; }
2644
2769
 
2645
2770
  .hjm-date-picker { display: grid; gap: var(--hjm-space-xs); }
2646
- .hjm-date-picker__label { color: var(--hjm-color-text); font-weight: var(--hjm-font-weight-semibold); }
2771
+ .hjm-date-picker__label { color: var(--hjm-color-text); font-weight: var(--hjm-text-emphasis-medium); }
2647
2772
  .hjm-date-picker__anchor { position: relative; display: flex; align-items: center; }
2648
2773
  .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-control); border-radius: var(--hjm-radius-md); color: var(--hjm-color-text-body); background: var(--hjm-color-bg); font: inherit; text-align: start; cursor: pointer; }
2649
2774
  /* datePickerRecipe.sizes.large.minHeight is control.buttonHeight.large (52), as Select/NumberField large. Web drew 56 until 2026-10-06. */
@@ -2668,7 +2793,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2668
2793
  controlled Toast outside the viewport keeps it too (it stretched to 1200px in the layout story, 2026-10-17 review).
2669
2794
  1.10.0 layout: [tone badge][title + description][close] / action pill on its own row, end-aligned.
2670
2795
  The 2px tone strip is retired — the tinted badge carries tone (toastRecipe.toneMark width 0). */
2671
- .hjm-toast { position: relative; min-inline-size: 0; max-inline-size: min(26.25rem, 100%); min-block-size: 3.5rem; display: grid; grid-template-columns: auto minmax(0, 1fr) auto; align-items: start; column-gap: var(--hjm-space-sm); row-gap: var(--hjm-space-xs); padding: var(--hjm-space-sm) var(--hjm-space-xs) var(--hjm-space-sm) var(--hjm-space-md); overflow: hidden; border: var(--hjm-toast-border-width) solid var(--hjm-toast-border); border-radius: var(--hjm-toast-radius); color: var(--hjm-color-text); background: var(--hjm-toast-background); box-shadow: var(--hjm-toast-shadow); pointer-events: auto; }
2796
+ .hjm-toast { position: relative; min-inline-size: 0; max-inline-size: min(26.25rem, 100%); min-block-size: 3.5rem; display: grid; grid-template-columns: auto minmax(0, 1fr) auto; align-items: start; column-gap: var(--hjm-space-sm); row-gap: var(--hjm-space-xs); padding: var(--hjm-toast-padding-block) var(--hjm-toast-padding-inline); overflow: hidden; border: var(--hjm-toast-border-width) solid var(--hjm-toast-border); border-radius: var(--hjm-toast-radius); color: var(--hjm-color-text); background: var(--hjm-toast-background); box-shadow: var(--hjm-toast-shadow); pointer-events: auto; }
2672
2797
  /* Whole-card activation is a sibling surface; explicit controls stay above it. */
2673
2798
  .hjm-toast__press { position: absolute; inset: 0; z-index: 1; border: 0; border-radius: inherit; padding: 0; background: transparent; cursor: pointer; }
2674
2799
  .hjm-toast__press:focus-visible { outline: 2px solid var(--hjm-color-content-brand); outline-offset: -2px; }
@@ -2680,10 +2805,14 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2680
2805
  .hjm-toast[data-tone="success"] .hjm-toast__icon { color: var(--hjm-toast-accent-success); background: var(--hjm-toast-badge-success); }
2681
2806
  .hjm-toast[data-tone="warning"] .hjm-toast__icon { color: var(--hjm-toast-accent-warning); background: var(--hjm-toast-badge-warning); }
2682
2807
  .hjm-toast[data-tone="danger"] .hjm-toast__icon { color: var(--hjm-toast-accent-danger); background: var(--hjm-toast-badge-danger); }
2683
- .hjm-toast__content { grid-column: 2; grid-row: 1; align-self: center; min-inline-size: 0; display: grid; gap: var(--hjm-space-xxs); padding-block: var(--hjm-space-xxs); overflow-wrap: anywhere; word-break: keep-all; }
2684
- .hjm-toast__title { font-weight: var(--hjm-font-weight-bold); line-height: var(--hjm-toast-title-line-height, 1.35); }
2808
+ /* First-line anchor (toastRecipe.anchor, 2026-10-17): the first line (title, else description) is centred on the
2809
+ badge box via its own line height (1lh), so profile and text-scale line heights stay aligned; extra lines grow
2810
+ downward while the lead column and close stay beside the first line. */
2811
+ .hjm-toast__content { grid-column: 2; grid-row: 1; align-self: start; min-inline-size: 0; min-block-size: var(--hjm-toast-anchor-size); display: grid; align-content: start; gap: var(--hjm-space-xxs); overflow-wrap: anywhere; word-break: keep-all; }
2812
+ .hjm-toast__content > :first-child { margin-block-start: calc((var(--hjm-toast-anchor-size) - 1lh) / 2); }
2813
+ .hjm-toast__title { font-weight: var(--hjm-type-title-weight); line-height: var(--hjm-toast-title-line-height, 1.35); }
2685
2814
  .hjm-toast__description { color: var(--hjm-toast-description-color); line-height: var(--hjm-toast-description-line-height, 1.45); }
2686
- .hjm-toast__close { grid-column: 3; grid-row: 1; align-self: start; display: grid; place-items: center; inline-size: var(--hjm-control-min-touch-target); min-block-size: var(--hjm-control-min-touch-target); margin-block-start: calc(-1 * var(--hjm-space-xxs)); border: 0; border-radius: 50%; color: var(--hjm-color-text-muted); background: transparent; cursor: pointer; }
2815
+ .hjm-toast__close { grid-column: 3; grid-row: 1; align-self: start; display: grid; place-items: center; inline-size: var(--hjm-toast-close-size); block-size: var(--hjm-toast-close-size); margin-block: calc(-1 * var(--hjm-toast-close-block-overhang)); margin-inline-end: calc(-1 * var(--hjm-toast-close-inline-overhang)); padding: 0; border: 0; border-radius: 50%; color: var(--hjm-color-text-muted); background: transparent; cursor: pointer; }
2687
2816
  .hjm-toast__close:hover { color: var(--hjm-color-text); }
2688
2817
  /* 2026-10-10 panel toast: product media replaces the tone badge in the leading column (toastRecipe.media),
2689
2818
  and a running task shows its steps under the description (toastRecipe.progress). */
@@ -2693,9 +2822,9 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2693
2822
  .hjm-toast__progress-step { display: inline-flex; align-items: center; gap: var(--hjm-space-xxs); color: var(--hjm-toast-progress-label); }
2694
2823
  .hjm-toast__progress-dot { flex: none; inline-size: var(--hjm-toast-progress-dot); block-size: var(--hjm-toast-progress-dot); border-radius: 50%; background: var(--hjm-toast-progress-upcoming); }
2695
2824
  .hjm-toast__progress-step[data-state="done"] .hjm-toast__progress-dot { background: var(--hjm-toast-progress-done); }
2696
- .hjm-toast__progress-step[data-state="current"] { color: var(--hjm-toast-progress-current-label); font-weight: var(--hjm-font-weight-bold); }
2825
+ .hjm-toast__progress-step[data-state="current"] { color: var(--hjm-toast-progress-current-label); font-weight: var(--hjm-text-emphasis-strong); }
2697
2826
  .hjm-toast__progress-step[data-state="current"] .hjm-toast__progress-dot { background: var(--hjm-toast-progress-done); transform: scale(var(--hjm-toast-progress-current-scale)); }
2698
- .hjm-toast__action { grid-column: 2 / -1; grid-row: 2; justify-self: var(--hjm-toast-action-align, start); margin-inline-end: var(--hjm-space-xs); min-block-size: var(--hjm-control-min-touch-target); max-inline-size: 100%; padding-inline: var(--hjm-space-md); border: 0; border-radius: 999px; color: var(--hjm-toast-action-color); background: var(--hjm-toast-action-background); font: inherit; font-weight: var(--hjm-font-weight-bold); overflow-wrap: anywhere; text-align: center; cursor: pointer; }
2827
+ .hjm-toast__action { grid-column: 2 / -1; grid-row: 2; justify-self: var(--hjm-toast-action-align, start); min-block-size: var(--hjm-control-min-touch-target); max-inline-size: 100%; padding-inline: var(--hjm-space-md); border: 0; border-radius: 999px; color: var(--hjm-toast-action-color); background: var(--hjm-toast-action-background); font: inherit; font-weight: var(--hjm-text-emphasis-medium); overflow-wrap: anywhere; text-align: center; cursor: pointer; }
2699
2828
  .hjm-toast__action:hover { filter: brightness(0.97); }
2700
2829
  .hjm-toast[data-state="closing"] { opacity: 0; transform: translateY(var(--hjm-space-xs)); transition: opacity var(--hjm-toast-exit-duration) var(--hjm-toast-exit-easing), transform var(--hjm-toast-exit-duration) var(--hjm-toast-exit-easing); }
2701
2830
 
@@ -2717,6 +2846,9 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2717
2846
  outline: 2px solid var(--hjm-color-content-brand);
2718
2847
  outline-offset: 2px;
2719
2848
  }
2849
+ /* The close target overhangs into the card padding (toastRecipe.close.inlineOverhang), so an outer ring would be
2850
+ clipped by the card's overflow; draw it inside the 44 target instead. */
2851
+ .hjm-toast__close:focus-visible { outline-offset: -2px; }
2720
2852
 
2721
2853
  @keyframes hjm-spin { to { transform: rotate(360deg); } }
2722
2854
  @keyframes hjm-pulse { from { opacity: var(--hjm-skeleton-from-opacity); } to { opacity: var(--hjm-skeleton-to-opacity); } }
@@ -2724,6 +2856,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2724
2856
  .hjm-root[data-motion="reduced"] .hjm-button__spinner,
2725
2857
  .hjm-root[data-motion="reduced"] .hjm-spinner__glyph,
2726
2858
  .hjm-root[data-motion="reduced"] .hjm-skeleton,
2859
+ .hjm-root[data-motion="reduced"] .hjm-skeleton-lines,
2727
2860
  .hjm-root[data-motion="reduced"] .hjm-combobox__spinner {
2728
2861
  animation: none;
2729
2862
  }
@@ -2741,6 +2874,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2741
2874
  .hjm-button__spinner,
2742
2875
  .hjm-spinner__glyph,
2743
2876
  .hjm-skeleton,
2877
+ .hjm-skeleton-lines,
2744
2878
  .hjm-combobox__spinner {
2745
2879
  animation: none;
2746
2880
  }
@@ -2765,7 +2899,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2765
2899
  .hjm-top-bar__trailing { justify-content: flex-end; }
2766
2900
  .hjm-top-bar__title { min-inline-size: 0; text-align: center; overflow-wrap: anywhere; }
2767
2901
  .hjm-top-bar__subtitle { display: block; color: var(--hjm-color-text-muted); font-size: var(--hjm-type-caption-size); line-height: var(--hjm-type-caption-line-height); }
2768
- .hjm-top-bar__heading { margin: 0; font-size: var(--hjm-type-body-large-size); line-height: var(--hjm-type-body-large-line-height); font-weight: var(--hjm-font-weight-bold); }
2902
+ .hjm-top-bar__heading { margin: 0; font-size: var(--hjm-type-body-large-size); line-height: var(--hjm-type-body-large-line-height); font-weight: var(--hjm-type-title-weight); }
2769
2903
  .hjm-top-bar__heading > span { display: inline-flex; align-items: center; gap: var(--hjm-top-bar-gap); }
2770
2904
  .hjm-top-bar[data-centered="false"] { grid-template-columns: auto minmax(0, 1fr) auto; }
2771
2905
  .hjm-top-bar[data-centered="false"] .hjm-top-bar__title { text-align: start; }
@@ -2776,7 +2910,9 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2776
2910
  .hjm-bottom-cta[data-position="sticky"] { position: sticky; inset-block-end: 0; z-index: var(--hjm-layer-sticky); }
2777
2911
  /* Inside ScreenLayout's footer the footer owns border, padding, surface and safe area; BottomCTA keeps only its copy,
2778
2912
  actions and an explicit safeAreaBottom (2026-10-17: the doubled bar inset the buttons twice). */
2779
- .hjm-bottom-cta[data-placement="screen-footer"] { position: static; min-block-size: 0; padding: 0 0 var(--hjm-bottom-cta-safe-area); border: 0; background: none; box-shadow: none; }
2913
+ /* The screen footer already pads max(screen padding, env(safe-area-inset-bottom)); an explicit safeAreaBottom adds only
2914
+ the remainder so the gap is max(footer, inset), not their sum (2026-10-17 "버튼 아래 여백이 많아"). */
2915
+ .hjm-bottom-cta[data-placement="screen-footer"] { position: static; min-block-size: 0; padding: 0 0 max(0px, calc(var(--hjm-bottom-cta-safe-area) - max(var(--hjm-screen-padding), env(safe-area-inset-bottom, 0px)))); border: 0; background: none; box-shadow: none; }
2780
2916
  .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; }
2781
2917
  .hjm-bottom-cta__actions { display: flex; flex-wrap: wrap; gap: var(--hjm-bottom-cta-gap); }
2782
2918
  /* bottomCtaRecipe.contentMaxWidth: the surface spans the viewport, its copy and actions stop at the reading width. */
@@ -2814,7 +2950,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2814
2950
  the grid instead of shrinking dates or wrapping a week onto another row. */
2815
2951
  .hjm-calendar { display: grid; gap: var(--hjm-space-xs); min-inline-size: 0; max-inline-size: var(--hjm-calendar-max-width); }
2816
2952
  .hjm-calendar__header { display: grid; grid-template-columns: var(--hjm-control-min-touch-target) minmax(0, 1fr) var(--hjm-control-min-touch-target); align-items: center; gap: var(--hjm-space-xs); }
2817
- .hjm-calendar__header strong { text-align: center; overflow-wrap: anywhere; font-size: var(--hjm-type-title-size); line-height: var(--hjm-type-title-line-height); font-weight: var(--hjm-font-weight-bold); }
2953
+ .hjm-calendar__header strong { text-align: center; overflow-wrap: anywhere; font-size: var(--hjm-type-title-size); line-height: var(--hjm-type-title-line-height); font-weight: var(--hjm-type-title-weight); }
2818
2954
  .hjm-calendar__header button { min-block-size: var(--hjm-control-min-touch-target); border: 0; border-radius: var(--hjm-radius-full); background: transparent; color: var(--hjm-color-text-body); font: inherit; cursor: pointer; }
2819
2955
  .hjm-calendar__viewport { overflow-x: auto; padding: var(--hjm-space-xxs); }
2820
2956
  .hjm-calendar__grid { min-inline-size: calc(7 * var(--hjm-calendar-cell-size)); }
@@ -2843,7 +2979,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2843
2979
  .hjm-anchor__list { display: flex; flex-direction: column; gap: var(--hjm-space-xxs); list-style: none; margin: 0; padding: 0; }
2844
2980
  .hjm-anchor__link { display: block; padding: var(--hjm-space-xs); border-inline-start: 2px solid transparent; color: var(--hjm-color-text-muted); text-decoration: none; overflow-wrap: anywhere; }
2845
2981
  .hjm-anchor__link:hover { text-decoration: underline; text-underline-offset: 0.18em; }
2846
- .hjm-anchor__link[aria-current="location"] { color: var(--hjm-color-content-brand); border-color: var(--hjm-color-focus); font-weight: var(--hjm-font-weight-bold); }
2982
+ .hjm-anchor__link[aria-current="location"] { color: var(--hjm-color-content-brand); border-color: var(--hjm-color-focus); font-weight: var(--hjm-text-emphasis-strong); }
2847
2983
  .hjm-anchor__link:focus-visible { outline: 2px solid var(--hjm-color-focus); outline-offset: 2px; }
2848
2984
  .hjm-anchor[data-orientation="horizontal"] .hjm-anchor__list { flex-direction: row; flex-wrap: wrap; }
2849
2985
  .hjm-anchor[data-orientation="horizontal"] .hjm-anchor__link { border-inline-start: 0; border-block-end: 2px solid transparent; }
@@ -2854,7 +2990,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2854
2990
  .hjm-popover { box-sizing: border-box; inline-size: var(--hjm-popover-max-width); overflow: auto; overscroll-behavior: contain; padding: var(--hjm-space-sm); border: var(--hjm-stroke-default) solid var(--hjm-color-border); border-radius: var(--hjm-radius-md); background: var(--hjm-color-bg); color: var(--hjm-color-text-body); pointer-events: auto; animation: hjm-popover-in var(--hjm-popover-duration) var(--hjm-popover-easing); }
2855
2991
  .hjm-popover[data-state="closed"] { pointer-events: none; animation-name: hjm-popover-out; }
2856
2992
  .hjm-popover__header { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: var(--hjm-space-xs); }
2857
- .hjm-popover__title { flex: 1 1 50%; min-inline-size: 0; margin: 0; font-size: var(--hjm-type-body-size); font-weight: var(--hjm-font-weight-bold); line-height: var(--hjm-type-body-line-height); overflow-wrap: anywhere; }
2993
+ .hjm-popover__title { flex: 1 1 50%; min-inline-size: 0; margin: 0; font-size: var(--hjm-type-body-size); font-weight: var(--hjm-type-title-weight); line-height: var(--hjm-type-body-line-height); overflow-wrap: anywhere; }
2858
2994
  .hjm-popover__description { margin-block: var(--hjm-space-xs) var(--hjm-space-md); color: var(--hjm-color-text-muted); overflow-wrap: anywhere; }
2859
2995
  .hjm-popover__body { min-inline-size: 0; padding-block-start: var(--hjm-space-xs); overflow-wrap: anywhere; }
2860
2996
  .hjm-popover:focus-visible { outline: 2px solid var(--hjm-color-focus); outline-offset: 2px; }
@@ -2917,7 +3053,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2917
3053
  .hjm-menu-morph__measure { position: absolute; visibility: hidden; pointer-events: none; inset-block-start: 0; inset-inline-start: 0; }
2918
3054
  .hjm-menu-morph__surface { color: var(--hjm-color-text); background: var(--hjm-color-bg); border: 1px solid var(--hjm-color-border-control); }
2919
3055
  .hjm-menu-morph[data-open="false"] .hjm-menu-morph__surface { box-shadow: none !important; }
2920
- .hjm-menu-morph__trigger { gap: var(--hjm-space-xs); padding-inline: var(--hjm-space-md); font-family: var(--hjm-font-family-ui, inherit); font-size: var(--hjm-type-body-size); font-weight: var(--hjm-font-weight-semibold); line-height: var(--hjm-type-body-line-height); }
3056
+ .hjm-menu-morph__trigger { gap: var(--hjm-space-xs); padding-inline: var(--hjm-space-md); font-family: var(--hjm-font-family-ui, inherit); font-size: var(--hjm-type-body-size); font-weight: var(--hjm-text-emphasis-medium); line-height: var(--hjm-type-body-line-height); }
2921
3057
  .hjm-menu-morph [role="button"]:focus-visible, .hjm-menu-morph__item:focus-visible { outline: 2px solid var(--hjm-color-focus); outline-offset: -2px; }
2922
3058
  .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; }
2923
3059
  .hjm-menu-morph__item:hover, .hjm-menu-morph__item:focus { background: var(--hjm-color-bg); }
@@ -3008,7 +3144,9 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
3008
3144
  @supports (backdrop-filter: blur(20px)) {
3009
3145
  .hjm-navigation-bar { background: color-mix(in srgb, var(--hjm-color-surface) 92%, transparent); backdrop-filter: blur(20px); -webkit-backdrop-filter: blur(20px); }
3010
3146
  }
3011
- .hjm-navigation-bar__brand { flex-shrink: 0; padding-inline: var(--hjm-space-xs); }
3147
+ /* The brand added spacing.xs on top of the bar's spacing.sm padding, so it started 21px in against 13px for the
3148
+ end controls (2026-10-17 measured audit). Native has no extra brand inset; both edges now use the bar padding. */
3149
+ .hjm-navigation-bar__brand { flex-shrink: 0; }
3012
3150
  .hjm-navigation-bar__destinations, .hjm-navigation-bar__actions { display: flex; align-items: center; flex-wrap: wrap; gap: var(--hjm-space-xs); min-inline-size: 0; }
3013
3151
  .hjm-navigation-bar__destinations { flex: 1; }
3014
3152
  .hjm-navigation-bar__actions > * { max-inline-size: 100%; }
@@ -3103,7 +3241,7 @@ button.hjm-chat-message__media-item:focus-visible { outline: 2px solid var(--hjm
3103
3241
  .hjm-screen__exit-glyph[data-kind="back"]:dir(rtl) { transform: scaleX(-1); }
3104
3242
 
3105
3243
  .hjm-image-choice { display: flex; flex-direction: column; gap: var(--hjm-space-xs); }
3106
- .hjm-image-choice__label { font-weight: 600; }
3244
+ .hjm-image-choice__label { font-weight: var(--hjm-text-emphasis-medium); }
3107
3245
  .hjm-image-choice__tiles { display: flex; flex-wrap: wrap; gap: var(--hjm-image-choice-gap); }
3108
3246
  .hjm-image-choice__tile { position: relative; inline-size: calc(var(--hjm-image-choice-size) + (var(--hjm-image-choice-ring) + var(--hjm-image-choice-offset)) * 2); aspect-ratio: 1; padding: var(--hjm-image-choice-offset); border: var(--hjm-image-choice-ring) solid transparent; border-radius: calc(var(--hjm-image-choice-radius) + var(--hjm-image-choice-ring) + var(--hjm-image-choice-offset)); background: none; cursor: pointer; }
3109
3247
  .hjm-image-choice__tile[data-selected] { border-color: var(--hjm-color-content-brand); }
@@ -3147,13 +3285,21 @@ button.hjm-chat-message__media-item:focus-visible { outline: 2px solid var(--hjm
3147
3285
  .hjm-comment-thread { display: flex; flex-direction: column; }
3148
3286
  .hjm-comment-row__avatar { flex: 0 0 auto; display: flex; justify-content: center; }
3149
3287
  .hjm-comment-row__text { flex: 1; min-inline-size: 0; display: flex; flex-direction: column; }
3288
+ /* The <time> wrapper is a flex box so its caption is the line: as an inline box it added the body line-height strut,
3289
+ making the identity line 19 tall and moving the author 1.5px off the action anchor (2026-10-17 measurement). */
3290
+ .hjm-comment-row__time { display: flex; }
3150
3291
  .hjm-comment-row__reactions { display: flex; flex-direction: column; gap: 2px; border-radius: var(--hjm-radius-sm); -webkit-touch-callout: none; }
3151
3292
  .hjm-comment-row__reactions:focus-visible { outline: 2px solid var(--hjm-color-focus, currentColor); outline-offset: 2px; }
3152
3293
  .hjm-comment-row__media { align-self: flex-start; overflow: hidden; margin-block-start: 4px; }
3153
3294
  .hjm-comment-row__media > img { display: block; inline-size: 100%; block-size: auto; }
3154
- .hjm-comment-row__like { flex: 0 0 auto; display: flex; flex-direction: column; align-items: flex-start; }
3295
+ /* commentThreadRecipe.actionAnchor (2026-10-17 measured audit): the 44 targets centre on the identity's first line
3296
+ (--hjm-comment-anchor-line, set per row), so like/more glyphs share the author line's centre instead of sitting
3297
+ 12px below it. When HJM's own like/more is the last control (data-edge), the whole column takes the IconButton edge
3298
+ overhang: the 44-wide like count under the heart shares the column, so a margin on the button alone was absorbed. */
3299
+ .hjm-comment-row__like { flex: 0 0 auto; display: flex; flex-direction: column; align-items: flex-start; margin-block-start: calc((var(--hjm-comment-anchor-line) - var(--hjm-control-button-medium)) / 2); }
3300
+ .hjm-comment-row__like[data-edge="end"] { margin-inline-end: calc(-1 * var(--hjm-icon-button-edge-medium)); }
3155
3301
  .hjm-comment-row__like-count { text-align: center; }
3156
- .hjm-comment-row__action { align-self: flex-start; padding: 0; border: 0; background: none; color: var(--hjm-color-text-muted); font: inherit; font-size: var(--hjm-type-caption-size); line-height: var(--hjm-type-caption-line-height); font-weight: 600; cursor: pointer; }
3302
+ .hjm-comment-row__action { align-self: flex-start; padding: 0; border: 0; background: none; color: var(--hjm-color-text-muted); font: inherit; font-size: var(--hjm-type-caption-size); line-height: var(--hjm-type-caption-line-height); font-weight: var(--hjm-text-emphasis-medium); cursor: pointer; }
3157
3303
  .hjm-comment-row__action:disabled { opacity: 0.5; cursor: default; }
3158
3304
  .hjm-comment-row__action:focus-visible { outline: 2px solid var(--hjm-color-focus, currentColor); outline-offset: 2px; border-radius: var(--hjm-radius-sm); }
3159
3305
  .hjm-chat-screen__jump { position: absolute; inset-block-end: calc(100% + var(--hjm-space-xs) + var(--hjm-screen-padding)); inset-inline-end: 0; }
@@ -3224,7 +3370,7 @@ button.hjm-chat-message__media-item:focus-visible { outline: 2px solid var(--hjm
3224
3370
  .hjm-segmented[data-presentation="pills"] .hjm-segmented__item { padding-block:var(--hjm-space-xs); position:relative; flex:0 1 auto; min-inline-size:0; min-block-size:var(--hjm-control-min-touch-target); border:0; border-radius:var(--hjm-radius-full); background:transparent; box-shadow:none; padding-inline:var(--hjm-space-md); color:var(--hjm-color-text-muted); }
3225
3371
  .hjm-segmented[data-presentation="pills"] .hjm-segmented__item::before { content:""; position:absolute; inset:var(--hjm-space-xs) 0; border-radius:var(--hjm-radius-full); background:var(--hjm-color-surface-alt); }
3226
3372
  .hjm-segmented[data-presentation="pills"] .hjm-segmented__item > span { position:relative; overflow-wrap:anywhere; }
3227
- .hjm-segmented[data-presentation="pills"] .hjm-segmented__item[data-state="checked"] { color:var(--hjm-color-bg); font-weight:var(--hjm-font-weight-bold); }
3373
+ .hjm-segmented[data-presentation="pills"] .hjm-segmented__item[data-state="checked"] { color:var(--hjm-color-bg); font-weight:var(--hjm-font-weight-semibold); }
3228
3374
  .hjm-segmented[data-presentation="pills"] .hjm-segmented__item[data-state="checked"]::before { background:var(--hjm-color-text-body); }
3229
3375
  .hjm-segmented[data-presentation="pills"] .hjm-segmented__item:focus-within { outline:2px solid var(--hjm-color-focus); outline-offset:2px; }
3230
3376
 
@@ -3273,12 +3419,12 @@ button.hjm-chat-message__media-item:focus-visible { outline: 2px solid var(--hjm
3273
3419
 
3274
3420
  /* Text radio navigation shares the selection engine and its focus behavior. */
3275
3421
  .hjm-segmented[data-presentation="text"] .hjm-segmented__items { flex-direction:row; gap:var(--hjm-space-md); padding:0; border:0; border-radius:0; background:transparent; }
3276
- .hjm-segmented[data-presentation="text"] .hjm-segmented__item { flex:0 0 auto; display:flex; flex-direction:column; justify-content:center; min-block-size:var(--hjm-control-min-touch-target); padding:0; gap:var(--hjm-space-xxs); box-shadow:none; background:transparent; color:var(--hjm-color-text-muted); font-size:var(--hjm-type-body-large-size); font-weight:500; }
3422
+ .hjm-segmented[data-presentation="text"] .hjm-segmented__item { flex:0 0 auto; display:flex; flex-direction:column; justify-content:center; min-block-size:var(--hjm-control-min-touch-target); padding:0; gap:var(--hjm-space-xxs); box-shadow:none; background:transparent; color:var(--hjm-color-text-muted); font-size:var(--hjm-type-body-large-size); font-weight:var(--hjm-text-emphasis-medium); }
3277
3423
  .hjm-segmented[data-presentation="text"] .hjm-segmented__item::after { content:""; position:static; width:16px; height:2px; border-radius:var(--hjm-radius-full); background:transparent; }
3278
- .hjm-segmented[data-presentation="text"] .hjm-segmented__item[data-state="checked"] { color:var(--hjm-color-text); font-weight:700; }
3424
+ .hjm-segmented[data-presentation="text"] .hjm-segmented__item[data-state="checked"] { color:var(--hjm-color-text); font-weight:var(--hjm-font-weight-semibold); }
3279
3425
  .hjm-segmented[data-presentation="text"] .hjm-segmented__item[data-state="checked"]::after { background:var(--hjm-color-content-brand); }
3280
- .hjm-segmented[data-presentation="text"][data-text-emphasis="regular"] .hjm-segmented__item { font-weight:400; }
3281
- .hjm-segmented[data-presentation="text"][data-text-emphasis="regular"] .hjm-segmented__item[data-state="checked"] { font-weight:600; }
3426
+ .hjm-segmented[data-presentation="text"][data-text-emphasis="regular"] .hjm-segmented__item { font-weight:var(--hjm-text-emphasis-regular); }
3427
+ .hjm-segmented[data-presentation="text"][data-text-emphasis="regular"] .hjm-segmented__item[data-state="checked"] { font-weight:var(--hjm-text-emphasis-strong); }
3282
3428
 
3283
3429
  /* Long read-only records need a stable label column across wrapped values. */
3284
3430
  .hjm-description-list[data-layout="inline"] { gap: 0; }