@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
@@ -25,14 +25,24 @@ export type DropdownPlacement = 'top' | 'top-start' | 'top-end' | 'bottom' | 'bo
25
25
  * 3. `label` property
26
26
  * 4. Hard-coded literal `"Menu"` (last-resort accessible name)
27
27
  *
28
- * **Group 5 boundary (intentional):** This round is **additive only** the
29
- * host-label pipeline is the entire change. The panel's `role="menu"` and
30
- * the menuitem-roving keyboard pattern are already implemented per APG and
31
- * are NOT touched here. Group 5 (composite navigation: menu, menubar,
32
- * menuitem, tabs, tree) will own any broader refactor of the menu role and
33
- * roving-tabindex semantics. Codex reviewers: please scope findings to the
34
- * host-label pipeline; do not flag missing roving-focus / typeahead /
35
- * `aria-orientation` work here.
28
+ * **Group 4b Group 5b boundary:** Group 4b added the host-attribute
29
+ * label mirror **only** additive on top of the existing dropdown
30
+ * behaviour. Group 5b (this commit) adds the composite-navigation
31
+ * portion that 4b explicitly deferred:
32
+ * - **Roving tabindex** inside the panel (`_applyRovingTabIndex` +
33
+ * `_rovingIndex`). Only the focused item carries `tabindex=0`.
34
+ * - **First-character typeahead** with 500ms timeout (`_handleTypeahead`)
35
+ * matching `hx-menu`, `hx-overflow-menu`, `hx-split-button`.
36
+ * - Submenu auto-handling is delegated to slotted `hx-menu` /
37
+ * `hx-menu-item` (whose `hx-item-submenu-open` / `hx-item-submenu-close`
38
+ * events are auto-handled by the parent `hx-menu` after Group 5b).
39
+ *
40
+ * The panel's inner-div `role="menu"` is intentionally NOT migrated to
41
+ * the host: the host wraps a slotted consumer trigger AND the panel,
42
+ * so it cannot canonically carry the menu role. Slotted `hx-menu-item`
43
+ * children carry `role="menuitem"` on their HOST after Group 5b's menu
44
+ * migration, which fixes the cross-shadow walk concern from the
45
+ * consumer's perspective.
36
46
  *
37
47
  * `aria-controls` is intentionally omitted on the trigger: the panel lives
38
48
  * in shadow DOM and IDREF values cannot be resolved across shadow
@@ -109,6 +119,24 @@ export declare class HelixDropdown extends HelixElement {
109
119
  * @internal
110
120
  */
111
121
  private _panelVisible;
122
+ /**
123
+ * Index within the panel's focusable menu items of the item currently
124
+ * holding the roving tabindex (and thus visual focus). −1 means the
125
+ * panel has not been keyboard-focused yet.
126
+ * @internal
127
+ */
128
+ private _rovingIndex;
129
+ /**
130
+ * Accumulated character buffer for typeahead search within the panel's
131
+ * menu items. Cleared after 500ms of inactivity.
132
+ * @internal
133
+ */
134
+ private _typeaheadBuffer;
135
+ /**
136
+ * Timer handle that clears the typeahead buffer after a period of inactivity.
137
+ * @internal
138
+ */
139
+ private _typeaheadTimer;
112
140
  /**
113
141
  * Resolved accessible name for the menu panel — the value written to the
114
142
  * inner `[part="panel"]` `aria-label`. Recomputed on every sync per
@@ -171,6 +199,30 @@ export declare class HelixDropdown extends HelixElement {
171
199
  private _handleKeydown;
172
200
  /** @internal */
173
201
  private _handleMenuNavigation;
202
+ /**
203
+ * Roving tabindex inside the panel: only the focused item carries
204
+ * tabindex=0; the rest are tabindex=-1. APG-compliant for the menu
205
+ * button pattern. Closing-Tab semantics are preserved by the
206
+ * `_handleKeydown` Tab branch above (which lets focus advance
207
+ * naturally and closes the panel).
208
+ *
209
+ * Group 5b: introduced to align hx-dropdown's panel keyboard contract
210
+ * with hx-menu / hx-overflow-menu / hx-split-button. Group 4b only
211
+ * added the host-attribute label mirror (additive); this is the
212
+ * keyboard portion deferred until Group 5.
213
+ *
214
+ * Codex push-gate round-8 finding 2: route through
215
+ * `writeMenuItemRovingTabIndex` so host-canonical `hx-menu-item` items
216
+ * land their roving tabindex on the correct surface (host on the
217
+ * modern path, inner `.menu-item` on the fallback path). A direct
218
+ * `item.tabIndex = value` write on the host fails on the fallback
219
+ * path because the host is forced to `tabindex=-1` to keep exactly
220
+ * one focusable surface per item.
221
+ * @internal
222
+ */
223
+ private _applyRovingTabIndex;
224
+ /** @internal */
225
+ private _handleTypeahead;
174
226
  /** @internal */
175
227
  private _getFocusableMenuItems;
176
228
  /** @internal */
@@ -179,6 +231,42 @@ export declare class HelixDropdown extends HelixElement {
179
231
  private _handleOutsideClick;
180
232
  /** @internal */
181
233
  private _handlePanelClick;
234
+ /**
235
+ * Bubbled `hx-item-select` from a slotted `hx-menu-item` host. Forwards
236
+ * the activation through the composite's `hx-select` contract using the
237
+ * item's `value` property and label text. Disabled items never emit
238
+ * `hx-item-select`, so no disabled-guard is needed here.
239
+ * @internal
240
+ */
241
+ private _handlePanelItemSelect;
242
+ /**
243
+ * Bubbled `hx-item-submenu-open` from a slotted `hx-menu-item` host.
244
+ * Codex push-gate round-9 P1: when slotted `hx-menu-item`s open / close
245
+ * a nested submenu inside this composite's panel (no enclosing
246
+ * `hx-menu`), the events fly past with no handler. Match the round-4
247
+ * `hx-menu._handleSubmenuOpen` shape so APG behaviour holds.
248
+ *
249
+ * If the dispatching item is enclosed by an inner `hx-menu` (a true
250
+ * nested submenu inside the panel), that menu owns the toggle — defer.
251
+ * Otherwise this composite's panel is the enclosing menu surface, so
252
+ * call `setSubmenuOpen(true)` on the item and focus the first child.
253
+ * @internal
254
+ */
255
+ private _handlePanelSubmenuOpen;
256
+ /**
257
+ * Bubbled `hx-item-submenu-close` from a slotted `hx-menu-item` host.
258
+ * Codex push-gate round-9 P1: routes the close to the right surface.
259
+ *
260
+ * - Nested submenu close (the dispatching item lives inside an inner
261
+ * `hx-menu` slotted into a parent's `slot="submenu"`): defer to that
262
+ * inner menu's own handler. The composite's panel must NOT close.
263
+ * - Top-level item ArrowLeft (no enclosing `hx-menu` between the item
264
+ * and this composite): there is no parent submenu to close, so
265
+ * collapse the composite's panel and return focus to the trigger,
266
+ * matching APG menu-button behaviour.
267
+ * @internal
268
+ */
269
+ private _handlePanelSubmenuClose;
182
270
  render(): import('lit').TemplateResult<1>;
183
271
  /** @internal */
184
272
  private _onPanelSlotChange;
@@ -1 +1 @@
1
- {"version":3,"file":"hx-dropdown.d.ts","sourceRoot":"","sources":["../../../src/components/hx-dropdown/hx-dropdown.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,KAAK,CAAC;AACzD,OAAO,4CAA4C,CAAC;AAGpD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAanD,MAAM,MAAM,iBAAiB,GACzB,KAAK,GACL,WAAW,GACX,SAAS,GACT,QAAQ,GACR,cAAc,GACd,YAAY,GACZ,OAAO,GACP,KAAK,CAAC;AAIV;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2EG;AACH,qBACa,aAAc,SAAQ,YAAY;IAC7C,OAAgB,MAAM,4BAAkD;IAIxE;;;OAGG;IAEH,IAAI,UAAS;IAEb;;;OAGG;IAEH,SAAS,EACL,KAAK,GACL,WAAW,GACX,SAAS,GACT,QAAQ,GACR,cAAc,GACd,YAAY,GACZ,OAAO,GACP,KAAK,CAAkB;IAE3B;;;OAGG;IACS,KAAK,SAAU;IAE3B;;;OAGG;IAEH,QAAQ,UAAS;IAEjB;;;OAGG;IAEH,QAAQ,SAAK;IAIb;;;OAGG;IACM,OAAO,CAAC,aAAa,CAAS;IAEvC;;;;;;OAMG;IACM,OAAO,CAAC,cAAc,CAAM;IAErC;;;;OAIG;IACH,OAAO,CAAC,mBAAmB,CAAuB;IAElD;;;OAGG;IACH,OAAO,CAAC,WAAW,CAAsC;IAEzD;;;;OAIG;IACH,OAAO,CAAC,qBAAqB,CAAiC;IAE9D;;;;OAIG;IACH,OAAO,CAAC,yBAAyB,CAAS;IAG1C;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAgC;IAEhD;;;OAGG;IACsB,OAAO,CAAC,MAAM,CAA0B;IACjE;;;OAGG;IACwB,OAAO,CAAC,eAAe,CAA0B;IAInE,iBAAiB,IAAI,IAAI;IAWzB,oBAAoB,IAAI,IAAI;IAerC,gBAAgB;YACF,KAAK;IAwBnB,gBAAgB;IAChB,OAAO,CAAC,KAAK;IAkBb,gBAAgB;YACF,eAAe;IAyB7B,gBAAgB;IAChB,OAAO,CAAC,mBAAmB;IAS3B,gBAAgB;IAChB,OAAO,CAAC,qBAAqB;IAO7B,gBAAgB;IAChB,OAAO,CAAC,cAAc,CAepB;IAGF,gBAAgB;IAChB,OAAO,CAAC,qBAAqB;IAkB7B,gBAAgB;IAChB,OAAO,CAAC,sBAAsB;IAkB9B,gBAAgB;IAChB,OAAO,CAAC,sBAAsB;IAgB9B,gBAAgB;IAChB,OAAO,CAAC,mBAAmB,CAKzB;IAEF,gBAAgB;IAChB,OAAO,CAAC,iBAAiB;IAsBhB,MAAM;IA0Bf,gBAAgB;IAChB,OAAO,CAAC,kBAAkB;IAc1B,gBAAgB;IAChB,OAAO,CAAC,oBAAoB;IAInB,YAAY,IAAI,IAAI;IAI7B,gBAAgB;IAChB,OAAO,CAAC,iBAAiB;IAkBhB,UAAU,CAAC,iBAAiB,EAAE,cAAc,CAAC,IAAI,CAAC,GAAG,IAAI;IAUzD,OAAO,CAAC,iBAAiB,EAAE,cAAc,CAAC,IAAI,CAAC,GAAG,IAAI;IAiB/D;;;;;;;OAOG;IACH,OAAO,CAAC,4BAA4B;IAsBpC;;;;;;;;OAQG;IACH,OAAO,CAAC,kBAAkB;CAkC3B;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,aAAa,EAAE,aAAa,CAAC;KAC9B;IACD,UAAU,mBAAmB;QAC3B,SAAS,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;QAC7B,SAAS,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;QAC7B,WAAW,EAAE,WAAW,CAAC;YAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACnE;CACF"}
1
+ {"version":3,"file":"hx-dropdown.d.ts","sourceRoot":"","sources":["../../../src/components/hx-dropdown/hx-dropdown.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { H as e } from "../../shared/hx-dropdown-DJWlF94E.js";
1
+ import { H as e } from "../../shared/hx-dropdown-DiLd40Lm.js";
2
2
  export {
3
3
  e as HelixDropdown
4
4
  };
@@ -1,5 +1,6 @@
1
- import { nothing } from 'lit';
1
+ import { nothing, TemplateResult } from 'lit';
2
2
  import { HelixElement } from '../../base/index.js';
3
+ declare const HelixIconButton_base: typeof HelixElement;
3
4
  /**
4
5
  * An icon-only button component for compact, accessible actions.
5
6
  * Renders a square button or anchor element containing a single icon.
@@ -16,6 +17,7 @@ import { HelixElement } from '../../base/index.js';
16
17
  *
17
18
  * @csspart button - The native button or anchor element.
18
19
  * @csspart icon - The icon container span wrapping the default slot.
20
+ * @csspart spinner - The loading spinner SVG element shown when `loading` is true.
19
21
  *
20
22
  * @cssprop [--hx-icon-button-bg=transparent] - Button background color.
21
23
  * @cssprop [--hx-icon-button-color=var(--hx-color-primary-500)] - Icon color.
@@ -51,7 +53,7 @@ import { HelixElement } from '../../base/index.js';
51
53
  * @cssprop [--hx-color-error-500] - Color.
52
54
  * @cssprop [--hx-color-error-600] - Color.
53
55
  */
54
- export declare class HelixIconButton extends HelixElement {
56
+ export declare class HelixIconButton extends HelixIconButton_base {
55
57
  static styles: import('lit').CSSResult[];
56
58
  /**
57
59
  * Accessible name for the button. Required. Rendered as `aria-label` and
@@ -81,6 +83,14 @@ export declare class HelixIconButton extends HelixElement {
81
83
  * @attr disabled
82
84
  */
83
85
  disabled: boolean;
86
+ /**
87
+ * Whether the button is in a loading state. Shows the spinner, prevents
88
+ * activation, and sets `aria-busy="true"` on the inner element. Does NOT
89
+ * set the native `disabled` attribute (loading is transient; disabled is
90
+ * persistent, and AT announces them differently).
91
+ * @attr loading
92
+ */
93
+ loading: boolean;
84
94
  /**
85
95
  * When set, renders an `<a>` element instead of a `<button>`.
86
96
  * @attr href
@@ -107,7 +117,9 @@ export declare class HelixIconButton extends HelixElement {
107
117
  private _classes;
108
118
  /** @internal */
109
119
  private _iconSlot;
110
- render(): typeof nothing | import('lit').TemplateResult<1>;
120
+ /** @internal */
121
+ private _renderSpinner;
122
+ render(): typeof nothing | TemplateResult<1>;
111
123
  }
112
124
  declare global {
113
125
  interface HTMLElementTagNameMap {
@@ -119,4 +131,5 @@ declare global {
119
131
  }>;
120
132
  }
121
133
  }
134
+ export {};
122
135
  //# sourceMappingURL=hx-icon-button.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"hx-icon-button.d.ts","sourceRoot":"","sources":["../../../src/components/hx-icon-button/hx-icon-button.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,OAAO,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,4CAA4C,CAAC;AAIpD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAKnD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AACH,qBACa,eAAgB,SAAQ,YAAY;IAC/C,OAAgB,MAAM,4BAAoD;IAE1E;;;;;OAKG;IAEH,KAAK,SAAM;IAEX;;;OAGG;IAEH,OAAO,EAAE,SAAS,GAAG,WAAW,GAAG,UAAU,GAAG,QAAQ,GAAG,OAAO,CAAW;IAE7E;;;OAGG;IAEH,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAQ;IAEhC;;;;OAIG;IAEH,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAY;IAE/C;;;OAGG;IAEH,QAAQ,UAAS;IAEjB;;;OAGG;IAEH,IAAI,EAAE,MAAM,GAAG,SAAS,CAAa;IAErC;;;OAGG;IAEH,IAAI,EAAE,MAAM,GAAG,SAAS,CAAa;IAErC;;;OAGG;IAEH,KAAK,EAAE,MAAM,GAAG,SAAS,CAAa;IAItC,oFAAoF;IACpF,OAAgB,cAAc,UAAQ;cAEnB,eAAe,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI;IAM3D,gBAAgB;IAChB,OAAO,CAAC,YAAY;IA+BpB,gBAAgB;IAChB,OAAO,CAAC,gBAAgB;IAIxB,gBAAgB;IAChB,OAAO,CAAC,QAAQ;IAQhB,gBAAgB;IAChB,OAAO,CAAC,SAAS;IAMR,MAAM;CAsDhB;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,gBAAgB,EAAE,eAAe,CAAC;KACnC;IACD,UAAU,mBAAmB;QAC3B,UAAU,EAAE,WAAW,CAAC;YAAE,aAAa,EAAE,UAAU,CAAA;SAAE,CAAC,CAAC;KACxD;CACF"}
1
+ {"version":3,"file":"hx-icon-button.d.ts","sourceRoot":"","sources":["../../../src/components/hx-icon-button/hx-icon-button.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,KAAK,CAAC;AACzD,OAAO,4CAA4C,CAAC;AAIpD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;;AAMnD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmDG;AACH,qBACa,eAAgB,SAAQ,oBAAgC;IACnE,OAAgB,MAAM,4BAAoD;IAE1E;;;;;OAKG;IAEH,KAAK,SAAM;IAEX;;;OAGG;IAEH,OAAO,EAAE,SAAS,GAAG,WAAW,GAAG,UAAU,GAAG,QAAQ,GAAG,OAAO,CAAW;IAE7E;;;OAGG;IAEH,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAQ;IAEhC;;;;OAIG;IAEH,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAY;IAE/C;;;OAGG;IAEH,QAAQ,UAAS;IAEjB;;;;;;OAMG;IAEH,OAAO,UAAS;IAEhB;;;OAGG;IAEH,IAAI,EAAE,MAAM,GAAG,SAAS,CAAa;IAErC;;;OAGG;IAEH,IAAI,EAAE,MAAM,GAAG,SAAS,CAAa;IAErC;;;OAGG;IAEH,KAAK,EAAE,MAAM,GAAG,SAAS,CAAa;IAItC,oFAAoF;IACpF,OAAgB,cAAc,UAAQ;cAEnB,eAAe,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI;IAM3D,gBAAgB;IAChB,OAAO,CAAC,YAAY;IA+BpB,gBAAgB;IAChB,OAAO,CAAC,gBAAgB;IAIxB,gBAAgB;IAChB,OAAO,CAAC,QAAQ;IAShB,gBAAgB;IAChB,OAAO,CAAC,SAAS;IAIjB,gBAAgB;IAChB,OAAO,CAAC,cAAc;IA+Bb,MAAM;CAgFhB;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,gBAAgB,EAAE,eAAe,CAAC;KACnC;IACD,UAAU,mBAAmB;QAC3B,UAAU,EAAE,WAAW,CAAC;YAAE,aAAa,EAAE,UAAU,CAAA;SAAE,CAAC,CAAC;KACxD;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"hx-icon-button.styles.d.ts","sourceRoot":"","sources":["../../../src/components/hx-icon-button/hx-icon-button.styles.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,qBAAqB,yBA2LjC,CAAC"}
1
+ {"version":3,"file":"hx-icon-button.styles.d.ts","sourceRoot":"","sources":["../../../src/components/hx-icon-button/hx-icon-button.styles.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,qBAAqB,yBAyNjC,CAAC"}
@@ -1,4 +1,4 @@
1
- import { H as e } from "../../shared/hx-icon-button-CGNdQSFM.js";
1
+ import { H as e } from "../../shared/hx-icon-button-a6OpeQz5.js";
2
2
  export {
3
3
  e as HelixIconButton
4
4
  };
@@ -3,6 +3,7 @@ import { HelixElement } from '../../base/index.js';
3
3
  * Variant options for the link component.
4
4
  */
5
5
  export type LinkVariant = 'default' | 'subtle' | 'danger';
6
+ declare const HelixLink_base: typeof HelixElement;
6
7
  /**
7
8
  * A semantic hyperlink component with accessibility-first design.
8
9
  * Renders a native `<a>` element for enabled state and a `<span>` for
@@ -52,7 +53,7 @@ export type LinkVariant = 'default' | 'subtle' | 'danger';
52
53
  * @cssprop [--hx-color-error-700] - Color.
53
54
  * @cssprop [--hx-color-neutral-400] - Color.
54
55
  */
55
- export declare class HelixLink extends HelixElement {
56
+ export declare class HelixLink extends HelixLink_base {
56
57
  static styles: import('lit').CSSResult[];
57
58
  /**
58
59
  * The URL the link points to.
@@ -90,6 +91,13 @@ export declare class HelixLink extends HelixElement {
90
91
  * @attr rel
91
92
  */
92
93
  rel: string | undefined;
94
+ /**
95
+ * Localised announcement text appended (visually hidden) to the link's
96
+ * accessible name when `target="_blank"`. Defaults to English. Override
97
+ * for i18n contexts so AT users hear the new-tab notice in their locale.
98
+ * @attr external-label
99
+ */
100
+ externalLabel: string;
93
101
  /** @internal Blocks Enter and Space activation on disabled span. */
94
102
  private _handleDisabledKeydown;
95
103
  /** @internal */
@@ -105,4 +113,5 @@ declare global {
105
113
  'hx-link': HelixLink;
106
114
  }
107
115
  }
116
+ export {};
108
117
  //# sourceMappingURL=hx-link.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"hx-link.d.ts","sourceRoot":"","sources":["../../../src/components/hx-link/hx-link.ts"],"names":[],"mappings":"AACA,OAAO,4CAA4C,CAAC;AAIpD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAInD;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE1D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AACH,qBACa,SAAU,SAAQ,YAAY;IACzC,OAAgB,MAAM,4BAAuC;IAE7D;;;OAGG;IAEH,IAAI,EAAE,MAAM,GAAG,SAAS,CAAa;IAErC;;;;;OAKG;IAEH,MAAM,EAAE,MAAM,GAAG,SAAS,CAAa;IAEvC;;;OAGG;IAEH,OAAO,EAAE,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAa;IAErD;;;;;OAKG;IAEH,QAAQ,UAAS;IAEjB;;;;OAIG;IAEH,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAa;IAEzC;;;;OAIG;IAEH,GAAG,EAAE,MAAM,GAAG,SAAS,CAAa;IAIpC,oEAAoE;IACpE,OAAO,CAAC,sBAAsB;IAM9B,gBAAgB;IAChB,OAAO,CAAC,YAAY;IAkBpB,gBAAgB;IAChB,OAAO,CAAC,WAAW;IAMnB,gBAAgB;IAChB,OAAO,CAAC,mBAAmB;IAuBlB,MAAM;CAsChB;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,SAAS,EAAE,SAAS,CAAC;KACtB;CACF"}
1
+ {"version":3,"file":"hx-link.d.ts","sourceRoot":"","sources":["../../../src/components/hx-link/hx-link.ts"],"names":[],"mappings":"AACA,OAAO,4CAA4C,CAAC;AAIpD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAKnD;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAC;;AAE1D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AACH,qBACa,SAAU,SAAQ,cAAgC;IAC7D,OAAgB,MAAM,4BAAuC;IAE7D;;;OAGG;IAEH,IAAI,EAAE,MAAM,GAAG,SAAS,CAAa;IAErC;;;;;OAKG;IAEH,MAAM,EAAE,MAAM,GAAG,SAAS,CAAa;IAEvC;;;OAGG;IAEH,OAAO,EAAE,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAa;IAErD;;;;;OAKG;IAEH,QAAQ,UAAS;IAEjB;;;;OAIG;IAEH,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAa;IAEzC;;;;OAIG;IAEH,GAAG,EAAE,MAAM,GAAG,SAAS,CAAa;IAEpC;;;;;OAKG;IAEH,aAAa,EAAE,MAAM,CAAwB;IAI7C,oEAAoE;IACpE,OAAO,CAAC,sBAAsB;IAM9B,gBAAgB;IAChB,OAAO,CAAC,YAAY;IAkBpB,gBAAgB;IAChB,OAAO,CAAC,WAAW;IAMnB,gBAAgB;IAChB,OAAO,CAAC,mBAAmB;IAuBlB,MAAM;CAuDhB;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,SAAS,EAAE,SAAS,CAAC;KACtB;CACF"}
@@ -1,4 +1,4 @@
1
- import { H as o } from "../../shared/hx-link-C-O6vq0Q.js";
1
+ import { H as o } from "../../shared/hx-link-CMnZRUtQ.js";
2
2
  export {
3
3
  o as HelixLink
4
4
  };
@@ -3,6 +3,14 @@ import { HelixElement } from '../../base/index.js';
3
3
  /**
4
4
  * A rich list item for use inside `hx-list`.
5
5
  *
6
+ * Group 7 host-canonical: `role="option"` (interactive listbox mode) is
7
+ * mirrored onto the **host** via `_internals.role` AND the legacy
8
+ * setAttribute('role',...) path. The dual-surface pattern preserves the
9
+ * existing imperative host-attribute behaviour (so consumers querying
10
+ * `host.getAttribute('role')` still work) while adding cross-shadow IDREF
11
+ * wiring through `internals.ariaLabelledByElements` for engines that
12
+ * support it.
13
+ *
6
14
  * @summary Individual list item with optional prefix, suffix, description, link, and disabled/selected states.
7
15
  *
8
16
  * @tag hx-list-item
@@ -30,6 +38,12 @@ import { HelixElement } from '../../base/index.js';
30
38
  */
31
39
  export declare class HelixListItem extends HelixElement {
32
40
  static styles: import('lit').CSSResult[];
41
+ /**
42
+ * Test seam (Group 7 host-canonical migration): see other Group 7 components.
43
+ * Production code MUST NOT touch this field.
44
+ * @internal
45
+ */
46
+ static __testSupportsIdrefRefsOverride: boolean | null;
33
47
  /**
34
48
  * Whether the item is disabled. Prevents interaction.
35
49
  * @attr disabled
@@ -61,10 +75,22 @@ export declare class HelixListItem extends HelixElement {
61
75
  * @attr type
62
76
  */
63
77
  type: 'default' | 'term' | 'definition';
78
+ /** @internal */
79
+ private _supportsIdrefRefs;
80
+ /** @internal */
81
+ private _ariaMirror;
82
+ /** @internal */
83
+ private _resolvedAccessibleName;
84
+ connectedCallback(): void;
85
+ disconnectedCallback(): void;
64
86
  updated(changedProps: PropertyValues<this>): void;
65
87
  /**
66
88
  * Syncs ARIA attributes to the host element when in interactive (listbox option) mode.
67
- * This ensures correct ARIA ownership: ul[role=listbox] > hx-list-item[role=option].
89
+ * Preserves the prior imperative `setAttribute('role', 'option')` path so existing
90
+ * consumer queries and tests continue to pass. ALSO mirrors the same surface onto
91
+ * `internals.role` / `internals.ariaSelected` (modern path) so cross-shadow IDREF
92
+ * resolution through `internals.ariaLabelledByElements` works on engines that
93
+ * support it.
68
94
  */
69
95
  /** @internal */
70
96
  private _syncHostAria;
@@ -1 +1 @@
1
- {"version":3,"file":"hx-list-item.d.ts","sourceRoot":"","sources":["../../../src/components/hx-list/hx-list-item.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,KAAK,CAAC;AACzD,OAAO,4CAA4C,CAAC;AAIpD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAInD;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,qBACa,aAAc,SAAQ,YAAY;IAC7C,OAAgB,MAAM,4BAA8C;IAEpE;;;OAGG;IAEH,QAAQ,UAAS;IAEjB;;;OAGG;IAEH,QAAQ,UAAS;IAEjB;;;OAGG;IAEH,IAAI,EAAE,MAAM,GAAG,SAAS,CAAa;IAErC;;;OAGG;IAEH,KAAK,EAAE,MAAM,GAAG,SAAS,CAAa;IAEtC;;;;OAIG;IAEH,WAAW,UAAS;IAEpB;;;OAGG;IAEH,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,YAAY,CAAa;IAE3C,OAAO,CAAC,YAAY,EAAE,cAAc,CAAC,IAAI,CAAC,GAAG,IAAI;IAW1D;;;OAGG;IACH,gBAAgB;IAChB,OAAO,CAAC,aAAa;IAsBrB,gBAAgB;IAChB,OAAO,CAAC,sBAAsB;IAU9B,gBAAgB;IAChB,OAAO,CAAC,YAAY;IAUpB,gBAAgB;IAChB,OAAO,CAAC,cAAc;IAmBb,MAAM;IAmFf,gBAAgB;IAChB,OAAO,CAAC,cAAc;CAQvB;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,cAAc,EAAE,aAAa,CAAC;KAC/B;CACF"}
1
+ {"version":3,"file":"hx-list-item.d.ts","sourceRoot":"","sources":["../../../src/components/hx-list/hx-list-item.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,KAAK,CAAC;AACzD,OAAO,4CAA4C,CAAC;AAIpD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAWnD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,qBACa,aAAc,SAAQ,YAAY;IAC7C,OAAgB,MAAM,4BAA8C;IAEpE;;;;OAIG;IACH,MAAM,CAAC,+BAA+B,EAAE,OAAO,GAAG,IAAI,CAAQ;IAE9D;;;OAGG;IAEH,QAAQ,UAAS;IAEjB;;;OAGG;IAEH,QAAQ,UAAS;IAEjB;;;OAGG;IAEH,IAAI,EAAE,MAAM,GAAG,SAAS,CAAa;IAErC;;;OAGG;IAEH,KAAK,EAAE,MAAM,GAAG,SAAS,CAAa;IAEtC;;;;OAIG;IAEH,WAAW,UAAS;IAEpB;;;OAGG;IAEH,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,YAAY,CAAa;IAIpD,gBAAgB;IAChB,OAAO,CAAC,kBAAkB,CAAQ;IAElC,gBAAgB;IAChB,OAAO,CAAC,WAAW,CAAsC;IAEzD,gBAAgB;IAChB,OAAO,CAAC,uBAAuB,CAAM;IAE5B,iBAAiB,IAAI,IAAI;IAazB,oBAAoB,IAAI,IAAI;IAM5B,OAAO,CAAC,YAAY,EAAE,cAAc,CAAC,IAAI,CAAC,GAAG,IAAI;IAW1D;;;;;;;OAOG;IACH,gBAAgB;IAChB,OAAO,CAAC,aAAa;IAgFrB,gBAAgB;IAChB,OAAO,CAAC,sBAAsB;IAU9B,gBAAgB;IAChB,OAAO,CAAC,YAAY;IAUpB,gBAAgB;IAChB,OAAO,CAAC,cAAc;IAmBb,MAAM;IAmFf,gBAAgB;IAChB,OAAO,CAAC,cAAc;CAQvB;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,cAAc,EAAE,aAAa,CAAC;KAC/B;CACF"}
@@ -3,6 +3,12 @@ import { HelixElement } from '../../base/index.js';
3
3
  /**
4
4
  * A styled list container supporting plain, bulleted, numbered, description, and interactive variants.
5
5
  *
6
+ * Group 7 host-canonical: `role="list"` (or `role="listbox"` in interactive
7
+ * mode) lives on the **host** via `_internals.role`, harmonizing with
8
+ * `hx-structured-list` (the gold-standard exemplar for Group 7). The `<dl>`
9
+ * description variant keeps native semantics — no host role assigned, since
10
+ * `<dl>` IS the semantic surface and AT walks it directly.
11
+ *
6
12
  * @summary Container for list items with optional dividers and interactive selection.
7
13
  *
8
14
  * @tag hx-list
@@ -22,6 +28,12 @@ import { HelixElement } from '../../base/index.js';
22
28
  */
23
29
  export declare class HelixList extends HelixElement {
24
30
  static styles: import('lit').CSSResult[];
31
+ /**
32
+ * Test seam (Group 7 host-canonical migration): see other Group 7 components.
33
+ * Production code MUST NOT touch this field.
34
+ * @internal
35
+ */
36
+ static __testSupportsIdrefRefsOverride: boolean | null;
25
37
  /**
26
38
  * Visual variant of the list.
27
39
  * @attr variant
@@ -37,6 +49,12 @@ export declare class HelixList extends HelixElement {
37
49
  * @attr label
38
50
  */
39
51
  label: string | undefined;
52
+ /** @internal */
53
+ private _supportsIdrefRefs;
54
+ /** @internal */
55
+ private _ariaMirror;
56
+ /** @internal */
57
+ private _resolvedAccessibleName;
40
58
  connectedCallback(): void;
41
59
  disconnectedCallback(): void;
42
60
  updated(changedProps: PropertyValues<this>): void;
@@ -46,6 +64,16 @@ export declare class HelixList extends HelixElement {
46
64
  */
47
65
  /** @internal */
48
66
  private _updateItemStates;
67
+ /**
68
+ * Resolve the host's role for the current variant. Description variant
69
+ * uses native `<dl>` semantics (returns `null` so the host carries no
70
+ * explicit role). Interactive variant becomes `listbox`. All other
71
+ * variants are `list`.
72
+ * @internal
73
+ */
74
+ private _hostRole;
75
+ /** @internal */
76
+ private _syncHostAriaSemantics;
49
77
  /** @internal */
50
78
  private _handleSlotChange;
51
79
  /** @internal */
@@ -1 +1 @@
1
- {"version":3,"file":"hx-list.d.ts","sourceRoot":"","sources":["../../../src/components/hx-list/hx-list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,KAAK,CAAC;AACzD,OAAO,4CAA4C,CAAC;AAGpD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAMnD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBACa,SAAU,SAAQ,YAAY;IACzC,OAAgB,MAAM,4BAA0C;IAEhE;;;OAGG;IAEH,OAAO,EAAE,OAAO,GAAG,UAAU,GAAG,UAAU,GAAG,aAAa,GAAG,aAAa,CAAW;IAErF;;;OAGG;IAEH,OAAO,UAAS;IAEhB;;;OAGG;IAEH,KAAK,EAAE,MAAM,GAAG,SAAS,CAAa;IAE7B,iBAAiB,IAAI,IAAI;IAKzB,oBAAoB,IAAI,IAAI;IAK5B,OAAO,CAAC,YAAY,EAAE,cAAc,CAAC,IAAI,CAAC,GAAG,IAAI;IAc1D;;;OAGG;IACH,gBAAgB;IAChB,OAAO,CAAC,iBAAiB;IAQzB,gBAAgB;IAChB,OAAO,CAAC,iBAAiB;IAIzB,gBAAgB;IAChB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAiC7B;IAEF,gBAAgB;IAChB,OAAO,CAAC,gBAAgB;IAgBf,MAAM;CA+ChB;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,SAAS,EAAE,SAAS,CAAC;KACtB;CACF"}
1
+ {"version":3,"file":"hx-list.d.ts","sourceRoot":"","sources":["../../../src/components/hx-list/hx-list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,KAAK,CAAC;AACzD,OAAO,4CAA4C,CAAC;AAGpD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAanD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,qBACa,SAAU,SAAQ,YAAY;IACzC,OAAgB,MAAM,4BAA0C;IAEhE;;;;OAIG;IACH,MAAM,CAAC,+BAA+B,EAAE,OAAO,GAAG,IAAI,CAAQ;IAE9D;;;OAGG;IAEH,OAAO,EAAE,OAAO,GAAG,UAAU,GAAG,UAAU,GAAG,aAAa,GAAG,aAAa,CAAW;IAErF;;;OAGG;IAEH,OAAO,UAAS;IAEhB;;;OAGG;IAEH,KAAK,EAAE,MAAM,GAAG,SAAS,CAAa;IAItC,gBAAgB;IAChB,OAAO,CAAC,kBAAkB,CAAQ;IAElC,gBAAgB;IAChB,OAAO,CAAC,WAAW,CAAsC;IAEzD,gBAAgB;IAChB,OAAO,CAAC,uBAAuB,CAAM;IAE5B,iBAAiB,IAAI,IAAI;IAczB,oBAAoB,IAAI,IAAI;IAO5B,OAAO,CAAC,YAAY,EAAE,cAAc,CAAC,IAAI,CAAC,GAAG,IAAI;IAkB1D;;;OAGG;IACH,gBAAgB;IAChB,OAAO,CAAC,iBAAiB;IAQzB;;;;;;OAMG;IACH,OAAO,CAAC,SAAS;IAMjB,gBAAgB;IAChB,OAAO,CAAC,sBAAsB;IAwE9B,gBAAgB;IAChB,OAAO,CAAC,iBAAiB;IAIzB,gBAAgB;IAChB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAiC7B;IAEF,gBAAgB;IAChB,OAAO,CAAC,gBAAgB;IAgBf,MAAM;CAmDhB;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,SAAS,EAAE,SAAS,CAAC;KACtB;CACF"}
@@ -1,4 +1,4 @@
1
- import { H as s, a as t } from "../../shared/hx-list-MyEhh8c7.js";
1
+ import { H as s, a as t } from "../../shared/hx-list-De66EtAP.js";
2
2
  export {
3
3
  s as HelixList,
4
4
  t as HelixListItem
@@ -2,6 +2,13 @@ import { HelixElement } from '../../base/index.js';
2
2
  /**
3
3
  * A visual separator for grouping items within an `hx-menu`.
4
4
  *
5
+ * Group 5b host-canonical: `role="separator"` lives on the **host** via
6
+ * `_internals.role` so the parent `<hx-menu>` (`role="menu"`) sees the
7
+ * separator as a direct child. `aria-orientation` is mirrored onto the host
8
+ * via `internals.ariaOrientation`. The inner div is presentational on the
9
+ * modern path and stripped of its role; the legacy fallback keeps the
10
+ * inner role for engines without ElementInternals IDL accessors.
11
+ *
5
12
  * @summary Horizontal divider between menu sections.
6
13
  *
7
14
  * @tag hx-menu-divider
@@ -12,6 +19,9 @@ import { HelixElement } from '../../base/index.js';
12
19
  */
13
20
  export declare class HelixMenuDivider extends HelixElement {
14
21
  static styles: import('lit').CSSResult[];
22
+ /** @internal */
23
+ private _supportsIdrefRefs;
24
+ connectedCallback(): void;
15
25
  render(): import('lit').TemplateResult<1>;
16
26
  }
17
27
  declare global {
@@ -1 +1 @@
1
- {"version":3,"file":"hx-menu-divider.d.ts","sourceRoot":"","sources":["../../../src/components/hx-menu/hx-menu-divider.ts"],"names":[],"mappings":"AACA,OAAO,4CAA4C,CAAC;AAEpD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAInD;;;;;;;;;;GAUG;AACH,qBACa,gBAAiB,SAAQ,YAAY;IAChD,OAAgB,MAAM,4BAAqD;IAElE,MAAM;CAQhB;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,iBAAiB,EAAE,gBAAgB,CAAC;KACrC;CACF"}
1
+ {"version":3,"file":"hx-menu-divider.d.ts","sourceRoot":"","sources":["../../../src/components/hx-menu/hx-menu-divider.ts"],"names":[],"mappings":"AACA,OAAO,4CAA4C,CAAC;AAEpD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAKnD;;;;;;;;;;;;;;;;;GAiBG;AACH,qBACa,gBAAiB,SAAQ,YAAY;IAChD,OAAgB,MAAM,4BAAqD;IAE3E,gBAAgB;IAChB,OAAO,CAAC,kBAAkB,CAAQ;IAEzB,iBAAiB,IAAI,IAAI;IAQzB,MAAM;CAehB;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,iBAAiB,EAAE,gBAAgB,CAAC;KACrC;CACF"}
@@ -1,8 +1,23 @@
1
+ import { PropertyValues } from 'lit';
1
2
  import { HelixElement } from '../../base/index.js';
2
3
  /**
3
4
  * A single interactive item for use inside `hx-menu`. Supports normal, checkbox,
4
5
  * and radio types, loading state, prefix/suffix slots, and submenu nesting.
5
- * Use `aria-label` on the parent `hx-menu` to provide an accessible name.
6
+ *
7
+ * Group 5b host-canonical: `role="menuitem"` (or `menuitemcheckbox` /
8
+ * `menuitemradio` based on `type`) lives on the **host** via
9
+ * `_internals.role`. The roving tabindex is written to the host, so the host
10
+ * is the focusable surface and lands directly under the parent `<hx-menu>`
11
+ * (which carries `role="menu"`) in the AT walked tree. The inner element is
12
+ * presentational on the modern path — no role, no aria-* attributes — and
13
+ * carries only click/keyboard event handlers. Keyboard activation
14
+ * (Enter/Space) is owned by the host's `keydown` handler.
15
+ *
16
+ * Cross-shadow naming: consumer-supplied `aria-label` / `aria-labelledby` on
17
+ * the host project to `internals.ariaLabel` / `internals.ariaLabelledByElements`
18
+ * via the shared IDREF mirror. The slotted text content is used as the default
19
+ * accessible name when no override is set (AT walks slotted children
20
+ * automatically through the host's role).
6
21
  *
7
22
  * @summary Interactive item within an hx-menu.
8
23
  *
@@ -29,6 +44,19 @@ import { HelixElement } from '../../base/index.js';
29
44
  */
30
45
  export declare class HelixMenuItem extends HelixElement {
31
46
  static styles: import('lit').CSSResult[];
47
+ /**
48
+ * Test seam (codex push-gate round-1 finding 3 mirror of hx-select
49
+ * pattern): when set to `true` or `false`, overrides the platform
50
+ * `supportsIdrefElementReferences` probe before `connectedCallback`
51
+ * seeds `_supportsIdrefRefs`. Tests that need to exercise the fallback
52
+ * path must select it BEFORE the host connects so tabindex / role
53
+ * placement matches a legacy engine for the entire lifecycle.
54
+ *
55
+ * Production code MUST NOT touch this field. It is `static` so the test
56
+ * stub cleanup is global and obvious.
57
+ * @internal
58
+ */
59
+ static __testSupportsIdrefRefsOverride: boolean | null;
32
60
  /**
33
61
  * @internal Managed by parent hx-menu for roving tabindex.
34
62
  * Only the active item in the menu has tabindex=0; all others have -1.
@@ -70,13 +98,82 @@ export declare class HelixMenuItem extends HelixElement {
70
98
  private _submenuOpen;
71
99
  /** @internal */
72
100
  private _menuItemEl;
73
- /** Focus the inner interactive element. */
101
+ /** @internal */
102
+ private _supportsIdrefRefs;
103
+ /** @internal */
104
+ private _ariaMirror;
105
+ /**
106
+ * Resolved accessible name for the menu item — read by both
107
+ * `_syncHostAriaSemantics()` (modern path: host `internals.ariaLabel`)
108
+ * and the fallback `render()` branch (legacy path: inner
109
+ * `div[role="menuitem*"]` `aria-label`). Empty string means "no
110
+ * override" — slotted text content provides the implicit name through
111
+ * the announced surface (host on modern; inner div on fallback). AccName
112
+ * 1.2 §4.3.1 precedence: consumer host `aria-labelledby` (flattened) >
113
+ * consumer host `aria-label` > implicit slotted text.
114
+ * @internal
115
+ */
116
+ private _resolvedAccessibleName;
117
+ /**
118
+ * Focus the menu item. On the modern host-canonical path, focus lands on
119
+ * the host (which carries the roving tabindex and announced role). On the
120
+ * legacy fallback path, focus delegates to the inner element which still
121
+ * carries the role.
122
+ */
74
123
  focus(options?: FocusOptions): void;
75
124
  connectedCallback(): void;
125
+ disconnectedCallback(): void;
126
+ updated(changedProperties: PropertyValues<this>): void;
127
+ /**
128
+ * Apply the roving tabindex to the host (modern path) so the host is the
129
+ * Tab stop. Disabled items are non-tabbable.
130
+ *
131
+ * Codex push-gate round-1 finding 3: on the fallback path
132
+ * (`_supportsIdrefRefs === false`), the inner `.menu-item` element
133
+ * carries `role="menuitem"` and the roving tabindex via the template
134
+ * (see `render()`'s legacy branch). If we ALSO assign a non-negative
135
+ * tabindex to the host, the user gets two focusable surfaces per item —
136
+ * Tab can land on the host even though the AT-announced role/aria-* live
137
+ * on the inner element. The host MUST be removed from the tab order on
138
+ * the fallback path; the inner element is the canonical Tab stop.
139
+ * @internal
140
+ */
141
+ private _applyHostTabIndex;
142
+ /**
143
+ * Mirror menuitem semantics onto the host via ElementInternals. Role is
144
+ * derived from `type` (normal → menuitem, checkbox → menuitemcheckbox,
145
+ * radio → menuitemradio). aria-disabled, aria-checked, aria-haspopup,
146
+ * aria-expanded, and aria-busy reactively follow component state.
147
+ * Consumer-supplied `aria-label` / `aria-labelledby` on the host project
148
+ * onto `internals.ariaLabel` / `internals.ariaLabelledByElements`.
149
+ * @internal
150
+ */
151
+ private _syncHostAriaSemantics;
76
152
  /** @internal */
77
153
  private _handleSubmenuSlotChange;
78
154
  /** @internal */
79
155
  private _activate;
156
+ /**
157
+ * Origin guard for host-bound click/keydown handlers. Returns `true` only
158
+ * when the event originated on THIS host (its shadow tree) and not on a
159
+ * nested `hx-menu-item` projected into the `submenu` slot.
160
+ *
161
+ * Codex push-gate round-5 P1: nested submenu items are slotted descendants
162
+ * in the parent's light DOM. Click/keydown events from a Child item bubble
163
+ * through the parent host's listeners — without this guard, selecting Child
164
+ * also activates Parent (double `hx-item-select`) and Enter/Space/ArrowRight
165
+ * on Child re-trigger Parent's handlers (wrong-level activation, second
166
+ * submenu reopen).
167
+ *
168
+ * Walks `composedPath()` and returns the closest `hx-menu-item` ancestor of
169
+ * the original target; the event is "ours" iff that ancestor is `this`.
170
+ * Mirrors the inner-vs-host origin discipline used by `hx-checkbox`,
171
+ * `hx-switch`, and `hx-toggle-button`'s host handlers (`path[0] !== this`)
172
+ * but adapts for hx-menu-item's nested-host case where path[0] is the
173
+ * deepest inner element of a slotted child's own shadow tree.
174
+ * @internal
175
+ */
176
+ private _isOwnEvent;
80
177
  /** @internal */
81
178
  private _handleClick;
82
179
  /** @internal */
@@ -1 +1 @@
1
- {"version":3,"file":"hx-menu-item.d.ts","sourceRoot":"","sources":["../../../src/components/hx-menu/hx-menu-item.ts"],"names":[],"mappings":"AACA,OAAO,4CAA4C,CAAC;AAGpD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAKnD;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,qBACa,aAAc,SAAQ,YAAY;IAC7C,OAAgB,MAAM,4BAAkD;IAExE;;;OAGG;IAEH,OAAO,CAAC,eAAe,CAAM;IAE7B,yEAAyE;IACzE,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAItC,mGAAmG;IACnG,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IAInC;;;OAGG;IAEH,KAAK,SAAM;IAEX;;;OAGG;IAEH,QAAQ,UAAS;IAEjB;;;OAGG;IAEH,OAAO,UAAS;IAEhB;;;;OAIG;IAEH,IAAI,EAAE,QAAQ,GAAG,UAAU,GAAG,OAAO,CAAY;IAEjD;;;OAGG;IAEH,OAAO,UAAS;IAEhB,gBAAgB;IAEhB,OAAO,CAAC,WAAW,CAAS;IAE5B,qEAAqE;IAErE,OAAO,CAAC,YAAY,CAAS;IAE7B,gBAAgB;IACK,OAAO,CAAC,WAAW,CAAsB;IAE9D,2CAA2C;IAClC,KAAK,CAAC,OAAO,CAAC,EAAE,YAAY,GAAG,IAAI;IAInC,iBAAiB,IAAI,IAAI;IAclC,gBAAgB;IAChB,OAAO,CAAC,wBAAwB;IAKhC,gBAAgB;IAChB,OAAO,CAAC,SAAS;IA2BjB,gBAAgB;IAChB,OAAO,CAAC,YAAY;IASpB,gBAAgB;IAChB,OAAO,CAAC,cAAc;IA+BtB,gBAAgB;IAChB,OAAO,CAAC,kBAAkB;IAmB1B,gBAAgB;IAChB,OAAO,CAAC,kBAAkB;IAmB1B,gBAAgB;IAChB,OAAO,CAAC,cAAc;IActB,gBAAgB;IAChB,OAAO,CAAC,QAAQ;IAWP,MAAM;CAsChB;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,cAAc,EAAE,aAAa,CAAC;KAC/B;CACF"}
1
+ {"version":3,"file":"hx-menu-item.d.ts","sourceRoot":"","sources":["../../../src/components/hx-menu/hx-menu-item.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,KAAK,CAAC;AACzD,OAAO,4CAA4C,CAAC;AAGpD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAYnD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,qBACa,aAAc,SAAQ,YAAY;IAC7C,OAAgB,MAAM,4BAAkD;IAExE;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,+BAA+B,EAAE,OAAO,GAAG,IAAI,CAAQ;IAE9D;;;OAGG;IAEH,OAAO,CAAC,eAAe,CAAM;IAE7B,yEAAyE;IACzE,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAKtC,mGAAmG;IACnG,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IAInC;;;OAGG;IAEH,KAAK,SAAM;IAEX;;;OAGG;IAEH,QAAQ,UAAS;IAEjB;;;OAGG;IAEH,OAAO,UAAS;IAEhB;;;;OAIG;IAEH,IAAI,EAAE,QAAQ,GAAG,UAAU,GAAG,OAAO,CAAY;IAEjD;;;OAGG;IAEH,OAAO,UAAS;IAEhB,gBAAgB;IAEhB,OAAO,CAAC,WAAW,CAAS;IAE5B,qEAAqE;IAErE,OAAO,CAAC,YAAY,CAAS;IAE7B,gBAAgB;IACK,OAAO,CAAC,WAAW,CAAsB;IAI9D,gBAAgB;IAChB,OAAO,CAAC,kBAAkB,CAAQ;IAElC,gBAAgB;IAChB,OAAO,CAAC,WAAW,CAAsC;IAEzD;;;;;;;;;;OAUG;IACH,OAAO,CAAC,uBAAuB,CAAM;IAErC;;;;;OAKG;IACM,KAAK,CAAC,OAAO,CAAC,EAAE,YAAY,GAAG,IAAI;IASnC,iBAAiB,IAAI,IAAI;IAmCzB,oBAAoB,IAAI,IAAI;IAQ5B,OAAO,CAAC,iBAAiB,EAAE,cAAc,CAAC,IAAI,CAAC,GAAG,IAAI;IAoB/D;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,kBAAkB;IAc1B;;;;;;;;OAQG;IACH,OAAO,CAAC,sBAAsB;IAqG9B,gBAAgB;IAChB,OAAO,CAAC,wBAAwB;IAKhC,gBAAgB;IAChB,OAAO,CAAC,SAAS;IA2BjB;;;;;;;;;;;;;;;;;;;OAmBG;IACH,OAAO,CAAC,WAAW;IAWnB,gBAAgB;IAChB,OAAO,CAAC,YAAY,CAWlB;IAEF,gBAAgB;IAChB,OAAO,CAAC,cAAc,CAyCpB;IAEF,gBAAgB;IAChB,OAAO,CAAC,kBAAkB;IAmB1B,gBAAgB;IAChB,OAAO,CAAC,kBAAkB;IAmB1B,gBAAgB;IAChB,OAAO,CAAC,cAAc;IActB,gBAAgB;IAChB,OAAO,CAAC,QAAQ;IAWP,MAAM;CA8EhB;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,cAAc,EAAE,aAAa,CAAC;KAC/B;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"hx-menu-item.styles.d.ts","sourceRoot":"","sources":["../../../src/components/hx-menu/hx-menu-item.styles.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,mBAAmB,yBA8H/B,CAAC"}
1
+ {"version":3,"file":"hx-menu-item.styles.d.ts","sourceRoot":"","sources":["../../../src/components/hx-menu/hx-menu-item.styles.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,mBAAmB,yBAsJ/B,CAAC"}