@helixui/library 3.3.1-next.118 → 3.4.0-next.121

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 (249) hide show
  1. package/custom-elements.json +422 -322
  2. package/dist/components/hx-alert/hx-alert.d.ts +11 -0
  3. package/dist/components/hx-alert/hx-alert.d.ts.map +1 -1
  4. package/dist/components/hx-alert/hx-alert.styles.d.ts.map +1 -1
  5. package/dist/components/hx-alert/index.js +1 -1
  6. package/dist/components/hx-badge/hx-badge.styles.d.ts.map +1 -1
  7. package/dist/components/hx-badge/index.js +1 -1
  8. package/dist/components/hx-banner/hx-banner.d.ts +9 -1
  9. package/dist/components/hx-banner/hx-banner.d.ts.map +1 -1
  10. package/dist/components/hx-banner/index.js +1 -1
  11. package/dist/components/hx-button/hx-button.d.ts +11 -1
  12. package/dist/components/hx-button/hx-button.d.ts.map +1 -1
  13. package/dist/components/hx-button/index.js +1 -1
  14. package/dist/components/hx-button-group/hx-button-group.d.ts +13 -0
  15. package/dist/components/hx-button-group/hx-button-group.d.ts.map +1 -1
  16. package/dist/components/hx-button-group/index.js +1 -1
  17. package/dist/components/hx-checkbox/hx-checkbox.d.ts.map +1 -1
  18. package/dist/components/hx-checkbox/index.js +1 -1
  19. package/dist/components/hx-checkbox-group/index.js +1 -1
  20. package/dist/components/hx-color-picker/index.js +1 -1
  21. package/dist/components/hx-combobox/index.js +1 -1
  22. package/dist/components/hx-data-table/hx-data-table.d.ts.map +1 -1
  23. package/dist/components/hx-data-table/index.js +1 -1
  24. package/dist/components/hx-date-picker/index.js +1 -1
  25. package/dist/components/hx-dialog/index.js +1 -1
  26. package/dist/components/hx-drawer/hx-drawer.d.ts +201 -0
  27. package/dist/components/hx-drawer/hx-drawer.d.ts.map +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-dropdown/hx-dropdown.d.ts +96 -8
  31. package/dist/components/hx-dropdown/hx-dropdown.d.ts.map +1 -1
  32. package/dist/components/hx-dropdown/index.js +1 -1
  33. package/dist/components/hx-icon-button/hx-icon-button.d.ts +16 -3
  34. package/dist/components/hx-icon-button/hx-icon-button.d.ts.map +1 -1
  35. package/dist/components/hx-icon-button/hx-icon-button.styles.d.ts.map +1 -1
  36. package/dist/components/hx-icon-button/index.js +1 -1
  37. package/dist/components/hx-link/hx-link.d.ts +10 -1
  38. package/dist/components/hx-link/hx-link.d.ts.map +1 -1
  39. package/dist/components/hx-link/index.js +1 -1
  40. package/dist/components/hx-list/hx-list-item.d.ts +27 -1
  41. package/dist/components/hx-list/hx-list-item.d.ts.map +1 -1
  42. package/dist/components/hx-list/hx-list.d.ts +28 -0
  43. package/dist/components/hx-list/hx-list.d.ts.map +1 -1
  44. package/dist/components/hx-list/index.js +1 -1
  45. package/dist/components/hx-menu/hx-menu-divider.d.ts +10 -0
  46. package/dist/components/hx-menu/hx-menu-divider.d.ts.map +1 -1
  47. package/dist/components/hx-menu/hx-menu-item.d.ts +99 -2
  48. package/dist/components/hx-menu/hx-menu-item.d.ts.map +1 -1
  49. package/dist/components/hx-menu/hx-menu-item.styles.d.ts.map +1 -1
  50. package/dist/components/hx-menu/hx-menu.d.ts +117 -2
  51. package/dist/components/hx-menu/hx-menu.d.ts.map +1 -1
  52. package/dist/components/hx-menu/index.js +1 -1
  53. package/dist/components/hx-meter/hx-meter.d.ts +39 -0
  54. package/dist/components/hx-meter/hx-meter.d.ts.map +1 -1
  55. package/dist/components/hx-meter/hx-meter.styles.d.ts.map +1 -1
  56. package/dist/components/hx-meter/index.js +1 -1
  57. package/dist/components/hx-overflow-menu/hx-overflow-menu.d.ts +132 -1
  58. package/dist/components/hx-overflow-menu/hx-overflow-menu.d.ts.map +1 -1
  59. package/dist/components/hx-overflow-menu/index.js +1 -1
  60. package/dist/components/hx-phi-field/hx-phi-field.d.ts +0 -1
  61. package/dist/components/hx-phi-field/hx-phi-field.d.ts.map +1 -1
  62. package/dist/components/hx-popover/index.js +1 -1
  63. package/dist/components/hx-progress-bar/hx-progress-bar.d.ts +33 -0
  64. package/dist/components/hx-progress-bar/hx-progress-bar.d.ts.map +1 -1
  65. package/dist/components/hx-progress-bar/index.js +1 -1
  66. package/dist/components/hx-radio-group/index.js +1 -1
  67. package/dist/components/hx-select/hx-select.d.ts +1 -0
  68. package/dist/components/hx-select/hx-select.d.ts.map +1 -1
  69. package/dist/components/hx-select/index.js +1 -1
  70. package/dist/components/hx-spinner/hx-spinner.d.ts +14 -0
  71. package/dist/components/hx-spinner/hx-spinner.d.ts.map +1 -1
  72. package/dist/components/hx-spinner/index.js +1 -1
  73. package/dist/components/hx-split-button/hx-split-button.d.ts +94 -7
  74. package/dist/components/hx-split-button/hx-split-button.d.ts.map +1 -1
  75. package/dist/components/hx-split-button/index.js +1 -1
  76. package/dist/components/hx-stat/hx-stat.d.ts +28 -0
  77. package/dist/components/hx-stat/hx-stat.d.ts.map +1 -1
  78. package/dist/components/hx-stat/index.js +1 -1
  79. package/dist/components/hx-switch/index.js +1 -1
  80. package/dist/components/hx-table/hx-td.d.ts +30 -3
  81. package/dist/components/hx-table/hx-td.d.ts.map +1 -1
  82. package/dist/components/hx-table/hx-th.d.ts +39 -3
  83. package/dist/components/hx-table/hx-th.d.ts.map +1 -1
  84. package/dist/components/hx-table/hx-tr.d.ts +26 -0
  85. package/dist/components/hx-table/hx-tr.d.ts.map +1 -1
  86. package/dist/components/hx-table/index.js +1 -1
  87. package/dist/components/hx-tabs/hx-tab-panel.d.ts +34 -0
  88. package/dist/components/hx-tabs/hx-tab-panel.d.ts.map +1 -1
  89. package/dist/components/hx-tabs/hx-tab.d.ts +45 -2
  90. package/dist/components/hx-tabs/hx-tab.d.ts.map +1 -1
  91. package/dist/components/hx-tabs/hx-tab.styles.d.ts.map +1 -1
  92. package/dist/components/hx-tabs/hx-tabs.d.ts +32 -2
  93. package/dist/components/hx-tabs/hx-tabs.d.ts.map +1 -1
  94. package/dist/components/hx-tabs/index.js +1 -1
  95. package/dist/components/hx-tag/hx-tag.styles.d.ts.map +1 -1
  96. package/dist/components/hx-tag/index.js +1 -1
  97. package/dist/components/hx-theme/hx-theme.d.ts +10 -5
  98. package/dist/components/hx-theme/hx-theme.d.ts.map +1 -1
  99. package/dist/components/hx-time-picker/hx-time-picker.d.ts +210 -2
  100. package/dist/components/hx-time-picker/hx-time-picker.d.ts.map +1 -1
  101. package/dist/components/hx-time-picker/hx-time-picker.styles.d.ts.map +1 -1
  102. package/dist/components/hx-time-picker/index.js +1 -1
  103. package/dist/components/hx-toast/hx-toast-stack.d.ts +14 -0
  104. package/dist/components/hx-toast/hx-toast-stack.d.ts.map +1 -1
  105. package/dist/components/hx-toast/hx-toast.d.ts +22 -3
  106. package/dist/components/hx-toast/hx-toast.d.ts.map +1 -1
  107. package/dist/components/hx-toast/index.js +1 -1
  108. package/dist/components/hx-toast/toast-factory.d.ts.map +1 -1
  109. package/dist/components/hx-toggle-button/index.js +1 -1
  110. package/dist/components/hx-tree-view/hx-tree-item.d.ts +117 -12
  111. package/dist/components/hx-tree-view/hx-tree-item.d.ts.map +1 -1
  112. package/dist/components/hx-tree-view/hx-tree-view.d.ts +87 -7
  113. package/dist/components/hx-tree-view/hx-tree-view.d.ts.map +1 -1
  114. package/dist/components/hx-tree-view/index.js +1 -1
  115. package/dist/css/helix-all.css +123 -0
  116. package/dist/css/helix-core.css +81 -0
  117. package/dist/css/helix-feedback.css +14 -0
  118. package/dist/css/helix-forms.css +11 -0
  119. package/dist/css/helix-overlay.css +17 -0
  120. package/dist/css/hx-alert.css +9 -0
  121. package/dist/css/hx-badge.css +28 -0
  122. package/dist/css/hx-drawer.css +17 -0
  123. package/dist/css/hx-icon-button.css +30 -0
  124. package/dist/css/hx-meter.css +5 -0
  125. package/dist/css/hx-tag.css +23 -0
  126. package/dist/css/hx-time-picker.css +11 -0
  127. package/dist/css/index.css +1 -1
  128. package/dist/css/manifest.json +3 -1
  129. package/dist/index.js +35 -35
  130. package/dist/shared/aria-idref-CxvyzfQS.js +126 -0
  131. package/dist/shared/aria-idref-CxvyzfQS.js.map +1 -0
  132. package/dist/shared/{hx-alert-CLn7CstP.js → hx-alert-Bto8-TIi.js} +55 -37
  133. package/dist/shared/hx-alert-Bto8-TIi.js.map +1 -0
  134. package/dist/shared/{hx-badge-CQXgOXJM.js → hx-badge-JlFtAdxS.js} +37 -9
  135. package/dist/shared/hx-badge-JlFtAdxS.js.map +1 -0
  136. package/dist/shared/{hx-banner-D3DzpfcP.js → hx-banner-fpRnciIO.js} +13 -5
  137. package/dist/shared/hx-banner-fpRnciIO.js.map +1 -0
  138. package/dist/shared/{hx-button-DPY6SPVT.js → hx-button-BOwAEcF1.js} +108 -85
  139. package/dist/shared/{hx-button-DPY6SPVT.js.map → hx-button-BOwAEcF1.js.map} +1 -1
  140. package/dist/shared/{hx-button-group-BI-QBqmO.js → hx-button-group-DcHP5MBv.js} +15 -16
  141. package/dist/shared/{hx-button-group-BI-QBqmO.js.map → hx-button-group-DcHP5MBv.js.map} +1 -1
  142. package/dist/shared/{hx-checkbox-BdgoUeWi.js → hx-checkbox-C48KYKFq.js} +87 -87
  143. package/dist/shared/hx-checkbox-C48KYKFq.js.map +1 -0
  144. package/dist/shared/{hx-checkbox-group-LWezHrvS.js → hx-checkbox-group-BJIAX3zU.js} +2 -2
  145. package/dist/shared/{hx-checkbox-group-LWezHrvS.js.map → hx-checkbox-group-BJIAX3zU.js.map} +1 -1
  146. package/dist/shared/{hx-color-picker-DVhZl88b.js → hx-color-picker-Dk4cBwYQ.js} +2 -2
  147. package/dist/shared/{hx-color-picker-DVhZl88b.js.map → hx-color-picker-Dk4cBwYQ.js.map} +1 -1
  148. package/dist/shared/{hx-combobox-DvlezcDV.js → hx-combobox-BTLO9qiK.js} +2 -2
  149. package/dist/shared/{hx-combobox-DvlezcDV.js.map → hx-combobox-BTLO9qiK.js.map} +1 -1
  150. package/dist/shared/{hx-data-table-CLqVqdxr.js → hx-data-table-Ct3gQ6ya.js} +3 -2
  151. package/dist/shared/{hx-data-table-CLqVqdxr.js.map → hx-data-table-Ct3gQ6ya.js.map} +1 -1
  152. package/dist/shared/{hx-date-picker-N-0aG5XL.js → hx-date-picker-CiR7FVnR.js} +2 -2
  153. package/dist/shared/{hx-date-picker-N-0aG5XL.js.map → hx-date-picker-CiR7FVnR.js.map} +1 -1
  154. package/dist/shared/{hx-dialog-DzB7VytW.js → hx-dialog-AOZpHSuF.js} +2 -2
  155. package/dist/shared/{hx-dialog-DzB7VytW.js.map → hx-dialog-AOZpHSuF.js.map} +1 -1
  156. package/dist/shared/{hx-drawer-Y1Ui2IWJ.js → hx-drawer-DH6CdAN1.js} +300 -98
  157. package/dist/shared/hx-drawer-DH6CdAN1.js.map +1 -0
  158. package/dist/shared/hx-dropdown-DiLd40Lm.js +401 -0
  159. package/dist/shared/hx-dropdown-DiLd40Lm.js.map +1 -0
  160. package/dist/shared/{hx-icon-button-CGNdQSFM.js → hx-icon-button-a6OpeQz5.js} +149 -68
  161. package/dist/shared/hx-icon-button-a6OpeQz5.js.map +1 -0
  162. package/dist/shared/{hx-link-C-O6vq0Q.js → hx-link-CMnZRUtQ.js} +55 -43
  163. package/dist/shared/hx-link-CMnZRUtQ.js.map +1 -0
  164. package/dist/shared/{hx-list-MyEhh8c7.js → hx-list-De66EtAP.js} +163 -107
  165. package/dist/shared/hx-list-De66EtAP.js.map +1 -0
  166. package/dist/shared/hx-menu-divider-BjiRIWKq.js +797 -0
  167. package/dist/shared/hx-menu-divider-BjiRIWKq.js.map +1 -0
  168. package/dist/shared/{hx-meter-BPscsw5t.js → hx-meter-BJdh6nrF.js} +105 -64
  169. package/dist/shared/hx-meter-BJdh6nrF.js.map +1 -0
  170. package/dist/shared/hx-overflow-menu-BQ4fiMYu.js +492 -0
  171. package/dist/shared/hx-overflow-menu-BQ4fiMYu.js.map +1 -0
  172. package/dist/shared/hx-phi-field-C19oxlrr.js.map +1 -1
  173. package/dist/shared/{hx-popover-CHxWY_cd.js → hx-popover-B9W8-tC0.js} +2 -2
  174. package/dist/shared/{hx-popover-CHxWY_cd.js.map → hx-popover-B9W8-tC0.js.map} +1 -1
  175. package/dist/shared/hx-progress-bar-C8nDMdYa.js +290 -0
  176. package/dist/shared/hx-progress-bar-C8nDMdYa.js.map +1 -0
  177. package/dist/shared/{hx-radio-CeGzARNk.js → hx-radio-Z1lV1zTO.js} +2 -2
  178. package/dist/shared/{hx-radio-CeGzARNk.js.map → hx-radio-Z1lV1zTO.js.map} +1 -1
  179. package/dist/shared/{hx-select-DrcS-YRJ.js → hx-select-D18CnJ0e.js} +2 -2
  180. package/dist/shared/hx-select-D18CnJ0e.js.map +1 -0
  181. package/dist/shared/{hx-spinner-DL5AYr16.js → hx-spinner-BB0h2hKZ.js} +62 -34
  182. package/dist/shared/hx-spinner-BB0h2hKZ.js.map +1 -0
  183. package/dist/shared/{hx-split-button-Djnc5Aeg.js → hx-split-button-BoABoEm5.js} +153 -82
  184. package/dist/shared/hx-split-button-BoABoEm5.js.map +1 -0
  185. package/dist/shared/{hx-stat-WOcNV1Ry.js → hx-stat-Dtf9lz-O.js} +77 -47
  186. package/dist/shared/hx-stat-Dtf9lz-O.js.map +1 -0
  187. package/dist/shared/{hx-switch-BX_8uNUs.js → hx-switch-B6kr-EwE.js} +2 -2
  188. package/dist/shared/{hx-switch-BX_8uNUs.js.map → hx-switch-B6kr-EwE.js.map} +1 -1
  189. package/dist/shared/{hx-tab-panel-DspCrKqo.js → hx-tab-panel-BQtBXKLD.js} +255 -131
  190. package/dist/shared/hx-tab-panel-BQtBXKLD.js.map +1 -0
  191. package/dist/shared/{hx-tag-CNSmdyaK.js → hx-tag-C5aCUpVi.js} +63 -40
  192. package/dist/shared/hx-tag-C5aCUpVi.js.map +1 -0
  193. package/dist/shared/{hx-td-DnnEMIuA.js → hx-td-BGkFOJEK.js} +267 -123
  194. package/dist/shared/hx-td-BGkFOJEK.js.map +1 -0
  195. package/dist/shared/hx-theme-BsefFWTO.js.map +1 -1
  196. package/dist/shared/hx-time-picker-iwCD7rzW.js +1038 -0
  197. package/dist/shared/hx-time-picker-iwCD7rzW.js.map +1 -0
  198. package/dist/shared/{hx-toggle-button-Dcz9IlUm.js → hx-toggle-button-BQ81EDkl.js} +2 -2
  199. package/dist/shared/{hx-toggle-button-Dcz9IlUm.js.map → hx-toggle-button-BQ81EDkl.js.map} +1 -1
  200. package/dist/shared/hx-tree-item-CHrUhuZL.js +925 -0
  201. package/dist/shared/hx-tree-item-CHrUhuZL.js.map +1 -0
  202. package/dist/shared/menu-roving-DmMnzJhn.js +14 -0
  203. package/dist/shared/menu-roving-DmMnzJhn.js.map +1 -0
  204. package/dist/shared/menu-tree-BNM0SYYq.js +42 -0
  205. package/dist/shared/menu-tree-BNM0SYYq.js.map +1 -0
  206. package/dist/shared/{toast-factory-YSznocIV.js → toast-factory-CL2BzdSB.js} +128 -77
  207. package/dist/shared/toast-factory-CL2BzdSB.js.map +1 -0
  208. package/dist/utils/aria-idref.d.ts.map +1 -1
  209. package/dist/utils/menu-label.d.ts +18 -0
  210. package/dist/utils/menu-label.d.ts.map +1 -0
  211. package/dist/utils/menu-roving.d.ts +28 -0
  212. package/dist/utils/menu-roving.d.ts.map +1 -0
  213. package/dist/utils/menu-tree.d.ts +41 -0
  214. package/dist/utils/menu-tree.d.ts.map +1 -0
  215. package/dist/utils/tree-walk.d.ts +53 -0
  216. package/dist/utils/tree-walk.d.ts.map +1 -0
  217. package/figma-inventory.json +69 -20
  218. package/package.json +2 -2
  219. package/dist/shared/aria-idref-Q0yiSR3p.js +0 -104
  220. package/dist/shared/aria-idref-Q0yiSR3p.js.map +0 -1
  221. package/dist/shared/hx-alert-CLn7CstP.js.map +0 -1
  222. package/dist/shared/hx-badge-CQXgOXJM.js.map +0 -1
  223. package/dist/shared/hx-banner-D3DzpfcP.js.map +0 -1
  224. package/dist/shared/hx-checkbox-BdgoUeWi.js.map +0 -1
  225. package/dist/shared/hx-drawer-Y1Ui2IWJ.js.map +0 -1
  226. package/dist/shared/hx-dropdown-DJWlF94E.js +0 -316
  227. package/dist/shared/hx-dropdown-DJWlF94E.js.map +0 -1
  228. package/dist/shared/hx-icon-button-CGNdQSFM.js.map +0 -1
  229. package/dist/shared/hx-link-C-O6vq0Q.js.map +0 -1
  230. package/dist/shared/hx-list-MyEhh8c7.js.map +0 -1
  231. package/dist/shared/hx-menu-divider-C2omnPtj.js +0 -558
  232. package/dist/shared/hx-menu-divider-C2omnPtj.js.map +0 -1
  233. package/dist/shared/hx-meter-BPscsw5t.js.map +0 -1
  234. package/dist/shared/hx-overflow-menu-DCLsdIBy.js +0 -374
  235. package/dist/shared/hx-overflow-menu-DCLsdIBy.js.map +0 -1
  236. package/dist/shared/hx-progress-bar-Bn3JEPUf.js +0 -258
  237. package/dist/shared/hx-progress-bar-Bn3JEPUf.js.map +0 -1
  238. package/dist/shared/hx-select-DrcS-YRJ.js.map +0 -1
  239. package/dist/shared/hx-spinner-DL5AYr16.js.map +0 -1
  240. package/dist/shared/hx-split-button-Djnc5Aeg.js.map +0 -1
  241. package/dist/shared/hx-stat-WOcNV1Ry.js.map +0 -1
  242. package/dist/shared/hx-tab-panel-DspCrKqo.js.map +0 -1
  243. package/dist/shared/hx-tag-CNSmdyaK.js.map +0 -1
  244. package/dist/shared/hx-td-DnnEMIuA.js.map +0 -1
  245. package/dist/shared/hx-time-picker-BoEIZwzv.js +0 -688
  246. package/dist/shared/hx-time-picker-BoEIZwzv.js.map +0 -1
  247. package/dist/shared/hx-tree-item-C2CiWuDE.js +0 -703
  248. package/dist/shared/hx-tree-item-C2CiWuDE.js.map +0 -1
  249. package/dist/shared/toast-factory-YSznocIV.js.map +0 -1
@@ -116,6 +116,11 @@
116
116
  /* ─── Forced Colors (Windows High Contrast) ─── */
117
117
 
118
118
  @media (forced-colors: active) {
119
+ .meter:focus-visible {
120
+ outline: 2px solid Highlight;
121
+ outline-offset: var(--hx-focus-ring-offset, 2px);
122
+ }
123
+
119
124
  .meter__track {
120
125
  border: 1px solid CanvasText;
121
126
  }
@@ -150,9 +150,32 @@
150
150
  @media (forced-colors: active) {
151
151
  .tag {
152
152
  border-color: CanvasText;
153
+ forced-color-adjust: none;
154
+ background-color: Canvas;
155
+ color: CanvasText;
153
156
  }
154
157
 
155
158
  .tag__remove-button {
156
159
  color: ButtonText;
157
160
  }
161
+
162
+ /* Per-semantic-variant forced-colors fallbacks. The visually-hidden
163
+ semantic variant label (.tag__variant-label) keeps AT users
164
+ informed; these blocks restore visual semantic distinction for
165
+ sighted users in HCM where bg/color collapse to system defaults.
166
+ Pattern: distinct border-style per variant (matches hx-badge). */
167
+ .tag--success {
168
+ border-style: solid;
169
+ border-width: 2px;
170
+ }
171
+
172
+ .tag--warning {
173
+ border-style: dashed;
174
+ border-width: 2px;
175
+ }
176
+
177
+ .tag--danger {
178
+ border-style: double;
179
+ border-width: 3px;
180
+ }
158
181
  }
@@ -188,6 +188,17 @@
188
188
  .field__error {
189
189
  color: var(--hx-time-picker-error-color, var(--hx-color-error-text, #c92a2a));
190
190
  }
191
+ .field__sr-only {
192
+ position: absolute;
193
+ width: 1px;
194
+ height: 1px;
195
+ padding: 0;
196
+ margin: -1px;
197
+ overflow: hidden;
198
+ clip: rect(0, 0, 0, 0);
199
+ white-space: nowrap;
200
+ border: 0;
201
+ }
191
202
  @media (forced-colors: active) {
192
203
  .field__combobox {
193
204
  border-color: ButtonText;
@@ -1,4 +1,4 @@
1
- /* index.css — generated 2026-05-05T19:04:42.574Z */
1
+ /* index.css — generated 2026-05-06T11:20:36.952Z */
2
2
  /* Imports all per-component CSS files for Drupal asset pipeline */
3
3
 
4
4
  @import './hx-accordion.css';
@@ -1,5 +1,5 @@
1
1
  {
2
- "generated": "2026-05-05T19:04:42.574Z",
2
+ "generated": "2026-05-06T11:20:36.951Z",
3
3
  "components": [
4
4
  {
5
5
  "name": "hx-accordion",
@@ -1179,6 +1179,7 @@
1179
1179
  "--hx-color-text-on-error",
1180
1180
  "--hx-color-text-on-primary",
1181
1181
  "--hx-color-text-strong",
1182
+ "--hx-duration-spinner",
1182
1183
  "--hx-filter-brightness-active",
1183
1184
  "--hx-focus-ring-color",
1184
1185
  "--hx-focus-ring-offset",
@@ -1193,6 +1194,7 @@
1193
1194
  "--hx-icon-button-focus-ring-color",
1194
1195
  "--hx-icon-button-size",
1195
1196
  "--hx-opacity-disabled",
1197
+ "--hx-opacity-muted",
1196
1198
  "--hx-size-10",
1197
1199
  "--hx-size-12",
1198
1200
  "--hx-size-8",
package/dist/index.js CHANGED
@@ -1,30 +1,30 @@
1
1
  import { lightTokenCss as p } from "@helixui/tokens";
2
2
  import { H as S, a as y } from "./shared/hx-accordion-ZVzgDzTG.js";
3
3
  import { H as b } from "./shared/hx-action-bar-CitgcpGv.js";
4
- import { H as g } from "./shared/hx-alert-CLn7CstP.js";
4
+ import { H as g } from "./shared/hx-alert-Bto8-TIi.js";
5
5
  import { H as v } from "./shared/hx-avatar-C9hOmlAb.js";
6
- import { H as E } from "./shared/hx-badge-CQXgOXJM.js";
7
- import { H as k } from "./shared/hx-banner-D3DzpfcP.js";
6
+ import { H as E } from "./shared/hx-badge-JlFtAdxS.js";
7
+ import { H as k } from "./shared/hx-banner-fpRnciIO.js";
8
8
  import { H as B, a as P } from "./shared/hx-breadcrumb-item-3tKppF9h.js";
9
- import { H as M } from "./shared/hx-button-DPY6SPVT.js";
10
- import { H as N } from "./shared/hx-button-group-BI-QBqmO.js";
9
+ import { H as M } from "./shared/hx-button-BOwAEcF1.js";
10
+ import { H as N } from "./shared/hx-button-group-DcHP5MBv.js";
11
11
  import { H as A } from "./shared/hx-card-qNAM2QNV.js";
12
12
  import { H as G, a as U } from "./shared/hx-carousel-item-z1Lc24op.js";
13
- import { H as O } from "./shared/hx-checkbox-BdgoUeWi.js";
14
- import { H as K } from "./shared/hx-checkbox-group-LWezHrvS.js";
13
+ import { H as O } from "./shared/hx-checkbox-C48KYKFq.js";
14
+ import { H as K } from "./shared/hx-checkbox-group-BJIAX3zU.js";
15
15
  import { H as Y } from "./shared/hx-clinical-status-D3XQIOqX.js";
16
16
  import { H as q } from "./shared/hx-code-snippet-fVV3Z2DZ.js";
17
- import { H as J } from "./shared/hx-color-picker-DVhZl88b.js";
18
- import { H as Z } from "./shared/hx-combobox-DvlezcDV.js";
17
+ import { H as J } from "./shared/hx-color-picker-Dk4cBwYQ.js";
18
+ import { H as Z } from "./shared/hx-combobox-BTLO9qiK.js";
19
19
  import { H as oe } from "./shared/hx-container-DVI7sxfX.js";
20
20
  import { H as re } from "./shared/hx-copy-button-sUVuikyH.js";
21
21
  import { H as ie } from "./shared/hx-counter-0zYapFhf.js";
22
- import { H as xe } from "./shared/hx-data-table-CLqVqdxr.js";
23
- import { H as le } from "./shared/hx-date-picker-N-0aG5XL.js";
24
- import { H as pe } from "./shared/hx-dialog-DzB7VytW.js";
22
+ import { H as xe } from "./shared/hx-data-table-Ct3gQ6ya.js";
23
+ import { H as le } from "./shared/hx-date-picker-CiR7FVnR.js";
24
+ import { H as pe } from "./shared/hx-dialog-AOZpHSuF.js";
25
25
  import { H as fe } from "./shared/hx-divider-CYfcUjcr.js";
26
- import { H as de } from "./shared/hx-drawer-Y1Ui2IWJ.js";
27
- import { H as ue } from "./shared/hx-dropdown-DJWlF94E.js";
26
+ import { H as de } from "./shared/hx-drawer-DH6CdAN1.js";
27
+ import { H as ue } from "./shared/hx-dropdown-DiLd40Lm.js";
28
28
  import { H as ye } from "./shared/hx-field-zw0U1KVi.js";
29
29
  import { H as be } from "./shared/hx-field-label-BVRyyKeh.js";
30
30
  import { H as ge } from "./shared/hx-file-upload-D3rKROK5.js";
@@ -33,52 +33,52 @@ import { H as Ee } from "./shared/hx-format-date-CKnlQOmV.js";
33
33
  import { H as ke, a as we } from "./shared/hx-grid-CXZf3jeK.js";
34
34
  import { H as Pe } from "./shared/hx-help-text-Xb2Yr8x2.js";
35
35
  import { H as Me } from "./shared/hx-icon-fuVm4-bk.js";
36
- import { H as Ne } from "./shared/hx-icon-button-CGNdQSFM.js";
36
+ import { H as Ne } from "./shared/hx-icon-button-a6OpeQz5.js";
37
37
  import { H as Ae } from "./shared/hx-image-Ben_4yM5.js";
38
- import { H as Ge } from "./shared/hx-link-C-O6vq0Q.js";
39
- import { H as Ve, a as Oe } from "./shared/hx-list-MyEhh8c7.js";
40
- import { H as Ke, a as We, b as Ye } from "./shared/hx-menu-divider-C2omnPtj.js";
41
- import { H as qe } from "./shared/hx-meter-BPscsw5t.js";
38
+ import { H as Ge } from "./shared/hx-link-CMnZRUtQ.js";
39
+ import { H as Ve, a as Oe } from "./shared/hx-list-De66EtAP.js";
40
+ import { H as Ke, a as We, b as Ye } from "./shared/hx-menu-divider-BjiRIWKq.js";
41
+ import { H as qe } from "./shared/hx-meter-BJdh6nrF.js";
42
42
  import { H as Je } from "./shared/hx-nav-ldFM3Fle.js";
43
43
  import { H as Ze } from "./shared/hx-number-input-yUzFOSC1.js";
44
- import { H as oo } from "./shared/hx-overflow-menu-DCLsdIBy.js";
44
+ import { H as oo } from "./shared/hx-overflow-menu-BQ4fiMYu.js";
45
45
  import { H as ro } from "./shared/hx-pagination-C7y8GVyU.js";
46
46
  import { H as io } from "./shared/hx-patient-banner-CkS-Lmj4.js";
47
47
  import { H as xo } from "./shared/hx-phi-field-C19oxlrr.js";
48
- import { H as lo } from "./shared/hx-popover-CHxWY_cd.js";
48
+ import { H as lo } from "./shared/hx-popover-B9W8-tC0.js";
49
49
  import { H as po } from "./shared/hx-popup-COUXXZ9X.js";
50
- import { H as fo } from "./shared/hx-progress-bar-Bn3JEPUf.js";
50
+ import { H as fo } from "./shared/hx-progress-bar-C8nDMdYa.js";
51
51
  import { H as ho } from "./shared/hx-progress-ring-TwHyXeEp.js";
52
52
  import { H as So } from "./shared/hx-prose-BThYcASV.js";
53
- import { H as To, a as bo } from "./shared/hx-radio-CeGzARNk.js";
53
+ import { H as To, a as bo } from "./shared/hx-radio-Z1lV1zTO.js";
54
54
  import { H as go } from "./shared/hx-rating-C3QP53k9.js";
55
- import { H as vo } from "./shared/hx-select-DrcS-YRJ.js";
55
+ import { H as vo } from "./shared/hx-select-D18CnJ0e.js";
56
56
  import { H as Eo, a as Do } from "./shared/hx-nav-item-CODtUlew.js";
57
57
  import { H as wo } from "./shared/hx-skeleton-Cnieh5Uc.js";
58
58
  import { H as Po } from "./shared/hx-slider-Blmv_rwS.js";
59
- import { H as Mo } from "./shared/hx-spinner-DL5AYr16.js";
60
- import { H as No } from "./shared/hx-split-button-Djnc5Aeg.js";
59
+ import { H as Mo } from "./shared/hx-spinner-BB0h2hKZ.js";
60
+ import { H as No } from "./shared/hx-split-button-BoABoEm5.js";
61
61
  import { H as Ao } from "./shared/hx-split-panel-B-u0Z3mm.js";
62
62
  import { H as Go } from "./shared/hx-stack-DGfcOfWJ.js";
63
- import { H as Vo } from "./shared/hx-stat-WOcNV1Ry.js";
63
+ import { H as Vo } from "./shared/hx-stat-Dtf9lz-O.js";
64
64
  import { H as Xo } from "./shared/hx-status-indicator-BlQyen43.js";
65
65
  import { H as Wo, a as Yo } from "./shared/hx-step-R2rjp1fT.js";
66
66
  import { H as qo, a as zo } from "./shared/hx-structured-list-m_-dMJbC.js";
67
67
  import { H as Qo } from "./shared/hx-style-scope-TDnR8H4O.js";
68
- import { H as et } from "./shared/hx-switch-BX_8uNUs.js";
69
- import { H as tt, a as rt, b as at, c as it, d as st, e as xt, f as Ht } from "./shared/hx-td-DnnEMIuA.js";
70
- import { H as nt, a as pt, b as mt } from "./shared/hx-tab-panel-DspCrKqo.js";
71
- import { H as ct } from "./shared/hx-tag-CNSmdyaK.js";
68
+ import { H as et } from "./shared/hx-switch-B6kr-EwE.js";
69
+ import { H as tt, a as rt, b as at, c as it, d as st, e as xt, f as Ht } from "./shared/hx-td-BGkFOJEK.js";
70
+ import { H as nt, a as pt, b as mt } from "./shared/hx-tab-panel-BQtBXKLD.js";
71
+ import { H as ct } from "./shared/hx-tag-C5aCUpVi.js";
72
72
  import { H as ht } from "./shared/hx-text-Bz_9fJ3J.js";
73
73
  import { F as St, H as yt } from "./shared/hx-text-input-D6FlOZM-.js";
74
74
  import { H as bt } from "./shared/hx-textarea-CNG590KY.js";
75
75
  import { H as gt } from "./shared/hx-theme-BsefFWTO.js";
76
- import { H as vt } from "./shared/hx-time-picker-BoEIZwzv.js";
77
- import { H as Et, a as Dt, t as kt } from "./shared/toast-factory-YSznocIV.js";
78
- import { H as Bt } from "./shared/hx-toggle-button-Dcz9IlUm.js";
76
+ import { H as vt } from "./shared/hx-time-picker-iwCD7rzW.js";
77
+ import { H as Et, a as Dt, t as kt } from "./shared/toast-factory-CL2BzdSB.js";
78
+ import { H as Bt } from "./shared/hx-toggle-button-BQ81EDkl.js";
79
79
  import { H as Ft } from "./shared/hx-tooltip-DVqtKPCD.js";
80
80
  import { H as Lt } from "./shared/hx-top-nav-DP6OFS8C.js";
81
- import { H as Rt, a as At } from "./shared/hx-tree-item-C2CiWuDE.js";
81
+ import { H as Rt, a as At } from "./shared/hx-tree-item-CHrUhuZL.js";
82
82
  import { H as Gt } from "./shared/hx-visually-hidden-0bZKOWgT.js";
83
83
  import { F as Vt } from "./shared/FormMixin-B8PXk5RQ.js";
84
84
  import { H as Xt } from "./shared/helix-element-BNEYeiys.js";
@@ -0,0 +1,126 @@
1
+ function p(e, i) {
2
+ if (!i) return [];
3
+ const a = i.split(/\s+/).filter(Boolean);
4
+ if (a.length === 0) return [];
5
+ const t = [];
6
+ w(e, t);
7
+ const r = e.ownerDocument;
8
+ r && !t.includes(r) && t.push(r);
9
+ const c = [];
10
+ for (const d of a)
11
+ for (const n of t) {
12
+ const s = n.getElementById(d);
13
+ if (s) {
14
+ c.push(s);
15
+ break;
16
+ }
17
+ }
18
+ return c;
19
+ }
20
+ function w(e, i) {
21
+ const a = /* @__PURE__ */ new Set(), t = (s) => {
22
+ a.has(s) || (a.add(s), i.push(s));
23
+ }, r = /* @__PURE__ */ new Set([e]), c = [];
24
+ let d = !1;
25
+ const n = (s) => {
26
+ let b = s, o = b.getRootNode();
27
+ const l = b.assignedSlot ?? null;
28
+ for (l && !r.has(l) && (r.add(l), c.push(l)); o instanceof ShadowRoot; ) {
29
+ t(o);
30
+ const u = o.host ?? null;
31
+ if (!u) break;
32
+ const f = u.assignedSlot ?? null;
33
+ f && !r.has(f) && (r.add(f), c.push(f)), b = u, o = u.getRootNode();
34
+ }
35
+ o instanceof Document && (d = !0);
36
+ };
37
+ for (n(e); c.length > 0; )
38
+ n(c.shift());
39
+ if (d) {
40
+ const s = e.ownerDocument;
41
+ s && t(s);
42
+ }
43
+ }
44
+ function R(e) {
45
+ return "ariaLabelledByElements" in e && "ariaDescribedByElements" in e && typeof e.ariaLabelledByElements < "u";
46
+ }
47
+ const v = [
48
+ "aria-label",
49
+ "aria-labelledby",
50
+ "aria-describedby",
51
+ "data-aria-label",
52
+ "data-aria-labelledby",
53
+ "data-aria-describedby"
54
+ ], h = /* @__PURE__ */ new WeakMap();
55
+ function m(e, i) {
56
+ let a = h.get(e);
57
+ if (!a) {
58
+ const t = /* @__PURE__ */ new Set();
59
+ let r = 0;
60
+ const c = () => {
61
+ r = 0, Array.from(t).forEach((s) => {
62
+ s();
63
+ });
64
+ }, d = () => {
65
+ if (r !== 0) return;
66
+ r = (typeof globalThis.requestAnimationFrame == "function" ? globalThis.requestAnimationFrame : (b) => globalThis.setTimeout(() => b(performance.now()), 0))(c);
67
+ }, n = new MutationObserver(() => {
68
+ d();
69
+ });
70
+ n.observe(e, {
71
+ childList: !0,
72
+ subtree: !0,
73
+ attributes: !0,
74
+ attributeFilter: ["id", "hidden", "aria-hidden", "style", "class"],
75
+ characterData: !0
76
+ }), a = { observer: n, subscribers: t }, h.set(e, a);
77
+ }
78
+ return a.subscribers.add(i), () => {
79
+ const t = h.get(e);
80
+ t && (t.subscribers.delete(i), t.subscribers.size === 0 && (t.observer.disconnect(), h.delete(e)));
81
+ };
82
+ }
83
+ function S(e, i, a = {}) {
84
+ const t = a.observedAttributes ?? v, r = a.observeRoot ?? !0, c = new MutationObserver(() => i());
85
+ c.observe(e, {
86
+ attributes: !0,
87
+ attributeFilter: [...t]
88
+ });
89
+ const d = new MutationObserver(() => {
90
+ b(), i();
91
+ });
92
+ d.observe(e, {
93
+ attributes: !0,
94
+ attributeFilter: ["slot"]
95
+ });
96
+ const n = /* @__PURE__ */ new Map(), s = () => {
97
+ const o = [];
98
+ w(e, o);
99
+ const l = e.ownerDocument;
100
+ return l && !o.includes(l) && o.push(l), o;
101
+ }, b = () => {
102
+ if (!r) return;
103
+ const o = s(), l = new Set(o);
104
+ for (const [u, f] of n)
105
+ l.has(u) || (f(), n.delete(u));
106
+ for (const u of o)
107
+ n.has(u) || n.set(u, m(u, i));
108
+ };
109
+ return b(), i(), {
110
+ resync() {
111
+ b(), i();
112
+ },
113
+ disconnect() {
114
+ c.disconnect(), d.disconnect();
115
+ for (const o of n.values())
116
+ o();
117
+ n.clear();
118
+ }
119
+ };
120
+ }
121
+ export {
122
+ S as i,
123
+ p as r,
124
+ R as s
125
+ };
126
+ //# sourceMappingURL=aria-idref-CxvyzfQS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aria-idref-CxvyzfQS.js","sources":["../../src/utils/aria-idref.ts"],"sourcesContent":["/**\n * Shared utilities for resolving `aria-labelledby` and `aria-describedby`\n * IDREF token lists across the Shadow DOM boundary.\n *\n * Selection-control components (`hx-checkbox`, `hx-radio-group`, `hx-switch`,\n * etc.) elevate their semantic surface to the host via `ElementInternals` so\n * that consumer-supplied `aria-labelledby` / `aria-describedby` on the host\n * resolves to light-DOM elements rather than being trapped on inner shadow\n * nodes.\n *\n * Modern Chromium 134+ and Safari 17.4+ expose the IDL element-references API\n * (`internals.ariaLabelledByElements`, `internals.ariaDescribedByElements`).\n * For those engines we resolve token IDs against the host's root node (a\n * Document or ShadowRoot) and assign the resulting elements directly.\n *\n * Older engines fall back to the host-attribute path: the ARIA delegation\n * mixin keeps the original token list in `data-aria-labelledby`/\n * `data-aria-describedby`, which assistive technology cannot follow into the\n * shadow root, but that is the same surface area as the pre-fix code and is\n * not a regression.\n *\n * Component authors do NOT need to wire this directly — see\n * `installAriaIdrefMirror()` for an installable observer that keeps an inner\n * node's `aria-*` attributes in sync with the token list across mutations.\n */\n\n/**\n * Resolves a whitespace-separated IDREF token list to live element references.\n *\n * Searches the host's containing root first (Document or ShadowRoot), then\n * walks up through enclosing shadow hosts, and finally falls back to the\n * top-level Document. Codex round-15 P1: hx-* controls embedded inside an\n * outer component's shadow tree often legitimately reference labels/descriptions\n * declared in the outer document or in an ancestor shadow tree. Restricting\n * resolution to a single root left those controls anonymous on the\n * `ariaLabelledByElements` / `ariaDescribedByElements` path. The IDL\n * element-references API accepts any element regardless of root, so widening\n * the search closes that gap.\n *\n * Codex round-16 P1: when the host is **slotted into** another component\n * (light-DOM child of a shadow-root-bearing element), `host.getRootNode()`\n * is still the document, so IDREF targets declared in the slot owner's\n * shadow root are unreachable through the ancestor-shadow-host chain. We\n * additionally walk `host.assignedSlot.getRootNode()` — that resolves to\n * the slot owner's shadow root — and continue up that root's host chain so\n * cross-shadow IDREF resolution works for the composed-tree slotting\n * pattern. The walk is recursive: a slot owner that is itself slotted into\n * another shadow tree contributes its own ancestor chain too.\n *\n * Tokens that fail to resolve at every level are silently dropped — matching\n * native attribute-string platform behaviour where unresolved tokens are\n * ignored.\n */\nexport function resolveIdrefTokens(host: Element, tokens: string | null): Element[] {\n if (!tokens) return [];\n const ids = tokens.split(/\\s+/).filter(Boolean);\n if (ids.length === 0) return [];\n\n // Build the ordered list of roots to search: host's own root first\n // (closest scope), then walking outward through enclosing shadow hosts,\n // then the top-level Document. Each id resolves at the first root that\n // owns it, mirroring how shadow-encapsulation-aware AT walks the tree.\n const roots: Array<Document | ShadowRoot> = [];\n collectIdrefSearchRoots(host, roots);\n // If host is detached or in an unusual root, also try the top-level\n // ownerDocument as a defensive last resort.\n const ownerDoc = host.ownerDocument;\n if (ownerDoc && !roots.includes(ownerDoc)) {\n roots.push(ownerDoc);\n }\n\n const out: Element[] = [];\n for (const id of ids) {\n for (const root of roots) {\n const el = root.getElementById(id);\n if (el) {\n out.push(el);\n break;\n }\n }\n }\n return out;\n}\n\n/**\n * Walks the composed-tree ancestry of `start` and pushes every Document or\n * ShadowRoot that could legitimately own an IDREF target into `roots` in the\n * order they should be searched (closest scope first). The walk crosses two\n * kinds of boundary:\n *\n * 1. A node sitting inside a ShadowRoot escapes via `root.host`.\n * 2. A node assigned to a `<slot>` in another shadow tree escapes via\n * `node.assignedSlot` — the slot lives in the slot-owner's shadow root,\n * so we hop into that root and keep climbing from there.\n *\n * Both pathways are followed because either may apply at any level. A\n * light-DOM custom element slotted into a shadow component has\n * `getRootNode() === document` AND `assignedSlot !== null`. Codex push-gate\n * round-1 finding 1: the slot-owner shadow root MUST be searched BEFORE the\n * document fallback. Element ids are unique per-tree, not globally, so the\n * same id may legally exist in BOTH the document and a slot-owner shadow\n * root. If the document is searched first, the resolver binds to the wrong\n * element and the slotted control gets the wrong accessible name. The\n * solution is to walk the slot chain (assignedSlot → slot-owner shadow root\n * → its host's chain) before falling through to the owner document.\n *\n * The slot-walk is transitive: a slot owner that is itself slotted into\n * another shadow tree contributes its own slot chain too, all of which is\n * searched ahead of the document. From inside any shadow root we follow\n * `root.host` outward AND, on every hop, check whether that host is itself\n * slotted into yet another shadow tree. De-duplication is by reference\n * identity.\n *\n * @internal\n */\nfunction collectIdrefSearchRoots(start: Element, roots: Array<Document | ShadowRoot>): void {\n const visited = new Set<Document | ShadowRoot>();\n\n const pushRoot = (root: Document | ShadowRoot): void => {\n if (visited.has(root)) return;\n visited.add(root);\n roots.push(root);\n };\n\n // Walk a single ancestor chain starting from `entry`, pushing every\n // ShadowRoot encountered (closest first) and queuing any slot-owner\n // shadow roots we cross via assignedSlot for separate exploration. The\n // owner document encountered at the end of a chain is NOT pushed here —\n // the caller controls when to fall through to the document so the\n // slot-owner trees can be searched first (codex push-gate round-1 #1).\n const visitedEntries = new Set<Element>([start]);\n const slotEntries: Element[] = [];\n let documentSeen = false;\n\n const walkChain = (entry: Element): void => {\n let currentNode: Element = entry;\n let currentRoot: Node | null = currentNode.getRootNode();\n\n // If the entry is itself in document scope and is slotted into a\n // shadow tree, queue the slot for slot-owner-first exploration.\n const slotFromEntry = (currentNode as HTMLElement).assignedSlot ?? null;\n if (slotFromEntry && !visitedEntries.has(slotFromEntry)) {\n visitedEntries.add(slotFromEntry);\n slotEntries.push(slotFromEntry);\n }\n\n while (currentRoot instanceof ShadowRoot) {\n pushRoot(currentRoot);\n const shadowHost: Element | null = currentRoot.host ?? null;\n if (!shadowHost) break;\n // The shadow host itself may be slotted into yet another component.\n // Queue that branch for slot-owner-first exploration.\n const hostSlot = (shadowHost as HTMLElement).assignedSlot ?? null;\n if (hostSlot && !visitedEntries.has(hostSlot)) {\n visitedEntries.add(hostSlot);\n slotEntries.push(hostSlot);\n }\n currentNode = shadowHost;\n currentRoot = shadowHost.getRootNode();\n }\n\n if (currentRoot instanceof Document) {\n // Defer the document push: slot-owner shadow roots queued during\n // this walk must be searched BEFORE the document so duplicate ids\n // resolve in the correct (slot-owner) scope first.\n documentSeen = true;\n }\n };\n\n walkChain(start);\n // Drain the slot-entry queue. Each slot entry contributes its own\n // ancestor chain, whose shadow roots are pushed ahead of the owner\n // document. Slot entries are processed in discovery order (FIFO) so\n // closer slot owners are searched before more distant ones.\n while (slotEntries.length > 0) {\n walkChain(slotEntries.shift() as Element);\n }\n\n if (documentSeen) {\n const ownerDoc = start.ownerDocument;\n if (ownerDoc) pushRoot(ownerDoc);\n }\n}\n\n/**\n * True when the runtime exposes the IDL element-references API on\n * `ElementInternals`. Older Firefox / Safari builds return `undefined`\n * for these accessors.\n */\nexport function supportsIdrefElementReferences(internals: ElementInternals): boolean {\n return (\n 'ariaLabelledByElements' in internals &&\n 'ariaDescribedByElements' in internals &&\n typeof (internals as ElementInternals & { ariaLabelledByElements?: unknown })\n .ariaLabelledByElements !== 'undefined'\n );\n}\n\n/**\n * Mirror snapshot describing what should be applied to inner ARIA-bearing\n * shadow nodes. Components consume this to project the correct attributes\n * onto whichever inner element owns the announced semantic role.\n */\nexport interface AriaIdrefSnapshot {\n /** Computed `aria-labelledby` token list, or `null` to omit. */\n labelledBy: string | null;\n /** Computed `aria-describedby` token list, or `null` to omit. */\n describedBy: string | null;\n}\n\n/**\n * Merges two whitespace-separated token lists, preserving order and removing\n * duplicates. `null`/empty inputs are skipped. Returns `null` when the merged\n * list is empty.\n */\nexport function mergeTokenLists(...lists: Array<string | null | undefined>): string | null {\n const seen = new Set<string>();\n const out: string[] = [];\n for (const list of lists) {\n if (!list) continue;\n for (const token of list.split(/\\s+/)) {\n if (token && !seen.has(token)) {\n seen.add(token);\n out.push(token);\n }\n }\n }\n return out.length > 0 ? out.join(' ') : null;\n}\n\n/**\n * Options accepted by `installAriaIdrefMirror()`.\n */\nexport interface AriaIdrefMirrorOptions {\n /**\n * Attribute names on the host whose mutations should trigger a resync.\n * Defaults to `['aria-labelledby', 'aria-describedby', 'aria-label']` plus\n * the `data-aria-*` mirrors used by `mixinDelegatesAria`.\n */\n observedAttributes?: string[];\n /**\n * Whether to observe the resolved root for `id` attribute and `childList`\n * mutations so that late-inserted IDREF targets and id renames trigger a\n * resync. Defaults to `true`.\n */\n observeRoot?: boolean;\n}\n\n/**\n * Handle returned by `installAriaIdrefMirror()`. Call `disconnect()` from\n * `disconnectedCallback()` to tear the observers down. `resync()` forces an\n * immediate sync — useful from `connectedCallback()` after the host has been\n * re-attached to a new root.\n */\nexport interface AriaIdrefMirrorHandle {\n /** Force an immediate sync. */\n resync(): void;\n /** Tear down all observers and listeners. */\n disconnect(): void;\n}\n\n/**\n * Default attribute set observed on the host for ARIA / data-aria mirroring.\n */\nconst DEFAULT_HOST_OBSERVED_ATTRS: readonly string[] = [\n 'aria-label',\n 'aria-labelledby',\n 'aria-describedby',\n 'data-aria-label',\n 'data-aria-labelledby',\n 'data-aria-describedby',\n];\n\n/**\n * Per-root shared observer registry. Codex round-7 finding #11 (perf).\n *\n * Round-1 created a `subtree: true` MutationObserver per host instance, so a\n * page with N IDREF-aware controls would receive N×M sync callbacks for any\n * unrelated childList/id mutation in the document. This registry collapses\n * the cost: a single observer per Document/ShadowRoot fans mutations out to\n * the registered subscribers (the per-host `sync` callbacks) only.\n *\n * The registry uses a `WeakMap` keyed by root so subscribers are garbage\n * collected with their roots. Subscribers are stored in a `Set` keyed by the\n * `sync` callback identity so re-installation is idempotent.\n *\n * @internal\n */\ninterface SharedRootObserverEntry {\n observer: MutationObserver;\n subscribers: Set<() => void>;\n}\n\nconst sharedRootObservers: WeakMap<Document | ShadowRoot, SharedRootObserverEntry> = new WeakMap();\n\nfunction subscribeToRoot(root: Document | ShadowRoot, sync: () => void): () => void {\n let entry = sharedRootObservers.get(root);\n if (!entry) {\n const subscribers = new Set<() => void>();\n // Codex push-gate round-4 P2: components that flatten `aria-labelledby`\n // to a fallback string (legacy engines without `ariaLabelledByElements`,\n // and string-mirroring callers like hx-menu / hx-menu-item /\n // hx-overflow-menu / hx-split-button) must resync when:\n // - the referenced label's text content mutates in place\n // (`characterData`)\n // - the referenced target is hidden / unhidden via attributes\n // (`hidden`, `aria-hidden`, `style`, `class` — visibility affects\n // accessible-name computation per accname §4.3.2)\n // Without these triggers the mirrored `aria-label` stays stale.\n //\n // Widening the observer surface produces noisier callbacks, so the\n // shared subscriber fan-out is coalesced through a single\n // `requestAnimationFrame` (with a setTimeout fallback for environments\n // where rAF is unavailable, e.g. test-stubbed roots). Subscribers see\n // at most one resync per frame regardless of mutation density.\n let pendingFrame = 0;\n const flush = (): void => {\n pendingFrame = 0;\n // Snapshot subscribers before invocation: a sync() callback may itself\n // resubscribe (e.g. component reattach), and Set iteration over a live\n // collection during mutation is undefined.\n Array.from(subscribers).forEach((fn) => {\n fn();\n });\n };\n const scheduleFlush = (): void => {\n if (pendingFrame !== 0) return;\n const raf =\n typeof globalThis.requestAnimationFrame === 'function'\n ? globalThis.requestAnimationFrame\n : (cb: FrameRequestCallback) => globalThis.setTimeout(() => cb(performance.now()), 0);\n pendingFrame = raf(flush) as unknown as number;\n };\n const observer = new MutationObserver(() => {\n scheduleFlush();\n });\n observer.observe(root, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['id', 'hidden', 'aria-hidden', 'style', 'class'],\n characterData: true,\n });\n entry = { observer, subscribers };\n sharedRootObservers.set(root, entry);\n }\n entry.subscribers.add(sync);\n\n return () => {\n const current = sharedRootObservers.get(root);\n if (!current) return;\n current.subscribers.delete(sync);\n if (current.subscribers.size === 0) {\n current.observer.disconnect();\n sharedRootObservers.delete(root);\n }\n };\n}\n\n/**\n * Installs a `MutationObserver` pair that keeps host ARIA semantics in sync\n * with mutations to consumer-supplied attributes AND late-target / id\n * mutations in the host's resolved root.\n *\n * The `sync` callback is invoked on:\n * 1. Initial install (synchronously)\n * 2. Any change to one of the observed host attributes\n * 3. Any `id` attribute mutation, child insertion, or child removal in the\n * resolved root (Document or ShadowRoot containing the host)\n *\n * Components should call this from `connectedCallback()` and call\n * `handle.disconnect()` from `disconnectedCallback()`. The handle's\n * `resync()` method is safe to call from any lifecycle hook.\n *\n * Costs are bounded: the host observer touches one element; the root\n * observer is shared per `Document`/`ShadowRoot` (codex round-7 #11) so every\n * subscribing host pays a single attach cost regardless of how many other\n * IDREF-aware controls share the root.\n */\nexport function installAriaIdrefMirror(\n host: Element,\n sync: () => void,\n options: AriaIdrefMirrorOptions = {},\n): AriaIdrefMirrorHandle {\n const observedAttributes = options.observedAttributes ?? DEFAULT_HOST_OBSERVED_ATTRS;\n const observeRoot = options.observeRoot ?? true;\n\n // Observe consumer mutations to the host's ARIA / data-aria attributes.\n // We do NOT use `observedAttributes`/`attributeChangedCallback` here because\n // that requires class-level wiring that conflicts with downstream mixins\n // (e.g. `mixinDelegatesAria` already commandeers `attributeChangedCallback`\n // for the same attributes). A scoped `MutationObserver` is reentry-safe.\n const hostObserver = new MutationObserver(() => sync());\n hostObserver.observe(host, {\n attributes: true,\n attributeFilter: [...observedAttributes],\n });\n\n // Codex push-gate round-1 finding 2: when the host's `slot` attribute\n // changes, the host may have just been re-assigned into a different slot\n // owner's shadow tree — and therefore the set of reachable IDREF roots\n // has changed. The shared root observer's callback runs `sync()` (not\n // `resync()`), so observers stay attached to the OLD roots; later id /\n // childList mutations in the NEW slot owner shadow tree never fire\n // resync. A separate observer scoped to the host's `slot` attribute\n // triggers a full reattach via `resync()`.\n const slotAttrObserver = new MutationObserver(() => {\n // Reattach observers to the new reachable-roots set, then sync.\n attachRootObservers();\n sync();\n });\n slotAttrObserver.observe(host, {\n attributes: true,\n attributeFilter: ['slot'],\n });\n\n // Subscribe to the shared per-root observer so late-inserted targets and id\n // renames re-resolve through the IDREF path. Round-7 #11 collapses N\n // per-instance subtree observers into one per root, so on pages with many\n // controls a single mutation produces a single subscriber fan-out instead\n // of `controls × mutations` observer callbacks.\n //\n // Codex round-16 P1: subscribe to every root the resolver can match — the\n // host's own root, every enclosing shadow root, and the owner document.\n // Without this, dynamic IDREF targets in ancestor scopes (legitimate per\n // the round-15 widened resolver) bind correctly on first render but never\n // resync when the outer document mutates. We track active subscriptions\n // by root and incrementally diff on `attachRootObservers()` so resync\n // calls don't churn observers when nothing has changed.\n const rootSubscriptions = new Map<Document | ShadowRoot, () => void>();\n\n const computeRootsToObserve = (): Array<Document | ShadowRoot> => {\n const roots: Array<Document | ShadowRoot> = [];\n // Use the same composed-tree walk as `resolveIdrefTokens` so the\n // observer subscribes to every root the resolver can match — including\n // slot-owner shadow roots when the host is light-DOM-slotted into\n // another component (codex round-17 P1). Without this, a late id\n // mutation inside the slot owner's shadow tree never fires resync.\n collectIdrefSearchRoots(host, roots);\n const ownerDoc = host.ownerDocument;\n if (ownerDoc && !roots.includes(ownerDoc)) {\n roots.push(ownerDoc);\n }\n return roots;\n };\n\n const attachRootObservers = (): void => {\n if (!observeRoot) return;\n const wanted = computeRootsToObserve();\n const wantedSet = new Set(wanted);\n // Remove subscriptions for roots no longer in scope (e.g. when the host\n // is moved between trees and the old ancestor chain no longer applies).\n for (const [root, unsub] of rootSubscriptions) {\n if (!wantedSet.has(root)) {\n unsub();\n rootSubscriptions.delete(root);\n }\n }\n // Add subscriptions for new roots (host's root + ancestor shadow roots\n // + owner document) that the resolver can now match against.\n for (const root of wanted) {\n if (!rootSubscriptions.has(root)) {\n rootSubscriptions.set(root, subscribeToRoot(root, sync));\n }\n }\n };\n\n attachRootObservers();\n // Initial sync — caller's `sync` reads the current attribute snapshot.\n sync();\n\n return {\n resync(): void {\n attachRootObservers();\n sync();\n },\n disconnect(): void {\n hostObserver.disconnect();\n slotAttrObserver.disconnect();\n for (const unsub of rootSubscriptions.values()) {\n unsub();\n }\n rootSubscriptions.clear();\n },\n };\n}\n"],"names":["resolveIdrefTokens","host","tokens","ids","roots","collectIdrefSearchRoots","ownerDoc","out","id","root","el","start","visited","pushRoot","visitedEntries","slotEntries","documentSeen","walkChain","entry","currentNode","currentRoot","slotFromEntry","shadowHost","hostSlot","supportsIdrefElementReferences","internals","DEFAULT_HOST_OBSERVED_ATTRS","sharedRootObservers","subscribeToRoot","sync","subscribers","pendingFrame","flush","fn","scheduleFlush","cb","observer","current","installAriaIdrefMirror","options","observedAttributes","observeRoot","hostObserver","slotAttrObserver","attachRootObservers","rootSubscriptions","computeRootsToObserve","wanted","wantedSet","unsub"],"mappings":"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"}
@@ -1,9 +1,9 @@
1
- import { css as u, html as i, nothing as d } from "lit";
2
- import { property as s, state as v, customElement as p } from "lit/decorators.js";
1
+ import { css as p, html as n, nothing as d } from "lit";
2
+ import { property as s, state as u, customElement as v } from "lit/decorators.js";
3
3
  import { classMap as f } from "lit/directives/class-map.js";
4
4
  import { a as x } from "./forced-colors-CTEDFRGa.js";
5
5
  import { H as b } from "./helix-element-BNEYeiys.js";
6
- const g = u`
6
+ const g = p`
7
7
  :host {
8
8
  display: block;
9
9
  }
@@ -112,6 +112,15 @@ const g = u`
112
112
  min-width: 0;
113
113
  }
114
114
 
115
+ /* (group-6 5.1) Wrapper around the default slot. Carries aria-hidden=true
116
+ so the visible message text is not double-announced alongside the
117
+ sr-only announcer. display:contents keeps the wrapper visually
118
+ transparent so children participate in the parent flex layout as if
119
+ the wrapper were not there. */
120
+ .alert__default-slot {
121
+ display: contents;
122
+ }
123
+
115
124
  /* ─── Actions ─── */
116
125
  /* Hidden by default; shown via JS slotchange detection to avoid invisible */
117
126
  /* margin-top spacing when no actions are slotted. */
@@ -239,14 +248,14 @@ const g = u`
239
248
  }
240
249
  }
241
250
  `;
242
- var m = Object.defineProperty, _ = Object.getOwnPropertyDescriptor, o = (e, t, n, l) => {
243
- for (var a = l > 1 ? void 0 : l ? _(t, n) : t, c = e.length - 1, h; c >= 0; c--)
244
- (h = e[c]) && (a = (l ? h(t, n, a) : h(a)) || a);
245
- return l && a && m(t, n, a), a;
251
+ var m = Object.defineProperty, _ = Object.getOwnPropertyDescriptor, o = (e, t, l, i) => {
252
+ for (var a = i > 1 ? void 0 : i ? _(t, l) : t, c = e.length - 1, h; c >= 0; c--)
253
+ (h = e[c]) && (a = (i ? h(t, l, a) : h(a)) || a);
254
+ return i && a && m(t, l, a), a;
246
255
  };
247
256
  let r = class extends b {
248
257
  constructor() {
249
- super(...arguments), this.variant = "info", this.dismissible = !1, this.heading = "", this.labelClose = "Close alert", this.open = !1, this.showIcon = !1, this.accent = !1, this.returnFocusTo = null, this._hasActions = !1, this._hasTitle = !1, this._actionsSlotChangeHandler = null, this._titleSlotChangeHandler = null;
258
+ super(...arguments), this.variant = "info", this.dismissible = !1, this.heading = "", this.labelClose = "Close alert", this.open = !1, this.showIcon = !1, this.accent = !1, this.returnFocusTo = null, this._hasActions = !1, this._hasTitle = !1, this._actionsSlotChangeHandler = null, this._titleSlotChangeHandler = null, this._announcerCycle = 0;
250
259
  }
251
260
  // ─── Private Helpers ───
252
261
  /** @internal */
@@ -278,7 +287,7 @@ let r = class extends b {
278
287
  }
279
288
  // ─── Lifecycle ───
280
289
  connectedCallback() {
281
- super.connectedCallback(), this.setAttribute("role", this._role), this.open || this.setAttribute("aria-hidden", "true");
290
+ super.connectedCallback(), this._internals.role = this._role, this.setAttribute("role", this._role), this.open || this.setAttribute("aria-hidden", "true");
282
291
  }
283
292
  disconnectedCallback() {
284
293
  super.disconnectedCallback();
@@ -298,18 +307,23 @@ let r = class extends b {
298
307
  }, t.addEventListener("slotchange", this._titleSlotChangeHandler));
299
308
  }
300
309
  updated(e) {
301
- if (super.updated(e), e.has("variant") && this.setAttribute("role", this._role), e.has("open"))
302
- if (this.open)
303
- this.removeAttribute("aria-hidden"), e.get("open") === !1 && Promise.resolve().then(() => {
304
- const n = this.renderRoot.querySelector(".sr-only");
305
- n && (n.textContent = "", Promise.resolve().then(() => {
306
- var c;
307
- const l = this._effectiveSeverityLabel, a = ((c = this.textContent) == null ? void 0 : c.trim()) ?? "";
308
- n.textContent = l ? `${l} ${a}` : a;
309
- }));
310
- });
311
- else {
312
- this.setAttribute("aria-hidden", "true");
310
+ if (super.updated(e), e.has("variant") && (this._internals.role = this._role, this.setAttribute("role", this._role)), e.has("open"))
311
+ if (this.open) {
312
+ if (this.removeAttribute("aria-hidden"), e.get("open") === !1) {
313
+ const l = ++this._announcerCycle;
314
+ Promise.resolve().then(() => {
315
+ if (l !== this._announcerCycle || !this.open) return;
316
+ const i = this.renderRoot.querySelector(".sr-only");
317
+ i && (i.textContent = "", Promise.resolve().then(() => {
318
+ var h;
319
+ if (l !== this._announcerCycle || !this.open) return;
320
+ const a = this._effectiveSeverityLabel, c = ((h = this.textContent) == null ? void 0 : h.trim()) ?? "";
321
+ i.textContent = a ? `${a} ${c}` : c;
322
+ }));
323
+ });
324
+ }
325
+ } else {
326
+ this.setAttribute("aria-hidden", "true"), this._announcerCycle++;
313
327
  const t = this.renderRoot.querySelector(".sr-only");
314
328
  t && (t.textContent = "");
315
329
  }
@@ -317,7 +331,7 @@ let r = class extends b {
317
331
  // ─── Default Icons ───
318
332
  /** @internal */
319
333
  _renderInfoIcon() {
320
- return i`<svg viewBox="0 0 20 20" aria-hidden="true">
334
+ return n`<svg viewBox="0 0 20 20" aria-hidden="true">
321
335
  <path
322
336
  d="M10 2a8 8 0 100 16 8 8 0 000-16zm.75 4.75a.75.75 0 11-1.5 0 .75.75 0 011.5 0zM9.25 9a.75.75 0 011.5 0v4a.75.75 0 01-1.5 0V9z"
323
337
  />
@@ -325,7 +339,7 @@ let r = class extends b {
325
339
  }
326
340
  /** @internal */
327
341
  _renderSuccessIcon() {
328
- return i`<svg viewBox="0 0 20 20" aria-hidden="true">
342
+ return n`<svg viewBox="0 0 20 20" aria-hidden="true">
329
343
  <path
330
344
  d="M10 2a8 8 0 100 16 8 8 0 000-16zm3.03 6.28a.75.75 0 00-1.06-1.06L9 10.19 7.78 8.97a.75.75 0 00-1.06 1.06l1.75 1.75a.75.75 0 001.06 0l3.5-3.5z"
331
345
  />
@@ -333,7 +347,7 @@ let r = class extends b {
333
347
  }
334
348
  /** @internal */
335
349
  _renderWarningIcon() {
336
- return i`<svg viewBox="0 0 20 20" aria-hidden="true">
350
+ return n`<svg viewBox="0 0 20 20" aria-hidden="true">
337
351
  <path
338
352
  d="M8.49 2.92a1.75 1.75 0 013.02 0l6.25 10.83A1.75 1.75 0 0116.25 16H3.75a1.75 1.75 0 01-1.51-2.25L8.49 2.92zM10 7a.75.75 0 01.75.75v3a.75.75 0 01-1.5 0v-3A.75.75 0 0110 7zm0 7.5a.75.75 0 100-1.5.75.75 0 000 1.5z"
339
353
  />
@@ -341,7 +355,7 @@ let r = class extends b {
341
355
  }
342
356
  /** @internal */
343
357
  _renderErrorIcon() {
344
- return i`<svg viewBox="0 0 20 20" aria-hidden="true">
358
+ return n`<svg viewBox="0 0 20 20" aria-hidden="true">
345
359
  <path
346
360
  d="M10 2a8 8 0 100 16 8 8 0 000-16zm-1.72 5.22a.75.75 0 011.06 0L10 7.94l.66-.72a.75.75 0 111.06 1.06L11.06 9l.66.72a.75.75 0 11-1.06 1.06L10 10.06l-.66.72a.75.75 0 01-1.06-1.06L8.94 9l-.66-.72a.75.75 0 010-1.06z"
347
361
  />
@@ -363,7 +377,7 @@ let r = class extends b {
363
377
  }
364
378
  /** @internal */
365
379
  _renderCloseIcon() {
366
- return i`<svg viewBox="0 0 20 20" aria-hidden="true">
380
+ return n`<svg viewBox="0 0 20 20" aria-hidden="true">
367
381
  <path
368
382
  d="M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z"
369
383
  />
@@ -395,25 +409,29 @@ let r = class extends b {
395
409
  [`alert--${this.variant}`]: !0,
396
410
  "alert--accent": this.accent
397
411
  }, t = this._effectiveSeverityLabel;
398
- return i`
412
+ return n`
399
413
  <div
400
414
  class="sr-only"
401
415
  aria-live=${this._isAssertive ? "assertive" : "polite"}
402
416
  aria-atomic="true"
403
417
  ></div>
404
418
  <div part="alert" class=${f(e)}>
405
- <span class="alert__severity-label">${t}</span>
406
- ${this.showIcon ? i`
407
- <div part="icon" class="alert__icon">
419
+ <span class="alert__severity-label" aria-hidden="true">${t}</span>
420
+ ${this.showIcon ? n`
421
+ <div part="icon" class="alert__icon" aria-hidden="true">
408
422
  <slot name="icon">${this._renderDefaultIcon()}</slot>
409
423
  </div>
410
424
  ` : d}
411
425
 
412
426
  <div part="message" class="alert__message">
413
- <div part="title" class="alert__title ${this._hasTitle ? "alert__title--visible" : ""}">
427
+ <div
428
+ part="title"
429
+ class="alert__title ${this._hasTitle ? "alert__title--visible" : ""}"
430
+ aria-hidden="true"
431
+ >
414
432
  <slot name="title"></slot>
415
433
  </div>
416
- <slot></slot>
434
+ <span class="alert__default-slot"><slot></slot></span>
417
435
  <div
418
436
  part="actions"
419
437
  class="alert__actions ${this._hasActions ? "alert__actions--visible" : ""}"
@@ -422,7 +440,7 @@ let r = class extends b {
422
440
  </div>
423
441
  </div>
424
442
 
425
- ${this.dismissible ? i`
443
+ ${this.dismissible ? n`
426
444
  <button
427
445
  part="close-button"
428
446
  class="alert__close-button"
@@ -465,15 +483,15 @@ o([
465
483
  s({ type: String, attribute: "return-focus-to" })
466
484
  ], r.prototype, "returnFocusTo", 2);
467
485
  o([
468
- v()
486
+ u()
469
487
  ], r.prototype, "_hasActions", 2);
470
488
  o([
471
- v()
489
+ u()
472
490
  ], r.prototype, "_hasTitle", 2);
473
491
  r = o([
474
- p("hx-alert")
492
+ v("hx-alert")
475
493
  ], r);
476
494
  export {
477
495
  r as H
478
496
  };
479
- //# sourceMappingURL=hx-alert-CLn7CstP.js.map
497
+ //# sourceMappingURL=hx-alert-Bto8-TIi.js.map