@hjmds/react 1.33.2 → 1.35.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 (137) hide show
  1. package/dist/actions.d.ts +23 -2
  2. package/dist/actions.d.ts.map +1 -1
  3. package/dist/actions.js +61 -6
  4. package/dist/actions.js.map +1 -1
  5. package/dist/advanced-display.d.ts +35 -2
  6. package/dist/advanced-display.d.ts.map +1 -1
  7. package/dist/advanced-display.js +28 -9
  8. package/dist/advanced-display.js.map +1 -1
  9. package/dist/anchor.d.ts +3 -1
  10. package/dist/anchor.d.ts.map +1 -1
  11. package/dist/anchor.js +5 -5
  12. package/dist/anchor.js.map +1 -1
  13. package/dist/auth-screen.d.ts.map +1 -1
  14. package/dist/auth-screen.js +5 -2
  15. package/dist/auth-screen.js.map +1 -1
  16. package/dist/avatar-blobatar-motion.d.ts.map +1 -1
  17. package/dist/avatar-blobatar-motion.js +2 -1
  18. package/dist/avatar-blobatar-motion.js.map +1 -1
  19. package/dist/avatar-blobatar.d.ts.map +1 -1
  20. package/dist/avatar-blobatar.js +2 -1
  21. package/dist/avatar-blobatar.js.map +1 -1
  22. package/dist/bottom-cta.d.ts +8 -1
  23. package/dist/bottom-cta.d.ts.map +1 -1
  24. package/dist/bottom-cta.js +6 -2
  25. package/dist/bottom-cta.js.map +1 -1
  26. package/dist/carousel-motion.d.ts.map +1 -1
  27. package/dist/carousel-motion.js +11 -2
  28. package/dist/carousel-motion.js.map +1 -1
  29. package/dist/carousel.d.ts +10 -0
  30. package/dist/carousel.d.ts.map +1 -1
  31. package/dist/carousel.js +23 -7
  32. package/dist/carousel.js.map +1 -1
  33. package/dist/collapsible.d.ts +6 -0
  34. package/dist/collapsible.d.ts.map +1 -1
  35. package/dist/collapsible.js +22 -20
  36. package/dist/collapsible.js.map +1 -1
  37. package/dist/collection-rail.d.ts +4 -4
  38. package/dist/collection-rail.d.ts.map +1 -1
  39. package/dist/collection-rail.js.map +1 -1
  40. package/dist/conversation-row.d.ts.map +1 -1
  41. package/dist/conversation-row.js +4 -1
  42. package/dist/conversation-row.js.map +1 -1
  43. package/dist/data-table.d.ts +2 -0
  44. package/dist/data-table.d.ts.map +1 -1
  45. package/dist/data-table.js +2 -2
  46. package/dist/data-table.js.map +1 -1
  47. package/dist/display.d.ts +60 -3
  48. package/dist/display.d.ts.map +1 -1
  49. package/dist/display.js +33 -10
  50. package/dist/display.js.map +1 -1
  51. package/dist/evidence.d.ts +1 -1
  52. package/dist/evidence.d.ts.map +1 -1
  53. package/dist/evidence.js +2 -1
  54. package/dist/evidence.js.map +1 -1
  55. package/dist/feedback.d.ts +5 -0
  56. package/dist/feedback.d.ts.map +1 -1
  57. package/dist/feedback.js +7 -5
  58. package/dist/feedback.js.map +1 -1
  59. package/dist/floating-action-button.js +1 -1
  60. package/dist/floating-action-button.js.map +1 -1
  61. package/dist/forms.d.ts.map +1 -1
  62. package/dist/forms.js +4 -4
  63. package/dist/forms.js.map +1 -1
  64. package/dist/image-choice.js +3 -3
  65. package/dist/image-choice.js.map +1 -1
  66. package/dist/index.d.ts +5 -4
  67. package/dist/index.d.ts.map +1 -1
  68. package/dist/index.js +5 -4
  69. package/dist/index.js.map +1 -1
  70. package/dist/internal/initial-focus.d.ts +6 -0
  71. package/dist/internal/initial-focus.d.ts.map +1 -1
  72. package/dist/internal/initial-focus.js +6 -0
  73. package/dist/internal/initial-focus.js.map +1 -1
  74. package/dist/internal/pending-content.d.ts +19 -0
  75. package/dist/internal/pending-content.d.ts.map +1 -0
  76. package/dist/internal/pending-content.js +34 -0
  77. package/dist/internal/pending-content.js.map +1 -0
  78. package/dist/internal/screen-footer.d.ts +4 -2
  79. package/dist/internal/screen-footer.d.ts.map +1 -1
  80. package/dist/internal/screen-footer.js +2 -2
  81. package/dist/internal/screen-footer.js.map +1 -1
  82. package/dist/internal.d.ts +9 -1
  83. package/dist/internal.d.ts.map +1 -1
  84. package/dist/internal.js +4 -0
  85. package/dist/internal.js.map +1 -1
  86. package/dist/navigation.d.ts.map +1 -1
  87. package/dist/navigation.js +58 -4
  88. package/dist/navigation.js.map +1 -1
  89. package/dist/number-field.d.ts.map +1 -1
  90. package/dist/number-field.js +4 -3
  91. package/dist/number-field.js.map +1 -1
  92. package/dist/overlays.d.ts +4 -0
  93. package/dist/overlays.d.ts.map +1 -1
  94. package/dist/overlays.js +46 -18
  95. package/dist/overlays.js.map +1 -1
  96. package/dist/public-exports.generated.d.ts +6 -0
  97. package/dist/public-exports.generated.d.ts.map +1 -1
  98. package/dist/public-exports.generated.js +18 -0
  99. package/dist/public-exports.generated.js.map +1 -1
  100. package/dist/screen-flows.d.ts +13 -6
  101. package/dist/screen-flows.d.ts.map +1 -1
  102. package/dist/screen-flows.js +26 -15
  103. package/dist/screen-flows.js.map +1 -1
  104. package/dist/screens.d.ts +19 -6
  105. package/dist/screens.d.ts.map +1 -1
  106. package/dist/screens.js +22 -11
  107. package/dist/screens.js.map +1 -1
  108. package/dist/selection.d.ts +22 -0
  109. package/dist/selection.d.ts.map +1 -1
  110. package/dist/selection.js +32 -9
  111. package/dist/selection.js.map +1 -1
  112. package/dist/shortcut-rail.d.ts +27 -0
  113. package/dist/shortcut-rail.d.ts.map +1 -0
  114. package/dist/shortcut-rail.js +37 -0
  115. package/dist/shortcut-rail.js.map +1 -0
  116. package/dist/steps.d.ts +5 -2
  117. package/dist/steps.d.ts.map +1 -1
  118. package/dist/steps.js +3 -3
  119. package/dist/steps.js.map +1 -1
  120. package/dist/styles.css +242 -61
  121. package/dist/styles.layered.css +242 -61
  122. package/dist/task-list.d.ts +3 -1
  123. package/dist/task-list.d.ts.map +1 -1
  124. package/dist/task-list.js +2 -2
  125. package/dist/task-list.js.map +1 -1
  126. package/dist/theme.d.ts.map +1 -1
  127. package/dist/theme.js +1 -0
  128. package/dist/theme.js.map +1 -1
  129. package/dist/time-picker.d.ts +9 -0
  130. package/dist/time-picker.d.ts.map +1 -0
  131. package/dist/time-picker.js +74 -0
  132. package/dist/time-picker.js.map +1 -0
  133. package/dist/top-bar.d.ts +4 -0
  134. package/dist/top-bar.d.ts.map +1 -1
  135. package/dist/top-bar.js +2 -2
  136. package/dist/top-bar.js.map +1 -1
  137. package/package.json +26 -15
@@ -229,6 +229,7 @@
229
229
  cursor: pointer;
230
230
  }
231
231
  .hjm-button {
232
+ text-decoration: none;
232
233
  position: relative;
233
234
  min-block-size: var(--hjm-control-button-medium);
234
235
  padding: var(--hjm-space-xs) var(--hjm-space-md);
@@ -277,10 +278,23 @@
277
278
  버튼인지 잃고, 무제한 줄바꿈은 하단 CTA 행 같은 남의 레이아웃을 밀어낸다. */
278
279
  .hjm-button__label { min-inline-size: 0; overflow-wrap: anywhere; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: var(--hjm-button-label-lines, 2); overflow: hidden; }
279
280
  /* Keep the original content in layout for stable width; the sole visible busy cue sits at the frame center. */
280
- .hjm-button[data-state="loading"] > :not(.hjm-button__loading-indicator) { opacity: 0; }
281
+ .hjm-button[data-state="loading"] > :not(.hjm-button__loading-indicator):not(.hjm-button__face),
282
+ .hjm-button[data-state="loading"] > .hjm-button__face > :not(.hjm-button__loading-indicator) { opacity: 0; }
281
283
  .hjm-button__loading-indicator { position: absolute; inset: 0; display: grid; place-items: center; pointer-events: none; }
282
284
  /* 큰 글자 설정에서는 상한을 푼다 — 사용자가 키운 글자를 잘라 내용을 숨기면 WCAG 1.4.4다. */
283
285
  [data-large-text="true"] .hjm-button__label { display: block; overflow: visible; }
286
+ /* The root stays still as the face sinks, preserving the original pointer/focus target. */
287
+ .hjm-button[data-full-width="true"] { inline-size: 100%; }
288
+ .hjm-button[data-tone="primary"] { --hjm-button-face-fill: var(--hjm-color-primary); }
289
+ .hjm-button[data-tone="secondary"] { --hjm-button-face-fill: var(--hjm-color-bg); --hjm-button-face-border: var(--hjm-color-border-control); }
290
+ .hjm-button[data-tone="danger"] { --hjm-button-face-fill: var(--hjm-color-danger-fill); }
291
+ .hjm-button[data-selected="true"] { --hjm-button-face-fill: var(--hjm-color-bg); --hjm-button-face-border: transparent; }
292
+ .hjm-button[data-raised="true"] { padding: 0 0 var(--hjm-button-depth); border: 0; gap: 0; flex-direction: column; background: color-mix(in srgb, var(--hjm-button-side), #000 var(--hjm-button-side-shade)); }
293
+ .hjm-button__face { position: relative; display: flex; box-sizing: border-box; inline-size: 100%; min-block-size: inherit; flex: 1; align-items: center; justify-content: inherit; gap: var(--hjm-space-xs); padding: var(--hjm-space-xs) var(--hjm-button-face-padding); border: 1px solid var(--hjm-button-face-border, transparent); border-radius: inherit; background: var(--hjm-button-face-fill); transition: transform var(--hjm-button-settle) ease-out; }
294
+ .hjm-button[data-raised="true"]:active:not(:disabled):not([aria-disabled="true"]) { opacity: 1; }
295
+ .hjm-button[data-raised="true"]:active:not(:disabled):not([aria-disabled="true"]) > .hjm-button__face { transform: translateY(var(--hjm-button-depth)); }
296
+ @media (prefers-reduced-motion: reduce) { .hjm-button__face { transition: none; } }
297
+ [data-reduced-motion="true"] .hjm-button__face { transition: none; }
284
298
  .hjm-button__spinner,
285
299
  .hjm-spinner__glyph {
286
300
  display: inline-block;
@@ -350,11 +364,12 @@
350
364
  font-family: var(--hjm-font-family-ui, inherit); display: grid; gap: var(--hjm-space-xs); min-inline-size: 0; }
351
365
  .hjm-field__label { color: var(--hjm-color-text-body); font-weight: var(--hjm-text-emphasis-medium); }
352
366
  .hjm-field__control {
367
+ --hjm-field-resolved-border-width: var(--hjm-field-border-width);
353
368
  display: flex;
354
369
  align-items: center;
355
370
  min-block-size: var(--hjm-control-field-height);
356
371
  padding-inline: var(--hjm-space-md);
357
- border: var(--hjm-field-border-width) solid var(--hjm-color-border-control);
372
+ border: var(--hjm-field-resolved-border-width) solid var(--hjm-color-border-control);
358
373
  border-radius: var(--hjm-radius-md);
359
374
  background: var(--hjm-color-bg);
360
375
  }
@@ -366,7 +381,9 @@
366
381
  reads as hue only. The wider ring makes it a shape change like every other control.
367
382
  See issue #19. */
368
383
  .hjm-field[data-state="focused"] .hjm-field__control { border-color: var(--hjm-color-content-brand); box-shadow: 0 0 0 var(--hjm-field-focus-ring-width) var(--hjm-color-content-brand); }
369
- .hjm-field[data-state="invalid"] .hjm-field__control { border-color: var(--hjm-color-danger); }
384
+ /* Validation remains visible when availability is disabled; support text and aria-invalid keep their existing contracts. */
385
+ .hjm-field[data-state="invalid"] .hjm-field__control,
386
+ .hjm-field[data-invalid="true"] .hjm-field__control { border-color: var(--hjm-color-danger); --hjm-field-resolved-border-width: var(--hjm-field-invalid-border-width); }
370
387
  /* fieldRecipe.disabledScope (2026-10-06): disabled fades the label and the control, not
371
388
  the hint or the error, which explain why the field is locked or what to fix. Fading the
372
389
  whole frame (the rule before) took their contrast down with it. Every direct child except
@@ -374,10 +391,11 @@
374
391
  recipe value (Select, NumberField, OtpField, SearchField, PasswordField) arrives as an
375
392
  inline --hjm-field-disabled-opacity on the root. */
376
393
  .hjm-field[data-state="disabled"] > :not(.hjm-field__description):not(.hjm-field__error):not([data-hjm-field-error]) { opacity: var(--hjm-field-disabled-opacity); }
394
+ /* The editable minimum excludes both resolved borders, keeping the field footprint stable in invalid state. */
377
395
  .hjm-field__input {
378
396
  inline-size: 100%;
379
397
  min-inline-size: 0;
380
- min-block-size: calc(var(--hjm-control-field-height) - 2px);
398
+ min-block-size: calc(var(--hjm-control-field-height) - 2 * var(--hjm-field-resolved-border-width));
381
399
  padding-block: var(--hjm-space-xs);
382
400
  border: 0;
383
401
  outline: 0;
@@ -394,7 +412,7 @@
394
412
  .hjm-field__control--multiline { min-block-size: var(--hjm-field-multiline-min-height); align-items: stretch; }
395
413
  .hjm-field__control--multiline textarea {
396
414
  min-block-size: max(
397
- calc(var(--hjm-field-multiline-min-height) - 2px),
415
+ calc(var(--hjm-field-multiline-min-height) - 2 * var(--hjm-field-resolved-border-width)),
398
416
  calc(var(--hjm-field-min-visible-lines, 0) * var(--hjm-type-body-line-height) + var(--hjm-field-padding-block) * 2)
399
417
  );
400
418
  max-block-size: calc(
@@ -412,7 +430,7 @@
412
430
  so clearing has one localized name, onClear callback and focus-restoration path. */
413
431
  .hjm-search-field input[type="search"]::-webkit-search-cancel-button { -webkit-appearance: none; display: none; }
414
432
  .hjm-search-field:has(.hjm-field__input[data-size="large"]) .hjm-field__control { min-block-size: var(--hjm-control-button-large); padding-inline: var(--hjm-search-field-padding-large, var(--hjm-space-md)); gap: var(--hjm-search-field-gap-large, var(--hjm-space-sm)); }
415
- .hjm-search-field .hjm-field__input[data-size="large"] { min-block-size: calc(var(--hjm-control-button-large) - 2px); font-size: var(--hjm-type-body-large-size); line-height: var(--hjm-type-body-large-line-height); }
433
+ .hjm-search-field .hjm-field__input[data-size="large"] { min-block-size: calc(var(--hjm-control-button-large) - 2 * var(--hjm-field-resolved-border-width)); font-size: var(--hjm-type-body-large-size); line-height: var(--hjm-type-body-large-line-height); }
416
434
  /* The visible circle is the recipe diameter; ::after extends the hit area by clearHitSlop so the target stays 44. */
417
435
  .hjm-search-field__clear { --hjm-search-clear-slop: var(--hjm-search-field-clear-slop-medium, 4px); position: relative; flex: 0 0 auto; inline-size: var(--hjm-search-field-clear-medium, 36px); block-size: var(--hjm-search-field-clear-medium, 36px); display: inline-grid; place-items: center; border: 0; border-radius: 50%; color: inherit; background: transparent; font: inherit; cursor: pointer; }
418
436
  .hjm-search-field__clear::after { content: ""; position: absolute; inset: calc(-1 * var(--hjm-search-clear-slop)); border-radius: 50%; }
@@ -420,7 +438,7 @@
420
438
  .hjm-search-field__spinner { inline-size: 32px; block-size: 32px; display: inline-grid; place-items: center; color: var(--hjm-color-content-brand); }
421
439
  .hjm-search-field__spinner:empty::before { content: ""; inline-size: 1em; block-size: 1em; border: 2px solid currentColor; border-inline-end-color: transparent; border-radius: 50%; animation: hjm-spin 800ms linear infinite; }
422
440
  .hjm-password-field--large .hjm-field__control { min-block-size: var(--hjm-control-button-large); padding-inline: var(--hjm-space-lg); }
423
- .hjm-password-field--large .hjm-field__input { min-block-size: calc(var(--hjm-control-button-large) - 2px); font-size: var(--hjm-type-body-large-size); line-height: var(--hjm-type-body-large-line-height); }
441
+ .hjm-password-field--large .hjm-field__input { min-block-size: calc(var(--hjm-control-button-large) - 2 * var(--hjm-field-resolved-border-width)); font-size: var(--hjm-type-body-large-size); line-height: var(--hjm-type-body-large-line-height); }
424
442
  .hjm-password-field__toggle {
425
443
  position: relative;
426
444
  flex: 0 0 var(--hjm-control-min-touch-target);
@@ -644,7 +662,7 @@
644
662
  font-variant-numeric: tabular-nums;
645
663
  }
646
664
  .hjm-number-field[data-size="large"] .hjm-number-field__input {
647
- min-block-size: calc(var(--hjm-control-button-large) - 2px);
665
+ min-block-size: calc(var(--hjm-control-button-large) - 2 * var(--hjm-field-resolved-border-width));
648
666
  padding-inline: var(--hjm-space-xs);
649
667
  font-size: var(--hjm-type-body-large-size);
650
668
  line-height: var(--hjm-type-body-large-line-height);
@@ -815,16 +833,24 @@
815
833
  .hjm-choice__copy { display: grid; gap: var(--hjm-space-xxs); padding-block: 2px; }
816
834
  .hjm-choice[data-state="checked"] .hjm-choice__copy > :first-child,
817
835
  .hjm-choice[data-state="mixed"] .hjm-choice__copy > :first-child { font-weight: var(--hjm-font-weight-semibold); }
818
- .hjm-radio-group { min-inline-size: 0; padding: 0; border: 0; }
819
- .hjm-radio-group legend { margin-block-end: var(--hjm-space-xs); font-weight: var(--hjm-text-emphasis-medium); }
836
+ /* Native groups have no outer inset; remove the browser fieldset margin so sibling content shares one edge. */
837
+ .hjm-radio-group { margin: 0; min-inline-size: 0; padding: 0; border: 0; }
838
+ .hjm-radio-group legend { padding: 0; margin-block-end: var(--hjm-space-xs); font-weight: var(--hjm-text-emphasis-medium); }
820
839
  .hjm-radio-group__items { display: flex; flex-direction: column; gap: var(--hjm-space-xs); }
821
840
  .hjm-radio-group[data-presentation="plain"] .hjm-radio-group__items { gap: var(--hjm-space-xxs); }
822
841
  .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); }
823
842
  .hjm-radio-group[data-orientation="horizontal"] .hjm-radio-group__items { flex-direction: row; flex-wrap: wrap; gap: var(--hjm-space-md); }
824
843
  .hjm-radio-group[data-orientation="horizontal"][data-presentation="plain"] .hjm-radio-group__items { gap: var(--hjm-space-sm); }
825
844
  .hjm-radio-group[data-orientation="horizontal"][data-presentation="grouped"] .hjm-radio-group__items { gap: 0; }
845
+ /* Radio option actions are siblings of the label, never nested interactive controls. */
846
+ .hjm-choice.hjm-choice--with-action { padding: 0; gap: 0; }
847
+ .hjm-choice__target { display: flex; align-items: center; align-self: stretch; flex: 1; min-inline-size: 0; min-block-size: inherit; gap: var(--hjm-space-sm); padding: var(--hjm-space-sm) var(--hjm-space-md); cursor: inherit; }
848
+ .hjm-choice[data-size="small"] > .hjm-choice__target { gap: var(--hjm-space-xs); padding: var(--hjm-space-xs) var(--hjm-space-sm); }
849
+ .hjm-choice[data-presentation="plain"] > .hjm-choice__target { padding: 0; }
850
+ .hjm-choice__action { flex: 0 0 auto; padding-inline-end: var(--hjm-space-xs); }
851
+ .hjm-choice__target .hjm-choice__copy { min-inline-size: 0; overflow-wrap: anywhere; }
826
852
  .hjm-checkbox-group { min-inline-size: 0; margin: 0; padding: 0; border: 0; }
827
- .hjm-checkbox-group legend { margin-block-end: var(--hjm-space-xs); font-weight: var(--hjm-text-emphasis-medium); }
853
+ .hjm-checkbox-group legend { padding: 0; margin-block-end: var(--hjm-space-xs); font-weight: var(--hjm-text-emphasis-medium); }
828
854
  .hjm-checkbox-group__items { display: flex; flex-direction: column; gap: var(--hjm-space-xs); }
829
855
  .hjm-checkbox-group[data-presentation="plain"] .hjm-checkbox-group__items { gap: var(--hjm-space-xxs); }
830
856
  .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); }
@@ -846,6 +872,18 @@
846
872
  .hjm-switch__copy { display: flex; flex-direction: column; gap: var(--hjm-space-xxs); min-inline-size: 0; text-align: start; overflow-wrap: anywhere; }
847
873
  .hjm-switch__description { color: var(--hjm-color-text-muted); font-size: var(--hjm-type-caption-size); line-height: var(--hjm-type-caption-line-height); }
848
874
  .hjm-switch[data-presentation="row"] { display: flex; inline-size: 100%; justify-content: space-between; }
875
+ /* Chip collections retain their native radio/checkbox inputs, including nullable and multi-select values. */
876
+ :is(.hjm-radio-group, .hjm-checkbox-group)[data-presentation="chips"] > :is(.hjm-radio-group__items, .hjm-checkbox-group__items) { flex-direction: row; flex-wrap: wrap; gap: var(--hjm-space-xs); }
877
+ .hjm-choice[data-presentation="chips"] { position: relative; flex: 0 1 auto; min-block-size: var(--hjm-control-min-touch-target); padding: 0 var(--hjm-space-md); border-radius: var(--hjm-radius-full); color: var(--hjm-color-text-muted); font-weight: var(--hjm-text-emphasis-medium); }
878
+ .hjm-choice[data-presentation="chips"][data-size="small"] { min-block-size: 36px; padding-inline: var(--hjm-space-sm); }
879
+ .hjm-choice[data-presentation="chips"][data-size="small"]::after { content: ""; position: absolute; inset: -4px 0; }
880
+ .hjm-choice[data-presentation="chips"].hjm-choice--with-action { padding: 0; }
881
+ .hjm-choice[data-presentation="chips"] > .hjm-choice__target { padding-block: 0; }
882
+ .hjm-choice[data-presentation="chips"] .hjm-choice__indicator { display: none; }
883
+ .hjm-choice[data-presentation="chips"] .hjm-choice__leading { color: inherit; }
884
+ .hjm-choice[data-presentation="chips"] .hjm-choice__copy { min-inline-size: 0; overflow-wrap: anywhere; padding-block: 0; }
885
+ .hjm-choice[data-presentation="chips"][data-state="checked"], .hjm-choice[data-presentation="chips"][data-state="mixed"] { color: var(--hjm-color-content-brand); border-color: var(--hjm-color-content-brand); }
886
+ .hjm-choice[data-presentation="chips"]:has(.hjm-choice__input:focus-visible) { outline: var(--hjm-focus-width) solid var(--hjm-color-focus); outline-offset: var(--hjm-focus-offset); }
849
887
  /* A described switch: copy + switchRecipe.rowPaddingVertical 8 on both sides, min rowTwoLineMinHeight 56, same as Native.
850
888
  Stacked switch rows carry this spacing themselves; containers add no gap between them (2026-10-17). */
851
889
  .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); }
@@ -924,22 +962,28 @@
924
962
  .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; }
925
963
 
926
964
  .hjm-badge, .hjm-tag { display: inline-flex; align-items: center; gap: var(--hjm-space-xxs); max-inline-size: 100%; overflow-wrap: anywhere; }
927
- .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); }
928
- .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) */
929
- .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) */
930
- .hjm-badge[data-tone="brand"] { color: var(--hjm-color-content-brand); }
931
- .hjm-badge[data-tone="info"], .hjm-tag[data-tone="info"] { color: var(--hjm-accent-info); background: var(--hjm-color-bg); border-color: color-mix(in srgb, var(--hjm-accent-info) 30%, transparent); }
932
- .hjm-badge[data-tone="success"], .hjm-tag[data-tone="success"] { color: var(--hjm-accent-success); background: color-mix(in srgb, var(--hjm-accent-success) 14%, transparent); border-color: color-mix(in srgb, var(--hjm-accent-success) 30%, transparent); }
933
- .hjm-badge[data-tone="warning"] { color: var(--hjm-accent-warning); background: color-mix(in srgb, var(--hjm-accent-warning) 14%, transparent); border-color: color-mix(in srgb, var(--hjm-accent-warning) 30%, transparent); }
934
- .hjm-badge[data-tone="attention"], .hjm-tag[data-tone="attention"] { color: var(--hjm-accent-attention); background: color-mix(in srgb, var(--hjm-accent-attention) 14%, transparent); border-color: color-mix(in srgb, var(--hjm-accent-attention) 30%, transparent); }
935
- .hjm-badge[data-tone="danger"] { color: var(--hjm-color-danger); background: color-mix(in srgb, var(--hjm-color-danger) 14%, transparent); border-color: color-mix(in srgb, var(--hjm-color-danger) 30%, transparent); }
936
- .hjm-badge[data-variant="outline"] { background: transparent; border-color: var(--hjm-color-border); }
965
+ /* Solid status plates mirror badgeRecipe; Tag keeps its independent tint treatment. */
966
+ .hjm-badge { min-block-size: 24px; padding: 2px var(--hjm-space-xs); border: 0; border-radius: var(--hjm-radius-sm); color: var(--hjm-color-on-status-fill); background: var(--hjm-color-neutral-fill); font-size: var(--hjm-type-caption-size); line-height: var(--hjm-type-caption-line-height); font-weight: var(--hjm-font-weight-bold); }
967
+ .hjm-badge[data-size="small"] { min-block-size: 20px; }
968
+ .hjm-badge[data-tone="strong"] { background: var(--hjm-color-strong-fill); }
969
+ .hjm-badge[data-tone="brand"] { color: var(--hjm-color-on-primary); background: var(--hjm-color-primary); }
970
+ .hjm-badge[data-tone="danger"] { color: var(--hjm-color-on-danger); background: var(--hjm-color-danger-fill); }
971
+ .hjm-badge__icon { display: inline-flex; align-items: center; flex: 0 0 auto; }
972
+ .hjm-badge[data-variant="outline"] { background: transparent; border: 1px solid var(--hjm-color-border); color: var(--hjm-color-text-muted); }
937
973
  .hjm-badge[data-variant="outline"][data-tone="strong"] { color: var(--hjm-color-text); }
938
- .hjm-badge[data-variant="outline"][data-tone="info"] { border-color: color-mix(in srgb, var(--hjm-accent-info) 30%, transparent); }
939
- .hjm-badge[data-variant="outline"][data-tone="success"] { border-color: color-mix(in srgb, var(--hjm-accent-success) 30%, transparent); }
940
- .hjm-badge[data-variant="outline"][data-tone="warning"] { border-color: color-mix(in srgb, var(--hjm-accent-warning) 30%, transparent); }
941
- .hjm-badge[data-variant="outline"][data-tone="attention"] { border-color: color-mix(in srgb, var(--hjm-accent-attention) 30%, transparent); }
942
- .hjm-badge[data-variant="outline"][data-tone="danger"] { border-color: color-mix(in srgb, var(--hjm-color-danger) 30%, transparent); }
974
+ .hjm-badge[data-variant="outline"][data-tone="brand"] { color: var(--hjm-color-content-brand); }
975
+ .hjm-badge[data-variant="outline"][data-tone="danger"] { color: var(--hjm-color-danger); }
976
+ .hjm-badge[data-tone="info"] { background: var(--hjm-accent-fill-info); }
977
+ .hjm-badge[data-variant="outline"][data-tone="info"] { background: transparent; color: var(--hjm-accent-info); border-color: color-mix(in srgb, var(--hjm-accent-info) 30%, transparent); }
978
+ .hjm-badge[data-tone="success"] { background: var(--hjm-accent-fill-success); }
979
+ .hjm-badge[data-variant="outline"][data-tone="success"] { background: transparent; color: var(--hjm-accent-success); border-color: color-mix(in srgb, var(--hjm-accent-success) 30%, transparent); }
980
+ .hjm-badge[data-tone="warning"] { background: var(--hjm-accent-fill-warning); }
981
+ .hjm-badge[data-variant="outline"][data-tone="warning"] { background: transparent; color: var(--hjm-accent-warning); border-color: color-mix(in srgb, var(--hjm-accent-warning) 30%, transparent); }
982
+ .hjm-badge[data-tone="attention"] { background: var(--hjm-accent-fill-attention); }
983
+ .hjm-badge[data-variant="outline"][data-tone="attention"] { background: transparent; color: var(--hjm-accent-attention); border-color: color-mix(in srgb, var(--hjm-accent-attention) 30%, transparent); }
984
+ .hjm-tag[data-tone="info"] { color: var(--hjm-accent-info); background: color-mix(in srgb, var(--hjm-accent-info) 14%, transparent); border-color: color-mix(in srgb, var(--hjm-accent-info) 30%, transparent); }
985
+ .hjm-tag[data-tone="success"] { color: var(--hjm-accent-success); background: color-mix(in srgb, var(--hjm-accent-success) 14%, transparent); border-color: color-mix(in srgb, var(--hjm-accent-success) 30%, transparent); }
986
+ .hjm-tag[data-tone="attention"] { color: var(--hjm-accent-attention); background: color-mix(in srgb, var(--hjm-accent-attention) 14%, transparent); border-color: color-mix(in srgb, var(--hjm-accent-attention) 30%, transparent); }
943
987
  .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); }
944
988
  .hjm-tag[data-tone="brand"] { color: var(--hjm-color-content-brand); background: var(--hjm-color-bg); }
945
989
  .hjm-tag[data-tone="info"] { background: var(--hjm-color-bg); }
@@ -962,13 +1006,16 @@
962
1006
  .hjm-counter-badge[data-tone="danger"] { color: var(--hjm-color-on-danger); background: var(--hjm-color-danger-fill); }
963
1007
  .hjm-counter-badge[data-variant="floating"] { border: 2px solid var(--hjm-color-bg); }
964
1008
 
965
- .hjm-card { overflow: hidden; }
1009
+ .hjm-card { display: flex; flex-direction: column; overflow: hidden; }
966
1010
  .hjm-card__media > * { display: block; inline-size: 100%; }
967
- /* The implicit auto column grew to the min-content of slotted children (e.g. a SegmentedControl with max-content items),
968
- pushing content past the card padding at narrow widths (2026-10-17 STEA schedule card at 402). minmax(0, 1fr) keeps every
969
- slot inside the padded body so scroll/wrap rules of the child apply. */
970
- .hjm-card__body { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--hjm-space-xs); padding: var(--hjm-space-md); }
971
- .hjm-card__header { display: flex; align-items: flex-start; gap: var(--hjm-space-sm); min-inline-size: 0; }
1011
+ /* Zero inline minima preserve narrow-slot wrapping; body/content relay allocated height to slotted layouts
1012
+ without growing headers or footer commands (Diairy journey overview, 2026-10-20). */
1013
+ .hjm-card__body { display: flex; flex-direction: column; flex: 1; min-inline-size: 0; min-block-size: 0; gap: var(--hjm-space-xs); padding: var(--hjm-space-md); }
1014
+ .hjm-card__body > * { min-inline-size: 0; }
1015
+ .hjm-card__content { display: flex; flex-direction: column; flex: 1; min-block-size: 0; }
1016
+ .hjm-card__media, .hjm-card__actions { flex-shrink: 0; }
1017
+ .hjm-card__header { display: flex; align-items: center; gap: var(--hjm-space-sm); min-inline-size: 0; }
1018
+ .hjm-card__header-actions { position: relative; z-index: 1; display: flex; flex: 0 0 auto; align-items: center; gap: var(--hjm-space-xs); }
972
1019
  .hjm-card__leading { flex: 0 0 auto; display: inline-grid; place-items: center; line-height: 1; }
973
1020
  .hjm-card__copy { flex: 1 1 auto; min-inline-size: 0; display: grid; gap: var(--hjm-space-xs); }
974
1021
  /* cardRecipe.title.emphasis "strong": without a weight the h2–h6 element fell back to the UA bold (700). */
@@ -1066,13 +1113,15 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1066
1113
  .hjm-list { min-inline-size: 0; }
1067
1114
  .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); }
1068
1115
  .hjm-list__item { min-inline-size: 0; }
1116
+ .hjm-list-separator { border-block-start: 1px solid var(--hjm-color-border); flex-shrink: 0; pointer-events: none; }
1069
1117
  /* Indent only the divider: moving the row shifted every title after the first
1070
1118
  and narrowed its text column in the notification-settings composition. Insets are measured from the list content
1071
1119
  edge (where the row text sits) and come from listRecipe.separators: full spans the row surface; indented follows
1072
1120
  the text column of the row above (the separator belongs to that row, as Native draws it after the row) — 52 after a
1073
1121
  row with leading (ListRow root `data-leading`), 0 after one without, ending on the content edge (2026-10-17). */
1074
- .hjm-list:is([data-separator="full"], [data-separator="indented"]) > .hjm-list__item + .hjm-list__item { position: relative; }
1075
- .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; }
1122
+ .hjm-list:is([data-separator="full"], [data-separator="indented"], [data-separator="content"]) > .hjm-list__item + .hjm-list__item { position: relative; }
1123
+ .hjm-list:is([data-separator="full"], [data-separator="indented"], [data-separator="content"]) > .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; }
1124
+ .hjm-list[data-separator="content"] > .hjm-list__item + .hjm-list__item::before { inset-inline: var(--hjm-list-separator-content-start) var(--hjm-list-separator-content-end); }
1076
1125
  .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); }
1077
1126
  .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); }
1078
1127
  .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); }
@@ -1090,7 +1139,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1090
1139
  .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; }
1091
1140
  .hjm-statistic[data-density="compact"] .hjm-statistic__label { font-size: var(--hjm-type-caption-size); line-height: var(--hjm-type-caption-line-height); }
1092
1141
  .hjm-statistic__value-row { display: flex; align-items: baseline; flex-wrap: wrap; gap: var(--hjm-space-xxs); min-inline-size: 0; }
1093
- .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; }
1142
+ .hjm-statistic__value { color: var(--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; }
1094
1143
  .hjm-statistic[data-density="compact"] .hjm-statistic__value { font-size: var(--hjm-type-title-size); line-height: var(--hjm-type-title-line-height); }
1095
1144
  .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); }
1096
1145
  .hjm-statistic__hint { color: var(--hjm-color-text-muted); font-size: var(--hjm-type-caption-size); line-height: var(--hjm-type-caption-line-height); }
@@ -1103,7 +1152,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1103
1152
  .hjm-statistic-group { grid-template-columns: minmax(0, 1fr); }
1104
1153
  }
1105
1154
 
1106
- .hjm-notice { display: flex; flex-wrap: wrap; align-items: flex-start; gap: var(--hjm-space-sm); padding: var(--hjm-space-md); border: 1px solid; border-radius: var(--hjm-radius-md); color: var(--hjm-color-text-body); background: var(--hjm-color-bg); border-color: var(--hjm-color-border); }
1155
+ .hjm-notice { display: flex; flex-wrap: wrap; align-items: center; gap: var(--hjm-space-sm); padding: var(--hjm-space-md); border: 1px solid; border-radius: var(--hjm-radius-md); color: var(--hjm-color-text-body); background: var(--hjm-color-bg); border-color: var(--hjm-color-border); }
1107
1156
  .hjm-notice[data-tone="info"] { border-color: var(--hjm-accent-info); }
1108
1157
  .hjm-notice[data-tone="success"] { border-color: var(--hjm-accent-success); background: color-mix(in srgb, var(--hjm-accent-success) 10%, var(--hjm-color-bg)); }
1109
1158
  .hjm-notice[data-tone="warning"] { border-color: var(--hjm-accent-warning); background: color-mix(in srgb, var(--hjm-accent-warning) 10%, var(--hjm-color-bg)); }
@@ -1111,14 +1160,9 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1111
1160
  .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)); }
1112
1161
  /* Reserve readable copy; wrap the action instead of crushing its label. */
1113
1162
  .hjm-notice__content { flex: 1 1 60%; min-inline-size: 0; display: grid; gap: var(--hjm-space-xxs); }
1114
- /* First-line anchor (2026-10-17 measured audit): the inline action (contract: Button size="small") centered 8px
1115
- below the title's first line and the icon box had no rule at all. Icon, first line and action now share one
1116
- anchor — the line box (1lh) alone, or the small-button height when an action sits on the row. Extra lines
1117
- grow downward; Native keeps the action under the copy (docs/usage/components/notice.md). */
1118
- .hjm-notice { --hjm-notice-anchor: 1lh; }
1119
- .hjm-notice:has(> .hjm-notice__action) { --hjm-notice-anchor: var(--hjm-control-button-small); }
1120
- .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); }
1121
- .hjm-notice__content > :first-child { margin-block-start: calc((var(--hjm-notice-anchor) - 1lh) / 2); }
1163
+ /* Center the complete copy and action within the row; a first-line offset drifts
1164
+ when the copy wraps or the button's actual height differs from its token. */
1165
+ .hjm-notice__icon { flex: 0 0 auto; display: flex; align-items: center; justify-content: center; min-inline-size: 1.25rem; block-size: 1lh; }
1122
1166
  .hjm-notice__action { flex: 0 0 auto; max-inline-size: 100%; }
1123
1167
  .hjm-notice__title, .hjm-notice__description { overflow-wrap: anywhere; }
1124
1168
  /* noticeRecipe/emptyStateRecipe title weight; the <strong> otherwise draws the UA bold (700). */
@@ -1166,7 +1210,12 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1166
1210
  /* Copy row above the ring at the start edge, like the linear bar and Native (2026-10-06 follow-up). The ring used to sit
1167
1211
  beside the copy (grid auto 1fr), so the same Progress laid out differently per platform. */
1168
1212
  .hjm-progress[data-shape="circular"] { justify-items: start; }
1169
- .hjm-progress[data-shape="circular"] .hjm-progress__native { display: none; }
1213
+ /* Keep one semantic progress target even when decorative segments or the ring paint it. */
1214
+ .hjm-progress[data-shape="circular"] .hjm-progress__native,
1215
+ .hjm-progress[data-segmented] .hjm-progress__native { position: absolute; inline-size: 1px; block-size: 1px; clip-path: inset(50%); overflow: hidden; }
1216
+ .hjm-progress__segments { display: flex; inline-size: 100%; }
1217
+ .hjm-progress__segments > span { flex: 1; min-inline-size: 0; overflow: hidden; border-radius: var(--hjm-radius-full); background: var(--hjm-progress-track); }
1218
+ .hjm-progress__segments > span > i { display: block; block-size: 100%; background: var(--hjm-progress-fill); }
1170
1219
  .hjm-progress__ring {
1171
1220
  position: relative;
1172
1221
  display: grid;
@@ -2448,7 +2497,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2448
2497
  display: grid;
2449
2498
  place-items: center;
2450
2499
  min-inline-size: var(--hjm-control-min-touch-target);
2451
- min-block-size: var(--hjm-space-lg);
2500
+ min-block-size: var(--hjm-control-min-touch-target);
2452
2501
  padding: 0;
2453
2502
  border: 0;
2454
2503
  background: transparent;
@@ -2701,8 +2750,9 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2701
2750
 
2702
2751
  /* Advanced display ------------------------------------------------------- */
2703
2752
  /* timelineRecipe label/description are `body`; binding it here lets the rail and timestamp derive from the same line box. */
2704
- .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); }
2705
- .hjm-timeline__item { min-inline-size: 0; display: grid; grid-template-columns: 1rem minmax(0, 1fr); gap: var(--hjm-space-sm); }
2753
+ .hjm-timeline { display: grid; gap: var(--hjm-space-lg); margin: 0; padding: 0; list-style: none; font-size: var(--hjm-type-body-size); line-height: var(--hjm-type-body-line-height); }
2754
+ .hjm-timeline__item { padding: var(--hjm-space-sm); border-radius: var(--hjm-radius-md); min-inline-size: 0; display: grid; grid-template-columns: 1rem minmax(0, 1fr); gap: var(--hjm-space-sm); }
2755
+ .hjm-timeline__item[data-emphasized="true"] { background: color-mix(in srgb, var(--hjm-accent-info) 10%, transparent); }
2706
2756
  .hjm-timeline__rail { position: relative; display: flex; justify-content: center; }
2707
2757
  /* Dot, label first line and timestamp share the label's first line box (2026-10-17 measured audit: centers 396/397/398.5).
2708
2758
  The rail inherits the label's line height, so 1lh is that line box. */
@@ -2710,12 +2760,12 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2710
2760
  .hjm-timeline__item[data-tone="info"] .hjm-timeline__dot { border-color: var(--hjm-accent-info); background: var(--hjm-accent-info); }
2711
2761
  .hjm-timeline__item[data-tone="success"] .hjm-timeline__dot { border-color: var(--hjm-accent-success); background: var(--hjm-accent-success); }
2712
2762
  .hjm-timeline__item[data-tone="attention"] .hjm-timeline__dot { border-color: var(--hjm-accent-attention); background: var(--hjm-accent-attention); }
2713
- .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); }
2763
+ .hjm-timeline__connector { position: absolute; inset-block: calc((1lh + 0.625rem) / 2) calc(-1 * (var(--hjm-space-lg) + 2 * var(--hjm-space-sm)) - .5lh); inline-size: 1px; background: var(--hjm-color-border); }
2714
2764
  .hjm-timeline__content { min-inline-size: 0; display: grid; gap: var(--hjm-space-xxs); padding-block-end: var(--hjm-space-xxs); }
2715
- .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); }
2765
+ .hjm-timeline__heading { min-inline-size: 0; display: flex; flex-wrap: wrap; align-items: flex-start; gap: var(--hjm-space-xxs) var(--hjm-space-sm); }
2716
2766
  .hjm-timeline__label { color: var(--hjm-color-text); font-weight: var(--hjm-text-emphasis-medium); overflow-wrap: anywhere; }
2717
2767
  /* Baseline sharing put the smaller caption 1.5px under the label's center; center it on the label's first line instead. */
2718
- .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); }
2768
+ .hjm-timeline__timestamp { color: var(--hjm-color-text-muted); font-size: var(--hjm-type-caption-size); line-height: var(--hjm-type-caption-line-height); }
2719
2769
  .hjm-timeline__description { color: var(--hjm-color-text-body); white-space: pre-wrap; overflow-wrap: anywhere; }
2720
2770
  .hjm-accordion { border-block-start: 1px solid var(--hjm-color-border); }
2721
2771
  .hjm-accordion__item { border-block-end: 1px solid var(--hjm-color-border); }
@@ -2768,7 +2818,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2768
2818
  .hjm-description-list { display: grid; grid-template-columns: repeat(var(--hjm-description-columns), minmax(0, 1fr)); gap: var(--hjm-space-sm); margin: 0; }
2769
2819
  .hjm-description-list__item { min-inline-size: 0; display: grid; gap: var(--hjm-space-xxs); }
2770
2820
  .hjm-description-list__label { color: var(--hjm-color-text-muted); font-size: var(--hjm-type-label-size); font-weight: var(--hjm-text-emphasis-medium); }
2771
- .hjm-description-list__value { margin: 0; color: var(--hjm-color-text); overflow-wrap: anywhere; }
2821
+ .hjm-description-list__value { margin: 0; color: var(--hjm-color-text); white-space: pre-wrap; overflow-wrap: anywhere; }
2772
2822
  .hjm-table-scroll { max-inline-size: 100%; overflow: auto; outline-offset: 2px; }
2773
2823
  .hjm-table { inline-size: 100%; border-collapse: collapse; color: var(--hjm-color-text-body); }
2774
2824
  .hjm-table__caption { padding: var(--hjm-space-sm); color: var(--hjm-color-text); font-weight: var(--hjm-type-title-weight); text-align: start; }
@@ -2818,7 +2868,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2818
2868
  .hjm-load-more__spinner { 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; }
2819
2869
 
2820
2870
  /* Expansion renderers --------------------------------------------------- */
2821
- .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; }
2871
+ .hjm-steps { display: grid; grid-template-columns: repeat(var(--hjm-steps-connector-count), minmax(0, 1fr)) fit-content(calc(100% / var(--hjm-steps-count))); gap: 0; margin: 0; padding: 0; list-style: none; }
2822
2872
  .hjm-steps__step { min-inline-size: 0; display: grid; align-content: start; gap: var(--hjm-space-xs); }
2823
2873
  .hjm-steps__rail { display: flex; align-items: center; min-inline-size: 0; }
2824
2874
  .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); }
@@ -2826,11 +2876,16 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2826
2876
  .hjm-steps__step[data-status="current"] .hjm-steps__indicator { border: 2px solid var(--hjm-color-content-brand); color: var(--hjm-color-content-brand); }
2827
2877
  .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); }
2828
2878
  .hjm-steps__step[data-status="complete"] .hjm-steps__connector { background: var(--hjm-color-content-brand); }
2879
+ /* The terminal incoming segment continues the previous rail across its copy width. */
2880
+ .hjm-steps__connector[data-reached="true"] { background: var(--hjm-color-content-brand); }
2829
2881
  .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); }
2830
2882
  .hjm-steps__copy { min-inline-size: 0; display: grid; gap: var(--hjm-space-xxs); padding-inline-end: var(--hjm-space-sm); }
2831
2883
  .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; }
2832
2884
  .hjm-steps__step[data-status="pending"] .hjm-steps__label { color: var(--hjm-color-text-muted); }
2833
2885
  .hjm-steps__step[data-status="error"] .hjm-steps__label { color: var(--hjm-color-danger); }
2886
+ /* Keep the terminal marker at the inline edge instead of an empty trailing step cell. */
2887
+ .hjm-steps__step:last-child .hjm-steps__rail { justify-content: flex-end; }
2888
+ .hjm-steps__step:last-child .hjm-steps__copy { padding-inline-end: 0; text-align: end; }
2834
2889
  .hjm-steps__description { color: var(--hjm-color-text-muted); font-size: var(--hjm-type-caption-size); overflow-wrap: anywhere; }
2835
2890
  /* A step before the cursor is one button over marker and label (Steps onStepPress); the cell keeps its static layout. */
2836
2891
  .hjm-steps__press { display: grid; align-content: start; gap: var(--hjm-space-xs); min-inline-size: 0; min-block-size: var(--hjm-steps-press-target); margin: 0; padding: 0; border: 0; background: none; color: inherit; font: inherit; text-align: start; cursor: pointer; }
@@ -2986,6 +3041,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2986
3041
  /* Intrinsic action columns keep short labels readable at 320px; the title wraps
2987
3042
  in the remaining space instead of squeezing actions to equal-width tracks. */
2988
3043
  .hjm-top-bar { display: grid; grid-template-columns: minmax(var(--hjm-control-min-touch-target), auto) minmax(0, 1fr) minmax(var(--hjm-control-min-touch-target), auto); align-items: center; min-block-size: var(--hjm-top-bar-min-height); gap: var(--hjm-top-bar-gap); padding-inline: var(--hjm-top-bar-padding); padding-block-start: max(env(safe-area-inset-top, 0px), var(--hjm-top-bar-safe-area)); background: var(--hjm-color-bg); }
3044
+ .hjm-top-bar[data-surface="transparent"] { background: transparent; }
2989
3045
  .hjm-top-bar__leading, .hjm-top-bar__trailing { display: flex; flex-wrap: wrap; align-items: center; min-inline-size: 0; gap: var(--hjm-top-bar-gap); }
2990
3046
  .hjm-top-bar__trailing { justify-content: flex-end; }
2991
3047
  .hjm-top-bar__title { min-inline-size: 0; text-align: center; overflow-wrap: anywhere; }
@@ -2999,11 +3055,11 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2999
3055
  .hjm-top-bar[data-large-text="true"] .hjm-top-bar__trailing { grid-column: 2; grid-row: 1; }
3000
3056
  .hjm-bottom-cta { display: grid; gap: var(--hjm-bottom-cta-gap); min-block-size: var(--hjm-bottom-cta-min-height); padding: var(--hjm-bottom-cta-padding-top) var(--hjm-bottom-cta-padding-inline) max(var(--hjm-bottom-cta-padding-bottom), env(safe-area-inset-bottom, 0px), var(--hjm-bottom-cta-safe-area)); border-block-start: 1px solid var(--hjm-color-border); background: var(--hjm-color-bg); box-shadow: var(--hjm-bottom-cta-shadow, none); }
3001
3057
  .hjm-bottom-cta[data-position="sticky"] { position: sticky; inset-block-end: 0; z-index: var(--hjm-layer-sticky); }
3002
- /* Inside ScreenLayout's footer the footer owns border, padding, surface and safe area; BottomCTA keeps only its copy,
3058
+ /* Inside a padded ScreenLayout or Sheet footer the parent owns padding, surface and safe area; BottomCTA keeps only its copy,
3003
3059
  actions and an explicit safeAreaBottom (2026-10-17: the doubled bar inset the buttons twice). */
3004
- /* The screen footer already pads max(screen padding, env(safe-area-inset-bottom)); an explicit safeAreaBottom adds only
3060
+ /* Each footer passes its actual bottom padding (ScreenLayout max, Sheet additive); an explicit safeAreaBottom adds only
3005
3061
  the remainder so the gap is max(footer, inset), not their sum (2026-10-17 "버튼 아래 여백이 많아"). */
3006
- .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; }
3062
+ .hjm-bottom-cta[data-placement="screen-footer"] { position: static; box-sizing: border-box; inline-size: 100%; min-inline-size: 0; min-block-size: 0; padding: 0 0 max(0px, calc(var(--hjm-bottom-cta-safe-area) - var(--hjm-bottom-cta-parent-padding))); border: 0; background: none; box-shadow: none; }
3007
3063
  .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; }
3008
3064
  .hjm-bottom-cta__actions { display: flex; flex-wrap: wrap; gap: var(--hjm-bottom-cta-gap); }
3009
3065
  /* bottomCtaRecipe.contentMaxWidth: the surface spans the viewport, its copy and actions stop at the reading width. */
@@ -3070,7 +3126,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
3070
3126
 
3071
3127
  .hjm-anchor { min-inline-size: 0; }
3072
3128
  .hjm-anchor__list { display: flex; flex-direction: column; gap: var(--hjm-space-xxs); list-style: none; margin: 0; padding: 0; }
3073
- .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; }
3129
+ .hjm-anchor__link { display: flex; align-items: center; gap: var(--hjm-space-xs); min-block-size: var(--hjm-control-min-touch-target); min-inline-size: var(--hjm-control-min-touch-target); box-sizing: border-box; padding: var(--hjm-space-xs); border-inline-start: 2px solid transparent; color: var(--hjm-color-text-muted); text-decoration: none; overflow-wrap: anywhere; }
3074
3130
  .hjm-anchor__link:hover { text-decoration: underline; text-underline-offset: 0.18em; }
3075
3131
  .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); }
3076
3132
  .hjm-anchor__link:focus-visible { outline: 2px solid var(--hjm-color-focus); outline-offset: 2px; }
@@ -3093,6 +3149,12 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
3093
3149
  /* Disclosure, context menu, menubar --------------------------------------- */
3094
3150
  .hjm-collapsible { display: grid; gap: var(--hjm-collapsible-gap); min-inline-size: 0; }
3095
3151
  .hjm-collapsible__trigger { inline-size: 100%; min-block-size: var(--hjm-control-min-touch-target); display: flex; align-items: center; justify-content: space-between; gap: var(--hjm-space-sm); padding: var(--hjm-space-xs) 0; border: 0; background: transparent; color: var(--hjm-color-text-body); font: inherit; text-align: start; cursor: pointer; }
3152
+ .hjm-collapsible__header { display: flex; align-items: center; gap: var(--hjm-space-xs); min-block-size: var(--hjm-control-min-touch-target); min-inline-size: 0; }
3153
+ .hjm-collapsible__title { flex: 1; min-inline-size: 0; overflow-wrap: anywhere; }
3154
+ .hjm-collapsible__header[data-titled] > .hjm-collapsible__trigger { inline-size: auto; min-inline-size: var(--hjm-control-min-touch-target); flex: 0 0 auto; }
3155
+ .hjm-collapsible__pending { display: inline-flex; align-items: center; justify-content: center; min-inline-size: var(--hjm-control-min-touch-target); min-block-size: var(--hjm-control-min-touch-target); }
3156
+ .hjm-collapsible__header:not([data-titled]) > .hjm-collapsible__pending { flex: 1; }
3157
+ .hjm-collapsible__header[hidden] { display: none; }
3096
3158
  .hjm-collapsible__trigger:disabled { opacity: 0.5; cursor: not-allowed; }
3097
3159
  .hjm-collapsible__trigger:focus-visible { outline: 2px solid var(--hjm-color-focus); outline-offset: 2px; }
3098
3160
  /* The marker is decoration: aria-expanded carries the state, so it only needs
@@ -3319,6 +3381,8 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
3319
3381
  .hjm-message-composer { display: flex; flex-direction: column; gap: var(--hjm-message-composer-gap, var(--hjm-space-sm)); }
3320
3382
  .hjm-message-composer__row { display: flex; gap: var(--hjm-message-composer-gap, var(--hjm-space-sm)); align-items: flex-end; }
3321
3383
  .hjm-message-composer__row > .hjm-field { flex: 1; min-inline-size: 0; }
3384
+ /* 2026-10-20: numeric composer hints belong at the end; errors keep the field default. */
3385
+ .hjm-message-composer[data-description-align="end"] > .hjm-message-composer__reply-card > .hjm-message-composer__row > .hjm-field > .hjm-field__description { text-align: end; }
3322
3386
  .hjm-message-composer__row > .hjm-button { flex-shrink: 0; }
3323
3387
  /* 2026-10-16 timeline standard (measured KakaoTalk iOS chat room, chatMessageRecipe): filled borderless
3324
3388
  bubbles, one avatar/author/tip per run, time beside the run's last bubble. */
@@ -3388,7 +3452,7 @@ button.hjm-chat-message__media-item:focus-visible { outline: 2px solid var(--hjm
3388
3452
 
3389
3453
  .hjm-image-choice { display: flex; flex-direction: column; gap: var(--hjm-space-xs); }
3390
3454
  .hjm-image-choice__label { font-weight: var(--hjm-text-emphasis-medium); }
3391
- .hjm-image-choice__tiles { display: flex; flex-wrap: wrap; gap: var(--hjm-image-choice-gap); }
3455
+ .hjm-image-choice__tiles { display: grid; grid-template-columns: repeat(auto-fit, calc(var(--hjm-image-choice-size) + (var(--hjm-image-choice-ring) + var(--hjm-image-choice-offset)) * 2)); justify-content: space-between; gap: var(--hjm-image-choice-gap); }
3392
3456
  /* The button is a column (ring frame, optional item label) so the label shares the tap target; the ring is drawn on
3393
3457
  the inner frame (2026-10-18 showItemLabels). */
3394
3458
  .hjm-image-choice__tile { display: flex; flex-direction: column; gap: var(--hjm-image-choice-item-label-gap); inline-size: calc(var(--hjm-image-choice-size) + (var(--hjm-image-choice-ring) + var(--hjm-image-choice-offset)) * 2); padding: 0; border: 0; border-radius: calc(var(--hjm-image-choice-radius) + var(--hjm-image-choice-ring) + var(--hjm-image-choice-offset)); background: none; color: inherit; cursor: pointer; }
@@ -3406,7 +3470,7 @@ button.hjm-chat-message__media-item:focus-visible { outline: 2px solid var(--hjm
3406
3470
  .hjm-image-choice__row { position: absolute; inset-inline: 0; display: flex; gap: var(--hjm-image-choice-gap); }
3407
3471
  .hjm-image-choice__tile:focus-visible { outline: 2px solid var(--hjm-color-focus, currentColor); outline-offset: 2px; }
3408
3472
  .hjm-image-choice__tile:disabled { opacity: 0.5; cursor: default; }
3409
- .hjm-image-choice__image { display: block; inline-size: 100%; block-size: 100%; overflow: hidden; border-radius: var(--hjm-image-choice-radius); background: var(--hjm-color-surface); }
3473
+ .hjm-image-choice__image { display: flex; align-items: center; justify-content: center; inline-size: 100%; block-size: 100%; overflow: hidden; border-radius: var(--hjm-image-choice-radius); background: var(--hjm-color-surface); }
3410
3474
  .hjm-image-choice__image > img { inline-size: 100%; block-size: 100%; object-fit: cover; display: block; }
3411
3475
  .hjm-image-choice__check { position: absolute; inset-block-start: 0; inset-inline-end: 0; inline-size: var(--hjm-image-choice-check); block-size: var(--hjm-image-choice-check); border-radius: 50%; background: var(--hjm-color-content-brand); color: var(--hjm-color-on-primary); font-size: 12px; line-height: var(--hjm-image-choice-check); text-align: center; }
3412
3476
  .hjm-message-composer__leading { flex: 0 0 auto; align-self: center; display: inline-flex; }
@@ -3528,8 +3592,9 @@ button.hjm-chat-message__media-item:focus-visible { outline: 2px solid var(--hjm
3528
3592
  .hjm-segmented[data-presentation="pills"] { background:transparent; border:0; padding:0; }
3529
3593
  /* Keep the inset pill behind the whole line at large text (40px text / 28px fill was observed). Native already includes this inset as vertical padding. */
3530
3594
  .hjm-segmented[data-presentation="pills"] .hjm-segmented__items { flex-wrap:wrap; gap:var(--hjm-space-xs); overflow:visible; padding:0; border:0; border-radius:0; background:transparent; }
3531
- .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); }
3532
- .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); }
3595
+ .hjm-segmented[data-presentation="pills"] .hjm-segmented__item { padding-block:var(--hjm-space-xxs); position:relative; flex:0 1 auto; min-inline-size:0; min-block-size:max(var(--hjm-control-min-touch-target), calc(var(--hjm-segmented-height) + 2 * var(--hjm-space-xxs))); 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); }
3596
+ .hjm-segmented[data-presentation="pills"] .hjm-segmented__item::before { content:""; position:absolute; inset:var(--hjm-space-xxs) 0; border-radius:var(--hjm-radius-full); background:var(--hjm-color-surface-alt); }
3597
+ .hjm-segmented[data-presentation="pills"][data-size="small"] .hjm-segmented__item { padding-inline:var(--hjm-space-sm); }
3533
3598
  .hjm-segmented[data-presentation="pills"] .hjm-segmented__item > span { position:relative; overflow-wrap:anywhere; }
3534
3599
  .hjm-segmented[data-presentation="pills"] .hjm-segmented__item[data-state="checked"] { color:var(--hjm-color-bg); font-weight:var(--hjm-font-weight-semibold); }
3535
3600
  .hjm-segmented[data-presentation="pills"] .hjm-segmented__item[data-state="checked"]::before { background:var(--hjm-color-text-body); }
@@ -3603,4 +3668,120 @@ button.hjm-chat-message__media-item:focus-visible { outline: 2px solid var(--hjm
3603
3668
  .hjm-description-list[data-layout="inline"] .hjm-description-list__item { grid-template-columns: 24% minmax(0, 1fr); gap: var(--hjm-space-sm); padding-block: var(--hjm-space-sm); }
3604
3669
  .hjm-description-list[data-layout="inline"] .hjm-description-list__item + .hjm-description-list__item { border-block-start: 1px solid var(--hjm-color-border); }
3605
3670
 
3671
+ /* A cover action stays separate from creator/metadata/footer controls in a Card. */
3672
+ .hjm-card__media-action { display: block; position: relative; inline-size: 100%; padding: 0; border: 0; background: transparent; color: inherit; cursor: pointer; text-align: inherit; }
3673
+ .hjm-card__media-action:active { opacity: var(--hjm-card-pressed-opacity); }
3674
+ .hjm-card__media-action:focus-visible { outline: var(--hjm-focus-width) solid var(--hjm-color-primary); outline-offset: calc(-1 * var(--hjm-focus-width)); }
3675
+ .hjm-card__media-action:disabled { cursor: default; }
3676
+ .hjm-card__media-icon { position: absolute; display: flex; align-items: center; justify-content: center; border: 1px solid var(--hjm-color-border); border-radius: var(--hjm-radius-full); background: var(--hjm-color-bg); color: var(--hjm-color-text); pointer-events: none; }
3677
+
3678
+ /* Background artwork keeps Card anatomy and independent actions; it is never a second activation target. */
3679
+ .hjm-card[data-background-media="true"] { position: relative; display: flex; flex-direction: column; }
3680
+ .hjm-card__background { position: absolute; inset: 0; pointer-events: none; overflow: hidden; }
3681
+ .hjm-card__background > :first-child { width: 100%; height: 100%; }
3682
+ /* A product gesture host stays behind the common copy/actions; corner badges remain readable. */
3683
+ .hjm-card__background-interaction { position: absolute; inset: 0; }
3684
+ .hjm-card__background-interaction > :first-child { width: 100%; height: 100%; }
3685
+ .hjm-card__media-badges { position: absolute; inset-block-start: var(--hjm-space-sm); inset-inline-end: var(--hjm-space-sm); display: flex; flex-wrap: wrap; gap: var(--hjm-space-xs); z-index: 1; }
3686
+ .hjm-card__scrim { position: absolute; inset: 0; background: var(--hjm-card-background-scrim); }
3687
+ .hjm-card__badges { display: flex; flex-wrap: wrap; gap: var(--hjm-space-xs); }
3688
+ .hjm-card[data-background-media="true"] > .hjm-card__body { position: relative; flex: 0 1 auto; margin-block-start: auto; }
3689
+ .hjm-card[data-background-media="true"] > .hjm-card__actions { position: relative; }
3690
+ .hjm-card[data-background-media="true"] .hjm-card__title,
3691
+ .hjm-card[data-background-media="true"] .hjm-card__description { color: var(--hjm-card-background-foreground); }
3692
+
3693
+ @media (forced-colors: active) {
3694
+ .hjm-card__background { display: none; }
3695
+ .hjm-card[data-background-media="true"] :is(.hjm-card__title, .hjm-card__description) { color: CanvasText; }
3696
+ }
3697
+
3698
+ .hjm-statistic__leading { display: inline-flex; align-items: center; color: var(--hjm-statistic-value-color, var(--hjm-color-text)); }
3699
+ .hjm-statistic-group[data-arrangement="bar"] { grid-template-columns: repeat(var(--hjm-statistic-columns), minmax(0, 1fr)); gap: 0; }
3700
+ .hjm-statistic-group[data-arrangement="bar"] > * { min-inline-size: 0; padding-inline: var(--hjm-space-xs); }
3701
+ .hjm-statistic-group[data-arrangement="bar"] > * + * { border-inline-start: 1px solid var(--hjm-color-border); }
3702
+ .hjm-statistic[data-arrangement="bar"] { align-items: center; text-align: center; gap: var(--hjm-space-xxs); }
3703
+ .hjm-statistic[data-arrangement="bar"] .hjm-statistic__label { order: 1; }
3704
+ .hjm-statistic[data-arrangement="bar"] .hjm-statistic__value-row { justify-content: center; align-items: center; }
3705
+ .hjm-statistic[data-arrangement="bar"] :is(.hjm-statistic__trend, .hjm-statistic__hint) { order: 2; }
3706
+
3707
+ .hjm-quote-card__mark { display: inline-flex; align-items: center; color: var(--hjm-color-content-brand); font-size: var(--hjm-type-heading-size); line-height: var(--hjm-type-heading-line-height); }
3708
+ .hjm-quote-card__body { display: grid; gap: var(--hjm-space-xs); margin: 0; min-inline-size: 0; }
3709
+
3710
+ /* NotificationRow's optional command owns focus and feedback; its passive preview owns all geometry. */
3711
+ .hjm-notification-row-action { appearance: none; display: block; inline-size: 100%; border: 0; padding: 0; margin: 0; background: transparent; color: inherit; font: inherit; text-align: start; cursor: pointer; }
3712
+ .hjm-notification-row-action:disabled { opacity: var(--hjm-notification-disabled-opacity); cursor: not-allowed; }
3713
+ .hjm-notification-row-action:enabled:active { opacity: var(--hjm-notification-pressed-opacity); }
3714
+ .hjm-notification-row-action:focus-visible { outline: var(--hjm-focus-width) solid var(--hjm-color-focus); outline-offset: calc(-1 * var(--hjm-focus-width)); }
3715
+
3716
+ .hjm-search-screen--embedded { display: flex; flex-direction: column; flex: 1; min-block-size: 0; }
3717
+ .hjm-search-screen--embedded > .hjm-stack { flex: 1; min-block-size: 0; }
3718
+
3719
+ /* Independent shortcut/remove targets share a Chip-shaped surface; neither button contains the other. */
3720
+ .hjm-shortcut-rail { display: flex; overflow-x: auto; list-style: none; margin: 0; padding: 4px 0; min-inline-size: 0; }
3721
+ .hjm-shortcut-rail[data-empty] { padding: 0; }
3722
+ .hjm-shortcut-rail__item { position: relative; display: inline-flex; align-items: stretch; flex: 0 0 auto; color: var(--hjm-color-text-body); }
3723
+ .hjm-shortcut-rail__item::before { content: ""; pointer-events: none; position: absolute; inset: 4px 0; border: 1px solid var(--hjm-color-border); border-radius: 999px; background: var(--hjm-color-bg); }
3724
+ .hjm-shortcut-rail[data-size="medium"] .hjm-shortcut-rail__item::before { inset-block: 0; }
3725
+ .hjm-shortcut-rail__action, .hjm-shortcut-rail__remove { position: relative; display: inline-flex; align-items: center; justify-content: center; min-block-size: var(--hjm-control-min-touch-target); min-inline-size: var(--hjm-control-min-touch-target); background: transparent; color: inherit; font: inherit; font-weight: var(--hjm-text-emphasis-medium); border: 0; border-radius: 999px; cursor: pointer; }
3726
+ .hjm-shortcut-rail__action { gap: var(--hjm-space-xxs); padding-inline: var(--hjm-space-sm); white-space: nowrap; }
3727
+ .hjm-shortcut-rail[data-size="medium"] .hjm-shortcut-rail__action { gap: var(--hjm-space-xs); padding-inline: var(--hjm-space-md); }
3728
+ .hjm-shortcut-rail__remove { inline-size: var(--hjm-control-min-touch-target); padding: 0; }
3729
+ .hjm-shortcut-rail__remove > span { font-size: 14px; line-height: 1; }
3730
+ .hjm-shortcut-rail__item[data-disabled] { opacity: 0.5; }
3731
+ .hjm-shortcut-rail button:disabled { cursor: not-allowed; }
3732
+ .hjm-shortcut-rail button:active:not(:disabled) { opacity: 0.7; }
3733
+ .hjm-shortcut-rail:focus-visible, .hjm-shortcut-rail button:focus-visible { outline: var(--hjm-focus-width) solid var(--hjm-color-focus); outline-offset: var(--hjm-focus-offset); }
3734
+
3735
+ /* A filter rail scrolls independently of its trailing action (Spint spot adoption). */
3736
+ .hjm-segmented-rail { display:flex; align-items:center; gap:var(--hjm-space-xs); min-inline-size:0; }
3737
+ .hjm-segmented-rail > :last-child { flex-shrink:0; }
3738
+ .hjm-segmented[data-overflow="scroll"] .hjm-segmented__items { flex-direction:row; flex-wrap:nowrap; inline-size:max-content; min-inline-size:100%; }
3739
+ .hjm-segmented[data-overflow="scroll"] .hjm-segmented__item { flex-shrink:0; }
3740
+
3741
+ /* A destination card uses an anchor; disabled links omit href and share the card's disabled feedback. */
3742
+ .hjm-card__activator[aria-disabled="true"] { cursor:default; }
3743
+ .hjm-card[data-activation="overlay"]:has(> .hjm-card__activator[aria-disabled="true"]) > :is(.hjm-card__media,.hjm-card__body) { opacity:var(--hjm-card-disabled-opacity); }
3744
+
3745
+ .hjm-anchor__leading { display: inline-flex; flex: 0 0 auto; }
3746
+ .hjm-anchor__leading svg { inline-size: 100%; block-size: 100%; }
3747
+ .hjm-shortcut-rail[data-layout="wrap"] { flex-wrap: wrap; overflow-x: visible; }
3748
+ .hjm-shortcut-rail[data-layout="wrap"] .hjm-shortcut-rail__item { max-inline-size: 100%; min-inline-size: 0; }
3749
+ .hjm-shortcut-rail[data-layout="wrap"] .hjm-shortcut-rail__action { white-space: normal; overflow-wrap: anywhere; }
3750
+
3751
+ /* TimePicker: one two-column session; dimensions come from the shared recipe on its panel. */
3752
+ .hjm-time-picker { display: grid; gap: var(--hjm-space-xs); min-inline-size: 0; }
3753
+ .hjm-time-picker[data-disabled] { opacity: .5; }
3754
+ .hjm-time-picker__label { font-weight: 500; }
3755
+ .hjm-time-picker__trigger { display:flex; align-items:center; gap:var(--hjm-space-xs); inline-size:100%; min-block-size:44px; padding:var(--hjm-space-sm); border:1px solid var(--hjm-color-border-control); border-radius:var(--hjm-radius-md); background:var(--hjm-color-bg); color:var(--hjm-color-text); font:inherit; font-variant-numeric:tabular-nums; cursor:pointer; }
3756
+ .hjm-time-picker__trigger[aria-invalid=true] { border-color:var(--hjm-color-danger); }
3757
+ .hjm-time-picker__trigger:disabled { cursor:default; }
3758
+ .hjm-time-picker__panel { display:grid; gap:var(--hjm-space-md); inline-size:100%; min-inline-size:0; }
3759
+ .hjm-time-picker__panel > .hjm-button { inline-size:100%; }
3760
+ .hjm-time-picker__readout { text-align:center; font-size:var(--hjm-time-summary); line-height:var(--hjm-time-summary-line-height); font-weight:500; font-variant-numeric:tabular-nums; direction:ltr; }
3761
+ .hjm-time-picker__readout span { color:var(--hjm-color-text-muted); padding-inline:var(--hjm-space-xs); }
3762
+ .hjm-time-picker__columns { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:var(--hjm-space-sm); }
3763
+ .hjm-time-picker__caption { text-align:center; color:var(--hjm-color-text-muted); margin-block-end:var(--hjm-space-xs); }
3764
+ .hjm-time-picker__list { position:relative; block-size:var(--hjm-time-height); overflow-y:auto; overscroll-behavior:contain; scrollbar-width:thin; }
3765
+ .hjm-time-picker__list button { display:block; inline-size:100%; min-block-size:var(--hjm-time-row); border:0; border-radius:var(--hjm-radius-md); background:transparent; color:var(--hjm-color-text); font:inherit; font-variant-numeric:tabular-nums; cursor:pointer; }
3766
+ .hjm-time-picker__list button[aria-selected=true] { background:var(--hjm-color-surface-accent); color:var(--hjm-color-content-brand); font-weight:500; }
3767
+ .hjm-time-picker__list button:disabled { opacity:.4; cursor:default; }
3768
+ .hjm-time-picker__list button:focus-visible,.hjm-time-picker__trigger:focus-visible { outline:2px solid var(--hjm-color-content-brand); outline-offset:-2px; }
3769
+ .hjm-time-picker__description { color:var(--hjm-color-text-muted); }
3770
+ .hjm-time-picker__error { color:var(--hjm-color-danger); }
3771
+
3772
+ /* IconTile's own target keeps the full artwork width; Button's face padding would squeeze narrow grid cells. */
3773
+ .hjm-icon-tile-action { display: block; box-sizing: border-box; width: 100%; margin: 0; padding: 0; border: 0; border-radius: var(--hjm-radius-md); background: transparent; color: inherit; font: inherit; cursor: pointer; }
3774
+ .hjm-icon-tile-action:focus-visible { outline: 2px solid var(--hjm-color-primary); outline-offset: 2px; }
3775
+ .hjm-icon-tile-action:active:not(:disabled) { opacity: var(--hjm-icon-tile-pressed-opacity); }
3776
+ .hjm-icon-tile-action:disabled { opacity: var(--hjm-icon-tile-disabled-opacity); cursor: default; }
3777
+
3778
+ /* Position-only pager indicators have no small interactive targets; adjacent pager controls own navigation. */
3779
+ .hjm-page-indicator__marker, .hjm-page-indicator__marker > span { display: block; inline-size: var(--hjm-space-xs); block-size: var(--hjm-space-xs); border-radius: var(--hjm-radius-full); }
3780
+ .hjm-page-indicator__marker > span { background: var(--hjm-color-text-weak); }
3781
+ .hjm-page-indicator__marker[data-current="true"] > span { background: var(--hjm-color-content-brand); }
3782
+
3783
+ /* Commands remain independent of the passive record and rail. */
3784
+ .hjm-timeline__item:has(> .hjm-timeline__actions) { grid-template-columns: 1rem minmax(0, 1fr) auto; }
3785
+ .hjm-timeline__actions { align-self: center; display: flex; align-items: center; gap: var(--hjm-space-xs); }
3786
+
3606
3787
  }