@helixui/library 3.6.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 (280) hide show
  1. package/custom-elements.json +2633 -805
  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-alert/hx-alert.d.ts +18 -0
  7. package/dist/components/hx-alert/hx-alert.d.ts.map +1 -1
  8. package/dist/components/hx-badge/index.js +1 -1
  9. package/dist/components/hx-banner/hx-banner.d.ts +19 -0
  10. package/dist/components/hx-banner/hx-banner.d.ts.map +1 -1
  11. package/dist/components/hx-breadcrumb/hx-breadcrumb-item.d.ts.map +1 -1
  12. package/dist/components/hx-breadcrumb/hx-breadcrumb-item.styles.d.ts.map +1 -1
  13. package/dist/components/hx-breadcrumb/hx-breadcrumb.d.ts +18 -0
  14. package/dist/components/hx-breadcrumb/hx-breadcrumb.d.ts.map +1 -1
  15. package/dist/components/hx-breadcrumb/index.js +1 -1
  16. package/dist/components/hx-button/hx-button.d.ts +18 -0
  17. package/dist/components/hx-button/hx-button.d.ts.map +1 -1
  18. package/dist/components/hx-button/hx-button.styles.d.ts.map +1 -1
  19. package/dist/components/hx-button/index.js +1 -1
  20. package/dist/components/hx-button-group/hx-button-group.d.ts +47 -0
  21. package/dist/components/hx-button-group/hx-button-group.d.ts.map +1 -1
  22. package/dist/components/hx-button-group/index.js +1 -1
  23. package/dist/components/hx-checkbox/hx-checkbox.d.ts +18 -0
  24. package/dist/components/hx-checkbox/hx-checkbox.d.ts.map +1 -1
  25. package/dist/components/hx-checkbox/hx-checkbox.styles.d.ts.map +1 -1
  26. package/dist/components/hx-checkbox/index.js +1 -1
  27. package/dist/components/hx-checkbox-group/hx-checkbox-group.d.ts +36 -0
  28. package/dist/components/hx-checkbox-group/hx-checkbox-group.d.ts.map +1 -1
  29. package/dist/components/hx-checkbox-group/hx-checkbox-group.styles.d.ts.map +1 -1
  30. package/dist/components/hx-checkbox-group/index.js +1 -1
  31. package/dist/components/hx-clinical-status/hx-clinical-status.d.ts +19 -0
  32. package/dist/components/hx-clinical-status/hx-clinical-status.d.ts.map +1 -1
  33. package/dist/components/hx-color-picker/hx-color-picker.d.ts +18 -0
  34. package/dist/components/hx-color-picker/hx-color-picker.d.ts.map +1 -1
  35. package/dist/components/hx-color-picker/hx-color-picker.styles.d.ts.map +1 -1
  36. package/dist/components/hx-color-picker/index.js +1 -1
  37. package/dist/components/hx-combobox/hx-combobox.d.ts +18 -0
  38. package/dist/components/hx-combobox/hx-combobox.d.ts.map +1 -1
  39. package/dist/components/hx-copy-button/hx-copy-button.d.ts +18 -0
  40. package/dist/components/hx-copy-button/hx-copy-button.d.ts.map +1 -1
  41. package/dist/components/hx-copy-button/hx-copy-button.styles.d.ts.map +1 -1
  42. package/dist/components/hx-copy-button/index.js +1 -1
  43. package/dist/components/hx-date-picker/hx-date-picker.d.ts +18 -0
  44. package/dist/components/hx-date-picker/hx-date-picker.d.ts.map +1 -1
  45. package/dist/components/hx-date-picker/hx-date-picker.styles.d.ts.map +1 -1
  46. package/dist/components/hx-date-picker/index.js +1 -1
  47. package/dist/components/hx-dialog/hx-dialog.d.ts +18 -0
  48. package/dist/components/hx-dialog/hx-dialog.d.ts.map +1 -1
  49. package/dist/components/hx-drawer/hx-drawer.d.ts +18 -0
  50. package/dist/components/hx-drawer/hx-drawer.d.ts.map +1 -1
  51. package/dist/components/hx-dropdown/hx-dropdown.d.ts +18 -0
  52. package/dist/components/hx-dropdown/hx-dropdown.d.ts.map +1 -1
  53. package/dist/components/hx-dropdown/hx-dropdown.styles.d.ts.map +1 -1
  54. package/dist/components/hx-dropdown/index.js +1 -1
  55. package/dist/components/hx-field/hx-field.d.ts +17 -0
  56. package/dist/components/hx-field/hx-field.d.ts.map +1 -1
  57. package/dist/components/hx-field-label/hx-field-label.d.ts +17 -0
  58. package/dist/components/hx-field-label/hx-field-label.d.ts.map +1 -1
  59. package/dist/components/hx-file-upload/hx-file-upload.d.ts +18 -0
  60. package/dist/components/hx-file-upload/hx-file-upload.d.ts.map +1 -1
  61. package/dist/components/hx-form/hx-form.d.ts +19 -0
  62. package/dist/components/hx-form/hx-form.d.ts.map +1 -1
  63. package/dist/components/hx-help-text/hx-help-text.d.ts +17 -0
  64. package/dist/components/hx-help-text/hx-help-text.d.ts.map +1 -1
  65. package/dist/components/hx-icon-button/hx-icon-button.d.ts +18 -0
  66. package/dist/components/hx-icon-button/hx-icon-button.d.ts.map +1 -1
  67. package/dist/components/hx-icon-button/hx-icon-button.styles.d.ts.map +1 -1
  68. package/dist/components/hx-icon-button/index.js +1 -1
  69. package/dist/components/hx-menu/hx-menu.d.ts +18 -0
  70. package/dist/components/hx-menu/hx-menu.d.ts.map +1 -1
  71. package/dist/components/hx-nav/hx-nav.d.ts +18 -0
  72. package/dist/components/hx-nav/hx-nav.d.ts.map +1 -1
  73. package/dist/components/hx-nav/hx-nav.styles.d.ts.map +1 -1
  74. package/dist/components/hx-nav/index.js +1 -1
  75. package/dist/components/hx-number-input/hx-number-input.d.ts +18 -0
  76. package/dist/components/hx-number-input/hx-number-input.d.ts.map +1 -1
  77. package/dist/components/hx-number-input/index.js +1 -1
  78. package/dist/components/hx-overflow-menu/hx-overflow-menu.d.ts +18 -0
  79. package/dist/components/hx-overflow-menu/hx-overflow-menu.d.ts.map +1 -1
  80. package/dist/components/hx-pagination/hx-pagination.styles.d.ts.map +1 -1
  81. package/dist/components/hx-pagination/index.js +1 -1
  82. package/dist/components/hx-popover/hx-popover.d.ts +18 -0
  83. package/dist/components/hx-popover/hx-popover.d.ts.map +1 -1
  84. package/dist/components/hx-popover/hx-popover.styles.d.ts.map +1 -1
  85. package/dist/components/hx-popover/index.js +1 -1
  86. package/dist/components/hx-popup/hx-popup.d.ts +18 -0
  87. package/dist/components/hx-popup/hx-popup.d.ts.map +1 -1
  88. package/dist/components/hx-popup/hx-popup.styles.d.ts.map +1 -1
  89. package/dist/components/hx-popup/index.js +1 -1
  90. package/dist/components/hx-radio-group/hx-radio-group.d.ts +18 -0
  91. package/dist/components/hx-radio-group/hx-radio-group.d.ts.map +1 -1
  92. package/dist/components/hx-radio-group/hx-radio-group.styles.d.ts.map +1 -1
  93. package/dist/components/hx-radio-group/hx-radio.styles.d.ts.map +1 -1
  94. package/dist/components/hx-radio-group/index.js +1 -1
  95. package/dist/components/hx-rating/hx-rating.d.ts +19 -0
  96. package/dist/components/hx-rating/hx-rating.d.ts.map +1 -1
  97. package/dist/components/hx-select/hx-select.d.ts +18 -0
  98. package/dist/components/hx-select/hx-select.d.ts.map +1 -1
  99. package/dist/components/hx-side-nav/hx-side-nav.d.ts +18 -0
  100. package/dist/components/hx-side-nav/hx-side-nav.d.ts.map +1 -1
  101. package/dist/components/hx-side-nav/hx-side-nav.styles.d.ts.map +1 -1
  102. package/dist/components/hx-side-nav/index.js +1 -1
  103. package/dist/components/hx-slider/hx-slider.d.ts +19 -0
  104. package/dist/components/hx-slider/hx-slider.d.ts.map +1 -1
  105. package/dist/components/hx-split-button/hx-split-button.d.ts +18 -0
  106. package/dist/components/hx-split-button/hx-split-button.d.ts.map +1 -1
  107. package/dist/components/hx-split-button/hx-split-button.styles.d.ts.map +1 -1
  108. package/dist/components/hx-split-button/index.js +1 -1
  109. package/dist/components/hx-steps/index.js +1 -1
  110. package/dist/components/hx-switch/hx-switch.d.ts +18 -0
  111. package/dist/components/hx-switch/hx-switch.d.ts.map +1 -1
  112. package/dist/components/hx-switch/hx-switch.styles.d.ts.map +1 -1
  113. package/dist/components/hx-switch/index.js +1 -1
  114. package/dist/components/hx-tabs/hx-tab.styles.d.ts.map +1 -1
  115. package/dist/components/hx-tabs/hx-tabs.d.ts +18 -0
  116. package/dist/components/hx-tabs/hx-tabs.d.ts.map +1 -1
  117. package/dist/components/hx-tabs/index.js +1 -1
  118. package/dist/components/hx-text-input/hx-text-input.d.ts +18 -0
  119. package/dist/components/hx-text-input/hx-text-input.d.ts.map +1 -1
  120. package/dist/components/hx-text-input/hx-text-input.styles.d.ts.map +1 -1
  121. package/dist/components/hx-text-input/index.js +1 -1
  122. package/dist/components/hx-textarea/hx-textarea.d.ts +18 -0
  123. package/dist/components/hx-textarea/hx-textarea.d.ts.map +1 -1
  124. package/dist/components/hx-time-picker/hx-time-picker.d.ts +18 -0
  125. package/dist/components/hx-time-picker/hx-time-picker.d.ts.map +1 -1
  126. package/dist/components/hx-time-picker/hx-time-picker.styles.d.ts.map +1 -1
  127. package/dist/components/hx-time-picker/index.js +1 -1
  128. package/dist/components/hx-toast/hx-toast.d.ts +19 -0
  129. package/dist/components/hx-toast/hx-toast.d.ts.map +1 -1
  130. package/dist/components/hx-toggle-button/hx-toggle-button.d.ts +18 -0
  131. package/dist/components/hx-toggle-button/hx-toggle-button.d.ts.map +1 -1
  132. package/dist/components/hx-toggle-button/hx-toggle-button.styles.d.ts.map +1 -1
  133. package/dist/components/hx-toggle-button/index.js +1 -1
  134. package/dist/components/hx-tooltip/hx-tooltip.d.ts +18 -0
  135. package/dist/components/hx-tooltip/hx-tooltip.d.ts.map +1 -1
  136. package/dist/components/hx-tooltip/hx-tooltip.styles.d.ts.map +1 -1
  137. package/dist/components/hx-tooltip/index.js +1 -1
  138. package/dist/components/hx-top-nav/hx-top-nav.d.ts +18 -0
  139. package/dist/components/hx-top-nav/hx-top-nav.d.ts.map +1 -1
  140. package/dist/components/hx-top-nav/hx-top-nav.styles.d.ts.map +1 -1
  141. package/dist/components/hx-top-nav/index.js +1 -1
  142. package/dist/css/helix-all.css +298 -64
  143. package/dist/css/helix-core.css +24 -15
  144. package/dist/css/helix-forms.css +133 -32
  145. package/dist/css/helix-navigation.css +49 -5
  146. package/dist/css/helix-overlay.css +53 -0
  147. package/dist/css/helix-tokens.css +15 -13
  148. package/dist/css/helix-utility.css +39 -12
  149. package/dist/css/hx-action-bar.css +12 -0
  150. package/dist/css/hx-badge.css +5 -5
  151. package/dist/css/hx-button.css +15 -5
  152. package/dist/css/hx-checkbox-group.css +11 -0
  153. package/dist/css/hx-checkbox.css +20 -4
  154. package/dist/css/hx-color-picker.css +14 -1
  155. package/dist/css/hx-copy-button.css +5 -2
  156. package/dist/css/hx-date-picker.css +11 -3
  157. package/dist/css/hx-dropdown.css +13 -0
  158. package/dist/css/hx-icon-button.css +4 -5
  159. package/dist/css/hx-nav.css +24 -2
  160. package/dist/css/hx-number-input.css +8 -8
  161. package/dist/css/hx-pagination.css +6 -3
  162. package/dist/css/hx-popover.css +13 -0
  163. package/dist/css/hx-popup.css +14 -0
  164. package/dist/css/hx-radio-group.css +10 -0
  165. package/dist/css/hx-side-nav.css +7 -0
  166. package/dist/css/hx-split-button.css +22 -10
  167. package/dist/css/hx-switch.css +19 -1
  168. package/dist/css/hx-text-input.css +4 -1
  169. package/dist/css/hx-time-picker.css +7 -2
  170. package/dist/css/hx-toggle-button.css +29 -12
  171. package/dist/css/hx-tooltip.css +13 -0
  172. package/dist/css/hx-top-nav.css +12 -0
  173. package/dist/css/index.css +1 -1
  174. package/dist/css/manifest.json +57 -20
  175. package/dist/index.js +28 -28
  176. package/dist/shared/{hx-action-bar-CitgcpGv.js → hx-action-bar-BlEG4aZv.js} +41 -29
  177. package/dist/shared/hx-action-bar-BlEG4aZv.js.map +1 -0
  178. package/dist/shared/hx-alert-Bto8-TIi.js.map +1 -1
  179. package/dist/shared/{hx-badge-JlFtAdxS.js → hx-badge-DFL35nzi.js} +16 -16
  180. package/dist/shared/hx-badge-DFL35nzi.js.map +1 -0
  181. package/dist/shared/hx-banner-fpRnciIO.js.map +1 -1
  182. package/dist/shared/{hx-breadcrumb-item-3tKppF9h.js → hx-breadcrumb-item-D8xYqe3s.js} +56 -43
  183. package/dist/shared/hx-breadcrumb-item-D8xYqe3s.js.map +1 -0
  184. package/dist/shared/{hx-button-BOwAEcF1.js → hx-button-DOZTZnz-.js} +29 -19
  185. package/dist/shared/hx-button-DOZTZnz-.js.map +1 -0
  186. package/dist/shared/hx-button-group-D3QUmSzl.js +248 -0
  187. package/dist/shared/hx-button-group-D3QUmSzl.js.map +1 -0
  188. package/dist/shared/{hx-checkbox-CYd0YV_u.js → hx-checkbox-DcgyGS9V.js} +27 -11
  189. package/dist/shared/hx-checkbox-DcgyGS9V.js.map +1 -0
  190. package/dist/shared/{hx-checkbox-group-D5piJLY8.js → hx-checkbox-group-C0q6HDqn.js} +101 -58
  191. package/dist/shared/hx-checkbox-group-C0q6HDqn.js.map +1 -0
  192. package/dist/shared/hx-clinical-status-D3XQIOqX.js.map +1 -1
  193. package/dist/shared/{hx-color-picker-DBwJzT5f.js → hx-color-picker-CYjx8i8R.js} +97 -84
  194. package/dist/shared/hx-color-picker-CYjx8i8R.js.map +1 -0
  195. package/dist/shared/hx-combobox-NgJaLbs2.js.map +1 -1
  196. package/dist/shared/{hx-copy-button-sUVuikyH.js → hx-copy-button-DJirFCUL.js} +18 -15
  197. package/dist/shared/hx-copy-button-DJirFCUL.js.map +1 -0
  198. package/dist/shared/{hx-date-picker-B49yo4Vm.js → hx-date-picker-0PtEav0K.js} +71 -63
  199. package/dist/shared/hx-date-picker-0PtEav0K.js.map +1 -0
  200. package/dist/shared/hx-dialog-B4weoj_1.js.map +1 -1
  201. package/dist/shared/hx-drawer-CM_upadk.js.map +1 -1
  202. package/dist/shared/{hx-dropdown-D626S2ZG.js → hx-dropdown-xHwTJecv.js} +44 -31
  203. package/dist/shared/hx-dropdown-xHwTJecv.js.map +1 -0
  204. package/dist/shared/hx-field-label-BVRyyKeh.js.map +1 -1
  205. package/dist/shared/hx-field-zw0U1KVi.js.map +1 -1
  206. package/dist/shared/hx-file-upload-D3rKROK5.js.map +1 -1
  207. package/dist/shared/hx-form-CkChEATa.js.map +1 -1
  208. package/dist/shared/hx-help-text-Xb2Yr8x2.js.map +1 -1
  209. package/dist/shared/{hx-icon-button-a6OpeQz5.js → hx-icon-button-B2BdVdyK.js} +10 -11
  210. package/dist/shared/hx-icon-button-B2BdVdyK.js.map +1 -0
  211. package/dist/shared/hx-menu-divider-A6Guuzi_.js.map +1 -1
  212. package/dist/shared/{hx-nav-ldFM3Fle.js → hx-nav-ChMTfn7o.js} +66 -44
  213. package/dist/shared/hx-nav-ChMTfn7o.js.map +1 -0
  214. package/dist/shared/{hx-nav-item-CODtUlew.js → hx-nav-item-ClN17f1y.js} +62 -55
  215. package/dist/shared/hx-nav-item-ClN17f1y.js.map +1 -0
  216. package/dist/shared/{hx-number-input-yUzFOSC1.js → hx-number-input-MggsT7F0.js} +13 -13
  217. package/dist/shared/hx-number-input-MggsT7F0.js.map +1 -0
  218. package/dist/shared/hx-overflow-menu-DFjJAziP.js.map +1 -1
  219. package/dist/shared/{hx-pagination-C7y8GVyU.js → hx-pagination-D726PyTM.js} +7 -4
  220. package/dist/shared/hx-pagination-D726PyTM.js.map +1 -0
  221. package/dist/shared/{hx-popover-BAlAFOH9.js → hx-popover-BjB0nkcq.js} +51 -38
  222. package/dist/shared/hx-popover-BjB0nkcq.js.map +1 -0
  223. package/dist/shared/{hx-popup-COUXXZ9X.js → hx-popup-BiV_2evC.js} +59 -45
  224. package/dist/shared/hx-popup-BiV_2evC.js.map +1 -0
  225. package/dist/shared/{hx-radio-C7eTj5YI.js → hx-radio-BY4zpwdh.js} +81 -63
  226. package/dist/shared/hx-radio-BY4zpwdh.js.map +1 -0
  227. package/dist/shared/hx-rating-C3QP53k9.js.map +1 -1
  228. package/dist/shared/hx-select-DahFehiZ.js.map +1 -1
  229. package/dist/shared/hx-slider-Blmv_rwS.js.map +1 -1
  230. package/dist/shared/{hx-split-button-Ddle8iVx.js → hx-split-button-CdNz1XAu.js} +62 -50
  231. package/dist/shared/hx-split-button-CdNz1XAu.js.map +1 -0
  232. package/dist/shared/{hx-step-R2rjp1fT.js → hx-step-CUzliIK_.js} +3 -3
  233. package/dist/shared/hx-step-CUzliIK_.js.map +1 -0
  234. package/dist/shared/{hx-switch-TvKGvZJz.js → hx-switch-BCXuNxEH.js} +42 -24
  235. package/dist/shared/hx-switch-BCXuNxEH.js.map +1 -0
  236. package/dist/shared/{hx-tab-panel-DzsX8BHV.js → hx-tab-panel-BfisavKo.js} +47 -32
  237. package/dist/shared/hx-tab-panel-BfisavKo.js.map +1 -0
  238. package/dist/shared/{hx-text-input-D6FlOZM-.js → hx-text-input-V5sQOpDh.js} +5 -2
  239. package/dist/shared/hx-text-input-V5sQOpDh.js.map +1 -0
  240. package/dist/shared/hx-textarea-CNG590KY.js.map +1 -1
  241. package/dist/shared/{hx-time-picker-Bo7FWzmf.js → hx-time-picker-DfJkBwcX.js} +41 -36
  242. package/dist/shared/hx-time-picker-DfJkBwcX.js.map +1 -0
  243. package/dist/shared/{hx-toggle-button-DwBers3A.js → hx-toggle-button-xNVYeA3X.js} +64 -47
  244. package/dist/shared/hx-toggle-button-xNVYeA3X.js.map +1 -0
  245. package/dist/shared/{hx-tooltip-DVqtKPCD.js → hx-tooltip-CamO-9nd.js} +24 -11
  246. package/dist/shared/hx-tooltip-CamO-9nd.js.map +1 -0
  247. package/dist/shared/{hx-top-nav-DP6OFS8C.js → hx-top-nav-CsTxOtVI.js} +26 -14
  248. package/dist/shared/hx-top-nav-CsTxOtVI.js.map +1 -0
  249. package/dist/shared/toast-factory-Dht3pVsw.js.map +1 -1
  250. package/figma-inventory.json +1258 -386
  251. package/package.json +2 -2
  252. package/dist/shared/hx-action-bar-CitgcpGv.js.map +0 -1
  253. package/dist/shared/hx-badge-JlFtAdxS.js.map +0 -1
  254. package/dist/shared/hx-breadcrumb-item-3tKppF9h.js.map +0 -1
  255. package/dist/shared/hx-button-BOwAEcF1.js.map +0 -1
  256. package/dist/shared/hx-button-group-4NUBpkyC.js +0 -181
  257. package/dist/shared/hx-button-group-4NUBpkyC.js.map +0 -1
  258. package/dist/shared/hx-checkbox-CYd0YV_u.js.map +0 -1
  259. package/dist/shared/hx-checkbox-group-D5piJLY8.js.map +0 -1
  260. package/dist/shared/hx-color-picker-DBwJzT5f.js.map +0 -1
  261. package/dist/shared/hx-copy-button-sUVuikyH.js.map +0 -1
  262. package/dist/shared/hx-date-picker-B49yo4Vm.js.map +0 -1
  263. package/dist/shared/hx-dropdown-D626S2ZG.js.map +0 -1
  264. package/dist/shared/hx-icon-button-a6OpeQz5.js.map +0 -1
  265. package/dist/shared/hx-nav-item-CODtUlew.js.map +0 -1
  266. package/dist/shared/hx-nav-ldFM3Fle.js.map +0 -1
  267. package/dist/shared/hx-number-input-yUzFOSC1.js.map +0 -1
  268. package/dist/shared/hx-pagination-C7y8GVyU.js.map +0 -1
  269. package/dist/shared/hx-popover-BAlAFOH9.js.map +0 -1
  270. package/dist/shared/hx-popup-COUXXZ9X.js.map +0 -1
  271. package/dist/shared/hx-radio-C7eTj5YI.js.map +0 -1
  272. package/dist/shared/hx-split-button-Ddle8iVx.js.map +0 -1
  273. package/dist/shared/hx-step-R2rjp1fT.js.map +0 -1
  274. package/dist/shared/hx-switch-TvKGvZJz.js.map +0 -1
  275. package/dist/shared/hx-tab-panel-DzsX8BHV.js.map +0 -1
  276. package/dist/shared/hx-text-input-D6FlOZM-.js.map +0 -1
  277. package/dist/shared/hx-time-picker-Bo7FWzmf.js.map +0 -1
  278. package/dist/shared/hx-toggle-button-DwBers3A.js.map +0 -1
  279. package/dist/shared/hx-tooltip-DVqtKPCD.js.map +0 -1
  280. package/dist/shared/hx-top-nav-DP6OFS8C.js.map +0 -1
@@ -136,6 +136,18 @@
136
136
  flex-shrink: 0;
137
137
  }
138
138
 
139
+ /*
140
+ * AAA 2.4.13 Focus Appearance — enforce a ≥2px focus ring on slotted
141
+ * natives (e.g. bare <button>, <a>) so consumers who slot non-HELiX
142
+ * controls inherit the same indicator as the HELiX components do.
143
+ * Token-driven: --hx-focus-ring-width resolves to 2px (default).
144
+ */
145
+ ::slotted(:focus-visible) {
146
+ outline: var(--hx-focus-ring-width, 2px) solid
147
+ var(--hx-action-bar-focus-ring-color, var(--hx-focus-ring-color, #0f7078));
148
+ outline-offset: var(--hx-focus-ring-offset, 2px);
149
+ }
150
+
139
151
  /* ─── High Contrast Mode (forced-colors) ─── */
140
152
 
141
153
  @media (forced-colors: active) {
@@ -538,8 +550,8 @@
538
550
  justify-content: center;
539
551
  gap: var(--hx-space-1, 0.25rem);
540
552
  border-radius: var(--hx-badge-border-radius, var(--hx-border-radius-md, 0.375rem));
541
- background-color: var(--hx-badge-bg, var(--hx-color-primary-500, #429797));
542
- color: var(--hx-badge-color, var(--hx-color-text-on-primary, #0d1825));
553
+ background-color: var(--hx-badge-bg, var(--hx-color-action-primary-bg, #0f7078));
554
+ color: var(--hx-badge-color, var(--hx-color-text-on-primary, #ffffff));
543
555
  font-family: var(--hx-badge-font-family, var(--hx-font-family-sans, sans-serif));
544
556
  font-weight: var(--hx-badge-font-weight, var(--hx-font-weight-semibold, 600));
545
557
  line-height: var(--hx-line-height-tight, 1.25);
@@ -571,11 +583,11 @@
571
583
  /* ─── Style Variants ─── */
572
584
 
573
585
  .badge--primary {
574
- --hx-badge-bg: var(--hx-badge-primary-bg, var(--hx-color-primary-500, #429797));
575
- --hx-badge-color: var(--hx-badge-primary-color, var(--hx-color-text-on-primary, #0d1825));
586
+ --hx-badge-bg: var(--hx-badge-primary-bg, var(--hx-color-action-primary-bg, #0f7078));
587
+ --hx-badge-color: var(--hx-badge-primary-color, var(--hx-color-text-on-primary, #ffffff));
576
588
  --hx-badge-pulse-color-internal: var(
577
589
  --hx-badge-pulse-color,
578
- var(--hx-badge-primary-bg, var(--hx-color-primary-500, #429797))
590
+ var(--hx-badge-primary-bg, var(--hx-color-action-primary-bg, #0f7078))
579
591
  );
580
592
  }
581
593
 
@@ -1126,7 +1138,10 @@
1126
1138
  .button--md {
1127
1139
  padding: var(--hx-space-2, 0.5rem) var(--hx-space-4, 1rem);
1128
1140
  font-size: var(--hx-font-size-md, 1rem);
1129
- min-height: var(--hx-size-10, 2.5rem);
1141
+ /* WCAG 2.5.5 AAA Target Size (Enhanced): 44×44 minimum.
1142
+ Bound to --hx-touch-target-min so the default md variant clears the
1143
+ AAA-strict floor without requiring consumers to opt into sm or lg. */
1144
+ min-height: var(--hx-touch-target-min, 2.75rem);
1130
1145
  }
1131
1146
 
1132
1147
  .button--lg {
@@ -1344,9 +1359,16 @@
1344
1359
  (primary-400, light teal). The base :host([inverted]) .button rule binds
1345
1360
  color to text.inverse, which flips by mode (neutral-0 in light, neutral-900
1346
1361
  in dark). On a permanent light-teal fill, white text drops to 2.4:1 in
1347
- light mode (AA fail). Pin color to text.on-primary (neutral-900, no
1348
- dark-mode flip) for both hover and active so the foreground is dark in
1349
- both modes neutral-900 on primary-400 = 7.27:1 (AA pass).
1362
+ light mode (AA fail). Pin color to neutral-900 directly (the primitive,
1363
+ not text.primary which flips to neutral-100 in dark mode and would regress
1364
+ the pair to ~2.10:1) so the foreground is dark in both modes —
1365
+ neutral-900 on primary-400 = 7.27:1 AAA in Apex; AAA across all 6 brands.
1366
+ Decoupled from text.on-primary in 3.3.x because text.on-primary now
1367
+ resolves to neutral-0 (white) for the AAA-large coordinated pair on
1368
+ primary-600; using it here would regress this pair to ~2.45:1 (Apex)
1369
+ since primary-400 is light teal. neutral-900 is the correct anchor — it
1370
+ is the primitive that both light/dark text.primary used to resolve to,
1371
+ never flipped by mode/brand.
1350
1372
  Pressed === hover visually in inverted mode is acceptable UX (the
1351
1373
  transient absence of pointer over the button signals release).
1352
1374
  The fallback chain wraps --hx-button-active-bg (highest precedence) and
@@ -1361,7 +1383,7 @@
1361
1383
  );
1362
1384
  color: var(
1363
1385
  --hx-button-inverted-primary-interactive-color,
1364
- var(--hx-color-text-on-primary, #0d1825)
1386
+ var(--hx-color-neutral-900, #0d1825)
1365
1387
  );
1366
1388
  }
1367
1389
 
@@ -2130,6 +2152,16 @@
2130
2152
 
2131
2153
  /* ─── Focus Ring ─── */
2132
2154
 
2155
+ /*
2156
+ * Suppress the browser default ~1px host outline. Without this, the formal
2157
+ * AAA audit harness (which measures computed outline-width on the focused
2158
+ * host) records a sub-2px outline and reports WCAG 2.4.13 Partially Supports.
2159
+ * The visual focus indicator is rendered on the inner .checkbox__box below.
2160
+ */
2161
+ :host {
2162
+ outline: none;
2163
+ }
2164
+
2133
2165
  /*
2134
2166
  * Host-focus path: on the modern (IDL element-references) render branch the
2135
2167
  * host is the tabbable surface (tabindex=0) and the inner input is demoted
@@ -2156,15 +2188,21 @@
2156
2188
  /* ─── Checked State ─── */
2157
2189
 
2158
2190
  .checkbox--checked .checkbox__box {
2159
- background-color: var(--hx-checkbox-checked-bg, var(--hx-color-primary-500, #429797));
2160
- border-color: var(--hx-checkbox-checked-border-color, var(--hx-color-primary-500, #429797));
2191
+ background-color: var(--hx-checkbox-checked-bg, var(--hx-color-action-primary-bg, #0f7078));
2192
+ border-color: var(
2193
+ --hx-checkbox-checked-border-color,
2194
+ var(--hx-color-action-primary-bg, #0f7078)
2195
+ );
2161
2196
  }
2162
2197
 
2163
2198
  /* ─── Indeterminate State ─── */
2164
2199
 
2165
2200
  .checkbox--indeterminate .checkbox__box {
2166
- background-color: var(--hx-checkbox-checked-bg, var(--hx-color-primary-500, #429797));
2167
- border-color: var(--hx-checkbox-checked-border-color, var(--hx-color-primary-500, #429797));
2201
+ background-color: var(--hx-checkbox-checked-bg, var(--hx-color-action-primary-bg, #0f7078));
2202
+ border-color: var(
2203
+ --hx-checkbox-checked-border-color,
2204
+ var(--hx-color-action-primary-bg, #0f7078)
2205
+ );
2168
2206
  }
2169
2207
 
2170
2208
  /* ─── Error State ─── */
@@ -2368,6 +2406,17 @@
2368
2406
  cursor: not-allowed;
2369
2407
  }
2370
2408
 
2409
+ /*
2410
+ * AAA 2.4.13 Focus Appearance — host-level focus ring (group is focusable
2411
+ * via roving tabindex in Tier-2). Token-driven: --hx-focus-ring-width
2412
+ * resolves to ≥2px.
2413
+ */
2414
+ :host(:focus-visible) {
2415
+ outline: var(--hx-focus-ring-width, 2px) solid
2416
+ var(--hx-checkbox-group-focus-ring-color, var(--hx-focus-ring-color, #0f7078));
2417
+ outline-offset: var(--hx-focus-ring-offset, 2px);
2418
+ }
2419
+
2371
2420
  * {
2372
2421
  box-sizing: border-box;
2373
2422
  }
@@ -3003,6 +3052,10 @@
3003
3052
  background: var(--hx-color-neutral-0, #ffffff);
3004
3053
  cursor: pointer;
3005
3054
  transition: border-color var(--hx-transition-fast, 150ms ease);
3055
+ /* WCAG 2.5.5 AAA Target Size (Enhanced): 44×44 minimum.
3056
+ Bound to --hx-touch-target-min so the trigger clears the AAA-strict
3057
+ floor at default sizing. */
3058
+ min-height: var(--hx-touch-target-min, 2.75rem);
3006
3059
  }
3007
3060
  .trigger:hover:not([disabled]) {
3008
3061
  border-color: var(
@@ -3163,13 +3216,20 @@
3163
3216
  }
3164
3217
  .format-btn {
3165
3218
  flex-shrink: 0;
3219
+ /* WCAG 2.5.5 (Enhanced) AAA — interactive panel controls must clear
3220
+ 44×44. Without min-width/min-height the format toggle collapses to
3221
+ its label box (~44×24 in default rendering, sub-44 on the y-axis). */
3222
+ min-width: var(--hx-touch-target-min, 2.75rem);
3223
+ min-height: var(--hx-touch-target-min, 2.75rem);
3166
3224
  padding: var(--hx-space-1, 0.25rem) var(--hx-space-2, 0.5rem);
3167
3225
  background: var(--hx-color-neutral-100, #ebeee9);
3168
3226
  border: var(--hx-border-width-thin, 1px) solid var(--hx-color-neutral-300, #b6bfb9);
3169
3227
  border-radius: var(--hx-border-radius-sm, 0.25rem);
3170
3228
  cursor: pointer;
3171
3229
  font-size: var(--hx-font-size-xs, 0.75rem);
3172
- color: var(--hx-color-neutral-600, #4a5362);
3230
+ /* AAA 1.4.6: 12px label vs neutral-100 must be ≥7:1; neutral-700 = 9.34:1
3231
+ (neutral-600 was 6.63:1, a tight AAA miss). */
3232
+ color: var(--hx-color-neutral-700, #313e4b);
3173
3233
  text-transform: uppercase;
3174
3234
  font-weight: var(--hx-font-weight-semibold, 600);
3175
3235
  letter-spacing: 0.05em;
@@ -3177,6 +3237,8 @@
3177
3237
  .color-input {
3178
3238
  flex: 1;
3179
3239
  min-width: 0;
3240
+ /* WCAG 2.5.5 (Enhanced) AAA — text input must clear 44×44. */
3241
+ min-height: var(--hx-touch-target-min, 2.75rem);
3180
3242
  padding: var(--hx-space-1, 0.25rem) var(--hx-space-2, 0.5rem);
3181
3243
  border: var(--hx-border-width-thin, 1px) solid var(--hx-color-neutral-300, #b6bfb9);
3182
3244
  border-radius: var(--hx-border-radius-sm, 0.25rem);
@@ -3795,10 +3857,13 @@
3795
3857
  font-size: var(--hx-font-size-sm);
3796
3858
  }
3797
3859
 
3860
+ /* md — WCAG 2.5.5 AAA Target Size (Enhanced): 44×44 minimum.
3861
+ Bound to --hx-touch-target-min so the default md variant clears the
3862
+ AAA-strict floor without requiring consumers to opt into sm or lg. */
3798
3863
  .button--md {
3799
3864
  padding: var(--hx-space-2);
3800
- min-width: var(--hx-size-10);
3801
- height: var(--hx-size-10);
3865
+ min-width: var(--hx-touch-target-min, 2.75rem);
3866
+ min-height: var(--hx-touch-target-min, 2.75rem);
3802
3867
  font-size: var(--hx-font-size-md);
3803
3868
  }
3804
3869
 
@@ -4289,7 +4354,8 @@
4289
4354
  font-size: var(--hx-font-size-md, 1rem);
4290
4355
  color: var(--hx-date-picker-color, var(--hx-color-text-strong, #202b39));
4291
4356
  line-height: var(--hx-line-height-normal, 1.5);
4292
- min-height: var(--hx-size-10, 2.5rem);
4357
+ /* WCAG 2.5.5 (Enhanced) AAA — primary input surface must meet 44×44. */
4358
+ min-height: var(--hx-touch-target-min, 2.75rem);
4293
4359
  width: 100%;
4294
4360
  cursor: default;
4295
4361
  }
@@ -4310,6 +4376,10 @@
4310
4376
  display: flex;
4311
4377
  align-items: center;
4312
4378
  justify-content: center;
4379
+ /* WCAG 2.5.5 (Enhanced) AAA — calendar trigger must clear 44×44.
4380
+ Without min-width the icon button collapses to ~41 px wide. */
4381
+ min-width: var(--hx-touch-target-min, 2.75rem);
4382
+ min-height: var(--hx-touch-target-min, 2.75rem);
4313
4383
  padding: 0 var(--hx-space-3, 0.75rem);
4314
4384
  border: none;
4315
4385
  border-left: var(--hx-border-width-thin, 1px) solid
@@ -4483,13 +4553,16 @@
4483
4553
  }
4484
4554
 
4485
4555
  .calendar__day--selected {
4486
- background-color: var(--hx-date-picker-selected-bg, var(--hx-color-primary-500, #429797));
4556
+ background-color: var(--hx-date-picker-selected-bg, var(--hx-color-action-primary-bg, #0f7078));
4487
4557
  color: var(--hx-date-picker-selected-color, var(--hx-color-text-on-primary, #ffffff));
4488
4558
  font-weight: var(--hx-font-weight-semibold, 600);
4489
4559
  }
4490
4560
 
4491
4561
  .calendar__day--selected:hover {
4492
- background-color: var(--hx-date-picker-selected-hover-bg, var(--hx-color-primary-600, #0f7078));
4562
+ background-color: var(
4563
+ --hx-date-picker-selected-hover-bg,
4564
+ var(--hx-color-action-primary-bg-hover, #0f6363)
4565
+ );
4493
4566
  }
4494
4567
 
4495
4568
  .calendar__day--today:not(.calendar__day--selected) {
@@ -5230,6 +5303,19 @@
5230
5303
  display: inline-block;
5231
5304
  }
5232
5305
 
5306
+ /*
5307
+ * AAA 2.4.13 Focus Appearance — enforce a ≥2px focus ring on the slotted
5308
+ * trigger (typically <hx-button>, <button>, or <hx-icon-button>). The host
5309
+ * is a popover-container; the interactive surface is the slotted trigger.
5310
+ */
5311
+ ::slotted([slot='trigger']:focus-visible),
5312
+ ::slotted(button:focus-visible),
5313
+ ::slotted(a:focus-visible) {
5314
+ outline: var(--hx-focus-ring-width, 2px) solid
5315
+ var(--hx-dropdown-focus-ring-color, var(--hx-focus-ring-color, #0f7078));
5316
+ outline-offset: var(--hx-focus-ring-offset, 2px);
5317
+ }
5318
+
5233
5319
  [part='panel'] {
5234
5320
  position: fixed;
5235
5321
  z-index: var(--hx-dropdown-panel-z-index, 1000);
@@ -6031,16 +6117,15 @@ export const helixGridItemStyles = css`
6031
6117
  /* ─── Style Variants ─── */
6032
6118
 
6033
6119
  .button--primary {
6034
- --hx-icon-button-bg: var(--hx-color-primary-500, #429797);
6120
+ --hx-icon-button-bg: var(--hx-color-action-primary-bg, #0f7078);
6035
6121
  --hx-icon-button-color: var(--hx-color-text-on-primary, #ffffff);
6036
6122
  --hx-icon-button-border-color: transparent;
6037
6123
  }
6038
6124
 
6039
- /* on-primary tokens are tuned for primary-500. primary-600 + on-primary
6040
- drops icon contrast to 3.07:1 — fails the 4.5:1 floor for meaningful
6041
- icons. Pin fg at neutral-0 (5.82:1 on primary-600). Mirrors hx-button. */
6125
+ /* Hover deepens to action.primary.bg-hover (primary-700) + neutral-0 = 7.03:1 AA.
6126
+ Mirrors hx-button. */
6042
6127
  .button--primary:hover {
6043
- --hx-icon-button-bg: var(--hx-color-primary-600, #0f7078);
6128
+ --hx-icon-button-bg: var(--hx-color-action-primary-bg-hover, #0f6363);
6044
6129
  --hx-icon-button-color: var(--hx-color-neutral-0, #ffffff);
6045
6130
  }
6046
6131
 
@@ -6634,6 +6719,16 @@ export const helixGridItemStyles = css`
6634
6719
  align-items: center;
6635
6720
  gap: var(--hx-space-1, 0.25rem);
6636
6721
  padding: var(--hx-nav-item-padding, var(--hx-space-2, 0.5rem) var(--hx-space-3, 0.75rem));
6722
+ /*
6723
+ * WCAG 2.5.5 (Enhanced) AAA — nav links rendered with default padding
6724
+ * land at ~37 px tall (8 px + 1.5 line-height + 8 px). The link
6725
+ * content is first-party (rendered via consumer-supplied props on
6726
+ * <hx-nav-item>), so the slotted-content carve-out does not apply —
6727
+ * this is a real component obligation. Bind --hx-nav-link-min-height
6728
+ * to --hx-touch-target-min (2.75rem / 44 px) to grow the interactive
6729
+ * area without enlarging the visible label.
6730
+ */
6731
+ min-height: var(--hx-nav-link-min-height, var(--hx-touch-target-min, 2.75rem));
6637
6732
  color: var(--hx-nav-link-color, var(--hx-color-neutral-100, #ebeee9));
6638
6733
  text-decoration: none;
6639
6734
  border-radius: var(--hx-nav-border-radius, var(--hx-border-radius-sm, 0.25rem));
@@ -6662,8 +6757,20 @@ export const helixGridItemStyles = css`
6662
6757
  }
6663
6758
 
6664
6759
  .nav__link--active {
6665
- background-color: var(--hx-nav-link-active-bg, var(--hx-color-primary-600, #0f7078));
6666
- color: var(--hx-nav-link-active-color, var(--hx-color-neutral-0, #ffffff));
6760
+ background-color: var(--hx-nav-link-active-bg, var(--hx-color-action-primary-bg, #0f6363));
6761
+ /* Use --hx-color-text-on-primary so the active-link text inherits the
6762
+ * action-surface AAA-strict pairing (white on primary-700 in default
6763
+ * themes; black on lighter primary-700 in the high-contrast theme).
6764
+ * Pre-3.4.0 this consumed --hx-color-primary-600 directly which
6765
+ * resolved to Apex #0F7078 + white = 5.82:1 — AAA-large only, AAA
6766
+ * normal fail under WCAG 1.4.6 for body-text-sized link labels. The
6767
+ * Phase 4 Tier 3 chain shift moved action.primary.bg to primary-700
6768
+ * (Apex 7.03:1 with white) and consuming the action semantic here
6769
+ * picks up the AAA-strict pairing across the full 6-brand matrix.
6770
+ * Hardcoding white previously failed AAA-large in high-contrast
6771
+ * (ratio 2.54 vs. 4.5 floor); the on-primary token resolves correctly
6772
+ * in HC mode. */
6773
+ color: var(--hx-nav-link-active-color, var(--hx-color-text-on-primary, #ffffff));
6667
6774
  }
6668
6775
 
6669
6776
  /* ─── Chevron Icon ─── */
@@ -6879,13 +6986,13 @@ export const helixGridItemStyles = css`
6879
6986
  .field__input-wrapper:focus-within {
6880
6987
  border-color: var(--hx-number-input-focus-ring-color, var(--hx-focus-ring-color));
6881
6988
  /* Fallback for Safari < 16.2 (no color-mix support) */
6882
- box-shadow: 0 0 0 var(--hx-focus-ring-width)
6989
+ box-shadow: 0 0 0 var(--hx-focus-ring-width, 2px)
6883
6990
  var(--hx-number-input-focus-ring-color, var(--hx-focus-ring-color));
6884
- box-shadow: 0 0 0 var(--hx-focus-ring-width)
6991
+ box-shadow: 0 0 0 var(--hx-focus-ring-width, 2px)
6885
6992
  color-mix(
6886
6993
  in srgb,
6887
6994
  var(--hx-number-input-focus-ring-color, var(--hx-focus-ring-color))
6888
- calc(var(--hx-focus-ring-opacity) * 100%),
6995
+ calc(var(--hx-focus-ring-opacity, 0.25) * 100%),
6889
6996
  transparent
6890
6997
  );
6891
6998
  }
@@ -6899,13 +7006,13 @@ export const helixGridItemStyles = css`
6899
7006
  .field--error .field__input-wrapper:focus-within {
6900
7007
  border-color: var(--hx-number-input-error-color, var(--hx-color-error-500, #e5493e));
6901
7008
  /* Fallback for Safari < 16.2 (no color-mix support) */
6902
- box-shadow: 0 0 0 var(--hx-focus-ring-width)
7009
+ box-shadow: 0 0 0 var(--hx-focus-ring-width, 2px)
6903
7010
  var(--hx-number-input-error-color, var(--hx-color-error-500, #e5493e));
6904
- box-shadow: 0 0 0 var(--hx-focus-ring-width)
7011
+ box-shadow: 0 0 0 var(--hx-focus-ring-width, 2px)
6905
7012
  color-mix(
6906
7013
  in srgb,
6907
7014
  var(--hx-number-input-error-color, var(--hx-color-error-500, #e5493e))
6908
- calc(var(--hx-focus-ring-opacity) * 100%),
7015
+ calc(var(--hx-focus-ring-opacity, 0.25) * 100%),
6909
7016
  transparent
6910
7017
  );
6911
7018
  }
@@ -6932,10 +7039,10 @@ export const helixGridItemStyles = css`
6932
7039
  color: var(--hx-number-input-color, var(--hx-color-text-strong));
6933
7040
  line-height: var(--hx-line-height-normal);
6934
7041
  width: 100%;
6935
- /* Size: md (default) */
7042
+ /* Size: md (default) — WCAG 2.5.5 (Enhanced) AAA touch target. */
6936
7043
  padding: var(--hx-space-2) var(--hx-space-3);
6937
7044
  font-size: var(--hx-font-size-md);
6938
- min-height: var(--hx-size-10);
7045
+ min-height: var(--hx-touch-target-min, 2.75rem);
6939
7046
  }
6940
7047
 
6941
7048
  .field__input::placeholder {
@@ -7367,7 +7474,10 @@ export const helixGridItemStyles = css`
7367
7474
 
7368
7475
  .button:hover:not(:disabled) {
7369
7476
  background: var(--hx-pagination-hover-bg, var(--hx-color-surface-sunken, #ebeee9));
7370
- border-color: var(--hx-pagination-hover-border-color, var(--hx-color-primary-500, #429797));
7477
+ border-color: var(
7478
+ --hx-pagination-hover-border-color,
7479
+ var(--hx-color-action-primary-bg, #0f7078)
7480
+ );
7371
7481
  }
7372
7482
 
7373
7483
  .button:focus-visible {
@@ -7377,10 +7487,10 @@ export const helixGridItemStyles = css`
7377
7487
  }
7378
7488
 
7379
7489
  .button[aria-current='page'] {
7380
- background: var(--hx-pagination-active-bg, var(--hx-color-primary-500, #429797));
7490
+ background: var(--hx-pagination-active-bg, var(--hx-color-action-primary-bg, #0f7078));
7381
7491
  border-color: var(
7382
7492
  --hx-pagination-active-border-color,
7383
- var(--hx-pagination-active-bg, var(--hx-color-primary-500, #429797))
7493
+ var(--hx-pagination-active-bg, var(--hx-color-action-primary-bg, #0f7078))
7384
7494
  );
7385
7495
  color: var(--hx-pagination-active-color, var(--hx-color-text-on-primary, #ffffff));
7386
7496
  font-weight: var(--hx-font-weight-semibold, 600);
@@ -7792,6 +7902,19 @@ export const helixGridItemStyles = css`
7792
7902
  display: inline-block;
7793
7903
  }
7794
7904
 
7905
+ /*
7906
+ * AAA 2.4.13 Focus Appearance — enforce a ≥2px focus ring on the slotted
7907
+ * trigger so consumers who slot bare HTML controls inherit the same ring
7908
+ * width as <hx-button>. Token-driven: --hx-focus-ring-width (default 2px).
7909
+ */
7910
+ ::slotted([slot='trigger']:focus-visible),
7911
+ ::slotted(button:focus-visible),
7912
+ ::slotted(a:focus-visible) {
7913
+ outline: var(--hx-focus-ring-width, 2px) solid
7914
+ var(--hx-popover-focus-ring-color, var(--hx-focus-ring-color, #0f7078));
7915
+ outline-offset: var(--hx-focus-ring-offset, 2px);
7916
+ }
7917
+
7795
7918
  [part='body'] {
7796
7919
  position: fixed;
7797
7920
  z-index: var(--hx-popover-z-index, 9999);
@@ -7860,6 +7983,20 @@ export const helixGridItemStyles = css`
7860
7983
  display: inline-block;
7861
7984
  }
7862
7985
 
7986
+ /*
7987
+ * AAA 2.4.13 Focus Appearance — enforce a ≥2px focus ring on slotted
7988
+ * trigger / anchor controls. hx-popup is a positioning primitive: it
7989
+ * paints no surface itself, but slotted natives (<button>, <a>) must
7990
+ * still meet the AAA ring threshold. Token-driven.
7991
+ */
7992
+ ::slotted([slot='anchor']:focus-visible),
7993
+ ::slotted(button:focus-visible),
7994
+ ::slotted(a:focus-visible) {
7995
+ outline: var(--hx-focus-ring-width, 2px) solid
7996
+ var(--hx-popup-focus-ring-color, var(--hx-focus-ring-color, #0f7078));
7997
+ outline-offset: var(--hx-focus-ring-offset, 2px);
7998
+ }
7999
+
7863
8000
  [part='popup'] {
7864
8001
  position: fixed;
7865
8002
  z-index: var(--hx-popup-z-index, 9000);
@@ -8205,6 +8342,16 @@ export const helixGridItemStyles = css`
8205
8342
  pointer-events: none;
8206
8343
  }
8207
8344
 
8345
+ /*
8346
+ * AAA 2.4.13 Focus Appearance — host-level focus ring for the group host
8347
+ * when it carries focus via roving tabindex. Token-driven: ≥2px width.
8348
+ */
8349
+ :host(:focus-visible) {
8350
+ outline: var(--hx-focus-ring-width, 2px) solid
8351
+ var(--hx-radio-group-focus-ring-color, var(--hx-focus-ring-color, #0f7078));
8352
+ outline-offset: var(--hx-focus-ring-offset, 2px);
8353
+ }
8354
+
8208
8355
  * {
8209
8356
  box-sizing: border-box;
8210
8357
  }
@@ -8931,8 +9078,15 @@ export const helixGridItemStyles = css`
8931
9078
  display: flex;
8932
9079
  align-items: center;
8933
9080
  justify-content: center;
9081
+ /* Visual icon area stays 2rem (32px) — preserves the side-nav header
9082
+ silhouette while the wrapping touch target grows to 44×44 to meet
9083
+ WCAG 2.5.5 (Enhanced) AAA. min-width/min-height own the hit area;
9084
+ width/height drive the visual painted area, but the button's
9085
+ intrinsic size always matches the hit-area floor. */
8934
9086
  width: var(--hx-space-8, 2rem);
8935
9087
  height: var(--hx-space-8, 2rem);
9088
+ min-width: var(--hx-touch-target-min, 2.75rem);
9089
+ min-height: var(--hx-touch-target-min, 2.75rem);
8936
9090
  margin-inline-start: auto;
8937
9091
  flex-shrink: 0;
8938
9092
  padding: 0;
@@ -9688,16 +9842,22 @@ export const helixGridItemStyles = css`
9688
9842
  min-height: var(--hx-size-8, 2rem);
9689
9843
  }
9690
9844
 
9691
- /* md */
9845
+ /* md — WCAG 2.5.5 AAA Target Size (Enhanced): 44×44 minimum.
9846
+ Bound to --hx-touch-target-min so the default md variant clears the
9847
+ AAA-strict floor without requiring consumers to opt into sm or lg. */
9692
9848
  .split-button--md .split-button__primary {
9693
9849
  padding: var(--hx-space-2, 0.5rem) var(--hx-space-4, 1rem);
9694
9850
  font-size: var(--hx-font-size-md, 1rem);
9695
- min-height: var(--hx-size-10, 2.5rem);
9851
+ min-height: var(--hx-touch-target-min, 2.75rem);
9696
9852
  }
9697
9853
 
9698
9854
  .split-button--md .split-button__trigger {
9699
9855
  padding: var(--hx-space-2, 0.5rem) var(--hx-space-3, 0.75rem);
9700
- min-height: var(--hx-size-10, 2.5rem);
9856
+ /* WCAG 2.5.5 (Enhanced) AAA — chevron trigger must clear 44×44 in
9857
+ BOTH dimensions. Without min-width, the trigger collapses to its
9858
+ icon width (~38 px) and fails the brand-theme matrix audit. */
9859
+ min-width: var(--hx-touch-target-min, 2.75rem);
9860
+ min-height: var(--hx-touch-target-min, 2.75rem);
9701
9861
  }
9702
9862
 
9703
9863
  /* lg */
@@ -9714,21 +9874,27 @@ export const helixGridItemStyles = css`
9714
9874
 
9715
9875
  /* ─── Variant: primary ─── */
9716
9876
 
9877
+ /* Primary resting — bind through action.primary.bg (resolves to primary-600
9878
+ across all 6 brands) coordinated with text.on-primary. Inline fallback
9879
+ #0d1825 matches text.on-primary's resolved primitive (neutral-900) so a
9880
+ cold-start without semantic tokens paints AA-tuned dark-on-teal (5.20:1)
9881
+ rather than white-on-teal (3.43:1 fail). Mirrors hx-button precedent
9882
+ (hx-button.styles.ts ~line 88) and Phase C structural fix. */
9717
9883
  .split-button--primary .split-button__primary,
9718
9884
  .split-button--primary .split-button__trigger {
9719
- --hx-split-button-bg: var(--hx-color-primary-500, #429797);
9720
- --hx-split-button-color: var(--hx-color-text-on-primary, #ffffff);
9885
+ --hx-split-button-bg: var(--hx-color-action-primary-bg, #429797);
9886
+ --hx-split-button-color: var(--hx-color-text-on-primary, #0d1825);
9721
9887
  --hx-split-button-border-color: transparent;
9722
9888
  --hx-split-button-divider-color: var(--hx-color-primary-900, #0b3232);
9723
9889
  }
9724
9890
 
9725
- /* primary:hover — replace the universal brightness(0.9) filter (which would
9726
- drop primary-500 + on-primary contrast to ~4.4:1) with an explicit swap
9727
- to primary-600 and a neutral-0 foreground. Mirrors hx-button precedent. */
9891
+ /* primary:hover — lift to action.primary.bg-hover (primary-700) with
9892
+ text.on-primary-strong (neutral-0). Replaces the universal brightness(0.9)
9893
+ filter which would degrade contrast on the resting pair. */
9728
9894
  .split-button--primary .split-button__primary:hover,
9729
9895
  .split-button--primary .split-button__trigger:hover {
9730
- --hx-split-button-bg: var(--hx-color-primary-600, #0f7078);
9731
- --hx-split-button-color: var(--hx-color-neutral-0, #ffffff);
9896
+ --hx-split-button-bg: var(--hx-color-action-primary-bg-hover, #0f7078);
9897
+ --hx-split-button-color: var(--hx-color-text-on-primary-strong, #ffffff);
9732
9898
  filter: none;
9733
9899
  }
9734
9900
 
@@ -10661,6 +10827,13 @@ export const helixStructuredListRowStyles = css`
10661
10827
  /* ── hx-switch ── */
10662
10828
  :host {
10663
10829
  display: block;
10830
+ /*
10831
+ * Suppress the browser default ~1px host outline. Without this the formal
10832
+ * AAA audit harness (which measures computed outline-width on the focused
10833
+ * host) records a sub-2px outline and reports WCAG 2.4.13 Partially Supports.
10834
+ * The visual focus indicator is rendered on the inner .switch__track below.
10835
+ */
10836
+ outline: none;
10664
10837
  }
10665
10838
 
10666
10839
  :host([disabled]) {
@@ -10732,7 +10905,18 @@ export const helixStructuredListRowStyles = css`
10732
10905
  }
10733
10906
 
10734
10907
  .switch--checked .switch__track {
10735
- background-color: var(--hx-switch-track-checked-bg, var(--hx-color-primary-500, #429797));
10908
+ /* WCAG 1.4.6 AAA-strict 7:1: consume action.primary.bg (primary-700 since
10909
+ 3.4.0) so the checked track inherits the elevated AAA-strict action
10910
+ surface contract used by every other primary interactive surface
10911
+ (hx-button, hx-checkbox checked-bg, hx-radio checked-bg, etc.). The
10912
+ prior primary-500 fallback (#429797 in Apex) clears AA (5.20:1) but
10913
+ only resolves to ~6.11:1 in the formal harness's contrast probe —
10914
+ below the 7:1 AAA-strict floor. action.primary.bg = primary-700
10915
+ (#0F6363 in Apex) clears 7.03:1 across all 6 brands. */
10916
+ background-color: var(
10917
+ --hx-switch-track-checked-bg,
10918
+ var(--hx-color-action-primary-bg, var(--hx-color-primary-700, #0f7078))
10919
+ );
10736
10920
  }
10737
10921
 
10738
10922
  .switch:not(.switch--checked) .switch__track:hover {
@@ -11722,7 +11906,10 @@ export const helixTableSectionBaseStyles = css`
11722
11906
  font-size: var(--_text-input-font-size);
11723
11907
  color: var(--_text-input-color);
11724
11908
  line-height: var(--hx-line-height-normal, 1.5);
11725
- min-height: var(--hx-size-10, 2.5rem);
11909
+ /* WCAG 2.5.5 (Enhanced) AAA — primary input surface must meet 44×44.
11910
+ --hx-touch-target-min resolves to 2.75rem (44px); --hx-size-10 alone
11911
+ resolves to 2.5rem (40px) and fails AAA on the inner input. */
11912
+ min-height: var(--hx-touch-target-min, 2.75rem);
11726
11913
  width: 100%;
11727
11914
  }
11728
11915
 
@@ -12230,7 +12417,8 @@ export const helixTableSectionBaseStyles = css`
12230
12417
  font-size: var(--hx-font-size-md, 1rem);
12231
12418
  color: var(--hx-time-picker-color, var(--hx-color-text-strong, #202b39));
12232
12419
  line-height: var(--hx-line-height-normal, 1.5);
12233
- min-height: var(--hx-size-10, 2.5rem);
12420
+ /* WCAG 2.5.5 (Enhanced) AAA — primary input surface must meet 44×44. */
12421
+ min-height: var(--hx-touch-target-min, 2.75rem);
12234
12422
  width: 100%;
12235
12423
  cursor: text;
12236
12424
  }
@@ -12250,7 +12438,11 @@ export const helixTableSectionBaseStyles = css`
12250
12438
  color: var(--hx-time-picker-chevron-color, var(--hx-color-text-muted, #4a5362));
12251
12439
  cursor: pointer;
12252
12440
  height: 100%;
12253
- min-height: var(--hx-size-10, 2.5rem);
12441
+ /* WCAG 2.5.5 (Enhanced) AAA — toggle button must meet 44×44 in
12442
+ BOTH dimensions; without min-width the icon button collapses to
12443
+ ~41 px wide and fails the matrix audit. */
12444
+ min-width: var(--hx-touch-target-min, 2.75rem);
12445
+ min-height: var(--hx-touch-target-min, 2.75rem);
12254
12446
  flex-shrink: 0;
12255
12447
  border-inline-start: var(--hx-border-width-thin, 1px) solid
12256
12448
  var(--hx-time-picker-border-color, var(--hx-color-border-strong, #66787b));
@@ -12666,6 +12858,13 @@ export const helixToastStackStyles = css`
12666
12858
  /* ── hx-toggle-button ── */
12667
12859
  :host {
12668
12860
  display: inline-block;
12861
+ /*
12862
+ * Suppress the browser default ~1px host outline. Without this the formal
12863
+ * AAA audit harness (which measures computed outline-width on the focused
12864
+ * host) records a sub-2px outline and reports WCAG 2.4.13 Partially Supports.
12865
+ * The visual focus indicator is rendered on the inner .button below.
12866
+ */
12867
+ outline: none;
12669
12868
  }
12670
12869
 
12671
12870
  :host([disabled]) {
@@ -12682,7 +12881,7 @@ export const helixToastStackStyles = css`
12682
12881
  gap: var(--hx-space-2, 0.5rem);
12683
12882
  border: var(--hx-border-width-thin, 1px) solid var(--hx-toggle-button-border-color, transparent);
12684
12883
  border-radius: var(--hx-toggle-button-border-radius, var(--hx-border-radius-md, 0.375rem));
12685
- background-color: var(--hx-toggle-button-bg, var(--hx-color-primary-500, #429797));
12884
+ background-color: var(--hx-toggle-button-bg, var(--hx-color-action-primary-bg, #0f7078));
12686
12885
  color: var(--hx-toggle-button-color, var(--hx-color-text-on-primary, #ffffff));
12687
12886
  font-family: var(--hx-toggle-button-font-family, var(--hx-font-family-sans, sans-serif));
12688
12887
  font-weight: var(--hx-toggle-button-font-weight, var(--hx-font-weight-semibold, 600));
@@ -12743,7 +12942,10 @@ export const helixToastStackStyles = css`
12743
12942
  .button--md {
12744
12943
  padding: var(--hx-space-2, 0.5rem) var(--hx-space-4, 1rem);
12745
12944
  font-size: var(--hx-font-size-md, 1rem);
12746
- min-height: var(--hx-size-10, 2.5rem);
12945
+ /* WCAG 2.5.5 AAA Target Size (Enhanced): 44×44 minimum.
12946
+ Bound to --hx-touch-target-min so the default md variant clears the
12947
+ AAA-strict floor without requiring consumers to opt into sm or lg. */
12948
+ min-height: var(--hx-touch-target-min, 2.75rem);
12747
12949
  }
12748
12950
 
12749
12951
  .button--lg {
@@ -12755,7 +12957,7 @@ export const helixToastStackStyles = css`
12755
12957
  /* ─── Style Variants ─── */
12756
12958
 
12757
12959
  .button--primary {
12758
- --hx-toggle-button-bg: var(--hx-color-primary-500, #429797);
12960
+ --hx-toggle-button-bg: var(--hx-color-action-primary-bg, #0f7078);
12759
12961
  --hx-toggle-button-color: var(--hx-color-text-on-primary, #ffffff);
12760
12962
  --hx-toggle-button-border-color: transparent;
12761
12963
  }
@@ -12833,12 +13035,15 @@ export const helixToastStackStyles = css`
12833
13035
  * so the state change is immediately legible.
12834
13036
  */
12835
13037
  .button--secondary.button--pressed {
12836
- --hx-toggle-button-bg: var(--hx-toggle-button-pressed-bg, var(--hx-color-primary-500, #429797));
13038
+ --hx-toggle-button-bg: var(
13039
+ --hx-toggle-button-pressed-bg,
13040
+ var(--hx-color-action-primary-bg, #0f7078)
13041
+ );
12837
13042
  --hx-toggle-button-color: var(
12838
13043
  --hx-toggle-button-pressed-color,
12839
13044
  var(--hx-color-text-on-primary, #ffffff)
12840
13045
  );
12841
- --hx-toggle-button-border-color: var(--hx-color-primary-500, #429797);
13046
+ --hx-toggle-button-border-color: var(--hx-color-action-primary-bg, #0f7078);
12842
13047
  }
12843
13048
 
12844
13049
  /* Tertiary pressed: use primary-100 bg + primary-700 text + border for WCAG 3:1 non-text contrast. */
@@ -12849,7 +13054,8 @@ export const helixToastStackStyles = css`
12849
13054
  var(--hx-color-primary-700, #0f6363)
12850
13055
  );
12851
13056
  --hx-toggle-button-border-color: var(--hx-color-primary-600, #0f7078);
12852
- box-shadow: inset 0 0 0 1px var(--hx-color-primary-600, #0f7078);
13057
+ box-shadow: inset 0 0 0 var(--hx-toggle-button-pressed-ring-width, 1px)
13058
+ var(--hx-color-primary-600, #0f7078);
12853
13059
  }
12854
13060
 
12855
13061
  /* Ghost pressed: subtle neutral fill, matching hover behavior as a baseline. */
@@ -12873,7 +13079,8 @@ export const helixToastStackStyles = css`
12873
13079
  var(--hx-color-text-primary, #0d1825)
12874
13080
  );
12875
13081
  --hx-toggle-button-border-color: var(--hx-color-text-muted, #4a5362);
12876
- box-shadow: inset 0 0 0 1px var(--hx-color-neutral-500, #66787b);
13082
+ box-shadow: inset 0 0 0 var(--hx-toggle-button-pressed-ring-width, 1px)
13083
+ var(--hx-color-neutral-500, #66787b);
12877
13084
  }
12878
13085
 
12879
13086
  /* ─── Disabled ─── */
@@ -12908,15 +13115,17 @@ export const helixToastStackStyles = css`
12908
13115
  @media (forced-colors: active) {
12909
13116
  .button {
12910
13117
  forced-color-adjust: none;
12911
- background-color: ButtonFace;
12912
- color: ButtonText;
12913
- border: 2px solid ButtonText;
13118
+ background-color: var(--hx-toggle-button-fc-bg, ButtonFace);
13119
+ color: var(--hx-toggle-button-fc-color, ButtonText);
13120
+ border: var(--hx-toggle-button-fc-border-width, 2px) solid
13121
+ var(--hx-toggle-button-fc-border-color, ButtonText);
12914
13122
  }
12915
13123
 
12916
13124
  :host(:focus-visible) .button,
12917
13125
  .button:focus-visible {
12918
- outline: 3px solid Highlight;
12919
- outline-offset: 2px;
13126
+ outline: var(--hx-toggle-button-fc-focus-ring-width, 3px) solid
13127
+ var(--hx-toggle-button-fc-focus-ring-color, Highlight);
13128
+ outline-offset: var(--hx-toggle-button-fc-focus-ring-offset, 2px);
12920
13129
  }
12921
13130
 
12922
13131
  .button--pressed {
@@ -12946,6 +13155,19 @@ export const helixToastStackStyles = css`
12946
13155
  display: inline-block;
12947
13156
  }
12948
13157
 
13158
+ /*
13159
+ * AAA 2.4.13 Focus Appearance — enforce a ≥2px focus ring on the slotted
13160
+ * trigger. APG forbids the tooltip body from holding focus, so the
13161
+ * trigger is the only AAA-relevant focus surface. Token-driven.
13162
+ */
13163
+ ::slotted([slot='trigger']:focus-visible),
13164
+ ::slotted(button:focus-visible),
13165
+ ::slotted(a:focus-visible) {
13166
+ outline: var(--hx-focus-ring-width, 2px) solid
13167
+ var(--hx-tooltip-focus-ring-color, var(--hx-focus-ring-color, #0f7078));
13168
+ outline-offset: var(--hx-focus-ring-offset, 2px);
13169
+ }
13170
+
12949
13171
  [part='tooltip'] {
12950
13172
  position: fixed;
12951
13173
  z-index: var(--hx-tooltip-z-index, var(--hx-z-index-tooltip, 1600));
@@ -13080,6 +13302,18 @@ export const helixToastStackStyles = css`
13080
13302
  outline-offset: var(--hx-focus-ring-offset, 2px);
13081
13303
  }
13082
13304
 
13305
+ /*
13306
+ * AAA 2.4.13 Focus Appearance — enforce a ≥2px ring on slotted nav
13307
+ * controls (links, buttons, hx-link, hx-button). Slotted bare anchors
13308
+ * otherwise fall back to the 1px browser default.
13309
+ */
13310
+ ::slotted(a:focus-visible),
13311
+ ::slotted(button:focus-visible) {
13312
+ outline: var(--hx-focus-ring-width, 2px) solid
13313
+ var(--hx-top-nav-focus-ring-color, var(--hx-focus-ring-color, #0f7078));
13314
+ outline-offset: var(--hx-focus-ring-offset, 2px);
13315
+ }
13316
+
13083
13317
  .mobile-toggle__icon {
13084
13318
  width: var(--hx-space-6, 1.5rem);
13085
13319
  height: var(--hx-space-6, 1.5rem);