@helixui/library 3.7.0 → 3.8.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 (248) hide show
  1. package/custom-elements.json +1926 -303
  2. package/dist/components/hx-action-bar/hx-action-bar.d.ts +18 -0
  3. package/dist/components/hx-action-bar/hx-action-bar.d.ts.map +1 -1
  4. package/dist/components/hx-action-bar/hx-action-bar.styles.d.ts.map +1 -1
  5. package/dist/components/hx-action-bar/index.js +1 -1
  6. package/dist/components/hx-banner/hx-banner.d.ts +19 -0
  7. package/dist/components/hx-banner/hx-banner.d.ts.map +1 -1
  8. package/dist/components/hx-breadcrumb/hx-breadcrumb-item.d.ts.map +1 -1
  9. package/dist/components/hx-breadcrumb/hx-breadcrumb-item.styles.d.ts.map +1 -1
  10. package/dist/components/hx-breadcrumb/hx-breadcrumb.d.ts +18 -0
  11. package/dist/components/hx-breadcrumb/hx-breadcrumb.d.ts.map +1 -1
  12. package/dist/components/hx-breadcrumb/index.js +1 -1
  13. package/dist/components/hx-button/hx-button.styles.d.ts.map +1 -1
  14. package/dist/components/hx-button/index.js +1 -1
  15. package/dist/components/hx-button-group/hx-button-group.d.ts +47 -0
  16. package/dist/components/hx-button-group/hx-button-group.d.ts.map +1 -1
  17. package/dist/components/hx-button-group/index.js +1 -1
  18. package/dist/components/hx-checkbox/hx-checkbox.styles.d.ts.map +1 -1
  19. package/dist/components/hx-checkbox/index.js +1 -1
  20. package/dist/components/hx-checkbox-group/hx-checkbox-group.d.ts +36 -0
  21. package/dist/components/hx-checkbox-group/hx-checkbox-group.d.ts.map +1 -1
  22. package/dist/components/hx-checkbox-group/hx-checkbox-group.styles.d.ts.map +1 -1
  23. package/dist/components/hx-checkbox-group/index.js +1 -1
  24. package/dist/components/hx-clinical-status/hx-clinical-status.d.ts +19 -0
  25. package/dist/components/hx-clinical-status/hx-clinical-status.d.ts.map +1 -1
  26. package/dist/components/hx-color-picker/hx-color-picker.d.ts +18 -0
  27. package/dist/components/hx-color-picker/hx-color-picker.d.ts.map +1 -1
  28. package/dist/components/hx-color-picker/hx-color-picker.styles.d.ts.map +1 -1
  29. package/dist/components/hx-color-picker/index.js +1 -1
  30. package/dist/components/hx-combobox/hx-combobox.d.ts +18 -0
  31. package/dist/components/hx-combobox/hx-combobox.d.ts.map +1 -1
  32. package/dist/components/hx-copy-button/hx-copy-button.d.ts +18 -0
  33. package/dist/components/hx-copy-button/hx-copy-button.d.ts.map +1 -1
  34. package/dist/components/hx-copy-button/hx-copy-button.styles.d.ts.map +1 -1
  35. package/dist/components/hx-copy-button/index.js +1 -1
  36. package/dist/components/hx-date-picker/hx-date-picker.d.ts +18 -0
  37. package/dist/components/hx-date-picker/hx-date-picker.d.ts.map +1 -1
  38. package/dist/components/hx-date-picker/hx-date-picker.styles.d.ts.map +1 -1
  39. package/dist/components/hx-date-picker/index.js +1 -1
  40. package/dist/components/hx-drawer/hx-drawer.d.ts +18 -0
  41. package/dist/components/hx-drawer/hx-drawer.d.ts.map +1 -1
  42. package/dist/components/hx-dropdown/hx-dropdown.d.ts +18 -0
  43. package/dist/components/hx-dropdown/hx-dropdown.d.ts.map +1 -1
  44. package/dist/components/hx-dropdown/hx-dropdown.styles.d.ts.map +1 -1
  45. package/dist/components/hx-dropdown/index.js +1 -1
  46. package/dist/components/hx-field/hx-field.d.ts +17 -0
  47. package/dist/components/hx-field/hx-field.d.ts.map +1 -1
  48. package/dist/components/hx-field-label/hx-field-label.d.ts +17 -0
  49. package/dist/components/hx-field-label/hx-field-label.d.ts.map +1 -1
  50. package/dist/components/hx-file-upload/hx-file-upload.d.ts +18 -0
  51. package/dist/components/hx-file-upload/hx-file-upload.d.ts.map +1 -1
  52. package/dist/components/hx-form/hx-form.d.ts +19 -0
  53. package/dist/components/hx-form/hx-form.d.ts.map +1 -1
  54. package/dist/components/hx-help-text/hx-help-text.d.ts +17 -0
  55. package/dist/components/hx-help-text/hx-help-text.d.ts.map +1 -1
  56. package/dist/components/hx-icon-button/hx-icon-button.d.ts +18 -0
  57. package/dist/components/hx-icon-button/hx-icon-button.d.ts.map +1 -1
  58. package/dist/components/hx-menu/hx-menu.d.ts +18 -0
  59. package/dist/components/hx-menu/hx-menu.d.ts.map +1 -1
  60. package/dist/components/hx-nav/hx-nav.d.ts +18 -0
  61. package/dist/components/hx-nav/hx-nav.d.ts.map +1 -1
  62. package/dist/components/hx-nav/hx-nav.styles.d.ts.map +1 -1
  63. package/dist/components/hx-nav/index.js +1 -1
  64. package/dist/components/hx-number-input/hx-number-input.d.ts +18 -0
  65. package/dist/components/hx-number-input/hx-number-input.d.ts.map +1 -1
  66. package/dist/components/hx-number-input/index.js +1 -1
  67. package/dist/components/hx-overflow-menu/hx-overflow-menu.d.ts +18 -0
  68. package/dist/components/hx-overflow-menu/hx-overflow-menu.d.ts.map +1 -1
  69. package/dist/components/hx-popover/hx-popover.d.ts +18 -0
  70. package/dist/components/hx-popover/hx-popover.d.ts.map +1 -1
  71. package/dist/components/hx-popover/hx-popover.styles.d.ts.map +1 -1
  72. package/dist/components/hx-popover/index.js +1 -1
  73. package/dist/components/hx-popup/hx-popup.d.ts +18 -0
  74. package/dist/components/hx-popup/hx-popup.d.ts.map +1 -1
  75. package/dist/components/hx-popup/hx-popup.styles.d.ts.map +1 -1
  76. package/dist/components/hx-popup/index.js +1 -1
  77. package/dist/components/hx-radio-group/hx-radio-group.d.ts +18 -0
  78. package/dist/components/hx-radio-group/hx-radio-group.d.ts.map +1 -1
  79. package/dist/components/hx-radio-group/hx-radio-group.styles.d.ts.map +1 -1
  80. package/dist/components/hx-radio-group/hx-radio.styles.d.ts.map +1 -1
  81. package/dist/components/hx-radio-group/index.js +1 -1
  82. package/dist/components/hx-rating/hx-rating.d.ts +19 -0
  83. package/dist/components/hx-rating/hx-rating.d.ts.map +1 -1
  84. package/dist/components/hx-select/hx-select.d.ts +18 -0
  85. package/dist/components/hx-select/hx-select.d.ts.map +1 -1
  86. package/dist/components/hx-side-nav/hx-side-nav.d.ts +18 -0
  87. package/dist/components/hx-side-nav/hx-side-nav.d.ts.map +1 -1
  88. package/dist/components/hx-side-nav/hx-side-nav.styles.d.ts.map +1 -1
  89. package/dist/components/hx-side-nav/index.js +1 -1
  90. package/dist/components/hx-slider/hx-slider.d.ts +19 -0
  91. package/dist/components/hx-slider/hx-slider.d.ts.map +1 -1
  92. package/dist/components/hx-split-button/hx-split-button.d.ts +18 -0
  93. package/dist/components/hx-split-button/hx-split-button.d.ts.map +1 -1
  94. package/dist/components/hx-split-button/hx-split-button.styles.d.ts.map +1 -1
  95. package/dist/components/hx-split-button/index.js +1 -1
  96. package/dist/components/hx-switch/hx-switch.d.ts +18 -0
  97. package/dist/components/hx-switch/hx-switch.d.ts.map +1 -1
  98. package/dist/components/hx-switch/hx-switch.styles.d.ts.map +1 -1
  99. package/dist/components/hx-switch/index.js +1 -1
  100. package/dist/components/hx-tabs/hx-tab.styles.d.ts.map +1 -1
  101. package/dist/components/hx-tabs/hx-tabs.d.ts +18 -0
  102. package/dist/components/hx-tabs/hx-tabs.d.ts.map +1 -1
  103. package/dist/components/hx-tabs/index.js +1 -1
  104. package/dist/components/hx-text-input/hx-text-input.styles.d.ts.map +1 -1
  105. package/dist/components/hx-text-input/index.js +1 -1
  106. package/dist/components/hx-textarea/hx-textarea.d.ts +18 -0
  107. package/dist/components/hx-textarea/hx-textarea.d.ts.map +1 -1
  108. package/dist/components/hx-time-picker/hx-time-picker.d.ts +18 -0
  109. package/dist/components/hx-time-picker/hx-time-picker.d.ts.map +1 -1
  110. package/dist/components/hx-time-picker/hx-time-picker.styles.d.ts.map +1 -1
  111. package/dist/components/hx-time-picker/index.js +1 -1
  112. package/dist/components/hx-toast/hx-toast.d.ts +19 -0
  113. package/dist/components/hx-toast/hx-toast.d.ts.map +1 -1
  114. package/dist/components/hx-toggle-button/hx-toggle-button.d.ts +18 -0
  115. package/dist/components/hx-toggle-button/hx-toggle-button.d.ts.map +1 -1
  116. package/dist/components/hx-toggle-button/hx-toggle-button.styles.d.ts.map +1 -1
  117. package/dist/components/hx-toggle-button/index.js +1 -1
  118. package/dist/components/hx-tooltip/hx-tooltip.d.ts +18 -0
  119. package/dist/components/hx-tooltip/hx-tooltip.d.ts.map +1 -1
  120. package/dist/components/hx-tooltip/hx-tooltip.styles.d.ts.map +1 -1
  121. package/dist/components/hx-tooltip/index.js +1 -1
  122. package/dist/components/hx-top-nav/hx-top-nav.d.ts +18 -0
  123. package/dist/components/hx-top-nav/hx-top-nav.d.ts.map +1 -1
  124. package/dist/components/hx-top-nav/hx-top-nav.styles.d.ts.map +1 -1
  125. package/dist/components/hx-top-nav/index.js +1 -1
  126. package/dist/css/helix-all.css +239 -30
  127. package/dist/css/helix-core.css +4 -1
  128. package/dist/css/helix-forms.css +100 -15
  129. package/dist/css/helix-navigation.css +43 -2
  130. package/dist/css/helix-overlay.css +53 -0
  131. package/dist/css/helix-tokens.css +13 -12
  132. package/dist/css/helix-utility.css +39 -12
  133. package/dist/css/hx-action-bar.css +12 -0
  134. package/dist/css/hx-button.css +4 -1
  135. package/dist/css/hx-checkbox-group.css +11 -0
  136. package/dist/css/hx-checkbox.css +10 -0
  137. package/dist/css/hx-color-picker.css +14 -1
  138. package/dist/css/hx-copy-button.css +5 -2
  139. package/dist/css/hx-date-picker.css +6 -1
  140. package/dist/css/hx-dropdown.css +13 -0
  141. package/dist/css/hx-nav.css +24 -2
  142. package/dist/css/hx-number-input.css +8 -8
  143. package/dist/css/hx-popover.css +13 -0
  144. package/dist/css/hx-popup.css +14 -0
  145. package/dist/css/hx-radio-group.css +10 -0
  146. package/dist/css/hx-side-nav.css +7 -0
  147. package/dist/css/hx-split-button.css +22 -10
  148. package/dist/css/hx-switch.css +19 -1
  149. package/dist/css/hx-text-input.css +4 -1
  150. package/dist/css/hx-time-picker.css +7 -2
  151. package/dist/css/hx-toggle-button.css +11 -1
  152. package/dist/css/hx-tooltip.css +13 -0
  153. package/dist/css/hx-top-nav.css +12 -0
  154. package/dist/css/index.css +1 -1
  155. package/dist/css/manifest.json +40 -12
  156. package/dist/index.js +24 -24
  157. package/dist/shared/{hx-action-bar-CitgcpGv.js → hx-action-bar-BlEG4aZv.js} +41 -29
  158. package/dist/shared/hx-action-bar-BlEG4aZv.js.map +1 -0
  159. package/dist/shared/hx-banner-fpRnciIO.js.map +1 -1
  160. package/dist/shared/{hx-breadcrumb-item-3tKppF9h.js → hx-breadcrumb-item-D8xYqe3s.js} +56 -43
  161. package/dist/shared/hx-breadcrumb-item-D8xYqe3s.js.map +1 -0
  162. package/dist/shared/{hx-button-rRNmD4fd.js → hx-button-DOZTZnz-.js} +18 -15
  163. package/dist/shared/hx-button-DOZTZnz-.js.map +1 -0
  164. package/dist/shared/hx-button-group-D3QUmSzl.js +248 -0
  165. package/dist/shared/hx-button-group-D3QUmSzl.js.map +1 -0
  166. package/dist/shared/{hx-checkbox-hPlIw6Lb.js → hx-checkbox-DcgyGS9V.js} +30 -20
  167. package/dist/shared/hx-checkbox-DcgyGS9V.js.map +1 -0
  168. package/dist/shared/{hx-checkbox-group-D5piJLY8.js → hx-checkbox-group-C0q6HDqn.js} +101 -58
  169. package/dist/shared/hx-checkbox-group-C0q6HDqn.js.map +1 -0
  170. package/dist/shared/hx-clinical-status-D3XQIOqX.js.map +1 -1
  171. package/dist/shared/{hx-color-picker-DBwJzT5f.js → hx-color-picker-CYjx8i8R.js} +97 -84
  172. package/dist/shared/hx-color-picker-CYjx8i8R.js.map +1 -0
  173. package/dist/shared/hx-combobox-NgJaLbs2.js.map +1 -1
  174. package/dist/shared/{hx-copy-button-sUVuikyH.js → hx-copy-button-DJirFCUL.js} +18 -15
  175. package/dist/shared/hx-copy-button-DJirFCUL.js.map +1 -0
  176. package/dist/shared/{hx-date-picker-DSKDkCy1.js → hx-date-picker-0PtEav0K.js} +66 -61
  177. package/dist/shared/hx-date-picker-0PtEav0K.js.map +1 -0
  178. package/dist/shared/hx-drawer-CM_upadk.js.map +1 -1
  179. package/dist/shared/{hx-dropdown-D626S2ZG.js → hx-dropdown-xHwTJecv.js} +44 -31
  180. package/dist/shared/hx-dropdown-xHwTJecv.js.map +1 -0
  181. package/dist/shared/hx-field-label-BVRyyKeh.js.map +1 -1
  182. package/dist/shared/hx-field-zw0U1KVi.js.map +1 -1
  183. package/dist/shared/hx-file-upload-D3rKROK5.js.map +1 -1
  184. package/dist/shared/hx-form-CkChEATa.js.map +1 -1
  185. package/dist/shared/hx-help-text-Xb2Yr8x2.js.map +1 -1
  186. package/dist/shared/hx-icon-button-B2BdVdyK.js.map +1 -1
  187. package/dist/shared/hx-menu-divider-A6Guuzi_.js.map +1 -1
  188. package/dist/shared/{hx-nav-ldFM3Fle.js → hx-nav-ChMTfn7o.js} +66 -44
  189. package/dist/shared/hx-nav-ChMTfn7o.js.map +1 -0
  190. package/dist/shared/{hx-nav-item-CODtUlew.js → hx-nav-item-ClN17f1y.js} +62 -55
  191. package/dist/shared/hx-nav-item-ClN17f1y.js.map +1 -0
  192. package/dist/shared/{hx-number-input-yUzFOSC1.js → hx-number-input-MggsT7F0.js} +13 -13
  193. package/dist/shared/hx-number-input-MggsT7F0.js.map +1 -0
  194. package/dist/shared/hx-overflow-menu-DFjJAziP.js.map +1 -1
  195. package/dist/shared/{hx-popover-BAlAFOH9.js → hx-popover-BjB0nkcq.js} +51 -38
  196. package/dist/shared/hx-popover-BjB0nkcq.js.map +1 -0
  197. package/dist/shared/{hx-popup-COUXXZ9X.js → hx-popup-BiV_2evC.js} +59 -45
  198. package/dist/shared/hx-popup-BiV_2evC.js.map +1 -0
  199. package/dist/shared/{hx-radio-CY4kQfZw.js → hx-radio-BY4zpwdh.js} +45 -27
  200. package/dist/shared/hx-radio-BY4zpwdh.js.map +1 -0
  201. package/dist/shared/hx-rating-C3QP53k9.js.map +1 -1
  202. package/dist/shared/hx-select-DahFehiZ.js.map +1 -1
  203. package/dist/shared/hx-slider-Blmv_rwS.js.map +1 -1
  204. package/dist/shared/{hx-split-button-Ddle8iVx.js → hx-split-button-CdNz1XAu.js} +62 -50
  205. package/dist/shared/hx-split-button-CdNz1XAu.js.map +1 -0
  206. package/dist/shared/{hx-switch-TvKGvZJz.js → hx-switch-BCXuNxEH.js} +42 -24
  207. package/dist/shared/hx-switch-BCXuNxEH.js.map +1 -0
  208. package/dist/shared/{hx-tab-panel-DzsX8BHV.js → hx-tab-panel-BfisavKo.js} +47 -32
  209. package/dist/shared/hx-tab-panel-BfisavKo.js.map +1 -0
  210. package/dist/shared/{hx-text-input-D6FlOZM-.js → hx-text-input-V5sQOpDh.js} +5 -2
  211. package/dist/shared/hx-text-input-V5sQOpDh.js.map +1 -0
  212. package/dist/shared/hx-textarea-CNG590KY.js.map +1 -1
  213. package/dist/shared/{hx-time-picker-Bo7FWzmf.js → hx-time-picker-DfJkBwcX.js} +41 -36
  214. package/dist/shared/hx-time-picker-DfJkBwcX.js.map +1 -0
  215. package/dist/shared/{hx-toggle-button-DSJeFlb0.js → hx-toggle-button-xNVYeA3X.js} +37 -27
  216. package/dist/shared/hx-toggle-button-xNVYeA3X.js.map +1 -0
  217. package/dist/shared/{hx-tooltip-DVqtKPCD.js → hx-tooltip-CamO-9nd.js} +24 -11
  218. package/dist/shared/hx-tooltip-CamO-9nd.js.map +1 -0
  219. package/dist/shared/{hx-top-nav-DP6OFS8C.js → hx-top-nav-CsTxOtVI.js} +26 -14
  220. package/dist/shared/hx-top-nav-CsTxOtVI.js.map +1 -0
  221. package/dist/shared/toast-factory-Dht3pVsw.js.map +1 -1
  222. package/figma-inventory.json +1121 -345
  223. package/package.json +2 -2
  224. package/dist/shared/hx-action-bar-CitgcpGv.js.map +0 -1
  225. package/dist/shared/hx-breadcrumb-item-3tKppF9h.js.map +0 -1
  226. package/dist/shared/hx-button-group-4NUBpkyC.js +0 -181
  227. package/dist/shared/hx-button-group-4NUBpkyC.js.map +0 -1
  228. package/dist/shared/hx-button-rRNmD4fd.js.map +0 -1
  229. package/dist/shared/hx-checkbox-group-D5piJLY8.js.map +0 -1
  230. package/dist/shared/hx-checkbox-hPlIw6Lb.js.map +0 -1
  231. package/dist/shared/hx-color-picker-DBwJzT5f.js.map +0 -1
  232. package/dist/shared/hx-copy-button-sUVuikyH.js.map +0 -1
  233. package/dist/shared/hx-date-picker-DSKDkCy1.js.map +0 -1
  234. package/dist/shared/hx-dropdown-D626S2ZG.js.map +0 -1
  235. package/dist/shared/hx-nav-item-CODtUlew.js.map +0 -1
  236. package/dist/shared/hx-nav-ldFM3Fle.js.map +0 -1
  237. package/dist/shared/hx-number-input-yUzFOSC1.js.map +0 -1
  238. package/dist/shared/hx-popover-BAlAFOH9.js.map +0 -1
  239. package/dist/shared/hx-popup-COUXXZ9X.js.map +0 -1
  240. package/dist/shared/hx-radio-CY4kQfZw.js.map +0 -1
  241. package/dist/shared/hx-split-button-Ddle8iVx.js.map +0 -1
  242. package/dist/shared/hx-switch-TvKGvZJz.js.map +0 -1
  243. package/dist/shared/hx-tab-panel-DzsX8BHV.js.map +0 -1
  244. package/dist/shared/hx-text-input-D6FlOZM-.js.map +0 -1
  245. package/dist/shared/hx-time-picker-Bo7FWzmf.js.map +0 -1
  246. package/dist/shared/hx-toggle-button-DSJeFlb0.js.map +0 -1
  247. package/dist/shared/hx-tooltip-DVqtKPCD.js.map +0 -1
  248. package/dist/shared/hx-top-nav-DP6OFS8C.js.map +0 -1
@@ -72,6 +72,16 @@
72
72
 
73
73
  /* ─── Focus Ring ─── */
74
74
 
75
+ /*
76
+ * Suppress the browser default ~1px host outline. Without this, the formal
77
+ * AAA audit harness (which measures computed outline-width on the focused
78
+ * host) records a sub-2px outline and reports WCAG 2.4.13 Partially Supports.
79
+ * The visual focus indicator is rendered on the inner .checkbox__box below.
80
+ */
81
+ :host {
82
+ outline: none;
83
+ }
84
+
75
85
  /*
76
86
  * Host-focus path: on the modern (IDL element-references) render branch the
77
87
  * host is the tabbable surface (tabindex=0) and the inner input is demoted
@@ -316,6 +326,17 @@
316
326
  cursor: not-allowed;
317
327
  }
318
328
 
329
+ /*
330
+ * AAA 2.4.13 Focus Appearance — host-level focus ring (group is focusable
331
+ * via roving tabindex in Tier-2). Token-driven: --hx-focus-ring-width
332
+ * resolves to ≥2px.
333
+ */
334
+ :host(:focus-visible) {
335
+ outline: var(--hx-focus-ring-width, 2px) solid
336
+ var(--hx-checkbox-group-focus-ring-color, var(--hx-focus-ring-color, #0f7078));
337
+ outline-offset: var(--hx-focus-ring-offset, 2px);
338
+ }
339
+
319
340
  * {
320
341
  box-sizing: border-box;
321
342
  }
@@ -461,6 +482,10 @@
461
482
  background: var(--hx-color-neutral-0, #ffffff);
462
483
  cursor: pointer;
463
484
  transition: border-color var(--hx-transition-fast, 150ms ease);
485
+ /* WCAG 2.5.5 AAA Target Size (Enhanced): 44×44 minimum.
486
+ Bound to --hx-touch-target-min so the trigger clears the AAA-strict
487
+ floor at default sizing. */
488
+ min-height: var(--hx-touch-target-min, 2.75rem);
464
489
  }
465
490
  .trigger:hover:not([disabled]) {
466
491
  border-color: var(
@@ -621,13 +646,20 @@
621
646
  }
622
647
  .format-btn {
623
648
  flex-shrink: 0;
649
+ /* WCAG 2.5.5 (Enhanced) AAA — interactive panel controls must clear
650
+ 44×44. Without min-width/min-height the format toggle collapses to
651
+ its label box (~44×24 in default rendering, sub-44 on the y-axis). */
652
+ min-width: var(--hx-touch-target-min, 2.75rem);
653
+ min-height: var(--hx-touch-target-min, 2.75rem);
624
654
  padding: var(--hx-space-1, 0.25rem) var(--hx-space-2, 0.5rem);
625
655
  background: var(--hx-color-neutral-100, #ebeee9);
626
656
  border: var(--hx-border-width-thin, 1px) solid var(--hx-color-neutral-300, #b6bfb9);
627
657
  border-radius: var(--hx-border-radius-sm, 0.25rem);
628
658
  cursor: pointer;
629
659
  font-size: var(--hx-font-size-xs, 0.75rem);
630
- color: var(--hx-color-neutral-600, #4a5362);
660
+ /* AAA 1.4.6: 12px label vs neutral-100 must be ≥7:1; neutral-700 = 9.34:1
661
+ (neutral-600 was 6.63:1, a tight AAA miss). */
662
+ color: var(--hx-color-neutral-700, #313e4b);
631
663
  text-transform: uppercase;
632
664
  font-weight: var(--hx-font-weight-semibold, 600);
633
665
  letter-spacing: 0.05em;
@@ -635,6 +667,8 @@
635
667
  .color-input {
636
668
  flex: 1;
637
669
  min-width: 0;
670
+ /* WCAG 2.5.5 (Enhanced) AAA — text input must clear 44×44. */
671
+ min-height: var(--hx-touch-target-min, 2.75rem);
638
672
  padding: var(--hx-space-1, 0.25rem) var(--hx-space-2, 0.5rem);
639
673
  border: var(--hx-border-width-thin, 1px) solid var(--hx-color-neutral-300, #b6bfb9);
640
674
  border-radius: var(--hx-border-radius-sm, 0.25rem);
@@ -1217,7 +1251,8 @@
1217
1251
  font-size: var(--hx-font-size-md, 1rem);
1218
1252
  color: var(--hx-date-picker-color, var(--hx-color-text-strong, #202b39));
1219
1253
  line-height: var(--hx-line-height-normal, 1.5);
1220
- min-height: var(--hx-size-10, 2.5rem);
1254
+ /* WCAG 2.5.5 (Enhanced) AAA — primary input surface must meet 44×44. */
1255
+ min-height: var(--hx-touch-target-min, 2.75rem);
1221
1256
  width: 100%;
1222
1257
  cursor: default;
1223
1258
  }
@@ -1238,6 +1273,10 @@
1238
1273
  display: flex;
1239
1274
  align-items: center;
1240
1275
  justify-content: center;
1276
+ /* WCAG 2.5.5 (Enhanced) AAA — calendar trigger must clear 44×44.
1277
+ Without min-width the icon button collapses to ~41 px wide. */
1278
+ min-width: var(--hx-touch-target-min, 2.75rem);
1279
+ min-height: var(--hx-touch-target-min, 2.75rem);
1241
1280
  padding: 0 var(--hx-space-3, 0.75rem);
1242
1281
  border: none;
1243
1282
  border-left: var(--hx-border-width-thin, 1px) solid
@@ -2155,13 +2194,13 @@
2155
2194
  .field__input-wrapper:focus-within {
2156
2195
  border-color: var(--hx-number-input-focus-ring-color, var(--hx-focus-ring-color));
2157
2196
  /* Fallback for Safari < 16.2 (no color-mix support) */
2158
- box-shadow: 0 0 0 var(--hx-focus-ring-width)
2197
+ box-shadow: 0 0 0 var(--hx-focus-ring-width, 2px)
2159
2198
  var(--hx-number-input-focus-ring-color, var(--hx-focus-ring-color));
2160
- box-shadow: 0 0 0 var(--hx-focus-ring-width)
2199
+ box-shadow: 0 0 0 var(--hx-focus-ring-width, 2px)
2161
2200
  color-mix(
2162
2201
  in srgb,
2163
2202
  var(--hx-number-input-focus-ring-color, var(--hx-focus-ring-color))
2164
- calc(var(--hx-focus-ring-opacity) * 100%),
2203
+ calc(var(--hx-focus-ring-opacity, 0.25) * 100%),
2165
2204
  transparent
2166
2205
  );
2167
2206
  }
@@ -2175,13 +2214,13 @@
2175
2214
  .field--error .field__input-wrapper:focus-within {
2176
2215
  border-color: var(--hx-number-input-error-color, var(--hx-color-error-500, #e5493e));
2177
2216
  /* Fallback for Safari < 16.2 (no color-mix support) */
2178
- box-shadow: 0 0 0 var(--hx-focus-ring-width)
2217
+ box-shadow: 0 0 0 var(--hx-focus-ring-width, 2px)
2179
2218
  var(--hx-number-input-error-color, var(--hx-color-error-500, #e5493e));
2180
- box-shadow: 0 0 0 var(--hx-focus-ring-width)
2219
+ box-shadow: 0 0 0 var(--hx-focus-ring-width, 2px)
2181
2220
  color-mix(
2182
2221
  in srgb,
2183
2222
  var(--hx-number-input-error-color, var(--hx-color-error-500, #e5493e))
2184
- calc(var(--hx-focus-ring-opacity) * 100%),
2223
+ calc(var(--hx-focus-ring-opacity, 0.25) * 100%),
2185
2224
  transparent
2186
2225
  );
2187
2226
  }
@@ -2208,10 +2247,10 @@
2208
2247
  color: var(--hx-number-input-color, var(--hx-color-text-strong));
2209
2248
  line-height: var(--hx-line-height-normal);
2210
2249
  width: 100%;
2211
- /* Size: md (default) */
2250
+ /* Size: md (default) — WCAG 2.5.5 (Enhanced) AAA touch target. */
2212
2251
  padding: var(--hx-space-2) var(--hx-space-3);
2213
2252
  font-size: var(--hx-font-size-md);
2214
- min-height: var(--hx-size-10);
2253
+ min-height: var(--hx-touch-target-min, 2.75rem);
2215
2254
  }
2216
2255
 
2217
2256
  .field__input::placeholder {
@@ -2429,6 +2468,16 @@
2429
2468
  pointer-events: none;
2430
2469
  }
2431
2470
 
2471
+ /*
2472
+ * AAA 2.4.13 Focus Appearance — host-level focus ring for the group host
2473
+ * when it carries focus via roving tabindex. Token-driven: ≥2px width.
2474
+ */
2475
+ :host(:focus-visible) {
2476
+ outline: var(--hx-focus-ring-width, 2px) solid
2477
+ var(--hx-radio-group-focus-ring-color, var(--hx-focus-ring-color, #0f7078));
2478
+ outline-offset: var(--hx-focus-ring-offset, 2px);
2479
+ }
2480
+
2432
2481
  * {
2433
2482
  box-sizing: border-box;
2434
2483
  }
@@ -3352,6 +3401,13 @@
3352
3401
  /* ── hx-switch ── */
3353
3402
  :host {
3354
3403
  display: block;
3404
+ /*
3405
+ * Suppress the browser default ~1px host outline. Without this the formal
3406
+ * AAA audit harness (which measures computed outline-width on the focused
3407
+ * host) records a sub-2px outline and reports WCAG 2.4.13 Partially Supports.
3408
+ * The visual focus indicator is rendered on the inner .switch__track below.
3409
+ */
3410
+ outline: none;
3355
3411
  }
3356
3412
 
3357
3413
  :host([disabled]) {
@@ -3423,7 +3479,18 @@
3423
3479
  }
3424
3480
 
3425
3481
  .switch--checked .switch__track {
3426
- background-color: var(--hx-switch-track-checked-bg, var(--hx-color-primary-500, #429797));
3482
+ /* WCAG 1.4.6 AAA-strict 7:1: consume action.primary.bg (primary-700 since
3483
+ 3.4.0) so the checked track inherits the elevated AAA-strict action
3484
+ surface contract used by every other primary interactive surface
3485
+ (hx-button, hx-checkbox checked-bg, hx-radio checked-bg, etc.). The
3486
+ prior primary-500 fallback (#429797 in Apex) clears AA (5.20:1) but
3487
+ only resolves to ~6.11:1 in the formal harness's contrast probe —
3488
+ below the 7:1 AAA-strict floor. action.primary.bg = primary-700
3489
+ (#0F6363 in Apex) clears 7.03:1 across all 6 brands. */
3490
+ background-color: var(
3491
+ --hx-switch-track-checked-bg,
3492
+ var(--hx-color-action-primary-bg, var(--hx-color-primary-700, #0f7078))
3493
+ );
3427
3494
  }
3428
3495
 
3429
3496
  .switch:not(.switch--checked) .switch__track:hover {
@@ -3825,7 +3892,10 @@
3825
3892
  font-size: var(--_text-input-font-size);
3826
3893
  color: var(--_text-input-color);
3827
3894
  line-height: var(--hx-line-height-normal, 1.5);
3828
- min-height: var(--hx-size-10, 2.5rem);
3895
+ /* WCAG 2.5.5 (Enhanced) AAA — primary input surface must meet 44×44.
3896
+ --hx-touch-target-min resolves to 2.75rem (44px); --hx-size-10 alone
3897
+ resolves to 2.5rem (40px) and fails AAA on the inner input. */
3898
+ min-height: var(--hx-touch-target-min, 2.75rem);
3829
3899
  width: 100%;
3830
3900
  }
3831
3901
 
@@ -4299,7 +4369,8 @@
4299
4369
  font-size: var(--hx-font-size-md, 1rem);
4300
4370
  color: var(--hx-time-picker-color, var(--hx-color-text-strong, #202b39));
4301
4371
  line-height: var(--hx-line-height-normal, 1.5);
4302
- min-height: var(--hx-size-10, 2.5rem);
4372
+ /* WCAG 2.5.5 (Enhanced) AAA — primary input surface must meet 44×44. */
4373
+ min-height: var(--hx-touch-target-min, 2.75rem);
4303
4374
  width: 100%;
4304
4375
  cursor: text;
4305
4376
  }
@@ -4319,7 +4390,11 @@
4319
4390
  color: var(--hx-time-picker-chevron-color, var(--hx-color-text-muted, #4a5362));
4320
4391
  cursor: pointer;
4321
4392
  height: 100%;
4322
- min-height: var(--hx-size-10, 2.5rem);
4393
+ /* WCAG 2.5.5 (Enhanced) AAA — toggle button must meet 44×44 in
4394
+ BOTH dimensions; without min-width the icon button collapses to
4395
+ ~41 px wide and fails the matrix audit. */
4396
+ min-width: var(--hx-touch-target-min, 2.75rem);
4397
+ min-height: var(--hx-touch-target-min, 2.75rem);
4323
4398
  flex-shrink: 0;
4324
4399
  border-inline-start: var(--hx-border-width-thin, 1px) solid
4325
4400
  var(--hx-time-picker-border-color, var(--hx-color-border-strong, #66787b));
@@ -4467,6 +4542,13 @@
4467
4542
  /* ── hx-toggle-button ── */
4468
4543
  :host {
4469
4544
  display: inline-block;
4545
+ /*
4546
+ * Suppress the browser default ~1px host outline. Without this the formal
4547
+ * AAA audit harness (which measures computed outline-width on the focused
4548
+ * host) records a sub-2px outline and reports WCAG 2.4.13 Partially Supports.
4549
+ * The visual focus indicator is rendered on the inner .button below.
4550
+ */
4551
+ outline: none;
4470
4552
  }
4471
4553
 
4472
4554
  :host([disabled]) {
@@ -4544,7 +4626,10 @@
4544
4626
  .button--md {
4545
4627
  padding: var(--hx-space-2, 0.5rem) var(--hx-space-4, 1rem);
4546
4628
  font-size: var(--hx-font-size-md, 1rem);
4547
- min-height: var(--hx-size-10, 2.5rem);
4629
+ /* WCAG 2.5.5 AAA Target Size (Enhanced): 44×44 minimum.
4630
+ Bound to --hx-touch-target-min so the default md variant clears the
4631
+ AAA-strict floor without requiring consumers to opt into sm or lg. */
4632
+ min-height: var(--hx-touch-target-min, 2.75rem);
4548
4633
  }
4549
4634
 
4550
4635
  .button--lg {
@@ -166,6 +166,16 @@
166
166
  align-items: center;
167
167
  gap: var(--hx-space-1, 0.25rem);
168
168
  padding: var(--hx-nav-item-padding, var(--hx-space-2, 0.5rem) var(--hx-space-3, 0.75rem));
169
+ /*
170
+ * WCAG 2.5.5 (Enhanced) AAA — nav links rendered with default padding
171
+ * land at ~37 px tall (8 px + 1.5 line-height + 8 px). The link
172
+ * content is first-party (rendered via consumer-supplied props on
173
+ * <hx-nav-item>), so the slotted-content carve-out does not apply —
174
+ * this is a real component obligation. Bind --hx-nav-link-min-height
175
+ * to --hx-touch-target-min (2.75rem / 44 px) to grow the interactive
176
+ * area without enlarging the visible label.
177
+ */
178
+ min-height: var(--hx-nav-link-min-height, var(--hx-touch-target-min, 2.75rem));
169
179
  color: var(--hx-nav-link-color, var(--hx-color-neutral-100, #ebeee9));
170
180
  text-decoration: none;
171
181
  border-radius: var(--hx-nav-border-radius, var(--hx-border-radius-sm, 0.25rem));
@@ -194,8 +204,20 @@
194
204
  }
195
205
 
196
206
  .nav__link--active {
197
- background-color: var(--hx-nav-link-active-bg, var(--hx-color-primary-600, #0f7078));
198
- color: var(--hx-nav-link-active-color, var(--hx-color-neutral-0, #ffffff));
207
+ background-color: var(--hx-nav-link-active-bg, var(--hx-color-action-primary-bg, #0f6363));
208
+ /* Use --hx-color-text-on-primary so the active-link text inherits the
209
+ * action-surface AAA-strict pairing (white on primary-700 in default
210
+ * themes; black on lighter primary-700 in the high-contrast theme).
211
+ * Pre-3.4.0 this consumed --hx-color-primary-600 directly which
212
+ * resolved to Apex #0F7078 + white = 5.82:1 — AAA-large only, AAA
213
+ * normal fail under WCAG 1.4.6 for body-text-sized link labels. The
214
+ * Phase 4 Tier 3 chain shift moved action.primary.bg to primary-700
215
+ * (Apex 7.03:1 with white) and consuming the action semantic here
216
+ * picks up the AAA-strict pairing across the full 6-brand matrix.
217
+ * Hardcoding white previously failed AAA-large in high-contrast
218
+ * (ratio 2.54 vs. 4.5 floor); the on-primary token resolves correctly
219
+ * in HC mode. */
220
+ color: var(--hx-nav-link-active-color, var(--hx-color-text-on-primary, #ffffff));
199
221
  }
200
222
 
201
223
  /* ─── Chevron Icon ─── */
@@ -812,8 +834,15 @@
812
834
  display: flex;
813
835
  align-items: center;
814
836
  justify-content: center;
837
+ /* Visual icon area stays 2rem (32px) — preserves the side-nav header
838
+ silhouette while the wrapping touch target grows to 44×44 to meet
839
+ WCAG 2.5.5 (Enhanced) AAA. min-width/min-height own the hit area;
840
+ width/height drive the visual painted area, but the button's
841
+ intrinsic size always matches the hit-area floor. */
815
842
  width: var(--hx-space-8, 2rem);
816
843
  height: var(--hx-space-8, 2rem);
844
+ min-width: var(--hx-touch-target-min, 2.75rem);
845
+ min-height: var(--hx-touch-target-min, 2.75rem);
817
846
  margin-inline-start: auto;
818
847
  flex-shrink: 0;
819
848
  padding: 0;
@@ -1149,6 +1178,18 @@
1149
1178
  outline-offset: var(--hx-focus-ring-offset, 2px);
1150
1179
  }
1151
1180
 
1181
+ /*
1182
+ * AAA 2.4.13 Focus Appearance — enforce a ≥2px ring on slotted nav
1183
+ * controls (links, buttons, hx-link, hx-button). Slotted bare anchors
1184
+ * otherwise fall back to the 1px browser default.
1185
+ */
1186
+ ::slotted(a:focus-visible),
1187
+ ::slotted(button:focus-visible) {
1188
+ outline: var(--hx-focus-ring-width, 2px) solid
1189
+ var(--hx-top-nav-focus-ring-color, var(--hx-focus-ring-color, #0f7078));
1190
+ outline-offset: var(--hx-focus-ring-offset, 2px);
1191
+ }
1192
+
1152
1193
  .mobile-toggle__icon {
1153
1194
  width: var(--hx-space-6, 1.5rem);
1154
1195
  height: var(--hx-space-6, 1.5rem);
@@ -530,6 +530,19 @@
530
530
  display: inline-block;
531
531
  }
532
532
 
533
+ /*
534
+ * AAA 2.4.13 Focus Appearance — enforce a ≥2px focus ring on the slotted
535
+ * trigger (typically <hx-button>, <button>, or <hx-icon-button>). The host
536
+ * is a popover-container; the interactive surface is the slotted trigger.
537
+ */
538
+ ::slotted([slot='trigger']:focus-visible),
539
+ ::slotted(button:focus-visible),
540
+ ::slotted(a:focus-visible) {
541
+ outline: var(--hx-focus-ring-width, 2px) solid
542
+ var(--hx-dropdown-focus-ring-color, var(--hx-focus-ring-color, #0f7078));
543
+ outline-offset: var(--hx-focus-ring-offset, 2px);
544
+ }
545
+
533
546
  [part='panel'] {
534
547
  position: fixed;
535
548
  z-index: var(--hx-dropdown-panel-z-index, 1000);
@@ -581,6 +594,19 @@
581
594
  display: inline-block;
582
595
  }
583
596
 
597
+ /*
598
+ * AAA 2.4.13 Focus Appearance — enforce a ≥2px focus ring on the slotted
599
+ * trigger so consumers who slot bare HTML controls inherit the same ring
600
+ * width as <hx-button>. Token-driven: --hx-focus-ring-width (default 2px).
601
+ */
602
+ ::slotted([slot='trigger']:focus-visible),
603
+ ::slotted(button:focus-visible),
604
+ ::slotted(a:focus-visible) {
605
+ outline: var(--hx-focus-ring-width, 2px) solid
606
+ var(--hx-popover-focus-ring-color, var(--hx-focus-ring-color, #0f7078));
607
+ outline-offset: var(--hx-focus-ring-offset, 2px);
608
+ }
609
+
584
610
  [part='body'] {
585
611
  position: fixed;
586
612
  z-index: var(--hx-popover-z-index, 9999);
@@ -649,6 +675,20 @@
649
675
  display: inline-block;
650
676
  }
651
677
 
678
+ /*
679
+ * AAA 2.4.13 Focus Appearance — enforce a ≥2px focus ring on slotted
680
+ * trigger / anchor controls. hx-popup is a positioning primitive: it
681
+ * paints no surface itself, but slotted natives (<button>, <a>) must
682
+ * still meet the AAA ring threshold. Token-driven.
683
+ */
684
+ ::slotted([slot='anchor']:focus-visible),
685
+ ::slotted(button:focus-visible),
686
+ ::slotted(a:focus-visible) {
687
+ outline: var(--hx-focus-ring-width, 2px) solid
688
+ var(--hx-popup-focus-ring-color, var(--hx-focus-ring-color, #0f7078));
689
+ outline-offset: var(--hx-focus-ring-offset, 2px);
690
+ }
691
+
652
692
  [part='popup'] {
653
693
  position: fixed;
654
694
  z-index: var(--hx-popup-z-index, 9000);
@@ -696,6 +736,19 @@
696
736
  display: inline-block;
697
737
  }
698
738
 
739
+ /*
740
+ * AAA 2.4.13 Focus Appearance — enforce a ≥2px focus ring on the slotted
741
+ * trigger. APG forbids the tooltip body from holding focus, so the
742
+ * trigger is the only AAA-relevant focus surface. Token-driven.
743
+ */
744
+ ::slotted([slot='trigger']:focus-visible),
745
+ ::slotted(button:focus-visible),
746
+ ::slotted(a:focus-visible) {
747
+ outline: var(--hx-focus-ring-width, 2px) solid
748
+ var(--hx-tooltip-focus-ring-color, var(--hx-focus-ring-color, #0f7078));
749
+ outline-offset: var(--hx-focus-ring-offset, 2px);
750
+ }
751
+
699
752
  [part='tooltip'] {
700
753
  position: fixed;
701
754
  z-index: var(--hx-tooltip-z-index, var(--hx-z-index-tooltip, 1600));
@@ -104,11 +104,11 @@
104
104
  --hx-color-text-on-primary-strong: var(--hx-color-neutral-0);
105
105
  --hx-color-text-on-success-strong: var(--hx-color-neutral-0);
106
106
  --hx-color-text-on-error-strong: var(--hx-color-neutral-0);
107
- --hx-color-text-link: var(--hx-color-primary-600);
108
- --hx-color-text-link-hover: var(--hx-color-primary-700);
109
- --hx-color-text-link-visited: var(--hx-color-secondary-600);
110
- --hx-color-text-link-active: var(--hx-color-primary-800);
111
- --hx-color-error-text: var(--hx-color-error-600);
107
+ --hx-color-text-link: var(--hx-color-primary-700);
108
+ --hx-color-text-link-hover: var(--hx-color-primary-800);
109
+ --hx-color-text-link-visited: var(--hx-color-secondary-700);
110
+ --hx-color-text-link-active: var(--hx-color-primary-900);
111
+ --hx-color-error-text: var(--hx-color-error-700);
112
112
  --hx-color-success-text: var(--hx-color-success-700);
113
113
  --hx-color-surface-default: var(--hx-color-neutral-0);
114
114
  --hx-color-surface-raised: var(--hx-color-neutral-50);
@@ -129,15 +129,15 @@
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);
132
- --hx-color-action-primary-bg: var(--hx-color-primary-600);
132
+ --hx-color-action-primary-bg: var(--hx-color-primary-700);
133
133
  --hx-color-action-primary-bg-inverted-rest: var(--hx-color-primary-500);
134
- --hx-color-action-primary-bg-hover: var(--hx-color-primary-700);
135
- --hx-color-action-primary-bg-active: var(--hx-color-primary-800);
134
+ --hx-color-action-primary-bg-hover: var(--hx-color-primary-800);
135
+ --hx-color-action-primary-bg-active: var(--hx-color-primary-900);
136
136
  --hx-color-action-primary-bg-inverted-hover: var(--hx-color-primary-400);
137
- --hx-color-action-secondary-fg: var(--hx-color-primary-600);
138
- --hx-color-action-secondary-border: var(--hx-color-primary-600);
137
+ --hx-color-action-secondary-fg: var(--hx-color-primary-700);
138
+ --hx-color-action-secondary-border: var(--hx-color-primary-700);
139
139
  --hx-color-action-secondary-bg-hover: var(--hx-color-primary-50);
140
- --hx-color-action-ghost-fg: var(--hx-color-primary-600);
140
+ --hx-color-action-ghost-fg: var(--hx-color-primary-700);
141
141
  --hx-color-action-ghost-bg-hover: var(--hx-color-primary-50);
142
142
  --hx-color-action-danger-bg: var(--hx-color-error-500);
143
143
  --hx-color-action-danger-bg-hover: var(--hx-color-error-600);
@@ -268,7 +268,7 @@
268
268
  --hx-container-content: 72rem;
269
269
  --hx-container-narrow: 48rem;
270
270
  --hx-input-height-sm: var(--hx-size-8);
271
- --hx-input-height-md: var(--hx-size-10);
271
+ --hx-input-height-md: var(--hx-size-11);
272
272
  --hx-input-height-lg: var(--hx-size-12);
273
273
  --hx-divider-color: var(--hx-color-border-default);
274
274
  --hx-divider-width: var(--hx-border-width-thin);
@@ -496,6 +496,7 @@
496
496
  --hx-color-focus-ring: #FFFF00;
497
497
  --hx-color-selection-bg: #1AEBFF;
498
498
  --hx-color-selection-color: #000000;
499
+ --hx-color-action-primary-bg-hover: var(--hx-color-primary-600);
499
500
  --hx-color-action-primary-bg-active: var(--hx-color-primary-700);
500
501
  --hx-color-action-danger-bg-active: var(--hx-color-error-500);
501
502
  --hx-body-bg: #000000;
@@ -118,6 +118,18 @@
118
118
  flex-shrink: 0;
119
119
  }
120
120
 
121
+ /*
122
+ * AAA 2.4.13 Focus Appearance — enforce a ≥2px focus ring on slotted
123
+ * natives (e.g. bare <button>, <a>) so consumers who slot non-HELiX
124
+ * controls inherit the same indicator as the HELiX components do.
125
+ * Token-driven: --hx-focus-ring-width resolves to 2px (default).
126
+ */
127
+ ::slotted(:focus-visible) {
128
+ outline: var(--hx-focus-ring-width, 2px) solid
129
+ var(--hx-action-bar-focus-ring-color, var(--hx-focus-ring-color, #0f7078));
130
+ outline-offset: var(--hx-focus-ring-offset, 2px);
131
+ }
132
+
121
133
  /* ─── High Contrast Mode (forced-colors) ─── */
122
134
 
123
135
  @media (forced-colors: active) {
@@ -188,10 +200,13 @@
188
200
  font-size: var(--hx-font-size-sm);
189
201
  }
190
202
 
203
+ /* md — WCAG 2.5.5 AAA Target Size (Enhanced): 44×44 minimum.
204
+ Bound to --hx-touch-target-min so the default md variant clears the
205
+ AAA-strict floor without requiring consumers to opt into sm or lg. */
191
206
  .button--md {
192
207
  padding: var(--hx-space-2);
193
- min-width: var(--hx-size-10);
194
- height: var(--hx-size-10);
208
+ min-width: var(--hx-touch-target-min, 2.75rem);
209
+ min-height: var(--hx-touch-target-min, 2.75rem);
195
210
  font-size: var(--hx-font-size-md);
196
211
  }
197
212
 
@@ -502,16 +517,22 @@
502
517
  min-height: var(--hx-size-8, 2rem);
503
518
  }
504
519
 
505
- /* md */
520
+ /* md — WCAG 2.5.5 AAA Target Size (Enhanced): 44×44 minimum.
521
+ Bound to --hx-touch-target-min so the default md variant clears the
522
+ AAA-strict floor without requiring consumers to opt into sm or lg. */
506
523
  .split-button--md .split-button__primary {
507
524
  padding: var(--hx-space-2, 0.5rem) var(--hx-space-4, 1rem);
508
525
  font-size: var(--hx-font-size-md, 1rem);
509
- min-height: var(--hx-size-10, 2.5rem);
526
+ min-height: var(--hx-touch-target-min, 2.75rem);
510
527
  }
511
528
 
512
529
  .split-button--md .split-button__trigger {
513
530
  padding: var(--hx-space-2, 0.5rem) var(--hx-space-3, 0.75rem);
514
- min-height: var(--hx-size-10, 2.5rem);
531
+ /* WCAG 2.5.5 (Enhanced) AAA — chevron trigger must clear 44×44 in
532
+ BOTH dimensions. Without min-width, the trigger collapses to its
533
+ icon width (~38 px) and fails the brand-theme matrix audit. */
534
+ min-width: var(--hx-touch-target-min, 2.75rem);
535
+ min-height: var(--hx-touch-target-min, 2.75rem);
515
536
  }
516
537
 
517
538
  /* lg */
@@ -528,21 +549,27 @@
528
549
 
529
550
  /* ─── Variant: primary ─── */
530
551
 
552
+ /* Primary resting — bind through action.primary.bg (resolves to primary-600
553
+ across all 6 brands) coordinated with text.on-primary. Inline fallback
554
+ #0d1825 matches text.on-primary's resolved primitive (neutral-900) so a
555
+ cold-start without semantic tokens paints AA-tuned dark-on-teal (5.20:1)
556
+ rather than white-on-teal (3.43:1 fail). Mirrors hx-button precedent
557
+ (hx-button.styles.ts ~line 88) and Phase C structural fix. */
531
558
  .split-button--primary .split-button__primary,
532
559
  .split-button--primary .split-button__trigger {
533
- --hx-split-button-bg: var(--hx-color-primary-500, #429797);
534
- --hx-split-button-color: var(--hx-color-text-on-primary, #ffffff);
560
+ --hx-split-button-bg: var(--hx-color-action-primary-bg, #429797);
561
+ --hx-split-button-color: var(--hx-color-text-on-primary, #0d1825);
535
562
  --hx-split-button-border-color: transparent;
536
563
  --hx-split-button-divider-color: var(--hx-color-primary-900, #0b3232);
537
564
  }
538
565
 
539
- /* primary:hover — replace the universal brightness(0.9) filter (which would
540
- drop primary-500 + on-primary contrast to ~4.4:1) with an explicit swap
541
- to primary-600 and a neutral-0 foreground. Mirrors hx-button precedent. */
566
+ /* primary:hover — lift to action.primary.bg-hover (primary-700) with
567
+ text.on-primary-strong (neutral-0). Replaces the universal brightness(0.9)
568
+ filter which would degrade contrast on the resting pair. */
542
569
  .split-button--primary .split-button__primary:hover,
543
570
  .split-button--primary .split-button__trigger:hover {
544
- --hx-split-button-bg: var(--hx-color-primary-600, #0f7078);
545
- --hx-split-button-color: var(--hx-color-neutral-0, #ffffff);
571
+ --hx-split-button-bg: var(--hx-color-action-primary-bg-hover, #0f7078);
572
+ --hx-split-button-color: var(--hx-color-text-on-primary-strong, #ffffff);
546
573
  filter: none;
547
574
  }
548
575
 
@@ -116,6 +116,18 @@
116
116
  flex-shrink: 0;
117
117
  }
118
118
 
119
+ /*
120
+ * AAA 2.4.13 Focus Appearance — enforce a ≥2px focus ring on slotted
121
+ * natives (e.g. bare <button>, <a>) so consumers who slot non-HELiX
122
+ * controls inherit the same indicator as the HELiX components do.
123
+ * Token-driven: --hx-focus-ring-width resolves to 2px (default).
124
+ */
125
+ ::slotted(:focus-visible) {
126
+ outline: var(--hx-focus-ring-width, 2px) solid
127
+ var(--hx-action-bar-focus-ring-color, var(--hx-focus-ring-color, #0f7078));
128
+ outline-offset: var(--hx-focus-ring-offset, 2px);
129
+ }
130
+
119
131
  /* ─── High Contrast Mode (forced-colors) ─── */
120
132
 
121
133
  @media (forced-colors: active) {
@@ -72,7 +72,10 @@
72
72
  .button--md {
73
73
  padding: var(--hx-space-2, 0.5rem) var(--hx-space-4, 1rem);
74
74
  font-size: var(--hx-font-size-md, 1rem);
75
- min-height: var(--hx-size-10, 2.5rem);
75
+ /* WCAG 2.5.5 AAA Target Size (Enhanced): 44×44 minimum.
76
+ Bound to --hx-touch-target-min so the default md variant clears the
77
+ AAA-strict floor without requiring consumers to opt into sm or lg. */
78
+ min-height: var(--hx-touch-target-min, 2.75rem);
76
79
  }
77
80
 
78
81
  .button--lg {
@@ -8,6 +8,17 @@
8
8
  cursor: not-allowed;
9
9
  }
10
10
 
11
+ /*
12
+ * AAA 2.4.13 Focus Appearance — host-level focus ring (group is focusable
13
+ * via roving tabindex in Tier-2). Token-driven: --hx-focus-ring-width
14
+ * resolves to ≥2px.
15
+ */
16
+ :host(:focus-visible) {
17
+ outline: var(--hx-focus-ring-width, 2px) solid
18
+ var(--hx-checkbox-group-focus-ring-color, var(--hx-focus-ring-color, #0f7078));
19
+ outline-offset: var(--hx-focus-ring-offset, 2px);
20
+ }
21
+
11
22
  * {
12
23
  box-sizing: border-box;
13
24
  }
@@ -70,6 +70,16 @@
70
70
 
71
71
  /* ─── Focus Ring ─── */
72
72
 
73
+ /*
74
+ * Suppress the browser default ~1px host outline. Without this, the formal
75
+ * AAA audit harness (which measures computed outline-width on the focused
76
+ * host) records a sub-2px outline and reports WCAG 2.4.13 Partially Supports.
77
+ * The visual focus indicator is rendered on the inner .checkbox__box below.
78
+ */
79
+ :host {
80
+ outline: none;
81
+ }
82
+
73
83
  /*
74
84
  * Host-focus path: on the modern (IDL element-references) render branch the
75
85
  * host is the tabbable surface (tabindex=0) and the inner input is demoted
@@ -44,6 +44,10 @@
44
44
  background: var(--hx-color-neutral-0, #ffffff);
45
45
  cursor: pointer;
46
46
  transition: border-color var(--hx-transition-fast, 150ms ease);
47
+ /* WCAG 2.5.5 AAA Target Size (Enhanced): 44×44 minimum.
48
+ Bound to --hx-touch-target-min so the trigger clears the AAA-strict
49
+ floor at default sizing. */
50
+ min-height: var(--hx-touch-target-min, 2.75rem);
47
51
  }
48
52
  .trigger:hover:not([disabled]) {
49
53
  border-color: var(
@@ -204,13 +208,20 @@
204
208
  }
205
209
  .format-btn {
206
210
  flex-shrink: 0;
211
+ /* WCAG 2.5.5 (Enhanced) AAA — interactive panel controls must clear
212
+ 44×44. Without min-width/min-height the format toggle collapses to
213
+ its label box (~44×24 in default rendering, sub-44 on the y-axis). */
214
+ min-width: var(--hx-touch-target-min, 2.75rem);
215
+ min-height: var(--hx-touch-target-min, 2.75rem);
207
216
  padding: var(--hx-space-1, 0.25rem) var(--hx-space-2, 0.5rem);
208
217
  background: var(--hx-color-neutral-100, #ebeee9);
209
218
  border: var(--hx-border-width-thin, 1px) solid var(--hx-color-neutral-300, #b6bfb9);
210
219
  border-radius: var(--hx-border-radius-sm, 0.25rem);
211
220
  cursor: pointer;
212
221
  font-size: var(--hx-font-size-xs, 0.75rem);
213
- color: var(--hx-color-neutral-600, #4a5362);
222
+ /* AAA 1.4.6: 12px label vs neutral-100 must be ≥7:1; neutral-700 = 9.34:1
223
+ (neutral-600 was 6.63:1, a tight AAA miss). */
224
+ color: var(--hx-color-neutral-700, #313e4b);
214
225
  text-transform: uppercase;
215
226
  font-weight: var(--hx-font-weight-semibold, 600);
216
227
  letter-spacing: 0.05em;
@@ -218,6 +229,8 @@
218
229
  .color-input {
219
230
  flex: 1;
220
231
  min-width: 0;
232
+ /* WCAG 2.5.5 (Enhanced) AAA — text input must clear 44×44. */
233
+ min-height: var(--hx-touch-target-min, 2.75rem);
221
234
  padding: var(--hx-space-1, 0.25rem) var(--hx-space-2, 0.5rem);
222
235
  border: var(--hx-border-width-thin, 1px) solid var(--hx-color-neutral-300, #b6bfb9);
223
236
  border-radius: var(--hx-border-radius-sm, 0.25rem);