@helixui/library 1.1.2 → 2.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 (638) hide show
  1. package/custom-elements.json +3221 -2224
  2. package/dist/base/helix-element.d.ts +134 -0
  3. package/dist/base/helix-element.d.ts.map +1 -0
  4. package/dist/base/id-counter.d.ts +32 -0
  5. package/dist/base/id-counter.d.ts.map +1 -0
  6. package/dist/base/index.d.ts +4 -0
  7. package/dist/base/index.d.ts.map +1 -0
  8. package/dist/base/styles.d.ts +19 -0
  9. package/dist/base/styles.d.ts.map +1 -0
  10. package/dist/components/hx-accordion/hx-accordion-item.d.ts +3 -0
  11. package/dist/components/hx-accordion/hx-accordion-item.d.ts.map +1 -1
  12. package/dist/components/hx-accordion/hx-accordion.d.ts +4 -1
  13. package/dist/components/hx-accordion/hx-accordion.d.ts.map +1 -1
  14. package/dist/components/hx-accordion/index.js +1 -1
  15. package/dist/components/hx-action-bar/hx-action-bar.d.ts +1 -1
  16. package/dist/components/hx-action-bar/hx-action-bar.d.ts.map +1 -1
  17. package/dist/components/hx-action-bar/index.js +1 -1
  18. package/dist/components/hx-alert/hx-alert.d.ts +10 -5
  19. package/dist/components/hx-alert/hx-alert.d.ts.map +1 -1
  20. package/dist/components/hx-alert/hx-alert.styles.d.ts.map +1 -1
  21. package/dist/components/hx-alert/index.js +1 -1
  22. package/dist/components/hx-avatar/hx-avatar.styles.d.ts.map +1 -1
  23. package/dist/components/hx-avatar/index.js +1 -1
  24. package/dist/components/hx-badge/hx-badge.d.ts.map +1 -1
  25. package/dist/components/hx-badge/hx-badge.styles.d.ts.map +1 -1
  26. package/dist/components/hx-badge/index.js +1 -1
  27. package/dist/components/hx-banner/hx-banner.d.ts +15 -5
  28. package/dist/components/hx-banner/hx-banner.d.ts.map +1 -1
  29. package/dist/components/hx-banner/hx-banner.styles.d.ts.map +1 -1
  30. package/dist/components/hx-banner/index.js +1 -1
  31. package/dist/components/hx-breadcrumb/hx-breadcrumb-item.d.ts +1 -0
  32. package/dist/components/hx-breadcrumb/hx-breadcrumb-item.d.ts.map +1 -1
  33. package/dist/components/hx-breadcrumb/hx-breadcrumb.d.ts +42 -11
  34. package/dist/components/hx-breadcrumb/hx-breadcrumb.d.ts.map +1 -1
  35. package/dist/components/hx-breadcrumb/index.js +1 -1
  36. package/dist/components/hx-button/hx-button.d.ts +22 -13
  37. package/dist/components/hx-button/hx-button.d.ts.map +1 -1
  38. package/dist/components/hx-button/hx-button.styles.d.ts.map +1 -1
  39. package/dist/components/hx-button/index.js +1 -1
  40. package/dist/components/hx-button-group/hx-button-group.d.ts +3 -6
  41. package/dist/components/hx-button-group/hx-button-group.d.ts.map +1 -1
  42. package/dist/components/hx-button-group/index.js +1 -1
  43. package/dist/components/hx-card/hx-card.d.ts +7 -7
  44. package/dist/components/hx-card/hx-card.d.ts.map +1 -1
  45. package/dist/components/hx-card/index.js +1 -1
  46. package/dist/components/hx-carousel/hx-carousel.d.ts +2 -2
  47. package/dist/components/hx-carousel/index.js +1 -1
  48. package/dist/components/hx-checkbox/hx-checkbox.d.ts +18 -18
  49. package/dist/components/hx-checkbox/hx-checkbox.d.ts.map +1 -1
  50. package/dist/components/hx-checkbox/hx-checkbox.styles.d.ts.map +1 -1
  51. package/dist/components/hx-checkbox/index.js +1 -1
  52. package/dist/components/hx-checkbox-group/hx-checkbox-group.d.ts +8 -3
  53. package/dist/components/hx-checkbox-group/hx-checkbox-group.d.ts.map +1 -1
  54. package/dist/components/hx-checkbox-group/index.js +1 -1
  55. package/dist/components/hx-clinical-status/hx-clinical-status.d.ts +134 -0
  56. package/dist/components/hx-clinical-status/hx-clinical-status.d.ts.map +1 -0
  57. package/dist/components/hx-clinical-status/hx-clinical-status.styles.d.ts +2 -0
  58. package/dist/components/hx-clinical-status/hx-clinical-status.styles.d.ts.map +1 -0
  59. package/dist/components/hx-clinical-status/index.d.ts +3 -0
  60. package/dist/components/hx-clinical-status/index.d.ts.map +1 -0
  61. package/dist/components/hx-clinical-status/index.js +5 -0
  62. package/dist/components/hx-clinical-status/index.js.map +1 -0
  63. package/dist/components/hx-code-snippet/hx-code-snippet.styles.d.ts.map +1 -1
  64. package/dist/components/hx-code-snippet/index.js +1 -1
  65. package/dist/components/hx-color-picker/color-utils.d.ts +27 -0
  66. package/dist/components/hx-color-picker/color-utils.d.ts.map +1 -0
  67. package/dist/components/hx-color-picker/hx-color-picker.d.ts +16 -4
  68. package/dist/components/hx-color-picker/hx-color-picker.d.ts.map +1 -1
  69. package/dist/components/hx-color-picker/index.js +1 -1
  70. package/dist/components/hx-combobox/hx-combobox.d.ts +9 -4
  71. package/dist/components/hx-combobox/hx-combobox.d.ts.map +1 -1
  72. package/dist/components/hx-combobox/hx-combobox.styles.d.ts.map +1 -1
  73. package/dist/components/hx-combobox/index.js +1 -1
  74. package/dist/components/hx-container/index.js +1 -1
  75. package/dist/components/hx-copy-button/hx-copy-button.d.ts +6 -1
  76. package/dist/components/hx-copy-button/hx-copy-button.d.ts.map +1 -1
  77. package/dist/components/hx-copy-button/index.js +1 -1
  78. package/dist/components/hx-counter/hx-counter.d.ts +20 -3
  79. package/dist/components/hx-counter/hx-counter.d.ts.map +1 -1
  80. package/dist/components/hx-counter/hx-counter.styles.d.ts.map +1 -1
  81. package/dist/components/hx-counter/index.js +1 -1
  82. package/dist/components/hx-data-table/hx-data-table.d.ts +8 -0
  83. package/dist/components/hx-data-table/hx-data-table.d.ts.map +1 -1
  84. package/dist/components/hx-data-table/hx-data-table.styles.d.ts.map +1 -1
  85. package/dist/components/hx-data-table/index.js +1 -1
  86. package/dist/components/hx-date-picker/hx-date-picker.d.ts +40 -3
  87. package/dist/components/hx-date-picker/hx-date-picker.d.ts.map +1 -1
  88. package/dist/components/hx-date-picker/hx-date-picker.styles.d.ts.map +1 -1
  89. package/dist/components/hx-date-picker/index.js +1 -1
  90. package/dist/components/hx-dialog/hx-dialog.d.ts +4 -1
  91. package/dist/components/hx-dialog/hx-dialog.d.ts.map +1 -1
  92. package/dist/components/hx-dialog/index.js +1 -1
  93. package/dist/components/hx-divider/hx-divider.d.ts.map +1 -1
  94. package/dist/components/hx-divider/index.js +1 -1
  95. package/dist/components/hx-drawer/hx-drawer.d.ts +5 -8
  96. package/dist/components/hx-drawer/hx-drawer.d.ts.map +1 -1
  97. package/dist/components/hx-drawer/hx-drawer.styles.d.ts.map +1 -1
  98. package/dist/components/hx-drawer/index.js +1 -1
  99. package/dist/components/hx-dropdown/hx-dropdown.d.ts +14 -1
  100. package/dist/components/hx-dropdown/hx-dropdown.d.ts.map +1 -1
  101. package/dist/components/hx-dropdown/index.js +1 -1
  102. package/dist/components/hx-field/hx-field.d.ts +1 -1
  103. package/dist/components/hx-field/hx-field.d.ts.map +1 -1
  104. package/dist/components/hx-field/index.js +1 -1
  105. package/dist/components/hx-field-label/hx-field-label.styles.d.ts.map +1 -1
  106. package/dist/components/hx-field-label/index.js +1 -1
  107. package/dist/components/hx-file-upload/hx-file-upload.d.ts +8 -9
  108. package/dist/components/hx-file-upload/hx-file-upload.d.ts.map +1 -1
  109. package/dist/components/hx-file-upload/index.js +1 -1
  110. package/dist/components/hx-form/hx-form.d.ts.map +1 -1
  111. package/dist/components/hx-form/index.js +1 -1
  112. package/dist/components/hx-format-date/hx-format-date.d.ts.map +1 -1
  113. package/dist/components/hx-format-date/index.js +1 -1
  114. package/dist/components/hx-grid/hx-grid.d.ts +5 -9
  115. package/dist/components/hx-grid/hx-grid.d.ts.map +1 -1
  116. package/dist/components/hx-grid/index.js +1 -1
  117. package/dist/components/hx-icon/hx-icon.d.ts.map +1 -1
  118. package/dist/components/hx-icon/index.js +1 -1
  119. package/dist/components/hx-icon-button/hx-icon-button.d.ts +4 -3
  120. package/dist/components/hx-icon-button/hx-icon-button.d.ts.map +1 -1
  121. package/dist/components/hx-icon-button/index.js +1 -1
  122. package/dist/components/hx-image/hx-image.d.ts.map +1 -1
  123. package/dist/components/hx-image/index.js +1 -1
  124. package/dist/components/hx-link/hx-link.d.ts +1 -1
  125. package/dist/components/hx-link/hx-link.d.ts.map +1 -1
  126. package/dist/components/hx-link/hx-link.styles.d.ts.map +1 -1
  127. package/dist/components/hx-link/index.js +1 -1
  128. package/dist/components/hx-menu/hx-menu-item.d.ts +5 -0
  129. package/dist/components/hx-menu/hx-menu-item.d.ts.map +1 -1
  130. package/dist/components/hx-menu/hx-menu.d.ts +1 -0
  131. package/dist/components/hx-menu/hx-menu.d.ts.map +1 -1
  132. package/dist/components/hx-menu/hx-menu.styles.d.ts.map +1 -1
  133. package/dist/components/hx-menu/index.js +1 -1
  134. package/dist/components/hx-meter/hx-meter.d.ts +2 -2
  135. package/dist/components/hx-meter/hx-meter.d.ts.map +1 -1
  136. package/dist/components/hx-meter/index.js +1 -1
  137. package/dist/components/hx-nav/hx-nav.d.ts +10 -0
  138. package/dist/components/hx-nav/hx-nav.d.ts.map +1 -1
  139. package/dist/components/hx-nav/index.js +1 -1
  140. package/dist/components/hx-number-input/hx-number-input.d.ts +4 -3
  141. package/dist/components/hx-number-input/hx-number-input.d.ts.map +1 -1
  142. package/dist/components/hx-number-input/index.js +1 -1
  143. package/dist/components/hx-overflow-menu/hx-overflow-menu.d.ts +3 -3
  144. package/dist/components/hx-overflow-menu/hx-overflow-menu.styles.d.ts.map +1 -1
  145. package/dist/components/hx-overflow-menu/index.js +1 -1
  146. package/dist/components/hx-pagination/hx-pagination.d.ts +8 -0
  147. package/dist/components/hx-pagination/hx-pagination.d.ts.map +1 -1
  148. package/dist/components/hx-pagination/hx-pagination.styles.d.ts.map +1 -1
  149. package/dist/components/hx-pagination/index.js +1 -1
  150. package/dist/components/hx-patient-banner/hx-patient-banner.d.ts +113 -0
  151. package/dist/components/hx-patient-banner/hx-patient-banner.d.ts.map +1 -0
  152. package/dist/components/hx-patient-banner/hx-patient-banner.styles.d.ts +2 -0
  153. package/dist/components/hx-patient-banner/hx-patient-banner.styles.d.ts.map +1 -0
  154. package/dist/components/hx-patient-banner/index.d.ts +3 -0
  155. package/dist/components/hx-patient-banner/index.d.ts.map +1 -0
  156. package/dist/components/hx-patient-banner/index.js +5 -0
  157. package/dist/components/hx-patient-banner/index.js.map +1 -0
  158. package/dist/components/hx-phi-field/hx-phi-field.d.ts +97 -0
  159. package/dist/components/hx-phi-field/hx-phi-field.d.ts.map +1 -0
  160. package/dist/components/hx-phi-field/hx-phi-field.styles.d.ts +2 -0
  161. package/dist/components/hx-phi-field/hx-phi-field.styles.d.ts.map +1 -0
  162. package/dist/components/hx-phi-field/index.d.ts +3 -0
  163. package/dist/components/hx-phi-field/index.d.ts.map +1 -0
  164. package/dist/components/hx-phi-field/index.js +5 -0
  165. package/dist/components/hx-phi-field/index.js.map +1 -0
  166. package/dist/components/hx-popover/hx-popover.d.ts +25 -9
  167. package/dist/components/hx-popover/hx-popover.d.ts.map +1 -1
  168. package/dist/components/hx-popover/index.js +1 -1
  169. package/dist/components/hx-popup/hx-popup.d.ts +5 -8
  170. package/dist/components/hx-popup/hx-popup.d.ts.map +1 -1
  171. package/dist/components/hx-popup/index.js +1 -1
  172. package/dist/components/hx-progress-bar/hx-progress-bar.d.ts +2 -0
  173. package/dist/components/hx-progress-bar/hx-progress-bar.d.ts.map +1 -1
  174. package/dist/components/hx-progress-bar/hx-progress-bar.styles.d.ts.map +1 -1
  175. package/dist/components/hx-progress-bar/index.js +1 -1
  176. package/dist/components/hx-progress-ring/hx-progress-ring.d.ts.map +1 -1
  177. package/dist/components/hx-progress-ring/index.js +1 -1
  178. package/dist/components/hx-prose/hx-prose.d.ts +1 -0
  179. package/dist/components/hx-prose/hx-prose.d.ts.map +1 -1
  180. package/dist/components/hx-radio-group/hx-radio-group.d.ts +3 -7
  181. package/dist/components/hx-radio-group/hx-radio-group.d.ts.map +1 -1
  182. package/dist/components/hx-radio-group/hx-radio.d.ts.map +1 -1
  183. package/dist/components/hx-radio-group/hx-radio.styles.d.ts.map +1 -1
  184. package/dist/components/hx-radio-group/index.js +1 -1
  185. package/dist/components/hx-rating/hx-rating.d.ts +3 -3
  186. package/dist/components/hx-rating/hx-rating.d.ts.map +1 -1
  187. package/dist/components/hx-rating/hx-rating.styles.d.ts.map +1 -1
  188. package/dist/components/hx-rating/index.js +1 -1
  189. package/dist/components/hx-select/hx-select.d.ts +17 -11
  190. package/dist/components/hx-select/hx-select.d.ts.map +1 -1
  191. package/dist/components/hx-select/hx-select.styles.d.ts.map +1 -1
  192. package/dist/components/hx-select/index.js +1 -1
  193. package/dist/components/hx-side-nav/hx-nav-item.d.ts +12 -0
  194. package/dist/components/hx-side-nav/hx-nav-item.d.ts.map +1 -1
  195. package/dist/components/hx-side-nav/hx-nav-item.styles.d.ts.map +1 -1
  196. package/dist/components/hx-side-nav/hx-side-nav.d.ts.map +1 -1
  197. package/dist/components/hx-side-nav/hx-side-nav.styles.d.ts.map +1 -1
  198. package/dist/components/hx-side-nav/index.js +1 -1
  199. package/dist/components/hx-skeleton/hx-skeleton.d.ts +2 -2
  200. package/dist/components/hx-skeleton/hx-skeleton.d.ts.map +1 -1
  201. package/dist/components/hx-slider/hx-slider.d.ts +5 -8
  202. package/dist/components/hx-slider/hx-slider.d.ts.map +1 -1
  203. package/dist/components/hx-slider/hx-slider.styles.d.ts.map +1 -1
  204. package/dist/components/hx-slider/index.js +1 -1
  205. package/dist/components/hx-spinner/hx-spinner.d.ts +14 -1
  206. package/dist/components/hx-spinner/hx-spinner.d.ts.map +1 -1
  207. package/dist/components/hx-spinner/hx-spinner.styles.d.ts.map +1 -1
  208. package/dist/components/hx-spinner/index.js +1 -1
  209. package/dist/components/hx-split-button/hx-split-button.d.ts +10 -4
  210. package/dist/components/hx-split-button/hx-split-button.d.ts.map +1 -1
  211. package/dist/components/hx-split-button/hx-split-button.styles.d.ts.map +1 -1
  212. package/dist/components/hx-split-button/index.js +1 -1
  213. package/dist/components/hx-split-panel/hx-split-panel.d.ts.map +1 -1
  214. package/dist/components/hx-split-panel/hx-split-panel.styles.d.ts.map +1 -1
  215. package/dist/components/hx-split-panel/index.js +1 -1
  216. package/dist/components/hx-stat/hx-stat.d.ts +7 -2
  217. package/dist/components/hx-stat/hx-stat.d.ts.map +1 -1
  218. package/dist/components/hx-stat/index.js +1 -1
  219. package/dist/components/hx-status-indicator/hx-status-indicator.d.ts +19 -3
  220. package/dist/components/hx-status-indicator/hx-status-indicator.d.ts.map +1 -1
  221. package/dist/components/hx-status-indicator/hx-status-indicator.styles.d.ts.map +1 -1
  222. package/dist/components/hx-status-indicator/index.js +1 -1
  223. package/dist/components/hx-steps/hx-step.d.ts +7 -0
  224. package/dist/components/hx-steps/hx-step.d.ts.map +1 -1
  225. package/dist/components/hx-steps/hx-step.styles.d.ts.map +1 -1
  226. package/dist/components/hx-steps/hx-steps.d.ts.map +1 -1
  227. package/dist/components/hx-steps/index.js +1 -1
  228. package/dist/components/hx-structured-list/hx-structured-list.d.ts +10 -3
  229. package/dist/components/hx-structured-list/hx-structured-list.d.ts.map +1 -1
  230. package/dist/components/hx-structured-list/index.js +1 -1
  231. package/dist/components/hx-style-scope/hx-style-scope.d.ts +71 -0
  232. package/dist/components/hx-style-scope/hx-style-scope.d.ts.map +1 -0
  233. package/dist/components/hx-style-scope/hx-style-scope.styles.d.ts +10 -0
  234. package/dist/components/hx-style-scope/hx-style-scope.styles.d.ts.map +1 -0
  235. package/dist/components/hx-style-scope/index.d.ts +2 -0
  236. package/dist/components/hx-style-scope/index.d.ts.map +1 -0
  237. package/dist/components/hx-style-scope/index.js +5 -0
  238. package/dist/components/hx-style-scope/index.js.map +1 -0
  239. package/dist/components/hx-switch/hx-switch.d.ts +4 -4
  240. package/dist/components/hx-switch/hx-switch.d.ts.map +1 -1
  241. package/dist/components/hx-switch/hx-switch.styles.d.ts.map +1 -1
  242. package/dist/components/hx-switch/index.js +1 -1
  243. package/dist/components/hx-table/hx-table.d.ts +1 -0
  244. package/dist/components/hx-table/hx-table.d.ts.map +1 -1
  245. package/dist/components/hx-table/index.js +1 -1
  246. package/dist/components/hx-tabs/hx-tab-panel.styles.d.ts.map +1 -1
  247. package/dist/components/hx-tabs/hx-tab.d.ts +1 -0
  248. package/dist/components/hx-tabs/hx-tab.d.ts.map +1 -1
  249. package/dist/components/hx-tabs/hx-tab.styles.d.ts.map +1 -1
  250. package/dist/components/hx-tabs/hx-tabs.d.ts +12 -2
  251. package/dist/components/hx-tabs/hx-tabs.d.ts.map +1 -1
  252. package/dist/components/hx-tabs/index.js +1 -1
  253. package/dist/components/hx-tag/hx-tag.styles.d.ts.map +1 -1
  254. package/dist/components/hx-tag/index.js +1 -1
  255. package/dist/components/hx-text/index.js +1 -1
  256. package/dist/components/hx-text-input/hx-text-input.d.ts +16 -15
  257. package/dist/components/hx-text-input/hx-text-input.d.ts.map +1 -1
  258. package/dist/components/hx-text-input/hx-text-input.styles.d.ts.map +1 -1
  259. package/dist/components/hx-text-input/index.js +1 -1
  260. package/dist/components/hx-textarea/hx-textarea.d.ts +4 -4
  261. package/dist/components/hx-textarea/hx-textarea.d.ts.map +1 -1
  262. package/dist/components/hx-textarea/hx-textarea.styles.d.ts.map +1 -1
  263. package/dist/components/hx-textarea/index.js +1 -1
  264. package/dist/components/hx-theme/hx-theme.d.ts +82 -3
  265. package/dist/components/hx-theme/hx-theme.d.ts.map +1 -1
  266. package/dist/components/hx-theme/index.js +1 -1
  267. package/dist/components/hx-time-picker/hx-time-picker.d.ts +6 -1
  268. package/dist/components/hx-time-picker/hx-time-picker.d.ts.map +1 -1
  269. package/dist/components/hx-time-picker/index.js +1 -1
  270. package/dist/components/hx-toast/hx-toast-stack.d.ts +1 -1
  271. package/dist/components/hx-toast/hx-toast-stack.d.ts.map +1 -1
  272. package/dist/components/hx-toast/hx-toast.d.ts +9 -5
  273. package/dist/components/hx-toast/hx-toast.d.ts.map +1 -1
  274. package/dist/components/hx-toast/hx-toast.styles.d.ts.map +1 -1
  275. package/dist/components/hx-toast/index.js +1 -1
  276. package/dist/components/hx-toast/toast-factory.d.ts.map +1 -1
  277. package/dist/components/hx-toggle-button/hx-toggle-button.d.ts +4 -3
  278. package/dist/components/hx-toggle-button/hx-toggle-button.d.ts.map +1 -1
  279. package/dist/components/hx-toggle-button/hx-toggle-button.styles.d.ts.map +1 -1
  280. package/dist/components/hx-toggle-button/index.js +1 -1
  281. package/dist/components/hx-tooltip/hx-tooltip.d.ts +1 -2
  282. package/dist/components/hx-tooltip/hx-tooltip.d.ts.map +1 -1
  283. package/dist/components/hx-tooltip/index.js +1 -1
  284. package/dist/components/hx-tree-view/hx-tree-item.d.ts +12 -0
  285. package/dist/components/hx-tree-view/hx-tree-item.d.ts.map +1 -1
  286. package/dist/components/hx-tree-view/hx-tree-view.d.ts +27 -2
  287. package/dist/components/hx-tree-view/hx-tree-view.d.ts.map +1 -1
  288. package/dist/components/hx-tree-view/hx-tree-view.styles.d.ts.map +1 -1
  289. package/dist/components/hx-tree-view/index.js +1 -1
  290. package/dist/controllers/helix-audit-controller.d.ts +71 -0
  291. package/dist/controllers/helix-audit-controller.d.ts.map +1 -0
  292. package/dist/css/helix-all.css +9743 -0
  293. package/dist/css/helix-core.css +1839 -0
  294. package/dist/css/helix-data.css +639 -0
  295. package/dist/css/helix-feedback.css +1268 -0
  296. package/dist/css/helix-forms.css +2525 -0
  297. package/dist/css/helix-layout.css +380 -0
  298. package/dist/css/helix-media.css +213 -0
  299. package/dist/css/helix-navigation.css +1131 -0
  300. package/dist/css/helix-overlay.css +643 -0
  301. package/dist/css/helix-tokens.css +432 -0
  302. package/dist/css/helix-utility.css +633 -0
  303. package/dist/css/hx-accordion.css +10 -0
  304. package/dist/css/hx-action-bar.css +117 -0
  305. package/dist/css/hx-alert.css +213 -0
  306. package/dist/css/hx-avatar.css +134 -0
  307. package/dist/css/hx-badge.css +178 -0
  308. package/dist/css/hx-banner.css +203 -0
  309. package/dist/css/hx-breadcrumb.css +36 -0
  310. package/dist/css/hx-button-group.css +91 -0
  311. package/dist/css/hx-button.css +296 -0
  312. package/dist/css/hx-card.css +161 -0
  313. package/dist/css/hx-carousel.css +211 -0
  314. package/dist/css/hx-checkbox-group.css +77 -0
  315. package/dist/css/hx-checkbox.css +219 -0
  316. package/dist/css/hx-clinical-status.css +248 -0
  317. package/dist/css/hx-code-snippet.css +179 -0
  318. package/dist/css/hx-color-picker.css +2 -0
  319. package/dist/css/hx-combobox.css +2 -0
  320. package/dist/css/hx-container.css +82 -0
  321. package/dist/css/hx-copy-button.css +121 -0
  322. package/dist/css/hx-counter.css +51 -0
  323. package/dist/css/hx-data-table.css +207 -0
  324. package/dist/css/hx-date-picker.css +2 -0
  325. package/dist/css/hx-dialog.css +190 -0
  326. package/dist/css/hx-divider.css +87 -0
  327. package/dist/css/hx-drawer.css +262 -0
  328. package/dist/css/hx-dropdown.css +46 -0
  329. package/dist/css/hx-field-label.css +38 -0
  330. package/dist/css/hx-field.css +119 -0
  331. package/dist/css/hx-file-upload.css +241 -0
  332. package/dist/css/hx-form.css +2 -0
  333. package/dist/css/hx-format-date.css +10 -0
  334. package/dist/css/hx-grid.css +14 -0
  335. package/dist/css/hx-help-text.css +50 -0
  336. package/dist/css/hx-icon-button.css +152 -0
  337. package/dist/css/hx-icon.css +73 -0
  338. package/dist/css/hx-image.css +41 -0
  339. package/dist/css/hx-link.css +105 -0
  340. package/dist/css/hx-list.css +48 -0
  341. package/dist/css/hx-menu.css +23 -0
  342. package/dist/css/hx-meter.css +113 -0
  343. package/dist/css/hx-nav.css +242 -0
  344. package/dist/css/hx-number-input.css +246 -0
  345. package/dist/css/hx-overflow-menu.css +133 -0
  346. package/dist/css/hx-pagination.css +193 -0
  347. package/dist/css/hx-patient-banner.css +139 -0
  348. package/dist/css/hx-phi-field.css +97 -0
  349. package/dist/css/hx-popover.css +61 -0
  350. package/dist/css/hx-popup.css +31 -0
  351. package/dist/css/hx-progress-bar.css +133 -0
  352. package/dist/css/hx-progress-ring.css +142 -0
  353. package/dist/css/hx-prose.css +2 -0
  354. package/dist/css/hx-radio-group.css +77 -0
  355. package/dist/css/hx-rating.css +96 -0
  356. package/dist/css/hx-select.css +295 -0
  357. package/dist/css/hx-side-nav.css +149 -0
  358. package/dist/css/hx-skeleton.css +82 -0
  359. package/dist/css/hx-slider.css +287 -0
  360. package/dist/css/hx-spinner.css +116 -0
  361. package/dist/css/hx-split-button.css +309 -0
  362. package/dist/css/hx-split-panel.css +168 -0
  363. package/dist/css/hx-stack.css +104 -0
  364. package/dist/css/hx-stat.css +106 -0
  365. package/dist/css/hx-status-indicator.css +126 -0
  366. package/dist/css/hx-steps.css +52 -0
  367. package/dist/css/hx-structured-list.css +75 -0
  368. package/dist/css/hx-style-scope.css +4 -0
  369. package/dist/css/hx-switch.css +169 -0
  370. package/dist/css/hx-table.css +128 -0
  371. package/dist/css/hx-tabs.css +76 -0
  372. package/dist/css/hx-tag.css +146 -0
  373. package/dist/css/hx-text-input.css +214 -0
  374. package/dist/css/hx-text.css +149 -0
  375. package/dist/css/hx-textarea.css +180 -0
  376. package/dist/css/hx-theme.css +23 -0
  377. package/dist/css/hx-time-picker.css +2 -0
  378. package/dist/css/hx-toast.css +230 -0
  379. package/dist/css/hx-toggle-button.css +207 -0
  380. package/dist/css/hx-tooltip.css +51 -0
  381. package/dist/css/hx-top-nav.css +203 -0
  382. package/dist/css/hx-tree-view.css +22 -0
  383. package/dist/css/hx-visually-hidden.css +26 -0
  384. package/dist/css/index.css +84 -0
  385. package/dist/css/manifest.json +2704 -0
  386. package/dist/index.d.ts +14 -0
  387. package/dist/index.d.ts.map +1 -1
  388. package/dist/index.js +266 -176
  389. package/dist/index.js.map +1 -1
  390. package/dist/mixins/FocusMixin.d.ts +49 -0
  391. package/dist/mixins/FocusMixin.d.ts.map +1 -0
  392. package/dist/mixins/FormMixin.d.ts +69 -0
  393. package/dist/mixins/FormMixin.d.ts.map +1 -0
  394. package/dist/mixins/aria-delegation.d.ts +97 -0
  395. package/dist/mixins/aria-delegation.d.ts.map +1 -0
  396. package/dist/mixins/index.d.ts +5 -0
  397. package/dist/mixins/index.d.ts.map +1 -0
  398. package/dist/shared/FormMixin-Bjvw20G5.js +88 -0
  399. package/dist/shared/FormMixin-Bjvw20G5.js.map +1 -0
  400. package/dist/shared/aria-delegation-CBP9eQ0M.js +107 -0
  401. package/dist/shared/aria-delegation-CBP9eQ0M.js.map +1 -0
  402. package/dist/shared/{hx-accordion-D1kFhdeQ.js → hx-accordion-_KeulaQR.js} +83 -55
  403. package/dist/shared/hx-accordion-_KeulaQR.js.map +1 -0
  404. package/dist/shared/{hx-action-bar-D4bulGQP.js → hx-action-bar-vGFnNwNY.js} +33 -34
  405. package/dist/shared/hx-action-bar-vGFnNwNY.js.map +1 -0
  406. package/dist/shared/{hx-alert-CSxCF2rr.js → hx-alert-DRZYP0Oo.js} +32 -28
  407. package/dist/shared/hx-alert-DRZYP0Oo.js.map +1 -0
  408. package/dist/shared/{hx-avatar-Cun-O99h.js → hx-avatar-CZfA9KEl.js} +28 -11
  409. package/dist/shared/hx-avatar-CZfA9KEl.js.map +1 -0
  410. package/dist/shared/{hx-badge-CsFd2xtw.js → hx-badge-Xg7zoh4Q.js} +46 -37
  411. package/dist/shared/hx-badge-Xg7zoh4Q.js.map +1 -0
  412. package/dist/shared/{hx-banner-BTV-X2xF.js → hx-banner-2RS7Nux4.js} +93 -58
  413. package/dist/shared/hx-banner-2RS7Nux4.js.map +1 -0
  414. package/dist/shared/{hx-breadcrumb-item-4IwaLgaO.js → hx-breadcrumb-item-CObc-WJl.js} +86 -83
  415. package/dist/shared/hx-breadcrumb-item-CObc-WJl.js.map +1 -0
  416. package/dist/shared/{hx-button-7k-KeCYU.js → hx-button-CC1YH9RZ.js} +127 -62
  417. package/dist/shared/hx-button-CC1YH9RZ.js.map +1 -0
  418. package/dist/shared/{hx-button-group-CWjWv-wS.js → hx-button-group-ChTQsnQj.js} +10 -10
  419. package/dist/shared/hx-button-group-ChTQsnQj.js.map +1 -0
  420. package/dist/shared/{hx-card-0hT3G5hi.js → hx-card-dIKdcMhr.js} +32 -32
  421. package/dist/shared/hx-card-dIKdcMhr.js.map +1 -0
  422. package/dist/shared/{hx-carousel-item-DgeYyYZJ.js → hx-carousel-item-Cm8a1nAi.js} +3 -3
  423. package/dist/shared/hx-carousel-item-Cm8a1nAi.js.map +1 -0
  424. package/dist/shared/{hx-checkbox-BvjO-O41.js → hx-checkbox-_WUiuTo9.js} +68 -71
  425. package/dist/shared/hx-checkbox-_WUiuTo9.js.map +1 -0
  426. package/dist/shared/{hx-checkbox-group-Z5VvWzcj.js → hx-checkbox-group-B-ci-dxp.js} +37 -31
  427. package/dist/shared/hx-checkbox-group-B-ci-dxp.js.map +1 -0
  428. package/dist/shared/hx-clinical-status-D6eaplvs.js +469 -0
  429. package/dist/shared/hx-clinical-status-D6eaplvs.js.map +1 -0
  430. package/dist/shared/{hx-code-snippet-DqzPkH4K.js → hx-code-snippet-CQsyvthi.js} +56 -47
  431. package/dist/shared/hx-code-snippet-CQsyvthi.js.map +1 -0
  432. package/dist/shared/{hx-color-picker-Da8z6AlQ.js → hx-color-picker-Dk2Myvaf.js} +153 -137
  433. package/dist/shared/hx-color-picker-Dk2Myvaf.js.map +1 -0
  434. package/dist/shared/{hx-combobox-CivfelTS.js → hx-combobox-CNAJXIxo.js} +10 -10
  435. package/dist/shared/hx-combobox-CNAJXIxo.js.map +1 -0
  436. package/dist/shared/{hx-container-DLUKnTi9.js → hx-container-7j16VuQE.js} +16 -16
  437. package/dist/shared/hx-container-7j16VuQE.js.map +1 -0
  438. package/dist/shared/{hx-copy-button--0dymSvw.js → hx-copy-button-B_ZHYO7_.js} +47 -40
  439. package/dist/shared/hx-copy-button-B_ZHYO7_.js.map +1 -0
  440. package/dist/shared/hx-counter-D_B7L9Pi.js +185 -0
  441. package/dist/shared/hx-counter-D_B7L9Pi.js.map +1 -0
  442. package/dist/shared/{hx-data-table-BWvd5NNx.js → hx-data-table-B1j4n4bm.js} +82 -46
  443. package/dist/shared/hx-data-table-B1j4n4bm.js.map +1 -0
  444. package/dist/shared/{hx-date-picker-6voxxxNE.js → hx-date-picker-R-0kWFwr.js} +102 -89
  445. package/dist/shared/hx-date-picker-R-0kWFwr.js.map +1 -0
  446. package/dist/shared/{hx-dialog-DkUSnVgw.js → hx-dialog-U5d3s0Ps.js} +98 -89
  447. package/dist/shared/hx-dialog-U5d3s0Ps.js.map +1 -0
  448. package/dist/shared/{hx-divider-DNNs4e8q.js → hx-divider-DdAN-_jB.js} +5 -5
  449. package/dist/shared/hx-divider-DdAN-_jB.js.map +1 -0
  450. package/dist/shared/{hx-drawer-CJcRZcns.js → hx-drawer-e0qeGxAD.js} +117 -77
  451. package/dist/shared/hx-drawer-e0qeGxAD.js.map +1 -0
  452. package/dist/shared/{hx-dropdown-Bo0KTM1A.js → hx-dropdown-DP_DNpEb.js} +56 -41
  453. package/dist/shared/hx-dropdown-DP_DNpEb.js.map +1 -0
  454. package/dist/shared/{hx-field-3MmzJ4kZ.js → hx-field-COM4KvMQ.js} +9 -9
  455. package/dist/shared/hx-field-COM4KvMQ.js.map +1 -0
  456. package/dist/shared/{hx-field-label-Bg-EWvqF.js → hx-field-label-BtZ9H9Yy.js} +8 -11
  457. package/dist/shared/hx-field-label-BtZ9H9Yy.js.map +1 -0
  458. package/dist/shared/{hx-file-upload-ByjAgfNy.js → hx-file-upload-DbECypLe.js} +78 -87
  459. package/dist/shared/hx-file-upload-DbECypLe.js.map +1 -0
  460. package/dist/shared/{hx-form-BpS6v3Iu.js → hx-form-fJE-FJQV.js} +36 -32
  461. package/dist/shared/{hx-form-BpS6v3Iu.js.map → hx-form-fJE-FJQV.js.map} +1 -1
  462. package/dist/shared/{hx-format-date-BdnWV2kX.js → hx-format-date-C030ThSm.js} +14 -12
  463. package/dist/shared/hx-format-date-C030ThSm.js.map +1 -0
  464. package/dist/shared/{hx-grid-gEjuF0cR.js → hx-grid-DE8KM5Gf.js} +7 -7
  465. package/dist/shared/hx-grid-DE8KM5Gf.js.map +1 -0
  466. package/dist/shared/{hx-icon-button-DzH_bRtC.js → hx-icon-button-Et9wq79n.js} +4 -4
  467. package/dist/shared/{hx-icon-button-DzH_bRtC.js.map → hx-icon-button-Et9wq79n.js.map} +1 -1
  468. package/dist/shared/{hx-icon-CP6OnLoM.js → hx-icon-dYvrzvsO.js} +7 -7
  469. package/dist/shared/hx-icon-dYvrzvsO.js.map +1 -0
  470. package/dist/shared/{hx-image-C6pGiI6c.js → hx-image-DUsEi-oN.js} +15 -15
  471. package/dist/shared/hx-image-DUsEi-oN.js.map +1 -0
  472. package/dist/shared/{hx-link-Tmk_YPvW.js → hx-link-Peg2LzOD.js} +43 -41
  473. package/dist/shared/hx-link-Peg2LzOD.js.map +1 -0
  474. package/dist/shared/{hx-menu-divider-DR4G_rqw.js → hx-menu-divider-puPmRAdN.js} +40 -20
  475. package/dist/shared/hx-menu-divider-puPmRAdN.js.map +1 -0
  476. package/dist/shared/{hx-meter-uXkTZq-W.js → hx-meter-CVs4A649.js} +13 -13
  477. package/dist/shared/hx-meter-CVs4A649.js.map +1 -0
  478. package/dist/shared/{hx-nav-3JsN2Oak.js → hx-nav-CiyqaW2I.js} +119 -107
  479. package/dist/shared/hx-nav-CiyqaW2I.js.map +1 -0
  480. package/dist/shared/{hx-nav-item-D3EJatzc.js → hx-nav-item-tM_6bolB.js} +181 -115
  481. package/dist/shared/hx-nav-item-tM_6bolB.js.map +1 -0
  482. package/dist/shared/{hx-number-input-CIpL2BEh.js → hx-number-input-BPgrlMLN.js} +34 -33
  483. package/dist/shared/hx-number-input-BPgrlMLN.js.map +1 -0
  484. package/dist/shared/{hx-overflow-menu-2kgOJ_ht.js → hx-overflow-menu-Bz02LPPk.js} +15 -11
  485. package/dist/shared/hx-overflow-menu-Bz02LPPk.js.map +1 -0
  486. package/dist/shared/{hx-pagination-Blt-fFqV.js → hx-pagination-Cb9UEWXz.js} +88 -72
  487. package/dist/shared/hx-pagination-Cb9UEWXz.js.map +1 -0
  488. package/dist/shared/hx-patient-banner-wk4qWmsH.js +297 -0
  489. package/dist/shared/hx-patient-banner-wk4qWmsH.js.map +1 -0
  490. package/dist/shared/hx-phi-field-DX9z3nu0.js +295 -0
  491. package/dist/shared/hx-phi-field-DX9z3nu0.js.map +1 -0
  492. package/dist/shared/{hx-popover-DxE67miP.js → hx-popover-D6kYQkt3.js} +96 -69
  493. package/dist/shared/hx-popover-D6kYQkt3.js.map +1 -0
  494. package/dist/shared/{hx-popup-Dg6n_PbY.js → hx-popup-RQb6HUXc.js} +2 -2
  495. package/dist/shared/hx-popup-RQb6HUXc.js.map +1 -0
  496. package/dist/shared/{hx-progress-bar-Dm_EHyng.js → hx-progress-bar-ByEmxq1V.js} +42 -40
  497. package/dist/shared/hx-progress-bar-ByEmxq1V.js.map +1 -0
  498. package/dist/shared/{hx-progress-ring-DpxBDD5d.js → hx-progress-ring-CtVnNRQx.js} +2 -2
  499. package/dist/shared/{hx-progress-ring-DpxBDD5d.js.map → hx-progress-ring-CtVnNRQx.js.map} +1 -1
  500. package/dist/shared/hx-prose-Ml_L2zje.js.map +1 -1
  501. package/dist/shared/{hx-radio-BywgVSEu.js → hx-radio-jgeW92SV.js} +28 -27
  502. package/dist/shared/hx-radio-jgeW92SV.js.map +1 -0
  503. package/dist/shared/{hx-rating-CUWBQ0fZ.js → hx-rating-g_iy-DW_.js} +92 -96
  504. package/dist/shared/hx-rating-g_iy-DW_.js.map +1 -0
  505. package/dist/shared/{hx-select-BwDwxk-M.js → hx-select-BWzxWZs_.js} +139 -100
  506. package/dist/shared/hx-select-BWzxWZs_.js.map +1 -0
  507. package/dist/shared/hx-skeleton-BHvALyd7.js.map +1 -1
  508. package/dist/shared/{hx-slider-D_0EKJyk.js → hx-slider-7Q-e0_pc.js} +27 -22
  509. package/dist/shared/hx-slider-7Q-e0_pc.js.map +1 -0
  510. package/dist/shared/{hx-spinner-DMn4SChS.js → hx-spinner-DEgrKsUo.js} +3 -2
  511. package/dist/shared/hx-spinner-DEgrKsUo.js.map +1 -0
  512. package/dist/shared/{hx-split-button-CypgLXw1.js → hx-split-button-BA7P_ly5.js} +40 -31
  513. package/dist/shared/hx-split-button-BA7P_ly5.js.map +1 -0
  514. package/dist/shared/{hx-split-panel-CV_Kr4EK.js → hx-split-panel-Bss54UN8.js} +16 -13
  515. package/dist/shared/hx-split-panel-Bss54UN8.js.map +1 -0
  516. package/dist/shared/{hx-stat-CHntLHJM.js → hx-stat-CmkCUI8v.js} +40 -32
  517. package/dist/shared/{hx-stat-CHntLHJM.js.map → hx-stat-CmkCUI8v.js.map} +1 -1
  518. package/dist/shared/{hx-status-indicator-C1BwEvUw.js → hx-status-indicator-Dl3Y34mc.js} +81 -40
  519. package/dist/shared/hx-status-indicator-Dl3Y34mc.js.map +1 -0
  520. package/dist/shared/{hx-step-BIVWSPxd.js → hx-step-CmNwfcJx.js} +49 -85
  521. package/dist/shared/hx-step-CmNwfcJx.js.map +1 -0
  522. package/dist/shared/{hx-structured-list-CMWllxGg.js → hx-structured-list-Db9rwLI_.js} +26 -23
  523. package/dist/shared/hx-structured-list-Db9rwLI_.js.map +1 -0
  524. package/dist/shared/hx-style-scope-BroUu83L.js +125 -0
  525. package/dist/shared/hx-style-scope-BroUu83L.js.map +1 -0
  526. package/dist/shared/{hx-switch-BgX8kuWt.js → hx-switch-C0Lp5RGy.js} +8 -5
  527. package/dist/shared/hx-switch-C0Lp5RGy.js.map +1 -0
  528. package/dist/shared/{hx-tab-panel-DhOq67jj.js → hx-tab-panel-Dnt8aA74.js} +161 -122
  529. package/dist/shared/hx-tab-panel-Dnt8aA74.js.map +1 -0
  530. package/dist/shared/{hx-tag-CzOTDcXI.js → hx-tag-K5fCjfqQ.js} +15 -14
  531. package/dist/shared/hx-tag-K5fCjfqQ.js.map +1 -0
  532. package/dist/shared/{hx-td-h6oeW6YC.js → hx-td-DZuILY3s.js} +43 -40
  533. package/dist/shared/hx-td-DZuILY3s.js.map +1 -0
  534. package/dist/shared/{hx-text-DTXjiviE.js → hx-text-DoEVOf47.js} +29 -29
  535. package/dist/shared/hx-text-DoEVOf47.js.map +1 -0
  536. package/dist/shared/hx-text-input-DTKWPVdy.js +576 -0
  537. package/dist/shared/hx-text-input-DTKWPVdy.js.map +1 -0
  538. package/dist/shared/{hx-textarea-BgX7rxyo.js → hx-textarea-BkSiU8oM.js} +15 -15
  539. package/dist/shared/hx-textarea-BkSiU8oM.js.map +1 -0
  540. package/dist/shared/hx-theme-Aag8QJvT.js +299 -0
  541. package/dist/shared/hx-theme-Aag8QJvT.js.map +1 -0
  542. package/dist/shared/{hx-time-picker-DmLu7WUC.js → hx-time-picker-BpCRsh_z.js} +54 -53
  543. package/dist/shared/hx-time-picker-BpCRsh_z.js.map +1 -0
  544. package/dist/shared/{hx-toggle-button-D1jpDvSA.js → hx-toggle-button-CPFqs3eQ.js} +8 -5
  545. package/dist/shared/hx-toggle-button-CPFqs3eQ.js.map +1 -0
  546. package/dist/shared/{hx-tooltip-kh7QFPKu.js → hx-tooltip-CrO4vzeX.js} +15 -10
  547. package/dist/shared/hx-tooltip-CrO4vzeX.js.map +1 -0
  548. package/dist/shared/{hx-tree-item-BP6UF_H1.js → hx-tree-item-C1PhX-HE.js} +163 -99
  549. package/dist/shared/hx-tree-item-C1PhX-HE.js.map +1 -0
  550. package/dist/shared/id-counter-JhvVCnjh.js +143 -0
  551. package/dist/shared/id-counter-JhvVCnjh.js.map +1 -0
  552. package/dist/shared/{toast-factory-DTy-qN8r.js → toast-factory-f184Gi70.js} +57 -45
  553. package/dist/shared/toast-factory-f184Gi70.js.map +1 -0
  554. package/dist/utilities/adoptedStylesheetRegistry.d.ts +47 -0
  555. package/dist/utilities/adoptedStylesheetRegistry.d.ts.map +1 -0
  556. package/dist/utilities/generateScopedSelectors.d.ts +30 -0
  557. package/dist/utilities/generateScopedSelectors.d.ts.map +1 -0
  558. package/dist/utilities/injectLightStyles.d.ts +37 -0
  559. package/dist/utilities/injectLightStyles.d.ts.map +1 -0
  560. package/dist/utilities/lightStyleRegistry.d.ts +41 -0
  561. package/dist/utilities/lightStyleRegistry.d.ts.map +1 -0
  562. package/dist/utilities/sheetManager.d.ts +62 -0
  563. package/dist/utilities/sheetManager.d.ts.map +1 -0
  564. package/dist/utils/contrast-checker.d.ts +86 -0
  565. package/dist/utils/contrast-checker.d.ts.map +1 -0
  566. package/dist/utils/token-merger.d.ts +24 -0
  567. package/dist/utils/token-merger.d.ts.map +1 -0
  568. package/fouc.css +37 -0
  569. package/package.json +26 -6
  570. package/dist/shared/hx-accordion-D1kFhdeQ.js.map +0 -1
  571. package/dist/shared/hx-action-bar-D4bulGQP.js.map +0 -1
  572. package/dist/shared/hx-alert-CSxCF2rr.js.map +0 -1
  573. package/dist/shared/hx-avatar-Cun-O99h.js.map +0 -1
  574. package/dist/shared/hx-badge-CsFd2xtw.js.map +0 -1
  575. package/dist/shared/hx-banner-BTV-X2xF.js.map +0 -1
  576. package/dist/shared/hx-breadcrumb-item-4IwaLgaO.js.map +0 -1
  577. package/dist/shared/hx-button-7k-KeCYU.js.map +0 -1
  578. package/dist/shared/hx-button-group-CWjWv-wS.js.map +0 -1
  579. package/dist/shared/hx-card-0hT3G5hi.js.map +0 -1
  580. package/dist/shared/hx-carousel-item-DgeYyYZJ.js.map +0 -1
  581. package/dist/shared/hx-checkbox-BvjO-O41.js.map +0 -1
  582. package/dist/shared/hx-checkbox-group-Z5VvWzcj.js.map +0 -1
  583. package/dist/shared/hx-code-snippet-DqzPkH4K.js.map +0 -1
  584. package/dist/shared/hx-color-picker-Da8z6AlQ.js.map +0 -1
  585. package/dist/shared/hx-combobox-CivfelTS.js.map +0 -1
  586. package/dist/shared/hx-container-DLUKnTi9.js.map +0 -1
  587. package/dist/shared/hx-copy-button--0dymSvw.js.map +0 -1
  588. package/dist/shared/hx-counter-Duf00H7p.js +0 -147
  589. package/dist/shared/hx-counter-Duf00H7p.js.map +0 -1
  590. package/dist/shared/hx-data-table-BWvd5NNx.js.map +0 -1
  591. package/dist/shared/hx-date-picker-6voxxxNE.js.map +0 -1
  592. package/dist/shared/hx-dialog-DkUSnVgw.js.map +0 -1
  593. package/dist/shared/hx-divider-DNNs4e8q.js.map +0 -1
  594. package/dist/shared/hx-drawer-CJcRZcns.js.map +0 -1
  595. package/dist/shared/hx-dropdown-Bo0KTM1A.js.map +0 -1
  596. package/dist/shared/hx-field-3MmzJ4kZ.js.map +0 -1
  597. package/dist/shared/hx-field-label-Bg-EWvqF.js.map +0 -1
  598. package/dist/shared/hx-file-upload-ByjAgfNy.js.map +0 -1
  599. package/dist/shared/hx-format-date-BdnWV2kX.js.map +0 -1
  600. package/dist/shared/hx-grid-gEjuF0cR.js.map +0 -1
  601. package/dist/shared/hx-icon-CP6OnLoM.js.map +0 -1
  602. package/dist/shared/hx-image-C6pGiI6c.js.map +0 -1
  603. package/dist/shared/hx-link-Tmk_YPvW.js.map +0 -1
  604. package/dist/shared/hx-menu-divider-DR4G_rqw.js.map +0 -1
  605. package/dist/shared/hx-meter-uXkTZq-W.js.map +0 -1
  606. package/dist/shared/hx-nav-3JsN2Oak.js.map +0 -1
  607. package/dist/shared/hx-nav-item-D3EJatzc.js.map +0 -1
  608. package/dist/shared/hx-number-input-CIpL2BEh.js.map +0 -1
  609. package/dist/shared/hx-overflow-menu-2kgOJ_ht.js.map +0 -1
  610. package/dist/shared/hx-pagination-Blt-fFqV.js.map +0 -1
  611. package/dist/shared/hx-popover-DxE67miP.js.map +0 -1
  612. package/dist/shared/hx-popup-Dg6n_PbY.js.map +0 -1
  613. package/dist/shared/hx-progress-bar-Dm_EHyng.js.map +0 -1
  614. package/dist/shared/hx-radio-BywgVSEu.js.map +0 -1
  615. package/dist/shared/hx-rating-CUWBQ0fZ.js.map +0 -1
  616. package/dist/shared/hx-select-BwDwxk-M.js.map +0 -1
  617. package/dist/shared/hx-slider-D_0EKJyk.js.map +0 -1
  618. package/dist/shared/hx-spinner-DMn4SChS.js.map +0 -1
  619. package/dist/shared/hx-split-button-CypgLXw1.js.map +0 -1
  620. package/dist/shared/hx-split-panel-CV_Kr4EK.js.map +0 -1
  621. package/dist/shared/hx-status-indicator-C1BwEvUw.js.map +0 -1
  622. package/dist/shared/hx-step-BIVWSPxd.js.map +0 -1
  623. package/dist/shared/hx-structured-list-CMWllxGg.js.map +0 -1
  624. package/dist/shared/hx-switch-BgX8kuWt.js.map +0 -1
  625. package/dist/shared/hx-tab-panel-DhOq67jj.js.map +0 -1
  626. package/dist/shared/hx-tag-CzOTDcXI.js.map +0 -1
  627. package/dist/shared/hx-td-h6oeW6YC.js.map +0 -1
  628. package/dist/shared/hx-text-DTXjiviE.js.map +0 -1
  629. package/dist/shared/hx-text-input-CqEdDHMU.js +0 -461
  630. package/dist/shared/hx-text-input-CqEdDHMU.js.map +0 -1
  631. package/dist/shared/hx-textarea-BgX7rxyo.js.map +0 -1
  632. package/dist/shared/hx-theme-6GDoUG8j.js +0 -176
  633. package/dist/shared/hx-theme-6GDoUG8j.js.map +0 -1
  634. package/dist/shared/hx-time-picker-DmLu7WUC.js.map +0 -1
  635. package/dist/shared/hx-toggle-button-D1jpDvSA.js.map +0 -1
  636. package/dist/shared/hx-tooltip-kh7QFPKu.js.map +0 -1
  637. package/dist/shared/hx-tree-item-BP6UF_H1.js.map +0 -1
  638. package/dist/shared/toast-factory-DTy-qN8r.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hx-dropdown-DP_DNpEb.js","sources":["../../src/components/hx-dropdown/hx-dropdown.styles.ts","../../src/components/hx-dropdown/hx-dropdown.ts"],"sourcesContent":["import { css } from 'lit';\n\nexport const helixDropdownStyles = css`\n :host {\n display: inline-block;\n position: relative;\n }\n\n :host([disabled]) {\n pointer-events: none;\n opacity: var(--hx-opacity-disabled, 0.5);\n }\n\n .trigger-wrapper {\n display: inline-block;\n }\n\n [part='panel'] {\n position: fixed;\n z-index: var(--hx-dropdown-panel-z-index, 1000);\n min-width: var(--hx-dropdown-panel-min-width, 160px);\n background: var(--hx-dropdown-panel-bg, var(--hx-color-neutral-0, #ffffff));\n border: 1px solid var(--hx-dropdown-panel-border-color, var(--hx-color-neutral-200, #e5e7eb));\n border-radius: var(--hx-dropdown-panel-border-radius, var(--hx-border-radius-md, 0.375rem));\n box-shadow: var(\n --hx-dropdown-panel-shadow,\n 0 4px 16px var(--hx-overlay-black-12, rgba(0, 0, 0, 0.12))\n );\n visibility: hidden;\n opacity: 0;\n pointer-events: none;\n transition:\n opacity var(--hx-transition-fast, 150ms ease),\n visibility var(--hx-transition-fast, 150ms ease);\n outline: none;\n }\n\n [part='panel'].panel--visible {\n visibility: visible;\n opacity: 1;\n pointer-events: auto;\n }\n\n @media (prefers-reduced-motion: reduce) {\n [part='panel'] {\n transition: none;\n }\n }\n`;\n","import { LitElement, html, nothing, type PropertyValues } from 'lit';\nimport { customElement, property, state, query } from 'lit/decorators.js';\nimport { tokenStyles } from '@helixui/tokens/lit';\nimport { devWarn } from '../../utils/dev-warn.js';\nimport {\n computePosition,\n flip,\n shift,\n offset,\n type Placement as FloatingPlacement,\n} from '@floating-ui/dom';\nimport { helixDropdownStyles } from './hx-dropdown.styles.js';\n\n// P2-03: Export so TypeScript consumers can import this type for prop typing.\nexport type DropdownPlacement =\n | 'top'\n | 'top-start'\n | 'top-end'\n | 'bottom'\n | 'bottom-start'\n | 'bottom-end'\n | 'start'\n | 'end';\n\n/**\n * A dropdown component — a button that opens a floating panel on click.\n *\n * @summary Button that opens a floating menu panel on click.\n *\n * @tag hx-dropdown\n *\n * @slot trigger - The element that opens the dropdown (e.g. hx-button).\n * @slot - Default slot for dropdown panel content (e.g. menu items).\n *\n * @fires {CustomEvent<void>} hx-show - Dispatched when the dropdown is opened.\n * @fires {CustomEvent<void>} hx-hide - Dispatched when the dropdown is closed.\n * @fires {CustomEvent<{value: string | null; label: string}>} hx-select - Dispatched when a menu item is selected.\n *\n * @csspart trigger - The trigger wrapper element.\n * @csspart panel - The floating panel element.\n *\n * @cssprop [--hx-dropdown-panel-bg=var(--hx-color-neutral-0)] - Panel background color.\n * @cssprop [--hx-dropdown-panel-border-color=var(--hx-color-neutral-200)] - Panel border color.\n * @cssprop [--hx-dropdown-panel-border-radius=var(--hx-border-radius-md)] - Panel border radius.\n * @cssprop [--hx-dropdown-panel-shadow=0 4px 16px rgba(0,0,0,0.12)] - Panel box shadow.\n * @cssprop [--hx-dropdown-panel-z-index=1000] - Panel z-index.\n * @cssprop [--hx-dropdown-panel-min-width=160px] - Panel minimum width.\n *\n * @example\n * ```html\n * <hx-dropdown>\n * <button slot=\"trigger\">Open Menu</button>\n * <ul>\n * <li data-value=\"edit\">Edit</li>\n * <li data-value=\"delete\">Delete</li>\n * </ul>\n * </hx-dropdown>\n * ```\n */\n@customElement('hx-dropdown')\nexport class HelixDropdown extends LitElement {\n static override styles = [tokenStyles, helixDropdownStyles];\n\n // ─── Public Properties ───\n\n /**\n * Whether the dropdown panel is open.\n * @attr open\n */\n @property({ type: Boolean, reflect: true })\n open = false;\n\n /**\n * Preferred placement of the panel relative to the trigger.\n * @attr placement\n */\n @property({ type: String, reflect: true })\n placement:\n | 'top'\n | 'top-start'\n | 'top-end'\n | 'bottom'\n | 'bottom-start'\n | 'bottom-end'\n | 'start'\n | 'end' = 'bottom-start';\n\n /**\n * Accessible label for the dropdown menu panel. Override for i18n.\n * @attr label\n */\n @property() label = 'Menu';\n\n /**\n * Whether the dropdown is disabled. Prevents opening.\n * @attr disabled\n */\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n /**\n * Gap in pixels between the trigger and the panel.\n * @attr distance\n */\n @property({ type: Number })\n distance = 4;\n\n // ─── Internal State ───\n\n /**\n * Whether the dropdown panel is currently visible.\n * @internal\n */\n @state() private _panelVisible = false;\n\n /**\n * Guards against accumulating multiple document click listeners when open state\n * changes faster than the microtask queue can process removeEventListener calls.\n * @internal\n */\n private _documentListenerAttached = false;\n\n // P1-02: Unique panel ID for aria-controls.\n /**\n * Monotonically incrementing counter used to generate unique panel IDs across instances.\n * @internal\n */\n private static _instanceCounter = 0;\n /**\n * Unique ID assigned to the floating panel element, referenced by `aria-controls` on the trigger.\n * @internal\n */\n private _panelId = `hx-dropdown-panel-${++HelixDropdown._instanceCounter}`;\n\n /**\n * Reference to the floating panel element inside the shadow DOM.\n * @internal\n */\n @query('[part=\"panel\"]') private _panel: HTMLElement | undefined;\n /**\n * Reference to the trigger wrapper element inside the shadow DOM.\n * @internal\n */\n @query('[part=\"trigger\"]') private _triggerWrapper: HTMLElement | undefined;\n\n // ─── Lifecycle ───\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.addEventListener('keydown', this._handleKeydown);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener('keydown', this._handleKeydown);\n if (this._documentListenerAttached) {\n document.removeEventListener('click', this._handleOutsideClick, { capture: true });\n this._documentListenerAttached = false;\n }\n }\n\n // ─── Open/Close ───\n\n /** @internal */\n private async _show(): Promise<void> {\n if (this.open || this.disabled) return;\n this.open = true;\n this._panelVisible = true;\n // Add outside-click listener synchronously before any await so it is registered\n // by the time the test fires an outside click after a single await el.updateComplete.\n if (!this._documentListenerAttached) {\n document.addEventListener('click', this._handleOutsideClick, { capture: true });\n this._documentListenerAttached = true;\n }\n await this.updateComplete;\n // P0-01: Fix focus management — use slot.assignedElements() to traverse slotted (light DOM) content.\n // Focus is set after updateComplete (panel is rendered) but before _updatePosition so\n // it executes in the same microtask as the test's await-continuation.\n const panel = this._panel;\n if (panel) {\n const firstFocusable = this._getFirstFocusableItem();\n firstFocusable?.focus();\n }\n await this._updatePosition();\n this.dispatchEvent(new CustomEvent<void>('hx-show', { bubbles: true, composed: true }));\n }\n\n // P2-02: returnFocus=true only on Escape; Tab should let focus advance naturally.\n /** @internal */\n private _hide(returnFocus = true): void {\n if (!this.open) return;\n this.open = false;\n this._panelVisible = false;\n if (this._documentListenerAttached) {\n document.removeEventListener('click', this._handleOutsideClick, { capture: true });\n this._documentListenerAttached = false;\n }\n this.dispatchEvent(new CustomEvent<void>('hx-hide', { bubbles: true, composed: true }));\n if (returnFocus) {\n const slot = this.shadowRoot?.querySelector<HTMLSlotElement>('slot[name=\"trigger\"]');\n const trigger = slot?.assignedElements()[0] as HTMLElement | undefined;\n trigger?.focus();\n }\n }\n\n // ─── Positioning ───\n\n /** @internal */\n private async _updatePosition(): Promise<void> {\n const reference = this._triggerWrapper;\n const panel = this._panel;\n if (!reference || !panel) return;\n\n // Map 'start' and 'end' to floating-ui's 'left'/'right'\n const floatingPlacement = this.placement\n .replace(/^start$/, 'left')\n .replace(/^end$/, 'right') as FloatingPlacement;\n\n const { x, y } = await computePosition(reference, panel, {\n placement: floatingPlacement,\n strategy: 'fixed',\n middleware: [offset(this.distance), flip(), shift({ padding: 8 })],\n });\n\n Object.assign(panel.style, {\n left: `${x}px`,\n top: `${y}px`,\n });\n }\n\n // ─── Event Handlers ───\n\n /** @internal */\n private _handleTriggerClick(e: MouseEvent): void {\n e.stopPropagation();\n if (this.open) {\n this._hide();\n } else {\n void this._show();\n }\n }\n\n /** @internal */\n private _handleTriggerKeydown(e: KeyboardEvent): void {\n if (e.key === 'Enter' || e.key === ' ' || e.key === 'ArrowDown') {\n e.preventDefault();\n void this._show();\n }\n }\n\n /** @internal */\n private _handleKeydown = (e: KeyboardEvent): void => {\n if (e.key === 'Escape' && this.open) {\n e.stopPropagation();\n this._hide(true); // return focus to trigger on Escape\n } else if (e.key === 'Tab' && this.open) {\n // P2-02: Do not return focus to trigger on Tab — let focus advance naturally to next page element.\n this._hide(false);\n } else if (\n this.open &&\n (e.key === 'ArrowDown' || e.key === 'ArrowUp' || e.key === 'Home' || e.key === 'End')\n ) {\n // P2-01: Arrow key roving within panel per APG Menu Button pattern.\n e.preventDefault();\n this._handleMenuNavigation(e.key);\n }\n };\n\n // P2-01: Move focus among menuitem elements using arrow keys.\n /** @internal */\n private _handleMenuNavigation(key: string): void {\n const items = this._getFocusableMenuItems();\n if (items.length === 0) return;\n const currentIndex = items.indexOf(document.activeElement as HTMLElement);\n let nextIndex: number;\n if (key === 'ArrowDown') {\n nextIndex = currentIndex < items.length - 1 ? currentIndex + 1 : 0;\n } else if (key === 'ArrowUp') {\n nextIndex = currentIndex > 0 ? currentIndex - 1 : items.length - 1;\n } else if (key === 'Home') {\n nextIndex = 0;\n } else {\n nextIndex = items.length - 1;\n }\n items[nextIndex]?.focus();\n }\n\n // P0-01 / P2-01: Get focusable menu items from slotted content.\n /** @internal */\n private _getFocusableMenuItems(): HTMLElement[] {\n const panel = this._panel;\n if (!panel) return [];\n const slot = panel.querySelector<HTMLSlotElement>('slot');\n const assignedNodes = slot?.assignedElements({ flatten: true }) ?? [];\n const items: HTMLElement[] = [];\n for (const node of assignedNodes) {\n if (!(node instanceof HTMLElement)) continue;\n if (node.matches('[role=\"menuitem\"]')) {\n items.push(node);\n } else {\n node.querySelectorAll<HTMLElement>('[role=\"menuitem\"]').forEach((item) => items.push(item));\n }\n }\n return items;\n }\n\n // P0-01: Find the first focusable element in slotted panel content.\n /** @internal */\n private _getFirstFocusableItem(): HTMLElement | null {\n const panel = this._panel;\n if (!panel) return null;\n const slot = panel.querySelector<HTMLSlotElement>('slot');\n const assignedNodes = slot?.assignedElements({ flatten: true }) ?? [];\n const focusableSelector =\n '[role=\"menuitem\"], button, [tabindex]:not([tabindex=\"-1\"]), a[href], input, select, textarea';\n for (const node of assignedNodes) {\n if (!(node instanceof HTMLElement)) continue;\n if (node.matches(focusableSelector)) return node;\n const found = node.querySelector<HTMLElement>(focusableSelector);\n if (found) return found;\n }\n return null;\n }\n\n /** @internal */\n private _handleOutsideClick = (e: MouseEvent): void => {\n const path = e.composedPath();\n if (!path.includes(this)) {\n this._hide();\n }\n };\n\n /** @internal */\n private _handlePanelClick(e: MouseEvent): void {\n const target = e.target as HTMLElement;\n // P2-06: Narrow selector — bare 'li' and 'button' cause spurious hx-select events.\n const item = target.closest<HTMLElement>('[role=\"menuitem\"], [data-value]');\n if (!item) return;\n\n const value = item.dataset['value'] ?? item.getAttribute('value') ?? null;\n const label = item.textContent?.trim() ?? '';\n\n this.dispatchEvent(\n new CustomEvent<{ value: string | null; label: string }>('hx-select', {\n bubbles: true,\n composed: true,\n detail: { value, label },\n }),\n );\n\n this._hide();\n }\n\n // ─── Render ───\n\n override render() {\n return html`\n <div\n part=\"trigger\"\n class=\"trigger-wrapper\"\n @click=${this._handleTriggerClick}\n @keydown=${this._handleTriggerKeydown}\n >\n <slot name=\"trigger\" @slotchange=${this._onTriggerSlotChange}></slot>\n </div>\n <div\n part=\"panel\"\n id=${this._panelId}\n role=\"menu\"\n aria-hidden=${this._panelVisible ? nothing : 'true'}\n aria-label=${this.label}\n class=${this._panelVisible ? 'panel panel--visible' : 'panel'}\n @click=${this._handlePanelClick}\n >\n <slot @slotchange=${this._onPanelSlotChange}></slot>\n </div>\n `;\n }\n\n // ─── Panel slot validation ───\n\n /** @internal */\n private _onPanelSlotChange(e: Event): void {\n const slot = e.target as HTMLSlotElement;\n const assigned = slot.assignedElements({ flatten: true });\n const nonItems = assigned.filter((el) => el.tagName.toLowerCase() !== 'hx-dropdown-item');\n if (nonItems.length > 0) {\n devWarn(\n 'hx-dropdown',\n `Default slot should contain only hx-dropdown-item elements. Found unexpected: ${nonItems.map((el) => `<${el.tagName.toLowerCase()}>`).join(', ')}. Non-hx-dropdown-item children will be included in keyboard navigation incorrectly.`,\n );\n }\n }\n\n // ─── ARIA setup for trigger slot ───\n\n /** @internal */\n private _onTriggerSlotChange(): void {\n this._setupTriggerAria();\n }\n\n override firstUpdated(): void {\n this._setupTriggerAria();\n }\n\n /** @internal */\n private _setupTriggerAria(): void {\n const slot = this.shadowRoot?.querySelector<HTMLSlotElement>('slot[name=\"trigger\"]');\n if (!slot) return;\n const trigger = slot.assignedElements()[0] as HTMLElement | undefined;\n if (trigger) {\n // P1-01: Use aria-haspopup=\"menu\" per ARIA 1.1+ / APG Menu Button pattern.\n trigger.setAttribute('aria-haspopup', 'menu');\n trigger.setAttribute('aria-expanded', String(this.open));\n // aria-controls is intentionally omitted: the panel lives in Shadow DOM and\n // IDREF values cannot be resolved across shadow boundaries by assistive technology.\n // P2-06: Remove host fallback when a trigger element is present.\n this.removeAttribute('aria-expanded');\n } else {\n // P2-06: Fallback — set aria-expanded on host when trigger slot is empty or unassigned.\n this.setAttribute('aria-expanded', String(this.open));\n }\n }\n\n override updated(changedProperties: PropertyValues<this>): void {\n super.updated(changedProperties);\n if (changedProperties.has('open')) {\n // Keep aria-expanded in sync\n const slot = this.shadowRoot?.querySelector<HTMLSlotElement>('slot[name=\"trigger\"]');\n const trigger = slot?.assignedElements()[0] as HTMLElement | undefined;\n if (trigger) {\n trigger.setAttribute('aria-expanded', String(this.open));\n } else {\n // P2-06: Fallback — keep host aria-expanded in sync when trigger slot is empty.\n this.setAttribute('aria-expanded', String(this.open));\n }\n }\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'hx-dropdown': HelixDropdown;\n }\n}\n"],"names":["helixDropdownStyles","css","HelixDropdown","LitElement","firstFocusable","returnFocus","slot","_a","trigger","reference","panel","floatingPlacement","x","y","computePosition","offset","flip","shift","key","items","currentIndex","nextIndex","assignedNodes","node","item","focusableSelector","found","value","label","html","nothing","nonItems","el","devWarn","changedProperties","tokenStyles","__decorateClass","property","state","query","customElement"],"mappings":"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"}
@@ -119,7 +119,7 @@ const v = p`
119
119
 
120
120
  .field--error .field__control {
121
121
  outline: 2px solid var(--hx-field-error-color, var(--hx-color-error-500, #ef4444));
122
- outline-offset: 2px;
122
+ outline-offset: var(--hx-focus-ring-offset, 2px);
123
123
  border-radius: var(--hx-border-radius-sm, 0.25rem);
124
124
  }
125
125
  `;
@@ -135,7 +135,7 @@ function C(e) {
135
135
  }
136
136
  let r = class extends _ {
137
137
  constructor() {
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;
138
+ super(...arguments), this.label = "", this.required = !1, this.error = "", this.helpText = "", this.disabled = !1, this.size = "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;
139
139
  }
140
140
  /** @internal */
141
141
  _handleLabelSlotChange(e) {
@@ -160,9 +160,9 @@ let r = class extends _ {
160
160
  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);
161
161
  }
162
162
  updated(e) {
163
- super.updated(e), e.has("hxSize") && (["sm", "md", "lg"].includes(this.hxSize) || m(
163
+ super.updated(e), e.has("size") && (["sm", "md", "lg"].includes(this.size) || m(
164
164
  "hx-field",
165
- `Invalid hx-size value: "${this.hxSize}". Expected "sm" | "md" | "lg". Defaulting to "md".`
165
+ `Invalid hx-size value: "${this.size}". Expected "sm" | "md" | "lg". Defaulting to "md".`
166
166
  )), this._syncA11yDescEl(), this._syncSlottedControl();
167
167
  }
168
168
  /** Creates a visually-hidden span in light DOM used as the ARIA description anchor. */
@@ -222,9 +222,9 @@ let r = class extends _ {
222
222
  "field--error": e,
223
223
  "field--disabled": this.disabled,
224
224
  "field--required": this.required,
225
- "field--size-sm": this.hxSize === "sm",
226
- "field--size-md": this.hxSize === "md",
227
- "field--size-lg": this.hxSize === "lg",
225
+ "field--size-sm": this.size === "sm",
226
+ "field--size-md": this.size === "md",
227
+ "field--size-lg": this.size === "lg",
228
228
  "field--layout-inline": this.layout === "inline"
229
229
  };
230
230
  return n`
@@ -297,7 +297,7 @@ l([
297
297
  ], r.prototype, "disabled", 2);
298
298
  l([
299
299
  o({ type: String, attribute: "hx-size", reflect: !0 })
300
- ], r.prototype, "hxSize", 2);
300
+ ], r.prototype, "size", 2);
301
301
  l([
302
302
  o({ type: String, reflect: !0 })
303
303
  ], r.prototype, "layout", 2);
@@ -316,4 +316,4 @@ r = l([
316
316
  export {
317
317
  r as H
318
318
  };
319
- //# sourceMappingURL=hx-field-3MmzJ4kZ.js.map
319
+ //# sourceMappingURL=hx-field-COM4KvMQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hx-field-COM4KvMQ.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: var(--hx-focus-ring-offset, 2px);\n border-radius: var(--hx-border-radius-sm, 0.25rem);\n }\n`;\n","import { LitElement, html, nothing, type PropertyValues } 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 size: '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 /** @internal */\n private _handleLabelSlotChange(e: Event): void {\n const slot = e.target as HTMLSlotElement;\n this._hasLabelSlot = slot.assignedElements().length > 0;\n }\n\n /** @internal */\n private _handleErrorSlotChange(e: Event): void {\n const slot = e.target as HTMLSlotElement;\n this._hasErrorSlot = slot.assignedElements().length > 0;\n }\n\n /** @internal */\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: PropertyValues<this>): void {\n super.updated(changedProps);\n\n // P2-01: Warn on invalid size values\n if (changedProps.has('size')) {\n const validSizes = ['sm', 'md', 'lg'];\n if (!validSizes.includes(this.size)) {\n devWarn(\n 'hx-field',\n `Invalid hx-size value: \"${this.size}\". 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 /** @internal */\n private _ensureA11yDescEl(): void {\n if (this._a11yDescEl) return;\n // Guard for SSR — document is unavailable server-side\n if (typeof document === 'undefined') 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 /** @internal */\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 /** @internal */\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 /** @internal */\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 /** @internal */\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.size === 'sm',\n 'field--size-md': this.size === 'md',\n 'field--size-lg': this.size === '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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"}
@@ -18,10 +18,7 @@ const v = f`
18
18
  }
19
19
 
20
20
  .required-indicator {
21
- color: var(
22
- --hx-field-label-required-color,
23
- var(--hx-color-danger, var(--hx-color-error-text, #b91c1c))
24
- );
21
+ color: var(--hx-field-label-required-color, var(--hx-color-error-text, #b91c1c));
25
22
  font-weight: var(--hx-font-weight-bold, 700);
26
23
  }
27
24
 
@@ -43,20 +40,20 @@ const v = f`
43
40
  border: 0;
44
41
  }
45
42
  `;
46
- var b = Object.defineProperty, m = Object.getOwnPropertyDescriptor, n = (l, r, t, i) => {
47
- for (var e = i > 1 ? void 0 : i ? m(r, t) : r, s = l.length - 1, p; s >= 0; s--)
48
- (p = l[s]) && (e = (i ? p(r, t, e) : p(e)) || e);
49
- return i && e && b(r, t, e), e;
43
+ var b = Object.defineProperty, m = Object.getOwnPropertyDescriptor, n = (i, r, t, l) => {
44
+ for (var e = l > 1 ? void 0 : l ? m(r, t) : r, s = i.length - 1, p; s >= 0; s--)
45
+ (p = i[s]) && (e = (l ? p(r, t, e) : p(e)) || e);
46
+ return l && e && b(r, t, e), e;
50
47
  };
51
48
  let o = class extends d {
52
49
  constructor() {
53
50
  super(...arguments), this.for = "", this.required = !1, this.optional = !1;
54
51
  }
55
52
  render() {
56
- const l = this.required ? a`<span part="required-indicator" class="required-indicator"
53
+ const i = this.required ? a`<span part="required-indicator" class="required-indicator"
57
54
  ><span aria-hidden="true"><slot name="required-indicator">*</slot></span
58
55
  ><span class="visually-hidden">required</span></span
59
- >` : c, r = this.optional ? a`<span part="optional-indicator" class="optional-indicator">(optional)</span>` : c, t = a`<slot></slot>${l}${r}`;
56
+ >` : c, r = this.optional ? a`<span part="optional-indicator" class="optional-indicator">(optional)</span>` : c, t = a`<slot></slot>${i}${r}`;
60
57
  return this.for ? a`<label part="base" class="label" for=${this.for}>${t}</label>` : a`<span part="base" class="label">${t}</span>`;
61
58
  }
62
59
  };
@@ -76,4 +73,4 @@ o = n([
76
73
  export {
77
74
  o as H
78
75
  };
79
- //# sourceMappingURL=hx-field-label-Bg-EWvqF.js.map
76
+ //# sourceMappingURL=hx-field-label-BtZ9H9Yy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hx-field-label-BtZ9H9Yy.js","sources":["../../src/components/hx-field-label/hx-field-label.styles.ts","../../src/components/hx-field-label/hx-field-label.ts"],"sourcesContent":["import { css } from 'lit';\n\nexport const helixFieldLabelStyles = css`\n :host {\n display: block;\n }\n\n .label {\n display: inline-flex;\n align-items: baseline;\n gap: var(--hx-space-1, 0.25rem);\n font-size: var(--hx-font-label-size, var(--hx-font-size-sm, 0.875rem));\n font-weight: var(--hx-font-label-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-font-label-line-height, var(--hx-line-height-normal, 1.5));\n font-family: var(--hx-font-label-family, var(--hx-font-family-sans, sans-serif));\n }\n\n .required-indicator {\n color: var(--hx-field-label-required-color, var(--hx-color-error-text, #b91c1c));\n font-weight: var(--hx-font-weight-bold, 700);\n }\n\n .optional-indicator {\n font-size: var(--hx-font-size-xs, 0.75rem);\n font-weight: var(--hx-font-weight-normal, 400);\n color: var(--hx-color-neutral-500, #6b7280);\n }\n\n .visually-hidden {\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: 0;\n }\n`;\n","import { LitElement, html, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { tokenStyles } from '@helixui/tokens/lit';\nimport { helixFieldLabelStyles } from './hx-field-label.styles.js';\n\n/**\n * Standardized label for form fields. Used as a consistent sub-component\n * for hx-field and other form field components.\n *\n * ## Label Association\n *\n * **For inputs in light DOM (the typical consumer deployment):** Use\n * `aria-labelledby` pointing to the host element's `id`. The `for` attribute\n * renders a native `<label for=\"...\">` inside shadow DOM, but the HTML spec\n * scopes `for`/`id` lookup to the same tree — a shadow-DOM label cannot\n * associate with a light-DOM input. Example:\n *\n * ```html\n * <hx-field-label id=\"label-email\">Email</hx-field-label>\n * <input id=\"email\" aria-labelledby=\"label-email\" />\n * ```\n *\n * **For inputs in the same shadow root:** The `for` attribute works as\n * expected for direct label association.\n *\n * When `for` is unset, renders a `<span>` that can be referenced via\n * `aria-labelledby` for labeling controls across the shadow DOM boundary.\n *\n * @summary Standardized label for form fields.\n *\n * @tag hx-field-label\n *\n * @slot - Label text content.\n * @slot required-indicator - Custom required marker (defaults to \"*\").\n *\n * @csspart base - The label or span element.\n * @csspart required-indicator - The required indicator wrapper.\n * @csspart optional-indicator - The optional text indicator.\n *\n * @cssprop [--hx-field-label-color=var(--hx-color-neutral-700)] - Label text color.\n * @cssprop [--hx-field-label-required-color=var(--hx-color-danger, var(--hx-color-error-text, #b91c1c))] - Required indicator color.\n * @cssprop [--hx-font-label-size=var(--hx-font-size-sm)] - Label font size.\n * @cssprop [--hx-font-label-weight=var(--hx-font-weight-medium)] - Label font weight.\n * @cssprop [--hx-font-label-line-height=var(--hx-line-height-normal)] - Label line height.\n * @cssprop [--hx-font-label-family=var(--hx-font-family-sans)] - Label font family.\n */\n@customElement('hx-field-label')\nexport class HelixFieldLabel extends LitElement {\n static override styles = [tokenStyles, helixFieldLabelStyles];\n\n /**\n * The ID of the associated form control. When set, renders a native\n * `<label for=\"...\">` element for direct label association.\n * @attr for\n */\n @property({ type: String })\n for = '';\n\n /**\n * Whether the associated field is required. Shows a required indicator (*).\n * @attr required\n */\n @property({ type: Boolean, reflect: true })\n required = false;\n\n /**\n * Whether the associated field is optional. Shows \"(optional)\" text.\n * @attr optional\n */\n @property({ type: Boolean, reflect: true })\n optional = false;\n\n override render() {\n const requiredIndicator = this.required\n ? html`<span part=\"required-indicator\" class=\"required-indicator\"\n ><span aria-hidden=\"true\"><slot name=\"required-indicator\">*</slot></span\n ><span class=\"visually-hidden\">required</span></span\n >`\n : nothing;\n\n const optionalIndicator = this.optional\n ? html`<span part=\"optional-indicator\" class=\"optional-indicator\">(optional)</span>`\n : nothing;\n\n const content = html`<slot></slot>${requiredIndicator}${optionalIndicator}`;\n\n if (this.for) {\n return html`<label part=\"base\" class=\"label\" for=${this.for}>${content}</label>`;\n }\n\n return html`<span part=\"base\" class=\"label\">${content}</span>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'hx-field-label': HelixFieldLabel;\n }\n}\n"],"names":["helixFieldLabelStyles","css","HelixFieldLabel","LitElement","requiredIndicator","html","nothing","optionalIndicator","content","tokenStyles","__decorateClass","property","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;;;;;;AC6C9B,IAAMC,IAAN,cAA8BC,EAAW;AAAA,EAAzC,cAAA;AAAA,UAAA,GAAA,SAAA,GASL,KAAA,MAAM,IAON,KAAA,WAAW,IAOX,KAAA,WAAW;AAAA,EAAA;AAAA,EAEF,SAAS;AAChB,UAAMC,IAAoB,KAAK,WAC3BC;AAAA;AAAA;AAAA,aAIAC,GAEEC,IAAoB,KAAK,WAC3BF,kFACAC,GAEEE,IAAUH,iBAAoBD,CAAiB,GAAGG,CAAiB;AAEzE,WAAI,KAAK,MACAF,yCAA4C,KAAK,GAAG,IAAIG,CAAO,aAGjEH,oCAAuCG,CAAO;AAAA,EACvD;AACF;AA7CaN,EACK,SAAS,CAACO,GAAaT,CAAqB;AAQ5DU,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GARfT,EASX,WAAA,OAAA,CAAA;AAOAQ,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,SAAS,SAAS,IAAM;AAAA,GAf/BT,EAgBX,WAAA,YAAA,CAAA;AAOAQ,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,SAAS,SAAS,IAAM;AAAA,GAtB/BT,EAuBX,WAAA,YAAA,CAAA;AAvBWA,IAANQ,EAAA;AAAA,EADNE,EAAc,gBAAgB;AAAA,GAClBV,CAAA;"}
@@ -1,10 +1,10 @@
1
- import { css as b, LitElement as g, nothing as p, html as f } from "lit";
2
- import { property as a, state as x, query as _, customElement as y } from "lit/decorators.js";
1
+ import { css as x, LitElement as g, nothing as p, html as c } from "lit";
2
+ import { property as a, state as b, 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";
6
6
  import { tokenStyles as z } from "@helixui/tokens/lit";
7
- const F = b`
7
+ const F = x`
8
8
  :host {
9
9
  display: block;
10
10
  }
@@ -45,7 +45,7 @@ const F = b`
45
45
  align-items: center;
46
46
  justify-content: center;
47
47
  gap: var(--hx-space-2, 0.5rem);
48
- min-height: var(--hx-size-32, 8rem);
48
+ min-height: var(--hx-space-32, 8rem);
49
49
  padding: var(--hx-space-6, 1.5rem) var(--hx-space-4, 1rem);
50
50
  border: var(--hx-border-width-thin, 1px) dashed
51
51
  var(--hx-file-upload-dropzone-border-color, var(--hx-color-neutral-300, #ced4da));
@@ -202,7 +202,7 @@ const F = b`
202
202
 
203
203
  .progress-track {
204
204
  width: 100%;
205
- height: 4px;
205
+ height: var(--hx-file-upload-progress-height, var(--hx-space-1, 0.25rem));
206
206
  background-color: var(--hx-color-neutral-200, #e9ecef);
207
207
  border-radius: var(--hx-border-radius-full, 9999px);
208
208
  overflow: hidden;
@@ -246,14 +246,14 @@ const F = b`
246
246
  line-height: var(--hx-line-height-normal, 1.5);
247
247
  }
248
248
  `;
249
- var k = Object.defineProperty, D = Object.getOwnPropertyDescriptor, o = (e, r, i, s) => {
250
- for (var l = s > 1 ? void 0 : s ? D(r, i) : r, d = e.length - 1, n; d >= 0; d--)
251
- (n = e[d]) && (l = (s ? n(r, i, l) : n(l)) || l);
252
- return s && l && k(r, i, l), l;
249
+ var D = Object.defineProperty, k = Object.getOwnPropertyDescriptor, o = (e, r, t, s) => {
250
+ for (var l = s > 1 ? void 0 : s ? k(r, t) : r, d = e.length - 1, n; d >= 0; d--)
251
+ (n = e[d]) && (l = (s ? n(r, t, l) : n(l)) || l);
252
+ return s && l && D(r, t, l), l;
253
253
  };
254
- let S = 0, t = class extends g {
254
+ let S = 0, i = class extends g {
255
255
  constructor() {
256
- 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.labelFileList = "Selected files", this.labelUploadProgress = (e, r) => `Upload progress for ${e}: ${r}%`, this._files = [], this._dragOver = !1, this._hasFileListSlot = !1, this._baseId = `hx-file-upload-${++S}`, this._labelId = `${this._baseId}-label`, this._errorId = `${this._baseId}-error`, this._dropzoneId = `${this._baseId}-dropzone`, this._liveId = `${this._baseId}-live`, this._internals = this.attachInternals();
256
+ 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.labelFileList = "Selected files", this.labelUploadProgress = (e, r) => `Upload progress for ${e}: ${r}%`, this.labelDragDetected = "File detected. Release to upload.", this._files = [], this._dragOver = !1, this._hasFileListSlot = !1, this._baseId = `hx-file-upload-${++S}`, this._labelId = `${this._baseId}-label`, this._errorId = `${this._baseId}-error`, this._dropzoneId = `${this._baseId}-dropzone`, this._liveId = `${this._baseId}-live`, this._internals = this.attachInternals();
257
257
  }
258
258
  // ─── Slot Handling ───
259
259
  /** @internal */
@@ -286,21 +286,15 @@ let S = 0, t = class extends g {
286
286
  reportValidity() {
287
287
  return this._internals.reportValidity();
288
288
  }
289
- /** Called by the form when it resets. */
289
+ /** @internal */
290
290
  formResetCallback() {
291
291
  this._files = [], this._internals.setFormValue(null);
292
292
  }
293
- /** Called when a parent fieldset is disabled/enabled. */
293
+ /** @internal */
294
294
  formDisabledCallback(e) {
295
295
  this.disabled = e;
296
296
  }
297
- /**
298
- * Called by the browser to restore form state during back/forward navigation
299
- * or autocomplete. File objects cannot be persisted across navigation sessions,
300
- * so this callback clears the selection to avoid stale UI state.
301
- * @param _state - Previously saved form state (not usable for File restoration).
302
- * @param mode - 'restore' for back/forward navigation, 'autocomplete' for autofill.
303
- */
297
+ /** @internal */
304
298
  formStateRestoreCallback(e, r) {
305
299
  (r === "restore" || r === "autocomplete") && (this._files = [], this._internals.setFormValue(null));
306
300
  }
@@ -342,24 +336,24 @@ let S = 0, t = class extends g {
342
336
  */
343
337
  /** @internal */
344
338
  _isAccepted(e) {
345
- const r = this.accept.split(",").map((i) => i.trim().toLowerCase());
346
- for (const i of r)
347
- if (i.startsWith(".")) {
348
- if (e.name.toLowerCase().endsWith(i)) return !0;
349
- } else if (i.endsWith("/*")) {
350
- const s = i.slice(0, -2);
339
+ const r = this.accept.split(",").map((t) => t.trim().toLowerCase());
340
+ for (const t of r)
341
+ if (t.startsWith(".")) {
342
+ if (e.name.toLowerCase().endsWith(t)) return !0;
343
+ } else if (t.endsWith("/*")) {
344
+ const s = t.slice(0, -2);
351
345
  if (e.type.toLowerCase().startsWith(s)) return !0;
352
- } else if (e.type.toLowerCase() === i) return !0;
346
+ } else if (e.type.toLowerCase() === t) return !0;
353
347
  return !1;
354
348
  }
355
349
  // ─── File Processing ───
356
350
  /** @internal */
357
351
  _processFiles(e) {
358
352
  if (this.disabled) return;
359
- const r = this.multiple ? e : e.slice(0, 1), i = [], s = [], l = [];
353
+ const r = this.multiple ? e : e.slice(0, 1), t = [], s = [], l = [];
360
354
  for (const h of r) {
361
355
  const m = this._validateFile(h);
362
- m ? (s.push(h), l.push(m)) : i.push(h);
356
+ m ? (s.push(h), l.push(m)) : t.push(h);
363
357
  }
364
358
  if (s.length > 0 && this.dispatchEvent(
365
359
  new CustomEvent("hx-error", {
@@ -367,32 +361,32 @@ let S = 0, t = class extends g {
367
361
  composed: !0,
368
362
  detail: { message: l.join(" "), files: s }
369
363
  })
370
- ), i.length === 0) return;
371
- const d = this.multiple ? this._files.length : 0, n = this.maxFiles > 0 ? Math.max(0, this.maxFiles - d) : i.length, c = i.slice(0, n);
372
- if (c.length === 0 && this.maxFiles > 0) {
364
+ ), t.length === 0) return;
365
+ const d = this.multiple ? this._files.length : 0, n = this.maxFiles > 0 ? Math.max(0, this.maxFiles - d) : t.length, f = t.slice(0, n);
366
+ if (f.length === 0 && this.maxFiles > 0) {
373
367
  this.dispatchEvent(
374
368
  new CustomEvent("hx-error", {
375
369
  bubbles: !0,
376
370
  composed: !0,
377
371
  detail: {
378
372
  message: `Maximum of ${this.maxFiles} file${this.maxFiles === 1 ? "" : "s"} allowed.`,
379
- files: i
373
+ files: t
380
374
  }
381
375
  })
382
376
  );
383
377
  return;
384
378
  }
385
- if (c.length > 0) {
386
- const h = c.map((m) => ({ file: m, progress: 0 }));
379
+ if (f.length > 0) {
380
+ const h = f.map((m) => ({ file: m, progress: 0 }));
387
381
  this.multiple ? this._files = [...this._files, ...h] : this._files = h, this.dispatchEvent(
388
382
  new CustomEvent("hx-upload", {
389
383
  bubbles: !0,
390
384
  composed: !0,
391
- detail: { files: c }
385
+ detail: { files: f }
392
386
  })
393
387
  );
394
388
  }
395
- const u = i.slice(n);
389
+ const u = t.slice(n);
396
390
  u.length > 0 && this.maxFiles > 0 && this.dispatchEvent(
397
391
  new CustomEvent("hx-error", {
398
392
  bubbles: !0,
@@ -412,9 +406,9 @@ let S = 0, t = class extends g {
412
406
  */
413
407
  setProgress(e, r) {
414
408
  if (e < 0 || e >= this._files.length) return;
415
- const i = Math.max(0, Math.min(100, r));
409
+ const t = Math.max(0, Math.min(100, r));
416
410
  this._files = this._files.map(
417
- (s, l) => l === e ? { ...s, progress: i } : s
411
+ (s, l) => l === e ? { ...s, progress: t } : s
418
412
  );
419
413
  }
420
414
  /**
@@ -433,16 +427,16 @@ let S = 0, t = class extends g {
433
427
  var s;
434
428
  const r = e.relatedTarget;
435
429
  if (r && this.contains(r)) return;
436
- const i = (s = this.shadowRoot) == null ? void 0 : s.querySelector(".dropzone");
437
- i && i.contains(r) || (this._dragOver = !1);
430
+ const t = (s = this.shadowRoot) == null ? void 0 : s.querySelector(".dropzone");
431
+ t && t.contains(r) || (this._dragOver = !1);
438
432
  }
439
433
  /** @internal */
440
434
  _handleDrop(e) {
441
435
  if (e.preventDefault(), this._dragOver = !1, this.disabled) return;
442
436
  const r = e.dataTransfer;
443
437
  if (!r) return;
444
- const i = Array.from(r.files);
445
- i.length !== 0 && this._processFiles(i);
438
+ const t = Array.from(r.files);
439
+ t.length !== 0 && this._processFiles(t);
446
440
  }
447
441
  // ─── Click / Keyboard Handlers ───
448
442
  /** @internal */
@@ -459,8 +453,8 @@ let S = 0, t = class extends g {
459
453
  _handleFileInputChange(e) {
460
454
  const r = e.target;
461
455
  if (!r.files || r.files.length === 0) return;
462
- const i = Array.from(r.files);
463
- r.value = "", this._processFiles(i);
456
+ const t = Array.from(r.files);
457
+ r.value = "", this._processFiles(t);
464
458
  }
465
459
  // ─── Remove Handler ───
466
460
  /** @internal */
@@ -468,12 +462,12 @@ let S = 0, t = class extends g {
468
462
  if (this.disabled) return;
469
463
  const r = this._files[e];
470
464
  if (!r) return;
471
- const i = r.file;
465
+ const t = r.file;
472
466
  this._files = this._files.filter((s, l) => l !== e), this.dispatchEvent(
473
467
  new CustomEvent("hx-remove", {
474
468
  bubbles: !0,
475
469
  composed: !0,
476
- detail: { file: i, index: e }
470
+ detail: { file: t, index: e }
477
471
  })
478
472
  );
479
473
  }
@@ -485,12 +479,12 @@ let S = 0, t = class extends g {
485
479
  // ─── Render Helpers ───
486
480
  /** @internal */
487
481
  _renderFileList() {
488
- return this._hasFileListSlot ? p : this._files.length === 0 ? p : f`
482
+ return this._hasFileListSlot ? p : this._files.length === 0 ? p : c`
489
483
  <ul part="file-list" class="file-list" aria-label=${this.labelFileList}>
490
484
  ${$(
491
485
  this._files,
492
486
  (e) => e.file.name + e.file.size,
493
- (e, r) => f`
487
+ (e, r) => c`
494
488
  <li part="file-item" class="file-item">
495
489
  <div class="file-item__row">
496
490
  <span class="file-item__name" title=${e.file.name}> ${e.file.name} </span>
@@ -545,10 +539,10 @@ let S = 0, t = class extends g {
545
539
  dropzone: !0,
546
540
  "dropzone--drag-over": this._dragOver,
547
541
  "dropzone--error": e
548
- }, i = this.label ? `${this.label} — ${this.labelDropzone}` : this.labelDropzone;
549
- return f`
542
+ }, t = this.label ? `${this.label} — ${this.labelDropzone}` : this.labelDropzone;
543
+ return c`
550
544
  <div class="field">
551
- ${this.label ? f`
545
+ ${this.label ? c`
552
546
  <label part="label" class="field__label" id=${this._labelId} for=${this._dropzoneId}>
553
547
  ${this.label}
554
548
  </label>
@@ -560,7 +554,7 @@ let S = 0, t = class extends g {
560
554
  id=${this._dropzoneId}
561
555
  role="button"
562
556
  tabindex=${this.disabled ? "-1" : "0"}
563
- aria-label=${v(this.label ? void 0 : i)}
557
+ aria-label=${v(this.label ? void 0 : t)}
564
558
  aria-labelledby=${v(this.label ? this._labelId : void 0)}
565
559
  aria-disabled=${this.disabled ? "true" : p}
566
560
  aria-describedby=${v(e ? this._errorId : void 0)}
@@ -587,76 +581,73 @@ let S = 0, t = class extends g {
587
581
  <slot name="file-list" @slotchange=${this._handleFileListSlotChange}></slot>
588
582
 
589
583
  ${this._renderFileList()}
590
- ${e ? f`
591
- <div
592
- part="error"
593
- class="field__error"
594
- id=${this._errorId}
595
- role="alert"
596
- aria-live="polite"
597
- >
584
+ ${e ? c`
585
+ <div part="error" class="field__error" id=${this._errorId} role="alert">
598
586
  ${this.error}
599
587
  </div>
600
588
  ` : p}
601
589
 
602
- <div id=${this._liveId} class="sr-only" aria-live="assertive" aria-atomic="true">
603
- ${this._dragOver ? "File detected. Release to upload." : ""}
590
+ <div id=${this._liveId} class="sr-only" aria-live="polite" aria-atomic="true">
591
+ ${this._dragOver ? this.labelDragDetected : ""}
604
592
  </div>
605
593
  </div>
606
594
  `;
607
595
  }
608
596
  };
609
- t.styles = [z, F];
610
- t.formAssociated = !0;
597
+ i.styles = [z, F];
598
+ i.formAssociated = !0;
611
599
  o([
612
600
  a({ type: String })
613
- ], t.prototype, "name", 2);
601
+ ], i.prototype, "name", 2);
614
602
  o([
615
603
  a({ type: String })
616
- ], t.prototype, "accept", 2);
604
+ ], i.prototype, "accept", 2);
617
605
  o([
618
606
  a({ type: Number, attribute: "max-size" })
619
- ], t.prototype, "maxSize", 2);
607
+ ], i.prototype, "maxSize", 2);
620
608
  o([
621
609
  a({ type: Number, attribute: "max-files" })
622
- ], t.prototype, "maxFiles", 2);
610
+ ], i.prototype, "maxFiles", 2);
623
611
  o([
624
612
  a({ type: Boolean })
625
- ], t.prototype, "multiple", 2);
613
+ ], i.prototype, "multiple", 2);
626
614
  o([
627
615
  a({ type: String })
628
- ], t.prototype, "label", 2);
616
+ ], i.prototype, "label", 2);
629
617
  o([
630
618
  a({ type: Boolean, reflect: !0 })
631
- ], t.prototype, "disabled", 2);
619
+ ], i.prototype, "disabled", 2);
632
620
  o([
633
621
  a({ type: String })
634
- ], t.prototype, "error", 2);
622
+ ], i.prototype, "error", 2);
635
623
  o([
636
624
  a({ type: String, attribute: "label-dropzone" })
637
- ], t.prototype, "labelDropzone", 2);
625
+ ], i.prototype, "labelDropzone", 2);
638
626
  o([
639
627
  a({ type: String, attribute: "label-file-list" })
640
- ], t.prototype, "labelFileList", 2);
628
+ ], i.prototype, "labelFileList", 2);
641
629
  o([
642
630
  a({ attribute: !1 })
643
- ], t.prototype, "labelUploadProgress", 2);
631
+ ], i.prototype, "labelUploadProgress", 2);
632
+ o([
633
+ a({ attribute: "label-drag-detected" })
634
+ ], i.prototype, "labelDragDetected", 2);
644
635
  o([
645
- x()
646
- ], t.prototype, "_files", 2);
636
+ b()
637
+ ], i.prototype, "_files", 2);
647
638
  o([
648
- x()
649
- ], t.prototype, "_dragOver", 2);
639
+ b()
640
+ ], i.prototype, "_dragOver", 2);
650
641
  o([
651
- x()
652
- ], t.prototype, "_hasFileListSlot", 2);
642
+ b()
643
+ ], i.prototype, "_hasFileListSlot", 2);
653
644
  o([
654
645
  _(".file-input")
655
- ], t.prototype, "_fileInput", 2);
656
- t = o([
646
+ ], i.prototype, "_fileInput", 2);
647
+ i = o([
657
648
  y("hx-file-upload")
658
- ], t);
649
+ ], i);
659
650
  export {
660
- t as H
651
+ i as H
661
652
  };
662
- //# sourceMappingURL=hx-file-upload-ByjAgfNy.js.map
653
+ //# sourceMappingURL=hx-file-upload-DbECypLe.js.map