@alfadocs/ui-kit-debug 0.47.0 → 0.49.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 (517) hide show
  1. package/dist/_chunks/{address-autocomplete-CSjMrBvu.js → address-autocomplete-CT-9AOli.js} +2 -2
  2. package/dist/_chunks/{address-autocomplete-CSjMrBvu.js.map → address-autocomplete-CT-9AOli.js.map} +1 -1
  3. package/dist/_chunks/{agenda-card-CFyWSX7Z.js → agenda-card-BaSfVfrL.js} +25 -29
  4. package/dist/_chunks/agenda-card-BaSfVfrL.js.map +1 -0
  5. package/dist/_chunks/{agenda-tray-Dyj9ChHC.js → agenda-tray-DQayYmQ0.js} +50 -67
  6. package/dist/_chunks/agenda-tray-DQayYmQ0.js.map +1 -0
  7. package/dist/_chunks/ai-consent-banner-F2md5JD3.js +169 -0
  8. package/dist/_chunks/ai-consent-banner-F2md5JD3.js.map +1 -0
  9. package/dist/_chunks/ai-tools-rail-CYLWrRmm.js +280 -0
  10. package/dist/_chunks/ai-tools-rail-CYLWrRmm.js.map +1 -0
  11. package/dist/_chunks/{alert-ywPR59NE.js → alert-CUTxnym2.js} +56 -35
  12. package/dist/_chunks/alert-CUTxnym2.js.map +1 -0
  13. package/dist/_chunks/{alia-sidebar-CVIPrdc9.js → alia-sidebar-DlvyXgVC.js} +3 -2
  14. package/dist/_chunks/alia-sidebar-DlvyXgVC.js.map +1 -0
  15. package/dist/_chunks/anamnesis-card-CmkBVAln.js +156 -0
  16. package/dist/_chunks/anamnesis-card-CmkBVAln.js.map +1 -0
  17. package/dist/_chunks/antenatal-schedule-timeline-Dg0m0yFl.js +412 -0
  18. package/dist/_chunks/antenatal-schedule-timeline-Dg0m0yFl.js.map +1 -0
  19. package/dist/_chunks/appointment-tray-BwDHhWWC.js +419 -0
  20. package/dist/_chunks/appointment-tray-BwDHhWWC.js.map +1 -0
  21. package/dist/_chunks/{ar-DEz65ZJW.js → ar-C68WKG5a.js} +2 -2
  22. package/dist/_chunks/{ar-DEz65ZJW.js.map → ar-C68WKG5a.js.map} +1 -1
  23. package/dist/_chunks/{audio-recorder-DC-v9YFW.js → audio-recorder-DVJXV7_k.js} +2 -2
  24. package/dist/_chunks/{audio-recorder-DC-v9YFW.js.map → audio-recorder-DVJXV7_k.js.map} +1 -1
  25. package/dist/_chunks/bishop-score-2MzAz8NE.js +185 -0
  26. package/dist/_chunks/bishop-score-2MzAz8NE.js.map +1 -0
  27. package/dist/_chunks/{bmi-calculator-CQqXTVNL.js → bmi-calculator-DdylQzT6.js} +2 -2
  28. package/dist/_chunks/{bmi-calculator-CQqXTVNL.js.map → bmi-calculator-DdylQzT6.js.map} +1 -1
  29. package/dist/_chunks/{booking-DlDVuWMd.js → booking-DljH0JkS.js} +294 -306
  30. package/dist/_chunks/booking-DljH0JkS.js.map +1 -0
  31. package/dist/_chunks/{calculator-dialog-D-nfvteH.js → calculator-dialog-CFk4I91b.js} +2 -2
  32. package/dist/_chunks/{calculator-dialog-D-nfvteH.js.map → calculator-dialog-CFk4I91b.js.map} +1 -1
  33. package/dist/_chunks/calendar-days-C4BmpCZg.js +23 -0
  34. package/dist/_chunks/calendar-days-C4BmpCZg.js.map +1 -0
  35. package/dist/_chunks/{calendar-YHFknAGv.js → calendar-oYWOCrnf.js} +195 -210
  36. package/dist/_chunks/calendar-oYWOCrnf.js.map +1 -0
  37. package/dist/_chunks/care-plan-card-QmNpGggC.js +252 -0
  38. package/dist/_chunks/care-plan-card-QmNpGggC.js.map +1 -0
  39. package/dist/_chunks/care-plan-entry-card-Cnra7vUc.js +318 -0
  40. package/dist/_chunks/care-plan-entry-card-Cnra7vUc.js.map +1 -0
  41. package/dist/_chunks/{chat-message-B5JpFj0F.js → chat-message-Dm8U2RY1.js} +36 -35
  42. package/dist/_chunks/chat-message-Dm8U2RY1.js.map +1 -0
  43. package/dist/_chunks/circle-arrow-up-CC_85SuH.js +16 -0
  44. package/dist/_chunks/circle-arrow-up-CC_85SuH.js.map +1 -0
  45. package/dist/_chunks/clinical-note-card-BYo437dU.js +333 -0
  46. package/dist/_chunks/clinical-note-card-BYo437dU.js.map +1 -0
  47. package/dist/_chunks/{contact-profile-card-DHyuAPXM.js → contact-profile-card-DvvVfAA2.js} +102 -115
  48. package/dist/_chunks/contact-profile-card-DvvVfAA2.js.map +1 -0
  49. package/dist/_chunks/cycle-calculator-oOkj5wlB.js +252 -0
  50. package/dist/_chunks/cycle-calculator-oOkj5wlB.js.map +1 -0
  51. package/dist/_chunks/{date-picker-Bq7xhMA-.js → date-picker-BfHblqwA.js} +2 -2
  52. package/dist/_chunks/{date-picker-Bq7xhMA-.js.map → date-picker-BfHblqwA.js.map} +1 -1
  53. package/dist/_chunks/{date-picker-variants-DLi1Va_e.js → date-picker-variants-CXEAx3O_.js} +22 -22
  54. package/dist/_chunks/{date-picker-variants-DLi1Va_e.js.map → date-picker-variants-CXEAx3O_.js.map} +1 -1
  55. package/dist/_chunks/{date-range-picker-DcXuI9y7.js → date-range-picker-hcAMs1wO.js} +3 -3
  56. package/dist/_chunks/{date-range-picker-DcXuI9y7.js.map → date-range-picker-hcAMs1wO.js.map} +1 -1
  57. package/dist/_chunks/{date-time-picker-RimumeLR.js → date-time-picker-H-3Pwqlb.js} +9 -9
  58. package/dist/_chunks/{date-time-picker-RimumeLR.js.map → date-time-picker-H-3Pwqlb.js.map} +1 -1
  59. package/dist/_chunks/{de-bTBGdjPS.js → de-DK4A9_a8.js} +2 -2
  60. package/dist/_chunks/{de-bTBGdjPS.js.map → de-DK4A9_a8.js.map} +1 -1
  61. package/dist/_chunks/{dialog-BTpZV6It.js → dialog-DMGnSelc.js} +55 -55
  62. package/dist/_chunks/dialog-DMGnSelc.js.map +1 -0
  63. package/dist/_chunks/{document-scanner-BqLsGs4Y.js → document-scanner-Cxqvq7GR.js} +2 -2
  64. package/dist/_chunks/{document-scanner-BqLsGs4Y.js.map → document-scanner-Cxqvq7GR.js.map} +1 -1
  65. package/dist/_chunks/due-date-calculator-tDqZXPWO.js +256 -0
  66. package/dist/_chunks/due-date-calculator-tDqZXPWO.js.map +1 -0
  67. package/dist/_chunks/{editable-currency-cell-renderer-CLil9B29.js → editable-currency-cell-renderer-Bh48OHRv.js} +2 -2
  68. package/dist/_chunks/{editable-currency-cell-renderer-CLil9B29.js.map → editable-currency-cell-renderer-Bh48OHRv.js.map} +1 -1
  69. package/dist/_chunks/{el-BWG5RXxa.js → el-B29HXhG5.js} +2 -2
  70. package/dist/_chunks/{el-BWG5RXxa.js.map → el-B29HXhG5.js.map} +1 -1
  71. package/dist/_chunks/entity-card-COhmqHly.js +69 -0
  72. package/dist/_chunks/entity-card-COhmqHly.js.map +1 -0
  73. package/dist/_chunks/{es-DfO_G435.js → es-BOwPVwWn.js} +2 -2
  74. package/dist/_chunks/{es-DfO_G435.js.map → es-BOwPVwWn.js.map} +1 -1
  75. package/dist/_chunks/fetal-weight-Da-B4P4k.js +122 -0
  76. package/dist/_chunks/fetal-weight-Da-B4P4k.js.map +1 -0
  77. package/dist/_chunks/{fr-BTn24bs8.js → fr-DoDBtn0T.js} +2 -2
  78. package/dist/_chunks/{fr-BTn24bs8.js.map → fr-DoDBtn0T.js.map} +1 -1
  79. package/dist/_chunks/{freemium-paywall-DzpD63WY.js → freemium-paywall-BWaLWje-.js} +2 -2
  80. package/dist/_chunks/{freemium-paywall-DzpD63WY.js.map → freemium-paywall-BWaLWje-.js.map} +1 -1
  81. package/dist/_chunks/gestational-age-calculator-DbDfTJU2.js +311 -0
  82. package/dist/_chunks/gestational-age-calculator-DbDfTJU2.js.map +1 -0
  83. package/dist/_chunks/hcg-doubling-DAnpbale.js +170 -0
  84. package/dist/_chunks/hcg-doubling-DAnpbale.js.map +1 -0
  85. package/dist/_chunks/{hi-Dj3oYd84.js → hi-DGByrKby.js} +2 -2
  86. package/dist/_chunks/{hi-Dj3oYd84.js.map → hi-DGByrKby.js.map} +1 -1
  87. package/dist/_chunks/{insert-result-C5ABnzDl.js → insert-result-DNdi_JYW.js} +140 -168
  88. package/dist/_chunks/insert-result-DNdi_JYW.js.map +1 -0
  89. package/dist/_chunks/is-safe-url-DkETxeHz.js +7 -0
  90. package/dist/_chunks/is-safe-url-DkETxeHz.js.map +1 -0
  91. package/dist/_chunks/{isSameWeek-HfxKk6Lz.js → isSameWeek-B1odL2vR.js} +2 -2
  92. package/dist/_chunks/{isSameWeek-HfxKk6Lz.js.map → isSameWeek-B1odL2vR.js.map} +1 -1
  93. package/dist/_chunks/{it-Y85ofIQQ.js → it-B16rEecm.js} +3 -3
  94. package/dist/_chunks/{it-Y85ofIQQ.js.map → it-B16rEecm.js.map} +1 -1
  95. package/dist/_chunks/{ja-CQ7J6YoA.js → ja-B0viOgft.js} +2 -2
  96. package/dist/_chunks/{ja-CQ7J6YoA.js.map → ja-B0viOgft.js.map} +1 -1
  97. package/dist/_chunks/languages-DsVf_WzT.js +19 -0
  98. package/dist/_chunks/languages-DsVf_WzT.js.map +1 -0
  99. package/dist/_chunks/layers-pzGcbLPj.js +34 -0
  100. package/dist/_chunks/layers-pzGcbLPj.js.map +1 -0
  101. package/dist/_chunks/{marketplace-app-shell-Gfsf78ge.js → marketplace-app-shell-UKSLx9K_.js} +3 -3
  102. package/dist/_chunks/{marketplace-app-shell-Gfsf78ge.js.map → marketplace-app-shell-UKSLx9K_.js.map} +1 -1
  103. package/dist/_chunks/{message-card-DSPw5ghw.js → message-card-Dvl1TgaN.js} +15 -19
  104. package/dist/_chunks/message-card-Dvl1TgaN.js.map +1 -0
  105. package/dist/_chunks/{message-tray-hSQff9u4.js → message-tray-Dl6GQaaV.js} +2 -2
  106. package/dist/_chunks/{message-tray-hSQff9u4.js.map → message-tray-Dl6GQaaV.js.map} +1 -1
  107. package/dist/_chunks/{nl-D9kHCmp3.js → nl-cBxEX2QU.js} +2 -2
  108. package/dist/_chunks/{nl-D9kHCmp3.js.map → nl-cBxEX2QU.js.map} +1 -1
  109. package/dist/_chunks/operator-hero-CM8949Hd.js +198 -0
  110. package/dist/_chunks/operator-hero-CM8949Hd.js.map +1 -0
  111. package/dist/_chunks/{patient-search-CocVcGJ3.js → patient-search-BJOmTmDA.js} +2 -2
  112. package/dist/_chunks/{patient-search-CocVcGJ3.js.map → patient-search-BJOmTmDA.js.map} +1 -1
  113. package/dist/_chunks/{patient-shell-CnT4L8gn.js → patient-shell-DUmhXnFq.js} +2 -2
  114. package/dist/_chunks/{patient-shell-CnT4L8gn.js.map → patient-shell-DUmhXnFq.js.map} +1 -1
  115. package/dist/_chunks/patient-summary-card-BnTqxcTr.js +443 -0
  116. package/dist/_chunks/patient-summary-card-BnTqxcTr.js.map +1 -0
  117. package/dist/_chunks/{payment-form-BNTx4876.js → payment-form-xmeCkxas.js} +2 -2
  118. package/dist/_chunks/{payment-form-BNTx4876.js.map → payment-form-xmeCkxas.js.map} +1 -1
  119. package/dist/_chunks/payment-request-card-B_lyobd0.js +478 -0
  120. package/dist/_chunks/payment-request-card-B_lyobd0.js.map +1 -0
  121. package/dist/_chunks/{pdf-viewer-CWEXTlwq.js → pdf-viewer-q1D3Uion.js} +4 -4
  122. package/dist/_chunks/pdf-viewer-q1D3Uion.js.map +1 -0
  123. package/dist/_chunks/periodontal-chart-card-BYs9hax1.js +455 -0
  124. package/dist/_chunks/periodontal-chart-card-BYs9hax1.js.map +1 -0
  125. package/dist/_chunks/phone-Bi5yUm4I.js +20 -0
  126. package/dist/_chunks/phone-Bi5yUm4I.js.map +1 -0
  127. package/dist/_chunks/{pl-B3Smqpkr.js → pl-DtS08ioY.js} +3 -3
  128. package/dist/_chunks/{pl-B3Smqpkr.js.map → pl-DtS08ioY.js.map} +1 -1
  129. package/dist/_chunks/{practice-results-DDi-kvaD.js → practice-results-Cq1y8JFD.js} +4 -3
  130. package/dist/_chunks/{practice-results-DDi-kvaD.js.map → practice-results-Cq1y8JFD.js.map} +1 -1
  131. package/dist/_chunks/pregnancy-weight-gain-CCGrvarh.js +322 -0
  132. package/dist/_chunks/pregnancy-weight-gain-CCGrvarh.js.map +1 -0
  133. package/dist/_chunks/product-hub-panel-CkfZBA3t.js +620 -0
  134. package/dist/_chunks/product-hub-panel-CkfZBA3t.js.map +1 -0
  135. package/dist/_chunks/{pt-D3J-1c_7.js → pt-yFXs1VvH.js} +2 -2
  136. package/dist/_chunks/{pt-D3J-1c_7.js.map → pt-yFXs1VvH.js.map} +1 -1
  137. package/dist/_chunks/{ro-BKAbbEA3.js → ro-DsCzSrzR.js} +2 -2
  138. package/dist/_chunks/{ro-BKAbbEA3.js.map → ro-DsCzSrzR.js.map} +1 -1
  139. package/dist/_chunks/{ru-BeG8f0Ep.js → ru-DgDxL0pc.js} +3 -3
  140. package/dist/_chunks/{ru-BeG8f0Ep.js.map → ru-DgDxL0pc.js.map} +1 -1
  141. package/dist/_chunks/scan-line-lGioFwLC.js +18 -0
  142. package/dist/_chunks/scan-line-lGioFwLC.js.map +1 -0
  143. package/dist/_chunks/shield-check-BjCGH_Sr.js +21 -0
  144. package/dist/_chunks/shield-check-BjCGH_Sr.js.map +1 -0
  145. package/dist/_chunks/{sidebar-_vJXI9rB.js → sidebar-h78cTNLh.js} +440 -338
  146. package/dist/_chunks/sidebar-h78cTNLh.js.map +1 -0
  147. package/dist/_chunks/{sign-document-BCyLpFHJ.js → sign-document-CZkAf28g.js} +2 -2
  148. package/dist/_chunks/{sign-document-BCyLpFHJ.js.map → sign-document-CZkAf28g.js.map} +1 -1
  149. package/dist/_chunks/{sq-_hRPaeUy.js → sq-DHlCYN67.js} +2 -2
  150. package/dist/_chunks/{sq-_hRPaeUy.js.map → sq-DHlCYN67.js.map} +1 -1
  151. package/dist/_chunks/subDays-Bs00akhK.js +8 -0
  152. package/dist/_chunks/{subDays-Dv7q9S7u.js.map → subDays-Bs00akhK.js.map} +1 -1
  153. package/dist/_chunks/{sv-g009fSpe.js → sv-O0QaQs_s.js} +2 -2
  154. package/dist/_chunks/{sv-g009fSpe.js.map → sv-O0QaQs_s.js.map} +1 -1
  155. package/dist/_chunks/{tr-OKUOuhMW.js → tr-BmNDRuio.js} +2 -2
  156. package/dist/_chunks/{tr-OKUOuhMW.js.map → tr-BmNDRuio.js.map} +1 -1
  157. package/dist/_chunks/{transaction-chip-B8ujzowA.js → transaction-chip-BZCa6XDn.js} +8 -6
  158. package/dist/_chunks/{transaction-chip-B8ujzowA.js.map → transaction-chip-BZCa6XDn.js.map} +1 -1
  159. package/dist/_chunks/{unit-converter-u3CwNDpP.js → unit-converter-jWp3Z85y.js} +2 -2
  160. package/dist/_chunks/{unit-converter-u3CwNDpP.js.map → unit-converter-jWp3Z85y.js.map} +1 -1
  161. package/dist/_chunks/user-cog-BS_qc8nA.js +24 -0
  162. package/dist/_chunks/user-cog-BS_qc8nA.js.map +1 -0
  163. package/dist/_chunks/video-BAeICxCT.js +21 -0
  164. package/dist/_chunks/video-BAeICxCT.js.map +1 -0
  165. package/dist/_chunks/warning-stack-CXfoAT-_.js +220 -0
  166. package/dist/_chunks/warning-stack-CXfoAT-_.js.map +1 -0
  167. package/dist/_chunks/{workflow-map-Djn1QMJc.js → workflow-map-DzX_LI4y.js} +139 -157
  168. package/dist/_chunks/workflow-map-DzX_LI4y.js.map +1 -0
  169. package/dist/_chunks/{zh-CN-De4zwEhx.js → zh-CN-CgVJZEzz.js} +3 -3
  170. package/dist/_chunks/{zh-CN-De4zwEhx.js.map → zh-CN-CgVJZEzz.js.map} +1 -1
  171. package/dist/agent-catalog.json +367 -1
  172. package/dist/components/_shared/antenatal-schedule-timeline.d.ts +18 -0
  173. package/dist/components/_shared/antenatal-schedule-timeline.d.ts.map +1 -0
  174. package/dist/components/_shared/antenatal-schedule.d.ts +68 -0
  175. package/dist/components/_shared/antenatal-schedule.d.ts.map +1 -0
  176. package/dist/components/_shared/entity-card/entity-card.d.ts +40 -0
  177. package/dist/components/_shared/entity-card/entity-card.d.ts.map +1 -0
  178. package/dist/components/_shared/entity-card/index.d.ts +3 -0
  179. package/dist/components/_shared/entity-card/index.d.ts.map +1 -0
  180. package/dist/components/_shared/index.d.ts +5 -0
  181. package/dist/components/_shared/index.d.ts.map +1 -1
  182. package/dist/components/_shared/is-safe-url.d.ts +13 -0
  183. package/dist/components/_shared/is-safe-url.d.ts.map +1 -0
  184. package/dist/components/_shared/obstetrics.d.ts +138 -0
  185. package/dist/components/_shared/obstetrics.d.ts.map +1 -0
  186. package/dist/components/address-autocomplete/index.js +1 -1
  187. package/dist/components/agenda-card/agenda-card.d.ts +1 -2
  188. package/dist/components/agenda-card/agenda-card.d.ts.map +1 -1
  189. package/dist/components/agenda-card/index.d.ts +2 -1
  190. package/dist/components/agenda-card/index.d.ts.map +1 -1
  191. package/dist/components/agenda-card/index.js +6 -5
  192. package/dist/components/agenda-card/index.js.map +1 -1
  193. package/dist/components/agenda-tray/index.js +1 -1
  194. package/dist/components/ai-consent-banner/ai-consent-banner.agent.d.ts +4 -0
  195. package/dist/components/ai-consent-banner/ai-consent-banner.agent.d.ts.map +1 -0
  196. package/dist/components/ai-consent-banner/ai-consent-banner.d.ts +45 -0
  197. package/dist/components/ai-consent-banner/ai-consent-banner.d.ts.map +1 -0
  198. package/dist/components/ai-consent-banner/index.d.ts +4 -0
  199. package/dist/components/ai-consent-banner/index.d.ts.map +1 -0
  200. package/dist/components/ai-consent-banner/index.js +6 -0
  201. package/dist/components/ai-consent-banner/index.js.map +1 -0
  202. package/dist/components/ai-tools-rail/ai-tools-rail.agent.d.ts +4 -0
  203. package/dist/components/ai-tools-rail/ai-tools-rail.agent.d.ts.map +1 -0
  204. package/dist/components/ai-tools-rail/ai-tools-rail.d.ts +60 -0
  205. package/dist/components/ai-tools-rail/ai-tools-rail.d.ts.map +1 -0
  206. package/dist/components/ai-tools-rail/index.d.ts +4 -0
  207. package/dist/components/ai-tools-rail/index.d.ts.map +1 -0
  208. package/dist/components/ai-tools-rail/index.js +6 -0
  209. package/dist/components/ai-tools-rail/index.js.map +1 -0
  210. package/dist/components/alert/alert.d.ts +2 -2
  211. package/dist/components/alert/alert.d.ts.map +1 -1
  212. package/dist/components/alert/index.js +1 -1
  213. package/dist/components/anamnesis-card/anamnesis-card.d.ts +68 -0
  214. package/dist/components/anamnesis-card/anamnesis-card.d.ts.map +1 -0
  215. package/dist/components/anamnesis-card/index.d.ts +3 -0
  216. package/dist/components/anamnesis-card/index.d.ts.map +1 -0
  217. package/dist/components/anamnesis-card/index.js +5 -0
  218. package/dist/components/anamnesis-card/index.js.map +1 -0
  219. package/dist/components/appointment-card/appointment-card.agent.d.ts +3 -0
  220. package/dist/components/appointment-card/appointment-card.agent.d.ts.map +1 -0
  221. package/dist/components/appointment-card/appointment-card.d.ts +93 -0
  222. package/dist/components/appointment-card/appointment-card.d.ts.map +1 -0
  223. package/dist/components/appointment-card/appointment-tray.agent.d.ts +4 -0
  224. package/dist/components/appointment-card/appointment-tray.agent.d.ts.map +1 -0
  225. package/dist/components/appointment-card/appointment-tray.d.ts +48 -0
  226. package/dist/components/appointment-card/appointment-tray.d.ts.map +1 -0
  227. package/dist/components/appointment-card/index.d.ts +8 -0
  228. package/dist/components/appointment-card/index.d.ts.map +1 -0
  229. package/dist/components/appointment-card/index.js +10 -0
  230. package/dist/components/appointment-card/index.js.map +1 -0
  231. package/dist/components/audio-recorder/index.js +1 -1
  232. package/dist/components/badge/badge.d.ts +1 -1
  233. package/dist/components/bishop-score/bishop-score.d.ts +27 -0
  234. package/dist/components/bishop-score/bishop-score.d.ts.map +1 -0
  235. package/dist/components/bishop-score/bishop.d.ts +30 -0
  236. package/dist/components/bishop-score/bishop.d.ts.map +1 -0
  237. package/dist/components/bishop-score/index.d.ts +4 -0
  238. package/dist/components/bishop-score/index.d.ts.map +1 -0
  239. package/dist/components/bishop-score/index.js +10 -0
  240. package/dist/components/bishop-score/index.js.map +1 -0
  241. package/dist/components/bmi-calculator/index.js +1 -1
  242. package/dist/components/booking/index.js +1 -1
  243. package/dist/components/calculator-dialog/index.js +1 -1
  244. package/dist/components/calendar/index.js +1 -1
  245. package/dist/components/card/card.d.ts +1 -1
  246. package/dist/components/care-plan-card/care-plan-card.agent.d.ts +4 -0
  247. package/dist/components/care-plan-card/care-plan-card.agent.d.ts.map +1 -0
  248. package/dist/components/care-plan-card/care-plan-card.d.ts +102 -0
  249. package/dist/components/care-plan-card/care-plan-card.d.ts.map +1 -0
  250. package/dist/components/care-plan-card/index.d.ts +4 -0
  251. package/dist/components/care-plan-card/index.d.ts.map +1 -0
  252. package/dist/components/care-plan-card/index.js +6 -0
  253. package/dist/components/care-plan-card/index.js.map +1 -0
  254. package/dist/components/care-plan-entry-card/care-plan-entry-card.agent.d.ts +4 -0
  255. package/dist/components/care-plan-entry-card/care-plan-entry-card.agent.d.ts.map +1 -0
  256. package/dist/components/care-plan-entry-card/care-plan-entry-card.d.ts +110 -0
  257. package/dist/components/care-plan-entry-card/care-plan-entry-card.d.ts.map +1 -0
  258. package/dist/components/care-plan-entry-card/index.d.ts +4 -0
  259. package/dist/components/care-plan-entry-card/index.d.ts.map +1 -0
  260. package/dist/components/care-plan-entry-card/index.js +6 -0
  261. package/dist/components/care-plan-entry-card/index.js.map +1 -0
  262. package/dist/components/chat-message/chat-message.d.ts +7 -0
  263. package/dist/components/chat-message/chat-message.d.ts.map +1 -1
  264. package/dist/components/chat-message/index.js +1 -1
  265. package/dist/components/clinical-note-card/clinical-note-card.agent.d.ts +4 -0
  266. package/dist/components/clinical-note-card/clinical-note-card.agent.d.ts.map +1 -0
  267. package/dist/components/clinical-note-card/clinical-note-card.d.ts +98 -0
  268. package/dist/components/clinical-note-card/clinical-note-card.d.ts.map +1 -0
  269. package/dist/components/clinical-note-card/index.d.ts +4 -0
  270. package/dist/components/clinical-note-card/index.d.ts.map +1 -0
  271. package/dist/components/clinical-note-card/index.js +6 -0
  272. package/dist/components/clinical-note-card/index.js.map +1 -0
  273. package/dist/components/contact-profile-card/index.js +1 -1
  274. package/dist/components/cycle-calculator/cycle-calculator.d.ts.map +1 -1
  275. package/dist/components/cycle-calculator/cycle.d.ts +5 -0
  276. package/dist/components/cycle-calculator/cycle.d.ts.map +1 -1
  277. package/dist/components/cycle-calculator/index.js +1 -1
  278. package/dist/components/data-table/index.js +1 -1
  279. package/dist/components/date-picker/index.js +1 -1
  280. package/dist/components/date-range-picker/index.js +1 -1
  281. package/dist/components/date-time-picker/index.js +1 -1
  282. package/dist/components/dialog/dialog.d.ts +7 -0
  283. package/dist/components/dialog/dialog.d.ts.map +1 -1
  284. package/dist/components/dialog/index.js +1 -1
  285. package/dist/components/document-scanner/index.js +1 -1
  286. package/dist/components/due-date-calculator/due-date-calculator.d.ts +13 -1
  287. package/dist/components/due-date-calculator/due-date-calculator.d.ts.map +1 -1
  288. package/dist/components/due-date-calculator/gestation.d.ts +1 -59
  289. package/dist/components/due-date-calculator/gestation.d.ts.map +1 -1
  290. package/dist/components/due-date-calculator/index.d.ts +1 -1
  291. package/dist/components/due-date-calculator/index.d.ts.map +1 -1
  292. package/dist/components/due-date-calculator/index.js +16 -10
  293. package/dist/components/fetal-weight/efw.d.ts +25 -0
  294. package/dist/components/fetal-weight/efw.d.ts.map +1 -0
  295. package/dist/components/fetal-weight/fetal-weight.d.ts +27 -0
  296. package/dist/components/fetal-weight/fetal-weight.d.ts.map +1 -0
  297. package/dist/components/fetal-weight/index.d.ts +4 -0
  298. package/dist/components/fetal-weight/index.d.ts.map +1 -0
  299. package/dist/components/fetal-weight/index.js +6 -0
  300. package/dist/components/fetal-weight/index.js.map +1 -0
  301. package/dist/components/freemium-paywall/index.js +1 -1
  302. package/dist/components/gestational-age-calculator/gestational-age-calculator.d.ts +25 -1
  303. package/dist/components/gestational-age-calculator/gestational-age-calculator.d.ts.map +1 -1
  304. package/dist/components/gestational-age-calculator/index.js +1 -1
  305. package/dist/components/hcg-doubling/hcg-doubling.d.ts +31 -0
  306. package/dist/components/hcg-doubling/hcg-doubling.d.ts.map +1 -0
  307. package/dist/components/hcg-doubling/hcg.d.ts +33 -0
  308. package/dist/components/hcg-doubling/hcg.d.ts.map +1 -0
  309. package/dist/components/hcg-doubling/index.d.ts +4 -0
  310. package/dist/components/hcg-doubling/index.d.ts.map +1 -0
  311. package/dist/components/hcg-doubling/index.js +7 -0
  312. package/dist/components/hcg-doubling/index.js.map +1 -0
  313. package/dist/components/index.d.ts +14 -0
  314. package/dist/components/index.d.ts.map +1 -1
  315. package/dist/components/message-card/index.js +5 -4
  316. package/dist/components/message-card/index.js.map +1 -1
  317. package/dist/components/message-card/message-card.d.ts +1 -2
  318. package/dist/components/message-card/message-card.d.ts.map +1 -1
  319. package/dist/components/message-tray/index.js +1 -1
  320. package/dist/components/operator-hero/index.js +1 -1
  321. package/dist/components/operator-hero/operator-hero.agent.d.ts.map +1 -1
  322. package/dist/components/operator-hero/operator-hero.d.ts +9 -0
  323. package/dist/components/operator-hero/operator-hero.d.ts.map +1 -1
  324. package/dist/components/patient-search/index.js +1 -1
  325. package/dist/components/patient-summary-card/index.d.ts +4 -0
  326. package/dist/components/patient-summary-card/index.d.ts.map +1 -0
  327. package/dist/components/patient-summary-card/index.js +6 -0
  328. package/dist/components/patient-summary-card/index.js.map +1 -0
  329. package/dist/components/patient-summary-card/patient-summary-card.agent.d.ts +4 -0
  330. package/dist/components/patient-summary-card/patient-summary-card.agent.d.ts.map +1 -0
  331. package/dist/components/patient-summary-card/patient-summary-card.d.ts +120 -0
  332. package/dist/components/patient-summary-card/patient-summary-card.d.ts.map +1 -0
  333. package/dist/components/payment-card/index.d.ts +7 -0
  334. package/dist/components/payment-card/index.d.ts.map +1 -0
  335. package/dist/components/payment-card/index.js +8 -0
  336. package/dist/components/payment-card/index.js.map +1 -0
  337. package/dist/components/payment-card/payment-card.agent.d.ts +4 -0
  338. package/dist/components/payment-card/payment-card.agent.d.ts.map +1 -0
  339. package/dist/components/payment-card/payment-card.d.ts +71 -0
  340. package/dist/components/payment-card/payment-card.d.ts.map +1 -0
  341. package/dist/components/payment-card/payment-request-card.agent.d.ts +4 -0
  342. package/dist/components/payment-card/payment-request-card.agent.d.ts.map +1 -0
  343. package/dist/components/payment-card/payment-request-card.d.ts +43 -0
  344. package/dist/components/payment-card/payment-request-card.d.ts.map +1 -0
  345. package/dist/components/payment-form/index.js +1 -1
  346. package/dist/components/pdf-viewer/index.js +1 -1
  347. package/dist/components/pdf-viewer/pdf-viewer.d.ts.map +1 -1
  348. package/dist/components/periodontal-chart-card/index.d.ts +4 -0
  349. package/dist/components/periodontal-chart-card/index.d.ts.map +1 -0
  350. package/dist/components/periodontal-chart-card/index.js +7 -0
  351. package/dist/components/periodontal-chart-card/index.js.map +1 -0
  352. package/dist/components/periodontal-chart-card/periodontal-chart-card.agent.d.ts +4 -0
  353. package/dist/components/periodontal-chart-card/periodontal-chart-card.agent.d.ts.map +1 -0
  354. package/dist/components/periodontal-chart-card/periodontal-chart-card.d.ts +74 -0
  355. package/dist/components/periodontal-chart-card/periodontal-chart-card.d.ts.map +1 -0
  356. package/dist/components/practice-results/index.js +1 -1
  357. package/dist/components/pregnancy-weight-gain/index.js +1 -1
  358. package/dist/components/pregnancy-weight-gain/pregnancy-weight-gain.d.ts +7 -0
  359. package/dist/components/pregnancy-weight-gain/pregnancy-weight-gain.d.ts.map +1 -1
  360. package/dist/components/pregnancy-weight-gain/weight-gain.d.ts +33 -8
  361. package/dist/components/pregnancy-weight-gain/weight-gain.d.ts.map +1 -1
  362. package/dist/components/product-hub-tray/index.d.ts +8 -0
  363. package/dist/components/product-hub-tray/index.d.ts.map +1 -0
  364. package/dist/components/product-hub-tray/index.js +10 -0
  365. package/dist/components/product-hub-tray/index.js.map +1 -0
  366. package/dist/components/product-hub-tray/product-hub-panel.agent.d.ts +4 -0
  367. package/dist/components/product-hub-tray/product-hub-panel.agent.d.ts.map +1 -0
  368. package/dist/components/product-hub-tray/product-hub-panel.d.ts +54 -0
  369. package/dist/components/product-hub-tray/product-hub-panel.d.ts.map +1 -0
  370. package/dist/components/product-hub-tray/product-hub-tray.agent.d.ts +4 -0
  371. package/dist/components/product-hub-tray/product-hub-tray.agent.d.ts.map +1 -0
  372. package/dist/components/product-hub-tray/product-hub-tray.d.ts +115 -0
  373. package/dist/components/product-hub-tray/product-hub-tray.d.ts.map +1 -0
  374. package/dist/components/public-header/public-header.d.ts +1 -1
  375. package/dist/components/sidebar/index.d.ts +2 -2
  376. package/dist/components/sidebar/index.d.ts.map +1 -1
  377. package/dist/components/sidebar/index.js +12 -11
  378. package/dist/components/sidebar/sidebar.d.ts +14 -1
  379. package/dist/components/sidebar/sidebar.d.ts.map +1 -1
  380. package/dist/components/sign-document/index.js +1 -1
  381. package/dist/components/stat/stat.d.ts +1 -1
  382. package/dist/components/transaction-chip/index.js +1 -1
  383. package/dist/components/unit-converter/index.js +1 -1
  384. package/dist/components/warning-stack/index.js +1 -1
  385. package/dist/components/warning-stack/warning-stack.d.ts.map +1 -1
  386. package/dist/components/workflow/index.js +1 -1
  387. package/dist/i18n/locales/ar.d.ts +561 -1
  388. package/dist/i18n/locales/ar.d.ts.map +1 -1
  389. package/dist/i18n/locales/ar.js +560 -2
  390. package/dist/i18n/locales/ar.js.map +1 -1
  391. package/dist/i18n/locales/de.d.ts +561 -1
  392. package/dist/i18n/locales/de.d.ts.map +1 -1
  393. package/dist/i18n/locales/de.js +560 -2
  394. package/dist/i18n/locales/de.js.map +1 -1
  395. package/dist/i18n/locales/el.d.ts +561 -1
  396. package/dist/i18n/locales/el.d.ts.map +1 -1
  397. package/dist/i18n/locales/el.js +560 -2
  398. package/dist/i18n/locales/el.js.map +1 -1
  399. package/dist/i18n/locales/en.d.ts +561 -1
  400. package/dist/i18n/locales/en.d.ts.map +1 -1
  401. package/dist/i18n/locales/en.js +560 -2
  402. package/dist/i18n/locales/en.js.map +1 -1
  403. package/dist/i18n/locales/es.d.ts +561 -1
  404. package/dist/i18n/locales/es.d.ts.map +1 -1
  405. package/dist/i18n/locales/es.js +560 -2
  406. package/dist/i18n/locales/es.js.map +1 -1
  407. package/dist/i18n/locales/fr.d.ts +561 -1
  408. package/dist/i18n/locales/fr.d.ts.map +1 -1
  409. package/dist/i18n/locales/fr.js +560 -2
  410. package/dist/i18n/locales/fr.js.map +1 -1
  411. package/dist/i18n/locales/hi.d.ts +561 -1
  412. package/dist/i18n/locales/hi.d.ts.map +1 -1
  413. package/dist/i18n/locales/hi.js +560 -2
  414. package/dist/i18n/locales/hi.js.map +1 -1
  415. package/dist/i18n/locales/it.d.ts +561 -1
  416. package/dist/i18n/locales/it.d.ts.map +1 -1
  417. package/dist/i18n/locales/it.js +560 -2
  418. package/dist/i18n/locales/it.js.map +1 -1
  419. package/dist/i18n/locales/ja.d.ts +561 -1
  420. package/dist/i18n/locales/ja.d.ts.map +1 -1
  421. package/dist/i18n/locales/ja.js +560 -2
  422. package/dist/i18n/locales/ja.js.map +1 -1
  423. package/dist/i18n/locales/nl.d.ts +561 -1
  424. package/dist/i18n/locales/nl.d.ts.map +1 -1
  425. package/dist/i18n/locales/nl.js +560 -2
  426. package/dist/i18n/locales/nl.js.map +1 -1
  427. package/dist/i18n/locales/pl.d.ts +561 -1
  428. package/dist/i18n/locales/pl.d.ts.map +1 -1
  429. package/dist/i18n/locales/pl.js +560 -2
  430. package/dist/i18n/locales/pl.js.map +1 -1
  431. package/dist/i18n/locales/pt.d.ts +561 -1
  432. package/dist/i18n/locales/pt.d.ts.map +1 -1
  433. package/dist/i18n/locales/pt.js +560 -2
  434. package/dist/i18n/locales/pt.js.map +1 -1
  435. package/dist/i18n/locales/ro.d.ts +561 -1
  436. package/dist/i18n/locales/ro.d.ts.map +1 -1
  437. package/dist/i18n/locales/ro.js +560 -2
  438. package/dist/i18n/locales/ro.js.map +1 -1
  439. package/dist/i18n/locales/ru.d.ts +561 -1
  440. package/dist/i18n/locales/ru.d.ts.map +1 -1
  441. package/dist/i18n/locales/ru.js +560 -2
  442. package/dist/i18n/locales/ru.js.map +1 -1
  443. package/dist/i18n/locales/sq.d.ts +561 -1
  444. package/dist/i18n/locales/sq.d.ts.map +1 -1
  445. package/dist/i18n/locales/sq.js +560 -2
  446. package/dist/i18n/locales/sq.js.map +1 -1
  447. package/dist/i18n/locales/sv.d.ts +561 -1
  448. package/dist/i18n/locales/sv.d.ts.map +1 -1
  449. package/dist/i18n/locales/sv.js +560 -2
  450. package/dist/i18n/locales/sv.js.map +1 -1
  451. package/dist/i18n/locales/tr.d.ts +561 -1
  452. package/dist/i18n/locales/tr.d.ts.map +1 -1
  453. package/dist/i18n/locales/tr.js +560 -2
  454. package/dist/i18n/locales/tr.js.map +1 -1
  455. package/dist/i18n/locales/zh.d.ts +561 -1
  456. package/dist/i18n/locales/zh.d.ts.map +1 -1
  457. package/dist/i18n/locales/zh.js +560 -2
  458. package/dist/i18n/locales/zh.js.map +1 -1
  459. package/dist/index.js +663 -600
  460. package/dist/index.js.map +1 -1
  461. package/dist/locales/ar.json +562 -2
  462. package/dist/locales/de.json +562 -2
  463. package/dist/locales/el.json +562 -2
  464. package/dist/locales/en.json +562 -2
  465. package/dist/locales/es.json +562 -2
  466. package/dist/locales/fr.json +562 -2
  467. package/dist/locales/hi.json +562 -2
  468. package/dist/locales/it.json +562 -2
  469. package/dist/locales/ja.json +562 -2
  470. package/dist/locales/nl.json +562 -2
  471. package/dist/locales/pl.json +562 -2
  472. package/dist/locales/pt.json +562 -2
  473. package/dist/locales/ro.json +562 -2
  474. package/dist/locales/ru.json +562 -2
  475. package/dist/locales/sq.json +562 -2
  476. package/dist/locales/sv.json +562 -2
  477. package/dist/locales/tr.json +562 -2
  478. package/dist/locales/zh.json +562 -2
  479. package/dist/patterns/alia-assistant/alia-chat-surface.d.ts.map +1 -1
  480. package/dist/patterns/alia-assistant/alia-types.d.ts +15 -0
  481. package/dist/patterns/alia-assistant/alia-types.d.ts.map +1 -1
  482. package/dist/patterns/alia-assistant/index.js +1 -1
  483. package/dist/patterns/marketplace-app-shell/index.js +1 -1
  484. package/dist/patterns/patient-shell/index.js +1 -1
  485. package/dist/tokens.css +1 -1
  486. package/package.json +58 -1
  487. package/dist/_chunks/agenda-card-CFyWSX7Z.js.map +0 -1
  488. package/dist/_chunks/agenda-tray-Dyj9ChHC.js.map +0 -1
  489. package/dist/_chunks/alert-ywPR59NE.js.map +0 -1
  490. package/dist/_chunks/alia-sidebar-CVIPrdc9.js.map +0 -1
  491. package/dist/_chunks/booking-DlDVuWMd.js.map +0 -1
  492. package/dist/_chunks/calendar-YHFknAGv.js.map +0 -1
  493. package/dist/_chunks/chat-message-B5JpFj0F.js.map +0 -1
  494. package/dist/_chunks/contact-profile-card-DHyuAPXM.js.map +0 -1
  495. package/dist/_chunks/cycle-calculator-KxA8dqDf.js +0 -211
  496. package/dist/_chunks/cycle-calculator-KxA8dqDf.js.map +0 -1
  497. package/dist/_chunks/dialog-BTpZV6It.js.map +0 -1
  498. package/dist/_chunks/due-date-calculator-mFxpHLml.js +0 -216
  499. package/dist/_chunks/due-date-calculator-mFxpHLml.js.map +0 -1
  500. package/dist/_chunks/gestation-mWF4AXea.js +0 -50
  501. package/dist/_chunks/gestation-mWF4AXea.js.map +0 -1
  502. package/dist/_chunks/gestational-age-calculator-gWI_uRA1.js +0 -203
  503. package/dist/_chunks/gestational-age-calculator-gWI_uRA1.js.map +0 -1
  504. package/dist/_chunks/insert-result-C5ABnzDl.js.map +0 -1
  505. package/dist/_chunks/message-card-DSPw5ghw.js.map +0 -1
  506. package/dist/_chunks/operator-hero-7LiiP7zi.js +0 -171
  507. package/dist/_chunks/operator-hero-7LiiP7zi.js.map +0 -1
  508. package/dist/_chunks/pdf-viewer-CWEXTlwq.js.map +0 -1
  509. package/dist/_chunks/pregnancy-weight-gain-BtEHaSqy.js +0 -246
  510. package/dist/_chunks/pregnancy-weight-gain-BtEHaSqy.js.map +0 -1
  511. package/dist/_chunks/shield-check-C73ma9Cs.js +0 -36
  512. package/dist/_chunks/shield-check-C73ma9Cs.js.map +0 -1
  513. package/dist/_chunks/sidebar-_vJXI9rB.js.map +0 -1
  514. package/dist/_chunks/subDays-Dv7q9S7u.js +0 -8
  515. package/dist/_chunks/warning-stack-DNR3-IbP.js +0 -180
  516. package/dist/_chunks/warning-stack-DNR3-IbP.js.map +0 -1
  517. package/dist/_chunks/workflow-map-Djn1QMJc.js.map +0 -1
@@ -58,7 +58,7 @@ const $e = O(
58
58
  ].join(" ")
59
59
  ), Le = O(
60
60
  [
61
- "ds:flex ds:flex-col ds:gap-[var(--spacing-3xs)]",
61
+ "ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)]",
62
62
  "ds:ps-3 ds:pe-3 ds:py-2 ds:rounded-[var(--radius-sm)]",
63
63
  "ds:cursor-pointer ds:select-none ds:text-foreground",
64
64
  "ds:text-start",
@@ -355,4 +355,4 @@ export {
355
355
  ze as A,
356
356
  oe as p
357
357
  };
358
- //# sourceMappingURL=address-autocomplete-CSjMrBvu.js.map
358
+ //# sourceMappingURL=address-autocomplete-CT-9AOli.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"address-autocomplete-CSjMrBvu.js","sources":["../../src/components/address-autocomplete/parse-address.ts","../../src/components/address-autocomplete/address-autocomplete.tsx"],"sourcesContent":["/* ------------------------------------------------------------------ */\n/* parse-address — pure mapper from Google address components to the */\n/* kit's StructuredAddress shape. */\n/* */\n/* Kept dependency-free and side-effect-free so it can be unit-tested */\n/* in isolation (no Google SDK, no DOM) and reused by the mock-mode */\n/* story/test fixtures. Accepts the loosened component shape produced */\n/* by BOTH the new Places API (`Place.addressComponents` → */\n/* `{ longText, shortText, types }`) and the classic Geocoder/ */\n/* PlacesService shape (`{ long_name, short_name, types }`) so the */\n/* component can fall back without re-shaping upstream. */\n/* ------------------------------------------------------------------ */\n\n/**\n * Structured, app-friendly address. Field semantics match the AlfaDocs\n * Italian patient-address model: `province` is the 2-letter IT province\n * code (UPPERCASED) and `country` is the ISO 3166-1 alpha-2 code\n * (lowercased), matching how the platform stores them.\n */\nexport interface StructuredAddress {\n /** Street line — route, with the street number joined when present. */\n street: string;\n /** Town / city (locality, falling back to postal_town / admin level 3). */\n city: string;\n /** Postal / ZIP code. */\n postcode: string;\n /** Province — admin level 2 short code, UPPERCASED (e.g. \"MI\", \"RM\"). */\n province: string;\n /** Country — ISO alpha-2, lowercased (e.g. \"it\", \"gb\"). */\n country: string;\n /** Google's human-readable formatted address (whole line). */\n formatted: string;\n}\n\n/**\n * Loosened address-component shape accepted by {@link parseAddressComponents}.\n * Mirrors both Places-API (`longText`/`shortText`) and classic Geocoder\n * (`long_name`/`short_name`) field names so either source parses without a\n * pre-pass. `types` is required; the text fields are individually optional.\n */\nexport interface RawAddressComponent {\n types: string[];\n longText?: string | null;\n shortText?: string | null;\n long_name?: string | null;\n short_name?: string | null;\n}\n\nfunction longTextOf(component: RawAddressComponent): string {\n return component.longText ?? component.long_name ?? '';\n}\n\nfunction shortTextOf(component: RawAddressComponent): string {\n return component.shortText ?? component.short_name ?? longTextOf(component);\n}\n\nfunction findByType(\n components: readonly RawAddressComponent[],\n type: string,\n): RawAddressComponent | undefined {\n return components.find((component) => component.types.includes(type));\n}\n\n/**\n * Maps an array of Google address components to a {@link StructuredAddress}.\n *\n * Pure: no SDK calls, no DOM, no I/O. `formatted` is passed through from the\n * caller (Google's `formattedAddress` / `formatted_address`) because it is\n * not derivable from the component list.\n *\n * Mapping rules:\n * - `street` = `route`, prefixed with `street_number` when present\n * (e.g. \"Via Roma 12\"). Either part alone is used if the\n * other is missing.\n * - `city` = `locality`, falling back to `postal_town`, then\n * `administrative_area_level_3`.\n * - `postcode` = `postal_code`.\n * - `province` = `administrative_area_level_2` SHORT text, UPPERCASED.\n * - `country` = `country` SHORT text (ISO alpha-2), lowercased.\n */\nexport function parseAddressComponents(\n components: readonly RawAddressComponent[],\n formatted = '',\n): StructuredAddress {\n const route = findByType(components, 'route');\n const streetNumber = findByType(components, 'street_number');\n const locality = findByType(components, 'locality');\n const postalTown = findByType(components, 'postal_town');\n const adminLevel3 = findByType(components, 'administrative_area_level_3');\n const postalCode = findByType(components, 'postal_code');\n const adminLevel2 = findByType(components, 'administrative_area_level_2');\n const country = findByType(components, 'country');\n\n const routeText = route ? longTextOf(route) : '';\n const numberText = streetNumber ? longTextOf(streetNumber) : '';\n const street = [routeText, numberText].filter(Boolean).join(' ').trim();\n\n const cityComponent = locality ?? postalTown ?? adminLevel3;\n const city = cityComponent ? longTextOf(cityComponent) : '';\n\n const postcode = postalCode ? longTextOf(postalCode) : '';\n\n const province = adminLevel2 ? shortTextOf(adminLevel2).toUpperCase() : '';\n\n const countryCode = country ? shortTextOf(country).toLowerCase() : '';\n\n return {\n street,\n city,\n postcode,\n province,\n country: countryCode,\n formatted,\n };\n}\n","/// <reference types=\"google.maps\" />\n/* ------------------------------------------------------------------ */\n/* AddressAutocomplete — single-line address field with Google Places */\n/* suggestions, surfaced as an accessible combobox + listbox. */\n/* */\n/* - Wraps the Google Maps JS API on demand via the library's */\n/* `APIProvider`; the consumer supplies `apiKey` (never cached by the */\n/* kit, same contract as MapView). NO `<Map>` is rendered — only the */\n/* `places` library is loaded via `useMapsLibrary(\"places\")`. */\n/* - NO consent gate (unlike MapView): the consumer guarantees consent */\n/* upstream before mounting this field. */\n/* - Prefers the NEW Places API */\n/* (`AutocompleteSuggestion.fetchAutocompleteSuggestions` for */\n/* predictions + `Place.fetchFields([\"addressComponents\", …])` for */\n/* details). Falls back to the classic `AutocompleteService` + */\n/* `PlacesService` when the new classes are unavailable in the loaded */\n/* SDK version. */\n/* - NO-KEY / no-library fallback: when `apiKey` is absent (and no */\n/* `getSuggestions` injector is given), renders a plain themed text */\n/* input so the field never hard-fails. */\n/* - MOCK mode: pass `getSuggestions` to drive the listbox from a */\n/* static list (each carrying a pre-parsed `StructuredAddress`) — no */\n/* real Google call. Used by stories/tests. */\n/* ------------------------------------------------------------------ */\n\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type FocusEvent,\n type ForwardedRef,\n type KeyboardEvent,\n type ReactNode,\n} from 'react';\nimport { cva } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { APIProvider, useMapsLibrary } from '@vis.gl/react-google-maps';\nimport { MapPin } from 'lucide-react';\nimport { useFormField } from '../form-field/form-field-context';\nimport { composeRefs } from '../_shared/compose-refs';\nimport { useControllableState } from '../../hooks/use-controllable-state';\nimport { useDebouncedCallback } from '../_shared/use-debounced-callback';\nimport {\n INPUT_SURFACE_CHROME,\n INPUT_SURFACE_HEIGHT,\n INPUT_SURFACE_TEXT,\n INPUT_SURFACE_TONE,\n} from '../_shared/input-surface';\nimport {\n parseAddressComponents,\n type StructuredAddress,\n type RawAddressComponent,\n} from './parse-address';\n\nexport type { StructuredAddress, RawAddressComponent };\n\n/* ------------------------------------------------------------------ */\n/* Suggestion shape */\n/* ------------------------------------------------------------------ */\n\n/**\n * A single address suggestion surfaced in the listbox.\n *\n * `placeId` keys the row and (in real Google mode) is used to fetch full\n * details on selection. In MOCK mode the suggestion carries a pre-parsed\n * `address` so selection resolves without any network call.\n */\nexport interface AddressSuggestion {\n /** Stable id — the Google place id, or any unique string in mock mode. */\n placeId: string;\n /** Primary line shown in the row (e.g. \"Via Roma 12\"). */\n primaryText: string;\n /** Secondary line shown muted under the primary (e.g. \"Milan, Italy\"). */\n secondaryText?: string;\n /**\n * Pre-parsed structured address. Required in MOCK mode (so selection can\n * resolve without Google). In real Google mode this is omitted and the\n * details are fetched on selection.\n */\n address?: StructuredAddress;\n}\n\n/**\n * Test/story injector. Given the current query it returns the suggestions\n * to show. Each returned suggestion MUST carry a pre-parsed `address` so\n * selection resolves without a real Google call.\n */\nexport type GetSuggestions = (\n query: string,\n) => AddressSuggestion[] | Promise<AddressSuggestion[]>;\n\n/* ------------------------------------------------------------------ */\n/* Props */\n/* ------------------------------------------------------------------ */\n\nexport interface AddressAutocompleteProps {\n /**\n * Google Maps JS API key. Consumer-owned; never cached by the kit. When\n * absent (and no `getSuggestions` injector is given) the field degrades\n * to a plain free-text input with no suggestions.\n */\n apiKey?: string;\n /** Controlled text value of the input. */\n value?: string;\n /** Fires on every keystroke with the new input text. */\n onValueChange?: (value: string) => void;\n /** Uncontrolled initial text. Ignored once `value` is set. */\n defaultValue?: string;\n /**\n * Fires when the user picks a suggestion, with the parsed structured\n * address. In real Google mode the details are fetched first, so this\n * is async relative to the click.\n */\n onSelect?: (address: StructuredAddress) => void;\n /**\n * Test-only / mock injector. When provided, the listbox is driven from\n * its return value instead of a real Google call — even when `apiKey` is\n * also set (the injector wins, so stories/tests are deterministic).\n */\n getSuggestions?: GetSuggestions;\n /**\n * Restrict predictions to these CLDR region codes (e.g. `['it']`).\n * Real-Google mode only.\n */\n regionCodes?: string[];\n /** Visible label is owned by a wrapping FormField; this is a fallback name. */\n 'aria-label'?: string;\n /** Placeholder text. Falls back to the translated default. */\n placeholder?: string;\n /** Debounce before firing a suggestion fetch. Default 250ms. */\n debounceMs?: number;\n disabled?: boolean;\n required?: boolean;\n readOnly?: boolean;\n name?: string;\n /** Field id. Falls back to FormField context id. */\n id?: string;\n size?: 'sm' | 'md' | 'lg';\n tone?: 'default' | 'error';\n className?: string;\n}\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst wrapperVariants = cva(\n ['ds:flex ds:w-full ds:items-center', INPUT_SURFACE_CHROME].join(' '),\n {\n variants: {\n size: {\n sm: `${INPUT_SURFACE_HEIGHT.sm} ${INPUT_SURFACE_TEXT.sm}`,\n md: `${INPUT_SURFACE_HEIGHT.md} ${INPUT_SURFACE_TEXT.md}`,\n lg: `${INPUT_SURFACE_HEIGHT.lg} ${INPUT_SURFACE_TEXT.lg}`,\n },\n tone: INPUT_SURFACE_TONE,\n },\n defaultVariants: { size: 'md', tone: 'default' },\n },\n);\n\nconst inputVariants = cva(\n [\n 'ds:flex-1 ds:min-w-0 ds:ps-3 ds:pe-3 ds:bg-transparent ds:text-foreground',\n 'ds:placeholder:text-muted-foreground',\n 'ds:outline-none ds:focus:outline-none ds:focus-visible:outline-none',\n 'ds:disabled:cursor-not-allowed ds:read-only:cursor-default',\n ].join(' '),\n);\n\nconst adornmentClasses =\n 'ds:inline-flex ds:items-center ds:shrink-0 ds:ps-3 ds:text-muted-foreground ds:[&_svg]:size-4';\n\nconst listboxVariants = cva(\n [\n 'ds:absolute ds:z-[var(--z-dropdown)] ds:mt-[var(--spacing-2xs)] ds:w-full',\n 'ds:overflow-auto ds:max-h-[18rem]',\n 'ds:rounded-[var(--radius-sm)] ds:border ds:border-border ds:bg-background',\n 'ds:shadow-[var(--shadow-md)] ds:p-[var(--spacing-xs)]',\n ].join(' '),\n);\n\nconst optionVariants = cva(\n [\n 'ds:flex ds:flex-col ds:gap-[var(--spacing-3xs)]',\n 'ds:ps-3 ds:pe-3 ds:py-2 ds:rounded-[var(--radius-sm)]',\n 'ds:cursor-pointer ds:select-none ds:text-foreground',\n 'ds:text-start',\n 'ds:data-[active=true]:bg-primary ds:data-[active=true]:text-primary-foreground',\n 'ds:hover:bg-muted ds:data-[active=true]:hover:bg-primary',\n ].join(' '),\n);\n\nconst messageClasses =\n 'ds:ps-3 ds:pe-3 ds:py-2 type-body-sm ds:text-muted-foreground';\n\n/* ------------------------------------------------------------------ */\n/* Inner: real Google Places engine. */\n/* */\n/* `useMapsLibrary(\"places\")` only resolves inside an APIProvider tree, */\n/* so this inner component is mounted by the outer wrapper only when an */\n/* apiKey is present and no mock injector is supplied. It owns no UI — */\n/* it renders the shared `<AddressCombobox>` with a `getSuggestions` / */\n/* `resolveSelection` pair wired to the loaded SDK. */\n/* ------------------------------------------------------------------ */\n\ninterface GoogleEngineProps extends Omit<AddressAutocompleteProps, 'apiKey'> {\n forwardedRef: ForwardedRef<HTMLInputElement>;\n}\n\nfunction GooglePlacesEngine({\n forwardedRef,\n regionCodes,\n onSelect,\n ...rest\n}: GoogleEngineProps): ReactNode {\n const places = useMapsLibrary('places');\n // A fresh session token groups the query + selection phases for billing.\n // Reset after each selection so the next lookup starts a new session.\n const sessionTokenRef =\n useRef<google.maps.places.AutocompleteSessionToken | null>(null);\n\n const supportsNewApi = Boolean(\n places &&\n 'AutocompleteSuggestion' in places &&\n 'Place' in places &&\n 'AutocompleteSessionToken' in places,\n );\n\n const getSuggestions = useCallback<GetSuggestions>(\n async (query) => {\n if (!places || query.trim().length === 0) return [];\n\n if (supportsNewApi) {\n if (!sessionTokenRef.current) {\n sessionTokenRef.current = new places.AutocompleteSessionToken();\n }\n const { suggestions } =\n await places.AutocompleteSuggestion.fetchAutocompleteSuggestions({\n input: query,\n sessionToken: sessionTokenRef.current,\n includedRegionCodes: regionCodes,\n });\n return suggestions\n .map((suggestion): AddressSuggestion | null => {\n const prediction = suggestion.placePrediction;\n if (!prediction) return null;\n return {\n placeId: prediction.placeId,\n primaryText: prediction.mainText?.text ?? prediction.text.text,\n secondaryText: prediction.secondaryText?.text,\n };\n })\n .filter((value): value is AddressSuggestion => value !== null);\n }\n\n // Classic fallback — AutocompleteService.getPlacePredictions.\n const ServiceCtor = (\n places as unknown as {\n AutocompleteService?: new () => google.maps.places.AutocompleteService;\n }\n ).AutocompleteService;\n if (!ServiceCtor) return [];\n const service = new ServiceCtor();\n const response = await service.getPlacePredictions({ input: query });\n return response.predictions.map((prediction) => ({\n placeId: prediction.place_id,\n primaryText:\n prediction.structured_formatting?.main_text ?? prediction.description,\n secondaryText: prediction.structured_formatting?.secondary_text,\n }));\n },\n [places, supportsNewApi, regionCodes],\n );\n\n const resolveSelection = useCallback(\n async (\n suggestion: AddressSuggestion,\n ): Promise<StructuredAddress | null> => {\n if (suggestion.address) return suggestion.address;\n if (!places) return null;\n\n if (supportsNewApi) {\n const place = new places.Place({ id: suggestion.placeId });\n const { place: filled } = await place.fetchFields({\n fields: ['addressComponents', 'formattedAddress'],\n });\n // End the billing session once details are fetched.\n sessionTokenRef.current = null;\n const components = (filled.addressComponents ??\n []) as unknown as RawAddressComponent[];\n return parseAddressComponents(\n components,\n filled.formattedAddress ?? '',\n );\n }\n\n // Classic fallback — PlacesService.getDetails. Requires a DOM node to\n // host the service (an offscreen div suffices; nothing is rendered).\n const ServiceCtor = (\n places as unknown as {\n PlacesService?: new (\n container: HTMLElement,\n ) => google.maps.places.PlacesService;\n }\n ).PlacesService;\n if (!ServiceCtor) return null;\n const service = new ServiceCtor(document.createElement('div'));\n return new Promise<StructuredAddress | null>((resolve) => {\n service.getDetails(\n {\n placeId: suggestion.placeId,\n fields: ['address_components', 'formatted_address'],\n },\n (result) => {\n if (!result) {\n resolve(null);\n return;\n }\n const components = (result.address_components ??\n []) as unknown as RawAddressComponent[];\n resolve(\n parseAddressComponents(\n components,\n result.formatted_address ?? '',\n ),\n );\n },\n );\n });\n },\n [places, supportsNewApi],\n );\n\n return (\n <AddressCombobox\n {...rest}\n forwardedRef={forwardedRef}\n getSuggestions={getSuggestions}\n resolveSelection={resolveSelection}\n onSelect={onSelect}\n />\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Inner: the accessible combobox itself. */\n/* */\n/* Implements the WAI-ARIA 1.2 combobox pattern (text input + listbox */\n/* popup, `aria-activedescendant`). Shared by mock mode, no-key mode, */\n/* and the Google engine — only the `getSuggestions` / `resolveSelection`*/\n/* pair differs. */\n/* ------------------------------------------------------------------ */\n\ninterface AddressComboboxProps extends Omit<\n AddressAutocompleteProps,\n 'apiKey' | 'getSuggestions'\n> {\n forwardedRef?: ForwardedRef<HTMLInputElement>;\n getSuggestions?: GetSuggestions;\n resolveSelection?: (\n suggestion: AddressSuggestion,\n ) => Promise<StructuredAddress | null>;\n}\n\nfunction AddressCombobox({\n forwardedRef,\n value,\n defaultValue,\n onValueChange,\n onSelect,\n getSuggestions,\n resolveSelection,\n placeholder,\n debounceMs = 250,\n disabled,\n required,\n readOnly,\n name,\n id,\n size = 'md',\n tone = 'default',\n className,\n 'aria-label': ariaLabel,\n}: AddressComboboxProps): ReactNode {\n const { t } = useTranslation();\n const ctx = useFormField();\n\n // Internal node ref — used for focus() after selection and for the\n // listbox-contains check on blur. Composed with the consumer's\n // forwardRef onto the rendered <input>.\n const inputRef = useRef<HTMLInputElement | null>(null);\n const setInputRef = useMemo(\n () => composeRefs(forwardedRef, inputRef),\n [forwardedRef],\n );\n\n const reactId = useId();\n const idPrefix = id ?? ctx.id ?? reactId;\n const listId = `${idPrefix}-listbox`;\n const liveId = `${idPrefix}-live`;\n const optionId = (placeId: string) => `${idPrefix}-opt-${placeId}`;\n\n const effectiveDisabled = Boolean(ctx.disabled || disabled);\n const effectiveRequired = Boolean(ctx.required || required);\n const effectiveInvalid = ctx.invalid;\n const effectiveTone: 'default' | 'error' = effectiveInvalid ? 'error' : tone;\n const describedBy = ctx.describedBy || undefined;\n\n const [currentValueRaw, commitValue] = useControllableState<string>({\n value,\n defaultValue: defaultValue ?? '',\n onChange: onValueChange,\n });\n const currentValue = currentValueRaw ?? '';\n\n const [open, setOpen] = useState(false);\n const [suggestions, setSuggestions] = useState<AddressSuggestion[]>([]);\n const [loading, setLoading] = useState(false);\n const [activeIndex, setActiveIndex] = useState(-1);\n\n const composingRef = useRef(false);\n const latestQueryRef = useRef('');\n\n const resolvedPlaceholder =\n placeholder ?? t('inputs.addressAutocomplete.placeholder');\n\n const runFetch = useCallback(\n (query: string) => {\n if (!getSuggestions || effectiveDisabled || readOnly) return;\n if (composingRef.current) return;\n latestQueryRef.current = query;\n setLoading(true);\n Promise.resolve(getSuggestions(query))\n .then((results) => {\n // Drop stale responses — only the latest query may render.\n if (latestQueryRef.current !== query) return;\n setSuggestions(results);\n setActiveIndex(-1);\n setLoading(false);\n })\n .catch(() => {\n if (latestQueryRef.current !== query) return;\n setSuggestions([]);\n setLoading(false);\n });\n },\n [getSuggestions, effectiveDisabled, readOnly],\n );\n\n const debouncedFetch = useDebouncedCallback(runFetch, debounceMs);\n\n useEffect(() => () => debouncedFetch.cancel(), [debouncedFetch]);\n\n const handleInputChange = (next: string) => {\n commitValue(next);\n if (effectiveDisabled || readOnly) return;\n if (!open) setOpen(true);\n if (composingRef.current) return;\n debouncedFetch(next);\n };\n\n const handleSelect = useCallback(\n (suggestion: AddressSuggestion) => {\n commitValue(suggestion.primaryText);\n setOpen(false);\n setActiveIndex(-1);\n setSuggestions([]);\n latestQueryRef.current = suggestion.primaryText;\n if (resolveSelection) {\n Promise.resolve(resolveSelection(suggestion))\n .then((address) => {\n if (address) onSelect?.(address);\n })\n .catch(() => {\n /* selection details failed — leave the typed text in place */\n });\n } else if (suggestion.address) {\n onSelect?.(suggestion.address);\n }\n inputRef.current?.focus();\n },\n [commitValue, resolveSelection, onSelect, inputRef],\n );\n\n // Whether the listbox popup is actually displayed (mirrors `aria-expanded`\n // on the input). Derived here — above the keyboard handler — so an expanded\n // listbox can swallow Enter instead of letting it submit a surrounding\n // <form>.\n const showEmpty =\n open &&\n !loading &&\n currentValue.trim().length > 0 &&\n suggestions.length === 0 &&\n Boolean(getSuggestions);\n const hasOptions = suggestions.length > 0;\n const listboxOpen = open && (hasOptions || showEmpty || loading);\n\n const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.nativeEvent.isComposing) return;\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n if (!open) {\n setOpen(true);\n if (currentValue) debouncedFetch(currentValue);\n return;\n }\n if (suggestions.length === 0) return;\n setActiveIndex((index) => (index + 1) % suggestions.length);\n return;\n }\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n if (suggestions.length === 0) return;\n setActiveIndex((index) =>\n index <= 0 ? suggestions.length - 1 : index - 1,\n );\n return;\n }\n if (event.key === 'Enter') {\n // While the listbox is expanded, swallow Enter so it never submits the\n // surrounding <form>. Accept the highlighted option if there is one;\n // otherwise keep the typed text (blur / Escape dismiss the listbox).\n if (listboxOpen) {\n event.preventDefault();\n if (activeIndex >= 0 && suggestions[activeIndex]) {\n handleSelect(suggestions[activeIndex]);\n }\n }\n return;\n }\n if (event.key === 'Escape') {\n if (open) {\n event.preventDefault();\n setOpen(false);\n setActiveIndex(-1);\n }\n }\n };\n\n const handleFocus = () => {\n if (effectiveDisabled || readOnly) return;\n if (currentValue) {\n setOpen(true);\n debouncedFetch(currentValue);\n }\n };\n\n const handleBlur = (event: FocusEvent<HTMLInputElement>) => {\n // Keep open when focus moves into the listbox (pointer-down on an option).\n const next = event.relatedTarget as Node | null;\n if (next && listRef.current?.contains(next)) return;\n setOpen(false);\n setActiveIndex(-1);\n };\n\n const listRef = useRef<HTMLUListElement | null>(null);\n\n const activeDescendant =\n open && activeIndex >= 0 && suggestions[activeIndex]\n ? optionId(suggestions[activeIndex].placeId)\n : undefined;\n\n const liveMessage = loading\n ? t('inputs.addressAutocomplete.loading')\n : open && currentValue.trim().length > 0\n ? t('inputs.addressAutocomplete.results', { count: suggestions.length })\n : '';\n\n return (\n <div\n className=\"ds:relative ds:w-full\"\n data-component=\"address-autocomplete\"\n data-component-id={id}\n >\n <div\n className={wrapperVariants({ size, tone: effectiveTone, className })}\n data-disabled={effectiveDisabled || undefined}\n >\n <span aria-hidden=\"true\" className={adornmentClasses}>\n <MapPin />\n </span>\n <input\n ref={setInputRef}\n id={idPrefix}\n name={name}\n type=\"text\"\n autoComplete=\"off\"\n role=\"combobox\"\n aria-autocomplete=\"list\"\n aria-expanded={listboxOpen}\n aria-controls={listboxOpen ? listId : undefined}\n aria-activedescendant={activeDescendant}\n aria-describedby={describedBy}\n aria-invalid={effectiveInvalid || undefined}\n aria-label={ariaLabel ?? t('inputs.addressAutocomplete.ariaLabel')}\n placeholder={resolvedPlaceholder}\n value={currentValue}\n disabled={effectiveDisabled}\n required={effectiveRequired}\n readOnly={readOnly}\n onChange={(event) => handleInputChange(event.target.value)}\n onKeyDown={handleKeyDown}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onCompositionStart={() => {\n composingRef.current = true;\n }}\n onCompositionEnd={(event) => {\n composingRef.current = false;\n debouncedFetch(event.currentTarget.value);\n }}\n className={inputVariants()}\n />\n </div>\n {listboxOpen ? (\n <ul\n ref={listRef}\n id={listId}\n role=\"listbox\"\n aria-label={ariaLabel ?? t('inputs.addressAutocomplete.listLabel')}\n className={listboxVariants()}\n >\n {hasOptions\n ? suggestions.map((suggestion, index) => (\n <li\n key={suggestion.placeId}\n id={optionId(suggestion.placeId)}\n role=\"option\"\n aria-selected={index === activeIndex}\n data-active={index === activeIndex || undefined}\n // Pointer-down (not click) so selection runs before the\n // input's blur closes the listbox.\n onMouseDown={(event) => {\n event.preventDefault();\n handleSelect(suggestion);\n }}\n onMouseEnter={() => setActiveIndex(index)}\n className={optionVariants()}\n >\n <span className=\"ds:truncate\">{suggestion.primaryText}</span>\n {suggestion.secondaryText ? (\n <span className=\"type-meta ds:text-muted-foreground ds:data-[active=true]:text-primary-foreground ds:truncate\">\n {suggestion.secondaryText}\n </span>\n ) : null}\n </li>\n ))\n : null}\n {!hasOptions && loading ? (\n <li role=\"presentation\" className={messageClasses}>\n {t('inputs.addressAutocomplete.loading')}\n </li>\n ) : null}\n {!hasOptions && !loading && showEmpty ? (\n <li role=\"presentation\" className={messageClasses}>\n {t('inputs.addressAutocomplete.noResults')}\n </li>\n ) : null}\n </ul>\n ) : null}\n <span\n id={liveId}\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n className=\"ds:sr-only\"\n >\n {liveMessage}\n </span>\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Public component */\n/* ------------------------------------------------------------------ */\n\nexport const AddressAutocomplete = forwardRef<\n HTMLInputElement,\n AddressAutocompleteProps\n>(function AddressAutocomplete({ apiKey, getSuggestions, ...rest }, ref) {\n const { i18n } = useTranslation();\n\n // MOCK mode wins whenever a `getSuggestions` injector is supplied — even if\n // an apiKey is also present — so stories/tests stay deterministic and never\n // hit the network. The mock injector already carries pre-parsed addresses,\n // so selection resolves straight from the suggestion.\n if (getSuggestions) {\n return (\n <AddressCombobox\n {...rest}\n forwardedRef={ref}\n getSuggestions={getSuggestions}\n resolveSelection={resolveMockSelection}\n />\n );\n }\n\n // NO-KEY fallback — plain free-text input, no suggestions, never fails.\n if (!apiKey) {\n return <AddressCombobox {...rest} forwardedRef={ref} />;\n }\n\n return (\n <APIProvider apiKey={apiKey} language={i18n.language}>\n <GooglePlacesEngine {...rest} forwardedRef={ref} />\n </APIProvider>\n );\n});\nAddressAutocomplete.displayName = 'AddressAutocomplete';\n\n// Module-scoped so the mock branch passes a stable function identity.\nasync function resolveMockSelection(\n suggestion: AddressSuggestion,\n): Promise<StructuredAddress | null> {\n return suggestion.address ?? null;\n}\n"],"names":["longTextOf","component","shortTextOf","findByType","components","type","parseAddressComponents","formatted","route","streetNumber","locality","postalTown","adminLevel3","postalCode","adminLevel2","country","routeText","numberText","street","cityComponent","city","postcode","province","countryCode","wrapperVariants","cva","INPUT_SURFACE_CHROME","INPUT_SURFACE_HEIGHT","INPUT_SURFACE_TEXT","INPUT_SURFACE_TONE","inputVariants","adornmentClasses","listboxVariants","optionVariants","messageClasses","GooglePlacesEngine","forwardedRef","regionCodes","onSelect","rest","places","useMapsLibrary","sessionTokenRef","useRef","supportsNewApi","getSuggestions","useCallback","query","suggestions","suggestion","prediction","_a","_b","value","ServiceCtor","resolveSelection","place","filled","service","resolve","result","jsx","AddressCombobox","defaultValue","onValueChange","placeholder","debounceMs","disabled","required","readOnly","name","id","size","tone","className","ariaLabel","t","useTranslation","ctx","useFormField","inputRef","setInputRef","useMemo","composeRefs","reactId","useId","idPrefix","listId","liveId","optionId","placeId","effectiveDisabled","effectiveRequired","effectiveInvalid","effectiveTone","describedBy","currentValueRaw","commitValue","useControllableState","currentValue","open","setOpen","useState","setSuggestions","loading","setLoading","activeIndex","setActiveIndex","composingRef","latestQueryRef","resolvedPlaceholder","runFetch","results","debouncedFetch","useDebouncedCallback","useEffect","handleInputChange","next","handleSelect","address","showEmpty","hasOptions","listboxOpen","handleKeyDown","event","index","handleFocus","handleBlur","listRef","activeDescendant","liveMessage","jsxs","MapPin","AddressAutocomplete","forwardRef","apiKey","ref","i18n","resolveMockSelection","APIProvider"],"mappings":";;;;;;;;;;;AAgDA,SAASA,EAAWC,GAAwC;AAC1D,SAAOA,EAAU,YAAYA,EAAU,aAAa;AACtD;AAEA,SAASC,GAAYD,GAAwC;AAC3D,SAAOA,EAAU,aAAaA,EAAU,cAAcD,EAAWC,CAAS;AAC5E;AAEA,SAASE,EACPC,GACAC,GACiC;AACjC,SAAOD,EAAW,KAAK,CAACH,MAAcA,EAAU,MAAM,SAASI,CAAI,CAAC;AACtE;AAmBO,SAASC,GACdF,GACAG,IAAY,IACO;AACnB,QAAMC,IAAQL,EAAWC,GAAY,OAAO,GACtCK,IAAeN,EAAWC,GAAY,eAAe,GACrDM,IAAWP,EAAWC,GAAY,UAAU,GAC5CO,IAAaR,EAAWC,GAAY,aAAa,GACjDQ,IAAcT,EAAWC,GAAY,6BAA6B,GAClES,IAAaV,EAAWC,GAAY,aAAa,GACjDU,IAAcX,EAAWC,GAAY,6BAA6B,GAClEW,IAAUZ,EAAWC,GAAY,SAAS,GAE1CY,IAAYR,IAAQR,EAAWQ,CAAK,IAAI,IACxCS,IAAaR,IAAeT,EAAWS,CAAY,IAAI,IACvDS,IAAS,CAACF,GAAWC,CAAU,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,EAAE,KAAA,GAE3DE,IAAgBT,KAAYC,KAAcC,GAC1CQ,IAAOD,IAAgBnB,EAAWmB,CAAa,IAAI,IAEnDE,IAAWR,IAAab,EAAWa,CAAU,IAAI,IAEjDS,IAAWR,IAAcZ,GAAYY,CAAW,EAAE,gBAAgB,IAElES,IAAcR,IAAUb,GAAYa,CAAO,EAAE,gBAAgB;AAEnE,SAAO;AAAA,IACL,QAAAG;AAAA,IACA,MAAAE;AAAA,IACA,UAAAC;AAAA,IACA,UAAAC;AAAA,IACA,SAASC;AAAA,IACT,WAAAhB;AAAA,EAAA;AAEJ;ACoCA,MAAMiB,KAAkBC;AAAA,EACtB,CAAC,qCAAqCC,EAAoB,EAAE,KAAK,GAAG;AAAA,EACpE;AAAA,IACE,UAAU;AAAA,MACR,MAAM;AAAA,QACJ,IAAI,GAAGC,EAAqB,EAAE,IAAIC,EAAmB,EAAE;AAAA,QACvD,IAAI,GAAGD,EAAqB,EAAE,IAAIC,EAAmB,EAAE;AAAA,QACvD,IAAI,GAAGD,EAAqB,EAAE,IAAIC,EAAmB,EAAE;AAAA,MAAA;AAAA,MAEzD,MAAMC;AAAA,IAAA;AAAA,IAER,iBAAiB,EAAE,MAAM,MAAM,MAAM,UAAA;AAAA,EAAU;AAEnD,GAEMC,KAAgBL;AAAA,EACpB;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,EACA,KAAK,GAAG;AACZ,GAEMM,KACJ,iGAEIC,KAAkBP;AAAA,EACtB;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,EACA,KAAK,GAAG;AACZ,GAEMQ,KAAiBR;AAAA,EACrB;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,EACA,KAAK,GAAG;AACZ,GAEMS,KACJ;AAgBF,SAASC,GAAmB;AAAA,EAC1B,cAAAC;AAAA,EACA,aAAAC;AAAA,EACA,UAAAC;AAAA,EACA,GAAGC;AACL,GAAiC;AAC/B,QAAMC,IAASC,GAAe,QAAQ,GAGhCC,IACJC,EAA2D,IAAI,GAE3DC,IAAiB,GACrBJ,KACA,4BAA4BA,KAC5B,WAAWA,KACX,8BAA8BA,IAG1BK,IAAiBC;AAAA,IACrB,OAAOC,MAAU;AACf,UAAI,CAACP,KAAUO,EAAM,KAAA,EAAO,WAAW,UAAU,CAAA;AAEjD,UAAIH,GAAgB;AAClB,QAAKF,EAAgB,YACnBA,EAAgB,UAAU,IAAIF,EAAO,yBAAA;AAEvC,cAAM,EAAE,aAAAQ,EAAA,IACN,MAAMR,EAAO,uBAAuB,6BAA6B;AAAA,UAC/D,OAAOO;AAAA,UACP,cAAcL,EAAgB;AAAA,UAC9B,qBAAqBL;AAAA,QAAA,CACtB;AACH,eAAOW,EACJ,IAAI,CAACC,MAAyC;;AAC7C,gBAAMC,IAAaD,EAAW;AAC9B,iBAAKC,IACE;AAAA,YACL,SAASA,EAAW;AAAA,YACpB,eAAaC,IAAAD,EAAW,aAAX,gBAAAC,EAAqB,SAAQD,EAAW,KAAK;AAAA,YAC1D,gBAAeE,IAAAF,EAAW,kBAAX,gBAAAE,EAA0B;AAAA,UAAA,IAJnB;AAAA,QAM1B,CAAC,EACA,OAAO,CAACC,MAAsCA,MAAU,IAAI;AAAA,MACjE;AAGA,YAAMC,IACJd,EAGA;AACF,aAAKc,KAEY,MADD,IAAIA,EAAA,EACW,oBAAoB,EAAE,OAAOP,GAAO,GACnD,YAAY,IAAI,CAACG,MAAA;;AAAgB;AAAA,UAC/C,SAASA,EAAW;AAAA,UACpB,eACEC,IAAAD,EAAW,0BAAX,gBAAAC,EAAkC,cAAaD,EAAW;AAAA,UAC5D,gBAAeE,IAAAF,EAAW,0BAAX,gBAAAE,EAAkC;AAAA,QAAA;AAAA,OACjD,IARuB,CAAA;AAAA,IAS3B;AAAA,IACA,CAACZ,GAAQI,GAAgBP,CAAW;AAAA,EAAA,GAGhCkB,IAAmBT;AAAA,IACvB,OACEG,MACsC;AACtC,UAAIA,EAAW,QAAS,QAAOA,EAAW;AAC1C,UAAI,CAACT,EAAQ,QAAO;AAEpB,UAAII,GAAgB;AAClB,cAAMY,IAAQ,IAAIhB,EAAO,MAAM,EAAE,IAAIS,EAAW,SAAS,GACnD,EAAE,OAAOQ,EAAA,IAAW,MAAMD,EAAM,YAAY;AAAA,UAChD,QAAQ,CAAC,qBAAqB,kBAAkB;AAAA,QAAA,CACjD;AAED,QAAAd,EAAgB,UAAU;AAC1B,cAAMtC,IAAcqD,EAAO,qBACzB,CAAA;AACF,eAAOnD;AAAA,UACLF;AAAA,UACAqD,EAAO,oBAAoB;AAAA,QAAA;AAAA,MAE/B;AAIA,YAAMH,IACJd,EAKA;AACF,UAAI,CAACc,EAAa,QAAO;AACzB,YAAMI,IAAU,IAAIJ,EAAY,SAAS,cAAc,KAAK,CAAC;AAC7D,aAAO,IAAI,QAAkC,CAACK,MAAY;AACxD,QAAAD,EAAQ;AAAA,UACN;AAAA,YACE,SAAST,EAAW;AAAA,YACpB,QAAQ,CAAC,sBAAsB,mBAAmB;AAAA,UAAA;AAAA,UAEpD,CAACW,MAAW;AACV,gBAAI,CAACA,GAAQ;AACX,cAAAD,EAAQ,IAAI;AACZ;AAAA,YACF;AACA,kBAAMvD,IAAcwD,EAAO,sBACzB,CAAA;AACF,YAAAD;AAAA,cACErD;AAAA,gBACEF;AAAA,gBACAwD,EAAO,qBAAqB;AAAA,cAAA;AAAA,YAC9B;AAAA,UAEJ;AAAA,QAAA;AAAA,MAEJ,CAAC;AAAA,IACH;AAAA,IACA,CAACpB,GAAQI,CAAc;AAAA,EAAA;AAGzB,SACE,gBAAAiB;AAAA,IAACC;AAAA,IAAA;AAAA,MACE,GAAGvB;AAAA,MACJ,cAAAH;AAAA,MACA,gBAAAS;AAAA,MACA,kBAAAU;AAAA,MACA,UAAAjB;AAAA,IAAA;AAAA,EAAA;AAGN;AAsBA,SAASwB,EAAgB;AAAA,EACvB,cAAA1B;AAAA,EACA,OAAAiB;AAAA,EACA,cAAAU;AAAA,EACA,eAAAC;AAAA,EACA,UAAA1B;AAAA,EACA,gBAAAO;AAAA,EACA,kBAAAU;AAAA,EACA,aAAAU;AAAA,EACA,YAAAC,IAAa;AAAA,EACb,UAAAC;AAAA,EACA,UAAAC;AAAA,EACA,UAAAC;AAAA,EACA,MAAAC;AAAA,EACA,IAAAC;AAAA,EACA,MAAAC,IAAO;AAAA,EACP,MAAAC,IAAO;AAAA,EACP,WAAAC;AAAA,EACA,cAAcC;AAChB,GAAoC;AAClC,QAAM,EAAE,GAAAC,EAAA,IAAMC,GAAA,GACRC,IAAMC,GAAA,GAKNC,IAAWrC,EAAgC,IAAI,GAC/CsC,KAAcC;AAAA,IAClB,MAAMC,GAAY/C,GAAc4C,CAAQ;AAAA,IACxC,CAAC5C,CAAY;AAAA,EAAA,GAGTgD,KAAUC,GAAA,GACVC,IAAWf,KAAMO,EAAI,MAAMM,IAC3BG,IAAS,GAAGD,CAAQ,YACpBE,KAAS,GAAGF,CAAQ,SACpBG,IAAW,CAACC,MAAoB,GAAGJ,CAAQ,QAAQI,CAAO,IAE1DC,IAAoB,GAAQb,EAAI,YAAYX,IAC5CyB,KAAoB,GAAQd,EAAI,YAAYV,IAC5CyB,KAAmBf,EAAI,SACvBgB,KAAqCD,KAAmB,UAAUpB,GAClEsB,KAAcjB,EAAI,eAAe,QAEjC,CAACkB,IAAiBC,CAAW,IAAIC,GAA6B;AAAA,IAClE,OAAA7C;AAAA,IACA,cAAcU,KAAgB;AAAA,IAC9B,UAAUC;AAAA,EAAA,CACX,GACKmC,IAAeH,MAAmB,IAElC,CAACI,GAAMC,CAAO,IAAIC,EAAS,EAAK,GAChC,CAACtD,GAAauD,CAAc,IAAID,EAA8B,CAAA,CAAE,GAChE,CAACE,GAASC,CAAU,IAAIH,EAAS,EAAK,GACtC,CAACI,GAAaC,CAAc,IAAIL,EAAS,EAAE,GAE3CM,IAAejE,EAAO,EAAK,GAC3BkE,IAAiBlE,EAAO,EAAE,GAE1BmE,KACJ7C,KAAeW,EAAE,wCAAwC,GAErDmC,KAAWjE;AAAA,IACf,CAACC,MAAkB;AACjB,MAAI,CAACF,KAAkB8C,KAAqBtB,KACxCuC,EAAa,YACjBC,EAAe,UAAU9D,GACzB0D,EAAW,EAAI,GACf,QAAQ,QAAQ5D,EAAeE,CAAK,CAAC,EAClC,KAAK,CAACiE,MAAY;AAEjB,QAAIH,EAAe,YAAY9D,MAC/BwD,EAAeS,CAAO,GACtBL,EAAe,EAAE,GACjBF,EAAW,EAAK;AAAA,MAClB,CAAC,EACA,MAAM,MAAM;AACX,QAAII,EAAe,YAAY9D,MAC/BwD,EAAe,CAAA,CAAE,GACjBE,EAAW,EAAK;AAAA,MAClB,CAAC;AAAA,IACL;AAAA,IACA,CAAC5D,GAAgB8C,GAAmBtB,CAAQ;AAAA,EAAA,GAGxC4C,IAAiBC,GAAqBH,IAAU7C,CAAU;AAEhE,EAAAiD,GAAU,MAAM,MAAMF,EAAe,UAAU,CAACA,CAAc,CAAC;AAE/D,QAAMG,KAAoB,CAACC,MAAiB;AAE1C,IADApB,EAAYoB,CAAI,GACZ,EAAA1B,KAAqBtB,OACpB+B,KAAMC,EAAQ,EAAI,GACnB,CAAAO,EAAa,WACjBK,EAAeI,CAAI;AAAA,EACrB,GAEMC,KAAexE;AAAA,IACnB,CAACG,MAAkC;;AACjC,MAAAgD,EAAYhD,EAAW,WAAW,GAClCoD,EAAQ,EAAK,GACbM,EAAe,EAAE,GACjBJ,EAAe,CAAA,CAAE,GACjBM,EAAe,UAAU5D,EAAW,aAChCM,IACF,QAAQ,QAAQA,EAAiBN,CAAU,CAAC,EACzC,KAAK,CAACsE,MAAY;AACjB,QAAIA,qBAAoBA;AAAA,MAC1B,CAAC,EACA,MAAM,MAAM;AAAA,MAEb,CAAC,IACMtE,EAAW,YACpBX,KAAA,QAAAA,EAAWW,EAAW,YAExBE,IAAA6B,EAAS,YAAT,QAAA7B,EAAkB;AAAA,IACpB;AAAA,IACA,CAAC8C,GAAa1C,GAAkBjB,GAAU0C,CAAQ;AAAA,EAAA,GAO9CwC,KACJpB,KACA,CAACI,KACDL,EAAa,KAAA,EAAO,SAAS,KAC7BnD,EAAY,WAAW,KACvB,EAAQH,GACJ4E,IAAazE,EAAY,SAAS,GAClC0E,IAActB,MAASqB,KAAcD,MAAahB,IAElDmB,KAAgB,CAACC,MAA2C;AAChE,QAAI,CAAAA,EAAM,YAAY,aACtB;AAAA,UAAIA,EAAM,QAAQ,aAAa;AAE7B,YADAA,EAAM,eAAA,GACF,CAACxB,GAAM;AACT,UAAAC,EAAQ,EAAI,GACRF,OAA6BA,CAAY;AAC7C;AAAA,QACF;AACA,YAAInD,EAAY,WAAW,EAAG;AAC9B,QAAA2D,EAAe,CAACkB,OAAWA,IAAQ,KAAK7E,EAAY,MAAM;AAC1D;AAAA,MACF;AACA,UAAI4E,EAAM,QAAQ,WAAW;AAE3B,YADAA,EAAM,eAAA,GACF5E,EAAY,WAAW,EAAG;AAC9B,QAAA2D;AAAA,UAAe,CAACkB,MACdA,KAAS,IAAI7E,EAAY,SAAS,IAAI6E,IAAQ;AAAA,QAAA;AAEhD;AAAA,MACF;AACA,UAAID,EAAM,QAAQ,SAAS;AAIzB,QAAIF,MACFE,EAAM,eAAA,GACFlB,KAAe,KAAK1D,EAAY0D,CAAW,KAC7CY,GAAatE,EAAY0D,CAAW,CAAC;AAGzC;AAAA,MACF;AACA,MAAIkB,EAAM,QAAQ,YACZxB,MACFwB,EAAM,eAAA,GACNvB,EAAQ,EAAK,GACbM,EAAe,EAAE;AAAA;AAAA,EAGvB,GAEMmB,KAAc,MAAM;AACxB,IAAInC,KAAqBtB,KACrB8B,MACFE,EAAQ,EAAI,GACZY,EAAed,CAAY;AAAA,EAE/B,GAEM4B,KAAa,CAACH,MAAwC;;AAE1D,UAAMP,IAAOO,EAAM;AACnB,IAAIP,OAAQlE,IAAA6E,GAAQ,YAAR,QAAA7E,EAAiB,SAASkE,QACtChB,EAAQ,EAAK,GACbM,EAAe,EAAE;AAAA,EACnB,GAEMqB,KAAUrF,EAAgC,IAAI,GAE9CsF,KACJ7B,KAAQM,KAAe,KAAK1D,EAAY0D,CAAW,IAC/CjB,EAASzC,EAAY0D,CAAW,EAAE,OAAO,IACzC,QAEAwB,KAAc1B,IAChB5B,EAAE,oCAAoC,IACtCwB,KAAQD,EAAa,KAAA,EAAO,SAAS,IACnCvB,EAAE,sCAAsC,EAAE,OAAO5B,EAAY,OAAA,CAAQ,IACrE;AAEN,SACE,gBAAAmF;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,kBAAe;AAAA,MACf,qBAAmB5D;AAAA,MAEnB,UAAA;AAAA,QAAA,gBAAA4D;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAW3G,GAAgB,EAAE,MAAAgD,GAAM,MAAMsB,IAAe,WAAApB,GAAW;AAAA,YACnE,iBAAeiB,KAAqB;AAAA,YAEpC,UAAA;AAAA,cAAA,gBAAA9B,EAAC,UAAK,eAAY,QAAO,WAAW9B,IAClC,UAAA,gBAAA8B,EAACuE,MAAO,EAAA,CACV;AAAA,cACA,gBAAAvE;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,KAAKoB;AAAA,kBACL,IAAIK;AAAA,kBACJ,MAAAhB;AAAA,kBACA,MAAK;AAAA,kBACL,cAAa;AAAA,kBACb,MAAK;AAAA,kBACL,qBAAkB;AAAA,kBAClB,iBAAeoD;AAAA,kBACf,iBAAeA,IAAcnC,IAAS;AAAA,kBACtC,yBAAuB0C;AAAA,kBACvB,oBAAkBlC;AAAA,kBAClB,gBAAcF,MAAoB;AAAA,kBAClC,cAAYlB,KAAaC,EAAE,sCAAsC;AAAA,kBACjE,aAAakC;AAAA,kBACb,OAAOX;AAAA,kBACP,UAAUR;AAAA,kBACV,UAAUC;AAAA,kBACV,UAAAvB;AAAA,kBACA,UAAU,CAACuD,MAAUR,GAAkBQ,EAAM,OAAO,KAAK;AAAA,kBACzD,WAAWD;AAAA,kBACX,SAASG;AAAA,kBACT,QAAQC;AAAA,kBACR,oBAAoB,MAAM;AACxB,oBAAAnB,EAAa,UAAU;AAAA,kBACzB;AAAA,kBACA,kBAAkB,CAACgB,MAAU;AAC3B,oBAAAhB,EAAa,UAAU,IACvBK,EAAeW,EAAM,cAAc,KAAK;AAAA,kBAC1C;AAAA,kBACA,WAAW9F,GAAA;AAAA,gBAAc;AAAA,cAAA;AAAA,YAC3B;AAAA,UAAA;AAAA,QAAA;AAAA,QAED4F,IACC,gBAAAS;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,KAAKH;AAAA,YACL,IAAIzC;AAAA,YACJ,MAAK;AAAA,YACL,cAAYZ,KAAaC,EAAE,sCAAsC;AAAA,YACjE,WAAW5C,GAAA;AAAA,YAEV,UAAA;AAAA,cAAAyF,IACGzE,EAAY,IAAI,CAACC,GAAY4E,MAC3B,gBAAAM;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBAEC,IAAI1C,EAASxC,EAAW,OAAO;AAAA,kBAC/B,MAAK;AAAA,kBACL,iBAAe4E,MAAUnB;AAAA,kBACzB,eAAamB,MAAUnB,KAAe;AAAA,kBAGtC,aAAa,CAACkB,MAAU;AACtB,oBAAAA,EAAM,eAAA,GACNN,GAAarE,CAAU;AAAA,kBACzB;AAAA,kBACA,cAAc,MAAM0D,EAAekB,CAAK;AAAA,kBACxC,WAAW5F,GAAA;AAAA,kBAEX,UAAA;AAAA,oBAAA,gBAAA4B,EAAC,QAAA,EAAK,WAAU,eAAe,UAAAZ,EAAW,aAAY;AAAA,oBACrDA,EAAW,gBACV,gBAAAY,EAAC,QAAA,EAAK,WAAU,gGACb,UAAAZ,EAAW,eACd,IACE;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAnBCA,EAAW;AAAA,cAAA,CAqBnB,IACD;AAAA,cACH,CAACwE,KAAcjB,IACd,gBAAA3C,EAAC,MAAA,EAAG,MAAK,gBAAe,WAAW3B,IAChC,UAAA0C,EAAE,oCAAoC,EAAA,CACzC,IACE;AAAA,cACH,CAAC6C,KAAc,CAACjB,KAAWgB,KAC1B,gBAAA3D,EAAC,MAAA,EAAG,MAAK,gBAAe,WAAW3B,IAChC,UAAA0C,EAAE,sCAAsC,GAC3C,IACE;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA,IAEJ;AAAA,QACJ,gBAAAf;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,IAAI2B;AAAA,YACJ,MAAK;AAAA,YACL,aAAU;AAAA,YACV,eAAY;AAAA,YACZ,WAAU;AAAA,YAET,UAAA0C;AAAA,UAAA;AAAA,QAAA;AAAA,MACH;AAAA,IAAA;AAAA,EAAA;AAGN;AAMO,MAAMG,KAAsBC,GAGjC,SAA6B,EAAE,QAAAC,GAAQ,gBAAA1F,GAAgB,GAAGN,EAAA,GAAQiG,GAAK;AACvE,QAAM,EAAE,MAAAC,EAAA,IAAS5D,GAAA;AAMjB,SAAIhC,IAEA,gBAAAgB;AAAA,IAACC;AAAA,IAAA;AAAA,MACE,GAAGvB;AAAA,MACJ,cAAciG;AAAA,MACd,gBAAA3F;AAAA,MACA,kBAAkB6F;AAAA,IAAA;AAAA,EAAA,IAMnBH,IAKH,gBAAA1E,EAAC8E,IAAA,EAAY,QAAAJ,GAAgB,UAAUE,EAAK,UAC1C,UAAA,gBAAA5E,EAAC1B,IAAA,EAAoB,GAAGI,GAAM,cAAciG,EAAA,CAAK,GACnD,IANO,gBAAA3E,EAACC,GAAA,EAAiB,GAAGvB,GAAM,cAAciG,GAAK;AAQzD,CAAC;AACDH,GAAoB,cAAc;AAGlC,eAAeK,GACbzF,GACmC;AACnC,SAAOA,EAAW,WAAW;AAC/B;"}
1
+ {"version":3,"file":"address-autocomplete-CT-9AOli.js","sources":["../../src/components/address-autocomplete/parse-address.ts","../../src/components/address-autocomplete/address-autocomplete.tsx"],"sourcesContent":["/* ------------------------------------------------------------------ */\n/* parse-address — pure mapper from Google address components to the */\n/* kit's StructuredAddress shape. */\n/* */\n/* Kept dependency-free and side-effect-free so it can be unit-tested */\n/* in isolation (no Google SDK, no DOM) and reused by the mock-mode */\n/* story/test fixtures. Accepts the loosened component shape produced */\n/* by BOTH the new Places API (`Place.addressComponents` → */\n/* `{ longText, shortText, types }`) and the classic Geocoder/ */\n/* PlacesService shape (`{ long_name, short_name, types }`) so the */\n/* component can fall back without re-shaping upstream. */\n/* ------------------------------------------------------------------ */\n\n/**\n * Structured, app-friendly address. Field semantics match the AlfaDocs\n * Italian patient-address model: `province` is the 2-letter IT province\n * code (UPPERCASED) and `country` is the ISO 3166-1 alpha-2 code\n * (lowercased), matching how the platform stores them.\n */\nexport interface StructuredAddress {\n /** Street line — route, with the street number joined when present. */\n street: string;\n /** Town / city (locality, falling back to postal_town / admin level 3). */\n city: string;\n /** Postal / ZIP code. */\n postcode: string;\n /** Province — admin level 2 short code, UPPERCASED (e.g. \"MI\", \"RM\"). */\n province: string;\n /** Country — ISO alpha-2, lowercased (e.g. \"it\", \"gb\"). */\n country: string;\n /** Google's human-readable formatted address (whole line). */\n formatted: string;\n}\n\n/**\n * Loosened address-component shape accepted by {@link parseAddressComponents}.\n * Mirrors both Places-API (`longText`/`shortText`) and classic Geocoder\n * (`long_name`/`short_name`) field names so either source parses without a\n * pre-pass. `types` is required; the text fields are individually optional.\n */\nexport interface RawAddressComponent {\n types: string[];\n longText?: string | null;\n shortText?: string | null;\n long_name?: string | null;\n short_name?: string | null;\n}\n\nfunction longTextOf(component: RawAddressComponent): string {\n return component.longText ?? component.long_name ?? '';\n}\n\nfunction shortTextOf(component: RawAddressComponent): string {\n return component.shortText ?? component.short_name ?? longTextOf(component);\n}\n\nfunction findByType(\n components: readonly RawAddressComponent[],\n type: string,\n): RawAddressComponent | undefined {\n return components.find((component) => component.types.includes(type));\n}\n\n/**\n * Maps an array of Google address components to a {@link StructuredAddress}.\n *\n * Pure: no SDK calls, no DOM, no I/O. `formatted` is passed through from the\n * caller (Google's `formattedAddress` / `formatted_address`) because it is\n * not derivable from the component list.\n *\n * Mapping rules:\n * - `street` = `route`, prefixed with `street_number` when present\n * (e.g. \"Via Roma 12\"). Either part alone is used if the\n * other is missing.\n * - `city` = `locality`, falling back to `postal_town`, then\n * `administrative_area_level_3`.\n * - `postcode` = `postal_code`.\n * - `province` = `administrative_area_level_2` SHORT text, UPPERCASED.\n * - `country` = `country` SHORT text (ISO alpha-2), lowercased.\n */\nexport function parseAddressComponents(\n components: readonly RawAddressComponent[],\n formatted = '',\n): StructuredAddress {\n const route = findByType(components, 'route');\n const streetNumber = findByType(components, 'street_number');\n const locality = findByType(components, 'locality');\n const postalTown = findByType(components, 'postal_town');\n const adminLevel3 = findByType(components, 'administrative_area_level_3');\n const postalCode = findByType(components, 'postal_code');\n const adminLevel2 = findByType(components, 'administrative_area_level_2');\n const country = findByType(components, 'country');\n\n const routeText = route ? longTextOf(route) : '';\n const numberText = streetNumber ? longTextOf(streetNumber) : '';\n const street = [routeText, numberText].filter(Boolean).join(' ').trim();\n\n const cityComponent = locality ?? postalTown ?? adminLevel3;\n const city = cityComponent ? longTextOf(cityComponent) : '';\n\n const postcode = postalCode ? longTextOf(postalCode) : '';\n\n const province = adminLevel2 ? shortTextOf(adminLevel2).toUpperCase() : '';\n\n const countryCode = country ? shortTextOf(country).toLowerCase() : '';\n\n return {\n street,\n city,\n postcode,\n province,\n country: countryCode,\n formatted,\n };\n}\n","/// <reference types=\"google.maps\" />\n/* ------------------------------------------------------------------ */\n/* AddressAutocomplete — single-line address field with Google Places */\n/* suggestions, surfaced as an accessible combobox + listbox. */\n/* */\n/* - Wraps the Google Maps JS API on demand via the library's */\n/* `APIProvider`; the consumer supplies `apiKey` (never cached by the */\n/* kit, same contract as MapView). NO `<Map>` is rendered — only the */\n/* `places` library is loaded via `useMapsLibrary(\"places\")`. */\n/* - NO consent gate (unlike MapView): the consumer guarantees consent */\n/* upstream before mounting this field. */\n/* - Prefers the NEW Places API */\n/* (`AutocompleteSuggestion.fetchAutocompleteSuggestions` for */\n/* predictions + `Place.fetchFields([\"addressComponents\", …])` for */\n/* details). Falls back to the classic `AutocompleteService` + */\n/* `PlacesService` when the new classes are unavailable in the loaded */\n/* SDK version. */\n/* - NO-KEY / no-library fallback: when `apiKey` is absent (and no */\n/* `getSuggestions` injector is given), renders a plain themed text */\n/* input so the field never hard-fails. */\n/* - MOCK mode: pass `getSuggestions` to drive the listbox from a */\n/* static list (each carrying a pre-parsed `StructuredAddress`) — no */\n/* real Google call. Used by stories/tests. */\n/* ------------------------------------------------------------------ */\n\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type FocusEvent,\n type ForwardedRef,\n type KeyboardEvent,\n type ReactNode,\n} from 'react';\nimport { cva } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { APIProvider, useMapsLibrary } from '@vis.gl/react-google-maps';\nimport { MapPin } from 'lucide-react';\nimport { useFormField } from '../form-field/form-field-context';\nimport { composeRefs } from '../_shared/compose-refs';\nimport { useControllableState } from '../../hooks/use-controllable-state';\nimport { useDebouncedCallback } from '../_shared/use-debounced-callback';\nimport {\n INPUT_SURFACE_CHROME,\n INPUT_SURFACE_HEIGHT,\n INPUT_SURFACE_TEXT,\n INPUT_SURFACE_TONE,\n} from '../_shared/input-surface';\nimport {\n parseAddressComponents,\n type StructuredAddress,\n type RawAddressComponent,\n} from './parse-address';\n\nexport type { StructuredAddress, RawAddressComponent };\n\n/* ------------------------------------------------------------------ */\n/* Suggestion shape */\n/* ------------------------------------------------------------------ */\n\n/**\n * A single address suggestion surfaced in the listbox.\n *\n * `placeId` keys the row and (in real Google mode) is used to fetch full\n * details on selection. In MOCK mode the suggestion carries a pre-parsed\n * `address` so selection resolves without any network call.\n */\nexport interface AddressSuggestion {\n /** Stable id — the Google place id, or any unique string in mock mode. */\n placeId: string;\n /** Primary line shown in the row (e.g. \"Via Roma 12\"). */\n primaryText: string;\n /** Secondary line shown muted under the primary (e.g. \"Milan, Italy\"). */\n secondaryText?: string;\n /**\n * Pre-parsed structured address. Required in MOCK mode (so selection can\n * resolve without Google). In real Google mode this is omitted and the\n * details are fetched on selection.\n */\n address?: StructuredAddress;\n}\n\n/**\n * Test/story injector. Given the current query it returns the suggestions\n * to show. Each returned suggestion MUST carry a pre-parsed `address` so\n * selection resolves without a real Google call.\n */\nexport type GetSuggestions = (\n query: string,\n) => AddressSuggestion[] | Promise<AddressSuggestion[]>;\n\n/* ------------------------------------------------------------------ */\n/* Props */\n/* ------------------------------------------------------------------ */\n\nexport interface AddressAutocompleteProps {\n /**\n * Google Maps JS API key. Consumer-owned; never cached by the kit. When\n * absent (and no `getSuggestions` injector is given) the field degrades\n * to a plain free-text input with no suggestions.\n */\n apiKey?: string;\n /** Controlled text value of the input. */\n value?: string;\n /** Fires on every keystroke with the new input text. */\n onValueChange?: (value: string) => void;\n /** Uncontrolled initial text. Ignored once `value` is set. */\n defaultValue?: string;\n /**\n * Fires when the user picks a suggestion, with the parsed structured\n * address. In real Google mode the details are fetched first, so this\n * is async relative to the click.\n */\n onSelect?: (address: StructuredAddress) => void;\n /**\n * Test-only / mock injector. When provided, the listbox is driven from\n * its return value instead of a real Google call — even when `apiKey` is\n * also set (the injector wins, so stories/tests are deterministic).\n */\n getSuggestions?: GetSuggestions;\n /**\n * Restrict predictions to these CLDR region codes (e.g. `['it']`).\n * Real-Google mode only.\n */\n regionCodes?: string[];\n /** Visible label is owned by a wrapping FormField; this is a fallback name. */\n 'aria-label'?: string;\n /** Placeholder text. Falls back to the translated default. */\n placeholder?: string;\n /** Debounce before firing a suggestion fetch. Default 250ms. */\n debounceMs?: number;\n disabled?: boolean;\n required?: boolean;\n readOnly?: boolean;\n name?: string;\n /** Field id. Falls back to FormField context id. */\n id?: string;\n size?: 'sm' | 'md' | 'lg';\n tone?: 'default' | 'error';\n className?: string;\n}\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst wrapperVariants = cva(\n ['ds:flex ds:w-full ds:items-center', INPUT_SURFACE_CHROME].join(' '),\n {\n variants: {\n size: {\n sm: `${INPUT_SURFACE_HEIGHT.sm} ${INPUT_SURFACE_TEXT.sm}`,\n md: `${INPUT_SURFACE_HEIGHT.md} ${INPUT_SURFACE_TEXT.md}`,\n lg: `${INPUT_SURFACE_HEIGHT.lg} ${INPUT_SURFACE_TEXT.lg}`,\n },\n tone: INPUT_SURFACE_TONE,\n },\n defaultVariants: { size: 'md', tone: 'default' },\n },\n);\n\nconst inputVariants = cva(\n [\n 'ds:flex-1 ds:min-w-0 ds:ps-3 ds:pe-3 ds:bg-transparent ds:text-foreground',\n 'ds:placeholder:text-muted-foreground',\n 'ds:outline-none ds:focus:outline-none ds:focus-visible:outline-none',\n 'ds:disabled:cursor-not-allowed ds:read-only:cursor-default',\n ].join(' '),\n);\n\nconst adornmentClasses =\n 'ds:inline-flex ds:items-center ds:shrink-0 ds:ps-3 ds:text-muted-foreground ds:[&_svg]:size-4';\n\nconst listboxVariants = cva(\n [\n 'ds:absolute ds:z-[var(--z-dropdown)] ds:mt-[var(--spacing-2xs)] ds:w-full',\n 'ds:overflow-auto ds:max-h-[18rem]',\n 'ds:rounded-[var(--radius-sm)] ds:border ds:border-border ds:bg-background',\n 'ds:shadow-[var(--shadow-md)] ds:p-[var(--spacing-xs)]',\n ].join(' '),\n);\n\nconst optionVariants = cva(\n [\n 'ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)]',\n 'ds:ps-3 ds:pe-3 ds:py-2 ds:rounded-[var(--radius-sm)]',\n 'ds:cursor-pointer ds:select-none ds:text-foreground',\n 'ds:text-start',\n 'ds:data-[active=true]:bg-primary ds:data-[active=true]:text-primary-foreground',\n 'ds:hover:bg-muted ds:data-[active=true]:hover:bg-primary',\n ].join(' '),\n);\n\nconst messageClasses =\n 'ds:ps-3 ds:pe-3 ds:py-2 type-body-sm ds:text-muted-foreground';\n\n/* ------------------------------------------------------------------ */\n/* Inner: real Google Places engine. */\n/* */\n/* `useMapsLibrary(\"places\")` only resolves inside an APIProvider tree, */\n/* so this inner component is mounted by the outer wrapper only when an */\n/* apiKey is present and no mock injector is supplied. It owns no UI — */\n/* it renders the shared `<AddressCombobox>` with a `getSuggestions` / */\n/* `resolveSelection` pair wired to the loaded SDK. */\n/* ------------------------------------------------------------------ */\n\ninterface GoogleEngineProps extends Omit<AddressAutocompleteProps, 'apiKey'> {\n forwardedRef: ForwardedRef<HTMLInputElement>;\n}\n\nfunction GooglePlacesEngine({\n forwardedRef,\n regionCodes,\n onSelect,\n ...rest\n}: GoogleEngineProps): ReactNode {\n const places = useMapsLibrary('places');\n // A fresh session token groups the query + selection phases for billing.\n // Reset after each selection so the next lookup starts a new session.\n const sessionTokenRef =\n useRef<google.maps.places.AutocompleteSessionToken | null>(null);\n\n const supportsNewApi = Boolean(\n places &&\n 'AutocompleteSuggestion' in places &&\n 'Place' in places &&\n 'AutocompleteSessionToken' in places,\n );\n\n const getSuggestions = useCallback<GetSuggestions>(\n async (query) => {\n if (!places || query.trim().length === 0) return [];\n\n if (supportsNewApi) {\n if (!sessionTokenRef.current) {\n sessionTokenRef.current = new places.AutocompleteSessionToken();\n }\n const { suggestions } =\n await places.AutocompleteSuggestion.fetchAutocompleteSuggestions({\n input: query,\n sessionToken: sessionTokenRef.current,\n includedRegionCodes: regionCodes,\n });\n return suggestions\n .map((suggestion): AddressSuggestion | null => {\n const prediction = suggestion.placePrediction;\n if (!prediction) return null;\n return {\n placeId: prediction.placeId,\n primaryText: prediction.mainText?.text ?? prediction.text.text,\n secondaryText: prediction.secondaryText?.text,\n };\n })\n .filter((value): value is AddressSuggestion => value !== null);\n }\n\n // Classic fallback — AutocompleteService.getPlacePredictions.\n const ServiceCtor = (\n places as unknown as {\n AutocompleteService?: new () => google.maps.places.AutocompleteService;\n }\n ).AutocompleteService;\n if (!ServiceCtor) return [];\n const service = new ServiceCtor();\n const response = await service.getPlacePredictions({ input: query });\n return response.predictions.map((prediction) => ({\n placeId: prediction.place_id,\n primaryText:\n prediction.structured_formatting?.main_text ?? prediction.description,\n secondaryText: prediction.structured_formatting?.secondary_text,\n }));\n },\n [places, supportsNewApi, regionCodes],\n );\n\n const resolveSelection = useCallback(\n async (\n suggestion: AddressSuggestion,\n ): Promise<StructuredAddress | null> => {\n if (suggestion.address) return suggestion.address;\n if (!places) return null;\n\n if (supportsNewApi) {\n const place = new places.Place({ id: suggestion.placeId });\n const { place: filled } = await place.fetchFields({\n fields: ['addressComponents', 'formattedAddress'],\n });\n // End the billing session once details are fetched.\n sessionTokenRef.current = null;\n const components = (filled.addressComponents ??\n []) as unknown as RawAddressComponent[];\n return parseAddressComponents(\n components,\n filled.formattedAddress ?? '',\n );\n }\n\n // Classic fallback — PlacesService.getDetails. Requires a DOM node to\n // host the service (an offscreen div suffices; nothing is rendered).\n const ServiceCtor = (\n places as unknown as {\n PlacesService?: new (\n container: HTMLElement,\n ) => google.maps.places.PlacesService;\n }\n ).PlacesService;\n if (!ServiceCtor) return null;\n const service = new ServiceCtor(document.createElement('div'));\n return new Promise<StructuredAddress | null>((resolve) => {\n service.getDetails(\n {\n placeId: suggestion.placeId,\n fields: ['address_components', 'formatted_address'],\n },\n (result) => {\n if (!result) {\n resolve(null);\n return;\n }\n const components = (result.address_components ??\n []) as unknown as RawAddressComponent[];\n resolve(\n parseAddressComponents(\n components,\n result.formatted_address ?? '',\n ),\n );\n },\n );\n });\n },\n [places, supportsNewApi],\n );\n\n return (\n <AddressCombobox\n {...rest}\n forwardedRef={forwardedRef}\n getSuggestions={getSuggestions}\n resolveSelection={resolveSelection}\n onSelect={onSelect}\n />\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Inner: the accessible combobox itself. */\n/* */\n/* Implements the WAI-ARIA 1.2 combobox pattern (text input + listbox */\n/* popup, `aria-activedescendant`). Shared by mock mode, no-key mode, */\n/* and the Google engine — only the `getSuggestions` / `resolveSelection`*/\n/* pair differs. */\n/* ------------------------------------------------------------------ */\n\ninterface AddressComboboxProps extends Omit<\n AddressAutocompleteProps,\n 'apiKey' | 'getSuggestions'\n> {\n forwardedRef?: ForwardedRef<HTMLInputElement>;\n getSuggestions?: GetSuggestions;\n resolveSelection?: (\n suggestion: AddressSuggestion,\n ) => Promise<StructuredAddress | null>;\n}\n\nfunction AddressCombobox({\n forwardedRef,\n value,\n defaultValue,\n onValueChange,\n onSelect,\n getSuggestions,\n resolveSelection,\n placeholder,\n debounceMs = 250,\n disabled,\n required,\n readOnly,\n name,\n id,\n size = 'md',\n tone = 'default',\n className,\n 'aria-label': ariaLabel,\n}: AddressComboboxProps): ReactNode {\n const { t } = useTranslation();\n const ctx = useFormField();\n\n // Internal node ref — used for focus() after selection and for the\n // listbox-contains check on blur. Composed with the consumer's\n // forwardRef onto the rendered <input>.\n const inputRef = useRef<HTMLInputElement | null>(null);\n const setInputRef = useMemo(\n () => composeRefs(forwardedRef, inputRef),\n [forwardedRef],\n );\n\n const reactId = useId();\n const idPrefix = id ?? ctx.id ?? reactId;\n const listId = `${idPrefix}-listbox`;\n const liveId = `${idPrefix}-live`;\n const optionId = (placeId: string) => `${idPrefix}-opt-${placeId}`;\n\n const effectiveDisabled = Boolean(ctx.disabled || disabled);\n const effectiveRequired = Boolean(ctx.required || required);\n const effectiveInvalid = ctx.invalid;\n const effectiveTone: 'default' | 'error' = effectiveInvalid ? 'error' : tone;\n const describedBy = ctx.describedBy || undefined;\n\n const [currentValueRaw, commitValue] = useControllableState<string>({\n value,\n defaultValue: defaultValue ?? '',\n onChange: onValueChange,\n });\n const currentValue = currentValueRaw ?? '';\n\n const [open, setOpen] = useState(false);\n const [suggestions, setSuggestions] = useState<AddressSuggestion[]>([]);\n const [loading, setLoading] = useState(false);\n const [activeIndex, setActiveIndex] = useState(-1);\n\n const composingRef = useRef(false);\n const latestQueryRef = useRef('');\n\n const resolvedPlaceholder =\n placeholder ?? t('inputs.addressAutocomplete.placeholder');\n\n const runFetch = useCallback(\n (query: string) => {\n if (!getSuggestions || effectiveDisabled || readOnly) return;\n if (composingRef.current) return;\n latestQueryRef.current = query;\n setLoading(true);\n Promise.resolve(getSuggestions(query))\n .then((results) => {\n // Drop stale responses — only the latest query may render.\n if (latestQueryRef.current !== query) return;\n setSuggestions(results);\n setActiveIndex(-1);\n setLoading(false);\n })\n .catch(() => {\n if (latestQueryRef.current !== query) return;\n setSuggestions([]);\n setLoading(false);\n });\n },\n [getSuggestions, effectiveDisabled, readOnly],\n );\n\n const debouncedFetch = useDebouncedCallback(runFetch, debounceMs);\n\n useEffect(() => () => debouncedFetch.cancel(), [debouncedFetch]);\n\n const handleInputChange = (next: string) => {\n commitValue(next);\n if (effectiveDisabled || readOnly) return;\n if (!open) setOpen(true);\n if (composingRef.current) return;\n debouncedFetch(next);\n };\n\n const handleSelect = useCallback(\n (suggestion: AddressSuggestion) => {\n commitValue(suggestion.primaryText);\n setOpen(false);\n setActiveIndex(-1);\n setSuggestions([]);\n latestQueryRef.current = suggestion.primaryText;\n if (resolveSelection) {\n Promise.resolve(resolveSelection(suggestion))\n .then((address) => {\n if (address) onSelect?.(address);\n })\n .catch(() => {\n /* selection details failed — leave the typed text in place */\n });\n } else if (suggestion.address) {\n onSelect?.(suggestion.address);\n }\n inputRef.current?.focus();\n },\n [commitValue, resolveSelection, onSelect, inputRef],\n );\n\n // Whether the listbox popup is actually displayed (mirrors `aria-expanded`\n // on the input). Derived here — above the keyboard handler — so an expanded\n // listbox can swallow Enter instead of letting it submit a surrounding\n // <form>.\n const showEmpty =\n open &&\n !loading &&\n currentValue.trim().length > 0 &&\n suggestions.length === 0 &&\n Boolean(getSuggestions);\n const hasOptions = suggestions.length > 0;\n const listboxOpen = open && (hasOptions || showEmpty || loading);\n\n const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.nativeEvent.isComposing) return;\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n if (!open) {\n setOpen(true);\n if (currentValue) debouncedFetch(currentValue);\n return;\n }\n if (suggestions.length === 0) return;\n setActiveIndex((index) => (index + 1) % suggestions.length);\n return;\n }\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n if (suggestions.length === 0) return;\n setActiveIndex((index) =>\n index <= 0 ? suggestions.length - 1 : index - 1,\n );\n return;\n }\n if (event.key === 'Enter') {\n // While the listbox is expanded, swallow Enter so it never submits the\n // surrounding <form>. Accept the highlighted option if there is one;\n // otherwise keep the typed text (blur / Escape dismiss the listbox).\n if (listboxOpen) {\n event.preventDefault();\n if (activeIndex >= 0 && suggestions[activeIndex]) {\n handleSelect(suggestions[activeIndex]);\n }\n }\n return;\n }\n if (event.key === 'Escape') {\n if (open) {\n event.preventDefault();\n setOpen(false);\n setActiveIndex(-1);\n }\n }\n };\n\n const handleFocus = () => {\n if (effectiveDisabled || readOnly) return;\n if (currentValue) {\n setOpen(true);\n debouncedFetch(currentValue);\n }\n };\n\n const handleBlur = (event: FocusEvent<HTMLInputElement>) => {\n // Keep open when focus moves into the listbox (pointer-down on an option).\n const next = event.relatedTarget as Node | null;\n if (next && listRef.current?.contains(next)) return;\n setOpen(false);\n setActiveIndex(-1);\n };\n\n const listRef = useRef<HTMLUListElement | null>(null);\n\n const activeDescendant =\n open && activeIndex >= 0 && suggestions[activeIndex]\n ? optionId(suggestions[activeIndex].placeId)\n : undefined;\n\n const liveMessage = loading\n ? t('inputs.addressAutocomplete.loading')\n : open && currentValue.trim().length > 0\n ? t('inputs.addressAutocomplete.results', { count: suggestions.length })\n : '';\n\n return (\n <div\n className=\"ds:relative ds:w-full\"\n data-component=\"address-autocomplete\"\n data-component-id={id}\n >\n <div\n className={wrapperVariants({ size, tone: effectiveTone, className })}\n data-disabled={effectiveDisabled || undefined}\n >\n <span aria-hidden=\"true\" className={adornmentClasses}>\n <MapPin />\n </span>\n <input\n ref={setInputRef}\n id={idPrefix}\n name={name}\n type=\"text\"\n autoComplete=\"off\"\n role=\"combobox\"\n aria-autocomplete=\"list\"\n aria-expanded={listboxOpen}\n aria-controls={listboxOpen ? listId : undefined}\n aria-activedescendant={activeDescendant}\n aria-describedby={describedBy}\n aria-invalid={effectiveInvalid || undefined}\n aria-label={ariaLabel ?? t('inputs.addressAutocomplete.ariaLabel')}\n placeholder={resolvedPlaceholder}\n value={currentValue}\n disabled={effectiveDisabled}\n required={effectiveRequired}\n readOnly={readOnly}\n onChange={(event) => handleInputChange(event.target.value)}\n onKeyDown={handleKeyDown}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onCompositionStart={() => {\n composingRef.current = true;\n }}\n onCompositionEnd={(event) => {\n composingRef.current = false;\n debouncedFetch(event.currentTarget.value);\n }}\n className={inputVariants()}\n />\n </div>\n {listboxOpen ? (\n <ul\n ref={listRef}\n id={listId}\n role=\"listbox\"\n aria-label={ariaLabel ?? t('inputs.addressAutocomplete.listLabel')}\n className={listboxVariants()}\n >\n {hasOptions\n ? suggestions.map((suggestion, index) => (\n <li\n key={suggestion.placeId}\n id={optionId(suggestion.placeId)}\n role=\"option\"\n aria-selected={index === activeIndex}\n data-active={index === activeIndex || undefined}\n // Pointer-down (not click) so selection runs before the\n // input's blur closes the listbox.\n onMouseDown={(event) => {\n event.preventDefault();\n handleSelect(suggestion);\n }}\n onMouseEnter={() => setActiveIndex(index)}\n className={optionVariants()}\n >\n <span className=\"ds:truncate\">{suggestion.primaryText}</span>\n {suggestion.secondaryText ? (\n <span className=\"type-meta ds:text-muted-foreground ds:data-[active=true]:text-primary-foreground ds:truncate\">\n {suggestion.secondaryText}\n </span>\n ) : null}\n </li>\n ))\n : null}\n {!hasOptions && loading ? (\n <li role=\"presentation\" className={messageClasses}>\n {t('inputs.addressAutocomplete.loading')}\n </li>\n ) : null}\n {!hasOptions && !loading && showEmpty ? (\n <li role=\"presentation\" className={messageClasses}>\n {t('inputs.addressAutocomplete.noResults')}\n </li>\n ) : null}\n </ul>\n ) : null}\n <span\n id={liveId}\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n className=\"ds:sr-only\"\n >\n {liveMessage}\n </span>\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Public component */\n/* ------------------------------------------------------------------ */\n\nexport const AddressAutocomplete = forwardRef<\n HTMLInputElement,\n AddressAutocompleteProps\n>(function AddressAutocomplete({ apiKey, getSuggestions, ...rest }, ref) {\n const { i18n } = useTranslation();\n\n // MOCK mode wins whenever a `getSuggestions` injector is supplied — even if\n // an apiKey is also present — so stories/tests stay deterministic and never\n // hit the network. The mock injector already carries pre-parsed addresses,\n // so selection resolves straight from the suggestion.\n if (getSuggestions) {\n return (\n <AddressCombobox\n {...rest}\n forwardedRef={ref}\n getSuggestions={getSuggestions}\n resolveSelection={resolveMockSelection}\n />\n );\n }\n\n // NO-KEY fallback — plain free-text input, no suggestions, never fails.\n if (!apiKey) {\n return <AddressCombobox {...rest} forwardedRef={ref} />;\n }\n\n return (\n <APIProvider apiKey={apiKey} language={i18n.language}>\n <GooglePlacesEngine {...rest} forwardedRef={ref} />\n </APIProvider>\n );\n});\nAddressAutocomplete.displayName = 'AddressAutocomplete';\n\n// Module-scoped so the mock branch passes a stable function identity.\nasync function resolveMockSelection(\n suggestion: AddressSuggestion,\n): Promise<StructuredAddress | null> {\n return suggestion.address ?? null;\n}\n"],"names":["longTextOf","component","shortTextOf","findByType","components","type","parseAddressComponents","formatted","route","streetNumber","locality","postalTown","adminLevel3","postalCode","adminLevel2","country","routeText","numberText","street","cityComponent","city","postcode","province","countryCode","wrapperVariants","cva","INPUT_SURFACE_CHROME","INPUT_SURFACE_HEIGHT","INPUT_SURFACE_TEXT","INPUT_SURFACE_TONE","inputVariants","adornmentClasses","listboxVariants","optionVariants","messageClasses","GooglePlacesEngine","forwardedRef","regionCodes","onSelect","rest","places","useMapsLibrary","sessionTokenRef","useRef","supportsNewApi","getSuggestions","useCallback","query","suggestions","suggestion","prediction","_a","_b","value","ServiceCtor","resolveSelection","place","filled","service","resolve","result","jsx","AddressCombobox","defaultValue","onValueChange","placeholder","debounceMs","disabled","required","readOnly","name","id","size","tone","className","ariaLabel","t","useTranslation","ctx","useFormField","inputRef","setInputRef","useMemo","composeRefs","reactId","useId","idPrefix","listId","liveId","optionId","placeId","effectiveDisabled","effectiveRequired","effectiveInvalid","effectiveTone","describedBy","currentValueRaw","commitValue","useControllableState","currentValue","open","setOpen","useState","setSuggestions","loading","setLoading","activeIndex","setActiveIndex","composingRef","latestQueryRef","resolvedPlaceholder","runFetch","results","debouncedFetch","useDebouncedCallback","useEffect","handleInputChange","next","handleSelect","address","showEmpty","hasOptions","listboxOpen","handleKeyDown","event","index","handleFocus","handleBlur","listRef","activeDescendant","liveMessage","jsxs","MapPin","AddressAutocomplete","forwardRef","apiKey","ref","i18n","resolveMockSelection","APIProvider"],"mappings":"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"}
@@ -1,11 +1,12 @@
1
- import { jsx as e, jsxs as c } from "react/jsx-runtime";
1
+ import { jsx as a, jsxs as c } from "react/jsx-runtime";
2
2
  import { forwardRef as v } from "react";
3
3
  import { c as h } from "./index-D2ZczOXr.js";
4
4
  import { useTranslation as b } from "react-i18next";
5
5
  import { A as x } from "./avatar-BNQNhoyL.js";
6
6
  import { B as y } from "./badge-zsf5i5bH.js";
7
- import { C as N } from "./chevron-right-BrpYejk0.js";
8
- const C = h(
7
+ import { i as N } from "./is-safe-url-DkETxeHz.js";
8
+ import { C } from "./chevron-right-BrpYejk0.js";
9
+ const w = h(
9
10
  [
10
11
  "ds:relative ds:flex ds:items-center ds:gap-[var(--spacing-sm)]",
11
12
  "ds:rounded-[var(--radius-sm)]",
@@ -39,44 +40,40 @@ const C = h(
39
40
  "ds:focus-visible:after:outline-[color:var(--ring)]",
40
41
  "ds:focus-visible:after:outline-offset-[length:var(--focus-ring-offset)]",
41
42
  "ds:forced-colors:focus-visible:after:outline-[CanvasText]"
42
- ].join(" ");
43
- function w(s) {
44
- return /^(https?:\/\/(?!\/)|\/(?!\/)|#)/.test(s);
45
- }
46
- const k = {
43
+ ].join(" "), k = {
47
44
  confirmed: "success",
48
45
  pending: "warning",
49
46
  cancelled: "error"
50
47
  }, T = v(
51
- ({ item: s, size: o = "sm", onActivate: a, className: f, ...m }, p) => {
52
- const { t: i } = b(), r = !!a, g = !!s.url && w(s.url), l = i("agendaCard.itemLabel", {
48
+ ({ item: s, size: o = "sm", onActivate: e, className: f, ...m }, p) => {
49
+ const { t: i } = b(), r = !!e, g = !!s.url && N(s.url), l = i("agendaCard.itemLabel", {
53
50
  time: s.time,
54
51
  patient: s.patient.name,
55
52
  treatment: s.treatment ?? "",
56
53
  defaultValue: '{{time}} · {{patient}}{{treatment, prepend, " · "}}'
57
- }), d = /* @__PURE__ */ e("span", { className: "ds:flex-1 ds:min-w-0 ds:truncate type-body-sm ds:text-[color:var(--foreground)]", children: s.patient.name });
54
+ }), n = /* @__PURE__ */ a("span", { className: "ds:flex-1 ds:min-w-0 ds:truncate type-body-sm ds:text-[color:var(--foreground)]", children: s.patient.name });
58
55
  let t;
59
- return r && g ? t = /* @__PURE__ */ e(
56
+ return r && g ? t = /* @__PURE__ */ a(
60
57
  "a",
61
58
  {
62
59
  href: s.url,
63
60
  "aria-label": l,
64
61
  className: u + " ds:contents",
65
- onClick: (n) => {
66
- n.defaultPrevented || n.metaKey || n.ctrlKey || n.shiftKey || a == null || a(s);
62
+ onClick: (d) => {
63
+ d.defaultPrevented || d.metaKey || d.ctrlKey || d.shiftKey || e == null || e(s);
67
64
  },
68
- children: d
65
+ children: n
69
66
  }
70
- ) : r ? t = /* @__PURE__ */ e(
67
+ ) : r ? t = /* @__PURE__ */ a(
71
68
  "button",
72
69
  {
73
70
  type: "button",
74
71
  "aria-label": l,
75
72
  className: u + " ds:contents ds:bg-transparent ds:border-0 ds:p-0 ds:text-start",
76
- onClick: () => a == null ? void 0 : a(s),
77
- children: d
73
+ onClick: () => e == null ? void 0 : e(s),
74
+ children: n
78
75
  }
79
- ) : t = d, /* @__PURE__ */ c(
76
+ ) : t = n, /* @__PURE__ */ c(
80
77
  "div",
81
78
  {
82
79
  ref: p,
@@ -84,10 +81,10 @@ const k = {
84
81
  "data-component": "agenda-card",
85
82
  "data-component-id": s.id,
86
83
  "data-status": s.status ?? "confirmed",
87
- className: C({ size: o, interactive: r, className: f }),
84
+ className: w({ size: o, interactive: r, className: f }),
88
85
  ...m,
89
86
  children: [
90
- /* @__PURE__ */ e(
87
+ /* @__PURE__ */ a(
91
88
  "span",
92
89
  {
93
90
  "aria-hidden": "true",
@@ -95,7 +92,7 @@ const k = {
95
92
  children: s.time
96
93
  }
97
94
  ),
98
- /* @__PURE__ */ e(
95
+ /* @__PURE__ */ a(
99
96
  x,
100
97
  {
101
98
  name: s.patient.name,
@@ -109,9 +106,9 @@ const k = {
109
106
  ),
110
107
  /* @__PURE__ */ c("div", { className: "ds:flex-1 ds:min-w-0 ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)]", children: [
111
108
  t,
112
- s.treatment ? /* @__PURE__ */ e("span", { className: "type-eyebrow ds:text-[color:var(--muted-foreground)] ds:truncate", children: s.treatment }) : null
109
+ s.treatment ? /* @__PURE__ */ a("span", { className: "type-eyebrow ds:text-[color:var(--muted-foreground)] ds:truncate", children: s.treatment }) : null
113
110
  ] }),
114
- s.status && s.status !== "confirmed" ? /* @__PURE__ */ e(
111
+ s.status && s.status !== "confirmed" ? /* @__PURE__ */ a(
115
112
  y,
116
113
  {
117
114
  variant: k[s.status],
@@ -121,8 +118,8 @@ const k = {
121
118
  children: i(`agendaCard.status.${s.status}`, s.status)
122
119
  }
123
120
  ) : null,
124
- r ? /* @__PURE__ */ e(
125
- N,
121
+ r ? /* @__PURE__ */ a(
122
+ C,
126
123
  {
127
124
  "aria-hidden": "true",
128
125
  className: "ds:size-4 ds:shrink-0 ds:text-[color:var(--muted-foreground)] ds:opacity-0 ds:transition-opacity ds:motion-reduce:transition-none ds:group-hover:opacity-100 ds:group-focus-within:opacity-100 ds:rtl:rotate-180"
@@ -135,7 +132,6 @@ const k = {
135
132
  );
136
133
  T.displayName = "AgendaCard";
137
134
  export {
138
- T as A,
139
- w as i
135
+ T as A
140
136
  };
141
- //# sourceMappingURL=agenda-card-CFyWSX7Z.js.map
137
+ //# sourceMappingURL=agenda-card-BaSfVfrL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agenda-card-BaSfVfrL.js","sources":["../../src/components/agenda-card/agenda-card.tsx"],"sourcesContent":["import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { ChevronRight } from 'lucide-react';\nimport { Avatar } from '../avatar/avatar';\nimport { Badge } from '../badge/badge';\nimport { isSafeEntityUrl } from '../_shared/is-safe-url';\n\n// Back-compat alias — the URL guard now lives in the shared entity-card\n// helper. Existing consumers (and this dir's tests) import isSafeAgendaUrl.\nexport { isSafeEntityUrl as isSafeAgendaUrl } from '../_shared/is-safe-url';\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\nexport type AppointmentStatus = 'confirmed' | 'pending' | 'cancelled';\n\nexport interface AgendaItem {\n /** Unique identifier for the appointment. */\n id: string;\n /** Display time string (e.g. \"09:00\"). Localised by the consumer. */\n time: string;\n /** Patient identity — drives the avatar's initials + accessible name. */\n patient: { name: string; avatarUrl?: string };\n /** Treatment / appointment type — short localised label. */\n treatment?: string;\n /** Lifecycle state — drives a trailing status chip. */\n status?: AppointmentStatus;\n /** Optional deep link — when present the row is an anchor. */\n url?: string;\n}\n\nexport interface AgendaCardProps\n extends\n Omit<HTMLAttributes<HTMLDivElement>, 'onClick' | 'role' | 'title'>,\n VariantProps<typeof agendaCardVariants> {\n /** The appointment to render. */\n item: AgendaItem;\n /** Visual density. */\n size?: 'sm' | 'md';\n /** Fires when the row is activated. */\n onActivate?: (item: AgendaItem) => void;\n}\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst agendaCardVariants = cva(\n [\n 'ds:relative ds:flex ds:items-center ds:gap-[var(--spacing-sm)]',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:transition-colors',\n 'ds:motion-reduce:transition-none',\n 'ds:text-start ds:group',\n 'ds:forced-colors:border ds:forced-colors:border-[CanvasText]',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:p-[var(--spacing-sm)]',\n md: 'ds:p-[var(--spacing-md)]',\n },\n interactive: {\n true: 'ds:hover:bg-[color:var(--muted)]/40 ds:cursor-pointer',\n false: '',\n },\n },\n defaultVariants: {\n size: 'sm',\n interactive: false,\n },\n },\n);\n\nconst stretchedLinkClass = [\n 'ds:focus-visible:outline-none',\n \"ds:after:content-[''] ds:after:absolute ds:after:inset-0 ds:after:rounded-[var(--radius-sm)]\",\n 'ds:after:pointer-events-auto',\n 'ds:focus-visible:after:outline-[length:var(--focus-ring-width)]',\n 'ds:focus-visible:after:outline-solid',\n 'ds:focus-visible:after:outline-[color:var(--ring)]',\n 'ds:focus-visible:after:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:after:outline-[CanvasText]',\n].join(' ');\n\nconst STATUS_TONE: Record<AppointmentStatus, 'success' | 'warning' | 'error'> =\n {\n confirmed: 'success',\n pending: 'warning',\n cancelled: 'error',\n };\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport const AgendaCard = forwardRef<HTMLDivElement, AgendaCardProps>(\n ({ item, size = 'sm', onActivate, className, ...rest }, ref) => {\n const { t } = useTranslation();\n const interactive = !!onActivate;\n const hasSafeUrl = !!item.url && isSafeEntityUrl(item.url);\n const ariaLabel = t('agendaCard.itemLabel', {\n time: item.time,\n patient: item.patient.name,\n treatment: item.treatment ?? '',\n defaultValue: '{{time}} · {{patient}}{{treatment, prepend, \" · \"}}',\n });\n\n const titleNode = (\n <span className=\"ds:flex-1 ds:min-w-0 ds:truncate type-body-sm ds:text-[color:var(--foreground)]\">\n {item.patient.name}\n </span>\n );\n\n let activator: ReactNode;\n if (interactive && hasSafeUrl) {\n activator = (\n <a\n href={item.url}\n aria-label={ariaLabel}\n className={stretchedLinkClass + ' ds:contents'}\n onClick={(e) => {\n if (e.defaultPrevented || e.metaKey || e.ctrlKey || e.shiftKey)\n return;\n onActivate?.(item);\n }}\n >\n {titleNode}\n </a>\n );\n } else if (interactive) {\n activator = (\n <button\n type=\"button\"\n aria-label={ariaLabel}\n className={\n stretchedLinkClass +\n ' ds:contents ds:bg-transparent ds:border-0 ds:p-0 ds:text-start'\n }\n onClick={() => onActivate?.(item)}\n >\n {titleNode}\n </button>\n );\n } else {\n activator = titleNode;\n }\n\n return (\n <div\n ref={ref}\n role=\"listitem\"\n data-component=\"agenda-card\"\n data-component-id={item.id}\n data-status={item.status ?? 'confirmed'}\n className={agendaCardVariants({ size, interactive, className })}\n {...rest}\n >\n <span\n aria-hidden=\"true\"\n className=\"ds:inline-flex ds:w-12 ds:shrink-0 type-body-sm ds:font-medium ds:text-[color:var(--foreground)] ds:tabular-nums\"\n >\n {item.time}\n </span>\n\n <Avatar\n name={item.patient.name}\n src={item.patient.avatarUrl}\n size={size === 'md' ? 'md' : 'sm'}\n className=\"ds:shrink-0\"\n aria-hidden=\"true\"\n role=\"presentation\"\n aria-label={undefined}\n />\n\n <div className=\"ds:flex-1 ds:min-w-0 ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)]\">\n {activator}\n {item.treatment ? (\n <span className=\"type-eyebrow ds:text-[color:var(--muted-foreground)] ds:truncate\">\n {item.treatment}\n </span>\n ) : null}\n </div>\n\n {item.status && item.status !== 'confirmed' ? (\n <Badge\n variant={STATUS_TONE[item.status]}\n size=\"sm\"\n withDot\n className=\"ds:shrink-0\"\n >\n {t(`agendaCard.status.${item.status}`, item.status)}\n </Badge>\n ) : null}\n\n {interactive ? (\n <ChevronRight\n aria-hidden=\"true\"\n className=\"ds:size-4 ds:shrink-0 ds:text-[color:var(--muted-foreground)] ds:opacity-0 ds:transition-opacity ds:motion-reduce:transition-none ds:group-hover:opacity-100 ds:group-focus-within:opacity-100 ds:rtl:rotate-180\"\n />\n ) : null}\n </div>\n );\n },\n);\n\nAgendaCard.displayName = 'AgendaCard';\n"],"names":["agendaCardVariants","cva","stretchedLinkClass","STATUS_TONE","AgendaCard","forwardRef","item","size","onActivate","className","rest","ref","t","useTranslation","interactive","hasSafeUrl","isSafeEntityUrl","ariaLabel","titleNode","jsx","activator","e","jsxs","Avatar","Badge","ChevronRight"],"mappings":"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"}
@@ -1,32 +1,15 @@
1
1
  import { jsx as a, jsxs as n } from "react/jsx-runtime";
2
- import { forwardRef as R, useRef as f, useImperativeHandle as z, useMemo as C } from "react";
3
- import { c as S } from "./index-D2ZczOXr.js";
4
- import { useTranslation as _ } from "react-i18next";
5
- import { I as j } from "./icon-button-CKEOrN37.js";
6
- import { S as E } from "./skeleton-CZbwyJAA.js";
7
- import { E as P } from "./empty-state-BLy7tigq.js";
8
- import { A as H } from "./agenda-card-CFyWSX7Z.js";
9
- import { u as K } from "./registry-nPAVE19X.js";
10
- import { c as L } from "./createLucideIcon-CrFbzy84.js";
11
- import { P as V } from "./plus-CYKNmfuA.js";
12
- /**
13
- * @license lucide-react v1.8.0 - ISC
14
- *
15
- * This source code is licensed under the ISC license.
16
- * See the LICENSE file in the root directory of this source tree.
17
- */
18
- const q = [
19
- ["path", { d: "M8 2v4", key: "1cmpym" }],
20
- ["path", { d: "M16 2v4", key: "4m81vk" }],
21
- ["rect", { width: "18", height: "18", x: "3", y: "4", rx: "2", key: "1hopcy" }],
22
- ["path", { d: "M3 10h18", key: "8toen8" }],
23
- ["path", { d: "M8 14h.01", key: "6423bh" }],
24
- ["path", { d: "M12 14h.01", key: "1etili" }],
25
- ["path", { d: "M16 14h.01", key: "1gbofw" }],
26
- ["path", { d: "M8 18h.01", key: "lrp35t" }],
27
- ["path", { d: "M12 18h.01", key: "mhygvu" }],
28
- ["path", { d: "M16 18h.01", key: "kzsmim" }]
29
- ], B = L("calendar-days", q), D = {
2
+ import { forwardRef as k, useRef as y, useImperativeHandle as S, useMemo as j } from "react";
3
+ import { c as z } from "./index-D2ZczOXr.js";
4
+ import { useTranslation as E } from "react-i18next";
5
+ import { I as P } from "./icon-button-CKEOrN37.js";
6
+ import { S as _ } from "./skeleton-CZbwyJAA.js";
7
+ import { E as H } from "./empty-state-BLy7tigq.js";
8
+ import { A as K } from "./agenda-card-BaSfVfrL.js";
9
+ import { u as M } from "./registry-nPAVE19X.js";
10
+ import { C as V } from "./calendar-days-C4BmpCZg.js";
11
+ import { P as q } from "./plus-CYKNmfuA.js";
12
+ const B = {
30
13
  id: "agenda-tray",
31
14
  capabilities: ["select_single"],
32
15
  state: {
@@ -34,7 +17,7 @@ const q = [
34
17
  type: "Array<{ id: string; status: string }>",
35
18
  descriptionKey: "ui.agent.agendaTray.state.items",
36
19
  description: "Currently-displayed appointments. Ids + status only — never patient identity.",
37
- read: (t) => t.getItems()
20
+ read: (s) => s.getItems()
38
21
  }
39
22
  },
40
23
  actions: {
@@ -43,8 +26,8 @@ const q = [
43
26
  argsType: "{ id: string }",
44
27
  descriptionKey: "ui.agent.agendaTray.actions.selectItem",
45
28
  description: "Activate the appointment with the given id.",
46
- invoke: (t, s) => {
47
- t.selectItem(s.id);
29
+ invoke: (s, t) => {
30
+ s.selectItem(t.id);
48
31
  }
49
32
  }
50
33
  },
@@ -64,7 +47,7 @@ const q = [
64
47
  description: "Stable appointment id emitted on each rendered AgendaCard inside the tray."
65
48
  }
66
49
  }
67
- }, F = S(
50
+ }, D = z(
68
51
  [
69
52
  "ds:flex ds:flex-col",
70
53
  "ds:rounded-[var(--radius-md)] ds:shadow-[var(--shadow-card)]",
@@ -83,11 +66,11 @@ const q = [
83
66
  size: "sm"
84
67
  }
85
68
  }
86
- ), G = R(
69
+ ), L = k(
87
70
  ({
88
- id: t,
89
- items: s,
90
- title: u,
71
+ id: s,
72
+ items: t,
73
+ title: h,
91
74
  caption: c,
92
75
  size: l = "sm",
93
76
  onOpenAppointment: r,
@@ -95,25 +78,25 @@ const q = [
95
78
  addLabel: v,
96
79
  loading: p = !1,
97
80
  emptyTitle: x,
98
- emptyDescription: k,
99
- className: b,
100
- ...T
81
+ emptyDescription: b,
82
+ className: T,
83
+ ...N
101
84
  }, w) => {
102
- const { t: d } = _(), y = u ?? d("agendaTray.title", "Today's appointments"), N = v ?? d("agendaTray.add", "Add appointment"), I = !p && s.length === 0;
85
+ const { t: d } = E(), g = h ?? d("agendaTray.title", "Today's appointments"), I = v ?? d("agendaTray.add", "Add appointment"), A = !p && t.length === 0;
103
86
  let i;
104
- p ? i = /* @__PURE__ */ a("div", { className: "ds:flex ds:flex-col ds:gap-[var(--spacing-sm)] ds:p-[var(--spacing-sm)]", children: [0, 1, 2].map((e) => /* @__PURE__ */ a(E, { variant: "rectangular", height: "2.5rem" }, e)) }) : I ? i = /* @__PURE__ */ a("div", { className: "ds:p-[var(--spacing-md)]", children: /* @__PURE__ */ a(
105
- P,
87
+ p ? i = /* @__PURE__ */ a("div", { className: "ds:flex ds:flex-col ds:gap-[var(--spacing-sm)] ds:p-[var(--spacing-sm)]", children: [0, 1, 2].map((e) => /* @__PURE__ */ a(_, { variant: "rectangular", height: "2.5rem" }, e)) }) : A ? i = /* @__PURE__ */ a("div", { className: "ds:p-[var(--spacing-md)]", children: /* @__PURE__ */ a(
88
+ H,
106
89
  {
107
90
  variant: "first-use",
108
91
  size: "sm",
109
92
  title: x ?? d("agendaTray.empty.title", "No appointments"),
110
- description: k ?? d(
93
+ description: b ?? d(
111
94
  "agendaTray.empty.description",
112
95
  "New appointments will appear here."
113
96
  )
114
97
  }
115
- ) }) : i = /* @__PURE__ */ a("ul", { className: "ds:flex ds:list-none ds:flex-col", children: s.map((e) => /* @__PURE__ */ a(
116
- H,
98
+ ) }) : i = /* @__PURE__ */ a("ul", { className: "ds:flex ds:list-none ds:flex-col", children: t.map((e) => /* @__PURE__ */ a(
99
+ K,
117
100
  {
118
101
  item: e,
119
102
  size: l,
@@ -122,48 +105,48 @@ const q = [
122
105
  },
123
106
  e.id
124
107
  )) });
125
- const o = f(s);
126
- o.current = s;
127
- const h = f(null);
128
- z(w, () => h.current, []);
129
- const M = C(
108
+ const o = y(t);
109
+ o.current = t;
110
+ const f = y(null);
111
+ S(w, () => f.current, []);
112
+ const C = j(
130
113
  () => ({
131
114
  getItems: () => o.current.map((e) => ({
132
115
  id: e.id,
133
116
  status: e.status ?? "confirmed"
134
117
  })),
135
118
  selectItem: (e) => {
136
- const g = o.current.find((A) => A.id === e);
137
- g && (r == null || r(g));
119
+ const u = o.current.find((R) => R.id === e);
120
+ u && (r == null || r(u));
138
121
  }
139
122
  }),
140
123
  [r]
141
124
  );
142
- return K(D, M, t), /* @__PURE__ */ n(
125
+ return M(B, C, s), /* @__PURE__ */ n(
143
126
  "section",
144
127
  {
145
- ref: h,
146
- "aria-label": y,
128
+ ref: f,
129
+ "aria-label": g,
147
130
  "data-component": "agenda-tray",
148
- "data-component-id": t,
149
- className: F({ size: l, className: b }),
150
- ...T,
131
+ "data-component-id": s,
132
+ className: D({ size: l, className: T }),
133
+ ...N,
151
134
  children: [
152
135
  /* @__PURE__ */ n("header", { className: "ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)] ds:p-[var(--spacing-sm)]", children: [
153
136
  /* @__PURE__ */ n("div", { className: "ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)] ds:min-w-0", children: [
154
137
  /* @__PURE__ */ n("h3", { className: "ds:m-0 ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)] type-title-card", children: [
155
- /* @__PURE__ */ a(B, { "aria-hidden": "true", className: "ds:size-4" }),
156
- y
138
+ /* @__PURE__ */ a(V, { "aria-hidden": "true", className: "ds:size-4" }),
139
+ g
157
140
  ] }),
158
141
  c ? /* @__PURE__ */ a("span", { className: "type-eyebrow ds:text-[color:var(--muted-foreground)]", children: c }) : null
159
142
  ] }),
160
143
  m ? /* @__PURE__ */ a(
161
- j,
144
+ P,
162
145
  {
163
- icon: /* @__PURE__ */ a(V, {}),
146
+ icon: /* @__PURE__ */ a(q, {}),
164
147
  intent: "outline",
165
148
  size: "sm",
166
- "aria-label": N,
149
+ "aria-label": I,
167
150
  onClick: m
168
151
  }
169
152
  ) : null
@@ -174,9 +157,9 @@ const q = [
174
157
  );
175
158
  }
176
159
  );
177
- G.displayName = "AgendaTray";
160
+ L.displayName = "AgendaTray";
178
161
  export {
179
- G as A,
180
- D as a
162
+ L as A,
163
+ B as a
181
164
  };
182
- //# sourceMappingURL=agenda-tray-Dyj9ChHC.js.map
165
+ //# sourceMappingURL=agenda-tray-DQayYmQ0.js.map