@alfadocs/ui-kit-debug 0.31.0 → 0.31.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (526) hide show
  1. package/dist/_chunks/{accordion-CNcodXuO.js → accordion-bSU21uTV.js} +3 -3
  2. package/dist/_chunks/{accordion-CNcodXuO.js.map → accordion-bSU21uTV.js.map} +1 -1
  3. package/dist/_chunks/{agenda-card-DO9_yogb.js → agenda-card-UJA6Arbs.js} +3 -3
  4. package/dist/_chunks/{agenda-card-DO9_yogb.js.map → agenda-card-UJA6Arbs.js.map} +1 -1
  5. package/dist/_chunks/{agenda-tray-WLbfMip6.js → agenda-tray-1fAxNOMz.js} +4 -4
  6. package/dist/_chunks/{agenda-tray-WLbfMip6.js.map → agenda-tray-1fAxNOMz.js.map} +1 -1
  7. package/dist/_chunks/{ai-prompt-input-BXlwNnWe.js → ai-prompt-input-C6sCr1Vi.js} +11 -10
  8. package/dist/_chunks/ai-prompt-input-C6sCr1Vi.js.map +1 -0
  9. package/dist/_chunks/{alia-sidebar-C-232sD7.js → alia-sidebar-BEoMl6UL.js} +9 -9
  10. package/dist/_chunks/{alia-sidebar-C-232sD7.js.map → alia-sidebar-BEoMl6UL.js.map} +1 -1
  11. package/dist/_chunks/ar-CEpIJtcO.js +399 -0
  12. package/dist/_chunks/ar-CEpIJtcO.js.map +1 -0
  13. package/dist/_chunks/{audio-recorder-DL800PE_.js → audio-recorder-C1rhKhSN.js} +114 -114
  14. package/dist/_chunks/audio-recorder-C1rhKhSN.js.map +1 -0
  15. package/dist/_chunks/audio-visualiser-l6zPd0AG.js +162 -0
  16. package/dist/_chunks/audio-visualiser-l6zPd0AG.js.map +1 -0
  17. package/dist/_chunks/{autocomplete-CUh0f7Dj.js → autocomplete-DIgdhCGJ.js} +2 -2
  18. package/dist/_chunks/{autocomplete-CUh0f7Dj.js.map → autocomplete-DIgdhCGJ.js.map} +1 -1
  19. package/dist/_chunks/{avatar-D_H4emLo.js → avatar-BNQNhoyL.js} +19 -18
  20. package/dist/_chunks/avatar-BNQNhoyL.js.map +1 -0
  21. package/dist/_chunks/{badge-CIjQ1Us1.js → badge-CptERaHx.js} +2 -2
  22. package/dist/_chunks/{badge-CIjQ1Us1.js.map → badge-CptERaHx.js.map} +1 -1
  23. package/dist/_chunks/{booking-Bhk9IYm3.js → booking-BIZ9GSer.js} +15 -15
  24. package/dist/_chunks/{booking-Bhk9IYm3.js.map → booking-BIZ9GSer.js.map} +1 -1
  25. package/dist/_chunks/{breadcrumb--YI7lcHA.js → breadcrumb-CLlhx7qo.js} +2 -2
  26. package/dist/_chunks/{breadcrumb--YI7lcHA.js.map → breadcrumb-CLlhx7qo.js.map} +1 -1
  27. package/dist/_chunks/{button-group-Bh2g_Ng-.js → button-group-Ciq6J4IW.js} +15 -14
  28. package/dist/_chunks/button-group-Ciq6J4IW.js.map +1 -0
  29. package/dist/_chunks/{calendar-WWNx448i.js → calendar-YHFknAGv.js} +22 -22
  30. package/dist/_chunks/{calendar-WWNx448i.js.map → calendar-YHFknAGv.js.map} +1 -1
  31. package/dist/_chunks/{carousel.agent-C2Icc9_T.js → carousel.agent-DrX96W-1.js} +2 -2
  32. package/dist/_chunks/{carousel.agent-C2Icc9_T.js.map → carousel.agent-DrX96W-1.js.map} +1 -1
  33. package/dist/_chunks/{chart-BLvFl169.js → chart-DLkVn_ex.js} +2 -2
  34. package/dist/_chunks/{chart-BLvFl169.js.map → chart-DLkVn_ex.js.map} +1 -1
  35. package/dist/_chunks/{chat-container-izziXViv.js → chat-container-ogB4OskO.js} +24 -23
  36. package/dist/_chunks/chat-container-ogB4OskO.js.map +1 -0
  37. package/dist/_chunks/{chat-input-cyl_y9bh.js → chat-input-CQe7nR_v.js} +132 -118
  38. package/dist/_chunks/chat-input-CQe7nR_v.js.map +1 -0
  39. package/dist/_chunks/{chat-message-fg221-yx.js → chat-message-D53_fH2w.js} +2 -2
  40. package/dist/_chunks/{chat-message-fg221-yx.js.map → chat-message-D53_fH2w.js.map} +1 -1
  41. package/dist/_chunks/{checkbox-Dgp_cfUr.js → checkbox-DRcOdmXv.js} +3 -3
  42. package/dist/_chunks/{checkbox-Dgp_cfUr.js.map → checkbox-DRcOdmXv.js.map} +1 -1
  43. package/dist/_chunks/{checkbox-group-eVowqKcT.js → checkbox-group-CpUwlHug.js} +3 -3
  44. package/dist/_chunks/{checkbox-group-eVowqKcT.js.map → checkbox-group-CpUwlHug.js.map} +1 -1
  45. package/dist/_chunks/{collapsible-hHiyZp0b.js → collapsible-CERONory.js} +2 -2
  46. package/dist/_chunks/{collapsible-hHiyZp0b.js.map → collapsible-CERONory.js.map} +1 -1
  47. package/dist/_chunks/{color-picker-Bm-gzpsh.js → color-picker-9tL7pz5y.js} +192 -181
  48. package/dist/_chunks/color-picker-9tL7pz5y.js.map +1 -0
  49. package/dist/_chunks/{combobox-Da9eq00i.js → combobox-BC-DFx8G.js} +31 -30
  50. package/dist/_chunks/combobox-BC-DFx8G.js.map +1 -0
  51. package/dist/_chunks/{command-palette-11BieSNq.js → command-palette-BiPAAno-.js} +125 -123
  52. package/dist/_chunks/command-palette-BiPAAno-.js.map +1 -0
  53. package/dist/_chunks/{copy-field-BAF4mt9h.js → copy-field-CCq7j6Zc.js} +2 -2
  54. package/dist/_chunks/{copy-field-BAF4mt9h.js.map → copy-field-CCq7j6Zc.js.map} +1 -1
  55. package/dist/_chunks/{date-picker-D0Ry1dMz.js → date-picker-B94HAV4A.js} +4 -4
  56. package/dist/_chunks/{date-picker-D0Ry1dMz.js.map → date-picker-B94HAV4A.js.map} +1 -1
  57. package/dist/_chunks/{date-range-picker-DYgHzMOo.js → date-range-picker-D4dgDlLU.js} +73 -73
  58. package/dist/_chunks/date-range-picker-D4dgDlLU.js.map +1 -0
  59. package/dist/_chunks/{date-time-picker-CGmGtcyc.js → date-time-picker-D1GEzf8p.js} +5 -5
  60. package/dist/_chunks/{date-time-picker-CGmGtcyc.js.map → date-time-picker-D1GEzf8p.js.map} +1 -1
  61. package/dist/_chunks/de-Dfbeau59.js +477 -0
  62. package/dist/_chunks/de-Dfbeau59.js.map +1 -0
  63. package/dist/_chunks/{description-list-CWjnaDGn.js → description-list-BEbK2g93.js} +2 -2
  64. package/dist/_chunks/{description-list-CWjnaDGn.js.map → description-list-BEbK2g93.js.map} +1 -1
  65. package/dist/_chunks/{dialog-C-lTGVkB.js → dialog-Cee13rHU.js} +3 -3
  66. package/dist/_chunks/{dialog-C-lTGVkB.js.map → dialog-Cee13rHU.js.map} +1 -1
  67. package/dist/_chunks/{dropdown-menu-DZxwF23X.js → dropdown-menu-BC5ZdOMo.js} +3 -3
  68. package/dist/_chunks/{dropdown-menu-DZxwF23X.js.map → dropdown-menu-BC5ZdOMo.js.map} +1 -1
  69. package/dist/_chunks/{editable-currency-cell-renderer-Od3Q-Y8J.js → editable-currency-cell-renderer-BpicmolK.js} +314 -317
  70. package/dist/_chunks/editable-currency-cell-renderer-BpicmolK.js.map +1 -0
  71. package/dist/_chunks/el-Dro3J7CP.js +373 -0
  72. package/dist/_chunks/el-Dro3J7CP.js.map +1 -0
  73. package/dist/_chunks/{email-input-DvJ_kPKL.js → email-input-lQivsFrw.js} +3 -3
  74. package/dist/_chunks/{email-input-DvJ_kPKL.js.map → email-input-lQivsFrw.js.map} +1 -1
  75. package/dist/_chunks/es-Dvg8u70B.js +373 -0
  76. package/dist/_chunks/es-Dvg8u70B.js.map +1 -0
  77. package/dist/_chunks/{file-upload-DxAQprcU.js → file-upload-CdozCPct.js} +226 -233
  78. package/dist/_chunks/file-upload-CdozCPct.js.map +1 -0
  79. package/dist/_chunks/fr-VOGjBSPP.js +338 -0
  80. package/dist/_chunks/fr-VOGjBSPP.js.map +1 -0
  81. package/dist/_chunks/{freemium-paywall-B9c8Ylww.js → freemium-paywall-D1N02Oam.js} +4 -4
  82. package/dist/_chunks/{freemium-paywall-B9c8Ylww.js.map → freemium-paywall-D1N02Oam.js.map} +1 -1
  83. package/dist/_chunks/{header-DDj7uGD-.js → header-CTZWX-tm.js} +2 -2
  84. package/dist/_chunks/{header-DDj7uGD-.js.map → header-CTZWX-tm.js.map} +1 -1
  85. package/dist/_chunks/hi-BSDxWU_y.js +433 -0
  86. package/dist/_chunks/hi-BSDxWU_y.js.map +1 -0
  87. package/dist/_chunks/{icon-button-DPEqBKBQ.js → icon-button-CKEOrN37.js} +2 -2
  88. package/dist/_chunks/{icon-button-DPEqBKBQ.js.map → icon-button-CKEOrN37.js.map} +1 -1
  89. package/dist/_chunks/{icon-button-group-DeV3FpNY.js → icon-button-group-C48khLE0.js} +23 -22
  90. package/dist/_chunks/icon-button-group-C48khLE0.js.map +1 -0
  91. package/dist/_chunks/{isSameDay-DHG8Xade.js → isSameDay-DUEiAT0G.js} +2 -2
  92. package/dist/_chunks/{isSameDay-DHG8Xade.js.map → isSameDay-DUEiAT0G.js.map} +1 -1
  93. package/dist/_chunks/isSameWeek-Dfzu29cW.js +14 -0
  94. package/dist/_chunks/isSameWeek-Dfzu29cW.js.map +1 -0
  95. package/dist/_chunks/it-CuonvcI_.js +401 -0
  96. package/dist/_chunks/it-CuonvcI_.js.map +1 -0
  97. package/dist/_chunks/ja-DO57gIOT.js +366 -0
  98. package/dist/_chunks/ja-DO57gIOT.js.map +1 -0
  99. package/dist/_chunks/{key-value-pair-BvDY3zuc.js → key-value-pair-C8DaR3Xs.js} +2 -2
  100. package/dist/_chunks/{key-value-pair-BvDY3zuc.js.map → key-value-pair-C8DaR3Xs.js.map} +1 -1
  101. package/dist/_chunks/{list-BdvDctBz.js → list-BOwqwy03.js} +44 -43
  102. package/dist/_chunks/list-BOwqwy03.js.map +1 -0
  103. package/dist/_chunks/{locale-picker-CY89MChR.js → locale-picker-D99UyZVJ.js} +4 -4
  104. package/dist/_chunks/{locale-picker-CY89MChR.js.map → locale-picker-D99UyZVJ.js.map} +1 -1
  105. package/dist/_chunks/{map-view-DyB8tr6c.js → map-view-WEWqXzof.js} +569 -557
  106. package/dist/_chunks/{map-view-DyB8tr6c.js.map → map-view-WEWqXzof.js.map} +1 -1
  107. package/dist/_chunks/{message-card-D6iyPacd.js → message-card-BbRhZkDI.js} +3 -3
  108. package/dist/_chunks/{message-card-D6iyPacd.js.map → message-card-BbRhZkDI.js.map} +1 -1
  109. package/dist/_chunks/{message-tray-Bh-0ra-Y.js → message-tray-B762TKuv.js} +11 -10
  110. package/dist/_chunks/message-tray-B762TKuv.js.map +1 -0
  111. package/dist/_chunks/{multi-select-dSe6Xtc4.js → multi-select-DOLO3K_z.js} +26 -25
  112. package/dist/_chunks/multi-select-DOLO3K_z.js.map +1 -0
  113. package/dist/_chunks/{navigation-menu-CyS1fBJ7.js → navigation-menu-C6lBYVv9.js} +3 -3
  114. package/dist/_chunks/{navigation-menu-CyS1fBJ7.js.map → navigation-menu-C6lBYVv9.js.map} +1 -1
  115. package/dist/_chunks/nl-DjPaaWaW.js +326 -0
  116. package/dist/_chunks/nl-DjPaaWaW.js.map +1 -0
  117. package/dist/_chunks/{notification-card-vaMaA7Wa.js → notification-card-DMdO4g54.js} +2 -2
  118. package/dist/_chunks/{notification-card-vaMaA7Wa.js.map → notification-card-DMdO4g54.js.map} +1 -1
  119. package/dist/_chunks/{notification-tray-Cnum6LwM.js → notification-tray-Dl3FTleW.js} +17 -16
  120. package/dist/_chunks/notification-tray-Dl3FTleW.js.map +1 -0
  121. package/dist/_chunks/{number-input-BZXu6bPY.js → number-input-Dj5L3pXK.js} +2 -2
  122. package/dist/_chunks/{number-input-BZXu6bPY.js.map → number-input-Dj5L3pXK.js.map} +1 -1
  123. package/dist/_chunks/{otp-input-BDF_iNpa.js → otp-input-BEg_sn8A.js} +2 -2
  124. package/dist/_chunks/{otp-input-BDF_iNpa.js.map → otp-input-BEg_sn8A.js.map} +1 -1
  125. package/dist/_chunks/{pagination-BWaXF7W0.js → pagination-DQOgnxxw.js} +2 -2
  126. package/dist/_chunks/{pagination-BWaXF7W0.js.map → pagination-DQOgnxxw.js.map} +1 -1
  127. package/dist/_chunks/{parseISO-Dk4xa7q6.js → parseISO-DEpUNwxZ.js} +2 -2
  128. package/dist/_chunks/{parseISO-Dk4xa7q6.js.map → parseISO-DEpUNwxZ.js.map} +1 -1
  129. package/dist/_chunks/{patient-search-ZpHN-pgJ.js → patient-search-hFiYbqcl.js} +8 -8
  130. package/dist/_chunks/{patient-search-ZpHN-pgJ.js.map → patient-search-hFiYbqcl.js.map} +1 -1
  131. package/dist/_chunks/{patient-shell-CYaNkbA1.js → patient-shell-CDvMw_Nk.js} +6 -6
  132. package/dist/_chunks/{patient-shell-CYaNkbA1.js.map → patient-shell-CDvMw_Nk.js.map} +1 -1
  133. package/dist/_chunks/{payment-form-Ds3rxvad.js → payment-form-D5rgnZu7.js} +2 -2
  134. package/dist/_chunks/{payment-form-Ds3rxvad.js.map → payment-form-D5rgnZu7.js.map} +1 -1
  135. package/dist/_chunks/{pdf-viewer-CIuaocnq.js → pdf-viewer-DvtEHcEP.js} +347 -320
  136. package/dist/_chunks/{pdf-viewer-CIuaocnq.js.map → pdf-viewer-DvtEHcEP.js.map} +1 -1
  137. package/dist/_chunks/{phone-input-DKSHX7NQ.js → phone-input-DfZbPPvh.js} +217 -201
  138. package/dist/_chunks/phone-input-DfZbPPvh.js.map +1 -0
  139. package/dist/_chunks/pl-Cl4lOx2N.js +514 -0
  140. package/dist/_chunks/pl-Cl4lOx2N.js.map +1 -0
  141. package/dist/_chunks/{popover-BfHSBEKq.js → popover-Devce-tT.js} +3 -3
  142. package/dist/_chunks/{popover-BfHSBEKq.js.map → popover-Devce-tT.js.map} +1 -1
  143. package/dist/_chunks/practice-results-JQunxBIg.js +1618 -0
  144. package/dist/_chunks/practice-results-JQunxBIg.js.map +1 -0
  145. package/dist/_chunks/{privacy-lock-C6Ra5m3p.js → privacy-lock-DD-wHxBg.js} +3 -3
  146. package/dist/_chunks/{privacy-lock-C6Ra5m3p.js.map → privacy-lock-DD-wHxBg.js.map} +1 -1
  147. package/dist/_chunks/{progress-B-PSO5OS.js → progress-kzIRcdaq.js} +11 -10
  148. package/dist/_chunks/progress-kzIRcdaq.js.map +1 -0
  149. package/dist/_chunks/pt-D7qO5CzD.js +370 -0
  150. package/dist/_chunks/pt-D7qO5CzD.js.map +1 -0
  151. package/dist/_chunks/{public-footer.agent-Bc99tE5Z.js → public-footer.agent-Bh0rnx4i.js} +21 -14
  152. package/dist/_chunks/public-footer.agent-Bh0rnx4i.js.map +1 -0
  153. package/dist/_chunks/{public-header.agent-B-B0WDAi.js → public-header.agent-B2dDg2_d.js} +3 -3
  154. package/dist/_chunks/{public-header.agent-B-B0WDAi.js.map → public-header.agent-B2dDg2_d.js.map} +1 -1
  155. package/dist/_chunks/{radio-i4ogu3cq.js → radio-TWf9Q-mp.js} +2 -2
  156. package/dist/_chunks/{radio-i4ogu3cq.js.map → radio-TWf9Q-mp.js.map} +1 -1
  157. package/dist/_chunks/{radio-group-CTlGc36r.js → radio-group-BcF92GEF.js} +4 -4
  158. package/dist/_chunks/{radio-group-CTlGc36r.js.map → radio-group-BcF92GEF.js.map} +1 -1
  159. package/dist/_chunks/{react-day-picker-D3yzgvDB.js → react-day-picker-DsjfS7uI.js} +662 -615
  160. package/dist/_chunks/{react-day-picker-D3yzgvDB.js.map → react-day-picker-DsjfS7uI.js.map} +1 -1
  161. package/dist/_chunks/recaptcha-widget-CFYyLSEX.js +221 -0
  162. package/dist/_chunks/recaptcha-widget-CFYyLSEX.js.map +1 -0
  163. package/dist/_chunks/registry-nPAVE19X.js +21 -0
  164. package/dist/_chunks/registry-nPAVE19X.js.map +1 -0
  165. package/dist/_chunks/{resizable-COV-cnth.js → resizable-3vzqDlg6.js} +29 -28
  166. package/dist/_chunks/resizable-3vzqDlg6.js.map +1 -0
  167. package/dist/_chunks/{reviews-panel-bKEUKSic.js → reviews-panel-yanuBZs-.js} +4 -4
  168. package/dist/_chunks/{reviews-panel-bKEUKSic.js.map → reviews-panel-yanuBZs-.js.map} +1 -1
  169. package/dist/_chunks/{rich-text-editor-J-wAz9eN.js → rich-text-editor-CHmr9Bz8.js} +2 -2
  170. package/dist/_chunks/{rich-text-editor-J-wAz9eN.js.map → rich-text-editor-CHmr9Bz8.js.map} +1 -1
  171. package/dist/_chunks/ro-CP2-VJ_O.js +361 -0
  172. package/dist/_chunks/ro-CP2-VJ_O.js.map +1 -0
  173. package/dist/_chunks/ru-RPn9_Lpq.js +561 -0
  174. package/dist/_chunks/ru-RPn9_Lpq.js.map +1 -0
  175. package/dist/_chunks/{scroll-area-DEDU-lp-.js → scroll-area-BWqCkEGz.js} +2 -2
  176. package/dist/_chunks/{scroll-area-DEDU-lp-.js.map → scroll-area-BWqCkEGz.js.map} +1 -1
  177. package/dist/_chunks/{search-bar-BRMW1-WG.js → search-bar-CP6wUJFY.js} +3 -3
  178. package/dist/_chunks/{search-bar-BRMW1-WG.js.map → search-bar-CP6wUJFY.js.map} +1 -1
  179. package/dist/_chunks/{search-input-CIA6pPfn.js → search-input-C1C3jQpD.js} +24 -23
  180. package/dist/_chunks/search-input-C1C3jQpD.js.map +1 -0
  181. package/dist/_chunks/{select-C92AT_OZ.js → select-hsCaJSX3.js} +3 -3
  182. package/dist/_chunks/{select-C92AT_OZ.js.map → select-hsCaJSX3.js.map} +1 -1
  183. package/dist/_chunks/{sheet-D8Yl0nKR.js → sheet-BV-yuLE2.js} +3 -3
  184. package/dist/_chunks/{sheet-D8Yl0nKR.js.map → sheet-BV-yuLE2.js.map} +1 -1
  185. package/dist/_chunks/{sidebar-DkyC6GvS.js → sidebar-BbR8f6oe.js} +3 -3
  186. package/dist/_chunks/{sidebar-DkyC6GvS.js.map → sidebar-BbR8f6oe.js.map} +1 -1
  187. package/dist/_chunks/{signature-capture-DjMlFOzS.js → signature-capture-C-fF71xI.js} +213 -205
  188. package/dist/_chunks/signature-capture-C-fF71xI.js.map +1 -0
  189. package/dist/_chunks/{slider-CfEzeseL.js → slider-BHWzXdjt.js} +3 -3
  190. package/dist/_chunks/{slider-CfEzeseL.js.map → slider-BHWzXdjt.js.map} +1 -1
  191. package/dist/_chunks/{slot-grid-Q94gVmhn.js → slot-grid-Dz13dH82.js} +4 -4
  192. package/dist/_chunks/{slot-grid-Q94gVmhn.js.map → slot-grid-Dz13dH82.js.map} +1 -1
  193. package/dist/_chunks/{sparkline-B5Ms55PZ.js → sparkline-DEROcSl0.js} +2 -2
  194. package/dist/_chunks/{sparkline-B5Ms55PZ.js.map → sparkline-DEROcSl0.js.map} +1 -1
  195. package/dist/_chunks/sq-AQvefouo.js +355 -0
  196. package/dist/_chunks/sq-AQvefouo.js.map +1 -0
  197. package/dist/_chunks/{stepper-progress-jFY8BSf7.js → stepper-progress-DDjq5nei.js} +16 -15
  198. package/dist/_chunks/stepper-progress-DDjq5nei.js.map +1 -0
  199. package/dist/_chunks/streaming-text-GH07yIYh.js +127 -0
  200. package/dist/_chunks/streaming-text-GH07yIYh.js.map +1 -0
  201. package/dist/_chunks/sv-zkx9eBtD.js +376 -0
  202. package/dist/_chunks/sv-zkx9eBtD.js.map +1 -0
  203. package/dist/_chunks/{switch-D916VW86.js → switch-BJ6HD3Mn.js} +2 -2
  204. package/dist/_chunks/{switch-D916VW86.js.map → switch-BJ6HD3Mn.js.map} +1 -1
  205. package/dist/_chunks/{tabs-aEQfQV3x.js → tabs-BpPYVme_.js} +4 -4
  206. package/dist/_chunks/{tabs-aEQfQV3x.js.map → tabs-BpPYVme_.js.map} +1 -1
  207. package/dist/_chunks/{tag-bBPAvXyh.js → tag-CyoaEmf_.js} +2 -2
  208. package/dist/_chunks/{tag-bBPAvXyh.js.map → tag-CyoaEmf_.js.map} +1 -1
  209. package/dist/_chunks/{task-tray-6NlryfMJ.js → task-tray-DRK0b0Qb.js} +3 -3
  210. package/dist/_chunks/{task-tray-6NlryfMJ.js.map → task-tray-DRK0b0Qb.js.map} +1 -1
  211. package/dist/_chunks/{text-area-D5GAe8pV.js → text-area-BIx0tZ05.js} +27 -26
  212. package/dist/_chunks/text-area-BIx0tZ05.js.map +1 -0
  213. package/dist/_chunks/{text-input-CakysYnD.js → text-input-BaClJL8Y.js} +2 -2
  214. package/dist/_chunks/{text-input-CakysYnD.js.map → text-input-BaClJL8Y.js.map} +1 -1
  215. package/dist/_chunks/{theme-toggle-JoeMs_ws.js → theme-toggle-DpC28kt5.js} +6 -6
  216. package/dist/_chunks/{theme-toggle-JoeMs_ws.js.map → theme-toggle-DpC28kt5.js.map} +1 -1
  217. package/dist/_chunks/{time-picker-DeVZkIY2.js → time-picker-B5umYwfv.js} +2 -2
  218. package/dist/_chunks/{time-picker-DeVZkIY2.js.map → time-picker-B5umYwfv.js.map} +1 -1
  219. package/dist/_chunks/{timeline-CR7HjZCK.js → timeline-D0Wo7v_o.js} +3 -3
  220. package/dist/_chunks/{timeline-CR7HjZCK.js.map → timeline-D0Wo7v_o.js.map} +1 -1
  221. package/dist/_chunks/{toast.agent-DVpKt38p.js → toast.agent-WHHfw5VX.js} +322 -320
  222. package/dist/_chunks/{toast.agent-DVpKt38p.js.map → toast.agent-WHHfw5VX.js.map} +1 -1
  223. package/dist/_chunks/{tooltip-ClJd0ciy.js → tooltip-DvmfrNvB.js} +29 -20
  224. package/dist/_chunks/tooltip-DvmfrNvB.js.map +1 -0
  225. package/dist/_chunks/{tooth-scheme-3mITSXiZ.js → tooth-scheme-CxlsLjfN.js} +2 -2
  226. package/dist/_chunks/{tooth-scheme-3mITSXiZ.js.map → tooth-scheme-CxlsLjfN.js.map} +1 -1
  227. package/dist/_chunks/tr-Dmr412Ac.js +378 -0
  228. package/dist/_chunks/tr-Dmr412Ac.js.map +1 -0
  229. package/dist/_chunks/{transcript-panel-QUQ9XJmf.js → transcript-panel-DyhTpAP7.js} +21 -20
  230. package/dist/_chunks/transcript-panel-DyhTpAP7.js.map +1 -0
  231. package/dist/_chunks/{use-direction-D6rvvG9G.js → use-direction-Dp8h70PP.js} +7 -6
  232. package/dist/_chunks/use-direction-Dp8h70PP.js.map +1 -0
  233. package/dist/_chunks/use-isomorphic-layout-effect-BGfaCOP1.js +6 -0
  234. package/dist/_chunks/use-isomorphic-layout-effect-BGfaCOP1.js.map +1 -0
  235. package/dist/_chunks/use-media-query-CcAx5SMM.js +16 -0
  236. package/dist/_chunks/use-media-query-CcAx5SMM.js.map +1 -0
  237. package/dist/_chunks/{use-password-requirements-E0sSfx5X.js → use-password-requirements-DsgduV1x.js} +3 -3
  238. package/dist/_chunks/{use-password-requirements-E0sSfx5X.js.map → use-password-requirements-DsgduV1x.js.map} +1 -1
  239. package/dist/_chunks/use-scroll-to-first-error-4Za-u5Nw.js +43 -0
  240. package/dist/_chunks/use-scroll-to-first-error-4Za-u5Nw.js.map +1 -0
  241. package/dist/_chunks/{workflow-map-DlWBJJBt.js → workflow-map-BSvQS3be.js} +6 -6
  242. package/dist/_chunks/{workflow-map-DlWBJJBt.js.map → workflow-map-BSvQS3be.js.map} +1 -1
  243. package/dist/_chunks/zh-CN-DxVt64Zk.js +388 -0
  244. package/dist/_chunks/zh-CN-DxVt64Zk.js.map +1 -0
  245. package/dist/agent/registry.d.ts +1 -6
  246. package/dist/agent/registry.d.ts.map +1 -1
  247. package/dist/agent-catalog.json +1 -1
  248. package/dist/components/_shared/date-locale.d.ts +7 -2
  249. package/dist/components/_shared/date-locale.d.ts.map +1 -1
  250. package/dist/components/_shared/index.d.ts +1 -1
  251. package/dist/components/_shared/index.d.ts.map +1 -1
  252. package/dist/components/accordion/index.js +1 -1
  253. package/dist/components/agenda-card/index.js +1 -1
  254. package/dist/components/agenda-tray/index.js +1 -1
  255. package/dist/components/ai-prompt-input/ai-prompt-input.d.ts.map +1 -1
  256. package/dist/components/ai-prompt-input/index.js +1 -1
  257. package/dist/components/audio-recorder/audio-recorder.d.ts.map +1 -1
  258. package/dist/components/audio-recorder/index.js +1 -1
  259. package/dist/components/audio-visualiser/audio-visualiser.d.ts.map +1 -1
  260. package/dist/components/audio-visualiser/index.js +1 -1
  261. package/dist/components/autocomplete/index.js +1 -1
  262. package/dist/components/avatar/avatar.d.ts.map +1 -1
  263. package/dist/components/avatar/index.js +1 -1
  264. package/dist/components/badge/index.js +1 -1
  265. package/dist/components/booking/index.js +1 -1
  266. package/dist/components/breadcrumb/index.js +1 -1
  267. package/dist/components/button/index.js +1 -1
  268. package/dist/components/button-group/button-group.d.ts.map +1 -1
  269. package/dist/components/button-group/index.js +1 -1
  270. package/dist/components/calendar/calendar.d.ts.map +1 -1
  271. package/dist/components/calendar/index.js +1 -1
  272. package/dist/components/carousel/index.js +1 -1
  273. package/dist/components/chart/index.js +1 -1
  274. package/dist/components/chat-container/chat-container.d.ts.map +1 -1
  275. package/dist/components/chat-container/index.js +1 -1
  276. package/dist/components/chat-input/chat-input.d.ts.map +1 -1
  277. package/dist/components/chat-input/index.js +1 -1
  278. package/dist/components/chat-message/index.js +1 -1
  279. package/dist/components/checkbox/index.js +1 -1
  280. package/dist/components/checkbox-group/index.js +1 -1
  281. package/dist/components/collapsible/index.js +1 -1
  282. package/dist/components/color-picker/color-picker.d.ts.map +1 -1
  283. package/dist/components/color-picker/index.js +1 -1
  284. package/dist/components/combobox/combobox.d.ts.map +1 -1
  285. package/dist/components/combobox/index.js +1 -1
  286. package/dist/components/command-palette/command-palette.d.ts.map +1 -1
  287. package/dist/components/command-palette/index.js +1 -1
  288. package/dist/components/copy-field/index.js +1 -1
  289. package/dist/components/data-table/cell-renderers/color-dot-cell-renderer.d.ts.map +1 -1
  290. package/dist/components/data-table/data-table.d.ts.map +1 -1
  291. package/dist/components/data-table/index.js +1 -1
  292. package/dist/components/date-picker/index.js +1 -1
  293. package/dist/components/date-range-picker/date-range-picker.d.ts.map +1 -1
  294. package/dist/components/date-range-picker/index.js +1 -1
  295. package/dist/components/date-time-picker/index.js +1 -1
  296. package/dist/components/description-list/index.js +1 -1
  297. package/dist/components/dialog/index.js +1 -1
  298. package/dist/components/dropdown-menu/index.js +1 -1
  299. package/dist/components/email-input/index.js +1 -1
  300. package/dist/components/file-upload/file-upload.d.ts.map +1 -1
  301. package/dist/components/file-upload/index.js +1 -1
  302. package/dist/components/freemium-paywall/index.js +1 -1
  303. package/dist/components/header/index.js +1 -1
  304. package/dist/components/header-settings/index.js +6 -6
  305. package/dist/components/icon-button/index.js +1 -1
  306. package/dist/components/icon-button-group/icon-button-group.d.ts.map +1 -1
  307. package/dist/components/icon-button-group/index.js +1 -1
  308. package/dist/components/key-value-pair/index.js +1 -1
  309. package/dist/components/list/index.js +1 -1
  310. package/dist/components/list/list.d.ts.map +1 -1
  311. package/dist/components/locale-picker/index.js +1 -1
  312. package/dist/components/map-view/index.js +1 -1
  313. package/dist/components/map-view/map-view.d.ts +10 -0
  314. package/dist/components/map-view/map-view.d.ts.map +1 -1
  315. package/dist/components/message-card/index.js +1 -1
  316. package/dist/components/message-tray/index.js +1 -1
  317. package/dist/components/message-tray/message-tray.d.ts.map +1 -1
  318. package/dist/components/multi-select/index.js +1 -1
  319. package/dist/components/multi-select/multi-select.d.ts.map +1 -1
  320. package/dist/components/navigation-menu/index.js +1 -1
  321. package/dist/components/notification-card/index.js +1 -1
  322. package/dist/components/notification-tray/index.js +1 -1
  323. package/dist/components/notification-tray/notification-tray.d.ts.map +1 -1
  324. package/dist/components/number-input/index.js +1 -1
  325. package/dist/components/otp-input/index.js +1 -1
  326. package/dist/components/pagination/index.js +1 -1
  327. package/dist/components/password-input/index.js +1 -1
  328. package/dist/components/patient-search/index.js +1 -1
  329. package/dist/components/payment-form/index.js +1 -1
  330. package/dist/components/pdf-viewer/index.js +1 -1
  331. package/dist/components/pdf-viewer/pdf-viewer.d.ts.map +1 -1
  332. package/dist/components/phone-input/index.js +1 -1
  333. package/dist/components/phone-input/phone-input.d.ts.map +1 -1
  334. package/dist/components/popover/index.js +1 -1
  335. package/dist/components/practice-results/index.js +1 -1
  336. package/dist/components/practice-results/practice-results.d.ts +23 -1
  337. package/dist/components/practice-results/practice-results.d.ts.map +1 -1
  338. package/dist/components/privacy-lock/index.js +1 -1
  339. package/dist/components/progress/index.js +1 -1
  340. package/dist/components/progress/progress.d.ts.map +1 -1
  341. package/dist/components/public-footer/index.js +1 -1
  342. package/dist/components/public-footer/public-footer.d.ts.map +1 -1
  343. package/dist/components/public-header/index.js +1 -1
  344. package/dist/components/radio/index.js +1 -1
  345. package/dist/components/radio-group/index.js +2 -2
  346. package/dist/components/recaptcha-widget/index.js +1 -1
  347. package/dist/components/recaptcha-widget/recaptcha-widget.d.ts.map +1 -1
  348. package/dist/components/resizable/index.js +1 -1
  349. package/dist/components/resizable/resizable.d.ts.map +1 -1
  350. package/dist/components/reviews-panel/index.js +1 -1
  351. package/dist/components/rich-text-editor/index.js +1 -1
  352. package/dist/components/scroll-area/index.js +1 -1
  353. package/dist/components/search-bar/index.js +1 -1
  354. package/dist/components/search-input/index.js +1 -1
  355. package/dist/components/select/index.js +1 -1
  356. package/dist/components/sheet/index.js +1 -1
  357. package/dist/components/sidebar/index.js +1 -1
  358. package/dist/components/signature-capture/index.js +1 -1
  359. package/dist/components/signature-capture/signature-capture.d.ts.map +1 -1
  360. package/dist/components/slider/index.js +1 -1
  361. package/dist/components/slot-grid/index.js +1 -1
  362. package/dist/components/sparkline/index.js +1 -1
  363. package/dist/components/stepper-progress/index.js +1 -1
  364. package/dist/components/stepper-progress/stepper-progress.d.ts.map +1 -1
  365. package/dist/components/streaming-text/index.js +1 -1
  366. package/dist/components/streaming-text/streaming-text.d.ts.map +1 -1
  367. package/dist/components/switch/index.js +1 -1
  368. package/dist/components/tabs/index.js +1 -1
  369. package/dist/components/tag/index.js +1 -1
  370. package/dist/components/task-tray/index.js +1 -1
  371. package/dist/components/text-area/index.js +1 -1
  372. package/dist/components/text-area/text-area.d.ts.map +1 -1
  373. package/dist/components/text-input/index.js +1 -1
  374. package/dist/components/theme-toggle/index.js +1 -1
  375. package/dist/components/time-picker/index.js +1 -1
  376. package/dist/components/timeline/index.js +1 -1
  377. package/dist/components/toast/index.js +1 -1
  378. package/dist/components/toast/toast.d.ts.map +1 -1
  379. package/dist/components/tooltip/index.js +1 -1
  380. package/dist/components/tooltip/tooltip.d.ts.map +1 -1
  381. package/dist/components/tooth-scheme/index.js +1 -1
  382. package/dist/components/transcript-panel/index.js +1 -1
  383. package/dist/components/transcript-panel/transcript-panel.d.ts.map +1 -1
  384. package/dist/components/workflow/index.js +1 -1
  385. package/dist/hooks/index.js +69 -66
  386. package/dist/hooks/index.js.map +1 -1
  387. package/dist/hooks/use-debounced-value.d.ts.map +1 -1
  388. package/dist/hooks/use-direction.d.ts.map +1 -1
  389. package/dist/hooks/use-focus-trap.d.ts.map +1 -1
  390. package/dist/hooks/use-scroll-to-first-error.d.ts.map +1 -1
  391. package/dist/i18n/locales/ar.d.ts +92 -0
  392. package/dist/i18n/locales/ar.d.ts.map +1 -1
  393. package/dist/i18n/locales/ar.js +82 -0
  394. package/dist/i18n/locales/ar.js.map +1 -1
  395. package/dist/i18n/locales/de.d.ts +92 -0
  396. package/dist/i18n/locales/de.d.ts.map +1 -1
  397. package/dist/i18n/locales/de.js +81 -0
  398. package/dist/i18n/locales/de.js.map +1 -1
  399. package/dist/i18n/locales/el.d.ts +92 -0
  400. package/dist/i18n/locales/el.d.ts.map +1 -1
  401. package/dist/i18n/locales/el.js +82 -0
  402. package/dist/i18n/locales/el.js.map +1 -1
  403. package/dist/i18n/locales/en.d.ts +27 -0
  404. package/dist/i18n/locales/en.d.ts.map +1 -1
  405. package/dist/i18n/locales/en.js +27 -0
  406. package/dist/i18n/locales/en.js.map +1 -1
  407. package/dist/i18n/locales/es.d.ts +92 -0
  408. package/dist/i18n/locales/es.d.ts.map +1 -1
  409. package/dist/i18n/locales/es.js +81 -0
  410. package/dist/i18n/locales/es.js.map +1 -1
  411. package/dist/i18n/locales/fr.d.ts +92 -0
  412. package/dist/i18n/locales/fr.d.ts.map +1 -1
  413. package/dist/i18n/locales/fr.js +81 -0
  414. package/dist/i18n/locales/fr.js.map +1 -1
  415. package/dist/i18n/locales/hi.d.ts +92 -0
  416. package/dist/i18n/locales/hi.d.ts.map +1 -1
  417. package/dist/i18n/locales/hi.js +82 -0
  418. package/dist/i18n/locales/hi.js.map +1 -1
  419. package/dist/i18n/locales/it.d.ts +92 -0
  420. package/dist/i18n/locales/it.d.ts.map +1 -1
  421. package/dist/i18n/locales/it.js +81 -0
  422. package/dist/i18n/locales/it.js.map +1 -1
  423. package/dist/i18n/locales/ja.d.ts +92 -0
  424. package/dist/i18n/locales/ja.d.ts.map +1 -1
  425. package/dist/i18n/locales/ja.js +82 -0
  426. package/dist/i18n/locales/ja.js.map +1 -1
  427. package/dist/i18n/locales/nl.d.ts +92 -0
  428. package/dist/i18n/locales/nl.d.ts.map +1 -1
  429. package/dist/i18n/locales/nl.js +81 -0
  430. package/dist/i18n/locales/nl.js.map +1 -1
  431. package/dist/i18n/locales/pl.d.ts +92 -0
  432. package/dist/i18n/locales/pl.d.ts.map +1 -1
  433. package/dist/i18n/locales/pl.js +82 -0
  434. package/dist/i18n/locales/pl.js.map +1 -1
  435. package/dist/i18n/locales/pt.d.ts +92 -0
  436. package/dist/i18n/locales/pt.d.ts.map +1 -1
  437. package/dist/i18n/locales/pt.js +83 -0
  438. package/dist/i18n/locales/pt.js.map +1 -1
  439. package/dist/i18n/locales/ro.d.ts +92 -0
  440. package/dist/i18n/locales/ro.d.ts.map +1 -1
  441. package/dist/i18n/locales/ro.js +82 -0
  442. package/dist/i18n/locales/ro.js.map +1 -1
  443. package/dist/i18n/locales/ru.d.ts +92 -0
  444. package/dist/i18n/locales/ru.d.ts.map +1 -1
  445. package/dist/i18n/locales/ru.js +82 -0
  446. package/dist/i18n/locales/ru.js.map +1 -1
  447. package/dist/i18n/locales/sq.d.ts +92 -0
  448. package/dist/i18n/locales/sq.d.ts.map +1 -1
  449. package/dist/i18n/locales/sq.js +82 -0
  450. package/dist/i18n/locales/sq.js.map +1 -1
  451. package/dist/i18n/locales/sv.d.ts +92 -0
  452. package/dist/i18n/locales/sv.d.ts.map +1 -1
  453. package/dist/i18n/locales/sv.js +82 -0
  454. package/dist/i18n/locales/sv.js.map +1 -1
  455. package/dist/i18n/locales/tr.d.ts +92 -0
  456. package/dist/i18n/locales/tr.d.ts.map +1 -1
  457. package/dist/i18n/locales/tr.js +82 -0
  458. package/dist/i18n/locales/tr.js.map +1 -1
  459. package/dist/i18n/locales/zh.d.ts +92 -0
  460. package/dist/i18n/locales/zh.d.ts.map +1 -1
  461. package/dist/i18n/locales/zh.js +82 -0
  462. package/dist/i18n/locales/zh.js.map +1 -1
  463. package/dist/index.js +541 -540
  464. package/dist/index.js.map +1 -1
  465. package/dist/locales/ar.json +92 -0
  466. package/dist/locales/de.json +92 -0
  467. package/dist/locales/el.json +92 -0
  468. package/dist/locales/en.json +27 -0
  469. package/dist/locales/es.json +92 -0
  470. package/dist/locales/fr.json +92 -0
  471. package/dist/locales/hi.json +92 -0
  472. package/dist/locales/it.json +92 -0
  473. package/dist/locales/ja.json +92 -0
  474. package/dist/locales/nl.json +92 -0
  475. package/dist/locales/pl.json +92 -0
  476. package/dist/locales/pt.json +92 -0
  477. package/dist/locales/ro.json +92 -0
  478. package/dist/locales/ru.json +92 -0
  479. package/dist/locales/sq.json +92 -0
  480. package/dist/locales/sv.json +92 -0
  481. package/dist/locales/tr.json +92 -0
  482. package/dist/locales/zh.json +92 -0
  483. package/dist/patterns/alia-assistant/index.js +1 -1
  484. package/dist/patterns/patient-shell/index.js +1 -1
  485. package/dist/tokens.css +1 -1
  486. package/package.json +1 -2
  487. package/dist/_chunks/ai-prompt-input-BXlwNnWe.js.map +0 -1
  488. package/dist/_chunks/audio-recorder-DL800PE_.js.map +0 -1
  489. package/dist/_chunks/audio-visualiser-I-T4Z7EU.js +0 -145
  490. package/dist/_chunks/audio-visualiser-I-T4Z7EU.js.map +0 -1
  491. package/dist/_chunks/avatar-D_H4emLo.js.map +0 -1
  492. package/dist/_chunks/button-group-Bh2g_Ng-.js.map +0 -1
  493. package/dist/_chunks/chat-container-izziXViv.js.map +0 -1
  494. package/dist/_chunks/chat-input-cyl_y9bh.js.map +0 -1
  495. package/dist/_chunks/color-picker-Bm-gzpsh.js.map +0 -1
  496. package/dist/_chunks/combobox-Da9eq00i.js.map +0 -1
  497. package/dist/_chunks/command-palette-11BieSNq.js.map +0 -1
  498. package/dist/_chunks/date-range-picker-DYgHzMOo.js.map +0 -1
  499. package/dist/_chunks/editable-currency-cell-renderer-Od3Q-Y8J.js.map +0 -1
  500. package/dist/_chunks/file-upload-DxAQprcU.js.map +0 -1
  501. package/dist/_chunks/icon-button-group-DeV3FpNY.js.map +0 -1
  502. package/dist/_chunks/list-BdvDctBz.js.map +0 -1
  503. package/dist/_chunks/message-tray-Bh-0ra-Y.js.map +0 -1
  504. package/dist/_chunks/multi-select-dSe6Xtc4.js.map +0 -1
  505. package/dist/_chunks/notification-tray-Cnum6LwM.js.map +0 -1
  506. package/dist/_chunks/phone-input-DKSHX7NQ.js.map +0 -1
  507. package/dist/_chunks/practice-results-CEKjwsgS.js +0 -1441
  508. package/dist/_chunks/practice-results-CEKjwsgS.js.map +0 -1
  509. package/dist/_chunks/progress-B-PSO5OS.js.map +0 -1
  510. package/dist/_chunks/public-footer.agent-Bc99tE5Z.js.map +0 -1
  511. package/dist/_chunks/recaptcha-widget-BtBNb6tB.js +0 -192
  512. package/dist/_chunks/recaptcha-widget-BtBNb6tB.js.map +0 -1
  513. package/dist/_chunks/registry-C9nwlNyL.js +0 -21
  514. package/dist/_chunks/registry-C9nwlNyL.js.map +0 -1
  515. package/dist/_chunks/resizable-COV-cnth.js.map +0 -1
  516. package/dist/_chunks/search-input-CIA6pPfn.js.map +0 -1
  517. package/dist/_chunks/signature-capture-DjMlFOzS.js.map +0 -1
  518. package/dist/_chunks/stepper-progress-jFY8BSf7.js.map +0 -1
  519. package/dist/_chunks/streaming-text-BgjCTVOw.js +0 -105
  520. package/dist/_chunks/streaming-text-BgjCTVOw.js.map +0 -1
  521. package/dist/_chunks/text-area-D5GAe8pV.js.map +0 -1
  522. package/dist/_chunks/tooltip-ClJd0ciy.js.map +0 -1
  523. package/dist/_chunks/transcript-panel-QUQ9XJmf.js.map +0 -1
  524. package/dist/_chunks/use-direction-D6rvvG9G.js.map +0 -1
  525. package/dist/_chunks/use-scroll-to-first-error-BrK7dKB_.js +0 -55
  526. package/dist/_chunks/use-scroll-to-first-error-BrK7dKB_.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"practice-results-CEKjwsgS.js","sources":["../../node_modules/lucide-react/dist/esm/icons/languages.js","../../node_modules/lucide-react/dist/esm/icons/map.js","../../node_modules/lucide-react/dist/esm/icons/shield-check.js","../../src/components/practice-results/practice-results.agent.ts","../../src/components/practice-results/practice-results.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.8.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"m5 8 6 6\", key: \"1wu5hv\" }],\n [\"path\", { d: \"m4 14 6-6 2-3\", key: \"1k1g8d\" }],\n [\"path\", { d: \"M2 5h12\", key: \"or177f\" }],\n [\"path\", { d: \"M7 2h1\", key: \"1t2jsx\" }],\n [\"path\", { d: \"m22 22-5-10-5 10\", key: \"don7ne\" }],\n [\"path\", { d: \"M14 18h6\", key: \"1m8k6r\" }]\n];\nconst Languages = createLucideIcon(\"languages\", __iconNode);\n\nexport { __iconNode, Languages as default };\n//# sourceMappingURL=languages.js.map\n","/**\n * @license lucide-react v1.8.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M14.106 5.553a2 2 0 0 0 1.788 0l3.659-1.83A1 1 0 0 1 21 4.619v12.764a1 1 0 0 1-.553.894l-4.553 2.277a2 2 0 0 1-1.788 0l-4.212-2.106a2 2 0 0 0-1.788 0l-3.659 1.83A1 1 0 0 1 3 19.381V6.618a1 1 0 0 1 .553-.894l4.553-2.277a2 2 0 0 1 1.788 0z\",\n key: \"169xi5\"\n }\n ],\n [\"path\", { d: \"M15 5.764v15\", key: \"1pn4in\" }],\n [\"path\", { d: \"M9 3.236v15\", key: \"1uimfh\" }]\n];\nconst Map = createLucideIcon(\"map\", __iconNode);\n\nexport { __iconNode, Map as default };\n//# sourceMappingURL=map.js.map\n","/**\n * @license lucide-react v1.8.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\",\n key: \"oel41y\"\n }\n ],\n [\"path\", { d: \"m9 12 2 2 4-4\", key: \"dzmm74\" }]\n];\nconst ShieldCheck = createLucideIcon(\"shield-check\", __iconNode);\n\nexport { __iconNode, ShieldCheck as default };\n//# sourceMappingURL=shield-check.js.map\n","/* -------------------------------------------------------------------- */\n/* Agent adapter — PracticeResults (0.31.0). */\n/* */\n/* PracticeResults is the SERP primitive — a three-way A/B-testable */\n/* surface (`split-list-map`, `map-first`, `rich-cards`). The adapter */\n/* exposes the active variant + read-only actions for scrolling a card */\n/* into view and focusing a pin. Selection state and filter values are */\n/* consumer-owned via `value` / `onChange` — never read here (the */\n/* result list itself is generally non-sensitive, but follows the same */\n/* pattern as Booking / PatientSearch for consistency). */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { PracticeResultsHandle } from './practice-results';\n\nexport const practiceResultsAgent: AgentAdapter<PracticeResultsHandle> = {\n id: 'practice-results',\n capabilities: ['navigate', 'view_change'],\n state: {\n variant: {\n type: 'string',\n descriptionKey: 'ui.agent.practiceResults.state.variant',\n description:\n 'Active variant — one of `split-list-map`, `map-first`, `rich-cards`.',\n read: (handle) => handle.getVariant(),\n },\n },\n actions: {\n scroll_to_result: {\n safety: 'read',\n argsType: '{ id: string }',\n descriptionKey: 'ui.agent.practiceResults.actions.scrollToResult',\n description:\n 'Scroll the result card with the given id into the visible viewport.',\n invoke: (handle, args: { id: string }) => {\n handle.scrollToResult(args.id);\n },\n },\n focus_pin: {\n safety: 'read',\n argsType: '{ id: string }',\n descriptionKey: 'ui.agent.practiceResults.actions.focusPin',\n description:\n 'Highlight the map pin for the given result id (no-op on rich-cards).',\n invoke: (handle, args: { id: string }) => {\n handle.focusPin(args.id);\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'practice-results',\n description: 'Marks the PracticeResults root region.',\n },\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 useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type ComponentPropsWithoutRef,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport {\n CalendarClock,\n ChevronDown,\n Languages,\n Map as MapIcon,\n MapPin,\n RefreshCw,\n ShieldCheck,\n Smile,\n} from 'lucide-react';\nimport { Alert } from '../alert/alert';\nimport { Avatar } from '../avatar/avatar';\nimport { Button } from '../button/button';\nimport { DropdownMenu } from '../dropdown-menu/dropdown-menu';\nimport { EmptyState } from '../empty-state/empty-state';\nimport { MapView, type MapMarker } from '../map-view/map-view';\nimport { Rating } from '../rating/rating';\nimport { Sheet } from '../sheet/sheet';\nimport { Skeleton } from '../skeleton/skeleton';\nimport { Spinner } from '../spinner/spinner';\nimport { Tag } from '../tag/tag';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { practiceResultsAgent } from './practice-results.agent';\n\n/* -------------------------------------------------------------------- */\n/* PracticeResults */\n/* */\n/* SERP primitive — a three-way A/B-testable surface. One `variant` */\n/* prop selects between Doctolib-style split-list-map (default), */\n/* map-first (map dominant, list rail), and rich-cards (no live map, */\n/* each card carries a static thumbnail + distance + languages + */\n/* insurance + next-available CTA). Telemetry and the */\n/* `PracticeResultsValue` contract are identical across variants so */\n/* A/B comparison is like-for-like. */\n/* */\n/* The consumer owns the search backend (results array, totalCount, */\n/* bbox-driven re-queries via `onBoundsChange`, pagination via */\n/* `onLoadMore`) and the routing (`onResultSelect`). The kit owns */\n/* layout, filter/sort logic, pin↔card sync, accessibility, telemetry. */\n/* -------------------------------------------------------------------- */\n\n/* -------------------------------------------------------------------- */\n/* Public types */\n/* -------------------------------------------------------------------- */\n\nexport type PracticeResultsVariant =\n | 'split-list-map'\n | 'map-first'\n | 'rich-cards';\n\nexport type PracticeResultsSort =\n | 'distance'\n | 'rating'\n | 'next-available'\n | 'relevance';\n\nexport type PracticeResultsSelectSource = 'card' | 'pin';\n\nexport interface PracticeResultsBounds {\n north: number;\n south: number;\n east: number;\n west: number;\n}\n\nexport interface PracticeResult {\n id: string;\n /** Stable URL for the practice or operator detail page. */\n href: string;\n name: string;\n /** Profession or specialty caption. */\n subtitle?: string;\n /** Avatar / logo URL. */\n imageUrl?: string;\n /** Practice location. Required by the two map variants. */\n location?: {\n lat: number;\n lng: number;\n /** Display string e.g. \"Via Brera 14, 20121 Milano\". */\n address?: string;\n /** Distance from search centre, in km. Rendered by rich-cards. */\n distanceKm?: number;\n };\n rating?: {\n value: number;\n count: number;\n };\n /** ISO 639-1 codes. Rendered as chips by rich-cards. */\n languages?: string[];\n /** Short brand names. Rendered as chips by rich-cards. */\n insurances?: string[];\n /** Anxious-patient friendly — renders an icon chip on rich-cards. */\n specializedInFearPatients?: boolean;\n /** Next available slot — rendered as inline CTA on rich-cards. */\n nextAvailableSlot?: {\n /** ISO datetime, e.g. \"2026-05-23T10:30:00+02:00\". */\n dateTime: string;\n /** Direct deep-link to the kit's Booking with this slot pre-selected. */\n bookingHref: string;\n };\n /** Opaque payload echoed back in onResultSelect. */\n __payload?: unknown;\n}\n\nexport interface PracticeResultsValue {\n /** Selected facets — keys match consumer's `facets[].key`. */\n facets?: Record<string, string[]>;\n /** Sort key. Default `'distance'` when searchCentre is set, otherwise `'relevance'`. */\n sort?: PracticeResultsSort;\n}\n\n/** Shared facet shape — same as PatientSearch. */\nexport interface FacetOption {\n value: string;\n label: string;\n}\n\nexport interface FacetGroup {\n key: string;\n label: string;\n /** Empty array = boolean toggle. Non-empty = dropdown. */\n options: FacetOption[];\n multi?: boolean;\n}\n\nexport interface PracticeResultsHandle {\n getVariant: () => PracticeResultsVariant;\n /** Scroll a specific result into view (useful for deep-link → highlight). */\n scrollToResult: (id: string) => void;\n /** Imperatively focus a pin on the map (no-op on rich-cards). */\n focusPin: (id: string) => void;\n}\n\nexport interface PracticeResultsProps\n extends\n Omit<\n ComponentPropsWithoutRef<'div'>,\n 'aria-label' | 'onChange' | 'onSelect' | 'results' | 'defaultValue'\n >,\n VariantProps<typeof rootVariants> {\n /** Default: 'split-list-map'. Pass to override (PostHog / dev-menu). */\n variant?: PracticeResultsVariant;\n\n // Data\n results: PracticeResult[];\n /** Total count for the \"{{count}} risultati\" header. May differ from results.length. */\n totalCount?: number;\n /** Visible search location — drives map centre + distance calcs. */\n searchCentre?: { lat: number; lng: number; label?: string };\n\n // Filters (same shape as PatientSearch)\n facets?: FacetGroup[];\n\n // Map config (used by split + map-first; ignored by rich-cards)\n googleMapsApiKey?: string;\n /** Initial map zoom. Default 13. */\n defaultZoom?: number;\n /** Fires when patient pans/zooms (split + map-first only). */\n onBoundsChange?: (bounds: PracticeResultsBounds) => void;\n /**\n * GDPR consent gate, forwarded to the embedded MapView. When `false`\n * (default) the kit renders the same consent placeholder MapView ships\n * by default — third-party scripts never load until the consumer\n * captures opt-in. Also gates the rich-cards static thumbnails (which\n * are still IP-disclosing third-party loads).\n */\n consentGranted?: boolean;\n /** Fires when the patient clicks the \"Load map\" CTA in the consent placeholder. */\n onConsentRequest?: () => void;\n\n // Pagination\n /** Fires when the patient scrolls to the bottom of the list. */\n onLoadMore?: () => void;\n /** True while the next page is loading — kit shows a Spinner at the list tail. */\n loadingMore?: boolean;\n\n // State\n value: PracticeResultsValue;\n onChange: (next: PracticeResultsValue) => void;\n onResultSelect: (\n result: PracticeResult,\n source: PracticeResultsSelectSource,\n ) => void;\n\n // UX\n /**\n * Initial loading skeletons. Per SSR-first design, skeletons render\n * only when `results.length === 0 && loading === true` so a server-\n * rendered list isn't flashed away on hydration.\n */\n loading?: boolean;\n /** Custom empty-state slot. Defaults to the localised EmptyState. */\n emptyResultsSlot?: ReactNode;\n /** Custom error slot. Renders when `error` is truthy. */\n errorSlot?: ReactNode;\n /** Truthy = render the error slot. Pair with `onRetry` for the default slot. */\n error?: boolean;\n /** Retry handler for the default error slot's CTA. */\n onRetry?: () => void;\n /** Heading rendered above the results (e.g. \"I migliori Dentisti a Milano\"). */\n heading?: string;\n /** Intro text below the heading. */\n intro?: string;\n\n // a11y\n 'aria-label'?: string;\n /** Agent-readiness instance id. */\n id?: string;\n}\n\n/* -------------------------------------------------------------------- */\n/* Constants */\n/* -------------------------------------------------------------------- */\n\nconst DEFAULT_ZOOM = 13;\n\nconst SORT_OPTIONS: readonly PracticeResultsSort[] = [\n 'distance',\n 'rating',\n 'next-available',\n 'relevance',\n] as const;\n\n/* -------------------------------------------------------------------- */\n/* Telemetry */\n/* */\n/* Same `window.track` convention as PatientSearch / booking-website. */\n/* Soft-fails outside the browser and when no host has wired `track`. */\n/* -------------------------------------------------------------------- */\n\ninterface TrackFn {\n (event: string, payload?: Record<string, unknown>): void;\n}\n\nfunction track(event: string, payload?: Record<string, unknown>): void {\n if (typeof window === 'undefined') return;\n const fn = (window as unknown as { track?: TrackFn }).track;\n try {\n fn?.(event, payload);\n } catch {\n // Telemetry must never throw into the UI. Swallow.\n }\n}\n\n/* -------------------------------------------------------------------- */\n/* Helpers */\n/* -------------------------------------------------------------------- */\n\n/**\n * Emit `serp_result_clicked` + invoke the consumer's `onResultSelect`\n * with the result's `position` in the currently-rendered (filtered +\n * sorted) list — needed for the PostHog funnel's position-bias analysis\n * (which rank gets clicked across variants).\n */\nfunction emitResultClick(\n results: PracticeResult[],\n id: string,\n source: PracticeResultsSelectSource,\n onResultSelect: PracticeResultsProps['onResultSelect'],\n): void {\n const position = results.findIndex((r) => r.id === id);\n if (position < 0) return;\n const result = results[position];\n if (!result) return;\n track('serp_result_clicked', { resultId: id, source, position });\n onResultSelect(result, source);\n}\n\n/** Haversine distance between two lat/lng points, in km. */\nfunction haversineKm(\n a: { lat: number; lng: number },\n b: { lat: number; lng: number },\n): number {\n const R = 6371; // earth radius in km\n const dLat = ((b.lat - a.lat) * Math.PI) / 180;\n const dLng = ((b.lng - a.lng) * Math.PI) / 180;\n const lat1 = (a.lat * Math.PI) / 180;\n const lat2 = (b.lat * Math.PI) / 180;\n const sinDLat = Math.sin(dLat / 2);\n const sinDLng = Math.sin(dLng / 2);\n const h =\n sinDLat * sinDLat + Math.cos(lat1) * Math.cos(lat2) * sinDLng * sinDLng;\n return 2 * R * Math.asin(Math.min(1, Math.sqrt(h)));\n}\n\n/** Apply selected facets to the result list — client-side narrowing. */\nfunction applyFilters(\n results: PracticeResult[],\n facets: PracticeResultsValue['facets'],\n facetGroups: FacetGroup[],\n): PracticeResult[] {\n if (!facets || Object.keys(facets).length === 0) return results;\n return results.filter((result) => {\n for (const group of facetGroups) {\n const selected = facets[group.key];\n if (!selected || selected.length === 0) continue;\n if (group.options.length === 0) {\n // Boolean toggle — match the convention used by PatientSearch.\n // Selection of `['true']` means the consumer's data shape should\n // expose a boolean field on the result. The kit can't enumerate\n // every possible boolean key, so we treat the chip as a hint\n // the consumer's backend / pre-filter should honour. Locally,\n // we attempt a heuristic: result has the same key set to true.\n const value = (result as unknown as Record<string, unknown>)[group.key];\n if (value !== true) return false;\n continue;\n }\n const field =\n group.key === 'insurance'\n ? result.insurances\n : group.key === 'language'\n ? result.languages\n : (result as unknown as Record<string, unknown>)[group.key];\n if (!Array.isArray(field)) return false;\n const hit = group.multi\n ? selected.some((v) => field.includes(v))\n : field.includes(selected[0]);\n if (!hit) return false;\n }\n return true;\n });\n}\n\n/** Sort results by the active sort key. Mutation-free. */\nfunction applySort(\n results: PracticeResult[],\n sort: PracticeResultsSort,\n searchCentre?: { lat: number; lng: number },\n): PracticeResult[] {\n const decorated = results.map((result) => {\n const distanceKm = result.location\n ? (result.location.distanceKm ??\n (searchCentre ? haversineKm(searchCentre, result.location) : undefined))\n : undefined;\n return { result, distanceKm };\n });\n const compare = (\n a: { result: PracticeResult; distanceKm?: number },\n b: { result: PracticeResult; distanceKm?: number },\n ): number => {\n switch (sort) {\n case 'distance': {\n if (a.distanceKm == null && b.distanceKm == null) return 0;\n if (a.distanceKm == null) return 1;\n if (b.distanceKm == null) return -1;\n return a.distanceKm - b.distanceKm;\n }\n case 'rating': {\n const av = a.result.rating?.value ?? -1;\n const bv = b.result.rating?.value ?? -1;\n return bv - av;\n }\n case 'next-available': {\n const av = a.result.nextAvailableSlot?.dateTime ?? '';\n const bv = b.result.nextAvailableSlot?.dateTime ?? '';\n if (!av && !bv) return 0;\n if (!av) return 1;\n if (!bv) return -1;\n return av.localeCompare(bv);\n }\n case 'relevance':\n default:\n return 0;\n }\n };\n return [...decorated].sort(compare).map(({ result, distanceKm }) =>\n distanceKm != null && result.location\n ? {\n ...result,\n location: { ...result.location, distanceKm },\n }\n : result,\n );\n}\n\n/** Compute the bounding box of an array of lat/lng pairs. */\nfunction boundsForResults(\n results: PracticeResult[],\n): PracticeResultsBounds | undefined {\n let north = -Infinity;\n let south = Infinity;\n let east = -Infinity;\n let west = Infinity;\n let anyPoint = false;\n for (const result of results) {\n if (!result.location) continue;\n anyPoint = true;\n const { lat, lng } = result.location;\n if (lat > north) north = lat;\n if (lat < south) south = lat;\n if (lng > east) east = lng;\n if (lng < west) west = lng;\n }\n if (!anyPoint) return undefined;\n return { north, south, east, west };\n}\n\n/* -------------------------------------------------------------------- */\n/* Root CVA */\n/* -------------------------------------------------------------------- */\n\nconst rootVariants = cva(\n 'ds:flex ds:w-full ds:flex-col ds:text-[var(--foreground)] ds:gap-[var(--spacing-md)]',\n {\n variants: {\n variant: {\n 'split-list-map': '',\n 'map-first': '',\n 'rich-cards': '',\n },\n },\n defaultVariants: { variant: 'split-list-map' },\n },\n);\n\n/* -------------------------------------------------------------------- */\n/* HeaderBlock — heading + intro + totalCount summary */\n/* -------------------------------------------------------------------- */\n\ninterface HeaderBlockProps {\n heading?: string;\n intro?: string;\n totalCount?: number;\n searchCentreLabel?: string;\n}\n\nfunction HeaderBlock({\n heading,\n intro,\n totalCount,\n searchCentreLabel,\n}: HeaderBlockProps) {\n const { t } = useTranslation();\n if (!heading && !intro && totalCount == null) return null;\n const summary =\n totalCount != null\n ? searchCentreLabel\n ? t('practiceResults.results.heading', {\n count: totalCount,\n place: searchCentreLabel,\n })\n : t('practiceResults.results.summary', { count: totalCount })\n : undefined;\n // Plain <div> rather than <header>: the surrounding region landmark\n // already names the section, and <header> inside a landmark can trip\n // axe's `landmark-banner-is-top-level` when the rule's heuristic\n // walks the DOM. The visual rendering is unchanged.\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n {heading ? (\n <h2 className=\"type-title-section ds:m-0 ds:text-[var(--foreground)]\">\n {heading}\n </h2>\n ) : null}\n {intro ? (\n <p className=\"type-body ds:m-0 ds:text-[var(--muted-foreground)]\">\n {intro}\n </p>\n ) : null}\n {summary ? (\n <p\n className=\"type-body-sm ds:m-0 ds:text-[var(--muted-foreground)]\"\n aria-live=\"polite\"\n >\n {summary}\n </p>\n ) : null}\n </div>\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* FilterChipRow */\n/* */\n/* Shared chip rail — same shape as PatientSearch's FacetChipRow, lifted */\n/* here so the SERP can carry the same set of filters without depending */\n/* on PatientSearch internals. */\n/* -------------------------------------------------------------------- */\n\nconst facetChipVariants = cva(\n [\n 'ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]',\n 'ds:min-h-[var(--min-target-size)]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:pt-[var(--spacing-xs)] ds:pb-[var(--spacing-xs)]',\n 'ds:rounded-[var(--radius-full)]',\n 'type-label',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\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 variants: {\n state: {\n idle: 'ds:bg-[var(--secondary)] ds:text-[var(--foreground)] ds:border ds:border-[color:var(--border)] ds:hover:bg-[color-mix(in_srgb,var(--primary)_8%,var(--secondary))]',\n active:\n 'ds:bg-[var(--primary)] ds:text-[var(--primary-foreground)] ds:border ds:border-transparent ds:font-[var(--font-weight-semibold)]',\n },\n },\n defaultVariants: { state: 'idle' },\n },\n);\n\nconst filterChipRowVariants = cva(\n 'ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-xs)]',\n {\n variants: {\n placement: {\n inline: '',\n // Floating chrome on map-first: soft `--popover` surface so chips\n // read over the map without losing contrast. Same surface as\n // dropdowns / sheets — themed and forced-colors safe.\n floating: [\n 'ds:rounded-[var(--radius-full)]',\n 'ds:bg-[var(--popover)] ds:shadow-[var(--shadow-md)]',\n 'ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)]',\n 'ds:pt-[var(--spacing-2xs)] ds:pb-[var(--spacing-2xs)]',\n ].join(' '),\n },\n },\n defaultVariants: { placement: 'inline' },\n },\n);\n\nconst clearFiltersButtonVariants = cva(\n [\n 'ds:ms-[var(--spacing-xs)] ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]',\n 'ds:min-h-[var(--min-target-size)] ds:ps-[var(--spacing-xs)] ds:pe-[var(--spacing-xs)]',\n 'type-label ds:text-[color:var(--muted-foreground)]',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:hover:text-[color:var(--foreground)]',\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 ].join(' '),\n);\n\ninterface FilterChipRowProps {\n facets: FacetGroup[];\n value: PracticeResultsValue['facets'];\n onChange: (next: Record<string, string[]>) => void;\n /** Visual placement — floating overlay on map-first; inline elsewhere. */\n floating?: boolean;\n}\n\nfunction FilterChipRow({\n facets,\n value,\n onChange,\n floating,\n}: FilterChipRowProps) {\n const { t } = useTranslation();\n const selections = useMemo(() => value ?? {}, [value]);\n\n const hasAnyActive = useMemo(\n () => Object.values(selections).some((arr) => arr && arr.length > 0),\n [selections],\n );\n\n const updateFacet = (key: string, values: string[]) => {\n const next = { ...selections };\n if (values.length === 0) delete next[key];\n else next[key] = values;\n onChange(next);\n track('serp_filter_changed', { key, values });\n };\n\n const toggleBoolean = (key: string) => {\n const isActive = (selections[key]?.length ?? 0) > 0;\n updateFacet(key, isActive ? [] : ['true']);\n };\n\n const toggleOption = (group: FacetGroup, option: string) => {\n const current = selections[group.key] ?? [];\n const active = current.includes(option);\n let next: string[];\n if (group.multi) {\n next = active\n ? current.filter((v) => v !== option)\n : [...current, option];\n } else {\n next = active ? [] : [option];\n }\n updateFacet(group.key, next);\n };\n\n if (facets.length === 0) return null;\n\n return (\n <div\n data-component=\"practice-results-filters\"\n role=\"group\"\n aria-label={t('practiceResults.filters.label')}\n className={filterChipRowVariants({\n placement: floating ? 'floating' : 'inline',\n })}\n >\n {facets.map((group) => {\n const isBoolean = group.options.length === 0;\n const current = selections[group.key] ?? [];\n const isActive = current.length > 0;\n\n if (isBoolean) {\n return (\n <button\n key={group.key}\n type=\"button\"\n aria-pressed={isActive}\n aria-label={group.label}\n onClick={() => toggleBoolean(group.key)}\n className={facetChipVariants({\n state: isActive ? 'active' : 'idle',\n })}\n >\n <span>{group.label}</span>\n </button>\n );\n }\n\n const countSuffix = isActive ? ` (${current.length})` : '';\n return (\n <DropdownMenu.Root key={group.key}>\n <DropdownMenu.Trigger asChild>\n <button\n type=\"button\"\n aria-label={`${group.label}${countSuffix}`}\n className={facetChipVariants({\n state: isActive ? 'active' : 'idle',\n })}\n >\n <span>\n {group.label}\n {countSuffix}\n </span>\n <ChevronDown\n aria-hidden=\"true\"\n className=\"ds:size-3.5 ds:shrink-0\"\n />\n </button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Content sideOffset={8} align=\"start\">\n {group.options.map((option) => (\n <DropdownMenu.CheckboxItem\n key={option.value}\n checked={current.includes(option.value)}\n onSelect={(event) => {\n if (group.multi) event.preventDefault();\n toggleOption(group, option.value);\n }}\n >\n {option.label}\n </DropdownMenu.CheckboxItem>\n ))}\n </DropdownMenu.Content>\n </DropdownMenu.Root>\n );\n })}\n {hasAnyActive ? (\n <button\n type=\"button\"\n onClick={() => {\n onChange({});\n track('serp_filter_changed', { key: '*', values: [] });\n }}\n className={clearFiltersButtonVariants()}\n >\n {t('practiceResults.filters.clear')}\n </button>\n ) : null}\n </div>\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* SortControl — DropdownMenu chip for the active sort key. */\n/* -------------------------------------------------------------------- */\n\ninterface SortControlProps {\n value: PracticeResultsSort;\n onChange: (next: PracticeResultsSort) => void;\n}\n\nfunction SortControl({ value, onChange }: SortControlProps) {\n const { t } = useTranslation();\n const labelFor = (sort: PracticeResultsSort): string => {\n switch (sort) {\n case 'distance':\n return t('practiceResults.sort.distance');\n case 'rating':\n return t('practiceResults.sort.rating');\n case 'next-available':\n return t('practiceResults.sort.nextAvailable');\n case 'relevance':\n default:\n return t('practiceResults.sort.relevance');\n }\n };\n return (\n <DropdownMenu.Root>\n <DropdownMenu.Trigger asChild>\n <button\n type=\"button\"\n aria-label={`${t('practiceResults.sort.label')}: ${labelFor(value)}`}\n className={facetChipVariants({ state: 'idle' })}\n >\n <span>\n {t('practiceResults.sort.label')}: {labelFor(value)}\n </span>\n <ChevronDown aria-hidden=\"true\" className=\"ds:size-3.5 ds:shrink-0\" />\n </button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Content sideOffset={8} align=\"end\">\n <DropdownMenu.RadioGroup\n value={value}\n onValueChange={(next) => {\n const sort = next as PracticeResultsSort;\n if (sort !== value) {\n onChange(sort);\n track('serp_sort_changed', { sort });\n }\n }}\n >\n {SORT_OPTIONS.map((sort) => (\n <DropdownMenu.RadioItem key={sort} value={sort}>\n {labelFor(sort)}\n </DropdownMenu.RadioItem>\n ))}\n </DropdownMenu.RadioGroup>\n </DropdownMenu.Content>\n </DropdownMenu.Root>\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* DistanceChip — formatted \"{km} km\" or \"< 1 km\" reading. */\n/* -------------------------------------------------------------------- */\n\ninterface DistanceChipProps {\n distanceKm: number;\n}\n\nfunction DistanceChip({ distanceKm }: DistanceChipProps) {\n const { t, i18n } = useTranslation();\n const label = useMemo(() => {\n if (distanceKm < 1) return t('practiceResults.distance.below');\n const formatted = new Intl.NumberFormat(i18n.language, {\n maximumFractionDigits: 1,\n }).format(distanceKm);\n return t('practiceResults.distance.km', { distance: formatted });\n }, [distanceKm, t, i18n.language]);\n return (\n <Tag\n label={label}\n variant=\"neutral\"\n fill=\"outline\"\n size=\"sm\"\n leading={<MapPin aria-hidden=\"true\" />}\n />\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* StaticMapThumb — Google Static Maps `<img>`. Consent-gated. */\n/* -------------------------------------------------------------------- */\n\ninterface StaticMapThumbProps {\n apiKey?: string;\n center: { lat: number; lng: number };\n zoom?: number;\n consentGranted: boolean;\n}\n\nconst staticMapThumbVariants = cva(\n [\n 'ds:inline-size-[12rem] ds:block-size-[8rem] ds:shrink-0',\n 'ds:rounded-[var(--radius-md)]',\n ].join(' '),\n {\n variants: {\n state: {\n placeholder:\n 'ds:flex ds:items-center ds:justify-center ds:bg-[var(--muted)] ds:text-[var(--muted-foreground)]',\n image: 'ds:[object-fit:cover]',\n },\n },\n defaultVariants: { state: 'placeholder' },\n },\n);\n\n/**\n * Resolve the kit's `--map-marker-color` token to a six-character hex\n * string (no leading `#`) for Google Static Maps' `markers=color:` URL\n * parameter, which requires a literal hex value at fetch time.\n *\n * The token is defined as a direct hex literal in `src/tokens/index.css`\n * (no `var()` indirection), so `getPropertyValue` returns the hex\n * verbatim and we strip the `#`. SSR-safe: when `document` is undefined\n * we fall back to the kit's brand violet (`--color-violet-700`).\n */\nfunction getStaticMapMarkerHex(): string {\n if (typeof document === 'undefined') return '4945a3';\n const raw = getComputedStyle(document.documentElement)\n .getPropertyValue('--map-marker-color')\n .trim();\n const match = /^#?([0-9a-fA-F]{6})$/.exec(raw);\n return match ? match[1] : '4945a3';\n}\n\nfunction StaticMapThumb({\n apiKey,\n center,\n zoom = 14,\n consentGranted,\n}: StaticMapThumbProps) {\n const { t } = useTranslation();\n // Consent-gated. Without grant, render a tinted placeholder with the\n // MapPin glyph — no IP-disclosing third-party load.\n if (!consentGranted || !apiKey) {\n return (\n <div\n aria-hidden=\"true\"\n className={staticMapThumbVariants({ state: 'placeholder' })}\n >\n <MapPin aria-hidden=\"true\" className=\"ds:size-6\" />\n </div>\n );\n }\n // Static Maps URL. 240×160 keeps the asset under the 1MP free tier\n // and looks crisp on 2× displays at the rendered 12rem × 8rem cell.\n // Marker colour is sourced from the `--map-marker-color` token at\n // runtime so the value stays in `src/tokens/**` per the closed-palette\n // constraint (Google's URL parameter can't read a CSS custom prop).\n const markerHex = getStaticMapMarkerHex();\n const src =\n `https://maps.googleapis.com/maps/api/staticmap` +\n `?center=${center.lat},${center.lng}` +\n `&zoom=${zoom}` +\n `&size=240x160&scale=2` +\n `&markers=color:0x${markerHex}%7C${center.lat},${center.lng}` +\n `&key=${encodeURIComponent(apiKey)}`;\n return (\n <img\n src={src}\n alt={t('practiceResults.thumbnail.alt')}\n loading=\"lazy\"\n decoding=\"async\"\n width={240}\n height={160}\n className={staticMapThumbVariants({ state: 'image' })}\n />\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* ResultCardBase */\n/* */\n/* Compact card used by `split-list-map` left list and `map-first` rail. */\n/* Avatar + name + subtitle + rating + optional chip row. */\n/* -------------------------------------------------------------------- */\n\nconst resultCardBaseVariants = cva(\n [\n 'ds:relative ds:flex ds:w-full ds:cursor-pointer',\n 'ds:rounded-[var(--radius-lg)]',\n 'ds:bg-[var(--card)] ds:text-[var(--card-foreground)]',\n 'ds:border ds:border-[color:var(--card-border)]',\n 'ds:p-[var(--spacing-md)]',\n 'ds:gap-[var(--spacing-md)]',\n 'ds:transition-[box-shadow,border-color] ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:hover:shadow-[var(--shadow-md)]',\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:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n // Use `data-highlighted` for the pin↔card sync visual so consumers\n // can override (e.g. dim siblings) without fighting the kit.\n 'ds:data-[highlighted=true]:border-[color:var(--primary)]',\n 'ds:data-[highlighted=true]:shadow-[var(--shadow-md)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n ].join(' '),\n {\n variants: {\n density: {\n compact: '',\n rich: 'ds:p-[var(--spacing-lg)] ds:gap-[var(--spacing-lg)]',\n },\n },\n defaultVariants: { density: 'compact' },\n },\n);\n\ninterface ResultCardBaseProps {\n result: PracticeResult;\n highlighted: boolean;\n onSelect: () => void;\n onHover: () => void;\n /** Used for layout density (compact vs rich). */\n density?: 'compact' | 'rich';\n children?: ReactNode;\n}\n\nfunction ResultCardBase({\n result,\n highlighted,\n onSelect,\n onHover,\n density = 'compact',\n children,\n}: ResultCardBaseProps) {\n const ratingLabel = result.rating;\n // `<div role=\"link\">` — we can't use a native `<a>` because the rich\n // card carries its own inner Next-Slot anchor and nested <a> is\n // invalid HTML. The consumer's `onResultSelect` is the sole routing\n // hook; the kit's role+tabIndex+keyboard handler give the row the\n // same affordances as an anchor for SR / keyboard users. axe\n // `aria-allowed-role` accepts `link` on `<div>` (not on `<article>`,\n // which is why we don't reach for that semantic root).\n return (\n <div\n data-component=\"practice-result-card\"\n data-result-id={result.id}\n data-highlighted={highlighted ? 'true' : 'false'}\n role=\"link\"\n tabIndex={0}\n aria-labelledby={`practice-result-${result.id}-name`}\n onClick={onSelect}\n onKeyDown={(event) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n onSelect();\n }\n }}\n onMouseEnter={onHover}\n onFocus={onHover}\n className={resultCardBaseVariants({ density })}\n >\n <Avatar src={result.imageUrl} name={result.name} size=\"lg\" />\n <div className=\"ds:flex ds:min-w-0 ds:flex-1 ds:flex-col ds:gap-[var(--spacing-xs)]\">\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)]\">\n <span\n id={`practice-result-${result.id}-name`}\n className=\"type-title-card ds:text-[var(--foreground)]\"\n >\n {result.name}\n </span>\n {result.subtitle ? (\n <span className=\"type-body-sm ds:text-[var(--muted-foreground)]\">\n {result.subtitle}\n </span>\n ) : null}\n {result.location?.address ? (\n <span className=\"type-meta ds:text-[var(--muted-foreground)] ds:inline-flex ds:items-center ds:gap-[var(--spacing-2xs)]\">\n <MapPin aria-hidden=\"true\" className=\"ds:size-3.5 ds:shrink-0\" />\n {result.location.address}\n </span>\n ) : null}\n </div>\n {ratingLabel && ratingLabel.count > 0 ? (\n <Rating\n value={ratingLabel.value}\n reviews={{ count: ratingLabel.count }}\n size=\"sm\"\n />\n ) : null}\n {children}\n </div>\n </div>\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* RichResultCard */\n/* */\n/* Full-fat card for `rich-cards`. Thumbnail map + distance + language + */\n/* insurance chips + next-slot CTA + anxious-patient badge. */\n/* -------------------------------------------------------------------- */\n\ninterface RichResultCardProps {\n result: PracticeResult;\n apiKey?: string;\n consentGranted: boolean;\n highlighted: boolean;\n onSelect: () => void;\n onHover: () => void;\n}\n\nfunction RichResultCard({\n result,\n apiKey,\n consentGranted,\n highlighted,\n onSelect,\n onHover,\n}: RichResultCardProps) {\n const { t, i18n } = useTranslation();\n const slotLabel = useMemo(() => {\n if (!result.nextAvailableSlot) return undefined;\n try {\n return new Intl.DateTimeFormat(i18n.language, {\n weekday: 'short',\n hour: 'numeric',\n minute: 'numeric',\n }).format(new Date(result.nextAvailableSlot.dateTime));\n } catch {\n return result.nextAvailableSlot.dateTime;\n }\n }, [result.nextAvailableSlot, i18n.language]);\n const showLanguages = (result.languages?.length ?? 0) > 0;\n const showInsurances = (result.insurances?.length ?? 0) > 0;\n const showFearPatient = result.specializedInFearPatients;\n const showChipRow = showLanguages || showInsurances || showFearPatient;\n const distanceKm = result.location?.distanceKm;\n\n return (\n <div\n data-component=\"practice-result-card\"\n data-result-id={result.id}\n data-density=\"rich\"\n data-highlighted={highlighted ? 'true' : 'false'}\n role=\"link\"\n tabIndex={0}\n aria-labelledby={`practice-result-${result.id}-name`}\n onClick={onSelect}\n onKeyDown={(event) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n onSelect();\n }\n }}\n onMouseEnter={onHover}\n onFocus={onHover}\n className={resultCardBaseVariants({ density: 'rich' })}\n >\n {result.location ? (\n <StaticMapThumb\n apiKey={apiKey}\n center={{\n lat: result.location.lat,\n lng: result.location.lng,\n }}\n consentGranted={consentGranted}\n />\n ) : null}\n <div className=\"ds:flex ds:min-w-0 ds:flex-1 ds:flex-col ds:gap-[var(--spacing-sm)]\">\n <div className=\"ds:flex ds:items-start ds:gap-[var(--spacing-md)]\">\n <Avatar src={result.imageUrl} name={result.name} size=\"md\" />\n <div className=\"ds:flex ds:min-w-0 ds:flex-1 ds:flex-col ds:gap-[var(--spacing-2xs)]\">\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-xs)]\">\n <span\n id={`practice-result-${result.id}-name`}\n className=\"type-title-card ds:text-[var(--foreground)]\"\n >\n {result.name}\n </span>\n {distanceKm != null ? (\n <DistanceChip distanceKm={distanceKm} />\n ) : null}\n </div>\n {result.subtitle ? (\n <span className=\"type-body-sm ds:text-[var(--muted-foreground)]\">\n {result.subtitle}\n </span>\n ) : null}\n {result.location?.address ? (\n <span className=\"type-meta ds:text-[var(--muted-foreground)] ds:inline-flex ds:items-center ds:gap-[var(--spacing-2xs)]\">\n <MapPin\n aria-hidden=\"true\"\n className=\"ds:size-3.5 ds:shrink-0\"\n />\n {result.location.address}\n </span>\n ) : null}\n </div>\n {result.rating && result.rating.count > 0 ? (\n <Rating\n value={result.rating.value}\n reviews={{ count: result.rating.count }}\n size=\"md\"\n />\n ) : null}\n </div>\n {showChipRow ? (\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-xs)]\">\n {showLanguages\n ? (result.languages ?? []).map((lang) => (\n <Tag\n key={`lang-${lang}`}\n label={lang.toUpperCase()}\n variant=\"info\"\n fill=\"outline\"\n size=\"sm\"\n leading={<Languages aria-hidden=\"true\" />}\n />\n ))\n : null}\n {showInsurances\n ? (result.insurances ?? []).map((ins) => (\n <Tag\n key={`ins-${ins}`}\n label={ins}\n variant=\"brand\"\n fill=\"outline\"\n size=\"sm\"\n leading={<ShieldCheck aria-hidden=\"true\" />}\n />\n ))\n : null}\n {showFearPatient ? (\n <Tag\n label={t('practiceResults.fearPatient.label')}\n variant=\"success\"\n fill=\"outline\"\n size=\"sm\"\n leading={<Smile aria-hidden=\"true\" />}\n />\n ) : null}\n </div>\n ) : null}\n {result.nextAvailableSlot && slotLabel ? (\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)]\">\n <span className=\"type-body-sm ds:text-[var(--muted-foreground)] ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]\">\n <CalendarClock\n aria-hidden=\"true\"\n className=\"ds:size-4 ds:text-[var(--primary)]\"\n />\n {t('practiceResults.nextSlot.summary', { time: slotLabel })}\n </span>\n <Button\n intent=\"primary\"\n size=\"sm\"\n asChild\n onClick={(event) => {\n // The card itself is interactive; clicking the inline\n // CTA must not bubble up and re-fire `onResultSelect`.\n event.stopPropagation();\n }}\n >\n <a\n href={result.nextAvailableSlot.bookingHref}\n data-component=\"practice-result-next-slot-cta\"\n >\n {t('practiceResults.nextSlot.cta', { time: slotLabel })}\n </a>\n </Button>\n </div>\n ) : null}\n </div>\n </div>\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* ResultsList — scroll container + infinite-scroll observer + skeletons. */\n/* -------------------------------------------------------------------- */\n\ninterface ResultsListProps {\n results: PracticeResult[];\n highlightedId: string | null;\n onCardHover: (id: string) => void;\n onCardSelect: (id: string) => void;\n onLoadMore?: () => void;\n loadingMore?: boolean;\n loadingSkeletons?: boolean;\n density?: 'compact' | 'rich';\n apiKey?: string;\n consentGranted?: boolean;\n /** Ref to the scrollable container so the parent can imperatively\n * scroll a card into view (handle.scrollToResult). */\n containerRef?: React.RefObject<HTMLDivElement>;\n}\n\nfunction ResultsList({\n results,\n highlightedId,\n onCardHover,\n onCardSelect,\n onLoadMore,\n loadingMore,\n loadingSkeletons,\n density = 'compact',\n apiKey,\n consentGranted = false,\n containerRef,\n}: ResultsListProps) {\n const { t } = useTranslation();\n const sentinelRef = useRef<HTMLDivElement | null>(null);\n\n // IntersectionObserver-driven `onLoadMore`. The kit fires once per\n // \"intersection\" — the consumer is responsible for guarding against\n // double-fires while a request is in-flight (`loadingMore`).\n useEffect(() => {\n if (!onLoadMore) return;\n const node = sentinelRef.current;\n if (!node) return;\n if (typeof IntersectionObserver === 'undefined') return;\n const observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n track('serp_load_more', {\n currentCount: results.length,\n });\n onLoadMore();\n }\n }\n },\n { root: null, rootMargin: '200px' },\n );\n observer.observe(node);\n return () => observer.disconnect();\n // `results.length` is a snapshot at observe-time — re-bind so the\n // telemetry payload reflects the count at firing.\n }, [onLoadMore, results.length]);\n\n if (loadingSkeletons) {\n return (\n <div\n role=\"status\"\n aria-live=\"polite\"\n aria-label={t('practiceResults.loading')}\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\"\n >\n {Array.from({ length: 4 }).map((_, i) => (\n <Skeleton\n key={`pr-skel-${i}`}\n variant=\"rounded\"\n height={density === 'rich' ? '11rem' : '7rem'}\n />\n ))}\n </div>\n );\n }\n\n return (\n <div\n ref={containerRef}\n data-component=\"practice-results-list\"\n role=\"list\"\n aria-label={t('practiceResults.list.label')}\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)] ds:overflow-y-auto\"\n >\n {results.map((result) => (\n <div key={result.id} role=\"listitem\">\n {density === 'rich' ? (\n <RichResultCard\n result={result}\n apiKey={apiKey}\n consentGranted={consentGranted}\n highlighted={highlightedId === result.id}\n onSelect={() => onCardSelect(result.id)}\n onHover={() => onCardHover(result.id)}\n />\n ) : (\n <ResultCardBase\n result={result}\n highlighted={highlightedId === result.id}\n onSelect={() => onCardSelect(result.id)}\n onHover={() => onCardHover(result.id)}\n />\n )}\n </div>\n ))}\n {onLoadMore ? (\n <div\n ref={sentinelRef}\n aria-hidden=\"true\"\n className=\"ds:flex ds:items-center ds:justify-center ds:py-[var(--spacing-md)]\"\n >\n {loadingMore ? (\n <Spinner size=\"md\" variant=\"pulse\" />\n ) : (\n <span className=\"ds:size-1\" />\n )}\n </div>\n ) : null}\n </div>\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* MapPanel — wraps MapView with markers + bounds-change tracking. */\n/* -------------------------------------------------------------------- */\n\ninterface MapPanelProps {\n results: PracticeResult[];\n searchCentre?: { lat: number; lng: number };\n zoom: number;\n apiKey?: string;\n highlightedId: string | null;\n onPinClick: (id: string) => void;\n onPinHover: (id: string) => void;\n /**\n * Fires once per pin per session (de-duped at the root). Use to emit\n * the `serp_result_hovered_pin` telemetry without re-firing on every\n * click of the same pin. The kit's MapView wrapper only surfaces\n * click events from vis.gl AdvancedMarker (no native hover), so this\n * approximates \"the patient noticed a pin\" rather than a true mouse\n * hover.\n */\n onPinFirstInteract: (id: string) => void;\n onBoundsChange?: (bounds: PracticeResultsBounds) => void;\n consentGranted?: boolean;\n onConsentRequest?: () => void;\n}\n\nfunction MapPanel({\n results,\n searchCentre,\n zoom,\n apiKey,\n highlightedId,\n onPinClick,\n onPinHover,\n onPinFirstInteract,\n onBoundsChange,\n consentGranted,\n onConsentRequest,\n}: MapPanelProps) {\n const { t } = useTranslation();\n // Filter to results that carry a location — pins-without-coordinates\n // would land at 0,0.\n const markers = useMemo<MapMarker[]>(\n () =>\n results\n .filter(\n (\n result,\n ): result is PracticeResult & {\n location: { lat: number; lng: number };\n } => Boolean(result.location),\n )\n .map((result) => ({\n id: result.id,\n position: {\n lat: result.location.lat,\n lng: result.location.lng,\n },\n label: result.name,\n })),\n [results],\n );\n\n // Auto-fit centre: prefer the explicit `searchCentre`; otherwise use\n // the centroid of all visible markers; otherwise fall back to a safe\n // default (Milano).\n const center = useMemo(() => {\n if (searchCentre) return searchCentre;\n const bounds = boundsForResults(results);\n if (bounds) {\n return {\n lat: (bounds.north + bounds.south) / 2,\n lng: (bounds.east + bounds.west) / 2,\n };\n }\n return { lat: 45.4642, lng: 9.19 };\n }, [results, searchCentre]);\n\n // `serp_map_panned` fires on bbox change. The MapView itself doesn't\n // surface a bounds callback yet — until it does, we wire a passive\n // hover-on-pin handler to surface the events the prompt asks for.\n // The consumer's `onBoundsChange` still has to be invoked when bounds\n // *do* arrive; for now, we surface a one-shot synthetic call once\n // markers settle so the consumer can begin its bbox-based search.\n useEffect(() => {\n if (!onBoundsChange) return;\n const bounds = boundsForResults(results);\n if (!bounds) return;\n onBoundsChange(bounds);\n track('serp_map_panned', { bounds });\n }, [results, onBoundsChange]);\n\n // Pin hover is impossible to wire through Google Maps' AdvancedMarker\n // wrapper today (vis.gl exposes click only). The kit's data-component\n // ring still lets a consumer DOM-snoop, but for SR users the pin row\n // can't drive a hover state. We expose a `focusPin` imperative handle\n // instead so deep-link → pin highlight works via React, not DOM\n // hover events.\n //\n // TODO(`data-component=\"practice-result-pin\"`): The 0.31.0 prompt asks\n // for a per-pin `data-component` marker so agents / consumers can\n // target individual pins. The MapView's AdvancedMarker wrapper\n // doesn't currently expose a custom-attribute prop — adding it\n // requires changes to `src/components/map-view/map-view.tsx`. Until\n // that lands, agents use `handle.focusPin(id)` for pin-level\n // imperative access.\n return (\n <div\n data-component=\"practice-results-map-panel\"\n className=\"ds:relative ds:flex ds:size-full ds:min-h-[24rem] ds:flex-col\"\n >\n <MapView\n apiKey={apiKey ?? ''}\n center={center}\n zoom={zoom}\n markers={markers}\n selectedMarkerId={highlightedId}\n consentGranted={Boolean(consentGranted)}\n onConsentRequest={onConsentRequest}\n onMarkerClick={(id) => {\n if (id == null) return;\n onPinHover(id);\n onPinFirstInteract(id);\n onPinClick(id);\n }}\n ariaLabel={t('practiceResults.map.label')}\n size=\"lg\"\n surface=\"bordered\"\n className=\"ds:size-full\"\n />\n </div>\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* SplitListMapBody — desktop two-column, mobile list + \"Vedi mappa\". */\n/* -------------------------------------------------------------------- */\n\ninterface VariantBodyProps {\n results: PracticeResult[];\n totalCount?: number;\n searchCentre?: PracticeResultsProps['searchCentre'];\n facets: FacetGroup[];\n value: PracticeResultsValue;\n onChange: (next: PracticeResultsValue) => void;\n onResultSelect: PracticeResultsProps['onResultSelect'];\n onLoadMore?: PracticeResultsProps['onLoadMore'];\n loadingMore?: boolean;\n apiKey?: string;\n zoom: number;\n consentGranted?: boolean;\n onConsentRequest?: () => void;\n onBoundsChange?: PracticeResultsProps['onBoundsChange'];\n loadingSkeletons: boolean;\n emptyResultsSlot?: ReactNode;\n errorSlot?: ReactNode;\n error?: boolean;\n onRetry?: () => void;\n heading?: string;\n intro?: string;\n /** Highlight + sync state. */\n highlightedId: string | null;\n onCardHover: (id: string) => void;\n onPinClick: (id: string) => void;\n onPinFirstInteract: (id: string) => void;\n /** Imperative ref to the scrollable list container. */\n listContainerRef: React.RefObject<HTMLDivElement>;\n}\n\nfunction HeaderRow({\n variantBodyProps,\n}: {\n variantBodyProps: VariantBodyProps;\n}) {\n const { facets, value, onChange, heading, intro, totalCount, searchCentre } =\n variantBodyProps;\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n <HeaderBlock\n heading={heading}\n intro={intro}\n totalCount={totalCount}\n searchCentreLabel={searchCentre?.label}\n />\n {facets.length > 0 ? (\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)]\">\n <FilterChipRow\n facets={facets}\n value={value.facets}\n onChange={(next) => onChange({ ...value, facets: next })}\n />\n <SortControl\n value={value.sort ?? 'relevance'}\n onChange={(next) => onChange({ ...value, sort: next })}\n />\n </div>\n ) : (\n <div className=\"ds:flex ds:justify-end\">\n <SortControl\n value={value.sort ?? 'relevance'}\n onChange={(next) => onChange({ ...value, sort: next })}\n />\n </div>\n )}\n </div>\n );\n}\n\nfunction DefaultEmpty() {\n const { t } = useTranslation();\n return (\n <EmptyState\n variant=\"no-results\"\n title={t('practiceResults.empty.title')}\n description={t('practiceResults.empty.description')}\n />\n );\n}\n\nfunction DefaultError({ onRetry }: { onRetry?: () => void }) {\n const { t } = useTranslation();\n return (\n <Alert variant=\"error\">\n <Alert.Title as=\"h3\">{t('practiceResults.error.title')}</Alert.Title>\n <Alert.Description>\n {t('practiceResults.error.description')}\n </Alert.Description>\n {onRetry ? (\n <Alert.Action>\n <Button\n intent=\"secondary\"\n size=\"sm\"\n startIcon={<RefreshCw aria-hidden=\"true\" />}\n onClick={onRetry}\n >\n {t('practiceResults.error.retry')}\n </Button>\n </Alert.Action>\n ) : null}\n </Alert>\n );\n}\n\nfunction SplitListMapBody(props: VariantBodyProps) {\n const {\n results,\n apiKey,\n zoom,\n searchCentre,\n onLoadMore,\n loadingMore,\n loadingSkeletons,\n emptyResultsSlot,\n errorSlot,\n error,\n onRetry,\n highlightedId,\n onCardHover,\n onPinClick,\n consentGranted,\n onConsentRequest,\n onBoundsChange,\n listContainerRef,\n } = props;\n const { t } = useTranslation();\n const [mobileMapOpen, setMobileMapOpen] = useState(false);\n\n const body = error ? (\n (errorSlot ?? <DefaultError onRetry={onRetry} />)\n ) : results.length === 0 && !loadingSkeletons ? (\n (emptyResultsSlot ?? <DefaultEmpty />)\n ) : (\n <ResultsList\n results={results}\n highlightedId={highlightedId}\n onCardHover={onCardHover}\n onCardSelect={(id) =>\n emitResultClick(results, id, 'card', props.onResultSelect)\n }\n onLoadMore={onLoadMore}\n loadingMore={loadingMore}\n loadingSkeletons={loadingSkeletons}\n density=\"compact\"\n containerRef={listContainerRef}\n />\n );\n\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\">\n <HeaderRow variantBodyProps={props} />\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)] ds:lg:grid ds:lg:grid-cols-[55%_45%] ds:lg:gap-[var(--spacing-lg)] ds:lg:items-start\">\n <div className=\"ds:min-w-0 ds:lg:max-h-[40rem] ds:lg:overflow-hidden\">\n {body}\n </div>\n <div className=\"ds:hidden ds:lg:block ds:sticky ds:top-[var(--spacing-md)] ds:h-[40rem]\">\n <MapPanel\n results={results}\n searchCentre={searchCentre}\n zoom={zoom}\n apiKey={apiKey}\n highlightedId={highlightedId}\n onPinClick={(id) => {\n emitResultClick(results, id, 'pin', props.onResultSelect);\n onPinClick(id);\n }}\n onPinHover={onCardHover}\n onPinFirstInteract={props.onPinFirstInteract}\n onBoundsChange={onBoundsChange}\n consentGranted={consentGranted}\n onConsentRequest={onConsentRequest}\n />\n </div>\n </div>\n {/* Mobile: sticky \"Vedi mappa\" CTA — bottom-of-viewport. */}\n <div className=\"ds:flex ds:lg:hidden ds:sticky ds:bottom-[var(--spacing-md)] ds:justify-center\">\n <Button\n intent=\"primary\"\n size=\"md\"\n startIcon={<MapIcon aria-hidden=\"true\" />}\n onClick={() => setMobileMapOpen(true)}\n >\n {t('practiceResults.viewMap')}\n </Button>\n </div>\n <Sheet.Root open={mobileMapOpen} onOpenChange={setMobileMapOpen}>\n <Sheet.Content side=\"bottom\" size=\"lg\">\n <Sheet.Header>\n <Sheet.Title>{t('practiceResults.map.label')}</Sheet.Title>\n </Sheet.Header>\n <Sheet.Body>\n <Sheet.Description className=\"ds:sr-only\">\n {t('practiceResults.sheet.description')}\n </Sheet.Description>\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\">\n <div className=\"ds:h-[20rem]\">\n <MapPanel\n results={results}\n searchCentre={searchCentre}\n zoom={zoom}\n apiKey={apiKey}\n highlightedId={highlightedId}\n onPinClick={(id) => {\n emitResultClick(results, id, 'pin', props.onResultSelect);\n onPinClick(id);\n }}\n onPinHover={onCardHover}\n onPinFirstInteract={props.onPinFirstInteract}\n onBoundsChange={onBoundsChange}\n consentGranted={consentGranted}\n onConsentRequest={onConsentRequest}\n />\n </div>\n {body}\n </div>\n </Sheet.Body>\n </Sheet.Content>\n </Sheet.Root>\n </div>\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* MapFirstBody — map dominant, list rail. */\n/* -------------------------------------------------------------------- */\n\ntype MapFirstSheetState = 'peek' | 'half' | 'full';\n\nconst SHEET_STATE_SIZE: Record<MapFirstSheetState, 'sm' | 'md' | 'lg'> = {\n peek: 'sm',\n half: 'md',\n full: 'lg',\n};\n\nconst SNAP_STATES: readonly MapFirstSheetState[] = [\n 'peek',\n 'half',\n 'full',\n] as const;\n\ninterface SheetSnapRadioGroupProps {\n value: MapFirstSheetState;\n onChange: (next: MapFirstSheetState) => void;\n}\n\n/**\n * WAI-ARIA radiogroup for the mobile bottom-sheet's snap state. Only\n * the checked option lives in the tab stop; arrow keys cycle through\n * options and update the checked state in one motion (per the radio\n * pattern). RTL inverts the horizontal arrow keys so ArrowRight always\n * means \"logical next\".\n */\nfunction SheetSnapRadioGroup({ value, onChange }: SheetSnapRadioGroupProps) {\n const { t, i18n } = useTranslation();\n const isRTL = i18n.dir() === 'rtl';\n const buttonRefs = useRef<Map<MapFirstSheetState, HTMLButtonElement>>(\n new Map(),\n );\n const focusAt = useCallback((state: MapFirstSheetState) => {\n buttonRefs.current.get(state)?.focus();\n }, []);\n const handleKeyDown = useCallback(\n (\n event: React.KeyboardEvent<HTMLButtonElement>,\n current: MapFirstSheetState,\n ) => {\n const idx = SNAP_STATES.indexOf(current);\n const total = SNAP_STATES.length;\n const forwardKey = isRTL ? 'ArrowLeft' : 'ArrowRight';\n const backwardKey = isRTL ? 'ArrowRight' : 'ArrowLeft';\n let next: MapFirstSheetState | null = null;\n switch (event.key) {\n case forwardKey:\n case 'ArrowDown':\n next = SNAP_STATES[(idx + 1) % total];\n break;\n case backwardKey:\n case 'ArrowUp':\n next = SNAP_STATES[(idx - 1 + total) % total];\n break;\n case 'Home':\n next = SNAP_STATES[0];\n break;\n case 'End':\n next = SNAP_STATES[total - 1];\n break;\n default:\n return;\n }\n event.preventDefault();\n if (next && next !== current) onChange(next);\n if (next) focusAt(next);\n },\n [focusAt, isRTL, onChange],\n );\n return (\n <div\n role=\"radiogroup\"\n aria-label={t('practiceResults.sheet.snap.label')}\n className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-2xs)]\"\n >\n {SNAP_STATES.map((state) => {\n const isChecked = value === state;\n return (\n <button\n key={state}\n ref={(node) => {\n if (node) buttonRefs.current.set(state, node);\n else buttonRefs.current.delete(state);\n }}\n type=\"button\"\n role=\"radio\"\n aria-checked={isChecked}\n aria-label={t(`practiceResults.sheet.snap.${state}`)}\n tabIndex={isChecked ? 0 : -1}\n onClick={() => onChange(state)}\n onKeyDown={(event) => handleKeyDown(event, state)}\n className={facetChipVariants({\n state: isChecked ? 'active' : 'idle',\n })}\n >\n {t(`practiceResults.sheet.snap.${state}`)}\n </button>\n );\n })}\n </div>\n );\n}\n\nfunction MapFirstBody(props: VariantBodyProps) {\n const {\n results,\n apiKey,\n zoom,\n searchCentre,\n onLoadMore,\n loadingMore,\n loadingSkeletons,\n emptyResultsSlot,\n errorSlot,\n error,\n onRetry,\n highlightedId,\n onCardHover,\n onPinClick,\n consentGranted,\n onConsentRequest,\n onBoundsChange,\n listContainerRef,\n facets,\n value,\n onChange,\n } = props;\n const { t } = useTranslation();\n // Bottom-sheet open + snap state. The kit's Sheet ships three discrete\n // size tokens (sm/md/lg) — until drag-snap lands as a primitive, we\n // cycle between them on button presses, which lets a patient promote\n // the result list to \"full\" without re-opening the sheet.\n const [sheetState, setSheetState] = useState<MapFirstSheetState>('peek');\n const [sheetOpen, setSheetOpen] = useState(true);\n const sheetSize = SHEET_STATE_SIZE[sheetState];\n\n const listContent = error ? (\n (errorSlot ?? <DefaultError onRetry={onRetry} />)\n ) : results.length === 0 && !loadingSkeletons ? (\n (emptyResultsSlot ?? <DefaultEmpty />)\n ) : (\n <ResultsList\n results={results}\n highlightedId={highlightedId}\n onCardHover={onCardHover}\n onCardSelect={(id) =>\n emitResultClick(results, id, 'card', props.onResultSelect)\n }\n onLoadMore={onLoadMore}\n loadingMore={loadingMore}\n loadingSkeletons={loadingSkeletons}\n density=\"rich\"\n apiKey={apiKey}\n consentGranted={consentGranted}\n containerRef={listContainerRef}\n />\n );\n\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\">\n <HeaderBlock\n heading={props.heading}\n intro={props.intro}\n totalCount={props.totalCount}\n searchCentreLabel={searchCentre?.label}\n />\n {/* Desktop: 65/35 map+list. Mobile: full-bleed map + Sheet. */}\n <div className=\"ds:hidden ds:lg:grid ds:lg:grid-cols-[65%_35%] ds:lg:gap-[var(--spacing-lg)] ds:lg:items-start\">\n <div className=\"ds:relative ds:h-[40rem]\">\n <MapPanel\n results={results}\n searchCentre={searchCentre}\n zoom={zoom}\n apiKey={apiKey}\n highlightedId={highlightedId}\n onPinClick={(id) => {\n emitResultClick(results, id, 'pin', props.onResultSelect);\n onPinClick(id);\n }}\n onPinHover={onCardHover}\n onPinFirstInteract={props.onPinFirstInteract}\n onBoundsChange={onBoundsChange}\n consentGranted={consentGranted}\n onConsentRequest={onConsentRequest}\n />\n {/* Floating filter strip — overlaid on the map's top edge. */}\n {facets.length > 0 ? (\n <div className=\"ds:absolute ds:start-[var(--spacing-md)] ds:top-[var(--spacing-md)] ds:max-w-[80%]\">\n <FilterChipRow\n facets={facets}\n value={value.facets}\n onChange={(next) => onChange({ ...value, facets: next })}\n floating\n />\n </div>\n ) : null}\n </div>\n <div className=\"ds:min-w-0 ds:max-h-[40rem] ds:overflow-y-auto\">\n {listContent}\n </div>\n </div>\n <div className=\"ds:flex ds:lg:hidden ds:flex-col ds:gap-[var(--spacing-md)]\">\n <div className=\"ds:relative ds:h-[60vh] ds:min-h-[20rem]\">\n <MapPanel\n results={results}\n searchCentre={searchCentre}\n zoom={zoom}\n apiKey={apiKey}\n highlightedId={highlightedId}\n onPinClick={(id) => {\n emitResultClick(results, id, 'pin', props.onResultSelect);\n onPinClick(id);\n }}\n onPinHover={onCardHover}\n onPinFirstInteract={props.onPinFirstInteract}\n onBoundsChange={onBoundsChange}\n consentGranted={consentGranted}\n onConsentRequest={onConsentRequest}\n />\n {facets.length > 0 ? (\n <div className=\"ds:absolute ds:start-[var(--spacing-md)] ds:top-[var(--spacing-md)] ds:max-w-[calc(100%-var(--spacing-lg))]\">\n <FilterChipRow\n facets={facets}\n value={value.facets}\n onChange={(next) => onChange({ ...value, facets: next })}\n floating\n />\n </div>\n ) : null}\n </div>\n <Sheet.Root open={sheetOpen} onOpenChange={setSheetOpen}>\n <Sheet.Content side=\"bottom\" size={sheetSize}>\n <Sheet.Header>\n <Sheet.Title>\n {t('practiceResults.sheet.title', {\n count: props.totalCount ?? results.length,\n })}\n </Sheet.Title>\n </Sheet.Header>\n <Sheet.Body>\n <Sheet.Description className=\"ds:sr-only\">\n {t('practiceResults.sheet.descriptionMapFirst')}\n </Sheet.Description>\n <div className=\"ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)] ds:pb-[var(--spacing-sm)]\">\n <SortControl\n value={value.sort ?? 'relevance'}\n onChange={(next) => onChange({ ...value, sort: next })}\n />\n <SheetSnapRadioGroup\n value={sheetState}\n onChange={setSheetState}\n />\n </div>\n {listContent}\n </Sheet.Body>\n </Sheet.Content>\n </Sheet.Root>\n </div>\n </div>\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* RichCardsBody — vertical column of rich cards. */\n/* -------------------------------------------------------------------- */\n\nfunction RichCardsBody(props: VariantBodyProps) {\n const {\n results,\n apiKey,\n onLoadMore,\n loadingMore,\n loadingSkeletons,\n emptyResultsSlot,\n errorSlot,\n error,\n onRetry,\n highlightedId,\n onCardHover,\n consentGranted,\n listContainerRef,\n } = props;\n\n const body = error ? (\n (errorSlot ?? <DefaultError onRetry={onRetry} />)\n ) : results.length === 0 && !loadingSkeletons ? (\n (emptyResultsSlot ?? <DefaultEmpty />)\n ) : (\n <ResultsList\n results={results}\n highlightedId={highlightedId}\n onCardHover={onCardHover}\n onCardSelect={(id) =>\n emitResultClick(results, id, 'card', props.onResultSelect)\n }\n onLoadMore={onLoadMore}\n loadingMore={loadingMore}\n loadingSkeletons={loadingSkeletons}\n density=\"rich\"\n apiKey={apiKey}\n consentGranted={consentGranted}\n containerRef={listContainerRef}\n />\n );\n\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\">\n <HeaderRow variantBodyProps={props} />\n {body}\n </div>\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* PracticeResults */\n/* -------------------------------------------------------------------- */\n\nexport const PracticeResults = forwardRef<\n PracticeResultsHandle,\n PracticeResultsProps\n>(function PracticeResults(\n {\n variant = 'split-list-map',\n results,\n totalCount,\n searchCentre,\n facets,\n googleMapsApiKey,\n defaultZoom = DEFAULT_ZOOM,\n onBoundsChange,\n consentGranted,\n onConsentRequest,\n onLoadMore,\n loadingMore,\n value,\n onChange,\n onResultSelect,\n loading,\n emptyResultsSlot,\n errorSlot,\n error,\n onRetry,\n heading,\n intro,\n 'aria-label': ariaLabel,\n id,\n className,\n ...rest\n },\n ref,\n) {\n const { t } = useTranslation();\n\n // Track which card / pin is currently highlighted for the pin↔card\n // sync visual. Lives at the root so hover on either side updates the\n // other.\n const [highlightedId, setHighlightedId] = useState<string | null>(null);\n // Once-per-card hover telemetry de-dupe. PostHog charges per event;\n // we don't want to flood it with re-hovers on the same card.\n const hoveredCardIdsRef = useRef<Set<string>>(new Set());\n const hoveredPinIdsRef = useRef<Set<string>>(new Set());\n\n // Imperative handle — `scrollToResult` finds the card by id within the\n // currently-rendered list and scrolls it into view; `focusPin` updates\n // the highlight state which feeds the embedded MapView's\n // `selectedMarkerId`.\n const listContainerRef = useRef<HTMLDivElement>(null);\n const rootRef = useRef<HTMLDivElement>(null);\n\n const handle = useMemo<PracticeResultsHandle>(\n () => ({\n getVariant: () => variant,\n scrollToResult: (resultId: string) => {\n const root = rootRef.current;\n if (!root) return;\n const card = root.querySelector<HTMLElement>(\n `[data-component=\"practice-result-card\"][data-result-id=\"${CSS.escape(resultId)}\"]`,\n );\n if (!card) return;\n card.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n setHighlightedId(resultId);\n },\n focusPin: (resultId: string) => {\n setHighlightedId(resultId);\n },\n }),\n [variant],\n );\n useImperativeHandle(ref, () => handle, [handle]);\n useAgentRegistration(practiceResultsAgent, handle, id);\n\n // `serp_variant_exposed` — fire once per variant assignment.\n const exposedRef = useRef<PracticeResultsVariant | null>(null);\n useEffect(() => {\n if (exposedRef.current === variant) return;\n exposedRef.current = variant;\n track('serp_variant_exposed', {\n variant,\n totalCount: totalCount ?? results.length,\n });\n // Reset per-card de-dupe so the new variant doesn't share state.\n hoveredCardIdsRef.current = new Set();\n hoveredPinIdsRef.current = new Set();\n // Intentionally omit totalCount / results.length so the event fires\n // once per variant, not once per render.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [variant]);\n\n // `serp_empty_results` — fire when the visible (filtered) list drops\n // to zero. Compared against the most-recent emit so consecutive\n // empties don't flood telemetry.\n const lastEmptyEmitRef = useRef<boolean>(false);\n\n // Resolved values: facets default to []; sort defaults to 'distance'\n // when searchCentre is set, otherwise 'relevance'. `resolvedFacets`\n // is memoised so the `processedResults` useMemo below doesn't\n // re-invalidate on every render when the consumer passes `undefined`\n // and `?? []` allocates a fresh array.\n const resolvedFacets = useMemo(() => facets ?? [], [facets]);\n const resolvedSort = value.sort ?? (searchCentre ? 'distance' : 'relevance');\n\n // Apply filters + sort. The kit does this client-side so consumers\n // get the right ordering without re-querying — the consumer's backend\n // is still free to pre-sort, but the kit's `sort` switch never\n // requires a network round-trip.\n const processedResults = useMemo(() => {\n const filtered = applyFilters(results, value.facets, resolvedFacets);\n return applySort(filtered, resolvedSort, searchCentre);\n }, [results, value.facets, resolvedFacets, resolvedSort, searchCentre]);\n\n useEffect(() => {\n const isEmpty = processedResults.length === 0;\n if (isEmpty && !lastEmptyEmitRef.current) {\n track('serp_empty_results', {\n appliedFacets: value.facets ?? {},\n });\n lastEmptyEmitRef.current = true;\n } else if (!isEmpty) {\n lastEmptyEmitRef.current = false;\n }\n }, [processedResults.length, value.facets]);\n\n // Hover debounce — `serp_result_hovered_card` only fires after 500ms\n // of continuous hover on the same card AND only once per card per\n // session. Per the prompt's instrumentation spec — distinguishes\n // genuine intent signals from accidental drag-throughs.\n const hoverTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const lastHoverIdRef = useRef<string | null>(null);\n useEffect(\n () => () => {\n if (hoverTimerRef.current) clearTimeout(hoverTimerRef.current);\n },\n [],\n );\n const onCardHover = useCallback((resultId: string) => {\n setHighlightedId(resultId);\n // De-dupe: already-tracked-this-session cards skip the debounce\n // entirely so we don't queue a no-op timer.\n if (hoveredCardIdsRef.current.has(resultId)) return;\n if (lastHoverIdRef.current === resultId && hoverTimerRef.current) {\n return;\n }\n if (hoverTimerRef.current) clearTimeout(hoverTimerRef.current);\n lastHoverIdRef.current = resultId;\n hoverTimerRef.current = setTimeout(() => {\n if (!hoveredCardIdsRef.current.has(resultId)) {\n hoveredCardIdsRef.current.add(resultId);\n track('serp_result_hovered_card', { resultId });\n }\n hoverTimerRef.current = null;\n }, 500);\n }, []);\n const onPinClick = useCallback((resultId: string) => {\n setHighlightedId(resultId);\n // Scroll the matching card into view (split-list-map / map-first\n // behaviour — rich-cards has no map so this is unreachable there).\n const root = rootRef.current;\n if (!root) return;\n const card = root.querySelector<HTMLElement>(\n `[data-component=\"practice-result-card\"][data-result-id=\"${CSS.escape(resultId)}\"]`,\n );\n card?.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n }, []);\n // Once-per-pin telemetry de-dupe. `onPinFirstInteract` fires on the\n // first marker click per pin per session; subsequent clicks update\n // the highlight but don't re-fire `serp_result_hovered_pin`.\n const onPinFirstInteract = useCallback((resultId: string) => {\n if (hoveredPinIdsRef.current.has(resultId)) return;\n hoveredPinIdsRef.current.add(resultId);\n track('serp_result_hovered_pin', { resultId });\n }, []);\n\n // SSR-first: only render skeletons when the consumer is actively\n // loading AND has nothing to show. A server-rendered list keeps its\n // bones during hydration even if the consumer flips `loading` on its\n // background re-fetch.\n const loadingSkeletons = Boolean(loading) && results.length === 0;\n\n const bodyProps: VariantBodyProps = {\n results: processedResults,\n totalCount,\n searchCentre,\n facets: resolvedFacets,\n value: { ...value, sort: resolvedSort },\n onChange,\n onResultSelect,\n onLoadMore,\n loadingMore,\n apiKey: googleMapsApiKey,\n zoom: defaultZoom,\n consentGranted,\n onConsentRequest,\n onBoundsChange,\n loadingSkeletons,\n emptyResultsSlot,\n errorSlot,\n error,\n onRetry,\n heading,\n intro,\n highlightedId,\n onCardHover,\n onPinClick,\n onPinFirstInteract,\n listContainerRef,\n };\n\n const body = (() => {\n switch (variant) {\n case 'map-first':\n return <MapFirstBody {...bodyProps} />;\n case 'rich-cards':\n return <RichCardsBody {...bodyProps} />;\n case 'split-list-map':\n default:\n return <SplitListMapBody {...bodyProps} />;\n }\n })();\n\n const resolvedAriaLabel = ariaLabel ?? t('practiceResults.regionLabel');\n\n return (\n <div\n ref={rootRef}\n role=\"region\"\n aria-label={resolvedAriaLabel}\n id={id}\n data-component=\"practice-results\"\n data-component-id={id}\n data-variant={variant}\n className={rootVariants({ variant, className })}\n {...rest}\n >\n {body}\n </div>\n );\n});\n\nPracticeResults.displayName = 'PracticeResults';\n"],"names":["__iconNode","Languages","createLucideIcon","Map","ShieldCheck","practiceResultsAgent","handle","args","DEFAULT_ZOOM","SORT_OPTIONS","track","event","payload","fn","emitResultClick","results","id","source","onResultSelect","position","r","result","haversineKm","a","b","dLat","dLng","lat1","lat2","sinDLat","sinDLng","h","applyFilters","facets","facetGroups","group","selected","field","v","applySort","sort","searchCentre","decorated","distanceKm","compare","av","_a","_b","_c","bv","_d","boundsForResults","north","south","east","west","anyPoint","lat","lng","rootVariants","cva","HeaderBlock","heading","intro","totalCount","searchCentreLabel","t","useTranslation","summary","jsxs","jsx","facetChipVariants","filterChipRowVariants","clearFiltersButtonVariants","FilterChipRow","value","onChange","floating","selections","useMemo","hasAnyActive","arr","updateFacet","key","values","next","toggleBoolean","isActive","toggleOption","option","current","active","isBoolean","countSuffix","DropdownMenu","ChevronDown","SortControl","labelFor","DistanceChip","i18n","label","formatted","Tag","MapPin","staticMapThumbVariants","getStaticMapMarkerHex","raw","match","StaticMapThumb","apiKey","center","zoom","consentGranted","markerHex","src","resultCardBaseVariants","ResultCardBase","highlighted","onSelect","onHover","density","children","ratingLabel","Avatar","Rating","RichResultCard","slotLabel","showLanguages","showInsurances","showFearPatient","showChipRow","lang","ins","Smile","CalendarClock","Button","ResultsList","highlightedId","onCardHover","onCardSelect","onLoadMore","loadingMore","loadingSkeletons","containerRef","sentinelRef","useRef","useEffect","node","observer","entries","entry","_","i","Skeleton","Spinner","MapPanel","onPinClick","onPinHover","onPinFirstInteract","onBoundsChange","onConsentRequest","markers","bounds","MapView","HeaderRow","variantBodyProps","DefaultEmpty","EmptyState","DefaultError","onRetry","Alert","RefreshCw","SplitListMapBody","props","emptyResultsSlot","errorSlot","error","listContainerRef","mobileMapOpen","setMobileMapOpen","useState","body","MapIcon","Sheet","SHEET_STATE_SIZE","SNAP_STATES","SheetSnapRadioGroup","isRTL","buttonRefs","focusAt","useCallback","state","handleKeyDown","idx","total","forwardKey","backwardKey","isChecked","MapFirstBody","sheetState","setSheetState","sheetOpen","setSheetOpen","sheetSize","listContent","RichCardsBody","PracticeResults","forwardRef","variant","googleMapsApiKey","defaultZoom","loading","ariaLabel","className","rest","ref","setHighlightedId","hoveredCardIdsRef","hoveredPinIdsRef","rootRef","resultId","root","card","useImperativeHandle","useAgentRegistration","exposedRef","lastEmptyEmitRef","resolvedFacets","resolvedSort","processedResults","filtered","isEmpty","hoverTimerRef","lastHoverIdRef","bodyProps","resolvedAriaLabel"],"mappings":"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","x_google_ignoreList":[0,1,2]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"progress-B-PSO5OS.js","sources":["../../src/components/progress/progress.agent.ts","../../src/components/progress/progress.tsx"],"sourcesContent":["import type { AgentAdapter } from '../../agent/types';\nimport type { ProgressHandle } from './progress';\n\nexport const progressAgent: AgentAdapter<ProgressHandle> = {\n id: 'progress',\n capabilities: [],\n state: {},\n actions: {\n set_value: {\n safety: 'read',\n argsType: '{ value: number }',\n description: 'Set the displayed progress value (0–100).',\n invoke: (handle, args: { value: number }) => {\n handle.setValue(args.value);\n },\n },\n },\n domHooks: {\n root: { attr: 'data-component', value: 'progress' },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","import {\n createContext,\n forwardRef,\n useContext,\n useEffect,\n useId,\n useImperativeHandle,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { cva } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { progressAgent } from './progress.agent';\n\n/* ── Public types ─────────────────────────────────────────────────────── */\n\nexport interface ProgressHandle {\n setValue: (value: number) => void;\n}\n\nexport interface ProgressProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'role'\n> {\n value?: number;\n max?: number;\n shape?: 'bar' | 'circular';\n size?: 'sm' | 'md' | 'lg';\n ariaLabel?: string;\n ariaValueText?: string;\n debouncePercent?: number;\n disabled?: boolean;\n children?: ReactNode;\n}\n\n/* ── Context ──────────────────────────────────────────────────────────── */\n\ntype ProgressContextValue = {\n labelId: string;\n isIndeterminate: boolean;\n value: number | undefined;\n max: number;\n};\n\nconst ProgressCtx = createContext<ProgressContextValue | null>(null);\n\nfunction useProgressCtx(): ProgressContextValue {\n const ctx = useContext(ProgressCtx);\n if (!ctx)\n throw new Error('Progress sub-components must be used within <Progress>');\n return ctx;\n}\n\n/* ── Circle geometry ──────────────────────────────────────────────────── */\n\nconst CIRCLE = {\n sm: { viewBox: '0 0 24 24', cx: 12, cy: 12, r: 10 },\n md: { viewBox: '0 0 40 40', cx: 20, cy: 20, r: 18 },\n lg: { viewBox: '0 0 56 56', cx: 28, cy: 28, r: 26 },\n} as const;\n\n/* ── CVA ──────────────────────────────────────────────────────────────── */\n\nconst barTrackVariants = cva(\n 'ds:relative ds:w-full ds:overflow-hidden ds:rounded-[var(--radius-full)] ds:bg-[var(--progress-track)]',\n {\n variants: {\n size: { sm: 'ds:h-1', md: 'ds:h-2', lg: 'ds:h-3' },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\nconst circularVariants = cva('', {\n variants: {\n size: {\n sm: 'ds:w-6 ds:h-6',\n md: 'ds:w-10 ds:h-10',\n lg: 'ds:w-14 ds:h-14',\n },\n },\n defaultVariants: { size: 'md' },\n});\n\n/* ── Progress.Label ───────────────────────────────────────────────────── */\n\nconst ProgressLabel = forwardRef<\n HTMLSpanElement,\n HTMLAttributes<HTMLSpanElement>\n>(({ children, className, ...props }, ref) => {\n const ctx = useProgressCtx();\n const { t, i18n } = useTranslation();\n\n const defaultText = ctx.isIndeterminate\n ? t('common.loading', 'Loading...')\n : t('common.progress_label', {\n percent: new Intl.NumberFormat(i18n.language, {\n style: 'percent',\n maximumFractionDigits: 0,\n }).format((ctx.value ?? 0) / ctx.max),\n });\n\n return (\n <span\n ref={ref}\n id={ctx.labelId}\n className={['type-label ds:text-foreground', className]\n .filter(Boolean)\n .join(' ')}\n {...props}\n >\n {children ?? defaultText}\n </span>\n );\n});\nProgressLabel.displayName = 'Progress.Label';\n\n/* ── Progress.Value ───────────────────────────────────────────────────── */\n\nconst ProgressValue = forwardRef<\n HTMLSpanElement,\n HTMLAttributes<HTMLSpanElement>\n>(({ className, ...props }, ref) => {\n const ctx = useProgressCtx();\n const { t, i18n } = useTranslation();\n\n const text = ctx.isIndeterminate\n ? t('common.loading', 'Loading...')\n : new Intl.NumberFormat(i18n.language, {\n style: 'percent',\n maximumFractionDigits: 0,\n }).format((ctx.value ?? 0) / ctx.max);\n\n return (\n <span\n ref={ref}\n className={[\n 'type-body-sm ds:tabular-nums ds:text-muted-foreground',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n {...props}\n >\n {text}\n </span>\n );\n});\nProgressValue.displayName = 'Progress.Value';\n\n/* ── Progress root ────────────────────────────────────────────────────── */\n\nconst ProgressRoot = forwardRef<ProgressHandle, ProgressProps>(\n (\n {\n id,\n value,\n max = 100,\n shape = 'bar',\n size = 'md',\n ariaLabel,\n ariaValueText,\n debouncePercent = 1,\n disabled = false,\n className,\n children,\n ...rest\n },\n ref,\n ) => {\n const labelId = useId();\n const { t, i18n } = useTranslation();\n const barTrackRef = useRef<HTMLDivElement>(null);\n const barFillRef = useRef<HTMLDivElement>(null);\n const circTrackRef = useRef<SVGSVGElement>(null);\n const circFillRef = useRef<SVGCircleElement>(null);\n /* Separate typed refs for each shape to avoid union-type casts */\n const lastAnnouncedPercentRef = useRef<number | null>(null);\n\n const isIndeterminate = value === undefined;\n const clampedValue = isIndeterminate\n ? undefined\n : Math.min(max, Math.max(0, value));\n const targetPercent =\n clampedValue !== undefined ? (clampedValue / max) * 100 : undefined;\n\n /* ── Mount-in animation ──────────────────────────────────────────── */\n // Paint once at 0 before showing the target value, so the existing\n // transition on stroke-dashoffset / inline-size animates from empty\n // → target on mount. First render: hasMounted=false → percent=0,\n // useLayoutEffect writes 0 to the style, browser paints empty.\n // useEffect then flips hasMounted, triggering a re-render at the\n // target percent; the style write inside useLayoutEffect produces\n // the change the transition needs.\n const [hasMounted, setHasMounted] = useState(false);\n useEffect(() => {\n setHasMounted(true);\n }, []);\n const percent = hasMounted || isIndeterminate ? targetPercent : 0;\n\n /* ── CSS property updates (visual fill) ──────────────────────────── */\n useLayoutEffect(() => {\n if (isIndeterminate || percent === undefined) return;\n\n if (shape === 'bar') {\n barFillRef.current?.style.setProperty(\n '--progress-value',\n String(percent),\n );\n } else {\n const { r } = CIRCLE[size];\n const circumference = 2 * Math.PI * r;\n const offset = circumference * (1 - percent / 100);\n circFillRef.current?.style.setProperty(\n 'stroke-dashoffset',\n String(offset),\n );\n }\n }, [isIndeterminate, percent, shape, size]);\n\n /* ── Debounced ARIA value updates ────────────────────────────────── */\n useLayoutEffect(() => {\n const trackEl =\n shape === 'bar' ? barTrackRef.current : circTrackRef.current;\n if (!trackEl) return;\n\n if (isIndeterminate) {\n trackEl.removeAttribute('aria-valuenow');\n lastAnnouncedPercentRef.current = null;\n return;\n }\n if (clampedValue === undefined) return;\n\n const pct = (clampedValue / max) * 100;\n const last = lastAnnouncedPercentRef.current;\n const delta = last === null ? Infinity : Math.abs(pct - last);\n if (delta >= debouncePercent) {\n trackEl.setAttribute('aria-valuenow', String(clampedValue));\n lastAnnouncedPercentRef.current = pct;\n }\n }, [isIndeterminate, clampedValue, max, debouncePercent, shape]);\n\n /* ── Imperative handle for high-frequency updates ────────────────── */\n const rootRef = useRef<HTMLDivElement>(null);\n\n const agentHandle = useMemo<ProgressHandle>(\n () => ({\n setValue: (v: number) => {\n const clamped = Math.min(max, Math.max(0, v));\n const pct = (clamped / max) * 100;\n\n if (shape === 'bar') {\n barFillRef.current?.style.setProperty(\n '--progress-value',\n String(pct),\n );\n } else {\n const { r } = CIRCLE[size];\n const circumference = 2 * Math.PI * r;\n const offset = circumference * (1 - pct / 100);\n circFillRef.current?.style.setProperty(\n 'stroke-dashoffset',\n String(offset),\n );\n }\n\n const trackEl =\n shape === 'bar' ? barTrackRef.current : circTrackRef.current;\n const last = lastAnnouncedPercentRef.current;\n const delta = last === null ? Infinity : Math.abs(pct - last);\n if (delta >= debouncePercent && trackEl) {\n trackEl.setAttribute('aria-valuenow', String(clamped));\n lastAnnouncedPercentRef.current = pct;\n }\n },\n }),\n [max, shape, size, debouncePercent],\n );\n useImperativeHandle(ref, () => agentHandle, [agentHandle]);\n useAgentRegistration(progressAgent, agentHandle, id);\n\n /* ── ARIA props shared by both shapes ────────────────────────────── */\n // Provide aria-label as fallback alongside aria-labelledby: per ARIA spec,\n // AT falls back to aria-label when aria-labelledby references a missing id.\n // This covers the case where neither ariaLabel nor Progress.Label is used.\n const fallbackAriaLabel = isIndeterminate\n ? t('common.loading', 'Loading...')\n : t('common.progress_label', {\n percent: new Intl.NumberFormat(i18n.language, {\n style: 'percent',\n maximumFractionDigits: 0,\n }).format((clampedValue ?? 0) / max),\n });\n\n const labelProps = ariaLabel\n ? { 'aria-label': ariaLabel }\n : { 'aria-labelledby': labelId, 'aria-label': fallbackAriaLabel };\n\n const stateProps = isIndeterminate\n ? { 'aria-busy': true as const, 'aria-valuemin': 0, 'aria-valuemax': max }\n : {\n 'aria-valuemin': 0 as const,\n 'aria-valuemax': max,\n ...(ariaValueText ? { 'aria-valuetext': ariaValueText } : {}),\n };\n\n const disabledProp = disabled ? { 'aria-disabled': true as const } : {};\n\n const wrapperClass = [\n 'ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]',\n disabled && 'ds:opacity-50',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const ctxValue: ProgressContextValue = {\n labelId,\n isIndeterminate,\n value: clampedValue,\n max,\n };\n\n /* ── Bar shape ──────────────────────────────────────────────────── */\n if (shape === 'bar') {\n const fillClass = isIndeterminate\n ? [\n 'ds:absolute ds:[inset-block:0] ds:bg-primary ds:rounded-[var(--radius-full)]',\n 'ds:[@media(prefers-reduced-motion:no-preference)]:animate-[progress-bar-indeterminate_1200ms_ease-in-out_infinite]',\n 'ds:[.theme-accessible_&]:animate-none',\n 'ds:motion-reduce:animate-[progress-indeterminate-pulse_var(--animation-duration)_ease-in-out_infinite]',\n ].join(' ')\n : [\n 'ds:absolute ds:[inset-block:0] ds:start-0',\n 'ds:[inline-size:calc(var(--progress-value,0)*1%)]',\n 'ds:bg-primary ds:rounded-[var(--radius-full)]',\n 'ds:transition-[inline-size] ds:duration-[var(--animation-duration)]',\n 'ds:ease-[var(--ease-out)] ds:motion-reduce:transition-none',\n ].join(' ');\n\n return (\n <ProgressCtx.Provider value={ctxValue}>\n <div\n ref={rootRef}\n className={wrapperClass}\n data-component=\"progress\"\n data-component-id={id}\n {...rest}\n >\n {children}\n <div\n ref={barTrackRef}\n role=\"progressbar\"\n {...labelProps}\n {...stateProps}\n {...disabledProp}\n className={barTrackVariants({ size })}\n >\n <div ref={barFillRef} className={fillClass} />\n </div>\n </div>\n </ProgressCtx.Provider>\n );\n }\n\n /* ── Circular shape ─────────────────────────────────────────────── */\n const { viewBox, cx, cy, r } = CIRCLE[size];\n const circumference = 2 * Math.PI * r;\n const indeterminateDashOffset = circumference * 0.25;\n // For determinate progress, paint an empty arc on first mount. The\n // effect above then sets stroke-dashoffset to the target, and the\n // CSS transition animates from empty → target.\n const initialDashOffset = isIndeterminate\n ? indeterminateDashOffset\n : circumference;\n\n const svgClass = isIndeterminate\n ? [\n circularVariants({ size }),\n 'ds:[transform:rotate(-90deg)]',\n 'ds:[@media(prefers-reduced-motion:no-preference)]:animate-[progress-circular-spin_1200ms_linear_infinite]',\n 'ds:[.theme-accessible_&]:animate-none',\n 'ds:motion-reduce:animate-[progress-indeterminate-pulse_var(--animation-duration)_ease-in-out_infinite]',\n ].join(' ')\n : [\n circularVariants({ size }),\n 'ds:[transform:rotate(-90deg)]',\n 'ds:rtl:[transform:rotate(-90deg)_scaleX(-1)]',\n ].join(' ');\n\n const fillStrokeClass = [\n 'ds:stroke-primary ds:[stroke-width:var(--spacing-xs)]',\n !isIndeterminate &&\n 'ds:transition-[stroke-dashoffset] ds:duration-[var(--animation-duration)] ds:ease-[var(--ease-out)] ds:motion-reduce:transition-none',\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <ProgressCtx.Provider value={ctxValue}>\n <div\n ref={rootRef}\n className={wrapperClass}\n data-component=\"progress\"\n {...rest}\n >\n {children}\n <svg\n ref={circTrackRef}\n role=\"progressbar\"\n {...labelProps}\n {...stateProps}\n {...disabledProp}\n viewBox={viewBox}\n className={svgClass}\n >\n <circle\n cx={cx}\n cy={cy}\n r={r}\n fill=\"none\"\n strokeDasharray={circumference}\n className=\"ds:[stroke:var(--progress-track)] ds:[stroke-width:var(--spacing-xs)]\"\n />\n <circle\n ref={circFillRef}\n cx={cx}\n cy={cy}\n r={r}\n fill=\"none\"\n strokeLinecap=\"round\"\n strokeDasharray={circumference}\n strokeDashoffset={initialDashOffset}\n className={fillStrokeClass}\n />\n </svg>\n </div>\n </ProgressCtx.Provider>\n );\n },\n);\n\nProgressRoot.displayName = 'Progress';\n\n/* ── Compound export ──────────────────────────────────────────────────── */\n\nexport const Progress = Object.assign(ProgressRoot, {\n Label: ProgressLabel,\n Value: ProgressValue,\n});\n"],"names":["progressAgent","handle","args","ProgressCtx","createContext","useProgressCtx","ctx","useContext","CIRCLE","barTrackVariants","cva","circularVariants","ProgressLabel","forwardRef","children","className","props","ref","t","i18n","useTranslation","defaultText","jsx","ProgressValue","text","ProgressRoot","id","value","max","shape","size","ariaLabel","ariaValueText","debouncePercent","disabled","rest","labelId","useId","barTrackRef","useRef","barFillRef","circTrackRef","circFillRef","lastAnnouncedPercentRef","isIndeterminate","clampedValue","targetPercent","hasMounted","setHasMounted","useState","useEffect","percent","useLayoutEffect","_a","r","offset","_b","trackEl","pct","last","rootRef","agentHandle","useMemo","v","clamped","useImperativeHandle","useAgentRegistration","fallbackAriaLabel","labelProps","stateProps","disabledProp","wrapperClass","ctxValue","fillClass","jsxs","viewBox","cx","cy","circumference","indeterminateDashOffset","initialDashOffset","svgClass","fillStrokeClass","Progress"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"public-footer.agent-Bc99tE5Z.js","sources":["../../src/components/public-footer/legal-urls.ts","../../src/components/public-footer/socials.tsx","../../src/components/public-footer/public-footer.tsx","../../src/components/public-footer/public-footer.agent.ts"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* PublicFooter — legally-required URL composition. */\n/* */\n/* GDPR + Italian/German commercial law require Privacy, Terms-of-use, */\n/* entity name and VAT to be visible on every public AlfaDocs surface. */\n/* The kit owns the slug table so a privacy-policy URL change is a single */\n/* kit bump rather than three repo edits. */\n/* */\n/* For locales without an explicit canonical slug, we fall back to the */\n/* Italian slugs — alfadocs.com defaults to Italian and unlocalised pages */\n/* render the IT version. Marketing supplies updates over time. */\n/* -------------------------------------------------------------------- */\n\nexport const DEFAULT_MARKETING_BASE_URL = 'https://www.alfadocs.com';\n\nexport type LegalUrlKey = 'privacy' | 'terms' | 'contacts';\n\nexport type LegalSlugMap = Record<LegalUrlKey, string>;\n\n/** Per-locale slug override; missing locales fall back to the kit default. */\nexport type LegalUrlOverride = Record<string, string>;\n\nexport interface LegalUrlOverrides {\n privacy?: LegalUrlOverride;\n terms?: LegalUrlOverride;\n contacts?: LegalUrlOverride;\n}\n\n/* Italian default — also used as the fallback for any locale without an\n * explicit entry below. */\nconst ITALIAN_SLUGS: LegalSlugMap = {\n privacy: '/privacy-prenotazione-online',\n terms: '/it/condizioni-di-utilizzo',\n contacts: '/it/contattaci',\n};\n\n/* Canonical per-locale slug table. Explicit entries come from marketing;\n * everything else inherits ITALIAN_SLUGS via the resolver below. */\nconst SLUGS: Record<string, LegalSlugMap> = {\n it: ITALIAN_SLUGS,\n en: {\n privacy: '/en/privacy',\n terms: '/en/terms-of-use',\n contacts: '/en/contact-us',\n },\n de: {\n privacy: '/de/datenschutz',\n terms: '/de/nutzungsbedingungen',\n contacts: '/de/kontakt',\n },\n fr: {\n privacy: '/fr/confidentialite',\n terms: '/fr/conditions-utilisation',\n contacts: '/fr/contact',\n },\n es: {\n privacy: '/es/privacidad',\n terms: '/es/condiciones-uso',\n contacts: '/es/contacto',\n },\n};\n\nconst HTTPS_PREFIX = 'https://';\n\nfunction normaliseBaseUrl(input: string | undefined): string {\n if (!input) return DEFAULT_MARKETING_BASE_URL;\n if (!input.startsWith(HTTPS_PREFIX)) {\n if (import.meta.env.DEV) {\n // eslint-disable-next-line no-console\n console.warn(\n `[PublicFooter] marketingBaseUrl must start with \"https://\" — falling back to ${DEFAULT_MARKETING_BASE_URL}. Received: \"${input}\"`,\n );\n }\n return DEFAULT_MARKETING_BASE_URL;\n }\n // Strip trailing slash so composed URLs don't double up.\n return input.replace(/\\/+$/, '');\n}\n\nfunction pickSlug(\n locale: string,\n key: LegalUrlKey,\n overrides: LegalUrlOverrides | undefined,\n): string {\n const override = overrides?.[key]?.[locale];\n if (override) return override;\n const localeSlug = SLUGS[locale]?.[key];\n if (localeSlug) return localeSlug;\n return ITALIAN_SLUGS[key];\n}\n\n/** Resolved legal URLs for the active locale + baseUrl + overrides. */\nexport interface ResolvedLegalUrls {\n privacy: string;\n terms: string;\n contacts: string;\n}\n\nexport function composeLegalUrls(\n locale: string,\n marketingBaseUrl: string | undefined,\n overrides?: LegalUrlOverrides,\n): ResolvedLegalUrls {\n const base = normaliseBaseUrl(marketingBaseUrl);\n const lang = (locale || 'it').split('-')[0]; // strip region — 'pt-BR' → 'pt'\n return {\n privacy: `${base}${pickSlug(lang, 'privacy', overrides)}`,\n terms: `${base}${pickSlug(lang, 'terms', overrides)}`,\n contacts: `${base}${pickSlug(lang, 'contacts', overrides)}`,\n };\n}\n","/* -------------------------------------------------------------------- */\n/* PublicFooter — default social-network URLs + brand icon components. */\n/* */\n/* AlfaDocs's four canonical social profiles. Consumers can subset via */\n/* `socials={[...]}` or override individual `href` values. */\n/* */\n/* Icons are small inline SVG components (paths from simpleicons.org) */\n/* rendered with `currentColor` so they inherit the footer's */\n/* `--muted-foreground` ink. Lucide-react does not ship brand glyphs, and */\n/* pulling a separate brand-icon package for four logos is not worth the */\n/* bundle cost. */\n/* -------------------------------------------------------------------- */\n\nimport type { ComponentType, SVGProps } from 'react';\n\nexport const SOCIAL_NETWORKS = [\n 'linkedin',\n 'youtube',\n 'instagram',\n 'facebook',\n] as const;\n\nexport type SocialNetwork = (typeof SOCIAL_NETWORKS)[number];\n\nexport const DEFAULT_SOCIAL_URLS: Record<SocialNetwork, string> = {\n linkedin: 'https://www.linkedin.com/company/alfadocs',\n youtube: 'https://www.youtube.com/@alfadocs',\n instagram: 'https://www.instagram.com/alfadocs',\n facebook: 'https://www.facebook.com/alfadocs',\n};\n\ntype IconProps = SVGProps<SVGSVGElement>;\ntype SocialIcon = ComponentType<IconProps>;\n\nconst baseProps = {\n viewBox: '0 0 24 24',\n fill: 'currentColor',\n xmlns: 'http://www.w3.org/2000/svg',\n} as const;\n\nconst LinkedinIcon: SocialIcon = (props) => (\n <svg {...baseProps} {...props}>\n <path d=\"M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 0 1-2.063-2.065 2.063 2.063 0 1 1 2.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z\" />\n </svg>\n);\n\nconst YoutubeIcon: SocialIcon = (props) => (\n <svg {...baseProps} {...props}>\n <path d=\"M23.498 6.186a3.016 3.016 0 0 0-2.122-2.136C19.505 3.545 12 3.545 12 3.545s-7.505 0-9.377.505A3.017 3.017 0 0 0 .502 6.186C0 8.07 0 12 0 12s0 3.93.502 5.814a3.016 3.016 0 0 0 2.122 2.136c1.871.505 9.376.505 9.376.505s7.505 0 9.377-.505a3.015 3.015 0 0 0 2.122-2.136C24 15.93 24 12 24 12s0-3.93-.502-5.814zM9.545 15.568V8.432L15.818 12l-6.273 3.568z\" />\n </svg>\n);\n\nconst InstagramIcon: SocialIcon = (props) => (\n <svg {...baseProps} {...props}>\n <path d=\"M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.266-.057 1.645-.069 4.849-.069zM12 0C8.741 0 8.333.014 7.053.072 2.695.272.273 2.69.073 7.052.014 8.333 0 8.741 0 12c0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98C8.333 23.986 8.741 24 12 24c3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98C15.668.014 15.259 0 12 0zm0 5.838a6.162 6.162 0 1 0 0 12.324 6.162 6.162 0 0 0 0-12.324zM12 16a4 4 0 1 1 0-8 4 4 0 0 1 0 8zm6.406-11.845a1.44 1.44 0 1 0 0 2.881 1.44 1.44 0 0 0 0-2.881z\" />\n </svg>\n);\n\nconst FacebookIcon: SocialIcon = (props) => (\n <svg {...baseProps} {...props}>\n <path d=\"M24 12.073c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.99 4.388 10.954 10.125 11.854v-8.385H7.078v-3.47h3.047V9.43c0-3.007 1.792-4.669 4.533-4.669 1.312 0 2.686.235 2.686.235v2.953H15.83c-1.491 0-1.956.925-1.956 1.874v2.25h3.328l-.532 3.47h-2.796v8.385C19.612 23.027 24 18.062 24 12.073z\" />\n </svg>\n);\n\nexport const SOCIAL_ICONS: Record<SocialNetwork, SocialIcon> = {\n linkedin: LinkedinIcon,\n youtube: YoutubeIcon,\n instagram: InstagramIcon,\n facebook: FacebookIcon,\n};\n","import {\n forwardRef,\n useImperativeHandle,\n useMemo,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Link } from '../link';\nimport { Separator } from '../separator';\nimport { Logo } from '../logo';\nimport {\n Accordion,\n AccordionContent,\n AccordionItem,\n AccordionTrigger,\n} from '../accordion';\nimport {\n composeLegalUrls,\n type LegalUrlOverrides,\n type ResolvedLegalUrls,\n} from './legal-urls';\nimport {\n DEFAULT_SOCIAL_URLS,\n SOCIAL_ICONS,\n SOCIAL_NETWORKS,\n type SocialNetwork,\n} from './socials';\n\n/* ------------------------------------------------------------------ */\n/* Constants */\n/* ------------------------------------------------------------------ */\n\nconst ENTITY_NAME = 'AlfaDocs GmbH';\nconst ENTITY_VAT = 'P.IVA DE301955405';\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst rootVariants = cva(\n [\n 'ds:w-full',\n 'ds:text-[color:var(--muted-foreground)]',\n 'ds:text-[length:var(--font-size-sm)]',\n 'ds:bg-[var(--background)]',\n ].join(' '),\n {\n variants: {\n variant: {\n minimal: [\n 'ds:py-[var(--spacing-sm)]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:border-block-start ds:border-[var(--border)]',\n ].join(' '),\n // 0.30.5: compact got a polish pass — bumped vertical padding to\n // `lg` (~24px) so the footer reads as a real landmark, not a\n // one-line afterthought, plus a stronger top border in\n // accessible mode (the default `--border` clears 3:1 in light /\n // dark; accessible bumps to a heavier weight).\n compact: [\n 'ds:py-[var(--spacing-lg)]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:border-block-start ds:border-[var(--border)]',\n 'ds:[.theme-accessible_&]:[border-block-start-width:2px]',\n ].join(' '),\n full: [\n 'ds:py-[var(--spacing-xl)]',\n 'ds:ps-[var(--spacing-lg)] ds:pe-[var(--spacing-lg)]',\n 'ds:bg-[var(--muted)]',\n ].join(' '),\n },\n },\n defaultVariants: { variant: 'compact' },\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* Public types */\n/* ------------------------------------------------------------------ */\n\nexport type PublicFooterVariant = NonNullable<\n VariantProps<typeof rootVariants>['variant']\n>;\n\nexport interface PublicFooterLink {\n href: string;\n label: string;\n /** When true, link opens in a new tab with the localised aria-label suffix. */\n external?: boolean;\n}\n\nexport interface PublicFooterLinkGroup {\n /** Stable key — used to look up the column heading via `t('ui.footer.group.<key>')`. */\n key: 'product' | 'resources' | 'company' | 'legal' | (string & {});\n links: PublicFooterLink[];\n}\n\nexport interface PublicFooterSocial {\n network: SocialNetwork;\n /** Override the kit's default URL. */\n href?: string;\n}\n\nexport interface PublicFooterProps {\n variant: PublicFooterVariant;\n /** Origin for legally-required URLs. Default: 'https://www.alfadocs.com'. */\n marketingBaseUrl?: string;\n /** Override individual legal-link slugs per locale. Rare. */\n legalUrlOverrides?: LegalUrlOverrides;\n /** `full` variant: consumer-supplied link columns. Legal column is always rendered. */\n linkGroups?: PublicFooterLinkGroup[];\n /** `full` variant: subset of social networks. Default: all four. Pass `[]` to hide the row. */\n socials?: PublicFooterSocial[];\n /** `full` variant: custom logo node. Default: kit's wordmark Logo. */\n logoSlot?: ReactNode;\n /** Extra surface-specific links — appended after the standard nav row in compact + full. Ignored by minimal. */\n extraNavSlot?: ReactNode;\n /** Trust badges (HIPAA, ISO). Rendered at the start of `minimal`'s row, or in the bottom strip of `full`. */\n trustBadgesSlot?: ReactNode;\n /**\n * @default true\n * Render the brand tagline (\"German technology, Italian design\") in the\n * bottom microcopy row of `compact` and `full` variants. Lean surfaces\n * (e.g. embedded booking widget) can opt out.\n */\n showTagline?: boolean;\n 'aria-label'?: string;\n id?: string;\n}\n\nexport interface PublicFooterHandle {\n getVariant: () => PublicFooterVariant;\n /** Resolved legal URLs for the current locale + marketingBaseUrl + overrides. */\n getLegalUrls: () => ResolvedLegalUrls;\n}\n\n/* ------------------------------------------------------------------ */\n/* Helpers */\n/* ------------------------------------------------------------------ */\n\n/** Allowlist consumer-supplied URLs — public marketing surface, defence in depth. */\nconst SAFE_HREF_RE = /^(https?:\\/\\/|mailto:|tel:|\\/(?!\\/))/i;\nfunction safeHref(href: string): string {\n return SAFE_HREF_RE.test(href) ? href : '#';\n}\n\nfunction CopyrightLine({\n copyright,\n align = 'center',\n}: {\n copyright: string;\n align?: 'start' | 'center';\n}) {\n return (\n <p\n className={[\n 'ds:m-0 ds:text-[color:var(--muted-foreground)]',\n 'ds:text-[length:var(--font-size-sm)]',\n align === 'center' ? 'ds:text-center' : 'ds:text-start',\n ].join(' ')}\n >\n {copyright}\n </p>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* PublicFooter */\n/* ------------------------------------------------------------------ */\n\nexport const PublicFooter = forwardRef<PublicFooterHandle, PublicFooterProps>(\n function PublicFooter(\n {\n variant,\n marketingBaseUrl,\n legalUrlOverrides,\n linkGroups,\n socials,\n logoSlot,\n extraNavSlot,\n trustBadgesSlot,\n showTagline = true,\n id,\n 'aria-label': ariaLabel,\n },\n ref,\n ) {\n const { t, i18n } = useTranslation('ui');\n\n const legalUrls = useMemo(\n () =>\n composeLegalUrls(i18n.language, marketingBaseUrl, legalUrlOverrides),\n [i18n.language, marketingBaseUrl, legalUrlOverrides],\n );\n\n useImperativeHandle(\n ref,\n () => ({\n getVariant: () => variant,\n getLegalUrls: () => legalUrls,\n }),\n [variant, legalUrls],\n );\n\n const year = new Date().getFullYear();\n const copyright = t('footer.copyright', {\n year,\n entity: ENTITY_NAME,\n vat: ENTITY_VAT,\n });\n const tagline = showTagline ? t('footer.tagline') : undefined;\n const landmarkLabel = ariaLabel ?? t('footer.nav.label');\n\n const labels = {\n privacy: t('footer.nav.privacy'),\n terms: t('footer.nav.terms'),\n contacts: t('footer.nav.contacts'),\n };\n\n const resolvedSocials = useMemo<PublicFooterSocial[]>(() => {\n if (socials !== undefined) return socials;\n return SOCIAL_NETWORKS.map((network) => ({ network }));\n }, [socials]);\n\n return (\n <footer\n id={id}\n role=\"contentinfo\"\n aria-label={landmarkLabel}\n data-component=\"public-footer\"\n data-variant={variant}\n className={rootVariants({ variant })}\n >\n {variant === 'minimal' && (\n <MinimalBody\n legalUrls={legalUrls}\n labels={labels}\n copyright={copyright}\n trustBadgesSlot={trustBadgesSlot}\n />\n )}\n {variant === 'compact' && (\n <CompactBody\n legalUrls={legalUrls}\n labels={labels}\n copyright={copyright}\n tagline={tagline}\n socials={resolvedSocials}\n logoSlot={logoSlot}\n extraNavSlot={extraNavSlot}\n t={t}\n />\n )}\n {variant === 'full' && (\n <FullBody\n legalUrls={legalUrls}\n labels={labels}\n copyright={copyright}\n tagline={tagline}\n linkGroups={linkGroups}\n socials={resolvedSocials}\n logoSlot={logoSlot}\n extraNavSlot={extraNavSlot}\n trustBadgesSlot={trustBadgesSlot}\n t={t}\n />\n )}\n </footer>\n );\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* Minimal */\n/* ------------------------------------------------------------------ */\n\nfunction MinimalBody({\n legalUrls,\n labels,\n copyright,\n trustBadgesSlot,\n}: {\n legalUrls: ResolvedLegalUrls;\n labels: { privacy: string; terms: string; contacts: string };\n copyright: string;\n trustBadgesSlot?: ReactNode;\n}) {\n return (\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:justify-center ds:gap-x-[var(--spacing-sm)] ds:gap-y-[var(--spacing-sm)]\">\n {trustBadgesSlot && (\n <span\n data-slot=\"trust-badges\"\n className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-sm)] ds:me-[var(--spacing-sm)]\"\n >\n {trustBadgesSlot}\n </span>\n )}\n <Link\n href={legalUrls.privacy}\n external\n externalIcon={false}\n intent=\"subtle\"\n >\n {labels.privacy}\n </Link>\n <Separator orientation=\"vertical\" className=\"ds:h-4\" />\n <Link\n href={legalUrls.terms}\n external\n externalIcon={false}\n intent=\"subtle\"\n >\n {labels.terms}\n </Link>\n <Separator orientation=\"vertical\" className=\"ds:h-4\" />\n <span>{copyright}</span>\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Compact */\n/* ------------------------------------------------------------------ */\n\n// Shared social-icon row — used by Compact and Full. Renders an icon\n// per enabled network; the parent decides where to drop it.\nfunction SocialIconList({\n socials,\n t,\n size,\n}: {\n socials: PublicFooterSocial[];\n t: TFunction;\n size: 'sm' | 'md';\n}) {\n if (socials.length === 0) return null;\n const iconClass = size === 'sm' ? 'ds:size-4' : 'ds:size-5';\n return (\n <ul\n data-slot=\"socials\"\n className=\"ds:list-none ds:m-0 ds:p-0 ds:flex ds:items-center ds:gap-[var(--spacing-xs)]\"\n >\n {socials.map((s) => {\n const Icon = SOCIAL_ICONS[s.network];\n const href = s.href ?? DEFAULT_SOCIAL_URLS[s.network];\n const label = t(`footer.social.aria.${s.network}`);\n return (\n <li key={s.network}>\n <Link\n href={safeHref(href)}\n external\n externalIcon={false}\n intent=\"subtle\"\n aria-label={label}\n className=\"ds:inline-flex ds:items-center ds:justify-center ds:min-w-[var(--min-target-size)] ds:min-h-[var(--min-target-size)]\"\n >\n <Icon\n aria-hidden=\"true\"\n className={iconClass}\n focusable=\"false\"\n />\n </Link>\n </li>\n );\n })}\n </ul>\n );\n}\n\nfunction CompactBody({\n legalUrls,\n labels,\n copyright,\n tagline,\n socials,\n logoSlot,\n extraNavSlot,\n t,\n}: {\n legalUrls: ResolvedLegalUrls;\n labels: { privacy: string; terms: string; contacts: string };\n copyright: string;\n tagline?: string;\n socials: PublicFooterSocial[];\n logoSlot?: ReactNode;\n extraNavSlot?: ReactNode;\n t: TFunction;\n}) {\n // 0.30.5: compact polish — defaults to a social-icon row + (small,\n // muted) wordmark at the start of the link row. Consumers who want\n // the lean treatment can opt out via `socials={[]}` (kills the row)\n // and `logoSlot={<></>}` (kills the wordmark). The lean fallback is\n // still a useful surface for embedded widgets (the booking aside).\n return (\n <div className=\"ds:flex ds:flex-col ds:items-center ds:gap-[var(--spacing-md)]\">\n {socials.length > 0 ? (\n <SocialIconList socials={socials} t={t} size=\"sm\" />\n ) : null}\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:justify-center ds:gap-x-[var(--spacing-sm)] ds:gap-y-[var(--spacing-sm)]\">\n {logoSlot !== undefined ? (\n logoSlot !== null && logoSlot !== false && logoSlot !== '' ? (\n <>\n <span\n data-slot=\"compact-logo\"\n className=\"ds:inline-flex ds:items-center ds:opacity-70\"\n >\n {logoSlot}\n </span>\n <Separator orientation=\"vertical\" className=\"ds:h-4\" />\n </>\n ) : null\n ) : (\n // No consumer override — render the kit's default small\n // wordmark, muted so it reads as marker not headline.\n <>\n <span\n data-slot=\"compact-logo\"\n className=\"ds:inline-flex ds:items-center ds:opacity-70\"\n >\n <Logo variant=\"wordmark\" tone=\"auto\" aria-label=\"AlfaDocs\" />\n </span>\n <Separator orientation=\"vertical\" className=\"ds:h-4\" />\n </>\n )}\n <Link\n href={legalUrls.privacy}\n external\n externalIcon={false}\n intent=\"subtle\"\n >\n {labels.privacy}\n </Link>\n <Separator orientation=\"vertical\" className=\"ds:h-4\" />\n <Link\n href={legalUrls.terms}\n external\n externalIcon={false}\n intent=\"subtle\"\n >\n {labels.terms}\n </Link>\n <Separator orientation=\"vertical\" className=\"ds:h-4\" />\n <Link\n href={legalUrls.contacts}\n external\n externalIcon={false}\n intent=\"subtle\"\n >\n {labels.contacts}\n </Link>\n {extraNavSlot && (\n <>\n <Separator orientation=\"vertical\" className=\"ds:h-4\" />\n <span data-slot=\"extra-nav\">{extraNavSlot}</span>\n </>\n )}\n </div>\n <CopyrightLine copyright={copyright} />\n {tagline ? (\n <p\n data-slot=\"tagline\"\n className=\"ds:m-0 ds:text-center ds:text-[color:var(--muted-foreground)] ds:text-[length:var(--font-size-xs)] ds:italic\"\n >\n {tagline}\n </p>\n ) : null}\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Full */\n/* ------------------------------------------------------------------ */\n\ntype TFunction = ReturnType<typeof useTranslation>['t'];\n\nfunction buildLegalColumn(\n legalUrls: ResolvedLegalUrls,\n labels: { privacy: string; terms: string; contacts: string },\n): PublicFooterLinkGroup {\n return {\n key: 'legal',\n links: [\n { href: legalUrls.privacy, label: labels.privacy, external: true },\n { href: legalUrls.terms, label: labels.terms, external: true },\n { href: legalUrls.contacts, label: labels.contacts, external: true },\n ],\n };\n}\n\nfunction FullBody({\n legalUrls,\n labels,\n copyright,\n tagline,\n linkGroups,\n socials,\n logoSlot,\n extraNavSlot,\n trustBadgesSlot,\n t,\n}: {\n legalUrls: ResolvedLegalUrls;\n labels: { privacy: string; terms: string; contacts: string };\n copyright: string;\n tagline?: string;\n linkGroups?: PublicFooterLinkGroup[];\n socials: PublicFooterSocial[];\n logoSlot?: ReactNode;\n extraNavSlot?: ReactNode;\n trustBadgesSlot?: ReactNode;\n t: TFunction;\n}) {\n // The kit-built Legal column is always appended — Privacy / Terms /\n // Contacts must render in every variant per the legal brief.\n const columns: PublicFooterLinkGroup[] = [\n ...(linkGroups ?? []),\n buildLegalColumn(legalUrls, labels),\n ];\n\n const brand = (\n <div\n data-slot=\"brand\"\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\"\n >\n <div className=\"ds:inline-flex\">\n {logoSlot ?? (\n <Logo variant=\"wordmark\" tone=\"auto\" aria-label=\"AlfaDocs\" />\n )}\n </div>\n <SocialIconList socials={socials} t={t} size=\"md\" />\n </div>\n );\n\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xl)]\">\n {/* Top: brand block on inline-start + link columns to inline-end */}\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xl)] ds:lg:flex-row ds:lg:items-start ds:lg:gap-[var(--spacing-xl)]\">\n <div className=\"ds:lg:w-[15rem] ds:lg:shrink-0\">{brand}</div>\n\n <div className=\"ds:flex-1 ds:min-w-0\">\n {/* md+ — grid of columns */}\n <div\n className=\"ds:hidden ds:md:grid ds:md:grid-cols-2 ds:lg:grid-cols-4 ds:gap-[var(--spacing-lg)]\"\n data-slot=\"link-columns-grid\"\n data-columns={columns.length}\n >\n <FullColumnsGrid columns={columns} t={t} />\n </div>\n\n {/* below md — accordion */}\n <div className=\"ds:md:hidden\" data-slot=\"link-columns-accordion\">\n <Accordion type=\"multiple\">\n {columns.map((group, i) => (\n <AccordionItem\n key={`${i}-${group.key}`}\n value={`${i}-${group.key}`}\n >\n <AccordionTrigger>\n {t(`footer.group.${group.key}`, {\n defaultValue: group.key,\n })}\n </AccordionTrigger>\n <AccordionContent>\n <ul className=\"ds:list-none ds:m-0 ds:p-0 ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n {group.links.map((link) => (\n <li key={`${group.key}-${link.href}-${link.label}`}>\n <Link\n href={safeHref(link.href)}\n external={link.external}\n externalIcon={false}\n intent=\"subtle\"\n >\n {link.label}\n </Link>\n </li>\n ))}\n </ul>\n </AccordionContent>\n </AccordionItem>\n ))}\n </Accordion>\n </div>\n </div>\n </div>\n\n <Separator orientation=\"horizontal\" />\n\n {/* Bottom strip: copyright inline-start, mini legal links inline-end\n on the same row. Stacks under sm. */}\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)] ds:sm:flex-row ds:sm:items-center ds:sm:justify-between\">\n <CopyrightLine copyright={copyright} align=\"start\" />\n <div\n data-slot=\"bottom-legal\"\n className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-sm)] ds:sm:justify-end\"\n >\n <Link\n href={legalUrls.privacy}\n external\n externalIcon={false}\n intent=\"subtle\"\n >\n {labels.privacy}\n </Link>\n <Separator orientation=\"vertical\" className=\"ds:h-4\" />\n <Link\n href={legalUrls.terms}\n external\n externalIcon={false}\n intent=\"subtle\"\n >\n {labels.terms}\n </Link>\n {(trustBadgesSlot || extraNavSlot) && (\n <>\n <Separator orientation=\"vertical\" className=\"ds:h-4\" />\n {trustBadgesSlot && (\n <span\n data-slot=\"trust-badges\"\n className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-sm)]\"\n >\n {trustBadgesSlot}\n </span>\n )}\n {extraNavSlot && (\n <span\n data-slot=\"extra-nav\"\n className=\"ds:inline-flex ds:items-center\"\n >\n {extraNavSlot}\n </span>\n )}\n </>\n )}\n </div>\n </div>\n\n {tagline ? (\n <p\n data-slot=\"tagline\"\n className=\"ds:m-0 ds:text-center ds:text-[color:var(--muted-foreground)] ds:text-[length:var(--font-size-xs)] ds:italic\"\n >\n {tagline}\n </p>\n ) : null}\n </div>\n );\n}\n\nfunction FullColumnsGrid({\n columns,\n t,\n}: {\n columns: PublicFooterLinkGroup[];\n t: TFunction;\n}) {\n return (\n <>\n {columns.map((group, i) => (\n <section\n key={`${i}-${group.key}`}\n aria-labelledby={`public-footer-group-${i}-${group.key}`}\n >\n {/* h3 so the footer's column headings don't collide with the host\n page's section h2 outline. */}\n <h3\n id={`public-footer-group-${i}-${group.key}`}\n className=\"ds:m-0 ds:mb-[var(--spacing-sm)] ds:text-[color:var(--foreground)] ds:text-[length:var(--font-size-sm)] ds:font-medium\"\n >\n {t(`footer.group.${group.key}`, { defaultValue: group.key })}\n </h3>\n <ul className=\"ds:list-none ds:m-0 ds:p-0 ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n {group.links.map((link) => (\n <li key={`${group.key}-${link.href}-${link.label}`}>\n <Link\n href={safeHref(link.href)}\n external={link.external}\n externalIcon={false}\n intent=\"subtle\"\n >\n {link.label}\n </Link>\n </li>\n ))}\n </ul>\n </section>\n ))}\n </>\n );\n}\n\nPublicFooter.displayName = 'PublicFooter';\n","/* -------------------------------------------------------------------- */\n/* Agent adapter — PublicFooter. */\n/* */\n/* PublicFooter is the kit's legally-grounded site footer with three */\n/* visual variants (minimal/compact/full). The adapter surfaces the */\n/* active variant + a `get_legal_urls` read so a host agent can verify */\n/* that the consumer's `marketingBaseUrl` + locale resolve to the */\n/* expected privacy / terms / contacts URLs without scraping DOM. */\n/* No write actions — the footer has no mutable state. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { PublicFooterHandle } from './public-footer';\n\nexport const publicFooterAgent: AgentAdapter<PublicFooterHandle> = {\n id: 'public-footer',\n capabilities: ['navigate'],\n state: {\n variant: {\n type: 'string',\n description: 'Active variant — one of `minimal`, `compact`, `full`.',\n read: (handle) => handle.getVariant(),\n },\n legalUrls: {\n type: 'object',\n description:\n 'Resolved legal URLs for the active locale + marketingBaseUrl + overrides: `{ privacy, terms, contacts }`.',\n read: (handle) => handle.getLegalUrls(),\n },\n },\n actions: {},\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'public-footer',\n description:\n 'Marks the PublicFooter root region. The root also carries `data-variant=\"minimal|compact|full\"` for CSS + agent selectors.',\n },\n instanceId: {\n attr: 'id',\n sourceProp: 'id',\n description: 'Sourced from the `id` prop when provided.',\n },\n },\n};\n"],"names":["DEFAULT_MARKETING_BASE_URL","ITALIAN_SLUGS","SLUGS","HTTPS_PREFIX","normaliseBaseUrl","input","pickSlug","locale","key","overrides","override","_a","localeSlug","_b","composeLegalUrls","marketingBaseUrl","base","lang","SOCIAL_NETWORKS","DEFAULT_SOCIAL_URLS","baseProps","LinkedinIcon","props","jsx","YoutubeIcon","InstagramIcon","FacebookIcon","SOCIAL_ICONS","ENTITY_NAME","ENTITY_VAT","rootVariants","cva","SAFE_HREF_RE","safeHref","href","CopyrightLine","copyright","align","PublicFooter","forwardRef","variant","legalUrlOverrides","linkGroups","socials","logoSlot","extraNavSlot","trustBadgesSlot","showTagline","id","ariaLabel","ref","t","i18n","useTranslation","legalUrls","useMemo","useImperativeHandle","year","tagline","landmarkLabel","labels","resolvedSocials","network","jsxs","MinimalBody","CompactBody","FullBody","Link","Separator","SocialIconList","size","iconClass","s","Icon","label","Fragment","Logo","buildLegalColumn","columns","FullColumnsGrid","Accordion","group","i","AccordionItem","AccordionTrigger","AccordionContent","link","publicFooterAgent","handle"],"mappings":"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"}