@helixui/library 0.3.4 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (406) hide show
  1. package/custom-elements.json +13562 -12579
  2. package/dist/components/hx-accordion/hx-accordion-item.d.ts +2 -0
  3. package/dist/components/hx-accordion/hx-accordion-item.d.ts.map +1 -1
  4. package/dist/components/hx-accordion/hx-accordion.d.ts +8 -0
  5. package/dist/components/hx-accordion/hx-accordion.d.ts.map +1 -1
  6. package/dist/components/hx-accordion/index.js +1 -1
  7. package/dist/components/hx-action-bar/hx-action-bar.d.ts.map +1 -1
  8. package/dist/components/hx-action-bar/index.js +1 -1
  9. package/dist/components/hx-alert/hx-alert.d.ts +2 -5
  10. package/dist/components/hx-alert/hx-alert.d.ts.map +1 -1
  11. package/dist/components/hx-alert/index.js +1 -1
  12. package/dist/components/hx-avatar/hx-avatar.d.ts.map +1 -1
  13. package/dist/components/hx-avatar/index.js +1 -1
  14. package/dist/components/hx-banner/hx-banner.d.ts +99 -0
  15. package/dist/components/hx-banner/hx-banner.d.ts.map +1 -0
  16. package/dist/components/hx-banner/hx-banner.styles.d.ts +2 -0
  17. package/dist/components/hx-banner/hx-banner.styles.d.ts.map +1 -0
  18. package/dist/components/hx-banner/index.d.ts +3 -0
  19. package/dist/components/hx-banner/index.d.ts.map +1 -0
  20. package/dist/components/hx-banner/index.js +5 -0
  21. package/dist/components/hx-banner/index.js.map +1 -0
  22. package/dist/components/hx-breadcrumb/hx-breadcrumb.d.ts +5 -0
  23. package/dist/components/hx-breadcrumb/hx-breadcrumb.d.ts.map +1 -1
  24. package/dist/components/hx-breadcrumb/index.js +1 -1
  25. package/dist/components/hx-button/hx-button.d.ts +17 -0
  26. package/dist/components/hx-button/hx-button.d.ts.map +1 -1
  27. package/dist/components/hx-button/hx-button.styles.d.ts.map +1 -1
  28. package/dist/components/hx-button/index.js +1 -1
  29. package/dist/components/hx-button-group/hx-button-group.d.ts +8 -0
  30. package/dist/components/hx-button-group/hx-button-group.d.ts.map +1 -1
  31. package/dist/components/hx-button-group/index.js +1 -1
  32. package/dist/components/hx-card/hx-card.d.ts +16 -0
  33. package/dist/components/hx-card/hx-card.d.ts.map +1 -1
  34. package/dist/components/hx-card/hx-card.styles.d.ts.map +1 -1
  35. package/dist/components/hx-card/index.js +1 -1
  36. package/dist/components/hx-carousel/hx-carousel.d.ts +122 -0
  37. package/dist/components/hx-carousel/hx-carousel.d.ts.map +1 -1
  38. package/dist/components/hx-carousel/index.js +1 -1
  39. package/dist/components/hx-checkbox/hx-checkbox.d.ts +3 -1
  40. package/dist/components/hx-checkbox/hx-checkbox.d.ts.map +1 -1
  41. package/dist/components/hx-checkbox-group/hx-checkbox-group.d.ts +5 -1
  42. package/dist/components/hx-checkbox-group/hx-checkbox-group.d.ts.map +1 -1
  43. package/dist/components/hx-checkbox-group/index.js +1 -1
  44. package/dist/components/hx-code-snippet/hx-code-snippet.d.ts +21 -6
  45. package/dist/components/hx-code-snippet/hx-code-snippet.d.ts.map +1 -1
  46. package/dist/components/hx-code-snippet/index.js +1 -1
  47. package/dist/components/hx-color-picker/hx-color-picker.d.ts +13 -0
  48. package/dist/components/hx-color-picker/hx-color-picker.d.ts.map +1 -1
  49. package/dist/components/hx-color-picker/hx-color-picker.styles.d.ts.map +1 -1
  50. package/dist/components/hx-color-picker/index.js +1 -1
  51. package/dist/components/hx-combobox/hx-combobox.d.ts +24 -0
  52. package/dist/components/hx-combobox/hx-combobox.d.ts.map +1 -1
  53. package/dist/components/hx-combobox/hx-combobox.styles.d.ts.map +1 -1
  54. package/dist/components/hx-combobox/index.js +1 -1
  55. package/dist/components/hx-container/hx-container.d.ts +3 -1
  56. package/dist/components/hx-container/hx-container.d.ts.map +1 -1
  57. package/dist/components/hx-copy-button/hx-copy-button.d.ts +6 -0
  58. package/dist/components/hx-copy-button/hx-copy-button.d.ts.map +1 -1
  59. package/dist/components/hx-copy-button/index.js +1 -1
  60. package/dist/components/hx-counter/hx-counter.d.ts +79 -0
  61. package/dist/components/hx-counter/hx-counter.d.ts.map +1 -0
  62. package/dist/components/hx-counter/hx-counter.styles.d.ts +2 -0
  63. package/dist/components/hx-counter/hx-counter.styles.d.ts.map +1 -0
  64. package/dist/components/hx-counter/index.d.ts +3 -0
  65. package/dist/components/hx-counter/index.d.ts.map +1 -0
  66. package/dist/components/hx-counter/index.js +5 -0
  67. package/dist/components/hx-counter/index.js.map +1 -0
  68. package/dist/components/hx-data-table/hx-data-table.d.ts +6 -0
  69. package/dist/components/hx-data-table/hx-data-table.d.ts.map +1 -1
  70. package/dist/components/hx-data-table/hx-data-table.styles.d.ts.map +1 -1
  71. package/dist/components/hx-data-table/index.js +1 -1
  72. package/dist/components/hx-date-picker/hx-date-picker.d.ts +124 -0
  73. package/dist/components/hx-date-picker/hx-date-picker.d.ts.map +1 -1
  74. package/dist/components/hx-date-picker/index.js +1 -1
  75. package/dist/components/hx-dialog/hx-dialog.d.ts.map +1 -1
  76. package/dist/components/hx-dialog/index.js +1 -1
  77. package/dist/components/hx-divider/hx-divider.d.ts +3 -0
  78. package/dist/components/hx-divider/hx-divider.d.ts.map +1 -1
  79. package/dist/components/hx-drawer/hx-drawer.d.ts +54 -1
  80. package/dist/components/hx-drawer/hx-drawer.d.ts.map +1 -1
  81. package/dist/components/hx-drawer/index.js +1 -1
  82. package/dist/components/hx-dropdown/hx-dropdown.d.ts +5 -0
  83. package/dist/components/hx-dropdown/hx-dropdown.d.ts.map +1 -1
  84. package/dist/components/hx-field/hx-field.d.ts +31 -1
  85. package/dist/components/hx-field/hx-field.d.ts.map +1 -1
  86. package/dist/components/hx-field/index.js +1 -1
  87. package/dist/components/hx-file-upload/hx-file-upload.d.ts +12 -0
  88. package/dist/components/hx-file-upload/hx-file-upload.d.ts.map +1 -1
  89. package/dist/components/hx-file-upload/index.js +1 -1
  90. package/dist/components/hx-form/hx-form.d.ts +24 -0
  91. package/dist/components/hx-form/hx-form.d.ts.map +1 -1
  92. package/dist/components/hx-form/index.js +1 -1
  93. package/dist/components/hx-help-text/hx-help-text.d.ts +3 -0
  94. package/dist/components/hx-help-text/hx-help-text.d.ts.map +1 -1
  95. package/dist/components/hx-icon-button/hx-icon-button.d.ts.map +1 -1
  96. package/dist/components/hx-icon-button/index.js +1 -1
  97. package/dist/components/hx-list/hx-list.d.ts.map +1 -1
  98. package/dist/components/hx-list/index.js +1 -1
  99. package/dist/components/hx-menu/hx-menu.d.ts +12 -0
  100. package/dist/components/hx-menu/hx-menu.d.ts.map +1 -1
  101. package/dist/components/hx-menu/index.js +1 -1
  102. package/dist/components/hx-meter/hx-meter.d.ts +2 -0
  103. package/dist/components/hx-meter/hx-meter.d.ts.map +1 -1
  104. package/dist/components/hx-meter/index.js +1 -1
  105. package/dist/components/hx-nav/hx-nav.d.ts +15 -1
  106. package/dist/components/hx-nav/hx-nav.d.ts.map +1 -1
  107. package/dist/components/hx-nav/index.js +1 -1
  108. package/dist/components/hx-number-input/hx-number-input.d.ts +2 -0
  109. package/dist/components/hx-number-input/hx-number-input.d.ts.map +1 -1
  110. package/dist/components/hx-number-input/index.js +1 -1
  111. package/dist/components/hx-overflow-menu/hx-overflow-menu.d.ts +14 -0
  112. package/dist/components/hx-overflow-menu/hx-overflow-menu.d.ts.map +1 -1
  113. package/dist/components/hx-overflow-menu/index.js +1 -1
  114. package/dist/components/hx-pagination/hx-pagination.d.ts +5 -0
  115. package/dist/components/hx-pagination/hx-pagination.d.ts.map +1 -1
  116. package/dist/components/hx-pagination/index.js +1 -1
  117. package/dist/components/hx-popover/hx-popover.d.ts +10 -38
  118. package/dist/components/hx-popover/hx-popover.d.ts.map +1 -1
  119. package/dist/components/hx-popover/index.js +1 -1
  120. package/dist/components/hx-progress-bar/hx-progress-bar.d.ts +10 -0
  121. package/dist/components/hx-progress-bar/hx-progress-bar.d.ts.map +1 -1
  122. package/dist/components/hx-progress-bar/index.js +1 -1
  123. package/dist/components/hx-progress-ring/hx-progress-ring.d.ts.map +1 -1
  124. package/dist/components/hx-progress-ring/index.js +1 -1
  125. package/dist/components/hx-radio-group/hx-radio-group.d.ts +75 -3
  126. package/dist/components/hx-radio-group/hx-radio-group.d.ts.map +1 -1
  127. package/dist/components/hx-radio-group/hx-radio.d.ts +3 -1
  128. package/dist/components/hx-radio-group/hx-radio.d.ts.map +1 -1
  129. package/dist/components/hx-radio-group/index.js +1 -1
  130. package/dist/components/hx-rating/hx-rating.d.ts +18 -3
  131. package/dist/components/hx-rating/hx-rating.d.ts.map +1 -1
  132. package/dist/components/hx-rating/index.js +1 -1
  133. package/dist/components/hx-select/hx-select.d.ts +9 -0
  134. package/dist/components/hx-select/hx-select.d.ts.map +1 -1
  135. package/dist/components/hx-select/index.js +1 -1
  136. package/dist/components/hx-side-nav/hx-side-nav.d.ts.map +1 -1
  137. package/dist/components/hx-side-nav/index.js +1 -1
  138. package/dist/components/hx-slider/hx-slider.d.ts +2 -0
  139. package/dist/components/hx-slider/hx-slider.d.ts.map +1 -1
  140. package/dist/components/hx-slider/index.js +1 -1
  141. package/dist/components/hx-split-button/hx-split-button.d.ts +16 -0
  142. package/dist/components/hx-split-button/hx-split-button.d.ts.map +1 -1
  143. package/dist/components/hx-split-button/index.js +1 -1
  144. package/dist/components/hx-split-panel/hx-split-panel.d.ts +11 -0
  145. package/dist/components/hx-split-panel/hx-split-panel.d.ts.map +1 -1
  146. package/dist/components/hx-stat/hx-stat.d.ts +71 -0
  147. package/dist/components/hx-stat/hx-stat.d.ts.map +1 -0
  148. package/dist/components/hx-stat/hx-stat.styles.d.ts +2 -0
  149. package/dist/components/hx-stat/hx-stat.styles.d.ts.map +1 -0
  150. package/dist/components/hx-stat/index.d.ts +3 -0
  151. package/dist/components/hx-stat/index.d.ts.map +1 -0
  152. package/dist/components/hx-stat/index.js +5 -0
  153. package/dist/components/hx-stat/index.js.map +1 -0
  154. package/dist/components/hx-steps/hx-steps.d.ts +5 -0
  155. package/dist/components/hx-steps/hx-steps.d.ts.map +1 -1
  156. package/dist/components/hx-steps/index.js +1 -1
  157. package/dist/components/hx-structured-list/hx-structured-list.d.ts +2 -0
  158. package/dist/components/hx-structured-list/hx-structured-list.d.ts.map +1 -1
  159. package/dist/components/hx-structured-list/index.js +1 -1
  160. package/dist/components/hx-switch/hx-switch.d.ts +2 -0
  161. package/dist/components/hx-switch/hx-switch.d.ts.map +1 -1
  162. package/dist/components/hx-switch/index.js +1 -1
  163. package/dist/components/hx-table/hx-table.d.ts +60 -0
  164. package/dist/components/hx-table/hx-table.d.ts.map +1 -0
  165. package/dist/components/hx-table/hx-table.styles.d.ts +9 -0
  166. package/dist/components/hx-table/hx-table.styles.d.ts.map +1 -0
  167. package/dist/components/hx-table/hx-tbody.d.ts +23 -0
  168. package/dist/components/hx-table/hx-tbody.d.ts.map +1 -0
  169. package/dist/components/hx-table/hx-td.d.ts +46 -0
  170. package/dist/components/hx-table/hx-td.d.ts.map +1 -0
  171. package/dist/components/hx-table/hx-tfoot.d.ts +23 -0
  172. package/dist/components/hx-table/hx-tfoot.d.ts.map +1 -0
  173. package/dist/components/hx-table/hx-th.d.ts +61 -0
  174. package/dist/components/hx-table/hx-th.d.ts.map +1 -0
  175. package/dist/components/hx-table/hx-thead.d.ts +23 -0
  176. package/dist/components/hx-table/hx-thead.d.ts.map +1 -0
  177. package/dist/components/hx-table/hx-tr.d.ts +33 -0
  178. package/dist/components/hx-table/hx-tr.d.ts.map +1 -0
  179. package/dist/components/hx-table/index.d.ts +9 -0
  180. package/dist/components/hx-table/index.d.ts.map +1 -0
  181. package/dist/components/hx-table/index.js +11 -0
  182. package/dist/components/hx-table/index.js.map +1 -0
  183. package/dist/components/hx-tabs/hx-tabs.d.ts.map +1 -1
  184. package/dist/components/hx-tabs/index.js +1 -1
  185. package/dist/components/hx-text-input/hx-text-input.d.ts +1 -0
  186. package/dist/components/hx-text-input/hx-text-input.d.ts.map +1 -1
  187. package/dist/components/hx-text-input/index.js +1 -1
  188. package/dist/components/hx-textarea/hx-textarea.d.ts +14 -0
  189. package/dist/components/hx-textarea/hx-textarea.d.ts.map +1 -1
  190. package/dist/components/hx-textarea/hx-textarea.styles.d.ts.map +1 -1
  191. package/dist/components/hx-textarea/index.js +1 -1
  192. package/dist/components/hx-time-picker/hx-time-picker.d.ts +22 -1
  193. package/dist/components/hx-time-picker/hx-time-picker.d.ts.map +1 -1
  194. package/dist/components/hx-time-picker/index.js +1 -1
  195. package/dist/components/hx-toast/hx-toast-stack.d.ts +36 -0
  196. package/dist/components/hx-toast/hx-toast-stack.d.ts.map +1 -0
  197. package/dist/components/hx-toast/hx-toast.d.ts +0 -52
  198. package/dist/components/hx-toast/hx-toast.d.ts.map +1 -1
  199. package/dist/components/hx-toast/index.d.ts +6 -2
  200. package/dist/components/hx-toast/index.d.ts.map +1 -1
  201. package/dist/components/hx-toast/index.js +1 -1
  202. package/dist/components/hx-toast/toast-factory.d.ts +25 -0
  203. package/dist/components/hx-toast/toast-factory.d.ts.map +1 -0
  204. package/dist/components/hx-toggle-button/hx-toggle-button.d.ts +1 -0
  205. package/dist/components/hx-toggle-button/hx-toggle-button.d.ts.map +1 -1
  206. package/dist/components/hx-toggle-button/index.js +1 -1
  207. package/dist/components/hx-tooltip/hx-tooltip.d.ts +1 -45
  208. package/dist/components/hx-tooltip/hx-tooltip.d.ts.map +1 -1
  209. package/dist/components/hx-tooltip/index.js +1 -1
  210. package/dist/components/hx-top-nav/hx-top-nav.d.ts.map +1 -1
  211. package/dist/components/hx-top-nav/index.js +1 -1
  212. package/dist/components/hx-tree-view/hx-tree-item.d.ts +50 -0
  213. package/dist/components/hx-tree-view/hx-tree-item.d.ts.map +1 -1
  214. package/dist/components/hx-tree-view/hx-tree-view.d.ts +15 -0
  215. package/dist/components/hx-tree-view/hx-tree-view.d.ts.map +1 -1
  216. package/dist/components/hx-tree-view/index.js +1 -1
  217. package/dist/index.d.ts +20 -2
  218. package/dist/index.d.ts.map +1 -1
  219. package/dist/index.js +168 -154
  220. package/dist/index.js.map +1 -1
  221. package/dist/shared/body-scroll-lock-VBa5TFP-.js +12 -0
  222. package/dist/shared/body-scroll-lock-VBa5TFP-.js.map +1 -0
  223. package/dist/shared/dev-warn-YlwPHjtX.js +6 -0
  224. package/dist/shared/dev-warn-YlwPHjtX.js.map +1 -0
  225. package/dist/shared/{hx-accordion-D95XSAft.js → hx-accordion-Cyswa6J3.js} +46 -43
  226. package/dist/shared/hx-accordion-Cyswa6J3.js.map +1 -0
  227. package/dist/shared/{hx-action-bar-B4i9tBCP.js → hx-action-bar-we_WJety.js} +41 -40
  228. package/dist/shared/hx-action-bar-we_WJety.js.map +1 -0
  229. package/dist/shared/{hx-alert-BQpT4gL3.js → hx-alert-Cg-zxRiU.js} +2 -2
  230. package/dist/shared/hx-alert-Cg-zxRiU.js.map +1 -0
  231. package/dist/shared/{hx-avatar-yHjmNdtf.js → hx-avatar-Cep6Urm3.js} +62 -65
  232. package/dist/shared/hx-avatar-Cep6Urm3.js.map +1 -0
  233. package/dist/shared/hx-banner-lxAIJ2kR.js +349 -0
  234. package/dist/shared/hx-banner-lxAIJ2kR.js.map +1 -0
  235. package/dist/shared/{hx-breadcrumb-item-DtSxRZ_W.js → hx-breadcrumb-item-C0rz0fzV.js} +46 -44
  236. package/dist/shared/hx-breadcrumb-item-C0rz0fzV.js.map +1 -0
  237. package/dist/shared/{hx-button-CtiJsmOg.js → hx-button-Cbhqpm5i.js} +111 -28
  238. package/dist/shared/hx-button-Cbhqpm5i.js.map +1 -0
  239. package/dist/shared/{hx-button-group-BMV5qFs4.js → hx-button-group-CWjWv-wS.js} +10 -10
  240. package/dist/shared/hx-button-group-CWjWv-wS.js.map +1 -0
  241. package/dist/shared/{hx-card-DAkEfpJd.js → hx-card-Bg4W4uXC.js} +16 -16
  242. package/dist/shared/hx-card-Bg4W4uXC.js.map +1 -0
  243. package/dist/shared/{hx-carousel-item-C2yBnM0r.js → hx-carousel-item-BKpmFbUT.js} +101 -63
  244. package/dist/shared/hx-carousel-item-BKpmFbUT.js.map +1 -0
  245. package/dist/shared/hx-checkbox-BMayOpAM.js.map +1 -1
  246. package/dist/shared/{hx-checkbox-group-DTS9iT4b.js → hx-checkbox-group-ydUdV9Sx.js} +7 -7
  247. package/dist/shared/hx-checkbox-group-ydUdV9Sx.js.map +1 -0
  248. package/dist/shared/{hx-code-snippet-DdEqy-1B.js → hx-code-snippet-B4hV7rWG.js} +65 -53
  249. package/dist/shared/hx-code-snippet-B4hV7rWG.js.map +1 -0
  250. package/dist/shared/{hx-color-picker-K2x_dyeG.js → hx-color-picker-BvfJ_h16.js} +100 -90
  251. package/dist/shared/hx-color-picker-BvfJ_h16.js.map +1 -0
  252. package/dist/shared/{hx-combobox-DjMigccw.js → hx-combobox-BBi3izKJ.js} +80 -44
  253. package/dist/shared/hx-combobox-BBi3izKJ.js.map +1 -0
  254. package/dist/shared/hx-container-DLUKnTi9.js.map +1 -1
  255. package/dist/shared/{hx-copy-button-BXL1xkxb.js → hx-copy-button-CLBA31to.js} +45 -50
  256. package/dist/shared/hx-copy-button-CLBA31to.js.map +1 -0
  257. package/dist/shared/hx-counter-D-1NXzGs.js +138 -0
  258. package/dist/shared/hx-counter-D-1NXzGs.js.map +1 -0
  259. package/dist/shared/{hx-data-table-D3NZvc3P.js → hx-data-table-DNiDVWR2.js} +100 -95
  260. package/dist/shared/hx-data-table-DNiDVWR2.js.map +1 -0
  261. package/dist/shared/{hx-date-picker-CIHwx9b3.js → hx-date-picker-D7yCK0nk.js} +17 -12
  262. package/dist/shared/hx-date-picker-D7yCK0nk.js.map +1 -0
  263. package/dist/shared/{hx-dialog-e4CSD8xX.js → hx-dialog-Z7Ou_AZ9.js} +37 -36
  264. package/dist/shared/hx-dialog-Z7Ou_AZ9.js.map +1 -0
  265. package/dist/shared/hx-divider-XgWIz4Mr.js.map +1 -1
  266. package/dist/shared/{hx-drawer-bTF0nbrg.js → hx-drawer-Dk-_xzy0.js} +59 -58
  267. package/dist/shared/hx-drawer-Dk-_xzy0.js.map +1 -0
  268. package/dist/shared/hx-dropdown-DnjLnkTj.js.map +1 -1
  269. package/dist/shared/{hx-field-Dz-7M_SC.js → hx-field-CDP8EXuj.js} +22 -19
  270. package/dist/shared/hx-field-CDP8EXuj.js.map +1 -0
  271. package/dist/shared/{hx-file-upload-DnYiIhyN.js → hx-file-upload-CUORgnKc.js} +17 -14
  272. package/dist/shared/hx-file-upload-CUORgnKc.js.map +1 -0
  273. package/dist/shared/{hx-form-BJeLK34m.js → hx-form-BFv_N1dm.js} +9 -1
  274. package/dist/shared/{hx-form-BJeLK34m.js.map → hx-form-BFv_N1dm.js.map} +1 -1
  275. package/dist/shared/hx-help-text-DaOPN1iB.js.map +1 -1
  276. package/dist/shared/{hx-icon-button-C_fsUJW4.js → hx-icon-button-C83bCR0K.js} +2 -4
  277. package/dist/shared/hx-icon-button-C83bCR0K.js.map +1 -0
  278. package/dist/shared/{hx-list-CF-AAnp-.js → hx-list-CdRNgeoP.js} +7 -9
  279. package/dist/shared/{hx-list-CF-AAnp-.js.map → hx-list-CdRNgeoP.js.map} +1 -1
  280. package/dist/shared/{hx-menu-divider-Buc5XA9E.js → hx-menu-divider-11Dp2VfM.js} +50 -48
  281. package/dist/shared/hx-menu-divider-11Dp2VfM.js.map +1 -0
  282. package/dist/shared/{hx-meter-qcXl0zCL.js → hx-meter-UinDQjl6.js} +43 -37
  283. package/dist/shared/hx-meter-UinDQjl6.js.map +1 -0
  284. package/dist/shared/{hx-nav-CWwByFdq.js → hx-nav-DSpwWYUX.js} +81 -81
  285. package/dist/shared/hx-nav-DSpwWYUX.js.map +1 -0
  286. package/dist/shared/{hx-nav-item-DItaMWl0.js → hx-nav-item-D54-5eUM.js} +12 -12
  287. package/dist/shared/hx-nav-item-D54-5eUM.js.map +1 -0
  288. package/dist/shared/{hx-number-input-CS6_w1lT.js → hx-number-input-BP6TIA92.js} +5 -1
  289. package/dist/shared/hx-number-input-BP6TIA92.js.map +1 -0
  290. package/dist/shared/{hx-overflow-menu-CAS1Mlus.js → hx-overflow-menu-C7k5wlZy.js} +39 -34
  291. package/dist/shared/hx-overflow-menu-C7k5wlZy.js.map +1 -0
  292. package/dist/shared/{hx-pagination-DNFgXQm3.js → hx-pagination-BQ0cLTuB.js} +65 -62
  293. package/dist/shared/hx-pagination-BQ0cLTuB.js.map +1 -0
  294. package/dist/shared/{hx-popover-BjAyLbzp.js → hx-popover-BQsgrJCW.js} +7 -7
  295. package/dist/shared/hx-popover-BQsgrJCW.js.map +1 -0
  296. package/dist/shared/{hx-progress-bar-b3_m1hna.js → hx-progress-bar-C_mdPVF-.js} +61 -52
  297. package/dist/shared/hx-progress-bar-C_mdPVF-.js.map +1 -0
  298. package/dist/shared/{hx-progress-ring-wOSv2y_I.js → hx-progress-ring-BHJBaXNk.js} +2 -4
  299. package/dist/shared/hx-progress-ring-BHJBaXNk.js.map +1 -0
  300. package/dist/shared/{hx-radio-CGtFKls2.js → hx-radio-Bqyi8re3.js} +44 -12
  301. package/dist/shared/hx-radio-Bqyi8re3.js.map +1 -0
  302. package/dist/shared/{hx-rating-C4kTOyHF.js → hx-rating-Y_t7Z4qb.js} +104 -67
  303. package/dist/shared/hx-rating-Y_t7Z4qb.js.map +1 -0
  304. package/dist/shared/{hx-select-D9bYJcDv.js → hx-select-BBae2LqN.js} +16 -10
  305. package/dist/shared/hx-select-BBae2LqN.js.map +1 -0
  306. package/dist/shared/{hx-slider-Duzmuid9.js → hx-slider-CpnxH2UP.js} +9 -5
  307. package/dist/shared/{hx-slider-Duzmuid9.js.map → hx-slider-CpnxH2UP.js.map} +1 -1
  308. package/dist/shared/{hx-split-button-DhncgAtZ.js → hx-split-button-BvwoG8h2.js} +14 -13
  309. package/dist/shared/hx-split-button-BvwoG8h2.js.map +1 -0
  310. package/dist/shared/hx-split-panel-Cxkeauwe.js.map +1 -1
  311. package/dist/shared/hx-stat-C2wfph8W.js +212 -0
  312. package/dist/shared/hx-stat-C2wfph8W.js.map +1 -0
  313. package/dist/shared/{hx-step-nMT0fHEn.js → hx-step-DYoIumpR.js} +29 -29
  314. package/dist/shared/hx-step-DYoIumpR.js.map +1 -0
  315. package/dist/shared/{hx-structured-list-CMja1VXz.js → hx-structured-list-CMWllxGg.js} +23 -17
  316. package/dist/shared/{hx-structured-list-CMja1VXz.js.map → hx-structured-list-CMWllxGg.js.map} +1 -1
  317. package/dist/shared/{hx-switch-BPvIcDpM.js → hx-switch-DkKchcuP.js} +8 -3
  318. package/dist/shared/{hx-switch-BPvIcDpM.js.map → hx-switch-DkKchcuP.js.map} +1 -1
  319. package/dist/shared/{hx-tab-panel-C7h5lRpw.js → hx-tab-panel-CHB0u1zF.js} +91 -85
  320. package/dist/shared/hx-tab-panel-CHB0u1zF.js.map +1 -0
  321. package/dist/shared/hx-td-CVwCGBYf.js +604 -0
  322. package/dist/shared/hx-td-CVwCGBYf.js.map +1 -0
  323. package/dist/shared/{hx-text-input-BUMgOQHX.js → hx-text-input-BrCjo4fJ.js} +5 -1
  324. package/dist/shared/hx-text-input-BrCjo4fJ.js.map +1 -0
  325. package/dist/shared/{hx-textarea-B_nmxzhC.js → hx-textarea-BsQdB1Rk.js} +51 -18
  326. package/dist/shared/hx-textarea-BsQdB1Rk.js.map +1 -0
  327. package/dist/shared/{hx-time-picker-a-BCkecJ.js → hx-time-picker-DRRAFuVd.js} +62 -54
  328. package/dist/shared/hx-time-picker-DRRAFuVd.js.map +1 -0
  329. package/dist/shared/{hx-toggle-button--xCXWRJW.js → hx-toggle-button-D4F1soEM.js} +34 -22
  330. package/dist/shared/{hx-toggle-button--xCXWRJW.js.map → hx-toggle-button-D4F1soEM.js.map} +1 -1
  331. package/dist/shared/{hx-tooltip-DN6lMlP5.js → hx-tooltip-Bk1iQRHs.js} +23 -23
  332. package/dist/shared/hx-tooltip-Bk1iQRHs.js.map +1 -0
  333. package/dist/shared/{hx-top-nav-8lDKNZUj.js → hx-top-nav-DzW7XLv-.js} +42 -29
  334. package/dist/shared/{hx-top-nav-8lDKNZUj.js.map → hx-top-nav-DzW7XLv-.js.map} +1 -1
  335. package/dist/shared/{hx-tree-item-Cesh_du5.js → hx-tree-item-DdH6RbMs.js} +170 -111
  336. package/dist/shared/hx-tree-item-DdH6RbMs.js.map +1 -0
  337. package/dist/shared/{hx-toast-ikwh9Y03.js → toast-factory-B8jicczW.js} +69 -66
  338. package/dist/shared/toast-factory-B8jicczW.js.map +1 -0
  339. package/dist/tools/cem-a11y-analyzer/analyzers/aria-analyzer.d.ts +12 -0
  340. package/dist/tools/cem-a11y-analyzer/analyzers/aria-analyzer.d.ts.map +1 -0
  341. package/dist/tools/cem-a11y-analyzer/analyzers/focus-analyzer.d.ts +13 -0
  342. package/dist/tools/cem-a11y-analyzer/analyzers/focus-analyzer.d.ts.map +1 -0
  343. package/dist/tools/cem-a11y-analyzer/analyzers/form-analyzer.d.ts +13 -0
  344. package/dist/tools/cem-a11y-analyzer/analyzers/form-analyzer.d.ts.map +1 -0
  345. package/dist/tools/cem-a11y-analyzer/analyzers/keyboard-analyzer.d.ts +12 -0
  346. package/dist/tools/cem-a11y-analyzer/analyzers/keyboard-analyzer.d.ts.map +1 -0
  347. package/dist/tools/cem-a11y-analyzer/analyzers/label-analyzer.d.ts +13 -0
  348. package/dist/tools/cem-a11y-analyzer/analyzers/label-analyzer.d.ts.map +1 -0
  349. package/dist/tools/cem-a11y-analyzer/analyzers/motion-analyzer.d.ts +12 -0
  350. package/dist/tools/cem-a11y-analyzer/analyzers/motion-analyzer.d.ts.map +1 -0
  351. package/dist/tools/cem-a11y-analyzer/index.d.ts +14 -0
  352. package/dist/tools/cem-a11y-analyzer/index.d.ts.map +1 -0
  353. package/dist/tools/cem-a11y-analyzer/reporter.d.ts +6 -0
  354. package/dist/tools/cem-a11y-analyzer/reporter.d.ts.map +1 -0
  355. package/dist/tools/cem-a11y-analyzer/scorer.d.ts +22 -0
  356. package/dist/tools/cem-a11y-analyzer/scorer.d.ts.map +1 -0
  357. package/dist/tools/cem-a11y-analyzer/types.d.ts +171 -0
  358. package/dist/tools/cem-a11y-analyzer/types.d.ts.map +1 -0
  359. package/dist/utils/body-scroll-lock.d.ts +34 -0
  360. package/dist/utils/body-scroll-lock.d.ts.map +1 -0
  361. package/dist/utils/dev-warn.d.ts +19 -0
  362. package/dist/utils/dev-warn.d.ts.map +1 -0
  363. package/package.json +1 -1
  364. package/dist/shared/hx-accordion-D95XSAft.js.map +0 -1
  365. package/dist/shared/hx-action-bar-B4i9tBCP.js.map +0 -1
  366. package/dist/shared/hx-alert-BQpT4gL3.js.map +0 -1
  367. package/dist/shared/hx-avatar-yHjmNdtf.js.map +0 -1
  368. package/dist/shared/hx-breadcrumb-item-DtSxRZ_W.js.map +0 -1
  369. package/dist/shared/hx-button-CtiJsmOg.js.map +0 -1
  370. package/dist/shared/hx-button-group-BMV5qFs4.js.map +0 -1
  371. package/dist/shared/hx-card-DAkEfpJd.js.map +0 -1
  372. package/dist/shared/hx-carousel-item-C2yBnM0r.js.map +0 -1
  373. package/dist/shared/hx-checkbox-group-DTS9iT4b.js.map +0 -1
  374. package/dist/shared/hx-code-snippet-DdEqy-1B.js.map +0 -1
  375. package/dist/shared/hx-color-picker-K2x_dyeG.js.map +0 -1
  376. package/dist/shared/hx-combobox-DjMigccw.js.map +0 -1
  377. package/dist/shared/hx-copy-button-BXL1xkxb.js.map +0 -1
  378. package/dist/shared/hx-data-table-D3NZvc3P.js.map +0 -1
  379. package/dist/shared/hx-date-picker-CIHwx9b3.js.map +0 -1
  380. package/dist/shared/hx-dialog-e4CSD8xX.js.map +0 -1
  381. package/dist/shared/hx-drawer-bTF0nbrg.js.map +0 -1
  382. package/dist/shared/hx-field-Dz-7M_SC.js.map +0 -1
  383. package/dist/shared/hx-file-upload-DnYiIhyN.js.map +0 -1
  384. package/dist/shared/hx-icon-button-C_fsUJW4.js.map +0 -1
  385. package/dist/shared/hx-menu-divider-Buc5XA9E.js.map +0 -1
  386. package/dist/shared/hx-meter-qcXl0zCL.js.map +0 -1
  387. package/dist/shared/hx-nav-CWwByFdq.js.map +0 -1
  388. package/dist/shared/hx-nav-item-DItaMWl0.js.map +0 -1
  389. package/dist/shared/hx-number-input-CS6_w1lT.js.map +0 -1
  390. package/dist/shared/hx-overflow-menu-CAS1Mlus.js.map +0 -1
  391. package/dist/shared/hx-pagination-DNFgXQm3.js.map +0 -1
  392. package/dist/shared/hx-popover-BjAyLbzp.js.map +0 -1
  393. package/dist/shared/hx-progress-bar-b3_m1hna.js.map +0 -1
  394. package/dist/shared/hx-progress-ring-wOSv2y_I.js.map +0 -1
  395. package/dist/shared/hx-radio-CGtFKls2.js.map +0 -1
  396. package/dist/shared/hx-rating-C4kTOyHF.js.map +0 -1
  397. package/dist/shared/hx-select-D9bYJcDv.js.map +0 -1
  398. package/dist/shared/hx-split-button-DhncgAtZ.js.map +0 -1
  399. package/dist/shared/hx-step-nMT0fHEn.js.map +0 -1
  400. package/dist/shared/hx-tab-panel-C7h5lRpw.js.map +0 -1
  401. package/dist/shared/hx-text-input-BUMgOQHX.js.map +0 -1
  402. package/dist/shared/hx-textarea-B_nmxzhC.js.map +0 -1
  403. package/dist/shared/hx-time-picker-a-BCkecJ.js.map +0 -1
  404. package/dist/shared/hx-toast-ikwh9Y03.js.map +0 -1
  405. package/dist/shared/hx-tooltip-DN6lMlP5.js.map +0 -1
  406. package/dist/shared/hx-tree-item-Cesh_du5.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"hx-top-nav-8lDKNZUj.js","sources":["../../src/components/hx-top-nav/hx-top-nav.styles.ts","../../src/components/hx-top-nav/hx-top-nav.ts"],"sourcesContent":["import { css } from 'lit';\n\nexport const helixTopNavStyles = css`\n /* ─── Host ─── */\n\n :host {\n display: block;\n }\n\n /* ─── Header wrapper (landmark) ─── */\n\n header {\n display: block;\n margin: 0;\n padding: 0;\n }\n\n /* ─── Sticky mode ─── */\n\n :host([sticky]) .nav {\n position: sticky;\n top: 0;\n /* Fallback 1000 is appropriate for sticky navbars (below modals ~1300, above content) */\n z-index: var(--hx-top-nav-z-index, var(--hx-z-index-sticky, 1000));\n }\n\n /* ─── Nav container ─── */\n\n .nav {\n background-color: var(--hx-top-nav-bg, var(--hx-color-neutral-0, #ffffff));\n color: var(--hx-top-nav-color, var(--hx-color-neutral-800, #212529));\n border-bottom: var(--hx-border-width-thin, 1px) solid\n var(--hx-top-nav-border-color, var(--hx-color-neutral-200, #dee2e6));\n font-family: var(--hx-font-family-sans, sans-serif);\n }\n\n /* ─── Bar row (always visible) ─── */\n\n .nav__bar {\n display: flex;\n align-items: center;\n min-height: var(--hx-top-nav-height, var(--hx-space-16, 4rem));\n padding-inline: var(--hx-top-nav-padding-x, var(--hx-space-6, 1.5rem));\n gap: var(--hx-space-4, 1rem);\n }\n\n /* ─── Logo ─── */\n\n .nav__logo {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n }\n\n /* ─── Mobile toggle (hamburger) ─── */\n\n .mobile-toggle {\n display: flex;\n align-items: center;\n justify-content: center;\n margin-inline-start: auto;\n /* var(--hx-space-3, 0.75rem) padding + 24px icon = 48×48px touch target (exceeds WCAG 2.5.5 44×44px) */\n padding: var(--hx-space-3, 0.75rem);\n background: transparent;\n border: none;\n border-radius: var(--hx-border-radius-sm, 0.25rem);\n color: var(--hx-top-nav-toggle-color, var(--hx-color-neutral-700, #343a40));\n cursor: pointer;\n line-height: 0;\n }\n\n .mobile-toggle:hover {\n background: var(--hx-color-neutral-100, #f1f3f5);\n }\n\n .mobile-toggle:focus-visible {\n outline: var(--hx-focus-ring-width, 2px) solid\n var(--hx-focus-ring-color, var(--hx-color-primary-500, #2563eb));\n outline-offset: var(--hx-focus-ring-offset, 2px);\n }\n\n .mobile-toggle__icon {\n width: var(--hx-space-6, 1.5rem);\n height: var(--hx-space-6, 1.5rem);\n }\n\n /* ─── Collapsible panel (mobile) ─── */\n\n .nav__collapsible {\n display: none;\n flex-direction: column;\n width: 100%;\n padding-block: var(--hx-space-3, 0.75rem);\n border-top: var(--hx-border-width-thin, 1px) solid\n var(--hx-top-nav-border-color, var(--hx-color-neutral-200, #dee2e6));\n }\n\n .nav__collapsible--open {\n display: flex;\n animation: hx-mobile-nav-open var(--hx-duration-fast, 150ms) ease-out;\n }\n\n /* ─── Menu and actions in collapsible (mobile) ─── */\n\n .nav__menu,\n .nav__actions {\n display: flex;\n flex-direction: column;\n gap: var(--hx-space-1, 0.25rem);\n padding-inline: var(--hx-top-nav-padding-x, var(--hx-space-6, 1.5rem));\n }\n\n .nav__actions {\n margin-top: var(--hx-space-3, 0.75rem);\n padding-top: var(--hx-space-3, 0.75rem);\n border-top: var(--hx-border-width-thin, 1px) solid\n var(--hx-top-nav-border-color, var(--hx-color-neutral-200, #dee2e6));\n }\n\n /* ─── Desktop breakpoint ─── */\n\n /* NOTE: CSS @media queries do not support custom properties.\n This value corresponds to --hx-breakpoint-md (768px). */\n @media (min-width: 768px) {\n /* Make nav a flex row so bar and collapsible sit side-by-side */\n .nav {\n display: flex;\n align-items: center;\n padding-inline: var(--hx-top-nav-padding-x, var(--hx-space-6, 1.5rem));\n }\n\n .nav__bar {\n flex-shrink: 0;\n padding-inline: 0;\n min-height: var(--hx-top-nav-height, var(--hx-space-16, 4rem));\n }\n\n /* Hide hamburger on desktop */\n .mobile-toggle {\n display: none;\n }\n\n /* Collapsible becomes a standard inline flex row */\n .nav__collapsible {\n display: flex;\n flex-direction: row;\n align-items: center;\n flex: 1;\n padding-block: 0;\n border-top: none;\n margin-inline-start: auto;\n gap: var(--hx-space-4, 1rem);\n animation: none;\n }\n\n /* Override open modifier — always visible on desktop regardless of state */\n .nav__collapsible--open {\n display: flex;\n animation: none;\n }\n\n /* Menu grows to fill available space */\n .nav__menu {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: var(--hx-space-1, 0.25rem);\n flex: 1;\n padding-inline: 0;\n }\n\n /* Actions sit at the far right */\n .nav__actions {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: var(--hx-space-2, 0.5rem);\n margin-top: 0;\n padding-top: 0;\n padding-inline: 0;\n border-top: none;\n flex-shrink: 0;\n }\n }\n\n /* ─── Mobile menu open animation ─── */\n\n @keyframes hx-mobile-nav-open {\n from {\n opacity: 0;\n transform: translateY(-0.25rem);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n\n /* ─── Reduced motion ─── */\n\n @media (prefers-reduced-motion: reduce) {\n .nav__collapsible--open {\n animation: none;\n }\n }\n`;\n","import { LitElement, html, svg } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { tokenStyles } from '@helixui/tokens/lit';\nimport { helixTopNavStyles } from './hx-top-nav.styles.js';\n\n/**\n * Top-of-page site navigation bar with logo, menu items, and utility area.\n * Supports sticky positioning, responsive hamburger menu, and full slot-driven\n * content composition for Drupal and other CMS consumers.\n *\n * @summary Site-level navigation bar with logo, nav items, and action slots.\n *\n * @tag hx-top-nav\n *\n * @slot logo - Brand area rendered on the left side.\n * @slot - Default slot for primary navigation items rendered in the center.\n * IMPORTANT: Do NOT place a `<nav>` element in this slot — the component\n * already renders a `<nav>` landmark internally. Use a `<div>` or bare links.\n * @slot actions - Utility area rendered on the right side (search, user menu, etc.).\n *\n * @fires {CustomEvent<{open: boolean}>} hx-mobile-toggle - Dispatched when the\n * hamburger button is toggled. Detail contains the new open state.\n *\n * @csspart header - The outer `<header>` landmark element.\n * @csspart nav - The `<nav>` element inside the header.\n * @csspart logo - The logo slot container.\n * @csspart menu - The primary navigation slot container.\n * @csspart actions - The actions slot container.\n * @csspart mobile-toggle - The hamburger toggle button.\n *\n * @cssprop [--hx-top-nav-bg=var(--hx-color-neutral-0)] - Navigation bar background color.\n * @cssprop [--hx-top-nav-color=var(--hx-color-neutral-800)] - Navigation bar text color.\n * @cssprop [--hx-top-nav-border-color=var(--hx-color-neutral-200)] - Bottom border color.\n * @cssprop [--hx-top-nav-height=var(--hx-space-16)] - Navigation bar height.\n * @cssprop [--hx-top-nav-padding-x=var(--hx-space-6)] - Horizontal padding.\n * @cssprop [--hx-top-nav-z-index=var(--hx-z-index-sticky)] - Z-index for sticky mode.\n * @cssprop [--hx-top-nav-toggle-color=var(--hx-color-neutral-700)] - Hamburger icon color.\n */\n@customElement('hx-top-nav')\nexport class HelixTopNav extends LitElement {\n static override styles = [tokenStyles, helixTopNavStyles];\n\n // ─── Public Properties ───\n\n /**\n * When true, the navigation bar sticks to the top of the viewport during scroll.\n * @attr sticky\n */\n @property({ type: Boolean, reflect: true })\n sticky = false;\n\n /**\n * Accessible label applied to the `<nav>` element via `aria-label`.\n * @attr label\n */\n @property({ type: String })\n label = 'Site Navigation';\n\n // ─── Private State ───\n\n /** Whether the mobile collapsible menu is currently open. */\n @state() private _mobileOpen = false;\n\n // ─── Lifecycle ───\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.addEventListener('keydown', this._handleKeydown);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener('keydown', this._handleKeydown);\n }\n\n // ─── Event Handling ───\n\n private _handleMobileToggle(): void {\n this._mobileOpen = !this._mobileOpen;\n\n /**\n * Dispatched when the hamburger button is toggled.\n * @event hx-mobile-toggle\n */\n this.dispatchEvent(\n new CustomEvent<{ open: boolean }>('hx-mobile-toggle', {\n bubbles: true,\n composed: true,\n detail: { open: this._mobileOpen },\n }),\n );\n\n if (this._mobileOpen) {\n // Move focus to first interactive element in the default slot\n this.updateComplete.then(() => {\n const slot = this.shadowRoot?.querySelector<HTMLSlotElement>('slot:not([name])');\n const assigned = slot?.assignedElements({ flatten: true }) ?? [];\n const firstFocusable = assigned.find((el): el is HTMLElement => el instanceof HTMLElement);\n firstFocusable?.focus();\n });\n }\n }\n\n private _handleKeydown = (e: KeyboardEvent): void => {\n if (e.key === 'Escape' && this._mobileOpen) {\n this._mobileOpen = false;\n this.dispatchEvent(\n new CustomEvent<{ open: boolean }>('hx-mobile-toggle', {\n bubbles: true,\n composed: true,\n detail: { open: false },\n }),\n );\n // Return focus to the toggle button\n this.shadowRoot?.querySelector<HTMLButtonElement>('[part=\"mobile-toggle\"]')?.focus();\n }\n };\n\n // ─── Render Helpers ───\n\n private _renderHamburgerIcon() {\n return html`\n <svg\n class=\"mobile-toggle__icon\"\n aria-hidden=\"true\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n ${this._mobileOpen\n ? svg`\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n `\n : svg`\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\"></line>\n <line x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\"></line>\n <line x1=\"3\" y1=\"18\" x2=\"21\" y2=\"18\"></line>\n `}\n </svg>\n `;\n }\n\n // ─── Render ───\n\n override render() {\n const menuClasses = {\n nav__collapsible: true,\n 'nav__collapsible--open': this._mobileOpen,\n };\n\n return html`\n <header part=\"header\">\n <nav part=\"nav\" class=\"nav\" aria-label=${this.label}>\n <div class=\"nav__bar\">\n <div part=\"logo\" class=\"nav__logo\">\n <slot name=\"logo\"></slot>\n </div>\n\n <button\n part=\"mobile-toggle\"\n class=\"mobile-toggle\"\n type=\"button\"\n aria-expanded=${String(this._mobileOpen)}\n aria-controls=\"nav-menu\"\n aria-label=\"Toggle navigation\"\n @click=${this._handleMobileToggle}\n >\n ${this._renderHamburgerIcon()}\n </button>\n </div>\n\n <div id=\"nav-menu\" class=${classMap(menuClasses)}>\n <div part=\"menu\" class=\"nav__menu\">\n <slot></slot>\n </div>\n\n <div part=\"actions\" class=\"nav__actions\">\n <slot name=\"actions\"></slot>\n </div>\n </div>\n </nav>\n </header>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'hx-top-nav': HelixTopNav;\n }\n}\n"],"names":["helixTopNavStyles","css","HelixTopNav","LitElement","_b","_a","slot","firstFocusable","el","html","svg","menuClasses","classMap","tokenStyles","__decorateClass","property","state","customElement"],"mappings":"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"}
1
+ {"version":3,"file":"hx-top-nav-DzW7XLv-.js","sources":["../../src/components/hx-top-nav/hx-top-nav.styles.ts","../../src/components/hx-top-nav/hx-top-nav.ts"],"sourcesContent":["import { css } from 'lit';\n\nexport const helixTopNavStyles = css`\n /* ─── Host ─── */\n\n :host {\n display: block;\n }\n\n /* ─── Header wrapper (landmark) ─── */\n\n header {\n display: block;\n margin: 0;\n padding: 0;\n }\n\n /* ─── Sticky mode ─── */\n\n :host([sticky]) .nav {\n position: sticky;\n top: 0;\n /* Fallback 1000 is appropriate for sticky navbars (below modals ~1300, above content) */\n z-index: var(--hx-top-nav-z-index, var(--hx-z-index-sticky, 1000));\n }\n\n /* ─── Nav container ─── */\n\n .nav {\n background-color: var(--hx-top-nav-bg, var(--hx-color-neutral-0, #ffffff));\n color: var(--hx-top-nav-color, var(--hx-color-neutral-800, #212529));\n border-bottom: var(--hx-border-width-thin, 1px) solid\n var(--hx-top-nav-border-color, var(--hx-color-neutral-200, #dee2e6));\n font-family: var(--hx-font-family-sans, sans-serif);\n }\n\n /* ─── Bar row (always visible) ─── */\n\n .nav__bar {\n display: flex;\n align-items: center;\n min-height: var(--hx-top-nav-height, var(--hx-space-16, 4rem));\n padding-inline: var(--hx-top-nav-padding-x, var(--hx-space-6, 1.5rem));\n gap: var(--hx-space-4, 1rem);\n }\n\n /* ─── Logo ─── */\n\n .nav__logo {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n }\n\n /* ─── Mobile toggle (hamburger) ─── */\n\n .mobile-toggle {\n display: flex;\n align-items: center;\n justify-content: center;\n margin-inline-start: auto;\n /* var(--hx-space-3, 0.75rem) padding + 24px icon = 48×48px touch target (exceeds WCAG 2.5.5 44×44px) */\n padding: var(--hx-space-3, 0.75rem);\n background: transparent;\n border: none;\n border-radius: var(--hx-border-radius-sm, 0.25rem);\n color: var(--hx-top-nav-toggle-color, var(--hx-color-neutral-700, #343a40));\n cursor: pointer;\n line-height: 0;\n }\n\n .mobile-toggle:hover {\n background: var(--hx-color-neutral-100, #f1f3f5);\n }\n\n .mobile-toggle:focus-visible {\n outline: var(--hx-focus-ring-width, 2px) solid\n var(--hx-focus-ring-color, var(--hx-color-primary-500, #2563eb));\n outline-offset: var(--hx-focus-ring-offset, 2px);\n }\n\n .mobile-toggle__icon {\n width: var(--hx-space-6, 1.5rem);\n height: var(--hx-space-6, 1.5rem);\n }\n\n /* ─── Collapsible panel (mobile) ─── */\n\n .nav__collapsible {\n display: none;\n flex-direction: column;\n width: 100%;\n padding-block: var(--hx-space-3, 0.75rem);\n border-top: var(--hx-border-width-thin, 1px) solid\n var(--hx-top-nav-border-color, var(--hx-color-neutral-200, #dee2e6));\n }\n\n .nav__collapsible--open {\n display: flex;\n animation: hx-mobile-nav-open var(--hx-duration-fast, 150ms) ease-out;\n }\n\n /* ─── Menu and actions in collapsible (mobile) ─── */\n\n .nav__menu,\n .nav__actions {\n display: flex;\n flex-direction: column;\n gap: var(--hx-space-1, 0.25rem);\n padding-inline: var(--hx-top-nav-padding-x, var(--hx-space-6, 1.5rem));\n }\n\n .nav__actions {\n margin-top: var(--hx-space-3, 0.75rem);\n padding-top: var(--hx-space-3, 0.75rem);\n border-top: var(--hx-border-width-thin, 1px) solid\n var(--hx-top-nav-border-color, var(--hx-color-neutral-200, #dee2e6));\n }\n\n /* ─── Desktop breakpoint ─── */\n\n /* NOTE: CSS @media queries do not support custom properties.\n This value corresponds to --hx-breakpoint-md (768px). */\n @media (min-width: 768px) {\n /* Make nav a flex row so bar and collapsible sit side-by-side */\n .nav {\n display: flex;\n align-items: center;\n padding-inline: var(--hx-top-nav-padding-x, var(--hx-space-6, 1.5rem));\n }\n\n .nav__bar {\n flex-shrink: 0;\n padding-inline: 0;\n min-height: var(--hx-top-nav-height, var(--hx-space-16, 4rem));\n }\n\n /* Hide hamburger on desktop */\n .mobile-toggle {\n display: none;\n }\n\n /* Collapsible becomes a standard inline flex row */\n .nav__collapsible {\n display: flex;\n flex-direction: row;\n align-items: center;\n flex: 1;\n padding-block: 0;\n border-top: none;\n margin-inline-start: auto;\n gap: var(--hx-space-4, 1rem);\n animation: none;\n }\n\n /* Override open modifier — always visible on desktop regardless of state */\n .nav__collapsible--open {\n display: flex;\n animation: none;\n }\n\n /* Menu grows to fill available space */\n .nav__menu {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: var(--hx-space-1, 0.25rem);\n flex: 1;\n padding-inline: 0;\n }\n\n /* Actions sit at the far right */\n .nav__actions {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: var(--hx-space-2, 0.5rem);\n margin-top: 0;\n padding-top: 0;\n padding-inline: 0;\n border-top: none;\n flex-shrink: 0;\n }\n }\n\n /* ─── Mobile menu open animation ─── */\n\n @keyframes hx-mobile-nav-open {\n from {\n opacity: 0;\n transform: translateY(-0.25rem);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n\n /* ─── Reduced motion ─── */\n\n @media (prefers-reduced-motion: reduce) {\n .nav__collapsible--open {\n animation: none;\n }\n }\n`;\n","import { LitElement, html, svg } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { tokenStyles } from '@helixui/tokens/lit';\nimport { helixTopNavStyles } from './hx-top-nav.styles.js';\n\n/**\n * Top-of-page site navigation bar with logo, menu items, and utility area.\n * Supports sticky positioning, responsive hamburger menu, and full slot-driven\n * content composition for Drupal and other CMS consumers.\n *\n * @summary Site-level navigation bar with logo, nav items, and action slots.\n *\n * @tag hx-top-nav\n *\n * @slot logo - Brand area rendered on the left side.\n * @slot - Default slot for primary navigation items rendered in the center.\n * IMPORTANT: Do NOT place a `<nav>` element in this slot — the component\n * already renders a `<nav>` landmark internally. Use a `<div>` or bare links.\n * @slot actions - Utility area rendered on the right side (search, user menu, etc.).\n *\n * @fires {CustomEvent<{open: boolean}>} hx-mobile-toggle - Dispatched when the\n * hamburger button is toggled. Detail contains the new open state.\n *\n * @csspart header - The outer `<header>` landmark element.\n * @csspart nav - The `<nav>` element inside the header.\n * @csspart logo - The logo slot container.\n * @csspart menu - The primary navigation slot container.\n * @csspart actions - The actions slot container.\n * @csspart mobile-toggle - The hamburger toggle button.\n *\n * @cssprop [--hx-top-nav-bg=var(--hx-color-neutral-0)] - Navigation bar background color.\n * @cssprop [--hx-top-nav-color=var(--hx-color-neutral-800)] - Navigation bar text color.\n * @cssprop [--hx-top-nav-border-color=var(--hx-color-neutral-200)] - Bottom border color.\n * @cssprop [--hx-top-nav-height=var(--hx-space-16)] - Navigation bar height.\n * @cssprop [--hx-top-nav-padding-x=var(--hx-space-6)] - Horizontal padding.\n * @cssprop [--hx-top-nav-z-index=var(--hx-z-index-sticky)] - Z-index for sticky mode.\n * @cssprop [--hx-top-nav-toggle-color=var(--hx-color-neutral-700)] - Hamburger icon color.\n */\n@customElement('hx-top-nav')\nexport class HelixTopNav extends LitElement {\n static override styles = [tokenStyles, helixTopNavStyles];\n\n // ─── Public Properties ───\n\n /**\n * When true, the navigation bar sticks to the top of the viewport during scroll.\n * @attr sticky\n */\n @property({ type: Boolean, reflect: true })\n sticky = false;\n\n /**\n * Accessible label applied to the `<nav>` element via `aria-label`.\n * @attr label\n */\n @property({ type: String })\n label = 'Site Navigation';\n\n // ─── Private State ───\n\n /** Whether the mobile collapsible menu is currently open. */\n @state() private _mobileOpen = false;\n\n // ─── Lifecycle ───\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.addEventListener('keydown', this._handleKeydown);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener('keydown', this._handleKeydown);\n }\n\n // ─── Event Handling ───\n\n private _handleMobileToggle(): void {\n this._mobileOpen = !this._mobileOpen;\n\n /**\n * Dispatched when the hamburger button is toggled.\n * @event hx-mobile-toggle\n */\n this.dispatchEvent(\n new CustomEvent<{ open: boolean }>('hx-mobile-toggle', {\n bubbles: true,\n composed: true,\n detail: { open: this._mobileOpen },\n }),\n );\n\n if (this._mobileOpen) {\n // Move focus to first truly interactive element in the default slot (WCAG 2.4.3).\n // A plain HTMLElement (e.g. <div>) is not keyboard-reachable; we must find a\n // focusable descendant to avoid trapping focus on a non-interactive node.\n this.updateComplete.then(() => {\n const FOCUSABLE_SELECTOR = 'a[href], button:not([disabled]), [tabindex=\"0\"]';\n const slot = this.shadowRoot?.querySelector<HTMLSlotElement>('slot:not([name])');\n const assigned = slot?.assignedElements({ flatten: true }) ?? [];\n let firstFocusable: HTMLElement | null = null;\n for (const el of assigned) {\n if (!(el instanceof HTMLElement)) continue;\n if (el.matches(FOCUSABLE_SELECTOR)) {\n firstFocusable = el;\n break;\n }\n const found = el.querySelector<HTMLElement>(FOCUSABLE_SELECTOR);\n if (found) {\n firstFocusable = found;\n break;\n }\n }\n firstFocusable?.focus();\n });\n }\n }\n\n private _handleKeydown = (e: KeyboardEvent): void => {\n if (e.key === 'Escape' && this._mobileOpen) {\n this._mobileOpen = false;\n this.dispatchEvent(\n new CustomEvent<{ open: boolean }>('hx-mobile-toggle', {\n bubbles: true,\n composed: true,\n detail: { open: false },\n }),\n );\n // Return focus to the toggle button\n this.shadowRoot?.querySelector<HTMLButtonElement>('[part=\"mobile-toggle\"]')?.focus();\n }\n };\n\n // ─── Render Helpers ───\n\n private _renderHamburgerIcon() {\n return html`\n <svg\n class=\"mobile-toggle__icon\"\n aria-hidden=\"true\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n ${this._mobileOpen\n ? svg`\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n `\n : svg`\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\"></line>\n <line x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\"></line>\n <line x1=\"3\" y1=\"18\" x2=\"21\" y2=\"18\"></line>\n `}\n </svg>\n `;\n }\n\n // ─── Render ───\n\n override render() {\n const menuClasses = {\n nav__collapsible: true,\n 'nav__collapsible--open': this._mobileOpen,\n };\n\n return html`\n <header part=\"header\">\n <nav part=\"nav\" class=\"nav\" aria-label=${this.label}>\n <div class=\"nav__bar\">\n <div part=\"logo\" class=\"nav__logo\">\n <slot name=\"logo\"></slot>\n </div>\n\n <button\n part=\"mobile-toggle\"\n class=\"mobile-toggle\"\n type=\"button\"\n aria-expanded=${String(this._mobileOpen)}\n aria-controls=\"nav-menu\"\n aria-label=\"Toggle navigation\"\n @click=${this._handleMobileToggle}\n >\n ${this._renderHamburgerIcon()}\n </button>\n </div>\n\n <div id=\"nav-menu\" class=${classMap(menuClasses)}>\n <div part=\"menu\" class=\"nav__menu\">\n <slot></slot>\n </div>\n\n <div part=\"actions\" class=\"nav__actions\">\n <slot name=\"actions\"></slot>\n </div>\n </div>\n </nav>\n </header>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'hx-top-nav': HelixTopNav;\n }\n}\n"],"names":["helixTopNavStyles","css","HelixTopNav","LitElement","e","_b","_a","FOCUSABLE_SELECTOR","slot","assigned","firstFocusable","el","found","html","svg","menuClasses","classMap","tokenStyles","__decorateClass","property","state","customElement"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { css as b, LitElement as g, nothing as m, html as f } from "lit";
2
- import { property as p, state as c, customElement as _ } from "lit/decorators.js";
1
+ import { css as b, LitElement as g, nothing as f, html as x } from "lit";
2
+ import { property as p, state as d, customElement as _ } from "lit/decorators.js";
3
3
  import { tokenStyles as y } from "@helixui/tokens/lit";
4
4
  const w = b`
5
5
  :host {
@@ -23,14 +23,14 @@ const w = b`
23
23
  border-radius: var(--hx-border-radius-sm, 0.25rem);
24
24
  }
25
25
  `;
26
- var I = Object.defineProperty, k = Object.getOwnPropertyDescriptor, x = (t, e, r, i) => {
27
- for (var s = i > 1 ? void 0 : i ? k(e, r) : e, n = t.length - 1, o; n >= 0; n--)
28
- (o = t[n]) && (s = (i ? o(e, r, s) : o(s)) || s);
29
- return i && s && I(e, r, s), s;
26
+ var I = Object.defineProperty, k = Object.getOwnPropertyDescriptor, m = (e, t, r, i) => {
27
+ for (var s = i > 1 ? void 0 : i ? k(t, r) : t, a = e.length - 1, o; a >= 0; a--)
28
+ (o = e[a]) && (s = (i ? o(t, r, s) : o(s)) || s);
29
+ return i && s && I(t, r, s), s;
30
30
  };
31
- let h = class extends g {
31
+ let c = class extends g {
32
32
  constructor() {
33
- super(...arguments), this.label = "", this.selection = "none", this._currentIndex = 0;
33
+ super(...arguments), this.label = "", this.selection = "none", this._currentIndex = 0, this._hasVisibleItems = !1;
34
34
  }
35
35
  // ─── Internal Helpers ───
36
36
  /**
@@ -40,29 +40,39 @@ let h = class extends g {
40
40
  _getVisibleItems() {
41
41
  return this._collectVisibleItems(this);
42
42
  }
43
- _collectVisibleItems(t) {
44
- const e = [];
45
- for (const r of Array.from(t.children))
43
+ _collectVisibleItems(e) {
44
+ const t = [];
45
+ for (const r of Array.from(e.children))
46
46
  if (r.tagName.toLowerCase() === "hx-tree-item") {
47
47
  const i = r;
48
- e.push(i), i.expanded && e.push(...this._collectVisibleItems(i));
48
+ t.push(i), i.expanded && t.push(...this._collectVisibleItems(i));
49
49
  } else
50
- e.push(...this._collectVisibleItems(r));
51
- return e;
50
+ t.push(...this._collectVisibleItems(r));
51
+ return t;
52
52
  }
53
53
  _getSelectedItems() {
54
54
  return Array.from(this.querySelectorAll("hx-tree-item[selected]"));
55
55
  }
56
- _focusItem(t) {
56
+ /**
57
+ * Updates the roving tabindex across all visible items so that only the
58
+ * item at `activeIndex` has `tabindex="0"`. All others receive `tabindex="-1"`.
59
+ * This is called whenever the active item changes (navigation, initial render).
60
+ */
61
+ _updateRovingTabindex(e, t) {
62
+ e.forEach((r, i) => {
63
+ r.setRovingActive(i === t);
64
+ });
65
+ }
66
+ _focusItem(e) {
57
67
  var i;
58
- const e = this._getVisibleItems();
59
- if (e.length === 0) return;
60
- const r = Math.max(0, Math.min(t, e.length - 1));
61
- this._currentIndex = r, (i = e[r]) == null || i.focus();
68
+ const t = this._getVisibleItems();
69
+ if (t.length === 0) return;
70
+ const r = Math.max(0, Math.min(e, t.length - 1));
71
+ this._currentIndex = r, this._updateRovingTabindex(t, r), (i = t[r]) == null || i.focus();
62
72
  }
63
73
  // ─── Event Handling ───
64
- _handleTreeItemSelect(t) {
65
- const r = t.detail.item;
74
+ _handleTreeItemSelect(e) {
75
+ const r = e.detail.item;
66
76
  if (this.selection !== "none") {
67
77
  if (this.selection === "single") {
68
78
  const i = r.selected;
@@ -79,97 +89,113 @@ let h = class extends g {
79
89
  );
80
90
  }
81
91
  }
82
- _handleKeyDown(t) {
83
- var s, n, o;
84
- const e = this._getVisibleItems();
85
- if (e.length === 0) return;
92
+ _handleKeyDown(e) {
93
+ var s, a, o;
94
+ const t = this._getVisibleItems();
95
+ if (t.length === 0) return;
86
96
  let r = this._currentIndex;
87
97
  const i = document.activeElement;
88
- for (let a = 0; a < e.length; a++)
89
- if (e[a] === i || (n = (s = e[a]) == null ? void 0 : s.shadowRoot) != null && n.activeElement) {
90
- r = a;
98
+ for (let n = 0; n < t.length; n++)
99
+ if (t[n] === i || (a = (s = t[n]) == null ? void 0 : s.shadowRoot) != null && a.activeElement) {
100
+ r = n;
91
101
  break;
92
102
  }
93
- switch (t.key) {
103
+ switch (e.key) {
94
104
  case "ArrowDown": {
95
- t.preventDefault();
96
- const a = r < e.length - 1 ? r + 1 : 0;
97
- this._focusItem(a);
105
+ e.preventDefault();
106
+ const n = r < t.length - 1 ? r + 1 : 0;
107
+ this._focusItem(n);
98
108
  break;
99
109
  }
100
110
  case "ArrowUp": {
101
- t.preventDefault();
102
- const a = r > 0 ? r - 1 : e.length - 1;
103
- this._focusItem(a);
111
+ e.preventDefault();
112
+ const n = r > 0 ? r - 1 : t.length - 1;
113
+ this._focusItem(n);
104
114
  break;
105
115
  }
106
116
  case "ArrowLeft": {
107
- t.preventDefault();
108
- const a = e[r];
109
- if (!a) break;
110
- if (a.expanded && a.hasChildItems)
111
- a.expanded = !1;
117
+ e.preventDefault();
118
+ const n = t[r];
119
+ if (!n) break;
120
+ if (n.expanded && n.hasChildItems)
121
+ n.expanded = !1;
112
122
  else {
113
- const u = (o = a.parentElement) == null ? void 0 : o.closest("hx-tree-item");
123
+ const u = (o = n.parentElement) == null ? void 0 : o.closest("hx-tree-item");
114
124
  if (u) {
115
- const v = e.indexOf(u);
125
+ const v = t.indexOf(u);
116
126
  v >= 0 && this._focusItem(v);
117
127
  }
118
128
  }
119
129
  break;
120
130
  }
121
131
  case "ArrowRight": {
122
- t.preventDefault();
123
- const a = e[r];
124
- if (!a) break;
125
- a.hasChildItems && (a.expanded ? this._focusItem(r + 1) : a.expanded = !0);
132
+ e.preventDefault();
133
+ const n = t[r];
134
+ if (!n) break;
135
+ n.hasChildItems && (n.expanded ? this._focusItem(r + 1) : n.expanded = !0);
126
136
  break;
127
137
  }
128
138
  case "Home": {
129
- t.preventDefault(), this._focusItem(0);
139
+ e.preventDefault(), this._focusItem(0);
130
140
  break;
131
141
  }
132
142
  case "End": {
133
- t.preventDefault(), this._focusItem(e.length - 1);
143
+ e.preventDefault(), this._focusItem(t.length - 1);
134
144
  break;
135
145
  }
136
146
  }
137
147
  }
138
- _handleFocusIn(t) {
139
- t.target === t.currentTarget && this._focusItem(this._currentIndex);
148
+ _handleFocusIn(e) {
149
+ e.target === e.currentTarget && this._getVisibleItems().length > 0 && this._focusItem(this._currentIndex);
150
+ }
151
+ /**
152
+ * Initializes the roving tabindex after items are first slotted in.
153
+ * Ensures the active item (index 0 by default) has tabindex="0" from the start,
154
+ * so a Tab into the tree lands directly on the first item without a redirect.
155
+ * Also updates `_hasVisibleItems` so the container tabindex re-renders correctly.
156
+ */
157
+ _handleSlotChange() {
158
+ const e = this._getVisibleItems();
159
+ if (this._hasVisibleItems = e.length > 0, e.length === 0) return;
160
+ const t = Math.min(this._currentIndex, e.length - 1);
161
+ this._currentIndex = t, this._updateRovingTabindex(e, t);
140
162
  }
141
163
  // ─── Render ───
142
164
  render() {
143
- return f`
165
+ const e = this._hasVisibleItems ? "-1" : "0";
166
+ return x`
144
167
  <div
145
168
  part="tree"
146
169
  class="tree"
147
170
  role="tree"
148
- tabindex="0"
149
- aria-label=${this.label || m}
171
+ tabindex=${e}
172
+ aria-label=${this.label || f}
150
173
  aria-multiselectable=${this.selection === "multiple" ? "true" : "false"}
151
174
  @hx-tree-item-select=${this._handleTreeItemSelect}
152
175
  @keydown=${this._handleKeyDown}
153
176
  @focusin=${this._handleFocusIn}
154
177
  >
155
- <slot></slot>
178
+ <slot @slotchange=${this._handleSlotChange}></slot>
156
179
  </div>
157
180
  `;
158
181
  }
159
182
  };
160
- h.styles = [y, w];
161
- x([
183
+ c.styles = [y, w];
184
+ m([
162
185
  p({ type: String, reflect: !0 })
163
- ], h.prototype, "label", 2);
164
- x([
186
+ ], c.prototype, "label", 2);
187
+ m([
165
188
  p({ type: String, reflect: !0 })
166
- ], h.prototype, "selection", 2);
167
- x([
168
- c()
169
- ], h.prototype, "_currentIndex", 2);
170
- h = x([
189
+ ], c.prototype, "selection", 2);
190
+ m([
191
+ d()
192
+ ], c.prototype, "_currentIndex", 2);
193
+ m([
194
+ d()
195
+ ], c.prototype, "_hasVisibleItems", 2);
196
+ c = m([
171
197
  _("hx-tree-view")
172
- ], h);
198
+ ], c);
173
199
  const C = b`
174
200
  :host {
175
201
  display: block;
@@ -341,14 +367,14 @@ const C = b`
341
367
  overflow: hidden;
342
368
  }
343
369
  `;
344
- var S = Object.defineProperty, E = Object.getOwnPropertyDescriptor, d = (t, e, r, i) => {
345
- for (var s = i > 1 ? void 0 : i ? E(e, r) : e, n = t.length - 1, o; n >= 0; n--)
346
- (o = t[n]) && (s = (i ? o(e, r, s) : o(s)) || s);
347
- return i && s && S(e, r, s), s;
370
+ var S = Object.defineProperty, E = Object.getOwnPropertyDescriptor, h = (e, t, r, i) => {
371
+ for (var s = i > 1 ? void 0 : i ? E(t, r) : t, a = e.length - 1, o; a >= 0; a--)
372
+ (o = e[a]) && (s = (i ? o(t, r, s) : o(s)) || s);
373
+ return i && s && S(t, r, s), s;
348
374
  };
349
375
  let l = class extends g {
350
376
  constructor() {
351
- super(...arguments), this.expanded = !1, this.selected = !1, this.disabled = !1, this._hasChildren = !1, this._level = 1, this._posInSet = 1, this._setSize = 1, this._selectable = !1;
377
+ super(...arguments), this.expanded = !1, this.selected = !1, this.disabled = !1, this._hasChildren = !1, this._rovingActive = !1, this._level = 1, this._posInSet = 1, this._setSize = 1, this._selectable = !1;
352
378
  }
353
379
  // ─── Computed ARIA ───
354
380
  /**
@@ -361,16 +387,17 @@ let l = class extends g {
361
387
  /**
362
388
  * Recompute all cached ARIA metadata in a single DOM pass.
363
389
  * Called on connect, slotchange, and whenever structural context may change.
390
+ * @internal
364
391
  */
365
392
  _updateAriaMetadata() {
366
- let t = 1, e = this.parentElement;
367
- for (; e; )
368
- e.tagName.toLowerCase() === "hx-tree-item" && t++, e = e.parentElement;
369
- this._level = t;
393
+ let e = 1, t = this.parentElement;
394
+ for (; t; )
395
+ t.tagName.toLowerCase() === "hx-tree-item" && e++, t = t.parentElement;
396
+ this._level = e;
370
397
  const r = this.parentElement;
371
398
  if (r) {
372
399
  const s = Array.from(r.children).filter(
373
- (n) => n.tagName.toLowerCase() === "hx-tree-item"
400
+ (a) => a.tagName.toLowerCase() === "hx-tree-item"
374
401
  );
375
402
  this._posInSet = s.indexOf(this) + 1, this._setSize = s.length;
376
403
  } else
@@ -387,14 +414,26 @@ let l = class extends g {
387
414
  super.connectedCallback(), this._updateAriaMetadata();
388
415
  }
389
416
  // ─── Children Detection ───
390
- _handleChildrenSlotChange(t) {
391
- const e = t.target;
392
- this._hasChildren = e.assignedElements().length > 0, this._updateAriaMetadata();
417
+ /**
418
+ * Updates _hasChildren and recomputes ARIA metadata when the children slot assignment changes.
419
+ * @internal
420
+ */
421
+ _handleChildrenSlotChange(e) {
422
+ const t = e.target;
423
+ this._hasChildren = t.assignedElements().length > 0, this._updateAriaMetadata();
393
424
  }
394
425
  // ─── Event Handlers ───
395
- _handleExpandClick(t) {
396
- t.stopPropagation(), !this.disabled && (this.expanded = !this.expanded);
426
+ /**
427
+ * Toggles the expanded state when the expand/collapse button is clicked, stopping event propagation.
428
+ * @internal
429
+ */
430
+ _handleExpandClick(e) {
431
+ e.stopPropagation(), !this.disabled && (this.expanded = !this.expanded);
397
432
  }
433
+ /**
434
+ * Dispatches the hx-tree-item-select event when the item is activated via click or keyboard.
435
+ * @internal
436
+ */
398
437
  _handleRowClick() {
399
438
  this.disabled || this.dispatchEvent(
400
439
  new CustomEvent("hx-tree-item-select", {
@@ -404,31 +443,48 @@ let l = class extends g {
404
443
  })
405
444
  );
406
445
  }
407
- _handleKeyDown(t) {
446
+ /**
447
+ * Handles keyboard interaction for the tree item, including expand/collapse, activation, and delegation of list-navigation keys to the parent tree.
448
+ * @internal
449
+ */
450
+ _handleKeyDown(e) {
408
451
  if (!this.disabled)
409
- switch (t.key) {
452
+ switch (e.key) {
410
453
  case "ArrowRight":
411
- t.preventDefault(), this._hasChildren && !this.expanded && (this.expanded = !0);
454
+ e.preventDefault(), this._hasChildren && !this.expanded && (this.expanded = !0);
412
455
  break;
413
456
  case "ArrowLeft":
414
- t.preventDefault(), this._hasChildren && this.expanded && (this.expanded = !1);
457
+ e.preventDefault(), this._hasChildren && this.expanded && (this.expanded = !1);
415
458
  break;
416
459
  case "Enter":
417
460
  case " ":
418
- t.preventDefault(), this._handleRowClick();
461
+ e.preventDefault(), this._handleRowClick();
419
462
  break;
420
463
  }
421
464
  }
422
465
  // ─── Public API ───
466
+ /**
467
+ * Sets the roving tabindex state for this item.
468
+ * When `active` is true, the item row gets `tabindex="0"` making it the
469
+ * Tab-reachable item in the tree. All other items should be set to false.
470
+ * Called by the parent hx-tree-view to manage the roving tabindex pattern.
471
+ */
472
+ setRovingActive(e) {
473
+ this._rovingActive = e;
474
+ }
423
475
  /** Focus this item's interactive row element. */
424
476
  focus() {
425
- var e;
426
- const t = (e = this.shadowRoot) == null ? void 0 : e.querySelector(".item-row");
427
- t == null || t.focus();
477
+ var t;
478
+ const e = (t = this.shadowRoot) == null ? void 0 : t.querySelector(".item-row");
479
+ e == null || e.focus();
428
480
  }
429
481
  // ─── Render ───
482
+ /**
483
+ * Renders the expand/collapse chevron button, or a placeholder span when the item has no children.
484
+ * @internal
485
+ */
430
486
  _renderExpandIcon() {
431
- return this._hasChildren ? f`
487
+ return this._hasChildren ? x`
432
488
  <button
433
489
  part="expand-icon"
434
490
  class="expand-btn"
@@ -440,20 +496,20 @@ let l = class extends g {
440
496
  <polyline points="6 4 10 8 6 12" />
441
497
  </svg>
442
498
  </button>
443
- ` : f`<span class="expand-placeholder" aria-hidden="true"></span>`;
499
+ ` : x`<span class="expand-placeholder" aria-hidden="true"></span>`;
444
500
  }
445
501
  render() {
446
- const t = this._hasChildren ? String(this.expanded) : m, e = this._selectable ? String(this.selected) : m;
447
- return f`
502
+ const e = this._hasChildren ? String(this.expanded) : f, t = this._selectable ? String(this.selected) : f;
503
+ return x`
448
504
  <div part="item" class="item">
449
505
  <div
450
506
  part="row"
451
507
  class="item-row"
452
508
  role="treeitem"
453
- tabindex="-1"
454
- aria-expanded=${t}
455
- aria-selected=${e}
456
- aria-disabled=${this.disabled ? "true" : m}
509
+ tabindex=${this._rovingActive ? "0" : "-1"}
510
+ aria-expanded=${e}
511
+ aria-selected=${t}
512
+ aria-disabled=${this.disabled ? "true" : f}
457
513
  aria-level=${this._level}
458
514
  aria-posinset=${this._posInSet}
459
515
  aria-setsize=${this._setSize}
@@ -482,35 +538,38 @@ let l = class extends g {
482
538
  }
483
539
  };
484
540
  l.styles = [y, C];
485
- d([
541
+ h([
486
542
  p({ type: Boolean, reflect: !0 })
487
543
  ], l.prototype, "expanded", 2);
488
- d([
544
+ h([
489
545
  p({ type: Boolean, reflect: !0 })
490
546
  ], l.prototype, "selected", 2);
491
- d([
547
+ h([
492
548
  p({ type: Boolean, reflect: !0 })
493
549
  ], l.prototype, "disabled", 2);
494
- d([
495
- c()
550
+ h([
551
+ d()
496
552
  ], l.prototype, "_hasChildren", 2);
497
- d([
498
- c()
553
+ h([
554
+ d()
555
+ ], l.prototype, "_rovingActive", 2);
556
+ h([
557
+ d()
499
558
  ], l.prototype, "_level", 2);
500
- d([
501
- c()
559
+ h([
560
+ d()
502
561
  ], l.prototype, "_posInSet", 2);
503
- d([
504
- c()
562
+ h([
563
+ d()
505
564
  ], l.prototype, "_setSize", 2);
506
- d([
507
- c()
565
+ h([
566
+ d()
508
567
  ], l.prototype, "_selectable", 2);
509
- l = d([
568
+ l = h([
510
569
  _("hx-tree-item")
511
570
  ], l);
512
571
  export {
513
572
  l as H,
514
- h as a
573
+ c as a
515
574
  };
516
- //# sourceMappingURL=hx-tree-item-Cesh_du5.js.map
575
+ //# sourceMappingURL=hx-tree-item-DdH6RbMs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hx-tree-item-DdH6RbMs.js","sources":["../../src/components/hx-tree-view/hx-tree-view.styles.ts","../../src/components/hx-tree-view/hx-tree-view.ts","../../src/components/hx-tree-view/hx-tree-item.styles.ts","../../src/components/hx-tree-view/hx-tree-item.ts"],"sourcesContent":["import { css } from 'lit';\n\nexport const helixTreeViewStyles = css`\n :host {\n display: block;\n contain: layout style;\n font-family: var(--hx-tree-font-family, var(--hx-font-family-sans, sans-serif));\n }\n\n * {\n box-sizing: border-box;\n }\n\n .tree {\n display: block;\n outline: none;\n }\n\n .tree:focus-visible {\n outline: var(--hx-focus-ring-width, 2px) solid var(--hx-focus-ring-color, #2563eb);\n outline-offset: var(--hx-focus-ring-offset, 2px);\n border-radius: var(--hx-border-radius-sm, 0.25rem);\n }\n`;\n","import { LitElement, html, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { tokenStyles } from '@helixui/tokens/lit';\nimport { helixTreeViewStyles } from './hx-tree-view.styles.js';\nimport type { HelixTreeItem, HxTreeItemSelectDetail } from './hx-tree-item.js';\n\n/** Selection mode for the tree. */\nexport type TreeSelection = 'none' | 'single' | 'multiple';\n\n/** Detail type for the `hx-select` event. */\nexport interface HxSelectDetail {\n /** The tree item that was selected or deselected. */\n item: HelixTreeItem;\n /** Whether the item is now selected. */\n selected: boolean;\n}\n\n/**\n * A hierarchical tree component for navigating nested data structures.\n * Used in healthcare applications for org charts, ICD-10 code hierarchies, and department navigation.\n *\n * Implements WAI-ARIA tree view pattern with `role=\"tree\"` on the container\n * and `role=\"treeitem\"` on each item. Supports `aria-label` via the `label` property\n * for screen reader identification. Full keyboard navigation: Arrow keys for movement,\n * Enter/Space for selection, Home/End for first/last item.\n *\n * ## Scale Limits\n *\n * This component renders all tree items simultaneously in the DOM. It is suitable for\n * trees with up to ~500 visible items. For large taxonomies (e.g., ICD-10 with 70,000+\n * codes), use async/lazy loading: only render top-level nodes initially and populate\n * child nodes on `hx-select` or expand events. The component exposes the `expanded`\n * property on `hx-tree-item` for programmatic control of subtrees, enabling consumer-level\n * virtualization strategies without requiring changes to this component.\n *\n * @summary Hierarchical tree view with expand/collapse and keyboard navigation.\n *\n * @tag hx-tree-view\n *\n * @slot - Default slot for hx-tree-item elements.\n *\n * @fires {CustomEvent<HxSelectDetail>} hx-select - Dispatched when a tree item is selected or deselected.\n *\n * @csspart tree - The tree container element with role=\"tree\".\n *\n * @cssprop [--hx-tree-font-family=var(--hx-font-family-sans)] - Tree font family.\n */\n@customElement('hx-tree-view')\nexport class HelixTreeView extends LitElement {\n static override styles = [tokenStyles, helixTreeViewStyles];\n\n // ─── Properties ───\n\n /**\n * Accessible label for the tree. Applied as `aria-label` on the tree container.\n * Provides context to screen readers about the tree's purpose.\n * @attr label\n */\n @property({ type: String, reflect: true })\n label = '';\n\n /**\n * Selection mode for the tree.\n * - `none` — items cannot be selected\n * - `single` — only one item can be selected at a time\n * - `multiple` — multiple items can be selected\n * @attr selection\n */\n @property({ type: String, reflect: true })\n selection: TreeSelection = 'none';\n\n // ─── Internal State ───\n\n @state() private _currentIndex = 0;\n\n /** Tracks whether the tree has any visible items, to decide the container tabindex. */\n @state() private _hasVisibleItems = false;\n\n // ─── Internal Helpers ───\n\n /**\n * Returns a flat ordered list of all visible (not inside a collapsed item) hx-tree-items\n * in depth-first order.\n */\n private _getVisibleItems(): HelixTreeItem[] {\n return this._collectVisibleItems(this);\n }\n\n private _collectVisibleItems(container: Element): HelixTreeItem[] {\n const items: HelixTreeItem[] = [];\n for (const child of Array.from(container.children)) {\n if (child.tagName.toLowerCase() === 'hx-tree-item') {\n const item = child as HelixTreeItem;\n items.push(item);\n if (item.expanded) {\n items.push(...this._collectVisibleItems(item));\n }\n } else {\n items.push(...this._collectVisibleItems(child));\n }\n }\n return items;\n }\n\n private _getSelectedItems(): HelixTreeItem[] {\n return Array.from(this.querySelectorAll<HelixTreeItem>('hx-tree-item[selected]'));\n }\n\n /**\n * Updates the roving tabindex across all visible items so that only the\n * item at `activeIndex` has `tabindex=\"0\"`. All others receive `tabindex=\"-1\"`.\n * This is called whenever the active item changes (navigation, initial render).\n */\n private _updateRovingTabindex(items: HelixTreeItem[], activeIndex: number): void {\n items.forEach((item, i) => {\n item.setRovingActive(i === activeIndex);\n });\n }\n\n private _focusItem(index: number): void {\n const items = this._getVisibleItems();\n if (items.length === 0) return;\n const clamped = Math.max(0, Math.min(index, items.length - 1));\n this._currentIndex = clamped;\n this._updateRovingTabindex(items, clamped);\n items[clamped]?.focus();\n }\n\n // ─── Event Handling ───\n\n private _handleTreeItemSelect(e: Event): void {\n const event = e as CustomEvent<HxTreeItemSelectDetail>;\n const item = event.detail.item;\n\n if (this.selection === 'none') return;\n\n if (this.selection === 'single') {\n const wasSelected = item.selected;\n this._getSelectedItems().forEach((i) => {\n i.selected = false;\n });\n item.selected = !wasSelected;\n } else if (this.selection === 'multiple') {\n item.selected = !item.selected;\n }\n\n this.dispatchEvent(\n new CustomEvent<HxSelectDetail>('hx-select', {\n bubbles: true,\n composed: true,\n detail: { item, selected: item.selected },\n }),\n );\n }\n\n private _handleKeyDown(e: KeyboardEvent): void {\n const items = this._getVisibleItems();\n if (items.length === 0) return;\n\n let currentIndex = this._currentIndex;\n const focused = document.activeElement;\n\n for (let i = 0; i < items.length; i++) {\n if (items[i] === focused || items[i]?.shadowRoot?.activeElement) {\n currentIndex = i;\n break;\n }\n }\n\n switch (e.key) {\n case 'ArrowDown': {\n e.preventDefault();\n const next = currentIndex < items.length - 1 ? currentIndex + 1 : 0;\n this._focusItem(next);\n break;\n }\n case 'ArrowUp': {\n e.preventDefault();\n const prev = currentIndex > 0 ? currentIndex - 1 : items.length - 1;\n this._focusItem(prev);\n break;\n }\n case 'ArrowLeft': {\n e.preventDefault();\n const currentItem = items[currentIndex];\n if (!currentItem) break;\n if (currentItem.expanded && currentItem.hasChildItems) {\n currentItem.expanded = false;\n } else {\n const parentItem = currentItem.parentElement?.closest('hx-tree-item') as\n | HelixTreeItem\n | undefined;\n if (parentItem) {\n const parentIndex = items.indexOf(parentItem);\n if (parentIndex >= 0) {\n this._focusItem(parentIndex);\n }\n }\n }\n break;\n }\n case 'ArrowRight': {\n e.preventDefault();\n const currentItem = items[currentIndex];\n if (!currentItem) break;\n if (currentItem.hasChildItems) {\n if (!currentItem.expanded) {\n currentItem.expanded = true;\n } else {\n this._focusItem(currentIndex + 1);\n }\n }\n break;\n }\n case 'Home': {\n e.preventDefault();\n this._focusItem(0);\n break;\n }\n case 'End': {\n e.preventDefault();\n this._focusItem(items.length - 1);\n break;\n }\n }\n }\n\n private _handleFocusIn(e: FocusEvent): void {\n // With roving tabindex, the tree container (tabindex=\"-1\") should only receive\n // focus when the tree is empty. If focus does land on the container (e.g. the\n // tree is empty or programmatic focus), redirect to the active item if present.\n if (e.target === e.currentTarget) {\n const items = this._getVisibleItems();\n if (items.length > 0) {\n this._focusItem(this._currentIndex);\n }\n }\n }\n\n /**\n * Initializes the roving tabindex after items are first slotted in.\n * Ensures the active item (index 0 by default) has tabindex=\"0\" from the start,\n * so a Tab into the tree lands directly on the first item without a redirect.\n * Also updates `_hasVisibleItems` so the container tabindex re-renders correctly.\n */\n private _handleSlotChange(): void {\n const items = this._getVisibleItems();\n this._hasVisibleItems = items.length > 0;\n if (items.length === 0) return;\n // Clamp _currentIndex in case items were removed.\n const clamped = Math.min(this._currentIndex, items.length - 1);\n this._currentIndex = clamped;\n this._updateRovingTabindex(items, clamped);\n }\n\n // ─── Render ───\n\n override render() {\n // Roving tabindex pattern (WCAG 2.4.3 Fix):\n // The tree container is NOT a Tab stop (tabindex=\"-1\"). Tab focus goes\n // directly to the active item, which carries tabindex=\"0\". The container\n // is only a landing target (tabindex=\"0\") when the tree is empty.\n const containerTabindex = this._hasVisibleItems ? '-1' : '0';\n\n return html`\n <div\n part=\"tree\"\n class=\"tree\"\n role=\"tree\"\n tabindex=${containerTabindex}\n aria-label=${this.label || nothing}\n aria-multiselectable=${this.selection === 'multiple' ? 'true' : 'false'}\n @hx-tree-item-select=${this._handleTreeItemSelect}\n @keydown=${this._handleKeyDown}\n @focusin=${this._handleFocusIn}\n >\n <slot @slotchange=${this._handleSlotChange}></slot>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'hx-tree-view': HelixTreeView;\n }\n}\n\n/** Canonical type alias for HelixTreeView. Use this when typing hx-tree-view element references. */\nexport type HxTreeView = HelixTreeView;\n\n/** @deprecated Use {@link HxTreeView} instead. The `Wc` prefix was a legacy naming convention. */\nexport type WcTreeView = HelixTreeView;\n","import { css } from 'lit';\n\nexport const helixTreeItemStyles = css`\n :host {\n display: block;\n contain: layout style;\n }\n\n * {\n box-sizing: border-box;\n }\n\n /* ─── Item Container ─── */\n\n .item {\n display: block;\n }\n\n /* ─── Item Row ─── */\n\n .item-row {\n display: flex;\n align-items: center;\n gap: var(--hx-tree-item-gap, var(--hx-space-2, 0.5rem));\n padding: var(--hx-tree-item-padding-y, var(--hx-space-1, 0.25rem))\n var(--hx-tree-item-padding-x, var(--hx-space-2, 0.5rem));\n padding-left: calc(\n var(--hx-tree-item-padding-x, var(--hx-space-2, 0.5rem)) + var(--_indent-level, 0) *\n var(--hx-tree-indent-size, 1.5rem)\n );\n border-radius: var(--hx-tree-item-border-radius, var(--hx-border-radius-sm, 0.25rem));\n cursor: pointer;\n outline: none;\n color: var(--hx-tree-item-color, var(--hx-color-neutral-900, #111827));\n font-family: var(--hx-tree-item-font-family, var(--hx-font-family-sans, sans-serif));\n font-size: var(--hx-tree-item-font-size, var(--hx-font-size-sm, 0.875rem));\n line-height: var(--hx-line-height-normal, 1.5);\n transition: background-color var(--hx-transition-fast, 150ms ease);\n user-select: none;\n }\n\n .item-row:hover {\n background-color: var(--hx-tree-item-hover-bg, var(--hx-color-neutral-100, #f3f4f6));\n }\n\n .item-row:focus-visible {\n outline: var(--hx-focus-ring-width, 2px) solid var(--hx-focus-ring-color, #2563eb);\n outline-offset: var(--hx-focus-ring-offset, -2px);\n }\n\n /* ─── Selected State ─── */\n\n :host([selected]) .item-row {\n background-color: var(--hx-tree-item-selected-bg, var(--hx-color-primary-100, #dbeafe));\n color: var(--hx-tree-item-selected-color, var(--hx-color-primary-800, #1e40af));\n }\n\n :host([selected]) .item-row:hover {\n background-color: var(--hx-tree-item-selected-hover-bg, var(--hx-color-primary-200, #bfdbfe));\n }\n\n /* ─── Disabled State ─── */\n\n :host([disabled]) .item-row {\n opacity: 0.4;\n cursor: not-allowed;\n pointer-events: none;\n }\n\n /* ─── Expand Icon ─── */\n\n .expand-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: var(--hx-space-4, 1rem);\n height: var(--hx-space-4, 1rem);\n }\n\n .expand-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: var(--hx-space-4, 1rem);\n height: var(--hx-space-4, 1rem);\n padding: 0;\n border: none;\n background: transparent;\n color: var(--hx-tree-item-expand-icon-color, var(--hx-color-neutral-500, #6b7280));\n cursor: pointer;\n border-radius: var(--hx-border-radius-sm, 0.25rem);\n transition: transform var(--hx-transition-fast, 150ms ease);\n pointer-events: auto;\n }\n\n .expand-btn:hover {\n background-color: var(\n --hx-tree-item-expand-hover-bg,\n var(--hx-overlay-black-6, rgba(0, 0, 0, 0.06))\n );\n }\n\n .expand-btn svg {\n width: var(--hx-space-3, 0.75rem);\n height: var(--hx-space-3, 0.75rem);\n stroke: currentColor;\n fill: none;\n stroke-width: 2;\n stroke-linecap: round;\n stroke-linejoin: round;\n transition: transform var(--hx-transition-fast, 150ms ease);\n }\n\n :host([expanded]) .expand-btn svg {\n transform: rotate(90deg);\n }\n\n .expand-placeholder {\n display: block;\n width: var(--hx-space-4, 1rem);\n flex-shrink: 0;\n }\n\n /* ─── Icon Slot ─── */\n\n .item-icon {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n color: var(--hx-tree-item-icon-color, var(--hx-color-neutral-500, #6b7280));\n }\n\n .item-icon:empty {\n display: none;\n }\n\n /* ─── Label ─── */\n\n .item-label {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n /* ─── Children (animated) ─── */\n\n .children {\n display: grid;\n grid-template-rows: 0fr;\n transition: grid-template-rows var(--hx-transition-base, 200ms ease);\n --_indent-level: calc(var(--_indent-level, 0) + 1);\n }\n\n .children--expanded {\n grid-template-rows: 1fr;\n }\n\n @media (prefers-reduced-motion: reduce) {\n .item-row,\n .expand-btn,\n .expand-btn svg,\n .children {\n transition: none;\n }\n }\n\n .children-inner {\n overflow: hidden;\n }\n`;\n","import { LitElement, html, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { tokenStyles } from '@helixui/tokens/lit';\nimport { helixTreeItemStyles } from './hx-tree-item.styles.js';\n\n/** Detail type for the `hx-tree-item-select` event. */\nexport interface HxTreeItemSelectDetail {\n /** The tree item that was selected or activated. */\n item: HelixTreeItem;\n}\n\n/**\n * A tree item used within an hx-tree-view component.\n * Supports expand/collapse, selection, keyboard navigation, and icon/children slots.\n *\n * @summary Individual item within an hx-tree-view hierarchical tree.\n *\n * @tag hx-tree-item\n *\n * @slot - Default slot for the item label content.\n * @slot icon - Custom icon shown before the label.\n * @slot children - Nested hx-tree-item elements for sub-tree.\n *\n * @csspart item - The outer item container.\n * @csspart row - The interactive item row (contains expand icon, icon slot, and label).\n * @csspart expand-icon - The expand/collapse toggle button.\n * @csspart label - The label text content area.\n * @csspart children - The children container.\n *\n * @cssprop [--hx-tree-item-color=var(--hx-color-neutral-900)] - Item text color.\n * @cssprop [--hx-tree-item-hover-bg=var(--hx-color-neutral-100)] - Hover background color.\n * @cssprop [--hx-tree-item-selected-bg=var(--hx-color-primary-100)] - Selected background color.\n * @cssprop [--hx-tree-item-selected-color=var(--hx-color-primary-800)] - Selected text color.\n * @cssprop [--hx-tree-item-padding-x=var(--hx-space-2)] - Horizontal padding.\n * @cssprop [--hx-tree-item-padding-y=var(--hx-space-1)] - Vertical padding.\n * @cssprop [--hx-tree-indent-size=1.5rem] - Indentation size per level.\n *\n * @fires {CustomEvent<HxTreeItemSelectDetail>} hx-tree-item-select - Dispatched when this item is clicked or activated via keyboard.\n */\n@customElement('hx-tree-item')\nexport class HelixTreeItem extends LitElement {\n static override styles = [tokenStyles, helixTreeItemStyles];\n\n // ─── Properties ───\n\n /**\n * Whether the item is expanded (showing children).\n * @attr expanded\n */\n @property({ type: Boolean, reflect: true })\n expanded = false;\n\n /**\n * Whether the item is selected.\n * @attr selected\n */\n @property({ type: Boolean, reflect: true })\n selected = false;\n\n /**\n * Whether the item is disabled (non-interactive).\n * @attr disabled\n */\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n // ─── Internal State ───\n\n /**\n * Tracks whether any elements are assigned to the children slot, controlling expand icon visibility.\n * @internal\n */\n @state() private _hasChildren = false;\n\n /**\n * Whether this item is the roving-tabindex active item in the tree.\n * @internal\n */\n @state() private _rovingActive = false;\n\n /**\n * Cached ARIA position metadata. Computed once on connect and on slotchange\n * of the parent container, avoiding repeated DOM traversal on every render.\n * @internal\n */\n @state() private _level = 1;\n /**\n * One-based position of this item within its sibling set, set as aria-posinset.\n * @internal\n */\n @state() private _posInSet = 1;\n /**\n * Total count of sibling hx-tree-item elements at the same level, set as aria-setsize.\n * @internal\n */\n @state() private _setSize = 1;\n /**\n * Whether the owning hx-tree-view supports item selection (single or multiple mode).\n * @internal\n */\n @state() private _selectable = false;\n\n // ─── Computed ARIA ───\n\n /**\n * Whether this item has slotted children.\n * @returns True if one or more elements are assigned to the children slot.\n */\n get hasChildItems(): boolean {\n return this._hasChildren;\n }\n\n /**\n * Recompute all cached ARIA metadata in a single DOM pass.\n * Called on connect, slotchange, and whenever structural context may change.\n * @internal\n */\n private _updateAriaMetadata(): void {\n // Compute nesting level by counting ancestor hx-tree-item elements.\n let level = 1;\n let el: Element | null = this.parentElement;\n while (el) {\n if (el.tagName.toLowerCase() === 'hx-tree-item') level++;\n el = el.parentElement;\n }\n this._level = level;\n\n // Compute position-in-set and set-size from sibling hx-tree-item elements.\n const parent = this.parentElement;\n if (parent) {\n const siblings = Array.from(parent.children).filter(\n (c) => c.tagName.toLowerCase() === 'hx-tree-item',\n );\n this._posInSet = siblings.indexOf(this) + 1;\n this._setSize = siblings.length;\n } else {\n this._posInSet = 1;\n this._setSize = 1;\n }\n\n // Determine if the owning tree supports selection.\n const tree = this.closest('hx-tree-view');\n if (tree) {\n const selection = tree.getAttribute('selection');\n this._selectable = selection === 'single' || selection === 'multiple';\n } else {\n this._selectable = false;\n }\n }\n\n // ─── Lifecycle ───\n\n override connectedCallback(): void {\n super.connectedCallback();\n this._updateAriaMetadata();\n }\n\n // ─── Children Detection ───\n\n /**\n * Updates _hasChildren and recomputes ARIA metadata when the children slot assignment changes.\n * @internal\n */\n private _handleChildrenSlotChange(e: Event): void {\n const slot = e.target as HTMLSlotElement;\n this._hasChildren = slot.assignedElements().length > 0;\n this._updateAriaMetadata();\n }\n\n // ─── Event Handlers ───\n\n /**\n * Toggles the expanded state when the expand/collapse button is clicked, stopping event propagation.\n * @internal\n */\n private _handleExpandClick(e: Event): void {\n e.stopPropagation();\n if (this.disabled) return;\n this.expanded = !this.expanded;\n }\n\n /**\n * Dispatches the hx-tree-item-select event when the item is activated via click or keyboard.\n * @internal\n */\n private _handleRowClick(): void {\n if (this.disabled) return;\n this.dispatchEvent(\n new CustomEvent<HxTreeItemSelectDetail>('hx-tree-item-select', {\n bubbles: true,\n composed: true,\n detail: { item: this },\n }),\n );\n }\n\n /**\n * Handles keyboard interaction for the tree item, including expand/collapse, activation, and delegation of list-navigation keys to the parent tree.\n * @internal\n */\n private _handleKeyDown(e: KeyboardEvent): void {\n if (this.disabled) return;\n\n switch (e.key) {\n case 'ArrowRight':\n e.preventDefault();\n if (this._hasChildren && !this.expanded) {\n this.expanded = true;\n }\n break;\n case 'ArrowLeft':\n e.preventDefault();\n if (this._hasChildren && this.expanded) {\n this.expanded = false;\n }\n break;\n case 'Enter':\n case ' ':\n e.preventDefault();\n this._handleRowClick();\n break;\n case 'ArrowDown':\n case 'ArrowUp':\n case 'Home':\n case 'End':\n // Bubble up to hx-tree-view for navigation\n break;\n }\n }\n\n // ─── Public API ───\n\n /**\n * Sets the roving tabindex state for this item.\n * When `active` is true, the item row gets `tabindex=\"0\"` making it the\n * Tab-reachable item in the tree. All other items should be set to false.\n * Called by the parent hx-tree-view to manage the roving tabindex pattern.\n */\n setRovingActive(active: boolean): void {\n this._rovingActive = active;\n }\n\n /** Focus this item's interactive row element. */\n override focus(): void {\n const row = this.shadowRoot?.querySelector<HTMLElement>('.item-row');\n row?.focus();\n }\n\n // ─── Render ───\n\n /**\n * Renders the expand/collapse chevron button, or a placeholder span when the item has no children.\n * @internal\n */\n private _renderExpandIcon() {\n if (!this._hasChildren) {\n return html`<span class=\"expand-placeholder\" aria-hidden=\"true\"></span>`;\n }\n return html`\n <button\n part=\"expand-icon\"\n class=\"expand-btn\"\n tabindex=\"-1\"\n aria-label=\"${this.expanded ? 'Collapse' : 'Expand'}\"\n @click=${this._handleExpandClick}\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <polyline points=\"6 4 10 8 6 12\" />\n </svg>\n </button>\n `;\n }\n\n override render() {\n const ariaExpanded = this._hasChildren ? String(this.expanded) : nothing;\n const ariaSelected = this._selectable ? String(this.selected) : nothing;\n\n return html`\n <div part=\"item\" class=\"item\">\n <div\n part=\"row\"\n class=\"item-row\"\n role=\"treeitem\"\n tabindex=${this._rovingActive ? '0' : '-1'}\n aria-expanded=${ariaExpanded}\n aria-selected=${ariaSelected}\n aria-disabled=${this.disabled ? 'true' : nothing}\n aria-level=${this._level}\n aria-posinset=${this._posInSet}\n aria-setsize=${this._setSize}\n @click=${this._handleRowClick}\n @keydown=${this._handleKeyDown}\n >\n ${this._renderExpandIcon()}\n <span class=\"item-icon\">\n <slot name=\"icon\"></slot>\n </span>\n <span part=\"label\" class=\"item-label\">\n <slot></slot>\n </span>\n </div>\n <div\n part=\"children\"\n class=\"children ${this.expanded ? 'children--expanded' : ''}\"\n role=\"group\"\n >\n <div class=\"children-inner\">\n <slot name=\"children\" @slotchange=${this._handleChildrenSlotChange}></slot>\n </div>\n </div>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'hx-tree-item': HelixTreeItem;\n }\n}\n\n/** Canonical type alias for HelixTreeItem. Use this when typing hx-tree-item element references. */\nexport type HxTreeItem = HelixTreeItem;\n\n/** @deprecated Use {@link HxTreeItem} instead. The `Wc` prefix was a legacy naming convention. */\nexport type WcTreeItem = HelixTreeItem;\n"],"names":["helixTreeViewStyles","css","HelixTreeView","LitElement","container","items","child","item","activeIndex","index","clamped","_a","wasSelected","i","currentIndex","focused","_b","next","prev","currentItem","parentItem","_c","parentIndex","containerTabindex","html","nothing","tokenStyles","__decorateClass","property","state","customElement","helixTreeItemStyles","HelixTreeItem","level","el","parent","siblings","c","tree","selection","slot","active","row","ariaExpanded","ariaSelected"],"mappings":"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"}