@helixui/library 1.1.2-next.9 → 2.0.0-next.30

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 (427) hide show
  1. package/custom-elements.json +229 -224
  2. package/dist/components/hx-accordion/hx-accordion-item.d.ts.map +1 -1
  3. package/dist/components/hx-accordion/hx-accordion.d.ts.map +1 -1
  4. package/dist/components/hx-accordion/index.js +1 -1
  5. package/dist/components/hx-action-bar/hx-action-bar.d.ts.map +1 -1
  6. package/dist/components/hx-action-bar/index.js +1 -1
  7. package/dist/components/hx-alert/hx-alert.d.ts.map +1 -1
  8. package/dist/components/hx-alert/index.js +1 -1
  9. package/dist/components/hx-avatar/hx-avatar.d.ts.map +1 -1
  10. package/dist/components/hx-avatar/index.js +1 -1
  11. package/dist/components/hx-badge/hx-badge.d.ts.map +1 -1
  12. package/dist/components/hx-badge/index.js +1 -1
  13. package/dist/components/hx-banner/hx-banner.d.ts.map +1 -1
  14. package/dist/components/hx-banner/index.js +1 -1
  15. package/dist/components/hx-breadcrumb/hx-breadcrumb-item.d.ts.map +1 -1
  16. package/dist/components/hx-breadcrumb/hx-breadcrumb.d.ts.map +1 -1
  17. package/dist/components/hx-breadcrumb/index.js +1 -1
  18. package/dist/components/hx-button/hx-button.d.ts.map +1 -1
  19. package/dist/components/hx-button/index.js +1 -1
  20. package/dist/components/hx-button-group/hx-button-group.d.ts.map +1 -1
  21. package/dist/components/hx-button-group/index.js +1 -1
  22. package/dist/components/hx-card/hx-card.d.ts.map +1 -1
  23. package/dist/components/hx-card/index.js +1 -1
  24. package/dist/components/hx-carousel/hx-carousel-item.d.ts.map +1 -1
  25. package/dist/components/hx-carousel/hx-carousel.d.ts.map +1 -1
  26. package/dist/components/hx-carousel/index.js +1 -1
  27. package/dist/components/hx-checkbox/hx-checkbox.d.ts.map +1 -1
  28. package/dist/components/hx-checkbox/index.js +1 -1
  29. package/dist/components/hx-checkbox-group/hx-checkbox-group.d.ts.map +1 -1
  30. package/dist/components/hx-checkbox-group/index.js +1 -1
  31. package/dist/components/hx-clinical-status/hx-clinical-status.d.ts.map +1 -1
  32. package/dist/components/hx-clinical-status/index.js +1 -1
  33. package/dist/components/hx-code-snippet/hx-code-snippet.d.ts.map +1 -1
  34. package/dist/components/hx-code-snippet/index.js +1 -1
  35. package/dist/components/hx-color-picker/hx-color-picker.d.ts.map +1 -1
  36. package/dist/components/hx-color-picker/index.js +1 -1
  37. package/dist/components/hx-combobox/hx-combobox.d.ts.map +1 -1
  38. package/dist/components/hx-combobox/index.js +1 -1
  39. package/dist/components/hx-container/hx-container.d.ts.map +1 -1
  40. package/dist/components/hx-container/index.js +1 -1
  41. package/dist/components/hx-copy-button/hx-copy-button.d.ts.map +1 -1
  42. package/dist/components/hx-copy-button/index.js +1 -1
  43. package/dist/components/hx-counter/hx-counter.d.ts.map +1 -1
  44. package/dist/components/hx-counter/index.js +1 -1
  45. package/dist/components/hx-data-table/hx-data-table.d.ts.map +1 -1
  46. package/dist/components/hx-data-table/index.js +1 -1
  47. package/dist/components/hx-date-picker/hx-date-picker.d.ts.map +1 -1
  48. package/dist/components/hx-date-picker/index.js +1 -1
  49. package/dist/components/hx-dialog/hx-dialog.d.ts.map +1 -1
  50. package/dist/components/hx-dialog/index.js +1 -1
  51. package/dist/components/hx-divider/hx-divider.d.ts.map +1 -1
  52. package/dist/components/hx-divider/index.js +1 -1
  53. package/dist/components/hx-drawer/hx-drawer.d.ts.map +1 -1
  54. package/dist/components/hx-drawer/index.js +1 -1
  55. package/dist/components/hx-dropdown/hx-dropdown.d.ts.map +1 -1
  56. package/dist/components/hx-dropdown/index.js +1 -1
  57. package/dist/components/hx-field/hx-field.d.ts.map +1 -1
  58. package/dist/components/hx-field/index.js +1 -1
  59. package/dist/components/hx-field-label/hx-field-label.d.ts.map +1 -1
  60. package/dist/components/hx-field-label/index.js +1 -1
  61. package/dist/components/hx-file-upload/hx-file-upload.d.ts.map +1 -1
  62. package/dist/components/hx-file-upload/index.js +1 -1
  63. package/dist/components/hx-format-date/hx-format-date.d.ts.map +1 -1
  64. package/dist/components/hx-format-date/index.js +1 -1
  65. package/dist/components/hx-grid/hx-grid.d.ts.map +1 -1
  66. package/dist/components/hx-grid/index.js +1 -1
  67. package/dist/components/hx-help-text/hx-help-text.d.ts.map +1 -1
  68. package/dist/components/hx-help-text/index.js +1 -1
  69. package/dist/components/hx-icon/hx-icon.d.ts.map +1 -1
  70. package/dist/components/hx-icon/index.js +1 -1
  71. package/dist/components/hx-icon-button/hx-icon-button.d.ts.map +1 -1
  72. package/dist/components/hx-icon-button/index.js +1 -1
  73. package/dist/components/hx-image/hx-image.d.ts.map +1 -1
  74. package/dist/components/hx-image/index.js +1 -1
  75. package/dist/components/hx-link/hx-link.d.ts.map +1 -1
  76. package/dist/components/hx-link/index.js +1 -1
  77. package/dist/components/hx-list/hx-list-item.d.ts.map +1 -1
  78. package/dist/components/hx-list/hx-list.d.ts.map +1 -1
  79. package/dist/components/hx-list/index.js +1 -1
  80. package/dist/components/hx-menu/hx-menu-divider.d.ts.map +1 -1
  81. package/dist/components/hx-menu/hx-menu-item.d.ts.map +1 -1
  82. package/dist/components/hx-menu/hx-menu.d.ts.map +1 -1
  83. package/dist/components/hx-menu/index.js +1 -1
  84. package/dist/components/hx-meter/hx-meter.d.ts.map +1 -1
  85. package/dist/components/hx-meter/index.js +1 -1
  86. package/dist/components/hx-nav/hx-nav.d.ts.map +1 -1
  87. package/dist/components/hx-nav/index.js +1 -1
  88. package/dist/components/hx-number-input/hx-number-input.d.ts.map +1 -1
  89. package/dist/components/hx-number-input/index.js +1 -1
  90. package/dist/components/hx-overflow-menu/hx-overflow-menu.d.ts.map +1 -1
  91. package/dist/components/hx-overflow-menu/index.js +1 -1
  92. package/dist/components/hx-pagination/hx-pagination.d.ts.map +1 -1
  93. package/dist/components/hx-pagination/index.js +1 -1
  94. package/dist/components/hx-patient-banner/hx-patient-banner.d.ts.map +1 -1
  95. package/dist/components/hx-patient-banner/index.js +1 -1
  96. package/dist/components/hx-phi-field/hx-phi-field.d.ts.map +1 -1
  97. package/dist/components/hx-phi-field/index.js +1 -1
  98. package/dist/components/hx-popover/hx-popover.d.ts.map +1 -1
  99. package/dist/components/hx-popover/index.js +1 -1
  100. package/dist/components/hx-popup/hx-popup.d.ts.map +1 -1
  101. package/dist/components/hx-popup/index.js +1 -1
  102. package/dist/components/hx-progress-bar/hx-progress-bar.d.ts.map +1 -1
  103. package/dist/components/hx-progress-bar/index.js +1 -1
  104. package/dist/components/hx-progress-ring/hx-progress-ring.d.ts.map +1 -1
  105. package/dist/components/hx-progress-ring/index.js +1 -1
  106. package/dist/components/hx-radio-group/hx-radio-group.d.ts.map +1 -1
  107. package/dist/components/hx-radio-group/hx-radio.d.ts.map +1 -1
  108. package/dist/components/hx-radio-group/index.js +1 -1
  109. package/dist/components/hx-rating/hx-rating.d.ts.map +1 -1
  110. package/dist/components/hx-rating/index.js +1 -1
  111. package/dist/components/hx-select/hx-select.d.ts.map +1 -1
  112. package/dist/components/hx-select/index.js +1 -1
  113. package/dist/components/hx-side-nav/hx-nav-item.d.ts +5 -0
  114. package/dist/components/hx-side-nav/hx-nav-item.d.ts.map +1 -1
  115. package/dist/components/hx-side-nav/hx-side-nav.d.ts.map +1 -1
  116. package/dist/components/hx-side-nav/index.js +1 -1
  117. package/dist/components/hx-skeleton/hx-skeleton.d.ts.map +1 -1
  118. package/dist/components/hx-skeleton/index.js +1 -1
  119. package/dist/components/hx-slider/hx-slider.d.ts.map +1 -1
  120. package/dist/components/hx-slider/index.js +1 -1
  121. package/dist/components/hx-spinner/hx-spinner.d.ts.map +1 -1
  122. package/dist/components/hx-spinner/index.js +1 -1
  123. package/dist/components/hx-split-button/hx-split-button.d.ts.map +1 -1
  124. package/dist/components/hx-split-button/index.js +1 -1
  125. package/dist/components/hx-split-panel/hx-split-panel.d.ts.map +1 -1
  126. package/dist/components/hx-split-panel/index.js +1 -1
  127. package/dist/components/hx-stack/hx-stack.d.ts.map +1 -1
  128. package/dist/components/hx-stack/index.js +1 -1
  129. package/dist/components/hx-stat/hx-stat.d.ts.map +1 -1
  130. package/dist/components/hx-stat/index.js +1 -1
  131. package/dist/components/hx-status-indicator/hx-status-indicator.d.ts.map +1 -1
  132. package/dist/components/hx-status-indicator/index.js +1 -1
  133. package/dist/components/hx-steps/hx-step.d.ts +7 -0
  134. package/dist/components/hx-steps/hx-step.d.ts.map +1 -1
  135. package/dist/components/hx-steps/hx-steps.d.ts.map +1 -1
  136. package/dist/components/hx-steps/index.js +1 -1
  137. package/dist/components/hx-structured-list/hx-structured-list.d.ts.map +1 -1
  138. package/dist/components/hx-structured-list/index.js +1 -1
  139. package/dist/components/hx-style-scope/hx-style-scope.d.ts.map +1 -1
  140. package/dist/components/hx-style-scope/index.js +1 -1
  141. package/dist/components/hx-switch/hx-switch.d.ts.map +1 -1
  142. package/dist/components/hx-switch/index.js +1 -1
  143. package/dist/components/hx-table/hx-table.d.ts.map +1 -1
  144. package/dist/components/hx-table/hx-tbody.d.ts.map +1 -1
  145. package/dist/components/hx-table/hx-td.d.ts.map +1 -1
  146. package/dist/components/hx-table/hx-tfoot.d.ts.map +1 -1
  147. package/dist/components/hx-table/hx-th.d.ts.map +1 -1
  148. package/dist/components/hx-table/hx-thead.d.ts.map +1 -1
  149. package/dist/components/hx-table/hx-tr.d.ts.map +1 -1
  150. package/dist/components/hx-table/index.js +1 -1
  151. package/dist/components/hx-tabs/hx-tab-panel.d.ts.map +1 -1
  152. package/dist/components/hx-tabs/hx-tab.d.ts.map +1 -1
  153. package/dist/components/hx-tabs/hx-tabs.d.ts.map +1 -1
  154. package/dist/components/hx-tabs/index.js +1 -1
  155. package/dist/components/hx-tag/hx-tag.d.ts.map +1 -1
  156. package/dist/components/hx-tag/index.js +1 -1
  157. package/dist/components/hx-text/hx-text.d.ts.map +1 -1
  158. package/dist/components/hx-text/index.js +1 -1
  159. package/dist/components/hx-text-input/hx-text-input.d.ts.map +1 -1
  160. package/dist/components/hx-text-input/index.js +1 -1
  161. package/dist/components/hx-textarea/hx-textarea.d.ts.map +1 -1
  162. package/dist/components/hx-textarea/index.js +1 -1
  163. package/dist/components/hx-theme/hx-theme.d.ts.map +1 -1
  164. package/dist/components/hx-theme/index.js +1 -1
  165. package/dist/components/hx-time-picker/hx-time-picker.d.ts.map +1 -1
  166. package/dist/components/hx-time-picker/index.js +1 -1
  167. package/dist/components/hx-toast/hx-toast-stack.d.ts.map +1 -1
  168. package/dist/components/hx-toast/hx-toast.d.ts.map +1 -1
  169. package/dist/components/hx-toast/index.js +1 -1
  170. package/dist/components/hx-toggle-button/hx-toggle-button.d.ts.map +1 -1
  171. package/dist/components/hx-toggle-button/index.js +1 -1
  172. package/dist/components/hx-tooltip/hx-tooltip.d.ts.map +1 -1
  173. package/dist/components/hx-tooltip/index.js +1 -1
  174. package/dist/components/hx-top-nav/hx-top-nav.d.ts.map +1 -1
  175. package/dist/components/hx-top-nav/index.js +1 -1
  176. package/dist/components/hx-tree-view/hx-tree-item.d.ts.map +1 -1
  177. package/dist/components/hx-tree-view/hx-tree-view.d.ts.map +1 -1
  178. package/dist/components/hx-tree-view/index.js +1 -1
  179. package/dist/components/hx-visually-hidden/hx-visually-hidden.d.ts.map +1 -1
  180. package/dist/components/hx-visually-hidden/index.js +1 -1
  181. package/dist/css/index.css +1 -1
  182. package/dist/css/manifest.json +1 -1
  183. package/dist/index.d.ts +1 -9
  184. package/dist/index.d.ts.map +1 -1
  185. package/dist/index.js +191 -189
  186. package/dist/index.js.map +1 -1
  187. package/dist/shared/document-token-adoption-Dym9ALA4.js +15 -0
  188. package/dist/shared/document-token-adoption-Dym9ALA4.js.map +1 -0
  189. package/dist/shared/{hx-accordion-_KeulaQR.js → hx-accordion-Cvs-uzZq.js} +21 -21
  190. package/dist/shared/hx-accordion-Cvs-uzZq.js.map +1 -0
  191. package/dist/shared/{hx-action-bar-vGFnNwNY.js → hx-action-bar-B2BNlKQv.js} +12 -12
  192. package/dist/shared/hx-action-bar-B2BNlKQv.js.map +1 -0
  193. package/dist/shared/{hx-alert-DRZYP0Oo.js → hx-alert-CnDlZO6m.js} +7 -7
  194. package/dist/shared/hx-alert-CnDlZO6m.js.map +1 -0
  195. package/dist/shared/{hx-avatar-CZfA9KEl.js → hx-avatar-C68g1G2e.js} +7 -7
  196. package/dist/shared/hx-avatar-C68g1G2e.js.map +1 -0
  197. package/dist/shared/{hx-badge-Xg7zoh4Q.js → hx-badge-D5vy_5BO.js} +7 -7
  198. package/dist/shared/hx-badge-D5vy_5BO.js.map +1 -0
  199. package/dist/shared/{hx-banner-2RS7Nux4.js → hx-banner-Ccif-GaB.js} +7 -7
  200. package/dist/shared/hx-banner-Ccif-GaB.js.map +1 -0
  201. package/dist/shared/{hx-breadcrumb-item-CObc-WJl.js → hx-breadcrumb-item-DhxDZI3r.js} +14 -14
  202. package/dist/shared/hx-breadcrumb-item-DhxDZI3r.js.map +1 -0
  203. package/dist/shared/{hx-button-CC1YH9RZ.js → hx-button-BF3VwcOJ.js} +11 -11
  204. package/dist/shared/hx-button-BF3VwcOJ.js.map +1 -0
  205. package/dist/shared/{hx-button-group-ChTQsnQj.js → hx-button-group-B8u25JjV.js} +12 -12
  206. package/dist/shared/hx-button-group-B8u25JjV.js.map +1 -0
  207. package/dist/shared/{hx-card-dIKdcMhr.js → hx-card-Dps4jvG9.js} +7 -7
  208. package/dist/shared/hx-card-Dps4jvG9.js.map +1 -0
  209. package/dist/shared/{hx-carousel-item-Cm8a1nAi.js → hx-carousel-item-Dmo9pGFm.js} +23 -23
  210. package/dist/shared/hx-carousel-item-Dmo9pGFm.js.map +1 -0
  211. package/dist/shared/{hx-checkbox-_WUiuTo9.js → hx-checkbox-99zyEKj7.js} +16 -16
  212. package/dist/shared/hx-checkbox-99zyEKj7.js.map +1 -0
  213. package/dist/shared/{hx-checkbox-group-B-ci-dxp.js → hx-checkbox-group-J2CGHDwY.js} +23 -23
  214. package/dist/shared/hx-checkbox-group-J2CGHDwY.js.map +1 -0
  215. package/dist/shared/{hx-clinical-status-D6eaplvs.js → hx-clinical-status-CGx5q5PL.js} +11 -11
  216. package/dist/shared/hx-clinical-status-CGx5q5PL.js.map +1 -0
  217. package/dist/shared/{hx-code-snippet-CQsyvthi.js → hx-code-snippet-vAzJjm2O.js} +7 -7
  218. package/dist/shared/hx-code-snippet-vAzJjm2O.js.map +1 -0
  219. package/dist/shared/{hx-color-picker-Dk2Myvaf.js → hx-color-picker-CzMu9Fzw.js} +13 -13
  220. package/dist/shared/hx-color-picker-CzMu9Fzw.js.map +1 -0
  221. package/dist/shared/{hx-combobox-CNAJXIxo.js → hx-combobox-Dhw33U40.js} +9 -9
  222. package/dist/shared/hx-combobox-Dhw33U40.js.map +1 -0
  223. package/dist/shared/{hx-container-7j16VuQE.js → hx-container-Dz4v6FSd.js} +8 -8
  224. package/dist/shared/hx-container-Dz4v6FSd.js.map +1 -0
  225. package/dist/shared/{hx-copy-button-B_ZHYO7_.js → hx-copy-button-Dcul7VwZ.js} +19 -19
  226. package/dist/shared/hx-copy-button-Dcul7VwZ.js.map +1 -0
  227. package/dist/shared/{hx-counter-D_B7L9Pi.js → hx-counter-czWWvciz.js} +7 -7
  228. package/dist/shared/hx-counter-czWWvciz.js.map +1 -0
  229. package/dist/shared/{hx-data-table-B1j4n4bm.js → hx-data-table-CAVgT4JG.js} +37 -37
  230. package/dist/shared/hx-data-table-CAVgT4JG.js.map +1 -0
  231. package/dist/shared/{hx-date-picker-R-0kWFwr.js → hx-date-picker-Be8lTTO7.js} +9 -9
  232. package/dist/shared/hx-date-picker-Be8lTTO7.js.map +1 -0
  233. package/dist/shared/{hx-dialog-U5d3s0Ps.js → hx-dialog-DTGX2FbP.js} +9 -9
  234. package/dist/shared/hx-dialog-DTGX2FbP.js.map +1 -0
  235. package/dist/shared/{hx-divider-DdAN-_jB.js → hx-divider-BJjarZ9z.js} +13 -13
  236. package/dist/shared/hx-divider-BJjarZ9z.js.map +1 -0
  237. package/dist/shared/{hx-drawer-e0qeGxAD.js → hx-drawer-C5qI7jf1.js} +46 -46
  238. package/dist/shared/hx-drawer-C5qI7jf1.js.map +1 -0
  239. package/dist/shared/{hx-dropdown-DP_DNpEb.js → hx-dropdown-BxNnUDyD.js} +12 -12
  240. package/dist/shared/hx-dropdown-BxNnUDyD.js.map +1 -0
  241. package/dist/shared/{hx-field-COM4KvMQ.js → hx-field-J1IUbQ8n.js} +15 -15
  242. package/dist/shared/hx-field-J1IUbQ8n.js.map +1 -0
  243. package/dist/shared/{hx-field-label-BtZ9H9Yy.js → hx-field-label-DhVdkhCN.js} +7 -7
  244. package/dist/shared/hx-field-label-DhVdkhCN.js.map +1 -0
  245. package/dist/shared/{hx-file-upload-DbECypLe.js → hx-file-upload-79nMhnM_.js} +9 -9
  246. package/dist/shared/hx-file-upload-79nMhnM_.js.map +1 -0
  247. package/dist/shared/{hx-format-date-C030ThSm.js → hx-format-date-BMukpO2t.js} +7 -7
  248. package/dist/shared/hx-format-date-BMukpO2t.js.map +1 -0
  249. package/dist/shared/{hx-grid-DE8KM5Gf.js → hx-grid-CO6JZ6Kn.js} +14 -14
  250. package/dist/shared/hx-grid-CO6JZ6Kn.js.map +1 -0
  251. package/dist/shared/{hx-help-text-BAcEGRUE.js → hx-help-text-CYGvBLET.js} +13 -13
  252. package/dist/shared/hx-help-text-CYGvBLET.js.map +1 -0
  253. package/dist/shared/{hx-icon-dYvrzvsO.js → hx-icon-C1hDsw-b.js} +9 -9
  254. package/dist/shared/hx-icon-C1hDsw-b.js.map +1 -0
  255. package/dist/shared/{hx-icon-button-Et9wq79n.js → hx-icon-button-DOWKUs0-.js} +7 -7
  256. package/dist/shared/hx-icon-button-DOWKUs0-.js.map +1 -0
  257. package/dist/shared/{hx-image-DUsEi-oN.js → hx-image-BqABFHGZ.js} +11 -11
  258. package/dist/shared/hx-image-BqABFHGZ.js.map +1 -0
  259. package/dist/shared/{hx-link-Peg2LzOD.js → hx-link-CAFRuAKJ.js} +24 -24
  260. package/dist/shared/hx-link-CAFRuAKJ.js.map +1 -0
  261. package/dist/shared/{hx-list-DwInEX2H.js → hx-list-zbgO-9Xe.js} +12 -12
  262. package/dist/shared/hx-list-zbgO-9Xe.js.map +1 -0
  263. package/dist/shared/{hx-menu-divider-puPmRAdN.js → hx-menu-divider-B1TIKAaq.js} +24 -24
  264. package/dist/shared/hx-menu-divider-B1TIKAaq.js.map +1 -0
  265. package/dist/shared/{hx-meter-CVs4A649.js → hx-meter-BWNeWrg2.js} +7 -7
  266. package/dist/shared/hx-meter-BWNeWrg2.js.map +1 -0
  267. package/dist/shared/{hx-nav-CiyqaW2I.js → hx-nav-DqNzqH2s.js} +6 -6
  268. package/dist/shared/hx-nav-DqNzqH2s.js.map +1 -0
  269. package/dist/shared/{hx-nav-item-CuGiJPAf.js → hx-nav-item-D-9uG-Tt.js} +132 -92
  270. package/dist/shared/hx-nav-item-D-9uG-Tt.js.map +1 -0
  271. package/dist/shared/{hx-number-input-BPgrlMLN.js → hx-number-input-D7Jczm0J.js} +9 -9
  272. package/dist/shared/hx-number-input-D7Jczm0J.js.map +1 -0
  273. package/dist/shared/{hx-overflow-menu-Bz02LPPk.js → hx-overflow-menu-UvSgk7yV.js} +12 -12
  274. package/dist/shared/hx-overflow-menu-UvSgk7yV.js.map +1 -0
  275. package/dist/shared/{hx-pagination-Cb9UEWXz.js → hx-pagination-DBovb97q.js} +7 -7
  276. package/dist/shared/hx-pagination-DBovb97q.js.map +1 -0
  277. package/dist/shared/{hx-patient-banner-wk4qWmsH.js → hx-patient-banner-DLeU2pC2.js} +7 -7
  278. package/dist/shared/hx-patient-banner-DLeU2pC2.js.map +1 -0
  279. package/dist/shared/{hx-phi-field-DX9z3nu0.js → hx-phi-field-BwlVKfHI.js} +7 -7
  280. package/dist/shared/hx-phi-field-BwlVKfHI.js.map +1 -0
  281. package/dist/shared/{hx-popover-D6kYQkt3.js → hx-popover-DdjLdSr8.js} +14 -14
  282. package/dist/shared/hx-popover-DdjLdSr8.js.map +1 -0
  283. package/dist/shared/{hx-popup-RQb6HUXc.js → hx-popup-DEYZKeH1.js} +14 -14
  284. package/dist/shared/hx-popup-DEYZKeH1.js.map +1 -0
  285. package/dist/shared/{hx-progress-bar-ByEmxq1V.js → hx-progress-bar-CdbFsimb.js} +7 -7
  286. package/dist/shared/hx-progress-bar-CdbFsimb.js.map +1 -0
  287. package/dist/shared/{hx-progress-ring-CtVnNRQx.js → hx-progress-ring-3YcGRxes.js} +7 -7
  288. package/dist/shared/hx-progress-ring-3YcGRxes.js.map +1 -0
  289. package/dist/shared/{hx-radio-jgeW92SV.js → hx-radio-BCEpX1tj.js} +18 -18
  290. package/dist/shared/hx-radio-BCEpX1tj.js.map +1 -0
  291. package/dist/shared/{hx-rating-g_iy-DW_.js → hx-rating-BXnSN-Ln.js} +7 -7
  292. package/dist/shared/hx-rating-BXnSN-Ln.js.map +1 -0
  293. package/dist/shared/{hx-select-BWzxWZs_.js → hx-select-vzsOOYNx.js} +13 -13
  294. package/dist/shared/hx-select-vzsOOYNx.js.map +1 -0
  295. package/dist/shared/{hx-skeleton-BHvALyd7.js → hx-skeleton-Dikv9b7p.js} +6 -6
  296. package/dist/shared/hx-skeleton-Dikv9b7p.js.map +1 -0
  297. package/dist/shared/{hx-slider-7Q-e0_pc.js → hx-slider-DnncjdOT.js} +11 -11
  298. package/dist/shared/hx-slider-DnncjdOT.js.map +1 -0
  299. package/dist/shared/{hx-spinner-DEgrKsUo.js → hx-spinner-B52nJ4Vt.js} +13 -13
  300. package/dist/shared/hx-spinner-B52nJ4Vt.js.map +1 -0
  301. package/dist/shared/{hx-split-button-BA7P_ly5.js → hx-split-button-BJHIszDb.js} +9 -9
  302. package/dist/shared/hx-split-button-BJHIszDb.js.map +1 -0
  303. package/dist/shared/{hx-split-panel-Bss54UN8.js → hx-split-panel-uNW9xrA3.js} +7 -7
  304. package/dist/shared/hx-split-panel-uNW9xrA3.js.map +1 -0
  305. package/dist/shared/{hx-stack-BStY1RmV.js → hx-stack-BHc4gVv_.js} +9 -9
  306. package/dist/shared/hx-stack-BHc4gVv_.js.map +1 -0
  307. package/dist/shared/{hx-stat-CmkCUI8v.js → hx-stat-BfgKgBeq.js} +15 -15
  308. package/dist/shared/hx-stat-BfgKgBeq.js.map +1 -0
  309. package/dist/shared/{hx-status-indicator-Dl3Y34mc.js → hx-status-indicator-C146uMF0.js} +7 -7
  310. package/dist/shared/hx-status-indicator-C146uMF0.js.map +1 -0
  311. package/dist/shared/{hx-step-DlANlr2A.js → hx-step-C0Unvyen.js} +33 -29
  312. package/dist/shared/hx-step-C0Unvyen.js.map +1 -0
  313. package/dist/shared/{hx-structured-list-Db9rwLI_.js → hx-structured-list-3R69RETR.js} +11 -11
  314. package/dist/shared/hx-structured-list-3R69RETR.js.map +1 -0
  315. package/dist/shared/{hx-style-scope-BroUu83L.js → hx-style-scope-D3dsKS58.js} +7 -6
  316. package/dist/shared/{hx-style-scope-BroUu83L.js.map → hx-style-scope-D3dsKS58.js.map} +1 -1
  317. package/dist/shared/{hx-switch-C0Lp5RGy.js → hx-switch-BCNpbuk-.js} +7 -7
  318. package/dist/shared/hx-switch-BCNpbuk-.js.map +1 -0
  319. package/dist/shared/{hx-tab-panel-Dnt8aA74.js → hx-tab-panel-D7BTBgDQ.js} +30 -30
  320. package/dist/shared/hx-tab-panel-D7BTBgDQ.js.map +1 -0
  321. package/dist/shared/{hx-tag-K5fCjfqQ.js → hx-tag-C2E-6fJ3.js} +7 -7
  322. package/dist/shared/hx-tag-C2E-6fJ3.js.map +1 -0
  323. package/dist/shared/{hx-td-DZuILY3s.js → hx-td-DWcp2XDO.js} +25 -25
  324. package/dist/shared/hx-td-DWcp2XDO.js.map +1 -0
  325. package/dist/shared/{hx-text-DoEVOf47.js → hx-text-DxyBxz25.js} +12 -12
  326. package/dist/shared/hx-text-DxyBxz25.js.map +1 -0
  327. package/dist/shared/{hx-text-input-DTKWPVdy.js → hx-text-input-2LTGt0vQ.js} +18 -18
  328. package/dist/shared/hx-text-input-2LTGt0vQ.js.map +1 -0
  329. package/dist/shared/{hx-textarea-BkSiU8oM.js → hx-textarea-BZspivFK.js} +9 -9
  330. package/dist/shared/hx-textarea-BZspivFK.js.map +1 -0
  331. package/dist/shared/{hx-theme-Aag8QJvT.js → hx-theme-J2YEpSIL.js} +2 -1
  332. package/dist/shared/hx-theme-J2YEpSIL.js.map +1 -0
  333. package/dist/shared/{hx-time-picker-BpCRsh_z.js → hx-time-picker-CVrw4tju.js} +41 -41
  334. package/dist/shared/hx-time-picker-CVrw4tju.js.map +1 -0
  335. package/dist/shared/{hx-toggle-button-CPFqs3eQ.js → hx-toggle-button-Ss7Gppx3.js} +7 -7
  336. package/dist/shared/hx-toggle-button-Ss7Gppx3.js.map +1 -0
  337. package/dist/shared/{hx-tooltip-CrO4vzeX.js → hx-tooltip-xRNjEX7_.js} +12 -12
  338. package/dist/shared/hx-tooltip-xRNjEX7_.js.map +1 -0
  339. package/dist/shared/{hx-top-nav-DYlnzDaU.js → hx-top-nav-28mxYGuj.js} +7 -7
  340. package/dist/shared/hx-top-nav-28mxYGuj.js.map +1 -0
  341. package/dist/shared/{hx-tree-item-C1PhX-HE.js → hx-tree-item-C-cRw_ZA.js} +16 -16
  342. package/dist/shared/hx-tree-item-C-cRw_ZA.js.map +1 -0
  343. package/dist/shared/{hx-visually-hidden-CCTQTjbR.js → hx-visually-hidden-D6Dv2l8l.js} +13 -13
  344. package/dist/shared/hx-visually-hidden-D6Dv2l8l.js.map +1 -0
  345. package/dist/shared/{toast-factory-f184Gi70.js → toast-factory-oPHbhMZI.js} +18 -18
  346. package/dist/shared/toast-factory-oPHbhMZI.js.map +1 -0
  347. package/dist/utilities/document-token-adoption.d.ts +10 -0
  348. package/dist/utilities/document-token-adoption.d.ts.map +1 -0
  349. package/package.json +4 -2
  350. package/dist/shared/hx-accordion-_KeulaQR.js.map +0 -1
  351. package/dist/shared/hx-action-bar-vGFnNwNY.js.map +0 -1
  352. package/dist/shared/hx-alert-DRZYP0Oo.js.map +0 -1
  353. package/dist/shared/hx-avatar-CZfA9KEl.js.map +0 -1
  354. package/dist/shared/hx-badge-Xg7zoh4Q.js.map +0 -1
  355. package/dist/shared/hx-banner-2RS7Nux4.js.map +0 -1
  356. package/dist/shared/hx-breadcrumb-item-CObc-WJl.js.map +0 -1
  357. package/dist/shared/hx-button-CC1YH9RZ.js.map +0 -1
  358. package/dist/shared/hx-button-group-ChTQsnQj.js.map +0 -1
  359. package/dist/shared/hx-card-dIKdcMhr.js.map +0 -1
  360. package/dist/shared/hx-carousel-item-Cm8a1nAi.js.map +0 -1
  361. package/dist/shared/hx-checkbox-_WUiuTo9.js.map +0 -1
  362. package/dist/shared/hx-checkbox-group-B-ci-dxp.js.map +0 -1
  363. package/dist/shared/hx-clinical-status-D6eaplvs.js.map +0 -1
  364. package/dist/shared/hx-code-snippet-CQsyvthi.js.map +0 -1
  365. package/dist/shared/hx-color-picker-Dk2Myvaf.js.map +0 -1
  366. package/dist/shared/hx-combobox-CNAJXIxo.js.map +0 -1
  367. package/dist/shared/hx-container-7j16VuQE.js.map +0 -1
  368. package/dist/shared/hx-copy-button-B_ZHYO7_.js.map +0 -1
  369. package/dist/shared/hx-counter-D_B7L9Pi.js.map +0 -1
  370. package/dist/shared/hx-data-table-B1j4n4bm.js.map +0 -1
  371. package/dist/shared/hx-date-picker-R-0kWFwr.js.map +0 -1
  372. package/dist/shared/hx-dialog-U5d3s0Ps.js.map +0 -1
  373. package/dist/shared/hx-divider-DdAN-_jB.js.map +0 -1
  374. package/dist/shared/hx-drawer-e0qeGxAD.js.map +0 -1
  375. package/dist/shared/hx-dropdown-DP_DNpEb.js.map +0 -1
  376. package/dist/shared/hx-field-COM4KvMQ.js.map +0 -1
  377. package/dist/shared/hx-field-label-BtZ9H9Yy.js.map +0 -1
  378. package/dist/shared/hx-file-upload-DbECypLe.js.map +0 -1
  379. package/dist/shared/hx-format-date-C030ThSm.js.map +0 -1
  380. package/dist/shared/hx-grid-DE8KM5Gf.js.map +0 -1
  381. package/dist/shared/hx-help-text-BAcEGRUE.js.map +0 -1
  382. package/dist/shared/hx-icon-button-Et9wq79n.js.map +0 -1
  383. package/dist/shared/hx-icon-dYvrzvsO.js.map +0 -1
  384. package/dist/shared/hx-image-DUsEi-oN.js.map +0 -1
  385. package/dist/shared/hx-link-Peg2LzOD.js.map +0 -1
  386. package/dist/shared/hx-list-DwInEX2H.js.map +0 -1
  387. package/dist/shared/hx-menu-divider-puPmRAdN.js.map +0 -1
  388. package/dist/shared/hx-meter-CVs4A649.js.map +0 -1
  389. package/dist/shared/hx-nav-CiyqaW2I.js.map +0 -1
  390. package/dist/shared/hx-nav-item-CuGiJPAf.js.map +0 -1
  391. package/dist/shared/hx-number-input-BPgrlMLN.js.map +0 -1
  392. package/dist/shared/hx-overflow-menu-Bz02LPPk.js.map +0 -1
  393. package/dist/shared/hx-pagination-Cb9UEWXz.js.map +0 -1
  394. package/dist/shared/hx-patient-banner-wk4qWmsH.js.map +0 -1
  395. package/dist/shared/hx-phi-field-DX9z3nu0.js.map +0 -1
  396. package/dist/shared/hx-popover-D6kYQkt3.js.map +0 -1
  397. package/dist/shared/hx-popup-RQb6HUXc.js.map +0 -1
  398. package/dist/shared/hx-progress-bar-ByEmxq1V.js.map +0 -1
  399. package/dist/shared/hx-progress-ring-CtVnNRQx.js.map +0 -1
  400. package/dist/shared/hx-radio-jgeW92SV.js.map +0 -1
  401. package/dist/shared/hx-rating-g_iy-DW_.js.map +0 -1
  402. package/dist/shared/hx-select-BWzxWZs_.js.map +0 -1
  403. package/dist/shared/hx-skeleton-BHvALyd7.js.map +0 -1
  404. package/dist/shared/hx-slider-7Q-e0_pc.js.map +0 -1
  405. package/dist/shared/hx-spinner-DEgrKsUo.js.map +0 -1
  406. package/dist/shared/hx-split-button-BA7P_ly5.js.map +0 -1
  407. package/dist/shared/hx-split-panel-Bss54UN8.js.map +0 -1
  408. package/dist/shared/hx-stack-BStY1RmV.js.map +0 -1
  409. package/dist/shared/hx-stat-CmkCUI8v.js.map +0 -1
  410. package/dist/shared/hx-status-indicator-Dl3Y34mc.js.map +0 -1
  411. package/dist/shared/hx-step-DlANlr2A.js.map +0 -1
  412. package/dist/shared/hx-structured-list-Db9rwLI_.js.map +0 -1
  413. package/dist/shared/hx-switch-C0Lp5RGy.js.map +0 -1
  414. package/dist/shared/hx-tab-panel-Dnt8aA74.js.map +0 -1
  415. package/dist/shared/hx-tag-K5fCjfqQ.js.map +0 -1
  416. package/dist/shared/hx-td-DZuILY3s.js.map +0 -1
  417. package/dist/shared/hx-text-DoEVOf47.js.map +0 -1
  418. package/dist/shared/hx-text-input-DTKWPVdy.js.map +0 -1
  419. package/dist/shared/hx-textarea-BkSiU8oM.js.map +0 -1
  420. package/dist/shared/hx-theme-Aag8QJvT.js.map +0 -1
  421. package/dist/shared/hx-time-picker-BpCRsh_z.js.map +0 -1
  422. package/dist/shared/hx-toggle-button-CPFqs3eQ.js.map +0 -1
  423. package/dist/shared/hx-tooltip-CrO4vzeX.js.map +0 -1
  424. package/dist/shared/hx-top-nav-DYlnzDaU.js.map +0 -1
  425. package/dist/shared/hx-tree-item-C1PhX-HE.js.map +0 -1
  426. package/dist/shared/hx-visually-hidden-CCTQTjbR.js.map +0 -1
  427. package/dist/shared/toast-factory-f184Gi70.js.map +0 -1
@@ -1,7 +1,7 @@
1
- import { css as p, LitElement as h, nothing as x, html as u } from "lit";
1
+ import { css as p, LitElement as h, nothing as b, html as u } from "lit";
2
+ import "./document-token-adoption-Dym9ALA4.js";
2
3
  import { property as l, customElement as v } from "lit/decorators.js";
3
- import { tokenStyles as b } from "@helixui/tokens/lit";
4
- const m = p`
4
+ const x = p`
5
5
  :host {
6
6
  display: block;
7
7
  --_border-color: var(--hx-structured-list-border-color, var(--hx-color-neutral-200, #e2e8f0));
@@ -35,7 +35,7 @@ const m = p`
35
35
  :host([striped]) ::slotted(hx-structured-list-row:nth-of-type(even)) {
36
36
  background: var(--_bg-stripe);
37
37
  }
38
- `, _ = p`
38
+ `, m = p`
39
39
  :host {
40
40
  display: block;
41
41
  }
@@ -75,10 +75,10 @@ const m = p`
75
75
  display: none;
76
76
  }
77
77
  `;
78
- var f = Object.defineProperty, g = Object.getOwnPropertyDescriptor, t = (c, s, a, o) => {
79
- for (var r = o > 1 ? void 0 : o ? g(s, a) : s, i = c.length - 1, d; i >= 0; i--)
78
+ var _ = Object.defineProperty, f = Object.getOwnPropertyDescriptor, t = (c, s, a, o) => {
79
+ for (var r = o > 1 ? void 0 : o ? f(s, a) : s, i = c.length - 1, d; i >= 0; i--)
80
80
  (d = c[i]) && (r = (o ? d(s, a, r) : d(r)) || r);
81
- return o && r && f(s, a, r), r;
81
+ return o && r && _(s, a, r), r;
82
82
  };
83
83
  let e = class extends h {
84
84
  constructor() {
@@ -89,13 +89,13 @@ let e = class extends h {
89
89
  }
90
90
  render() {
91
91
  return u`
92
- <div part="base" class="list" aria-label=${this.label || x}>
92
+ <div part="base" class="list" aria-label=${this.label || b}>
93
93
  <slot></slot>
94
94
  </div>
95
95
  `;
96
96
  }
97
97
  };
98
- e.styles = [b, m];
98
+ e.styles = [x];
99
99
  t([
100
100
  l({ type: String })
101
101
  ], e.prototype, "label", 2);
@@ -131,7 +131,7 @@ let n = class extends h {
131
131
  `;
132
132
  }
133
133
  };
134
- n.styles = [b, _];
134
+ n.styles = [m];
135
135
  n = t([
136
136
  v("hx-structured-list-row")
137
137
  ], n);
@@ -139,4 +139,4 @@ export {
139
139
  e as H,
140
140
  n as a
141
141
  };
142
- //# sourceMappingURL=hx-structured-list-Db9rwLI_.js.map
142
+ //# sourceMappingURL=hx-structured-list-3R69RETR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hx-structured-list-3R69RETR.js","sources":["../../src/components/hx-structured-list/hx-structured-list.styles.ts","../../src/components/hx-structured-list/hx-structured-list.ts"],"sourcesContent":["import { css } from 'lit';\n\nexport const helixStructuredListStyles = css`\n :host {\n display: block;\n --_border-color: var(--hx-structured-list-border-color, var(--hx-color-neutral-200, #e2e8f0));\n --_border-width: var(--hx-structured-list-border-width, var(--hx-border-width-thin, 1px));\n --_bg-stripe: var(--hx-structured-list-stripe-bg, var(--hx-color-neutral-50, #f8fafc));\n --_padding-block: var(--hx-structured-list-padding-block, var(--hx-space-4, 1rem));\n --_padding-inline: var(--hx-structured-list-padding-inline, var(--hx-space-4, 1rem));\n }\n\n :host([condensed]) {\n --_padding-block: var(--hx-structured-list-condensed-padding-block, var(--hx-space-2, 0.5rem));\n --_padding-inline: var(\n --hx-structured-list-condensed-padding-inline,\n var(--hx-space-3, 0.75rem)\n );\n }\n\n .list {\n display: block;\n margin: 0;\n padding: 0;\n list-style: none;\n }\n\n :host([bordered]) .list {\n border: var(--_border-width) solid var(--_border-color);\n border-radius: var(--hx-border-radius-md, 0.375rem);\n overflow: hidden;\n }\n\n :host([striped]) ::slotted(hx-structured-list-row:nth-of-type(even)) {\n background: var(--_bg-stripe);\n }\n`;\n\nexport const helixStructuredListRowStyles = css`\n :host {\n display: block;\n }\n\n .row {\n display: grid;\n grid-template-columns: minmax(0, 1fr) minmax(0, 2fr);\n align-items: baseline;\n padding-block: var(--_padding-block, var(--hx-space-4, 1rem));\n padding-inline: var(--_padding-inline, var(--hx-space-4, 1rem));\n gap: var(--hx-space-4, 1rem);\n }\n\n :host(:not(:last-of-type)) .row {\n border-bottom: var(--_border-width, var(--hx-border-width-thin, 1px)) solid\n var(--_border-color, var(--hx-color-neutral-200, #e2e8f0));\n }\n\n .row__label {\n font-weight: var(--hx-font-weight-medium, 500);\n color: var(--hx-structured-list-label-color, var(--hx-color-neutral-700, #374151));\n font-size: var(--hx-font-size-sm, 0.875rem);\n }\n\n .row__value {\n color: var(--hx-structured-list-value-color, var(--hx-color-neutral-900, #111827));\n font-size: var(--hx-font-size-sm, 0.875rem);\n }\n\n .row__actions {\n display: flex;\n align-items: center;\n gap: var(--hx-space-2, 0.5rem);\n }\n\n .row__actions:empty {\n display: none;\n }\n`;\n","import { LitElement, html, nothing } from 'lit';\nimport '../../utilities/document-token-adoption.js';\nimport { customElement, property } from 'lit/decorators.js';\nimport {\n helixStructuredListStyles,\n helixStructuredListRowStyles,\n} from './hx-structured-list.styles.js';\n\n/**\n * Container for structured key-value data display. Renders as a list with\n * `role=\"list\"` on the host and `role=\"listitem\"` on each `hx-structured-list-row`,\n * preserving the list/listitem relationship across shadow DOM boundaries.\n * Use `hx-structured-list-row` as direct children.\n *\n * @summary Key-value data display container for detail and summary views.\n *\n * @tag hx-structured-list\n *\n * @slot - One or more `hx-structured-list-row` elements.\n *\n * @csspart base - The root list element.\n *\n * @cssprop [--hx-structured-list-border-color=var(--hx-color-neutral-200)] - Border color when bordered.\n * @cssprop [--hx-structured-list-border-width=var(--hx-border-width-thin)] - Border width when bordered.\n * @cssprop [--hx-structured-list-stripe-bg=var(--hx-color-neutral-50)] - Stripe background color.\n * @cssprop [--hx-structured-list-padding-block=var(--hx-space-4)] - Row block padding.\n * @cssprop [--hx-structured-list-padding-inline=var(--hx-space-4)] - Row inline padding.\n * @cssprop [--hx-structured-list-condensed-padding-block=var(--hx-space-2)] - Row block padding (condensed).\n * @cssprop [--hx-structured-list-condensed-padding-inline=var(--hx-space-3)] - Row inline padding (condensed).\n */\n@customElement('hx-structured-list')\nexport class HelixStructuredList extends LitElement {\n static override styles = [helixStructuredListStyles];\n\n override connectedCallback(): void {\n super.connectedCallback();\n // Set role on the host element so the list/listitem relationship is\n // preserved in the light DOM tree, crossing shadow boundaries correctly.\n if (!this.hasAttribute('role')) {\n this.setAttribute('role', 'list');\n }\n }\n\n /**\n * Accessible label for the list container. Use when multiple structured lists appear\n * on the same page so screen readers can distinguish them (WCAG 4.1.2).\n * @attr label\n */\n @property({ type: String })\n label = '';\n\n /**\n * Renders a border around the entire list.\n * @attr bordered\n */\n @property({ type: Boolean, reflect: true })\n bordered = false;\n\n /**\n * Reduces row padding for denser layouts.\n * @attr condensed\n */\n @property({ type: Boolean, reflect: true })\n condensed = false;\n\n /**\n * Alternates row background colors for easier scanning.\n * @attr striped\n */\n @property({ type: Boolean, reflect: true })\n striped = false;\n\n override render() {\n return html`\n <div part=\"base\" class=\"list\" aria-label=${this.label || nothing}>\n <slot></slot>\n </div>\n `;\n }\n}\n\n/**\n * A single row within an `hx-structured-list`. Renders a label/value pair\n * with an optional actions area.\n *\n * @summary A label-value row for use inside `hx-structured-list`.\n *\n * @tag hx-structured-list-row\n *\n * @slot label - The term or key label (`<dt>` semantics).\n * @slot - The value or definition (`<dd>` semantics).\n * @slot actions - Optional action controls (edit button, etc.).\n *\n * @csspart base - The root row element.\n * @csspart label - The label (`dt`) cell.\n * @csspart value - The value (`dd`) cell.\n * @csspart actions - The actions cell.\n *\n * @cssprop [--hx-structured-list-label-color=var(--hx-color-neutral-700)] - Label text color.\n * @cssprop [--hx-structured-list-value-color=var(--hx-color-neutral-900)] - Value text color.\n */\n@customElement('hx-structured-list-row')\nexport class HelixStructuredListRow extends LitElement {\n static override styles = [helixStructuredListRowStyles];\n\n override connectedCallback(): void {\n super.connectedCallback();\n // Set role on the host element so screen readers see listitem as a direct\n // child of the hx-structured-list host (which carries role=\"list\"),\n // preserving the list/listitem relationship across shadow boundaries.\n if (!this.hasAttribute('role')) {\n this.setAttribute('role', 'listitem');\n }\n }\n\n override render() {\n return html`\n <div part=\"base\" class=\"row\">\n <div part=\"label\" class=\"row__label\">\n <slot name=\"label\"></slot>\n </div>\n <div part=\"value\" class=\"row__value\">\n <slot></slot>\n <div part=\"actions\" class=\"row__actions\">\n <slot name=\"actions\"></slot>\n </div>\n </div>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'hx-structured-list': HelixStructuredList;\n 'hx-structured-list-row': HelixStructuredListRow;\n }\n}\n"],"names":["helixStructuredListStyles","css","helixStructuredListRowStyles","HelixStructuredList","LitElement","html","nothing","__decorateClass","property","customElement","HelixStructuredListRow"],"mappings":";;;AAEO,MAAMA,IAA4BC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAoC5BC,IAA+BD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;ACPrC,IAAME,IAAN,cAAkCC,EAAW;AAAA,EAA7C,cAAA;AAAA,UAAA,GAAA,SAAA,GAkBL,KAAA,QAAQ,IAOR,KAAA,WAAW,IAOX,KAAA,YAAY,IAOZ,KAAA,UAAU;AAAA,EAAA;AAAA,EApCD,oBAA0B;AACjC,UAAM,kBAAA,GAGD,KAAK,aAAa,MAAM,KAC3B,KAAK,aAAa,QAAQ,MAAM;AAAA,EAEpC;AAAA,EA+BS,SAAS;AAChB,WAAOC;AAAA,iDACsC,KAAK,SAASC,CAAO;AAAA;AAAA;AAAA;AAAA,EAIpE;AACF;AAhDaH,EACK,SAAS,CAACH,CAAyB;AAiBnDO,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GAjBfL,EAkBX,WAAA,SAAA,CAAA;AAOAI,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,SAAS,SAAS,IAAM;AAAA,GAxB/BL,EAyBX,WAAA,YAAA,CAAA;AAOAI,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,SAAS,SAAS,IAAM;AAAA,GA/B/BL,EAgCX,WAAA,aAAA,CAAA;AAOAI,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,SAAS,SAAS,IAAM;AAAA,GAtC/BL,EAuCX,WAAA,WAAA,CAAA;AAvCWA,IAANI,EAAA;AAAA,EADNE,EAAc,oBAAoB;AAAA,GACtBN,CAAA;AAuEN,IAAMO,IAAN,cAAqCN,EAAW;AAAA,EAG5C,oBAA0B;AACjC,UAAM,kBAAA,GAID,KAAK,aAAa,MAAM,KAC3B,KAAK,aAAa,QAAQ,UAAU;AAAA,EAExC;AAAA,EAES,SAAS;AAChB,WAAOC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaT;AACF;AA5BaK,EACK,SAAS,CAACR,CAA4B;AAD3CQ,IAANH,EAAA;AAAA,EADNE,EAAc,wBAAwB;AAAA,GAC1BC,CAAA;"}
@@ -1,4 +1,5 @@
1
1
  import { css as b, LitElement as x, html as C } from "lit";
2
+ import "./document-token-adoption-Dym9ALA4.js";
2
3
  import { property as f, customElement as $ } from "lit/decorators.js";
3
4
  const _ = b`
4
5
  :host {
@@ -33,10 +34,10 @@ function y(t, r) {
33
34
  }
34
35
  const o = t.indexOf("{", e);
35
36
  if (o === -1) break;
36
- const s = t.slice(e, o), h = o + 1, p = g(t, o);
37
+ const s = t.slice(e, o), h = o + 1, p = m(t, o);
37
38
  if (p === -1) break;
38
- const m = t.slice(h, p), S = v(s, r);
39
- n.push(`${S}{${m}}`), e = p + 1;
39
+ const g = t.slice(h, p), S = v(s, r);
40
+ n.push(`${S}{${g}}`), e = p + 1;
40
41
  }
41
42
  return n.join("");
42
43
  }
@@ -65,10 +66,10 @@ function A(t, r) {
65
66
  return { text: t.slice(r), end: t.length };
66
67
  if (l(t, n) === ";")
67
68
  return { text: t.slice(r, n + 1), end: n + 1 };
68
- const e = g(t, n);
69
+ const e = m(t, n);
69
70
  return e === -1 ? { text: t.slice(r), end: t.length } : { text: t.slice(r, e + 1), end: e + 1 };
70
71
  }
71
- function g(t, r) {
72
+ function m(t, r) {
72
73
  let n = 0;
73
74
  for (let e = r; e < t.length; e++) {
74
75
  const i = l(t, e);
@@ -122,4 +123,4 @@ c = u([
122
123
  export {
123
124
  c as H
124
125
  };
125
- //# sourceMappingURL=hx-style-scope-BroUu83L.js.map
126
+ //# sourceMappingURL=hx-style-scope-D3dsKS58.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"hx-style-scope-BroUu83L.js","sources":["../../src/components/hx-style-scope/hx-style-scope.styles.ts","../../src/utilities/lightStyleRegistry.ts","../../src/utilities/generateScopedSelectors.ts","../../src/utilities/injectLightStyles.ts","../../src/components/hx-style-scope/hx-style-scope.ts"],"sourcesContent":["import { css } from 'lit';\n\n/**\n * Styles for hx-style-scope.\n *\n * The element acts as a transparent wrapper — `display: contents` removes it\n * from the layout box model so slotted children lay out as if the wrapper\n * were absent. This prevents hx-style-scope from introducing unexpected\n * layout shifts or block-formatting-context changes.\n */\nexport const hxStyleScopeStyles = css`\n :host {\n display: contents;\n }\n`;\n","/**\n * @module lightStyleRegistry\n *\n * A Map-based registry that tracks which component stylesheets have been\n * injected into the document's light DOM. Used by injectLightStyles to\n * deduplicate style injection — each component type is injected at most once\n * per page load.\n *\n * @example\n * ```ts\n * import { isStyleRegistered, registerStyle } from './lightStyleRegistry.js';\n *\n * if (!isStyleRegistered('hx-card')) {\n * const el = document.createElement('style');\n * el.textContent = css;\n * document.head.appendChild(el);\n * registerStyle('hx-card', el);\n * }\n * ```\n */\n\n/**\n * Primary registry mapping component names to their injected HTMLStyleElement.\n * Keyed by component tag name (e.g. `'hx-card'`).\n */\nexport const lightStyleRegistry: Map<string, HTMLStyleElement> = new Map();\n\n/**\n * Returns true if a stylesheet for the given component has already been\n * injected into the document.\n *\n * @param componentName - The component tag name (e.g. `'hx-card'`).\n */\nexport function isStyleRegistered(componentName: string): boolean {\n return lightStyleRegistry.has(componentName);\n}\n\n/**\n * Records a stylesheet element in the registry for the given component.\n * Called after the element has been appended to the document.\n *\n * @param componentName - The component tag name (e.g. `'hx-card'`).\n * @param el - The HTMLStyleElement that was injected.\n */\nexport function registerStyle(componentName: string, el: HTMLStyleElement): void {\n lightStyleRegistry.set(componentName, el);\n}\n","/**\n * @module generateScopedSelectors\n *\n * Generates CSS with all selectors scoped under a `[data-hx-styled=\"componentName\"]`\n * attribute selector. This ensures injected light DOM styles only apply to content\n * wrapped in `<hx-style-scope component=\"...\">` and do not leak to the rest of the page.\n *\n * @example\n * ```ts\n * import { generateScopedSelectors } from './generateScopedSelectors.js';\n *\n * const scoped = generateScopedSelectors('hx-card', 'p { color: red; }');\n * // '[data-hx-styled=\"hx-card\"] p { color: red; }'\n * ```\n */\n\n/**\n * Wraps all CSS selectors to be scoped under `[data-hx-styled=\"componentName\"]`.\n *\n * Handles:\n * - Standard selectors: `p { ... }` → `[data-hx-styled=\"hx-card\"] p { ... }`\n * - `::slotted(*)` patterns: `::slotted(p) { ... }` → `[data-hx-styled=\"hx-card\"] p { ... }`\n * - At-rules (`@media`, `@supports`, etc.) are preserved with their inner rules scoped\n * - `:host` selectors are replaced with the scope attribute selector\n *\n * @param componentName - The component tag name used as the scope identifier.\n * @param css - The CSS string to transform.\n * @returns The transformed CSS with all selectors scoped.\n */\nexport function generateScopedSelectors(componentName: string, css: string): string {\n const scopeAttr = `[data-hx-styled=\"${componentName}\"]`;\n return transformCss(css, scopeAttr);\n}\n\n/**\n * Returns the character at position `i` in `str`, or an empty string if out of bounds.\n * Avoids the `string | undefined` issue from `noUncheckedIndexedAccess`.\n */\nfunction charAt(str: string, i: number): string {\n return str[i] ?? '';\n}\n\n/**\n * Recursively transforms CSS text, scoping all selectors under the given\n * attribute selector prefix.\n *\n * @param css - The CSS text to transform.\n * @param scopeAttr - The attribute selector to prepend (e.g. `[data-hx-styled=\"hx-card\"]`).\n * @returns The scoped CSS string.\n */\nfunction transformCss(css: string, scopeAttr: string): string {\n const result: string[] = [];\n let i = 0;\n const len = css.length;\n\n while (i < len) {\n // Skip whitespace\n while (i < len && /\\s/.test(charAt(css, i))) {\n result.push(charAt(css, i));\n i++;\n }\n\n if (i >= len) break;\n\n // Check for at-rule (e.g. @media, @supports, @keyframes)\n if (charAt(css, i) === '@') {\n const atBlock = extractAtRule(css, i);\n result.push(transformAtRule(atBlock.text, scopeAttr));\n i = atBlock.end;\n continue;\n }\n\n // Extract a selector block up to the opening brace\n const selectorEnd = css.indexOf('{', i);\n if (selectorEnd === -1) break;\n\n const selectorRaw = css.slice(i, selectorEnd);\n const bodyStart = selectorEnd + 1;\n const bodyEnd = findMatchingBrace(css, selectorEnd);\n\n if (bodyEnd === -1) break;\n\n const body = css.slice(bodyStart, bodyEnd);\n const scopedSelector = scopeSelector(selectorRaw, scopeAttr);\n result.push(`${scopedSelector}{${body}}`);\n i = bodyEnd + 1;\n }\n\n return result.join('');\n}\n\n/**\n * Scopes a raw selector string under the given attribute selector.\n * Handles comma-separated selectors, `::slotted()`, and `:host`.\n *\n * @param selectorRaw - The raw selector string (may be comma-separated).\n * @param scopeAttr - The attribute selector prefix.\n * @returns The scoped selector string.\n */\nfunction scopeSelector(selectorRaw: string, scopeAttr: string): string {\n return selectorRaw\n .split(',')\n .map((part) => {\n const trimmed = part.trim();\n\n // Replace ::slotted(*) with a direct descendant selector\n if (trimmed.startsWith('::slotted(') && trimmed.endsWith(')')) {\n const inner = trimmed.slice('::slotted('.length, -1).trim();\n return `${scopeAttr} ${inner}`;\n }\n\n // Replace :host with the scope attribute selector\n if (trimmed === ':host' || trimmed.startsWith(':host(') || trimmed.startsWith(':host ')) {\n return trimmed.replace(/^:host(\\([^)]*\\))?/, scopeAttr);\n }\n\n // Standard selector — prepend scope\n return `${scopeAttr} ${trimmed}`;\n })\n .join(', ');\n}\n\n/**\n * Handles transformation of an at-rule block. For container at-rules\n * (`@media`, `@supports`, `@layer`, `@container`) the inner rules are scoped.\n * Non-container at-rules (e.g. `@keyframes`, `@charset`) are passed through unchanged.\n *\n * @param atRuleText - The full at-rule text including its block.\n * @param scopeAttr - The attribute selector prefix.\n * @returns The transformed at-rule text.\n */\nfunction transformAtRule(atRuleText: string, scopeAttr: string): string {\n const containerAtRules = /^@(media|supports|layer|container|document)\\b/;\n const braceIndex = atRuleText.indexOf('{');\n\n if (braceIndex === -1 || !containerAtRules.test(atRuleText.trim())) {\n return atRuleText;\n }\n\n const head = atRuleText.slice(0, braceIndex + 1);\n const innerEnd = atRuleText.lastIndexOf('}');\n const inner = atRuleText.slice(braceIndex + 1, innerEnd);\n const tail = atRuleText.slice(innerEnd);\n\n return `${head}${transformCss(inner, scopeAttr)}${tail}`;\n}\n\n/**\n * Extracts a complete at-rule (potentially with a block) starting at index `start`.\n * Returns the text and the end index.\n */\nfunction extractAtRule(css: string, start: number): { text: string; end: number } {\n // Find either ';' (simple at-rule) or the matching '{...}' (block at-rule)\n let i = start;\n while (i < css.length && charAt(css, i) !== '{' && charAt(css, i) !== ';') {\n i++;\n }\n\n if (i >= css.length) {\n return { text: css.slice(start), end: css.length };\n }\n\n if (charAt(css, i) === ';') {\n return { text: css.slice(start, i + 1), end: i + 1 };\n }\n\n // Block at-rule — find matching closing brace\n const end = findMatchingBrace(css, i);\n if (end === -1) {\n return { text: css.slice(start), end: css.length };\n }\n\n return { text: css.slice(start, end + 1), end: end + 1 };\n}\n\n/**\n * Finds the index of the closing `}` that matches the `{` at `openIndex`.\n * Returns -1 if no matching brace is found.\n */\nfunction findMatchingBrace(css: string, openIndex: number): number {\n let depth = 0;\n for (let i = openIndex; i < css.length; i++) {\n const ch = charAt(css, i);\n if (ch === '{') depth++;\n else if (ch === '}') {\n depth--;\n if (depth === 0) return i;\n }\n }\n return -1;\n}\n","/**\n * @module injectLightStyles\n *\n * Core utility for injecting scoped `<style>` elements into `document.head`\n * to style light DOM slotted content in HELiX components. Uses the\n * `lightStyleRegistry` to deduplicate — each component type is injected at\n * most once per page lifetime.\n *\n * This is the primary mechanism for ensuring Drupal-slotted content inherits\n * proper typography and spacing when rendered into HELiX components.\n *\n * @example\n * ```ts\n * import { injectLightStyles } from '../../utilities/injectLightStyles.js';\n *\n * // In connectedCallback:\n * injectLightStyles('hx-card', 'p { font-size: var(--hx-font-size-md); }');\n * ```\n */\n\nimport { isStyleRegistered, registerStyle } from './lightStyleRegistry.js';\nimport { generateScopedSelectors } from './generateScopedSelectors.js';\n\n/**\n * Injects a scoped `<style>` element into `document.head` for light DOM content\n * belonging to `componentName`. The CSS is automatically scoped via\n * `generateScopedSelectors` so styles only apply inside\n * `[data-hx-styled=\"componentName\"]` wrappers.\n *\n * Safe to call multiple times — subsequent calls for the same `componentName`\n * are no-ops (deduplication via `lightStyleRegistry`).\n *\n * No-op in SSR environments where `document` is not defined.\n *\n * @param componentName - The component tag name used as the scope identifier\n * (e.g. `'hx-card'`). Must be unique per component type.\n * @param css - The raw CSS to scope and inject. Selectors will be prefixed with\n * `[data-hx-styled=\"componentName\"]`.\n */\nexport function injectLightStyles(componentName: string, css: string): void {\n if (typeof document === 'undefined') return;\n\n if (isStyleRegistered(componentName)) return;\n\n const scopedCss = generateScopedSelectors(componentName, css);\n\n const styleEl = document.createElement('style');\n styleEl.setAttribute('data-hx-light-styles', componentName);\n styleEl.textContent = scopedCss;\n\n document.head.appendChild(styleEl);\n registerStyle(componentName, styleEl);\n}\n","import { LitElement, html } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { hxStyleScopeStyles } from './hx-style-scope.styles.js';\nimport { injectLightStyles } from '../../utilities/injectLightStyles.js';\n\n/**\n * A transparent wrapper component that injects scoped light DOM styles for its\n * slotted children. Designed for use in Drupal Twig templates where slotted\n * content lives in the light DOM and cannot inherit Shadow DOM styles.\n *\n * On connection, the component:\n * 1. Sets `data-hx-styled` on itself so scoped CSS selectors resolve correctly.\n * 2. Calls `injectLightStyles` to inject a `<style>` into `document.head` — once\n * per component type, deduplicated via `lightStyleRegistry`.\n *\n * The element renders as `display: contents` so it does not affect layout.\n *\n * @summary Scoped light DOM style injection wrapper for Drupal-slotted content.\n *\n * @tag hx-style-scope\n *\n * @slot - Default slot for any light DOM content that should receive scoped styles.\n *\n * @example\n * ```html\n * <hx-style-scope component=\"hx-card\">\n * <p>This paragraph will receive hx-card light DOM styles.</p>\n * </hx-style-scope>\n * ```\n *\n * @example Drupal Twig usage via macro\n * ```twig\n * {% import '@helix/hx-style-scope.macro.twig' as hx %}\n * {{ hx.scope('hx-card', content) }}\n * ```\n */\n@customElement('hx-style-scope')\nexport class HxStyleScope extends LitElement {\n static override styles = [hxStyleScopeStyles];\n\n /**\n * The component tag name whose light DOM styles should be injected.\n * Must match a registered component name (e.g. `'hx-card'`).\n *\n * When set, the element also applies `data-hx-styled` to itself so that\n * scoped CSS selectors generated by `generateScopedSelectors` resolve\n * correctly against slotted child elements.\n *\n * @attr component\n */\n @property({ type: String, reflect: true })\n component: string = '';\n\n /**\n * The CSS to inject as scoped light DOM styles. When provided alongside\n * `component`, this CSS will be scoped under `[data-hx-styled=\"component\"]`\n * and injected into `document.head` (once per component type).\n *\n * If omitted, `injectLightStyles` is still called but with an empty string,\n * which is a no-op for actual style injection.\n *\n * @attr light-css\n */\n @property({ type: String, attribute: 'light-css' })\n lightCss: string = '';\n\n override connectedCallback(): void {\n super.connectedCallback();\n this._applyScope();\n }\n\n override updated(changed: Map<string, unknown>): void {\n if (changed.has('component') || changed.has('lightCss')) {\n this._applyScope();\n }\n }\n\n /**\n * Applies the `data-hx-styled` attribute and triggers style injection.\n * Called on connect and whenever `component` or `lightCss` changes.\n */\n private _applyScope(): void {\n if (!this.component) return;\n\n // Set the scoping attribute so CSS selectors from generateScopedSelectors work.\n this.setAttribute('data-hx-styled', this.component);\n\n if (this.lightCss) {\n injectLightStyles(this.component, this.lightCss);\n }\n }\n\n override render() {\n return html`<slot></slot>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'hx-style-scope': HxStyleScope;\n }\n}\n"],"names":["hxStyleScopeStyles","css","lightStyleRegistry","isStyleRegistered","componentName","registerStyle","el","generateScopedSelectors","scopeAttr","transformCss","charAt","str","i","result","len","atBlock","extractAtRule","transformAtRule","selectorEnd","selectorRaw","bodyStart","bodyEnd","findMatchingBrace","body","scopedSelector","scopeSelector","part","trimmed","inner","atRuleText","containerAtRules","braceIndex","head","innerEnd","tail","start","end","openIndex","depth","ch","injectLightStyles","scopedCss","styleEl","HxStyleScope","LitElement","changed","html","__decorateClass","property","customElement"],"mappings":"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"}
1
+ {"version":3,"file":"hx-style-scope-D3dsKS58.js","sources":["../../src/components/hx-style-scope/hx-style-scope.styles.ts","../../src/utilities/lightStyleRegistry.ts","../../src/utilities/generateScopedSelectors.ts","../../src/utilities/injectLightStyles.ts","../../src/components/hx-style-scope/hx-style-scope.ts"],"sourcesContent":["import { css } from 'lit';\n\n/**\n * Styles for hx-style-scope.\n *\n * The element acts as a transparent wrapper — `display: contents` removes it\n * from the layout box model so slotted children lay out as if the wrapper\n * were absent. This prevents hx-style-scope from introducing unexpected\n * layout shifts or block-formatting-context changes.\n */\nexport const hxStyleScopeStyles = css`\n :host {\n display: contents;\n }\n`;\n","/**\n * @module lightStyleRegistry\n *\n * A Map-based registry that tracks which component stylesheets have been\n * injected into the document's light DOM. Used by injectLightStyles to\n * deduplicate style injection — each component type is injected at most once\n * per page load.\n *\n * @example\n * ```ts\n * import { isStyleRegistered, registerStyle } from './lightStyleRegistry.js';\n *\n * if (!isStyleRegistered('hx-card')) {\n * const el = document.createElement('style');\n * el.textContent = css;\n * document.head.appendChild(el);\n * registerStyle('hx-card', el);\n * }\n * ```\n */\n\n/**\n * Primary registry mapping component names to their injected HTMLStyleElement.\n * Keyed by component tag name (e.g. `'hx-card'`).\n */\nexport const lightStyleRegistry: Map<string, HTMLStyleElement> = new Map();\n\n/**\n * Returns true if a stylesheet for the given component has already been\n * injected into the document.\n *\n * @param componentName - The component tag name (e.g. `'hx-card'`).\n */\nexport function isStyleRegistered(componentName: string): boolean {\n return lightStyleRegistry.has(componentName);\n}\n\n/**\n * Records a stylesheet element in the registry for the given component.\n * Called after the element has been appended to the document.\n *\n * @param componentName - The component tag name (e.g. `'hx-card'`).\n * @param el - The HTMLStyleElement that was injected.\n */\nexport function registerStyle(componentName: string, el: HTMLStyleElement): void {\n lightStyleRegistry.set(componentName, el);\n}\n","/**\n * @module generateScopedSelectors\n *\n * Generates CSS with all selectors scoped under a `[data-hx-styled=\"componentName\"]`\n * attribute selector. This ensures injected light DOM styles only apply to content\n * wrapped in `<hx-style-scope component=\"...\">` and do not leak to the rest of the page.\n *\n * @example\n * ```ts\n * import { generateScopedSelectors } from './generateScopedSelectors.js';\n *\n * const scoped = generateScopedSelectors('hx-card', 'p { color: red; }');\n * // '[data-hx-styled=\"hx-card\"] p { color: red; }'\n * ```\n */\n\n/**\n * Wraps all CSS selectors to be scoped under `[data-hx-styled=\"componentName\"]`.\n *\n * Handles:\n * - Standard selectors: `p { ... }` → `[data-hx-styled=\"hx-card\"] p { ... }`\n * - `::slotted(*)` patterns: `::slotted(p) { ... }` → `[data-hx-styled=\"hx-card\"] p { ... }`\n * - At-rules (`@media`, `@supports`, etc.) are preserved with their inner rules scoped\n * - `:host` selectors are replaced with the scope attribute selector\n *\n * @param componentName - The component tag name used as the scope identifier.\n * @param css - The CSS string to transform.\n * @returns The transformed CSS with all selectors scoped.\n */\nexport function generateScopedSelectors(componentName: string, css: string): string {\n const scopeAttr = `[data-hx-styled=\"${componentName}\"]`;\n return transformCss(css, scopeAttr);\n}\n\n/**\n * Returns the character at position `i` in `str`, or an empty string if out of bounds.\n * Avoids the `string | undefined` issue from `noUncheckedIndexedAccess`.\n */\nfunction charAt(str: string, i: number): string {\n return str[i] ?? '';\n}\n\n/**\n * Recursively transforms CSS text, scoping all selectors under the given\n * attribute selector prefix.\n *\n * @param css - The CSS text to transform.\n * @param scopeAttr - The attribute selector to prepend (e.g. `[data-hx-styled=\"hx-card\"]`).\n * @returns The scoped CSS string.\n */\nfunction transformCss(css: string, scopeAttr: string): string {\n const result: string[] = [];\n let i = 0;\n const len = css.length;\n\n while (i < len) {\n // Skip whitespace\n while (i < len && /\\s/.test(charAt(css, i))) {\n result.push(charAt(css, i));\n i++;\n }\n\n if (i >= len) break;\n\n // Check for at-rule (e.g. @media, @supports, @keyframes)\n if (charAt(css, i) === '@') {\n const atBlock = extractAtRule(css, i);\n result.push(transformAtRule(atBlock.text, scopeAttr));\n i = atBlock.end;\n continue;\n }\n\n // Extract a selector block up to the opening brace\n const selectorEnd = css.indexOf('{', i);\n if (selectorEnd === -1) break;\n\n const selectorRaw = css.slice(i, selectorEnd);\n const bodyStart = selectorEnd + 1;\n const bodyEnd = findMatchingBrace(css, selectorEnd);\n\n if (bodyEnd === -1) break;\n\n const body = css.slice(bodyStart, bodyEnd);\n const scopedSelector = scopeSelector(selectorRaw, scopeAttr);\n result.push(`${scopedSelector}{${body}}`);\n i = bodyEnd + 1;\n }\n\n return result.join('');\n}\n\n/**\n * Scopes a raw selector string under the given attribute selector.\n * Handles comma-separated selectors, `::slotted()`, and `:host`.\n *\n * @param selectorRaw - The raw selector string (may be comma-separated).\n * @param scopeAttr - The attribute selector prefix.\n * @returns The scoped selector string.\n */\nfunction scopeSelector(selectorRaw: string, scopeAttr: string): string {\n return selectorRaw\n .split(',')\n .map((part) => {\n const trimmed = part.trim();\n\n // Replace ::slotted(*) with a direct descendant selector\n if (trimmed.startsWith('::slotted(') && trimmed.endsWith(')')) {\n const inner = trimmed.slice('::slotted('.length, -1).trim();\n return `${scopeAttr} ${inner}`;\n }\n\n // Replace :host with the scope attribute selector\n if (trimmed === ':host' || trimmed.startsWith(':host(') || trimmed.startsWith(':host ')) {\n return trimmed.replace(/^:host(\\([^)]*\\))?/, scopeAttr);\n }\n\n // Standard selector — prepend scope\n return `${scopeAttr} ${trimmed}`;\n })\n .join(', ');\n}\n\n/**\n * Handles transformation of an at-rule block. For container at-rules\n * (`@media`, `@supports`, `@layer`, `@container`) the inner rules are scoped.\n * Non-container at-rules (e.g. `@keyframes`, `@charset`) are passed through unchanged.\n *\n * @param atRuleText - The full at-rule text including its block.\n * @param scopeAttr - The attribute selector prefix.\n * @returns The transformed at-rule text.\n */\nfunction transformAtRule(atRuleText: string, scopeAttr: string): string {\n const containerAtRules = /^@(media|supports|layer|container|document)\\b/;\n const braceIndex = atRuleText.indexOf('{');\n\n if (braceIndex === -1 || !containerAtRules.test(atRuleText.trim())) {\n return atRuleText;\n }\n\n const head = atRuleText.slice(0, braceIndex + 1);\n const innerEnd = atRuleText.lastIndexOf('}');\n const inner = atRuleText.slice(braceIndex + 1, innerEnd);\n const tail = atRuleText.slice(innerEnd);\n\n return `${head}${transformCss(inner, scopeAttr)}${tail}`;\n}\n\n/**\n * Extracts a complete at-rule (potentially with a block) starting at index `start`.\n * Returns the text and the end index.\n */\nfunction extractAtRule(css: string, start: number): { text: string; end: number } {\n // Find either ';' (simple at-rule) or the matching '{...}' (block at-rule)\n let i = start;\n while (i < css.length && charAt(css, i) !== '{' && charAt(css, i) !== ';') {\n i++;\n }\n\n if (i >= css.length) {\n return { text: css.slice(start), end: css.length };\n }\n\n if (charAt(css, i) === ';') {\n return { text: css.slice(start, i + 1), end: i + 1 };\n }\n\n // Block at-rule — find matching closing brace\n const end = findMatchingBrace(css, i);\n if (end === -1) {\n return { text: css.slice(start), end: css.length };\n }\n\n return { text: css.slice(start, end + 1), end: end + 1 };\n}\n\n/**\n * Finds the index of the closing `}` that matches the `{` at `openIndex`.\n * Returns -1 if no matching brace is found.\n */\nfunction findMatchingBrace(css: string, openIndex: number): number {\n let depth = 0;\n for (let i = openIndex; i < css.length; i++) {\n const ch = charAt(css, i);\n if (ch === '{') depth++;\n else if (ch === '}') {\n depth--;\n if (depth === 0) return i;\n }\n }\n return -1;\n}\n","/**\n * @module injectLightStyles\n *\n * Core utility for injecting scoped `<style>` elements into `document.head`\n * to style light DOM slotted content in HELiX components. Uses the\n * `lightStyleRegistry` to deduplicate — each component type is injected at\n * most once per page lifetime.\n *\n * This is the primary mechanism for ensuring Drupal-slotted content inherits\n * proper typography and spacing when rendered into HELiX components.\n *\n * @example\n * ```ts\n * import { injectLightStyles } from '../../utilities/injectLightStyles.js';\n *\n * // In connectedCallback:\n * injectLightStyles('hx-card', 'p { font-size: var(--hx-font-size-md); }');\n * ```\n */\n\nimport { isStyleRegistered, registerStyle } from './lightStyleRegistry.js';\nimport { generateScopedSelectors } from './generateScopedSelectors.js';\n\n/**\n * Injects a scoped `<style>` element into `document.head` for light DOM content\n * belonging to `componentName`. The CSS is automatically scoped via\n * `generateScopedSelectors` so styles only apply inside\n * `[data-hx-styled=\"componentName\"]` wrappers.\n *\n * Safe to call multiple times — subsequent calls for the same `componentName`\n * are no-ops (deduplication via `lightStyleRegistry`).\n *\n * No-op in SSR environments where `document` is not defined.\n *\n * @param componentName - The component tag name used as the scope identifier\n * (e.g. `'hx-card'`). Must be unique per component type.\n * @param css - The raw CSS to scope and inject. Selectors will be prefixed with\n * `[data-hx-styled=\"componentName\"]`.\n */\nexport function injectLightStyles(componentName: string, css: string): void {\n if (typeof document === 'undefined') return;\n\n if (isStyleRegistered(componentName)) return;\n\n const scopedCss = generateScopedSelectors(componentName, css);\n\n const styleEl = document.createElement('style');\n styleEl.setAttribute('data-hx-light-styles', componentName);\n styleEl.textContent = scopedCss;\n\n document.head.appendChild(styleEl);\n registerStyle(componentName, styleEl);\n}\n","import { LitElement, html } from 'lit';\nimport '../../utilities/document-token-adoption.js';\nimport { customElement, property } from 'lit/decorators.js';\nimport { hxStyleScopeStyles } from './hx-style-scope.styles.js';\nimport { injectLightStyles } from '../../utilities/injectLightStyles.js';\n\n/**\n * A transparent wrapper component that injects scoped light DOM styles for its\n * slotted children. Designed for use in Drupal Twig templates where slotted\n * content lives in the light DOM and cannot inherit Shadow DOM styles.\n *\n * On connection, the component:\n * 1. Sets `data-hx-styled` on itself so scoped CSS selectors resolve correctly.\n * 2. Calls `injectLightStyles` to inject a `<style>` into `document.head` — once\n * per component type, deduplicated via `lightStyleRegistry`.\n *\n * The element renders as `display: contents` so it does not affect layout.\n *\n * @summary Scoped light DOM style injection wrapper for Drupal-slotted content.\n *\n * @tag hx-style-scope\n *\n * @slot - Default slot for any light DOM content that should receive scoped styles.\n *\n * @example\n * ```html\n * <hx-style-scope component=\"hx-card\">\n * <p>This paragraph will receive hx-card light DOM styles.</p>\n * </hx-style-scope>\n * ```\n *\n * @example Drupal Twig usage via macro\n * ```twig\n * {% import '@helix/hx-style-scope.macro.twig' as hx %}\n * {{ hx.scope('hx-card', content) }}\n * ```\n */\n@customElement('hx-style-scope')\nexport class HxStyleScope extends LitElement {\n static override styles = [hxStyleScopeStyles];\n\n /**\n * The component tag name whose light DOM styles should be injected.\n * Must match a registered component name (e.g. `'hx-card'`).\n *\n * When set, the element also applies `data-hx-styled` to itself so that\n * scoped CSS selectors generated by `generateScopedSelectors` resolve\n * correctly against slotted child elements.\n *\n * @attr component\n */\n @property({ type: String, reflect: true })\n component: string = '';\n\n /**\n * The CSS to inject as scoped light DOM styles. When provided alongside\n * `component`, this CSS will be scoped under `[data-hx-styled=\"component\"]`\n * and injected into `document.head` (once per component type).\n *\n * If omitted, `injectLightStyles` is still called but with an empty string,\n * which is a no-op for actual style injection.\n *\n * @attr light-css\n */\n @property({ type: String, attribute: 'light-css' })\n lightCss: string = '';\n\n override connectedCallback(): void {\n super.connectedCallback();\n this._applyScope();\n }\n\n override updated(changed: Map<string, unknown>): void {\n if (changed.has('component') || changed.has('lightCss')) {\n this._applyScope();\n }\n }\n\n /**\n * Applies the `data-hx-styled` attribute and triggers style injection.\n * Called on connect and whenever `component` or `lightCss` changes.\n */\n private _applyScope(): void {\n if (!this.component) return;\n\n // Set the scoping attribute so CSS selectors from generateScopedSelectors work.\n this.setAttribute('data-hx-styled', this.component);\n\n if (this.lightCss) {\n injectLightStyles(this.component, this.lightCss);\n }\n }\n\n override render() {\n return html`<slot></slot>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'hx-style-scope': HxStyleScope;\n }\n}\n"],"names":["hxStyleScopeStyles","css","lightStyleRegistry","isStyleRegistered","componentName","registerStyle","el","generateScopedSelectors","scopeAttr","transformCss","charAt","str","i","result","len","atBlock","extractAtRule","transformAtRule","selectorEnd","selectorRaw","bodyStart","bodyEnd","findMatchingBrace","body","scopedSelector","scopeSelector","part","trimmed","inner","atRuleText","containerAtRules","braceIndex","head","innerEnd","tail","start","end","openIndex","depth","ch","injectLightStyles","scopedCss","styleEl","HxStyleScope","LitElement","changed","html","__decorateClass","property","customElement"],"mappings":"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"}
@@ -1,9 +1,9 @@
1
1
  import { css as p, LitElement as x, nothing as o, html as c } from "lit";
2
+ import "./document-token-adoption-Dym9ALA4.js";
2
3
  import { property as s, query as _, state as m, customElement as w } from "lit/decorators.js";
3
4
  import { classMap as v } from "lit/directives/class-map.js";
4
5
  import { ifDefined as u } from "lit/directives/if-defined.js";
5
- import { tokenStyles as f } from "@helixui/tokens/lit";
6
- const b = p`
6
+ const f = p`
7
7
  :host {
8
8
  display: block;
9
9
  }
@@ -173,10 +173,10 @@ const b = p`
173
173
  }
174
174
  }
175
175
  `;
176
- var g = Object.defineProperty, k = Object.getOwnPropertyDescriptor, i = (t, r, l, a) => {
177
- for (var h = a > 1 ? void 0 : a ? k(r, l) : r, n = t.length - 1, d; n >= 0; n--)
176
+ var b = Object.defineProperty, g = Object.getOwnPropertyDescriptor, i = (t, r, l, a) => {
177
+ for (var h = a > 1 ? void 0 : a ? g(r, l) : r, n = t.length - 1, d; n >= 0; n--)
178
178
  (d = t[n]) && (h = (a ? d(r, l, h) : d(h)) || h);
179
- return a && h && g(r, l, h), h;
179
+ return a && h && b(r, l, h), h;
180
180
  };
181
181
  let e = class extends x {
182
182
  constructor() {
@@ -322,7 +322,7 @@ let e = class extends x {
322
322
  `;
323
323
  }
324
324
  };
325
- e.styles = [f, b];
325
+ e.styles = [f];
326
326
  e._instanceCounter = 0;
327
327
  e.formAssociated = !0;
328
328
  i([
@@ -370,4 +370,4 @@ e = i([
370
370
  export {
371
371
  e as H
372
372
  };
373
- //# sourceMappingURL=hx-switch-C0Lp5RGy.js.map
373
+ //# sourceMappingURL=hx-switch-BCNpbuk-.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hx-switch-BCNpbuk-.js","sources":["../../src/components/hx-switch/hx-switch.styles.ts","../../src/components/hx-switch/hx-switch.ts"],"sourcesContent":["import { css } from 'lit';\n\nexport const helixSwitchStyles = css`\n :host {\n display: block;\n }\n\n :host([disabled]) {\n opacity: var(--hx-opacity-disabled, 0.5);\n pointer-events: none;\n }\n\n * {\n box-sizing: border-box;\n }\n\n /* --- Layout --- */\n\n .switch {\n display: flex;\n flex-direction: column;\n gap: var(--hx-space-1, 0.25rem);\n font-family: var(--hx-font-family-sans, sans-serif);\n }\n\n .switch__control-row {\n display: flex;\n align-items: center;\n gap: var(--hx-space-2, 0.5rem);\n }\n\n /* --- Track --- */\n\n .switch__track {\n position: relative;\n display: inline-flex;\n align-items: center;\n flex-shrink: 0;\n border: none;\n padding: 0;\n border-radius: var(--hx-border-radius-full, 9999px);\n background-color: var(--hx-switch-track-bg, var(--hx-color-neutral-300, #ced4da));\n cursor: pointer;\n transition: background-color var(--hx-transition-fast, 150ms ease);\n outline: none;\n -webkit-appearance: none;\n appearance: none;\n }\n\n .switch__track:focus-visible {\n outline: var(--hx-focus-ring-width, 2px) solid\n var(\n --hx-switch-focus-ring-color,\n var(--hx-focus-ring-color, var(--hx-color-primary-400, #60a5fa))\n );\n outline-offset: var(--hx-focus-ring-offset, 2px);\n }\n\n .switch--checked .switch__track {\n background-color: var(--hx-switch-track-checked-bg, var(--hx-color-primary-500, #2563eb));\n }\n\n /* --- Thumb --- */\n\n .switch__thumb {\n position: absolute;\n border-radius: var(--hx-border-radius-full, 9999px);\n background-color: var(--hx-switch-thumb-bg, var(--hx-color-neutral-0, #ffffff));\n box-shadow: var(--hx-switch-thumb-shadow, var(--hx-shadow-sm, 0 1px 2px 0 rgb(0 0 0 / 0.05)));\n transition: transform var(--hx-transition-fast, 150ms ease);\n }\n\n /* --- Size: sm (track 32x18, thumb 14px) --- */\n\n .switch--sm .switch__track {\n width: var(--hx-switch-track-width-sm, var(--hx-size-8, 2rem));\n height: var(--hx-switch-track-height-sm, var(--hx-size-4-5, 1.125rem));\n }\n\n .switch--sm .switch__thumb {\n width: var(--hx-switch-thumb-size-sm, var(--hx-size-3-5, 0.875rem));\n height: var(--hx-switch-thumb-size-sm, var(--hx-size-3-5, 0.875rem));\n top: 50%;\n left: var(--hx-switch-thumb-offset, var(--hx-space-0-5, 0.125rem));\n transform: translateY(-50%);\n }\n\n .switch--sm.switch--checked .switch__thumb {\n transform: translateY(-50%)\n translateX(var(--hx-switch-thumb-size-sm, var(--hx-size-3-5, 0.875rem)));\n }\n\n /* --- Size: md (track 40x22, thumb 18px) --- */\n\n .switch--md .switch__track {\n width: var(--hx-switch-track-width-md, var(--hx-size-10, 2.5rem));\n height: var(--hx-switch-track-height-md, var(--hx-size-5-5, 1.375rem));\n }\n\n .switch--md .switch__thumb {\n width: var(--hx-switch-thumb-size-md, var(--hx-size-4-5, 1.125rem));\n height: var(--hx-switch-thumb-size-md, var(--hx-size-4-5, 1.125rem));\n top: 50%;\n left: var(--hx-switch-thumb-offset, var(--hx-space-0-5, 0.125rem));\n transform: translateY(-50%);\n }\n\n .switch--md.switch--checked .switch__thumb {\n transform: translateY(-50%)\n translateX(var(--hx-switch-thumb-size-md, var(--hx-size-4-5, 1.125rem)));\n }\n\n /* --- Size: lg (track 48x26, thumb 22px) --- */\n\n .switch--lg .switch__track {\n width: var(--hx-switch-track-width-lg, var(--hx-size-12, 3rem));\n height: var(--hx-switch-track-height-lg, var(--hx-size-6-5, 1.625rem));\n }\n\n .switch--lg .switch__thumb {\n width: var(--hx-switch-thumb-size-lg, var(--hx-size-5-5, 1.375rem));\n height: var(--hx-switch-thumb-size-lg, var(--hx-size-5-5, 1.375rem));\n top: 50%;\n left: var(--hx-switch-thumb-offset, var(--hx-space-0-5, 0.125rem));\n transform: translateY(-50%);\n }\n\n .switch--lg.switch--checked .switch__thumb {\n transform: translateY(-50%)\n translateX(var(--hx-switch-thumb-size-lg, var(--hx-size-5-5, 1.375rem)));\n }\n\n /* --- Label --- */\n\n .switch__label {\n font-size: var(--hx-font-size-sm, 0.875rem);\n font-weight: var(--hx-font-weight-medium, 500);\n color: var(--hx-switch-label-color, var(--hx-color-neutral-700, #343a40));\n line-height: var(--hx-line-height-normal, 1.5);\n cursor: pointer;\n user-select: none;\n -webkit-user-select: none;\n }\n\n .switch__required-marker {\n color: var(--hx-switch-error-color, var(--hx-color-error-text, #b91c1c));\n font-weight: var(--hx-font-weight-bold, 700);\n }\n\n /* --- Help Text & Error --- */\n\n .switch__help-text {\n font-size: var(--hx-font-size-xs, 0.75rem);\n color: var(--hx-switch-help-text-color, var(--hx-color-neutral-500, #6c757d));\n line-height: var(--hx-line-height-normal, 1.5);\n }\n\n .switch__error {\n font-size: var(--hx-font-size-xs, 0.75rem);\n color: var(--hx-switch-error-color, var(--hx-color-error-text, #b91c1c));\n line-height: var(--hx-line-height-normal, 1.5);\n }\n\n /* --- Reduced Motion --- */\n\n @media (prefers-reduced-motion: reduce) {\n .switch__track,\n .switch__thumb {\n transition: none;\n }\n }\n`;\n","import { LitElement, html, nothing, type PropertyValues } from 'lit';\nimport '../../utilities/document-token-adoption.js';\nimport { customElement, property, query, state } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { helixSwitchStyles } from './hx-switch.styles.js';\n\n/**\n * A toggle switch component for on/off states.\n *\n * Uses `role=\"switch\"` with `aria-checked` to convey toggle state.\n * Supports keyboard activation via Space key (per ARIA APG switch pattern).\n * Label association is handled through `aria-labelledby`, and\n * error/help text are linked via `aria-describedby`.\n *\n * @summary Form-associated toggle switch with label, error, and help text.\n *\n * @tag hx-switch\n *\n * @slot - Custom label content (overrides the label property).\n * @slot error - Custom error content (overrides the error property).\n * @slot help-text - Custom help text content (overrides the helpText property).\n *\n * @fires {CustomEvent<{checked: boolean, value: string}>} hx-change - Dispatched when the switch is toggled.\n *\n * @csspart switch - The switch container (track + thumb wrapper).\n * @csspart track - The track background element.\n * @csspart thumb - The sliding thumb element.\n * @csspart label - The label text element.\n * @csspart help-text - The help text container.\n * @csspart error - The error message container.\n *\n * @cssprop [--hx-switch-track-bg=var(--hx-color-neutral-300)] - Track background color.\n * @cssprop [--hx-switch-track-checked-bg=var(--hx-color-primary-500)] - Track background when checked.\n * @cssprop [--hx-switch-thumb-bg=var(--hx-color-neutral-0)] - Thumb background color.\n * @cssprop [--hx-switch-thumb-shadow=var(--hx-shadow-sm)] - Thumb box shadow.\n * @cssprop [--hx-switch-focus-ring-color=var(--hx-focus-ring-color)] - Focus ring color.\n * @cssprop [--hx-switch-label-color=var(--hx-color-neutral-700)] - Label text color.\n * @cssprop [--hx-switch-error-color=var(--hx-color-error-500)] - Error message color.\n * @cssprop [--hx-switch-help-text-color=var(--hx-color-neutral-500)] - Help text color.\n */\n@customElement('hx-switch')\nexport class HelixSwitch extends LitElement {\n static override styles = [helixSwitchStyles];\n\n /** Monotonic counter for deterministic, unique IDs across instances. */\n /** @internal */\n private static _instanceCounter = 0;\n\n // ─── Form Association ───\n\n /** @internal */\n static formAssociated = true;\n\n /** ElementInternals instance for form association, validation, and ARIA. */\n /** @internal */\n private _internals: ElementInternals;\n\n constructor() {\n super();\n /** @internal */\n this._internals = this.attachInternals();\n }\n\n // ─── Properties ───\n\n /**\n * Whether the switch is toggled on.\n * @attr checked\n */\n @property({ type: Boolean, reflect: true })\n checked = false;\n\n /**\n * Whether the switch is disabled.\n * @attr disabled\n */\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n /**\n * Whether the switch is required for form submission.\n * @attr required\n */\n @property({ type: Boolean, reflect: true })\n required = false;\n\n /**\n * The name of the switch, used for form submission.\n * @attr name\n */\n @property({ type: String })\n name = '';\n\n /**\n * The value submitted when the switch is checked.\n * @attr value\n */\n @property({ type: String })\n value = 'on';\n\n /**\n * The visible label text for the switch.\n * @attr label\n */\n @property({ type: String })\n label = '';\n\n /**\n * Size variant of the switch.\n * @attr hx-size\n */\n @property({ type: String, reflect: true, attribute: 'hx-size' })\n size: 'sm' | 'md' | 'lg' = 'md';\n\n /**\n * Error message to display. When set, the switch enters an error state.\n * @attr error\n */\n @property({ type: String })\n error = '';\n\n /**\n * Help text displayed below the switch for guidance.\n * @attr help-text\n */\n @property({ type: String, attribute: 'help-text' })\n helpText = '';\n\n /**\n * Validation message shown when the field is required but empty.\n * @attr required-message\n */\n @property({ attribute: 'required-message' })\n requiredMessage = 'This field is required.';\n\n // ─── Lifecycle ───\n\n override updated(changedProperties: PropertyValues<this>): void {\n super.updated(changedProperties);\n if (changedProperties.has('checked') || changedProperties.has('value')) {\n this._internals.setFormValue(this.checked ? this.value : null);\n this._updateValidity();\n }\n if (changedProperties.has('required')) {\n this._updateValidity();\n }\n }\n\n // ─── Form Integration ───\n\n /** Returns the associated form element, if any. */\n get form(): HTMLFormElement | null {\n return this._internals.form;\n }\n\n /** Returns the validation message. */\n get validationMessage(): string {\n return this._internals.validationMessage;\n }\n\n /** Returns the ValidityState object. */\n get validity(): ValidityState {\n return this._internals.validity;\n }\n\n /** Checks whether the switch satisfies its constraints. */\n checkValidity(): boolean {\n return this._internals.checkValidity();\n }\n\n /** Reports validity and shows the browser's constraint validation UI. */\n reportValidity(): boolean {\n return this._internals.reportValidity();\n }\n\n /** Recalculates and sets the validity state based on required and checked. */\n /** @internal */\n private _updateValidity(): void {\n if (this.required && !this.checked) {\n this._internals.setValidity(\n { valueMissing: true },\n this.error || this.requiredMessage,\n this._trackEl ?? undefined,\n );\n } else {\n this._internals.setValidity({});\n }\n }\n\n /** @internal */\n formResetCallback(): void {\n this.checked = false;\n this._internals.setFormValue(null);\n }\n\n /** @internal */\n formStateRestoreCallback(state: File | string | null, _mode: 'restore' | 'autocomplete'): void {\n if (typeof state === 'string') {\n this.checked = state === this.value;\n }\n }\n\n /** @internal */\n formDisabledCallback(disabled: boolean): void {\n this.disabled = disabled;\n }\n\n /** Reference to the native button element acting as the switch track. * @internal\n */\n @query('.switch__track')\n private _trackEl: HTMLButtonElement | null | undefined;\n\n /** Whether the error slot has assigned content. */\n /** @internal */\n @state() private _hasErrorSlot = false;\n\n /** Whether the default slot has assigned content (slotted label). */\n /** @internal */\n @state() private _hasDefaultSlot = false;\n\n // ─── Slot Handlers ───\n\n /** Updates _hasErrorSlot when error slot content changes. */\n /** @internal */\n private _handleErrorSlotChange(e: Event): void {\n const slot = e.target as HTMLSlotElement;\n this._hasErrorSlot = slot.assignedNodes({ flatten: true }).length > 0;\n }\n\n /** Updates _hasDefaultSlot when default slot content changes. */\n /** @internal */\n private _handleDefaultSlotChange(e: Event): void {\n const slot = e.target as HTMLSlotElement;\n this._hasDefaultSlot = slot.assignedNodes({ flatten: true }).length > 0;\n }\n\n // ─── Event Handling ───\n\n /** Toggles checked state and dispatches hx-change event. */\n /** @internal */\n private _toggle(): void {\n if (this.disabled) return;\n this.checked = !this.checked;\n\n this.dispatchEvent(\n new CustomEvent<{ checked: boolean; value: string }>('hx-change', {\n bubbles: true,\n composed: true,\n detail: { checked: this.checked, value: this.value },\n }),\n );\n }\n\n /** Handles click events on the track. */\n /** @internal */\n private _handleClick(): void {\n this._toggle();\n }\n\n /** Handles keydown events — Space toggles the switch per ARIA APG. */\n /** @internal */\n private _handleKeyDown(e: KeyboardEvent): void {\n if (e.key === ' ') {\n e.preventDefault();\n this._toggle();\n }\n }\n\n // ─── Public Methods ───\n\n /** Moves focus to the switch track element. */\n override focus(options?: FocusOptions): void {\n this._trackEl?.focus(options);\n }\n\n // ─── Render ───\n\n /** Unique ID for this switch instance, used for ARIA associations. */\n /** @internal */\n private _switchId = `hx-switch-${++HelixSwitch._instanceCounter}`;\n /** ID for the label element, referenced by aria-labelledby. */\n /** @internal */\n private _labelId = `${this._switchId}-label`;\n /** ID for the help text element, referenced by aria-describedby. */\n /** @internal */\n private _helpTextId = `${this._switchId}-help`;\n /** ID for the error element, referenced by aria-describedby. */\n /** @internal */\n private _errorId = `${this._switchId}-error`;\n\n override render() {\n const hasError = !!this.error;\n const hasLabel = !!this.label || this._hasDefaultSlot;\n\n const containerClasses = {\n switch: true,\n 'switch--checked': this.checked,\n 'switch--disabled': this.disabled,\n 'switch--required': this.required,\n 'switch--error': hasError,\n [`switch--${this.size}`]: true,\n };\n\n const describedBy =\n [\n hasError || this._hasErrorSlot ? this._errorId : null,\n this.helpText && !hasError ? this._helpTextId : null,\n ]\n .filter(Boolean)\n .join(' ') || undefined;\n\n return html`\n <div part=\"switch\" class=${classMap(containerClasses)}>\n <div class=\"switch__control-row\">\n <button\n part=\"track\"\n class=\"switch__track\"\n id=${this._switchId}\n type=\"button\"\n role=\"switch\"\n aria-checked=${this.checked ? 'true' : 'false'}\n aria-labelledby=${ifDefined(hasLabel ? this._labelId : undefined)}\n aria-describedby=${ifDefined(describedBy)}\n aria-invalid=${hasError ? 'true' : nothing}\n aria-required=${this.required ? 'true' : nothing}\n ?disabled=${this.disabled}\n @click=${this._handleClick}\n @keydown=${this._handleKeyDown}\n >\n <span part=\"thumb\" class=\"switch__thumb\"></span>\n </button>\n\n <label part=\"label\" class=\"switch__label\" id=${this._labelId} for=${this._switchId}>\n <slot @slotchange=${this._handleDefaultSlotChange}>${this.label}</slot>${this.required\n ? html`<span class=\"switch__required-marker\" aria-hidden=\"true\">*</span>`\n : nothing}\n </label>\n </div>\n\n <slot name=\"error\" @slotchange=${this._handleErrorSlotChange}>\n ${hasError\n ? html`<div part=\"error\" class=\"switch__error\" id=${this._errorId} role=\"alert\">\n ${this.error}\n </div>`\n : nothing}\n </slot>\n\n ${this.helpText && !hasError\n ? html`\n <div part=\"help-text\" class=\"switch__help-text\" id=${this._helpTextId}>\n <slot name=\"help-text\">${this.helpText}</slot>\n </div>\n `\n : nothing}\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'hx-switch': HelixSwitch;\n }\n}\n\n/** @deprecated Use HxSwitch instead. */\nexport type WcSwitch = HelixSwitch;\nexport type HxSwitch = HelixSwitch;\n"],"names":["helixSwitchStyles","css","HelixSwitch","LitElement","changedProperties","state","_mode","disabled","e","slot","options","_a","hasError","hasLabel","containerClasses","describedBy","html","classMap","ifDefined","nothing","__decorateClass","property","query","customElement"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
- import { css as v, LitElement as _, html as m, nothing as N } from "lit";
1
+ import { css as v, LitElement as _, html as m, nothing as $ } from "lit";
2
+ import "./document-token-adoption-Dym9ALA4.js";
2
3
  import { property as h, state as g, customElement as y } from "lit/decorators.js";
3
- import { tokenStyles as w } from "@helixui/tokens/lit";
4
- import { d as E } from "./dev-warn-YlwPHjtX.js";
5
- const O = v`
4
+ import { d as C } from "./dev-warn-YlwPHjtX.js";
5
+ const N = v`
6
6
  :host {
7
7
  display: block;
8
8
  font-family: var(--hx-font-family-sans, sans-serif);
@@ -79,14 +79,14 @@ const O = v`
79
79
  }
80
80
  }
81
81
  `;
82
- var I = Object.defineProperty, k = Object.getOwnPropertyDescriptor, p = (e, t, a, i) => {
83
- for (var s = i > 1 ? void 0 : i ? k(t, a) : t, r = e.length - 1, n; r >= 0; r--)
82
+ var O = Object.defineProperty, I = Object.getOwnPropertyDescriptor, p = (e, t, a, i) => {
83
+ for (var s = i > 1 ? void 0 : i ? I(t, a) : t, r = e.length - 1, n; r >= 0; r--)
84
84
  (n = e[r]) && (s = (i ? n(t, a, s) : n(s)) || s);
85
- return i && s && I(t, a, s), s;
85
+ return i && s && O(t, a, s), s;
86
86
  };
87
- let L = 0, b = class extends _ {
87
+ let k = 0, b = class extends _ {
88
88
  constructor() {
89
- super(...arguments), this._id = `hx-tabs-${++L}`, this.orientation = "horizontal", this.activation = "automatic", this.label = "", this._activePanel = "", this._cachedTabs = null, this._cachedPanels = null, this._observer = null, this._pendingIndex = null, this._handleTabSelect = (e) => {
89
+ super(...arguments), this._id = `hx-tabs-${++k}`, this.orientation = "horizontal", this.activation = "automatic", this.label = "", this._activePanel = "", this._cachedTabs = null, this._cachedPanels = null, this._observer = null, this._pendingIndex = null, this._handleTabSelect = (e) => {
90
90
  if (!(e instanceof CustomEvent)) return;
91
91
  e.stopPropagation();
92
92
  const t = e.composedPath().find((a) => a instanceof Element && a.tagName.toLowerCase() === "hx-tab");
@@ -97,7 +97,7 @@ let L = 0, b = class extends _ {
97
97
  a ? this._activateTab(a, !1) : this._activePanel = "";
98
98
  }
99
99
  }, this._handleKeydown = (e) => {
100
- var T, P, S, C;
100
+ var w, T, P, S;
101
101
  const t = this._getTabs();
102
102
  if (t.length === 0)
103
103
  return;
@@ -106,19 +106,19 @@ let L = 0, b = class extends _ {
106
106
  return;
107
107
  const n = t.find((u) => u === document.activeElement);
108
108
  if (e.key === " " || e.key === "Enter") {
109
- n && !n.disabled && (e.preventDefault(), this._activateTab(n), (P = (T = n.shadowRoot) == null ? void 0 : T.querySelector("button")) == null || P.focus());
109
+ n && !n.disabled && (e.preventDefault(), this._activateTab(n), (T = (w = n.shadowRoot) == null ? void 0 : w.querySelector("button")) == null || T.focus());
110
110
  return;
111
111
  }
112
112
  e.preventDefault();
113
113
  let o = n ? t.indexOf(n) : -1;
114
114
  if (o === -1) {
115
- const u = t.find(($) => $.panel === this._activePanel);
115
+ const u = t.find((A) => A.panel === this._activePanel);
116
116
  o = u ? t.indexOf(u) : 0;
117
117
  }
118
118
  let d;
119
119
  e.key === "Home" ? d = 0 : e.key === "End" ? d = t.length - 1 : e.key === s ? d = (o + 1) % t.length : d = o <= 0 ? t.length - 1 : o - 1;
120
120
  const l = t[d];
121
- l && ((C = (S = l.shadowRoot) == null ? void 0 : S.querySelector("button")) == null || C.focus(), this.activation === "automatic" && !l.disabled && this._activateTab(l));
121
+ l && ((S = (P = l.shadowRoot) == null ? void 0 : P.querySelector("button")) == null || S.focus(), this.activation === "automatic" && !l.disabled && this._activateTab(l));
122
122
  };
123
123
  }
124
124
  // ─── Attribute Observation ───
@@ -246,14 +246,14 @@ let L = 0, b = class extends _ {
246
246
  const e = (a = this.shadowRoot) == null ? void 0 : a.querySelector('slot[name="tab"]'), t = (i = this.shadowRoot) == null ? void 0 : i.querySelector("slot:not([name])");
247
247
  if (e) {
248
248
  const s = e.assignedElements().filter((r) => r.tagName.toLowerCase() !== "hx-tab");
249
- s.length > 0 && E(
249
+ s.length > 0 && C(
250
250
  "hx-tabs",
251
251
  `Slot "tab" expects <hx-tab> elements. Found unexpected: ${s.map((r) => `<${r.tagName.toLowerCase()}>`).join(", ")}`
252
252
  );
253
253
  }
254
254
  if (t) {
255
255
  const s = t.assignedElements().filter((r) => r.tagName.toLowerCase() !== "hx-tab-panel");
256
- s.length > 0 && E(
256
+ s.length > 0 && C(
257
257
  "hx-tabs",
258
258
  `Default slot expects <hx-tab-panel> elements. Found unexpected: ${s.map((r) => `<${r.tagName.toLowerCase()}>`).join(", ")}`
259
259
  );
@@ -279,7 +279,7 @@ let L = 0, b = class extends _ {
279
279
  `;
280
280
  }
281
281
  };
282
- b.styles = [w, O];
282
+ b.styles = [N];
283
283
  p([
284
284
  h({ type: String, reflect: !0 })
285
285
  ], b.prototype, "orientation", 2);
@@ -295,7 +295,7 @@ p([
295
295
  b = p([
296
296
  y("hx-tabs")
297
297
  ], b);
298
- const z = v`
298
+ const L = v`
299
299
  :host {
300
300
  display: inline-block;
301
301
  }
@@ -395,10 +395,10 @@ const z = v`
395
395
  }
396
396
  }
397
397
  `;
398
- var D = Object.defineProperty, j = Object.getOwnPropertyDescriptor, f = (e, t, a, i) => {
399
- for (var s = i > 1 ? void 0 : i ? j(t, a) : t, r = e.length - 1, n; r >= 0; r--)
398
+ var z = Object.defineProperty, D = Object.getOwnPropertyDescriptor, f = (e, t, a, i) => {
399
+ for (var s = i > 1 ? void 0 : i ? D(t, a) : t, r = e.length - 1, n; r >= 0; r--)
400
400
  (n = e[r]) && (s = (i ? n(t, a, s) : n(s)) || s);
401
- return i && s && D(t, a, s), s;
401
+ return i && s && z(t, a, s), s;
402
402
  };
403
403
  let c = class extends _ {
404
404
  constructor() {
@@ -438,7 +438,7 @@ let c = class extends _ {
438
438
  role="tab"
439
439
  aria-selected=${this.selected ? "true" : "false"}
440
440
  aria-disabled=${this.disabled ? "true" : "false"}
441
- aria-controls=${this.controls || N}
441
+ aria-controls=${this.controls || $}
442
442
  tabindex=${this.selected ? "0" : "-1"}
443
443
  @click=${this._handleClick}
444
444
  >
@@ -453,7 +453,7 @@ let c = class extends _ {
453
453
  `;
454
454
  }
455
455
  };
456
- c.styles = [w, z];
456
+ c.styles = [L];
457
457
  f([
458
458
  h({ type: String, reflect: !0 })
459
459
  ], c.prototype, "panel", 2);
@@ -475,7 +475,7 @@ f([
475
475
  c = f([
476
476
  y("hx-tab")
477
477
  ], c);
478
- const H = v`
478
+ const j = v`
479
479
  :host {
480
480
  display: block;
481
481
  }
@@ -507,10 +507,10 @@ const H = v`
507
507
  outline: none;
508
508
  }
509
509
  `;
510
- var K = Object.defineProperty, R = Object.getOwnPropertyDescriptor, A = (e, t, a, i) => {
511
- for (var s = i > 1 ? void 0 : i ? R(t, a) : t, r = e.length - 1, n; r >= 0; r--)
510
+ var H = Object.defineProperty, K = Object.getOwnPropertyDescriptor, E = (e, t, a, i) => {
511
+ for (var s = i > 1 ? void 0 : i ? K(t, a) : t, r = e.length - 1, n; r >= 0; r--)
512
512
  (n = e[r]) && (s = (i ? n(t, a, s) : n(s)) || s);
513
- return i && s && K(t, a, s), s;
513
+ return i && s && H(t, a, s), s;
514
514
  };
515
515
  let x = class extends _ {
516
516
  constructor() {
@@ -529,11 +529,11 @@ let x = class extends _ {
529
529
  `;
530
530
  }
531
531
  };
532
- x.styles = [w, H];
533
- A([
532
+ x.styles = [j];
533
+ E([
534
534
  h({ type: String, reflect: !0 })
535
535
  ], x.prototype, "name", 2);
536
- x = A([
536
+ x = E([
537
537
  y("hx-tab-panel")
538
538
  ], x);
539
539
  export {
@@ -541,4 +541,4 @@ export {
541
541
  x as a,
542
542
  b
543
543
  };
544
- //# sourceMappingURL=hx-tab-panel-Dnt8aA74.js.map
544
+ //# sourceMappingURL=hx-tab-panel-D7BTBgDQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hx-tab-panel-D7BTBgDQ.js","sources":["../../src/components/hx-tabs/hx-tabs.styles.ts","../../src/components/hx-tabs/hx-tabs.ts","../../src/components/hx-tabs/hx-tab.styles.ts","../../src/components/hx-tabs/hx-tab.ts","../../src/components/hx-tabs/hx-tab-panel.styles.ts","../../src/components/hx-tabs/hx-tab-panel.ts"],"sourcesContent":["import { css } from 'lit';\n\nexport const helixTabsStyles = css`\n :host {\n display: block;\n font-family: var(--hx-font-family-sans, sans-serif);\n }\n\n * {\n box-sizing: border-box;\n }\n\n /* ─── Container ─── */\n\n .tabs {\n display: flex;\n flex-direction: column;\n gap: var(--hx-tabs-gap, 0);\n }\n\n :host([orientation='vertical']) .tabs {\n flex-direction: row;\n }\n\n /* ─── Tablist ─── */\n\n .tablist {\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n gap: 0;\n border-bottom: var(--hx-tabs-border-width, 1px) solid\n var(--hx-tabs-border-color, var(--hx-color-neutral-200, #e9ecef));\n overflow-x: auto;\n scrollbar-width: none;\n }\n\n .tablist::-webkit-scrollbar {\n display: none;\n }\n\n /* ─── Vertical Orientation ─── */\n\n :host([orientation='vertical']) {\n --_tab-indicator-bottom: 0px;\n --_tab-indicator-end: var(--hx-tabs-indicator-size, 2px);\n --_tab-indicator-bottom-color: transparent;\n --_tab-indicator-end-color: var(\n --hx-tabs-indicator-color,\n var(--hx-color-primary-500, #2563eb)\n );\n }\n\n :host([orientation='vertical']) .tablist {\n flex-direction: column;\n border-bottom: none;\n border-inline-end: var(--hx-tabs-border-width, 1px) solid\n var(--hx-tabs-border-color, var(--hx-color-neutral-200, #e9ecef));\n overflow-x: visible;\n overflow-y: auto;\n min-width: var(--hx-tabs-vertical-width, 12rem);\n flex-shrink: 0;\n }\n\n /* ─── Panels Container ─── */\n\n .panels {\n flex: 1 1 auto;\n min-width: 0;\n }\n\n /* ─── Reduced Motion ─── */\n\n @media (prefers-reduced-motion: reduce) {\n .tablist {\n scroll-behavior: auto;\n }\n }\n`;\n","import { LitElement, html, type PropertyValues } from 'lit';\nimport '../../utilities/document-token-adoption.js';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { helixTabsStyles } from './hx-tabs.styles.js';\nimport type { HelixTab } from './hx-tab.js';\nimport type { HelixTabPanel } from './hx-tab-panel.js';\nimport { devWarn } from '../../utils/dev-warn.js';\n\n// Module-level counter for stable, SSR-safe IDs (avoids Math.random() hydration mismatch)\nlet _hxTabsIdCounter = 0;\n\n/**\n * A tabbed content organizer that manages a set of `<hx-tab>` and `<hx-tab-panel>` children.\n * Supports horizontal and vertical orientations, automatic and manual activation modes,\n * and full keyboard navigation per the ARIA Authoring Practices Guide.\n *\n * @summary Tab container that organizes content into selectable panels.\n *\n * @tag hx-tabs\n *\n * @slot tab - Slot for `<hx-tab>` elements. Rendered inside the tablist.\n * @slot - Default slot for `<hx-tab-panel>` elements.\n *\n * @fires {CustomEvent<{tabId: string, index: number}>} hx-tab-change - Dispatched when the active tab changes.\n *\n * @csspart tablist - The tablist container element.\n * @csspart panels - The panel content container element.\n *\n * @cssprop [--hx-tabs-border-color=var(--hx-color-neutral-200, #e9ecef)] - Tablist border color.\n * @cssprop [--hx-tabs-border-width=1px] - Tablist border width.\n * @cssprop [--hx-tabs-vertical-width=12rem] - Width of the tablist in vertical orientation.\n * @cssprop [--hx-tabs-gap=0] - Gap between the tablist and panels container.\n * @cssprop [--hx-tabs-tab-color=var(--hx-color-neutral-600, #495057)] - Inactive tab text color.\n * @cssprop [--hx-tabs-tab-active-color=var(--hx-color-primary-600, #1d4ed8)] - Active tab text color.\n * @cssprop [--hx-tabs-tab-hover-color=var(--hx-color-neutral-800, #212529)] - Tab hover text color.\n * @cssprop [--hx-tabs-tab-hover-bg=var(--hx-color-neutral-50, #f8f9fa)] - Tab hover background.\n * @cssprop [--hx-tabs-tab-font-size=var(--hx-font-size-md, 1rem)] - Tab font size.\n * @cssprop [--hx-tabs-tab-font-weight=var(--hx-font-weight-medium, 500)] - Tab font weight.\n * @cssprop [--hx-tabs-tab-active-font-weight=var(--hx-font-weight-semibold, 600)] - Active tab font weight.\n * @cssprop [--hx-tabs-tab-padding-x=var(--hx-space-4, 1rem)] - Horizontal tab padding.\n * @cssprop [--hx-tabs-tab-padding-y=var(--hx-space-2, 0.5rem)] - Vertical tab padding.\n * @cssprop [--hx-tabs-indicator-color=var(--hx-color-primary-500, #2563eb)] - Active indicator color.\n * @cssprop [--hx-tabs-indicator-size=2px] - Active indicator thickness.\n * @cssprop [--hx-tabs-focus-ring-color=var(--hx-focus-ring-color, #2563eb)] - Focus ring color for tabs and panels.\n * @cssprop [--hx-tabs-panel-padding=var(--hx-space-4, 1rem)] - Panel inner padding.\n * @cssprop [--hx-tabs-panel-color=var(--hx-color-neutral-700, #343a40)] - Panel text color.\n */\n@customElement('hx-tabs')\nexport class HelixTabs extends LitElement {\n static override styles = [helixTabsStyles];\n\n // ─── Internal ID ───\n\n /** @internal */\n private _id = `hx-tabs-${++_hxTabsIdCounter}`;\n\n // ─── Properties ───\n\n /**\n * The layout orientation of the tabs.\n * @attr orientation\n */\n @property({ type: String, reflect: true })\n orientation: 'horizontal' | 'vertical' = 'horizontal';\n\n /**\n * Controls how keyboard navigation activates tabs.\n * In `automatic` mode, focus also activates the tab.\n * In `manual` mode, focus moves independently; Space or Enter activates.\n * @attr activation\n */\n @property({ type: String, attribute: 'activation', reflect: true })\n activation: 'manual' | 'automatic' = 'automatic';\n\n /**\n * Accessible label for the tablist. Rendered as `aria-label` on the tablist container.\n * Provide a brief description of what the tabs represent (e.g., \"Patient record sections\").\n * @attr label\n */\n @property({ type: String, reflect: true })\n label = '';\n\n // ─── State ───\n\n /** @internal */\n @state() private _activePanel = '';\n\n // ─── Child Accessors ───\n\n /** @internal */\n private _cachedTabs: HelixTab[] | null = null;\n /** @internal */\n private _cachedPanels: HelixTabPanel[] | null = null;\n /** @internal */\n private _observer: MutationObserver | null = null;\n /**\n * Stores a requested tab index from the `selected-index` attribute before the component\n * has finished its first update (e.g. server-rendered Drupal pages).\n * @internal\n */\n private _pendingIndex: number | null = null;\n\n // ─── Attribute Observation ───\n\n static override get observedAttributes(): string[] {\n return [...(super.observedAttributes ?? []), 'selected-index'];\n }\n\n override attributeChangedCallback(name: string, old: string | null, value: string | null): void {\n super.attributeChangedCallback(name, old, value);\n if (name === 'selected-index' && value !== null && old !== value) {\n const index = parseInt(value, 10);\n if (!isNaN(index) && index >= 0) {\n if (this.hasUpdated) {\n // Already initialised — apply immediately\n const tab = this._getTabs()[index];\n if (tab && !tab.disabled) {\n this._activateTab(tab, false);\n }\n } else {\n // Store for application in firstUpdated\n this._pendingIndex = index;\n }\n }\n }\n }\n\n // ─── Public API ───\n\n /**\n * Gets or sets the zero-based index of the currently selected tab.\n * Setting this programmatically activates the tab at the given index.\n * Can also be set via the `selected-index` HTML attribute for server-side\n * pre-selection (e.g. Drupal Twig templates).\n */\n get selectedIndex(): number {\n return this._getTabs().findIndex((tab) => tab.panel === this._activePanel);\n }\n\n set selectedIndex(index: number) {\n const tab = this._getTabs()[index];\n if (tab && !tab.disabled) {\n this._activateTab(tab, true);\n }\n }\n\n /** @internal */\n private _getTabs(): HelixTab[] {\n if (!this._cachedTabs) {\n this._cachedTabs = Array.from(this.querySelectorAll(':scope > hx-tab')).filter(\n (el): el is HelixTab => el.tagName.toLowerCase() === 'hx-tab',\n );\n }\n return this._cachedTabs;\n }\n\n /** @internal */\n private _getPanels(): HelixTabPanel[] {\n if (!this._cachedPanels) {\n this._cachedPanels = Array.from(this.querySelectorAll(':scope > hx-tab-panel')).filter(\n (el): el is HelixTabPanel => el.tagName.toLowerCase() === 'hx-tab-panel',\n );\n }\n return this._cachedPanels;\n }\n\n /** @internal */\n private _getEnabledTabs(): HelixTab[] {\n return this._getTabs().filter((tab) => !tab.disabled);\n }\n\n // ─── Lifecycle ───\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.addEventListener('hx-tab-select', this._handleTabSelect);\n this.addEventListener('keydown', this._handleKeydown);\n // Watch for panel/name attribute changes on child tabs and panels\n if (typeof MutationObserver !== 'undefined') {\n this._observer = new MutationObserver(() => {\n this._cachedTabs = null;\n this._cachedPanels = null;\n this._syncTabsAndPanels();\n });\n this._observer.observe(this, {\n subtree: false,\n attributeFilter: ['panel', 'name'],\n });\n }\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener('hx-tab-select', this._handleTabSelect);\n this.removeEventListener('keydown', this._handleKeydown);\n this._observer?.disconnect();\n this._observer = null;\n }\n\n override firstUpdated(): void {\n if (this.label === '') {\n devWarn(\n 'hx-tabs',\n 'No accessible label provided. Set the `label` attribute on hx-tabs to describe what the tabs represent (e.g., \"Patient record sections\"). An unlabeled tablist violates WCAG 4.1.2.',\n );\n }\n\n this._syncTabsAndPanels();\n\n // Apply a pending selected-index (set via HTML attribute before upgrade, e.g. Drupal Twig)\n if (this._pendingIndex !== null) {\n const pendingTab = this._getTabs()[this._pendingIndex];\n this._pendingIndex = null;\n if (pendingTab && !pendingTab.disabled) {\n this._activateTab(pendingTab, false);\n return;\n }\n }\n\n // Activate the first enabled tab if none is selected\n if (!this._activePanel) {\n const firstEnabled = this._getEnabledTabs()[0];\n if (firstEnabled) {\n this._activateTab(firstEnabled, false);\n }\n }\n }\n\n override updated(changedProperties: PropertyValues<this>): void {\n super.updated(changedProperties);\n if ((changedProperties as Map<PropertyKey, unknown>).has('_activePanel')) {\n this._updateTabsAndPanels();\n }\n }\n\n // ─── Tab / Panel Sync ───\n\n /** @internal */\n private _syncTabsAndPanels(): void {\n const tabs = this._getTabs();\n const panels = this._getPanels();\n\n tabs.forEach((tab, i) => {\n const tabId = tab.id || `hx-tab-${this._id}-${i}`;\n tab.id = tabId;\n\n // Connect tab to its panel by aria-controls\n const panelName = tab.panel;\n const panel = panels.find((p) => p.name === panelName) ?? panels[i];\n if (panel) {\n const panelId = panel.id || `hx-panel-${this._id}-${i}`;\n panel.id = panelId;\n // Set controls on the tab so aria-controls lands on the inner button (role=\"tab\")\n tab.controls = panelId;\n // Use aria-label instead of aria-labelledby to avoid shadow boundary failures.\n // aria-labelledby pointing to hx-tab host IDs fails because the host element's\n // accessible text is inside its shadow DOM (the inner <button>), which AT cannot\n // traverse via aria-labelledby references across shadow roots.\n // Extract only default-slot children (no `slot` attribute) to exclude prefix/suffix\n // slot content (e.g. badge counts) from the panel accessible name (WCAG 1.3.1).\n const tabLabel = Array.from(tab.childNodes)\n .filter(\n (node) =>\n node.nodeType === Node.TEXT_NODE ||\n (node.nodeType === Node.ELEMENT_NODE && !(node as Element).hasAttribute('slot')),\n )\n .map((node) => node.textContent ?? '')\n .join('')\n .trim();\n if (tabLabel) {\n panel.setAttribute('aria-label', tabLabel);\n panel.removeAttribute('aria-labelledby');\n } else {\n // Fall back to aria-labelledby if no text content is yet available;\n // this will be corrected on slotchange once content is assigned.\n panel.setAttribute('aria-labelledby', tabId);\n }\n }\n });\n\n this._updateTabsAndPanels();\n }\n\n /** @internal */\n private _updateTabsAndPanels(): void {\n const tabs = this._getTabs();\n const panels = this._getPanels();\n\n tabs.forEach((tab) => {\n const isSelected = tab.panel === this._activePanel;\n tab.selected = isSelected;\n // Dual tabindex is intentional: the inner button in hx-tab manages its own tabindex\n // via the `selected` property. We also set it on the host element for the roving\n // tabindex pattern so document.activeElement comparisons work correctly when the\n // inner button is focused. This is safe because the inner button is the only\n // focusable element in hx-tab's shadow DOM (WCAG 2.4.3).\n tab.tabIndex = isSelected ? 0 : -1;\n });\n\n panels.forEach((panel) => {\n const isActive = panel.name === this._activePanel;\n if (isActive) {\n panel.removeAttribute('hidden');\n panel.setAttribute('tabindex', '0');\n } else {\n panel.setAttribute('hidden', '');\n panel.setAttribute('tabindex', '-1');\n }\n });\n }\n\n // ─── Tab Activation ───\n\n /** @internal */\n private _activateTab(tab: HelixTab, dispatchEvent = true): void {\n if (tab.disabled) {\n return;\n }\n\n const tabs = this._getTabs();\n const previousPanel = this._activePanel;\n this._activePanel = tab.panel;\n\n if (dispatchEvent && previousPanel !== this._activePanel) {\n const index = tabs.indexOf(tab);\n /**\n * Dispatched when the active tab changes.\n * @event hx-tab-change\n */\n this.dispatchEvent(\n new CustomEvent<{ tabId: string; index: number }>('hx-tab-change', {\n bubbles: true,\n composed: true,\n detail: { tabId: tab.id, index },\n }),\n );\n }\n }\n\n // ─── Event Handling ───\n\n /** @internal */\n private _handleTabSelect = (e: Event): void => {\n if (!(e instanceof CustomEvent)) return;\n e.stopPropagation();\n const tab = e\n .composedPath()\n .find((el): el is HelixTab => el instanceof Element && el.tagName.toLowerCase() === 'hx-tab');\n if (tab) {\n this._activateTab(tab);\n }\n };\n\n /** @internal */\n private _warnInvalidSlotContent(): void {\n const tabSlot = this.shadowRoot?.querySelector<HTMLSlotElement>('slot[name=\"tab\"]');\n const panelSlot = this.shadowRoot?.querySelector<HTMLSlotElement>('slot:not([name])');\n if (tabSlot) {\n const invalid = tabSlot\n .assignedElements()\n .filter((el) => el.tagName.toLowerCase() !== 'hx-tab');\n if (invalid.length > 0) {\n devWarn(\n 'hx-tabs',\n `Slot \"tab\" expects <hx-tab> elements. Found unexpected: ${invalid.map((el) => `<${el.tagName.toLowerCase()}>`).join(', ')}`,\n );\n }\n }\n if (panelSlot) {\n const invalid = panelSlot\n .assignedElements()\n .filter((el) => el.tagName.toLowerCase() !== 'hx-tab-panel');\n if (invalid.length > 0) {\n devWarn(\n 'hx-tabs',\n `Default slot expects <hx-tab-panel> elements. Found unexpected: ${invalid.map((el) => `<${el.tagName.toLowerCase()}>`).join(', ')}`,\n );\n }\n }\n }\n\n /** @internal */\n private _handleSlotChange = (): void => {\n this._warnInvalidSlotContent();\n this._cachedTabs = null;\n this._cachedPanels = null;\n this._syncTabsAndPanels();\n // If the active panel was removed, fall back to the first enabled tab\n const panels = this._getPanels();\n const activePanelExists = panels.some((p) => p.name === this._activePanel);\n if (!activePanelExists) {\n const firstEnabled = this._getEnabledTabs()[0];\n if (firstEnabled) {\n this._activateTab(firstEnabled, false);\n } else {\n this._activePanel = '';\n }\n }\n };\n\n /** @internal */\n private _handleKeydown = (e: KeyboardEvent): void => {\n // Use ALL tabs (including disabled) so keyboard users can discover disabled tabs\n // per ARIA APG tab pattern — disabled tabs receive focus but are not activated.\n const allTabs = this._getTabs();\n if (allTabs.length === 0) {\n return;\n }\n\n const isHorizontal = this.orientation === 'horizontal';\n const prevKey = isHorizontal ? 'ArrowLeft' : 'ArrowUp';\n const nextKey = isHorizontal ? 'ArrowRight' : 'ArrowDown';\n\n const isNavigationKey = [prevKey, nextKey, 'Home', 'End', ' ', 'Enter'].includes(e.key);\n if (!isNavigationKey) {\n return;\n }\n\n // Determine focused tab — when a button inside shadow DOM is focused,\n // document.activeElement returns the shadow host (hx-tab), not the inner button.\n const focusedTab = allTabs.find((tab) => tab === document.activeElement);\n\n if (e.key === ' ' || e.key === 'Enter') {\n // Only activate if the focused tab is not disabled\n if (focusedTab && !focusedTab.disabled) {\n e.preventDefault();\n this._activateTab(focusedTab);\n focusedTab.shadowRoot?.querySelector('button')?.focus();\n }\n return;\n }\n\n e.preventDefault();\n\n let currentIndex = focusedTab ? allTabs.indexOf(focusedTab) : -1;\n // Fall back to the active tab's index if nothing is focused yet\n if (currentIndex === -1) {\n const activeTab = allTabs.find((tab) => tab.panel === this._activePanel);\n currentIndex = activeTab ? allTabs.indexOf(activeTab) : 0;\n }\n\n let nextIndex: number;\n\n if (e.key === 'Home') {\n nextIndex = 0;\n } else if (e.key === 'End') {\n nextIndex = allTabs.length - 1;\n } else if (e.key === nextKey) {\n nextIndex = (currentIndex + 1) % allTabs.length;\n } else {\n // prevKey\n nextIndex = currentIndex <= 0 ? allTabs.length - 1 : currentIndex - 1;\n }\n\n const targetTab = allTabs[nextIndex];\n if (!targetTab) {\n return;\n }\n\n // Focus the tab button inside the shadow root\n targetTab.shadowRoot?.querySelector('button')?.focus();\n\n // Only activate in automatic mode if the target tab is not disabled\n if (this.activation === 'automatic' && !targetTab.disabled) {\n this._activateTab(targetTab);\n }\n };\n\n // ─── Render ───\n\n override render() {\n return html`\n <div class=\"tabs\">\n <div\n part=\"tablist\"\n class=\"tablist\"\n role=\"tablist\"\n aria-orientation=${this.orientation}\n aria-label=${this.label || 'Tabs'}\n >\n <slot name=\"tab\" @slotchange=${this._handleSlotChange}></slot>\n </div>\n <div part=\"panels\" class=\"panels\">\n <slot @slotchange=${this._handleSlotChange}></slot>\n </div>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'hx-tabs': HelixTabs;\n }\n}\n","import { css } from 'lit';\n\nexport const helixTabStyles = css`\n :host {\n display: inline-block;\n }\n\n :host([disabled]) {\n opacity: var(--hx-opacity-disabled, 0.5);\n }\n\n * {\n box-sizing: border-box;\n }\n\n .tab {\n display: inline-flex;\n align-items: center;\n gap: var(--hx-space-2, 0.5rem);\n padding: var(--hx-tabs-tab-padding-y, var(--hx-space-2, 0.5rem))\n var(--hx-tabs-tab-padding-x, var(--hx-space-4, 1rem));\n border: none;\n border-bottom: var(--_tab-indicator-bottom, var(--hx-tabs-indicator-size, 2px)) solid\n transparent;\n border-inline-end: var(--_tab-indicator-end, 0px) solid transparent;\n background: none;\n font-family: var(--hx-tabs-tab-font-family, var(--hx-font-family-sans, sans-serif));\n font-size: var(--hx-tabs-tab-font-size, var(--hx-font-size-md, 1rem));\n font-weight: var(--hx-tabs-tab-font-weight, var(--hx-font-weight-medium, 500));\n color: var(--hx-tabs-tab-color, var(--hx-color-neutral-600, #495057));\n line-height: var(--hx-line-height-tight, 1.25);\n cursor: pointer;\n white-space: nowrap;\n user-select: none;\n -webkit-user-select: none;\n transition:\n color var(--hx-transition-fast, 150ms ease),\n border-color var(--hx-transition-fast, 150ms ease),\n border-inline-end-color var(--hx-transition-fast, 150ms ease),\n background-color var(--hx-transition-fast, 150ms ease);\n position: relative;\n }\n\n /* ─── Hover State ─── */\n\n .tab:not([aria-selected='true']):not([aria-disabled='true']):hover {\n color: var(--hx-tabs-tab-hover-color, var(--hx-color-neutral-800, #212529));\n background-color: var(--hx-tabs-tab-hover-bg, var(--hx-color-neutral-50, #f8f9fa));\n }\n\n /* ─── Selected State ─── */\n\n .tab[aria-selected='true'] {\n color: var(--hx-tabs-tab-active-color, var(--hx-color-primary-600, #1d4ed8));\n border-bottom-color: var(\n --_tab-indicator-bottom-color,\n var(--hx-tabs-indicator-color, var(--hx-color-primary-500, #2563eb))\n );\n border-inline-end-color: var(--_tab-indicator-end-color, transparent);\n font-weight: var(--hx-tabs-tab-active-font-weight, var(--hx-font-weight-semibold, 600));\n }\n\n /* ─── Focus State ─── */\n\n .tab:focus-visible {\n outline: var(--hx-focus-ring-width, 2px) solid\n var(\n --hx-tabs-focus-ring-color,\n var(--hx-focus-ring-color, var(--hx-color-primary-400, #60a5fa))\n );\n outline-offset: var(--hx-focus-ring-offset, 2px);\n border-radius: var(--hx-border-radius-sm, 0.125rem);\n }\n\n /* ─── Disabled State ─── */\n\n :host([disabled]) {\n cursor: not-allowed;\n }\n\n .tab[aria-disabled='true'] {\n pointer-events: none;\n color: var(--hx-color-neutral-400, #adb5bd);\n }\n\n /* ─── Prefix / Suffix Slots ─── */\n\n .tab__prefix,\n .tab__suffix {\n display: inline-flex;\n align-items: center;\n flex-shrink: 0;\n }\n\n /* ─── Reduced Motion ─── */\n\n @media (prefers-reduced-motion: reduce) {\n .tab {\n transition: none;\n }\n }\n`;\n","import { LitElement, html, nothing } from 'lit';\nimport '../../utilities/document-token-adoption.js';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { helixTabStyles } from './hx-tab.styles.js';\nimport { devWarn } from '../../utils/dev-warn.js';\n\n/**\n * An individual tab button, designed to be used inside an `<hx-tabs>` container.\n * Must be placed in the `tab` named slot of `<hx-tabs>`.\n *\n * @summary Presentational tab button that activates a corresponding panel.\n *\n * @tag hx-tab\n *\n * @slot - Default slot for the tab label text or content.\n * @slot prefix - Icon or content rendered before the label.\n * @slot suffix - Icon or content rendered after the label.\n *\n * @csspart tab - The underlying button element.\n * @csspart prefix - The container for prefix slot content (e.g. icons).\n * @csspart suffix - The container for suffix slot content (e.g. badges).\n *\n * @cssprop [--hx-tabs-tab-color=var(--hx-color-neutral-600, #495057)] - Inactive tab text color.\n * @cssprop [--hx-tabs-tab-active-color=var(--hx-color-primary-600, #1d4ed8)] - Active tab text color.\n * @cssprop [--hx-tabs-tab-hover-color=var(--hx-color-neutral-800, #212529)] - Tab hover text color.\n * @cssprop [--hx-tabs-tab-hover-bg=var(--hx-color-neutral-50, #f8f9fa)] - Tab hover background.\n * @cssprop [--hx-tabs-tab-font-size=var(--hx-font-size-md, 1rem)] - Tab font size.\n * @cssprop [--hx-tabs-tab-font-weight=var(--hx-font-weight-medium, 500)] - Tab font weight.\n * @cssprop [--hx-tabs-tab-active-font-weight=var(--hx-font-weight-semibold, 600)] - Active tab font weight.\n * @cssprop [--hx-tabs-tab-padding-x=var(--hx-space-4, 1rem)] - Horizontal tab padding.\n * @cssprop [--hx-tabs-tab-padding-y=var(--hx-space-2, 0.5rem)] - Vertical tab padding.\n * @cssprop [--hx-tabs-indicator-color=var(--hx-color-primary-500, #2563eb)] - Active indicator color.\n * @cssprop [--hx-tabs-indicator-size=2px] - Active indicator thickness.\n * @cssprop [--hx-tabs-focus-ring-color=var(--hx-focus-ring-color, #2563eb)] - Focus ring color.\n */\n@customElement('hx-tab')\nexport class HelixTab extends LitElement {\n static override styles = [helixTabStyles];\n\n // ─── Properties ───\n\n /**\n * The name of the `<hx-tab-panel>` this tab controls. Must match the `name`\n * attribute on the corresponding `<hx-tab-panel>`.\n * @attr panel\n */\n @property({ type: String, reflect: true })\n panel = '';\n\n /**\n * Whether this tab is currently selected. Managed by the parent `<hx-tabs>`.\n * @attr selected\n */\n @property({ type: Boolean, reflect: true })\n selected = false;\n\n /**\n * Whether this tab is disabled. Prevents selection and keyboard navigation.\n * @attr disabled\n */\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n /**\n * The id of the panel this tab controls. Set by the parent `<hx-tabs>` to establish the\n * aria-controls relationship on the inner button element (which carries role=\"tab\").\n * @internal\n */\n @property({ type: String, attribute: false })\n controls = '';\n\n // ─── Lifecycle ───\n\n override connectedCallback(): void {\n super.connectedCallback();\n if (!this.closest('hx-tabs')) {\n devWarn('hx-tab', 'hx-tab must be a direct child of hx-tabs to function correctly.');\n }\n }\n\n // ─── Slot Visibility ───\n\n /** @internal */\n @state() private _hasPrefixSlot = false;\n /** @internal */\n @state() private _hasSuffixSlot = false;\n\n // ─── Event Handling ───\n\n /** @internal */\n private _handleClick(): void {\n if (this.disabled) {\n return;\n }\n /**\n * Internal event dispatched to signal tab selection to the parent container.\n * Not part of the public API.\n * @internal\n */\n this.dispatchEvent(\n new CustomEvent<{ panel: string }>('hx-tab-select', {\n bubbles: true,\n composed: true,\n detail: { panel: this.panel },\n }),\n );\n }\n\n /** @internal */\n private _handlePrefixSlotChange(e: Event): void {\n const slot = e.target as HTMLSlotElement;\n this._hasPrefixSlot = slot.assignedNodes({ flatten: true }).length > 0;\n }\n\n /** @internal */\n private _handleSuffixSlotChange(e: Event): void {\n const slot = e.target as HTMLSlotElement;\n this._hasSuffixSlot = slot.assignedNodes({ flatten: true }).length > 0;\n }\n\n // ─── Render ───\n\n override render() {\n return html`\n <button\n part=\"tab\"\n class=\"tab\"\n role=\"tab\"\n aria-selected=${this.selected ? 'true' : 'false'}\n aria-disabled=${this.disabled ? 'true' : 'false'}\n aria-controls=${this.controls || nothing}\n tabindex=${this.selected ? '0' : '-1'}\n @click=${this._handleClick}\n >\n <span part=\"prefix\" class=\"tab__prefix\" ?hidden=${!this._hasPrefixSlot}>\n <slot name=\"prefix\" @slotchange=${this._handlePrefixSlotChange}></slot>\n </span>\n <slot></slot>\n <span part=\"suffix\" class=\"tab__suffix\" ?hidden=${!this._hasSuffixSlot}>\n <slot name=\"suffix\" @slotchange=${this._handleSuffixSlotChange}></slot>\n </span>\n </button>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'hx-tab': HelixTab;\n }\n}\n","import { css } from 'lit';\n\nexport const helixTabPanelStyles = css`\n :host {\n display: block;\n }\n\n :host([hidden]) {\n display: none;\n }\n\n * {\n box-sizing: border-box;\n }\n\n :host(:focus-visible) {\n outline: var(--hx-focus-ring-width, 2px) solid\n var(\n --hx-tabs-focus-ring-color,\n var(--hx-focus-ring-color, var(--hx-color-primary-400, #60a5fa))\n );\n outline-offset: var(--hx-focus-ring-offset, 2px);\n border-radius: var(--hx-border-radius-sm, 0.125rem);\n }\n\n .panel {\n padding: var(--hx-tabs-panel-padding, var(--hx-space-4, 1rem));\n font-family: var(--hx-font-family-sans, sans-serif);\n font-size: var(--hx-font-size-md, 1rem);\n color: var(--hx-tabs-panel-color, var(--hx-color-neutral-700, #343a40));\n line-height: var(--hx-line-height-normal, 1.5);\n outline: none;\n }\n`;\n","import { LitElement, html } from 'lit';\nimport '../../utilities/document-token-adoption.js';\nimport { customElement, property } from 'lit/decorators.js';\nimport { helixTabPanelStyles } from './hx-tab-panel.styles.js';\n\n/**\n * A content panel associated with an `<hx-tab>`, managed by a parent `<hx-tabs>`.\n *\n * @summary Tab content panel shown when its corresponding tab is selected.\n *\n * @tag hx-tab-panel\n *\n * @slot - Default slot for panel content.\n *\n * @csspart panel - The panel content wrapper.\n *\n * @cssprop [--hx-tabs-panel-padding=var(--hx-space-4, 1rem)] - Panel inner padding.\n * @cssprop [--hx-tabs-panel-color=var(--hx-color-neutral-700, #343a40)] - Panel text color.\n * @cssprop [--hx-tabs-focus-ring-color=var(--hx-focus-ring-color, #2563eb)] - Focus ring color.\n */\n@customElement('hx-tab-panel')\nexport class HelixTabPanel extends LitElement {\n static override styles = [helixTabPanelStyles];\n\n // ─── Properties ───\n\n /**\n * The name that corresponds to the `panel` attribute on the associated `<hx-tab>`.\n * @attr name\n */\n @property({ type: String, reflect: true })\n name = '';\n\n // ─── Lifecycle ───\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.setAttribute('role', 'tabpanel');\n // tabindex is managed dynamically by the parent hx-tabs component:\n // active panels get tabindex=\"0\", hidden panels get tabindex=\"-1\"\n }\n\n // ─── Render ───\n\n override render() {\n return html`\n <div part=\"panel\" class=\"panel\">\n <slot></slot>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'hx-tab-panel': HelixTabPanel;\n }\n}\n"],"names":["helixTabsStyles","css","_hxTabsIdCounter","HelixTabs","LitElement","tab","el","p","firstEnabled","allTabs","isHorizontal","prevKey","nextKey","focusedTab","_b","_a","currentIndex","activeTab","nextIndex","targetTab","_d","_c","name","old","value","index","pendingTab","changedProperties","tabs","panels","tabId","panelName","panel","panelId","tabLabel","node","isSelected","dispatchEvent","previousPanel","tabSlot","panelSlot","invalid","devWarn","html","__decorateClass","property","state","customElement","helixTabStyles","HelixTab","slot","nothing","helixTabPanelStyles","HelixTabPanel"],"mappings":"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"}