@helixui/library 0.3.4 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (452) hide show
  1. package/custom-elements.json +7076 -5902
  2. package/dist/components/hx-accordion/hx-accordion-item.d.ts +22 -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 +12 -5
  10. package/dist/components/hx-alert/hx-alert.d.ts.map +1 -1
  11. package/dist/components/hx-alert/hx-alert.styles.d.ts.map +1 -1
  12. package/dist/components/hx-alert/index.js +1 -1
  13. package/dist/components/hx-avatar/hx-avatar.d.ts.map +1 -1
  14. package/dist/components/hx-avatar/index.js +1 -1
  15. package/dist/components/hx-badge/hx-badge.d.ts +2 -0
  16. package/dist/components/hx-badge/hx-badge.d.ts.map +1 -1
  17. package/dist/components/hx-badge/hx-badge.styles.d.ts.map +1 -1
  18. package/dist/components/hx-badge/index.js +1 -1
  19. package/dist/components/hx-banner/hx-banner.d.ts +105 -0
  20. package/dist/components/hx-banner/hx-banner.d.ts.map +1 -0
  21. package/dist/components/hx-banner/hx-banner.styles.d.ts +2 -0
  22. package/dist/components/hx-banner/hx-banner.styles.d.ts.map +1 -0
  23. package/dist/components/hx-banner/index.d.ts +3 -0
  24. package/dist/components/hx-banner/index.d.ts.map +1 -0
  25. package/dist/components/hx-banner/index.js +5 -0
  26. package/dist/components/hx-banner/index.js.map +1 -0
  27. package/dist/components/hx-breadcrumb/hx-breadcrumb-item.styles.d.ts.map +1 -1
  28. package/dist/components/hx-breadcrumb/hx-breadcrumb.d.ts +5 -0
  29. package/dist/components/hx-breadcrumb/hx-breadcrumb.d.ts.map +1 -1
  30. package/dist/components/hx-breadcrumb/index.js +1 -1
  31. package/dist/components/hx-button/hx-button.d.ts +17 -0
  32. package/dist/components/hx-button/hx-button.d.ts.map +1 -1
  33. package/dist/components/hx-button/hx-button.styles.d.ts.map +1 -1
  34. package/dist/components/hx-button/index.js +1 -1
  35. package/dist/components/hx-button-group/hx-button-group.d.ts +8 -0
  36. package/dist/components/hx-button-group/hx-button-group.d.ts.map +1 -1
  37. package/dist/components/hx-button-group/index.js +1 -1
  38. package/dist/components/hx-card/hx-card.d.ts +17 -0
  39. package/dist/components/hx-card/hx-card.d.ts.map +1 -1
  40. package/dist/components/hx-card/hx-card.styles.d.ts.map +1 -1
  41. package/dist/components/hx-card/index.js +1 -1
  42. package/dist/components/hx-carousel/hx-carousel.d.ts +122 -0
  43. package/dist/components/hx-carousel/hx-carousel.d.ts.map +1 -1
  44. package/dist/components/hx-carousel/hx-carousel.styles.d.ts.map +1 -1
  45. package/dist/components/hx-carousel/index.js +1 -1
  46. package/dist/components/hx-checkbox/hx-checkbox.d.ts +3 -1
  47. package/dist/components/hx-checkbox/hx-checkbox.d.ts.map +1 -1
  48. package/dist/components/hx-checkbox/hx-checkbox.styles.d.ts.map +1 -1
  49. package/dist/components/hx-checkbox/index.js +1 -1
  50. package/dist/components/hx-checkbox-group/hx-checkbox-group.d.ts +5 -1
  51. package/dist/components/hx-checkbox-group/hx-checkbox-group.d.ts.map +1 -1
  52. package/dist/components/hx-checkbox-group/index.js +1 -1
  53. package/dist/components/hx-code-snippet/hx-code-snippet.d.ts +21 -6
  54. package/dist/components/hx-code-snippet/hx-code-snippet.d.ts.map +1 -1
  55. package/dist/components/hx-code-snippet/index.js +1 -1
  56. package/dist/components/hx-color-picker/hx-color-picker.d.ts +47 -0
  57. package/dist/components/hx-color-picker/hx-color-picker.d.ts.map +1 -1
  58. package/dist/components/hx-color-picker/hx-color-picker.styles.d.ts.map +1 -1
  59. package/dist/components/hx-color-picker/index.js +1 -1
  60. package/dist/components/hx-combobox/hx-combobox.d.ts +24 -0
  61. package/dist/components/hx-combobox/hx-combobox.d.ts.map +1 -1
  62. package/dist/components/hx-combobox/hx-combobox.styles.d.ts.map +1 -1
  63. package/dist/components/hx-combobox/index.js +1 -1
  64. package/dist/components/hx-container/hx-container.d.ts +3 -1
  65. package/dist/components/hx-container/hx-container.d.ts.map +1 -1
  66. package/dist/components/hx-copy-button/hx-copy-button.d.ts +6 -0
  67. package/dist/components/hx-copy-button/hx-copy-button.d.ts.map +1 -1
  68. package/dist/components/hx-copy-button/index.js +1 -1
  69. package/dist/components/hx-counter/hx-counter.d.ts +79 -0
  70. package/dist/components/hx-counter/hx-counter.d.ts.map +1 -0
  71. package/dist/components/hx-counter/hx-counter.styles.d.ts +2 -0
  72. package/dist/components/hx-counter/hx-counter.styles.d.ts.map +1 -0
  73. package/dist/components/hx-counter/index.d.ts +3 -0
  74. package/dist/components/hx-counter/index.d.ts.map +1 -0
  75. package/dist/components/hx-counter/index.js +5 -0
  76. package/dist/components/hx-counter/index.js.map +1 -0
  77. package/dist/components/hx-data-table/hx-data-table.d.ts +6 -0
  78. package/dist/components/hx-data-table/hx-data-table.d.ts.map +1 -1
  79. package/dist/components/hx-data-table/hx-data-table.styles.d.ts.map +1 -1
  80. package/dist/components/hx-data-table/index.js +1 -1
  81. package/dist/components/hx-date-picker/hx-date-picker.d.ts +124 -0
  82. package/dist/components/hx-date-picker/hx-date-picker.d.ts.map +1 -1
  83. package/dist/components/hx-date-picker/hx-date-picker.styles.d.ts.map +1 -1
  84. package/dist/components/hx-date-picker/index.js +1 -1
  85. package/dist/components/hx-dialog/hx-dialog.d.ts.map +1 -1
  86. package/dist/components/hx-dialog/hx-dialog.styles.d.ts.map +1 -1
  87. package/dist/components/hx-dialog/index.js +1 -1
  88. package/dist/components/hx-divider/hx-divider.d.ts +3 -0
  89. package/dist/components/hx-divider/hx-divider.d.ts.map +1 -1
  90. package/dist/components/hx-drawer/hx-drawer.d.ts +54 -1
  91. package/dist/components/hx-drawer/hx-drawer.d.ts.map +1 -1
  92. package/dist/components/hx-drawer/hx-drawer.styles.d.ts.map +1 -1
  93. package/dist/components/hx-drawer/index.js +1 -1
  94. package/dist/components/hx-dropdown/hx-dropdown.d.ts +20 -0
  95. package/dist/components/hx-dropdown/hx-dropdown.d.ts.map +1 -1
  96. package/dist/components/hx-dropdown/index.js +1 -1
  97. package/dist/components/hx-field/hx-field.d.ts +31 -1
  98. package/dist/components/hx-field/hx-field.d.ts.map +1 -1
  99. package/dist/components/hx-field/index.js +1 -1
  100. package/dist/components/hx-file-upload/hx-file-upload.d.ts +12 -0
  101. package/dist/components/hx-file-upload/hx-file-upload.d.ts.map +1 -1
  102. package/dist/components/hx-file-upload/hx-file-upload.styles.d.ts.map +1 -1
  103. package/dist/components/hx-file-upload/index.js +1 -1
  104. package/dist/components/hx-form/hx-form.d.ts +24 -0
  105. package/dist/components/hx-form/hx-form.d.ts.map +1 -1
  106. package/dist/components/hx-form/index.js +1 -1
  107. package/dist/components/hx-help-text/hx-help-text.d.ts +3 -0
  108. package/dist/components/hx-help-text/hx-help-text.d.ts.map +1 -1
  109. package/dist/components/hx-icon-button/hx-icon-button.d.ts.map +1 -1
  110. package/dist/components/hx-icon-button/hx-icon-button.styles.d.ts.map +1 -1
  111. package/dist/components/hx-icon-button/index.js +1 -1
  112. package/dist/components/hx-list/hx-list.d.ts.map +1 -1
  113. package/dist/components/hx-list/index.js +1 -1
  114. package/dist/components/hx-menu/hx-menu-item.d.ts +1 -0
  115. package/dist/components/hx-menu/hx-menu-item.d.ts.map +1 -1
  116. package/dist/components/hx-menu/hx-menu.d.ts +13 -0
  117. package/dist/components/hx-menu/hx-menu.d.ts.map +1 -1
  118. package/dist/components/hx-menu/index.js +1 -1
  119. package/dist/components/hx-meter/hx-meter.d.ts +3 -0
  120. package/dist/components/hx-meter/hx-meter.d.ts.map +1 -1
  121. package/dist/components/hx-meter/hx-meter.styles.d.ts.map +1 -1
  122. package/dist/components/hx-meter/index.js +1 -1
  123. package/dist/components/hx-nav/hx-nav.d.ts +15 -1
  124. package/dist/components/hx-nav/hx-nav.d.ts.map +1 -1
  125. package/dist/components/hx-nav/hx-nav.styles.d.ts.map +1 -1
  126. package/dist/components/hx-nav/index.js +1 -1
  127. package/dist/components/hx-number-input/hx-number-input.d.ts +2 -0
  128. package/dist/components/hx-number-input/hx-number-input.d.ts.map +1 -1
  129. package/dist/components/hx-number-input/index.js +1 -1
  130. package/dist/components/hx-overflow-menu/hx-overflow-menu.d.ts +14 -0
  131. package/dist/components/hx-overflow-menu/hx-overflow-menu.d.ts.map +1 -1
  132. package/dist/components/hx-overflow-menu/hx-overflow-menu.styles.d.ts.map +1 -1
  133. package/dist/components/hx-overflow-menu/index.js +1 -1
  134. package/dist/components/hx-pagination/hx-pagination.d.ts +5 -0
  135. package/dist/components/hx-pagination/hx-pagination.d.ts.map +1 -1
  136. package/dist/components/hx-pagination/hx-pagination.styles.d.ts.map +1 -1
  137. package/dist/components/hx-pagination/index.js +1 -1
  138. package/dist/components/hx-popover/hx-popover.d.ts +43 -39
  139. package/dist/components/hx-popover/hx-popover.d.ts.map +1 -1
  140. package/dist/components/hx-popover/hx-popover.styles.d.ts.map +1 -1
  141. package/dist/components/hx-popover/index.js +1 -1
  142. package/dist/components/hx-progress-bar/hx-progress-bar.d.ts +12 -0
  143. package/dist/components/hx-progress-bar/hx-progress-bar.d.ts.map +1 -1
  144. package/dist/components/hx-progress-bar/index.js +1 -1
  145. package/dist/components/hx-progress-ring/hx-progress-ring.d.ts.map +1 -1
  146. package/dist/components/hx-progress-ring/index.js +1 -1
  147. package/dist/components/hx-radio-group/hx-radio-group.d.ts +75 -3
  148. package/dist/components/hx-radio-group/hx-radio-group.d.ts.map +1 -1
  149. package/dist/components/hx-radio-group/hx-radio.d.ts +3 -1
  150. package/dist/components/hx-radio-group/hx-radio.d.ts.map +1 -1
  151. package/dist/components/hx-radio-group/hx-radio.styles.d.ts.map +1 -1
  152. package/dist/components/hx-radio-group/index.js +1 -1
  153. package/dist/components/hx-rating/hx-rating.d.ts +18 -3
  154. package/dist/components/hx-rating/hx-rating.d.ts.map +1 -1
  155. package/dist/components/hx-rating/index.js +1 -1
  156. package/dist/components/hx-select/hx-select.d.ts +9 -0
  157. package/dist/components/hx-select/hx-select.d.ts.map +1 -1
  158. package/dist/components/hx-select/hx-select.styles.d.ts.map +1 -1
  159. package/dist/components/hx-select/index.js +1 -1
  160. package/dist/components/hx-side-nav/hx-side-nav.d.ts.map +1 -1
  161. package/dist/components/hx-side-nav/index.js +1 -1
  162. package/dist/components/hx-slider/hx-slider.d.ts +2 -0
  163. package/dist/components/hx-slider/hx-slider.d.ts.map +1 -1
  164. package/dist/components/hx-slider/index.js +1 -1
  165. package/dist/components/hx-split-button/hx-split-button.d.ts +16 -0
  166. package/dist/components/hx-split-button/hx-split-button.d.ts.map +1 -1
  167. package/dist/components/hx-split-button/index.js +1 -1
  168. package/dist/components/hx-split-panel/hx-split-panel.d.ts +44 -0
  169. package/dist/components/hx-split-panel/hx-split-panel.d.ts.map +1 -1
  170. package/dist/components/hx-split-panel/hx-split-panel.styles.d.ts.map +1 -1
  171. package/dist/components/hx-split-panel/index.js +1 -1
  172. package/dist/components/hx-stat/hx-stat.d.ts +71 -0
  173. package/dist/components/hx-stat/hx-stat.d.ts.map +1 -0
  174. package/dist/components/hx-stat/hx-stat.styles.d.ts +2 -0
  175. package/dist/components/hx-stat/hx-stat.styles.d.ts.map +1 -0
  176. package/dist/components/hx-stat/index.d.ts +3 -0
  177. package/dist/components/hx-stat/index.d.ts.map +1 -0
  178. package/dist/components/hx-stat/index.js +5 -0
  179. package/dist/components/hx-stat/index.js.map +1 -0
  180. package/dist/components/hx-steps/hx-steps.d.ts +5 -0
  181. package/dist/components/hx-steps/hx-steps.d.ts.map +1 -1
  182. package/dist/components/hx-steps/index.js +1 -1
  183. package/dist/components/hx-structured-list/hx-structured-list.d.ts +2 -0
  184. package/dist/components/hx-structured-list/hx-structured-list.d.ts.map +1 -1
  185. package/dist/components/hx-structured-list/index.js +1 -1
  186. package/dist/components/hx-switch/hx-switch.d.ts +2 -0
  187. package/dist/components/hx-switch/hx-switch.d.ts.map +1 -1
  188. package/dist/components/hx-switch/index.js +1 -1
  189. package/dist/components/hx-table/hx-table.d.ts +60 -0
  190. package/dist/components/hx-table/hx-table.d.ts.map +1 -0
  191. package/dist/components/hx-table/hx-table.styles.d.ts +9 -0
  192. package/dist/components/hx-table/hx-table.styles.d.ts.map +1 -0
  193. package/dist/components/hx-table/hx-tbody.d.ts +23 -0
  194. package/dist/components/hx-table/hx-tbody.d.ts.map +1 -0
  195. package/dist/components/hx-table/hx-td.d.ts +46 -0
  196. package/dist/components/hx-table/hx-td.d.ts.map +1 -0
  197. package/dist/components/hx-table/hx-tfoot.d.ts +23 -0
  198. package/dist/components/hx-table/hx-tfoot.d.ts.map +1 -0
  199. package/dist/components/hx-table/hx-th.d.ts +61 -0
  200. package/dist/components/hx-table/hx-th.d.ts.map +1 -0
  201. package/dist/components/hx-table/hx-thead.d.ts +23 -0
  202. package/dist/components/hx-table/hx-thead.d.ts.map +1 -0
  203. package/dist/components/hx-table/hx-tr.d.ts +33 -0
  204. package/dist/components/hx-table/hx-tr.d.ts.map +1 -0
  205. package/dist/components/hx-table/index.d.ts +9 -0
  206. package/dist/components/hx-table/index.d.ts.map +1 -0
  207. package/dist/components/hx-table/index.js +11 -0
  208. package/dist/components/hx-table/index.js.map +1 -0
  209. package/dist/components/hx-tabs/hx-tabs.d.ts.map +1 -1
  210. package/dist/components/hx-tabs/index.js +1 -1
  211. package/dist/components/hx-tag/hx-tag.d.ts +2 -0
  212. package/dist/components/hx-tag/hx-tag.d.ts.map +1 -1
  213. package/dist/components/hx-tag/hx-tag.styles.d.ts.map +1 -1
  214. package/dist/components/hx-tag/index.js +1 -1
  215. package/dist/components/hx-text-input/hx-text-input.d.ts +2 -1
  216. package/dist/components/hx-text-input/hx-text-input.d.ts.map +1 -1
  217. package/dist/components/hx-text-input/index.js +1 -1
  218. package/dist/components/hx-textarea/hx-textarea.d.ts +14 -0
  219. package/dist/components/hx-textarea/hx-textarea.d.ts.map +1 -1
  220. package/dist/components/hx-textarea/hx-textarea.styles.d.ts.map +1 -1
  221. package/dist/components/hx-textarea/index.js +1 -1
  222. package/dist/components/hx-time-picker/hx-time-picker.d.ts +83 -1
  223. package/dist/components/hx-time-picker/hx-time-picker.d.ts.map +1 -1
  224. package/dist/components/hx-time-picker/index.js +1 -1
  225. package/dist/components/hx-toast/hx-toast-stack.d.ts +36 -0
  226. package/dist/components/hx-toast/hx-toast-stack.d.ts.map +1 -0
  227. package/dist/components/hx-toast/hx-toast.d.ts +10 -52
  228. package/dist/components/hx-toast/hx-toast.d.ts.map +1 -1
  229. package/dist/components/hx-toast/hx-toast.styles.d.ts.map +1 -1
  230. package/dist/components/hx-toast/index.d.ts +6 -2
  231. package/dist/components/hx-toast/index.d.ts.map +1 -1
  232. package/dist/components/hx-toast/index.js +1 -1
  233. package/dist/components/hx-toast/toast-factory.d.ts +25 -0
  234. package/dist/components/hx-toast/toast-factory.d.ts.map +1 -0
  235. package/dist/components/hx-toggle-button/hx-toggle-button.d.ts +1 -0
  236. package/dist/components/hx-toggle-button/hx-toggle-button.d.ts.map +1 -1
  237. package/dist/components/hx-toggle-button/index.js +1 -1
  238. package/dist/components/hx-tooltip/hx-tooltip.d.ts +1 -45
  239. package/dist/components/hx-tooltip/hx-tooltip.d.ts.map +1 -1
  240. package/dist/components/hx-tooltip/index.js +1 -1
  241. package/dist/components/hx-top-nav/hx-top-nav.d.ts.map +1 -1
  242. package/dist/components/hx-top-nav/index.js +1 -1
  243. package/dist/components/hx-tree-view/hx-tree-item.d.ts +61 -1
  244. package/dist/components/hx-tree-view/hx-tree-item.d.ts.map +1 -1
  245. package/dist/components/hx-tree-view/hx-tree-item.styles.d.ts.map +1 -1
  246. package/dist/components/hx-tree-view/hx-tree-view.d.ts +16 -0
  247. package/dist/components/hx-tree-view/hx-tree-view.d.ts.map +1 -1
  248. package/dist/components/hx-tree-view/index.js +1 -1
  249. package/dist/index.d.ts +20 -2
  250. package/dist/index.d.ts.map +1 -1
  251. package/dist/index.js +169 -155
  252. package/dist/index.js.map +1 -1
  253. package/dist/shared/body-scroll-lock-VBa5TFP-.js +12 -0
  254. package/dist/shared/body-scroll-lock-VBa5TFP-.js.map +1 -0
  255. package/dist/shared/dev-warn-YlwPHjtX.js +6 -0
  256. package/dist/shared/dev-warn-YlwPHjtX.js.map +1 -0
  257. package/dist/shared/{hx-accordion-D95XSAft.js → hx-accordion-DT8qHOay.js} +73 -53
  258. package/dist/shared/hx-accordion-DT8qHOay.js.map +1 -0
  259. package/dist/shared/{hx-action-bar-B4i9tBCP.js → hx-action-bar-we_WJety.js} +41 -40
  260. package/dist/shared/hx-action-bar-we_WJety.js.map +1 -0
  261. package/dist/shared/{hx-alert-BQpT4gL3.js → hx-alert-D6uok29t.js} +95 -28
  262. package/dist/shared/hx-alert-D6uok29t.js.map +1 -0
  263. package/dist/shared/{hx-avatar-yHjmNdtf.js → hx-avatar-Cep6Urm3.js} +62 -65
  264. package/dist/shared/hx-avatar-Cep6Urm3.js.map +1 -0
  265. package/dist/shared/{hx-badge-CjT0d8NK.js → hx-badge-BeuWuUj_.js} +57 -31
  266. package/dist/shared/hx-badge-BeuWuUj_.js.map +1 -0
  267. package/dist/shared/hx-banner-DnCBJtRR.js +353 -0
  268. package/dist/shared/hx-banner-DnCBJtRR.js.map +1 -0
  269. package/dist/shared/{hx-breadcrumb-item-DtSxRZ_W.js → hx-breadcrumb-item-Bj2UqhzR.js} +54 -48
  270. package/dist/shared/hx-breadcrumb-item-Bj2UqhzR.js.map +1 -0
  271. package/dist/shared/{hx-button-CtiJsmOg.js → hx-button-Cbhqpm5i.js} +111 -28
  272. package/dist/shared/hx-button-Cbhqpm5i.js.map +1 -0
  273. package/dist/shared/{hx-button-group-BMV5qFs4.js → hx-button-group-CWjWv-wS.js} +10 -10
  274. package/dist/shared/hx-button-group-CWjWv-wS.js.map +1 -0
  275. package/dist/shared/{hx-card-DAkEfpJd.js → hx-card-B9j2SHyI.js} +26 -22
  276. package/dist/shared/hx-card-B9j2SHyI.js.map +1 -0
  277. package/dist/shared/{hx-carousel-item-C2yBnM0r.js → hx-carousel-item-Be0bC-7o.js} +150 -98
  278. package/dist/shared/hx-carousel-item-Be0bC-7o.js.map +1 -0
  279. package/dist/shared/{hx-checkbox-BMayOpAM.js → hx-checkbox-CuaJqEo7.js} +3 -1
  280. package/dist/shared/hx-checkbox-CuaJqEo7.js.map +1 -0
  281. package/dist/shared/{hx-checkbox-group-DTS9iT4b.js → hx-checkbox-group-ydUdV9Sx.js} +7 -7
  282. package/dist/shared/hx-checkbox-group-ydUdV9Sx.js.map +1 -0
  283. package/dist/shared/{hx-code-snippet-DdEqy-1B.js → hx-code-snippet-DBwIjl5p.js} +71 -59
  284. package/dist/shared/hx-code-snippet-DBwIjl5p.js.map +1 -0
  285. package/dist/shared/{hx-color-picker-K2x_dyeG.js → hx-color-picker-Bb2UPVc3.js} +101 -91
  286. package/dist/shared/hx-color-picker-Bb2UPVc3.js.map +1 -0
  287. package/dist/shared/{hx-combobox-DjMigccw.js → hx-combobox-CNvY-es8.js} +104 -65
  288. package/dist/shared/hx-combobox-CNvY-es8.js.map +1 -0
  289. package/dist/shared/hx-container-DLUKnTi9.js.map +1 -1
  290. package/dist/shared/{hx-copy-button-BXL1xkxb.js → hx-copy-button-CLBA31to.js} +45 -50
  291. package/dist/shared/hx-copy-button-CLBA31to.js.map +1 -0
  292. package/dist/shared/hx-counter-D-1NXzGs.js +138 -0
  293. package/dist/shared/hx-counter-D-1NXzGs.js.map +1 -0
  294. package/dist/shared/{hx-data-table-D3NZvc3P.js → hx-data-table-BwoJCFgs.js} +102 -96
  295. package/dist/shared/hx-data-table-BwoJCFgs.js.map +1 -0
  296. package/dist/shared/{hx-date-picker-CIHwx9b3.js → hx-date-picker-DDcIBJir.js} +58 -47
  297. package/dist/shared/hx-date-picker-DDcIBJir.js.map +1 -0
  298. package/dist/shared/{hx-dialog-e4CSD8xX.js → hx-dialog-M7so0sRT.js} +33 -25
  299. package/dist/shared/hx-dialog-M7so0sRT.js.map +1 -0
  300. package/dist/shared/hx-divider-XgWIz4Mr.js.map +1 -1
  301. package/dist/shared/{hx-drawer-bTF0nbrg.js → hx-drawer-CYxuhIQ0.js} +53 -45
  302. package/dist/shared/hx-drawer-CYxuhIQ0.js.map +1 -0
  303. package/dist/shared/{hx-dropdown-DnjLnkTj.js → hx-dropdown-7cfowTWv.js} +30 -30
  304. package/dist/shared/hx-dropdown-7cfowTWv.js.map +1 -0
  305. package/dist/shared/{hx-field-Dz-7M_SC.js → hx-field-CDP8EXuj.js} +22 -19
  306. package/dist/shared/hx-field-CDP8EXuj.js.map +1 -0
  307. package/dist/shared/{hx-file-upload-DnYiIhyN.js → hx-file-upload-9HbONfqt.js} +63 -54
  308. package/dist/shared/hx-file-upload-9HbONfqt.js.map +1 -0
  309. package/dist/shared/{hx-form-BJeLK34m.js → hx-form-BFv_N1dm.js} +9 -1
  310. package/dist/shared/{hx-form-BJeLK34m.js.map → hx-form-BFv_N1dm.js.map} +1 -1
  311. package/dist/shared/hx-help-text-DaOPN1iB.js.map +1 -1
  312. package/dist/shared/{hx-icon-button-C_fsUJW4.js → hx-icon-button-iu0i_faq.js} +40 -32
  313. package/dist/shared/hx-icon-button-iu0i_faq.js.map +1 -0
  314. package/dist/shared/{hx-list-CF-AAnp-.js → hx-list-CdRNgeoP.js} +7 -9
  315. package/dist/shared/{hx-list-CF-AAnp-.js.map → hx-list-CdRNgeoP.js.map} +1 -1
  316. package/dist/shared/{hx-menu-divider-Buc5XA9E.js → hx-menu-divider-DR8klkFT.js} +46 -38
  317. package/dist/shared/hx-menu-divider-DR8klkFT.js.map +1 -0
  318. package/dist/shared/{hx-meter-qcXl0zCL.js → hx-meter-CZ7lnMra.js} +87 -49
  319. package/dist/shared/hx-meter-CZ7lnMra.js.map +1 -0
  320. package/dist/shared/{hx-nav-CWwByFdq.js → hx-nav-DM6-cGKF.js} +97 -95
  321. package/dist/shared/hx-nav-DM6-cGKF.js.map +1 -0
  322. package/dist/shared/{hx-nav-item-DItaMWl0.js → hx-nav-item-D54-5eUM.js} +12 -12
  323. package/dist/shared/hx-nav-item-D54-5eUM.js.map +1 -0
  324. package/dist/shared/{hx-number-input-CS6_w1lT.js → hx-number-input-BP6TIA92.js} +5 -1
  325. package/dist/shared/hx-number-input-BP6TIA92.js.map +1 -0
  326. package/dist/shared/{hx-overflow-menu-CAS1Mlus.js → hx-overflow-menu-CobkjAb8.js} +50 -37
  327. package/dist/shared/hx-overflow-menu-CobkjAb8.js.map +1 -0
  328. package/dist/shared/{hx-pagination-DNFgXQm3.js → hx-pagination-10dpXS95.js} +74 -69
  329. package/dist/shared/hx-pagination-10dpXS95.js.map +1 -0
  330. package/dist/shared/hx-popover-ULjonbaO.js +269 -0
  331. package/dist/shared/hx-popover-ULjonbaO.js.map +1 -0
  332. package/dist/shared/{hx-progress-bar-b3_m1hna.js → hx-progress-bar-CnTibV63.js} +69 -50
  333. package/dist/shared/hx-progress-bar-CnTibV63.js.map +1 -0
  334. package/dist/shared/{hx-progress-ring-wOSv2y_I.js → hx-progress-ring-BHJBaXNk.js} +2 -4
  335. package/dist/shared/hx-progress-ring-BHJBaXNk.js.map +1 -0
  336. package/dist/shared/{hx-radio-CGtFKls2.js → hx-radio-BnKcRuQu.js} +46 -12
  337. package/dist/shared/hx-radio-BnKcRuQu.js.map +1 -0
  338. package/dist/shared/{hx-rating-C4kTOyHF.js → hx-rating-Y_t7Z4qb.js} +104 -67
  339. package/dist/shared/hx-rating-Y_t7Z4qb.js.map +1 -0
  340. package/dist/shared/{hx-select-D9bYJcDv.js → hx-select-C50lD7NS.js} +19 -12
  341. package/dist/shared/hx-select-C50lD7NS.js.map +1 -0
  342. package/dist/shared/{hx-slider-Duzmuid9.js → hx-slider-CprSNrRi.js} +11 -6
  343. package/dist/shared/hx-slider-CprSNrRi.js.map +1 -0
  344. package/dist/shared/{hx-split-button-DhncgAtZ.js → hx-split-button-CHGy4FUc.js} +19 -18
  345. package/dist/shared/hx-split-button-CHGy4FUc.js.map +1 -0
  346. package/dist/shared/{hx-split-panel-Cxkeauwe.js → hx-split-panel-DYtB45Tr.js} +16 -8
  347. package/dist/shared/hx-split-panel-DYtB45Tr.js.map +1 -0
  348. package/dist/shared/hx-stat-C2wfph8W.js +212 -0
  349. package/dist/shared/hx-stat-C2wfph8W.js.map +1 -0
  350. package/dist/shared/{hx-step-nMT0fHEn.js → hx-step-DYoIumpR.js} +29 -29
  351. package/dist/shared/hx-step-DYoIumpR.js.map +1 -0
  352. package/dist/shared/{hx-structured-list-CMja1VXz.js → hx-structured-list-CMWllxGg.js} +23 -17
  353. package/dist/shared/{hx-structured-list-CMja1VXz.js.map → hx-structured-list-CMWllxGg.js.map} +1 -1
  354. package/dist/shared/{hx-switch-BPvIcDpM.js → hx-switch-DkKchcuP.js} +8 -3
  355. package/dist/shared/{hx-switch-BPvIcDpM.js.map → hx-switch-DkKchcuP.js.map} +1 -1
  356. package/dist/shared/{hx-tab-panel-C7h5lRpw.js → hx-tab-panel-BRNcLICw.js} +129 -120
  357. package/dist/shared/hx-tab-panel-BRNcLICw.js.map +1 -0
  358. package/dist/shared/{hx-tag-SJJtMlOS.js → hx-tag-B3N-vZ6B.js} +80 -55
  359. package/dist/shared/hx-tag-B3N-vZ6B.js.map +1 -0
  360. package/dist/shared/hx-td-CVwCGBYf.js +604 -0
  361. package/dist/shared/hx-td-CVwCGBYf.js.map +1 -0
  362. package/dist/shared/{hx-text-input-BUMgOQHX.js → hx-text-input-CCZZbWQ9.js} +10 -6
  363. package/dist/shared/hx-text-input-CCZZbWQ9.js.map +1 -0
  364. package/dist/shared/{hx-textarea-B_nmxzhC.js → hx-textarea-BsQdB1Rk.js} +51 -18
  365. package/dist/shared/hx-textarea-BsQdB1Rk.js.map +1 -0
  366. package/dist/shared/{hx-time-picker-a-BCkecJ.js → hx-time-picker-CJcIjH3C.js} +65 -54
  367. package/dist/shared/hx-time-picker-CJcIjH3C.js.map +1 -0
  368. package/dist/shared/{hx-toggle-button--xCXWRJW.js → hx-toggle-button-D4F1soEM.js} +34 -22
  369. package/dist/shared/{hx-toggle-button--xCXWRJW.js.map → hx-toggle-button-D4F1soEM.js.map} +1 -1
  370. package/dist/shared/{hx-tooltip-DN6lMlP5.js → hx-tooltip-Bk1iQRHs.js} +23 -23
  371. package/dist/shared/hx-tooltip-Bk1iQRHs.js.map +1 -0
  372. package/dist/shared/{hx-top-nav-8lDKNZUj.js → hx-top-nav-D2bQpns3.js} +43 -30
  373. package/dist/shared/{hx-top-nav-8lDKNZUj.js.map → hx-top-nav-D2bQpns3.js.map} +1 -1
  374. package/dist/shared/{hx-tree-item-Cesh_du5.js → hx-tree-item-BobGN76x.js} +202 -120
  375. package/dist/shared/hx-tree-item-BobGN76x.js.map +1 -0
  376. package/dist/shared/{hx-toast-ikwh9Y03.js → toast-factory-MvMMreTu.js} +181 -94
  377. package/dist/shared/toast-factory-MvMMreTu.js.map +1 -0
  378. package/dist/tools/cem-a11y-analyzer/analyzers/aria-analyzer.d.ts +12 -0
  379. package/dist/tools/cem-a11y-analyzer/analyzers/aria-analyzer.d.ts.map +1 -0
  380. package/dist/tools/cem-a11y-analyzer/analyzers/focus-analyzer.d.ts +13 -0
  381. package/dist/tools/cem-a11y-analyzer/analyzers/focus-analyzer.d.ts.map +1 -0
  382. package/dist/tools/cem-a11y-analyzer/analyzers/form-analyzer.d.ts +13 -0
  383. package/dist/tools/cem-a11y-analyzer/analyzers/form-analyzer.d.ts.map +1 -0
  384. package/dist/tools/cem-a11y-analyzer/analyzers/keyboard-analyzer.d.ts +12 -0
  385. package/dist/tools/cem-a11y-analyzer/analyzers/keyboard-analyzer.d.ts.map +1 -0
  386. package/dist/tools/cem-a11y-analyzer/analyzers/label-analyzer.d.ts +13 -0
  387. package/dist/tools/cem-a11y-analyzer/analyzers/label-analyzer.d.ts.map +1 -0
  388. package/dist/tools/cem-a11y-analyzer/analyzers/motion-analyzer.d.ts +12 -0
  389. package/dist/tools/cem-a11y-analyzer/analyzers/motion-analyzer.d.ts.map +1 -0
  390. package/dist/tools/cem-a11y-analyzer/index.d.ts +14 -0
  391. package/dist/tools/cem-a11y-analyzer/index.d.ts.map +1 -0
  392. package/dist/tools/cem-a11y-analyzer/reporter.d.ts +6 -0
  393. package/dist/tools/cem-a11y-analyzer/reporter.d.ts.map +1 -0
  394. package/dist/tools/cem-a11y-analyzer/scorer.d.ts +22 -0
  395. package/dist/tools/cem-a11y-analyzer/scorer.d.ts.map +1 -0
  396. package/dist/tools/cem-a11y-analyzer/types.d.ts +171 -0
  397. package/dist/tools/cem-a11y-analyzer/types.d.ts.map +1 -0
  398. package/dist/utils/body-scroll-lock.d.ts +34 -0
  399. package/dist/utils/body-scroll-lock.d.ts.map +1 -0
  400. package/dist/utils/dev-warn.d.ts +19 -0
  401. package/dist/utils/dev-warn.d.ts.map +1 -0
  402. package/package.json +1 -1
  403. package/dist/shared/hx-accordion-D95XSAft.js.map +0 -1
  404. package/dist/shared/hx-action-bar-B4i9tBCP.js.map +0 -1
  405. package/dist/shared/hx-alert-BQpT4gL3.js.map +0 -1
  406. package/dist/shared/hx-avatar-yHjmNdtf.js.map +0 -1
  407. package/dist/shared/hx-badge-CjT0d8NK.js.map +0 -1
  408. package/dist/shared/hx-breadcrumb-item-DtSxRZ_W.js.map +0 -1
  409. package/dist/shared/hx-button-CtiJsmOg.js.map +0 -1
  410. package/dist/shared/hx-button-group-BMV5qFs4.js.map +0 -1
  411. package/dist/shared/hx-card-DAkEfpJd.js.map +0 -1
  412. package/dist/shared/hx-carousel-item-C2yBnM0r.js.map +0 -1
  413. package/dist/shared/hx-checkbox-BMayOpAM.js.map +0 -1
  414. package/dist/shared/hx-checkbox-group-DTS9iT4b.js.map +0 -1
  415. package/dist/shared/hx-code-snippet-DdEqy-1B.js.map +0 -1
  416. package/dist/shared/hx-color-picker-K2x_dyeG.js.map +0 -1
  417. package/dist/shared/hx-combobox-DjMigccw.js.map +0 -1
  418. package/dist/shared/hx-copy-button-BXL1xkxb.js.map +0 -1
  419. package/dist/shared/hx-data-table-D3NZvc3P.js.map +0 -1
  420. package/dist/shared/hx-date-picker-CIHwx9b3.js.map +0 -1
  421. package/dist/shared/hx-dialog-e4CSD8xX.js.map +0 -1
  422. package/dist/shared/hx-drawer-bTF0nbrg.js.map +0 -1
  423. package/dist/shared/hx-dropdown-DnjLnkTj.js.map +0 -1
  424. package/dist/shared/hx-field-Dz-7M_SC.js.map +0 -1
  425. package/dist/shared/hx-file-upload-DnYiIhyN.js.map +0 -1
  426. package/dist/shared/hx-icon-button-C_fsUJW4.js.map +0 -1
  427. package/dist/shared/hx-menu-divider-Buc5XA9E.js.map +0 -1
  428. package/dist/shared/hx-meter-qcXl0zCL.js.map +0 -1
  429. package/dist/shared/hx-nav-CWwByFdq.js.map +0 -1
  430. package/dist/shared/hx-nav-item-DItaMWl0.js.map +0 -1
  431. package/dist/shared/hx-number-input-CS6_w1lT.js.map +0 -1
  432. package/dist/shared/hx-overflow-menu-CAS1Mlus.js.map +0 -1
  433. package/dist/shared/hx-pagination-DNFgXQm3.js.map +0 -1
  434. package/dist/shared/hx-popover-BjAyLbzp.js +0 -226
  435. package/dist/shared/hx-popover-BjAyLbzp.js.map +0 -1
  436. package/dist/shared/hx-progress-bar-b3_m1hna.js.map +0 -1
  437. package/dist/shared/hx-progress-ring-wOSv2y_I.js.map +0 -1
  438. package/dist/shared/hx-radio-CGtFKls2.js.map +0 -1
  439. package/dist/shared/hx-rating-C4kTOyHF.js.map +0 -1
  440. package/dist/shared/hx-select-D9bYJcDv.js.map +0 -1
  441. package/dist/shared/hx-slider-Duzmuid9.js.map +0 -1
  442. package/dist/shared/hx-split-button-DhncgAtZ.js.map +0 -1
  443. package/dist/shared/hx-split-panel-Cxkeauwe.js.map +0 -1
  444. package/dist/shared/hx-step-nMT0fHEn.js.map +0 -1
  445. package/dist/shared/hx-tab-panel-C7h5lRpw.js.map +0 -1
  446. package/dist/shared/hx-tag-SJJtMlOS.js.map +0 -1
  447. package/dist/shared/hx-text-input-BUMgOQHX.js.map +0 -1
  448. package/dist/shared/hx-textarea-B_nmxzhC.js.map +0 -1
  449. package/dist/shared/hx-time-picker-a-BCkecJ.js.map +0 -1
  450. package/dist/shared/hx-toast-ikwh9Y03.js.map +0 -1
  451. package/dist/shared/hx-tooltip-DN6lMlP5.js.map +0 -1
  452. package/dist/shared/hx-tree-item-Cesh_du5.js.map +0 -1
@@ -1,8 +1,9 @@
1
- import { css as f, LitElement as _, nothing as c, html as h } from "lit";
2
- import { property as o, state as p, customElement as x } from "lit/decorators.js";
1
+ import { css as p, LitElement as _, nothing as c, html as h } from "lit";
2
+ import { property as o, state as f, customElement as x } from "lit/decorators.js";
3
3
  import { classMap as u } from "lit/directives/class-map.js";
4
4
  import { tokenStyles as b } from "@helixui/tokens/lit";
5
- const m = f`
5
+ import { d as m } from "./dev-warn-YlwPHjtX.js";
6
+ const v = p`
6
7
  :host {
7
8
  display: block;
8
9
  }
@@ -122,18 +123,19 @@ const m = f`
122
123
  border-radius: var(--hx-border-radius-sm, 0.25rem);
123
124
  }
124
125
  `;
125
- var v = Object.defineProperty, y = Object.getOwnPropertyDescriptor, l = (e, t, i, a) => {
126
- for (var s = a > 1 ? void 0 : a ? y(t, i) : t, n = e.length - 1, d; n >= 0; n--)
126
+ var y = Object.defineProperty, g = Object.getOwnPropertyDescriptor, l = (e, t, i, a) => {
127
+ for (var s = a > 1 ? void 0 : a ? g(t, i) : t, n = e.length - 1, d; n >= 0; n--)
127
128
  (d = e[n]) && (s = (a ? d(t, i, s) : d(s)) || s);
128
- return a && s && v(t, i, s), s;
129
+ return a && s && y(t, i, s), s;
129
130
  };
130
- const g = /* @__PURE__ */ new Set(["INPUT", "SELECT", "TEXTAREA", "BUTTON"]);
131
- function S(e) {
132
- return g.has(e.tagName) || e.tagName.includes("-");
131
+ const S = /* @__PURE__ */ new Set(["INPUT", "SELECT", "TEXTAREA", "BUTTON"]);
132
+ let E = 0;
133
+ function C(e) {
134
+ return S.has(e.tagName) || e.tagName.includes("-");
133
135
  }
134
136
  let r = class extends _ {
135
137
  constructor() {
136
- super(...arguments), this.label = "", this.required = !1, this.error = "", this.helpText = "", this.disabled = !1, this.hxSize = "md", this.layout = "column", this._hasLabelSlot = !1, this._hasErrorSlot = !1, this._hasHelpSlot = !1, this._fieldId = `hx-field-${crypto.randomUUID().slice(0, 8)}`, this._helpTextId = `${this._fieldId}-help`, this._errorId = `${this._fieldId}-error`, this._a11yDescId = `${this._fieldId}-desc`, this._slottedControl = null, this._a11yDescEl = null;
138
+ super(...arguments), this.label = "", this.required = !1, this.error = "", this.helpText = "", this.disabled = !1, this.hxSize = "md", this.layout = "column", this._hasLabelSlot = !1, this._hasErrorSlot = !1, this._hasHelpSlot = !1, this._fieldId = `hx-field-${++E}`, this._helpTextId = `${this._fieldId}-help`, this._errorId = `${this._fieldId}-error`, this._a11yDescId = `${this._fieldId}-desc`, this._slottedControl = null, this._a11yDescEl = null;
137
139
  }
138
140
  _handleLabelSlotChange(e) {
139
141
  const t = e.target;
@@ -155,8 +157,9 @@ let r = class extends _ {
155
157
  super.disconnectedCallback(), (e = this._a11yDescEl) == null || e.remove(), this._a11yDescEl = null, this._slottedControl && (this._slottedControl.removeAttribute("aria-label"), this._slottedControl.removeAttribute("aria-required"), this._slottedControl.removeAttribute("aria-invalid"), this._slottedControl.removeAttribute("aria-describedby"), this._slottedControl = null);
156
158
  }
157
159
  updated(e) {
158
- super.updated(e), e.has("hxSize") && (["sm", "md", "lg"].includes(this.hxSize) || console.warn(
159
- `[hx-field] Invalid hx-size value: "${this.hxSize}". Expected "sm" | "md" | "lg". Defaulting to "md".`
160
+ super.updated(e), e.has("hxSize") && (["sm", "md", "lg"].includes(this.hxSize) || m(
161
+ "hx-field",
162
+ `Invalid hx-size value: "${this.hxSize}". Expected "sm" | "md" | "lg". Defaulting to "md".`
160
163
  )), this._syncA11yDescEl(), this._syncSlottedControl();
161
164
  }
162
165
  /** Creates a visually-hidden span in light DOM used as the ARIA description anchor. */
@@ -173,7 +176,7 @@ let r = class extends _ {
173
176
  /** Tracks the first form control assigned to the default slot. */
174
177
  _handleDefaultSlotChange(e) {
175
178
  const i = e.target.assignedElements();
176
- this._slottedControl = i.find(S) ?? null, this._syncSlottedControl();
179
+ this._slottedControl = i.find(C) ?? null, this._syncSlottedControl();
177
180
  }
178
181
  /**
179
182
  * Focuses the slotted form control when the shadow DOM label is clicked.
@@ -262,13 +265,13 @@ let r = class extends _ {
262
265
  id=${this._helpTextId}
263
266
  ?hidden=${!t || e}
264
267
  >
265
- <slot name="help" @slotchange=${this._handleHelpSlotChange}>${this.helpText}</slot>
268
+ <slot name="help-text" @slotchange=${this._handleHelpSlotChange}>${this.helpText}</slot>
266
269
  </div>
267
270
  </div>
268
271
  `;
269
272
  }
270
273
  };
271
- r.styles = [b, m];
274
+ r.styles = [b, v];
272
275
  l([
273
276
  o({ type: String })
274
277
  ], r.prototype, "label", 2);
@@ -291,13 +294,13 @@ l([
291
294
  o({ type: String, reflect: !0 })
292
295
  ], r.prototype, "layout", 2);
293
296
  l([
294
- p()
297
+ f()
295
298
  ], r.prototype, "_hasLabelSlot", 2);
296
299
  l([
297
- p()
300
+ f()
298
301
  ], r.prototype, "_hasErrorSlot", 2);
299
302
  l([
300
- p()
303
+ f()
301
304
  ], r.prototype, "_hasHelpSlot", 2);
302
305
  r = l([
303
306
  x("hx-field")
@@ -305,4 +308,4 @@ r = l([
305
308
  export {
306
309
  r as H
307
310
  };
308
- //# sourceMappingURL=hx-field-Dz-7M_SC.js.map
311
+ //# sourceMappingURL=hx-field-CDP8EXuj.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hx-field-CDP8EXuj.js","sources":["../../src/components/hx-field/hx-field.styles.ts","../../src/components/hx-field/hx-field.ts"],"sourcesContent":["import { css } from 'lit';\n\nexport const helixFieldStyles = 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 .field {\n display: flex;\n flex-direction: column;\n gap: var(--hx-field-gap, var(--hx-space-1, 0.25rem));\n font-family: var(--hx-field-font-family, var(--hx-font-family-sans, sans-serif));\n }\n\n /* ─── Inline Layout ─── */\n\n .field--layout-inline {\n flex-direction: row;\n align-items: baseline;\n flex-wrap: wrap;\n }\n\n .field--layout-inline .field__label-wrapper {\n display: flex;\n align-items: baseline;\n flex-shrink: 0;\n min-width: 8rem;\n }\n\n /* ─── Label ─── */\n\n .field__label-wrapper {\n display: contents;\n }\n\n .field__label {\n display: flex;\n align-items: baseline;\n gap: var(--hx-space-1, 0.25rem);\n font-size: var(--hx-font-size-sm, 0.875rem);\n font-weight: var(--hx-font-weight-medium, 500);\n color: var(--hx-field-label-color, var(--hx-color-neutral-700, #374151));\n line-height: var(--hx-line-height-normal, 1.5);\n cursor: pointer;\n }\n\n .field__required-marker {\n color: var(--hx-field-error-color, var(--hx-color-error-text, #b91c1c));\n font-weight: var(--hx-font-weight-bold, 700);\n }\n\n /* ─── Control Wrapper ─── */\n\n .field__control {\n display: block;\n }\n\n /* ─── Error Slot Announcer (visually hidden live region) ─── */\n\n .field__error-slot-announcer {\n position: absolute;\n width: 1px;\n height: 1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n }\n\n /* ─── Size Variants ─── */\n\n :host([hx-size='sm']) .field__label {\n font-size: var(--hx-font-size-xs, 0.75rem);\n }\n\n :host([hx-size='lg']) .field__label {\n font-size: var(--hx-font-size-md, 1rem);\n }\n\n :host([hx-size='sm']) .field__help-text {\n font-size: var(--hx-font-size-xs, 0.75rem);\n }\n\n :host([hx-size='lg']) .field__help-text {\n font-size: var(--hx-font-size-sm, 0.875rem);\n }\n\n /* ─── Help Text & Error Messages ─── */\n\n .field__help-text {\n font-size: var(--hx-font-size-xs, 0.75rem);\n color: var(--hx-field-help-text-color, var(--hx-color-neutral-500, #6b7280));\n line-height: var(--hx-line-height-normal, 1.5);\n }\n\n .field__error {\n font-size: var(--hx-font-size-xs, 0.75rem);\n color: var(--hx-field-error-color, var(--hx-color-error-text, #b91c1c));\n line-height: var(--hx-line-height-normal, 1.5);\n }\n\n /* ─── Error State ─── */\n\n .field--error .field__label {\n color: var(--hx-field-error-color, var(--hx-color-error-text, #b91c1c));\n }\n\n .field--error .field__control {\n outline: 2px solid var(--hx-field-error-color, var(--hx-color-error-500, #ef4444));\n outline-offset: 2px;\n border-radius: var(--hx-border-radius-sm, 0.25rem);\n }\n`;\n","import { LitElement, html, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { tokenStyles } from '@helixui/tokens/lit';\nimport { helixFieldStyles } from './hx-field.styles.js';\nimport { devWarn } from '../../utils/dev-warn.js';\n\n/** Native form control tag names that can receive ARIA attributes. */\nconst FORM_CONTROL_TAGS = new Set(['INPUT', 'SELECT', 'TEXTAREA', 'BUTTON']);\n\nlet _fieldCounter = 0;\n\n/** Returns true if the element is a native form control or a custom element. */\nfunction isFormControl(el: Element): el is HTMLElement {\n return FORM_CONTROL_TAGS.has(el.tagName) || el.tagName.includes('-');\n}\n\n/**\n * Layout wrapper providing consistent label + input + help text + validation\n * message structure for any form control. Use this when wrapping non-HELiX\n * form controls or native HTML elements in the HELiX form field pattern.\n *\n * This component is NOT form-associated — it is a pure visual layout wrapper.\n *\n * **Light DOM side effect:** This component injects a visually-hidden `<span>`\n * into its light DOM children for ARIA describedby linkage across the shadow\n * DOM boundary. This span has `id=\"${fieldId}-desc\"` and is removed on\n * `disconnectedCallback`. This is an intentional, documented accessibility\n * mechanism.\n *\n * @summary Layout wrapper for label, control, help text, and error message.\n *\n * @tag hx-field\n *\n * @slot - The form control element (native or custom).\n * @slot label - Custom label content (overrides the label property).\n * @slot help-text - Custom help text content (overrides the helpText property).\n * @slot error - Custom error content (overrides the error property).\n * @slot description - Additional descriptive content above the control.\n *\n * @csspart field - The outer field container.\n * @csspart label - The label element.\n * @csspart control - The wrapper around slotted content.\n * @csspart help-text - The help text container.\n * @csspart error-message - The error message container.\n * @csspart required-indicator - The required asterisk span.\n *\n * @cssprop [--hx-field-label-color=var(--hx-color-neutral-700)] - Label color.\n * @cssprop [--hx-field-error-color=var(--hx-color-error-500)] - Error color.\n * @cssprop [--hx-field-font-family=var(--hx-font-family-sans)] - Font family.\n * @cssprop [--hx-field-gap=var(--hx-space-1, 0.25rem)] - Gap between field segments.\n * @cssprop [--hx-field-help-text-color=var(--hx-color-neutral-500)] - Help text color.\n */\n@customElement('hx-field')\nexport class HelixField extends LitElement {\n static override styles = [tokenStyles, helixFieldStyles];\n\n // ─── Properties ───\n\n /**\n * The visible label text for the field.\n * @attr label\n */\n @property({ type: String })\n label = '';\n\n /**\n * Whether the field is required. Shows a required indicator on the label.\n * @attr required\n */\n @property({ type: Boolean, reflect: true })\n required = false;\n\n /**\n * Error message to display. When set, the field enters an error state.\n * @attr error\n */\n @property({ type: String })\n error = '';\n\n /**\n * Help text displayed below the control for guidance.\n * @attr help-text\n */\n @property({ type: String, attribute: 'help-text' })\n helpText = '';\n\n /**\n * Visual disabled state applied via opacity. Does not affect slotted control\n * interactivity — set disabled on the slotted control directly.\n * @attr disabled\n */\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n /**\n * Size variant controlling label and help text font sizes.\n * @attr hx-size\n */\n @property({ type: String, attribute: 'hx-size', reflect: true })\n hxSize: 'sm' | 'md' | 'lg' = 'md';\n\n /**\n * Layout variant. 'column' stacks label above control; 'inline' places them side-by-side.\n * @attr layout\n */\n @property({ type: String, reflect: true })\n layout: 'column' | 'inline' = 'column';\n\n // ─── Slot Tracking ───\n\n /**\n * Tracks whether any content is assigned to the label slot, used to conditionally render the label property.\n * @internal\n */\n @state() private _hasLabelSlot = false;\n\n /**\n * Tracks whether any content is assigned to the error slot, used to toggle error state rendering.\n * @internal\n */\n @state() private _hasErrorSlot = false;\n\n /**\n * Tracks whether any content is assigned to the help-text slot, used to toggle help text rendering.\n * @internal\n */\n @state() private _hasHelpSlot = false;\n\n private _handleLabelSlotChange(e: Event): void {\n const slot = e.target as HTMLSlotElement;\n this._hasLabelSlot = slot.assignedElements().length > 0;\n }\n\n private _handleErrorSlotChange(e: Event): void {\n const slot = e.target as HTMLSlotElement;\n this._hasErrorSlot = slot.assignedElements().length > 0;\n }\n\n private _handleHelpSlotChange(e: Event): void {\n const slot = e.target as HTMLSlotElement;\n this._hasHelpSlot = slot.assignedElements().length > 0;\n }\n\n // ─── Unique IDs for Accessibility ───\n\n /**\n * Unique ID for this field instance, used as a base for all derived accessibility IDs.\n * @internal\n */\n private _fieldId = `hx-field-${++_fieldCounter}`;\n\n /**\n * ID for the help text element, allowing aria-describedby to reference it.\n * @internal\n */\n private _helpTextId = `${this._fieldId}-help`;\n\n /**\n * ID for the error message element, allowing aria-describedby to reference it.\n * @internal\n */\n private _errorId = `${this._fieldId}-error`;\n\n /**\n * ID for the light-DOM description span injected for cross-shadow-root aria-describedby linkage.\n * @internal\n */\n private _a11yDescId = `${this._fieldId}-desc`;\n\n // ─── A11y: Slotted control tracking + light-DOM description element ───\n\n /**\n * The first form control in the default slot. We set aria attributes on this\n * element to bridge the shadow DOM accessibility boundary.\n * @internal\n */\n private _slottedControl: HTMLElement | null = null;\n\n /**\n * A visually-hidden span injected into the host's light DOM (assigned to the\n * default slot). Because it lives in the same document as the slotted input,\n * `aria-describedby` can reference its ID without cross-shadow-root IDREF\n * limitations.\n *\n * **Documented side effect:** This element is intentionally injected into the\n * component's light DOM children. It is invisible to users but present in the\n * accessibility tree. It is removed in `disconnectedCallback`. Consumers\n * should not remove or modify this span (identifiable by its `id` ending in\n * `-desc`).\n * @internal\n */\n private _a11yDescEl: HTMLElement | null = null;\n\n override connectedCallback(): void {\n super.connectedCallback();\n this._ensureA11yDescEl();\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this._a11yDescEl?.remove();\n this._a11yDescEl = null;\n // Remove aria attributes we set on the slotted control\n if (this._slottedControl) {\n this._slottedControl.removeAttribute('aria-label');\n this._slottedControl.removeAttribute('aria-required');\n this._slottedControl.removeAttribute('aria-invalid');\n this._slottedControl.removeAttribute('aria-describedby');\n this._slottedControl = null;\n }\n }\n\n override updated(changedProps: Map<string, unknown>): void {\n super.updated(changedProps);\n\n // P2-01: Warn on invalid hxSize values\n if (changedProps.has('hxSize')) {\n const validSizes = ['sm', 'md', 'lg'];\n if (!validSizes.includes(this.hxSize)) {\n devWarn(\n 'hx-field',\n `Invalid hx-size value: \"${this.hxSize}\". Expected \"sm\" | \"md\" | \"lg\". Defaulting to \"md\".`,\n );\n }\n }\n\n this._syncA11yDescEl();\n this._syncSlottedControl();\n }\n\n /** Creates a visually-hidden span in light DOM used as the ARIA description anchor. */\n private _ensureA11yDescEl(): void {\n if (this._a11yDescEl) return;\n const span = document.createElement('span');\n span.id = this._a11yDescId;\n // Visually hidden but present in the accessibility tree\n span.style.cssText =\n 'position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0';\n this.appendChild(span);\n this._a11yDescEl = span;\n }\n\n /** Keeps the light-DOM description span in sync with the current error/help text. */\n private _syncA11yDescEl(): void {\n if (!this._a11yDescEl) return;\n const hasError = !!this.error || this._hasErrorSlot;\n if (hasError && this.error) {\n this._a11yDescEl.textContent = this.error;\n } else if (this.helpText) {\n this._a11yDescEl.textContent = this.helpText;\n } else {\n this._a11yDescEl.textContent = '';\n }\n }\n\n /** Tracks the first form control assigned to the default slot. */\n private _handleDefaultSlotChange(e: Event): void {\n const slot = e.target as HTMLSlotElement;\n const assigned = slot.assignedElements();\n this._slottedControl = assigned.find(isFormControl) ?? null;\n this._syncSlottedControl();\n }\n\n /**\n * Focuses the slotted form control when the shadow DOM label is clicked.\n * The shadow `<label>` cannot use `for`/`id` to link to a slotted input\n * across the shadow boundary, so we handle focus programmatically.\n */\n private _handleLabelClick(_e: Event): void {\n this._slottedControl?.focus();\n }\n\n /**\n * Applies ARIA attributes to the slotted form control, bridging the\n * shadow DOM accessibility boundary.\n *\n * - aria-label: associates the field label with the control\n * - aria-required: communicates required state to AT\n * - aria-invalid: communicates error state to AT\n * - aria-describedby: points to the light-DOM description span\n *\n * **Skip conditions:**\n * - `HX-*` elements manage their own ARIA attributes; bridging is skipped.\n * - Elements with `data-aria-managed` attribute opt out of ARIA mutation;\n * bridging is skipped entirely for those elements.\n */\n private _syncSlottedControl(): void {\n const control = this._slottedControl;\n if (!control) return;\n\n // hx-* elements manage their own ARIA attributes; skip bridging for them\n if (control.tagName.startsWith('HX-')) return;\n\n // Elements that declare data-aria-managed opt out of ARIA mutation\n if (control.hasAttribute('data-aria-managed')) return;\n\n const hasError = !!this.error || this._hasErrorSlot;\n const hasDesc = !!(this.error || this.helpText || this._hasErrorSlot || this._hasHelpSlot);\n\n // Label association: aria-label bridges the shadow DOM boundary\n if (this.label && !this._hasLabelSlot) {\n control.setAttribute('aria-label', this.label);\n } else {\n control.removeAttribute('aria-label');\n }\n\n // Required state\n if (this.required) {\n control.setAttribute('aria-required', 'true');\n } else {\n control.removeAttribute('aria-required');\n }\n\n // Invalid state\n if (hasError) {\n control.setAttribute('aria-invalid', 'true');\n } else {\n control.removeAttribute('aria-invalid');\n }\n\n // Description (error or help text) via light-DOM span\n if (hasDesc) {\n control.setAttribute('aria-describedby', this._a11yDescId);\n } else {\n control.removeAttribute('aria-describedby');\n }\n }\n\n // ─── Render ───\n\n override render() {\n const hasError = !!this.error || this._hasErrorSlot;\n const hasHelp = !!this.helpText || this._hasHelpSlot;\n\n const fieldClasses = {\n field: true,\n 'field--error': hasError,\n 'field--disabled': this.disabled,\n 'field--required': this.required,\n 'field--size-sm': this.hxSize === 'sm',\n 'field--size-md': this.hxSize === 'md',\n 'field--size-lg': this.hxSize === 'lg',\n 'field--layout-inline': this.layout === 'inline',\n };\n\n return html`\n <div part=\"field\" class=${classMap(fieldClasses)}>\n <!-- Label -->\n <div class=\"field__label-wrapper\">\n <slot name=\"label\" @slotchange=${this._handleLabelSlotChange}>\n ${this.label && !this._hasLabelSlot\n ? html`\n <label part=\"label\" class=\"field__label\" @click=${this._handleLabelClick}>\n ${this.label}\n ${this.required\n ? html`<span\n part=\"required-indicator\"\n class=\"field__required-marker\"\n aria-hidden=\"true\"\n >*</span\n >`\n : nothing}\n </label>\n `\n : nothing}\n </slot>\n </div>\n\n <!-- Description -->\n <slot name=\"description\"></slot>\n\n <!-- Control (default slot) -->\n <div part=\"control\" class=\"field__control\">\n <slot @slotchange=${this._handleDefaultSlotChange}></slot>\n </div>\n\n <!-- Error -->\n <slot name=\"error\" @slotchange=${this._handleErrorSlotChange}>\n ${this.error\n ? html`\n <div part=\"error-message\" class=\"field__error\" id=${this._errorId} role=\"alert\">\n ${this.error}\n </div>\n `\n : nothing}\n </slot>\n\n <!-- Slotted error live region — ensures slotted error content is announced -->\n <div aria-live=\"assertive\" class=\"field__error-slot-announcer\"></div>\n\n <!-- Help text (always in DOM so slot detection works; hidden when no help or error is shown) -->\n <div\n part=\"help-text\"\n class=\"field__help-text\"\n id=${this._helpTextId}\n ?hidden=${!hasHelp || hasError}\n >\n <slot name=\"help-text\" @slotchange=${this._handleHelpSlotChange}>${this.helpText}</slot>\n </div>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'hx-field': HelixField;\n }\n}\n"],"names":["helixFieldStyles","css","FORM_CONTROL_TAGS","_fieldCounter","isFormControl","el","HelixField","LitElement","slot","_a","changedProps","devWarn","span","assigned","_e","control","hasError","hasDesc","hasHelp","fieldClasses","html","classMap","nothing","tokenStyles","__decorateClass","property","state","customElement"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { css as b, LitElement as g, nothing as c, html as p } from "lit";
2
- import { property as l, state as x, query as _, customElement as y } from "lit/decorators.js";
1
+ import { css as b, LitElement as g, nothing as p, html as c } from "lit";
2
+ import { property as a, state as x, query as _, customElement as y } from "lit/decorators.js";
3
3
  import { classMap as w } from "lit/directives/class-map.js";
4
4
  import { ifDefined as v } from "lit/directives/if-defined.js";
5
5
  import { repeat as $ } from "lit/directives/repeat.js";
@@ -63,14 +63,16 @@ const F = b`
63
63
  }
64
64
 
65
65
  .dropzone:focus-visible {
66
- outline: none;
67
- border-color: var(--hx-focus-ring-color, #2563eb);
68
- box-shadow: 0 0 0 var(--hx-focus-ring-width, 2px)
69
- color-mix(
70
- in srgb,
71
- var(--hx-focus-ring-color, #2563eb) calc(var(--hx-focus-ring-opacity, 0.25) * 100%),
72
- transparent
66
+ outline: var(--hx-focus-ring-width, 2px) solid
67
+ var(
68
+ --hx-file-upload-focus-ring-color,
69
+ var(--hx-focus-ring-color, var(--hx-color-primary-500))
73
70
  );
71
+ outline-offset: var(--hx-focus-ring-offset, 2px);
72
+ border-color: var(
73
+ --hx-file-upload-focus-ring-color,
74
+ var(--hx-focus-ring-color, var(--hx-color-primary-500))
75
+ );
74
76
  }
75
77
 
76
78
  .dropzone--drag-over {
@@ -182,8 +184,12 @@ const F = b`
182
184
  }
183
185
 
184
186
  .file-item__remove:focus-visible {
185
- outline: var(--hx-focus-ring-width, 2px) solid var(--hx-focus-ring-color, #2563eb);
186
- outline-offset: 2px;
187
+ outline: var(--hx-focus-ring-width, 2px) solid
188
+ var(
189
+ --hx-file-upload-focus-ring-color,
190
+ var(--hx-focus-ring-color, var(--hx-color-primary-500))
191
+ );
192
+ outline-offset: var(--hx-focus-ring-offset, 2px);
187
193
  }
188
194
 
189
195
  @media (prefers-reduced-motion: reduce) {
@@ -238,14 +244,14 @@ const F = b`
238
244
  line-height: var(--hx-line-height-normal, 1.5);
239
245
  }
240
246
  `;
241
- var k = Object.defineProperty, D = Object.getOwnPropertyDescriptor, a = (e, r, i, t) => {
242
- for (var o = t > 1 ? void 0 : t ? D(r, i) : r, h = e.length - 1, n; h >= 0; h--)
243
- (n = e[h]) && (o = (t ? n(r, i, o) : n(o)) || o);
247
+ var k = Object.defineProperty, D = Object.getOwnPropertyDescriptor, l = (e, r, i, t) => {
248
+ for (var o = t > 1 ? void 0 : t ? D(r, i) : r, d = e.length - 1, n; d >= 0; d--)
249
+ (n = e[d]) && (o = (t ? n(r, i, o) : n(o)) || o);
244
250
  return t && o && k(r, i, o), o;
245
251
  };
246
252
  let I = 0, s = class extends g {
247
253
  constructor() {
248
- super(), this.name = "", this.accept = "", this.maxSize = 0, this.maxFiles = 0, this.multiple = !1, this.label = "", this.disabled = !1, this.error = "", this._files = [], this._dragOver = !1, this._hasFileListSlot = !1, this._baseId = `hx-file-upload-${++I}`, this._labelId = `${this._baseId}-label`, this._errorId = `${this._baseId}-error`, this._dropzoneId = `${this._baseId}-dropzone`, this._liveId = `${this._baseId}-live`, this._internals = this.attachInternals();
254
+ super(), this.name = "", this.accept = "", this.maxSize = 0, this.maxFiles = 0, this.multiple = !1, this.label = "", this.disabled = !1, this.error = "", this.labelDropzone = "Drag files here or click to browse", this._files = [], this._dragOver = !1, this._hasFileListSlot = !1, this._baseId = `hx-file-upload-${++I}`, this._labelId = `${this._baseId}-label`, this._errorId = `${this._baseId}-error`, this._dropzoneId = `${this._baseId}-dropzone`, this._liveId = `${this._baseId}-live`, this._internals = this.attachInternals();
249
255
  }
250
256
  // ─── Slot Handling ───
251
257
  _handleFileListSlotChange(e) {
@@ -330,9 +336,9 @@ let I = 0, s = class extends g {
330
336
  _processFiles(e) {
331
337
  if (this.disabled) return;
332
338
  const r = this.multiple ? e : e.slice(0, 1), i = [], t = [], o = [];
333
- for (const d of r) {
334
- const m = this._validateFile(d);
335
- m ? (t.push(d), o.push(m)) : i.push(d);
339
+ for (const h of r) {
340
+ const m = this._validateFile(h);
341
+ m ? (t.push(h), o.push(m)) : i.push(h);
336
342
  }
337
343
  if (t.length > 0 && this.dispatchEvent(
338
344
  new CustomEvent("hx-error", {
@@ -341,7 +347,7 @@ let I = 0, s = class extends g {
341
347
  detail: { message: o.join(" "), files: t }
342
348
  })
343
349
  ), i.length === 0) return;
344
- const h = this.multiple ? this._files.length : 0, n = this.maxFiles > 0 ? Math.max(0, this.maxFiles - h) : i.length, f = i.slice(0, n);
350
+ const d = this.multiple ? this._files.length : 0, n = this.maxFiles > 0 ? Math.max(0, this.maxFiles - d) : i.length, f = i.slice(0, n);
345
351
  if (f.length === 0 && this.maxFiles > 0) {
346
352
  this.dispatchEvent(
347
353
  new CustomEvent("hx-error", {
@@ -356,8 +362,8 @@ let I = 0, s = class extends g {
356
362
  return;
357
363
  }
358
364
  if (f.length > 0) {
359
- const d = f.map((m) => ({ file: m, progress: 0 }));
360
- this.multiple ? this._files = [...this._files, ...d] : this._files = d, this.dispatchEvent(
365
+ const h = f.map((m) => ({ file: m, progress: 0 }));
366
+ this.multiple ? this._files = [...this._files, ...h] : this._files = h, this.dispatchEvent(
361
367
  new CustomEvent("hx-upload", {
362
368
  bubbles: !0,
363
369
  composed: !0,
@@ -449,12 +455,12 @@ let I = 0, s = class extends g {
449
455
  }
450
456
  // ─── Render Helpers ───
451
457
  _renderFileList() {
452
- return this._hasFileListSlot ? c : this._files.length === 0 ? c : p`
458
+ return this._hasFileListSlot ? p : this._files.length === 0 ? p : c`
453
459
  <ul part="file-list" class="file-list" aria-label="Selected files">
454
460
  ${$(
455
461
  this._files,
456
462
  (e) => e.file.name + e.file.size,
457
- (e, r) => p`
463
+ (e, r) => c`
458
464
  <li part="file-item" class="file-item">
459
465
  <div class="file-item__row">
460
466
  <span class="file-item__name" title=${e.file.name}> ${e.file.name} </span>
@@ -506,14 +512,14 @@ let I = 0, s = class extends g {
506
512
  dropzone: !0,
507
513
  "dropzone--drag-over": this._dragOver,
508
514
  "dropzone--error": e
509
- }, i = this.label ? `${this.label} — Drag files here or click to browse` : "Drag files here or click to browse";
510
- return p`
515
+ }, i = this.label ? `${this.label} — ${this.labelDropzone}` : this.labelDropzone;
516
+ return c`
511
517
  <div class="field">
512
- ${this.label ? p`
518
+ ${this.label ? c`
513
519
  <label part="label" class="field__label" id=${this._labelId} for=${this._dropzoneId}>
514
520
  ${this.label}
515
521
  </label>
516
- ` : c}
522
+ ` : p}
517
523
 
518
524
  <div
519
525
  part="dropzone"
@@ -521,9 +527,9 @@ let I = 0, s = class extends g {
521
527
  id=${this._dropzoneId}
522
528
  role="button"
523
529
  tabindex=${this.disabled ? "-1" : "0"}
524
- aria-label=${i}
530
+ aria-label=${v(this.label ? void 0 : i)}
525
531
  aria-labelledby=${v(this.label ? this._labelId : void 0)}
526
- aria-disabled=${this.disabled ? "true" : c}
532
+ aria-disabled=${this.disabled ? "true" : p}
527
533
  aria-describedby=${v(e ? this._errorId : void 0)}
528
534
  @click=${this._handleDropzoneClick}
529
535
  @keydown=${this._handleDropzoneKeyDown}
@@ -531,7 +537,7 @@ let I = 0, s = class extends g {
531
537
  @dragleave=${this._handleDragLeave}
532
538
  @drop=${this._handleDrop}
533
539
  >
534
- <slot>Drag files here or click to browse</slot>
540
+ <slot>${this.labelDropzone}</slot>
535
541
  </div>
536
542
 
537
543
  <input
@@ -548,7 +554,7 @@ let I = 0, s = class extends g {
548
554
  <slot name="file-list" @slotchange=${this._handleFileListSlotChange}></slot>
549
555
 
550
556
  ${this._renderFileList()}
551
- ${e ? p`
557
+ ${e ? c`
552
558
  <div
553
559
  part="error"
554
560
  class="field__error"
@@ -558,7 +564,7 @@ let I = 0, s = class extends g {
558
564
  >
559
565
  ${this.error}
560
566
  </div>
561
- ` : c}
567
+ ` : p}
562
568
 
563
569
  <div id=${this._liveId} class="sr-only" aria-live="assertive" aria-atomic="true">
564
570
  ${this._dragOver ? "File detected. Release to upload." : ""}
@@ -569,46 +575,49 @@ let I = 0, s = class extends g {
569
575
  };
570
576
  s.styles = [z, F];
571
577
  s.formAssociated = !0;
572
- a([
573
- l({ type: String })
578
+ l([
579
+ a({ type: String })
574
580
  ], s.prototype, "name", 2);
575
- a([
576
- l({ type: String })
581
+ l([
582
+ a({ type: String })
577
583
  ], s.prototype, "accept", 2);
578
- a([
579
- l({ type: Number, attribute: "max-size" })
584
+ l([
585
+ a({ type: Number, attribute: "max-size" })
580
586
  ], s.prototype, "maxSize", 2);
581
- a([
582
- l({ type: Number, attribute: "max-files" })
587
+ l([
588
+ a({ type: Number, attribute: "max-files" })
583
589
  ], s.prototype, "maxFiles", 2);
584
- a([
585
- l({ type: Boolean })
590
+ l([
591
+ a({ type: Boolean })
586
592
  ], s.prototype, "multiple", 2);
587
- a([
588
- l({ type: String })
593
+ l([
594
+ a({ type: String })
589
595
  ], s.prototype, "label", 2);
590
- a([
591
- l({ type: Boolean, reflect: !0 })
596
+ l([
597
+ a({ type: Boolean, reflect: !0 })
592
598
  ], s.prototype, "disabled", 2);
593
- a([
594
- l({ type: String })
599
+ l([
600
+ a({ type: String })
595
601
  ], s.prototype, "error", 2);
596
- a([
602
+ l([
603
+ a({ type: String, attribute: "label-dropzone" })
604
+ ], s.prototype, "labelDropzone", 2);
605
+ l([
597
606
  x()
598
607
  ], s.prototype, "_files", 2);
599
- a([
608
+ l([
600
609
  x()
601
610
  ], s.prototype, "_dragOver", 2);
602
- a([
611
+ l([
603
612
  x()
604
613
  ], s.prototype, "_hasFileListSlot", 2);
605
- a([
614
+ l([
606
615
  _(".file-input")
607
616
  ], s.prototype, "_fileInput", 2);
608
- s = a([
617
+ s = l([
609
618
  y("hx-file-upload")
610
619
  ], s);
611
620
  export {
612
621
  s as H
613
622
  };
614
- //# sourceMappingURL=hx-file-upload-DnYiIhyN.js.map
623
+ //# sourceMappingURL=hx-file-upload-9HbONfqt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hx-file-upload-9HbONfqt.js","sources":["../../src/components/hx-file-upload/hx-file-upload.styles.ts","../../src/components/hx-file-upload/hx-file-upload.ts"],"sourcesContent":["import { css } from 'lit';\n\nexport const helixFileUploadStyles = 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 .field {\n display: flex;\n flex-direction: column;\n gap: var(--hx-space-2, 0.5rem);\n font-family: var(--hx-font-family-sans, sans-serif);\n }\n\n /* ─── Label ─── */\n\n .field__label {\n display: flex;\n align-items: baseline;\n gap: var(--hx-space-1, 0.25rem);\n font-size: var(--hx-font-size-sm, 0.875rem);\n font-weight: var(--hx-font-weight-medium, 500);\n color: var(--hx-color-neutral-700, #343a40);\n line-height: var(--hx-line-height-normal, 1.5);\n }\n\n /* ─── Dropzone ─── */\n\n .dropzone {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: var(--hx-space-2, 0.5rem);\n min-height: var(--hx-size-32, 8rem);\n padding: var(--hx-space-6, 1.5rem) var(--hx-space-4, 1rem);\n border: var(--hx-border-width-thin, 1px) dashed\n var(--hx-file-upload-dropzone-border-color, var(--hx-color-neutral-300, #ced4da));\n border-radius: var(--hx-file-upload-dropzone-border-radius, var(--hx-border-radius-lg, 0.5rem));\n background-color: var(--hx-file-upload-dropzone-bg, var(--hx-color-neutral-50, #f8f9fa));\n cursor: pointer;\n text-align: center;\n transition:\n border-color var(--hx-transition-fast, 150ms ease),\n background-color var(--hx-transition-fast, 150ms ease),\n box-shadow var(--hx-transition-fast, 150ms ease);\n user-select: none;\n color: var(--hx-color-neutral-600, #495057);\n font-size: var(--hx-font-size-sm, 0.875rem);\n }\n\n .dropzone:focus-visible {\n outline: var(--hx-focus-ring-width, 2px) solid\n var(\n --hx-file-upload-focus-ring-color,\n var(--hx-focus-ring-color, var(--hx-color-primary-500))\n );\n outline-offset: var(--hx-focus-ring-offset, 2px);\n border-color: var(\n --hx-file-upload-focus-ring-color,\n var(--hx-focus-ring-color, var(--hx-color-primary-500))\n );\n }\n\n .dropzone--drag-over {\n border-color: var(--hx-color-primary-500, #2563eb);\n background-color: var(\n --hx-file-upload-dropzone-active-bg,\n color-mix(\n in srgb,\n var(--hx-color-primary-500, #2563eb) 8%,\n var(--hx-color-neutral-0, #ffffff)\n )\n );\n border-style: solid;\n }\n\n .dropzone--error {\n border-color: var(--hx-file-upload-error-color, var(--hx-color-error-500, #dc3545));\n }\n\n @media (prefers-reduced-motion: reduce) {\n .dropzone {\n transition: none;\n }\n }\n\n /* ─── Hidden file input ─── */\n\n .file-input {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border-width: 0;\n }\n\n /* ─── File list ─── */\n\n .file-list {\n display: flex;\n flex-direction: column;\n gap: var(--hx-space-2, 0.5rem);\n list-style: none;\n margin: 0;\n padding: 0;\n }\n\n .file-list:empty {\n display: none;\n }\n\n /* ─── File item ─── */\n\n .file-item {\n display: flex;\n flex-direction: column;\n gap: var(--hx-space-1, 0.25rem);\n padding: var(--hx-space-2, 0.5rem) var(--hx-space-3, 0.75rem);\n border: var(--hx-border-width-thin, 1px) solid var(--hx-color-neutral-200, #e9ecef);\n border-radius: var(--hx-border-radius-md, 0.375rem);\n background-color: var(--hx-color-neutral-0, #ffffff);\n }\n\n .file-item__row {\n display: flex;\n align-items: center;\n gap: var(--hx-space-2, 0.5rem);\n }\n\n .file-item__name {\n flex: 1;\n font-size: var(--hx-font-size-sm, 0.875rem);\n font-weight: var(--hx-font-weight-medium, 500);\n color: var(--hx-color-neutral-800, #212529);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .file-item__size {\n flex-shrink: 0;\n font-size: var(--hx-font-size-xs, 0.75rem);\n color: var(--hx-color-neutral-500, #6c757d);\n }\n\n .file-item__remove {\n flex-shrink: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: var(--hx-space-1, 0.25rem);\n border: none;\n border-radius: var(--hx-border-radius-sm, 0.25rem);\n background: transparent;\n color: var(--hx-color-neutral-500, #6c757d);\n cursor: pointer;\n line-height: 1;\n transition:\n color var(--hx-transition-fast, 150ms ease),\n background-color var(--hx-transition-fast, 150ms ease);\n }\n\n .file-item__remove:hover {\n color: var(--hx-file-upload-error-color, var(--hx-color-error-text, #b91c1c));\n background-color: color-mix(in srgb, var(--hx-color-error-500, #dc3545) 8%, transparent);\n }\n\n .file-item__remove:focus-visible {\n outline: var(--hx-focus-ring-width, 2px) solid\n var(\n --hx-file-upload-focus-ring-color,\n var(--hx-focus-ring-color, var(--hx-color-primary-500))\n );\n outline-offset: var(--hx-focus-ring-offset, 2px);\n }\n\n @media (prefers-reduced-motion: reduce) {\n .file-item__remove {\n transition: none;\n }\n }\n\n /* ─── Progress bar ─── */\n\n .progress-track {\n width: 100%;\n height: 4px;\n background-color: var(--hx-color-neutral-200, #e9ecef);\n border-radius: var(--hx-border-radius-full, 9999px);\n overflow: hidden;\n }\n\n .progress-bar {\n height: 100%;\n background-color: var(--hx-file-upload-progress-color, var(--hx-color-primary-500, #2563eb));\n border-radius: inherit;\n transition: width var(--hx-transition-fast, 150ms ease);\n width: 0%;\n }\n\n @media (prefers-reduced-motion: reduce) {\n .progress-bar {\n transition: none;\n }\n }\n\n /* ─── Screen-reader only utility ─── */\n\n .sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border-width: 0;\n }\n\n /* ─── Error message ─── */\n\n .field__error {\n font-size: var(--hx-font-size-xs, 0.75rem);\n color: var(--hx-file-upload-error-color, var(--hx-color-error-text, #b91c1c));\n line-height: var(--hx-line-height-normal, 1.5);\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 { repeat } from 'lit/directives/repeat.js';\nimport { tokenStyles } from '@helixui/tokens/lit';\nimport { helixFileUploadStyles } from './hx-file-upload.styles.js';\n\n// Module-level counter for stable, SSR-safe IDs (avoids Math.random() hydration mismatch)\nlet _hxFileUploadIdCounter = 0;\n\ninterface FileEntry {\n file: File;\n progress: number;\n}\n\n/**\n * A drag-and-drop file upload component with client-side validation,\n * file list management, per-file progress, and native form association.\n *\n * @summary Form-associated file upload dropzone with drag-and-drop, validation, and progress tracking.\n *\n * @tag hx-file-upload\n *\n * @slot - Default dropzone content. Replaces the built-in \"Drag files here or click to browse\" prompt.\n * @slot file-list - Custom file list display. When provided, the built-in file list is hidden.\n *\n * @fires {CustomEvent<{files: File[]}>} hx-upload - Dispatched when valid files are selected via drag-and-drop or the file picker.\n * @fires {CustomEvent<{file: File, index: number}>} hx-remove - Dispatched when a file is removed from the list.\n * @fires {CustomEvent<{message: string, files: File[]}>} hx-error - Dispatched when file validation fails (type or size constraint).\n *\n * @csspart dropzone - The drag-and-drop target area.\n * @csspart file-list - The container wrapping the list of selected files.\n * @csspart file-item - An individual file entry in the list.\n * @csspart progress - The progress bar track for a file item.\n * @csspart label - The visible label element.\n * @csspart error - The error message container below the dropzone.\n *\n * @cssprop [--hx-file-upload-dropzone-bg=var(--hx-color-neutral-50)] - Dropzone background color.\n * @cssprop [--hx-file-upload-dropzone-border-color=var(--hx-color-neutral-300)] - Dropzone border color.\n * @cssprop [--hx-file-upload-dropzone-border-radius=var(--hx-border-radius-lg)] - Dropzone border radius.\n * @cssprop [--hx-file-upload-dropzone-active-bg] - Dropzone background when a file is dragged over.\n * @cssprop [--hx-file-upload-progress-color=var(--hx-color-primary-500)] - Progress bar fill color.\n * @cssprop [--hx-file-upload-error-color=var(--hx-color-error-500)] - Error state and remove-button hover color.\n */\n@customElement('hx-file-upload')\nexport class HelixFileUpload extends LitElement {\n static override styles = [tokenStyles, helixFileUploadStyles];\n\n // ─── Form Association ───\n\n /** Marks this element as form-associated for ElementInternals support. @internal */\n static formAssociated = true;\n\n /** Holds the ElementInternals instance used for form value and validity management. @internal */\n private _internals: ElementInternals;\n\n constructor() {\n super();\n this._internals = this.attachInternals();\n }\n\n // ─── Properties ───\n\n /**\n * The form field name used during form submission.\n * @attr name\n */\n @property({ type: String })\n name = '';\n\n /**\n * Accepted file types as a comma-separated list of MIME types or extensions.\n * Mirrors the native `<input type=\"file\" accept>` attribute.\n * @attr accept\n */\n @property({ type: String })\n accept = '';\n\n /**\n * Maximum allowed file size in bytes. 0 means unlimited.\n * @attr max-size\n */\n @property({ type: Number, attribute: 'max-size' })\n maxSize = 0;\n\n /**\n * Maximum number of files that can be selected. 0 means unlimited.\n * @attr max-files\n */\n @property({ type: Number, attribute: 'max-files' })\n maxFiles = 0;\n\n /**\n * Whether multiple files may be selected at once.\n * @attr multiple\n */\n @property({ type: Boolean })\n multiple = false;\n\n /**\n * Visible label text for the dropzone.\n * @attr label\n */\n @property({ type: String })\n label = '';\n\n /**\n * Whether the component is disabled.\n * @attr disabled\n */\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n /**\n * Error message displayed below the dropzone. Also puts the dropzone in an error visual state.\n * @attr error\n */\n @property({ type: String })\n error = '';\n\n /**\n * Instructional text shown in the dropzone when no custom slot content is provided.\n * Also used as the accessible label for the dropzone.\n * @attr label-dropzone\n */\n @property({ type: String, attribute: 'label-dropzone' })\n labelDropzone = 'Drag files here or click to browse';\n\n // ─── Internal State ───\n\n /** The list of currently selected file entries, each with a file reference and upload progress. @internal */\n @state() private _files: FileEntry[] = [];\n /** Whether a file is currently being dragged over the dropzone. @internal */\n @state() private _dragOver = false;\n /** Whether the named file-list slot contains projected content. @internal */\n @state() private _hasFileListSlot = false;\n\n // ─── Internal References ───\n\n /** Reference to the hidden native file input element used to open the OS file picker. @internal */\n @query('.file-input')\n private _fileInput: HTMLInputElement | null | undefined;\n\n // ─── Stable IDs ───\n\n private readonly _baseId = `hx-file-upload-${++_hxFileUploadIdCounter}`;\n private readonly _labelId = `${this._baseId}-label`;\n private readonly _errorId = `${this._baseId}-error`;\n private readonly _dropzoneId = `${this._baseId}-dropzone`;\n private readonly _liveId = `${this._baseId}-live`;\n\n // ─── Slot Handling ───\n\n private _handleFileListSlotChange(e: Event): void {\n const slot = e.target as HTMLSlotElement;\n this._hasFileListSlot = slot.assignedElements({ 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('_files') || changedProperties.has('name')) {\n this._syncFormValue();\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 component 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 /** Called by the form when it resets. */\n formResetCallback(): void {\n this._files = [];\n this._internals.setFormValue(null);\n }\n\n private _syncFormValue(): void {\n if (this._files.length === 0) {\n this._internals.setFormValue(null);\n return;\n }\n\n if (this._files.length === 1) {\n // Single file — pass directly as File (accepted by setFormValue)\n const firstEntry = this._files[0];\n if (firstEntry) {\n this._internals.setFormValue(firstEntry.file);\n }\n return;\n }\n\n // Multiple files — use FormData so all files are submitted under the same name\n const formData = new FormData();\n for (const entry of this._files) {\n formData.append(this.name, entry.file, entry.file.name);\n }\n this._internals.setFormValue(formData);\n }\n\n // ─── Validation ───\n\n /**\n * Validates a file against `accept` and `maxSize` constraints.\n * Returns null on success, or an error message string on failure.\n */\n private _validateFile(file: File): string | null {\n if (this.accept) {\n const accepted = this._isAccepted(file);\n if (!accepted) {\n return `\"${file.name}\" has an unsupported file type. Accepted types: ${this.accept}`;\n }\n }\n\n if (this.maxSize > 0 && file.size > this.maxSize) {\n const maxMb = (this.maxSize / (1024 * 1024)).toFixed(1);\n return `\"${file.name}\" exceeds the maximum size of ${maxMb} MB.`;\n }\n\n return null;\n }\n\n /**\n * Checks whether a file is accepted given the `accept` attribute value.\n * Handles MIME types (e.g. \"image/png\"), wildcard MIME types (e.g. \"image/*\"),\n * and extensions (e.g. \".pdf\").\n */\n private _isAccepted(file: File): boolean {\n const tokens = this.accept.split(',').map((t) => t.trim().toLowerCase());\n\n for (const token of tokens) {\n if (token.startsWith('.')) {\n // Extension match\n if (file.name.toLowerCase().endsWith(token)) return true;\n } else if (token.endsWith('/*')) {\n // Wildcard MIME type e.g. \"image/*\"\n const baseType = token.slice(0, -2);\n if (file.type.toLowerCase().startsWith(baseType)) return true;\n } else {\n // Exact MIME type\n if (file.type.toLowerCase() === token) return true;\n }\n }\n\n return false;\n }\n\n // ─── File Processing ───\n\n private _processFiles(rawFiles: File[]): void {\n if (this.disabled) return;\n\n const candidateFiles = this.multiple ? rawFiles : rawFiles.slice(0, 1);\n const validFiles: File[] = [];\n const invalidFiles: File[] = [];\n const errorMessages: string[] = [];\n\n for (const file of candidateFiles) {\n const validationError = this._validateFile(file);\n if (validationError) {\n invalidFiles.push(file);\n errorMessages.push(validationError);\n } else {\n validFiles.push(file);\n }\n }\n\n if (invalidFiles.length > 0) {\n this.dispatchEvent(\n new CustomEvent('hx-error', {\n bubbles: true,\n composed: true,\n detail: { message: errorMessages.join(' '), files: invalidFiles },\n }),\n );\n }\n\n if (validFiles.length === 0) return;\n\n // Enforce maxFiles limit (only in multiple mode — single-file mode always replaces)\n const currentCount = this.multiple ? this._files.length : 0;\n const capacity =\n this.maxFiles > 0 ? Math.max(0, this.maxFiles - currentCount) : validFiles.length;\n const allowedFiles = validFiles.slice(0, capacity);\n\n if (allowedFiles.length === 0 && this.maxFiles > 0) {\n this.dispatchEvent(\n new CustomEvent('hx-error', {\n bubbles: true,\n composed: true,\n detail: {\n message: `Maximum of ${this.maxFiles} file${this.maxFiles === 1 ? '' : 's'} allowed.`,\n files: validFiles,\n },\n }),\n );\n return;\n }\n\n if (allowedFiles.length > 0) {\n const newEntries: FileEntry[] = allowedFiles.map((file) => ({ file, progress: 0 }));\n\n if (this.multiple) {\n this._files = [...this._files, ...newEntries];\n } else {\n this._files = newEntries;\n }\n\n this.dispatchEvent(\n new CustomEvent('hx-upload', {\n bubbles: true,\n composed: true,\n detail: { files: allowedFiles },\n }),\n );\n }\n\n // If remaining valid files were cut by maxFiles, report that too\n const overflow = validFiles.slice(capacity);\n if (overflow.length > 0 && this.maxFiles > 0) {\n this.dispatchEvent(\n new CustomEvent('hx-error', {\n bubbles: true,\n composed: true,\n detail: {\n message: `Maximum of ${this.maxFiles} file${this.maxFiles === 1 ? '' : 's'} allowed. ${overflow.length} file${overflow.length === 1 ? ' was' : 's were'} not added.`,\n files: overflow,\n },\n }),\n );\n }\n }\n\n // ─── Public Methods ───\n\n /**\n * Sets the upload progress for a file at the given index.\n * @param index - Zero-based index into the current file list.\n * @param percent - Progress percentage from 0 to 100.\n */\n setProgress(index: number, percent: number): void {\n if (index < 0 || index >= this._files.length) return;\n const clamped = Math.max(0, Math.min(100, percent));\n this._files = this._files.map((entry, i) =>\n i === index ? { ...entry, progress: clamped } : entry,\n );\n }\n\n /**\n * Returns a read-only copy of the currently selected files.\n */\n get files(): File[] {\n return this._files.map((e) => e.file);\n }\n\n // ─── Drag and Drop Handlers ───\n\n private _handleDragOver(e: DragEvent): void {\n e.preventDefault();\n if (this.disabled) return;\n this._dragOver = true;\n }\n\n private _handleDragLeave(e: DragEvent): void {\n // Only clear drag state when leaving the dropzone entirely\n const target = e.relatedTarget as Node | null;\n if (target && this.contains(target)) return;\n const dropzone = this.shadowRoot?.querySelector('.dropzone');\n if (dropzone && dropzone.contains(target)) return;\n this._dragOver = false;\n }\n\n private _handleDrop(e: DragEvent): void {\n e.preventDefault();\n this._dragOver = false;\n if (this.disabled) return;\n\n const dt = e.dataTransfer;\n if (!dt) return;\n\n const rawFiles = Array.from(dt.files);\n if (rawFiles.length === 0) return;\n\n this._processFiles(rawFiles);\n }\n\n // ─── Click / Keyboard Handlers ───\n\n private _handleDropzoneClick(): void {\n if (this.disabled) return;\n this._fileInput?.click();\n }\n\n private _handleDropzoneKeyDown(e: KeyboardEvent): void {\n if (this.disabled) return;\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n this._fileInput?.click();\n }\n }\n\n private _handleFileInputChange(e: Event): void {\n const input = e.target as HTMLInputElement;\n if (!input.files || input.files.length === 0) return;\n\n const rawFiles = Array.from(input.files);\n // Reset the input so the same file can be re-selected after removal\n input.value = '';\n this._processFiles(rawFiles);\n }\n\n // ─── Remove Handler ───\n\n private _handleRemove(index: number): void {\n if (this.disabled) return;\n const entry = this._files[index];\n if (!entry) return;\n\n const removedFile = entry.file;\n this._files = this._files.filter((_, i) => i !== index);\n\n this.dispatchEvent(\n new CustomEvent('hx-remove', {\n bubbles: true,\n composed: true,\n detail: { file: removedFile, index },\n }),\n );\n }\n\n // ─── Formatters ───\n\n private _formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n }\n\n // ─── Render Helpers ───\n\n private _renderFileList() {\n if (this._hasFileListSlot) return nothing;\n if (this._files.length === 0) return nothing;\n\n return html`\n <ul part=\"file-list\" class=\"file-list\" aria-label=\"Selected files\">\n ${repeat(\n this._files,\n (entry) => entry.file.name + entry.file.size,\n (entry, index) => html`\n <li part=\"file-item\" class=\"file-item\">\n <div class=\"file-item__row\">\n <span class=\"file-item__name\" title=${entry.file.name}> ${entry.file.name} </span>\n <span class=\"file-item__size\">${this._formatSize(entry.file.size)}</span>\n <button\n type=\"button\"\n class=\"file-item__remove\"\n aria-label=${`Remove ${entry.file.name}`}\n @click=${() => this._handleRemove(index)}\n >\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path\n d=\"M1 1L13 13M13 1L1 13\"\n stroke=\"currentColor\"\n stroke-width=\"1.75\"\n stroke-linecap=\"round\"\n />\n </svg>\n </button>\n </div>\n <div\n part=\"progress\"\n class=\"progress-track\"\n role=\"progressbar\"\n aria-valuenow=${entry.progress}\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n aria-label=${`Upload progress for ${entry.file.name}: ${entry.progress}%`}\n >\n <div class=\"progress-bar\" style=\"width: ${entry.progress}%\"></div>\n </div>\n </li>\n `,\n )}\n </ul>\n `;\n }\n\n // ─── Render ───\n\n override render() {\n const hasError = !!this.error;\n\n const dropzoneClasses = {\n dropzone: true,\n 'dropzone--drag-over': this._dragOver,\n 'dropzone--error': hasError,\n };\n\n const dropzoneLabel = this.label ? `${this.label} — ${this.labelDropzone}` : this.labelDropzone;\n\n return html`\n <div class=\"field\">\n ${this.label\n ? html`\n <label part=\"label\" class=\"field__label\" id=${this._labelId} for=${this._dropzoneId}>\n ${this.label}\n </label>\n `\n : nothing}\n\n <div\n part=\"dropzone\"\n class=${classMap(dropzoneClasses)}\n id=${this._dropzoneId}\n role=\"button\"\n tabindex=${this.disabled ? '-1' : '0'}\n aria-label=${ifDefined(!this.label ? dropzoneLabel : undefined)}\n aria-labelledby=${ifDefined(this.label ? this._labelId : undefined)}\n aria-disabled=${this.disabled ? 'true' : nothing}\n aria-describedby=${ifDefined(hasError ? this._errorId : undefined)}\n @click=${this._handleDropzoneClick}\n @keydown=${this._handleDropzoneKeyDown}\n @dragover=${this._handleDragOver}\n @dragleave=${this._handleDragLeave}\n @drop=${this._handleDrop}\n >\n <slot>${this.labelDropzone}</slot>\n </div>\n\n <input\n class=\"file-input\"\n type=\"file\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n accept=${ifDefined(this.accept || undefined)}\n ?multiple=${this.multiple}\n ?disabled=${this.disabled}\n @change=${this._handleFileInputChange}\n />\n\n <slot name=\"file-list\" @slotchange=${this._handleFileListSlotChange}></slot>\n\n ${this._renderFileList()}\n ${hasError\n ? html`\n <div\n part=\"error\"\n class=\"field__error\"\n id=${this._errorId}\n role=\"alert\"\n aria-live=\"polite\"\n >\n ${this.error}\n </div>\n `\n : nothing}\n\n <div id=${this._liveId} class=\"sr-only\" aria-live=\"assertive\" aria-atomic=\"true\">\n ${this._dragOver ? 'File detected. Release to upload.' : ''}\n </div>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'hx-file-upload': HelixFileUpload;\n }\n}\n"],"names":["helixFileUploadStyles","css","_hxFileUploadIdCounter","HelixFileUpload","LitElement","slot","changedProperties","firstEntry","formData","entry","file","maxMb","tokens","t","token","baseType","rawFiles","candidateFiles","validFiles","invalidFiles","errorMessages","validationError","currentCount","capacity","allowedFiles","newEntries","overflow","index","percent","clamped","i","target","dropzone","_a","dt","input","removedFile","_","bytes","nothing","html","repeat","hasError","dropzoneClasses","dropzoneLabel","classMap","ifDefined","tokenStyles","__decorateClass","property","state","query","customElement"],"mappings":";;;;;;AAEO,MAAMA,IAAwBC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A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"}
@@ -1162,6 +1162,7 @@ let i = class extends l {
1162
1162
  /**
1163
1163
  * Returns all elements that support constraint validation, including
1164
1164
  * both native form elements and hx-* components with `checkValidity`.
1165
+ * @internal
1165
1166
  */
1166
1167
  _getAllValidatableElements() {
1167
1168
  const e = Array.from(this.querySelectorAll("input, select, textarea")), r = this.getFormElements().filter(
@@ -1171,6 +1172,7 @@ let i = class extends l {
1171
1172
  }
1172
1173
  /**
1173
1174
  * Sets `aria-invalid="true"` on fields with errors, removes it from valid fields.
1175
+ * @internal
1174
1176
  */
1175
1177
  _applyAriaInvalidFromErrors(e) {
1176
1178
  const r = new Set(e.map((n) => n.name)), o = this._getAllValidatableElements();
@@ -1181,6 +1183,7 @@ let i = class extends l {
1181
1183
  }
1182
1184
  /**
1183
1185
  * Sets `aria-invalid` based on native constraint validation state.
1186
+ * @internal
1184
1187
  */
1185
1188
  _applyAriaInvalidFromValidity() {
1186
1189
  const e = this._getAllValidatableElements();
@@ -1189,12 +1192,17 @@ let i = class extends l {
1189
1192
  }
1190
1193
  /**
1191
1194
  * Removes `aria-invalid` from all validatable elements.
1195
+ * @internal
1192
1196
  */
1193
1197
  _clearAriaInvalid() {
1194
1198
  const e = this._getAllValidatableElements();
1195
1199
  for (const r of e)
1196
1200
  r.removeAttribute("aria-invalid");
1197
1201
  }
1202
+ /**
1203
+ * Collects constraint validation errors from all validatable elements after a failed submit attempt.
1204
+ * @internal
1205
+ */
1198
1206
  _collectValidationErrors() {
1199
1207
  const e = [], r = this._getAllValidatableElements();
1200
1208
  for (const o of r)
@@ -1261,4 +1269,4 @@ i = a([
1261
1269
  export {
1262
1270
  i as H
1263
1271
  };
1264
- //# sourceMappingURL=hx-form-BJeLK34m.js.map
1272
+ //# sourceMappingURL=hx-form-BFv_N1dm.js.map