@helixui/library 3.6.0 → 3.8.0-next.145

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 (413) hide show
  1. package/README.md +41 -0
  2. package/aaa-verdicts.json +2036 -0
  3. package/custom-elements.json +3045 -1254
  4. package/dist/components/hx-accordion/hx-accordion-item.d.ts.map +1 -1
  5. package/dist/components/hx-accordion/hx-accordion-item.styles.d.ts.map +1 -1
  6. package/dist/components/hx-accordion/index.js +1 -1
  7. package/dist/components/hx-action-bar/hx-action-bar.d.ts +18 -0
  8. package/dist/components/hx-action-bar/hx-action-bar.d.ts.map +1 -1
  9. package/dist/components/hx-action-bar/hx-action-bar.styles.d.ts.map +1 -1
  10. package/dist/components/hx-action-bar/index.js +1 -1
  11. package/dist/components/hx-alert/hx-alert.d.ts +18 -8
  12. package/dist/components/hx-alert/hx-alert.d.ts.map +1 -1
  13. package/dist/components/hx-alert/hx-alert.styles.d.ts.map +1 -1
  14. package/dist/components/hx-alert/index.js +1 -1
  15. package/dist/components/hx-avatar/hx-avatar.d.ts +4 -1
  16. package/dist/components/hx-avatar/hx-avatar.d.ts.map +1 -1
  17. package/dist/components/hx-avatar/hx-avatar.styles.d.ts.map +1 -1
  18. package/dist/components/hx-avatar/index.js +1 -1
  19. package/dist/components/hx-badge/hx-badge.d.ts.map +1 -1
  20. package/dist/components/hx-badge/hx-badge.styles.d.ts.map +1 -1
  21. package/dist/components/hx-badge/index.js +1 -1
  22. package/dist/components/hx-banner/hx-banner.d.ts +19 -8
  23. package/dist/components/hx-banner/hx-banner.d.ts.map +1 -1
  24. package/dist/components/hx-banner/hx-banner.styles.d.ts.map +1 -1
  25. package/dist/components/hx-banner/index.js +1 -1
  26. package/dist/components/hx-breadcrumb/hx-breadcrumb-item.d.ts.map +1 -1
  27. package/dist/components/hx-breadcrumb/hx-breadcrumb-item.styles.d.ts.map +1 -1
  28. package/dist/components/hx-breadcrumb/hx-breadcrumb.d.ts +18 -0
  29. package/dist/components/hx-breadcrumb/hx-breadcrumb.d.ts.map +1 -1
  30. package/dist/components/hx-breadcrumb/index.js +1 -1
  31. package/dist/components/hx-button/hx-button.d.ts +18 -0
  32. package/dist/components/hx-button/hx-button.d.ts.map +1 -1
  33. package/dist/components/hx-button/hx-button.styles.d.ts.map +1 -1
  34. package/dist/components/hx-button/index.js +1 -1
  35. package/dist/components/hx-button-group/hx-button-group.d.ts +47 -0
  36. package/dist/components/hx-button-group/hx-button-group.d.ts.map +1 -1
  37. package/dist/components/hx-button-group/index.js +1 -1
  38. package/dist/components/hx-carousel/hx-carousel.d.ts.map +1 -1
  39. package/dist/components/hx-carousel/hx-carousel.styles.d.ts.map +1 -1
  40. package/dist/components/hx-carousel/index.js +1 -1
  41. package/dist/components/hx-checkbox/hx-checkbox.d.ts +18 -0
  42. package/dist/components/hx-checkbox/hx-checkbox.d.ts.map +1 -1
  43. package/dist/components/hx-checkbox/hx-checkbox.styles.d.ts.map +1 -1
  44. package/dist/components/hx-checkbox/index.js +1 -1
  45. package/dist/components/hx-checkbox-group/hx-checkbox-group.d.ts +36 -0
  46. package/dist/components/hx-checkbox-group/hx-checkbox-group.d.ts.map +1 -1
  47. package/dist/components/hx-checkbox-group/hx-checkbox-group.styles.d.ts.map +1 -1
  48. package/dist/components/hx-checkbox-group/index.js +1 -1
  49. package/dist/components/hx-clinical-status/hx-clinical-status.d.ts +26 -9
  50. package/dist/components/hx-clinical-status/hx-clinical-status.d.ts.map +1 -1
  51. package/dist/components/hx-clinical-status/hx-clinical-status.styles.d.ts.map +1 -1
  52. package/dist/components/hx-clinical-status/index.js +1 -1
  53. package/dist/components/hx-color-picker/hx-color-picker.d.ts +18 -0
  54. package/dist/components/hx-color-picker/hx-color-picker.d.ts.map +1 -1
  55. package/dist/components/hx-color-picker/hx-color-picker.styles.d.ts.map +1 -1
  56. package/dist/components/hx-color-picker/index.js +1 -1
  57. package/dist/components/hx-combobox/hx-combobox.d.ts +18 -0
  58. package/dist/components/hx-combobox/hx-combobox.d.ts.map +1 -1
  59. package/dist/components/hx-combobox/hx-combobox.styles.d.ts.map +1 -1
  60. package/dist/components/hx-combobox/index.js +1 -1
  61. package/dist/components/hx-copy-button/hx-copy-button.d.ts +18 -0
  62. package/dist/components/hx-copy-button/hx-copy-button.d.ts.map +1 -1
  63. package/dist/components/hx-copy-button/hx-copy-button.styles.d.ts.map +1 -1
  64. package/dist/components/hx-copy-button/index.js +1 -1
  65. package/dist/components/hx-date-picker/hx-date-picker.d.ts +18 -0
  66. package/dist/components/hx-date-picker/hx-date-picker.d.ts.map +1 -1
  67. package/dist/components/hx-date-picker/hx-date-picker.styles.d.ts.map +1 -1
  68. package/dist/components/hx-date-picker/index.js +1 -1
  69. package/dist/components/hx-dialog/hx-dialog.d.ts +18 -0
  70. package/dist/components/hx-dialog/hx-dialog.d.ts.map +1 -1
  71. package/dist/components/hx-drawer/hx-drawer.d.ts +18 -0
  72. package/dist/components/hx-drawer/hx-drawer.d.ts.map +1 -1
  73. package/dist/components/hx-drawer/hx-drawer.styles.d.ts.map +1 -1
  74. package/dist/components/hx-drawer/index.js +1 -1
  75. package/dist/components/hx-dropdown/hx-dropdown.d.ts +18 -0
  76. package/dist/components/hx-dropdown/hx-dropdown.d.ts.map +1 -1
  77. package/dist/components/hx-dropdown/hx-dropdown.styles.d.ts.map +1 -1
  78. package/dist/components/hx-dropdown/index.js +1 -1
  79. package/dist/components/hx-field/hx-field.d.ts +17 -0
  80. package/dist/components/hx-field/hx-field.d.ts.map +1 -1
  81. package/dist/components/hx-field-label/hx-field-label.d.ts +17 -0
  82. package/dist/components/hx-field-label/hx-field-label.d.ts.map +1 -1
  83. package/dist/components/hx-file-upload/hx-file-upload.d.ts +46 -0
  84. package/dist/components/hx-file-upload/hx-file-upload.d.ts.map +1 -1
  85. package/dist/components/hx-file-upload/hx-file-upload.styles.d.ts.map +1 -1
  86. package/dist/components/hx-file-upload/index.js +1 -1
  87. package/dist/components/hx-form/hx-form.d.ts +19 -0
  88. package/dist/components/hx-form/hx-form.d.ts.map +1 -1
  89. package/dist/components/hx-help-text/hx-help-text.d.ts +17 -0
  90. package/dist/components/hx-help-text/hx-help-text.d.ts.map +1 -1
  91. package/dist/components/hx-help-text/hx-help-text.styles.d.ts.map +1 -1
  92. package/dist/components/hx-help-text/index.js +1 -1
  93. package/dist/components/hx-icon/hx-icon.d.ts +108 -12
  94. package/dist/components/hx-icon/hx-icon.d.ts.map +1 -1
  95. package/dist/components/hx-icon/hx-icon.styles.d.ts.map +1 -1
  96. package/dist/components/hx-icon/index.js +1 -1
  97. package/dist/components/hx-icon-button/hx-icon-button.d.ts +18 -0
  98. package/dist/components/hx-icon-button/hx-icon-button.d.ts.map +1 -1
  99. package/dist/components/hx-icon-button/hx-icon-button.styles.d.ts.map +1 -1
  100. package/dist/components/hx-icon-button/index.js +1 -1
  101. package/dist/components/hx-link/hx-link.d.ts.map +1 -1
  102. package/dist/components/hx-link/hx-link.styles.d.ts.map +1 -1
  103. package/dist/components/hx-link/index.js +1 -1
  104. package/dist/components/hx-menu/hx-menu-item.d.ts.map +1 -1
  105. package/dist/components/hx-menu/hx-menu-item.styles.d.ts.map +1 -1
  106. package/dist/components/hx-menu/hx-menu.d.ts +18 -0
  107. package/dist/components/hx-menu/hx-menu.d.ts.map +1 -1
  108. package/dist/components/hx-menu/index.js +1 -1
  109. package/dist/components/hx-nav/hx-nav.d.ts +18 -0
  110. package/dist/components/hx-nav/hx-nav.d.ts.map +1 -1
  111. package/dist/components/hx-nav/hx-nav.styles.d.ts.map +1 -1
  112. package/dist/components/hx-nav/index.js +1 -1
  113. package/dist/components/hx-number-input/hx-number-input.d.ts +18 -0
  114. package/dist/components/hx-number-input/hx-number-input.d.ts.map +1 -1
  115. package/dist/components/hx-number-input/hx-number-input.styles.d.ts.map +1 -1
  116. package/dist/components/hx-number-input/index.js +1 -1
  117. package/dist/components/hx-overflow-menu/hx-overflow-menu.d.ts +23 -1
  118. package/dist/components/hx-overflow-menu/hx-overflow-menu.d.ts.map +1 -1
  119. package/dist/components/hx-overflow-menu/hx-overflow-menu.styles.d.ts.map +1 -1
  120. package/dist/components/hx-overflow-menu/index.js +1 -1
  121. package/dist/components/hx-pagination/hx-pagination.styles.d.ts.map +1 -1
  122. package/dist/components/hx-pagination/index.js +1 -1
  123. package/dist/components/hx-phi-field/hx-phi-field.d.ts.map +1 -1
  124. package/dist/components/hx-phi-field/hx-phi-field.styles.d.ts.map +1 -1
  125. package/dist/components/hx-phi-field/index.js +1 -1
  126. package/dist/components/hx-popover/hx-popover.d.ts +18 -0
  127. package/dist/components/hx-popover/hx-popover.d.ts.map +1 -1
  128. package/dist/components/hx-popover/hx-popover.styles.d.ts.map +1 -1
  129. package/dist/components/hx-popover/index.js +1 -1
  130. package/dist/components/hx-popup/hx-popup.d.ts +18 -0
  131. package/dist/components/hx-popup/hx-popup.d.ts.map +1 -1
  132. package/dist/components/hx-popup/hx-popup.styles.d.ts.map +1 -1
  133. package/dist/components/hx-popup/index.js +1 -1
  134. package/dist/components/hx-radio-group/hx-radio-group.d.ts +18 -0
  135. package/dist/components/hx-radio-group/hx-radio-group.d.ts.map +1 -1
  136. package/dist/components/hx-radio-group/hx-radio-group.styles.d.ts.map +1 -1
  137. package/dist/components/hx-radio-group/hx-radio.styles.d.ts.map +1 -1
  138. package/dist/components/hx-radio-group/index.js +1 -1
  139. package/dist/components/hx-rating/hx-rating.d.ts +19 -0
  140. package/dist/components/hx-rating/hx-rating.d.ts.map +1 -1
  141. package/dist/components/hx-rating/hx-rating.styles.d.ts.map +1 -1
  142. package/dist/components/hx-rating/index.js +1 -1
  143. package/dist/components/hx-select/hx-select.d.ts +18 -0
  144. package/dist/components/hx-select/hx-select.d.ts.map +1 -1
  145. package/dist/components/hx-side-nav/hx-nav-item.d.ts.map +1 -1
  146. package/dist/components/hx-side-nav/hx-nav-item.styles.d.ts.map +1 -1
  147. package/dist/components/hx-side-nav/hx-side-nav.d.ts +18 -0
  148. package/dist/components/hx-side-nav/hx-side-nav.d.ts.map +1 -1
  149. package/dist/components/hx-side-nav/hx-side-nav.styles.d.ts.map +1 -1
  150. package/dist/components/hx-side-nav/index.js +1 -1
  151. package/dist/components/hx-slider/hx-slider.d.ts +47 -0
  152. package/dist/components/hx-slider/hx-slider.d.ts.map +1 -1
  153. package/dist/components/hx-slider/index.js +1 -1
  154. package/dist/components/hx-split-button/hx-split-button.d.ts +18 -0
  155. package/dist/components/hx-split-button/hx-split-button.d.ts.map +1 -1
  156. package/dist/components/hx-split-button/hx-split-button.styles.d.ts.map +1 -1
  157. package/dist/components/hx-split-button/index.js +1 -1
  158. package/dist/components/hx-stat/hx-stat.d.ts.map +1 -1
  159. package/dist/components/hx-stat/hx-stat.styles.d.ts.map +1 -1
  160. package/dist/components/hx-stat/index.js +1 -1
  161. package/dist/components/hx-steps/hx-step.d.ts.map +1 -1
  162. package/dist/components/hx-steps/hx-step.styles.d.ts.map +1 -1
  163. package/dist/components/hx-steps/index.js +1 -1
  164. package/dist/components/hx-switch/hx-switch.d.ts +18 -0
  165. package/dist/components/hx-switch/hx-switch.d.ts.map +1 -1
  166. package/dist/components/hx-switch/hx-switch.styles.d.ts.map +1 -1
  167. package/dist/components/hx-switch/index.js +1 -1
  168. package/dist/components/hx-tabs/hx-tab.styles.d.ts.map +1 -1
  169. package/dist/components/hx-tabs/hx-tabs.d.ts +18 -0
  170. package/dist/components/hx-tabs/hx-tabs.d.ts.map +1 -1
  171. package/dist/components/hx-tabs/index.js +1 -1
  172. package/dist/components/hx-tag/hx-tag.d.ts.map +1 -1
  173. package/dist/components/hx-tag/hx-tag.styles.d.ts.map +1 -1
  174. package/dist/components/hx-tag/index.js +1 -1
  175. package/dist/components/hx-text-input/hx-text-input.d.ts +18 -0
  176. package/dist/components/hx-text-input/hx-text-input.d.ts.map +1 -1
  177. package/dist/components/hx-text-input/hx-text-input.styles.d.ts.map +1 -1
  178. package/dist/components/hx-text-input/index.js +1 -1
  179. package/dist/components/hx-textarea/hx-textarea.d.ts +18 -0
  180. package/dist/components/hx-textarea/hx-textarea.d.ts.map +1 -1
  181. package/dist/components/hx-time-picker/hx-time-picker.d.ts +18 -0
  182. package/dist/components/hx-time-picker/hx-time-picker.d.ts.map +1 -1
  183. package/dist/components/hx-time-picker/hx-time-picker.styles.d.ts.map +1 -1
  184. package/dist/components/hx-time-picker/index.js +1 -1
  185. package/dist/components/hx-toast/hx-toast.d.ts +19 -8
  186. package/dist/components/hx-toast/hx-toast.d.ts.map +1 -1
  187. package/dist/components/hx-toast/hx-toast.styles.d.ts.map +1 -1
  188. package/dist/components/hx-toast/index.js +1 -1
  189. package/dist/components/hx-toggle-button/hx-toggle-button.d.ts +18 -0
  190. package/dist/components/hx-toggle-button/hx-toggle-button.d.ts.map +1 -1
  191. package/dist/components/hx-toggle-button/hx-toggle-button.styles.d.ts.map +1 -1
  192. package/dist/components/hx-toggle-button/index.js +1 -1
  193. package/dist/components/hx-tooltip/hx-tooltip.d.ts +18 -0
  194. package/dist/components/hx-tooltip/hx-tooltip.d.ts.map +1 -1
  195. package/dist/components/hx-tooltip/hx-tooltip.styles.d.ts.map +1 -1
  196. package/dist/components/hx-tooltip/index.js +1 -1
  197. package/dist/components/hx-top-nav/hx-top-nav.d.ts +18 -0
  198. package/dist/components/hx-top-nav/hx-top-nav.d.ts.map +1 -1
  199. package/dist/components/hx-top-nav/hx-top-nav.styles.d.ts.map +1 -1
  200. package/dist/components/hx-top-nav/index.js +1 -1
  201. package/dist/components/hx-tree-view/hx-tree-item.d.ts.map +1 -1
  202. package/dist/components/hx-tree-view/hx-tree-item.styles.d.ts.map +1 -1
  203. package/dist/components/hx-tree-view/index.js +1 -1
  204. package/dist/css/helix-all.css +414 -118
  205. package/dist/css/helix-core.css +43 -19
  206. package/dist/css/helix-feedback.css +15 -18
  207. package/dist/css/helix-forms.css +172 -44
  208. package/dist/css/helix-media.css +6 -3
  209. package/dist/css/helix-navigation.css +65 -12
  210. package/dist/css/helix-overlay.css +63 -0
  211. package/dist/css/helix-tokens.css +18 -15
  212. package/dist/css/helix-utility.css +44 -12
  213. package/dist/css/hx-action-bar.css +12 -0
  214. package/dist/css/hx-alert.css +4 -8
  215. package/dist/css/hx-avatar.css +1 -2
  216. package/dist/css/hx-badge.css +10 -5
  217. package/dist/css/hx-banner.css +4 -8
  218. package/dist/css/hx-button.css +15 -5
  219. package/dist/css/hx-carousel.css +6 -3
  220. package/dist/css/hx-checkbox-group.css +11 -0
  221. package/dist/css/hx-checkbox.css +24 -13
  222. package/dist/css/hx-clinical-status.css +4 -7
  223. package/dist/css/hx-color-picker.css +14 -1
  224. package/dist/css/hx-combobox.css +8 -0
  225. package/dist/css/hx-copy-button.css +5 -2
  226. package/dist/css/hx-date-picker.css +16 -3
  227. package/dist/css/hx-drawer.css +5 -0
  228. package/dist/css/hx-dropdown.css +18 -0
  229. package/dist/css/hx-file-upload.css +4 -0
  230. package/dist/css/hx-help-text.css +5 -0
  231. package/dist/css/hx-icon-button.css +4 -5
  232. package/dist/css/hx-icon.css +7 -0
  233. package/dist/css/hx-link.css +1 -2
  234. package/dist/css/hx-nav.css +31 -2
  235. package/dist/css/hx-number-input.css +10 -11
  236. package/dist/css/hx-overflow-menu.css +5 -0
  237. package/dist/css/hx-pagination.css +6 -3
  238. package/dist/css/hx-phi-field.css +2 -3
  239. package/dist/css/hx-popover.css +13 -0
  240. package/dist/css/hx-popup.css +14 -0
  241. package/dist/css/hx-radio-group.css +10 -0
  242. package/dist/css/hx-rating.css +6 -0
  243. package/dist/css/hx-side-nav.css +10 -5
  244. package/dist/css/hx-split-button.css +27 -10
  245. package/dist/css/hx-stat.css +1 -2
  246. package/dist/css/hx-switch.css +19 -1
  247. package/dist/css/hx-tag.css +5 -0
  248. package/dist/css/hx-text-input.css +4 -1
  249. package/dist/css/hx-time-picker.css +12 -2
  250. package/dist/css/hx-toast.css +6 -0
  251. package/dist/css/hx-toggle-button.css +29 -12
  252. package/dist/css/hx-tooltip.css +13 -0
  253. package/dist/css/hx-top-nav.css +13 -2
  254. package/dist/css/index.css +1 -1
  255. package/dist/css/manifest.json +60 -20
  256. package/dist/index.js +49 -49
  257. package/dist/shared/{hx-accordion-ZVzgDzTG.js → hx-accordion-DR--Ev4t.js} +48 -54
  258. package/dist/shared/hx-accordion-DR--Ev4t.js.map +1 -0
  259. package/dist/shared/{hx-action-bar-CitgcpGv.js → hx-action-bar-BlEG4aZv.js} +41 -29
  260. package/dist/shared/hx-action-bar-BlEG4aZv.js.map +1 -0
  261. package/dist/shared/{hx-alert-Bto8-TIi.js → hx-alert-C0axS32J.js} +40 -79
  262. package/dist/shared/hx-alert-C0axS32J.js.map +1 -0
  263. package/dist/shared/{hx-avatar-C9hOmlAb.js → hx-avatar-ChAYWnK8.js} +22 -24
  264. package/dist/shared/hx-avatar-ChAYWnK8.js.map +1 -0
  265. package/dist/shared/{hx-badge-JlFtAdxS.js → hx-badge-vX-1cuLA.js} +25 -20
  266. package/dist/shared/hx-badge-vX-1cuLA.js.map +1 -0
  267. package/dist/shared/{hx-banner-fpRnciIO.js → hx-banner-PbHwFNSb.js} +51 -90
  268. package/dist/shared/hx-banner-PbHwFNSb.js.map +1 -0
  269. package/dist/shared/{hx-breadcrumb-item-3tKppF9h.js → hx-breadcrumb-item-D8xYqe3s.js} +56 -43
  270. package/dist/shared/hx-breadcrumb-item-D8xYqe3s.js.map +1 -0
  271. package/dist/shared/{hx-button-BOwAEcF1.js → hx-button-DOZTZnz-.js} +29 -19
  272. package/dist/shared/hx-button-DOZTZnz-.js.map +1 -0
  273. package/dist/shared/hx-button-group-D3QUmSzl.js +248 -0
  274. package/dist/shared/hx-button-group-D3QUmSzl.js.map +1 -0
  275. package/dist/shared/{hx-carousel-item-z1Lc24op.js → hx-carousel-item-BVIKgQ4i.js} +72 -102
  276. package/dist/shared/hx-carousel-item-BVIKgQ4i.js.map +1 -0
  277. package/dist/shared/{hx-checkbox-CYd0YV_u.js → hx-checkbox-DDSXXhps.js} +56 -47
  278. package/dist/shared/hx-checkbox-DDSXXhps.js.map +1 -0
  279. package/dist/shared/{hx-checkbox-group-D5piJLY8.js → hx-checkbox-group-C0q6HDqn.js} +101 -58
  280. package/dist/shared/hx-checkbox-group-C0q6HDqn.js.map +1 -0
  281. package/dist/shared/{hx-clinical-status-D3XQIOqX.js → hx-clinical-status-ZSVEc3Qg.js} +68 -87
  282. package/dist/shared/hx-clinical-status-ZSVEc3Qg.js.map +1 -0
  283. package/dist/shared/{hx-color-picker-DBwJzT5f.js → hx-color-picker-CYjx8i8R.js} +97 -84
  284. package/dist/shared/hx-color-picker-CYjx8i8R.js.map +1 -0
  285. package/dist/shared/{hx-combobox-NgJaLbs2.js → hx-combobox-Be-mqOv4.js} +35 -45
  286. package/dist/shared/hx-combobox-Be-mqOv4.js.map +1 -0
  287. package/dist/shared/{hx-copy-button-sUVuikyH.js → hx-copy-button-DJirFCUL.js} +18 -15
  288. package/dist/shared/hx-copy-button-DJirFCUL.js.map +1 -0
  289. package/dist/shared/{hx-date-picker-B49yo4Vm.js → hx-date-picker-CziP3Hm1.js} +85 -84
  290. package/dist/shared/hx-date-picker-CziP3Hm1.js.map +1 -0
  291. package/dist/shared/hx-dialog-B4weoj_1.js.map +1 -1
  292. package/dist/shared/{hx-drawer-CM_upadk.js → hx-drawer-BlU2oX8-.js} +32 -36
  293. package/dist/shared/hx-drawer-BlU2oX8-.js.map +1 -0
  294. package/dist/shared/{hx-dropdown-D626S2ZG.js → hx-dropdown-DREqpIpm.js} +51 -33
  295. package/dist/shared/hx-dropdown-DREqpIpm.js.map +1 -0
  296. package/dist/shared/hx-field-label-BVRyyKeh.js.map +1 -1
  297. package/dist/shared/hx-field-zw0U1KVi.js.map +1 -1
  298. package/dist/shared/{hx-file-upload-D3rKROK5.js → hx-file-upload-CU5QGZSP.js} +137 -80
  299. package/dist/shared/hx-file-upload-CU5QGZSP.js.map +1 -0
  300. package/dist/shared/hx-form-CkChEATa.js.map +1 -1
  301. package/dist/shared/hx-help-text-CNaZ82LT.js +137 -0
  302. package/dist/shared/hx-help-text-CNaZ82LT.js.map +1 -0
  303. package/dist/shared/{hx-icon-button-a6OpeQz5.js → hx-icon-button-B2BdVdyK.js} +10 -11
  304. package/dist/shared/hx-icon-button-B2BdVdyK.js.map +1 -0
  305. package/dist/shared/hx-icon-bxz9eB9a.js +386 -0
  306. package/dist/shared/hx-icon-bxz9eB9a.js.map +1 -0
  307. package/dist/shared/{hx-link-CMnZRUtQ.js → hx-link-BURSdYLp.js} +19 -26
  308. package/dist/shared/hx-link-BURSdYLp.js.map +1 -0
  309. package/dist/shared/{hx-menu-divider-A6Guuzi_.js → hx-menu-divider-g0grbWV9.js} +19 -31
  310. package/dist/shared/hx-menu-divider-g0grbWV9.js.map +1 -0
  311. package/dist/shared/{hx-nav-ldFM3Fle.js → hx-nav-GTsAZGOx.js} +94 -85
  312. package/dist/shared/hx-nav-GTsAZGOx.js.map +1 -0
  313. package/dist/shared/{hx-nav-item-CODtUlew.js → hx-nav-item-CxE7Mp3M.js} +46 -41
  314. package/dist/shared/hx-nav-item-CxE7Mp3M.js.map +1 -0
  315. package/dist/shared/{hx-number-input-yUzFOSC1.js → hx-number-input-Bvyc9kOi.js} +59 -64
  316. package/dist/shared/hx-number-input-Bvyc9kOi.js.map +1 -0
  317. package/dist/shared/{hx-overflow-menu-DFjJAziP.js → hx-overflow-menu-LrTteeR1.js} +32 -39
  318. package/dist/shared/{hx-overflow-menu-DFjJAziP.js.map → hx-overflow-menu-LrTteeR1.js.map} +1 -1
  319. package/dist/shared/{hx-pagination-C7y8GVyU.js → hx-pagination-D726PyTM.js} +7 -4
  320. package/dist/shared/hx-pagination-D726PyTM.js.map +1 -0
  321. package/dist/shared/{hx-phi-field-C19oxlrr.js → hx-phi-field-sZt_rYIL.js} +46 -66
  322. package/dist/shared/hx-phi-field-sZt_rYIL.js.map +1 -0
  323. package/dist/shared/{hx-popover-BAlAFOH9.js → hx-popover-BjB0nkcq.js} +51 -38
  324. package/dist/shared/hx-popover-BjB0nkcq.js.map +1 -0
  325. package/dist/shared/{hx-popup-COUXXZ9X.js → hx-popup-BiV_2evC.js} +59 -45
  326. package/dist/shared/hx-popup-BiV_2evC.js.map +1 -0
  327. package/dist/shared/{hx-radio-C7eTj5YI.js → hx-radio-BD_c9NJy.js} +52 -39
  328. package/dist/shared/hx-radio-BD_c9NJy.js.map +1 -0
  329. package/dist/shared/{hx-rating-C3QP53k9.js → hx-rating-BGK4AxvI.js} +45 -71
  330. package/dist/shared/hx-rating-BGK4AxvI.js.map +1 -0
  331. package/dist/shared/hx-select-DahFehiZ.js.map +1 -1
  332. package/dist/shared/{hx-slider-Blmv_rwS.js → hx-slider-CkOk5BCY.js} +83 -23
  333. package/dist/shared/hx-slider-CkOk5BCY.js.map +1 -0
  334. package/dist/shared/{hx-split-button-Ddle8iVx.js → hx-split-button-Bg9FHrFK.js} +73 -65
  335. package/dist/shared/hx-split-button-Bg9FHrFK.js.map +1 -0
  336. package/dist/shared/{hx-stat-Gtw_SpK8.js → hx-stat-wKxbyep6.js} +22 -55
  337. package/dist/shared/hx-stat-wKxbyep6.js.map +1 -0
  338. package/dist/shared/{hx-step-R2rjp1fT.js → hx-step-CyGQAuiB.js} +7 -27
  339. package/dist/shared/hx-step-CyGQAuiB.js.map +1 -0
  340. package/dist/shared/{hx-switch-TvKGvZJz.js → hx-switch-BCXuNxEH.js} +42 -24
  341. package/dist/shared/hx-switch-BCXuNxEH.js.map +1 -0
  342. package/dist/shared/{hx-tab-panel-DzsX8BHV.js → hx-tab-panel-BfisavKo.js} +47 -32
  343. package/dist/shared/hx-tab-panel-BfisavKo.js.map +1 -0
  344. package/dist/shared/{hx-tag-C5aCUpVi.js → hx-tag-BqO6HY6V.js} +26 -21
  345. package/dist/shared/hx-tag-BqO6HY6V.js.map +1 -0
  346. package/dist/shared/{hx-text-input-D6FlOZM-.js → hx-text-input-V5sQOpDh.js} +5 -2
  347. package/dist/shared/hx-text-input-V5sQOpDh.js.map +1 -0
  348. package/dist/shared/hx-textarea-CNG590KY.js.map +1 -1
  349. package/dist/shared/{hx-time-picker-Bo7FWzmf.js → hx-time-picker-if5Cl0Ei.js} +42 -43
  350. package/dist/shared/hx-time-picker-if5Cl0Ei.js.map +1 -0
  351. package/dist/shared/{hx-toggle-button-DwBers3A.js → hx-toggle-button-xNVYeA3X.js} +64 -47
  352. package/dist/shared/hx-toggle-button-xNVYeA3X.js.map +1 -0
  353. package/dist/shared/{hx-tooltip-DVqtKPCD.js → hx-tooltip-CamO-9nd.js} +24 -11
  354. package/dist/shared/hx-tooltip-CamO-9nd.js.map +1 -0
  355. package/dist/shared/{hx-top-nav-DP6OFS8C.js → hx-top-nav-vP6oDWMV.js} +42 -44
  356. package/dist/shared/hx-top-nav-vP6oDWMV.js.map +1 -0
  357. package/dist/shared/{hx-tree-item-CXyspGxI.js → hx-tree-item-D8hwKd5m.js} +54 -57
  358. package/dist/shared/hx-tree-item-D8hwKd5m.js.map +1 -0
  359. package/dist/shared/{toast-factory-Dht3pVsw.js → toast-factory-DgnbFxVs.js} +127 -153
  360. package/dist/shared/toast-factory-DgnbFxVs.js.map +1 -0
  361. package/figma-inventory.json +1280 -429
  362. package/package.json +8 -4
  363. package/dist/shared/hx-accordion-ZVzgDzTG.js.map +0 -1
  364. package/dist/shared/hx-action-bar-CitgcpGv.js.map +0 -1
  365. package/dist/shared/hx-alert-Bto8-TIi.js.map +0 -1
  366. package/dist/shared/hx-avatar-C9hOmlAb.js.map +0 -1
  367. package/dist/shared/hx-badge-JlFtAdxS.js.map +0 -1
  368. package/dist/shared/hx-banner-fpRnciIO.js.map +0 -1
  369. package/dist/shared/hx-breadcrumb-item-3tKppF9h.js.map +0 -1
  370. package/dist/shared/hx-button-BOwAEcF1.js.map +0 -1
  371. package/dist/shared/hx-button-group-4NUBpkyC.js +0 -181
  372. package/dist/shared/hx-button-group-4NUBpkyC.js.map +0 -1
  373. package/dist/shared/hx-carousel-item-z1Lc24op.js.map +0 -1
  374. package/dist/shared/hx-checkbox-CYd0YV_u.js.map +0 -1
  375. package/dist/shared/hx-checkbox-group-D5piJLY8.js.map +0 -1
  376. package/dist/shared/hx-clinical-status-D3XQIOqX.js.map +0 -1
  377. package/dist/shared/hx-color-picker-DBwJzT5f.js.map +0 -1
  378. package/dist/shared/hx-combobox-NgJaLbs2.js.map +0 -1
  379. package/dist/shared/hx-copy-button-sUVuikyH.js.map +0 -1
  380. package/dist/shared/hx-date-picker-B49yo4Vm.js.map +0 -1
  381. package/dist/shared/hx-drawer-CM_upadk.js.map +0 -1
  382. package/dist/shared/hx-dropdown-D626S2ZG.js.map +0 -1
  383. package/dist/shared/hx-file-upload-D3rKROK5.js.map +0 -1
  384. package/dist/shared/hx-help-text-Xb2Yr8x2.js +0 -156
  385. package/dist/shared/hx-help-text-Xb2Yr8x2.js.map +0 -1
  386. package/dist/shared/hx-icon-button-a6OpeQz5.js.map +0 -1
  387. package/dist/shared/hx-icon-fuVm4-bk.js +0 -283
  388. package/dist/shared/hx-icon-fuVm4-bk.js.map +0 -1
  389. package/dist/shared/hx-link-CMnZRUtQ.js.map +0 -1
  390. package/dist/shared/hx-menu-divider-A6Guuzi_.js.map +0 -1
  391. package/dist/shared/hx-nav-item-CODtUlew.js.map +0 -1
  392. package/dist/shared/hx-nav-ldFM3Fle.js.map +0 -1
  393. package/dist/shared/hx-number-input-yUzFOSC1.js.map +0 -1
  394. package/dist/shared/hx-pagination-C7y8GVyU.js.map +0 -1
  395. package/dist/shared/hx-phi-field-C19oxlrr.js.map +0 -1
  396. package/dist/shared/hx-popover-BAlAFOH9.js.map +0 -1
  397. package/dist/shared/hx-popup-COUXXZ9X.js.map +0 -1
  398. package/dist/shared/hx-radio-C7eTj5YI.js.map +0 -1
  399. package/dist/shared/hx-rating-C3QP53k9.js.map +0 -1
  400. package/dist/shared/hx-slider-Blmv_rwS.js.map +0 -1
  401. package/dist/shared/hx-split-button-Ddle8iVx.js.map +0 -1
  402. package/dist/shared/hx-stat-Gtw_SpK8.js.map +0 -1
  403. package/dist/shared/hx-step-R2rjp1fT.js.map +0 -1
  404. package/dist/shared/hx-switch-TvKGvZJz.js.map +0 -1
  405. package/dist/shared/hx-tab-panel-DzsX8BHV.js.map +0 -1
  406. package/dist/shared/hx-tag-C5aCUpVi.js.map +0 -1
  407. package/dist/shared/hx-text-input-D6FlOZM-.js.map +0 -1
  408. package/dist/shared/hx-time-picker-Bo7FWzmf.js.map +0 -1
  409. package/dist/shared/hx-toggle-button-DwBers3A.js.map +0 -1
  410. package/dist/shared/hx-tooltip-DVqtKPCD.js.map +0 -1
  411. package/dist/shared/hx-top-nav-DP6OFS8C.js.map +0 -1
  412. package/dist/shared/hx-tree-item-CXyspGxI.js.map +0 -1
  413. package/dist/shared/toast-factory-Dht3pVsw.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hx-badge-vX-1cuLA.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-action-primary-bg, #0f7078));\n color: var(--hx-badge-color, var(--hx-color-text-on-primary, #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-badge-primary-bg, var(--hx-color-action-primary-bg, #0f7078));\n --hx-badge-color: var(--hx-badge-primary-color, var(--hx-color-text-on-primary, #ffffff));\n --hx-badge-pulse-color-internal: var(\n --hx-badge-pulse-color,\n var(--hx-badge-primary-bg, var(--hx-color-action-primary-bg, #0f7078))\n );\n }\n\n .badge--secondary {\n --hx-badge-bg: var(--hx-badge-secondary-bg, var(--hx-color-neutral-100, #ebeee9));\n --hx-badge-color: var(--hx-badge-secondary-color, var(--hx-color-neutral-700, #313e4b));\n --hx-badge-pulse-color-internal: var(\n --hx-badge-pulse-color,\n var(--hx-badge-secondary-bg, var(--hx-color-neutral-100, #ebeee9))\n );\n }\n\n .badge--success {\n --hx-badge-bg: var(--hx-badge-success-bg, var(--hx-color-success-700, #146831));\n --hx-badge-color: var(--hx-badge-success-color, var(--hx-color-neutral-0, #ffffff));\n --hx-badge-pulse-color-internal: var(\n --hx-badge-pulse-color,\n var(--hx-badge-success-bg, var(--hx-color-success-700, #146831))\n );\n }\n\n .badge--warning {\n --hx-badge-bg: var(--hx-badge-warning-bg, var(--hx-color-warning-500, #c2711c));\n --hx-badge-color: var(--hx-badge-warning-color, var(--hx-color-neutral-900, #0d1825));\n --hx-badge-pulse-color-internal: var(\n --hx-badge-pulse-color,\n var(--hx-badge-warning-bg, var(--hx-color-warning-500, #c2711c))\n );\n }\n\n .badge--error {\n --hx-badge-bg: var(--hx-badge-error-bg, var(--hx-color-error-500, #e5493e));\n --hx-badge-color: var(--hx-badge-error-color, var(--hx-color-text-on-error, #0d1825));\n --hx-badge-pulse-color-internal: var(\n --hx-badge-pulse-color,\n var(--hx-badge-error-bg, var(--hx-color-error-500, #e5493e))\n );\n }\n\n .badge--neutral {\n --hx-badge-bg: var(--hx-badge-neutral-bg, var(--hx-color-neutral-200, #d6dbd5));\n --hx-badge-color: var(--hx-badge-neutral-color, var(--hx-color-neutral-700, #313e4b));\n --hx-badge-pulse-color-internal: var(\n --hx-badge-pulse-color,\n var(--hx-badge-neutral-bg, var(--hx-color-neutral-200, #d6dbd5))\n );\n }\n\n .badge--info {\n --hx-badge-bg: var(--hx-badge-info-bg, var(--hx-color-info-700, #0e5997));\n --hx-badge-color: var(--hx-badge-info-color, var(--hx-color-neutral-0, #ffffff));\n --hx-badge-pulse-color-internal: var(\n --hx-badge-pulse-color,\n var(--hx-badge-info-bg, var(--hx-color-info-700, #0e5997))\n );\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 all inner content in dot mode — the dot is purely visual */\n .badge--dot ::slotted(*),\n .badge--dot slot,\n .badge--dot slot[name='prefix'] {\n display: none !important;\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-internal, 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.25rem);\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, 2px);\n }\n\n /* ─── Forced Colors (Windows High Contrast) ─── */\n\n @media (forced-colors: active) {\n .badge {\n border: 1px solid CanvasText;\n forced-color-adjust: none;\n background-color: Canvas;\n color: CanvasText;\n }\n\n .badge--pulse {\n animation: none;\n }\n\n .badge__remove-button {\n color: ButtonText;\n }\n\n /* Per-semantic-variant forced-colors fallbacks. The visually-hidden\n semantic variant label (.badge__variant-label) keeps AT users\n informed; these blocks restore visual semantic distinction for\n sighted users in HCM where bg/color collapse to system defaults.\n Pattern: distinct border-style per variant. */\n .badge--success {\n border-style: solid;\n border-width: 2px;\n }\n\n .badge--warning {\n border-style: dashed;\n border-width: 2px;\n }\n\n .badge--error {\n border-style: double;\n border-width: 3px;\n }\n\n .badge--info {\n border-style: dotted;\n border-width: 2px;\n }\n }\n\n /* hx-icon glyph sizing for the migrated remove-button SVG. */\n .badge__remove-glyph {\n --hx-icon-size: 10px;\n }\n`;\n","import { 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 '../hx-icon/hx-icon.js';\nimport { HelixElement } from '../../base/index.js';\nimport { helixBadgeStyles } from './hx-badge.styles.js';\nimport { forcedColorsSurface } from '../../styles/forced-colors.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 * @cssprop [--hx-space-1] - Spacing token.\n * @cssprop [--hx-border-radius-md] - CSS custom property.\n * @cssprop [--hx-color-primary-500] - Color.\n * @cssprop [--hx-color-neutral-0] - Color.\n * @cssprop [--hx-font-family-sans] - Font family.\n * @cssprop [--hx-font-weight-semibold] - Font weight.\n * @cssprop [--hx-line-height-tight] - Line height.\n * @cssprop [--hx-font-size-2xs] - Font size.\n * @cssprop [--hx-space-0-5] - Spacing token.\n * @cssprop [--hx-space-1-5] - Spacing token.\n * @cssprop [--hx-font-size-xs] - Font size.\n * @cssprop [--hx-space-2] - Spacing token.\n * @cssprop [--hx-font-size-sm] - Font size.\n * @cssprop [--hx-space-3] - Spacing token.\n * @cssprop [--hx-badge-pulse-color-internal] - Color.\n * @cssprop [--hx-color-neutral-100] - Color.\n * @cssprop [--hx-color-neutral-700] - Color.\n * @cssprop [--hx-color-success-700] - Color.\n * @cssprop [--hx-color-warning-500] - Color.\n * @cssprop [--hx-color-neutral-900] - Color.\n * @cssprop [--hx-color-error-500] - Color.\n * @cssprop [--hx-color-neutral-200] - Color.\n * @cssprop [--hx-color-info-700] - Color.\n * @cssprop [--hx-border-radius-full] - CSS custom property.\n * @cssprop [--hx-opacity-75] - Opacity.\n * @cssprop [--hx-badge-pulse-duration=var(--hx-duration-slow)] - CSS custom property.\n * @cssprop [--hx-duration-slow] - Animation duration.\n * @cssprop [--hx-badge-pulse-easing=var(--hx-easing-in-out)] - CSS custom property.\n * @cssprop [--hx-easing-in-out] - CSS custom property.\n * @cssprop [--hx-border-radius-sm] - CSS custom property.\n * @cssprop [--hx-touch-target-min] - Minimum touch target size.\n * @cssprop [--hx-opacity-100] - Opacity.\n * @cssprop [--hx-focus-ring-color] - Color.\n * @cssprop [--hx-focus-ring-width] - Width.\n * @cssprop [--hx-focus-ring-offset] - CSS custom property.\n */\n@customElement('hx-badge')\nexport class HelixBadge extends HelixElement {\n static override styles = [helixBadgeStyles, forcedColorsSurface];\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 <hx-icon\n class=\"badge__remove-glyph\"\n library=\"helix\"\n name=\"close\"\n aria-hidden=\"true\"\n ></hx-icon>\n </button>`\n : nothing}\n </span>\n `;\n }\n}\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","HelixElement","legacySize","e","nodes","node","hasCount","isDot","classes","variantLabel","html","classMap","nothing","forcedColorsSurface","__decorateClass","property","state","customElement"],"mappings":";;;;;AAEO,MAAMA,IAAmBC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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"}
@@ -1,9 +1,9 @@
1
- import { css as d, html as t, nothing as b } from "lit";
2
- import { property as o, customElement as v } from "lit/decorators.js";
3
- import { classMap as f } from "lit/directives/class-map.js";
4
- import { ifDefined as u } from "lit/directives/if-defined.js";
5
- import { a as p } from "./forced-colors-CTEDFRGa.js";
6
- import { H as x } from "./helix-element-BNEYeiys.js";
1
+ import { css as d, html as s, nothing as b } from "lit";
2
+ import { property as o, customElement as f } from "lit/decorators.js";
3
+ import { classMap as p } from "lit/directives/class-map.js";
4
+ import { ifDefined as x } from "lit/directives/if-defined.js";
5
+ import { a as v } from "./forced-colors-CTEDFRGa.js";
6
+ import { H as u } from "./helix-element-BNEYeiys.js";
7
7
  const g = d`
8
8
  :host {
9
9
  display: block;
@@ -65,10 +65,8 @@ const g = d`
65
65
  color: var(--hx-banner-icon-color, var(--hx-color-info-500, #0c8beb));
66
66
  }
67
67
 
68
- .banner__icon svg {
69
- width: var(--hx-space-5, 1.25rem);
70
- height: var(--hx-space-5, 1.25rem);
71
- fill: currentColor;
68
+ .banner__icon .banner__glyph {
69
+ --hx-icon-size: var(--hx-space-5, 1.25rem);
72
70
  }
73
71
 
74
72
  /* ─── Message ─── */
@@ -148,10 +146,8 @@ const g = d`
148
146
  opacity: 1;
149
147
  }
150
148
 
151
- .banner__close-button svg {
152
- width: var(--hx-space-4, 1rem);
153
- height: var(--hx-space-4, 1rem);
154
- fill: currentColor;
149
+ .banner__close-button .banner__glyph {
150
+ --hx-icon-size: var(--hx-space-4, 1rem);
155
151
  }
156
152
 
157
153
  /* ─── Variant: info ─── */
@@ -226,12 +222,12 @@ const g = d`
226
222
  }
227
223
  }
228
224
  `;
229
- var m = Object.defineProperty, _ = Object.getOwnPropertyDescriptor, r = (n, i, s, l) => {
230
- for (var a = l > 1 ? void 0 : l ? _(i, s) : i, c = n.length - 1, h; c >= 0; c--)
231
- (h = n[c]) && (a = (l ? h(i, s, a) : h(a)) || a);
232
- return l && a && m(i, s, a), a;
225
+ var m = Object.defineProperty, _ = Object.getOwnPropertyDescriptor, n = (r, i, a, l) => {
226
+ for (var t = l > 1 ? void 0 : l ? _(i, a) : i, c = r.length - 1, h; c >= 0; c--)
227
+ (h = r[c]) && (t = (l ? h(i, a, t) : h(t)) || t);
228
+ return l && t && m(i, a, t), t;
233
229
  };
234
- let e = class extends x {
230
+ let e = class extends u {
235
231
  constructor() {
236
232
  super(...arguments), this.variant = "info", this.position = "sticky", this.dismissible = !1, this.heading = "", this.actionLabel = "", this.actionHref = "", this.open = !0, this.labelClose = "Dismiss banner";
237
233
  }
@@ -275,63 +271,28 @@ let e = class extends x {
275
271
  connectedCallback() {
276
272
  super.connectedCallback(), this._internals.role = this._role, this.setAttribute("role", this._role), this.open || this.setAttribute("aria-hidden", "true");
277
273
  }
278
- updated(n) {
279
- super.updated(n), n.has("variant") && (this._internals.role = this._role, this.setAttribute("role", this._role)), n.has("open") && (this.open ? this.removeAttribute("aria-hidden") : this.setAttribute("aria-hidden", "true"));
274
+ updated(r) {
275
+ super.updated(r), r.has("variant") && (this._internals.role = this._role, this.setAttribute("role", this._role)), r.has("open") && (this.open ? this.removeAttribute("aria-hidden") : this.setAttribute("aria-hidden", "true"));
280
276
  }
281
277
  // ─── Default Icons ───
282
278
  /** @internal */
283
- _renderInfoIcon() {
284
- return t`<svg viewBox="0 0 20 20" aria-hidden="true">
285
- <path
286
- 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"
287
- />
288
- </svg>`;
289
- }
290
- /** @internal */
291
- _renderSuccessIcon() {
292
- return t`<svg viewBox="0 0 20 20" aria-hidden="true">
293
- <path
294
- 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"
295
- />
296
- </svg>`;
297
- }
298
- /** @internal */
299
- _renderWarningIcon() {
300
- return t`<svg viewBox="0 0 20 20" aria-hidden="true">
301
- <path
302
- 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"
303
- />
304
- </svg>`;
305
- }
306
- /** @internal */
307
- _renderErrorIcon() {
308
- return t`<svg viewBox="0 0 20 20" aria-hidden="true">
309
- <path
310
- 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"
311
- />
312
- </svg>`;
313
- }
314
- /** @internal */
315
279
  _renderDefaultIcon() {
316
- switch (this.variant) {
317
- case "success":
318
- return this._renderSuccessIcon();
319
- case "warning":
320
- return this._renderWarningIcon();
321
- case "error":
322
- return this._renderErrorIcon();
323
- case "info":
324
- default:
325
- return this._renderInfoIcon();
326
- }
280
+ const r = this.variant === "info" ? "info" : this.variant;
281
+ return s`<hx-icon
282
+ class="banner__glyph"
283
+ library="helix"
284
+ name=${r}
285
+ aria-hidden="true"
286
+ ></hx-icon>`;
327
287
  }
328
288
  /** @internal */
329
289
  _renderCloseIcon() {
330
- return t`<svg viewBox="0 0 20 20" aria-hidden="true">
331
- <path
332
- 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"
333
- />
334
- </svg>`;
290
+ return s`<hx-icon
291
+ class="banner__glyph"
292
+ library="helix"
293
+ name="close"
294
+ aria-hidden="true"
295
+ ></hx-icon>`;
335
296
  }
336
297
  // ─── Public Methods ───
337
298
  /**
@@ -353,30 +314,30 @@ let e = class extends x {
353
314
  }
354
315
  // ─── Render ───
355
316
  render() {
356
- const n = {
317
+ const r = {
357
318
  banner: !0,
358
319
  [`banner--${this.variant}`]: !0
359
- }, i = this.actionLabel.length > 0 && this.actionHref.length > 0, s = this._effectiveSeverityLabel;
360
- return t`
361
- <div part="banner" class=${f(n)}>
362
- <span class="banner__severity-label">${s}</span>
320
+ }, i = this.actionLabel.length > 0 && this.actionHref.length > 0, a = this._effectiveSeverityLabel;
321
+ return s`
322
+ <div part="banner" class=${p(r)}>
323
+ <span class="banner__severity-label">${a}</span>
363
324
  <div part="icon" class="banner__icon">${this._renderDefaultIcon()}</div>
364
325
 
365
326
  <div part="message" class="banner__message">
366
327
  <slot></slot>
367
328
  </div>
368
329
 
369
- ${i ? t`
330
+ ${i ? s`
370
331
  <a
371
332
  part="action"
372
333
  class="banner__action"
373
- href=${u(this.actionHref || void 0)}
334
+ href=${x(this.actionHref || void 0)}
374
335
  aria-label=${this.heading ? `${this.actionLabel}: ${this.heading}` : this.actionLabel}
375
336
  >
376
337
  <slot name="action">${this.actionLabel}</slot>
377
338
  </a>
378
339
  ` : b}
379
- ${this.dismissible ? t`
340
+ ${this.dismissible ? s`
380
341
  <button
381
342
  part="close-button"
382
343
  class="banner__close-button"
@@ -390,38 +351,38 @@ let e = class extends x {
390
351
  `;
391
352
  }
392
353
  };
393
- e.styles = [g, p];
394
- r([
354
+ e.styles = [g, v];
355
+ n([
395
356
  o({ type: String, reflect: !0 })
396
357
  ], e.prototype, "variant", 2);
397
- r([
358
+ n([
398
359
  o({ type: String, reflect: !0 })
399
360
  ], e.prototype, "position", 2);
400
- r([
361
+ n([
401
362
  o({ type: Boolean, reflect: !0 })
402
363
  ], e.prototype, "dismissible", 2);
403
- r([
364
+ n([
404
365
  o({ type: String })
405
366
  ], e.prototype, "heading", 2);
406
- r([
367
+ n([
407
368
  o({ type: String, attribute: "action-label" })
408
369
  ], e.prototype, "actionLabel", 2);
409
- r([
370
+ n([
410
371
  o({ type: String, attribute: "action-href" })
411
372
  ], e.prototype, "actionHref", 2);
412
- r([
373
+ n([
413
374
  o({ type: Boolean, reflect: !0 })
414
375
  ], e.prototype, "open", 2);
415
- r([
376
+ n([
416
377
  o({ type: String, attribute: "label-close" })
417
378
  ], e.prototype, "labelClose", 2);
418
- r([
379
+ n([
419
380
  o({ attribute: "severity-label" })
420
381
  ], e.prototype, "severityLabel", 2);
421
- e = r([
422
- v("hx-banner")
382
+ e = n([
383
+ f("hx-banner")
423
384
  ], e);
424
385
  export {
425
386
  e as H
426
387
  };
427
- //# sourceMappingURL=hx-banner-fpRnciIO.js.map
388
+ //# sourceMappingURL=hx-banner-PbHwFNSb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hx-banner-PbHwFNSb.js","sources":["../../src/components/hx-banner/hx-banner.styles.ts","../../src/components/hx-banner/hx-banner.ts"],"sourcesContent":["import { css } from 'lit';\n\n/**\n * hx-banner styles.\n *\n * Component-tier tokens with two-level var() fallback:\n * var(--hx-banner-{prop}, var(--hx-color-{semantic}, #hex))\n * Inner hex fallbacks track the \"precision cool\" palette (3.2.0):\n * info-50 = #EFF6FE, info-200 = #BEDCFC, info-500 = #0C8BEB, info-800 = #064172,\n * success-50 = #EAFAEC, success-200 = #BAE6C2, success-500 = #3B9E58, success-800 = #0B4D23,\n * warning-50 = #FFF3EA, warning-200 = #FACFAE, warning-500 = #C2711C, warning-800 = #603301,\n * error-50 = #FFF2F0, error-200 = #FCCBC4, error-500 = #E5493E, error-800 = #7A090A,\n * primary-400 = #6AB1B1.\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, #eff6fe));\n color: var(--hx-banner-color, var(--hx-color-info-800, #064172));\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, #bedcfc));\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, #0c8beb));\n }\n\n .banner__icon .banner__glyph {\n --hx-icon-size: var(--hx-space-5, 1.25rem);\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, #064172)));\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-banner-action-focus-ring-color, var(--hx-focus-ring-color, #0f7078));\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, #064172));\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-banner-close-btn-focus-ring-color, var(--hx-focus-ring-color, #0f7078));\n outline-offset: var(--hx-focus-ring-offset, 2px);\n opacity: 1;\n }\n\n .banner__close-button .banner__glyph {\n --hx-icon-size: var(--hx-space-4, 1rem);\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, #eff6fe);\n --hx-banner-border-color: var(--hx-color-info-200, #bedcfc);\n --hx-banner-color: var(--hx-color-info-800, #064172);\n --hx-banner-icon-color: var(--hx-color-info-500, #0c8beb);\n }\n\n /* ─── Variant: success ─── */\n\n :host([variant='success']) .banner {\n --hx-banner-bg: var(--hx-color-success-50, #eafaec);\n --hx-banner-border-color: var(--hx-color-success-200, #bae6c2);\n --hx-banner-color: var(--hx-color-success-800, #0b4d23);\n --hx-banner-icon-color: var(--hx-color-success-500, #3b9e58);\n }\n\n /* ─── Variant: warning ─── */\n\n :host([variant='warning']) .banner {\n --hx-banner-bg: var(--hx-color-warning-50, #fff3ea);\n --hx-banner-border-color: var(--hx-color-warning-200, #facfae);\n --hx-banner-color: var(--hx-color-warning-800, #603301);\n --hx-banner-icon-color: var(--hx-color-warning-500, #c2711c);\n }\n\n /* ─── Variant: error ─── */\n\n :host([variant='error']) .banner {\n --hx-banner-bg: var(--hx-color-error-50, #fff2f0);\n --hx-banner-border-color: var(--hx-color-error-200, #fccbc4);\n --hx-banner-color: var(--hx-color-error-800, #7a090a);\n --hx-banner-icon-color: var(--hx-color-error-500, #e5493e);\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 /* ─── Forced Colors (Windows High Contrast) ─── */\n /* Belt-and-suspenders: rich per-class HC overrides PLUS the forcedColorsSurface mixin. */\n\n @media (forced-colors: active) {\n .banner {\n border-bottom-color: CanvasText;\n }\n\n .banner__icon svg {\n fill: CanvasText;\n }\n\n .banner__close-button {\n color: ButtonText;\n border: 1px solid ButtonText;\n }\n }\n`;\n","import { 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 '../hx-icon/hx-icon.js';\nimport { HelixElement } from '../../base/index.js';\nimport { helixBannerStyles } from './hx-banner.styles.js';\nimport { forcedColorsSurface } from '../../styles/forced-colors.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// ─── ARIA naming disambiguation (group-6) ───\n//\n// IMPORTANT: the component name `hx-banner` refers to the visual UX pattern\n// (full-width page-level notification surface). It is NOT a semantic mapping\n// to the HTML5 LANDMARK role `role=\"banner\"` (which marks the page-level\n// header/masthead).\n//\n// The ARIA role this component sets on its host is `alert` or `status`,\n// derived from `variant`. A regression test in `hx-banner.test.ts` asserts\n// that `role=\"banner\"` (the LANDMARK role) is NEVER applied. Do NOT \"fix\"\n// this by adding the LANDMARK role.\n//\n// APG caveat: NVDA + JAWS do not announce alerts that are present in the DOM\n// at page-load. A `<hx-banner open>` rendered server-side will not be\n// announced on first paint. Consumers needing first-paint announcement\n// should mount with `open=false` and flip to `open=true` after window load,\n// or use a sticky `hx-alert` instead.\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 * @cssprop [--hx-space-3] - Spacing token.\n * @cssprop [--hx-space-4] - Spacing token.\n * @cssprop [--hx-color-info-50] - Color.\n * @cssprop [--hx-color-info-800] - Color.\n * @cssprop [--hx-border-width-thin] - Width.\n * @cssprop [--hx-color-info-200] - Color.\n * @cssprop [--hx-font-family-sans] - Font family.\n * @cssprop [--hx-font-size-sm] - Font size.\n * @cssprop [--hx-line-height-normal] - Line height.\n * @cssprop [--hx-color-info-500] - Color.\n * @cssprop [--hx-space-5] - Spacing token.\n * @cssprop [--hx-font-weight-semibold] - Font weight.\n * @cssprop [--hx-opacity-90] - Opacity.\n * @cssprop [--hx-focus-ring-width] - Width.\n * @cssprop [--hx-focus-ring-color] - Color.\n * @cssprop [--hx-color-primary-400] - Color.\n * @cssprop [--hx-focus-ring-offset] - CSS custom property.\n * @cssprop [--hx-border-radius-sm] - CSS custom property.\n * @cssprop [--hx-font-size-md] - Font size.\n * @cssprop [--hx-transition-fast] - Transition timing.\n * @cssprop [--hx-opacity-75] - Opacity.\n * @cssprop [--hx-opacity-100] - Opacity.\n * @cssprop [--hx-color-success-50] - Color.\n * @cssprop [--hx-color-success-200] - Color.\n * @cssprop [--hx-color-success-800] - Color.\n * @cssprop [--hx-color-success-500] - Color.\n * @cssprop [--hx-color-warning-50] - Color.\n * @cssprop [--hx-color-warning-200] - Color.\n * @cssprop [--hx-color-warning-800] - Color.\n * @cssprop [--hx-color-warning-500] - Color.\n * @cssprop [--hx-color-error-50] - Color.\n * @cssprop [--hx-color-error-200] - Color.\n * @cssprop [--hx-color-error-800] - Color.\n * @cssprop [--hx-color-error-500] - Color.\n *\n * @aaa-certified 2026-05-09\n * @aaa-criteria 1.4.6, 1.4.9, 2.1.3, 2.3.3, 2.4.12, 2.4.13, 2.5.5, 3.2.5, 3.3.6, forced-colors, apg-keyboard\n * @aaa-audit src/components/hx-banner/AAA-AUDIT.md\n * @keyboard-contract dismiss=Escape\n * @aria-pattern alert\n * @aria-pattern-source https://www.w3.org/WAI/ARIA/apg/patterns/alert/\n * @forced-colors-supported true\n * @stability stable\n * @since 3.7.0\n * @form-associated false\n * @theme-aware true\n * @brand-aware true\n * @drupal-sdc-eligible true\n * @react-wrapper-status complete\n * @figma-component-name hx-banner\n * @priority-tier P0\n * @phi-handles false\n * @clinical-context none\n */\n@customElement('hx-banner')\nexport class HelixBanner extends HelixElement {\n static override styles = [helixBannerStyles, forcedColorsSurface];\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 /**\n * Returns true when the variant requires assertive announcement.\n *\n * (group-6) Harmonized with `hx-alert` and `hx-toast`: only `error` is\n * assertive. Previous behavior also escalated `warning` to assertive on\n * `hx-banner`, which diverged from the rest of the live-region surface.\n * Warnings are non-urgent and use a polite live region (role=\"status\").\n * Critical/error messages remain assertive (role=\"alert\").\n */\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 //\n // (group-6) Dual-write: `internals.role` is the modern IDL-based source of\n // truth; the `role` attribute is retained as a legacy fallback for older AT\n // that don't yet honour ElementInternals ARIA reflection. Per ARIA spec,\n // role implies aria-live (`alert`→assertive, `status`→polite); we therefore\n // do NOT set an explicit `aria-live` attribute (avoids §5.1 double-announce).\n this._internals.role = this._role;\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._internals.role = this._role;\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 _renderDefaultIcon() {\n const name = this.variant === 'info' ? 'info' : this.variant;\n return html`<hx-icon\n class=\"banner__glyph\"\n library=\"helix\"\n name=${name}\n aria-hidden=\"true\"\n ></hx-icon>`;\n }\n\n /** @internal */\n private _renderCloseIcon() {\n return html`<hx-icon\n class=\"banner__glyph\"\n library=\"helix\"\n name=\"close\"\n aria-hidden=\"true\"\n ></hx-icon>`;\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","HelixElement","changedProperties","name","html","classes","hasAction","severityLabel","classMap","ifDefined","nothing","forcedColorsSurface","__decorateClass","property","customElement"],"mappings":"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"}
@@ -2,8 +2,8 @@ import { css as m, nothing as u, html as d } from "lit";
2
2
  import { property as n, state as v, customElement as b } from "lit/decorators.js";
3
3
  import { f } from "./forced-colors-CTEDFRGa.js";
4
4
  import { H as x } from "./helix-element-BNEYeiys.js";
5
- import { c as y } from "./id-counter-DuX8vsui.js";
6
- const g = m`
5
+ import { c as g } from "./id-counter-DuX8vsui.js";
6
+ const y = m`
7
7
  :host {
8
8
  display: block;
9
9
  font-family: var(
@@ -67,15 +67,15 @@ const g = m`
67
67
  }
68
68
  }
69
69
  `;
70
- var _ = Object.defineProperty, L = Object.getOwnPropertyDescriptor, c = (t, e, s, a) => {
71
- for (var r = a > 1 ? void 0 : a ? L(e, s) : e, o = t.length - 1, l; o >= 0; o--)
72
- (l = t[o]) && (r = (a ? l(e, s, r) : l(r)) || r);
70
+ var _ = Object.defineProperty, w = Object.getOwnPropertyDescriptor, c = (t, e, s, a) => {
71
+ for (var r = a > 1 ? void 0 : a ? w(e, s) : e, i = t.length - 1, l; i >= 0; i--)
72
+ (l = t[i]) && (r = (a ? l(e, s, r) : l(r)) || r);
73
73
  return a && r && _(e, s, r), r;
74
74
  };
75
- const w = y("hx-breadcrumb");
76
- let i = class extends x {
75
+ const L = g("hx-breadcrumb");
76
+ let o = class extends x {
77
77
  constructor() {
78
- super(...arguments), this.separator = "/", this.label = "Breadcrumb", this.maxItems = 0, this.labelEllipsis = "Show all breadcrumb items", this.jsonLd = !1, this._showEllipsis = !1, this._jsonLdScript = null, this._managedCurrentItems = /* @__PURE__ */ new WeakSet(), this._jsonLdId = `${w()}-ld`;
78
+ super(...arguments), this.separator = "/", this.label = "Breadcrumb", this.maxItems = 0, this.labelEllipsis = "Show all breadcrumb items", this.jsonLd = !1, this._showEllipsis = !1, this._jsonLdScript = null, this._managedCurrentItems = /* @__PURE__ */ new WeakSet(), this._jsonLdId = `${L()}-ld`;
79
79
  }
80
80
  // ─── Item Helpers ───
81
81
  /**
@@ -103,8 +103,8 @@ let i = class extends x {
103
103
  (s) => s.hasAttribute("current") && !this._managedCurrentItems.has(s)
104
104
  );
105
105
  t.forEach((s, a) => {
106
- const r = s, o = a === t.length - 1;
107
- o ? r.setAttribute("data-bc-last", "") : r.removeAttribute("data-bc-last"), e || (o ? (r.setAttribute("current", ""), this._managedCurrentItems.add(r)) : (r.removeAttribute("current"), this._managedCurrentItems.delete(r)));
106
+ const r = s, i = a === t.length - 1;
107
+ i ? r.setAttribute("data-bc-last", "") : r.removeAttribute("data-bc-last"), e || (i ? (r.setAttribute("current", ""), this._managedCurrentItems.add(r)) : (r.removeAttribute("current"), this._managedCurrentItems.delete(r)));
108
108
  });
109
109
  }
110
110
  // ─── Slot Handling ───
@@ -152,8 +152,8 @@ let i = class extends x {
152
152
  * @internal
153
153
  */
154
154
  _buildListItem(t, e) {
155
- var o;
156
- const s = t.getAttribute("href"), a = ((o = t.textContent) == null ? void 0 : o.trim()) ?? "", r = {
155
+ var i;
156
+ const s = t.getAttribute("href"), a = ((i = t.textContent) == null ? void 0 : i.trim()) ?? "", r = {
157
157
  "@type": "ListItem",
158
158
  position: e,
159
159
  name: a
@@ -202,7 +202,7 @@ let i = class extends x {
202
202
  render() {
203
203
  return d`
204
204
  <nav part="nav" aria-label=${this.label}>
205
- <ol part="list">
205
+ <div part="list" role="list">
206
206
  <slot @slotchange=${this._handleSlotChange}></slot>
207
207
  ${this._showEllipsis ? d`
208
208
  <hx-breadcrumb-item class="hx-bc-ellipsis">
@@ -215,7 +215,7 @@ let i = class extends x {
215
215
  </button>
216
216
  </hx-breadcrumb-item>
217
217
  ` : u}
218
- </ol>
218
+ </div>
219
219
  </nav>
220
220
  <slot
221
221
  name="separator"
@@ -225,28 +225,28 @@ let i = class extends x {
225
225
  `;
226
226
  }
227
227
  };
228
- i.styles = [g, f];
228
+ o.styles = [y, f];
229
229
  c([
230
230
  n({ type: String })
231
- ], i.prototype, "separator", 2);
231
+ ], o.prototype, "separator", 2);
232
232
  c([
233
233
  n({ type: String })
234
- ], i.prototype, "label", 2);
234
+ ], o.prototype, "label", 2);
235
235
  c([
236
236
  n({ type: Number, attribute: "max-items" })
237
- ], i.prototype, "maxItems", 2);
237
+ ], o.prototype, "maxItems", 2);
238
238
  c([
239
239
  n({ attribute: "label-ellipsis" })
240
- ], i.prototype, "labelEllipsis", 2);
240
+ ], o.prototype, "labelEllipsis", 2);
241
241
  c([
242
242
  n({ type: Boolean, attribute: "json-ld" })
243
- ], i.prototype, "jsonLd", 2);
243
+ ], o.prototype, "jsonLd", 2);
244
244
  c([
245
245
  v()
246
- ], i.prototype, "_showEllipsis", 2);
247
- i = c([
246
+ ], o.prototype, "_showEllipsis", 2);
247
+ o = c([
248
248
  b("hx-breadcrumb")
249
- ], i);
249
+ ], o);
250
250
  const C = m`
251
251
  :host {
252
252
  display: inline-flex;
@@ -265,7 +265,20 @@ const C = m`
265
265
  }
266
266
 
267
267
  [part='link'] {
268
- color: var(--hx-breadcrumb-link-color, var(--hx-color-primary-600, #0f7078));
268
+ /*
269
+ * AAA 2.5.5 Target Size (Enhanced) — links rendered as inline text
270
+ * default to ~17px tall, well below the 44×44 AAA bar. Use
271
+ * inline-flex + min-height + vertical padding to grow the
272
+ * interactive area to ≥44×44 without enlarging the visible text.
273
+ * The padding is symmetrical so the visible label stays vertically
274
+ * centered against adjacent separators.
275
+ */
276
+ display: inline-flex;
277
+ align-items: center;
278
+ min-height: var(--hx-breadcrumb-link-min-height, var(--hx-touch-target-min, 44px));
279
+ padding-block: var(--hx-breadcrumb-link-padding-y, var(--hx-space-2, 0.5rem));
280
+ padding-inline: var(--hx-breadcrumb-link-padding-x, var(--hx-space-1, 0.25rem));
281
+ color: var(--hx-breadcrumb-link-color, var(--hx-color-text-link, #0f6363));
269
282
  text-decoration: none;
270
283
  cursor: pointer;
271
284
  font-family: inherit;
@@ -277,7 +290,7 @@ const C = m`
277
290
  }
278
291
 
279
292
  [part='link']:hover {
280
- color: var(--hx-breadcrumb-link-hover-color, var(--hx-color-primary-700, #0f6363));
293
+ color: var(--hx-breadcrumb-link-hover-color, var(--hx-color-text-link-hover, #07494a));
281
294
  text-decoration: underline;
282
295
  }
283
296
 
@@ -334,12 +347,12 @@ const C = m`
334
347
  }
335
348
  }
336
349
  `;
337
- var I = Object.defineProperty, S = Object.getOwnPropertyDescriptor, h = (t, e, s, a) => {
338
- for (var r = a > 1 ? void 0 : a ? S(e, s) : e, o = t.length - 1, l; o >= 0; o--)
339
- (l = t[o]) && (r = (a ? l(e, s, r) : l(r)) || r);
340
- return a && r && I(e, s, r), r;
350
+ var S = Object.defineProperty, I = Object.getOwnPropertyDescriptor, p = (t, e, s, a) => {
351
+ for (var r = a > 1 ? void 0 : a ? I(e, s) : e, i = t.length - 1, l; i >= 0; i--)
352
+ (l = t[i]) && (r = (a ? l(e, s, r) : l(r)) || r);
353
+ return a && r && S(e, s, r), r;
341
354
  };
342
- let p = class extends x {
355
+ let h = class extends x {
343
356
  constructor() {
344
357
  super(...arguments), this.href = void 0, this.dataBcLast = !1, this.current = !1;
345
358
  }
@@ -348,28 +361,28 @@ let p = class extends x {
348
361
  }
349
362
  render() {
350
363
  return d`
351
- <span part="item">
364
+ <span part="item" role="listitem">
352
365
  ${this.current ? d`<span part="text" aria-current="page"><slot></slot></span>` : this.href ? d`<a part="link" href=${this.href}><slot></slot></a>` : d`<span part="text"><slot></slot></span>`}
353
366
  </span>
354
367
  ${this.dataBcLast ? u : d`<span class="separator" part="separator" aria-hidden="true"></span>`}
355
368
  `;
356
369
  }
357
370
  };
358
- p.styles = [C, f];
359
- h([
371
+ h.styles = [C, f];
372
+ p([
360
373
  n({ type: String, reflect: !0 })
361
- ], p.prototype, "href", 2);
362
- h([
374
+ ], h.prototype, "href", 2);
375
+ p([
363
376
  n({ type: Boolean, attribute: "data-bc-last", reflect: !0 })
364
- ], p.prototype, "dataBcLast", 2);
365
- h([
377
+ ], h.prototype, "dataBcLast", 2);
378
+ p([
366
379
  n({ type: Boolean, reflect: !0 })
367
- ], p.prototype, "current", 2);
368
- p = h([
380
+ ], h.prototype, "current", 2);
381
+ h = p([
369
382
  b("hx-breadcrumb-item")
370
- ], p);
383
+ ], h);
371
384
  export {
372
- i as H,
373
- p as a
385
+ o as H,
386
+ h as a
374
387
  };
375
- //# sourceMappingURL=hx-breadcrumb-item-3tKppF9h.js.map
388
+ //# sourceMappingURL=hx-breadcrumb-item-D8xYqe3s.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hx-breadcrumb-item-D8xYqe3s.js","sources":["../../src/components/hx-breadcrumb/hx-breadcrumb.styles.ts","../../src/components/hx-breadcrumb/hx-breadcrumb.ts","../../src/components/hx-breadcrumb/hx-breadcrumb-item.styles.ts","../../src/components/hx-breadcrumb/hx-breadcrumb-item.ts"],"sourcesContent":["import { css } from 'lit';\n\nexport const helixBreadcrumbStyles = css`\n :host {\n display: block;\n font-family: var(\n --hx-breadcrumb-font-family,\n var(--hx-font-family-sans, system-ui, sans-serif)\n );\n font-size: var(--hx-breadcrumb-font-size, var(--hx-font-size-sm, 0.875rem));\n }\n\n [part='nav'] {\n /* nav landmark — no additional styling needed */\n }\n\n [part='list'] {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n list-style: none;\n margin: 0;\n padding: 0;\n gap: 0;\n }\n\n /* Hide middle items when collapsed via maxItems */\n ::slotted([data-bc-hidden]) {\n display: none;\n }\n\n /*\n * Ellipsis ordering when collapsed (FS-014 fix):\n * The ellipsis <hx-breadcrumb-item> lives in shadow DOM to avoid mutating\n * the consumer's light DOM. CSS order places it between the first item\n * (order: 0, default) and the last item (order: 2) in the flex <ol>.\n */\n .hx-bc-ellipsis {\n order: 1;\n }\n\n ::slotted([data-bc-last]) {\n order: 2;\n }\n\n /* Visually hide the separator slot — used only to read text content.\n * display:none is intentional: the slot contains no interactive or focusable\n * content. If a future change adds focusable elements to this slot, switch to\n * visibility:hidden + position:absolute to preserve focus reachability. */\n .separator-slot {\n display: none;\n }\n\n /* ─── High Contrast Mode (forced-colors) ─── */\n\n /*\n * hx-breadcrumb is a nav container. Link colors and separators are handled\n * by hx-breadcrumb-item's own forced-colors block. No additional overrides needed\n * at the container level.\n */\n @media (forced-colors: active) {\n :host {\n forced-color-adjust: auto;\n }\n }\n`;\n","import { html, nothing, type PropertyValues } from 'lit';\nimport '../../utilities/document-token-adoption.js';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { HelixElement, createIdCounter } from '../../base/index.js';\nimport { forcedColorsInteractive } from '../../styles/forced-colors.js';\nimport { helixBreadcrumbStyles } from './hx-breadcrumb.styles.js';\n\n/** Typed schema.org ListItem entry for JSON-LD BreadcrumbList structured data. */\ninterface JsonLdListItem {\n '@type': string;\n position: number;\n name: string;\n item?: string;\n}\n\nconst _nextBreadcrumbId = createIdCounter('hx-breadcrumb');\n\n/**\n * Hierarchical page path navigation showing current location in site structure.\n *\n * @summary Navigation breadcrumb showing the page hierarchy. Works with Drupal's breadcrumb system.\n *\n * @tag hx-breadcrumb\n *\n * @slot - Default slot for hx-breadcrumb-item children.\n * @slot separator - Optional separator element. Its text content overrides the `separator` property.\n *\n * @csspart nav - The nav landmark element.\n * @csspart list - The ordered list containing items.\n *\n * @cssprop [--hx-breadcrumb-separator-content='/'] - Separator character between items.\n * NOTE: If overriding this custom property directly in CSS (rather than via the `separator`\n * attribute), the value MUST be quoted: `--hx-breadcrumb-separator-content: \">\"`. An unquoted\n * value is invalid for the CSS `content` property and will silently render nothing.\n * @cssprop [--hx-breadcrumb-separator-color=var(--hx-color-neutral-400)] - Separator color.\n * @cssprop [--hx-breadcrumb-separator-gap=var(--hx-space-1)] - Horizontal gap around separators.\n * @cssprop [--hx-breadcrumb-font-size=var(--hx-font-size-sm)] - Font size.\n * @cssprop [--hx-breadcrumb-link-color=var(--hx-color-primary-600)] - Link color.\n * @cssprop [--hx-breadcrumb-link-hover-color=var(--hx-color-primary-700)] - Link hover color.\n * @cssprop [--hx-breadcrumb-text-color=var(--hx-color-neutral-700)] - Current page text color.\n * @cssprop [--hx-breadcrumb-item-max-width] - Max-width for item text truncation (e.g. `12rem`).\n * @cssprop [--hx-breadcrumb-font-family] - CSS custom property.\n * @cssprop [--hx-font-family-sans] - Font family.\n * @cssprop [--hx-font-size-sm] - Font size.\n * @aaa-certified 2026-05-08\n * @aaa-criteria 1.4.6, 1.4.9, 2.1.3, 2.3.3, 2.4.12, 2.4.13, 2.5.5, 3.2.5, 3.3.6, forced-colors, apg-keyboard\n * @aaa-audit src/components/hx-breadcrumb/AAA-AUDIT.md\n * @keyboard-contract navigate=Arrow\n * @aria-pattern breadcrumb\n * @aria-pattern-source https://www.w3.org/WAI/ARIA/apg/patterns/breadcrumb/\n * @forced-colors-supported true\n * @stability stable\n * @since 3.7.0\n * @form-associated false\n * @theme-aware true\n * @brand-aware true\n * @drupal-sdc-eligible true\n * @react-wrapper-status complete\n * @figma-component-name hx-breadcrumb\n * @priority-tier P0\n * @phi-handles false\n * @clinical-context none\n */\n@customElement('hx-breadcrumb')\nexport class HelixBreadcrumb extends HelixElement {\n static override styles = [helixBreadcrumbStyles, forcedColorsInteractive];\n\n /**\n * The separator character displayed between breadcrumb items.\n * @attr separator\n */\n @property({ type: String })\n separator = '/';\n\n /**\n * The accessible label for the nav landmark.\n * @attr label\n */\n @property({ type: String })\n label = 'Breadcrumb';\n\n /**\n * Maximum number of items to show before collapsing middle items with an ellipsis.\n * Set to 0 (default) to show all items. The ellipsis is a keyboard-accessible\n * button; activating it expands the full breadcrumb by setting maxItems to 0.\n * @attr max-items\n */\n @property({ type: Number, attribute: 'max-items' })\n maxItems = 0;\n\n /**\n * Accessible label for the expand ellipsis button. Override for i18n.\n * @attr label-ellipsis\n */\n @property({ attribute: 'label-ellipsis' }) labelEllipsis = 'Show all breadcrumb items';\n\n /**\n * When true, injects a JSON-LD BreadcrumbList structured data script into the document head.\n *\n * NOTE: Drupal manages `<head>` content via its own render pipeline. Injecting a\n * `<script>` directly via `document.head.appendChild()` in a Drupal context:\n * 1. Bypasses Drupal's deduplication and `hook_html_head_alter()` hook.\n * 2. Is not cacheable by Drupal's page cache.\n * 3. Will be wiped on BigPipe partial page replacements.\n *\n * For Drupal integrations, leave `json-ld` false and use the structured data\n * Twig template instead (see `hx-breadcrumb.twig` in the component directory).\n *\n * @attr json-ld\n */\n @property({ type: Boolean, attribute: 'json-ld' })\n jsonLd = false;\n\n /**\n * Whether the ellipsis expand button is currently shown (shadow DOM rendered).\n * Driven by maxItems collapse logic; replaces the old light-DOM ellipsis injection.\n * @internal\n */\n @state() private _showEllipsis = false;\n /** @internal */\n private _jsonLdScript: HTMLScriptElement | null = null;\n\n /**\n * Tracks which items had their `current` attribute set by this component\n * (as opposed to set by a consumer/Drupal template). This lets us re-evaluate\n * positional current-page detection on each slotchange without incorrectly\n * treating a previously component-set `current` attribute as a consumer-set\n * explicit override.\n * @internal\n */\n private readonly _managedCurrentItems = new WeakSet<Element>();\n\n /**\n * Stable per-instance ID used to tag the injected script element so that\n * multiple hx-breadcrumb instances on the same page don't produce conflicting\n * or duplicate structured-data blocks. Each instance owns exactly one script\n * tag identified by this ID; any stale tag from a previous render cycle is\n * removed before a new one is inserted.\n *\n * Uses a static counter (not Math.random()) so IDs are deterministic across\n * server and client renders, enabling SSR hydration matching.\n * @internal\n */\n private readonly _jsonLdId = `${_nextBreadcrumbId()}-ld`;\n\n // ─── Item Helpers ───\n\n /**\n * Returns only real breadcrumb items, excluding the managed ellipsis element.\n * @internal\n */\n private _getBreadcrumbItems(slot: HTMLSlotElement): Element[] {\n return slot\n .assignedElements({ flatten: true })\n .filter(\n (el) =>\n el.tagName.toLowerCase() === 'hx-breadcrumb-item' &&\n !el.classList.contains('hx-bc-ellipsis'),\n );\n }\n\n /**\n * Applies aria/state attributes to the item list.\n *\n * Current-page detection: if any item has an explicit `current` attribute\n * (e.g. set by a Drupal Twig template), that item is treated as the current\n * page. Otherwise the last item is the current page (default behaviour).\n *\n * This separation allows Drupal to control current-page marking without\n * relying on item order.\n * @internal\n */\n private _applyItemAttributes(items: Element[]): void {\n // Detect consumer-set 'current' attributes. An item has an explicit consumer\n // current if it has the 'current' attribute AND the component did not set it\n // (tracked via _managedCurrentItems). This prevents component-managed state\n // from being misread as a consumer override on subsequent slotchange events.\n const hasExplicitCurrent = items.some(\n (el) => el.hasAttribute('current') && !this._managedCurrentItems.has(el),\n );\n\n items.forEach((item, i) => {\n const el = item as HTMLElement;\n const isLast = i === items.length - 1;\n\n // Separator hiding: always positional — last item has no trailing separator.\n if (isLast) {\n el.setAttribute('data-bc-last', '');\n } else {\n el.removeAttribute('data-bc-last');\n }\n\n // Current-page marker: explicit consumer attribute wins over positional last.\n // The item component renders aria-current=\"page\" on its inner element\n // based on this attribute (see hx-breadcrumb-item.ts).\n if (!hasExplicitCurrent) {\n if (isLast) {\n el.setAttribute('current', '');\n this._managedCurrentItems.add(el);\n } else {\n el.removeAttribute('current');\n this._managedCurrentItems.delete(el);\n }\n }\n // When hasExplicitCurrent is true, leave 'current' attributes as-is so\n // consumer or Drupal template markup is not overridden.\n });\n }\n\n // ─── Slot Handling ───\n\n /** @internal */\n private _handleSlotChange(e: Event): void {\n if (!(e.target instanceof HTMLSlotElement)) return;\n const items = this._getBreadcrumbItems(e.target);\n\n // Handle collapse behaviour\n if (this.maxItems > 0 && items.length > this.maxItems) {\n this._applyCollapse(items);\n } else {\n this._removeCollapse(items);\n }\n\n this._applyItemAttributes(items);\n\n if (this.jsonLd) {\n this._updateJsonLd(items);\n }\n }\n\n /** @internal */\n private _handleSeparatorSlotChange(e: Event): void {\n if (!(e.target instanceof HTMLSlotElement)) return;\n const assigned = e.target.assignedElements({ flatten: true });\n if (assigned.length > 0) {\n const text = (assigned[0] as HTMLElement).textContent?.trim() ?? '';\n this.style.setProperty('--hx-breadcrumb-separator-content', JSON.stringify(text));\n }\n }\n\n // ─── Collapse ───\n\n /** @internal */\n private _applyCollapse(items: Element[]): void {\n // Show only first and last; hide all middle items via data attribute.\n // The ellipsis is rendered in shadow DOM (see render()) to avoid mutating\n // the consumer's light DOM structure (FS-014).\n items.forEach((item, i) => {\n const el = item as HTMLElement;\n if (i === 0 || i === items.length - 1) {\n el.removeAttribute('data-bc-hidden');\n } else {\n el.setAttribute('data-bc-hidden', '');\n }\n });\n\n this._showEllipsis = true;\n }\n\n /** @internal */\n private _removeCollapse(items: Element[]): void {\n items.forEach((item) => {\n (item as HTMLElement).removeAttribute('data-bc-hidden');\n });\n\n this._showEllipsis = false;\n }\n\n /**\n * Expands a collapsed breadcrumb by resetting maxItems to 0.\n * Called by the ellipsis expand button (click or Enter/Space).\n * @internal\n */\n private _expandBreadcrumb(): void {\n this.maxItems = 0;\n // updated() will detect the maxItems change and call _removeCollapse.\n }\n\n // ─── JSON-LD ───\n\n /**\n * JSON-LD ListItem entry with typed fields to avoid Record<string, unknown>.\n * @internal\n */\n private _buildListItem(item: Element, position: number): JsonLdListItem {\n const href = (item as HTMLElement).getAttribute('href');\n const name = (item as HTMLElement).textContent?.trim() ?? '';\n const entry: JsonLdListItem = {\n '@type': 'ListItem',\n position,\n name,\n };\n if (href) entry.item = href;\n return entry;\n }\n\n /** @internal */\n private _updateJsonLd(items: Element[]): void {\n const schema = {\n '@context': 'https://schema.org',\n '@type': 'BreadcrumbList',\n itemListElement: items.map((item, i) => this._buildListItem(item, i + 1)),\n };\n\n // Guard for SSR — document is unavailable server-side\n if (typeof document === 'undefined') return;\n\n if (!this._jsonLdScript) {\n // Dedup guard: remove any stale script with this instance's ID before\n // creating a fresh one. This handles the edge case where the element was\n // reconnected to the DOM after being disconnected without the script\n // reference being re-established.\n document.getElementById(this._jsonLdId)?.remove();\n\n this._jsonLdScript = document.createElement('script');\n this._jsonLdScript.type = 'application/ld+json';\n this._jsonLdScript.id = this._jsonLdId;\n this._jsonLdScript.setAttribute('data-hx-breadcrumb', '');\n document.head.appendChild(this._jsonLdScript);\n }\n\n this._jsonLdScript.textContent = JSON.stringify(schema);\n }\n\n /** @internal */\n private _removeJsonLd(): void {\n this._jsonLdScript?.remove();\n this._jsonLdScript = null;\n }\n\n // ─── Lifecycle ───\n\n override connectedCallback(): void {\n super.connectedCallback();\n // Do NOT set role=\"list\" on the host. The shadow-DOM <nav><ol> provides\n // both navigation landmark and list semantics. Setting role=\"list\" on\n // the host conflicts with the <nav> child — axe-core flags\n // aria-required-children because a list cannot own a navigation landmark.\n // Slotted items no longer need role=\"listitem\" either; the native <ol>\n // handles list semantics in the composed accessibility tree.\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this._removeJsonLd();\n }\n\n override updated(changedProperties: PropertyValues<this>): void {\n super.updated(changedProperties);\n\n if (changedProperties.has('separator')) {\n // JSON.stringify wraps the string in quotes so the value is valid\n // for use in the CSS `content` property (e.g. '/' becomes '\"/\"').\n this.style.setProperty('--hx-breadcrumb-separator-content', JSON.stringify(this.separator));\n }\n\n if (changedProperties.has('maxItems')) {\n // Re-evaluate collapse state when maxItems changes programmatically\n // (e.g. when the expand button resets maxItems to 0).\n const slot = this.shadowRoot?.querySelector<HTMLSlotElement>('slot:not([name])');\n if (slot) {\n const items = this._getBreadcrumbItems(slot);\n if (this.maxItems > 0 && items.length > this.maxItems) {\n this._applyCollapse(items);\n } else {\n this._removeCollapse(items);\n }\n this._applyItemAttributes(items);\n }\n }\n\n if (changedProperties.has('jsonLd')) {\n if (this.jsonLd) {\n // json-ld toggled on after initial render — inject script immediately.\n const slot = this.shadowRoot?.querySelector<HTMLSlotElement>('slot:not([name])');\n if (slot) {\n this._updateJsonLd(this._getBreadcrumbItems(slot));\n }\n } else {\n // json-ld toggled off — remove existing script.\n this._removeJsonLd();\n }\n }\n }\n\n // ─── Render ───\n\n override render() {\n // role=\"list\" on a <div> instead of <ol> intentionally: native <ol>\n // requires its direct children to be <li>, but slotted breadcrumb-items\n // are projected `hx-breadcrumb-item` host elements, not `<li>`. Using\n // <ol>/<ul> triggers axe `list` rule (WCAG 1.3.1) — see PR #1688\n // audit. The role-based contract carries the same list semantics\n // without enforcing the HTML structure rule. hx-breadcrumb-item\n // carries role=\"listitem\" so the AT tree stays canonical.\n return html`\n <nav part=\"nav\" aria-label=${this.label}>\n <div part=\"list\" role=\"list\">\n <slot @slotchange=${this._handleSlotChange}></slot>\n ${this._showEllipsis\n ? html`\n <hx-breadcrumb-item class=\"hx-bc-ellipsis\">\n <button\n type=\"button\"\n aria-label=${this.labelEllipsis}\n @click=${this._expandBreadcrumb}\n >\n …\n </button>\n </hx-breadcrumb-item>\n `\n : nothing}\n </div>\n </nav>\n <slot\n name=\"separator\"\n class=\"separator-slot\"\n @slotchange=${this._handleSeparatorSlotChange}\n ></slot>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'hx-breadcrumb': HelixBreadcrumb;\n }\n}\n","import { css } from 'lit';\n\nexport const helixBreadcrumbItemStyles = css`\n :host {\n display: inline-flex;\n align-items: center;\n }\n\n /*\n * display: contents removes [part='item'] from the box model entirely.\n * This is intentional — the wrapper exists only for slot selection purposes.\n * Consumers using ::part(item) CANNOT apply box-model properties (padding,\n * margin, background, border) to this part. Use ::part(link) or ::part(text)\n * for visual styling of breadcrumb item content.\n */\n [part='item'] {\n display: contents;\n }\n\n [part='link'] {\n /*\n * AAA 2.5.5 Target Size (Enhanced) — links rendered as inline text\n * default to ~17px tall, well below the 44×44 AAA bar. Use\n * inline-flex + min-height + vertical padding to grow the\n * interactive area to ≥44×44 without enlarging the visible text.\n * The padding is symmetrical so the visible label stays vertically\n * centered against adjacent separators.\n */\n display: inline-flex;\n align-items: center;\n min-height: var(--hx-breadcrumb-link-min-height, var(--hx-touch-target-min, 44px));\n padding-block: var(--hx-breadcrumb-link-padding-y, var(--hx-space-2, 0.5rem));\n padding-inline: var(--hx-breadcrumb-link-padding-x, var(--hx-space-1, 0.25rem));\n color: var(--hx-breadcrumb-link-color, var(--hx-color-text-link, #0f6363));\n text-decoration: none;\n cursor: pointer;\n font-family: inherit;\n font-size: inherit;\n max-width: var(--hx-breadcrumb-item-max-width);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n [part='link']:hover {\n color: var(--hx-breadcrumb-link-hover-color, var(--hx-color-text-link-hover, #07494a));\n text-decoration: underline;\n }\n\n [part='link']:focus-visible {\n outline: var(--hx-focus-ring-width, 2px) solid\n var(--hx-breadcrumb-link-focus-ring-color, var(--hx-focus-ring-color, #0f7078));\n outline-offset: var(--hx-focus-ring-offset, 2px);\n border-radius: var(--hx-border-radius-sm, 0.25rem);\n }\n\n [part='text'] {\n color: var(--hx-breadcrumb-text-color, var(--hx-color-text-strong, #202b39));\n font-family: inherit;\n font-size: inherit;\n max-width: var(--hx-breadcrumb-item-max-width);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .separator {\n margin-inline: var(--hx-breadcrumb-separator-gap, var(--hx-space-1, 0.25rem));\n color: var(--hx-breadcrumb-separator-color, var(--hx-color-text-muted, #4a5362));\n user-select: none;\n }\n\n .separator::before {\n content: var(--hx-breadcrumb-separator-content, '/');\n }\n\n /* Normalize buttons slotted into breadcrumb items (e.g. the expand-ellipsis button). */\n ::slotted(button) {\n background: none;\n border: none;\n cursor: pointer;\n font: inherit;\n color: inherit;\n padding: 0;\n }\n\n /* ─── Forced Colors (Windows High Contrast) ─── */\n\n @media (forced-colors: active) {\n [part='link'] {\n color: LinkText;\n }\n\n [part='link']:hover {\n color: LinkText;\n }\n\n .separator {\n color: CanvasText;\n }\n }\n`;\n","import { html, nothing } from 'lit';\nimport '../../utilities/document-token-adoption.js';\nimport { customElement, property } from 'lit/decorators.js';\nimport { HelixElement } from '../../base/index.js';\nimport { forcedColorsInteractive } from '../../styles/forced-colors.js';\nimport { helixBreadcrumbItemStyles } from './hx-breadcrumb-item.styles.js';\n\n/**\n * A single breadcrumb navigation item.\n *\n * @summary A navigation item within an hx-breadcrumb component. Renders as a link when `href` is\n * provided, or as static text for the current page item. The current page item is determined by\n * the `current` attribute (set explicitly or automatically by the parent `hx-breadcrumb`).\n *\n * @tag hx-breadcrumb-item\n *\n * @slot - The link or page text content. Accepts text, HTML, or icon elements.\n *\n * @csspart item - Wrapper around the link or text content.\n * @csspart link - The anchor element when href is provided (non-current items only).\n * @csspart text - The span element for the current page or items without href.\n * @csspart separator - The separator element rendered after non-last items.\n *\n * @cssprop [--hx-breadcrumb-link-color=var(--hx-color-primary-600)] - Link text color.\n * @cssprop [--hx-breadcrumb-link-hover-color=var(--hx-color-primary-700)] - Link hover text color.\n * @cssprop [--hx-breadcrumb-text-color=var(--hx-color-neutral-700)] - Current page text color.\n * @cssprop [--hx-breadcrumb-separator-content='/'] - Separator character displayed after non-last items.\n * @cssprop [--hx-breadcrumb-separator-color=var(--hx-color-neutral-400)] - Separator color.\n * @cssprop [--hx-breadcrumb-separator-gap=var(--hx-space-1)] - Horizontal margin around separator.\n * @cssprop [--hx-breadcrumb-item-max-width] - Optional max-width for text truncation.\n * @cssprop [--hx-breadcrumb-link-focus-ring-color=var(--hx-focus-ring-color, var(--hx-color-primary-500))] - Focus ring color for breadcrumb links.\n */\n@customElement('hx-breadcrumb-item')\nexport class HelixBreadcrumbItem extends HelixElement {\n static override styles = [helixBreadcrumbItemStyles, forcedColorsInteractive];\n\n override connectedCallback(): void {\n super.connectedCallback();\n // hx-breadcrumb's shadow root uses `<div role=\"list\">` (PR #1688\n // audit fix — see hx-breadcrumb.ts render comment). axe-core pierces\n // the shadow boundary and treats the breadcrumb-item's inner shadow\n // content as the direct children of the role=\"list\" container, so\n // setting role=\"listitem\" via ElementInternals on the host does NOT\n // satisfy aria-required-children — axe still surfaces\n // `a[tabindex]` / `span[aria-current]` as disallowed children. The\n // shadow render places `role=\"listitem\"` on the inner\n // `<span part=\"item\">` wrapper instead (see render() below), so the\n // composed-tree walk lands on a valid listitem ancestor for every\n // leaf node.\n }\n\n /**\n * The URL for this breadcrumb link. Omit for the current page item.\n * When `current` is true, this attribute is ignored and the item always\n * renders as static text per WAI-ARIA APG breadcrumb guidance.\n * @attr href\n */\n @property({ type: String, reflect: true })\n href: string | undefined = undefined;\n\n /**\n * Whether this is the last item in the breadcrumb trail. Set by the parent\n * hx-breadcrumb component via the `data-bc-last` boolean attribute. When\n * present the trailing separator is hidden.\n *\n * @attr data-bc-last\n * @internal\n */\n @property({ type: Boolean, attribute: 'data-bc-last', reflect: true })\n dataBcLast = false;\n\n /**\n * Marks this item as the current page. When set, the item always renders as\n * static text (never a navigable link) and `aria-current=\"page\"` is placed on\n * the inner text element per WAI-ARIA APG breadcrumb guidance, yielding the\n * canonical AT announcement (\"current page, Patient Records\").\n *\n * Can be set explicitly by consumers (e.g. Drupal Twig templates) to override\n * the default positional last-item detection in `hx-breadcrumb`. When any item\n * in the breadcrumb has an explicit `current` attribute, the parent will not\n * override it.\n *\n * @attr current\n */\n @property({ type: Boolean, reflect: true })\n current = false;\n\n override render() {\n // Per WAI-ARIA APG, the current page item MUST NOT be a navigable link.\n // aria-current=\"page\" is placed on the inner element (not the listitem host)\n // for canonical AT announcement (\"current page, Patient Records\" vs\n // \"current page, list item\").\n //\n // role=\"listitem\" lives on the inner `<span part=\"item\">` (not the\n // host) because axe-core pierces the shadow boundary and treats this\n // wrapper as the direct child of the parent role=\"list\" container. A\n // host-level internals.role mirror is invisible to axe at this surface\n // (verified via PR #1688 audit).\n return html`\n <span part=\"item\" role=\"listitem\">\n ${this.current\n ? html`<span part=\"text\" aria-current=\"page\"><slot></slot></span>`\n : this.href\n ? html`<a part=\"link\" href=${this.href}><slot></slot></a>`\n : html`<span part=\"text\"><slot></slot></span>`}\n </span>\n ${!this.dataBcLast\n ? html`<span class=\"separator\" part=\"separator\" aria-hidden=\"true\"></span>`\n : nothing}\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'hx-breadcrumb-item': HelixBreadcrumbItem;\n }\n}\n"],"names":["helixBreadcrumbStyles","css","_nextBreadcrumbId","createIdCounter","HelixBreadcrumb","HelixElement","slot","el","items","hasExplicitCurrent","item","i","isLast","e","assigned","text","_a","position","href","name","entry","schema","changedProperties","_b","html","nothing","forcedColorsInteractive","__decorateClass","property","state","customElement","helixBreadcrumbItemStyles","HelixBreadcrumbItem"],"mappings":"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"}