@helixui/library 3.2.0-next.100 → 3.2.0-next.104

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. package/custom-elements.json +10 -10
  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 +5 -5
  7. package/dist/components/hx-button/hx-button.styles.d.ts.map +1 -1
  8. package/dist/components/hx-button/index.js +1 -1
  9. package/dist/components/hx-checkbox/hx-checkbox.styles.d.ts.map +1 -1
  10. package/dist/components/hx-checkbox/index.js +1 -1
  11. package/dist/components/hx-code-snippet/hx-code-snippet.styles.d.ts.map +1 -1
  12. package/dist/components/hx-code-snippet/index.js +1 -1
  13. package/dist/components/hx-combobox/hx-combobox.styles.d.ts.map +1 -1
  14. package/dist/components/hx-combobox/index.js +1 -1
  15. package/dist/components/hx-date-picker/hx-date-picker.styles.d.ts.map +1 -1
  16. package/dist/components/hx-date-picker/index.js +1 -1
  17. package/dist/components/hx-link/hx-link.styles.d.ts.map +1 -1
  18. package/dist/components/hx-link/index.js +1 -1
  19. package/dist/components/hx-list/hx-list-item.styles.d.ts.map +1 -1
  20. package/dist/components/hx-list/index.js +1 -1
  21. package/dist/components/hx-radio-group/hx-radio.styles.d.ts.map +1 -1
  22. package/dist/components/hx-radio-group/index.js +1 -1
  23. package/dist/components/hx-rating/hx-rating.styles.d.ts.map +1 -1
  24. package/dist/components/hx-rating/index.js +1 -1
  25. package/dist/components/hx-select/hx-select.styles.d.ts.map +1 -1
  26. package/dist/components/hx-select/index.js +1 -1
  27. package/dist/components/hx-side-nav/hx-side-nav.d.ts +1 -1
  28. package/dist/components/hx-side-nav/index.js +1 -1
  29. package/dist/components/hx-slider/hx-slider.styles.d.ts.map +1 -1
  30. package/dist/components/hx-slider/index.js +1 -1
  31. package/dist/components/hx-split-button/hx-split-button.styles.d.ts.map +1 -1
  32. package/dist/components/hx-split-button/index.js +1 -1
  33. package/dist/components/hx-switch/hx-switch.styles.d.ts.map +1 -1
  34. package/dist/components/hx-switch/index.js +1 -1
  35. package/dist/components/hx-tabs/hx-tab-panel.styles.d.ts.map +1 -1
  36. package/dist/components/hx-tabs/hx-tab.styles.d.ts.map +1 -1
  37. package/dist/components/hx-tabs/index.js +1 -1
  38. package/dist/components/hx-text-input/hx-text-input.styles.d.ts.map +1 -1
  39. package/dist/components/hx-text-input/index.js +1 -1
  40. package/dist/components/hx-textarea/hx-textarea.styles.d.ts.map +1 -1
  41. package/dist/components/hx-textarea/index.js +1 -1
  42. package/dist/components/hx-toggle-button/hx-toggle-button.styles.d.ts.map +1 -1
  43. package/dist/components/hx-toggle-button/index.js +1 -1
  44. package/dist/components/hx-tree-view/hx-tree-view.styles.d.ts.map +1 -1
  45. package/dist/components/hx-tree-view/index.js +1 -1
  46. package/dist/css/helix-all.css +58 -113
  47. package/dist/css/helix-core.css +33 -23
  48. package/dist/css/helix-data.css +2 -4
  49. package/dist/css/helix-feedback.css +3 -12
  50. package/dist/css/helix-forms.css +16 -63
  51. package/dist/css/helix-navigation.css +2 -3
  52. package/dist/css/helix-tokens.css +16 -8
  53. package/dist/css/helix-utility.css +2 -8
  54. package/dist/css/hx-alert.css +1 -4
  55. package/dist/css/hx-banner.css +2 -8
  56. package/dist/css/hx-button.css +32 -19
  57. package/dist/css/hx-checkbox.css +1 -4
  58. package/dist/css/hx-code-snippet.css +2 -4
  59. package/dist/css/hx-combobox.css +2 -8
  60. package/dist/css/hx-date-picker.css +5 -21
  61. package/dist/css/hx-link.css +1 -4
  62. package/dist/css/hx-rating.css +1 -2
  63. package/dist/css/hx-select.css +1 -4
  64. package/dist/css/hx-side-nav.css +1 -1
  65. package/dist/css/hx-slider.css +1 -4
  66. package/dist/css/hx-split-button.css +2 -8
  67. package/dist/css/hx-switch.css +1 -4
  68. package/dist/css/hx-text-input.css +2 -8
  69. package/dist/css/hx-textarea.css +1 -4
  70. package/dist/css/hx-toggle-button.css +1 -4
  71. package/dist/css/hx-tree-view.css +1 -2
  72. package/dist/css/index.css +1 -1
  73. package/dist/css/manifest.json +16 -14
  74. package/dist/index.js +21 -21
  75. package/dist/shared/{hx-alert-C597yHpD.js → hx-alert-CLn7CstP.js} +2 -5
  76. package/dist/shared/hx-alert-CLn7CstP.js.map +1 -0
  77. package/dist/shared/{hx-banner-Cxd7eFUP.js → hx-banner-D3DzpfcP.js} +7 -13
  78. package/dist/shared/hx-banner-D3DzpfcP.js.map +1 -0
  79. package/dist/shared/{hx-button-9OUjJnk7.js → hx-button-DVSDRKoV.js} +38 -25
  80. package/dist/shared/hx-button-DVSDRKoV.js.map +1 -0
  81. package/dist/shared/{hx-checkbox-DBD-gMoz.js → hx-checkbox-D7xma9YH.js} +6 -9
  82. package/dist/shared/hx-checkbox-D7xma9YH.js.map +1 -0
  83. package/dist/shared/{hx-code-snippet-B26RM1_C.js → hx-code-snippet-Bi-arDKH.js} +3 -5
  84. package/dist/shared/hx-code-snippet-Bi-arDKH.js.map +1 -0
  85. package/dist/shared/{hx-combobox-ClhNRAS5.js → hx-combobox-DDzqNKEW.js} +6 -12
  86. package/dist/shared/hx-combobox-DDzqNKEW.js.map +1 -0
  87. package/dist/shared/{hx-date-picker-BJm7Yrda.js → hx-date-picker-2iRG1p74.js} +12 -28
  88. package/dist/shared/hx-date-picker-2iRG1p74.js.map +1 -0
  89. package/dist/shared/{hx-link-9Ig2DW6L.js → hx-link-C-O6vq0Q.js} +2 -5
  90. package/dist/shared/hx-link-C-O6vq0Q.js.map +1 -0
  91. package/dist/shared/{hx-list-CkphGi9T.js → hx-list-MyEhh8c7.js} +3 -5
  92. package/dist/shared/hx-list-MyEhh8c7.js.map +1 -0
  93. package/dist/shared/{hx-nav-item-CqbO5-T5.js → hx-nav-item-Dap3DYgB.js} +2 -2
  94. package/dist/shared/hx-nav-item-Dap3DYgB.js.map +1 -0
  95. package/dist/shared/{hx-radio-dFjUAost.js → hx-radio-CJvNU2yP.js} +2 -5
  96. package/dist/shared/{hx-radio-dFjUAost.js.map → hx-radio-CJvNU2yP.js.map} +1 -1
  97. package/dist/shared/{hx-rating-CGtsejNf.js → hx-rating-C3QP53k9.js} +2 -3
  98. package/dist/shared/hx-rating-C3QP53k9.js.map +1 -0
  99. package/dist/shared/{hx-select-Bf4usFts.js → hx-select-C8fEHQhC.js} +2 -5
  100. package/dist/shared/hx-select-C8fEHQhC.js.map +1 -0
  101. package/dist/shared/{hx-slider-m0aEClH1.js → hx-slider-Blmv_rwS.js} +23 -26
  102. package/dist/shared/hx-slider-Blmv_rwS.js.map +1 -0
  103. package/dist/shared/{hx-split-button-BxDFfx4D.js → hx-split-button-Djnc5Aeg.js} +3 -9
  104. package/dist/shared/hx-split-button-Djnc5Aeg.js.map +1 -0
  105. package/dist/shared/{hx-switch-DvAW4YY-.js → hx-switch-BrZFaRue.js} +6 -9
  106. package/dist/shared/hx-switch-BrZFaRue.js.map +1 -0
  107. package/dist/shared/{hx-tab-panel-SWOEHuJc.js → hx-tab-panel-DspCrKqo.js} +3 -9
  108. package/dist/shared/{hx-tab-panel-SWOEHuJc.js.map → hx-tab-panel-DspCrKqo.js.map} +1 -1
  109. package/dist/shared/{hx-text-input-Bn7Gn8CI.js → hx-text-input-D6FlOZM-.js} +3 -9
  110. package/dist/shared/hx-text-input-D6FlOZM-.js.map +1 -0
  111. package/dist/shared/{hx-textarea-Jx1xnhgv.js → hx-textarea-CNG590KY.js} +6 -9
  112. package/dist/shared/hx-textarea-CNG590KY.js.map +1 -0
  113. package/dist/shared/{hx-toggle-button-DPAIh_Xo.js → hx-toggle-button-iLiYrMbD.js} +2 -5
  114. package/dist/shared/hx-toggle-button-iLiYrMbD.js.map +1 -0
  115. package/dist/shared/{hx-tree-item-Dt0Ozqyr.js → hx-tree-item-C2CiWuDE.js} +2 -3
  116. package/dist/shared/hx-tree-item-C2CiWuDE.js.map +1 -0
  117. package/figma-inventory.json +12 -12
  118. package/package.json +2 -2
  119. package/dist/shared/hx-alert-C597yHpD.js.map +0 -1
  120. package/dist/shared/hx-banner-Cxd7eFUP.js.map +0 -1
  121. package/dist/shared/hx-button-9OUjJnk7.js.map +0 -1
  122. package/dist/shared/hx-checkbox-DBD-gMoz.js.map +0 -1
  123. package/dist/shared/hx-code-snippet-B26RM1_C.js.map +0 -1
  124. package/dist/shared/hx-combobox-ClhNRAS5.js.map +0 -1
  125. package/dist/shared/hx-date-picker-BJm7Yrda.js.map +0 -1
  126. package/dist/shared/hx-link-9Ig2DW6L.js.map +0 -1
  127. package/dist/shared/hx-list-CkphGi9T.js.map +0 -1
  128. package/dist/shared/hx-nav-item-CqbO5-T5.js.map +0 -1
  129. package/dist/shared/hx-rating-CGtsejNf.js.map +0 -1
  130. package/dist/shared/hx-select-Bf4usFts.js.map +0 -1
  131. package/dist/shared/hx-slider-m0aEClH1.js.map +0 -1
  132. package/dist/shared/hx-split-button-BxDFfx4D.js.map +0 -1
  133. package/dist/shared/hx-switch-DvAW4YY-.js.map +0 -1
  134. package/dist/shared/hx-text-input-Bn7Gn8CI.js.map +0 -1
  135. package/dist/shared/hx-textarea-Jx1xnhgv.js.map +0 -1
  136. package/dist/shared/hx-toggle-button-DPAIh_Xo.js.map +0 -1
  137. package/dist/shared/hx-tree-item-Dt0Ozqyr.js.map +0 -1
@@ -309,10 +309,7 @@
309
309
 
310
310
  .alert__close-button:focus-visible {
311
311
  outline: var(--hx-focus-ring-width, 2px) solid
312
- var(
313
- --hx-alert-close-btn-focus-ring-color,
314
- var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078))
315
- );
312
+ var(--hx-alert-close-btn-focus-ring-color, var(--hx-focus-ring-color, #0f7078));
316
313
  outline-offset: var(--hx-focus-ring-offset, 2px);
317
314
  opacity: 1;
318
315
  }
@@ -832,10 +829,7 @@
832
829
 
833
830
  .banner__action:focus-visible {
834
831
  outline: var(--hx-focus-ring-width, 2px) solid
835
- var(
836
- --hx-banner-action-focus-ring-color,
837
- var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078))
838
- );
832
+ var(--hx-banner-action-focus-ring-color, var(--hx-focus-ring-color, #0f7078));
839
833
  outline-offset: var(--hx-focus-ring-offset, 2px);
840
834
  border-radius: var(--hx-border-radius-sm, 0.25rem);
841
835
  }
@@ -876,10 +870,7 @@
876
870
 
877
871
  .banner__close-button:focus-visible {
878
872
  outline: var(--hx-focus-ring-width, 2px) solid
879
- var(
880
- --hx-banner-close-btn-focus-ring-color,
881
- var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078))
882
- );
873
+ var(--hx-banner-close-btn-focus-ring-color, var(--hx-focus-ring-color, #0f7078));
883
874
  outline-offset: var(--hx-focus-ring-offset, 2px);
884
875
  opacity: 1;
885
876
  }
@@ -1255,15 +1246,16 @@
1255
1246
 
1256
1247
  /* ─── Inverted Mode ─── */
1257
1248
 
1258
- /* Inline-fallback contract for --hx-color-border-on-dark-* in this section:
1249
+ /* Inline-fallback contract for the on-dark-* tokens in this section:
1259
1250
  the literal rgba(255, 255, 255, 0.X) arms are a LIGHT-MODE-only last
1260
1251
  resort (cold-start, CSS-not-loaded). At runtime, hx-theme injects
1261
- dark.color.border.on-dark-* as overlay-black-* so dark-mode inverted
1262
- buttons stay visible on the now-light surface.inverse (#EBEEE9). The
1263
- inline white overlays would render invisible (≈1.1:1) on a light surface,
1264
- but they never paint when the theme is mounted. If a future change moves
1265
- these into a context where hx-theme is not guaranteed, replace with
1266
- mode-aware tokens. */
1252
+ the dark.* override (overlay-black-* for the strong border and the
1253
+ surface.on-dark-overlay-* fills) so dark-mode inverted buttons stay
1254
+ visible on the now-light surface.inverse (#EBEEE9). The inline white
1255
+ overlays would render invisible (≈1.1:1) on a light surface, but
1256
+ they never paint when the theme is mounted. If a future change
1257
+ moves these into a context where hx-theme is not guaranteed,
1258
+ replace with mode-aware tokens. */
1267
1259
 
1268
1260
  /* Override text color and filter-based hover/active for all variants */
1269
1261
  :host([inverted]) .button {
@@ -1281,8 +1273,12 @@
1281
1273
 
1282
1274
  :host([inverted]) .button:focus-visible {
1283
1275
  /* WCAG 1.4.11: focus indicator needs ≥3:1 against adjacent colors.
1284
- border-on-dark-default (overlay-white-30) ≈ 2.7:1 on neutral-900 — fails.
1285
- border-on-dark-strong (overlay-white-70) 5:1 passes. */
1276
+ border-on-dark-strong (overlay-white-70) ≈ 5:1 on neutral-900 — passes.
1277
+ The lower-alpha siblings used to live in border.* but were sub-3:1
1278
+ against any plausible surface and could not honour a border contract;
1279
+ they're now surface.on-dark-overlay-{default,subtle} (translucent
1280
+ fills, not borders) and used elsewhere in this file. See
1281
+ tokens.json color.surface.on-dark-overlay-* for canonical ratios. */
1286
1282
  outline-color: var(
1287
1283
  --hx-button-inverted-focus-ring-color,
1288
1284
  var(--hx-color-border-on-dark-strong, rgba(255, 255, 255, 0.7))
@@ -1293,8 +1289,16 @@
1293
1289
  so dark mode can flip the fill to primary-600. surface.inverse becomes light
1294
1290
  (#EBEEE9) in dark mode; primary-500 on #EBEEE9 = 2.94:1 (sub-3:1 UI floor
1295
1291
  fail for the inverted-button boundary). primary-600 on #EBEEE9 = 4.97:1
1296
- (AA pass). Light mode tracks action.primary.bg (primary-500, 5.20:1 on
1297
- dark surface.inverse). */
1292
+ (AA pass). Light mode tracks action.primary.bg-inverted-rest's base value
1293
+ (primary-500, 5.20:1 on dark surface.inverse).
1294
+
1295
+ Override path note (codex round-11): this binds --hx-button-bg directly,
1296
+ matching the cascade convention every other .button--{variant} rule uses
1297
+ (light primary at line 89, danger at 120, secondary, tertiary, ghost). The
1298
+ consumer override path for inverted-primary rest is
1299
+ --hx-color-action-primary-bg-inverted-rest, NOT --hx-button-bg — the same
1300
+ pattern as light primary (consumers override --hx-color-action-primary-bg).
1301
+ Pinned by dark-mode-resolution.test.ts:185-197 across both modes. */
1298
1302
  :host([inverted]) .button--primary {
1299
1303
  --hx-button-bg: var(--hx-color-action-primary-bg-inverted-rest, #429797);
1300
1304
  }
@@ -1347,19 +1351,19 @@
1347
1351
  }
1348
1352
 
1349
1353
  :host([inverted]) .button--secondary:hover {
1350
- --hx-button-bg: var(--hx-color-border-on-dark-default, rgba(255, 255, 255, 0.3));
1354
+ --hx-button-bg: var(--hx-color-surface-on-dark-overlay-default, rgba(255, 255, 255, 0.3));
1351
1355
  }
1352
1356
 
1353
- /* Tertiary inverted — resting at subtle (10%) lifts to default (30%) on hover
1354
- so the runtime hover delta is visually distinct, not collapsed onto a
1355
- single token. */
1357
+ /* Tertiary inverted — resting at the subtle overlay (10%) lifts to the default
1358
+ overlay (30%) on hover so the runtime hover delta is visually distinct, not
1359
+ collapsed onto a single token. */
1356
1360
  :host([inverted]) .button--tertiary {
1357
- --hx-button-bg: var(--hx-color-border-on-dark-subtle, rgba(255, 255, 255, 0.1));
1361
+ --hx-button-bg: var(--hx-color-surface-on-dark-overlay-subtle, rgba(255, 255, 255, 0.1));
1358
1362
  --hx-button-border-color: transparent;
1359
1363
  }
1360
1364
 
1361
1365
  :host([inverted]) .button--tertiary:hover {
1362
- --hx-button-bg: var(--hx-color-border-on-dark-default, rgba(255, 255, 255, 0.3));
1366
+ --hx-button-bg: var(--hx-color-surface-on-dark-overlay-default, rgba(255, 255, 255, 0.3));
1363
1367
  }
1364
1368
 
1365
1369
  /* Ghost inverted — transparent base, translucent hover bg */
@@ -1371,7 +1375,7 @@
1371
1375
  :host([inverted]) .button--ghost:hover {
1372
1376
  --hx-button-bg: var(
1373
1377
  --hx-button-inverted-ghost-hover-bg,
1374
- var(--hx-color-border-on-dark-default, rgba(255, 255, 255, 0.3))
1378
+ var(--hx-color-surface-on-dark-overlay-default, rgba(255, 255, 255, 0.3))
1375
1379
  );
1376
1380
  }
1377
1381
 
@@ -1381,7 +1385,7 @@
1381
1385
  }
1382
1386
 
1383
1387
  :host([inverted]) .button--outline:hover {
1384
- --hx-button-bg: var(--hx-color-border-on-dark-default, rgba(255, 255, 255, 0.3));
1388
+ --hx-button-bg: var(--hx-color-surface-on-dark-overlay-default, rgba(255, 255, 255, 0.3));
1385
1389
  }
1386
1390
 
1387
1391
  /* ─── Prefix / Suffix / Label ─── */
@@ -2058,10 +2062,7 @@
2058
2062
 
2059
2063
  .checkbox__input:focus-visible ~ .checkbox__box {
2060
2064
  outline: var(--hx-checkbox-focus-ring-width, var(--hx-focus-ring-width, 2px)) solid
2061
- var(
2062
- --hx-checkbox-focus-ring-color,
2063
- var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078))
2064
- );
2065
+ var(--hx-checkbox-focus-ring-color, var(--hx-focus-ring-color, #0f7078));
2065
2066
  outline-offset: var(--hx-checkbox-focus-ring-offset, var(--hx-focus-ring-offset, 2px));
2066
2067
  }
2067
2068
 
@@ -2753,8 +2754,7 @@
2753
2754
  }
2754
2755
 
2755
2756
  .code-snippet__copy-button:focus-visible {
2756
- outline: var(--hx-focus-ring-width, 2px) solid
2757
- var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078));
2757
+ outline: var(--hx-focus-ring-width, 2px) solid var(--hx-focus-ring-color, #0f7078);
2758
2758
  outline-offset: var(--hx-focus-ring-offset, 2px);
2759
2759
  }
2760
2760
 
@@ -2795,8 +2795,7 @@
2795
2795
  }
2796
2796
 
2797
2797
  .code-snippet__expand-button:focus-visible {
2798
- outline: var(--hx-focus-ring-width, 2px) solid
2799
- var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078));
2798
+ outline: var(--hx-focus-ring-width, 2px) solid var(--hx-focus-ring-color, #0f7078);
2800
2799
  outline-offset: var(--hx-focus-ring-offset, 2px);
2801
2800
  }
2802
2801
 
@@ -3184,17 +3183,11 @@
3184
3183
  box-shadow var(--hx-transition-fast, 150ms ease);
3185
3184
  }
3186
3185
  .field__input-wrapper:focus-within {
3187
- border-color: var(
3188
- --hx-combobox-focus-ring-color,
3189
- var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078))
3190
- );
3186
+ border-color: var(--hx-combobox-focus-ring-color, var(--hx-focus-ring-color, #0f7078));
3191
3187
  box-shadow: 0 0 0 var(--hx-focus-ring-width, 2px)
3192
3188
  color-mix(
3193
3189
  in srgb,
3194
- var(
3195
- --hx-combobox-focus-ring-color,
3196
- var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078))
3197
- )
3190
+ var(--hx-combobox-focus-ring-color, var(--hx-focus-ring-color, #0f7078))
3198
3191
  calc(var(--hx-focus-ring-opacity, 0.25) * 100%),
3199
3192
  transparent
3200
3193
  );
@@ -4130,17 +4123,11 @@
4130
4123
  }
4131
4124
 
4132
4125
  .field__input-wrapper:focus-within {
4133
- border-color: var(
4134
- --hx-date-picker-focus-ring-color,
4135
- var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078))
4136
- );
4126
+ border-color: var(--hx-date-picker-focus-ring-color, var(--hx-focus-ring-color, #0f7078));
4137
4127
  box-shadow: 0 0 0 var(--hx-focus-ring-width, 2px)
4138
4128
  color-mix(
4139
4129
  in srgb,
4140
- var(
4141
- --hx-date-picker-focus-ring-color,
4142
- var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078))
4143
- )
4130
+ var(--hx-date-picker-focus-ring-color, var(--hx-focus-ring-color, #0f7078))
4144
4131
  calc(var(--hx-focus-ring-opacity, 0.25) * 100%),
4145
4132
  transparent
4146
4133
  );
@@ -4209,17 +4196,10 @@
4209
4196
  }
4210
4197
 
4211
4198
  .field__trigger:focus-visible {
4212
- color: var(
4213
- --hx-date-picker-focus-ring-color,
4214
- var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078))
4215
- );
4199
+ color: var(--hx-date-picker-focus-ring-color, var(--hx-focus-ring-color, #0f7078));
4216
4200
  background-color: color-mix(
4217
4201
  in srgb,
4218
- var(
4219
- --hx-date-picker-focus-ring-color,
4220
- var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078))
4221
- )
4222
- 8%,
4202
+ var(--hx-date-picker-focus-ring-color, var(--hx-focus-ring-color, #0f7078)) 8%,
4223
4203
  transparent
4224
4204
  );
4225
4205
  }
@@ -4316,10 +4296,7 @@
4316
4296
 
4317
4297
  :is(.calendar__nav-btn, .calendar__day):focus-visible {
4318
4298
  box-shadow: 0 0 0 var(--hx-focus-ring-width, 2px)
4319
- var(
4320
- --hx-date-picker-focus-ring-color,
4321
- var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078))
4322
- );
4299
+ var(--hx-date-picker-focus-ring-color, var(--hx-focus-ring-color, #0f7078));
4323
4300
  z-index: 1;
4324
4301
  }
4325
4302
 
@@ -6108,10 +6085,7 @@ export const helixGridItemStyles = css`
6108
6085
 
6109
6086
  .link:focus-visible {
6110
6087
  outline: var(--hx-focus-ring-width, 2px) solid
6111
- var(
6112
- --hx-link-focus-ring-color,
6113
- var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078))
6114
- );
6088
+ var(--hx-link-focus-ring-color, var(--hx-focus-ring-color, #0f7078));
6115
6089
  outline-offset: var(--hx-focus-ring-offset, 2px);
6116
6090
  border-radius: var(--hx-border-radius-sm, 0.25rem);
6117
6091
  }
@@ -8193,8 +8167,7 @@ export const helixGridItemStyles = css`
8193
8167
  }
8194
8168
 
8195
8169
  .symbol:focus-visible {
8196
- outline: var(--hx-focus-ring-width, 2px) solid
8197
- var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078));
8170
+ outline: var(--hx-focus-ring-width, 2px) solid var(--hx-focus-ring-color, #0f7078);
8198
8171
  outline-offset: var(--hx-focus-ring-offset, 2px);
8199
8172
  border-radius: var(--hx-border-radius-sm, 0.25rem);
8200
8173
  }
@@ -8308,10 +8281,7 @@ export const helixGridItemStyles = css`
8308
8281
  --_border-radius: var(--hx-select-border-radius, var(--hx-border-radius-md, 0.375rem));
8309
8282
 
8310
8283
  /* Focus ring */
8311
- --_focus-ring-color: var(
8312
- --hx-select-focus-ring-color,
8313
- var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078))
8314
- );
8284
+ --_focus-ring-color: var(--hx-select-focus-ring-color, var(--hx-focus-ring-color, #0f7078));
8315
8285
 
8316
8286
  /* Error */
8317
8287
  --_error-color: var(--hx-select-error-color, var(--hx-color-error-500, #e5493e));
@@ -8779,7 +8749,7 @@ export const helixGridItemStyles = css`
8779
8749
 
8780
8750
  .side-nav__toggle:hover {
8781
8751
  background-color: var(
8782
- --hx-color-border-on-dark-subtle,
8752
+ --hx-color-surface-on-dark-overlay-subtle,
8783
8753
  rgba(255, 255, 255, 0.1)
8784
8754
  ); /* fallback for browsers without color-mix() */
8785
8755
  color: var(--hx-side-nav-toggle-hover-color, var(--hx-color-text-inverse, #ffffff));
@@ -9151,10 +9121,7 @@ export const helixGridItemStyles = css`
9151
9121
  .slider__input:focus-visible ~ .slider__thumb-visual {
9152
9122
  box-shadow:
9153
9123
  0 0 0 var(--hx-focus-ring-width, 2px)
9154
- var(
9155
- --hx-slider-focus-ring-color,
9156
- var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078))
9157
- ),
9124
+ var(--hx-slider-focus-ring-color, var(--hx-focus-ring-color, #0f7078)),
9158
9125
  var(--hx-slider-thumb-shadow, var(--hx-shadow-sm, 0 1px 2px 0 rgb(0 0 0 / 0.05)));
9159
9126
  }
9160
9127
 
@@ -9423,10 +9390,7 @@ export const helixGridItemStyles = css`
9423
9390
 
9424
9391
  .split-button__primary:focus-visible {
9425
9392
  outline: var(--hx-focus-ring-width, 2px) solid
9426
- var(
9427
- --hx-split-button-focus-ring-color,
9428
- var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078))
9429
- );
9393
+ var(--hx-split-button-focus-ring-color, var(--hx-focus-ring-color, #0f7078));
9430
9394
  outline-offset: var(--hx-focus-ring-offset, 2px);
9431
9395
  z-index: 1;
9432
9396
  position: relative;
@@ -9468,10 +9432,7 @@ export const helixGridItemStyles = css`
9468
9432
 
9469
9433
  .split-button__trigger:focus-visible {
9470
9434
  outline: var(--hx-focus-ring-width, 2px) solid
9471
- var(
9472
- --hx-split-button-focus-ring-color,
9473
- var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078))
9474
- );
9435
+ var(--hx-split-button-focus-ring-color, var(--hx-focus-ring-color, #0f7078));
9475
9436
  outline-offset: var(--hx-focus-ring-offset, 2px);
9476
9437
  z-index: 1;
9477
9438
  position: relative;
@@ -10539,10 +10500,7 @@ export const helixStructuredListRowStyles = css`
10539
10500
 
10540
10501
  .switch__track:focus-visible {
10541
10502
  outline: var(--hx-focus-ring-width, 2px) solid
10542
- var(
10543
- --hx-switch-focus-ring-color,
10544
- var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078))
10545
- );
10503
+ var(--hx-switch-focus-ring-color, var(--hx-focus-ring-color, #0f7078));
10546
10504
  outline-offset: var(--hx-focus-ring-offset, 2px);
10547
10505
  }
10548
10506
 
@@ -11321,10 +11279,7 @@ export const helixTableSectionBaseStyles = css`
11321
11279
  );
11322
11280
  --_text-input-border-color-focus: var(
11323
11281
  --hx-text-input-border-color-focus,
11324
- var(
11325
- --hx-input-focus-ring-color,
11326
- var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078))
11327
- )
11282
+ var(--hx-input-focus-ring-color, var(--hx-focus-ring-color, #0f7078))
11328
11283
  );
11329
11284
  --_text-input-border-color-invalid: var(
11330
11285
  --hx-text-input-border-color-invalid,
@@ -11350,10 +11305,7 @@ export const helixTableSectionBaseStyles = css`
11350
11305
  /* Focus ring */
11351
11306
  --_text-input-focus-ring-color: var(
11352
11307
  --hx-text-input-focus-ring-color,
11353
- var(
11354
- --hx-input-focus-ring-color,
11355
- var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078))
11356
- )
11308
+ var(--hx-input-focus-ring-color, var(--hx-focus-ring-color, #0f7078))
11357
11309
  );
11358
11310
  --_text-input-focus-ring-width: var(
11359
11311
  --hx-text-input-focus-ring-width,
@@ -11663,10 +11615,7 @@ export const helixTableSectionBaseStyles = css`
11663
11615
  );
11664
11616
  --_textarea-border-color-focus: var(
11665
11617
  --hx-textarea-border-color-focus,
11666
- var(
11667
- --hx-input-focus-ring-color,
11668
- var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078))
11669
- )
11618
+ var(--hx-input-focus-ring-color, var(--hx-focus-ring-color, #0f7078))
11670
11619
  );
11671
11620
  --_textarea-border-color-invalid: var(
11672
11621
  --hx-textarea-border-color-invalid,
@@ -12490,10 +12439,7 @@ export const helixToastStackStyles = css`
12490
12439
 
12491
12440
  .button:focus-visible {
12492
12441
  outline: var(--hx-focus-ring-width, 2px) solid
12493
- var(
12494
- --hx-toggle-button-focus-ring-color,
12495
- var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078))
12496
- );
12442
+ var(--hx-toggle-button-focus-ring-color, var(--hx-focus-ring-color, #0f7078));
12497
12443
  outline-offset: var(--hx-focus-ring-offset, 2px);
12498
12444
  }
12499
12445
 
@@ -13017,8 +12963,7 @@ export const helixToastStackStyles = css`
13017
12963
  }
13018
12964
 
13019
12965
  .tree:focus-visible {
13020
- outline: var(--hx-focus-ring-width, 2px) solid
13021
- var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078));
12966
+ outline: var(--hx-focus-ring-width, 2px) solid var(--hx-focus-ring-color, #0f7078);
13022
12967
  outline-offset: var(--hx-focus-ring-offset, 2px);
13023
12968
  border-radius: var(--hx-border-radius-sm, 0.25rem);
13024
12969
  }
@@ -578,15 +578,16 @@
578
578
 
579
579
  /* ─── Inverted Mode ─── */
580
580
 
581
- /* Inline-fallback contract for --hx-color-border-on-dark-* in this section:
581
+ /* Inline-fallback contract for the on-dark-* tokens in this section:
582
582
  the literal rgba(255, 255, 255, 0.X) arms are a LIGHT-MODE-only last
583
583
  resort (cold-start, CSS-not-loaded). At runtime, hx-theme injects
584
- dark.color.border.on-dark-* as overlay-black-* so dark-mode inverted
585
- buttons stay visible on the now-light surface.inverse (#EBEEE9). The
586
- inline white overlays would render invisible (≈1.1:1) on a light surface,
587
- but they never paint when the theme is mounted. If a future change moves
588
- these into a context where hx-theme is not guaranteed, replace with
589
- mode-aware tokens. */
584
+ the dark.* override (overlay-black-* for the strong border and the
585
+ surface.on-dark-overlay-* fills) so dark-mode inverted buttons stay
586
+ visible on the now-light surface.inverse (#EBEEE9). The inline white
587
+ overlays would render invisible (≈1.1:1) on a light surface, but
588
+ they never paint when the theme is mounted. If a future change
589
+ moves these into a context where hx-theme is not guaranteed,
590
+ replace with mode-aware tokens. */
590
591
 
591
592
  /* Override text color and filter-based hover/active for all variants */
592
593
  :host([inverted]) .button {
@@ -604,8 +605,12 @@
604
605
 
605
606
  :host([inverted]) .button:focus-visible {
606
607
  /* WCAG 1.4.11: focus indicator needs ≥3:1 against adjacent colors.
607
- border-on-dark-default (overlay-white-30) ≈ 2.7:1 on neutral-900 — fails.
608
- border-on-dark-strong (overlay-white-70) 5:1 passes. */
608
+ border-on-dark-strong (overlay-white-70) ≈ 5:1 on neutral-900 — passes.
609
+ The lower-alpha siblings used to live in border.* but were sub-3:1
610
+ against any plausible surface and could not honour a border contract;
611
+ they're now surface.on-dark-overlay-{default,subtle} (translucent
612
+ fills, not borders) and used elsewhere in this file. See
613
+ tokens.json color.surface.on-dark-overlay-* for canonical ratios. */
609
614
  outline-color: var(
610
615
  --hx-button-inverted-focus-ring-color,
611
616
  var(--hx-color-border-on-dark-strong, rgba(255, 255, 255, 0.7))
@@ -616,8 +621,16 @@
616
621
  so dark mode can flip the fill to primary-600. surface.inverse becomes light
617
622
  (#EBEEE9) in dark mode; primary-500 on #EBEEE9 = 2.94:1 (sub-3:1 UI floor
618
623
  fail for the inverted-button boundary). primary-600 on #EBEEE9 = 4.97:1
619
- (AA pass). Light mode tracks action.primary.bg (primary-500, 5.20:1 on
620
- dark surface.inverse). */
624
+ (AA pass). Light mode tracks action.primary.bg-inverted-rest's base value
625
+ (primary-500, 5.20:1 on dark surface.inverse).
626
+
627
+ Override path note (codex round-11): this binds --hx-button-bg directly,
628
+ matching the cascade convention every other .button--{variant} rule uses
629
+ (light primary at line 89, danger at 120, secondary, tertiary, ghost). The
630
+ consumer override path for inverted-primary rest is
631
+ --hx-color-action-primary-bg-inverted-rest, NOT --hx-button-bg — the same
632
+ pattern as light primary (consumers override --hx-color-action-primary-bg).
633
+ Pinned by dark-mode-resolution.test.ts:185-197 across both modes. */
621
634
  :host([inverted]) .button--primary {
622
635
  --hx-button-bg: var(--hx-color-action-primary-bg-inverted-rest, #429797);
623
636
  }
@@ -670,19 +683,19 @@
670
683
  }
671
684
 
672
685
  :host([inverted]) .button--secondary:hover {
673
- --hx-button-bg: var(--hx-color-border-on-dark-default, rgba(255, 255, 255, 0.3));
686
+ --hx-button-bg: var(--hx-color-surface-on-dark-overlay-default, rgba(255, 255, 255, 0.3));
674
687
  }
675
688
 
676
- /* Tertiary inverted — resting at subtle (10%) lifts to default (30%) on hover
677
- so the runtime hover delta is visually distinct, not collapsed onto a
678
- single token. */
689
+ /* Tertiary inverted — resting at the subtle overlay (10%) lifts to the default
690
+ overlay (30%) on hover so the runtime hover delta is visually distinct, not
691
+ collapsed onto a single token. */
679
692
  :host([inverted]) .button--tertiary {
680
- --hx-button-bg: var(--hx-color-border-on-dark-subtle, rgba(255, 255, 255, 0.1));
693
+ --hx-button-bg: var(--hx-color-surface-on-dark-overlay-subtle, rgba(255, 255, 255, 0.1));
681
694
  --hx-button-border-color: transparent;
682
695
  }
683
696
 
684
697
  :host([inverted]) .button--tertiary:hover {
685
- --hx-button-bg: var(--hx-color-border-on-dark-default, rgba(255, 255, 255, 0.3));
698
+ --hx-button-bg: var(--hx-color-surface-on-dark-overlay-default, rgba(255, 255, 255, 0.3));
686
699
  }
687
700
 
688
701
  /* Ghost inverted — transparent base, translucent hover bg */
@@ -694,7 +707,7 @@
694
707
  :host([inverted]) .button--ghost:hover {
695
708
  --hx-button-bg: var(
696
709
  --hx-button-inverted-ghost-hover-bg,
697
- var(--hx-color-border-on-dark-default, rgba(255, 255, 255, 0.3))
710
+ var(--hx-color-surface-on-dark-overlay-default, rgba(255, 255, 255, 0.3))
698
711
  );
699
712
  }
700
713
 
@@ -704,7 +717,7 @@
704
717
  }
705
718
 
706
719
  :host([inverted]) .button--outline:hover {
707
- --hx-button-bg: var(--hx-color-border-on-dark-default, rgba(255, 255, 255, 0.3));
720
+ --hx-button-bg: var(--hx-color-surface-on-dark-overlay-default, rgba(255, 255, 255, 0.3));
708
721
  }
709
722
 
710
723
  /* ─── Prefix / Suffix / Label ─── */
@@ -1519,10 +1532,7 @@
1519
1532
 
1520
1533
  .link:focus-visible {
1521
1534
  outline: var(--hx-focus-ring-width, 2px) solid
1522
- var(
1523
- --hx-link-focus-ring-color,
1524
- var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078))
1525
- );
1535
+ var(--hx-link-focus-ring-color, var(--hx-focus-ring-color, #0f7078));
1526
1536
  outline-offset: var(--hx-focus-ring-offset, 2px);
1527
1537
  border-radius: var(--hx-border-radius-sm, 0.25rem);
1528
1538
  }
@@ -106,8 +106,7 @@
106
106
  }
107
107
 
108
108
  .code-snippet__copy-button:focus-visible {
109
- outline: var(--hx-focus-ring-width, 2px) solid
110
- var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078));
109
+ outline: var(--hx-focus-ring-width, 2px) solid var(--hx-focus-ring-color, #0f7078);
111
110
  outline-offset: var(--hx-focus-ring-offset, 2px);
112
111
  }
113
112
 
@@ -148,8 +147,7 @@
148
147
  }
149
148
 
150
149
  .code-snippet__expand-button:focus-visible {
151
- outline: var(--hx-focus-ring-width, 2px) solid
152
- var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078));
150
+ outline: var(--hx-focus-ring-width, 2px) solid var(--hx-focus-ring-color, #0f7078);
153
151
  outline-offset: var(--hx-focus-ring-offset, 2px);
154
152
  }
155
153
 
@@ -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
  }