@hjmds/react 1.1.1 → 1.2.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 (199) hide show
  1. package/dist/actions.d.ts.map +1 -1
  2. package/dist/actions.js +12 -6
  3. package/dist/actions.js.map +1 -1
  4. package/dist/advanced-display.d.ts +21 -0
  5. package/dist/advanced-display.d.ts.map +1 -1
  6. package/dist/advanced-display.js +11 -0
  7. package/dist/advanced-display.js.map +1 -1
  8. package/dist/advanced-navigation.d.ts +2 -23
  9. package/dist/advanced-navigation.d.ts.map +1 -1
  10. package/dist/advanced-navigation.js +3 -24
  11. package/dist/advanced-navigation.js.map +1 -1
  12. package/dist/agreement.d.ts +20 -0
  13. package/dist/agreement.d.ts.map +1 -0
  14. package/dist/agreement.js +29 -0
  15. package/dist/agreement.js.map +1 -0
  16. package/dist/anchor.d.ts +24 -0
  17. package/dist/anchor.d.ts.map +1 -0
  18. package/dist/anchor.js +110 -0
  19. package/dist/anchor.js.map +1 -0
  20. package/dist/asset.d.ts +40 -0
  21. package/dist/asset.d.ts.map +1 -0
  22. package/dist/asset.js +26 -0
  23. package/dist/asset.js.map +1 -0
  24. package/dist/bottom-cta.d.ts +32 -0
  25. package/dist/bottom-cta.d.ts.map +1 -0
  26. package/dist/bottom-cta.js +30 -0
  27. package/dist/bottom-cta.js.map +1 -0
  28. package/dist/bottom-info.d.ts +16 -0
  29. package/dist/bottom-info.d.ts.map +1 -0
  30. package/dist/bottom-info.js +12 -0
  31. package/dist/bottom-info.js.map +1 -0
  32. package/dist/breadcrumb.d.ts +9 -0
  33. package/dist/breadcrumb.d.ts.map +1 -0
  34. package/dist/breadcrumb.js +12 -0
  35. package/dist/breadcrumb.js.map +1 -0
  36. package/dist/calendar.d.ts +30 -0
  37. package/dist/calendar.d.ts.map +1 -0
  38. package/dist/calendar.js +69 -0
  39. package/dist/calendar.js.map +1 -0
  40. package/dist/carousel.d.ts +20 -0
  41. package/dist/carousel.d.ts.map +1 -0
  42. package/dist/carousel.js +70 -0
  43. package/dist/carousel.js.map +1 -0
  44. package/dist/clipboard.d.ts +33 -0
  45. package/dist/clipboard.d.ts.map +1 -0
  46. package/dist/clipboard.js +40 -0
  47. package/dist/clipboard.js.map +1 -0
  48. package/dist/collapsible.d.ts +11 -0
  49. package/dist/collapsible.d.ts.map +1 -0
  50. package/dist/collapsible.js +18 -0
  51. package/dist/collapsible.js.map +1 -0
  52. package/dist/command-palette.d.ts +25 -0
  53. package/dist/command-palette.d.ts.map +1 -0
  54. package/dist/command-palette.js +82 -0
  55. package/dist/command-palette.js.map +1 -0
  56. package/dist/context-menu.d.ts +12 -0
  57. package/dist/context-menu.d.ts.map +1 -0
  58. package/dist/context-menu.js +111 -0
  59. package/dist/context-menu.js.map +1 -0
  60. package/dist/data-table.d.ts +30 -0
  61. package/dist/data-table.d.ts.map +1 -0
  62. package/dist/data-table.js +57 -0
  63. package/dist/data-table.js.map +1 -0
  64. package/dist/date-picker.d.ts +3 -1
  65. package/dist/date-picker.d.ts.map +1 -1
  66. package/dist/date-picker.js +16 -31
  67. package/dist/date-picker.js.map +1 -1
  68. package/dist/date-range.d.ts +24 -0
  69. package/dist/date-range.d.ts.map +1 -0
  70. package/dist/date-range.js +29 -0
  71. package/dist/date-range.js.map +1 -0
  72. package/dist/display.d.ts +16 -0
  73. package/dist/display.d.ts.map +1 -1
  74. package/dist/display.js +13 -1
  75. package/dist/display.js.map +1 -1
  76. package/dist/evidence.d.ts +481 -1
  77. package/dist/evidence.d.ts.map +1 -1
  78. package/dist/evidence.js +47 -2
  79. package/dist/evidence.js.map +1 -1
  80. package/dist/feedback.d.ts +18 -2
  81. package/dist/feedback.d.ts.map +1 -1
  82. package/dist/feedback.js +10 -2
  83. package/dist/feedback.js.map +1 -1
  84. package/dist/floating-action-button.d.ts +32 -0
  85. package/dist/floating-action-button.d.ts.map +1 -0
  86. package/dist/floating-action-button.js +58 -0
  87. package/dist/floating-action-button.js.map +1 -0
  88. package/dist/forms.d.ts +3 -3
  89. package/dist/forms.d.ts.map +1 -1
  90. package/dist/forms.js +18 -7
  91. package/dist/forms.js.map +1 -1
  92. package/dist/heading.d.ts +12 -0
  93. package/dist/heading.d.ts.map +1 -0
  94. package/dist/heading.js +25 -0
  95. package/dist/heading.js.map +1 -0
  96. package/dist/index.d.ts +35 -2
  97. package/dist/index.d.ts.map +1 -1
  98. package/dist/index.js +35 -2
  99. package/dist/index.js.map +1 -1
  100. package/dist/layout.d.ts +1 -1
  101. package/dist/mentions.d.ts +28 -0
  102. package/dist/mentions.d.ts.map +1 -0
  103. package/dist/mentions.js +84 -0
  104. package/dist/mentions.js.map +1 -0
  105. package/dist/menubar.d.ts +11 -0
  106. package/dist/menubar.d.ts.map +1 -0
  107. package/dist/menubar.js +137 -0
  108. package/dist/menubar.js.map +1 -0
  109. package/dist/modal.d.ts +67 -0
  110. package/dist/modal.d.ts.map +1 -0
  111. package/dist/modal.js +307 -0
  112. package/dist/modal.js.map +1 -0
  113. package/dist/overlay-stack.d.ts +28 -0
  114. package/dist/overlay-stack.d.ts.map +1 -0
  115. package/dist/overlay-stack.js +47 -0
  116. package/dist/overlay-stack.js.map +1 -0
  117. package/dist/overlays.d.ts +26 -43
  118. package/dist/overlays.d.ts.map +1 -1
  119. package/dist/overlays.js +62 -302
  120. package/dist/overlays.js.map +1 -1
  121. package/dist/pagination.d.ts +17 -0
  122. package/dist/pagination.d.ts.map +1 -0
  123. package/dist/pagination.js +21 -0
  124. package/dist/pagination.js.map +1 -0
  125. package/dist/popover.d.ts +25 -0
  126. package/dist/popover.d.ts.map +1 -0
  127. package/dist/popover.js +226 -0
  128. package/dist/popover.js.map +1 -0
  129. package/dist/portal.d.ts +5 -1
  130. package/dist/portal.d.ts.map +1 -1
  131. package/dist/portal.js +24 -1
  132. package/dist/portal.js.map +1 -1
  133. package/dist/provider-button.d.ts +21 -0
  134. package/dist/provider-button.d.ts.map +1 -0
  135. package/dist/provider-button.js +26 -0
  136. package/dist/provider-button.js.map +1 -0
  137. package/dist/provider.d.ts +13 -1
  138. package/dist/provider.d.ts.map +1 -1
  139. package/dist/provider.js +12 -2
  140. package/dist/provider.js.map +1 -1
  141. package/dist/selection.d.ts +5 -1
  142. package/dist/selection.d.ts.map +1 -1
  143. package/dist/selection.js +2 -2
  144. package/dist/selection.js.map +1 -1
  145. package/dist/side-panel.d.ts +34 -0
  146. package/dist/side-panel.d.ts.map +1 -0
  147. package/dist/side-panel.js +95 -0
  148. package/dist/side-panel.js.map +1 -0
  149. package/dist/sidebar.d.ts +22 -0
  150. package/dist/sidebar.d.ts.map +1 -0
  151. package/dist/sidebar.js +29 -0
  152. package/dist/sidebar.js.map +1 -0
  153. package/dist/skip-nav.d.ts +12 -0
  154. package/dist/skip-nav.d.ts.map +1 -0
  155. package/dist/skip-nav.js +29 -0
  156. package/dist/skip-nav.js.map +1 -0
  157. package/dist/splitter.d.ts +45 -0
  158. package/dist/splitter.d.ts.map +1 -0
  159. package/dist/splitter.js +116 -0
  160. package/dist/splitter.js.map +1 -0
  161. package/dist/styles.css +1063 -26
  162. package/dist/supplemental-display.d.ts +12 -0
  163. package/dist/supplemental-display.d.ts.map +1 -1
  164. package/dist/supplemental-display.js +6 -2
  165. package/dist/supplemental-display.js.map +1 -1
  166. package/dist/tags-input.d.ts +60 -0
  167. package/dist/tags-input.d.ts.map +1 -0
  168. package/dist/tags-input.js +90 -0
  169. package/dist/tags-input.js.map +1 -0
  170. package/dist/text-formats.d.ts +16 -0
  171. package/dist/text-formats.d.ts.map +1 -0
  172. package/dist/text-formats.js +24 -0
  173. package/dist/text-formats.js.map +1 -0
  174. package/dist/toast.d.ts +1 -1
  175. package/dist/toggle-group.d.ts +13 -0
  176. package/dist/toggle-group.d.ts.map +1 -0
  177. package/dist/toggle-group.js +21 -0
  178. package/dist/toggle-group.js.map +1 -0
  179. package/dist/top-bar.d.ts +27 -0
  180. package/dist/top-bar.d.ts.map +1 -0
  181. package/dist/top-bar.js +30 -0
  182. package/dist/top-bar.js.map +1 -0
  183. package/dist/top.d.ts +15 -0
  184. package/dist/top.d.ts.map +1 -0
  185. package/dist/top.js +18 -0
  186. package/dist/top.js.map +1 -0
  187. package/dist/tour.d.ts +21 -0
  188. package/dist/tour.d.ts.map +1 -0
  189. package/dist/tour.js +122 -0
  190. package/dist/tour.js.map +1 -0
  191. package/dist/transfer-list.d.ts +24 -0
  192. package/dist/transfer-list.d.ts.map +1 -0
  193. package/dist/transfer-list.js +109 -0
  194. package/dist/transfer-list.js.map +1 -0
  195. package/dist/tree.d.ts +29 -0
  196. package/dist/tree.d.ts.map +1 -0
  197. package/dist/tree.js +120 -0
  198. package/dist/tree.js.map +1 -0
  199. package/package.json +173 -3
package/dist/styles.css CHANGED
@@ -237,7 +237,11 @@
237
237
  .hjm-button[data-selected="true"], .hjm-icon-button[data-selected="true"] { color: var(--hjm-color-content-brand); background: var(--hjm-color-surface-accent); border-color: var(--hjm-color-content-brand); }
238
238
  .hjm-button:active:not(:disabled):not([aria-disabled="true"]), .hjm-icon-button:active:not(:disabled):not([aria-disabled="true"]) { transform: scale(0.98); }
239
239
  .hjm-button:disabled, .hjm-icon-button:disabled { cursor: not-allowed; opacity: 0.5; }
240
- .hjm-button__label { min-inline-size: 0; overflow-wrap: anywhere; }
240
+ /* 라벨은 자르지 않고 두 줄까지 접는다(buttonRecipe.label). 잘린 행동 라벨은 무엇을 하는
241
+ 버튼인지 잃고, 무제한 줄바꿈은 하단 CTA 행 같은 남의 레이아웃을 밀어낸다. */
242
+ .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; }
243
+ /* 큰 글자 설정에서는 상한을 푼다 — 사용자가 키운 글자를 잘라 내용을 숨기면 WCAG 1.4.4다. */
244
+ [data-large-text="true"] .hjm-button__label { display: block; overflow: visible; }
241
245
  .hjm-button__spinner,
242
246
  .hjm-spinner__glyph {
243
247
  display: inline-block;
@@ -864,6 +868,11 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
864
868
  .hjm-list-row[data-lines="two"] { min-block-size: var(--hjm-list-row-comfortable-two-line); }
865
869
  .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); }
866
870
  .hjm-list-row[data-density="compact"][data-lines="two"] { min-block-size: var(--hjm-list-row-compact-two-line); }
871
+ /* The two wider steps read the same generated variables; no numbers here. */
872
+ .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); }
873
+ .hjm-list-row[data-density="relaxed"][data-lines="two"] { min-block-size: var(--hjm-list-row-relaxed-two-line); }
874
+ .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); }
875
+ .hjm-list-row[data-density="spacious"][data-lines="two"] { min-block-size: var(--hjm-list-row-spacious-two-line); }
867
876
  .hjm-list-row[data-state="selected"] { background: var(--hjm-color-surface-accent); }
868
877
  .hjm-list-row[data-state="disabled"] { opacity: 0.5; cursor: not-allowed; }
869
878
  .hjm-list-row__leading, .hjm-list-row__trailing { flex: 0 0 auto; }
@@ -898,7 +907,10 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
898
907
  .hjm-list[data-appearance="grouped"] { border-radius: var(--hjm-radius-lg); background: var(--hjm-color-surface); }
899
908
  .hjm-list__item { min-inline-size: 0; }
900
909
  .hjm-list[data-separator="full"] > .hjm-list__item + .hjm-list__item { border-block-start: 1px solid var(--hjm-color-border); }
901
- .hjm-list[data-separator="indented"] > .hjm-list__item + .hjm-list__item { border-block-start: 1px solid var(--hjm-color-border); margin-inline-start: var(--hjm-space-xl); }
910
+ /* Indent only the divider: moving the row shifted every title after the first
911
+ and narrowed its text column in the notification-settings composition. */
912
+ .hjm-list[data-separator="indented"] > .hjm-list__item + .hjm-list__item { position: relative; }
913
+ .hjm-list[data-separator="indented"] > .hjm-list__item + .hjm-list__item::before { content: ""; position: absolute; inset-block-start: 0; inset-inline: var(--hjm-space-xl) 0; border-block-start: 1px solid var(--hjm-color-border); pointer-events: none; }
902
914
 
903
915
  .hjm-statistic { display: grid; gap: var(--hjm-space-xxs); min-inline-size: 0; color: var(--hjm-color-text-body); }
904
916
  .hjm-statistic[data-presentation="surface"] { padding: var(--hjm-space-md); border: 1px solid var(--hjm-color-border); border-radius: var(--hjm-radius-md); background: var(--hjm-color-surface); }
@@ -916,13 +928,15 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
916
928
  .hjm-statistic-group { grid-template-columns: minmax(0, 1fr); }
917
929
  }
918
930
 
919
- .hjm-notice { display: flex; align-items: flex-start; gap: var(--hjm-space-sm); padding: var(--hjm-space-md); border: 1px solid; border-radius: var(--hjm-radius-md); color: var(--hjm-color-text-body); background: var(--hjm-color-surface); border-color: var(--hjm-color-border); }
931
+ .hjm-notice { display: flex; flex-wrap: wrap; align-items: flex-start; gap: var(--hjm-space-sm); padding: var(--hjm-space-md); border: 1px solid; border-radius: var(--hjm-radius-md); color: var(--hjm-color-text-body); background: var(--hjm-color-surface); border-color: var(--hjm-color-border); }
920
932
  .hjm-notice[data-tone="info"] { border-color: var(--hjm-accent-info); }
921
933
  .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)); }
922
934
  .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)); }
923
935
  .hjm-notice[data-tone="attention"] { border-color: var(--hjm-accent-attention); background: color-mix(in srgb, var(--hjm-accent-attention) 10%, var(--hjm-color-bg)); }
924
936
  .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)); }
925
- .hjm-notice__content { flex: 1 1 auto; min-inline-size: 0; display: grid; gap: var(--hjm-space-xxs); }
937
+ /* Reserve readable copy; wrap the action instead of crushing its label. */
938
+ .hjm-notice__content { flex: 1 1 60%; min-inline-size: 0; display: grid; gap: var(--hjm-space-xxs); }
939
+ .hjm-notice__action { flex: 0 0 auto; max-inline-size: 100%; }
926
940
  .hjm-notice__title, .hjm-notice__description { overflow-wrap: anywhere; }
927
941
 
928
942
  .hjm-empty-state { display: grid; justify-items: center; gap: var(--hjm-space-xs); padding: var(--hjm-space-xxl) var(--hjm-space-xl); color: var(--hjm-color-text-muted); text-align: center; }
@@ -947,6 +961,62 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
947
961
  .hjm-progress[data-tone="success"] .hjm-progress__native { accent-color: var(--hjm-accent-success); }
948
962
  .hjm-progress[data-tone="warning"] .hjm-progress__native { accent-color: var(--hjm-accent-warning); }
949
963
  .hjm-progress[data-tone="danger"] .hjm-progress__native { accent-color: var(--hjm-color-danger); }
964
+ /*
965
+ The circular shape hides the native bar and draws the same value as a conic
966
+ sweep. The element stays a <progress>, so the value, the indeterminate case
967
+ and the announcement are unchanged — only the paint differs.
968
+ */
969
+ .hjm-progress[data-shape="circular"] { grid-template-columns: auto 1fr; align-items: center; }
970
+ .hjm-progress[data-shape="circular"] .hjm-progress__native { display: none; }
971
+ .hjm-progress__ring {
972
+ position: relative;
973
+ display: grid;
974
+ place-items: center;
975
+ inline-size: var(--hjm-progress-diameter);
976
+ block-size: var(--hjm-progress-diameter);
977
+ border-radius: var(--hjm-radius-full);
978
+ background: conic-gradient(var(--hjm-progress-ring-color, var(--hjm-color-content-brand)) var(--hjm-progress-sweep), var(--hjm-color-surface-alt) 0);
979
+ -webkit-mask: radial-gradient(farthest-side, transparent calc(100% - var(--hjm-progress-stroke)), #000 calc(100% - var(--hjm-progress-stroke)));
980
+ mask: radial-gradient(farthest-side, transparent calc(100% - var(--hjm-progress-stroke)), #000 calc(100% - var(--hjm-progress-stroke)));
981
+ }
982
+ .hjm-progress[data-tone="success"] .hjm-progress__ring { --hjm-progress-ring-color: var(--hjm-accent-success); }
983
+ .hjm-progress[data-tone="warning"] .hjm-progress__ring { --hjm-progress-ring-color: var(--hjm-accent-warning); }
984
+ .hjm-progress[data-tone="danger"] .hjm-progress__ring { --hjm-progress-ring-color: var(--hjm-color-danger); }
985
+ .hjm-progress[data-state="indeterminate"][data-shape="circular"] .hjm-progress__ring { animation: hjm-provider-spin 1200ms linear infinite; }
986
+ @media (prefers-reduced-motion: reduce) {
987
+ .hjm-progress[data-state="indeterminate"][data-shape="circular"] .hjm-progress__ring { animation: none; }
988
+ }
989
+ .hjm-progress__ring-content {
990
+ position: absolute;
991
+ inset: 0;
992
+ display: grid;
993
+ place-items: center;
994
+ /* The mask hides the ring's own paint region; content must escape it. */
995
+ -webkit-mask: none;
996
+ mask: none;
997
+ color: var(--hjm-color-text);
998
+ font-size: var(--hjm-type-label-size);
999
+ }
1000
+ /*
1001
+ Placeholders reserve the *line boxes* the real copy will occupy, not an
1002
+ arbitrary bar height — otherwise the row grows when the content arrives and
1003
+ the list jumps, which is the whole problem this variant exists to remove.
1004
+ */
1005
+ .hjm-list-row--loading [data-placeholder] {
1006
+ display: block;
1007
+ border-radius: var(--hjm-radius-sm);
1008
+ background: var(--hjm-color-surface-alt);
1009
+ }
1010
+ .hjm-list-row--loading .hjm-list-row__title[data-placeholder] {
1011
+ inline-size: 60%;
1012
+ block-size: var(--hjm-type-body-large-line-height);
1013
+ }
1014
+ .hjm-list-row--loading .hjm-list-row__description[data-placeholder] {
1015
+ inline-size: 40%;
1016
+ block-size: var(--hjm-type-body-line-height);
1017
+ }
1018
+ .hjm-list-row--loading .hjm-list-row__leading[data-placeholder] { background: var(--hjm-color-surface-alt); }
1019
+ .hjm-list-row--loading .hjm-list-row__trailing[data-placeholder] { inline-size: var(--hjm-space-xxl); }
950
1020
  .hjm-spinner { display: inline-flex; align-items: center; justify-content: center; color: var(--hjm-color-content-brand); }
951
1021
  .hjm-spinner[data-tone="neutral"] { color: var(--hjm-color-text-muted); }
952
1022
  .hjm-spinner[data-tone="inverse"] { color: var(--hjm-color-on-primary); }
@@ -958,6 +1028,721 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
958
1028
  .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); }
959
1029
  .hjm-skeleton[data-animated="true"] { animation: hjm-pulse var(--hjm-skeleton-duration) var(--hjm-skeleton-easing) infinite alternate; }
960
1030
 
1031
+ /* CommandPalette ---------------------------------------------------------- */
1032
+ /*
1033
+ A modal takeover, so it reuses the shared overlay veil and modal stack; only
1034
+ the pinned search field and the result viewport are new chrome. Rows are
1035
+ chrome-identical to Menu items, which is why they carry no separate tokens.
1036
+ */
1037
+ .hjm-command-palette-positioner { align-items: flex-start; padding-block-start: 10vh; }
1038
+ .hjm-command-palette {
1039
+ display: flex;
1040
+ flex-direction: column;
1041
+ inline-size: min(100%, 35rem);
1042
+ min-block-size: 0;
1043
+ overflow: hidden;
1044
+ border: 1px solid var(--hjm-color-border);
1045
+ border-radius: var(--hjm-radius-lg);
1046
+ background: var(--hjm-color-surface);
1047
+ box-shadow: 0 16px 48px rgb(0 0 0 / 28%);
1048
+ }
1049
+ .hjm-command-palette__search {
1050
+ flex: 0 0 auto;
1051
+ min-block-size: var(--hjm-control-field-height);
1052
+ padding-inline: var(--hjm-space-md);
1053
+ border: 0;
1054
+ border-block-end: 1px solid var(--hjm-color-border);
1055
+ background: transparent;
1056
+ color: var(--hjm-color-text);
1057
+ font: inherit;
1058
+ }
1059
+ .hjm-command-palette__search:focus-visible { outline: 2px solid var(--hjm-color-focus); outline-offset: -2px; }
1060
+ .hjm-command-palette__viewport { flex: 1 1 auto; min-block-size: 0; overflow: auto; overscroll-behavior: contain; padding: var(--hjm-space-xxs); }
1061
+ .hjm-command-palette__section-label { margin: 0; padding: var(--hjm-space-xs) var(--hjm-space-sm); color: var(--hjm-color-text-muted); font-size: var(--hjm-type-label-size); }
1062
+ .hjm-command-palette__item {
1063
+ display: flex;
1064
+ align-items: center;
1065
+ gap: var(--hjm-space-xs);
1066
+ min-block-size: var(--hjm-control-min-touch-target);
1067
+ padding-inline: var(--hjm-space-sm);
1068
+ border-radius: var(--hjm-radius-sm);
1069
+ }
1070
+ .hjm-command-palette__item[aria-selected="true"] { background: var(--hjm-color-surface-accent); }
1071
+ .hjm-command-palette__item[aria-disabled="true"] { color: var(--hjm-color-text-weak); }
1072
+ .hjm-command-palette__item[data-tone="danger"] { color: var(--hjm-color-danger); }
1073
+ .hjm-command-palette__copy { display: flex; min-inline-size: 0; flex: 1 1 auto; flex-wrap: wrap; align-items: baseline; gap: var(--hjm-space-xs); overflow-wrap: anywhere; }
1074
+ .hjm-command-palette__description { color: var(--hjm-color-text-muted); font-size: var(--hjm-type-label-size); }
1075
+ .hjm-command-palette__shortcut { color: var(--hjm-color-text-muted); font-size: var(--hjm-type-label-size); }
1076
+ .hjm-command-palette__state { margin: 0; padding: var(--hjm-space-md); color: var(--hjm-color-text-muted); }
1077
+
1078
+ /* DataTable --------------------------------------------------------------- */
1079
+ .hjm-data-table { display: flex; flex-direction: column; gap: var(--hjm-space-sm); min-inline-size: 0; }
1080
+ .hjm-data-table__table { inline-size: 100%; border-collapse: collapse; }
1081
+ .hjm-data-table__table th,
1082
+ .hjm-data-table__table td {
1083
+ padding: var(--hjm-space-sm);
1084
+ border-block-end: 1px solid var(--hjm-color-border);
1085
+ vertical-align: top;
1086
+ overflow-wrap: anywhere;
1087
+ }
1088
+ .hjm-data-table[data-density="compact"] .hjm-data-table__table th,
1089
+ .hjm-data-table[data-density="compact"] .hjm-data-table__table td { padding: var(--hjm-space-xs) var(--hjm-space-sm); }
1090
+ .hjm-data-table__table th { color: var(--hjm-color-text-muted); font-weight: var(--hjm-font-weight-semibold); }
1091
+ .hjm-data-table__selector { inline-size: var(--hjm-control-min-touch-target); }
1092
+ .hjm-data-table__sort {
1093
+ display: inline-flex;
1094
+ align-items: center;
1095
+ gap: var(--hjm-space-xxs);
1096
+ min-block-size: var(--hjm-control-min-touch-target);
1097
+ padding: 0;
1098
+ border: 0;
1099
+ background: transparent;
1100
+ color: inherit;
1101
+ font: inherit;
1102
+ }
1103
+ .hjm-data-table__check {
1104
+ display: grid;
1105
+ place-items: center;
1106
+ inline-size: var(--hjm-space-md);
1107
+ block-size: var(--hjm-space-md);
1108
+ border: 1px solid var(--hjm-color-border-control);
1109
+ border-radius: var(--hjm-radius-sm);
1110
+ background: transparent;
1111
+ color: var(--hjm-color-on-primary);
1112
+ font-size: var(--hjm-type-label-size);
1113
+ }
1114
+ .hjm-data-table__check[aria-checked="true"],
1115
+ .hjm-data-table__check[aria-checked="mixed"] { border-color: var(--hjm-color-primary); background: var(--hjm-color-primary); }
1116
+ .hjm-data-table__sort:focus-visible,
1117
+ .hjm-data-table__check:focus-visible { outline: 2px solid var(--hjm-color-focus); outline-offset: 2px; }
1118
+ .hjm-data-table__table tr[data-disabled] { color: var(--hjm-color-text-weak); }
1119
+ .hjm-data-table__state { margin: 0; color: var(--hjm-color-text-muted); }
1120
+ .hjm-data-table__footer { display: flex; flex-wrap: wrap; justify-content: space-between; gap: var(--hjm-space-sm); }
1121
+
1122
+ /* Mentions ---------------------------------------------------------------- */
1123
+ /*
1124
+ The popup is Combobox's listbox contract layered on a plain TextArea, so the
1125
+ rules here are only the anchored surface — no new selection or filtering
1126
+ visuals, which the Combobox renderer already owns.
1127
+ */
1128
+ .hjm-mentions { display: block; }
1129
+ .hjm-mentions__list {
1130
+ max-block-size: 14rem;
1131
+ overflow: auto;
1132
+ overscroll-behavior: contain;
1133
+ padding: var(--hjm-space-xxs);
1134
+ border: 1px solid var(--hjm-color-border);
1135
+ border-radius: var(--hjm-radius-md);
1136
+ background: var(--hjm-color-bg);
1137
+ box-shadow: 0 12px 32px rgb(0 0 0 / 18%);
1138
+ pointer-events: auto;
1139
+ }
1140
+ .hjm-mentions__option {
1141
+ display: flex;
1142
+ flex-wrap: wrap;
1143
+ align-items: baseline;
1144
+ gap: var(--hjm-space-xs);
1145
+ min-block-size: var(--hjm-control-min-touch-target);
1146
+ padding: var(--hjm-space-xxs) var(--hjm-space-xs);
1147
+ border-radius: var(--hjm-radius-sm);
1148
+ overflow-wrap: anywhere;
1149
+ }
1150
+ .hjm-mentions__option[aria-selected="true"] { background: var(--hjm-color-surface-accent); }
1151
+ .hjm-mentions__description { color: var(--hjm-color-text-muted); font-size: var(--hjm-type-label-size); }
1152
+ .hjm-mentions__empty { margin: 0; padding: var(--hjm-space-xs); color: var(--hjm-color-text-muted); }
1153
+
1154
+ /* TransferList ------------------------------------------------------------ */
1155
+ .hjm-transfer-list {
1156
+ display: grid;
1157
+ grid-template-columns: 1fr auto 1fr;
1158
+ align-items: start;
1159
+ gap: var(--hjm-space-md);
1160
+ }
1161
+ /* Narrow viewports stack the panels; the move buttons stay between them. */
1162
+ @media (max-width: 30rem) {
1163
+ .hjm-transfer-list { grid-template-columns: 1fr; }
1164
+ }
1165
+ .hjm-transfer-list__panel {
1166
+ min-inline-size: 0;
1167
+ border: 1px solid var(--hjm-color-border);
1168
+ border-radius: var(--hjm-radius-md);
1169
+ background: var(--hjm-color-bg);
1170
+ }
1171
+ .hjm-transfer-list__header {
1172
+ display: flex;
1173
+ align-items: center;
1174
+ justify-content: space-between;
1175
+ gap: var(--hjm-space-xs);
1176
+ min-block-size: var(--hjm-control-min-touch-target);
1177
+ padding-inline: var(--hjm-space-sm);
1178
+ border-block-end: 1px solid var(--hjm-color-border);
1179
+ }
1180
+ .hjm-transfer-list__title { font-weight: var(--hjm-font-weight-bold); overflow-wrap: anywhere; }
1181
+ .hjm-transfer-list__select-all,
1182
+ .hjm-transfer-list__mark {
1183
+ display: grid;
1184
+ place-items: center;
1185
+ flex: 0 0 auto;
1186
+ inline-size: var(--hjm-space-md);
1187
+ block-size: var(--hjm-space-md);
1188
+ border: 1px solid var(--hjm-color-border-control);
1189
+ border-radius: var(--hjm-radius-sm);
1190
+ background: transparent;
1191
+ color: var(--hjm-color-on-primary);
1192
+ font-size: var(--hjm-type-label-size);
1193
+ }
1194
+ .hjm-transfer-list__select-all[aria-checked="true"],
1195
+ .hjm-transfer-list__select-all[aria-checked="mixed"],
1196
+ .hjm-transfer-list__mark[data-checked] { border-color: var(--hjm-color-primary); background: var(--hjm-color-primary); }
1197
+ .hjm-transfer-list__options { display: flex; flex-direction: column; padding: var(--hjm-space-xxs); }
1198
+ .hjm-transfer-list__option {
1199
+ display: flex;
1200
+ align-items: center;
1201
+ gap: var(--hjm-space-xs);
1202
+ min-block-size: var(--hjm-control-min-touch-target);
1203
+ padding-inline: var(--hjm-space-xs);
1204
+ border-radius: var(--hjm-radius-sm);
1205
+ overflow-wrap: anywhere;
1206
+ }
1207
+ .hjm-transfer-list__option[aria-selected="true"] { background: var(--hjm-color-surface-accent); }
1208
+ .hjm-transfer-list__option[aria-disabled="true"] { color: var(--hjm-color-text-weak); }
1209
+ .hjm-transfer-list__option:focus-visible,
1210
+ .hjm-transfer-list__empty:focus-visible,
1211
+ .hjm-transfer-list__select-all:focus-visible { outline: 2px solid var(--hjm-color-focus); outline-offset: -2px; }
1212
+ .hjm-transfer-list__empty { margin: 0; padding: var(--hjm-space-md) var(--hjm-space-sm); color: var(--hjm-color-text-muted); }
1213
+ .hjm-transfer-list__actions { display: flex; flex-direction: column; gap: var(--hjm-space-xs); padding-block-start: var(--hjm-space-xl); }
1214
+
1215
+ /* AuthProviderButton ------------------------------------------------------ */
1216
+ /*
1217
+ Brand fills come in as custom properties from the provider guideline table,
1218
+ never from the theme: recoloring them would fail provider review. HJM keeps
1219
+ the height, radius, target and focus ring so a stack of providers lines up,
1220
+ and the ring is drawn outside the fill so it survives every brand color.
1221
+ */
1222
+ .hjm-auth-provider-button {
1223
+ display: flex;
1224
+ align-items: center;
1225
+ justify-content: center;
1226
+ gap: var(--hjm-provider-gap);
1227
+ inline-size: 100%;
1228
+ min-block-size: max(var(--hjm-provider-min-height), var(--hjm-control-min-touch-target));
1229
+ padding-inline: var(--hjm-provider-padding);
1230
+ border: var(--hjm-provider-border-width) solid var(--hjm-provider-border);
1231
+ border-radius: var(--hjm-provider-radius);
1232
+ background: var(--hjm-provider-background);
1233
+ color: var(--hjm-provider-content);
1234
+ font: inherit;
1235
+ font-size: var(--hjm-type-body-size);
1236
+ line-height: var(--hjm-type-body-line-height);
1237
+ cursor: pointer;
1238
+ }
1239
+ .hjm-auth-provider-button:disabled { cursor: default; opacity: var(--hjm-opacity-disabled, 0.5); }
1240
+ .hjm-auth-provider-button:focus-visible {
1241
+ outline: 2px solid var(--hjm-color-focus);
1242
+ outline-offset: var(--hjm-provider-focus-offset);
1243
+ }
1244
+ .hjm-auth-provider-button__logo {
1245
+ display: grid;
1246
+ place-items: center;
1247
+ flex: 0 0 auto;
1248
+ inline-size: var(--hjm-provider-logo-size);
1249
+ block-size: var(--hjm-provider-logo-size);
1250
+ color: var(--hjm-provider-content);
1251
+ }
1252
+ .hjm-auth-provider-button__label { min-inline-size: 0; overflow-wrap: anywhere; }
1253
+ .hjm-auth-provider-button__spinner {
1254
+ flex: 0 0 auto;
1255
+ inline-size: 1em;
1256
+ block-size: 1em;
1257
+ border: 2px solid currentcolor;
1258
+ border-block-start-color: transparent;
1259
+ border-radius: var(--hjm-radius-full);
1260
+ animation: hjm-provider-spin 900ms linear infinite;
1261
+ }
1262
+ @media (prefers-reduced-motion: reduce) {
1263
+ .hjm-auth-provider-button__spinner { animation: none; opacity: 0.6; }
1264
+ }
1265
+ @keyframes hjm-provider-spin { to { transform: rotate(360deg); } }
1266
+
1267
+ /* DateRangePicker --------------------------------------------------------- */
1268
+ /*
1269
+ Range edges are painted on the cell content layer; Calendar keeps its single
1270
+ selection semantics underneath. The hovered preview uses the same states, so
1271
+ there is one set of rules rather than a committed and a provisional set.
1272
+ */
1273
+ .hjm-date-range__cell { position: absolute; inset: 0; border-radius: var(--hjm-radius-sm); pointer-events: auto; }
1274
+ .hjm-date-range__cell[data-range="between"] { background: var(--hjm-color-surface-accent); }
1275
+ .hjm-date-range__cell[data-range="start"],
1276
+ .hjm-date-range__cell[data-range="end"] { background: var(--hjm-color-surface-accent); outline: 2px solid var(--hjm-color-focus); }
1277
+ .hjm-date-range__cell[data-range="none"] { background: transparent; }
1278
+
1279
+ /* AvatarGroup: overlap comes from the recipe ratio, not a per-size pixel value. */
1280
+ .hjm-avatar-group { display: inline-flex; align-items: center; }
1281
+ .hjm-avatar-group > * + * { margin-inline-start: calc(var(--hjm-avatar-overlap) * -1); }
1282
+ .hjm-avatar-group > .hjm-avatar { border: 2px solid var(--hjm-color-bg); border-radius: var(--hjm-radius-full); }
1283
+ .hjm-avatar-group__overflow {
1284
+ display: grid;
1285
+ place-items: center;
1286
+ min-inline-size: var(--hjm-space-xl);
1287
+ min-block-size: var(--hjm-space-xl);
1288
+ padding-inline: var(--hjm-space-xxs);
1289
+ border: 2px solid var(--hjm-color-bg);
1290
+ border-radius: var(--hjm-radius-full);
1291
+ background: var(--hjm-color-surface-alt);
1292
+ color: var(--hjm-color-text-muted);
1293
+ font-size: var(--hjm-type-label-size);
1294
+ }
1295
+
1296
+ /* CounterBadge dot: no number, so the accessible name carries the meaning. */
1297
+ .hjm-counter-badge[data-dot] {
1298
+ min-inline-size: var(--hjm-counter-dot-size);
1299
+ inline-size: var(--hjm-counter-dot-size);
1300
+ block-size: var(--hjm-counter-dot-size);
1301
+ padding: 0;
1302
+ border-radius: var(--hjm-radius-full);
1303
+ }
1304
+
1305
+ /* TextFormat -------------------------------------------------------------- */
1306
+ .hjm-text-format { margin: 0; overflow-wrap: anywhere; }
1307
+ .hjm-text-format[data-kind="kbd"],
1308
+ .hjm-text-format[data-kind="code"] {
1309
+ padding-inline: var(--hjm-space-xxs);
1310
+ border-radius: var(--hjm-radius-sm);
1311
+ background: var(--hjm-color-surface-alt);
1312
+ font-family: var(--hjm-font-family-code, ui-monospace, SFMono-Regular, Consolas, monospace);
1313
+ }
1314
+ .hjm-text-format[data-kind="kbd"] {
1315
+ border: 1px solid var(--hjm-color-border);
1316
+ color: var(--hjm-color-text-body);
1317
+ font-size: var(--hjm-type-label-size);
1318
+ }
1319
+ .hjm-text-format[data-kind="code"] { color: var(--hjm-color-text); font-size: var(--hjm-type-body-size); }
1320
+ .hjm-text-format[data-kind="quote"] {
1321
+ padding-inline-start: var(--hjm-space-md);
1322
+ border-inline-start: 2px solid var(--hjm-color-border);
1323
+ color: var(--hjm-color-text-body);
1324
+ }
1325
+
1326
+ /* SkipNav ----------------------------------------------------------------- */
1327
+ /*
1328
+ Hidden until focused, then unmissable. Clipping it away without restoring it
1329
+ on focus is the common bug: the caret would leave the viewport and WCAG
1330
+ 2.4.7 (Focus Visible) fails.
1331
+ */
1332
+ .hjm-skip-nav {
1333
+ position: absolute;
1334
+ inset-block-start: var(--hjm-skip-nav-offset);
1335
+ inset-inline-start: var(--hjm-skip-nav-offset);
1336
+ z-index: 1300;
1337
+ display: inline-flex;
1338
+ align-items: center;
1339
+ min-block-size: var(--hjm-skip-nav-min-height);
1340
+ padding-inline: var(--hjm-skip-nav-padding);
1341
+ border-radius: var(--hjm-skip-nav-radius);
1342
+ background: var(--hjm-color-primary);
1343
+ color: var(--hjm-color-on-primary);
1344
+ text-decoration: none;
1345
+ transform: translateY(calc(-100% - var(--hjm-skip-nav-offset) * 2));
1346
+ }
1347
+ .hjm-skip-nav:focus-visible,
1348
+ .hjm-skip-nav:focus {
1349
+ transform: none;
1350
+ outline: 2px solid var(--hjm-color-focus);
1351
+ outline-offset: 2px;
1352
+ }
1353
+
1354
+ /* BottomInfo -------------------------------------------------------------- */
1355
+ .hjm-bottom-info {
1356
+ display: block;
1357
+ padding-block-start: var(--hjm-space-sm);
1358
+ color: var(--hjm-color-text-muted);
1359
+ font-size: var(--hjm-type-caption-size);
1360
+ line-height: var(--hjm-type-caption-line-height);
1361
+ }
1362
+ .hjm-bottom-info[data-tone="emphasis"] { color: var(--hjm-color-text-body); }
1363
+ .hjm-bottom-info__list { display: flex; flex-direction: column; gap: var(--hjm-space-xxs); margin: 0; padding-inline-start: var(--hjm-space-md); }
1364
+ .hjm-bottom-info:not([data-list]) .hjm-bottom-info__item { margin: 0; }
1365
+ .hjm-bottom-info__item { overflow-wrap: anywhere; }
1366
+
1367
+ /* Sidebar ----------------------------------------------------------------- */
1368
+ .hjm-sidebar {
1369
+ display: flex;
1370
+ flex-direction: column;
1371
+ gap: var(--hjm-sidebar-group-gap);
1372
+ inline-size: var(--hjm-sidebar-width);
1373
+ min-block-size: 100%;
1374
+ padding: var(--hjm-space-sm) var(--hjm-space-xs);
1375
+ border-inline-end: 1px solid var(--hjm-color-border);
1376
+ background: var(--hjm-color-surface-alt);
1377
+ overflow: auto;
1378
+ }
1379
+ .hjm-sidebar__toggle {
1380
+ align-self: flex-end;
1381
+ min-inline-size: var(--hjm-control-min-touch-target);
1382
+ min-block-size: var(--hjm-control-min-touch-target);
1383
+ border: 0;
1384
+ border-radius: var(--hjm-sidebar-item-radius);
1385
+ background: transparent;
1386
+ color: var(--hjm-color-text-muted);
1387
+ font: inherit;
1388
+ cursor: pointer;
1389
+ }
1390
+ .hjm-sidebar__group { display: flex; flex-direction: column; gap: var(--hjm-sidebar-gap); }
1391
+ .hjm-sidebar__group-label {
1392
+ margin: 0;
1393
+ padding: var(--hjm-space-xxs) var(--hjm-space-sm);
1394
+ color: var(--hjm-color-text-muted);
1395
+ font-size: var(--hjm-type-label-size);
1396
+ font-weight: var(--hjm-type-label-weight);
1397
+ }
1398
+ .hjm-sidebar__list { display: flex; flex-direction: column; gap: var(--hjm-sidebar-gap); margin: 0; padding: 0; list-style: none; }
1399
+ .hjm-sidebar__item {
1400
+ display: flex;
1401
+ align-items: center;
1402
+ gap: var(--hjm-space-sm);
1403
+ min-block-size: var(--hjm-sidebar-item-height);
1404
+ padding-inline: var(--hjm-space-sm);
1405
+ border-radius: var(--hjm-sidebar-item-radius);
1406
+ color: var(--hjm-color-text-body);
1407
+ text-decoration: none;
1408
+ overflow-wrap: anywhere;
1409
+ }
1410
+ .hjm-sidebar__item[aria-current="page"] {
1411
+ background: var(--hjm-color-surface-accent);
1412
+ color: var(--hjm-color-content-brand);
1413
+ font-weight: var(--hjm-font-weight-semibold);
1414
+ }
1415
+ .hjm-sidebar__item[aria-disabled="true"] { color: var(--hjm-color-text-weak); }
1416
+ .hjm-sidebar__item:focus-visible,
1417
+ .hjm-sidebar__toggle:focus-visible { outline: 2px solid var(--hjm-color-focus); outline-offset: -2px; }
1418
+ .hjm-sidebar__icon { display: grid; place-items: center; flex: 0 0 auto; inline-size: var(--hjm-space-lg); }
1419
+ .hjm-sidebar__label { flex: 1 1 auto; min-inline-size: 0; }
1420
+ .hjm-sidebar__badge { flex: 0 0 auto; color: var(--hjm-color-content-brand); font-size: var(--hjm-type-label-size); }
1421
+ /*
1422
+ Collapsed hides the labels only. Every item, its badge and its accessible
1423
+ name stay — collapsing is density, not a different menu.
1424
+ */
1425
+ .hjm-sidebar[data-collapsed] .hjm-sidebar__label,
1426
+ .hjm-sidebar[data-collapsed] .hjm-sidebar__group-label { display: none; }
1427
+ .hjm-sidebar[data-collapsed] .hjm-sidebar__item { justify-content: center; padding-inline: var(--hjm-space-xxs); }
1428
+ .hjm-sidebar[data-collapsed] .hjm-sidebar__badge { position: absolute; margin-block-start: -1.25rem; margin-inline-start: 1rem; }
1429
+ .hjm-sidebar[data-collapsed] .hjm-sidebar__item { position: relative; }
1430
+
1431
+ /* ToggleGroup ------------------------------------------------------------- */
1432
+ .hjm-toggle-group { display: flex; flex-wrap: wrap; gap: var(--hjm-toggle-gap); }
1433
+ .hjm-toggle-group__item {
1434
+ min-block-size: var(--hjm-toggle-min-height);
1435
+ padding-inline: var(--hjm-toggle-padding);
1436
+ border: 1px solid var(--hjm-color-border-control);
1437
+ border-radius: var(--hjm-toggle-radius);
1438
+ background: var(--hjm-color-surface);
1439
+ color: var(--hjm-color-text-body);
1440
+ font: inherit;
1441
+ cursor: pointer;
1442
+ }
1443
+ /* The pressed state is announced by aria-pressed; color only reinforces it. */
1444
+ .hjm-toggle-group__item[aria-pressed="true"] {
1445
+ border-color: var(--hjm-color-focus);
1446
+ background: var(--hjm-color-surface-accent);
1447
+ color: var(--hjm-color-content-brand);
1448
+ font-weight: var(--hjm-font-weight-semibold);
1449
+ }
1450
+ .hjm-toggle-group__item:disabled { cursor: default; color: var(--hjm-color-text-weak); }
1451
+ .hjm-toggle-group__item:focus-visible { outline: 2px solid var(--hjm-color-focus); outline-offset: 2px; }
1452
+
1453
+ /* TagsInput --------------------------------------------------------------- */
1454
+ .hjm-tags-input { display: flex; flex-direction: column; gap: var(--hjm-space-xxs); }
1455
+ .hjm-tags-input__label { color: var(--hjm-color-text-body); font-size: var(--hjm-type-label-size); font-weight: var(--hjm-type-label-weight); }
1456
+ .hjm-tags-input__frame {
1457
+ display: flex;
1458
+ flex-wrap: wrap;
1459
+ align-items: center;
1460
+ gap: var(--hjm-tags-gap);
1461
+ min-block-size: var(--hjm-tags-min-height);
1462
+ padding: var(--hjm-space-xxs) var(--hjm-space-sm);
1463
+ border: 1px solid var(--hjm-color-border-control);
1464
+ border-radius: var(--hjm-radius-md);
1465
+ background: var(--hjm-color-bg);
1466
+ cursor: text;
1467
+ }
1468
+ .hjm-tags-input__frame:focus-within { outline: 2px solid var(--hjm-color-focus); outline-offset: -1px; }
1469
+ .hjm-tags-input__list { display: contents; margin: 0; padding: 0; list-style: none; }
1470
+ .hjm-tags-input__tag {
1471
+ display: inline-flex;
1472
+ align-items: center;
1473
+ gap: var(--hjm-space-xxs);
1474
+ min-block-size: var(--hjm-tags-tag-min-height);
1475
+ padding-inline: var(--hjm-space-xs);
1476
+ border-radius: var(--hjm-radius-full);
1477
+ background: var(--hjm-color-surface-alt);
1478
+ color: var(--hjm-color-text-body);
1479
+ overflow-wrap: anywhere;
1480
+ }
1481
+ /* Armed by the first Backspace: visible before the second press removes it. */
1482
+ .hjm-tags-input__tag[data-armed] { outline: 2px solid var(--hjm-color-focus); }
1483
+ .hjm-tags-input__remove {
1484
+ display: grid;
1485
+ place-items: center;
1486
+ min-inline-size: var(--hjm-space-md);
1487
+ min-block-size: var(--hjm-space-md);
1488
+ padding: 0;
1489
+ border: 0;
1490
+ background: transparent;
1491
+ color: var(--hjm-color-text-muted);
1492
+ font: inherit;
1493
+ cursor: pointer;
1494
+ }
1495
+ .hjm-tags-input__remove::after {
1496
+ /* Keeps the pointer target at the shared minimum without growing the chip. */
1497
+ content: "";
1498
+ position: absolute;
1499
+ min-inline-size: var(--hjm-tags-remove-target);
1500
+ min-block-size: var(--hjm-tags-remove-target);
1501
+ }
1502
+ .hjm-tags-input__tag { position: relative; }
1503
+ .hjm-tags-input__input {
1504
+ flex: 1 1 8ch;
1505
+ min-inline-size: 8ch;
1506
+ border: 0;
1507
+ background: transparent;
1508
+ color: var(--hjm-color-text);
1509
+ font: inherit;
1510
+ outline: none;
1511
+ }
1512
+ .hjm-tags-input__suggestions {
1513
+ display: flex;
1514
+ flex-direction: column;
1515
+ max-block-size: 12rem;
1516
+ margin: var(--hjm-space-xxs) 0 0;
1517
+ padding: var(--hjm-space-xxs);
1518
+ border: 1px solid var(--hjm-color-border);
1519
+ border-radius: var(--hjm-radius-md);
1520
+ background: var(--hjm-color-bg);
1521
+ list-style: none;
1522
+ overflow: auto;
1523
+ }
1524
+ .hjm-tags-input__suggestion {
1525
+ display: flex;
1526
+ align-items: center;
1527
+ min-block-size: var(--hjm-control-min-touch-target);
1528
+ padding-inline: var(--hjm-space-xs);
1529
+ border-radius: var(--hjm-radius-sm);
1530
+ cursor: pointer;
1531
+ overflow-wrap: anywhere;
1532
+ }
1533
+ .hjm-tags-input__suggestion[aria-selected="true"] { background: var(--hjm-color-surface-accent); }
1534
+ .hjm-tags-input__suggestion[aria-disabled="true"] { color: var(--hjm-color-text-weak); cursor: default; }
1535
+ .hjm-tags-input__description { margin: 0; color: var(--hjm-color-text-muted); font-size: var(--hjm-type-label-size); }
1536
+ .hjm-tags-input[data-disabled] .hjm-tags-input__frame { opacity: 0.6; cursor: default; }
1537
+
1538
+ /* Heading ----------------------------------------------------------------- */
1539
+ /*
1540
+ Exposes the existing heading scale; owns no surrounding layout, so the block
1541
+ that contains it decides the spacing.
1542
+ */
1543
+ .hjm-heading {
1544
+ margin: 0;
1545
+ color: var(--hjm-color-text);
1546
+ font-size: var(--hjm-heading-size);
1547
+ line-height: var(--hjm-heading-line-height);
1548
+ font-weight: var(--hjm-heading-weight);
1549
+ overflow-wrap: anywhere;
1550
+ }
1551
+
1552
+ /* Top --------------------------------------------------------------------- */
1553
+ /*
1554
+ Body content, not fixed chrome: no position, no safe area, no z-index. The
1555
+ title uses the shared type scale passed down as custom properties so the two
1556
+ sizes never drift from `topRecipe.sizes`.
1557
+ */
1558
+ .hjm-top {
1559
+ display: flex;
1560
+ flex-direction: column;
1561
+ padding-block: var(--hjm-top-padding-top) var(--hjm-top-padding-bottom);
1562
+ }
1563
+ .hjm-top__eyebrow {
1564
+ margin: 0 0 var(--hjm-space-xxs);
1565
+ color: var(--hjm-color-content-brand, var(--hjm-color-primary));
1566
+ font-size: var(--hjm-type-label-size);
1567
+ line-height: var(--hjm-type-label-line-height);
1568
+ font-weight: var(--hjm-type-label-weight);
1569
+ }
1570
+ .hjm-top__row {
1571
+ display: flex;
1572
+ flex-wrap: wrap;
1573
+ align-items: baseline;
1574
+ justify-content: space-between;
1575
+ gap: var(--hjm-space-xs);
1576
+ }
1577
+ .hjm-top__title {
1578
+ margin: 0;
1579
+ min-inline-size: 0;
1580
+ flex: 1 1 auto;
1581
+ color: var(--hjm-color-text);
1582
+ font-size: var(--hjm-top-title-size);
1583
+ line-height: var(--hjm-top-title-line-height);
1584
+ font-weight: var(--hjm-top-title-weight);
1585
+ overflow-wrap: anywhere;
1586
+ }
1587
+ .hjm-top__trailing { display: flex; flex: 0 0 auto; align-items: center; gap: var(--hjm-space-xs); }
1588
+ .hjm-top__description {
1589
+ margin: var(--hjm-space-xs) 0 0;
1590
+ color: var(--hjm-color-text-body);
1591
+ overflow-wrap: anywhere;
1592
+ }
1593
+
1594
+ /* Agreement --------------------------------------------------------------- */
1595
+ .hjm-agreement { display: flex; flex-direction: column; gap: var(--hjm-space-xs); }
1596
+ .hjm-agreement__all,
1597
+ .hjm-agreement__toggle {
1598
+ display: flex;
1599
+ align-items: center;
1600
+ gap: var(--hjm-space-sm);
1601
+ min-block-size: var(--hjm-control-min-touch-target);
1602
+ padding: 0;
1603
+ border: 0;
1604
+ background: transparent;
1605
+ color: var(--hjm-color-text);
1606
+ font: inherit;
1607
+ text-align: start;
1608
+ }
1609
+ .hjm-agreement__all {
1610
+ gap: var(--hjm-space-sm);
1611
+ padding: var(--hjm-space-sm) var(--hjm-space-md);
1612
+ border-radius: var(--hjm-radius-md);
1613
+ background: var(--hjm-color-surface-alt);
1614
+ font-size: var(--hjm-type-body-large-size);
1615
+ line-height: var(--hjm-type-body-large-line-height);
1616
+ }
1617
+ .hjm-agreement__list { display: flex; flex-direction: column; }
1618
+ .hjm-agreement__item {
1619
+ display: grid;
1620
+ grid-template-columns: 1fr auto;
1621
+ align-items: center;
1622
+ gap: var(--hjm-space-xs);
1623
+ padding-inline: var(--hjm-space-sm);
1624
+ }
1625
+ .hjm-agreement__item[data-disabled] { color: var(--hjm-color-text-weak); }
1626
+ .hjm-agreement__copy { display: flex; min-inline-size: 0; flex-wrap: wrap; align-items: baseline; gap: var(--hjm-space-xxs); overflow-wrap: anywhere; }
1627
+ .hjm-agreement__required { color: var(--hjm-color-text-muted); font-size: var(--hjm-type-label-size); }
1628
+ .hjm-agreement__required[data-required] { color: var(--hjm-color-content-brand, var(--hjm-color-primary)); }
1629
+ .hjm-agreement__description {
1630
+ grid-column: 1 / -1;
1631
+ margin: 0 0 var(--hjm-space-xs);
1632
+ color: var(--hjm-color-text-muted);
1633
+ font-size: var(--hjm-type-label-size);
1634
+ }
1635
+ .hjm-agreement__detail {
1636
+ display: inline-flex;
1637
+ align-items: center;
1638
+ min-block-size: var(--hjm-control-min-touch-target);
1639
+ padding: 0 var(--hjm-space-xs);
1640
+ border: 0;
1641
+ background: transparent;
1642
+ color: var(--hjm-color-text-muted);
1643
+ font: inherit;
1644
+ font-size: var(--hjm-type-label-size);
1645
+ text-decoration: underline;
1646
+ }
1647
+ .hjm-agreement__mark {
1648
+ display: grid;
1649
+ place-items: center;
1650
+ flex: 0 0 auto;
1651
+ inline-size: var(--hjm-space-md);
1652
+ block-size: var(--hjm-space-md);
1653
+ border: 1px solid var(--hjm-color-border-control);
1654
+ border-radius: var(--hjm-radius-sm);
1655
+ color: var(--hjm-color-on-primary);
1656
+ font-size: var(--hjm-type-label-size);
1657
+ }
1658
+ .hjm-agreement__mark[data-state="true"],
1659
+ .hjm-agreement__mark[data-state="mixed"] { border-color: var(--hjm-color-primary); background: var(--hjm-color-primary); }
1660
+ .hjm-agreement__all:focus-visible,
1661
+ .hjm-agreement__toggle:focus-visible,
1662
+ .hjm-agreement__detail:focus-visible { outline: 2px solid var(--hjm-color-focus); outline-offset: 2px; }
1663
+
1664
+ /* Tree -------------------------------------------------------------------- */
1665
+ /*
1666
+ A flat list of treeitems with aria-level, not nested group elements: the
1667
+ roving tab stop and the contract's visible-node navigation both operate on one
1668
+ resolved array, and WAI-ARIA accepts either shape. Indentation is presentation
1669
+ only — depth is announced, never inferred from the padding.
1670
+ */
1671
+ .hjm-tree { display: flex; flex-direction: column; }
1672
+ .hjm-tree__node {
1673
+ display: flex;
1674
+ align-items: center;
1675
+ gap: var(--hjm-space-xs);
1676
+ min-block-size: var(--hjm-control-min-touch-target);
1677
+ padding-inline: var(--hjm-space-sm);
1678
+ padding-block: var(--hjm-space-xxs);
1679
+ border-radius: var(--hjm-radius-sm);
1680
+ color: var(--hjm-color-text);
1681
+ cursor: default;
1682
+ }
1683
+ .hjm-tree__node[aria-selected="true"] { background: var(--hjm-color-surface-accent); }
1684
+ .hjm-tree__node[aria-disabled="true"] { color: var(--hjm-color-text-weak); }
1685
+ .hjm-tree__node:focus-visible { outline: 2px solid var(--hjm-color-focus); outline-offset: -2px; }
1686
+ .hjm-tree__indent { flex: 0 0 auto; inline-size: calc(var(--hjm-tree-depth) * var(--hjm-tree-indent)); }
1687
+ .hjm-tree__toggle { flex: 0 0 auto; inline-size: var(--hjm-space-md); color: var(--hjm-color-text-muted); text-align: center; }
1688
+ .hjm-tree__label { min-inline-size: 0; display: flex; flex-wrap: wrap; align-items: baseline; gap: var(--hjm-space-xs); overflow-wrap: anywhere; }
1689
+ .hjm-tree__description { color: var(--hjm-color-text-muted); font-size: var(--hjm-type-label-size); }
1690
+ .hjm-tree__check {
1691
+ flex: 0 0 auto;
1692
+ display: grid;
1693
+ place-items: center;
1694
+ inline-size: var(--hjm-space-md);
1695
+ block-size: var(--hjm-space-md);
1696
+ border: 1px solid var(--hjm-color-border-control);
1697
+ border-radius: var(--hjm-radius-sm);
1698
+ color: var(--hjm-color-on-primary);
1699
+ font-size: var(--hjm-type-label-size);
1700
+ }
1701
+ .hjm-tree__check[data-state="true"],
1702
+ .hjm-tree__check[data-state="mixed"] { border-color: var(--hjm-color-primary); background: var(--hjm-color-primary); }
1703
+ .hjm-tree__state { margin: 0; padding: var(--hjm-space-xs) var(--hjm-space-sm); color: var(--hjm-color-text-muted); }
1704
+
1705
+ /* Splitter ---------------------------------------------------------------- */
1706
+ /*
1707
+ Slider's "thin visible line, large hit target" split: the bar draws
1708
+ `--hjm-splitter-thickness` but the separator itself reserves the 44px target
1709
+ the recipe requires, so the extra area is padding rather than a wider line.
1710
+ */
1711
+ .hjm-splitter { display: flex; min-inline-size: 0; min-block-size: 0; }
1712
+ .hjm-splitter[data-axis="vertical"] { flex-direction: column; }
1713
+ .hjm-splitter__pane { min-inline-size: 0; min-block-size: 0; overflow: auto; }
1714
+ .hjm-splitter__pane[data-pane="primary"] { flex: 0 0 var(--hjm-splitter-primary); }
1715
+ .hjm-splitter__pane[data-pane="secondary"] { flex: 1 1 0; }
1716
+ .hjm-splitter__separator {
1717
+ display: flex;
1718
+ flex: 0 0 auto;
1719
+ align-items: center;
1720
+ justify-content: center;
1721
+ background: none;
1722
+ touch-action: none;
1723
+ }
1724
+ .hjm-splitter[data-axis="horizontal"] > .hjm-splitter__separator {
1725
+ inline-size: var(--hjm-splitter-hit-target);
1726
+ cursor: col-resize;
1727
+ }
1728
+ .hjm-splitter[data-axis="vertical"] > .hjm-splitter__separator {
1729
+ block-size: var(--hjm-splitter-hit-target);
1730
+ cursor: row-resize;
1731
+ }
1732
+ .hjm-splitter__handle { display: block; background: var(--hjm-color-border); }
1733
+ .hjm-splitter[data-axis="horizontal"] .hjm-splitter__handle {
1734
+ inline-size: var(--hjm-splitter-thickness);
1735
+ block-size: 100%;
1736
+ }
1737
+ .hjm-splitter[data-axis="vertical"] .hjm-splitter__handle {
1738
+ block-size: var(--hjm-splitter-thickness);
1739
+ inline-size: 100%;
1740
+ }
1741
+ .hjm-splitter__separator:hover .hjm-splitter__handle { background: var(--hjm-color-border-control); }
1742
+ .hjm-splitter[data-dragging] .hjm-splitter__handle { background: var(--hjm-color-focus); }
1743
+ .hjm-splitter__separator:focus-visible { outline: 2px solid var(--hjm-color-focus); outline-offset: -2px; }
1744
+ .hjm-splitter__separator[aria-disabled="true"] { cursor: default; }
1745
+
961
1746
  /* Overlays ---------------------------------------------------------------- */
962
1747
  .hjm-portal { color: var(--hjm-color-text); }
963
1748
  .hjm-portal[inert] { visibility: hidden; pointer-events: none; }
@@ -1098,10 +1883,130 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1098
1883
  .hjm-sheet[data-placement="bottom"] > .hjm-sheet__footer {
1099
1884
  padding-block-end: calc(var(--hjm-space-lg) + env(safe-area-inset-bottom, 0px));
1100
1885
  }
1886
+ /* Detent handle: a control, so it carries the shared minimum target. */
1887
+ .hjm-sheet__handle-row { display: flex; justify-content: center; flex: 0 0 auto; }
1888
+ .hjm-sheet__handle {
1889
+ display: grid;
1890
+ place-items: center;
1891
+ min-inline-size: var(--hjm-control-min-touch-target);
1892
+ min-block-size: var(--hjm-space-lg);
1893
+ padding: 0;
1894
+ border: 0;
1895
+ background: transparent;
1896
+ cursor: pointer;
1897
+ }
1898
+ .hjm-sheet__handle:focus-visible { outline: 2px solid var(--hjm-color-focus); outline-offset: -2px; border-radius: var(--hjm-radius-full); }
1899
+ .hjm-sheet__handle-bar { inline-size: 2.25rem; block-size: 0.25rem; border-radius: var(--hjm-radius-full); background: var(--hjm-color-border-control); }
1900
+ .hjm-sheet[data-detent="medium"] { block-size: 60dvh; }
1901
+ .hjm-sheet[data-detent="large"] { block-size: 85dvh; }
1902
+ .hjm-sheet[data-detent="full"] { block-size: 100dvh; }
1101
1903
  .hjm-sheet[data-placement="start"],
1102
1904
  .hjm-sheet[data-placement="end"] {
1103
1905
  block-size: calc(100dvh - (2 * var(--hjm-space-md)));
1104
1906
  }
1907
+ /*
1908
+ SidePanel docks to a logical viewport edge, so it drops the floating radius the
1909
+ Dialog/Sheet cards keep (sidePanelRecipe.content.radius is null) and spans the
1910
+ full block size. The non-modal panel has no backdrop element at all — the page
1911
+ behind it stays interactive — so it positions itself instead of a positioner.
1912
+ */
1913
+ .hjm-side-panel-positioner { padding: 0; }
1914
+ .hjm-side-panel-positioner[data-edge="start"] { justify-content: flex-start; }
1915
+ .hjm-side-panel-positioner[data-edge="end"] { justify-content: flex-end; }
1916
+ .hjm-side-panel {
1917
+ display: flex;
1918
+ flex-direction: column;
1919
+ inline-size: min(var(--hjm-side-panel-size), 100%);
1920
+ block-size: 100dvh;
1921
+ min-inline-size: 0;
1922
+ overflow: hidden;
1923
+ border: 1px solid var(--hjm-color-border);
1924
+ border-radius: 0;
1925
+ color: var(--hjm-color-text);
1926
+ background: var(--hjm-color-surface);
1927
+ box-shadow: 0 16px 48px rgb(0 0 0 / 28%);
1928
+ }
1929
+ .hjm-side-panel[data-modal="false"] {
1930
+ position: fixed;
1931
+ inset-block: 0;
1932
+ inset-inline-start: auto;
1933
+ inset-inline-end: 0;
1934
+ }
1935
+ .hjm-side-panel[data-modal="false"][data-edge="start"] {
1936
+ inset-inline-start: 0;
1937
+ inset-inline-end: auto;
1938
+ }
1939
+ .hjm-side-panel__header {
1940
+ display: flex;
1941
+ flex: 0 0 auto;
1942
+ align-items: flex-start;
1943
+ justify-content: space-between;
1944
+ gap: var(--hjm-space-md);
1945
+ min-block-size: 44px;
1946
+ padding: var(--hjm-space-sm) var(--hjm-space-lg) 0;
1947
+ }
1948
+ .hjm-side-panel__title {
1949
+ margin: 0;
1950
+ font-size: var(--hjm-type-title-size);
1951
+ line-height: var(--hjm-type-title-line-height);
1952
+ overflow-wrap: anywhere;
1953
+ }
1954
+ .hjm-side-panel__description {
1955
+ margin: var(--hjm-space-xs) 0 0;
1956
+ color: var(--hjm-color-text-muted);
1957
+ overflow-wrap: anywhere;
1958
+ }
1959
+ .hjm-side-panel__body {
1960
+ display: flex;
1961
+ flex: 1 1 auto;
1962
+ flex-direction: column;
1963
+ gap: var(--hjm-space-md);
1964
+ min-block-size: 0;
1965
+ padding: var(--hjm-space-md) var(--hjm-space-lg);
1966
+ overflow: auto;
1967
+ overscroll-behavior: contain;
1968
+ }
1969
+ .hjm-side-panel__footer {
1970
+ display: flex;
1971
+ flex: 0 0 auto;
1972
+ flex-wrap: wrap;
1973
+ justify-content: flex-end;
1974
+ gap: var(--hjm-space-sm);
1975
+ padding: var(--hjm-space-sm) var(--hjm-space-lg)
1976
+ max(var(--hjm-space-sm), env(safe-area-inset-bottom, 0px));
1977
+ }
1978
+ /*
1979
+ Tour keeps the veil and the card in separate portals: the veil must cover the
1980
+ page while the card is positioned against its anchor, and the shared anchored
1981
+ popup helper owns the card's coordinates. The highlight is a ring drawn at the
1982
+ measured anchor box — decoration only, so it is hidden from assistive tech.
1983
+ */
1984
+ .hjm-tour-backdrop { position: fixed; inset: 0; background: rgb(0 0 0 / 58%); pointer-events: auto; }
1985
+ .hjm-tour-highlight {
1986
+ position: fixed;
1987
+ border-radius: var(--hjm-radius-md);
1988
+ box-shadow: 0 0 0 2px var(--hjm-color-focus);
1989
+ pointer-events: none;
1990
+ }
1991
+ .hjm-tour {
1992
+ display: flex;
1993
+ flex-direction: column;
1994
+ gap: var(--hjm-space-sm);
1995
+ box-sizing: border-box;
1996
+ padding: var(--hjm-space-md);
1997
+ border: 1px solid var(--hjm-color-border);
1998
+ border-radius: var(--hjm-radius-md);
1999
+ color: var(--hjm-color-text);
2000
+ background: var(--hjm-color-surface);
2001
+ box-shadow: 0 16px 48px rgb(0 0 0 / 28%);
2002
+ pointer-events: auto;
2003
+ }
2004
+ .hjm-tour__counter { margin: 0; color: var(--hjm-color-text-muted); font-size: var(--hjm-type-label-size); }
2005
+ .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; }
2006
+ .hjm-tour__description { margin: var(--hjm-space-xs) 0 0; color: var(--hjm-color-text-body); overflow-wrap: anywhere; }
2007
+ .hjm-tour__actions { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: var(--hjm-space-xs); }
2008
+ .hjm-tour:focus-visible { outline: 2px solid var(--hjm-color-focus); outline-offset: 2px; }
2009
+
1105
2010
  .hjm-tooltip { position: relative; display: inline-flex; }
1106
2011
  .hjm-tooltip__content {
1107
2012
  position: fixed;
@@ -1315,7 +2220,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1315
2220
  .hjm-breadcrumb__link { color: var(--hjm-color-text-muted); text-underline-offset: 0.18em; overflow-wrap: anywhere; }
1316
2221
  .hjm-breadcrumb__current { color: var(--hjm-color-text); font-weight: var(--hjm-font-weight-semibold); overflow-wrap: anywhere; }
1317
2222
  .hjm-breadcrumb__separator { color: var(--hjm-color-text-weak); }
1318
- [dir="rtl"] .hjm-breadcrumb__separator,
2223
+ [dir="rtl"] .hjm-breadcrumb__separator[data-default="true"],
1319
2224
  [dir="rtl"] .hjm-pagination__previous > span,
1320
2225
  [dir="rtl"] .hjm-pagination__next > span { transform: scaleX(-1); }
1321
2226
  .hjm-pagination__item,
@@ -1329,9 +2234,9 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1329
2234
  border-radius: var(--hjm-radius-md);
1330
2235
  }
1331
2236
  .hjm-pagination__item { color: var(--hjm-color-text-body); background: transparent; font: inherit; cursor: pointer; }
1332
- .hjm-pagination__item:hover:not(:disabled) { background: var(--hjm-color-surface-alt); }
2237
+ .hjm-pagination__item:hover:not([aria-disabled="true"]) { background: var(--hjm-color-surface-alt); }
1333
2238
  .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); }
1334
- .hjm-pagination__item:disabled { opacity: 0.5; cursor: not-allowed; }
2239
+ .hjm-pagination__item[aria-disabled="true"] { opacity: 0.5; cursor: not-allowed; }
1335
2240
  .hjm-pagination__ellipsis { color: var(--hjm-color-text-muted); }
1336
2241
  .hjm-load-more { display: grid; justify-items: center; gap: var(--hjm-space-sm); padding-block: var(--hjm-space-lg); text-align: center; }
1337
2242
  .hjm-load-more[data-density="compact"] { gap: var(--hjm-space-xs); padding-block: var(--hjm-space-sm); }
@@ -1389,17 +2294,6 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1389
2294
  .hjm-date-picker__trigger [data-placeholder] { color: var(--hjm-color-text-muted); }
1390
2295
  .hjm-date-picker__clear { position: absolute; inset-inline-end: 0; inline-size: var(--hjm-control-min-touch-target); block-size: var(--hjm-control-min-touch-target); border: 0; color: var(--hjm-color-text-muted); background: transparent; font: inherit; cursor: pointer; }
1391
2296
  .hjm-date-picker__popover { position: absolute; z-index: 800; inset-block-start: calc(100% + var(--hjm-space-xs)); inset-inline-start: 0; inline-size: min(22.5rem, calc(100vw - 2rem)); padding: var(--hjm-space-sm); border: 1px solid var(--hjm-color-border); border-radius: var(--hjm-radius-lg); color: var(--hjm-color-text); background: var(--hjm-color-surface); box-shadow: 0 8px 24px rgb(0 0 0 / 18%); }
1392
- .hjm-date-picker__calendar-header { display: grid; grid-template-columns: var(--hjm-control-min-touch-target) minmax(0, 1fr) var(--hjm-control-min-touch-target) var(--hjm-control-min-touch-target); align-items: center; gap: var(--hjm-space-xxs); }
1393
- .hjm-date-picker__calendar-header strong { text-align: center; overflow-wrap: anywhere; }
1394
- .hjm-date-picker__calendar-header button, .hjm-date-picker__day { min-inline-size: var(--hjm-control-min-touch-target); min-block-size: var(--hjm-control-min-touch-target); border: 0; border-radius: var(--hjm-radius-full); color: inherit; background: transparent; font: inherit; cursor: pointer; }
1395
- .hjm-date-picker__weekdays, .hjm-date-picker__week { display: grid; grid-template-columns: repeat(7, minmax(0, 1fr)); }
1396
- .hjm-date-picker__weekdays span { padding-block: var(--hjm-space-xs); color: var(--hjm-color-text-muted); font-size: var(--hjm-type-label-size); text-align: center; }
1397
- .hjm-date-picker__grid { display: grid; }
1398
- .hjm-date-picker__day { display: grid; place-items: center; align-content: center; overflow: hidden; }
1399
- .hjm-date-picker__day[data-today] { border: 1px solid var(--hjm-color-focus); }
1400
- .hjm-date-picker__day[data-selected] { color: var(--hjm-color-on-primary); background: var(--hjm-color-primary); }
1401
- .hjm-date-picker__day[data-disabled] { opacity: 0.5; cursor: not-allowed; }
1402
- .hjm-date-picker__day[data-outside] { opacity: 0.56; }
1403
2297
  .hjm-date-picker__description { color: var(--hjm-color-text-muted); }
1404
2298
  .hjm-date-picker__error { color: var(--hjm-color-danger); }
1405
2299
 
@@ -1409,16 +2303,18 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1409
2303
  .hjm-toast-viewport[data-placement^="bottom"] { inset-block-end: calc(max(var(--hjm-space-md), env(safe-area-inset-bottom)) + var(--hjm-toast-bottom-offset, 0px)); flex-direction: column-reverse; }
1410
2304
  .hjm-toast-viewport[data-placement$="-start"] { margin-inline-start: 0; }
1411
2305
  .hjm-toast-viewport[data-placement$="-end"] { margin-inline-end: 0; }
1412
- .hjm-toast { position: relative; min-inline-size: 0; min-block-size: 3.5rem; display: flex; align-items: center; gap: var(--hjm-space-sm); padding: var(--hjm-space-md); overflow: hidden; border: 1px solid var(--hjm-color-border); border-radius: var(--hjm-radius-md); color: var(--hjm-color-text); background: var(--hjm-color-bg); box-shadow: 0 8px 24px rgb(0 0 0 / 18%); pointer-events: auto; }
2306
+ /* Cards stay narrow on desktop too; keep close/action rows explicit (docs/toast.md). */
2307
+ .hjm-toast { position: relative; min-inline-size: 0; min-block-size: 3.5rem; display: grid; grid-template-columns: auto minmax(0, 1fr) auto; align-items: center; gap: var(--hjm-space-sm); padding: var(--hjm-space-md); overflow: hidden; border: 1px solid var(--hjm-color-border); border-radius: var(--hjm-radius-md); color: var(--hjm-color-text); background: var(--hjm-color-bg); box-shadow: 0 8px 24px rgb(0 0 0 / 18%); pointer-events: auto; }
1413
2308
  .hjm-toast__tone-mark { position: absolute; inset-block: 0; inset-inline-start: 0; inline-size: 2px; background: var(--hjm-color-text-muted); }
1414
2309
  .hjm-toast[data-tone="info"] .hjm-toast__tone-mark, .hjm-toast[data-tone="info"] .hjm-toast__icon { color: var(--hjm-accent-info); background-color: var(--hjm-accent-info); }
1415
2310
  .hjm-toast[data-tone="success"] .hjm-toast__tone-mark, .hjm-toast[data-tone="success"] .hjm-toast__icon { color: var(--hjm-accent-success); background-color: var(--hjm-accent-success); }
1416
2311
  .hjm-toast[data-tone="warning"] .hjm-toast__tone-mark, .hjm-toast[data-tone="warning"] .hjm-toast__icon { color: var(--hjm-accent-warning); background-color: var(--hjm-accent-warning); }
1417
2312
  .hjm-toast[data-tone="danger"] .hjm-toast__tone-mark, .hjm-toast[data-tone="danger"] .hjm-toast__icon { color: var(--hjm-color-danger); background-color: var(--hjm-color-danger); }
1418
- .hjm-toast__icon { flex: 0 0 auto; display: grid; place-items: center; inline-size: 1.25rem; block-size: 1.25rem; border-radius: 50%; color: var(--hjm-color-text-muted); background: transparent !important; font-weight: var(--hjm-font-weight-bold); }
1419
- .hjm-toast__content { min-inline-size: 0; flex: 1 1 auto; display: grid; gap: var(--hjm-space-xxs); overflow-wrap: anywhere; }
2313
+ .hjm-toast__icon { grid-column: 1; grid-row: 1; display: grid; place-items: center; inline-size: 1.25rem; block-size: 1.25rem; border-radius: 50%; color: var(--hjm-color-text-muted); background: transparent !important; font-weight: var(--hjm-font-weight-bold); }
2314
+ .hjm-toast__content { grid-column: 2; grid-row: 1; min-inline-size: 0; display: grid; gap: var(--hjm-space-xxs); overflow-wrap: anywhere; }
1420
2315
  .hjm-toast__action, .hjm-toast__close { min-block-size: var(--hjm-control-min-touch-target); border: 0; color: var(--hjm-color-content-brand); background: transparent; font: inherit; font-weight: var(--hjm-font-weight-bold); cursor: pointer; }
1421
- .hjm-toast__close { flex: 0 0 var(--hjm-control-min-touch-target); inline-size: var(--hjm-control-min-touch-target); color: var(--hjm-color-text-muted); }
2316
+ .hjm-toast__close { grid-column: 3; grid-row: 1; align-self: start; inline-size: var(--hjm-control-min-touch-target); color: var(--hjm-color-text-muted); }
2317
+ .hjm-toast__action { grid-column: 2 / -1; grid-row: 2; justify-self: start; max-inline-size: 100%; overflow-wrap: anywhere; text-align: start; }
1422
2318
  .hjm-toast[data-state="closing"] { opacity: 0; transform: translateY(var(--hjm-space-xs)); transition: opacity 160ms ease, transform 160ms ease; }
1423
2319
 
1424
2320
  .hjm-dialog__close:focus-visible,
@@ -1436,8 +2332,6 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1436
2332
  .hjm-upload-item__action:focus-visible,
1437
2333
  .hjm-date-picker__trigger:focus-visible,
1438
2334
  .hjm-date-picker__clear:focus-visible,
1439
- .hjm-date-picker__calendar-header button:focus-visible,
1440
- .hjm-date-picker__day:focus-visible,
1441
2335
  .hjm-table-scroll:focus-visible {
1442
2336
  outline: 2px solid var(--hjm-color-content-brand);
1443
2337
  outline-offset: 2px;
@@ -1480,6 +2374,149 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1480
2374
  @media (max-width: 30rem) {
1481
2375
  .hjm-tabs[data-orientation="vertical"] { grid-template-columns: minmax(0, 1fr); }
1482
2376
  .hjm-tabs[data-orientation="vertical"] .hjm-tabs__list { flex-direction: row; overflow-x: auto; border-inline-end: 0; border-block-end: 1px solid var(--hjm-color-border); }
1483
- .hjm-toast { align-items: flex-start; flex-wrap: wrap; }
1484
- .hjm-toast__content { flex-basis: calc(100% - 5rem); }
1485
2377
  }
2378
+
2379
+ /* TDS-inspired screen rhythm: shared Native recipes, content-driven height. See docs/screen-chrome.md. */
2380
+ /* Intrinsic action columns keep short labels readable at 320px; the title wraps
2381
+ in the remaining space instead of squeezing actions to equal-width tracks. */
2382
+ .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); }
2383
+ .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); }
2384
+ .hjm-top-bar__trailing { justify-content: flex-end; }
2385
+ .hjm-top-bar__title { min-inline-size: 0; text-align: center; overflow-wrap: anywhere; }
2386
+ .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); }
2387
+ .hjm-top-bar__heading > span { display: inline-flex; align-items: center; gap: var(--hjm-top-bar-gap); }
2388
+ .hjm-top-bar[data-centered="false"] { grid-template-columns: auto minmax(0, 1fr) auto; }
2389
+ .hjm-top-bar[data-centered="false"] .hjm-top-bar__title { text-align: start; }
2390
+ .hjm-top-bar[data-large-text="true"] { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); }
2391
+ .hjm-top-bar[data-large-text="true"] .hjm-top-bar__title { grid-column: 1 / -1; grid-row: 2; padding-block: var(--hjm-space-xs); text-align: start; }
2392
+ .hjm-top-bar[data-large-text="true"] .hjm-top-bar__trailing { grid-column: 2; grid-row: 1; }
2393
+ .hjm-bottom-cta { display: grid; gap: var(--hjm-bottom-cta-gap); min-block-size: var(--hjm-bottom-cta-min-height); padding: var(--hjm-bottom-cta-padding-top) var(--hjm-bottom-cta-padding-inline) max(var(--hjm-bottom-cta-padding-bottom), env(safe-area-inset-bottom, 0px), var(--hjm-bottom-cta-safe-area)); border-block-start: 1px solid var(--hjm-color-border); background: var(--hjm-color-surface); }
2394
+ .hjm-bottom-cta[data-position="sticky"] { position: sticky; inset-block-end: 0; z-index: 1; }
2395
+ .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; }
2396
+ .hjm-bottom-cta__actions { display: flex; flex-wrap: wrap; gap: var(--hjm-bottom-cta-gap); }
2397
+ .hjm-bottom-cta__actions > div { flex: 1 1 calc(var(--hjm-control-min-touch-target) * 3); min-inline-size: 0; }
2398
+ .hjm-bottom-cta__actions .hjm-button { inline-size: 100%; block-size: 100%; }
2399
+ .hjm-bottom-cta[data-large-text="true"] .hjm-bottom-cta__actions { flex-direction: column-reverse; }
2400
+ .hjm-bottom-cta[data-large-text="true"] .hjm-bottom-cta__actions > div { flex: initial; }
2401
+
2402
+ /* Controls remain outside the hidden track so keyboard users can reach every card. */
2403
+ .hjm-carousel { display: grid; gap: var(--hjm-space-sm); min-inline-size: 0; }
2404
+ .hjm-carousel__track, .hjm-carousel__slide { min-inline-size: 0; overflow-wrap: anywhere; }
2405
+ .hjm-carousel__slide[hidden] { display: none; }
2406
+ .hjm-carousel__slide input { max-inline-size: 100%; }
2407
+ .hjm-carousel__rotation { justify-self: start; }
2408
+ .hjm-carousel__controls, .hjm-carousel__dots { display: flex; align-items: center; justify-content: center; flex-wrap: wrap; gap: var(--hjm-space-xs); }
2409
+ .hjm-carousel__dot { display: grid; place-items: center; min-inline-size: var(--hjm-control-min-touch-target); min-block-size: var(--hjm-control-min-touch-target); border: 0; border-radius: var(--hjm-radius-full); background: transparent; cursor: pointer; }
2410
+ .hjm-carousel__dot > span { inline-size: var(--hjm-space-xs); block-size: var(--hjm-space-xs); border-radius: var(--hjm-radius-full); background: var(--hjm-color-border); }
2411
+ .hjm-carousel__dot[data-current="true"] > span { background: var(--hjm-color-content-brand); }
2412
+ .hjm-carousel__dot:focus-visible { outline: 2px solid var(--hjm-color-content-brand); outline-offset: 2px; }
2413
+ /* Keep previous/next paired when scaled text would wrap only one to a new row. */
2414
+ .hjm-carousel[data-large-text="true"] .hjm-carousel__controls { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); }
2415
+ .hjm-carousel[data-large-text="true"] .hjm-carousel__dots { grid-column: 1 / -1; grid-row: 1; }
2416
+ .hjm-carousel[data-large-text="true"] .hjm-carousel__controls > .hjm-button { grid-row: 2; }
2417
+
2418
+ /* The viewport action follows the content in DOM order. Its measured clearance
2419
+ belongs on the scroll content, not on the fixed button (docs/floating-action-button.md). */
2420
+ .hjm-fab { position: fixed; z-index: 500; inset-inline-end: max(var(--hjm-fab-margin), env(safe-area-inset-right, 0px)); inset-block-end: calc(var(--hjm-fab-margin) + max(var(--hjm-fab-safe-area), env(safe-area-inset-bottom, 0px))); max-inline-size: calc(100% - var(--hjm-fab-margin) * 2); min-block-size: var(--hjm-fab-diameter); }
2421
+ .hjm-fab__icon { display: flex; flex: 0 0 auto; align-items: center; justify-content: center; }
2422
+ .hjm-fab[data-direction="rtl"] { inset-inline-end: max(var(--hjm-fab-margin), env(safe-area-inset-left, 0px)); }
2423
+ .hjm-fab[data-mode="collapsed"] { inline-size: var(--hjm-fab-diameter); padding-inline: 0; gap: 0; }
2424
+ .hjm-fab[data-mode="collapsed"] .hjm-button__label { display: none; }
2425
+ .hjm-fab[data-mode="expanded"] .hjm-button__label { animation: hjm-fab-label-in var(--hjm-fab-duration) var(--hjm-fab-easing); }
2426
+ .hjm-fab[data-reduced-motion="true"] .hjm-button__label { animation: none; }
2427
+ @keyframes hjm-fab-label-in { from { opacity: 0; } to { opacity: 1; } }
2428
+
2429
+ /* Keep the seven-column spatial model and minimum targets; narrow hosts scroll
2430
+ the grid instead of shrinking dates or wrapping a week onto another row. */
2431
+ .hjm-calendar { display: grid; gap: var(--hjm-space-xs); min-inline-size: 0; }
2432
+ .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); }
2433
+ .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); }
2434
+ .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; }
2435
+ .hjm-calendar__viewport { overflow-x: auto; padding: var(--hjm-space-xxs); }
2436
+ .hjm-calendar__grid { min-inline-size: calc(7 * var(--hjm-calendar-cell-size)); }
2437
+ .hjm-calendar__week { display: grid; grid-template-columns: repeat(7, minmax(0, 1fr)); }
2438
+ .hjm-calendar__weekday { padding-block: var(--hjm-space-xs); text-align: center; color: var(--hjm-color-text-muted); font-size: var(--hjm-type-label-size); overflow-wrap: anywhere; }
2439
+ .hjm-calendar__day { display: grid; justify-items: center; align-content: start; gap: var(--hjm-space-xxs); min-inline-size: var(--hjm-calendar-cell-size); min-block-size: var(--hjm-calendar-cell-size); padding: 0; border: 0; border-radius: var(--hjm-radius-full); background: transparent; color: var(--hjm-color-text-body); font: inherit; font-variant-numeric: tabular-nums; cursor: pointer; }
2440
+ .hjm-calendar__day[data-today] .hjm-calendar__day-label { border-color: var(--hjm-color-focus); }
2441
+ .hjm-calendar__day[data-selected] .hjm-calendar__day-label { background: var(--hjm-color-primary); color: var(--hjm-color-on-primary); }
2442
+ .hjm-calendar__day[data-outside] { opacity: var(--hjm-calendar-outside-opacity); }
2443
+ .hjm-calendar__day[data-disabled] { opacity: var(--hjm-calendar-disabled-opacity); cursor: not-allowed; }
2444
+ .hjm-calendar__content { max-inline-size: 100%; min-block-size: var(--hjm-type-label-line-height); font-size: var(--hjm-type-label-size); line-height: var(--hjm-type-label-line-height); overflow-wrap: anywhere; }
2445
+ .hjm-calendar__header button:focus-visible, .hjm-calendar__day:focus-visible { outline: 2px solid var(--hjm-color-focus); outline-offset: 2px; }
2446
+ .hjm-date-picker__calendar-close { display: block; margin-inline-start: auto; inline-size: var(--hjm-control-min-touch-target); min-block-size: var(--hjm-control-min-touch-target); border: 0; border-radius: var(--hjm-radius-full); background: transparent; color: inherit; font: inherit; cursor: pointer; }
2447
+ .hjm-date-picker__calendar-close:focus-visible { outline: 2px solid var(--hjm-color-focus); outline-offset: 2px; }
2448
+
2449
+ /* Reserve a common annotation row; dates with a dot must not sit above their neighbours. */
2450
+ .hjm-calendar__day-label { display: grid; place-items: center; inline-size: var(--hjm-calendar-cell-size); min-block-size: var(--hjm-calendar-cell-size); border: 1px solid transparent; border-radius: var(--hjm-radius-full); }
2451
+
2452
+ .hjm-calendar__day-label { font-size: var(--hjm-type-body-size); line-height: var(--hjm-type-body-line-height); }
2453
+ .hjm-calendar[data-size="large"] .hjm-calendar__day-label { font-size: var(--hjm-type-body-large-size); line-height: var(--hjm-type-body-large-line-height); }
2454
+
2455
+ .hjm-breadcrumb, .hjm-pagination { min-inline-size: 0; }
2456
+ .hjm-breadcrumb__item { max-inline-size: 100%; }
2457
+ .hjm-breadcrumb__separator { flex-shrink: 0; }
2458
+
2459
+ .hjm-anchor { min-inline-size: 0; }
2460
+ .hjm-anchor__list { display: flex; flex-direction: column; gap: var(--hjm-space-xxs); list-style: none; margin: 0; padding: 0; }
2461
+ .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; }
2462
+ .hjm-anchor__link:hover { text-decoration: underline; text-underline-offset: 0.18em; }
2463
+ .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); }
2464
+ .hjm-anchor__link:focus-visible { outline: 2px solid var(--hjm-color-focus); outline-offset: 2px; }
2465
+ .hjm-anchor[data-orientation="horizontal"] .hjm-anchor__list { flex-direction: row; flex-wrap: wrap; }
2466
+ .hjm-anchor[data-orientation="horizontal"] .hjm-anchor__link { border-inline-start: 0; border-block-end: 2px solid transparent; }
2467
+ .hjm-anchor[data-orientation="horizontal"] .hjm-anchor__link[aria-current="location"] { border-block-end-color: var(--hjm-color-focus); }
2468
+
2469
+ /* A contextual form uses the shared floating surface and body typography. Logical
2470
+ sizing preserves long translations and lets the positioning hook cap the viewport. */
2471
+ .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); }
2472
+ .hjm-popover[data-state="closed"] { pointer-events: none; animation-name: hjm-popover-out; }
2473
+ .hjm-popover__header { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: var(--hjm-space-xs); }
2474
+ .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; }
2475
+ .hjm-popover__description { margin-block: var(--hjm-space-xs) var(--hjm-space-md); color: var(--hjm-color-text-muted); overflow-wrap: anywhere; }
2476
+ .hjm-popover__body { min-inline-size: 0; padding-block-start: var(--hjm-space-xs); overflow-wrap: anywhere; }
2477
+ .hjm-popover:focus-visible { outline: 2px solid var(--hjm-color-focus); outline-offset: 2px; }
2478
+ @keyframes hjm-popover-in { from { opacity: 0; } to { opacity: 1; } }
2479
+ @keyframes hjm-popover-out { from { opacity: 1; } to { opacity: 0; } }
2480
+
2481
+ /* Disclosure, context menu, menubar --------------------------------------- */
2482
+ .hjm-collapsible { display: grid; gap: var(--hjm-collapsible-gap); min-inline-size: 0; }
2483
+ .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; }
2484
+ .hjm-collapsible__trigger:disabled { opacity: 0.5; cursor: not-allowed; }
2485
+ .hjm-collapsible__trigger:focus-visible { outline: 2px solid var(--hjm-color-focus); outline-offset: 2px; }
2486
+ /* The marker is decoration: aria-expanded carries the state, so it only needs
2487
+ to keep one box while the glyph changes. */
2488
+ .hjm-collapsible__marker { flex: 0 0 auto; inline-size: 1em; color: var(--hjm-color-text-muted); text-align: center; }
2489
+ .hjm-collapsible__content { min-inline-size: 0; overflow-wrap: anywhere; }
2490
+
2491
+ /* Both surfaces reuse the menu's floating look; only the anchor differs. */
2492
+ .hjm-context-menu-host { min-inline-size: 0; }
2493
+ .hjm-context-menu-host:focus-visible { outline: 2px solid var(--hjm-color-focus); outline-offset: 2px; }
2494
+ .hjm-context-menu { position: fixed; max-inline-size: min(24rem, 90vw); max-block-size: calc(100dvh - (2 * var(--hjm-space-md))); overflow: auto; padding: var(--hjm-space-xxs); border: 1px solid var(--hjm-color-border); border-radius: var(--hjm-radius-md); background: var(--hjm-color-surface); box-shadow: 0 8px 24px rgb(0 0 0 / 18%); }
2495
+ .hjm-context-menu__item { min-block-size: var(--hjm-control-min-touch-target); display: flex; align-items: center; justify-content: space-between; gap: var(--hjm-space-sm); padding: var(--hjm-space-xs) var(--hjm-space-sm); border-radius: var(--hjm-radius-sm); color: var(--hjm-color-text-body); cursor: pointer; }
2496
+ .hjm-context-menu__item[data-active] { background: var(--hjm-color-surface-alt); }
2497
+ .hjm-context-menu__item[data-tone="danger"] { color: var(--hjm-color-danger); }
2498
+ .hjm-context-menu__item[aria-disabled="true"] { opacity: 0.5; cursor: not-allowed; }
2499
+ .hjm-context-menu__shortcut { color: var(--hjm-color-text-muted); font-size: var(--hjm-type-label-size); }
2500
+
2501
+ .hjm-menubar { display: flex; flex-wrap: wrap; align-items: center; gap: var(--hjm-menubar-gap); min-block-size: var(--hjm-menubar-min-height); padding-inline: var(--hjm-menubar-padding); }
2502
+ .hjm-menubar__menu { position: relative; }
2503
+ .hjm-menubar__label { min-block-size: var(--hjm-control-min-touch-target); padding-inline: var(--hjm-menubar-label-padding); border: 0; border-radius: var(--hjm-menubar-label-radius); background: transparent; color: var(--hjm-color-text-body); font: inherit; cursor: pointer; }
2504
+ .hjm-menubar__label[data-open] { background: var(--hjm-color-surface-accent); }
2505
+ .hjm-menubar__label:disabled { opacity: 0.5; cursor: not-allowed; }
2506
+ .hjm-menubar__label:focus-visible { outline: 2px solid var(--hjm-color-focus); outline-offset: 2px; }
2507
+ .hjm-menubar__panel { position: absolute; inset-block-start: 100%; inset-inline-start: 0; z-index: 900; min-inline-size: 13.75rem; max-inline-size: min(24rem, 90vw); padding: var(--hjm-space-xxs); border: 1px solid var(--hjm-color-border); border-radius: var(--hjm-radius-md); background: var(--hjm-color-surface); box-shadow: 0 8px 24px rgb(0 0 0 / 18%); }
2508
+ .hjm-menubar__item { min-block-size: var(--hjm-control-min-touch-target); display: flex; align-items: center; justify-content: space-between; gap: var(--hjm-space-sm); padding: var(--hjm-space-xs) var(--hjm-space-sm); border-radius: var(--hjm-radius-sm); color: var(--hjm-color-text-body); cursor: pointer; }
2509
+ .hjm-menubar__item[data-active] { background: var(--hjm-color-surface-alt); }
2510
+ .hjm-menubar__item[data-tone="danger"] { color: var(--hjm-color-danger); }
2511
+ .hjm-menubar__item[aria-disabled="true"] { opacity: 0.5; cursor: not-allowed; }
2512
+ .hjm-menubar__shortcut { color: var(--hjm-color-text-muted); font-size: var(--hjm-type-label-size); }
2513
+
2514
+ /* Asset frame ------------------------------------------------------------ */
2515
+ .hjm-asset { position: relative; display: inline-flex; flex: 0 0 auto; }
2516
+ .hjm-asset__frame { inline-size: var(--hjm-asset-size); block-size: var(--hjm-asset-size); display: grid; place-items: center; overflow: hidden; border: var(--hjm-stroke-default) solid var(--hjm-color-border); border-radius: var(--hjm-asset-radius); background: var(--hjm-color-surface-alt); }
2517
+ .hjm-asset__media { inline-size: 100%; block-size: 100%; display: grid; place-items: center; }
2518
+ .hjm-asset__media > * { max-inline-size: 100%; max-block-size: 100%; }
2519
+ /* The accessory hangs off the outer corner so it never covers the frame's middle. */
2520
+ .hjm-asset__accessory { position: absolute; inset-block-end: var(--hjm-asset-accessory-offset); inset-inline-end: var(--hjm-asset-accessory-offset); transform: translate(25%, 25%); display: inline-flex; }
2521
+ .hjm-asset-group { display: inline-flex; align-items: center; }
2522
+ .hjm-asset-group > .hjm-asset + .hjm-asset { margin-inline-start: var(--hjm-asset-overlap); }