@alfadocs/ui-kit-debug 0.25.1 → 0.25.2

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 (305) hide show
  1. package/dist/_chunks/{agenda-card-BmpaUG1h.js → agenda-card-CznB7K8e.js} +2 -2
  2. package/dist/_chunks/{agenda-card-BmpaUG1h.js.map → agenda-card-CznB7K8e.js.map} +1 -1
  3. package/dist/_chunks/{agenda-tray-DiInnVqk.js → agenda-tray-C_bha7oK.js} +4 -4
  4. package/dist/_chunks/{agenda-tray-DiInnVqk.js.map → agenda-tray-C_bha7oK.js.map} +1 -1
  5. package/dist/_chunks/{ai-prompt-input-B5MdixzR.js → ai-prompt-input-Bka3jX3i.js} +2 -2
  6. package/dist/_chunks/{ai-prompt-input-B5MdixzR.js.map → ai-prompt-input-Bka3jX3i.js.map} +1 -1
  7. package/dist/_chunks/{alia-sidebar-CUi2UCbY.js → alia-sidebar-CnvXq95r.js} +92 -109
  8. package/dist/_chunks/alia-sidebar-CnvXq95r.js.map +1 -0
  9. package/dist/_chunks/{audio-recorder-D4xM3H5i.js → audio-recorder-OB6IV9B1.js} +2 -2
  10. package/dist/_chunks/{audio-recorder-D4xM3H5i.js.map → audio-recorder-OB6IV9B1.js.map} +1 -1
  11. package/dist/_chunks/{autocomplete-C7xq06bP.js → autocomplete-CUh0f7Dj.js} +2 -2
  12. package/dist/_chunks/{autocomplete-C7xq06bP.js.map → autocomplete-CUh0f7Dj.js.map} +1 -1
  13. package/dist/_chunks/{avatar-BpFohgWG.js → avatar-D_H4emLo.js} +7 -7
  14. package/dist/_chunks/avatar-D_H4emLo.js.map +1 -0
  15. package/dist/_chunks/{benefit-card-DXmrAyfn.js → benefit-card-CjYM8vNr.js} +29 -29
  16. package/dist/_chunks/benefit-card-CjYM8vNr.js.map +1 -0
  17. package/dist/_chunks/booking-CXngC-1u.js +1743 -0
  18. package/dist/_chunks/booking-CXngC-1u.js.map +1 -0
  19. package/dist/_chunks/{calendar-zy0tUUVG.js → calendar-9eOXumpH.js} +113 -142
  20. package/dist/_chunks/calendar-9eOXumpH.js.map +1 -0
  21. package/dist/_chunks/{card-C353dU-H.js → card-DKTMLVrw.js} +11 -11
  22. package/dist/_chunks/card-DKTMLVrw.js.map +1 -0
  23. package/dist/_chunks/{carousel.agent-DnPiqijR.js → carousel.agent-C9swH-Uf.js} +2 -2
  24. package/dist/_chunks/{carousel.agent-DnPiqijR.js.map → carousel.agent-C9swH-Uf.js.map} +1 -1
  25. package/dist/_chunks/{chat-input-B3XmFGDw.js → chat-input-BfDcz1Yi.js} +2 -2
  26. package/dist/_chunks/{chat-input-B3XmFGDw.js.map → chat-input-BfDcz1Yi.js.map} +1 -1
  27. package/dist/_chunks/{chat-message-W3k8rLOA.js → chat-message-fg221-yx.js} +2 -2
  28. package/dist/_chunks/{chat-message-W3k8rLOA.js.map → chat-message-fg221-yx.js.map} +1 -1
  29. package/dist/_chunks/{command-palette-DkL-aW4O.js → command-palette-11BieSNq.js} +2 -2
  30. package/dist/_chunks/{command-palette-DkL-aW4O.js.map → command-palette-11BieSNq.js.map} +1 -1
  31. package/dist/_chunks/{contact-card-CjG7c-1q.js → contact-card-CeEfEAxh.js} +2 -2
  32. package/dist/_chunks/{contact-card-CjG7c-1q.js.map → contact-card-CeEfEAxh.js.map} +1 -1
  33. package/dist/_chunks/{date-picker-BIoSLRly.js → date-picker-D0Ry1dMz.js} +26 -27
  34. package/dist/_chunks/{date-picker-BIoSLRly.js.map → date-picker-D0Ry1dMz.js.map} +1 -1
  35. package/dist/_chunks/{date-range-picker-9gANFNG9.js → date-range-picker-DYgHzMOo.js} +19 -20
  36. package/dist/_chunks/{date-range-picker-9gANFNG9.js.map → date-range-picker-DYgHzMOo.js.map} +1 -1
  37. package/dist/_chunks/{date-time-picker-DG7BiGdb.js → date-time-picker-CGmGtcyc.js} +10 -11
  38. package/dist/_chunks/{date-time-picker-DG7BiGdb.js.map → date-time-picker-CGmGtcyc.js.map} +1 -1
  39. package/dist/_chunks/{description-list-Bsga4IW8.js → description-list-yl3y3QKg.js} +34 -24
  40. package/dist/_chunks/description-list-yl3y3QKg.js.map +1 -0
  41. package/dist/_chunks/{dialog-DUomPCRS.js → dialog-BBXqpZIt.js} +2 -2
  42. package/dist/_chunks/{dialog-DUomPCRS.js.map → dialog-BBXqpZIt.js.map} +1 -1
  43. package/dist/_chunks/{editable-currency-cell-renderer-DJB5MxAI.js → editable-currency-cell-renderer-DSReCae7.js} +7 -7
  44. package/dist/_chunks/{editable-currency-cell-renderer-DJB5MxAI.js.map → editable-currency-cell-renderer-DSReCae7.js.map} +1 -1
  45. package/dist/_chunks/{empty-state-3CLJIXSj.js → empty-state-BLy7tigq.js} +13 -33
  46. package/dist/_chunks/empty-state-BLy7tigq.js.map +1 -0
  47. package/dist/_chunks/eye-LHlSU38h.js +21 -0
  48. package/dist/_chunks/eye-LHlSU38h.js.map +1 -0
  49. package/dist/_chunks/{freemium-paywall-CM6V1zNf.js → freemium-paywall-B9c8Ylww.js} +11 -11
  50. package/dist/_chunks/{freemium-paywall-CM6V1zNf.js.map → freemium-paywall-B9c8Ylww.js.map} +1 -1
  51. package/dist/_chunks/{header-DqmKROIY.js → header-B8V_sNPy.js} +2 -2
  52. package/dist/_chunks/{header-DqmKROIY.js.map → header-B8V_sNPy.js.map} +1 -1
  53. package/dist/_chunks/icon-button-BRHSSFmZ.js +70 -0
  54. package/dist/_chunks/icon-button-BRHSSFmZ.js.map +1 -0
  55. package/dist/_chunks/{isSameDay-ecuM8PBB.js → isSameDay-DHG8Xade.js} +4 -4
  56. package/dist/_chunks/{isSameDay-ecuM8PBB.js.map → isSameDay-DHG8Xade.js.map} +1 -1
  57. package/dist/_chunks/{key-value-pair-DBuOCtIc.js → key-value-pair-CqeKiP__.js} +2 -2
  58. package/dist/_chunks/{key-value-pair-DBuOCtIc.js.map → key-value-pair-CqeKiP__.js.map} +1 -1
  59. package/dist/_chunks/{locale-picker-BxEUUPW7.js → locale-picker-BHxbTNmR.js} +297 -208
  60. package/dist/_chunks/locale-picker-BHxbTNmR.js.map +1 -0
  61. package/dist/_chunks/{map-view-CcwycFQX.js → map-view-DyB8tr6c.js} +9 -9
  62. package/dist/_chunks/{map-view-CcwycFQX.js.map → map-view-DyB8tr6c.js.map} +1 -1
  63. package/dist/_chunks/{matrix-rain-CRPMXcVx.js → matrix-rain-sDOUUwZp.js} +35 -35
  64. package/dist/_chunks/matrix-rain-sDOUUwZp.js.map +1 -0
  65. package/dist/_chunks/{message-card-i61k1TGc.js → message-card-DjRtA8GG.js} +3 -3
  66. package/dist/_chunks/{message-card-i61k1TGc.js.map → message-card-DjRtA8GG.js.map} +1 -1
  67. package/dist/_chunks/{message-tray-DrV7G-wR.js → message-tray-DfsAMncP.js} +3 -3
  68. package/dist/_chunks/{message-tray-DrV7G-wR.js.map → message-tray-DfsAMncP.js.map} +1 -1
  69. package/dist/_chunks/monitor-D-SFdbrU.js +16 -0
  70. package/dist/_chunks/monitor-D-SFdbrU.js.map +1 -0
  71. package/dist/_chunks/{notification-card-ejOw5g6g.js → notification-card-B_847w5g.js} +3 -3
  72. package/dist/_chunks/notification-card-B_847w5g.js.map +1 -0
  73. package/dist/_chunks/{notification-tray-D_69dXFY.js → notification-tray-6f7smmT1.js} +22 -19
  74. package/dist/_chunks/notification-tray-6f7smmT1.js.map +1 -0
  75. package/dist/_chunks/patient-shell-Bq8CjRYF.js +173 -0
  76. package/dist/_chunks/{patient-shell-B164drIa.js.map → patient-shell-Bq8CjRYF.js.map} +1 -1
  77. package/dist/_chunks/{payment-form-F7uh0Rqr.js → payment-form-Ds3rxvad.js} +2 -2
  78. package/dist/_chunks/{payment-form-F7uh0Rqr.js.map → payment-form-Ds3rxvad.js.map} +1 -1
  79. package/dist/_chunks/{pdf-viewer-CuYaVR1I.js → pdf-viewer-CIuaocnq.js} +2 -2
  80. package/dist/_chunks/{pdf-viewer-CuYaVR1I.js.map → pdf-viewer-CIuaocnq.js.map} +1 -1
  81. package/dist/_chunks/{popover--derJ_wq.js → popover-D0slaBB9.js} +17 -13
  82. package/dist/_chunks/popover-D0slaBB9.js.map +1 -0
  83. package/dist/_chunks/{privacy-lock-BKsI6ReN.js → privacy-lock-BI4vi9Ud.js} +2 -2
  84. package/dist/_chunks/{privacy-lock-BKsI6ReN.js.map → privacy-lock-BI4vi9Ud.js.map} +1 -1
  85. package/dist/_chunks/{public-header.agent-BQ3r6Hgq.js → public-header.agent-5U3S9QiC.js} +49 -41
  86. package/dist/_chunks/public-header.agent-5U3S9QiC.js.map +1 -0
  87. package/dist/_chunks/react-day-picker-D3yzgvDB.js +3127 -0
  88. package/dist/_chunks/react-day-picker-D3yzgvDB.js.map +1 -0
  89. package/dist/_chunks/{recaptcha-widget-Kp1XntuE.js → recaptcha-widget-BtBNb6tB.js} +2 -2
  90. package/dist/_chunks/{recaptcha-widget-Kp1XntuE.js.map → recaptcha-widget-BtBNb6tB.js.map} +1 -1
  91. package/dist/_chunks/{search-bar-DORSAzNt.js → search-bar-BRMW1-WG.js} +2 -2
  92. package/dist/_chunks/{search-bar-DORSAzNt.js.map → search-bar-BRMW1-WG.js.map} +1 -1
  93. package/dist/_chunks/{search-input-BtEJAJHa.js → search-input-CIA6pPfn.js} +2 -2
  94. package/dist/_chunks/{search-input-BtEJAJHa.js.map → search-input-CIA6pPfn.js.map} +1 -1
  95. package/dist/_chunks/{sheet-BT0izeoI.js → sheet-D8M8hf8B.js} +2 -2
  96. package/dist/_chunks/{sheet-BT0izeoI.js.map → sheet-D8M8hf8B.js.map} +1 -1
  97. package/dist/_chunks/{sign-in-with-alfadocs-button-4zZC-I6y.js → sign-in-with-alfadocs-button-BI0fVonM.js} +2 -2
  98. package/dist/_chunks/{sign-in-with-alfadocs-button-4zZC-I6y.js.map → sign-in-with-alfadocs-button-BI0fVonM.js.map} +1 -1
  99. package/dist/_chunks/{slot-grid-CgpYgBkW.js → slot-grid-DoodeQGZ.js} +4 -4
  100. package/dist/_chunks/{slot-grid-CgpYgBkW.js.map → slot-grid-DoodeQGZ.js.map} +1 -1
  101. package/dist/_chunks/sparkles-CuYXqQLg.js +23 -0
  102. package/dist/_chunks/sparkles-CuYXqQLg.js.map +1 -0
  103. package/dist/_chunks/{spinner-DirtWZNG.js → spinner-CCByyvcb.js} +2 -2
  104. package/dist/_chunks/spinner-CCByyvcb.js.map +1 -0
  105. package/dist/_chunks/stepper-accordion-BfS6lUB9.js +257 -0
  106. package/dist/_chunks/stepper-accordion-BfS6lUB9.js.map +1 -0
  107. package/dist/_chunks/stepper-accordion.agent-C4quJ-MD.js +71 -0
  108. package/dist/_chunks/stepper-accordion.agent-C4quJ-MD.js.map +1 -0
  109. package/dist/_chunks/stethoscope-B8kpbtjh.js +35 -0
  110. package/dist/_chunks/stethoscope-B8kpbtjh.js.map +1 -0
  111. package/dist/_chunks/{sun-Eweh5fvi.js → sun-BuXE0xUS.js} +3 -15
  112. package/dist/_chunks/sun-BuXE0xUS.js.map +1 -0
  113. package/dist/_chunks/{task-tray-B3A2fRGR.js → task-tray-Bcmrrs8m.js} +3 -3
  114. package/dist/_chunks/{task-tray-B3A2fRGR.js.map → task-tray-Bcmrrs8m.js.map} +1 -1
  115. package/dist/_chunks/{theme-toggle-FrotC2VI.js → theme-toggle-nPzb378f.js} +37 -36
  116. package/dist/_chunks/{theme-toggle-FrotC2VI.js.map → theme-toggle-nPzb378f.js.map} +1 -1
  117. package/dist/_chunks/{timeline-jmd7lfDf.js → timeline-CR7HjZCK.js} +3 -3
  118. package/dist/_chunks/{timeline-jmd7lfDf.js.map → timeline-CR7HjZCK.js.map} +1 -1
  119. package/dist/_chunks/{toast.agent-32WNQ-_x.js → toast.agent-CTF6nIj5.js} +2 -2
  120. package/dist/_chunks/{toast.agent-32WNQ-_x.js.map → toast.agent-CTF6nIj5.js.map} +1 -1
  121. package/dist/_chunks/{transcript-panel-DUrjx5sa.js → transcript-panel-QUQ9XJmf.js} +2 -2
  122. package/dist/_chunks/{transcript-panel-DUrjx5sa.js.map → transcript-panel-QUQ9XJmf.js.map} +1 -1
  123. package/dist/_chunks/{use-password-requirements-C9vKBSVn.js → use-password-requirements-E0sSfx5X.js} +38 -53
  124. package/dist/_chunks/use-password-requirements-E0sSfx5X.js.map +1 -0
  125. package/dist/_chunks/use-theme-C2dHKUAN.js +145 -0
  126. package/dist/_chunks/use-theme-C2dHKUAN.js.map +1 -0
  127. package/dist/_chunks/{workflow-map-BR6txfFX.js → workflow-map-BKsKdYvZ.js} +5 -5
  128. package/dist/_chunks/{workflow-map-BR6txfFX.js.map → workflow-map-BKsKdYvZ.js.map} +1 -1
  129. package/dist/agent-catalog.json +56 -51
  130. package/dist/components/agenda-card/index.js +1 -1
  131. package/dist/components/agenda-tray/index.js +1 -1
  132. package/dist/components/ai-prompt-input/index.js +1 -1
  133. package/dist/components/audio-recorder/index.js +1 -1
  134. package/dist/components/autocomplete/index.js +1 -1
  135. package/dist/components/avatar/avatar.d.ts.map +1 -1
  136. package/dist/components/avatar/index.js +1 -1
  137. package/dist/components/benefit-card/benefit-card.d.ts.map +1 -1
  138. package/dist/components/benefit-card/index.js +1 -1
  139. package/dist/components/booking/booking.agent.d.ts +4 -0
  140. package/dist/components/booking/booking.agent.d.ts.map +1 -0
  141. package/dist/components/booking/booking.d.ts +91 -0
  142. package/dist/components/booking/booking.d.ts.map +1 -0
  143. package/dist/components/booking/index.d.ts +4 -0
  144. package/dist/components/booking/index.d.ts.map +1 -0
  145. package/dist/components/booking/index.js +6 -0
  146. package/dist/components/button/icon-button.d.ts.map +1 -1
  147. package/dist/components/button/index.js +1 -1
  148. package/dist/components/calendar/index.js +1 -1
  149. package/dist/components/card/card.d.ts.map +1 -1
  150. package/dist/components/card/index.js +1 -1
  151. package/dist/components/carousel/index.js +1 -1
  152. package/dist/components/chat-input/index.js +1 -1
  153. package/dist/components/chat-message/index.js +1 -1
  154. package/dist/components/command-palette/index.js +1 -1
  155. package/dist/components/contact-card/index.js +1 -1
  156. package/dist/components/data-table/index.js +1 -1
  157. package/dist/components/date-picker/index.js +1 -1
  158. package/dist/components/date-range-picker/index.js +1 -1
  159. package/dist/components/date-time-picker/index.js +1 -1
  160. package/dist/components/description-list/description-list.d.ts.map +1 -1
  161. package/dist/components/description-list/index.js +1 -1
  162. package/dist/components/dialog/index.js +1 -1
  163. package/dist/components/empty-state/empty-state.d.ts.map +1 -1
  164. package/dist/components/empty-state/index.js +1 -1
  165. package/dist/components/freemium-paywall/index.js +1 -1
  166. package/dist/components/header/index.js +1 -1
  167. package/dist/components/header-settings/index.js +16 -15
  168. package/dist/components/header-settings/index.js.map +1 -1
  169. package/dist/components/icon-button/index.js +1 -1
  170. package/dist/components/index.d.ts +1 -1
  171. package/dist/components/index.d.ts.map +1 -1
  172. package/dist/components/key-value-pair/index.js +1 -1
  173. package/dist/components/locale-picker/index.js +1 -1
  174. package/dist/components/map-view/index.js +1 -1
  175. package/dist/components/matrix-rain/index.js +1 -1
  176. package/dist/components/message-card/index.js +1 -1
  177. package/dist/components/message-tray/index.js +1 -1
  178. package/dist/components/notification-card/index.js +1 -1
  179. package/dist/components/notification-tray/index.js +1 -1
  180. package/dist/components/notification-tray/notification-tray.d.ts.map +1 -1
  181. package/dist/components/password-input/index.js +1 -1
  182. package/dist/components/payment-form/index.js +1 -1
  183. package/dist/components/pdf-viewer/index.js +1 -1
  184. package/dist/components/popover/index.js +1 -1
  185. package/dist/components/popover/popover.d.ts.map +1 -1
  186. package/dist/components/privacy-lock/index.js +1 -1
  187. package/dist/components/public-header/index.js +1 -1
  188. package/dist/components/public-header/public-header.d.ts.map +1 -1
  189. package/dist/components/recaptcha-widget/index.js +1 -1
  190. package/dist/components/search-bar/index.js +1 -1
  191. package/dist/components/search-input/index.js +1 -1
  192. package/dist/components/sheet/index.js +1 -1
  193. package/dist/components/sign-in-with-alfadocs-button/index.js +1 -1
  194. package/dist/components/slot-grid/index.js +1 -1
  195. package/dist/components/spinner/index.js +1 -1
  196. package/dist/components/stepper-accordion/index.js +4 -3
  197. package/dist/components/stepper-accordion/index.js.map +1 -1
  198. package/dist/components/task-tray/index.js +1 -1
  199. package/dist/components/theme-toggle/index.js +1 -1
  200. package/dist/components/timeline/index.js +1 -1
  201. package/dist/components/toast/index.js +1 -1
  202. package/dist/components/transcript-panel/index.js +1 -1
  203. package/dist/components/workflow/index.js +1 -1
  204. package/dist/hooks/index.js +1 -1
  205. package/dist/hooks/use-theme.d.ts.map +1 -1
  206. package/dist/i18n/config.js +1090 -46
  207. package/dist/i18n/config.js.map +1 -1
  208. package/dist/i18n/locales/ar.d.ts +58 -0
  209. package/dist/i18n/locales/ar.d.ts.map +1 -1
  210. package/dist/i18n/locales/de.d.ts +58 -0
  211. package/dist/i18n/locales/de.d.ts.map +1 -1
  212. package/dist/i18n/locales/el.d.ts +58 -0
  213. package/dist/i18n/locales/el.d.ts.map +1 -1
  214. package/dist/i18n/locales/es.d.ts +58 -0
  215. package/dist/i18n/locales/es.d.ts.map +1 -1
  216. package/dist/i18n/locales/fr.d.ts +58 -0
  217. package/dist/i18n/locales/fr.d.ts.map +1 -1
  218. package/dist/i18n/locales/hi.d.ts +58 -0
  219. package/dist/i18n/locales/hi.d.ts.map +1 -1
  220. package/dist/i18n/locales/ja.d.ts +58 -0
  221. package/dist/i18n/locales/ja.d.ts.map +1 -1
  222. package/dist/i18n/locales/nl.d.ts +58 -0
  223. package/dist/i18n/locales/nl.d.ts.map +1 -1
  224. package/dist/i18n/locales/pl.d.ts +58 -0
  225. package/dist/i18n/locales/pl.d.ts.map +1 -1
  226. package/dist/i18n/locales/pt.d.ts +58 -0
  227. package/dist/i18n/locales/pt.d.ts.map +1 -1
  228. package/dist/i18n/locales/ro.d.ts +58 -0
  229. package/dist/i18n/locales/ro.d.ts.map +1 -1
  230. package/dist/i18n/locales/ru.d.ts +58 -0
  231. package/dist/i18n/locales/ru.d.ts.map +1 -1
  232. package/dist/i18n/locales/sq.d.ts +58 -0
  233. package/dist/i18n/locales/sq.d.ts.map +1 -1
  234. package/dist/i18n/locales/sv.d.ts +58 -0
  235. package/dist/i18n/locales/sv.d.ts.map +1 -1
  236. package/dist/i18n/locales/tr.d.ts +58 -0
  237. package/dist/i18n/locales/tr.d.ts.map +1 -1
  238. package/dist/i18n/locales/zh.d.ts +58 -0
  239. package/dist/i18n/locales/zh.d.ts.map +1 -1
  240. package/dist/i18n/resources.d.ts +116 -0
  241. package/dist/i18n/resources.d.ts.map +1 -1
  242. package/dist/index.js +270 -269
  243. package/dist/index.js.map +1 -1
  244. package/dist/locales/ar.json +59 -1
  245. package/dist/locales/de.json +59 -1
  246. package/dist/locales/el.json +59 -1
  247. package/dist/locales/en.json +59 -1
  248. package/dist/locales/es.json +59 -1
  249. package/dist/locales/fr.json +59 -1
  250. package/dist/locales/hi.json +59 -1
  251. package/dist/locales/it.json +59 -1
  252. package/dist/locales/ja.json +59 -1
  253. package/dist/locales/nl.json +59 -1
  254. package/dist/locales/pl.json +59 -1
  255. package/dist/locales/pt.json +59 -1
  256. package/dist/locales/ro.json +59 -1
  257. package/dist/locales/ru.json +59 -1
  258. package/dist/locales/sq.json +59 -1
  259. package/dist/locales/sv.json +59 -1
  260. package/dist/locales/tr.json +59 -1
  261. package/dist/locales/zh.json +59 -1
  262. package/dist/patterns/alia-assistant/index.js +1 -1
  263. package/dist/patterns/patient-shell/index.js +1 -1
  264. package/dist/patterns/patient-shell/patient-shell.d.ts.map +1 -1
  265. package/dist/tokens.css +1 -1
  266. package/package.json +5 -1
  267. package/dist/_chunks/alia-sidebar-CUi2UCbY.js.map +0 -1
  268. package/dist/_chunks/avatar-BpFohgWG.js.map +0 -1
  269. package/dist/_chunks/benefit-card-DXmrAyfn.js.map +0 -1
  270. package/dist/_chunks/calendar-zy0tUUVG.js.map +0 -1
  271. package/dist/_chunks/card-C353dU-H.js.map +0 -1
  272. package/dist/_chunks/description-list-Bsga4IW8.js.map +0 -1
  273. package/dist/_chunks/empty-state-3CLJIXSj.js.map +0 -1
  274. package/dist/_chunks/icon-button-C4CGcYuz.js +0 -54
  275. package/dist/_chunks/icon-button-C4CGcYuz.js.map +0 -1
  276. package/dist/_chunks/isSameMonth-5wNF2f4I.js +0 -1307
  277. package/dist/_chunks/isSameMonth-5wNF2f4I.js.map +0 -1
  278. package/dist/_chunks/locale-picker-BxEUUPW7.js.map +0 -1
  279. package/dist/_chunks/matrix-rain-CRPMXcVx.js.map +0 -1
  280. package/dist/_chunks/notification-card-ejOw5g6g.js.map +0 -1
  281. package/dist/_chunks/notification-tray-D_69dXFY.js.map +0 -1
  282. package/dist/_chunks/patient-shell-B164drIa.js +0 -173
  283. package/dist/_chunks/popover--derJ_wq.js.map +0 -1
  284. package/dist/_chunks/public-header.agent-BQ3r6Hgq.js.map +0 -1
  285. package/dist/_chunks/react-day-picker-C5F3-TTX.js +0 -1827
  286. package/dist/_chunks/react-day-picker-C5F3-TTX.js.map +0 -1
  287. package/dist/_chunks/spinner-DirtWZNG.js.map +0 -1
  288. package/dist/_chunks/stepper-C-sIpRRU.js +0 -7
  289. package/dist/_chunks/stepper-C-sIpRRU.js.map +0 -1
  290. package/dist/_chunks/stepper-accordion.agent-ckKYZCIP.js +0 -322
  291. package/dist/_chunks/stepper-accordion.agent-ckKYZCIP.js.map +0 -1
  292. package/dist/_chunks/stepper-calendar-BLOJUE0-.js +0 -648
  293. package/dist/_chunks/stepper-calendar-BLOJUE0-.js.map +0 -1
  294. package/dist/_chunks/sun-Eweh5fvi.js.map +0 -1
  295. package/dist/_chunks/use-password-requirements-C9vKBSVn.js.map +0 -1
  296. package/dist/_chunks/use-theme-B1cwAXJR.js +0 -145
  297. package/dist/_chunks/use-theme-B1cwAXJR.js.map +0 -1
  298. package/dist/components/stepper-calendar/index.d.ts +0 -4
  299. package/dist/components/stepper-calendar/index.d.ts.map +0 -1
  300. package/dist/components/stepper-calendar/index.js +0 -6
  301. package/dist/components/stepper-calendar/stepper-calendar.agent.d.ts +0 -4
  302. package/dist/components/stepper-calendar/stepper-calendar.agent.d.ts.map +0 -1
  303. package/dist/components/stepper-calendar/stepper-calendar.d.ts +0 -62
  304. package/dist/components/stepper-calendar/stepper-calendar.d.ts.map +0 -1
  305. /package/dist/components/{stepper-calendar → booking}/index.js.map +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"privacy-lock-BKsI6ReN.js","sources":["../../src/components/privacy-lock/privacy-lock.agent.ts","../../src/components/privacy-lock/privacy-lock.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — PrivacyLock. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { PrivacyLockHandle } from './privacy-lock';\n\nexport const privacyLockAgent: AgentAdapter<PrivacyLockHandle> = {\n id: 'privacy-lock',\n capabilities: ['submit', 'dismiss'],\n state: {\n isLocked: {\n type: 'boolean',\n descriptionKey: 'ui.agent.privacyLock.state.isLocked',\n description: 'True when the privacy overlay is open.',\n read: (handle) => handle.isLocked(),\n },\n },\n actions: {\n lock: {\n safety: 'write',\n descriptionKey: 'ui.agent.privacyLock.actions.lock',\n description: 'Open the privacy overlay.',\n invoke: (handle) => {\n handle.lock();\n },\n },\n unlock: {\n safety: 'write',\n descriptionKey: 'ui.agent.privacyLock.actions.unlock',\n description: 'Close the privacy overlay (consumer-confirmed action).',\n invoke: (handle) => {\n handle.unlock();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'privacy-lock',\n description: 'Marks the PrivacyLock trigger.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","/* -------------------------------------------------------------------- */\n/* PrivacyLock — a one-click \"lock my screen\" dialog for operator */\n/* workstations on shared clinic hardware. Clicking the trigger paints */\n/* a full-viewport privacy overlay (blurred backdrop + centred card); */\n/* the only ways out are the three action buttons the consumer wires. */\n/* */\n/* Composed of one `IconButton` trigger and a Radix Dialog overlay. The */\n/* dialog is intentionally *not* dismissible via Escape or outside-click */\n/* — the whole point is to make the screen unreadable until the user */\n/* takes an explicit action. */\n/* */\n/* See `src/components/privacy-lock/privacy-lock.mdx` for usage. */\n/* -------------------------------------------------------------------- */\n\nimport {\n forwardRef,\n useCallback,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type MouseEvent,\n type ReactNode,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport * as RadixDialog from '@radix-ui/react-dialog';\nimport { EyeOff, LogOut, User } from 'lucide-react';\nimport { Button } from '../button';\nimport { IconButton } from '../button/icon-button';\nimport { Logo } from '../logo';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { privacyLockAgent } from './privacy-lock.agent';\n\n/* ------------------------------------------------------------------ */\n/* Props */\n/* ------------------------------------------------------------------ */\n\n/** Curated imperative handle for agent / external automation. */\nexport interface PrivacyLockHandle {\n isLocked: () => boolean;\n lock: () => void;\n unlock: () => void;\n}\n\nexport interface PrivacyLockProps {\n /** Controlled open state. Pair with `onOpenChange`. */\n open?: boolean;\n /** Uncontrolled initial state. Ignored when `open` is provided. */\n defaultOpen?: boolean;\n /** Fires whenever the dialog opens or closes — trigger click, action button, etc. */\n onOpenChange?: (open: boolean) => void;\n\n /** Fires when the \"Unlock screen\" button is activated. Dialog closes automatically. */\n onUnlock?: () => void;\n /** Fires when \"Account page\" is activated. Button is omitted when undefined. Dialog closes automatically. */\n onAccountPage?: () => void;\n /** Fires when \"Log out\" is activated. Button is omitted when undefined. Dialog closes automatically. */\n onSignOut?: () => void;\n\n /** Override the trigger icon. Default: `lucide-react` `<EyeOff />`. */\n triggerIcon?: ReactNode;\n /** Accessible name for the trigger. Default: t('privacyLock.triggerAriaLabel'). */\n triggerAriaLabel?: string;\n /** Tooltip for the trigger. Default: t('privacyLock.triggerTooltip'). */\n triggerTooltip?: string;\n\n /** Accessible title of the dialog (visually hidden). Default: t('privacyLock.title'). */\n title?: string;\n /** Visible supporting text under the action buttons. Default: t('privacyLock.description'). */\n description?: string;\n /** Label for the \"Unlock screen\" button. Default: t('privacyLock.unlock'). */\n unlockLabel?: string;\n /** Label for the \"Account page\" button. Default: t('privacyLock.accountPage'). */\n accountPageLabel?: string;\n /** Label for the \"Log out\" button. Default: t('privacyLock.signOut'). */\n signOutLabel?: string;\n\n /** Extra classes on the trigger `IconButton`. */\n className?: string;\n}\n\n/* ------------------------------------------------------------------ */\n/* Root */\n/* ------------------------------------------------------------------ */\n\nexport const PrivacyLock = forwardRef<HTMLButtonElement, PrivacyLockProps>(\n (\n {\n open,\n defaultOpen = false,\n onOpenChange,\n onUnlock,\n onAccountPage,\n onSignOut,\n triggerIcon,\n triggerAriaLabel,\n triggerTooltip,\n title,\n description,\n unlockLabel,\n accountPageLabel,\n signOutLabel,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);\n const isControlled = open !== undefined;\n const isOpen = isControlled ? open : uncontrolledOpen;\n\n const setOpen = useCallback(\n (next: boolean) => {\n if (!isControlled) setUncontrolledOpen(next);\n onOpenChange?.(next);\n },\n [isControlled, onOpenChange],\n );\n\n const latestOpenRef = useRef(isOpen);\n latestOpenRef.current = isOpen;\n\n const triggerRef = useRef<HTMLButtonElement>(null);\n useImperativeHandle(ref, () => triggerRef.current as HTMLButtonElement, []);\n\n const agentHandle = useMemo<PrivacyLockHandle>(\n () => ({\n isLocked: () => latestOpenRef.current,\n lock: () => setOpen(true),\n unlock: () => setOpen(false),\n }),\n [setOpen],\n );\n useAgentRegistration(\n privacyLockAgent,\n agentHandle,\n (rest as { id?: string }).id,\n );\n\n // Every action closes the dialog after firing the consumer's\n // callback. Consumers that need to keep the dialog open (e.g.\n // confirmation step) should control `open` themselves and skip the\n // close on the relevant callback.\n const handleAction = useCallback(\n (callback?: () => void) => (event: MouseEvent<HTMLButtonElement>) => {\n callback?.();\n // Only close if the consumer didn't preventDefault — lets a\n // controlled consumer stop the auto-close for guarded actions.\n if (!event.defaultPrevented) setOpen(false);\n },\n [setOpen],\n );\n\n const resolvedTriggerAriaLabel =\n triggerAriaLabel ??\n t('privacyLock.triggerAriaLabel', 'Lock screen for privacy');\n const resolvedTriggerTooltip =\n triggerTooltip ?? t('privacyLock.triggerTooltip', 'Lock screen');\n const resolvedTitle =\n title ?? t('privacyLock.title', 'Screen locked for privacy');\n const resolvedDescription =\n description ??\n t(\n 'privacyLock.description',\n 'Locking the screen helps protect the privacy of your data.',\n );\n const resolvedUnlockLabel =\n unlockLabel ?? t('privacyLock.unlock', 'Unlock screen');\n const resolvedAccountPageLabel =\n accountPageLabel ?? t('privacyLock.accountPage', 'Account page');\n const resolvedSignOutLabel =\n signOutLabel ?? t('privacyLock.signOut', 'Log out');\n\n return (\n <RadixDialog.Root open={isOpen} onOpenChange={setOpen}>\n <RadixDialog.Trigger asChild>\n <IconButton\n ref={triggerRef}\n icon={triggerIcon ?? <EyeOff aria-hidden />}\n aria-label={resolvedTriggerAriaLabel}\n tooltip={resolvedTriggerTooltip}\n className={className}\n data-component=\"privacy-lock\"\n data-component-id={(rest as { id?: string }).id}\n {...rest}\n />\n </RadixDialog.Trigger>\n <RadixDialog.Portal>\n <RadixDialog.Overlay\n className={[\n 'ds:fixed ds:inset-0 ds:z-[var(--z-modal-backdrop)]',\n 'ds:bg-[var(--background)]/40 ds:backdrop-blur-xl',\n // Fade-in / fade-out via Radix data-state. Gated on\n // motion-reduce per accessibility requirements.\n 'ds:data-[state=open]:animate-in ds:data-[state=open]:fade-in',\n 'ds:data-[state=closed]:animate-out ds:data-[state=closed]:fade-out',\n 'ds:motion-reduce:animate-none',\n ].join(' ')}\n />\n <RadixDialog.Content\n aria-label={resolvedTitle}\n // Make the overlay non-dismissible by ambient input. The only\n // way out is an explicit action button — preserving the\n // \"locked\" contract. Screen readers + assistive tech still\n // reach the buttons via Tab.\n onEscapeKeyDown={(event) => event.preventDefault()}\n onPointerDownOutside={(event) => event.preventDefault()}\n onInteractOutside={(event) => event.preventDefault()}\n // Radix's default closes the dialog and returns focus to the\n // trigger (per the WAI-ARIA Dialog pattern). Stacked with\n // Radix Tooltip — which opens on focus per the WAI-ARIA\n // Tooltip pattern — that produces a tooltip stuck on the\n // lock icon every time the user unlocks. PrivacyLock's UX\n // contract is \"unlock and get out of the user's way\" (cf.\n // macOS / Windows / 1Password unlock flows: focus returns to\n // the page, not the unlock control), so we opt out of\n // Radix's auto-focus return and let focus fall to the body.\n onCloseAutoFocus={(event) => event.preventDefault()}\n className={[\n 'ds:fixed ds:inset-0 ds:z-[var(--z-modal)]',\n 'ds:flex ds:items-center ds:justify-center',\n 'ds:focus:outline-none',\n 'ds:text-[color:var(--foreground)]',\n 'ds:data-[state=open]:animate-in ds:data-[state=open]:fade-in',\n 'ds:motion-reduce:animate-none',\n ].join(' ')}\n >\n <div className=\"ds:flex ds:flex-col ds:items-center ds:gap-[var(--spacing-lg)] ds:w-[min(22rem,calc(100vw-var(--spacing-xl)))] ds:text-center\">\n <Logo size=\"xl\" decorative />\n <RadixDialog.Title className=\"ds:sr-only\">\n {resolvedTitle}\n </RadixDialog.Title>\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)] ds:w-full\">\n <Button\n intent=\"primary\"\n startIcon={<EyeOff aria-hidden />}\n onClick={handleAction(onUnlock)}\n >\n {resolvedUnlockLabel}\n </Button>\n {onAccountPage ? (\n <Button\n intent=\"secondary\"\n startIcon={<User aria-hidden />}\n onClick={handleAction(onAccountPage)}\n >\n {resolvedAccountPageLabel}\n </Button>\n ) : null}\n {onSignOut ? (\n <Button\n intent=\"secondary\"\n startIcon={<LogOut aria-hidden />}\n onClick={handleAction(onSignOut)}\n >\n {resolvedSignOutLabel}\n </Button>\n ) : null}\n </div>\n <RadixDialog.Description className=\"type-body-sm ds:opacity-90\">\n {resolvedDescription}\n </RadixDialog.Description>\n </div>\n </RadixDialog.Content>\n </RadixDialog.Portal>\n </RadixDialog.Root>\n );\n },\n);\nPrivacyLock.displayName = 'PrivacyLock';\n"],"names":["privacyLockAgent","handle","PrivacyLock","forwardRef","open","defaultOpen","onOpenChange","onUnlock","onAccountPage","onSignOut","triggerIcon","triggerAriaLabel","triggerTooltip","title","description","unlockLabel","accountPageLabel","signOutLabel","className","rest","ref","t","useTranslation","uncontrolledOpen","setUncontrolledOpen","useState","isControlled","isOpen","setOpen","useCallback","next","latestOpenRef","useRef","triggerRef","useImperativeHandle","agentHandle","useMemo","useAgentRegistration","handleAction","callback","event","resolvedTriggerAriaLabel","resolvedTriggerTooltip","resolvedTitle","resolvedDescription","resolvedUnlockLabel","resolvedAccountPageLabel","resolvedSignOutLabel","RadixDialog","jsx","IconButton","EyeOff","jsxs","Logo","Button","User","LogOut"],"mappings":";;;;;;;;;;;AAOO,MAAMA,IAAoD;AAAA,EAC/D,IAAI;AAAA,EACJ,cAAc,CAAC,UAAU,SAAS;AAAA,EAClC,OAAO;AAAA,IACL,UAAU;AAAA,MACR,MAAM;AAAA,MACN,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,MAAM,CAACC,MAAWA,EAAO,SAAA;AAAA,IAAS;AAAA,EACpC;AAAA,EAEF,SAAS;AAAA,IACP,MAAM;AAAA,MACJ,QAAQ;AAAA,MACR,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,QAAQ,CAACA,MAAW;AAClB,QAAAA,EAAO,KAAA;AAAA,MACT;AAAA,IAAA;AAAA,IAEF,QAAQ;AAAA,MACN,QAAQ;AAAA,MACR,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,QAAQ,CAACA,MAAW;AAClB,QAAAA,EAAO,OAAA;AAAA,MACT;AAAA,IAAA;AAAA,EACF;AAAA,EAEF,UAAU;AAAA,IACR,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IAAA;AAAA,IAEf,YAAY;AAAA,MACV,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,aAAa;AAAA,IAAA;AAAA,EACf;AAEJ,GCqCaC,KAAcC;AAAA,EACzB,CACE;AAAA,IACE,MAAAC;AAAA,IACA,aAAAC,IAAc;AAAA,IACd,cAAAC;AAAA,IACA,UAAAC;AAAA,IACA,eAAAC;AAAA,IACA,WAAAC;AAAA,IACA,aAAAC;AAAA,IACA,kBAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,OAAAC;AAAA,IACA,aAAAC;AAAA,IACA,aAAAC;AAAA,IACA,kBAAAC;AAAA,IACA,cAAAC;AAAA,IACA,WAAAC;AAAA,IACA,GAAGC;AAAA,EAAA,GAELC,MACG;AACH,UAAM,EAAE,GAAAC,EAAA,IAAMC,EAAA,GACR,CAACC,GAAkBC,CAAmB,IAAIC,EAASpB,CAAW,GAC9DqB,IAAetB,MAAS,QACxBuB,IAASD,IAAetB,IAAOmB,GAE/BK,IAAUC;AAAA,MACd,CAACC,MAAkB;AACjB,QAAKJ,KAAcF,EAAoBM,CAAI,GAC3CxB,KAAA,QAAAA,EAAewB;AAAA,MACjB;AAAA,MACA,CAACJ,GAAcpB,CAAY;AAAA,IAAA,GAGvByB,IAAgBC,EAAOL,CAAM;AACnC,IAAAI,EAAc,UAAUJ;AAExB,UAAMM,IAAaD,EAA0B,IAAI;AACjD,IAAAE,EAAoBd,GAAK,MAAMa,EAAW,SAA8B,CAAA,CAAE;AAE1E,UAAME,IAAcC;AAAA,MAClB,OAAO;AAAA,QACL,UAAU,MAAML,EAAc;AAAA,QAC9B,MAAM,MAAMH,EAAQ,EAAI;AAAA,QACxB,QAAQ,MAAMA,EAAQ,EAAK;AAAA,MAAA;AAAA,MAE7B,CAACA,CAAO;AAAA,IAAA;AAEV,IAAAS;AAAA,MACErC;AAAA,MACAmC;AAAA,MACChB,EAAyB;AAAA,IAAA;AAO5B,UAAMmB,IAAeT;AAAA,MACnB,CAACU,MAA0B,CAACC,MAAyC;AACnE,QAAAD,KAAA,QAAAA,KAGKC,EAAM,oBAAkBZ,EAAQ,EAAK;AAAA,MAC5C;AAAA,MACA,CAACA,CAAO;AAAA,IAAA,GAGJa,IACJ9B,KACAU,EAAE,gCAAgC,yBAAyB,GACvDqB,IACJ9B,KAAkBS,EAAE,8BAA8B,aAAa,GAC3DsB,IACJ9B,KAASQ,EAAE,qBAAqB,2BAA2B,GACvDuB,IACJ9B,KACAO;AAAA,MACE;AAAA,MACA;AAAA,IAAA,GAEEwB,IACJ9B,KAAeM,EAAE,sBAAsB,eAAe,GAClDyB,IACJ9B,KAAoBK,EAAE,2BAA2B,cAAc,GAC3D0B,IACJ9B,KAAgBI,EAAE,uBAAuB,SAAS;AAEpD,6BACG2B,EAAY,MAAZ,EAAiB,MAAMrB,GAAQ,cAAcC,GAC5C,UAAA;AAAA,MAAA,gBAAAqB,EAACD,EAAY,SAAZ,EAAoB,SAAO,IAC1B,UAAA,gBAAAC;AAAA,QAACC;AAAA,QAAA;AAAA,UACC,KAAKjB;AAAA,UACL,MAAMvB,KAAe,gBAAAuC,EAACE,GAAA,EAAO,eAAW,IAAC;AAAA,UACzC,cAAYV;AAAA,UACZ,SAASC;AAAA,UACT,WAAAxB;AAAA,UACA,kBAAe;AAAA,UACf,qBAAoBC,EAAyB;AAAA,UAC5C,GAAGA;AAAA,QAAA;AAAA,MAAA,GAER;AAAA,MACA,gBAAAiC,EAACJ,EAAY,QAAZ,EACC,UAAA;AAAA,QAAA,gBAAAC;AAAA,UAACD,EAAY;AAAA,UAAZ;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACA;AAAA;AAAA;AAAA,cAGA;AAAA,cACA;AAAA,cACA;AAAA,YAAA,EACA,KAAK,GAAG;AAAA,UAAA;AAAA,QAAA;AAAA,QAEZ,gBAAAC;AAAA,UAACD,EAAY;AAAA,UAAZ;AAAA,YACC,cAAYL;AAAA,YAKZ,iBAAiB,CAACH,MAAUA,EAAM,eAAA;AAAA,YAClC,sBAAsB,CAACA,MAAUA,EAAM,eAAA;AAAA,YACvC,mBAAmB,CAACA,MAAUA,EAAM,eAAA;AAAA,YAUpC,kBAAkB,CAACA,MAAUA,EAAM,eAAA;AAAA,YACnC,WAAW;AAAA,cACT;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YAAA,EACA,KAAK,GAAG;AAAA,YAEV,UAAA,gBAAAY,EAAC,OAAA,EAAI,WAAU,iIACb,UAAA;AAAA,cAAA,gBAAAH,EAACI,GAAA,EAAK,MAAK,MAAK,YAAU,IAAC;AAAA,gCAC1BL,EAAY,OAAZ,EAAkB,WAAU,cAC1B,UAAAL,GACH;AAAA,cACA,gBAAAS,EAAC,OAAA,EAAI,WAAU,4DACb,UAAA;AAAA,gBAAA,gBAAAH;AAAA,kBAACK;AAAA,kBAAA;AAAA,oBACC,QAAO;AAAA,oBACP,WAAW,gBAAAL,EAACE,GAAA,EAAO,eAAW,GAAA,CAAC;AAAA,oBAC/B,SAASb,EAAa/B,CAAQ;AAAA,oBAE7B,UAAAsC;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAEFrC,IACC,gBAAAyC;AAAA,kBAACK;AAAA,kBAAA;AAAA,oBACC,QAAO;AAAA,oBACP,WAAW,gBAAAL,EAACM,GAAA,EAAK,eAAW,GAAA,CAAC;AAAA,oBAC7B,SAASjB,EAAa9B,CAAa;AAAA,oBAElC,UAAAsC;AAAA,kBAAA;AAAA,gBAAA,IAED;AAAA,gBACHrC,IACC,gBAAAwC;AAAA,kBAACK;AAAA,kBAAA;AAAA,oBACC,QAAO;AAAA,oBACP,WAAW,gBAAAL,EAACO,GAAA,EAAO,eAAW,GAAA,CAAC;AAAA,oBAC/B,SAASlB,EAAa7B,CAAS;AAAA,oBAE9B,UAAAsC;AAAA,kBAAA;AAAA,gBAAA,IAED;AAAA,cAAA,GACN;AAAA,gCACCC,EAAY,aAAZ,EAAwB,WAAU,8BAChC,UAAAJ,EAAA,CACH;AAAA,YAAA,EAAA,CACF;AAAA,UAAA;AAAA,QAAA;AAAA,MACF,EAAA,CACF;AAAA,IAAA,GACF;AAAA,EAEJ;AACF;AACA1C,GAAY,cAAc;"}
1
+ {"version":3,"file":"privacy-lock-BI4vi9Ud.js","sources":["../../src/components/privacy-lock/privacy-lock.agent.ts","../../src/components/privacy-lock/privacy-lock.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — PrivacyLock. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { PrivacyLockHandle } from './privacy-lock';\n\nexport const privacyLockAgent: AgentAdapter<PrivacyLockHandle> = {\n id: 'privacy-lock',\n capabilities: ['submit', 'dismiss'],\n state: {\n isLocked: {\n type: 'boolean',\n descriptionKey: 'ui.agent.privacyLock.state.isLocked',\n description: 'True when the privacy overlay is open.',\n read: (handle) => handle.isLocked(),\n },\n },\n actions: {\n lock: {\n safety: 'write',\n descriptionKey: 'ui.agent.privacyLock.actions.lock',\n description: 'Open the privacy overlay.',\n invoke: (handle) => {\n handle.lock();\n },\n },\n unlock: {\n safety: 'write',\n descriptionKey: 'ui.agent.privacyLock.actions.unlock',\n description: 'Close the privacy overlay (consumer-confirmed action).',\n invoke: (handle) => {\n handle.unlock();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'privacy-lock',\n description: 'Marks the PrivacyLock trigger.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","/* -------------------------------------------------------------------- */\n/* PrivacyLock — a one-click \"lock my screen\" dialog for operator */\n/* workstations on shared clinic hardware. Clicking the trigger paints */\n/* a full-viewport privacy overlay (blurred backdrop + centred card); */\n/* the only ways out are the three action buttons the consumer wires. */\n/* */\n/* Composed of one `IconButton` trigger and a Radix Dialog overlay. The */\n/* dialog is intentionally *not* dismissible via Escape or outside-click */\n/* — the whole point is to make the screen unreadable until the user */\n/* takes an explicit action. */\n/* */\n/* See `src/components/privacy-lock/privacy-lock.mdx` for usage. */\n/* -------------------------------------------------------------------- */\n\nimport {\n forwardRef,\n useCallback,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type MouseEvent,\n type ReactNode,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport * as RadixDialog from '@radix-ui/react-dialog';\nimport { EyeOff, LogOut, User } from 'lucide-react';\nimport { Button } from '../button';\nimport { IconButton } from '../button/icon-button';\nimport { Logo } from '../logo';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { privacyLockAgent } from './privacy-lock.agent';\n\n/* ------------------------------------------------------------------ */\n/* Props */\n/* ------------------------------------------------------------------ */\n\n/** Curated imperative handle for agent / external automation. */\nexport interface PrivacyLockHandle {\n isLocked: () => boolean;\n lock: () => void;\n unlock: () => void;\n}\n\nexport interface PrivacyLockProps {\n /** Controlled open state. Pair with `onOpenChange`. */\n open?: boolean;\n /** Uncontrolled initial state. Ignored when `open` is provided. */\n defaultOpen?: boolean;\n /** Fires whenever the dialog opens or closes — trigger click, action button, etc. */\n onOpenChange?: (open: boolean) => void;\n\n /** Fires when the \"Unlock screen\" button is activated. Dialog closes automatically. */\n onUnlock?: () => void;\n /** Fires when \"Account page\" is activated. Button is omitted when undefined. Dialog closes automatically. */\n onAccountPage?: () => void;\n /** Fires when \"Log out\" is activated. Button is omitted when undefined. Dialog closes automatically. */\n onSignOut?: () => void;\n\n /** Override the trigger icon. Default: `lucide-react` `<EyeOff />`. */\n triggerIcon?: ReactNode;\n /** Accessible name for the trigger. Default: t('privacyLock.triggerAriaLabel'). */\n triggerAriaLabel?: string;\n /** Tooltip for the trigger. Default: t('privacyLock.triggerTooltip'). */\n triggerTooltip?: string;\n\n /** Accessible title of the dialog (visually hidden). Default: t('privacyLock.title'). */\n title?: string;\n /** Visible supporting text under the action buttons. Default: t('privacyLock.description'). */\n description?: string;\n /** Label for the \"Unlock screen\" button. Default: t('privacyLock.unlock'). */\n unlockLabel?: string;\n /** Label for the \"Account page\" button. Default: t('privacyLock.accountPage'). */\n accountPageLabel?: string;\n /** Label for the \"Log out\" button. Default: t('privacyLock.signOut'). */\n signOutLabel?: string;\n\n /** Extra classes on the trigger `IconButton`. */\n className?: string;\n}\n\n/* ------------------------------------------------------------------ */\n/* Root */\n/* ------------------------------------------------------------------ */\n\nexport const PrivacyLock = forwardRef<HTMLButtonElement, PrivacyLockProps>(\n (\n {\n open,\n defaultOpen = false,\n onOpenChange,\n onUnlock,\n onAccountPage,\n onSignOut,\n triggerIcon,\n triggerAriaLabel,\n triggerTooltip,\n title,\n description,\n unlockLabel,\n accountPageLabel,\n signOutLabel,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);\n const isControlled = open !== undefined;\n const isOpen = isControlled ? open : uncontrolledOpen;\n\n const setOpen = useCallback(\n (next: boolean) => {\n if (!isControlled) setUncontrolledOpen(next);\n onOpenChange?.(next);\n },\n [isControlled, onOpenChange],\n );\n\n const latestOpenRef = useRef(isOpen);\n latestOpenRef.current = isOpen;\n\n const triggerRef = useRef<HTMLButtonElement>(null);\n useImperativeHandle(ref, () => triggerRef.current as HTMLButtonElement, []);\n\n const agentHandle = useMemo<PrivacyLockHandle>(\n () => ({\n isLocked: () => latestOpenRef.current,\n lock: () => setOpen(true),\n unlock: () => setOpen(false),\n }),\n [setOpen],\n );\n useAgentRegistration(\n privacyLockAgent,\n agentHandle,\n (rest as { id?: string }).id,\n );\n\n // Every action closes the dialog after firing the consumer's\n // callback. Consumers that need to keep the dialog open (e.g.\n // confirmation step) should control `open` themselves and skip the\n // close on the relevant callback.\n const handleAction = useCallback(\n (callback?: () => void) => (event: MouseEvent<HTMLButtonElement>) => {\n callback?.();\n // Only close if the consumer didn't preventDefault — lets a\n // controlled consumer stop the auto-close for guarded actions.\n if (!event.defaultPrevented) setOpen(false);\n },\n [setOpen],\n );\n\n const resolvedTriggerAriaLabel =\n triggerAriaLabel ??\n t('privacyLock.triggerAriaLabel', 'Lock screen for privacy');\n const resolvedTriggerTooltip =\n triggerTooltip ?? t('privacyLock.triggerTooltip', 'Lock screen');\n const resolvedTitle =\n title ?? t('privacyLock.title', 'Screen locked for privacy');\n const resolvedDescription =\n description ??\n t(\n 'privacyLock.description',\n 'Locking the screen helps protect the privacy of your data.',\n );\n const resolvedUnlockLabel =\n unlockLabel ?? t('privacyLock.unlock', 'Unlock screen');\n const resolvedAccountPageLabel =\n accountPageLabel ?? t('privacyLock.accountPage', 'Account page');\n const resolvedSignOutLabel =\n signOutLabel ?? t('privacyLock.signOut', 'Log out');\n\n return (\n <RadixDialog.Root open={isOpen} onOpenChange={setOpen}>\n <RadixDialog.Trigger asChild>\n <IconButton\n ref={triggerRef}\n icon={triggerIcon ?? <EyeOff aria-hidden />}\n aria-label={resolvedTriggerAriaLabel}\n tooltip={resolvedTriggerTooltip}\n className={className}\n data-component=\"privacy-lock\"\n data-component-id={(rest as { id?: string }).id}\n {...rest}\n />\n </RadixDialog.Trigger>\n <RadixDialog.Portal>\n <RadixDialog.Overlay\n className={[\n 'ds:fixed ds:inset-0 ds:z-[var(--z-modal-backdrop)]',\n 'ds:bg-[var(--background)]/40 ds:backdrop-blur-xl',\n // Fade-in / fade-out via Radix data-state. Gated on\n // motion-reduce per accessibility requirements.\n 'ds:data-[state=open]:animate-in ds:data-[state=open]:fade-in',\n 'ds:data-[state=closed]:animate-out ds:data-[state=closed]:fade-out',\n 'ds:motion-reduce:animate-none',\n ].join(' ')}\n />\n <RadixDialog.Content\n aria-label={resolvedTitle}\n // Make the overlay non-dismissible by ambient input. The only\n // way out is an explicit action button — preserving the\n // \"locked\" contract. Screen readers + assistive tech still\n // reach the buttons via Tab.\n onEscapeKeyDown={(event) => event.preventDefault()}\n onPointerDownOutside={(event) => event.preventDefault()}\n onInteractOutside={(event) => event.preventDefault()}\n // Radix's default closes the dialog and returns focus to the\n // trigger (per the WAI-ARIA Dialog pattern). Stacked with\n // Radix Tooltip — which opens on focus per the WAI-ARIA\n // Tooltip pattern — that produces a tooltip stuck on the\n // lock icon every time the user unlocks. PrivacyLock's UX\n // contract is \"unlock and get out of the user's way\" (cf.\n // macOS / Windows / 1Password unlock flows: focus returns to\n // the page, not the unlock control), so we opt out of\n // Radix's auto-focus return and let focus fall to the body.\n onCloseAutoFocus={(event) => event.preventDefault()}\n className={[\n 'ds:fixed ds:inset-0 ds:z-[var(--z-modal)]',\n 'ds:flex ds:items-center ds:justify-center',\n 'ds:focus:outline-none',\n 'ds:text-[color:var(--foreground)]',\n 'ds:data-[state=open]:animate-in ds:data-[state=open]:fade-in',\n 'ds:motion-reduce:animate-none',\n ].join(' ')}\n >\n <div className=\"ds:flex ds:flex-col ds:items-center ds:gap-[var(--spacing-lg)] ds:w-[min(22rem,calc(100vw-var(--spacing-xl)))] ds:text-center\">\n <Logo size=\"xl\" decorative />\n <RadixDialog.Title className=\"ds:sr-only\">\n {resolvedTitle}\n </RadixDialog.Title>\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)] ds:w-full\">\n <Button\n intent=\"primary\"\n startIcon={<EyeOff aria-hidden />}\n onClick={handleAction(onUnlock)}\n >\n {resolvedUnlockLabel}\n </Button>\n {onAccountPage ? (\n <Button\n intent=\"secondary\"\n startIcon={<User aria-hidden />}\n onClick={handleAction(onAccountPage)}\n >\n {resolvedAccountPageLabel}\n </Button>\n ) : null}\n {onSignOut ? (\n <Button\n intent=\"secondary\"\n startIcon={<LogOut aria-hidden />}\n onClick={handleAction(onSignOut)}\n >\n {resolvedSignOutLabel}\n </Button>\n ) : null}\n </div>\n <RadixDialog.Description className=\"type-body-sm ds:opacity-90\">\n {resolvedDescription}\n </RadixDialog.Description>\n </div>\n </RadixDialog.Content>\n </RadixDialog.Portal>\n </RadixDialog.Root>\n );\n },\n);\nPrivacyLock.displayName = 'PrivacyLock';\n"],"names":["privacyLockAgent","handle","PrivacyLock","forwardRef","open","defaultOpen","onOpenChange","onUnlock","onAccountPage","onSignOut","triggerIcon","triggerAriaLabel","triggerTooltip","title","description","unlockLabel","accountPageLabel","signOutLabel","className","rest","ref","t","useTranslation","uncontrolledOpen","setUncontrolledOpen","useState","isControlled","isOpen","setOpen","useCallback","next","latestOpenRef","useRef","triggerRef","useImperativeHandle","agentHandle","useMemo","useAgentRegistration","handleAction","callback","event","resolvedTriggerAriaLabel","resolvedTriggerTooltip","resolvedTitle","resolvedDescription","resolvedUnlockLabel","resolvedAccountPageLabel","resolvedSignOutLabel","RadixDialog","jsx","IconButton","EyeOff","jsxs","Logo","Button","User","LogOut"],"mappings":"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"}
@@ -1,10 +1,10 @@
1
- import { jsx as s, jsxs as t, Fragment as _ } from "react/jsx-runtime";
1
+ import { jsx as s, jsxs as i, Fragment as _ } from "react/jsx-runtime";
2
2
  import { forwardRef as h, useId as Q, useState as y, useCallback as M, useImperativeHandle as U, useContext as N, useEffect as B, useRef as D, createContext as Z } from "react";
3
3
  import { c as C } from "./index-D2ZczOXr.js";
4
4
  import { useTranslation as ss } from "react-i18next";
5
5
  import * as m from "@radix-ui/react-navigation-menu";
6
- import { I as es } from "./icon-button-C4CGcYuz.js";
7
- import { S as f } from "./sheet-BT0izeoI.js";
6
+ import { I as es } from "./icon-button-BRHSSFmZ.js";
7
+ import { S as f } from "./sheet-D8M8hf8B.js";
8
8
  import { C as I } from "./chevron-down-BX_NP2Yh.js";
9
9
  import { X as ds } from "./x-CCcI3eJp.js";
10
10
  import { M as as } from "./menu-XRhW3_99.js";
@@ -28,18 +28,25 @@ const g = Z("desktop"), ns = C(
28
28
  "ds:bg-transparent ds:text-[var(--foreground)]",
29
29
  "ds:data-[stuck=true]:bg-[var(--card)]",
30
30
  "ds:data-[stuck=true]:shadow-[var(--shadow-md)]",
31
+ // Once stuck, pair the elevation shadow with a tokenized
32
+ // block-end border so the header has a clear edge against the
33
+ // page below it — shadow alone fades to a faint halo on dark
34
+ // surfaces, leaving the bar reading as unbounded.
35
+ "ds:data-[stuck=true]:border-block-end ds:data-[stuck=true]:border-[color:var(--border)]",
31
36
  "ds:forced-colors:border-b ds:forced-colors:border-[CanvasText]"
32
37
  ].join(" "),
33
38
  // `dark` flips its own scope into the dark token set so nav
34
- // links + buttons inside read off-white text on the blue-800
39
+ // links + buttons inside read off-white text on the dark
35
40
  // surface. Without the `theme-dark` scope the children inherit
36
- // the light-theme `--foreground` (blue-500) and fail
37
- // color-contrast at ~1.3:1.
41
+ // the light-theme `--foreground` and fail color-contrast at
42
+ // ~1.3:1. `--background` already resolves to a dark step under
43
+ // `theme-dark`, so we compose the surface from the standard
44
+ // theme token rather than locking to a raw ramp step.
38
45
  dark: [
39
46
  "ds:flex ds:items-center ds:gap-[var(--spacing-md)]",
40
47
  "ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:sm:ps-[var(--spacing-lg)] ds:sm:pe-[var(--spacing-lg)]",
41
48
  "ds:h-14 ds:md:h-16",
42
- "theme-dark ds:bg-[var(--color-blue-800)] ds:text-[var(--foreground)]"
49
+ "theme-dark ds:bg-[var(--background)] ds:text-[var(--foreground)]"
43
50
  ].join(" "),
44
51
  // `pill` matches alfadocs.com's floating rounded-pill header.
45
52
  // The outer header is fully transparent (no border, no bg) and
@@ -89,7 +96,8 @@ const g = Z("desktop"), ns = C(
89
96
  "ds:inline-flex ds:items-center",
90
97
  "type-body-sm ds:font-medium",
91
98
  // Muted-foreground reads as secondary text and matches alfadocs.com's
92
- // nav-link colour (`#545875`). `--foreground` was too dark vs the ref.
99
+ // nav-link colour (the reference's slate-grey). `--foreground` was too
100
+ // dark vs the ref.
93
101
  "ds:text-[var(--muted-foreground)]",
94
102
  "ds:rounded-[var(--radius-sm)]",
95
103
  "ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:py-[var(--spacing-xs)]",
@@ -100,7 +108,7 @@ const g = Z("desktop"), ns = C(
100
108
  "ds:data-[active=true]:text-[var(--primary)]",
101
109
  "ds:data-[active=true]:[box-shadow:inset_0_-2px_0_var(--primary)]"
102
110
  ].join(" ")
103
- ), is = [
111
+ ), ts = [
104
112
  "ds:group ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]",
105
113
  "type-body-sm ds:font-medium",
106
114
  // Mirror the navLinkVariants colour + inline padding so triggers and
@@ -114,7 +122,7 @@ const g = Z("desktop"), ns = C(
114
122
  "ds:hover:text-[var(--primary)]",
115
123
  "ds:data-[state=open]:text-[var(--primary)]",
116
124
  "ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none"
117
- ].join(" "), ts = [
125
+ ].join(" "), is = [
118
126
  "ds:size-3 ds:shrink-0",
119
127
  "ds:transition-transform ds:duration-[var(--animation-duration)]",
120
128
  "ds:group-data-[state=open]:rotate-180",
@@ -199,13 +207,13 @@ function ps() {
199
207
  }, []), e;
200
208
  }
201
209
  function vs(e, n, d) {
202
- const [a, i] = y(!1), [r, o] = y(!1), c = D(0), p = D(!1);
210
+ const [a, t] = y(!1), [r, o] = y(!1), c = D(0), p = D(!1);
203
211
  return B(() => {
204
212
  if (!e || typeof window > "u") return;
205
213
  c.current = window.scrollY;
206
214
  const l = () => {
207
215
  const v = window.scrollY;
208
- if (i(v > d), n === "scroll-up") {
216
+ if (t(v > d), n === "scroll-up") {
209
217
  const b = v - c.current;
210
218
  b > 4 && v > d ? o(!0) : (b < -4 || v <= d) && o(!1);
211
219
  }
@@ -223,14 +231,14 @@ function R({
223
231
  homeHref: n,
224
232
  resolvedHomeLabel: d,
225
233
  resolvedNavLabel: a,
226
- resolvedMenuLabel: i,
234
+ resolvedMenuLabel: t,
227
235
  navSlot: r,
228
236
  actionsSlot: o,
229
237
  menuOpen: c,
230
238
  setMenuOpen: p,
231
239
  sheetId: l
232
240
  }) {
233
- return /* @__PURE__ */ t(_, { children: [
241
+ return /* @__PURE__ */ i(_, { children: [
234
242
  /* @__PURE__ */ s(
235
243
  "a",
236
244
  {
@@ -240,7 +248,7 @@ function R({
240
248
  children: e
241
249
  }
242
250
  ),
243
- r ? /* @__PURE__ */ s(g.Provider, { value: "desktop", children: /* @__PURE__ */ t(
251
+ r ? /* @__PURE__ */ s(g.Provider, { value: "desktop", children: /* @__PURE__ */ i(
244
252
  m.Root,
245
253
  {
246
254
  "aria-label": a,
@@ -253,7 +261,7 @@ function R({
253
261
  }
254
262
  ) }) : null,
255
263
  o ? /* @__PURE__ */ s("div", { className: "ds:hidden ds:md:flex ds:items-center ds:gap-[var(--spacing-sm)] ds:ms-auto", children: o }) : null,
256
- /* @__PURE__ */ t(f, { open: c, onOpenChange: p, children: [
264
+ /* @__PURE__ */ i(f, { open: c, onOpenChange: p, children: [
257
265
  /* @__PURE__ */ s(f.Trigger, { asChild: !0, children: /* @__PURE__ */ s(
258
266
  es,
259
267
  {
@@ -263,12 +271,12 @@ function R({
263
271
  icon: c ? /* @__PURE__ */ s(ds, { "aria-hidden": "true" }) : /* @__PURE__ */ s(as, { "aria-hidden": "true" }),
264
272
  "aria-controls": l,
265
273
  "aria-expanded": c,
266
- "aria-label": i
274
+ "aria-label": t
267
275
  }
268
276
  ) }),
269
- /* @__PURE__ */ t(f.Content, { side: "end", size: "md", id: l, children: [
277
+ /* @__PURE__ */ i(f.Content, { side: "end", size: "md", id: l, children: [
270
278
  /* @__PURE__ */ s(f.Header, { children: /* @__PURE__ */ s(f.Title, { children: a }) }),
271
- /* @__PURE__ */ s(f.Body, { children: /* @__PURE__ */ t("div", { className: "ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]", children: [
279
+ /* @__PURE__ */ s(f.Body, { children: /* @__PURE__ */ i("div", { className: "ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]", children: [
272
280
  r ? /* @__PURE__ */ s(g.Provider, { value: "mobile", children: /* @__PURE__ */ s(
273
281
  "nav",
274
282
  {
@@ -290,7 +298,7 @@ const E = h(
290
298
  homeHref: n = "/",
291
299
  homeLabel: d,
292
300
  navSlot: a,
293
- actionsSlot: i,
301
+ actionsSlot: t,
294
302
  variant: r = "pill",
295
303
  sticky: o = "none",
296
304
  stickyOffset: c = 80,
@@ -321,7 +329,7 @@ const E = h(
321
329
  resolvedNavLabel: J,
322
330
  resolvedMenuLabel: K,
323
331
  navSlot: a,
324
- actionsSlot: i,
332
+ actionsSlot: t,
325
333
  menuOpen: w,
326
334
  setMenuOpen: k,
327
335
  sheetId: q
@@ -350,10 +358,10 @@ const E = h(
350
358
  }
351
359
  );
352
360
  E.displayName = "PublicHeader";
353
- const T = h(({ active: e, className: n, children: d, ...a }, i) => N(g) === "mobile" ? /* @__PURE__ */ s(
361
+ const T = h(({ active: e, className: n, children: d, ...a }, t) => N(g) === "mobile" ? /* @__PURE__ */ s(
354
362
  "a",
355
363
  {
356
- ref: i,
364
+ ref: t,
357
365
  ...a,
358
366
  "data-active": e ? "true" : void 0,
359
367
  "aria-current": e ? "page" : void 0,
@@ -375,7 +383,7 @@ const T = h(({ active: e, className: n, children: d, ...a }, i) => N(g) === "mob
375
383
  ) : /* @__PURE__ */ s(m.Item, { children: /* @__PURE__ */ s(m.Link, { asChild: !0, active: e, children: /* @__PURE__ */ s(
376
384
  "a",
377
385
  {
378
- ref: i,
386
+ ref: t,
379
387
  ...a,
380
388
  "data-active": e ? "true" : void 0,
381
389
  "aria-current": e ? "page" : void 0,
@@ -384,14 +392,14 @@ const T = h(({ active: e, className: n, children: d, ...a }, i) => N(g) === "mob
384
392
  }
385
393
  ) }) }));
386
394
  T.displayName = "PublicHeader.NavLink";
387
- const V = h(({ label: e, wide: n = !1, children: d, id: a }, i) => N(g) === "mobile" ? /* @__PURE__ */ t(
395
+ const V = h(({ label: e, wide: n = !1, children: d, id: a }, t) => N(g) === "mobile" ? /* @__PURE__ */ i(
388
396
  "details",
389
397
  {
390
398
  id: a,
391
399
  "data-component": "public-header-nav-dropdown",
392
400
  className: "ds:group ds:border-b ds:border-[color:var(--border)]",
393
401
  children: [
394
- /* @__PURE__ */ t(
402
+ /* @__PURE__ */ i(
395
403
  "summary",
396
404
  {
397
405
  className: [
@@ -417,16 +425,16 @@ const V = h(({ label: e, wide: n = !1, children: d, id: a }, i) => N(g) === "mob
417
425
  /* @__PURE__ */ s("div", { className: "ds:flex ds:flex-col ds:gap-[var(--spacing-sm)] ds:py-[var(--spacing-sm)]", children: d })
418
426
  ]
419
427
  }
420
- ) : /* @__PURE__ */ t(m.Item, { "data-component": "public-header-nav-dropdown", children: [
421
- /* @__PURE__ */ t(
428
+ ) : /* @__PURE__ */ i(m.Item, { "data-component": "public-header-nav-dropdown", children: [
429
+ /* @__PURE__ */ i(
422
430
  m.Trigger,
423
431
  {
424
- ref: i,
432
+ ref: t,
425
433
  id: a,
426
- className: is,
434
+ className: ts,
427
435
  children: [
428
436
  e,
429
- /* @__PURE__ */ s(I, { "aria-hidden": "true", className: ts })
437
+ /* @__PURE__ */ s(I, { "aria-hidden": "true", className: is })
430
438
  ]
431
439
  }
432
440
  ),
@@ -439,7 +447,7 @@ const V = h(({ label: e, wide: n = !1, children: d, id: a }, i) => N(g) === "mob
439
447
  )
440
448
  ] }));
441
449
  V.displayName = "PublicHeader.NavDropdown";
442
- const O = h(({ href: e, title: n, subtitle: d, children: a }, i) => {
450
+ const O = h(({ href: e, title: n, subtitle: d, children: a }, t) => {
443
451
  const r = N(g), o = /* @__PURE__ */ s(
444
452
  "span",
445
453
  {
@@ -447,8 +455,8 @@ const O = h(({ href: e, title: n, subtitle: d, children: a }, i) => {
447
455
  className: "type-title-card ds:text-[var(--foreground)] ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none",
448
456
  children: n
449
457
  }
450
- ), l = /* @__PURE__ */ t(_, { children: [
451
- /* @__PURE__ */ t("div", { className: "ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]", children: [
458
+ ), l = /* @__PURE__ */ i(_, { children: [
459
+ /* @__PURE__ */ i("div", { className: "ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]", children: [
452
460
  o,
453
461
  d ? /* @__PURE__ */ s("span", { className: "type-body-sm ds:text-[var(--muted-foreground)]", children: d }) : null
454
462
  ] }),
@@ -458,7 +466,7 @@ const O = h(({ href: e, title: n, subtitle: d, children: a }, i) => {
458
466
  "data-card-arrow": !0,
459
467
  "aria-hidden": "true",
460
468
  className: "ds:flex-none ds:text-[var(--muted-foreground)] ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none ds:rtl:-scale-x-100",
461
- children: /* @__PURE__ */ t(
469
+ children: /* @__PURE__ */ i(
462
470
  "svg",
463
471
  {
464
472
  xmlns: "http://www.w3.org/2000/svg",
@@ -480,13 +488,13 @@ const O = h(({ href: e, title: n, subtitle: d, children: a }, i) => {
480
488
  )
481
489
  ] });
482
490
  let u;
483
- return e ? r === "mobile" ? u = /* @__PURE__ */ s("a", { href: e, className: z, children: l }) : u = /* @__PURE__ */ s(m.Link, { asChild: !0, children: /* @__PURE__ */ s("a", { href: e, className: z, children: l }) }) : u = /* @__PURE__ */ t("div", { className: us, children: [
491
+ return e ? r === "mobile" ? u = /* @__PURE__ */ s("a", { href: e, className: z, children: l }) : u = /* @__PURE__ */ s(m.Link, { asChild: !0, children: /* @__PURE__ */ s("a", { href: e, className: z, children: l }) }) : u = /* @__PURE__ */ i("div", { className: us, children: [
484
492
  o,
485
493
  d ? /* @__PURE__ */ s("span", { className: "ds:block type-body-sm ds:text-[var(--muted-foreground)] ds:mt-[var(--spacing-xs)]", children: d }) : null
486
- ] }), /* @__PURE__ */ t(
494
+ ] }), /* @__PURE__ */ i(
487
495
  "div",
488
496
  {
489
- ref: i,
497
+ ref: t,
490
498
  "data-component": "public-header-dropdown-card",
491
499
  className: "ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]",
492
500
  children: [
@@ -497,11 +505,11 @@ const O = h(({ href: e, title: n, subtitle: d, children: a }, i) => {
497
505
  );
498
506
  });
499
507
  O.displayName = "PublicHeader.DropdownCard";
500
- const S = h(({ active: e, className: n, children: d, ...a }, i) => {
508
+ const S = h(({ active: e, className: n, children: d, ...a }, t) => {
501
509
  const r = N(g), o = /* @__PURE__ */ s(
502
510
  "a",
503
511
  {
504
- ref: i,
512
+ ref: t,
505
513
  ...a,
506
514
  "data-active": e ? "true" : void 0,
507
515
  "aria-current": e ? "page" : void 0,
@@ -556,4 +564,4 @@ export {
556
564
  Cs as P,
557
565
  js as p
558
566
  };
559
- //# sourceMappingURL=public-header.agent-BQ3r6Hgq.js.map
567
+ //# sourceMappingURL=public-header.agent-5U3S9QiC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public-header.agent-5U3S9QiC.js","sources":["../../src/components/public-header/public-header.tsx","../../src/components/public-header/public-header.agent.ts"],"sourcesContent":["/* ------------------------------------------------------------------ */\n/* PublicHeader — anonymous / pre-auth site header. */\n/* */\n/* Distinct from the kit's `<Header>` (authenticated app shell): this */\n/* one is for booking-website, signature-website, marketing surfaces — */\n/* anywhere the chrome should read as continuous with `alfadocs.com`, */\n/* not as the logged-in app. */\n/* */\n/* DOM (default / transparent / dark variants): */\n/* <header role=banner data-component=public-header data-stuck=…> */\n/* <a aria-label=homeLabel>{logo}</a> */\n/* <Radix.NavigationMenu>…{navSlot}</Radix.NavigationMenu> ≥ md */\n/* <div class=actions>{actionsSlot}</div> ≥ md only */\n/* <IconButton menu trigger /> ↔ Sheet (partial drawer) < md only */\n/* </header> */\n/* */\n/* DOM (pill variant — matches alfadocs.com floating-pill header): */\n/* <header role=banner data-component=public-header> transparent */\n/* <div data-component=public-header-container> rounded */\n/* …same children as flat variants… */\n/* </div> */\n/* </header> */\n/* ------------------------------------------------------------------ */\n\nimport {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useId,\n useImperativeHandle,\n useRef,\n useState,\n type AnchorHTMLAttributes,\n type ComponentPropsWithoutRef,\n type ElementRef,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { ChevronDown, Menu, X } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport * as NavigationMenuPrimitive from '@radix-ui/react-navigation-menu';\nimport { IconButton } from '../button/icon-button';\nimport { Sheet } from '../sheet';\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\nexport interface PublicHeaderHandle {\n openMenu: () => void;\n closeMenu: () => void;\n getMenuOpen: () => boolean;\n}\n\nexport interface PublicHeaderProps\n extends\n Omit<ComponentPropsWithoutRef<'header'>, 'children'>,\n VariantProps<typeof rootVariants> {\n /** Logo lockup, typically `<Logo variant=\"wordmark\" tone=\"primary\" size=\"md\" />`. */\n logo: ReactNode;\n /** Optional href for the logo link. Defaults to `/`. */\n homeHref?: string;\n /** Accessible label for the logo link (falls back to `t('publicHeader.homeLabel')`). */\n homeLabel?: string;\n /** Primary nav links rendered inline ≥ md, collapsed into the mobile sheet below md. */\n navSlot?: ReactNode;\n /** Right-side actions (sign-in / register / role-switch CTAs). */\n actionsSlot?: ReactNode;\n /** Sticky behaviour. Default `none`. */\n sticky?: 'none' | 'top' | 'scroll-up';\n /** Pixel offset above which `sticky=\"scroll-up\"` engages and `transparent` fades to default. */\n stickyOffset?: number;\n /** Override the mobile menu trigger's accessible label (`t('publicHeader.openMenu')`). */\n menuLabel?: string;\n /** Override the navigation landmark label (`t('publicHeader.primaryNavLabel')`). */\n navLabel?: string;\n /** Consumer-supplied instance id, surfaced as `data-component-id`. */\n id?: string;\n}\n\nexport interface PublicHeaderNavLinkProps extends Omit<\n AnchorHTMLAttributes<HTMLAnchorElement>,\n 'children'\n> {\n href: string;\n active?: boolean;\n children: ReactNode;\n}\n\nexport interface PublicHeaderNavDropdownProps {\n /** Trigger label (the visible nav item text). */\n label: ReactNode;\n /**\n * `false` (default) renders a single-card dropdown anchored near the trigger\n * (Settori-style). `true` renders a wide multi-card mega-menu spanning the\n * pill's full inline width (Soluzioni-style).\n */\n wide?: boolean;\n /** Cards / content inside the dropdown panel. */\n children: ReactNode;\n /** Optional id; not required — used only for analytics / test selectors. */\n id?: string;\n}\n\nexport interface PublicHeaderDropdownCardProps {\n /**\n * Optional href — when provided the card title becomes a clickable\n * anchor with a `→` arrow indicator. Without href, the title is\n * a static heading (Settori-style).\n */\n href?: string;\n title: ReactNode;\n /** Optional subtitle / muted helper text under the title. */\n subtitle?: ReactNode;\n /** Sub-list contents (typically PublicHeader.DropdownLink children). */\n children?: ReactNode;\n}\n\nexport interface PublicHeaderDropdownLinkProps extends Omit<\n AnchorHTMLAttributes<HTMLAnchorElement>,\n 'children'\n> {\n href: string;\n active?: boolean;\n children: ReactNode;\n}\n\n/* ------------------------------------------------------------------ */\n/* Context — drives the rendering surface for nav subcomponents. */\n/* */\n/* The same navSlot is rendered twice: once inside the desktop Radix */\n/* NavigationMenu (≥ md, flyout mode) and once inside the mobile Sheet */\n/* drawer (< md, disclosure mode). NavLink / NavDropdown / DropdownCard */\n/* / DropdownLink switch their rendering off this flag so the mobile */\n/* tree doesn't depend on the Radix Root being present. */\n/* ------------------------------------------------------------------ */\n\ntype PublicHeaderSurface = 'desktop' | 'mobile';\n\nconst PublicHeaderSurfaceContext =\n createContext<PublicHeaderSurface>('desktop');\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst rootVariants = cva(\n [\n 'ds:w-full ds:z-[var(--z-sticky)]',\n 'ds:transition-[background-color,box-shadow,transform] ds:duration-[var(--animation-duration)]',\n 'ds:motion-reduce:transition-none',\n ].join(' '),\n {\n variants: {\n variant: {\n // Transparent fades to a solid pill chrome once data-stuck=\"true\"\n // (set by the rAF scroll listener). The fade is handled via the\n // same background utility so `data-stuck` swaps cleanly between\n // states.\n transparent: [\n 'ds:flex ds:items-center ds:gap-[var(--spacing-md)]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:sm:ps-[var(--spacing-lg)] ds:sm:pe-[var(--spacing-lg)]',\n 'ds:h-14 ds:md:h-16',\n 'ds:bg-transparent ds:text-[var(--foreground)]',\n 'ds:data-[stuck=true]:bg-[var(--card)]',\n 'ds:data-[stuck=true]:shadow-[var(--shadow-md)]',\n // Once stuck, pair the elevation shadow with a tokenized\n // block-end border so the header has a clear edge against the\n // page below it — shadow alone fades to a faint halo on dark\n // surfaces, leaving the bar reading as unbounded.\n 'ds:data-[stuck=true]:border-block-end ds:data-[stuck=true]:border-[color:var(--border)]',\n 'ds:forced-colors:border-b ds:forced-colors:border-[CanvasText]',\n ].join(' '),\n // `dark` flips its own scope into the dark token set so nav\n // links + buttons inside read off-white text on the dark\n // surface. Without the `theme-dark` scope the children inherit\n // the light-theme `--foreground` and fail color-contrast at\n // ~1.3:1. `--background` already resolves to a dark step under\n // `theme-dark`, so we compose the surface from the standard\n // theme token rather than locking to a raw ramp step.\n dark: [\n 'ds:flex ds:items-center ds:gap-[var(--spacing-md)]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:sm:ps-[var(--spacing-lg)] ds:sm:pe-[var(--spacing-lg)]',\n 'ds:h-14 ds:md:h-16',\n 'theme-dark ds:bg-[var(--background)] ds:text-[var(--foreground)]',\n ].join(' '),\n // `pill` matches alfadocs.com's floating rounded-pill header.\n // The outer header is fully transparent (no border, no bg) and\n // simply provides a top-side gutter so the inner container reads\n // as floating. The inner `data-component=\"public-header-container\"`\n // div is the visible chrome — border, rounded, card background.\n pill: [\n 'ds:bg-transparent',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:pt-[var(--spacing-md)]',\n 'ds:sm:ps-[var(--spacing-lg)] ds:sm:pe-[var(--spacing-lg)] ds:sm:pt-[var(--spacing-md)]',\n ].join(' '),\n },\n sticky: {\n none: '',\n top: 'ds:sticky ds:top-0',\n // `scroll-up` is sticky but translates off-screen when scrolling\n // down past `stickyOffset` (handled by data-hidden=\"true\") and\n // slides back in when scrolling up.\n 'scroll-up': [\n 'ds:sticky ds:top-0',\n 'ds:data-[hidden=true]:-translate-y-full',\n ].join(' '),\n },\n },\n defaultVariants: { variant: 'pill', sticky: 'none' },\n },\n);\n\n// Inner pill chrome — only rendered when variant === 'pill'. The actual\n// \"header look\" (rounded, border, card surface) lives here so the outer\n// <header> can stay transparent and provide just the floating offset.\nconst pillContainerClasses = [\n 'ds:flex ds:items-center ds:gap-[var(--spacing-md)]',\n 'ds:w-full ds:max-w-[1400px] ds:mx-auto',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:sm:ps-[var(--spacing-lg)] ds:sm:pe-[var(--spacing-lg)]',\n // 76px isn't a kit token; the closest is h-16 (64px) which reads tight\n // against alfadocs.com's chrome — keep an explicit min-block-size so\n // the pill reads as substantial without bloating beyond live reference.\n 'ds:min-h-16 ds:md:min-h-[76px]',\n 'ds:bg-[var(--card)] ds:text-[var(--foreground)]',\n 'ds:rounded-[var(--radius-lg)]',\n // Surface-border hairline shared with `Card`. Tuned to ~14% black\n // (light) / 16% white (dark) at the token level so the edge stays\n // visible against tinted page backgrounds — see `--card-border` in\n // `src/tokens/index.css`. Matches alfadocs.com's slate-200 reference\n // pill border without introducing a pill-specific token.\n 'ds:border ds:border-[color:var(--card-border)]',\n 'ds:transition-colors ds:duration-[var(--animation-duration)]',\n 'ds:motion-reduce:transition-none',\n].join(' ');\n\nconst navLinkVariants = cva(\n [\n 'ds:inline-flex ds:items-center',\n 'type-body-sm ds:font-medium',\n // Muted-foreground reads as secondary text and matches alfadocs.com's\n // nav-link colour (the reference's slate-grey). `--foreground` was too\n // dark vs the ref.\n 'ds:text-[var(--muted-foreground)]',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:py-[var(--spacing-xs)]',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-ring ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:hover:text-[var(--primary)]',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:data-[active=true]:text-[var(--primary)]',\n 'ds:data-[active=true]:[box-shadow:inset_0_-2px_0_var(--primary)]',\n ].join(' '),\n);\n\n// Trigger styling shares the link look + adds the chevron rotation hook.\nconst dropdownTriggerClasses = [\n 'ds:group ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]',\n 'type-body-sm ds:font-medium',\n // Mirror the navLinkVariants colour + inline padding so triggers and\n // plain links share weight, colour and target size.\n 'ds:text-[var(--muted-foreground)]',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:bg-transparent ds:border-0 ds:cursor-pointer',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:py-[var(--spacing-xs)]',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-ring ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:hover:text-[var(--primary)]',\n 'ds:data-[state=open]:text-[var(--primary)]',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n].join(' ');\n\nconst dropdownChevronClasses = [\n 'ds:size-3 ds:shrink-0',\n 'ds:transition-transform ds:duration-[var(--animation-duration)]',\n 'ds:group-data-[state=open]:rotate-180',\n 'ds:motion-reduce:transition-none',\n].join(' ');\n\nconst dropdownContentVariants = cva(\n [\n // Radix portals Content into the Viewport; sizing + position is\n // governed by the Viewport — keep Content's own paint to padding\n // + inner layout so motion / position stay consistent across\n // trigger placements.\n 'ds:data-[motion=from-start]:animate-in ds:data-[motion=from-start]:fade-in-0',\n 'ds:data-[motion=from-end]:animate-in ds:data-[motion=from-end]:fade-in-0',\n 'ds:data-[motion=to-start]:animate-out ds:data-[motion=to-start]:fade-out-0',\n 'ds:data-[motion=to-end]:animate-out ds:data-[motion=to-end]:fade-out-0',\n 'ds:motion-reduce:animate-none',\n ].join(' '),\n {\n variants: {\n wide: {\n true: [\n 'ds:grid ds:grid-cols-2 ds:lg:grid-cols-4',\n 'ds:gap-[var(--spacing-lg)]',\n 'ds:p-[var(--spacing-lg)]',\n 'ds:w-screen ds:max-w-[1400px]',\n ].join(' '),\n false: ['ds:p-[var(--spacing-md)]', 'ds:min-w-[280px]'].join(' '),\n },\n },\n defaultVariants: { wide: false },\n },\n);\n\nconst viewportClasses = [\n // Position the Viewport flush below the pill / nav row. Radix sets\n // `--radix-navigation-menu-viewport-width` and `…-height` so the\n // panel sizes itself to whichever Content is currently active.\n 'ds:absolute ds:top-full ds:start-1/2 ds:-translate-x-1/2',\n 'ds:mt-[var(--spacing-sm)]',\n 'ds:w-[var(--radix-navigation-menu-viewport-width)]',\n 'ds:h-[var(--radix-navigation-menu-viewport-height)]',\n 'ds:overflow-hidden',\n 'ds:bg-[var(--card)] ds:text-[var(--foreground)]',\n 'ds:rounded-[var(--radius-lg)] ds:border ds:border-[color:var(--border)]',\n 'ds:shadow-[var(--shadow-lg)]',\n 'ds:data-[state=open]:animate-in ds:data-[state=closed]:animate-out',\n 'ds:data-[state=open]:fade-in-0 ds:data-[state=closed]:fade-out-0',\n 'ds:data-[state=open]:zoom-in-95 ds:data-[state=closed]:zoom-out-95',\n 'ds:origin-top ds:transition-[width,height] ds:duration-[var(--animation-duration)]',\n 'ds:motion-reduce:animate-none ds:motion-reduce:transition-none',\n].join(' ');\n\nconst cardLinkClasses = [\n 'ds:flex ds:items-start ds:justify-between ds:gap-[var(--spacing-sm)]',\n 'ds:no-underline ds:text-[var(--foreground)]',\n 'ds:pb-[var(--spacing-sm)]',\n // alfadocs.com renders the card header flush against the sub-list with\n // no separator rule — match that by dropping the border-b that earlier\n // versions of this component carried.\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-ring ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:hover:[&_[data-card-title]]:text-[var(--primary)]',\n 'ds:hover:[&_[data-card-arrow]]:text-[var(--primary)]',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:group/cardlink',\n].join(' ');\n\nconst cardHeaderStaticClasses = [\n 'ds:pb-[var(--spacing-sm)]',\n // Match the linked-card variant: no separator rule under the title.\n].join(' ');\n\nconst subLinkClasses = [\n 'ds:block ds:no-underline',\n 'type-body-sm ds:font-medium ds:text-[var(--muted-foreground)]',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)] ds:py-[var(--spacing-xs)]',\n 'ds:hover:bg-[var(--muted)]/30 ds:hover:text-[var(--primary)]',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-ring ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:data-[active=true]:text-[var(--primary)]',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n].join(' ');\n\n/* ------------------------------------------------------------------ */\n/* Reduced motion */\n/* ------------------------------------------------------------------ */\n\nfunction usePrefersReducedMotion(): boolean {\n const [reduced, setReduced] = useState(() => {\n if (typeof window === 'undefined' || !window.matchMedia) return false;\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n });\n useEffect(() => {\n if (typeof window === 'undefined' || !window.matchMedia) return;\n const mq = window.matchMedia('(prefers-reduced-motion: reduce)');\n const onChange = (): void => setReduced(mq.matches);\n mq.addEventListener('change', onChange);\n return () => mq.removeEventListener('change', onChange);\n }, []);\n return reduced;\n}\n\n/* ------------------------------------------------------------------ */\n/* Scroll listener */\n/* */\n/* rAF-throttled tracker for two flags on the header root: */\n/* - `data-stuck`: scrollY > stickyOffset (drives the transparent → */\n/* solid fade + the scroll-up shadow lift). */\n/* - `data-hidden`: scrolling DOWN past stickyOffset hides the header */\n/* via transform; scrolling UP slides it back. Only emitted when */\n/* `sticky === 'scroll-up'`. */\n/* ------------------------------------------------------------------ */\n\nfunction useHeaderScrollState(\n enabled: boolean,\n sticky: NonNullable<PublicHeaderProps['sticky']>,\n stickyOffset: number,\n): {\n stuck: boolean;\n hidden: boolean;\n} {\n const [stuck, setStuck] = useState(false);\n const [hidden, setHidden] = useState(false);\n const lastYRef = useRef(0);\n const tickingRef = useRef(false);\n\n useEffect(() => {\n if (!enabled || typeof window === 'undefined') return;\n lastYRef.current = window.scrollY;\n\n const update = (): void => {\n const y = window.scrollY;\n setStuck(y > stickyOffset);\n if (sticky === 'scroll-up') {\n const delta = y - lastYRef.current;\n // Hide on a meaningful downward delta past the offset; show on\n // any upward delta. 4px deadband keeps minor wheel inertia from\n // flapping the bar.\n if (delta > 4 && y > stickyOffset) setHidden(true);\n else if (delta < -4 || y <= stickyOffset) setHidden(false);\n }\n lastYRef.current = y;\n tickingRef.current = false;\n };\n const onScroll = (): void => {\n if (tickingRef.current) return;\n tickingRef.current = true;\n window.requestAnimationFrame(update);\n };\n window.addEventListener('scroll', onScroll, { passive: true });\n // Initial sync so we don't miss state when mounted past the offset.\n update();\n return () => {\n window.removeEventListener('scroll', onScroll);\n };\n }, [enabled, sticky, stickyOffset]);\n\n return { stuck, hidden };\n}\n\n/* ------------------------------------------------------------------ */\n/* Inner content (shared between flat + pill variants) */\n/* ------------------------------------------------------------------ */\n\ninterface InnerContentProps {\n logo: ReactNode;\n homeHref: string;\n resolvedHomeLabel: string;\n resolvedNavLabel: string;\n resolvedMenuLabel: string;\n navSlot?: ReactNode;\n actionsSlot?: ReactNode;\n menuOpen: boolean;\n setMenuOpen: (open: boolean) => void;\n sheetId: string;\n}\n\nfunction InnerContent({\n logo,\n homeHref,\n resolvedHomeLabel,\n resolvedNavLabel,\n resolvedMenuLabel,\n navSlot,\n actionsSlot,\n menuOpen,\n setMenuOpen,\n sheetId,\n}: InnerContentProps): React.JSX.Element {\n return (\n <>\n <a\n href={homeHref}\n aria-label={resolvedHomeLabel}\n className=\"ds:inline-flex ds:items-center ds:rounded-[var(--radius-sm)] ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid ds:focus-visible:outline-ring ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]\"\n >\n {logo}\n </a>\n\n {navSlot ? (\n <PublicHeaderSurfaceContext.Provider value=\"desktop\">\n <NavigationMenuPrimitive.Root\n aria-label={resolvedNavLabel}\n // Radix wraps the List in an unstyled `<div>` between Root and\n // <ul>. The `[&>div:first-of-type]:flex` arbitrary selector\n // forces that wrapper into flex so the List's flex-1 actually\n // stretches it across the available width.\n className=\"ds:hidden ds:md:flex ds:relative ds:items-center ds:ms-[var(--spacing-lg)] ds:flex-1 ds:[&>div:first-of-type]:flex ds:[&>div:first-of-type]:flex-1\"\n delayDuration={150}\n >\n <NavigationMenuPrimitive.List className=\"ds:flex ds:flex-1 ds:items-center ds:justify-center ds:gap-[var(--spacing-md)] ds:list-none ds:m-0 ds:ps-0\">\n {navSlot}\n </NavigationMenuPrimitive.List>\n {/* Viewport renders the active panel below the nav row. The\n wrapper centres it horizontally relative to the trigger row;\n Radix sets viewport-width/-height vars so the panel sizes\n to whichever Content is open. */}\n <div className=\"ds:absolute ds:top-full ds:start-0 ds:end-0 ds:flex ds:justify-center ds:pointer-events-none\">\n <div className=\"ds:pointer-events-auto\">\n <NavigationMenuPrimitive.Viewport className={viewportClasses} />\n </div>\n </div>\n </NavigationMenuPrimitive.Root>\n </PublicHeaderSurfaceContext.Provider>\n ) : null}\n\n {actionsSlot ? (\n <div className=\"ds:hidden ds:md:flex ds:items-center ds:gap-[var(--spacing-sm)] ds:ms-auto\">\n {actionsSlot}\n </div>\n ) : null}\n\n {/* Mobile menu trigger (< md). Wired to a Sheet (partial drawer\n from inline-end) so navSlot + actionsSlot collapse there. */}\n <Sheet open={menuOpen} onOpenChange={setMenuOpen}>\n <Sheet.Trigger asChild>\n <IconButton\n size=\"md\"\n intent=\"ghost\"\n className=\"ds:ms-auto ds:md:hidden\"\n icon={\n menuOpen ? <X aria-hidden=\"true\" /> : <Menu aria-hidden=\"true\" />\n }\n aria-controls={sheetId}\n aria-expanded={menuOpen}\n aria-label={resolvedMenuLabel}\n />\n </Sheet.Trigger>\n <Sheet.Content side=\"end\" size=\"md\" id={sheetId}>\n <Sheet.Header>\n <Sheet.Title>{resolvedNavLabel}</Sheet.Title>\n </Sheet.Header>\n <Sheet.Body>\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n {navSlot ? (\n <PublicHeaderSurfaceContext.Provider value=\"mobile\">\n <nav\n aria-label={resolvedNavLabel}\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\"\n data-mobile-nav=\"true\"\n >\n {navSlot}\n </nav>\n </PublicHeaderSurfaceContext.Provider>\n ) : null}\n {actionsSlot ? (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)] ds:mt-[var(--spacing-md)]\">\n {actionsSlot}\n </div>\n ) : null}\n </div>\n </Sheet.Body>\n </Sheet.Content>\n </Sheet>\n </>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Root */\n/* ------------------------------------------------------------------ */\n\nconst PublicHeaderRoot = forwardRef<HTMLElement, PublicHeaderProps>(\n (\n {\n logo,\n homeHref = '/',\n homeLabel,\n navSlot,\n actionsSlot,\n variant = 'pill',\n sticky = 'none',\n stickyOffset = 80,\n menuLabel,\n navLabel,\n id,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const reduced = usePrefersReducedMotion();\n const autoId = useId();\n const sheetId = `${id ?? autoId}-sheet`;\n const [menuOpen, setMenuOpen] = useState(false);\n\n // Scroll listener is only active when `transparent` or `scroll-up`\n // need it. Hidden state is disabled under reduced motion (the bar\n // stays visible — translating off-screen is precisely the motion\n // class of user the preference targets).\n const scrollEnabled = variant === 'transparent' || sticky === 'scroll-up';\n const { stuck, hidden } = useHeaderScrollState(\n scrollEnabled,\n sticky,\n stickyOffset,\n );\n const effectiveHidden = reduced ? false : hidden;\n\n const openMenu = useCallback((): void => setMenuOpen(true), []);\n const closeMenu = useCallback((): void => setMenuOpen(false), []);\n\n useImperativeHandle(\n ref as React.Ref<PublicHeaderHandle> | null | undefined,\n () => ({\n openMenu,\n closeMenu,\n getMenuOpen: () => menuOpen,\n }),\n [openMenu, closeMenu, menuOpen],\n );\n\n const resolvedHomeLabel =\n homeLabel ?? t('publicHeader.homeLabel', 'AlfaDocs — home');\n const resolvedNavLabel =\n navLabel ?? t('publicHeader.primaryNavLabel', 'Primary');\n const resolvedMenuLabel =\n menuLabel ??\n (menuOpen\n ? t('publicHeader.closeMenu', 'Close menu')\n : t('publicHeader.openMenu', 'Open menu'));\n\n const innerProps: InnerContentProps = {\n logo,\n homeHref,\n resolvedHomeLabel,\n resolvedNavLabel,\n resolvedMenuLabel,\n navSlot,\n actionsSlot,\n menuOpen,\n setMenuOpen,\n sheetId,\n };\n\n return (\n <header\n {...rest}\n data-component=\"public-header\"\n data-component-id={id}\n data-variant={variant}\n data-stuck={stuck ? 'true' : undefined}\n data-hidden={effectiveHidden ? 'true' : undefined}\n data-state={reduced ? 'reduced-motion' : undefined}\n className={rootVariants({ variant, sticky, className })}\n >\n {variant === 'pill' ? (\n <div\n data-component=\"public-header-container\"\n className={pillContainerClasses}\n >\n <InnerContent {...innerProps} />\n </div>\n ) : (\n <InnerContent {...innerProps} />\n )}\n </header>\n );\n },\n);\nPublicHeaderRoot.displayName = 'PublicHeader';\n\n/* ------------------------------------------------------------------ */\n/* NavLink */\n/* ------------------------------------------------------------------ */\n\nconst PublicHeaderNavLink = forwardRef<\n HTMLAnchorElement,\n PublicHeaderNavLinkProps\n>(({ active, className, children, ...rest }, ref) => {\n const surface = useContext(PublicHeaderSurfaceContext);\n // Desktop: NavigationMenu.Item + .Link give Radix the keyboard / focus\n // semantics across the trigger row. We render the actual <a> via\n // asChild so consumers can swap in router links transparently.\n // Mobile: plain <a> inside the Sheet's <nav> — no Radix Root in scope,\n // so we render outside the NavigationMenu primitive.\n if (surface === 'mobile') {\n return (\n <a\n ref={ref}\n {...rest}\n data-active={active ? 'true' : undefined}\n aria-current={active ? 'page' : undefined}\n className={[\n 'ds:block ds:no-underline',\n 'type-body-sm ds:font-medium',\n 'ds:text-[var(--foreground)]',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)] ds:py-[var(--spacing-sm)]',\n 'ds:hover:bg-[var(--muted)]/30 ds:hover:text-[var(--primary)]',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-ring ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:data-[active=true]:text-[var(--primary)]',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n >\n {children}\n </a>\n );\n }\n return (\n <NavigationMenuPrimitive.Item>\n <NavigationMenuPrimitive.Link asChild active={active}>\n <a\n ref={ref}\n {...rest}\n data-active={active ? 'true' : undefined}\n aria-current={active ? 'page' : undefined}\n className={[navLinkVariants(), className].filter(Boolean).join(' ')}\n >\n {children}\n </a>\n </NavigationMenuPrimitive.Link>\n </NavigationMenuPrimitive.Item>\n );\n});\nPublicHeaderNavLink.displayName = 'PublicHeader.NavLink';\n\n/* ------------------------------------------------------------------ */\n/* NavDropdown */\n/* ------------------------------------------------------------------ */\n\nconst PublicHeaderNavDropdown = forwardRef<\n ElementRef<typeof NavigationMenuPrimitive.Trigger>,\n PublicHeaderNavDropdownProps\n>(({ label, wide = false, children, id }, ref) => {\n const surface = useContext(PublicHeaderSurfaceContext);\n if (surface === 'mobile') {\n // <details>/<summary> gives semantic disclosure for free —\n // Enter/Space toggles, summary is focusable, content collapses\n // when not open. No JS needed.\n return (\n <details\n id={id}\n data-component=\"public-header-nav-dropdown\"\n className=\"ds:group ds:border-b ds:border-[color:var(--border)]\"\n >\n <summary\n className={[\n 'ds:flex ds:items-center ds:justify-between ds:cursor-pointer',\n 'type-body-sm ds:font-medium ds:text-[var(--foreground)]',\n 'ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)] ds:py-[var(--spacing-sm)]',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-ring ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:list-none ds:[&::-webkit-details-marker]:hidden',\n ].join(' ')}\n >\n <span>{label}</span>\n <ChevronDown\n aria-hidden=\"true\"\n className=\"ds:size-3 ds:shrink-0 ds:transition-transform ds:duration-[var(--animation-duration)] ds:group-[[open]]:rotate-180 ds:motion-reduce:transition-none\"\n />\n </summary>\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)] ds:py-[var(--spacing-sm)]\">\n {children}\n </div>\n </details>\n );\n }\n return (\n <NavigationMenuPrimitive.Item data-component=\"public-header-nav-dropdown\">\n <NavigationMenuPrimitive.Trigger\n ref={ref}\n id={id}\n className={dropdownTriggerClasses}\n // Radix already wires aria-expanded + aria-controls. The\n // group / data-state hooks let the chevron rotate via Tailwind.\n >\n {label}\n <ChevronDown aria-hidden=\"true\" className={dropdownChevronClasses} />\n </NavigationMenuPrimitive.Trigger>\n <NavigationMenuPrimitive.Content\n className={dropdownContentVariants({ wide })}\n >\n {children}\n </NavigationMenuPrimitive.Content>\n </NavigationMenuPrimitive.Item>\n );\n});\nPublicHeaderNavDropdown.displayName = 'PublicHeader.NavDropdown';\n\n/* ------------------------------------------------------------------ */\n/* DropdownCard */\n/* ------------------------------------------------------------------ */\n\nconst PublicHeaderDropdownCard = forwardRef<\n HTMLDivElement,\n PublicHeaderDropdownCardProps\n>(({ href, title, subtitle, children }, ref) => {\n const surface = useContext(PublicHeaderSurfaceContext);\n // The Card header. In mobile we render a plain <a> when href is set —\n // no Radix Link wrapper because the NavigationMenu root isn't in scope\n // inside the Sheet.\n const titleNode = (\n <span\n data-card-title\n className=\"type-title-card ds:text-[var(--foreground)] ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none\"\n >\n {title}\n </span>\n );\n const subtitleNode = subtitle ? (\n <span className=\"type-body-sm ds:text-[var(--muted-foreground)]\">\n {subtitle}\n </span>\n ) : null;\n\n const arrow = (\n <span\n data-card-arrow\n aria-hidden=\"true\"\n className=\"ds:flex-none ds:text-[var(--muted-foreground)] ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none ds:rtl:-scale-x-100\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M5 12h14\" />\n <path d=\"m12 5 7 7-7 7\" />\n </svg>\n </span>\n );\n\n const linkInner = (\n <>\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n {titleNode}\n {subtitleNode}\n </div>\n {arrow}\n </>\n );\n\n let header: React.JSX.Element;\n if (href) {\n if (surface === 'mobile') {\n header = (\n <a href={href} className={cardLinkClasses}>\n {linkInner}\n </a>\n );\n } else {\n header = (\n <NavigationMenuPrimitive.Link asChild>\n <a href={href} className={cardLinkClasses}>\n {linkInner}\n </a>\n </NavigationMenuPrimitive.Link>\n );\n }\n } else {\n header = (\n <div className={cardHeaderStaticClasses}>\n {titleNode}\n {subtitle ? (\n <span className=\"ds:block type-body-sm ds:text-[var(--muted-foreground)] ds:mt-[var(--spacing-xs)]\">\n {subtitle}\n </span>\n ) : null}\n </div>\n );\n }\n\n return (\n <div\n ref={ref}\n data-component=\"public-header-dropdown-card\"\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\"\n >\n {header}\n {children ? (\n <ul className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)] ds:list-none ds:m-0 ds:ps-0\">\n {children}\n </ul>\n ) : null}\n </div>\n );\n});\nPublicHeaderDropdownCard.displayName = 'PublicHeader.DropdownCard';\n\n/* ------------------------------------------------------------------ */\n/* DropdownLink */\n/* ------------------------------------------------------------------ */\n\nconst PublicHeaderDropdownLink = forwardRef<\n HTMLAnchorElement,\n PublicHeaderDropdownLinkProps\n>(({ active, className, children, ...rest }, ref) => {\n const surface = useContext(PublicHeaderSurfaceContext);\n const anchor = (\n <a\n ref={ref}\n {...rest}\n data-active={active ? 'true' : undefined}\n aria-current={active ? 'page' : undefined}\n className={[subLinkClasses, className].filter(Boolean).join(' ')}\n >\n {children}\n </a>\n );\n return (\n <li data-component=\"public-header-dropdown-link\">\n {surface === 'mobile' ? (\n anchor\n ) : (\n <NavigationMenuPrimitive.Link asChild active={active}>\n {anchor}\n </NavigationMenuPrimitive.Link>\n )}\n </li>\n );\n});\nPublicHeaderDropdownLink.displayName = 'PublicHeader.DropdownLink';\n\n/* ------------------------------------------------------------------ */\n/* Public surface */\n/* ------------------------------------------------------------------ */\n\nexport const PublicHeader = Object.assign(PublicHeaderRoot, {\n NavLink: PublicHeaderNavLink,\n NavDropdown: PublicHeaderNavDropdown,\n DropdownCard: PublicHeaderDropdownCard,\n DropdownLink: PublicHeaderDropdownLink,\n});\n","import type { AgentAdapter } from '../../agent/types';\nimport type { PublicHeaderHandle } from './public-header';\n\nexport const publicHeaderAgent: AgentAdapter<PublicHeaderHandle> = {\n id: 'public-header',\n capabilities: ['open', 'close'],\n state: {\n menuOpen: {\n type: 'boolean',\n description: 'Whether the mobile drawer is currently open.',\n read: (handle) => handle.getMenuOpen(),\n },\n },\n actions: {\n open_menu: {\n safety: 'read',\n description: 'Open the mobile drawer.',\n invoke: (handle) => {\n handle.openMenu();\n },\n },\n close_menu: {\n safety: 'read',\n description: 'Close the mobile drawer.',\n invoke: (handle) => {\n handle.closeMenu();\n },\n },\n },\n domHooks: {\n root: { attr: 'data-component', value: 'public-header' },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop on PublicHeader.',\n },\n },\n};\n"],"names":["PublicHeaderSurfaceContext","createContext","rootVariants","cva","pillContainerClasses","navLinkVariants","dropdownTriggerClasses","dropdownChevronClasses","dropdownContentVariants","viewportClasses","cardLinkClasses","cardHeaderStaticClasses","subLinkClasses","usePrefersReducedMotion","reduced","setReduced","useState","useEffect","mq","onChange","useHeaderScrollState","enabled","sticky","stickyOffset","stuck","setStuck","hidden","setHidden","lastYRef","useRef","tickingRef","update","y","delta","onScroll","InnerContent","logo","homeHref","resolvedHomeLabel","resolvedNavLabel","resolvedMenuLabel","navSlot","actionsSlot","menuOpen","setMenuOpen","sheetId","jsxs","Fragment","jsx","NavigationMenuPrimitive","Sheet","IconButton","X","Menu","PublicHeaderRoot","forwardRef","homeLabel","variant","menuLabel","navLabel","id","className","rest","ref","t","useTranslation","autoId","useId","scrollEnabled","effectiveHidden","openMenu","useCallback","closeMenu","useImperativeHandle","innerProps","PublicHeaderNavLink","active","children","useContext","PublicHeaderNavDropdown","label","wide","ChevronDown","PublicHeaderDropdownCard","href","title","subtitle","surface","titleNode","linkInner","header","PublicHeaderDropdownLink","anchor","PublicHeader","publicHeaderAgent","handle"],"mappings":"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"}