@alfadocs/ui-kit-debug 0.25.1 → 0.30.0

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 (361) 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-BYuc_8HV.js +2250 -0
  18. package/dist/_chunks/booking-BYuc_8HV.js.map +1 -0
  19. package/dist/_chunks/{calendar-zy0tUUVG.js → calendar-WWNx448i.js} +114 -142
  20. package/dist/_chunks/calendar-WWNx448i.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/checkbox-mwbrPZDY.js.map +1 -1
  30. package/dist/_chunks/{command-palette-DkL-aW4O.js → command-palette-11BieSNq.js} +2 -2
  31. package/dist/_chunks/{command-palette-DkL-aW4O.js.map → command-palette-11BieSNq.js.map} +1 -1
  32. package/dist/_chunks/{contact-card-CjG7c-1q.js → contact-card-DYbp--s-.js} +3 -3
  33. package/dist/_chunks/{contact-card-CjG7c-1q.js.map → contact-card-DYbp--s-.js.map} +1 -1
  34. package/dist/_chunks/{date-picker-BIoSLRly.js → date-picker-D0Ry1dMz.js} +26 -27
  35. package/dist/_chunks/{date-picker-BIoSLRly.js.map → date-picker-D0Ry1dMz.js.map} +1 -1
  36. package/dist/_chunks/{date-range-picker-9gANFNG9.js → date-range-picker-DYgHzMOo.js} +19 -20
  37. package/dist/_chunks/{date-range-picker-9gANFNG9.js.map → date-range-picker-DYgHzMOo.js.map} +1 -1
  38. package/dist/_chunks/{date-time-picker-DG7BiGdb.js → date-time-picker-CGmGtcyc.js} +10 -11
  39. package/dist/_chunks/{date-time-picker-DG7BiGdb.js.map → date-time-picker-CGmGtcyc.js.map} +1 -1
  40. package/dist/_chunks/{description-list-Bsga4IW8.js → description-list-yl3y3QKg.js} +34 -24
  41. package/dist/_chunks/description-list-yl3y3QKg.js.map +1 -0
  42. package/dist/_chunks/{dialog-DUomPCRS.js → dialog-BBXqpZIt.js} +2 -2
  43. package/dist/_chunks/{dialog-DUomPCRS.js.map → dialog-BBXqpZIt.js.map} +1 -1
  44. package/dist/_chunks/{editable-currency-cell-renderer-DJB5MxAI.js → editable-currency-cell-renderer-DSReCae7.js} +7 -7
  45. package/dist/_chunks/{editable-currency-cell-renderer-DJB5MxAI.js.map → editable-currency-cell-renderer-DSReCae7.js.map} +1 -1
  46. package/dist/_chunks/{empty-state-3CLJIXSj.js → empty-state-BLy7tigq.js} +13 -33
  47. package/dist/_chunks/empty-state-BLy7tigq.js.map +1 -0
  48. package/dist/_chunks/eye-LHlSU38h.js +21 -0
  49. package/dist/_chunks/eye-LHlSU38h.js.map +1 -0
  50. package/dist/_chunks/{freemium-paywall-CM6V1zNf.js → freemium-paywall-B9c8Ylww.js} +11 -11
  51. package/dist/_chunks/{freemium-paywall-CM6V1zNf.js.map → freemium-paywall-B9c8Ylww.js.map} +1 -1
  52. package/dist/_chunks/{header-DqmKROIY.js → header-CkMb1TZS.js} +24 -24
  53. package/dist/_chunks/header-CkMb1TZS.js.map +1 -0
  54. package/dist/_chunks/heart-pulse-CvuyFKHB.js +21 -0
  55. package/dist/_chunks/heart-pulse-CvuyFKHB.js.map +1 -0
  56. package/dist/_chunks/icon-button-BRHSSFmZ.js +70 -0
  57. package/dist/_chunks/icon-button-BRHSSFmZ.js.map +1 -0
  58. package/dist/_chunks/{isSameDay-ecuM8PBB.js → isSameDay-DHG8Xade.js} +4 -4
  59. package/dist/_chunks/{isSameDay-ecuM8PBB.js.map → isSameDay-DHG8Xade.js.map} +1 -1
  60. package/dist/_chunks/{key-value-pair-DBuOCtIc.js → key-value-pair-CqeKiP__.js} +2 -2
  61. package/dist/_chunks/{key-value-pair-DBuOCtIc.js.map → key-value-pair-CqeKiP__.js.map} +1 -1
  62. package/dist/_chunks/{link-DmM5IevO.js → link-DrD_cRUg.js} +50 -45
  63. package/dist/_chunks/link-DrD_cRUg.js.map +1 -0
  64. package/dist/_chunks/{locale-picker-BxEUUPW7.js → locale-picker-BHxbTNmR.js} +297 -208
  65. package/dist/_chunks/locale-picker-BHxbTNmR.js.map +1 -0
  66. package/dist/_chunks/{map-view-CcwycFQX.js → map-view-DyB8tr6c.js} +9 -9
  67. package/dist/_chunks/{map-view-CcwycFQX.js.map → map-view-DyB8tr6c.js.map} +1 -1
  68. package/dist/_chunks/{matrix-rain-CRPMXcVx.js → matrix-rain-sDOUUwZp.js} +35 -35
  69. package/dist/_chunks/matrix-rain-sDOUUwZp.js.map +1 -0
  70. package/dist/_chunks/{message-card-i61k1TGc.js → message-card-DjRtA8GG.js} +3 -3
  71. package/dist/_chunks/{message-card-i61k1TGc.js.map → message-card-DjRtA8GG.js.map} +1 -1
  72. package/dist/_chunks/{message-tray-DrV7G-wR.js → message-tray-DfsAMncP.js} +3 -3
  73. package/dist/_chunks/{message-tray-DrV7G-wR.js.map → message-tray-DfsAMncP.js.map} +1 -1
  74. package/dist/_chunks/monitor-D-SFdbrU.js +16 -0
  75. package/dist/_chunks/monitor-D-SFdbrU.js.map +1 -0
  76. package/dist/_chunks/{notification-card-ejOw5g6g.js → notification-card-B_847w5g.js} +3 -3
  77. package/dist/_chunks/notification-card-B_847w5g.js.map +1 -0
  78. package/dist/_chunks/{notification-tray-D_69dXFY.js → notification-tray-6f7smmT1.js} +22 -19
  79. package/dist/_chunks/notification-tray-6f7smmT1.js.map +1 -0
  80. package/dist/_chunks/parseISO-Dk4xa7q6.js +120 -0
  81. package/dist/_chunks/parseISO-Dk4xa7q6.js.map +1 -0
  82. package/dist/_chunks/patient-search-BhlxYAI3.js +1102 -0
  83. package/dist/_chunks/patient-search-BhlxYAI3.js.map +1 -0
  84. package/dist/_chunks/patient-shell-CAXYzbRw.js +173 -0
  85. package/dist/_chunks/{patient-shell-B164drIa.js.map → patient-shell-CAXYzbRw.js.map} +1 -1
  86. package/dist/_chunks/{payment-form-F7uh0Rqr.js → payment-form-Ds3rxvad.js} +2 -2
  87. package/dist/_chunks/{payment-form-F7uh0Rqr.js.map → payment-form-Ds3rxvad.js.map} +1 -1
  88. package/dist/_chunks/{pdf-viewer-CuYaVR1I.js → pdf-viewer-CIuaocnq.js} +2 -2
  89. package/dist/_chunks/{pdf-viewer-CuYaVR1I.js.map → pdf-viewer-CIuaocnq.js.map} +1 -1
  90. package/dist/_chunks/{popover--derJ_wq.js → popover-D0slaBB9.js} +17 -13
  91. package/dist/_chunks/popover-D0slaBB9.js.map +1 -0
  92. package/dist/_chunks/{privacy-lock-BKsI6ReN.js → privacy-lock-BI4vi9Ud.js} +2 -2
  93. package/dist/_chunks/{privacy-lock-BKsI6ReN.js.map → privacy-lock-BI4vi9Ud.js.map} +1 -1
  94. package/dist/_chunks/public-footer.agent-CA29gxHJ.js +516 -0
  95. package/dist/_chunks/public-footer.agent-CA29gxHJ.js.map +1 -0
  96. package/dist/_chunks/{public-header.agent-BQ3r6Hgq.js → public-header.agent-5U3S9QiC.js} +49 -41
  97. package/dist/_chunks/public-header.agent-5U3S9QiC.js.map +1 -0
  98. package/dist/_chunks/react-day-picker-D3yzgvDB.js +3127 -0
  99. package/dist/_chunks/react-day-picker-D3yzgvDB.js.map +1 -0
  100. package/dist/_chunks/{recaptcha-widget-Kp1XntuE.js → recaptcha-widget-BtBNb6tB.js} +2 -2
  101. package/dist/_chunks/{recaptcha-widget-Kp1XntuE.js.map → recaptcha-widget-BtBNb6tB.js.map} +1 -1
  102. package/dist/_chunks/reviews-panel-CFttsfuC.js +513 -0
  103. package/dist/_chunks/reviews-panel-CFttsfuC.js.map +1 -0
  104. package/dist/_chunks/{search-bar-DORSAzNt.js → search-bar-BRMW1-WG.js} +2 -2
  105. package/dist/_chunks/{search-bar-DORSAzNt.js.map → search-bar-BRMW1-WG.js.map} +1 -1
  106. package/dist/_chunks/{search-input-BtEJAJHa.js → search-input-CIA6pPfn.js} +2 -2
  107. package/dist/_chunks/{search-input-BtEJAJHa.js.map → search-input-CIA6pPfn.js.map} +1 -1
  108. package/dist/_chunks/{sheet-BT0izeoI.js → sheet-D8M8hf8B.js} +2 -2
  109. package/dist/_chunks/{sheet-BT0izeoI.js.map → sheet-D8M8hf8B.js.map} +1 -1
  110. package/dist/_chunks/{sign-in-with-alfadocs-button-4zZC-I6y.js → sign-in-with-alfadocs-button-BI0fVonM.js} +2 -2
  111. package/dist/_chunks/{sign-in-with-alfadocs-button-4zZC-I6y.js.map → sign-in-with-alfadocs-button-BI0fVonM.js.map} +1 -1
  112. package/dist/_chunks/slot-grid-B2zprPcv.js +387 -0
  113. package/dist/_chunks/slot-grid-B2zprPcv.js.map +1 -0
  114. package/dist/_chunks/sparkles-CuYXqQLg.js +23 -0
  115. package/dist/_chunks/sparkles-CuYXqQLg.js.map +1 -0
  116. package/dist/_chunks/{spinner-DirtWZNG.js → spinner-CCByyvcb.js} +2 -2
  117. package/dist/_chunks/spinner-CCByyvcb.js.map +1 -0
  118. package/dist/_chunks/stepper-accordion-BfS6lUB9.js +257 -0
  119. package/dist/_chunks/stepper-accordion-BfS6lUB9.js.map +1 -0
  120. package/dist/_chunks/stepper-accordion.agent-C4quJ-MD.js +71 -0
  121. package/dist/_chunks/stepper-accordion.agent-C4quJ-MD.js.map +1 -0
  122. package/dist/_chunks/stethoscope-DT5qCW8Y.js +18 -0
  123. package/dist/_chunks/stethoscope-DT5qCW8Y.js.map +1 -0
  124. package/dist/_chunks/{sun-Eweh5fvi.js → sun-BuXE0xUS.js} +3 -15
  125. package/dist/_chunks/sun-BuXE0xUS.js.map +1 -0
  126. package/dist/_chunks/{task-tray-B3A2fRGR.js → task-tray-Bcmrrs8m.js} +3 -3
  127. package/dist/_chunks/{task-tray-B3A2fRGR.js.map → task-tray-Bcmrrs8m.js.map} +1 -1
  128. package/dist/_chunks/{theme-toggle-FrotC2VI.js → theme-toggle-nPzb378f.js} +37 -36
  129. package/dist/_chunks/{theme-toggle-FrotC2VI.js.map → theme-toggle-nPzb378f.js.map} +1 -1
  130. package/dist/_chunks/{timeline-jmd7lfDf.js → timeline-CR7HjZCK.js} +3 -3
  131. package/dist/_chunks/{timeline-jmd7lfDf.js.map → timeline-CR7HjZCK.js.map} +1 -1
  132. package/dist/_chunks/{toast.agent-32WNQ-_x.js → toast.agent-CTF6nIj5.js} +2 -2
  133. package/dist/_chunks/{toast.agent-32WNQ-_x.js.map → toast.agent-CTF6nIj5.js.map} +1 -1
  134. package/dist/_chunks/{transcript-panel-DUrjx5sa.js → transcript-panel-QUQ9XJmf.js} +2 -2
  135. package/dist/_chunks/{transcript-panel-DUrjx5sa.js.map → transcript-panel-QUQ9XJmf.js.map} +1 -1
  136. package/dist/_chunks/{use-password-requirements-C9vKBSVn.js → use-password-requirements-E0sSfx5X.js} +38 -53
  137. package/dist/_chunks/use-password-requirements-E0sSfx5X.js.map +1 -0
  138. package/dist/_chunks/use-theme-C2dHKUAN.js +145 -0
  139. package/dist/_chunks/use-theme-C2dHKUAN.js.map +1 -0
  140. package/dist/_chunks/{workflow-map-BR6txfFX.js → workflow-map-BKsKdYvZ.js} +5 -5
  141. package/dist/_chunks/{workflow-map-BR6txfFX.js.map → workflow-map-BKsKdYvZ.js.map} +1 -1
  142. package/dist/agent-catalog.json +151 -51
  143. package/dist/components/agenda-card/index.js +1 -1
  144. package/dist/components/agenda-tray/index.js +1 -1
  145. package/dist/components/ai-prompt-input/index.js +1 -1
  146. package/dist/components/audio-recorder/index.js +1 -1
  147. package/dist/components/autocomplete/index.js +1 -1
  148. package/dist/components/avatar/avatar.d.ts.map +1 -1
  149. package/dist/components/avatar/index.js +1 -1
  150. package/dist/components/benefit-card/benefit-card.d.ts.map +1 -1
  151. package/dist/components/benefit-card/index.js +1 -1
  152. package/dist/components/booking/booking-types.d.ts +145 -0
  153. package/dist/components/booking/booking-types.d.ts.map +1 -0
  154. package/dist/components/booking/booking.agent.d.ts +4 -0
  155. package/dist/components/booking/booking.agent.d.ts.map +1 -0
  156. package/dist/components/booking/booking.d.ts +6 -0
  157. package/dist/components/booking/booking.d.ts.map +1 -0
  158. package/dist/components/booking/cascade.d.ts +96 -0
  159. package/dist/components/booking/cascade.d.ts.map +1 -0
  160. package/dist/components/booking/details-form.d.ts +32 -0
  161. package/dist/components/booking/details-form.d.ts.map +1 -0
  162. package/dist/components/booking/index.d.ts +5 -0
  163. package/dist/components/booking/index.d.ts.map +1 -0
  164. package/dist/components/booking/index.js +8 -0
  165. package/dist/components/button/icon-button.d.ts.map +1 -1
  166. package/dist/components/button/index.js +1 -1
  167. package/dist/components/calendar/index.js +1 -1
  168. package/dist/components/card/card.d.ts.map +1 -1
  169. package/dist/components/card/index.js +1 -1
  170. package/dist/components/carousel/index.js +1 -1
  171. package/dist/components/chat-input/index.js +1 -1
  172. package/dist/components/chat-message/index.js +1 -1
  173. package/dist/components/checkbox/checkbox.d.ts +6 -2
  174. package/dist/components/checkbox/checkbox.d.ts.map +1 -1
  175. package/dist/components/command-palette/index.js +1 -1
  176. package/dist/components/contact-card/index.js +1 -1
  177. package/dist/components/data-table/index.js +1 -1
  178. package/dist/components/date-picker/index.js +1 -1
  179. package/dist/components/date-range-picker/index.js +1 -1
  180. package/dist/components/date-time-picker/index.js +1 -1
  181. package/dist/components/description-list/description-list.d.ts.map +1 -1
  182. package/dist/components/description-list/index.js +1 -1
  183. package/dist/components/dialog/index.js +1 -1
  184. package/dist/components/empty-state/empty-state.d.ts.map +1 -1
  185. package/dist/components/empty-state/index.js +1 -1
  186. package/dist/components/freemium-paywall/index.js +1 -1
  187. package/dist/components/header/index.js +1 -1
  188. package/dist/components/header-settings/index.js +16 -15
  189. package/dist/components/header-settings/index.js.map +1 -1
  190. package/dist/components/icon-button/index.js +1 -1
  191. package/dist/components/index.d.ts +4 -1
  192. package/dist/components/index.d.ts.map +1 -1
  193. package/dist/components/key-value-pair/index.js +1 -1
  194. package/dist/components/link/index.js +1 -1
  195. package/dist/components/link/link.d.ts +7 -0
  196. package/dist/components/link/link.d.ts.map +1 -1
  197. package/dist/components/locale-picker/index.js +1 -1
  198. package/dist/components/map-view/index.js +1 -1
  199. package/dist/components/matrix-rain/index.js +1 -1
  200. package/dist/components/message-card/index.js +1 -1
  201. package/dist/components/message-tray/index.js +1 -1
  202. package/dist/components/notification-card/index.js +1 -1
  203. package/dist/components/notification-tray/index.js +1 -1
  204. package/dist/components/notification-tray/notification-tray.d.ts.map +1 -1
  205. package/dist/components/password-input/index.js +1 -1
  206. package/dist/components/patient-search/index.d.ts +4 -0
  207. package/dist/components/patient-search/index.d.ts.map +1 -0
  208. package/dist/components/patient-search/index.js +6 -0
  209. package/dist/components/patient-search/index.js.map +1 -0
  210. package/dist/components/patient-search/patient-search.agent.d.ts +4 -0
  211. package/dist/components/patient-search/patient-search.agent.d.ts.map +1 -0
  212. package/dist/components/patient-search/patient-search.d.ts +103 -0
  213. package/dist/components/patient-search/patient-search.d.ts.map +1 -0
  214. package/dist/components/payment-form/index.js +1 -1
  215. package/dist/components/pdf-viewer/index.js +1 -1
  216. package/dist/components/popover/index.js +1 -1
  217. package/dist/components/popover/popover.d.ts.map +1 -1
  218. package/dist/components/privacy-lock/index.js +1 -1
  219. package/dist/components/public-footer/index.d.ts +6 -0
  220. package/dist/components/public-footer/index.d.ts.map +1 -0
  221. package/dist/components/public-footer/index.js +10 -0
  222. package/dist/components/public-footer/index.js.map +1 -0
  223. package/dist/components/public-footer/legal-urls.d.ts +18 -0
  224. package/dist/components/public-footer/legal-urls.d.ts.map +1 -0
  225. package/dist/components/public-footer/public-footer.agent.d.ts +4 -0
  226. package/dist/components/public-footer/public-footer.agent.d.ts.map +1 -0
  227. package/dist/components/public-footer/public-footer.d.ts +51 -0
  228. package/dist/components/public-footer/public-footer.d.ts.map +1 -0
  229. package/dist/components/public-footer/socials.d.ts +9 -0
  230. package/dist/components/public-footer/socials.d.ts.map +1 -0
  231. package/dist/components/public-header/index.js +1 -1
  232. package/dist/components/public-header/public-header.d.ts.map +1 -1
  233. package/dist/components/recaptcha-widget/index.js +1 -1
  234. package/dist/components/reviews-panel/index.d.ts +4 -0
  235. package/dist/components/reviews-panel/index.d.ts.map +1 -0
  236. package/dist/components/reviews-panel/index.js +6 -0
  237. package/dist/components/reviews-panel/index.js.map +1 -0
  238. package/dist/components/reviews-panel/reviews-panel.agent.d.ts +4 -0
  239. package/dist/components/reviews-panel/reviews-panel.agent.d.ts.map +1 -0
  240. package/dist/components/reviews-panel/reviews-panel.d.ts +76 -0
  241. package/dist/components/reviews-panel/reviews-panel.d.ts.map +1 -0
  242. package/dist/components/search-bar/index.js +1 -1
  243. package/dist/components/search-input/index.js +1 -1
  244. package/dist/components/sheet/index.js +1 -1
  245. package/dist/components/sign-in-with-alfadocs-button/index.js +1 -1
  246. package/dist/components/slot-grid/index.js +1 -1
  247. package/dist/components/spinner/index.js +1 -1
  248. package/dist/components/stepper-accordion/index.js +4 -3
  249. package/dist/components/stepper-accordion/index.js.map +1 -1
  250. package/dist/components/task-tray/index.js +1 -1
  251. package/dist/components/theme-toggle/index.js +1 -1
  252. package/dist/components/timeline/index.js +1 -1
  253. package/dist/components/toast/index.js +1 -1
  254. package/dist/components/transcript-panel/index.js +1 -1
  255. package/dist/components/workflow/index.js +1 -1
  256. package/dist/hooks/index.js +1 -1
  257. package/dist/hooks/use-theme.d.ts.map +1 -1
  258. package/dist/i18n/config.js +4923 -49
  259. package/dist/i18n/config.js.map +1 -1
  260. package/dist/i18n/locales/ar.d.ts +272 -0
  261. package/dist/i18n/locales/ar.d.ts.map +1 -1
  262. package/dist/i18n/locales/de.d.ts +272 -0
  263. package/dist/i18n/locales/de.d.ts.map +1 -1
  264. package/dist/i18n/locales/el.d.ts +272 -0
  265. package/dist/i18n/locales/el.d.ts.map +1 -1
  266. package/dist/i18n/locales/es.d.ts +272 -0
  267. package/dist/i18n/locales/es.d.ts.map +1 -1
  268. package/dist/i18n/locales/fr.d.ts +272 -0
  269. package/dist/i18n/locales/fr.d.ts.map +1 -1
  270. package/dist/i18n/locales/hi.d.ts +272 -0
  271. package/dist/i18n/locales/hi.d.ts.map +1 -1
  272. package/dist/i18n/locales/ja.d.ts +272 -0
  273. package/dist/i18n/locales/ja.d.ts.map +1 -1
  274. package/dist/i18n/locales/nl.d.ts +272 -0
  275. package/dist/i18n/locales/nl.d.ts.map +1 -1
  276. package/dist/i18n/locales/pl.d.ts +272 -0
  277. package/dist/i18n/locales/pl.d.ts.map +1 -1
  278. package/dist/i18n/locales/pt.d.ts +272 -0
  279. package/dist/i18n/locales/pt.d.ts.map +1 -1
  280. package/dist/i18n/locales/ro.d.ts +272 -0
  281. package/dist/i18n/locales/ro.d.ts.map +1 -1
  282. package/dist/i18n/locales/ru.d.ts +272 -0
  283. package/dist/i18n/locales/ru.d.ts.map +1 -1
  284. package/dist/i18n/locales/sq.d.ts +272 -0
  285. package/dist/i18n/locales/sq.d.ts.map +1 -1
  286. package/dist/i18n/locales/sv.d.ts +272 -0
  287. package/dist/i18n/locales/sv.d.ts.map +1 -1
  288. package/dist/i18n/locales/tr.d.ts +272 -0
  289. package/dist/i18n/locales/tr.d.ts.map +1 -1
  290. package/dist/i18n/locales/zh.d.ts +272 -0
  291. package/dist/i18n/locales/zh.d.ts.map +1 -1
  292. package/dist/i18n/resources.d.ts +544 -0
  293. package/dist/i18n/resources.d.ts.map +1 -1
  294. package/dist/index.js +364 -348
  295. package/dist/index.js.map +1 -1
  296. package/dist/locales/ar.json +273 -1
  297. package/dist/locales/de.json +273 -1
  298. package/dist/locales/el.json +273 -1
  299. package/dist/locales/en.json +273 -1
  300. package/dist/locales/es.json +273 -1
  301. package/dist/locales/fr.json +273 -1
  302. package/dist/locales/hi.json +273 -1
  303. package/dist/locales/it.json +273 -1
  304. package/dist/locales/ja.json +273 -1
  305. package/dist/locales/nl.json +273 -1
  306. package/dist/locales/pl.json +273 -1
  307. package/dist/locales/pt.json +273 -1
  308. package/dist/locales/ro.json +273 -1
  309. package/dist/locales/ru.json +273 -1
  310. package/dist/locales/sq.json +273 -1
  311. package/dist/locales/sv.json +273 -1
  312. package/dist/locales/tr.json +273 -1
  313. package/dist/locales/zh.json +273 -1
  314. package/dist/patterns/alia-assistant/index.js +1 -1
  315. package/dist/patterns/patient-shell/index.js +1 -1
  316. package/dist/patterns/patient-shell/patient-shell.d.ts.map +1 -1
  317. package/dist/tokens.css +1 -1
  318. package/package.json +17 -1
  319. package/dist/_chunks/alia-sidebar-CUi2UCbY.js.map +0 -1
  320. package/dist/_chunks/avatar-BpFohgWG.js.map +0 -1
  321. package/dist/_chunks/benefit-card-DXmrAyfn.js.map +0 -1
  322. package/dist/_chunks/calendar-zy0tUUVG.js.map +0 -1
  323. package/dist/_chunks/card-C353dU-H.js.map +0 -1
  324. package/dist/_chunks/description-list-Bsga4IW8.js.map +0 -1
  325. package/dist/_chunks/empty-state-3CLJIXSj.js.map +0 -1
  326. package/dist/_chunks/header-DqmKROIY.js.map +0 -1
  327. package/dist/_chunks/icon-button-C4CGcYuz.js +0 -54
  328. package/dist/_chunks/icon-button-C4CGcYuz.js.map +0 -1
  329. package/dist/_chunks/isSameMonth-5wNF2f4I.js +0 -1307
  330. package/dist/_chunks/isSameMonth-5wNF2f4I.js.map +0 -1
  331. package/dist/_chunks/link-DmM5IevO.js.map +0 -1
  332. package/dist/_chunks/locale-picker-BxEUUPW7.js.map +0 -1
  333. package/dist/_chunks/matrix-rain-CRPMXcVx.js.map +0 -1
  334. package/dist/_chunks/notification-card-ejOw5g6g.js.map +0 -1
  335. package/dist/_chunks/notification-tray-D_69dXFY.js.map +0 -1
  336. package/dist/_chunks/patient-shell-B164drIa.js +0 -173
  337. package/dist/_chunks/popover--derJ_wq.js.map +0 -1
  338. package/dist/_chunks/public-header.agent-BQ3r6Hgq.js.map +0 -1
  339. package/dist/_chunks/react-day-picker-C5F3-TTX.js +0 -1827
  340. package/dist/_chunks/react-day-picker-C5F3-TTX.js.map +0 -1
  341. package/dist/_chunks/slot-grid-CgpYgBkW.js +0 -502
  342. package/dist/_chunks/slot-grid-CgpYgBkW.js.map +0 -1
  343. package/dist/_chunks/spinner-DirtWZNG.js.map +0 -1
  344. package/dist/_chunks/stepper-C-sIpRRU.js +0 -7
  345. package/dist/_chunks/stepper-C-sIpRRU.js.map +0 -1
  346. package/dist/_chunks/stepper-accordion.agent-ckKYZCIP.js +0 -322
  347. package/dist/_chunks/stepper-accordion.agent-ckKYZCIP.js.map +0 -1
  348. package/dist/_chunks/stepper-calendar-BLOJUE0-.js +0 -648
  349. package/dist/_chunks/stepper-calendar-BLOJUE0-.js.map +0 -1
  350. package/dist/_chunks/sun-Eweh5fvi.js.map +0 -1
  351. package/dist/_chunks/use-password-requirements-C9vKBSVn.js.map +0 -1
  352. package/dist/_chunks/use-theme-B1cwAXJR.js +0 -145
  353. package/dist/_chunks/use-theme-B1cwAXJR.js.map +0 -1
  354. package/dist/components/stepper-calendar/index.d.ts +0 -4
  355. package/dist/components/stepper-calendar/index.d.ts.map +0 -1
  356. package/dist/components/stepper-calendar/index.js +0 -6
  357. package/dist/components/stepper-calendar/stepper-calendar.agent.d.ts +0 -4
  358. package/dist/components/stepper-calendar/stepper-calendar.agent.d.ts.map +0 -1
  359. package/dist/components/stepper-calendar/stepper-calendar.d.ts +0 -62
  360. package/dist/components/stepper-calendar/stepper-calendar.d.ts.map +0 -1
  361. /package/dist/components/{stepper-calendar → booking}/index.js.map +0 -0
@@ -2,7 +2,7 @@ import { jsxs as U, jsx as L } from "react/jsx-runtime";
2
2
  import { forwardRef as q, useRef as u, useState as E, useEffect as G, useMemo as J, useImperativeHandle as K } from "react";
3
3
  import { useTranslation as Q } from "react-i18next";
4
4
  import { u as X } from "./form-field-context-B3APVHKx.js";
5
- import { u as Y } from "./use-theme-B1cwAXJR.js";
5
+ import { u as Y } from "./use-theme-C2dHKUAN.js";
6
6
  import { u as Z } from "./registry-C9nwlNyL.js";
7
7
  const z = {
8
8
  id: "recaptcha-widget",
@@ -189,4 +189,4 @@ export {
189
189
  oe as R,
190
190
  z as r
191
191
  };
192
- //# sourceMappingURL=recaptcha-widget-Kp1XntuE.js.map
192
+ //# sourceMappingURL=recaptcha-widget-BtBNb6tB.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"recaptcha-widget-Kp1XntuE.js","sources":["../../src/components/recaptcha-widget/recaptcha-widget.agent.ts","../../src/components/recaptcha-widget/recaptcha-widget.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — RecaptchaWidget. */\n/* */\n/* Recaptcha already exposes a curated `RecaptchaWidgetHandle` via */\n/* useImperativeHandle. The adapter wires `execute` (issue token, write) */\n/* and `reset` (clear token, destructive) into that existing handle. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { RecaptchaWidgetHandle } from './recaptcha-widget';\n\nexport const recaptchaWidgetAgent: AgentAdapter<RecaptchaWidgetHandle> = {\n id: 'recaptcha-widget',\n capabilities: ['submit'],\n state: {\n hasToken: {\n type: 'boolean',\n descriptionKey: 'ui.agent.recaptchaWidget.state.hasToken',\n description:\n 'True when the widget currently holds a valid verification token.',\n read: (handle) => handle.getResponse().length > 0,\n },\n },\n actions: {\n execute: {\n safety: 'write',\n descriptionKey: 'ui.agent.recaptchaWidget.actions.execute',\n description:\n 'Programmatically trigger the captcha challenge. Issues a token via the callback.',\n invoke: (handle) => {\n handle.execute();\n },\n },\n reset: {\n safety: 'destructive',\n descriptionKey: 'ui.agent.recaptchaWidget.actions.reset',\n description:\n 'Clear the current token and re-roll the captcha. Irreversible.',\n invoke: (handle) => {\n handle.reset();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'recaptcha-widget',\n description: 'Marks the RecaptchaWidget wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description:\n 'Sourced from the id prop (or the surrounding FormField id).',\n },\n },\n};\n","import {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useFormField } from '../form-field/form-field-context';\nimport { useTheme } from '../../hooks';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { recaptchaWidgetAgent } from './recaptcha-widget.agent';\n\n/* ------------------------------------------------------------------ */\n/* Loader — idempotent across instances */\n/* ------------------------------------------------------------------ */\n\n/**\n * Google reCAPTCHA v2 ships as a global `grecaptcha` object loaded from\n * `https://www.google.com/recaptcha/api.js`. We lazy-load the script\n * once per page using a shared promise so N widgets on the same form\n * (or N renders of a single widget) all wait on the same fetch.\n *\n * The `?render=explicit` query parameter is required so we control\n * when each widget mounts via `grecaptcha.render`, rather than letting\n * the global auto-bind to every `.g-recaptcha` div on the page.\n */\nconst SCRIPT_SRC = 'https://www.google.com/recaptcha/api.js';\nconst SCRIPT_ID = 'alfadocs-ui-recaptcha-loader';\n\ninterface RecaptchaApi {\n render: (\n container: HTMLElement,\n parameters: {\n sitekey: string;\n theme?: 'light' | 'dark';\n size?: 'normal' | 'compact' | 'invisible';\n hl?: string;\n callback?: (token: string) => void;\n 'expired-callback'?: () => void;\n 'error-callback'?: () => void;\n },\n ) => number;\n reset: (widgetId?: number) => void;\n getResponse: (widgetId?: number) => string;\n execute: (widgetId?: number) => void;\n}\n\ndeclare global {\n interface Window {\n grecaptcha?: RecaptchaApi;\n ___grecaptchaOnLoad___?: () => void;\n }\n}\n\nlet loaderPromise: Promise<RecaptchaApi> | null = null;\n\nfunction loadRecaptcha(hl: string | undefined): Promise<RecaptchaApi> {\n if (typeof window === 'undefined') {\n return Promise.reject(new Error('recaptcha: window is not available'));\n }\n if (window.grecaptcha && typeof window.grecaptcha.render === 'function') {\n return Promise.resolve(window.grecaptcha);\n }\n if (loaderPromise) {\n return loaderPromise;\n }\n\n loaderPromise = new Promise<RecaptchaApi>((resolve, reject) => {\n const existing = document.getElementById(\n SCRIPT_ID,\n ) as HTMLScriptElement | null;\n\n const onReady = () => {\n if (window.grecaptcha && typeof window.grecaptcha.render === 'function') {\n resolve(window.grecaptcha);\n } else {\n reject(new Error('recaptcha: grecaptcha global missing after load'));\n }\n };\n\n window.___grecaptchaOnLoad___ = onReady;\n\n if (existing) {\n // Another instance kicked off the load — wait for the global\n // onload callback we just (re)installed.\n return;\n }\n\n const params = new URLSearchParams({\n onload: '___grecaptchaOnLoad___',\n render: 'explicit',\n });\n if (hl) params.set('hl', hl);\n\n const script = document.createElement('script');\n script.id = SCRIPT_ID;\n script.src = `${SCRIPT_SRC}?${params.toString()}`;\n script.async = true;\n script.defer = true;\n script.onerror = () => {\n loaderPromise = null;\n reject(new Error('recaptcha: script failed to load'));\n };\n document.head.appendChild(script);\n });\n\n return loaderPromise;\n}\n\n/* ------------------------------------------------------------------ */\n/* Public API */\n/* ------------------------------------------------------------------ */\n\nexport interface RecaptchaWidgetHandle {\n /** Re-roll the captcha — clears the response token. */\n reset: () => void;\n /** Returns the current response token, or empty string when unsolved. */\n getResponse: () => string;\n /** Programmatically trigger an invisible captcha challenge. */\n execute: () => void;\n}\n\nexport interface RecaptchaWidgetProps {\n /** Google reCAPTCHA v2 site key. Required. */\n siteKey: string;\n /**\n * Visual theme. Defaults to the resolved DS theme (`useTheme`).\n * Pass `'light'` / `'dark'` to force.\n */\n theme?: 'light' | 'dark';\n /** Two-letter locale hint. Defaults to the current i18next language. */\n locale?: string;\n /** Widget size. */\n size?: 'normal' | 'compact' | 'invisible';\n /** Called with the verification token, or `null` when expired/reset. */\n onChange?: (token: string | null) => void;\n /** Called when the user solves but the token then times out. */\n onExpired?: () => void;\n /** Called when the script or challenge errors out. */\n onError?: () => void;\n /** Error message — wires aria-describedby + announces via the live region. */\n error?: string;\n /** Override the DOM id; defaults to the surrounding FormField id. */\n id?: string;\n /** Extra class names on the wrapper. */\n className?: string;\n}\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport const RecaptchaWidget = forwardRef<\n RecaptchaWidgetHandle,\n RecaptchaWidgetProps\n>(function RecaptchaWidget(\n {\n siteKey,\n theme,\n locale,\n size = 'normal',\n onChange,\n onExpired,\n onError,\n error,\n id,\n className,\n },\n ref,\n) {\n const { t, i18n } = useTranslation();\n const formField = useFormField();\n const { resolvedTheme } = useTheme();\n\n const containerRef = useRef<HTMLDivElement | null>(null);\n const widgetIdRef = useRef<number | null>(null);\n const apiRef = useRef<RecaptchaApi | null>(null);\n const [statusMessage, setStatusMessage] = useState<string>('');\n\n const wrapperId = id ?? formField.id;\n const errorId = error ? `${wrapperId}-error` : undefined;\n const describedBy =\n [formField.describedBy, errorId].filter(Boolean).join(' ') || undefined;\n\n // Mirror the DS theme into reCAPTCHA's two-tone setting.\n const effectiveTheme: 'light' | 'dark' =\n theme ?? (resolvedTheme.startsWith('dark') ? 'dark' : 'light');\n const effectiveLocale = locale ?? i18n.language;\n\n // Stable callbacks via refs so we don't re-render the widget on\n // every parent state change.\n const onChangeRef = useRef(onChange);\n const onExpiredRef = useRef(onExpired);\n const onErrorRef = useRef(onError);\n onChangeRef.current = onChange;\n onExpiredRef.current = onExpired;\n onErrorRef.current = onError;\n\n const expiredLabel = t(\n 'inputs.recaptcha.expired',\n 'Verification expired — please retry.',\n );\n const errorLabel = t(\n 'inputs.recaptcha.error',\n 'Verification failed — please retry.',\n );\n\n useEffect(() => {\n if (!siteKey || !containerRef.current) return;\n let cancelled = false;\n\n loadRecaptcha(effectiveLocale)\n .then((api) => {\n if (cancelled || !containerRef.current) return;\n apiRef.current = api;\n widgetIdRef.current = api.render(containerRef.current, {\n sitekey: siteKey,\n theme: effectiveTheme,\n size,\n hl: effectiveLocale,\n callback: (token) => {\n setStatusMessage('');\n onChangeRef.current?.(token);\n },\n 'expired-callback': () => {\n setStatusMessage(expiredLabel);\n onChangeRef.current?.(null);\n onExpiredRef.current?.();\n },\n 'error-callback': () => {\n setStatusMessage(errorLabel);\n onChangeRef.current?.(null);\n onErrorRef.current?.();\n },\n });\n })\n .catch(() => {\n if (cancelled) return;\n setStatusMessage(errorLabel);\n onErrorRef.current?.();\n });\n\n return () => {\n cancelled = true;\n // grecaptcha has no public destroy. The shared script stays\n // loaded; we reset the widget so its iframe stops listening.\n if (apiRef.current && widgetIdRef.current !== null) {\n try {\n apiRef.current.reset(widgetIdRef.current);\n } catch {\n /* widget id may already be invalid — safe to ignore. */\n }\n }\n };\n // Re-render the widget when the underlying configuration changes.\n }, [\n siteKey,\n effectiveTheme,\n effectiveLocale,\n size,\n expiredLabel,\n errorLabel,\n ]);\n\n const agentHandle = useMemo<RecaptchaWidgetHandle>(\n () => ({\n reset: () => {\n if (apiRef.current && widgetIdRef.current !== null) {\n apiRef.current.reset(widgetIdRef.current);\n setStatusMessage('');\n onChangeRef.current?.(null);\n }\n },\n getResponse: () => {\n if (apiRef.current && widgetIdRef.current !== null) {\n return apiRef.current.getResponse(widgetIdRef.current);\n }\n return '';\n },\n execute: () => {\n if (apiRef.current && widgetIdRef.current !== null) {\n apiRef.current.execute(widgetIdRef.current);\n }\n },\n }),\n [],\n );\n useImperativeHandle(ref, () => agentHandle, [agentHandle]);\n useAgentRegistration(recaptchaWidgetAgent, agentHandle, wrapperId);\n\n const liveMessage = error || statusMessage;\n // For invisible widgets the iframe is offscreen, so we mark the\n // wrapper as a non-visual badge. Otherwise the wrapper just hosts\n // the rendered iframe and contributes no interactive role itself.\n const wrapperRole = size === 'invisible' ? 'presentation' : undefined;\n\n return (\n <div\n className={[\n 'ds:inline-block',\n // Keep the iframe inside the wrapper's stacking context so\n // popovers etc. above the form continue to overlay correctly.\n 'ds:relative ds:isolate',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n data-component=\"recaptcha-widget\"\n data-component-id={wrapperId}\n data-size={size}\n role={wrapperRole}\n >\n <div\n ref={containerRef}\n id={wrapperId}\n // The class name is the canonical hook Google's verifier\n // looks for when the page form is submitted server-side. Some\n // Symfony / Laravel validators short-circuit when this class\n // is missing, so we render it even though we're using\n // grecaptcha.render explicitly.\n className=\"g-recaptcha\"\n data-sitekey={siteKey}\n data-theme={effectiveTheme}\n data-size={size}\n aria-describedby={describedBy}\n aria-invalid={error || formField.invalid ? true : undefined}\n />\n {/* Live announcement for expired / error states. Empty when the\n widget is healthy so SR users aren't spammed. */}\n <div\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n className=\"ds:sr-only\"\n >\n {liveMessage}\n </div>\n </div>\n );\n});\n"],"names":["recaptchaWidgetAgent","handle","SCRIPT_SRC","SCRIPT_ID","loaderPromise","loadRecaptcha","hl","resolve","reject","existing","onReady","params","script","RecaptchaWidget","forwardRef","siteKey","theme","locale","size","onChange","onExpired","onError","error","id","className","ref","t","i18n","useTranslation","formField","useFormField","resolvedTheme","useTheme","containerRef","useRef","widgetIdRef","apiRef","statusMessage","setStatusMessage","useState","wrapperId","errorId","describedBy","effectiveTheme","effectiveLocale","onChangeRef","onExpiredRef","onErrorRef","expiredLabel","errorLabel","useEffect","cancelled","api","token","_a","_b","agentHandle","useMemo","useImperativeHandle","useAgentRegistration","liveMessage","wrapperRole","jsxs","jsx"],"mappings":"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"}
1
+ {"version":3,"file":"recaptcha-widget-BtBNb6tB.js","sources":["../../src/components/recaptcha-widget/recaptcha-widget.agent.ts","../../src/components/recaptcha-widget/recaptcha-widget.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — RecaptchaWidget. */\n/* */\n/* Recaptcha already exposes a curated `RecaptchaWidgetHandle` via */\n/* useImperativeHandle. The adapter wires `execute` (issue token, write) */\n/* and `reset` (clear token, destructive) into that existing handle. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { RecaptchaWidgetHandle } from './recaptcha-widget';\n\nexport const recaptchaWidgetAgent: AgentAdapter<RecaptchaWidgetHandle> = {\n id: 'recaptcha-widget',\n capabilities: ['submit'],\n state: {\n hasToken: {\n type: 'boolean',\n descriptionKey: 'ui.agent.recaptchaWidget.state.hasToken',\n description:\n 'True when the widget currently holds a valid verification token.',\n read: (handle) => handle.getResponse().length > 0,\n },\n },\n actions: {\n execute: {\n safety: 'write',\n descriptionKey: 'ui.agent.recaptchaWidget.actions.execute',\n description:\n 'Programmatically trigger the captcha challenge. Issues a token via the callback.',\n invoke: (handle) => {\n handle.execute();\n },\n },\n reset: {\n safety: 'destructive',\n descriptionKey: 'ui.agent.recaptchaWidget.actions.reset',\n description:\n 'Clear the current token and re-roll the captcha. Irreversible.',\n invoke: (handle) => {\n handle.reset();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'recaptcha-widget',\n description: 'Marks the RecaptchaWidget wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description:\n 'Sourced from the id prop (or the surrounding FormField id).',\n },\n },\n};\n","import {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useFormField } from '../form-field/form-field-context';\nimport { useTheme } from '../../hooks';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { recaptchaWidgetAgent } from './recaptcha-widget.agent';\n\n/* ------------------------------------------------------------------ */\n/* Loader — idempotent across instances */\n/* ------------------------------------------------------------------ */\n\n/**\n * Google reCAPTCHA v2 ships as a global `grecaptcha` object loaded from\n * `https://www.google.com/recaptcha/api.js`. We lazy-load the script\n * once per page using a shared promise so N widgets on the same form\n * (or N renders of a single widget) all wait on the same fetch.\n *\n * The `?render=explicit` query parameter is required so we control\n * when each widget mounts via `grecaptcha.render`, rather than letting\n * the global auto-bind to every `.g-recaptcha` div on the page.\n */\nconst SCRIPT_SRC = 'https://www.google.com/recaptcha/api.js';\nconst SCRIPT_ID = 'alfadocs-ui-recaptcha-loader';\n\ninterface RecaptchaApi {\n render: (\n container: HTMLElement,\n parameters: {\n sitekey: string;\n theme?: 'light' | 'dark';\n size?: 'normal' | 'compact' | 'invisible';\n hl?: string;\n callback?: (token: string) => void;\n 'expired-callback'?: () => void;\n 'error-callback'?: () => void;\n },\n ) => number;\n reset: (widgetId?: number) => void;\n getResponse: (widgetId?: number) => string;\n execute: (widgetId?: number) => void;\n}\n\ndeclare global {\n interface Window {\n grecaptcha?: RecaptchaApi;\n ___grecaptchaOnLoad___?: () => void;\n }\n}\n\nlet loaderPromise: Promise<RecaptchaApi> | null = null;\n\nfunction loadRecaptcha(hl: string | undefined): Promise<RecaptchaApi> {\n if (typeof window === 'undefined') {\n return Promise.reject(new Error('recaptcha: window is not available'));\n }\n if (window.grecaptcha && typeof window.grecaptcha.render === 'function') {\n return Promise.resolve(window.grecaptcha);\n }\n if (loaderPromise) {\n return loaderPromise;\n }\n\n loaderPromise = new Promise<RecaptchaApi>((resolve, reject) => {\n const existing = document.getElementById(\n SCRIPT_ID,\n ) as HTMLScriptElement | null;\n\n const onReady = () => {\n if (window.grecaptcha && typeof window.grecaptcha.render === 'function') {\n resolve(window.grecaptcha);\n } else {\n reject(new Error('recaptcha: grecaptcha global missing after load'));\n }\n };\n\n window.___grecaptchaOnLoad___ = onReady;\n\n if (existing) {\n // Another instance kicked off the load — wait for the global\n // onload callback we just (re)installed.\n return;\n }\n\n const params = new URLSearchParams({\n onload: '___grecaptchaOnLoad___',\n render: 'explicit',\n });\n if (hl) params.set('hl', hl);\n\n const script = document.createElement('script');\n script.id = SCRIPT_ID;\n script.src = `${SCRIPT_SRC}?${params.toString()}`;\n script.async = true;\n script.defer = true;\n script.onerror = () => {\n loaderPromise = null;\n reject(new Error('recaptcha: script failed to load'));\n };\n document.head.appendChild(script);\n });\n\n return loaderPromise;\n}\n\n/* ------------------------------------------------------------------ */\n/* Public API */\n/* ------------------------------------------------------------------ */\n\nexport interface RecaptchaWidgetHandle {\n /** Re-roll the captcha — clears the response token. */\n reset: () => void;\n /** Returns the current response token, or empty string when unsolved. */\n getResponse: () => string;\n /** Programmatically trigger an invisible captcha challenge. */\n execute: () => void;\n}\n\nexport interface RecaptchaWidgetProps {\n /** Google reCAPTCHA v2 site key. Required. */\n siteKey: string;\n /**\n * Visual theme. Defaults to the resolved DS theme (`useTheme`).\n * Pass `'light'` / `'dark'` to force.\n */\n theme?: 'light' | 'dark';\n /** Two-letter locale hint. Defaults to the current i18next language. */\n locale?: string;\n /** Widget size. */\n size?: 'normal' | 'compact' | 'invisible';\n /** Called with the verification token, or `null` when expired/reset. */\n onChange?: (token: string | null) => void;\n /** Called when the user solves but the token then times out. */\n onExpired?: () => void;\n /** Called when the script or challenge errors out. */\n onError?: () => void;\n /** Error message — wires aria-describedby + announces via the live region. */\n error?: string;\n /** Override the DOM id; defaults to the surrounding FormField id. */\n id?: string;\n /** Extra class names on the wrapper. */\n className?: string;\n}\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport const RecaptchaWidget = forwardRef<\n RecaptchaWidgetHandle,\n RecaptchaWidgetProps\n>(function RecaptchaWidget(\n {\n siteKey,\n theme,\n locale,\n size = 'normal',\n onChange,\n onExpired,\n onError,\n error,\n id,\n className,\n },\n ref,\n) {\n const { t, i18n } = useTranslation();\n const formField = useFormField();\n const { resolvedTheme } = useTheme();\n\n const containerRef = useRef<HTMLDivElement | null>(null);\n const widgetIdRef = useRef<number | null>(null);\n const apiRef = useRef<RecaptchaApi | null>(null);\n const [statusMessage, setStatusMessage] = useState<string>('');\n\n const wrapperId = id ?? formField.id;\n const errorId = error ? `${wrapperId}-error` : undefined;\n const describedBy =\n [formField.describedBy, errorId].filter(Boolean).join(' ') || undefined;\n\n // Mirror the DS theme into reCAPTCHA's two-tone setting.\n const effectiveTheme: 'light' | 'dark' =\n theme ?? (resolvedTheme.startsWith('dark') ? 'dark' : 'light');\n const effectiveLocale = locale ?? i18n.language;\n\n // Stable callbacks via refs so we don't re-render the widget on\n // every parent state change.\n const onChangeRef = useRef(onChange);\n const onExpiredRef = useRef(onExpired);\n const onErrorRef = useRef(onError);\n onChangeRef.current = onChange;\n onExpiredRef.current = onExpired;\n onErrorRef.current = onError;\n\n const expiredLabel = t(\n 'inputs.recaptcha.expired',\n 'Verification expired — please retry.',\n );\n const errorLabel = t(\n 'inputs.recaptcha.error',\n 'Verification failed — please retry.',\n );\n\n useEffect(() => {\n if (!siteKey || !containerRef.current) return;\n let cancelled = false;\n\n loadRecaptcha(effectiveLocale)\n .then((api) => {\n if (cancelled || !containerRef.current) return;\n apiRef.current = api;\n widgetIdRef.current = api.render(containerRef.current, {\n sitekey: siteKey,\n theme: effectiveTheme,\n size,\n hl: effectiveLocale,\n callback: (token) => {\n setStatusMessage('');\n onChangeRef.current?.(token);\n },\n 'expired-callback': () => {\n setStatusMessage(expiredLabel);\n onChangeRef.current?.(null);\n onExpiredRef.current?.();\n },\n 'error-callback': () => {\n setStatusMessage(errorLabel);\n onChangeRef.current?.(null);\n onErrorRef.current?.();\n },\n });\n })\n .catch(() => {\n if (cancelled) return;\n setStatusMessage(errorLabel);\n onErrorRef.current?.();\n });\n\n return () => {\n cancelled = true;\n // grecaptcha has no public destroy. The shared script stays\n // loaded; we reset the widget so its iframe stops listening.\n if (apiRef.current && widgetIdRef.current !== null) {\n try {\n apiRef.current.reset(widgetIdRef.current);\n } catch {\n /* widget id may already be invalid — safe to ignore. */\n }\n }\n };\n // Re-render the widget when the underlying configuration changes.\n }, [\n siteKey,\n effectiveTheme,\n effectiveLocale,\n size,\n expiredLabel,\n errorLabel,\n ]);\n\n const agentHandle = useMemo<RecaptchaWidgetHandle>(\n () => ({\n reset: () => {\n if (apiRef.current && widgetIdRef.current !== null) {\n apiRef.current.reset(widgetIdRef.current);\n setStatusMessage('');\n onChangeRef.current?.(null);\n }\n },\n getResponse: () => {\n if (apiRef.current && widgetIdRef.current !== null) {\n return apiRef.current.getResponse(widgetIdRef.current);\n }\n return '';\n },\n execute: () => {\n if (apiRef.current && widgetIdRef.current !== null) {\n apiRef.current.execute(widgetIdRef.current);\n }\n },\n }),\n [],\n );\n useImperativeHandle(ref, () => agentHandle, [agentHandle]);\n useAgentRegistration(recaptchaWidgetAgent, agentHandle, wrapperId);\n\n const liveMessage = error || statusMessage;\n // For invisible widgets the iframe is offscreen, so we mark the\n // wrapper as a non-visual badge. Otherwise the wrapper just hosts\n // the rendered iframe and contributes no interactive role itself.\n const wrapperRole = size === 'invisible' ? 'presentation' : undefined;\n\n return (\n <div\n className={[\n 'ds:inline-block',\n // Keep the iframe inside the wrapper's stacking context so\n // popovers etc. above the form continue to overlay correctly.\n 'ds:relative ds:isolate',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n data-component=\"recaptcha-widget\"\n data-component-id={wrapperId}\n data-size={size}\n role={wrapperRole}\n >\n <div\n ref={containerRef}\n id={wrapperId}\n // The class name is the canonical hook Google's verifier\n // looks for when the page form is submitted server-side. Some\n // Symfony / Laravel validators short-circuit when this class\n // is missing, so we render it even though we're using\n // grecaptcha.render explicitly.\n className=\"g-recaptcha\"\n data-sitekey={siteKey}\n data-theme={effectiveTheme}\n data-size={size}\n aria-describedby={describedBy}\n aria-invalid={error || formField.invalid ? true : undefined}\n />\n {/* Live announcement for expired / error states. Empty when the\n widget is healthy so SR users aren't spammed. */}\n <div\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n className=\"ds:sr-only\"\n >\n {liveMessage}\n </div>\n </div>\n );\n});\n"],"names":["recaptchaWidgetAgent","handle","SCRIPT_SRC","SCRIPT_ID","loaderPromise","loadRecaptcha","hl","resolve","reject","existing","onReady","params","script","RecaptchaWidget","forwardRef","siteKey","theme","locale","size","onChange","onExpired","onError","error","id","className","ref","t","i18n","useTranslation","formField","useFormField","resolvedTheme","useTheme","containerRef","useRef","widgetIdRef","apiRef","statusMessage","setStatusMessage","useState","wrapperId","errorId","describedBy","effectiveTheme","effectiveLocale","onChangeRef","onExpiredRef","onErrorRef","expiredLabel","errorLabel","useEffect","cancelled","api","token","_a","_b","agentHandle","useMemo","useImperativeHandle","useAgentRegistration","liveMessage","wrapperRole","jsxs","jsx"],"mappings":"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"}
@@ -0,0 +1,513 @@
1
+ import { jsx as s, jsxs as t } from "react/jsx-runtime";
2
+ import { forwardRef as q, useState as _, useCallback as L, useMemo as V, useRef as F, useImperativeHandle as G, useId as B, useEffect as J } from "react";
3
+ import { c as K } from "./index-D2ZczOXr.js";
4
+ import { useTranslation as E } from "react-i18next";
5
+ import { u as Q } from "./registry-C9nwlNyL.js";
6
+ import { R as N } from "./rating-BRD7O74e.js";
7
+ import { C as T } from "./card-DKTMLVrw.js";
8
+ import { C as W, b as X, a as Y } from "./collapsible-hHiyZp0b.js";
9
+ import { D as d } from "./description-list-yl3y3QKg.js";
10
+ import { E as Z } from "./empty-state-BLy7tigq.js";
11
+ import { S as C } from "./skeleton-CZbwyJAA.js";
12
+ import { B as ee } from "./button-DD_0Xdmr.js";
13
+ import { C as se } from "./chevron-down-BX_NP2Yh.js";
14
+ const ae = {
15
+ id: "reviews-panel",
16
+ capabilities: ["filter"],
17
+ state: {
18
+ filter: {
19
+ type: "string",
20
+ descriptionKey: "ui.agent.reviewsPanel.state.filter",
21
+ description: 'Active star-bucket filter — `"all"` or an integer 1..5. Reads the controlled `filter` prop.',
22
+ read: (e) => e.getFilter()
23
+ },
24
+ visibleCount: {
25
+ type: "number",
26
+ descriptionKey: "ui.agent.reviewsPanel.state.visibleCount",
27
+ description: "Number of reviews currently rendered after the filter is applied.",
28
+ read: (e) => e.getVisibleCount()
29
+ }
30
+ },
31
+ actions: {
32
+ set_filter: {
33
+ safety: "read",
34
+ argsType: '{ filter: "all" | 1 | 2 | 3 | 4 | 5 }',
35
+ descriptionKey: "ui.agent.reviewsPanel.actions.setFilter",
36
+ description: 'Narrow the visible review list to a star bucket, or `"all"` to clear the filter.',
37
+ invoke: (e, l) => {
38
+ e.setFilter(l.filter);
39
+ }
40
+ }
41
+ },
42
+ domHooks: {
43
+ root: {
44
+ attr: "data-component",
45
+ value: "reviews-panel",
46
+ description: "Marks the ReviewsPanel root region."
47
+ },
48
+ instanceId: {
49
+ attr: "data-component-id",
50
+ sourceProp: "id",
51
+ description: "Sourced from the id prop."
52
+ }
53
+ }
54
+ }, b = ["all", 5, 4, 3, 2, 1];
55
+ function $(e) {
56
+ return Math.min(5, Math.max(1, Math.floor(e)));
57
+ }
58
+ function te(e) {
59
+ const l = {
60
+ 1: 0,
61
+ 2: 0,
62
+ 3: 0,
63
+ 4: 0,
64
+ 5: 0
65
+ };
66
+ for (const r of e) l[$(r.overallScore)] += 1;
67
+ return l;
68
+ }
69
+ const re = K(
70
+ [
71
+ "ds:relative ds:flex ds:w-full ds:items-center ds:justify-between",
72
+ "ds:gap-[var(--spacing-sm)]",
73
+ "ds:min-h-[var(--min-target-size)]",
74
+ "ds:rounded-[var(--radius-md)]",
75
+ "ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)]",
76
+ "ds:pt-[var(--spacing-2xs)] ds:pb-[var(--spacing-2xs)]",
77
+ "ds:text-start",
78
+ "ds:transition-[background-color,color]",
79
+ "ds:duration-[var(--animation-duration)]",
80
+ "ds:motion-reduce:transition-none",
81
+ "ds:focus-visible:outline-[length:var(--focus-ring-width)]",
82
+ "ds:focus-visible:outline-solid",
83
+ "ds:focus-visible:outline-[var(--ring)]",
84
+ "ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]",
85
+ "ds:forced-colors:focus-visible:outline-[CanvasText]",
86
+ "ds:cursor-pointer"
87
+ ].join(" "),
88
+ {
89
+ variants: {
90
+ state: {
91
+ idle: "ds:hover:bg-[var(--muted)]/30 ds:text-[var(--foreground)]",
92
+ selected: [
93
+ "ds:bg-[var(--primary)]",
94
+ "ds:text-[var(--primary-foreground)]",
95
+ "ds:font-[var(--font-weight-semibold)]"
96
+ ].join(" ")
97
+ }
98
+ },
99
+ defaultVariants: { state: "idle" }
100
+ }
101
+ );
102
+ function ne({
103
+ filter: e,
104
+ histogram: l,
105
+ totalCount: r,
106
+ onChange: c
107
+ }) {
108
+ const { t: g } = E(), x = B(), [S, o] = _(
109
+ () => Math.max(0, b.indexOf(e))
110
+ );
111
+ J(() => {
112
+ const n = b.indexOf(e);
113
+ n >= 0 && o(n);
114
+ }, [e]);
115
+ const m = F(/* @__PURE__ */ new Map()), p = L((n) => {
116
+ var a;
117
+ (a = m.current.get(n)) == null || a.focus();
118
+ }, []), h = b.length, y = L(
119
+ (n, a) => {
120
+ switch (n.key) {
121
+ case "ArrowDown":
122
+ case "ArrowRight": {
123
+ n.preventDefault();
124
+ const i = (a + 1) % h;
125
+ o(i), p(i), c(b[i]);
126
+ break;
127
+ }
128
+ case "ArrowUp":
129
+ case "ArrowLeft": {
130
+ n.preventDefault();
131
+ const i = (a - 1 + h) % h;
132
+ o(i), p(i), c(b[i]);
133
+ break;
134
+ }
135
+ case "Home": {
136
+ n.preventDefault(), o(0), p(0), c(b[0]);
137
+ break;
138
+ }
139
+ case "End": {
140
+ n.preventDefault();
141
+ const i = h - 1;
142
+ o(i), p(i), c(b[i]);
143
+ break;
144
+ }
145
+ case "Enter":
146
+ case " ": {
147
+ n.preventDefault(), c(b[a]);
148
+ break;
149
+ }
150
+ }
151
+ },
152
+ [h, p, c]
153
+ );
154
+ return /* @__PURE__ */ t("div", { className: "ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]", children: [
155
+ /* @__PURE__ */ s(
156
+ "h3",
157
+ {
158
+ id: x,
159
+ className: "type-label ds:font-[var(--font-weight-semibold)] ds:text-[var(--foreground)] ds:m-0",
160
+ children: g("reviewsPanel.filterTitle")
161
+ }
162
+ ),
163
+ /* @__PURE__ */ s(
164
+ "div",
165
+ {
166
+ role: "radiogroup",
167
+ "aria-labelledby": x,
168
+ className: "ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)]",
169
+ children: b.map((n, a) => {
170
+ const i = n === "all", w = i ? 0 : n, f = i ? r : l[w], R = n === e, u = S === a, k = i ? g("reviewsPanel.filter.allLabel", { count: f }) : g("reviewsPanel.filter.starsLabel", { stars: w, count: f });
171
+ return /* @__PURE__ */ t(
172
+ "button",
173
+ {
174
+ ref: (P) => {
175
+ P ? m.current.set(a, P) : m.current.delete(a);
176
+ },
177
+ type: "button",
178
+ role: "radio",
179
+ "aria-checked": R,
180
+ "aria-label": k,
181
+ tabIndex: u ? 0 : -1,
182
+ onClick: () => {
183
+ o(a), c(n);
184
+ },
185
+ onFocus: () => o(a),
186
+ onKeyDown: (P) => y(P, a),
187
+ "data-filter-bucket": String(n),
188
+ className: re({
189
+ state: R ? "selected" : "idle"
190
+ }),
191
+ children: [
192
+ /* @__PURE__ */ s(
193
+ "span",
194
+ {
195
+ "aria-hidden": "true",
196
+ className: "ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]",
197
+ children: i ? /* @__PURE__ */ s("span", { className: "type-label", children: g("reviewsPanel.filter.allShort") }) : /* @__PURE__ */ s(N, { value: w, size: "sm", decorative: !0 })
198
+ }
199
+ ),
200
+ /* @__PURE__ */ s(
201
+ "span",
202
+ {
203
+ "aria-hidden": "true",
204
+ className: "type-meta ds:text-[var(--muted-foreground)]",
205
+ children: f
206
+ }
207
+ )
208
+ ]
209
+ },
210
+ String(n)
211
+ );
212
+ })
213
+ }
214
+ )
215
+ ] });
216
+ }
217
+ function ie({ review: e, locale: l }) {
218
+ var n, a, i, w;
219
+ const { t: r } = E(), c = B(), g = B(), [x, S] = _(!1), o = !!(e.breakdown && Object.values(e.breakdown).some((f) => f != null)), m = !!e.reply || o || !!e.futureVisit || !!e.recommendation, p = V(() => {
220
+ if (!e.authoredAt) return "";
221
+ try {
222
+ const f = new Date(e.authoredAt);
223
+ return Number.isNaN(f.getTime()) ? e.authoredAt : new Intl.DateTimeFormat(l, { dateStyle: "medium" }).format(
224
+ f
225
+ );
226
+ } catch {
227
+ return e.authoredAt;
228
+ }
229
+ }, [e.authoredAt, l]), h = e.pseudonym ?? r("reviewsPanel.anonymous"), y = /* @__PURE__ */ t(
230
+ W,
231
+ {
232
+ open: m ? x : !1,
233
+ onOpenChange: m ? S : void 0,
234
+ children: [
235
+ /* @__PURE__ */ t(T.Footer, { children: [
236
+ /* @__PURE__ */ s("span", { className: "type-meta ds:text-[var(--muted-foreground)]", children: p }),
237
+ m ? /* @__PURE__ */ s(X, { asChild: !0, children: /* @__PURE__ */ t(
238
+ "button",
239
+ {
240
+ id: c,
241
+ type: "button",
242
+ "data-review-trigger": !0,
243
+ className: "ds:ms-auto ds:inline-flex ds:items-center ds:gap-[var(--spacing-2xs)] ds:rounded-[var(--radius-sm)] ds:ps-[var(--spacing-2xs)] ds:pe-[var(--spacing-2xs)] ds:pt-[var(--spacing-2xs)] ds:pb-[var(--spacing-2xs)] ds:bg-transparent ds:border-0 ds:text-[length:var(--font-size-sm)] ds:text-[var(--primary)] ds:hover:underline ds:cursor-pointer ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid ds:focus-visible:outline-[var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)] ds:forced-colors:focus-visible:outline-[CanvasText]",
244
+ children: [
245
+ r(x ? "reviewsPanel.card.collapse" : "reviewsPanel.card.expand"),
246
+ /* @__PURE__ */ s(
247
+ se,
248
+ {
249
+ "aria-hidden": "true",
250
+ className: [
251
+ "ds:size-4 ds:transition-transform ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none",
252
+ x ? "ds:rotate-180" : ""
253
+ ].filter(Boolean).join(" ")
254
+ }
255
+ )
256
+ ]
257
+ }
258
+ ) }) : null
259
+ ] }),
260
+ m ? /* @__PURE__ */ s(Y, { id: g, "aria-labelledby": c, children: /* @__PURE__ */ t("div", { className: "ds:flex ds:flex-col ds:gap-[var(--spacing-sm)] ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:pb-[var(--spacing-md)]", children: [
261
+ o || e.futureVisit || e.recommendation ? /* @__PURE__ */ t(d, { layout: "inline", density: "compact", children: [
262
+ ((n = e.breakdown) == null ? void 0 : n.appointmentScore) != null ? /* @__PURE__ */ t(d.Row, { children: [
263
+ /* @__PURE__ */ s(d.Term, { children: r("reviewsPanel.breakdown.appointment") }),
264
+ /* @__PURE__ */ s(d.Detail, { children: /* @__PURE__ */ s(
265
+ N,
266
+ {
267
+ value: e.breakdown.appointmentScore,
268
+ size: "sm"
269
+ }
270
+ ) })
271
+ ] }) : null,
272
+ ((a = e.breakdown) == null ? void 0 : a.communicationScore) != null ? /* @__PURE__ */ t(d.Row, { children: [
273
+ /* @__PURE__ */ s(d.Term, { children: r("reviewsPanel.breakdown.communication") }),
274
+ /* @__PURE__ */ s(d.Detail, { children: /* @__PURE__ */ s(
275
+ N,
276
+ {
277
+ value: e.breakdown.communicationScore,
278
+ size: "sm"
279
+ }
280
+ ) })
281
+ ] }) : null,
282
+ ((i = e.breakdown) == null ? void 0 : i.staffScore) != null ? /* @__PURE__ */ t(d.Row, { children: [
283
+ /* @__PURE__ */ s(d.Term, { children: r("reviewsPanel.breakdown.staff") }),
284
+ /* @__PURE__ */ s(d.Detail, { children: /* @__PURE__ */ s(N, { value: e.breakdown.staffScore, size: "sm" }) })
285
+ ] }) : null,
286
+ ((w = e.breakdown) == null ? void 0 : w.overallScore) != null ? /* @__PURE__ */ t(d.Row, { children: [
287
+ /* @__PURE__ */ s(d.Term, { children: r("reviewsPanel.breakdown.overall") }),
288
+ /* @__PURE__ */ s(d.Detail, { children: /* @__PURE__ */ s(N, { value: e.breakdown.overallScore, size: "sm" }) })
289
+ ] }) : null,
290
+ e.futureVisit ? /* @__PURE__ */ t(d.Row, { children: [
291
+ /* @__PURE__ */ s(d.Term, { children: r("reviewsPanel.breakdown.futureVisit") }),
292
+ /* @__PURE__ */ s(d.Detail, { children: r(`reviewsPanel.answer.${e.futureVisit}`) })
293
+ ] }) : null,
294
+ e.recommendation ? /* @__PURE__ */ t(d.Row, { children: [
295
+ /* @__PURE__ */ s(d.Term, { children: r("reviewsPanel.breakdown.recommendation") }),
296
+ /* @__PURE__ */ s(d.Detail, { children: r(`reviewsPanel.answer.${e.recommendation}`) })
297
+ ] }) : null
298
+ ] }) : null,
299
+ e.reply ? /* @__PURE__ */ t("div", { className: "ds:rounded-[var(--radius-sm)] ds:bg-[var(--muted)]/40 ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)] ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-sm)]", children: [
300
+ /* @__PURE__ */ s("p", { className: "type-label ds:m-0 ds:mb-[var(--spacing-2xs)] ds:text-[var(--muted-foreground)] ds:font-[var(--font-weight-semibold)]", children: r("reviewsPanel.replyTitle") }),
301
+ /* @__PURE__ */ s("p", { className: "type-body-sm ds:m-0 ds:text-[var(--foreground)] ds:[white-space:pre-line]", children: e.reply })
302
+ ] }) : null
303
+ ] }) }) : null
304
+ ]
305
+ }
306
+ );
307
+ return /* @__PURE__ */ t(T, { variant: "default", className: "ds:shadow-[var(--shadow-sm)]", children: [
308
+ /* @__PURE__ */ s(T.Header, { children: /* @__PURE__ */ t("div", { className: "ds:flex ds:items-start ds:justify-between ds:gap-[var(--spacing-sm)]", children: [
309
+ /* @__PURE__ */ s("h4", { className: "type-title-item ds:m-0 ds:text-[var(--foreground)]", children: h }),
310
+ /* @__PURE__ */ s(N, { value: e.overallScore, size: "sm" })
311
+ ] }) }),
312
+ e.comment ? /* @__PURE__ */ s(T.Body, { children: /* @__PURE__ */ s("p", { className: "type-body ds:m-0 ds:text-[var(--foreground)] ds:line-clamp-2", children: e.comment }) }) : null,
313
+ y
314
+ ] });
315
+ }
316
+ function le({ hideFilter: e }) {
317
+ return /* @__PURE__ */ t("div", { className: "ds:flex ds:flex-col ds:gap-[var(--spacing-md)]", children: [
318
+ /* @__PURE__ */ t("div", { className: "ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)]", children: [
319
+ /* @__PURE__ */ s(C, { variant: "text", width: "40%" }),
320
+ /* @__PURE__ */ s(C, { variant: "text", width: "20%" })
321
+ ] }),
322
+ /* @__PURE__ */ t(
323
+ "div",
324
+ {
325
+ className: e ? "ds:flex ds:flex-col ds:gap-[var(--spacing-md)]" : "ds:grid ds:grid-cols-1 ds:gap-[var(--spacing-md)] ds:md:grid-cols-[minmax(0,30%)_minmax(0,1fr)]",
326
+ children: [
327
+ e ? null : /* @__PURE__ */ s("div", { className: "ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]", children: Array.from({ length: 6 }, (l, r) => /* @__PURE__ */ s(C, { variant: "rounded", height: "2.5rem" }, `rp-fs-${r}`)) }),
328
+ /* @__PURE__ */ s("div", { className: "ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]", children: Array.from({ length: 3 }, (l, r) => /* @__PURE__ */ s(C, { variant: "rounded", height: "6rem" }, `rp-rs-${r}`)) })
329
+ ]
330
+ }
331
+ )
332
+ ] });
333
+ }
334
+ const j = K(
335
+ "ds:flex ds:w-full ds:flex-col ds:gap-[var(--spacing-md)] ds:text-[var(--foreground)]"
336
+ ), de = q(
337
+ ({
338
+ reviews: e,
339
+ aggregate: l,
340
+ filter: r,
341
+ onFilterChange: c,
342
+ introSlot: g,
343
+ headerActionSlot: x,
344
+ "aria-label": S,
345
+ id: o,
346
+ className: m,
347
+ hideFilter: p = !1,
348
+ loading: h = !1,
349
+ ...y
350
+ }, n) => {
351
+ const { t: a, i18n: i } = E(), w = i.language ?? "en", [f, R] = _("all"), u = r ?? f, k = L(
352
+ (v) => {
353
+ r === void 0 && R(v), c == null || c(v);
354
+ },
355
+ [r, c]
356
+ ), P = V(
357
+ () => l.histogram ?? te(e),
358
+ [l.histogram, e]
359
+ ), D = V(() => u === "all" ? e : e.filter((v) => $(v.overallScore) === u), [e, u]), H = F(u);
360
+ H.current = u;
361
+ const M = F(D.length);
362
+ M.current = D.length;
363
+ const U = V(
364
+ () => ({
365
+ getFilter: () => H.current,
366
+ setFilter: (v) => k(v),
367
+ getVisibleCount: () => M.current
368
+ }),
369
+ [k]
370
+ ), A = F(null);
371
+ G(n, () => A.current, []), Q(ae, U, o);
372
+ const I = S ?? a("reviewsPanel.regionLabel"), z = String(u);
373
+ if (h)
374
+ return /* @__PURE__ */ s(
375
+ "section",
376
+ {
377
+ ref: A,
378
+ "aria-label": I,
379
+ "aria-busy": "true",
380
+ id: o,
381
+ "data-component": "reviews-panel",
382
+ "data-component-id": o,
383
+ "data-filter": z,
384
+ "data-state": "loading",
385
+ className: j({ className: m }),
386
+ ...y,
387
+ children: /* @__PURE__ */ s(le, { hideFilter: p })
388
+ }
389
+ );
390
+ if (l.count === 0 && e.length === 0)
391
+ return /* @__PURE__ */ s(
392
+ "section",
393
+ {
394
+ ref: A,
395
+ "aria-label": I,
396
+ id: o,
397
+ "data-component": "reviews-panel",
398
+ "data-component-id": o,
399
+ "data-filter": z,
400
+ "data-state": "empty",
401
+ className: j({ className: m }),
402
+ ...y,
403
+ children: /* @__PURE__ */ s(
404
+ Z,
405
+ {
406
+ variant: "no-results",
407
+ title: a("reviewsPanel.empty.title"),
408
+ description: a("reviewsPanel.empty.description")
409
+ }
410
+ )
411
+ }
412
+ );
413
+ const O = !p;
414
+ return /* @__PURE__ */ t(
415
+ "section",
416
+ {
417
+ ref: A,
418
+ "aria-label": I,
419
+ id: o,
420
+ "data-component": "reviews-panel",
421
+ "data-component-id": o,
422
+ "data-filter": z,
423
+ className: j({ className: m }),
424
+ ...y,
425
+ children: [
426
+ /* @__PURE__ */ t("div", { className: "ds:flex ds:flex-wrap ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)]", children: [
427
+ /* @__PURE__ */ s("h2", { className: "type-title-section ds:m-0 ds:text-[var(--foreground)]", children: a("reviewsPanel.title") }),
428
+ /* @__PURE__ */ t("div", { className: "ds:flex ds:items-center ds:gap-[var(--spacing-md)]", children: [
429
+ x,
430
+ /* @__PURE__ */ s(
431
+ N,
432
+ {
433
+ value: l.averageScore,
434
+ reviews: { count: l.count },
435
+ size: "md"
436
+ }
437
+ )
438
+ ] })
439
+ ] }),
440
+ /* @__PURE__ */ t(
441
+ "div",
442
+ {
443
+ className: O ? "ds:grid ds:grid-cols-1 ds:gap-[var(--spacing-md)] ds:md:grid-cols-[minmax(0,30%)_minmax(0,1fr)]" : "ds:flex ds:flex-col ds:gap-[var(--spacing-md)]",
444
+ children: [
445
+ O ? /* @__PURE__ */ s(
446
+ ne,
447
+ {
448
+ filter: u,
449
+ histogram: P,
450
+ totalCount: l.count,
451
+ onChange: k
452
+ }
453
+ ) : null,
454
+ /* @__PURE__ */ t("div", { className: "ds:flex ds:flex-col ds:gap-[var(--spacing-md)] ds:min-w-0", children: [
455
+ g ? (
456
+ // Plain div, not <aside>: axe's
457
+ // `landmark-complementary-is-top-level` rule fires when an
458
+ // `<aside>` lands inside another landmark (this panel's
459
+ // <section role="region">), and the consumer's introSlot
460
+ // already supplies its own semantics (e.g. an Alert with
461
+ // role="status").
462
+ /* @__PURE__ */ s("div", { className: "ds:rounded-[var(--radius-md)] ds:bg-[color-mix(in_srgb,var(--info)_8%,transparent)] ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:pt-[var(--spacing-md)] ds:pb-[var(--spacing-md)]", children: g })
463
+ ) : null,
464
+ D.length === 0 ? (
465
+ // `role="status"` already implies `aria-live="polite"` —
466
+ // declaring both would queue two announcements when the
467
+ // filter changes (the radio's aria-checked flip + this
468
+ // container's text). Keeping `role` only.
469
+ /* @__PURE__ */ t(
470
+ "div",
471
+ {
472
+ role: "status",
473
+ "data-state": "no-match",
474
+ className: "ds:flex ds:flex-col ds:items-center ds:gap-[var(--spacing-sm)] ds:rounded-[var(--radius-md)] ds:border ds:border-dashed ds:border-[var(--border)] ds:p-[var(--spacing-lg)] ds:text-center",
475
+ children: [
476
+ /* @__PURE__ */ s("p", { className: "type-body ds:m-0 ds:text-[var(--muted-foreground)]", children: u === "all" ? a("reviewsPanel.empty.title") : a("reviewsPanel.empty.filterDescription", {
477
+ stars: u
478
+ }) }),
479
+ u !== "all" ? /* @__PURE__ */ s(
480
+ ee,
481
+ {
482
+ intent: "secondary",
483
+ size: "sm",
484
+ onClick: () => k("all"),
485
+ children: a("reviewsPanel.empty.resetFilter")
486
+ }
487
+ ) : null
488
+ ]
489
+ }
490
+ )
491
+ ) : /* @__PURE__ */ s(
492
+ "ol",
493
+ {
494
+ "aria-label": a("reviewsPanel.listLabel"),
495
+ className: "ds:list-none ds:m-0 ds:p-0 ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]",
496
+ children: D.map((v) => /* @__PURE__ */ s("li", { "data-review-id": v.id, children: /* @__PURE__ */ s(ie, { review: v, locale: w }) }, v.id))
497
+ }
498
+ )
499
+ ] })
500
+ ]
501
+ }
502
+ )
503
+ ]
504
+ }
505
+ );
506
+ }
507
+ );
508
+ de.displayName = "ReviewsPanel";
509
+ export {
510
+ de as R,
511
+ ae as r
512
+ };
513
+ //# sourceMappingURL=reviews-panel-CFttsfuC.js.map