@alfadocs/ui-kit-debug 1.52.0 → 1.53.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 (474) hide show
  1. package/dist/_chunks/{address-autocomplete-BVLoHU3E.js → address-autocomplete-Bp816Mb1.js} +2 -2
  2. package/dist/_chunks/{address-autocomplete-BVLoHU3E.js.map → address-autocomplete-Bp816Mb1.js.map} +1 -1
  3. package/dist/_chunks/{address-fields-UiEXHxEX.js → address-fields-BIL6cvLS.js} +2 -2
  4. package/dist/_chunks/{address-fields-UiEXHxEX.js.map → address-fields-BIL6cvLS.js.map} +1 -1
  5. package/dist/_chunks/{agenda-tray-C-_iu6Fo.js → agenda-tray-C2a8OfKC.js} +2 -2
  6. package/dist/_chunks/{agenda-tray-C-_iu6Fo.js.map → agenda-tray-C2a8OfKC.js.map} +1 -1
  7. package/dist/_chunks/{anamnesis-summary-rows-DaSoA80I.js → anamnesis-summary-rows-CnHxtht-.js} +3 -3
  8. package/dist/_chunks/{anamnesis-summary-rows-DaSoA80I.js.map → anamnesis-summary-rows-CnHxtht-.js.map} +1 -1
  9. package/dist/_chunks/apexcharts-theme-DNoXvgnZ.js +105 -0
  10. package/dist/_chunks/apexcharts-theme-DNoXvgnZ.js.map +1 -0
  11. package/dist/_chunks/{appointment-timeline-BZErHbD1.js → appointment-timeline-By-EwmJU.js} +2 -2
  12. package/dist/_chunks/{appointment-timeline-BZErHbD1.js.map → appointment-timeline-By-EwmJU.js.map} +1 -1
  13. package/dist/_chunks/{appointment-tray-DR_Zm4Gw.js → appointment-tray-7Z3A3Xz9.js} +2 -2
  14. package/dist/_chunks/{appointment-tray-DR_Zm4Gw.js.map → appointment-tray-7Z3A3Xz9.js.map} +1 -1
  15. package/dist/_chunks/{balance-badge-cell-CS-iKkLM.js → balance-badge-cell-BtiFfFRY.js} +2 -2
  16. package/dist/_chunks/{balance-badge-cell-CS-iKkLM.js.map → balance-badge-cell-BtiFfFRY.js.map} +1 -1
  17. package/dist/_chunks/{booking-DP543-BT.js → booking-CFR7vU8X.js} +3 -3
  18. package/dist/_chunks/{booking-DP543-BT.js.map → booking-CFR7vU8X.js.map} +1 -1
  19. package/dist/_chunks/{calendar-workspace-B9MKJXER.js → calendar-workspace-LDuzo_Ie.js} +7 -7
  20. package/dist/_chunks/{calendar-workspace-B9MKJXER.js.map → calendar-workspace-LDuzo_Ie.js.map} +1 -1
  21. package/dist/_chunks/{chart-CuE30cfr.js → chart-D37VAIa-.js} +81 -81
  22. package/dist/_chunks/chart-D37VAIa-.js.map +1 -0
  23. package/dist/_chunks/{data-table-DJvEwZZx.js → data-table-CiVyhNXx.js} +2 -2
  24. package/dist/_chunks/{data-table-DJvEwZZx.js.map → data-table-CiVyhNXx.js.map} +1 -1
  25. package/dist/_chunks/{document-preview-1CZJg6CX.js → document-preview-VXOQZZvy.js} +2 -2
  26. package/dist/_chunks/{document-preview-1CZJg6CX.js.map → document-preview-VXOQZZvy.js.map} +1 -1
  27. package/dist/_chunks/{empty-state-DActfjdn.js → empty-state-C62P_6kr.js} +59 -48
  28. package/dist/_chunks/empty-state-C62P_6kr.js.map +1 -0
  29. package/dist/_chunks/{error-boundary--w5hYiQ-.js → error-boundary-Cvs23EzK.js} +2 -2
  30. package/dist/_chunks/{error-boundary--w5hYiQ-.js.map → error-boundary-Cvs23EzK.js.map} +1 -1
  31. package/dist/_chunks/error-page-BtxEOL6g.js +780 -0
  32. package/dist/_chunks/error-page-BtxEOL6g.js.map +1 -0
  33. package/dist/_chunks/{file-manager-BGHShxn_.js → file-manager-BfG3usGk.js} +3 -3
  34. package/dist/_chunks/{file-manager-BGHShxn_.js.map → file-manager-BfG3usGk.js.map} +1 -1
  35. package/dist/_chunks/{help-me-write-templates-CGCyhAVE.js → help-me-write-templates-DcR-e_90.js} +2 -2
  36. package/dist/_chunks/{help-me-write-templates-CGCyhAVE.js.map → help-me-write-templates-DcR-e_90.js.map} +1 -1
  37. package/dist/_chunks/{index.modern-Zta-A4Jm.js → index.modern-BeRXQVdc.js} +3 -2
  38. package/dist/_chunks/{index.modern-Zta-A4Jm.js.map → index.modern-BeRXQVdc.js.map} +1 -1
  39. package/dist/_chunks/{map-view-CmNGS6Ok.js → map-view-CQmqQJwK.js} +158 -129
  40. package/dist/_chunks/map-view-CQmqQJwK.js.map +1 -0
  41. package/dist/_chunks/{practice-results-DjhcggtZ.js → practice-results-B9uV0TT8.js} +3 -3
  42. package/dist/_chunks/{practice-results-DjhcggtZ.js.map → practice-results-B9uV0TT8.js.map} +1 -1
  43. package/dist/_chunks/{privacy-mask-noG15O9q.js → privacy-mask-CK-9sxeI.js} +2 -2
  44. package/dist/_chunks/{privacy-mask-noG15O9q.js.map → privacy-mask-CK-9sxeI.js.map} +1 -1
  45. package/dist/_chunks/{product-hub-panel-BmBzDba9.js → product-hub-panel-D87kbz5j.js} +2 -2
  46. package/dist/_chunks/{product-hub-panel-BmBzDba9.js.map → product-hub-panel-D87kbz5j.js.map} +1 -1
  47. package/dist/_chunks/{radiograph-panel.agent-BP71J_VB.js → radiograph-panel.agent-BWBaxJ8e.js} +2 -2
  48. package/dist/_chunks/{radiograph-panel.agent-BP71J_VB.js.map → radiograph-panel.agent-BWBaxJ8e.js.map} +1 -1
  49. package/dist/_chunks/{reviews-panel-DDb_t7vy.js → reviews-panel-DUgqU-Wr.js} +2 -2
  50. package/dist/_chunks/{reviews-panel-DDb_t7vy.js.map → reviews-panel-DUgqU-Wr.js.map} +1 -1
  51. package/dist/_chunks/{slot-grid-Bkg9MVXP.js → slot-grid-kq7bDdrx.js} +2 -2
  52. package/dist/_chunks/{slot-grid-Bkg9MVXP.js.map → slot-grid-kq7bDdrx.js.map} +1 -1
  53. package/dist/_chunks/{sparkline-ZOxMBU76.js → sparkline-pkGPCXbl.js} +80 -80
  54. package/dist/_chunks/sparkline-pkGPCXbl.js.map +1 -0
  55. package/dist/_chunks/{task-card-CngF4Zee.js → task-card-Cfl08MCS.js} +2 -2
  56. package/dist/_chunks/{task-card-CngF4Zee.js.map → task-card-Cfl08MCS.js.map} +1 -1
  57. package/dist/_chunks/{task-editor-Dz93rRXg.js → task-editor-CxF-sBnu.js} +2 -2
  58. package/dist/_chunks/{task-editor-Dz93rRXg.js.map → task-editor-CxF-sBnu.js.map} +1 -1
  59. package/dist/_chunks/{task-tray-CB6_BvH9.js → task-tray-rAGslT2C.js} +3 -3
  60. package/dist/_chunks/{task-tray-CB6_BvH9.js.map → task-tray-rAGslT2C.js.map} +1 -1
  61. package/dist/_chunks/{tasks-panel-DHAoTQtR.js → tasks-panel-Dkm8SnmV.js} +3 -3
  62. package/dist/_chunks/{tasks-panel-DHAoTQtR.js.map → tasks-panel-Dkm8SnmV.js.map} +1 -1
  63. package/dist/_chunks/{use-appointment-details-read-YsuJgYeB.js → use-appointment-details-read-W6h4oTHx.js} +3 -3
  64. package/dist/_chunks/{use-appointment-details-read-YsuJgYeB.js.map → use-appointment-details-read-W6h4oTHx.js.map} +1 -1
  65. package/dist/_chunks/{workflow-map-C7fHKTXL.js → workflow-map-C1OjRhM3.js} +189 -197
  66. package/dist/_chunks/workflow-map-C1OjRhM3.js.map +1 -0
  67. package/dist/agent-catalog.json +51 -7
  68. package/dist/agent-i18n/en.json +9 -3
  69. package/dist/components/_shared/index.d.ts +1 -0
  70. package/dist/components/_shared/index.d.ts.map +1 -1
  71. package/dist/components/_shared/is-development.d.ts +8 -0
  72. package/dist/components/_shared/is-development.d.ts.map +1 -0
  73. package/dist/components/_shared/use-keep-apex-tooltip-inside.d.ts +3 -0
  74. package/dist/components/_shared/use-keep-apex-tooltip-inside.d.ts.map +1 -0
  75. package/dist/components/address-autocomplete/index.js +1 -1
  76. package/dist/components/address-fields/index.js +1 -1
  77. package/dist/components/agenda-tray/index.js +1 -1
  78. package/dist/components/appointment-card/index.js +1 -1
  79. package/dist/components/appointment-details-panel/index.js +1 -1
  80. package/dist/components/appointment-timeline/index.js +1 -1
  81. package/dist/components/booking/index.js +1 -1
  82. package/dist/components/chart/chart.d.ts.map +1 -1
  83. package/dist/components/chart/index.js +1 -1
  84. package/dist/components/data-table/index.js +1 -1
  85. package/dist/components/document-preview/index.js +1 -1
  86. package/dist/components/empty-state/empty-state.d.ts +6 -0
  87. package/dist/components/empty-state/empty-state.d.ts.map +1 -1
  88. package/dist/components/empty-state/index.js +1 -1
  89. package/dist/components/error-boundary/index.js +1 -1
  90. package/dist/components/file-manager/index.js +1 -1
  91. package/dist/components/index.d.ts +1 -0
  92. package/dist/components/index.d.ts.map +1 -1
  93. package/dist/components/map-view/index.js +1 -1
  94. package/dist/components/map-view/map-view.agent.d.ts.map +1 -1
  95. package/dist/components/map-view/map-view.d.ts +8 -5
  96. package/dist/components/map-view/map-view.d.ts.map +1 -1
  97. package/dist/components/patient-table/index.js +1 -1
  98. package/dist/components/practice-results/index.js +1 -1
  99. package/dist/components/product-hub-tray/index.js +1 -1
  100. package/dist/components/radiograph-panel/index.js +1 -1
  101. package/dist/components/reviews-panel/index.js +1 -1
  102. package/dist/components/slot-grid/index.js +1 -1
  103. package/dist/components/sparkline/index.js +1 -1
  104. package/dist/components/sparkline/sparkline.d.ts.map +1 -1
  105. package/dist/components/task-card/index.js +1 -1
  106. package/dist/components/task-editor/index.js +1 -1
  107. package/dist/components/task-tray/index.js +1 -1
  108. package/dist/components/tasks-panel/index.js +1 -1
  109. package/dist/components/workflow/index.js +1 -1
  110. package/dist/components/workflow/workflow-editor.d.ts.map +1 -1
  111. package/dist/error-pages/400.ar.html +41 -0
  112. package/dist/error-pages/400.de.html +41 -0
  113. package/dist/error-pages/400.el.html +41 -0
  114. package/dist/error-pages/400.en.html +41 -0
  115. package/dist/error-pages/400.es.html +41 -0
  116. package/dist/error-pages/400.fr.html +41 -0
  117. package/dist/error-pages/400.hi.html +41 -0
  118. package/dist/error-pages/400.html +41 -0
  119. package/dist/error-pages/400.it.html +41 -0
  120. package/dist/error-pages/400.ja.html +41 -0
  121. package/dist/error-pages/400.nl.html +41 -0
  122. package/dist/error-pages/400.pl.html +41 -0
  123. package/dist/error-pages/400.pt.html +41 -0
  124. package/dist/error-pages/400.ro.html +41 -0
  125. package/dist/error-pages/400.ru.html +41 -0
  126. package/dist/error-pages/400.sq.html +41 -0
  127. package/dist/error-pages/400.sv.html +41 -0
  128. package/dist/error-pages/400.tr.html +41 -0
  129. package/dist/error-pages/400.zh.html +41 -0
  130. package/dist/error-pages/401.ar.html +41 -0
  131. package/dist/error-pages/401.de.html +41 -0
  132. package/dist/error-pages/401.el.html +41 -0
  133. package/dist/error-pages/401.en.html +41 -0
  134. package/dist/error-pages/401.es.html +41 -0
  135. package/dist/error-pages/401.fr.html +41 -0
  136. package/dist/error-pages/401.hi.html +41 -0
  137. package/dist/error-pages/401.html +41 -0
  138. package/dist/error-pages/401.it.html +41 -0
  139. package/dist/error-pages/401.ja.html +41 -0
  140. package/dist/error-pages/401.nl.html +41 -0
  141. package/dist/error-pages/401.pl.html +41 -0
  142. package/dist/error-pages/401.pt.html +41 -0
  143. package/dist/error-pages/401.ro.html +41 -0
  144. package/dist/error-pages/401.ru.html +41 -0
  145. package/dist/error-pages/401.sq.html +41 -0
  146. package/dist/error-pages/401.sv.html +41 -0
  147. package/dist/error-pages/401.tr.html +41 -0
  148. package/dist/error-pages/401.zh.html +41 -0
  149. package/dist/error-pages/403.ar.html +41 -0
  150. package/dist/error-pages/403.de.html +41 -0
  151. package/dist/error-pages/403.el.html +41 -0
  152. package/dist/error-pages/403.en.html +41 -0
  153. package/dist/error-pages/403.es.html +41 -0
  154. package/dist/error-pages/403.fr.html +41 -0
  155. package/dist/error-pages/403.hi.html +41 -0
  156. package/dist/error-pages/403.html +41 -0
  157. package/dist/error-pages/403.it.html +41 -0
  158. package/dist/error-pages/403.ja.html +41 -0
  159. package/dist/error-pages/403.nl.html +41 -0
  160. package/dist/error-pages/403.pl.html +41 -0
  161. package/dist/error-pages/403.pt.html +41 -0
  162. package/dist/error-pages/403.ro.html +41 -0
  163. package/dist/error-pages/403.ru.html +41 -0
  164. package/dist/error-pages/403.sq.html +41 -0
  165. package/dist/error-pages/403.sv.html +41 -0
  166. package/dist/error-pages/403.tr.html +41 -0
  167. package/dist/error-pages/403.zh.html +41 -0
  168. package/dist/error-pages/404.ar.html +41 -0
  169. package/dist/error-pages/404.de.html +41 -0
  170. package/dist/error-pages/404.el.html +41 -0
  171. package/dist/error-pages/404.en.html +41 -0
  172. package/dist/error-pages/404.es.html +41 -0
  173. package/dist/error-pages/404.fr.html +41 -0
  174. package/dist/error-pages/404.hi.html +41 -0
  175. package/dist/error-pages/404.html +41 -0
  176. package/dist/error-pages/404.it.html +41 -0
  177. package/dist/error-pages/404.ja.html +41 -0
  178. package/dist/error-pages/404.nl.html +41 -0
  179. package/dist/error-pages/404.pl.html +41 -0
  180. package/dist/error-pages/404.pt.html +41 -0
  181. package/dist/error-pages/404.ro.html +41 -0
  182. package/dist/error-pages/404.ru.html +41 -0
  183. package/dist/error-pages/404.sq.html +41 -0
  184. package/dist/error-pages/404.sv.html +41 -0
  185. package/dist/error-pages/404.tr.html +41 -0
  186. package/dist/error-pages/404.zh.html +41 -0
  187. package/dist/error-pages/405.ar.html +41 -0
  188. package/dist/error-pages/405.de.html +41 -0
  189. package/dist/error-pages/405.el.html +41 -0
  190. package/dist/error-pages/405.en.html +41 -0
  191. package/dist/error-pages/405.es.html +41 -0
  192. package/dist/error-pages/405.fr.html +41 -0
  193. package/dist/error-pages/405.hi.html +41 -0
  194. package/dist/error-pages/405.html +41 -0
  195. package/dist/error-pages/405.it.html +41 -0
  196. package/dist/error-pages/405.ja.html +41 -0
  197. package/dist/error-pages/405.nl.html +41 -0
  198. package/dist/error-pages/405.pl.html +41 -0
  199. package/dist/error-pages/405.pt.html +41 -0
  200. package/dist/error-pages/405.ro.html +41 -0
  201. package/dist/error-pages/405.ru.html +41 -0
  202. package/dist/error-pages/405.sq.html +41 -0
  203. package/dist/error-pages/405.sv.html +41 -0
  204. package/dist/error-pages/405.tr.html +41 -0
  205. package/dist/error-pages/405.zh.html +41 -0
  206. package/dist/error-pages/410.ar.html +41 -0
  207. package/dist/error-pages/410.de.html +41 -0
  208. package/dist/error-pages/410.el.html +41 -0
  209. package/dist/error-pages/410.en.html +41 -0
  210. package/dist/error-pages/410.es.html +41 -0
  211. package/dist/error-pages/410.fr.html +41 -0
  212. package/dist/error-pages/410.hi.html +41 -0
  213. package/dist/error-pages/410.html +41 -0
  214. package/dist/error-pages/410.it.html +41 -0
  215. package/dist/error-pages/410.ja.html +41 -0
  216. package/dist/error-pages/410.nl.html +41 -0
  217. package/dist/error-pages/410.pl.html +41 -0
  218. package/dist/error-pages/410.pt.html +41 -0
  219. package/dist/error-pages/410.ro.html +41 -0
  220. package/dist/error-pages/410.ru.html +41 -0
  221. package/dist/error-pages/410.sq.html +41 -0
  222. package/dist/error-pages/410.sv.html +41 -0
  223. package/dist/error-pages/410.tr.html +41 -0
  224. package/dist/error-pages/410.zh.html +41 -0
  225. package/dist/error-pages/419.ar.html +42 -0
  226. package/dist/error-pages/419.de.html +42 -0
  227. package/dist/error-pages/419.el.html +42 -0
  228. package/dist/error-pages/419.en.html +42 -0
  229. package/dist/error-pages/419.es.html +42 -0
  230. package/dist/error-pages/419.fr.html +42 -0
  231. package/dist/error-pages/419.hi.html +42 -0
  232. package/dist/error-pages/419.html +42 -0
  233. package/dist/error-pages/419.it.html +42 -0
  234. package/dist/error-pages/419.ja.html +42 -0
  235. package/dist/error-pages/419.nl.html +42 -0
  236. package/dist/error-pages/419.pl.html +42 -0
  237. package/dist/error-pages/419.pt.html +42 -0
  238. package/dist/error-pages/419.ro.html +42 -0
  239. package/dist/error-pages/419.ru.html +42 -0
  240. package/dist/error-pages/419.sq.html +42 -0
  241. package/dist/error-pages/419.sv.html +42 -0
  242. package/dist/error-pages/419.tr.html +42 -0
  243. package/dist/error-pages/419.zh.html +42 -0
  244. package/dist/error-pages/429.ar.html +42 -0
  245. package/dist/error-pages/429.de.html +42 -0
  246. package/dist/error-pages/429.el.html +42 -0
  247. package/dist/error-pages/429.en.html +42 -0
  248. package/dist/error-pages/429.es.html +42 -0
  249. package/dist/error-pages/429.fr.html +42 -0
  250. package/dist/error-pages/429.hi.html +42 -0
  251. package/dist/error-pages/429.html +42 -0
  252. package/dist/error-pages/429.it.html +42 -0
  253. package/dist/error-pages/429.ja.html +42 -0
  254. package/dist/error-pages/429.nl.html +42 -0
  255. package/dist/error-pages/429.pl.html +42 -0
  256. package/dist/error-pages/429.pt.html +42 -0
  257. package/dist/error-pages/429.ro.html +42 -0
  258. package/dist/error-pages/429.ru.html +42 -0
  259. package/dist/error-pages/429.sq.html +42 -0
  260. package/dist/error-pages/429.sv.html +42 -0
  261. package/dist/error-pages/429.tr.html +42 -0
  262. package/dist/error-pages/429.zh.html +42 -0
  263. package/dist/error-pages/500.ar.html +41 -0
  264. package/dist/error-pages/500.de.html +41 -0
  265. package/dist/error-pages/500.el.html +41 -0
  266. package/dist/error-pages/500.en.html +41 -0
  267. package/dist/error-pages/500.es.html +41 -0
  268. package/dist/error-pages/500.fr.html +41 -0
  269. package/dist/error-pages/500.hi.html +41 -0
  270. package/dist/error-pages/500.html +41 -0
  271. package/dist/error-pages/500.it.html +41 -0
  272. package/dist/error-pages/500.ja.html +41 -0
  273. package/dist/error-pages/500.nl.html +41 -0
  274. package/dist/error-pages/500.pl.html +41 -0
  275. package/dist/error-pages/500.pt.html +41 -0
  276. package/dist/error-pages/500.ro.html +41 -0
  277. package/dist/error-pages/500.ru.html +41 -0
  278. package/dist/error-pages/500.sq.html +41 -0
  279. package/dist/error-pages/500.sv.html +41 -0
  280. package/dist/error-pages/500.tr.html +41 -0
  281. package/dist/error-pages/500.zh.html +41 -0
  282. package/dist/error-pages/502.ar.html +41 -0
  283. package/dist/error-pages/502.de.html +41 -0
  284. package/dist/error-pages/502.el.html +41 -0
  285. package/dist/error-pages/502.en.html +41 -0
  286. package/dist/error-pages/502.es.html +41 -0
  287. package/dist/error-pages/502.fr.html +41 -0
  288. package/dist/error-pages/502.hi.html +41 -0
  289. package/dist/error-pages/502.html +41 -0
  290. package/dist/error-pages/502.it.html +41 -0
  291. package/dist/error-pages/502.ja.html +41 -0
  292. package/dist/error-pages/502.nl.html +41 -0
  293. package/dist/error-pages/502.pl.html +41 -0
  294. package/dist/error-pages/502.pt.html +41 -0
  295. package/dist/error-pages/502.ro.html +41 -0
  296. package/dist/error-pages/502.ru.html +41 -0
  297. package/dist/error-pages/502.sq.html +41 -0
  298. package/dist/error-pages/502.sv.html +41 -0
  299. package/dist/error-pages/502.tr.html +41 -0
  300. package/dist/error-pages/502.zh.html +41 -0
  301. package/dist/error-pages/503.ar.html +41 -0
  302. package/dist/error-pages/503.de.html +41 -0
  303. package/dist/error-pages/503.el.html +41 -0
  304. package/dist/error-pages/503.en.html +41 -0
  305. package/dist/error-pages/503.es.html +41 -0
  306. package/dist/error-pages/503.fr.html +41 -0
  307. package/dist/error-pages/503.hi.html +41 -0
  308. package/dist/error-pages/503.html +41 -0
  309. package/dist/error-pages/503.it.html +41 -0
  310. package/dist/error-pages/503.ja.html +41 -0
  311. package/dist/error-pages/503.nl.html +41 -0
  312. package/dist/error-pages/503.pl.html +41 -0
  313. package/dist/error-pages/503.pt.html +41 -0
  314. package/dist/error-pages/503.ro.html +41 -0
  315. package/dist/error-pages/503.ru.html +41 -0
  316. package/dist/error-pages/503.sq.html +41 -0
  317. package/dist/error-pages/503.sv.html +41 -0
  318. package/dist/error-pages/503.tr.html +41 -0
  319. package/dist/error-pages/503.zh.html +41 -0
  320. package/dist/error-pages/504.ar.html +41 -0
  321. package/dist/error-pages/504.de.html +41 -0
  322. package/dist/error-pages/504.el.html +41 -0
  323. package/dist/error-pages/504.en.html +41 -0
  324. package/dist/error-pages/504.es.html +41 -0
  325. package/dist/error-pages/504.fr.html +41 -0
  326. package/dist/error-pages/504.hi.html +41 -0
  327. package/dist/error-pages/504.html +41 -0
  328. package/dist/error-pages/504.it.html +41 -0
  329. package/dist/error-pages/504.ja.html +41 -0
  330. package/dist/error-pages/504.nl.html +41 -0
  331. package/dist/error-pages/504.pl.html +41 -0
  332. package/dist/error-pages/504.pt.html +41 -0
  333. package/dist/error-pages/504.ro.html +41 -0
  334. package/dist/error-pages/504.ru.html +41 -0
  335. package/dist/error-pages/504.sq.html +41 -0
  336. package/dist/error-pages/504.sv.html +41 -0
  337. package/dist/error-pages/504.tr.html +41 -0
  338. package/dist/error-pages/504.zh.html +41 -0
  339. package/dist/error-pages/maintenance.ar.html +41 -0
  340. package/dist/error-pages/maintenance.de.html +41 -0
  341. package/dist/error-pages/maintenance.el.html +41 -0
  342. package/dist/error-pages/maintenance.en.html +41 -0
  343. package/dist/error-pages/maintenance.es.html +41 -0
  344. package/dist/error-pages/maintenance.fr.html +41 -0
  345. package/dist/error-pages/maintenance.hi.html +41 -0
  346. package/dist/error-pages/maintenance.html +41 -0
  347. package/dist/error-pages/maintenance.it.html +41 -0
  348. package/dist/error-pages/maintenance.ja.html +41 -0
  349. package/dist/error-pages/maintenance.nl.html +41 -0
  350. package/dist/error-pages/maintenance.pl.html +41 -0
  351. package/dist/error-pages/maintenance.pt.html +41 -0
  352. package/dist/error-pages/maintenance.ro.html +41 -0
  353. package/dist/error-pages/maintenance.ru.html +41 -0
  354. package/dist/error-pages/maintenance.sq.html +41 -0
  355. package/dist/error-pages/maintenance.sv.html +41 -0
  356. package/dist/error-pages/maintenance.tr.html +41 -0
  357. package/dist/error-pages/maintenance.zh.html +41 -0
  358. package/dist/host-compat.css +13 -1
  359. package/dist/i18n/locales/ar.d.ts +70 -0
  360. package/dist/i18n/locales/ar.d.ts.map +1 -1
  361. package/dist/i18n/locales/ar.js +70 -0
  362. package/dist/i18n/locales/ar.js.map +1 -1
  363. package/dist/i18n/locales/de.d.ts +70 -0
  364. package/dist/i18n/locales/de.d.ts.map +1 -1
  365. package/dist/i18n/locales/de.js +70 -0
  366. package/dist/i18n/locales/de.js.map +1 -1
  367. package/dist/i18n/locales/el.d.ts +70 -0
  368. package/dist/i18n/locales/el.d.ts.map +1 -1
  369. package/dist/i18n/locales/el.js +70 -0
  370. package/dist/i18n/locales/el.js.map +1 -1
  371. package/dist/i18n/locales/en.d.ts +70 -0
  372. package/dist/i18n/locales/en.d.ts.map +1 -1
  373. package/dist/i18n/locales/en.js +70 -0
  374. package/dist/i18n/locales/en.js.map +1 -1
  375. package/dist/i18n/locales/es.d.ts +70 -0
  376. package/dist/i18n/locales/es.d.ts.map +1 -1
  377. package/dist/i18n/locales/es.js +70 -0
  378. package/dist/i18n/locales/es.js.map +1 -1
  379. package/dist/i18n/locales/fr.d.ts +70 -0
  380. package/dist/i18n/locales/fr.d.ts.map +1 -1
  381. package/dist/i18n/locales/fr.js +70 -0
  382. package/dist/i18n/locales/fr.js.map +1 -1
  383. package/dist/i18n/locales/hi.d.ts +70 -0
  384. package/dist/i18n/locales/hi.d.ts.map +1 -1
  385. package/dist/i18n/locales/hi.js +70 -0
  386. package/dist/i18n/locales/hi.js.map +1 -1
  387. package/dist/i18n/locales/it.d.ts +70 -0
  388. package/dist/i18n/locales/it.d.ts.map +1 -1
  389. package/dist/i18n/locales/it.js +70 -0
  390. package/dist/i18n/locales/it.js.map +1 -1
  391. package/dist/i18n/locales/ja.d.ts +70 -0
  392. package/dist/i18n/locales/ja.d.ts.map +1 -1
  393. package/dist/i18n/locales/ja.js +70 -0
  394. package/dist/i18n/locales/ja.js.map +1 -1
  395. package/dist/i18n/locales/nl.d.ts +70 -0
  396. package/dist/i18n/locales/nl.d.ts.map +1 -1
  397. package/dist/i18n/locales/nl.js +70 -0
  398. package/dist/i18n/locales/nl.js.map +1 -1
  399. package/dist/i18n/locales/pl.d.ts +70 -0
  400. package/dist/i18n/locales/pl.d.ts.map +1 -1
  401. package/dist/i18n/locales/pl.js +70 -0
  402. package/dist/i18n/locales/pl.js.map +1 -1
  403. package/dist/i18n/locales/pt.d.ts +70 -0
  404. package/dist/i18n/locales/pt.d.ts.map +1 -1
  405. package/dist/i18n/locales/pt.js +70 -0
  406. package/dist/i18n/locales/pt.js.map +1 -1
  407. package/dist/i18n/locales/ro.d.ts +70 -0
  408. package/dist/i18n/locales/ro.d.ts.map +1 -1
  409. package/dist/i18n/locales/ro.js +70 -0
  410. package/dist/i18n/locales/ro.js.map +1 -1
  411. package/dist/i18n/locales/ru.d.ts +70 -0
  412. package/dist/i18n/locales/ru.d.ts.map +1 -1
  413. package/dist/i18n/locales/ru.js +70 -0
  414. package/dist/i18n/locales/ru.js.map +1 -1
  415. package/dist/i18n/locales/sq.d.ts +70 -0
  416. package/dist/i18n/locales/sq.d.ts.map +1 -1
  417. package/dist/i18n/locales/sq.js +70 -0
  418. package/dist/i18n/locales/sq.js.map +1 -1
  419. package/dist/i18n/locales/sv.d.ts +70 -0
  420. package/dist/i18n/locales/sv.d.ts.map +1 -1
  421. package/dist/i18n/locales/sv.js +70 -0
  422. package/dist/i18n/locales/sv.js.map +1 -1
  423. package/dist/i18n/locales/tr.d.ts +70 -0
  424. package/dist/i18n/locales/tr.d.ts.map +1 -1
  425. package/dist/i18n/locales/tr.js +70 -0
  426. package/dist/i18n/locales/tr.js.map +1 -1
  427. package/dist/i18n/locales/zh.d.ts +70 -0
  428. package/dist/i18n/locales/zh.d.ts.map +1 -1
  429. package/dist/i18n/locales/zh.js +70 -0
  430. package/dist/i18n/locales/zh.js.map +1 -1
  431. package/dist/index.js +143 -137
  432. package/dist/index.js.map +1 -1
  433. package/dist/locales/ar.json +70 -0
  434. package/dist/locales/de.json +70 -0
  435. package/dist/locales/el.json +70 -0
  436. package/dist/locales/en.json +70 -0
  437. package/dist/locales/es.json +70 -0
  438. package/dist/locales/fr.json +70 -0
  439. package/dist/locales/hi.json +70 -0
  440. package/dist/locales/it.json +70 -0
  441. package/dist/locales/ja.json +70 -0
  442. package/dist/locales/nl.json +70 -0
  443. package/dist/locales/pl.json +70 -0
  444. package/dist/locales/pt.json +70 -0
  445. package/dist/locales/ro.json +70 -0
  446. package/dist/locales/ru.json +70 -0
  447. package/dist/locales/sq.json +70 -0
  448. package/dist/locales/sv.json +70 -0
  449. package/dist/locales/tr.json +70 -0
  450. package/dist/locales/zh.json +70 -0
  451. package/dist/patterns/anamnesis/index.js +1 -1
  452. package/dist/patterns/calendar/index.js +1 -1
  453. package/dist/patterns/error-page/error-page-illustration.d.ts +6 -0
  454. package/dist/patterns/error-page/error-page-illustration.d.ts.map +1 -0
  455. package/dist/patterns/error-page/error-page-locale.d.ts +32 -0
  456. package/dist/patterns/error-page/error-page-locale.d.ts.map +1 -0
  457. package/dist/patterns/error-page/error-page-statuses.d.ts +16 -0
  458. package/dist/patterns/error-page/error-page-statuses.d.ts.map +1 -0
  459. package/dist/patterns/error-page/error-page.d.ts +48 -0
  460. package/dist/patterns/error-page/error-page.d.ts.map +1 -0
  461. package/dist/patterns/error-page/index.d.ts +5 -0
  462. package/dist/patterns/error-page/index.d.ts.map +1 -0
  463. package/dist/patterns/error-page/index.js +9 -0
  464. package/dist/patterns/error-page/index.js.map +1 -0
  465. package/dist/patterns/help-me-write-templates/index.js +1 -1
  466. package/dist/tokens.css +1 -1
  467. package/package.json +9 -2
  468. package/dist/_chunks/apexcharts-theme-B_AxGC_h.js +0 -72
  469. package/dist/_chunks/apexcharts-theme-B_AxGC_h.js.map +0 -1
  470. package/dist/_chunks/chart-CuE30cfr.js.map +0 -1
  471. package/dist/_chunks/empty-state-DActfjdn.js.map +0 -1
  472. package/dist/_chunks/map-view-CmNGS6Ok.js.map +0 -1
  473. package/dist/_chunks/sparkline-ZOxMBU76.js.map +0 -1
  474. package/dist/_chunks/workflow-map-C7fHKTXL.js.map +0 -1
@@ -2,7 +2,7 @@ import { jsx as c, jsxs as O } from "react/jsx-runtime";
2
2
  import { forwardRef as Re, useRef as N, useMemo as ae, useId as ke, useState as H, useCallback as L, useEffect as Ne } from "react";
3
3
  import { c as Q } from "./index-D2ZczOXr.js";
4
4
  import { useTranslation as le } from "react-i18next";
5
- import { A as Pe, c as Ee } from "./index.modern-Zta-A4Jm.js";
5
+ import { A as Pe, c as Ee } from "./index.modern-BeRXQVdc.js";
6
6
  import { u as Ve } from "./form-field-context-B3APVHKx.js";
7
7
  import { c as De } from "./compose-refs-C0k0tdqF.js";
8
8
  import { u as Fe } from "./use-controllable-state-BiY4xTzM.js";
@@ -494,4 +494,4 @@ export {
494
494
  qe as a,
495
495
  de as p
496
496
  };
497
- //# sourceMappingURL=address-autocomplete-BVLoHU3E.js.map
497
+ //# sourceMappingURL=address-autocomplete-Bp816Mb1.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"address-autocomplete-BVLoHU3E.js","sources":["../../src/components/address-autocomplete/address-autocomplete.agent.ts","../../src/components/address-autocomplete/parse-address.ts","../../src/components/address-autocomplete/address-autocomplete.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — AddressAutocomplete. */\n/* */\n/* Single-line address combobox (Google Places, mock, or no-key plain */\n/* input). The agent surface is the WAI-ARIA combobox: the typed text + */\n/* live query + listbox open state, plus set/clear/open/close. The */\n/* resolved `StructuredAddress` is deliberately NOT exposed — it can */\n/* carry address PHI; agents read only the structural text/query. */\n/* Shaped after `autocomplete.agent.ts`. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { AddressAutocompleteHandle } from './address-autocomplete';\n\nexport const addressAutocompleteAgent: AgentAdapter<AddressAutocompleteHandle> =\n {\n id: 'address-autocomplete',\n capabilities: ['select_single', 'filter', 'open', 'close'],\n state: {\n value: {\n type: 'string',\n descriptionKey: 'ui.agent.addressAutocomplete.state.value',\n description: 'Current free-text value of the address input.',\n read: (handle) => handle.getValue(),\n },\n query: {\n type: 'string',\n descriptionKey: 'ui.agent.addressAutocomplete.state.query',\n description: 'Current query driving the suggestion listbox.',\n read: (handle) => handle.getQuery(),\n },\n isOpen: {\n type: 'boolean',\n descriptionKey: 'ui.agent.addressAutocomplete.state.isOpen',\n description: 'True when the suggestion listbox is visible.',\n read: (handle) => handle.getIsOpen(),\n },\n },\n actions: {\n set_value: {\n safety: 'write',\n argsType: '{ value: string }',\n argsSchema: {\n type: 'object',\n properties: {\n value: {\n type: 'string',\n description: 'Text to place in the input (also runs a fetch).',\n },\n },\n required: ['value'],\n },\n idempotent: true,\n openWorld: true,\n descriptionKey: 'ui.agent.addressAutocomplete.actions.setValue',\n description:\n 'Set the input text programmatically; opens and refreshes the suggestion list (issues an external address-lookup fetch).',\n examples: [\n { args: { value: 'Via Roma 12' }, note: 'Seed a partial address.' },\n ],\n invoke: (handle, args: { value: string }) => {\n handle.setValue(args.value);\n },\n },\n apply_filter: {\n safety: 'read',\n argsType: '{ query: string }',\n argsSchema: {\n type: 'object',\n properties: {\n query: {\n type: 'string',\n description: 'Query text to filter the address suggestions.',\n },\n },\n required: ['query'],\n },\n idempotent: true,\n openWorld: true,\n descriptionKey: 'ui.agent.addressAutocomplete.actions.applyFilter',\n description:\n 'Set the query text, which refreshes the suggestion list via an external address-lookup fetch.',\n invoke: (handle, args: { query: string }) => {\n handle.setQuery(args.query);\n },\n },\n clear: {\n safety: 'write',\n idempotent: true,\n descriptionKey: 'ui.agent.addressAutocomplete.actions.clear',\n description: 'Clear the typed text and dismiss the suggestion list.',\n invoke: (handle) => {\n handle.clear();\n },\n },\n open: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.addressAutocomplete.actions.open',\n description: 'Open the suggestion listbox.',\n invoke: (handle) => {\n handle.open();\n },\n },\n close: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.addressAutocomplete.actions.close',\n description: 'Close the suggestion listbox.',\n invoke: (handle) => {\n handle.close();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'address-autocomplete',\n description: 'Marks the AddressAutocomplete wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description:\n 'Sourced from the id prop. Required to address a specific field from the agent.',\n },\n },\n };\n","/* ------------------------------------------------------------------ */\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 { MENU_ROW_HIGHLIGHT } from '../_shared/menu-row';\nimport { useAgentRegistration } from '../../agent';\nimport { addressAutocompleteAgent } from './address-autocomplete.agent';\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/* Agent handle */\n/* */\n/* Curated, structural surface for the agent-readiness adapter */\n/* (`address-autocomplete.agent.ts`). It exposes only the input text, */\n/* the live query, and the listbox open state — never the resolved */\n/* `StructuredAddress` (which can carry address PHI). The public */\n/* `forwardRef` continues to expose the underlying `HTMLInputElement`; */\n/* this handle is a separate contract wired through the platform agent */\n/* registry, not the component's React ref. */\n/* ------------------------------------------------------------------ */\n\nexport interface AddressAutocompleteHandle {\n /** Current free-text value of the input. */\n getValue: () => string;\n /** Current query (same as the input value) used to drive suggestions. */\n getQuery: () => string;\n /** True when the suggestion listbox is visible. */\n getIsOpen: () => boolean;\n /** Set the input text programmatically (also drives a suggestion fetch). */\n setValue: (value: string) => void;\n /** Set the query text — alias of `setValue`. */\n setQuery: (query: string) => void;\n /** Clear the typed text and dismiss the listbox. */\n clear: () => void;\n /** Open the suggestion listbox. */\n open: () => void;\n /** Close the suggestion listbox. */\n close: () => void;\n}\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 // Hover moves the active row, so a separate hover tint would light two.\n MENU_ROW_HIGHLIGHT.active,\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('ui');\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 // Agent handle — refs mirror the live state so the (memoised) handle reads\n // the current values without re-creating on every keystroke.\n const valueRefAgent = useRef(currentValue);\n valueRefAgent.current = currentValue;\n const openRefAgent = useRef(listboxOpen);\n openRefAgent.current = listboxOpen;\n\n const agentHandle = useMemo<AddressAutocompleteHandle>(\n () => ({\n getValue: () => valueRefAgent.current,\n getQuery: () => valueRefAgent.current,\n getIsOpen: () => openRefAgent.current,\n setValue: (next) => {\n commitValue(next);\n setOpen(true);\n debouncedFetch(next);\n },\n setQuery: (next) => {\n commitValue(next);\n setOpen(true);\n debouncedFetch(next);\n },\n clear: () => {\n commitValue('');\n setOpen(false);\n setActiveIndex(-1);\n setSuggestions([]);\n },\n open: () => setOpen(true),\n close: () => {\n setOpen(false);\n setActiveIndex(-1);\n },\n }),\n [commitValue, debouncedFetch],\n );\n useAgentRegistration(addressAutocompleteAgent, agentHandle, id);\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: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('ui');\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":["addressAutocompleteAgent","handle","args","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","MENU_ROW_HIGHLIGHT","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","valueRefAgent","openRefAgent","agentHandle","useAgentRegistration","liveMessage","jsxs","MapPin","AddressAutocomplete","forwardRef","apiKey","ref","i18n","resolveMockSelection","APIProvider"],"mappings":"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"}
1
+ {"version":3,"file":"address-autocomplete-Bp816Mb1.js","sources":["../../src/components/address-autocomplete/address-autocomplete.agent.ts","../../src/components/address-autocomplete/parse-address.ts","../../src/components/address-autocomplete/address-autocomplete.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — AddressAutocomplete. */\n/* */\n/* Single-line address combobox (Google Places, mock, or no-key plain */\n/* input). The agent surface is the WAI-ARIA combobox: the typed text + */\n/* live query + listbox open state, plus set/clear/open/close. The */\n/* resolved `StructuredAddress` is deliberately NOT exposed — it can */\n/* carry address PHI; agents read only the structural text/query. */\n/* Shaped after `autocomplete.agent.ts`. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { AddressAutocompleteHandle } from './address-autocomplete';\n\nexport const addressAutocompleteAgent: AgentAdapter<AddressAutocompleteHandle> =\n {\n id: 'address-autocomplete',\n capabilities: ['select_single', 'filter', 'open', 'close'],\n state: {\n value: {\n type: 'string',\n descriptionKey: 'ui.agent.addressAutocomplete.state.value',\n description: 'Current free-text value of the address input.',\n read: (handle) => handle.getValue(),\n },\n query: {\n type: 'string',\n descriptionKey: 'ui.agent.addressAutocomplete.state.query',\n description: 'Current query driving the suggestion listbox.',\n read: (handle) => handle.getQuery(),\n },\n isOpen: {\n type: 'boolean',\n descriptionKey: 'ui.agent.addressAutocomplete.state.isOpen',\n description: 'True when the suggestion listbox is visible.',\n read: (handle) => handle.getIsOpen(),\n },\n },\n actions: {\n set_value: {\n safety: 'write',\n argsType: '{ value: string }',\n argsSchema: {\n type: 'object',\n properties: {\n value: {\n type: 'string',\n description: 'Text to place in the input (also runs a fetch).',\n },\n },\n required: ['value'],\n },\n idempotent: true,\n openWorld: true,\n descriptionKey: 'ui.agent.addressAutocomplete.actions.setValue',\n description:\n 'Set the input text programmatically; opens and refreshes the suggestion list (issues an external address-lookup fetch).',\n examples: [\n { args: { value: 'Via Roma 12' }, note: 'Seed a partial address.' },\n ],\n invoke: (handle, args: { value: string }) => {\n handle.setValue(args.value);\n },\n },\n apply_filter: {\n safety: 'read',\n argsType: '{ query: string }',\n argsSchema: {\n type: 'object',\n properties: {\n query: {\n type: 'string',\n description: 'Query text to filter the address suggestions.',\n },\n },\n required: ['query'],\n },\n idempotent: true,\n openWorld: true,\n descriptionKey: 'ui.agent.addressAutocomplete.actions.applyFilter',\n description:\n 'Set the query text, which refreshes the suggestion list via an external address-lookup fetch.',\n invoke: (handle, args: { query: string }) => {\n handle.setQuery(args.query);\n },\n },\n clear: {\n safety: 'write',\n idempotent: true,\n descriptionKey: 'ui.agent.addressAutocomplete.actions.clear',\n description: 'Clear the typed text and dismiss the suggestion list.',\n invoke: (handle) => {\n handle.clear();\n },\n },\n open: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.addressAutocomplete.actions.open',\n description: 'Open the suggestion listbox.',\n invoke: (handle) => {\n handle.open();\n },\n },\n close: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.addressAutocomplete.actions.close',\n description: 'Close the suggestion listbox.',\n invoke: (handle) => {\n handle.close();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'address-autocomplete',\n description: 'Marks the AddressAutocomplete wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description:\n 'Sourced from the id prop. Required to address a specific field from the agent.',\n },\n },\n };\n","/* ------------------------------------------------------------------ */\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 { MENU_ROW_HIGHLIGHT } from '../_shared/menu-row';\nimport { useAgentRegistration } from '../../agent';\nimport { addressAutocompleteAgent } from './address-autocomplete.agent';\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/* Agent handle */\n/* */\n/* Curated, structural surface for the agent-readiness adapter */\n/* (`address-autocomplete.agent.ts`). It exposes only the input text, */\n/* the live query, and the listbox open state — never the resolved */\n/* `StructuredAddress` (which can carry address PHI). The public */\n/* `forwardRef` continues to expose the underlying `HTMLInputElement`; */\n/* this handle is a separate contract wired through the platform agent */\n/* registry, not the component's React ref. */\n/* ------------------------------------------------------------------ */\n\nexport interface AddressAutocompleteHandle {\n /** Current free-text value of the input. */\n getValue: () => string;\n /** Current query (same as the input value) used to drive suggestions. */\n getQuery: () => string;\n /** True when the suggestion listbox is visible. */\n getIsOpen: () => boolean;\n /** Set the input text programmatically (also drives a suggestion fetch). */\n setValue: (value: string) => void;\n /** Set the query text — alias of `setValue`. */\n setQuery: (query: string) => void;\n /** Clear the typed text and dismiss the listbox. */\n clear: () => void;\n /** Open the suggestion listbox. */\n open: () => void;\n /** Close the suggestion listbox. */\n close: () => void;\n}\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 // Hover moves the active row, so a separate hover tint would light two.\n MENU_ROW_HIGHLIGHT.active,\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('ui');\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 // Agent handle — refs mirror the live state so the (memoised) handle reads\n // the current values without re-creating on every keystroke.\n const valueRefAgent = useRef(currentValue);\n valueRefAgent.current = currentValue;\n const openRefAgent = useRef(listboxOpen);\n openRefAgent.current = listboxOpen;\n\n const agentHandle = useMemo<AddressAutocompleteHandle>(\n () => ({\n getValue: () => valueRefAgent.current,\n getQuery: () => valueRefAgent.current,\n getIsOpen: () => openRefAgent.current,\n setValue: (next) => {\n commitValue(next);\n setOpen(true);\n debouncedFetch(next);\n },\n setQuery: (next) => {\n commitValue(next);\n setOpen(true);\n debouncedFetch(next);\n },\n clear: () => {\n commitValue('');\n setOpen(false);\n setActiveIndex(-1);\n setSuggestions([]);\n },\n open: () => setOpen(true),\n close: () => {\n setOpen(false);\n setActiveIndex(-1);\n },\n }),\n [commitValue, debouncedFetch],\n );\n useAgentRegistration(addressAutocompleteAgent, agentHandle, id);\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: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('ui');\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":["addressAutocompleteAgent","handle","args","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","MENU_ROW_HIGHLIGHT","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","valueRefAgent","openRefAgent","agentHandle","useAgentRegistration","liveMessage","jsxs","MapPin","AddressAutocomplete","forwardRef","apiKey","ref","i18n","resolveMockSelection","APIProvider"],"mappings":"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"}
@@ -8,7 +8,7 @@ import { P as q } from "./postal-code-input-Dv02t5MD.js";
8
8
  import { C as H } from "./city-input-CAnTVgBZ.js";
9
9
  import { T as K } from "./text-input-CLaItY93.js";
10
10
  import { F as l } from "./form-field-YUJl_U5l.js";
11
- import { A as M } from "./address-autocomplete-BVLoHU3E.js";
11
+ import { A as M } from "./address-autocomplete-Bp816Mb1.js";
12
12
  import { u as U } from "./registry-DvAUVLHh.js";
13
13
  const W = {
14
14
  street: { type: "string" },
@@ -243,4 +243,4 @@ export {
243
243
  Z as A,
244
244
  Y as a
245
245
  };
246
- //# sourceMappingURL=address-fields-UiEXHxEX.js.map
246
+ //# sourceMappingURL=address-fields-BIL6cvLS.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"address-fields-UiEXHxEX.js","sources":["../../src/components/address-fields/address-fields.agent.ts","../../src/components/address-fields/address-fields.tsx"],"sourcesContent":["import type { AgentAdapter } from '../../agent/types';\nimport type { StructuredAddress } from '../address-autocomplete';\n\nexport interface AddressFieldsHandle {\n getValue: () => StructuredAddress;\n setValue: (value: StructuredAddress) => void;\n setField: (field: keyof StructuredAddress, value: string) => void;\n}\n\nconst ADDRESS_PROPERTIES = {\n street: { type: 'string' },\n city: { type: 'string' },\n postcode: { type: 'string' },\n province: { type: 'string', description: 'UPPERCASED province code.' },\n country: { type: 'string', description: 'ISO alpha-2, lowercased.' },\n formatted: { type: 'string' },\n} as const;\n\nexport const addressFieldsAgent: AgentAdapter<AddressFieldsHandle> = {\n id: 'address-fields',\n // `set_value` only — a structured address form sets discrete fields; it does\n // no granular in-place rich-text editing, so `edit_inline` does not apply.\n capabilities: ['set_value'],\n state: {\n value: {\n type: 'object',\n descriptionKey: 'ui.agent.addressFields.state.value',\n description:\n 'The current structured address: { street, city, postcode, province, country, formatted }.',\n read: (handle) => handle.getValue(),\n },\n },\n actions: {\n set_value: {\n safety: 'write',\n argsType: '{ value: StructuredAddress }',\n argsSchema: {\n type: 'object',\n properties: {\n value: { type: 'object', properties: ADDRESS_PROPERTIES },\n },\n required: ['value'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.addressFields.actions.setValue',\n description: 'Replace the entire address.',\n invoke: (handle, args: { value: StructuredAddress }) => {\n handle.setValue(args.value);\n },\n },\n set_field: {\n // Contact-data write (street/city/postcode/etc.), not clinical PHI —\n // consistent with PhoneInput / EmailInput / FiscalCodeInput, which all\n // treat identifying contact data as `write`.\n safety: 'write',\n argsType:\n \"{ field: 'street' | 'city' | 'postcode' | 'province' | 'country'; value: string }\",\n argsSchema: {\n type: 'object',\n properties: {\n field: {\n type: 'string',\n enum: ['street', 'city', 'postcode', 'province', 'country'],\n },\n value: { type: 'string' },\n },\n required: ['field', 'value'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.addressFields.actions.setField',\n description:\n 'Set a single address field. Setting `country` also clears the now-stale province.',\n examples: [\n {\n args: { field: 'country', value: 'it' },\n note: 'Set the country to Italy.',\n },\n ],\n invoke: (\n handle,\n args: { field: keyof StructuredAddress; value: string },\n ) => {\n handle.setField(args.field, args.value);\n },\n },\n },\n domHooks: {\n root: { attr: 'data-component', value: 'address-fields' },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n type ChangeEvent,\n type ReactNode,\n} from 'react';\nimport { cva } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { CountrySelect } from '../country-select/country-select';\nimport { ProvinceSelect } from '../province-select/province-select';\nimport { PostalCodeInput } from '../postal-code-input/postal-code-input';\nimport { CityInput, type CityLoaderContext } from '../city-input/city-input';\nimport { TextInput } from '../text-input';\nimport { FormField } from '../form-field/form-field';\nimport {\n AddressAutocomplete,\n type GetSuggestions,\n type StructuredAddress,\n} from '../address-autocomplete';\nimport type { OptionShape } from '../_shared/option';\nimport { useAgentRegistration } from '../../agent';\nimport {\n addressFieldsAgent,\n type AddressFieldsHandle,\n} from './address-fields.agent';\n\n/* ------------------------------------------------------------------ */\n/* Public API */\n/* */\n/* A shippable composite that wires the address fields together and */\n/* emits a single StructuredAddress. Country drives the rest: it re-keys */\n/* the province dataset, swaps the postcode rule, and re-orders the */\n/* fields. An optional \"find address\" bar fans an AddressAutocomplete */\n/* selection out into the individual fields. */\n/* ------------------------------------------------------------------ */\n\nexport type AddressFieldKey = 'street' | 'city' | 'postcode' | 'province';\n\nconst EMPTY_ADDRESS: StructuredAddress = {\n street: '',\n city: '',\n postcode: '',\n province: '',\n country: '',\n formatted: '',\n};\n\n// Minimal country-keyed field-order map — NOT a libaddressinput port.\n// Extend with another entry when a country needs a different order.\nconst FIELD_ORDER: Record<string, AddressFieldKey[]> = {\n it: ['street', 'postcode', 'city', 'province'],\n};\nconst DEFAULT_ORDER: AddressFieldKey[] = [\n 'street',\n 'city',\n 'postcode',\n 'province',\n];\n\n// Fields that span the full width in the grid layout.\nconst WIDE_CELLS = new Set<string>(['findbar', 'country', 'street']);\n\nconst layoutVariants = cva('', {\n variants: {\n layout: {\n stacked: 'ds:flex ds:flex-col ds:gap-[var(--spacing-md)]',\n grid: 'ds:grid ds:grid-cols-2 ds:gap-[var(--spacing-md)]',\n },\n },\n defaultVariants: { layout: 'stacked' },\n});\n\nexport interface AddressFieldsProps {\n /** The controlled address value. */\n value?: StructuredAddress;\n /** Fires with the next full address on any field change. */\n onChange?: (next: StructuredAddress) => void;\n /**\n * Which address-line fields to render, in order. The country picker\n * always renders first. Default resolves from the selected country.\n */\n fields?: AddressFieldKey[];\n /** Async city suggestion loader, forwarded to CityInput. */\n loadCities?: (\n query: string,\n ctx: CityLoaderContext,\n ) => Promise<OptionShape[]>;\n /** Float these countries to the top of the country picker. */\n popularCountries?: string[];\n /** Enable the \"find address\" bar — provide a Places API key… */\n apiKey?: string;\n /** …or a mock/real suggestion injector (wins over apiKey, like AddressAutocomplete). */\n getSuggestions?: GetSuggestions;\n layout?: 'stacked' | 'grid';\n disabled?: boolean;\n id?: string;\n className?: string;\n}\n\nexport const AddressFields = forwardRef<HTMLDivElement, AddressFieldsProps>(\n function AddressFields(\n {\n value,\n onChange,\n fields,\n loadCities,\n popularCountries,\n apiKey,\n getSuggestions,\n layout = 'stacked',\n disabled,\n id,\n className,\n },\n ref,\n ) {\n const { t } = useTranslation('ui');\n const address = value ?? EMPTY_ADDRESS;\n const country = address.country;\n\n const valueRef = useRef(address);\n useEffect(() => {\n valueRef.current = address;\n }, [address]);\n\n const update = useCallback(\n (patch: Partial<StructuredAddress>) => {\n onChange?.({ ...valueRef.current, ...patch });\n },\n [onChange],\n );\n\n // Find-bar selection fans the looked-up address out into every field.\n const handleFind = useCallback(\n (found: StructuredAddress) =>\n onChange?.({ ...valueRef.current, ...found }),\n [onChange],\n );\n\n const agentHandle = useMemo<AddressFieldsHandle>(\n () => ({\n getValue: () => valueRef.current,\n setValue: (next) => onChange?.(next),\n setField: (field, fieldValue) => {\n const patch: Partial<StructuredAddress> = { [field]: fieldValue };\n // Mirror the UI path: changing country re-keys the stale province.\n if (field === 'country') patch.province = '';\n onChange?.({ ...valueRef.current, ...patch });\n },\n }),\n [onChange],\n );\n useAgentRegistration(addressFieldsAgent, agentHandle, id);\n\n const order =\n fields ?? FIELD_ORDER[country?.toLowerCase() ?? ''] ?? DEFAULT_ORDER;\n\n const showFindBar = Boolean(apiKey || getSuggestions);\n\n // The composite's own adapter (`address-fields`) is the agent-addressable\n // surface; the child inputs below are deliberately rendered without an\n // `id`, so they register un-scoped rather than competing for handles.\n const fieldNode = (key: AddressFieldKey | 'country'): ReactNode => {\n switch (key) {\n case 'country':\n return (\n <FormField label={t('inputs.addressFields.country', 'Country')}>\n <CountrySelect\n value={country}\n // Country drives the rest — re-key province on change.\n onValueChange={(next) =>\n update({ country: next, province: '' })\n }\n popularCountries={popularCountries}\n disabled={disabled}\n />\n </FormField>\n );\n case 'street':\n return (\n <FormField label={t('inputs.addressFields.street', 'Street')}>\n <TextInput\n value={address.street}\n onChange={(event: ChangeEvent<HTMLInputElement>) =>\n update({ street: event.target.value })\n }\n autoComplete=\"address-line1\"\n disabled={disabled}\n />\n </FormField>\n );\n case 'city':\n return (\n <FormField label={t('inputs.addressFields.city', 'City')}>\n <CityInput\n value={address.city}\n onValueChange={(next) => update({ city: next })}\n loadCities={loadCities}\n country={country}\n province={address.province}\n disabled={disabled}\n />\n </FormField>\n );\n case 'postcode':\n return (\n <FormField label={t('inputs.addressFields.postcode', 'Postcode')}>\n <PostalCodeInput\n value={address.postcode}\n onValueChange={(next) => update({ postcode: next })}\n country={country}\n disabled={disabled}\n />\n </FormField>\n );\n case 'province':\n return (\n <FormField label={t('inputs.addressFields.province', 'Province')}>\n <ProvinceSelect\n value={address.province}\n onValueChange={(next) => update({ province: next })}\n country={country}\n disabled={disabled}\n />\n </FormField>\n );\n }\n };\n\n const cell = (key: string, node: ReactNode): ReactNode =>\n layout === 'grid' ? (\n <div\n key={key}\n className={WIDE_CELLS.has(key) ? 'ds:col-span-2' : undefined}\n >\n {node}\n </div>\n ) : (\n <div key={key}>{node}</div>\n );\n\n const children: ReactNode[] = [];\n if (showFindBar) {\n children.push(\n cell(\n 'findbar',\n <FormField label={t('inputs.addressFields.find', 'Find address')}>\n <AddressAutocomplete\n apiKey={apiKey}\n getSuggestions={getSuggestions}\n regionCodes={country ? [country] : undefined}\n disabled={disabled}\n onSelect={handleFind}\n />\n </FormField>,\n ),\n );\n }\n children.push(cell('country', fieldNode('country')));\n for (const key of order) children.push(cell(key, fieldNode(key)));\n\n return (\n <div\n ref={ref}\n data-component=\"address-fields\"\n data-component-id={id}\n className={[layoutVariants({ layout }), className]\n .filter(Boolean)\n .join(' ')}\n >\n {children}\n </div>\n );\n },\n);\n\nAddressFields.displayName = 'AddressFields';\n"],"names":["ADDRESS_PROPERTIES","addressFieldsAgent","handle","args","EMPTY_ADDRESS","FIELD_ORDER","DEFAULT_ORDER","WIDE_CELLS","layoutVariants","cva","AddressFields","forwardRef","value","onChange","fields","loadCities","popularCountries","apiKey","getSuggestions","layout","disabled","id","className","ref","t","useTranslation","address","country","valueRef","useRef","useEffect","update","useCallback","patch","handleFind","found","agentHandle","useMemo","next","field","fieldValue","useAgentRegistration","order","showFindBar","fieldNode","key","FormField","jsx","CountrySelect","TextInput","event","CityInput","PostalCodeInput","ProvinceSelect","cell","node","children","AddressAutocomplete"],"mappings":";;;;;;;;;;;;AASA,MAAMA,IAAqB;AAAA,EACzB,QAAQ,EAAE,MAAM,SAAA;AAAA,EAChB,MAAM,EAAE,MAAM,SAAA;AAAA,EACd,UAAU,EAAE,MAAM,SAAA;AAAA,EAClB,UAAU,EAAE,MAAM,UAAU,aAAa,4BAAA;AAAA,EACzC,SAAS,EAAE,MAAM,UAAU,aAAa,2BAAA;AAAA,EACxC,WAAW,EAAE,MAAM,SAAA;AACrB,GAEaC,IAAwD;AAAA,EACnE,IAAI;AAAA;AAAA;AAAA,EAGJ,cAAc,CAAC,WAAW;AAAA,EAC1B,OAAO;AAAA,IACL,OAAO;AAAA,MACL,MAAM;AAAA,MACN,gBAAgB;AAAA,MAChB,aACE;AAAA,MACF,MAAM,CAACC,MAAWA,EAAO,SAAA;AAAA,IAAS;AAAA,EACpC;AAAA,EAEF,SAAS;AAAA,IACP,WAAW;AAAA,MACT,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,YAAY;AAAA,QACV,MAAM;AAAA,QACN,YAAY;AAAA,UACV,OAAO,EAAE,MAAM,UAAU,YAAYF,EAAA;AAAA,QAAmB;AAAA,QAE1D,UAAU,CAAC,OAAO;AAAA,MAAA;AAAA,MAEpB,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,QAAQ,CAACE,GAAQC,MAAuC;AACtD,QAAAD,EAAO,SAASC,EAAK,KAAK;AAAA,MAC5B;AAAA,IAAA;AAAA,IAEF,WAAW;AAAA;AAAA;AAAA;AAAA,MAIT,QAAQ;AAAA,MACR,UACE;AAAA,MACF,YAAY;AAAA,QACV,MAAM;AAAA,QACN,YAAY;AAAA,UACV,OAAO;AAAA,YACL,MAAM;AAAA,YACN,MAAM,CAAC,UAAU,QAAQ,YAAY,YAAY,SAAS;AAAA,UAAA;AAAA,UAE5D,OAAO,EAAE,MAAM,SAAA;AAAA,QAAS;AAAA,QAE1B,UAAU,CAAC,SAAS,OAAO;AAAA,MAAA;AAAA,MAE7B,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,aACE;AAAA,MACF,UAAU;AAAA,QACR;AAAA,UACE,MAAM,EAAE,OAAO,WAAW,OAAO,KAAA;AAAA,UACjC,MAAM;AAAA,QAAA;AAAA,MACR;AAAA,MAEF,QAAQ,CACND,GACAC,MACG;AACH,QAAAD,EAAO,SAASC,EAAK,OAAOA,EAAK,KAAK;AAAA,MACxC;AAAA,IAAA;AAAA,EACF;AAAA,EAEF,UAAU;AAAA,IACR,MAAM,EAAE,MAAM,kBAAkB,OAAO,iBAAA;AAAA,IACvC,YAAY;AAAA,MACV,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,aAAa;AAAA,IAAA;AAAA,EACf;AAEJ,GCrDMC,IAAmC;AAAA,EACvC,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,UAAU;AAAA,EACV,UAAU;AAAA,EACV,SAAS;AAAA,EACT,WAAW;AACb,GAIMC,IAAiD;AAAA,EACrD,IAAI,CAAC,UAAU,YAAY,QAAQ,UAAU;AAC/C,GACMC,IAAmC;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAGMC,IAAa,oBAAI,IAAY,CAAC,WAAW,WAAW,QAAQ,CAAC,GAE7DC,IAAiBC,EAAI,IAAI;AAAA,EAC7B,UAAU;AAAA,IACR,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,MAAM;AAAA,IAAA;AAAA,EACR;AAAA,EAEF,iBAAiB,EAAE,QAAQ,UAAA;AAC7B,CAAC,GA6BYC,IAAgBC;AAAA,EAC3B,SACE;AAAA,IACE,OAAAC;AAAA,IACA,UAAAC;AAAA,IACA,QAAAC;AAAA,IACA,YAAAC;AAAA,IACA,kBAAAC;AAAA,IACA,QAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,QAAAC,IAAS;AAAA,IACT,UAAAC;AAAA,IACA,IAAAC;AAAA,IACA,WAAAC;AAAA,EAAA,GAEFC,GACA;AACA,UAAM,EAAE,GAAAC,EAAA,IAAMC,EAAe,IAAI,GAC3BC,IAAUd,KAASR,GACnBuB,IAAUD,EAAQ,SAElBE,IAAWC,EAAOH,CAAO;AAC/B,IAAAI,EAAU,MAAM;AACd,MAAAF,EAAS,UAAUF;AAAA,IACrB,GAAG,CAACA,CAAO,CAAC;AAEZ,UAAMK,IAASC;AAAA,MACb,CAACC,MAAsC;AACrC,QAAApB,KAAA,QAAAA,EAAW,EAAE,GAAGe,EAAS,SAAS,GAAGK;MACvC;AAAA,MACA,CAACpB,CAAQ;AAAA,IAAA,GAILqB,IAAaF;AAAA,MACjB,CAACG,MACCtB,KAAA,gBAAAA,EAAW,EAAE,GAAGe,EAAS,SAAS,GAAGO;MACvC,CAACtB,CAAQ;AAAA,IAAA,GAGLuB,IAAcC;AAAA,MAClB,OAAO;AAAA,QACL,UAAU,MAAMT,EAAS;AAAA,QACzB,UAAU,CAACU,MAASzB,KAAA,gBAAAA,EAAWyB;AAAA,QAC/B,UAAU,CAACC,GAAOC,MAAe;AAC/B,gBAAMP,IAAoC,EAAE,CAACM,CAAK,GAAGC,EAAA;AAErD,UAAID,MAAU,cAAWN,EAAM,WAAW,KAC1CpB,KAAA,QAAAA,EAAW,EAAE,GAAGe,EAAS,SAAS,GAAGK;QACvC;AAAA,MAAA;AAAA,MAEF,CAACpB,CAAQ;AAAA,IAAA;AAEX,IAAA4B,EAAqBxC,GAAoBmC,GAAaf,CAAE;AAExD,UAAMqB,IACJ5B,KAAUT,GAAYsB,KAAA,gBAAAA,EAAS,kBAAiB,EAAE,KAAKrB,GAEnDqC,IAAc,GAAQ1B,KAAUC,IAKhC0B,IAAY,CAACC,MAAgD;AACjE,cAAQA,GAAA;AAAA,QACN,KAAK;AACH,mCACGC,GAAA,EAAU,OAAOtB,EAAE,gCAAgC,SAAS,GAC3D,UAAA,gBAAAuB;AAAA,YAACC;AAAA,YAAA;AAAA,cACC,OAAOrB;AAAA,cAEP,eAAe,CAACW,MACdP,EAAO,EAAE,SAASO,GAAM,UAAU,IAAI;AAAA,cAExC,kBAAAtB;AAAA,cACA,UAAAI;AAAA,YAAA;AAAA,UAAA,GAEJ;AAAA,QAEJ,KAAK;AACH,mCACG0B,GAAA,EAAU,OAAOtB,EAAE,+BAA+B,QAAQ,GACzD,UAAA,gBAAAuB;AAAA,YAACE;AAAA,YAAA;AAAA,cACC,OAAOvB,EAAQ;AAAA,cACf,UAAU,CAACwB,MACTnB,EAAO,EAAE,QAAQmB,EAAM,OAAO,OAAO;AAAA,cAEvC,cAAa;AAAA,cACb,UAAA9B;AAAA,YAAA;AAAA,UAAA,GAEJ;AAAA,QAEJ,KAAK;AACH,mCACG0B,GAAA,EAAU,OAAOtB,EAAE,6BAA6B,MAAM,GACrD,UAAA,gBAAAuB;AAAA,YAACI;AAAA,YAAA;AAAA,cACC,OAAOzB,EAAQ;AAAA,cACf,eAAe,CAACY,MAASP,EAAO,EAAE,MAAMO,GAAM;AAAA,cAC9C,YAAAvB;AAAA,cACA,SAAAY;AAAA,cACA,UAAUD,EAAQ;AAAA,cAClB,UAAAN;AAAA,YAAA;AAAA,UAAA,GAEJ;AAAA,QAEJ,KAAK;AACH,mCACG0B,GAAA,EAAU,OAAOtB,EAAE,iCAAiC,UAAU,GAC7D,UAAA,gBAAAuB;AAAA,YAACK;AAAA,YAAA;AAAA,cACC,OAAO1B,EAAQ;AAAA,cACf,eAAe,CAACY,MAASP,EAAO,EAAE,UAAUO,GAAM;AAAA,cAClD,SAAAX;AAAA,cACA,UAAAP;AAAA,YAAA;AAAA,UAAA,GAEJ;AAAA,QAEJ,KAAK;AACH,mCACG0B,GAAA,EAAU,OAAOtB,EAAE,iCAAiC,UAAU,GAC7D,UAAA,gBAAAuB;AAAA,YAACM;AAAA,YAAA;AAAA,cACC,OAAO3B,EAAQ;AAAA,cACf,eAAe,CAACY,MAASP,EAAO,EAAE,UAAUO,GAAM;AAAA,cAClD,SAAAX;AAAA,cACA,UAAAP;AAAA,YAAA;AAAA,UAAA,GAEJ;AAAA,MAAA;AAAA,IAGR,GAEMkC,IAAO,CAACT,GAAaU,MACzBpC,MAAW,SACT,gBAAA4B;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,WAAWxC,EAAW,IAAIsC,CAAG,IAAI,kBAAkB;AAAA,QAElD,UAAAU;AAAA,MAAA;AAAA,MAHIV;AAAA,IAAA,IAMP,gBAAAE,EAAC,OAAA,EAAe,UAAAQ,EAAA,GAANV,CAAW,GAGnBW,IAAwB,CAAA;AAC9B,IAAIb,KACFa,EAAS;AAAA,MACPF;AAAA,QACE;AAAA,0BACCR,GAAA,EAAU,OAAOtB,EAAE,6BAA6B,cAAc,GAC7D,UAAA,gBAAAuB;AAAA,UAACU;AAAA,UAAA;AAAA,YACC,QAAAxC;AAAA,YACA,gBAAAC;AAAA,YACA,aAAaS,IAAU,CAACA,CAAO,IAAI;AAAA,YACnC,UAAAP;AAAA,YACA,UAAUc;AAAA,UAAA;AAAA,QAAA,EACZ,CACF;AAAA,MAAA;AAAA,IACF,GAGJsB,EAAS,KAAKF,EAAK,WAAWV,EAAU,SAAS,CAAC,CAAC;AACnD,eAAWC,KAAOH,EAAO,CAAAc,EAAS,KAAKF,EAAKT,GAAKD,EAAUC,CAAG,CAAC,CAAC;AAEhE,WACE,gBAAAE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAAxB;AAAA,QACA,kBAAe;AAAA,QACf,qBAAmBF;AAAA,QACnB,WAAW,CAACb,EAAe,EAAE,QAAAW,GAAQ,GAAGG,CAAS,EAC9C,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,QAEV,UAAAkC;AAAA,MAAA;AAAA,IAAA;AAAA,EAGP;AACF;AAEA9C,EAAc,cAAc;"}
1
+ {"version":3,"file":"address-fields-BIL6cvLS.js","sources":["../../src/components/address-fields/address-fields.agent.ts","../../src/components/address-fields/address-fields.tsx"],"sourcesContent":["import type { AgentAdapter } from '../../agent/types';\nimport type { StructuredAddress } from '../address-autocomplete';\n\nexport interface AddressFieldsHandle {\n getValue: () => StructuredAddress;\n setValue: (value: StructuredAddress) => void;\n setField: (field: keyof StructuredAddress, value: string) => void;\n}\n\nconst ADDRESS_PROPERTIES = {\n street: { type: 'string' },\n city: { type: 'string' },\n postcode: { type: 'string' },\n province: { type: 'string', description: 'UPPERCASED province code.' },\n country: { type: 'string', description: 'ISO alpha-2, lowercased.' },\n formatted: { type: 'string' },\n} as const;\n\nexport const addressFieldsAgent: AgentAdapter<AddressFieldsHandle> = {\n id: 'address-fields',\n // `set_value` only — a structured address form sets discrete fields; it does\n // no granular in-place rich-text editing, so `edit_inline` does not apply.\n capabilities: ['set_value'],\n state: {\n value: {\n type: 'object',\n descriptionKey: 'ui.agent.addressFields.state.value',\n description:\n 'The current structured address: { street, city, postcode, province, country, formatted }.',\n read: (handle) => handle.getValue(),\n },\n },\n actions: {\n set_value: {\n safety: 'write',\n argsType: '{ value: StructuredAddress }',\n argsSchema: {\n type: 'object',\n properties: {\n value: { type: 'object', properties: ADDRESS_PROPERTIES },\n },\n required: ['value'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.addressFields.actions.setValue',\n description: 'Replace the entire address.',\n invoke: (handle, args: { value: StructuredAddress }) => {\n handle.setValue(args.value);\n },\n },\n set_field: {\n // Contact-data write (street/city/postcode/etc.), not clinical PHI —\n // consistent with PhoneInput / EmailInput / FiscalCodeInput, which all\n // treat identifying contact data as `write`.\n safety: 'write',\n argsType:\n \"{ field: 'street' | 'city' | 'postcode' | 'province' | 'country'; value: string }\",\n argsSchema: {\n type: 'object',\n properties: {\n field: {\n type: 'string',\n enum: ['street', 'city', 'postcode', 'province', 'country'],\n },\n value: { type: 'string' },\n },\n required: ['field', 'value'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.addressFields.actions.setField',\n description:\n 'Set a single address field. Setting `country` also clears the now-stale province.',\n examples: [\n {\n args: { field: 'country', value: 'it' },\n note: 'Set the country to Italy.',\n },\n ],\n invoke: (\n handle,\n args: { field: keyof StructuredAddress; value: string },\n ) => {\n handle.setField(args.field, args.value);\n },\n },\n },\n domHooks: {\n root: { attr: 'data-component', value: 'address-fields' },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n type ChangeEvent,\n type ReactNode,\n} from 'react';\nimport { cva } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { CountrySelect } from '../country-select/country-select';\nimport { ProvinceSelect } from '../province-select/province-select';\nimport { PostalCodeInput } from '../postal-code-input/postal-code-input';\nimport { CityInput, type CityLoaderContext } from '../city-input/city-input';\nimport { TextInput } from '../text-input';\nimport { FormField } from '../form-field/form-field';\nimport {\n AddressAutocomplete,\n type GetSuggestions,\n type StructuredAddress,\n} from '../address-autocomplete';\nimport type { OptionShape } from '../_shared/option';\nimport { useAgentRegistration } from '../../agent';\nimport {\n addressFieldsAgent,\n type AddressFieldsHandle,\n} from './address-fields.agent';\n\n/* ------------------------------------------------------------------ */\n/* Public API */\n/* */\n/* A shippable composite that wires the address fields together and */\n/* emits a single StructuredAddress. Country drives the rest: it re-keys */\n/* the province dataset, swaps the postcode rule, and re-orders the */\n/* fields. An optional \"find address\" bar fans an AddressAutocomplete */\n/* selection out into the individual fields. */\n/* ------------------------------------------------------------------ */\n\nexport type AddressFieldKey = 'street' | 'city' | 'postcode' | 'province';\n\nconst EMPTY_ADDRESS: StructuredAddress = {\n street: '',\n city: '',\n postcode: '',\n province: '',\n country: '',\n formatted: '',\n};\n\n// Minimal country-keyed field-order map — NOT a libaddressinput port.\n// Extend with another entry when a country needs a different order.\nconst FIELD_ORDER: Record<string, AddressFieldKey[]> = {\n it: ['street', 'postcode', 'city', 'province'],\n};\nconst DEFAULT_ORDER: AddressFieldKey[] = [\n 'street',\n 'city',\n 'postcode',\n 'province',\n];\n\n// Fields that span the full width in the grid layout.\nconst WIDE_CELLS = new Set<string>(['findbar', 'country', 'street']);\n\nconst layoutVariants = cva('', {\n variants: {\n layout: {\n stacked: 'ds:flex ds:flex-col ds:gap-[var(--spacing-md)]',\n grid: 'ds:grid ds:grid-cols-2 ds:gap-[var(--spacing-md)]',\n },\n },\n defaultVariants: { layout: 'stacked' },\n});\n\nexport interface AddressFieldsProps {\n /** The controlled address value. */\n value?: StructuredAddress;\n /** Fires with the next full address on any field change. */\n onChange?: (next: StructuredAddress) => void;\n /**\n * Which address-line fields to render, in order. The country picker\n * always renders first. Default resolves from the selected country.\n */\n fields?: AddressFieldKey[];\n /** Async city suggestion loader, forwarded to CityInput. */\n loadCities?: (\n query: string,\n ctx: CityLoaderContext,\n ) => Promise<OptionShape[]>;\n /** Float these countries to the top of the country picker. */\n popularCountries?: string[];\n /** Enable the \"find address\" bar — provide a Places API key… */\n apiKey?: string;\n /** …or a mock/real suggestion injector (wins over apiKey, like AddressAutocomplete). */\n getSuggestions?: GetSuggestions;\n layout?: 'stacked' | 'grid';\n disabled?: boolean;\n id?: string;\n className?: string;\n}\n\nexport const AddressFields = forwardRef<HTMLDivElement, AddressFieldsProps>(\n function AddressFields(\n {\n value,\n onChange,\n fields,\n loadCities,\n popularCountries,\n apiKey,\n getSuggestions,\n layout = 'stacked',\n disabled,\n id,\n className,\n },\n ref,\n ) {\n const { t } = useTranslation('ui');\n const address = value ?? EMPTY_ADDRESS;\n const country = address.country;\n\n const valueRef = useRef(address);\n useEffect(() => {\n valueRef.current = address;\n }, [address]);\n\n const update = useCallback(\n (patch: Partial<StructuredAddress>) => {\n onChange?.({ ...valueRef.current, ...patch });\n },\n [onChange],\n );\n\n // Find-bar selection fans the looked-up address out into every field.\n const handleFind = useCallback(\n (found: StructuredAddress) =>\n onChange?.({ ...valueRef.current, ...found }),\n [onChange],\n );\n\n const agentHandle = useMemo<AddressFieldsHandle>(\n () => ({\n getValue: () => valueRef.current,\n setValue: (next) => onChange?.(next),\n setField: (field, fieldValue) => {\n const patch: Partial<StructuredAddress> = { [field]: fieldValue };\n // Mirror the UI path: changing country re-keys the stale province.\n if (field === 'country') patch.province = '';\n onChange?.({ ...valueRef.current, ...patch });\n },\n }),\n [onChange],\n );\n useAgentRegistration(addressFieldsAgent, agentHandle, id);\n\n const order =\n fields ?? FIELD_ORDER[country?.toLowerCase() ?? ''] ?? DEFAULT_ORDER;\n\n const showFindBar = Boolean(apiKey || getSuggestions);\n\n // The composite's own adapter (`address-fields`) is the agent-addressable\n // surface; the child inputs below are deliberately rendered without an\n // `id`, so they register un-scoped rather than competing for handles.\n const fieldNode = (key: AddressFieldKey | 'country'): ReactNode => {\n switch (key) {\n case 'country':\n return (\n <FormField label={t('inputs.addressFields.country', 'Country')}>\n <CountrySelect\n value={country}\n // Country drives the rest — re-key province on change.\n onValueChange={(next) =>\n update({ country: next, province: '' })\n }\n popularCountries={popularCountries}\n disabled={disabled}\n />\n </FormField>\n );\n case 'street':\n return (\n <FormField label={t('inputs.addressFields.street', 'Street')}>\n <TextInput\n value={address.street}\n onChange={(event: ChangeEvent<HTMLInputElement>) =>\n update({ street: event.target.value })\n }\n autoComplete=\"address-line1\"\n disabled={disabled}\n />\n </FormField>\n );\n case 'city':\n return (\n <FormField label={t('inputs.addressFields.city', 'City')}>\n <CityInput\n value={address.city}\n onValueChange={(next) => update({ city: next })}\n loadCities={loadCities}\n country={country}\n province={address.province}\n disabled={disabled}\n />\n </FormField>\n );\n case 'postcode':\n return (\n <FormField label={t('inputs.addressFields.postcode', 'Postcode')}>\n <PostalCodeInput\n value={address.postcode}\n onValueChange={(next) => update({ postcode: next })}\n country={country}\n disabled={disabled}\n />\n </FormField>\n );\n case 'province':\n return (\n <FormField label={t('inputs.addressFields.province', 'Province')}>\n <ProvinceSelect\n value={address.province}\n onValueChange={(next) => update({ province: next })}\n country={country}\n disabled={disabled}\n />\n </FormField>\n );\n }\n };\n\n const cell = (key: string, node: ReactNode): ReactNode =>\n layout === 'grid' ? (\n <div\n key={key}\n className={WIDE_CELLS.has(key) ? 'ds:col-span-2' : undefined}\n >\n {node}\n </div>\n ) : (\n <div key={key}>{node}</div>\n );\n\n const children: ReactNode[] = [];\n if (showFindBar) {\n children.push(\n cell(\n 'findbar',\n <FormField label={t('inputs.addressFields.find', 'Find address')}>\n <AddressAutocomplete\n apiKey={apiKey}\n getSuggestions={getSuggestions}\n regionCodes={country ? [country] : undefined}\n disabled={disabled}\n onSelect={handleFind}\n />\n </FormField>,\n ),\n );\n }\n children.push(cell('country', fieldNode('country')));\n for (const key of order) children.push(cell(key, fieldNode(key)));\n\n return (\n <div\n ref={ref}\n data-component=\"address-fields\"\n data-component-id={id}\n className={[layoutVariants({ layout }), className]\n .filter(Boolean)\n .join(' ')}\n >\n {children}\n </div>\n );\n },\n);\n\nAddressFields.displayName = 'AddressFields';\n"],"names":["ADDRESS_PROPERTIES","addressFieldsAgent","handle","args","EMPTY_ADDRESS","FIELD_ORDER","DEFAULT_ORDER","WIDE_CELLS","layoutVariants","cva","AddressFields","forwardRef","value","onChange","fields","loadCities","popularCountries","apiKey","getSuggestions","layout","disabled","id","className","ref","t","useTranslation","address","country","valueRef","useRef","useEffect","update","useCallback","patch","handleFind","found","agentHandle","useMemo","next","field","fieldValue","useAgentRegistration","order","showFindBar","fieldNode","key","FormField","jsx","CountrySelect","TextInput","event","CityInput","PostalCodeInput","ProvinceSelect","cell","node","children","AddressAutocomplete"],"mappings":";;;;;;;;;;;;AASA,MAAMA,IAAqB;AAAA,EACzB,QAAQ,EAAE,MAAM,SAAA;AAAA,EAChB,MAAM,EAAE,MAAM,SAAA;AAAA,EACd,UAAU,EAAE,MAAM,SAAA;AAAA,EAClB,UAAU,EAAE,MAAM,UAAU,aAAa,4BAAA;AAAA,EACzC,SAAS,EAAE,MAAM,UAAU,aAAa,2BAAA;AAAA,EACxC,WAAW,EAAE,MAAM,SAAA;AACrB,GAEaC,IAAwD;AAAA,EACnE,IAAI;AAAA;AAAA;AAAA,EAGJ,cAAc,CAAC,WAAW;AAAA,EAC1B,OAAO;AAAA,IACL,OAAO;AAAA,MACL,MAAM;AAAA,MACN,gBAAgB;AAAA,MAChB,aACE;AAAA,MACF,MAAM,CAACC,MAAWA,EAAO,SAAA;AAAA,IAAS;AAAA,EACpC;AAAA,EAEF,SAAS;AAAA,IACP,WAAW;AAAA,MACT,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,YAAY;AAAA,QACV,MAAM;AAAA,QACN,YAAY;AAAA,UACV,OAAO,EAAE,MAAM,UAAU,YAAYF,EAAA;AAAA,QAAmB;AAAA,QAE1D,UAAU,CAAC,OAAO;AAAA,MAAA;AAAA,MAEpB,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,QAAQ,CAACE,GAAQC,MAAuC;AACtD,QAAAD,EAAO,SAASC,EAAK,KAAK;AAAA,MAC5B;AAAA,IAAA;AAAA,IAEF,WAAW;AAAA;AAAA;AAAA;AAAA,MAIT,QAAQ;AAAA,MACR,UACE;AAAA,MACF,YAAY;AAAA,QACV,MAAM;AAAA,QACN,YAAY;AAAA,UACV,OAAO;AAAA,YACL,MAAM;AAAA,YACN,MAAM,CAAC,UAAU,QAAQ,YAAY,YAAY,SAAS;AAAA,UAAA;AAAA,UAE5D,OAAO,EAAE,MAAM,SAAA;AAAA,QAAS;AAAA,QAE1B,UAAU,CAAC,SAAS,OAAO;AAAA,MAAA;AAAA,MAE7B,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,aACE;AAAA,MACF,UAAU;AAAA,QACR;AAAA,UACE,MAAM,EAAE,OAAO,WAAW,OAAO,KAAA;AAAA,UACjC,MAAM;AAAA,QAAA;AAAA,MACR;AAAA,MAEF,QAAQ,CACND,GACAC,MACG;AACH,QAAAD,EAAO,SAASC,EAAK,OAAOA,EAAK,KAAK;AAAA,MACxC;AAAA,IAAA;AAAA,EACF;AAAA,EAEF,UAAU;AAAA,IACR,MAAM,EAAE,MAAM,kBAAkB,OAAO,iBAAA;AAAA,IACvC,YAAY;AAAA,MACV,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,aAAa;AAAA,IAAA;AAAA,EACf;AAEJ,GCrDMC,IAAmC;AAAA,EACvC,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,UAAU;AAAA,EACV,UAAU;AAAA,EACV,SAAS;AAAA,EACT,WAAW;AACb,GAIMC,IAAiD;AAAA,EACrD,IAAI,CAAC,UAAU,YAAY,QAAQ,UAAU;AAC/C,GACMC,IAAmC;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAGMC,IAAa,oBAAI,IAAY,CAAC,WAAW,WAAW,QAAQ,CAAC,GAE7DC,IAAiBC,EAAI,IAAI;AAAA,EAC7B,UAAU;AAAA,IACR,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,MAAM;AAAA,IAAA;AAAA,EACR;AAAA,EAEF,iBAAiB,EAAE,QAAQ,UAAA;AAC7B,CAAC,GA6BYC,IAAgBC;AAAA,EAC3B,SACE;AAAA,IACE,OAAAC;AAAA,IACA,UAAAC;AAAA,IACA,QAAAC;AAAA,IACA,YAAAC;AAAA,IACA,kBAAAC;AAAA,IACA,QAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,QAAAC,IAAS;AAAA,IACT,UAAAC;AAAA,IACA,IAAAC;AAAA,IACA,WAAAC;AAAA,EAAA,GAEFC,GACA;AACA,UAAM,EAAE,GAAAC,EAAA,IAAMC,EAAe,IAAI,GAC3BC,IAAUd,KAASR,GACnBuB,IAAUD,EAAQ,SAElBE,IAAWC,EAAOH,CAAO;AAC/B,IAAAI,EAAU,MAAM;AACd,MAAAF,EAAS,UAAUF;AAAA,IACrB,GAAG,CAACA,CAAO,CAAC;AAEZ,UAAMK,IAASC;AAAA,MACb,CAACC,MAAsC;AACrC,QAAApB,KAAA,QAAAA,EAAW,EAAE,GAAGe,EAAS,SAAS,GAAGK;MACvC;AAAA,MACA,CAACpB,CAAQ;AAAA,IAAA,GAILqB,IAAaF;AAAA,MACjB,CAACG,MACCtB,KAAA,gBAAAA,EAAW,EAAE,GAAGe,EAAS,SAAS,GAAGO;MACvC,CAACtB,CAAQ;AAAA,IAAA,GAGLuB,IAAcC;AAAA,MAClB,OAAO;AAAA,QACL,UAAU,MAAMT,EAAS;AAAA,QACzB,UAAU,CAACU,MAASzB,KAAA,gBAAAA,EAAWyB;AAAA,QAC/B,UAAU,CAACC,GAAOC,MAAe;AAC/B,gBAAMP,IAAoC,EAAE,CAACM,CAAK,GAAGC,EAAA;AAErD,UAAID,MAAU,cAAWN,EAAM,WAAW,KAC1CpB,KAAA,QAAAA,EAAW,EAAE,GAAGe,EAAS,SAAS,GAAGK;QACvC;AAAA,MAAA;AAAA,MAEF,CAACpB,CAAQ;AAAA,IAAA;AAEX,IAAA4B,EAAqBxC,GAAoBmC,GAAaf,CAAE;AAExD,UAAMqB,IACJ5B,KAAUT,GAAYsB,KAAA,gBAAAA,EAAS,kBAAiB,EAAE,KAAKrB,GAEnDqC,IAAc,GAAQ1B,KAAUC,IAKhC0B,IAAY,CAACC,MAAgD;AACjE,cAAQA,GAAA;AAAA,QACN,KAAK;AACH,mCACGC,GAAA,EAAU,OAAOtB,EAAE,gCAAgC,SAAS,GAC3D,UAAA,gBAAAuB;AAAA,YAACC;AAAA,YAAA;AAAA,cACC,OAAOrB;AAAA,cAEP,eAAe,CAACW,MACdP,EAAO,EAAE,SAASO,GAAM,UAAU,IAAI;AAAA,cAExC,kBAAAtB;AAAA,cACA,UAAAI;AAAA,YAAA;AAAA,UAAA,GAEJ;AAAA,QAEJ,KAAK;AACH,mCACG0B,GAAA,EAAU,OAAOtB,EAAE,+BAA+B,QAAQ,GACzD,UAAA,gBAAAuB;AAAA,YAACE;AAAA,YAAA;AAAA,cACC,OAAOvB,EAAQ;AAAA,cACf,UAAU,CAACwB,MACTnB,EAAO,EAAE,QAAQmB,EAAM,OAAO,OAAO;AAAA,cAEvC,cAAa;AAAA,cACb,UAAA9B;AAAA,YAAA;AAAA,UAAA,GAEJ;AAAA,QAEJ,KAAK;AACH,mCACG0B,GAAA,EAAU,OAAOtB,EAAE,6BAA6B,MAAM,GACrD,UAAA,gBAAAuB;AAAA,YAACI;AAAA,YAAA;AAAA,cACC,OAAOzB,EAAQ;AAAA,cACf,eAAe,CAACY,MAASP,EAAO,EAAE,MAAMO,GAAM;AAAA,cAC9C,YAAAvB;AAAA,cACA,SAAAY;AAAA,cACA,UAAUD,EAAQ;AAAA,cAClB,UAAAN;AAAA,YAAA;AAAA,UAAA,GAEJ;AAAA,QAEJ,KAAK;AACH,mCACG0B,GAAA,EAAU,OAAOtB,EAAE,iCAAiC,UAAU,GAC7D,UAAA,gBAAAuB;AAAA,YAACK;AAAA,YAAA;AAAA,cACC,OAAO1B,EAAQ;AAAA,cACf,eAAe,CAACY,MAASP,EAAO,EAAE,UAAUO,GAAM;AAAA,cAClD,SAAAX;AAAA,cACA,UAAAP;AAAA,YAAA;AAAA,UAAA,GAEJ;AAAA,QAEJ,KAAK;AACH,mCACG0B,GAAA,EAAU,OAAOtB,EAAE,iCAAiC,UAAU,GAC7D,UAAA,gBAAAuB;AAAA,YAACM;AAAA,YAAA;AAAA,cACC,OAAO3B,EAAQ;AAAA,cACf,eAAe,CAACY,MAASP,EAAO,EAAE,UAAUO,GAAM;AAAA,cAClD,SAAAX;AAAA,cACA,UAAAP;AAAA,YAAA;AAAA,UAAA,GAEJ;AAAA,MAAA;AAAA,IAGR,GAEMkC,IAAO,CAACT,GAAaU,MACzBpC,MAAW,SACT,gBAAA4B;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,WAAWxC,EAAW,IAAIsC,CAAG,IAAI,kBAAkB;AAAA,QAElD,UAAAU;AAAA,MAAA;AAAA,MAHIV;AAAA,IAAA,IAMP,gBAAAE,EAAC,OAAA,EAAe,UAAAQ,EAAA,GAANV,CAAW,GAGnBW,IAAwB,CAAA;AAC9B,IAAIb,KACFa,EAAS;AAAA,MACPF;AAAA,QACE;AAAA,0BACCR,GAAA,EAAU,OAAOtB,EAAE,6BAA6B,cAAc,GAC7D,UAAA,gBAAAuB;AAAA,UAACU;AAAA,UAAA;AAAA,YACC,QAAAxC;AAAA,YACA,gBAAAC;AAAA,YACA,aAAaS,IAAU,CAACA,CAAO,IAAI;AAAA,YACnC,UAAAP;AAAA,YACA,UAAUc;AAAA,UAAA;AAAA,QAAA,EACZ,CACF;AAAA,MAAA;AAAA,IACF,GAGJsB,EAAS,KAAKF,EAAK,WAAWV,EAAU,SAAS,CAAC,CAAC;AACnD,eAAWC,KAAOH,EAAO,CAAAc,EAAS,KAAKF,EAAKT,GAAKD,EAAUC,CAAG,CAAC,CAAC;AAEhE,WACE,gBAAAE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAAxB;AAAA,QACA,kBAAe;AAAA,QACf,qBAAmBF;AAAA,QACnB,WAAW,CAACb,EAAe,EAAE,QAAAW,GAAQ,GAAGG,CAAS,EAC9C,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,QAEV,UAAAkC;AAAA,MAAA;AAAA,IAAA;AAAA,EAGP;AACF;AAEA9C,EAAc,cAAc;"}
@@ -4,7 +4,7 @@ import { c as H } from "./index-D2ZczOXr.js";
4
4
  import { useTranslation as K } from "react-i18next";
5
5
  import { I as M } from "./icon-button-JAXAkqWC.js";
6
6
  import { S as A } from "./skeleton-B1KTdJ4N.js";
7
- import { E as D } from "./empty-state-DActfjdn.js";
7
+ import { E as D } from "./empty-state-C62P_6kr.js";
8
8
  import { A as V } from "./agenda-card-CakEvwnM.js";
9
9
  import { u as F } from "./registry-DvAUVLHh.js";
10
10
  import { C as G } from "./calendar-days-BGWklvE-.js";
@@ -212,4 +212,4 @@ export {
212
212
  U as A,
213
213
  L as a
214
214
  };
215
- //# sourceMappingURL=agenda-tray-C-_iu6Fo.js.map
215
+ //# sourceMappingURL=agenda-tray-C2a8OfKC.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"agenda-tray-C-_iu6Fo.js","sources":["../../src/components/agenda-tray/agenda-tray.agent.ts","../../src/components/agenda-tray/agenda-tray.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — AgendaTray. */\n/* */\n/* Tray-level surface: read appointment ids + lifecycle status (never */\n/* patient names / treatments), and route an activation through the */\n/* curated handle. AgendaTray is in-page (no open/close). */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { AgendaTrayHandle } from './agenda-tray';\n\nexport const agendaTrayAgent: AgentAdapter<AgendaTrayHandle> = {\n id: 'agenda-tray',\n // `pick` (NON-persisting): select_item activates / opens an appointment by\n // firing onOpenAppointment — it does not store a \"selected\" value on the tray\n // (there is no selection state slot), so this is a pick, not select_single.\n capabilities: ['pick'],\n state: {\n items: {\n type: 'Array<{ id: string; status: string }>',\n descriptionKey: 'ui.agent.agendaTray.state.items',\n description:\n 'Currently-displayed appointments. Ids + status only — never patient identity.',\n read: (handle) => handle.getItems(),\n },\n },\n actions: {\n select_item: {\n // Activates (opens) an appointment — pure navigation, no data mutation.\n safety: 'read',\n argsType: '{ id: string }',\n argsSchema: {\n type: 'object',\n properties: { id: { type: 'string' } },\n required: ['id'],\n },\n descriptionKey: 'ui.agent.agendaTray.actions.selectItem',\n description: 'Activate the appointment with the given id.',\n examples: [\n { args: { id: 'appt-204' }, note: 'Open appointment appt-204.' },\n ],\n invoke: (handle, args: { id: string }) => {\n handle.selectItem(args.id);\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'agenda-tray',\n description: 'Marks the AgendaTray wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description:\n 'Sourced from the id prop. Required to address a specific tray from the agent.',\n },\n item: {\n attr: 'data-appointment-id',\n description:\n 'Stable appointment id emitted on each rendered AgendaCard inside the tray.',\n },\n },\n};\n","import {\n forwardRef,\n useImperativeHandle,\n useMemo,\n useRef,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { CalendarDays, Plus } from 'lucide-react';\nimport { IconButton } from '../button/icon-button';\nimport { Skeleton } from '../skeleton/skeleton';\nimport { EmptyState } from '../empty-state/empty-state';\nimport { AgendaCard, type AgendaItem } from '../agenda-card';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { agendaTrayAgent } from './agenda-tray.agent';\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst agendaTrayVariants = cva(\n [\n 'ds:flex ds:flex-col',\n 'ds:rounded-[var(--radius-md)] ds:shadow-[var(--shadow-card)]',\n 'ds:border ds:border-[color:var(--card-border)] ds:[.theme-accessible_&]:border-2',\n 'ds:bg-[color:var(--card)] ds:text-[color:var(--card-foreground)]',\n 'ds:overflow-hidden',\n ].join(' '),\n {\n variants: {\n size: {\n sm: '',\n md: '',\n },\n },\n defaultVariants: {\n size: 'sm',\n },\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\n/**\n * Curated imperative handle for AgendaTray. Exposed as the forwardRef\n * target so a future agent / MCP UI bridge can drive the tray without\n * touching the DOM. See `agenda-tray.agent.ts`.\n */\nexport interface AgendaTrayHandle {\n getItems: () => Array<{ id: string; status: string }>;\n selectItem: (id: string) => void;\n}\n\nexport interface AgendaTrayProps\n extends\n Omit<HTMLAttributes<HTMLElement>, 'onClick' | 'id'>,\n VariantProps<typeof agendaTrayVariants> {\n /**\n * Stable instance id. Surfaced on the root as `data-component-id` so\n * an agent / MCP UI bridge can address this specific tray.\n */\n id?: string;\n items: AgendaItem[];\n /** Section title — rendered in the header. Localised by the consumer. */\n title?: string;\n /** Optional small caption (e.g. localised date) shown next to the title. */\n caption?: string;\n size?: 'sm' | 'md';\n onOpenAppointment?: (item: AgendaItem) => void;\n onAddAppointment?: () => void;\n /** Localised label for the \"Add\" affordance. */\n addLabel?: string;\n loading?: boolean;\n emptyTitle?: string;\n emptyDescription?: string;\n /** Optional CTA wired into the empty state (EmptyState primaryAction). */\n emptyAction?: { label: string; onClick: () => void };\n /**\n * Pinned footer link (e.g. \"All upcoming appointments\"). Localised by\n * the consumer; rendered after the list, before the section closes.\n */\n viewAllLabel?: string;\n /** Fires when the footer link is activated. Required to render it. */\n onViewAll?: () => void;\n /**\n * Per-row trailing action toolbar, forwarded to each AgendaCard's\n * `actions` slot.\n */\n renderItemActions?: (item: AgendaItem) => ReactNode;\n /**\n * Constrain the list to the tray's own height and scroll inside it —\n * pair with a height/max-height on `className`. The scroll region is\n * keyboard-focusable so it stays operable without a pointer.\n */\n scrollable?: boolean;\n}\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport const AgendaTray = forwardRef<HTMLElement, AgendaTrayProps>(\n (\n {\n id,\n items,\n title,\n caption,\n size = 'sm',\n onOpenAppointment,\n onAddAppointment,\n addLabel,\n loading = false,\n emptyTitle,\n emptyDescription,\n emptyAction,\n viewAllLabel,\n onViewAll,\n renderItemActions,\n scrollable = false,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation('ui');\n const heading = title ?? t('agendaTray.title', \"Today's appointments\");\n const resolvedAddLabel = addLabel ?? t('agendaTray.add', 'Add appointment');\n const isEmpty = !loading && items.length === 0;\n\n let body: ReactNode;\n if (loading) {\n body = (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)] ds:p-[var(--spacing-sm)]\">\n {[0, 1, 2].map((i) => (\n <Skeleton key={i} variant=\"rectangular\" height=\"2.5rem\" />\n ))}\n </div>\n );\n } else if (isEmpty) {\n body = (\n <div className=\"ds:p-[var(--spacing-md)]\">\n <EmptyState\n variant=\"first-use\"\n size=\"sm\"\n title={emptyTitle ?? t('agendaTray.empty.title', 'No appointments')}\n description={\n emptyDescription ??\n t(\n 'agendaTray.empty.description',\n 'New appointments will appear here.',\n )\n }\n primaryAction={emptyAction}\n />\n </div>\n );\n } else {\n body = (\n <ul\n className={[\n // flex-1 unconditionally so a footer pins to the tray's\n // bottom edge in equal-height grid rows.\n 'ds:flex ds:list-none ds:flex-col ds:flex-1 ds:min-h-0',\n // Keyboard-focusable when it scrolls (axe\n // scrollable-region-focusable) — pair with a height on the\n // tray's className.\n scrollable ? 'ds:overflow-y-auto' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex -- scrollable list must be keyboard focusable (axe scrollable-region-focusable)\n tabIndex={scrollable ? 0 : undefined}\n aria-label={scrollable ? heading : undefined}\n >\n {items.map((item) => (\n <AgendaCard\n key={item.id}\n item={item}\n size={size}\n onActivate={onOpenAppointment}\n actions={renderItemActions?.(item)}\n data-appointment-id={item.id}\n />\n ))}\n </ul>\n );\n }\n\n /* Curated imperative handle for agent integration. See\n * agenda-tray.agent.ts. */\n const itemsRef = useRef<AgendaItem[]>(items);\n itemsRef.current = items;\n\n const innerRef = useRef<HTMLElement>(null);\n useImperativeHandle(ref, () => innerRef.current as HTMLElement, []);\n\n const handle = useMemo<AgendaTrayHandle>(\n () => ({\n getItems: () =>\n itemsRef.current.map((i) => ({\n id: i.id,\n status: i.status ?? 'confirmed',\n })),\n selectItem: (targetId: string) => {\n const found = itemsRef.current.find((i) => i.id === targetId);\n if (found) onOpenAppointment?.(found);\n },\n }),\n [onOpenAppointment],\n );\n\n useAgentRegistration(agendaTrayAgent, handle, id);\n\n return (\n <section\n ref={innerRef}\n aria-label={heading}\n data-component=\"agenda-tray\"\n data-component-id={id}\n className={agendaTrayVariants({ size, className })}\n {...rest}\n >\n <header className=\"ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)] ds:p-[var(--spacing-sm)]\">\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)] ds:min-w-0\">\n <h3 className=\"ds:m-0 ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)] type-title-card\">\n <CalendarDays aria-hidden=\"true\" className=\"ds:size-4\" />\n {heading}\n </h3>\n {caption ? (\n <span className=\"type-eyebrow ds:text-[color:var(--muted-foreground)]\">\n {caption}\n </span>\n ) : null}\n </div>\n {onAddAppointment ? (\n <IconButton\n icon={<Plus />}\n intent=\"outline\"\n size=\"sm\"\n aria-label={resolvedAddLabel}\n onClick={onAddAppointment}\n />\n ) : null}\n </header>\n {body}\n {viewAllLabel && onViewAll && !isEmpty && !loading ? (\n <footer className=\"ds:[border-block-start:var(--border-width-sm)_solid_var(--card-border)] ds:p-[var(--spacing-sm)]\">\n <button\n type=\"button\"\n onClick={onViewAll}\n className={[\n 'type-label ds:text-[color:var(--link)] ds:underline ds:underline-offset-2 ds:hover:no-underline',\n 'ds:rounded-[var(--radius-sm)] ds:min-h-[var(--min-target-size)] ds:ps-[var(--spacing-xs)] ds:pe-[var(--spacing-xs)]',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n ].join(' ')}\n >\n {viewAllLabel}\n </button>\n </footer>\n ) : null}\n </section>\n );\n },\n);\n\nAgendaTray.displayName = 'AgendaTray';\n"],"names":["agendaTrayAgent","handle","args","agendaTrayVariants","cva","AgendaTray","forwardRef","id","items","title","caption","size","onOpenAppointment","onAddAppointment","addLabel","loading","emptyTitle","emptyDescription","emptyAction","viewAllLabel","onViewAll","renderItemActions","scrollable","className","rest","ref","t","useTranslation","heading","resolvedAddLabel","isEmpty","body","jsx","i","Skeleton","EmptyState","item","AgendaCard","itemsRef","useRef","innerRef","useImperativeHandle","useMemo","targetId","found","useAgentRegistration","jsxs","CalendarDays","IconButton","Plus"],"mappings":"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"}
1
+ {"version":3,"file":"agenda-tray-C2a8OfKC.js","sources":["../../src/components/agenda-tray/agenda-tray.agent.ts","../../src/components/agenda-tray/agenda-tray.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — AgendaTray. */\n/* */\n/* Tray-level surface: read appointment ids + lifecycle status (never */\n/* patient names / treatments), and route an activation through the */\n/* curated handle. AgendaTray is in-page (no open/close). */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { AgendaTrayHandle } from './agenda-tray';\n\nexport const agendaTrayAgent: AgentAdapter<AgendaTrayHandle> = {\n id: 'agenda-tray',\n // `pick` (NON-persisting): select_item activates / opens an appointment by\n // firing onOpenAppointment — it does not store a \"selected\" value on the tray\n // (there is no selection state slot), so this is a pick, not select_single.\n capabilities: ['pick'],\n state: {\n items: {\n type: 'Array<{ id: string; status: string }>',\n descriptionKey: 'ui.agent.agendaTray.state.items',\n description:\n 'Currently-displayed appointments. Ids + status only — never patient identity.',\n read: (handle) => handle.getItems(),\n },\n },\n actions: {\n select_item: {\n // Activates (opens) an appointment — pure navigation, no data mutation.\n safety: 'read',\n argsType: '{ id: string }',\n argsSchema: {\n type: 'object',\n properties: { id: { type: 'string' } },\n required: ['id'],\n },\n descriptionKey: 'ui.agent.agendaTray.actions.selectItem',\n description: 'Activate the appointment with the given id.',\n examples: [\n { args: { id: 'appt-204' }, note: 'Open appointment appt-204.' },\n ],\n invoke: (handle, args: { id: string }) => {\n handle.selectItem(args.id);\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'agenda-tray',\n description: 'Marks the AgendaTray wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description:\n 'Sourced from the id prop. Required to address a specific tray from the agent.',\n },\n item: {\n attr: 'data-appointment-id',\n description:\n 'Stable appointment id emitted on each rendered AgendaCard inside the tray.',\n },\n },\n};\n","import {\n forwardRef,\n useImperativeHandle,\n useMemo,\n useRef,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { CalendarDays, Plus } from 'lucide-react';\nimport { IconButton } from '../button/icon-button';\nimport { Skeleton } from '../skeleton/skeleton';\nimport { EmptyState } from '../empty-state/empty-state';\nimport { AgendaCard, type AgendaItem } from '../agenda-card';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { agendaTrayAgent } from './agenda-tray.agent';\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst agendaTrayVariants = cva(\n [\n 'ds:flex ds:flex-col',\n 'ds:rounded-[var(--radius-md)] ds:shadow-[var(--shadow-card)]',\n 'ds:border ds:border-[color:var(--card-border)] ds:[.theme-accessible_&]:border-2',\n 'ds:bg-[color:var(--card)] ds:text-[color:var(--card-foreground)]',\n 'ds:overflow-hidden',\n ].join(' '),\n {\n variants: {\n size: {\n sm: '',\n md: '',\n },\n },\n defaultVariants: {\n size: 'sm',\n },\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\n/**\n * Curated imperative handle for AgendaTray. Exposed as the forwardRef\n * target so a future agent / MCP UI bridge can drive the tray without\n * touching the DOM. See `agenda-tray.agent.ts`.\n */\nexport interface AgendaTrayHandle {\n getItems: () => Array<{ id: string; status: string }>;\n selectItem: (id: string) => void;\n}\n\nexport interface AgendaTrayProps\n extends\n Omit<HTMLAttributes<HTMLElement>, 'onClick' | 'id'>,\n VariantProps<typeof agendaTrayVariants> {\n /**\n * Stable instance id. Surfaced on the root as `data-component-id` so\n * an agent / MCP UI bridge can address this specific tray.\n */\n id?: string;\n items: AgendaItem[];\n /** Section title — rendered in the header. Localised by the consumer. */\n title?: string;\n /** Optional small caption (e.g. localised date) shown next to the title. */\n caption?: string;\n size?: 'sm' | 'md';\n onOpenAppointment?: (item: AgendaItem) => void;\n onAddAppointment?: () => void;\n /** Localised label for the \"Add\" affordance. */\n addLabel?: string;\n loading?: boolean;\n emptyTitle?: string;\n emptyDescription?: string;\n /** Optional CTA wired into the empty state (EmptyState primaryAction). */\n emptyAction?: { label: string; onClick: () => void };\n /**\n * Pinned footer link (e.g. \"All upcoming appointments\"). Localised by\n * the consumer; rendered after the list, before the section closes.\n */\n viewAllLabel?: string;\n /** Fires when the footer link is activated. Required to render it. */\n onViewAll?: () => void;\n /**\n * Per-row trailing action toolbar, forwarded to each AgendaCard's\n * `actions` slot.\n */\n renderItemActions?: (item: AgendaItem) => ReactNode;\n /**\n * Constrain the list to the tray's own height and scroll inside it —\n * pair with a height/max-height on `className`. The scroll region is\n * keyboard-focusable so it stays operable without a pointer.\n */\n scrollable?: boolean;\n}\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport const AgendaTray = forwardRef<HTMLElement, AgendaTrayProps>(\n (\n {\n id,\n items,\n title,\n caption,\n size = 'sm',\n onOpenAppointment,\n onAddAppointment,\n addLabel,\n loading = false,\n emptyTitle,\n emptyDescription,\n emptyAction,\n viewAllLabel,\n onViewAll,\n renderItemActions,\n scrollable = false,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation('ui');\n const heading = title ?? t('agendaTray.title', \"Today's appointments\");\n const resolvedAddLabel = addLabel ?? t('agendaTray.add', 'Add appointment');\n const isEmpty = !loading && items.length === 0;\n\n let body: ReactNode;\n if (loading) {\n body = (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)] ds:p-[var(--spacing-sm)]\">\n {[0, 1, 2].map((i) => (\n <Skeleton key={i} variant=\"rectangular\" height=\"2.5rem\" />\n ))}\n </div>\n );\n } else if (isEmpty) {\n body = (\n <div className=\"ds:p-[var(--spacing-md)]\">\n <EmptyState\n variant=\"first-use\"\n size=\"sm\"\n title={emptyTitle ?? t('agendaTray.empty.title', 'No appointments')}\n description={\n emptyDescription ??\n t(\n 'agendaTray.empty.description',\n 'New appointments will appear here.',\n )\n }\n primaryAction={emptyAction}\n />\n </div>\n );\n } else {\n body = (\n <ul\n className={[\n // flex-1 unconditionally so a footer pins to the tray's\n // bottom edge in equal-height grid rows.\n 'ds:flex ds:list-none ds:flex-col ds:flex-1 ds:min-h-0',\n // Keyboard-focusable when it scrolls (axe\n // scrollable-region-focusable) — pair with a height on the\n // tray's className.\n scrollable ? 'ds:overflow-y-auto' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex -- scrollable list must be keyboard focusable (axe scrollable-region-focusable)\n tabIndex={scrollable ? 0 : undefined}\n aria-label={scrollable ? heading : undefined}\n >\n {items.map((item) => (\n <AgendaCard\n key={item.id}\n item={item}\n size={size}\n onActivate={onOpenAppointment}\n actions={renderItemActions?.(item)}\n data-appointment-id={item.id}\n />\n ))}\n </ul>\n );\n }\n\n /* Curated imperative handle for agent integration. See\n * agenda-tray.agent.ts. */\n const itemsRef = useRef<AgendaItem[]>(items);\n itemsRef.current = items;\n\n const innerRef = useRef<HTMLElement>(null);\n useImperativeHandle(ref, () => innerRef.current as HTMLElement, []);\n\n const handle = useMemo<AgendaTrayHandle>(\n () => ({\n getItems: () =>\n itemsRef.current.map((i) => ({\n id: i.id,\n status: i.status ?? 'confirmed',\n })),\n selectItem: (targetId: string) => {\n const found = itemsRef.current.find((i) => i.id === targetId);\n if (found) onOpenAppointment?.(found);\n },\n }),\n [onOpenAppointment],\n );\n\n useAgentRegistration(agendaTrayAgent, handle, id);\n\n return (\n <section\n ref={innerRef}\n aria-label={heading}\n data-component=\"agenda-tray\"\n data-component-id={id}\n className={agendaTrayVariants({ size, className })}\n {...rest}\n >\n <header className=\"ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)] ds:p-[var(--spacing-sm)]\">\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)] ds:min-w-0\">\n <h3 className=\"ds:m-0 ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)] type-title-card\">\n <CalendarDays aria-hidden=\"true\" className=\"ds:size-4\" />\n {heading}\n </h3>\n {caption ? (\n <span className=\"type-eyebrow ds:text-[color:var(--muted-foreground)]\">\n {caption}\n </span>\n ) : null}\n </div>\n {onAddAppointment ? (\n <IconButton\n icon={<Plus />}\n intent=\"outline\"\n size=\"sm\"\n aria-label={resolvedAddLabel}\n onClick={onAddAppointment}\n />\n ) : null}\n </header>\n {body}\n {viewAllLabel && onViewAll && !isEmpty && !loading ? (\n <footer className=\"ds:[border-block-start:var(--border-width-sm)_solid_var(--card-border)] ds:p-[var(--spacing-sm)]\">\n <button\n type=\"button\"\n onClick={onViewAll}\n className={[\n 'type-label ds:text-[color:var(--link)] ds:underline ds:underline-offset-2 ds:hover:no-underline',\n 'ds:rounded-[var(--radius-sm)] ds:min-h-[var(--min-target-size)] ds:ps-[var(--spacing-xs)] ds:pe-[var(--spacing-xs)]',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n ].join(' ')}\n >\n {viewAllLabel}\n </button>\n </footer>\n ) : null}\n </section>\n );\n },\n);\n\nAgendaTray.displayName = 'AgendaTray';\n"],"names":["agendaTrayAgent","handle","args","agendaTrayVariants","cva","AgendaTray","forwardRef","id","items","title","caption","size","onOpenAppointment","onAddAppointment","addLabel","loading","emptyTitle","emptyDescription","emptyAction","viewAllLabel","onViewAll","renderItemActions","scrollable","className","rest","ref","t","useTranslation","heading","resolvedAddLabel","isEmpty","body","jsx","i","Skeleton","EmptyState","item","AgendaCard","itemsRef","useRef","innerRef","useImperativeHandle","useMemo","targetId","found","useAgentRegistration","jsxs","CalendarDays","IconButton","Plus"],"mappings":"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"}
@@ -5,7 +5,7 @@ import { B as ie } from "./button-CYPx2xFq.js";
5
5
  import { I as de } from "./icon-button-JAXAkqWC.js";
6
6
  import { C as le } from "./card-DPmk26CL.js";
7
7
  import { C as Zt, b as Yt, a as Jt } from "./collapsible-CTjxzGuF.js";
8
- import { E as Xe } from "./empty-state-DActfjdn.js";
8
+ import { E as Xe } from "./empty-state-C62P_6kr.js";
9
9
  import { F as M } from "./form-field-YUJl_U5l.js";
10
10
  import { M as ln } from "./multi-select-Bx0_cgPI.js";
11
11
  import { N as ga } from "./number-input-BLrx3utH.js";
@@ -20,7 +20,7 @@ import { D as sn } from "./date-picker-p9yz3pxc.js";
20
20
  import { A as Ue } from "./alert-BhCstf2h.js";
21
21
  import { D as L } from "./description-list-9rchqp5q.js";
22
22
  import { c as Xt } from "./index-D2ZczOXr.js";
23
- import { S as dn } from "./sparkline-ZOxMBU76.js";
23
+ import { S as dn } from "./sparkline-pkGPCXbl.js";
24
24
  import { A as ei, a as ai } from "./arrow-up-BYvcvTkB.js";
25
25
  import { M as cn } from "./minus-BQDHq1c1.js";
26
26
  import { U as un } from "./user-B12p7bVF.js";
@@ -20923,4 +20923,4 @@ export {
20923
20923
  Vi as t,
20924
20924
  td as u
20925
20925
  };
20926
- //# sourceMappingURL=anamnesis-summary-rows-DaSoA80I.js.map
20926
+ //# sourceMappingURL=anamnesis-summary-rows-CnHxtht-.js.map