@helixui/library 2.1.2 → 3.0.0-next.62

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 (819) hide show
  1. package/custom-elements.json +904 -1044
  2. package/dist/base/helix-element.d.ts +20 -8
  3. package/dist/base/helix-element.d.ts.map +1 -1
  4. package/dist/components/hx-accordion/hx-accordion-item.d.ts +7 -4
  5. package/dist/components/hx-accordion/hx-accordion-item.d.ts.map +1 -1
  6. package/dist/components/hx-accordion/hx-accordion-item.styles.d.ts.map +1 -1
  7. package/dist/components/hx-accordion/hx-accordion.d.ts +3 -2
  8. package/dist/components/hx-accordion/hx-accordion.d.ts.map +1 -1
  9. package/dist/components/hx-accordion/hx-accordion.styles.d.ts.map +1 -1
  10. package/dist/components/hx-accordion/index.d.ts +1 -0
  11. package/dist/components/hx-accordion/index.d.ts.map +1 -1
  12. package/dist/components/hx-accordion/index.js +1 -1
  13. package/dist/components/hx-action-bar/hx-action-bar.d.ts +26 -14
  14. package/dist/components/hx-action-bar/hx-action-bar.d.ts.map +1 -1
  15. package/dist/components/hx-action-bar/hx-action-bar.styles.d.ts.map +1 -1
  16. package/dist/components/hx-action-bar/index.js +1 -1
  17. package/dist/components/hx-alert/hx-alert.d.ts +7 -2
  18. package/dist/components/hx-alert/hx-alert.d.ts.map +1 -1
  19. package/dist/components/hx-alert/hx-alert.styles.d.ts.map +1 -1
  20. package/dist/components/hx-alert/index.d.ts +1 -0
  21. package/dist/components/hx-alert/index.d.ts.map +1 -1
  22. package/dist/components/hx-alert/index.js +1 -1
  23. package/dist/components/hx-avatar/hx-avatar.d.ts +3 -2
  24. package/dist/components/hx-avatar/hx-avatar.d.ts.map +1 -1
  25. package/dist/components/hx-avatar/index.js +1 -1
  26. package/dist/components/hx-badge/hx-badge.d.ts +2 -9
  27. package/dist/components/hx-badge/hx-badge.d.ts.map +1 -1
  28. package/dist/components/hx-badge/hx-badge.styles.d.ts.map +1 -1
  29. package/dist/components/hx-badge/index.d.ts +1 -1
  30. package/dist/components/hx-badge/index.d.ts.map +1 -1
  31. package/dist/components/hx-badge/index.js +1 -1
  32. package/dist/components/hx-banner/hx-banner.d.ts +3 -2
  33. package/dist/components/hx-banner/hx-banner.d.ts.map +1 -1
  34. package/dist/components/hx-banner/hx-banner.styles.d.ts.map +1 -1
  35. package/dist/components/hx-banner/index.js +1 -1
  36. package/dist/components/hx-breadcrumb/hx-breadcrumb-item.d.ts +2 -2
  37. package/dist/components/hx-breadcrumb/hx-breadcrumb-item.d.ts.map +1 -1
  38. package/dist/components/hx-breadcrumb/hx-breadcrumb-item.styles.d.ts.map +1 -1
  39. package/dist/components/hx-breadcrumb/hx-breadcrumb.d.ts +9 -19
  40. package/dist/components/hx-breadcrumb/hx-breadcrumb.d.ts.map +1 -1
  41. package/dist/components/hx-breadcrumb/hx-breadcrumb.styles.d.ts.map +1 -1
  42. package/dist/components/hx-breadcrumb/index.js +1 -1
  43. package/dist/components/hx-button/hx-button.d.ts +31 -9
  44. package/dist/components/hx-button/hx-button.d.ts.map +1 -1
  45. package/dist/components/hx-button/hx-button.styles.d.ts.map +1 -1
  46. package/dist/components/hx-button/index.d.ts +1 -0
  47. package/dist/components/hx-button/index.d.ts.map +1 -1
  48. package/dist/components/hx-button/index.js +1 -1
  49. package/dist/components/hx-button-group/hx-button-group.d.ts +4 -6
  50. package/dist/components/hx-button-group/hx-button-group.d.ts.map +1 -1
  51. package/dist/components/hx-button-group/hx-button-group.styles.d.ts.map +1 -1
  52. package/dist/components/hx-button-group/index.js +1 -1
  53. package/dist/components/hx-card/hx-card.d.ts +19 -2
  54. package/dist/components/hx-card/hx-card.d.ts.map +1 -1
  55. package/dist/components/hx-card/hx-card.styles.d.ts.map +1 -1
  56. package/dist/components/hx-card/index.js +1 -1
  57. package/dist/components/hx-carousel/hx-carousel-item.d.ts +2 -2
  58. package/dist/components/hx-carousel/hx-carousel-item.d.ts.map +1 -1
  59. package/dist/components/hx-carousel/hx-carousel-item.styles.d.ts.map +1 -1
  60. package/dist/components/hx-carousel/hx-carousel.d.ts +2 -2
  61. package/dist/components/hx-carousel/hx-carousel.d.ts.map +1 -1
  62. package/dist/components/hx-carousel/hx-carousel.styles.d.ts.map +1 -1
  63. package/dist/components/hx-carousel/index.js +1 -1
  64. package/dist/components/hx-checkbox/hx-checkbox.d.ts +52 -5
  65. package/dist/components/hx-checkbox/hx-checkbox.d.ts.map +1 -1
  66. package/dist/components/hx-checkbox/hx-checkbox.styles.d.ts.map +1 -1
  67. package/dist/components/hx-checkbox/index.d.ts +1 -0
  68. package/dist/components/hx-checkbox/index.d.ts.map +1 -1
  69. package/dist/components/hx-checkbox/index.js +1 -1
  70. package/dist/components/hx-checkbox-group/hx-checkbox-group.d.ts +14 -20
  71. package/dist/components/hx-checkbox-group/hx-checkbox-group.d.ts.map +1 -1
  72. package/dist/components/hx-checkbox-group/hx-checkbox-group.styles.d.ts.map +1 -1
  73. package/dist/components/hx-checkbox-group/index.d.ts +1 -0
  74. package/dist/components/hx-checkbox-group/index.d.ts.map +1 -1
  75. package/dist/components/hx-checkbox-group/index.js +1 -1
  76. package/dist/components/hx-clinical-status/hx-clinical-status.styles.d.ts.map +1 -1
  77. package/dist/components/hx-clinical-status/index.js +1 -1
  78. package/dist/components/hx-code-snippet/hx-code-snippet.d.ts +3 -2
  79. package/dist/components/hx-code-snippet/hx-code-snippet.d.ts.map +1 -1
  80. package/dist/components/hx-code-snippet/hx-code-snippet.styles.d.ts.map +1 -1
  81. package/dist/components/hx-code-snippet/index.js +1 -1
  82. package/dist/components/hx-color-picker/hx-color-picker.d.ts +12 -19
  83. package/dist/components/hx-color-picker/hx-color-picker.d.ts.map +1 -1
  84. package/dist/components/hx-color-picker/hx-color-picker.styles.d.ts.map +1 -1
  85. package/dist/components/hx-color-picker/index.d.ts +1 -0
  86. package/dist/components/hx-color-picker/index.d.ts.map +1 -1
  87. package/dist/components/hx-color-picker/index.js +1 -1
  88. package/dist/components/hx-combobox/hx-combobox.d.ts +45 -22
  89. package/dist/components/hx-combobox/hx-combobox.d.ts.map +1 -1
  90. package/dist/components/hx-combobox/hx-combobox.styles.d.ts.map +1 -1
  91. package/dist/components/hx-combobox/index.d.ts +1 -0
  92. package/dist/components/hx-combobox/index.d.ts.map +1 -1
  93. package/dist/components/hx-combobox/index.js +1 -1
  94. package/dist/components/hx-container/hx-container.d.ts +2 -4
  95. package/dist/components/hx-container/hx-container.d.ts.map +1 -1
  96. package/dist/components/hx-container/hx-container.styles.d.ts.map +1 -1
  97. package/dist/components/hx-container/index.d.ts +0 -1
  98. package/dist/components/hx-container/index.d.ts.map +1 -1
  99. package/dist/components/hx-container/index.js +1 -1
  100. package/dist/components/hx-copy-button/hx-copy-button.d.ts +2 -2
  101. package/dist/components/hx-copy-button/hx-copy-button.d.ts.map +1 -1
  102. package/dist/components/hx-copy-button/hx-copy-button.styles.d.ts.map +1 -1
  103. package/dist/components/hx-copy-button/index.js +1 -1
  104. package/dist/components/hx-counter/hx-counter.d.ts +23 -2
  105. package/dist/components/hx-counter/hx-counter.d.ts.map +1 -1
  106. package/dist/components/hx-counter/hx-counter.styles.d.ts.map +1 -1
  107. package/dist/components/hx-counter/index.js +1 -1
  108. package/dist/components/hx-data-table/hx-data-table.d.ts +46 -2
  109. package/dist/components/hx-data-table/hx-data-table.d.ts.map +1 -1
  110. package/dist/components/hx-data-table/hx-data-table.styles.d.ts.map +1 -1
  111. package/dist/components/hx-data-table/index.d.ts +1 -0
  112. package/dist/components/hx-data-table/index.d.ts.map +1 -1
  113. package/dist/components/hx-data-table/index.js +1 -1
  114. package/dist/components/hx-date-picker/hx-date-picker.d.ts +35 -35
  115. package/dist/components/hx-date-picker/hx-date-picker.d.ts.map +1 -1
  116. package/dist/components/hx-date-picker/hx-date-picker.styles.d.ts.map +1 -1
  117. package/dist/components/hx-date-picker/index.d.ts +1 -0
  118. package/dist/components/hx-date-picker/index.d.ts.map +1 -1
  119. package/dist/components/hx-date-picker/index.js +1 -1
  120. package/dist/components/hx-dialog/hx-dialog.d.ts +44 -5
  121. package/dist/components/hx-dialog/hx-dialog.d.ts.map +1 -1
  122. package/dist/components/hx-dialog/hx-dialog.styles.d.ts.map +1 -1
  123. package/dist/components/hx-dialog/index.js +1 -1
  124. package/dist/components/hx-divider/hx-divider.d.ts +3 -4
  125. package/dist/components/hx-divider/hx-divider.d.ts.map +1 -1
  126. package/dist/components/hx-divider/hx-divider.styles.d.ts.map +1 -1
  127. package/dist/components/hx-divider/index.d.ts +0 -1
  128. package/dist/components/hx-divider/index.d.ts.map +1 -1
  129. package/dist/components/hx-divider/index.js +1 -1
  130. package/dist/components/hx-drawer/hx-drawer.d.ts +39 -2
  131. package/dist/components/hx-drawer/hx-drawer.d.ts.map +1 -1
  132. package/dist/components/hx-drawer/hx-drawer.styles.d.ts.map +1 -1
  133. package/dist/components/hx-drawer/index.js +1 -1
  134. package/dist/components/hx-dropdown/hx-dropdown.d.ts +11 -7
  135. package/dist/components/hx-dropdown/hx-dropdown.d.ts.map +1 -1
  136. package/dist/components/hx-dropdown/hx-dropdown.styles.d.ts.map +1 -1
  137. package/dist/components/hx-dropdown/index.js +1 -1
  138. package/dist/components/hx-field/hx-field.d.ts +4 -3
  139. package/dist/components/hx-field/hx-field.d.ts.map +1 -1
  140. package/dist/components/hx-field/hx-field.styles.d.ts.map +1 -1
  141. package/dist/components/hx-field/index.js +1 -1
  142. package/dist/components/hx-field-label/hx-field-label.d.ts +2 -2
  143. package/dist/components/hx-field-label/hx-field-label.d.ts.map +1 -1
  144. package/dist/components/hx-field-label/hx-field-label.styles.d.ts.map +1 -1
  145. package/dist/components/hx-field-label/index.js +1 -1
  146. package/dist/components/hx-file-upload/hx-file-upload.d.ts +38 -18
  147. package/dist/components/hx-file-upload/hx-file-upload.d.ts.map +1 -1
  148. package/dist/components/hx-file-upload/hx-file-upload.styles.d.ts.map +1 -1
  149. package/dist/components/hx-file-upload/index.d.ts +1 -0
  150. package/dist/components/hx-file-upload/index.d.ts.map +1 -1
  151. package/dist/components/hx-file-upload/index.js +1 -1
  152. package/dist/components/hx-form/hx-form.d.ts +2 -2
  153. package/dist/components/hx-form/hx-form.d.ts.map +1 -1
  154. package/dist/components/hx-form/hx-form.styles.d.ts +8 -0
  155. package/dist/components/hx-form/hx-form.styles.d.ts.map +1 -1
  156. package/dist/components/hx-form/index.js +1 -1
  157. package/dist/components/hx-format-date/hx-format-date.d.ts +2 -2
  158. package/dist/components/hx-format-date/hx-format-date.d.ts.map +1 -1
  159. package/dist/components/hx-format-date/hx-format-date.styles.d.ts.map +1 -1
  160. package/dist/components/hx-format-date/index.js +1 -1
  161. package/dist/components/hx-grid/hx-grid.d.ts +4 -3
  162. package/dist/components/hx-grid/hx-grid.d.ts.map +1 -1
  163. package/dist/components/hx-grid/hx-grid.styles.d.ts.map +1 -1
  164. package/dist/components/hx-grid/index.js +1 -1
  165. package/dist/components/hx-help-text/hx-help-text.d.ts +2 -4
  166. package/dist/components/hx-help-text/hx-help-text.d.ts.map +1 -1
  167. package/dist/components/hx-help-text/hx-help-text.styles.d.ts.map +1 -1
  168. package/dist/components/hx-help-text/index.js +1 -1
  169. package/dist/components/hx-icon/hx-icon.d.ts +17 -2
  170. package/dist/components/hx-icon/hx-icon.d.ts.map +1 -1
  171. package/dist/components/hx-icon/hx-icon.styles.d.ts.map +1 -1
  172. package/dist/components/hx-icon/index.js +1 -1
  173. package/dist/components/hx-icon-button/hx-icon-button.d.ts +10 -14
  174. package/dist/components/hx-icon-button/hx-icon-button.d.ts.map +1 -1
  175. package/dist/components/hx-icon-button/hx-icon-button.styles.d.ts.map +1 -1
  176. package/dist/components/hx-icon-button/index.js +1 -1
  177. package/dist/components/hx-image/hx-image.d.ts +2 -2
  178. package/dist/components/hx-image/hx-image.d.ts.map +1 -1
  179. package/dist/components/hx-image/hx-image.styles.d.ts.map +1 -1
  180. package/dist/components/hx-image/index.js +1 -1
  181. package/dist/components/hx-link/hx-link.d.ts +4 -2
  182. package/dist/components/hx-link/hx-link.d.ts.map +1 -1
  183. package/dist/components/hx-link/hx-link.styles.d.ts.map +1 -1
  184. package/dist/components/hx-link/index.js +1 -1
  185. package/dist/components/hx-list/hx-list-item.d.ts +3 -2
  186. package/dist/components/hx-list/hx-list-item.d.ts.map +1 -1
  187. package/dist/components/hx-list/hx-list-item.styles.d.ts.map +1 -1
  188. package/dist/components/hx-list/hx-list.d.ts +3 -2
  189. package/dist/components/hx-list/hx-list.d.ts.map +1 -1
  190. package/dist/components/hx-list/hx-list.styles.d.ts.map +1 -1
  191. package/dist/components/hx-list/index.js +1 -1
  192. package/dist/components/hx-menu/hx-menu-divider.d.ts +2 -2
  193. package/dist/components/hx-menu/hx-menu-divider.d.ts.map +1 -1
  194. package/dist/components/hx-menu/hx-menu-divider.styles.d.ts.map +1 -1
  195. package/dist/components/hx-menu/hx-menu-item.d.ts +2 -2
  196. package/dist/components/hx-menu/hx-menu-item.d.ts.map +1 -1
  197. package/dist/components/hx-menu/hx-menu-item.styles.d.ts.map +1 -1
  198. package/dist/components/hx-menu/hx-menu.d.ts +2 -2
  199. package/dist/components/hx-menu/hx-menu.d.ts.map +1 -1
  200. package/dist/components/hx-menu/hx-menu.styles.d.ts.map +1 -1
  201. package/dist/components/hx-menu/index.js +1 -1
  202. package/dist/components/hx-meter/hx-meter.d.ts +3 -4
  203. package/dist/components/hx-meter/hx-meter.d.ts.map +1 -1
  204. package/dist/components/hx-meter/hx-meter.styles.d.ts.map +1 -1
  205. package/dist/components/hx-meter/index.js +1 -1
  206. package/dist/components/hx-nav/hx-nav.d.ts +2 -4
  207. package/dist/components/hx-nav/hx-nav.d.ts.map +1 -1
  208. package/dist/components/hx-nav/hx-nav.styles.d.ts.map +1 -1
  209. package/dist/components/hx-nav/index.d.ts +1 -1
  210. package/dist/components/hx-nav/index.d.ts.map +1 -1
  211. package/dist/components/hx-nav/index.js +1 -1
  212. package/dist/components/hx-number-input/hx-number-input.d.ts +14 -20
  213. package/dist/components/hx-number-input/hx-number-input.d.ts.map +1 -1
  214. package/dist/components/hx-number-input/hx-number-input.styles.d.ts.map +1 -1
  215. package/dist/components/hx-number-input/index.d.ts +1 -0
  216. package/dist/components/hx-number-input/index.d.ts.map +1 -1
  217. package/dist/components/hx-number-input/index.js +1 -1
  218. package/dist/components/hx-overflow-menu/hx-overflow-menu.d.ts +2 -2
  219. package/dist/components/hx-overflow-menu/hx-overflow-menu.d.ts.map +1 -1
  220. package/dist/components/hx-overflow-menu/hx-overflow-menu.styles.d.ts.map +1 -1
  221. package/dist/components/hx-overflow-menu/index.js +1 -1
  222. package/dist/components/hx-pagination/hx-pagination.d.ts +10 -2
  223. package/dist/components/hx-pagination/hx-pagination.d.ts.map +1 -1
  224. package/dist/components/hx-pagination/index.d.ts +1 -0
  225. package/dist/components/hx-pagination/index.d.ts.map +1 -1
  226. package/dist/components/hx-pagination/index.js +1 -1
  227. package/dist/components/hx-patient-banner/hx-patient-banner.d.ts +47 -5
  228. package/dist/components/hx-patient-banner/hx-patient-banner.d.ts.map +1 -1
  229. package/dist/components/hx-patient-banner/hx-patient-banner.styles.d.ts.map +1 -1
  230. package/dist/components/hx-patient-banner/index.js +1 -1
  231. package/dist/components/hx-phi-field/hx-phi-field.d.ts +87 -6
  232. package/dist/components/hx-phi-field/hx-phi-field.d.ts.map +1 -1
  233. package/dist/components/hx-phi-field/hx-phi-field.styles.d.ts.map +1 -1
  234. package/dist/components/hx-phi-field/index.js +1 -1
  235. package/dist/components/hx-popover/hx-popover.d.ts +4 -2
  236. package/dist/components/hx-popover/hx-popover.d.ts.map +1 -1
  237. package/dist/components/hx-popover/hx-popover.styles.d.ts.map +1 -1
  238. package/dist/components/hx-popover/index.js +1 -1
  239. package/dist/components/hx-popup/hx-popup.d.ts +7 -2
  240. package/dist/components/hx-popup/hx-popup.d.ts.map +1 -1
  241. package/dist/components/hx-popup/hx-popup.styles.d.ts.map +1 -1
  242. package/dist/components/hx-popup/index.js +1 -1
  243. package/dist/components/hx-progress-bar/hx-progress-bar.d.ts +3 -4
  244. package/dist/components/hx-progress-bar/hx-progress-bar.d.ts.map +1 -1
  245. package/dist/components/hx-progress-bar/index.js +1 -1
  246. package/dist/components/hx-progress-ring/hx-progress-ring.d.ts +3 -2
  247. package/dist/components/hx-progress-ring/hx-progress-ring.d.ts.map +1 -1
  248. package/dist/components/hx-progress-ring/hx-progress-ring.styles.d.ts.map +1 -1
  249. package/dist/components/hx-progress-ring/index.js +1 -1
  250. package/dist/components/hx-prose/hx-prose.d.ts +3 -2
  251. package/dist/components/hx-prose/hx-prose.d.ts.map +1 -1
  252. package/dist/components/hx-prose/hx-prose.styles.d.ts +8 -0
  253. package/dist/components/hx-prose/hx-prose.styles.d.ts.map +1 -1
  254. package/dist/components/hx-prose/index.js +1 -1
  255. package/dist/components/hx-radio-group/hx-radio-group.d.ts +14 -39
  256. package/dist/components/hx-radio-group/hx-radio-group.d.ts.map +1 -1
  257. package/dist/components/hx-radio-group/hx-radio-group.styles.d.ts.map +1 -1
  258. package/dist/components/hx-radio-group/hx-radio.d.ts +19 -4
  259. package/dist/components/hx-radio-group/hx-radio.d.ts.map +1 -1
  260. package/dist/components/hx-radio-group/hx-radio.styles.d.ts.map +1 -1
  261. package/dist/components/hx-radio-group/index.d.ts +1 -0
  262. package/dist/components/hx-radio-group/index.d.ts.map +1 -1
  263. package/dist/components/hx-radio-group/index.js +1 -1
  264. package/dist/components/hx-rating/hx-rating.d.ts +9 -20
  265. package/dist/components/hx-rating/hx-rating.d.ts.map +1 -1
  266. package/dist/components/hx-rating/hx-rating.styles.d.ts.map +1 -1
  267. package/dist/components/hx-rating/index.d.ts +1 -0
  268. package/dist/components/hx-rating/index.d.ts.map +1 -1
  269. package/dist/components/hx-rating/index.js +1 -1
  270. package/dist/components/hx-select/hx-select.d.ts +26 -17
  271. package/dist/components/hx-select/hx-select.d.ts.map +1 -1
  272. package/dist/components/hx-select/hx-select.styles.d.ts.map +1 -1
  273. package/dist/components/hx-select/index.d.ts +1 -0
  274. package/dist/components/hx-select/index.d.ts.map +1 -1
  275. package/dist/components/hx-select/index.js +1 -1
  276. package/dist/components/hx-side-nav/hx-nav-item.d.ts +2 -5
  277. package/dist/components/hx-side-nav/hx-nav-item.d.ts.map +1 -1
  278. package/dist/components/hx-side-nav/hx-nav-item.styles.d.ts.map +1 -1
  279. package/dist/components/hx-side-nav/hx-side-nav.d.ts +3 -2
  280. package/dist/components/hx-side-nav/hx-side-nav.d.ts.map +1 -1
  281. package/dist/components/hx-side-nav/hx-side-nav.styles.d.ts.map +1 -1
  282. package/dist/components/hx-side-nav/index.js +1 -1
  283. package/dist/components/hx-skeleton/hx-skeleton.d.ts +4 -3
  284. package/dist/components/hx-skeleton/hx-skeleton.d.ts.map +1 -1
  285. package/dist/components/hx-skeleton/hx-skeleton.styles.d.ts.map +1 -1
  286. package/dist/components/hx-skeleton/index.js +1 -1
  287. package/dist/components/hx-slider/hx-slider.d.ts +18 -22
  288. package/dist/components/hx-slider/hx-slider.d.ts.map +1 -1
  289. package/dist/components/hx-slider/hx-slider.styles.d.ts.map +1 -1
  290. package/dist/components/hx-slider/index.d.ts +1 -0
  291. package/dist/components/hx-slider/index.d.ts.map +1 -1
  292. package/dist/components/hx-slider/index.js +1 -1
  293. package/dist/components/hx-spinner/hx-spinner.d.ts +2 -2
  294. package/dist/components/hx-spinner/hx-spinner.d.ts.map +1 -1
  295. package/dist/components/hx-spinner/hx-spinner.styles.d.ts.map +1 -1
  296. package/dist/components/hx-spinner/index.js +1 -1
  297. package/dist/components/hx-split-button/hx-split-button.d.ts +10 -4
  298. package/dist/components/hx-split-button/hx-split-button.d.ts.map +1 -1
  299. package/dist/components/hx-split-button/hx-split-button.styles.d.ts.map +1 -1
  300. package/dist/components/hx-split-button/index.js +1 -1
  301. package/dist/components/hx-split-panel/hx-split-panel.d.ts +12 -2
  302. package/dist/components/hx-split-panel/hx-split-panel.d.ts.map +1 -1
  303. package/dist/components/hx-split-panel/hx-split-panel.styles.d.ts.map +1 -1
  304. package/dist/components/hx-split-panel/index.js +1 -1
  305. package/dist/components/hx-stack/hx-stack.d.ts +2 -2
  306. package/dist/components/hx-stack/hx-stack.d.ts.map +1 -1
  307. package/dist/components/hx-stack/hx-stack.styles.d.ts.map +1 -1
  308. package/dist/components/hx-stack/index.js +1 -1
  309. package/dist/components/hx-stat/hx-stat.d.ts +6 -2
  310. package/dist/components/hx-stat/hx-stat.d.ts.map +1 -1
  311. package/dist/components/hx-stat/hx-stat.styles.d.ts.map +1 -1
  312. package/dist/components/hx-stat/index.js +1 -1
  313. package/dist/components/hx-status-indicator/hx-status-indicator.d.ts +3 -2
  314. package/dist/components/hx-status-indicator/hx-status-indicator.d.ts.map +1 -1
  315. package/dist/components/hx-status-indicator/hx-status-indicator.styles.d.ts.map +1 -1
  316. package/dist/components/hx-status-indicator/index.js +1 -1
  317. package/dist/components/hx-steps/hx-step.d.ts +3 -2
  318. package/dist/components/hx-steps/hx-step.d.ts.map +1 -1
  319. package/dist/components/hx-steps/hx-step.styles.d.ts.map +1 -1
  320. package/dist/components/hx-steps/hx-steps.d.ts +11 -4
  321. package/dist/components/hx-steps/hx-steps.d.ts.map +1 -1
  322. package/dist/components/hx-steps/hx-steps.styles.d.ts.map +1 -1
  323. package/dist/components/hx-steps/index.js +1 -1
  324. package/dist/components/hx-structured-list/hx-structured-list.d.ts +3 -3
  325. package/dist/components/hx-structured-list/hx-structured-list.d.ts.map +1 -1
  326. package/dist/components/hx-structured-list/hx-structured-list.styles.d.ts.map +1 -1
  327. package/dist/components/hx-structured-list/index.js +1 -1
  328. package/dist/components/hx-style-scope/hx-style-scope.d.ts +4 -3
  329. package/dist/components/hx-style-scope/hx-style-scope.d.ts.map +1 -1
  330. package/dist/components/hx-style-scope/hx-style-scope.styles.d.ts.map +1 -1
  331. package/dist/components/hx-style-scope/index.js +1 -1
  332. package/dist/components/hx-switch/hx-switch.d.ts +25 -29
  333. package/dist/components/hx-switch/hx-switch.d.ts.map +1 -1
  334. package/dist/components/hx-switch/hx-switch.styles.d.ts.map +1 -1
  335. package/dist/components/hx-switch/index.d.ts +2 -1
  336. package/dist/components/hx-switch/index.d.ts.map +1 -1
  337. package/dist/components/hx-switch/index.js +1 -1
  338. package/dist/components/hx-table/hx-table.d.ts +3 -2
  339. package/dist/components/hx-table/hx-table.d.ts.map +1 -1
  340. package/dist/components/hx-table/hx-table.styles.d.ts.map +1 -1
  341. package/dist/components/hx-table/hx-tbody.d.ts +2 -2
  342. package/dist/components/hx-table/hx-tbody.d.ts.map +1 -1
  343. package/dist/components/hx-table/hx-td.d.ts +2 -2
  344. package/dist/components/hx-table/hx-td.d.ts.map +1 -1
  345. package/dist/components/hx-table/hx-tfoot.d.ts +2 -2
  346. package/dist/components/hx-table/hx-tfoot.d.ts.map +1 -1
  347. package/dist/components/hx-table/hx-th.d.ts +2 -2
  348. package/dist/components/hx-table/hx-th.d.ts.map +1 -1
  349. package/dist/components/hx-table/hx-thead.d.ts +2 -2
  350. package/dist/components/hx-table/hx-thead.d.ts.map +1 -1
  351. package/dist/components/hx-table/hx-tr.d.ts +2 -2
  352. package/dist/components/hx-table/hx-tr.d.ts.map +1 -1
  353. package/dist/components/hx-table/index.js +1 -1
  354. package/dist/components/hx-tabs/hx-tab-panel.d.ts +2 -2
  355. package/dist/components/hx-tabs/hx-tab-panel.d.ts.map +1 -1
  356. package/dist/components/hx-tabs/hx-tab-panel.styles.d.ts.map +1 -1
  357. package/dist/components/hx-tabs/hx-tab.d.ts +2 -2
  358. package/dist/components/hx-tabs/hx-tab.d.ts.map +1 -1
  359. package/dist/components/hx-tabs/hx-tab.styles.d.ts.map +1 -1
  360. package/dist/components/hx-tabs/hx-tabs.d.ts +14 -2
  361. package/dist/components/hx-tabs/hx-tabs.d.ts.map +1 -1
  362. package/dist/components/hx-tabs/hx-tabs.styles.d.ts.map +1 -1
  363. package/dist/components/hx-tabs/index.d.ts +1 -0
  364. package/dist/components/hx-tabs/index.d.ts.map +1 -1
  365. package/dist/components/hx-tabs/index.js +1 -1
  366. package/dist/components/hx-tag/hx-tag.d.ts +2 -4
  367. package/dist/components/hx-tag/hx-tag.d.ts.map +1 -1
  368. package/dist/components/hx-tag/hx-tag.styles.d.ts.map +1 -1
  369. package/dist/components/hx-tag/index.d.ts +0 -2
  370. package/dist/components/hx-tag/index.d.ts.map +1 -1
  371. package/dist/components/hx-tag/index.js +1 -1
  372. package/dist/components/hx-text/hx-text.d.ts +2 -2
  373. package/dist/components/hx-text/hx-text.d.ts.map +1 -1
  374. package/dist/components/hx-text/hx-text.styles.d.ts.map +1 -1
  375. package/dist/components/hx-text/index.js +1 -1
  376. package/dist/components/hx-text-input/hx-text-input.d.ts +34 -7
  377. package/dist/components/hx-text-input/hx-text-input.d.ts.map +1 -1
  378. package/dist/components/hx-text-input/hx-text-input.styles.d.ts.map +1 -1
  379. package/dist/components/hx-text-input/index.d.ts +1 -0
  380. package/dist/components/hx-text-input/index.d.ts.map +1 -1
  381. package/dist/components/hx-text-input/index.js +1 -1
  382. package/dist/components/hx-textarea/hx-textarea.d.ts +41 -25
  383. package/dist/components/hx-textarea/hx-textarea.d.ts.map +1 -1
  384. package/dist/components/hx-textarea/hx-textarea.styles.d.ts.map +1 -1
  385. package/dist/components/hx-textarea/index.d.ts +1 -0
  386. package/dist/components/hx-textarea/index.d.ts.map +1 -1
  387. package/dist/components/hx-textarea/index.js +1 -1
  388. package/dist/components/hx-theme/hx-theme.d.ts +3 -11
  389. package/dist/components/hx-theme/hx-theme.d.ts.map +1 -1
  390. package/dist/components/hx-theme/hx-theme.styles.d.ts.map +1 -1
  391. package/dist/components/hx-theme/index.d.ts +0 -2
  392. package/dist/components/hx-theme/index.d.ts.map +1 -1
  393. package/dist/components/hx-theme/index.js +1 -1
  394. package/dist/components/hx-time-picker/hx-time-picker.d.ts +13 -31
  395. package/dist/components/hx-time-picker/hx-time-picker.d.ts.map +1 -1
  396. package/dist/components/hx-time-picker/hx-time-picker.styles.d.ts.map +1 -1
  397. package/dist/components/hx-time-picker/index.d.ts +1 -0
  398. package/dist/components/hx-time-picker/index.d.ts.map +1 -1
  399. package/dist/components/hx-time-picker/index.js +1 -1
  400. package/dist/components/hx-toast/hx-toast-stack.d.ts +2 -2
  401. package/dist/components/hx-toast/hx-toast-stack.d.ts.map +1 -1
  402. package/dist/components/hx-toast/hx-toast.d.ts +3 -2
  403. package/dist/components/hx-toast/hx-toast.d.ts.map +1 -1
  404. package/dist/components/hx-toast/hx-toast.styles.d.ts.map +1 -1
  405. package/dist/components/hx-toast/index.js +1 -1
  406. package/dist/components/hx-toggle-button/hx-toggle-button.d.ts +10 -13
  407. package/dist/components/hx-toggle-button/hx-toggle-button.d.ts.map +1 -1
  408. package/dist/components/hx-toggle-button/hx-toggle-button.styles.d.ts.map +1 -1
  409. package/dist/components/hx-toggle-button/index.d.ts +1 -0
  410. package/dist/components/hx-toggle-button/index.d.ts.map +1 -1
  411. package/dist/components/hx-toggle-button/index.js +1 -1
  412. package/dist/components/hx-tooltip/hx-tooltip.d.ts +2 -2
  413. package/dist/components/hx-tooltip/hx-tooltip.d.ts.map +1 -1
  414. package/dist/components/hx-tooltip/hx-tooltip.styles.d.ts.map +1 -1
  415. package/dist/components/hx-tooltip/index.js +1 -1
  416. package/dist/components/hx-top-nav/hx-top-nav.d.ts +2 -2
  417. package/dist/components/hx-top-nav/hx-top-nav.d.ts.map +1 -1
  418. package/dist/components/hx-top-nav/hx-top-nav.styles.d.ts.map +1 -1
  419. package/dist/components/hx-top-nav/index.js +1 -1
  420. package/dist/components/hx-tree-view/hx-tree-item.d.ts +2 -4
  421. package/dist/components/hx-tree-view/hx-tree-item.d.ts.map +1 -1
  422. package/dist/components/hx-tree-view/hx-tree-item.styles.d.ts.map +1 -1
  423. package/dist/components/hx-tree-view/hx-tree-view.d.ts +2 -4
  424. package/dist/components/hx-tree-view/hx-tree-view.d.ts.map +1 -1
  425. package/dist/components/hx-tree-view/hx-tree-view.styles.d.ts.map +1 -1
  426. package/dist/components/hx-tree-view/index.d.ts +0 -4
  427. package/dist/components/hx-tree-view/index.d.ts.map +1 -1
  428. package/dist/components/hx-tree-view/index.js +1 -1
  429. package/dist/components/hx-visually-hidden/hx-visually-hidden.d.ts +2 -2
  430. package/dist/components/hx-visually-hidden/hx-visually-hidden.d.ts.map +1 -1
  431. package/dist/components/hx-visually-hidden/hx-visually-hidden.styles.d.ts.map +1 -1
  432. package/dist/components/hx-visually-hidden/index.js +1 -1
  433. package/dist/css/helix-all.css +3717 -786
  434. package/dist/css/helix-core.css +277 -64
  435. package/dist/css/helix-data.css +86 -7
  436. package/dist/css/helix-feedback.css +215 -69
  437. package/dist/css/helix-forms.css +2122 -127
  438. package/dist/css/helix-layout.css +53 -7
  439. package/dist/css/helix-media.css +40 -16
  440. package/dist/css/helix-navigation.css +209 -48
  441. package/dist/css/helix-overlay.css +99 -12
  442. package/dist/css/helix-tokens.css +30 -11
  443. package/dist/css/helix-utility.css +118 -9
  444. package/dist/css/hx-accordion.css +9 -1
  445. package/dist/css/hx-action-bar.css +17 -3
  446. package/dist/css/hx-alert.css +39 -18
  447. package/dist/css/hx-avatar.css +1 -1
  448. package/dist/css/hx-badge.css +59 -24
  449. package/dist/css/hx-banner.css +35 -18
  450. package/dist/css/hx-breadcrumb.css +27 -0
  451. package/dist/css/hx-button-group.css +13 -0
  452. package/dist/css/hx-button.css +6 -3
  453. package/dist/css/hx-card.css +18 -6
  454. package/dist/css/hx-carousel.css +40 -16
  455. package/dist/css/hx-checkbox-group.css +36 -4
  456. package/dist/css/hx-checkbox.css +74 -8
  457. package/dist/css/hx-clinical-status.css +46 -23
  458. package/dist/css/hx-code-snippet.css +25 -3
  459. package/dist/css/hx-color-picker.css +276 -1
  460. package/dist/css/hx-combobox.css +391 -1
  461. package/dist/css/hx-container.css +10 -6
  462. package/dist/css/hx-copy-button.css +31 -3
  463. package/dist/css/hx-counter.css +11 -1
  464. package/dist/css/hx-data-table.css +24 -1
  465. package/dist/css/hx-date-picker.css +437 -1
  466. package/dist/css/hx-dialog.css +23 -2
  467. package/dist/css/hx-divider.css +8 -0
  468. package/dist/css/hx-drawer.css +22 -1
  469. package/dist/css/hx-dropdown.css +10 -1
  470. package/dist/css/hx-field-label.css +18 -2
  471. package/dist/css/hx-field.css +39 -3
  472. package/dist/css/hx-file-upload.css +60 -12
  473. package/dist/css/hx-format-date.css +11 -0
  474. package/dist/css/hx-grid.css +10 -0
  475. package/dist/css/hx-help-text.css +25 -5
  476. package/dist/css/hx-icon-button.css +27 -0
  477. package/dist/css/hx-icon.css +8 -0
  478. package/dist/css/hx-image.css +11 -3
  479. package/dist/css/hx-link.css +24 -6
  480. package/dist/css/hx-list.css +10 -0
  481. package/dist/css/hx-menu.css +10 -2
  482. package/dist/css/hx-meter.css +28 -14
  483. package/dist/css/hx-nav.css +27 -12
  484. package/dist/css/hx-number-input.css +78 -0
  485. package/dist/css/hx-overflow-menu.css +41 -10
  486. package/dist/css/hx-pagination.css +13 -13
  487. package/dist/css/hx-patient-banner.css +30 -10
  488. package/dist/css/hx-phi-field.css +20 -3
  489. package/dist/css/hx-popover.css +16 -4
  490. package/dist/css/hx-popup.css +12 -0
  491. package/dist/css/hx-progress-bar.css +1 -1
  492. package/dist/css/hx-progress-ring.css +26 -4
  493. package/dist/css/hx-radio-group.css +35 -3
  494. package/dist/css/hx-rating.css +45 -4
  495. package/dist/css/hx-select.css +89 -9
  496. package/dist/css/hx-side-nav.css +26 -0
  497. package/dist/css/hx-skeleton.css +13 -1
  498. package/dist/css/hx-slider.css +16 -11
  499. package/dist/css/hx-spinner.css +15 -3
  500. package/dist/css/hx-split-button.css +37 -2
  501. package/dist/css/hx-split-panel.css +14 -0
  502. package/dist/css/hx-stack.css +10 -0
  503. package/dist/css/hx-stat.css +52 -5
  504. package/dist/css/hx-status-indicator.css +15 -2
  505. package/dist/css/hx-steps.css +12 -0
  506. package/dist/css/hx-structured-list.css +18 -2
  507. package/dist/css/hx-style-scope.css +11 -0
  508. package/dist/css/hx-switch.css +66 -4
  509. package/dist/css/hx-table.css +9 -1
  510. package/dist/css/hx-tabs.css +15 -3
  511. package/dist/css/hx-tag.css +24 -12
  512. package/dist/css/hx-text-input.css +71 -9
  513. package/dist/css/hx-text.css +38 -5
  514. package/dist/css/hx-textarea.css +71 -15
  515. package/dist/css/hx-theme.css +11 -0
  516. package/dist/css/hx-time-picker.css +224 -1
  517. package/dist/css/hx-toast.css +19 -7
  518. package/dist/css/hx-toggle-button.css +41 -4
  519. package/dist/css/hx-tooltip.css +16 -4
  520. package/dist/css/hx-top-nav.css +29 -8
  521. package/dist/css/hx-tree-view.css +9 -0
  522. package/dist/css/hx-visually-hidden.css +12 -0
  523. package/dist/css/index.css +1 -1
  524. package/dist/css/manifest.json +49 -11
  525. package/dist/form-test-utils.d.ts +45 -0
  526. package/dist/form-test-utils.d.ts.map +1 -0
  527. package/dist/index.d.ts +28 -14
  528. package/dist/index.d.ts.map +1 -1
  529. package/dist/index.js +189 -176
  530. package/dist/index.js.map +1 -1
  531. package/dist/mixins/FormMixin.d.ts +24 -5
  532. package/dist/mixins/FormMixin.d.ts.map +1 -1
  533. package/dist/mixins/aria-delegation.d.ts +1 -1
  534. package/dist/mixins/aria-delegation.d.ts.map +1 -1
  535. package/dist/mixins/index.d.ts +3 -1
  536. package/dist/mixins/index.d.ts.map +1 -1
  537. package/dist/shared/{FormMixin-Bjvw20G5.js → FormMixin-B8PXk5RQ.js} +31 -14
  538. package/dist/shared/FormMixin-B8PXk5RQ.js.map +1 -0
  539. package/dist/shared/{aria-delegation-CBP9eQ0M.js → aria-delegation-Doq6RRUy.js} +6 -6
  540. package/dist/shared/aria-delegation-Doq6RRUy.js.map +1 -0
  541. package/dist/shared/{id-counter-JhvVCnjh.js → helix-element-BNEYeiys.js} +35 -44
  542. package/dist/shared/helix-element-BNEYeiys.js.map +1 -0
  543. package/dist/shared/{hx-accordion-CpfO0YQo.js → hx-accordion-Wt52OOZD.js} +127 -80
  544. package/dist/shared/hx-accordion-Wt52OOZD.js.map +1 -0
  545. package/dist/shared/{hx-action-bar-BpY1Z1UV.js → hx-action-bar-BKMADbHj.js} +90 -75
  546. package/dist/shared/hx-action-bar-BKMADbHj.js.map +1 -0
  547. package/dist/shared/{hx-alert-CHOjTBds.js → hx-alert-D7n94HwI.js} +47 -26
  548. package/dist/shared/hx-alert-D7n94HwI.js.map +1 -0
  549. package/dist/shared/{hx-avatar-an-WsuLl.js → hx-avatar-iLYzu8MJ.js} +10 -10
  550. package/dist/shared/hx-avatar-iLYzu8MJ.js.map +1 -0
  551. package/dist/shared/{hx-badge-DDXTLoWi.js → hx-badge-CVCmMPyW.js} +78 -43
  552. package/dist/shared/hx-badge-CVCmMPyW.js.map +1 -0
  553. package/dist/shared/{hx-banner-B-WEDiq7.js → hx-banner-C_He7Tr4.js} +60 -43
  554. package/dist/shared/hx-banner-C_He7Tr4.js.map +1 -0
  555. package/dist/shared/{hx-breadcrumb-item-DzLyeL5Z.js → hx-breadcrumb-item-CldCwD1d.js} +123 -83
  556. package/dist/shared/hx-breadcrumb-item-CldCwD1d.js.map +1 -0
  557. package/dist/shared/{hx-button-DoN8jjQT.js → hx-button-Ddl-T6T-.js} +117 -92
  558. package/dist/shared/hx-button-Ddl-T6T-.js.map +1 -0
  559. package/dist/shared/{hx-button-group-BXlMQTt_.js → hx-button-group-BJOGWoMa.js} +33 -21
  560. package/dist/shared/hx-button-group-BJOGWoMa.js.map +1 -0
  561. package/dist/shared/{hx-card-BgXZXDuc.js → hx-card-ycveujjL.js} +64 -38
  562. package/dist/shared/hx-card-ycveujjL.js.map +1 -0
  563. package/dist/shared/{hx-carousel-item-Dwt9Pphz.js → hx-carousel-item-D_dCv61-.js} +76 -41
  564. package/dist/shared/hx-carousel-item-D_dCv61-.js.map +1 -0
  565. package/dist/shared/{hx-checkbox-CTEZ9IFq.js → hx-checkbox-DkkoWoye.js} +163 -79
  566. package/dist/shared/hx-checkbox-DkkoWoye.js.map +1 -0
  567. package/dist/shared/{hx-checkbox-group-DThZeN5d.js → hx-checkbox-group-C3poJ-Zw.js} +105 -79
  568. package/dist/shared/hx-checkbox-group-C3poJ-Zw.js.map +1 -0
  569. package/dist/shared/{hx-clinical-status-m4soOOwg.js → hx-clinical-status-BS5lcddT.js} +74 -51
  570. package/dist/shared/hx-clinical-status-BS5lcddT.js.map +1 -0
  571. package/dist/shared/{hx-code-snippet-CoLYvX1Z.js → hx-code-snippet-B7wUKzyb.js} +35 -13
  572. package/dist/shared/{hx-code-snippet-CoLYvX1Z.js.map → hx-code-snippet-B7wUKzyb.js.map} +1 -1
  573. package/dist/shared/{hx-color-picker-DhOaNe6-.js → hx-color-picker-DBaKTVLr.js} +360 -98
  574. package/dist/shared/hx-color-picker-DBaKTVLr.js.map +1 -0
  575. package/dist/shared/hx-combobox-BmgYT7Ar.js +929 -0
  576. package/dist/shared/hx-combobox-BmgYT7Ar.js.map +1 -0
  577. package/dist/shared/{hx-container-31QT9KV_.js → hx-container-DVI7sxfX.js} +27 -23
  578. package/dist/shared/hx-container-DVI7sxfX.js.map +1 -0
  579. package/dist/shared/{hx-copy-button-BoM0WsMd.js → hx-copy-button-8deNUdwP.js} +68 -40
  580. package/dist/shared/hx-copy-button-8deNUdwP.js.map +1 -0
  581. package/dist/shared/{hx-counter-CP42cSVK.js → hx-counter-CKfl_g8K.js} +88 -43
  582. package/dist/shared/hx-counter-CKfl_g8K.js.map +1 -0
  583. package/dist/shared/{hx-data-table-D5Ne-goy.js → hx-data-table-B6h0RPn0.js} +203 -132
  584. package/dist/shared/hx-data-table-B6h0RPn0.js.map +1 -0
  585. package/dist/shared/hx-date-picker-Dq2Nb68_.js +1077 -0
  586. package/dist/shared/hx-date-picker-Dq2Nb68_.js.map +1 -0
  587. package/dist/shared/{hx-dialog-D4ubstxx.js → hx-dialog-CvIlY0Tc.js} +85 -52
  588. package/dist/shared/hx-dialog-CvIlY0Tc.js.map +1 -0
  589. package/dist/shared/{hx-divider-BBtOLHRP.js → hx-divider-DwpOrzMW.js} +23 -15
  590. package/dist/shared/hx-divider-DwpOrzMW.js.map +1 -0
  591. package/dist/shared/{hx-drawer--WDLuWtS.js → hx-drawer-Cx2ZJhBe.js} +101 -66
  592. package/dist/shared/hx-drawer-Cx2ZJhBe.js.map +1 -0
  593. package/dist/shared/{hx-dropdown-n5-XSmiV.js → hx-dropdown-BjDrPUq5.js} +55 -46
  594. package/dist/shared/hx-dropdown-BjDrPUq5.js.map +1 -0
  595. package/dist/shared/{hx-field-CwT9tki1.js → hx-field-Dp3qQMut.js} +61 -25
  596. package/dist/shared/hx-field-Dp3qQMut.js.map +1 -0
  597. package/dist/shared/{hx-field-label-CcOK9VU3.js → hx-field-label-BC8QViXv.js} +41 -25
  598. package/dist/shared/hx-field-label-BC8QViXv.js.map +1 -0
  599. package/dist/shared/{hx-file-upload-Dwtu3WcB.js → hx-file-upload-B6Yl1u0i.js} +201 -130
  600. package/dist/shared/hx-file-upload-B6Yl1u0i.js.map +1 -0
  601. package/dist/shared/{hx-form-fJE-FJQV.js → hx-form-ButQFt9A.js} +13 -18
  602. package/dist/shared/hx-form-ButQFt9A.js.map +1 -0
  603. package/dist/shared/{hx-format-date-B7L9odbA.js → hx-format-date-CKnlQOmV.js} +20 -9
  604. package/dist/shared/hx-format-date-CKnlQOmV.js.map +1 -0
  605. package/dist/shared/{hx-grid-BIAR5h9m.js → hx-grid-CXZf3jeK.js} +28 -18
  606. package/dist/shared/hx-grid-CXZf3jeK.js.map +1 -0
  607. package/dist/shared/{hx-help-text-Bmb80bP4.js → hx-help-text-D7eytSim.js} +45 -25
  608. package/dist/shared/hx-help-text-D7eytSim.js.map +1 -0
  609. package/dist/shared/{hx-icon-BKHs3OLu.js → hx-icon-CcyDPDYY.js} +104 -62
  610. package/dist/shared/hx-icon-CcyDPDYY.js.map +1 -0
  611. package/dist/shared/{hx-icon-button-CJuy9xbw.js → hx-icon-button-BHneqPCU.js} +58 -42
  612. package/dist/shared/hx-icon-button-BHneqPCU.js.map +1 -0
  613. package/dist/shared/{hx-image-ztiXumZB.js → hx-image-2gt14zZd.js} +34 -26
  614. package/dist/shared/hx-image-2gt14zZd.js.map +1 -0
  615. package/dist/shared/{hx-link-IVsXmsKx.js → hx-link-BESrWK8M.js} +72 -48
  616. package/dist/shared/hx-link-BESrWK8M.js.map +1 -0
  617. package/dist/shared/{hx-list-CoTDMp19.js → hx-list-_9qVv02L.js} +91 -49
  618. package/dist/shared/hx-list-_9qVv02L.js.map +1 -0
  619. package/dist/shared/{hx-menu-divider-DRT8yHRZ.js → hx-menu-divider-Ck-9Os1t.js} +103 -60
  620. package/dist/shared/hx-menu-divider-Ck-9Os1t.js.map +1 -0
  621. package/dist/shared/{hx-meter-BvSJoqDp.js → hx-meter-TbROk-dw.js} +64 -49
  622. package/dist/shared/hx-meter-TbROk-dw.js.map +1 -0
  623. package/dist/shared/{hx-nav-l0Rp7WPW.js → hx-nav-BcYDmjf7.js} +71 -56
  624. package/dist/shared/hx-nav-BcYDmjf7.js.map +1 -0
  625. package/dist/shared/{hx-nav-item-CJN4VDrf.js → hx-nav-item-pqPasRUm.js} +67 -23
  626. package/dist/shared/hx-nav-item-pqPasRUm.js.map +1 -0
  627. package/dist/shared/{hx-number-input-0Waw7Z7u.js → hx-number-input-mOIZ3-46.js} +169 -96
  628. package/dist/shared/hx-number-input-mOIZ3-46.js.map +1 -0
  629. package/dist/shared/{hx-overflow-menu-DElwFSCd.js → hx-overflow-menu-Dprb9lnT.js} +70 -38
  630. package/dist/shared/hx-overflow-menu-Dprb9lnT.js.map +1 -0
  631. package/dist/shared/{hx-pagination-BNtx-LG6.js → hx-pagination-AguTQjYC.js} +35 -35
  632. package/dist/shared/hx-pagination-AguTQjYC.js.map +1 -0
  633. package/dist/shared/{hx-patient-banner-BKiN7nIE.js → hx-patient-banner-uE6gqLpT.js} +67 -47
  634. package/dist/shared/hx-patient-banner-uE6gqLpT.js.map +1 -0
  635. package/dist/shared/{hx-phi-field-BiJH3V-k.js → hx-phi-field-BC_XowhC.js} +158 -59
  636. package/dist/shared/hx-phi-field-BC_XowhC.js.map +1 -0
  637. package/dist/shared/{hx-popover-D63RXn5H.js → hx-popover-B2_203ct.js} +48 -34
  638. package/dist/shared/hx-popover-B2_203ct.js.map +1 -0
  639. package/dist/shared/{hx-popup-BQWMhvMO.js → hx-popup-DZXpsJ1R.js} +89 -64
  640. package/dist/shared/hx-popup-DZXpsJ1R.js.map +1 -0
  641. package/dist/shared/{hx-progress-bar-Cm0VihTN.js → hx-progress-bar-KjEkEJLy.js} +21 -20
  642. package/dist/shared/hx-progress-bar-KjEkEJLy.js.map +1 -0
  643. package/dist/shared/{hx-progress-ring-BJeiDr3q.js → hx-progress-ring-3zMwvrwD.js} +56 -34
  644. package/dist/shared/hx-progress-ring-3zMwvrwD.js.map +1 -0
  645. package/dist/shared/{hx-prose-Ml_L2zje.js → hx-prose-BCtK7YL6.js} +48 -15
  646. package/dist/shared/{hx-prose-Ml_L2zje.js.map → hx-prose-BCtK7YL6.js.map} +1 -1
  647. package/dist/shared/{hx-radio-f8c5ggHG.js → hx-radio-BBC5qZgE.js} +202 -123
  648. package/dist/shared/hx-radio-BBC5qZgE.js.map +1 -0
  649. package/dist/shared/{hx-rating-qRJZXskm.js → hx-rating-C3E3ENJb.js} +92 -69
  650. package/dist/shared/hx-rating-C3E3ENJb.js.map +1 -0
  651. package/dist/shared/{hx-select-B5wq9Swh.js → hx-select-CixTo7jp.js} +206 -136
  652. package/dist/shared/hx-select-CixTo7jp.js.map +1 -0
  653. package/dist/shared/{hx-skeleton-e5K9Qaxq.js → hx-skeleton-LxkI0pxr.js} +41 -29
  654. package/dist/shared/hx-skeleton-LxkI0pxr.js.map +1 -0
  655. package/dist/shared/{hx-slider-BvXtvxmN.js → hx-slider-DFHuzF3N.js} +79 -91
  656. package/dist/shared/hx-slider-DFHuzF3N.js.map +1 -0
  657. package/dist/shared/{hx-spinner-Dyese1Tb.js → hx-spinner-BKjuCdZB.js} +32 -20
  658. package/dist/shared/hx-spinner-BKjuCdZB.js.map +1 -0
  659. package/dist/shared/{hx-split-button-CPndTJlC.js → hx-split-button-CGcJMmCG.js} +59 -22
  660. package/dist/shared/hx-split-button-CGcJMmCG.js.map +1 -0
  661. package/dist/shared/{hx-split-panel-Dx72NaET.js → hx-split-panel-C-1R10Mc.js} +71 -47
  662. package/dist/shared/hx-split-panel-C-1R10Mc.js.map +1 -0
  663. package/dist/shared/{hx-stack-B76_1O6g.js → hx-stack-DGfcOfWJ.js} +21 -11
  664. package/dist/shared/hx-stack-DGfcOfWJ.js.map +1 -0
  665. package/dist/shared/{hx-stat-DKD2E7An.js → hx-stat-BTpykQAt.js} +103 -48
  666. package/dist/shared/hx-stat-BTpykQAt.js.map +1 -0
  667. package/dist/shared/{hx-status-indicator-ClWpK6zz.js → hx-status-indicator-X2QEWNFt.js} +36 -23
  668. package/dist/shared/hx-status-indicator-X2QEWNFt.js.map +1 -0
  669. package/dist/shared/{hx-step-C2Jk4mHa.js → hx-step-CRNQlmSo.js} +83 -32
  670. package/dist/shared/hx-step-CRNQlmSo.js.map +1 -0
  671. package/dist/shared/{hx-structured-list-DKlrv7kS.js → hx-structured-list-CqNbaEXg.js} +32 -16
  672. package/dist/shared/hx-structured-list-CqNbaEXg.js.map +1 -0
  673. package/dist/shared/hx-style-scope-TDnR8H4O.js +251 -0
  674. package/dist/shared/hx-style-scope-TDnR8H4O.js.map +1 -0
  675. package/dist/shared/{hx-switch-BzMN37PV.js → hx-switch-DqOD9JR7.js} +122 -81
  676. package/dist/shared/hx-switch-DqOD9JR7.js.map +1 -0
  677. package/dist/shared/{hx-tab-panel-J58zOSjq.js → hx-tab-panel-BIzKfW5i.js} +156 -102
  678. package/dist/shared/hx-tab-panel-BIzKfW5i.js.map +1 -0
  679. package/dist/shared/{hx-tag-F0ZcYj9b.js → hx-tag-CgnrNnte.js} +30 -18
  680. package/dist/shared/hx-tag-CgnrNnte.js.map +1 -0
  681. package/dist/shared/{hx-td-CNCvzBwY.js → hx-td-Bra35cH4.js} +55 -47
  682. package/dist/shared/hx-td-Bra35cH4.js.map +1 -0
  683. package/dist/shared/{hx-text-DcWBqZwx.js → hx-text-DMC2CPlL.js} +74 -41
  684. package/dist/shared/hx-text-DMC2CPlL.js.map +1 -0
  685. package/dist/shared/{hx-text-input-Scyeefec.js → hx-text-input--q0GH78x.js} +123 -61
  686. package/dist/shared/hx-text-input--q0GH78x.js.map +1 -0
  687. package/dist/shared/{hx-textarea-BfSJJtA1.js → hx-textarea-CK621vSL.js} +124 -89
  688. package/dist/shared/hx-textarea-CK621vSL.js.map +1 -0
  689. package/dist/shared/{hx-theme-pc1V7dyL.js → hx-theme-DfEy-SJA.js} +72 -64
  690. package/dist/shared/hx-theme-DfEy-SJA.js.map +1 -0
  691. package/dist/shared/{hx-time-picker-CZvmihHD.js → hx-time-picker-tPUfgElQ.js} +300 -82
  692. package/dist/shared/hx-time-picker-tPUfgElQ.js.map +1 -0
  693. package/dist/shared/{hx-toggle-button-BZUQUULm.js → hx-toggle-button-L-uBJr-a.js} +72 -42
  694. package/dist/shared/hx-toggle-button-L-uBJr-a.js.map +1 -0
  695. package/dist/shared/{hx-tooltip-Ny4i1Idj.js → hx-tooltip-B_zfKvwc.js} +44 -31
  696. package/dist/shared/hx-tooltip-B_zfKvwc.js.map +1 -0
  697. package/dist/shared/{hx-top-nav-CC4FW2Hp.js → hx-top-nav-CATbRvIv.js} +53 -30
  698. package/dist/shared/hx-top-nav-CATbRvIv.js.map +1 -0
  699. package/dist/shared/{hx-tree-item-CPQ9dJiK.js → hx-tree-item-A45WCiBu.js} +37 -9
  700. package/dist/shared/hx-tree-item-A45WCiBu.js.map +1 -0
  701. package/dist/shared/hx-visually-hidden-0bZKOWgT.js +66 -0
  702. package/dist/shared/hx-visually-hidden-0bZKOWgT.js.map +1 -0
  703. package/dist/shared/id-counter-DuX8vsui.js +11 -0
  704. package/dist/shared/id-counter-DuX8vsui.js.map +1 -0
  705. package/dist/shared/{toast-factory-CEMNOt1T.js → toast-factory-BPPnG3mM.js} +58 -46
  706. package/dist/shared/toast-factory-BPPnG3mM.js.map +1 -0
  707. package/dist/utilities/injectLightStyles.d.ts.map +1 -1
  708. package/dist/utilities/sanitizeCss.d.ts +43 -0
  709. package/dist/utilities/sanitizeCss.d.ts.map +1 -0
  710. package/figma-inventory.json +18614 -0
  711. package/package.json +35 -14
  712. package/dist/shared/FormMixin-Bjvw20G5.js.map +0 -1
  713. package/dist/shared/aria-delegation-CBP9eQ0M.js.map +0 -1
  714. package/dist/shared/document-token-adoption-DuYNKd4k.js +0 -21
  715. package/dist/shared/document-token-adoption-DuYNKd4k.js.map +0 -1
  716. package/dist/shared/hx-accordion-CpfO0YQo.js.map +0 -1
  717. package/dist/shared/hx-action-bar-BpY1Z1UV.js.map +0 -1
  718. package/dist/shared/hx-alert-CHOjTBds.js.map +0 -1
  719. package/dist/shared/hx-avatar-an-WsuLl.js.map +0 -1
  720. package/dist/shared/hx-badge-DDXTLoWi.js.map +0 -1
  721. package/dist/shared/hx-banner-B-WEDiq7.js.map +0 -1
  722. package/dist/shared/hx-breadcrumb-item-DzLyeL5Z.js.map +0 -1
  723. package/dist/shared/hx-button-DoN8jjQT.js.map +0 -1
  724. package/dist/shared/hx-button-group-BXlMQTt_.js.map +0 -1
  725. package/dist/shared/hx-card-BgXZXDuc.js.map +0 -1
  726. package/dist/shared/hx-carousel-item-Dwt9Pphz.js.map +0 -1
  727. package/dist/shared/hx-checkbox-CTEZ9IFq.js.map +0 -1
  728. package/dist/shared/hx-checkbox-group-DThZeN5d.js.map +0 -1
  729. package/dist/shared/hx-clinical-status-m4soOOwg.js.map +0 -1
  730. package/dist/shared/hx-color-picker-DhOaNe6-.js.map +0 -1
  731. package/dist/shared/hx-combobox-BJ4lQocO.js +0 -544
  732. package/dist/shared/hx-combobox-BJ4lQocO.js.map +0 -1
  733. package/dist/shared/hx-container-31QT9KV_.js.map +0 -1
  734. package/dist/shared/hx-copy-button-BoM0WsMd.js.map +0 -1
  735. package/dist/shared/hx-counter-CP42cSVK.js.map +0 -1
  736. package/dist/shared/hx-data-table-D5Ne-goy.js.map +0 -1
  737. package/dist/shared/hx-date-picker-Cd3I3WkX.js +0 -627
  738. package/dist/shared/hx-date-picker-Cd3I3WkX.js.map +0 -1
  739. package/dist/shared/hx-dialog-D4ubstxx.js.map +0 -1
  740. package/dist/shared/hx-divider-BBtOLHRP.js.map +0 -1
  741. package/dist/shared/hx-drawer--WDLuWtS.js.map +0 -1
  742. package/dist/shared/hx-dropdown-n5-XSmiV.js.map +0 -1
  743. package/dist/shared/hx-field-CwT9tki1.js.map +0 -1
  744. package/dist/shared/hx-field-label-CcOK9VU3.js.map +0 -1
  745. package/dist/shared/hx-file-upload-Dwtu3WcB.js.map +0 -1
  746. package/dist/shared/hx-form-fJE-FJQV.js.map +0 -1
  747. package/dist/shared/hx-format-date-B7L9odbA.js.map +0 -1
  748. package/dist/shared/hx-grid-BIAR5h9m.js.map +0 -1
  749. package/dist/shared/hx-help-text-Bmb80bP4.js.map +0 -1
  750. package/dist/shared/hx-icon-BKHs3OLu.js.map +0 -1
  751. package/dist/shared/hx-icon-button-CJuy9xbw.js.map +0 -1
  752. package/dist/shared/hx-image-ztiXumZB.js.map +0 -1
  753. package/dist/shared/hx-link-IVsXmsKx.js.map +0 -1
  754. package/dist/shared/hx-list-CoTDMp19.js.map +0 -1
  755. package/dist/shared/hx-menu-divider-DRT8yHRZ.js.map +0 -1
  756. package/dist/shared/hx-meter-BvSJoqDp.js.map +0 -1
  757. package/dist/shared/hx-nav-item-CJN4VDrf.js.map +0 -1
  758. package/dist/shared/hx-nav-l0Rp7WPW.js.map +0 -1
  759. package/dist/shared/hx-number-input-0Waw7Z7u.js.map +0 -1
  760. package/dist/shared/hx-overflow-menu-DElwFSCd.js.map +0 -1
  761. package/dist/shared/hx-pagination-BNtx-LG6.js.map +0 -1
  762. package/dist/shared/hx-patient-banner-BKiN7nIE.js.map +0 -1
  763. package/dist/shared/hx-phi-field-BiJH3V-k.js.map +0 -1
  764. package/dist/shared/hx-popover-D63RXn5H.js.map +0 -1
  765. package/dist/shared/hx-popup-BQWMhvMO.js.map +0 -1
  766. package/dist/shared/hx-progress-bar-Cm0VihTN.js.map +0 -1
  767. package/dist/shared/hx-progress-ring-BJeiDr3q.js.map +0 -1
  768. package/dist/shared/hx-radio-f8c5ggHG.js.map +0 -1
  769. package/dist/shared/hx-rating-qRJZXskm.js.map +0 -1
  770. package/dist/shared/hx-select-B5wq9Swh.js.map +0 -1
  771. package/dist/shared/hx-skeleton-e5K9Qaxq.js.map +0 -1
  772. package/dist/shared/hx-slider-BvXtvxmN.js.map +0 -1
  773. package/dist/shared/hx-spinner-Dyese1Tb.js.map +0 -1
  774. package/dist/shared/hx-split-button-CPndTJlC.js.map +0 -1
  775. package/dist/shared/hx-split-panel-Dx72NaET.js.map +0 -1
  776. package/dist/shared/hx-stack-B76_1O6g.js.map +0 -1
  777. package/dist/shared/hx-stat-DKD2E7An.js.map +0 -1
  778. package/dist/shared/hx-status-indicator-ClWpK6zz.js.map +0 -1
  779. package/dist/shared/hx-step-C2Jk4mHa.js.map +0 -1
  780. package/dist/shared/hx-structured-list-DKlrv7kS.js.map +0 -1
  781. package/dist/shared/hx-style-scope-CsQ2Phf_.js +0 -126
  782. package/dist/shared/hx-style-scope-CsQ2Phf_.js.map +0 -1
  783. package/dist/shared/hx-switch-BzMN37PV.js.map +0 -1
  784. package/dist/shared/hx-tab-panel-J58zOSjq.js.map +0 -1
  785. package/dist/shared/hx-tag-F0ZcYj9b.js.map +0 -1
  786. package/dist/shared/hx-td-CNCvzBwY.js.map +0 -1
  787. package/dist/shared/hx-text-DcWBqZwx.js.map +0 -1
  788. package/dist/shared/hx-text-input-Scyeefec.js.map +0 -1
  789. package/dist/shared/hx-textarea-BfSJJtA1.js.map +0 -1
  790. package/dist/shared/hx-theme-pc1V7dyL.js.map +0 -1
  791. package/dist/shared/hx-time-picker-CZvmihHD.js.map +0 -1
  792. package/dist/shared/hx-toggle-button-BZUQUULm.js.map +0 -1
  793. package/dist/shared/hx-tooltip-Ny4i1Idj.js.map +0 -1
  794. package/dist/shared/hx-top-nav-CC4FW2Hp.js.map +0 -1
  795. package/dist/shared/hx-tree-item-CPQ9dJiK.js.map +0 -1
  796. package/dist/shared/hx-visually-hidden-vKX8QjeX.js +0 -54
  797. package/dist/shared/hx-visually-hidden-vKX8QjeX.js.map +0 -1
  798. package/dist/shared/id-counter-JhvVCnjh.js.map +0 -1
  799. package/dist/shared/toast-factory-CEMNOt1T.js.map +0 -1
  800. package/dist/tools/cem-a11y-analyzer/analyzers/aria-analyzer.d.ts +0 -12
  801. package/dist/tools/cem-a11y-analyzer/analyzers/aria-analyzer.d.ts.map +0 -1
  802. package/dist/tools/cem-a11y-analyzer/analyzers/focus-analyzer.d.ts +0 -13
  803. package/dist/tools/cem-a11y-analyzer/analyzers/focus-analyzer.d.ts.map +0 -1
  804. package/dist/tools/cem-a11y-analyzer/analyzers/form-analyzer.d.ts +0 -13
  805. package/dist/tools/cem-a11y-analyzer/analyzers/form-analyzer.d.ts.map +0 -1
  806. package/dist/tools/cem-a11y-analyzer/analyzers/keyboard-analyzer.d.ts +0 -12
  807. package/dist/tools/cem-a11y-analyzer/analyzers/keyboard-analyzer.d.ts.map +0 -1
  808. package/dist/tools/cem-a11y-analyzer/analyzers/label-analyzer.d.ts +0 -13
  809. package/dist/tools/cem-a11y-analyzer/analyzers/label-analyzer.d.ts.map +0 -1
  810. package/dist/tools/cem-a11y-analyzer/analyzers/motion-analyzer.d.ts +0 -12
  811. package/dist/tools/cem-a11y-analyzer/analyzers/motion-analyzer.d.ts.map +0 -1
  812. package/dist/tools/cem-a11y-analyzer/index.d.ts +0 -14
  813. package/dist/tools/cem-a11y-analyzer/index.d.ts.map +0 -1
  814. package/dist/tools/cem-a11y-analyzer/reporter.d.ts +0 -6
  815. package/dist/tools/cem-a11y-analyzer/reporter.d.ts.map +0 -1
  816. package/dist/tools/cem-a11y-analyzer/scorer.d.ts +0 -22
  817. package/dist/tools/cem-a11y-analyzer/scorer.d.ts.map +0 -1
  818. package/dist/tools/cem-a11y-analyzer/types.d.ts +0 -171
  819. package/dist/tools/cem-a11y-analyzer/types.d.ts.map +0 -1
package/package.json CHANGED
@@ -1,13 +1,12 @@
1
1
  {
2
2
  "name": "@helixui/library",
3
- "version": "2.1.2",
3
+ "version": "3.0.0-next.62",
4
4
  "description": "Enterprise Web Component Library built with Lit 3.x",
5
5
  "type": "module",
6
6
  "sideEffects": [
7
- "./dist/components/*/index.js",
8
- "./src/components/*/index.ts",
7
+ "./dist/index.js",
9
8
  "./dist/utilities/document-token-adoption.js",
10
- "./src/utilities/document-token-adoption.ts",
9
+ "./dist/components/*/index.js",
11
10
  "**/*.css"
12
11
  ],
13
12
  "main": "./dist/index.js",
@@ -38,14 +37,29 @@
38
37
  "./dist/css/index.css": "./dist/css/index.css"
39
38
  },
40
39
  "files": [
41
- "dist",
40
+ "dist/index.js",
41
+ "dist/index.js.map",
42
+ "dist/index.d.ts",
43
+ "dist/index.d.ts.map",
44
+ "dist/form-test-utils.d.ts",
45
+ "dist/form-test-utils.d.ts.map",
46
+ "dist/base/**",
47
+ "dist/components/**",
48
+ "dist/controllers/**",
49
+ "dist/css/**",
50
+ "dist/mixins/**",
51
+ "dist/shared/**",
52
+ "dist/styles/**",
53
+ "dist/utilities/**",
54
+ "dist/utils/**",
42
55
  "custom-elements.json",
56
+ "figma-inventory.json",
43
57
  "fouc.css"
44
58
  ],
45
59
  "customElements": "custom-elements.json",
46
60
  "dependencies": {
47
61
  "lit": "^3.3.2",
48
- "@helixui/tokens": "2.1.2"
62
+ "@helixui/tokens": "3.0.0-next.62"
49
63
  },
50
64
  "peerDependencies": {
51
65
  "@floating-ui/dom": "^1.7.6"
@@ -56,6 +70,9 @@
56
70
  "directory": "packages/hx-library"
57
71
  },
58
72
  "license": "MIT",
73
+ "publishConfig": {
74
+ "access": "public"
75
+ },
59
76
  "homepage": "https://helix.bookedsolid.tech",
60
77
  "bugs": "https://github.com/bookedsolidtech/helix/issues",
61
78
  "keywords": [
@@ -73,11 +90,13 @@
73
90
  ],
74
91
  "devDependencies": {
75
92
  "@custom-elements-manifest/analyzer": "^0.11.0",
93
+ "esbuild": "^0.27.0",
76
94
  "@vitest/browser": "^3.0.0",
77
95
  "@vitest/coverage-v8": "^3.2.4",
78
96
  "axe-core": "^4.11.1",
79
97
  "playwright": "^1.50.0",
80
98
  "typescript": "^5.7.2",
99
+ "tsx": "^4.21.0",
81
100
  "vite": "^6.2.0",
82
101
  "vite-plugin-dts": "^4.5.4",
83
102
  "vitest": "^3.0.0"
@@ -94,18 +113,20 @@
94
113
  "test:cross-browser": "vitest run --config vitest.config.cross-browser.ts",
95
114
  "test:coverage": "vitest run --coverage.enabled",
96
115
  "test:coverage:ci": "vitest run --coverage.enabled && node ../../scripts/check-coverage.mjs",
116
+ "test:fast": "vitest run --bail=5",
97
117
  "test:watch": "vitest",
98
118
  "test:ui": "vitest --ui",
99
- "test:batch:1": "vitest run \"hx-accordion/|hx-action-bar/|hx-alert/|hx-avatar/|hx-badge/|hx-breadcrumb/|hx-button/|hx-button-group/|hx-card/|hx-carousel/|hx-checkbox/|hx-checkbox-group/|hx-code-snippet/|hx-color-picker/|hx-combobox/\" --reporter=verbose",
100
- "test:batch:2": "vitest run \"hx-container/|hx-copy-button/|hx-data-table/|hx-date-picker/|hx-dialog/|hx-divider/|hx-drawer/|hx-dropdown/|hx-field/|hx-field-label/|hx-file-upload/|hx-form/|hx-format-date/|hx-grid/|hx-help-text/\" --reporter=verbose",
101
- "test:batch:3": "vitest run \"hx-icon/|hx-icon-button/|hx-image/|hx-link/|hx-list/|hx-menu/|hx-meter/|hx-nav/|hx-number-input/|hx-overflow-menu/|hx-pagination/|hx-popover/|hx-popup/|hx-progress-bar/|hx-progress-ring/\" --reporter=verbose",
102
- "test:batch:4": "vitest run \"hx-prose/|hx-radio-group/|hx-rating/|hx-select/|hx-side-nav/|hx-skeleton/|hx-slider/|hx-spinner/|hx-split-button/|hx-split-panel/|hx-stack/|hx-status-indicator/|hx-steps/|hx-structured-list/\" --reporter=verbose",
103
- "test:batch:5": "vitest run \"hx-switch/|hx-tabs/|hx-tag/|hx-text/|hx-text-input/|hx-textarea/|hx-theme/|hx-time-picker/|hx-toast/|hx-toggle-button/|hx-tooltip/|hx-top-nav/|hx-tree-view/|hx-visually-hidden/\" --reporter=verbose",
104
- "test:component": "vitest run --reporter=verbose",
105
- "cem": "custom-elements-manifest analyze --litelement --globs \"src/components/**/*.ts\" --exclude \"**/*.stories.ts\" --exclude \"**/*.styles.ts\" && node ../../scripts/validate-cem.mjs",
119
+ "test:batch": "bash ../../scripts/test-batch.sh",
120
+ "test:smart": "bash ../../scripts/test-smart.sh",
121
+ "test:shard": "bash ../../scripts/test-shard.sh",
122
+ "test:component": "vitest run",
123
+ "cem": "custom-elements-manifest analyze --litelement --globs \"src/components/**/*.ts\" --exclude \"**/*.stories.ts\" --exclude \"**/*.styles.ts\" && node ../../scripts/validate-cem.mjs && pnpm run figma:inventory",
106
124
  "cem:watch": "custom-elements-manifest analyze --litelement --globs \"src/components/**/*.ts\" --exclude \"**/*.stories.ts\" --exclude \"**/*.styles.ts\" --watch",
125
+ "figma:inventory": "tsx scripts/generate-figma-inventory.ts",
126
+ "figma:inventory:check": "tsx scripts/generate-figma-inventory.ts --check",
127
+ "test:scripts": "vitest run --config vitest.scripts.config.ts",
107
128
  "build:cdn": "node scripts/build-cdn.mjs",
108
- "generate:drupal-libraries": "node scripts/generate-drupal-libraries.js",
129
+ "generate:drupal-libraries": "tsx ../../scripts/generate-drupal-libraries.ts",
109
130
  "lint": "eslint src/",
110
131
  "clean": "rm -rf dist custom-elements.json"
111
132
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"FormMixin-Bjvw20G5.js","sources":["../../src/mixins/FormMixin.ts"],"sourcesContent":["import type { PropertyValues } from 'lit';\nimport { HelixElement } from '../base/helix-element.js';\n\n/**\n * Constructor type for the mixin pattern.\n * @internal\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Constructor<T = object> = new (...args: any[]) => T;\n\n/**\n * The public interface that FormMixin adds to any host element.\n *\n * @public\n */\nexport interface FormMixinInterface {\n /** True after the user has modified the field value at least once. */\n readonly dirty: boolean;\n /** True after the field has received and lost focus at least once. */\n readonly touched: boolean;\n /** True while the field has never been modified (opposite of dirty). */\n readonly pristine: boolean;\n\n /** Delegates to ElementInternals.checkValidity(). */\n checkValidity(): boolean;\n /** Delegates to ElementInternals.reportValidity(). */\n reportValidity(): boolean;\n\n /**\n * Advance `dirty` state. Call from the native input's `input` event handler.\n * @internal\n */\n _handleInteractionInput(): void;\n\n /**\n * Advance `touched` state. Call from the native input's `blur` event handler.\n * @internal\n */\n _handleInteractionBlur(): void;\n\n /**\n * Reset interaction flags. Call from `_onFormReset()` in the host component.\n * @internal\n */\n _resetInteractionState(): void;\n}\n\n/**\n * FormMixin adds shared form infrastructure to any HelixElement subclass:\n *\n * - Interaction state tracking: `dirty`, `touched`, `pristine`\n * - `checkValidity()` / `reportValidity()` delegation to `ElementInternals`\n * - A `_updateValidity()` lifecycle hook called automatically after every\n * `updated()` cycle — subclasses override this to run constraint checks\n * - `_handleInteractionBlur()` and `_handleInteractionInput()` helpers that\n * components wire to their native inputs to advance interaction state\n *\n * @example\n * ```ts\n * class HxTextInput extends FormMixin(HelixElement) {\n * protected override _updateValidity(): void {\n * if (this.required && !this.value) {\n * this._internals.setValidity({ valueMissing: true }, 'Required', this._inputEl);\n * } else {\n * this._internals.setValidity({});\n * }\n * }\n * }\n * ```\n *\n * @param superClass - A HelixElement-derived constructor to mix into\n * @returns The mixed class constructor with form interaction state tracking\n *\n * @public\n */\nexport function FormMixin<TBase extends Constructor<HelixElement>>(\n superClass: TBase,\n): TBase & Constructor<FormMixinInterface> {\n class FormMixinClass extends (superClass as Constructor<HelixElement>) {\n // ─── Interaction State ───────────────────────────────────────────────────\n\n /** @internal */\n private _dirty = false;\n\n /** @internal */\n private _touched = false;\n\n // ─── Public Getters ──────────────────────────────────────────────────────\n\n /**\n * True after the user has modified the field value at least once.\n * Resets to false on form reset.\n */\n get dirty(): boolean {\n return this._dirty;\n }\n\n /**\n * True after the field has received and lost focus at least once.\n * Resets to false on form reset.\n */\n get touched(): boolean {\n return this._touched;\n }\n\n /**\n * True while the field has never been modified. Opposite of `dirty`.\n */\n get pristine(): boolean {\n return !this._dirty;\n }\n\n // ─── Validity Delegation ─────────────────────────────────────────────────\n\n /**\n * Delegates to `ElementInternals.checkValidity()`.\n * The host element must have `static formAssociated = true`.\n */\n checkValidity(): boolean {\n return this._internals.checkValidity();\n }\n\n /**\n * Delegates to `ElementInternals.reportValidity()`.\n * The host element must have `static formAssociated = true`.\n */\n reportValidity(): boolean {\n return this._internals.reportValidity();\n }\n\n // ─── Lifecycle ───────────────────────────────────────────────────────────\n\n /**\n * Calls `_updateValidity()` after every Lit update cycle.\n * @internal\n */\n override updated(changedProperties: PropertyValues): void {\n super.updated(changedProperties);\n this._updateValidity();\n }\n\n // ─── Hook Methods ────────────────────────────────────────────────────────\n\n /**\n * Override in the host component to run constraint validation logic.\n * Called automatically by `updated()`. Use `this._internals.setValidity()`\n * inside this method.\n * @internal\n */\n _updateValidity(): void {\n // Default: valid. Subclasses override to apply constraints.\n }\n\n // ─── Interaction State Helpers ───────────────────────────────────────────\n\n /**\n * Advance `dirty` state. Call from the native input's `input` event.\n * @internal\n */\n _handleInteractionInput(): void {\n if (!this._dirty) {\n this._dirty = true;\n this.requestUpdate();\n }\n }\n\n /**\n * Advance `touched` state. Call from the native input's `blur` event.\n * @internal\n */\n _handleInteractionBlur(): void {\n if (!this._touched) {\n this._touched = true;\n this.requestUpdate();\n }\n }\n\n /**\n * Reset interaction state to initial values.\n * Call from `_onFormReset()` in the host component.\n * @internal\n */\n _resetInteractionState(): void {\n if (this._dirty || this._touched) {\n this._dirty = false;\n this._touched = false;\n this.requestUpdate();\n }\n }\n }\n\n return FormMixinClass as unknown as TBase & Constructor<FormMixinInterface>;\n}\n"],"names":["FormMixin","superClass","FormMixinClass","changedProperties"],"mappings":"AA2EO,SAASA,EACdC,GACyC;AAAA,EACzC,MAAMC,UAAwBD,EAAyC;AAAA,IAAvE,cAAA;AAAA,YAAA,GAAA,SAAA,GAIE,KAAQ,SAAS,IAGjB,KAAQ,WAAW;AAAA,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQnB,IAAI,QAAiB;AACnB,aAAO,KAAK;AAAA,IACd;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,IAAI,UAAmB;AACrB,aAAO,KAAK;AAAA,IACd;AAAA;AAAA;AAAA;AAAA,IAKA,IAAI,WAAoB;AACtB,aAAO,CAAC,KAAK;AAAA,IACf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQA,gBAAyB;AACvB,aAAO,KAAK,WAAW,cAAA;AAAA,IACzB;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,iBAA0B;AACxB,aAAO,KAAK,WAAW,eAAA;AAAA,IACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQS,QAAQE,GAAyC;AACxD,YAAM,QAAQA,CAAiB,GAC/B,KAAK,gBAAA;AAAA,IACP;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAUA,kBAAwB;AAAA,IAExB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQA,0BAAgC;AAC9B,MAAK,KAAK,WACR,KAAK,SAAS,IACd,KAAK,cAAA;AAAA,IAET;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,yBAA+B;AAC7B,MAAK,KAAK,aACR,KAAK,WAAW,IAChB,KAAK,cAAA;AAAA,IAET;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOA,yBAA+B;AAC7B,OAAI,KAAK,UAAU,KAAK,cACtB,KAAK,SAAS,IACd,KAAK,WAAW,IAChB,KAAK,cAAA;AAAA,IAET;AAAA,EAAA;AAGF,SAAOD;AACT;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"aria-delegation-CBP9eQ0M.js","sources":["../../src/mixins/aria-delegation.ts"],"sourcesContent":["import type { LitElement } from 'lit';\n\n/**\n * All standard ARIA attributes intercepted by this mixin.\n * Extend as needed, but keep the list minimal.\n */\nconst ARIA_ATTRIBUTES = [\n 'aria-activedescendant',\n 'aria-atomic',\n 'aria-autocomplete',\n 'aria-braillelabel',\n 'aria-brailleroledescription',\n 'aria-busy',\n 'aria-checked',\n 'aria-colcount',\n 'aria-colindex',\n 'aria-colindextext',\n 'aria-colspan',\n 'aria-controls',\n 'aria-current',\n 'aria-describedby',\n 'aria-description',\n 'aria-details',\n 'aria-disabled',\n 'aria-errormessage',\n 'aria-expanded',\n 'aria-flowto',\n 'aria-haspopup',\n 'aria-hidden',\n 'aria-invalid',\n 'aria-keyshortcuts',\n 'aria-label',\n 'aria-labelledby',\n 'aria-level',\n 'aria-live',\n 'aria-modal',\n 'aria-multiline',\n 'aria-multiselectable',\n 'aria-orientation',\n 'aria-owns',\n 'aria-placeholder',\n 'aria-posinset',\n 'aria-pressed',\n 'aria-readonly',\n 'aria-relevant',\n 'aria-required',\n 'aria-roledescription',\n 'aria-rowcount',\n 'aria-rowindex',\n 'aria-rowindextext',\n 'aria-rowspan',\n 'aria-selected',\n 'aria-setsize',\n 'aria-sort',\n 'aria-valuemax',\n 'aria-valuemin',\n 'aria-valuenow',\n 'aria-valuetext',\n 'role',\n] as const;\n\n/** Union type of all intercepted ARIA attribute names. */\nexport type AriaAttribute = (typeof ARIA_ATTRIBUTES)[number];\n\n// TypeScript mixin constraint: constructors must accept `any[]`.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype LitElementConstructor = new (...args: any[]) => LitElement;\n\n/**\n * The public interface added to any class by `mixinDelegatesAria`.\n * JS property accessors for all intercepted ARIA attributes, reading from\n * `data-aria-*` storage rather than `aria-*` attributes on the host.\n */\nexport interface AriadDelegationMixinInterface {\n ariaActiveDescendant: string | null;\n ariaAtomic: string | null;\n ariaAutoComplete: string | null;\n ariaBrailleLabel: string | null;\n ariaBrailleRoleDescription: string | null;\n ariaBusy: string | null;\n ariaChecked: string | null;\n ariaColCount: string | null;\n ariaColIndex: string | null;\n ariaColIndexText: string | null;\n ariaColSpan: string | null;\n ariaControls: string | null;\n ariaCurrent: string | null;\n ariaDescribedBy: string | null;\n ariaDescription: string | null;\n ariaDetails: string | null;\n ariaDisabled: string | null;\n ariaErrorMessage: string | null;\n ariaExpanded: string | null;\n ariaFlowTo: string | null;\n ariaHasPopup: string | null;\n ariaHidden: string | null;\n ariaInvalid: string | null;\n ariaKeyShortcuts: string | null;\n ariaLabel: string | null;\n ariaLabelledBy: string | null;\n ariaLevel: string | null;\n ariaLive: string | null;\n ariaModal: string | null;\n ariaMultiLine: string | null;\n ariaMultiSelectable: string | null;\n ariaOrientation: string | null;\n ariaOwns: string | null;\n ariaPlaceholder: string | null;\n ariaPosInSet: string | null;\n ariaPressed: string | null;\n ariaReadOnly: string | null;\n ariaRelevant: string | null;\n ariaRequired: string | null;\n ariaRoleDescription: string | null;\n ariaRowCount: string | null;\n ariaRowIndex: string | null;\n ariaRowIndexText: string | null;\n ariaRowSpan: string | null;\n ariaSelected: string | null;\n ariaSetSize: string | null;\n ariaSort: string | null;\n ariaValueMax: string | null;\n ariaValueMin: string | null;\n ariaValueNow: string | null;\n ariaValueText: string | null;\n role: string | null;\n}\n\n/**\n * Mixin that delegates ARIA attributes from the host element to data-aria-* storage,\n * preventing Shadow DOM double-announcement by screen readers.\n *\n * When a custom element uses `delegatesFocus: true`, the focus delegate (inner element)\n * and the host are both in the a11y tree. Setting `aria-label` on the host causes the\n * label to be announced twice — once for the host, once for the focused inner element.\n *\n * This mixin intercepts `attributeChangedCallback` for all ARIA attributes:\n * - Shifts the value from `aria-*` to `data-aria-*` on the host\n * - Provides JS property accessors that read from `data-aria-*`\n * - The host element no longer has `aria-*` attributes visible in the a11y tree\n * - Components read ARIA values via property accessors and apply them to inner elements\n *\n * @example\n * ```ts\n * class HxButton extends mixinDelegatesAria(LitElement) {\n * render() {\n * return html`<button aria-label=${this.ariaLabel ?? nothing}></button>`;\n * }\n * }\n * ```\n *\n * @param Base - A LitElement subclass constructor\n * @returns A new constructor extending Base with ARIA delegation behaviour\n */\nexport function mixinDelegatesAria<T extends LitElementConstructor>(Base: T): T {\n class AriadDelegationMixin extends Base {\n // Per-instance guard: tracks which aria attributes are mid-processing so\n // that the recursive attributeChangedCallback triggered by our own\n // removeAttribute(name) call does not erroneously clear data-aria-*.\n #processingAria = new Set<string>();\n\n static get observedAttributes(): string[] {\n // Reflect.get with `this` as the receiver passes the concrete subclass\n // (e.g. HelixButton) through to Lit's ReactiveElement getter, so it\n // returns @property attribute names for that specific class.\n // TypeScript cannot infer static members on `T`, so we use Reflect.get\n // rather than `super.observedAttributes` to avoid TS2339.\n const parent: object = Object.getPrototypeOf(AriadDelegationMixin);\n const superAttrs: string[] =\n (Reflect.get(parent, 'observedAttributes', this) as string[] | undefined) ?? [];\n // Append any ARIA attributes not already in the list.\n const ariaAttrs = ARIA_ATTRIBUTES.filter((a) => !superAttrs.includes(a));\n return [...superAttrs, ...ariaAttrs];\n }\n\n attributeChangedCallback(name: string, old: string | null, next: string | null): void {\n if ((ARIA_ATTRIBUTES as readonly string[]).includes(name)) {\n // Guard: if we're already processing this attribute, we're in the\n // recursive callback triggered by our own removeAttribute(name) below.\n // Do not process it again — that would clear data-aria-* incorrectly.\n if (this.#processingAria.has(name)) return;\n\n // Intercept: store as data-aria-*, do not propagate aria-* to the host.\n if (next !== null) {\n // data-aria-* is not in observedAttributes — no recursive loop here.\n this.setAttribute(`data-${name}`, next);\n } else {\n this.removeAttribute(`data-${name}`);\n }\n\n // Remove the aria-* attribute from the host so it is absent from the\n // a11y tree and cannot cause double announcements. Guard while doing so.\n this.#processingAria.add(name);\n if (this.hasAttribute(name)) {\n this.removeAttribute(name); // synchronously re-enters attributeChangedCallback; guard catches it\n }\n this.#processingAria.delete(name);\n\n // Trigger Lit update so render() re-reads the delegated value.\n this.requestUpdate();\n return;\n }\n super.attributeChangedCallback(name, old, next);\n }\n }\n\n // Add JS property accessors for each ARIA attribute, reading from data-aria-*\n for (const attr of ARIA_ATTRIBUTES) {\n // Convert 'aria-label' → 'ariaLabel', 'role' → 'role'\n const propName: string = attr === 'role' ? 'role' : ariaAttrToProp(attr);\n const dataAttr = `data-${attr}`;\n\n Object.defineProperty(AriadDelegationMixin.prototype, propName, {\n get(this: Element): string | null {\n return this.getAttribute(dataAttr);\n },\n set(this: LitElement, value: string | null) {\n if (value === null || value === undefined) {\n this.removeAttribute(dataAttr);\n this.removeAttribute(attr);\n } else {\n this.setAttribute(dataAttr, value);\n // Ensure aria-* is NOT present on the host.\n if (this.hasAttribute(attr)) {\n this.removeAttribute(attr);\n }\n }\n // Trigger Lit reactive update.\n this.requestUpdate();\n },\n configurable: true,\n enumerable: false,\n });\n }\n\n // Cast to T to satisfy the declared return type. The AriadDelegationMixinInterface\n // instance members are added at runtime via Object.defineProperty above; callers\n // that need the typed accessors should cast the instance or use the interface directly.\n return AriadDelegationMixin as unknown as T;\n}\n\n/**\n * Converts 'aria-label' → 'ariaLabel', 'aria-busy' → 'ariaBusy', etc.\n * Removes the 'aria-' prefix, capitalizes the first letter of the remainder,\n * then camelCases any additional hyphen-separated segments.\n */\nfunction ariaAttrToProp(attr: string): string {\n const rest = attr.replace(/^aria-/, '');\n return (\n 'aria' +\n rest.charAt(0).toUpperCase() +\n rest.slice(1).replace(/-([a-z])/g, (_, c: string) => c.toUpperCase())\n );\n}\n"],"names":["ARIA_ATTRIBUTES","mixinDelegatesAria","Base","_processingAria","_AriadDelegationMixin","__privateAdd","parent","superAttrs","ariaAttrs","a","name","old","next","__privateGet","AriadDelegationMixin","attr","propName","ariaAttrToProp","dataAttr","value","rest","_","c"],"mappings":";;;;;AAMA,MAAMA,IAAkB;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AA+FO,SAASC,EAAoDC,GAAY;AApJhF,MAAAC;AAqJE,QAAMC,IAAN,MAAMA,UAA6BF,EAAK;AAAA,IAAxC;AAAA;AAIE;AAAA;AAAA;AAAA,MAAAG,EAAA,MAAAF,uBAAsB,IAAA;AAAA;AAAA,IAEtB,WAAW,qBAA+B;AAMxC,YAAMG,IAAiB,OAAO,eAAeF,CAAoB,GAC3DG,IACH,QAAQ,IAAID,GAAQ,sBAAsB,IAAI,KAA8B,CAAA,GAEzEE,IAAYR,EAAgB,OAAO,CAACS,MAAM,CAACF,EAAW,SAASE,CAAC,CAAC;AACvE,aAAO,CAAC,GAAGF,GAAY,GAAGC,CAAS;AAAA,IACrC;AAAA,IAEA,yBAAyBE,GAAcC,GAAoBC,GAA2B;AACpF,UAAKZ,EAAsC,SAASU,CAAI,GAAG;AAIzD,YAAIG,EAAA,MAAKV,GAAgB,IAAIO,CAAI,EAAG;AAGpC,QAAIE,MAAS,OAEX,KAAK,aAAa,QAAQF,CAAI,IAAIE,CAAI,IAEtC,KAAK,gBAAgB,QAAQF,CAAI,EAAE,GAKrCG,EAAA,MAAKV,GAAgB,IAAIO,CAAI,GACzB,KAAK,aAAaA,CAAI,KACxB,KAAK,gBAAgBA,CAAI,GAE3BG,EAAA,MAAKV,GAAgB,OAAOO,CAAI,GAGhC,KAAK,cAAA;AACL;AAAA,MACF;AACA,YAAM,yBAAyBA,GAAMC,GAAKC,CAAI;AAAA,IAChD;AAAA,EAAA;AA5CA,EAAAT,IAAA;AAJF,MAAMW,IAANV;AAoDA,aAAWW,KAAQf,GAAiB;AAElC,UAAMgB,IAAmBD,MAAS,SAAS,SAASE,EAAeF,CAAI,GACjEG,IAAW,QAAQH,CAAI;AAE7B,WAAO,eAAeD,EAAqB,WAAWE,GAAU;AAAA,MAC9D,MAAkC;AAChC,eAAO,KAAK,aAAaE,CAAQ;AAAA,MACnC;AAAA,MACA,IAAsBC,GAAsB;AAC1C,QAAIA,KAAU,QACZ,KAAK,gBAAgBD,CAAQ,GAC7B,KAAK,gBAAgBH,CAAI,MAEzB,KAAK,aAAaG,GAAUC,CAAK,GAE7B,KAAK,aAAaJ,CAAI,KACxB,KAAK,gBAAgBA,CAAI,IAI7B,KAAK,cAAA;AAAA,MACP;AAAA,MACA,cAAc;AAAA,MACd,YAAY;AAAA,IAAA,CACb;AAAA,EACH;AAKA,SAAOD;AACT;AAOA,SAASG,EAAeF,GAAsB;AAC5C,QAAMK,IAAOL,EAAK,QAAQ,UAAU,EAAE;AACtC,SACE,SACAK,EAAK,OAAO,CAAC,EAAE,YAAA,IACfA,EAAK,MAAM,CAAC,EAAE,QAAQ,aAAa,CAACC,GAAGC,MAAcA,EAAE,aAAa;AAExE;"}
@@ -1,21 +0,0 @@
1
- import { lightTokenCss as c } from "@helixui/tokens";
2
- const t = Symbol.for("hx-tokens-adopted");
3
- function S() {
4
- if (typeof document > "u" || typeof CSSStyleSheet > "u" || typeof CSSStyleSheet.prototype.replaceSync != "function")
5
- return;
6
- const o = document;
7
- if (!o[t])
8
- try {
9
- const e = `:root {
10
- ${c}
11
- }`, n = new CSSStyleSheet();
12
- n.replaceSync(e), document.adoptedStyleSheets = [...document.adoptedStyleSheets, n], o[t] = t;
13
- } catch (e) {
14
- console.warn("[HELiX] Could not adopt document-level token styles:", e);
15
- }
16
- }
17
- S();
18
- export {
19
- S as e
20
- };
21
- //# sourceMappingURL=document-token-adoption-DuYNKd4k.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"document-token-adoption-DuYNKd4k.js","sources":["../../src/utilities/document-token-adoption.ts"],"sourcesContent":["/**\n * @module document-token-adoption\n *\n * Adopts HELiX design tokens into `document.adoptedStyleSheets` exactly once,\n * so that every Shadow DOM component can reference `var(--hx-*)` tokens via\n * CSS inheritance rather than declaring them on each component's `:host`.\n *\n * This is the correct architecture for theme provider compatibility:\n * - Tokens declared at the document level provide fallback values\n * - `hx-theme` overrides tokens on its `:host`, which flow down via inheritance\n * - Components simply consume `var(--hx-*)` in their styles without redeclaring\n *\n * Inspired by @phase2/outline-adopted-stylesheets-controller.\n *\n * Limitation: tokens are adopted into the current `document` only. Components\n * rendered inside iframes or cross-document contexts will need their own\n * `ensureDocumentTokens()` call against the appropriate document.\n *\n * @example\n * ```ts\n * // Auto-registers on first import — no API call needed\n * import '../utilities/document-token-adoption.js';\n * ```\n */\nimport { lightTokenCss } from '@helixui/tokens';\n\n/** Cross-bundle marker — Symbol.for ensures all copies share the same key */\nconst MARKER = Symbol.for('hx-tokens-adopted');\n\n/**\n * Adopts the full set of HELiX design tokens into `document.adoptedStyleSheets`.\n * Safe to call multiple times — only the first invocation has any effect.\n * Uses a document-level Symbol marker to survive multiple bundled copies of the library.\n *\n * The tokens are declared on `:root` so they participate in CSS inheritance\n * and can be overridden by `hx-theme` (which declares on its `:host`).\n */\nexport function ensureDocumentTokens(): void {\n if (\n typeof document === 'undefined' ||\n typeof CSSStyleSheet === 'undefined' ||\n typeof CSSStyleSheet.prototype.replaceSync !== 'function'\n ) {\n return;\n }\n\n const doc = document as unknown as Record<symbol, unknown>;\n if (doc[MARKER]) return;\n\n try {\n const cssText = `:root {\\n${lightTokenCss}\\n}`;\n\n const sheet = new CSSStyleSheet();\n sheet.replaceSync(cssText);\n\n document.adoptedStyleSheets = [...document.adoptedStyleSheets, sheet];\n doc[MARKER] = MARKER;\n } catch (e: unknown) {\n console.warn('[HELiX] Could not adopt document-level token styles:', e);\n }\n}\n\nensureDocumentTokens();\n"],"names":["MARKER","ensureDocumentTokens","doc","cssText","lightTokenCss","sheet"],"mappings":";AA2BA,MAAMA,IAAS,OAAO,IAAI,mBAAmB;AAUtC,SAASC,IAA6B;AAC3C,MACE,OAAO,WAAa,OACpB,OAAO,gBAAkB,OACzB,OAAO,cAAc,UAAU,eAAgB;AAE/C;AAGF,QAAMC,IAAM;AACZ,MAAI,CAAAA,EAAIF,CAAM;AAEd,QAAI;AACF,YAAMG,IAAU;AAAA,EAAYC,CAAa;AAAA,IAEnCC,IAAQ,IAAI,cAAA;AAClB,MAAAA,EAAM,YAAYF,CAAO,GAEzB,SAAS,qBAAqB,CAAC,GAAG,SAAS,oBAAoBE,CAAK,GACpEH,EAAIF,CAAM,IAAIA;AAAA,IAChB,SAAS,GAAY;AACnB,cAAQ,KAAK,wDAAwD,CAAC;AAAA,IACxE;AACF;AAEAC,EAAA;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"hx-accordion-CpfO0YQo.js","sources":["../../src/components/hx-accordion/hx-accordion.styles.ts","../../src/components/hx-accordion/hx-accordion-item.styles.ts","../../src/components/hx-accordion/hx-accordion-item.ts","../../src/components/hx-accordion/hx-accordion.ts"],"sourcesContent":["import { css } from 'lit';\n\nexport const helixAccordionStyles = css`\n :host {\n display: block;\n font-family: var(--hx-font-family-sans, sans-serif);\n }\n\n .accordion {\n border-radius: var(--hx-accordion-border-radius, var(--hx-border-radius-md, 0.375rem));\n overflow: hidden;\n }\n`;\n","import { css } from 'lit';\n\nexport const helixAccordionItemStyles = css`\n :host {\n display: block;\n }\n\n .item {\n border-bottom: var(--hx-border-width-thin, 1px) solid\n var(--hx-accordion-border-color, var(--hx-color-neutral-200, #dee2e6));\n font-family: var(--hx-font-family-sans, sans-serif);\n }\n\n :host(:first-child) .item {\n border-top: var(--hx-border-width-thin, 1px) solid\n var(--hx-accordion-border-color, var(--hx-color-neutral-200, #dee2e6));\n }\n\n /* Remove native details marker */\n .trigger {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--hx-space-3, 0.75rem);\n padding: var(--hx-accordion-trigger-padding, var(--hx-space-4, 1rem));\n cursor: pointer;\n list-style: none;\n font-size: var(--hx-font-size-md, 1rem);\n font-weight: var(--hx-font-weight-semibold, 600);\n color: var(--hx-accordion-trigger-color, var(--hx-color-neutral-800, #212529));\n background-color: var(--hx-accordion-trigger-bg, transparent);\n user-select: none;\n transition: background-color var(--hx-transition-fast, 150ms ease);\n }\n\n /* Hide the native details disclosure triangle */\n .trigger::-webkit-details-marker {\n display: none;\n }\n\n .trigger::marker {\n display: none;\n }\n\n .item--disabled .trigger {\n cursor: not-allowed;\n }\n\n :host(:not([disabled])) .trigger:hover {\n background-color: var(--hx-accordion-trigger-hover-bg, var(--hx-color-neutral-50, #f8f9fa));\n }\n\n .trigger:focus-visible {\n outline: var(--hx-focus-ring-width, 2px) solid\n var(--hx-focus-ring-color, var(--hx-color-primary-500, #2563eb));\n outline-offset: var(--hx-focus-ring-offset, -2px);\n }\n\n /* ─── Icon ─── */\n\n .icon {\n flex-shrink: 0;\n width: var(--hx-accordion-icon-size, var(--hx-size-5, 1.25rem));\n height: var(--hx-accordion-icon-size, var(--hx-size-5, 1.25rem));\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--hx-accordion-icon-color, var(--hx-color-neutral-500, #6c757d));\n transition: transform var(--hx-transition-normal, 250ms ease);\n }\n\n .item--expanded .icon {\n transform: rotate(180deg);\n }\n\n /* ─── Content animation via CSS grid trick ─── */\n\n .content-wrapper {\n display: grid;\n grid-template-rows: 0fr;\n transition: grid-template-rows var(--hx-transition-normal, 250ms ease);\n overflow: hidden;\n }\n\n .item--expanded .content-wrapper,\n details[open]:not(.item--expanded) .content-wrapper {\n grid-template-rows: 1fr;\n }\n\n .content-inner {\n overflow: hidden;\n }\n\n .content {\n padding: var(--hx-accordion-content-padding, 0 var(--hx-space-4, 1rem) var(--hx-space-4, 1rem));\n font-size: var(--hx-font-size-md, 1rem);\n line-height: var(--hx-line-height-normal, 1.5);\n color: var(--hx-accordion-content-color, var(--hx-color-neutral-600, #495057));\n }\n\n /* ─── Disabled host ─── */\n\n :host([disabled]) {\n pointer-events: none;\n opacity: var(--hx-opacity-disabled, 0.5);\n }\n\n /* ─── Reduced motion ─── */\n\n @media (prefers-reduced-motion: reduce) {\n .trigger {\n transition: none;\n }\n\n .icon {\n transition: none;\n }\n\n .content-wrapper {\n transition: none;\n }\n }\n`;\n","import { LitElement, html, svg, nothing } from 'lit';\nimport '../../utilities/document-token-adoption.js';\nimport { customElement, property } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { helixAccordionItemStyles } from './hx-accordion-item.styles.js';\nimport { devWarn } from '../../utils/dev-warn.js';\n\nconst chevronIcon = svg`\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"6 9 12 15 18 9\"></polyline>\n </svg>\n`;\n\n/**\n * An individual accordion item with collapsible content.\n *\n * @summary Collapsible panel that can be expanded or collapsed.\n *\n * @tag hx-accordion-item\n *\n * @slot trigger - The heading/trigger content for this item.\n * @slot - Default slot for the collapsible body content.\n *\n * @attr {number} level - Heading level (1–6) for the trigger via `role=\"heading\" aria-level`.\n * Defaults to 3. Set this to match the document outline — e.g., use `level=\"2\"` when the\n * accordion appears under an `<h1>` landmark.\n *\n * @fires {CustomEvent<{expanded: boolean, itemId: string}>} hx-expand - Dispatched when the item is expanded.\n * @fires {CustomEvent<{expanded: boolean, itemId: string}>} hx-collapse - Dispatched when the item is collapsed.\n *\n * @csspart item - The outer details element container.\n * @csspart trigger - The summary/trigger element.\n * @csspart content - The collapsible content area.\n * @csspart icon - The expand/collapse icon.\n *\n * @cssprop [--hx-accordion-border-color=var(--hx-color-neutral-200)] - Border color between items.\n * @cssprop [--hx-accordion-trigger-padding=var(--hx-space-4)] - Trigger padding.\n * @cssprop [--hx-accordion-trigger-color=var(--hx-color-neutral-800)] - Trigger text color.\n * @cssprop [--hx-accordion-trigger-bg=transparent] - Trigger background color.\n * @cssprop [--hx-accordion-trigger-hover-bg=var(--hx-color-neutral-50)] - Trigger hover background.\n * @cssprop [--hx-accordion-icon-color=var(--hx-color-neutral-500)] - Icon color.\n * @cssprop [--hx-accordion-content-padding=0 var(--hx-space-4) var(--hx-space-4)] - Content padding.\n * @cssprop [--hx-accordion-content-color=var(--hx-color-neutral-600)] - Content text color.\n */\n@customElement('hx-accordion-item')\nexport class HelixAccordionItem extends LitElement {\n static override styles = [helixAccordionItemStyles];\n\n /** @internal */\n private static _counter = 0;\n /** @internal */\n private _uid = `hx-accordion-item-${++HelixAccordionItem._counter}`;\n\n /**\n * Whether this item is expanded.\n * @attr expanded\n */\n @property({ type: Boolean, reflect: true })\n expanded = false;\n\n /**\n * Whether this item is disabled (cannot be toggled).\n * @attr disabled\n */\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n /**\n * Heading level (1–6) applied via `role=\"heading\" aria-level` on the summary\n * trigger. Defaults to 3. Set to match the document outline around the\n * accordion so screen readers surface accordion items in the heading list.\n * @attr level\n */\n @property({ type: Number })\n level: 1 | 2 | 3 | 4 | 5 | 6 = 3;\n\n // ─── Lifecycle ───\n\n override connectedCallback(): void {\n super.connectedCallback();\n if (!this.closest('hx-accordion')) {\n devWarn(\n 'hx-accordion-item',\n 'Used outside hx-accordion. Single-expand coordination will not function.',\n );\n }\n }\n\n // ─── Slot Handlers ───\n\n /** @internal */\n private _handleTriggerSlotChange(e: Event): void {\n const slot = e.target as HTMLSlotElement;\n const hasContent = slot.assignedNodes({ flatten: true }).length > 0;\n if (!hasContent) {\n devWarn(\n 'hx-accordion-item',\n 'trigger slot is empty — provide a visible label for keyboard and screen reader users.',\n );\n }\n }\n\n // ─── Heading Level Helper ───\n\n /**\n * Returns a clamped heading level (1–6) for use as `aria-level` on the\n * `<summary>` element. Per the WAI-ARIA APG Accordion pattern, the\n * `<summary>` must be a **direct child** of `<details>` for native\n * disclosure behaviour to work. Instead of wrapping `<summary>` inside\n * an `<h3>` (which breaks the native toggle), we apply\n * `role=\"heading\" aria-level=\"N\"` directly on `<summary>`.\n */\n /** @internal */\n private get _headingLevel(): number {\n return Math.max(1, Math.min(6, this.level));\n }\n\n // ─── Toggle Logic ───\n\n /** @internal */\n private _toggle(): void {\n if (this.disabled) return;\n\n const willExpand = !this.expanded;\n this.expanded = willExpand;\n\n this._dispatchToggleEvent(willExpand);\n }\n\n /** @internal */\n _dispatchToggleEvent(expanded: boolean): void {\n const detail = { expanded, itemId: this.id || '' };\n const options = { bubbles: true, composed: true, detail };\n\n if (expanded) {\n this.dispatchEvent(\n new CustomEvent<{ expanded: boolean; itemId: string }>('hx-expand', options),\n );\n } else {\n this.dispatchEvent(\n new CustomEvent<{ expanded: boolean; itemId: string }>('hx-collapse', options),\n );\n }\n }\n\n // ─── Event Handlers ───\n\n /** @internal */\n private _handleSummaryClick(e: MouseEvent): void {\n e.preventDefault();\n this._toggle();\n }\n\n /** @internal */\n private _handleKeyDown(e: KeyboardEvent): void {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n this._toggle();\n }\n }\n\n // ─── Render ───\n\n override render() {\n const itemClasses = {\n item: true,\n 'item--expanded': this.expanded,\n 'item--disabled': this.disabled,\n };\n\n return html`\n <details part=\"item\" class=${classMap(itemClasses)} ?open=${this.expanded}>\n <summary\n id=${`${this._uid}-trigger`}\n part=\"trigger\"\n class=\"trigger\"\n role=\"heading\"\n aria-level=${this._headingLevel}\n tabindex=${this.disabled ? '-1' : '0'}\n aria-expanded=${this.expanded ? 'true' : 'false'}\n aria-disabled=${this.disabled ? 'true' : nothing}\n aria-controls=${`${this._uid}-content`}\n @click=${this._handleSummaryClick}\n @keydown=${this._handleKeyDown}\n >\n <slot name=\"trigger\" @slotchange=${this._handleTriggerSlotChange}></slot>\n <span part=\"icon\" class=\"icon\">${chevronIcon}</span>\n </summary>\n <div class=\"content-wrapper\">\n <div class=\"content-inner\">\n <div\n id=${`${this._uid}-content`}\n part=\"content\"\n class=\"content\"\n role=\"region\"\n aria-labelledby=${`${this._uid}-trigger`}\n aria-hidden=${this.expanded ? nothing : 'true'}\n >\n <slot></slot>\n </div>\n </div>\n </div>\n </details>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'hx-accordion-item': HelixAccordionItem;\n }\n}\n","import { LitElement, html, type PropertyValues } from 'lit';\nimport '../../utilities/document-token-adoption.js';\nimport { customElement, property } from 'lit/decorators.js';\nimport { helixAccordionStyles } from './hx-accordion.styles.js';\nimport './hx-accordion-item.js';\nimport type { HelixAccordionItem } from './hx-accordion-item.js';\nimport { devWarn } from '../../utils/dev-warn.js';\n\n/**\n * An accordion container that manages collapsible content sections.\n *\n * @summary Collapsible content sections with single or multi-expand modes.\n *\n * @tag hx-accordion\n *\n * @slot - Default slot for hx-accordion-item elements.\n *\n * @csspart accordion - The outer container wrapping all accordion items.\n *\n * @cssprop [--hx-accordion-border-radius=var(--hx-border-radius-md)] - Outer border radius.\n *\n * @example\n * ```html\n * <hx-accordion mode=\"single\">\n * <hx-accordion-item>\n * <span slot=\"trigger\">What is this?</span>\n * <p>Answer content here.</p>\n * </hx-accordion-item>\n * </hx-accordion>\n * ```\n */\n@customElement('hx-accordion')\nexport class HelixAccordion extends LitElement {\n static override styles = [helixAccordionStyles];\n\n /**\n * Expansion mode: 'single' collapses all other items when one expands.\n * 'multi' allows multiple items open simultaneously.\n * @attr mode\n */\n @property({ type: String, reflect: true })\n mode: 'single' | 'multi' = 'single';\n\n // ─── Lifecycle ───\n\n /** @internal */\n private _mutationObserver: MutationObserver | null = null;\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.addEventListener('hx-expand', this._handleChildExpand);\n this.addEventListener('keydown', this._handleKeyDown);\n // Re-enforce single mode when reconnected with pre-expanded items\n this._enforceSingleMode();\n // Watch for dynamically added accordion items that may violate single-expand\n if (typeof MutationObserver !== 'undefined') {\n this._mutationObserver = new MutationObserver((mutations) => {\n const hasNewItems = mutations.some((m) =>\n Array.from(m.addedNodes).some(\n (n) => n instanceof Element && n.tagName.toLowerCase() === 'hx-accordion-item',\n ),\n );\n if (hasNewItems) {\n this._enforceSingleMode();\n }\n });\n this._mutationObserver.observe(this, { childList: true });\n }\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener('hx-expand', this._handleChildExpand);\n this.removeEventListener('keydown', this._handleKeyDown);\n this._mutationObserver?.disconnect();\n this._mutationObserver = null;\n }\n\n protected override firstUpdated(): void {\n this._enforceSingleMode();\n }\n\n override updated(changedProperties: PropertyValues<this>): void {\n super.updated(changedProperties);\n if (changedProperties.has('mode')) {\n const validModes: string[] = ['single', 'multi'];\n if (!validModes.includes(this.mode)) {\n devWarn(\n 'hx-accordion',\n `Invalid mode \"${this.mode}\". Expected one of: ${validModes.join(', ')}. Clamping to \"single\".`,\n );\n this.mode = 'single';\n return;\n }\n // When switching from multi to single, enforce single-expand immediately\n this._enforceSingleMode();\n }\n }\n\n // ─── Single-expand coordination ───\n\n /** @internal */\n private _enforceSingleMode(): void {\n if (this.mode !== 'single') return;\n\n const items = this.querySelectorAll<HelixAccordionItem>('hx-accordion-item');\n let foundExpanded = false;\n\n items.forEach((item) => {\n if (item.expanded) {\n if (foundExpanded) {\n item.expanded = false;\n } else {\n foundExpanded = true;\n }\n }\n });\n }\n\n /**\n * Handles expand events from child accordion items to enforce single-expand mode.\n * @internal\n */\n private _handleChildExpand = (e: Event): void => {\n if (this.mode !== 'single') return;\n\n const expandedItem = e.composedPath()[0] as HelixAccordionItem;\n const items = this.querySelectorAll<HelixAccordionItem>('hx-accordion-item');\n\n items.forEach((item) => {\n if (item !== expandedItem && item.expanded) {\n item.expanded = false;\n item._dispatchToggleEvent(false);\n }\n });\n };\n\n // ─── Arrow key navigation (ARIA APG Accordion pattern) ───\n\n /**\n * Handles keyboard navigation between accordion triggers using arrow, Home, and End keys.\n * @internal\n */\n private _handleKeyDown = (e: KeyboardEvent): void => {\n const triggers = this._getTriggers();\n if (triggers.length === 0) return;\n\n const activeEl = this.shadowRoot?.activeElement ?? document.activeElement;\n let currentItem: HelixAccordionItem | null = null;\n\n const items = Array.from(this.querySelectorAll<HelixAccordionItem>('hx-accordion-item'));\n for (const item of items) {\n const summary = item.shadowRoot?.querySelector('[part=\"trigger\"]');\n if (summary === activeEl || item.shadowRoot?.activeElement === summary) {\n currentItem = item;\n break;\n }\n }\n\n if (!currentItem) return;\n\n const enabledItems = items.filter((item) => !item.disabled);\n const currentIndex = enabledItems.indexOf(currentItem);\n if (currentIndex === -1) return;\n\n let targetIndex = -1;\n\n switch (e.key) {\n case 'ArrowDown':\n targetIndex = (currentIndex + 1) % enabledItems.length;\n break;\n case 'ArrowUp':\n targetIndex = (currentIndex - 1 + enabledItems.length) % enabledItems.length;\n break;\n case 'Home':\n targetIndex = 0;\n break;\n case 'End':\n targetIndex = enabledItems.length - 1;\n break;\n default:\n return;\n }\n\n e.preventDefault();\n const targetItem = enabledItems[targetIndex];\n const targetSummary = targetItem?.shadowRoot?.querySelector<HTMLElement>('[part=\"trigger\"]');\n targetSummary?.focus();\n };\n\n /** @internal */\n private _getTriggers(): HTMLElement[] {\n const items = this.querySelectorAll<HelixAccordionItem>('hx-accordion-item');\n const triggers: HTMLElement[] = [];\n items.forEach((item) => {\n const summary = item.shadowRoot?.querySelector<HTMLElement>('[part=\"trigger\"]');\n if (summary) triggers.push(summary);\n });\n return triggers;\n }\n\n // ─── Slot validation ───\n\n /** @internal */\n private _handleSlotChange(e: Event): void {\n const slot = e.target;\n if (!(slot instanceof HTMLSlotElement)) return;\n const invalid = slot\n .assignedElements()\n .filter((el) => el.tagName.toLowerCase() !== 'hx-accordion-item');\n if (invalid.length > 0) {\n devWarn(\n 'hx-accordion',\n `Default slot expects <hx-accordion-item> elements. Found unexpected: ${invalid.map((el) => `<${el.tagName.toLowerCase()}>`).join(', ')}`,\n );\n }\n }\n\n // ─── Render ───\n\n override render() {\n return html`\n <div part=\"accordion\" class=\"accordion\">\n <slot @slotchange=${this._handleSlotChange}></slot>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'hx-accordion': HelixAccordion;\n }\n}\n"],"names":["helixAccordionStyles","css","helixAccordionItemStyles","chevronIcon","svg","HelixAccordionItem","LitElement","willExpand","expanded","options","itemClasses","html","classMap","nothing","__decorateClass","property","customElement","HelixAccordion","expandedItem","item","activeEl","_a","currentItem","items","summary","_b","_c","enabledItems","currentIndex","targetIndex","targetItem","targetSummary","_d","mutations","m","n","changedProperties","validModes","devWarn","foundExpanded","triggers","slot","invalid","el"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"hx-action-bar-BpY1Z1UV.js","sources":["../../src/components/hx-action-bar/hx-action-bar.styles.ts","../../src/components/hx-action-bar/hx-action-bar.ts"],"sourcesContent":["import { css } from 'lit';\n\nexport const helixActionBarStyles = css`\n :host {\n display: block;\n }\n\n /* ─── Base ─── */\n\n .base {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: var(--hx-action-bar-gap, var(--hx-space-2, 0.5rem));\n padding: var(--hx-action-bar-padding, var(--hx-space-2, 0.5rem) var(--hx-space-3, 0.75rem));\n background: var(--hx-action-bar-bg, transparent);\n border: var(--hx-action-bar-border, none);\n box-sizing: border-box;\n width: 100%;\n }\n\n /* ─── Sticky (top) ─── */\n\n .base--sticky {\n position: sticky;\n top: 0;\n padding-top: max(var(--hx-action-bar-padding-block-start, 0px), env(safe-area-inset-top, 0px));\n z-index: var(--hx-action-bar-z-index, 10);\n /*\n * Consumers: when this bar is sticky, add scroll-padding-top to the scroll container\n * equal to the bar's rendered height so anchor targets are not hidden behind the bar.\n * Example: .scroll-container { scroll-padding-top: 2.5rem; }\n */\n }\n\n /* ─── Bottom sticky ─── */\n\n .base--bottom {\n position: sticky;\n bottom: 0;\n /*\n * Respect iOS home-indicator safe area on devices with notch/home bar.\n * Falls back to 0px on devices that do not support env().\n */\n padding-bottom: max(\n var(--hx-action-bar-padding-block-end, 0px),\n env(safe-area-inset-bottom, 0px)\n );\n z-index: var(--hx-action-bar-z-index, 10);\n }\n\n /* ─── Variant: outlined ─── */\n\n .base--outlined {\n background: var(--hx-action-bar-bg, var(--hx-color-neutral-0, #fff));\n border: var(\n --hx-action-bar-border,\n var(--hx-border-width-thin, 1px) solid var(--hx-color-neutral-200, #e5e7eb)\n );\n border-radius: var(--hx-border-radius-md, 0.375rem);\n }\n\n /* ─── Variant: filled ─── */\n\n .base--filled {\n background: var(--hx-action-bar-bg, var(--hx-color-neutral-50, #f9fafb));\n border-radius: var(--hx-border-radius-md, 0.375rem);\n }\n\n /* ─── Size modifiers ─── */\n\n .base--sm {\n padding: var(--hx-action-bar-padding, var(--hx-space-1, 0.25rem) var(--hx-space-2, 0.5rem));\n gap: var(--hx-action-bar-gap, var(--hx-space-1, 0.25rem));\n min-height: var(--hx-size-8, 2rem);\n }\n\n .base--md {\n min-height: var(--hx-size-10, 2.5rem);\n }\n\n .base--lg {\n padding: var(--hx-action-bar-padding, var(--hx-space-3, 0.75rem) var(--hx-space-4, 1rem));\n gap: var(--hx-action-bar-gap, var(--hx-space-3, 0.75rem));\n min-height: var(--hx-size-12, 3rem);\n }\n\n /* ─── Sections ─── */\n\n .section {\n display: flex;\n align-items: center;\n gap: inherit;\n }\n\n /*\n * Equal flex-basis on start and end guarantees the center section is visually centered\n * within the full bar width, regardless of how wide start and end content are.\n */\n .section--start {\n flex: 1 1 0;\n justify-content: flex-start;\n }\n\n .section--center {\n flex: 0 0 auto;\n justify-content: center;\n }\n\n .section--end {\n flex: 1 1 0;\n justify-content: flex-end;\n }\n\n /* ─── Slotted content ─── */\n\n ::slotted(*) {\n flex-shrink: 0;\n }\n`;\n","import { LitElement, html } from 'lit';\nimport '../../utilities/document-token-adoption.js';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { helixActionBarStyles } from './hx-action-bar.styles.js';\nimport { devWarn } from '../../utils/dev-warn.js';\n\n// Re-export size type for external consumers.\nexport type ActionBarSize = 'sm' | 'md' | 'lg';\n\n/**\n * A horizontal toolbar container for grouping related action buttons and controls.\n * Implements the ARIA toolbar pattern with roving tabindex keyboard navigation.\n *\n * @summary Horizontal action bar for grouping related controls.\n *\n * @tag hx-action-bar\n *\n * @slot start - Left-aligned actions.\n * @slot - Center content (default slot).\n * @slot end - Right-aligned actions.\n * @slot overflow - Actions revealed when the bar is constrained for space.\n *\n * @csspart base - The root toolbar container element.\n * @csspart start - The start (left) slot wrapper.\n * @csspart center - The center (default) slot wrapper.\n * @csspart end - The end (right) slot wrapper.\n * @csspart overflow - The overflow slot wrapper (hidden when no overflow content).\n *\n * @cssprop [--hx-action-bar-bg=transparent] - Bar background color (default variant).\n * @cssprop [--hx-action-bar-border=none] - Bar border (default variant).\n * @cssprop [--hx-action-bar-padding=var(--hx-space-2,0.5rem) var(--hx-space-3,0.75rem)] - Inner padding.\n * @cssprop [--hx-action-bar-gap=var(--hx-space-2,0.5rem)] - Gap between slotted items.\n * @cssprop [--hx-action-bar-z-index=10] - Z-index when sticky or bottom position.\n *\n * @attr {string} aria-label - Required. Identifies the toolbar to assistive technology.\n * When multiple toolbars appear on the same page, each must have a unique, descriptive label.\n *\n * @example\n * ```html\n * <hx-action-bar aria-label=\"Patient actions\">\n * <hx-button slot=\"start\">Save</hx-button>\n * <hx-button slot=\"end\" variant=\"ghost\">Cancel</hx-button>\n * </hx-action-bar>\n * ```\n */\n@customElement('hx-action-bar')\nexport class HelixActionBar extends LitElement {\n static override styles = [helixActionBarStyles];\n\n /**\n * Size of the action bar — propagated as a data attribute to slotted children.\n * @attr hx-size\n */\n @property({ type: String, reflect: true, attribute: 'hx-size' })\n size: 'sm' | 'md' | 'lg' = 'md';\n\n /**\n * Visual variant controlling the bar background.\n * @attr variant\n */\n @property({ type: String, reflect: true })\n variant: 'default' | 'outlined' | 'filled' = 'default';\n\n /**\n * Position and sticky behavior of the action bar.\n * - `top` — normal flow (default)\n * - `sticky` — sticks to the top of the scroll container; add `scroll-padding-top` to the\n * scroll container equal to the bar height to prevent anchor targets from scrolling behind it\n * - `bottom` — sticks to the bottom of the scroll container with iOS safe-area-inset support\n * @attr position\n */\n @property({ type: String, reflect: true })\n position: 'top' | 'bottom' | 'sticky' = 'top';\n\n /**\n * @deprecated Use `position=\"sticky\"` instead.\n * When true, the bar sticks to the top of its scroll container.\n * @attr sticky\n */\n @property({ type: Boolean, reflect: true })\n get sticky(): boolean {\n return this._sticky;\n }\n set sticky(value: boolean) {\n if (value) {\n devWarn(\n 'hx-action-bar',\n 'The `sticky` property is deprecated. Use `position=\"sticky\"` instead.',\n );\n }\n const old = this._sticky;\n this._sticky = value;\n this.requestUpdate('sticky', old);\n }\n /** @internal */\n private _sticky = false;\n\n /**\n * Accessible label for the toolbar.\n * Required when multiple toolbars appear on the same page.\n * @attr aria-label\n */\n @property({ attribute: 'aria-label' })\n ariaLabel: string = 'Actions';\n\n /** Cached list of focusable items — invalidated on slot change. */\n /** @internal */\n private _focusableCache: HTMLElement[] | null = null;\n\n /** Whether the overflow slot has assigned content. * @internal\n */\n @state()\n private _hasOverflow = false;\n\n // ─── Lifecycle ───\n\n /** Arrow function field — stable reference for add/removeEventListener. */\n /** @internal */\n private _handleKeydown = (e: KeyboardEvent): void => {\n if (e.key === 'ArrowRight') {\n e.preventDefault();\n this._moveFocus('next');\n } else if (e.key === 'ArrowLeft') {\n e.preventDefault();\n this._moveFocus('prev');\n } else if (e.key === 'Home') {\n e.preventDefault();\n // Move directly to first item — do NOT call _moveFocus which would visit other items first.\n const items = this._getFocusableItems();\n if (items.length) {\n items.forEach((el, i) => el.setAttribute('tabindex', i === 0 ? '0' : '-1'));\n items[0]?.focus();\n }\n } else if (e.key === 'End') {\n e.preventDefault();\n const items = this._getFocusableItems();\n const last = items.length - 1;\n if (items.length) {\n items.forEach((el, i) => el.setAttribute('tabindex', i === last ? '0' : '-1'));\n items[last]?.focus();\n }\n }\n };\n\n override connectedCallback(): void {\n super.connectedCallback();\n // Backward compat: accept legacy `size` attribute. When present and `hx-size`\n // is not set, map the value and emit a deprecation warning.\n const legacySize = this.getAttribute('size');\n if (legacySize !== null && !this.hasAttribute('hx-size')) {\n devWarn('hx-action-bar', 'The \"size\" attribute is deprecated. Use \"hx-size\" instead.');\n this.size = legacySize as ActionBarSize;\n }\n // Prevent dual aria-label announcement: the host carries the consumer's\n // aria-label attribute while the inner div[role=\"toolbar\"] receives the\n // same value. Setting role=\"none\" on the host hides it from the\n // accessibility tree so only the toolbar is announced.\n if (!this.hasAttribute('role')) {\n this.setAttribute('role', 'none');\n } else if (this.getAttribute('role') !== 'none') {\n devWarn(\n 'hx-action-bar',\n `Setting role=\"${this.getAttribute('role')}\" on the host creates a duplicate toolbar announcement. ` +\n 'The shadow DOM already contains role=\"toolbar\". Set role=\"none\" on the host to suppress it.',\n );\n }\n this.addEventListener('keydown', this._handleKeydown);\n }\n\n override firstUpdated(): void {\n // Slot assignments are complete by firstUpdated; initialize roving tabindex\n // immediately rather than waiting for the async slotchange event.\n this._initRovingTabindex();\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener('keydown', this._handleKeydown);\n }\n\n // ─── Focusable item discovery ───\n\n /** @internal */\n private _isFocusable(el: HTMLElement): boolean {\n // Check disabled via DOM attribute (native elements) or property (custom elements)\n if (el.hasAttribute('disabled')) return false;\n const elWithDisabled = el as HTMLElement & { disabled?: boolean };\n if (elWithDisabled.disabled === true) return false;\n\n // Use the IDL tabIndex property — covers both DOM attribute and ElementInternals settings.\n // Custom elements (e.g. hx-button) that set tabIndex via ElementInternals are discoverable.\n if (el.tabIndex >= 0) return true;\n\n const tag = el.tagName.toLowerCase();\n return tag === 'button' || tag === 'input' || tag === 'select' || tag === 'textarea';\n }\n\n /** @internal */\n private _getFocusableItems(): HTMLElement[] {\n if (this._focusableCache) return this._focusableCache;\n\n const slots = this.shadowRoot?.querySelectorAll('slot') ?? [];\n const items: HTMLElement[] = [];\n\n for (const slot of Array.from(slots)) {\n const assigned = (slot as HTMLSlotElement).assignedElements({ flatten: true });\n for (const el of assigned) {\n if (!(el instanceof HTMLElement)) continue;\n if (this._isFocusable(el)) {\n // Element is itself focusable — include it and do NOT also recurse into its children\n // to prevent double-counting compound components (e.g. <a><button>).\n items.push(el);\n } else {\n // Element is a non-focusable wrapper (e.g. <div>, <span>) — find focusable children.\n const descendants = el.querySelectorAll<HTMLElement>('*');\n for (const d of Array.from(descendants)) {\n if (this._isFocusable(d)) {\n items.push(d);\n }\n }\n }\n }\n }\n\n this._focusableCache = items;\n return items;\n }\n\n // ─── Roving tabindex helpers ───\n\n /** @internal */\n private _initRovingTabindex(): void {\n this._focusableCache = null; // invalidate cache on slot change\n const items = this._getFocusableItems();\n if (!items.length) return;\n // Find the currently active item. If none exists (e.g. first render or active item was\n // removed), fall back to index 0. Then set ALL items explicitly so newly added items and\n // items whose tabindex changed externally are always in a correct state.\n const activeIndex = items.findIndex((el) => el.getAttribute('tabindex') === '0');\n const targetIndex = activeIndex === -1 ? 0 : activeIndex;\n items.forEach((el, i) => el.setAttribute('tabindex', i === targetIndex ? '0' : '-1'));\n }\n\n /** @internal */\n private _moveFocus(direction: 'next' | 'prev'): void {\n const items = this._getFocusableItems();\n if (!items.length) return;\n\n const focused = document.activeElement as HTMLElement | null;\n const currentIndex = items.indexOf(focused as HTMLElement);\n\n let nextIndex: number;\n if (direction === 'next') {\n nextIndex = currentIndex < items.length - 1 ? currentIndex + 1 : 0;\n } else {\n nextIndex = currentIndex > 0 ? currentIndex - 1 : items.length - 1;\n }\n\n items.forEach((el, i) => {\n el.setAttribute('tabindex', i === nextIndex ? '0' : '-1');\n });\n\n items[nextIndex]?.focus();\n }\n\n // ─── Event Handlers ───\n\n /** @internal */\n private _handleSlotChange(e: Event): void {\n const slot = e.target as HTMLSlotElement;\n if (slot.name === 'overflow') {\n this._hasOverflow = slot.assignedElements({ flatten: true }).length > 0;\n }\n this._initRovingTabindex();\n }\n\n // ─── Render ───\n\n override render() {\n const isSticky = this.position === 'sticky' || this.sticky;\n const isBottom = this.position === 'bottom';\n const positionClass = isSticky ? ' base--sticky' : isBottom ? ' base--bottom' : '';\n\n return html`\n <div\n part=\"base\"\n role=\"toolbar\"\n aria-label=${this.ariaLabel}\n aria-orientation=\"horizontal\"\n class=\"base base--${this.size} base--${this.variant}${positionClass}\"\n >\n <div part=\"start\" class=\"section section--start\">\n <slot name=\"start\" @slotchange=${this._handleSlotChange}></slot>\n </div>\n <div part=\"center\" class=\"section section--center\">\n <slot @slotchange=${this._handleSlotChange}></slot>\n </div>\n <div part=\"end\" class=\"section section--end\">\n <slot name=\"end\" @slotchange=${this._handleSlotChange}></slot>\n </div>\n <div part=\"overflow\" class=\"section section--overflow\" ?hidden=${!this._hasOverflow}>\n <slot name=\"overflow\" @slotchange=${this._handleSlotChange}></slot>\n </div>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'hx-action-bar': HelixActionBar;\n }\n}\n"],"names":["helixActionBarStyles","css","HelixActionBar","LitElement","e","items","el","i","_a","last","_b","value","old","legacySize","devWarn","tag","slots","slot","assigned","descendants","d","activeIndex","targetIndex","direction","focused","currentIndex","nextIndex","isSticky","isBottom","positionClass","html","__decorateClass","property","state","customElement"],"mappings":";;;;AAEO,MAAMA,IAAuBC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;AC4C7B,IAAMC,IAAN,cAA6BC,EAAW;AAAA,EAAxC,cAAA;AAAA,UAAA,GAAA,SAAA,GAQL,KAAA,OAA2B,MAO3B,KAAA,UAA6C,WAW7C,KAAA,WAAwC,OAuBxC,KAAQ,UAAU,IAQlB,KAAA,YAAoB,WAIpB,KAAQ,kBAAwC,MAKhD,KAAQ,eAAe,IAMvB,KAAQ,iBAAiB,CAACC,MAA2B;;AACnD,UAAIA,EAAE,QAAQ;AACZ,QAAAA,EAAE,eAAA,GACF,KAAK,WAAW,MAAM;AAAA,eACbA,EAAE,QAAQ;AACnB,QAAAA,EAAE,eAAA,GACF,KAAK,WAAW,MAAM;AAAA,eACbA,EAAE,QAAQ,QAAQ;AAC3B,QAAAA,EAAE,eAAA;AAEF,cAAMC,IAAQ,KAAK,mBAAA;AACnB,QAAIA,EAAM,WACRA,EAAM,QAAQ,CAACC,GAAIC,MAAMD,EAAG,aAAa,YAAYC,MAAM,IAAI,MAAM,IAAI,CAAC,IAC1EC,IAAAH,EAAM,CAAC,MAAP,QAAAG,EAAU;AAAA,MAEd,WAAWJ,EAAE,QAAQ,OAAO;AAC1B,QAAAA,EAAE,eAAA;AACF,cAAMC,IAAQ,KAAK,mBAAA,GACbI,IAAOJ,EAAM,SAAS;AAC5B,QAAIA,EAAM,WACRA,EAAM,QAAQ,CAACC,GAAIC,MAAMD,EAAG,aAAa,YAAYC,MAAME,IAAO,MAAM,IAAI,CAAC,IAC7EC,IAAAL,EAAMI,CAAI,MAAV,QAAAC,EAAa;AAAA,MAEjB;AAAA,IACF;AAAA,EAAA;AAAA,EA9DA,IAAI,SAAkB;AACpB,WAAO,KAAK;AAAA,EACd;AAAA,EACA,IAAI,OAAOC,GAAgB;AAOzB,UAAMC,IAAM,KAAK;AACjB,SAAK,UAAUD,GACf,KAAK,cAAc,UAAUC,CAAG;AAAA,EAClC;AAAA,EAmDS,oBAA0B;AACjC,UAAM,kBAAA;AAGN,UAAMC,IAAa,KAAK,aAAa,MAAM;AAC3C,IAAIA,MAAe,QAAQ,CAAC,KAAK,aAAa,SAAS,MAErD,KAAK,OAAOA,IAMT,KAAK,aAAa,MAAM,IAElB,KAAK,aAAa,MAAM,MAAM,UACvCC;AAAA,MACE;AAAA,MACA,iBAAiB,KAAK,aAAa,MAAM,CAAC;AAAA,IAAA,IAJ5C,KAAK,aAAa,QAAQ,MAAM,GAQlC,KAAK,iBAAiB,WAAW,KAAK,cAAc;AAAA,EACtD;AAAA,EAES,eAAqB;AAG5B,SAAK,oBAAA;AAAA,EACP;AAAA,EAES,uBAA6B;AACpC,UAAM,qBAAA,GACN,KAAK,oBAAoB,WAAW,KAAK,cAAc;AAAA,EACzD;AAAA;AAAA;AAAA,EAKQ,aAAaR,GAA0B;AAI7C,QAFIA,EAAG,aAAa,UAAU,KACPA,EACJ,aAAa,GAAM,QAAO;AAI7C,QAAIA,EAAG,YAAY,EAAG,QAAO;AAE7B,UAAMS,IAAMT,EAAG,QAAQ,YAAA;AACvB,WAAOS,MAAQ,YAAYA,MAAQ,WAAWA,MAAQ,YAAYA,MAAQ;AAAA,EAC5E;AAAA;AAAA,EAGQ,qBAAoC;;AAC1C,QAAI,KAAK,gBAAiB,QAAO,KAAK;AAEtC,UAAMC,MAAQR,IAAA,KAAK,eAAL,gBAAAA,EAAiB,iBAAiB,YAAW,CAAA,GACrDH,IAAuB,CAAA;AAE7B,eAAWY,KAAQ,MAAM,KAAKD,CAAK,GAAG;AACpC,YAAME,IAAYD,EAAyB,iBAAiB,EAAE,SAAS,IAAM;AAC7E,iBAAWX,KAAMY;AACf,YAAMZ,aAAc;AACpB,cAAI,KAAK,aAAaA,CAAE;AAGtB,YAAAD,EAAM,KAAKC,CAAE;AAAA,eACR;AAEL,kBAAMa,IAAcb,EAAG,iBAA8B,GAAG;AACxD,uBAAWc,KAAK,MAAM,KAAKD,CAAW;AACpC,cAAI,KAAK,aAAaC,CAAC,KACrBf,EAAM,KAAKe,CAAC;AAAA,UAGlB;AAAA,IAEJ;AAEA,gBAAK,kBAAkBf,GAChBA;AAAA,EACT;AAAA;AAAA;AAAA,EAKQ,sBAA4B;AAClC,SAAK,kBAAkB;AACvB,UAAMA,IAAQ,KAAK,mBAAA;AACnB,QAAI,CAACA,EAAM,OAAQ;AAInB,UAAMgB,IAAchB,EAAM,UAAU,CAACC,MAAOA,EAAG,aAAa,UAAU,MAAM,GAAG,GACzEgB,IAAcD,MAAgB,KAAK,IAAIA;AAC7C,IAAAhB,EAAM,QAAQ,CAACC,GAAIC,MAAMD,EAAG,aAAa,YAAYC,MAAMe,IAAc,MAAM,IAAI,CAAC;AAAA,EACtF;AAAA;AAAA,EAGQ,WAAWC,GAAkC;;AACnD,UAAMlB,IAAQ,KAAK,mBAAA;AACnB,QAAI,CAACA,EAAM,OAAQ;AAEnB,UAAMmB,IAAU,SAAS,eACnBC,IAAepB,EAAM,QAAQmB,CAAsB;AAEzD,QAAIE;AACJ,IAAIH,MAAc,SAChBG,IAAYD,IAAepB,EAAM,SAAS,IAAIoB,IAAe,IAAI,IAEjEC,IAAYD,IAAe,IAAIA,IAAe,IAAIpB,EAAM,SAAS,GAGnEA,EAAM,QAAQ,CAACC,GAAIC,MAAM;AACvB,MAAAD,EAAG,aAAa,YAAYC,MAAMmB,IAAY,MAAM,IAAI;AAAA,IAC1D,CAAC,IAEDlB,IAAAH,EAAMqB,CAAS,MAAf,QAAAlB,EAAkB;AAAA,EACpB;AAAA;AAAA;AAAA,EAKQ,kBAAkBJ,GAAgB;AACxC,UAAMa,IAAOb,EAAE;AACf,IAAIa,EAAK,SAAS,eAChB,KAAK,eAAeA,EAAK,iBAAiB,EAAE,SAAS,GAAA,CAAM,EAAE,SAAS,IAExE,KAAK,oBAAA;AAAA,EACP;AAAA;AAAA,EAIS,SAAS;AAChB,UAAMU,IAAW,KAAK,aAAa,YAAY,KAAK,QAC9CC,IAAW,KAAK,aAAa,UAC7BC,IAAgBF,IAAW,kBAAkBC,IAAW,kBAAkB;AAEhF,WAAOE;AAAA;AAAA;AAAA;AAAA,qBAIU,KAAK,SAAS;AAAA;AAAA,4BAEP,KAAK,IAAI,UAAU,KAAK,OAAO,GAAGD,CAAa;AAAA;AAAA;AAAA,2CAGhC,KAAK,iBAAiB;AAAA;AAAA;AAAA,8BAGnC,KAAK,iBAAiB;AAAA;AAAA;AAAA,yCAGX,KAAK,iBAAiB;AAAA;AAAA,yEAEU,CAAC,KAAK,YAAY;AAAA,8CAC7C,KAAK,iBAAiB;AAAA;AAAA;AAAA;AAAA,EAIlE;AACF;AApQa3B,EACK,SAAS,CAACF,CAAoB;AAO9C+B,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,QAAQ,SAAS,IAAM,WAAW,WAAW;AAAA,GAPpD9B,EAQX,WAAA,QAAA,CAAA;AAOA6B,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,QAAQ,SAAS,IAAM;AAAA,GAd9B9B,EAeX,WAAA,WAAA,CAAA;AAWA6B,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,QAAQ,SAAS,IAAM;AAAA,GAzB9B9B,EA0BX,WAAA,YAAA,CAAA;AAQI6B,EAAA;AAAA,EADHC,EAAS,EAAE,MAAM,SAAS,SAAS,IAAM;AAAA,GAjC/B9B,EAkCP,WAAA,UAAA,CAAA;AAuBJ6B,EAAA;AAAA,EADCC,EAAS,EAAE,WAAW,aAAA,CAAc;AAAA,GAxD1B9B,EAyDX,WAAA,aAAA,CAAA;AASQ6B,EAAA;AAAA,EADPE,EAAA;AAAM,GAjEI/B,EAkEH,WAAA,gBAAA,CAAA;AAlEGA,IAAN6B,EAAA;AAAA,EADNG,EAAc,eAAe;AAAA,GACjBhC,CAAA;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"hx-alert-CHOjTBds.js","sources":["../../src/components/hx-alert/hx-alert.styles.ts","../../src/components/hx-alert/hx-alert.ts"],"sourcesContent":["import { css } from 'lit';\n\nexport const helixAlertStyles = css`\n :host {\n display: block;\n }\n\n :host(:not([open])) {\n display: none;\n }\n\n /* ─── Screen-reader-only announcement region ─── */\n /* Always present in DOM so AT registers it before content is injected. */\n /* Visually hidden via clip-path technique (superior to display:none which */\n /* removes the element from the AT tree entirely). */\n\n .sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n }\n\n * {\n box-sizing: border-box;\n }\n\n /* ─── Alert Container ─── */\n\n .alert {\n display: flex;\n align-items: flex-start;\n gap: var(--hx-alert-gap, var(--hx-space-3, 0.75rem));\n padding: var(--hx-alert-padding, var(--hx-space-4, 1rem));\n border: var(--hx-alert-border-width, var(--hx-border-width-thin, 1px)) solid\n var(--hx-alert-border-color, var(--hx-color-info-200, #b3d9ef));\n border-radius: var(--hx-alert-border-radius, var(--hx-border-radius-md, 0.375rem));\n background-color: var(--hx-alert-bg, var(--hx-color-info-50, #e8f4fd));\n color: var(--hx-alert-color, var(--hx-color-info-800, #1a3a4a));\n font-family: var(--hx-alert-font-family, var(--hx-font-family-sans, sans-serif));\n font-size: var(--hx-font-size-sm, 0.875rem);\n line-height: var(--hx-line-height-normal, 1.5);\n }\n\n /* ─── Accent Variant (left border stripe) ─── */\n /* Removes full border and replaces with a left-side accent stripe. */\n /* Common healthcare/enterprise dashboard pattern for dense information UIs. */\n\n .alert--accent {\n border-width: 0;\n border-inline-start: var(--hx-alert-accent-width, 4px) solid\n var(--hx-alert-border-color, var(--hx-color-info-200, #b3d9ef));\n border-radius: 0;\n }\n\n /* ─── Severity Label (WCAG 1.4.1) ─── */\n /* Visually hidden — provides a non-color cue for screen readers and users */\n /* who cannot distinguish variants by color alone (e.g. color-blind users). */\n /* Always present regardless of showIcon so severity is never color-only. */\n\n .alert__severity-label {\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 /* ─── Icon ─── */\n\n .alert__icon {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n color: var(--hx-alert-icon-color, var(--hx-color-info-500, #3b82f6));\n }\n\n .alert__icon svg {\n width: var(--hx-space-5, 1.25rem);\n height: var(--hx-space-5, 1.25rem);\n fill: currentColor;\n }\n\n /* ─── Title ─── */\n\n .alert__title {\n display: none;\n font-weight: var(--hx-font-weight-semibold, 600);\n margin-bottom: var(--hx-space-1, 0.25rem);\n }\n\n .alert__title--visible {\n display: block;\n }\n\n /* ─── Message ─── */\n\n .alert__message {\n flex: 1;\n min-width: 0;\n }\n\n /* ─── Actions ─── */\n /* Hidden by default; shown via JS slotchange detection to avoid invisible */\n /* margin-top spacing when no actions are slotted. */\n\n .alert__actions {\n display: none;\n align-items: center;\n gap: var(--hx-space-2, 0.5rem);\n margin-top: var(--hx-space-2, 0.5rem);\n }\n\n .alert__actions--visible {\n display: flex;\n }\n\n /* ─── Close Button ─── */\n /* Minimum 44px touch target per WCAG 2.5.8 (Target Size Minimum, AA) and */\n /* Apple HIG / Google Material guidelines. Uses absolute px units to ensure */\n /* the target size is independent of the consumer's base font size. */\n\n .alert__close-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n min-width: var(--hx-touch-target-size, 44px);\n min-height: var(--hx-touch-target-size, 44px);\n margin-inline-start: auto;\n padding: 0;\n border: none;\n border-radius: var(--hx-border-radius-sm, 0.25rem);\n background: transparent;\n color: var(--hx-alert-color, var(--hx-color-info-800, #1a3a4a));\n cursor: pointer;\n font-size: var(--hx-font-size-md, 1rem);\n line-height: 1;\n transition:\n background-color var(--hx-transition-fast, 150ms ease),\n opacity var(--hx-transition-fast, 150ms ease);\n opacity: var(--hx-opacity-75, 0.75);\n }\n\n .alert__close-button:hover {\n opacity: var(--hx-opacity-100, 1);\n /* color-mix() is supported in Chrome 111+, Firefox 113+, Safari 16.2+. */\n /* Falls back to transparent (no hover background) in older environments. */\n background-color: color-mix(in srgb, currentColor 10%, transparent);\n }\n\n .alert__close-button:focus-visible {\n outline: var(--hx-focus-ring-width, 2px) solid\n var(--hx-focus-ring-color, var(--hx-color-primary-400, #60a5fa));\n outline-offset: var(--hx-focus-ring-offset, 2px);\n opacity: 1;\n }\n\n .alert__close-button svg {\n width: var(--hx-space-4, 1rem);\n height: var(--hx-space-4, 1rem);\n fill: currentColor;\n }\n\n @media (prefers-reduced-motion: reduce) {\n .alert__close-button {\n transition: none;\n }\n }\n\n /* ─── Variant: info ─── */\n\n :host([variant='info']) .alert,\n :host(:not([variant])) .alert {\n --hx-alert-bg: var(--hx-color-info-50, #e8f4fd);\n --hx-alert-border-color: var(--hx-color-info-200, #b3d9ef);\n --hx-alert-color: var(--hx-color-info-800, #1a3a4a);\n --hx-alert-icon-color: var(--hx-color-info-500, #3b82f6);\n }\n\n /* ─── Variant: success ─── */\n\n :host([variant='success']) .alert {\n --hx-alert-bg: var(--hx-color-success-50, #ecfdf5);\n --hx-alert-border-color: var(--hx-color-success-200, #a7f3d0);\n --hx-alert-color: var(--hx-color-success-800, #065f46);\n --hx-alert-icon-color: var(--hx-color-success-500, #10b981);\n }\n\n /* ─── Variant: warning ─── */\n\n :host([variant='warning']) .alert {\n --hx-alert-bg: var(--hx-color-warning-50, #fffbeb);\n --hx-alert-border-color: var(--hx-color-warning-200, #fde68a);\n --hx-alert-color: var(--hx-color-warning-800, #92400e);\n --hx-alert-icon-color: var(--hx-color-warning-500, #f59e0b);\n }\n\n /* ─── Variant: error ─── */\n\n :host([variant='error']) .alert {\n --hx-alert-bg: var(--hx-color-error-50, #fef2f2);\n --hx-alert-border-color: var(--hx-color-error-200, #fecaca);\n --hx-alert-color: var(--hx-color-error-800, #991b1b);\n --hx-alert-icon-color: var(--hx-color-error-500, #ef4444);\n }\n`;\n","import { LitElement, html, nothing, type PropertyValues } from 'lit';\nimport '../../utilities/document-token-adoption.js';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { helixAlertStyles } from './hx-alert.styles.js';\n\n/** Alert variant determines visual styling and ARIA semantics. */\nexport type AlertVariant = 'info' | 'success' | 'warning' | 'error';\n\n/**\n * A feedback component for communicating status messages, warnings, and errors.\n * Critical for healthcare patient safety alerts.\n *\n * @summary Feedback alert for status messages with variant-based styling and ARIA live regions.\n *\n * @tag hx-alert\n *\n * @slot - Default slot for alert message content.\n * @slot title - Optional title/headline for the alert.\n * @slot icon - Custom icon to override the default variant icon.\n * @slot actions - Action buttons rendered within the alert.\n *\n * @attr {string} heading - Text used to build the close button's contextual aria-label\n * (e.g., \"Close Low blood pressure alert\"). When absent the label falls back to \"Close alert\".\n *\n * @fires {CustomEvent<{reason: string}>} hx-close - Dispatched when the user dismisses the alert.\n * @fires {CustomEvent} hx-after-close - Dispatched after the alert is dismissed.\n *\n * @csspart alert - The outer alert container.\n * @csspart title - The title/headline container.\n * @csspart icon - The icon container.\n * @csspart message - The message content area.\n * @csspart close-button - The dismiss button (only rendered when dismissible).\n * @csspart actions - The actions container.\n *\n * @cssprop [--hx-alert-bg=var(--hx-color-info-50)] - Alert background color.\n * @cssprop [--hx-alert-color=var(--hx-color-info-800)] - Alert text color.\n * @cssprop [--hx-alert-border-color=var(--hx-color-info-200)] - Alert border color.\n * @cssprop [--hx-alert-border-radius=var(--hx-border-radius-md)] - Alert border radius.\n * @cssprop [--hx-alert-border-width=var(--hx-border-width-thin)] - Alert border width.\n * @cssprop [--hx-alert-padding=var(--hx-space-4)] - Alert padding.\n * @cssprop [--hx-alert-gap=var(--hx-space-3)] - Gap between alert elements.\n * @cssprop [--hx-alert-icon-color=var(--hx-color-info-500)] - Alert icon color.\n * @cssprop [--hx-alert-font-family=var(--hx-font-family-sans)] - Alert font family.\n * @cssprop [--hx-touch-target-size=44px] - Minimum touch target size for the close button.\n * @cssprop [--hx-alert-accent-width=4px] - Width of the left border accent stripe.\n */\n@customElement('hx-alert')\nexport class HelixAlert extends LitElement {\n static override styles = [helixAlertStyles];\n\n // ─── Properties ───\n\n /**\n * Visual variant of the alert that determines colors and ARIA semantics.\n * @attr variant\n */\n @property({ type: String, reflect: true })\n variant: 'info' | 'success' | 'warning' | 'error' = 'info';\n\n /**\n * Whether the alert can be dismissed by the user.\n * @attr dismissible\n */\n @property({ type: Boolean, reflect: true })\n dismissible = false;\n\n /**\n * Optional heading text that provides context for the close button's accessible label.\n * When provided, the close button is announced as \"Close [heading] alert\".\n * When absent, the close button falls back to \"Close alert\".\n * @attr heading\n */\n @property({ type: String })\n heading = '';\n\n /**\n * Accessible label for the close button. Override for i18n.\n * @attr label-close\n */\n @property({ attribute: 'label-close' }) labelClose = 'Close alert';\n\n /**\n * Whether the alert is visible. Add the `open` attribute to show the alert.\n * @attr open\n */\n @property({ type: Boolean, reflect: true })\n open = false;\n\n /**\n * Whether to show the default variant icon. Add `show-icon` attribute to display the icon.\n * @attr show-icon\n */\n @property({ type: Boolean, reflect: true, attribute: 'show-icon' })\n showIcon = false;\n\n /**\n * When true, applies a left border accent stripe instead of a full border.\n * Common healthcare/enterprise dashboard pattern for visual distinction of alert types.\n * @attr accent\n */\n @property({ type: Boolean, reflect: true })\n accent = false;\n\n /**\n * Override for the severity prefix announced to screen readers (e.g., \"Info:\", \"Error:\").\n * When not set, defaults to the English label matching the current variant.\n * @attr severity-label\n */\n @property({ attribute: 'severity-label' })\n severityLabel: string | undefined;\n\n /**\n * CSS selector for the element to return focus to after the alert is dismissed.\n * When set, the component will find and focus the matching element after dismissal.\n * If not set, focus management is the caller's responsibility via the hx-after-close event.\n * @attr return-focus-to\n */\n @property({ type: String, attribute: 'return-focus-to' })\n returnFocusTo: string | null = null;\n\n // ─── State ───\n\n /** @internal */\n @state()\n private _hasActions = false;\n\n /** @internal */\n @state()\n private _hasTitle = false;\n\n // ─── Private Handler References ───\n\n /** @internal */\n private _actionsSlotChangeHandler: (() => void) | null = null;\n /** @internal */\n private _titleSlotChangeHandler: (() => void) | null = null;\n\n // ─── Private Helpers ───\n\n /** @internal */\n private _defaultSeverityLabel(): string {\n const labels: Record<string, string> = {\n info: 'Info:',\n success: 'Success:',\n warning: 'Warning:',\n error: 'Error:',\n };\n return labels[this.variant] ?? '';\n }\n\n /** @internal */\n private get _effectiveSeverityLabel(): string {\n return this.severityLabel ?? this._defaultSeverityLabel();\n }\n\n /** Returns true when the variant requires assertive announcement. */\n /** @internal */\n private get _isAssertive(): boolean {\n return this.variant === 'error';\n }\n\n /**\n * Returns the appropriate ARIA role based on variant.\n * role=\"alert\" implies aria-live=\"assertive\"; role=\"status\" implies aria-live=\"polite\".\n * We do NOT set aria-live explicitly to avoid double-announcements in JAWS.\n */\n /** @internal */\n private get _role(): string {\n return this._isAssertive ? 'alert' : 'status';\n }\n\n // ─── Lifecycle ───\n\n override connectedCallback(): void {\n super.connectedCallback();\n // Apply ARIA role to the host element for reliable screen reader support across\n // Shadow DOM boundaries. Placing role on a shadow-internal element has inconsistent\n // AT support in JAWS+Chrome and VoiceOver+Safari combinations (particularly pre-2024).\n this.setAttribute('role', this._role);\n if (!this.open) {\n this.setAttribute('aria-hidden', 'true');\n }\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n const actionsSlot = this.renderRoot.querySelector<HTMLSlotElement>('slot[name=\"actions\"]');\n if (actionsSlot && this._actionsSlotChangeHandler) {\n actionsSlot.removeEventListener('slotchange', this._actionsSlotChangeHandler);\n }\n const titleSlot = this.renderRoot.querySelector<HTMLSlotElement>('slot[name=\"title\"]');\n if (titleSlot && this._titleSlotChangeHandler) {\n titleSlot.removeEventListener('slotchange', this._titleSlotChangeHandler);\n }\n }\n\n override firstUpdated(): void {\n // Track actions slot content to avoid invisible spacing when no actions are slotted.\n const actionsSlot = this.renderRoot.querySelector<HTMLSlotElement>('slot[name=\"actions\"]');\n if (actionsSlot) {\n this._actionsSlotChangeHandler = () => {\n this._hasActions = actionsSlot.assignedNodes({ flatten: true }).length > 0;\n };\n actionsSlot.addEventListener('slotchange', this._actionsSlotChangeHandler);\n }\n\n // Track title slot content so the title container doesn't create dead space when empty.\n const titleSlot = this.renderRoot.querySelector<HTMLSlotElement>('slot[name=\"title\"]');\n if (titleSlot) {\n this._titleSlotChangeHandler = () => {\n this._hasTitle = titleSlot.assignedNodes({ flatten: true }).length > 0;\n };\n titleSlot.addEventListener('slotchange', this._titleSlotChangeHandler);\n }\n }\n\n protected override updated(changedProperties: PropertyValues<this>): void {\n super.updated(changedProperties);\n if (changedProperties.has('variant')) {\n // Keep host ARIA role in sync with variant (assertive vs. polite).\n this.setAttribute('role', this._role);\n }\n if (changedProperties.has('open')) {\n // Manage aria-hidden in addition to display:none for reliable AT exclusion.\n // When open transitions from false→true, removing aria-hidden signals to AT\n // that the live region content should be announced.\n if (this.open) {\n this.removeAttribute('aria-hidden');\n // Trigger announcement via the sr-only polite live region for ATs (JAWS+Chrome,\n // NVDA) that do not re-announce existing content when aria-hidden is merely removed.\n // We inject text after a microtask so the DOM has settled and the live region\n // is registered by the AT before content arrives.\n const previousOpen = changedProperties.get('open');\n if (previousOpen === false) {\n Promise.resolve().then(() => {\n const announcer = this.renderRoot.querySelector<HTMLElement>('.sr-only');\n if (announcer) {\n announcer.textContent = '';\n // Second microtask ensures the clear is processed before re-injection,\n // guaranteeing the AT sees a content change rather than no-op.\n Promise.resolve().then(() => {\n const prefix = this._effectiveSeverityLabel;\n const message = this.textContent?.trim() ?? '';\n announcer.textContent = prefix ? `${prefix} ${message}` : message;\n });\n }\n });\n }\n } else {\n this.setAttribute('aria-hidden', 'true');\n // Clear the announcer when hidden so stale text is not re-read on next open.\n const announcer = this.renderRoot.querySelector<HTMLElement>('.sr-only');\n if (announcer) {\n announcer.textContent = '';\n }\n }\n }\n }\n\n // ─── Default Icons ───\n\n /** @internal */\n private _renderInfoIcon() {\n return html`<svg viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n <path\n d=\"M10 2a8 8 0 100 16 8 8 0 000-16zm.75 4.75a.75.75 0 11-1.5 0 .75.75 0 011.5 0zM9.25 9a.75.75 0 011.5 0v4a.75.75 0 01-1.5 0V9z\"\n />\n </svg>`;\n }\n\n /** @internal */\n private _renderSuccessIcon() {\n return html`<svg viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n <path\n d=\"M10 2a8 8 0 100 16 8 8 0 000-16zm3.03 6.28a.75.75 0 00-1.06-1.06L9 10.19 7.78 8.97a.75.75 0 00-1.06 1.06l1.75 1.75a.75.75 0 001.06 0l3.5-3.5z\"\n />\n </svg>`;\n }\n\n /** @internal */\n private _renderWarningIcon() {\n return html`<svg viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n <path\n d=\"M8.49 2.92a1.75 1.75 0 013.02 0l6.25 10.83A1.75 1.75 0 0116.25 16H3.75a1.75 1.75 0 01-1.51-2.25L8.49 2.92zM10 7a.75.75 0 01.75.75v3a.75.75 0 01-1.5 0v-3A.75.75 0 0110 7zm0 7.5a.75.75 0 100-1.5.75.75 0 000 1.5z\"\n />\n </svg>`;\n }\n\n /** @internal */\n private _renderErrorIcon() {\n return html`<svg viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n <path\n d=\"M10 2a8 8 0 100 16 8 8 0 000-16zm-1.72 5.22a.75.75 0 011.06 0L10 7.94l.66-.72a.75.75 0 111.06 1.06L11.06 9l.66.72a.75.75 0 11-1.06 1.06L10 10.06l-.66.72a.75.75 0 01-1.06-1.06L8.94 9l-.66-.72a.75.75 0 010-1.06z\"\n />\n </svg>`;\n }\n\n /** @internal */\n private _renderDefaultIcon() {\n switch (this.variant) {\n case 'success':\n return this._renderSuccessIcon();\n case 'warning':\n return this._renderWarningIcon();\n case 'error':\n return this._renderErrorIcon();\n case 'info':\n default:\n return this._renderInfoIcon();\n }\n }\n\n /** @internal */\n private _renderCloseIcon() {\n return html`<svg viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n <path\n d=\"M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z\"\n />\n </svg>`;\n }\n\n // ─── Event Handling ───\n\n /** @internal */\n private _handleDismiss(): void {\n this.open = false;\n\n /**\n * Dispatched when the user dismisses the alert.\n * @event hx-close\n */\n this.dispatchEvent(\n new CustomEvent<{ reason: string }>('hx-close', {\n bubbles: true,\n composed: true,\n detail: { reason: 'user' },\n }),\n );\n\n /**\n * Dispatched after the alert is dismissed.\n * @event hx-after-close\n */\n this.dispatchEvent(\n new CustomEvent<void>('hx-after-close', {\n bubbles: true,\n composed: true,\n }),\n );\n\n // Return focus to a designated element if specified via returnFocusTo.\n if (this.returnFocusTo) {\n const target = document.querySelector(this.returnFocusTo);\n if (target instanceof HTMLElement) {\n target.focus();\n }\n }\n }\n\n // ─── Render ───\n\n override render() {\n const classes = {\n alert: true,\n [`alert--${this.variant}`]: true,\n 'alert--accent': this.accent,\n };\n\n // WCAG 1.4.1: Always render a visually-hidden severity label so the variant\n // is never conveyed by color alone, regardless of whether showIcon is set.\n const severityLabel = this._effectiveSeverityLabel;\n\n return html`\n <div\n class=\"sr-only\"\n aria-live=${this._isAssertive ? 'assertive' : 'polite'}\n aria-atomic=\"true\"\n ></div>\n <div part=\"alert\" class=${classMap(classes)}>\n <span class=\"alert__severity-label\">${severityLabel}</span>\n ${this.showIcon\n ? html`\n <div part=\"icon\" class=\"alert__icon\">\n <slot name=\"icon\">${this._renderDefaultIcon()}</slot>\n </div>\n `\n : nothing}\n\n <div part=\"message\" class=\"alert__message\">\n <div part=\"title\" class=\"alert__title ${this._hasTitle ? 'alert__title--visible' : ''}\">\n <slot name=\"title\"></slot>\n </div>\n <slot></slot>\n <div\n part=\"actions\"\n class=\"alert__actions ${this._hasActions ? 'alert__actions--visible' : ''}\"\n >\n <slot name=\"actions\"></slot>\n </div>\n </div>\n\n ${this.dismissible\n ? html`\n <button\n part=\"close-button\"\n class=\"alert__close-button\"\n aria-label=${this.labelClose}\n @click=${this._handleDismiss}\n >\n ${this._renderCloseIcon()}\n </button>\n `\n : nothing}\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'hx-alert': HelixAlert;\n }\n}\n\nexport type { HelixAlert as HxAlert };\n"],"names":["helixAlertStyles","css","HelixAlert","LitElement","actionsSlot","titleSlot","changedProperties","announcer","prefix","message","_a","html","target","classes","severityLabel","classMap","nothing","__decorateClass","property","state","customElement"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"hx-avatar-an-WsuLl.js","sources":["../../src/components/hx-avatar/hx-avatar.styles.ts","../../src/components/hx-avatar/hx-avatar.ts"],"sourcesContent":["import { css } from 'lit';\n\nexport const helixAvatarStyles = css`\n :host {\n display: inline-block;\n }\n\n /* P2-5: Respect the HTML hidden attribute — custom elements with explicit display ignore it otherwise. */\n :host([hidden]) {\n display: none !important;\n }\n\n /* P0-2: Wrapper provides the positioning context for the badge slot, outside overflow: hidden. */\n .avatar-wrapper {\n position: relative;\n display: inline-flex;\n }\n\n .avatar {\n display: flex;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n width: var(--hx-avatar-size);\n height: var(--hx-avatar-size);\n background-color: var(--hx-avatar-bg, var(--hx-color-primary-100));\n color: var(--hx-avatar-color, var(--hx-color-primary-700));\n border-radius: var(--hx-avatar-border-radius);\n flex-shrink: 0;\n }\n\n /* ─── Size Variants ─── */\n\n .avatar--xs {\n --hx-avatar-size: var(--hx-size-6, 1.5rem);\n --hx-avatar-font-size: var(--hx-font-size-2xs, 0.625rem);\n }\n\n .avatar--sm {\n --hx-avatar-size: var(--hx-size-8, 2rem);\n --hx-avatar-font-size: var(--hx-font-size-xs, 0.75rem);\n }\n\n .avatar--md {\n --hx-avatar-size: var(--hx-size-10, 2.5rem);\n --hx-avatar-font-size: var(--hx-font-size-sm, 0.875rem);\n }\n\n .avatar--lg {\n --hx-avatar-size: var(--hx-size-12, 3rem);\n --hx-avatar-font-size: var(--hx-font-size-md, 1rem);\n }\n\n .avatar--xl {\n --hx-avatar-size: var(--hx-size-16, 4rem);\n --hx-avatar-font-size: var(--hx-font-size-lg, 1.125rem);\n }\n\n /* ─── Shape Variants ─── */\n\n .avatar--circle {\n --hx-avatar-border-radius: 50%;\n }\n\n .avatar--square {\n --hx-avatar-border-radius: var(--hx-border-radius-md, 0.375rem);\n }\n\n /* ─── Image ─── */\n\n .avatar__image {\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n }\n\n /* ─── Initials ─── */\n\n .avatar__initials {\n font-family: var(--hx-font-family-sans, sans-serif);\n font-size: var(--hx-avatar-font-size);\n font-weight: var(--hx-font-weight-semibold, 600);\n line-height: 1;\n text-transform: uppercase;\n letter-spacing: var(--hx-letter-spacing-wide, 0.025em);\n user-select: none;\n }\n\n /* ─── Fallback Icon ─── */\n\n .avatar__fallback-icon {\n width: 60%;\n height: 60%;\n color: var(--hx-avatar-color, var(--hx-color-primary-700));\n }\n\n /* ─── Badge Slot ─── */\n\n /* P0-2: Positioned relative to .avatar-wrapper — outside the overflow: hidden on .avatar. */\n .avatar__badge {\n position: absolute;\n bottom: 0;\n right: 0;\n }\n\n /* P2-2: Hide the badge wrapper when no slot content is present, preserving slotchange detection. */\n .avatar__badge--hidden {\n display: none;\n }\n\n /* P1-B: Windows High Contrast Mode — avatar background is stripped by the system,\n leaving no visual boundary. Restore a visible border, explicit foreground, and\n background so the avatar container, initials, and fallback icon all remain\n perceivable at any contrast level.\n WCAG 1.4.11 Non-text Contrast (Level AA). */\n @media (forced-colors: active) {\n .avatar {\n forced-color-adjust: none;\n border: 2px solid ButtonText;\n background-color: Canvas;\n color: CanvasText;\n }\n\n .avatar__initials {\n color: CanvasText;\n }\n\n .avatar__fallback-icon {\n color: CanvasText;\n }\n\n .avatar__image {\n forced-color-adjust: auto;\n }\n }\n`;\n","import { LitElement, html, nothing, type PropertyValues } from 'lit';\nimport '../../utilities/document-token-adoption.js';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { helixAvatarStyles } from './hx-avatar.styles.js';\nimport { devWarn } from '../../utils/dev-warn.js';\n\n/**\n * A user avatar component that displays an image, initials, or a fallback icon.\n * Supports a badge slot for status indicator overlays.\n *\n * @summary User avatar with image, initials, and fallback icon support for healthcare applications.\n *\n * @tag hx-avatar\n *\n * @slot - Default slot for custom avatar content. Overrides src and initials when slotted content is present.\n * @slot badge - Status indicator overlay, positioned at the bottom-right of the avatar container.\n *\n * @csspart avatar - The outer container element.\n * @csspart image - The img element shown when src is provided.\n * @csspart initials - The initials text span shown as a fallback.\n * @csspart fallback-icon - The SVG person silhouette shown when no src or initials are available.\n * @csspart badge - The badge slot container.\n *\n * @cssprop [--hx-avatar-size] - Computed width and height from the size variant.\n * @cssprop [--hx-avatar-border-radius] - Circle = 50%, Square = var(--hx-border-radius-md).\n * @cssprop [--hx-avatar-bg=var(--hx-color-primary-100)] - Background color of the avatar container.\n * @cssprop [--hx-avatar-color=var(--hx-color-primary-700)] - Text and icon color inside the avatar.\n * @cssprop [--hx-avatar-font-size] - Font size for the initials text, set per size variant.\n */\n@customElement('hx-avatar')\nexport class HelixAvatar extends LitElement {\n static override styles = [helixAvatarStyles];\n\n /**\n * Image URL. When provided and successfully loaded, displays the image.\n * @attr src\n */\n @property({ type: String })\n src: string | undefined = undefined;\n\n /**\n * Accessible label for the image. Required when `src` is provided.\n * Used as the container's aria-label in image mode.\n * @attr alt\n */\n @property({ type: String })\n alt = '';\n\n /**\n * Human-readable accessible name for non-image states (initials, fallback icon).\n * In healthcare contexts, provide the full person name (e.g., \"Dr. Jane Doe\") rather than\n * relying on raw initials, which screen readers announce as individual letters.\n * When set, takes precedence over raw initials and the generic \"Avatar\" fallback.\n * @attr label\n */\n @property({ type: String })\n label = '';\n\n /**\n * Fallback initials text displayed when no image is available.\n * @attr initials\n */\n @property({ type: String })\n initials = '';\n\n /**\n * Size variant of the avatar.\n * @attr hx-size\n */\n @property({ type: String, reflect: true, attribute: 'hx-size' })\n size: 'xs' | 'sm' | 'md' | 'lg' | 'xl' = 'md';\n\n /**\n * Shape variant of the avatar.\n * @attr shape\n */\n @property({ type: String, reflect: true })\n shape: 'circle' | 'square' = 'circle';\n\n /**\n * Tracks whether the image failed to load, triggering the fallback chain.\n * @internal\n */\n @state()\n private _imgError = false;\n\n /**\n * Tracks whether the default slot has assigned content.\n * @internal\n */\n @state()\n private _hasDefaultSlot = false;\n\n /**\n * Tracks whether the badge slot has assigned content.\n * @internal\n */\n @state()\n private _hasBadgeSlot = false;\n\n // ─── Lifecycle ───\n\n // P1-A / P2-B: Use willUpdate() instead of updated() for property validation\n // and derived state. willUpdate() runs before render() and does not schedule\n // a second update cycle when @state() properties are mutated.\n override willUpdate(changedProperties: PropertyValues<this>): void {\n // P0-1: Reset image error state when src changes so a new valid src renders correctly.\n if (changedProperties.has('src')) {\n this._imgError = false;\n }\n\n // P1-2: Warn when src is provided without alt — silent accessibility failure in healthcare UIs.\n if (changedProperties.has('src') || changedProperties.has('alt')) {\n if (this.src && !this.alt) {\n devWarn(\n 'hx-avatar',\n 'Accessibility: \"alt\" attribute is required when \"src\" is provided. ' +\n 'Without alt text, screen readers announce a non-descriptive label. ' +\n 'Add alt=\"Full name or description\" to your hx-avatar element.',\n );\n }\n }\n\n // P2-A: Warn when initials are used without label — screen readers announce\n // raw initials as individual letters (e.g., \"J D\") instead of a name.\n if (changedProperties.has('initials') || changedProperties.has('label')) {\n if (this.initials && !this.label) {\n devWarn(\n 'hx-avatar',\n 'Accessibility: \"label\" attribute is recommended when \"initials\" is provided. ' +\n 'Without label, screen readers announce raw initials as individual letters. ' +\n 'Add label=\"Full Name\" to your hx-avatar element.',\n );\n }\n }\n\n // P2-1: Warn when invalid size or shape attribute values are used (e.g., from Twig templates).\n const validSizes: ReadonlyArray<string> = ['xs', 'sm', 'md', 'lg', 'xl'];\n if (changedProperties.has('size') && !validSizes.includes(this.size)) {\n devWarn(\n 'hx-avatar',\n `Invalid hx-size=\"${String(this.size)}\". Valid values: xs, sm, md, lg, xl. Rendering with \"md\".`,\n );\n }\n const validShapes: ReadonlyArray<string> = ['circle', 'square'];\n if (changedProperties.has('shape') && !validShapes.includes(this.shape)) {\n devWarn(\n 'hx-avatar',\n `Invalid shape=\"${String(this.shape)}\". Valid values: circle, square. Rendering with \"circle\".`,\n );\n }\n }\n\n // ─── Slot Change Handling ───\n\n /** @internal */\n private _handleSlotChange(e: Event): void {\n const slot = e.target as HTMLSlotElement;\n const nodes = slot.assignedNodes({ flatten: true });\n this._hasDefaultSlot = nodes.some((node) => {\n if (node.nodeType === Node.ELEMENT_NODE) return true;\n if (node.nodeType === Node.TEXT_NODE) {\n return (node.textContent ?? '').trim().length > 0;\n }\n return false;\n });\n }\n\n /** @internal */\n private _handleBadgeSlotChange(e: Event): void {\n const slot = e.target as HTMLSlotElement;\n const nodes = slot.assignedNodes({ flatten: true });\n this._hasBadgeSlot = nodes.some((node) => {\n if (node.nodeType === Node.ELEMENT_NODE) return true;\n if (node.nodeType === Node.TEXT_NODE) {\n return (node.textContent ?? '').trim().length > 0;\n }\n return false;\n });\n\n // P2-C: Warn when badge slot content lacks an accessible name.\n // A plain <span class=\"dot\"></span> badge is invisible to screen readers.\n if (this._hasBadgeSlot) {\n const hasAccessibleName = nodes.some((node) => {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const el = node as Element;\n return (\n el.hasAttribute('aria-label') ||\n el.hasAttribute('aria-labelledby') ||\n !!el.getAttribute('role')\n );\n }\n return false;\n });\n if (!hasAccessibleName) {\n devWarn(\n 'hx-avatar',\n 'Accessibility: badge slot content should have an accessible name ' +\n '(aria-label, role, etc.). Without it, the badge is invisible to screen readers.',\n );\n }\n }\n }\n\n // ─── Image Error Handling ───\n\n /** @internal */\n private _handleImgError(): void {\n this._imgError = true;\n }\n\n // ─── Fallback Icon ───\n\n /** @internal */\n private _renderFallbackIcon() {\n return html`\n <svg\n part=\"fallback-icon\"\n class=\"avatar__fallback-icon\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n fill=\"currentColor\"\n >\n <path\n d=\"M12 12c2.7 0 4.8-2.1 4.8-4.8S14.7 2.4 12 2.4 7.2 4.5 7.2 7.2 9.3 12 12 12zm0 2.4c-3.2 0-9.6 1.6-9.6 4.8v2.4h19.2v-2.4c0-3.2-6.4-4.8-9.6-4.8z\"\n />\n </svg>\n `;\n }\n\n // ─── Render ───\n\n override render() {\n const src = this.src;\n const showSlot = this._hasDefaultSlot;\n const showImage = !showSlot && !!src && !this._imgError;\n const showInitials = !showSlot && !showImage && !!this.initials.trim();\n const showFallback = !showSlot && !showImage && !showInitials;\n\n // P1-1 / P1-7: Use label property for human-readable accessible name in non-image states.\n const ariaLabel = showImage\n ? this.alt || this.label || 'Avatar'\n : showInitials\n ? this.label || this.initials\n : this.label || 'Avatar';\n\n // P2-1: Safe class fallback for invalid attribute values supplied via HTML/Twig.\n const validSizes: ReadonlyArray<string> = ['xs', 'sm', 'md', 'lg', 'xl'];\n const validShapes: ReadonlyArray<string> = ['circle', 'square'];\n const sizeClass = validSizes.includes(this.size) ? this.size : 'md';\n const shapeClass = validShapes.includes(this.shape) ? this.shape : 'circle';\n\n const classes = {\n avatar: true,\n [`avatar--${sizeClass}`]: true,\n [`avatar--${shapeClass}`]: true,\n };\n\n // P2-2: Badge wrapper is hidden (not removed) when empty so slotchange detection still works.\n const badgeClasses = {\n avatar__badge: true,\n 'avatar__badge--hidden': !this._hasBadgeSlot,\n };\n\n return html`\n <div class=\"avatar-wrapper\">\n <div\n part=\"avatar\"\n class=${classMap(classes)}\n role=${showSlot ? nothing : 'img'}\n aria-label=${showSlot ? nothing : ariaLabel}\n >\n <slot @slotchange=${this._handleSlotChange}></slot>\n ${showImage && src\n ? html`<img\n part=\"image\"\n class=\"avatar__image\"\n src=${src}\n alt=${this.alt}\n aria-hidden=\"true\"\n loading=\"lazy\"\n @error=${this._handleImgError}\n />`\n : nothing}\n ${showInitials\n ? html`<span part=\"initials\" class=\"avatar__initials\">${this.initials.trim()}</span>`\n : nothing}\n ${showFallback ? this._renderFallbackIcon() : nothing}\n </div>\n <span part=\"badge\" class=${classMap(badgeClasses)}>\n <slot name=\"badge\" @slotchange=${this._handleBadgeSlotChange}></slot>\n </span>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'hx-avatar': HelixAvatar;\n }\n}\n"],"names":["helixAvatarStyles","css","HelixAvatar","LitElement","changedProperties","validSizes","devWarn","validShapes","e","nodes","node","el","html","src","showSlot","showImage","showInitials","showFallback","ariaLabel","sizeClass","shapeClass","classes","badgeClasses","classMap","nothing","__decorateClass","property","state","customElement"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"hx-badge-DDXTLoWi.js","sources":["../../src/components/hx-badge/hx-badge.styles.ts","../../src/components/hx-badge/hx-badge.ts"],"sourcesContent":["import { css } from 'lit';\n\nexport const helixBadgeStyles = css`\n :host {\n display: inline-block;\n }\n\n .badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--hx-space-1, 0.25rem);\n border-radius: var(--hx-badge-border-radius, var(--hx-border-radius-md, 0.375rem));\n background-color: var(--hx-badge-bg, var(--hx-color-primary-500, #2563eb));\n color: var(--hx-badge-color, var(--hx-color-neutral-0, #ffffff));\n font-family: var(--hx-badge-font-family, var(--hx-font-family-sans, sans-serif));\n font-weight: var(--hx-badge-font-weight, var(--hx-font-weight-semibold, 600));\n line-height: var(--hx-line-height-tight, 1.25);\n white-space: nowrap;\n vertical-align: middle;\n position: relative;\n }\n\n /* ─── Size Variants ─── */\n\n .badge--sm {\n font-size: var(--hx-badge-font-size, var(--hx-font-size-2xs, 0.625rem));\n padding: var(--hx-badge-padding-y, var(--hx-space-0-5, 0.125rem))\n var(--hx-badge-padding-x, var(--hx-space-1-5, 0.375rem));\n }\n\n .badge--md {\n font-size: var(--hx-badge-font-size, var(--hx-font-size-xs, 0.75rem));\n padding: var(--hx-badge-padding-y, var(--hx-space-1, 0.25rem))\n var(--hx-badge-padding-x, var(--hx-space-2, 0.5rem));\n }\n\n .badge--lg {\n font-size: var(--hx-badge-font-size, var(--hx-font-size-sm, 0.875rem));\n padding: var(--hx-badge-padding-y, var(--hx-space-1, 0.25rem))\n var(--hx-badge-padding-x, var(--hx-space-3, 0.75rem));\n }\n\n /* ─── Style Variants ─── */\n\n .badge--primary {\n --hx-badge-bg: var(--hx-color-primary-500, #2563eb);\n --hx-badge-color: var(--hx-color-neutral-0, #ffffff);\n --hx-badge-pulse-color: var(--hx-color-primary-500, #2563eb);\n }\n\n .badge--secondary {\n --hx-badge-bg: var(--hx-badge-secondary-bg, var(--hx-color-neutral-100, #f3f4f6));\n --hx-badge-color: var(--hx-badge-secondary-color, var(--hx-color-neutral-700, #374151));\n --hx-badge-pulse-color: var(--hx-badge-secondary-bg, var(--hx-color-neutral-100, #f3f4f6));\n }\n\n .badge--success {\n --hx-badge-bg: var(--hx-color-success-700, #15803d);\n --hx-badge-color: var(--hx-color-neutral-0, #ffffff);\n --hx-badge-pulse-color: var(--hx-color-success-700, #15803d);\n }\n\n .badge--warning {\n --hx-badge-bg: var(--hx-color-warning-500, #eab308);\n --hx-badge-color: var(--hx-color-neutral-900, #1a1a1a);\n --hx-badge-pulse-color: var(--hx-color-warning-500, #eab308);\n }\n\n .badge--error {\n --hx-badge-bg: var(--hx-color-error-500, #dc2626);\n --hx-badge-color: var(--hx-color-neutral-0, #ffffff);\n --hx-badge-pulse-color: var(--hx-color-error-500, #dc2626);\n }\n\n .badge--neutral {\n --hx-badge-bg: var(--hx-color-neutral-200, #e5e7eb);\n --hx-badge-color: var(--hx-color-neutral-700, #374151);\n --hx-badge-pulse-color: var(--hx-color-neutral-200, #e5e7eb);\n }\n\n .badge--info {\n --hx-badge-bg: var(--hx-badge-info-bg, var(--hx-color-info-700, #0369a1));\n --hx-badge-color: var(--hx-badge-info-color, var(--hx-color-neutral-0, #ffffff));\n --hx-badge-pulse-color: var(--hx-badge-info-bg, var(--hx-color-info-700, #0369a1));\n }\n\n /* ─── Semantic Variant Label (WCAG 1.4.1) ─── */\n /* Visually hidden text prefix for semantic variants (success/warning/error/info). */\n /* Ensures the variant is not conveyed by color alone. */\n\n .badge__variant-label {\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 /* ─── Pill Mode ─── */\n\n .badge--pill {\n border-radius: var(--hx-badge-border-radius, var(--hx-border-radius-full, 9999px));\n }\n\n /* ─── Dot Indicator (empty + pulse) ─── */\n\n .badge--dot {\n width: var(--hx-badge-dot-size, var(--hx-space-2, 0.5rem));\n height: var(--hx-badge-dot-size, var(--hx-space-2, 0.5rem));\n padding: 0;\n border-radius: var(--hx-border-radius-full, 9999px);\n }\n\n /* Guard: hide prefix slot and slotted content in dot mode to prevent overflow */\n .badge--dot ::slotted(*) {\n display: none;\n }\n\n .badge--dot slot[name='prefix'] {\n display: none;\n }\n\n /* ─── Pulse Animation ─── */\n\n @keyframes hx-badge-pulse {\n 0%,\n 100% {\n opacity: 1;\n box-shadow: 0 0 0 2px var(--hx-badge-pulse-color, currentColor);\n }\n 50% {\n opacity: var(--hx-opacity-75, 0.75);\n box-shadow: 0 0 0 6px transparent;\n }\n }\n\n .badge--pulse {\n animation: hx-badge-pulse var(--hx-badge-pulse-duration, var(--hx-duration-slow, 2s))\n var(--hx-badge-pulse-easing, var(--hx-easing-in-out, ease-in-out)) infinite;\n }\n\n @media (prefers-reduced-motion: reduce) {\n .badge--pulse {\n animation: none;\n }\n }\n\n /* ─── Remove Button ─── */\n\n .badge__remove-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n background: none;\n border: none;\n padding: 0;\n margin-inline-start: var(--hx-space-1, 0.25rem);\n cursor: pointer;\n color: inherit;\n opacity: var(--hx-opacity-75, 0.75);\n border-radius: var(--hx-border-radius-sm, 0.125rem);\n line-height: 0;\n /* WCAG 2.5.5: minimum 44×44px touch target */\n min-width: var(--hx-touch-target-min, 2.75rem);\n min-height: var(--hx-touch-target-min, 2.75rem);\n }\n\n .badge__remove-button:hover {\n opacity: var(--hx-opacity-100, 1);\n }\n\n .badge__remove-button:focus-visible {\n outline: var(--hx-focus-ring-width, 2px) solid var(--hx-focus-ring-color, currentColor);\n outline-offset: var(--hx-focus-ring-offset, 1px);\n }\n`;\n","import { LitElement, html, nothing } from 'lit';\nimport '../../utilities/document-token-adoption.js';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { helixBadgeStyles } from './hx-badge.styles.js';\nimport { devWarn } from '../../utils/dev-warn.js';\n\n/**\n * A small status indicator for notifications, counts, and labels.\n *\n * @summary Presentational badge for status indicators, notification counts, and labels.\n *\n * @tag hx-badge\n *\n * @slot - Default slot for badge content (text, number). When empty with pulse enabled, renders as a dot indicator.\n * @slot prefix - Icon or content rendered before the badge text.\n *\n * @fires {CustomEvent<void>} hx-remove - Dispatched when the user clicks the remove button.\n *\n * @csspart badge - The badge element.\n * @csspart remove-button - The remove/dismiss button.\n *\n * @cssprop [--hx-badge-bg=var(--hx-color-primary-500)] - Badge background color. The primary override point.\n * @cssprop [--hx-badge-color=var(--hx-color-neutral-0)] - Badge text color. The primary override point.\n * @cssprop [--hx-badge-font-size] - Badge font size (set per size variant).\n * @cssprop [--hx-badge-font-weight=var(--hx-font-weight-semibold)] - Badge font weight.\n * @cssprop [--hx-badge-font-family=var(--hx-font-family-sans)] - Badge font family.\n * @cssprop [--hx-badge-border-radius=var(--hx-border-radius-md)] - Badge border radius.\n * @cssprop [--hx-badge-padding-x] - Badge horizontal padding (set per size variant).\n * @cssprop [--hx-badge-padding-y] - Badge vertical padding (set per size variant).\n * @cssprop [--hx-badge-pulse-color] - Pulse color matching variant background with reduced opacity.\n * @cssprop [--hx-badge-dot-size=var(--hx-size-2)] - Dot indicator size when rendered without content.\n * @cssprop [--hx-badge-secondary-bg=var(--hx-color-neutral-100)] - Background for the secondary variant.\n * @cssprop [--hx-badge-secondary-color=var(--hx-color-neutral-700)] - Text color for the secondary variant.\n * @cssprop [--hx-badge-info-bg=var(--hx-color-info-700)] - Background for the info variant.\n * @cssprop [--hx-badge-info-color=var(--hx-color-neutral-0)] - Text color for the info variant.\n */\n@customElement('hx-badge')\nexport class HelixBadge extends LitElement {\n static override styles = [helixBadgeStyles];\n\n /**\n * Visual style variant of the badge.\n * @attr variant\n */\n @property({ type: String, reflect: true })\n variant: 'primary' | 'secondary' | 'success' | 'warning' | 'error' | 'neutral' | 'info' =\n 'primary';\n\n /**\n * Size of the badge.\n * @attr hx-size\n */\n @property({ type: String, reflect: true, attribute: 'hx-size' })\n size: 'sm' | 'md' | 'lg' = 'md';\n\n /**\n * Whether the badge uses fully rounded (pill) styling.\n * @attr pill\n */\n @property({ type: Boolean, reflect: true })\n pill = false;\n\n /**\n * Whether the badge displays an animated pulse for attention.\n * @attr pulse\n */\n @property({ type: Boolean, reflect: true })\n pulse = false;\n\n /**\n * Whether the badge renders a dismiss button.\n * @attr removable\n */\n @property({ type: Boolean, reflect: true })\n removable = false;\n\n /**\n * Numeric count to display. When set, renders the count as badge content.\n * When count exceeds `max`, displays `${max}+` (e.g. `99+`).\n * @attr count\n */\n @property({ type: Number, reflect: true })\n count: number | undefined = undefined;\n\n /**\n * Maximum count value before truncation to `${max}+`. Defaults to 99.\n * @attr max\n */\n @property({ type: Number, reflect: true })\n max = 99;\n\n /**\n * Accessible label for the dot indicator mode (pulse + empty slot).\n * Required for WCAG 4.1.2 compliance when using the dot indicator pattern.\n * Example: `dot-label=\"3 new messages\"`.\n * @attr dot-label\n */\n @property({ type: String, attribute: 'dot-label' })\n dotLabel = '';\n\n /**\n * Accessible label for the remove button. Should describe what is being removed.\n * Defaults to \"Remove\". For better accessibility, include context: e.g. \"Remove Critical badge\".\n * @attr remove-label\n */\n @property({ type: String, attribute: 'remove-label' })\n removeLabel = 'Remove';\n\n /**\n * Tracks whether the default slot has assigned content.\n * @internal\n */\n @state()\n private _hasSlotContent = false;\n\n // ─── Lifecycle ───\n\n override connectedCallback(): void {\n super.connectedCallback();\n // Backward compat: accept legacy `size` attribute. When present and `hx-size`\n // is not set, map the value and emit a deprecation warning.\n const legacySize = this.getAttribute('size');\n if (legacySize !== null && !this.hasAttribute('hx-size')) {\n devWarn('hx-badge', 'The \"size\" attribute is deprecated. Use \"hx-size\" instead.');\n this.size = legacySize as 'sm' | 'md' | 'lg';\n }\n }\n\n // ─── Slot Change Handling ───\n\n /** @internal */\n private _handleSlotChange(e: Event): void {\n const slot = e.target as HTMLSlotElement;\n const nodes = slot.assignedNodes({ flatten: true });\n // Check if any assigned node has non-whitespace content\n this._hasSlotContent = nodes.some((node) => {\n if (node.nodeType === Node.ELEMENT_NODE) return true;\n if (node.nodeType === Node.TEXT_NODE) {\n return (node.textContent ?? '').trim().length > 0;\n }\n return false;\n });\n }\n\n // ─── Event Handling ───\n\n /** @internal */\n private _handleRemove(): void {\n this.dispatchEvent(\n new CustomEvent<void>('hx-remove', {\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n // ─── Count Display ───\n\n /** @internal */\n private get _countDisplay(): string {\n if (this.count === undefined) return '';\n return this.count > this.max ? `${this.max}+` : String(this.count);\n }\n\n // ─── WCAG 1.4.1: Semantic variant label map ───\n // Variants that carry semantic meaning beyond decoration need a non-color cue.\n // Visually-hidden text is prepended so screen reader users and color-blind\n // users get the variant context even when no icon is slotted.\n\n /** @internal */\n private static readonly _SEMANTIC_VARIANT_LABELS: Partial<Record<HelixBadge['variant'], string>> =\n {\n success: 'Success',\n warning: 'Warning',\n error: 'Error',\n info: 'Info',\n };\n\n /** @internal */\n private get _semanticVariantLabel(): string {\n return HelixBadge._SEMANTIC_VARIANT_LABELS[this.variant] ?? '';\n }\n\n // ─── Render ───\n\n override render() {\n const hasCount = this.count !== undefined;\n const isDot = !this._hasSlotContent && !hasCount && this.pulse;\n\n if (isDot && !this.dotLabel) {\n devWarn(\n 'hx-badge',\n 'Dot badge is missing an accessible label. Set `dotLabel` so screen readers can announce the badge purpose (WCAG 4.1.2).',\n );\n }\n\n const classes = {\n badge: true,\n [`badge--${this.variant}`]: true,\n [`badge--${this.size}`]: true,\n 'badge--pill': this.pill,\n 'badge--pulse': this.pulse,\n 'badge--dot': isDot,\n };\n\n const variantLabel = this._semanticVariantLabel;\n\n return html`\n <span\n part=\"badge\"\n class=${classMap(classes)}\n role=${isDot && this.dotLabel ? 'img' : nothing}\n aria-label=${isDot && this.dotLabel ? this.dotLabel : nothing}\n aria-live=${hasCount ? 'polite' : nothing}\n >\n ${variantLabel\n ? html`<span class=\"badge__variant-label\">${variantLabel}: </span>`\n : nothing}\n ${isDot ? nothing : html`<slot name=\"prefix\"></slot>`}\n ${hasCount ? this._countDisplay : html`<slot @slotchange=${this._handleSlotChange}></slot>`}\n ${this.removable\n ? html`<button\n part=\"remove-button\"\n class=\"badge__remove-button\"\n aria-label=${this.removeLabel}\n @click=${this._handleRemove}\n >\n <svg viewBox=\"0 0 12 12\" aria-hidden=\"true\" width=\"10\" height=\"10\">\n <path\n d=\"M2.22 2.22a.75.75 0 011.06 0L6 4.94l2.72-2.72a.75.75 0 011.06 1.06L7.06 6l2.72 2.72a.75.75 0 01-1.06 1.06L6 7.06 3.28 9.78a.75.75 0 01-1.06-1.06L4.94 6 2.22 3.28a.75.75 0 010-1.06z\"\n fill=\"currentColor\"\n />\n </svg>\n </button>`\n : nothing}\n </span>\n `;\n }\n}\n\n/**\n * @deprecated Use `HelixBadge` instead. This alias will be removed in a future\n * major version as part of the project-wide migration from `Wc` to `Hx` prefixes.\n * @since 0.1.0\n * @removal-target 1.0.0\n */\nexport type WcBadge = HelixBadge;\n\n/** Canonical type alias for the hx-badge component. */\nexport type HxBadge = HelixBadge;\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'hx-badge': HelixBadge;\n }\n}\n"],"names":["helixBadgeStyles","css","HelixBadge","LitElement","legacySize","e","nodes","node","hasCount","isDot","classes","variantLabel","html","classMap","nothing","__decorateClass","property","state","customElement"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"hx-banner-B-WEDiq7.js","sources":["../../src/components/hx-banner/hx-banner.styles.ts","../../src/components/hx-banner/hx-banner.ts"],"sourcesContent":["import { css } from 'lit';\n\nexport const helixBannerStyles = css`\n :host {\n display: block;\n width: 100%;\n position: var(--hx-banner-position, sticky);\n top: 0;\n left: 0;\n right: 0;\n z-index: var(--hx-banner-z-index, 100);\n }\n\n :host(:not([open])) {\n display: none;\n }\n\n * {\n box-sizing: border-box;\n }\n\n /* ─── Severity Label (WCAG 1.4.1) ─── */\n /* Visually hidden — ensures variant is never conveyed by color alone. */\n /* Always rendered so screen readers can identify the banner severity. */\n\n .banner__severity-label {\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 /* ─── Banner Container ─── */\n\n .banner {\n display: flex;\n align-items: center;\n gap: var(--hx-banner-gap, var(--hx-space-3, 0.75rem));\n padding: var(--hx-banner-padding, var(--hx-space-3, 0.75rem) var(--hx-space-4, 1rem));\n background-color: var(--hx-banner-bg, var(--hx-color-info-50, #e8f4fd));\n color: var(--hx-banner-color, var(--hx-color-info-800, #1a3a4a));\n border-bottom: var(--hx-banner-border-width, var(--hx-border-width-thin, 1px)) solid\n var(--hx-banner-border-color, var(--hx-color-info-200, #b3d9ef));\n font-family: var(--hx-banner-font-family, var(--hx-font-family-sans, sans-serif));\n font-size: var(--hx-font-size-sm, 0.875rem);\n line-height: var(--hx-line-height-normal, 1.5);\n width: 100%;\n }\n\n /* ─── Icon ─── */\n\n .banner__icon {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n color: var(--hx-banner-icon-color, var(--hx-color-info-500, #3b82f6));\n }\n\n .banner__icon svg {\n width: var(--hx-space-5, 1.25rem);\n height: var(--hx-space-5, 1.25rem);\n fill: currentColor;\n }\n\n /* ─── Message ─── */\n\n .banner__message {\n flex: 1;\n min-width: 0;\n }\n\n /* ─── Action Link ─── */\n\n .banner__action {\n display: inline-flex;\n align-items: center;\n flex-shrink: 0;\n color: var(--hx-banner-action-color, var(--hx-banner-color, var(--hx-color-info-800, #1a3a4a)));\n font-weight: var(--hx-font-weight-semibold, 600);\n text-decoration: underline;\n text-underline-offset: 2px;\n cursor: pointer;\n background: transparent;\n border: none;\n padding: 0;\n font-size: inherit;\n font-family: inherit;\n }\n\n .banner__action:hover {\n opacity: var(--hx-opacity-90, 0.9);\n }\n\n .banner__action:focus-visible {\n outline: var(--hx-focus-ring-width, 2px) solid\n var(--hx-focus-ring-color, var(--hx-color-primary-400, #60a5fa));\n outline-offset: var(--hx-focus-ring-offset, 2px);\n border-radius: var(--hx-border-radius-sm, 0.25rem);\n }\n\n /* ─── Close Button ─── */\n /* Minimum 44px touch target per WCAG 2.5.8 (Target Size Minimum, AA) and */\n /* Apple HIG / Google Material guidelines. Uses absolute px units to ensure */\n /* the target size is independent of the consumer's base font size. */\n\n .banner__close-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n min-width: var(--hx-touch-target-size, 44px);\n min-height: var(--hx-touch-target-size, 44px);\n margin-inline-start: auto;\n padding: 0;\n border: none;\n border-radius: var(--hx-border-radius-sm, 0.25rem);\n background: transparent;\n color: var(--hx-banner-color, var(--hx-color-info-800, #1a3a4a));\n cursor: pointer;\n font-size: var(--hx-font-size-md, 1rem);\n line-height: 1;\n transition:\n background-color var(--hx-transition-fast, 150ms ease),\n opacity var(--hx-transition-fast, 150ms ease);\n opacity: var(--hx-opacity-75, 0.75);\n }\n\n .banner__close-button:hover {\n opacity: var(--hx-opacity-100, 1);\n /* color-mix() is supported in Chrome 111+, Firefox 113+, Safari 16.2+. */\n /* Falls back to transparent (no hover background) in older environments. */\n background-color: color-mix(in srgb, currentColor 10%, transparent);\n }\n\n .banner__close-button:focus-visible {\n outline: var(--hx-focus-ring-width, 2px) solid\n var(--hx-focus-ring-color, var(--hx-color-primary-400, #60a5fa));\n outline-offset: var(--hx-focus-ring-offset, 2px);\n opacity: 1;\n }\n\n .banner__close-button svg {\n width: var(--hx-space-4, 1rem);\n height: var(--hx-space-4, 1rem);\n fill: currentColor;\n }\n\n /* ─── Variant: info ─── */\n\n :host([variant='info']) .banner,\n :host(:not([variant])) .banner {\n --hx-banner-bg: var(--hx-color-info-50, #e8f4fd);\n --hx-banner-border-color: var(--hx-color-info-200, #b3d9ef);\n --hx-banner-color: var(--hx-color-info-800, #1a3a4a);\n --hx-banner-icon-color: var(--hx-color-info-500, #3b82f6);\n }\n\n /* ─── Variant: success ─── */\n\n :host([variant='success']) .banner {\n --hx-banner-bg: var(--hx-color-success-50, #ecfdf5);\n --hx-banner-border-color: var(--hx-color-success-200, #a7f3d0);\n --hx-banner-color: var(--hx-color-success-800, #065f46);\n --hx-banner-icon-color: var(--hx-color-success-500, #10b981);\n }\n\n /* ─── Variant: warning ─── */\n\n :host([variant='warning']) .banner {\n --hx-banner-bg: var(--hx-color-warning-50, #fffbeb);\n --hx-banner-border-color: var(--hx-color-warning-200, #fde68a);\n --hx-banner-color: var(--hx-color-warning-800, #92400e);\n --hx-banner-icon-color: var(--hx-color-warning-500, #f59e0b);\n }\n\n /* ─── Variant: error ─── */\n\n :host([variant='error']) .banner {\n --hx-banner-bg: var(--hx-color-error-50, #fef2f2);\n --hx-banner-border-color: var(--hx-color-error-200, #fecaca);\n --hx-banner-color: var(--hx-color-error-800, #991b1b);\n --hx-banner-icon-color: var(--hx-color-error-500, #ef4444);\n }\n\n /* ─── Position: fixed ─── */\n /* When position=\"fixed\", override the host-level CSS custom property. */\n /* The :host rule above sets position via var(--hx-banner-position). */\n /* We use an attribute selector to override it cleanly without duplication. */\n\n :host([position='fixed']) {\n position: fixed;\n }\n\n /* ─── Reduced Motion ─── */\n\n @media (prefers-reduced-motion: reduce) {\n .banner__close-button {\n transition: none;\n }\n }\n`;\n","import { LitElement, html, nothing, type PropertyValues } from 'lit';\nimport '../../utilities/document-token-adoption.js';\nimport { customElement, property } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { helixBannerStyles } from './hx-banner.styles.js';\n\n/** Banner variant determines visual styling and ARIA semantics. */\nexport type BannerVariant = 'info' | 'success' | 'warning' | 'error';\n\n/** Banner position determines CSS positioning behavior. */\nexport type BannerPosition = 'sticky' | 'fixed';\n\n/**\n * A full-width page-level banner for persistent notifications and announcements.\n * Designed for healthcare applications requiring prominent system-level messaging.\n *\n * @summary Full-width page-level banner for persistent notifications with variant-based styling and ARIA live regions.\n *\n * @tag hx-banner\n *\n * @slot - Default slot for banner message content.\n * @slot action - Optional slot to override the built-in action link with custom content.\n *\n * @fires {CustomEvent<{reason: string}>} hx-dismiss - Dispatched when the user dismisses the banner.\n *\n * @csspart banner - The outer banner container.\n * @csspart icon - The icon container.\n * @csspart message - The message content area.\n * @csspart action - The action link element (only rendered when action-label and action-href are set).\n * @csspart close-button - The dismiss button (only rendered when dismissible).\n *\n * @cssprop [--hx-banner-bg=var(--hx-color-info-50)] - Banner background color.\n * @cssprop [--hx-banner-color=var(--hx-color-info-800)] - Banner text color.\n * @cssprop [--hx-banner-border-color=var(--hx-color-info-200)] - Banner bottom border color.\n * @cssprop [--hx-banner-border-width=var(--hx-border-width-thin)] - Banner bottom border width.\n * @cssprop [--hx-banner-padding=var(--hx-space-3) var(--hx-space-4)] - Banner padding.\n * @cssprop [--hx-banner-gap=var(--hx-space-3)] - Gap between banner elements.\n * @cssprop [--hx-banner-icon-color=var(--hx-color-info-500)] - Banner icon color.\n * @cssprop [--hx-banner-font-family=var(--hx-font-family-sans)] - Banner font family.\n * @cssprop [--hx-banner-action-color=var(--hx-banner-color)] - Action link color.\n * @cssprop [--hx-banner-position=sticky] - CSS position value (sticky or fixed).\n * @cssprop [--hx-banner-z-index=100] - Banner z-index for stacking context.\n * @cssprop [--hx-touch-target-size=44px] - Minimum touch target size for the close button.\n */\n@customElement('hx-banner')\nexport class HelixBanner extends LitElement {\n static override styles = [helixBannerStyles];\n\n // ─── Properties ───\n\n /**\n * Visual variant of the banner that determines colors and ARIA semantics.\n * @attr variant\n */\n @property({ type: String, reflect: true })\n variant: 'info' | 'success' | 'warning' | 'error' = 'info';\n\n /**\n * CSS positioning behavior. \"sticky\" keeps the banner in flow; \"fixed\" pins it to the viewport.\n * @attr position\n */\n @property({ type: String, reflect: true })\n position: 'sticky' | 'fixed' = 'sticky';\n\n /**\n * Whether the banner can be dismissed by the user.\n * @attr dismissible\n */\n @property({ type: Boolean, reflect: true })\n dismissible = false;\n\n /**\n * Heading text for the banner, used to provide context in the action link's and\n * close button's accessible labels.\n * @attr heading\n */\n @property({ type: String })\n heading = '';\n\n /**\n * Label text for the optional action link. Requires action-href to render.\n * @attr action-label\n */\n @property({ type: String, attribute: 'action-label' })\n actionLabel = '';\n\n /**\n * URL for the optional action link. Requires action-label to render.\n * @attr action-href\n */\n @property({ type: String, attribute: 'action-href' })\n actionHref = '';\n\n /**\n * Whether the banner is visible. Defaults to true — banners are shown by default.\n * @attr open\n */\n @property({ type: Boolean, reflect: true })\n open = true;\n\n /** Accessible label for the dismiss button. Override for localized text. */\n @property({ type: String, attribute: 'label-close' })\n labelClose = 'Dismiss banner';\n\n /**\n * Override for the severity prefix announced to screen readers (e.g., \"Info:\", \"Error:\").\n * When not set, defaults to the English label matching the current variant.\n * @attr severity-label\n */\n @property({ attribute: 'severity-label' })\n severityLabel: string | undefined;\n\n // ─── Private Helpers ───\n\n /** Returns the default English severity label for the current variant. */\n private _defaultSeverityLabel(): string {\n const labels: Record<string, string> = {\n info: 'Info:',\n success: 'Success:',\n warning: 'Warning:',\n error: 'Error:',\n };\n return labels[this.variant] ?? '';\n }\n\n /** Returns the effective severity label, using the override if provided. */\n private get _effectiveSeverityLabel(): string {\n return this.severityLabel ?? this._defaultSeverityLabel();\n }\n\n /** Returns true when the variant requires assertive announcement. */\n /** @internal */\n private get _isAssertive(): boolean {\n return this.variant === 'error' || this.variant === 'warning';\n }\n\n /**\n * Returns the appropriate ARIA role based on variant.\n * role=\"alert\" implies aria-live=\"assertive\"; role=\"status\" implies aria-live=\"polite\".\n * We do NOT set aria-live explicitly to avoid double-announcements in JAWS.\n */\n /** @internal */\n private get _role(): string {\n return this._isAssertive ? 'alert' : 'status';\n }\n\n // ─── Lifecycle ───\n\n override connectedCallback(): void {\n super.connectedCallback();\n // Apply ARIA role to the host element for reliable screen reader support across\n // Shadow DOM boundaries. Placing role on a shadow-internal element has inconsistent\n // AT support in JAWS+Chrome and VoiceOver+Safari combinations (particularly pre-2024).\n this.setAttribute('role', this._role);\n if (!this.open) {\n this.setAttribute('aria-hidden', 'true');\n }\n }\n\n protected override updated(changedProperties: PropertyValues<this>): void {\n super.updated(changedProperties);\n if (changedProperties.has('variant')) {\n // Keep host ARIA role in sync with variant (assertive vs. polite).\n this.setAttribute('role', this._role);\n }\n if (changedProperties.has('open')) {\n // Manage aria-hidden in addition to display:none for reliable AT exclusion.\n // When open transitions from false→true, removing aria-hidden signals to AT\n // that the live region content should be announced.\n if (this.open) {\n this.removeAttribute('aria-hidden');\n } else {\n this.setAttribute('aria-hidden', 'true');\n }\n }\n }\n\n // ─── Default Icons ───\n\n /** @internal */\n private _renderInfoIcon() {\n return html`<svg viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n <path\n d=\"M10 2a8 8 0 100 16 8 8 0 000-16zm.75 4.75a.75.75 0 11-1.5 0 .75.75 0 011.5 0zM9.25 9a.75.75 0 011.5 0v4a.75.75 0 01-1.5 0V9z\"\n />\n </svg>`;\n }\n\n /** @internal */\n private _renderSuccessIcon() {\n return html`<svg viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n <path\n d=\"M10 2a8 8 0 100 16 8 8 0 000-16zm3.03 6.28a.75.75 0 00-1.06-1.06L9 10.19 7.78 8.97a.75.75 0 00-1.06 1.06l1.75 1.75a.75.75 0 001.06 0l3.5-3.5z\"\n />\n </svg>`;\n }\n\n /** @internal */\n private _renderWarningIcon() {\n return html`<svg viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n <path\n d=\"M8.49 2.92a1.75 1.75 0 013.02 0l6.25 10.83A1.75 1.75 0 0116.25 16H3.75a1.75 1.75 0 01-1.51-2.25L8.49 2.92zM10 7a.75.75 0 01.75.75v3a.75.75 0 01-1.5 0v-3A.75.75 0 0110 7zm0 7.5a.75.75 0 100-1.5.75.75 0 000 1.5z\"\n />\n </svg>`;\n }\n\n /** @internal */\n private _renderErrorIcon() {\n return html`<svg viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n <path\n d=\"M10 2a8 8 0 100 16 8 8 0 000-16zm-1.72 5.22a.75.75 0 011.06 0L10 7.94l.66-.72a.75.75 0 111.06 1.06L11.06 9l.66.72a.75.75 0 11-1.06 1.06L10 10.06l-.66.72a.75.75 0 01-1.06-1.06L8.94 9l-.66-.72a.75.75 0 010-1.06z\"\n />\n </svg>`;\n }\n\n /** @internal */\n private _renderDefaultIcon() {\n switch (this.variant) {\n case 'success':\n return this._renderSuccessIcon();\n case 'warning':\n return this._renderWarningIcon();\n case 'error':\n return this._renderErrorIcon();\n case 'info':\n default:\n return this._renderInfoIcon();\n }\n }\n\n /** @internal */\n private _renderCloseIcon() {\n return html`<svg viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n <path\n d=\"M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z\"\n />\n </svg>`;\n }\n\n // ─── Public Methods ───\n\n /**\n * Programmatically dismisses the banner. Sets open=false and dispatches hx-dismiss.\n */\n dismiss(): void {\n this._handleDismiss();\n }\n\n // ─── Event Handling ───\n\n /** @internal */\n private _handleDismiss(): void {\n this.open = false;\n\n /**\n * Dispatched when the user (or caller) dismisses the banner.\n * @event hx-dismiss\n */\n this.dispatchEvent(\n new CustomEvent<{ reason: string }>('hx-dismiss', {\n bubbles: true,\n composed: true,\n detail: { reason: 'user' },\n }),\n );\n }\n\n // ─── Render ───\n\n override render() {\n const classes = {\n banner: true,\n [`banner--${this.variant}`]: true,\n };\n\n const hasAction = this.actionLabel.length > 0 && this.actionHref.length > 0;\n\n // WCAG 1.4.1: Always render a visually-hidden severity label so the variant\n // is never conveyed by color alone.\n const severityLabel = this._effectiveSeverityLabel;\n\n return html`\n <div part=\"banner\" class=${classMap(classes)}>\n <span class=\"banner__severity-label\">${severityLabel}</span>\n <div part=\"icon\" class=\"banner__icon\">${this._renderDefaultIcon()}</div>\n\n <div part=\"message\" class=\"banner__message\">\n <slot></slot>\n </div>\n\n ${hasAction\n ? html`\n <a\n part=\"action\"\n class=\"banner__action\"\n href=${ifDefined(this.actionHref || undefined)}\n aria-label=${this.heading\n ? `${this.actionLabel}: ${this.heading}`\n : this.actionLabel}\n >\n <slot name=\"action\">${this.actionLabel}</slot>\n </a>\n `\n : nothing}\n ${this.dismissible\n ? html`\n <button\n part=\"close-button\"\n class=\"banner__close-button\"\n aria-label=${this.labelClose}\n @click=${this._handleDismiss}\n >\n ${this._renderCloseIcon()}\n </button>\n `\n : nothing}\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'hx-banner': HelixBanner;\n }\n}\n\nexport type { HelixBanner as HxBanner };\n"],"names":["helixBannerStyles","css","HelixBanner","LitElement","changedProperties","html","classes","hasAction","severityLabel","classMap","ifDefined","nothing","__decorateClass","property","customElement"],"mappings":"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"}