@helixui/library 0.3.4 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (406) hide show
  1. package/custom-elements.json +13562 -12579
  2. package/dist/components/hx-accordion/hx-accordion-item.d.ts +2 -0
  3. package/dist/components/hx-accordion/hx-accordion-item.d.ts.map +1 -1
  4. package/dist/components/hx-accordion/hx-accordion.d.ts +8 -0
  5. package/dist/components/hx-accordion/hx-accordion.d.ts.map +1 -1
  6. package/dist/components/hx-accordion/index.js +1 -1
  7. package/dist/components/hx-action-bar/hx-action-bar.d.ts.map +1 -1
  8. package/dist/components/hx-action-bar/index.js +1 -1
  9. package/dist/components/hx-alert/hx-alert.d.ts +2 -5
  10. package/dist/components/hx-alert/hx-alert.d.ts.map +1 -1
  11. package/dist/components/hx-alert/index.js +1 -1
  12. package/dist/components/hx-avatar/hx-avatar.d.ts.map +1 -1
  13. package/dist/components/hx-avatar/index.js +1 -1
  14. package/dist/components/hx-banner/hx-banner.d.ts +99 -0
  15. package/dist/components/hx-banner/hx-banner.d.ts.map +1 -0
  16. package/dist/components/hx-banner/hx-banner.styles.d.ts +2 -0
  17. package/dist/components/hx-banner/hx-banner.styles.d.ts.map +1 -0
  18. package/dist/components/hx-banner/index.d.ts +3 -0
  19. package/dist/components/hx-banner/index.d.ts.map +1 -0
  20. package/dist/components/hx-banner/index.js +5 -0
  21. package/dist/components/hx-banner/index.js.map +1 -0
  22. package/dist/components/hx-breadcrumb/hx-breadcrumb.d.ts +5 -0
  23. package/dist/components/hx-breadcrumb/hx-breadcrumb.d.ts.map +1 -1
  24. package/dist/components/hx-breadcrumb/index.js +1 -1
  25. package/dist/components/hx-button/hx-button.d.ts +17 -0
  26. package/dist/components/hx-button/hx-button.d.ts.map +1 -1
  27. package/dist/components/hx-button/hx-button.styles.d.ts.map +1 -1
  28. package/dist/components/hx-button/index.js +1 -1
  29. package/dist/components/hx-button-group/hx-button-group.d.ts +8 -0
  30. package/dist/components/hx-button-group/hx-button-group.d.ts.map +1 -1
  31. package/dist/components/hx-button-group/index.js +1 -1
  32. package/dist/components/hx-card/hx-card.d.ts +16 -0
  33. package/dist/components/hx-card/hx-card.d.ts.map +1 -1
  34. package/dist/components/hx-card/hx-card.styles.d.ts.map +1 -1
  35. package/dist/components/hx-card/index.js +1 -1
  36. package/dist/components/hx-carousel/hx-carousel.d.ts +122 -0
  37. package/dist/components/hx-carousel/hx-carousel.d.ts.map +1 -1
  38. package/dist/components/hx-carousel/index.js +1 -1
  39. package/dist/components/hx-checkbox/hx-checkbox.d.ts +3 -1
  40. package/dist/components/hx-checkbox/hx-checkbox.d.ts.map +1 -1
  41. package/dist/components/hx-checkbox-group/hx-checkbox-group.d.ts +5 -1
  42. package/dist/components/hx-checkbox-group/hx-checkbox-group.d.ts.map +1 -1
  43. package/dist/components/hx-checkbox-group/index.js +1 -1
  44. package/dist/components/hx-code-snippet/hx-code-snippet.d.ts +21 -6
  45. package/dist/components/hx-code-snippet/hx-code-snippet.d.ts.map +1 -1
  46. package/dist/components/hx-code-snippet/index.js +1 -1
  47. package/dist/components/hx-color-picker/hx-color-picker.d.ts +13 -0
  48. package/dist/components/hx-color-picker/hx-color-picker.d.ts.map +1 -1
  49. package/dist/components/hx-color-picker/hx-color-picker.styles.d.ts.map +1 -1
  50. package/dist/components/hx-color-picker/index.js +1 -1
  51. package/dist/components/hx-combobox/hx-combobox.d.ts +24 -0
  52. package/dist/components/hx-combobox/hx-combobox.d.ts.map +1 -1
  53. package/dist/components/hx-combobox/hx-combobox.styles.d.ts.map +1 -1
  54. package/dist/components/hx-combobox/index.js +1 -1
  55. package/dist/components/hx-container/hx-container.d.ts +3 -1
  56. package/dist/components/hx-container/hx-container.d.ts.map +1 -1
  57. package/dist/components/hx-copy-button/hx-copy-button.d.ts +6 -0
  58. package/dist/components/hx-copy-button/hx-copy-button.d.ts.map +1 -1
  59. package/dist/components/hx-copy-button/index.js +1 -1
  60. package/dist/components/hx-counter/hx-counter.d.ts +79 -0
  61. package/dist/components/hx-counter/hx-counter.d.ts.map +1 -0
  62. package/dist/components/hx-counter/hx-counter.styles.d.ts +2 -0
  63. package/dist/components/hx-counter/hx-counter.styles.d.ts.map +1 -0
  64. package/dist/components/hx-counter/index.d.ts +3 -0
  65. package/dist/components/hx-counter/index.d.ts.map +1 -0
  66. package/dist/components/hx-counter/index.js +5 -0
  67. package/dist/components/hx-counter/index.js.map +1 -0
  68. package/dist/components/hx-data-table/hx-data-table.d.ts +6 -0
  69. package/dist/components/hx-data-table/hx-data-table.d.ts.map +1 -1
  70. package/dist/components/hx-data-table/hx-data-table.styles.d.ts.map +1 -1
  71. package/dist/components/hx-data-table/index.js +1 -1
  72. package/dist/components/hx-date-picker/hx-date-picker.d.ts +124 -0
  73. package/dist/components/hx-date-picker/hx-date-picker.d.ts.map +1 -1
  74. package/dist/components/hx-date-picker/index.js +1 -1
  75. package/dist/components/hx-dialog/hx-dialog.d.ts.map +1 -1
  76. package/dist/components/hx-dialog/index.js +1 -1
  77. package/dist/components/hx-divider/hx-divider.d.ts +3 -0
  78. package/dist/components/hx-divider/hx-divider.d.ts.map +1 -1
  79. package/dist/components/hx-drawer/hx-drawer.d.ts +54 -1
  80. package/dist/components/hx-drawer/hx-drawer.d.ts.map +1 -1
  81. package/dist/components/hx-drawer/index.js +1 -1
  82. package/dist/components/hx-dropdown/hx-dropdown.d.ts +5 -0
  83. package/dist/components/hx-dropdown/hx-dropdown.d.ts.map +1 -1
  84. package/dist/components/hx-field/hx-field.d.ts +31 -1
  85. package/dist/components/hx-field/hx-field.d.ts.map +1 -1
  86. package/dist/components/hx-field/index.js +1 -1
  87. package/dist/components/hx-file-upload/hx-file-upload.d.ts +12 -0
  88. package/dist/components/hx-file-upload/hx-file-upload.d.ts.map +1 -1
  89. package/dist/components/hx-file-upload/index.js +1 -1
  90. package/dist/components/hx-form/hx-form.d.ts +24 -0
  91. package/dist/components/hx-form/hx-form.d.ts.map +1 -1
  92. package/dist/components/hx-form/index.js +1 -1
  93. package/dist/components/hx-help-text/hx-help-text.d.ts +3 -0
  94. package/dist/components/hx-help-text/hx-help-text.d.ts.map +1 -1
  95. package/dist/components/hx-icon-button/hx-icon-button.d.ts.map +1 -1
  96. package/dist/components/hx-icon-button/index.js +1 -1
  97. package/dist/components/hx-list/hx-list.d.ts.map +1 -1
  98. package/dist/components/hx-list/index.js +1 -1
  99. package/dist/components/hx-menu/hx-menu.d.ts +12 -0
  100. package/dist/components/hx-menu/hx-menu.d.ts.map +1 -1
  101. package/dist/components/hx-menu/index.js +1 -1
  102. package/dist/components/hx-meter/hx-meter.d.ts +2 -0
  103. package/dist/components/hx-meter/hx-meter.d.ts.map +1 -1
  104. package/dist/components/hx-meter/index.js +1 -1
  105. package/dist/components/hx-nav/hx-nav.d.ts +15 -1
  106. package/dist/components/hx-nav/hx-nav.d.ts.map +1 -1
  107. package/dist/components/hx-nav/index.js +1 -1
  108. package/dist/components/hx-number-input/hx-number-input.d.ts +2 -0
  109. package/dist/components/hx-number-input/hx-number-input.d.ts.map +1 -1
  110. package/dist/components/hx-number-input/index.js +1 -1
  111. package/dist/components/hx-overflow-menu/hx-overflow-menu.d.ts +14 -0
  112. package/dist/components/hx-overflow-menu/hx-overflow-menu.d.ts.map +1 -1
  113. package/dist/components/hx-overflow-menu/index.js +1 -1
  114. package/dist/components/hx-pagination/hx-pagination.d.ts +5 -0
  115. package/dist/components/hx-pagination/hx-pagination.d.ts.map +1 -1
  116. package/dist/components/hx-pagination/index.js +1 -1
  117. package/dist/components/hx-popover/hx-popover.d.ts +10 -38
  118. package/dist/components/hx-popover/hx-popover.d.ts.map +1 -1
  119. package/dist/components/hx-popover/index.js +1 -1
  120. package/dist/components/hx-progress-bar/hx-progress-bar.d.ts +10 -0
  121. package/dist/components/hx-progress-bar/hx-progress-bar.d.ts.map +1 -1
  122. package/dist/components/hx-progress-bar/index.js +1 -1
  123. package/dist/components/hx-progress-ring/hx-progress-ring.d.ts.map +1 -1
  124. package/dist/components/hx-progress-ring/index.js +1 -1
  125. package/dist/components/hx-radio-group/hx-radio-group.d.ts +75 -3
  126. package/dist/components/hx-radio-group/hx-radio-group.d.ts.map +1 -1
  127. package/dist/components/hx-radio-group/hx-radio.d.ts +3 -1
  128. package/dist/components/hx-radio-group/hx-radio.d.ts.map +1 -1
  129. package/dist/components/hx-radio-group/index.js +1 -1
  130. package/dist/components/hx-rating/hx-rating.d.ts +18 -3
  131. package/dist/components/hx-rating/hx-rating.d.ts.map +1 -1
  132. package/dist/components/hx-rating/index.js +1 -1
  133. package/dist/components/hx-select/hx-select.d.ts +9 -0
  134. package/dist/components/hx-select/hx-select.d.ts.map +1 -1
  135. package/dist/components/hx-select/index.js +1 -1
  136. package/dist/components/hx-side-nav/hx-side-nav.d.ts.map +1 -1
  137. package/dist/components/hx-side-nav/index.js +1 -1
  138. package/dist/components/hx-slider/hx-slider.d.ts +2 -0
  139. package/dist/components/hx-slider/hx-slider.d.ts.map +1 -1
  140. package/dist/components/hx-slider/index.js +1 -1
  141. package/dist/components/hx-split-button/hx-split-button.d.ts +16 -0
  142. package/dist/components/hx-split-button/hx-split-button.d.ts.map +1 -1
  143. package/dist/components/hx-split-button/index.js +1 -1
  144. package/dist/components/hx-split-panel/hx-split-panel.d.ts +11 -0
  145. package/dist/components/hx-split-panel/hx-split-panel.d.ts.map +1 -1
  146. package/dist/components/hx-stat/hx-stat.d.ts +71 -0
  147. package/dist/components/hx-stat/hx-stat.d.ts.map +1 -0
  148. package/dist/components/hx-stat/hx-stat.styles.d.ts +2 -0
  149. package/dist/components/hx-stat/hx-stat.styles.d.ts.map +1 -0
  150. package/dist/components/hx-stat/index.d.ts +3 -0
  151. package/dist/components/hx-stat/index.d.ts.map +1 -0
  152. package/dist/components/hx-stat/index.js +5 -0
  153. package/dist/components/hx-stat/index.js.map +1 -0
  154. package/dist/components/hx-steps/hx-steps.d.ts +5 -0
  155. package/dist/components/hx-steps/hx-steps.d.ts.map +1 -1
  156. package/dist/components/hx-steps/index.js +1 -1
  157. package/dist/components/hx-structured-list/hx-structured-list.d.ts +2 -0
  158. package/dist/components/hx-structured-list/hx-structured-list.d.ts.map +1 -1
  159. package/dist/components/hx-structured-list/index.js +1 -1
  160. package/dist/components/hx-switch/hx-switch.d.ts +2 -0
  161. package/dist/components/hx-switch/hx-switch.d.ts.map +1 -1
  162. package/dist/components/hx-switch/index.js +1 -1
  163. package/dist/components/hx-table/hx-table.d.ts +60 -0
  164. package/dist/components/hx-table/hx-table.d.ts.map +1 -0
  165. package/dist/components/hx-table/hx-table.styles.d.ts +9 -0
  166. package/dist/components/hx-table/hx-table.styles.d.ts.map +1 -0
  167. package/dist/components/hx-table/hx-tbody.d.ts +23 -0
  168. package/dist/components/hx-table/hx-tbody.d.ts.map +1 -0
  169. package/dist/components/hx-table/hx-td.d.ts +46 -0
  170. package/dist/components/hx-table/hx-td.d.ts.map +1 -0
  171. package/dist/components/hx-table/hx-tfoot.d.ts +23 -0
  172. package/dist/components/hx-table/hx-tfoot.d.ts.map +1 -0
  173. package/dist/components/hx-table/hx-th.d.ts +61 -0
  174. package/dist/components/hx-table/hx-th.d.ts.map +1 -0
  175. package/dist/components/hx-table/hx-thead.d.ts +23 -0
  176. package/dist/components/hx-table/hx-thead.d.ts.map +1 -0
  177. package/dist/components/hx-table/hx-tr.d.ts +33 -0
  178. package/dist/components/hx-table/hx-tr.d.ts.map +1 -0
  179. package/dist/components/hx-table/index.d.ts +9 -0
  180. package/dist/components/hx-table/index.d.ts.map +1 -0
  181. package/dist/components/hx-table/index.js +11 -0
  182. package/dist/components/hx-table/index.js.map +1 -0
  183. package/dist/components/hx-tabs/hx-tabs.d.ts.map +1 -1
  184. package/dist/components/hx-tabs/index.js +1 -1
  185. package/dist/components/hx-text-input/hx-text-input.d.ts +1 -0
  186. package/dist/components/hx-text-input/hx-text-input.d.ts.map +1 -1
  187. package/dist/components/hx-text-input/index.js +1 -1
  188. package/dist/components/hx-textarea/hx-textarea.d.ts +14 -0
  189. package/dist/components/hx-textarea/hx-textarea.d.ts.map +1 -1
  190. package/dist/components/hx-textarea/hx-textarea.styles.d.ts.map +1 -1
  191. package/dist/components/hx-textarea/index.js +1 -1
  192. package/dist/components/hx-time-picker/hx-time-picker.d.ts +22 -1
  193. package/dist/components/hx-time-picker/hx-time-picker.d.ts.map +1 -1
  194. package/dist/components/hx-time-picker/index.js +1 -1
  195. package/dist/components/hx-toast/hx-toast-stack.d.ts +36 -0
  196. package/dist/components/hx-toast/hx-toast-stack.d.ts.map +1 -0
  197. package/dist/components/hx-toast/hx-toast.d.ts +0 -52
  198. package/dist/components/hx-toast/hx-toast.d.ts.map +1 -1
  199. package/dist/components/hx-toast/index.d.ts +6 -2
  200. package/dist/components/hx-toast/index.d.ts.map +1 -1
  201. package/dist/components/hx-toast/index.js +1 -1
  202. package/dist/components/hx-toast/toast-factory.d.ts +25 -0
  203. package/dist/components/hx-toast/toast-factory.d.ts.map +1 -0
  204. package/dist/components/hx-toggle-button/hx-toggle-button.d.ts +1 -0
  205. package/dist/components/hx-toggle-button/hx-toggle-button.d.ts.map +1 -1
  206. package/dist/components/hx-toggle-button/index.js +1 -1
  207. package/dist/components/hx-tooltip/hx-tooltip.d.ts +1 -45
  208. package/dist/components/hx-tooltip/hx-tooltip.d.ts.map +1 -1
  209. package/dist/components/hx-tooltip/index.js +1 -1
  210. package/dist/components/hx-top-nav/hx-top-nav.d.ts.map +1 -1
  211. package/dist/components/hx-top-nav/index.js +1 -1
  212. package/dist/components/hx-tree-view/hx-tree-item.d.ts +50 -0
  213. package/dist/components/hx-tree-view/hx-tree-item.d.ts.map +1 -1
  214. package/dist/components/hx-tree-view/hx-tree-view.d.ts +15 -0
  215. package/dist/components/hx-tree-view/hx-tree-view.d.ts.map +1 -1
  216. package/dist/components/hx-tree-view/index.js +1 -1
  217. package/dist/index.d.ts +20 -2
  218. package/dist/index.d.ts.map +1 -1
  219. package/dist/index.js +168 -154
  220. package/dist/index.js.map +1 -1
  221. package/dist/shared/body-scroll-lock-VBa5TFP-.js +12 -0
  222. package/dist/shared/body-scroll-lock-VBa5TFP-.js.map +1 -0
  223. package/dist/shared/dev-warn-YlwPHjtX.js +6 -0
  224. package/dist/shared/dev-warn-YlwPHjtX.js.map +1 -0
  225. package/dist/shared/{hx-accordion-D95XSAft.js → hx-accordion-Cyswa6J3.js} +46 -43
  226. package/dist/shared/hx-accordion-Cyswa6J3.js.map +1 -0
  227. package/dist/shared/{hx-action-bar-B4i9tBCP.js → hx-action-bar-we_WJety.js} +41 -40
  228. package/dist/shared/hx-action-bar-we_WJety.js.map +1 -0
  229. package/dist/shared/{hx-alert-BQpT4gL3.js → hx-alert-Cg-zxRiU.js} +2 -2
  230. package/dist/shared/hx-alert-Cg-zxRiU.js.map +1 -0
  231. package/dist/shared/{hx-avatar-yHjmNdtf.js → hx-avatar-Cep6Urm3.js} +62 -65
  232. package/dist/shared/hx-avatar-Cep6Urm3.js.map +1 -0
  233. package/dist/shared/hx-banner-lxAIJ2kR.js +349 -0
  234. package/dist/shared/hx-banner-lxAIJ2kR.js.map +1 -0
  235. package/dist/shared/{hx-breadcrumb-item-DtSxRZ_W.js → hx-breadcrumb-item-C0rz0fzV.js} +46 -44
  236. package/dist/shared/hx-breadcrumb-item-C0rz0fzV.js.map +1 -0
  237. package/dist/shared/{hx-button-CtiJsmOg.js → hx-button-Cbhqpm5i.js} +111 -28
  238. package/dist/shared/hx-button-Cbhqpm5i.js.map +1 -0
  239. package/dist/shared/{hx-button-group-BMV5qFs4.js → hx-button-group-CWjWv-wS.js} +10 -10
  240. package/dist/shared/hx-button-group-CWjWv-wS.js.map +1 -0
  241. package/dist/shared/{hx-card-DAkEfpJd.js → hx-card-Bg4W4uXC.js} +16 -16
  242. package/dist/shared/hx-card-Bg4W4uXC.js.map +1 -0
  243. package/dist/shared/{hx-carousel-item-C2yBnM0r.js → hx-carousel-item-BKpmFbUT.js} +101 -63
  244. package/dist/shared/hx-carousel-item-BKpmFbUT.js.map +1 -0
  245. package/dist/shared/hx-checkbox-BMayOpAM.js.map +1 -1
  246. package/dist/shared/{hx-checkbox-group-DTS9iT4b.js → hx-checkbox-group-ydUdV9Sx.js} +7 -7
  247. package/dist/shared/hx-checkbox-group-ydUdV9Sx.js.map +1 -0
  248. package/dist/shared/{hx-code-snippet-DdEqy-1B.js → hx-code-snippet-B4hV7rWG.js} +65 -53
  249. package/dist/shared/hx-code-snippet-B4hV7rWG.js.map +1 -0
  250. package/dist/shared/{hx-color-picker-K2x_dyeG.js → hx-color-picker-BvfJ_h16.js} +100 -90
  251. package/dist/shared/hx-color-picker-BvfJ_h16.js.map +1 -0
  252. package/dist/shared/{hx-combobox-DjMigccw.js → hx-combobox-BBi3izKJ.js} +80 -44
  253. package/dist/shared/hx-combobox-BBi3izKJ.js.map +1 -0
  254. package/dist/shared/hx-container-DLUKnTi9.js.map +1 -1
  255. package/dist/shared/{hx-copy-button-BXL1xkxb.js → hx-copy-button-CLBA31to.js} +45 -50
  256. package/dist/shared/hx-copy-button-CLBA31to.js.map +1 -0
  257. package/dist/shared/hx-counter-D-1NXzGs.js +138 -0
  258. package/dist/shared/hx-counter-D-1NXzGs.js.map +1 -0
  259. package/dist/shared/{hx-data-table-D3NZvc3P.js → hx-data-table-DNiDVWR2.js} +100 -95
  260. package/dist/shared/hx-data-table-DNiDVWR2.js.map +1 -0
  261. package/dist/shared/{hx-date-picker-CIHwx9b3.js → hx-date-picker-D7yCK0nk.js} +17 -12
  262. package/dist/shared/hx-date-picker-D7yCK0nk.js.map +1 -0
  263. package/dist/shared/{hx-dialog-e4CSD8xX.js → hx-dialog-Z7Ou_AZ9.js} +37 -36
  264. package/dist/shared/hx-dialog-Z7Ou_AZ9.js.map +1 -0
  265. package/dist/shared/hx-divider-XgWIz4Mr.js.map +1 -1
  266. package/dist/shared/{hx-drawer-bTF0nbrg.js → hx-drawer-Dk-_xzy0.js} +59 -58
  267. package/dist/shared/hx-drawer-Dk-_xzy0.js.map +1 -0
  268. package/dist/shared/hx-dropdown-DnjLnkTj.js.map +1 -1
  269. package/dist/shared/{hx-field-Dz-7M_SC.js → hx-field-CDP8EXuj.js} +22 -19
  270. package/dist/shared/hx-field-CDP8EXuj.js.map +1 -0
  271. package/dist/shared/{hx-file-upload-DnYiIhyN.js → hx-file-upload-CUORgnKc.js} +17 -14
  272. package/dist/shared/hx-file-upload-CUORgnKc.js.map +1 -0
  273. package/dist/shared/{hx-form-BJeLK34m.js → hx-form-BFv_N1dm.js} +9 -1
  274. package/dist/shared/{hx-form-BJeLK34m.js.map → hx-form-BFv_N1dm.js.map} +1 -1
  275. package/dist/shared/hx-help-text-DaOPN1iB.js.map +1 -1
  276. package/dist/shared/{hx-icon-button-C_fsUJW4.js → hx-icon-button-C83bCR0K.js} +2 -4
  277. package/dist/shared/hx-icon-button-C83bCR0K.js.map +1 -0
  278. package/dist/shared/{hx-list-CF-AAnp-.js → hx-list-CdRNgeoP.js} +7 -9
  279. package/dist/shared/{hx-list-CF-AAnp-.js.map → hx-list-CdRNgeoP.js.map} +1 -1
  280. package/dist/shared/{hx-menu-divider-Buc5XA9E.js → hx-menu-divider-11Dp2VfM.js} +50 -48
  281. package/dist/shared/hx-menu-divider-11Dp2VfM.js.map +1 -0
  282. package/dist/shared/{hx-meter-qcXl0zCL.js → hx-meter-UinDQjl6.js} +43 -37
  283. package/dist/shared/hx-meter-UinDQjl6.js.map +1 -0
  284. package/dist/shared/{hx-nav-CWwByFdq.js → hx-nav-DSpwWYUX.js} +81 -81
  285. package/dist/shared/hx-nav-DSpwWYUX.js.map +1 -0
  286. package/dist/shared/{hx-nav-item-DItaMWl0.js → hx-nav-item-D54-5eUM.js} +12 -12
  287. package/dist/shared/hx-nav-item-D54-5eUM.js.map +1 -0
  288. package/dist/shared/{hx-number-input-CS6_w1lT.js → hx-number-input-BP6TIA92.js} +5 -1
  289. package/dist/shared/hx-number-input-BP6TIA92.js.map +1 -0
  290. package/dist/shared/{hx-overflow-menu-CAS1Mlus.js → hx-overflow-menu-C7k5wlZy.js} +39 -34
  291. package/dist/shared/hx-overflow-menu-C7k5wlZy.js.map +1 -0
  292. package/dist/shared/{hx-pagination-DNFgXQm3.js → hx-pagination-BQ0cLTuB.js} +65 -62
  293. package/dist/shared/hx-pagination-BQ0cLTuB.js.map +1 -0
  294. package/dist/shared/{hx-popover-BjAyLbzp.js → hx-popover-BQsgrJCW.js} +7 -7
  295. package/dist/shared/hx-popover-BQsgrJCW.js.map +1 -0
  296. package/dist/shared/{hx-progress-bar-b3_m1hna.js → hx-progress-bar-C_mdPVF-.js} +61 -52
  297. package/dist/shared/hx-progress-bar-C_mdPVF-.js.map +1 -0
  298. package/dist/shared/{hx-progress-ring-wOSv2y_I.js → hx-progress-ring-BHJBaXNk.js} +2 -4
  299. package/dist/shared/hx-progress-ring-BHJBaXNk.js.map +1 -0
  300. package/dist/shared/{hx-radio-CGtFKls2.js → hx-radio-Bqyi8re3.js} +44 -12
  301. package/dist/shared/hx-radio-Bqyi8re3.js.map +1 -0
  302. package/dist/shared/{hx-rating-C4kTOyHF.js → hx-rating-Y_t7Z4qb.js} +104 -67
  303. package/dist/shared/hx-rating-Y_t7Z4qb.js.map +1 -0
  304. package/dist/shared/{hx-select-D9bYJcDv.js → hx-select-BBae2LqN.js} +16 -10
  305. package/dist/shared/hx-select-BBae2LqN.js.map +1 -0
  306. package/dist/shared/{hx-slider-Duzmuid9.js → hx-slider-CpnxH2UP.js} +9 -5
  307. package/dist/shared/{hx-slider-Duzmuid9.js.map → hx-slider-CpnxH2UP.js.map} +1 -1
  308. package/dist/shared/{hx-split-button-DhncgAtZ.js → hx-split-button-BvwoG8h2.js} +14 -13
  309. package/dist/shared/hx-split-button-BvwoG8h2.js.map +1 -0
  310. package/dist/shared/hx-split-panel-Cxkeauwe.js.map +1 -1
  311. package/dist/shared/hx-stat-C2wfph8W.js +212 -0
  312. package/dist/shared/hx-stat-C2wfph8W.js.map +1 -0
  313. package/dist/shared/{hx-step-nMT0fHEn.js → hx-step-DYoIumpR.js} +29 -29
  314. package/dist/shared/hx-step-DYoIumpR.js.map +1 -0
  315. package/dist/shared/{hx-structured-list-CMja1VXz.js → hx-structured-list-CMWllxGg.js} +23 -17
  316. package/dist/shared/{hx-structured-list-CMja1VXz.js.map → hx-structured-list-CMWllxGg.js.map} +1 -1
  317. package/dist/shared/{hx-switch-BPvIcDpM.js → hx-switch-DkKchcuP.js} +8 -3
  318. package/dist/shared/{hx-switch-BPvIcDpM.js.map → hx-switch-DkKchcuP.js.map} +1 -1
  319. package/dist/shared/{hx-tab-panel-C7h5lRpw.js → hx-tab-panel-CHB0u1zF.js} +91 -85
  320. package/dist/shared/hx-tab-panel-CHB0u1zF.js.map +1 -0
  321. package/dist/shared/hx-td-CVwCGBYf.js +604 -0
  322. package/dist/shared/hx-td-CVwCGBYf.js.map +1 -0
  323. package/dist/shared/{hx-text-input-BUMgOQHX.js → hx-text-input-BrCjo4fJ.js} +5 -1
  324. package/dist/shared/hx-text-input-BrCjo4fJ.js.map +1 -0
  325. package/dist/shared/{hx-textarea-B_nmxzhC.js → hx-textarea-BsQdB1Rk.js} +51 -18
  326. package/dist/shared/hx-textarea-BsQdB1Rk.js.map +1 -0
  327. package/dist/shared/{hx-time-picker-a-BCkecJ.js → hx-time-picker-DRRAFuVd.js} +62 -54
  328. package/dist/shared/hx-time-picker-DRRAFuVd.js.map +1 -0
  329. package/dist/shared/{hx-toggle-button--xCXWRJW.js → hx-toggle-button-D4F1soEM.js} +34 -22
  330. package/dist/shared/{hx-toggle-button--xCXWRJW.js.map → hx-toggle-button-D4F1soEM.js.map} +1 -1
  331. package/dist/shared/{hx-tooltip-DN6lMlP5.js → hx-tooltip-Bk1iQRHs.js} +23 -23
  332. package/dist/shared/hx-tooltip-Bk1iQRHs.js.map +1 -0
  333. package/dist/shared/{hx-top-nav-8lDKNZUj.js → hx-top-nav-DzW7XLv-.js} +42 -29
  334. package/dist/shared/{hx-top-nav-8lDKNZUj.js.map → hx-top-nav-DzW7XLv-.js.map} +1 -1
  335. package/dist/shared/{hx-tree-item-Cesh_du5.js → hx-tree-item-DdH6RbMs.js} +170 -111
  336. package/dist/shared/hx-tree-item-DdH6RbMs.js.map +1 -0
  337. package/dist/shared/{hx-toast-ikwh9Y03.js → toast-factory-B8jicczW.js} +69 -66
  338. package/dist/shared/toast-factory-B8jicczW.js.map +1 -0
  339. package/dist/tools/cem-a11y-analyzer/analyzers/aria-analyzer.d.ts +12 -0
  340. package/dist/tools/cem-a11y-analyzer/analyzers/aria-analyzer.d.ts.map +1 -0
  341. package/dist/tools/cem-a11y-analyzer/analyzers/focus-analyzer.d.ts +13 -0
  342. package/dist/tools/cem-a11y-analyzer/analyzers/focus-analyzer.d.ts.map +1 -0
  343. package/dist/tools/cem-a11y-analyzer/analyzers/form-analyzer.d.ts +13 -0
  344. package/dist/tools/cem-a11y-analyzer/analyzers/form-analyzer.d.ts.map +1 -0
  345. package/dist/tools/cem-a11y-analyzer/analyzers/keyboard-analyzer.d.ts +12 -0
  346. package/dist/tools/cem-a11y-analyzer/analyzers/keyboard-analyzer.d.ts.map +1 -0
  347. package/dist/tools/cem-a11y-analyzer/analyzers/label-analyzer.d.ts +13 -0
  348. package/dist/tools/cem-a11y-analyzer/analyzers/label-analyzer.d.ts.map +1 -0
  349. package/dist/tools/cem-a11y-analyzer/analyzers/motion-analyzer.d.ts +12 -0
  350. package/dist/tools/cem-a11y-analyzer/analyzers/motion-analyzer.d.ts.map +1 -0
  351. package/dist/tools/cem-a11y-analyzer/index.d.ts +14 -0
  352. package/dist/tools/cem-a11y-analyzer/index.d.ts.map +1 -0
  353. package/dist/tools/cem-a11y-analyzer/reporter.d.ts +6 -0
  354. package/dist/tools/cem-a11y-analyzer/reporter.d.ts.map +1 -0
  355. package/dist/tools/cem-a11y-analyzer/scorer.d.ts +22 -0
  356. package/dist/tools/cem-a11y-analyzer/scorer.d.ts.map +1 -0
  357. package/dist/tools/cem-a11y-analyzer/types.d.ts +171 -0
  358. package/dist/tools/cem-a11y-analyzer/types.d.ts.map +1 -0
  359. package/dist/utils/body-scroll-lock.d.ts +34 -0
  360. package/dist/utils/body-scroll-lock.d.ts.map +1 -0
  361. package/dist/utils/dev-warn.d.ts +19 -0
  362. package/dist/utils/dev-warn.d.ts.map +1 -0
  363. package/package.json +1 -1
  364. package/dist/shared/hx-accordion-D95XSAft.js.map +0 -1
  365. package/dist/shared/hx-action-bar-B4i9tBCP.js.map +0 -1
  366. package/dist/shared/hx-alert-BQpT4gL3.js.map +0 -1
  367. package/dist/shared/hx-avatar-yHjmNdtf.js.map +0 -1
  368. package/dist/shared/hx-breadcrumb-item-DtSxRZ_W.js.map +0 -1
  369. package/dist/shared/hx-button-CtiJsmOg.js.map +0 -1
  370. package/dist/shared/hx-button-group-BMV5qFs4.js.map +0 -1
  371. package/dist/shared/hx-card-DAkEfpJd.js.map +0 -1
  372. package/dist/shared/hx-carousel-item-C2yBnM0r.js.map +0 -1
  373. package/dist/shared/hx-checkbox-group-DTS9iT4b.js.map +0 -1
  374. package/dist/shared/hx-code-snippet-DdEqy-1B.js.map +0 -1
  375. package/dist/shared/hx-color-picker-K2x_dyeG.js.map +0 -1
  376. package/dist/shared/hx-combobox-DjMigccw.js.map +0 -1
  377. package/dist/shared/hx-copy-button-BXL1xkxb.js.map +0 -1
  378. package/dist/shared/hx-data-table-D3NZvc3P.js.map +0 -1
  379. package/dist/shared/hx-date-picker-CIHwx9b3.js.map +0 -1
  380. package/dist/shared/hx-dialog-e4CSD8xX.js.map +0 -1
  381. package/dist/shared/hx-drawer-bTF0nbrg.js.map +0 -1
  382. package/dist/shared/hx-field-Dz-7M_SC.js.map +0 -1
  383. package/dist/shared/hx-file-upload-DnYiIhyN.js.map +0 -1
  384. package/dist/shared/hx-icon-button-C_fsUJW4.js.map +0 -1
  385. package/dist/shared/hx-menu-divider-Buc5XA9E.js.map +0 -1
  386. package/dist/shared/hx-meter-qcXl0zCL.js.map +0 -1
  387. package/dist/shared/hx-nav-CWwByFdq.js.map +0 -1
  388. package/dist/shared/hx-nav-item-DItaMWl0.js.map +0 -1
  389. package/dist/shared/hx-number-input-CS6_w1lT.js.map +0 -1
  390. package/dist/shared/hx-overflow-menu-CAS1Mlus.js.map +0 -1
  391. package/dist/shared/hx-pagination-DNFgXQm3.js.map +0 -1
  392. package/dist/shared/hx-popover-BjAyLbzp.js.map +0 -1
  393. package/dist/shared/hx-progress-bar-b3_m1hna.js.map +0 -1
  394. package/dist/shared/hx-progress-ring-wOSv2y_I.js.map +0 -1
  395. package/dist/shared/hx-radio-CGtFKls2.js.map +0 -1
  396. package/dist/shared/hx-rating-C4kTOyHF.js.map +0 -1
  397. package/dist/shared/hx-select-D9bYJcDv.js.map +0 -1
  398. package/dist/shared/hx-split-button-DhncgAtZ.js.map +0 -1
  399. package/dist/shared/hx-step-nMT0fHEn.js.map +0 -1
  400. package/dist/shared/hx-tab-panel-C7h5lRpw.js.map +0 -1
  401. package/dist/shared/hx-text-input-BUMgOQHX.js.map +0 -1
  402. package/dist/shared/hx-textarea-B_nmxzhC.js.map +0 -1
  403. package/dist/shared/hx-time-picker-a-BCkecJ.js.map +0 -1
  404. package/dist/shared/hx-toast-ikwh9Y03.js.map +0 -1
  405. package/dist/shared/hx-tooltip-DN6lMlP5.js.map +0 -1
  406. package/dist/shared/hx-tree-item-Cesh_du5.js.map +0 -1
@@ -1,8 +1,8 @@
1
- import { css as g, html as a, LitElement as f, nothing as v } from "lit";
2
- import { property as l, state as c, customElement as _ } from "lit/decorators.js";
3
- import { classMap as y } from "lit/directives/class-map.js";
4
- import { tokenStyles as x } from "@helixui/tokens/lit";
5
- const m = g`
1
+ import { css as g, html as l, LitElement as f, nothing as p } from "lit";
2
+ import { property as a, state as c, customElement as _ } from "lit/decorators.js";
3
+ import { classMap as x } from "lit/directives/class-map.js";
4
+ import { tokenStyles as y } from "@helixui/tokens/lit";
5
+ const b = g`
6
6
  :host {
7
7
  display: block;
8
8
  position: relative;
@@ -200,12 +200,12 @@ const m = g`
200
200
  }
201
201
  }
202
202
  `;
203
- var b = Object.defineProperty, w = Object.getOwnPropertyDescriptor, n = (t, e, r, i) => {
204
- for (var s = i > 1 ? void 0 : i ? w(e, r) : e, h = t.length - 1, d; h >= 0; h--)
205
- (d = t[h]) && (s = (i ? d(e, r, s) : d(s)) || s);
206
- return i && s && b(e, r, s), s;
203
+ var m = Object.defineProperty, w = Object.getOwnPropertyDescriptor, n = (t, e, r, i) => {
204
+ for (var s = i > 1 ? void 0 : i ? w(e, r) : e, h = t.length - 1, u; h >= 0; h--)
205
+ (u = t[h]) && (s = (i ? u(e, r, s) : u(s)) || s);
206
+ return i && s && m(e, r, s), s;
207
207
  };
208
- const P = a`<svg
208
+ const P = l`<svg
209
209
  xmlns="http://www.w3.org/2000/svg"
210
210
  viewBox="0 0 24 24"
211
211
  fill="none"
@@ -216,7 +216,7 @@ const P = a`<svg
216
216
  aria-hidden="true"
217
217
  >
218
218
  <polyline points="15 18 9 12 15 6"></polyline>
219
- </svg>`, k = a`<svg
219
+ </svg>`, k = l`<svg
220
220
  xmlns="http://www.w3.org/2000/svg"
221
221
  viewBox="0 0 24 24"
222
222
  fill="none"
@@ -227,7 +227,7 @@ const P = a`<svg
227
227
  aria-hidden="true"
228
228
  >
229
229
  <polyline points="18 15 12 9 6 15"></polyline>
230
- </svg>`, I = a`<svg
230
+ </svg>`, I = l`<svg
231
231
  xmlns="http://www.w3.org/2000/svg"
232
232
  viewBox="0 0 24 24"
233
233
  fill="none"
@@ -238,7 +238,7 @@ const P = a`<svg
238
238
  aria-hidden="true"
239
239
  >
240
240
  <polyline points="9 18 15 12 9 6"></polyline>
241
- </svg>`, M = a`<svg
241
+ </svg>`, M = l`<svg
242
242
  xmlns="http://www.w3.org/2000/svg"
243
243
  viewBox="0 0 24 24"
244
244
  fill="none"
@@ -249,7 +249,7 @@ const P = a`<svg
249
249
  aria-hidden="true"
250
250
  >
251
251
  <polyline points="6 9 12 15 18 9"></polyline>
252
- </svg>`, $ = a`<svg
252
+ </svg>`, S = l`<svg
253
253
  xmlns="http://www.w3.org/2000/svg"
254
254
  viewBox="0 0 24 24"
255
255
  fill="currentColor"
@@ -258,7 +258,7 @@ const P = a`<svg
258
258
  height="1em"
259
259
  >
260
260
  <polygon points="5 3 19 12 5 21 5 3"></polygon>
261
- </svg>`, T = a`<svg
261
+ </svg>`, $ = l`<svg
262
262
  xmlns="http://www.w3.org/2000/svg"
263
263
  viewBox="0 0 24 24"
264
264
  fill="currentColor"
@@ -271,8 +271,8 @@ const P = a`<svg
271
271
  </svg>`;
272
272
  let o = class extends f {
273
273
  constructor() {
274
- super(...arguments), this.label = "Carousel", this.loop = !1, this.autoplay = !1, this.autoplayInterval = 3e3, this.slidesPerPage = 1, this.slidesPerMove = 1, this.orientation = "horizontal", this.mouseDragging = !1, this._currentIndex = 0, this._slides = [], this._isPlaying = !1, this._liveText = "", this._autoplayTimer = null, this._reducedMotion = !1, this._mql = null, this._isHovered = !1, this._isFocused = !1, this._dragStartCoord = 0, this._isDragging = !1, this._dragMoved = !1, this._touchStartCoord = 0, this._touchMoved = !1, this._autoplayTick = () => {
275
- this.loop ? this.goTo(this._currentIndex + this.slidesPerMove) : this._currentIndex < this._maxIndex ? this.goTo(this._currentIndex + this.slidesPerMove) : this.goTo(0);
274
+ super(...arguments), this.label = "Carousel", this.loop = !1, this.autoplay = !1, this.autoplayInterval = 3e3, this.slidesPerPage = 1, this.slidesPerMove = 1, this.orientation = "horizontal", this.mouseDragging = !1, this.labelPrevSlide = "Previous slide", this.labelNextSlide = "Next slide", this.labelPauseAutoplay = "Pause autoplay", this.labelPlayAutoplay = "Play autoplay", this._currentIndex = 0, this._slides = [], this._isPlaying = !1, this._liveText = "", this._livePolite = !0, this._autoplayTimer = null, this._reducedMotion = !1, this._mql = null, this._isHovered = !1, this._isFocused = !1, this._dragStartCoord = 0, this._isDragging = !1, this._dragMoved = !1, this._touchStartCoord = 0, this._touchMoved = !1, this._autoplayTick = () => {
275
+ this._livePolite = !1, this.loop ? this.goTo(this._currentIndex + this.slidesPerMove) : this._currentIndex < this._maxIndex ? this.goTo(this._currentIndex + this.slidesPerMove) : this.goTo(0);
276
276
  }, this._handleMotionChange = (t) => {
277
277
  this._reducedMotion = t.matches, this._reducedMotion ? this._stopAutoplay() : this.autoplay && !this._isHovered && !this._isFocused && this._startAutoplay();
278
278
  }, this._handleMouseEnter = () => {
@@ -314,6 +314,10 @@ let o = class extends f {
314
314
  this._syncSlides();
315
315
  }
316
316
  // ─── Navigation ───
317
+ /**
318
+ * Maximum valid slide index accounting for the number of slides visible per page.
319
+ * @internal
320
+ */
317
321
  get _maxIndex() {
318
322
  return Math.max(0, this._slides.length - this.slidesPerPage);
319
323
  }
@@ -330,11 +334,11 @@ let o = class extends f {
330
334
  }
331
335
  next() {
332
336
  const t = this._currentIndex + this.slidesPerMove;
333
- !this.loop && t > this._maxIndex || this.goTo(t);
337
+ !this.loop && t > this._maxIndex || (this._livePolite = !0, this.goTo(t));
334
338
  }
335
339
  previous() {
336
340
  const t = this._currentIndex - this.slidesPerMove;
337
- !this.loop && t < 0 || this.goTo(t);
341
+ !this.loop && t < 0 || (this._livePolite = !0, this.goTo(t));
338
342
  }
339
343
  _startAutoplay() {
340
344
  this._autoplayTimer === null && (this._isPlaying = !0, this._autoplayTimer = setInterval(this._autoplayTick, this.autoplayInterval));
@@ -385,50 +389,65 @@ let o = class extends f {
385
389
  const i = (this.orientation === "horizontal" ? e.clientX : e.clientY) - this._touchStartCoord, s = 50;
386
390
  this._touchMoved && (i > s ? this.previous() : i < -s && this.next()), this._isDragging = !1, this._touchMoved = !1;
387
391
  }
392
+ _goToManual(t) {
393
+ this._livePolite = !0, this.goTo(t);
394
+ }
388
395
  // ─── Computed ───
396
+ /**
397
+ * CSS transform value applied to the slide track to scroll to the current index.
398
+ * @internal
399
+ */
389
400
  get _trackTransform() {
390
401
  const t = 100 / this.slidesPerPage, e = this._currentIndex * t;
391
402
  return this.orientation === "horizontal" ? `translateX(-${e}%)` : `translateY(-${e}%)`;
392
403
  }
404
+ /**
405
+ * Whether the previous navigation button should be enabled.
406
+ * @internal
407
+ */
393
408
  get _canGoPrev() {
394
409
  return this.loop || this._currentIndex > 0;
395
410
  }
411
+ /**
412
+ * Whether the next navigation button should be enabled.
413
+ * @internal
414
+ */
396
415
  get _canGoNext() {
397
416
  return this.loop || this._currentIndex < this._maxIndex;
398
417
  }
399
418
  // ─── Render Helpers ───
400
419
  _renderNavigation() {
401
- return a`
420
+ return l`
402
421
  <div class="navigation" part="navigation">
403
422
  <slot name="previous-button">
404
423
  <button
405
424
  class="nav-btn"
406
425
  part="prev-btn"
407
426
  type="button"
408
- aria-label="Previous slide"
427
+ aria-label=${this.labelPrevSlide}
409
428
  ?disabled=${!this._canGoPrev}
410
429
  @click=${() => this.previous()}
411
430
  >
412
431
  ${this._renderPrevIcon()}
413
432
  </button>
414
433
  </slot>
415
- ${this.autoplay ? a`
434
+ ${this.autoplay ? l`
416
435
  <button
417
436
  class="play-pause-btn"
418
437
  part="play-pause-btn"
419
438
  type="button"
420
- aria-label=${this._isPlaying ? "Pause autoplay" : "Play autoplay"}
439
+ aria-label=${this._isPlaying ? this.labelPauseAutoplay : this.labelPlayAutoplay}
421
440
  @click=${() => this._toggleAutoplay()}
422
441
  >
423
442
  ${this._isPlaying ? this._renderPauseIcon() : this._renderPlayIcon()}
424
443
  </button>
425
- ` : v}
444
+ ` : p}
426
445
  <slot name="next-button">
427
446
  <button
428
447
  class="nav-btn"
429
448
  part="next-btn"
430
449
  type="button"
431
- aria-label="Next slide"
450
+ aria-label=${this.labelNextSlide}
432
451
  ?disabled=${!this._canGoNext}
433
452
  @click=${() => this.next()}
434
453
  >
@@ -440,23 +459,23 @@ let o = class extends f {
440
459
  }
441
460
  _renderPagination() {
442
461
  const t = this._slides.length;
443
- if (t <= 1) return v;
462
+ if (t <= 1) return p;
444
463
  const e = Array.from({ length: t }, (r, i) => i);
445
- return a`
464
+ return l`
446
465
  <div class="controls">
447
466
  <div class="pagination" part="pagination">
448
467
  ${e.map(
449
- (r) => a`
468
+ (r) => l`
450
469
  <button
451
- class=${y({
470
+ class=${x({
452
471
  "pagination-item": !0,
453
472
  "is-active": r === this._currentIndex
454
473
  })}
455
474
  part="pagination-item"
456
475
  type="button"
457
476
  aria-label="Slide ${r + 1} of ${t}"
458
- aria-current=${r === this._currentIndex ? "true" : "false"}
459
- @click=${() => this.goTo(r)}
477
+ aria-current=${r === this._currentIndex ? "true" : p}
478
+ @click=${() => this._goToManual(r)}
460
479
  >
461
480
  <span class="pagination-dot"></span>
462
481
  </button>
@@ -473,23 +492,27 @@ let o = class extends f {
473
492
  return this.orientation === "horizontal" ? I : M;
474
493
  }
475
494
  _renderPlayIcon() {
476
- return $;
495
+ return S;
477
496
  }
478
497
  _renderPauseIcon() {
479
- return T;
498
+ return $;
480
499
  }
481
500
  // ─── Render ───
482
501
  render() {
483
- return a`
502
+ return l`
484
503
  <div
485
504
  class="base"
486
505
  part="base"
487
506
  role="region"
488
507
  aria-label=${this.label}
489
508
  aria-roledescription="carousel"
490
- tabindex="0"
491
509
  >
492
- <div class="live-region" role="status" aria-live="polite" aria-atomic="true">
510
+ <div
511
+ class="live-region"
512
+ role="status"
513
+ aria-live=${this._livePolite ? "polite" : "off"}
514
+ aria-atomic="true"
515
+ >
493
516
  ${this._liveText}
494
517
  </div>
495
518
  ${this._renderNavigation()}
@@ -515,31 +538,43 @@ let o = class extends f {
515
538
  `;
516
539
  }
517
540
  };
518
- o.styles = [x, m];
541
+ o.styles = [y, b];
519
542
  n([
520
- l({ type: String, reflect: !0 })
543
+ a({ type: String, reflect: !0 })
521
544
  ], o.prototype, "label", 2);
522
545
  n([
523
- l({ type: Boolean, reflect: !0 })
546
+ a({ type: Boolean, reflect: !0 })
524
547
  ], o.prototype, "loop", 2);
525
548
  n([
526
- l({ type: Boolean, reflect: !0 })
549
+ a({ type: Boolean, reflect: !0 })
527
550
  ], o.prototype, "autoplay", 2);
528
551
  n([
529
- l({ type: Number, attribute: "autoplay-interval" })
552
+ a({ type: Number, attribute: "autoplay-interval" })
530
553
  ], o.prototype, "autoplayInterval", 2);
531
554
  n([
532
- l({ type: Number, attribute: "slides-per-page" })
555
+ a({ type: Number, attribute: "slides-per-page" })
533
556
  ], o.prototype, "slidesPerPage", 2);
534
557
  n([
535
- l({ type: Number, attribute: "slides-per-move" })
558
+ a({ type: Number, attribute: "slides-per-move" })
536
559
  ], o.prototype, "slidesPerMove", 2);
537
560
  n([
538
- l({ type: String, reflect: !0 })
561
+ a({ type: String, reflect: !0 })
539
562
  ], o.prototype, "orientation", 2);
540
563
  n([
541
- l({ type: Boolean, attribute: "mouse-dragging", reflect: !0 })
564
+ a({ type: Boolean, attribute: "mouse-dragging", reflect: !0 })
542
565
  ], o.prototype, "mouseDragging", 2);
566
+ n([
567
+ a({ type: String, attribute: "label-prev-slide" })
568
+ ], o.prototype, "labelPrevSlide", 2);
569
+ n([
570
+ a({ type: String, attribute: "label-next-slide" })
571
+ ], o.prototype, "labelNextSlide", 2);
572
+ n([
573
+ a({ type: String, attribute: "label-pause-autoplay" })
574
+ ], o.prototype, "labelPauseAutoplay", 2);
575
+ n([
576
+ a({ type: String, attribute: "label-play-autoplay" })
577
+ ], o.prototype, "labelPlayAutoplay", 2);
543
578
  n([
544
579
  c()
545
580
  ], o.prototype, "_currentIndex", 2);
@@ -552,29 +587,32 @@ n([
552
587
  n([
553
588
  c()
554
589
  ], o.prototype, "_liveText", 2);
590
+ n([
591
+ c()
592
+ ], o.prototype, "_livePolite", 2);
555
593
  o = n([
556
594
  _("hx-carousel")
557
595
  ], o);
558
- var C = Object.defineProperty, D = Object.getOwnPropertyDescriptor, p = (t, e, r, i) => {
559
- for (var s = i > 1 ? void 0 : i ? D(e, r) : e, h = t.length - 1, d; h >= 0; h--)
560
- (d = t[h]) && (s = (i ? d(e, r, s) : d(s)) || s);
561
- return i && s && C(e, r, s), s;
596
+ var T = Object.defineProperty, C = Object.getOwnPropertyDescriptor, v = (t, e, r, i) => {
597
+ for (var s = i > 1 ? void 0 : i ? C(e, r) : e, h = t.length - 1, u; h >= 0; h--)
598
+ (u = t[h]) && (s = (i ? u(e, r, s) : u(s)) || s);
599
+ return i && s && T(e, r, s), s;
562
600
  };
563
- let u = class extends f {
601
+ let d = class extends f {
564
602
  constructor() {
565
603
  super(...arguments), this.slideIndex = 0, this.totalSlides = 0;
566
604
  }
567
605
  render() {
568
606
  const t = `Slide ${this.slideIndex + 1} of ${this.totalSlides}`;
569
- return a`
607
+ return l`
570
608
  <div class="slide-group" role="group" aria-label=${t} tabindex="-1">
571
609
  <slot></slot>
572
610
  </div>
573
611
  `;
574
612
  }
575
613
  };
576
- u.styles = [
577
- x,
614
+ d.styles = [
615
+ y,
578
616
  g`
579
617
  :host {
580
618
  display: block;
@@ -601,17 +639,17 @@ u.styles = [
601
639
  }
602
640
  `
603
641
  ];
604
- p([
605
- l({ type: Number, attribute: "slide-index" })
606
- ], u.prototype, "slideIndex", 2);
607
- p([
608
- l({ type: Number, attribute: "total-slides" })
609
- ], u.prototype, "totalSlides", 2);
610
- u = p([
642
+ v([
643
+ a({ type: Number, attribute: "slide-index" })
644
+ ], d.prototype, "slideIndex", 2);
645
+ v([
646
+ a({ type: Number, attribute: "total-slides" })
647
+ ], d.prototype, "totalSlides", 2);
648
+ d = v([
611
649
  _("hx-carousel-item")
612
- ], u);
650
+ ], d);
613
651
  export {
614
652
  o as H,
615
- u as a
653
+ d as a
616
654
  };
617
- //# sourceMappingURL=hx-carousel-item-C2yBnM0r.js.map
655
+ //# sourceMappingURL=hx-carousel-item-BKpmFbUT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hx-carousel-item-BKpmFbUT.js","sources":["../../src/components/hx-carousel/hx-carousel.styles.ts","../../src/components/hx-carousel/hx-carousel.ts","../../src/components/hx-carousel/hx-carousel-item.ts"],"sourcesContent":["import { css } from 'lit';\n\nexport const helixCarouselStyles = css`\n :host {\n display: block;\n position: relative;\n }\n\n /* ─── Base ─── */\n\n .base {\n display: flex;\n flex-direction: column;\n gap: var(--hx-space-3, 0.75rem);\n }\n\n :host([orientation='vertical']) .base {\n flex-direction: row;\n }\n\n /* ─── Navigation ─── */\n\n .navigation {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--hx-space-2, 0.5rem);\n }\n\n :host([orientation='vertical']) .navigation {\n flex-direction: column;\n }\n\n .nav-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--hx-carousel-nav-btn-size, var(--hx-size-10, 2.5rem));\n height: var(--hx-carousel-nav-btn-size, var(--hx-size-10, 2.5rem));\n border: var(--hx-border-width-thin, 1px) solid var(--hx-color-neutral-200, #e5e7eb);\n border-radius: var(--hx-border-radius-full, 9999px);\n background: var(--hx-color-neutral-0, #fff);\n color: var(--hx-color-neutral-700, #374151);\n cursor: pointer;\n padding: 0;\n transition:\n background-color var(--hx-transition-fast, 0.15s ease),\n color var(--hx-transition-fast, 0.15s ease),\n border-color var(--hx-transition-fast, 0.15s ease);\n flex-shrink: 0;\n }\n\n .nav-btn:hover:not([disabled]) {\n background: var(--hx-color-neutral-50, #f9fafb);\n border-color: var(--hx-color-neutral-400, #9ca3af);\n }\n\n .nav-btn:focus-visible {\n outline: var(--hx-focus-ring-width, 2px) solid var(--hx-focus-ring-color, #2563eb);\n outline-offset: var(--hx-focus-ring-offset, 2px);\n }\n\n .nav-btn[disabled] {\n opacity: var(--hx-opacity-disabled, 0.4);\n cursor: not-allowed;\n }\n\n .nav-btn svg {\n width: 1.25em;\n height: 1.25em;\n }\n\n /* ─── Play/Pause ─── */\n\n .play-pause-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--hx-size-8, 2rem);\n height: var(--hx-size-8, 2rem);\n border: var(--hx-border-width-thin, 1px) solid transparent;\n border-radius: var(--hx-border-radius-md, 0.375rem);\n background: transparent;\n color: var(--hx-color-neutral-500, #6b7280);\n cursor: pointer;\n padding: 0;\n font-size: var(--hx-font-size-sm, 0.875rem);\n transition: background-color var(--hx-transition-fast, 0.15s ease);\n flex-shrink: 0;\n }\n\n .play-pause-btn:hover {\n background: var(--hx-color-neutral-100, #f3f4f6);\n }\n\n .play-pause-btn:focus-visible {\n outline: var(--hx-focus-ring-width, 2px) solid var(--hx-focus-ring-color, #2563eb);\n outline-offset: var(--hx-focus-ring-offset, 2px);\n }\n\n /* ─── Scroll Container ─── */\n\n .scroll-container-wrapper {\n flex: 1;\n overflow: hidden;\n }\n\n .slide-viewport {\n overflow: hidden;\n border-radius: var(--hx-border-radius-md, 0.375rem);\n }\n\n .track {\n display: flex;\n transition: transform var(--hx-transition-base, 0.3s ease);\n }\n\n :host([orientation='vertical']) .track {\n flex-direction: column;\n }\n\n /* ─── Pagination ─── */\n\n .pagination {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--hx-space-2, 0.5rem);\n flex-wrap: wrap;\n }\n\n :host([orientation='vertical']) .pagination {\n flex-direction: column;\n }\n\n .pagination-item {\n display: inline-flex;\n padding: 0;\n border: none;\n cursor: pointer;\n background: transparent;\n border-radius: var(--hx-border-radius-full, 9999px);\n }\n\n .pagination-dot {\n display: block;\n width: var(--hx-carousel-pagination-dot-size, 0.5rem);\n height: var(--hx-carousel-pagination-dot-size, 0.5rem);\n border-radius: var(--hx-border-radius-full, 9999px);\n background: var(--hx-color-neutral-300, #d1d5db);\n transition:\n background-color var(--hx-transition-fast, 0.15s ease),\n transform var(--hx-transition-fast, 0.15s ease);\n }\n\n .pagination-item[aria-current='true'] .pagination-dot,\n .pagination-item.is-active .pagination-dot {\n background: var(--hx-color-primary-600, #2563eb);\n transform: scale(1.25);\n }\n\n .pagination-item:focus-visible {\n outline: var(--hx-focus-ring-width, 2px) solid var(--hx-focus-ring-color, #2563eb);\n outline-offset: var(--hx-focus-ring-offset, 2px);\n border-radius: var(--hx-border-radius-full, 9999px);\n }\n\n /* ─── Controls row ─── */\n\n .controls {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--hx-space-3, 0.75rem);\n }\n\n /* ─── Live Region ─── */\n\n .live-region {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n }\n\n /* ─── Reduced Motion ─── */\n\n @media (prefers-reduced-motion: reduce) {\n .track,\n .nav-btn,\n .pagination-dot,\n .play-pause-btn {\n transition: none;\n }\n }\n`;\n","import { LitElement, html, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { tokenStyles } from '@helixui/tokens/lit';\nimport { helixCarouselStyles } from './hx-carousel.styles.js';\nimport type { HelixCarouselItem } from './hx-carousel-item.js';\n\n// ─── Module-level SVG icon constants ───\n\nconst _svgChevronLeft = html`<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n>\n <polyline points=\"15 18 9 12 15 6\"></polyline>\n</svg>`;\n\nconst _svgChevronUp = html`<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n>\n <polyline points=\"18 15 12 9 6 15\"></polyline>\n</svg>`;\n\nconst _svgChevronRight = html`<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n>\n <polyline points=\"9 18 15 12 9 6\"></polyline>\n</svg>`;\n\nconst _svgChevronDown = html`<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n>\n <polyline points=\"6 9 12 15 18 9\"></polyline>\n</svg>`;\n\nconst _svgPlay = html`<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n width=\"1em\"\n height=\"1em\"\n>\n <polygon points=\"5 3 19 12 5 21 5 3\"></polygon>\n</svg>`;\n\nconst _svgPause = html`<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n width=\"1em\"\n height=\"1em\"\n>\n <rect x=\"6\" y=\"4\" width=\"4\" height=\"16\"></rect>\n <rect x=\"14\" y=\"4\" width=\"4\" height=\"16\"></rect>\n</svg>`;\n\n/**\n * A scrollable carousel/slider for images or content slides.\n *\n * @summary Scrollable carousel with navigation, pagination, autoplay, and an accessible label.\n *\n * @tag hx-carousel\n *\n * @slot - `hx-carousel-item` elements (the slides).\n * @slot next-button - Custom next navigation button.\n * @slot previous-button - Custom previous navigation button.\n *\n * @fires {CustomEvent<{index: number, slide: HelixCarouselItem}>} hx-slide-change - Dispatched when the active slide changes.\n *\n * @csspart base - The outer wrapper element.\n * @csspart slide-viewport - The slide viewport/overflow container.\n * @csspart pagination - The pagination dot container.\n * @csspart pagination-item - Individual pagination dot button.\n * @csspart navigation - The previous/next button wrapper.\n * @csspart prev-btn - The previous navigation button.\n * @csspart next-btn - The next navigation button.\n * @csspart play-pause-btn - The autoplay play/pause toggle button.\n *\n * @cssprop [--hx-carousel-gap=0px] - Gap between slides.\n * @cssprop [--hx-carousel-slide-width=100%] - Width override for each slide.\n * @cssprop [--hx-carousel-nav-btn-size=2.5rem] - Size of previous/next navigation buttons.\n * @cssprop [--hx-carousel-pagination-dot-size=0.5rem] - Size of pagination dots.\n */\n@customElement('hx-carousel')\nexport class HelixCarousel extends LitElement {\n static override styles = [tokenStyles, helixCarouselStyles];\n\n /**\n * Accessible label identifying this carousel to assistive technology.\n * When multiple carousels appear on the same page, each must have a unique label.\n * @attr label\n */\n @property({ type: String, reflect: true })\n label = 'Carousel';\n\n /**\n * Whether the carousel wraps around from last to first slide and vice-versa.\n * @attr loop\n */\n @property({ type: Boolean, reflect: true })\n loop = false;\n\n /**\n * Whether the carousel auto-advances slides.\n * Automatically pauses on hover, focus, and when prefers-reduced-motion is active.\n * @attr autoplay\n */\n @property({ type: Boolean, reflect: true })\n autoplay = false;\n\n /**\n * Milliseconds between auto-advance transitions.\n * @attr autoplay-interval\n */\n @property({ type: Number, attribute: 'autoplay-interval' })\n autoplayInterval = 3000;\n\n /**\n * Number of slides visible at once.\n * @attr slides-per-page\n */\n @property({ type: Number, attribute: 'slides-per-page' })\n slidesPerPage = 1;\n\n /**\n * Number of slides to advance per navigation action.\n * @attr slides-per-move\n */\n @property({ type: Number, attribute: 'slides-per-move' })\n slidesPerMove = 1;\n\n /**\n * Scroll axis of the carousel.\n * @attr orientation\n */\n @property({ type: String, reflect: true })\n orientation: 'horizontal' | 'vertical' = 'horizontal';\n\n /**\n * Whether click-drag scrolling is enabled.\n * @attr mouse-dragging\n */\n @property({ type: Boolean, attribute: 'mouse-dragging', reflect: true })\n mouseDragging = false;\n\n /**\n * Accessible label for the previous slide button.\n * @attr label-prev-slide\n */\n @property({ type: String, attribute: 'label-prev-slide' })\n labelPrevSlide = 'Previous slide';\n\n /**\n * Accessible label for the next slide button.\n * @attr label-next-slide\n */\n @property({ type: String, attribute: 'label-next-slide' })\n labelNextSlide = 'Next slide';\n\n /**\n * Accessible label for the autoplay pause button.\n * @attr label-pause-autoplay\n */\n @property({ type: String, attribute: 'label-pause-autoplay' })\n labelPauseAutoplay = 'Pause autoplay';\n\n /**\n * Accessible label for the autoplay play button.\n * @attr label-play-autoplay\n */\n @property({ type: String, attribute: 'label-play-autoplay' })\n labelPlayAutoplay = 'Play autoplay';\n\n /**\n * Index of the currently visible slide.\n * @internal\n */\n @state() private _currentIndex = 0;\n /**\n * Array of carousel item elements assigned to the default slot.\n * @internal\n */\n @state() private _slides: HelixCarouselItem[] = [];\n /**\n * Whether the autoplay is currently active and advancing slides.\n * @internal\n */\n @state() private _isPlaying = false;\n /**\n * Text content for the ARIA live region announcing slide changes.\n * @internal\n */\n @state() private _liveText = '';\n @state() private _livePolite = true;\n\n /**\n * Reference to the active autoplay interval timer, or null when stopped.\n * @internal\n */\n private _autoplayTimer: ReturnType<typeof setInterval> | null = null;\n /**\n * Whether the user has requested reduced motion via the OS media preference.\n * @internal\n */\n private _reducedMotion = false;\n /**\n * MediaQueryList instance for monitoring the prefers-reduced-motion media feature.\n * @internal\n */\n private _mql: MediaQueryList | null = null;\n /**\n * Whether the carousel is currently being hovered, used to pause autoplay on hover.\n * @internal\n */\n private _isHovered = false;\n /**\n * Whether a descendant of the carousel currently has focus, used to pause autoplay on focus.\n * @internal\n */\n private _isFocused = false;\n\n // ─── Drag state ───\n /**\n * Pointer coordinate at the start of a mouse drag gesture.\n * @internal\n */\n private _dragStartCoord = 0;\n /**\n * Whether a mouse drag gesture is currently in progress.\n * @internal\n */\n private _isDragging = false;\n /**\n * Whether the pointer has moved beyond the drag threshold during the current drag gesture.\n * @internal\n */\n private _dragMoved = false;\n /**\n * Touch coordinate at the start of a touch swipe gesture.\n * @internal\n */\n private _touchStartCoord = 0;\n /**\n * Whether the touch has moved beyond the swipe threshold during the current touch gesture.\n * @internal\n */\n private _touchMoved = false;\n\n // ─── Lifecycle ───\n\n override connectedCallback(): void {\n super.connectedCallback();\n this._mql = window.matchMedia('(prefers-reduced-motion: reduce)');\n this._reducedMotion = this._mql.matches;\n this._mql.addEventListener('change', this._handleMotionChange);\n\n this.addEventListener('mouseenter', this._handleMouseEnter);\n this.addEventListener('mouseleave', this._handleMouseLeave);\n this.addEventListener('focusin', this._handleFocusIn);\n this.addEventListener('focusout', this._handleFocusOut);\n this.addEventListener('keydown', this._handleKeydown);\n // Touch events are registered directly on the scroll-container in the template\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this._mql?.removeEventListener('change', this._handleMotionChange);\n this._stopAutoplay();\n this.removeEventListener('mouseenter', this._handleMouseEnter);\n this.removeEventListener('mouseleave', this._handleMouseLeave);\n this.removeEventListener('focusin', this._handleFocusIn);\n this.removeEventListener('focusout', this._handleFocusOut);\n this.removeEventListener('keydown', this._handleKeydown);\n }\n\n override firstUpdated(): void {\n this._syncSlides();\n if (this.autoplay && !this._reducedMotion) {\n this._startAutoplay();\n }\n }\n\n // ─── Slide Management ───\n\n private _syncSlides(): void {\n const slot = this.shadowRoot?.querySelector<HTMLSlotElement>('slot:not([name])');\n if (!slot) return;\n\n const items = slot\n .assignedElements({ flatten: true })\n .filter((el) => el.tagName.toLowerCase() === 'hx-carousel-item') as HelixCarouselItem[];\n\n this._slides = items;\n\n // Update aria labels on each item\n items.forEach((item, i) => {\n item.slideIndex = i;\n item.totalSlides = items.length;\n const slideWidth = `${100 / this.slidesPerPage}%`;\n (item as HTMLElement).style.setProperty('--_hx-carousel-slide-width', slideWidth);\n });\n\n // Clamp currentIndex if slides changed\n if (this._currentIndex >= items.length) {\n this._currentIndex = Math.max(0, items.length - 1);\n }\n }\n\n private _handleSlotChange(): void {\n this._syncSlides();\n }\n\n // ─── Navigation ───\n\n /**\n * Maximum valid slide index accounting for the number of slides visible per page.\n * @internal\n */\n private get _maxIndex(): number {\n return Math.max(0, this._slides.length - this.slidesPerPage);\n }\n\n goTo(index: number): void {\n if (this._slides.length === 0) return;\n\n let next = index;\n if (this.loop) {\n next = ((index % this._slides.length) + this._slides.length) % this._slides.length;\n } else {\n next = Math.max(0, Math.min(index, this._maxIndex));\n }\n\n if (next === this._currentIndex) return;\n\n this._currentIndex = next;\n this._liveText = `Slide ${next + 1} of ${this._slides.length}`;\n this.dispatchEvent(\n new CustomEvent('hx-slide-change', {\n bubbles: true,\n composed: true,\n detail: { index: next, slide: this._slides[next] },\n }),\n );\n }\n\n next(): void {\n const nextIndex = this._currentIndex + this.slidesPerMove;\n if (!this.loop && nextIndex > this._maxIndex) {\n return;\n }\n this._livePolite = true;\n this.goTo(nextIndex);\n }\n\n previous(): void {\n const prevIndex = this._currentIndex - this.slidesPerMove;\n if (!this.loop && prevIndex < 0) {\n return;\n }\n this._livePolite = true;\n this.goTo(prevIndex);\n }\n\n // ─── Autoplay ───\n\n /**\n * Callback invoked on each autoplay interval tick to advance to the next slide.\n * @internal\n */\n private _autoplayTick = (): void => {\n this._livePolite = false;\n if (this.loop) {\n this.goTo(this._currentIndex + this.slidesPerMove);\n } else if (this._currentIndex < this._maxIndex) {\n this.goTo(this._currentIndex + this.slidesPerMove);\n } else {\n this.goTo(0);\n }\n };\n\n private _startAutoplay(): void {\n if (this._autoplayTimer !== null) return;\n this._isPlaying = true;\n this._autoplayTimer = setInterval(this._autoplayTick, this.autoplayInterval);\n }\n\n private _stopAutoplay(): void {\n if (this._autoplayTimer !== null) {\n clearInterval(this._autoplayTimer);\n this._autoplayTimer = null;\n }\n this._isPlaying = false;\n }\n\n private _toggleAutoplay(): void {\n if (this._isPlaying) {\n this._stopAutoplay();\n } else if (!this._reducedMotion) {\n this._startAutoplay();\n }\n }\n\n private _pauseAutoplay(): void {\n if (!this._isPlaying || this._autoplayTimer === null) return;\n clearInterval(this._autoplayTimer);\n this._autoplayTimer = null;\n }\n\n private _resumeAutoplay(): void {\n if (!this.autoplay || !this._isPlaying || this._reducedMotion) return;\n if (this._autoplayTimer !== null) return;\n this._autoplayTimer = setInterval(this._autoplayTick, this.autoplayInterval);\n }\n\n // ─── Event Handlers ───\n\n /**\n * Handles changes to the prefers-reduced-motion media query, stopping or resuming autoplay accordingly.\n * @internal\n */\n private _handleMotionChange = (e: MediaQueryListEvent): void => {\n this._reducedMotion = e.matches;\n if (this._reducedMotion) {\n this._stopAutoplay();\n } else if (this.autoplay && !this._isHovered && !this._isFocused) {\n this._startAutoplay();\n }\n };\n\n /**\n * Handles the mouseenter event to pause autoplay while the user hovers over the carousel.\n * @internal\n */\n private _handleMouseEnter = (): void => {\n this._isHovered = true;\n this._pauseAutoplay();\n };\n\n /**\n * Handles the mouseleave event to resume autoplay when the user stops hovering.\n * @internal\n */\n private _handleMouseLeave = (): void => {\n this._isHovered = false;\n if (!this._isFocused) {\n this._resumeAutoplay();\n }\n };\n\n /**\n * Handles the focusin event to pause autoplay while a descendant has focus.\n * @internal\n */\n private _handleFocusIn = (): void => {\n this._isFocused = true;\n this._pauseAutoplay();\n };\n\n /**\n * Handles the focusout event to resume autoplay when focus leaves the carousel.\n * @internal\n */\n private _handleFocusOut = (): void => {\n this._isFocused = false;\n if (!this._isHovered) {\n this._resumeAutoplay();\n }\n };\n\n /**\n * Handles keyboard navigation to move between slides using arrow, Home, and End keys.\n * @internal\n */\n private _handleKeydown = (e: KeyboardEvent): void => {\n if (this.orientation === 'horizontal') {\n if (e.key === 'ArrowLeft') {\n e.preventDefault();\n this.previous();\n } else if (e.key === 'ArrowRight') {\n e.preventDefault();\n this.next();\n }\n } else {\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n this.previous();\n } else if (e.key === 'ArrowDown') {\n e.preventDefault();\n this.next();\n }\n }\n\n if (e.key === 'Home') {\n e.preventDefault();\n this.goTo(0);\n } else if (e.key === 'End') {\n e.preventDefault();\n this.goTo(this._slides.length - 1);\n }\n };\n\n // ─── Drag Handlers ───\n\n private _handleDragStart(e: MouseEvent): void {\n if (!this.mouseDragging) return;\n this._isDragging = true;\n this._dragMoved = false;\n this._dragStartCoord = this.orientation === 'horizontal' ? e.clientX : e.clientY;\n (e.currentTarget as HTMLElement).style.cursor = 'grabbing';\n e.preventDefault();\n }\n\n private _handleDragMove(e: MouseEvent): void {\n if (!this._isDragging) return;\n const current = this.orientation === 'horizontal' ? e.clientX : e.clientY;\n const diff = current - this._dragStartCoord;\n if (Math.abs(diff) > 5) {\n this._dragMoved = true;\n }\n }\n\n private _handleDragEnd(e: MouseEvent): void {\n if (!this._isDragging) return;\n const current = this.orientation === 'horizontal' ? e.clientX : e.clientY;\n const diff = current - this._dragStartCoord;\n const threshold = 50;\n if (this._dragMoved) {\n if (diff > threshold) {\n this.previous();\n } else if (diff < -threshold) {\n this.next();\n }\n }\n this._isDragging = false;\n this._dragMoved = false;\n (e.currentTarget as HTMLElement).style.cursor = '';\n }\n\n // ─── Touch Handlers ───\n\n private _handleTouchStart(e: TouchEvent): void {\n if (!this.mouseDragging) return;\n const touch = e.touches[0];\n if (!touch) return;\n this._isDragging = true;\n this._touchMoved = false;\n this._touchStartCoord = this.orientation === 'horizontal' ? touch.clientX : touch.clientY;\n }\n\n private _handleTouchMove(e: TouchEvent): void {\n if (!this._isDragging) return;\n const touch = e.touches[0];\n if (!touch) return;\n const current = this.orientation === 'horizontal' ? touch.clientX : touch.clientY;\n const diff = current - this._touchStartCoord;\n if (Math.abs(diff) > 5) {\n this._touchMoved = true;\n }\n }\n\n private _handleTouchEnd(e: TouchEvent): void {\n if (!this._isDragging) return;\n const touch = e.changedTouches[0];\n if (!touch) return;\n const current = this.orientation === 'horizontal' ? touch.clientX : touch.clientY;\n const diff = current - this._touchStartCoord;\n const threshold = 50;\n if (this._touchMoved) {\n if (diff > threshold) {\n this.previous();\n } else if (diff < -threshold) {\n this.next();\n }\n }\n this._isDragging = false;\n this._touchMoved = false;\n }\n\n private _goToManual(index: number): void {\n this._livePolite = true;\n this.goTo(index);\n }\n\n // ─── Computed ───\n\n /**\n * CSS transform value applied to the slide track to scroll to the current index.\n * @internal\n */\n private get _trackTransform(): string {\n const slideSize = 100 / this.slidesPerPage;\n const offset = this._currentIndex * slideSize;\n return this.orientation === 'horizontal'\n ? `translateX(-${offset}%)`\n : `translateY(-${offset}%)`;\n }\n\n /**\n * Whether the previous navigation button should be enabled.\n * @internal\n */\n private get _canGoPrev(): boolean {\n return this.loop || this._currentIndex > 0;\n }\n\n /**\n * Whether the next navigation button should be enabled.\n * @internal\n */\n private get _canGoNext(): boolean {\n return this.loop || this._currentIndex < this._maxIndex;\n }\n\n // ─── Render Helpers ───\n\n private _renderNavigation() {\n return html`\n <div class=\"navigation\" part=\"navigation\">\n <slot name=\"previous-button\">\n <button\n class=\"nav-btn\"\n part=\"prev-btn\"\n type=\"button\"\n aria-label=${this.labelPrevSlide}\n ?disabled=${!this._canGoPrev}\n @click=${() => this.previous()}\n >\n ${this._renderPrevIcon()}\n </button>\n </slot>\n ${this.autoplay\n ? html`\n <button\n class=\"play-pause-btn\"\n part=\"play-pause-btn\"\n type=\"button\"\n aria-label=${this._isPlaying ? this.labelPauseAutoplay : this.labelPlayAutoplay}\n @click=${() => this._toggleAutoplay()}\n >\n ${this._isPlaying ? this._renderPauseIcon() : this._renderPlayIcon()}\n </button>\n `\n : nothing}\n <slot name=\"next-button\">\n <button\n class=\"nav-btn\"\n part=\"next-btn\"\n type=\"button\"\n aria-label=${this.labelNextSlide}\n ?disabled=${!this._canGoNext}\n @click=${() => this.next()}\n >\n ${this._renderNextIcon()}\n </button>\n </slot>\n </div>\n `;\n }\n\n private _renderPagination() {\n const count = this._slides.length;\n if (count <= 1) return nothing;\n const dots = Array.from({ length: count }, (_, i) => i);\n return html`\n <div class=\"controls\">\n <div class=\"pagination\" part=\"pagination\">\n ${dots.map(\n (i) => html`\n <button\n class=${classMap({\n 'pagination-item': true,\n 'is-active': i === this._currentIndex,\n })}\n part=\"pagination-item\"\n type=\"button\"\n aria-label=\"Slide ${i + 1} of ${count}\"\n aria-current=${i === this._currentIndex ? 'true' : nothing}\n @click=${() => this._goToManual(i)}\n >\n <span class=\"pagination-dot\"></span>\n </button>\n `,\n )}\n </div>\n </div>\n `;\n }\n\n private _renderPrevIcon() {\n return this.orientation === 'horizontal' ? _svgChevronLeft : _svgChevronUp;\n }\n\n private _renderNextIcon() {\n return this.orientation === 'horizontal' ? _svgChevronRight : _svgChevronDown;\n }\n\n private _renderPlayIcon() {\n return _svgPlay;\n }\n\n private _renderPauseIcon() {\n return _svgPause;\n }\n\n // ─── Render ───\n\n override render() {\n return html`\n <div\n class=\"base\"\n part=\"base\"\n role=\"region\"\n aria-label=${this.label}\n aria-roledescription=\"carousel\"\n >\n <div\n class=\"live-region\"\n role=\"status\"\n aria-live=${this._livePolite ? 'polite' : 'off'}\n aria-atomic=\"true\"\n >\n ${this._liveText}\n </div>\n ${this._renderNavigation()}\n <div class=\"scroll-container-wrapper\">\n <div\n class=\"slide-viewport\"\n part=\"slide-viewport\"\n @mousedown=${this._handleDragStart}\n @mousemove=${this._handleDragMove}\n @mouseup=${this._handleDragEnd}\n @mouseleave=${this._handleDragEnd}\n @touchstart=${this._handleTouchStart}\n @touchmove=${this._handleTouchMove}\n @touchend=${this._handleTouchEnd}\n >\n <div class=\"track\" style=\"transform: ${this._trackTransform};\">\n <slot @slotchange=${this._handleSlotChange}></slot>\n </div>\n </div>\n </div>\n ${this._renderPagination()}\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'hx-carousel': HelixCarousel;\n }\n}\n","import { LitElement, html, css } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { tokenStyles } from '@helixui/tokens/lit';\n\n/**\n * A wrapper for individual carousel slides.\n *\n * @summary Individual slide wrapper for use inside hx-carousel.\n *\n * @tag hx-carousel-item\n *\n * @slot - Slide content.\n */\n@customElement('hx-carousel-item')\nexport class HelixCarouselItem extends LitElement {\n static override styles = [\n tokenStyles,\n css`\n :host {\n display: block;\n flex-shrink: 0;\n width: var(--_hx-carousel-slide-width, 100%);\n box-sizing: border-box;\n }\n\n .slide-group {\n height: 100%;\n outline: none;\n }\n\n /*\n * Show focus ring for both keyboard-initiated focus (:focus-visible) and\n * programmatic focus (.focus() calls from JS). tabindex=\"-1\" elements only\n * receive focus programmatically, so :focus-visible may not trigger in all\n * browsers — :focus-within on the host ensures the ring is always visible.\n */\n .slide-group:focus-visible,\n .slide-group:focus {\n outline: var(--hx-focus-ring-width) solid var(--hx-focus-ring-color);\n outline-offset: var(--hx-focus-ring-offset);\n }\n `,\n ];\n\n /**\n * The 0-based index of this slide within the carousel. Set by hx-carousel.\n * @attr slide-index\n */\n @property({ type: Number, attribute: 'slide-index' })\n slideIndex = 0;\n\n /**\n * Total number of slides in the carousel. Set by hx-carousel.\n * @attr total-slides\n */\n @property({ type: Number, attribute: 'total-slides' })\n totalSlides = 0;\n\n override render() {\n const label = `Slide ${this.slideIndex + 1} of ${this.totalSlides}`;\n return html`\n <div class=\"slide-group\" role=\"group\" aria-label=${label} tabindex=\"-1\">\n <slot></slot>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'hx-carousel-item': HelixCarouselItem;\n }\n}\n"],"names":["helixCarouselStyles","css","_svgChevronLeft","html","_svgChevronUp","_svgChevronRight","_svgChevronDown","_svgPlay","_svgPause","HelixCarousel","LitElement","e","_a","slot","items","el","item","i","slideWidth","index","next","nextIndex","prevIndex","diff","threshold","touch","slideSize","offset","nothing","count","dots","_","classMap","tokenStyles","__decorateClass","property","state","customElement","HelixCarouselItem","label"],"mappings":";;;;AAEO,MAAMA,IAAsBC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;ACOnC,MAAMC,IAAkBC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAalBC,IAAgBD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAahBE,IAAmBF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAanBG,IAAkBH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAalBI,IAAWJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAWXK,IAAYL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAwCX,IAAMM,IAAN,cAA4BC,EAAW;AAAA,EAAvC,cAAA;AAAA,UAAA,GAAA,SAAA,GASL,KAAA,QAAQ,YAOR,KAAA,OAAO,IAQP,KAAA,WAAW,IAOX,KAAA,mBAAmB,KAOnB,KAAA,gBAAgB,GAOhB,KAAA,gBAAgB,GAOhB,KAAA,cAAyC,cAOzC,KAAA,gBAAgB,IAOhB,KAAA,iBAAiB,kBAOjB,KAAA,iBAAiB,cAOjB,KAAA,qBAAqB,kBAOrB,KAAA,oBAAoB,iBAMX,KAAQ,gBAAgB,GAKxB,KAAQ,UAA+B,CAAA,GAKvC,KAAQ,aAAa,IAKrB,KAAQ,YAAY,IACpB,KAAQ,cAAc,IAM/B,KAAQ,iBAAwD,MAKhE,KAAQ,iBAAiB,IAKzB,KAAQ,OAA8B,MAKtC,KAAQ,aAAa,IAKrB,KAAQ,aAAa,IAOrB,KAAQ,kBAAkB,GAK1B,KAAQ,cAAc,IAKtB,KAAQ,aAAa,IAKrB,KAAQ,mBAAmB,GAK3B,KAAQ,cAAc,IA2HtB,KAAQ,gBAAgB,MAAY;AAClC,WAAK,cAAc,IACf,KAAK,OACP,KAAK,KAAK,KAAK,gBAAgB,KAAK,aAAa,IACxC,KAAK,gBAAgB,KAAK,YACnC,KAAK,KAAK,KAAK,gBAAgB,KAAK,aAAa,IAEjD,KAAK,KAAK,CAAC;AAAA,IAEf,GA0CA,KAAQ,sBAAsB,CAACC,MAAiC;AAC9D,WAAK,iBAAiBA,EAAE,SACpB,KAAK,iBACP,KAAK,cAAA,IACI,KAAK,YAAY,CAAC,KAAK,cAAc,CAAC,KAAK,cACpD,KAAK,eAAA;AAAA,IAET,GAMA,KAAQ,oBAAoB,MAAY;AACtC,WAAK,aAAa,IAClB,KAAK,eAAA;AAAA,IACP,GAMA,KAAQ,oBAAoB,MAAY;AACtC,WAAK,aAAa,IACb,KAAK,cACR,KAAK,gBAAA;AAAA,IAET,GAMA,KAAQ,iBAAiB,MAAY;AACnC,WAAK,aAAa,IAClB,KAAK,eAAA;AAAA,IACP,GAMA,KAAQ,kBAAkB,MAAY;AACpC,WAAK,aAAa,IACb,KAAK,cACR,KAAK,gBAAA;AAAA,IAET,GAMA,KAAQ,iBAAiB,CAACA,MAA2B;AACnD,MAAI,KAAK,gBAAgB,eACnBA,EAAE,QAAQ,eACZA,EAAE,eAAA,GACF,KAAK,SAAA,KACIA,EAAE,QAAQ,iBACnBA,EAAE,eAAA,GACF,KAAK,KAAA,KAGHA,EAAE,QAAQ,aACZA,EAAE,eAAA,GACF,KAAK,SAAA,KACIA,EAAE,QAAQ,gBACnBA,EAAE,eAAA,GACF,KAAK,KAAA,IAILA,EAAE,QAAQ,UACZA,EAAE,eAAA,GACF,KAAK,KAAK,CAAC,KACFA,EAAE,QAAQ,UACnBA,EAAE,eAAA,GACF,KAAK,KAAK,KAAK,QAAQ,SAAS,CAAC;AAAA,IAErC;AAAA,EAAA;AAAA;AAAA,EAzPS,oBAA0B;AACjC,UAAM,kBAAA,GACN,KAAK,OAAO,OAAO,WAAW,kCAAkC,GAChE,KAAK,iBAAiB,KAAK,KAAK,SAChC,KAAK,KAAK,iBAAiB,UAAU,KAAK,mBAAmB,GAE7D,KAAK,iBAAiB,cAAc,KAAK,iBAAiB,GAC1D,KAAK,iBAAiB,cAAc,KAAK,iBAAiB,GAC1D,KAAK,iBAAiB,WAAW,KAAK,cAAc,GACpD,KAAK,iBAAiB,YAAY,KAAK,eAAe,GACtD,KAAK,iBAAiB,WAAW,KAAK,cAAc;AAAA,EAEtD;AAAA,EAES,uBAA6B;;AACpC,UAAM,qBAAA,IACNC,IAAA,KAAK,SAAL,QAAAA,EAAW,oBAAoB,UAAU,KAAK,sBAC9C,KAAK,cAAA,GACL,KAAK,oBAAoB,cAAc,KAAK,iBAAiB,GAC7D,KAAK,oBAAoB,cAAc,KAAK,iBAAiB,GAC7D,KAAK,oBAAoB,WAAW,KAAK,cAAc,GACvD,KAAK,oBAAoB,YAAY,KAAK,eAAe,GACzD,KAAK,oBAAoB,WAAW,KAAK,cAAc;AAAA,EACzD;AAAA,EAES,eAAqB;AAC5B,SAAK,YAAA,GACD,KAAK,YAAY,CAAC,KAAK,kBACzB,KAAK,eAAA;AAAA,EAET;AAAA;AAAA,EAIQ,cAAoB;;AAC1B,UAAMC,KAAOD,IAAA,KAAK,eAAL,gBAAAA,EAAiB,cAA+B;AAC7D,QAAI,CAACC,EAAM;AAEX,UAAMC,IAAQD,EACX,iBAAiB,EAAE,SAAS,GAAA,CAAM,EAClC,OAAO,CAACE,MAAOA,EAAG,QAAQ,YAAA,MAAkB,kBAAkB;AAEjE,SAAK,UAAUD,GAGfA,EAAM,QAAQ,CAACE,GAAMC,MAAM;AACzB,MAAAD,EAAK,aAAaC,GAClBD,EAAK,cAAcF,EAAM;AACzB,YAAMI,IAAa,GAAG,MAAM,KAAK,aAAa;AAC7C,MAAAF,EAAqB,MAAM,YAAY,8BAA8BE,CAAU;AAAA,IAClF,CAAC,GAGG,KAAK,iBAAiBJ,EAAM,WAC9B,KAAK,gBAAgB,KAAK,IAAI,GAAGA,EAAM,SAAS,CAAC;AAAA,EAErD;AAAA,EAEQ,oBAA0B;AAChC,SAAK,YAAA;AAAA,EACP;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAY,YAAoB;AAC9B,WAAO,KAAK,IAAI,GAAG,KAAK,QAAQ,SAAS,KAAK,aAAa;AAAA,EAC7D;AAAA,EAEA,KAAKK,GAAqB;AACxB,QAAI,KAAK,QAAQ,WAAW,EAAG;AAE/B,QAAIC,IAAOD;AAOX,IANI,KAAK,OACPC,KAASD,IAAQ,KAAK,QAAQ,SAAU,KAAK,QAAQ,UAAU,KAAK,QAAQ,SAE5EC,IAAO,KAAK,IAAI,GAAG,KAAK,IAAID,GAAO,KAAK,SAAS,CAAC,GAGhDC,MAAS,KAAK,kBAElB,KAAK,gBAAgBA,GACrB,KAAK,YAAY,SAASA,IAAO,CAAC,OAAO,KAAK,QAAQ,MAAM,IAC5D,KAAK;AAAA,MACH,IAAI,YAAY,mBAAmB;AAAA,QACjC,SAAS;AAAA,QACT,UAAU;AAAA,QACV,QAAQ,EAAE,OAAOA,GAAM,OAAO,KAAK,QAAQA,CAAI,EAAA;AAAA,MAAE,CAClD;AAAA,IAAA;AAAA,EAEL;AAAA,EAEA,OAAa;AACX,UAAMC,IAAY,KAAK,gBAAgB,KAAK;AAC5C,IAAI,CAAC,KAAK,QAAQA,IAAY,KAAK,cAGnC,KAAK,cAAc,IACnB,KAAK,KAAKA,CAAS;AAAA,EACrB;AAAA,EAEA,WAAiB;AACf,UAAMC,IAAY,KAAK,gBAAgB,KAAK;AAC5C,IAAI,CAAC,KAAK,QAAQA,IAAY,MAG9B,KAAK,cAAc,IACnB,KAAK,KAAKA,CAAS;AAAA,EACrB;AAAA,EAmBQ,iBAAuB;AAC7B,IAAI,KAAK,mBAAmB,SAC5B,KAAK,aAAa,IAClB,KAAK,iBAAiB,YAAY,KAAK,eAAe,KAAK,gBAAgB;AAAA,EAC7E;AAAA,EAEQ,gBAAsB;AAC5B,IAAI,KAAK,mBAAmB,SAC1B,cAAc,KAAK,cAAc,GACjC,KAAK,iBAAiB,OAExB,KAAK,aAAa;AAAA,EACpB;AAAA,EAEQ,kBAAwB;AAC9B,IAAI,KAAK,aACP,KAAK,cAAA,IACK,KAAK,kBACf,KAAK,eAAA;AAAA,EAET;AAAA,EAEQ,iBAAuB;AAC7B,IAAI,CAAC,KAAK,cAAc,KAAK,mBAAmB,SAChD,cAAc,KAAK,cAAc,GACjC,KAAK,iBAAiB;AAAA,EACxB;AAAA,EAEQ,kBAAwB;AAC9B,IAAI,CAAC,KAAK,YAAY,CAAC,KAAK,cAAc,KAAK,kBAC3C,KAAK,mBAAmB,SAC5B,KAAK,iBAAiB,YAAY,KAAK,eAAe,KAAK,gBAAgB;AAAA,EAC7E;AAAA;AAAA,EA2FQ,iBAAiBX,GAAqB;AAC5C,IAAK,KAAK,kBACV,KAAK,cAAc,IACnB,KAAK,aAAa,IAClB,KAAK,kBAAkB,KAAK,gBAAgB,eAAeA,EAAE,UAAUA,EAAE,SACxEA,EAAE,cAA8B,MAAM,SAAS,YAChDA,EAAE,eAAA;AAAA,EACJ;AAAA,EAEQ,gBAAgBA,GAAqB;AAC3C,QAAI,CAAC,KAAK,YAAa;AAEvB,UAAMY,KADU,KAAK,gBAAgB,eAAeZ,EAAE,UAAUA,EAAE,WAC3C,KAAK;AAC5B,IAAI,KAAK,IAAIY,CAAI,IAAI,MACnB,KAAK,aAAa;AAAA,EAEtB;AAAA,EAEQ,eAAeZ,GAAqB;AAC1C,QAAI,CAAC,KAAK,YAAa;AAEvB,UAAMY,KADU,KAAK,gBAAgB,eAAeZ,EAAE,UAAUA,EAAE,WAC3C,KAAK,iBACtBa,IAAY;AAClB,IAAI,KAAK,eACHD,IAAOC,IACT,KAAK,SAAA,IACID,IAAO,CAACC,KACjB,KAAK,KAAA,IAGT,KAAK,cAAc,IACnB,KAAK,aAAa,IACjBb,EAAE,cAA8B,MAAM,SAAS;AAAA,EAClD;AAAA;AAAA,EAIQ,kBAAkBA,GAAqB;AAC7C,QAAI,CAAC,KAAK,cAAe;AACzB,UAAMc,IAAQd,EAAE,QAAQ,CAAC;AACzB,IAAKc,MACL,KAAK,cAAc,IACnB,KAAK,cAAc,IACnB,KAAK,mBAAmB,KAAK,gBAAgB,eAAeA,EAAM,UAAUA,EAAM;AAAA,EACpF;AAAA,EAEQ,iBAAiBd,GAAqB;AAC5C,QAAI,CAAC,KAAK,YAAa;AACvB,UAAMc,IAAQd,EAAE,QAAQ,CAAC;AACzB,QAAI,CAACc,EAAO;AAEZ,UAAMF,KADU,KAAK,gBAAgB,eAAeE,EAAM,UAAUA,EAAM,WACnD,KAAK;AAC5B,IAAI,KAAK,IAAIF,CAAI,IAAI,MACnB,KAAK,cAAc;AAAA,EAEvB;AAAA,EAEQ,gBAAgBZ,GAAqB;AAC3C,QAAI,CAAC,KAAK,YAAa;AACvB,UAAMc,IAAQd,EAAE,eAAe,CAAC;AAChC,QAAI,CAACc,EAAO;AAEZ,UAAMF,KADU,KAAK,gBAAgB,eAAeE,EAAM,UAAUA,EAAM,WACnD,KAAK,kBACtBD,IAAY;AAClB,IAAI,KAAK,gBACHD,IAAOC,IACT,KAAK,SAAA,IACID,IAAO,CAACC,KACjB,KAAK,KAAA,IAGT,KAAK,cAAc,IACnB,KAAK,cAAc;AAAA,EACrB;AAAA,EAEQ,YAAYL,GAAqB;AACvC,SAAK,cAAc,IACnB,KAAK,KAAKA,CAAK;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAY,kBAA0B;AACpC,UAAMO,IAAY,MAAM,KAAK,eACvBC,IAAS,KAAK,gBAAgBD;AACpC,WAAO,KAAK,gBAAgB,eACxB,eAAeC,CAAM,OACrB,eAAeA,CAAM;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAY,aAAsB;AAChC,WAAO,KAAK,QAAQ,KAAK,gBAAgB;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAY,aAAsB;AAChC,WAAO,KAAK,QAAQ,KAAK,gBAAgB,KAAK;AAAA,EAChD;AAAA;AAAA,EAIQ,oBAAoB;AAC1B,WAAOxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAOc,KAAK,cAAc;AAAA,wBACpB,CAAC,KAAK,UAAU;AAAA,qBACnB,MAAM,KAAK,SAAA,CAAU;AAAA;AAAA,cAE5B,KAAK,iBAAiB;AAAA;AAAA;AAAA,UAG1B,KAAK,WACHA;AAAA;AAAA;AAAA;AAAA;AAAA,6BAKiB,KAAK,aAAa,KAAK,qBAAqB,KAAK,iBAAiB;AAAA,yBACtE,MAAM,KAAK,gBAAA,CAAiB;AAAA;AAAA,kBAEnC,KAAK,aAAa,KAAK,qBAAqB,KAAK,iBAAiB;AAAA;AAAA,gBAGxEyB,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAMM,KAAK,cAAc;AAAA,wBACpB,CAAC,KAAK,UAAU;AAAA,qBACnB,MAAM,KAAK,KAAA,CAAM;AAAA;AAAA,cAExB,KAAK,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKlC;AAAA,EAEQ,oBAAoB;AAC1B,UAAMC,IAAQ,KAAK,QAAQ;AAC3B,QAAIA,KAAS,EAAG,QAAOD;AACvB,UAAME,IAAO,MAAM,KAAK,EAAE,QAAQD,KAAS,CAACE,GAAG,MAAM,CAAC;AACtD,WAAO5B;AAAA;AAAA;AAAA,YAGC2B,EAAK;AAAA,MACL,CAACb,MAAMd;AAAA;AAAA,wBAEK6B,EAAS;AAAA,QACf,mBAAmB;AAAA,QACnB,aAAaf,MAAM,KAAK;AAAA,MAAA,CACzB,CAAC;AAAA;AAAA;AAAA,oCAGkBA,IAAI,CAAC,OAAOY,CAAK;AAAA,+BACtBZ,MAAM,KAAK,gBAAgB,SAASW,CAAO;AAAA,yBACjD,MAAM,KAAK,YAAYX,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAKvC;AAAA;AAAA;AAAA;AAAA,EAIT;AAAA,EAEQ,kBAAkB;AACxB,WAAO,KAAK,gBAAgB,eAAef,IAAkBE;AAAA,EAC/D;AAAA,EAEQ,kBAAkB;AACxB,WAAO,KAAK,gBAAgB,eAAeC,IAAmBC;AAAA,EAChE;AAAA,EAEQ,kBAAkB;AACxB,WAAOC;AAAA,EACT;AAAA,EAEQ,mBAAmB;AACzB,WAAOC;AAAA,EACT;AAAA;AAAA,EAIS,SAAS;AAChB,WAAOL;AAAA;AAAA;AAAA;AAAA;AAAA,qBAKU,KAAK,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAMT,KAAK,cAAc,WAAW,KAAK;AAAA;AAAA;AAAA,YAG7C,KAAK,SAAS;AAAA;AAAA,UAEhB,KAAK,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA,yBAKT,KAAK,gBAAgB;AAAA,yBACrB,KAAK,eAAe;AAAA,uBACtB,KAAK,cAAc;AAAA,0BAChB,KAAK,cAAc;AAAA,0BACnB,KAAK,iBAAiB;AAAA,yBACvB,KAAK,gBAAgB;AAAA,wBACtB,KAAK,eAAe;AAAA;AAAA,mDAEO,KAAK,eAAe;AAAA,kCACrC,KAAK,iBAAiB;AAAA;AAAA;AAAA;AAAA,UAI9C,KAAK,mBAAmB;AAAA;AAAA;AAAA,EAGhC;AACF;AArpBaM,EACK,SAAS,CAACwB,GAAajC,CAAmB;AAQ1DkC,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,QAAQ,SAAS,IAAM;AAAA,GAR9B1B,EASX,WAAA,SAAA,CAAA;AAOAyB,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,SAAS,SAAS,IAAM;AAAA,GAf/B1B,EAgBX,WAAA,QAAA,CAAA;AAQAyB,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,SAAS,SAAS,IAAM;AAAA,GAvB/B1B,EAwBX,WAAA,YAAA,CAAA;AAOAyB,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,QAAQ,WAAW,qBAAqB;AAAA,GA9B/C1B,EA+BX,WAAA,oBAAA,CAAA;AAOAyB,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,QAAQ,WAAW,mBAAmB;AAAA,GArC7C1B,EAsCX,WAAA,iBAAA,CAAA;AAOAyB,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,QAAQ,WAAW,mBAAmB;AAAA,GA5C7C1B,EA6CX,WAAA,iBAAA,CAAA;AAOAyB,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,QAAQ,SAAS,IAAM;AAAA,GAnD9B1B,EAoDX,WAAA,eAAA,CAAA;AAOAyB,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,SAAS,WAAW,kBAAkB,SAAS,IAAM;AAAA,GA1D5D1B,EA2DX,WAAA,iBAAA,CAAA;AAOAyB,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,QAAQ,WAAW,oBAAoB;AAAA,GAjE9C1B,EAkEX,WAAA,kBAAA,CAAA;AAOAyB,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,QAAQ,WAAW,oBAAoB;AAAA,GAxE9C1B,EAyEX,WAAA,kBAAA,CAAA;AAOAyB,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,QAAQ,WAAW,wBAAwB;AAAA,GA/ElD1B,EAgFX,WAAA,sBAAA,CAAA;AAOAyB,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,QAAQ,WAAW,uBAAuB;AAAA,GAtFjD1B,EAuFX,WAAA,qBAAA,CAAA;AAMiByB,EAAA;AAAA,EAAhBE,EAAA;AAAM,GA7FI3B,EA6FM,WAAA,iBAAA,CAAA;AAKAyB,EAAA;AAAA,EAAhBE,EAAA;AAAM,GAlGI3B,EAkGM,WAAA,WAAA,CAAA;AAKAyB,EAAA;AAAA,EAAhBE,EAAA;AAAM,GAvGI3B,EAuGM,WAAA,cAAA,CAAA;AAKAyB,EAAA;AAAA,EAAhBE,EAAA;AAAM,GA5GI3B,EA4GM,WAAA,aAAA,CAAA;AACAyB,EAAA;AAAA,EAAhBE,EAAA;AAAM,GA7GI3B,EA6GM,WAAA,eAAA,CAAA;AA7GNA,IAANyB,EAAA;AAAA,EADNG,EAAc,aAAa;AAAA,GACf5B,CAAA;;;;;;AClGN,IAAM6B,IAAN,cAAgC5B,EAAW;AAAA,EAA3C,cAAA;AAAA,UAAA,GAAA,SAAA,GAmCL,KAAA,aAAa,GAOb,KAAA,cAAc;AAAA,EAAA;AAAA,EAEL,SAAS;AAChB,UAAM6B,IAAQ,SAAS,KAAK,aAAa,CAAC,OAAO,KAAK,WAAW;AACjE,WAAOpC;AAAA,yDAC8CoC,CAAK;AAAA;AAAA;AAAA;AAAA,EAI5D;AACF;AApDaD,EACK,SAAS;AAAA,EACvBL;AAAA,EACAhC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAyBF;AAOAiC,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,QAAQ,WAAW,eAAe;AAAA,GAlCzCG,EAmCX,WAAA,cAAA,CAAA;AAOAJ,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,QAAQ,WAAW,gBAAgB;AAAA,GAzC1CG,EA0CX,WAAA,eAAA,CAAA;AA1CWA,IAANJ,EAAA;AAAA,EADNG,EAAc,kBAAkB;AAAA,GACpBC,CAAA;"}
@@ -1 +1 @@
1
- {"version":3,"file":"hx-checkbox-BMayOpAM.js","sources":["../../src/components/hx-checkbox/hx-checkbox.styles.ts","../../src/components/hx-checkbox/hx-checkbox.ts"],"sourcesContent":["import { css } from 'lit';\n\nexport const helixCheckboxStyles = css`\n :host {\n display: block;\n }\n\n :host([disabled]) {\n opacity: var(--hx-opacity-disabled, 0.5);\n pointer-events: none;\n }\n\n * {\n box-sizing: border-box;\n }\n\n .checkbox {\n display: flex;\n flex-direction: column;\n gap: var(--hx-space-1, 0.25rem);\n font-family: var(--hx-font-family-sans, sans-serif);\n }\n\n /* ─── Control (checkbox + label row) ─── */\n\n .checkbox__control {\n display: inline-flex;\n align-items: flex-start;\n gap: var(--hx-space-2, 0.5rem);\n cursor: pointer;\n }\n\n :host([disabled]) .checkbox__control {\n cursor: not-allowed;\n }\n\n /* ─── Hidden Native Input ─── */\n\n .checkbox__input {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n border: 0;\n }\n\n /* ─── Visual Checkbox ─── */\n\n .checkbox__box {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: var(--hx-checkbox-size, var(--hx-size-5, 1.25rem));\n height: var(--hx-checkbox-size, var(--hx-size-5, 1.25rem));\n border: var(--hx-border-width-medium, 2px) solid\n var(--hx-checkbox-border-color, var(--hx-color-neutral-300, #ced4da));\n border-radius: var(--hx-checkbox-border-radius, var(--hx-border-radius-sm, 0.25rem));\n background-color: var(--hx-checkbox-bg, var(--hx-color-neutral-0, #ffffff));\n transition:\n background-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 margin-top: var(--hx-space-px, 1px);\n }\n\n /* ─── Focus Ring ─── */\n\n .checkbox__input:focus-visible ~ .checkbox__box {\n outline: var(--hx-focus-ring-width, 2px) solid\n var(--hx-checkbox-focus-ring-color, var(--hx-focus-ring-color, #2563eb));\n outline-offset: var(--hx-focus-ring-offset, 2px);\n }\n\n /* ─── Checked State ─── */\n\n .checkbox--checked .checkbox__box {\n background-color: var(--hx-checkbox-checked-bg, var(--hx-color-primary-500, #2563eb));\n border-color: var(--hx-checkbox-checked-border-color, var(--hx-color-primary-500, #2563eb));\n }\n\n /* ─── Indeterminate State ─── */\n\n .checkbox--indeterminate .checkbox__box {\n background-color: var(--hx-checkbox-checked-bg, var(--hx-color-primary-500, #2563eb));\n border-color: var(--hx-checkbox-checked-border-color, var(--hx-color-primary-500, #2563eb));\n }\n\n /* ─── Error State ─── */\n\n .checkbox--error .checkbox__box {\n border-color: var(--hx-checkbox-error-color, var(--hx-color-error-500, #dc3545));\n }\n\n .checkbox--error.checkbox--checked .checkbox__box,\n .checkbox--error.checkbox--indeterminate .checkbox__box {\n background-color: var(--hx-checkbox-error-color, var(--hx-color-error-500, #dc3545));\n border-color: var(--hx-checkbox-error-color, var(--hx-color-error-500, #dc3545));\n }\n\n /* ─── Hover ─── */\n\n /* P1-03: use component token so consumer overrides of --hx-checkbox-border-color work on hover */\n .checkbox__control:hover .checkbox__box {\n border-color: var(\n --hx-checkbox-hover-border-color,\n var(--hx-checkbox-border-color, var(--hx-color-primary-500, #2563eb))\n );\n }\n\n .checkbox--checked .checkbox__control:hover .checkbox__box {\n filter: brightness(var(--hx-filter-brightness-hover, 0.9));\n }\n\n .checkbox--error .checkbox__control:hover .checkbox__box {\n border-color: var(--hx-checkbox-error-color, var(--hx-color-error-500, #dc3545));\n }\n\n /* ─── Checkmark Icon ─── */\n\n .checkbox__icon {\n display: none;\n width: calc(var(--hx-checkbox-size, var(--hx-size-5, 1.25rem)) * 0.65);\n height: calc(var(--hx-checkbox-size, var(--hx-size-5, 1.25rem)) * 0.65);\n fill: none;\n stroke: var(--hx-checkbox-checkmark-color, var(--hx-color-neutral-0, #ffffff));\n stroke-width: 2.5;\n stroke-linecap: round;\n stroke-linejoin: round;\n }\n\n .checkbox--checked .checkbox__icon--check {\n display: block;\n }\n\n .checkbox--indeterminate .checkbox__icon--indeterminate {\n display: block;\n }\n\n /* ─── Label ─── */\n\n .checkbox__label {\n font-size: var(--hx-font-size-sm, 0.875rem);\n font-weight: var(--hx-font-weight-medium, 500);\n color: var(--hx-checkbox-label-color, var(--hx-color-neutral-700, #343a40));\n line-height: var(--hx-line-height-normal, 1.5);\n user-select: none;\n -webkit-user-select: none;\n }\n\n .checkbox__required-marker {\n color: var(--hx-checkbox-error-color, var(--hx-color-error-text, #b91c1c));\n font-weight: var(--hx-font-weight-bold, 700);\n }\n\n /* ─── Help Text & Error Messages ─── */\n\n .checkbox__help-text {\n font-size: var(--hx-font-size-xs, 0.75rem);\n color: var(--hx-checkbox-help-text-color, var(--hx-color-neutral-500, #6c757d));\n line-height: var(--hx-line-height-normal, 1.5);\n padding-left: calc(\n var(--hx-checkbox-size, var(--hx-size-5, 1.25rem)) + var(--hx-space-2, 0.5rem)\n );\n }\n\n .checkbox__error {\n font-size: var(--hx-font-size-xs, 0.75rem);\n color: var(--hx-checkbox-error-color, var(--hx-color-error-text, #b91c1c));\n line-height: var(--hx-line-height-normal, 1.5);\n padding-left: calc(\n var(--hx-checkbox-size, var(--hx-size-5, 1.25rem)) + var(--hx-space-2, 0.5rem)\n );\n }\n\n /* ─── Size Variants ─── */\n\n :host([hx-size='sm']) {\n --hx-checkbox-size: var(--hx-size-4, 1rem);\n }\n\n :host([hx-size='sm']) .checkbox__label {\n font-size: var(--hx-font-size-xs, 0.75rem);\n }\n\n :host([hx-size='sm']) .checkbox__help-text,\n :host([hx-size='sm']) .checkbox__error {\n font-size: var(--hx-font-size-xs, 0.75rem);\n padding-left: calc(var(--hx-size-4, 1rem) + var(--hx-space-2, 0.5rem));\n }\n\n :host([hx-size='lg']) {\n --hx-checkbox-size: var(--hx-size-6, 1.5rem);\n }\n\n :host([hx-size='lg']) .checkbox__label {\n font-size: var(--hx-font-size-base, 1rem);\n }\n\n :host([hx-size='lg']) .checkbox__help-text,\n :host([hx-size='lg']) .checkbox__error {\n font-size: var(--hx-font-size-sm, 0.875rem);\n padding-left: calc(var(--hx-size-6, 1.5rem) + var(--hx-space-2, 0.5rem));\n }\n\n /* ─── Reduced Motion ─── */\n\n @media (prefers-reduced-motion: reduce) {\n .checkbox__box {\n transition: none;\n }\n }\n`;\n","import { LitElement, html, nothing } from 'lit';\nimport { customElement, property, query, state } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { live } from 'lit/directives/live.js';\nimport { tokenStyles } from '@helixui/tokens/lit';\nimport { helixCheckboxStyles } from './hx-checkbox.styles.js';\n\n// P2-05: monotonic counter — collision-free, deterministic, SSR-safe\nlet _checkboxCounter = 0;\n\n/**\n * A checkbox component with label, validation, and form association.\n *\n * @summary Form-associated checkbox with built-in label, error, and help text.\n *\n * @tag hx-checkbox\n *\n * @slot - Custom label content (overrides the label property). Rich HTML allowed — Drupal can include links in consent labels.\n * @slot error - Custom error content (overrides the error property).\n * @slot help-text - Custom help text content (overrides the helpText property).\n *\n * @fires {CustomEvent<{checked: boolean, value: string}>} hx-change - Dispatched when the checkbox is toggled.\n *\n * @csspart checkbox - The visual checkbox element.\n * @csspart checkmark - The SVG checkmark icon inside the checkbox.\n * @csspart label - The label element.\n * @csspart help-text - The help text container.\n * @csspart error - The error message container.\n * @csspart control - The wrapper around checkbox and label.\n *\n * @cssprop [--hx-checkbox-size=var(--hx-size-5, 1.25rem)] - Checkbox dimensions.\n * @cssprop [--hx-checkbox-bg=var(--hx-color-neutral-0, #ffffff)] - Unchecked background color.\n * @cssprop [--hx-checkbox-border-color=var(--hx-color-neutral-300, #ced4da)] - Checkbox border color.\n * @cssprop [--hx-checkbox-border-radius=var(--hx-border-radius-sm, 0.25rem)] - Checkbox border radius.\n * @cssprop [--hx-checkbox-checked-bg=var(--hx-color-primary-500, #2563EB)] - Checked background color.\n * @cssprop [--hx-checkbox-checked-border-color=var(--hx-color-primary-500, #2563EB)] - Checked border color.\n * @cssprop [--hx-checkbox-checkmark-color=var(--hx-color-neutral-0, #ffffff)] - Checkmark color.\n * @cssprop [--hx-checkbox-focus-ring-color=var(--hx-focus-ring-color, #2563EB)] - Focus ring color.\n * @cssprop [--hx-checkbox-label-color=var(--hx-color-neutral-700, #343a40)] - Label text color.\n * @cssprop [--hx-checkbox-help-text-color=var(--hx-color-neutral-500, #6c757d)] - Help text color.\n * @cssprop [--hx-checkbox-hover-border-color=var(--hx-checkbox-border-color)] - Border color on hover.\n * @cssprop [--hx-checkbox-error-color=var(--hx-color-error-500, #dc3545)] - Error state color.\n */\n@customElement('hx-checkbox')\nexport class HelixCheckbox extends LitElement {\n static override styles = [tokenStyles, helixCheckboxStyles];\n\n // P0-02: observe aria-label on host to forward to inner input\n static override get observedAttributes(): string[] {\n return [...(super.observedAttributes ?? []), 'aria-label'];\n }\n\n override attributeChangedCallback(name: string, old: string | null, next: string | null): void {\n super.attributeChangedCallback(name, old, next);\n if (name === 'aria-label') this.requestUpdate();\n }\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 // ─── Properties ───\n\n /**\n * Whether the checkbox is checked.\n * @attr checked\n */\n @property({ type: Boolean, reflect: true })\n checked = false;\n\n /**\n * Whether the checkbox is in an indeterminate state (e.g., for \"select all\" patterns).\n * @attr indeterminate\n */\n @property({ type: Boolean, reflect: true })\n indeterminate = false;\n\n /**\n * Whether the checkbox is disabled.\n * @attr disabled\n */\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n /**\n * Whether the checkbox is required for form submission.\n * @attr required\n */\n @property({ type: Boolean, reflect: true })\n required = false;\n\n /**\n * The name of the checkbox, used for form submission.\n * @attr name\n */\n @property({ type: String })\n name = '';\n\n /**\n * The value submitted when the checkbox is checked.\n * @attr value\n */\n @property({ type: String })\n value = 'on';\n\n /**\n * The visible label text for the checkbox.\n * @attr label\n */\n @property({ type: String })\n label = '';\n\n /**\n * Error message to display. When set, the checkbox enters an error state.\n * @attr error\n */\n @property({ type: String })\n error = '';\n\n /**\n * Help text displayed below the checkbox for guidance.\n * @attr help-text\n */\n @property({ type: String, attribute: 'help-text' })\n helpText = '';\n\n /**\n * The size of the checkbox.\n * @attr hx-size\n */\n @property({ type: String, attribute: 'hx-size', reflect: true })\n size: 'sm' | 'md' | 'lg' = 'md';\n\n @query('.checkbox__input')\n private _inputEl!: HTMLInputElement;\n\n @state() private _hasErrorSlot = false;\n\n // ─── Slot Handlers ───\n\n private _handleErrorSlotChange(e: Event): void {\n const slot = e.target as HTMLSlotElement;\n this._hasErrorSlot = slot.assignedNodes({ flatten: true }).length > 0;\n }\n\n // ─── Lifecycle ───\n\n override updated(changedProperties: Map<string, unknown>): void {\n super.updated(changedProperties);\n if (changedProperties.has('checked') || changedProperties.has('value')) {\n this._internals.setFormValue(this.checked ? this.value : null);\n this._updateValidity();\n }\n if (changedProperties.has('required')) {\n this._updateValidity();\n }\n }\n\n // ─── Form Integration ───\n\n /** Returns the associated form element, if any. */\n get form(): HTMLFormElement | null {\n return this._internals.form;\n }\n\n /** Returns the validation message. */\n get validationMessage(): string {\n return this._internals.validationMessage;\n }\n\n /** Returns the ValidityState object. */\n get validity(): ValidityState {\n return this._internals.validity;\n }\n\n /** Checks whether the checkbox satisfies its constraints. */\n checkValidity(): boolean {\n return this._internals.checkValidity();\n }\n\n /** Reports validity and shows the browser's constraint validation UI. */\n reportValidity(): boolean {\n return this._internals.reportValidity();\n }\n\n private _updateValidity(): void {\n if (this.required && !this.checked) {\n this._internals.setValidity(\n { valueMissing: true },\n this.error || 'This field is required.',\n this._inputEl ?? undefined,\n );\n } else {\n this._internals.setValidity({});\n }\n }\n\n /** Called by the form when it resets. */\n formResetCallback(): void {\n this.checked = false;\n this.indeterminate = false;\n this._internals.setFormValue(null);\n }\n\n /** Called when the form restores state (e.g., back/forward navigation). */\n formStateRestoreCallback(state: string | File | FormData | null, _reason: string): void {\n this.checked = typeof state === 'string' && state === this.value;\n }\n\n /** Called when a parent fieldset is disabled/enabled. */\n formDisabledCallback(disabled: boolean): void {\n this.disabled = disabled;\n }\n\n // ─── Event Handling ───\n\n private _handleChange(): void {\n if (this.disabled) return;\n\n this.indeterminate = false;\n this.checked = !this.checked;\n\n this._internals.setFormValue(this.checked ? this.value : null);\n this._updateValidity();\n\n /**\n * Dispatched when the checkbox is toggled.\n * @event hx-change\n */\n this.dispatchEvent(\n new CustomEvent('hx-change', {\n bubbles: true,\n composed: true,\n detail: { checked: this.checked, value: this.value },\n }),\n );\n }\n\n private _handleKeyDown(e: KeyboardEvent): void {\n if (e.key === ' ') {\n e.preventDefault();\n e.stopPropagation();\n this._handleChange();\n }\n }\n\n // ─── Public Methods ───\n\n /** Moves focus to the checkbox input element. */\n override focus(options?: FocusOptions): void {\n this._inputEl?.focus(options);\n }\n\n // ─── Render ───\n\n // P2-05: monotonic counter — collision-free and deterministic\n private _id = `hx-checkbox-${++_checkboxCounter}`;\n private _helpTextId = `${this._id}-help`;\n private _errorId = `${this._id}-error`;\n private _labelId = `${this._id}-label`;\n\n override render() {\n const hasError = !!this.error || this._hasErrorSlot;\n\n const containerClasses = {\n checkbox: true,\n 'checkbox--checked': this.checked,\n 'checkbox--indeterminate': this.indeterminate,\n 'checkbox--error': hasError,\n 'checkbox--disabled': this.disabled,\n 'checkbox--required': this.required,\n 'checkbox--sm': this.size === 'sm',\n 'checkbox--md': this.size === 'md',\n 'checkbox--lg': this.size === 'lg',\n };\n\n // P2-06: simplified — hasError already includes _hasErrorSlot\n const describedBy =\n [hasError ? this._errorId : null, this.helpText && !hasError ? this._helpTextId : null]\n .filter(Boolean)\n .join(' ') || undefined;\n\n // P0-02: forward aria-label from host to inner input\n const hostAriaLabel = this.getAttribute('aria-label') ?? undefined;\n\n return html`\n <div class=${classMap(containerClasses)}>\n <label part=\"control\" class=\"checkbox__control\" @click=${this._handleChange}>\n <input\n class=\"checkbox__input\"\n type=\"checkbox\"\n id=${this._id}\n .checked=${live(this.checked)}\n .indeterminate=${live(this.indeterminate)}\n ?disabled=${this.disabled}\n ?required=${this.required}\n name=${ifDefined(this.name || undefined)}\n .value=${this.value}\n aria-checked=${this.indeterminate ? 'mixed' : nothing}\n aria-invalid=${hasError ? 'true' : nothing}\n aria-describedby=${ifDefined(describedBy)}\n aria-label=${ifDefined(hostAriaLabel)}\n aria-labelledby=${ifDefined(!hostAriaLabel ? this._labelId : undefined)}\n @keydown=${this._handleKeyDown}\n @click=${(e: Event) => {\n e.preventDefault();\n e.stopPropagation();\n }}\n @change=${(e: Event) => e.stopPropagation()}\n />\n\n <span part=\"checkbox\" class=\"checkbox__box\">\n <svg\n part=\"checkmark\"\n class=\"checkbox__icon checkbox__icon--check\"\n viewBox=\"0 0 16 16\"\n aria-hidden=\"true\"\n >\n <polyline points=\"3.5 8 6.5 11 12.5 5\"></polyline>\n </svg>\n <svg\n class=\"checkbox__icon checkbox__icon--indeterminate\"\n viewBox=\"0 0 16 16\"\n aria-hidden=\"true\"\n >\n <line x1=\"4\" y1=\"8\" x2=\"12\" y2=\"8\"></line>\n </svg>\n </span>\n\n <span part=\"label\" class=\"checkbox__label\" id=${this._labelId}>\n <slot>${this.label}</slot>\n ${this.required\n ? html`<span class=\"checkbox__required-marker\" aria-hidden=\"true\">*</span>`\n : nothing}\n </span>\n </label>\n\n <!--\n P0-01: wrapper div always owns _errorId so aria-describedby works regardless\n of whether error content comes from the .error property or the named slot.\n P1-02: role=\"status\" (implicit aria-live=\"polite\") replaces role=\"alert\" +\n aria-live=\"polite\" which was semantically contradictory.\n -->\n <div\n part=\"error\"\n class=\"checkbox__error\"\n id=${this._errorId}\n role=\"status\"\n ?hidden=${!hasError}\n >\n <slot name=\"error\" @slotchange=${this._handleErrorSlotChange}> ${this.error} </slot>\n </div>\n\n ${this.helpText && !hasError\n ? html`\n <div part=\"help-text\" class=\"checkbox__help-text\" id=${this._helpTextId}>\n <slot name=\"help-text\">${this.helpText}</slot>\n </div>\n `\n : nothing}\n </div>\n `;\n }\n}\n\n/** @deprecated Use HelixCheckbox instead. */\nexport type WcCheckbox = HelixCheckbox;\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'hx-checkbox': HelixCheckbox;\n }\n}\n"],"names":["helixCheckboxStyles","css","_checkboxCounter","HelixCheckbox","LitElement","name","old","next","slot","changedProperties","state","_reason","disabled","options","_a","hasError","containerClasses","describedBy","hostAriaLabel","html","classMap","live","ifDefined","nothing","e","tokenStyles","__decorateClass","property","query","customElement"],"mappings":"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"}
1
+ {"version":3,"file":"hx-checkbox-BMayOpAM.js","sources":["../../src/components/hx-checkbox/hx-checkbox.styles.ts","../../src/components/hx-checkbox/hx-checkbox.ts"],"sourcesContent":["import { css } from 'lit';\n\nexport const helixCheckboxStyles = css`\n :host {\n display: block;\n }\n\n :host([disabled]) {\n opacity: var(--hx-opacity-disabled, 0.5);\n pointer-events: none;\n }\n\n * {\n box-sizing: border-box;\n }\n\n .checkbox {\n display: flex;\n flex-direction: column;\n gap: var(--hx-space-1, 0.25rem);\n font-family: var(--hx-font-family-sans, sans-serif);\n }\n\n /* ─── Control (checkbox + label row) ─── */\n\n .checkbox__control {\n display: inline-flex;\n align-items: flex-start;\n gap: var(--hx-space-2, 0.5rem);\n cursor: pointer;\n }\n\n :host([disabled]) .checkbox__control {\n cursor: not-allowed;\n }\n\n /* ─── Hidden Native Input ─── */\n\n .checkbox__input {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n border: 0;\n }\n\n /* ─── Visual Checkbox ─── */\n\n .checkbox__box {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: var(--hx-checkbox-size, var(--hx-size-5, 1.25rem));\n height: var(--hx-checkbox-size, var(--hx-size-5, 1.25rem));\n border: var(--hx-border-width-medium, 2px) solid\n var(--hx-checkbox-border-color, var(--hx-color-neutral-300, #ced4da));\n border-radius: var(--hx-checkbox-border-radius, var(--hx-border-radius-sm, 0.25rem));\n background-color: var(--hx-checkbox-bg, var(--hx-color-neutral-0, #ffffff));\n transition:\n background-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 margin-top: var(--hx-space-px, 1px);\n }\n\n /* ─── Focus Ring ─── */\n\n .checkbox__input:focus-visible ~ .checkbox__box {\n outline: var(--hx-focus-ring-width, 2px) solid\n var(--hx-checkbox-focus-ring-color, var(--hx-focus-ring-color, #2563eb));\n outline-offset: var(--hx-focus-ring-offset, 2px);\n }\n\n /* ─── Checked State ─── */\n\n .checkbox--checked .checkbox__box {\n background-color: var(--hx-checkbox-checked-bg, var(--hx-color-primary-500, #2563eb));\n border-color: var(--hx-checkbox-checked-border-color, var(--hx-color-primary-500, #2563eb));\n }\n\n /* ─── Indeterminate State ─── */\n\n .checkbox--indeterminate .checkbox__box {\n background-color: var(--hx-checkbox-checked-bg, var(--hx-color-primary-500, #2563eb));\n border-color: var(--hx-checkbox-checked-border-color, var(--hx-color-primary-500, #2563eb));\n }\n\n /* ─── Error State ─── */\n\n .checkbox--error .checkbox__box {\n border-color: var(--hx-checkbox-error-color, var(--hx-color-error-500, #dc3545));\n }\n\n .checkbox--error.checkbox--checked .checkbox__box,\n .checkbox--error.checkbox--indeterminate .checkbox__box {\n background-color: var(--hx-checkbox-error-color, var(--hx-color-error-500, #dc3545));\n border-color: var(--hx-checkbox-error-color, var(--hx-color-error-500, #dc3545));\n }\n\n /* ─── Hover ─── */\n\n /* P1-03: use component token so consumer overrides of --hx-checkbox-border-color work on hover */\n .checkbox__control:hover .checkbox__box {\n border-color: var(\n --hx-checkbox-hover-border-color,\n var(--hx-checkbox-border-color, var(--hx-color-primary-500, #2563eb))\n );\n }\n\n .checkbox--checked .checkbox__control:hover .checkbox__box {\n filter: brightness(var(--hx-filter-brightness-hover, 0.9));\n }\n\n .checkbox--error .checkbox__control:hover .checkbox__box {\n border-color: var(--hx-checkbox-error-color, var(--hx-color-error-500, #dc3545));\n }\n\n /* ─── Checkmark Icon ─── */\n\n .checkbox__icon {\n display: none;\n width: calc(var(--hx-checkbox-size, var(--hx-size-5, 1.25rem)) * 0.65);\n height: calc(var(--hx-checkbox-size, var(--hx-size-5, 1.25rem)) * 0.65);\n fill: none;\n stroke: var(--hx-checkbox-checkmark-color, var(--hx-color-neutral-0, #ffffff));\n stroke-width: 2.5;\n stroke-linecap: round;\n stroke-linejoin: round;\n }\n\n .checkbox--checked .checkbox__icon--check {\n display: block;\n }\n\n .checkbox--indeterminate .checkbox__icon--indeterminate {\n display: block;\n }\n\n /* ─── Label ─── */\n\n .checkbox__label {\n font-size: var(--hx-font-size-sm, 0.875rem);\n font-weight: var(--hx-font-weight-medium, 500);\n color: var(--hx-checkbox-label-color, var(--hx-color-neutral-700, #343a40));\n line-height: var(--hx-line-height-normal, 1.5);\n user-select: none;\n -webkit-user-select: none;\n }\n\n .checkbox__required-marker {\n color: var(--hx-checkbox-error-color, var(--hx-color-error-text, #b91c1c));\n font-weight: var(--hx-font-weight-bold, 700);\n }\n\n /* ─── Help Text & Error Messages ─── */\n\n .checkbox__help-text {\n font-size: var(--hx-font-size-xs, 0.75rem);\n color: var(--hx-checkbox-help-text-color, var(--hx-color-neutral-500, #6c757d));\n line-height: var(--hx-line-height-normal, 1.5);\n padding-left: calc(\n var(--hx-checkbox-size, var(--hx-size-5, 1.25rem)) + var(--hx-space-2, 0.5rem)\n );\n }\n\n .checkbox__error {\n font-size: var(--hx-font-size-xs, 0.75rem);\n color: var(--hx-checkbox-error-color, var(--hx-color-error-text, #b91c1c));\n line-height: var(--hx-line-height-normal, 1.5);\n padding-left: calc(\n var(--hx-checkbox-size, var(--hx-size-5, 1.25rem)) + var(--hx-space-2, 0.5rem)\n );\n }\n\n /* ─── Size Variants ─── */\n\n :host([hx-size='sm']) {\n --hx-checkbox-size: var(--hx-size-4, 1rem);\n }\n\n :host([hx-size='sm']) .checkbox__label {\n font-size: var(--hx-font-size-xs, 0.75rem);\n }\n\n :host([hx-size='sm']) .checkbox__help-text,\n :host([hx-size='sm']) .checkbox__error {\n font-size: var(--hx-font-size-xs, 0.75rem);\n padding-left: calc(var(--hx-size-4, 1rem) + var(--hx-space-2, 0.5rem));\n }\n\n :host([hx-size='lg']) {\n --hx-checkbox-size: var(--hx-size-6, 1.5rem);\n }\n\n :host([hx-size='lg']) .checkbox__label {\n font-size: var(--hx-font-size-base, 1rem);\n }\n\n :host([hx-size='lg']) .checkbox__help-text,\n :host([hx-size='lg']) .checkbox__error {\n font-size: var(--hx-font-size-sm, 0.875rem);\n padding-left: calc(var(--hx-size-6, 1.5rem) + var(--hx-space-2, 0.5rem));\n }\n\n /* ─── Reduced Motion ─── */\n\n @media (prefers-reduced-motion: reduce) {\n .checkbox__box {\n transition: none;\n }\n }\n`;\n","import { LitElement, html, nothing } from 'lit';\nimport { customElement, property, query, state } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { live } from 'lit/directives/live.js';\nimport { tokenStyles } from '@helixui/tokens/lit';\nimport { helixCheckboxStyles } from './hx-checkbox.styles.js';\n\n// P2-05: monotonic counter — collision-free, deterministic, SSR-safe\nlet _checkboxCounter = 0;\n\n/**\n * A checkbox component with label, validation, and form association.\n *\n * @summary Form-associated checkbox with built-in label, error, and help text.\n *\n * @tag hx-checkbox\n *\n * @slot - Custom label content (overrides the label property). Rich HTML allowed — Drupal can include links in consent labels.\n * @slot error - Custom error content (overrides the error property).\n * @slot help-text - Custom help text content (overrides the helpText property).\n *\n * @fires {CustomEvent<{checked: boolean, value: string}>} hx-change - Dispatched when the checkbox is toggled.\n *\n * @csspart checkbox - The visual checkbox element.\n * @csspart checkmark - The SVG checkmark icon inside the checkbox.\n * @csspart label - The label element.\n * @csspart help-text - The help text container.\n * @csspart error - The error message container.\n * @csspart control - The wrapper around checkbox and label.\n *\n * @cssprop [--hx-checkbox-size=var(--hx-size-5, 1.25rem)] - Checkbox dimensions.\n * @cssprop [--hx-checkbox-bg=var(--hx-color-neutral-0, #ffffff)] - Unchecked background color.\n * @cssprop [--hx-checkbox-border-color=var(--hx-color-neutral-300, #ced4da)] - Checkbox border color.\n * @cssprop [--hx-checkbox-border-radius=var(--hx-border-radius-sm, 0.25rem)] - Checkbox border radius.\n * @cssprop [--hx-checkbox-checked-bg=var(--hx-color-primary-500, #2563EB)] - Checked background color.\n * @cssprop [--hx-checkbox-checked-border-color=var(--hx-color-primary-500, #2563EB)] - Checked border color.\n * @cssprop [--hx-checkbox-checkmark-color=var(--hx-color-neutral-0, #ffffff)] - Checkmark color.\n * @cssprop [--hx-checkbox-focus-ring-color=var(--hx-focus-ring-color, #2563EB)] - Focus ring color.\n * @cssprop [--hx-checkbox-label-color=var(--hx-color-neutral-700, #343a40)] - Label text color.\n * @cssprop [--hx-checkbox-help-text-color=var(--hx-color-neutral-500, #6c757d)] - Help text color.\n * @cssprop [--hx-checkbox-hover-border-color=var(--hx-checkbox-border-color)] - Border color on hover.\n * @cssprop [--hx-checkbox-error-color=var(--hx-color-error-500, #dc3545)] - Error state color.\n */\n@customElement('hx-checkbox')\nexport class HelixCheckbox extends LitElement {\n static override styles = [tokenStyles, helixCheckboxStyles];\n\n // P0-02: observe aria-label on host to forward to inner input\n static override get observedAttributes(): string[] {\n return [...(super.observedAttributes ?? []), 'aria-label'];\n }\n\n override attributeChangedCallback(name: string, old: string | null, next: string | null): void {\n super.attributeChangedCallback(name, old, next);\n if (name === 'aria-label') this.requestUpdate();\n }\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 // ─── Properties ───\n\n /**\n * Whether the checkbox is checked.\n * @attr checked\n */\n @property({ type: Boolean, reflect: true })\n checked = false;\n\n /**\n * Whether the checkbox is in an indeterminate state (e.g., for \"select all\" patterns).\n * @attr indeterminate\n */\n @property({ type: Boolean, reflect: true })\n indeterminate = false;\n\n /**\n * Whether the checkbox is disabled.\n * @attr disabled\n */\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n /**\n * Whether the checkbox is required for form submission.\n * @attr required\n */\n @property({ type: Boolean, reflect: true })\n required = false;\n\n /**\n * The name of the checkbox, used for form submission.\n * @attr name\n */\n @property({ type: String })\n name = '';\n\n /**\n * The value submitted when the checkbox is checked.\n * @attr value\n */\n @property({ type: String })\n value = 'on';\n\n /**\n * The visible label text for the checkbox.\n * @attr label\n */\n @property({ type: String })\n label = '';\n\n /**\n * Error message to display. When set, the checkbox enters an error state.\n * @attr error\n */\n @property({ type: String })\n error = '';\n\n /**\n * Help text displayed below the checkbox for guidance.\n * @attr help-text\n */\n @property({ type: String, attribute: 'help-text' })\n helpText = '';\n\n /**\n * The size of the checkbox.\n * @attr hx-size\n */\n @property({ type: String, attribute: 'hx-size', reflect: true })\n size: 'sm' | 'md' | 'lg' = 'md';\n\n @query('.checkbox__input')\n private _inputEl: HTMLInputElement | undefined;\n\n @state() private _hasErrorSlot = false;\n\n // ─── Slot Handlers ───\n\n private _handleErrorSlotChange(e: Event): void {\n const slot = e.target as HTMLSlotElement;\n this._hasErrorSlot = slot.assignedNodes({ flatten: true }).length > 0;\n }\n\n // ─── Lifecycle ───\n\n override updated(changedProperties: Map<string, unknown>): void {\n super.updated(changedProperties);\n if (changedProperties.has('checked') || changedProperties.has('value')) {\n this._internals.setFormValue(this.checked ? this.value : null);\n this._updateValidity();\n }\n if (changedProperties.has('required')) {\n this._updateValidity();\n }\n }\n\n // ─── Form Integration ───\n\n /** Returns the associated form element, if any. */\n get form(): HTMLFormElement | null {\n return this._internals.form;\n }\n\n /** Returns the validation message. */\n get validationMessage(): string {\n return this._internals.validationMessage;\n }\n\n /** Returns the ValidityState object. */\n get validity(): ValidityState {\n return this._internals.validity;\n }\n\n /** Checks whether the checkbox satisfies its constraints. */\n checkValidity(): boolean {\n return this._internals.checkValidity();\n }\n\n /** Reports validity and shows the browser's constraint validation UI. */\n reportValidity(): boolean {\n return this._internals.reportValidity();\n }\n\n private _updateValidity(): void {\n if (this.required && !this.checked) {\n this._internals.setValidity(\n { valueMissing: true },\n this.error || 'This field is required.',\n this._inputEl ?? undefined,\n );\n } else {\n this._internals.setValidity({});\n }\n }\n\n /** Called by the form when it resets. */\n formResetCallback(): void {\n this.checked = false;\n this.indeterminate = false;\n this._internals.setFormValue(null);\n }\n\n /** Called when the form restores state (e.g., back/forward navigation). */\n formStateRestoreCallback(state: string | File | FormData | null, _reason: string): void {\n this.checked = typeof state === 'string' && state === this.value;\n }\n\n /** Called when a parent fieldset is disabled/enabled. */\n formDisabledCallback(disabled: boolean): void {\n this.disabled = disabled;\n }\n\n // ─── Event Handling ───\n\n private _handleChange(): void {\n if (this.disabled) return;\n\n this.indeterminate = false;\n this.checked = !this.checked;\n\n this._internals.setFormValue(this.checked ? this.value : null);\n this._updateValidity();\n\n /**\n * Dispatched when the checkbox is toggled.\n * @event hx-change\n */\n this.dispatchEvent(\n new CustomEvent('hx-change', {\n bubbles: true,\n composed: true,\n detail: { checked: this.checked, value: this.value },\n }),\n );\n }\n\n private _handleKeyDown(e: KeyboardEvent): void {\n if (e.key === ' ') {\n e.preventDefault();\n e.stopPropagation();\n this._handleChange();\n }\n }\n\n // ─── Public Methods ───\n\n /** Moves focus to the checkbox input element. */\n override focus(options?: FocusOptions): void {\n this._inputEl?.focus(options);\n }\n\n // ─── Render ───\n\n // P2-05: monotonic counter — collision-free and deterministic\n private _id = `hx-checkbox-${++_checkboxCounter}`;\n private _helpTextId = `${this._id}-help`;\n private _errorId = `${this._id}-error`;\n private _labelId = `${this._id}-label`;\n\n override render() {\n const hasError = !!this.error || this._hasErrorSlot;\n\n const containerClasses = {\n checkbox: true,\n 'checkbox--checked': this.checked,\n 'checkbox--indeterminate': this.indeterminate,\n 'checkbox--error': hasError,\n 'checkbox--disabled': this.disabled,\n 'checkbox--required': this.required,\n 'checkbox--sm': this.size === 'sm',\n 'checkbox--md': this.size === 'md',\n 'checkbox--lg': this.size === 'lg',\n };\n\n // P2-06: simplified — hasError already includes _hasErrorSlot\n const describedBy =\n [hasError ? this._errorId : null, this.helpText && !hasError ? this._helpTextId : null]\n .filter(Boolean)\n .join(' ') || undefined;\n\n // P0-02: forward aria-label from host to inner input\n const hostAriaLabel = this.getAttribute('aria-label') ?? undefined;\n\n return html`\n <div class=${classMap(containerClasses)}>\n <label part=\"control\" class=\"checkbox__control\" @click=${this._handleChange}>\n <input\n class=\"checkbox__input\"\n type=\"checkbox\"\n id=${this._id}\n .checked=${live(this.checked)}\n .indeterminate=${live(this.indeterminate)}\n ?disabled=${this.disabled}\n ?required=${this.required}\n name=${ifDefined(this.name || undefined)}\n .value=${this.value}\n aria-checked=${this.indeterminate ? 'mixed' : nothing}\n aria-invalid=${hasError ? 'true' : nothing}\n aria-describedby=${ifDefined(describedBy)}\n aria-label=${ifDefined(hostAriaLabel)}\n aria-labelledby=${ifDefined(!hostAriaLabel ? this._labelId : undefined)}\n @keydown=${this._handleKeyDown}\n @click=${(e: Event) => {\n e.preventDefault();\n e.stopPropagation();\n }}\n @change=${(e: Event) => e.stopPropagation()}\n />\n\n <span part=\"checkbox\" class=\"checkbox__box\">\n <svg\n part=\"checkmark\"\n class=\"checkbox__icon checkbox__icon--check\"\n viewBox=\"0 0 16 16\"\n aria-hidden=\"true\"\n >\n <polyline points=\"3.5 8 6.5 11 12.5 5\"></polyline>\n </svg>\n <svg\n class=\"checkbox__icon checkbox__icon--indeterminate\"\n viewBox=\"0 0 16 16\"\n aria-hidden=\"true\"\n >\n <line x1=\"4\" y1=\"8\" x2=\"12\" y2=\"8\"></line>\n </svg>\n </span>\n\n <span part=\"label\" class=\"checkbox__label\" id=${this._labelId}>\n <slot>${this.label}</slot>\n ${this.required\n ? html`<span class=\"checkbox__required-marker\" aria-hidden=\"true\">*</span>`\n : nothing}\n </span>\n </label>\n\n <!--\n P0-01: wrapper div always owns _errorId so aria-describedby works regardless\n of whether error content comes from the .error property or the named slot.\n P1-02: role=\"status\" (implicit aria-live=\"polite\") replaces role=\"alert\" +\n aria-live=\"polite\" which was semantically contradictory.\n -->\n <div\n part=\"error\"\n class=\"checkbox__error\"\n id=${this._errorId}\n role=\"status\"\n ?hidden=${!hasError}\n >\n <slot name=\"error\" @slotchange=${this._handleErrorSlotChange}> ${this.error} </slot>\n </div>\n\n ${this.helpText && !hasError\n ? html`\n <div part=\"help-text\" class=\"checkbox__help-text\" id=${this._helpTextId}>\n <slot name=\"help-text\">${this.helpText}</slot>\n </div>\n `\n : nothing}\n </div>\n `;\n }\n}\n\n/** Canonical type alias for the hx-checkbox component. */\nexport type HxCheckbox = HelixCheckbox;\n\n/** @deprecated Use {@link HxCheckbox} instead. The `Wc` prefix was a legacy naming convention. */\nexport type WcCheckbox = HelixCheckbox;\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'hx-checkbox': HelixCheckbox;\n }\n}\n"],"names":["helixCheckboxStyles","css","_checkboxCounter","HelixCheckbox","LitElement","name","old","next","slot","changedProperties","state","_reason","disabled","options","_a","hasError","containerClasses","describedBy","hostAriaLabel","html","classMap","live","ifDefined","nothing","e","tokenStyles","__decorateClass","property","query","customElement"],"mappings":"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"}