@helixui/library 3.1.0 → 3.2.0-next.100

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 (608) hide show
  1. package/custom-elements.json +6407 -339
  2. package/dist/components/hx-accordion/hx-accordion-item.d.ts.map +1 -1
  3. package/dist/components/hx-accordion/hx-accordion-item.styles.d.ts.map +1 -1
  4. package/dist/components/hx-accordion/hx-accordion.d.ts +3 -0
  5. package/dist/components/hx-accordion/hx-accordion.d.ts.map +1 -1
  6. package/dist/components/hx-accordion/index.js +1 -1
  7. package/dist/components/hx-action-bar/hx-action-bar.d.ts +14 -0
  8. package/dist/components/hx-action-bar/hx-action-bar.d.ts.map +1 -1
  9. package/dist/components/hx-action-bar/index.js +1 -1
  10. package/dist/components/hx-alert/hx-alert.d.ts +36 -0
  11. package/dist/components/hx-alert/hx-alert.d.ts.map +1 -1
  12. package/dist/components/hx-alert/hx-alert.styles.d.ts +12 -0
  13. package/dist/components/hx-alert/hx-alert.styles.d.ts.map +1 -1
  14. package/dist/components/hx-alert/index.js +1 -1
  15. package/dist/components/hx-avatar/hx-avatar.d.ts +17 -0
  16. package/dist/components/hx-avatar/hx-avatar.d.ts.map +1 -1
  17. package/dist/components/hx-avatar/index.js +1 -1
  18. package/dist/components/hx-badge/hx-badge.d.ts +35 -0
  19. package/dist/components/hx-badge/hx-badge.d.ts.map +1 -1
  20. package/dist/components/hx-badge/index.js +1 -1
  21. package/dist/components/hx-banner/hx-banner.d.ts +34 -0
  22. package/dist/components/hx-banner/hx-banner.d.ts.map +1 -1
  23. package/dist/components/hx-banner/hx-banner.styles.d.ts +12 -0
  24. package/dist/components/hx-banner/hx-banner.styles.d.ts.map +1 -1
  25. package/dist/components/hx-banner/index.js +1 -1
  26. package/dist/components/hx-breadcrumb/hx-breadcrumb-item.d.ts.map +1 -1
  27. package/dist/components/hx-breadcrumb/hx-breadcrumb-item.styles.d.ts.map +1 -1
  28. package/dist/components/hx-breadcrumb/hx-breadcrumb.d.ts +3 -0
  29. package/dist/components/hx-breadcrumb/hx-breadcrumb.d.ts.map +1 -1
  30. package/dist/components/hx-breadcrumb/index.js +1 -1
  31. package/dist/components/hx-button/hx-button.d.ts +44 -7
  32. package/dist/components/hx-button/hx-button.d.ts.map +1 -1
  33. package/dist/components/hx-button/hx-button.styles.d.ts.map +1 -1
  34. package/dist/components/hx-button/index.js +1 -1
  35. package/dist/components/hx-button-group/hx-button-group.d.ts +2 -0
  36. package/dist/components/hx-button-group/hx-button-group.d.ts.map +1 -1
  37. package/dist/components/hx-button-group/hx-button-group.styles.d.ts.map +1 -1
  38. package/dist/components/hx-button-group/index.js +1 -1
  39. package/dist/components/hx-card/hx-card.d.ts +28 -0
  40. package/dist/components/hx-card/hx-card.d.ts.map +1 -1
  41. package/dist/components/hx-card/hx-card.styles.d.ts +9 -0
  42. package/dist/components/hx-card/hx-card.styles.d.ts.map +1 -1
  43. package/dist/components/hx-card/index.js +1 -1
  44. package/dist/components/hx-carousel/hx-carousel.d.ts +25 -0
  45. package/dist/components/hx-carousel/hx-carousel.d.ts.map +1 -1
  46. package/dist/components/hx-carousel/hx-carousel.styles.d.ts.map +1 -1
  47. package/dist/components/hx-carousel/index.js +1 -1
  48. package/dist/components/hx-checkbox/hx-checkbox.d.ts +38 -7
  49. package/dist/components/hx-checkbox/hx-checkbox.d.ts.map +1 -1
  50. package/dist/components/hx-checkbox/index.js +1 -1
  51. package/dist/components/hx-checkbox-group/hx-checkbox-group.d.ts +16 -2
  52. package/dist/components/hx-checkbox-group/hx-checkbox-group.d.ts.map +1 -1
  53. package/dist/components/hx-checkbox-group/index.js +1 -1
  54. package/dist/components/hx-clinical-status/hx-clinical-status.d.ts +37 -0
  55. package/dist/components/hx-clinical-status/hx-clinical-status.d.ts.map +1 -1
  56. package/dist/components/hx-clinical-status/hx-clinical-status.styles.d.ts.map +1 -1
  57. package/dist/components/hx-clinical-status/index.js +1 -1
  58. package/dist/components/hx-code-snippet/hx-code-snippet.d.ts +35 -0
  59. package/dist/components/hx-code-snippet/hx-code-snippet.d.ts.map +1 -1
  60. package/dist/components/hx-code-snippet/hx-code-snippet.styles.d.ts.map +1 -1
  61. package/dist/components/hx-code-snippet/index.js +1 -1
  62. package/dist/components/hx-color-picker/hx-color-picker.d.ts +29 -0
  63. package/dist/components/hx-color-picker/hx-color-picker.d.ts.map +1 -1
  64. package/dist/components/hx-color-picker/hx-color-picker.styles.d.ts.map +1 -1
  65. package/dist/components/hx-color-picker/index.js +1 -1
  66. package/dist/components/hx-combobox/hx-combobox.d.ts +49 -0
  67. package/dist/components/hx-combobox/hx-combobox.d.ts.map +1 -1
  68. package/dist/components/hx-combobox/index.js +1 -1
  69. package/dist/components/hx-container/hx-container.d.ts +5 -0
  70. package/dist/components/hx-container/hx-container.d.ts.map +1 -1
  71. package/dist/components/hx-copy-button/hx-copy-button.d.ts +24 -0
  72. package/dist/components/hx-copy-button/hx-copy-button.d.ts.map +1 -1
  73. package/dist/components/hx-copy-button/hx-copy-button.styles.d.ts.map +1 -1
  74. package/dist/components/hx-copy-button/index.js +1 -1
  75. package/dist/components/hx-counter/hx-counter.d.ts +7 -0
  76. package/dist/components/hx-counter/hx-counter.d.ts.map +1 -1
  77. package/dist/components/hx-counter/index.js +1 -1
  78. package/dist/components/hx-data-table/hx-data-table.d.ts +29 -0
  79. package/dist/components/hx-data-table/hx-data-table.d.ts.map +1 -1
  80. package/dist/components/hx-data-table/hx-data-table.styles.d.ts.map +1 -1
  81. package/dist/components/hx-data-table/index.js +1 -1
  82. package/dist/components/hx-date-picker/hx-date-picker.d.ts +44 -0
  83. package/dist/components/hx-date-picker/hx-date-picker.d.ts.map +1 -1
  84. package/dist/components/hx-date-picker/index.js +1 -1
  85. package/dist/components/hx-dialog/hx-dialog.d.ts +31 -0
  86. package/dist/components/hx-dialog/hx-dialog.d.ts.map +1 -1
  87. package/dist/components/hx-dialog/hx-dialog.styles.d.ts +10 -0
  88. package/dist/components/hx-dialog/hx-dialog.styles.d.ts.map +1 -1
  89. package/dist/components/hx-dialog/index.js +1 -1
  90. package/dist/components/hx-divider/hx-divider.d.ts +9 -0
  91. package/dist/components/hx-divider/hx-divider.d.ts.map +1 -1
  92. package/dist/components/hx-divider/index.js +1 -1
  93. package/dist/components/hx-drawer/hx-drawer.d.ts +30 -0
  94. package/dist/components/hx-drawer/hx-drawer.d.ts.map +1 -1
  95. package/dist/components/hx-drawer/hx-drawer.styles.d.ts +10 -0
  96. package/dist/components/hx-drawer/hx-drawer.styles.d.ts.map +1 -1
  97. package/dist/components/hx-drawer/index.js +1 -1
  98. package/dist/components/hx-dropdown/hx-dropdown.d.ts +6 -0
  99. package/dist/components/hx-dropdown/hx-dropdown.d.ts.map +1 -1
  100. package/dist/components/hx-dropdown/index.js +1 -1
  101. package/dist/components/hx-field/hx-field.d.ts +15 -0
  102. package/dist/components/hx-field/hx-field.d.ts.map +1 -1
  103. package/dist/components/hx-field/index.js +1 -1
  104. package/dist/components/hx-field-label/hx-field-label.d.ts +11 -0
  105. package/dist/components/hx-field-label/hx-field-label.d.ts.map +1 -1
  106. package/dist/components/hx-field-label/index.js +1 -1
  107. package/dist/components/hx-file-upload/hx-file-upload.d.ts +35 -0
  108. package/dist/components/hx-file-upload/hx-file-upload.d.ts.map +1 -1
  109. package/dist/components/hx-file-upload/hx-file-upload.styles.d.ts.map +1 -1
  110. package/dist/components/hx-file-upload/index.js +1 -1
  111. package/dist/components/hx-form/index.js +1 -1
  112. package/dist/components/hx-grid/hx-grid.d.ts +5 -0
  113. package/dist/components/hx-grid/hx-grid.d.ts.map +1 -1
  114. package/dist/components/hx-help-text/hx-help-text.d.ts +8 -0
  115. package/dist/components/hx-help-text/hx-help-text.d.ts.map +1 -1
  116. package/dist/components/hx-help-text/index.js +1 -1
  117. package/dist/components/hx-icon/hx-icon.d.ts +5 -0
  118. package/dist/components/hx-icon/hx-icon.d.ts.map +1 -1
  119. package/dist/components/hx-icon/index.js +1 -1
  120. package/dist/components/hx-icon-button/hx-icon-button.d.ts +27 -0
  121. package/dist/components/hx-icon-button/hx-icon-button.d.ts.map +1 -1
  122. package/dist/components/hx-icon-button/hx-icon-button.styles.d.ts.map +1 -1
  123. package/dist/components/hx-icon-button/index.js +1 -1
  124. package/dist/components/hx-image/hx-image.d.ts +4 -0
  125. package/dist/components/hx-image/hx-image.d.ts.map +1 -1
  126. package/dist/components/hx-image/index.js +1 -1
  127. package/dist/components/hx-link/hx-link.d.ts +15 -0
  128. package/dist/components/hx-link/hx-link.d.ts.map +1 -1
  129. package/dist/components/hx-link/index.js +1 -1
  130. package/dist/components/hx-list/hx-list-item.d.ts.map +1 -1
  131. package/dist/components/hx-list/hx-list.d.ts +3 -0
  132. package/dist/components/hx-list/hx-list.d.ts.map +1 -1
  133. package/dist/components/hx-list/index.js +1 -1
  134. package/dist/components/hx-menu/hx-menu-divider.d.ts.map +1 -1
  135. package/dist/components/hx-menu/hx-menu-item.d.ts.map +1 -1
  136. package/dist/components/hx-menu/hx-menu.d.ts +6 -0
  137. package/dist/components/hx-menu/hx-menu.d.ts.map +1 -1
  138. package/dist/components/hx-menu/index.js +1 -1
  139. package/dist/components/hx-meter/hx-meter.d.ts +23 -0
  140. package/dist/components/hx-meter/hx-meter.d.ts.map +1 -1
  141. package/dist/components/hx-meter/index.js +1 -1
  142. package/dist/components/hx-nav/hx-nav.d.ts +29 -0
  143. package/dist/components/hx-nav/hx-nav.d.ts.map +1 -1
  144. package/dist/components/hx-nav/index.js +1 -1
  145. package/dist/components/hx-number-input/hx-number-input.d.ts +34 -0
  146. package/dist/components/hx-number-input/hx-number-input.d.ts.map +1 -1
  147. package/dist/components/hx-number-input/index.js +1 -1
  148. package/dist/components/hx-overflow-menu/hx-overflow-menu.d.ts +26 -0
  149. package/dist/components/hx-overflow-menu/hx-overflow-menu.d.ts.map +1 -1
  150. package/dist/components/hx-overflow-menu/hx-overflow-menu.styles.d.ts.map +1 -1
  151. package/dist/components/hx-overflow-menu/index.js +1 -1
  152. package/dist/components/hx-pagination/hx-pagination.d.ts +21 -0
  153. package/dist/components/hx-pagination/hx-pagination.d.ts.map +1 -1
  154. package/dist/components/hx-pagination/index.js +1 -1
  155. package/dist/components/hx-patient-banner/hx-patient-banner.d.ts +23 -0
  156. package/dist/components/hx-patient-banner/hx-patient-banner.d.ts.map +1 -1
  157. package/dist/components/hx-patient-banner/hx-patient-banner.styles.d.ts.map +1 -1
  158. package/dist/components/hx-patient-banner/index.js +1 -1
  159. package/dist/components/hx-phi-field/hx-phi-field.d.ts +19 -5
  160. package/dist/components/hx-phi-field/hx-phi-field.d.ts.map +1 -1
  161. package/dist/components/hx-phi-field/hx-phi-field.styles.d.ts.map +1 -1
  162. package/dist/components/hx-phi-field/index.js +1 -1
  163. package/dist/components/hx-popover/hx-popover.d.ts +15 -0
  164. package/dist/components/hx-popover/hx-popover.d.ts.map +1 -1
  165. package/dist/components/hx-popover/hx-popover.styles.d.ts +9 -0
  166. package/dist/components/hx-popover/hx-popover.styles.d.ts.map +1 -1
  167. package/dist/components/hx-popover/index.js +1 -1
  168. package/dist/components/hx-popup/hx-popup.d.ts +1 -0
  169. package/dist/components/hx-popup/hx-popup.d.ts.map +1 -1
  170. package/dist/components/hx-popup/hx-popup.styles.d.ts +9 -0
  171. package/dist/components/hx-popup/hx-popup.styles.d.ts.map +1 -1
  172. package/dist/components/hx-popup/index.js +1 -1
  173. package/dist/components/hx-progress-bar/hx-progress-bar.d.ts +17 -0
  174. package/dist/components/hx-progress-bar/hx-progress-bar.d.ts.map +1 -1
  175. package/dist/components/hx-progress-bar/index.js +1 -1
  176. package/dist/components/hx-progress-ring/hx-progress-ring.d.ts +15 -0
  177. package/dist/components/hx-progress-ring/hx-progress-ring.d.ts.map +1 -1
  178. package/dist/components/hx-progress-ring/index.js +1 -1
  179. package/dist/components/hx-prose/hx-prose.d.ts +2 -0
  180. package/dist/components/hx-prose/hx-prose.d.ts.map +1 -1
  181. package/dist/components/hx-prose/index.js +1 -1
  182. package/dist/components/hx-radio-group/hx-radio-group.d.ts +17 -3
  183. package/dist/components/hx-radio-group/hx-radio-group.d.ts.map +1 -1
  184. package/dist/components/hx-radio-group/hx-radio.d.ts +5 -5
  185. package/dist/components/hx-radio-group/hx-radio.d.ts.map +1 -1
  186. package/dist/components/hx-radio-group/index.js +1 -1
  187. package/dist/components/hx-rating/hx-rating.d.ts +13 -0
  188. package/dist/components/hx-rating/hx-rating.d.ts.map +1 -1
  189. package/dist/components/hx-rating/index.js +1 -1
  190. package/dist/components/hx-select/hx-select.d.ts +43 -0
  191. package/dist/components/hx-select/hx-select.d.ts.map +1 -1
  192. package/dist/components/hx-select/hx-select.styles.d.ts.map +1 -1
  193. package/dist/components/hx-select/index.js +1 -1
  194. package/dist/components/hx-side-nav/hx-nav-item.d.ts +7 -5
  195. package/dist/components/hx-side-nav/hx-nav-item.d.ts.map +1 -1
  196. package/dist/components/hx-side-nav/hx-nav-item.styles.d.ts.map +1 -1
  197. package/dist/components/hx-side-nav/hx-side-nav.d.ts +9 -4
  198. package/dist/components/hx-side-nav/hx-side-nav.d.ts.map +1 -1
  199. package/dist/components/hx-side-nav/hx-side-nav.styles.d.ts.map +1 -1
  200. package/dist/components/hx-side-nav/index.js +1 -1
  201. package/dist/components/hx-skeleton/hx-skeleton.d.ts +5 -0
  202. package/dist/components/hx-skeleton/hx-skeleton.d.ts.map +1 -1
  203. package/dist/components/hx-skeleton/index.js +1 -1
  204. package/dist/components/hx-slider/hx-slider.d.ts +38 -0
  205. package/dist/components/hx-slider/hx-slider.d.ts.map +1 -1
  206. package/dist/components/hx-slider/hx-slider.styles.d.ts.map +1 -1
  207. package/dist/components/hx-slider/index.js +1 -1
  208. package/dist/components/hx-spinner/hx-spinner.d.ts +10 -0
  209. package/dist/components/hx-spinner/hx-spinner.d.ts.map +1 -1
  210. package/dist/components/hx-spinner/index.js +1 -1
  211. package/dist/components/hx-split-button/hx-split-button.d.ts +40 -1
  212. package/dist/components/hx-split-button/hx-split-button.d.ts.map +1 -1
  213. package/dist/components/hx-split-button/hx-split-button.styles.d.ts.map +1 -1
  214. package/dist/components/hx-split-button/index.js +1 -1
  215. package/dist/components/hx-split-panel/hx-split-panel.d.ts +12 -0
  216. package/dist/components/hx-split-panel/hx-split-panel.d.ts.map +1 -1
  217. package/dist/components/hx-split-panel/hx-split-panel.styles.d.ts.map +1 -1
  218. package/dist/components/hx-split-panel/index.js +1 -1
  219. package/dist/components/hx-stack/hx-stack.d.ts +5 -0
  220. package/dist/components/hx-stack/hx-stack.d.ts.map +1 -1
  221. package/dist/components/hx-stat/hx-stat.d.ts +24 -0
  222. package/dist/components/hx-stat/hx-stat.d.ts.map +1 -1
  223. package/dist/components/hx-stat/index.js +1 -1
  224. package/dist/components/hx-status-indicator/hx-status-indicator.d.ts +13 -0
  225. package/dist/components/hx-status-indicator/hx-status-indicator.d.ts.map +1 -1
  226. package/dist/components/hx-status-indicator/index.js +1 -1
  227. package/dist/components/hx-steps/hx-step.d.ts.map +1 -1
  228. package/dist/components/hx-steps/hx-step.styles.d.ts.map +1 -1
  229. package/dist/components/hx-steps/hx-steps.d.ts +15 -0
  230. package/dist/components/hx-steps/hx-steps.d.ts.map +1 -1
  231. package/dist/components/hx-steps/index.js +1 -1
  232. package/dist/components/hx-structured-list/hx-structured-list.d.ts +7 -0
  233. package/dist/components/hx-structured-list/hx-structured-list.d.ts.map +1 -1
  234. package/dist/components/hx-structured-list/index.js +1 -1
  235. package/dist/components/hx-switch/hx-switch.d.ts +42 -0
  236. package/dist/components/hx-switch/hx-switch.d.ts.map +1 -1
  237. package/dist/components/hx-switch/hx-switch.styles.d.ts.map +1 -1
  238. package/dist/components/hx-switch/index.js +1 -1
  239. package/dist/components/hx-table/hx-table.d.ts +20 -6
  240. package/dist/components/hx-table/hx-table.d.ts.map +1 -1
  241. package/dist/components/hx-table/hx-table.styles.d.ts.map +1 -1
  242. package/dist/components/hx-table/hx-td.d.ts +1 -1
  243. package/dist/components/hx-table/index.js +1 -1
  244. package/dist/components/hx-tabs/hx-tab-panel.d.ts +2 -2
  245. package/dist/components/hx-tabs/hx-tab-panel.d.ts.map +1 -1
  246. package/dist/components/hx-tabs/hx-tab.d.ts +6 -6
  247. package/dist/components/hx-tabs/hx-tab.d.ts.map +1 -1
  248. package/dist/components/hx-tabs/hx-tabs.d.ts +12 -8
  249. package/dist/components/hx-tabs/hx-tabs.d.ts.map +1 -1
  250. package/dist/components/hx-tabs/index.js +1 -1
  251. package/dist/components/hx-tag/hx-tag.d.ts +36 -0
  252. package/dist/components/hx-tag/hx-tag.d.ts.map +1 -1
  253. package/dist/components/hx-tag/index.js +1 -1
  254. package/dist/components/hx-text/hx-text.d.ts +22 -0
  255. package/dist/components/hx-text/hx-text.d.ts.map +1 -1
  256. package/dist/components/hx-text/hx-text.styles.d.ts.map +1 -1
  257. package/dist/components/hx-text/index.js +1 -1
  258. package/dist/components/hx-text-input/hx-text-input.d.ts +18 -5
  259. package/dist/components/hx-text-input/hx-text-input.d.ts.map +1 -1
  260. package/dist/components/hx-text-input/hx-text-input.styles.d.ts +12 -0
  261. package/dist/components/hx-text-input/hx-text-input.styles.d.ts.map +1 -1
  262. package/dist/components/hx-text-input/index.js +1 -1
  263. package/dist/components/hx-textarea/hx-textarea.d.ts +27 -0
  264. package/dist/components/hx-textarea/hx-textarea.d.ts.map +1 -1
  265. package/dist/components/hx-textarea/hx-textarea.styles.d.ts.map +1 -1
  266. package/dist/components/hx-textarea/index.js +1 -1
  267. package/dist/components/hx-theme/hx-theme.d.ts +3 -0
  268. package/dist/components/hx-theme/hx-theme.d.ts.map +1 -1
  269. package/dist/components/hx-theme/index.js +1 -1
  270. package/dist/components/hx-time-picker/hx-time-picker.d.ts +32 -0
  271. package/dist/components/hx-time-picker/hx-time-picker.d.ts.map +1 -1
  272. package/dist/components/hx-time-picker/hx-time-picker.styles.d.ts.map +1 -1
  273. package/dist/components/hx-time-picker/index.js +1 -1
  274. package/dist/components/hx-toast/hx-toast.d.ts +30 -2
  275. package/dist/components/hx-toast/hx-toast.d.ts.map +1 -1
  276. package/dist/components/hx-toast/hx-toast.styles.d.ts +10 -0
  277. package/dist/components/hx-toast/hx-toast.styles.d.ts.map +1 -1
  278. package/dist/components/hx-toast/index.js +1 -1
  279. package/dist/components/hx-toggle-button/hx-toggle-button.d.ts +35 -0
  280. package/dist/components/hx-toggle-button/hx-toggle-button.d.ts.map +1 -1
  281. package/dist/components/hx-toggle-button/hx-toggle-button.styles.d.ts.map +1 -1
  282. package/dist/components/hx-toggle-button/index.js +1 -1
  283. package/dist/components/hx-tooltip/hx-tooltip.d.ts +13 -0
  284. package/dist/components/hx-tooltip/hx-tooltip.d.ts.map +1 -1
  285. package/dist/components/hx-tooltip/hx-tooltip.styles.d.ts +8 -0
  286. package/dist/components/hx-tooltip/hx-tooltip.styles.d.ts.map +1 -1
  287. package/dist/components/hx-tooltip/index.js +1 -1
  288. package/dist/components/hx-top-nav/hx-top-nav.d.ts +21 -0
  289. package/dist/components/hx-top-nav/hx-top-nav.d.ts.map +1 -1
  290. package/dist/components/hx-top-nav/index.js +1 -1
  291. package/dist/components/hx-tree-view/hx-tree-item.d.ts.map +1 -1
  292. package/dist/components/hx-tree-view/hx-tree-view.d.ts +6 -0
  293. package/dist/components/hx-tree-view/hx-tree-view.d.ts.map +1 -1
  294. package/dist/components/hx-tree-view/index.js +1 -1
  295. package/dist/css/helix-all.css +1286 -889
  296. package/dist/css/helix-core.css +322 -167
  297. package/dist/css/helix-data.css +54 -46
  298. package/dist/css/helix-feedback.css +132 -95
  299. package/dist/css/helix-forms.css +499 -349
  300. package/dist/css/helix-layout.css +9 -12
  301. package/dist/css/helix-media.css +16 -12
  302. package/dist/css/helix-navigation.css +86 -66
  303. package/dist/css/helix-overlay.css +62 -56
  304. package/dist/css/helix-tokens.css +173 -106
  305. package/dist/css/helix-utility.css +57 -40
  306. package/dist/css/hx-action-bar.css +5 -5
  307. package/dist/css/hx-alert.css +27 -23
  308. package/dist/css/hx-avatar.css +3 -3
  309. package/dist/css/hx-badge.css +22 -22
  310. package/dist/css/hx-banner.css +31 -24
  311. package/dist/css/hx-button-group.css +31 -14
  312. package/dist/css/hx-button.css +151 -34
  313. package/dist/css/hx-card.css +23 -12
  314. package/dist/css/hx-carousel.css +16 -12
  315. package/dist/css/hx-checkbox-group.css +5 -5
  316. package/dist/css/hx-checkbox.css +19 -19
  317. package/dist/css/hx-clinical-status.css +28 -30
  318. package/dist/css/hx-code-snippet.css +26 -18
  319. package/dist/css/hx-color-picker.css +20 -13
  320. package/dist/css/hx-combobox.css +31 -31
  321. package/dist/css/hx-copy-button.css +6 -3
  322. package/dist/css/hx-counter.css +1 -1
  323. package/dist/css/hx-data-table.css +16 -15
  324. package/dist/css/hx-date-picker.css +34 -34
  325. package/dist/css/hx-dialog.css +31 -27
  326. package/dist/css/hx-divider.css +2 -2
  327. package/dist/css/hx-drawer.css +18 -18
  328. package/dist/css/hx-dropdown.css +2 -2
  329. package/dist/css/hx-field-label.css +3 -3
  330. package/dist/css/hx-field.css +6 -6
  331. package/dist/css/hx-file-upload.css +21 -30
  332. package/dist/css/hx-help-text.css +5 -5
  333. package/dist/css/hx-icon-button.css +46 -38
  334. package/dist/css/hx-image.css +3 -3
  335. package/dist/css/hx-link.css +9 -9
  336. package/dist/css/hx-list.css +1 -1
  337. package/dist/css/hx-menu.css +2 -2
  338. package/dist/css/hx-meter.css +10 -10
  339. package/dist/css/hx-nav.css +11 -11
  340. package/dist/css/hx-number-input.css +18 -18
  341. package/dist/css/hx-overflow-menu.css +18 -15
  342. package/dist/css/hx-pagination.css +15 -15
  343. package/dist/css/hx-patient-banner.css +17 -9
  344. package/dist/css/hx-phi-field.css +4 -7
  345. package/dist/css/hx-popover.css +7 -6
  346. package/dist/css/hx-progress-bar.css +7 -7
  347. package/dist/css/hx-progress-ring.css +6 -6
  348. package/dist/css/hx-radio-group.css +5 -5
  349. package/dist/css/hx-rating.css +5 -5
  350. package/dist/css/hx-select.css +18 -16
  351. package/dist/css/hx-side-nav.css +28 -11
  352. package/dist/css/hx-skeleton.css +1 -1
  353. package/dist/css/hx-slider.css +15 -12
  354. package/dist/css/hx-spinner.css +4 -4
  355. package/dist/css/hx-split-button.css +45 -31
  356. package/dist/css/hx-split-panel.css +9 -12
  357. package/dist/css/hx-stat.css +8 -8
  358. package/dist/css/hx-status-indicator.css +7 -7
  359. package/dist/css/hx-structured-list.css +5 -5
  360. package/dist/css/hx-switch.css +16 -8
  361. package/dist/css/hx-table.css +6 -7
  362. package/dist/css/hx-tabs.css +3 -3
  363. package/dist/css/hx-tag.css +18 -18
  364. package/dist/css/hx-text-input.css +139 -61
  365. package/dist/css/hx-text.css +9 -7
  366. package/dist/css/hx-textarea.css +66 -27
  367. package/dist/css/hx-time-picker.css +27 -21
  368. package/dist/css/hx-toast.css +36 -10
  369. package/dist/css/hx-toggle-button.css +46 -30
  370. package/dist/css/hx-tooltip.css +4 -3
  371. package/dist/css/hx-top-nav.css +8 -8
  372. package/dist/css/hx-tree-view.css +1 -1
  373. package/dist/css/index.css +1 -1
  374. package/dist/css/manifest.json +330 -230
  375. package/dist/index.js +75 -75
  376. package/dist/shared/forced-colors-CTEDFRGa.js +117 -0
  377. package/dist/shared/forced-colors-CTEDFRGa.js.map +1 -0
  378. package/dist/shared/{hx-accordion-Wt52OOZD.js → hx-accordion-ZVzgDzTG.js} +29 -29
  379. package/dist/shared/hx-accordion-ZVzgDzTG.js.map +1 -0
  380. package/dist/shared/{hx-action-bar-BKMADbHj.js → hx-action-bar-CitgcpGv.js} +38 -37
  381. package/dist/shared/hx-action-bar-CitgcpGv.js.map +1 -0
  382. package/dist/shared/{hx-alert-D7n94HwI.js → hx-alert-C597yHpD.js} +36 -31
  383. package/dist/shared/hx-alert-C597yHpD.js.map +1 -0
  384. package/dist/shared/{hx-avatar-iLYzu8MJ.js → hx-avatar-C9hOmlAb.js} +19 -18
  385. package/dist/shared/hx-avatar-C9hOmlAb.js.map +1 -0
  386. package/dist/shared/{hx-badge-CVCmMPyW.js → hx-badge-CQXgOXJM.js} +65 -64
  387. package/dist/shared/hx-badge-CQXgOXJM.js.map +1 -0
  388. package/dist/shared/{hx-banner-C_He7Tr4.js → hx-banner-Cxd7eFUP.js} +43 -35
  389. package/dist/shared/hx-banner-Cxd7eFUP.js.map +1 -0
  390. package/dist/shared/{hx-breadcrumb-item-CldCwD1d.js → hx-breadcrumb-item-3tKppF9h.js} +24 -26
  391. package/dist/shared/hx-breadcrumb-item-3tKppF9h.js.map +1 -0
  392. package/dist/shared/{hx-button-Ddl-T6T-.js → hx-button-9OUjJnk7.js} +172 -55
  393. package/dist/shared/hx-button-9OUjJnk7.js.map +1 -0
  394. package/dist/shared/{hx-button-group-BJOGWoMa.js → hx-button-group-BI-QBqmO.js} +45 -27
  395. package/dist/shared/hx-button-group-BI-QBqmO.js.map +1 -0
  396. package/dist/shared/{hx-card-ycveujjL.js → hx-card-qNAM2QNV.js} +49 -37
  397. package/dist/shared/hx-card-qNAM2QNV.js.map +1 -0
  398. package/dist/shared/{hx-carousel-item-D_dCv61-.js → hx-carousel-item-z1Lc24op.js} +41 -36
  399. package/dist/shared/hx-carousel-item-z1Lc24op.js.map +1 -0
  400. package/dist/shared/{hx-checkbox-DkkoWoye.js → hx-checkbox-DBD-gMoz.js} +42 -41
  401. package/dist/shared/hx-checkbox-DBD-gMoz.js.map +1 -0
  402. package/dist/shared/{hx-checkbox-group-C3poJ-Zw.js → hx-checkbox-group-C9n315Ju.js} +20 -19
  403. package/dist/shared/hx-checkbox-group-C9n315Ju.js.map +1 -0
  404. package/dist/shared/{hx-clinical-status-BS5lcddT.js → hx-clinical-status-D3XQIOqX.js} +55 -56
  405. package/dist/shared/hx-clinical-status-D3XQIOqX.js.map +1 -0
  406. package/dist/shared/{hx-code-snippet-B7wUKzyb.js → hx-code-snippet-B26RM1_C.js} +41 -32
  407. package/dist/shared/hx-code-snippet-B26RM1_C.js.map +1 -0
  408. package/dist/shared/{hx-color-picker-DBaKTVLr.js → hx-color-picker-uRc865FJ.js} +54 -46
  409. package/dist/shared/hx-color-picker-uRc865FJ.js.map +1 -0
  410. package/dist/shared/{hx-combobox-BmgYT7Ar.js → hx-combobox-ClhNRAS5.js} +46 -45
  411. package/dist/shared/hx-combobox-ClhNRAS5.js.map +1 -0
  412. package/dist/shared/hx-container-DVI7sxfX.js.map +1 -1
  413. package/dist/shared/{hx-copy-button-8deNUdwP.js → hx-copy-button-sUVuikyH.js} +23 -19
  414. package/dist/shared/hx-copy-button-sUVuikyH.js.map +1 -0
  415. package/dist/shared/{hx-counter-CKfl_g8K.js → hx-counter-0zYapFhf.js} +10 -9
  416. package/dist/shared/hx-counter-0zYapFhf.js.map +1 -0
  417. package/dist/shared/{hx-data-table-B6h0RPn0.js → hx-data-table-CLqVqdxr.js} +49 -47
  418. package/dist/shared/hx-data-table-CLqVqdxr.js.map +1 -0
  419. package/dist/shared/{hx-date-picker-Dq2Nb68_.js → hx-date-picker-BJm7Yrda.js} +45 -44
  420. package/dist/shared/hx-date-picker-BJm7Yrda.js.map +1 -0
  421. package/dist/shared/{hx-dialog-CvIlY0Tc.js → hx-dialog-DRN_1-Y-.js} +68 -63
  422. package/dist/shared/hx-dialog-DRN_1-Y-.js.map +1 -0
  423. package/dist/shared/{hx-divider-DwpOrzMW.js → hx-divider-CYfcUjcr.js} +18 -17
  424. package/dist/shared/hx-divider-CYfcUjcr.js.map +1 -0
  425. package/dist/shared/{hx-drawer-Cx2ZJhBe.js → hx-drawer-Y1Ui2IWJ.js} +31 -30
  426. package/dist/shared/hx-drawer-Y1Ui2IWJ.js.map +1 -0
  427. package/dist/shared/{hx-dropdown-BjDrPUq5.js → hx-dropdown-LyaRc8Rf.js} +16 -15
  428. package/dist/shared/hx-dropdown-LyaRc8Rf.js.map +1 -0
  429. package/dist/shared/{hx-field-Dp3qQMut.js → hx-field-B3Qo8OLS.js} +15 -15
  430. package/dist/shared/hx-field-B3Qo8OLS.js.map +1 -0
  431. package/dist/shared/{hx-field-label-BC8QViXv.js → hx-field-label-BVRyyKeh.js} +8 -7
  432. package/dist/shared/hx-field-label-BVRyyKeh.js.map +1 -0
  433. package/dist/shared/{hx-file-upload-B6Yl1u0i.js → hx-file-upload-D3rKROK5.js} +51 -59
  434. package/dist/shared/hx-file-upload-D3rKROK5.js.map +1 -0
  435. package/dist/shared/hx-form-CkChEATa.js +257 -0
  436. package/dist/shared/hx-form-CkChEATa.js.map +1 -0
  437. package/dist/shared/hx-grid-CXZf3jeK.js.map +1 -1
  438. package/dist/shared/{hx-help-text-D7eytSim.js → hx-help-text-Xb2Yr8x2.js} +30 -29
  439. package/dist/shared/hx-help-text-Xb2Yr8x2.js.map +1 -0
  440. package/dist/shared/{hx-icon-button-BHneqPCU.js → hx-icon-button-CGNdQSFM.js} +78 -69
  441. package/dist/shared/hx-icon-button-CGNdQSFM.js.map +1 -0
  442. package/dist/shared/{hx-icon-CcyDPDYY.js → hx-icon-fuVm4-bk.js} +15 -14
  443. package/dist/shared/hx-icon-fuVm4-bk.js.map +1 -0
  444. package/dist/shared/{hx-image-2gt14zZd.js → hx-image-Ben_4yM5.js} +18 -17
  445. package/dist/shared/hx-image-Ben_4yM5.js.map +1 -0
  446. package/dist/shared/{hx-link-BESrWK8M.js → hx-link-9Ig2DW6L.js} +20 -19
  447. package/dist/shared/hx-link-9Ig2DW6L.js.map +1 -0
  448. package/dist/shared/{hx-list-_9qVv02L.js → hx-list-CkphGi9T.js} +22 -21
  449. package/dist/shared/hx-list-CkphGi9T.js.map +1 -0
  450. package/dist/shared/{hx-menu-divider-Ck-9Os1t.js → hx-menu-divider-C2omnPtj.js} +50 -49
  451. package/dist/shared/hx-menu-divider-C2omnPtj.js.map +1 -0
  452. package/dist/shared/{hx-meter-TbROk-dw.js → hx-meter-BPscsw5t.js} +41 -40
  453. package/dist/shared/{hx-meter-TbROk-dw.js.map → hx-meter-BPscsw5t.js.map} +1 -1
  454. package/dist/shared/{hx-nav-item-pqPasRUm.js → hx-nav-item-CqbO5-T5.js} +143 -81
  455. package/dist/shared/hx-nav-item-CqbO5-T5.js.map +1 -0
  456. package/dist/shared/{hx-nav-BcYDmjf7.js → hx-nav-ldFM3Fle.js} +54 -53
  457. package/dist/shared/hx-nav-ldFM3Fle.js.map +1 -0
  458. package/dist/shared/{hx-number-input-mOIZ3-46.js → hx-number-input-yUzFOSC1.js} +68 -67
  459. package/dist/shared/hx-number-input-yUzFOSC1.js.map +1 -0
  460. package/dist/shared/{hx-overflow-menu-Dprb9lnT.js → hx-overflow-menu-DCLsdIBy.js} +33 -29
  461. package/dist/shared/hx-overflow-menu-DCLsdIBy.js.map +1 -0
  462. package/dist/shared/{hx-pagination-AguTQjYC.js → hx-pagination-C7y8GVyU.js} +43 -42
  463. package/dist/shared/hx-pagination-C7y8GVyU.js.map +1 -0
  464. package/dist/shared/{hx-patient-banner-uE6gqLpT.js → hx-patient-banner-CkS-Lmj4.js} +29 -20
  465. package/dist/shared/hx-patient-banner-CkS-Lmj4.js.map +1 -0
  466. package/dist/shared/{hx-phi-field-BC_XowhC.js → hx-phi-field-C19oxlrr.js} +13 -15
  467. package/dist/shared/hx-phi-field-C19oxlrr.js.map +1 -0
  468. package/dist/shared/{hx-popover-B2_203ct.js → hx-popover-B-FP3-wW.js} +31 -29
  469. package/dist/shared/hx-popover-B-FP3-wW.js.map +1 -0
  470. package/dist/shared/{hx-popup-DZXpsJ1R.js → hx-popup-COUXXZ9X.js} +8 -7
  471. package/dist/shared/hx-popup-COUXXZ9X.js.map +1 -0
  472. package/dist/shared/{hx-progress-bar-KjEkEJLy.js → hx-progress-bar-Bn3JEPUf.js} +28 -27
  473. package/dist/shared/hx-progress-bar-Bn3JEPUf.js.map +1 -0
  474. package/dist/shared/{hx-progress-ring-3zMwvrwD.js → hx-progress-ring-TwHyXeEp.js} +15 -14
  475. package/dist/shared/hx-progress-ring-TwHyXeEp.js.map +1 -0
  476. package/dist/shared/{hx-prose-BCtK7YL6.js → hx-prose-BThYcASV.js} +12 -12
  477. package/dist/shared/{hx-prose-BCtK7YL6.js.map → hx-prose-BThYcASV.js.map} +1 -1
  478. package/dist/shared/{hx-radio-BBC5qZgE.js → hx-radio-dFjUAost.js} +38 -37
  479. package/dist/shared/hx-radio-dFjUAost.js.map +1 -0
  480. package/dist/shared/{hx-rating-C3E3ENJb.js → hx-rating-CGtsejNf.js} +38 -37
  481. package/dist/shared/hx-rating-CGtsejNf.js.map +1 -0
  482. package/dist/shared/{hx-select-CixTo7jp.js → hx-select-Bf4usFts.js} +64 -61
  483. package/dist/shared/hx-select-Bf4usFts.js.map +1 -0
  484. package/dist/shared/{hx-skeleton-LxkI0pxr.js → hx-skeleton-Cnieh5Uc.js} +14 -13
  485. package/dist/shared/hx-skeleton-Cnieh5Uc.js.map +1 -0
  486. package/dist/shared/{hx-slider-DFHuzF3N.js → hx-slider-m0aEClH1.js} +83 -79
  487. package/dist/shared/hx-slider-m0aEClH1.js.map +1 -0
  488. package/dist/shared/{hx-spinner-BKjuCdZB.js → hx-spinner-DL5AYr16.js} +18 -17
  489. package/dist/shared/hx-spinner-DL5AYr16.js.map +1 -0
  490. package/dist/shared/{hx-split-button-CGcJMmCG.js → hx-split-button-BxDFfx4D.js} +74 -59
  491. package/dist/shared/hx-split-button-BxDFfx4D.js.map +1 -0
  492. package/dist/shared/{hx-split-panel-C-1R10Mc.js → hx-split-panel-B-u0Z3mm.js} +16 -18
  493. package/dist/shared/hx-split-panel-B-u0Z3mm.js.map +1 -0
  494. package/dist/shared/hx-stack-DGfcOfWJ.js.map +1 -1
  495. package/dist/shared/{hx-stat-BTpykQAt.js → hx-stat-WOcNV1Ry.js} +16 -15
  496. package/dist/shared/hx-stat-WOcNV1Ry.js.map +1 -0
  497. package/dist/shared/{hx-status-indicator-X2QEWNFt.js → hx-status-indicator-BlQyen43.js} +17 -16
  498. package/dist/shared/hx-status-indicator-BlQyen43.js.map +1 -0
  499. package/dist/shared/{hx-step-CRNQlmSo.js → hx-step-R2rjp1fT.js} +60 -50
  500. package/dist/shared/hx-step-R2rjp1fT.js.map +1 -0
  501. package/dist/shared/{hx-structured-list-CqNbaEXg.js → hx-structured-list-m_-dMJbC.js} +18 -17
  502. package/dist/shared/hx-structured-list-m_-dMJbC.js.map +1 -0
  503. package/dist/shared/{hx-switch-DqOD9JR7.js → hx-switch-DvAW4YY-.js} +29 -20
  504. package/dist/shared/hx-switch-DvAW4YY-.js.map +1 -0
  505. package/dist/shared/{hx-tab-panel-BIzKfW5i.js → hx-tab-panel-SWOEHuJc.js} +45 -44
  506. package/dist/shared/hx-tab-panel-SWOEHuJc.js.map +1 -0
  507. package/dist/shared/{hx-tag-CgnrNnte.js → hx-tag-CNSmdyaK.js} +63 -62
  508. package/dist/shared/hx-tag-CNSmdyaK.js.map +1 -0
  509. package/dist/shared/{hx-td-Bra35cH4.js → hx-td-DnnEMIuA.js} +62 -62
  510. package/dist/shared/hx-td-DnnEMIuA.js.map +1 -0
  511. package/dist/shared/{hx-text-DMC2CPlL.js → hx-text-Bz_9fJ3J.js} +28 -25
  512. package/dist/shared/hx-text-Bz_9fJ3J.js.map +1 -0
  513. package/dist/shared/{hx-text-input--q0GH78x.js → hx-text-input-Bn7Gn8CI.js} +150 -72
  514. package/dist/shared/hx-text-input-Bn7Gn8CI.js.map +1 -0
  515. package/dist/shared/{hx-textarea-CK621vSL.js → hx-textarea-Jx1xnhgv.js} +108 -68
  516. package/dist/shared/hx-textarea-Jx1xnhgv.js.map +1 -0
  517. package/dist/shared/{hx-theme-DfEy-SJA.js → hx-theme-BiyQ7UUK.js} +46 -35
  518. package/dist/shared/hx-theme-BiyQ7UUK.js.map +1 -0
  519. package/dist/shared/{hx-time-picker-tPUfgElQ.js → hx-time-picker-BoEIZwzv.js} +59 -52
  520. package/dist/shared/hx-time-picker-BoEIZwzv.js.map +1 -0
  521. package/dist/shared/{hx-toggle-button-L-uBJr-a.js → hx-toggle-button-DPAIh_Xo.js} +86 -69
  522. package/dist/shared/hx-toggle-button-DPAIh_Xo.js.map +1 -0
  523. package/dist/shared/{hx-tooltip-B_zfKvwc.js → hx-tooltip-nYOv9OLu.js} +18 -16
  524. package/dist/shared/hx-tooltip-nYOv9OLu.js.map +1 -0
  525. package/dist/shared/{hx-top-nav-CATbRvIv.js → hx-top-nav-DP6OFS8C.js} +31 -30
  526. package/dist/shared/hx-top-nav-DP6OFS8C.js.map +1 -0
  527. package/dist/shared/{hx-tree-item-A45WCiBu.js → hx-tree-item-Dt0Ozqyr.js} +29 -28
  528. package/dist/shared/hx-tree-item-Dt0Ozqyr.js.map +1 -0
  529. package/dist/shared/{toast-factory-BPPnG3mM.js → toast-factory-YSznocIV.js} +98 -72
  530. package/dist/shared/toast-factory-YSznocIV.js.map +1 -0
  531. package/dist/styles/forced-colors.d.ts +60 -0
  532. package/dist/styles/forced-colors.d.ts.map +1 -0
  533. package/figma-inventory.json +8690 -827
  534. package/package.json +2 -2
  535. package/dist/shared/hx-accordion-Wt52OOZD.js.map +0 -1
  536. package/dist/shared/hx-action-bar-BKMADbHj.js.map +0 -1
  537. package/dist/shared/hx-alert-D7n94HwI.js.map +0 -1
  538. package/dist/shared/hx-avatar-iLYzu8MJ.js.map +0 -1
  539. package/dist/shared/hx-badge-CVCmMPyW.js.map +0 -1
  540. package/dist/shared/hx-banner-C_He7Tr4.js.map +0 -1
  541. package/dist/shared/hx-breadcrumb-item-CldCwD1d.js.map +0 -1
  542. package/dist/shared/hx-button-Ddl-T6T-.js.map +0 -1
  543. package/dist/shared/hx-button-group-BJOGWoMa.js.map +0 -1
  544. package/dist/shared/hx-card-ycveujjL.js.map +0 -1
  545. package/dist/shared/hx-carousel-item-D_dCv61-.js.map +0 -1
  546. package/dist/shared/hx-checkbox-DkkoWoye.js.map +0 -1
  547. package/dist/shared/hx-checkbox-group-C3poJ-Zw.js.map +0 -1
  548. package/dist/shared/hx-clinical-status-BS5lcddT.js.map +0 -1
  549. package/dist/shared/hx-code-snippet-B7wUKzyb.js.map +0 -1
  550. package/dist/shared/hx-color-picker-DBaKTVLr.js.map +0 -1
  551. package/dist/shared/hx-combobox-BmgYT7Ar.js.map +0 -1
  552. package/dist/shared/hx-copy-button-8deNUdwP.js.map +0 -1
  553. package/dist/shared/hx-counter-CKfl_g8K.js.map +0 -1
  554. package/dist/shared/hx-data-table-B6h0RPn0.js.map +0 -1
  555. package/dist/shared/hx-date-picker-Dq2Nb68_.js.map +0 -1
  556. package/dist/shared/hx-dialog-CvIlY0Tc.js.map +0 -1
  557. package/dist/shared/hx-divider-DwpOrzMW.js.map +0 -1
  558. package/dist/shared/hx-drawer-Cx2ZJhBe.js.map +0 -1
  559. package/dist/shared/hx-dropdown-BjDrPUq5.js.map +0 -1
  560. package/dist/shared/hx-field-Dp3qQMut.js.map +0 -1
  561. package/dist/shared/hx-field-label-BC8QViXv.js.map +0 -1
  562. package/dist/shared/hx-file-upload-B6Yl1u0i.js.map +0 -1
  563. package/dist/shared/hx-form-ButQFt9A.js +0 -257
  564. package/dist/shared/hx-form-ButQFt9A.js.map +0 -1
  565. package/dist/shared/hx-help-text-D7eytSim.js.map +0 -1
  566. package/dist/shared/hx-icon-CcyDPDYY.js.map +0 -1
  567. package/dist/shared/hx-icon-button-BHneqPCU.js.map +0 -1
  568. package/dist/shared/hx-image-2gt14zZd.js.map +0 -1
  569. package/dist/shared/hx-link-BESrWK8M.js.map +0 -1
  570. package/dist/shared/hx-list-_9qVv02L.js.map +0 -1
  571. package/dist/shared/hx-menu-divider-Ck-9Os1t.js.map +0 -1
  572. package/dist/shared/hx-nav-BcYDmjf7.js.map +0 -1
  573. package/dist/shared/hx-nav-item-pqPasRUm.js.map +0 -1
  574. package/dist/shared/hx-number-input-mOIZ3-46.js.map +0 -1
  575. package/dist/shared/hx-overflow-menu-Dprb9lnT.js.map +0 -1
  576. package/dist/shared/hx-pagination-AguTQjYC.js.map +0 -1
  577. package/dist/shared/hx-patient-banner-uE6gqLpT.js.map +0 -1
  578. package/dist/shared/hx-phi-field-BC_XowhC.js.map +0 -1
  579. package/dist/shared/hx-popover-B2_203ct.js.map +0 -1
  580. package/dist/shared/hx-popup-DZXpsJ1R.js.map +0 -1
  581. package/dist/shared/hx-progress-bar-KjEkEJLy.js.map +0 -1
  582. package/dist/shared/hx-progress-ring-3zMwvrwD.js.map +0 -1
  583. package/dist/shared/hx-radio-BBC5qZgE.js.map +0 -1
  584. package/dist/shared/hx-rating-C3E3ENJb.js.map +0 -1
  585. package/dist/shared/hx-select-CixTo7jp.js.map +0 -1
  586. package/dist/shared/hx-skeleton-LxkI0pxr.js.map +0 -1
  587. package/dist/shared/hx-slider-DFHuzF3N.js.map +0 -1
  588. package/dist/shared/hx-spinner-BKjuCdZB.js.map +0 -1
  589. package/dist/shared/hx-split-button-CGcJMmCG.js.map +0 -1
  590. package/dist/shared/hx-split-panel-C-1R10Mc.js.map +0 -1
  591. package/dist/shared/hx-stat-BTpykQAt.js.map +0 -1
  592. package/dist/shared/hx-status-indicator-X2QEWNFt.js.map +0 -1
  593. package/dist/shared/hx-step-CRNQlmSo.js.map +0 -1
  594. package/dist/shared/hx-structured-list-CqNbaEXg.js.map +0 -1
  595. package/dist/shared/hx-switch-DqOD9JR7.js.map +0 -1
  596. package/dist/shared/hx-tab-panel-BIzKfW5i.js.map +0 -1
  597. package/dist/shared/hx-tag-CgnrNnte.js.map +0 -1
  598. package/dist/shared/hx-td-Bra35cH4.js.map +0 -1
  599. package/dist/shared/hx-text-DMC2CPlL.js.map +0 -1
  600. package/dist/shared/hx-text-input--q0GH78x.js.map +0 -1
  601. package/dist/shared/hx-textarea-CK621vSL.js.map +0 -1
  602. package/dist/shared/hx-theme-DfEy-SJA.js.map +0 -1
  603. package/dist/shared/hx-time-picker-tPUfgElQ.js.map +0 -1
  604. package/dist/shared/hx-toggle-button-L-uBJr-a.js.map +0 -1
  605. package/dist/shared/hx-tooltip-B_zfKvwc.js.map +0 -1
  606. package/dist/shared/hx-top-nav-CATbRvIv.js.map +0 -1
  607. package/dist/shared/hx-tree-item-A45WCiBu.js.map +0 -1
  608. package/dist/shared/toast-factory-BPPnG3mM.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hx-pagination-C7y8GVyU.js","sources":["../../src/components/hx-pagination/hx-pagination.styles.ts","../../src/components/hx-pagination/hx-pagination.ts"],"sourcesContent":["import { css } from 'lit';\n\nexport const helixPaginationStyles = css`\n :host {\n display: block;\n font-family: var(--hx-pagination-font-family, var(--hx-font-family-sans, sans-serif));\n }\n\n .pagination-root {\n display: flex;\n align-items: center;\n gap: var(--hx-space-4, 1rem);\n flex-wrap: wrap;\n }\n\n nav {\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .list {\n display: flex;\n align-items: center;\n gap: var(--hx-pagination-gap, var(--hx-space-1, 0.25rem));\n list-style: none;\n margin: 0;\n padding: 0;\n }\n\n .item {\n display: flex;\n }\n\n .button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: var(--hx-pagination-button-size, var(--hx-touch-target-min, 2.75rem));\n min-height: var(--hx-pagination-button-size, var(--hx-touch-target-min, 2.75rem));\n padding: 0 var(--hx-space-2, 0.5rem);\n border: var(--hx-border-width-thin, 1px) solid\n var(--hx-pagination-border-color, var(--hx-color-border-strong, #66787b));\n border-radius: var(--hx-pagination-border-radius, var(--hx-border-radius-md, 0.375rem));\n background: var(--hx-pagination-bg, var(--hx-color-surface-default, #ffffff));\n color: var(--hx-pagination-color, var(--hx-color-text-primary, #0d1825));\n font-size: var(--hx-font-size-sm, 0.875rem);\n font-family: inherit;\n cursor: pointer;\n transition:\n background-color var(--hx-transition-fast, 150ms) ease,\n border-color var(--hx-transition-fast, 150ms) ease,\n color var(--hx-transition-fast, 150ms) ease;\n text-decoration: none;\n white-space: nowrap;\n }\n\n .button:hover:not(:disabled) {\n background: var(--hx-pagination-hover-bg, var(--hx-color-surface-sunken, #ebeee9));\n border-color: var(--hx-pagination-hover-border-color, var(--hx-color-primary-500, #429797));\n }\n\n .button:focus-visible {\n outline: var(--hx-focus-ring-width, 2px) solid\n var(--hx-pagination-focus-ring-color, var(--hx-focus-ring-color, #0f7078));\n outline-offset: var(--hx-focus-ring-offset, 2px);\n }\n\n .button[aria-current='page'] {\n background: var(--hx-pagination-active-bg, var(--hx-color-primary-500, #429797));\n border-color: var(\n --hx-pagination-active-border-color,\n var(--hx-pagination-active-bg, var(--hx-color-primary-500, #429797))\n );\n color: var(--hx-pagination-active-color, var(--hx-color-text-on-primary, #ffffff));\n font-weight: var(--hx-font-weight-semibold, 600);\n cursor: default;\n pointer-events: none;\n }\n\n .button:disabled {\n opacity: var(--hx-opacity-disabled, 0.5);\n pointer-events: none;\n }\n\n .ellipsis {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: var(--hx-pagination-button-size, var(--hx-touch-target-min, 2.75rem));\n min-height: var(--hx-pagination-button-size, var(--hx-touch-target-min, 2.75rem));\n color: var(--hx-pagination-ellipsis-color, var(--hx-color-text-muted, #4a5362));\n font-size: var(--hx-font-size-sm, 0.875rem);\n user-select: none;\n }\n\n .button[aria-disabled='true'] {\n cursor: default;\n pointer-events: none;\n }\n\n /* Page size selector */\n .page-size-wrapper {\n display: flex;\n align-items: center;\n }\n\n .page-size-label {\n display: flex;\n align-items: center;\n gap: var(--hx-space-2, 0.5rem);\n font-size: var(--hx-font-size-sm, 0.875rem);\n color: var(--hx-pagination-page-size-label-color, var(--hx-color-text-muted, #4a5362));\n white-space: nowrap;\n }\n\n .page-size-select {\n min-height: var(--hx-pagination-button-size, var(--hx-touch-target-min, 2.75rem));\n padding: 0 var(--hx-space-2, 0.5rem);\n border: var(--hx-border-width-thin, 1px) solid\n var(--hx-pagination-border-color, var(--hx-color-border-strong, #66787b));\n border-radius: var(--hx-pagination-border-radius, var(--hx-border-radius-md, 0.375rem));\n background: var(--hx-pagination-bg, var(--hx-color-surface-default, #ffffff));\n color: var(--hx-pagination-color, var(--hx-color-text-primary, #0d1825));\n font-size: var(--hx-font-size-sm, 0.875rem);\n font-family: inherit;\n cursor: pointer;\n }\n\n .page-size-select:focus-visible {\n outline: var(--hx-focus-ring-width, 2px) solid\n var(--hx-pagination-focus-ring-color, var(--hx-focus-ring-color, #0f7078));\n outline-offset: var(--hx-focus-ring-offset, 2px);\n }\n\n /* Visually hidden — used for aria-live status messages */\n .visually-hidden {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n }\n\n @media (prefers-reduced-motion: reduce) {\n .button {\n transition: none;\n }\n }\n\n /* Windows High Contrast / forced-colors support */\n @media (forced-colors: active) {\n .button {\n border: 1px solid ButtonText;\n color: ButtonText;\n background: ButtonFace;\n forced-color-adjust: none;\n }\n\n .button:hover:not(:disabled) {\n border-color: Highlight;\n color: Highlight;\n }\n\n .button:focus-visible {\n outline-color: Highlight;\n }\n\n .button[aria-current='page'] {\n background: Highlight;\n border-color: Highlight;\n color: HighlightText;\n }\n\n .button:disabled {\n color: GrayText;\n border-color: GrayText;\n opacity: 1;\n }\n\n .button[aria-disabled='true'] {\n color: GrayText;\n }\n\n .page-size-select {\n border-color: ButtonText;\n color: ButtonText;\n background: ButtonFace;\n forced-color-adjust: none;\n }\n }\n`;\n","import { html, nothing } from 'lit';\nimport '../../utilities/document-token-adoption.js';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { repeat } from 'lit/directives/repeat.js';\nimport { HelixElement } from '../../base/index.js';\nimport { forcedColorsInteractive } from '../../styles/forced-colors.js';\nimport { helixPaginationStyles } from './hx-pagination.styles.js';\n\n/** Detail for the hx-page-change event dispatched by hx-pagination. */\nexport interface HxPageChangeDetail {\n page: number;\n}\n\n/** Detail for the hx-page-size-change event dispatched by hx-pagination. */\nexport interface HxPageSizeChangeDetail {\n pageSize: number;\n}\n\n/**\n * A pagination component for navigating content listings.\n *\n * @summary Page navigation with page numbers, prev/next, and ellipsis.\n *\n * @tag hx-pagination\n *\n * @csspart nav - The wrapping `<nav>` element.\n * @csspart list - The `<ul>` containing pagination items.\n * @csspart item - Each `<li>` item.\n * @csspart button - Each page button or prev/next control.\n * @csspart ellipsis - The ellipsis (`…`) span between page groups.\n * @csspart page-size-wrapper - The wrapper `<div>` around the page-size selector.\n * @csspart page-size-label - The `<label>` element for the page-size selector.\n * @csspart page-size-select - The `<select>` element for page-size.\n *\n * @cssprop [--hx-pagination-gap=0.25rem] - Gap between pagination buttons. Inherits from --hx-spacing-1.\n * @cssprop [--hx-pagination-button-size=2.25rem] - Minimum width and height of each button.\n * @cssprop [--hx-pagination-border-color] - Border color of buttons. Inherits from --hx-color-border (final fallback: #d1d5db).\n * @cssprop [--hx-pagination-border-radius] - Border radius of buttons. Inherits from --hx-border-radius-md (final fallback: 0.375rem).\n * @cssprop [--hx-pagination-bg] - Background color of buttons. Inherits from --hx-color-surface (final fallback: #ffffff).\n * @cssprop [--hx-pagination-color] - Text color of buttons. Inherits from --hx-color-text-primary (final fallback: #111827).\n * @cssprop [--hx-pagination-hover-bg] - Background color of buttons on hover. Inherits from --hx-color-surface-hover (final fallback: #f3f4f6).\n * @cssprop [--hx-pagination-hover-border-color] - Border color of buttons on hover. Inherits from --hx-color-primary (final fallback: #2563eb).\n * @cssprop [--hx-pagination-active-bg] - Background color of the active/current page button. Inherits from --hx-color-primary (final fallback: #2563eb).\n * @cssprop [--hx-pagination-active-color] - Text color of the active/current page button. Inherits from --hx-color-surface (final fallback: #ffffff).\n * @cssprop [--hx-pagination-active-border-color] - Border color of the active/current page button. Defaults to --hx-pagination-active-bg.\n * @cssprop [--hx-pagination-ellipsis-color] - Color of ellipsis characters. Inherits from --hx-color-text-secondary (final fallback: #6b7280).\n * @cssprop [--hx-transition-fast=150ms] - Duration used for hover/focus transitions.\n *\n * @fires {CustomEvent<{ page: number }>} hx-page-change - Fired when the user navigates to a new page.\n * @fires {CustomEvent<{ pageSize: number }>} hx-page-size-change - Fired when the user selects a new page size.\n *\n * @example\n * ```html\n * <hx-pagination total-pages=\"10\" current-page=\"1\"></hx-pagination>\n * ```\n *\n * @example Drupal / Twig integration\n * ```twig\n * {#\n * Drupal's pager uses 0-based page index in the URL (?page=N).\n * This component is 1-based, so add 1 to the Drupal page value.\n * Listen to hx-page-change and update the URL query param:\n * element.addEventListener('hx-page-change', (e) => {\n * const params = new URLSearchParams(location.search);\n * params.set('page', e.detail.page - 1); // convert back to 0-based\n * history.pushState({}, '', '?' + params.toString());\n * });\n * #}\n * <hx-pagination\n * total-pages=\"{{ total_pages }}\"\n * current-page=\"{{ pager.current_page + 1 }}\"\n * label=\"{{ 'Pagination'|t }}\"\n * {{ show_first_last ? 'show-first-last' : '' }}\n * ></hx-pagination>\n * ```\n * @cssprop [--hx-pagination-font-family=var(--hx-font-family-sans)] - CSS custom property.\n * @cssprop [--hx-font-family-sans] - Font family.\n * @cssprop [--hx-space-4] - Spacing token.\n * @cssprop [--hx-space-1] - Spacing token.\n * @cssprop [--hx-touch-target-min] - Minimum touch target size.\n * @cssprop [--hx-space-2] - Spacing token.\n * @cssprop [--hx-border-width-thin] - Width.\n * @cssprop [--hx-color-neutral-300] - Color.\n * @cssprop [--hx-border-radius-md] - CSS custom property.\n * @cssprop [--hx-color-neutral-0] - Color.\n * @cssprop [--hx-color-neutral-900] - Color.\n * @cssprop [--hx-font-size-sm] - Font size.\n * @cssprop [--hx-color-neutral-100] - Color.\n * @cssprop [--hx-color-primary-500] - Color.\n * @cssprop [--hx-focus-ring-width] - Width.\n * @cssprop [--hx-pagination-focus-ring-color=var(--hx-focus-ring-color)] - Color.\n * @cssprop [--hx-focus-ring-color] - Color.\n * @cssprop [--hx-focus-ring-offset] - CSS custom property.\n * @cssprop [--hx-font-weight-semibold] - Font weight.\n * @cssprop [--hx-opacity-disabled] - Opacity.\n * @cssprop [--hx-color-neutral-500] - Color.\n */\n@customElement('hx-pagination')\nexport class HelixPagination extends HelixElement {\n static override styles = [helixPaginationStyles, forcedColorsInteractive];\n\n /**\n * Total number of pages.\n * @attr total-pages\n */\n @property({ type: Number, attribute: 'total-pages', reflect: true })\n totalPages = 1;\n\n /**\n * The currently active page (1-based).\n * @attr current-page\n */\n @property({ type: Number, attribute: 'current-page' })\n currentPage = 1;\n\n /**\n * Number of page buttons shown on each side of the current page.\n * @attr sibling-count\n */\n @property({ type: Number, attribute: 'sibling-count', reflect: true })\n siblingCount = 1;\n\n /**\n * Number of pages always shown at the start and end of the list.\n * @attr boundary-count\n */\n @property({ type: Number, attribute: 'boundary-count', reflect: true })\n boundaryCount = 1;\n\n /**\n * Whether to show First and Last page buttons.\n * @attr show-first-last\n */\n @property({ type: Boolean, attribute: 'show-first-last', reflect: true })\n showFirstLast = false;\n\n /**\n * Accessible label for the `<nav>` element.\n * @attr label\n */\n @property({ type: String, reflect: true })\n label = 'Pagination';\n\n /**\n * The number of items displayed per page. When set, a page-size selector\n * `<select>` is rendered. Set `show-page-size` to display the selector.\n * @attr page-size\n */\n @property({ type: Number, attribute: 'page-size', reflect: true })\n pageSize = 25;\n\n /**\n * Whether to show the page-size selector UI.\n * @attr show-page-size\n */\n @property({ type: Boolean, attribute: 'show-page-size', reflect: true })\n showPageSize = false;\n\n /**\n * Label text for the rows-per-page selector.\n * @attr label-rows-per-page\n */\n @property({ type: String, attribute: 'label-rows-per-page' })\n labelRowsPerPage = 'Rows per page:';\n\n /**\n * Accessible label for the \"First page\" navigation button.\n * @attr first-page-label\n */\n @property({ attribute: 'first-page-label' })\n firstPageLabel = 'First page';\n\n /**\n * Accessible label for the \"Previous page\" navigation button.\n * @attr previous-page-label\n */\n @property({ attribute: 'previous-page-label' })\n previousPageLabel = 'Previous page';\n\n /**\n * Accessible label for the \"Next page\" navigation button.\n * @attr next-page-label\n */\n @property({ attribute: 'next-page-label' })\n nextPageLabel = 'Next page';\n\n /**\n * Accessible label for the \"Last page\" navigation button.\n * @attr last-page-label\n */\n @property({ attribute: 'last-page-label' })\n lastPageLabel = 'Last page';\n\n /**\n * Function to format the page navigation announcement. Override for i18n.\n */\n @property({ attribute: false })\n labelPageMessage: (current: number, total: number) => string = (current, total) =>\n `Page ${current} of ${total}`;\n\n /**\n * Function to format page button aria-labels. Override for i18n.\n */\n @property({ attribute: false })\n labelPageButton: (page: number) => string = (page) => `Page ${page}`;\n\n /** Tracks the roving tabindex target. Null means default to currentPage. */\n /** @internal */\n @state() private _rovingKey: number | string | null = null;\n\n /** Text for the aria-live region, updated on navigation. */\n /** @internal */\n @state() private _liveMessage = '';\n\n /** Memoization cache for _buildPageRange. */\n /** @internal */\n private _pageRangeCache: { key: string; result: Array<number | 'ellipsis'> } | null = null;\n\n // ─── Helpers ───\n\n /** @internal */\n private _buildPageRange(): Array<number | 'ellipsis'> {\n const key = `${this.totalPages}-${this.currentPage}-${this.siblingCount}-${this.boundaryCount}`;\n if (this._pageRangeCache?.key === key) return this._pageRangeCache.result;\n\n const total = Math.max(1, this.totalPages);\n const current = Math.min(Math.max(1, this.currentPage), total);\n const boundary = Math.max(0, this.boundaryCount);\n const sibling = Math.max(0, this.siblingCount);\n\n const startPages = this._range(1, Math.min(boundary, total));\n const endPages = this._range(Math.max(total - boundary + 1, boundary + 1), total);\n\n const siblingStart = Math.max(\n Math.min(current - sibling, total - boundary - sibling * 2 - 1),\n boundary + 2,\n );\n const siblingEnd = Math.min(\n Math.max(current + sibling, boundary + sibling * 2 + 2),\n endPages.length > 0 ? (endPages[0] ?? total) - 2 : total - 1,\n );\n\n const items: Array<number | 'ellipsis'> = [];\n\n for (const p of startPages) items.push(p);\n\n if (siblingStart > boundary + 2) {\n items.push('ellipsis');\n } else if (boundary + 1 < siblingStart) {\n items.push(boundary + 1);\n }\n\n for (const p of this._range(siblingStart, siblingEnd)) items.push(p);\n\n if (siblingEnd < total - boundary - 1) {\n items.push('ellipsis');\n } else if (siblingEnd < total - boundary) {\n items.push(total - boundary);\n }\n\n for (const p of endPages) items.push(p);\n\n this._pageRangeCache = { key, result: items };\n return items;\n }\n\n /** @internal */\n private _range(start: number, end: number): number[] {\n const result: number[] = [];\n for (let i = start; i <= end; i++) result.push(i);\n return result;\n }\n\n /** @internal */\n private _navigate(page: number): void {\n const clamped = Math.min(Math.max(1, page), this.totalPages);\n if (clamped === this.currentPage) return;\n\n this.currentPage = clamped;\n this._rovingKey = null; // reset so focus follows the new current page\n this._liveMessage = this.labelPageMessage(clamped, this.totalPages);\n this.dispatchEvent(\n new CustomEvent<{ page: number }>('hx-page-change', {\n detail: { page: clamped },\n bubbles: true,\n composed: true,\n }),\n );\n\n // PAGINATION-005: restore focus to the new current-page button after render\n void this.updateComplete.then(() => {\n const btn = this.shadowRoot?.querySelector<HTMLButtonElement>(\n `button[data-roving-key=\"${clamped}\"]`,\n );\n btn?.focus();\n });\n }\n\n /** @internal */\n private _handlePageSizeChange(e: Event): void {\n const select = e.target as HTMLSelectElement;\n const newSize = Number(select.value);\n if (newSize === this.pageSize) return;\n\n this.pageSize = newSize;\n this.dispatchEvent(\n new CustomEvent<{ pageSize: number }>('hx-page-size-change', {\n detail: { pageSize: newSize },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n /** @internal */\n private get _effectiveRovingKey(): number | string {\n return this._rovingKey ?? this.currentPage;\n }\n\n /** @internal */\n private _handleFocusin(e: FocusEvent): void {\n const btn = e.target as HTMLElement;\n if (btn.tagName !== 'BUTTON') return;\n const key = btn.dataset['rovingKey'];\n if (key === undefined) return;\n this._rovingKey = isNaN(Number(key)) ? key : Number(key);\n }\n\n /** @internal */\n private _handleKeydown(e: KeyboardEvent): void {\n if (e.key !== 'ArrowLeft' && e.key !== 'ArrowRight' && e.key !== 'Home' && e.key !== 'End')\n return;\n e.preventDefault();\n\n const list = this.shadowRoot?.querySelector('.list');\n if (!list) return;\n\n // Collect all non-disabled buttons (disabled prev/next excluded; aria-disabled current page included)\n const buttons = Array.from(list.querySelectorAll<HTMLButtonElement>('button:not([disabled])'));\n const focused = this.shadowRoot?.activeElement as HTMLButtonElement | null;\n const currentIdx = focused ? buttons.indexOf(focused) : 0;\n\n let nextIdx: number;\n if (e.key === 'Home') {\n nextIdx = 0;\n } else if (e.key === 'End') {\n nextIdx = buttons.length - 1;\n } else {\n nextIdx =\n e.key === 'ArrowLeft'\n ? Math.max(0, currentIdx - 1)\n : Math.min(buttons.length - 1, currentIdx + 1);\n }\n\n if (nextIdx !== currentIdx || e.key === 'Home' || e.key === 'End') {\n const nextBtn = buttons[nextIdx];\n if (!nextBtn) return;\n const key = nextBtn.dataset['rovingKey'];\n if (key !== undefined) {\n this._rovingKey = isNaN(Number(key)) ? key : Number(key);\n }\n nextBtn.focus();\n }\n }\n\n // ─── Render ───\n\n override render() {\n const pages = this._buildPageRange();\n const isFirst = this.currentPage <= 1;\n const isLast = this.currentPage >= this.totalPages;\n const rovingKey = this._effectiveRovingKey;\n\n return html`\n <div class=\"pagination-root\">\n ${this.showPageSize\n ? html`\n <div part=\"page-size-wrapper\" class=\"page-size-wrapper\">\n <label part=\"page-size-label\" class=\"page-size-label\">\n ${this.labelRowsPerPage}\n <select\n part=\"page-size-select\"\n class=\"page-size-select\"\n @change=${this._handlePageSizeChange}\n >\n ${[10, 25, 50, 100].map(\n (n) =>\n html`<option value=${n} ?selected=${n === this.pageSize}>${n}</option>`,\n )}\n </select>\n </label>\n </div>\n `\n : nothing}\n\n <nav part=\"nav\" aria-label=${this.label}>\n <span class=\"visually-hidden\" aria-live=\"polite\" aria-atomic=\"true\"\n >${this._liveMessage}</span\n >\n <ul\n part=\"list\"\n class=\"list\"\n role=\"list\"\n @keydown=${this._handleKeydown}\n @focusin=${this._handleFocusin}\n >\n ${this.showFirstLast\n ? html`\n <li part=\"item\" class=\"item\">\n <button\n part=\"button\"\n class=\"button\"\n ?disabled=${isFirst}\n tabindex=${rovingKey === 'first' ? 0 : -1}\n data-roving-key=\"first\"\n aria-label=${this.firstPageLabel}\n @click=${() => this._navigate(1)}\n >\n «\n </button>\n </li>\n `\n : nothing}\n\n <li part=\"item\" class=\"item\">\n <button\n part=\"button\"\n class=\"button\"\n ?disabled=${isFirst}\n tabindex=${rovingKey === 'prev' ? 0 : -1}\n data-roving-key=\"prev\"\n aria-label=${this.previousPageLabel}\n @click=${() => this._navigate(this.currentPage - 1)}\n >\n ‹\n </button>\n </li>\n\n ${repeat(\n pages,\n (page, i) => (page === 'ellipsis' ? `ellipsis-${i}` : `page-${page}`),\n (page) => {\n if (page === 'ellipsis') {\n return html`\n <li part=\"item\" class=\"item\">\n <span part=\"ellipsis\" class=\"ellipsis\" aria-hidden=\"true\">…</span>\n </li>\n `;\n }\n const isCurrent = page === this.currentPage;\n return html`\n <li part=\"item\" class=\"item\">\n <button\n part=\"button\"\n class=${classMap({ button: true })}\n aria-disabled=${isCurrent ? 'true' : nothing}\n tabindex=${rovingKey === page ? 0 : -1}\n data-roving-key=${page}\n aria-current=${isCurrent ? 'page' : nothing}\n aria-label=${this.labelPageButton(page)}\n @click=${() => this._navigate(page)}\n >\n ${page}\n </button>\n </li>\n `;\n },\n )}\n\n <li part=\"item\" class=\"item\">\n <button\n part=\"button\"\n class=\"button\"\n ?disabled=${isLast}\n tabindex=${rovingKey === 'next' ? 0 : -1}\n data-roving-key=\"next\"\n aria-label=${this.nextPageLabel}\n @click=${() => this._navigate(this.currentPage + 1)}\n >\n ›\n </button>\n </li>\n\n ${this.showFirstLast\n ? html`\n <li part=\"item\" class=\"item\">\n <button\n part=\"button\"\n class=\"button\"\n ?disabled=${isLast}\n tabindex=${rovingKey === 'last' ? 0 : -1}\n data-roving-key=\"last\"\n aria-label=${this.lastPageLabel}\n @click=${() => this._navigate(this.totalPages)}\n >\n »\n </button>\n </li>\n `\n : nothing}\n </ul>\n </nav>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'hx-pagination': HelixPagination;\n }\n}\n\n/** Canonical type alias for HelixPagination. Use this when typing hx-pagination element references. */\nexport type HxPagination = HelixPagination;\n"],"names":["helixPaginationStyles","css","HelixPagination","HelixElement","current","total","page","key","_a","boundary","sibling","startPages","endPages","siblingStart","siblingEnd","items","p","start","end","result","i","clamped","btn","e","select","newSize","list","buttons","focused","_b","currentIdx","nextIdx","nextBtn","pages","isFirst","isLast","rovingKey","html","n","nothing","repeat","isCurrent","classMap","forcedColorsInteractive","__decorateClass","property","state","customElement"],"mappings":"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"}
@@ -1,26 +1,29 @@
1
- import { css as f, nothing as p, html as b } from "lit";
2
- import { property as i, state as c, query as h, customElement as v } from "lit/decorators.js";
3
- import { H as u } from "./helix-element-BNEYeiys.js";
4
- const _ = f`
1
+ import { css as v, nothing as p, html as b } from "lit";
2
+ import { property as i, state as c, query as h, customElement as f } from "lit/decorators.js";
3
+ import { a as u } from "./forced-colors-CTEDFRGa.js";
4
+ import { H as m } from "./helix-element-BNEYeiys.js";
5
+ const _ = v`
5
6
  :host {
6
7
  display: block;
7
8
  width: 100%;
8
9
 
9
10
  /* ─── Private token vars (3-tier cascade) ─── */
10
- --_bg: var(--hx-patient-banner-bg, var(--hx-color-neutral-50, #f8fafc));
11
- --_border-color: var(--hx-patient-banner-border-color, var(--hx-color-neutral-200, #e2e8f0));
11
+ --_bg: var(--hx-patient-banner-bg, var(--hx-color-neutral-50, #f5f8f3));
12
+ --_border-color: var(--hx-patient-banner-border-color, var(--hx-color-neutral-200, #d6dbd5));
12
13
  --_padding: var(
13
14
  --hx-patient-banner-padding,
14
15
  var(--hx-space-3, 0.75rem) var(--hx-space-4, 1rem)
15
16
  );
16
17
  --_gap: var(--hx-patient-banner-gap, var(--hx-space-4, 1rem));
17
18
  --_font-family: var(--hx-patient-banner-font-family, var(--hx-font-family-sans, sans-serif));
18
- --_label-color: var(--hx-patient-banner-label-color, var(--hx-color-neutral-500, #64748b));
19
+ /* neutral-500 (#66787B) on neutral-50 (#F5F8F3) = 4.32:1 — fails AA body text.
20
+ text-muted resolves to neutral-600 (#4A5362) = 7.36:1 — AA pass everywhere. */
21
+ --_label-color: var(--hx-patient-banner-label-color, var(--hx-color-text-muted, #4a5362));
19
22
  --_label-font-size: var(--hx-patient-banner-label-font-size, var(--hx-font-size-xs, 0.75rem));
20
- --_value-color: var(--hx-patient-banner-value-color, var(--hx-color-neutral-900, #0f172a));
23
+ --_value-color: var(--hx-patient-banner-value-color, var(--hx-color-neutral-900, #0d1825));
21
24
  --_value-font-size: var(--hx-patient-banner-value-font-size, var(--hx-font-size-sm, 0.875rem));
22
25
  --_photo-size: var(--hx-patient-banner-photo-size, var(--hx-space-10, 2.5rem));
23
- --_photo-bg: var(--hx-patient-banner-photo-bg, var(--hx-color-neutral-200, #e2e8f0));
26
+ --_photo-bg: var(--hx-patient-banner-photo-bg, var(--hx-color-neutral-200, #d6dbd5));
24
27
  }
25
28
 
26
29
  * {
@@ -99,10 +102,13 @@ const _ = f`
99
102
  /* Visual indicator when Joint Commission two-identifier rule is not met. */
100
103
 
101
104
  :host([aria-invalid='true']) .banner {
102
- border-bottom-color: var(--hx-color-error-400, #f87171);
103
- background-color: var(--hx-color-error-50, #fef2f2);
105
+ border-bottom-color: var(
106
+ --hx-patient-banner-invalid-border-color,
107
+ var(--hx-color-error-400, #fc7264)
108
+ );
109
+ background-color: var(--hx-patient-banner-invalid-bg, var(--hx-color-error-50, #fff2f0));
104
110
  /* Darken label color to maintain 4.5:1 contrast on error-50 background. */
105
- --_label-color: var(--hx-patient-banner-label-color, var(--hx-color-neutral-700, #334155));
111
+ --_label-color: var(--hx-patient-banner-label-color, var(--hx-color-neutral-700, #313e4b));
106
112
  }
107
113
 
108
114
  :host([aria-invalid='true']) .banner::before {
@@ -113,7 +119,10 @@ const _ = f`
113
119
  top: 0;
114
120
  bottom: 0;
115
121
  width: var(--hx-border-width-thick, 4px);
116
- background-color: var(--hx-color-error-500, #dc2626);
122
+ background-color: var(
123
+ --hx-patient-banner-invalid-accent-color,
124
+ var(--hx-color-error-500, #e5493e)
125
+ );
117
126
  border-radius: 0;
118
127
  }
119
128
 
@@ -161,12 +170,12 @@ const _ = f`
161
170
  }
162
171
  }
163
172
  `;
164
- var m = Object.defineProperty, g = Object.getOwnPropertyDescriptor, a = (e, l, o, n) => {
165
- for (var r = n > 1 ? void 0 : n ? g(l, o) : l, s = e.length - 1, d; s >= 0; s--)
173
+ var g = Object.defineProperty, x = Object.getOwnPropertyDescriptor, a = (e, l, o, n) => {
174
+ for (var r = n > 1 ? void 0 : n ? x(l, o) : l, s = e.length - 1, d; s >= 0; s--)
166
175
  (d = e[s]) && (r = (n ? d(l, o, r) : d(r)) || r);
167
- return n && r && m(l, o, r), r;
176
+ return n && r && g(l, o, r), r;
168
177
  };
169
- let t = class extends u {
178
+ let t = class extends m {
170
179
  constructor() {
171
180
  super(...arguments), this.patientId = "", this.labelPatient = "Patient identification", this.labelName = "Patient name", this.labelMrn = "MRN", this.labelDob = "Date of birth", this.labelAllergies = "Allergies", this.labelCodeStatus = "Code status", this.enforceIdentifierRule = !0, this._identifierCount = 0, this._isViolating = !1;
172
181
  }
@@ -261,7 +270,7 @@ let t = class extends u {
261
270
  `;
262
271
  }
263
272
  };
264
- t.styles = [_];
273
+ t.styles = [_, u];
265
274
  a([
266
275
  i({ type: String, attribute: "patient-id" })
267
276
  ], t.prototype, "patientId", 2);
@@ -309,9 +318,9 @@ a([
309
318
  h('slot[name="dob"]')
310
319
  ], t.prototype, "_dobSlot", 2);
311
320
  t = a([
312
- v("hx-patient-banner")
321
+ f("hx-patient-banner")
313
322
  ], t);
314
323
  export {
315
324
  t as H
316
325
  };
317
- //# sourceMappingURL=hx-patient-banner-uE6gqLpT.js.map
326
+ //# sourceMappingURL=hx-patient-banner-CkS-Lmj4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hx-patient-banner-CkS-Lmj4.js","sources":["../../src/components/hx-patient-banner/hx-patient-banner.styles.ts","../../src/components/hx-patient-banner/hx-patient-banner.ts"],"sourcesContent":["import { css } from 'lit';\n\nexport const helixPatientBannerStyles = css`\n :host {\n display: block;\n width: 100%;\n\n /* ─── Private token vars (3-tier cascade) ─── */\n --_bg: var(--hx-patient-banner-bg, var(--hx-color-neutral-50, #f5f8f3));\n --_border-color: var(--hx-patient-banner-border-color, var(--hx-color-neutral-200, #d6dbd5));\n --_padding: var(\n --hx-patient-banner-padding,\n var(--hx-space-3, 0.75rem) var(--hx-space-4, 1rem)\n );\n --_gap: var(--hx-patient-banner-gap, var(--hx-space-4, 1rem));\n --_font-family: var(--hx-patient-banner-font-family, var(--hx-font-family-sans, sans-serif));\n /* neutral-500 (#66787B) on neutral-50 (#F5F8F3) = 4.32:1 — fails AA body text.\n text-muted resolves to neutral-600 (#4A5362) = 7.36:1 — AA pass everywhere. */\n --_label-color: var(--hx-patient-banner-label-color, var(--hx-color-text-muted, #4a5362));\n --_label-font-size: var(--hx-patient-banner-label-font-size, var(--hx-font-size-xs, 0.75rem));\n --_value-color: var(--hx-patient-banner-value-color, var(--hx-color-neutral-900, #0d1825));\n --_value-font-size: var(--hx-patient-banner-value-font-size, var(--hx-font-size-sm, 0.875rem));\n --_photo-size: var(--hx-patient-banner-photo-size, var(--hx-space-10, 2.5rem));\n --_photo-bg: var(--hx-patient-banner-photo-bg, var(--hx-color-neutral-200, #d6dbd5));\n }\n\n * {\n box-sizing: border-box;\n }\n\n /* ─── Banner Container ─── */\n\n .banner {\n display: flex;\n align-items: center;\n gap: var(--_gap);\n padding: var(--_padding);\n background-color: var(--_bg);\n border-bottom: var(--hx-border-width-thin, 1px) solid var(--_border-color);\n font-family: var(--_font-family);\n width: 100%;\n position: relative;\n }\n\n /* ─── Photo Area ─── */\n\n .banner__photo-area {\n flex-shrink: 0;\n width: var(--_photo-size);\n height: var(--_photo-size);\n /* Minimum touch target for interactive photo content (WCAG 2.5.8). */\n min-width: var(--hx-touch-target-size, 44px);\n min-height: var(--hx-touch-target-size, 44px);\n border-radius: var(--hx-border-radius-full, 9999px);\n overflow: hidden;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: var(--_photo-bg);\n }\n\n /* ─── Fields Grid ─── */\n\n .banner__fields {\n display: flex;\n flex-wrap: wrap;\n gap: var(--_gap);\n flex: 1;\n min-width: 0;\n }\n\n /* ─── Individual Field ─── */\n\n .field {\n display: flex;\n flex-direction: column;\n gap: var(--hx-space-1, 0.25rem);\n min-width: 0;\n }\n\n .field__label {\n font-size: var(--_label-font-size);\n color: var(--_label-color);\n font-weight: var(--hx-font-weight-medium, 500);\n line-height: var(--hx-line-height-tight, 1.25);\n white-space: nowrap;\n }\n\n .field__value {\n font-size: var(--_value-font-size);\n color: var(--_value-color);\n font-weight: var(--hx-font-weight-normal, 400);\n line-height: var(--hx-line-height-normal, 1.5);\n display: flex;\n align-items: center;\n gap: var(--hx-space-1, 0.25rem);\n }\n\n /* ─── Identifier Rule Violation ─── */\n /* Visual indicator when Joint Commission two-identifier rule is not met. */\n\n :host([aria-invalid='true']) .banner {\n border-bottom-color: var(\n --hx-patient-banner-invalid-border-color,\n var(--hx-color-error-400, #fc7264)\n );\n background-color: var(--hx-patient-banner-invalid-bg, var(--hx-color-error-50, #fff2f0));\n /* Darken label color to maintain 4.5:1 contrast on error-50 background. */\n --_label-color: var(--hx-patient-banner-label-color, var(--hx-color-neutral-700, #313e4b));\n }\n\n :host([aria-invalid='true']) .banner::before {\n content: '';\n display: block;\n position: absolute;\n inset-inline-start: 0;\n top: 0;\n bottom: 0;\n width: var(--hx-border-width-thick, 4px);\n background-color: var(\n --hx-patient-banner-invalid-accent-color,\n var(--hx-color-error-500, #e5493e)\n );\n border-radius: 0;\n }\n\n /* ─── Visually-hidden violation live region ─── */\n /* Announces identifier rule violations to screen readers without visible text. */\n\n .violation-message {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border-width: 0;\n }\n\n /* ─── Motion reduction ─── */\n\n @media (prefers-reduced-motion: reduce) {\n * {\n transition: none !important;\n animation: none !important;\n }\n }\n\n /* ─── Forced Colors (Windows High Contrast) ─── */\n\n @media (forced-colors: active) {\n .banner {\n border-bottom-color: CanvasText;\n }\n\n :host([aria-invalid='true']) .banner {\n border-bottom-color: LinkText;\n }\n\n :host([aria-invalid='true']) .banner::before {\n background-color: LinkText;\n }\n\n .banner__photo-area {\n border: 1px solid CanvasText;\n }\n }\n`;\n","import { html, nothing, type PropertyValues } from 'lit';\nimport '../../utilities/document-token-adoption.js';\nimport { customElement, property, state, query } from 'lit/decorators.js';\nimport { HelixElement } from '../../base/index.js';\nimport { helixPatientBannerStyles } from './hx-patient-banner.styles.js';\nimport { forcedColorsSurface } from '../../styles/forced-colors.js';\n\n/**\n * Patient identification banner implementing Joint Commission NPSG.01.01.01 two-identifier rule.\n * Renders as a landmark region containing named slots for patient identification fields.\n * Integrates with hx-phi-field for HIPAA-compliant display of masked identifiers.\n *\n * ## Security Model — Event Composition\n *\n * This component dispatches and propagates two categories of composed events:\n *\n * ### `hx-identifier-rule-violation` (dispatched by this component)\n * Fired with `composed: true` when the two-identifier rule is violated. The event detail\n * contains only structural metadata (`populatedIdentifiers` count, `requiredIdentifiers`\n * count) and the `patientId` attribute value. **No raw PHI is included.**\n *\n * The `patientId` is a developer-provided attribute intended as a correlation key for\n * application logic — it should be an opaque internal identifier (e.g., a UUID or\n * encounter ID), not a human-readable identifier like an MRN or SSN.\n *\n * ### `hx-phi-access` (bubbles from slotted hx-phi-field children)\n * Slotted `hx-phi-field` elements dispatch `hx-phi-access` with `composed: true`. These\n * events bubble through this component's shadow DOM via slot projection. This component\n * does NOT re-dispatch or modify these events. See `hx-phi-field` documentation for the\n * security model of those events.\n *\n * ### Consumer Responsibilities\n *\n * - **Multi-tenant isolation**: In micro-frontend architectures where multiple patient\n * contexts share a document, scope event listeners to the appropriate DOM subtree.\n * Both `hx-phi-access` and `hx-identifier-rule-violation` use `composed: true` and\n * will bubble through shared ancestors across shadow boundaries.\n * - **patientId hygiene**: Set the `patient-id` attribute to an opaque internal\n * identifier, not a human-readable clinical identifier. This value appears in\n * composed events that cross shadow boundaries.\n *\n * @summary Patient identification banner with two-identifier rule enforcement.\n *\n * @tag hx-patient-banner\n *\n * @slot photo - Optional patient photo slot.\n * @slot name - Patient name field content.\n * @slot mrn - Medical record number field content. Use hx-phi-field for HIPAA compliance.\n * @slot dob - Date of birth field content. Use hx-phi-field for HIPAA compliance.\n * @slot allergies - Allergy status/flag content.\n * @slot code-status - Code status content.\n *\n * @csspart banner - The outer banner container.\n * @csspart photo-area - The photo slot wrapper.\n * @csspart fields - The fields grid container.\n * @csspart field - An individual field container (applied to all field wrappers).\n * @csspart field-label - The field label element.\n * @csspart field-value - The field value slot wrapper.\n * @csspart violation-message - The visually-hidden identifier rule violation status message.\n *\n * @fires {CustomEvent<PatientIdentifierRuleViolationDetail>} hx-identifier-rule-violation -\n * Fired when fewer than 2 identifier slots are populated and enforce-identifier-rule is\n * true. Contains structural metadata only — no raw PHI. Dispatched with `composed: true`.\n *\n * @cssprop [--hx-patient-banner-bg=var(--hx-color-neutral-50,#f9fafb)] - Banner background color.\n * @cssprop [--hx-patient-banner-border-color=var(--hx-color-neutral-200,#e5e7eb)] - Banner border color.\n * @cssprop [--hx-patient-banner-padding=var(--hx-space-3,0.75rem) var(--hx-space-4,1rem)] - Banner padding.\n * @cssprop [--hx-patient-banner-gap=var(--hx-space-4,1rem)] - Gap between banner fields.\n * @cssprop [--hx-patient-banner-font-family=var(--hx-font-family-sans,sans-serif)] - Banner font family.\n * @cssprop [--hx-patient-banner-label-color=var(--hx-color-neutral-500,#6b7280)] - Field label color.\n * @cssprop [--hx-patient-banner-label-font-size=var(--hx-font-size-xs,0.75rem)] - Field label font size.\n * @cssprop [--hx-patient-banner-value-color=var(--hx-color-neutral-900,#111827)] - Field value color.\n * @cssprop [--hx-patient-banner-value-font-size=var(--hx-font-size-sm,0.875rem)] - Field value font size.\n * @cssprop [--hx-patient-banner-photo-size=var(--hx-space-10,2.5rem)] - Photo area size.\n * @cssprop [--hx-patient-banner-photo-bg=var(--hx-color-neutral-200,#e5e7eb)] - Photo area background color when empty.\n * @cssprop [--hx-color-neutral-50] - Color.\n * @cssprop [--hx-color-neutral-200] - Color.\n * @cssprop [--hx-space-3] - Spacing token.\n * @cssprop [--hx-space-4] - Spacing token.\n * @cssprop [--hx-font-family-sans] - Font family.\n * @cssprop [--hx-color-neutral-500] - Color.\n * @cssprop [--hx-font-size-xs] - Font size.\n * @cssprop [--hx-color-neutral-900] - Color.\n * @cssprop [--hx-font-size-sm] - Font size.\n * @cssprop [--hx-space-10] - Spacing token.\n * @cssprop [--hx-border-width-thin] - Width.\n * @cssprop [--hx-touch-target-size] - Minimum touch target size.\n * @cssprop [--hx-border-radius-full] - CSS custom property.\n * @cssprop [--hx-space-1] - Spacing token.\n * @cssprop [--hx-font-weight-medium] - Font weight.\n * @cssprop [--hx-line-height-tight] - Line height.\n * @cssprop [--hx-font-weight-normal] - Font weight.\n * @cssprop [--hx-line-height-normal] - Line height.\n * @cssprop [--hx-color-error-400] - Color.\n * @cssprop [--hx-color-error-50] - Color.\n * @cssprop [--hx-color-neutral-700] - Color.\n * @cssprop [--hx-border-width-thick] - Width.\n * @cssprop [--hx-color-error-500] - Color.\n */\n@customElement('hx-patient-banner')\nexport class HelixPatientBanner extends HelixElement {\n static override styles = [helixPatientBannerStyles, forcedColorsSurface];\n\n // ─── Public Properties ───\n\n /**\n * Optional patient ID used as context in identifier rule violation events.\n * @attr patient-id\n */\n @property({ type: String, attribute: 'patient-id' })\n patientId: string = '';\n\n /**\n * Accessible label for the banner landmark region.\n * @attr label-patient\n */\n @property({ type: String, attribute: 'label-patient' })\n labelPatient: string = 'Patient identification';\n\n /**\n * Visible label for the name field.\n * @attr label-name\n */\n @property({ type: String, attribute: 'label-name' })\n labelName: string = 'Patient name';\n\n /**\n * Visible label for the MRN field.\n * @attr label-mrn\n */\n @property({ type: String, attribute: 'label-mrn' })\n labelMrn: string = 'MRN';\n\n /**\n * Visible label for the date of birth field.\n * @attr label-dob\n */\n @property({ type: String, attribute: 'label-dob' })\n labelDob: string = 'Date of birth';\n\n /**\n * Visible label for the allergies field.\n * @attr label-allergies\n */\n @property({ type: String, attribute: 'label-allergies' })\n labelAllergies: string = 'Allergies';\n\n /**\n * Visible label for the code status field.\n * @attr label-code-status\n */\n @property({ type: String, attribute: 'label-code-status' })\n labelCodeStatus: string = 'Code status';\n\n /**\n * Whether to enforce the Joint Commission NPSG.01.01.01 two-identifier rule.\n * When true, fires hx-identifier-rule-violation if fewer than 2 identifier\n * slots (name, mrn, dob) are populated.\n * @attr enforce-identifier-rule\n */\n @property({\n attribute: 'enforce-identifier-rule',\n reflect: true,\n converter: {\n fromAttribute: (value: string | null) => value !== 'false',\n toAttribute: (value: boolean) => String(value),\n },\n })\n enforceIdentifierRule: boolean = true;\n\n // ─── Internal State ───\n\n /** @internal */\n @state() private _identifierCount: number = 0;\n\n /** @internal */\n @state() private _isViolating: boolean = false;\n\n // ─── Slot Queries ───\n\n /** @internal */\n @query('slot[name=\"name\"]') private _nameSlot!: HTMLSlotElement | null;\n\n /** @internal */\n @query('slot[name=\"mrn\"]') private _mrnSlot!: HTMLSlotElement | null;\n\n /** @internal */\n @query('slot[name=\"dob\"]') private _dobSlot!: HTMLSlotElement | null;\n\n // ─── Lifecycle ───\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.setAttribute('role', 'banner');\n this.setAttribute('aria-label', this.labelPatient);\n }\n\n protected override updated(changedProperties: PropertyValues<this>): void {\n super.updated(changedProperties);\n\n if (changedProperties.has('labelPatient')) {\n this.setAttribute('aria-label', this.labelPatient);\n }\n\n if (changedProperties.has('enforceIdentifierRule')) {\n this._checkIdentifierRule();\n }\n }\n\n // ─── Private Helpers ───\n\n private _countPopulatedIdentifiers(): number {\n let count = 0;\n\n const slots = [this._nameSlot, this._mrnSlot, this._dobSlot];\n for (const slot of slots) {\n if (slot && slot.assignedNodes({ flatten: true }).length > 0) {\n count++;\n }\n }\n\n return count;\n }\n\n private _checkIdentifierRule(): void {\n const count = this._countPopulatedIdentifiers();\n this._identifierCount = count;\n\n if (this.enforceIdentifierRule && count < 2) {\n this._isViolating = true;\n this.setAttribute('aria-invalid', 'true');\n this.dispatchEvent(\n new CustomEvent<PatientIdentifierRuleViolationDetail>('hx-identifier-rule-violation', {\n bubbles: true,\n composed: true,\n detail: {\n populatedIdentifiers: count,\n requiredIdentifiers: 2,\n patientId: this.patientId,\n },\n }),\n );\n } else {\n this._isViolating = false;\n this.removeAttribute('aria-invalid');\n }\n }\n\n // ─── Event Handlers ───\n\n private _handleSlotChange(): void {\n this._checkIdentifierRule();\n }\n\n // ─── Render ───\n\n override render() {\n const violationMessage = this._isViolating\n ? `Warning: patient identification incomplete. ${this._identifierCount} of 2 required identifiers present.`\n : nothing;\n\n return html`\n <div part=\"banner\" class=\"banner\">\n <div part=\"photo-area\" class=\"banner__photo-area\" aria-hidden=\"true\">\n <slot name=\"photo\"></slot>\n </div>\n\n <div part=\"fields\" class=\"banner__fields\">\n <div part=\"field\" class=\"field\">\n <span part=\"field-label\" class=\"field__label\">${this.labelName}</span>\n <div part=\"field-value\" class=\"field__value\">\n <slot name=\"name\" @slotchange=${this._handleSlotChange}></slot>\n </div>\n </div>\n\n <div part=\"field\" class=\"field\">\n <span part=\"field-label\" class=\"field__label\">${this.labelMrn}</span>\n <div part=\"field-value\" class=\"field__value\">\n <slot name=\"mrn\" @slotchange=${this._handleSlotChange}></slot>\n </div>\n </div>\n\n <div part=\"field\" class=\"field\">\n <span part=\"field-label\" class=\"field__label\">${this.labelDob}</span>\n <div part=\"field-value\" class=\"field__value\">\n <slot name=\"dob\" @slotchange=${this._handleSlotChange}></slot>\n </div>\n </div>\n\n <div part=\"field\" class=\"field\">\n <span part=\"field-label\" class=\"field__label\">${this.labelAllergies}</span>\n <div part=\"field-value\" class=\"field__value\">\n <slot name=\"allergies\"></slot>\n </div>\n </div>\n\n <div part=\"field\" class=\"field\">\n <span part=\"field-label\" class=\"field__label\">${this.labelCodeStatus}</span>\n <div part=\"field-value\" class=\"field__value\">\n <slot name=\"code-status\"></slot>\n </div>\n </div>\n </div>\n </div>\n\n ${violationMessage !== nothing\n ? html`<div\n part=\"violation-message\"\n class=\"violation-message\"\n role=\"alert\"\n aria-live=\"assertive\"\n >\n ${violationMessage}\n </div>`\n : nothing}\n `;\n }\n}\n\n/**\n * Event detail for identifier rule violations. Contains only structural metadata\n * about the validation state — never raw PHI values.\n *\n * **Security note**: The `patientId` field reflects the `patient-id` HTML attribute,\n * which should be set to an opaque internal identifier (UUID, encounter ID), not a\n * human-readable clinical identifier. This value crosses shadow DOM boundaries via\n * `composed: true` events.\n */\nexport interface PatientIdentifierRuleViolationDetail {\n /** Number of identifier slots currently populated (0, 1, or 2). */\n populatedIdentifiers: number;\n /** Minimum required identifiers per NPSG.01.01.01 (always 2). */\n requiredIdentifiers: number;\n /** Opaque patient identifier from the patient-id attribute. Should NOT contain raw PHI. */\n patientId: string;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'hx-patient-banner': HelixPatientBanner;\n }\n}\n"],"names":["helixPatientBannerStyles","css","HelixPatientBanner","HelixElement","changedProperties","count","slots","slot","violationMessage","nothing","html","forcedColorsSurface","__decorateClass","property","value","state","query","customElement"],"mappings":"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"}
@@ -1,8 +1,9 @@
1
1
  import { css as c, html as h } from "lit";
2
2
  import { classMap as u } from "lit/directives/class-map.js";
3
3
  import { property as n, state as p, customElement as f } from "lit/decorators.js";
4
- import { H as m } from "./helix-element-BNEYeiys.js";
5
- const _ = c`
4
+ import { b as m } from "./forced-colors-CTEDFRGa.js";
5
+ import { H as _ } from "./helix-element-BNEYeiys.js";
6
+ const b = c`
6
7
  :host {
7
8
  display: inline-flex;
8
9
  }
@@ -21,12 +22,12 @@ const _ = c`
21
22
  .phi-field__value--masked {
22
23
  user-select: none;
23
24
  -webkit-user-select: none;
24
- color: var(--hx-phi-field-masked-color, var(--hx-color-neutral-500, #64748b));
25
+ color: var(--hx-phi-field-masked-color, var(--hx-color-text-muted, #4a5362));
25
26
  letter-spacing: var(--hx-phi-field-letter-spacing, 0.1em);
26
27
  }
27
28
 
28
29
  .phi-field__value--revealed {
29
- color: var(--hx-phi-field-value-color, var(--hx-color-neutral-900, #0f172a));
30
+ color: var(--hx-phi-field-value-color, var(--hx-color-text-primary, #0d1825));
30
31
  }
31
32
 
32
33
  /* ─── Screen Reader Status ─── */
@@ -54,7 +55,7 @@ const _ = c`
54
55
  padding: var(--hx-space-1, 0.25rem);
55
56
  min-width: var(--hx-touch-target-min, 2.75rem);
56
57
  min-height: var(--hx-touch-target-min, 2.75rem);
57
- color: var(--hx-phi-field-toggle-color, var(--hx-color-primary-500, #2563eb));
58
+ color: var(--hx-phi-field-toggle-color, var(--hx-color-primary-500, #429797));
58
59
  cursor: pointer;
59
60
  line-height: 1;
60
61
  border-radius: var(--hx-border-radius-sm, 0.25rem);
@@ -62,10 +63,7 @@ const _ = c`
62
63
 
63
64
  .phi-field__toggle:focus-visible {
64
65
  outline: var(--hx-focus-ring-width, 2px) solid
65
- var(
66
- --hx-phi-field-focus-ring-color,
67
- var(--hx-focus-ring-color, var(--hx-color-primary-500, #2563eb))
68
- );
66
+ var(--hx-phi-field-focus-ring-color, var(--hx-focus-ring-color, #0f7078));
69
67
  outline-offset: var(--hx-focus-ring-offset, 2px);
70
68
  }
71
69
 
@@ -117,12 +115,12 @@ const _ = c`
117
115
  }
118
116
  }
119
117
  `;
120
- var b = Object.defineProperty, v = Object.getOwnPropertyDescriptor, r = (e, t, s, o) => {
121
- for (var a = o > 1 ? void 0 : o ? v(t, s) : t, l = e.length - 1, d; l >= 0; l--)
118
+ var v = Object.defineProperty, g = Object.getOwnPropertyDescriptor, r = (e, t, s, o) => {
119
+ for (var a = o > 1 ? void 0 : o ? g(t, s) : t, l = e.length - 1, d; l >= 0; l--)
122
120
  (d = e[l]) && (a = (o ? d(t, s, a) : d(a)) || a);
123
- return o && a && b(t, s, a), a;
121
+ return o && a && v(t, s, a), a;
124
122
  };
125
- let i = class extends m {
123
+ let i = class extends _ {
126
124
  constructor() {
127
125
  super(...arguments), this.data = "", this.fieldType = "ssn", this.fieldId = "", this.clipboardTimeout = 3e4, this.label = "", this.autoHideDelay = 60, this.disabled = !1, this._masked = !0, this._clipboardTimer = null, this._autoHideTimer = null, this._boundHandleVisibilityChange = () => {
128
126
  document.visibilityState === "hidden" && (this._masked && this._clipboardTimer === null || this._clearClipboard());
@@ -353,7 +351,7 @@ let i = class extends m {
353
351
  `;
354
352
  }
355
353
  };
356
- i.styles = [_];
354
+ i.styles = [b, m];
357
355
  i._AUTO_HIDE_INTERACTION_EVENTS = [
358
356
  "mouseenter",
359
357
  "mousemove",
@@ -391,4 +389,4 @@ i = r([
391
389
  export {
392
390
  i as H
393
391
  };
394
- //# sourceMappingURL=hx-phi-field-BC_XowhC.js.map
392
+ //# sourceMappingURL=hx-phi-field-C19oxlrr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hx-phi-field-C19oxlrr.js","sources":["../../src/components/hx-phi-field/hx-phi-field.styles.ts","../../src/components/hx-phi-field/hx-phi-field.ts"],"sourcesContent":["import { css } from 'lit';\n\nexport const helixPhiFieldStyles = css`\n :host {\n display: inline-flex;\n }\n\n /* ─── Container ─── */\n\n .phi-field {\n display: inline-flex;\n align-items: center;\n gap: var(--hx-space-2, 0.5rem);\n font-family: var(--hx-phi-field-font-family, var(--hx-font-family-mono, monospace));\n }\n\n /* ─── Value ─── */\n\n .phi-field__value--masked {\n user-select: none;\n -webkit-user-select: none;\n color: var(--hx-phi-field-masked-color, var(--hx-color-text-muted, #4a5362));\n letter-spacing: var(--hx-phi-field-letter-spacing, 0.1em);\n }\n\n .phi-field__value--revealed {\n color: var(--hx-phi-field-value-color, var(--hx-color-text-primary, #0d1825));\n }\n\n /* ─── Screen Reader Status ─── */\n\n .phi-field__status {\n position: absolute;\n width: 1px;\n height: 1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n padding: 0;\n margin: -1px;\n }\n\n /* ─── Toggle Button ─── */\n\n .phi-field__toggle {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n background: none;\n border: none;\n padding: var(--hx-space-1, 0.25rem);\n min-width: var(--hx-touch-target-min, 2.75rem);\n min-height: var(--hx-touch-target-min, 2.75rem);\n color: var(--hx-phi-field-toggle-color, var(--hx-color-primary-500, #429797));\n cursor: pointer;\n line-height: 1;\n border-radius: var(--hx-border-radius-sm, 0.25rem);\n }\n\n .phi-field__toggle:focus-visible {\n outline: var(--hx-focus-ring-width, 2px) solid\n var(--hx-phi-field-focus-ring-color, var(--hx-focus-ring-color, #0f7078));\n outline-offset: var(--hx-focus-ring-offset, 2px);\n }\n\n .phi-field__toggle:hover {\n opacity: var(--hx-opacity-90, 0.9);\n }\n\n .phi-field__toggle:active {\n opacity: var(--hx-opacity-50, 0.5);\n }\n\n .phi-field__toggle svg {\n width: 1em;\n height: 1em;\n pointer-events: none;\n }\n\n /* ─── Disabled State ─── */\n\n :host([disabled]) {\n opacity: var(--hx-phi-field-disabled-opacity, var(--hx-opacity-50, 0.5));\n pointer-events: none;\n cursor: not-allowed;\n }\n\n .phi-field--disabled .phi-field__toggle {\n cursor: not-allowed;\n }\n\n /* ─── Reduced Motion ─── */\n\n @media (prefers-reduced-motion: reduce) {\n .phi-field__toggle {\n transition: none;\n }\n }\n\n /* ─── Forced Colors (Windows High Contrast Mode) ─── */\n\n @media (forced-colors: active) {\n .phi-field__toggle {\n border: 1px solid ButtonText;\n forced-color-adjust: none;\n }\n\n .phi-field__toggle:focus-visible {\n outline: 2px solid Highlight;\n outline-offset: 2px;\n }\n }\n`;\n","import { html, type TemplateResult } from 'lit';\nimport { classMap } from 'lit/directives/class-map.js';\nimport '../../utilities/document-token-adoption.js';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { HelixElement } from '../../base/index.js';\nimport { helixPhiFieldStyles } from './hx-phi-field.styles.js';\nimport { forcedColorsField } from '../../styles/forced-colors.js';\nimport { devWarn } from '../../utils/dev-warn.js';\n\n/**\n * HIPAA-compliant field component for rendering masked Protected Health Information (PHI).\n * PHI is masked by default and only rendered to the DOM when explicitly revealed. Access\n * events are fired on reveal, hide, and clipboard auto-clear for audit trail purposes.\n *\n * ## Security Model — Event Composition\n *\n * The `hx-phi-access` event is dispatched with `composed: true` so it crosses shadow DOM\n * boundaries and reaches application-level audit listeners. This is intentional — audit\n * trail events MUST reach the host application regardless of shadow DOM nesting depth.\n *\n * **PHI is never included in event details.** The `PhiAccessEventDetail` payload contains\n * only audit metadata: `fieldId`, `action`, `timestamp`, and `fieldType`. The actual PHI\n * value (the `data` property) is deliberately excluded from all dispatched events.\n *\n * ### Consumer Responsibilities\n *\n * - **Audit logging**: Listen for `hx-phi-access` at the application root to build a\n * HIPAA-compliant access audit trail. The `fieldId` and `timestamp` fields correlate\n * access events to specific data elements without exposing the data itself.\n * - **Multi-tenant isolation**: In micro-frontend architectures where multiple patient\n * contexts share a document, consumers MUST scope their `hx-phi-access` listeners to\n * the appropriate DOM subtree (e.g., listen on a container element rather than\n * `document`). Composed events from one patient context will bubble through shared\n * ancestors.\n * - **Do not extend event details with PHI**: When wrapping this component, never add\n * the raw `data` value to re-dispatched events. The separation of audit metadata from\n * PHI content is a deliberate security boundary.\n *\n * @summary HIPAA-compliant field for rendering masked Protected Health Information.\n *\n * @tag hx-phi-field\n *\n * @csspart container - The outer wrapper element.\n * @csspart value - The value display span (masked or revealed).\n * @csspart toggle - The reveal/hide toggle button.\n *\n * @fires {CustomEvent<PhiAccessEventDetail>} hx-phi-access - Fired on reveal, hide,\n * auto-hide, clipboard-clear, and clipboard-clear-failed actions. Contains audit\n * metadata only — never raw PHI. Dispatched with `composed: true` to cross shadow\n * boundaries for application-level audit listeners.\n *\n * @cssprop [--hx-phi-field-font-family=var(--hx-font-family-mono,monospace)] - Font family for the masked value.\n * @cssprop [--hx-phi-field-value-color=var(--hx-color-neutral-900,#0D1825)] - Value text color.\n * @cssprop [--hx-phi-field-masked-color=var(--hx-color-neutral-500,#66787B)] - Masked value text color.\n * @cssprop [--hx-phi-field-toggle-color=var(--hx-color-primary-500,#429797)] - Toggle button color.\n * @cssprop [--hx-phi-field-focus-ring-color=var(--hx-focus-ring-color,var(--hx-color-primary-500,#429797))] - Focus ring color.\n * @cssprop [--hx-phi-field-disabled-opacity=var(--hx-opacity-50,0.5)] - Opacity applied when the field is disabled.\n * @cssprop [--hx-phi-field-auto-hide-warning-color=var(--hx-color-warning-500,#C2711C)] - Color for auto-hide countdown warning (future use).\n * @cssprop [--hx-space-2] - Spacing token.\n * @cssprop [--hx-font-family-mono] - Font family.\n * @cssprop [--hx-color-neutral-500] - Color.\n * @cssprop [--hx-phi-field-letter-spacing=0.1em] - CSS custom property.\n * @cssprop [--hx-color-neutral-900] - Color.\n * @cssprop [--hx-space-1] - Spacing token.\n * @cssprop [--hx-touch-target-min] - Minimum touch target size.\n * @cssprop [--hx-color-primary-500] - Color.\n * @cssprop [--hx-border-radius-sm] - CSS custom property.\n * @cssprop [--hx-focus-ring-width] - Width.\n * @cssprop [--hx-focus-ring-color] - Color.\n * @cssprop [--hx-focus-ring-offset] - CSS custom property.\n * @cssprop [--hx-opacity-90] - Opacity.\n * @cssprop [--hx-opacity-50] - Opacity.\n */\n@customElement('hx-phi-field')\nexport class HelixPhiField extends HelixElement {\n static override styles = [helixPhiFieldStyles, forcedColorsField];\n\n // ─── Public Properties ───\n\n /**\n * The Protected Health Information value to display or mask.\n * Must be set via the JavaScript property (`element.data = \"...\"`) — not as an HTML attribute.\n * Setting PHI as an HTML attribute exposes it in the DOM and browser caches (HIPAA violation).\n */\n @property({ attribute: false })\n data: string = '';\n\n /**\n * The type of PHI field. Controls the masking pattern applied.\n * @attr field-type\n */\n @property({ type: String, reflect: true, attribute: 'field-type' })\n fieldType: 'ssn' | 'mrn' | 'dob' | 'insurance' = 'ssn';\n\n /**\n * Identifier used in audit events. Falls back to the element's id attribute.\n * @attr field-id\n */\n @property({ type: String, attribute: 'field-id' })\n fieldId: string = '';\n\n /**\n * Milliseconds after clipboard write before the clipboard is automatically cleared.\n * Defaults to 30000 (30 seconds).\n * @attr clipboard-timeout\n */\n @property({ type: Number, attribute: 'clipboard-timeout' })\n clipboardTimeout: number = 30000;\n\n /**\n * Accessible label describing the PHI field. Used as a prefix in screen reader\n * announcements (e.g., \"Social Security Number is masked\").\n * @attr label\n */\n @property({ type: String })\n label: string = '';\n\n /**\n * Seconds of inactivity after reveal before PHI is automatically re-masked.\n * Prevents PHI from remaining visible indefinitely when a clinician walks away.\n * Set to 0 to disable auto-hide. Defaults to 60 seconds.\n * @attr auto-hide-delay\n */\n @property({ type: Number, attribute: 'auto-hide-delay' })\n autoHideDelay: number = 60;\n\n /**\n * When set, disables all interaction with the field and prevents reveal.\n * @attr disabled\n * @reflect\n */\n @property({ type: Boolean, reflect: true })\n disabled: boolean = false;\n\n // ─── Internal State ───\n\n /** @internal */\n @state() private _masked = true;\n\n /** @internal */\n private _clipboardTimer: ReturnType<typeof setTimeout> | null = null;\n\n /** @internal Timer ID for auto-re-mask after reveal. */\n private _autoHideTimer: ReturnType<typeof setTimeout> | null = null;\n\n // ─── Lifecycle ───\n\n /** @internal Bound reference for visibilitychange listener cleanup. */\n private readonly _boundHandleVisibilityChange = (): void => {\n if (document.visibilityState !== 'hidden') return;\n // Only clear if the field has been revealed (unmasked) or an active\n // clipboard-clear timer is running. Otherwise there's nothing to clear,\n // and emitting hx-phi-access with action: 'clipboard-clear' would pollute\n // the HIPAA audit log with events for fields that were never accessed.\n if (this._masked && this._clipboardTimer === null) return;\n this._clearClipboard();\n };\n\n /** @internal Bound reference for interaction-based auto-hide timer reset. */\n private readonly _boundResetAutoHideTimer = (): void => {\n this._resetAutoHideTimer();\n };\n\n override connectedCallback(): void {\n super.connectedCallback();\n // Enforce HIPAA compliance: prevent browser autofill on the host element\n this.setAttribute('autocomplete', 'off');\n // HIPAA: Clear clipboard immediately when tab is hidden (prevents PHI exposure\n // when setTimeout is throttled in backgrounded tabs on mobile/laptop lid close).\n document.addEventListener('visibilitychange', this._boundHandleVisibilityChange);\n // FS-029: PHI SSR/attribute exposure prevention.\n // If a developer (or server-rendered HTML) mistakenly sets PHI via the\n // `data` HTML attribute, the raw value is readable in the DOM source before\n // JavaScript initialises — a HIPAA risk on SSR pages. We recover the value\n // into the JS-only property and then immediately remove the attribute so\n // that no PHI is ever left exposed in the DOM tree or HTML source.\n if (this.hasAttribute('data')) {\n devWarn(\n 'hx-phi-field',\n 'Setting PHI via the `data` HTML attribute is not supported and exposes sensitive data in the DOM source. Use the `data` JS property (element.data = \"...\") instead.',\n );\n // Rescue the value into the private property so the component still works,\n // then strip the attribute so the raw PHI is no longer readable in the DOM.\n const rawValue = this.getAttribute('data');\n if (rawValue !== null) {\n this.data = rawValue;\n }\n this.removeAttribute('data');\n }\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this._cancelClipboardTimer();\n this._cancelAutoHideTimer();\n document.removeEventListener('visibilitychange', this._boundHandleVisibilityChange);\n }\n\n // ─── Private Helpers ───\n\n /** @internal */\n private _cancelClipboardTimer(): void {\n if (this._clipboardTimer !== null) {\n clearTimeout(this._clipboardTimer);\n this._clipboardTimer = null;\n }\n }\n\n /** @internal Cancel the auto-hide timer if running. */\n private _cancelAutoHideTimer(): void {\n if (this._autoHideTimer !== null) {\n clearTimeout(this._autoHideTimer);\n this._autoHideTimer = null;\n }\n this._removeAutoHideInteractionListeners();\n }\n\n /** @internal Start the auto-hide countdown. Resets if already running. */\n private _scheduleAutoHide(): void {\n this._cancelAutoHideTimer();\n if (this.autoHideDelay <= 0) return;\n\n this._addAutoHideInteractionListeners();\n this._autoHideTimer = setTimeout(() => {\n this._autoHideTimer = null;\n this._autoHide();\n }, this.autoHideDelay * 1000);\n }\n\n /** @internal Reset the auto-hide timer on user interaction. */\n private _resetAutoHideTimer(): void {\n if (this._autoHideTimer === null) return;\n this._scheduleAutoHide();\n }\n\n /** @internal Auto-hide PHI and dispatch audit event. */\n private _autoHide(): void {\n if (this._masked) return;\n\n this._removeAutoHideInteractionListeners();\n // Do NOT cancel the clipboard-clear timer — same reasoning as the manual\n // hide branch of `_handleToggle`. A reveal may have resulted in a copy,\n // and cancelling the scheduled clear would leave PHI on the clipboard\n // past the auto-hide ceiling.\n this._masked = true;\n\n this.dispatchEvent(\n new CustomEvent<PhiAccessEventDetail>('hx-phi-access', {\n bubbles: true,\n composed: true,\n detail: {\n fieldId: this.fieldId || this.id || '',\n action: 'auto-hide',\n timestamp: new Date().toISOString(),\n fieldType: this.fieldType,\n },\n }),\n );\n }\n\n /** @internal Interaction events that reset the auto-hide timer. */\n private static readonly _AUTO_HIDE_INTERACTION_EVENTS = [\n 'mouseenter',\n 'mousemove',\n 'focusin',\n 'keydown',\n 'pointerdown',\n ] as const;\n\n /** @internal Add interaction listeners to reset auto-hide timer. */\n private _addAutoHideInteractionListeners(): void {\n for (const event of HelixPhiField._AUTO_HIDE_INTERACTION_EVENTS) {\n this.addEventListener(event, this._boundResetAutoHideTimer);\n }\n }\n\n /** @internal Remove interaction listeners. */\n private _removeAutoHideInteractionListeners(): void {\n for (const event of HelixPhiField._AUTO_HIDE_INTERACTION_EVENTS) {\n this.removeEventListener(event, this._boundResetAutoHideTimer);\n }\n }\n\n /** @internal */\n private _scheduleClipboardClear(): void {\n this._cancelClipboardTimer();\n this._clipboardTimer = setTimeout(() => {\n this._clearClipboard();\n }, this.clipboardTimeout);\n }\n\n /** @internal */\n private _clearClipboard(): void {\n // Cancel any pending scheduled clear. When `_clearClipboard` is invoked\n // from the setTimeout callback the timer has already fired and this is a\n // no-op; when invoked from the visibilitychange pre-emption path it stops\n // the scheduled timer from firing again and dispatching a duplicate\n // clipboard-clear audit event.\n this._cancelClipboardTimer();\n // Also cancel the auto-hide timer and remove its interaction listeners.\n // `_clearClipboard` force-masks the field below, so any scheduled auto-hide\n // is now moot. Without this call the setTimeout stays pending and the\n // `mouseenter / mousemove / focusin / keydown / pointerdown` listeners\n // stay attached to the host; when the auto-hide timer later fires,\n // `_autoHide()` early-returns on `this._masked` WITHOUT removing the\n // listeners, leaking them until the next scheduleAutoHide/cancelAutoHideTimer\n // path runs. `_cancelAutoHideTimer` already closes both — one call suffices.\n this._cancelAutoHideTimer();\n this._masked = true;\n\n // `navigator.clipboard.writeText` requires transient user activation in\n // Chrome and Safari. The clipboard-clear timer fires async (activation\n // expired) and the visibilitychange pre-emption path has no activation\n // at all — both can reject silently. Dispatching an unconditional\n // clipboard-clear audit event in that case would be MISLEADING: the\n // audit trail would claim PHI was cleared while it in fact remains on\n // the clipboard. Instead we observe the writeText outcome and dispatch\n // `clipboard-clear` only on confirmed success, or `clipboard-clear-failed`\n // when the API is unavailable or the promise rejects. This gives\n // HIPAA audit consumers an accurate signal and lets them escalate\n // failures (prompt the user, flag the session, etc).\n const dispatchOutcome = (succeeded: boolean): void => {\n this.dispatchEvent(\n new CustomEvent<PhiAccessEventDetail>('hx-phi-access', {\n bubbles: true,\n composed: true,\n detail: {\n fieldId: this.fieldId || this.id || '',\n action: succeeded ? 'clipboard-clear' : 'clipboard-clear-failed',\n timestamp: new Date().toISOString(),\n fieldType: this.fieldType,\n },\n }),\n );\n };\n\n if (typeof navigator === 'undefined') {\n dispatchOutcome(false);\n return;\n }\n\n // Every remaining clipboard interaction — including the `navigator.clipboard`\n // read itself — runs inside this try. The Clipboard API's property descriptor\n // is UA-defined, so `navigator.clipboard` can legally be an accessor that\n // throws synchronously. Same for `clipboard.writeText`. Pulling the read\n // inside the try ensures any sync throw resolves to `clipboard-clear-failed`\n // instead of an uncaught error that would silently drop the HIPAA audit event.\n //\n // `navigator.clipboard` is captured exactly once and the same reference is\n // used for both the method read and the call's receiver. A shim that exposes\n // `navigator.clipboard` as a getter returning a fresh object per read (rare\n // but legal) would otherwise let us grab `writeText` from object A and invoke\n // it against object B — brand/instance checks inside a real polyfill would\n // then fail and the call would reject spuriously.\n //\n // Promise.resolve() on a non-thenable still resolves, so the then() path\n // normalizes the return value shape for us.\n try {\n const clipboard = navigator.clipboard;\n if (!clipboard) {\n dispatchOutcome(false);\n return;\n }\n const writeText = clipboard.writeText;\n if (typeof writeText !== 'function') {\n dispatchOutcome(false);\n return;\n }\n void Promise.resolve(writeText.call(clipboard, '')).then(\n () => dispatchOutcome(true),\n () => dispatchOutcome(false),\n );\n } catch {\n dispatchOutcome(false);\n }\n }\n\n /** @internal */\n private _getMaskedValue(): string {\n if (!this.data) return '';\n\n switch (this.fieldType) {\n case 'ssn': {\n // Format: xxx-xx-xxxx → ***-**-xxxx (show last 4 digits)\n // Match the separator-delimited pattern first\n const ssnMatch = this.data.match(/^(\\d{3})(-?)(\\d{2})(-?)(\\d{4})$/);\n if (ssnMatch) {\n return `***${ssnMatch[2]}**${ssnMatch[4]}${ssnMatch[5]}`;\n }\n // Fallback: mask all but last 4 chars\n return this.data.slice(0, -4).replace(/\\d/g, '*') + this.data.slice(-4);\n }\n\n case 'mrn': {\n // Mask all but last 4 alphanumeric characters, preserve separators\n const chars = this.data.split('');\n const alphanumericIndices: number[] = [];\n chars.forEach((ch, i) => {\n if (/[a-zA-Z0-9]/.test(ch)) {\n alphanumericIndices.push(i);\n }\n });\n const revealCount = Math.min(4, alphanumericIndices.length);\n const maskUntilIdx = alphanumericIndices.length - revealCount;\n const indicesToMask = new Set(alphanumericIndices.slice(0, maskUntilIdx));\n return chars.map((ch, i) => (indicesToMask.has(i) ? '*' : ch)).join('');\n }\n\n case 'dob': {\n // Replace ALL digits with *, preserve separators\n return this.data.replace(/\\d/g, '*');\n }\n\n case 'insurance': {\n // Format: xxxx-xxxx-xxxx-xxxx → ****-****-****-xxxx (show last 4 digits)\n const insMatch = this.data.match(/^(\\d{4})(-?)(\\d{4})(-?)(\\d{4})(-?)(\\d{4})$/);\n if (insMatch) {\n return `****${insMatch[2]}****${insMatch[4]}****${insMatch[6]}${insMatch[7]}`;\n }\n // Fallback: mask all but last 4 chars\n return this.data.slice(0, -4).replace(/[a-zA-Z0-9]/g, '*') + this.data.slice(-4);\n }\n\n default: {\n // Exhaustive check — fieldType is typed, but guard defensively\n const _exhaustive: never = this.fieldType;\n return _exhaustive;\n }\n }\n }\n\n // ─── Event Handlers ───\n\n /** @internal */\n private _handleToggle(): void {\n if (this.disabled) return;\n\n // Dispatch BEFORE toggling state so action reflects the upcoming state\n this.dispatchEvent(\n new CustomEvent<PhiAccessEventDetail>('hx-phi-access', {\n bubbles: true,\n composed: true,\n detail: {\n fieldId: this.fieldId || this.id || '',\n action: this._masked ? 'reveal' : 'hide',\n timestamp: new Date().toISOString(),\n fieldType: this.fieldType,\n },\n }),\n );\n\n if (this._masked) {\n // Revealing: start clipboard clear timer and auto-hide timer\n this._masked = false;\n this._scheduleClipboardClear();\n this._scheduleAutoHide();\n } else {\n // Hiding: cancel the auto-hide countdown (purpose already served — the\n // field is hidden). Do NOT cancel the clipboard-clear timer — the user\n // may have copied PHI while the field was revealed, and cancelling here\n // would strand it on the clipboard if the tab later backgrounds. The\n // timer fires naturally at `clipboardTimeout`, and the visibilitychange\n // handler will pre-empt it if the tab hides sooner.\n this._cancelAutoHideTimer();\n this._masked = true;\n }\n }\n\n /** @internal */\n private _handleCopy(e: ClipboardEvent): void {\n if (this._masked) {\n e.preventDefault();\n }\n }\n\n /** @internal */\n private _handlePaste(e: ClipboardEvent): void {\n if (this._masked) {\n e.preventDefault();\n }\n }\n\n // ─── Render Helpers ───\n\n /** @internal */\n private _renderEyeIcon(): TemplateResult {\n return html`\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n `;\n }\n\n /** @internal */\n private _renderEyeOffIcon(): TemplateResult {\n return html`\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94\" />\n <path d=\"M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19\" />\n <line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\" />\n </svg>\n `;\n }\n\n // ─── Render ───\n\n override render() {\n const fieldLabel = this.label || 'Protected health information';\n const maskedLabel = `${fieldLabel} is masked`;\n const revealedLabel = `${fieldLabel} is revealed`;\n const revealActionLabel = `Reveal ${fieldLabel.toLowerCase()}`;\n const hideActionLabel = `Hide ${fieldLabel.toLowerCase()}`;\n\n return html`\n <div\n part=\"container\"\n class=${classMap({ 'phi-field': true, 'phi-field--disabled': this.disabled })}\n @copy=${this._handleCopy}\n @paste=${this._handlePaste}\n >\n ${this._masked\n ? html`<span\n part=\"value\"\n class=\"phi-field__value phi-field__value--masked\"\n aria-hidden=\"true\"\n >${this._getMaskedValue()}</span\n >`\n : html`<span part=\"value\" class=\"phi-field__value phi-field__value--revealed\"\n >${this.data}</span\n >`}\n <span role=\"status\" aria-live=\"polite\" aria-atomic=\"true\" class=\"phi-field__status\">\n ${this._masked ? maskedLabel : revealedLabel}\n </span>\n <button\n part=\"toggle\"\n class=\"phi-field__toggle\"\n type=\"button\"\n ?disabled=${this.disabled}\n aria-label=${this._masked ? revealActionLabel : hideActionLabel}\n aria-pressed=${String(!this._masked)}\n @click=${this._handleToggle}\n >\n ${this._masked ? this._renderEyeIcon() : this._renderEyeOffIcon()}\n </button>\n </div>\n `;\n }\n}\n\n/**\n * Audit metadata for PHI access events. This interface intentionally contains\n * only identifiers and action metadata — never raw PHI values. The separation\n * of audit trail data from PHI content is a deliberate HIPAA security boundary.\n *\n * **Security invariant**: No field in this interface should ever contain the\n * actual protected health information (SSN digits, MRN value, date of birth,\n * insurance number). The `fieldId` is a developer-assigned logical identifier,\n * not the PHI value itself.\n */\nexport interface PhiAccessEventDetail {\n /** Developer-assigned logical identifier for the field (NOT the PHI value). */\n fieldId: string;\n /**\n * The action that triggered the audit event.\n *\n * - `clipboard-clear`: `navigator.clipboard.writeText('')` resolved successfully\n * — the clipboard has been confirmed cleared.\n * - `clipboard-clear-failed`: the clipboard API was unavailable OR `writeText('')`\n * rejected (most commonly because the browser required transient user\n * activation that the timer or visibilitychange pre-emption path did not\n * provide). The clipboard MAY still contain PHI. HIPAA audit consumers\n * should treat this as an actionable event — prompt the user to manually\n * clear their clipboard, flag the session, or escalate per policy.\n */\n action: 'reveal' | 'hide' | 'auto-hide' | 'clipboard-clear' | 'clipboard-clear-failed';\n /** ISO 8601 timestamp of the access event. */\n timestamp: string;\n /** The category of PHI this field contains. */\n fieldType: 'ssn' | 'mrn' | 'dob' | 'insurance';\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'hx-phi-field': HelixPhiField;\n }\n}\n"],"names":["helixPhiFieldStyles","css","HelixPhiField","HelixElement","rawValue","event","dispatchOutcome","succeeded","clipboard","writeText","ssnMatch","chars","alphanumericIndices","ch","i","revealCount","maskUntilIdx","indicesToMask","insMatch","html","fieldLabel","maskedLabel","revealedLabel","revealActionLabel","hideActionLabel","classMap","forcedColorsField","__decorateClass","property","state","customElement"],"mappings":"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"}
@@ -1,8 +1,9 @@
1
- import { css as k, nothing as g, html as x } from "lit";
2
- import { property as d, state as C, customElement as $ } from "lit/decorators.js";
3
- import { H as P } from "./helix-element-BNEYeiys.js";
4
- import { c as D } from "./id-counter-DuX8vsui.js";
5
- const F = k`
1
+ import { css as C, nothing as g, html as x } from "lit";
2
+ import { property as d, state as k, customElement as $ } from "lit/decorators.js";
3
+ import { a as P } from "./forced-colors-CTEDFRGa.js";
4
+ import { H as D } from "./helix-element-BNEYeiys.js";
5
+ import { c as F } from "./id-counter-DuX8vsui.js";
6
+ const L = C`
6
7
  :host {
7
8
  /* P2-05: display:contents lets the trigger-wrapper control layout inline;
8
9
  position:relative was vestigial — body uses position:fixed via Floating UI */
@@ -18,12 +19,12 @@ const F = k`
18
19
  z-index: var(--hx-popover-z-index, 9999);
19
20
  max-width: var(--hx-popover-max-width, 320px);
20
21
  padding: var(--hx-popover-padding, var(--hx-space-3, 0.75rem));
21
- background: var(--hx-popover-bg, var(--hx-color-neutral-0, #ffffff));
22
- color: var(--hx-popover-color, var(--hx-color-neutral-900, #0f172a));
22
+ background: var(--hx-popover-bg, var(--hx-color-surface-default, #ffffff));
23
+ color: var(--hx-popover-color, var(--hx-color-text-primary, #0d1825));
23
24
  font-family: var(--hx-popover-font-family, var(--hx-font-family-sans, sans-serif));
24
25
  font-size: var(--hx-popover-font-size, var(--hx-font-size-sm, 0.875rem));
25
26
  line-height: var(--hx-line-height-normal, 1.5);
26
- border: 1px solid var(--hx-popover-border-color, var(--hx-color-neutral-200, #e2e8f0));
27
+ border: 1px solid var(--hx-popover-border-color, var(--hx-color-border-default, #d6dbd5));
27
28
  border-radius: var(--hx-popover-border-radius, var(--hx-border-radius-md, 0.375rem));
28
29
  box-shadow: var(
29
30
  --hx-popover-shadow,
@@ -44,7 +45,7 @@ const F = k`
44
45
 
45
46
  [part='body']:focus-visible {
46
47
  outline: var(--hx-focus-ring-width, 2px) solid
47
- var(--hx-popover-focus-ring-color, var(--hx-focus-ring-color, var(--hx-color-primary-500)));
48
+ var(--hx-popover-focus-ring-color, var(--hx-focus-ring-color, #0f7078));
48
49
  outline-offset: var(--hx-focus-ring-offset, 2px);
49
50
  }
50
51
 
@@ -52,8 +53,8 @@ const F = k`
52
53
  position: absolute;
53
54
  width: var(--hx-popover-arrow-size, 10px);
54
55
  height: var(--hx-popover-arrow-size, 10px);
55
- background: var(--hx-popover-bg, var(--hx-color-neutral-0, #ffffff));
56
- border: 1px solid var(--hx-popover-border-color, var(--hx-color-neutral-200, #e2e8f0));
56
+ background: var(--hx-popover-bg, var(--hx-color-surface-default, #ffffff));
57
+ border: 1px solid var(--hx-popover-border-color, var(--hx-color-border-default, #d6dbd5));
57
58
  transform: rotate(45deg);
58
59
  pointer-events: none;
59
60
  }
@@ -65,6 +66,7 @@ const F = k`
65
66
  }
66
67
 
67
68
  /* ─── Forced Colors (Windows High Contrast) ─── */
69
+ /* Belt-and-suspenders: rich per-class HC overrides PLUS the forcedColorsSurface mixin. */
68
70
 
69
71
  @media (forced-colors: active) {
70
72
  [part='body'] {
@@ -76,15 +78,15 @@ const F = k`
76
78
  }
77
79
  }
78
80
  `;
79
- var L = Object.defineProperty, M = Object.getOwnPropertyDescriptor, h = (e, t, r, o) => {
80
- for (var i = o > 1 ? void 0 : o ? M(t, r) : t, n = e.length - 1, s; n >= 0; n--)
81
+ var M = Object.defineProperty, R = Object.getOwnPropertyDescriptor, h = (e, t, r, o) => {
82
+ for (var i = o > 1 ? void 0 : o ? R(t, r) : t, n = e.length - 1, s; n >= 0; n--)
81
83
  (s = e[n]) && (i = (o ? s(t, r, i) : s(i)) || i);
82
- return o && i && L(t, r, i), i;
84
+ return o && i && M(t, r, i), i;
83
85
  };
84
- const R = D("hx-popover");
85
- let a = class extends P {
86
+ const q = F("hx-popover");
87
+ let a = class extends D {
86
88
  constructor() {
87
- super(...arguments), this.open = !1, this.placement = "bottom", this.trigger = "click", this.distance = 8, this.skidding = 0, this.arrow = !1, this.label = "Popover", this._visible = !1, this._previousFocus = null, this._popoverId = R(), this._showTimer = null, this._hoverHideTimer = null, this._handleDocumentKeydown = (e) => {
89
+ super(...arguments), this.open = !1, this.placement = "bottom", this.trigger = "click", this.distance = 8, this.skidding = 0, this.arrow = !1, this.label = "Popover", this._visible = !1, this._previousFocus = null, this._popoverId = q(), this._showTimer = null, this._hoverHideTimer = null, this._handleDocumentKeydown = (e) => {
88
90
  var t, r, o;
89
91
  if (this._visible) {
90
92
  if (e.key === "Escape") {
@@ -188,37 +190,37 @@ let a = class extends P {
188
190
  if (!e) return;
189
191
  const t = e.assignedElements()[0], r = (m = this.shadowRoot) == null ? void 0 : m.querySelector('[part="body"]'), o = this.arrow ? (b = this.shadowRoot) == null ? void 0 : b.querySelector('[part="arrow"]') : null;
190
192
  if (!t || !r) return;
191
- const { computePosition: i, flip: n, shift: s, offset: l, arrow: c } = await import("@floating-ui/dom"), u = [
193
+ const { computePosition: i, flip: n, shift: s, offset: l, arrow: c } = await import("@floating-ui/dom"), p = [
192
194
  l({ mainAxis: this.distance, crossAxis: this.skidding }),
193
195
  n(),
194
196
  s({ padding: 8 })
195
197
  ];
196
- o && u.push(c({ element: o }));
198
+ o && p.push(c({ element: o }));
197
199
  const { x: w, y: E, placement: A, middlewareData: v } = await i(t, r, {
198
200
  placement: this.placement,
199
201
  strategy: "fixed",
200
- middleware: u
202
+ middleware: p
201
203
  });
202
204
  if (Object.assign(r.style, {
203
205
  left: `${w}px`,
204
206
  top: `${E}px`
205
207
  }), o && v.arrow) {
206
- const p = v.arrow, _ = A.split("-")[0] ?? "bottom", T = {
208
+ const u = v.arrow, _ = A.split("-")[0] ?? "bottom", S = {
207
209
  top: "bottom",
208
210
  right: "left",
209
211
  bottom: "top",
210
212
  left: "right"
211
213
  }[_] ?? "bottom";
212
214
  Object.assign(o.style, {
213
- left: p.x != null ? `${p.x}px` : "",
214
- top: p.y != null ? `${p.y}px` : "",
215
+ left: u.x != null ? `${u.x}px` : "",
216
+ top: u.y != null ? `${u.y}px` : "",
215
217
  right: "",
216
218
  bottom: "",
217
- [T]: "-5px"
219
+ [S]: "-5px"
218
220
  });
219
221
  const H = ["border-top", "border-right", "border-bottom", "border-left"];
220
- for (const S of H)
221
- o.style.setProperty(S, "");
222
+ for (const T of H)
223
+ o.style.setProperty(T, "");
222
224
  const y = {
223
225
  bottom: ["border-bottom", "border-right"],
224
226
  top: ["border-top", "border-left"],
@@ -281,7 +283,7 @@ let a = class extends P {
281
283
  `;
282
284
  }
283
285
  };
284
- a.styles = [F];
286
+ a.styles = [L, P];
285
287
  h([
286
288
  d({ type: Boolean, reflect: !0 })
287
289
  ], a.prototype, "open", 2);
@@ -304,7 +306,7 @@ h([
304
306
  d({ type: String, reflect: !0 })
305
307
  ], a.prototype, "label", 2);
306
308
  h([
307
- C()
309
+ k()
308
310
  ], a.prototype, "_visible", 2);
309
311
  a = h([
310
312
  $("hx-popover")
@@ -312,4 +314,4 @@ a = h([
312
314
  export {
313
315
  a as H
314
316
  };
315
- //# sourceMappingURL=hx-popover-B2_203ct.js.map
317
+ //# sourceMappingURL=hx-popover-B-FP3-wW.js.map