@helixui/library 3.1.0-next.72 → 3.2.0-next.100

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 (254) hide show
  1. package/custom-elements.json +165 -328
  2. package/dist/components/hx-accordion/hx-accordion-item.styles.d.ts.map +1 -1
  3. package/dist/components/hx-accordion/index.js +1 -1
  4. package/dist/components/hx-alert/index.js +1 -1
  5. package/dist/components/hx-banner/index.js +1 -1
  6. package/dist/components/hx-breadcrumb/hx-breadcrumb-item.styles.d.ts.map +1 -1
  7. package/dist/components/hx-breadcrumb/index.js +1 -1
  8. package/dist/components/hx-button/hx-button.d.ts +44 -49
  9. package/dist/components/hx-button/hx-button.d.ts.map +1 -1
  10. package/dist/components/hx-button/hx-button.styles.d.ts.map +1 -1
  11. package/dist/components/hx-button/index.js +1 -1
  12. package/dist/components/hx-card/hx-card.styles.d.ts.map +1 -1
  13. package/dist/components/hx-card/index.js +1 -1
  14. package/dist/components/hx-carousel/index.js +1 -1
  15. package/dist/components/hx-checkbox/index.js +1 -1
  16. package/dist/components/hx-clinical-status/hx-clinical-status.styles.d.ts.map +1 -1
  17. package/dist/components/hx-clinical-status/index.js +1 -1
  18. package/dist/components/hx-code-snippet/hx-code-snippet.styles.d.ts.map +1 -1
  19. package/dist/components/hx-code-snippet/index.js +1 -1
  20. package/dist/components/hx-color-picker/hx-color-picker.styles.d.ts.map +1 -1
  21. package/dist/components/hx-color-picker/index.js +1 -1
  22. package/dist/components/hx-combobox/index.js +1 -1
  23. package/dist/components/hx-data-table/hx-data-table.styles.d.ts.map +1 -1
  24. package/dist/components/hx-data-table/index.js +1 -1
  25. package/dist/components/hx-date-picker/index.js +1 -1
  26. package/dist/components/hx-dialog/hx-dialog.styles.d.ts.map +1 -1
  27. package/dist/components/hx-dialog/index.js +1 -1
  28. package/dist/components/hx-drawer/hx-drawer.styles.d.ts.map +1 -1
  29. package/dist/components/hx-drawer/index.js +1 -1
  30. package/dist/components/hx-file-upload/hx-file-upload.styles.d.ts.map +1 -1
  31. package/dist/components/hx-file-upload/index.js +1 -1
  32. package/dist/components/hx-icon-button/hx-icon-button.styles.d.ts.map +1 -1
  33. package/dist/components/hx-icon-button/index.js +1 -1
  34. package/dist/components/hx-link/index.js +1 -1
  35. package/dist/components/hx-menu/hx-menu-item.styles.d.ts.map +1 -1
  36. package/dist/components/hx-menu/index.js +1 -1
  37. package/dist/components/hx-meter/hx-meter.styles.d.ts.map +1 -1
  38. package/dist/components/hx-meter/index.js +1 -1
  39. package/dist/components/hx-nav/hx-nav.styles.d.ts.map +1 -1
  40. package/dist/components/hx-nav/index.js +1 -1
  41. package/dist/components/hx-overflow-menu/hx-overflow-menu.styles.d.ts.map +1 -1
  42. package/dist/components/hx-overflow-menu/index.js +1 -1
  43. package/dist/components/hx-pagination/hx-pagination.styles.d.ts.map +1 -1
  44. package/dist/components/hx-pagination/index.js +1 -1
  45. package/dist/components/hx-phi-field/hx-phi-field.styles.d.ts.map +1 -1
  46. package/dist/components/hx-phi-field/index.js +1 -1
  47. package/dist/components/hx-popover/hx-popover.styles.d.ts.map +1 -1
  48. package/dist/components/hx-popover/index.js +1 -1
  49. package/dist/components/hx-radio-group/index.js +1 -1
  50. package/dist/components/hx-rating/index.js +1 -1
  51. package/dist/components/hx-select/hx-select.styles.d.ts.map +1 -1
  52. package/dist/components/hx-select/index.js +1 -1
  53. package/dist/components/hx-side-nav/hx-nav-item.d.ts +7 -5
  54. package/dist/components/hx-side-nav/hx-nav-item.d.ts.map +1 -1
  55. package/dist/components/hx-side-nav/hx-nav-item.styles.d.ts.map +1 -1
  56. package/dist/components/hx-side-nav/hx-side-nav.d.ts +9 -23
  57. package/dist/components/hx-side-nav/hx-side-nav.d.ts.map +1 -1
  58. package/dist/components/hx-side-nav/hx-side-nav.styles.d.ts.map +1 -1
  59. package/dist/components/hx-side-nav/index.js +1 -1
  60. package/dist/components/hx-slider/index.js +1 -1
  61. package/dist/components/hx-split-button/hx-split-button.d.ts +1 -1
  62. package/dist/components/hx-split-button/index.js +1 -1
  63. package/dist/components/hx-split-panel/hx-split-panel.styles.d.ts.map +1 -1
  64. package/dist/components/hx-split-panel/index.js +1 -1
  65. package/dist/components/hx-steps/hx-step.styles.d.ts.map +1 -1
  66. package/dist/components/hx-steps/index.js +1 -1
  67. package/dist/components/hx-switch/index.js +1 -1
  68. package/dist/components/hx-table/hx-table.styles.d.ts.map +1 -1
  69. package/dist/components/hx-table/index.js +1 -1
  70. package/dist/components/hx-tabs/index.js +1 -1
  71. package/dist/components/hx-text-input/hx-text-input.d.ts +18 -35
  72. package/dist/components/hx-text-input/hx-text-input.d.ts.map +1 -1
  73. package/dist/components/hx-text-input/index.js +1 -1
  74. package/dist/components/hx-textarea/index.js +1 -1
  75. package/dist/components/hx-time-picker/index.js +1 -1
  76. package/dist/components/hx-toast/hx-toast.d.ts +12 -8
  77. package/dist/components/hx-toast/hx-toast.d.ts.map +1 -1
  78. package/dist/components/hx-toast/hx-toast.styles.d.ts.map +1 -1
  79. package/dist/components/hx-toast/index.js +1 -1
  80. package/dist/components/hx-toggle-button/index.js +1 -1
  81. package/dist/components/hx-top-nav/hx-top-nav.styles.d.ts.map +1 -1
  82. package/dist/components/hx-top-nav/index.js +1 -1
  83. package/dist/components/hx-tree-view/hx-tree-item.styles.d.ts.map +1 -1
  84. package/dist/components/hx-tree-view/index.js +1 -1
  85. package/dist/css/helix-all.css +289 -237
  86. package/dist/css/helix-core.css +147 -53
  87. package/dist/css/helix-data.css +9 -14
  88. package/dist/css/helix-feedback.css +30 -20
  89. package/dist/css/helix-forms.css +53 -73
  90. package/dist/css/helix-layout.css +2 -8
  91. package/dist/css/helix-media.css +3 -3
  92. package/dist/css/helix-navigation.css +34 -41
  93. package/dist/css/helix-overlay.css +3 -12
  94. package/dist/css/helix-tokens.css +60 -5
  95. package/dist/css/helix-utility.css +5 -5
  96. package/dist/css/hx-alert.css +1 -1
  97. package/dist/css/hx-banner.css +2 -2
  98. package/dist/css/hx-button.css +143 -43
  99. package/dist/css/hx-card.css +1 -4
  100. package/dist/css/hx-carousel.css +3 -3
  101. package/dist/css/hx-checkbox.css +2 -2
  102. package/dist/css/hx-clinical-status.css +2 -4
  103. package/dist/css/hx-code-snippet.css +6 -4
  104. package/dist/css/hx-color-picker.css +3 -13
  105. package/dist/css/hx-combobox.css +7 -7
  106. package/dist/css/hx-data-table.css +2 -8
  107. package/dist/css/hx-date-picker.css +7 -7
  108. package/dist/css/hx-dialog.css +1 -4
  109. package/dist/css/hx-drawer.css +1 -4
  110. package/dist/css/hx-file-upload.css +4 -13
  111. package/dist/css/hx-icon-button.css +2 -5
  112. package/dist/css/hx-link.css +1 -1
  113. package/dist/css/hx-meter.css +1 -2
  114. package/dist/css/hx-nav.css +2 -8
  115. package/dist/css/hx-overflow-menu.css +2 -8
  116. package/dist/css/hx-pagination.css +2 -8
  117. package/dist/css/hx-phi-field.css +1 -4
  118. package/dist/css/hx-popover.css +1 -4
  119. package/dist/css/hx-rating.css +3 -3
  120. package/dist/css/hx-select.css +3 -4
  121. package/dist/css/hx-side-nav.css +26 -12
  122. package/dist/css/hx-slider.css +4 -4
  123. package/dist/css/hx-split-button.css +5 -5
  124. package/dist/css/hx-split-panel.css +2 -8
  125. package/dist/css/hx-switch.css +3 -3
  126. package/dist/css/hx-table.css +1 -2
  127. package/dist/css/hx-text-input.css +8 -8
  128. package/dist/css/hx-textarea.css +2 -2
  129. package/dist/css/hx-time-picker.css +3 -3
  130. package/dist/css/hx-toast.css +26 -15
  131. package/dist/css/hx-toggle-button.css +4 -4
  132. package/dist/css/hx-top-nav.css +1 -4
  133. package/dist/css/hx-tree-view.css +1 -1
  134. package/dist/css/index.css +1 -1
  135. package/dist/css/manifest.json +60 -46
  136. package/dist/index.js +44 -44
  137. package/dist/shared/{hx-accordion-cnKg4_la.js → hx-accordion-ZVzgDzTG.js} +4 -5
  138. package/dist/shared/hx-accordion-ZVzgDzTG.js.map +1 -0
  139. package/dist/shared/{hx-alert-BZH8iHQf.js → hx-alert-C597yHpD.js} +2 -2
  140. package/dist/shared/{hx-alert-BZH8iHQf.js.map → hx-alert-C597yHpD.js.map} +1 -1
  141. package/dist/shared/{hx-banner-DT7Zn9Bo.js → hx-banner-Cxd7eFUP.js} +3 -3
  142. package/dist/shared/{hx-banner-DT7Zn9Bo.js.map → hx-banner-Cxd7eFUP.js.map} +1 -1
  143. package/dist/shared/{hx-breadcrumb-item-COeYcB2x.js → hx-breadcrumb-item-3tKppF9h.js} +2 -5
  144. package/dist/shared/{hx-breadcrumb-item-COeYcB2x.js.map → hx-breadcrumb-item-3tKppF9h.js.map} +1 -1
  145. package/dist/shared/{hx-button-modUSOpY.js → hx-button-9OUjJnk7.js} +167 -68
  146. package/dist/shared/hx-button-9OUjJnk7.js.map +1 -0
  147. package/dist/shared/{hx-card-CU1QnjNb.js → hx-card-qNAM2QNV.js} +6 -9
  148. package/dist/shared/hx-card-qNAM2QNV.js.map +1 -0
  149. package/dist/shared/{hx-carousel-item-BaE4hpLl.js → hx-carousel-item-z1Lc24op.js} +4 -4
  150. package/dist/shared/hx-carousel-item-z1Lc24op.js.map +1 -0
  151. package/dist/shared/{hx-checkbox-C46TyXhM.js → hx-checkbox-DBD-gMoz.js} +3 -3
  152. package/dist/shared/{hx-checkbox-C46TyXhM.js.map → hx-checkbox-DBD-gMoz.js.map} +1 -1
  153. package/dist/shared/{hx-clinical-status-BmSjfSEN.js → hx-clinical-status-D3XQIOqX.js} +3 -5
  154. package/dist/shared/hx-clinical-status-D3XQIOqX.js.map +1 -0
  155. package/dist/shared/{hx-code-snippet-CJ0FbQYG.js → hx-code-snippet-B26RM1_C.js} +10 -8
  156. package/dist/shared/{hx-code-snippet-CJ0FbQYG.js.map → hx-code-snippet-B26RM1_C.js.map} +1 -1
  157. package/dist/shared/{hx-color-picker-DiDLZyvK.js → hx-color-picker-uRc865FJ.js} +23 -33
  158. package/dist/shared/hx-color-picker-uRc865FJ.js.map +1 -0
  159. package/dist/shared/{hx-combobox-DaA5dBC4.js → hx-combobox-ClhNRAS5.js} +8 -8
  160. package/dist/shared/hx-combobox-ClhNRAS5.js.map +1 -0
  161. package/dist/shared/{hx-data-table-Cq3t86Ic.js → hx-data-table-CLqVqdxr.js} +3 -9
  162. package/dist/shared/hx-data-table-CLqVqdxr.js.map +1 -0
  163. package/dist/shared/{hx-date-picker-DMqRQNSB.js → hx-date-picker-BJm7Yrda.js} +8 -8
  164. package/dist/shared/{hx-date-picker-DMqRQNSB.js.map → hx-date-picker-BJm7Yrda.js.map} +1 -1
  165. package/dist/shared/{hx-dialog-eIS8tcDm.js → hx-dialog-DRN_1-Y-.js} +2 -5
  166. package/dist/shared/hx-dialog-DRN_1-Y-.js.map +1 -0
  167. package/dist/shared/{hx-drawer-DDhDz7RI.js → hx-drawer-Y1Ui2IWJ.js} +2 -5
  168. package/dist/shared/hx-drawer-Y1Ui2IWJ.js.map +1 -0
  169. package/dist/shared/{hx-file-upload-zTDbjsRw.js → hx-file-upload-D3rKROK5.js} +17 -26
  170. package/dist/shared/hx-file-upload-D3rKROK5.js.map +1 -0
  171. package/dist/shared/{hx-icon-button-BmV97nqz.js → hx-icon-button-CGNdQSFM.js} +3 -6
  172. package/dist/shared/hx-icon-button-CGNdQSFM.js.map +1 -0
  173. package/dist/shared/{hx-link-DmiV-mPw.js → hx-link-9Ig2DW6L.js} +5 -5
  174. package/dist/shared/{hx-link-DmiV-mPw.js.map → hx-link-9Ig2DW6L.js.map} +1 -1
  175. package/dist/shared/{hx-menu-divider-j__TZjH2.js → hx-menu-divider-C2omnPtj.js} +2 -5
  176. package/dist/shared/hx-menu-divider-C2omnPtj.js.map +1 -0
  177. package/dist/shared/{hx-meter-Cm7k_Ro8.js → hx-meter-BPscsw5t.js} +2 -3
  178. package/dist/shared/hx-meter-BPscsw5t.js.map +1 -0
  179. package/dist/shared/{hx-nav-item-D8xHLVOs.js → hx-nav-item-CqbO5-T5.js} +140 -90
  180. package/dist/shared/hx-nav-item-CqbO5-T5.js.map +1 -0
  181. package/dist/shared/{hx-nav-LoyEKZQC.js → hx-nav-ldFM3Fle.js} +37 -43
  182. package/dist/shared/hx-nav-ldFM3Fle.js.map +1 -0
  183. package/dist/shared/{hx-overflow-menu-BmKyAp5D.js → hx-overflow-menu-DCLsdIBy.js} +3 -9
  184. package/dist/shared/hx-overflow-menu-DCLsdIBy.js.map +1 -0
  185. package/dist/shared/{hx-pagination-Dqw5dorC.js → hx-pagination-C7y8GVyU.js} +54 -60
  186. package/dist/shared/hx-pagination-C7y8GVyU.js.map +1 -0
  187. package/dist/shared/{hx-phi-field-Bf9TdtC1.js → hx-phi-field-C19oxlrr.js} +2 -5
  188. package/dist/shared/hx-phi-field-C19oxlrr.js.map +1 -0
  189. package/dist/shared/{hx-popover-B93rTAfr.js → hx-popover-B-FP3-wW.js} +8 -11
  190. package/dist/shared/hx-popover-B-FP3-wW.js.map +1 -0
  191. package/dist/shared/{hx-radio-N8xgDd_5.js → hx-radio-dFjUAost.js} +4 -4
  192. package/dist/shared/{hx-radio-N8xgDd_5.js.map → hx-radio-dFjUAost.js.map} +1 -1
  193. package/dist/shared/{hx-rating-i2FL1WUN.js → hx-rating-CGtsejNf.js} +4 -4
  194. package/dist/shared/{hx-rating-i2FL1WUN.js.map → hx-rating-CGtsejNf.js.map} +1 -1
  195. package/dist/shared/{hx-select-vgaBo1Ai.js → hx-select-Bf4usFts.js} +4 -5
  196. package/dist/shared/hx-select-Bf4usFts.js.map +1 -0
  197. package/dist/shared/{hx-slider-ydBamYhd.js → hx-slider-m0aEClH1.js} +5 -5
  198. package/dist/shared/{hx-slider-ydBamYhd.js.map → hx-slider-m0aEClH1.js.map} +1 -1
  199. package/dist/shared/{hx-split-button-BeMsmS6N.js → hx-split-button-BxDFfx4D.js} +6 -6
  200. package/dist/shared/{hx-split-button-BeMsmS6N.js.map → hx-split-button-BxDFfx4D.js.map} +1 -1
  201. package/dist/shared/{hx-split-panel-BVG1VWNT.js → hx-split-panel-B-u0Z3mm.js} +3 -9
  202. package/dist/shared/hx-split-panel-B-u0Z3mm.js.map +1 -0
  203. package/dist/shared/{hx-step-DL3PbOzm.js → hx-step-R2rjp1fT.js} +2 -5
  204. package/dist/shared/hx-step-R2rjp1fT.js.map +1 -0
  205. package/dist/shared/{hx-switch-Dougzsgp.js → hx-switch-DvAW4YY-.js} +4 -4
  206. package/dist/shared/{hx-switch-Dougzsgp.js.map → hx-switch-DvAW4YY-.js.map} +1 -1
  207. package/dist/shared/{hx-tab-panel-CbkO9VKu.js → hx-tab-panel-SWOEHuJc.js} +3 -3
  208. package/dist/shared/{hx-tab-panel-CbkO9VKu.js.map → hx-tab-panel-SWOEHuJc.js.map} +1 -1
  209. package/dist/shared/{hx-td-1zwTFLRw.js → hx-td-DnnEMIuA.js} +2 -3
  210. package/dist/shared/hx-td-DnnEMIuA.js.map +1 -0
  211. package/dist/shared/{hx-text-input-B-caO5fI.js → hx-text-input-Bn7Gn8CI.js} +24 -25
  212. package/dist/shared/hx-text-input-Bn7Gn8CI.js.map +1 -0
  213. package/dist/shared/{hx-textarea-D9O4U8cb.js → hx-textarea-Jx1xnhgv.js} +7 -7
  214. package/dist/shared/{hx-textarea-D9O4U8cb.js.map → hx-textarea-Jx1xnhgv.js.map} +1 -1
  215. package/dist/shared/{hx-time-picker-m0z4nFB-.js → hx-time-picker-BoEIZwzv.js} +4 -4
  216. package/dist/shared/{hx-time-picker-m0z4nFB-.js.map → hx-time-picker-BoEIZwzv.js.map} +1 -1
  217. package/dist/shared/{hx-toggle-button-Dd8clXB4.js → hx-toggle-button-DPAIh_Xo.js} +24 -24
  218. package/dist/shared/{hx-toggle-button-Dd8clXB4.js.map → hx-toggle-button-DPAIh_Xo.js.map} +1 -1
  219. package/dist/shared/{hx-top-nav-CchPYaiV.js → hx-top-nav-DP6OFS8C.js} +11 -14
  220. package/dist/shared/hx-top-nav-DP6OFS8C.js.map +1 -0
  221. package/dist/shared/{hx-tree-item-DtMC3DTa.js → hx-tree-item-Dt0Ozqyr.js} +4 -10
  222. package/dist/shared/hx-tree-item-Dt0Ozqyr.js.map +1 -0
  223. package/dist/shared/{toast-factory-DvDRAh0l.js → toast-factory-YSznocIV.js} +66 -56
  224. package/dist/shared/toast-factory-YSznocIV.js.map +1 -0
  225. package/figma-inventory.json +292 -444
  226. package/package.json +2 -2
  227. package/dist/shared/hx-accordion-cnKg4_la.js.map +0 -1
  228. package/dist/shared/hx-button-modUSOpY.js.map +0 -1
  229. package/dist/shared/hx-card-CU1QnjNb.js.map +0 -1
  230. package/dist/shared/hx-carousel-item-BaE4hpLl.js.map +0 -1
  231. package/dist/shared/hx-clinical-status-BmSjfSEN.js.map +0 -1
  232. package/dist/shared/hx-color-picker-DiDLZyvK.js.map +0 -1
  233. package/dist/shared/hx-combobox-DaA5dBC4.js.map +0 -1
  234. package/dist/shared/hx-data-table-Cq3t86Ic.js.map +0 -1
  235. package/dist/shared/hx-dialog-eIS8tcDm.js.map +0 -1
  236. package/dist/shared/hx-drawer-DDhDz7RI.js.map +0 -1
  237. package/dist/shared/hx-file-upload-zTDbjsRw.js.map +0 -1
  238. package/dist/shared/hx-icon-button-BmV97nqz.js.map +0 -1
  239. package/dist/shared/hx-menu-divider-j__TZjH2.js.map +0 -1
  240. package/dist/shared/hx-meter-Cm7k_Ro8.js.map +0 -1
  241. package/dist/shared/hx-nav-LoyEKZQC.js.map +0 -1
  242. package/dist/shared/hx-nav-item-D8xHLVOs.js.map +0 -1
  243. package/dist/shared/hx-overflow-menu-BmKyAp5D.js.map +0 -1
  244. package/dist/shared/hx-pagination-Dqw5dorC.js.map +0 -1
  245. package/dist/shared/hx-phi-field-Bf9TdtC1.js.map +0 -1
  246. package/dist/shared/hx-popover-B93rTAfr.js.map +0 -1
  247. package/dist/shared/hx-select-vgaBo1Ai.js.map +0 -1
  248. package/dist/shared/hx-split-panel-BVG1VWNT.js.map +0 -1
  249. package/dist/shared/hx-step-DL3PbOzm.js.map +0 -1
  250. package/dist/shared/hx-td-1zwTFLRw.js.map +0 -1
  251. package/dist/shared/hx-text-input-B-caO5fI.js.map +0 -1
  252. package/dist/shared/hx-top-nav-CchPYaiV.js.map +0 -1
  253. package/dist/shared/hx-tree-item-DtMC3DTa.js.map +0 -1
  254. package/dist/shared/toast-factory-DvDRAh0l.js.map +0 -1
@@ -154,10 +154,7 @@
154
154
 
155
155
  .dialog__close-btn:focus-visible {
156
156
  outline: var(--hx-focus-ring-width, 2px) solid
157
- var(
158
- --hx-dialog-close-btn-focus-ring-color,
159
- var(--hx-focus-ring-color, var(--hx-color-primary-500, #429797))
160
- );
157
+ var(--hx-dialog-close-btn-focus-ring-color, var(--hx-focus-ring-color, #0f7078));
161
158
  outline-offset: var(--hx-focus-ring-offset, 2px);
162
159
  }
163
160
 
@@ -429,10 +426,7 @@
429
426
 
430
427
  .drawer-close-button:focus-visible {
431
428
  outline: var(--hx-focus-ring-width, 2px) solid
432
- var(
433
- --hx-drawer-close-btn-focus-ring-color,
434
- var(--hx-focus-ring-color, var(--hx-color-primary-500, #429797))
435
- );
429
+ var(--hx-drawer-close-btn-focus-ring-color, var(--hx-focus-ring-color, #0f7078));
436
430
  outline-offset: var(--hx-focus-ring-offset, 2px);
437
431
  }
438
432
 
@@ -601,10 +595,7 @@
601
595
 
602
596
  [part='body']:focus-visible {
603
597
  outline: var(--hx-focus-ring-width, 2px) solid
604
- var(
605
- --hx-popover-focus-ring-color,
606
- var(--hx-focus-ring-color, var(--hx-color-primary-500, #429797))
607
- );
598
+ var(--hx-popover-focus-ring-color, var(--hx-focus-ring-color, #0f7078));
608
599
  outline-offset: var(--hx-focus-ring-offset, 2px);
609
600
  }
610
601
 
@@ -101,6 +101,9 @@
101
101
  --hx-color-text-on-success: var(--hx-color-neutral-900);
102
102
  --hx-color-text-on-warning: var(--hx-color-neutral-900);
103
103
  --hx-color-text-on-info: var(--hx-color-neutral-900);
104
+ --hx-color-text-on-primary-strong: var(--hx-color-neutral-0);
105
+ --hx-color-text-on-success-strong: var(--hx-color-neutral-0);
106
+ --hx-color-text-on-error-strong: var(--hx-color-neutral-0);
104
107
  --hx-color-text-link: var(--hx-color-primary-600);
105
108
  --hx-color-text-link-hover: var(--hx-color-primary-700);
106
109
  --hx-color-text-link-visited: var(--hx-color-secondary-600);
@@ -112,13 +115,34 @@
112
115
  --hx-color-surface-sunken: var(--hx-color-neutral-100);
113
116
  --hx-color-surface-inverse: var(--hx-color-neutral-900);
114
117
  --hx-color-surface-overlay: rgba(0, 0, 0, 0.75);
118
+ --hx-color-surface-success-strong: var(--hx-color-success-700);
119
+ --hx-color-surface-warning-strong: var(--hx-color-warning-500);
120
+ --hx-color-surface-danger-strong: var(--hx-color-error-600);
121
+ --hx-color-surface-info-strong: var(--hx-color-primary-600);
115
122
  --hx-color-border-default: var(--hx-color-neutral-200);
116
123
  --hx-color-border-subtle: var(--hx-color-neutral-100);
117
- --hx-color-border-strong: var(--hx-color-neutral-400);
124
+ --hx-color-border-strong: var(--hx-color-neutral-500);
118
125
  --hx-color-border-focus: var(--hx-color-primary-500);
119
- --hx-color-focus-ring: var(--hx-color-primary-400);
126
+ --hx-color-border-on-dark-strong: var(--hx-overlay-white-70);
127
+ --hx-color-border-on-dark-default: var(--hx-overlay-white-30);
128
+ --hx-color-border-on-dark-subtle: var(--hx-overlay-white-10);
129
+ --hx-color-focus-ring: var(--hx-color-primary-600);
120
130
  --hx-color-selection-bg: var(--hx-color-primary-200);
121
131
  --hx-color-selection-color: var(--hx-color-neutral-900);
132
+ --hx-color-action-primary-bg: var(--hx-color-primary-500);
133
+ --hx-color-action-primary-bg-inverted-rest: var(--hx-color-primary-500);
134
+ --hx-color-action-primary-bg-hover: var(--hx-color-primary-600);
135
+ --hx-color-action-primary-bg-active: var(--hx-color-primary-700);
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);
139
+ --hx-color-action-secondary-bg-hover: var(--hx-color-primary-50);
140
+ --hx-color-action-ghost-fg: var(--hx-color-primary-600);
141
+ --hx-color-action-ghost-bg-hover: var(--hx-color-primary-50);
142
+ --hx-color-action-danger-bg: var(--hx-color-error-500);
143
+ --hx-color-action-danger-bg-hover: var(--hx-color-error-600);
144
+ --hx-color-action-danger-bg-active: var(--hx-color-error-700);
145
+ --hx-color-action-danger-bg-inverted-hover: var(--hx-color-error-400);
122
146
  --hx-body-bg: var(--hx-color-surface-default);
123
147
  --hx-body-color: var(--hx-color-text-primary);
124
148
  --hx-body-font-family: var(--hx-font-family-sans);
@@ -218,7 +242,7 @@
218
242
  --hx-transition-slow: 350ms ease;
219
243
  --hx-touch-target-min: 2.75rem;
220
244
  --hx-touch-target-size: 44px;
221
- --hx-focus-ring-color: var(--hx-color-primary-400);
245
+ --hx-focus-ring-color: var(--hx-color-primary-600);
222
246
  --hx-focus-ring-width: 2px;
223
247
  --hx-focus-ring-offset: 2px;
224
248
  --hx-focus-ring-style: solid;
@@ -346,13 +370,23 @@
346
370
  --hx-color-surface-overlay: rgba(0, 0, 0, 0.85);
347
371
  --hx-color-border-default: var(--hx-color-neutral-700);
348
372
  --hx-color-border-subtle: var(--hx-color-neutral-800);
349
- --hx-color-border-strong: var(--hx-color-neutral-500);
373
+ --hx-color-border-strong: var(--hx-color-neutral-400);
350
374
  --hx-color-border-focus: var(--hx-color-primary-400);
375
+ --hx-color-border-on-dark-strong: var(--hx-overlay-black-50);
376
+ --hx-color-border-on-dark-default: var(--hx-overlay-black-30);
377
+ --hx-color-border-on-dark-subtle: var(--hx-overlay-black-10);
351
378
  --hx-color-focus-ring: var(--hx-color-primary-400);
352
379
  --hx-color-selection-bg: var(--hx-color-primary-800);
353
380
  --hx-color-selection-color: var(--hx-color-neutral-100);
381
+ --hx-color-action-primary-bg-inverted-rest: var(--hx-color-primary-600);
382
+ --hx-color-action-secondary-fg: var(--hx-color-primary-400);
383
+ --hx-color-action-secondary-border: var(--hx-color-primary-400);
384
+ --hx-color-action-secondary-bg-hover: var(--hx-color-primary-900);
385
+ --hx-color-action-ghost-fg: var(--hx-color-primary-400);
386
+ --hx-color-action-ghost-bg-hover: var(--hx-color-primary-900);
354
387
  --hx-body-bg: var(--hx-color-surface-default);
355
388
  --hx-body-color: var(--hx-color-text-primary);
389
+ --hx-focus-ring-color: var(--hx-color-primary-400);
356
390
  --hx-shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.3);
357
391
  --hx-shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.4), 0 2px 4px -2px rgb(0 0 0 / 0.3);
358
392
  --hx-shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.4), 0 4px 6px -4px rgb(0 0 0 / 0.3);
@@ -382,13 +416,23 @@
382
416
  --hx-color-surface-overlay: rgba(0, 0, 0, 0.85);
383
417
  --hx-color-border-default: var(--hx-color-neutral-700);
384
418
  --hx-color-border-subtle: var(--hx-color-neutral-800);
385
- --hx-color-border-strong: var(--hx-color-neutral-500);
419
+ --hx-color-border-strong: var(--hx-color-neutral-400);
386
420
  --hx-color-border-focus: var(--hx-color-primary-400);
421
+ --hx-color-border-on-dark-strong: var(--hx-overlay-black-50);
422
+ --hx-color-border-on-dark-default: var(--hx-overlay-black-30);
423
+ --hx-color-border-on-dark-subtle: var(--hx-overlay-black-10);
387
424
  --hx-color-focus-ring: var(--hx-color-primary-400);
388
425
  --hx-color-selection-bg: var(--hx-color-primary-800);
389
426
  --hx-color-selection-color: var(--hx-color-neutral-100);
427
+ --hx-color-action-primary-bg-inverted-rest: var(--hx-color-primary-600);
428
+ --hx-color-action-secondary-fg: var(--hx-color-primary-400);
429
+ --hx-color-action-secondary-border: var(--hx-color-primary-400);
430
+ --hx-color-action-secondary-bg-hover: var(--hx-color-primary-900);
431
+ --hx-color-action-ghost-fg: var(--hx-color-primary-400);
432
+ --hx-color-action-ghost-bg-hover: var(--hx-color-primary-900);
390
433
  --hx-body-bg: var(--hx-color-surface-default);
391
434
  --hx-body-color: var(--hx-color-text-primary);
435
+ --hx-focus-ring-color: var(--hx-color-primary-400);
392
436
  --hx-shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.3);
393
437
  --hx-shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.4), 0 2px 4px -2px rgb(0 0 0 / 0.3);
394
438
  --hx-shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.4), 0 4px 6px -4px rgb(0 0 0 / 0.3);
@@ -426,6 +470,9 @@
426
470
  --hx-color-text-on-success: #000000;
427
471
  --hx-color-text-on-warning: #000000;
428
472
  --hx-color-text-on-info: #000000;
473
+ --hx-color-text-on-primary-strong: #000000;
474
+ --hx-color-text-on-error-strong: #000000;
475
+ --hx-color-text-on-success-strong: #000000;
429
476
  --hx-color-text-link: #FFFF00;
430
477
  --hx-color-text-link-hover: #FFFF99;
431
478
  --hx-color-text-link-visited: #FF80FF;
@@ -435,13 +482,21 @@
435
482
  --hx-color-surface-sunken: #000000;
436
483
  --hx-color-surface-inverse: #FFFFFF;
437
484
  --hx-color-surface-overlay: rgba(0, 0, 0, 0.95);
485
+ --hx-color-surface-success-strong: var(--hx-color-success-500);
486
+ --hx-color-surface-warning-strong: var(--hx-color-warning-500);
487
+ --hx-color-surface-danger-strong: var(--hx-color-error-500);
488
+ --hx-color-surface-info-strong: var(--hx-color-primary-500);
438
489
  --hx-color-border-default: #FFFFFF;
439
490
  --hx-color-border-subtle: #C0C0C0;
440
491
  --hx-color-border-strong: #FFFFFF;
441
492
  --hx-color-border-focus: #FFFF00;
493
+ --hx-color-border-on-dark-strong: #FFFFFF;
494
+ --hx-color-border-on-dark-default: #FFFFFF;
495
+ --hx-color-border-on-dark-subtle: #C0C0C0;
442
496
  --hx-color-focus-ring: #FFFF00;
443
497
  --hx-color-selection-bg: #1AEBFF;
444
498
  --hx-color-selection-color: #000000;
499
+ --hx-color-action-danger-bg-active: var(--hx-color-error-500);
445
500
  --hx-body-bg: #000000;
446
501
  --hx-body-color: #FFFFFF;
447
502
  --hx-focus-ring-color: #FFFF00;
@@ -417,7 +417,7 @@
417
417
  outline: var(--hx-focus-ring-width, 2px) solid
418
418
  var(
419
419
  --hx-split-button-focus-ring-color,
420
- var(--hx-focus-ring-color, var(--hx-color-primary-400, #6ab1b1))
420
+ var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078))
421
421
  );
422
422
  outline-offset: var(--hx-focus-ring-offset, 2px);
423
423
  z-index: 1;
@@ -445,7 +445,7 @@
445
445
  flex-shrink: 0;
446
446
  border: var(--hx-border-width-thin, 1px) solid var(--hx-split-button-border-color, transparent);
447
447
  border-inline-start: var(--hx-border-width-thin, 1px) solid
448
- var(--hx-split-button-divider-color, var(--hx-color-primary-400, #6ab1b1));
448
+ var(--hx-split-button-divider-color, var(--hx-color-primary-900, #0b3232));
449
449
  border-radius: 0 var(--hx-split-button-border-radius, var(--hx-border-radius-md, 0.375rem))
450
450
  var(--hx-split-button-border-radius, var(--hx-border-radius-md, 0.375rem)) 0;
451
451
  background-color: var(--hx-split-button-bg, var(--hx-color-primary-500, #429797));
@@ -462,7 +462,7 @@
462
462
  outline: var(--hx-focus-ring-width, 2px) solid
463
463
  var(
464
464
  --hx-split-button-focus-ring-color,
465
- var(--hx-focus-ring-color, var(--hx-color-primary-400, #6ab1b1))
465
+ var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078))
466
466
  );
467
467
  outline-offset: var(--hx-focus-ring-offset, 2px);
468
468
  z-index: 1;
@@ -539,7 +539,7 @@
539
539
  --hx-split-button-bg: var(--hx-color-primary-500, #429797);
540
540
  --hx-split-button-color: var(--hx-color-text-on-primary, #ffffff);
541
541
  --hx-split-button-border-color: transparent;
542
- --hx-split-button-divider-color: var(--hx-color-primary-400, #6ab1b1);
542
+ --hx-split-button-divider-color: var(--hx-color-primary-900, #0b3232);
543
543
  }
544
544
 
545
545
  /* primary:hover — replace the universal brightness(0.9) filter (which would
@@ -626,7 +626,7 @@
626
626
  .split-button--outline .split-button__trigger {
627
627
  --hx-split-button-bg: transparent;
628
628
  --hx-split-button-color: var(--hx-color-text-primary, #0d1825);
629
- --hx-split-button-border-color: var(--hx-color-border-strong, #8e9c98);
629
+ --hx-split-button-border-color: var(--hx-color-border-strong, #66787b);
630
630
  --hx-split-button-divider-color: var(--hx-color-border-default, #d6dbd5);
631
631
  }
632
632
 
@@ -160,7 +160,7 @@
160
160
  outline: var(--hx-focus-ring-width, 2px) solid
161
161
  var(
162
162
  --hx-alert-close-btn-focus-ring-color,
163
- var(--hx-focus-ring-color, var(--hx-color-primary-400, #6ab1b1))
163
+ var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078))
164
164
  );
165
165
  outline-offset: var(--hx-focus-ring-offset, 2px);
166
166
  opacity: 1;
@@ -98,7 +98,7 @@
98
98
  outline: var(--hx-focus-ring-width, 2px) solid
99
99
  var(
100
100
  --hx-banner-action-focus-ring-color,
101
- var(--hx-focus-ring-color, var(--hx-color-primary-400, #6ab1b1))
101
+ var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078))
102
102
  );
103
103
  outline-offset: var(--hx-focus-ring-offset, 2px);
104
104
  border-radius: var(--hx-border-radius-sm, 0.25rem);
@@ -142,7 +142,7 @@
142
142
  outline: var(--hx-focus-ring-width, 2px) solid
143
143
  var(
144
144
  --hx-banner-close-btn-focus-ring-color,
145
- var(--hx-focus-ring-color, var(--hx-color-primary-400, #6ab1b1))
145
+ var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078))
146
146
  );
147
147
  outline-offset: var(--hx-focus-ring-offset, 2px);
148
148
  opacity: 1;
@@ -46,10 +46,7 @@
46
46
 
47
47
  .button:focus-visible {
48
48
  outline: var(--hx-focus-ring-width, 2px) solid
49
- var(
50
- --hx-button-focus-ring-color,
51
- var(--hx-focus-ring-color, var(--hx-color-primary-500, #429797))
52
- );
49
+ var(--hx-button-focus-ring-color, var(--hx-focus-ring-color, #0f7078));
53
50
  outline-offset: var(--hx-focus-ring-offset, 2px);
54
51
  }
55
52
 
@@ -87,21 +84,24 @@
87
84
  /* ─── Style Variants ─── */
88
85
 
89
86
  .button--primary {
90
- --hx-button-bg: var(--hx-color-primary-500, #429797);
91
- --hx-button-color: var(--hx-color-text-on-primary, #ffffff);
87
+ --hx-button-bg: var(--hx-color-action-primary-bg, #429797);
88
+ /* Inline #0d1825 matches text.on-primary's resolved primitive (neutral-900);
89
+ cold-start without the semantic still paints AA-tuned dark-on-primary
90
+ rather than white-on-primary (3.43:1 fail). */
91
+ --hx-button-color: var(--hx-color-text-on-primary, #0d1825);
92
92
  --hx-button-border-color: transparent;
93
93
  }
94
94
 
95
95
  .button--secondary {
96
96
  --hx-button-bg: transparent;
97
- /* primary-500 (#429797) text on white surface = 3.43:1 — fails AA.
98
- primary-600 (#0F7078) on white = 6.06:1 — AA pass. */
99
- --hx-button-color: var(--hx-color-primary-600, #0f7078);
100
- --hx-button-border-color: var(--hx-color-primary-600, #0f7078);
97
+ /* primary-500 (#429797) text on white surface = 3.44:1 — fails AA.
98
+ primary-600 (#0F7078) on white = 5.82:1 — AA pass. */
99
+ --hx-button-color: var(--hx-color-action-secondary-fg, #0f7078);
100
+ --hx-button-border-color: var(--hx-color-action-secondary-border, #0f7078);
101
101
  }
102
102
 
103
103
  .button--secondary:hover {
104
- --hx-button-bg: var(--hx-button-hover-bg, var(--hx-color-surface-raised, #f5f8f3));
104
+ --hx-button-bg: var(--hx-button-hover-bg, var(--hx-color-action-secondary-bg-hover, #ebf8f8));
105
105
  }
106
106
 
107
107
  .button--tertiary {
@@ -115,36 +115,52 @@
115
115
  }
116
116
 
117
117
  .button--danger {
118
- --hx-button-bg: var(--hx-color-error-500, #e5493e);
119
- --hx-button-color: var(--hx-color-text-on-error, #ffffff);
118
+ --hx-button-bg: var(--hx-color-action-danger-bg, #e5493e);
119
+ /* Inline #0d1825 matches text.on-error's resolved primitive (neutral-900);
120
+ cold-start without the semantic still paints AA-tuned dark-on-error
121
+ rather than white-on-error (3.92:1 fail). */
122
+ --hx-button-color: var(--hx-color-text-on-error, #0d1825);
120
123
  --hx-button-border-color: transparent;
121
124
  }
122
125
 
123
126
  /* on-error tokens are tuned for error-500 (neutral-900 on #E5493E ≈ 4.59:1).
124
- error-600 (#C92A2A) drops that to 2.25:1 — AA fail. Hold fg at neutral-0
125
- directly so darker hover fills stay legible. Mirrors hx-toast precedent
126
- (commit 300e21ab0). */
127
+ error-600 (#C92A2A) drops that to 3.28:1 — AA fail. text.on-error-strong
128
+ resolves to neutral-0 across modes (no dark flip) so the darker hover fill
129
+ stays legible. Mirrors hx-toast precedent (commit 300e21ab0); routed
130
+ through the semantic tier in 3.2.1 token-cascade remediation. */
127
131
  .button--danger:hover {
128
- --hx-button-bg: var(--hx-button-hover-bg, var(--hx-color-error-600, #c92a2a));
129
- --hx-button-color: var(--hx-color-neutral-0, #ffffff);
132
+ --hx-button-bg: var(--hx-button-hover-bg, var(--hx-color-action-danger-bg-hover, #c92a2a));
133
+ --hx-button-color: var(--hx-color-text-on-error-strong, #ffffff);
134
+ }
135
+
136
+ /* Pressed state binds explicitly to action.danger.bg-active (error-700,
137
+ #A21312) + text.on-error-strong (neutral-0) = 7.96:1 AA. Base
138
+ .button:active filter:brightness(0.8) would compound on top of bg-hover
139
+ (#C92A2A) and produce ~3.3:1 sub-AA on the bound colors. Override the
140
+ filter to none. HC override on action.danger.bg-active flips to HC
141
+ error-500 so the on-error-strong (HC = #000) pair is AA in HC too. */
142
+ .button--danger:active {
143
+ --hx-button-bg: var(--hx-button-active-bg, var(--hx-color-action-danger-bg-active, #a21312));
144
+ --hx-button-color: var(--hx-color-text-on-error-strong, #ffffff);
145
+ filter: none;
130
146
  }
131
147
 
132
148
  .button--ghost {
133
149
  --hx-button-bg: transparent;
134
- /* primary-500 (#429797) text on white surface = 3.43:1 — fails AA.
135
- primary-600 (#0F7078) on white = 6.06:1 — AA pass. */
136
- --hx-button-color: var(--hx-color-primary-600, #0f7078);
150
+ /* primary-500 (#429797) text on white surface = 3.44:1 — fails AA.
151
+ primary-600 (#0F7078) on white = 5.82:1 — AA pass. */
152
+ --hx-button-color: var(--hx-color-action-ghost-fg, #0f7078);
137
153
  --hx-button-border-color: transparent;
138
154
  }
139
155
 
140
156
  .button--ghost:hover {
141
- --hx-button-bg: var(--hx-button-hover-bg, var(--hx-color-surface-raised, #f5f8f3));
157
+ --hx-button-bg: var(--hx-button-hover-bg, var(--hx-color-action-ghost-bg-hover, #ebf8f8));
142
158
  }
143
159
 
144
160
  .button--outline {
145
161
  --hx-button-bg: transparent;
146
162
  --hx-button-color: var(--hx-color-text-primary, #0d1825);
147
- --hx-button-border-color: var(--hx-color-border-strong, #8e9c98);
163
+ --hx-button-border-color: var(--hx-color-border-strong, #66787b);
148
164
  }
149
165
 
150
166
  .button--outline:hover {
@@ -152,12 +168,24 @@
152
168
  }
153
169
 
154
170
  /* on-primary token resolves to neutral-900 (#0D1825) — tuned for primary-500.
155
- primary-600 (#0F7078) drops the pair to 3.07:1 — AA fail. Pin fg at
156
- neutral-0 for the darker hover fill. Mirrors hx-toast precedent
157
- (commit 300e21ab0). */
171
+ primary-600 (#0F7078) drops the pair to 3.07:1 — AA fail. text.on-primary-strong
172
+ resolves to neutral-0 across modes (no dark flip) for the darker hover fill.
173
+ Mirrors hx-toast precedent (commit 300e21ab0); routed through the semantic
174
+ tier in 3.2.1 token-cascade remediation. */
158
175
  .button--primary:hover {
159
- --hx-button-bg: var(--hx-button-hover-bg, var(--hx-color-primary-600, #0f7078));
160
- --hx-button-color: var(--hx-color-neutral-0, #ffffff);
176
+ --hx-button-bg: var(--hx-button-hover-bg, var(--hx-color-action-primary-bg-hover, #0f7078));
177
+ --hx-button-color: var(--hx-color-text-on-primary-strong, #ffffff);
178
+ }
179
+
180
+ /* Pressed state binds explicitly to action.primary.bg-active (primary-700,
181
+ #0F6363) + text.on-primary-strong (neutral-0) = 7.03:1 AA. The base
182
+ .button:active filter:brightness(0.8) would compound on top of bg-hover
183
+ (#0F7078) and produce ~3.7:1 sub-AA on the bound colors. Override the
184
+ filter to none so the action.*.bg-active token is what actually paints. */
185
+ .button--primary:active {
186
+ --hx-button-bg: var(--hx-button-active-bg, var(--hx-color-action-primary-bg-active, #0f6363));
187
+ --hx-button-color: var(--hx-color-text-on-primary-strong, #ffffff);
188
+ filter: none;
161
189
  }
162
190
 
163
191
  /* ─── Disabled ─── */
@@ -201,9 +229,19 @@
201
229
 
202
230
  /* ─── Inverted Mode ─── */
203
231
 
232
+ /* Inline-fallback contract for --hx-color-border-on-dark-* in this section:
233
+ the literal rgba(255, 255, 255, 0.X) arms are a LIGHT-MODE-only last
234
+ resort (cold-start, CSS-not-loaded). At runtime, hx-theme injects
235
+ dark.color.border.on-dark-* as overlay-black-* so dark-mode inverted
236
+ buttons stay visible on the now-light surface.inverse (#EBEEE9). The
237
+ inline white overlays would render invisible (≈1.1:1) on a light surface,
238
+ but they never paint when the theme is mounted. If a future change moves
239
+ these into a context where hx-theme is not guaranteed, replace with
240
+ mode-aware tokens. */
241
+
204
242
  /* Override text color and filter-based hover/active for all variants */
205
243
  :host([inverted]) .button {
206
- color: var(--hx-button-inverted-color, var(--hx-color-neutral-0, #ffffff));
244
+ color: var(--hx-button-inverted-color, var(--hx-color-text-inverse, #ffffff));
207
245
  filter: none;
208
246
  }
209
247
 
@@ -216,37 +254,89 @@
216
254
  }
217
255
 
218
256
  :host([inverted]) .button:focus-visible {
257
+ /* WCAG 1.4.11: focus indicator needs ≥3:1 against adjacent colors.
258
+ border-on-dark-default (overlay-white-30) ≈ 2.7:1 on neutral-900 — fails.
259
+ border-on-dark-strong (overlay-white-70) ≈ 5:1 — passes. */
219
260
  outline-color: var(
220
261
  --hx-button-inverted-focus-ring-color,
221
- var(--hx-overlay-white-50, rgba(255, 255, 255, 0.5))
262
+ var(--hx-color-border-on-dark-strong, rgba(255, 255, 255, 0.7))
222
263
  );
223
264
  }
224
265
 
225
- /* Primary inverted — slight transparent white overlay on hover */
226
- :host([inverted]) .button--primary:hover {
227
- --hx-button-bg: var(--hx-color-primary-400, #6ab1b1);
266
+ /* Primary inverted — resting bg routes through action.primary.bg-inverted-rest
267
+ so dark mode can flip the fill to primary-600. surface.inverse becomes light
268
+ (#EBEEE9) in dark mode; primary-500 on #EBEEE9 = 2.94:1 (sub-3:1 UI floor
269
+ fail for the inverted-button boundary). primary-600 on #EBEEE9 = 4.97:1
270
+ (AA pass). Light mode tracks action.primary.bg (primary-500, 5.20:1 on
271
+ dark surface.inverse). */
272
+ :host([inverted]) .button--primary {
273
+ --hx-button-bg: var(--hx-color-action-primary-bg-inverted-rest, #429797);
274
+ }
275
+
276
+ /* Primary inverted — hover/pressed lift to action.primary.bg-inverted-hover
277
+ (primary-400, light teal). The base :host([inverted]) .button rule binds
278
+ color to text.inverse, which flips by mode (neutral-0 in light, neutral-900
279
+ in dark). On a permanent light-teal fill, white text drops to 2.4:1 in
280
+ light mode (AA fail). Pin color to text.on-primary (neutral-900, no
281
+ dark-mode flip) for both hover and active so the foreground is dark in
282
+ both modes — neutral-900 on primary-400 = 7.27:1 (AA pass).
283
+ Pressed === hover visually in inverted mode is acceptable UX (the
284
+ transient absence of pointer over the button signals release).
285
+ The fallback chain wraps --hx-button-active-bg (highest precedence) and
286
+ --hx-button-hover-bg so consumer overrides on either prop apply under
287
+ :host([inverted]) — the two share a paint here, so either knob is
288
+ honored, with active-bg winning when both are set. */
289
+ :host([inverted]) .button--primary:hover,
290
+ :host([inverted]) .button--primary:active {
291
+ --hx-button-bg: var(
292
+ --hx-button-active-bg,
293
+ var(--hx-button-hover-bg, var(--hx-color-action-primary-bg-inverted-hover, #6ab1b1))
294
+ );
295
+ color: var(
296
+ --hx-button-inverted-primary-interactive-color,
297
+ var(--hx-color-text-on-primary, #0d1825)
298
+ );
228
299
  }
229
300
 
230
- /* Secondary inverted — white border and text */
301
+ /* Danger inverted — sister to primary. Hover/pressed lift to
302
+ action.danger.bg-inverted-hover (error-400, #FC7264). Same foreground
303
+ contract: text.inverse fails in light mode (white on light red ≈ 2.6:1);
304
+ pin to text.on-error (neutral-900, no dark-mode flip) for 6.58:1 in both
305
+ modes. Same active-bg → hover-bg → semantic fallback chain as primary. */
306
+ :host([inverted]) .button--danger:hover,
307
+ :host([inverted]) .button--danger:active {
308
+ --hx-button-bg: var(
309
+ --hx-button-active-bg,
310
+ var(--hx-button-hover-bg, var(--hx-color-action-danger-bg-inverted-hover, #fc7264))
311
+ );
312
+ color: var(
313
+ --hx-button-inverted-danger-interactive-color,
314
+ var(--hx-color-text-on-error, #0d1825)
315
+ );
316
+ }
317
+
318
+ /* Secondary inverted — white border and translucent hover fill */
231
319
  :host([inverted]) .button--secondary {
232
- --hx-button-border-color: var(--hx-overlay-white-70, rgba(255, 255, 255, 0.7));
320
+ --hx-button-border-color: var(--hx-color-border-on-dark-strong, rgba(255, 255, 255, 0.7));
233
321
  }
234
322
 
235
323
  :host([inverted]) .button--secondary:hover {
236
- --hx-button-bg: var(--hx-overlay-white-15, rgba(255, 255, 255, 0.15));
324
+ --hx-button-bg: var(--hx-color-border-on-dark-default, rgba(255, 255, 255, 0.3));
237
325
  }
238
326
 
239
- /* Tertiary inverted */
327
+ /* Tertiary inverted — resting at subtle (10%) lifts to default (30%) on hover
328
+ so the runtime hover delta is visually distinct, not collapsed onto a
329
+ single token. */
240
330
  :host([inverted]) .button--tertiary {
241
- --hx-button-bg: var(--hx-overlay-white-15, rgba(255, 255, 255, 0.15));
331
+ --hx-button-bg: var(--hx-color-border-on-dark-subtle, rgba(255, 255, 255, 0.1));
242
332
  --hx-button-border-color: transparent;
243
333
  }
244
334
 
245
335
  :host([inverted]) .button--tertiary:hover {
246
- --hx-button-bg: var(--hx-overlay-white-25, rgba(255, 255, 255, 0.25));
336
+ --hx-button-bg: var(--hx-color-border-on-dark-default, rgba(255, 255, 255, 0.3));
247
337
  }
248
338
 
249
- /* Ghost inverted — transparent base, white hover bg */
339
+ /* Ghost inverted — transparent base, translucent hover bg */
250
340
  :host([inverted]) .button--ghost {
251
341
  --hx-button-bg: transparent;
252
342
  --hx-button-border-color: transparent;
@@ -255,17 +345,17 @@
255
345
  :host([inverted]) .button--ghost:hover {
256
346
  --hx-button-bg: var(
257
347
  --hx-button-inverted-ghost-hover-bg,
258
- var(--hx-overlay-white-20, rgba(255, 255, 255, 0.2))
348
+ var(--hx-color-border-on-dark-default, rgba(255, 255, 255, 0.3))
259
349
  );
260
350
  }
261
351
 
262
352
  /* Outline inverted — white border */
263
353
  :host([inverted]) .button--outline {
264
- --hx-button-border-color: var(--hx-overlay-white-70, rgba(255, 255, 255, 0.7));
354
+ --hx-button-border-color: var(--hx-color-border-on-dark-strong, rgba(255, 255, 255, 0.7));
265
355
  }
266
356
 
267
357
  :host([inverted]) .button--outline:hover {
268
- --hx-button-bg: var(--hx-overlay-white-15, rgba(255, 255, 255, 0.15));
358
+ --hx-button-bg: var(--hx-color-border-on-dark-default, rgba(255, 255, 255, 0.3));
269
359
  }
270
360
 
271
361
  /* ─── Prefix / Suffix / Label ─── */
@@ -293,6 +383,16 @@
293
383
  border: 2px solid ButtonText;
294
384
  }
295
385
 
386
+ .button:hover {
387
+ /* Hover affordance must survive in HC. Highlight/HighlightText is the
388
+ OS-level "selected" pair, mirroring the forcedColorsInteractive mixin's
389
+ hover contract — kept inline since this component owns its bespoke HC
390
+ block (XOR rule). */
391
+ background-color: Highlight;
392
+ color: HighlightText;
393
+ border-color: Highlight;
394
+ }
395
+
296
396
  .button:focus-visible {
297
397
  outline: 3px solid Highlight;
298
398
  outline-offset: 2px;
@@ -84,10 +84,7 @@
84
84
 
85
85
  .card--interactive:focus-visible {
86
86
  outline: var(--hx-focus-ring-width, 2px) solid
87
- var(
88
- --hx-card-focus-ring-color,
89
- var(--hx-focus-ring-color, var(--hx-color-primary-500, #429797))
90
- );
87
+ var(--hx-card-focus-ring-color, var(--hx-focus-ring-color, #0f7078));
91
88
  outline-offset: var(--hx-focus-ring-offset, 2px);
92
89
  }
93
90
 
@@ -62,7 +62,7 @@
62
62
 
63
63
  .nav-btn:focus-visible {
64
64
  outline: var(--hx-focus-ring-width, 2px) solid
65
- var(--hx-carousel-focus-ring-color, var(--hx-focus-ring-color, var(--hx-color-primary-500)));
65
+ var(--hx-carousel-focus-ring-color, var(--hx-focus-ring-color, #0f7078));
66
66
  outline-offset: var(--hx-focus-ring-offset, 2px);
67
67
  }
68
68
 
@@ -104,7 +104,7 @@
104
104
 
105
105
  .play-pause-btn:focus-visible {
106
106
  outline: var(--hx-focus-ring-width, 2px) solid
107
- var(--hx-carousel-focus-ring-color, var(--hx-focus-ring-color, var(--hx-color-primary-500)));
107
+ var(--hx-carousel-focus-ring-color, var(--hx-focus-ring-color, #0f7078));
108
108
  outline-offset: var(--hx-focus-ring-offset, 2px);
109
109
  }
110
110
 
@@ -176,7 +176,7 @@
176
176
 
177
177
  .pagination-item:focus-visible {
178
178
  outline: var(--hx-focus-ring-width, 2px) solid
179
- var(--hx-carousel-focus-ring-color, var(--hx-focus-ring-color, var(--hx-color-primary-500)));
179
+ var(--hx-carousel-focus-ring-color, var(--hx-focus-ring-color, #0f7078));
180
180
  outline-offset: var(--hx-focus-ring-offset, 2px);
181
181
  border-radius: var(--hx-border-radius-full, 9999px);
182
182
  }
@@ -58,7 +58,7 @@
58
58
  width: var(--hx-checkbox-size, var(--hx-size-5, 1.25rem));
59
59
  height: var(--hx-checkbox-size, var(--hx-size-5, 1.25rem));
60
60
  border: var(--hx-border-width-medium, 2px) solid
61
- var(--hx-checkbox-border-color, var(--hx-color-border-strong, #8e9c98));
61
+ var(--hx-checkbox-border-color, var(--hx-color-border-strong, #66787b));
62
62
  border-radius: var(--hx-checkbox-border-radius, var(--hx-border-radius-sm, 0.25rem));
63
63
  background-color: var(--hx-checkbox-bg, var(--hx-color-surface-default, #ffffff));
64
64
  transition:
@@ -74,7 +74,7 @@
74
74
  outline: var(--hx-checkbox-focus-ring-width, var(--hx-focus-ring-width, 2px)) solid
75
75
  var(
76
76
  --hx-checkbox-focus-ring-color,
77
- var(--hx-focus-ring-color, var(--hx-color-primary-400, #6ab1b1))
77
+ var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078))
78
78
  );
79
79
  outline-offset: var(--hx-checkbox-focus-ring-offset, var(--hx-focus-ring-offset, 2px));
80
80
  }
@@ -184,8 +184,7 @@
184
184
  }
185
185
 
186
186
  .clinical-status__dismiss-button:focus-visible {
187
- outline: var(--hx-focus-ring-width, 2px) solid
188
- var(--hx-focus-ring-color, var(--hx-color-focus, #429797));
187
+ outline: var(--hx-focus-ring-width, 2px) solid var(--hx-focus-ring-color, #0f7078);
189
188
  outline-offset: var(--hx-focus-ring-offset, 2px);
190
189
  opacity: 1;
191
190
  }
@@ -230,8 +229,7 @@
230
229
  }
231
230
 
232
231
  .clinical-status__acknowledge-button:focus-visible {
233
- outline: var(--hx-focus-ring-width, 2px) solid
234
- var(--hx-focus-ring-color, var(--hx-color-focus, #429797));
232
+ outline: var(--hx-focus-ring-width, 2px) solid var(--hx-focus-ring-color, #0f7078);
235
233
  outline-offset: var(--hx-focus-ring-offset, 2px);
236
234
  }
237
235
 
@@ -78,7 +78,8 @@
78
78
  min-width: var(--hx-touch-target-min, 2.75rem);
79
79
  min-height: var(--hx-touch-target-min, 2.75rem);
80
80
  padding: var(--hx-space-1, 0.25rem) var(--hx-space-2, 0.5rem);
81
- border: var(--hx-border-width-thin, 1px) solid var(--hx-color-border-strong, #8e9c98);
81
+ border: var(--hx-border-width-thin, 1px) solid
82
+ var(--hx-color-border-on-dark-strong, rgba(255, 255, 255, 0.7));
82
83
  border-radius: var(--hx-border-radius-sm, 0.25rem);
83
84
  /* Copy button sits on the always-dark block snippet surface; uses inverse family for contrast on the terminal background. */
84
85
  background-color: var(--hx-color-surface-inverse, #0d1825);
@@ -104,7 +105,7 @@
104
105
 
105
106
  .code-snippet__copy-button:focus-visible {
106
107
  outline: var(--hx-focus-ring-width, 2px) solid
107
- var(--hx-focus-ring-color, var(--hx-color-primary-400, #6ab1b1));
108
+ var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078));
108
109
  outline-offset: var(--hx-focus-ring-offset, 2px);
109
110
  }
110
111
 
@@ -123,7 +124,8 @@
123
124
  min-height: var(--hx-touch-target-min, 2.75rem);
124
125
  padding: var(--hx-space-2, 0.5rem) var(--hx-space-4, 1rem);
125
126
  border: none;
126
- border-top: var(--hx-border-width-thin, 1px) solid var(--hx-color-border-strong, #8e9c98);
127
+ border-top: var(--hx-border-width-thin, 1px) solid
128
+ var(--hx-color-border-on-dark-strong, rgba(255, 255, 255, 0.7));
127
129
  /* Expand button is attached to the always-dark block snippet — inverse family maintains the terminal aesthetic. */
128
130
  background-color: var(--hx-color-surface-inverse, #0d1825);
129
131
  color: var(--hx-color-text-inverse, #ffffff);
@@ -145,7 +147,7 @@
145
147
 
146
148
  .code-snippet__expand-button:focus-visible {
147
149
  outline: var(--hx-focus-ring-width, 2px) solid
148
- var(--hx-focus-ring-color, var(--hx-color-primary-400, #6ab1b1));
150
+ var(--hx-focus-ring-color, var(--hx-color-primary-600, #0f7078));
149
151
  outline-offset: var(--hx-focus-ring-offset, 2px);
150
152
  }
151
153