@helixui/library 1.0.0 → 1.1.1

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 (483) hide show
  1. package/custom-elements.json +1901 -8476
  2. package/dist/components/hx-accordion/hx-accordion-item.d.ts +27 -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 +3 -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 +13 -3
  8. package/dist/components/hx-action-bar/hx-action-bar.d.ts.map +1 -1
  9. package/dist/components/hx-action-bar/index.js +1 -1
  10. package/dist/components/hx-alert/hx-alert.d.ts +30 -0
  11. package/dist/components/hx-alert/hx-alert.d.ts.map +1 -1
  12. package/dist/components/hx-alert/hx-alert.styles.d.ts.map +1 -1
  13. package/dist/components/hx-alert/index.js +1 -1
  14. package/dist/components/hx-avatar/hx-avatar.d.ts +8 -1
  15. package/dist/components/hx-avatar/hx-avatar.d.ts.map +1 -1
  16. package/dist/components/hx-avatar/index.js +1 -1
  17. package/dist/components/hx-badge/hx-badge.d.ts +10 -1
  18. package/dist/components/hx-badge/hx-badge.d.ts.map +1 -1
  19. package/dist/components/hx-badge/hx-badge.styles.d.ts.map +1 -1
  20. package/dist/components/hx-badge/index.js +1 -1
  21. package/dist/components/hx-banner/hx-banner.d.ts +17 -0
  22. package/dist/components/hx-banner/hx-banner.d.ts.map +1 -1
  23. package/dist/components/hx-banner/index.js +1 -1
  24. package/dist/components/hx-breadcrumb/hx-breadcrumb-item.styles.d.ts.map +1 -1
  25. package/dist/components/hx-breadcrumb/hx-breadcrumb.d.ts +17 -2
  26. package/dist/components/hx-breadcrumb/hx-breadcrumb.d.ts.map +1 -1
  27. package/dist/components/hx-breadcrumb/index.js +1 -1
  28. package/dist/components/hx-button/hx-button.d.ts +6 -0
  29. package/dist/components/hx-button/hx-button.d.ts.map +1 -1
  30. package/dist/components/hx-button/hx-button.styles.d.ts.map +1 -1
  31. package/dist/components/hx-button/index.js +1 -1
  32. package/dist/components/hx-card/hx-card.d.ts +8 -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-item.d.ts +2 -0
  37. package/dist/components/hx-carousel/hx-carousel-item.d.ts.map +1 -1
  38. package/dist/components/hx-carousel/hx-carousel-item.styles.d.ts +2 -0
  39. package/dist/components/hx-carousel/hx-carousel-item.styles.d.ts.map +1 -0
  40. package/dist/components/hx-carousel/hx-carousel.d.ts +27 -0
  41. package/dist/components/hx-carousel/hx-carousel.d.ts.map +1 -1
  42. package/dist/components/hx-carousel/hx-carousel.styles.d.ts.map +1 -1
  43. package/dist/components/hx-carousel/index.js +1 -1
  44. package/dist/components/hx-checkbox/hx-checkbox.d.ts +18 -2
  45. package/dist/components/hx-checkbox/hx-checkbox.d.ts.map +1 -1
  46. package/dist/components/hx-checkbox/hx-checkbox.styles.d.ts.map +1 -1
  47. package/dist/components/hx-checkbox/index.js +1 -1
  48. package/dist/components/hx-checkbox-group/hx-checkbox-group.d.ts +20 -4
  49. package/dist/components/hx-checkbox-group/hx-checkbox-group.d.ts.map +1 -1
  50. package/dist/components/hx-checkbox-group/index.js +1 -1
  51. package/dist/components/hx-code-snippet/hx-code-snippet.d.ts +10 -0
  52. package/dist/components/hx-code-snippet/hx-code-snippet.d.ts.map +1 -1
  53. package/dist/components/hx-code-snippet/hx-code-snippet.styles.d.ts.map +1 -1
  54. package/dist/components/hx-code-snippet/index.js +1 -1
  55. package/dist/components/hx-color-picker/hx-color-picker.d.ts +114 -12
  56. package/dist/components/hx-color-picker/hx-color-picker.d.ts.map +1 -1
  57. package/dist/components/hx-color-picker/hx-color-picker.styles.d.ts.map +1 -1
  58. package/dist/components/hx-color-picker/index.js +1 -1
  59. package/dist/components/hx-combobox/hx-combobox.d.ts +37 -2
  60. package/dist/components/hx-combobox/hx-combobox.d.ts.map +1 -1
  61. package/dist/components/hx-combobox/hx-combobox.styles.d.ts.map +1 -1
  62. package/dist/components/hx-combobox/index.js +1 -1
  63. package/dist/components/hx-copy-button/hx-copy-button.d.ts +11 -0
  64. package/dist/components/hx-copy-button/hx-copy-button.d.ts.map +1 -1
  65. package/dist/components/hx-copy-button/index.js +1 -1
  66. package/dist/components/hx-counter/hx-counter.d.ts +12 -3
  67. package/dist/components/hx-counter/hx-counter.d.ts.map +1 -1
  68. package/dist/components/hx-counter/index.js +1 -1
  69. package/dist/components/hx-data-table/hx-data-table.d.ts +27 -2
  70. package/dist/components/hx-data-table/hx-data-table.d.ts.map +1 -1
  71. package/dist/components/hx-data-table/hx-data-table.styles.d.ts.map +1 -1
  72. package/dist/components/hx-data-table/index.js +1 -1
  73. package/dist/components/hx-date-picker/hx-date-picker.d.ts +42 -3
  74. package/dist/components/hx-date-picker/hx-date-picker.d.ts.map +1 -1
  75. package/dist/components/hx-date-picker/hx-date-picker.styles.d.ts.map +1 -1
  76. package/dist/components/hx-date-picker/index.js +1 -1
  77. package/dist/components/hx-dialog/hx-dialog.d.ts +31 -4
  78. package/dist/components/hx-dialog/hx-dialog.d.ts.map +1 -1
  79. package/dist/components/hx-dialog/hx-dialog.styles.d.ts.map +1 -1
  80. package/dist/components/hx-dialog/index.js +1 -1
  81. package/dist/components/hx-divider/hx-divider.d.ts +4 -1
  82. package/dist/components/hx-divider/hx-divider.d.ts.map +1 -1
  83. package/dist/components/hx-divider/index.js +1 -1
  84. package/dist/components/hx-drawer/hx-drawer.d.ts +25 -3
  85. package/dist/components/hx-drawer/hx-drawer.d.ts.map +1 -1
  86. package/dist/components/hx-drawer/hx-drawer.styles.d.ts.map +1 -1
  87. package/dist/components/hx-drawer/index.js +1 -1
  88. package/dist/components/hx-dropdown/hx-dropdown.d.ts +35 -7
  89. package/dist/components/hx-dropdown/hx-dropdown.d.ts.map +1 -1
  90. package/dist/components/hx-dropdown/index.js +1 -1
  91. package/dist/components/hx-field/hx-field.d.ts +10 -2
  92. package/dist/components/hx-field/hx-field.d.ts.map +1 -1
  93. package/dist/components/hx-field/index.js +1 -1
  94. package/dist/components/hx-file-upload/hx-file-upload.d.ts +39 -2
  95. package/dist/components/hx-file-upload/hx-file-upload.d.ts.map +1 -1
  96. package/dist/components/hx-file-upload/hx-file-upload.styles.d.ts.map +1 -1
  97. package/dist/components/hx-file-upload/index.js +1 -1
  98. package/dist/components/hx-form/hx-form.d.ts.map +1 -1
  99. package/dist/components/hx-form/index.js +1 -1
  100. package/dist/components/hx-format-date/hx-format-date.d.ts +8 -0
  101. package/dist/components/hx-format-date/hx-format-date.d.ts.map +1 -1
  102. package/dist/components/hx-format-date/index.js +1 -1
  103. package/dist/components/hx-grid/hx-grid.d.ts +9 -3
  104. package/dist/components/hx-grid/hx-grid.d.ts.map +1 -1
  105. package/dist/components/hx-grid/index.js +1 -1
  106. package/dist/components/hx-help-text/index.js +1 -1
  107. package/dist/components/hx-icon/hx-icon.d.ts +10 -2
  108. package/dist/components/hx-icon/hx-icon.d.ts.map +1 -1
  109. package/dist/components/hx-icon/index.js +1 -1
  110. package/dist/components/hx-icon-button/hx-icon-button.d.ts +11 -0
  111. package/dist/components/hx-icon-button/hx-icon-button.d.ts.map +1 -1
  112. package/dist/components/hx-icon-button/hx-icon-button.styles.d.ts.map +1 -1
  113. package/dist/components/hx-icon-button/index.js +1 -1
  114. package/dist/components/hx-image/hx-image.d.ts +8 -0
  115. package/dist/components/hx-image/hx-image.d.ts.map +1 -1
  116. package/dist/components/hx-image/index.js +1 -1
  117. package/dist/components/hx-link/hx-link.d.ts +3 -0
  118. package/dist/components/hx-link/hx-link.d.ts.map +1 -1
  119. package/dist/components/hx-link/hx-link.styles.d.ts.map +1 -1
  120. package/dist/components/hx-link/index.js +1 -1
  121. package/dist/components/hx-list/hx-list-item.d.ts +8 -2
  122. package/dist/components/hx-list/hx-list-item.d.ts.map +1 -1
  123. package/dist/components/hx-list/hx-list-item.styles.d.ts.map +1 -1
  124. package/dist/components/hx-list/hx-list.d.ts +6 -2
  125. package/dist/components/hx-list/hx-list.d.ts.map +1 -1
  126. package/dist/components/hx-list/index.js +1 -1
  127. package/dist/components/hx-menu/hx-menu-item.d.ts +12 -0
  128. package/dist/components/hx-menu/hx-menu-item.d.ts.map +1 -1
  129. package/dist/components/hx-menu/hx-menu-item.styles.d.ts.map +1 -1
  130. package/dist/components/hx-menu/hx-menu.d.ts +11 -1
  131. package/dist/components/hx-menu/hx-menu.d.ts.map +1 -1
  132. package/dist/components/hx-menu/index.js +1 -1
  133. package/dist/components/hx-meter/hx-meter.d.ts +9 -0
  134. package/dist/components/hx-meter/hx-meter.d.ts.map +1 -1
  135. package/dist/components/hx-meter/hx-meter.styles.d.ts.map +1 -1
  136. package/dist/components/hx-meter/index.js +1 -1
  137. package/dist/components/hx-nav/hx-nav.d.ts +15 -0
  138. package/dist/components/hx-nav/hx-nav.d.ts.map +1 -1
  139. package/dist/components/hx-nav/hx-nav.styles.d.ts.map +1 -1
  140. package/dist/components/hx-nav/index.js +1 -1
  141. package/dist/components/hx-number-input/hx-number-input.d.ts +36 -1
  142. package/dist/components/hx-number-input/hx-number-input.d.ts.map +1 -1
  143. package/dist/components/hx-number-input/index.js +1 -1
  144. package/dist/components/hx-overflow-menu/hx-overflow-menu.d.ts +15 -0
  145. package/dist/components/hx-overflow-menu/hx-overflow-menu.d.ts.map +1 -1
  146. package/dist/components/hx-overflow-menu/hx-overflow-menu.styles.d.ts.map +1 -1
  147. package/dist/components/hx-overflow-menu/index.js +1 -1
  148. package/dist/components/hx-pagination/hx-pagination.d.ts +24 -0
  149. package/dist/components/hx-pagination/hx-pagination.d.ts.map +1 -1
  150. package/dist/components/hx-pagination/hx-pagination.styles.d.ts.map +1 -1
  151. package/dist/components/hx-pagination/index.js +1 -1
  152. package/dist/components/hx-popover/hx-popover.d.ts +94 -11
  153. package/dist/components/hx-popover/hx-popover.d.ts.map +1 -1
  154. package/dist/components/hx-popover/hx-popover.styles.d.ts.map +1 -1
  155. package/dist/components/hx-popover/index.js +1 -1
  156. package/dist/components/hx-popup/hx-popup.d.ts +8 -0
  157. package/dist/components/hx-popup/hx-popup.d.ts.map +1 -1
  158. package/dist/components/hx-popup/hx-popup.styles.d.ts.map +1 -1
  159. package/dist/components/hx-popup/index.js +1 -1
  160. package/dist/components/hx-progress-bar/hx-progress-bar.d.ts +10 -2
  161. package/dist/components/hx-progress-bar/hx-progress-bar.d.ts.map +1 -1
  162. package/dist/components/hx-progress-bar/hx-progress-bar.styles.d.ts.map +1 -1
  163. package/dist/components/hx-progress-bar/index.js +1 -1
  164. package/dist/components/hx-progress-ring/hx-progress-ring.d.ts +8 -2
  165. package/dist/components/hx-progress-ring/hx-progress-ring.d.ts.map +1 -1
  166. package/dist/components/hx-progress-ring/index.js +1 -1
  167. package/dist/components/hx-prose/hx-prose.d.ts +5 -3
  168. package/dist/components/hx-prose/hx-prose.d.ts.map +1 -1
  169. package/dist/components/hx-prose/index.js +1 -1
  170. package/dist/components/hx-radio-group/hx-radio-group.d.ts.map +1 -1
  171. package/dist/components/hx-radio-group/hx-radio.d.ts +4 -2
  172. package/dist/components/hx-radio-group/hx-radio.d.ts.map +1 -1
  173. package/dist/components/hx-radio-group/index.js +1 -1
  174. package/dist/components/hx-rating/hx-rating.d.ts +54 -2
  175. package/dist/components/hx-rating/hx-rating.d.ts.map +1 -1
  176. package/dist/components/hx-rating/index.js +1 -1
  177. package/dist/components/hx-select/hx-select.d.ts +22 -2
  178. package/dist/components/hx-select/hx-select.d.ts.map +1 -1
  179. package/dist/components/hx-select/hx-select.styles.d.ts.map +1 -1
  180. package/dist/components/hx-select/index.js +1 -1
  181. package/dist/components/hx-side-nav/hx-nav-item.d.ts +6 -0
  182. package/dist/components/hx-side-nav/hx-nav-item.d.ts.map +1 -1
  183. package/dist/components/hx-side-nav/hx-nav-item.styles.d.ts.map +1 -1
  184. package/dist/components/hx-side-nav/hx-side-nav.d.ts +6 -1
  185. package/dist/components/hx-side-nav/hx-side-nav.d.ts.map +1 -1
  186. package/dist/components/hx-side-nav/hx-side-nav.styles.d.ts.map +1 -1
  187. package/dist/components/hx-side-nav/index.js +1 -1
  188. package/dist/components/hx-slider/hx-slider.d.ts +22 -1
  189. package/dist/components/hx-slider/hx-slider.d.ts.map +1 -1
  190. package/dist/components/hx-slider/hx-slider.styles.d.ts.map +1 -1
  191. package/dist/components/hx-slider/index.js +1 -1
  192. package/dist/components/hx-spinner/hx-spinner.d.ts +3 -1
  193. package/dist/components/hx-spinner/hx-spinner.d.ts.map +1 -1
  194. package/dist/components/hx-spinner/index.js +1 -1
  195. package/dist/components/hx-split-button/hx-split-button.d.ts +12 -0
  196. package/dist/components/hx-split-button/hx-split-button.d.ts.map +1 -1
  197. package/dist/components/hx-split-button/index.js +1 -1
  198. package/dist/components/hx-split-panel/hx-split-panel.d.ts +72 -13
  199. package/dist/components/hx-split-panel/hx-split-panel.d.ts.map +1 -1
  200. package/dist/components/hx-split-panel/hx-split-panel.styles.d.ts.map +1 -1
  201. package/dist/components/hx-split-panel/index.js +1 -1
  202. package/dist/components/hx-stack/index.js +1 -1
  203. package/dist/components/hx-stat/hx-stat.d.ts +5 -1
  204. package/dist/components/hx-stat/hx-stat.d.ts.map +1 -1
  205. package/dist/components/hx-stat/index.js +1 -1
  206. package/dist/components/hx-status-indicator/hx-status-indicator.d.ts +13 -12
  207. package/dist/components/hx-status-indicator/hx-status-indicator.d.ts.map +1 -1
  208. package/dist/components/hx-status-indicator/index.js +1 -1
  209. package/dist/components/hx-steps/hx-step.d.ts +7 -9
  210. package/dist/components/hx-steps/hx-step.d.ts.map +1 -1
  211. package/dist/components/hx-steps/hx-step.styles.d.ts.map +1 -1
  212. package/dist/components/hx-steps/hx-steps.d.ts +3 -3
  213. package/dist/components/hx-steps/hx-steps.d.ts.map +1 -1
  214. package/dist/components/hx-steps/index.js +1 -1
  215. package/dist/components/hx-switch/hx-switch.d.ts +21 -1
  216. package/dist/components/hx-switch/hx-switch.d.ts.map +1 -1
  217. package/dist/components/hx-switch/index.js +1 -1
  218. package/dist/components/hx-table/hx-table.d.ts +7 -2
  219. package/dist/components/hx-table/hx-table.d.ts.map +1 -1
  220. package/dist/components/hx-table/hx-table.styles.d.ts.map +1 -1
  221. package/dist/components/hx-table/hx-th.d.ts +4 -0
  222. package/dist/components/hx-table/hx-th.d.ts.map +1 -1
  223. package/dist/components/hx-table/index.js +1 -1
  224. package/dist/components/hx-tabs/hx-tab.d.ts +3 -0
  225. package/dist/components/hx-tabs/hx-tab.d.ts.map +1 -1
  226. package/dist/components/hx-tabs/hx-tabs.d.ts +6 -0
  227. package/dist/components/hx-tabs/hx-tabs.d.ts.map +1 -1
  228. package/dist/components/hx-tabs/index.js +1 -1
  229. package/dist/components/hx-tag/hx-tag.d.ts +4 -0
  230. package/dist/components/hx-tag/hx-tag.d.ts.map +1 -1
  231. package/dist/components/hx-tag/hx-tag.styles.d.ts.map +1 -1
  232. package/dist/components/hx-tag/index.js +1 -1
  233. package/dist/components/hx-text/hx-text.d.ts +1 -0
  234. package/dist/components/hx-text/hx-text.d.ts.map +1 -1
  235. package/dist/components/hx-text/index.js +1 -1
  236. package/dist/components/hx-text-input/hx-text-input.d.ts +9 -4
  237. package/dist/components/hx-text-input/hx-text-input.d.ts.map +1 -1
  238. package/dist/components/hx-text-input/index.js +1 -1
  239. package/dist/components/hx-textarea/hx-textarea.d.ts +9 -3
  240. package/dist/components/hx-textarea/hx-textarea.d.ts.map +1 -1
  241. package/dist/components/hx-textarea/hx-textarea.styles.d.ts.map +1 -1
  242. package/dist/components/hx-textarea/index.js +1 -1
  243. package/dist/components/hx-theme/hx-theme.d.ts +2 -2
  244. package/dist/components/hx-theme/hx-theme.d.ts.map +1 -1
  245. package/dist/components/hx-time-picker/hx-time-picker.d.ts +102 -22
  246. package/dist/components/hx-time-picker/hx-time-picker.d.ts.map +1 -1
  247. package/dist/components/hx-time-picker/hx-time-picker.styles.d.ts.map +1 -1
  248. package/dist/components/hx-time-picker/index.js +1 -1
  249. package/dist/components/hx-toast/hx-toast.d.ts +18 -0
  250. package/dist/components/hx-toast/hx-toast.d.ts.map +1 -1
  251. package/dist/components/hx-toast/hx-toast.styles.d.ts.map +1 -1
  252. package/dist/components/hx-toast/index.js +1 -1
  253. package/dist/components/hx-toggle-button/hx-toggle-button.d.ts +23 -0
  254. package/dist/components/hx-toggle-button/hx-toggle-button.d.ts.map +1 -1
  255. package/dist/components/hx-toggle-button/index.js +1 -1
  256. package/dist/components/hx-tooltip/hx-tooltip.d.ts +57 -0
  257. package/dist/components/hx-tooltip/hx-tooltip.d.ts.map +1 -1
  258. package/dist/components/hx-tooltip/index.js +1 -1
  259. package/dist/components/hx-top-nav/hx-top-nav.d.ts +4 -0
  260. package/dist/components/hx-top-nav/hx-top-nav.d.ts.map +1 -1
  261. package/dist/components/hx-top-nav/index.js +1 -1
  262. package/dist/components/hx-tree-view/hx-tree-item.d.ts +13 -1
  263. package/dist/components/hx-tree-view/hx-tree-item.d.ts.map +1 -1
  264. package/dist/components/hx-tree-view/hx-tree-item.styles.d.ts.map +1 -1
  265. package/dist/components/hx-tree-view/hx-tree-view.d.ts +12 -0
  266. package/dist/components/hx-tree-view/hx-tree-view.d.ts.map +1 -1
  267. package/dist/components/hx-tree-view/index.js +1 -1
  268. package/dist/index.js +70 -70
  269. package/dist/shared/{hx-accordion-Cyswa6J3.js → hx-accordion-D1kFhdeQ.js} +68 -39
  270. package/dist/shared/hx-accordion-D1kFhdeQ.js.map +1 -0
  271. package/dist/shared/{hx-action-bar-we_WJety.js → hx-action-bar-D4bulGQP.js} +38 -31
  272. package/dist/shared/hx-action-bar-D4bulGQP.js.map +1 -0
  273. package/dist/shared/{hx-alert-Cg-zxRiU.js → hx-alert-K5F8KeqI.js} +123 -40
  274. package/dist/shared/hx-alert-K5F8KeqI.js.map +1 -0
  275. package/dist/shared/{hx-avatar-Cep6Urm3.js → hx-avatar-Cun-O99h.js} +5 -1
  276. package/dist/shared/hx-avatar-Cun-O99h.js.map +1 -0
  277. package/dist/shared/{hx-badge-CjT0d8NK.js → hx-badge-CsFd2xtw.js} +83 -47
  278. package/dist/shared/hx-badge-CsFd2xtw.js.map +1 -0
  279. package/dist/shared/{hx-banner-lxAIJ2kR.js → hx-banner-BTV-X2xF.js} +58 -42
  280. package/dist/shared/hx-banner-BTV-X2xF.js.map +1 -0
  281. package/dist/shared/{hx-breadcrumb-item-C0rz0fzV.js → hx-breadcrumb-item-4IwaLgaO.js} +39 -23
  282. package/dist/shared/hx-breadcrumb-item-4IwaLgaO.js.map +1 -0
  283. package/dist/shared/{hx-button-Cbhqpm5i.js → hx-button-7k-KeCYU.js} +29 -15
  284. package/dist/shared/hx-button-7k-KeCYU.js.map +1 -0
  285. package/dist/shared/{hx-card-Bg4W4uXC.js → hx-card-0hT3G5hi.js} +24 -13
  286. package/dist/shared/hx-card-0hT3G5hi.js.map +1 -0
  287. package/dist/shared/{hx-carousel-item-BKpmFbUT.js → hx-carousel-item-DgeYyYZJ.js} +138 -107
  288. package/dist/shared/hx-carousel-item-DgeYyYZJ.js.map +1 -0
  289. package/dist/shared/{hx-checkbox-BMayOpAM.js → hx-checkbox-BvjO-O41.js} +15 -6
  290. package/dist/shared/hx-checkbox-BvjO-O41.js.map +1 -0
  291. package/dist/shared/{hx-checkbox-group-ydUdV9Sx.js → hx-checkbox-group-Z5VvWzcj.js} +50 -37
  292. package/dist/shared/hx-checkbox-group-Z5VvWzcj.js.map +1 -0
  293. package/dist/shared/{hx-code-snippet-B4hV7rWG.js → hx-code-snippet-DqzPkH4K.js} +27 -11
  294. package/dist/shared/hx-code-snippet-DqzPkH4K.js.map +1 -0
  295. package/dist/shared/hx-color-picker-Da8z6AlQ.js +596 -0
  296. package/dist/shared/hx-color-picker-Da8z6AlQ.js.map +1 -0
  297. package/dist/shared/{hx-combobox-BBi3izKJ.js → hx-combobox-CivfelTS.js} +67 -430
  298. package/dist/shared/hx-combobox-CivfelTS.js.map +1 -0
  299. package/dist/shared/{hx-copy-button-CLBA31to.js → hx-copy-button--0dymSvw.js} +9 -1
  300. package/dist/shared/{hx-copy-button-CLBA31to.js.map → hx-copy-button--0dymSvw.js.map} +1 -1
  301. package/dist/shared/{hx-counter-D-1NXzGs.js → hx-counter-Duf00H7p.js} +58 -49
  302. package/dist/shared/hx-counter-Duf00H7p.js.map +1 -0
  303. package/dist/shared/{hx-data-table-DNiDVWR2.js → hx-data-table-DujB9hSE.js} +173 -129
  304. package/dist/shared/hx-data-table-DujB9hSE.js.map +1 -0
  305. package/dist/shared/{hx-date-picker-D7yCK0nk.js → hx-date-picker-C8d2HtRV.js} +142 -505
  306. package/dist/shared/hx-date-picker-C8d2HtRV.js.map +1 -0
  307. package/dist/shared/{hx-dialog-Z7Ou_AZ9.js → hx-dialog-DkUSnVgw.js} +76 -49
  308. package/dist/shared/hx-dialog-DkUSnVgw.js.map +1 -0
  309. package/dist/shared/{hx-divider-XgWIz4Mr.js → hx-divider-DNNs4e8q.js} +2 -1
  310. package/dist/shared/{hx-divider-XgWIz4Mr.js.map → hx-divider-DNNs4e8q.js.map} +1 -1
  311. package/dist/shared/{hx-drawer-Dk-_xzy0.js → hx-drawer-CJcRZcns.js} +102 -66
  312. package/dist/shared/hx-drawer-CJcRZcns.js.map +1 -0
  313. package/dist/shared/{hx-dropdown-DnjLnkTj.js → hx-dropdown-Bo0KTM1A.js} +56 -47
  314. package/dist/shared/hx-dropdown-Bo0KTM1A.js.map +1 -0
  315. package/dist/shared/{hx-field-CDP8EXuj.js → hx-field-3MmzJ4kZ.js} +21 -13
  316. package/dist/shared/hx-field-3MmzJ4kZ.js.map +1 -0
  317. package/dist/shared/{hx-file-upload-CUORgnKc.js → hx-file-upload-ByjAgfNy.js} +131 -86
  318. package/dist/shared/hx-file-upload-ByjAgfNy.js.map +1 -0
  319. package/dist/shared/hx-form-BpS6v3Iu.js +258 -0
  320. package/dist/shared/hx-form-BpS6v3Iu.js.map +1 -0
  321. package/dist/shared/{hx-format-date-BsVr8gpD.js → hx-format-date-BdnWV2kX.js} +7 -1
  322. package/dist/shared/hx-format-date-BdnWV2kX.js.map +1 -0
  323. package/dist/shared/{hx-grid-BsDBCTbt.js → hx-grid-gEjuF0cR.js} +25 -18
  324. package/dist/shared/hx-grid-gEjuF0cR.js.map +1 -0
  325. package/dist/shared/{hx-help-text-DaOPN1iB.js → hx-help-text-BAcEGRUE.js} +2 -2
  326. package/dist/shared/{hx-help-text-DaOPN1iB.js.map → hx-help-text-BAcEGRUE.js.map} +1 -1
  327. package/dist/shared/{hx-icon--xsJztDh.js → hx-icon-CP6OnLoM.js} +6 -1
  328. package/dist/shared/hx-icon-CP6OnLoM.js.map +1 -0
  329. package/dist/shared/{hx-icon-button-C83bCR0K.js → hx-icon-button-DzH_bRtC.js} +53 -29
  330. package/dist/shared/hx-icon-button-DzH_bRtC.js.map +1 -0
  331. package/dist/shared/{hx-image-xyb_tHCR.js → hx-image-C6pGiI6c.js} +6 -1
  332. package/dist/shared/hx-image-C6pGiI6c.js.map +1 -0
  333. package/dist/shared/{hx-link-DfNy_UU8.js → hx-link-Tmk_YPvW.js} +46 -37
  334. package/dist/shared/hx-link-Tmk_YPvW.js.map +1 -0
  335. package/dist/shared/{hx-list-CdRNgeoP.js → hx-list-DwInEX2H.js} +63 -37
  336. package/dist/shared/hx-list-DwInEX2H.js.map +1 -0
  337. package/dist/shared/{hx-menu-divider-11Dp2VfM.js → hx-menu-divider-DR4G_rqw.js} +93 -56
  338. package/dist/shared/hx-menu-divider-DR4G_rqw.js.map +1 -0
  339. package/dist/shared/hx-meter-uXkTZq-W.js +238 -0
  340. package/dist/shared/hx-meter-uXkTZq-W.js.map +1 -0
  341. package/dist/shared/{hx-nav-DSpwWYUX.js → hx-nav-3JsN2Oak.js} +94 -75
  342. package/dist/shared/hx-nav-3JsN2Oak.js.map +1 -0
  343. package/dist/shared/{hx-nav-item-D54-5eUM.js → hx-nav-item-D3EJatzc.js} +40 -16
  344. package/dist/shared/hx-nav-item-D3EJatzc.js.map +1 -0
  345. package/dist/shared/{hx-number-input-BP6TIA92.js → hx-number-input-CAAibZ8X.js} +35 -7
  346. package/dist/shared/hx-number-input-CAAibZ8X.js.map +1 -0
  347. package/dist/shared/{hx-overflow-menu-C7k5wlZy.js → hx-overflow-menu-2kgOJ_ht.js} +86 -66
  348. package/dist/shared/hx-overflow-menu-2kgOJ_ht.js.map +1 -0
  349. package/dist/shared/{hx-pagination-BQ0cLTuB.js → hx-pagination-DBs-vmSv.js} +127 -103
  350. package/dist/shared/hx-pagination-DBs-vmSv.js.map +1 -0
  351. package/dist/shared/hx-popover-DxE67miP.js +274 -0
  352. package/dist/shared/hx-popover-DxE67miP.js.map +1 -0
  353. package/dist/shared/{hx-popup-CYf9Q5sj.js → hx-popup-Dg6n_PbY.js} +13 -1
  354. package/dist/shared/hx-popup-Dg6n_PbY.js.map +1 -0
  355. package/dist/shared/{hx-progress-bar-C_mdPVF-.js → hx-progress-bar-Dm_EHyng.js} +101 -73
  356. package/dist/shared/hx-progress-bar-Dm_EHyng.js.map +1 -0
  357. package/dist/shared/{hx-progress-ring-BHJBaXNk.js → hx-progress-ring-DpxBDD5d.js} +35 -28
  358. package/dist/shared/hx-progress-ring-DpxBDD5d.js.map +1 -0
  359. package/dist/shared/hx-prose-Ml_L2zje.js +59 -0
  360. package/dist/shared/hx-prose-Ml_L2zje.js.map +1 -0
  361. package/dist/shared/{hx-radio-Bqyi8re3.js → hx-radio-BywgVSEu.js} +16 -15
  362. package/dist/shared/hx-radio-BywgVSEu.js.map +1 -0
  363. package/dist/shared/{hx-rating-Y_t7Z4qb.js → hx-rating-CUWBQ0fZ.js} +131 -64
  364. package/dist/shared/hx-rating-CUWBQ0fZ.js.map +1 -0
  365. package/dist/shared/{hx-select-BBae2LqN.js → hx-select-BwDwxk-M.js} +110 -171
  366. package/dist/shared/hx-select-BwDwxk-M.js.map +1 -0
  367. package/dist/shared/hx-skeleton-BHvALyd7.js.map +1 -1
  368. package/dist/shared/{hx-slider-CpnxH2UP.js → hx-slider-D_0EKJyk.js} +25 -8
  369. package/dist/shared/hx-slider-D_0EKJyk.js.map +1 -0
  370. package/dist/shared/{hx-spinner-BOApJ-g9.js → hx-spinner-DMn4SChS.js} +35 -28
  371. package/dist/shared/hx-spinner-DMn4SChS.js.map +1 -0
  372. package/dist/shared/{hx-split-button-BvwoG8h2.js → hx-split-button-CypgLXw1.js} +23 -12
  373. package/dist/shared/{hx-split-button-BvwoG8h2.js.map → hx-split-button-CypgLXw1.js.map} +1 -1
  374. package/dist/shared/{hx-split-panel-Cxkeauwe.js → hx-split-panel-BPMWKPGu.js} +74 -42
  375. package/dist/shared/hx-split-panel-BPMWKPGu.js.map +1 -0
  376. package/dist/shared/{hx-stack-CfoW7jU7.js → hx-stack-BStY1RmV.js} +29 -29
  377. package/dist/shared/hx-stack-BStY1RmV.js.map +1 -0
  378. package/dist/shared/{hx-stat-C2wfph8W.js → hx-stat-CHntLHJM.js} +18 -10
  379. package/dist/shared/hx-stat-CHntLHJM.js.map +1 -0
  380. package/dist/shared/{hx-status-indicator-oYWOkWlD.js → hx-status-indicator-C1BwEvUw.js} +15 -12
  381. package/dist/shared/hx-status-indicator-C1BwEvUw.js.map +1 -0
  382. package/dist/shared/{hx-step-DYoIumpR.js → hx-step-BIVWSPxd.js} +45 -33
  383. package/dist/shared/hx-step-BIVWSPxd.js.map +1 -0
  384. package/dist/shared/{hx-switch-DkKchcuP.js → hx-switch-BgX8kuWt.js} +12 -3
  385. package/dist/shared/hx-switch-BgX8kuWt.js.map +1 -0
  386. package/dist/shared/{hx-tab-panel-CHB0u1zF.js → hx-tab-panel-DhOq67jj.js} +65 -53
  387. package/dist/shared/hx-tab-panel-DhOq67jj.js.map +1 -0
  388. package/dist/shared/{hx-tag-SJJtMlOS.js → hx-tag-CzOTDcXI.js} +81 -55
  389. package/dist/shared/hx-tag-CzOTDcXI.js.map +1 -0
  390. package/dist/shared/{hx-td-CVwCGBYf.js → hx-td-h6oeW6YC.js} +43 -41
  391. package/dist/shared/hx-td-h6oeW6YC.js.map +1 -0
  392. package/dist/shared/{hx-text-NjKoQATI.js → hx-text-DTXjiviE.js} +2 -1
  393. package/dist/shared/{hx-text-NjKoQATI.js.map → hx-text-DTXjiviE.js.map} +1 -1
  394. package/dist/shared/{hx-text-input-BrCjo4fJ.js → hx-text-input-CqEdDHMU.js} +87 -70
  395. package/dist/shared/hx-text-input-CqEdDHMU.js.map +1 -0
  396. package/dist/shared/{hx-textarea-BsQdB1Rk.js → hx-textarea-BgX7rxyo.js} +21 -12
  397. package/dist/shared/hx-textarea-BgX7rxyo.js.map +1 -0
  398. package/dist/shared/hx-theme-6GDoUG8j.js.map +1 -1
  399. package/dist/shared/{hx-time-picker-DRRAFuVd.js → hx-time-picker-DmLu7WUC.js} +77 -274
  400. package/dist/shared/hx-time-picker-DmLu7WUC.js.map +1 -0
  401. package/dist/shared/{hx-toggle-button-D4F1soEM.js → hx-toggle-button-D1jpDvSA.js} +75 -38
  402. package/dist/shared/hx-toggle-button-D1jpDvSA.js.map +1 -0
  403. package/dist/shared/{hx-tooltip-Bk1iQRHs.js → hx-tooltip-kh7QFPKu.js} +66 -49
  404. package/dist/shared/hx-tooltip-kh7QFPKu.js.map +1 -0
  405. package/dist/shared/{hx-top-nav-DzW7XLv-.js → hx-top-nav-DYlnzDaU.js} +4 -2
  406. package/dist/shared/{hx-top-nav-DzW7XLv-.js.map → hx-top-nav-DYlnzDaU.js.map} +1 -1
  407. package/dist/shared/{hx-tree-item-DdH6RbMs.js → hx-tree-item-BP6UF_H1.js} +137 -101
  408. package/dist/shared/hx-tree-item-BP6UF_H1.js.map +1 -0
  409. package/dist/shared/toast-factory-DTy-qN8r.js +521 -0
  410. package/dist/shared/toast-factory-DTy-qN8r.js.map +1 -0
  411. package/dist/styles/shared-field.styles.d.ts +6 -0
  412. package/dist/styles/shared-field.styles.d.ts.map +1 -0
  413. package/package.json +2 -5
  414. package/dist/shared/hx-accordion-Cyswa6J3.js.map +0 -1
  415. package/dist/shared/hx-action-bar-we_WJety.js.map +0 -1
  416. package/dist/shared/hx-alert-Cg-zxRiU.js.map +0 -1
  417. package/dist/shared/hx-avatar-Cep6Urm3.js.map +0 -1
  418. package/dist/shared/hx-badge-CjT0d8NK.js.map +0 -1
  419. package/dist/shared/hx-banner-lxAIJ2kR.js.map +0 -1
  420. package/dist/shared/hx-breadcrumb-item-C0rz0fzV.js.map +0 -1
  421. package/dist/shared/hx-button-Cbhqpm5i.js.map +0 -1
  422. package/dist/shared/hx-card-Bg4W4uXC.js.map +0 -1
  423. package/dist/shared/hx-carousel-item-BKpmFbUT.js.map +0 -1
  424. package/dist/shared/hx-checkbox-BMayOpAM.js.map +0 -1
  425. package/dist/shared/hx-checkbox-group-ydUdV9Sx.js.map +0 -1
  426. package/dist/shared/hx-code-snippet-B4hV7rWG.js.map +0 -1
  427. package/dist/shared/hx-color-picker-BvfJ_h16.js +0 -803
  428. package/dist/shared/hx-color-picker-BvfJ_h16.js.map +0 -1
  429. package/dist/shared/hx-combobox-BBi3izKJ.js.map +0 -1
  430. package/dist/shared/hx-counter-D-1NXzGs.js.map +0 -1
  431. package/dist/shared/hx-data-table-DNiDVWR2.js.map +0 -1
  432. package/dist/shared/hx-date-picker-D7yCK0nk.js.map +0 -1
  433. package/dist/shared/hx-dialog-Z7Ou_AZ9.js.map +0 -1
  434. package/dist/shared/hx-drawer-Dk-_xzy0.js.map +0 -1
  435. package/dist/shared/hx-dropdown-DnjLnkTj.js.map +0 -1
  436. package/dist/shared/hx-field-CDP8EXuj.js.map +0 -1
  437. package/dist/shared/hx-file-upload-CUORgnKc.js.map +0 -1
  438. package/dist/shared/hx-form-BFv_N1dm.js +0 -1272
  439. package/dist/shared/hx-form-BFv_N1dm.js.map +0 -1
  440. package/dist/shared/hx-format-date-BsVr8gpD.js.map +0 -1
  441. package/dist/shared/hx-grid-BsDBCTbt.js.map +0 -1
  442. package/dist/shared/hx-icon--xsJztDh.js.map +0 -1
  443. package/dist/shared/hx-icon-button-C83bCR0K.js.map +0 -1
  444. package/dist/shared/hx-image-xyb_tHCR.js.map +0 -1
  445. package/dist/shared/hx-link-DfNy_UU8.js.map +0 -1
  446. package/dist/shared/hx-list-CdRNgeoP.js.map +0 -1
  447. package/dist/shared/hx-menu-divider-11Dp2VfM.js.map +0 -1
  448. package/dist/shared/hx-meter-UinDQjl6.js +0 -190
  449. package/dist/shared/hx-meter-UinDQjl6.js.map +0 -1
  450. package/dist/shared/hx-nav-DSpwWYUX.js.map +0 -1
  451. package/dist/shared/hx-nav-item-D54-5eUM.js.map +0 -1
  452. package/dist/shared/hx-number-input-BP6TIA92.js.map +0 -1
  453. package/dist/shared/hx-overflow-menu-C7k5wlZy.js.map +0 -1
  454. package/dist/shared/hx-pagination-BQ0cLTuB.js.map +0 -1
  455. package/dist/shared/hx-popover-BQsgrJCW.js +0 -226
  456. package/dist/shared/hx-popover-BQsgrJCW.js.map +0 -1
  457. package/dist/shared/hx-popup-CYf9Q5sj.js.map +0 -1
  458. package/dist/shared/hx-progress-bar-C_mdPVF-.js.map +0 -1
  459. package/dist/shared/hx-progress-ring-BHJBaXNk.js.map +0 -1
  460. package/dist/shared/hx-prose-DZh2KrMb.js +0 -876
  461. package/dist/shared/hx-prose-DZh2KrMb.js.map +0 -1
  462. package/dist/shared/hx-radio-Bqyi8re3.js.map +0 -1
  463. package/dist/shared/hx-rating-Y_t7Z4qb.js.map +0 -1
  464. package/dist/shared/hx-select-BBae2LqN.js.map +0 -1
  465. package/dist/shared/hx-slider-CpnxH2UP.js.map +0 -1
  466. package/dist/shared/hx-spinner-BOApJ-g9.js.map +0 -1
  467. package/dist/shared/hx-split-panel-Cxkeauwe.js.map +0 -1
  468. package/dist/shared/hx-stack-CfoW7jU7.js.map +0 -1
  469. package/dist/shared/hx-stat-C2wfph8W.js.map +0 -1
  470. package/dist/shared/hx-status-indicator-oYWOkWlD.js.map +0 -1
  471. package/dist/shared/hx-step-DYoIumpR.js.map +0 -1
  472. package/dist/shared/hx-switch-DkKchcuP.js.map +0 -1
  473. package/dist/shared/hx-tab-panel-CHB0u1zF.js.map +0 -1
  474. package/dist/shared/hx-tag-SJJtMlOS.js.map +0 -1
  475. package/dist/shared/hx-td-CVwCGBYf.js.map +0 -1
  476. package/dist/shared/hx-text-input-BrCjo4fJ.js.map +0 -1
  477. package/dist/shared/hx-textarea-BsQdB1Rk.js.map +0 -1
  478. package/dist/shared/hx-time-picker-DRRAFuVd.js.map +0 -1
  479. package/dist/shared/hx-toggle-button-D4F1soEM.js.map +0 -1
  480. package/dist/shared/hx-tooltip-Bk1iQRHs.js.map +0 -1
  481. package/dist/shared/hx-tree-item-DdH6RbMs.js.map +0 -1
  482. package/dist/shared/toast-factory-B8jicczW.js +0 -426
  483. package/dist/shared/toast-factory-B8jicczW.js.map +0 -1
@@ -1 +1 @@
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":";;;;AAEO,MAAMA,IAAoBC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;ACsC1B,IAAMC,IAAN,cAA0BC,EAAW;AAAA,EAArC,cAAA;AAAA,UAAA,GAAA,SAAA,GAUL,KAAA,SAAS,IAOT,KAAA,QAAQ,mBAKC,KAAQ,cAAc,IAyD/B,KAAQ,iBAAiB,CAACC,MAA2B;;AACnD,MAAIA,EAAE,QAAQ,YAAY,KAAK,gBAC7B,KAAK,cAAc,IACnB,KAAK;AAAA,QACH,IAAI,YAA+B,oBAAoB;AAAA,UACrD,SAAS;AAAA,UACT,UAAU;AAAA,UACV,QAAQ,EAAE,MAAM,GAAA;AAAA,QAAM,CACvB;AAAA,MAAA,IAGHC,KAAAC,IAAA,KAAK,eAAL,gBAAAA,EAAiB,cAAiC,8BAAlD,QAAAD,EAA6E;AAAA,IAEjF;AAAA,EAAA;AAAA;AAAA,EAlES,oBAA0B;AACjC,UAAM,kBAAA,GACN,KAAK,iBAAiB,WAAW,KAAK,cAAc;AAAA,EACtD;AAAA,EAES,uBAA6B;AACpC,UAAM,qBAAA,GACN,KAAK,oBAAoB,WAAW,KAAK,cAAc;AAAA,EACzD;AAAA;AAAA,EAIQ,sBAA4B;AAClC,SAAK,cAAc,CAAC,KAAK,aAMzB,KAAK;AAAA,MACH,IAAI,YAA+B,oBAAoB;AAAA,QACrD,SAAS;AAAA,QACT,UAAU;AAAA,QACV,QAAQ,EAAE,MAAM,KAAK,YAAA;AAAA,MAAY,CAClC;AAAA,IAAA,GAGC,KAAK,eAIP,KAAK,eAAe,KAAK,MAAM;;AAC7B,YAAME,IAAqB,mDACrBC,KAAOF,IAAA,KAAK,eAAL,gBAAAA,EAAiB,cAA+B,qBACvDG,KAAWD,KAAA,gBAAAA,EAAM,iBAAiB,EAAE,SAAS,GAAA,OAAW,CAAA;AAC9D,UAAIE,IAAqC;AACzC,iBAAWC,KAAMF,GAAU;AACzB,YAAI,EAAEE,aAAc,aAAc;AAClC,YAAIA,EAAG,QAAQJ,CAAkB,GAAG;AAClC,UAAAG,IAAiBC;AACjB;AAAA,QACF;AACA,cAAMC,IAAQD,EAAG,cAA2BJ,CAAkB;AAC9D,YAAIK,GAAO;AACT,UAAAF,IAAiBE;AACjB;AAAA,QACF;AAAA,MACF;AACA,MAAAF,KAAA,QAAAA,EAAgB;AAAA,IAClB,CAAC;AAAA,EAEL;AAAA;AAAA,EAmBQ,uBAAuB;AAC7B,WAAOG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAWD,KAAK,cACHC;AAAA;AAAA;AAAA,gBAIAA;AAAA;AAAA;AAAA;AAAA,aAIC;AAAA;AAAA;AAAA,EAGX;AAAA;AAAA,EAIS,SAAS;AAChB,UAAMC,IAAc;AAAA,MAClB,kBAAkB;AAAA,MAClB,0BAA0B,KAAK;AAAA,IAAA;AAGjC,WAAOF;AAAA;AAAA,iDAEsC,KAAK,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8BAU7B,OAAO,KAAK,WAAW,CAAC;AAAA;AAAA;AAAA,uBAG/B,KAAK,mBAAmB;AAAA;AAAA,gBAE/B,KAAK,sBAAsB;AAAA;AAAA;AAAA;AAAA,qCAING,EAASD,CAAW,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYxD;AACF;AApKab,EACK,SAAS,CAACe,GAAajB,CAAiB;AASxDkB,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,SAAS,SAAS,IAAM;AAAA,GAT/BjB,EAUX,WAAA,UAAA,CAAA;AAOAgB,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GAhBfjB,EAiBX,WAAA,SAAA,CAAA;AAKiBgB,EAAA;AAAA,EAAhBE,EAAA;AAAM,GAtBIlB,EAsBM,WAAA,eAAA,CAAA;AAtBNA,IAANgB,EAAA;AAAA,EADNG,EAAc,YAAY;AAAA,GACdnB,CAAA;"}
1
+ {"version":3,"file":"hx-top-nav-DYlnzDaU.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 /** @internal */\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 /** @internal */\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 void 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 /** @internal */\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 /** @internal */\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=${this._mobileOpen ? 'Close navigation' : 'Open 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,7 +1,8 @@
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";
1
+ import { css as b, LitElement as g, html as f, nothing as x } from "lit";
2
+ import { property as p, state as c, customElement as _, query as w } from "lit/decorators.js";
3
3
  import { tokenStyles as y } from "@helixui/tokens/lit";
4
- const w = b`
4
+ import { classMap as I } from "lit/directives/class-map.js";
5
+ const C = b`
5
6
  :host {
6
7
  display: block;
7
8
  contain: layout style;
@@ -23,12 +24,12 @@ const w = b`
23
24
  border-radius: var(--hx-border-radius-sm, 0.25rem);
24
25
  }
25
26
  `;
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;
27
+ var k = Object.defineProperty, S = Object.getOwnPropertyDescriptor, m = (e, t, r, s) => {
28
+ for (var i = s > 1 ? void 0 : s ? S(t, r) : t, l = e.length - 1, h; l >= 0; l--)
29
+ (h = e[l]) && (i = (s ? h(t, r, i) : h(i)) || i);
30
+ return s && i && k(t, r, i), i;
30
31
  };
31
- let c = class extends g {
32
+ let d = class extends g {
32
33
  constructor() {
33
34
  super(...arguments), this.label = "", this.selection = "none", this._currentIndex = 0, this._hasVisibleItems = !1;
34
35
  }
@@ -37,19 +38,22 @@ let c = class extends g {
37
38
  * Returns a flat ordered list of all visible (not inside a collapsed item) hx-tree-items
38
39
  * in depth-first order.
39
40
  */
41
+ /** @internal */
40
42
  _getVisibleItems() {
41
43
  return this._collectVisibleItems(this);
42
44
  }
45
+ /** @internal */
43
46
  _collectVisibleItems(e) {
44
47
  const t = [];
45
48
  for (const r of Array.from(e.children))
46
49
  if (r.tagName.toLowerCase() === "hx-tree-item") {
47
- const i = r;
48
- t.push(i), i.expanded && t.push(...this._collectVisibleItems(i));
50
+ const s = r;
51
+ t.push(s), s.expanded && t.push(...this._collectVisibleItems(s));
49
52
  } else
50
53
  t.push(...this._collectVisibleItems(r));
51
54
  return t;
52
55
  }
56
+ /** @internal */
53
57
  _getSelectedItems() {
54
58
  return Array.from(this.querySelectorAll("hx-tree-item[selected]"));
55
59
  }
@@ -58,27 +62,31 @@ let c = class extends g {
58
62
  * item at `activeIndex` has `tabindex="0"`. All others receive `tabindex="-1"`.
59
63
  * This is called whenever the active item changes (navigation, initial render).
60
64
  */
65
+ /** @internal */
61
66
  _updateRovingTabindex(e, t) {
62
- e.forEach((r, i) => {
63
- r.setRovingActive(i === t);
67
+ e.forEach((r, s) => {
68
+ r.setRovingActive(s === t);
64
69
  });
65
70
  }
71
+ /** @internal */
66
72
  _focusItem(e) {
67
- var i;
73
+ var s;
68
74
  const t = this._getVisibleItems();
69
75
  if (t.length === 0) return;
70
76
  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();
77
+ this._currentIndex = r, this._updateRovingTabindex(t, r), (s = t[r]) == null || s.focus();
72
78
  }
73
79
  // ─── Event Handling ───
80
+ /** @internal */
74
81
  _handleTreeItemSelect(e) {
82
+ if (!(e instanceof CustomEvent)) return;
75
83
  const r = e.detail.item;
76
84
  if (this.selection !== "none") {
77
85
  if (this.selection === "single") {
78
- const i = r.selected;
79
- this._getSelectedItems().forEach((s) => {
80
- s.selected = !1;
81
- }), r.selected = !i;
86
+ const s = r.selected;
87
+ this._getSelectedItems().forEach((i) => {
88
+ i.selected = !1;
89
+ }), r.selected = !s;
82
90
  } else this.selection === "multiple" && (r.selected = !r.selected);
83
91
  this.dispatchEvent(
84
92
  new CustomEvent("hx-select", {
@@ -89,38 +97,39 @@ let c = class extends g {
89
97
  );
90
98
  }
91
99
  }
100
+ /** @internal */
92
101
  _handleKeyDown(e) {
93
- var s, a, o;
102
+ var i, l, h;
94
103
  const t = this._getVisibleItems();
95
104
  if (t.length === 0) return;
96
105
  let r = this._currentIndex;
97
- const i = document.activeElement;
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;
106
+ const s = document.activeElement;
107
+ for (let a = 0; a < t.length; a++)
108
+ if (t[a] === s || (l = (i = t[a]) == null ? void 0 : i.shadowRoot) != null && l.activeElement) {
109
+ r = a;
101
110
  break;
102
111
  }
103
112
  switch (e.key) {
104
113
  case "ArrowDown": {
105
114
  e.preventDefault();
106
- const n = r < t.length - 1 ? r + 1 : 0;
107
- this._focusItem(n);
115
+ const a = r < t.length - 1 ? r + 1 : 0;
116
+ this._focusItem(a);
108
117
  break;
109
118
  }
110
119
  case "ArrowUp": {
111
120
  e.preventDefault();
112
- const n = r > 0 ? r - 1 : t.length - 1;
113
- this._focusItem(n);
121
+ const a = r > 0 ? r - 1 : t.length - 1;
122
+ this._focusItem(a);
114
123
  break;
115
124
  }
116
125
  case "ArrowLeft": {
117
126
  e.preventDefault();
118
- const n = t[r];
119
- if (!n) break;
120
- if (n.expanded && n.hasChildItems)
121
- n.expanded = !1;
127
+ const a = t[r];
128
+ if (!a) break;
129
+ if (a.expanded && a.hasChildItems)
130
+ a.expanded = !1;
122
131
  else {
123
- const u = (o = n.parentElement) == null ? void 0 : o.closest("hx-tree-item");
132
+ const u = (h = a.parentElement) == null ? void 0 : h.closest("hx-tree-item");
124
133
  if (u) {
125
134
  const v = t.indexOf(u);
126
135
  v >= 0 && this._focusItem(v);
@@ -130,9 +139,9 @@ let c = class extends g {
130
139
  }
131
140
  case "ArrowRight": {
132
141
  e.preventDefault();
133
- const n = t[r];
134
- if (!n) break;
135
- n.hasChildItems && (n.expanded ? this._focusItem(r + 1) : n.expanded = !0);
142
+ const a = t[r];
143
+ if (!a) break;
144
+ a.hasChildItems && (a.expanded ? this._focusItem(r + 1) : a.expanded = !0);
136
145
  break;
137
146
  }
138
147
  case "Home": {
@@ -145,6 +154,7 @@ let c = class extends g {
145
154
  }
146
155
  }
147
156
  }
157
+ /** @internal */
148
158
  _handleFocusIn(e) {
149
159
  e.target === e.currentTarget && this._getVisibleItems().length > 0 && this._focusItem(this._currentIndex);
150
160
  }
@@ -154,22 +164,27 @@ let c = class extends g {
154
164
  * so a Tab into the tree lands directly on the first item without a redirect.
155
165
  * Also updates `_hasVisibleItems` so the container tabindex re-renders correctly.
156
166
  */
167
+ /** @internal */
157
168
  _handleSlotChange() {
158
169
  const e = this._getVisibleItems();
159
170
  if (this._hasVisibleItems = e.length > 0, e.length === 0) return;
160
171
  const t = Math.min(this._currentIndex, e.length - 1);
161
172
  this._currentIndex = t, this._updateRovingTabindex(e, t);
162
173
  }
174
+ // ─── Lifecycle ───
175
+ firstUpdated() {
176
+ this.label;
177
+ }
163
178
  // ─── Render ───
164
179
  render() {
165
180
  const e = this._hasVisibleItems ? "-1" : "0";
166
- return x`
181
+ return f`
167
182
  <div
168
183
  part="tree"
169
184
  class="tree"
170
185
  role="tree"
171
186
  tabindex=${e}
172
- aria-label=${this.label || f}
187
+ aria-label=${this.label || "Tree"}
173
188
  aria-multiselectable=${this.selection === "multiple" ? "true" : "false"}
174
189
  @hx-tree-item-select=${this._handleTreeItemSelect}
175
190
  @keydown=${this._handleKeyDown}
@@ -180,23 +195,23 @@ let c = class extends g {
180
195
  `;
181
196
  }
182
197
  };
183
- c.styles = [y, w];
198
+ d.styles = [y, C];
184
199
  m([
185
200
  p({ type: String, reflect: !0 })
186
- ], c.prototype, "label", 2);
201
+ ], d.prototype, "label", 2);
187
202
  m([
188
203
  p({ type: String, reflect: !0 })
189
- ], c.prototype, "selection", 2);
204
+ ], d.prototype, "selection", 2);
190
205
  m([
191
- d()
192
- ], c.prototype, "_currentIndex", 2);
206
+ c()
207
+ ], d.prototype, "_currentIndex", 2);
193
208
  m([
194
- d()
195
- ], c.prototype, "_hasVisibleItems", 2);
196
- c = m([
209
+ c()
210
+ ], d.prototype, "_hasVisibleItems", 2);
211
+ d = m([
197
212
  _("hx-tree-view")
198
- ], c);
199
- const C = b`
213
+ ], d);
214
+ const E = b`
200
215
  :host {
201
216
  display: block;
202
217
  contain: layout style;
@@ -240,7 +255,8 @@ const C = b`
240
255
  }
241
256
 
242
257
  .item-row:focus-visible {
243
- outline: var(--hx-focus-ring-width, 2px) solid var(--hx-focus-ring-color, #2563eb);
258
+ outline: var(--hx-focus-ring-width, 2px) solid
259
+ var(--hx-tree-item-focus-ring-color, var(--hx-focus-ring-color, var(--hx-color-primary-500)));
244
260
  outline-offset: var(--hx-focus-ring-offset, -2px);
245
261
  }
246
262
 
@@ -297,6 +313,12 @@ const C = b`
297
313
  );
298
314
  }
299
315
 
316
+ .expand-btn:focus-visible {
317
+ outline: var(--hx-focus-ring-width, 2px) solid
318
+ var(--hx-tree-item-focus-ring-color, var(--hx-focus-ring-color, var(--hx-color-primary-500)));
319
+ outline-offset: var(--hx-focus-ring-offset, 2px);
320
+ }
321
+
300
322
  .expand-btn svg {
301
323
  width: var(--hx-space-3, 0.75rem);
302
324
  height: var(--hx-space-3, 0.75rem);
@@ -367,14 +389,14 @@ const C = b`
367
389
  overflow: hidden;
368
390
  }
369
391
  `;
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;
392
+ var $ = Object.defineProperty, A = Object.getOwnPropertyDescriptor, o = (e, t, r, s) => {
393
+ for (var i = s > 1 ? void 0 : s ? A(t, r) : t, l = e.length - 1, h; l >= 0; l--)
394
+ (h = e[l]) && (i = (s ? h(t, r, i) : h(i)) || i);
395
+ return s && i && $(t, r, i), i;
374
396
  };
375
- let l = class extends g {
397
+ let n = class extends g {
376
398
  constructor() {
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;
399
+ super(...arguments), this.expanded = !1, this.selected = !1, this.disabled = !1, this._hasChildren = !1, this._rovingActive = !1, this._labelText = "", this._level = 1, this._posInSet = 1, this._setSize = 1, this._selectable = !1;
378
400
  }
379
401
  // ─── Computed ARIA ───
380
402
  /**
@@ -396,16 +418,16 @@ let l = class extends g {
396
418
  this._level = e;
397
419
  const r = this.parentElement;
398
420
  if (r) {
399
- const s = Array.from(r.children).filter(
400
- (a) => a.tagName.toLowerCase() === "hx-tree-item"
421
+ const i = Array.from(r.children).filter(
422
+ (l) => l.tagName.toLowerCase() === "hx-tree-item"
401
423
  );
402
- this._posInSet = s.indexOf(this) + 1, this._setSize = s.length;
424
+ this._posInSet = i.indexOf(this) + 1, this._setSize = i.length;
403
425
  } else
404
426
  this._posInSet = 1, this._setSize = 1;
405
- const i = this.closest("hx-tree-view");
406
- if (i) {
407
- const s = i.getAttribute("selection");
408
- this._selectable = s === "single" || s === "multiple";
427
+ const s = this.closest("hx-tree-view");
428
+ if (s) {
429
+ const i = s.getAttribute("selection");
430
+ this._selectable = i === "single" || i === "multiple";
409
431
  } else
410
432
  this._selectable = !1;
411
433
  }
@@ -422,6 +444,14 @@ let l = class extends g {
422
444
  const t = e.target;
423
445
  this._hasChildren = t.assignedElements().length > 0, this._updateAriaMetadata();
424
446
  }
447
+ /**
448
+ * Captures the text content from the default (label) slot for use on the children group label.
449
+ * @internal
450
+ */
451
+ _handleLabelSlotChange(e) {
452
+ const r = e.target.assignedNodes({ flatten: !0 });
453
+ this._labelText = r.map((s) => s.textContent ?? "").join("").trim();
454
+ }
425
455
  // ─── Event Handlers ───
426
456
  /**
427
457
  * Toggles the expanded state when the expand/collapse button is clicked, stopping event propagation.
@@ -474,9 +504,8 @@ let l = class extends g {
474
504
  }
475
505
  /** Focus this item's interactive row element. */
476
506
  focus() {
477
- var t;
478
- const e = (t = this.shadowRoot) == null ? void 0 : t.querySelector(".item-row");
479
- e == null || e.focus();
507
+ var e;
508
+ (e = this._itemRowEl) == null || e.focus();
480
509
  }
481
510
  // ─── Render ───
482
511
  /**
@@ -484,7 +513,7 @@ let l = class extends g {
484
513
  * @internal
485
514
  */
486
515
  _renderExpandIcon() {
487
- return this._hasChildren ? x`
516
+ return this._hasChildren ? f`
488
517
  <button
489
518
  part="expand-icon"
490
519
  class="expand-btn"
@@ -496,11 +525,11 @@ let l = class extends g {
496
525
  <polyline points="6 4 10 8 6 12" />
497
526
  </svg>
498
527
  </button>
499
- ` : x`<span class="expand-placeholder" aria-hidden="true"></span>`;
528
+ ` : f`<span class="expand-placeholder" aria-hidden="true"></span>`;
500
529
  }
501
530
  render() {
502
- const e = this._hasChildren ? String(this.expanded) : f, t = this._selectable ? String(this.selected) : f;
503
- return x`
531
+ const e = this._hasChildren ? String(this.expanded) : x, t = this._selectable ? String(this.selected) : x;
532
+ return f`
504
533
  <div part="item" class="item">
505
534
  <div
506
535
  part="row"
@@ -509,7 +538,7 @@ let l = class extends g {
509
538
  tabindex=${this._rovingActive ? "0" : "-1"}
510
539
  aria-expanded=${e}
511
540
  aria-selected=${t}
512
- aria-disabled=${this.disabled ? "true" : f}
541
+ aria-disabled=${this.disabled ? "true" : x}
513
542
  aria-level=${this._level}
514
543
  aria-posinset=${this._posInSet}
515
544
  aria-setsize=${this._setSize}
@@ -521,13 +550,14 @@ let l = class extends g {
521
550
  <slot name="icon"></slot>
522
551
  </span>
523
552
  <span part="label" class="item-label">
524
- <slot></slot>
553
+ <slot @slotchange=${this._handleLabelSlotChange}></slot>
525
554
  </span>
526
555
  </div>
527
556
  <div
528
557
  part="children"
529
- class="children ${this.expanded ? "children--expanded" : ""}"
558
+ class=${I({ children: !0, "children--expanded": this.expanded })}
530
559
  role="group"
560
+ aria-label=${this._labelText ? `${this._labelText} children` : "children"}
531
561
  >
532
562
  <div class="children-inner">
533
563
  <slot name="children" @slotchange=${this._handleChildrenSlotChange}></slot>
@@ -537,39 +567,45 @@ let l = class extends g {
537
567
  `;
538
568
  }
539
569
  };
540
- l.styles = [y, C];
541
- h([
570
+ n.styles = [y, E];
571
+ o([
542
572
  p({ type: Boolean, reflect: !0 })
543
- ], l.prototype, "expanded", 2);
544
- h([
573
+ ], n.prototype, "expanded", 2);
574
+ o([
545
575
  p({ type: Boolean, reflect: !0 })
546
- ], l.prototype, "selected", 2);
547
- h([
576
+ ], n.prototype, "selected", 2);
577
+ o([
548
578
  p({ type: Boolean, reflect: !0 })
549
- ], l.prototype, "disabled", 2);
550
- h([
551
- d()
552
- ], l.prototype, "_hasChildren", 2);
553
- h([
554
- d()
555
- ], l.prototype, "_rovingActive", 2);
556
- h([
557
- d()
558
- ], l.prototype, "_level", 2);
559
- h([
560
- d()
561
- ], l.prototype, "_posInSet", 2);
562
- h([
563
- d()
564
- ], l.prototype, "_setSize", 2);
565
- h([
566
- d()
567
- ], l.prototype, "_selectable", 2);
568
- l = h([
579
+ ], n.prototype, "disabled", 2);
580
+ o([
581
+ c()
582
+ ], n.prototype, "_hasChildren", 2);
583
+ o([
584
+ c()
585
+ ], n.prototype, "_rovingActive", 2);
586
+ o([
587
+ c()
588
+ ], n.prototype, "_labelText", 2);
589
+ o([
590
+ c()
591
+ ], n.prototype, "_level", 2);
592
+ o([
593
+ c()
594
+ ], n.prototype, "_posInSet", 2);
595
+ o([
596
+ c()
597
+ ], n.prototype, "_setSize", 2);
598
+ o([
599
+ c()
600
+ ], n.prototype, "_selectable", 2);
601
+ o([
602
+ w(".item-row")
603
+ ], n.prototype, "_itemRowEl", 2);
604
+ n = o([
569
605
  _("hx-tree-item")
570
- ], l);
606
+ ], n);
571
607
  export {
572
- l as H,
573
- c as a
608
+ n as H,
609
+ d as a
574
610
  };
575
- //# sourceMappingURL=hx-tree-item-DdH6RbMs.js.map
611
+ //# sourceMappingURL=hx-tree-item-BP6UF_H1.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hx-tree-item-BP6UF_H1.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 } 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';\nimport { devWarn } from '../../utils/dev-warn.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 /** @internal */\n @state() private _currentIndex = 0;\n\n /** Tracks whether the tree has any visible items, to decide the container tabindex. */\n /** @internal */\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 /** @internal */\n private _getVisibleItems(): HelixTreeItem[] {\n return this._collectVisibleItems(this);\n }\n\n /** @internal */\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 /** @internal */\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 /** @internal */\n private _updateRovingTabindex(items: HelixTreeItem[], activeIndex: number): void {\n items.forEach((item, i) => {\n item.setRovingActive(i === activeIndex);\n });\n }\n\n /** @internal */\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 /** @internal */\n private _handleTreeItemSelect(e: Event): void {\n if (!(e instanceof CustomEvent)) return;\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 /** @internal */\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 /** @internal */\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 /** @internal */\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 // ─── Lifecycle ───\n\n override firstUpdated(): void {\n if (!this.label) {\n devWarn(\n 'hx-tree-view',\n 'No accessible label provided. Set the `label` attribute on hx-tree-view so screen readers can identify this tree (WCAG 4.1.2).',\n );\n }\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 || 'Tree'}\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\n var(--hx-tree-item-focus-ring-color, var(--hx-focus-ring-color, var(--hx-color-primary-500)));\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:focus-visible {\n outline: var(--hx-focus-ring-width, 2px) solid\n var(--hx-tree-item-focus-ring-color, var(--hx-focus-ring-color, var(--hx-color-primary-500)));\n outline-offset: var(--hx-focus-ring-offset, 2px);\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, query, state } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.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. This text is also used to label the children group.\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 * Text content from the default slot, used to label the children group for screen readers.\n * @internal\n */\n @state() private _labelText = '';\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 /** @internal */\n @query('.item-row') private _itemRowEl!: HTMLElement | null;\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 /**\n * Captures the text content from the default (label) slot for use on the children group label.\n * @internal\n */\n private _handleLabelSlotChange(e: Event): void {\n const slot = e.target as HTMLSlotElement;\n const nodes = slot.assignedNodes({ flatten: true });\n this._labelText = nodes\n .map((n) => n.textContent ?? '')\n .join('')\n .trim();\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 this._itemRowEl?.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 @slotchange=${this._handleLabelSlotChange}></slot>\n </span>\n </div>\n <div\n part=\"children\"\n class=${classMap({ children: true, 'children--expanded': this.expanded })}\n role=\"group\"\n aria-label=${this._labelText ? `${this._labelText} children` : 'children'}\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","i","index","clamped","_a","wasSelected","currentIndex","focused","_b","next","prev","currentItem","parentItem","_c","parentIndex","containerTabindex","html","tokenStyles","__decorateClass","property","state","customElement","helixTreeItemStyles","HelixTreeItem","level","el","parent","siblings","c","tree","selection","slot","nodes","n","active","ariaExpanded","nothing","ariaSelected","classMap","query"],"mappings":"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"}