@helixui/library 3.2.0-next.98 → 3.3.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 (146) hide show
  1. package/custom-elements.json +30 -18
  2. package/dist/components/hx-alert/hx-alert.styles.d.ts.map +1 -1
  3. package/dist/components/hx-alert/index.js +1 -1
  4. package/dist/components/hx-banner/hx-banner.styles.d.ts.map +1 -1
  5. package/dist/components/hx-banner/index.js +1 -1
  6. package/dist/components/hx-button/hx-button.d.ts +8 -6
  7. package/dist/components/hx-button/hx-button.d.ts.map +1 -1
  8. package/dist/components/hx-button/hx-button.styles.d.ts.map +1 -1
  9. package/dist/components/hx-button/index.js +1 -1
  10. package/dist/components/hx-checkbox/hx-checkbox.styles.d.ts.map +1 -1
  11. package/dist/components/hx-checkbox/index.js +1 -1
  12. package/dist/components/hx-code-snippet/hx-code-snippet.styles.d.ts.map +1 -1
  13. package/dist/components/hx-code-snippet/index.js +1 -1
  14. package/dist/components/hx-combobox/hx-combobox.styles.d.ts.map +1 -1
  15. package/dist/components/hx-combobox/index.js +1 -1
  16. package/dist/components/hx-date-picker/hx-date-picker.styles.d.ts.map +1 -1
  17. package/dist/components/hx-date-picker/index.js +1 -1
  18. package/dist/components/hx-link/hx-link.styles.d.ts.map +1 -1
  19. package/dist/components/hx-link/index.js +1 -1
  20. package/dist/components/hx-list/hx-list-item.styles.d.ts.map +1 -1
  21. package/dist/components/hx-list/index.js +1 -1
  22. package/dist/components/hx-radio-group/hx-radio.styles.d.ts.map +1 -1
  23. package/dist/components/hx-radio-group/index.js +1 -1
  24. package/dist/components/hx-rating/hx-rating.styles.d.ts.map +1 -1
  25. package/dist/components/hx-rating/index.js +1 -1
  26. package/dist/components/hx-select/hx-select.styles.d.ts.map +1 -1
  27. package/dist/components/hx-select/index.js +1 -1
  28. package/dist/components/hx-side-nav/hx-side-nav.d.ts +4 -3
  29. package/dist/components/hx-side-nav/hx-side-nav.d.ts.map +1 -1
  30. package/dist/components/hx-side-nav/hx-side-nav.styles.d.ts.map +1 -1
  31. package/dist/components/hx-side-nav/index.js +1 -1
  32. package/dist/components/hx-slider/hx-slider.styles.d.ts.map +1 -1
  33. package/dist/components/hx-slider/index.js +1 -1
  34. package/dist/components/hx-split-button/hx-split-button.styles.d.ts.map +1 -1
  35. package/dist/components/hx-split-button/index.js +1 -1
  36. package/dist/components/hx-switch/hx-switch.styles.d.ts.map +1 -1
  37. package/dist/components/hx-switch/index.js +1 -1
  38. package/dist/components/hx-tabs/hx-tab-panel.styles.d.ts.map +1 -1
  39. package/dist/components/hx-tabs/hx-tab.styles.d.ts.map +1 -1
  40. package/dist/components/hx-tabs/index.js +1 -1
  41. package/dist/components/hx-text-input/hx-text-input.styles.d.ts.map +1 -1
  42. package/dist/components/hx-text-input/index.js +1 -1
  43. package/dist/components/hx-textarea/hx-textarea.styles.d.ts.map +1 -1
  44. package/dist/components/hx-textarea/index.js +1 -1
  45. package/dist/components/hx-theme/hx-theme.d.ts +14 -2
  46. package/dist/components/hx-theme/hx-theme.d.ts.map +1 -1
  47. package/dist/components/hx-theme/index.js +1 -1
  48. package/dist/components/hx-toggle-button/hx-toggle-button.styles.d.ts.map +1 -1
  49. package/dist/components/hx-toggle-button/index.js +1 -1
  50. package/dist/components/hx-tree-view/hx-tree-view.styles.d.ts.map +1 -1
  51. package/dist/components/hx-tree-view/index.js +1 -1
  52. package/dist/css/helix-all.css +122 -120
  53. package/dist/css/helix-core.css +53 -23
  54. package/dist/css/helix-data.css +20 -6
  55. package/dist/css/helix-feedback.css +3 -12
  56. package/dist/css/helix-forms.css +16 -63
  57. package/dist/css/helix-navigation.css +28 -8
  58. package/dist/css/helix-tokens.css +8 -8
  59. package/dist/css/helix-utility.css +2 -8
  60. package/dist/css/hx-alert.css +1 -4
  61. package/dist/css/hx-banner.css +2 -8
  62. package/dist/css/hx-button.css +52 -19
  63. package/dist/css/hx-checkbox.css +1 -4
  64. package/dist/css/hx-code-snippet.css +20 -6
  65. package/dist/css/hx-combobox.css +2 -8
  66. package/dist/css/hx-date-picker.css +5 -21
  67. package/dist/css/hx-link.css +1 -4
  68. package/dist/css/hx-rating.css +1 -2
  69. package/dist/css/hx-select.css +1 -4
  70. package/dist/css/hx-side-nav.css +27 -6
  71. package/dist/css/hx-slider.css +1 -4
  72. package/dist/css/hx-split-button.css +2 -8
  73. package/dist/css/hx-switch.css +1 -4
  74. package/dist/css/hx-text-input.css +2 -8
  75. package/dist/css/hx-textarea.css +1 -4
  76. package/dist/css/hx-toggle-button.css +1 -4
  77. package/dist/css/hx-tree-view.css +1 -2
  78. package/dist/css/index.css +1 -1
  79. package/dist/css/manifest.json +20 -18
  80. package/dist/index.js +22 -22
  81. package/dist/shared/{hx-alert-C597yHpD.js → hx-alert-CLn7CstP.js} +2 -5
  82. package/dist/shared/hx-alert-CLn7CstP.js.map +1 -0
  83. package/dist/shared/{hx-banner-Cxd7eFUP.js → hx-banner-D3DzpfcP.js} +7 -13
  84. package/dist/shared/hx-banner-D3DzpfcP.js.map +1 -0
  85. package/dist/shared/{hx-button-9OUjJnk7.js → hx-button-DPY6SPVT.js} +58 -25
  86. package/dist/shared/hx-button-DPY6SPVT.js.map +1 -0
  87. package/dist/shared/{hx-checkbox-DBD-gMoz.js → hx-checkbox-D7xma9YH.js} +6 -9
  88. package/dist/shared/hx-checkbox-D7xma9YH.js.map +1 -0
  89. package/dist/shared/{hx-code-snippet-CJrFeyz0.js → hx-code-snippet-fVV3Z2DZ.js} +55 -41
  90. package/dist/shared/hx-code-snippet-fVV3Z2DZ.js.map +1 -0
  91. package/dist/shared/{hx-combobox-ClhNRAS5.js → hx-combobox-DDzqNKEW.js} +6 -12
  92. package/dist/shared/hx-combobox-DDzqNKEW.js.map +1 -0
  93. package/dist/shared/{hx-date-picker-BJm7Yrda.js → hx-date-picker-2iRG1p74.js} +12 -28
  94. package/dist/shared/hx-date-picker-2iRG1p74.js.map +1 -0
  95. package/dist/shared/{hx-link-9Ig2DW6L.js → hx-link-C-O6vq0Q.js} +2 -5
  96. package/dist/shared/hx-link-C-O6vq0Q.js.map +1 -0
  97. package/dist/shared/{hx-list-CkphGi9T.js → hx-list-MyEhh8c7.js} +3 -5
  98. package/dist/shared/hx-list-MyEhh8c7.js.map +1 -0
  99. package/dist/shared/{hx-nav-item-DH2tXcj1.js → hx-nav-item-xqRPOCWX.js} +58 -37
  100. package/dist/shared/hx-nav-item-xqRPOCWX.js.map +1 -0
  101. package/dist/shared/{hx-radio-dFjUAost.js → hx-radio-CJvNU2yP.js} +2 -5
  102. package/dist/shared/{hx-radio-dFjUAost.js.map → hx-radio-CJvNU2yP.js.map} +1 -1
  103. package/dist/shared/{hx-rating-CGtsejNf.js → hx-rating-C3QP53k9.js} +2 -3
  104. package/dist/shared/hx-rating-C3QP53k9.js.map +1 -0
  105. package/dist/shared/{hx-select-Bf4usFts.js → hx-select-C8fEHQhC.js} +2 -5
  106. package/dist/shared/hx-select-C8fEHQhC.js.map +1 -0
  107. package/dist/shared/{hx-slider-m0aEClH1.js → hx-slider-Blmv_rwS.js} +23 -26
  108. package/dist/shared/hx-slider-Blmv_rwS.js.map +1 -0
  109. package/dist/shared/{hx-split-button-BxDFfx4D.js → hx-split-button-Djnc5Aeg.js} +3 -9
  110. package/dist/shared/hx-split-button-Djnc5Aeg.js.map +1 -0
  111. package/dist/shared/{hx-switch-DvAW4YY-.js → hx-switch-BrZFaRue.js} +6 -9
  112. package/dist/shared/hx-switch-BrZFaRue.js.map +1 -0
  113. package/dist/shared/{hx-tab-panel-SWOEHuJc.js → hx-tab-panel-DspCrKqo.js} +3 -9
  114. package/dist/shared/{hx-tab-panel-SWOEHuJc.js.map → hx-tab-panel-DspCrKqo.js.map} +1 -1
  115. package/dist/shared/{hx-text-input-Bn7Gn8CI.js → hx-text-input-D6FlOZM-.js} +3 -9
  116. package/dist/shared/hx-text-input-D6FlOZM-.js.map +1 -0
  117. package/dist/shared/{hx-textarea-Jx1xnhgv.js → hx-textarea-CNG590KY.js} +6 -9
  118. package/dist/shared/hx-textarea-CNG590KY.js.map +1 -0
  119. package/dist/shared/{hx-theme-BiyQ7UUK.js → hx-theme-BsefFWTO.js} +83 -113
  120. package/dist/shared/hx-theme-BsefFWTO.js.map +1 -0
  121. package/dist/shared/{hx-toggle-button-DPAIh_Xo.js → hx-toggle-button-iLiYrMbD.js} +2 -5
  122. package/dist/shared/hx-toggle-button-iLiYrMbD.js.map +1 -0
  123. package/dist/shared/{hx-tree-item-Dt0Ozqyr.js → hx-tree-item-C2CiWuDE.js} +2 -3
  124. package/dist/shared/hx-tree-item-C2CiWuDE.js.map +1 -0
  125. package/figma-inventory.json +34 -19
  126. package/package.json +2 -2
  127. package/dist/shared/hx-alert-C597yHpD.js.map +0 -1
  128. package/dist/shared/hx-banner-Cxd7eFUP.js.map +0 -1
  129. package/dist/shared/hx-button-9OUjJnk7.js.map +0 -1
  130. package/dist/shared/hx-checkbox-DBD-gMoz.js.map +0 -1
  131. package/dist/shared/hx-code-snippet-CJrFeyz0.js.map +0 -1
  132. package/dist/shared/hx-combobox-ClhNRAS5.js.map +0 -1
  133. package/dist/shared/hx-date-picker-BJm7Yrda.js.map +0 -1
  134. package/dist/shared/hx-link-9Ig2DW6L.js.map +0 -1
  135. package/dist/shared/hx-list-CkphGi9T.js.map +0 -1
  136. package/dist/shared/hx-nav-item-DH2tXcj1.js.map +0 -1
  137. package/dist/shared/hx-rating-CGtsejNf.js.map +0 -1
  138. package/dist/shared/hx-select-Bf4usFts.js.map +0 -1
  139. package/dist/shared/hx-slider-m0aEClH1.js.map +0 -1
  140. package/dist/shared/hx-split-button-BxDFfx4D.js.map +0 -1
  141. package/dist/shared/hx-switch-DvAW4YY-.js.map +0 -1
  142. package/dist/shared/hx-text-input-Bn7Gn8CI.js.map +0 -1
  143. package/dist/shared/hx-textarea-Jx1xnhgv.js.map +0 -1
  144. package/dist/shared/hx-theme-BiyQ7UUK.js.map +0 -1
  145. package/dist/shared/hx-toggle-button-DPAIh_Xo.js.map +0 -1
  146. package/dist/shared/hx-tree-item-Dt0Ozqyr.js.map +0 -1
@@ -80,7 +80,8 @@
80
80
  min-width: var(--hx-touch-target-min, 2.75rem);
81
81
  min-height: var(--hx-touch-target-min, 2.75rem);
82
82
  padding: var(--hx-space-1, 0.25rem) var(--hx-space-2, 0.5rem);
83
- border: var(--hx-border-width-thin, 1px) solid var(--hx-color-border-strong, #66787b);
83
+ border: var(--hx-border-width-thin, 1px) solid
84
+ var(--hx-color-border-on-dark-strong, rgba(255, 255, 255, 0.7));
84
85
  border-radius: var(--hx-border-radius-sm, 0.25rem);
85
86
  /* Copy button sits on the always-dark block snippet surface; uses inverse family for contrast on the terminal background. */
86
87
  background-color: var(--hx-color-surface-inverse, #0d1825);
@@ -105,8 +106,14 @@
105
106
  }
106
107
 
107
108
  .code-snippet__copy-button:focus-visible {
108
- outline: var(--hx-focus-ring-width, 2px) solid
109
- var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078));
109
+ /* Always-dark terminal surface — uses primary-400 (#6AB1B1, 7.27:1 on #0d1825)
110
+ instead of the light-mode --hx-focus-ring-color (primary-600, 3.07:1 — razor
111
+ above the 3:1 UI floor with no headroom). Deliberate primitive-tier consumption:
112
+ there is no semantic focus-ring-on-dark alias today — the dark.color.focus-ring
113
+ override at tokens.json only fires under theme=dark, but this surface is dark in
114
+ every theme. Tracked for promotion to a semantic alias in a future token-cascade
115
+ follow-up. */
116
+ outline: var(--hx-focus-ring-width, 2px) solid var(--hx-color-primary-400, #6ab1b1);
110
117
  outline-offset: var(--hx-focus-ring-offset, 2px);
111
118
  }
112
119
 
@@ -125,7 +132,8 @@
125
132
  min-height: var(--hx-touch-target-min, 2.75rem);
126
133
  padding: var(--hx-space-2, 0.5rem) var(--hx-space-4, 1rem);
127
134
  border: none;
128
- border-top: var(--hx-border-width-thin, 1px) solid var(--hx-color-border-strong, #66787b);
135
+ border-top: var(--hx-border-width-thin, 1px) solid
136
+ var(--hx-color-border-on-dark-strong, rgba(255, 255, 255, 0.7));
129
137
  /* Expand button is attached to the always-dark block snippet — inverse family maintains the terminal aesthetic. */
130
138
  background-color: var(--hx-color-surface-inverse, #0d1825);
131
139
  color: var(--hx-color-text-inverse, #ffffff);
@@ -146,8 +154,14 @@
146
154
  }
147
155
 
148
156
  .code-snippet__expand-button:focus-visible {
149
- outline: var(--hx-focus-ring-width, 2px) solid
150
- var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078));
157
+ /* Always-dark terminal surface — uses primary-400 (#6AB1B1, 7.27:1 on #0d1825)
158
+ instead of the light-mode --hx-focus-ring-color (primary-600, 3.07:1 — razor
159
+ above the 3:1 UI floor with no headroom). Deliberate primitive-tier consumption:
160
+ there is no semantic focus-ring-on-dark alias today — the dark.color.focus-ring
161
+ override at tokens.json only fires under theme=dark, but this surface is dark in
162
+ every theme. Tracked for promotion to a semantic alias in a future token-cascade
163
+ follow-up. */
164
+ outline: var(--hx-focus-ring-width, 2px) solid var(--hx-color-primary-400, #6ab1b1);
151
165
  outline-offset: var(--hx-focus-ring-offset, 2px);
152
166
  }
153
167
 
@@ -160,10 +160,7 @@
160
160
 
161
161
  .alert__close-button:focus-visible {
162
162
  outline: var(--hx-focus-ring-width, 2px) solid
163
- var(
164
- --hx-alert-close-btn-focus-ring-color,
165
- var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078))
166
- );
163
+ var(--hx-alert-close-btn-focus-ring-color, var(--hx-focus-ring-color, #0f7078));
167
164
  outline-offset: var(--hx-focus-ring-offset, 2px);
168
165
  opacity: 1;
169
166
  }
@@ -336,10 +333,7 @@
336
333
 
337
334
  .banner__action:focus-visible {
338
335
  outline: var(--hx-focus-ring-width, 2px) solid
339
- var(
340
- --hx-banner-action-focus-ring-color,
341
- var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078))
342
- );
336
+ var(--hx-banner-action-focus-ring-color, var(--hx-focus-ring-color, #0f7078));
343
337
  outline-offset: var(--hx-focus-ring-offset, 2px);
344
338
  border-radius: var(--hx-border-radius-sm, 0.25rem);
345
339
  }
@@ -380,10 +374,7 @@
380
374
 
381
375
  .banner__close-button:focus-visible {
382
376
  outline: var(--hx-focus-ring-width, 2px) solid
383
- var(
384
- --hx-banner-close-btn-focus-ring-color,
385
- var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078))
386
- );
377
+ var(--hx-banner-close-btn-focus-ring-color, var(--hx-focus-ring-color, #0f7078));
387
378
  outline-offset: var(--hx-focus-ring-offset, 2px);
388
379
  opacity: 1;
389
380
  }
@@ -74,10 +74,7 @@
74
74
 
75
75
  .checkbox__input:focus-visible ~ .checkbox__box {
76
76
  outline: var(--hx-checkbox-focus-ring-width, var(--hx-focus-ring-width, 2px)) solid
77
- var(
78
- --hx-checkbox-focus-ring-color,
79
- var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078))
80
- );
77
+ var(--hx-checkbox-focus-ring-color, var(--hx-focus-ring-color, #0f7078));
81
78
  outline-offset: var(--hx-checkbox-focus-ring-offset, var(--hx-focus-ring-offset, 2px));
82
79
  }
83
80
 
@@ -722,17 +719,11 @@
722
719
  box-shadow var(--hx-transition-fast, 150ms ease);
723
720
  }
724
721
  .field__input-wrapper:focus-within {
725
- border-color: var(
726
- --hx-combobox-focus-ring-color,
727
- var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078))
728
- );
722
+ border-color: var(--hx-combobox-focus-ring-color, var(--hx-focus-ring-color, #0f7078));
729
723
  box-shadow: 0 0 0 var(--hx-focus-ring-width, 2px)
730
724
  color-mix(
731
725
  in srgb,
732
- var(
733
- --hx-combobox-focus-ring-color,
734
- var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078))
735
- )
726
+ var(--hx-combobox-focus-ring-color, var(--hx-focus-ring-color, #0f7078))
736
727
  calc(var(--hx-focus-ring-opacity, 0.25) * 100%),
737
728
  transparent
738
729
  );
@@ -1138,17 +1129,11 @@
1138
1129
  }
1139
1130
 
1140
1131
  .field__input-wrapper:focus-within {
1141
- border-color: var(
1142
- --hx-date-picker-focus-ring-color,
1143
- var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078))
1144
- );
1132
+ border-color: var(--hx-date-picker-focus-ring-color, var(--hx-focus-ring-color, #0f7078));
1145
1133
  box-shadow: 0 0 0 var(--hx-focus-ring-width, 2px)
1146
1134
  color-mix(
1147
1135
  in srgb,
1148
- var(
1149
- --hx-date-picker-focus-ring-color,
1150
- var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078))
1151
- )
1136
+ var(--hx-date-picker-focus-ring-color, var(--hx-focus-ring-color, #0f7078))
1152
1137
  calc(var(--hx-focus-ring-opacity, 0.25) * 100%),
1153
1138
  transparent
1154
1139
  );
@@ -1217,17 +1202,10 @@
1217
1202
  }
1218
1203
 
1219
1204
  .field__trigger:focus-visible {
1220
- color: var(
1221
- --hx-date-picker-focus-ring-color,
1222
- var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078))
1223
- );
1205
+ color: var(--hx-date-picker-focus-ring-color, var(--hx-focus-ring-color, #0f7078));
1224
1206
  background-color: color-mix(
1225
1207
  in srgb,
1226
- var(
1227
- --hx-date-picker-focus-ring-color,
1228
- var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078))
1229
- )
1230
- 8%,
1208
+ var(--hx-date-picker-focus-ring-color, var(--hx-focus-ring-color, #0f7078)) 8%,
1231
1209
  transparent
1232
1210
  );
1233
1211
  }
@@ -1324,10 +1302,7 @@
1324
1302
 
1325
1303
  :is(.calendar__nav-btn, .calendar__day):focus-visible {
1326
1304
  box-shadow: 0 0 0 var(--hx-focus-ring-width, 2px)
1327
- var(
1328
- --hx-date-picker-focus-ring-color,
1329
- var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078))
1330
- );
1305
+ var(--hx-date-picker-focus-ring-color, var(--hx-focus-ring-color, #0f7078));
1331
1306
  z-index: 1;
1332
1307
  }
1333
1308
 
@@ -2543,8 +2518,7 @@
2543
2518
  }
2544
2519
 
2545
2520
  .symbol:focus-visible {
2546
- outline: var(--hx-focus-ring-width, 2px) solid
2547
- var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078));
2521
+ outline: var(--hx-focus-ring-width, 2px) solid var(--hx-focus-ring-color, #0f7078);
2548
2522
  outline-offset: var(--hx-focus-ring-offset, 2px);
2549
2523
  border-radius: var(--hx-border-radius-sm, 0.25rem);
2550
2524
  }
@@ -2658,10 +2632,7 @@
2658
2632
  --_border-radius: var(--hx-select-border-radius, var(--hx-border-radius-md, 0.375rem));
2659
2633
 
2660
2634
  /* Focus ring */
2661
- --_focus-ring-color: var(
2662
- --hx-select-focus-ring-color,
2663
- var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078))
2664
- );
2635
+ --_focus-ring-color: var(--hx-select-focus-ring-color, var(--hx-focus-ring-color, #0f7078));
2665
2636
 
2666
2637
  /* Error */
2667
2638
  --_error-color: var(--hx-select-error-color, var(--hx-color-error-500, #e5493e));
@@ -3215,10 +3186,7 @@
3215
3186
  .slider__input:focus-visible ~ .slider__thumb-visual {
3216
3187
  box-shadow:
3217
3188
  0 0 0 var(--hx-focus-ring-width, 2px)
3218
- var(
3219
- --hx-slider-focus-ring-color,
3220
- var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078))
3221
- ),
3189
+ var(--hx-slider-focus-ring-color, var(--hx-focus-ring-color, #0f7078)),
3222
3190
  var(--hx-slider-thumb-shadow, var(--hx-shadow-sm, 0 1px 2px 0 rgb(0 0 0 / 0.05)));
3223
3191
  }
3224
3192
 
@@ -3362,10 +3330,7 @@
3362
3330
 
3363
3331
  .switch__track:focus-visible {
3364
3332
  outline: var(--hx-focus-ring-width, 2px) solid
3365
- var(
3366
- --hx-switch-focus-ring-color,
3367
- var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078))
3368
- );
3333
+ var(--hx-switch-focus-ring-color, var(--hx-focus-ring-color, #0f7078));
3369
3334
  outline-offset: var(--hx-focus-ring-offset, 2px);
3370
3335
  }
3371
3336
 
@@ -3579,10 +3544,7 @@
3579
3544
  );
3580
3545
  --_text-input-border-color-focus: var(
3581
3546
  --hx-text-input-border-color-focus,
3582
- var(
3583
- --hx-input-focus-ring-color,
3584
- var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078))
3585
- )
3547
+ var(--hx-input-focus-ring-color, var(--hx-focus-ring-color, #0f7078))
3586
3548
  );
3587
3549
  --_text-input-border-color-invalid: var(
3588
3550
  --hx-text-input-border-color-invalid,
@@ -3608,10 +3570,7 @@
3608
3570
  /* Focus ring */
3609
3571
  --_text-input-focus-ring-color: var(
3610
3572
  --hx-text-input-focus-ring-color,
3611
- var(
3612
- --hx-input-focus-ring-color,
3613
- var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078))
3614
- )
3573
+ var(--hx-input-focus-ring-color, var(--hx-focus-ring-color, #0f7078))
3615
3574
  );
3616
3575
  --_text-input-focus-ring-width: var(
3617
3576
  --hx-text-input-focus-ring-width,
@@ -3921,10 +3880,7 @@
3921
3880
  );
3922
3881
  --_textarea-border-color-focus: var(
3923
3882
  --hx-textarea-border-color-focus,
3924
- var(
3925
- --hx-input-focus-ring-color,
3926
- var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078))
3927
- )
3883
+ var(--hx-input-focus-ring-color, var(--hx-focus-ring-color, #0f7078))
3928
3884
  );
3929
3885
  --_textarea-border-color-invalid: var(
3930
3886
  --hx-textarea-border-color-invalid,
@@ -4446,10 +4402,7 @@
4446
4402
 
4447
4403
  .button:focus-visible {
4448
4404
  outline: var(--hx-focus-ring-width, 2px) solid
4449
- var(
4450
- --hx-toggle-button-focus-ring-color,
4451
- var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078))
4452
- );
4405
+ var(--hx-toggle-button-focus-ring-color, var(--hx-focus-ring-color, #0f7078));
4453
4406
  outline-offset: var(--hx-focus-ring-offset, 2px);
4454
4407
  }
4455
4408
 
@@ -740,7 +740,10 @@
740
740
  transition: width var(--hx-transition-normal, 300ms) ease;
741
741
  overflow: hidden;
742
742
  border-inline-end: var(--hx-border-width-thin, 1px) solid
743
- var(--hx-side-nav-border-color, var(--hx-color-border-strong, #66787b));
743
+ var(
744
+ --hx-side-nav-border-color,
745
+ var(--hx-color-border-on-dark-strong, rgba(255, 255, 255, 0.7))
746
+ );
744
747
  }
745
748
 
746
749
  /* ─── Collapsed State ─── */
@@ -758,7 +761,10 @@
758
761
  flex-shrink: 0;
759
762
  min-height: var(--hx-space-14, 3.5rem);
760
763
  border-bottom: var(--hx-border-width-thin, 1px) solid
761
- var(--hx-side-nav-border-color, var(--hx-color-border-strong, #66787b));
764
+ var(
765
+ --hx-side-nav-border-color,
766
+ var(--hx-color-border-on-dark-strong, rgba(255, 255, 255, 0.7))
767
+ );
762
768
  overflow: hidden;
763
769
  }
764
770
 
@@ -785,7 +791,10 @@
785
791
  flex-shrink: 0;
786
792
  min-height: var(--hx-space-14, 3.5rem);
787
793
  border-top: var(--hx-border-width-thin, 1px) solid
788
- var(--hx-side-nav-border-color, var(--hx-color-border-strong, #66787b));
794
+ var(
795
+ --hx-side-nav-border-color,
796
+ var(--hx-color-border-on-dark-strong, rgba(255, 255, 255, 0.7))
797
+ );
789
798
  overflow: hidden;
790
799
  }
791
800
 
@@ -816,16 +825,28 @@
816
825
  }
817
826
 
818
827
  .side-nav__toggle:hover {
828
+ /* Read both deprecated --hx-color-border-on-dark-subtle (3.2.0/3.2.1 API)
829
+ and canonical --hx-color-surface-on-dark-overlay-subtle so consumer
830
+ overrides on either name reach paint. Deprecated removal: 4.0.0.
831
+ Hex fallback for browsers without color-mix(). */
819
832
  background-color: var(
820
833
  --hx-color-border-on-dark-subtle,
821
- rgba(255, 255, 255, 0.1)
822
- ); /* fallback for browsers without color-mix() */
834
+ var(--hx-color-surface-on-dark-overlay-subtle, rgba(255, 255, 255, 0.1))
835
+ );
823
836
  color: var(--hx-side-nav-toggle-hover-color, var(--hx-color-text-inverse, #ffffff));
824
837
  }
825
838
 
826
839
  @supports (color: color-mix(in srgb, red 50%, blue)) {
840
+ /* Fold color-mix() into the same deprecated-first chain so consumer
841
+ overrides on either token reach paint on the modern path too. */
827
842
  .side-nav__toggle:hover {
828
- background-color: color-mix(in srgb, currentColor 15%, transparent);
843
+ background-color: var(
844
+ --hx-color-border-on-dark-subtle,
845
+ var(
846
+ --hx-color-surface-on-dark-overlay-subtle,
847
+ color-mix(in srgb, currentColor 15%, transparent)
848
+ )
849
+ );
829
850
  }
830
851
  }
831
852
 
@@ -1287,8 +1308,7 @@
1287
1308
  }
1288
1309
 
1289
1310
  .tree:focus-visible {
1290
- outline: var(--hx-focus-ring-width, 2px) solid
1291
- var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078));
1311
+ outline: var(--hx-focus-ring-width, 2px) solid var(--hx-focus-ring-color, #0f7078);
1292
1312
  outline-offset: var(--hx-focus-ring-offset, 2px);
1293
1313
  border-radius: var(--hx-border-radius-sm, 0.25rem);
1294
1314
  }
@@ -119,13 +119,13 @@
119
119
  --hx-color-surface-warning-strong: var(--hx-color-warning-500);
120
120
  --hx-color-surface-danger-strong: var(--hx-color-error-600);
121
121
  --hx-color-surface-info-strong: var(--hx-color-primary-600);
122
+ --hx-color-surface-on-dark-overlay-default: var(--hx-overlay-white-30);
123
+ --hx-color-surface-on-dark-overlay-subtle: var(--hx-overlay-white-10);
122
124
  --hx-color-border-default: var(--hx-color-neutral-200);
123
125
  --hx-color-border-subtle: var(--hx-color-neutral-100);
124
126
  --hx-color-border-strong: var(--hx-color-neutral-500);
125
127
  --hx-color-border-focus: var(--hx-color-primary-500);
126
128
  --hx-color-border-on-dark-strong: var(--hx-overlay-white-70);
127
- --hx-color-border-on-dark-default: var(--hx-overlay-white-30);
128
- --hx-color-border-on-dark-subtle: var(--hx-overlay-white-10);
129
129
  --hx-color-focus-ring: var(--hx-color-primary-600);
130
130
  --hx-color-selection-bg: var(--hx-color-primary-200);
131
131
  --hx-color-selection-color: var(--hx-color-neutral-900);
@@ -368,13 +368,13 @@
368
368
  --hx-color-surface-sunken: var(--hx-color-neutral-950);
369
369
  --hx-color-surface-inverse: var(--hx-color-neutral-100);
370
370
  --hx-color-surface-overlay: rgba(0, 0, 0, 0.85);
371
+ --hx-color-surface-on-dark-overlay-default: var(--hx-overlay-black-30);
372
+ --hx-color-surface-on-dark-overlay-subtle: var(--hx-overlay-black-10);
371
373
  --hx-color-border-default: var(--hx-color-neutral-700);
372
374
  --hx-color-border-subtle: var(--hx-color-neutral-800);
373
375
  --hx-color-border-strong: var(--hx-color-neutral-400);
374
376
  --hx-color-border-focus: var(--hx-color-primary-400);
375
377
  --hx-color-border-on-dark-strong: var(--hx-overlay-black-50);
376
- --hx-color-border-on-dark-default: var(--hx-overlay-black-30);
377
- --hx-color-border-on-dark-subtle: var(--hx-overlay-black-10);
378
378
  --hx-color-focus-ring: var(--hx-color-primary-400);
379
379
  --hx-color-selection-bg: var(--hx-color-primary-800);
380
380
  --hx-color-selection-color: var(--hx-color-neutral-100);
@@ -414,13 +414,13 @@
414
414
  --hx-color-surface-sunken: var(--hx-color-neutral-950);
415
415
  --hx-color-surface-inverse: var(--hx-color-neutral-100);
416
416
  --hx-color-surface-overlay: rgba(0, 0, 0, 0.85);
417
+ --hx-color-surface-on-dark-overlay-default: var(--hx-overlay-black-30);
418
+ --hx-color-surface-on-dark-overlay-subtle: var(--hx-overlay-black-10);
417
419
  --hx-color-border-default: var(--hx-color-neutral-700);
418
420
  --hx-color-border-subtle: var(--hx-color-neutral-800);
419
421
  --hx-color-border-strong: var(--hx-color-neutral-400);
420
422
  --hx-color-border-focus: var(--hx-color-primary-400);
421
423
  --hx-color-border-on-dark-strong: var(--hx-overlay-black-50);
422
- --hx-color-border-on-dark-default: var(--hx-overlay-black-30);
423
- --hx-color-border-on-dark-subtle: var(--hx-overlay-black-10);
424
424
  --hx-color-focus-ring: var(--hx-color-primary-400);
425
425
  --hx-color-selection-bg: var(--hx-color-primary-800);
426
426
  --hx-color-selection-color: var(--hx-color-neutral-100);
@@ -486,13 +486,13 @@
486
486
  --hx-color-surface-warning-strong: var(--hx-color-warning-500);
487
487
  --hx-color-surface-danger-strong: var(--hx-color-error-500);
488
488
  --hx-color-surface-info-strong: var(--hx-color-primary-500);
489
+ --hx-color-surface-on-dark-overlay-default: #FFFFFF;
490
+ --hx-color-surface-on-dark-overlay-subtle: #C0C0C0;
489
491
  --hx-color-border-default: #FFFFFF;
490
492
  --hx-color-border-subtle: #C0C0C0;
491
493
  --hx-color-border-strong: #FFFFFF;
492
494
  --hx-color-border-focus: #FFFF00;
493
495
  --hx-color-border-on-dark-strong: #FFFFFF;
494
- --hx-color-border-on-dark-default: #FFFFFF;
495
- --hx-color-border-on-dark-subtle: #C0C0C0;
496
496
  --hx-color-focus-ring: #FFFF00;
497
497
  --hx-color-selection-bg: #1AEBFF;
498
498
  --hx-color-selection-color: #000000;
@@ -415,10 +415,7 @@
415
415
 
416
416
  .split-button__primary:focus-visible {
417
417
  outline: var(--hx-focus-ring-width, 2px) solid
418
- var(
419
- --hx-split-button-focus-ring-color,
420
- var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078))
421
- );
418
+ var(--hx-split-button-focus-ring-color, var(--hx-focus-ring-color, #0f7078));
422
419
  outline-offset: var(--hx-focus-ring-offset, 2px);
423
420
  z-index: 1;
424
421
  position: relative;
@@ -460,10 +457,7 @@
460
457
 
461
458
  .split-button__trigger:focus-visible {
462
459
  outline: var(--hx-focus-ring-width, 2px) solid
463
- var(
464
- --hx-split-button-focus-ring-color,
465
- var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078))
466
- );
460
+ var(--hx-split-button-focus-ring-color, var(--hx-focus-ring-color, #0f7078));
467
461
  outline-offset: var(--hx-focus-ring-offset, 2px);
468
462
  z-index: 1;
469
463
  position: relative;
@@ -158,10 +158,7 @@
158
158
 
159
159
  .alert__close-button:focus-visible {
160
160
  outline: var(--hx-focus-ring-width, 2px) solid
161
- var(
162
- --hx-alert-close-btn-focus-ring-color,
163
- var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078))
164
- );
161
+ var(--hx-alert-close-btn-focus-ring-color, var(--hx-focus-ring-color, #0f7078));
165
162
  outline-offset: var(--hx-focus-ring-offset, 2px);
166
163
  opacity: 1;
167
164
  }
@@ -96,10 +96,7 @@
96
96
 
97
97
  .banner__action:focus-visible {
98
98
  outline: var(--hx-focus-ring-width, 2px) solid
99
- var(
100
- --hx-banner-action-focus-ring-color,
101
- var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078))
102
- );
99
+ var(--hx-banner-action-focus-ring-color, var(--hx-focus-ring-color, #0f7078));
103
100
  outline-offset: var(--hx-focus-ring-offset, 2px);
104
101
  border-radius: var(--hx-border-radius-sm, 0.25rem);
105
102
  }
@@ -140,10 +137,7 @@
140
137
 
141
138
  .banner__close-button:focus-visible {
142
139
  outline: var(--hx-focus-ring-width, 2px) solid
143
- var(
144
- --hx-banner-close-btn-focus-ring-color,
145
- var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078))
146
- );
140
+ var(--hx-banner-close-btn-focus-ring-color, var(--hx-focus-ring-color, #0f7078));
147
141
  outline-offset: var(--hx-focus-ring-offset, 2px);
148
142
  opacity: 1;
149
143
  }
@@ -229,15 +229,16 @@
229
229
 
230
230
  /* ─── Inverted Mode ─── */
231
231
 
232
- /* Inline-fallback contract for --hx-color-border-on-dark-* in this section:
232
+ /* Inline-fallback contract for the on-dark-* tokens in this section:
233
233
  the literal rgba(255, 255, 255, 0.X) arms are a LIGHT-MODE-only last
234
234
  resort (cold-start, CSS-not-loaded). At runtime, hx-theme injects
235
- dark.color.border.on-dark-* as overlay-black-* so dark-mode inverted
236
- buttons stay visible on the now-light surface.inverse (#EBEEE9). The
237
- inline white overlays would render invisible (≈1.1:1) on a light surface,
238
- but they never paint when the theme is mounted. If a future change moves
239
- these into a context where hx-theme is not guaranteed, replace with
240
- mode-aware tokens. */
235
+ the dark.* override (overlay-black-* for the strong border and the
236
+ surface.on-dark-overlay-* fills) so dark-mode inverted buttons stay
237
+ visible on the now-light surface.inverse (#EBEEE9). The inline white
238
+ overlays would render invisible (≈1.1:1) on a light surface, but
239
+ they never paint when the theme is mounted. If a future change
240
+ moves these into a context where hx-theme is not guaranteed,
241
+ replace with mode-aware tokens. */
241
242
 
242
243
  /* Override text color and filter-based hover/active for all variants */
243
244
  :host([inverted]) .button {
@@ -255,8 +256,12 @@
255
256
 
256
257
  :host([inverted]) .button:focus-visible {
257
258
  /* WCAG 1.4.11: focus indicator needs ≥3:1 against adjacent colors.
258
- border-on-dark-default (overlay-white-30) ≈ 2.7:1 on neutral-900 — fails.
259
- border-on-dark-strong (overlay-white-70) 5:1 passes. */
259
+ border-on-dark-strong (overlay-white-70) ≈ 5:1 on neutral-900 — passes.
260
+ The lower-alpha siblings used to live in border.* but were sub-3:1
261
+ against any plausible surface and could not honour a border contract;
262
+ they're now surface.on-dark-overlay-{default,subtle} (translucent
263
+ fills, not borders) and used elsewhere in this file. See
264
+ tokens.json color.surface.on-dark-overlay-* for canonical ratios. */
260
265
  outline-color: var(
261
266
  --hx-button-inverted-focus-ring-color,
262
267
  var(--hx-color-border-on-dark-strong, rgba(255, 255, 255, 0.7))
@@ -267,8 +272,16 @@
267
272
  so dark mode can flip the fill to primary-600. surface.inverse becomes light
268
273
  (#EBEEE9) in dark mode; primary-500 on #EBEEE9 = 2.94:1 (sub-3:1 UI floor
269
274
  fail for the inverted-button boundary). primary-600 on #EBEEE9 = 4.97:1
270
- (AA pass). Light mode tracks action.primary.bg (primary-500, 5.20:1 on
271
- dark surface.inverse). */
275
+ (AA pass). Light mode tracks action.primary.bg-inverted-rest's base value
276
+ (primary-500, 5.20:1 on dark surface.inverse).
277
+
278
+ Override path note (codex round-11): this binds --hx-button-bg directly,
279
+ matching the cascade convention every other .button--{variant} rule uses
280
+ (light primary at line 89, danger at 120, secondary, tertiary, ghost). The
281
+ consumer override path for inverted-primary rest is
282
+ --hx-color-action-primary-bg-inverted-rest, NOT --hx-button-bg — the same
283
+ pattern as light primary (consumers override --hx-color-action-primary-bg).
284
+ Pinned by dark-mode-resolution.test.ts:185-197 across both modes. */
272
285
  :host([inverted]) .button--primary {
273
286
  --hx-button-bg: var(--hx-color-action-primary-bg-inverted-rest, #429797);
274
287
  }
@@ -320,20 +333,34 @@
320
333
  --hx-button-border-color: var(--hx-color-border-on-dark-strong, rgba(255, 255, 255, 0.7));
321
334
  }
322
335
 
336
+ /* Inverted overlay fills read both names so consumer overrides reach paint
337
+ regardless of which token they target: the deprecated --hx-color-border-on-dark-*
338
+ names (3.2.0/3.2.1 public API, scheduled for removal in 4.0.0) and the canonical
339
+ --hx-color-surface-on-dark-overlay-* names (round-8 rename). Deprecated name
340
+ wins when set; otherwise resolves through the canonical alias chain. */
323
341
  :host([inverted]) .button--secondary:hover {
324
- --hx-button-bg: var(--hx-color-border-on-dark-default, rgba(255, 255, 255, 0.3));
342
+ --hx-button-bg: var(
343
+ --hx-color-border-on-dark-default,
344
+ var(--hx-color-surface-on-dark-overlay-default, rgba(255, 255, 255, 0.3))
345
+ );
325
346
  }
326
347
 
327
- /* Tertiary inverted — resting at subtle (10%) lifts to default (30%) on hover
328
- so the runtime hover delta is visually distinct, not collapsed onto a
329
- single token. */
348
+ /* Tertiary inverted — resting at the subtle overlay (10%) lifts to the default
349
+ overlay (30%) on hover so the runtime hover delta is visually distinct, not
350
+ collapsed onto a single token. */
330
351
  :host([inverted]) .button--tertiary {
331
- --hx-button-bg: var(--hx-color-border-on-dark-subtle, rgba(255, 255, 255, 0.1));
352
+ --hx-button-bg: var(
353
+ --hx-color-border-on-dark-subtle,
354
+ var(--hx-color-surface-on-dark-overlay-subtle, rgba(255, 255, 255, 0.1))
355
+ );
332
356
  --hx-button-border-color: transparent;
333
357
  }
334
358
 
335
359
  :host([inverted]) .button--tertiary:hover {
336
- --hx-button-bg: var(--hx-color-border-on-dark-default, rgba(255, 255, 255, 0.3));
360
+ --hx-button-bg: var(
361
+ --hx-color-border-on-dark-default,
362
+ var(--hx-color-surface-on-dark-overlay-default, rgba(255, 255, 255, 0.3))
363
+ );
337
364
  }
338
365
 
339
366
  /* Ghost inverted — transparent base, translucent hover bg */
@@ -345,7 +372,10 @@
345
372
  :host([inverted]) .button--ghost:hover {
346
373
  --hx-button-bg: var(
347
374
  --hx-button-inverted-ghost-hover-bg,
348
- var(--hx-color-border-on-dark-default, rgba(255, 255, 255, 0.3))
375
+ var(
376
+ --hx-color-border-on-dark-default,
377
+ var(--hx-color-surface-on-dark-overlay-default, rgba(255, 255, 255, 0.3))
378
+ )
349
379
  );
350
380
  }
351
381
 
@@ -355,7 +385,10 @@
355
385
  }
356
386
 
357
387
  :host([inverted]) .button--outline:hover {
358
- --hx-button-bg: var(--hx-color-border-on-dark-default, rgba(255, 255, 255, 0.3));
388
+ --hx-button-bg: var(
389
+ --hx-color-border-on-dark-default,
390
+ var(--hx-color-surface-on-dark-overlay-default, rgba(255, 255, 255, 0.3))
391
+ );
359
392
  }
360
393
 
361
394
  /* ─── Prefix / Suffix / Label ─── */
@@ -72,10 +72,7 @@
72
72
 
73
73
  .checkbox__input:focus-visible ~ .checkbox__box {
74
74
  outline: var(--hx-checkbox-focus-ring-width, var(--hx-focus-ring-width, 2px)) solid
75
- var(
76
- --hx-checkbox-focus-ring-color,
77
- var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078))
78
- );
75
+ var(--hx-checkbox-focus-ring-color, var(--hx-focus-ring-color, #0f7078));
79
76
  outline-offset: var(--hx-checkbox-focus-ring-offset, var(--hx-focus-ring-offset, 2px));
80
77
  }
81
78
 
@@ -78,7 +78,8 @@
78
78
  min-width: var(--hx-touch-target-min, 2.75rem);
79
79
  min-height: var(--hx-touch-target-min, 2.75rem);
80
80
  padding: var(--hx-space-1, 0.25rem) var(--hx-space-2, 0.5rem);
81
- border: var(--hx-border-width-thin, 1px) solid var(--hx-color-border-strong, #66787b);
81
+ border: var(--hx-border-width-thin, 1px) solid
82
+ var(--hx-color-border-on-dark-strong, rgba(255, 255, 255, 0.7));
82
83
  border-radius: var(--hx-border-radius-sm, 0.25rem);
83
84
  /* Copy button sits on the always-dark block snippet surface; uses inverse family for contrast on the terminal background. */
84
85
  background-color: var(--hx-color-surface-inverse, #0d1825);
@@ -103,8 +104,14 @@
103
104
  }
104
105
 
105
106
  .code-snippet__copy-button:focus-visible {
106
- outline: var(--hx-focus-ring-width, 2px) solid
107
- var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078));
107
+ /* Always-dark terminal surface — uses primary-400 (#6AB1B1, 7.27:1 on #0d1825)
108
+ instead of the light-mode --hx-focus-ring-color (primary-600, 3.07:1 — razor
109
+ above the 3:1 UI floor with no headroom). Deliberate primitive-tier consumption:
110
+ there is no semantic focus-ring-on-dark alias today — the dark.color.focus-ring
111
+ override at tokens.json only fires under theme=dark, but this surface is dark in
112
+ every theme. Tracked for promotion to a semantic alias in a future token-cascade
113
+ follow-up. */
114
+ outline: var(--hx-focus-ring-width, 2px) solid var(--hx-color-primary-400, #6ab1b1);
108
115
  outline-offset: var(--hx-focus-ring-offset, 2px);
109
116
  }
110
117
 
@@ -123,7 +130,8 @@
123
130
  min-height: var(--hx-touch-target-min, 2.75rem);
124
131
  padding: var(--hx-space-2, 0.5rem) var(--hx-space-4, 1rem);
125
132
  border: none;
126
- border-top: var(--hx-border-width-thin, 1px) solid var(--hx-color-border-strong, #66787b);
133
+ border-top: var(--hx-border-width-thin, 1px) solid
134
+ var(--hx-color-border-on-dark-strong, rgba(255, 255, 255, 0.7));
127
135
  /* Expand button is attached to the always-dark block snippet — inverse family maintains the terminal aesthetic. */
128
136
  background-color: var(--hx-color-surface-inverse, #0d1825);
129
137
  color: var(--hx-color-text-inverse, #ffffff);
@@ -144,8 +152,14 @@
144
152
  }
145
153
 
146
154
  .code-snippet__expand-button:focus-visible {
147
- outline: var(--hx-focus-ring-width, 2px) solid
148
- var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078));
155
+ /* Always-dark terminal surface — uses primary-400 (#6AB1B1, 7.27:1 on #0d1825)
156
+ instead of the light-mode --hx-focus-ring-color (primary-600, 3.07:1 — razor
157
+ above the 3:1 UI floor with no headroom). Deliberate primitive-tier consumption:
158
+ there is no semantic focus-ring-on-dark alias today — the dark.color.focus-ring
159
+ override at tokens.json only fires under theme=dark, but this surface is dark in
160
+ every theme. Tracked for promotion to a semantic alias in a future token-cascade
161
+ follow-up. */
162
+ outline: var(--hx-focus-ring-width, 2px) solid var(--hx-color-primary-400, #6ab1b1);
149
163
  outline-offset: var(--hx-focus-ring-offset, 2px);
150
164
  }
151
165