@helixui/library 0.3.3 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (441) hide show
  1. package/LICENSE +21 -0
  2. package/custom-elements.json +13178 -12195
  3. package/dist/components/hx-accordion/hx-accordion-item.d.ts +3 -1
  4. package/dist/components/hx-accordion/hx-accordion-item.d.ts.map +1 -1
  5. package/dist/components/hx-accordion/hx-accordion.d.ts +9 -1
  6. package/dist/components/hx-accordion/hx-accordion.d.ts.map +1 -1
  7. package/dist/components/hx-accordion/index.js +1 -1
  8. package/dist/components/hx-action-bar/hx-action-bar.d.ts +1 -1
  9. package/dist/components/hx-action-bar/hx-action-bar.d.ts.map +1 -1
  10. package/dist/components/hx-action-bar/index.js +1 -1
  11. package/dist/components/hx-alert/hx-alert.d.ts +3 -6
  12. package/dist/components/hx-alert/hx-alert.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 +1 -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 +1 -1
  18. package/dist/components/hx-banner/hx-banner.d.ts +99 -0
  19. package/dist/components/hx-banner/hx-banner.d.ts.map +1 -0
  20. package/dist/components/hx-banner/hx-banner.styles.d.ts +2 -0
  21. package/dist/components/hx-banner/hx-banner.styles.d.ts.map +1 -0
  22. package/dist/components/hx-banner/index.d.ts +3 -0
  23. package/dist/components/hx-banner/index.d.ts.map +1 -0
  24. package/dist/components/hx-banner/index.js +5 -0
  25. package/dist/components/hx-banner/index.js.map +1 -0
  26. package/dist/components/hx-breadcrumb/hx-breadcrumb-item.d.ts +1 -1
  27. package/dist/components/hx-breadcrumb/hx-breadcrumb.d.ts +6 -1
  28. package/dist/components/hx-breadcrumb/hx-breadcrumb.d.ts.map +1 -1
  29. package/dist/components/hx-breadcrumb/index.js +1 -1
  30. package/dist/components/hx-button/hx-button.d.ts +17 -0
  31. package/dist/components/hx-button/hx-button.d.ts.map +1 -1
  32. package/dist/components/hx-button/hx-button.styles.d.ts.map +1 -1
  33. package/dist/components/hx-button/index.js +1 -1
  34. package/dist/components/hx-button-group/hx-button-group.d.ts +9 -1
  35. package/dist/components/hx-button-group/hx-button-group.d.ts.map +1 -1
  36. package/dist/components/hx-button-group/index.js +1 -1
  37. package/dist/components/hx-card/hx-card.d.ts +17 -1
  38. package/dist/components/hx-card/hx-card.d.ts.map +1 -1
  39. package/dist/components/hx-card/hx-card.styles.d.ts.map +1 -1
  40. package/dist/components/hx-card/index.js +1 -1
  41. package/dist/components/hx-carousel/hx-carousel-item.d.ts +1 -1
  42. package/dist/components/hx-carousel/hx-carousel.d.ts +123 -1
  43. package/dist/components/hx-carousel/hx-carousel.d.ts.map +1 -1
  44. package/dist/components/hx-carousel/index.js +1 -1
  45. package/dist/components/hx-checkbox/hx-checkbox.d.ts +4 -2
  46. package/dist/components/hx-checkbox/hx-checkbox.d.ts.map +1 -1
  47. package/dist/components/hx-checkbox-group/hx-checkbox-group.d.ts +6 -2
  48. package/dist/components/hx-checkbox-group/hx-checkbox-group.d.ts.map +1 -1
  49. package/dist/components/hx-checkbox-group/index.js +1 -1
  50. package/dist/components/hx-code-snippet/hx-code-snippet.d.ts +21 -6
  51. package/dist/components/hx-code-snippet/hx-code-snippet.d.ts.map +1 -1
  52. package/dist/components/hx-code-snippet/index.js +1 -1
  53. package/dist/components/hx-color-picker/hx-color-picker.d.ts +14 -1
  54. package/dist/components/hx-color-picker/hx-color-picker.d.ts.map +1 -1
  55. package/dist/components/hx-color-picker/hx-color-picker.styles.d.ts.map +1 -1
  56. package/dist/components/hx-color-picker/index.js +1 -1
  57. package/dist/components/hx-combobox/hx-combobox.d.ts +25 -1
  58. package/dist/components/hx-combobox/hx-combobox.d.ts.map +1 -1
  59. package/dist/components/hx-combobox/hx-combobox.styles.d.ts.map +1 -1
  60. package/dist/components/hx-combobox/index.js +1 -1
  61. package/dist/components/hx-container/hx-container.d.ts +4 -2
  62. package/dist/components/hx-container/hx-container.d.ts.map +1 -1
  63. package/dist/components/hx-copy-button/hx-copy-button.d.ts +7 -1
  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 +79 -0
  67. package/dist/components/hx-counter/hx-counter.d.ts.map +1 -0
  68. package/dist/components/hx-counter/hx-counter.styles.d.ts +2 -0
  69. package/dist/components/hx-counter/hx-counter.styles.d.ts.map +1 -0
  70. package/dist/components/hx-counter/index.d.ts +3 -0
  71. package/dist/components/hx-counter/index.d.ts.map +1 -0
  72. package/dist/components/hx-counter/index.js +5 -0
  73. package/dist/components/hx-counter/index.js.map +1 -0
  74. package/dist/components/hx-data-table/hx-data-table.d.ts +7 -1
  75. package/dist/components/hx-data-table/hx-data-table.d.ts.map +1 -1
  76. package/dist/components/hx-data-table/hx-data-table.styles.d.ts.map +1 -1
  77. package/dist/components/hx-data-table/index.js +1 -1
  78. package/dist/components/hx-date-picker/hx-date-picker.d.ts +125 -1
  79. package/dist/components/hx-date-picker/hx-date-picker.d.ts.map +1 -1
  80. package/dist/components/hx-date-picker/index.js +1 -1
  81. package/dist/components/hx-dialog/hx-dialog.d.ts +1 -1
  82. package/dist/components/hx-dialog/hx-dialog.d.ts.map +1 -1
  83. package/dist/components/hx-dialog/index.js +1 -1
  84. package/dist/components/hx-divider/hx-divider.d.ts +4 -1
  85. package/dist/components/hx-divider/hx-divider.d.ts.map +1 -1
  86. package/dist/components/hx-drawer/hx-drawer.d.ts +55 -2
  87. package/dist/components/hx-drawer/hx-drawer.d.ts.map +1 -1
  88. package/dist/components/hx-drawer/index.js +1 -1
  89. package/dist/components/hx-dropdown/hx-dropdown.d.ts +6 -1
  90. package/dist/components/hx-dropdown/hx-dropdown.d.ts.map +1 -1
  91. package/dist/components/hx-field/hx-field.d.ts +32 -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-field-label/hx-field-label.d.ts +1 -1
  95. package/dist/components/hx-file-upload/hx-file-upload.d.ts +13 -1
  96. package/dist/components/hx-file-upload/hx-file-upload.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 +25 -1
  99. package/dist/components/hx-form/hx-form.d.ts.map +1 -1
  100. package/dist/components/hx-form/index.js +1 -1
  101. package/dist/components/hx-format-date/hx-format-date.d.ts +1 -1
  102. package/dist/components/hx-grid/hx-grid.d.ts +2 -2
  103. package/dist/components/hx-help-text/hx-help-text.d.ts +4 -1
  104. package/dist/components/hx-help-text/hx-help-text.d.ts.map +1 -1
  105. package/dist/components/hx-icon/hx-icon.d.ts +1 -1
  106. package/dist/components/hx-icon-button/hx-icon-button.d.ts +1 -1
  107. package/dist/components/hx-icon-button/hx-icon-button.d.ts.map +1 -1
  108. package/dist/components/hx-icon-button/index.js +1 -1
  109. package/dist/components/hx-image/hx-image.d.ts +1 -1
  110. package/dist/components/hx-link/hx-link.d.ts +1 -1
  111. package/dist/components/hx-list/hx-list-item.d.ts +1 -1
  112. package/dist/components/hx-list/hx-list.d.ts +1 -1
  113. package/dist/components/hx-list/hx-list.d.ts.map +1 -1
  114. package/dist/components/hx-list/index.js +1 -1
  115. package/dist/components/hx-menu/hx-menu-divider.d.ts +1 -1
  116. package/dist/components/hx-menu/hx-menu-item.d.ts +1 -1
  117. package/dist/components/hx-menu/hx-menu.d.ts +13 -1
  118. package/dist/components/hx-menu/hx-menu.d.ts.map +1 -1
  119. package/dist/components/hx-menu/index.js +1 -1
  120. package/dist/components/hx-meter/hx-meter.d.ts +3 -1
  121. package/dist/components/hx-meter/hx-meter.d.ts.map +1 -1
  122. package/dist/components/hx-meter/index.js +1 -1
  123. package/dist/components/hx-nav/hx-nav.d.ts +16 -2
  124. package/dist/components/hx-nav/hx-nav.d.ts.map +1 -1
  125. package/dist/components/hx-nav/index.js +1 -1
  126. package/dist/components/hx-number-input/hx-number-input.d.ts +3 -1
  127. package/dist/components/hx-number-input/hx-number-input.d.ts.map +1 -1
  128. package/dist/components/hx-number-input/index.js +1 -1
  129. package/dist/components/hx-overflow-menu/hx-overflow-menu.d.ts +15 -1
  130. package/dist/components/hx-overflow-menu/hx-overflow-menu.d.ts.map +1 -1
  131. package/dist/components/hx-overflow-menu/index.js +1 -1
  132. package/dist/components/hx-pagination/hx-pagination.d.ts +6 -1
  133. package/dist/components/hx-pagination/hx-pagination.d.ts.map +1 -1
  134. package/dist/components/hx-pagination/index.js +1 -1
  135. package/dist/components/hx-popover/hx-popover.d.ts +11 -39
  136. package/dist/components/hx-popover/hx-popover.d.ts.map +1 -1
  137. package/dist/components/hx-popover/index.js +1 -1
  138. package/dist/components/hx-popup/hx-popup.d.ts +1 -1
  139. package/dist/components/hx-progress-bar/hx-progress-bar.d.ts +11 -1
  140. package/dist/components/hx-progress-bar/hx-progress-bar.d.ts.map +1 -1
  141. package/dist/components/hx-progress-bar/index.js +1 -1
  142. package/dist/components/hx-progress-ring/hx-progress-ring.d.ts.map +1 -1
  143. package/dist/components/hx-progress-ring/index.js +1 -1
  144. package/dist/components/hx-prose/hx-prose.d.ts +1 -1
  145. package/dist/components/hx-radio-group/hx-radio-group.d.ts +76 -4
  146. package/dist/components/hx-radio-group/hx-radio-group.d.ts.map +1 -1
  147. package/dist/components/hx-radio-group/hx-radio.d.ts +4 -2
  148. package/dist/components/hx-radio-group/hx-radio.d.ts.map +1 -1
  149. package/dist/components/hx-radio-group/index.js +1 -1
  150. package/dist/components/hx-rating/hx-rating.d.ts +19 -4
  151. package/dist/components/hx-rating/hx-rating.d.ts.map +1 -1
  152. package/dist/components/hx-rating/index.js +1 -1
  153. package/dist/components/hx-select/hx-select.d.ts +10 -1
  154. package/dist/components/hx-select/hx-select.d.ts.map +1 -1
  155. package/dist/components/hx-select/index.js +1 -1
  156. package/dist/components/hx-side-nav/hx-nav-item.d.ts +1 -1
  157. package/dist/components/hx-side-nav/hx-side-nav.d.ts +1 -1
  158. package/dist/components/hx-side-nav/hx-side-nav.d.ts.map +1 -1
  159. package/dist/components/hx-side-nav/index.js +1 -1
  160. package/dist/components/hx-skeleton/hx-skeleton.d.ts +1 -1
  161. package/dist/components/hx-slider/hx-slider.d.ts +2 -0
  162. package/dist/components/hx-slider/hx-slider.d.ts.map +1 -1
  163. package/dist/components/hx-slider/index.js +1 -1
  164. package/dist/components/hx-spinner/hx-spinner.d.ts +1 -1
  165. package/dist/components/hx-split-button/hx-split-button.d.ts +17 -1
  166. package/dist/components/hx-split-button/hx-split-button.d.ts.map +1 -1
  167. package/dist/components/hx-split-button/index.js +1 -1
  168. package/dist/components/hx-split-panel/hx-split-panel.d.ts +12 -1
  169. package/dist/components/hx-split-panel/hx-split-panel.d.ts.map +1 -1
  170. package/dist/components/hx-stack/hx-stack.d.ts +1 -1
  171. package/dist/components/hx-stat/hx-stat.d.ts +71 -0
  172. package/dist/components/hx-stat/hx-stat.d.ts.map +1 -0
  173. package/dist/components/hx-stat/hx-stat.styles.d.ts +2 -0
  174. package/dist/components/hx-stat/hx-stat.styles.d.ts.map +1 -0
  175. package/dist/components/hx-stat/index.d.ts +3 -0
  176. package/dist/components/hx-stat/index.d.ts.map +1 -0
  177. package/dist/components/hx-stat/index.js +5 -0
  178. package/dist/components/hx-stat/index.js.map +1 -0
  179. package/dist/components/hx-status-indicator/hx-status-indicator.d.ts +1 -1
  180. package/dist/components/hx-steps/hx-step.d.ts +1 -1
  181. package/dist/components/hx-steps/hx-steps.d.ts +6 -1
  182. package/dist/components/hx-steps/hx-steps.d.ts.map +1 -1
  183. package/dist/components/hx-steps/index.js +1 -1
  184. package/dist/components/hx-structured-list/hx-structured-list.d.ts +4 -2
  185. package/dist/components/hx-structured-list/hx-structured-list.d.ts.map +1 -1
  186. package/dist/components/hx-structured-list/index.js +1 -1
  187. package/dist/components/hx-switch/hx-switch.d.ts +3 -1
  188. package/dist/components/hx-switch/hx-switch.d.ts.map +1 -1
  189. package/dist/components/hx-switch/index.js +1 -1
  190. package/dist/components/hx-table/hx-table.d.ts +60 -0
  191. package/dist/components/hx-table/hx-table.d.ts.map +1 -0
  192. package/dist/components/hx-table/hx-table.styles.d.ts +9 -0
  193. package/dist/components/hx-table/hx-table.styles.d.ts.map +1 -0
  194. package/dist/components/hx-table/hx-tbody.d.ts +23 -0
  195. package/dist/components/hx-table/hx-tbody.d.ts.map +1 -0
  196. package/dist/components/hx-table/hx-td.d.ts +46 -0
  197. package/dist/components/hx-table/hx-td.d.ts.map +1 -0
  198. package/dist/components/hx-table/hx-tfoot.d.ts +23 -0
  199. package/dist/components/hx-table/hx-tfoot.d.ts.map +1 -0
  200. package/dist/components/hx-table/hx-th.d.ts +61 -0
  201. package/dist/components/hx-table/hx-th.d.ts.map +1 -0
  202. package/dist/components/hx-table/hx-thead.d.ts +23 -0
  203. package/dist/components/hx-table/hx-thead.d.ts.map +1 -0
  204. package/dist/components/hx-table/hx-tr.d.ts +33 -0
  205. package/dist/components/hx-table/hx-tr.d.ts.map +1 -0
  206. package/dist/components/hx-table/index.d.ts +9 -0
  207. package/dist/components/hx-table/index.d.ts.map +1 -0
  208. package/dist/components/hx-table/index.js +11 -0
  209. package/dist/components/hx-table/index.js.map +1 -0
  210. package/dist/components/hx-tabs/hx-tab-panel.d.ts +1 -1
  211. package/dist/components/hx-tabs/hx-tab.d.ts +1 -1
  212. package/dist/components/hx-tabs/hx-tabs.d.ts +1 -1
  213. package/dist/components/hx-tabs/hx-tabs.d.ts.map +1 -1
  214. package/dist/components/hx-tabs/index.js +1 -1
  215. package/dist/components/hx-tag/hx-tag.d.ts +1 -1
  216. package/dist/components/hx-text/hx-text.d.ts +1 -1
  217. package/dist/components/hx-text-input/hx-text-input.d.ts +2 -1
  218. package/dist/components/hx-text-input/hx-text-input.d.ts.map +1 -1
  219. package/dist/components/hx-text-input/index.js +1 -1
  220. package/dist/components/hx-textarea/hx-textarea.d.ts +15 -1
  221. package/dist/components/hx-textarea/hx-textarea.d.ts.map +1 -1
  222. package/dist/components/hx-textarea/hx-textarea.styles.d.ts.map +1 -1
  223. package/dist/components/hx-textarea/index.js +1 -1
  224. package/dist/components/hx-theme/hx-theme.d.ts +1 -1
  225. package/dist/components/hx-time-picker/hx-time-picker.d.ts +23 -2
  226. package/dist/components/hx-time-picker/hx-time-picker.d.ts.map +1 -1
  227. package/dist/components/hx-time-picker/index.js +1 -1
  228. package/dist/components/hx-toast/hx-toast-stack.d.ts +36 -0
  229. package/dist/components/hx-toast/hx-toast-stack.d.ts.map +1 -0
  230. package/dist/components/hx-toast/hx-toast.d.ts +1 -53
  231. package/dist/components/hx-toast/hx-toast.d.ts.map +1 -1
  232. package/dist/components/hx-toast/index.d.ts +6 -2
  233. package/dist/components/hx-toast/index.d.ts.map +1 -1
  234. package/dist/components/hx-toast/index.js +1 -1
  235. package/dist/components/hx-toast/toast-factory.d.ts +25 -0
  236. package/dist/components/hx-toast/toast-factory.d.ts.map +1 -0
  237. package/dist/components/hx-toggle-button/hx-toggle-button.d.ts +2 -1
  238. package/dist/components/hx-toggle-button/hx-toggle-button.d.ts.map +1 -1
  239. package/dist/components/hx-toggle-button/index.js +1 -1
  240. package/dist/components/hx-tooltip/hx-tooltip.d.ts +2 -46
  241. package/dist/components/hx-tooltip/hx-tooltip.d.ts.map +1 -1
  242. package/dist/components/hx-tooltip/index.js +1 -1
  243. package/dist/components/hx-top-nav/hx-top-nav.d.ts +1 -1
  244. package/dist/components/hx-top-nav/hx-top-nav.d.ts.map +1 -1
  245. package/dist/components/hx-top-nav/index.js +1 -1
  246. package/dist/components/hx-tree-view/hx-tree-item.d.ts +51 -1
  247. package/dist/components/hx-tree-view/hx-tree-item.d.ts.map +1 -1
  248. package/dist/components/hx-tree-view/hx-tree-view.d.ts +16 -1
  249. package/dist/components/hx-tree-view/hx-tree-view.d.ts.map +1 -1
  250. package/dist/components/hx-tree-view/index.js +1 -1
  251. package/dist/components/hx-visually-hidden/hx-visually-hidden.d.ts +1 -1
  252. package/dist/index.d.ts +20 -2
  253. package/dist/index.d.ts.map +1 -1
  254. package/dist/index.js +168 -154
  255. package/dist/index.js.map +1 -1
  256. package/dist/shared/body-scroll-lock-VBa5TFP-.js +12 -0
  257. package/dist/shared/body-scroll-lock-VBa5TFP-.js.map +1 -0
  258. package/dist/shared/dev-warn-YlwPHjtX.js +6 -0
  259. package/dist/shared/dev-warn-YlwPHjtX.js.map +1 -0
  260. package/dist/shared/{hx-accordion-D95XSAft.js → hx-accordion-Cyswa6J3.js} +46 -43
  261. package/dist/shared/hx-accordion-Cyswa6J3.js.map +1 -0
  262. package/dist/shared/{hx-action-bar-B4i9tBCP.js → hx-action-bar-we_WJety.js} +41 -40
  263. package/dist/shared/hx-action-bar-we_WJety.js.map +1 -0
  264. package/dist/shared/{hx-alert-BQpT4gL3.js → hx-alert-Cg-zxRiU.js} +2 -2
  265. package/dist/shared/hx-alert-Cg-zxRiU.js.map +1 -0
  266. package/dist/shared/{hx-avatar-yHjmNdtf.js → hx-avatar-Cep6Urm3.js} +62 -65
  267. package/dist/shared/hx-avatar-Cep6Urm3.js.map +1 -0
  268. package/dist/shared/hx-banner-lxAIJ2kR.js +349 -0
  269. package/dist/shared/hx-banner-lxAIJ2kR.js.map +1 -0
  270. package/dist/shared/{hx-breadcrumb-item-DtSxRZ_W.js → hx-breadcrumb-item-C0rz0fzV.js} +46 -44
  271. package/dist/shared/hx-breadcrumb-item-C0rz0fzV.js.map +1 -0
  272. package/dist/shared/{hx-button-CtiJsmOg.js → hx-button-Cbhqpm5i.js} +111 -28
  273. package/dist/shared/hx-button-Cbhqpm5i.js.map +1 -0
  274. package/dist/shared/{hx-button-group-BMV5qFs4.js → hx-button-group-CWjWv-wS.js} +10 -10
  275. package/dist/shared/hx-button-group-CWjWv-wS.js.map +1 -0
  276. package/dist/shared/{hx-card-DAkEfpJd.js → hx-card-Bg4W4uXC.js} +16 -16
  277. package/dist/shared/hx-card-Bg4W4uXC.js.map +1 -0
  278. package/dist/shared/{hx-carousel-item-C2yBnM0r.js → hx-carousel-item-BKpmFbUT.js} +101 -63
  279. package/dist/shared/hx-carousel-item-BKpmFbUT.js.map +1 -0
  280. package/dist/shared/hx-checkbox-BMayOpAM.js.map +1 -1
  281. package/dist/shared/{hx-checkbox-group-DTS9iT4b.js → hx-checkbox-group-ydUdV9Sx.js} +7 -7
  282. package/dist/shared/hx-checkbox-group-ydUdV9Sx.js.map +1 -0
  283. package/dist/shared/{hx-code-snippet-DdEqy-1B.js → hx-code-snippet-B4hV7rWG.js} +65 -53
  284. package/dist/shared/hx-code-snippet-B4hV7rWG.js.map +1 -0
  285. package/dist/shared/{hx-color-picker-K2x_dyeG.js → hx-color-picker-BvfJ_h16.js} +100 -90
  286. package/dist/shared/hx-color-picker-BvfJ_h16.js.map +1 -0
  287. package/dist/shared/{hx-combobox-DjMigccw.js → hx-combobox-BBi3izKJ.js} +80 -44
  288. package/dist/shared/hx-combobox-BBi3izKJ.js.map +1 -0
  289. package/dist/shared/hx-container-DLUKnTi9.js.map +1 -1
  290. package/dist/shared/{hx-copy-button-BXL1xkxb.js → hx-copy-button-CLBA31to.js} +45 -50
  291. package/dist/shared/hx-copy-button-CLBA31to.js.map +1 -0
  292. package/dist/shared/hx-counter-D-1NXzGs.js +138 -0
  293. package/dist/shared/hx-counter-D-1NXzGs.js.map +1 -0
  294. package/dist/shared/{hx-data-table-D3NZvc3P.js → hx-data-table-DNiDVWR2.js} +100 -95
  295. package/dist/shared/hx-data-table-DNiDVWR2.js.map +1 -0
  296. package/dist/shared/{hx-date-picker-CIHwx9b3.js → hx-date-picker-D7yCK0nk.js} +17 -12
  297. package/dist/shared/hx-date-picker-D7yCK0nk.js.map +1 -0
  298. package/dist/shared/{hx-dialog-e4CSD8xX.js → hx-dialog-Z7Ou_AZ9.js} +37 -36
  299. package/dist/shared/hx-dialog-Z7Ou_AZ9.js.map +1 -0
  300. package/dist/shared/hx-divider-XgWIz4Mr.js.map +1 -1
  301. package/dist/shared/{hx-drawer-bTF0nbrg.js → hx-drawer-Dk-_xzy0.js} +59 -58
  302. package/dist/shared/hx-drawer-Dk-_xzy0.js.map +1 -0
  303. package/dist/shared/hx-dropdown-DnjLnkTj.js.map +1 -1
  304. package/dist/shared/{hx-field-Dz-7M_SC.js → hx-field-CDP8EXuj.js} +22 -19
  305. package/dist/shared/hx-field-CDP8EXuj.js.map +1 -0
  306. package/dist/shared/{hx-file-upload-DnYiIhyN.js → hx-file-upload-CUORgnKc.js} +17 -14
  307. package/dist/shared/hx-file-upload-CUORgnKc.js.map +1 -0
  308. package/dist/shared/{hx-form-BJeLK34m.js → hx-form-BFv_N1dm.js} +9 -1
  309. package/dist/shared/{hx-form-BJeLK34m.js.map → hx-form-BFv_N1dm.js.map} +1 -1
  310. package/dist/shared/hx-help-text-DaOPN1iB.js.map +1 -1
  311. package/dist/shared/{hx-icon-button-C_fsUJW4.js → hx-icon-button-C83bCR0K.js} +2 -4
  312. package/dist/shared/hx-icon-button-C83bCR0K.js.map +1 -0
  313. package/dist/shared/{hx-list-CF-AAnp-.js → hx-list-CdRNgeoP.js} +7 -9
  314. package/dist/shared/{hx-list-CF-AAnp-.js.map → hx-list-CdRNgeoP.js.map} +1 -1
  315. package/dist/shared/{hx-menu-divider-Buc5XA9E.js → hx-menu-divider-11Dp2VfM.js} +50 -48
  316. package/dist/shared/hx-menu-divider-11Dp2VfM.js.map +1 -0
  317. package/dist/shared/{hx-meter-qcXl0zCL.js → hx-meter-UinDQjl6.js} +43 -37
  318. package/dist/shared/hx-meter-UinDQjl6.js.map +1 -0
  319. package/dist/shared/{hx-nav-CWwByFdq.js → hx-nav-DSpwWYUX.js} +81 -81
  320. package/dist/shared/hx-nav-DSpwWYUX.js.map +1 -0
  321. package/dist/shared/{hx-nav-item-DItaMWl0.js → hx-nav-item-D54-5eUM.js} +12 -12
  322. package/dist/shared/hx-nav-item-D54-5eUM.js.map +1 -0
  323. package/dist/shared/{hx-number-input-CS6_w1lT.js → hx-number-input-BP6TIA92.js} +5 -1
  324. package/dist/shared/hx-number-input-BP6TIA92.js.map +1 -0
  325. package/dist/shared/{hx-overflow-menu-CAS1Mlus.js → hx-overflow-menu-C7k5wlZy.js} +39 -34
  326. package/dist/shared/hx-overflow-menu-C7k5wlZy.js.map +1 -0
  327. package/dist/shared/{hx-pagination-DNFgXQm3.js → hx-pagination-BQ0cLTuB.js} +65 -62
  328. package/dist/shared/hx-pagination-BQ0cLTuB.js.map +1 -0
  329. package/dist/shared/{hx-popover-BjAyLbzp.js → hx-popover-BQsgrJCW.js} +7 -7
  330. package/dist/shared/hx-popover-BQsgrJCW.js.map +1 -0
  331. package/dist/shared/{hx-progress-bar-b3_m1hna.js → hx-progress-bar-C_mdPVF-.js} +61 -52
  332. package/dist/shared/hx-progress-bar-C_mdPVF-.js.map +1 -0
  333. package/dist/shared/{hx-progress-ring-wOSv2y_I.js → hx-progress-ring-BHJBaXNk.js} +2 -4
  334. package/dist/shared/hx-progress-ring-BHJBaXNk.js.map +1 -0
  335. package/dist/shared/{hx-radio-CGtFKls2.js → hx-radio-Bqyi8re3.js} +44 -12
  336. package/dist/shared/hx-radio-Bqyi8re3.js.map +1 -0
  337. package/dist/shared/{hx-rating-C4kTOyHF.js → hx-rating-Y_t7Z4qb.js} +104 -67
  338. package/dist/shared/hx-rating-Y_t7Z4qb.js.map +1 -0
  339. package/dist/shared/{hx-select-D9bYJcDv.js → hx-select-BBae2LqN.js} +16 -10
  340. package/dist/shared/hx-select-BBae2LqN.js.map +1 -0
  341. package/dist/shared/{hx-slider-Duzmuid9.js → hx-slider-CpnxH2UP.js} +9 -5
  342. package/dist/shared/{hx-slider-Duzmuid9.js.map → hx-slider-CpnxH2UP.js.map} +1 -1
  343. package/dist/shared/{hx-split-button-DhncgAtZ.js → hx-split-button-BvwoG8h2.js} +14 -13
  344. package/dist/shared/hx-split-button-BvwoG8h2.js.map +1 -0
  345. package/dist/shared/hx-split-panel-Cxkeauwe.js.map +1 -1
  346. package/dist/shared/hx-stat-C2wfph8W.js +212 -0
  347. package/dist/shared/hx-stat-C2wfph8W.js.map +1 -0
  348. package/dist/shared/{hx-step-nMT0fHEn.js → hx-step-DYoIumpR.js} +29 -29
  349. package/dist/shared/hx-step-DYoIumpR.js.map +1 -0
  350. package/dist/shared/{hx-structured-list-CMja1VXz.js → hx-structured-list-CMWllxGg.js} +23 -17
  351. package/dist/shared/{hx-structured-list-CMja1VXz.js.map → hx-structured-list-CMWllxGg.js.map} +1 -1
  352. package/dist/shared/{hx-switch-BPvIcDpM.js → hx-switch-DkKchcuP.js} +8 -3
  353. package/dist/shared/{hx-switch-BPvIcDpM.js.map → hx-switch-DkKchcuP.js.map} +1 -1
  354. package/dist/shared/{hx-tab-panel-C7h5lRpw.js → hx-tab-panel-CHB0u1zF.js} +91 -85
  355. package/dist/shared/hx-tab-panel-CHB0u1zF.js.map +1 -0
  356. package/dist/shared/hx-td-CVwCGBYf.js +604 -0
  357. package/dist/shared/hx-td-CVwCGBYf.js.map +1 -0
  358. package/dist/shared/{hx-text-input-BUMgOQHX.js → hx-text-input-BrCjo4fJ.js} +5 -1
  359. package/dist/shared/hx-text-input-BrCjo4fJ.js.map +1 -0
  360. package/dist/shared/{hx-textarea-B_nmxzhC.js → hx-textarea-BsQdB1Rk.js} +51 -18
  361. package/dist/shared/hx-textarea-BsQdB1Rk.js.map +1 -0
  362. package/dist/shared/{hx-time-picker-a-BCkecJ.js → hx-time-picker-DRRAFuVd.js} +62 -54
  363. package/dist/shared/hx-time-picker-DRRAFuVd.js.map +1 -0
  364. package/dist/shared/{hx-toggle-button--xCXWRJW.js → hx-toggle-button-D4F1soEM.js} +34 -22
  365. package/dist/shared/{hx-toggle-button--xCXWRJW.js.map → hx-toggle-button-D4F1soEM.js.map} +1 -1
  366. package/dist/shared/{hx-tooltip-DN6lMlP5.js → hx-tooltip-Bk1iQRHs.js} +23 -23
  367. package/dist/shared/hx-tooltip-Bk1iQRHs.js.map +1 -0
  368. package/dist/shared/{hx-top-nav-8lDKNZUj.js → hx-top-nav-DzW7XLv-.js} +42 -29
  369. package/dist/shared/{hx-top-nav-8lDKNZUj.js.map → hx-top-nav-DzW7XLv-.js.map} +1 -1
  370. package/dist/shared/{hx-tree-item-Cesh_du5.js → hx-tree-item-DdH6RbMs.js} +170 -111
  371. package/dist/shared/hx-tree-item-DdH6RbMs.js.map +1 -0
  372. package/dist/shared/{hx-toast-ikwh9Y03.js → toast-factory-B8jicczW.js} +69 -66
  373. package/dist/shared/toast-factory-B8jicczW.js.map +1 -0
  374. package/dist/tools/cem-a11y-analyzer/analyzers/aria-analyzer.d.ts +12 -0
  375. package/dist/tools/cem-a11y-analyzer/analyzers/aria-analyzer.d.ts.map +1 -0
  376. package/dist/tools/cem-a11y-analyzer/analyzers/focus-analyzer.d.ts +13 -0
  377. package/dist/tools/cem-a11y-analyzer/analyzers/focus-analyzer.d.ts.map +1 -0
  378. package/dist/tools/cem-a11y-analyzer/analyzers/form-analyzer.d.ts +13 -0
  379. package/dist/tools/cem-a11y-analyzer/analyzers/form-analyzer.d.ts.map +1 -0
  380. package/dist/tools/cem-a11y-analyzer/analyzers/keyboard-analyzer.d.ts +12 -0
  381. package/dist/tools/cem-a11y-analyzer/analyzers/keyboard-analyzer.d.ts.map +1 -0
  382. package/dist/tools/cem-a11y-analyzer/analyzers/label-analyzer.d.ts +13 -0
  383. package/dist/tools/cem-a11y-analyzer/analyzers/label-analyzer.d.ts.map +1 -0
  384. package/dist/tools/cem-a11y-analyzer/analyzers/motion-analyzer.d.ts +12 -0
  385. package/dist/tools/cem-a11y-analyzer/analyzers/motion-analyzer.d.ts.map +1 -0
  386. package/dist/tools/cem-a11y-analyzer/index.d.ts +14 -0
  387. package/dist/tools/cem-a11y-analyzer/index.d.ts.map +1 -0
  388. package/dist/tools/cem-a11y-analyzer/reporter.d.ts +6 -0
  389. package/dist/tools/cem-a11y-analyzer/reporter.d.ts.map +1 -0
  390. package/dist/tools/cem-a11y-analyzer/scorer.d.ts +22 -0
  391. package/dist/tools/cem-a11y-analyzer/scorer.d.ts.map +1 -0
  392. package/dist/tools/cem-a11y-analyzer/types.d.ts +171 -0
  393. package/dist/tools/cem-a11y-analyzer/types.d.ts.map +1 -0
  394. package/dist/utils/body-scroll-lock.d.ts +34 -0
  395. package/dist/utils/body-scroll-lock.d.ts.map +1 -0
  396. package/dist/utils/dev-warn.d.ts +19 -0
  397. package/dist/utils/dev-warn.d.ts.map +1 -0
  398. package/package.json +33 -27
  399. package/dist/shared/hx-accordion-D95XSAft.js.map +0 -1
  400. package/dist/shared/hx-action-bar-B4i9tBCP.js.map +0 -1
  401. package/dist/shared/hx-alert-BQpT4gL3.js.map +0 -1
  402. package/dist/shared/hx-avatar-yHjmNdtf.js.map +0 -1
  403. package/dist/shared/hx-breadcrumb-item-DtSxRZ_W.js.map +0 -1
  404. package/dist/shared/hx-button-CtiJsmOg.js.map +0 -1
  405. package/dist/shared/hx-button-group-BMV5qFs4.js.map +0 -1
  406. package/dist/shared/hx-card-DAkEfpJd.js.map +0 -1
  407. package/dist/shared/hx-carousel-item-C2yBnM0r.js.map +0 -1
  408. package/dist/shared/hx-checkbox-group-DTS9iT4b.js.map +0 -1
  409. package/dist/shared/hx-code-snippet-DdEqy-1B.js.map +0 -1
  410. package/dist/shared/hx-color-picker-K2x_dyeG.js.map +0 -1
  411. package/dist/shared/hx-combobox-DjMigccw.js.map +0 -1
  412. package/dist/shared/hx-copy-button-BXL1xkxb.js.map +0 -1
  413. package/dist/shared/hx-data-table-D3NZvc3P.js.map +0 -1
  414. package/dist/shared/hx-date-picker-CIHwx9b3.js.map +0 -1
  415. package/dist/shared/hx-dialog-e4CSD8xX.js.map +0 -1
  416. package/dist/shared/hx-drawer-bTF0nbrg.js.map +0 -1
  417. package/dist/shared/hx-field-Dz-7M_SC.js.map +0 -1
  418. package/dist/shared/hx-file-upload-DnYiIhyN.js.map +0 -1
  419. package/dist/shared/hx-icon-button-C_fsUJW4.js.map +0 -1
  420. package/dist/shared/hx-menu-divider-Buc5XA9E.js.map +0 -1
  421. package/dist/shared/hx-meter-qcXl0zCL.js.map +0 -1
  422. package/dist/shared/hx-nav-CWwByFdq.js.map +0 -1
  423. package/dist/shared/hx-nav-item-DItaMWl0.js.map +0 -1
  424. package/dist/shared/hx-number-input-CS6_w1lT.js.map +0 -1
  425. package/dist/shared/hx-overflow-menu-CAS1Mlus.js.map +0 -1
  426. package/dist/shared/hx-pagination-DNFgXQm3.js.map +0 -1
  427. package/dist/shared/hx-popover-BjAyLbzp.js.map +0 -1
  428. package/dist/shared/hx-progress-bar-b3_m1hna.js.map +0 -1
  429. package/dist/shared/hx-progress-ring-wOSv2y_I.js.map +0 -1
  430. package/dist/shared/hx-radio-CGtFKls2.js.map +0 -1
  431. package/dist/shared/hx-rating-C4kTOyHF.js.map +0 -1
  432. package/dist/shared/hx-select-D9bYJcDv.js.map +0 -1
  433. package/dist/shared/hx-split-button-DhncgAtZ.js.map +0 -1
  434. package/dist/shared/hx-step-nMT0fHEn.js.map +0 -1
  435. package/dist/shared/hx-tab-panel-C7h5lRpw.js.map +0 -1
  436. package/dist/shared/hx-text-input-BUMgOQHX.js.map +0 -1
  437. package/dist/shared/hx-textarea-B_nmxzhC.js.map +0 -1
  438. package/dist/shared/hx-time-picker-a-BCkecJ.js.map +0 -1
  439. package/dist/shared/hx-toast-ikwh9Y03.js.map +0 -1
  440. package/dist/shared/hx-tooltip-DN6lMlP5.js.map +0 -1
  441. package/dist/shared/hx-tree-item-Cesh_du5.js.map +0 -1
@@ -38,10 +38,10 @@ const y = m`
38
38
  display: none;
39
39
  }
40
40
  `;
41
- var _ = Object.defineProperty, v = Object.getOwnPropertyDescriptor, p = (e, s, t, i) => {
42
- for (var r = i > 1 ? void 0 : i ? v(s, t) : s, a = e.length - 1, n; a >= 0; a--)
43
- (n = e[a]) && (r = (i ? n(s, t, r) : n(r)) || r);
44
- return i && r && _(s, t, r), r;
41
+ var _ = Object.defineProperty, v = Object.getOwnPropertyDescriptor, p = (e, t, s, i) => {
42
+ for (var r = i > 1 ? void 0 : i ? v(t, s) : t, a = e.length - 1, n; a >= 0; a--)
43
+ (n = e[a]) && (r = (i ? n(t, s, r) : n(r)) || r);
44
+ return i && r && _(t, s, r), r;
45
45
  };
46
46
  let o = class extends u {
47
47
  constructor() {
@@ -53,7 +53,7 @@ let o = class extends u {
53
53
  /** Returns only real breadcrumb items, excluding the managed ellipsis element. */
54
54
  _getBreadcrumbItems(e) {
55
55
  return e.assignedElements({ flatten: !0 }).filter(
56
- (s) => s.tagName.toLowerCase() === "hx-breadcrumb-item" && !s.classList.contains("hx-bc-ellipsis")
56
+ (t) => t.tagName.toLowerCase() === "hx-breadcrumb-item" && !t.classList.contains("hx-bc-ellipsis")
57
57
  );
58
58
  }
59
59
  /**
@@ -67,54 +67,56 @@ let o = class extends u {
67
67
  * relying on item order.
68
68
  */
69
69
  _applyItemAttributes(e) {
70
- const s = e.some(
71
- (t) => t.hasAttribute("current") && !this._managedCurrentItems.has(t)
70
+ const t = e.some(
71
+ (s) => s.hasAttribute("current") && !this._managedCurrentItems.has(s)
72
72
  );
73
- e.forEach((t, i) => {
74
- const r = t, a = i === e.length - 1;
75
- a ? r.setAttribute("data-bc-last", "") : r.removeAttribute("data-bc-last"), s || (a ? (r.setAttribute("current", ""), this._managedCurrentItems.add(r)) : (r.removeAttribute("current"), this._managedCurrentItems.delete(r)));
73
+ e.forEach((s, i) => {
74
+ const r = s, a = i === e.length - 1;
75
+ a ? r.setAttribute("data-bc-last", "") : r.removeAttribute("data-bc-last"), t || (a ? (r.setAttribute("current", ""), this._managedCurrentItems.add(r)) : (r.removeAttribute("current"), this._managedCurrentItems.delete(r)));
76
76
  });
77
77
  }
78
78
  // ─── Slot Handling ───
79
79
  _handleSlotChange(e) {
80
- const s = e.target, t = this._getBreadcrumbItems(s);
80
+ if (!(e.target instanceof HTMLSlotElement)) return;
81
+ const t = this._getBreadcrumbItems(e.target);
81
82
  this.maxItems > 0 && t.length > this.maxItems ? this._applyCollapse(t) : this._removeCollapse(t), this._applyItemAttributes(t), this.jsonLd && this._updateJsonLd(t);
82
83
  }
83
84
  _handleSeparatorSlotChange(e) {
84
- var i;
85
+ var s;
86
+ if (!(e.target instanceof HTMLSlotElement)) return;
85
87
  const t = e.target.assignedElements({ flatten: !0 });
86
88
  if (t.length > 0) {
87
- const r = ((i = t[0].textContent) == null ? void 0 : i.trim()) ?? "";
88
- this.style.setProperty("--hx-breadcrumb-separator-content", JSON.stringify(r));
89
+ const i = ((s = t[0].textContent) == null ? void 0 : s.trim()) ?? "";
90
+ this.style.setProperty("--hx-breadcrumb-separator-content", JSON.stringify(i));
89
91
  }
90
92
  }
91
93
  // ─── Collapse ───
92
94
  _applyCollapse(e) {
93
- if (e.forEach((t, i) => {
94
- const r = t;
95
+ if (e.forEach((s, i) => {
96
+ const r = s;
95
97
  i === 0 || i === e.length - 1 ? r.removeAttribute("data-bc-hidden") : r.setAttribute("data-bc-hidden", "");
96
98
  }), !this._ellipsisItem) {
97
- const t = document.createElement("hx-breadcrumb-item");
98
- t.classList.add("hx-bc-ellipsis");
99
+ const s = document.createElement("hx-breadcrumb-item");
100
+ s.classList.add("hx-bc-ellipsis");
99
101
  const i = document.createElement("button");
100
- i.type = "button", i.textContent = "…", i.setAttribute("aria-label", "Show all breadcrumb items"), t.appendChild(i), this._ellipsisItem = t;
102
+ i.type = "button", i.textContent = "…", i.setAttribute("aria-label", "Show all breadcrumb items"), s.appendChild(i), this._ellipsisItem = s;
101
103
  }
102
- const s = e[0];
103
- s && this._ellipsisItem.previousElementSibling !== s && s.after(this._ellipsisItem);
104
+ const t = e[0];
105
+ t && this._ellipsisItem.previousElementSibling !== t && t.after(this._ellipsisItem);
104
106
  }
105
107
  _removeCollapse(e) {
106
- var s;
107
- e.forEach((t) => {
108
- t.removeAttribute("data-bc-hidden");
109
- }), (s = this._ellipsisItem) != null && s.isConnected && this._ellipsisItem.remove();
108
+ var t;
109
+ e.forEach((s) => {
110
+ s.removeAttribute("data-bc-hidden");
111
+ }), (t = this._ellipsisItem) != null && t.isConnected && this._ellipsisItem.remove();
110
112
  }
111
113
  _handleEllipsisClick(e) {
112
- var s, t;
113
- (t = (s = e.target) == null ? void 0 : s.closest) != null && t.call(s, ".hx-bc-ellipsis") && this._expandBreadcrumb();
114
+ var t, s;
115
+ (s = (t = e.target) == null ? void 0 : t.closest) != null && s.call(t, ".hx-bc-ellipsis") && this._expandBreadcrumb();
114
116
  }
115
117
  _handleEllipsisKeydown(e) {
116
- var s, t;
117
- (e.key === "Enter" || e.key === " ") && (t = (s = e.target) == null ? void 0 : s.closest) != null && t.call(s, ".hx-bc-ellipsis") && (e.preventDefault(), this._expandBreadcrumb());
118
+ var t, s;
119
+ e instanceof KeyboardEvent && (e.key === "Enter" || e.key === " ") && (s = (t = e.target) == null ? void 0 : t.closest) != null && s.call(t, ".hx-bc-ellipsis") && (e.preventDefault(), this._expandBreadcrumb());
118
120
  }
119
121
  /**
120
122
  * Expands a collapsed breadcrumb by resetting maxItems to 0.
@@ -127,23 +129,23 @@ let o = class extends u {
127
129
  /**
128
130
  * JSON-LD ListItem entry with typed fields to avoid Record<string, unknown>.
129
131
  */
130
- _buildListItem(e, s) {
132
+ _buildListItem(e, t) {
131
133
  var a;
132
- const t = e.getAttribute("href"), i = ((a = e.textContent) == null ? void 0 : a.trim()) ?? "", r = {
134
+ const s = e.getAttribute("href"), i = ((a = e.textContent) == null ? void 0 : a.trim()) ?? "", r = {
133
135
  "@type": "ListItem",
134
- position: s,
136
+ position: t,
135
137
  name: i
136
138
  };
137
- return t && (r.item = t), r;
139
+ return s && (r.item = s), r;
138
140
  }
139
141
  _updateJsonLd(e) {
140
- var t;
141
- const s = {
142
+ var s;
143
+ const t = {
142
144
  "@context": "https://schema.org",
143
145
  "@type": "BreadcrumbList",
144
146
  itemListElement: e.map((i, r) => this._buildListItem(i, r + 1))
145
147
  };
146
- this._jsonLdScript || ((t = document.getElementById(this._jsonLdId)) == null || t.remove(), this._jsonLdScript = document.createElement("script"), this._jsonLdScript.type = "application/ld+json", this._jsonLdScript.id = this._jsonLdId, this._jsonLdScript.setAttribute("data-hx-breadcrumb", ""), document.head.appendChild(this._jsonLdScript)), this._jsonLdScript.textContent = JSON.stringify(s);
148
+ this._jsonLdScript || ((s = document.getElementById(this._jsonLdId)) == null || s.remove(), this._jsonLdScript = document.createElement("script"), this._jsonLdScript.type = "application/ld+json", this._jsonLdScript.id = this._jsonLdId, this._jsonLdScript.setAttribute("data-hx-breadcrumb", ""), document.head.appendChild(this._jsonLdScript)), this._jsonLdScript.textContent = JSON.stringify(t);
147
149
  }
148
150
  _removeJsonLd() {
149
151
  var e;
@@ -157,9 +159,9 @@ let o = class extends u {
157
159
  super.disconnectedCallback(), this.removeEventListener("click", this._boundEllipsisClick), this.removeEventListener("keydown", this._boundEllipsisKeydown), this._removeJsonLd();
158
160
  }
159
161
  updated(e) {
160
- var s, t;
162
+ var t, s;
161
163
  if (super.updated(e), e.has("separator") && this.style.setProperty("--hx-breadcrumb-separator-content", JSON.stringify(this.separator)), e.has("maxItems")) {
162
- const i = (s = this.shadowRoot) == null ? void 0 : s.querySelector("slot:not([name])");
164
+ const i = (t = this.shadowRoot) == null ? void 0 : t.querySelector("slot:not([name])");
163
165
  if (i) {
164
166
  const r = this._getBreadcrumbItems(i);
165
167
  this.maxItems > 0 && r.length > this.maxItems ? this._applyCollapse(r) : this._removeCollapse(r), this._applyItemAttributes(r);
@@ -167,7 +169,7 @@ let o = class extends u {
167
169
  }
168
170
  if (e.has("jsonLd"))
169
171
  if (this.jsonLd) {
170
- const i = (t = this.shadowRoot) == null ? void 0 : t.querySelector("slot:not([name])");
172
+ const i = (s = this.shadowRoot) == null ? void 0 : s.querySelector("slot:not([name])");
171
173
  i && this._updateJsonLd(this._getBreadcrumbItems(i));
172
174
  } else
173
175
  this._removeJsonLd();
@@ -275,10 +277,10 @@ const g = m`
275
277
  padding: 0;
276
278
  }
277
279
  `;
278
- var C = Object.defineProperty, L = Object.getOwnPropertyDescriptor, h = (e, s, t, i) => {
279
- for (var r = i > 1 ? void 0 : i ? L(s, t) : s, a = e.length - 1, n; a >= 0; a--)
280
- (n = e[a]) && (r = (i ? n(s, t, r) : n(r)) || r);
281
- return i && r && C(s, t, r), r;
280
+ var L = Object.defineProperty, C = Object.getOwnPropertyDescriptor, h = (e, t, s, i) => {
281
+ for (var r = i > 1 ? void 0 : i ? C(t, s) : t, a = e.length - 1, n; a >= 0; a--)
282
+ (n = e[a]) && (r = (i ? n(t, s, r) : n(r)) || r);
283
+ return i && r && L(t, s, r), r;
282
284
  };
283
285
  let c = class extends u {
284
286
  constructor() {
@@ -313,4 +315,4 @@ export {
313
315
  o as H,
314
316
  c as a
315
317
  };
316
- //# sourceMappingURL=hx-breadcrumb-item-DtSxRZ_W.js.map
318
+ //# sourceMappingURL=hx-breadcrumb-item-C0rz0fzV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hx-breadcrumb-item-C0rz0fzV.js","sources":["../../src/components/hx-breadcrumb/hx-breadcrumb.styles.ts","../../src/components/hx-breadcrumb/hx-breadcrumb.ts","../../src/components/hx-breadcrumb/hx-breadcrumb-item.styles.ts","../../src/components/hx-breadcrumb/hx-breadcrumb-item.ts"],"sourcesContent":["import { css } from 'lit';\n\nexport const helixBreadcrumbStyles = css`\n :host {\n display: block;\n font-family: var(\n --hx-breadcrumb-font-family,\n var(--hx-font-family-sans, system-ui, sans-serif)\n );\n font-size: var(--hx-breadcrumb-font-size, var(--hx-font-size-sm, 0.875rem));\n }\n\n [part='nav'] {\n /* nav landmark — no additional styling needed */\n }\n\n [part='list'] {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n list-style: none;\n margin: 0;\n padding: 0;\n gap: 0;\n }\n\n /* Hide middle items when collapsed via maxItems */\n ::slotted([data-bc-hidden]) {\n display: none;\n }\n\n /* Visually hide the separator slot — used only to read text content.\n * display:none is intentional: the slot contains no interactive or focusable\n * content. If a future change adds focusable elements to this slot, switch to\n * visibility:hidden + position:absolute to preserve focus reachability. */\n .separator-slot {\n display: none;\n }\n`;\n","import { LitElement, html } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { tokenStyles } from '@helixui/tokens/lit';\nimport { helixBreadcrumbStyles } from './hx-breadcrumb.styles.js';\n\n/**\n * Hierarchical page path navigation showing current location in site structure.\n *\n * @summary Navigation breadcrumb showing the page hierarchy. Works with Drupal's breadcrumb system.\n *\n * @tag hx-breadcrumb\n *\n * @slot - Default slot for hx-breadcrumb-item children.\n * @slot separator - Optional separator element. Its text content overrides the `separator` property.\n *\n * @csspart nav - The nav landmark element.\n * @csspart list - The ordered list containing items.\n *\n * @cssprop [--hx-breadcrumb-separator-content='/'] - Separator character between items.\n * NOTE: If overriding this custom property directly in CSS (rather than via the `separator`\n * attribute), the value MUST be quoted: `--hx-breadcrumb-separator-content: \">\"`. An unquoted\n * value is invalid for the CSS `content` property and will silently render nothing.\n * @cssprop [--hx-breadcrumb-separator-color=var(--hx-color-neutral-400)] - Separator color.\n * @cssprop [--hx-breadcrumb-separator-gap=var(--hx-space-1)] - Horizontal gap around separators.\n * @cssprop [--hx-breadcrumb-font-size=var(--hx-font-size-sm)] - Font size.\n * @cssprop [--hx-breadcrumb-link-color=var(--hx-color-primary-600)] - Link color.\n * @cssprop [--hx-breadcrumb-link-hover-color=var(--hx-color-primary-700)] - Link hover color.\n * @cssprop [--hx-breadcrumb-text-color=var(--hx-color-neutral-700)] - Current page text color.\n * @cssprop [--hx-breadcrumb-item-max-width] - Max-width for item text truncation (e.g. `12rem`).\n */\n/** Typed schema.org ListItem entry for JSON-LD BreadcrumbList structured data. */\ninterface JsonLdListItem {\n '@type': string;\n position: number;\n name: string;\n item?: string;\n}\n\n/** Breadcrumb navigation component with automatic truncation and JSON-LD structured data. @tag hx-breadcrumb */\n@customElement('hx-breadcrumb')\nexport class HelixBreadcrumb extends LitElement {\n static override styles = [tokenStyles, helixBreadcrumbStyles];\n\n /**\n * Per-instance counter used to generate stable, deterministic IDs for the\n * injected JSON-LD script tags. Deterministic IDs (vs Math.random()) allow\n * SSR frameworks to match server-rendered script tags during hydration.\n */\n private static _instanceCounter = 0;\n\n /**\n * The separator character displayed between breadcrumb items.\n * @attr separator\n */\n @property({ type: String })\n separator = '/';\n\n /**\n * The accessible label for the nav landmark.\n * @attr label\n */\n @property({ type: String })\n label = 'Breadcrumb';\n\n /**\n * Maximum number of items to show before collapsing middle items with an ellipsis.\n * Set to 0 (default) to show all items. The ellipsis is a keyboard-accessible\n * button; activating it expands the full breadcrumb by setting maxItems to 0.\n * @attr max-items\n */\n @property({ type: Number, attribute: 'max-items' })\n maxItems = 0;\n\n /**\n * When true, injects a JSON-LD BreadcrumbList structured data script into the document head.\n *\n * NOTE: Drupal manages `<head>` content via its own render pipeline. Injecting a\n * `<script>` directly via `document.head.appendChild()` in a Drupal context:\n * 1. Bypasses Drupal's deduplication and `hook_html_head_alter()` hook.\n * 2. Is not cacheable by Drupal's page cache.\n * 3. Will be wiped on BigPipe partial page replacements.\n *\n * For Drupal integrations, leave `json-ld` false and use the structured data\n * Twig template instead (see `hx-breadcrumb.twig` in the component directory).\n *\n * @attr json-ld\n */\n @property({ type: Boolean, attribute: 'json-ld' })\n jsonLd = false;\n\n /** @internal */\n private _ellipsisItem: Element | null = null;\n /** @internal */\n private _jsonLdScript: HTMLScriptElement | null = null;\n /** @internal */\n private _boundEllipsisClick: (e: Event) => void = () => undefined;\n /** @internal */\n private _boundEllipsisKeydown: (e: Event) => void = () => undefined;\n\n /**\n * Tracks which items had their `current` attribute set by this component\n * (as opposed to set by a consumer/Drupal template). This lets us re-evaluate\n * positional current-page detection on each slotchange without incorrectly\n * treating a previously component-set `current` attribute as a consumer-set\n * explicit override.\n */\n private readonly _managedCurrentItems = new WeakSet<Element>();\n\n /**\n * Stable per-instance ID used to tag the injected script element so that\n * multiple hx-breadcrumb instances on the same page don't produce conflicting\n * or duplicate structured-data blocks. Each instance owns exactly one script\n * tag identified by this ID; any stale tag from a previous render cycle is\n * removed before a new one is inserted.\n *\n * Uses a static counter (not Math.random()) so IDs are deterministic across\n * server and client renders, enabling SSR hydration matching.\n */\n private readonly _jsonLdId = `hx-breadcrumb-ld-${++HelixBreadcrumb._instanceCounter}`;\n\n // ─── Item Helpers ───\n\n /** Returns only real breadcrumb items, excluding the managed ellipsis element. */\n private _getBreadcrumbItems(slot: HTMLSlotElement): Element[] {\n return slot\n .assignedElements({ flatten: true })\n .filter(\n (el) =>\n el.tagName.toLowerCase() === 'hx-breadcrumb-item' &&\n !el.classList.contains('hx-bc-ellipsis'),\n );\n }\n\n /**\n * Applies aria/state attributes to the item list.\n *\n * Current-page detection: if any item has an explicit `current` attribute\n * (e.g. set by a Drupal Twig template), that item is treated as the current\n * page. Otherwise the last item is the current page (default behaviour).\n *\n * This separation allows Drupal to control current-page marking without\n * relying on item order.\n */\n private _applyItemAttributes(items: Element[]): void {\n // Detect consumer-set 'current' attributes. An item has an explicit consumer\n // current if it has the 'current' attribute AND the component did not set it\n // (tracked via _managedCurrentItems). This prevents component-managed state\n // from being misread as a consumer override on subsequent slotchange events.\n const hasExplicitCurrent = items.some(\n (el) => el.hasAttribute('current') && !this._managedCurrentItems.has(el),\n );\n\n items.forEach((item, i) => {\n const el = item as HTMLElement;\n const isLast = i === items.length - 1;\n\n // Separator hiding: always positional — last item has no trailing separator.\n if (isLast) {\n el.setAttribute('data-bc-last', '');\n } else {\n el.removeAttribute('data-bc-last');\n }\n\n // Current-page marker: explicit consumer attribute wins over positional last.\n // The item component renders aria-current=\"page\" on its inner element\n // based on this attribute (see hx-breadcrumb-item.ts).\n if (!hasExplicitCurrent) {\n if (isLast) {\n el.setAttribute('current', '');\n this._managedCurrentItems.add(el);\n } else {\n el.removeAttribute('current');\n this._managedCurrentItems.delete(el);\n }\n }\n // When hasExplicitCurrent is true, leave 'current' attributes as-is so\n // consumer or Drupal template markup is not overridden.\n });\n }\n\n // ─── Slot Handling ───\n\n private _handleSlotChange(e: Event): void {\n if (!(e.target instanceof HTMLSlotElement)) return;\n const items = this._getBreadcrumbItems(e.target);\n\n // Handle collapse behaviour\n if (this.maxItems > 0 && items.length > this.maxItems) {\n this._applyCollapse(items);\n } else {\n this._removeCollapse(items);\n }\n\n this._applyItemAttributes(items);\n\n if (this.jsonLd) {\n this._updateJsonLd(items);\n }\n }\n\n private _handleSeparatorSlotChange(e: Event): void {\n if (!(e.target instanceof HTMLSlotElement)) return;\n const assigned = e.target.assignedElements({ flatten: true });\n if (assigned.length > 0) {\n const text = (assigned[0] as HTMLElement).textContent?.trim() ?? '';\n this.style.setProperty('--hx-breadcrumb-separator-content', JSON.stringify(text));\n }\n }\n\n // ─── Collapse ───\n\n private _applyCollapse(items: Element[]): void {\n // Show only first and last; hide all middle items\n items.forEach((item, i) => {\n const el = item as HTMLElement;\n if (i === 0 || i === items.length - 1) {\n el.removeAttribute('data-bc-hidden');\n } else {\n el.setAttribute('data-bc-hidden', '');\n }\n });\n\n // Create the ellipsis element once\n if (!this._ellipsisItem) {\n const ellipsis = document.createElement('hx-breadcrumb-item');\n ellipsis.classList.add('hx-bc-ellipsis');\n\n // Keyboard-accessible expand button. Events handled via host-level delegation\n // in _handleEllipsisClick / _handleEllipsisKeydown.\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.textContent = '…';\n btn.setAttribute('aria-label', 'Show all breadcrumb items');\n ellipsis.appendChild(btn);\n\n this._ellipsisItem = ellipsis;\n }\n\n // Insert ellipsis after first item only if not already correctly placed\n const firstItem = items[0];\n if (!firstItem) return;\n if (this._ellipsisItem.previousElementSibling !== firstItem) {\n firstItem.after(this._ellipsisItem);\n }\n }\n\n private _removeCollapse(items: Element[]): void {\n items.forEach((item) => {\n (item as HTMLElement).removeAttribute('data-bc-hidden');\n });\n\n if (this._ellipsisItem?.isConnected) {\n this._ellipsisItem.remove();\n }\n }\n\n private _handleEllipsisClick(e: Event): void {\n if ((e.target as Element)?.closest?.('.hx-bc-ellipsis')) {\n this._expandBreadcrumb();\n }\n }\n\n private _handleEllipsisKeydown(e: Event): void {\n if (!(e instanceof KeyboardEvent)) return;\n if (e.key === 'Enter' || e.key === ' ') {\n if ((e.target as Element)?.closest?.('.hx-bc-ellipsis')) {\n e.preventDefault();\n this._expandBreadcrumb();\n }\n }\n }\n\n /**\n * Expands a collapsed breadcrumb by resetting maxItems to 0.\n * Called by the ellipsis expand button (click or Enter/Space).\n */\n private _expandBreadcrumb(): void {\n this.maxItems = 0;\n // updated() will detect the maxItems change and call _removeCollapse.\n }\n\n // ─── JSON-LD ───\n\n /**\n * JSON-LD ListItem entry with typed fields to avoid Record<string, unknown>.\n */\n private _buildListItem(item: Element, position: number): JsonLdListItem {\n const href = (item as HTMLElement).getAttribute('href');\n const name = (item as HTMLElement).textContent?.trim() ?? '';\n const entry: JsonLdListItem = {\n '@type': 'ListItem',\n position,\n name,\n };\n if (href) entry.item = href;\n return entry;\n }\n\n private _updateJsonLd(items: Element[]): void {\n const schema = {\n '@context': 'https://schema.org',\n '@type': 'BreadcrumbList',\n itemListElement: items.map((item, i) => this._buildListItem(item, i + 1)),\n };\n\n if (!this._jsonLdScript) {\n // Dedup guard: remove any stale script with this instance's ID before\n // creating a fresh one. This handles the edge case where the element was\n // reconnected to the DOM after being disconnected without the script\n // reference being re-established.\n document.getElementById(this._jsonLdId)?.remove();\n\n this._jsonLdScript = document.createElement('script');\n this._jsonLdScript.type = 'application/ld+json';\n this._jsonLdScript.id = this._jsonLdId;\n this._jsonLdScript.setAttribute('data-hx-breadcrumb', '');\n document.head.appendChild(this._jsonLdScript);\n }\n\n this._jsonLdScript.textContent = JSON.stringify(schema);\n }\n\n private _removeJsonLd(): void {\n this._jsonLdScript?.remove();\n this._jsonLdScript = null;\n }\n\n // ─── Lifecycle ───\n\n override connectedCallback(): void {\n super.connectedCallback();\n this._boundEllipsisClick = this._handleEllipsisClick.bind(this);\n this._boundEllipsisKeydown = this._handleEllipsisKeydown.bind(this);\n this.addEventListener('click', this._boundEllipsisClick);\n this.addEventListener('keydown', this._boundEllipsisKeydown);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener('click', this._boundEllipsisClick);\n this.removeEventListener('keydown', this._boundEllipsisKeydown);\n this._removeJsonLd();\n }\n\n override updated(changedProperties: Map<string, unknown>): void {\n super.updated(changedProperties);\n\n if (changedProperties.has('separator')) {\n // JSON.stringify wraps the string in quotes so the value is valid\n // for use in the CSS `content` property (e.g. '/' becomes '\"/\"').\n this.style.setProperty('--hx-breadcrumb-separator-content', JSON.stringify(this.separator));\n }\n\n if (changedProperties.has('maxItems')) {\n // Re-evaluate collapse state when maxItems changes programmatically\n // (e.g. when the expand button resets maxItems to 0).\n const slot = this.shadowRoot?.querySelector<HTMLSlotElement>('slot:not([name])');\n if (slot) {\n const items = this._getBreadcrumbItems(slot);\n if (this.maxItems > 0 && items.length > this.maxItems) {\n this._applyCollapse(items);\n } else {\n this._removeCollapse(items);\n }\n this._applyItemAttributes(items);\n }\n }\n\n if (changedProperties.has('jsonLd')) {\n if (this.jsonLd) {\n // json-ld toggled on after initial render — inject script immediately.\n const slot = this.shadowRoot?.querySelector<HTMLSlotElement>('slot:not([name])');\n if (slot) {\n this._updateJsonLd(this._getBreadcrumbItems(slot));\n }\n } else {\n // json-ld toggled off — remove existing script.\n this._removeJsonLd();\n }\n }\n }\n\n // ─── Render ───\n\n override render() {\n return html`\n <nav part=\"nav\" aria-label=${this.label}>\n <ol part=\"list\">\n <slot @slotchange=${this._handleSlotChange}></slot>\n </ol>\n </nav>\n <slot\n name=\"separator\"\n class=\"separator-slot\"\n @slotchange=${this._handleSeparatorSlotChange}\n ></slot>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'hx-breadcrumb': HelixBreadcrumb;\n }\n}\n","import { css } from 'lit';\n\nexport const helixBreadcrumbItemStyles = css`\n :host {\n display: inline-flex;\n align-items: center;\n }\n\n /*\n * display: contents removes [part='item'] from the box model entirely.\n * This is intentional — the wrapper exists only for slot selection purposes.\n * Consumers using ::part(item) CANNOT apply box-model properties (padding,\n * margin, background, border) to this part. Use ::part(link) or ::part(text)\n * for visual styling of breadcrumb item content.\n */\n [part='item'] {\n display: contents;\n }\n\n [part='link'] {\n color: var(--hx-breadcrumb-link-color, var(--hx-color-primary-600));\n text-decoration: none;\n cursor: pointer;\n font-family: inherit;\n font-size: inherit;\n max-width: var(--hx-breadcrumb-item-max-width);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n [part='link']:hover {\n color: var(--hx-breadcrumb-link-hover-color, var(--hx-color-primary-700));\n text-decoration: underline;\n }\n\n [part='link']:focus-visible {\n outline: 2px solid var(--hx-focus-ring-color, var(--hx-color-primary-500));\n outline-offset: 2px;\n border-radius: var(--hx-border-radius-sm, 0.125rem);\n }\n\n [part='text'] {\n color: var(--hx-breadcrumb-text-color, var(--hx-color-neutral-700));\n font-family: inherit;\n font-size: inherit;\n max-width: var(--hx-breadcrumb-item-max-width);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .separator {\n margin-inline: var(--hx-breadcrumb-separator-gap, var(--hx-space-1, 0.25rem));\n color: var(--hx-breadcrumb-separator-color, var(--hx-color-neutral-400));\n user-select: none;\n }\n\n .separator::before {\n content: var(--hx-breadcrumb-separator-content, '/');\n }\n\n /* Normalize buttons slotted into breadcrumb items (e.g. the expand-ellipsis button). */\n ::slotted(button) {\n background: none;\n border: none;\n cursor: pointer;\n font: inherit;\n color: inherit;\n padding: 0;\n }\n`;\n","import { LitElement, html, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { tokenStyles } from '@helixui/tokens/lit';\nimport { helixBreadcrumbItemStyles } from './hx-breadcrumb-item.styles.js';\n\n/**\n * A single breadcrumb navigation item.\n *\n * @summary A navigation item within an hx-breadcrumb component. Renders as a link when `href` is\n * provided, or as static text for the current page item. The current page item is determined by\n * the `current` attribute (set explicitly or automatically by the parent `hx-breadcrumb`).\n *\n * @tag hx-breadcrumb-item\n *\n * @slot - The link or page text content. Accepts text, HTML, or icon elements.\n *\n * @csspart item - Wrapper around the link or text content.\n * @csspart link - The anchor element when href is provided (non-current items only).\n * @csspart text - The span element for the current page or items without href.\n * @csspart separator - The separator element rendered after non-last items.\n *\n * @cssprop [--hx-breadcrumb-link-color=var(--hx-color-primary-600)] - Link text color.\n * @cssprop [--hx-breadcrumb-link-hover-color=var(--hx-color-primary-700)] - Link hover text color.\n * @cssprop [--hx-breadcrumb-text-color=var(--hx-color-neutral-700)] - Current page text color.\n * @cssprop [--hx-breadcrumb-separator-content='/'] - Separator character displayed after non-last items.\n * @cssprop [--hx-breadcrumb-separator-color=var(--hx-color-neutral-400)] - Separator color.\n * @cssprop [--hx-breadcrumb-separator-gap=var(--hx-space-1)] - Horizontal margin around separator.\n * @cssprop [--hx-breadcrumb-item-max-width] - Optional max-width for text truncation.\n */\n@customElement('hx-breadcrumb-item')\nexport class HelixBreadcrumbItem extends LitElement {\n static override styles = [tokenStyles, helixBreadcrumbItemStyles];\n\n override connectedCallback(): void {\n super.connectedCallback();\n // Only apply role=\"listitem\" when this item is a direct child of an\n // hx-breadcrumb element. Setting the role unconditionally when used\n // standalone (outside a list context) creates an invalid ARIA hierarchy\n // because listitem requires a list ancestor.\n //\n // IMPORTANT: If programmatically creating an ellipsis element, set aria-hidden\n // BEFORE inserting into the DOM. connectedCallback fires on insertion and sets\n // role=\"listitem\"; setting aria-hidden after would momentarily expose an\n // un-hidden listitem to the accessibility tree.\n if (this.closest('hx-breadcrumb') !== null) {\n this.setAttribute('role', 'listitem');\n } else {\n this.removeAttribute('role');\n }\n }\n\n /**\n * The URL for this breadcrumb link. Omit for the current page item.\n * When `current` is true, this attribute is ignored and the item always\n * renders as static text per WAI-ARIA APG breadcrumb guidance.\n * @attr href\n */\n @property({ type: String, reflect: true })\n href: string | undefined = undefined;\n\n /**\n * Whether this is the last item in the breadcrumb trail. Set by the parent\n * hx-breadcrumb component via the `data-bc-last` boolean attribute. When\n * present the trailing separator is hidden.\n *\n * @attr data-bc-last\n * @internal\n */\n @property({ type: Boolean, attribute: 'data-bc-last', reflect: true })\n dataBcLast = false;\n\n /**\n * Marks this item as the current page. When set, the item always renders as\n * static text (never a navigable link) and `aria-current=\"page\"` is placed on\n * the inner text element per WAI-ARIA APG breadcrumb guidance, yielding the\n * canonical AT announcement (\"current page, Patient Records\").\n *\n * Can be set explicitly by consumers (e.g. Drupal Twig templates) to override\n * the default positional last-item detection in `hx-breadcrumb`. When any item\n * in the breadcrumb has an explicit `current` attribute, the parent will not\n * override it.\n *\n * @attr current\n */\n @property({ type: Boolean, reflect: true })\n current = false;\n\n override render() {\n // Per WAI-ARIA APG, the current page item MUST NOT be a navigable link.\n // aria-current=\"page\" is placed on the inner element (not the listitem host)\n // for canonical AT announcement (\"current page, Patient Records\" vs\n // \"current page, list item\").\n return html`\n <span part=\"item\">\n ${this.current\n ? html`<span part=\"text\" aria-current=\"page\"><slot></slot></span>`\n : this.href\n ? html`<a part=\"link\" href=${this.href}><slot></slot></a>`\n : html`<span part=\"text\"><slot></slot></span>`}\n </span>\n ${!this.dataBcLast\n ? html`<span class=\"separator\" part=\"separator\" aria-hidden=\"true\"></span>`\n : nothing}\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'hx-breadcrumb-item': HelixBreadcrumbItem;\n }\n}\n"],"names":["helixBreadcrumbStyles","css","HelixBreadcrumb","LitElement","slot","el","items","hasExplicitCurrent","item","isLast","assigned","text","_a","ellipsis","btn","firstItem","_b","position","href","name","entry","schema","i","changedProperties","html","tokenStyles","__decorateClass","property","customElement","helixBreadcrumbItemStyles","HelixBreadcrumbItem","nothing"],"mappings":"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"}
@@ -1,9 +1,9 @@
1
- import { css as d, LitElement as x, html as l, nothing as n } from "lit";
2
- import { property as e, customElement as f } from "lit/decorators.js";
3
- import { classMap as p } from "lit/directives/class-map.js";
4
- import { ifDefined as c } from "lit/directives/if-defined.js";
5
- import { tokenStyles as v } from "@helixui/tokens/lit";
6
- const m = d`
1
+ import { css as p, LitElement as c, html as h, nothing as n } from "lit";
2
+ import { property as e, customElement as x } from "lit/decorators.js";
3
+ import { classMap as d } from "lit/directives/class-map.js";
4
+ import { ifDefined as v } from "lit/directives/if-defined.js";
5
+ import { tokenStyles as f } from "@helixui/tokens/lit";
6
+ const g = p`
7
7
  :host {
8
8
  display: inline-block;
9
9
  }
@@ -13,6 +13,16 @@ const m = d`
13
13
  opacity: var(--hx-opacity-disabled, 0.5);
14
14
  }
15
15
 
16
+ :host([full]) {
17
+ display: block;
18
+ width: 100%;
19
+ }
20
+
21
+ :host([full]) .button {
22
+ width: 100%;
23
+ justify-content: center;
24
+ }
25
+
16
26
  /* ─── Base Button ─── */
17
27
 
18
28
  .button {
@@ -88,7 +98,7 @@ const m = d`
88
98
  }
89
99
 
90
100
  .button--secondary:hover {
91
- --hx-button-bg: var(--hx-color-primary-50);
101
+ --hx-button-bg: var(--hx-button-hover-bg, var(--hx-color-primary-50));
92
102
  }
93
103
 
94
104
  .button--tertiary {
@@ -98,7 +108,7 @@ const m = d`
98
108
  }
99
109
 
100
110
  .button--tertiary:hover {
101
- --hx-button-bg: var(--hx-color-neutral-200);
111
+ --hx-button-bg: var(--hx-button-hover-bg, var(--hx-color-neutral-200));
102
112
  }
103
113
 
104
114
  .button--danger {
@@ -108,7 +118,7 @@ const m = d`
108
118
  }
109
119
 
110
120
  .button--danger:hover {
111
- --hx-button-bg: var(--hx-color-error-600);
121
+ --hx-button-bg: var(--hx-button-hover-bg, var(--hx-color-error-600));
112
122
  }
113
123
 
114
124
  .button--ghost {
@@ -118,7 +128,7 @@ const m = d`
118
128
  }
119
129
 
120
130
  .button--ghost:hover {
121
- --hx-button-bg: var(--hx-color-neutral-100);
131
+ --hx-button-bg: var(--hx-button-hover-bg, var(--hx-color-neutral-100));
122
132
  }
123
133
 
124
134
  .button--outline {
@@ -128,7 +138,11 @@ const m = d`
128
138
  }
129
139
 
130
140
  .button--outline:hover {
131
- --hx-button-bg: var(--hx-color-neutral-50);
141
+ --hx-button-bg: var(--hx-button-hover-bg, var(--hx-color-neutral-50));
142
+ }
143
+
144
+ .button--primary:hover {
145
+ --hx-button-bg: var(--hx-button-hover-bg, var(--hx-color-primary-500));
132
146
  }
133
147
 
134
148
  /* ─── Disabled ─── */
@@ -166,6 +180,69 @@ const m = d`
166
180
  }
167
181
  }
168
182
 
183
+ /* ─── Inverted Mode ─── */
184
+
185
+ /* Override text color and filter-based hover/active for all variants */
186
+ :host([inverted]) .button {
187
+ color: var(--hx-button-inverted-color, #ffffff);
188
+ filter: none;
189
+ }
190
+
191
+ :host([inverted]) .button:hover {
192
+ filter: none;
193
+ }
194
+
195
+ :host([inverted]) .button:active {
196
+ filter: none;
197
+ }
198
+
199
+ :host([inverted]) .button:focus-visible {
200
+ outline-color: var(--hx-button-inverted-focus-ring-color, rgba(255, 255, 255, 0.5));
201
+ }
202
+
203
+ /* Primary inverted — slight transparent white overlay on hover */
204
+ :host([inverted]) .button--primary:hover {
205
+ --hx-button-bg: var(--hx-color-primary-400, #3b82f6);
206
+ }
207
+
208
+ /* Secondary inverted — white border and text */
209
+ :host([inverted]) .button--secondary {
210
+ --hx-button-border-color: rgba(255, 255, 255, 0.7);
211
+ }
212
+
213
+ :host([inverted]) .button--secondary:hover {
214
+ --hx-button-bg: rgba(255, 255, 255, 0.15);
215
+ }
216
+
217
+ /* Tertiary inverted */
218
+ :host([inverted]) .button--tertiary {
219
+ --hx-button-bg: rgba(255, 255, 255, 0.15);
220
+ --hx-button-border-color: transparent;
221
+ }
222
+
223
+ :host([inverted]) .button--tertiary:hover {
224
+ --hx-button-bg: rgba(255, 255, 255, 0.25);
225
+ }
226
+
227
+ /* Ghost inverted — transparent base, white hover bg */
228
+ :host([inverted]) .button--ghost {
229
+ --hx-button-bg: transparent;
230
+ --hx-button-border-color: transparent;
231
+ }
232
+
233
+ :host([inverted]) .button--ghost:hover {
234
+ --hx-button-bg: var(--hx-button-inverted-ghost-hover-bg, rgba(255, 255, 255, 0.15));
235
+ }
236
+
237
+ /* Outline inverted — white border */
238
+ :host([inverted]) .button--outline {
239
+ --hx-button-border-color: rgba(255, 255, 255, 0.7);
240
+ }
241
+
242
+ :host([inverted]) .button--outline:hover {
243
+ --hx-button-bg: rgba(255, 255, 255, 0.15);
244
+ }
245
+
169
246
  /* ─── Prefix / Suffix / Label ─── */
170
247
 
171
248
  .button__prefix,
@@ -179,14 +256,14 @@ const m = d`
179
256
  flex: 1 1 auto;
180
257
  }
181
258
  `;
182
- var g = Object.defineProperty, y = Object.getOwnPropertyDescriptor, r = (o, i, h, s) => {
183
- for (var a = s > 1 ? void 0 : s ? y(i, h) : i, u = o.length - 1, b; u >= 0; u--)
184
- (b = o[u]) && (a = (s ? b(i, h, a) : b(a)) || a);
185
- return s && a && g(i, h, a), a;
259
+ var m = Object.defineProperty, y = Object.getOwnPropertyDescriptor, r = (o, i, l, s) => {
260
+ for (var a = s > 1 ? void 0 : s ? y(i, l) : i, b = o.length - 1, u; b >= 0; b--)
261
+ (u = o[b]) && (a = (s ? u(i, l, a) : u(a)) || a);
262
+ return s && a && m(i, l, a), a;
186
263
  };
187
- let t = class extends x {
264
+ let t = class extends c {
188
265
  constructor() {
189
- super(), this.variant = "primary", this.size = "md", this.disabled = !1, this.loading = !1, this.type = "button", this.href = void 0, this.target = void 0, this.name = void 0, this.value = void 0, this.ariaLabel = null, this._internals = this.attachInternals();
266
+ super(), this.variant = "primary", this.size = "md", this.disabled = !1, this.loading = !1, this.type = "button", this.href = void 0, this.target = void 0, this.name = void 0, this.value = void 0, this.full = !1, this.inverted = !1, this.ariaLabel = null, this._internals = this.attachInternals();
190
267
  }
191
268
  // ─── Form API ───
192
269
  /** Returns the associated form element, if any. */
@@ -211,7 +288,7 @@ let t = class extends x {
211
288
  // ─── Render Helpers ───
212
289
  /** @private */
213
290
  _renderSpinner() {
214
- return l`
291
+ return h`
215
292
  <svg
216
293
  class="button__spinner"
217
294
  part="spinner"
@@ -240,7 +317,7 @@ let t = class extends x {
240
317
  }
241
318
  /** @private */
242
319
  _renderInner() {
243
- return l`
320
+ return h`
244
321
  ${this.loading ? this._renderSpinner() : n}
245
322
  <span part="prefix" class="button__prefix">
246
323
  <slot name="prefix"></slot>
@@ -261,12 +338,12 @@ let t = class extends x {
261
338
  [`button--${this.size}`]: !0,
262
339
  "button--loading": this.loading
263
340
  };
264
- return this.href !== void 0 ? l`
341
+ return this.href !== void 0 ? h`
265
342
  <a
266
343
  part="button"
267
- class=${p(o)}
268
- href=${this.disabled || this.loading ? n : c(this.href)}
269
- target=${c(this.target)}
344
+ class=${d(o)}
345
+ href=${this.disabled || this.loading ? n : v(this.href)}
346
+ target=${v(this.target)}
270
347
  rel=${this.target === "_blank" ? "noopener noreferrer" : n}
271
348
  aria-label=${this.ariaLabel ?? n}
272
349
  aria-disabled=${this.disabled ? "true" : n}
@@ -275,10 +352,10 @@ let t = class extends x {
275
352
  >
276
353
  ${this._renderInner()}
277
354
  </a>
278
- ` : l`
355
+ ` : h`
279
356
  <button
280
357
  part="button"
281
- class=${p(o)}
358
+ class=${d(o)}
282
359
  ?disabled=${this.disabled}
283
360
  type=${this.type}
284
361
  aria-label=${this.ariaLabel ?? n}
@@ -290,7 +367,7 @@ let t = class extends x {
290
367
  `;
291
368
  }
292
369
  };
293
- t.styles = [v, m];
370
+ t.styles = [f, g];
294
371
  t.formAssociated = !0;
295
372
  r([
296
373
  e({ type: String, reflect: !0 })
@@ -319,13 +396,19 @@ r([
319
396
  r([
320
397
  e({ type: String })
321
398
  ], t.prototype, "value", 2);
399
+ r([
400
+ e({ type: Boolean, reflect: !0 })
401
+ ], t.prototype, "full", 2);
402
+ r([
403
+ e({ type: Boolean, reflect: !0 })
404
+ ], t.prototype, "inverted", 2);
322
405
  r([
323
406
  e({ type: String, reflect: !0, attribute: "aria-label" })
324
407
  ], t.prototype, "ariaLabel", 2);
325
408
  t = r([
326
- f("hx-button")
409
+ x("hx-button")
327
410
  ], t);
328
411
  export {
329
412
  t as H
330
413
  };
331
- //# sourceMappingURL=hx-button-CtiJsmOg.js.map
414
+ //# sourceMappingURL=hx-button-Cbhqpm5i.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hx-button-Cbhqpm5i.js","sources":["../../src/components/hx-button/hx-button.styles.ts","../../src/components/hx-button/hx-button.ts"],"sourcesContent":["import { css } from 'lit';\n\nexport const helixButtonStyles = css`\n :host {\n display: inline-block;\n }\n\n :host([disabled]) {\n pointer-events: none;\n opacity: var(--hx-opacity-disabled, 0.5);\n }\n\n :host([full]) {\n display: block;\n width: 100%;\n }\n\n :host([full]) .button {\n width: 100%;\n justify-content: center;\n }\n\n /* ─── Base Button ─── */\n\n .button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--hx-space-2, 0.5rem);\n border: var(--hx-border-width-thin, 1px) solid var(--hx-button-border-color, transparent);\n border-radius: var(--hx-button-border-radius, var(--hx-border-radius-md, 0.375rem));\n background-color: var(--hx-button-bg, var(--hx-color-primary-500, #2563eb));\n color: var(--hx-button-color, var(--hx-color-neutral-0, #ffffff));\n font-family: var(--hx-button-font-family, var(--hx-font-family-sans, sans-serif));\n font-weight: var(--hx-button-font-weight, var(--hx-font-weight-semibold, 600));\n line-height: var(--hx-line-height-tight, 1.25);\n cursor: pointer;\n transition:\n background-color var(--hx-transition-fast, 150ms ease),\n color var(--hx-transition-fast, 150ms ease),\n border-color var(--hx-transition-fast, 150ms ease),\n box-shadow var(--hx-transition-fast, 150ms ease);\n text-decoration: none;\n white-space: nowrap;\n user-select: none;\n -webkit-user-select: none;\n }\n\n .button:focus-visible {\n outline: var(--hx-focus-ring-width, 2px) solid\n var(--hx-button-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 .button:hover {\n filter: brightness(var(--hx-filter-brightness-hover, 0.9));\n }\n\n .button:active {\n filter: brightness(var(--hx-filter-brightness-active, 0.8));\n }\n\n /* ─── Size Variants ─── */\n\n .button--sm {\n padding: var(--hx-space-1, 0.25rem) var(--hx-space-3, 0.75rem);\n font-size: var(--hx-font-size-sm, 0.875rem);\n min-height: var(--hx-size-8, 2rem);\n }\n\n .button--md {\n padding: var(--hx-space-2, 0.5rem) var(--hx-space-4, 1rem);\n font-size: var(--hx-font-size-md, 1rem);\n min-height: var(--hx-size-10, 2.5rem);\n }\n\n .button--lg {\n padding: var(--hx-space-3, 0.75rem) var(--hx-space-6, 1.5rem);\n font-size: var(--hx-font-size-lg, 1.125rem);\n min-height: var(--hx-size-12, 3rem);\n }\n\n /* ─── Style Variants ─── */\n\n .button--primary {\n --hx-button-bg: var(--hx-color-primary-500);\n --hx-button-color: var(--hx-color-neutral-0);\n --hx-button-border-color: transparent;\n }\n\n .button--secondary {\n --hx-button-bg: transparent;\n --hx-button-color: var(--hx-color-primary-500);\n --hx-button-border-color: var(--hx-color-primary-500);\n }\n\n .button--secondary:hover {\n --hx-button-bg: var(--hx-button-hover-bg, var(--hx-color-primary-50));\n }\n\n .button--tertiary {\n --hx-button-bg: var(--hx-color-neutral-100);\n --hx-button-color: var(--hx-color-neutral-900);\n --hx-button-border-color: transparent;\n }\n\n .button--tertiary:hover {\n --hx-button-bg: var(--hx-button-hover-bg, var(--hx-color-neutral-200));\n }\n\n .button--danger {\n --hx-button-bg: var(--hx-color-error-500);\n --hx-button-color: var(--hx-color-neutral-0);\n --hx-button-border-color: transparent;\n }\n\n .button--danger:hover {\n --hx-button-bg: var(--hx-button-hover-bg, var(--hx-color-error-600));\n }\n\n .button--ghost {\n --hx-button-bg: transparent;\n --hx-button-color: var(--hx-color-primary-500);\n --hx-button-border-color: transparent;\n }\n\n .button--ghost:hover {\n --hx-button-bg: var(--hx-button-hover-bg, var(--hx-color-neutral-100));\n }\n\n .button--outline {\n --hx-button-bg: transparent;\n --hx-button-color: var(--hx-color-neutral-900);\n --hx-button-border-color: var(--hx-color-neutral-300);\n }\n\n .button--outline:hover {\n --hx-button-bg: var(--hx-button-hover-bg, var(--hx-color-neutral-50));\n }\n\n .button--primary:hover {\n --hx-button-bg: var(--hx-button-hover-bg, var(--hx-color-primary-500));\n }\n\n /* ─── Disabled ─── */\n\n /* Note: opacity is applied on :host([disabled]) above — do NOT add opacity here.\n Stacking opacity on both :host and .button[disabled] would multiply to 0.25. */\n .button[disabled] {\n cursor: not-allowed;\n }\n\n /* ─── Loading State ─── */\n\n .button--loading {\n position: relative;\n cursor: wait;\n }\n\n .button__spinner {\n width: 1em;\n height: 1em;\n flex-shrink: 0;\n animation: hx-spin var(--hx-duration-spinner, 750ms) linear infinite;\n }\n\n @keyframes hx-spin {\n to {\n transform: rotate(360deg);\n }\n }\n\n @media (prefers-reduced-motion: reduce) {\n .button__spinner {\n animation: none;\n opacity: var(--hx-opacity-muted, 0.6);\n }\n }\n\n /* ─── Inverted Mode ─── */\n\n /* Override text color and filter-based hover/active for all variants */\n :host([inverted]) .button {\n color: var(--hx-button-inverted-color, #ffffff);\n filter: none;\n }\n\n :host([inverted]) .button:hover {\n filter: none;\n }\n\n :host([inverted]) .button:active {\n filter: none;\n }\n\n :host([inverted]) .button:focus-visible {\n outline-color: var(--hx-button-inverted-focus-ring-color, rgba(255, 255, 255, 0.5));\n }\n\n /* Primary inverted — slight transparent white overlay on hover */\n :host([inverted]) .button--primary:hover {\n --hx-button-bg: var(--hx-color-primary-400, #3b82f6);\n }\n\n /* Secondary inverted — white border and text */\n :host([inverted]) .button--secondary {\n --hx-button-border-color: rgba(255, 255, 255, 0.7);\n }\n\n :host([inverted]) .button--secondary:hover {\n --hx-button-bg: rgba(255, 255, 255, 0.15);\n }\n\n /* Tertiary inverted */\n :host([inverted]) .button--tertiary {\n --hx-button-bg: rgba(255, 255, 255, 0.15);\n --hx-button-border-color: transparent;\n }\n\n :host([inverted]) .button--tertiary:hover {\n --hx-button-bg: rgba(255, 255, 255, 0.25);\n }\n\n /* Ghost inverted — transparent base, white hover bg */\n :host([inverted]) .button--ghost {\n --hx-button-bg: transparent;\n --hx-button-border-color: transparent;\n }\n\n :host([inverted]) .button--ghost:hover {\n --hx-button-bg: var(--hx-button-inverted-ghost-hover-bg, rgba(255, 255, 255, 0.15));\n }\n\n /* Outline inverted — white border */\n :host([inverted]) .button--outline {\n --hx-button-border-color: rgba(255, 255, 255, 0.7);\n }\n\n :host([inverted]) .button--outline:hover {\n --hx-button-bg: rgba(255, 255, 255, 0.15);\n }\n\n /* ─── Prefix / Suffix / Label ─── */\n\n .button__prefix,\n .button__suffix {\n display: inline-flex;\n align-items: center;\n flex-shrink: 0;\n }\n\n .button__label {\n flex: 1 1 auto;\n }\n`;\n","import { LitElement, html, nothing, type TemplateResult } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { tokenStyles } from '@helixui/tokens/lit';\nimport { helixButtonStyles } from './hx-button.styles.js';\n\n/**\n * A production-grade button component for user interaction. Supports multiple\n * visual variants, sizes, loading state, prefix/suffix slots, anchor rendering,\n * and full ElementInternals form association.\n *\n * @summary Primary interactive element for triggering actions and form submission.\n *\n * @tag hx-button\n *\n * @slot - Default slot for button label text or content.\n * @slot prefix - Icon or content rendered before the label.\n * @slot suffix - Icon or content rendered after the label.\n *\n * @fires {CustomEvent<{originalEvent: MouseEvent}>} hx-click - Dispatched when\n * the button is clicked and is neither disabled nor loading.\n *\n * @csspart button - The native button or anchor element.\n * @csspart label - The label text wrapper span.\n * @csspart prefix - The prefix slot container span.\n * @csspart suffix - The suffix slot container span.\n * @csspart spinner - The loading spinner SVG element.\n *\n * @cssprop [--hx-button-bg=var(--hx-color-primary-500)] - Button background color.\n * @cssprop [--hx-button-hover-bg] - Hover background color override. When set, overrides the variant default hover background from outside the shadow DOM.\n * @cssprop [--hx-button-color=var(--hx-color-neutral-0)] - Button text color.\n * @cssprop [--hx-button-border-color=transparent] - Button border color.\n * @cssprop [--hx-button-border-radius=var(--hx-border-radius-md)] - Button border radius.\n * @cssprop [--hx-button-font-family=var(--hx-font-family-sans)] - Button font family.\n * @cssprop [--hx-button-font-weight=var(--hx-font-weight-semibold)] - Button font weight.\n * @cssprop [--hx-button-focus-ring-color=var(--hx-focus-ring-color)] - Focus ring color.\n *\n * @cssprop [--hx-button-inverted-color=#ffffff] - Text color when inverted.\n * @cssprop [--hx-button-inverted-ghost-hover-bg=rgba(255,255,255,0.15)] - Ghost hover bg when inverted.\n * @cssprop [--hx-button-inverted-focus-ring-color=rgba(255,255,255,0.5)] - Focus ring color when inverted.\n */\n@customElement('hx-button')\nexport class HelixButton extends LitElement {\n static override styles = [tokenStyles, helixButtonStyles];\n\n // ─── Form Association ───\n\n static formAssociated = true;\n\n private _internals: ElementInternals;\n\n constructor() {\n super();\n this._internals = this.attachInternals();\n }\n\n // ─── Public Properties ───\n\n /**\n * Visual style variant of the button.\n * @attr variant\n */\n @property({ type: String, reflect: true })\n variant: 'primary' | 'secondary' | 'tertiary' | 'danger' | 'ghost' | 'outline' = 'primary';\n\n /**\n * Size of the button.\n * @attr hx-size\n */\n @property({ type: String, reflect: true, attribute: 'hx-size' })\n size: 'sm' | 'md' | 'lg' = 'md';\n\n /**\n * Whether the button is disabled. Prevents all interaction and form actions.\n * @attr disabled\n */\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n /**\n * Whether the button is in a loading state. Shows spinner, prevents interaction,\n * and sets aria-busy. Does not set the disabled attribute.\n * @attr loading\n */\n @property({ type: Boolean, reflect: true })\n loading = false;\n\n /**\n * The type attribute for the underlying button element. Ignored when href is set.\n * @attr type\n */\n @property({ type: String })\n type: 'button' | 'submit' | 'reset' = 'button';\n\n /**\n * When set, renders an anchor element instead of a button.\n * @attr href\n */\n @property({ type: String })\n href: string | undefined = undefined;\n\n /**\n * Anchor target attribute. Only used when href is set.\n * @attr target\n */\n @property({ type: String })\n target: string | undefined = undefined;\n\n /**\n * Form field name submitted via ElementInternals.setFormValue on submit.\n * @attr name\n */\n @property({ type: String })\n name: string | undefined = undefined;\n\n /**\n * Form field value submitted via ElementInternals.setFormValue on submit.\n * @attr value\n */\n @property({ type: String })\n value: string | undefined = undefined;\n\n /**\n * When true, the button stretches to fill its container width.\n * Sets the host to `display: block` and the inner element to `width: 100%`.\n * @attr full\n */\n @property({ type: Boolean, reflect: true })\n full = false;\n\n /**\n * When true, flips button colors for placement on dark or gradient backgrounds.\n * Forces text to white and adjusts hover/focus ring colors across all variants.\n * @attr inverted\n */\n @property({ type: Boolean, reflect: true })\n inverted = false;\n\n /**\n * Accessible label forwarded to the inner button/anchor. Required for icon-only usage.\n * @attr aria-label\n */\n @property({ type: String, reflect: true, attribute: 'aria-label' })\n override ariaLabel: string | null = null;\n\n // ─── Form API ───\n\n /** Returns the associated form element, if any. */\n get form(): HTMLFormElement | null {\n return this._internals.form;\n }\n\n // ─── Event Handling ───\n\n /** @private */\n private _handleClick(e: MouseEvent): void {\n if (this.disabled || this.loading) {\n e.preventDefault();\n e.stopPropagation();\n return;\n }\n\n /**\n * Dispatched when the button is clicked.\n * @event hx-click\n */\n this.dispatchEvent(\n new CustomEvent('hx-click', {\n bubbles: true,\n composed: true,\n detail: { originalEvent: e },\n }),\n );\n\n // Handle form submission/reset if form-associated and not in anchor mode\n if (this.href === undefined && this.type === 'submit' && this._internals.form) {\n if (this.name !== undefined && this.value !== undefined) {\n this._internals.setFormValue(this.value);\n }\n this._internals.form.requestSubmit();\n } else if (this.href === undefined && this.type === 'reset' && this._internals.form) {\n this._internals.form.reset();\n }\n }\n\n // ─── Render Helpers ───\n\n /** @private */\n private _renderSpinner(): TemplateResult {\n return html`\n <svg\n class=\"button__spinner\"\n part=\"spinner\"\n aria-hidden=\"true\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n >\n <circle\n class=\"button__spinner-track\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n stroke-width=\"3\"\n opacity=\"0.3\"\n />\n <path\n class=\"button__spinner-arc\"\n d=\"M12 2a10 10 0 0 1 10 10\"\n stroke=\"currentColor\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n />\n </svg>\n `;\n }\n\n /** @private */\n private _renderInner(): TemplateResult {\n return html`\n ${this.loading ? this._renderSpinner() : nothing}\n <span part=\"prefix\" class=\"button__prefix\">\n <slot name=\"prefix\"></slot>\n </span>\n <span part=\"label\" class=\"button__label\">\n <slot></slot>\n </span>\n <span part=\"suffix\" class=\"button__suffix\">\n <slot name=\"suffix\"></slot>\n </span>\n `;\n }\n\n // ─── Render ───\n\n override render() {\n const classes = {\n button: true,\n [`button--${this.variant}`]: true,\n [`button--${this.size}`]: true,\n 'button--loading': this.loading,\n };\n\n if (this.href !== undefined) {\n return html`\n <a\n part=\"button\"\n class=${classMap(classes)}\n href=${this.disabled || this.loading ? nothing : ifDefined(this.href)}\n target=${ifDefined(this.target)}\n rel=${this.target === '_blank' ? 'noopener noreferrer' : nothing}\n aria-label=${this.ariaLabel ?? nothing}\n aria-disabled=${this.disabled ? 'true' : nothing}\n aria-busy=${this.loading ? 'true' : nothing}\n @click=${this._handleClick}\n >\n ${this._renderInner()}\n </a>\n `;\n }\n\n return html`\n <button\n part=\"button\"\n class=${classMap(classes)}\n ?disabled=${this.disabled}\n type=${this.type}\n aria-label=${this.ariaLabel ?? nothing}\n aria-busy=${this.loading ? 'true' : nothing}\n @click=${this._handleClick}\n >\n ${this._renderInner()}\n </button>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'hx-button': HelixButton;\n }\n}\n"],"names":["helixButtonStyles","css","HelixButton","LitElement","e","html","nothing","classes","classMap","ifDefined","tokenStyles","__decorateClass","property","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;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;AA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"}
@@ -1,5 +1,5 @@
1
1
  import { css as h, LitElement as u, html as c } from "lit";
2
- import { property as d, customElement as p } from "lit/decorators.js";
2
+ import { property as n, customElement as p } from "lit/decorators.js";
3
3
  import { classMap as b } from "lit/directives/class-map.js";
4
4
  import { tokenStyles as m } from "@helixui/tokens/lit";
5
5
  const x = h`
@@ -94,10 +94,10 @@ const x = h`
94
94
  position: relative;
95
95
  }
96
96
  `;
97
- var g = Object.defineProperty, f = Object.getOwnPropertyDescriptor, l = (r, i, s, e) => {
98
- for (var t = e > 1 ? void 0 : e ? f(i, s) : i, a = r.length - 1, n; a >= 0; a--)
99
- (n = r[a]) && (t = (e ? n(i, s, t) : n(t)) || t);
100
- return e && t && g(i, s, t), t;
97
+ var g = Object.defineProperty, f = Object.getOwnPropertyDescriptor, l = (r, e, s, i) => {
98
+ for (var t = i > 1 ? void 0 : i ? f(e, s) : e, a = r.length - 1, d; a >= 0; a--)
99
+ (d = r[a]) && (t = (i ? d(e, s, t) : d(t)) || t);
100
+ return i && t && g(e, s, t), t;
101
101
  };
102
102
  let o = class extends u {
103
103
  // ─── Constructor ───
@@ -108,7 +108,7 @@ let o = class extends u {
108
108
  return this._orientation;
109
109
  }
110
110
  set orientation(r) {
111
- r !== "horizontal" && r !== "vertical" && (console.warn(`[hx-button-group] Invalid orientation "${r}", defaulting to "horizontal".`), r = "horizontal"), this._orientation = r;
111
+ r !== "horizontal" && r !== "vertical" && (r = "horizontal"), this._orientation = r;
112
112
  }
113
113
  // ─── Lifecycle ───
114
114
  updated(r) {
@@ -135,13 +135,13 @@ let o = class extends u {
135
135
  };
136
136
  o.styles = [m, x];
137
137
  l([
138
- d({ type: String, reflect: !0 })
138
+ n({ type: String, reflect: !0 })
139
139
  ], o.prototype, "orientation", 1);
140
140
  l([
141
- d({ type: String, reflect: !0, attribute: "hx-size" })
141
+ n({ type: String, reflect: !0, attribute: "hx-size" })
142
142
  ], o.prototype, "size", 2);
143
143
  l([
144
- d({ type: String })
144
+ n({ type: String })
145
145
  ], o.prototype, "label", 2);
146
146
  o = l([
147
147
  p("hx-button-group")
@@ -149,4 +149,4 @@ o = l([
149
149
  export {
150
150
  o as H
151
151
  };
152
- //# sourceMappingURL=hx-button-group-BMV5qFs4.js.map
152
+ //# sourceMappingURL=hx-button-group-CWjWv-wS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hx-button-group-CWjWv-wS.js","sources":["../../src/components/hx-button-group/hx-button-group.styles.ts","../../src/components/hx-button-group/hx-button-group.ts"],"sourcesContent":["import { css } from 'lit';\n\nexport const helixButtonGroupStyles = css`\n :host {\n display: inline-flex;\n contain: layout style;\n }\n\n .group {\n display: inline-flex;\n align-items: stretch;\n }\n\n /* ─── Orientation Variants ─── */\n\n .group--horizontal {\n flex-direction: row;\n }\n\n .group--vertical {\n flex-direction: column;\n }\n\n /* ─── No Double Borders: Horizontal ─── */\n\n .group--horizontal ::slotted(*:not(:first-child)) {\n margin-left: calc(-1 * var(--hx-border-width-thin, 1px));\n }\n\n /* ─── No Double Borders: Vertical ─── */\n\n .group--vertical ::slotted(*:not(:first-child)) {\n margin-top: calc(-1 * var(--hx-border-width-thin, 1px));\n }\n\n /* ─── Border Radius: Horizontal — Single child keeps all corners ─── */\n\n .group--horizontal ::slotted(:only-child) {\n --hx-button-border-radius: var(--hx-border-radius-md, 0.375rem);\n }\n\n /* ─── Border Radius: Horizontal — First child keeps left corners ─── */\n\n .group--horizontal ::slotted(:first-child:not(:only-child)) {\n --hx-button-border-radius: var(--hx-border-radius-md, 0.375rem) 0 0\n var(--hx-border-radius-md, 0.375rem);\n }\n\n /* ─── Border Radius: Horizontal — Last child keeps right corners ─── */\n\n .group--horizontal ::slotted(:last-child:not(:only-child)) {\n --hx-button-border-radius: 0 var(--hx-border-radius-md, 0.375rem)\n var(--hx-border-radius-md, 0.375rem) 0;\n }\n\n /* ─── Border Radius: Horizontal — Middle children have no radius ─── */\n\n .group--horizontal ::slotted(:not(:first-child):not(:last-child)) {\n --hx-button-border-radius: 0;\n }\n\n /* ─── Border Radius: Vertical — Single child keeps all corners ─── */\n\n .group--vertical ::slotted(:only-child) {\n --hx-button-border-radius: var(--hx-border-radius-md, 0.375rem);\n }\n\n /* ─── Border Radius: Vertical — First child keeps top corners ─── */\n\n .group--vertical ::slotted(:first-child:not(:only-child)) {\n --hx-button-border-radius: var(--hx-border-radius-md, 0.375rem)\n var(--hx-border-radius-md, 0.375rem) 0 0;\n }\n\n /* ─── Border Radius: Vertical — Last child keeps bottom corners ─── */\n\n .group--vertical ::slotted(:last-child:not(:only-child)) {\n --hx-button-border-radius: 0 0 var(--hx-border-radius-md, 0.375rem)\n var(--hx-border-radius-md, 0.375rem);\n }\n\n /* ─── Border Radius: Vertical — Middle children have no radius ─── */\n\n .group--vertical ::slotted(:not(:first-child):not(:last-child)) {\n --hx-button-border-radius: 0;\n }\n\n /* ─── Z-index: Raise focused child above siblings to show full focus ring ─── */\n\n .group ::slotted(:focus-within) {\n z-index: 1;\n position: relative;\n }\n`;\n","import { LitElement, html } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { tokenStyles } from '@helixui/tokens/lit';\nimport { helixButtonGroupStyles } from './hx-button-group.styles.js';\nimport { devWarn } from '../../utils/dev-warn.js';\n\n/**\n * A container component that groups related hx-button elements into a cohesive\n * horizontal or vertical action set. Eliminates double borders between adjacent\n * buttons and squares off inner border-radius for a unified visual appearance.\n *\n * **Accessibility:** Always provide an accessible label via `aria-label` or\n * `aria-labelledby` so screen readers can announce the group purpose.\n *\n * @summary Groups hx-button elements into a horizontal or vertical action set with shared borders.\n *\n * @tag hx-button-group\n *\n * @slot - Default slot accepting hx-button children.\n *\n * @csspart group - The container div element wrapping all slotted buttons.\n *\n * @cssprop [--hx-button-group-size=md] - Size token forwarded to child buttons. Accepts 'sm', 'md', or 'lg'.\n */\n@customElement('hx-button-group')\nexport class HelixButtonGroup extends LitElement {\n static override styles = [tokenStyles, helixButtonGroupStyles];\n\n /**\n * ElementInternals instance for ARIA role and label management via the Accessibility Object Model.\n * @internal\n */\n private internals: ElementInternals;\n\n /**\n * Layout orientation of the button group.\n * @attr orientation\n */\n @property({ type: String, reflect: true })\n get orientation(): 'horizontal' | 'vertical' {\n return this._orientation;\n }\n set orientation(value: string) {\n if (value !== 'horizontal' && value !== 'vertical') {\n devWarn('hx-button-group', `Invalid orientation \"${value}\", defaulting to \"horizontal\".`);\n value = 'horizontal';\n }\n this._orientation = value as 'horizontal' | 'vertical';\n }\n /**\n * Backing store for the orientation property, holding the validated orientation value.\n * @internal\n */\n private _orientation: 'horizontal' | 'vertical' = 'horizontal';\n\n /**\n * Size applied to the button group and cascaded to child buttons via\n * the --hx-button-group-size CSS custom property.\n * @attr hx-size\n */\n @property({ type: String, reflect: true, attribute: 'hx-size' })\n size: 'sm' | 'md' | 'lg' = 'md';\n\n /**\n * Accessible label for the button group. Sets aria-label via ElementInternals.\n * **Strongly recommended** for WCAG 2.1 AA compliance — without it, screen\n * readers announce an unnamed \"group\". For Drupal/Twig compatibility, prefer\n * applying `aria-label` directly as an HTML attribute instead.\n * @attr label\n */\n @property({ type: String })\n label: string = '';\n\n // ─── Constructor ───\n\n constructor() {\n super();\n this.internals = this.attachInternals();\n this.internals.role = 'group';\n }\n\n // ─── Lifecycle ───\n\n override updated(changedProperties: Map<PropertyKey, unknown>): void {\n super.updated(changedProperties);\n\n if (changedProperties.has('size')) {\n this.style.setProperty('--hx-button-group-size', this.size);\n }\n\n if (changedProperties.has('label')) {\n this.internals.ariaLabel = this.label || null;\n }\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.style.setProperty('--hx-button-group-size', this.size);\n if (this.label) {\n this.internals.ariaLabel = this.label;\n }\n }\n\n // ─── Render ───\n\n override render() {\n return html`\n <div\n part=\"group\"\n class=${classMap({\n group: true,\n 'group--horizontal': this.orientation === 'horizontal',\n 'group--vertical': this.orientation === 'vertical',\n })}\n >\n <slot></slot>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'hx-button-group': HelixButtonGroup;\n }\n}\n"],"names":["helixButtonGroupStyles","css","HelixButtonGroup","LitElement","value","changedProperties","html","classMap","tokenStyles","__decorateClass","property","customElement"],"mappings":";;;;AAEO,MAAMA,IAAyBC;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;;;;;;ACwB/B,IAAMC,IAAN,cAA+BC,EAAW;AAAA;AAAA,EAkD/C,cAAc;AACZ,UAAA,GAvBF,KAAQ,eAA0C,cAQlD,KAAA,OAA2B,MAU3B,KAAA,QAAgB,IAMd,KAAK,YAAY,KAAK,gBAAA,GACtB,KAAK,UAAU,OAAO;AAAA,EACxB;AAAA,EAxCA,IAAI,cAAyC;AAC3C,WAAO,KAAK;AAAA,EACd;AAAA,EACA,IAAI,YAAYC,GAAe;AAC7B,IAAIA,MAAU,gBAAgBA,MAAU,eAEtCA,IAAQ,eAEV,KAAK,eAAeA;AAAA,EACtB;AAAA;AAAA,EAmCS,QAAQC,GAAoD;AACnE,UAAM,QAAQA,CAAiB,GAE3BA,EAAkB,IAAI,MAAM,KAC9B,KAAK,MAAM,YAAY,0BAA0B,KAAK,IAAI,GAGxDA,EAAkB,IAAI,OAAO,MAC/B,KAAK,UAAU,YAAY,KAAK,SAAS;AAAA,EAE7C;AAAA,EAES,oBAA0B;AACjC,UAAM,kBAAA,GACN,KAAK,MAAM,YAAY,0BAA0B,KAAK,IAAI,GACtD,KAAK,UACP,KAAK,UAAU,YAAY,KAAK;AAAA,EAEpC;AAAA;AAAA,EAIS,SAAS;AAChB,WAAOC;AAAA;AAAA;AAAA,gBAGKC,EAAS;AAAA,MACf,OAAO;AAAA,MACP,qBAAqB,KAAK,gBAAgB;AAAA,MAC1C,mBAAmB,KAAK,gBAAgB;AAAA,IAAA,CACzC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,EAKR;AACF;AA9FaL,EACK,SAAS,CAACM,GAAaR,CAAsB;AAazDS,EAAA;AAAA,EADHC,EAAS,EAAE,MAAM,QAAQ,SAAS,IAAM;AAAA,GAb9BR,EAcP,WAAA,eAAA,CAAA;AAsBJO,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,QAAQ,SAAS,IAAM,WAAW,WAAW;AAAA,GAnCpDR,EAoCX,WAAA,QAAA,CAAA;AAUAO,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GA7CfR,EA8CX,WAAA,SAAA,CAAA;AA9CWA,IAANO,EAAA;AAAA,EADNE,EAAc,iBAAiB;AAAA,GACnBT,CAAA;"}