@helixui/library 2.1.2-next.52 → 2.1.2-next.53

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 (469) hide show
  1. package/custom-elements.json +520 -468
  2. package/dist/base/helix-element.d.ts.map +1 -1
  3. package/dist/components/hx-accordion/hx-accordion-item.d.ts +0 -2
  4. package/dist/components/hx-accordion/hx-accordion-item.d.ts.map +1 -1
  5. package/dist/components/hx-accordion/hx-accordion-item.styles.d.ts.map +1 -1
  6. package/dist/components/hx-accordion/hx-accordion.styles.d.ts.map +1 -1
  7. package/dist/components/hx-accordion/index.js +1 -1
  8. package/dist/components/hx-alert/hx-alert.styles.d.ts.map +1 -1
  9. package/dist/components/hx-alert/index.js +1 -1
  10. package/dist/components/hx-badge/hx-badge.styles.d.ts.map +1 -1
  11. package/dist/components/hx-badge/index.js +1 -1
  12. package/dist/components/hx-banner/hx-banner.styles.d.ts.map +1 -1
  13. package/dist/components/hx-banner/index.js +1 -1
  14. package/dist/components/hx-breadcrumb/hx-breadcrumb-item.d.ts.map +1 -1
  15. package/dist/components/hx-breadcrumb/hx-breadcrumb-item.styles.d.ts.map +1 -1
  16. package/dist/components/hx-breadcrumb/hx-breadcrumb.d.ts +0 -7
  17. package/dist/components/hx-breadcrumb/hx-breadcrumb.d.ts.map +1 -1
  18. package/dist/components/hx-breadcrumb/index.js +1 -1
  19. package/dist/components/hx-button/hx-button.d.ts +9 -9
  20. package/dist/components/hx-button/hx-button.d.ts.map +1 -1
  21. package/dist/components/hx-button/hx-button.styles.d.ts.map +1 -1
  22. package/dist/components/hx-button/index.js +1 -1
  23. package/dist/components/hx-button-group/hx-button-group.d.ts +1 -4
  24. package/dist/components/hx-button-group/hx-button-group.d.ts.map +1 -1
  25. package/dist/components/hx-button-group/index.js +1 -1
  26. package/dist/components/hx-card/hx-card.d.ts +16 -0
  27. package/dist/components/hx-card/hx-card.d.ts.map +1 -1
  28. package/dist/components/hx-card/hx-card.styles.d.ts.map +1 -1
  29. package/dist/components/hx-card/index.js +1 -1
  30. package/dist/components/hx-carousel/hx-carousel.d.ts.map +1 -1
  31. package/dist/components/hx-carousel/hx-carousel.styles.d.ts.map +1 -1
  32. package/dist/components/hx-carousel/index.js +1 -1
  33. package/dist/components/hx-checkbox/hx-checkbox.d.ts +8 -0
  34. package/dist/components/hx-checkbox/hx-checkbox.d.ts.map +1 -1
  35. package/dist/components/hx-checkbox/hx-checkbox.styles.d.ts.map +1 -1
  36. package/dist/components/hx-checkbox/index.js +1 -1
  37. package/dist/components/hx-checkbox-group/hx-checkbox-group.d.ts +6 -8
  38. package/dist/components/hx-checkbox-group/hx-checkbox-group.d.ts.map +1 -1
  39. package/dist/components/hx-checkbox-group/hx-checkbox-group.styles.d.ts.map +1 -1
  40. package/dist/components/hx-checkbox-group/index.js +1 -1
  41. package/dist/components/hx-clinical-status/hx-clinical-status.styles.d.ts.map +1 -1
  42. package/dist/components/hx-clinical-status/index.js +1 -1
  43. package/dist/components/hx-code-snippet/hx-code-snippet.styles.d.ts.map +1 -1
  44. package/dist/components/hx-code-snippet/index.js +1 -1
  45. package/dist/components/hx-color-picker/hx-color-picker.styles.d.ts.map +1 -1
  46. package/dist/components/hx-color-picker/index.js +1 -1
  47. package/dist/components/hx-combobox/hx-combobox.d.ts +20 -14
  48. package/dist/components/hx-combobox/hx-combobox.d.ts.map +1 -1
  49. package/dist/components/hx-combobox/hx-combobox.styles.d.ts.map +1 -1
  50. package/dist/components/hx-combobox/index.js +1 -1
  51. package/dist/components/hx-copy-button/hx-copy-button.styles.d.ts.map +1 -1
  52. package/dist/components/hx-copy-button/index.js +1 -1
  53. package/dist/components/hx-counter/hx-counter.styles.d.ts.map +1 -1
  54. package/dist/components/hx-counter/index.js +1 -1
  55. package/dist/components/hx-data-table/hx-data-table.d.ts +20 -0
  56. package/dist/components/hx-data-table/hx-data-table.d.ts.map +1 -1
  57. package/dist/components/hx-data-table/hx-data-table.styles.d.ts.map +1 -1
  58. package/dist/components/hx-data-table/index.js +1 -1
  59. package/dist/components/hx-date-picker/hx-date-picker.d.ts +6 -17
  60. package/dist/components/hx-date-picker/hx-date-picker.d.ts.map +1 -1
  61. package/dist/components/hx-date-picker/index.js +1 -1
  62. package/dist/components/hx-dialog/hx-dialog.d.ts +7 -0
  63. package/dist/components/hx-dialog/hx-dialog.d.ts.map +1 -1
  64. package/dist/components/hx-dialog/hx-dialog.styles.d.ts.map +1 -1
  65. package/dist/components/hx-dialog/index.js +1 -1
  66. package/dist/components/hx-divider/hx-divider.styles.d.ts.map +1 -1
  67. package/dist/components/hx-divider/index.js +1 -1
  68. package/dist/components/hx-drawer/hx-drawer.d.ts +7 -0
  69. package/dist/components/hx-drawer/hx-drawer.d.ts.map +1 -1
  70. package/dist/components/hx-drawer/hx-drawer.styles.d.ts.map +1 -1
  71. package/dist/components/hx-drawer/index.js +1 -1
  72. package/dist/components/hx-dropdown/hx-dropdown.d.ts +8 -5
  73. package/dist/components/hx-dropdown/hx-dropdown.d.ts.map +1 -1
  74. package/dist/components/hx-dropdown/hx-dropdown.styles.d.ts.map +1 -1
  75. package/dist/components/hx-dropdown/index.js +1 -1
  76. package/dist/components/hx-field/hx-field.d.ts.map +1 -1
  77. package/dist/components/hx-field/hx-field.styles.d.ts.map +1 -1
  78. package/dist/components/hx-field/index.js +1 -1
  79. package/dist/components/hx-field-label/hx-field-label.styles.d.ts.map +1 -1
  80. package/dist/components/hx-field-label/index.js +1 -1
  81. package/dist/components/hx-file-upload/hx-file-upload.d.ts +6 -14
  82. package/dist/components/hx-file-upload/hx-file-upload.d.ts.map +1 -1
  83. package/dist/components/hx-file-upload/index.js +1 -1
  84. package/dist/components/hx-help-text/hx-help-text.styles.d.ts.map +1 -1
  85. package/dist/components/hx-help-text/index.js +1 -1
  86. package/dist/components/hx-icon/hx-icon.styles.d.ts.map +1 -1
  87. package/dist/components/hx-icon/index.js +1 -1
  88. package/dist/components/hx-icon-button/hx-icon-button.d.ts +10 -14
  89. package/dist/components/hx-icon-button/hx-icon-button.d.ts.map +1 -1
  90. package/dist/components/hx-icon-button/hx-icon-button.styles.d.ts.map +1 -1
  91. package/dist/components/hx-icon-button/index.js +1 -1
  92. package/dist/components/hx-image/hx-image.styles.d.ts.map +1 -1
  93. package/dist/components/hx-image/index.js +1 -1
  94. package/dist/components/hx-link/hx-link.styles.d.ts.map +1 -1
  95. package/dist/components/hx-link/index.js +1 -1
  96. package/dist/components/hx-menu/hx-menu-divider.styles.d.ts.map +1 -1
  97. package/dist/components/hx-menu/hx-menu-item.styles.d.ts.map +1 -1
  98. package/dist/components/hx-menu/hx-menu.styles.d.ts.map +1 -1
  99. package/dist/components/hx-menu/index.js +1 -1
  100. package/dist/components/hx-meter/hx-meter.d.ts +0 -2
  101. package/dist/components/hx-meter/hx-meter.d.ts.map +1 -1
  102. package/dist/components/hx-meter/hx-meter.styles.d.ts.map +1 -1
  103. package/dist/components/hx-meter/index.js +1 -1
  104. package/dist/components/hx-nav/hx-nav.styles.d.ts.map +1 -1
  105. package/dist/components/hx-nav/index.js +1 -1
  106. package/dist/components/hx-number-input/hx-number-input.d.ts +6 -8
  107. package/dist/components/hx-number-input/hx-number-input.d.ts.map +1 -1
  108. package/dist/components/hx-number-input/hx-number-input.styles.d.ts.map +1 -1
  109. package/dist/components/hx-number-input/index.js +1 -1
  110. package/dist/components/hx-overflow-menu/hx-overflow-menu.d.ts.map +1 -1
  111. package/dist/components/hx-overflow-menu/hx-overflow-menu.styles.d.ts.map +1 -1
  112. package/dist/components/hx-overflow-menu/index.js +1 -1
  113. package/dist/components/hx-patient-banner/hx-patient-banner.styles.d.ts.map +1 -1
  114. package/dist/components/hx-patient-banner/index.js +1 -1
  115. package/dist/components/hx-popover/hx-popover.d.ts +1 -0
  116. package/dist/components/hx-popover/hx-popover.d.ts.map +1 -1
  117. package/dist/components/hx-popover/hx-popover.styles.d.ts.map +1 -1
  118. package/dist/components/hx-popover/index.js +1 -1
  119. package/dist/components/hx-popup/hx-popup.styles.d.ts.map +1 -1
  120. package/dist/components/hx-popup/index.js +1 -1
  121. package/dist/components/hx-progress-bar/hx-progress-bar.d.ts +0 -2
  122. package/dist/components/hx-progress-bar/hx-progress-bar.d.ts.map +1 -1
  123. package/dist/components/hx-progress-bar/index.js +1 -1
  124. package/dist/components/hx-radio-group/hx-radio-group.d.ts +6 -11
  125. package/dist/components/hx-radio-group/hx-radio-group.d.ts.map +1 -1
  126. package/dist/components/hx-radio-group/hx-radio-group.styles.d.ts.map +1 -1
  127. package/dist/components/hx-radio-group/hx-radio.d.ts.map +1 -1
  128. package/dist/components/hx-radio-group/hx-radio.styles.d.ts.map +1 -1
  129. package/dist/components/hx-radio-group/index.js +1 -1
  130. package/dist/components/hx-rating/hx-rating.d.ts +6 -11
  131. package/dist/components/hx-rating/hx-rating.d.ts.map +1 -1
  132. package/dist/components/hx-rating/hx-rating.styles.d.ts.map +1 -1
  133. package/dist/components/hx-rating/index.js +1 -1
  134. package/dist/components/hx-select/hx-select.d.ts +8 -0
  135. package/dist/components/hx-select/hx-select.d.ts.map +1 -1
  136. package/dist/components/hx-select/hx-select.styles.d.ts.map +1 -1
  137. package/dist/components/hx-select/index.js +1 -1
  138. package/dist/components/hx-side-nav/hx-nav-item.d.ts +0 -3
  139. package/dist/components/hx-side-nav/hx-nav-item.d.ts.map +1 -1
  140. package/dist/components/hx-side-nav/hx-nav-item.styles.d.ts.map +1 -1
  141. package/dist/components/hx-side-nav/hx-side-nav.styles.d.ts.map +1 -1
  142. package/dist/components/hx-side-nav/index.js +1 -1
  143. package/dist/components/hx-skeleton/hx-skeleton.styles.d.ts.map +1 -1
  144. package/dist/components/hx-skeleton/index.js +1 -1
  145. package/dist/components/hx-slider/hx-slider.d.ts +9 -9
  146. package/dist/components/hx-slider/hx-slider.d.ts.map +1 -1
  147. package/dist/components/hx-slider/index.js +1 -1
  148. package/dist/components/hx-spinner/hx-spinner.styles.d.ts.map +1 -1
  149. package/dist/components/hx-spinner/index.js +1 -1
  150. package/dist/components/hx-split-button/hx-split-button.d.ts.map +1 -1
  151. package/dist/components/hx-split-button/hx-split-button.styles.d.ts.map +1 -1
  152. package/dist/components/hx-split-button/index.js +1 -1
  153. package/dist/components/hx-split-panel/hx-split-panel.styles.d.ts.map +1 -1
  154. package/dist/components/hx-split-panel/index.js +1 -1
  155. package/dist/components/hx-stat/hx-stat.d.ts +2 -2
  156. package/dist/components/hx-stat/hx-stat.d.ts.map +1 -1
  157. package/dist/components/hx-status-indicator/hx-status-indicator.styles.d.ts.map +1 -1
  158. package/dist/components/hx-status-indicator/index.js +1 -1
  159. package/dist/components/hx-steps/hx-step.styles.d.ts.map +1 -1
  160. package/dist/components/hx-steps/index.js +1 -1
  161. package/dist/components/hx-structured-list/hx-structured-list.styles.d.ts.map +1 -1
  162. package/dist/components/hx-structured-list/index.js +1 -1
  163. package/dist/components/hx-switch/hx-switch.d.ts +14 -17
  164. package/dist/components/hx-switch/hx-switch.d.ts.map +1 -1
  165. package/dist/components/hx-switch/hx-switch.styles.d.ts.map +1 -1
  166. package/dist/components/hx-switch/index.js +1 -1
  167. package/dist/components/hx-table/hx-table.styles.d.ts.map +1 -1
  168. package/dist/components/hx-table/index.js +1 -1
  169. package/dist/components/hx-tabs/hx-tab-panel.styles.d.ts.map +1 -1
  170. package/dist/components/hx-tabs/hx-tab.styles.d.ts.map +1 -1
  171. package/dist/components/hx-tabs/hx-tabs.d.ts +6 -0
  172. package/dist/components/hx-tabs/hx-tabs.d.ts.map +1 -1
  173. package/dist/components/hx-tabs/hx-tabs.styles.d.ts.map +1 -1
  174. package/dist/components/hx-tabs/index.js +1 -1
  175. package/dist/components/hx-tag/hx-tag.styles.d.ts.map +1 -1
  176. package/dist/components/hx-tag/index.js +1 -1
  177. package/dist/components/hx-text-input/hx-text-input.d.ts +11 -0
  178. package/dist/components/hx-text-input/hx-text-input.d.ts.map +1 -1
  179. package/dist/components/hx-text-input/hx-text-input.styles.d.ts.map +1 -1
  180. package/dist/components/hx-text-input/index.js +1 -1
  181. package/dist/components/hx-textarea/hx-textarea.d.ts +17 -9
  182. package/dist/components/hx-textarea/hx-textarea.d.ts.map +1 -1
  183. package/dist/components/hx-textarea/hx-textarea.styles.d.ts.map +1 -1
  184. package/dist/components/hx-textarea/index.js +1 -1
  185. package/dist/components/hx-time-picker/hx-time-picker.d.ts +6 -17
  186. package/dist/components/hx-time-picker/hx-time-picker.d.ts.map +1 -1
  187. package/dist/components/hx-time-picker/index.js +1 -1
  188. package/dist/components/hx-toast/hx-toast.styles.d.ts.map +1 -1
  189. package/dist/components/hx-toast/index.js +1 -1
  190. package/dist/components/hx-toggle-button/hx-toggle-button.d.ts +6 -13
  191. package/dist/components/hx-toggle-button/hx-toggle-button.d.ts.map +1 -1
  192. package/dist/components/hx-toggle-button/hx-toggle-button.styles.d.ts.map +1 -1
  193. package/dist/components/hx-toggle-button/index.js +1 -1
  194. package/dist/components/hx-tooltip/hx-tooltip.d.ts.map +1 -1
  195. package/dist/components/hx-tooltip/hx-tooltip.styles.d.ts.map +1 -1
  196. package/dist/components/hx-tooltip/index.js +1 -1
  197. package/dist/components/hx-top-nav/hx-top-nav.styles.d.ts.map +1 -1
  198. package/dist/components/hx-top-nav/index.js +1 -1
  199. package/dist/components/hx-tree-view/hx-tree-item.styles.d.ts.map +1 -1
  200. package/dist/components/hx-tree-view/index.js +1 -1
  201. package/dist/css/helix-all.css +1268 -10
  202. package/dist/css/helix-core.css +137 -1
  203. package/dist/css/helix-data.css +69 -0
  204. package/dist/css/helix-feedback.css +77 -0
  205. package/dist/css/helix-forms.css +627 -3
  206. package/dist/css/helix-layout.css +22 -0
  207. package/dist/css/helix-media.css +24 -0
  208. package/dist/css/helix-navigation.css +110 -0
  209. package/dist/css/helix-overlay.css +87 -0
  210. package/dist/css/helix-utility.css +66 -0
  211. package/dist/css/hx-accordion.css +8 -0
  212. package/dist/css/hx-alert.css +21 -0
  213. package/dist/css/hx-badge.css +16 -0
  214. package/dist/css/hx-banner.css +17 -0
  215. package/dist/css/hx-button.css +4 -1
  216. package/dist/css/hx-card.css +12 -0
  217. package/dist/css/hx-carousel.css +24 -0
  218. package/dist/css/hx-checkbox-group.css +32 -0
  219. package/dist/css/hx-checkbox.css +66 -0
  220. package/dist/css/hx-clinical-status.css +23 -0
  221. package/dist/css/hx-code-snippet.css +22 -0
  222. package/dist/css/hx-color-picker.css +1 -1
  223. package/dist/css/hx-combobox.css +1 -1
  224. package/dist/css/hx-copy-button.css +28 -0
  225. package/dist/css/hx-counter.css +3 -0
  226. package/dist/css/hx-data-table.css +23 -0
  227. package/dist/css/hx-dialog.css +21 -0
  228. package/dist/css/hx-divider.css +8 -0
  229. package/dist/css/hx-drawer.css +21 -0
  230. package/dist/css/hx-dropdown.css +9 -0
  231. package/dist/css/hx-field-label.css +16 -0
  232. package/dist/css/hx-field.css +36 -0
  233. package/dist/css/hx-help-text.css +20 -0
  234. package/dist/css/hx-icon-button.css +27 -0
  235. package/dist/css/hx-icon.css +8 -0
  236. package/dist/css/hx-image.css +8 -0
  237. package/dist/css/hx-link.css +18 -0
  238. package/dist/css/hx-menu.css +9 -0
  239. package/dist/css/hx-meter.css +13 -0
  240. package/dist/css/hx-nav.css +16 -0
  241. package/dist/css/hx-number-input.css +78 -0
  242. package/dist/css/hx-overflow-menu.css +31 -0
  243. package/dist/css/hx-patient-banner.css +20 -0
  244. package/dist/css/hx-popover.css +12 -0
  245. package/dist/css/hx-popup.css +12 -0
  246. package/dist/css/hx-radio-group.css +32 -0
  247. package/dist/css/hx-rating.css +39 -0
  248. package/dist/css/hx-select.css +82 -0
  249. package/dist/css/hx-side-nav.css +21 -0
  250. package/dist/css/hx-skeleton.css +12 -0
  251. package/dist/css/hx-spinner.css +12 -0
  252. package/dist/css/hx-split-button.css +35 -0
  253. package/dist/css/hx-split-panel.css +14 -0
  254. package/dist/css/hx-status-indicator.css +13 -0
  255. package/dist/css/hx-structured-list.css +16 -0
  256. package/dist/css/hx-switch.css +62 -0
  257. package/dist/css/hx-table.css +8 -0
  258. package/dist/css/hx-tabs.css +12 -0
  259. package/dist/css/hx-tag.css +12 -0
  260. package/dist/css/hx-text-input.css +62 -0
  261. package/dist/css/hx-textarea.css +62 -0
  262. package/dist/css/hx-toast.css +13 -0
  263. package/dist/css/hx-toggle-button.css +38 -1
  264. package/dist/css/hx-tooltip.css +12 -0
  265. package/dist/css/hx-top-nav.css +21 -0
  266. package/dist/css/index.css +1 -1
  267. package/dist/css/manifest.json +4 -3
  268. package/dist/index.js +65 -65
  269. package/dist/mixins/aria-delegation.d.ts +3 -1
  270. package/dist/mixins/aria-delegation.d.ts.map +1 -1
  271. package/dist/mixins/index.d.ts +1 -1
  272. package/dist/mixins/index.d.ts.map +1 -1
  273. package/dist/shared/{aria-delegation-CBP9eQ0M.js → aria-delegation-Doq6RRUy.js} +6 -6
  274. package/dist/shared/aria-delegation-Doq6RRUy.js.map +1 -0
  275. package/dist/shared/{helix-element-CZvaIEQP.js → helix-element-BJh1Ffvi.js} +18 -21
  276. package/dist/shared/{helix-element-CZvaIEQP.js.map → helix-element-BJh1Ffvi.js.map} +1 -1
  277. package/dist/shared/{hx-accordion-CpfO0YQo.js → hx-accordion-SlwR2C6S.js} +109 -62
  278. package/dist/shared/hx-accordion-SlwR2C6S.js.map +1 -0
  279. package/dist/shared/{hx-alert-CHOjTBds.js → hx-alert-DdlSyJGk.js} +22 -1
  280. package/dist/shared/hx-alert-DdlSyJGk.js.map +1 -0
  281. package/dist/shared/{hx-badge-RPzd-t5l.js → hx-badge-B_PzGlUo.js} +17 -1
  282. package/dist/shared/hx-badge-B_PzGlUo.js.map +1 -0
  283. package/dist/shared/{hx-banner-B-WEDiq7.js → hx-banner-D8AxkCfc.js} +30 -13
  284. package/dist/shared/hx-banner-D8AxkCfc.js.map +1 -0
  285. package/dist/shared/{hx-breadcrumb-item-jLAKK038.js → hx-breadcrumb-item-BCUIvpYX.js} +32 -15
  286. package/dist/shared/hx-breadcrumb-item-BCUIvpYX.js.map +1 -0
  287. package/dist/shared/{hx-button-DoN8jjQT.js → hx-button-BzqsDHmZ.js} +15 -16
  288. package/dist/shared/hx-button-BzqsDHmZ.js.map +1 -0
  289. package/dist/shared/{hx-button-group-BXlMQTt_.js → hx-button-group-a5Pb_9fU.js} +8 -9
  290. package/dist/shared/{hx-button-group-BXlMQTt_.js.map → hx-button-group-a5Pb_9fU.js.map} +1 -1
  291. package/dist/shared/{hx-card-BgXZXDuc.js → hx-card-DYlaxQy0.js} +59 -33
  292. package/dist/shared/hx-card-DYlaxQy0.js.map +1 -0
  293. package/dist/shared/{hx-carousel-item-Dwt9Pphz.js → hx-carousel-item-KQfCekKF.js} +45 -19
  294. package/dist/shared/hx-carousel-item-KQfCekKF.js.map +1 -0
  295. package/dist/shared/{hx-checkbox-C82GjRXe.js → hx-checkbox-DyDbR1B9.js} +97 -31
  296. package/dist/shared/hx-checkbox-DyDbR1B9.js.map +1 -0
  297. package/dist/shared/{hx-checkbox-group-DThZeN5d.js → hx-checkbox-group-C8TaFqy0.js} +75 -40
  298. package/dist/shared/hx-checkbox-group-C8TaFqy0.js.map +1 -0
  299. package/dist/shared/{hx-clinical-status-BjtT5c0M.js → hx-clinical-status-dDyk5oj1.js} +53 -30
  300. package/dist/shared/hx-clinical-status-dDyk5oj1.js.map +1 -0
  301. package/dist/shared/{hx-code-snippet-DcVENSuC.js → hx-code-snippet-DasrRF9k.js} +27 -5
  302. package/dist/shared/hx-code-snippet-DasrRF9k.js.map +1 -0
  303. package/dist/shared/{hx-color-picker-C6EIuS9t.js → hx-color-picker-zv6wtok4.js} +81 -81
  304. package/dist/shared/hx-color-picker-zv6wtok4.js.map +1 -0
  305. package/dist/shared/{hx-combobox-BJ4lQocO.js → hx-combobox-C-DVLFpu.js} +36 -45
  306. package/dist/shared/hx-combobox-C-DVLFpu.js.map +1 -0
  307. package/dist/shared/{hx-copy-button-BoM0WsMd.js → hx-copy-button-DikpbhWY.js} +54 -26
  308. package/dist/shared/hx-copy-button-DikpbhWY.js.map +1 -0
  309. package/dist/shared/{hx-counter-B5NgKlw4.js → hx-counter-_m4cq45V.js} +21 -18
  310. package/dist/shared/hx-counter-_m4cq45V.js.map +1 -0
  311. package/dist/shared/{hx-data-table-D5Ne-goy.js → hx-data-table-609C-e9w.js} +215 -150
  312. package/dist/shared/hx-data-table-609C-e9w.js.map +1 -0
  313. package/dist/shared/{hx-date-picker-Cd3I3WkX.js → hx-date-picker-Bh8410Sf.js} +26 -35
  314. package/dist/shared/hx-date-picker-Bh8410Sf.js.map +1 -0
  315. package/dist/shared/{hx-dialog-D4ubstxx.js → hx-dialog-D_DeqcNS.js} +46 -25
  316. package/dist/shared/hx-dialog-D_DeqcNS.js.map +1 -0
  317. package/dist/shared/{hx-divider-BBtOLHRP.js → hx-divider-lfOMElo2.js} +18 -10
  318. package/dist/shared/hx-divider-lfOMElo2.js.map +1 -0
  319. package/dist/shared/{hx-drawer--WDLuWtS.js → hx-drawer-NleCbKuN.js} +95 -60
  320. package/dist/shared/hx-drawer-NleCbKuN.js.map +1 -0
  321. package/dist/shared/{hx-dropdown-n5-XSmiV.js → hx-dropdown-CA9WYdhm.js} +37 -27
  322. package/dist/shared/hx-dropdown-CA9WYdhm.js.map +1 -0
  323. package/dist/shared/{hx-field-CwT9tki1.js → hx-field-Duiib9Bj.js} +48 -12
  324. package/dist/shared/hx-field-Duiib9Bj.js.map +1 -0
  325. package/dist/shared/{hx-field-label-CcOK9VU3.js → hx-field-label-Dud-psvE.js} +37 -21
  326. package/dist/shared/hx-field-label-Dud-psvE.js.map +1 -0
  327. package/dist/shared/{hx-file-upload-Di_vpQaG.js → hx-file-upload-CmCCAvej.js} +24 -33
  328. package/dist/shared/hx-file-upload-CmCCAvej.js.map +1 -0
  329. package/dist/shared/{hx-help-text-Bmb80bP4.js → hx-help-text-DARi-Pfp.js} +37 -17
  330. package/dist/shared/hx-help-text-DARi-Pfp.js.map +1 -0
  331. package/dist/shared/{hx-icon-button-CJuy9xbw.js → hx-icon-button-BcZtVVtH.js} +58 -41
  332. package/dist/shared/hx-icon-button-BcZtVVtH.js.map +1 -0
  333. package/dist/shared/{hx-icon-BKHs3OLu.js → hx-icon-jWcGmn66.js} +9 -1
  334. package/dist/shared/hx-icon-jWcGmn66.js.map +1 -0
  335. package/dist/shared/{hx-image-ztiXumZB.js → hx-image-DOjPp-K5.js} +28 -20
  336. package/dist/shared/hx-image-DOjPp-K5.js.map +1 -0
  337. package/dist/shared/{hx-link-CN7AvGOW.js → hx-link-DCBct0f4.js} +44 -26
  338. package/dist/shared/hx-link-DCBct0f4.js.map +1 -0
  339. package/dist/shared/{hx-menu-divider-DRT8yHRZ.js → hx-menu-divider-DVWER7iT.js} +93 -50
  340. package/dist/shared/hx-menu-divider-DVWER7iT.js.map +1 -0
  341. package/dist/shared/{hx-meter-BcVC9yrt.js → hx-meter-ChZdWNF2.js} +42 -28
  342. package/dist/shared/hx-meter-ChZdWNF2.js.map +1 -0
  343. package/dist/shared/{hx-nav-l0Rp7WPW.js → hx-nav-CHX1JOWB.js} +28 -12
  344. package/dist/shared/hx-nav-CHX1JOWB.js.map +1 -0
  345. package/dist/shared/{hx-nav-item-CJN4VDrf.js → hx-nav-item-CRAESq9s.js} +56 -22
  346. package/dist/shared/hx-nav-item-CRAESq9s.js.map +1 -0
  347. package/dist/shared/{hx-number-input-0Waw7Z7u.js → hx-number-input-Cm682AVP.js} +154 -72
  348. package/dist/shared/hx-number-input-Cm682AVP.js.map +1 -0
  349. package/dist/shared/{hx-overflow-menu-DElwFSCd.js → hx-overflow-menu-BDl6QfUD.js} +52 -19
  350. package/dist/shared/hx-overflow-menu-BDl6QfUD.js.map +1 -0
  351. package/dist/shared/{hx-patient-banner-BKiN7nIE.js → hx-patient-banner-B4IjHeTx.js} +54 -34
  352. package/dist/shared/hx-patient-banner-B4IjHeTx.js.map +1 -0
  353. package/dist/shared/{hx-popover-CydNuVkT.js → hx-popover-ZGRFgBbx.js} +29 -15
  354. package/dist/shared/hx-popover-ZGRFgBbx.js.map +1 -0
  355. package/dist/shared/{hx-popup-DbzezTOd.js → hx-popup-Cc4qz89i.js} +24 -12
  356. package/dist/shared/hx-popup-Cc4qz89i.js.map +1 -0
  357. package/dist/shared/{hx-progress-bar-Cm0VihTN.js → hx-progress-bar-BY1uE6bN.js} +17 -16
  358. package/dist/shared/hx-progress-bar-BY1uE6bN.js.map +1 -0
  359. package/dist/shared/{hx-radio-f8c5ggHG.js → hx-radio-YEEsbUPN.js} +139 -54
  360. package/dist/shared/hx-radio-YEEsbUPN.js.map +1 -0
  361. package/dist/shared/{hx-rating-qRJZXskm.js → hx-rating-DjUJTT0M.js} +54 -17
  362. package/dist/shared/hx-rating-DjUJTT0M.js.map +1 -0
  363. package/dist/shared/{hx-select-CgcgsHU5.js → hx-select-DZ7wfcJx.js} +119 -37
  364. package/dist/shared/hx-select-DZ7wfcJx.js.map +1 -0
  365. package/dist/shared/{hx-skeleton-tiYvKO-t.js → hx-skeleton-aqa-gr1S.js} +28 -16
  366. package/dist/shared/hx-skeleton-aqa-gr1S.js.map +1 -0
  367. package/dist/shared/{hx-slider-BvXtvxmN.js → hx-slider-DAilFrR_.js} +28 -25
  368. package/dist/shared/hx-slider-DAilFrR_.js.map +1 -0
  369. package/dist/shared/{hx-spinner-D6nzuGmj.js → hx-spinner-Dw3cRY-9.js} +26 -14
  370. package/dist/shared/hx-spinner-Dw3cRY-9.js.map +1 -0
  371. package/dist/shared/{hx-split-button-CPndTJlC.js → hx-split-button-Dk-zMDDo.js} +51 -14
  372. package/dist/shared/hx-split-button-Dk-zMDDo.js.map +1 -0
  373. package/dist/shared/{hx-split-panel-Dx72NaET.js → hx-split-panel-Kdp4BiLz.js} +15 -1
  374. package/dist/shared/hx-split-panel-Kdp4BiLz.js.map +1 -0
  375. package/dist/shared/hx-stat-DKlyBL_K.js.map +1 -1
  376. package/dist/shared/{hx-status-indicator-ClWpK6zz.js → hx-status-indicator-DWSM0Ctm.js} +30 -17
  377. package/dist/shared/hx-status-indicator-DWSM0Ctm.js.map +1 -0
  378. package/dist/shared/{hx-step-C2Jk4mHa.js → hx-step-CuoOvcI8.js} +52 -18
  379. package/dist/shared/{hx-step-C2Jk4mHa.js.map → hx-step-CuoOvcI8.js.map} +1 -1
  380. package/dist/shared/{hx-structured-list-DKlrv7kS.js → hx-structured-list-CQCD7bCT.js} +21 -5
  381. package/dist/shared/hx-structured-list-CQCD7bCT.js.map +1 -0
  382. package/dist/shared/{hx-switch-BzMN37PV.js → hx-switch-BdxKN9WM.js} +89 -32
  383. package/dist/shared/hx-switch-BdxKN9WM.js.map +1 -0
  384. package/dist/shared/{hx-tab-panel-J58zOSjq.js → hx-tab-panel-CwClQoWP.js} +141 -88
  385. package/dist/shared/hx-tab-panel-CwClQoWP.js.map +1 -0
  386. package/dist/shared/{hx-tag-F0ZcYj9b.js → hx-tag-BL5qJJCN.js} +20 -8
  387. package/dist/shared/hx-tag-BL5qJJCN.js.map +1 -0
  388. package/dist/shared/{hx-td-CNCvzBwY.js → hx-td-CzSvVKdp.js} +21 -13
  389. package/dist/shared/hx-td-CzSvVKdp.js.map +1 -0
  390. package/dist/shared/{hx-text-input-Zuodg9s_.js → hx-text-input-BfMrvN9N.js} +110 -48
  391. package/dist/shared/hx-text-input-BfMrvN9N.js.map +1 -0
  392. package/dist/shared/{hx-textarea-BfSJJtA1.js → hx-textarea-C-i_Vam6.js} +108 -47
  393. package/dist/shared/hx-textarea-C-i_Vam6.js.map +1 -0
  394. package/dist/shared/{hx-time-picker-CZvmihHD.js → hx-time-picker-MZyLQPW9.js} +50 -61
  395. package/dist/shared/hx-time-picker-MZyLQPW9.js.map +1 -0
  396. package/dist/shared/{hx-toggle-button-BZUQUULm.js → hx-toggle-button-ClyNYNVI.js} +68 -37
  397. package/dist/shared/hx-toggle-button-ClyNYNVI.js.map +1 -0
  398. package/dist/shared/{hx-tooltip-Ny4i1Idj.js → hx-tooltip-ByWT987R.js} +33 -19
  399. package/dist/shared/hx-tooltip-ByWT987R.js.map +1 -0
  400. package/dist/shared/{hx-top-nav-CC4FW2Hp.js → hx-top-nav-k7hY78kt.js} +35 -14
  401. package/dist/shared/hx-top-nav-k7hY78kt.js.map +1 -0
  402. package/dist/shared/{hx-tree-item-CPQ9dJiK.js → hx-tree-item-D0ZphA45.js} +9 -1
  403. package/dist/shared/hx-tree-item-D0ZphA45.js.map +1 -0
  404. package/dist/shared/{toast-factory-CEMNOt1T.js → toast-factory-Cwd0PihS.js} +49 -36
  405. package/dist/shared/toast-factory-Cwd0PihS.js.map +1 -0
  406. package/package.json +2 -2
  407. package/dist/shared/aria-delegation-CBP9eQ0M.js.map +0 -1
  408. package/dist/shared/hx-accordion-CpfO0YQo.js.map +0 -1
  409. package/dist/shared/hx-alert-CHOjTBds.js.map +0 -1
  410. package/dist/shared/hx-badge-RPzd-t5l.js.map +0 -1
  411. package/dist/shared/hx-banner-B-WEDiq7.js.map +0 -1
  412. package/dist/shared/hx-breadcrumb-item-jLAKK038.js.map +0 -1
  413. package/dist/shared/hx-button-DoN8jjQT.js.map +0 -1
  414. package/dist/shared/hx-card-BgXZXDuc.js.map +0 -1
  415. package/dist/shared/hx-carousel-item-Dwt9Pphz.js.map +0 -1
  416. package/dist/shared/hx-checkbox-C82GjRXe.js.map +0 -1
  417. package/dist/shared/hx-checkbox-group-DThZeN5d.js.map +0 -1
  418. package/dist/shared/hx-clinical-status-BjtT5c0M.js.map +0 -1
  419. package/dist/shared/hx-code-snippet-DcVENSuC.js.map +0 -1
  420. package/dist/shared/hx-color-picker-C6EIuS9t.js.map +0 -1
  421. package/dist/shared/hx-combobox-BJ4lQocO.js.map +0 -1
  422. package/dist/shared/hx-copy-button-BoM0WsMd.js.map +0 -1
  423. package/dist/shared/hx-counter-B5NgKlw4.js.map +0 -1
  424. package/dist/shared/hx-data-table-D5Ne-goy.js.map +0 -1
  425. package/dist/shared/hx-date-picker-Cd3I3WkX.js.map +0 -1
  426. package/dist/shared/hx-dialog-D4ubstxx.js.map +0 -1
  427. package/dist/shared/hx-divider-BBtOLHRP.js.map +0 -1
  428. package/dist/shared/hx-drawer--WDLuWtS.js.map +0 -1
  429. package/dist/shared/hx-dropdown-n5-XSmiV.js.map +0 -1
  430. package/dist/shared/hx-field-CwT9tki1.js.map +0 -1
  431. package/dist/shared/hx-field-label-CcOK9VU3.js.map +0 -1
  432. package/dist/shared/hx-file-upload-Di_vpQaG.js.map +0 -1
  433. package/dist/shared/hx-help-text-Bmb80bP4.js.map +0 -1
  434. package/dist/shared/hx-icon-BKHs3OLu.js.map +0 -1
  435. package/dist/shared/hx-icon-button-CJuy9xbw.js.map +0 -1
  436. package/dist/shared/hx-image-ztiXumZB.js.map +0 -1
  437. package/dist/shared/hx-link-CN7AvGOW.js.map +0 -1
  438. package/dist/shared/hx-menu-divider-DRT8yHRZ.js.map +0 -1
  439. package/dist/shared/hx-meter-BcVC9yrt.js.map +0 -1
  440. package/dist/shared/hx-nav-item-CJN4VDrf.js.map +0 -1
  441. package/dist/shared/hx-nav-l0Rp7WPW.js.map +0 -1
  442. package/dist/shared/hx-number-input-0Waw7Z7u.js.map +0 -1
  443. package/dist/shared/hx-overflow-menu-DElwFSCd.js.map +0 -1
  444. package/dist/shared/hx-patient-banner-BKiN7nIE.js.map +0 -1
  445. package/dist/shared/hx-popover-CydNuVkT.js.map +0 -1
  446. package/dist/shared/hx-popup-DbzezTOd.js.map +0 -1
  447. package/dist/shared/hx-progress-bar-Cm0VihTN.js.map +0 -1
  448. package/dist/shared/hx-radio-f8c5ggHG.js.map +0 -1
  449. package/dist/shared/hx-rating-qRJZXskm.js.map +0 -1
  450. package/dist/shared/hx-select-CgcgsHU5.js.map +0 -1
  451. package/dist/shared/hx-skeleton-tiYvKO-t.js.map +0 -1
  452. package/dist/shared/hx-slider-BvXtvxmN.js.map +0 -1
  453. package/dist/shared/hx-spinner-D6nzuGmj.js.map +0 -1
  454. package/dist/shared/hx-split-button-CPndTJlC.js.map +0 -1
  455. package/dist/shared/hx-split-panel-Dx72NaET.js.map +0 -1
  456. package/dist/shared/hx-status-indicator-ClWpK6zz.js.map +0 -1
  457. package/dist/shared/hx-structured-list-DKlrv7kS.js.map +0 -1
  458. package/dist/shared/hx-switch-BzMN37PV.js.map +0 -1
  459. package/dist/shared/hx-tab-panel-J58zOSjq.js.map +0 -1
  460. package/dist/shared/hx-tag-F0ZcYj9b.js.map +0 -1
  461. package/dist/shared/hx-td-CNCvzBwY.js.map +0 -1
  462. package/dist/shared/hx-text-input-Zuodg9s_.js.map +0 -1
  463. package/dist/shared/hx-textarea-BfSJJtA1.js.map +0 -1
  464. package/dist/shared/hx-time-picker-CZvmihHD.js.map +0 -1
  465. package/dist/shared/hx-toggle-button-BZUQUULm.js.map +0 -1
  466. package/dist/shared/hx-tooltip-Ny4i1Idj.js.map +0 -1
  467. package/dist/shared/hx-top-nav-CC4FW2Hp.js.map +0 -1
  468. package/dist/shared/hx-tree-item-CPQ9dJiK.js.map +0 -1
  469. package/dist/shared/toast-factory-CEMNOt1T.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hx-time-picker-MZyLQPW9.js","sources":["../../src/components/hx-time-picker/hx-time-picker.styles.ts","../../src/components/hx-time-picker/hx-time-picker.ts"],"sourcesContent":["import { css } from 'lit';\n\n// prettier-ignore\nexport const helixTimePickerStyles = css`:host{display:block;position:relative}:host([disabled]){opacity:var(--hx-opacity-disabled, .5);pointer-events:none}*{box-sizing:border-box}.field{display:flex;flex-direction:column;gap:var(--hx-space-1, .25rem);font-family:var(--hx-time-picker-font-family, var(--hx-font-family-sans, sans-serif))}.field__label{display:flex;align-items:baseline;gap:var(--hx-space-1, .25rem);font-size:var(--hx-font-size-sm, .875rem);font-weight:var(--hx-font-weight-medium, 500);color:var(--hx-time-picker-label-color, var(--hx-color-neutral-700));line-height:var(--hx-line-height-normal, 1.5)}.field__required-marker{color:var(--hx-time-picker-error-color, var(--hx-color-error-text, #b91c1c));font-weight:var(--hx-font-weight-bold, 700)}.field__combobox{position:relative;display:flex;align-items:center;border:var(--hx-border-width-thin, 1px) solid var(--hx-time-picker-border-color, var(--hx-color-neutral-300));border-radius:var(--hx-time-picker-border-radius, var(--hx-border-radius-md, .375rem));background-color:var(--hx-time-picker-bg, var(--hx-color-neutral-0));transition:border-color var(--hx-transition-fast, .15s ease),box-shadow var(--hx-transition-fast, .15s ease);overflow:visible}.field__combobox:focus-within{border-color:var(--hx-time-picker-focus-ring-color, var(--hx-focus-ring-color));box-shadow:0 0 0 var(--hx-focus-ring-width, 2px) color-mix(in srgb,var(--hx-time-picker-focus-ring-color, var(--hx-focus-ring-color)) calc(var(--hx-focus-ring-opacity, .25) * 100%),transparent)}.field--error .field__combobox{border-color:var(--hx-time-picker-error-color, var(--hx-color-error-500))}.field--error .field__combobox:focus-within{border-color:var(--hx-time-picker-error-color, var(--hx-color-error-500));box-shadow:0 0 0 var(--hx-focus-ring-width, 2px) color-mix(in srgb,var(--hx-time-picker-error-color, var(--hx-color-error-500)) calc(var(--hx-focus-ring-opacity, .25) * 100%),transparent)}.field__input{flex:1;border:none;outline:none;background:transparent;padding:var(--hx-space-2, .5rem) var(--hx-space-3, .75rem);font-family:inherit;font-size:var(--hx-font-size-md, 1rem);color:var(--hx-time-picker-color, var(--hx-color-neutral-800));line-height:var(--hx-line-height-normal, 1.5);min-height:var(--hx-size-10, 2.5rem);width:100%;cursor:text}.field__input::placeholder{color:var(--hx-color-neutral-400)}.field__input:disabled{cursor:not-allowed}.field__toggle{display:flex;align-items:center;justify-content:center;border:none;background:transparent;padding:0 var(--hx-space-3, .75rem);color:var(--hx-time-picker-chevron-color, var(--hx-color-neutral-500));cursor:pointer;height:100%;min-height:var(--hx-size-10, 2.5rem);flex-shrink:0;border-inline-start:var(--hx-border-width-thin, 1px) solid var(--hx-time-picker-border-color, var(--hx-color-neutral-300))}.field__toggle:focus-visible{outline:var(--hx-focus-ring-width, 2px) solid var(--hx-time-picker-focus-ring-color, var(--hx-focus-ring-color));outline-offset:-2px;border-radius:0 var(--hx-time-picker-border-radius, var(--hx-border-radius-md, .375rem))}.field__listbox{position:absolute;top:calc(100% + var(--hx-space-1, .25rem));inset-inline-start:0;inset-inline-end:0;z-index:var(--hx-z-index-dropdown, 1000);background-color:var(--hx-time-picker-listbox-bg, var(--hx-color-neutral-0));border:var(--hx-border-width-thin, 1px) solid var(--hx-time-picker-border-color, var(--hx-color-neutral-300));border-radius:var(--hx-time-picker-border-radius, var(--hx-border-radius-md, .375rem));box-shadow:var( --hx-time-picker-listbox-shadow, 0 4px 16px color-mix(in srgb, var(--hx-color-neutral-900) 12%, transparent) );max-height:var(--hx-time-picker-listbox-max-height, 16rem);overflow-y:auto;padding:var(--hx-space-1, .25rem) 0;list-style:none;margin:0}@media(prefers-reduced-motion:no-preference){.field__listbox{animation:hx-listbox-enter var(--hx-transition-fast, .15s ease) forwards}}@keyframes hx-listbox-enter{0%{opacity:0;transform:translateY(-.25rem)}to{opacity:1;transform:translateY(0)}}.field__option{display:flex;align-items:center;padding:var(--hx-space-2, .5rem) var(--hx-space-3, .75rem);font-size:var(--hx-font-size-md, 1rem);font-family:inherit;color:var(--hx-time-picker-option-color, var(--hx-color-neutral-800));cursor:pointer;transition:background-color var(--hx-transition-fast, .15s ease);line-height:var(--hx-line-height-normal, 1.5)}.field__option:hover,.field__option--active{background-color:var(--hx-time-picker-option-hover-bg, var(--hx-color-primary-50));color:var(--hx-time-picker-option-hover-color, var(--hx-color-primary-700))}.field__option--selected{background-color:var(--hx-time-picker-option-selected-bg, var(--hx-color-primary-100));color:var(--hx-time-picker-option-selected-color, var(--hx-color-primary-800));font-weight:var(--hx-font-weight-medium, 500)}.field__option--selected.field__option--active{background-color:var(--hx-time-picker-option-selected-bg, var(--hx-color-primary-100))}@media(prefers-reduced-motion:reduce){.field__combobox,.field__option{transition:none}}.field__help-text,.field__error{font-size:var(--hx-font-size-xs, .75rem);line-height:var(--hx-line-height-normal, 1.5)}.field__help-text{color:var(--hx-color-neutral-500)}.field__error{color:var(--hx-time-picker-error-color, var(--hx-color-error-text, #b91c1c))}`;\n","import { html, nothing, type PropertyValues } from 'lit';\nimport '../../utilities/document-token-adoption.js';\nimport { customElement, property, query, state } from 'lit/decorators.js';\nimport { HelixElement } from '../../base/index.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { live } from 'lit/directives/live.js';\nimport { repeat } from 'lit/directives/repeat.js';\nimport { helixTimePickerStyles } from './hx-time-picker.styles.js';\n\n// ─── Time Slot ───────────────────────────────────────────────────────────────\n\ninterface TimeSlot {\n /** HH:MM in 24-hour format — canonical internal value. */\n value: string;\n /** Display label respecting the component's `format` property. */\n label: string;\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\n/** Parse \"HH:MM\" into { hours, minutes }. Returns null when the string is not valid. */\nfunction parseHHMM(raw: string): { hours: number; minutes: number } | null {\n const match = /^(\\d{1,2}):(\\d{2})$/.exec(raw.trim());\n if (!match) return null;\n const hours = parseInt(match[1] ?? '0', 10);\n const minutes = parseInt(match[2] ?? '0', 10);\n if (hours < 0 || hours > 23 || minutes < 0 || minutes > 59) return null;\n return { hours, minutes };\n}\n\n/** Format { hours, minutes } as zero-padded \"HH:MM\". */\nfunction toHHMM(hours: number, minutes: number): string {\n return `${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}`;\n}\n\n/** Convert a 24-hour HH:MM value to a 12-hour display string (e.g. \"02:30 PM\"). */\nfunction to12h(value: string): string {\n const parsed = parseHHMM(value);\n if (!parsed) return value;\n const { hours, minutes } = parsed;\n const period = hours < 12 ? 'AM' : 'PM';\n const h = hours % 12 === 0 ? 12 : hours % 12;\n return `${String(h).padStart(2, '0')}:${String(minutes).padStart(2, '0')} ${period}`;\n}\n\n/**\n * Generate ordered time slots between `minTime` and `maxTime` (inclusive) at\n * `stepMinutes` intervals. Both bounds are HH:MM strings; defaults fall back\n * to \"00:00\" / \"23:59\".\n */\nfunction generateSlots(\n minTime: string,\n maxTime: string,\n stepMinutes: number,\n format: '12h' | '24h',\n): TimeSlot[] {\n const minParsed = parseHHMM(minTime) ?? { hours: 0, minutes: 0 };\n const maxParsed = parseHHMM(maxTime) ?? { hours: 23, minutes: 59 };\n\n const minTotal = minParsed.hours * 60 + minParsed.minutes;\n const maxTotal = maxParsed.hours * 60 + maxParsed.minutes;\n\n // Guard against degenerate step values\n const step = Math.max(1, Math.round(stepMinutes));\n\n const slots: TimeSlot[] = [];\n for (let t = minTotal; t <= maxTotal; t += step) {\n const h = Math.floor(t / 60) % 24;\n const m = t % 60;\n const value = toHHMM(h, m);\n slots.push({\n value,\n label: format === '12h' ? to12h(value) : value,\n });\n }\n return slots;\n}\n\n/** Clamp a raw HH:MM value to the [min, max] range; return '' when value is empty. */\nfunction clampValue(value: string, minTime: string, maxTime: string): string {\n if (!value) return '';\n const parsed = parseHHMM(value);\n if (!parsed) return '';\n\n const total = parsed.hours * 60 + parsed.minutes;\n const minParsed = parseHHMM(minTime) ?? { hours: 0, minutes: 0 };\n const maxParsed = parseHHMM(maxTime) ?? { hours: 23, minutes: 59 };\n const minTotal = minParsed.hours * 60 + minParsed.minutes;\n const maxTotal = maxParsed.hours * 60 + maxParsed.minutes;\n\n if (total < minTotal) return toHHMM(minParsed.hours, minParsed.minutes);\n if (total > maxTotal) return toHHMM(maxParsed.hours, maxParsed.minutes);\n return toHHMM(parsed.hours, parsed.minutes);\n}\n\n/**\n * Attempt to parse a user-typed string (12 h or 24 h) into an HH:MM value.\n * Returns null when the string cannot be resolved.\n */\nfunction parseUserInput(raw: string): string | null {\n const trimmed = raw.trim().toUpperCase();\n\n // 24-hour \"HH:MM\" or \"H:MM\"\n const hhmm = parseHHMM(trimmed);\n if (hhmm) return toHHMM(hhmm.hours, hhmm.minutes);\n\n // 12-hour patterns: \"2:30 PM\", \"2:30PM\", \"02:30 AM\", \"230 pm\", \"2 PM\"\n const twelve =\n /^(\\d{1,2})(?::(\\d{2}))?\\s*(AM|PM)$/.exec(trimmed) ??\n /^(\\d{1,2})(\\d{2})\\s*(AM|PM)$/.exec(trimmed);\n\n if (twelve) {\n let hours = parseInt(twelve[1] ?? '0', 10);\n const minutes = twelve[2] !== undefined ? parseInt(twelve[2], 10) : 0;\n const period = twelve[3] ?? '';\n if (hours < 1 || hours > 12 || minutes < 0 || minutes > 59) return null;\n if (period === 'AM') {\n hours = hours === 12 ? 0 : hours;\n } else {\n hours = hours === 12 ? 12 : hours + 12;\n }\n return toHHMM(hours, minutes);\n }\n\n return null;\n}\n\n// ─── Component ───────────────────────────────────────────────────────────────\n\n/**\n * A time-picker component with a combobox pattern: a text input with format\n * masking and a dropdown listbox of pre-generated time slots.\n *\n * @summary Form-associated time picker with 12h/24h format support and dropdown listbox.\n *\n * @tag hx-time-picker\n *\n * @slot label - Custom label content; overrides the rendered label element when used.\n * @slot help-text - Help text displayed below the field.\n * @slot error - Custom error content; overrides the `error` property.\n *\n * @fires {CustomEvent<{value: string}>} hx-change - Dispatched when the selected time changes. Detail value is HH:MM (24h).\n *\n * @csspart label - The label element.\n * @csspart input - The text input element.\n * @csspart toggle - The clock icon toggle button.\n * @csspart listbox - The dropdown `<ul>` element.\n * @csspart option - Each `<li>` option in the listbox.\n * @csspart field - The outer field wrapper element.\n * @csspart error - The error message element.\n * @csspart help-text - The help text element.\n *\n * @cssprop [--hx-time-picker-bg=var(--hx-color-neutral-0)] - Input background color.\n * @cssprop [--hx-time-picker-color=var(--hx-color-neutral-800)] - Input text color.\n * @cssprop [--hx-time-picker-border-color=var(--hx-color-neutral-300)] - Border color.\n * @cssprop [--hx-time-picker-border-radius=var(--hx-border-radius-md)] - Border radius.\n * @cssprop [--hx-time-picker-font-family=var(--hx-font-family-sans)] - Font family.\n * @cssprop [--hx-time-picker-focus-ring-color=var(--hx-focus-ring-color)] - Focus ring color.\n * @cssprop [--hx-time-picker-error-color=var(--hx-color-error-500)] - Error state color.\n * @cssprop [--hx-time-picker-label-color=var(--hx-color-neutral-700)] - Label text color.\n * @cssprop [--hx-time-picker-chevron-color=var(--hx-color-neutral-500)] - Toggle chevron color.\n * @cssprop [--hx-time-picker-listbox-bg=var(--hx-color-neutral-0)] - Listbox background.\n * @cssprop [--hx-time-picker-listbox-max-height=16rem] - Maximum height of the dropdown.\n * @cssprop [--hx-time-picker-listbox-shadow=0 4px 16px color-mix(in srgb, var(--hx-color-neutral-900) 12%, transparent)] - Box shadow for the dropdown listbox.\n * @cssprop [--hx-time-picker-option-color=var(--hx-color-neutral-800)] - Option text color.\n * @cssprop [--hx-time-picker-option-hover-bg=var(--hx-color-primary-50)] - Option hover background.\n * @cssprop [--hx-time-picker-option-hover-color=var(--hx-color-primary-700)] - Option hover text color.\n * @cssprop [--hx-time-picker-option-selected-bg=var(--hx-color-primary-100)] - Selected option background.\n * @cssprop [--hx-time-picker-option-selected-color=var(--hx-color-primary-800)] - Selected option text color.\n */\n@customElement('hx-time-picker')\nexport class HelixTimePicker extends HelixElement {\n static override styles = [helixTimePickerStyles];\n\n // ─── Form Association ───\n\n /**\n * Declares this element as form-associated so it participates in native form submission.\n * @internal\n */\n static override formAssociated = true;\n\n // ─── Properties ───\n\n /**\n * The name submitted with the form. Value is always HH:MM (24-hour).\n * @attr name\n */\n @property({ type: String, reflect: true })\n name = '';\n\n /**\n * The current value in HH:MM (24-hour) format.\n * @attr value\n */\n @property({ type: String, reflect: true })\n value = '';\n\n /**\n * The earliest selectable time in HH:MM format.\n * @attr min\n */\n @property({ type: String })\n min = '00:00';\n\n /**\n * The latest selectable time in HH:MM format.\n * @attr max\n */\n @property({ type: String })\n max = '23:59';\n\n /**\n * Step interval between dropdown options, in minutes. Defaults to 30.\n * @attr step\n */\n @property({ type: Number })\n step = 30;\n\n /**\n * The visible label text for the field.\n * @attr label\n */\n @property({ type: String })\n label = '';\n\n /**\n * Whether the field is required for form submission.\n * @attr required\n */\n @property({ type: Boolean, reflect: true })\n required = false;\n\n /**\n * Whether the field is disabled.\n * @attr disabled\n */\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n /**\n * Error message to display. When set, the field enters an error state.\n * @attr error\n */\n @property({ type: String })\n error = '';\n\n /**\n * Display format for the time input. '12h' shows AM/PM; '24h' is bare HH:MM.\n * @attr format\n */\n @property({ type: String, reflect: true })\n format: '12h' | '24h' = '12h';\n\n // ─── Internal State ───\n\n /**\n * Whether the dropdown listbox is currently open.\n * @internal\n */\n @state() private _open = false;\n /**\n * Index of the currently keyboard-active option in the listbox; -1 when none is active.\n * @internal\n */\n @state() private _activeIndex = -1;\n /**\n * The display string shown in the text input, formatted according to the current `format` property.\n * @internal\n */\n @state() private _inputDisplayValue = '';\n /**\n * Whether the label slot has slotted content assigned to it.\n * @internal\n */\n @state() private _hasLabelSlot = false;\n /**\n * Whether the error slot has slotted content assigned to it.\n * @internal\n */\n @state() private _hasErrorSlot = false;\n /**\n * Whether the help-text slot has slotted content assigned to it.\n * @internal\n */\n @state() private _hasHelpSlot = false;\n /**\n * The ID of the slotted label element, used for aria-labelledby cross-root linking.\n * @internal\n */\n @state() private _slottedLabelId = '';\n\n // ─── Stable IDs (monotonically incrementing counter for SSR safety) ───\n\n /**\n * Monotonically incrementing counter used to generate unique element IDs across instances.\n * @internal\n */\n private static _instanceCount = 0;\n\n /**\n * Unique ID for this component instance, used as the input element's `id` attribute.\n * @internal\n */\n private readonly _id = `hx-time-picker-${++HelixTimePicker._instanceCount}`;\n /**\n * Unique ID for the listbox element, referenced by `aria-controls` on the combobox input.\n * @internal\n */\n private readonly _listboxId = `${this._id}-listbox`;\n /**\n * Unique ID for the error message element, referenced by `aria-describedby` on the input.\n * @internal\n */\n private readonly _errorId = `${this._id}-error`;\n /**\n * Unique ID for the help text element, referenced by `aria-describedby` on the input.\n * @internal\n */\n private readonly _helpId = `${this._id}-help`;\n\n // ─── Query References ───\n\n /**\n * Reference to the text input element inside the shadow DOM.\n * @internal\n */\n @query('.field__input')\n private _inputEl: HTMLInputElement | undefined;\n\n /**\n * Reference to the listbox `<ul>` element inside the shadow DOM.\n * @internal\n */\n @query('.field__listbox')\n private _listboxEl: HTMLUListElement | undefined;\n\n // ─── Memoized slot generation (avoids regenerating on every render call) ───\n\n /**\n * Memoized array of generated time slots; null until first access.\n * @internal\n */\n private _cachedSlots: TimeSlot[] | null = null;\n /**\n * Cache key composed of min, max, step, and format; used to detect when slots must be regenerated.\n * @internal\n */\n private _slotsKey = '';\n\n /**\n * Lazily generates and caches the list of time slots based on current min, max, step, and format.\n * @internal\n */\n private get _slots(): TimeSlot[] {\n const key = `${this.min}|${this.max}|${this.step}|${this.format}`;\n if (this._cachedSlots === null || key !== this._slotsKey) {\n this._slotsKey = key;\n this._cachedSlots = generateSlots(this.min, this.max, this.step, this.format);\n }\n return this._cachedSlots;\n }\n\n // ─── Outside-click handler (bound reference for add/removeEventListener) ───\n\n /**\n * Closes the listbox when a click is detected outside the component; bound for stable add/removeEventListener calls.\n * @internal\n */\n private readonly _handleOutsideClick = (e: MouseEvent): void => {\n if (!this.isConnected) return;\n if (!this.contains(e.target as Node) && !this.shadowRoot?.contains(e.target as Node)) {\n this._closeListbox();\n }\n };\n\n // ─── Lifecycle ───\n\n override connectedCallback(): void {\n super.connectedCallback();\n document.addEventListener('click', this._handleOutsideClick);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n document.removeEventListener('click', this._handleOutsideClick);\n }\n\n override willUpdate(changed: PropertyValues<this>): void {\n // Keep display value in sync whenever the canonical value or format changes\n if (changed.has('value') || changed.has('format')) {\n this._inputDisplayValue = this.value\n ? this.format === '12h'\n ? to12h(this.value)\n : this.value\n : '';\n }\n }\n\n override updated(changed: PropertyValues<this>): void {\n super.updated(changed);\n if (changed.has('value')) {\n this._internals.setFormValue(this.value || null);\n this._updateValidity();\n }\n // When the listbox opens, scroll the selected (or active) option into view\n if ((changed as Map<PropertyKey, unknown>).has('_open') && this._open) {\n this._scrollActiveOptionIntoView();\n }\n }\n\n // ─── Form Integration ───\n\n /** Checks whether the field 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 /** @internal */\n private _updateValidity(): void {\n if (this.required && !this.value) {\n this._internals.setValidity(\n { valueMissing: true },\n this.error || 'Please select a time.',\n this._inputEl ?? undefined,\n );\n } else {\n this._internals.setValidity({});\n }\n }\n\n /** @internal */\n protected override _onFormReset(): void {\n this.value = '';\n this._inputDisplayValue = '';\n this._internals.setFormValue(null);\n this._closeListbox();\n }\n\n /** @internal */\n protected override _onFormStateRestore(\n state: File | string | FormData | null,\n _mode: 'restore' | 'autocomplete',\n ): void {\n // Only string states are valid for this component; ignore File/FormData\n if (typeof state !== 'string') return;\n // Validate and clamp before assigning; ignore out-of-spec values\n const clamped = clampValue(state, this.min, this.max);\n this.value = clamped;\n }\n\n /** @internal */\n protected override _onFormDisabled(disabled: boolean): void {\n this.disabled = disabled;\n }\n\n // ─── Listbox helpers ───\n\n /** @internal */\n private _openListbox(): void {\n if (this._open) return;\n // Pre-set active index to currently selected slot (or 0)\n const selectedIndex = this._slots.findIndex((s) => s.value === this.value);\n this._activeIndex = selectedIndex >= 0 ? selectedIndex : 0;\n this._open = true;\n }\n\n /** @internal */\n private _closeListbox(): void {\n if (!this._open) return;\n this._open = false;\n this._activeIndex = -1;\n }\n\n /** @internal */\n private _scrollActiveOptionIntoView(): void {\n if (!this._listboxEl) return;\n const active = this._listboxEl.querySelector<HTMLElement>('.field__option--active');\n active?.scrollIntoView({ block: 'nearest' });\n }\n\n /** @internal */\n private _selectSlot(slot: TimeSlot): void {\n const clamped = clampValue(slot.value, this.min, this.max);\n this.value = clamped;\n this._closeListbox();\n this._dispatchChange(clamped);\n }\n\n // ─── Slot tracking ───\n\n /** @internal */\n private _handleLabelSlotChange(e: Event): void {\n const slot = e.target as HTMLSlotElement;\n const nodes = slot.assignedNodes({ flatten: true });\n this._hasLabelSlot = nodes.length > 0;\n if (this._hasLabelSlot) {\n // Forward aria-labelledby: ensure the slotted label element has an ID so\n // the shadow-DOM input can reference it via aria-labelledby (A-03).\n const labelEl = nodes.find((n) => n.nodeType === Node.ELEMENT_NODE) as\n | HTMLElement\n | undefined;\n if (labelEl) {\n if (!labelEl.id) {\n labelEl.id = `${this._id}-slotted-label`;\n }\n this._slottedLabelId = labelEl.id;\n }\n } else {\n this._slottedLabelId = '';\n }\n }\n\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 /** @internal */\n private _handleHelpSlotChange(e: Event): void {\n const slot = e.target as HTMLSlotElement;\n this._hasHelpSlot = slot.assignedNodes({ flatten: true }).length > 0;\n }\n\n // ─── Event Dispatch ───\n\n /** @internal */\n private _dispatchChange(value: string): void {\n this.dispatchEvent(\n new CustomEvent<{ value: string }>('hx-change', {\n bubbles: true,\n composed: true,\n detail: { value },\n }),\n );\n }\n\n // ─── Input Handlers ───\n\n /** @internal */\n private _handleInputClick(): void {\n if (!this.disabled) this._openListbox();\n }\n\n /** @internal */\n private _handleToggleClick(e: MouseEvent): void {\n e.stopPropagation();\n if (this.disabled) return;\n if (this._open) {\n this._closeListbox();\n } else {\n this._openListbox();\n this._inputEl?.focus();\n }\n }\n\n /** @internal */\n private _handleInputInput(e: Event): void {\n const target = e.target as HTMLInputElement;\n this._inputDisplayValue = target.value;\n // Open the listbox as the user types\n if (!this._open) this._openListbox();\n }\n\n /** @internal */\n private _handleInputChange(e: Event): void {\n const target = e.target as HTMLInputElement;\n const raw = target.value.trim();\n\n if (!raw) {\n // User cleared the field\n this.value = '';\n this._internals.setFormValue(null);\n this._updateValidity();\n this._dispatchChange('');\n return;\n }\n\n const parsed = parseUserInput(raw);\n if (parsed) {\n const clamped = clampValue(parsed, this.min, this.max);\n this.value = clamped;\n this._dispatchChange(clamped);\n } else {\n // Revert display to last known good value\n this._inputDisplayValue = this.value\n ? this.format === '12h'\n ? to12h(this.value)\n : this.value\n : '';\n }\n }\n\n /** @internal */\n private _handleInputKeyDown(e: KeyboardEvent): void {\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n if (!this._open) {\n this._openListbox();\n } else {\n this._activeIndex = Math.min(this._activeIndex + 1, this._slots.length - 1);\n this._scrollActiveOptionIntoView();\n }\n break;\n\n case 'ArrowUp':\n e.preventDefault();\n if (this._open) {\n this._activeIndex = Math.max(this._activeIndex - 1, 0);\n this._scrollActiveOptionIntoView();\n }\n break;\n\n case 'Enter':\n if (this._open && this._activeIndex >= 0) {\n e.preventDefault();\n const slot = this._slots[this._activeIndex];\n if (slot) this._selectSlot(slot);\n }\n break;\n\n case 'Escape':\n e.preventDefault();\n this._closeListbox();\n break;\n\n case 'Home':\n if (this._open) {\n e.preventDefault();\n this._activeIndex = 0;\n this._scrollActiveOptionIntoView();\n }\n break;\n\n case 'End':\n if (this._open) {\n e.preventDefault();\n this._activeIndex = this._slots.length - 1;\n this._scrollActiveOptionIntoView();\n }\n break;\n\n case 'Tab':\n this._closeListbox();\n break;\n }\n }\n\n /** @internal */\n private _handleOptionPointerDown(e: MouseEvent): void {\n // Prevent the input from losing focus when clicking an option\n e.preventDefault();\n }\n\n /** @internal */\n private _handleOptionClick(slot: TimeSlot): void {\n this._selectSlot(slot);\n this._inputEl?.focus();\n }\n\n /** @internal */\n private _handleOptionMouseEnter(index: number): void {\n this._activeIndex = index;\n }\n\n // ─── Public API ───\n\n /** Moves focus to the time input element. */\n override focus(options?: FocusOptions): void {\n this._inputEl?.focus(options);\n }\n\n // ─── Render ───\n\n override render() {\n const hasError = !!this.error || this._hasErrorSlot;\n const slots = this._slots;\n\n const fieldClasses = {\n field: true,\n 'field--error': hasError,\n 'field--disabled': this.disabled,\n 'field--required': this.required,\n };\n\n const activeDescendant =\n this._open && this._activeIndex >= 0\n ? `${this._listboxId}-option-${this._activeIndex}`\n : undefined;\n\n const placeholder = this.format === '12h' ? 'hh:mm AM' : 'hh:mm';\n\n // WCAG 1.3.1: the help-text div with _helpId always renders in the DOM unconditionally.\n // Always include _helpId in describedBy — an empty target is harmless for AT and ensures\n // the link is established immediately without waiting for the slotchange event to fire.\n const describedBy =\n [hasError ? this._errorId : null, this._helpId].filter(Boolean).join(' ') || undefined;\n\n return html`\n <div part=\"field\" class=${classMap(fieldClasses)}>\n <!-- Label -->\n <slot name=\"label\" @slotchange=${this._handleLabelSlotChange}>\n ${this.label\n ? html`\n <label part=\"label\" class=\"field__label\" for=${this._id}>\n ${this.label}\n ${this.required\n ? html`<span class=\"field__required-marker\" aria-hidden=\"true\">*</span>`\n : nothing}\n </label>\n `\n : nothing}\n </slot>\n\n <!-- Combobox wrapper; role=\"combobox\" lives on the input per ARIA 1.2 -->\n <div class=\"field__combobox\">\n <input\n part=\"input\"\n class=\"field__input\"\n id=${this._id}\n type=\"text\"\n inputmode=\"text\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n role=\"combobox\"\n aria-expanded=${this._open ? 'true' : 'false'}\n aria-haspopup=\"listbox\"\n .value=${live(this._inputDisplayValue)}\n placeholder=${placeholder}\n ?required=${this.required}\n ?disabled=${this.disabled}\n name=${ifDefined(this.name || undefined)}\n aria-autocomplete=\"list\"\n aria-controls=${this._listboxId}\n aria-activedescendant=${ifDefined(activeDescendant)}\n aria-invalid=${hasError ? 'true' : nothing}\n aria-describedby=${ifDefined(describedBy)}\n aria-required=${this.required ? 'true' : nothing}\n aria-labelledby=${ifDefined(\n this._hasLabelSlot && this._slottedLabelId ? this._slottedLabelId : undefined,\n )}\n @click=${this._handleInputClick}\n @input=${this._handleInputInput}\n @change=${this._handleInputChange}\n @keydown=${this._handleInputKeyDown}\n />\n\n <!-- Toggle button -->\n <button\n part=\"toggle\"\n type=\"button\"\n class=\"field__toggle\"\n tabindex=\"-1\"\n aria-label=${this._open ? 'Close time picker' : 'Open time picker'}\n ?disabled=${this.disabled}\n @click=${this._handleToggleClick}\n >\n <!-- Clock icon -->\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <circle cx=\"8\" cy=\"8\" r=\"6.5\" stroke=\"currentColor\" stroke-width=\"1.25\" />\n <path\n d=\"M8 4.5V8L10.5 10\"\n stroke=\"currentColor\"\n stroke-width=\"1.25\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </button>\n\n <!-- Dropdown listbox: always in DOM so aria-controls is never a dangling reference (WCAG 4.1.2). Hidden via the boolean hidden attribute when closed. -->\n <ul\n part=\"listbox\"\n class=\"field__listbox\"\n id=${this._listboxId}\n role=\"listbox\"\n aria-label=${this.label || 'Time options'}\n ?hidden=${!this._open}\n >\n ${this._open\n ? repeat(\n slots,\n (slot) => slot.value,\n (slot, index) => {\n const isSelected = slot.value === this.value;\n const isActive = index === this._activeIndex;\n return html`\n <li\n part=\"option\"\n class=${classMap({\n field__option: true,\n 'field__option--selected': isSelected,\n 'field__option--active': isActive,\n })}\n id=\"${this._listboxId}-option-${index}\"\n role=\"option\"\n aria-selected=${isSelected ? 'true' : 'false'}\n @pointerdown=${this._handleOptionPointerDown}\n @click=${() => this._handleOptionClick(slot)}\n @mouseenter=${() => this._handleOptionMouseEnter(index)}\n >\n ${slot.label}\n </li>\n `;\n },\n )\n : nothing}\n </ul>\n </div>\n\n <!-- Error slot / property -->\n <slot name=\"error\" @slotchange=${this._handleErrorSlotChange}>\n ${this.error\n ? html`\n <div part=\"error\" class=\"field__error\" id=${this._errorId} role=\"alert\">\n ${this.error}\n </div>\n `\n : nothing}\n </slot>\n\n <!-- Help slot -->\n <div part=\"help-text\" class=\"field__help-text\" id=${this._helpId}>\n <slot name=\"help-text\" @slotchange=${this._handleHelpSlotChange}></slot>\n </div>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'hx-time-picker': HelixTimePicker;\n }\n}\n"],"names":["helixTimePickerStyles","css","parseHHMM","raw","match","hours","minutes","toHHMM","to12h","value","parsed","period","h","generateSlots","minTime","maxTime","stepMinutes","format","minParsed","maxParsed","minTotal","maxTotal","step","slots","t","m","clampValue","total","parseUserInput","trimmed","hhmm","twelve","HelixTimePicker","HelixElement","_a","key","changed","state","_mode","clamped","disabled","selectedIndex","s","active","slot","nodes","labelEl","n","target","index","options","hasError","fieldClasses","activeDescendant","placeholder","describedBy","html","classMap","nothing","live","ifDefined","repeat","isSelected","isActive","__decorateClass","property","query","customElement"],"mappings":"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"}
@@ -1,8 +1,9 @@
1
- import { css as b, LitElement as g, html as u, nothing as d } from "lit";
1
+ import { css as b, html as u, nothing as d } from "lit";
2
2
  import "./document-token-adoption-DuYNKd4k.js";
3
- import { query as p, property as s, customElement as c } from "lit/decorators.js";
4
- import { classMap as f } from "lit/directives/class-map.js";
5
- const x = b`
3
+ import { query as g, property as s, customElement as c } from "lit/decorators.js";
4
+ import { classMap as p } from "lit/directives/class-map.js";
5
+ import { H as x } from "./helix-element-BJh1Ffvi.js";
6
+ const f = b`
6
7
  :host {
7
8
  display: inline-block;
8
9
  }
@@ -57,10 +58,13 @@ const x = b`
57
58
 
58
59
  /* ─── Size Variants ─── */
59
60
 
61
+ /* WCAG 2.5.5 (healthcare mandate): minimum 44px touch target for sm variant.
62
+ min-height uses --hx-touch-target-min to guarantee the interactive area
63
+ meets the threshold even though the visual size token is smaller. */
60
64
  .button--sm {
61
65
  padding: var(--hx-space-1, 0.25rem) var(--hx-space-3, 0.75rem);
62
66
  font-size: var(--hx-font-size-sm, 0.875rem);
63
- min-height: var(--hx-size-8, 2rem);
67
+ min-height: var(--hx-touch-target-min, 2.75rem);
64
68
  }
65
69
 
66
70
  .button--md {
@@ -209,21 +213,51 @@ const x = b`
209
213
  transition: none;
210
214
  }
211
215
  }
216
+
217
+ /* ─── High Contrast Mode (forced-colors) ─── */
218
+
219
+ @media (forced-colors: active) {
220
+ .button {
221
+ forced-color-adjust: none;
222
+ background-color: ButtonFace;
223
+ color: ButtonText;
224
+ border: 2px solid ButtonText;
225
+ }
226
+
227
+ .button:focus-visible {
228
+ outline: 3px solid Highlight;
229
+ outline-offset: 2px;
230
+ }
231
+
232
+ .button--pressed {
233
+ background-color: Highlight;
234
+ color: HighlightText;
235
+ border-color: Highlight;
236
+ box-shadow: none;
237
+ }
238
+
239
+ .button[disabled] {
240
+ background-color: ButtonFace;
241
+ color: GrayText;
242
+ border-color: GrayText;
243
+ opacity: 1;
244
+ }
245
+
246
+ :host([disabled]) {
247
+ opacity: 1;
248
+ }
249
+ }
212
250
  `;
213
- var v = Object.defineProperty, m = Object.getOwnPropertyDescriptor, o = (t, a, l, n) => {
214
- for (var r = n > 1 ? void 0 : n ? m(a, l) : a, i = t.length - 1, h; i >= 0; i--)
215
- (h = t[i]) && (r = (n ? h(a, l, r) : h(r)) || r);
216
- return n && r && v(a, l, r), r;
251
+ var v = Object.defineProperty, m = Object.getOwnPropertyDescriptor, r = (t, a, l, n) => {
252
+ for (var o = n > 1 ? void 0 : n ? m(a, l) : a, i = t.length - 1, h; i >= 0; i--)
253
+ (h = t[i]) && (o = (n ? h(a, l, o) : h(o)) || o);
254
+ return n && o && v(a, l, o), o;
217
255
  };
218
- let e = class extends g {
256
+ let e = class extends x {
219
257
  constructor() {
220
- super(), this.pressed = !1, this.variant = "secondary", this.size = "md", this.disabled = !1, this.name = void 0, this.value = void 0, this.label = void 0, this.required = !1, this._internals = this.attachInternals();
258
+ super(...arguments), this.pressed = !1, this.variant = "secondary", this.size = "md", this.disabled = !1, this.name = void 0, this.value = void 0, this.label = void 0, this.required = !1;
221
259
  }
222
260
  // ─── Form API ───
223
- /** Returns the associated form element, if any. */
224
- get form() {
225
- return this._internals.form;
226
- }
227
261
  /** Returns the ValidityState object. */
228
262
  get validity() {
229
263
  return this._internals.validity;
@@ -245,8 +279,8 @@ let e = class extends g {
245
279
  if (super.firstUpdated(t), !this.label) {
246
280
  const a = this._defaultSlot;
247
281
  (a ? a.assignedNodes({ flatten: !0 }).some((n) => {
248
- var r;
249
- return (r = n.textContent) == null ? void 0 : r.trim();
282
+ var o;
283
+ return (o = n.textContent) == null ? void 0 : o.trim();
250
284
  }) : !1) || console.warn(
251
285
  "[hx-toggle-button] No accessible label found. Set the `label` attribute or provide slot text content for WCAG 4.1.2 compliance."
252
286
  );
@@ -255,16 +289,13 @@ let e = class extends g {
255
289
  updated(t) {
256
290
  super.updated(t), (t.has("pressed") || t.has("value") || t.has("required")) && this._syncFormValue();
257
291
  }
258
- /** @internal */
259
- formResetCallback() {
292
+ _onFormReset() {
260
293
  this.pressed = !1;
261
294
  }
262
- /** @internal */
263
- formStateRestoreCallback(t, a) {
295
+ _onFormStateRestore(t, a) {
264
296
  this.pressed = typeof t == "string" && t === "pressed";
265
297
  }
266
- /** @internal */
267
- formDisabledCallback(t) {
298
+ _onFormDisabled(t) {
268
299
  this.disabled = t;
269
300
  }
270
301
  // ─── Private Helpers ───
@@ -322,7 +353,7 @@ let e = class extends g {
322
353
  return u`
323
354
  <button
324
355
  part="button"
325
- class=${f(t)}
356
+ class=${p(t)}
326
357
  ?disabled=${this.disabled}
327
358
  type="button"
328
359
  aria-pressed=${this.pressed ? "true" : "false"}
@@ -334,39 +365,39 @@ let e = class extends g {
334
365
  `;
335
366
  }
336
367
  };
337
- e.styles = [x];
368
+ e.styles = [f];
338
369
  e.formAssociated = !0;
339
- o([
340
- p("slot:not([name])")
370
+ r([
371
+ g("slot:not([name])")
341
372
  ], e.prototype, "_defaultSlot", 2);
342
- o([
373
+ r([
343
374
  s({ type: Boolean, reflect: !0 })
344
375
  ], e.prototype, "pressed", 2);
345
- o([
376
+ r([
346
377
  s({ type: String, reflect: !0 })
347
378
  ], e.prototype, "variant", 2);
348
- o([
379
+ r([
349
380
  s({ type: String, reflect: !0, attribute: "hx-size" })
350
381
  ], e.prototype, "size", 2);
351
- o([
382
+ r([
352
383
  s({ type: Boolean, reflect: !0 })
353
384
  ], e.prototype, "disabled", 2);
354
- o([
385
+ r([
355
386
  s({ type: String })
356
387
  ], e.prototype, "name", 2);
357
- o([
388
+ r([
358
389
  s({ type: String })
359
390
  ], e.prototype, "value", 2);
360
- o([
391
+ r([
361
392
  s({ type: String })
362
393
  ], e.prototype, "label", 2);
363
- o([
394
+ r([
364
395
  s({ type: Boolean, reflect: !0 })
365
396
  ], e.prototype, "required", 2);
366
- e = o([
397
+ e = r([
367
398
  c("hx-toggle-button")
368
399
  ], e);
369
400
  export {
370
401
  e as H
371
402
  };
372
- //# sourceMappingURL=hx-toggle-button-BZUQUULm.js.map
403
+ //# sourceMappingURL=hx-toggle-button-ClyNYNVI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hx-toggle-button-ClyNYNVI.js","sources":["../../src/components/hx-toggle-button/hx-toggle-button.styles.ts","../../src/components/hx-toggle-button/hx-toggle-button.ts"],"sourcesContent":["import { css } from 'lit';\n\nexport const helixToggleButtonStyles = css`\n :host {\n display: inline-block;\n }\n\n :host([disabled]) {\n pointer-events: none;\n opacity: var(--hx-opacity-disabled, 0.5);\n }\n\n /* ─── Base Button ─── */\n\n .button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--hx-space-2, 0.5rem);\n border: var(--hx-border-width-thin, 1px) solid var(--hx-toggle-button-border-color, transparent);\n border-radius: var(--hx-toggle-button-border-radius, var(--hx-border-radius-md, 0.375rem));\n background-color: var(--hx-toggle-button-bg, var(--hx-color-primary-500, #2563eb));\n color: var(--hx-toggle-button-color, var(--hx-color-neutral-0, #ffffff));\n font-family: var(--hx-toggle-button-font-family, var(--hx-font-family-sans, sans-serif));\n font-weight: var(--hx-toggle-button-font-weight, var(--hx-font-weight-semibold, 600));\n line-height: var(--hx-line-height-tight, 1.25);\n cursor: pointer;\n transition:\n background-color var(--hx-transition-fast, 150ms ease),\n color var(--hx-transition-fast, 150ms ease),\n border-color var(--hx-transition-fast, 150ms ease),\n box-shadow var(--hx-transition-fast, 150ms ease);\n text-decoration: none;\n white-space: nowrap;\n user-select: none;\n -webkit-user-select: none;\n }\n\n .button:focus-visible {\n outline: var(--hx-focus-ring-width, 2px) solid\n var(\n --hx-toggle-button-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 .button:hover {\n filter: brightness(var(--hx-filter-brightness-hover, 0.9));\n }\n\n .button:active {\n filter: brightness(var(--hx-filter-brightness-active, 0.8));\n }\n\n /* ─── Size Variants ─── */\n\n /* WCAG 2.5.5 (healthcare mandate): minimum 44px touch target for sm variant.\n min-height uses --hx-touch-target-min to guarantee the interactive area\n meets the threshold even though the visual size token is smaller. */\n .button--sm {\n padding: var(--hx-space-1, 0.25rem) var(--hx-space-3, 0.75rem);\n font-size: var(--hx-font-size-sm, 0.875rem);\n min-height: var(--hx-touch-target-min, 2.75rem);\n }\n\n .button--md {\n padding: var(--hx-space-2, 0.5rem) var(--hx-space-4, 1rem);\n font-size: var(--hx-font-size-md, 1rem);\n min-height: var(--hx-size-10, 2.5rem);\n }\n\n .button--lg {\n padding: var(--hx-space-3, 0.75rem) var(--hx-space-6, 1.5rem);\n font-size: var(--hx-font-size-lg, 1.125rem);\n min-height: var(--hx-size-12, 3rem);\n }\n\n /* ─── Style Variants ─── */\n\n .button--primary {\n --hx-toggle-button-bg: var(--hx-color-primary-500, #2563eb);\n --hx-toggle-button-color: var(--hx-color-neutral-0, #ffffff);\n --hx-toggle-button-border-color: transparent;\n }\n\n .button--secondary {\n --hx-toggle-button-bg: transparent;\n --hx-toggle-button-color: var(--hx-color-primary-500, #2563eb);\n --hx-toggle-button-border-color: var(--hx-color-primary-500, #2563eb);\n }\n\n .button--secondary:hover {\n --hx-toggle-button-bg: var(--hx-color-primary-50, #eff6ff);\n }\n\n .button--tertiary {\n --hx-toggle-button-bg: var(--hx-color-neutral-100, #f1f5f9);\n --hx-toggle-button-color: var(--hx-color-neutral-900, #0f172a);\n --hx-toggle-button-border-color: transparent;\n }\n\n .button--tertiary:hover {\n --hx-toggle-button-bg: var(--hx-color-neutral-200, #e2e8f0);\n }\n\n .button--ghost {\n --hx-toggle-button-bg: transparent;\n --hx-toggle-button-color: var(--hx-color-primary-500, #2563eb);\n --hx-toggle-button-border-color: transparent;\n }\n\n .button--ghost:hover {\n --hx-toggle-button-bg: var(--hx-color-neutral-100, #f1f5f9);\n }\n\n .button--outline {\n --hx-toggle-button-bg: transparent;\n --hx-toggle-button-color: var(--hx-color-neutral-900, #0f172a);\n --hx-toggle-button-border-color: var(--hx-color-neutral-300, #cbd5e1);\n }\n\n .button--outline:hover {\n --hx-toggle-button-bg: var(--hx-color-neutral-50, #f8fafc);\n }\n\n /* ─── Pressed State ─── */\n\n /*\n * Primary: already uses solid primary bg; pressed deepens to primary-700\n * to give clear visual feedback without introducing a new color.\n */\n .button--primary.button--pressed {\n --hx-toggle-button-bg: var(--hx-toggle-button-pressed-bg, var(--hx-color-primary-700, #1d4ed8));\n --hx-toggle-button-color: var(\n --hx-toggle-button-pressed-color,\n var(--hx-color-neutral-0, #ffffff)\n );\n --hx-toggle-button-border-color: transparent;\n }\n\n /*\n * Secondary: unpressed is outlined/transparent; pressed fills with primary bg\n * so the state change is immediately legible.\n */\n .button--secondary.button--pressed {\n --hx-toggle-button-bg: var(--hx-toggle-button-pressed-bg, var(--hx-color-primary-500, #2563eb));\n --hx-toggle-button-color: var(\n --hx-toggle-button-pressed-color,\n var(--hx-color-neutral-0, #ffffff)\n );\n --hx-toggle-button-border-color: var(--hx-color-primary-500, #2563eb);\n }\n\n /* Tertiary pressed: use primary-100 bg + primary-700 text + border for WCAG 3:1 non-text contrast. */\n .button--tertiary.button--pressed {\n --hx-toggle-button-bg: var(--hx-toggle-button-pressed-bg, var(--hx-color-primary-100, #dbeafe));\n --hx-toggle-button-color: var(\n --hx-toggle-button-pressed-color,\n var(--hx-color-primary-700, #1d4ed8)\n );\n --hx-toggle-button-border-color: var(--hx-color-primary-400, #60a5fa);\n box-shadow: inset 0 0 0 1px var(--hx-color-primary-400, #60a5fa);\n }\n\n /* Ghost pressed: subtle neutral fill, matching hover behavior as a baseline. */\n .button--ghost.button--pressed {\n --hx-toggle-button-bg: var(--hx-toggle-button-pressed-bg, var(--hx-color-primary-100, #dbeafe));\n --hx-toggle-button-color: var(\n --hx-toggle-button-pressed-color,\n var(--hx-color-primary-700, #1d4ed8)\n );\n --hx-toggle-button-border-color: transparent;\n }\n\n /* Outline pressed: fills with a neutral tint, darkens the border, and adds an inset shadow for WCAG 3:1 non-text contrast. */\n .button--outline.button--pressed {\n --hx-toggle-button-bg: var(--hx-toggle-button-pressed-bg, var(--hx-color-neutral-100, #f1f5f9));\n --hx-toggle-button-color: var(\n --hx-toggle-button-pressed-color,\n var(--hx-color-neutral-900, #0f172a)\n );\n --hx-toggle-button-border-color: var(--hx-color-neutral-500, #64748b);\n box-shadow: inset 0 0 0 1px var(--hx-color-neutral-500, #64748b);\n }\n\n /* ─── Disabled ─── */\n\n .button[disabled] {\n cursor: not-allowed;\n }\n\n /* ─── Prefix / Suffix / Label ─── */\n\n .button__prefix,\n .button__suffix {\n display: inline-flex;\n align-items: center;\n flex-shrink: 0;\n }\n\n .button__label {\n flex: 1 1 auto;\n }\n\n /* ─── Reduced Motion ─── */\n\n @media (prefers-reduced-motion: reduce) {\n .button {\n transition: none;\n }\n }\n\n /* ─── High Contrast Mode (forced-colors) ─── */\n\n @media (forced-colors: active) {\n .button {\n forced-color-adjust: none;\n background-color: ButtonFace;\n color: ButtonText;\n border: 2px solid ButtonText;\n }\n\n .button:focus-visible {\n outline: 3px solid Highlight;\n outline-offset: 2px;\n }\n\n .button--pressed {\n background-color: Highlight;\n color: HighlightText;\n border-color: Highlight;\n box-shadow: none;\n }\n\n .button[disabled] {\n background-color: ButtonFace;\n color: GrayText;\n border-color: GrayText;\n opacity: 1;\n }\n\n :host([disabled]) {\n opacity: 1;\n }\n }\n`;\n","import { html, nothing, type PropertyValues } from 'lit';\nimport '../../utilities/document-token-adoption.js';\nimport { customElement, property, query } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { HelixElement } from '../../base/index.js';\nimport { helixToggleButtonStyles } from './hx-toggle-button.styles.js';\n\n/**\n * A two-state toggle button that communicates a pressed/unpressed status to\n * assistive technology via `aria-pressed`. Supports multiple visual variants\n * and sizes, prefix/suffix slots, full ElementInternals form association, and\n * a distinct pressed visual state for every variant.\n *\n * @summary Two-state toggle button with pressed/unpressed ARIA semantics.\n *\n * @tag hx-toggle-button\n *\n * @slot - Default slot for the button 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 * @fires {CustomEvent<{pressed: boolean}>} hx-toggle - Dispatched when the\n * toggle state changes. Not dispatched when the button is disabled.\n *\n * @csspart button - The native `<button>` element.\n * @csspart label - The label text wrapper span.\n * @csspart prefix - The prefix slot container span.\n * @csspart suffix - The suffix slot container span.\n *\n * @cssprop [--hx-toggle-button-bg=var(--hx-color-primary-500)] - Button background color.\n * @cssprop [--hx-toggle-button-color=var(--hx-color-neutral-0)] - Button text color.\n * @cssprop [--hx-toggle-button-border-color=transparent] - Button border color.\n * @cssprop [--hx-toggle-button-border-radius=var(--hx-border-radius-md)] - Button border radius.\n * @cssprop [--hx-toggle-button-font-family=var(--hx-font-family-sans)] - Button font family.\n * @cssprop [--hx-toggle-button-font-weight=var(--hx-font-weight-semibold)] - Button font weight.\n * @cssprop [--hx-toggle-button-focus-ring-color=var(--hx-focus-ring-color)] - Focus ring color.\n * @cssprop [--hx-toggle-button-pressed-bg=var(--hx-color-primary-500)] - Background when pressed (variant-specific fallback applies).\n * @cssprop [--hx-toggle-button-pressed-color=var(--hx-color-neutral-0)] - Text color when pressed (variant-specific fallback applies).\n */\n@customElement('hx-toggle-button')\nexport class HelixToggleButton extends HelixElement {\n static override styles = [helixToggleButtonStyles];\n\n // ─── Form Association ───\n\n /** @internal */\n static override formAssociated = true;\n\n /** @internal */\n @query('slot:not([name])') private _defaultSlot!: HTMLSlotElement | null;\n\n // ─── Public Properties ───\n\n /**\n * Whether the toggle button is in the pressed state.\n * Reflected as an attribute so CSS selectors like `:host([pressed])` work.\n * @attr pressed\n */\n @property({ type: Boolean, reflect: true })\n pressed = false;\n\n /**\n * Visual style variant of the button.\n * @attr variant\n */\n @property({ type: String, reflect: true })\n variant: 'primary' | 'secondary' | 'tertiary' | 'ghost' | 'outline' = 'secondary';\n\n /**\n * Size of the button.\n * @attr hx-size\n */\n @property({ type: String, reflect: true, attribute: 'hx-size' })\n size: 'sm' | 'md' | 'lg' = 'md';\n\n /**\n * Whether the button is disabled. Prevents all interaction and form actions.\n * @attr disabled\n */\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n /**\n * Form field name submitted via ElementInternals when the button is pressed.\n * @attr name\n */\n @property({ type: String })\n name: string | undefined = undefined;\n\n /**\n * Form field value submitted via ElementInternals when the button is pressed.\n * @attr value\n */\n @property({ type: String })\n value: string | undefined = undefined;\n\n /**\n * Accessible label forwarded to the inner `<button>` as `aria-label`.\n * Required for icon-only toggle buttons where no visible text is present.\n * @attr label\n */\n @property({ type: String })\n label: string | undefined = undefined;\n\n /**\n * When true, the button must be in the pressed state for the form to be submitted.\n * @attr required\n */\n @property({ type: Boolean, reflect: true })\n required = false;\n\n // ─── Form API ───\n\n /** Returns the ValidityState object. */\n override get validity(): ValidityState {\n return this._internals.validity;\n }\n\n /** Returns the current validation message. */\n override get validationMessage(): string {\n return this._internals.validationMessage;\n }\n\n /** Checks whether the button 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 // ─── Lifecycle ───\n\n override firstUpdated(changedProperties: PropertyValues<this>): void {\n super.firstUpdated(changedProperties);\n\n if (!this.label) {\n const slot = this._defaultSlot;\n const hasSlotText = slot\n ? slot.assignedNodes({ flatten: true }).some((n) => n.textContent?.trim())\n : false;\n if (!hasSlotText) {\n console.warn(\n '[hx-toggle-button] No accessible label found. Set the `label` attribute or provide slot text content for WCAG 4.1.2 compliance.',\n );\n }\n }\n }\n\n override updated(changedProperties: PropertyValues<this>): void {\n super.updated(changedProperties);\n\n if (\n changedProperties.has('pressed') ||\n changedProperties.has('value') ||\n changedProperties.has('required')\n ) {\n this._syncFormValue();\n }\n }\n\n protected override _onFormReset(): void {\n this.pressed = false;\n }\n\n protected override _onFormStateRestore(\n state: string | File | FormData | null,\n _mode: 'restore' | 'autocomplete',\n ): void {\n this.pressed = typeof state === 'string' && state === 'pressed';\n }\n\n protected override _onFormDisabled(disabled: boolean): void {\n this.disabled = disabled;\n }\n\n // ─── Private Helpers ───\n\n /** @internal */\n private _syncFormValue(): void {\n if (this.pressed && this.value !== undefined) {\n // Pass explicit state 'pressed' so formStateRestoreCallback can reliably detect it.\n this._internals.setFormValue(this.value, 'pressed');\n } else {\n this._internals.setFormValue(null);\n }\n this._updateValidity();\n }\n\n /** @internal */\n private _updateValidity(): void {\n if (this.required && !this.pressed) {\n this._internals.setValidity(\n { valueMissing: true },\n 'Please activate this toggle button.',\n this.shadowRoot?.querySelector<HTMLElement>('[part=\"button\"]') ?? undefined,\n );\n } else {\n this._internals.setValidity({});\n }\n }\n\n // ─── Event Handling ───\n\n /** @internal */\n private _handleClick(e: MouseEvent): void {\n if (this.disabled) {\n e.preventDefault();\n e.stopPropagation();\n return;\n }\n\n this.pressed = !this.pressed;\n this._syncFormValue();\n\n /**\n * Dispatched when the toggle state changes.\n * @event hx-toggle\n */\n this.dispatchEvent(\n new CustomEvent<{ pressed: boolean }>('hx-toggle', {\n bubbles: true,\n composed: true,\n detail: { pressed: this.pressed },\n }),\n );\n }\n\n // ─── Render Helpers ───\n\n /** @internal */\n private _renderInner() {\n return html`\n <span part=\"prefix\" class=\"button__prefix\">\n <slot name=\"prefix\"></slot>\n </span>\n <span part=\"label\" class=\"button__label\">\n <slot></slot>\n </span>\n <span part=\"suffix\" class=\"button__suffix\">\n <slot name=\"suffix\"></slot>\n </span>\n `;\n }\n\n // ─── Render ───\n\n override render() {\n const classes = {\n button: true,\n [`button--${this.variant}`]: true,\n [`button--${this.size}`]: true,\n 'button--pressed': this.pressed,\n };\n\n return html`\n <button\n part=\"button\"\n class=${classMap(classes)}\n ?disabled=${this.disabled}\n type=\"button\"\n aria-pressed=${this.pressed ? 'true' : 'false'}\n aria-label=${this.label ?? nothing}\n @click=${this._handleClick}\n >\n ${this._renderInner()}\n </button>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'hx-toggle-button': HelixToggleButton;\n }\n}\n"],"names":["helixToggleButtonStyles","css","HelixToggleButton","HelixElement","changedProperties","slot","_a","state","_mode","disabled","e","html","classes","classMap","nothing","__decorateClass","query","property","customElement"],"mappings":";;;;;AAEO,MAAMA,IAA0BC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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"}
@@ -1,8 +1,9 @@
1
1
  import { css as u, LitElement as _, html as v } from "lit";
2
2
  import "./document-token-adoption-DuYNKd4k.js";
3
- import { property as d, state as g, query as p, customElement as f } from "lit/decorators.js";
4
- import { computePosition as x, offset as y, flip as b, shift as w, arrow as T } from "@floating-ui/dom";
5
- const D = u`
3
+ import { property as d, state as g, query as p, customElement as x } from "lit/decorators.js";
4
+ import { computePosition as f, offset as y, flip as b, shift as w, arrow as T } from "@floating-ui/dom";
5
+ import { c as D } from "./id-counter-PTgF-zcG.js";
6
+ const E = u`
6
7
  :host {
7
8
  display: inline-block;
8
9
  }
@@ -53,15 +54,28 @@ const D = u`
53
54
  transition: none;
54
55
  }
55
56
  }
57
+
58
+ /* ─── Forced Colors (Windows High Contrast) ─── */
59
+
60
+ @media (forced-colors: active) {
61
+ [part='tooltip'] {
62
+ border: 1px solid CanvasText;
63
+ }
64
+
65
+ [part='arrow'] {
66
+ border: 1px solid CanvasText;
67
+ }
68
+ }
56
69
  `;
57
- var E = Object.defineProperty, $ = Object.getOwnPropertyDescriptor, r = (t, e, i, l) => {
58
- for (var s = l > 1 ? void 0 : l ? $(e, i) : e, n = t.length - 1, h; n >= 0; n--)
59
- (h = t[n]) && (s = (l ? h(e, i, s) : h(s)) || s);
60
- return l && s && E(e, i, s), s;
70
+ var $ = Object.defineProperty, C = Object.getOwnPropertyDescriptor, r = (t, e, i, a) => {
71
+ for (var s = a > 1 ? void 0 : a ? C(e, i) : e, n = t.length - 1, h; n >= 0; n--)
72
+ (h = t[n]) && (s = (a ? h(e, i, s) : h(s)) || s);
73
+ return a && s && $(e, i, s), s;
61
74
  };
62
- let S = 0, o = class extends _ {
75
+ const S = D("hx-tooltip");
76
+ let o = class extends _ {
63
77
  constructor() {
64
- super(...arguments), this.placement = "top", this.showDelay = 300, this.hideDelay = 100, this._visible = !1, this._showTimer = null, this._hideTimer = null, this._tooltipId = `hx-tooltip-${++S}`, this._lightDomDescription = null, this._handleKeydown = (t) => {
78
+ super(...arguments), this.placement = "top", this.showDelay = 300, this.hideDelay = 100, this._visible = !1, this._showTimer = null, this._hideTimer = null, this._tooltipId = S(), this._lightDomDescription = null, this._handleKeydown = (t) => {
65
79
  t instanceof KeyboardEvent && t.key === "Escape" && this._visible && (this._clearTimers(), this._hide());
66
80
  };
67
81
  }
@@ -81,8 +95,8 @@ let S = 0, o = class extends _ {
81
95
  _setupTriggerAria() {
82
96
  const t = this._defaultSlot;
83
97
  if (!t) return;
84
- const e = t.assignedElements()[0], i = this._contentSlot, l = (i == null ? void 0 : i.assignedElements().map((s) => s.textContent).join(" ").trim()) ?? "";
85
- !this._lightDomDescription && typeof document < "u" && (this._lightDomDescription = document.createElement("span"), this._lightDomDescription.id = this._tooltipId, this._lightDomDescription.style.cssText = "position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0", this.appendChild(this._lightDomDescription)), this._lightDomDescription && (this._lightDomDescription.textContent = l), e && e.setAttribute("aria-describedby", this._tooltipId);
98
+ const e = t.assignedElements()[0], i = this._contentSlot, a = (i == null ? void 0 : i.assignedElements().map((s) => s.textContent).join(" ").trim()) ?? "";
99
+ !this._lightDomDescription && typeof document < "u" && (this._lightDomDescription = document.createElement("span"), this._lightDomDescription.id = this._tooltipId, this._lightDomDescription.style.cssText = "position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0", this.appendChild(this._lightDomDescription)), this._lightDomDescription && (this._lightDomDescription.textContent = a), e && e.setAttribute("aria-describedby", this._tooltipId);
86
100
  }
87
101
  // ─── Show/Hide ───
88
102
  /** @internal */
@@ -114,24 +128,24 @@ let S = 0, o = class extends _ {
114
128
  async _updatePosition() {
115
129
  const t = this._triggerWrapper, e = this._tooltipEl, i = this._arrowEl;
116
130
  if (!t || !e || !i) return;
117
- const { x: l, y: s, placement: n, middlewareData: h } = await x(t, e, {
131
+ const { x: a, y: s, placement: n, middlewareData: h } = await f(t, e, {
118
132
  placement: this.placement,
119
133
  strategy: "fixed",
120
134
  middleware: [y(8), b(), w({ padding: 8 }), T({ element: i })]
121
135
  });
122
136
  Object.assign(e.style, {
123
- left: `${l}px`,
137
+ left: `${a}px`,
124
138
  top: `${s}px`
125
139
  });
126
- const a = h.arrow, c = n.split("-")[0] ?? "top", m = {
140
+ const l = h.arrow, c = n.split("-")[0] ?? "top", m = {
127
141
  top: "bottom",
128
142
  right: "left",
129
143
  bottom: "top",
130
144
  left: "right"
131
145
  }[c] ?? "bottom";
132
146
  Object.assign(i.style, {
133
- left: (a == null ? void 0 : a.x) != null ? `${a.x}px` : "",
134
- top: (a == null ? void 0 : a.y) != null ? `${a.y}px` : "",
147
+ left: (l == null ? void 0 : l.x) != null ? `${l.x}px` : "",
148
+ top: (l == null ? void 0 : l.y) != null ? `${l.y}px` : "",
135
149
  right: "",
136
150
  bottom: "",
137
151
  [m]: `${-(i.offsetWidth / 2)}px`
@@ -175,7 +189,7 @@ let S = 0, o = class extends _ {
175
189
  `;
176
190
  }
177
191
  };
178
- o.styles = [D];
192
+ o.styles = [E];
179
193
  r([
180
194
  d({ type: String, reflect: !0 })
181
195
  ], o.prototype, "placement", 2);
@@ -204,9 +218,9 @@ r([
204
218
  p('[part="arrow"]')
205
219
  ], o.prototype, "_arrowEl", 2);
206
220
  o = r([
207
- f("hx-tooltip")
221
+ x("hx-tooltip")
208
222
  ], o);
209
223
  export {
210
224
  o as H
211
225
  };
212
- //# sourceMappingURL=hx-tooltip-Ny4i1Idj.js.map
226
+ //# sourceMappingURL=hx-tooltip-ByWT987R.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hx-tooltip-ByWT987R.js","sources":["../../src/components/hx-tooltip/hx-tooltip.styles.ts","../../src/components/hx-tooltip/hx-tooltip.ts"],"sourcesContent":["import { css } from 'lit';\n\nexport const helixTooltipStyles = css`\n :host {\n display: inline-block;\n }\n\n .trigger-wrapper {\n display: inline-block;\n }\n\n [part='tooltip'] {\n position: fixed;\n z-index: var(--hx-tooltip-z-index, var(--hx-z-index-tooltip, 1600));\n max-width: var(--hx-tooltip-max-width, 280px);\n padding: var(--hx-tooltip-padding, var(--hx-space-1, 0.25rem) var(--hx-space-2, 0.5rem));\n background: var(--hx-tooltip-bg, var(--hx-color-neutral-900, #111827));\n color: var(--hx-tooltip-color, var(--hx-color-neutral-50, #f9fafb));\n font-family: var(--hx-font-family-sans, sans-serif);\n font-size: var(--hx-tooltip-font-size, var(--hx-font-size-xs, 0.75rem));\n line-height: var(--hx-line-height-normal, 1.5);\n border-radius: var(--hx-tooltip-border-radius, var(--hx-border-radius-sm, 0.25rem));\n box-shadow: var(\n --hx-tooltip-shadow,\n var(--hx-shadow-sm, 0 2px 8px var(--hx-overlay-black-20, rgba(0, 0, 0, 0.2)))\n );\n visibility: hidden;\n opacity: 0;\n transition:\n opacity var(--hx-tooltip-transition-duration, var(--hx-transition-fast, 150ms ease)),\n visibility var(--hx-tooltip-transition-duration, var(--hx-transition-fast, 150ms ease));\n overflow-wrap: break-word;\n }\n\n [part='tooltip'].visible {\n visibility: visible;\n opacity: 1;\n }\n\n [part='arrow'] {\n position: absolute;\n width: var(--hx-tooltip-arrow-size, 8px);\n height: var(--hx-tooltip-arrow-size, 8px);\n background: var(--hx-tooltip-bg, var(--hx-color-neutral-900, #111827));\n transform: rotate(45deg);\n pointer-events: none;\n }\n\n @media (prefers-reduced-motion: reduce) {\n [part='tooltip'] {\n transition: none;\n }\n }\n\n /* ─── Forced Colors (Windows High Contrast) ─── */\n\n @media (forced-colors: active) {\n [part='tooltip'] {\n border: 1px solid CanvasText;\n }\n\n [part='arrow'] {\n border: 1px solid CanvasText;\n }\n }\n`;\n","import { LitElement, html } from 'lit';\nimport '../../utilities/document-token-adoption.js';\nimport { customElement, property, query, state } from 'lit/decorators.js';\nimport { computePosition, flip, shift, offset, arrow } from '@floating-ui/dom';\nimport { createIdCounter } from '../../base/index.js';\nimport { helixTooltipStyles } from './hx-tooltip.styles.js';\n\nconst _nextTooltipId = createIdCounter('hx-tooltip');\n\n/**\n * A tooltip that displays contextual help text on hover or focus.\n *\n * @summary Contextual help text and abbreviations with smart positioning.\n *\n * @tag hx-tooltip\n *\n * @slot - Default slot for the trigger element.\n * @slot content - Tooltip content to display.\n *\n * @csspart tooltip - The tooltip container element.\n * @csspart arrow - The arrow indicator element.\n *\n * @cssprop [--hx-tooltip-bg=var(--hx-color-neutral-900)] - Tooltip background color.\n * @cssprop [--hx-tooltip-color=var(--hx-color-neutral-50)] - Tooltip text color.\n * @cssprop [--hx-tooltip-font-size=var(--hx-font-size-xs)] - Tooltip font size.\n * @cssprop [--hx-tooltip-max-width=280px] - Maximum tooltip width.\n * @cssprop [--hx-tooltip-padding] - Tooltip padding.\n * @cssprop [--hx-tooltip-border-radius=var(--hx-border-radius-sm)] - Tooltip border radius.\n * @cssprop [--hx-tooltip-shadow] - Tooltip box shadow.\n * @cssprop [--hx-tooltip-z-index=9999] - Tooltip z-index.\n * @cssprop [--hx-tooltip-transition-duration=0.15s] - Show/hide transition duration.\n * @cssprop [--hx-tooltip-arrow-size=8px] - Size of the arrow indicator.\n *\n * @example\n * ```html\n * <hx-tooltip>\n * <button>Hover me</button>\n * <span slot=\"content\">Helpful context here</span>\n * </hx-tooltip>\n * ```\n *\n * @example Drupal/Twig usage\n * ```twig\n * <hx-tooltip>\n * <button type=\"button\">{{ trigger_label }}</button>\n * <span slot=\"content\">{{ tooltip_text }}</span>\n * </hx-tooltip>\n * ```\n */\n\n@customElement('hx-tooltip')\nexport class HelixTooltip extends LitElement {\n static override styles = [helixTooltipStyles];\n\n /**\n * Preferred placement of the tooltip relative to the trigger.\n * Supports all Floating UI placement values including alignment variants\n * (e.g. 'top-start', 'bottom-end') and 'auto'.\n * @attr placement\n */\n @property({ type: String, reflect: true })\n placement:\n | 'top'\n | 'top-start'\n | 'top-end'\n | 'right'\n | 'right-start'\n | 'right-end'\n | 'bottom'\n | 'bottom-start'\n | 'bottom-end'\n | 'left'\n | 'left-start'\n | 'left-end' = 'top';\n\n /**\n * Delay in milliseconds before the tooltip is shown.\n * @attr show-delay\n */\n @property({ type: Number, attribute: 'show-delay' })\n showDelay = 300;\n\n /**\n * Delay in milliseconds before the tooltip is hidden.\n * @attr hide-delay\n */\n @property({ type: Number, attribute: 'hide-delay' })\n hideDelay = 100;\n\n /** @internal */\n @state() private _visible = false;\n\n /** @internal */\n private _showTimer: ReturnType<typeof setTimeout> | null = null;\n /** @internal */\n private _hideTimer: ReturnType<typeof setTimeout> | null = null;\n\n /** @internal */\n private readonly _tooltipId = _nextTooltipId();\n\n /** @internal */\n @query('slot:not([name])') private _defaultSlot!: HTMLSlotElement | null;\n /** @internal */\n @query('slot[name=\"content\"]') private _contentSlot!: HTMLSlotElement | null;\n /** @internal */\n @query('.trigger-wrapper') private _triggerWrapper!: HTMLElement | null;\n /** @internal */\n @query('[part=\"tooltip\"]') private _tooltipEl!: HTMLElement | null;\n /** @internal */\n @query('[part=\"arrow\"]') private _arrowEl!: HTMLElement | null;\n\n /**\n * Visually-hidden description element in light DOM.\n * Necessary because aria-describedby cannot cross Shadow DOM boundaries —\n * ARIA ID references are scoped to the element's root node. This element\n * lives in the document scope so the trigger's aria-describedby resolves correctly.\n * @internal\n */\n private _lightDomDescription: HTMLSpanElement | null = null;\n\n // ─── Lifecycle ───\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.addEventListener('keydown', this._handleKeydown);\n // Re-run ARIA setup on reconnection (firstUpdated does not re-run).\n // hasUpdated is true after the first update cycle completes.\n if (this.hasUpdated) {\n this._setupTriggerAria();\n }\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener('keydown', this._handleKeydown);\n this._clearTimers();\n this._lightDomDescription?.remove();\n this._lightDomDescription = null;\n }\n\n override firstUpdated(): void {\n this._setupTriggerAria();\n }\n\n // ─── ARIA setup ───\n\n /** @internal */\n private _setupTriggerAria(): void {\n const slot = this._defaultSlot;\n if (!slot) return;\n const trigger = slot.assignedElements()[0] as HTMLElement | undefined;\n\n // Sync content from the content slot into a visually-hidden light DOM element.\n // aria-describedby cannot cross Shadow DOM boundaries, so the referenced element\n // must live in the document scope (light DOM), not inside the shadow root.\n const contentSlot = this._contentSlot;\n const contentText =\n contentSlot\n ?.assignedElements()\n .map((el) => el.textContent)\n .join(' ')\n .trim() ?? '';\n\n // Guard for SSR — document is unavailable server-side\n if (!this._lightDomDescription && typeof document !== 'undefined') {\n this._lightDomDescription = document.createElement('span');\n this._lightDomDescription.id = this._tooltipId;\n // Visually hidden but accessible to screen readers via aria-describedby\n this._lightDomDescription.style.cssText =\n 'position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0';\n this.appendChild(this._lightDomDescription);\n }\n if (this._lightDomDescription) {\n this._lightDomDescription.textContent = contentText;\n }\n\n if (trigger) {\n trigger.setAttribute('aria-describedby', this._tooltipId);\n }\n }\n\n // ─── Show/Hide ───\n\n /** @internal */\n private _scheduleShow(): void {\n this._clearTimers();\n this._showTimer = setTimeout(() => {\n void this._show();\n }, this.showDelay);\n }\n\n /** @internal */\n private _scheduleHide(): void {\n this._clearTimers();\n this._hideTimer = setTimeout(() => {\n this._hide();\n }, this.hideDelay);\n }\n\n /** @internal */\n private async _show(): Promise<void> {\n this._visible = true;\n await this.updateComplete;\n await this._updatePosition();\n }\n\n /** @internal */\n private _hide(): void {\n this._visible = false;\n }\n\n /** @internal */\n private _clearTimers(): void {\n if (this._showTimer !== null) {\n clearTimeout(this._showTimer);\n this._showTimer = null;\n }\n if (this._hideTimer !== null) {\n clearTimeout(this._hideTimer);\n this._hideTimer = null;\n }\n }\n\n // ─── Positioning ───\n\n /** @internal */\n private async _updatePosition(): Promise<void> {\n const reference = this._triggerWrapper;\n const tooltipEl = this._tooltipEl;\n const arrowEl = this._arrowEl;\n\n if (!reference || !tooltipEl || !arrowEl) return;\n\n const { x, y, placement, middlewareData } = await computePosition(reference, tooltipEl, {\n placement: this.placement,\n strategy: 'fixed',\n middleware: [offset(8), flip(), shift({ padding: 8 }), arrow({ element: arrowEl })],\n });\n\n Object.assign(tooltipEl.style, {\n left: `${x}px`,\n top: `${y}px`,\n });\n\n const arrowData = middlewareData.arrow;\n const basePlacement = placement.split('-')[0] ?? 'top';\n const oppositeSide: Record<string, string> = {\n top: 'bottom',\n right: 'left',\n bottom: 'top',\n left: 'right',\n };\n const staticSide = oppositeSide[basePlacement] ?? 'bottom';\n\n // Offset is derived from the arrow element's actual size so that custom\n // --hx-tooltip-arrow-size values position the arrow correctly.\n Object.assign(arrowEl.style, {\n left: arrowData?.x != null ? `${arrowData.x}px` : '',\n top: arrowData?.y != null ? `${arrowData.y}px` : '',\n right: '',\n bottom: '',\n [staticSide]: `${-(arrowEl.offsetWidth / 2)}px`,\n });\n }\n\n // ─── Events ───\n\n /** @internal */\n private _handleKeydown = (e: Event): void => {\n if (!(e instanceof KeyboardEvent)) return;\n if (e.key === 'Escape' && this._visible) {\n this._clearTimers();\n this._hide();\n }\n };\n\n /**\n * Handle mouseleave on the trigger wrapper.\n * Does not schedule hide if keyboard focus is still on the trigger element,\n * preventing mixed keyboard+mouse interactions from dismissing the tooltip\n * while the user is still navigating by keyboard.\n * @internal\n */\n private _handleTriggerMouseleave(): void {\n const slot = this._defaultSlot;\n const trigger = slot?.assignedElements()[0] as HTMLElement | undefined;\n // Guard for SSR — document is unavailable server-side\n const active = typeof document !== 'undefined' ? document.activeElement : null;\n if (trigger && (trigger === active || trigger.contains(active))) {\n return;\n }\n this._scheduleHide();\n }\n\n // ─── Render ───\n\n override render() {\n return html`\n <div\n class=\"trigger-wrapper\"\n @mouseenter=${this._scheduleShow}\n @mouseleave=${this._handleTriggerMouseleave}\n @focusin=${this._scheduleShow}\n @focusout=${this._scheduleHide}\n >\n <slot @slotchange=${this._setupTriggerAria}></slot>\n </div>\n <div\n part=\"tooltip\"\n id=${this._tooltipId}\n role=\"tooltip\"\n aria-hidden=${String(!this._visible)}\n class=${this._visible ? 'visible' : ''}\n @mouseenter=${this._clearTimers}\n @mouseleave=${this._scheduleHide}\n >\n <slot name=\"content\" @slotchange=${this._setupTriggerAria}></slot>\n <div part=\"arrow\"></div>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'hx-tooltip': HelixTooltip;\n }\n}\n"],"names":["helixTooltipStyles","css","_nextTooltipId","createIdCounter","HelixTooltip","LitElement","e","_a","slot","trigger","contentSlot","contentText","el","reference","tooltipEl","arrowEl","x","y","placement","middlewareData","computePosition","offset","flip","shift","arrow","arrowData","basePlacement","staticSide","active","html","__decorateClass","property","state","query","customElement"],"mappings":";;;;;AAEO,MAAMA,IAAqBC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;ACKlC,MAAMC,IAAiBC,EAAgB,YAAY;AA4C5C,IAAMC,IAAN,cAA2BC,EAAW;AAAA,EAAtC,cAAA;AAAA,UAAA,GAAA,SAAA,GAUL,KAAA,YAYiB,OAOjB,KAAA,YAAY,KAOZ,KAAA,YAAY,KAGH,KAAQ,WAAW,IAG5B,KAAQ,aAAmD,MAE3D,KAAQ,aAAmD,MAG3D,KAAiB,aAAaH,EAAA,GAoB9B,KAAQ,uBAA+C,MAsJvD,KAAQ,iBAAiB,CAACI,MAAmB;AAC3C,MAAMA,aAAa,iBACfA,EAAE,QAAQ,YAAY,KAAK,aAC7B,KAAK,aAAA,GACL,KAAK,MAAA;AAAA,IAET;AAAA,EAAA;AAAA;AAAA,EAxJS,oBAA0B;AACjC,UAAM,kBAAA,GACN,KAAK,iBAAiB,WAAW,KAAK,cAAc,GAGhD,KAAK,cACP,KAAK,kBAAA;AAAA,EAET;AAAA,EAES,uBAA6B;;AACpC,UAAM,qBAAA,GACN,KAAK,oBAAoB,WAAW,KAAK,cAAc,GACvD,KAAK,aAAA,IACLC,IAAA,KAAK,yBAAL,QAAAA,EAA2B,UAC3B,KAAK,uBAAuB;AAAA,EAC9B;AAAA,EAES,eAAqB;AAC5B,SAAK,kBAAA;AAAA,EACP;AAAA;AAAA;AAAA,EAKQ,oBAA0B;AAChC,UAAMC,IAAO,KAAK;AAClB,QAAI,CAACA,EAAM;AACX,UAAMC,IAAUD,EAAK,iBAAA,EAAmB,CAAC,GAKnCE,IAAc,KAAK,cACnBC,KACJD,KAAA,gBAAAA,EACI,mBACD,IAAI,CAACE,MAAOA,EAAG,aACf,KAAK,KACL,WAAU;AAGf,IAAI,CAAC,KAAK,wBAAwB,OAAO,WAAa,QACpD,KAAK,uBAAuB,SAAS,cAAc,MAAM,GACzD,KAAK,qBAAqB,KAAK,KAAK,YAEpC,KAAK,qBAAqB,MAAM,UAC9B,+HACF,KAAK,YAAY,KAAK,oBAAoB,IAExC,KAAK,yBACP,KAAK,qBAAqB,cAAcD,IAGtCF,KACFA,EAAQ,aAAa,oBAAoB,KAAK,UAAU;AAAA,EAE5D;AAAA;AAAA;AAAA,EAKQ,gBAAsB;AAC5B,SAAK,aAAA,GACL,KAAK,aAAa,WAAW,MAAM;AACjC,MAAK,KAAK,MAAA;AAAA,IACZ,GAAG,KAAK,SAAS;AAAA,EACnB;AAAA;AAAA,EAGQ,gBAAsB;AAC5B,SAAK,aAAA,GACL,KAAK,aAAa,WAAW,MAAM;AACjC,WAAK,MAAA;AAAA,IACP,GAAG,KAAK,SAAS;AAAA,EACnB;AAAA;AAAA,EAGA,MAAc,QAAuB;AACnC,SAAK,WAAW,IAChB,MAAM,KAAK,gBACX,MAAM,KAAK,gBAAA;AAAA,EACb;AAAA;AAAA,EAGQ,QAAc;AACpB,SAAK,WAAW;AAAA,EAClB;AAAA;AAAA,EAGQ,eAAqB;AAC3B,IAAI,KAAK,eAAe,SACtB,aAAa,KAAK,UAAU,GAC5B,KAAK,aAAa,OAEhB,KAAK,eAAe,SACtB,aAAa,KAAK,UAAU,GAC5B,KAAK,aAAa;AAAA,EAEtB;AAAA;AAAA;AAAA,EAKA,MAAc,kBAAiC;AAC7C,UAAMI,IAAY,KAAK,iBACjBC,IAAY,KAAK,YACjBC,IAAU,KAAK;AAErB,QAAI,CAACF,KAAa,CAACC,KAAa,CAACC,EAAS;AAE1C,UAAM,EAAE,GAAAC,GAAG,GAAAC,GAAG,WAAAC,GAAW,gBAAAC,MAAmB,MAAMC,EAAgBP,GAAWC,GAAW;AAAA,MACtF,WAAW,KAAK;AAAA,MAChB,UAAU;AAAA,MACV,YAAY,CAACO,EAAO,CAAC,GAAGC,EAAA,GAAQC,EAAM,EAAE,SAAS,EAAA,CAAG,GAAGC,EAAM,EAAE,SAAST,EAAA,CAAS,CAAC;AAAA,IAAA,CACnF;AAED,WAAO,OAAOD,EAAU,OAAO;AAAA,MAC7B,MAAM,GAAGE,CAAC;AAAA,MACV,KAAK,GAAGC,CAAC;AAAA,IAAA,CACV;AAED,UAAMQ,IAAYN,EAAe,OAC3BO,IAAgBR,EAAU,MAAM,GAAG,EAAE,CAAC,KAAK,OAO3CS,IANuC;AAAA,MAC3C,KAAK;AAAA,MACL,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,MAAM;AAAA,IAAA,EAEwBD,CAAa,KAAK;AAIlD,WAAO,OAAOX,EAAQ,OAAO;AAAA,MAC3B,OAAMU,KAAA,gBAAAA,EAAW,MAAK,OAAO,GAAGA,EAAU,CAAC,OAAO;AAAA,MAClD,MAAKA,KAAA,gBAAAA,EAAW,MAAK,OAAO,GAAGA,EAAU,CAAC,OAAO;AAAA,MACjD,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,CAACE,CAAU,GAAG,GAAG,EAAEZ,EAAQ,cAAc,EAAE;AAAA,IAAA,CAC5C;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBQ,2BAAiC;AACvC,UAAMP,IAAO,KAAK,cACZC,IAAUD,KAAA,gBAAAA,EAAM,mBAAmB,IAEnCoB,IAAS,OAAO,WAAa,MAAc,SAAS,gBAAgB;AAC1E,IAAInB,MAAYA,MAAYmB,KAAUnB,EAAQ,SAASmB,CAAM,MAG7D,KAAK,cAAA;AAAA,EACP;AAAA;AAAA,EAIS,SAAS;AAChB,WAAOC;AAAA;AAAA;AAAA,sBAGW,KAAK,aAAa;AAAA,sBAClB,KAAK,wBAAwB;AAAA,mBAChC,KAAK,aAAa;AAAA,oBACjB,KAAK,aAAa;AAAA;AAAA,4BAEV,KAAK,iBAAiB;AAAA;AAAA;AAAA;AAAA,aAIrC,KAAK,UAAU;AAAA;AAAA,sBAEN,OAAO,CAAC,KAAK,QAAQ,CAAC;AAAA,gBAC5B,KAAK,WAAW,YAAY,EAAE;AAAA,sBACxB,KAAK,YAAY;AAAA,sBACjB,KAAK,aAAa;AAAA;AAAA,2CAEG,KAAK,iBAAiB;AAAA;AAAA;AAAA;AAAA,EAI/D;AACF;AA9QazB,EACK,SAAS,CAACJ,CAAkB;AAS5C8B,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,QAAQ,SAAS,IAAM;AAAA,GAT9B3B,EAUX,WAAA,aAAA,CAAA;AAmBA0B,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,QAAQ,WAAW,cAAc;AAAA,GA5BxC3B,EA6BX,WAAA,aAAA,CAAA;AAOA0B,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,QAAQ,WAAW,cAAc;AAAA,GAnCxC3B,EAoCX,WAAA,aAAA,CAAA;AAGiB0B,EAAA;AAAA,EAAhBE,EAAA;AAAM,GAvCI5B,EAuCM,WAAA,YAAA,CAAA;AAWkB0B,EAAA;AAAA,EAAlCG,EAAM,kBAAkB;AAAA,GAlDd7B,EAkDwB,WAAA,gBAAA,CAAA;AAEI0B,EAAA;AAAA,EAAtCG,EAAM,sBAAsB;AAAA,GApDlB7B,EAoD4B,WAAA,gBAAA,CAAA;AAEJ0B,EAAA;AAAA,EAAlCG,EAAM,kBAAkB;AAAA,GAtDd7B,EAsDwB,WAAA,mBAAA,CAAA;AAEA0B,EAAA;AAAA,EAAlCG,EAAM,kBAAkB;AAAA,GAxDd7B,EAwDwB,WAAA,cAAA,CAAA;AAEF0B,EAAA;AAAA,EAAhCG,EAAM,gBAAgB;AAAA,GA1DZ7B,EA0DsB,WAAA,YAAA,CAAA;AA1DtBA,IAAN0B,EAAA;AAAA,EADNI,EAAc,YAAY;AAAA,GACd9B,CAAA;"}
@@ -1,8 +1,8 @@
1
- import { css as h, LitElement as v, svg as p, html as d } from "lit";
1
+ import { css as v, LitElement as h, svg as p, html as d } from "lit";
2
2
  import "./document-token-adoption-DuYNKd4k.js";
3
3
  import { property as c, state as m, customElement as b } from "lit/decorators.js";
4
4
  import { classMap as x } from "lit/directives/class-map.js";
5
- const g = h`
5
+ const g = v`
6
6
  /* ─── Host ─── */
7
7
 
8
8
  :host {
@@ -205,13 +205,34 @@ const g = h`
205
205
  animation: none;
206
206
  }
207
207
  }
208
+
209
+ /* ─── Forced Colors (Windows High Contrast) ─── */
210
+
211
+ @media (forced-colors: active) {
212
+ .nav {
213
+ border-bottom-color: CanvasText;
214
+ }
215
+
216
+ .mobile-toggle {
217
+ color: ButtonText;
218
+ border: 1px solid ButtonText;
219
+ }
220
+
221
+ .nav__collapsible {
222
+ border-top-color: CanvasText;
223
+ }
224
+
225
+ .nav__actions {
226
+ border-top-color: CanvasText;
227
+ }
228
+ }
208
229
  `;
209
- var u = Object.defineProperty, f = Object.getOwnPropertyDescriptor, s = (n, e, i, a) => {
210
- for (var o = a > 1 ? void 0 : a ? f(e, i) : e, t = n.length - 1, r; t >= 0; t--)
211
- (r = n[t]) && (o = (a ? r(e, i, o) : r(o)) || o);
212
- return a && o && u(e, i, o), o;
230
+ var u = Object.defineProperty, f = Object.getOwnPropertyDescriptor, s = (n, e, i, o) => {
231
+ for (var a = o > 1 ? void 0 : o ? f(e, i) : e, t = n.length - 1, r; t >= 0; t--)
232
+ (r = n[t]) && (a = (o ? r(e, i, a) : r(a)) || a);
233
+ return o && a && u(e, i, a), a;
213
234
  };
214
- let l = class extends v {
235
+ let l = class extends h {
215
236
  constructor() {
216
237
  super(...arguments), this.sticky = !1, this.label = "Site Navigation", this._mobileOpen = !1, this._handleKeydown = (n) => {
217
238
  var e, i;
@@ -241,22 +262,22 @@ let l = class extends v {
241
262
  detail: { open: this._mobileOpen }
242
263
  })
243
264
  ), this._mobileOpen && this.updateComplete.then(() => {
244
- var o;
245
- const n = 'a[href], button:not([disabled]), [tabindex="0"]', e = (o = this.shadowRoot) == null ? void 0 : o.querySelector("slot:not([name])"), i = (e == null ? void 0 : e.assignedElements({ flatten: !0 })) ?? [];
246
- let a = null;
265
+ var a;
266
+ const n = 'a[href], button:not([disabled]), [tabindex="0"]', e = (a = this.shadowRoot) == null ? void 0 : a.querySelector("slot:not([name])"), i = (e == null ? void 0 : e.assignedElements({ flatten: !0 })) ?? [];
267
+ let o = null;
247
268
  for (const t of i) {
248
269
  if (!(t instanceof HTMLElement)) continue;
249
270
  if (t.matches(n)) {
250
- a = t;
271
+ o = t;
251
272
  break;
252
273
  }
253
274
  const r = t.querySelector(n);
254
275
  if (r) {
255
- a = r;
276
+ o = r;
256
277
  break;
257
278
  }
258
279
  }
259
- a == null || a.focus();
280
+ o == null || o.focus();
260
281
  });
261
282
  }
262
283
  // ─── Render Helpers ───
@@ -341,4 +362,4 @@ l = s([
341
362
  export {
342
363
  l as H
343
364
  };
344
- //# sourceMappingURL=hx-top-nav-CC4FW2Hp.js.map
365
+ //# sourceMappingURL=hx-top-nav-k7hY78kt.js.map