@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.
- package/dist/_chunks/{address-autocomplete-BVLoHU3E.js → address-autocomplete-Bp816Mb1.js} +2 -2
- package/dist/_chunks/{address-autocomplete-BVLoHU3E.js.map → address-autocomplete-Bp816Mb1.js.map} +1 -1
- package/dist/_chunks/{address-fields-UiEXHxEX.js → address-fields-BIL6cvLS.js} +2 -2
- package/dist/_chunks/{address-fields-UiEXHxEX.js.map → address-fields-BIL6cvLS.js.map} +1 -1
- package/dist/_chunks/{agenda-tray-C-_iu6Fo.js → agenda-tray-C2a8OfKC.js} +2 -2
- package/dist/_chunks/{agenda-tray-C-_iu6Fo.js.map → agenda-tray-C2a8OfKC.js.map} +1 -1
- package/dist/_chunks/{anamnesis-summary-rows-DaSoA80I.js → anamnesis-summary-rows-CnHxtht-.js} +3 -3
- package/dist/_chunks/{anamnesis-summary-rows-DaSoA80I.js.map → anamnesis-summary-rows-CnHxtht-.js.map} +1 -1
- package/dist/_chunks/apexcharts-theme-DNoXvgnZ.js +105 -0
- package/dist/_chunks/apexcharts-theme-DNoXvgnZ.js.map +1 -0
- package/dist/_chunks/{appointment-timeline-BZErHbD1.js → appointment-timeline-By-EwmJU.js} +2 -2
- package/dist/_chunks/{appointment-timeline-BZErHbD1.js.map → appointment-timeline-By-EwmJU.js.map} +1 -1
- package/dist/_chunks/{appointment-tray-DR_Zm4Gw.js → appointment-tray-7Z3A3Xz9.js} +2 -2
- package/dist/_chunks/{appointment-tray-DR_Zm4Gw.js.map → appointment-tray-7Z3A3Xz9.js.map} +1 -1
- package/dist/_chunks/{balance-badge-cell-CS-iKkLM.js → balance-badge-cell-BtiFfFRY.js} +2 -2
- package/dist/_chunks/{balance-badge-cell-CS-iKkLM.js.map → balance-badge-cell-BtiFfFRY.js.map} +1 -1
- package/dist/_chunks/{booking-DP543-BT.js → booking-CFR7vU8X.js} +3 -3
- package/dist/_chunks/{booking-DP543-BT.js.map → booking-CFR7vU8X.js.map} +1 -1
- package/dist/_chunks/{calendar-workspace-B9MKJXER.js → calendar-workspace-LDuzo_Ie.js} +7 -7
- package/dist/_chunks/{calendar-workspace-B9MKJXER.js.map → calendar-workspace-LDuzo_Ie.js.map} +1 -1
- package/dist/_chunks/{chart-CuE30cfr.js → chart-D37VAIa-.js} +81 -81
- package/dist/_chunks/chart-D37VAIa-.js.map +1 -0
- package/dist/_chunks/{data-table-DJvEwZZx.js → data-table-CiVyhNXx.js} +2 -2
- package/dist/_chunks/{data-table-DJvEwZZx.js.map → data-table-CiVyhNXx.js.map} +1 -1
- package/dist/_chunks/{document-preview-1CZJg6CX.js → document-preview-VXOQZZvy.js} +2 -2
- package/dist/_chunks/{document-preview-1CZJg6CX.js.map → document-preview-VXOQZZvy.js.map} +1 -1
- package/dist/_chunks/{empty-state-DActfjdn.js → empty-state-C62P_6kr.js} +59 -48
- package/dist/_chunks/empty-state-C62P_6kr.js.map +1 -0
- package/dist/_chunks/{error-boundary--w5hYiQ-.js → error-boundary-Cvs23EzK.js} +2 -2
- package/dist/_chunks/{error-boundary--w5hYiQ-.js.map → error-boundary-Cvs23EzK.js.map} +1 -1
- package/dist/_chunks/error-page-BtxEOL6g.js +780 -0
- package/dist/_chunks/error-page-BtxEOL6g.js.map +1 -0
- package/dist/_chunks/{file-manager-BGHShxn_.js → file-manager-BfG3usGk.js} +3 -3
- package/dist/_chunks/{file-manager-BGHShxn_.js.map → file-manager-BfG3usGk.js.map} +1 -1
- package/dist/_chunks/{help-me-write-templates-CGCyhAVE.js → help-me-write-templates-DcR-e_90.js} +2 -2
- package/dist/_chunks/{help-me-write-templates-CGCyhAVE.js.map → help-me-write-templates-DcR-e_90.js.map} +1 -1
- package/dist/_chunks/{index.modern-Zta-A4Jm.js → index.modern-BeRXQVdc.js} +3 -2
- package/dist/_chunks/{index.modern-Zta-A4Jm.js.map → index.modern-BeRXQVdc.js.map} +1 -1
- package/dist/_chunks/{map-view-CmNGS6Ok.js → map-view-CQmqQJwK.js} +158 -129
- package/dist/_chunks/map-view-CQmqQJwK.js.map +1 -0
- package/dist/_chunks/{practice-results-DjhcggtZ.js → practice-results-B9uV0TT8.js} +3 -3
- package/dist/_chunks/{practice-results-DjhcggtZ.js.map → practice-results-B9uV0TT8.js.map} +1 -1
- package/dist/_chunks/{privacy-mask-noG15O9q.js → privacy-mask-CK-9sxeI.js} +2 -2
- package/dist/_chunks/{privacy-mask-noG15O9q.js.map → privacy-mask-CK-9sxeI.js.map} +1 -1
- package/dist/_chunks/{product-hub-panel-BmBzDba9.js → product-hub-panel-D87kbz5j.js} +2 -2
- package/dist/_chunks/{product-hub-panel-BmBzDba9.js.map → product-hub-panel-D87kbz5j.js.map} +1 -1
- package/dist/_chunks/{radiograph-panel.agent-BP71J_VB.js → radiograph-panel.agent-BWBaxJ8e.js} +2 -2
- package/dist/_chunks/{radiograph-panel.agent-BP71J_VB.js.map → radiograph-panel.agent-BWBaxJ8e.js.map} +1 -1
- package/dist/_chunks/{reviews-panel-DDb_t7vy.js → reviews-panel-DUgqU-Wr.js} +2 -2
- package/dist/_chunks/{reviews-panel-DDb_t7vy.js.map → reviews-panel-DUgqU-Wr.js.map} +1 -1
- package/dist/_chunks/{slot-grid-Bkg9MVXP.js → slot-grid-kq7bDdrx.js} +2 -2
- package/dist/_chunks/{slot-grid-Bkg9MVXP.js.map → slot-grid-kq7bDdrx.js.map} +1 -1
- package/dist/_chunks/{sparkline-ZOxMBU76.js → sparkline-pkGPCXbl.js} +80 -80
- package/dist/_chunks/sparkline-pkGPCXbl.js.map +1 -0
- package/dist/_chunks/{task-card-CngF4Zee.js → task-card-Cfl08MCS.js} +2 -2
- package/dist/_chunks/{task-card-CngF4Zee.js.map → task-card-Cfl08MCS.js.map} +1 -1
- package/dist/_chunks/{task-editor-Dz93rRXg.js → task-editor-CxF-sBnu.js} +2 -2
- package/dist/_chunks/{task-editor-Dz93rRXg.js.map → task-editor-CxF-sBnu.js.map} +1 -1
- package/dist/_chunks/{task-tray-CB6_BvH9.js → task-tray-rAGslT2C.js} +3 -3
- package/dist/_chunks/{task-tray-CB6_BvH9.js.map → task-tray-rAGslT2C.js.map} +1 -1
- package/dist/_chunks/{tasks-panel-DHAoTQtR.js → tasks-panel-Dkm8SnmV.js} +3 -3
- package/dist/_chunks/{tasks-panel-DHAoTQtR.js.map → tasks-panel-Dkm8SnmV.js.map} +1 -1
- package/dist/_chunks/{use-appointment-details-read-YsuJgYeB.js → use-appointment-details-read-W6h4oTHx.js} +3 -3
- package/dist/_chunks/{use-appointment-details-read-YsuJgYeB.js.map → use-appointment-details-read-W6h4oTHx.js.map} +1 -1
- package/dist/_chunks/{workflow-map-C7fHKTXL.js → workflow-map-C1OjRhM3.js} +189 -197
- package/dist/_chunks/workflow-map-C1OjRhM3.js.map +1 -0
- package/dist/agent-catalog.json +51 -7
- package/dist/agent-i18n/en.json +9 -3
- package/dist/components/_shared/index.d.ts +1 -0
- package/dist/components/_shared/index.d.ts.map +1 -1
- package/dist/components/_shared/is-development.d.ts +8 -0
- package/dist/components/_shared/is-development.d.ts.map +1 -0
- package/dist/components/_shared/use-keep-apex-tooltip-inside.d.ts +3 -0
- package/dist/components/_shared/use-keep-apex-tooltip-inside.d.ts.map +1 -0
- package/dist/components/address-autocomplete/index.js +1 -1
- package/dist/components/address-fields/index.js +1 -1
- package/dist/components/agenda-tray/index.js +1 -1
- package/dist/components/appointment-card/index.js +1 -1
- package/dist/components/appointment-details-panel/index.js +1 -1
- package/dist/components/appointment-timeline/index.js +1 -1
- package/dist/components/booking/index.js +1 -1
- package/dist/components/chart/chart.d.ts.map +1 -1
- package/dist/components/chart/index.js +1 -1
- package/dist/components/data-table/index.js +1 -1
- package/dist/components/document-preview/index.js +1 -1
- package/dist/components/empty-state/empty-state.d.ts +6 -0
- package/dist/components/empty-state/empty-state.d.ts.map +1 -1
- package/dist/components/empty-state/index.js +1 -1
- package/dist/components/error-boundary/index.js +1 -1
- package/dist/components/file-manager/index.js +1 -1
- package/dist/components/index.d.ts +1 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/map-view/index.js +1 -1
- package/dist/components/map-view/map-view.agent.d.ts.map +1 -1
- package/dist/components/map-view/map-view.d.ts +8 -5
- package/dist/components/map-view/map-view.d.ts.map +1 -1
- package/dist/components/patient-table/index.js +1 -1
- package/dist/components/practice-results/index.js +1 -1
- package/dist/components/product-hub-tray/index.js +1 -1
- package/dist/components/radiograph-panel/index.js +1 -1
- package/dist/components/reviews-panel/index.js +1 -1
- package/dist/components/slot-grid/index.js +1 -1
- package/dist/components/sparkline/index.js +1 -1
- package/dist/components/sparkline/sparkline.d.ts.map +1 -1
- package/dist/components/task-card/index.js +1 -1
- package/dist/components/task-editor/index.js +1 -1
- package/dist/components/task-tray/index.js +1 -1
- package/dist/components/tasks-panel/index.js +1 -1
- package/dist/components/workflow/index.js +1 -1
- package/dist/components/workflow/workflow-editor.d.ts.map +1 -1
- package/dist/error-pages/400.ar.html +41 -0
- package/dist/error-pages/400.de.html +41 -0
- package/dist/error-pages/400.el.html +41 -0
- package/dist/error-pages/400.en.html +41 -0
- package/dist/error-pages/400.es.html +41 -0
- package/dist/error-pages/400.fr.html +41 -0
- package/dist/error-pages/400.hi.html +41 -0
- package/dist/error-pages/400.html +41 -0
- package/dist/error-pages/400.it.html +41 -0
- package/dist/error-pages/400.ja.html +41 -0
- package/dist/error-pages/400.nl.html +41 -0
- package/dist/error-pages/400.pl.html +41 -0
- package/dist/error-pages/400.pt.html +41 -0
- package/dist/error-pages/400.ro.html +41 -0
- package/dist/error-pages/400.ru.html +41 -0
- package/dist/error-pages/400.sq.html +41 -0
- package/dist/error-pages/400.sv.html +41 -0
- package/dist/error-pages/400.tr.html +41 -0
- package/dist/error-pages/400.zh.html +41 -0
- package/dist/error-pages/401.ar.html +41 -0
- package/dist/error-pages/401.de.html +41 -0
- package/dist/error-pages/401.el.html +41 -0
- package/dist/error-pages/401.en.html +41 -0
- package/dist/error-pages/401.es.html +41 -0
- package/dist/error-pages/401.fr.html +41 -0
- package/dist/error-pages/401.hi.html +41 -0
- package/dist/error-pages/401.html +41 -0
- package/dist/error-pages/401.it.html +41 -0
- package/dist/error-pages/401.ja.html +41 -0
- package/dist/error-pages/401.nl.html +41 -0
- package/dist/error-pages/401.pl.html +41 -0
- package/dist/error-pages/401.pt.html +41 -0
- package/dist/error-pages/401.ro.html +41 -0
- package/dist/error-pages/401.ru.html +41 -0
- package/dist/error-pages/401.sq.html +41 -0
- package/dist/error-pages/401.sv.html +41 -0
- package/dist/error-pages/401.tr.html +41 -0
- package/dist/error-pages/401.zh.html +41 -0
- package/dist/error-pages/403.ar.html +41 -0
- package/dist/error-pages/403.de.html +41 -0
- package/dist/error-pages/403.el.html +41 -0
- package/dist/error-pages/403.en.html +41 -0
- package/dist/error-pages/403.es.html +41 -0
- package/dist/error-pages/403.fr.html +41 -0
- package/dist/error-pages/403.hi.html +41 -0
- package/dist/error-pages/403.html +41 -0
- package/dist/error-pages/403.it.html +41 -0
- package/dist/error-pages/403.ja.html +41 -0
- package/dist/error-pages/403.nl.html +41 -0
- package/dist/error-pages/403.pl.html +41 -0
- package/dist/error-pages/403.pt.html +41 -0
- package/dist/error-pages/403.ro.html +41 -0
- package/dist/error-pages/403.ru.html +41 -0
- package/dist/error-pages/403.sq.html +41 -0
- package/dist/error-pages/403.sv.html +41 -0
- package/dist/error-pages/403.tr.html +41 -0
- package/dist/error-pages/403.zh.html +41 -0
- package/dist/error-pages/404.ar.html +41 -0
- package/dist/error-pages/404.de.html +41 -0
- package/dist/error-pages/404.el.html +41 -0
- package/dist/error-pages/404.en.html +41 -0
- package/dist/error-pages/404.es.html +41 -0
- package/dist/error-pages/404.fr.html +41 -0
- package/dist/error-pages/404.hi.html +41 -0
- package/dist/error-pages/404.html +41 -0
- package/dist/error-pages/404.it.html +41 -0
- package/dist/error-pages/404.ja.html +41 -0
- package/dist/error-pages/404.nl.html +41 -0
- package/dist/error-pages/404.pl.html +41 -0
- package/dist/error-pages/404.pt.html +41 -0
- package/dist/error-pages/404.ro.html +41 -0
- package/dist/error-pages/404.ru.html +41 -0
- package/dist/error-pages/404.sq.html +41 -0
- package/dist/error-pages/404.sv.html +41 -0
- package/dist/error-pages/404.tr.html +41 -0
- package/dist/error-pages/404.zh.html +41 -0
- package/dist/error-pages/405.ar.html +41 -0
- package/dist/error-pages/405.de.html +41 -0
- package/dist/error-pages/405.el.html +41 -0
- package/dist/error-pages/405.en.html +41 -0
- package/dist/error-pages/405.es.html +41 -0
- package/dist/error-pages/405.fr.html +41 -0
- package/dist/error-pages/405.hi.html +41 -0
- package/dist/error-pages/405.html +41 -0
- package/dist/error-pages/405.it.html +41 -0
- package/dist/error-pages/405.ja.html +41 -0
- package/dist/error-pages/405.nl.html +41 -0
- package/dist/error-pages/405.pl.html +41 -0
- package/dist/error-pages/405.pt.html +41 -0
- package/dist/error-pages/405.ro.html +41 -0
- package/dist/error-pages/405.ru.html +41 -0
- package/dist/error-pages/405.sq.html +41 -0
- package/dist/error-pages/405.sv.html +41 -0
- package/dist/error-pages/405.tr.html +41 -0
- package/dist/error-pages/405.zh.html +41 -0
- package/dist/error-pages/410.ar.html +41 -0
- package/dist/error-pages/410.de.html +41 -0
- package/dist/error-pages/410.el.html +41 -0
- package/dist/error-pages/410.en.html +41 -0
- package/dist/error-pages/410.es.html +41 -0
- package/dist/error-pages/410.fr.html +41 -0
- package/dist/error-pages/410.hi.html +41 -0
- package/dist/error-pages/410.html +41 -0
- package/dist/error-pages/410.it.html +41 -0
- package/dist/error-pages/410.ja.html +41 -0
- package/dist/error-pages/410.nl.html +41 -0
- package/dist/error-pages/410.pl.html +41 -0
- package/dist/error-pages/410.pt.html +41 -0
- package/dist/error-pages/410.ro.html +41 -0
- package/dist/error-pages/410.ru.html +41 -0
- package/dist/error-pages/410.sq.html +41 -0
- package/dist/error-pages/410.sv.html +41 -0
- package/dist/error-pages/410.tr.html +41 -0
- package/dist/error-pages/410.zh.html +41 -0
- package/dist/error-pages/419.ar.html +42 -0
- package/dist/error-pages/419.de.html +42 -0
- package/dist/error-pages/419.el.html +42 -0
- package/dist/error-pages/419.en.html +42 -0
- package/dist/error-pages/419.es.html +42 -0
- package/dist/error-pages/419.fr.html +42 -0
- package/dist/error-pages/419.hi.html +42 -0
- package/dist/error-pages/419.html +42 -0
- package/dist/error-pages/419.it.html +42 -0
- package/dist/error-pages/419.ja.html +42 -0
- package/dist/error-pages/419.nl.html +42 -0
- package/dist/error-pages/419.pl.html +42 -0
- package/dist/error-pages/419.pt.html +42 -0
- package/dist/error-pages/419.ro.html +42 -0
- package/dist/error-pages/419.ru.html +42 -0
- package/dist/error-pages/419.sq.html +42 -0
- package/dist/error-pages/419.sv.html +42 -0
- package/dist/error-pages/419.tr.html +42 -0
- package/dist/error-pages/419.zh.html +42 -0
- package/dist/error-pages/429.ar.html +42 -0
- package/dist/error-pages/429.de.html +42 -0
- package/dist/error-pages/429.el.html +42 -0
- package/dist/error-pages/429.en.html +42 -0
- package/dist/error-pages/429.es.html +42 -0
- package/dist/error-pages/429.fr.html +42 -0
- package/dist/error-pages/429.hi.html +42 -0
- package/dist/error-pages/429.html +42 -0
- package/dist/error-pages/429.it.html +42 -0
- package/dist/error-pages/429.ja.html +42 -0
- package/dist/error-pages/429.nl.html +42 -0
- package/dist/error-pages/429.pl.html +42 -0
- package/dist/error-pages/429.pt.html +42 -0
- package/dist/error-pages/429.ro.html +42 -0
- package/dist/error-pages/429.ru.html +42 -0
- package/dist/error-pages/429.sq.html +42 -0
- package/dist/error-pages/429.sv.html +42 -0
- package/dist/error-pages/429.tr.html +42 -0
- package/dist/error-pages/429.zh.html +42 -0
- package/dist/error-pages/500.ar.html +41 -0
- package/dist/error-pages/500.de.html +41 -0
- package/dist/error-pages/500.el.html +41 -0
- package/dist/error-pages/500.en.html +41 -0
- package/dist/error-pages/500.es.html +41 -0
- package/dist/error-pages/500.fr.html +41 -0
- package/dist/error-pages/500.hi.html +41 -0
- package/dist/error-pages/500.html +41 -0
- package/dist/error-pages/500.it.html +41 -0
- package/dist/error-pages/500.ja.html +41 -0
- package/dist/error-pages/500.nl.html +41 -0
- package/dist/error-pages/500.pl.html +41 -0
- package/dist/error-pages/500.pt.html +41 -0
- package/dist/error-pages/500.ro.html +41 -0
- package/dist/error-pages/500.ru.html +41 -0
- package/dist/error-pages/500.sq.html +41 -0
- package/dist/error-pages/500.sv.html +41 -0
- package/dist/error-pages/500.tr.html +41 -0
- package/dist/error-pages/500.zh.html +41 -0
- package/dist/error-pages/502.ar.html +41 -0
- package/dist/error-pages/502.de.html +41 -0
- package/dist/error-pages/502.el.html +41 -0
- package/dist/error-pages/502.en.html +41 -0
- package/dist/error-pages/502.es.html +41 -0
- package/dist/error-pages/502.fr.html +41 -0
- package/dist/error-pages/502.hi.html +41 -0
- package/dist/error-pages/502.html +41 -0
- package/dist/error-pages/502.it.html +41 -0
- package/dist/error-pages/502.ja.html +41 -0
- package/dist/error-pages/502.nl.html +41 -0
- package/dist/error-pages/502.pl.html +41 -0
- package/dist/error-pages/502.pt.html +41 -0
- package/dist/error-pages/502.ro.html +41 -0
- package/dist/error-pages/502.ru.html +41 -0
- package/dist/error-pages/502.sq.html +41 -0
- package/dist/error-pages/502.sv.html +41 -0
- package/dist/error-pages/502.tr.html +41 -0
- package/dist/error-pages/502.zh.html +41 -0
- package/dist/error-pages/503.ar.html +41 -0
- package/dist/error-pages/503.de.html +41 -0
- package/dist/error-pages/503.el.html +41 -0
- package/dist/error-pages/503.en.html +41 -0
- package/dist/error-pages/503.es.html +41 -0
- package/dist/error-pages/503.fr.html +41 -0
- package/dist/error-pages/503.hi.html +41 -0
- package/dist/error-pages/503.html +41 -0
- package/dist/error-pages/503.it.html +41 -0
- package/dist/error-pages/503.ja.html +41 -0
- package/dist/error-pages/503.nl.html +41 -0
- package/dist/error-pages/503.pl.html +41 -0
- package/dist/error-pages/503.pt.html +41 -0
- package/dist/error-pages/503.ro.html +41 -0
- package/dist/error-pages/503.ru.html +41 -0
- package/dist/error-pages/503.sq.html +41 -0
- package/dist/error-pages/503.sv.html +41 -0
- package/dist/error-pages/503.tr.html +41 -0
- package/dist/error-pages/503.zh.html +41 -0
- package/dist/error-pages/504.ar.html +41 -0
- package/dist/error-pages/504.de.html +41 -0
- package/dist/error-pages/504.el.html +41 -0
- package/dist/error-pages/504.en.html +41 -0
- package/dist/error-pages/504.es.html +41 -0
- package/dist/error-pages/504.fr.html +41 -0
- package/dist/error-pages/504.hi.html +41 -0
- package/dist/error-pages/504.html +41 -0
- package/dist/error-pages/504.it.html +41 -0
- package/dist/error-pages/504.ja.html +41 -0
- package/dist/error-pages/504.nl.html +41 -0
- package/dist/error-pages/504.pl.html +41 -0
- package/dist/error-pages/504.pt.html +41 -0
- package/dist/error-pages/504.ro.html +41 -0
- package/dist/error-pages/504.ru.html +41 -0
- package/dist/error-pages/504.sq.html +41 -0
- package/dist/error-pages/504.sv.html +41 -0
- package/dist/error-pages/504.tr.html +41 -0
- package/dist/error-pages/504.zh.html +41 -0
- package/dist/error-pages/maintenance.ar.html +41 -0
- package/dist/error-pages/maintenance.de.html +41 -0
- package/dist/error-pages/maintenance.el.html +41 -0
- package/dist/error-pages/maintenance.en.html +41 -0
- package/dist/error-pages/maintenance.es.html +41 -0
- package/dist/error-pages/maintenance.fr.html +41 -0
- package/dist/error-pages/maintenance.hi.html +41 -0
- package/dist/error-pages/maintenance.html +41 -0
- package/dist/error-pages/maintenance.it.html +41 -0
- package/dist/error-pages/maintenance.ja.html +41 -0
- package/dist/error-pages/maintenance.nl.html +41 -0
- package/dist/error-pages/maintenance.pl.html +41 -0
- package/dist/error-pages/maintenance.pt.html +41 -0
- package/dist/error-pages/maintenance.ro.html +41 -0
- package/dist/error-pages/maintenance.ru.html +41 -0
- package/dist/error-pages/maintenance.sq.html +41 -0
- package/dist/error-pages/maintenance.sv.html +41 -0
- package/dist/error-pages/maintenance.tr.html +41 -0
- package/dist/error-pages/maintenance.zh.html +41 -0
- package/dist/host-compat.css +13 -1
- package/dist/i18n/locales/ar.d.ts +70 -0
- package/dist/i18n/locales/ar.d.ts.map +1 -1
- package/dist/i18n/locales/ar.js +70 -0
- package/dist/i18n/locales/ar.js.map +1 -1
- package/dist/i18n/locales/de.d.ts +70 -0
- package/dist/i18n/locales/de.d.ts.map +1 -1
- package/dist/i18n/locales/de.js +70 -0
- package/dist/i18n/locales/de.js.map +1 -1
- package/dist/i18n/locales/el.d.ts +70 -0
- package/dist/i18n/locales/el.d.ts.map +1 -1
- package/dist/i18n/locales/el.js +70 -0
- package/dist/i18n/locales/el.js.map +1 -1
- package/dist/i18n/locales/en.d.ts +70 -0
- package/dist/i18n/locales/en.d.ts.map +1 -1
- package/dist/i18n/locales/en.js +70 -0
- package/dist/i18n/locales/en.js.map +1 -1
- package/dist/i18n/locales/es.d.ts +70 -0
- package/dist/i18n/locales/es.d.ts.map +1 -1
- package/dist/i18n/locales/es.js +70 -0
- package/dist/i18n/locales/es.js.map +1 -1
- package/dist/i18n/locales/fr.d.ts +70 -0
- package/dist/i18n/locales/fr.d.ts.map +1 -1
- package/dist/i18n/locales/fr.js +70 -0
- package/dist/i18n/locales/fr.js.map +1 -1
- package/dist/i18n/locales/hi.d.ts +70 -0
- package/dist/i18n/locales/hi.d.ts.map +1 -1
- package/dist/i18n/locales/hi.js +70 -0
- package/dist/i18n/locales/hi.js.map +1 -1
- package/dist/i18n/locales/it.d.ts +70 -0
- package/dist/i18n/locales/it.d.ts.map +1 -1
- package/dist/i18n/locales/it.js +70 -0
- package/dist/i18n/locales/it.js.map +1 -1
- package/dist/i18n/locales/ja.d.ts +70 -0
- package/dist/i18n/locales/ja.d.ts.map +1 -1
- package/dist/i18n/locales/ja.js +70 -0
- package/dist/i18n/locales/ja.js.map +1 -1
- package/dist/i18n/locales/nl.d.ts +70 -0
- package/dist/i18n/locales/nl.d.ts.map +1 -1
- package/dist/i18n/locales/nl.js +70 -0
- package/dist/i18n/locales/nl.js.map +1 -1
- package/dist/i18n/locales/pl.d.ts +70 -0
- package/dist/i18n/locales/pl.d.ts.map +1 -1
- package/dist/i18n/locales/pl.js +70 -0
- package/dist/i18n/locales/pl.js.map +1 -1
- package/dist/i18n/locales/pt.d.ts +70 -0
- package/dist/i18n/locales/pt.d.ts.map +1 -1
- package/dist/i18n/locales/pt.js +70 -0
- package/dist/i18n/locales/pt.js.map +1 -1
- package/dist/i18n/locales/ro.d.ts +70 -0
- package/dist/i18n/locales/ro.d.ts.map +1 -1
- package/dist/i18n/locales/ro.js +70 -0
- package/dist/i18n/locales/ro.js.map +1 -1
- package/dist/i18n/locales/ru.d.ts +70 -0
- package/dist/i18n/locales/ru.d.ts.map +1 -1
- package/dist/i18n/locales/ru.js +70 -0
- package/dist/i18n/locales/ru.js.map +1 -1
- package/dist/i18n/locales/sq.d.ts +70 -0
- package/dist/i18n/locales/sq.d.ts.map +1 -1
- package/dist/i18n/locales/sq.js +70 -0
- package/dist/i18n/locales/sq.js.map +1 -1
- package/dist/i18n/locales/sv.d.ts +70 -0
- package/dist/i18n/locales/sv.d.ts.map +1 -1
- package/dist/i18n/locales/sv.js +70 -0
- package/dist/i18n/locales/sv.js.map +1 -1
- package/dist/i18n/locales/tr.d.ts +70 -0
- package/dist/i18n/locales/tr.d.ts.map +1 -1
- package/dist/i18n/locales/tr.js +70 -0
- package/dist/i18n/locales/tr.js.map +1 -1
- package/dist/i18n/locales/zh.d.ts +70 -0
- package/dist/i18n/locales/zh.d.ts.map +1 -1
- package/dist/i18n/locales/zh.js +70 -0
- package/dist/i18n/locales/zh.js.map +1 -1
- package/dist/index.js +143 -137
- package/dist/index.js.map +1 -1
- package/dist/locales/ar.json +70 -0
- package/dist/locales/de.json +70 -0
- package/dist/locales/el.json +70 -0
- package/dist/locales/en.json +70 -0
- package/dist/locales/es.json +70 -0
- package/dist/locales/fr.json +70 -0
- package/dist/locales/hi.json +70 -0
- package/dist/locales/it.json +70 -0
- package/dist/locales/ja.json +70 -0
- package/dist/locales/nl.json +70 -0
- package/dist/locales/pl.json +70 -0
- package/dist/locales/pt.json +70 -0
- package/dist/locales/ro.json +70 -0
- package/dist/locales/ru.json +70 -0
- package/dist/locales/sq.json +70 -0
- package/dist/locales/sv.json +70 -0
- package/dist/locales/tr.json +70 -0
- package/dist/locales/zh.json +70 -0
- package/dist/patterns/anamnesis/index.js +1 -1
- package/dist/patterns/calendar/index.js +1 -1
- package/dist/patterns/error-page/error-page-illustration.d.ts +6 -0
- package/dist/patterns/error-page/error-page-illustration.d.ts.map +1 -0
- package/dist/patterns/error-page/error-page-locale.d.ts +32 -0
- package/dist/patterns/error-page/error-page-locale.d.ts.map +1 -0
- package/dist/patterns/error-page/error-page-statuses.d.ts +16 -0
- package/dist/patterns/error-page/error-page-statuses.d.ts.map +1 -0
- package/dist/patterns/error-page/error-page.d.ts +48 -0
- package/dist/patterns/error-page/error-page.d.ts.map +1 -0
- package/dist/patterns/error-page/index.d.ts +5 -0
- package/dist/patterns/error-page/index.d.ts.map +1 -0
- package/dist/patterns/error-page/index.js +9 -0
- package/dist/patterns/error-page/index.js.map +1 -0
- package/dist/patterns/help-me-write-templates/index.js +1 -1
- package/dist/tokens.css +1 -1
- package/package.json +9 -2
- package/dist/_chunks/apexcharts-theme-B_AxGC_h.js +0 -72
- package/dist/_chunks/apexcharts-theme-B_AxGC_h.js.map +0 -1
- package/dist/_chunks/chart-CuE30cfr.js.map +0 -1
- package/dist/_chunks/empty-state-DActfjdn.js.map +0 -1
- package/dist/_chunks/map-view-CmNGS6Ok.js.map +0 -1
- package/dist/_chunks/sparkline-ZOxMBU76.js.map +0 -1
- package/dist/_chunks/workflow-map-C7fHKTXL.js.map +0 -1
|
@@ -1,22 +1,25 @@
|
|
|
1
|
-
import { jsx as a, jsxs as
|
|
2
|
-
import { forwardRef as
|
|
3
|
-
import { c } from "./index-D2ZczOXr.js";
|
|
4
|
-
import { useTranslation as
|
|
5
|
-
import { A as
|
|
6
|
-
import { B as
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
|
|
1
|
+
import { jsx as a, jsxs as c } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef as X, useId as Y, useMemo as v, useState as N, useEffect as f, useRef as g, useCallback as z, useImperativeHandle as ee } from "react";
|
|
3
|
+
import { c as p } from "./index-D2ZczOXr.js";
|
|
4
|
+
import { useTranslation as V } from "react-i18next";
|
|
5
|
+
import { A as te, M as se, a as ae, P as oe, b as ne, u as re, c as _, d as ie } from "./index.modern-BeRXQVdc.js";
|
|
6
|
+
import { B as le } from "./button-CYPx2xFq.js";
|
|
7
|
+
import { S as de } from "./skeleton-B1KTdJ4N.js";
|
|
8
|
+
import { V as ce } from "./visually-hidden-BHxEUGyT.js";
|
|
9
|
+
import { u as pe } from "./registry-DvAUVLHh.js";
|
|
10
|
+
import { M as me } from "./map-pin-BaY37-Km.js";
|
|
11
|
+
import { E as ue } from "./external-link-CY6zAXXU.js";
|
|
12
|
+
const he = {
|
|
11
13
|
id: "map-view",
|
|
12
14
|
// pan → scroll (viewport move); set_zoom → set_value; select_marker → pick
|
|
13
15
|
// (NON-persisting marker focus, no value state slot).
|
|
14
16
|
capabilities: ["scroll", "set_value", "pick"],
|
|
15
17
|
// Every action routes through the imperative bridge, which only exists
|
|
16
|
-
//
|
|
17
|
-
//
|
|
18
|
-
//
|
|
19
|
-
//
|
|
18
|
+
// once the map has loaded: consent granted (the default is
|
|
19
|
+
// `consentGranted={false}`) and Google Maps finished loading. Until then
|
|
20
|
+
// all three actions are silent no-ops. `consentGranted` says whether the
|
|
21
|
+
// gate is passed, and a null `center` after it means the map is still
|
|
22
|
+
// loading. `center` / `zoom` are read off the live
|
|
20
23
|
// map because Google clamps zoom and animates pans, so requested is not
|
|
21
24
|
// applied; `selectedMarkerId` is the only confirmation the host accepted
|
|
22
25
|
// a `select_marker` proposal.
|
|
@@ -28,7 +31,7 @@ const le = {
|
|
|
28
31
|
consentGranted: {
|
|
29
32
|
type: "boolean",
|
|
30
33
|
descriptionKey: "ui.agent.mapView.state.consentGranted",
|
|
31
|
-
description: "True when the GDPR consent gate has been passed
|
|
34
|
+
description: "True when the GDPR consent gate has been passed. Read this FIRST: while it is false every action is a silent no-op against a placeholder, and nothing else in the surface says so. When it is true but `center` is still null, Google Maps is loading; wait for `center` before acting.",
|
|
32
35
|
read: (t) => t.isConsentGranted()
|
|
33
36
|
},
|
|
34
37
|
markerCount: {
|
|
@@ -46,13 +49,13 @@ const le = {
|
|
|
46
49
|
center: {
|
|
47
50
|
type: "{ lat: number; lng: number } | null",
|
|
48
51
|
descriptionKey: "ui.agent.mapView.state.center",
|
|
49
|
-
description: "Live map centre in lat/lng, or null
|
|
52
|
+
description: "Live map centre in lat/lng, or null until the map has loaded (consent not granted, or Google Maps still loading). The read-back for `pan_to`, and the sign that the map is ready.",
|
|
50
53
|
read: (t) => t.getCenter()
|
|
51
54
|
},
|
|
52
55
|
zoom: {
|
|
53
56
|
type: "number | null",
|
|
54
57
|
descriptionKey: "ui.agent.mapView.state.zoom",
|
|
55
|
-
description: "Live zoom level, or null
|
|
58
|
+
description: "Live zoom level, or null until the map has loaded. Google clamps zoom to the map type's range, so this is not necessarily the value last passed to `set_zoom`.",
|
|
56
59
|
read: (t) => t.getZoom()
|
|
57
60
|
}
|
|
58
61
|
},
|
|
@@ -79,10 +82,10 @@ const le = {
|
|
|
79
82
|
descriptionKey: "ui.agent.mapView.actions.panTo",
|
|
80
83
|
description: "Pan the map to a new centre without changing zoom. Read the `center` slot back to confirm — Google animates the pan, so the applied centre settles after the call.",
|
|
81
84
|
errors: [
|
|
82
|
-
"Silent no-op while `consentGranted` is false
|
|
85
|
+
"Silent no-op until the map has loaded: while `consentGranted` is false (only the consent placeholder shows) or while `center` is still null (Google Maps is loading)."
|
|
83
86
|
],
|
|
84
|
-
invoke: (t,
|
|
85
|
-
t.panTo(
|
|
87
|
+
invoke: (t, o) => {
|
|
88
|
+
t.panTo(o.position);
|
|
86
89
|
}
|
|
87
90
|
},
|
|
88
91
|
set_zoom: {
|
|
@@ -103,11 +106,11 @@ const le = {
|
|
|
103
106
|
descriptionKey: "ui.agent.mapView.actions.setZoom",
|
|
104
107
|
description: "Set the map zoom level (typical range 1–20). Read the `zoom` slot back — Google clamps the request to the map type’s supported range, so requested and applied can differ.",
|
|
105
108
|
errors: [
|
|
106
|
-
"Silent no-op while `consentGranted` is false
|
|
109
|
+
"Silent no-op until the map has loaded: while `consentGranted` is false (only the consent placeholder shows) or while `center` is still null (Google Maps is loading).",
|
|
107
110
|
"Requested zoom is clamped to the map type's range; `zoom` reports what was actually applied."
|
|
108
111
|
],
|
|
109
|
-
invoke: (t,
|
|
110
|
-
t.setZoom(
|
|
112
|
+
invoke: (t, o) => {
|
|
113
|
+
t.setZoom(o.zoom);
|
|
111
114
|
}
|
|
112
115
|
},
|
|
113
116
|
select_marker: {
|
|
@@ -128,11 +131,11 @@ const le = {
|
|
|
128
131
|
descriptionKey: "ui.agent.mapView.actions.selectMarker",
|
|
129
132
|
description: "Propose a marker selection by id, or pass null to clear it. Fires the host's `onMarkerClick`; selection is controlled by the host, so read the `selectedMarkerId` slot back to see whether it accepted.",
|
|
130
133
|
errors: [
|
|
131
|
-
"Silent no-op while `consentGranted` is false
|
|
134
|
+
"Silent no-op until the map has loaded: while `consentGranted` is false (only the consent placeholder shows) or while `center` is still null (Google Maps is loading).",
|
|
132
135
|
"The host owns `selectedMarkerId` and may ignore the proposal; `selectedMarkerId` is unchanged when it does."
|
|
133
136
|
],
|
|
134
|
-
invoke: (t,
|
|
135
|
-
t.selectMarker(
|
|
137
|
+
invoke: (t, o) => {
|
|
138
|
+
t.selectMarker(o.id);
|
|
136
139
|
}
|
|
137
140
|
}
|
|
138
141
|
},
|
|
@@ -148,7 +151,7 @@ const le = {
|
|
|
148
151
|
description: "Sourced from the id prop."
|
|
149
152
|
}
|
|
150
153
|
}
|
|
151
|
-
},
|
|
154
|
+
}, ge = p(
|
|
152
155
|
["ds:relative ds:overflow-hidden ds:block", "ds:bg-[var(--muted)]"].join(" "),
|
|
153
156
|
{
|
|
154
157
|
variants: {
|
|
@@ -172,7 +175,7 @@ const le = {
|
|
|
172
175
|
},
|
|
173
176
|
defaultVariants: { size: "md", surface: "bordered" }
|
|
174
177
|
}
|
|
175
|
-
),
|
|
178
|
+
), fe = p("ds:block ds:inline-size-full", {
|
|
176
179
|
variants: {
|
|
177
180
|
size: {
|
|
178
181
|
sm: "ds:[block-size:var(--map-block-size)]",
|
|
@@ -182,7 +185,7 @@ const le = {
|
|
|
182
185
|
}
|
|
183
186
|
},
|
|
184
187
|
defaultVariants: { size: "md" }
|
|
185
|
-
}),
|
|
188
|
+
}), be = p(
|
|
186
189
|
[
|
|
187
190
|
"ds:absolute ds:inset-0",
|
|
188
191
|
"ds:flex ds:flex-col ds:items-center ds:justify-center",
|
|
@@ -191,20 +194,20 @@ const le = {
|
|
|
191
194
|
"ds:bg-[var(--muted)] ds:text-[var(--foreground)]",
|
|
192
195
|
"ds:text-center"
|
|
193
196
|
].join(" ")
|
|
194
|
-
),
|
|
197
|
+
), ye = p("type-heading-3 ds:m-0"), R = p(
|
|
195
198
|
"type-body-sm ds:text-[var(--muted-foreground)] ds:[max-inline-size:28rem] ds:m-0"
|
|
196
199
|
);
|
|
197
|
-
function
|
|
200
|
+
function we({
|
|
198
201
|
onHandleReady: t,
|
|
199
|
-
onMarkerSelect:
|
|
202
|
+
onMarkerSelect: o
|
|
200
203
|
}) {
|
|
201
|
-
const s =
|
|
204
|
+
const s = ie();
|
|
202
205
|
return f(() => {
|
|
203
206
|
if (s)
|
|
204
207
|
return t({
|
|
205
208
|
panTo: (n) => s.panTo(n),
|
|
206
209
|
setZoom: (n) => s.setZoom(n),
|
|
207
|
-
selectMarker: (n) =>
|
|
210
|
+
selectMarker: (n) => o(n),
|
|
208
211
|
// Read straight off the live map: Google clamps `setZoom` to the
|
|
209
212
|
// map type's range and animates `panTo`, so requested and applied
|
|
210
213
|
// are not the same value.
|
|
@@ -214,25 +217,51 @@ function he({
|
|
|
214
217
|
},
|
|
215
218
|
getZoom: () => s.getZoom() ?? null
|
|
216
219
|
}), () => t(null);
|
|
217
|
-
}, [s, t,
|
|
220
|
+
}, [s, t, o]), null;
|
|
218
221
|
}
|
|
219
|
-
|
|
222
|
+
const j = (t) => {
|
|
223
|
+
var o, s;
|
|
224
|
+
return typeof ((s = (o = globalThis.google) == null ? void 0 : o.maps) == null ? void 0 : s[t]) == "function";
|
|
225
|
+
};
|
|
226
|
+
function ve() {
|
|
227
|
+
const { t } = V("ui");
|
|
228
|
+
return /* @__PURE__ */ c(
|
|
229
|
+
"div",
|
|
230
|
+
{
|
|
231
|
+
role: "status",
|
|
232
|
+
"data-testid": "map-view-loading",
|
|
233
|
+
className: "ds:[inline-size:100%] ds:[block-size:100%]",
|
|
234
|
+
children: [
|
|
235
|
+
/* @__PURE__ */ a(de, { variant: "rectangular", width: "100%", height: "100%" }),
|
|
236
|
+
/* @__PURE__ */ a(ce, { children: t("common.loading") })
|
|
237
|
+
]
|
|
238
|
+
}
|
|
239
|
+
);
|
|
240
|
+
}
|
|
241
|
+
function ze({ children: t }) {
|
|
242
|
+
const o = re();
|
|
243
|
+
return _("maps") || !o || j("Map") ? t : /* @__PURE__ */ a(ve, {});
|
|
244
|
+
}
|
|
245
|
+
function Ve({ children: t }) {
|
|
246
|
+
return _("marker") || j("Marker") ? t : null;
|
|
247
|
+
}
|
|
248
|
+
function Me({
|
|
220
249
|
address: t,
|
|
221
|
-
description:
|
|
250
|
+
description: o,
|
|
222
251
|
onLoadMap: s,
|
|
223
252
|
openInGoogleMapsHref: n,
|
|
224
|
-
consentCta:
|
|
253
|
+
consentCta: m
|
|
225
254
|
}) {
|
|
226
|
-
const { t:
|
|
227
|
-
return /* @__PURE__ */
|
|
255
|
+
const { t: d } = V("ui");
|
|
256
|
+
return /* @__PURE__ */ c("div", { className: be(), "data-testid": "map-view-consent", children: [
|
|
228
257
|
/* @__PURE__ */ a(
|
|
229
|
-
|
|
258
|
+
me,
|
|
230
259
|
{
|
|
231
260
|
"aria-hidden": "true",
|
|
232
261
|
className: "ds:size-6 ds:text-[var(--muted-foreground)]"
|
|
233
262
|
}
|
|
234
263
|
),
|
|
235
|
-
/* @__PURE__ */ a("p", { className:
|
|
264
|
+
/* @__PURE__ */ a("p", { className: ye(), children: d("mapView.consentTitle") }),
|
|
236
265
|
t ? /* @__PURE__ */ a(
|
|
237
266
|
"p",
|
|
238
267
|
{
|
|
@@ -241,20 +270,20 @@ function ge({
|
|
|
241
270
|
children: t
|
|
242
271
|
}
|
|
243
272
|
) : null,
|
|
244
|
-
/* @__PURE__ */ a("p", { className: R(), children:
|
|
245
|
-
/* @__PURE__ */
|
|
246
|
-
|
|
247
|
-
|
|
273
|
+
/* @__PURE__ */ a("p", { className: R(), children: o }),
|
|
274
|
+
/* @__PURE__ */ c("div", { className: "ds:flex ds:gap-[var(--spacing-sm)] ds:flex-wrap ds:items-center ds:justify-center", children: [
|
|
275
|
+
m ?? /* @__PURE__ */ a(
|
|
276
|
+
le,
|
|
248
277
|
{
|
|
249
278
|
type: "button",
|
|
250
279
|
intent: "primary",
|
|
251
280
|
size: "sm",
|
|
252
281
|
onClick: s,
|
|
253
282
|
"data-testid": "map-view-load-cta",
|
|
254
|
-
children:
|
|
283
|
+
children: d("mapView.consentCta")
|
|
255
284
|
}
|
|
256
285
|
),
|
|
257
|
-
/* @__PURE__ */
|
|
286
|
+
/* @__PURE__ */ c(
|
|
258
287
|
"a",
|
|
259
288
|
{
|
|
260
289
|
href: n,
|
|
@@ -262,146 +291,146 @@ function ge({
|
|
|
262
291
|
rel: "noopener noreferrer",
|
|
263
292
|
className: "ds:inline-flex ds:items-center ds:gap-[var(--spacing-2xs)] ds:text-[var(--primary)] ds:underline ds:underline-offset-2",
|
|
264
293
|
children: [
|
|
265
|
-
|
|
266
|
-
/* @__PURE__ */ a(
|
|
294
|
+
d("mapView.openInGoogleMaps"),
|
|
295
|
+
/* @__PURE__ */ a(ue, { "aria-hidden": "true", className: "ds:size-3" })
|
|
267
296
|
]
|
|
268
297
|
}
|
|
269
298
|
)
|
|
270
299
|
] })
|
|
271
300
|
] });
|
|
272
301
|
}
|
|
273
|
-
const
|
|
302
|
+
const ke = X(
|
|
274
303
|
({
|
|
275
304
|
id: t,
|
|
276
|
-
apiKey:
|
|
305
|
+
apiKey: o,
|
|
277
306
|
center: s,
|
|
278
307
|
zoom: n = 15,
|
|
279
|
-
markers:
|
|
280
|
-
selectedMarkerId:
|
|
308
|
+
markers: m,
|
|
309
|
+
selectedMarkerId: d,
|
|
281
310
|
onMarkerClick: i,
|
|
282
|
-
consentGranted:
|
|
311
|
+
consentGranted: P = !1,
|
|
283
312
|
onConsentRequest: b,
|
|
284
|
-
address:
|
|
285
|
-
consentDescription:
|
|
286
|
-
consentCta:
|
|
287
|
-
mapId:
|
|
288
|
-
size:
|
|
289
|
-
surface:
|
|
313
|
+
address: u,
|
|
314
|
+
consentDescription: q,
|
|
315
|
+
consentCta: A,
|
|
316
|
+
mapId: M,
|
|
317
|
+
size: k,
|
|
318
|
+
surface: C,
|
|
290
319
|
ariaLabel: K,
|
|
291
|
-
className:
|
|
292
|
-
...
|
|
293
|
-
},
|
|
294
|
-
const { t: y, i18n:
|
|
295
|
-
() => `map-${
|
|
296
|
-
[
|
|
297
|
-
), [
|
|
320
|
+
className: H,
|
|
321
|
+
...E
|
|
322
|
+
}, D) => {
|
|
323
|
+
const { t: y, i18n: $ } = V("ui"), I = Y(), B = v(
|
|
324
|
+
() => `map-${I.replace(/[^a-zA-Z0-9-_]/g, "")}`,
|
|
325
|
+
[I]
|
|
326
|
+
), [G, F] = N(!1);
|
|
298
327
|
f(() => {
|
|
299
328
|
if (typeof window > "u") return;
|
|
300
|
-
const e = window.matchMedia("(prefers-reduced-motion: reduce)"),
|
|
301
|
-
return
|
|
329
|
+
const e = window.matchMedia("(prefers-reduced-motion: reduce)"), r = () => F(e.matches);
|
|
330
|
+
return r(), e.addEventListener("change", r), () => e.removeEventListener("change", r);
|
|
302
331
|
}, []);
|
|
303
|
-
const
|
|
304
|
-
|
|
305
|
-
}, []),
|
|
332
|
+
const U = v(() => `https://www.google.com/maps/search/?api=1&query=${u ? encodeURIComponent(u) : `${s.lat},${s.lng}`}`, [u, s.lat, s.lng]), l = g(null), J = z((e) => {
|
|
333
|
+
l.current = e;
|
|
334
|
+
}, []), S = g(!1), T = g(null), L = g(0), h = z(
|
|
306
335
|
() => ({
|
|
307
336
|
panTo: (e) => {
|
|
308
|
-
var
|
|
309
|
-
return (
|
|
337
|
+
var r;
|
|
338
|
+
return (r = l.current) == null ? void 0 : r.panTo(e);
|
|
310
339
|
},
|
|
311
340
|
setZoom: (e) => {
|
|
312
|
-
var
|
|
313
|
-
return (
|
|
341
|
+
var r;
|
|
342
|
+
return (r = l.current) == null ? void 0 : r.setZoom(e);
|
|
314
343
|
},
|
|
315
344
|
selectMarker: (e) => {
|
|
316
|
-
var
|
|
317
|
-
return (
|
|
345
|
+
var r;
|
|
346
|
+
return (r = l.current) == null ? void 0 : r.selectMarker(e);
|
|
318
347
|
},
|
|
319
348
|
// Without `isConsentGranted` an agent has no way to learn that
|
|
320
349
|
// its pan / zoom / select was swallowed by the GDPR gate rather
|
|
321
350
|
// than applied: under the default (`consentGranted={false}`) the
|
|
322
351
|
// whole Maps subtree is unmounted and every action optional-chains
|
|
323
352
|
// into nothing.
|
|
324
|
-
isConsentGranted: () =>
|
|
353
|
+
isConsentGranted: () => S.current,
|
|
325
354
|
getCenter: () => {
|
|
326
355
|
var e;
|
|
327
|
-
return ((e =
|
|
356
|
+
return ((e = l.current) == null ? void 0 : e.getCenter()) ?? null;
|
|
328
357
|
},
|
|
329
358
|
getZoom: () => {
|
|
330
359
|
var e;
|
|
331
|
-
return ((e =
|
|
360
|
+
return ((e = l.current) == null ? void 0 : e.getZoom()) ?? null;
|
|
332
361
|
},
|
|
333
|
-
getSelectedMarkerId: () =>
|
|
334
|
-
getMarkerCount: () =>
|
|
362
|
+
getSelectedMarkerId: () => T.current,
|
|
363
|
+
getMarkerCount: () => L.current
|
|
335
364
|
}),
|
|
336
365
|
[]
|
|
337
366
|
);
|
|
338
|
-
|
|
339
|
-
const
|
|
340
|
-
() =>
|
|
341
|
-
[
|
|
367
|
+
ee(D, h, [h]);
|
|
368
|
+
const O = v(
|
|
369
|
+
() => h(),
|
|
370
|
+
[h]
|
|
342
371
|
);
|
|
343
|
-
|
|
372
|
+
pe(he, O, t), f(() => {
|
|
344
373
|
var e;
|
|
345
|
-
|
|
346
|
-
}, [s.lat, s.lng,
|
|
374
|
+
G || (e = l.current) == null || e.panTo(s);
|
|
375
|
+
}, [s.lat, s.lng, G]), f(() => {
|
|
347
376
|
var e;
|
|
348
|
-
(e =
|
|
377
|
+
(e = l.current) == null || e.setZoom(n);
|
|
349
378
|
}, [n]);
|
|
350
|
-
const [
|
|
351
|
-
|
|
352
|
-
const
|
|
379
|
+
const [W, x] = N(!1), Z = P || W;
|
|
380
|
+
S.current = Z, T.current = d ?? null, L.current = (m ?? []).length;
|
|
381
|
+
const Q = z(() => {
|
|
353
382
|
if (b) {
|
|
354
|
-
b(),
|
|
383
|
+
b(), x(!0);
|
|
355
384
|
return;
|
|
356
385
|
}
|
|
357
|
-
|
|
386
|
+
x(!0);
|
|
358
387
|
}, [b]);
|
|
359
388
|
return /* @__PURE__ */ a(
|
|
360
389
|
"div",
|
|
361
390
|
{
|
|
362
|
-
className:
|
|
391
|
+
className: ge({ size: k, surface: C, className: H }),
|
|
363
392
|
"data-component": "map-view",
|
|
364
|
-
"data-component-id": t ??
|
|
393
|
+
"data-component-id": t ?? B,
|
|
365
394
|
role: "region",
|
|
366
395
|
"aria-label": K ?? y("mapView.label"),
|
|
367
|
-
...
|
|
368
|
-
children: /* @__PURE__ */ a("div", { className:
|
|
369
|
-
|
|
396
|
+
...E,
|
|
397
|
+
children: /* @__PURE__ */ a("div", { className: fe({ size: k }), children: Z ? /* @__PURE__ */ a(
|
|
398
|
+
te,
|
|
370
399
|
{
|
|
371
|
-
apiKey:
|
|
372
|
-
language:
|
|
373
|
-
children: /* @__PURE__ */
|
|
374
|
-
|
|
400
|
+
apiKey: o,
|
|
401
|
+
language: $.language,
|
|
402
|
+
children: /* @__PURE__ */ a(ze, { children: /* @__PURE__ */ c(
|
|
403
|
+
se,
|
|
375
404
|
{
|
|
376
405
|
defaultCenter: s,
|
|
377
406
|
defaultZoom: n,
|
|
378
|
-
mapId:
|
|
407
|
+
mapId: M,
|
|
379
408
|
gestureHandling: "cooperative",
|
|
380
409
|
disableDefaultUI: !1,
|
|
381
410
|
onClick: () => i == null ? void 0 : i(null),
|
|
382
411
|
className: "ds:[inline-size:100%] ds:[block-size:100%]",
|
|
383
412
|
children: [
|
|
384
413
|
/* @__PURE__ */ a(
|
|
385
|
-
|
|
414
|
+
we,
|
|
386
415
|
{
|
|
387
|
-
onHandleReady:
|
|
416
|
+
onHandleReady: J,
|
|
388
417
|
onMarkerSelect: (e) => i == null ? void 0 : i(e)
|
|
389
418
|
}
|
|
390
419
|
),
|
|
391
|
-
(
|
|
392
|
-
const
|
|
420
|
+
/* @__PURE__ */ a(Ve, { children: (m ?? []).map((e) => {
|
|
421
|
+
const r = d != null && d === e.id, w = y("mapView.markerLabel", {
|
|
393
422
|
label: e.label ?? e.id
|
|
394
423
|
});
|
|
395
|
-
return
|
|
396
|
-
|
|
424
|
+
return M ? /* @__PURE__ */ a(
|
|
425
|
+
ae,
|
|
397
426
|
{
|
|
398
427
|
position: e.position,
|
|
399
|
-
title:
|
|
400
|
-
"aria-label":
|
|
401
|
-
"data-selected":
|
|
428
|
+
title: w,
|
|
429
|
+
"aria-label": w,
|
|
430
|
+
"data-selected": r ? "true" : "false",
|
|
402
431
|
onClick: () => i == null ? void 0 : i(e.id),
|
|
403
432
|
children: /* @__PURE__ */ a(
|
|
404
|
-
|
|
433
|
+
oe,
|
|
405
434
|
{
|
|
406
435
|
background: "var(--primary)",
|
|
407
436
|
borderColor: "var(--primary)",
|
|
@@ -414,32 +443,32 @@ const fe = Q(
|
|
|
414
443
|
ne,
|
|
415
444
|
{
|
|
416
445
|
position: e.position,
|
|
417
|
-
title:
|
|
446
|
+
title: w,
|
|
418
447
|
onClick: () => i == null ? void 0 : i(e.id)
|
|
419
448
|
},
|
|
420
449
|
e.id
|
|
421
450
|
);
|
|
422
|
-
})
|
|
451
|
+
}) })
|
|
423
452
|
]
|
|
424
453
|
}
|
|
425
|
-
)
|
|
454
|
+
) })
|
|
426
455
|
}
|
|
427
456
|
) : /* @__PURE__ */ a(
|
|
428
|
-
|
|
457
|
+
Me,
|
|
429
458
|
{
|
|
430
|
-
address:
|
|
431
|
-
description:
|
|
432
|
-
onLoadMap:
|
|
433
|
-
consentCta:
|
|
434
|
-
openInGoogleMapsHref:
|
|
459
|
+
address: u,
|
|
460
|
+
description: q ?? y("mapView.consentDescription"),
|
|
461
|
+
onLoadMap: Q,
|
|
462
|
+
consentCta: A,
|
|
463
|
+
openInGoogleMapsHref: U
|
|
435
464
|
}
|
|
436
465
|
) })
|
|
437
466
|
}
|
|
438
467
|
);
|
|
439
468
|
}
|
|
440
469
|
);
|
|
441
|
-
|
|
470
|
+
ke.displayName = "MapView";
|
|
442
471
|
export {
|
|
443
|
-
|
|
472
|
+
ke as M
|
|
444
473
|
};
|
|
445
|
-
//# sourceMappingURL=map-view-
|
|
474
|
+
//# sourceMappingURL=map-view-CQmqQJwK.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"map-view-CQmqQJwK.js","sources":["../../src/components/map-view/map-view.agent.ts","../../src/components/map-view/map-view.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — MapView. */\n/* */\n/* Read-safety actions on the kit's Google Maps wrapper. State is the */\n/* current centre / zoom / selected marker; actions pan, zoom, and */\n/* select markers programmatically. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { MapViewHandle, MapLatLng } from './map-view';\n\nexport const mapViewAgent: AgentAdapter<MapViewHandle> = {\n id: 'map-view',\n // pan → scroll (viewport move); set_zoom → set_value; select_marker → pick\n // (NON-persisting marker focus, no value state slot).\n capabilities: ['scroll', 'set_value', 'pick'],\n // Every action routes through the imperative bridge, which only exists\n // once the map has loaded: consent granted (the default is\n // `consentGranted={false}`) and Google Maps finished loading. Until then\n // all three actions are silent no-ops. `consentGranted` says whether the\n // gate is passed, and a null `center` after it means the map is still\n // loading. `center` / `zoom` are read off the live\n // map because Google clamps zoom and animates pans, so requested is not\n // applied; `selectedMarkerId` is the only confirmation the host accepted\n // a `select_marker` proposal.\n //\n // A9: marker ids only (`MapMarker.id` is a stable opaque id). Never\n // `MapMarker.label`, never the `address` prop (consumer-supplied free\n // text, PII in any patient-address deployment), never `apiKey`.\n state: {\n consentGranted: {\n type: 'boolean',\n descriptionKey: 'ui.agent.mapView.state.consentGranted',\n description:\n 'True when the GDPR consent gate has been passed. Read this FIRST: while it is false every action is a silent no-op against a placeholder, and nothing else in the surface says so. When it is true but `center` is still null, Google Maps is loading; wait for `center` before acting.',\n read: (handle) => handle.isConsentGranted(),\n },\n markerCount: {\n type: 'number',\n descriptionKey: 'ui.agent.mapView.state.markerCount',\n description:\n 'Number of markers the consumer passed. Zero means there is nothing for `select_marker` to select. A count only — no ids, labels or positions.',\n read: (handle) => handle.getMarkerCount(),\n },\n selectedMarkerId: {\n type: 'string | null',\n descriptionKey: 'ui.agent.mapView.state.selectedMarkerId',\n description:\n 'Id of the marker the host currently holds as selected, or null. Selection is fully controlled by the consumer, so `select_marker` only proposes — this slot is the only way to see whether the proposal was accepted.',\n read: (handle) => handle.getSelectedMarkerId(),\n },\n center: {\n type: '{ lat: number; lng: number } | null',\n descriptionKey: 'ui.agent.mapView.state.center',\n description:\n 'Live map centre in lat/lng, or null until the map has loaded (consent not granted, or Google Maps still loading). The read-back for `pan_to`, and the sign that the map is ready.',\n read: (handle) => handle.getCenter(),\n },\n zoom: {\n type: 'number | null',\n descriptionKey: 'ui.agent.mapView.state.zoom',\n description:\n \"Live zoom level, or null until the map has loaded. Google clamps zoom to the map type's range, so this is not necessarily the value last passed to `set_zoom`.\",\n read: (handle) => handle.getZoom(),\n },\n },\n actions: {\n pan_to: {\n // Ephemeral viewport move, no data loss → read.\n safety: 'read',\n argsType: '{ position: { lat: number; lng: number } }',\n argsSchema: {\n type: 'object',\n properties: {\n position: {\n type: 'object',\n properties: {\n lat: { type: 'number', description: 'Latitude in degrees.' },\n lng: { type: 'number', description: 'Longitude in degrees.' },\n },\n required: ['lat', 'lng'],\n },\n },\n required: ['position'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.mapView.actions.panTo',\n description:\n 'Pan the map to a new centre without changing zoom. Read the `center` slot back to confirm — Google animates the pan, so the applied centre settles after the call.',\n errors: [\n 'Silent no-op until the map has loaded: while `consentGranted` is false (only the consent placeholder shows) or while `center` is still null (Google Maps is loading).',\n ],\n invoke: (handle, args: { position: MapLatLng }) => {\n handle.panTo(args.position);\n },\n },\n set_zoom: {\n // Ephemeral viewport zoom, no data loss → read.\n safety: 'read',\n argsType: '{ zoom: number }',\n argsSchema: {\n type: 'object',\n properties: {\n zoom: {\n type: 'number',\n description: 'Zoom level, typical range 1–20.',\n },\n },\n required: ['zoom'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.mapView.actions.setZoom',\n description:\n 'Set the map zoom level (typical range 1–20). Read the `zoom` slot back — Google clamps the request to the map type’s supported range, so requested and applied can differ.',\n errors: [\n 'Silent no-op until the map has loaded: while `consentGranted` is false (only the consent placeholder shows) or while `center` is still null (Google Maps is loading).',\n \"Requested zoom is clamped to the map type's range; `zoom` reports what was actually applied.\",\n ],\n invoke: (handle, args: { zoom: number }) => {\n handle.setZoom(args.zoom);\n },\n },\n select_marker: {\n // Ephemeral marker focus, no data loss → read.\n safety: 'read',\n argsType: '{ id: string | null }',\n argsSchema: {\n type: 'object',\n properties: {\n id: {\n type: ['string', 'null'],\n description: 'Marker id to select, or null to clear the selection.',\n },\n },\n required: ['id'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.mapView.actions.selectMarker',\n description:\n \"Propose a marker selection by id, or pass null to clear it. Fires the host's `onMarkerClick`; selection is controlled by the host, so read the `selectedMarkerId` slot back to see whether it accepted.\",\n errors: [\n 'Silent no-op until the map has loaded: while `consentGranted` is false (only the consent placeholder shows) or while `center` is still null (Google Maps is loading).',\n 'The host owns `selectedMarkerId` and may ignore the proposal; `selectedMarkerId` is unchanged when it does.',\n ],\n invoke: (handle, args: { id: string | null }) => {\n handle.selectMarker(args.id);\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'map-view',\n description: 'Marks the element as a kit MapView.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","/* ------------------------------------------------------------------ */\n/* MapView — kit wrapper over @vis.gl/react-google-maps. */\n/* */\n/* - Loads the Google Maps JS API on demand via the library's */\n/* `APIProvider`; consumer supplies the key (no kit-side cache). */\n/* - Defaults to a CONSENT-GATED placeholder (`consentGranted={false}`) */\n/* so the third-party load never happens before the consumer flips */\n/* the opt-in. GDPR-safe by default. */\n/* - Theme-reactive: the Google Maps `styles` JSON re-resolves on every */\n/* `documentElement.class` mutation (same pattern as Sparkline). */\n/* Consumers may pass `mapId` to switch to a cloud-styled map */\n/* instead, in which case `styles` is ignored. */\n/* - `data-component=\"map-view\"` lives on the outer span; the inner */\n/* `<Map>` mounts inside it. */\n/* ------------------------------------------------------------------ */\n\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { MapPin, ExternalLink } from 'lucide-react';\nimport {\n APIProvider,\n Map as GoogleMap,\n AdvancedMarker,\n Marker,\n Pin,\n useApiIsLoaded,\n useMap,\n useMapsLibrary,\n} from '@vis.gl/react-google-maps';\nimport { Button } from '../button';\nimport { Skeleton } from '../skeleton';\nimport { VisuallyHidden } from '../visually-hidden';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { mapViewAgent } from './map-view.agent';\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\nexport interface MapLatLng {\n lat: number;\n lng: number;\n}\n\nexport interface MapMarker {\n /** Stable id — used for keyed re-rendering and `onMarkerClick`. */\n id: string;\n /** Position in lat/lng. */\n position: MapLatLng;\n /** Optional accessible label — falls back to the id. */\n label?: string;\n}\n\nexport interface MapViewHandle {\n /** Pan the map to a new centre without changing zoom. */\n panTo: (position: MapLatLng) => void;\n /** Set zoom (typical range 1–20). */\n setZoom: (zoom: number) => void;\n /** Programmatically select a marker (fires `onMarkerClick`). */\n selectMarker: (id: string | null) => void;\n /* ---- read-back ------------------------------------------------- */\n /**\n * True once the consent gate has been passed. The map may still be\n * loading: the three actions above stay silent no-ops until\n * `getCenter` returns a value.\n */\n isConsentGranted: () => boolean;\n /** Live map centre, or `null` until the map has loaded. */\n getCenter: () => MapLatLng | null;\n /**\n * Live zoom level, or `null` until the map has loaded.\n * Google clamps to the map type's range, so this is not necessarily\n * the value last passed to `setZoom`.\n */\n getZoom: () => number | null;\n /**\n * The controlled `selectedMarkerId` prop as the host currently holds\n * it. `selectMarker` only proposes a selection — the host is free to\n * ignore it, and this is the only way to see whether it did.\n */\n getSelectedMarkerId: () => string | null;\n /** Number of markers passed to the component. Count only, no ids. */\n getMarkerCount: () => number;\n}\n\n/**\n * The slice of `MapViewHandle` that needs a live `google.maps.Map`.\n * Built inside the `APIProvider` subtree by `MapImperativeBridge`; the\n * outer component composes it with the props-derived getters, and holds\n * `null` whenever the subtree is unmounted.\n */\ntype MapBridgeHandle = Pick<\n MapViewHandle,\n 'panTo' | 'setZoom' | 'selectMarker' | 'getCenter' | 'getZoom'\n>;\n\nexport interface MapViewProps\n extends\n Omit<HTMLAttributes<HTMLDivElement>, 'onClick'>,\n VariantProps<typeof mapViewVariants> {\n /** Opaque instance id — emitted as `data-component-id`. */\n id?: string;\n /** Google Maps JS API key. Consumer-owned; never cached by the kit. */\n apiKey: string;\n /** Map centre (lat/lng). Required so the consent placeholder can also use it. */\n center: MapLatLng;\n /** Initial zoom. Default 15 (city-block detail, matches booking site). */\n zoom?: number;\n /**\n * Markers to render. The first marker auto-selects when no\n * `selectedMarkerId` is given.\n */\n markers?: MapMarker[];\n /** Controlled selection — fires `onMarkerClick` with the new id (or null on map click). */\n selectedMarkerId?: string | null;\n /** Fires when a marker is clicked, or `null` when the map background is clicked. */\n onMarkerClick?: (id: string | null) => void;\n /**\n * GDPR consent gate. When `false` (default) the component renders a\n * placeholder with a translated CTA — the Maps JS API is **not**\n * loaded. Flip to `true` once the consumer has captured opt-in.\n */\n consentGranted?: boolean;\n /** Fires when the consumer clicks the \"Load map\" CTA in the placeholder. */\n onConsentRequest?: () => void;\n /**\n * Optional address string shown in the consent placeholder so the\n * surface is useful before the map loads. Also used to build the\n * fallback \"Open in Google Maps\" link target.\n */\n address?: string;\n /**\n * Cloud-styled-map id. When set, takes precedence over the JSON\n * `styles` array and disables the theme-bridge re-fire. Use when\n * you've provisioned a styled map in Google Cloud Console.\n */\n mapId?: string;\n /**\n * Override the consent-placeholder description text. The default\n * (`t('mapView.consentDescription')`) is a generic IP-disclosure\n * line. Consumers operating under specific GDPR / ePrivacy\n * disclosures (jurisdiction, named controller, policy link) should\n * supply their own text via this prop. Pass any `ReactNode` — a\n * paragraph, a localised `<Trans>` instance, etc.\n */\n consentDescription?: ReactNode;\n /**\n * Replace the kit-rendered \"Load map\" button with custom CTA chrome.\n * Use when the consent dialog needs a policy link, a specific\n * jurisdiction phrasing, or a different surface (Tooltip-wrapped\n * button, link to a settings page, etc.). When omitted the kit\n * renders its own `<Button>` — that button calls `onConsentRequest`\n * if provided, otherwise flips MapView's internal opt-in state so\n * the map loads inline.\n */\n consentCta?: ReactNode;\n /**\n * Visual surface. Default `bordered` (current behaviour: 1px\n * `--border` outline + `--radius-md`). `elevated` replaces the\n * border with `--shadow-card`, matching `<Card variant=\"elevated\">`.\n * `bare` drops both — map is flush against the page canvas.\n */\n surface?: 'bordered' | 'elevated' | 'bare';\n /** Accessible label for the map region. Falls back to `t('mapView.label')`. */\n ariaLabel?: string;\n}\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst mapViewVariants = cva(\n ['ds:relative ds:overflow-hidden ds:block', 'ds:bg-[var(--muted)]'].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:[--map-block-size:14rem]',\n md: 'ds:[--map-block-size:20rem]',\n lg: 'ds:[--map-block-size:28rem]',\n // `fill` defers sizing to the parent. The outer takes\n // `block-size: 100%` so the inner (also 100%) has something\n // to inherit from. Use inside a viewport-locked column —\n // `<PracticeResults variant=\"map-first\">` wires this through\n // automatically; standalone consumers must give the parent\n // a constrained block-size or the map collapses to 0.\n fill: 'ds:[block-size:100%]',\n },\n surface: {\n bordered:\n 'ds:rounded-[var(--radius-md)] ds:border ds:border-[color:var(--border)]',\n elevated:\n 'ds:rounded-[var(--radius-md)] ds:shadow-[var(--shadow-card)] ds:border ds:border-[color:var(--card-border)] ds:[.theme-accessible_&]:border-2',\n bare: 'ds:rounded-none ds:border-0',\n },\n },\n defaultVariants: { size: 'md', surface: 'bordered' },\n },\n);\n\n// Inner block-size: percentage when `size=\"fill\"`, rem-token otherwise.\n// Splitting this out (instead of compound-variants) keeps the size\n// switch readable and avoids enumerating every (size × surface) pair.\nconst innerSurfaceVariants = cva('ds:block ds:inline-size-full', {\n variants: {\n size: {\n sm: 'ds:[block-size:var(--map-block-size)]',\n md: 'ds:[block-size:var(--map-block-size)]',\n lg: 'ds:[block-size:var(--map-block-size)]',\n fill: 'ds:[block-size:100%]',\n },\n },\n defaultVariants: { size: 'md' },\n});\n\nconst consentChromeVariants = cva(\n [\n 'ds:absolute ds:inset-0',\n 'ds:flex ds:flex-col ds:items-center ds:justify-center',\n 'ds:gap-[var(--spacing-sm)]',\n 'ds:p-[var(--spacing-md)]',\n 'ds:bg-[var(--muted)] ds:text-[var(--foreground)]',\n 'ds:text-center',\n ].join(' '),\n);\n\nconst consentTitleVariants = cva('type-heading-3 ds:m-0');\n\nconst consentDescriptionVariants = cva(\n 'type-body-sm ds:text-[var(--muted-foreground)] ds:[max-inline-size:28rem] ds:m-0',\n);\n\n/* ------------------------------------------------------------------ */\n/* Inner imperative bridge */\n/* */\n/* `useMap()` only resolves inside the APIProvider tree, so the */\n/* imperative actions live in a tiny inner component that the outer */\n/* `MapView` mounts conditionally. It exposes the `panTo` / `setZoom` */\n/* etc. to the forwardRef via a `useImperativeHandle` callback prop. */\n/* ------------------------------------------------------------------ */\n\ninterface MapImperativeBridgeProps {\n /** Called with the live handle on mount, and with `null` on unmount. */\n onHandleReady: (handle: MapBridgeHandle | null) => void;\n onMarkerSelect: (id: string | null) => void;\n}\n\nfunction MapImperativeBridge({\n onHandleReady,\n onMarkerSelect,\n}: MapImperativeBridgeProps): null {\n const map = useMap();\n useEffect(() => {\n if (!map) return;\n onHandleReady({\n panTo: (position) => map.panTo(position),\n setZoom: (zoom) => map.setZoom(zoom),\n selectMarker: (id) => onMarkerSelect(id),\n // Read straight off the live map: Google clamps `setZoom` to the\n // map type's range and animates `panTo`, so requested and applied\n // are not the same value.\n getCenter: () => map.getCenter()?.toJSON() ?? null,\n getZoom: () => map.getZoom() ?? null,\n });\n // Drop the handle when the subtree unmounts (consent revoked, or the\n // component tears down) so the outer getters answer `null` instead of\n // reporting a dead map's last known position.\n return () => onHandleReady(null);\n }, [map, onHandleReady, onMarkerSelect]);\n return null;\n}\n\n/* ------------------------------------------------------------------ */\n/* Library gates */\n/* */\n/* APIProvider reports LOADED as soon as `google.maps.importLibrary` */\n/* exists when another loader installed it (Google's bootstrap, a host */\n/* Places loader), before the `maps` library itself has arrived. <Map> */\n/* would then run `new google.maps.Map` and throw, taking the host's */\n/* React tree down. The map waits for `maps`, and the markers for */\n/* `marker`, whoever loaded the API. Before the API loads, <Map> only */\n/* renders its empty container, and once a constructor exists nothing */\n/* can throw, so both pass straight through as they always did. */\n/* ------------------------------------------------------------------ */\n\ntype GoogleMapsGlobal = {\n google?: { maps?: { Map?: unknown; Marker?: unknown } };\n};\nconst hasConstructor = (name: 'Map' | 'Marker'): boolean =>\n typeof (globalThis as GoogleMapsGlobal).google?.maps?.[name] === 'function';\n\n/** What the map area shows while Google's map library is on its way.\n * Exported for its story; not part of the public API. */\nexport function MapViewLoading(): ReactNode {\n const { t } = useTranslation('ui');\n return (\n <div\n role=\"status\"\n data-testid=\"map-view-loading\"\n className=\"ds:[inline-size:100%] ds:[block-size:100%]\"\n >\n <Skeleton variant=\"rectangular\" width=\"100%\" height=\"100%\" />\n <VisuallyHidden>{t('common.loading')}</VisuallyHidden>\n </div>\n );\n}\n\nfunction MapsLibraryGate({ children }: { children: ReactNode }): ReactNode {\n const apiIsLoaded = useApiIsLoaded();\n const maps = useMapsLibrary('maps');\n if (maps || !apiIsLoaded || hasConstructor('Map')) return children;\n return <MapViewLoading />;\n}\n\nfunction MarkerLibraryGate({ children }: { children: ReactNode }): ReactNode {\n const marker = useMapsLibrary('marker');\n return marker || hasConstructor('Marker') ? children : null;\n}\n\n/* ------------------------------------------------------------------ */\n/* Consent placeholder */\n/* ------------------------------------------------------------------ */\n\ninterface ConsentPlaceholderProps {\n address: string | undefined;\n description: ReactNode;\n /**\n * Click handler for the \"Load map\" button. Always rendered. When the\n * consumer provides `onConsentRequest` it owns the state transition\n * (typically: open a GDPR dialog, then flip `consentGranted` to true\n * after acceptance). When omitted, the kit's `MapView` falls back to\n * its own internal opt-in toggle — clicking grants consent for this\n * MapView instance only, no consumer plumbing required. This default\n * fixes a regression where the button was conditionally rendered and\n * any consumer omitting `onConsentRequest` left the patient with no\n * way to load the map (booking-website 0.31.0 hit this).\n */\n onLoadMap: () => void;\n openInGoogleMapsHref: string;\n /**\n * Custom CTA — replaces the kit-rendered `<Button>` when the consumer\n * needs a different surface (e.g. a Tooltip-wrapped button with a\n * policy link). The kit's button is still the recommended path; this\n * slot exists for consumers operating under specific compliance UX\n * requirements (jurisdiction, named controller, policy link). Pass\n * any `ReactNode`.\n */\n consentCta: ReactNode | undefined;\n}\n\nfunction ConsentPlaceholder({\n address,\n description,\n onLoadMap,\n openInGoogleMapsHref,\n consentCta,\n}: ConsentPlaceholderProps): ReactNode {\n const { t } = useTranslation('ui');\n return (\n <div className={consentChromeVariants()} data-testid=\"map-view-consent\">\n <MapPin\n aria-hidden=\"true\"\n className=\"ds:size-6 ds:text-[var(--muted-foreground)]\"\n />\n <p className={consentTitleVariants()}>{t('mapView.consentTitle')}</p>\n {address ? (\n <p\n className={consentDescriptionVariants()}\n data-testid=\"map-view-address\"\n >\n {address}\n </p>\n ) : null}\n <p className={consentDescriptionVariants()}>{description}</p>\n <div className=\"ds:flex ds:gap-[var(--spacing-sm)] ds:flex-wrap ds:items-center ds:justify-center\">\n {consentCta ?? (\n <Button\n type=\"button\"\n intent=\"primary\"\n size=\"sm\"\n onClick={onLoadMap}\n data-testid=\"map-view-load-cta\"\n >\n {t('mapView.consentCta')}\n </Button>\n )}\n <a\n href={openInGoogleMapsHref}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-2xs)] ds:text-[var(--primary)] ds:underline ds:underline-offset-2\"\n >\n {t('mapView.openInGoogleMaps')}\n <ExternalLink aria-hidden=\"true\" className=\"ds:size-3\" />\n </a>\n </div>\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* MapView */\n/* ------------------------------------------------------------------ */\n\nexport const MapView = forwardRef<MapViewHandle, MapViewProps>(\n (\n {\n id,\n apiKey,\n center,\n zoom = 15,\n markers,\n selectedMarkerId,\n onMarkerClick,\n consentGranted = false,\n onConsentRequest,\n address,\n consentDescription,\n consentCta,\n mapId,\n size,\n surface,\n ariaLabel,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation('ui');\n const rawId = useId();\n const instanceId = useMemo(\n () => `map-${rawId.replace(/[^a-zA-Z0-9-_]/g, '')}`,\n [rawId],\n );\n\n // Reduced-motion gating. Google's own pan / zoom animations\n // happen inside the Maps JS API and the kit can't reach into\n // those — but the kit's own programmatic `panTo` calls (triggered\n // by prop changes via the controlled-sync effect below) can be\n // suppressed. When `prefers-reduced-motion: reduce` is set, we\n // skip the synthetic `panTo` so the consumer's prop change\n // results in a hard recenter rather than an animated glide.\n const [reducedMotion, setReducedMotion] = useState(false);\n useEffect(() => {\n if (typeof window === 'undefined') return undefined;\n const mql = window.matchMedia('(prefers-reduced-motion: reduce)');\n const sync = (): void => setReducedMotion(mql.matches);\n sync();\n mql.addEventListener('change', sync);\n return () => mql.removeEventListener('change', sync);\n }, []);\n\n // The \"Open in Google Maps\" fallback link — works without any\n // third-party script load. Uses the modern `?api=1&query=…` form\n // which the booking site already employs.\n const openInGoogleMapsHref = useMemo(() => {\n const query = address\n ? encodeURIComponent(address)\n : `${center.lat},${center.lng}`;\n return `https://www.google.com/maps/search/?api=1&query=${query}`;\n }, [address, center.lat, center.lng]);\n\n // 0.33.5: removed the kit's `getGoogleMapsTheme()` JSON-styles\n // override. Previously, when `mapId` was absent the kit painted\n // water / roads / landscape with kit tokens — a calm muted-grey\n // palette that diverged from the standard Google Maps appearance\n // users expect in every other maps surface they touch. Google's\n // default (blue water, beige land, named-road colours) is more\n // familiar and reads as a \"real map\" rather than a stylised one.\n //\n // Consumers wanting brand-themed colours opt in via `mapId` and\n // configure the palette in Google Cloud Console — that's the\n // Google-recommended path. The `getGoogleMapsTheme` export stays\n // in `src/tokens/google-maps-theme.ts` so consumers wanting the\n // old behaviour can apply the styles themselves, but the kit\n // does NOT install them by default any more.\n //\n // Side benefit: dropped the MutationObserver that previously\n // watched documentElement.class for theme switches — no more\n // observer churn on every theme toggle.\n\n // Imperative handle plumbing — populated by the inner bridge once\n // the APIProvider tree resolves a `Map` instance.\n const handleRef = useRef<MapBridgeHandle | null>(null);\n const onHandleReady = useCallback((handle: MapBridgeHandle | null) => {\n handleRef.current = handle;\n }, []);\n\n // Read in the OUTER component, not through `handleRef` — these three\n // must still answer when the map subtree is unmounted, which is\n // exactly the situation an agent needs explaining. Assigned during\n // render, below, once `effectiveConsent` exists.\n const consentRef = useRef(false);\n const selectedMarkerIdRef = useRef<string | null>(null);\n const markerCountRef = useRef(0);\n\n const buildHandle = useCallback(\n (): MapViewHandle => ({\n panTo: (position) => handleRef.current?.panTo(position),\n setZoom: (z) => handleRef.current?.setZoom(z),\n selectMarker: (markerId) => handleRef.current?.selectMarker(markerId),\n // Without `isConsentGranted` an agent has no way to learn that\n // its pan / zoom / select was swallowed by the GDPR gate rather\n // than applied: under the default (`consentGranted={false}`) the\n // whole Maps subtree is unmounted and every action optional-chains\n // into nothing.\n isConsentGranted: () => consentRef.current,\n getCenter: () => handleRef.current?.getCenter() ?? null,\n getZoom: () => handleRef.current?.getZoom() ?? null,\n getSelectedMarkerId: () => selectedMarkerIdRef.current,\n getMarkerCount: () => markerCountRef.current,\n }),\n [],\n );\n useImperativeHandle(ref, buildHandle, [buildHandle]);\n\n const agentHandle = useMemo<MapViewHandle>(\n () => buildHandle(),\n [buildHandle],\n );\n useAgentRegistration(mapViewAgent, agentHandle, id);\n\n // Controlled-feeling propagation: vis.gl's `<Map>` reads `center`\n // and `zoom` as initial values only (via `defaultCenter` /\n // `defaultZoom`). To honour the documented \"live prop\" contract\n // we shim post-mount sync through the imperative bridge — a\n // parent that swaps offices by changing `center` re-centres the\n // map. User drag does NOT trigger this because the prop doesn't\n // change on user gesture, so the effect doesn't fire and the\n // map stays where the user left it.\n useEffect(() => {\n // Skip the animated pan under reduced-motion preference; the\n // map will still recentre on the next render via the agent\n // handle's `panTo`, but Google's own glide animation runs\n // either way (kit can't reach inside it). At least the kit's\n // own initiated pan is gated.\n if (reducedMotion) return;\n handleRef.current?.panTo(center);\n // Including `center` (the object reference) instead of\n // `center.lat`/`center.lng` would fire on every parent render\n // even when the coordinates are identical, fighting user drag.\n // The destructured deps are intentional.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [center.lat, center.lng, reducedMotion]);\n useEffect(() => {\n handleRef.current?.setZoom(zoom);\n }, [zoom]);\n\n // Internal opt-in fallback. The `consentGranted` prop is the\n // controlled path — consumer flips it after capturing GDPR\n // acceptance through their own dialog and re-renders. When the\n // consumer omits `onConsentRequest` they're opting out of that\n // workflow, so the kit needs a sensible default click handler on\n // the placeholder's button. `internalConsent` tracks that opt-in\n // for this instance only; the map renders when either signal is\n // truthy. The 0.31.0 regression was conditionally rendering the\n // button on `onConsentRequest` — patients of consumers without the\n // hook saw the placeholder with no way to proceed.\n const [internalConsent, setInternalConsent] = useState(false);\n const effectiveConsent = consentGranted || internalConsent;\n // Mirror the three props-derived agent state slots. Assigned during\n // render so a read immediately after a prop change sees the settled\n // value. Ids and a count only — never `MapMarker.label`, never the\n // `address` prop (consumer-supplied free text, PII in any\n // patient-address deployment), never `apiKey`.\n consentRef.current = effectiveConsent;\n selectedMarkerIdRef.current = selectedMarkerId ?? null;\n markerCountRef.current = (markers ?? []).length;\n const handleLoadMap = useCallback(() => {\n if (onConsentRequest) {\n onConsentRequest();\n // The consumer typically flips `consentGranted` to true on the\n // next render. Flip the internal state too so the map still\n // loads if the consumer forgets to update its prop (the\n // common-case footgun this fallback exists to defuse).\n setInternalConsent(true);\n return;\n }\n setInternalConsent(true);\n }, [onConsentRequest]);\n\n return (\n <div\n className={mapViewVariants({ size, surface, className })}\n data-component=\"map-view\"\n data-component-id={id ?? instanceId}\n role=\"region\"\n aria-label={ariaLabel ?? t('mapView.label')}\n {...rest}\n >\n <div className={innerSurfaceVariants({ size })}>\n {effectiveConsent ? (\n <APIProvider\n apiKey={apiKey}\n // Pull the active i18next locale through so map UI text\n // (zoom controls, attribution) localises to match the\n // surrounding kit chrome.\n language={i18n.language}\n >\n <MapsLibraryGate>\n <GoogleMap\n defaultCenter={center}\n defaultZoom={zoom}\n mapId={mapId}\n gestureHandling=\"cooperative\"\n disableDefaultUI={false}\n onClick={() => onMarkerClick?.(null)}\n // `<Map>` reads its own bounding rect for tile sizing.\n // Without explicit dimensions it collapses to 0×0, so\n // we pass kit-class sizing through `className` — vis.gl\n // forwards `className` straight to the rendered root.\n className=\"ds:[inline-size:100%] ds:[block-size:100%]\"\n >\n <MapImperativeBridge\n onHandleReady={onHandleReady}\n onMarkerSelect={(markerId) => onMarkerClick?.(markerId)}\n />\n <MarkerLibraryGate>\n {(markers ?? []).map((marker) => {\n // Selection state is exposed to the consumer via\n // `data-selected` on the marker root so consumers can\n // style their own InfoWindow / sidebar highlight from\n // it. The kit does NOT swap the Pin's fill colour on\n // selection — `--accent` (magenta-500 in light theme)\n // fails AA on white per 05-accessibility.mdx, and the\n // alternative tokens that pass (`--info`, `--success`)\n // carry semantic baggage. Visual selection state is\n // the consumer's call.\n const isSelected =\n selectedMarkerId != null &&\n selectedMarkerId === marker.id;\n const accessibleLabel = t('mapView.markerLabel', {\n label: marker.label ?? marker.id,\n });\n // Pin implementation switches on whether the\n // consumer supplied `mapId`. Google's\n // AdvancedMarkerElement requires the Map instance to\n // be initialised with a valid Map ID — without one\n // the API logs an error (\"La mappa è stata\n // inizializzata senza un ID mappa valido\") and any\n // AdvancedMarker rendered against that map fails to\n // appear. Cloud Map IDs are an opt-in feature; many\n // consumers (booking-website env without\n // GOOGLE_MAPS_MAP_ID, the OSS demo, etc.) legitimately\n // omit it.\n //\n // Fall back to the classic <Marker> (a thin wrapper\n // around google.maps.Marker) when mapId is absent.\n // Google has formally deprecated google.maps.Marker\n // but it still renders cleanly and produces no\n // console errors; the only loss is the brand-tinted\n // <Pin> chrome (which Marker doesn't accept as a\n // child). When a consumer wants the styled pin they\n // can opt back in by supplying `mapId`.\n if (mapId) {\n return (\n <AdvancedMarker\n key={marker.id}\n position={marker.position}\n // `title` becomes the HTML `title` attribute on\n // Google's marker wrapper — that's a tooltip, not\n // a reliable accessible name. The wrapper also\n // receives `aria-label` which Google honours as\n // the SR-announced name. Both are set so sighted\n // hover tooltips and SR labels stay aligned.\n title={accessibleLabel}\n aria-label={accessibleLabel}\n data-selected={isSelected ? 'true' : 'false'}\n onClick={() => onMarkerClick?.(marker.id)}\n >\n <Pin\n background={'var(--primary)'}\n borderColor={'var(--primary)'}\n glyphColor={'var(--primary-foreground)'}\n />\n </AdvancedMarker>\n );\n }\n return (\n <Marker\n key={marker.id}\n position={marker.position}\n title={accessibleLabel}\n onClick={() => onMarkerClick?.(marker.id)}\n />\n );\n })}\n </MarkerLibraryGate>\n </GoogleMap>\n </MapsLibraryGate>\n </APIProvider>\n ) : (\n <ConsentPlaceholder\n address={address}\n description={\n consentDescription ?? t('mapView.consentDescription')\n }\n onLoadMap={handleLoadMap}\n consentCta={consentCta}\n openInGoogleMapsHref={openInGoogleMapsHref}\n />\n )}\n </div>\n </div>\n );\n },\n);\nMapView.displayName = 'MapView';\n"],"names":["mapViewAgent","handle","args","mapViewVariants","cva","innerSurfaceVariants","consentChromeVariants","consentTitleVariants","consentDescriptionVariants","MapImperativeBridge","onHandleReady","onMarkerSelect","map","useMap","useEffect","position","zoom","id","_a","hasConstructor","name","_b","MapViewLoading","useTranslation","jsxs","jsx","Skeleton","VisuallyHidden","MapsLibraryGate","children","apiIsLoaded","useApiIsLoaded","useMapsLibrary","MarkerLibraryGate","ConsentPlaceholder","address","description","onLoadMap","openInGoogleMapsHref","consentCta","t","MapPin","Button","ExternalLink","MapView","forwardRef","apiKey","center","markers","selectedMarkerId","onMarkerClick","consentGranted","onConsentRequest","consentDescription","mapId","size","surface","ariaLabel","className","rest","ref","i18n","rawId","useId","instanceId","useMemo","reducedMotion","setReducedMotion","useState","mql","sync","handleRef","useRef","useCallback","consentRef","selectedMarkerIdRef","markerCountRef","buildHandle","z","markerId","useImperativeHandle","agentHandle","useAgentRegistration","internalConsent","setInternalConsent","effectiveConsent","handleLoadMap","APIProvider","GoogleMap","marker","isSelected","accessibleLabel","AdvancedMarker","Pin","Marker"],"mappings":"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"}
|