@alfadocs/ui-kit-debug 0.62.0 → 0.64.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (161) hide show
  1. package/dist/_chunks/{ai-prompt-input-C6sCr1Vi.js → ai-prompt-input-Dx8eXoPm.js} +2 -2
  2. package/dist/_chunks/{ai-prompt-input-C6sCr1Vi.js.map → ai-prompt-input-Dx8eXoPm.js.map} +1 -1
  3. package/dist/_chunks/{audio-recorder-D6OVfNiZ.js → audio-recorder-CdXuT9ln.js} +2 -2
  4. package/dist/_chunks/{audio-recorder-D6OVfNiZ.js.map → audio-recorder-CdXuT9ln.js.map} +1 -1
  5. package/dist/_chunks/{bishop-score-B9tvgoIq.js → bishop-score-CzjSx-dm.js} +2 -2
  6. package/dist/_chunks/{bishop-score-B9tvgoIq.js.map → bishop-score-CzjSx-dm.js.map} +1 -1
  7. package/dist/_chunks/{booking-BUV9fspj.js → booking-ChfvWy3P.js} +2 -2
  8. package/dist/_chunks/{booking-BUV9fspj.js.map → booking-ChfvWy3P.js.map} +1 -1
  9. package/dist/_chunks/{care-plan-card-QmNpGggC.js → care-plan-card-DhZNoXs4.js} +2 -2
  10. package/dist/_chunks/{care-plan-card-QmNpGggC.js.map → care-plan-card-DhZNoXs4.js.map} +1 -1
  11. package/dist/_chunks/{care-plan-entry-card-Cnra7vUc.js → care-plan-entry-card-DW70yBOD.js} +2 -2
  12. package/dist/_chunks/{care-plan-entry-card-Cnra7vUc.js.map → care-plan-entry-card-DW70yBOD.js.map} +1 -1
  13. package/dist/_chunks/{editable-currency-cell-renderer-D5C5tCfu.js → editable-currency-cell-renderer-BQgaKFCz.js} +2 -2
  14. package/dist/_chunks/{editable-currency-cell-renderer-D5C5tCfu.js.map → editable-currency-cell-renderer-BQgaKFCz.js.map} +1 -1
  15. package/dist/_chunks/finished-terminal-VjZ_-eDD.js +122 -0
  16. package/dist/_chunks/finished-terminal-VjZ_-eDD.js.map +1 -0
  17. package/dist/_chunks/{gestational-age-calculator-AkNFfZYs.js → gestational-age-calculator-D85E8lGN.js} +2 -2
  18. package/dist/_chunks/{gestational-age-calculator-AkNFfZYs.js.map → gestational-age-calculator-D85E8lGN.js.map} +1 -1
  19. package/dist/_chunks/{pregnancy-dating-Dg6dTe1p.js → pregnancy-dating-7NUaAfob.js} +2 -2
  20. package/dist/_chunks/{pregnancy-dating-Dg6dTe1p.js.map → pregnancy-dating-7NUaAfob.js.map} +1 -1
  21. package/dist/_chunks/{select-hsCaJSX3.js → select-CEtRcon5.js} +46 -45
  22. package/dist/_chunks/select-CEtRcon5.js.map +1 -0
  23. package/dist/_chunks/{tabs-BpPYVme_.js → tabs-BIQ0ew1T.js} +2 -2
  24. package/dist/_chunks/{tabs-BpPYVme_.js.map → tabs-BIQ0ew1T.js.map} +1 -1
  25. package/dist/_chunks/tooth-scheme-CiphQaON.js +1257 -0
  26. package/dist/_chunks/tooth-scheme-CiphQaON.js.map +1 -0
  27. package/dist/_chunks/{unit-converter-3sINXO3m.js → unit-converter-BIbXHIQA.js} +2 -2
  28. package/dist/_chunks/{unit-converter-3sINXO3m.js.map → unit-converter-BIbXHIQA.js.map} +1 -1
  29. package/dist/_chunks/use-countdown-Yd6ts0_a.js +26 -0
  30. package/dist/_chunks/use-countdown-Yd6ts0_a.js.map +1 -0
  31. package/dist/agent-catalog.json +55 -4
  32. package/dist/components/ai-prompt-input/index.js +1 -1
  33. package/dist/components/audio-recorder/index.js +1 -1
  34. package/dist/components/bishop-score/index.js +1 -1
  35. package/dist/components/booking/index.js +1 -1
  36. package/dist/components/care-plan-card/index.js +1 -1
  37. package/dist/components/care-plan-entry-card/index.js +1 -1
  38. package/dist/components/data-table/index.js +1 -1
  39. package/dist/components/finished-terminal/finished-terminal.d.ts +55 -0
  40. package/dist/components/finished-terminal/finished-terminal.d.ts.map +1 -0
  41. package/dist/components/finished-terminal/index.d.ts +3 -0
  42. package/dist/components/finished-terminal/index.d.ts.map +1 -0
  43. package/dist/components/finished-terminal/index.js +5 -0
  44. package/dist/components/finished-terminal/index.js.map +1 -0
  45. package/dist/components/gestational-age-calculator/index.js +1 -1
  46. package/dist/components/index.d.ts +1 -0
  47. package/dist/components/index.d.ts.map +1 -1
  48. package/dist/components/pregnancy-dating/index.js +1 -1
  49. package/dist/components/select/index.js +1 -1
  50. package/dist/components/select/select.d.ts +8 -0
  51. package/dist/components/select/select.d.ts.map +1 -1
  52. package/dist/components/tabs/index.js +1 -1
  53. package/dist/components/tooth-scheme/index.d.ts +2 -2
  54. package/dist/components/tooth-scheme/index.d.ts.map +1 -1
  55. package/dist/components/tooth-scheme/index.js +22 -15
  56. package/dist/components/tooth-scheme/tooth-data.d.ts +79 -18
  57. package/dist/components/tooth-scheme/tooth-data.d.ts.map +1 -1
  58. package/dist/components/tooth-scheme/tooth-scheme.agent.d.ts +2 -0
  59. package/dist/components/tooth-scheme/tooth-scheme.agent.d.ts.map +1 -1
  60. package/dist/components/tooth-scheme/tooth-scheme.d.ts +48 -1
  61. package/dist/components/tooth-scheme/tooth-scheme.d.ts.map +1 -1
  62. package/dist/components/unit-converter/index.js +1 -1
  63. package/dist/hooks/index.js +79 -99
  64. package/dist/hooks/index.js.map +1 -1
  65. package/dist/i18n/locales/ar.d.ts +22 -0
  66. package/dist/i18n/locales/ar.d.ts.map +1 -1
  67. package/dist/i18n/locales/ar.js +23 -1
  68. package/dist/i18n/locales/ar.js.map +1 -1
  69. package/dist/i18n/locales/de.d.ts +22 -0
  70. package/dist/i18n/locales/de.d.ts.map +1 -1
  71. package/dist/i18n/locales/de.js +23 -1
  72. package/dist/i18n/locales/de.js.map +1 -1
  73. package/dist/i18n/locales/el.d.ts +22 -0
  74. package/dist/i18n/locales/el.d.ts.map +1 -1
  75. package/dist/i18n/locales/el.js +23 -1
  76. package/dist/i18n/locales/el.js.map +1 -1
  77. package/dist/i18n/locales/en.d.ts +22 -0
  78. package/dist/i18n/locales/en.d.ts.map +1 -1
  79. package/dist/i18n/locales/en.js +23 -1
  80. package/dist/i18n/locales/en.js.map +1 -1
  81. package/dist/i18n/locales/es.d.ts +22 -0
  82. package/dist/i18n/locales/es.d.ts.map +1 -1
  83. package/dist/i18n/locales/es.js +23 -1
  84. package/dist/i18n/locales/es.js.map +1 -1
  85. package/dist/i18n/locales/fr.d.ts +22 -0
  86. package/dist/i18n/locales/fr.d.ts.map +1 -1
  87. package/dist/i18n/locales/fr.js +23 -1
  88. package/dist/i18n/locales/fr.js.map +1 -1
  89. package/dist/i18n/locales/hi.d.ts +22 -0
  90. package/dist/i18n/locales/hi.d.ts.map +1 -1
  91. package/dist/i18n/locales/hi.js +23 -1
  92. package/dist/i18n/locales/hi.js.map +1 -1
  93. package/dist/i18n/locales/it.d.ts +22 -0
  94. package/dist/i18n/locales/it.d.ts.map +1 -1
  95. package/dist/i18n/locales/it.js +23 -1
  96. package/dist/i18n/locales/it.js.map +1 -1
  97. package/dist/i18n/locales/ja.d.ts +22 -0
  98. package/dist/i18n/locales/ja.d.ts.map +1 -1
  99. package/dist/i18n/locales/ja.js +23 -1
  100. package/dist/i18n/locales/ja.js.map +1 -1
  101. package/dist/i18n/locales/nl.d.ts +22 -0
  102. package/dist/i18n/locales/nl.d.ts.map +1 -1
  103. package/dist/i18n/locales/nl.js +23 -1
  104. package/dist/i18n/locales/nl.js.map +1 -1
  105. package/dist/i18n/locales/pl.d.ts +22 -0
  106. package/dist/i18n/locales/pl.d.ts.map +1 -1
  107. package/dist/i18n/locales/pl.js +23 -1
  108. package/dist/i18n/locales/pl.js.map +1 -1
  109. package/dist/i18n/locales/pt.d.ts +22 -0
  110. package/dist/i18n/locales/pt.d.ts.map +1 -1
  111. package/dist/i18n/locales/pt.js +23 -1
  112. package/dist/i18n/locales/pt.js.map +1 -1
  113. package/dist/i18n/locales/ro.d.ts +22 -0
  114. package/dist/i18n/locales/ro.d.ts.map +1 -1
  115. package/dist/i18n/locales/ro.js +23 -1
  116. package/dist/i18n/locales/ro.js.map +1 -1
  117. package/dist/i18n/locales/ru.d.ts +22 -0
  118. package/dist/i18n/locales/ru.d.ts.map +1 -1
  119. package/dist/i18n/locales/ru.js +23 -1
  120. package/dist/i18n/locales/ru.js.map +1 -1
  121. package/dist/i18n/locales/sq.d.ts +22 -0
  122. package/dist/i18n/locales/sq.d.ts.map +1 -1
  123. package/dist/i18n/locales/sq.js +23 -1
  124. package/dist/i18n/locales/sq.js.map +1 -1
  125. package/dist/i18n/locales/sv.d.ts +22 -0
  126. package/dist/i18n/locales/sv.d.ts.map +1 -1
  127. package/dist/i18n/locales/sv.js +23 -1
  128. package/dist/i18n/locales/sv.js.map +1 -1
  129. package/dist/i18n/locales/tr.d.ts +22 -0
  130. package/dist/i18n/locales/tr.d.ts.map +1 -1
  131. package/dist/i18n/locales/tr.js +23 -1
  132. package/dist/i18n/locales/tr.js.map +1 -1
  133. package/dist/i18n/locales/zh.d.ts +22 -0
  134. package/dist/i18n/locales/zh.d.ts.map +1 -1
  135. package/dist/i18n/locales/zh.js +23 -1
  136. package/dist/i18n/locales/zh.js.map +1 -1
  137. package/dist/index.js +354 -345
  138. package/dist/index.js.map +1 -1
  139. package/dist/locales/ar.json +23 -1
  140. package/dist/locales/de.json +23 -1
  141. package/dist/locales/el.json +23 -1
  142. package/dist/locales/en.json +23 -1
  143. package/dist/locales/es.json +23 -1
  144. package/dist/locales/fr.json +23 -1
  145. package/dist/locales/hi.json +23 -1
  146. package/dist/locales/it.json +23 -1
  147. package/dist/locales/ja.json +23 -1
  148. package/dist/locales/nl.json +23 -1
  149. package/dist/locales/pl.json +23 -1
  150. package/dist/locales/pt.json +23 -1
  151. package/dist/locales/ro.json +23 -1
  152. package/dist/locales/ru.json +23 -1
  153. package/dist/locales/sq.json +23 -1
  154. package/dist/locales/sv.json +23 -1
  155. package/dist/locales/tr.json +23 -1
  156. package/dist/locales/zh.json +23 -1
  157. package/dist/tokens.css +1 -1
  158. package/package.json +5 -1
  159. package/dist/_chunks/select-hsCaJSX3.js.map +0 -1
  160. package/dist/_chunks/tooth-scheme-CxlsLjfN.js +0 -753
  161. package/dist/_chunks/tooth-scheme-CxlsLjfN.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"booking-BUV9fspj.js","sources":["../../node_modules/lucide-react/dist/esm/icons/activity.js","../../node_modules/lucide-react/dist/esm/icons/baby.js","../../node_modules/lucide-react/dist/esm/icons/bone.js","../../node_modules/lucide-react/dist/esm/icons/brain.js","../../node_modules/lucide-react/dist/esm/icons/calendar-range.js","../../node_modules/lucide-react/dist/esm/icons/clipboard-check.js","../../node_modules/lucide-react/dist/esm/icons/ear.js","../../node_modules/lucide-react/dist/esm/icons/microscope.js","../../node_modules/lucide-react/dist/esm/icons/pill.js","../../node_modules/lucide-react/dist/esm/icons/scissors.js","../../node_modules/lucide-react/dist/esm/icons/smile.js","../../node_modules/lucide-react/dist/esm/icons/sunset.js","../../node_modules/lucide-react/dist/esm/icons/syringe.js","../../node_modules/date-fns/subMonths.js","../../src/components/booking/booking.agent.ts","../../src/components/booking/booking-types.ts","../../src/components/booking/cascade.ts","../../src/components/booking/details-form.tsx","../../src/components/booking/booking.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 [\n \"path\",\n {\n d: \"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2\",\n key: \"169zse\"\n }\n ]\n];\nconst Activity = createLucideIcon(\"activity\", __iconNode);\n\nexport { __iconNode, Activity as default };\n//# sourceMappingURL=activity.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 [\"path\", { d: \"M10 16c.5.3 1.2.5 2 .5s1.5-.2 2-.5\", key: \"1u7htd\" }],\n [\"path\", { d: \"M15 12h.01\", key: \"1k8ypt\" }],\n [\n \"path\",\n {\n d: \"M19.38 6.813A9 9 0 0 1 20.8 10.2a2 2 0 0 1 0 3.6 9 9 0 0 1-17.6 0 2 2 0 0 1 0-3.6A9 9 0 0 1 12 3c2 0 3.5 1.1 3.5 2.5s-.9 2.5-2 2.5c-.8 0-1.5-.4-1.5-1\",\n key: \"11xh7x\"\n }\n ],\n [\"path\", { d: \"M9 12h.01\", key: \"157uk2\" }]\n];\nconst Baby = createLucideIcon(\"baby\", __iconNode);\n\nexport { __iconNode, Baby as default };\n//# sourceMappingURL=baby.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: \"M17 10c.7-.7 1.69 0 2.5 0a2.5 2.5 0 1 0 0-5 .5.5 0 0 1-.5-.5 2.5 2.5 0 1 0-5 0c0 .81.7 1.8 0 2.5l-7 7c-.7.7-1.69 0-2.5 0a2.5 2.5 0 0 0 0 5c.28 0 .5.22.5.5a2.5 2.5 0 1 0 5 0c0-.81-.7-1.8 0-2.5Z\",\n key: \"w610uw\"\n }\n ]\n];\nconst Bone = createLucideIcon(\"bone\", __iconNode);\n\nexport { __iconNode, Bone as default };\n//# sourceMappingURL=bone.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 [\"path\", { d: \"M12 18V5\", key: \"adv99a\" }],\n [\"path\", { d: \"M15 13a4.17 4.17 0 0 1-3-4 4.17 4.17 0 0 1-3 4\", key: \"1e3is1\" }],\n [\"path\", { d: \"M17.598 6.5A3 3 0 1 0 12 5a3 3 0 1 0-5.598 1.5\", key: \"1gqd8o\" }],\n [\"path\", { d: \"M17.997 5.125a4 4 0 0 1 2.526 5.77\", key: \"iwvgf7\" }],\n [\"path\", { d: \"M18 18a4 4 0 0 0 2-7.464\", key: \"efp6ie\" }],\n [\"path\", { d: \"M19.967 17.483A4 4 0 1 1 12 18a4 4 0 1 1-7.967-.517\", key: \"1gq6am\" }],\n [\"path\", { d: \"M6 18a4 4 0 0 1-2-7.464\", key: \"k1g0md\" }],\n [\"path\", { d: \"M6.003 5.125a4 4 0 0 0-2.526 5.77\", key: \"q97ue3\" }]\n];\nconst Brain = createLucideIcon(\"brain\", __iconNode);\n\nexport { __iconNode, Brain as default };\n//# sourceMappingURL=brain.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 [\"rect\", { width: \"18\", height: \"18\", x: \"3\", y: \"4\", rx: \"2\", key: \"1hopcy\" }],\n [\"path\", { d: \"M16 2v4\", key: \"4m81vk\" }],\n [\"path\", { d: \"M3 10h18\", key: \"8toen8\" }],\n [\"path\", { d: \"M8 2v4\", key: \"1cmpym\" }],\n [\"path\", { d: \"M17 14h-6\", key: \"bkmgh3\" }],\n [\"path\", { d: \"M13 18H7\", key: \"bb0bb7\" }],\n [\"path\", { d: \"M7 14h.01\", key: \"1qa3f1\" }],\n [\"path\", { d: \"M17 18h.01\", key: \"1bdyru\" }]\n];\nconst CalendarRange = createLucideIcon(\"calendar-range\", __iconNode);\n\nexport { __iconNode, CalendarRange as default };\n//# sourceMappingURL=calendar-range.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 [\"rect\", { width: \"8\", height: \"4\", x: \"8\", y: \"2\", rx: \"1\", ry: \"1\", key: \"tgr4d6\" }],\n [\n \"path\",\n {\n d: \"M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2\",\n key: \"116196\"\n }\n ],\n [\"path\", { d: \"m9 14 2 2 4-4\", key: \"df797q\" }]\n];\nconst ClipboardCheck = createLucideIcon(\"clipboard-check\", __iconNode);\n\nexport { __iconNode, ClipboardCheck as default };\n//# sourceMappingURL=clipboard-check.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 [\"path\", { d: \"M6 8.5a6.5 6.5 0 1 1 13 0c0 6-6 6-6 10a3.5 3.5 0 1 1-7 0\", key: \"1dfaln\" }],\n [\"path\", { d: \"M15 8.5a2.5 2.5 0 0 0-5 0v1a2 2 0 1 1 0 4\", key: \"1qnva7\" }]\n];\nconst Ear = createLucideIcon(\"ear\", __iconNode);\n\nexport { __iconNode, Ear as default };\n//# sourceMappingURL=ear.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 [\"path\", { d: \"M6 18h8\", key: \"1borvv\" }],\n [\"path\", { d: \"M3 22h18\", key: \"8prr45\" }],\n [\"path\", { d: \"M14 22a7 7 0 1 0 0-14h-1\", key: \"1jwaiy\" }],\n [\"path\", { d: \"M9 14h2\", key: \"197e7h\" }],\n [\"path\", { d: \"M9 12a2 2 0 0 1-2-2V6h6v4a2 2 0 0 1-2 2Z\", key: \"1bmzmy\" }],\n [\"path\", { d: \"M12 6V3a1 1 0 0 0-1-1H9a1 1 0 0 0-1 1v3\", key: \"1drr47\" }]\n];\nconst Microscope = createLucideIcon(\"microscope\", __iconNode);\n\nexport { __iconNode, Microscope as default };\n//# sourceMappingURL=microscope.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 { d: \"m10.5 20.5 10-10a4.95 4.95 0 1 0-7-7l-10 10a4.95 4.95 0 1 0 7 7Z\", key: \"wa1lgi\" }\n ],\n [\"path\", { d: \"m8.5 8.5 7 7\", key: \"rvfmvr\" }]\n];\nconst Pill = createLucideIcon(\"pill\", __iconNode);\n\nexport { __iconNode, Pill as default };\n//# sourceMappingURL=pill.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 [\"circle\", { cx: \"6\", cy: \"6\", r: \"3\", key: \"1lh9wr\" }],\n [\"path\", { d: \"M8.12 8.12 12 12\", key: \"1alkpv\" }],\n [\"path\", { d: \"M20 4 8.12 15.88\", key: \"xgtan2\" }],\n [\"circle\", { cx: \"6\", cy: \"18\", r: \"3\", key: \"fqmcym\" }],\n [\"path\", { d: \"M14.8 14.8 20 20\", key: \"ptml3r\" }]\n];\nconst Scissors = createLucideIcon(\"scissors\", __iconNode);\n\nexport { __iconNode, Scissors as default };\n//# sourceMappingURL=scissors.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 [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"M8 14s1.5 2 4 2 4-2 4-2\", key: \"1y1vjs\" }],\n [\"line\", { x1: \"9\", x2: \"9.01\", y1: \"9\", y2: \"9\", key: \"yxxnd0\" }],\n [\"line\", { x1: \"15\", x2: \"15.01\", y1: \"9\", y2: \"9\", key: \"1p4y9e\" }]\n];\nconst Smile = createLucideIcon(\"smile\", __iconNode);\n\nexport { __iconNode, Smile as default };\n//# sourceMappingURL=smile.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 [\"path\", { d: \"M12 10V2\", key: \"16sf7g\" }],\n [\"path\", { d: \"m4.93 10.93 1.41 1.41\", key: \"2a7f42\" }],\n [\"path\", { d: \"M2 18h2\", key: \"j10viu\" }],\n [\"path\", { d: \"M20 18h2\", key: \"wocana\" }],\n [\"path\", { d: \"m19.07 10.93-1.41 1.41\", key: \"15zs5n\" }],\n [\"path\", { d: \"M22 22H2\", key: \"19qnx5\" }],\n [\"path\", { d: \"m16 6-4 4-4-4\", key: \"6wukr\" }],\n [\"path\", { d: \"M16 18a4 4 0 0 0-8 0\", key: \"1lzouq\" }]\n];\nconst Sunset = createLucideIcon(\"sunset\", __iconNode);\n\nexport { __iconNode, Sunset as default };\n//# sourceMappingURL=sunset.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 [\"path\", { d: \"m18 2 4 4\", key: \"22kx64\" }],\n [\"path\", { d: \"m17 7 3-3\", key: \"1w1zoj\" }],\n [\"path\", { d: \"M19 9 8.7 19.3c-1 1-2.5 1-3.4 0l-.6-.6c-1-1-1-2.5 0-3.4L15 5\", key: \"1exhtz\" }],\n [\"path\", { d: \"m9 11 4 4\", key: \"rovt3i\" }],\n [\"path\", { d: \"m5 19-3 3\", key: \"59f2uf\" }],\n [\"path\", { d: \"m14 4 6 6\", key: \"yqp9t2\" }]\n];\nconst Syringe = createLucideIcon(\"syringe\", __iconNode);\n\nexport { __iconNode, Syringe as default };\n//# sourceMappingURL=syringe.js.map\n","import { addMonths } from \"./addMonths.js\";\n\n/**\n * The subMonths function options.\n */\n\n/**\n * @name subMonths\n * @category Month Helpers\n * @summary Subtract the specified number of months from the given date.\n *\n * @description\n * Subtract the specified number of months from the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param amount - The amount of months to be subtracted.\n * @param options - An object with options\n *\n * @returns The new date with the months subtracted\n *\n * @example\n * // Subtract 5 months from 1 February 2015:\n * const result = subMonths(new Date(2015, 1, 1), 5)\n * //=> Mon Sep 01 2014 00:00:00\n */\nexport function subMonths(date, amount, options) {\n return addMonths(date, -amount, options);\n}\n\n// Fallback for modularized imports:\nexport default subMonths;\n","/* -------------------------------------------------------------------- */\n/* Agent adapter — Booking (0.26.0). */\n/* */\n/* The Booking component consolidates the seven-step patient booking */\n/* flow into a single component. The adapter exposes variant + step */\n/* navigation. The booking value itself is owned by the consumer and */\n/* flows through `value` / `onChange` — never read here (PHI: patient */\n/* identity + contact stays on the page). */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { BookingHandle } from './booking-types';\n\nexport const bookingAgent: AgentAdapter<BookingHandle> = {\n id: 'booking',\n capabilities: ['navigate', 'view_change'],\n state: {\n variant: {\n type: 'string',\n descriptionKey: 'ui.agent.booking.state.variant',\n description:\n 'Active variant — one of `inline-list`, `accordion`, `calendar`, `flexible`, `progress`.',\n read: (handle) => handle.getVariant(),\n },\n },\n actions: {\n reset: {\n safety: 'write',\n descriptionKey: 'ui.agent.booking.actions.reset',\n description:\n 'Clear the booking value back to an empty state. Use to abandon an in-progress flow.',\n invoke: (handle) => {\n handle.reset();\n },\n },\n goto_step: {\n safety: 'read',\n argsType: '{ step: 1 | 2 | 3 | 4 | 5 | 6 | 7 }',\n descriptionKey: 'ui.agent.booking.actions.gotoStep',\n description:\n 'Jump to the given step. Implementations may clamp to the first incomplete step if the requested one is not reachable yet.',\n invoke: (handle, args: { step: 1 | 2 | 3 | 4 | 5 | 6 | 7 }) => {\n handle.goToStep(args.step);\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'booking',\n description: 'Marks the Booking root region.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","/* -------------------------------------------------------------------- */\n/* Booking — public type surface (0.26.0). */\n/* */\n/* Re-exported from `booking.tsx`. Lives in its own module so */\n/* `cascade.ts` can import the types without a circular dependency on */\n/* the main component file. */\n/* -------------------------------------------------------------------- */\n\nimport type { ComponentPropsWithoutRef, ReactNode } from 'react';\n\n/* -------------------------------------------------------------------- */\n/* Variant */\n/* -------------------------------------------------------------------- */\n\nexport type BookingVariant =\n | 'inline-list'\n | 'accordion'\n | 'calendar'\n | 'flexible'\n | 'progress';\n\n/* -------------------------------------------------------------------- */\n/* Domain shapes */\n/* -------------------------------------------------------------------- */\n\nexport type InsuranceType = 'private' | 'public';\n\n/** Channels the patient can pick to receive the confirmation link. */\nexport type ConfirmationChannel = 'email' | 'whatsapp' | 'sms';\n\n/** Fixed order — email first, then WhatsApp, then SMS. */\nexport const CONFIRMATION_CHANNEL_ORDER: readonly ConfirmationChannel[] = [\n 'email',\n 'whatsapp',\n 'sms',\n] as const;\n\nexport interface BookingSpecialty {\n id: string;\n label: string;\n /** Optional ordering hint; falls back to array order. */\n sequenceNumber?: number;\n /** Restrict to operators-on-page when lockedOperatorId is set. */\n operatorIds?: string[];\n}\n\nexport interface BookingService {\n id: string;\n label: string;\n /** Minutes — required for slot fetching. */\n durationMin: number;\n /** Required when useSpecialties is true. */\n specialtyId?: string;\n /** Operators who can perform this service. */\n operatorIds?: string[];\n}\n\nexport interface BookingOperator {\n id: string;\n name: string;\n specialtyIds?: string[];\n appointmentBookingReasonIds?: string[];\n}\n\nexport interface BookingSlot {\n /** Opaque unique key within `availableSlots[date]`. */\n key: string;\n /** HH:mm 24h — used for display. */\n time: string;\n available: boolean;\n /** Opaque passthrough so the consumer can resolve operatorId / chairId\n * / dateTime when `onSubmit` fires. */\n meta?: Record<string, unknown>;\n}\n\nexport interface BookingDetails {\n firstName: string;\n lastName: string;\n email: string;\n mobilePhone: string;\n privacyConsent: boolean;\n termsConsent: boolean;\n // Opt-in fields — typed optional, required only when their `require*`\n // prop is true on `BookingProps`.\n codiceFiscale?: string;\n dateOfBirth?: string;\n insuranceNumber?: string;\n // Optional, gated by `show*` props.\n note?: string;\n returningPatient?: boolean;\n /**\n * Channels the patient picked for the confirmation link. Guaranteed to\n * be a non-empty subset of the practice's enabled `confirmationChannels`\n * when present. Omitted when only one channel is enabled (implicit —\n * backend infers from the practice config).\n */\n confirmationChannels?: ConfirmationChannel[];\n}\n\nexport interface BookingValue {\n insuranceType?: InsuranceType;\n specialtyId?: string;\n /**\n * Multi-select form of `specialtyId` — set this instead of (or alongside)\n * `specialtyId` when `specialtyPickerStyle='multi-select'`. The cascade\n * reads this array first and treats services / operators / slots as a\n * union of the selected specialties. When both are set, the array wins.\n * Added in 0.34.0.\n */\n specialtyIds?: string[];\n serviceId?: string;\n /**\n * Multi-select form of `serviceId` — see `specialtyIds`. Set when\n * `servicePickerStyle='multi-select'`. Union semantics. Added in 0.34.0.\n */\n serviceIds?: string[];\n /** May be the literal `'all'` sentinel to mean \"no operator preference\". */\n operatorId?: string;\n /**\n * Multi-select form of `operatorId` — see `specialtyIds`. Set when\n * `operatorPickerStyle='multi-select'`. The kit doesn't filter slots by\n * operator itself (the consumer owns slot resolution), but consumers\n * using multi-select operator typically filter `availableSlots` to the\n * union of `operatorIds` before passing the data in. Added in 0.34.0.\n */\n operatorIds?: string[];\n /** YYYY-MM-DD. */\n date?: string;\n /** Opaque key from `availableSlots[date]`. */\n slotKey?: string;\n /** Partial details — fully populated when the user is ready to submit. */\n details?: Partial<BookingDetails>;\n}\n\n/* -------------------------------------------------------------------- */\n/* Submit payload — fully resolved. */\n/* -------------------------------------------------------------------- */\n\nexport interface BookingSubmitPayload {\n slot: BookingSlot;\n value: BookingValue;\n /** Fully populated + validated (privacy + terms ticked, required fields filled). */\n details: BookingDetails;\n}\n\n/* -------------------------------------------------------------------- */\n/* Async validator return shape */\n/* -------------------------------------------------------------------- */\n\nexport interface BookingValidationResult {\n valid: boolean;\n /** Optional localised hint shown next to the field on failure. */\n hint?: string;\n}\n\nexport type BookingValidator = (\n value: string,\n) => Promise<BookingValidationResult>;\n\n/* -------------------------------------------------------------------- */\n/* Imperative handle */\n/* -------------------------------------------------------------------- */\n\nexport interface BookingHandle {\n getVariant: () => BookingVariant;\n /** Clear `value` back to an empty state via `onChange`. */\n reset: () => void;\n /**\n * Jump to a specific step. Implementations may clamp to the first\n * incomplete step if the requested one isn't reachable yet.\n */\n goToStep: (step: 1 | 2 | 3 | 4 | 5 | 6 | 7) => void;\n}\n\n/* -------------------------------------------------------------------- */\n/* Component props */\n/* -------------------------------------------------------------------- */\n\nexport interface BookingProps extends Omit<\n ComponentPropsWithoutRef<'div'>,\n 'aria-label' | 'onChange' | 'onSubmit'\n> {\n variant?: BookingVariant;\n\n // Policy\n country?: string;\n useSpecialties?: boolean;\n allowOperatorSelection?: boolean;\n /** Pins step 4 to this operator. */\n lockedOperatorId?: string;\n\n // Data (any may be empty — the cascade handles it)\n specialties?: BookingSpecialty[];\n services: BookingService[];\n operators?: BookingOperator[];\n availableDates: string[];\n availableSlots: Record<string, BookingSlot[]>;\n /** Server-side hint of the next free date when the current window is empty. */\n nextAvailableDate?: string;\n\n // Step 7 controls (all opt-in, default false)\n requireCodiceFiscale?: boolean;\n requireDateOfBirth?: boolean;\n requireInsuranceNumber?: boolean;\n showNote?: boolean;\n showReturningPatientFlag?: boolean;\n privacyPolicyUrl?: string;\n termsUrl?: string;\n\n // Validation hooks (consumer-injected)\n validateCodiceFiscale?: BookingValidator;\n validateInsuranceNumber?: BookingValidator;\n\n // Auto-select policy\n /** Default: false. Specialty auto-select on length=1 is always on. */\n autoSelectSingleService?: boolean;\n\n // Confirmation-channel delivery\n /**\n * Channels the practice has enabled. The picker renders one checkbox\n * per channel; when length === 1, the picker is hidden and the single\n * channel is implicit. Defaults to `['email']` when omitted.\n */\n confirmationChannels?: ConfirmationChannel[];\n /**\n * Pre-checked channels. Intersected with `confirmationChannels` for\n * safety. When omitted, the kit applies a smart default (always email;\n * +whatsapp when mobile is plausibly filled; +sms when whatsapp isn't\n * available).\n */\n defaultConfirmationChannels?: ConfirmationChannel[];\n\n // State\n value: BookingValue;\n onChange: (next: BookingValue) => void;\n onSubmit: (payload: BookingSubmitPayload) => void | Promise<void>;\n\n // UX\n /**\n * Calendar/date-strip shimmer — set true while `availableDates` is being\n * fetched. When omitted, the kit falls back to `loadingSlots` for the\n * calendar shimmer (the long-standing behaviour). Split from\n * `loadingSlots` in 0.33.9 so consumers using a two-query pattern\n * (\"which days have availability\" + per-day slot fetch) can shimmer\n * the calendar independently of the slot list — without this split a\n * per-day slot fetch re-shimmers the whole calendar on every date click.\n */\n loadingDates?: boolean;\n /**\n * Slot-list shimmer — set true while `availableSlots[value.date]` is\n * being fetched. Drives the `<GroupedTimeSlots>` and the calendar-\n * variant time-slot list. When `loadingDates` is omitted, this flag\n * also drives the calendar shimmer (backward-compat fallback).\n */\n loadingSlots?: boolean;\n submitting?: boolean;\n /**\n * @default 'flat'\n * `'elevated'` wraps the kit-rendered surface in the equivalent of\n * `Card variant=\"elevated\"` (same tokens, same padding). Use to drop\n * the consumer-side Card wrap.\n */\n surface?: 'flat' | 'elevated';\n /**\n * Fires whenever the displayed step changes — steps 1..7 from the\n * cascade engine + step `8` when the success view mounts. Useful for\n * analytics events that aren't already kit-internal, custom focus\n * management, or page-title updates. The kit also auto-scrolls the\n * success container into view on the 1..7 → 8 transition; consumers\n * don't need to do that themselves.\n */\n onStepChange?: (step: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8) => void;\n /**\n * Fires when the patient picks a date in the calendar — sugar for\n * consumers using a two-query pattern who need to kick off the\n * per-day slot fetch on date click. Consumers can already detect\n * a date change by diffing `value.date` inside `onChange`; this\n * callback just spares them that diff. Fires AFTER the kit has\n * applied the date change through `onChange` — `value.date` will\n * reflect the new ISO when this fires.\n */\n onDateSelect?: (iso: string) => void;\n /**\n * Fires when the visible 4-day window starts or shifts. Used by\n * two-query consumers to lazy-fetch `dailySlots/{date}` for the\n * newly-visible days. Receives the inclusive ISO date strings of\n * the first and last visible day in the window. Fires on mount\n * (with the resolved initial window) and on every prev/next\n * arrow click, internal jump-to-next-available action, and\n * automatic re-sync triggered by `availableDates` arriving.\n *\n * Only fires when `datePickerStyle='four-day-grid'` — the\n * month-calendar picker has no \"window\" concept; consumers using\n * that style fetch availability per visible month and don't need\n * this signal.\n */\n onWindowChange?: (startIso: string, endIso: string) => void;\n /**\n * @default 'select'\n * UI rendered for the Specialty step. Independent of layout `variant`.\n *\n * - `'select'` (default): the kit's `<Select>` dropdown — current behaviour.\n * - `'combobox'`: single-select `<Combobox>` with type-ahead search.\n * Pays off for long specialty lists (>10 entries).\n * - `'multi-select'`: multi-select `<MultiSelect>` with chip-rendered\n * selections. Writes to `value.specialtyIds` (array). The cascade reads\n * the array as a union — services / operators / slots are filtered\n * by ANY of the selected specialties. Added in 0.34.0.\n */\n specialtyPickerStyle?: 'select' | 'combobox' | 'multi-select';\n /**\n * @default 'cards' for `variant='inline-list'`, `'select'` for others\n * UI rendered for the Service step. Independent of layout `variant`.\n *\n * - `'cards'`: visual card grid (the long-standing `ServiceCardGroup`\n * used by inline-list). Card layout, one row per service with icon,\n * label, and duration.\n * - `'select'`: compact `<Select>` dropdown (default for the chrome-\n * denser variants — calendar / flexible / accordion / progress).\n * - `'combobox'`: single-select `<Combobox>` with type-ahead search.\n * - `'multi-select'`: multi-select `<MultiSelect>` writing to\n * `value.serviceIds`. Cascade reads as union — operators / slots are\n * filtered by ANY of the selected services. Added in 0.34.0.\n */\n servicePickerStyle?: 'select' | 'combobox' | 'multi-select' | 'cards';\n /**\n * @default 'select'\n * UI rendered for the Operator step. Independent of layout `variant`.\n *\n * - `'select'` (default): `<Select>` dropdown including the implicit\n * `'all'` \"any operator\" sentinel.\n * - `'combobox'`: single-select `<Combobox>` with type-ahead search.\n * - `'multi-select'`: multi-select `<MultiSelect>` writing to\n * `value.operatorIds`. The kit doesn't filter slots by operator\n * itself — the consumer owns slot resolution — but consumers using\n * multi-select operator typically filter `availableSlots` to the\n * union of selected operators before passing the data in. Added\n * in 0.34.0.\n */\n operatorPickerStyle?: 'select' | 'combobox' | 'multi-select';\n /**\n * @default 'month-calendar'\n * Selects the date + slot picker rendered inside the cascade's date\n * and slot steps. Independent of the layout `variant`:\n *\n * - `'month-calendar'` (default): the 6×7 `<MonthGrid>` followed by\n * the morning/afternoon/evening `<GroupedTimeSlots>`. Two-step flow\n * — patient picks a date, slots reveal underneath.\n *\n * - `'four-day-grid'`: a 4-column day-strip (`<SlotGrid>`) with ±4-day\n * arrow nav and per-day vertical slot tiles. One-step flow —\n * patient picks a slot directly; clicking a slot atomically sets\n * both `value.date` and `value.slotKey`. The cascade's separate\n * \"slot\" step is suppressed because the slots are inline with the\n * date strip.\n *\n * The data contract is unchanged — `availableDates`, `availableSlots`,\n * `loadingDates`, `loadingSlots`, `onDateSelect` all behave the same\n * way for both styles. Defaults to `'month-calendar'` so existing\n * consumers see no behavioural change.\n */\n datePickerStyle?: 'month-calendar' | 'four-day-grid';\n /**\n * Surface a submit-failure message inside the form (Alert variant=destructive\n * above the submit button). The consumer owns the state — set it after an\n * `onSubmit` rejection, clear it when retrying or on a field edit. When set,\n * the kit's normal \"form stays mounted on rejected promise\" behaviour is\n * unchanged; this just gives the failure a sanctioned slot to render.\n */\n submitError?: ReactNode;\n /**\n * @default 'live'\n * In `'demo'` mode the kit's step-8 success view swaps its description to\n * a localised \"This was a demo — no confirmation was sent.\" so the copy\n * stays honest when no real API call was made.\n */\n mode?: 'live' | 'demo';\n /**\n * @default true\n * Render a \"Modify booking\" button on the step-8 success view that returns\n * to step 7 without clearing `value`/`details`. Practices that want a\n * one-shot booking flow can hide this.\n */\n showModifyOnSuccess?: boolean;\n emptyServicesSlot?: ReactNode;\n onboardingIncompleteSlot?: ReactNode;\n\n // a11y\n 'aria-label'?: string;\n id?: string;\n}\n","/* -------------------------------------------------------------------- */\n/* Booking cascade engine — pure functions, no React. */\n/* */\n/* The seven-step state machine that drives every variant. Visibility */\n/* gates, downstream filtering, auto-skip rules, and reset semantics */\n/* live here so each variant only renders a phase of the cascade — it */\n/* doesn't re-implement the logic. The booking-website's legacy */\n/* `useBookingState.js` is the behavioural source-of-truth; the */\n/* mapping is documented inline at each gate. */\n/* -------------------------------------------------------------------- */\n\nimport type {\n BookingOperator,\n BookingService,\n BookingSlot,\n BookingSpecialty,\n BookingValue,\n ConfirmationChannel,\n InsuranceType,\n} from './booking-types';\nimport { CONFIRMATION_CHANNEL_ORDER } from './booking-types';\n\n/**\n * Sentinel for the operator filter's \"All operators\" pseudo-option. Mirrors\n * `OPERATORS_ALL = '0'` in the legacy `useBookingState.js`, but the kit\n * uses `'all'` as the well-known string so consumers can't accidentally\n * collide with a real operator id of `'0'`.\n */\nexport const OPERATORS_ALL = 'all' as const;\n\nconst COUNTRY_GERMANY = 'de';\n\n/* -------------------------------------------------------------------- */\n/* Inputs / outputs */\n/* -------------------------------------------------------------------- */\n\nexport interface CascadePolicy {\n /** ISO 3166-1 alpha-2 country code. Currently only `'de'` toggles a gate. */\n country?: string;\n useSpecialties?: boolean;\n allowOperatorSelection?: boolean;\n /** When set, locks step 4 to this operator id and hides the picker. */\n lockedOperatorId?: string;\n /** Defaults to `false`. When true, single-service lists auto-pre-fill. */\n autoSelectSingleService?: boolean;\n}\n\nexport interface CascadeInputs extends CascadePolicy {\n specialties: BookingSpecialty[];\n services: BookingService[];\n operators: BookingOperator[];\n availableDates: string[];\n availableSlots: Record<string, BookingSlot[]>;\n value: BookingValue;\n}\n\nexport interface CascadeGates {\n insurance: boolean;\n specialty: boolean;\n service: boolean;\n operator: boolean;\n date: boolean;\n slot: boolean;\n details: boolean;\n /** True when a service is picked but no eligible operators can perform it. */\n onboardingIncomplete: boolean;\n}\n\nexport interface CascadeFiltered {\n specialties: BookingSpecialty[];\n services: BookingService[];\n /**\n * Eligible operators for the active specialty (when `useSpecialties=true`)\n * OR the active service. Excludes the \"All operators\" sentinel — that's\n * always prepended in the UI layer.\n */\n operators: BookingOperator[];\n}\n\n/** Step number — 1-indexed, matches the docs / a11y order. */\nexport type CascadeStep = 1 | 2 | 3 | 4 | 5 | 6 | 7;\n\nexport interface CascadeOutputs {\n gates: CascadeGates;\n filtered: CascadeFiltered;\n /** Current step: the first visible step that has an unfulfilled requirement. */\n currentStep: CascadeStep;\n /** Total visible steps (1..7 minus any auto-skipped). */\n totalSteps: number;\n /** Ordered list of the visible step indices, used by variants that show a stepper. */\n visibleSteps: CascadeStep[];\n /** Whether every required step is satisfied — the submit button is gated on this. */\n isReadyToSubmit: boolean;\n /** Selected service's duration, if any — needed for slot fetching. */\n durationMin?: number;\n /** Selected slot resolved from `value.date` + `value.slotKey`. */\n selectedSlot?: BookingSlot;\n}\n\n/* -------------------------------------------------------------------- */\n/* Filtering helpers */\n/* -------------------------------------------------------------------- */\n\nfunction filterSpecialties(inputs: CascadeInputs): BookingSpecialty[] {\n const list = inputs.lockedOperatorId\n ? inputs.specialties.filter((s) =>\n s.operatorIds?.includes(inputs.lockedOperatorId as string),\n )\n : inputs.specialties;\n // Stable copy + sort by `sequenceNumber` (falsy → bottom).\n return [...list].sort((a, b) => {\n const aSeq = a.sequenceNumber ?? Number.POSITIVE_INFINITY;\n const bSeq = b.sequenceNumber ?? Number.POSITIVE_INFINITY;\n return aSeq - bSeq;\n });\n}\n\nfunction filterServices(inputs: CascadeInputs): BookingService[] {\n let list = inputs.services;\n if (inputs.lockedOperatorId) {\n list = list.filter((s) =>\n s.operatorIds?.includes(inputs.lockedOperatorId as string),\n );\n }\n // Mirror the `gates.specialty` auto-on rule — see computeGates().\n const useSpecialtiesResolved =\n inputs.useSpecialties === undefined\n ? inputs.specialties.length > 0\n : inputs.useSpecialties;\n if (useSpecialtiesResolved) {\n // 0.34.0: read array form first (`specialtyIds` for multi-select);\n // fall back to single `specialtyId`. Union semantics — show any\n // service matching ANY of the selected specialties.\n const specialtyIds = resolveSpecialtyIds(inputs.value);\n if (specialtyIds.length > 0) {\n list = list.filter(\n (s) =>\n s.specialtyId !== undefined && specialtyIds.includes(s.specialtyId),\n );\n }\n }\n return list;\n}\n\nfunction eligibleOperators(inputs: CascadeInputs): BookingOperator[] {\n // Mirror the gates.specialty auto-on rule.\n const useSpecialtiesResolved =\n inputs.useSpecialties === undefined\n ? inputs.specialties.length > 0\n : inputs.useSpecialties;\n // When `useSpecialties` is on, eligibility is by specialty. Otherwise by\n // the selected service's reverse-link. Both are inclusive — if a service\n // says any operator can perform it, all operators are eligible.\n // 0.34.0: union semantics — read array form first, fall back to single.\n if (useSpecialtiesResolved) {\n const specialtyIds = resolveSpecialtyIds(inputs.value);\n if (specialtyIds.length > 0) {\n return inputs.operators.filter((op) =>\n op.specialtyIds?.some((sid) => specialtyIds.includes(sid)),\n );\n }\n }\n if (!useSpecialtiesResolved) {\n const serviceIds = resolveServiceIds(inputs.value);\n if (serviceIds.length > 0) {\n return inputs.operators.filter((op) =>\n op.appointmentBookingReasonIds?.some((rid) => serviceIds.includes(rid)),\n );\n }\n }\n return [];\n}\n\n/* -------------------------------------------------------------------- */\n/* Gates */\n/* -------------------------------------------------------------------- */\n\nfunction computeGates(\n inputs: CascadeInputs,\n filtered: CascadeFiltered,\n): CascadeGates {\n const insuranceVisible = inputs.country === COUNTRY_GERMANY;\n // Insurance gate is satisfied either if it's not visible or the user has\n // picked one of the two values.\n const insuranceSatisfied =\n !insuranceVisible || inputs.value.insuranceType !== undefined;\n\n // Specialty visibility — 0.30.4: auto-on when `specialties` has items.\n // - `useSpecialties === true` → visible (legacy explicit opt-in)\n // - `useSpecialties === false` → hidden (explicit opt-out)\n // - `useSpecialties === undefined` (default) → visible iff `specialties`\n // has items. Previously the default `false` meant the step never\n // rendered unless the consumer explicitly opted in, which silently\n // dropped the step in every variant for the common case where the\n // consumer passed `specialties` data but not the boolean.\n const useSpecialtiesResolved =\n inputs.useSpecialties === undefined\n ? inputs.specialties.length > 0\n : inputs.useSpecialties;\n const specialtyVisible = useSpecialtiesResolved && insuranceSatisfied;\n // 0.34.0: array-or-single semantics — a step is \"satisfied\" when\n // EITHER the single field is set OR the array field has at least\n // one entry. Same applies to service / operator picks below.\n const specialtyPicked = resolveSpecialtyIds(inputs.value).length > 0;\n const specialtySatisfied = !specialtyVisible || specialtyPicked;\n\n const serviceVisible = specialtySatisfied;\n const servicePicked = resolveServiceIds(inputs.value).length > 0;\n const serviceSatisfied = !serviceVisible || servicePicked;\n\n // Operator: visible only when the user can pick from >1 eligible.\n const eligibleOps = filtered.operators;\n const operatorVisible =\n Boolean(inputs.allowOperatorSelection) &&\n serviceSatisfied &&\n servicePicked &&\n !inputs.lockedOperatorId &&\n eligibleOps.length > 1;\n // operator is always \"satisfied\" because the \"All operators\" sentinel is\n // the implicit default — patients who don't pick still flow through.\n const operatorSatisfied = true;\n void operatorSatisfied;\n\n const dateVisible = serviceSatisfied && servicePicked;\n const dateSatisfied = !dateVisible || inputs.value.date !== undefined;\n\n const slotVisible = dateSatisfied && inputs.value.date !== undefined;\n const slotSatisfied = !slotVisible || inputs.value.slotKey !== undefined;\n\n const detailsVisible = slotSatisfied && inputs.value.slotKey !== undefined;\n\n const onboardingIncomplete = servicePicked && eligibleOps.length === 0;\n\n return {\n insurance: insuranceVisible,\n specialty: specialtyVisible,\n service: serviceVisible,\n operator: operatorVisible,\n date: dateVisible,\n slot: slotVisible,\n details: detailsVisible,\n onboardingIncomplete,\n };\n}\n\n/* -------------------------------------------------------------------- */\n/* Step number derivation */\n/* -------------------------------------------------------------------- */\n\nfunction deriveStep(\n inputs: CascadeInputs,\n gates: CascadeGates,\n): { currentStep: CascadeStep; visibleSteps: CascadeStep[] } {\n const visible: CascadeStep[] = [];\n if (gates.insurance) visible.push(1);\n if (gates.specialty) visible.push(2);\n visible.push(3); // service is always required\n if (gates.operator) visible.push(4);\n visible.push(5); // date is always required (after service)\n visible.push(6); // slot is always required\n visible.push(7); // details is always required (the final submit step)\n\n const isFulfilled: Record<CascadeStep, boolean> = {\n 1: inputs.value.insuranceType !== undefined,\n // 0.34.0: array-or-single — satisfied when EITHER form is present.\n 2: resolveSpecialtyIds(inputs.value).length > 0,\n 3: resolveServiceIds(inputs.value).length > 0,\n 4:\n inputs.value.operatorId !== undefined ||\n (inputs.value.operatorIds !== undefined &&\n inputs.value.operatorIds.length > 0),\n 5: inputs.value.date !== undefined,\n 6: inputs.value.slotKey !== undefined,\n 7: false, // details fulfilment is owned by the form's own validation\n };\n\n const firstIncomplete = visible.find((s) => !isFulfilled[s]);\n return {\n currentStep: firstIncomplete ?? 7,\n visibleSteps: visible,\n };\n}\n\n/* -------------------------------------------------------------------- */\n/* Main derive */\n/* -------------------------------------------------------------------- */\n\nexport function deriveCascade(inputs: CascadeInputs): CascadeOutputs {\n const filtered: CascadeFiltered = {\n specialties: filterSpecialties(inputs),\n services: filterServices(inputs),\n operators: eligibleOperators(inputs),\n };\n const gates = computeGates(inputs, filtered);\n const { currentStep, visibleSteps } = deriveStep(inputs, gates);\n\n // Look up the selected slot for variant bodies that want to render it\n // (e.g. the \"Confirm at HH:mm on DATE\" summary line above the details\n // form). Cheaper to do here than make each variant re-search.\n let selectedSlot: BookingSlot | undefined;\n if (inputs.value.date && inputs.value.slotKey) {\n const day = inputs.availableSlots[inputs.value.date];\n if (day) selectedSlot = day.find((s) => s.key === inputs.value.slotKey);\n }\n\n // 0.34.0: when multi-select is active we resolve to \"first picked\" for\n // the duration-min / selected-service indicator. The submit payload\n // carries the full value (including arrays) so the consumer can fan\n // out per service / operator if needed.\n const serviceIds = resolveServiceIds(inputs.value);\n const selectedService =\n serviceIds.length > 0\n ? inputs.services.find((s) => s.id === serviceIds[0])\n : undefined;\n\n const specialtyPickedFinal = resolveSpecialtyIds(inputs.value).length > 0;\n\n const isReadyToSubmit =\n serviceIds.length > 0 &&\n inputs.value.date !== undefined &&\n inputs.value.slotKey !== undefined &&\n (!gates.insurance || inputs.value.insuranceType !== undefined) &&\n (!gates.specialty || specialtyPickedFinal);\n\n return {\n gates,\n filtered,\n currentStep,\n totalSteps: visibleSteps.length,\n visibleSteps,\n isReadyToSubmit,\n durationMin: selectedService?.durationMin,\n selectedSlot,\n };\n}\n\n/* -------------------------------------------------------------------- */\n/* Reset helpers — pure, return next value */\n/* */\n/* Every cascade change clears downstream selections so the user never */\n/* lands on a fulfilled-but-inconsistent state. */\n/* -------------------------------------------------------------------- */\n\nexport function resetOnInsuranceChange(\n value: BookingValue,\n next: InsuranceType | undefined,\n): BookingValue {\n return {\n ...value,\n insuranceType: next,\n specialtyId: undefined,\n serviceId: undefined,\n operatorId: undefined,\n date: undefined,\n slotKey: undefined,\n details: undefined,\n };\n}\n\nexport function resetOnSpecialtyChange(\n value: BookingValue,\n next: string | undefined,\n): BookingValue {\n return {\n ...value,\n specialtyId: next,\n specialtyIds: undefined,\n serviceId: undefined,\n serviceIds: undefined,\n operatorId: undefined,\n operatorIds: undefined,\n date: undefined,\n slotKey: undefined,\n details: undefined,\n };\n}\n\n/**\n * Multi-select counterpart to `resetOnSpecialtyChange`. Writes the\n * `specialtyIds` array form and clears any single-form `specialtyId`\n * so the cascade reads the array. Added in 0.34.0.\n */\nexport function resetOnSpecialtyIdsChange(\n value: BookingValue,\n next: string[] | undefined,\n): BookingValue {\n return {\n ...value,\n specialtyId: undefined,\n specialtyIds: next,\n serviceId: undefined,\n serviceIds: undefined,\n operatorId: undefined,\n operatorIds: undefined,\n date: undefined,\n slotKey: undefined,\n details: undefined,\n };\n}\n\nexport function resetOnServiceChange(\n value: BookingValue,\n next: string | undefined,\n): BookingValue {\n return {\n ...value,\n serviceId: next,\n serviceIds: undefined,\n // Default the operator to the \"All operators\" sentinel so a patient\n // who doesn't care about picking lands on a satisfied step 4 without\n // any further input.\n operatorId: next ? OPERATORS_ALL : undefined,\n operatorIds: undefined,\n date: undefined,\n slotKey: undefined,\n details: undefined,\n };\n}\n\n/** Multi-select counterpart to `resetOnServiceChange`. Added in 0.34.0. */\nexport function resetOnServiceIdsChange(\n value: BookingValue,\n next: string[] | undefined,\n): BookingValue {\n const hasAny = !!next && next.length > 0;\n return {\n ...value,\n serviceId: undefined,\n serviceIds: next,\n operatorId: hasAny ? OPERATORS_ALL : undefined,\n operatorIds: undefined,\n date: undefined,\n slotKey: undefined,\n details: undefined,\n };\n}\n\nexport function resetOnOperatorChange(\n value: BookingValue,\n next: string | undefined,\n): BookingValue {\n return {\n ...value,\n operatorId: next,\n operatorIds: undefined,\n date: undefined,\n slotKey: undefined,\n details: undefined,\n };\n}\n\n/** Multi-select counterpart to `resetOnOperatorChange`. Added in 0.34.0. */\nexport function resetOnOperatorIdsChange(\n value: BookingValue,\n next: string[] | undefined,\n): BookingValue {\n return {\n ...value,\n operatorId: undefined,\n operatorIds: next,\n date: undefined,\n slotKey: undefined,\n details: undefined,\n };\n}\n\n/* -------------------------------------------------------------------- */\n/* Multi-select resolution helpers — 0.34.0 */\n/* */\n/* The cascade reads the array form of each step's value first, falling */\n/* back to the single-string form. This lets the picker style switch at */\n/* runtime without rewriting the entire cascade. */\n/* -------------------------------------------------------------------- */\n\n/** Returns the effective specialty selection as an array. Empty when nothing picked. */\nexport function resolveSpecialtyIds(value: BookingValue): string[] {\n if (value.specialtyIds && value.specialtyIds.length > 0) {\n return value.specialtyIds;\n }\n if (value.specialtyId) return [value.specialtyId];\n return [];\n}\n\n/** Returns the effective service selection as an array. Empty when nothing picked. */\nexport function resolveServiceIds(value: BookingValue): string[] {\n if (value.serviceIds && value.serviceIds.length > 0) {\n return value.serviceIds;\n }\n if (value.serviceId) return [value.serviceId];\n return [];\n}\n\n/** Returns the effective operator selection as an array. Empty when nothing picked. */\nexport function resolveOperatorIds(value: BookingValue): string[] {\n if (value.operatorIds && value.operatorIds.length > 0) {\n return value.operatorIds;\n }\n if (value.operatorId) return [value.operatorId];\n return [];\n}\n\nexport function resetOnDateChange(\n value: BookingValue,\n next: string | undefined,\n): BookingValue {\n return {\n ...value,\n date: next,\n slotKey: undefined,\n // Keep details — date/slot changes shouldn't wipe the patient form\n // since the user has already filled some fields.\n };\n}\n\nexport function resetOnSlotChange(\n value: BookingValue,\n next: string | undefined,\n): BookingValue {\n return {\n ...value,\n slotKey: next,\n };\n}\n\n/* -------------------------------------------------------------------- */\n/* Auto-pre-select normalisation */\n/* */\n/* Called once on mount (and whenever the inputs that trigger them */\n/* arrive — e.g. when `specialties` populates from a fetch). Returns the */\n/* value possibly mutated with the auto-picked fields. Callers should */\n/* compare the result to the input and fire `onChange` once if they */\n/* differ so the consumer sees the normalised value. */\n/* -------------------------------------------------------------------- */\n\nexport function applyAutoSelects(\n value: BookingValue,\n inputs: CascadePolicy & {\n specialties: BookingSpecialty[];\n services: BookingService[];\n },\n): BookingValue {\n let next = value;\n\n // Rule 1: locked operator pins step 4.\n if (inputs.lockedOperatorId && next.operatorId !== inputs.lockedOperatorId) {\n next = { ...next, operatorId: inputs.lockedOperatorId };\n }\n\n // Rule 2: single specialty auto-skips step 2. Skipped when the consumer\n // is operating in multi-select mode (specialtyIds is set) — the patient\n // is explicitly picking, don't override.\n const useSpecialtiesResolved =\n inputs.useSpecialties === undefined\n ? inputs.specialties.length > 0\n : inputs.useSpecialties;\n if (\n useSpecialtiesResolved &&\n inputs.specialties.length === 1 &&\n next.specialtyId === undefined &&\n next.specialtyIds === undefined\n ) {\n next = { ...next, specialtyId: inputs.specialties[0].id };\n }\n\n // Rule 3: single resolved service auto-fills step 3 — only when explicitly\n // opted into. The spec says specialty auto-select is always on, but\n // service auto-select is opt-in because UX teams may want explicit\n // confirmation. Skipped when serviceIds is set (multi-select).\n if (inputs.autoSelectSingleService) {\n const specialtyIds = resolveSpecialtyIds(next);\n const resolvedServices =\n specialtyIds.length > 0\n ? inputs.services.filter(\n (s) => s.specialtyId && specialtyIds.includes(s.specialtyId),\n )\n : inputs.services;\n if (\n resolvedServices.length === 1 &&\n next.serviceId === undefined &&\n next.serviceIds === undefined\n ) {\n next = { ...next, serviceId: resolvedServices[0].id };\n // Mirror resetOnServiceChange's operator default.\n if (next.operatorId === undefined && next.operatorIds === undefined) {\n next = { ...next, operatorId: OPERATORS_ALL };\n }\n }\n }\n\n return next;\n}\n\n/* -------------------------------------------------------------------- */\n/* Helpers exposed for the variants (and tests). */\n/* -------------------------------------------------------------------- */\n\n/** Resolve the active operator id, treating the `'all'` sentinel as `undefined`. */\nexport function resolveOperatorId(value: BookingValue): string | undefined {\n if (!value.operatorId) return undefined;\n if (value.operatorId === OPERATORS_ALL) return undefined;\n return value.operatorId;\n}\n\n/* -------------------------------------------------------------------- */\n/* Confirmation channels — smart default + ordering */\n/* -------------------------------------------------------------------- */\n\n/**\n * Naïve E.164-ish check for the smart-default heuristic. Doesn't validate\n * the phone fully — just confirms the patient has typed *something* that\n * looks like a phone number, so we can decide whether to pre-tick WhatsApp.\n */\nfunction looksLikePhone(value: string | undefined): boolean {\n if (!value) return false;\n const trimmed = value.trim();\n // Require a leading \"+\" or country code-style digits + at least 8 chars.\n return /^\\+?\\d[\\d\\s\\-()]{6,}$/.test(trimmed);\n}\n\n/**\n * Resolve the effective list of enabled channels. Falls back to `['email']`\n * when the consumer omits the prop, preserving the pre-amendment behaviour.\n */\nexport function resolveConfirmationChannels(\n enabled: ConfirmationChannel[] | undefined,\n): ConfirmationChannel[] {\n const list = enabled && enabled.length > 0 ? enabled : ['email'];\n // Canonical order: email → whatsapp → sms.\n const set = new Set(list);\n return CONFIRMATION_CHANNEL_ORDER.filter((c) => set.has(c));\n}\n\n/**\n * Compute the channels to pre-check. Result is intersected with `enabled`\n * for safety so a channel the practice didn't enable never gets ticked.\n *\n * Rules (per spec):\n * 1. Always include 'email'.\n * 2. Include 'whatsapp' if enabled AND mobile looks plausible.\n * 3. Include 'sms' ONLY when whatsapp is NOT in `enabled`.\n * 4. If the consumer passes `override`, honour it verbatim (still\n * intersected with `enabled` for safety).\n */\nexport function defaultConfirmationSelection(\n enabled: ConfirmationChannel[] | undefined,\n mobile: string | undefined,\n override?: ConfirmationChannel[],\n): ConfirmationChannel[] {\n const resolvedEnabled = resolveConfirmationChannels(enabled);\n const enabledSet = new Set(resolvedEnabled);\n\n if (override) {\n return CONFIRMATION_CHANNEL_ORDER.filter(\n (c) => override.includes(c) && enabledSet.has(c),\n );\n }\n\n const out: ConfirmationChannel[] = [];\n if (enabledSet.has('email')) out.push('email');\n\n const mobilePlausible = looksLikePhone(mobile);\n const hasWhatsApp = enabledSet.has('whatsapp');\n if (hasWhatsApp && mobilePlausible) out.push('whatsapp');\n // SMS is pre-checked whenever WhatsApp is not in the enabled set —\n // the spec doesn't gate this on a mobile-present check (matches rule 3).\n if (!hasWhatsApp && enabledSet.has('sms')) out.push('sms');\n\n // Final canonical order pass.\n const outSet = new Set(out);\n return CONFIRMATION_CHANNEL_ORDER.filter((c) => outSet.has(c));\n}\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type FormEvent,\n type ReactNode,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Trans } from 'react-i18next';\nimport { Alert } from '../alert/alert';\nimport { Button } from '../button/button';\nimport { Checkbox } from '../checkbox/checkbox';\nimport { CheckboxGroup } from '../checkbox-group/checkbox-group';\nimport { DatePicker } from '../date-picker/date-picker';\nimport { EmailInput } from '../email-input/email-input';\nimport { FormField } from '../form-field/form-field';\nimport { PhoneInput } from '../phone-input/phone-input';\nimport { TextArea } from '../text-area/text-area';\nimport { TextInput } from '../text-input/text-input';\nimport { Spinner } from '../spinner/spinner';\nimport {\n defaultConfirmationSelection,\n resolveConfirmationChannels,\n} from './cascade';\nimport type {\n BookingDetails,\n BookingValidator,\n ConfirmationChannel,\n} from './booking-types';\n\n/* -------------------------------------------------------------------- */\n/* BookingDetailsForm — step 7 of the cascade. */\n/* */\n/* Captures the patient's identity + contact + consents before submit. */\n/* The form's `onChange` fires per-field so the parent value can persist */\n/* a partial across step navigation; the parent's `onSubmit` is called */\n/* with the full `BookingDetails` payload only when every required field */\n/* + both consents validate. */\n/* -------------------------------------------------------------------- */\n\nconst NOTE_MAX_LENGTH = 500;\nconst CF_REGEX = /^[A-Z0-9]{16}$/;\nconst EMAIL_REGEX = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\nconst VALIDATE_DEBOUNCE_MS = 300;\n\n/* -------------------------------------------------------------------- */\n/* Props */\n/* -------------------------------------------------------------------- */\n\nexport interface BookingDetailsFormProps {\n value: Partial<BookingDetails>;\n onChange: (next: Partial<BookingDetails>) => void;\n onSubmit: (details: BookingDetails) => void | Promise<void>;\n\n // Opt-in fields\n requireCodiceFiscale?: boolean;\n requireDateOfBirth?: boolean;\n /** When `true` AND `insuranceType === 'public'`, render the Versichertennummer field. */\n requireInsuranceNumber?: boolean;\n insuranceType?: 'private' | 'public';\n showNote?: boolean;\n showReturningPatientFlag?: boolean;\n\n // Consent labels\n privacyPolicyUrl?: string;\n termsUrl?: string;\n\n // Validation hooks\n validateCodiceFiscale?: BookingValidator;\n validateInsuranceNumber?: BookingValidator;\n\n // UX\n submitting?: boolean;\n /** Optional summary node rendered above the form (e.g. confirm-time chip). */\n summarySlot?: ReactNode;\n\n // Phone country default — propagated from the practice country code so\n // the country prefix selector starts on the right option.\n defaultPhoneCountry?: string;\n\n // Confirmation-channel picker (sub-section of step 7)\n /**\n * Channels the practice has enabled. When omitted, defaults to\n * `['email']` (picker hidden — single implicit channel). When the\n * resolved list has length 1 the picker stays hidden.\n */\n confirmationChannels?: ConfirmationChannel[];\n /** Pre-checked channels override; falls back to a smart default. */\n defaultConfirmationChannels?: ConfirmationChannel[];\n /**\n * Render an error Alert above the submit button. Set after an\n * `onSubmit` rejection, clear before retrying. The kit doesn't\n * disable the submit button while this is set — the patient can\n * re-submit immediately.\n */\n submitError?: ReactNode;\n}\n\n/* -------------------------------------------------------------------- */\n/* Component */\n/* -------------------------------------------------------------------- */\n\ninterface AsyncStatus {\n state: 'idle' | 'pending' | 'valid' | 'invalid';\n hint?: string;\n}\n\nconst idleStatus: AsyncStatus = { state: 'idle' };\n\nexport const BookingDetailsForm = forwardRef<\n HTMLFormElement,\n BookingDetailsFormProps\n>(\n (\n {\n value,\n onChange,\n onSubmit,\n requireCodiceFiscale = false,\n requireDateOfBirth = false,\n requireInsuranceNumber = false,\n insuranceType,\n showNote = false,\n showReturningPatientFlag = false,\n privacyPolicyUrl,\n termsUrl,\n validateCodiceFiscale,\n validateInsuranceNumber,\n submitting = false,\n summarySlot,\n defaultPhoneCountry,\n confirmationChannels,\n defaultConfirmationChannels,\n submitError,\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const formId = useId();\n\n // Async-validation state per field.\n const [cfStatus, setCfStatus] = useState<AsyncStatus>(idleStatus);\n const [insuranceStatus, setInsuranceStatus] =\n useState<AsyncStatus>(idleStatus);\n\n // Show-validation-error toggle — flips on first blur / submit attempt\n // so the inline errors don't shout at the user mid-typing.\n const [touched, setTouched] = useState<Record<string, boolean>>({});\n const markTouched = useCallback(\n (field: string) => setTouched((t) => ({ ...t, [field]: true })),\n [],\n );\n\n // Per-field debounce timers for the async validators.\n const cfTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const insuranceTimerRef = useRef<ReturnType<typeof setTimeout> | null>(\n null,\n );\n\n useEffect(\n () => () => {\n if (cfTimerRef.current) clearTimeout(cfTimerRef.current);\n if (insuranceTimerRef.current) clearTimeout(insuranceTimerRef.current);\n },\n [],\n );\n\n /* -------------------------- Mutators ---------------------------- */\n\n const update = useCallback(\n (patch: Partial<BookingDetails>) => onChange({ ...value, ...patch }),\n [value, onChange],\n );\n\n /* -------------------- Confirmation-channel picker ---------------- */\n\n const resolvedEnabledChannels = useMemo(\n () => resolveConfirmationChannels(confirmationChannels),\n [confirmationChannels],\n );\n const pickerVisible = resolvedEnabledChannels.length >= 2;\n\n // Smart-default the selection once on mount (and whenever the inputs\n // that drive it change — `mobilePhone` toggles WhatsApp eligibility).\n // We only seed when the parent value is undefined so the patient's own\n // changes win.\n const seededRef = useRef(false);\n useEffect(() => {\n if (!pickerVisible) {\n // Implicit single channel — strip any stale selection.\n if (value.confirmationChannels !== undefined) {\n update({ confirmationChannels: undefined });\n }\n return;\n }\n if (value.confirmationChannels !== undefined) {\n seededRef.current = true;\n return;\n }\n const seed = defaultConfirmationSelection(\n resolvedEnabledChannels,\n value.mobilePhone,\n defaultConfirmationChannels,\n );\n seededRef.current = true;\n update({ confirmationChannels: seed });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n pickerVisible,\n resolvedEnabledChannels,\n value.mobilePhone,\n defaultConfirmationChannels,\n ]);\n\n const selectedChannels = useMemo<ConfirmationChannel[]>(\n () => value.confirmationChannels ?? [],\n [value.confirmationChannels],\n );\n const noChannelsSelected = pickerVisible && selectedChannels.length === 0;\n\n /* -------------------------- CF async ---------------------------- */\n\n useEffect(() => {\n const cf = value.codiceFiscale;\n if (!requireCodiceFiscale || !validateCodiceFiscale || !cf) {\n setCfStatus(idleStatus);\n return;\n }\n if (!CF_REGEX.test(cf)) {\n // Don't fire the async validator until the format is plausible.\n setCfStatus({\n state: 'invalid',\n hint: t('booking.details.codiceFiscale.invalidFormat'),\n });\n return;\n }\n setCfStatus({ state: 'pending' });\n if (cfTimerRef.current) clearTimeout(cfTimerRef.current);\n cfTimerRef.current = setTimeout(() => {\n validateCodiceFiscale(cf)\n .then((res) =>\n setCfStatus(\n res.valid\n ? { state: 'valid' }\n : { state: 'invalid', hint: res.hint },\n ),\n )\n .catch(() =>\n setCfStatus({\n state: 'invalid',\n hint: t('booking.details.codiceFiscale.unavailable'),\n }),\n );\n }, VALIDATE_DEBOUNCE_MS);\n }, [requireCodiceFiscale, validateCodiceFiscale, value.codiceFiscale, t]);\n\n /* ----------------------- Insurance async ------------------------ */\n\n const insuranceShown = requireInsuranceNumber && insuranceType === 'public';\n useEffect(() => {\n const n = value.insuranceNumber;\n if (!insuranceShown || !validateInsuranceNumber || !n) {\n setInsuranceStatus(idleStatus);\n return;\n }\n setInsuranceStatus({ state: 'pending' });\n if (insuranceTimerRef.current) clearTimeout(insuranceTimerRef.current);\n insuranceTimerRef.current = setTimeout(() => {\n validateInsuranceNumber(n)\n .then((res) =>\n setInsuranceStatus(\n res.valid\n ? { state: 'valid' }\n : { state: 'invalid', hint: res.hint },\n ),\n )\n .catch(() =>\n setInsuranceStatus({\n state: 'invalid',\n hint: t('booking.details.insuranceNumber.unavailable'),\n }),\n );\n }, VALIDATE_DEBOUNCE_MS);\n }, [insuranceShown, validateInsuranceNumber, value.insuranceNumber, t]);\n\n /* ------------------------- Validation --------------------------- */\n\n const emailValid = useMemo(\n () => Boolean(value.email && EMAIL_REGEX.test(value.email)),\n [value.email],\n );\n const phoneValid = useMemo(\n () => Boolean(value.mobilePhone && value.mobilePhone.length >= 6),\n [value.mobilePhone],\n );\n\n const requiredFieldsValid = useMemo(() => {\n if (!value.firstName?.trim()) return false;\n if (!value.lastName?.trim()) return false;\n if (!emailValid) return false;\n if (!phoneValid) return false;\n if (requireCodiceFiscale && cfStatus.state !== 'valid') return false;\n if (requireDateOfBirth && !value.dateOfBirth) return false;\n if (insuranceShown && insuranceStatus.state !== 'valid') return false;\n return true;\n }, [\n value.firstName,\n value.lastName,\n emailValid,\n phoneValid,\n requireCodiceFiscale,\n cfStatus.state,\n requireDateOfBirth,\n value.dateOfBirth,\n insuranceShown,\n insuranceStatus.state,\n ]);\n\n const consentsTicked = Boolean(value.privacyConsent && value.termsConsent);\n const channelsSatisfied = !pickerVisible || selectedChannels.length > 0;\n const canSubmit =\n requiredFieldsValid && consentsTicked && channelsSatisfied && !submitting;\n\n /* --------------------------- Submit ----------------------------- */\n\n const handleSubmit = (e: FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n // Surface every validation error on submit attempt.\n setTouched({\n firstName: true,\n lastName: true,\n email: true,\n mobilePhone: true,\n codiceFiscale: true,\n dateOfBirth: true,\n insuranceNumber: true,\n });\n if (!canSubmit) return;\n const payload: BookingDetails = {\n firstName: value.firstName!.trim(),\n lastName: value.lastName!.trim(),\n email: value.email!.trim(),\n mobilePhone: value.mobilePhone!,\n privacyConsent: true,\n termsConsent: true,\n codiceFiscale: value.codiceFiscale,\n dateOfBirth: value.dateOfBirth,\n insuranceNumber: value.insuranceNumber,\n note: value.note,\n returningPatient: value.returningPatient,\n // Only include when the picker was visible; otherwise the single\n // implicit channel is inferred backend-side from the practice\n // config.\n confirmationChannels: pickerVisible ? selectedChannels : undefined,\n };\n onSubmit(payload);\n };\n\n /* ---------------------- Consent label JSX ----------------------- */\n\n // Translated label with an embedded link to the policy URL. Uses\n // <Trans> so the link target is bound at render rather than baked\n // into the localised string.\n const renderConsentLabel = (\n i18nKey: string,\n url: string | undefined,\n ): ReactNode => {\n // Strip the link if the URL isn't http(s) — guards against\n // `javascript:` / `data:` URIs reaching the rendered `href`.\n const safeUrl = url && /^https?:\\/\\//i.test(url) ? url : undefined;\n if (!safeUrl) {\n return t(i18nKey);\n }\n return (\n <Trans\n i18nKey={i18nKey}\n components={{\n // The `<Trans>` runtime injects link text from the i18n\n // string. The anchor renders empty at static-analysis time,\n // so `jsx-a11y/anchor-has-content` would false-flag — silence\n // it; the runtime content is the localised policy / terms\n // label.\n policyLink: (\n // eslint-disable-next-line jsx-a11y/anchor-has-content\n <a\n href={safeUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"ds:underline ds:text-[var(--primary)]\"\n />\n ),\n }}\n />\n );\n };\n\n return (\n <form\n ref={ref}\n id={formId}\n noValidate\n onSubmit={handleSubmit}\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\"\n >\n {summarySlot}\n\n {/* Identity */}\n <div className=\"ds:grid ds:grid-cols-1 ds:gap-[var(--spacing-sm)] ds:sm:grid-cols-2\">\n <FormField\n label={t('booking.details.firstName.label')}\n required\n error={\n touched.firstName && !value.firstName?.trim()\n ? t('booking.details.firstName.required')\n : undefined\n }\n >\n <TextInput\n autoComplete=\"given-name\"\n value={value.firstName ?? ''}\n onChange={(e) => update({ firstName: e.target.value })}\n onBlur={() => markTouched('firstName')}\n />\n </FormField>\n <FormField\n label={t('booking.details.lastName.label')}\n required\n error={\n touched.lastName && !value.lastName?.trim()\n ? t('booking.details.lastName.required')\n : undefined\n }\n >\n <TextInput\n autoComplete=\"family-name\"\n value={value.lastName ?? ''}\n onChange={(e) => update({ lastName: e.target.value })}\n onBlur={() => markTouched('lastName')}\n />\n </FormField>\n </div>\n\n {/* Contact */}\n <div className=\"ds:grid ds:grid-cols-1 ds:gap-[var(--spacing-sm)] ds:sm:grid-cols-2\">\n <FormField\n label={t('booking.details.email.label')}\n required\n error={\n touched.email && !emailValid\n ? t('booking.details.email.invalid')\n : undefined\n }\n >\n <EmailInput\n value={value.email ?? ''}\n onChange={(e) => update({ email: e.target.value })}\n onBlur={() => markTouched('email')}\n />\n </FormField>\n <FormField\n label={t('booking.details.mobilePhone.label')}\n required\n error={\n touched.mobilePhone && !phoneValid\n ? t('booking.details.mobilePhone.invalid')\n : undefined\n }\n >\n <PhoneInput\n value={value.mobilePhone ?? ''}\n defaultCountry={\n defaultPhoneCountry?.toUpperCase() as\n | 'IT'\n | 'DE'\n | 'GB'\n | undefined\n }\n onChange={(e164) => {\n update({ mobilePhone: e164 });\n markTouched('mobilePhone');\n }}\n />\n </FormField>\n </div>\n\n {/* Optional identity fields */}\n {requireCodiceFiscale || requireDateOfBirth ? (\n <div className=\"ds:grid ds:grid-cols-1 ds:gap-[var(--spacing-sm)] ds:sm:grid-cols-2\">\n {requireCodiceFiscale ? (\n <FormField\n label={t('booking.details.codiceFiscale.label')}\n required\n description={\n cfStatus.state === 'pending'\n ? t('booking.details.codiceFiscale.checking')\n : t('booking.details.codiceFiscale.helper')\n }\n error={\n touched.codiceFiscale && cfStatus.state === 'invalid'\n ? (cfStatus.hint ??\n t('booking.details.codiceFiscale.invalid'))\n : undefined\n }\n >\n <TextInput\n value={value.codiceFiscale ?? ''}\n maxLength={16}\n onChange={(e) =>\n update({\n codiceFiscale: e.target.value.slice(0, 16).toUpperCase(),\n })\n }\n onBlur={() => markTouched('codiceFiscale')}\n />\n </FormField>\n ) : null}\n {requireDateOfBirth ? (\n <FormField\n label={t('booking.details.dateOfBirth.label')}\n required\n error={\n touched.dateOfBirth && !value.dateOfBirth\n ? t('booking.details.dateOfBirth.required')\n : undefined\n }\n >\n <DatePicker\n value={\n value.dateOfBirth ? new Date(value.dateOfBirth) : undefined\n }\n onChange={(next: Date | undefined) => {\n update({\n dateOfBirth: next\n ? next.toISOString().slice(0, 10)\n : undefined,\n });\n markTouched('dateOfBirth');\n }}\n />\n </FormField>\n ) : null}\n </div>\n ) : null}\n\n {insuranceShown ? (\n <FormField\n label={t('booking.details.insuranceNumber.label')}\n required\n description={\n insuranceStatus.state === 'pending'\n ? t('booking.details.insuranceNumber.checking')\n : undefined\n }\n error={\n touched.insuranceNumber && insuranceStatus.state === 'invalid'\n ? (insuranceStatus.hint ??\n t('booking.details.insuranceNumber.invalid'))\n : undefined\n }\n >\n <TextInput\n value={value.insuranceNumber ?? ''}\n onChange={(e) => update({ insuranceNumber: e.target.value })}\n onBlur={() => markTouched('insuranceNumber')}\n />\n </FormField>\n ) : null}\n\n {showNote ? (\n <FormField\n label={t('booking.details.note.label')}\n description={t('booking.details.note.helper', {\n max: NOTE_MAX_LENGTH,\n })}\n >\n <TextArea\n value={value.note ?? ''}\n maxLength={NOTE_MAX_LENGTH}\n rows={3}\n onChange={(e) => update({ note: e.target.value })}\n />\n </FormField>\n ) : null}\n\n {showReturningPatientFlag ? (\n <Checkbox\n checked={Boolean(value.returningPatient)}\n onCheckedChange={(checked) =>\n update({ returningPatient: checked === true })\n }\n label={t('booking.details.returningPatient.label')}\n />\n ) : null}\n\n {/* Consents — privacy + T&C. Both required for submit. */}\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n <Checkbox\n checked={Boolean(value.privacyConsent)}\n onCheckedChange={(checked) =>\n update({ privacyConsent: checked === true })\n }\n label={\n <>\n {renderConsentLabel(\n 'booking.details.consent.privacy.label',\n privacyPolicyUrl,\n )}\n <span\n aria-hidden=\"true\"\n className=\"ds:text-[var(--destructive)] ds:ms-[var(--spacing-2xs)]\"\n >\n *\n </span>\n </>\n }\n />\n <Checkbox\n checked={Boolean(value.termsConsent)}\n onCheckedChange={(checked) =>\n update({ termsConsent: checked === true })\n }\n label={\n <>\n {renderConsentLabel(\n 'booking.details.consent.terms.label',\n termsUrl,\n )}\n <span\n aria-hidden=\"true\"\n className=\"ds:text-[var(--destructive)] ds:ms-[var(--spacing-2xs)]\"\n >\n *\n </span>\n </>\n }\n />\n </div>\n\n {pickerVisible ? (\n <div\n data-component=\"booking-confirmation-channels\"\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\"\n >\n <CheckboxGroup\n label={t('booking.confirmation.heading')}\n helperText={t('booking.confirmation.helper')}\n value={selectedChannels}\n onChange={(next) =>\n update({\n confirmationChannels: next as ConfirmationChannel[],\n })\n }\n orientation=\"vertical\"\n options={resolvedEnabledChannels.map((c) => ({\n value: c,\n label: t(`booking.confirmation.channel.${c}`),\n }))}\n error={\n noChannelsSelected\n ? t('booking.confirmation.atLeastOne')\n : undefined\n }\n />\n </div>\n ) : null}\n\n {submitError ? (\n <Alert variant=\"error\">\n <Alert.Description>{submitError}</Alert.Description>\n </Alert>\n ) : null}\n\n <Button\n intent=\"primary\"\n size=\"md\"\n type=\"submit\"\n disabled={!canSubmit}\n startIcon={submitting ? <Spinner size=\"sm\" /> : undefined}\n >\n {t('booking.details.submit')}\n </Button>\n </form>\n );\n },\n);\n\nBookingDetailsForm.displayName = 'BookingDetailsForm';\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type KeyboardEvent,\n type ReactNode,\n} from 'react';\nimport { cva } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport {\n Activity,\n Baby,\n Bone,\n Brain,\n CalendarRange,\n ChevronLeft,\n ChevronRight,\n ClipboardCheck,\n Ear,\n Eye,\n HeartPulse,\n Microscope,\n Moon,\n Pill,\n ScanLine,\n Scissors,\n Smile,\n Sparkles,\n Stethoscope,\n Sun,\n Sunset,\n Syringe,\n type LucideIcon,\n} from 'lucide-react';\nimport {\n addDays,\n addMonths,\n endOfMonth,\n format as fnsFormat,\n isAfter,\n isBefore,\n isSameDay,\n isSameMonth,\n parseISO,\n startOfDay,\n startOfMonth,\n subDays,\n subMonths,\n} from 'date-fns';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { bookingAgent } from './booking.agent';\nimport {\n OPERATORS_ALL,\n applyAutoSelects,\n deriveCascade,\n resetOnDateChange,\n resetOnInsuranceChange,\n resetOnOperatorChange,\n resetOnOperatorIdsChange,\n resetOnServiceChange,\n resetOnServiceIdsChange,\n resetOnSlotChange,\n resetOnSpecialtyChange,\n resetOnSpecialtyIdsChange,\n resolveOperatorId,\n type CascadeOutputs,\n type CascadeStep,\n} from './cascade';\nimport { BookingDetailsForm } from './details-form';\nimport type {\n BookingDetails,\n BookingHandle,\n BookingOperator,\n BookingProps,\n BookingService,\n BookingSlot,\n BookingSpecialty,\n BookingValue,\n BookingVariant,\n InsuranceType,\n} from './booking-types';\nimport { Alert } from '../alert/alert';\nimport { Button } from '../button/button';\nimport { IconButton } from '../button/icon-button';\nimport { Select, type SelectOption } from '../select/select';\nimport { Combobox } from '../combobox/combobox';\nimport { MultiSelect } from '../multi-select/multi-select';\nimport type { OptionShape } from '../_shared/option';\nimport { Skeleton } from '../skeleton/skeleton';\nimport { EmptyState } from '../empty-state/empty-state';\nimport { StepperAccordion } from '../stepper-accordion/stepper-accordion';\nimport { StepperProgress } from '../stepper-progress/stepper-progress';\nimport {\n SlotGrid,\n type SlotGridDay,\n type SlotGridSlot,\n} from '../slot-grid/slot-grid';\n\n/* -------------------------------------------------------------------- */\n/* Re-exports */\n/* */\n/* Public types live in `booking-types.ts` so the cascade engine can */\n/* import them without a circular dep. Re-exported here so consumers */\n/* keep importing from `@alfadocs/ui-kit/booking`. */\n/* -------------------------------------------------------------------- */\n\nexport type {\n BookingDetails,\n BookingHandle,\n BookingOperator,\n BookingProps,\n BookingService,\n BookingSlot,\n BookingSpecialty,\n BookingSubmitPayload,\n BookingValidationResult,\n BookingValidator,\n BookingValue,\n BookingVariant,\n ConfirmationChannel,\n InsuranceType,\n} from './booking-types';\nexport { CONFIRMATION_CHANNEL_ORDER } from './booking-types';\nexport { OPERATORS_ALL } from './cascade';\n\n/* -------------------------------------------------------------------- */\n/* Root variant CVA */\n/* -------------------------------------------------------------------- */\n\nconst rootVariants = cva(\n 'ds:flex ds:w-full ds:flex-col ds:text-[var(--foreground)]',\n {\n variants: {\n variant: {\n 'inline-list': 'ds:gap-[var(--spacing-md)]',\n accordion: 'ds:gap-[var(--spacing-md)]',\n calendar: 'ds:gap-[var(--spacing-md)]',\n flexible: 'ds:gap-[var(--spacing-lg)]',\n progress: 'ds:gap-[var(--spacing-sm)]',\n },\n // `surface=\"elevated\"` matches `Card variant=\"elevated\"` — same\n // tokens, same padding, same boundary behaviour — so consumers can\n // drop their own Card wraps without a double-card look. Default\n // `'flat'` preserves 0.30.x rendering.\n surface: {\n flat: '',\n elevated: [\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:shadow-[var(--shadow-card)]',\n 'ds:p-[var(--spacing-md)]',\n ].join(' '),\n },\n },\n defaultVariants: { variant: 'inline-list', surface: 'flat' },\n },\n);\n\n/* -------------------------------------------------------------------- */\n/* Icon inference (kept from 0.25.x — services don't carry an explicit */\n/* icon prop, so we fall back to a keyword-matched Lucide icon). */\n/* -------------------------------------------------------------------- */\n\ntype IconRule = readonly [RegExp, LucideIcon];\n\nconst SERVICE_ICON_RULES: readonly IconRule[] = [\n [\n /\\b(estetic|aesthetic|botox|filler|mesoterap|chirurgia\\s*plastic)/i,\n Syringe,\n ],\n [/\\b(cardio|ecg|elettrocardio|ecocardio|cuore|heart)/i, HeartPulse],\n [/\\b(dent|odonto|tooth|teeth|pulizia|igien|smile)/i, Smile],\n [/\\b(oftalmo|ocul|ophthal|vision|occhi|eye)/i, Eye],\n [/\\b(otorin|udito|orecchi|hearing|ear)/i, Ear],\n [/\\b(neuro|brain|cervello)/i, Brain],\n [/\\b(pediatr|child|bambin)/i, Baby],\n [/\\b(ortop|ortho|osteo|skeleton|ossa|bone)/i, Bone],\n [/\\b(lab|analis|test|sang|esami)/i, Microscope],\n [/\\b(farmaco|pharm|pillol|refill)/i, Pill],\n [/\\b(chirurg|surg|intervent|operat)/i, Scissors],\n [/\\b(scan|rx|x-?ray|raggi|imag|radio|risonan|ecograf|ultras)/i, ScanLine],\n [/\\b(vacc|inject|inie|punto)/i, Syringe],\n [/\\b(derma|skin|pelle)/i, Sparkles],\n [/\\b(prima\\s*visit|first\\s*visit|consult|consulto|valutaz)/i, ClipboardCheck],\n [/\\b(general|medicin|family|control|check[-\\s]?up)/i, Activity],\n];\n\nfunction pickIcon(text: string): LucideIcon | null {\n for (const [pattern, Icon] of SERVICE_ICON_RULES) {\n if (pattern.test(text)) return Icon;\n }\n return null;\n}\n\nfunction inferServiceIcon(service: BookingService): ReactNode {\n const Icon = pickIcon(service.label) ?? Stethoscope;\n return <Icon aria-hidden=\"true\" className=\"ds:size-5\" />;\n}\n\n/* -------------------------------------------------------------------- */\n/* Shared helpers */\n/* -------------------------------------------------------------------- */\n\nfunction isoOf(date: Date): string {\n return fnsFormat(date, 'yyyy-MM-dd');\n}\n\n/* -------------------------------------------------------------------- */\n/* MonthGrid — inline 6×7 calendar with roving tabindex */\n/* -------------------------------------------------------------------- */\n\ninterface MonthGridProps {\n availableDates: string[];\n selectedDate?: string;\n onSelectDate: (iso: string) => void;\n locale: string;\n loading?: boolean;\n}\n\nconst monthCellBase = [\n 'ds:relative ds:flex ds:items-center ds:justify-center',\n 'ds:min-h-[var(--min-target-size)] ds:min-w-[var(--min-target-size)]',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:text-[length:var(--font-size-sm)]',\n 'ds:transition-colors ds:duration-[var(--animation-duration)]',\n '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-[var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n].join(' ');\n\nconst monthCellVariants = cva(monthCellBase, {\n variants: {\n state: {\n available:\n 'ds:cursor-pointer ds:text-[var(--foreground)] ds:hover:bg-[var(--muted)]/30',\n unavailable: 'ds:cursor-not-allowed ds:text-[var(--muted-foreground)]/60',\n selected:\n 'ds:bg-[var(--primary)] ds:text-[var(--primary-foreground)] ds:font-[var(--font-weight-semibold)]',\n outside: 'ds:text-[var(--muted-foreground)]/40',\n },\n },\n defaultVariants: { state: 'unavailable' },\n});\n\nfunction MonthGrid({\n availableDates,\n selectedDate,\n onSelectDate,\n locale,\n loading,\n}: MonthGridProps) {\n const { t } = useTranslation();\n\n const initialMonth = useMemo<Date>(() => {\n if (selectedDate) return startOfMonth(parseISO(selectedDate));\n if (availableDates.length > 0) {\n return startOfMonth(parseISO(availableDates[0]));\n }\n return startOfMonth(new Date());\n }, [selectedDate, availableDates]);\n\n const [viewMonth, setViewMonth] = useState<Date>(initialMonth);\n const [focusDate, setFocusDate] = useState<Date | null>(null);\n\n const cells = useMemo(() => {\n const monthStart = startOfMonth(viewMonth);\n const monthEnd = endOfMonth(viewMonth);\n const startWeekday = monthStart.getDay();\n const totalDays = monthEnd.getDate();\n const grid: Date[] = [];\n for (let i = startWeekday; i > 0; i -= 1) {\n const d = new Date(monthStart);\n d.setDate(monthStart.getDate() - i);\n grid.push(d);\n }\n for (let i = 0; i < totalDays; i += 1) {\n const d = new Date(monthStart);\n d.setDate(monthStart.getDate() + i);\n grid.push(d);\n }\n while (grid.length < 42) {\n const last = grid[grid.length - 1];\n const d = new Date(last);\n d.setDate(last.getDate() + 1);\n grid.push(d);\n }\n return grid;\n }, [viewMonth]);\n\n const monthLabel = useMemo(() => {\n try {\n return new Intl.DateTimeFormat(locale, {\n month: 'long',\n year: 'numeric',\n }).format(viewMonth);\n } catch {\n return fnsFormat(viewMonth, 'MMMM yyyy');\n }\n }, [viewMonth, locale]);\n\n const weekdayLabels = useMemo(() => {\n const base = new Date(2024, 0, 7);\n return Array.from({ length: 7 }, (_, i) => {\n const d = new Date(base);\n d.setDate(base.getDate() + i);\n try {\n return new Intl.DateTimeFormat(locale, { weekday: 'short' }).format(d);\n } catch {\n return fnsFormat(d, 'EEE');\n }\n });\n }, [locale]);\n\n const availableSet = useMemo(() => new Set(availableDates), [availableDates]);\n const isAvailable = useCallback(\n (date: Date) => availableSet.has(isoOf(date)),\n [availableSet],\n );\n\n const rovingDate = useMemo<Date | null>(() => {\n if (focusDate) return focusDate;\n if (selectedDate) return parseISO(selectedDate);\n const firstAvailable = cells.find(\n (d) => isSameMonth(d, viewMonth) && isAvailable(d),\n );\n if (firstAvailable) return firstAvailable;\n return cells.find((d) => isSameMonth(d, viewMonth)) ?? null;\n }, [focusDate, selectedDate, cells, viewMonth, isAvailable]);\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLButtonElement>, current: Date) => {\n let next: Date | null = null;\n switch (event.key) {\n case 'ArrowLeft':\n next = new Date(current);\n next.setDate(current.getDate() - 1);\n break;\n case 'ArrowRight':\n next = new Date(current);\n next.setDate(current.getDate() + 1);\n break;\n case 'ArrowUp':\n next = new Date(current);\n next.setDate(current.getDate() - 7);\n break;\n case 'ArrowDown':\n next = new Date(current);\n next.setDate(current.getDate() + 7);\n break;\n case 'Home':\n next = new Date(current);\n next.setDate(current.getDate() - current.getDay());\n break;\n case 'End':\n next = new Date(current);\n next.setDate(current.getDate() + (6 - current.getDay()));\n break;\n case 'Enter':\n case ' ': {\n event.preventDefault();\n if (isAvailable(current)) onSelectDate(isoOf(current));\n return;\n }\n default:\n return;\n }\n if (!next) return;\n event.preventDefault();\n if (!isSameMonth(next, viewMonth)) {\n setViewMonth(startOfMonth(next));\n }\n setFocusDate(next);\n },\n [isAvailable, onSelectDate, viewMonth],\n );\n\n if (loading) {\n return (\n <div\n role=\"status\"\n aria-live=\"polite\"\n aria-label={t('common.loading')}\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\"\n >\n <Skeleton variant=\"text\" width=\"40%\" />\n <div className=\"ds:grid ds:grid-cols-7 ds:gap-[var(--spacing-2xs)]\">\n {Array.from({ length: 42 }, (_, i) => (\n <Skeleton key={`mg-skel-${i}`} variant=\"rounded\" height=\"2.5rem\" />\n ))}\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n <div className=\"ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)]\">\n <IconButton\n icon={<ChevronLeft />}\n aria-label={t('booking.previousMonth')}\n size=\"sm\"\n intent=\"ghost\"\n flipIconInRtl\n onClick={() => {\n setViewMonth((m) => subMonths(m, 1));\n setFocusDate(null);\n }}\n />\n <span\n className=\"type-label ds:font-[var(--font-weight-semibold)] ds:text-[var(--foreground)]\"\n aria-live=\"polite\"\n >\n {monthLabel}\n </span>\n <IconButton\n icon={<ChevronRight />}\n aria-label={t('booking.nextMonth')}\n size=\"sm\"\n intent=\"ghost\"\n flipIconInRtl\n onClick={() => {\n setViewMonth((m) => addMonths(m, 1));\n setFocusDate(null);\n }}\n />\n </div>\n <div\n role=\"grid\"\n aria-label={t('booking.monthGridLabel')}\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)]\"\n >\n <div\n role=\"row\"\n className=\"ds:grid ds:grid-cols-7 ds:gap-[var(--spacing-2xs)]\"\n >\n {weekdayLabels.map((label, i) => (\n <div\n key={`wd-${i}`}\n role=\"columnheader\"\n className=\"type-meta ds:text-center ds:text-[var(--muted-foreground)] ds:font-[var(--font-weight-medium)]\"\n >\n {label}\n </div>\n ))}\n </div>\n {Array.from({ length: 6 }, (_, rowIndex) => (\n <div\n key={`mg-row-${rowIndex}`}\n role=\"row\"\n className=\"ds:grid ds:grid-cols-7 ds:gap-[var(--spacing-2xs)]\"\n >\n {cells\n .slice(rowIndex * 7, rowIndex * 7 + 7)\n .map((date, colIndex) => {\n const i = rowIndex * 7 + colIndex;\n const inMonth = isSameMonth(date, viewMonth);\n const available = inMonth && isAvailable(date);\n const isSelected = selectedDate\n ? isSameDay(date, parseISO(selectedDate))\n : false;\n const state:\n | 'available'\n | 'unavailable'\n | 'selected'\n | 'outside' = !inMonth\n ? 'outside'\n : isSelected\n ? 'selected'\n : available\n ? 'available'\n : 'unavailable';\n const isRoving = rovingDate\n ? isSameDay(rovingDate, date)\n : false;\n const dayLabel = (() => {\n try {\n return new Intl.DateTimeFormat(locale, {\n dateStyle: 'full',\n }).format(date);\n } catch {\n return fnsFormat(date, 'PPP');\n }\n })();\n return (\n <button\n key={`mg-cell-${i}`}\n type=\"button\"\n role=\"gridcell\"\n aria-label={dayLabel}\n aria-selected={isSelected || undefined}\n aria-disabled={!available || undefined}\n tabIndex={isRoving ? 0 : -1}\n disabled={!available}\n onClick={() => {\n if (available) onSelectDate(isoOf(date));\n }}\n onKeyDown={(e) => handleKeyDown(e, date)}\n className={monthCellVariants({ state })}\n >\n <span aria-hidden=\"true\">{date.getDate()}</span>\n </button>\n );\n })}\n </div>\n ))}\n </div>\n </div>\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* ServiceCardGroup — hand-rolled radiogroup for service selection. */\n/* */\n/* Used by the `inline-list` variant where services render as full-row */\n/* cards with the inferred icon. Other variants use a Select dropdown */\n/* via `ServiceStep` below. */\n/* -------------------------------------------------------------------- */\n\nconst serviceCardVariants = cva(\n [\n 'ds:relative ds:flex ds:w-full ds:items-center ds:gap-[var(--spacing-md)]',\n 'ds:min-h-[var(--min-target-size)]',\n 'ds:rounded-[var(--radius-md)]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-sm)]',\n 'ds:text-start',\n 'ds:transition-[background-color,box-shadow]',\n 'ds:duration-[var(--animation-duration)]',\n '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-[var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:[outline:1px_solid_CanvasText]',\n 'ds:cursor-pointer',\n ].join(' '),\n {\n variants: {\n state: {\n idle: 'ds:bg-[var(--card)] ds:shadow-[var(--shadow-sm)] ds:hover:shadow-[var(--shadow-md)]',\n selected:\n 'ds:bg-[color-mix(in_srgb,var(--primary)_8%,var(--card))] ds:shadow-[var(--shadow-sm)]',\n },\n },\n defaultVariants: { state: 'idle' },\n },\n);\n\ninterface ServiceCardGroupProps {\n services: BookingService[];\n selectedServiceId?: string;\n onSelect: (id: string) => void;\n}\n\nfunction ServiceCardGroup({\n services,\n selectedServiceId,\n onSelect,\n}: ServiceCardGroupProps) {\n const { t } = useTranslation();\n const groupId = useId();\n\n const [focusIndex, setFocusIndex] = useState<number>(() => {\n if (selectedServiceId) {\n const i = services.findIndex((s) => s.id === selectedServiceId);\n if (i >= 0) return i;\n }\n return 0;\n });\n\n const cardRefs = useRef<Map<number, HTMLButtonElement>>(new Map());\n const focusAt = useCallback((index: number) => {\n cardRefs.current.get(index)?.focus();\n }, []);\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLButtonElement>, index: number, id: string) => {\n const total = services.length;\n if (total === 0) return;\n switch (event.key) {\n case 'ArrowDown':\n case 'ArrowRight': {\n event.preventDefault();\n const next = (index + 1) % total;\n setFocusIndex(next);\n focusAt(next);\n break;\n }\n case 'ArrowUp':\n case 'ArrowLeft': {\n event.preventDefault();\n const prev = (index - 1 + total) % total;\n setFocusIndex(prev);\n focusAt(prev);\n break;\n }\n case 'Home': {\n event.preventDefault();\n setFocusIndex(0);\n focusAt(0);\n break;\n }\n case 'End': {\n event.preventDefault();\n const last = total - 1;\n setFocusIndex(last);\n focusAt(last);\n break;\n }\n case 'Enter':\n case ' ': {\n event.preventDefault();\n onSelect(id);\n break;\n }\n default:\n break;\n }\n },\n [services.length, focusAt, onSelect],\n );\n\n if (services.length === 0) {\n return null;\n }\n\n return (\n <div\n role=\"radiogroup\"\n aria-label={t('booking.serviceListLabel')}\n id={groupId}\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\"\n >\n {services.map((service, index) => {\n const isSelected = selectedServiceId === service.id;\n const isFocused = focusIndex === index;\n const ariaLabel = t('booking.serviceCardLabel', {\n label: service.label,\n duration: service.durationMin,\n });\n const iconNode = inferServiceIcon(service);\n return (\n <button\n key={service.id}\n ref={(node) => {\n if (node) cardRefs.current.set(index, node);\n else cardRefs.current.delete(index);\n }}\n type=\"button\"\n role=\"radio\"\n aria-checked={isSelected}\n aria-label={ariaLabel}\n tabIndex={isFocused ? 0 : -1}\n onClick={() => onSelect(service.id)}\n onFocus={() => setFocusIndex(index)}\n onKeyDown={(e) => handleKeyDown(e, index, service.id)}\n className={serviceCardVariants({\n state: isSelected ? 'selected' : 'idle',\n })}\n >\n <span\n aria-hidden=\"true\"\n className=\"ds:flex ds:size-10 ds:shrink-0 ds:items-center ds:justify-center ds:rounded-[var(--radius-sm)] ds:bg-[var(--primary)]/10 ds:text-[var(--primary)]\"\n >\n {iconNode}\n </span>\n <span className=\"ds:flex ds:min-w-0 ds:flex-1 ds:flex-col ds:gap-[var(--spacing-2xs)]\">\n <span className=\"type-label ds:font-[var(--font-weight-semibold)] ds:text-[var(--foreground)]\">\n {service.label}\n </span>\n <span className=\"type-meta ds:text-[var(--muted-foreground)]\">\n {t('booking.serviceSummary', { minutes: service.durationMin })}\n </span>\n </span>\n </button>\n );\n })}\n </div>\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* GroupedTimeSlots — calendar variant's morning/afternoon/evening slots */\n/* -------------------------------------------------------------------- */\n\nconst slotChipVariants = cva(\n [\n 'ds:inline-flex ds:items-center ds:justify-center ds:gap-[var(--spacing-2xs)]',\n 'ds:min-h-[var(--min-target-size)]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:pt-[var(--spacing-2xs)] ds:pb-[var(--spacing-2xs)]',\n 'ds:rounded-[var(--radius-md)]',\n 'ds:text-[length:var(--font-size-sm)] ds:font-[var(--font-weight-medium)]',\n 'ds:transition-[background-color,color,box-shadow] ds:duration-[var(--animation-duration)]',\n '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:disabled:cursor-not-allowed ds:disabled:opacity-50',\n 'ds:forced-colors:[border:1px_solid_ButtonText] ds:forced-colors:text-[ButtonText]',\n ].join(' '),\n {\n variants: {\n state: {\n idle: 'ds:bg-[color:var(--card)] ds:text-[color:var(--foreground)] ds:shadow-[var(--shadow-sm)] ds:hover:enabled:bg-[color:var(--muted)]/40 ds:hover:enabled:shadow-[var(--shadow-md)]',\n selected:\n 'ds:bg-[color:var(--primary)] ds:text-[color:var(--primary-foreground)] ds:shadow-[var(--shadow-sm)]',\n unavailable:\n 'ds:[outline:1px_dashed_color:var(--border)] ds:[outline-offset:-1px] ds:bg-transparent ds:text-[color:var(--muted-foreground)]',\n },\n },\n defaultVariants: { state: 'idle' },\n },\n);\n\ntype TimeOfDay = 'morning' | 'afternoon' | 'evening';\n\nfunction bucketForTime(time: string): TimeOfDay {\n const [hh] = time.split(':').map((s) => parseInt(s, 10));\n const hour = Number.isFinite(hh) ? hh : 0;\n if (hour < 12) return 'morning';\n if (hour < 17) return 'afternoon';\n return 'evening';\n}\n\nconst BUCKET_ICONS: Record<TimeOfDay, LucideIcon> = {\n morning: Sun,\n afternoon: Sunset,\n evening: Moon,\n};\n\ninterface GroupedTimeSlotsProps {\n date: string;\n slots: BookingSlot[];\n selectedSlotKey?: string;\n onSelect: (slot: BookingSlot) => void;\n loading?: boolean;\n locale: string;\n}\n\nfunction GroupedTimeSlots({\n date,\n slots,\n selectedSlotKey,\n onSelect,\n loading,\n locale,\n}: GroupedTimeSlotsProps) {\n const { t } = useTranslation();\n\n const dateLabel = useMemo(() => {\n try {\n return new Intl.DateTimeFormat(locale, {\n weekday: 'long',\n day: 'numeric',\n month: 'long',\n }).format(parseISO(date));\n } catch {\n return date;\n }\n }, [date, locale]);\n\n const groups = useMemo(() => {\n const result: Record<TimeOfDay, BookingSlot[]> = {\n morning: [],\n afternoon: [],\n evening: [],\n };\n for (const slot of slots) {\n result[bucketForTime(slot.time)].push(slot);\n }\n return result;\n }, [slots]);\n\n const availableCount = slots.filter((s) => s.available).length;\n const order: TimeOfDay[] = ['morning', 'afternoon', 'evening'];\n\n if (loading) {\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n <Skeleton variant=\"text\" width=\"60%\" />\n {[0, 1].map((row) => (\n <div\n key={row}\n className=\"ds:grid ds:grid-cols-3 ds:gap-[var(--spacing-xs)]\"\n >\n {[0, 1, 2].map((c) => (\n <Skeleton key={c} variant=\"rounded\" height=\"44px\" />\n ))}\n </div>\n ))}\n </div>\n );\n }\n\n if (availableCount === 0) {\n return (\n <EmptyState variant=\"no-results\" title={t('booking.noSlotsForDate')} />\n );\n }\n\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\">\n <div className=\"ds:flex ds:items-baseline ds:justify-between ds:gap-[var(--spacing-sm)]\">\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-xs)]\">\n <CalendarRange\n aria-hidden=\"true\"\n className=\"ds:size-4 ds:text-[color:var(--accent)]\"\n />\n <h3 className=\"type-label ds:font-[var(--font-weight-semibold)] ds:text-[var(--foreground)] ds:m-0\">\n {dateLabel}\n </h3>\n </div>\n <span className=\"type-meta ds:text-[var(--muted-foreground)]\">\n {t('booking.slotsAvailable', { count: availableCount })}\n </span>\n </div>\n {order.map((bucket) => {\n const items = groups[bucket];\n if (items.length === 0) return null;\n const Icon = BUCKET_ICONS[bucket];\n return (\n <div\n key={bucket}\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\"\n >\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-xs)] ds:text-[color:var(--muted-foreground)]\">\n <Icon aria-hidden=\"true\" className=\"ds:size-3.5\" />\n <span className=\"type-meta ds:font-[var(--font-weight-semibold)] ds:uppercase\">\n {t(`booking.timeOfDay.${bucket}`)}\n </span>\n </div>\n <div\n role=\"group\"\n aria-label={t(`booking.timeOfDay.${bucket}`)}\n className=\"ds:grid ds:grid-cols-3 ds:gap-[var(--spacing-xs)] ds:sm:grid-cols-4\"\n >\n {items.map((slot) => {\n const isSelected = slot.key === selectedSlotKey;\n const state = !slot.available\n ? 'unavailable'\n : isSelected\n ? 'selected'\n : 'idle';\n return (\n <button\n key={slot.key}\n type=\"button\"\n data-slot-id={slot.key}\n disabled={!slot.available}\n aria-pressed={isSelected}\n aria-label={t('booking.slotAvailableLabel', {\n time: slot.time,\n })}\n onClick={() => slot.available && onSelect(slot)}\n className={slotChipVariants({ state })}\n >\n {slot.time}\n </button>\n );\n })}\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* FourDayPicker — adapter for `datePickerStyle='four-day-grid'` */\n/* */\n/* Thin wrapper around the kit's `<SlotGrid>` primitive that translates */\n/* Booking's data shape (`availableDates`, `availableSlots`, `value`) */\n/* into the SlotGrid `days` array, and back from SlotGrid's `onSlotSelect`*/\n/* into Booking's atomic date+slot onChange. Window of 4 days, ±4-day */\n/* arrow navigation, \"Show more\" expander at 6 slots (matches prod). */\n/* */\n/* Slot selection sets `value.date` and `value.slotKey` atomically (one */\n/* onChange call composing resetOnDateChange + resetOnSlotChange). That */\n/* matches the prod UX where a user clicks a tile directly without a */\n/* separate date pick. `onDateSelect` fires alongside so consumers using */\n/* the two-query lazy-load pattern get the same signal as the month- */\n/* calendar picker. The cascade's separate \"slot\" step is suppressed */\n/* (see `renderSlotStep`) because the slots are inline with the strip. */\n/* -------------------------------------------------------------------- */\n\nconst FOUR_DAY_WINDOW_SIZE = 4;\n\ninterface FourDayPickerProps {\n availableDates: string[];\n availableSlots: Record<string, BookingSlot[]>;\n value: BookingValue;\n onChange: (next: BookingValue) => void;\n onDateSelect?: (iso: string) => void;\n onWindowChange?: (startIso: string, endIso: string) => void;\n loadingDates?: boolean;\n loadingSlots?: boolean;\n locale: string;\n}\n\nfunction FourDayPicker({\n availableDates,\n availableSlots,\n value,\n onChange,\n onDateSelect,\n onWindowChange,\n loadingDates,\n loadingSlots,\n locale,\n}: FourDayPickerProps) {\n const today = useMemo(() => startOfDay(new Date()), []);\n\n // Initial window: snap to value.date if set and not in the past;\n // otherwise to the first availableDate when it's in the future;\n // otherwise today. Saves the user from manually advancing 4-day\n // chunks when availability is days or weeks out.\n const [windowStart, setWindowStart] = useState<Date>(() => {\n if (value.date) {\n const d = startOfDay(parseISO(value.date));\n if (!isAfter(today, d)) return d;\n }\n if (availableDates.length > 0) {\n const first = startOfDay(parseISO(availableDates[0]));\n if (isAfter(first, today)) return first;\n }\n return today;\n });\n\n const windowEnd = useMemo(\n () => addDays(windowStart, FOUR_DAY_WINDOW_SIZE - 1),\n [windowStart],\n );\n\n // Build the SlotGrid days array — one entry per visible calendar\n // day in the 4-day window. Columns without availability render as\n // empty columns (SlotGrid handles the \"no slots\" rendering itself).\n const days = useMemo<SlotGridDay[]>(() => {\n return Array.from({ length: FOUR_DAY_WINDOW_SIZE }, (_, i) => {\n const d = addDays(windowStart, i);\n const iso = isoOf(d);\n const bookingSlots = availableSlots[iso] ?? [];\n const slots: SlotGridSlot[] = bookingSlots.map((s) => ({\n id: s.key,\n // SlotGrid formats `start` as a time via Intl.DateTimeFormat —\n // compose a full ISO from the column's date + the slot's HH:mm\n // so the locale-formatter has a real timestamp to work with.\n start: `${iso}T${s.time}:00`,\n available: s.available,\n }));\n return { date: iso, slots };\n });\n }, [windowStart, availableSlots]);\n\n const hasPrevious = isAfter(windowStart, today);\n // 0.33.11: forward navigation is unconditional. With two-query\n // consumers, `availableDates` reflects only what's been fetched —\n // gating on it would lock the user out of exploring further\n // windows the consumer hasn't fetched yet. `onWindowChange` lets\n // the consumer lazy-load as the user advances; the \"no slots in\n // window\" state is handled by the next-available banner (fix 2).\n const hasNext = true;\n\n const handlePreviousDays = useCallback(() => {\n setWindowStart((prev) => {\n const next = subDays(prev, FOUR_DAY_WINDOW_SIZE);\n // Clamp at today so the strip never shows past dates.\n return isAfter(today, next) ? today : next;\n });\n }, [today]);\n\n const handleNextDays = useCallback(() => {\n setWindowStart((prev) => addDays(prev, FOUR_DAY_WINDOW_SIZE));\n }, []);\n\n // Fix 1 (0.33.11): re-sync windowStart when availableDates arrives.\n // Two-query consumers ship [] on first render and the real list\n // arrives a frame later — the useState initialiser has already\n // locked windowStart at today and the picker shows today..today+3\n // empty even when the summary returned dates starting day+7.\n //\n // Only snap when the current window has zero overlap with\n // availability AND the first available date is in the future. The\n // overlap check (any availableDate inside [windowStart..windowEnd])\n // preserves user navigation — once they've advanced past the first\n // available date to look further out, we don't yank them back.\n useEffect(() => {\n if (availableDates.length === 0) return;\n const firstAvailable = startOfDay(parseISO(availableDates[0]));\n if (!isAfter(firstAvailable, today)) return;\n const overlaps = availableDates.some((iso) => {\n const d = startOfDay(parseISO(iso));\n return !isAfter(d, windowEnd) && !isBefore(d, windowStart);\n });\n if (overlaps) return;\n setWindowStart(firstAvailable);\n // Intentionally omits windowStart / windowEnd / today — react\n // only to new availability lists. Re-snapping every time the\n // window moves would trap the user inside the first-available\n // 4-day chunk.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [availableDates]);\n\n // Fix 3 (0.33.11): notify two-query consumers whenever the\n // visible window starts or shifts so they can lazy-fetch\n // dailySlots/{date} for the now-visible dates. Fires on mount\n // with the resolved initial window, then on every prev/next\n // arrow click, the fix-1 auto-sync, and the fix-2 jump CTA.\n useEffect(() => {\n onWindowChange?.(isoOf(windowStart), isoOf(windowEnd));\n }, [windowStart, windowEnd, onWindowChange]);\n\n const handleSlotSelect = useCallback(\n (slot: SlotGridSlot, day: SlotGridDay) => {\n const dateIso = typeof day.date === 'string' ? day.date : isoOf(day.date);\n // Atomic: set date + slot in one onChange so cascade.gates.slot\n // observes both together. Without this the consumer would see\n // two renders (date set, then slotKey set) which can re-fire\n // analytics / loading effects unnecessarily.\n onChange({\n ...resetOnSlotChange(resetOnDateChange(value, dateIso), slot.id),\n });\n onDateSelect?.(dateIso);\n },\n [onChange, onDateSelect, value],\n );\n\n // SlotGrid has a single loading state — either flag triggers the\n // shimmer (granular per-header vs per-tile shimmer would require\n // a SlotGrid API extension; treating both as one loading state\n // already satisfies the 0.33.9 split for two-query consumers since\n // only one of the two flags is set at a time in that pattern).\n const state: 'default' | 'loading' =\n loadingDates || loadingSlots ? 'loading' : 'default';\n\n // Fix 2 (0.33.11): \"Next available\" banner above the SlotGrid\n // when the visible window has no slots but the consumer told us\n // availability exists somewhere. Covers two cases the original\n // picker had no recovery for: (a) the user hasn't yet reached\n // the first available date (window is BEFORE availability), and\n // (b) the user advanced past availability (window is AFTER all\n // known available dates). Both render the same banner pointing\n // back to `availableDates[0]` with a jump button.\n //\n // The SlotGrid itself stays mounted so the column headers remain\n // visible — the banner sits above as the recovery affordance.\n const visibleWindowHasSlots = days.some((d) => d.slots.length > 0);\n const firstAvailableIso = availableDates[0];\n const showJumpCta = !visibleWindowHasSlots && !!firstAvailableIso;\n\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n {showJumpCta ? (\n <NextAvailableCta\n nextAvailableDate={firstAvailableIso}\n onJump={() => setWindowStart(startOfDay(parseISO(firstAvailableIso)))}\n locale={locale}\n />\n ) : null}\n <SlotGrid\n days={days}\n state={state}\n selectedSlotId={value.slotKey}\n maxInitialSlotsPerDay={6}\n locale={locale}\n hasPrevious={hasPrevious}\n hasNext={hasNext}\n onSlotSelect={handleSlotSelect}\n onPreviousDays={handlePreviousDays}\n onNextDays={handleNextDays}\n />\n </div>\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* renderDateStep / renderSlotStep — variant-agnostic picker renderers */\n/* */\n/* Both InlineListBody and getStepNode (the cascade-variant body shared */\n/* renderer) call these helpers instead of inlining `<MonthGrid>` / */\n/* `<GroupedTimeSlots>`. Switches on `datePickerStyle`: */\n/* */\n/* - 'month-calendar' (default): MonthGrid for date, GroupedTimeSlots */\n/* for slot. Byte-identical to pre-0.33.10 behaviour. */\n/* - 'four-day-grid': FourDayPicker for date (slots embedded); */\n/* renderSlotStep returns null since slots are inline. */\n/* -------------------------------------------------------------------- */\n\ninterface DateStepRenderProps {\n inputs: VariantBodyProps['inputs'];\n value: BookingValue;\n onChange: (next: BookingValue) => void;\n onDateSelect?: (iso: string) => void;\n onWindowChange?: (startIso: string, endIso: string) => void;\n loadingDates?: boolean;\n loadingSlots?: boolean;\n locale: string;\n datePickerStyle: 'month-calendar' | 'four-day-grid';\n}\n\nfunction renderDateStep(props: DateStepRenderProps): ReactNode {\n const {\n inputs,\n value,\n onChange,\n onDateSelect,\n onWindowChange,\n loadingDates,\n loadingSlots,\n locale,\n datePickerStyle,\n } = props;\n if (datePickerStyle === 'four-day-grid') {\n return (\n <FourDayPicker\n availableDates={inputs.availableDates}\n availableSlots={inputs.availableSlots}\n value={value}\n onChange={onChange}\n onDateSelect={onDateSelect}\n onWindowChange={onWindowChange}\n loadingDates={loadingDates}\n loadingSlots={loadingSlots}\n locale={locale}\n />\n );\n }\n return (\n <MonthGrid\n availableDates={inputs.availableDates}\n selectedDate={value.date}\n onSelectDate={(iso) => {\n onChange(resetOnDateChange(value, iso));\n onDateSelect?.(iso);\n }}\n locale={locale}\n loading={loadingDates ?? loadingSlots}\n />\n );\n}\n\nfunction renderSlotStep(props: DateStepRenderProps): ReactNode {\n const { inputs, value, onChange, loadingSlots, locale, datePickerStyle } =\n props;\n // four-day-grid embeds the slot tiles inside the picker itself —\n // no separate slot block needed in the variant body.\n if (datePickerStyle === 'four-day-grid') return null;\n if (!value.date) return null;\n return (\n <GroupedTimeSlots\n date={value.date}\n slots={inputs.availableSlots[value.date] ?? []}\n selectedSlotKey={value.slotKey}\n onSelect={(slot) => onChange(resetOnSlotChange(value, slot.key))}\n loading={loadingSlots}\n locale={locale}\n />\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* Step subcomponents */\n/* */\n/* Each step is rendered by every variant that needs it. The variants */\n/* differ in layout (chip rail vs accordion vs vertical list) but the */\n/* step content itself is the same. */\n/* -------------------------------------------------------------------- */\n\ninterface InsuranceStepProps {\n value?: InsuranceType;\n onChange: (next: InsuranceType) => void;\n}\n\nfunction InsuranceStep({ value, onChange }: InsuranceStepProps) {\n const { t } = useTranslation();\n const options: SelectOption[] = [\n { value: 'private', label: t('booking.insurance.private') },\n { value: 'public', label: t('booking.insurance.public') },\n ];\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n <h3 className=\"type-label ds:font-[var(--font-weight-semibold)] ds:text-[var(--foreground)] ds:m-0\">\n {t('booking.insurance.heading')}\n </h3>\n <Select\n options={options}\n value={value ?? ''}\n onValueChange={(next) => {\n if (next === 'private' || next === 'public') onChange(next);\n }}\n placeholder={t('booking.insurance.placeholder')}\n aria-label={t('booking.insurance.heading')}\n />\n </div>\n );\n}\n\ninterface SpecialtyStepProps {\n specialties: BookingSpecialty[];\n value?: string;\n valueIds?: string[];\n onChange: (next: string) => void;\n onChangeIds?: (next: string[]) => void;\n pickerStyle?: 'select' | 'combobox' | 'multi-select';\n}\n\nfunction SpecialtyStep({\n specialties,\n value,\n valueIds,\n onChange,\n onChangeIds,\n pickerStyle = 'select',\n}: SpecialtyStepProps) {\n const { t } = useTranslation();\n const options: OptionShape[] = specialties.map((s) => ({\n value: s.id,\n label: s.label,\n }));\n const heading = (\n <h3 className=\"type-label ds:font-[var(--font-weight-semibold)] ds:text-[var(--foreground)] ds:m-0\">\n {t('booking.specialty.heading')}\n </h3>\n );\n if (pickerStyle === 'multi-select' && onChangeIds) {\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n {heading}\n <MultiSelect\n options={options}\n value={valueIds ?? []}\n onChange={onChangeIds}\n placeholder={t('booking.specialty.placeholder')}\n aria-label={t('booking.specialty.heading')}\n allowClear\n />\n </div>\n );\n }\n if (pickerStyle === 'combobox') {\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n {heading}\n <Combobox\n options={options}\n value={value ?? ''}\n onValueChange={(next) => onChange(next === '' ? '' : next)}\n placeholder={t('booking.specialty.placeholder')}\n aria-label={t('booking.specialty.heading')}\n clearable\n />\n </div>\n );\n }\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n {heading}\n <Select\n options={options as SelectOption[]}\n value={value ?? ''}\n onValueChange={(next) => onChange(next)}\n placeholder={t('booking.specialty.placeholder')}\n aria-label={t('booking.specialty.heading')}\n />\n </div>\n );\n}\n\ninterface ServiceStepProps {\n services: BookingService[];\n value?: string;\n valueIds?: string[];\n onChange: (next: string) => void;\n onChangeIds?: (next: string[]) => void;\n /**\n * 0.34.0: explicit picker style. When undefined, falls back to the\n * `compact` boolean (true → 'select', false → 'cards') so existing\n * variant-body code continues to work unchanged.\n */\n pickerStyle?: 'select' | 'combobox' | 'multi-select' | 'cards';\n /** @deprecated 0.34.0 — pass `pickerStyle='cards'` (default) or `'select'` instead. */\n compact?: boolean;\n}\n\nfunction ServiceStep({\n services,\n value,\n valueIds,\n onChange,\n onChangeIds,\n pickerStyle,\n compact,\n}: ServiceStepProps) {\n const { t } = useTranslation();\n const resolvedStyle = pickerStyle ?? (compact ? 'select' : 'cards');\n const options: OptionShape[] = services.map((s) => ({\n value: s.id,\n label: `${s.label} · ${t('booking.serviceSummary', {\n minutes: s.durationMin,\n })}`,\n }));\n const heading = (\n <h3 className=\"type-label ds:font-[var(--font-weight-semibold)] ds:text-[var(--foreground)] ds:m-0\">\n {t('booking.service.heading')}\n </h3>\n );\n if (resolvedStyle === 'multi-select' && onChangeIds) {\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n {heading}\n <MultiSelect\n options={options}\n value={valueIds ?? []}\n onChange={onChangeIds}\n placeholder={t('booking.service.placeholder')}\n aria-label={t('booking.service.heading')}\n allowClear\n />\n </div>\n );\n }\n if (resolvedStyle === 'combobox') {\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n {heading}\n <Combobox\n options={options}\n value={value ?? ''}\n onValueChange={(next) => onChange(next === '' ? '' : next)}\n placeholder={t('booking.service.placeholder')}\n aria-label={t('booking.service.heading')}\n clearable\n />\n </div>\n );\n }\n if (resolvedStyle === 'select') {\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n {heading}\n <Select\n options={options as SelectOption[]}\n value={value ?? ''}\n onValueChange={(next) => onChange(next)}\n placeholder={t('booking.service.placeholder')}\n aria-label={t('booking.service.heading')}\n />\n </div>\n );\n }\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n {heading}\n <ServiceCardGroup\n services={services}\n selectedServiceId={value}\n onSelect={onChange}\n />\n </div>\n );\n}\n\ninterface OperatorStepProps {\n operators: BookingOperator[];\n value?: string;\n valueIds?: string[];\n onChange: (next: string) => void;\n onChangeIds?: (next: string[]) => void;\n pickerStyle?: 'select' | 'combobox' | 'multi-select';\n}\n\nfunction OperatorStep({\n operators,\n value,\n valueIds,\n onChange,\n onChangeIds,\n pickerStyle = 'select',\n}: OperatorStepProps) {\n const { t } = useTranslation();\n const heading = (\n <h3 className=\"type-label ds:font-[var(--font-weight-semibold)] ds:text-[var(--foreground)] ds:m-0\">\n {t('booking.operator.heading')}\n </h3>\n );\n // Multi-select drops the \"all\" sentinel — selecting zero operators\n // (an empty array) already means \"no preference.\"\n if (pickerStyle === 'multi-select' && onChangeIds) {\n const options: OptionShape[] = operators.map((op) => ({\n value: op.id,\n label: op.name,\n }));\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n {heading}\n <MultiSelect\n options={options}\n value={valueIds ?? []}\n onChange={onChangeIds}\n placeholder={t('booking.operator.placeholder')}\n aria-label={t('booking.operator.heading')}\n allowClear\n />\n </div>\n );\n }\n // \"All operators\" is always the first option — matches the legacy\n // `OPERATORS_ALL` sentinel from the booking-website state hook.\n const options: OptionShape[] = [\n { value: OPERATORS_ALL, label: t('booking.operator.all') },\n ...operators.map((op) => ({ value: op.id, label: op.name })),\n ];\n if (pickerStyle === 'combobox') {\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n {heading}\n <Combobox\n options={options}\n value={value ?? OPERATORS_ALL}\n onValueChange={(next) => onChange(next === '' ? OPERATORS_ALL : next)}\n placeholder={t('booking.operator.placeholder')}\n aria-label={t('booking.operator.heading')}\n clearable\n />\n </div>\n );\n }\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n {heading}\n <Select\n options={options as SelectOption[]}\n value={value ?? OPERATORS_ALL}\n onValueChange={(next) => onChange(next)}\n placeholder={t('booking.operator.placeholder')}\n aria-label={t('booking.operator.heading')}\n />\n </div>\n );\n}\n\ninterface OnboardingIncompleteAlertProps {\n customSlot?: ReactNode;\n}\n\nfunction OnboardingIncompleteAlert({\n customSlot,\n}: OnboardingIncompleteAlertProps) {\n const { t } = useTranslation();\n if (customSlot) return <>{customSlot}</>;\n // Use Alert.Title with `as=\"h4\"` so the heading-order stays valid\n // inside the booking section (which has h2 panel + h3 step headers).\n // The default h5 would skip the h4 level and trip\n // `heading-order` in axe.\n return (\n <Alert variant=\"warning\">\n <Alert.Title as=\"h4\">\n {t('booking.onboardingIncomplete.title')}\n </Alert.Title>\n <Alert.Description>\n {t('booking.onboardingIncomplete.description')}\n </Alert.Description>\n </Alert>\n );\n}\n\ninterface NextAvailableCtaProps {\n nextAvailableDate: string;\n onJump: () => void;\n locale: string;\n}\n\nfunction NextAvailableCta({\n nextAvailableDate,\n onJump,\n locale,\n}: NextAvailableCtaProps) {\n const { t } = useTranslation();\n const formatted = useMemo(() => {\n try {\n return new Intl.DateTimeFormat(locale, { dateStyle: 'long' }).format(\n parseISO(nextAvailableDate),\n );\n } catch {\n return nextAvailableDate;\n }\n }, [nextAvailableDate, locale]);\n return (\n <Alert variant=\"info\">\n <Alert.Description>\n {t('booking.nextAvailable.description', { date: formatted })}\n </Alert.Description>\n <Alert.Action>\n <Button intent=\"secondary\" size=\"sm\" onClick={onJump}>\n {t('booking.nextAvailable.cta')}\n </Button>\n </Alert.Action>\n </Alert>\n );\n}\n\ninterface BookingSuccessProps {\n snapshot: {\n slot: BookingSlot;\n details: BookingDetails;\n insuranceType?: InsuranceType;\n operatorId?: string;\n specialtyId?: string;\n serviceId?: string;\n date?: string;\n };\n operators: BookingOperator[];\n specialties: BookingSpecialty[];\n services: BookingService[];\n locale: string;\n mode: 'live' | 'demo';\n showModify: boolean;\n onReset: () => void;\n onModify: () => void;\n}\n\nfunction BookingSuccess({\n snapshot,\n operators,\n specialties,\n services,\n locale,\n mode,\n showModify,\n onReset,\n onModify,\n}: BookingSuccessProps) {\n const { t } = useTranslation();\n const channels = snapshot.details.confirmationChannels ?? ['email'];\n\n const channelLabels = channels.map((c) =>\n t(`booking.confirmation.channel.${c}`),\n );\n // In demo mode, override the channel-aware description with the\n // honest \"this was a demo\" copy — consumers running in mock mode\n // (no real API call) shouldn't tell the patient an email was sent.\n const description =\n mode === 'demo'\n ? t('booking.success.descriptionDemo')\n : channelLabels.length > 1\n ? t('booking.success.descriptionMultiple', {\n channels: channelLabels.join(' · '),\n })\n : t('booking.success.descriptionSingle', { channel: channelLabels[0] });\n\n const formattedDate = useMemo(() => {\n if (!snapshot.date) return undefined;\n try {\n return new Intl.DateTimeFormat(locale, {\n weekday: 'long',\n day: 'numeric',\n month: 'long',\n }).format(parseISO(snapshot.date));\n } catch {\n return snapshot.date;\n }\n }, [snapshot.date, locale]);\n\n const operator = snapshot.operatorId\n ? operators.find((op) => op.id === snapshot.operatorId)\n : undefined;\n const specialty = snapshot.specialtyId\n ? specialties.find((s) => s.id === snapshot.specialtyId)\n : undefined;\n const service = snapshot.serviceId\n ? services.find((s) => s.id === snapshot.serviceId)\n : undefined;\n\n return (\n <div\n data-component=\"booking-success\"\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\"\n >\n <Alert variant=\"success\">\n <Alert.Title as=\"h3\">{t('booking.success.heading')}</Alert.Title>\n <Alert.Description>{description}</Alert.Description>\n </Alert>\n\n <div className=\"ds:rounded-[var(--radius-md)] ds:bg-[var(--secondary)] ds:p-[var(--spacing-md)]\">\n <dl className=\"ds:grid ds:grid-cols-[auto_minmax(0,1fr)] ds:gap-x-[var(--spacing-md)] ds:gap-y-[var(--spacing-xs)] ds:m-0\">\n {specialty ? (\n <>\n <dt className=\"type-label ds:text-[var(--muted-foreground)]\">\n {t('booking.success.summarySpecialty')}\n </dt>\n <dd className=\"type-body ds:m-0 ds:text-[var(--foreground)]\">\n {specialty.label}\n </dd>\n </>\n ) : null}\n {service ? (\n <>\n <dt className=\"type-label ds:text-[var(--muted-foreground)]\">\n {t('booking.success.summaryService')}\n </dt>\n <dd className=\"type-body ds:m-0 ds:text-[var(--foreground)]\">\n {service.label}\n </dd>\n </>\n ) : null}\n {formattedDate ? (\n <>\n <dt className=\"type-label ds:text-[var(--muted-foreground)]\">\n {t('booking.success.summaryDate')}\n </dt>\n <dd className=\"type-body ds:m-0 ds:text-[var(--foreground)]\">\n {formattedDate}\n </dd>\n </>\n ) : null}\n <dt className=\"type-label ds:text-[var(--muted-foreground)]\">\n {t('booking.success.summaryTime')}\n </dt>\n <dd className=\"type-body ds:m-0 ds:text-[var(--foreground)]\">\n {snapshot.slot.time}\n </dd>\n {operator ? (\n <>\n <dt className=\"type-label ds:text-[var(--muted-foreground)]\">\n {t('booking.success.summaryProvider')}\n </dt>\n <dd className=\"type-body ds:m-0 ds:text-[var(--foreground)]\">\n {operator.name}\n </dd>\n </>\n ) : null}\n </dl>\n </div>\n\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-sm)]\">\n <Button intent=\"secondary\" size=\"md\" onClick={onReset}>\n {t('booking.success.bookAnother')}\n </Button>\n {showModify ? (\n <Button intent=\"ghost\" size=\"md\" onClick={onModify}>\n {t('booking.success.modifyBooking')}\n </Button>\n ) : null}\n </div>\n </div>\n );\n}\n\ninterface EmptyServicesProps {\n customSlot?: ReactNode;\n}\n\nfunction EmptyServicesAlert({ customSlot }: EmptyServicesProps) {\n const { t } = useTranslation();\n if (customSlot) return <>{customSlot}</>;\n return (\n <EmptyState\n variant=\"no-results\"\n title={t('booking.emptyServices.title')}\n description={t('booking.emptyServices.description')}\n />\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* Variant body shared props */\n/* -------------------------------------------------------------------- */\n\ninterface VariantBodyProps {\n cascade: CascadeOutputs;\n inputs: {\n specialties: BookingSpecialty[];\n services: BookingService[];\n operators: BookingOperator[];\n availableDates: string[];\n availableSlots: Record<string, BookingSlot[]>;\n nextAvailableDate?: string;\n };\n value: BookingValue;\n onChange: (next: BookingValue) => void;\n onSubmit: (details: BookingDetails) => void | Promise<void>;\n policy: {\n country?: string;\n lockedOperatorId?: string;\n };\n detailsProps: Omit<\n React.ComponentProps<typeof BookingDetailsForm>,\n 'value' | 'onChange' | 'onSubmit' | 'summarySlot' | 'defaultPhoneCountry'\n >;\n emptyServicesSlot?: ReactNode;\n onboardingIncompleteSlot?: ReactNode;\n loadingDates?: boolean;\n loadingSlots?: boolean;\n onDateSelect?: (iso: string) => void;\n onWindowChange?: (startIso: string, endIso: string) => void;\n datePickerStyle: 'month-calendar' | 'four-day-grid';\n specialtyPickerStyle?: 'select' | 'combobox' | 'multi-select';\n servicePickerStyle?: 'select' | 'combobox' | 'multi-select' | 'cards';\n operatorPickerStyle?: 'select' | 'combobox' | 'multi-select';\n submitting?: boolean;\n locale: string;\n activeStep: CascadeStep;\n setActiveStep: (step: CascadeStep) => void;\n}\n\n/* -------------------------------------------------------------------- */\n/* InlineListBody */\n/* -------------------------------------------------------------------- */\n\nfunction InlineListBody(props: VariantBodyProps) {\n const {\n cascade,\n inputs,\n value,\n onChange,\n onSubmit,\n emptyServicesSlot,\n onboardingIncompleteSlot,\n loadingDates,\n loadingSlots,\n onDateSelect,\n onWindowChange,\n datePickerStyle,\n specialtyPickerStyle,\n servicePickerStyle,\n operatorPickerStyle,\n submitting,\n locale,\n detailsProps,\n } = props;\n const { t } = useTranslation();\n\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\">\n {cascade.gates.insurance ? (\n <InsuranceStep\n value={value.insuranceType}\n onChange={(next) => onChange(resetOnInsuranceChange(value, next))}\n />\n ) : null}\n\n {cascade.gates.specialty ? (\n <SpecialtyStep\n specialties={cascade.filtered.specialties}\n value={value.specialtyId}\n valueIds={value.specialtyIds}\n onChange={(next) => onChange(resetOnSpecialtyChange(value, next))}\n onChangeIds={(next) =>\n onChange(resetOnSpecialtyIdsChange(value, next))\n }\n pickerStyle={specialtyPickerStyle}\n />\n ) : null}\n\n {cascade.gates.service ? (\n cascade.filtered.services.length === 0 ? (\n <EmptyServicesAlert customSlot={emptyServicesSlot} />\n ) : (\n <ServiceStep\n services={cascade.filtered.services}\n value={value.serviceId}\n valueIds={value.serviceIds}\n onChange={(next) => onChange(resetOnServiceChange(value, next))}\n onChangeIds={(next) =>\n onChange(resetOnServiceIdsChange(value, next))\n }\n pickerStyle={servicePickerStyle}\n />\n )\n ) : null}\n\n {cascade.gates.onboardingIncomplete ? (\n <OnboardingIncompleteAlert customSlot={onboardingIncompleteSlot} />\n ) : null}\n\n {cascade.gates.operator ? (\n <OperatorStep\n operators={cascade.filtered.operators}\n value={value.operatorId}\n valueIds={value.operatorIds}\n onChange={(next) => onChange(resetOnOperatorChange(value, next))}\n onChangeIds={(next) =>\n onChange(resetOnOperatorIdsChange(value, next))\n }\n pickerStyle={operatorPickerStyle}\n />\n ) : null}\n\n {cascade.gates.date ? (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n <h3 className=\"type-label ds:font-[var(--font-weight-semibold)] ds:text-[var(--foreground)] ds:m-0\">\n {t('booking.date.heading')}\n </h3>\n {inputs.availableDates.length === 0 && inputs.nextAvailableDate ? (\n <NextAvailableCta\n nextAvailableDate={inputs.nextAvailableDate}\n onJump={() =>\n onChange(resetOnDateChange(value, inputs.nextAvailableDate))\n }\n locale={locale}\n />\n ) : (\n renderDateStep({\n inputs,\n value,\n onChange,\n onDateSelect,\n onWindowChange,\n loadingDates,\n loadingSlots,\n locale,\n datePickerStyle,\n })\n )}\n </div>\n ) : null}\n\n {cascade.gates.slot &&\n value.date &&\n datePickerStyle === 'month-calendar' ? (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n <h3 className=\"type-label ds:font-[var(--font-weight-semibold)] ds:text-[var(--foreground)] ds:m-0\">\n {t('booking.slot.heading')}\n </h3>\n {renderSlotStep({\n inputs,\n value,\n onChange,\n onDateSelect,\n onWindowChange,\n loadingDates,\n loadingSlots,\n locale,\n datePickerStyle,\n })}\n </div>\n ) : null}\n\n {cascade.gates.details && cascade.selectedSlot ? (\n <BookingDetailsForm\n {...detailsProps}\n value={value.details ?? {}}\n onChange={(next) => onChange({ ...value, details: next })}\n onSubmit={onSubmit}\n submitting={submitting}\n defaultPhoneCountry={props.policy.country}\n />\n ) : null}\n </div>\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* getStepNode — render a single cascade step's content. */\n/* */\n/* Shared by all variants so the cascade renders the same content; */\n/* variants just choose how to chrome / sequence it. */\n/* -------------------------------------------------------------------- */\n\ninterface GetStepNodeOptions {\n /** When true, ServiceStep renders as a compact Select (used by all\n * variants except inline-list, which gets the full ServiceCardGroup). */\n compactService?: boolean;\n}\n\nfunction getStepNode(\n step: CascadeStep,\n props: VariantBodyProps,\n options: GetStepNodeOptions = {},\n): ReactNode {\n const {\n cascade,\n inputs,\n value,\n onChange,\n onSubmit,\n emptyServicesSlot,\n onboardingIncompleteSlot,\n loadingDates,\n loadingSlots,\n onDateSelect,\n onWindowChange,\n datePickerStyle,\n specialtyPickerStyle,\n servicePickerStyle,\n operatorPickerStyle,\n submitting,\n locale,\n detailsProps,\n policy,\n } = props;\n\n switch (step) {\n case 1:\n return (\n <InsuranceStep\n value={value.insuranceType}\n onChange={(next) => onChange(resetOnInsuranceChange(value, next))}\n />\n );\n case 2:\n return (\n <SpecialtyStep\n specialties={cascade.filtered.specialties}\n value={value.specialtyId}\n valueIds={value.specialtyIds}\n onChange={(next) => onChange(resetOnSpecialtyChange(value, next))}\n onChangeIds={(next) =>\n onChange(resetOnSpecialtyIdsChange(value, next))\n }\n pickerStyle={specialtyPickerStyle}\n />\n );\n case 3:\n if (cascade.filtered.services.length === 0) {\n return <EmptyServicesAlert customSlot={emptyServicesSlot} />;\n }\n if (cascade.gates.onboardingIncomplete) {\n return (\n <OnboardingIncompleteAlert customSlot={onboardingIncompleteSlot} />\n );\n }\n return (\n <ServiceStep\n services={cascade.filtered.services}\n value={value.serviceId}\n valueIds={value.serviceIds}\n onChange={(next) => onChange(resetOnServiceChange(value, next))}\n onChangeIds={(next) => onChange(resetOnServiceIdsChange(value, next))}\n pickerStyle={servicePickerStyle}\n compact={options.compactService}\n />\n );\n case 4:\n return (\n <OperatorStep\n operators={cascade.filtered.operators}\n value={value.operatorId}\n valueIds={value.operatorIds}\n onChange={(next) => onChange(resetOnOperatorChange(value, next))}\n onChangeIds={(next) =>\n onChange(resetOnOperatorIdsChange(value, next))\n }\n pickerStyle={operatorPickerStyle}\n />\n );\n case 5:\n if (inputs.availableDates.length === 0 && inputs.nextAvailableDate) {\n return (\n <NextAvailableCta\n nextAvailableDate={inputs.nextAvailableDate}\n onJump={() =>\n onChange(resetOnDateChange(value, inputs.nextAvailableDate))\n }\n locale={locale}\n />\n );\n }\n return renderDateStep({\n inputs,\n value,\n onChange,\n onDateSelect,\n onWindowChange,\n loadingDates,\n loadingSlots,\n locale,\n datePickerStyle,\n });\n case 6:\n return renderSlotStep({\n inputs,\n value,\n onChange,\n onDateSelect,\n onWindowChange,\n loadingDates,\n loadingSlots,\n locale,\n datePickerStyle,\n });\n case 7:\n if (!cascade.selectedSlot) return null;\n return (\n <BookingDetailsForm\n {...detailsProps}\n value={value.details ?? {}}\n onChange={(next) => onChange({ ...value, details: next })}\n onSubmit={onSubmit}\n submitting={submitting}\n defaultPhoneCountry={policy.country}\n />\n );\n /* c8 ignore next 2 */\n default:\n return null;\n }\n}\n\n/* -------------------------------------------------------------------- */\n/* getStepLabel — i18n label per cascade step. */\n/* -------------------------------------------------------------------- */\n\nfunction useStepLabels(): Record<CascadeStep, string> {\n const { t } = useTranslation();\n return useMemo(\n () => ({\n 1: t('booking.insurance.heading'),\n 2: t('booking.specialty.heading'),\n 3: t('booking.service.heading'),\n 4: t('booking.operator.heading'),\n 5: t('booking.date.heading'),\n 6: t('booking.slot.heading'),\n 7: t('booking.details.heading'),\n }),\n [t],\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* AccordionBody — StepperAccordion-backed flow with per-step summaries. */\n/* -------------------------------------------------------------------- */\n\nfunction AccordionBody(props: VariantBodyProps) {\n const { cascade, value, activeStep, setActiveStep, datePickerStyle } = props;\n const labels = useStepLabels();\n\n // four-day-grid embeds slot tiles inside the date step's picker —\n // step 6 (slot) renders nothing of its own. Drop it from the\n // accordion ladder so the user doesn't see an empty \"Orario\"\n // panel that would just expand to whitespace.\n const visibleStepsForBody = useMemo(\n () =>\n datePickerStyle === 'four-day-grid'\n ? cascade.visibleSteps.filter((s) => s !== 6)\n : cascade.visibleSteps,\n [cascade.visibleSteps, datePickerStyle],\n );\n\n // Compose accordion specs from the visible cascade steps. Pull a\n // localised summary off `value` for completed steps so collapsed\n // panels still convey what was picked.\n const accordionSteps = useMemo(\n () =>\n visibleStepsForBody.map((stepNum) => ({\n label: labels[stepNum],\n summary: getStepSummary(stepNum, value, cascade),\n status:\n stepIsFulfilled(stepNum, value) && stepNum < cascade.currentStep\n ? ('completed' as const)\n : undefined,\n content: getStepNode(stepNum, props, { compactService: true }),\n })),\n [visibleStepsForBody, value, labels, cascade, props],\n );\n\n // The accordion uses a 0-indexed activeStep but our cascade steps are\n // 1-indexed; map to the position in visibleSteps.\n const activeIndex = Math.max(0, cascade.visibleSteps.indexOf(activeStep));\n\n return (\n <StepperAccordion\n activeStep={activeIndex}\n steps={accordionSteps}\n onStepChange={(idx) => {\n const next = cascade.visibleSteps[idx];\n if (next) setActiveStep(next);\n }}\n />\n );\n}\n\nfunction stepIsFulfilled(step: CascadeStep, value: BookingValue): boolean {\n switch (step) {\n case 1:\n return value.insuranceType !== undefined;\n case 2:\n return value.specialtyId !== undefined;\n case 3:\n return value.serviceId !== undefined;\n case 4:\n return value.operatorId !== undefined;\n case 5:\n return value.date !== undefined;\n case 6:\n return value.slotKey !== undefined;\n case 7:\n return false;\n }\n}\n\nfunction getStepSummary(\n step: CascadeStep,\n value: BookingValue,\n cascade: CascadeOutputs,\n): ReactNode {\n if (!stepIsFulfilled(step, value)) return undefined;\n switch (step) {\n case 1:\n return value.insuranceType;\n case 2: {\n const sp = cascade.filtered.specialties.find(\n (s) => s.id === value.specialtyId,\n );\n return sp?.label;\n }\n case 3: {\n const sv = cascade.filtered.services.find(\n (s) => s.id === value.serviceId,\n );\n return sv?.label;\n }\n case 4: {\n const opId = resolveOperatorId(value);\n if (!opId) return undefined;\n const op = cascade.filtered.operators.find((o) => o.id === opId);\n return op?.name;\n }\n case 5:\n return value.date;\n case 6:\n return cascade.selectedSlot?.time;\n case 7:\n return undefined;\n }\n}\n\n/* -------------------------------------------------------------------- */\n/* CalendarBody — chip rail of completed selections + calendar dominant. */\n/* -------------------------------------------------------------------- */\n\nfunction CalendarBody(props: VariantBodyProps) {\n const { cascade, value, setActiveStep } = props;\n const { t } = useTranslation();\n const labels = useStepLabels();\n\n // Filters that come before the calendar (insurance/specialty/service/operator).\n const filterSteps = cascade.visibleSteps.filter(\n (s) => s === 1 || s === 2 || s === 3 || s === 4,\n );\n const hasUnfulfilledFilter = filterSteps.some(\n (s) => !stepIsFulfilled(s, value),\n );\n\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\">\n {/* Active step is the first unfulfilled filter — render it inline. */}\n {hasUnfulfilledFilter ? (\n filterSteps\n .filter((s) => !stepIsFulfilled(s, value))\n .slice(0, 1)\n .map((s) => (\n <div key={`csf-${s}`}>\n {getStepNode(s, props, { compactService: true })}\n </div>\n ))\n ) : (\n <div\n role=\"group\"\n aria-label={t('booking.regionLabel')}\n className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-xs)]\"\n >\n {filterSteps.map((s) => {\n const summary = getStepSummary(s, value, cascade);\n if (!summary) return null;\n return (\n <Button\n key={`csc-${s}`}\n intent=\"tonal\"\n size=\"sm\"\n onClick={() => setActiveStep(s)}\n >\n {labels[s]}: {summary}\n </Button>\n );\n })}\n </div>\n )}\n\n {!hasUnfulfilledFilter && cascade.gates.date ? (\n // four-day-grid embeds slots inline with the day strip — the\n // historic 2-col date|slot split collapses to a single column\n // so the picker spans the full width instead of orphaning an\n // empty right cell.\n props.datePickerStyle === 'four-day-grid' ? (\n <div>{getStepNode(5, props)}</div>\n ) : (\n <div className=\"ds:grid ds:grid-cols-1 ds:gap-[var(--spacing-md)] ds:md:grid-cols-2\">\n <div className=\"ds:min-w-0\">{getStepNode(5, props)}</div>\n <div className=\"ds:min-w-0\">\n {value.date ? getStepNode(6, props) : null}\n </div>\n </div>\n )\n ) : null}\n\n {cascade.gates.details ? <div>{getStepNode(7, props)}</div> : null}\n </div>\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* FlexibleBody — 2-col desktop (filters L, calendar+slots R), inline */\n/* below md. */\n/* -------------------------------------------------------------------- */\n\nfunction FlexibleBody(props: VariantBodyProps) {\n const { cascade, datePickerStyle } = props;\n\n const filterStepNumbers = cascade.visibleSteps.filter(\n (s) => s === 1 || s === 2 || s === 3 || s === 4,\n );\n\n // 0.33.12: four-day-grid renders 4 day columns + ±arrows. The\n // historic 2-col split (filters left, picker right) crushes\n // that 4-column strip into ~half the widget width — slot tiles\n // truncate, day headers become unreadable. Stack to single\n // column when four-day-grid so the picker gets the full width.\n // (The calendar variant already does this in 0.33.10.)\n const stackedLayout = datePickerStyle === 'four-day-grid';\n\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\">\n <div\n className={\n stackedLayout\n ? 'ds:flex ds:flex-col ds:gap-[var(--spacing-md)]'\n : 'ds:grid ds:grid-cols-1 ds:gap-[var(--spacing-md)] ds:md:grid-cols-2'\n }\n >\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\">\n {filterStepNumbers.map((s) => (\n <div key={`fbf-${s}`}>\n {getStepNode(s, props, { compactService: true })}\n </div>\n ))}\n </div>\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\">\n {cascade.gates.date ? getStepNode(5, props) : null}\n {cascade.gates.slot && props.value.date\n ? getStepNode(6, props)\n : null}\n </div>\n </div>\n {cascade.gates.details ? getStepNode(7, props) : null}\n </div>\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* ProgressBody — wizard with stepper + one step on screen + Back/Next. */\n/* -------------------------------------------------------------------- */\n\nfunction ProgressBody(props: VariantBodyProps) {\n const { cascade, value, activeStep, setActiveStep, datePickerStyle } = props;\n const { t } = useTranslation();\n const labels = useStepLabels();\n\n // four-day-grid sets both value.date and value.slotKey atomically\n // when the user picks a tile, so step 6 (slot) has nothing of its\n // own to render. Drop it from the wizard ladder so the user\n // doesn't land on an empty page mid-flow.\n const visibleSteps = useMemo(\n () =>\n datePickerStyle === 'four-day-grid'\n ? cascade.visibleSteps.filter((s) => s !== 6)\n : cascade.visibleSteps,\n [cascade.visibleSteps, datePickerStyle],\n );\n const activeIndex = Math.max(0, visibleSteps.indexOf(activeStep));\n const totalSteps = visibleSteps.length;\n\n const stepSpecs = useMemo(\n () => visibleSteps.map((s) => ({ label: labels[s] })),\n [visibleSteps, labels],\n );\n\n const canGoBack = activeIndex > 0;\n // Forward navigation is gated by the cascade — can only advance when\n // the active step is fulfilled.\n const canGoNext =\n activeIndex < totalSteps - 1 && stepIsFulfilled(activeStep, value);\n\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\">\n <StepperProgress activeStep={activeIndex} steps={stepSpecs} />\n <div>{getStepNode(activeStep, props, { compactService: true })}</div>\n <div className=\"ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)]\">\n <Button\n intent=\"ghost\"\n size=\"md\"\n disabled={!canGoBack}\n onClick={() => {\n const prev = visibleSteps[activeIndex - 1];\n if (prev) setActiveStep(prev);\n }}\n >\n {t('booking.actions.back')}\n </Button>\n {activeStep < 7 ? (\n <Button\n intent=\"primary\"\n size=\"md\"\n disabled={!canGoNext}\n onClick={() => {\n const next = visibleSteps[activeIndex + 1];\n if (next) setActiveStep(next);\n }}\n >\n {t('booking.actions.next')}\n </Button>\n ) : null}\n </div>\n </div>\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* Root Booking component */\n/* -------------------------------------------------------------------- */\n\nconst EMPTY_SPECIALTIES: BookingSpecialty[] = [];\nconst EMPTY_OPERATORS: BookingOperator[] = [];\n\nexport const Booking = forwardRef<HTMLDivElement, BookingProps>(\n (\n {\n variant = 'inline-list',\n country,\n // No default — the cascade engine treats `undefined` as \"auto-on\n // when `specialties` has items\" so consumers who pass specialty\n // data without the explicit flag still get the step.\n useSpecialties,\n allowOperatorSelection = false,\n lockedOperatorId,\n autoSelectSingleService = false,\n specialties: specialtiesProp,\n services,\n operators: operatorsProp,\n availableDates,\n availableSlots,\n nextAvailableDate,\n requireCodiceFiscale,\n requireDateOfBirth,\n requireInsuranceNumber,\n showNote,\n showReturningPatientFlag,\n privacyPolicyUrl,\n termsUrl,\n validateCodiceFiscale,\n validateInsuranceNumber,\n confirmationChannels,\n defaultConfirmationChannels,\n value,\n onChange,\n onSubmit,\n onStepChange,\n onDateSelect,\n onWindowChange,\n datePickerStyle = 'month-calendar',\n specialtyPickerStyle,\n servicePickerStyle,\n operatorPickerStyle,\n loadingDates,\n loadingSlots,\n submitting,\n submitError,\n mode = 'live',\n showModifyOnSuccess = true,\n surface = 'flat',\n emptyServicesSlot,\n onboardingIncompleteSlot,\n 'aria-label': ariaLabel,\n id,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation();\n const resolvedVariant = (variant ?? 'inline-list') as BookingVariant;\n const locale = i18n.language ?? 'en';\n\n const specialties = specialtiesProp ?? EMPTY_SPECIALTIES;\n const operators = operatorsProp ?? EMPTY_OPERATORS;\n\n // Auto-pre-select on mount + whenever the inputs that drive them\n // arrive (e.g. when `specialties` populates from an async fetch).\n useEffect(() => {\n const next = applyAutoSelects(value, {\n country,\n useSpecialties,\n allowOperatorSelection,\n lockedOperatorId,\n autoSelectSingleService,\n specialties,\n services,\n });\n // Shallow compare the keys we might have changed.\n if (\n next.specialtyId !== value.specialtyId ||\n next.operatorId !== value.operatorId ||\n next.serviceId !== value.serviceId\n ) {\n onChange(next);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n lockedOperatorId,\n useSpecialties,\n autoSelectSingleService,\n specialties,\n services,\n ]);\n\n const cascade = useMemo(\n () =>\n deriveCascade({\n country,\n useSpecialties,\n allowOperatorSelection,\n lockedOperatorId,\n autoSelectSingleService,\n specialties,\n services,\n operators,\n availableDates,\n availableSlots,\n value,\n }),\n [\n country,\n useSpecialties,\n allowOperatorSelection,\n lockedOperatorId,\n autoSelectSingleService,\n specialties,\n services,\n operators,\n availableDates,\n availableSlots,\n value,\n ],\n );\n\n const [activeStep, setActiveStep] = useState<CascadeStep>(\n cascade.currentStep,\n );\n // Sync activeStep to the cascade's current step when the user\n // advances forward via the value, but not on the initial mount.\n const lastCurrentStepRef = useRef(cascade.currentStep);\n useEffect(() => {\n if (cascade.currentStep > lastCurrentStepRef.current) {\n setActiveStep(cascade.currentStep);\n }\n lastCurrentStepRef.current = cascade.currentStep;\n }, [cascade.currentStep]);\n\n const [submitState, setSubmitState] = useState<\n 'idle' | 'submitting' | 'success' | 'error'\n >('idle');\n const [submittedSnapshot, setSubmittedSnapshot] = useState<{\n slot: BookingSlot;\n details: BookingDetails;\n insuranceType?: InsuranceType;\n operatorId?: string;\n specialtyId?: string;\n serviceId?: string;\n date?: string;\n } | null>(null);\n\n const handleSubmit = useCallback(\n async (details: BookingDetails) => {\n if (!cascade.selectedSlot) return;\n const payload = {\n slot: cascade.selectedSlot,\n value: {\n ...value,\n details,\n operatorId: resolveOperatorId(value) ?? value.operatorId,\n },\n details,\n };\n setSubmitState('submitting');\n try {\n await onSubmit(payload);\n setSubmittedSnapshot({\n slot: cascade.selectedSlot,\n details,\n specialtyId: value.specialtyId,\n serviceId: value.serviceId,\n insuranceType: value.insuranceType,\n operatorId: resolveOperatorId(value),\n date: value.date,\n });\n setSubmitState('success');\n } catch {\n setSubmitState('error');\n // Re-throw so the consumer can observe + log. The form\n // stays mounted so the patient can retry.\n throw new Error('Booking submission failed');\n }\n },\n [cascade.selectedSlot, onSubmit, value],\n );\n\n /* ---------- Imperative handle ---------- */\n\n const rootRef = useRef<HTMLDivElement>(null);\n useImperativeHandle(ref, () => rootRef.current as HTMLDivElement, []);\n\n /* ---------- onStepChange + auto-scroll on success ---------- */\n\n // The displayed step is `8` when the success view is mounted, and\n // matches the cascade's `currentStep` otherwise. Tracked via a ref\n // so the effect only fires when the displayed step actually changes\n // (vs every time `currentStep` or `submitState` updates).\n const displayedStep: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 =\n submitState === 'success' ? 8 : cascade.currentStep;\n // Initialise to `null` so the first effect-fire (after mount) still\n // emits onStepChange with the initial step. Subsequent fires only\n // emit when the step actually changes.\n const lastDisplayedStepRef = useRef<typeof displayedStep | null>(null);\n useEffect(() => {\n if (displayedStep === lastDisplayedStepRef.current) return;\n lastDisplayedStepRef.current = displayedStep;\n onStepChange?.(displayedStep);\n // Auto-scroll the booking surface into view on the transition to\n // step 8 — the success card is much shorter than the form, so\n // without this the patient often ends up below the booking column\n // and has to scroll up to see \"Booking submitted.\" See the\n // 0.30.0-adoption follow-up notes for the failure mode.\n if (displayedStep === 8 && rootRef.current) {\n try {\n rootRef.current.scrollIntoView({\n behavior: 'smooth',\n block: 'start',\n });\n } catch {\n // jsdom + older browsers may not implement smooth scroll.\n // Fall back to a plain scroll — still better than nothing.\n rootRef.current.scrollIntoView();\n }\n }\n }, [displayedStep, onStepChange]);\n\n const agentHandle = useMemo<BookingHandle>(\n () => ({\n getVariant: () => resolvedVariant,\n reset: () => {\n // Clear the value to an empty state + drop any success view;\n // the consumer's onChange observes the normalised value.\n onChange({});\n setSubmittedSnapshot(null);\n setSubmitState('idle');\n setActiveStep(1);\n },\n goToStep: (step) => {\n setActiveStep(step);\n },\n }),\n [resolvedVariant, onChange],\n );\n useAgentRegistration(bookingAgent, agentHandle, id);\n\n const resolvedAriaLabel = ariaLabel ?? t('booking.regionLabel');\n\n // Success view replaces the entire cascade body once `onSubmit`\n // resolves. The header still renders so the patient sees their\n // booking context above the confirmation card.\n const successBody = useMemo(() => {\n if (submitState !== 'success' || !submittedSnapshot) return null;\n return (\n <BookingSuccess\n snapshot={submittedSnapshot}\n operators={operators}\n specialties={specialties}\n services={services}\n locale={locale}\n mode={mode}\n showModify={showModifyOnSuccess}\n onReset={() => agentHandle.reset()}\n onModify={() => {\n // Modify path — keep `value` + `details` intact, just drop\n // the success view + return to step 7. The form will paint\n // pre-populated.\n setSubmittedSnapshot(null);\n setSubmitState('idle');\n setActiveStep(7);\n }}\n />\n );\n }, [\n submitState,\n submittedSnapshot,\n operators,\n specialties,\n services,\n locale,\n mode,\n showModifyOnSuccess,\n agentHandle,\n ]);\n\n const variantBody = useMemo(() => {\n if (submitState === 'success') return null;\n const Body =\n resolvedVariant === 'accordion'\n ? AccordionBody\n : resolvedVariant === 'calendar'\n ? CalendarBody\n : resolvedVariant === 'flexible'\n ? FlexibleBody\n : resolvedVariant === 'progress'\n ? ProgressBody\n : InlineListBody;\n const bodyProps: VariantBodyProps = {\n cascade,\n inputs: {\n specialties,\n services,\n operators,\n availableDates,\n availableSlots,\n nextAvailableDate,\n },\n value,\n onChange,\n onSubmit: handleSubmit,\n policy: { country, lockedOperatorId },\n detailsProps: {\n requireCodiceFiscale,\n requireDateOfBirth,\n requireInsuranceNumber,\n insuranceType: value.insuranceType,\n showNote,\n showReturningPatientFlag,\n privacyPolicyUrl,\n termsUrl,\n validateCodiceFiscale,\n validateInsuranceNumber,\n confirmationChannels,\n defaultConfirmationChannels,\n submitError,\n },\n emptyServicesSlot,\n onboardingIncompleteSlot,\n loadingDates,\n loadingSlots,\n onDateSelect,\n onWindowChange,\n datePickerStyle,\n specialtyPickerStyle,\n servicePickerStyle,\n operatorPickerStyle,\n submitting,\n locale,\n activeStep,\n setActiveStep,\n };\n return <Body {...bodyProps} />;\n }, [\n submitState,\n resolvedVariant,\n cascade,\n specialties,\n services,\n operators,\n availableDates,\n availableSlots,\n nextAvailableDate,\n value,\n onChange,\n handleSubmit,\n country,\n lockedOperatorId,\n requireCodiceFiscale,\n requireDateOfBirth,\n requireInsuranceNumber,\n submitError,\n showNote,\n showReturningPatientFlag,\n privacyPolicyUrl,\n termsUrl,\n validateCodiceFiscale,\n validateInsuranceNumber,\n confirmationChannels,\n defaultConfirmationChannels,\n emptyServicesSlot,\n onboardingIncompleteSlot,\n loadingDates,\n loadingSlots,\n onDateSelect,\n onWindowChange,\n datePickerStyle,\n specialtyPickerStyle,\n servicePickerStyle,\n operatorPickerStyle,\n submitting,\n locale,\n activeStep,\n ]);\n\n return (\n <div\n ref={rootRef}\n role=\"region\"\n aria-label={resolvedAriaLabel}\n id={id}\n data-component=\"booking\"\n data-component-id={id}\n data-variant={resolvedVariant}\n className={rootVariants({\n variant: resolvedVariant,\n surface,\n className,\n })}\n {...rest}\n >\n <div\n // Hero gradient backdrop is shared across every Booking\n // variant — the header is the kit's brand marker for the\n // surface and should not visually fragment by variant.\n // (0.31.x gated this to `inline-list` only; lifted in\n // 0.32.0 so `accordion` / `calendar` / `flexible` /\n // `progress` carry the same chrome.)\n className={[\n 'ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)]',\n 'ds:rounded-[var(--radius-md)]',\n 'ds:bg-[color-mix(in_srgb,var(--primary)_35%,var(--background))]',\n 'ds:bg-[image:var(--gradient-hero-brand)]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:pt-[var(--spacing-md)] ds:pb-[var(--spacing-md)]',\n ].join(' ')}\n >\n <h2 className=\"type-title-card ds:text-[var(--foreground)] ds:m-0\">\n {t('booking.regionLabel')}\n </h2>\n <p className=\"type-body-sm ds:text-[var(--muted-foreground)] ds:m-0\">\n {t('booking.headingSubtitle')}\n </p>\n </div>\n {successBody ?? variantBody}\n </div>\n );\n },\n);\n\nBooking.displayName = 'Booking';\n"],"names":["__iconNode","Activity","createLucideIcon","Baby","Bone","Brain","CalendarRange","ClipboardCheck","Ear","Microscope","Pill","Scissors","Smile","Sunset","Syringe","subMonths","date","amount","options","addMonths","bookingAgent","handle","args","CONFIRMATION_CHANNEL_ORDER","OPERATORS_ALL","COUNTRY_GERMANY","filterSpecialties","inputs","s","_a","b","aSeq","bSeq","filterServices","list","specialtyIds","resolveSpecialtyIds","eligibleOperators","useSpecialtiesResolved","op","sid","serviceIds","resolveServiceIds","rid","computeGates","filtered","insuranceVisible","insuranceSatisfied","specialtyVisible","specialtyPicked","serviceVisible","servicePicked","serviceSatisfied","eligibleOps","operatorVisible","dateVisible","slotVisible","detailsVisible","onboardingIncomplete","deriveStep","gates","visible","isFulfilled","deriveCascade","currentStep","visibleSteps","selectedSlot","day","selectedService","specialtyPickedFinal","isReadyToSubmit","resetOnInsuranceChange","value","next","resetOnSpecialtyChange","resetOnSpecialtyIdsChange","resetOnServiceChange","resetOnServiceIdsChange","hasAny","resetOnOperatorChange","resetOnOperatorIdsChange","resetOnDateChange","resetOnSlotChange","applyAutoSelects","resolvedServices","resolveOperatorId","looksLikePhone","trimmed","resolveConfirmationChannels","enabled","set","c","defaultConfirmationSelection","mobile","override","resolvedEnabled","enabledSet","out","mobilePlausible","hasWhatsApp","outSet","NOTE_MAX_LENGTH","CF_REGEX","EMAIL_REGEX","VALIDATE_DEBOUNCE_MS","idleStatus","BookingDetailsForm","forwardRef","onChange","onSubmit","requireCodiceFiscale","requireDateOfBirth","requireInsuranceNumber","insuranceType","showNote","showReturningPatientFlag","privacyPolicyUrl","termsUrl","validateCodiceFiscale","validateInsuranceNumber","submitting","summarySlot","defaultPhoneCountry","confirmationChannels","defaultConfirmationChannels","submitError","ref","t","useTranslation","formId","useId","cfStatus","setCfStatus","useState","insuranceStatus","setInsuranceStatus","touched","setTouched","markTouched","useCallback","field","cfTimerRef","useRef","insuranceTimerRef","useEffect","update","patch","resolvedEnabledChannels","useMemo","pickerVisible","seededRef","seed","selectedChannels","noChannelsSelected","cf","res","insuranceShown","n","emailValid","phoneValid","requiredFieldsValid","_b","consentsTicked","channelsSatisfied","canSubmit","handleSubmit","e","payload","renderConsentLabel","i18nKey","url","safeUrl","jsx","Trans","jsxs","FormField","TextInput","EmailInput","PhoneInput","e164","DatePicker","TextArea","Checkbox","checked","Fragment","CheckboxGroup","Alert","Button","Spinner","rootVariants","cva","SERVICE_ICON_RULES","HeartPulse","Eye","ScanLine","Sparkles","pickIcon","text","pattern","Icon","inferServiceIcon","service","Stethoscope","isoOf","fnsFormat","monthCellBase","monthCellVariants","MonthGrid","availableDates","selectedDate","onSelectDate","locale","loading","initialMonth","startOfMonth","parseISO","viewMonth","setViewMonth","focusDate","setFocusDate","cells","monthStart","monthEnd","endOfMonth","startWeekday","totalDays","grid","i","d","last","monthLabel","weekdayLabels","base","_","availableSet","isAvailable","rovingDate","firstAvailable","isSameMonth","handleKeyDown","event","current","Skeleton","IconButton","ChevronLeft","m","ChevronRight","label","rowIndex","colIndex","inMonth","available","isSelected","isSameDay","state","isRoving","dayLabel","serviceCardVariants","ServiceCardGroup","services","selectedServiceId","onSelect","groupId","focusIndex","setFocusIndex","cardRefs","focusAt","index","id","total","prev","isFocused","ariaLabel","iconNode","node","slotChipVariants","bucketForTime","time","hh","hour","BUCKET_ICONS","Sun","Moon","GroupedTimeSlots","slots","selectedSlotKey","dateLabel","groups","result","slot","availableCount","order","row","EmptyState","bucket","items","FOUR_DAY_WINDOW_SIZE","FourDayPicker","availableSlots","onDateSelect","onWindowChange","loadingDates","loadingSlots","today","startOfDay","windowStart","setWindowStart","isAfter","first","windowEnd","addDays","days","iso","hasPrevious","hasNext","handlePreviousDays","subDays","handleNextDays","isBefore","handleSlotSelect","dateIso","visibleWindowHasSlots","firstAvailableIso","NextAvailableCta","SlotGrid","renderDateStep","props","datePickerStyle","renderSlotStep","InsuranceStep","Select","SpecialtyStep","specialties","valueIds","onChangeIds","pickerStyle","heading","MultiSelect","Combobox","ServiceStep","compact","resolvedStyle","OperatorStep","operators","OnboardingIncompleteAlert","customSlot","nextAvailableDate","onJump","formatted","BookingSuccess","snapshot","mode","showModify","onReset","onModify","channelLabels","description","formattedDate","operator","specialty","EmptyServicesAlert","InlineListBody","cascade","emptyServicesSlot","onboardingIncompleteSlot","specialtyPickerStyle","servicePickerStyle","operatorPickerStyle","detailsProps","getStepNode","step","policy","useStepLabels","AccordionBody","activeStep","setActiveStep","labels","visibleStepsForBody","accordionSteps","stepNum","getStepSummary","stepIsFulfilled","activeIndex","StepperAccordion","idx","sp","sv","opId","o","CalendarBody","filterSteps","hasUnfulfilledFilter","summary","FlexibleBody","filterStepNumbers","ProgressBody","totalSteps","stepSpecs","canGoBack","canGoNext","StepperProgress","EMPTY_SPECIALTIES","EMPTY_OPERATORS","Booking","variant","country","useSpecialties","allowOperatorSelection","lockedOperatorId","autoSelectSingleService","specialtiesProp","operatorsProp","onStepChange","showModifyOnSuccess","surface","className","rest","i18n","resolvedVariant","lastCurrentStepRef","submitState","setSubmitState","submittedSnapshot","setSubmittedSnapshot","details","rootRef","useImperativeHandle","displayedStep","lastDisplayedStepRef","agentHandle","useAgentRegistration","resolvedAriaLabel","successBody","variantBody","Body","bodyProps"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13]}
1
+ {"version":3,"file":"booking-ChfvWy3P.js","sources":["../../node_modules/lucide-react/dist/esm/icons/activity.js","../../node_modules/lucide-react/dist/esm/icons/baby.js","../../node_modules/lucide-react/dist/esm/icons/bone.js","../../node_modules/lucide-react/dist/esm/icons/brain.js","../../node_modules/lucide-react/dist/esm/icons/calendar-range.js","../../node_modules/lucide-react/dist/esm/icons/clipboard-check.js","../../node_modules/lucide-react/dist/esm/icons/ear.js","../../node_modules/lucide-react/dist/esm/icons/microscope.js","../../node_modules/lucide-react/dist/esm/icons/pill.js","../../node_modules/lucide-react/dist/esm/icons/scissors.js","../../node_modules/lucide-react/dist/esm/icons/smile.js","../../node_modules/lucide-react/dist/esm/icons/sunset.js","../../node_modules/lucide-react/dist/esm/icons/syringe.js","../../node_modules/date-fns/subMonths.js","../../src/components/booking/booking.agent.ts","../../src/components/booking/booking-types.ts","../../src/components/booking/cascade.ts","../../src/components/booking/details-form.tsx","../../src/components/booking/booking.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 [\n \"path\",\n {\n d: \"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2\",\n key: \"169zse\"\n }\n ]\n];\nconst Activity = createLucideIcon(\"activity\", __iconNode);\n\nexport { __iconNode, Activity as default };\n//# sourceMappingURL=activity.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 [\"path\", { d: \"M10 16c.5.3 1.2.5 2 .5s1.5-.2 2-.5\", key: \"1u7htd\" }],\n [\"path\", { d: \"M15 12h.01\", key: \"1k8ypt\" }],\n [\n \"path\",\n {\n d: \"M19.38 6.813A9 9 0 0 1 20.8 10.2a2 2 0 0 1 0 3.6 9 9 0 0 1-17.6 0 2 2 0 0 1 0-3.6A9 9 0 0 1 12 3c2 0 3.5 1.1 3.5 2.5s-.9 2.5-2 2.5c-.8 0-1.5-.4-1.5-1\",\n key: \"11xh7x\"\n }\n ],\n [\"path\", { d: \"M9 12h.01\", key: \"157uk2\" }]\n];\nconst Baby = createLucideIcon(\"baby\", __iconNode);\n\nexport { __iconNode, Baby as default };\n//# sourceMappingURL=baby.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: \"M17 10c.7-.7 1.69 0 2.5 0a2.5 2.5 0 1 0 0-5 .5.5 0 0 1-.5-.5 2.5 2.5 0 1 0-5 0c0 .81.7 1.8 0 2.5l-7 7c-.7.7-1.69 0-2.5 0a2.5 2.5 0 0 0 0 5c.28 0 .5.22.5.5a2.5 2.5 0 1 0 5 0c0-.81-.7-1.8 0-2.5Z\",\n key: \"w610uw\"\n }\n ]\n];\nconst Bone = createLucideIcon(\"bone\", __iconNode);\n\nexport { __iconNode, Bone as default };\n//# sourceMappingURL=bone.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 [\"path\", { d: \"M12 18V5\", key: \"adv99a\" }],\n [\"path\", { d: \"M15 13a4.17 4.17 0 0 1-3-4 4.17 4.17 0 0 1-3 4\", key: \"1e3is1\" }],\n [\"path\", { d: \"M17.598 6.5A3 3 0 1 0 12 5a3 3 0 1 0-5.598 1.5\", key: \"1gqd8o\" }],\n [\"path\", { d: \"M17.997 5.125a4 4 0 0 1 2.526 5.77\", key: \"iwvgf7\" }],\n [\"path\", { d: \"M18 18a4 4 0 0 0 2-7.464\", key: \"efp6ie\" }],\n [\"path\", { d: \"M19.967 17.483A4 4 0 1 1 12 18a4 4 0 1 1-7.967-.517\", key: \"1gq6am\" }],\n [\"path\", { d: \"M6 18a4 4 0 0 1-2-7.464\", key: \"k1g0md\" }],\n [\"path\", { d: \"M6.003 5.125a4 4 0 0 0-2.526 5.77\", key: \"q97ue3\" }]\n];\nconst Brain = createLucideIcon(\"brain\", __iconNode);\n\nexport { __iconNode, Brain as default };\n//# sourceMappingURL=brain.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 [\"rect\", { width: \"18\", height: \"18\", x: \"3\", y: \"4\", rx: \"2\", key: \"1hopcy\" }],\n [\"path\", { d: \"M16 2v4\", key: \"4m81vk\" }],\n [\"path\", { d: \"M3 10h18\", key: \"8toen8\" }],\n [\"path\", { d: \"M8 2v4\", key: \"1cmpym\" }],\n [\"path\", { d: \"M17 14h-6\", key: \"bkmgh3\" }],\n [\"path\", { d: \"M13 18H7\", key: \"bb0bb7\" }],\n [\"path\", { d: \"M7 14h.01\", key: \"1qa3f1\" }],\n [\"path\", { d: \"M17 18h.01\", key: \"1bdyru\" }]\n];\nconst CalendarRange = createLucideIcon(\"calendar-range\", __iconNode);\n\nexport { __iconNode, CalendarRange as default };\n//# sourceMappingURL=calendar-range.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 [\"rect\", { width: \"8\", height: \"4\", x: \"8\", y: \"2\", rx: \"1\", ry: \"1\", key: \"tgr4d6\" }],\n [\n \"path\",\n {\n d: \"M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2\",\n key: \"116196\"\n }\n ],\n [\"path\", { d: \"m9 14 2 2 4-4\", key: \"df797q\" }]\n];\nconst ClipboardCheck = createLucideIcon(\"clipboard-check\", __iconNode);\n\nexport { __iconNode, ClipboardCheck as default };\n//# sourceMappingURL=clipboard-check.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 [\"path\", { d: \"M6 8.5a6.5 6.5 0 1 1 13 0c0 6-6 6-6 10a3.5 3.5 0 1 1-7 0\", key: \"1dfaln\" }],\n [\"path\", { d: \"M15 8.5a2.5 2.5 0 0 0-5 0v1a2 2 0 1 1 0 4\", key: \"1qnva7\" }]\n];\nconst Ear = createLucideIcon(\"ear\", __iconNode);\n\nexport { __iconNode, Ear as default };\n//# sourceMappingURL=ear.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 [\"path\", { d: \"M6 18h8\", key: \"1borvv\" }],\n [\"path\", { d: \"M3 22h18\", key: \"8prr45\" }],\n [\"path\", { d: \"M14 22a7 7 0 1 0 0-14h-1\", key: \"1jwaiy\" }],\n [\"path\", { d: \"M9 14h2\", key: \"197e7h\" }],\n [\"path\", { d: \"M9 12a2 2 0 0 1-2-2V6h6v4a2 2 0 0 1-2 2Z\", key: \"1bmzmy\" }],\n [\"path\", { d: \"M12 6V3a1 1 0 0 0-1-1H9a1 1 0 0 0-1 1v3\", key: \"1drr47\" }]\n];\nconst Microscope = createLucideIcon(\"microscope\", __iconNode);\n\nexport { __iconNode, Microscope as default };\n//# sourceMappingURL=microscope.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 { d: \"m10.5 20.5 10-10a4.95 4.95 0 1 0-7-7l-10 10a4.95 4.95 0 1 0 7 7Z\", key: \"wa1lgi\" }\n ],\n [\"path\", { d: \"m8.5 8.5 7 7\", key: \"rvfmvr\" }]\n];\nconst Pill = createLucideIcon(\"pill\", __iconNode);\n\nexport { __iconNode, Pill as default };\n//# sourceMappingURL=pill.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 [\"circle\", { cx: \"6\", cy: \"6\", r: \"3\", key: \"1lh9wr\" }],\n [\"path\", { d: \"M8.12 8.12 12 12\", key: \"1alkpv\" }],\n [\"path\", { d: \"M20 4 8.12 15.88\", key: \"xgtan2\" }],\n [\"circle\", { cx: \"6\", cy: \"18\", r: \"3\", key: \"fqmcym\" }],\n [\"path\", { d: \"M14.8 14.8 20 20\", key: \"ptml3r\" }]\n];\nconst Scissors = createLucideIcon(\"scissors\", __iconNode);\n\nexport { __iconNode, Scissors as default };\n//# sourceMappingURL=scissors.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 [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"M8 14s1.5 2 4 2 4-2 4-2\", key: \"1y1vjs\" }],\n [\"line\", { x1: \"9\", x2: \"9.01\", y1: \"9\", y2: \"9\", key: \"yxxnd0\" }],\n [\"line\", { x1: \"15\", x2: \"15.01\", y1: \"9\", y2: \"9\", key: \"1p4y9e\" }]\n];\nconst Smile = createLucideIcon(\"smile\", __iconNode);\n\nexport { __iconNode, Smile as default };\n//# sourceMappingURL=smile.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 [\"path\", { d: \"M12 10V2\", key: \"16sf7g\" }],\n [\"path\", { d: \"m4.93 10.93 1.41 1.41\", key: \"2a7f42\" }],\n [\"path\", { d: \"M2 18h2\", key: \"j10viu\" }],\n [\"path\", { d: \"M20 18h2\", key: \"wocana\" }],\n [\"path\", { d: \"m19.07 10.93-1.41 1.41\", key: \"15zs5n\" }],\n [\"path\", { d: \"M22 22H2\", key: \"19qnx5\" }],\n [\"path\", { d: \"m16 6-4 4-4-4\", key: \"6wukr\" }],\n [\"path\", { d: \"M16 18a4 4 0 0 0-8 0\", key: \"1lzouq\" }]\n];\nconst Sunset = createLucideIcon(\"sunset\", __iconNode);\n\nexport { __iconNode, Sunset as default };\n//# sourceMappingURL=sunset.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 [\"path\", { d: \"m18 2 4 4\", key: \"22kx64\" }],\n [\"path\", { d: \"m17 7 3-3\", key: \"1w1zoj\" }],\n [\"path\", { d: \"M19 9 8.7 19.3c-1 1-2.5 1-3.4 0l-.6-.6c-1-1-1-2.5 0-3.4L15 5\", key: \"1exhtz\" }],\n [\"path\", { d: \"m9 11 4 4\", key: \"rovt3i\" }],\n [\"path\", { d: \"m5 19-3 3\", key: \"59f2uf\" }],\n [\"path\", { d: \"m14 4 6 6\", key: \"yqp9t2\" }]\n];\nconst Syringe = createLucideIcon(\"syringe\", __iconNode);\n\nexport { __iconNode, Syringe as default };\n//# sourceMappingURL=syringe.js.map\n","import { addMonths } from \"./addMonths.js\";\n\n/**\n * The subMonths function options.\n */\n\n/**\n * @name subMonths\n * @category Month Helpers\n * @summary Subtract the specified number of months from the given date.\n *\n * @description\n * Subtract the specified number of months from the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param amount - The amount of months to be subtracted.\n * @param options - An object with options\n *\n * @returns The new date with the months subtracted\n *\n * @example\n * // Subtract 5 months from 1 February 2015:\n * const result = subMonths(new Date(2015, 1, 1), 5)\n * //=> Mon Sep 01 2014 00:00:00\n */\nexport function subMonths(date, amount, options) {\n return addMonths(date, -amount, options);\n}\n\n// Fallback for modularized imports:\nexport default subMonths;\n","/* -------------------------------------------------------------------- */\n/* Agent adapter — Booking (0.26.0). */\n/* */\n/* The Booking component consolidates the seven-step patient booking */\n/* flow into a single component. The adapter exposes variant + step */\n/* navigation. The booking value itself is owned by the consumer and */\n/* flows through `value` / `onChange` — never read here (PHI: patient */\n/* identity + contact stays on the page). */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { BookingHandle } from './booking-types';\n\nexport const bookingAgent: AgentAdapter<BookingHandle> = {\n id: 'booking',\n capabilities: ['navigate', 'view_change'],\n state: {\n variant: {\n type: 'string',\n descriptionKey: 'ui.agent.booking.state.variant',\n description:\n 'Active variant — one of `inline-list`, `accordion`, `calendar`, `flexible`, `progress`.',\n read: (handle) => handle.getVariant(),\n },\n },\n actions: {\n reset: {\n safety: 'write',\n descriptionKey: 'ui.agent.booking.actions.reset',\n description:\n 'Clear the booking value back to an empty state. Use to abandon an in-progress flow.',\n invoke: (handle) => {\n handle.reset();\n },\n },\n goto_step: {\n safety: 'read',\n argsType: '{ step: 1 | 2 | 3 | 4 | 5 | 6 | 7 }',\n descriptionKey: 'ui.agent.booking.actions.gotoStep',\n description:\n 'Jump to the given step. Implementations may clamp to the first incomplete step if the requested one is not reachable yet.',\n invoke: (handle, args: { step: 1 | 2 | 3 | 4 | 5 | 6 | 7 }) => {\n handle.goToStep(args.step);\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'booking',\n description: 'Marks the Booking root region.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","/* -------------------------------------------------------------------- */\n/* Booking — public type surface (0.26.0). */\n/* */\n/* Re-exported from `booking.tsx`. Lives in its own module so */\n/* `cascade.ts` can import the types without a circular dependency on */\n/* the main component file. */\n/* -------------------------------------------------------------------- */\n\nimport type { ComponentPropsWithoutRef, ReactNode } from 'react';\n\n/* -------------------------------------------------------------------- */\n/* Variant */\n/* -------------------------------------------------------------------- */\n\nexport type BookingVariant =\n | 'inline-list'\n | 'accordion'\n | 'calendar'\n | 'flexible'\n | 'progress';\n\n/* -------------------------------------------------------------------- */\n/* Domain shapes */\n/* -------------------------------------------------------------------- */\n\nexport type InsuranceType = 'private' | 'public';\n\n/** Channels the patient can pick to receive the confirmation link. */\nexport type ConfirmationChannel = 'email' | 'whatsapp' | 'sms';\n\n/** Fixed order — email first, then WhatsApp, then SMS. */\nexport const CONFIRMATION_CHANNEL_ORDER: readonly ConfirmationChannel[] = [\n 'email',\n 'whatsapp',\n 'sms',\n] as const;\n\nexport interface BookingSpecialty {\n id: string;\n label: string;\n /** Optional ordering hint; falls back to array order. */\n sequenceNumber?: number;\n /** Restrict to operators-on-page when lockedOperatorId is set. */\n operatorIds?: string[];\n}\n\nexport interface BookingService {\n id: string;\n label: string;\n /** Minutes — required for slot fetching. */\n durationMin: number;\n /** Required when useSpecialties is true. */\n specialtyId?: string;\n /** Operators who can perform this service. */\n operatorIds?: string[];\n}\n\nexport interface BookingOperator {\n id: string;\n name: string;\n specialtyIds?: string[];\n appointmentBookingReasonIds?: string[];\n}\n\nexport interface BookingSlot {\n /** Opaque unique key within `availableSlots[date]`. */\n key: string;\n /** HH:mm 24h — used for display. */\n time: string;\n available: boolean;\n /** Opaque passthrough so the consumer can resolve operatorId / chairId\n * / dateTime when `onSubmit` fires. */\n meta?: Record<string, unknown>;\n}\n\nexport interface BookingDetails {\n firstName: string;\n lastName: string;\n email: string;\n mobilePhone: string;\n privacyConsent: boolean;\n termsConsent: boolean;\n // Opt-in fields — typed optional, required only when their `require*`\n // prop is true on `BookingProps`.\n codiceFiscale?: string;\n dateOfBirth?: string;\n insuranceNumber?: string;\n // Optional, gated by `show*` props.\n note?: string;\n returningPatient?: boolean;\n /**\n * Channels the patient picked for the confirmation link. Guaranteed to\n * be a non-empty subset of the practice's enabled `confirmationChannels`\n * when present. Omitted when only one channel is enabled (implicit —\n * backend infers from the practice config).\n */\n confirmationChannels?: ConfirmationChannel[];\n}\n\nexport interface BookingValue {\n insuranceType?: InsuranceType;\n specialtyId?: string;\n /**\n * Multi-select form of `specialtyId` — set this instead of (or alongside)\n * `specialtyId` when `specialtyPickerStyle='multi-select'`. The cascade\n * reads this array first and treats services / operators / slots as a\n * union of the selected specialties. When both are set, the array wins.\n * Added in 0.34.0.\n */\n specialtyIds?: string[];\n serviceId?: string;\n /**\n * Multi-select form of `serviceId` — see `specialtyIds`. Set when\n * `servicePickerStyle='multi-select'`. Union semantics. Added in 0.34.0.\n */\n serviceIds?: string[];\n /** May be the literal `'all'` sentinel to mean \"no operator preference\". */\n operatorId?: string;\n /**\n * Multi-select form of `operatorId` — see `specialtyIds`. Set when\n * `operatorPickerStyle='multi-select'`. The kit doesn't filter slots by\n * operator itself (the consumer owns slot resolution), but consumers\n * using multi-select operator typically filter `availableSlots` to the\n * union of `operatorIds` before passing the data in. Added in 0.34.0.\n */\n operatorIds?: string[];\n /** YYYY-MM-DD. */\n date?: string;\n /** Opaque key from `availableSlots[date]`. */\n slotKey?: string;\n /** Partial details — fully populated when the user is ready to submit. */\n details?: Partial<BookingDetails>;\n}\n\n/* -------------------------------------------------------------------- */\n/* Submit payload — fully resolved. */\n/* -------------------------------------------------------------------- */\n\nexport interface BookingSubmitPayload {\n slot: BookingSlot;\n value: BookingValue;\n /** Fully populated + validated (privacy + terms ticked, required fields filled). */\n details: BookingDetails;\n}\n\n/* -------------------------------------------------------------------- */\n/* Async validator return shape */\n/* -------------------------------------------------------------------- */\n\nexport interface BookingValidationResult {\n valid: boolean;\n /** Optional localised hint shown next to the field on failure. */\n hint?: string;\n}\n\nexport type BookingValidator = (\n value: string,\n) => Promise<BookingValidationResult>;\n\n/* -------------------------------------------------------------------- */\n/* Imperative handle */\n/* -------------------------------------------------------------------- */\n\nexport interface BookingHandle {\n getVariant: () => BookingVariant;\n /** Clear `value` back to an empty state via `onChange`. */\n reset: () => void;\n /**\n * Jump to a specific step. Implementations may clamp to the first\n * incomplete step if the requested one isn't reachable yet.\n */\n goToStep: (step: 1 | 2 | 3 | 4 | 5 | 6 | 7) => void;\n}\n\n/* -------------------------------------------------------------------- */\n/* Component props */\n/* -------------------------------------------------------------------- */\n\nexport interface BookingProps extends Omit<\n ComponentPropsWithoutRef<'div'>,\n 'aria-label' | 'onChange' | 'onSubmit'\n> {\n variant?: BookingVariant;\n\n // Policy\n country?: string;\n useSpecialties?: boolean;\n allowOperatorSelection?: boolean;\n /** Pins step 4 to this operator. */\n lockedOperatorId?: string;\n\n // Data (any may be empty — the cascade handles it)\n specialties?: BookingSpecialty[];\n services: BookingService[];\n operators?: BookingOperator[];\n availableDates: string[];\n availableSlots: Record<string, BookingSlot[]>;\n /** Server-side hint of the next free date when the current window is empty. */\n nextAvailableDate?: string;\n\n // Step 7 controls (all opt-in, default false)\n requireCodiceFiscale?: boolean;\n requireDateOfBirth?: boolean;\n requireInsuranceNumber?: boolean;\n showNote?: boolean;\n showReturningPatientFlag?: boolean;\n privacyPolicyUrl?: string;\n termsUrl?: string;\n\n // Validation hooks (consumer-injected)\n validateCodiceFiscale?: BookingValidator;\n validateInsuranceNumber?: BookingValidator;\n\n // Auto-select policy\n /** Default: false. Specialty auto-select on length=1 is always on. */\n autoSelectSingleService?: boolean;\n\n // Confirmation-channel delivery\n /**\n * Channels the practice has enabled. The picker renders one checkbox\n * per channel; when length === 1, the picker is hidden and the single\n * channel is implicit. Defaults to `['email']` when omitted.\n */\n confirmationChannels?: ConfirmationChannel[];\n /**\n * Pre-checked channels. Intersected with `confirmationChannels` for\n * safety. When omitted, the kit applies a smart default (always email;\n * +whatsapp when mobile is plausibly filled; +sms when whatsapp isn't\n * available).\n */\n defaultConfirmationChannels?: ConfirmationChannel[];\n\n // State\n value: BookingValue;\n onChange: (next: BookingValue) => void;\n onSubmit: (payload: BookingSubmitPayload) => void | Promise<void>;\n\n // UX\n /**\n * Calendar/date-strip shimmer — set true while `availableDates` is being\n * fetched. When omitted, the kit falls back to `loadingSlots` for the\n * calendar shimmer (the long-standing behaviour). Split from\n * `loadingSlots` in 0.33.9 so consumers using a two-query pattern\n * (\"which days have availability\" + per-day slot fetch) can shimmer\n * the calendar independently of the slot list — without this split a\n * per-day slot fetch re-shimmers the whole calendar on every date click.\n */\n loadingDates?: boolean;\n /**\n * Slot-list shimmer — set true while `availableSlots[value.date]` is\n * being fetched. Drives the `<GroupedTimeSlots>` and the calendar-\n * variant time-slot list. When `loadingDates` is omitted, this flag\n * also drives the calendar shimmer (backward-compat fallback).\n */\n loadingSlots?: boolean;\n submitting?: boolean;\n /**\n * @default 'flat'\n * `'elevated'` wraps the kit-rendered surface in the equivalent of\n * `Card variant=\"elevated\"` (same tokens, same padding). Use to drop\n * the consumer-side Card wrap.\n */\n surface?: 'flat' | 'elevated';\n /**\n * Fires whenever the displayed step changes — steps 1..7 from the\n * cascade engine + step `8` when the success view mounts. Useful for\n * analytics events that aren't already kit-internal, custom focus\n * management, or page-title updates. The kit also auto-scrolls the\n * success container into view on the 1..7 → 8 transition; consumers\n * don't need to do that themselves.\n */\n onStepChange?: (step: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8) => void;\n /**\n * Fires when the patient picks a date in the calendar — sugar for\n * consumers using a two-query pattern who need to kick off the\n * per-day slot fetch on date click. Consumers can already detect\n * a date change by diffing `value.date` inside `onChange`; this\n * callback just spares them that diff. Fires AFTER the kit has\n * applied the date change through `onChange` — `value.date` will\n * reflect the new ISO when this fires.\n */\n onDateSelect?: (iso: string) => void;\n /**\n * Fires when the visible 4-day window starts or shifts. Used by\n * two-query consumers to lazy-fetch `dailySlots/{date}` for the\n * newly-visible days. Receives the inclusive ISO date strings of\n * the first and last visible day in the window. Fires on mount\n * (with the resolved initial window) and on every prev/next\n * arrow click, internal jump-to-next-available action, and\n * automatic re-sync triggered by `availableDates` arriving.\n *\n * Only fires when `datePickerStyle='four-day-grid'` — the\n * month-calendar picker has no \"window\" concept; consumers using\n * that style fetch availability per visible month and don't need\n * this signal.\n */\n onWindowChange?: (startIso: string, endIso: string) => void;\n /**\n * @default 'select'\n * UI rendered for the Specialty step. Independent of layout `variant`.\n *\n * - `'select'` (default): the kit's `<Select>` dropdown — current behaviour.\n * - `'combobox'`: single-select `<Combobox>` with type-ahead search.\n * Pays off for long specialty lists (>10 entries).\n * - `'multi-select'`: multi-select `<MultiSelect>` with chip-rendered\n * selections. Writes to `value.specialtyIds` (array). The cascade reads\n * the array as a union — services / operators / slots are filtered\n * by ANY of the selected specialties. Added in 0.34.0.\n */\n specialtyPickerStyle?: 'select' | 'combobox' | 'multi-select';\n /**\n * @default 'cards' for `variant='inline-list'`, `'select'` for others\n * UI rendered for the Service step. Independent of layout `variant`.\n *\n * - `'cards'`: visual card grid (the long-standing `ServiceCardGroup`\n * used by inline-list). Card layout, one row per service with icon,\n * label, and duration.\n * - `'select'`: compact `<Select>` dropdown (default for the chrome-\n * denser variants — calendar / flexible / accordion / progress).\n * - `'combobox'`: single-select `<Combobox>` with type-ahead search.\n * - `'multi-select'`: multi-select `<MultiSelect>` writing to\n * `value.serviceIds`. Cascade reads as union — operators / slots are\n * filtered by ANY of the selected services. Added in 0.34.0.\n */\n servicePickerStyle?: 'select' | 'combobox' | 'multi-select' | 'cards';\n /**\n * @default 'select'\n * UI rendered for the Operator step. Independent of layout `variant`.\n *\n * - `'select'` (default): `<Select>` dropdown including the implicit\n * `'all'` \"any operator\" sentinel.\n * - `'combobox'`: single-select `<Combobox>` with type-ahead search.\n * - `'multi-select'`: multi-select `<MultiSelect>` writing to\n * `value.operatorIds`. The kit doesn't filter slots by operator\n * itself — the consumer owns slot resolution — but consumers using\n * multi-select operator typically filter `availableSlots` to the\n * union of selected operators before passing the data in. Added\n * in 0.34.0.\n */\n operatorPickerStyle?: 'select' | 'combobox' | 'multi-select';\n /**\n * @default 'month-calendar'\n * Selects the date + slot picker rendered inside the cascade's date\n * and slot steps. Independent of the layout `variant`:\n *\n * - `'month-calendar'` (default): the 6×7 `<MonthGrid>` followed by\n * the morning/afternoon/evening `<GroupedTimeSlots>`. Two-step flow\n * — patient picks a date, slots reveal underneath.\n *\n * - `'four-day-grid'`: a 4-column day-strip (`<SlotGrid>`) with ±4-day\n * arrow nav and per-day vertical slot tiles. One-step flow —\n * patient picks a slot directly; clicking a slot atomically sets\n * both `value.date` and `value.slotKey`. The cascade's separate\n * \"slot\" step is suppressed because the slots are inline with the\n * date strip.\n *\n * The data contract is unchanged — `availableDates`, `availableSlots`,\n * `loadingDates`, `loadingSlots`, `onDateSelect` all behave the same\n * way for both styles. Defaults to `'month-calendar'` so existing\n * consumers see no behavioural change.\n */\n datePickerStyle?: 'month-calendar' | 'four-day-grid';\n /**\n * Surface a submit-failure message inside the form (Alert variant=destructive\n * above the submit button). The consumer owns the state — set it after an\n * `onSubmit` rejection, clear it when retrying or on a field edit. When set,\n * the kit's normal \"form stays mounted on rejected promise\" behaviour is\n * unchanged; this just gives the failure a sanctioned slot to render.\n */\n submitError?: ReactNode;\n /**\n * @default 'live'\n * In `'demo'` mode the kit's step-8 success view swaps its description to\n * a localised \"This was a demo — no confirmation was sent.\" so the copy\n * stays honest when no real API call was made.\n */\n mode?: 'live' | 'demo';\n /**\n * @default true\n * Render a \"Modify booking\" button on the step-8 success view that returns\n * to step 7 without clearing `value`/`details`. Practices that want a\n * one-shot booking flow can hide this.\n */\n showModifyOnSuccess?: boolean;\n emptyServicesSlot?: ReactNode;\n onboardingIncompleteSlot?: ReactNode;\n\n // a11y\n 'aria-label'?: string;\n id?: string;\n}\n","/* -------------------------------------------------------------------- */\n/* Booking cascade engine — pure functions, no React. */\n/* */\n/* The seven-step state machine that drives every variant. Visibility */\n/* gates, downstream filtering, auto-skip rules, and reset semantics */\n/* live here so each variant only renders a phase of the cascade — it */\n/* doesn't re-implement the logic. The booking-website's legacy */\n/* `useBookingState.js` is the behavioural source-of-truth; the */\n/* mapping is documented inline at each gate. */\n/* -------------------------------------------------------------------- */\n\nimport type {\n BookingOperator,\n BookingService,\n BookingSlot,\n BookingSpecialty,\n BookingValue,\n ConfirmationChannel,\n InsuranceType,\n} from './booking-types';\nimport { CONFIRMATION_CHANNEL_ORDER } from './booking-types';\n\n/**\n * Sentinel for the operator filter's \"All operators\" pseudo-option. Mirrors\n * `OPERATORS_ALL = '0'` in the legacy `useBookingState.js`, but the kit\n * uses `'all'` as the well-known string so consumers can't accidentally\n * collide with a real operator id of `'0'`.\n */\nexport const OPERATORS_ALL = 'all' as const;\n\nconst COUNTRY_GERMANY = 'de';\n\n/* -------------------------------------------------------------------- */\n/* Inputs / outputs */\n/* -------------------------------------------------------------------- */\n\nexport interface CascadePolicy {\n /** ISO 3166-1 alpha-2 country code. Currently only `'de'` toggles a gate. */\n country?: string;\n useSpecialties?: boolean;\n allowOperatorSelection?: boolean;\n /** When set, locks step 4 to this operator id and hides the picker. */\n lockedOperatorId?: string;\n /** Defaults to `false`. When true, single-service lists auto-pre-fill. */\n autoSelectSingleService?: boolean;\n}\n\nexport interface CascadeInputs extends CascadePolicy {\n specialties: BookingSpecialty[];\n services: BookingService[];\n operators: BookingOperator[];\n availableDates: string[];\n availableSlots: Record<string, BookingSlot[]>;\n value: BookingValue;\n}\n\nexport interface CascadeGates {\n insurance: boolean;\n specialty: boolean;\n service: boolean;\n operator: boolean;\n date: boolean;\n slot: boolean;\n details: boolean;\n /** True when a service is picked but no eligible operators can perform it. */\n onboardingIncomplete: boolean;\n}\n\nexport interface CascadeFiltered {\n specialties: BookingSpecialty[];\n services: BookingService[];\n /**\n * Eligible operators for the active specialty (when `useSpecialties=true`)\n * OR the active service. Excludes the \"All operators\" sentinel — that's\n * always prepended in the UI layer.\n */\n operators: BookingOperator[];\n}\n\n/** Step number — 1-indexed, matches the docs / a11y order. */\nexport type CascadeStep = 1 | 2 | 3 | 4 | 5 | 6 | 7;\n\nexport interface CascadeOutputs {\n gates: CascadeGates;\n filtered: CascadeFiltered;\n /** Current step: the first visible step that has an unfulfilled requirement. */\n currentStep: CascadeStep;\n /** Total visible steps (1..7 minus any auto-skipped). */\n totalSteps: number;\n /** Ordered list of the visible step indices, used by variants that show a stepper. */\n visibleSteps: CascadeStep[];\n /** Whether every required step is satisfied — the submit button is gated on this. */\n isReadyToSubmit: boolean;\n /** Selected service's duration, if any — needed for slot fetching. */\n durationMin?: number;\n /** Selected slot resolved from `value.date` + `value.slotKey`. */\n selectedSlot?: BookingSlot;\n}\n\n/* -------------------------------------------------------------------- */\n/* Filtering helpers */\n/* -------------------------------------------------------------------- */\n\nfunction filterSpecialties(inputs: CascadeInputs): BookingSpecialty[] {\n const list = inputs.lockedOperatorId\n ? inputs.specialties.filter((s) =>\n s.operatorIds?.includes(inputs.lockedOperatorId as string),\n )\n : inputs.specialties;\n // Stable copy + sort by `sequenceNumber` (falsy → bottom).\n return [...list].sort((a, b) => {\n const aSeq = a.sequenceNumber ?? Number.POSITIVE_INFINITY;\n const bSeq = b.sequenceNumber ?? Number.POSITIVE_INFINITY;\n return aSeq - bSeq;\n });\n}\n\nfunction filterServices(inputs: CascadeInputs): BookingService[] {\n let list = inputs.services;\n if (inputs.lockedOperatorId) {\n list = list.filter((s) =>\n s.operatorIds?.includes(inputs.lockedOperatorId as string),\n );\n }\n // Mirror the `gates.specialty` auto-on rule — see computeGates().\n const useSpecialtiesResolved =\n inputs.useSpecialties === undefined\n ? inputs.specialties.length > 0\n : inputs.useSpecialties;\n if (useSpecialtiesResolved) {\n // 0.34.0: read array form first (`specialtyIds` for multi-select);\n // fall back to single `specialtyId`. Union semantics — show any\n // service matching ANY of the selected specialties.\n const specialtyIds = resolveSpecialtyIds(inputs.value);\n if (specialtyIds.length > 0) {\n list = list.filter(\n (s) =>\n s.specialtyId !== undefined && specialtyIds.includes(s.specialtyId),\n );\n }\n }\n return list;\n}\n\nfunction eligibleOperators(inputs: CascadeInputs): BookingOperator[] {\n // Mirror the gates.specialty auto-on rule.\n const useSpecialtiesResolved =\n inputs.useSpecialties === undefined\n ? inputs.specialties.length > 0\n : inputs.useSpecialties;\n // When `useSpecialties` is on, eligibility is by specialty. Otherwise by\n // the selected service's reverse-link. Both are inclusive — if a service\n // says any operator can perform it, all operators are eligible.\n // 0.34.0: union semantics — read array form first, fall back to single.\n if (useSpecialtiesResolved) {\n const specialtyIds = resolveSpecialtyIds(inputs.value);\n if (specialtyIds.length > 0) {\n return inputs.operators.filter((op) =>\n op.specialtyIds?.some((sid) => specialtyIds.includes(sid)),\n );\n }\n }\n if (!useSpecialtiesResolved) {\n const serviceIds = resolveServiceIds(inputs.value);\n if (serviceIds.length > 0) {\n return inputs.operators.filter((op) =>\n op.appointmentBookingReasonIds?.some((rid) => serviceIds.includes(rid)),\n );\n }\n }\n return [];\n}\n\n/* -------------------------------------------------------------------- */\n/* Gates */\n/* -------------------------------------------------------------------- */\n\nfunction computeGates(\n inputs: CascadeInputs,\n filtered: CascadeFiltered,\n): CascadeGates {\n const insuranceVisible = inputs.country === COUNTRY_GERMANY;\n // Insurance gate is satisfied either if it's not visible or the user has\n // picked one of the two values.\n const insuranceSatisfied =\n !insuranceVisible || inputs.value.insuranceType !== undefined;\n\n // Specialty visibility — 0.30.4: auto-on when `specialties` has items.\n // - `useSpecialties === true` → visible (legacy explicit opt-in)\n // - `useSpecialties === false` → hidden (explicit opt-out)\n // - `useSpecialties === undefined` (default) → visible iff `specialties`\n // has items. Previously the default `false` meant the step never\n // rendered unless the consumer explicitly opted in, which silently\n // dropped the step in every variant for the common case where the\n // consumer passed `specialties` data but not the boolean.\n const useSpecialtiesResolved =\n inputs.useSpecialties === undefined\n ? inputs.specialties.length > 0\n : inputs.useSpecialties;\n const specialtyVisible = useSpecialtiesResolved && insuranceSatisfied;\n // 0.34.0: array-or-single semantics — a step is \"satisfied\" when\n // EITHER the single field is set OR the array field has at least\n // one entry. Same applies to service / operator picks below.\n const specialtyPicked = resolveSpecialtyIds(inputs.value).length > 0;\n const specialtySatisfied = !specialtyVisible || specialtyPicked;\n\n const serviceVisible = specialtySatisfied;\n const servicePicked = resolveServiceIds(inputs.value).length > 0;\n const serviceSatisfied = !serviceVisible || servicePicked;\n\n // Operator: visible only when the user can pick from >1 eligible.\n const eligibleOps = filtered.operators;\n const operatorVisible =\n Boolean(inputs.allowOperatorSelection) &&\n serviceSatisfied &&\n servicePicked &&\n !inputs.lockedOperatorId &&\n eligibleOps.length > 1;\n // operator is always \"satisfied\" because the \"All operators\" sentinel is\n // the implicit default — patients who don't pick still flow through.\n const operatorSatisfied = true;\n void operatorSatisfied;\n\n const dateVisible = serviceSatisfied && servicePicked;\n const dateSatisfied = !dateVisible || inputs.value.date !== undefined;\n\n const slotVisible = dateSatisfied && inputs.value.date !== undefined;\n const slotSatisfied = !slotVisible || inputs.value.slotKey !== undefined;\n\n const detailsVisible = slotSatisfied && inputs.value.slotKey !== undefined;\n\n const onboardingIncomplete = servicePicked && eligibleOps.length === 0;\n\n return {\n insurance: insuranceVisible,\n specialty: specialtyVisible,\n service: serviceVisible,\n operator: operatorVisible,\n date: dateVisible,\n slot: slotVisible,\n details: detailsVisible,\n onboardingIncomplete,\n };\n}\n\n/* -------------------------------------------------------------------- */\n/* Step number derivation */\n/* -------------------------------------------------------------------- */\n\nfunction deriveStep(\n inputs: CascadeInputs,\n gates: CascadeGates,\n): { currentStep: CascadeStep; visibleSteps: CascadeStep[] } {\n const visible: CascadeStep[] = [];\n if (gates.insurance) visible.push(1);\n if (gates.specialty) visible.push(2);\n visible.push(3); // service is always required\n if (gates.operator) visible.push(4);\n visible.push(5); // date is always required (after service)\n visible.push(6); // slot is always required\n visible.push(7); // details is always required (the final submit step)\n\n const isFulfilled: Record<CascadeStep, boolean> = {\n 1: inputs.value.insuranceType !== undefined,\n // 0.34.0: array-or-single — satisfied when EITHER form is present.\n 2: resolveSpecialtyIds(inputs.value).length > 0,\n 3: resolveServiceIds(inputs.value).length > 0,\n 4:\n inputs.value.operatorId !== undefined ||\n (inputs.value.operatorIds !== undefined &&\n inputs.value.operatorIds.length > 0),\n 5: inputs.value.date !== undefined,\n 6: inputs.value.slotKey !== undefined,\n 7: false, // details fulfilment is owned by the form's own validation\n };\n\n const firstIncomplete = visible.find((s) => !isFulfilled[s]);\n return {\n currentStep: firstIncomplete ?? 7,\n visibleSteps: visible,\n };\n}\n\n/* -------------------------------------------------------------------- */\n/* Main derive */\n/* -------------------------------------------------------------------- */\n\nexport function deriveCascade(inputs: CascadeInputs): CascadeOutputs {\n const filtered: CascadeFiltered = {\n specialties: filterSpecialties(inputs),\n services: filterServices(inputs),\n operators: eligibleOperators(inputs),\n };\n const gates = computeGates(inputs, filtered);\n const { currentStep, visibleSteps } = deriveStep(inputs, gates);\n\n // Look up the selected slot for variant bodies that want to render it\n // (e.g. the \"Confirm at HH:mm on DATE\" summary line above the details\n // form). Cheaper to do here than make each variant re-search.\n let selectedSlot: BookingSlot | undefined;\n if (inputs.value.date && inputs.value.slotKey) {\n const day = inputs.availableSlots[inputs.value.date];\n if (day) selectedSlot = day.find((s) => s.key === inputs.value.slotKey);\n }\n\n // 0.34.0: when multi-select is active we resolve to \"first picked\" for\n // the duration-min / selected-service indicator. The submit payload\n // carries the full value (including arrays) so the consumer can fan\n // out per service / operator if needed.\n const serviceIds = resolveServiceIds(inputs.value);\n const selectedService =\n serviceIds.length > 0\n ? inputs.services.find((s) => s.id === serviceIds[0])\n : undefined;\n\n const specialtyPickedFinal = resolveSpecialtyIds(inputs.value).length > 0;\n\n const isReadyToSubmit =\n serviceIds.length > 0 &&\n inputs.value.date !== undefined &&\n inputs.value.slotKey !== undefined &&\n (!gates.insurance || inputs.value.insuranceType !== undefined) &&\n (!gates.specialty || specialtyPickedFinal);\n\n return {\n gates,\n filtered,\n currentStep,\n totalSteps: visibleSteps.length,\n visibleSteps,\n isReadyToSubmit,\n durationMin: selectedService?.durationMin,\n selectedSlot,\n };\n}\n\n/* -------------------------------------------------------------------- */\n/* Reset helpers — pure, return next value */\n/* */\n/* Every cascade change clears downstream selections so the user never */\n/* lands on a fulfilled-but-inconsistent state. */\n/* -------------------------------------------------------------------- */\n\nexport function resetOnInsuranceChange(\n value: BookingValue,\n next: InsuranceType | undefined,\n): BookingValue {\n return {\n ...value,\n insuranceType: next,\n specialtyId: undefined,\n serviceId: undefined,\n operatorId: undefined,\n date: undefined,\n slotKey: undefined,\n details: undefined,\n };\n}\n\nexport function resetOnSpecialtyChange(\n value: BookingValue,\n next: string | undefined,\n): BookingValue {\n return {\n ...value,\n specialtyId: next,\n specialtyIds: undefined,\n serviceId: undefined,\n serviceIds: undefined,\n operatorId: undefined,\n operatorIds: undefined,\n date: undefined,\n slotKey: undefined,\n details: undefined,\n };\n}\n\n/**\n * Multi-select counterpart to `resetOnSpecialtyChange`. Writes the\n * `specialtyIds` array form and clears any single-form `specialtyId`\n * so the cascade reads the array. Added in 0.34.0.\n */\nexport function resetOnSpecialtyIdsChange(\n value: BookingValue,\n next: string[] | undefined,\n): BookingValue {\n return {\n ...value,\n specialtyId: undefined,\n specialtyIds: next,\n serviceId: undefined,\n serviceIds: undefined,\n operatorId: undefined,\n operatorIds: undefined,\n date: undefined,\n slotKey: undefined,\n details: undefined,\n };\n}\n\nexport function resetOnServiceChange(\n value: BookingValue,\n next: string | undefined,\n): BookingValue {\n return {\n ...value,\n serviceId: next,\n serviceIds: undefined,\n // Default the operator to the \"All operators\" sentinel so a patient\n // who doesn't care about picking lands on a satisfied step 4 without\n // any further input.\n operatorId: next ? OPERATORS_ALL : undefined,\n operatorIds: undefined,\n date: undefined,\n slotKey: undefined,\n details: undefined,\n };\n}\n\n/** Multi-select counterpart to `resetOnServiceChange`. Added in 0.34.0. */\nexport function resetOnServiceIdsChange(\n value: BookingValue,\n next: string[] | undefined,\n): BookingValue {\n const hasAny = !!next && next.length > 0;\n return {\n ...value,\n serviceId: undefined,\n serviceIds: next,\n operatorId: hasAny ? OPERATORS_ALL : undefined,\n operatorIds: undefined,\n date: undefined,\n slotKey: undefined,\n details: undefined,\n };\n}\n\nexport function resetOnOperatorChange(\n value: BookingValue,\n next: string | undefined,\n): BookingValue {\n return {\n ...value,\n operatorId: next,\n operatorIds: undefined,\n date: undefined,\n slotKey: undefined,\n details: undefined,\n };\n}\n\n/** Multi-select counterpart to `resetOnOperatorChange`. Added in 0.34.0. */\nexport function resetOnOperatorIdsChange(\n value: BookingValue,\n next: string[] | undefined,\n): BookingValue {\n return {\n ...value,\n operatorId: undefined,\n operatorIds: next,\n date: undefined,\n slotKey: undefined,\n details: undefined,\n };\n}\n\n/* -------------------------------------------------------------------- */\n/* Multi-select resolution helpers — 0.34.0 */\n/* */\n/* The cascade reads the array form of each step's value first, falling */\n/* back to the single-string form. This lets the picker style switch at */\n/* runtime without rewriting the entire cascade. */\n/* -------------------------------------------------------------------- */\n\n/** Returns the effective specialty selection as an array. Empty when nothing picked. */\nexport function resolveSpecialtyIds(value: BookingValue): string[] {\n if (value.specialtyIds && value.specialtyIds.length > 0) {\n return value.specialtyIds;\n }\n if (value.specialtyId) return [value.specialtyId];\n return [];\n}\n\n/** Returns the effective service selection as an array. Empty when nothing picked. */\nexport function resolveServiceIds(value: BookingValue): string[] {\n if (value.serviceIds && value.serviceIds.length > 0) {\n return value.serviceIds;\n }\n if (value.serviceId) return [value.serviceId];\n return [];\n}\n\n/** Returns the effective operator selection as an array. Empty when nothing picked. */\nexport function resolveOperatorIds(value: BookingValue): string[] {\n if (value.operatorIds && value.operatorIds.length > 0) {\n return value.operatorIds;\n }\n if (value.operatorId) return [value.operatorId];\n return [];\n}\n\nexport function resetOnDateChange(\n value: BookingValue,\n next: string | undefined,\n): BookingValue {\n return {\n ...value,\n date: next,\n slotKey: undefined,\n // Keep details — date/slot changes shouldn't wipe the patient form\n // since the user has already filled some fields.\n };\n}\n\nexport function resetOnSlotChange(\n value: BookingValue,\n next: string | undefined,\n): BookingValue {\n return {\n ...value,\n slotKey: next,\n };\n}\n\n/* -------------------------------------------------------------------- */\n/* Auto-pre-select normalisation */\n/* */\n/* Called once on mount (and whenever the inputs that trigger them */\n/* arrive — e.g. when `specialties` populates from a fetch). Returns the */\n/* value possibly mutated with the auto-picked fields. Callers should */\n/* compare the result to the input and fire `onChange` once if they */\n/* differ so the consumer sees the normalised value. */\n/* -------------------------------------------------------------------- */\n\nexport function applyAutoSelects(\n value: BookingValue,\n inputs: CascadePolicy & {\n specialties: BookingSpecialty[];\n services: BookingService[];\n },\n): BookingValue {\n let next = value;\n\n // Rule 1: locked operator pins step 4.\n if (inputs.lockedOperatorId && next.operatorId !== inputs.lockedOperatorId) {\n next = { ...next, operatorId: inputs.lockedOperatorId };\n }\n\n // Rule 2: single specialty auto-skips step 2. Skipped when the consumer\n // is operating in multi-select mode (specialtyIds is set) — the patient\n // is explicitly picking, don't override.\n const useSpecialtiesResolved =\n inputs.useSpecialties === undefined\n ? inputs.specialties.length > 0\n : inputs.useSpecialties;\n if (\n useSpecialtiesResolved &&\n inputs.specialties.length === 1 &&\n next.specialtyId === undefined &&\n next.specialtyIds === undefined\n ) {\n next = { ...next, specialtyId: inputs.specialties[0].id };\n }\n\n // Rule 3: single resolved service auto-fills step 3 — only when explicitly\n // opted into. The spec says specialty auto-select is always on, but\n // service auto-select is opt-in because UX teams may want explicit\n // confirmation. Skipped when serviceIds is set (multi-select).\n if (inputs.autoSelectSingleService) {\n const specialtyIds = resolveSpecialtyIds(next);\n const resolvedServices =\n specialtyIds.length > 0\n ? inputs.services.filter(\n (s) => s.specialtyId && specialtyIds.includes(s.specialtyId),\n )\n : inputs.services;\n if (\n resolvedServices.length === 1 &&\n next.serviceId === undefined &&\n next.serviceIds === undefined\n ) {\n next = { ...next, serviceId: resolvedServices[0].id };\n // Mirror resetOnServiceChange's operator default.\n if (next.operatorId === undefined && next.operatorIds === undefined) {\n next = { ...next, operatorId: OPERATORS_ALL };\n }\n }\n }\n\n return next;\n}\n\n/* -------------------------------------------------------------------- */\n/* Helpers exposed for the variants (and tests). */\n/* -------------------------------------------------------------------- */\n\n/** Resolve the active operator id, treating the `'all'` sentinel as `undefined`. */\nexport function resolveOperatorId(value: BookingValue): string | undefined {\n if (!value.operatorId) return undefined;\n if (value.operatorId === OPERATORS_ALL) return undefined;\n return value.operatorId;\n}\n\n/* -------------------------------------------------------------------- */\n/* Confirmation channels — smart default + ordering */\n/* -------------------------------------------------------------------- */\n\n/**\n * Naïve E.164-ish check for the smart-default heuristic. Doesn't validate\n * the phone fully — just confirms the patient has typed *something* that\n * looks like a phone number, so we can decide whether to pre-tick WhatsApp.\n */\nfunction looksLikePhone(value: string | undefined): boolean {\n if (!value) return false;\n const trimmed = value.trim();\n // Require a leading \"+\" or country code-style digits + at least 8 chars.\n return /^\\+?\\d[\\d\\s\\-()]{6,}$/.test(trimmed);\n}\n\n/**\n * Resolve the effective list of enabled channels. Falls back to `['email']`\n * when the consumer omits the prop, preserving the pre-amendment behaviour.\n */\nexport function resolveConfirmationChannels(\n enabled: ConfirmationChannel[] | undefined,\n): ConfirmationChannel[] {\n const list = enabled && enabled.length > 0 ? enabled : ['email'];\n // Canonical order: email → whatsapp → sms.\n const set = new Set(list);\n return CONFIRMATION_CHANNEL_ORDER.filter((c) => set.has(c));\n}\n\n/**\n * Compute the channels to pre-check. Result is intersected with `enabled`\n * for safety so a channel the practice didn't enable never gets ticked.\n *\n * Rules (per spec):\n * 1. Always include 'email'.\n * 2. Include 'whatsapp' if enabled AND mobile looks plausible.\n * 3. Include 'sms' ONLY when whatsapp is NOT in `enabled`.\n * 4. If the consumer passes `override`, honour it verbatim (still\n * intersected with `enabled` for safety).\n */\nexport function defaultConfirmationSelection(\n enabled: ConfirmationChannel[] | undefined,\n mobile: string | undefined,\n override?: ConfirmationChannel[],\n): ConfirmationChannel[] {\n const resolvedEnabled = resolveConfirmationChannels(enabled);\n const enabledSet = new Set(resolvedEnabled);\n\n if (override) {\n return CONFIRMATION_CHANNEL_ORDER.filter(\n (c) => override.includes(c) && enabledSet.has(c),\n );\n }\n\n const out: ConfirmationChannel[] = [];\n if (enabledSet.has('email')) out.push('email');\n\n const mobilePlausible = looksLikePhone(mobile);\n const hasWhatsApp = enabledSet.has('whatsapp');\n if (hasWhatsApp && mobilePlausible) out.push('whatsapp');\n // SMS is pre-checked whenever WhatsApp is not in the enabled set —\n // the spec doesn't gate this on a mobile-present check (matches rule 3).\n if (!hasWhatsApp && enabledSet.has('sms')) out.push('sms');\n\n // Final canonical order pass.\n const outSet = new Set(out);\n return CONFIRMATION_CHANNEL_ORDER.filter((c) => outSet.has(c));\n}\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type FormEvent,\n type ReactNode,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Trans } from 'react-i18next';\nimport { Alert } from '../alert/alert';\nimport { Button } from '../button/button';\nimport { Checkbox } from '../checkbox/checkbox';\nimport { CheckboxGroup } from '../checkbox-group/checkbox-group';\nimport { DatePicker } from '../date-picker/date-picker';\nimport { EmailInput } from '../email-input/email-input';\nimport { FormField } from '../form-field/form-field';\nimport { PhoneInput } from '../phone-input/phone-input';\nimport { TextArea } from '../text-area/text-area';\nimport { TextInput } from '../text-input/text-input';\nimport { Spinner } from '../spinner/spinner';\nimport {\n defaultConfirmationSelection,\n resolveConfirmationChannels,\n} from './cascade';\nimport type {\n BookingDetails,\n BookingValidator,\n ConfirmationChannel,\n} from './booking-types';\n\n/* -------------------------------------------------------------------- */\n/* BookingDetailsForm — step 7 of the cascade. */\n/* */\n/* Captures the patient's identity + contact + consents before submit. */\n/* The form's `onChange` fires per-field so the parent value can persist */\n/* a partial across step navigation; the parent's `onSubmit` is called */\n/* with the full `BookingDetails` payload only when every required field */\n/* + both consents validate. */\n/* -------------------------------------------------------------------- */\n\nconst NOTE_MAX_LENGTH = 500;\nconst CF_REGEX = /^[A-Z0-9]{16}$/;\nconst EMAIL_REGEX = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\nconst VALIDATE_DEBOUNCE_MS = 300;\n\n/* -------------------------------------------------------------------- */\n/* Props */\n/* -------------------------------------------------------------------- */\n\nexport interface BookingDetailsFormProps {\n value: Partial<BookingDetails>;\n onChange: (next: Partial<BookingDetails>) => void;\n onSubmit: (details: BookingDetails) => void | Promise<void>;\n\n // Opt-in fields\n requireCodiceFiscale?: boolean;\n requireDateOfBirth?: boolean;\n /** When `true` AND `insuranceType === 'public'`, render the Versichertennummer field. */\n requireInsuranceNumber?: boolean;\n insuranceType?: 'private' | 'public';\n showNote?: boolean;\n showReturningPatientFlag?: boolean;\n\n // Consent labels\n privacyPolicyUrl?: string;\n termsUrl?: string;\n\n // Validation hooks\n validateCodiceFiscale?: BookingValidator;\n validateInsuranceNumber?: BookingValidator;\n\n // UX\n submitting?: boolean;\n /** Optional summary node rendered above the form (e.g. confirm-time chip). */\n summarySlot?: ReactNode;\n\n // Phone country default — propagated from the practice country code so\n // the country prefix selector starts on the right option.\n defaultPhoneCountry?: string;\n\n // Confirmation-channel picker (sub-section of step 7)\n /**\n * Channels the practice has enabled. When omitted, defaults to\n * `['email']` (picker hidden — single implicit channel). When the\n * resolved list has length 1 the picker stays hidden.\n */\n confirmationChannels?: ConfirmationChannel[];\n /** Pre-checked channels override; falls back to a smart default. */\n defaultConfirmationChannels?: ConfirmationChannel[];\n /**\n * Render an error Alert above the submit button. Set after an\n * `onSubmit` rejection, clear before retrying. The kit doesn't\n * disable the submit button while this is set — the patient can\n * re-submit immediately.\n */\n submitError?: ReactNode;\n}\n\n/* -------------------------------------------------------------------- */\n/* Component */\n/* -------------------------------------------------------------------- */\n\ninterface AsyncStatus {\n state: 'idle' | 'pending' | 'valid' | 'invalid';\n hint?: string;\n}\n\nconst idleStatus: AsyncStatus = { state: 'idle' };\n\nexport const BookingDetailsForm = forwardRef<\n HTMLFormElement,\n BookingDetailsFormProps\n>(\n (\n {\n value,\n onChange,\n onSubmit,\n requireCodiceFiscale = false,\n requireDateOfBirth = false,\n requireInsuranceNumber = false,\n insuranceType,\n showNote = false,\n showReturningPatientFlag = false,\n privacyPolicyUrl,\n termsUrl,\n validateCodiceFiscale,\n validateInsuranceNumber,\n submitting = false,\n summarySlot,\n defaultPhoneCountry,\n confirmationChannels,\n defaultConfirmationChannels,\n submitError,\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const formId = useId();\n\n // Async-validation state per field.\n const [cfStatus, setCfStatus] = useState<AsyncStatus>(idleStatus);\n const [insuranceStatus, setInsuranceStatus] =\n useState<AsyncStatus>(idleStatus);\n\n // Show-validation-error toggle — flips on first blur / submit attempt\n // so the inline errors don't shout at the user mid-typing.\n const [touched, setTouched] = useState<Record<string, boolean>>({});\n const markTouched = useCallback(\n (field: string) => setTouched((t) => ({ ...t, [field]: true })),\n [],\n );\n\n // Per-field debounce timers for the async validators.\n const cfTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const insuranceTimerRef = useRef<ReturnType<typeof setTimeout> | null>(\n null,\n );\n\n useEffect(\n () => () => {\n if (cfTimerRef.current) clearTimeout(cfTimerRef.current);\n if (insuranceTimerRef.current) clearTimeout(insuranceTimerRef.current);\n },\n [],\n );\n\n /* -------------------------- Mutators ---------------------------- */\n\n const update = useCallback(\n (patch: Partial<BookingDetails>) => onChange({ ...value, ...patch }),\n [value, onChange],\n );\n\n /* -------------------- Confirmation-channel picker ---------------- */\n\n const resolvedEnabledChannels = useMemo(\n () => resolveConfirmationChannels(confirmationChannels),\n [confirmationChannels],\n );\n const pickerVisible = resolvedEnabledChannels.length >= 2;\n\n // Smart-default the selection once on mount (and whenever the inputs\n // that drive it change — `mobilePhone` toggles WhatsApp eligibility).\n // We only seed when the parent value is undefined so the patient's own\n // changes win.\n const seededRef = useRef(false);\n useEffect(() => {\n if (!pickerVisible) {\n // Implicit single channel — strip any stale selection.\n if (value.confirmationChannels !== undefined) {\n update({ confirmationChannels: undefined });\n }\n return;\n }\n if (value.confirmationChannels !== undefined) {\n seededRef.current = true;\n return;\n }\n const seed = defaultConfirmationSelection(\n resolvedEnabledChannels,\n value.mobilePhone,\n defaultConfirmationChannels,\n );\n seededRef.current = true;\n update({ confirmationChannels: seed });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n pickerVisible,\n resolvedEnabledChannels,\n value.mobilePhone,\n defaultConfirmationChannels,\n ]);\n\n const selectedChannels = useMemo<ConfirmationChannel[]>(\n () => value.confirmationChannels ?? [],\n [value.confirmationChannels],\n );\n const noChannelsSelected = pickerVisible && selectedChannels.length === 0;\n\n /* -------------------------- CF async ---------------------------- */\n\n useEffect(() => {\n const cf = value.codiceFiscale;\n if (!requireCodiceFiscale || !validateCodiceFiscale || !cf) {\n setCfStatus(idleStatus);\n return;\n }\n if (!CF_REGEX.test(cf)) {\n // Don't fire the async validator until the format is plausible.\n setCfStatus({\n state: 'invalid',\n hint: t('booking.details.codiceFiscale.invalidFormat'),\n });\n return;\n }\n setCfStatus({ state: 'pending' });\n if (cfTimerRef.current) clearTimeout(cfTimerRef.current);\n cfTimerRef.current = setTimeout(() => {\n validateCodiceFiscale(cf)\n .then((res) =>\n setCfStatus(\n res.valid\n ? { state: 'valid' }\n : { state: 'invalid', hint: res.hint },\n ),\n )\n .catch(() =>\n setCfStatus({\n state: 'invalid',\n hint: t('booking.details.codiceFiscale.unavailable'),\n }),\n );\n }, VALIDATE_DEBOUNCE_MS);\n }, [requireCodiceFiscale, validateCodiceFiscale, value.codiceFiscale, t]);\n\n /* ----------------------- Insurance async ------------------------ */\n\n const insuranceShown = requireInsuranceNumber && insuranceType === 'public';\n useEffect(() => {\n const n = value.insuranceNumber;\n if (!insuranceShown || !validateInsuranceNumber || !n) {\n setInsuranceStatus(idleStatus);\n return;\n }\n setInsuranceStatus({ state: 'pending' });\n if (insuranceTimerRef.current) clearTimeout(insuranceTimerRef.current);\n insuranceTimerRef.current = setTimeout(() => {\n validateInsuranceNumber(n)\n .then((res) =>\n setInsuranceStatus(\n res.valid\n ? { state: 'valid' }\n : { state: 'invalid', hint: res.hint },\n ),\n )\n .catch(() =>\n setInsuranceStatus({\n state: 'invalid',\n hint: t('booking.details.insuranceNumber.unavailable'),\n }),\n );\n }, VALIDATE_DEBOUNCE_MS);\n }, [insuranceShown, validateInsuranceNumber, value.insuranceNumber, t]);\n\n /* ------------------------- Validation --------------------------- */\n\n const emailValid = useMemo(\n () => Boolean(value.email && EMAIL_REGEX.test(value.email)),\n [value.email],\n );\n const phoneValid = useMemo(\n () => Boolean(value.mobilePhone && value.mobilePhone.length >= 6),\n [value.mobilePhone],\n );\n\n const requiredFieldsValid = useMemo(() => {\n if (!value.firstName?.trim()) return false;\n if (!value.lastName?.trim()) return false;\n if (!emailValid) return false;\n if (!phoneValid) return false;\n if (requireCodiceFiscale && cfStatus.state !== 'valid') return false;\n if (requireDateOfBirth && !value.dateOfBirth) return false;\n if (insuranceShown && insuranceStatus.state !== 'valid') return false;\n return true;\n }, [\n value.firstName,\n value.lastName,\n emailValid,\n phoneValid,\n requireCodiceFiscale,\n cfStatus.state,\n requireDateOfBirth,\n value.dateOfBirth,\n insuranceShown,\n insuranceStatus.state,\n ]);\n\n const consentsTicked = Boolean(value.privacyConsent && value.termsConsent);\n const channelsSatisfied = !pickerVisible || selectedChannels.length > 0;\n const canSubmit =\n requiredFieldsValid && consentsTicked && channelsSatisfied && !submitting;\n\n /* --------------------------- Submit ----------------------------- */\n\n const handleSubmit = (e: FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n // Surface every validation error on submit attempt.\n setTouched({\n firstName: true,\n lastName: true,\n email: true,\n mobilePhone: true,\n codiceFiscale: true,\n dateOfBirth: true,\n insuranceNumber: true,\n });\n if (!canSubmit) return;\n const payload: BookingDetails = {\n firstName: value.firstName!.trim(),\n lastName: value.lastName!.trim(),\n email: value.email!.trim(),\n mobilePhone: value.mobilePhone!,\n privacyConsent: true,\n termsConsent: true,\n codiceFiscale: value.codiceFiscale,\n dateOfBirth: value.dateOfBirth,\n insuranceNumber: value.insuranceNumber,\n note: value.note,\n returningPatient: value.returningPatient,\n // Only include when the picker was visible; otherwise the single\n // implicit channel is inferred backend-side from the practice\n // config.\n confirmationChannels: pickerVisible ? selectedChannels : undefined,\n };\n onSubmit(payload);\n };\n\n /* ---------------------- Consent label JSX ----------------------- */\n\n // Translated label with an embedded link to the policy URL. Uses\n // <Trans> so the link target is bound at render rather than baked\n // into the localised string.\n const renderConsentLabel = (\n i18nKey: string,\n url: string | undefined,\n ): ReactNode => {\n // Strip the link if the URL isn't http(s) — guards against\n // `javascript:` / `data:` URIs reaching the rendered `href`.\n const safeUrl = url && /^https?:\\/\\//i.test(url) ? url : undefined;\n if (!safeUrl) {\n return t(i18nKey);\n }\n return (\n <Trans\n i18nKey={i18nKey}\n components={{\n // The `<Trans>` runtime injects link text from the i18n\n // string. The anchor renders empty at static-analysis time,\n // so `jsx-a11y/anchor-has-content` would false-flag — silence\n // it; the runtime content is the localised policy / terms\n // label.\n policyLink: (\n // eslint-disable-next-line jsx-a11y/anchor-has-content\n <a\n href={safeUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"ds:underline ds:text-[var(--primary)]\"\n />\n ),\n }}\n />\n );\n };\n\n return (\n <form\n ref={ref}\n id={formId}\n noValidate\n onSubmit={handleSubmit}\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\"\n >\n {summarySlot}\n\n {/* Identity */}\n <div className=\"ds:grid ds:grid-cols-1 ds:gap-[var(--spacing-sm)] ds:sm:grid-cols-2\">\n <FormField\n label={t('booking.details.firstName.label')}\n required\n error={\n touched.firstName && !value.firstName?.trim()\n ? t('booking.details.firstName.required')\n : undefined\n }\n >\n <TextInput\n autoComplete=\"given-name\"\n value={value.firstName ?? ''}\n onChange={(e) => update({ firstName: e.target.value })}\n onBlur={() => markTouched('firstName')}\n />\n </FormField>\n <FormField\n label={t('booking.details.lastName.label')}\n required\n error={\n touched.lastName && !value.lastName?.trim()\n ? t('booking.details.lastName.required')\n : undefined\n }\n >\n <TextInput\n autoComplete=\"family-name\"\n value={value.lastName ?? ''}\n onChange={(e) => update({ lastName: e.target.value })}\n onBlur={() => markTouched('lastName')}\n />\n </FormField>\n </div>\n\n {/* Contact */}\n <div className=\"ds:grid ds:grid-cols-1 ds:gap-[var(--spacing-sm)] ds:sm:grid-cols-2\">\n <FormField\n label={t('booking.details.email.label')}\n required\n error={\n touched.email && !emailValid\n ? t('booking.details.email.invalid')\n : undefined\n }\n >\n <EmailInput\n value={value.email ?? ''}\n onChange={(e) => update({ email: e.target.value })}\n onBlur={() => markTouched('email')}\n />\n </FormField>\n <FormField\n label={t('booking.details.mobilePhone.label')}\n required\n error={\n touched.mobilePhone && !phoneValid\n ? t('booking.details.mobilePhone.invalid')\n : undefined\n }\n >\n <PhoneInput\n value={value.mobilePhone ?? ''}\n defaultCountry={\n defaultPhoneCountry?.toUpperCase() as\n | 'IT'\n | 'DE'\n | 'GB'\n | undefined\n }\n onChange={(e164) => {\n update({ mobilePhone: e164 });\n markTouched('mobilePhone');\n }}\n />\n </FormField>\n </div>\n\n {/* Optional identity fields */}\n {requireCodiceFiscale || requireDateOfBirth ? (\n <div className=\"ds:grid ds:grid-cols-1 ds:gap-[var(--spacing-sm)] ds:sm:grid-cols-2\">\n {requireCodiceFiscale ? (\n <FormField\n label={t('booking.details.codiceFiscale.label')}\n required\n description={\n cfStatus.state === 'pending'\n ? t('booking.details.codiceFiscale.checking')\n : t('booking.details.codiceFiscale.helper')\n }\n error={\n touched.codiceFiscale && cfStatus.state === 'invalid'\n ? (cfStatus.hint ??\n t('booking.details.codiceFiscale.invalid'))\n : undefined\n }\n >\n <TextInput\n value={value.codiceFiscale ?? ''}\n maxLength={16}\n onChange={(e) =>\n update({\n codiceFiscale: e.target.value.slice(0, 16).toUpperCase(),\n })\n }\n onBlur={() => markTouched('codiceFiscale')}\n />\n </FormField>\n ) : null}\n {requireDateOfBirth ? (\n <FormField\n label={t('booking.details.dateOfBirth.label')}\n required\n error={\n touched.dateOfBirth && !value.dateOfBirth\n ? t('booking.details.dateOfBirth.required')\n : undefined\n }\n >\n <DatePicker\n value={\n value.dateOfBirth ? new Date(value.dateOfBirth) : undefined\n }\n onChange={(next: Date | undefined) => {\n update({\n dateOfBirth: next\n ? next.toISOString().slice(0, 10)\n : undefined,\n });\n markTouched('dateOfBirth');\n }}\n />\n </FormField>\n ) : null}\n </div>\n ) : null}\n\n {insuranceShown ? (\n <FormField\n label={t('booking.details.insuranceNumber.label')}\n required\n description={\n insuranceStatus.state === 'pending'\n ? t('booking.details.insuranceNumber.checking')\n : undefined\n }\n error={\n touched.insuranceNumber && insuranceStatus.state === 'invalid'\n ? (insuranceStatus.hint ??\n t('booking.details.insuranceNumber.invalid'))\n : undefined\n }\n >\n <TextInput\n value={value.insuranceNumber ?? ''}\n onChange={(e) => update({ insuranceNumber: e.target.value })}\n onBlur={() => markTouched('insuranceNumber')}\n />\n </FormField>\n ) : null}\n\n {showNote ? (\n <FormField\n label={t('booking.details.note.label')}\n description={t('booking.details.note.helper', {\n max: NOTE_MAX_LENGTH,\n })}\n >\n <TextArea\n value={value.note ?? ''}\n maxLength={NOTE_MAX_LENGTH}\n rows={3}\n onChange={(e) => update({ note: e.target.value })}\n />\n </FormField>\n ) : null}\n\n {showReturningPatientFlag ? (\n <Checkbox\n checked={Boolean(value.returningPatient)}\n onCheckedChange={(checked) =>\n update({ returningPatient: checked === true })\n }\n label={t('booking.details.returningPatient.label')}\n />\n ) : null}\n\n {/* Consents — privacy + T&C. Both required for submit. */}\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n <Checkbox\n checked={Boolean(value.privacyConsent)}\n onCheckedChange={(checked) =>\n update({ privacyConsent: checked === true })\n }\n label={\n <>\n {renderConsentLabel(\n 'booking.details.consent.privacy.label',\n privacyPolicyUrl,\n )}\n <span\n aria-hidden=\"true\"\n className=\"ds:text-[var(--destructive)] ds:ms-[var(--spacing-2xs)]\"\n >\n *\n </span>\n </>\n }\n />\n <Checkbox\n checked={Boolean(value.termsConsent)}\n onCheckedChange={(checked) =>\n update({ termsConsent: checked === true })\n }\n label={\n <>\n {renderConsentLabel(\n 'booking.details.consent.terms.label',\n termsUrl,\n )}\n <span\n aria-hidden=\"true\"\n className=\"ds:text-[var(--destructive)] ds:ms-[var(--spacing-2xs)]\"\n >\n *\n </span>\n </>\n }\n />\n </div>\n\n {pickerVisible ? (\n <div\n data-component=\"booking-confirmation-channels\"\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\"\n >\n <CheckboxGroup\n label={t('booking.confirmation.heading')}\n helperText={t('booking.confirmation.helper')}\n value={selectedChannels}\n onChange={(next) =>\n update({\n confirmationChannels: next as ConfirmationChannel[],\n })\n }\n orientation=\"vertical\"\n options={resolvedEnabledChannels.map((c) => ({\n value: c,\n label: t(`booking.confirmation.channel.${c}`),\n }))}\n error={\n noChannelsSelected\n ? t('booking.confirmation.atLeastOne')\n : undefined\n }\n />\n </div>\n ) : null}\n\n {submitError ? (\n <Alert variant=\"error\">\n <Alert.Description>{submitError}</Alert.Description>\n </Alert>\n ) : null}\n\n <Button\n intent=\"primary\"\n size=\"md\"\n type=\"submit\"\n disabled={!canSubmit}\n startIcon={submitting ? <Spinner size=\"sm\" /> : undefined}\n >\n {t('booking.details.submit')}\n </Button>\n </form>\n );\n },\n);\n\nBookingDetailsForm.displayName = 'BookingDetailsForm';\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type KeyboardEvent,\n type ReactNode,\n} from 'react';\nimport { cva } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport {\n Activity,\n Baby,\n Bone,\n Brain,\n CalendarRange,\n ChevronLeft,\n ChevronRight,\n ClipboardCheck,\n Ear,\n Eye,\n HeartPulse,\n Microscope,\n Moon,\n Pill,\n ScanLine,\n Scissors,\n Smile,\n Sparkles,\n Stethoscope,\n Sun,\n Sunset,\n Syringe,\n type LucideIcon,\n} from 'lucide-react';\nimport {\n addDays,\n addMonths,\n endOfMonth,\n format as fnsFormat,\n isAfter,\n isBefore,\n isSameDay,\n isSameMonth,\n parseISO,\n startOfDay,\n startOfMonth,\n subDays,\n subMonths,\n} from 'date-fns';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { bookingAgent } from './booking.agent';\nimport {\n OPERATORS_ALL,\n applyAutoSelects,\n deriveCascade,\n resetOnDateChange,\n resetOnInsuranceChange,\n resetOnOperatorChange,\n resetOnOperatorIdsChange,\n resetOnServiceChange,\n resetOnServiceIdsChange,\n resetOnSlotChange,\n resetOnSpecialtyChange,\n resetOnSpecialtyIdsChange,\n resolveOperatorId,\n type CascadeOutputs,\n type CascadeStep,\n} from './cascade';\nimport { BookingDetailsForm } from './details-form';\nimport type {\n BookingDetails,\n BookingHandle,\n BookingOperator,\n BookingProps,\n BookingService,\n BookingSlot,\n BookingSpecialty,\n BookingValue,\n BookingVariant,\n InsuranceType,\n} from './booking-types';\nimport { Alert } from '../alert/alert';\nimport { Button } from '../button/button';\nimport { IconButton } from '../button/icon-button';\nimport { Select, type SelectOption } from '../select/select';\nimport { Combobox } from '../combobox/combobox';\nimport { MultiSelect } from '../multi-select/multi-select';\nimport type { OptionShape } from '../_shared/option';\nimport { Skeleton } from '../skeleton/skeleton';\nimport { EmptyState } from '../empty-state/empty-state';\nimport { StepperAccordion } from '../stepper-accordion/stepper-accordion';\nimport { StepperProgress } from '../stepper-progress/stepper-progress';\nimport {\n SlotGrid,\n type SlotGridDay,\n type SlotGridSlot,\n} from '../slot-grid/slot-grid';\n\n/* -------------------------------------------------------------------- */\n/* Re-exports */\n/* */\n/* Public types live in `booking-types.ts` so the cascade engine can */\n/* import them without a circular dep. Re-exported here so consumers */\n/* keep importing from `@alfadocs/ui-kit/booking`. */\n/* -------------------------------------------------------------------- */\n\nexport type {\n BookingDetails,\n BookingHandle,\n BookingOperator,\n BookingProps,\n BookingService,\n BookingSlot,\n BookingSpecialty,\n BookingSubmitPayload,\n BookingValidationResult,\n BookingValidator,\n BookingValue,\n BookingVariant,\n ConfirmationChannel,\n InsuranceType,\n} from './booking-types';\nexport { CONFIRMATION_CHANNEL_ORDER } from './booking-types';\nexport { OPERATORS_ALL } from './cascade';\n\n/* -------------------------------------------------------------------- */\n/* Root variant CVA */\n/* -------------------------------------------------------------------- */\n\nconst rootVariants = cva(\n 'ds:flex ds:w-full ds:flex-col ds:text-[var(--foreground)]',\n {\n variants: {\n variant: {\n 'inline-list': 'ds:gap-[var(--spacing-md)]',\n accordion: 'ds:gap-[var(--spacing-md)]',\n calendar: 'ds:gap-[var(--spacing-md)]',\n flexible: 'ds:gap-[var(--spacing-lg)]',\n progress: 'ds:gap-[var(--spacing-sm)]',\n },\n // `surface=\"elevated\"` matches `Card variant=\"elevated\"` — same\n // tokens, same padding, same boundary behaviour — so consumers can\n // drop their own Card wraps without a double-card look. Default\n // `'flat'` preserves 0.30.x rendering.\n surface: {\n flat: '',\n elevated: [\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:shadow-[var(--shadow-card)]',\n 'ds:p-[var(--spacing-md)]',\n ].join(' '),\n },\n },\n defaultVariants: { variant: 'inline-list', surface: 'flat' },\n },\n);\n\n/* -------------------------------------------------------------------- */\n/* Icon inference (kept from 0.25.x — services don't carry an explicit */\n/* icon prop, so we fall back to a keyword-matched Lucide icon). */\n/* -------------------------------------------------------------------- */\n\ntype IconRule = readonly [RegExp, LucideIcon];\n\nconst SERVICE_ICON_RULES: readonly IconRule[] = [\n [\n /\\b(estetic|aesthetic|botox|filler|mesoterap|chirurgia\\s*plastic)/i,\n Syringe,\n ],\n [/\\b(cardio|ecg|elettrocardio|ecocardio|cuore|heart)/i, HeartPulse],\n [/\\b(dent|odonto|tooth|teeth|pulizia|igien|smile)/i, Smile],\n [/\\b(oftalmo|ocul|ophthal|vision|occhi|eye)/i, Eye],\n [/\\b(otorin|udito|orecchi|hearing|ear)/i, Ear],\n [/\\b(neuro|brain|cervello)/i, Brain],\n [/\\b(pediatr|child|bambin)/i, Baby],\n [/\\b(ortop|ortho|osteo|skeleton|ossa|bone)/i, Bone],\n [/\\b(lab|analis|test|sang|esami)/i, Microscope],\n [/\\b(farmaco|pharm|pillol|refill)/i, Pill],\n [/\\b(chirurg|surg|intervent|operat)/i, Scissors],\n [/\\b(scan|rx|x-?ray|raggi|imag|radio|risonan|ecograf|ultras)/i, ScanLine],\n [/\\b(vacc|inject|inie|punto)/i, Syringe],\n [/\\b(derma|skin|pelle)/i, Sparkles],\n [/\\b(prima\\s*visit|first\\s*visit|consult|consulto|valutaz)/i, ClipboardCheck],\n [/\\b(general|medicin|family|control|check[-\\s]?up)/i, Activity],\n];\n\nfunction pickIcon(text: string): LucideIcon | null {\n for (const [pattern, Icon] of SERVICE_ICON_RULES) {\n if (pattern.test(text)) return Icon;\n }\n return null;\n}\n\nfunction inferServiceIcon(service: BookingService): ReactNode {\n const Icon = pickIcon(service.label) ?? Stethoscope;\n return <Icon aria-hidden=\"true\" className=\"ds:size-5\" />;\n}\n\n/* -------------------------------------------------------------------- */\n/* Shared helpers */\n/* -------------------------------------------------------------------- */\n\nfunction isoOf(date: Date): string {\n return fnsFormat(date, 'yyyy-MM-dd');\n}\n\n/* -------------------------------------------------------------------- */\n/* MonthGrid — inline 6×7 calendar with roving tabindex */\n/* -------------------------------------------------------------------- */\n\ninterface MonthGridProps {\n availableDates: string[];\n selectedDate?: string;\n onSelectDate: (iso: string) => void;\n locale: string;\n loading?: boolean;\n}\n\nconst monthCellBase = [\n 'ds:relative ds:flex ds:items-center ds:justify-center',\n 'ds:min-h-[var(--min-target-size)] ds:min-w-[var(--min-target-size)]',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:text-[length:var(--font-size-sm)]',\n 'ds:transition-colors ds:duration-[var(--animation-duration)]',\n '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-[var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n].join(' ');\n\nconst monthCellVariants = cva(monthCellBase, {\n variants: {\n state: {\n available:\n 'ds:cursor-pointer ds:text-[var(--foreground)] ds:hover:bg-[var(--muted)]/30',\n unavailable: 'ds:cursor-not-allowed ds:text-[var(--muted-foreground)]/60',\n selected:\n 'ds:bg-[var(--primary)] ds:text-[var(--primary-foreground)] ds:font-[var(--font-weight-semibold)]',\n outside: 'ds:text-[var(--muted-foreground)]/40',\n },\n },\n defaultVariants: { state: 'unavailable' },\n});\n\nfunction MonthGrid({\n availableDates,\n selectedDate,\n onSelectDate,\n locale,\n loading,\n}: MonthGridProps) {\n const { t } = useTranslation();\n\n const initialMonth = useMemo<Date>(() => {\n if (selectedDate) return startOfMonth(parseISO(selectedDate));\n if (availableDates.length > 0) {\n return startOfMonth(parseISO(availableDates[0]));\n }\n return startOfMonth(new Date());\n }, [selectedDate, availableDates]);\n\n const [viewMonth, setViewMonth] = useState<Date>(initialMonth);\n const [focusDate, setFocusDate] = useState<Date | null>(null);\n\n const cells = useMemo(() => {\n const monthStart = startOfMonth(viewMonth);\n const monthEnd = endOfMonth(viewMonth);\n const startWeekday = monthStart.getDay();\n const totalDays = monthEnd.getDate();\n const grid: Date[] = [];\n for (let i = startWeekday; i > 0; i -= 1) {\n const d = new Date(monthStart);\n d.setDate(monthStart.getDate() - i);\n grid.push(d);\n }\n for (let i = 0; i < totalDays; i += 1) {\n const d = new Date(monthStart);\n d.setDate(monthStart.getDate() + i);\n grid.push(d);\n }\n while (grid.length < 42) {\n const last = grid[grid.length - 1];\n const d = new Date(last);\n d.setDate(last.getDate() + 1);\n grid.push(d);\n }\n return grid;\n }, [viewMonth]);\n\n const monthLabel = useMemo(() => {\n try {\n return new Intl.DateTimeFormat(locale, {\n month: 'long',\n year: 'numeric',\n }).format(viewMonth);\n } catch {\n return fnsFormat(viewMonth, 'MMMM yyyy');\n }\n }, [viewMonth, locale]);\n\n const weekdayLabels = useMemo(() => {\n const base = new Date(2024, 0, 7);\n return Array.from({ length: 7 }, (_, i) => {\n const d = new Date(base);\n d.setDate(base.getDate() + i);\n try {\n return new Intl.DateTimeFormat(locale, { weekday: 'short' }).format(d);\n } catch {\n return fnsFormat(d, 'EEE');\n }\n });\n }, [locale]);\n\n const availableSet = useMemo(() => new Set(availableDates), [availableDates]);\n const isAvailable = useCallback(\n (date: Date) => availableSet.has(isoOf(date)),\n [availableSet],\n );\n\n const rovingDate = useMemo<Date | null>(() => {\n if (focusDate) return focusDate;\n if (selectedDate) return parseISO(selectedDate);\n const firstAvailable = cells.find(\n (d) => isSameMonth(d, viewMonth) && isAvailable(d),\n );\n if (firstAvailable) return firstAvailable;\n return cells.find((d) => isSameMonth(d, viewMonth)) ?? null;\n }, [focusDate, selectedDate, cells, viewMonth, isAvailable]);\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLButtonElement>, current: Date) => {\n let next: Date | null = null;\n switch (event.key) {\n case 'ArrowLeft':\n next = new Date(current);\n next.setDate(current.getDate() - 1);\n break;\n case 'ArrowRight':\n next = new Date(current);\n next.setDate(current.getDate() + 1);\n break;\n case 'ArrowUp':\n next = new Date(current);\n next.setDate(current.getDate() - 7);\n break;\n case 'ArrowDown':\n next = new Date(current);\n next.setDate(current.getDate() + 7);\n break;\n case 'Home':\n next = new Date(current);\n next.setDate(current.getDate() - current.getDay());\n break;\n case 'End':\n next = new Date(current);\n next.setDate(current.getDate() + (6 - current.getDay()));\n break;\n case 'Enter':\n case ' ': {\n event.preventDefault();\n if (isAvailable(current)) onSelectDate(isoOf(current));\n return;\n }\n default:\n return;\n }\n if (!next) return;\n event.preventDefault();\n if (!isSameMonth(next, viewMonth)) {\n setViewMonth(startOfMonth(next));\n }\n setFocusDate(next);\n },\n [isAvailable, onSelectDate, viewMonth],\n );\n\n if (loading) {\n return (\n <div\n role=\"status\"\n aria-live=\"polite\"\n aria-label={t('common.loading')}\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\"\n >\n <Skeleton variant=\"text\" width=\"40%\" />\n <div className=\"ds:grid ds:grid-cols-7 ds:gap-[var(--spacing-2xs)]\">\n {Array.from({ length: 42 }, (_, i) => (\n <Skeleton key={`mg-skel-${i}`} variant=\"rounded\" height=\"2.5rem\" />\n ))}\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n <div className=\"ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)]\">\n <IconButton\n icon={<ChevronLeft />}\n aria-label={t('booking.previousMonth')}\n size=\"sm\"\n intent=\"ghost\"\n flipIconInRtl\n onClick={() => {\n setViewMonth((m) => subMonths(m, 1));\n setFocusDate(null);\n }}\n />\n <span\n className=\"type-label ds:font-[var(--font-weight-semibold)] ds:text-[var(--foreground)]\"\n aria-live=\"polite\"\n >\n {monthLabel}\n </span>\n <IconButton\n icon={<ChevronRight />}\n aria-label={t('booking.nextMonth')}\n size=\"sm\"\n intent=\"ghost\"\n flipIconInRtl\n onClick={() => {\n setViewMonth((m) => addMonths(m, 1));\n setFocusDate(null);\n }}\n />\n </div>\n <div\n role=\"grid\"\n aria-label={t('booking.monthGridLabel')}\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)]\"\n >\n <div\n role=\"row\"\n className=\"ds:grid ds:grid-cols-7 ds:gap-[var(--spacing-2xs)]\"\n >\n {weekdayLabels.map((label, i) => (\n <div\n key={`wd-${i}`}\n role=\"columnheader\"\n className=\"type-meta ds:text-center ds:text-[var(--muted-foreground)] ds:font-[var(--font-weight-medium)]\"\n >\n {label}\n </div>\n ))}\n </div>\n {Array.from({ length: 6 }, (_, rowIndex) => (\n <div\n key={`mg-row-${rowIndex}`}\n role=\"row\"\n className=\"ds:grid ds:grid-cols-7 ds:gap-[var(--spacing-2xs)]\"\n >\n {cells\n .slice(rowIndex * 7, rowIndex * 7 + 7)\n .map((date, colIndex) => {\n const i = rowIndex * 7 + colIndex;\n const inMonth = isSameMonth(date, viewMonth);\n const available = inMonth && isAvailable(date);\n const isSelected = selectedDate\n ? isSameDay(date, parseISO(selectedDate))\n : false;\n const state:\n | 'available'\n | 'unavailable'\n | 'selected'\n | 'outside' = !inMonth\n ? 'outside'\n : isSelected\n ? 'selected'\n : available\n ? 'available'\n : 'unavailable';\n const isRoving = rovingDate\n ? isSameDay(rovingDate, date)\n : false;\n const dayLabel = (() => {\n try {\n return new Intl.DateTimeFormat(locale, {\n dateStyle: 'full',\n }).format(date);\n } catch {\n return fnsFormat(date, 'PPP');\n }\n })();\n return (\n <button\n key={`mg-cell-${i}`}\n type=\"button\"\n role=\"gridcell\"\n aria-label={dayLabel}\n aria-selected={isSelected || undefined}\n aria-disabled={!available || undefined}\n tabIndex={isRoving ? 0 : -1}\n disabled={!available}\n onClick={() => {\n if (available) onSelectDate(isoOf(date));\n }}\n onKeyDown={(e) => handleKeyDown(e, date)}\n className={monthCellVariants({ state })}\n >\n <span aria-hidden=\"true\">{date.getDate()}</span>\n </button>\n );\n })}\n </div>\n ))}\n </div>\n </div>\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* ServiceCardGroup — hand-rolled radiogroup for service selection. */\n/* */\n/* Used by the `inline-list` variant where services render as full-row */\n/* cards with the inferred icon. Other variants use a Select dropdown */\n/* via `ServiceStep` below. */\n/* -------------------------------------------------------------------- */\n\nconst serviceCardVariants = cva(\n [\n 'ds:relative ds:flex ds:w-full ds:items-center ds:gap-[var(--spacing-md)]',\n 'ds:min-h-[var(--min-target-size)]',\n 'ds:rounded-[var(--radius-md)]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-sm)]',\n 'ds:text-start',\n 'ds:transition-[background-color,box-shadow]',\n 'ds:duration-[var(--animation-duration)]',\n '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-[var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:[outline:1px_solid_CanvasText]',\n 'ds:cursor-pointer',\n ].join(' '),\n {\n variants: {\n state: {\n idle: 'ds:bg-[var(--card)] ds:shadow-[var(--shadow-sm)] ds:hover:shadow-[var(--shadow-md)]',\n selected:\n 'ds:bg-[color-mix(in_srgb,var(--primary)_8%,var(--card))] ds:shadow-[var(--shadow-sm)]',\n },\n },\n defaultVariants: { state: 'idle' },\n },\n);\n\ninterface ServiceCardGroupProps {\n services: BookingService[];\n selectedServiceId?: string;\n onSelect: (id: string) => void;\n}\n\nfunction ServiceCardGroup({\n services,\n selectedServiceId,\n onSelect,\n}: ServiceCardGroupProps) {\n const { t } = useTranslation();\n const groupId = useId();\n\n const [focusIndex, setFocusIndex] = useState<number>(() => {\n if (selectedServiceId) {\n const i = services.findIndex((s) => s.id === selectedServiceId);\n if (i >= 0) return i;\n }\n return 0;\n });\n\n const cardRefs = useRef<Map<number, HTMLButtonElement>>(new Map());\n const focusAt = useCallback((index: number) => {\n cardRefs.current.get(index)?.focus();\n }, []);\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLButtonElement>, index: number, id: string) => {\n const total = services.length;\n if (total === 0) return;\n switch (event.key) {\n case 'ArrowDown':\n case 'ArrowRight': {\n event.preventDefault();\n const next = (index + 1) % total;\n setFocusIndex(next);\n focusAt(next);\n break;\n }\n case 'ArrowUp':\n case 'ArrowLeft': {\n event.preventDefault();\n const prev = (index - 1 + total) % total;\n setFocusIndex(prev);\n focusAt(prev);\n break;\n }\n case 'Home': {\n event.preventDefault();\n setFocusIndex(0);\n focusAt(0);\n break;\n }\n case 'End': {\n event.preventDefault();\n const last = total - 1;\n setFocusIndex(last);\n focusAt(last);\n break;\n }\n case 'Enter':\n case ' ': {\n event.preventDefault();\n onSelect(id);\n break;\n }\n default:\n break;\n }\n },\n [services.length, focusAt, onSelect],\n );\n\n if (services.length === 0) {\n return null;\n }\n\n return (\n <div\n role=\"radiogroup\"\n aria-label={t('booking.serviceListLabel')}\n id={groupId}\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\"\n >\n {services.map((service, index) => {\n const isSelected = selectedServiceId === service.id;\n const isFocused = focusIndex === index;\n const ariaLabel = t('booking.serviceCardLabel', {\n label: service.label,\n duration: service.durationMin,\n });\n const iconNode = inferServiceIcon(service);\n return (\n <button\n key={service.id}\n ref={(node) => {\n if (node) cardRefs.current.set(index, node);\n else cardRefs.current.delete(index);\n }}\n type=\"button\"\n role=\"radio\"\n aria-checked={isSelected}\n aria-label={ariaLabel}\n tabIndex={isFocused ? 0 : -1}\n onClick={() => onSelect(service.id)}\n onFocus={() => setFocusIndex(index)}\n onKeyDown={(e) => handleKeyDown(e, index, service.id)}\n className={serviceCardVariants({\n state: isSelected ? 'selected' : 'idle',\n })}\n >\n <span\n aria-hidden=\"true\"\n className=\"ds:flex ds:size-10 ds:shrink-0 ds:items-center ds:justify-center ds:rounded-[var(--radius-sm)] ds:bg-[var(--primary)]/10 ds:text-[var(--primary)]\"\n >\n {iconNode}\n </span>\n <span className=\"ds:flex ds:min-w-0 ds:flex-1 ds:flex-col ds:gap-[var(--spacing-2xs)]\">\n <span className=\"type-label ds:font-[var(--font-weight-semibold)] ds:text-[var(--foreground)]\">\n {service.label}\n </span>\n <span className=\"type-meta ds:text-[var(--muted-foreground)]\">\n {t('booking.serviceSummary', { minutes: service.durationMin })}\n </span>\n </span>\n </button>\n );\n })}\n </div>\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* GroupedTimeSlots — calendar variant's morning/afternoon/evening slots */\n/* -------------------------------------------------------------------- */\n\nconst slotChipVariants = cva(\n [\n 'ds:inline-flex ds:items-center ds:justify-center ds:gap-[var(--spacing-2xs)]',\n 'ds:min-h-[var(--min-target-size)]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:pt-[var(--spacing-2xs)] ds:pb-[var(--spacing-2xs)]',\n 'ds:rounded-[var(--radius-md)]',\n 'ds:text-[length:var(--font-size-sm)] ds:font-[var(--font-weight-medium)]',\n 'ds:transition-[background-color,color,box-shadow] ds:duration-[var(--animation-duration)]',\n '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:disabled:cursor-not-allowed ds:disabled:opacity-50',\n 'ds:forced-colors:[border:1px_solid_ButtonText] ds:forced-colors:text-[ButtonText]',\n ].join(' '),\n {\n variants: {\n state: {\n idle: 'ds:bg-[color:var(--card)] ds:text-[color:var(--foreground)] ds:shadow-[var(--shadow-sm)] ds:hover:enabled:bg-[color:var(--muted)]/40 ds:hover:enabled:shadow-[var(--shadow-md)]',\n selected:\n 'ds:bg-[color:var(--primary)] ds:text-[color:var(--primary-foreground)] ds:shadow-[var(--shadow-sm)]',\n unavailable:\n 'ds:[outline:1px_dashed_color:var(--border)] ds:[outline-offset:-1px] ds:bg-transparent ds:text-[color:var(--muted-foreground)]',\n },\n },\n defaultVariants: { state: 'idle' },\n },\n);\n\ntype TimeOfDay = 'morning' | 'afternoon' | 'evening';\n\nfunction bucketForTime(time: string): TimeOfDay {\n const [hh] = time.split(':').map((s) => parseInt(s, 10));\n const hour = Number.isFinite(hh) ? hh : 0;\n if (hour < 12) return 'morning';\n if (hour < 17) return 'afternoon';\n return 'evening';\n}\n\nconst BUCKET_ICONS: Record<TimeOfDay, LucideIcon> = {\n morning: Sun,\n afternoon: Sunset,\n evening: Moon,\n};\n\ninterface GroupedTimeSlotsProps {\n date: string;\n slots: BookingSlot[];\n selectedSlotKey?: string;\n onSelect: (slot: BookingSlot) => void;\n loading?: boolean;\n locale: string;\n}\n\nfunction GroupedTimeSlots({\n date,\n slots,\n selectedSlotKey,\n onSelect,\n loading,\n locale,\n}: GroupedTimeSlotsProps) {\n const { t } = useTranslation();\n\n const dateLabel = useMemo(() => {\n try {\n return new Intl.DateTimeFormat(locale, {\n weekday: 'long',\n day: 'numeric',\n month: 'long',\n }).format(parseISO(date));\n } catch {\n return date;\n }\n }, [date, locale]);\n\n const groups = useMemo(() => {\n const result: Record<TimeOfDay, BookingSlot[]> = {\n morning: [],\n afternoon: [],\n evening: [],\n };\n for (const slot of slots) {\n result[bucketForTime(slot.time)].push(slot);\n }\n return result;\n }, [slots]);\n\n const availableCount = slots.filter((s) => s.available).length;\n const order: TimeOfDay[] = ['morning', 'afternoon', 'evening'];\n\n if (loading) {\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n <Skeleton variant=\"text\" width=\"60%\" />\n {[0, 1].map((row) => (\n <div\n key={row}\n className=\"ds:grid ds:grid-cols-3 ds:gap-[var(--spacing-xs)]\"\n >\n {[0, 1, 2].map((c) => (\n <Skeleton key={c} variant=\"rounded\" height=\"44px\" />\n ))}\n </div>\n ))}\n </div>\n );\n }\n\n if (availableCount === 0) {\n return (\n <EmptyState variant=\"no-results\" title={t('booking.noSlotsForDate')} />\n );\n }\n\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\">\n <div className=\"ds:flex ds:items-baseline ds:justify-between ds:gap-[var(--spacing-sm)]\">\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-xs)]\">\n <CalendarRange\n aria-hidden=\"true\"\n className=\"ds:size-4 ds:text-[color:var(--accent)]\"\n />\n <h3 className=\"type-label ds:font-[var(--font-weight-semibold)] ds:text-[var(--foreground)] ds:m-0\">\n {dateLabel}\n </h3>\n </div>\n <span className=\"type-meta ds:text-[var(--muted-foreground)]\">\n {t('booking.slotsAvailable', { count: availableCount })}\n </span>\n </div>\n {order.map((bucket) => {\n const items = groups[bucket];\n if (items.length === 0) return null;\n const Icon = BUCKET_ICONS[bucket];\n return (\n <div\n key={bucket}\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\"\n >\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-xs)] ds:text-[color:var(--muted-foreground)]\">\n <Icon aria-hidden=\"true\" className=\"ds:size-3.5\" />\n <span className=\"type-meta ds:font-[var(--font-weight-semibold)] ds:uppercase\">\n {t(`booking.timeOfDay.${bucket}`)}\n </span>\n </div>\n <div\n role=\"group\"\n aria-label={t(`booking.timeOfDay.${bucket}`)}\n className=\"ds:grid ds:grid-cols-3 ds:gap-[var(--spacing-xs)] ds:sm:grid-cols-4\"\n >\n {items.map((slot) => {\n const isSelected = slot.key === selectedSlotKey;\n const state = !slot.available\n ? 'unavailable'\n : isSelected\n ? 'selected'\n : 'idle';\n return (\n <button\n key={slot.key}\n type=\"button\"\n data-slot-id={slot.key}\n disabled={!slot.available}\n aria-pressed={isSelected}\n aria-label={t('booking.slotAvailableLabel', {\n time: slot.time,\n })}\n onClick={() => slot.available && onSelect(slot)}\n className={slotChipVariants({ state })}\n >\n {slot.time}\n </button>\n );\n })}\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* FourDayPicker — adapter for `datePickerStyle='four-day-grid'` */\n/* */\n/* Thin wrapper around the kit's `<SlotGrid>` primitive that translates */\n/* Booking's data shape (`availableDates`, `availableSlots`, `value`) */\n/* into the SlotGrid `days` array, and back from SlotGrid's `onSlotSelect`*/\n/* into Booking's atomic date+slot onChange. Window of 4 days, ±4-day */\n/* arrow navigation, \"Show more\" expander at 6 slots (matches prod). */\n/* */\n/* Slot selection sets `value.date` and `value.slotKey` atomically (one */\n/* onChange call composing resetOnDateChange + resetOnSlotChange). That */\n/* matches the prod UX where a user clicks a tile directly without a */\n/* separate date pick. `onDateSelect` fires alongside so consumers using */\n/* the two-query lazy-load pattern get the same signal as the month- */\n/* calendar picker. The cascade's separate \"slot\" step is suppressed */\n/* (see `renderSlotStep`) because the slots are inline with the strip. */\n/* -------------------------------------------------------------------- */\n\nconst FOUR_DAY_WINDOW_SIZE = 4;\n\ninterface FourDayPickerProps {\n availableDates: string[];\n availableSlots: Record<string, BookingSlot[]>;\n value: BookingValue;\n onChange: (next: BookingValue) => void;\n onDateSelect?: (iso: string) => void;\n onWindowChange?: (startIso: string, endIso: string) => void;\n loadingDates?: boolean;\n loadingSlots?: boolean;\n locale: string;\n}\n\nfunction FourDayPicker({\n availableDates,\n availableSlots,\n value,\n onChange,\n onDateSelect,\n onWindowChange,\n loadingDates,\n loadingSlots,\n locale,\n}: FourDayPickerProps) {\n const today = useMemo(() => startOfDay(new Date()), []);\n\n // Initial window: snap to value.date if set and not in the past;\n // otherwise to the first availableDate when it's in the future;\n // otherwise today. Saves the user from manually advancing 4-day\n // chunks when availability is days or weeks out.\n const [windowStart, setWindowStart] = useState<Date>(() => {\n if (value.date) {\n const d = startOfDay(parseISO(value.date));\n if (!isAfter(today, d)) return d;\n }\n if (availableDates.length > 0) {\n const first = startOfDay(parseISO(availableDates[0]));\n if (isAfter(first, today)) return first;\n }\n return today;\n });\n\n const windowEnd = useMemo(\n () => addDays(windowStart, FOUR_DAY_WINDOW_SIZE - 1),\n [windowStart],\n );\n\n // Build the SlotGrid days array — one entry per visible calendar\n // day in the 4-day window. Columns without availability render as\n // empty columns (SlotGrid handles the \"no slots\" rendering itself).\n const days = useMemo<SlotGridDay[]>(() => {\n return Array.from({ length: FOUR_DAY_WINDOW_SIZE }, (_, i) => {\n const d = addDays(windowStart, i);\n const iso = isoOf(d);\n const bookingSlots = availableSlots[iso] ?? [];\n const slots: SlotGridSlot[] = bookingSlots.map((s) => ({\n id: s.key,\n // SlotGrid formats `start` as a time via Intl.DateTimeFormat —\n // compose a full ISO from the column's date + the slot's HH:mm\n // so the locale-formatter has a real timestamp to work with.\n start: `${iso}T${s.time}:00`,\n available: s.available,\n }));\n return { date: iso, slots };\n });\n }, [windowStart, availableSlots]);\n\n const hasPrevious = isAfter(windowStart, today);\n // 0.33.11: forward navigation is unconditional. With two-query\n // consumers, `availableDates` reflects only what's been fetched —\n // gating on it would lock the user out of exploring further\n // windows the consumer hasn't fetched yet. `onWindowChange` lets\n // the consumer lazy-load as the user advances; the \"no slots in\n // window\" state is handled by the next-available banner (fix 2).\n const hasNext = true;\n\n const handlePreviousDays = useCallback(() => {\n setWindowStart((prev) => {\n const next = subDays(prev, FOUR_DAY_WINDOW_SIZE);\n // Clamp at today so the strip never shows past dates.\n return isAfter(today, next) ? today : next;\n });\n }, [today]);\n\n const handleNextDays = useCallback(() => {\n setWindowStart((prev) => addDays(prev, FOUR_DAY_WINDOW_SIZE));\n }, []);\n\n // Fix 1 (0.33.11): re-sync windowStart when availableDates arrives.\n // Two-query consumers ship [] on first render and the real list\n // arrives a frame later — the useState initialiser has already\n // locked windowStart at today and the picker shows today..today+3\n // empty even when the summary returned dates starting day+7.\n //\n // Only snap when the current window has zero overlap with\n // availability AND the first available date is in the future. The\n // overlap check (any availableDate inside [windowStart..windowEnd])\n // preserves user navigation — once they've advanced past the first\n // available date to look further out, we don't yank them back.\n useEffect(() => {\n if (availableDates.length === 0) return;\n const firstAvailable = startOfDay(parseISO(availableDates[0]));\n if (!isAfter(firstAvailable, today)) return;\n const overlaps = availableDates.some((iso) => {\n const d = startOfDay(parseISO(iso));\n return !isAfter(d, windowEnd) && !isBefore(d, windowStart);\n });\n if (overlaps) return;\n setWindowStart(firstAvailable);\n // Intentionally omits windowStart / windowEnd / today — react\n // only to new availability lists. Re-snapping every time the\n // window moves would trap the user inside the first-available\n // 4-day chunk.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [availableDates]);\n\n // Fix 3 (0.33.11): notify two-query consumers whenever the\n // visible window starts or shifts so they can lazy-fetch\n // dailySlots/{date} for the now-visible dates. Fires on mount\n // with the resolved initial window, then on every prev/next\n // arrow click, the fix-1 auto-sync, and the fix-2 jump CTA.\n useEffect(() => {\n onWindowChange?.(isoOf(windowStart), isoOf(windowEnd));\n }, [windowStart, windowEnd, onWindowChange]);\n\n const handleSlotSelect = useCallback(\n (slot: SlotGridSlot, day: SlotGridDay) => {\n const dateIso = typeof day.date === 'string' ? day.date : isoOf(day.date);\n // Atomic: set date + slot in one onChange so cascade.gates.slot\n // observes both together. Without this the consumer would see\n // two renders (date set, then slotKey set) which can re-fire\n // analytics / loading effects unnecessarily.\n onChange({\n ...resetOnSlotChange(resetOnDateChange(value, dateIso), slot.id),\n });\n onDateSelect?.(dateIso);\n },\n [onChange, onDateSelect, value],\n );\n\n // SlotGrid has a single loading state — either flag triggers the\n // shimmer (granular per-header vs per-tile shimmer would require\n // a SlotGrid API extension; treating both as one loading state\n // already satisfies the 0.33.9 split for two-query consumers since\n // only one of the two flags is set at a time in that pattern).\n const state: 'default' | 'loading' =\n loadingDates || loadingSlots ? 'loading' : 'default';\n\n // Fix 2 (0.33.11): \"Next available\" banner above the SlotGrid\n // when the visible window has no slots but the consumer told us\n // availability exists somewhere. Covers two cases the original\n // picker had no recovery for: (a) the user hasn't yet reached\n // the first available date (window is BEFORE availability), and\n // (b) the user advanced past availability (window is AFTER all\n // known available dates). Both render the same banner pointing\n // back to `availableDates[0]` with a jump button.\n //\n // The SlotGrid itself stays mounted so the column headers remain\n // visible — the banner sits above as the recovery affordance.\n const visibleWindowHasSlots = days.some((d) => d.slots.length > 0);\n const firstAvailableIso = availableDates[0];\n const showJumpCta = !visibleWindowHasSlots && !!firstAvailableIso;\n\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n {showJumpCta ? (\n <NextAvailableCta\n nextAvailableDate={firstAvailableIso}\n onJump={() => setWindowStart(startOfDay(parseISO(firstAvailableIso)))}\n locale={locale}\n />\n ) : null}\n <SlotGrid\n days={days}\n state={state}\n selectedSlotId={value.slotKey}\n maxInitialSlotsPerDay={6}\n locale={locale}\n hasPrevious={hasPrevious}\n hasNext={hasNext}\n onSlotSelect={handleSlotSelect}\n onPreviousDays={handlePreviousDays}\n onNextDays={handleNextDays}\n />\n </div>\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* renderDateStep / renderSlotStep — variant-agnostic picker renderers */\n/* */\n/* Both InlineListBody and getStepNode (the cascade-variant body shared */\n/* renderer) call these helpers instead of inlining `<MonthGrid>` / */\n/* `<GroupedTimeSlots>`. Switches on `datePickerStyle`: */\n/* */\n/* - 'month-calendar' (default): MonthGrid for date, GroupedTimeSlots */\n/* for slot. Byte-identical to pre-0.33.10 behaviour. */\n/* - 'four-day-grid': FourDayPicker for date (slots embedded); */\n/* renderSlotStep returns null since slots are inline. */\n/* -------------------------------------------------------------------- */\n\ninterface DateStepRenderProps {\n inputs: VariantBodyProps['inputs'];\n value: BookingValue;\n onChange: (next: BookingValue) => void;\n onDateSelect?: (iso: string) => void;\n onWindowChange?: (startIso: string, endIso: string) => void;\n loadingDates?: boolean;\n loadingSlots?: boolean;\n locale: string;\n datePickerStyle: 'month-calendar' | 'four-day-grid';\n}\n\nfunction renderDateStep(props: DateStepRenderProps): ReactNode {\n const {\n inputs,\n value,\n onChange,\n onDateSelect,\n onWindowChange,\n loadingDates,\n loadingSlots,\n locale,\n datePickerStyle,\n } = props;\n if (datePickerStyle === 'four-day-grid') {\n return (\n <FourDayPicker\n availableDates={inputs.availableDates}\n availableSlots={inputs.availableSlots}\n value={value}\n onChange={onChange}\n onDateSelect={onDateSelect}\n onWindowChange={onWindowChange}\n loadingDates={loadingDates}\n loadingSlots={loadingSlots}\n locale={locale}\n />\n );\n }\n return (\n <MonthGrid\n availableDates={inputs.availableDates}\n selectedDate={value.date}\n onSelectDate={(iso) => {\n onChange(resetOnDateChange(value, iso));\n onDateSelect?.(iso);\n }}\n locale={locale}\n loading={loadingDates ?? loadingSlots}\n />\n );\n}\n\nfunction renderSlotStep(props: DateStepRenderProps): ReactNode {\n const { inputs, value, onChange, loadingSlots, locale, datePickerStyle } =\n props;\n // four-day-grid embeds the slot tiles inside the picker itself —\n // no separate slot block needed in the variant body.\n if (datePickerStyle === 'four-day-grid') return null;\n if (!value.date) return null;\n return (\n <GroupedTimeSlots\n date={value.date}\n slots={inputs.availableSlots[value.date] ?? []}\n selectedSlotKey={value.slotKey}\n onSelect={(slot) => onChange(resetOnSlotChange(value, slot.key))}\n loading={loadingSlots}\n locale={locale}\n />\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* Step subcomponents */\n/* */\n/* Each step is rendered by every variant that needs it. The variants */\n/* differ in layout (chip rail vs accordion vs vertical list) but the */\n/* step content itself is the same. */\n/* -------------------------------------------------------------------- */\n\ninterface InsuranceStepProps {\n value?: InsuranceType;\n onChange: (next: InsuranceType) => void;\n}\n\nfunction InsuranceStep({ value, onChange }: InsuranceStepProps) {\n const { t } = useTranslation();\n const options: SelectOption[] = [\n { value: 'private', label: t('booking.insurance.private') },\n { value: 'public', label: t('booking.insurance.public') },\n ];\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n <h3 className=\"type-label ds:font-[var(--font-weight-semibold)] ds:text-[var(--foreground)] ds:m-0\">\n {t('booking.insurance.heading')}\n </h3>\n <Select\n options={options}\n value={value ?? ''}\n onValueChange={(next) => {\n if (next === 'private' || next === 'public') onChange(next);\n }}\n placeholder={t('booking.insurance.placeholder')}\n aria-label={t('booking.insurance.heading')}\n />\n </div>\n );\n}\n\ninterface SpecialtyStepProps {\n specialties: BookingSpecialty[];\n value?: string;\n valueIds?: string[];\n onChange: (next: string) => void;\n onChangeIds?: (next: string[]) => void;\n pickerStyle?: 'select' | 'combobox' | 'multi-select';\n}\n\nfunction SpecialtyStep({\n specialties,\n value,\n valueIds,\n onChange,\n onChangeIds,\n pickerStyle = 'select',\n}: SpecialtyStepProps) {\n const { t } = useTranslation();\n const options: OptionShape[] = specialties.map((s) => ({\n value: s.id,\n label: s.label,\n }));\n const heading = (\n <h3 className=\"type-label ds:font-[var(--font-weight-semibold)] ds:text-[var(--foreground)] ds:m-0\">\n {t('booking.specialty.heading')}\n </h3>\n );\n if (pickerStyle === 'multi-select' && onChangeIds) {\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n {heading}\n <MultiSelect\n options={options}\n value={valueIds ?? []}\n onChange={onChangeIds}\n placeholder={t('booking.specialty.placeholder')}\n aria-label={t('booking.specialty.heading')}\n allowClear\n />\n </div>\n );\n }\n if (pickerStyle === 'combobox') {\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n {heading}\n <Combobox\n options={options}\n value={value ?? ''}\n onValueChange={(next) => onChange(next === '' ? '' : next)}\n placeholder={t('booking.specialty.placeholder')}\n aria-label={t('booking.specialty.heading')}\n clearable\n />\n </div>\n );\n }\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n {heading}\n <Select\n options={options as SelectOption[]}\n value={value ?? ''}\n onValueChange={(next) => onChange(next)}\n placeholder={t('booking.specialty.placeholder')}\n aria-label={t('booking.specialty.heading')}\n />\n </div>\n );\n}\n\ninterface ServiceStepProps {\n services: BookingService[];\n value?: string;\n valueIds?: string[];\n onChange: (next: string) => void;\n onChangeIds?: (next: string[]) => void;\n /**\n * 0.34.0: explicit picker style. When undefined, falls back to the\n * `compact` boolean (true → 'select', false → 'cards') so existing\n * variant-body code continues to work unchanged.\n */\n pickerStyle?: 'select' | 'combobox' | 'multi-select' | 'cards';\n /** @deprecated 0.34.0 — pass `pickerStyle='cards'` (default) or `'select'` instead. */\n compact?: boolean;\n}\n\nfunction ServiceStep({\n services,\n value,\n valueIds,\n onChange,\n onChangeIds,\n pickerStyle,\n compact,\n}: ServiceStepProps) {\n const { t } = useTranslation();\n const resolvedStyle = pickerStyle ?? (compact ? 'select' : 'cards');\n const options: OptionShape[] = services.map((s) => ({\n value: s.id,\n label: `${s.label} · ${t('booking.serviceSummary', {\n minutes: s.durationMin,\n })}`,\n }));\n const heading = (\n <h3 className=\"type-label ds:font-[var(--font-weight-semibold)] ds:text-[var(--foreground)] ds:m-0\">\n {t('booking.service.heading')}\n </h3>\n );\n if (resolvedStyle === 'multi-select' && onChangeIds) {\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n {heading}\n <MultiSelect\n options={options}\n value={valueIds ?? []}\n onChange={onChangeIds}\n placeholder={t('booking.service.placeholder')}\n aria-label={t('booking.service.heading')}\n allowClear\n />\n </div>\n );\n }\n if (resolvedStyle === 'combobox') {\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n {heading}\n <Combobox\n options={options}\n value={value ?? ''}\n onValueChange={(next) => onChange(next === '' ? '' : next)}\n placeholder={t('booking.service.placeholder')}\n aria-label={t('booking.service.heading')}\n clearable\n />\n </div>\n );\n }\n if (resolvedStyle === 'select') {\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n {heading}\n <Select\n options={options as SelectOption[]}\n value={value ?? ''}\n onValueChange={(next) => onChange(next)}\n placeholder={t('booking.service.placeholder')}\n aria-label={t('booking.service.heading')}\n />\n </div>\n );\n }\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n {heading}\n <ServiceCardGroup\n services={services}\n selectedServiceId={value}\n onSelect={onChange}\n />\n </div>\n );\n}\n\ninterface OperatorStepProps {\n operators: BookingOperator[];\n value?: string;\n valueIds?: string[];\n onChange: (next: string) => void;\n onChangeIds?: (next: string[]) => void;\n pickerStyle?: 'select' | 'combobox' | 'multi-select';\n}\n\nfunction OperatorStep({\n operators,\n value,\n valueIds,\n onChange,\n onChangeIds,\n pickerStyle = 'select',\n}: OperatorStepProps) {\n const { t } = useTranslation();\n const heading = (\n <h3 className=\"type-label ds:font-[var(--font-weight-semibold)] ds:text-[var(--foreground)] ds:m-0\">\n {t('booking.operator.heading')}\n </h3>\n );\n // Multi-select drops the \"all\" sentinel — selecting zero operators\n // (an empty array) already means \"no preference.\"\n if (pickerStyle === 'multi-select' && onChangeIds) {\n const options: OptionShape[] = operators.map((op) => ({\n value: op.id,\n label: op.name,\n }));\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n {heading}\n <MultiSelect\n options={options}\n value={valueIds ?? []}\n onChange={onChangeIds}\n placeholder={t('booking.operator.placeholder')}\n aria-label={t('booking.operator.heading')}\n allowClear\n />\n </div>\n );\n }\n // \"All operators\" is always the first option — matches the legacy\n // `OPERATORS_ALL` sentinel from the booking-website state hook.\n const options: OptionShape[] = [\n { value: OPERATORS_ALL, label: t('booking.operator.all') },\n ...operators.map((op) => ({ value: op.id, label: op.name })),\n ];\n if (pickerStyle === 'combobox') {\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n {heading}\n <Combobox\n options={options}\n value={value ?? OPERATORS_ALL}\n onValueChange={(next) => onChange(next === '' ? OPERATORS_ALL : next)}\n placeholder={t('booking.operator.placeholder')}\n aria-label={t('booking.operator.heading')}\n clearable\n />\n </div>\n );\n }\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n {heading}\n <Select\n options={options as SelectOption[]}\n value={value ?? OPERATORS_ALL}\n onValueChange={(next) => onChange(next)}\n placeholder={t('booking.operator.placeholder')}\n aria-label={t('booking.operator.heading')}\n />\n </div>\n );\n}\n\ninterface OnboardingIncompleteAlertProps {\n customSlot?: ReactNode;\n}\n\nfunction OnboardingIncompleteAlert({\n customSlot,\n}: OnboardingIncompleteAlertProps) {\n const { t } = useTranslation();\n if (customSlot) return <>{customSlot}</>;\n // Use Alert.Title with `as=\"h4\"` so the heading-order stays valid\n // inside the booking section (which has h2 panel + h3 step headers).\n // The default h5 would skip the h4 level and trip\n // `heading-order` in axe.\n return (\n <Alert variant=\"warning\">\n <Alert.Title as=\"h4\">\n {t('booking.onboardingIncomplete.title')}\n </Alert.Title>\n <Alert.Description>\n {t('booking.onboardingIncomplete.description')}\n </Alert.Description>\n </Alert>\n );\n}\n\ninterface NextAvailableCtaProps {\n nextAvailableDate: string;\n onJump: () => void;\n locale: string;\n}\n\nfunction NextAvailableCta({\n nextAvailableDate,\n onJump,\n locale,\n}: NextAvailableCtaProps) {\n const { t } = useTranslation();\n const formatted = useMemo(() => {\n try {\n return new Intl.DateTimeFormat(locale, { dateStyle: 'long' }).format(\n parseISO(nextAvailableDate),\n );\n } catch {\n return nextAvailableDate;\n }\n }, [nextAvailableDate, locale]);\n return (\n <Alert variant=\"info\">\n <Alert.Description>\n {t('booking.nextAvailable.description', { date: formatted })}\n </Alert.Description>\n <Alert.Action>\n <Button intent=\"secondary\" size=\"sm\" onClick={onJump}>\n {t('booking.nextAvailable.cta')}\n </Button>\n </Alert.Action>\n </Alert>\n );\n}\n\ninterface BookingSuccessProps {\n snapshot: {\n slot: BookingSlot;\n details: BookingDetails;\n insuranceType?: InsuranceType;\n operatorId?: string;\n specialtyId?: string;\n serviceId?: string;\n date?: string;\n };\n operators: BookingOperator[];\n specialties: BookingSpecialty[];\n services: BookingService[];\n locale: string;\n mode: 'live' | 'demo';\n showModify: boolean;\n onReset: () => void;\n onModify: () => void;\n}\n\nfunction BookingSuccess({\n snapshot,\n operators,\n specialties,\n services,\n locale,\n mode,\n showModify,\n onReset,\n onModify,\n}: BookingSuccessProps) {\n const { t } = useTranslation();\n const channels = snapshot.details.confirmationChannels ?? ['email'];\n\n const channelLabels = channels.map((c) =>\n t(`booking.confirmation.channel.${c}`),\n );\n // In demo mode, override the channel-aware description with the\n // honest \"this was a demo\" copy — consumers running in mock mode\n // (no real API call) shouldn't tell the patient an email was sent.\n const description =\n mode === 'demo'\n ? t('booking.success.descriptionDemo')\n : channelLabels.length > 1\n ? t('booking.success.descriptionMultiple', {\n channels: channelLabels.join(' · '),\n })\n : t('booking.success.descriptionSingle', { channel: channelLabels[0] });\n\n const formattedDate = useMemo(() => {\n if (!snapshot.date) return undefined;\n try {\n return new Intl.DateTimeFormat(locale, {\n weekday: 'long',\n day: 'numeric',\n month: 'long',\n }).format(parseISO(snapshot.date));\n } catch {\n return snapshot.date;\n }\n }, [snapshot.date, locale]);\n\n const operator = snapshot.operatorId\n ? operators.find((op) => op.id === snapshot.operatorId)\n : undefined;\n const specialty = snapshot.specialtyId\n ? specialties.find((s) => s.id === snapshot.specialtyId)\n : undefined;\n const service = snapshot.serviceId\n ? services.find((s) => s.id === snapshot.serviceId)\n : undefined;\n\n return (\n <div\n data-component=\"booking-success\"\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\"\n >\n <Alert variant=\"success\">\n <Alert.Title as=\"h3\">{t('booking.success.heading')}</Alert.Title>\n <Alert.Description>{description}</Alert.Description>\n </Alert>\n\n <div className=\"ds:rounded-[var(--radius-md)] ds:bg-[var(--secondary)] ds:p-[var(--spacing-md)]\">\n <dl className=\"ds:grid ds:grid-cols-[auto_minmax(0,1fr)] ds:gap-x-[var(--spacing-md)] ds:gap-y-[var(--spacing-xs)] ds:m-0\">\n {specialty ? (\n <>\n <dt className=\"type-label ds:text-[var(--muted-foreground)]\">\n {t('booking.success.summarySpecialty')}\n </dt>\n <dd className=\"type-body ds:m-0 ds:text-[var(--foreground)]\">\n {specialty.label}\n </dd>\n </>\n ) : null}\n {service ? (\n <>\n <dt className=\"type-label ds:text-[var(--muted-foreground)]\">\n {t('booking.success.summaryService')}\n </dt>\n <dd className=\"type-body ds:m-0 ds:text-[var(--foreground)]\">\n {service.label}\n </dd>\n </>\n ) : null}\n {formattedDate ? (\n <>\n <dt className=\"type-label ds:text-[var(--muted-foreground)]\">\n {t('booking.success.summaryDate')}\n </dt>\n <dd className=\"type-body ds:m-0 ds:text-[var(--foreground)]\">\n {formattedDate}\n </dd>\n </>\n ) : null}\n <dt className=\"type-label ds:text-[var(--muted-foreground)]\">\n {t('booking.success.summaryTime')}\n </dt>\n <dd className=\"type-body ds:m-0 ds:text-[var(--foreground)]\">\n {snapshot.slot.time}\n </dd>\n {operator ? (\n <>\n <dt className=\"type-label ds:text-[var(--muted-foreground)]\">\n {t('booking.success.summaryProvider')}\n </dt>\n <dd className=\"type-body ds:m-0 ds:text-[var(--foreground)]\">\n {operator.name}\n </dd>\n </>\n ) : null}\n </dl>\n </div>\n\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-sm)]\">\n <Button intent=\"secondary\" size=\"md\" onClick={onReset}>\n {t('booking.success.bookAnother')}\n </Button>\n {showModify ? (\n <Button intent=\"ghost\" size=\"md\" onClick={onModify}>\n {t('booking.success.modifyBooking')}\n </Button>\n ) : null}\n </div>\n </div>\n );\n}\n\ninterface EmptyServicesProps {\n customSlot?: ReactNode;\n}\n\nfunction EmptyServicesAlert({ customSlot }: EmptyServicesProps) {\n const { t } = useTranslation();\n if (customSlot) return <>{customSlot}</>;\n return (\n <EmptyState\n variant=\"no-results\"\n title={t('booking.emptyServices.title')}\n description={t('booking.emptyServices.description')}\n />\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* Variant body shared props */\n/* -------------------------------------------------------------------- */\n\ninterface VariantBodyProps {\n cascade: CascadeOutputs;\n inputs: {\n specialties: BookingSpecialty[];\n services: BookingService[];\n operators: BookingOperator[];\n availableDates: string[];\n availableSlots: Record<string, BookingSlot[]>;\n nextAvailableDate?: string;\n };\n value: BookingValue;\n onChange: (next: BookingValue) => void;\n onSubmit: (details: BookingDetails) => void | Promise<void>;\n policy: {\n country?: string;\n lockedOperatorId?: string;\n };\n detailsProps: Omit<\n React.ComponentProps<typeof BookingDetailsForm>,\n 'value' | 'onChange' | 'onSubmit' | 'summarySlot' | 'defaultPhoneCountry'\n >;\n emptyServicesSlot?: ReactNode;\n onboardingIncompleteSlot?: ReactNode;\n loadingDates?: boolean;\n loadingSlots?: boolean;\n onDateSelect?: (iso: string) => void;\n onWindowChange?: (startIso: string, endIso: string) => void;\n datePickerStyle: 'month-calendar' | 'four-day-grid';\n specialtyPickerStyle?: 'select' | 'combobox' | 'multi-select';\n servicePickerStyle?: 'select' | 'combobox' | 'multi-select' | 'cards';\n operatorPickerStyle?: 'select' | 'combobox' | 'multi-select';\n submitting?: boolean;\n locale: string;\n activeStep: CascadeStep;\n setActiveStep: (step: CascadeStep) => void;\n}\n\n/* -------------------------------------------------------------------- */\n/* InlineListBody */\n/* -------------------------------------------------------------------- */\n\nfunction InlineListBody(props: VariantBodyProps) {\n const {\n cascade,\n inputs,\n value,\n onChange,\n onSubmit,\n emptyServicesSlot,\n onboardingIncompleteSlot,\n loadingDates,\n loadingSlots,\n onDateSelect,\n onWindowChange,\n datePickerStyle,\n specialtyPickerStyle,\n servicePickerStyle,\n operatorPickerStyle,\n submitting,\n locale,\n detailsProps,\n } = props;\n const { t } = useTranslation();\n\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\">\n {cascade.gates.insurance ? (\n <InsuranceStep\n value={value.insuranceType}\n onChange={(next) => onChange(resetOnInsuranceChange(value, next))}\n />\n ) : null}\n\n {cascade.gates.specialty ? (\n <SpecialtyStep\n specialties={cascade.filtered.specialties}\n value={value.specialtyId}\n valueIds={value.specialtyIds}\n onChange={(next) => onChange(resetOnSpecialtyChange(value, next))}\n onChangeIds={(next) =>\n onChange(resetOnSpecialtyIdsChange(value, next))\n }\n pickerStyle={specialtyPickerStyle}\n />\n ) : null}\n\n {cascade.gates.service ? (\n cascade.filtered.services.length === 0 ? (\n <EmptyServicesAlert customSlot={emptyServicesSlot} />\n ) : (\n <ServiceStep\n services={cascade.filtered.services}\n value={value.serviceId}\n valueIds={value.serviceIds}\n onChange={(next) => onChange(resetOnServiceChange(value, next))}\n onChangeIds={(next) =>\n onChange(resetOnServiceIdsChange(value, next))\n }\n pickerStyle={servicePickerStyle}\n />\n )\n ) : null}\n\n {cascade.gates.onboardingIncomplete ? (\n <OnboardingIncompleteAlert customSlot={onboardingIncompleteSlot} />\n ) : null}\n\n {cascade.gates.operator ? (\n <OperatorStep\n operators={cascade.filtered.operators}\n value={value.operatorId}\n valueIds={value.operatorIds}\n onChange={(next) => onChange(resetOnOperatorChange(value, next))}\n onChangeIds={(next) =>\n onChange(resetOnOperatorIdsChange(value, next))\n }\n pickerStyle={operatorPickerStyle}\n />\n ) : null}\n\n {cascade.gates.date ? (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n <h3 className=\"type-label ds:font-[var(--font-weight-semibold)] ds:text-[var(--foreground)] ds:m-0\">\n {t('booking.date.heading')}\n </h3>\n {inputs.availableDates.length === 0 && inputs.nextAvailableDate ? (\n <NextAvailableCta\n nextAvailableDate={inputs.nextAvailableDate}\n onJump={() =>\n onChange(resetOnDateChange(value, inputs.nextAvailableDate))\n }\n locale={locale}\n />\n ) : (\n renderDateStep({\n inputs,\n value,\n onChange,\n onDateSelect,\n onWindowChange,\n loadingDates,\n loadingSlots,\n locale,\n datePickerStyle,\n })\n )}\n </div>\n ) : null}\n\n {cascade.gates.slot &&\n value.date &&\n datePickerStyle === 'month-calendar' ? (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n <h3 className=\"type-label ds:font-[var(--font-weight-semibold)] ds:text-[var(--foreground)] ds:m-0\">\n {t('booking.slot.heading')}\n </h3>\n {renderSlotStep({\n inputs,\n value,\n onChange,\n onDateSelect,\n onWindowChange,\n loadingDates,\n loadingSlots,\n locale,\n datePickerStyle,\n })}\n </div>\n ) : null}\n\n {cascade.gates.details && cascade.selectedSlot ? (\n <BookingDetailsForm\n {...detailsProps}\n value={value.details ?? {}}\n onChange={(next) => onChange({ ...value, details: next })}\n onSubmit={onSubmit}\n submitting={submitting}\n defaultPhoneCountry={props.policy.country}\n />\n ) : null}\n </div>\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* getStepNode — render a single cascade step's content. */\n/* */\n/* Shared by all variants so the cascade renders the same content; */\n/* variants just choose how to chrome / sequence it. */\n/* -------------------------------------------------------------------- */\n\ninterface GetStepNodeOptions {\n /** When true, ServiceStep renders as a compact Select (used by all\n * variants except inline-list, which gets the full ServiceCardGroup). */\n compactService?: boolean;\n}\n\nfunction getStepNode(\n step: CascadeStep,\n props: VariantBodyProps,\n options: GetStepNodeOptions = {},\n): ReactNode {\n const {\n cascade,\n inputs,\n value,\n onChange,\n onSubmit,\n emptyServicesSlot,\n onboardingIncompleteSlot,\n loadingDates,\n loadingSlots,\n onDateSelect,\n onWindowChange,\n datePickerStyle,\n specialtyPickerStyle,\n servicePickerStyle,\n operatorPickerStyle,\n submitting,\n locale,\n detailsProps,\n policy,\n } = props;\n\n switch (step) {\n case 1:\n return (\n <InsuranceStep\n value={value.insuranceType}\n onChange={(next) => onChange(resetOnInsuranceChange(value, next))}\n />\n );\n case 2:\n return (\n <SpecialtyStep\n specialties={cascade.filtered.specialties}\n value={value.specialtyId}\n valueIds={value.specialtyIds}\n onChange={(next) => onChange(resetOnSpecialtyChange(value, next))}\n onChangeIds={(next) =>\n onChange(resetOnSpecialtyIdsChange(value, next))\n }\n pickerStyle={specialtyPickerStyle}\n />\n );\n case 3:\n if (cascade.filtered.services.length === 0) {\n return <EmptyServicesAlert customSlot={emptyServicesSlot} />;\n }\n if (cascade.gates.onboardingIncomplete) {\n return (\n <OnboardingIncompleteAlert customSlot={onboardingIncompleteSlot} />\n );\n }\n return (\n <ServiceStep\n services={cascade.filtered.services}\n value={value.serviceId}\n valueIds={value.serviceIds}\n onChange={(next) => onChange(resetOnServiceChange(value, next))}\n onChangeIds={(next) => onChange(resetOnServiceIdsChange(value, next))}\n pickerStyle={servicePickerStyle}\n compact={options.compactService}\n />\n );\n case 4:\n return (\n <OperatorStep\n operators={cascade.filtered.operators}\n value={value.operatorId}\n valueIds={value.operatorIds}\n onChange={(next) => onChange(resetOnOperatorChange(value, next))}\n onChangeIds={(next) =>\n onChange(resetOnOperatorIdsChange(value, next))\n }\n pickerStyle={operatorPickerStyle}\n />\n );\n case 5:\n if (inputs.availableDates.length === 0 && inputs.nextAvailableDate) {\n return (\n <NextAvailableCta\n nextAvailableDate={inputs.nextAvailableDate}\n onJump={() =>\n onChange(resetOnDateChange(value, inputs.nextAvailableDate))\n }\n locale={locale}\n />\n );\n }\n return renderDateStep({\n inputs,\n value,\n onChange,\n onDateSelect,\n onWindowChange,\n loadingDates,\n loadingSlots,\n locale,\n datePickerStyle,\n });\n case 6:\n return renderSlotStep({\n inputs,\n value,\n onChange,\n onDateSelect,\n onWindowChange,\n loadingDates,\n loadingSlots,\n locale,\n datePickerStyle,\n });\n case 7:\n if (!cascade.selectedSlot) return null;\n return (\n <BookingDetailsForm\n {...detailsProps}\n value={value.details ?? {}}\n onChange={(next) => onChange({ ...value, details: next })}\n onSubmit={onSubmit}\n submitting={submitting}\n defaultPhoneCountry={policy.country}\n />\n );\n /* c8 ignore next 2 */\n default:\n return null;\n }\n}\n\n/* -------------------------------------------------------------------- */\n/* getStepLabel — i18n label per cascade step. */\n/* -------------------------------------------------------------------- */\n\nfunction useStepLabels(): Record<CascadeStep, string> {\n const { t } = useTranslation();\n return useMemo(\n () => ({\n 1: t('booking.insurance.heading'),\n 2: t('booking.specialty.heading'),\n 3: t('booking.service.heading'),\n 4: t('booking.operator.heading'),\n 5: t('booking.date.heading'),\n 6: t('booking.slot.heading'),\n 7: t('booking.details.heading'),\n }),\n [t],\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* AccordionBody — StepperAccordion-backed flow with per-step summaries. */\n/* -------------------------------------------------------------------- */\n\nfunction AccordionBody(props: VariantBodyProps) {\n const { cascade, value, activeStep, setActiveStep, datePickerStyle } = props;\n const labels = useStepLabels();\n\n // four-day-grid embeds slot tiles inside the date step's picker —\n // step 6 (slot) renders nothing of its own. Drop it from the\n // accordion ladder so the user doesn't see an empty \"Orario\"\n // panel that would just expand to whitespace.\n const visibleStepsForBody = useMemo(\n () =>\n datePickerStyle === 'four-day-grid'\n ? cascade.visibleSteps.filter((s) => s !== 6)\n : cascade.visibleSteps,\n [cascade.visibleSteps, datePickerStyle],\n );\n\n // Compose accordion specs from the visible cascade steps. Pull a\n // localised summary off `value` for completed steps so collapsed\n // panels still convey what was picked.\n const accordionSteps = useMemo(\n () =>\n visibleStepsForBody.map((stepNum) => ({\n label: labels[stepNum],\n summary: getStepSummary(stepNum, value, cascade),\n status:\n stepIsFulfilled(stepNum, value) && stepNum < cascade.currentStep\n ? ('completed' as const)\n : undefined,\n content: getStepNode(stepNum, props, { compactService: true }),\n })),\n [visibleStepsForBody, value, labels, cascade, props],\n );\n\n // The accordion uses a 0-indexed activeStep but our cascade steps are\n // 1-indexed; map to the position in visibleSteps.\n const activeIndex = Math.max(0, cascade.visibleSteps.indexOf(activeStep));\n\n return (\n <StepperAccordion\n activeStep={activeIndex}\n steps={accordionSteps}\n onStepChange={(idx) => {\n const next = cascade.visibleSteps[idx];\n if (next) setActiveStep(next);\n }}\n />\n );\n}\n\nfunction stepIsFulfilled(step: CascadeStep, value: BookingValue): boolean {\n switch (step) {\n case 1:\n return value.insuranceType !== undefined;\n case 2:\n return value.specialtyId !== undefined;\n case 3:\n return value.serviceId !== undefined;\n case 4:\n return value.operatorId !== undefined;\n case 5:\n return value.date !== undefined;\n case 6:\n return value.slotKey !== undefined;\n case 7:\n return false;\n }\n}\n\nfunction getStepSummary(\n step: CascadeStep,\n value: BookingValue,\n cascade: CascadeOutputs,\n): ReactNode {\n if (!stepIsFulfilled(step, value)) return undefined;\n switch (step) {\n case 1:\n return value.insuranceType;\n case 2: {\n const sp = cascade.filtered.specialties.find(\n (s) => s.id === value.specialtyId,\n );\n return sp?.label;\n }\n case 3: {\n const sv = cascade.filtered.services.find(\n (s) => s.id === value.serviceId,\n );\n return sv?.label;\n }\n case 4: {\n const opId = resolveOperatorId(value);\n if (!opId) return undefined;\n const op = cascade.filtered.operators.find((o) => o.id === opId);\n return op?.name;\n }\n case 5:\n return value.date;\n case 6:\n return cascade.selectedSlot?.time;\n case 7:\n return undefined;\n }\n}\n\n/* -------------------------------------------------------------------- */\n/* CalendarBody — chip rail of completed selections + calendar dominant. */\n/* -------------------------------------------------------------------- */\n\nfunction CalendarBody(props: VariantBodyProps) {\n const { cascade, value, setActiveStep } = props;\n const { t } = useTranslation();\n const labels = useStepLabels();\n\n // Filters that come before the calendar (insurance/specialty/service/operator).\n const filterSteps = cascade.visibleSteps.filter(\n (s) => s === 1 || s === 2 || s === 3 || s === 4,\n );\n const hasUnfulfilledFilter = filterSteps.some(\n (s) => !stepIsFulfilled(s, value),\n );\n\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\">\n {/* Active step is the first unfulfilled filter — render it inline. */}\n {hasUnfulfilledFilter ? (\n filterSteps\n .filter((s) => !stepIsFulfilled(s, value))\n .slice(0, 1)\n .map((s) => (\n <div key={`csf-${s}`}>\n {getStepNode(s, props, { compactService: true })}\n </div>\n ))\n ) : (\n <div\n role=\"group\"\n aria-label={t('booking.regionLabel')}\n className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-xs)]\"\n >\n {filterSteps.map((s) => {\n const summary = getStepSummary(s, value, cascade);\n if (!summary) return null;\n return (\n <Button\n key={`csc-${s}`}\n intent=\"tonal\"\n size=\"sm\"\n onClick={() => setActiveStep(s)}\n >\n {labels[s]}: {summary}\n </Button>\n );\n })}\n </div>\n )}\n\n {!hasUnfulfilledFilter && cascade.gates.date ? (\n // four-day-grid embeds slots inline with the day strip — the\n // historic 2-col date|slot split collapses to a single column\n // so the picker spans the full width instead of orphaning an\n // empty right cell.\n props.datePickerStyle === 'four-day-grid' ? (\n <div>{getStepNode(5, props)}</div>\n ) : (\n <div className=\"ds:grid ds:grid-cols-1 ds:gap-[var(--spacing-md)] ds:md:grid-cols-2\">\n <div className=\"ds:min-w-0\">{getStepNode(5, props)}</div>\n <div className=\"ds:min-w-0\">\n {value.date ? getStepNode(6, props) : null}\n </div>\n </div>\n )\n ) : null}\n\n {cascade.gates.details ? <div>{getStepNode(7, props)}</div> : null}\n </div>\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* FlexibleBody — 2-col desktop (filters L, calendar+slots R), inline */\n/* below md. */\n/* -------------------------------------------------------------------- */\n\nfunction FlexibleBody(props: VariantBodyProps) {\n const { cascade, datePickerStyle } = props;\n\n const filterStepNumbers = cascade.visibleSteps.filter(\n (s) => s === 1 || s === 2 || s === 3 || s === 4,\n );\n\n // 0.33.12: four-day-grid renders 4 day columns + ±arrows. The\n // historic 2-col split (filters left, picker right) crushes\n // that 4-column strip into ~half the widget width — slot tiles\n // truncate, day headers become unreadable. Stack to single\n // column when four-day-grid so the picker gets the full width.\n // (The calendar variant already does this in 0.33.10.)\n const stackedLayout = datePickerStyle === 'four-day-grid';\n\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\">\n <div\n className={\n stackedLayout\n ? 'ds:flex ds:flex-col ds:gap-[var(--spacing-md)]'\n : 'ds:grid ds:grid-cols-1 ds:gap-[var(--spacing-md)] ds:md:grid-cols-2'\n }\n >\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\">\n {filterStepNumbers.map((s) => (\n <div key={`fbf-${s}`}>\n {getStepNode(s, props, { compactService: true })}\n </div>\n ))}\n </div>\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\">\n {cascade.gates.date ? getStepNode(5, props) : null}\n {cascade.gates.slot && props.value.date\n ? getStepNode(6, props)\n : null}\n </div>\n </div>\n {cascade.gates.details ? getStepNode(7, props) : null}\n </div>\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* ProgressBody — wizard with stepper + one step on screen + Back/Next. */\n/* -------------------------------------------------------------------- */\n\nfunction ProgressBody(props: VariantBodyProps) {\n const { cascade, value, activeStep, setActiveStep, datePickerStyle } = props;\n const { t } = useTranslation();\n const labels = useStepLabels();\n\n // four-day-grid sets both value.date and value.slotKey atomically\n // when the user picks a tile, so step 6 (slot) has nothing of its\n // own to render. Drop it from the wizard ladder so the user\n // doesn't land on an empty page mid-flow.\n const visibleSteps = useMemo(\n () =>\n datePickerStyle === 'four-day-grid'\n ? cascade.visibleSteps.filter((s) => s !== 6)\n : cascade.visibleSteps,\n [cascade.visibleSteps, datePickerStyle],\n );\n const activeIndex = Math.max(0, visibleSteps.indexOf(activeStep));\n const totalSteps = visibleSteps.length;\n\n const stepSpecs = useMemo(\n () => visibleSteps.map((s) => ({ label: labels[s] })),\n [visibleSteps, labels],\n );\n\n const canGoBack = activeIndex > 0;\n // Forward navigation is gated by the cascade — can only advance when\n // the active step is fulfilled.\n const canGoNext =\n activeIndex < totalSteps - 1 && stepIsFulfilled(activeStep, value);\n\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\">\n <StepperProgress activeStep={activeIndex} steps={stepSpecs} />\n <div>{getStepNode(activeStep, props, { compactService: true })}</div>\n <div className=\"ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)]\">\n <Button\n intent=\"ghost\"\n size=\"md\"\n disabled={!canGoBack}\n onClick={() => {\n const prev = visibleSteps[activeIndex - 1];\n if (prev) setActiveStep(prev);\n }}\n >\n {t('booking.actions.back')}\n </Button>\n {activeStep < 7 ? (\n <Button\n intent=\"primary\"\n size=\"md\"\n disabled={!canGoNext}\n onClick={() => {\n const next = visibleSteps[activeIndex + 1];\n if (next) setActiveStep(next);\n }}\n >\n {t('booking.actions.next')}\n </Button>\n ) : null}\n </div>\n </div>\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* Root Booking component */\n/* -------------------------------------------------------------------- */\n\nconst EMPTY_SPECIALTIES: BookingSpecialty[] = [];\nconst EMPTY_OPERATORS: BookingOperator[] = [];\n\nexport const Booking = forwardRef<HTMLDivElement, BookingProps>(\n (\n {\n variant = 'inline-list',\n country,\n // No default — the cascade engine treats `undefined` as \"auto-on\n // when `specialties` has items\" so consumers who pass specialty\n // data without the explicit flag still get the step.\n useSpecialties,\n allowOperatorSelection = false,\n lockedOperatorId,\n autoSelectSingleService = false,\n specialties: specialtiesProp,\n services,\n operators: operatorsProp,\n availableDates,\n availableSlots,\n nextAvailableDate,\n requireCodiceFiscale,\n requireDateOfBirth,\n requireInsuranceNumber,\n showNote,\n showReturningPatientFlag,\n privacyPolicyUrl,\n termsUrl,\n validateCodiceFiscale,\n validateInsuranceNumber,\n confirmationChannels,\n defaultConfirmationChannels,\n value,\n onChange,\n onSubmit,\n onStepChange,\n onDateSelect,\n onWindowChange,\n datePickerStyle = 'month-calendar',\n specialtyPickerStyle,\n servicePickerStyle,\n operatorPickerStyle,\n loadingDates,\n loadingSlots,\n submitting,\n submitError,\n mode = 'live',\n showModifyOnSuccess = true,\n surface = 'flat',\n emptyServicesSlot,\n onboardingIncompleteSlot,\n 'aria-label': ariaLabel,\n id,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation();\n const resolvedVariant = (variant ?? 'inline-list') as BookingVariant;\n const locale = i18n.language ?? 'en';\n\n const specialties = specialtiesProp ?? EMPTY_SPECIALTIES;\n const operators = operatorsProp ?? EMPTY_OPERATORS;\n\n // Auto-pre-select on mount + whenever the inputs that drive them\n // arrive (e.g. when `specialties` populates from an async fetch).\n useEffect(() => {\n const next = applyAutoSelects(value, {\n country,\n useSpecialties,\n allowOperatorSelection,\n lockedOperatorId,\n autoSelectSingleService,\n specialties,\n services,\n });\n // Shallow compare the keys we might have changed.\n if (\n next.specialtyId !== value.specialtyId ||\n next.operatorId !== value.operatorId ||\n next.serviceId !== value.serviceId\n ) {\n onChange(next);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n lockedOperatorId,\n useSpecialties,\n autoSelectSingleService,\n specialties,\n services,\n ]);\n\n const cascade = useMemo(\n () =>\n deriveCascade({\n country,\n useSpecialties,\n allowOperatorSelection,\n lockedOperatorId,\n autoSelectSingleService,\n specialties,\n services,\n operators,\n availableDates,\n availableSlots,\n value,\n }),\n [\n country,\n useSpecialties,\n allowOperatorSelection,\n lockedOperatorId,\n autoSelectSingleService,\n specialties,\n services,\n operators,\n availableDates,\n availableSlots,\n value,\n ],\n );\n\n const [activeStep, setActiveStep] = useState<CascadeStep>(\n cascade.currentStep,\n );\n // Sync activeStep to the cascade's current step when the user\n // advances forward via the value, but not on the initial mount.\n const lastCurrentStepRef = useRef(cascade.currentStep);\n useEffect(() => {\n if (cascade.currentStep > lastCurrentStepRef.current) {\n setActiveStep(cascade.currentStep);\n }\n lastCurrentStepRef.current = cascade.currentStep;\n }, [cascade.currentStep]);\n\n const [submitState, setSubmitState] = useState<\n 'idle' | 'submitting' | 'success' | 'error'\n >('idle');\n const [submittedSnapshot, setSubmittedSnapshot] = useState<{\n slot: BookingSlot;\n details: BookingDetails;\n insuranceType?: InsuranceType;\n operatorId?: string;\n specialtyId?: string;\n serviceId?: string;\n date?: string;\n } | null>(null);\n\n const handleSubmit = useCallback(\n async (details: BookingDetails) => {\n if (!cascade.selectedSlot) return;\n const payload = {\n slot: cascade.selectedSlot,\n value: {\n ...value,\n details,\n operatorId: resolveOperatorId(value) ?? value.operatorId,\n },\n details,\n };\n setSubmitState('submitting');\n try {\n await onSubmit(payload);\n setSubmittedSnapshot({\n slot: cascade.selectedSlot,\n details,\n specialtyId: value.specialtyId,\n serviceId: value.serviceId,\n insuranceType: value.insuranceType,\n operatorId: resolveOperatorId(value),\n date: value.date,\n });\n setSubmitState('success');\n } catch {\n setSubmitState('error');\n // Re-throw so the consumer can observe + log. The form\n // stays mounted so the patient can retry.\n throw new Error('Booking submission failed');\n }\n },\n [cascade.selectedSlot, onSubmit, value],\n );\n\n /* ---------- Imperative handle ---------- */\n\n const rootRef = useRef<HTMLDivElement>(null);\n useImperativeHandle(ref, () => rootRef.current as HTMLDivElement, []);\n\n /* ---------- onStepChange + auto-scroll on success ---------- */\n\n // The displayed step is `8` when the success view is mounted, and\n // matches the cascade's `currentStep` otherwise. Tracked via a ref\n // so the effect only fires when the displayed step actually changes\n // (vs every time `currentStep` or `submitState` updates).\n const displayedStep: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 =\n submitState === 'success' ? 8 : cascade.currentStep;\n // Initialise to `null` so the first effect-fire (after mount) still\n // emits onStepChange with the initial step. Subsequent fires only\n // emit when the step actually changes.\n const lastDisplayedStepRef = useRef<typeof displayedStep | null>(null);\n useEffect(() => {\n if (displayedStep === lastDisplayedStepRef.current) return;\n lastDisplayedStepRef.current = displayedStep;\n onStepChange?.(displayedStep);\n // Auto-scroll the booking surface into view on the transition to\n // step 8 — the success card is much shorter than the form, so\n // without this the patient often ends up below the booking column\n // and has to scroll up to see \"Booking submitted.\" See the\n // 0.30.0-adoption follow-up notes for the failure mode.\n if (displayedStep === 8 && rootRef.current) {\n try {\n rootRef.current.scrollIntoView({\n behavior: 'smooth',\n block: 'start',\n });\n } catch {\n // jsdom + older browsers may not implement smooth scroll.\n // Fall back to a plain scroll — still better than nothing.\n rootRef.current.scrollIntoView();\n }\n }\n }, [displayedStep, onStepChange]);\n\n const agentHandle = useMemo<BookingHandle>(\n () => ({\n getVariant: () => resolvedVariant,\n reset: () => {\n // Clear the value to an empty state + drop any success view;\n // the consumer's onChange observes the normalised value.\n onChange({});\n setSubmittedSnapshot(null);\n setSubmitState('idle');\n setActiveStep(1);\n },\n goToStep: (step) => {\n setActiveStep(step);\n },\n }),\n [resolvedVariant, onChange],\n );\n useAgentRegistration(bookingAgent, agentHandle, id);\n\n const resolvedAriaLabel = ariaLabel ?? t('booking.regionLabel');\n\n // Success view replaces the entire cascade body once `onSubmit`\n // resolves. The header still renders so the patient sees their\n // booking context above the confirmation card.\n const successBody = useMemo(() => {\n if (submitState !== 'success' || !submittedSnapshot) return null;\n return (\n <BookingSuccess\n snapshot={submittedSnapshot}\n operators={operators}\n specialties={specialties}\n services={services}\n locale={locale}\n mode={mode}\n showModify={showModifyOnSuccess}\n onReset={() => agentHandle.reset()}\n onModify={() => {\n // Modify path — keep `value` + `details` intact, just drop\n // the success view + return to step 7. The form will paint\n // pre-populated.\n setSubmittedSnapshot(null);\n setSubmitState('idle');\n setActiveStep(7);\n }}\n />\n );\n }, [\n submitState,\n submittedSnapshot,\n operators,\n specialties,\n services,\n locale,\n mode,\n showModifyOnSuccess,\n agentHandle,\n ]);\n\n const variantBody = useMemo(() => {\n if (submitState === 'success') return null;\n const Body =\n resolvedVariant === 'accordion'\n ? AccordionBody\n : resolvedVariant === 'calendar'\n ? CalendarBody\n : resolvedVariant === 'flexible'\n ? FlexibleBody\n : resolvedVariant === 'progress'\n ? ProgressBody\n : InlineListBody;\n const bodyProps: VariantBodyProps = {\n cascade,\n inputs: {\n specialties,\n services,\n operators,\n availableDates,\n availableSlots,\n nextAvailableDate,\n },\n value,\n onChange,\n onSubmit: handleSubmit,\n policy: { country, lockedOperatorId },\n detailsProps: {\n requireCodiceFiscale,\n requireDateOfBirth,\n requireInsuranceNumber,\n insuranceType: value.insuranceType,\n showNote,\n showReturningPatientFlag,\n privacyPolicyUrl,\n termsUrl,\n validateCodiceFiscale,\n validateInsuranceNumber,\n confirmationChannels,\n defaultConfirmationChannels,\n submitError,\n },\n emptyServicesSlot,\n onboardingIncompleteSlot,\n loadingDates,\n loadingSlots,\n onDateSelect,\n onWindowChange,\n datePickerStyle,\n specialtyPickerStyle,\n servicePickerStyle,\n operatorPickerStyle,\n submitting,\n locale,\n activeStep,\n setActiveStep,\n };\n return <Body {...bodyProps} />;\n }, [\n submitState,\n resolvedVariant,\n cascade,\n specialties,\n services,\n operators,\n availableDates,\n availableSlots,\n nextAvailableDate,\n value,\n onChange,\n handleSubmit,\n country,\n lockedOperatorId,\n requireCodiceFiscale,\n requireDateOfBirth,\n requireInsuranceNumber,\n submitError,\n showNote,\n showReturningPatientFlag,\n privacyPolicyUrl,\n termsUrl,\n validateCodiceFiscale,\n validateInsuranceNumber,\n confirmationChannels,\n defaultConfirmationChannels,\n emptyServicesSlot,\n onboardingIncompleteSlot,\n loadingDates,\n loadingSlots,\n onDateSelect,\n onWindowChange,\n datePickerStyle,\n specialtyPickerStyle,\n servicePickerStyle,\n operatorPickerStyle,\n submitting,\n locale,\n activeStep,\n ]);\n\n return (\n <div\n ref={rootRef}\n role=\"region\"\n aria-label={resolvedAriaLabel}\n id={id}\n data-component=\"booking\"\n data-component-id={id}\n data-variant={resolvedVariant}\n className={rootVariants({\n variant: resolvedVariant,\n surface,\n className,\n })}\n {...rest}\n >\n <div\n // Hero gradient backdrop is shared across every Booking\n // variant — the header is the kit's brand marker for the\n // surface and should not visually fragment by variant.\n // (0.31.x gated this to `inline-list` only; lifted in\n // 0.32.0 so `accordion` / `calendar` / `flexible` /\n // `progress` carry the same chrome.)\n className={[\n 'ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)]',\n 'ds:rounded-[var(--radius-md)]',\n 'ds:bg-[color-mix(in_srgb,var(--primary)_35%,var(--background))]',\n 'ds:bg-[image:var(--gradient-hero-brand)]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:pt-[var(--spacing-md)] ds:pb-[var(--spacing-md)]',\n ].join(' ')}\n >\n <h2 className=\"type-title-card ds:text-[var(--foreground)] ds:m-0\">\n {t('booking.regionLabel')}\n </h2>\n <p className=\"type-body-sm ds:text-[var(--muted-foreground)] ds:m-0\">\n {t('booking.headingSubtitle')}\n </p>\n </div>\n {successBody ?? variantBody}\n </div>\n );\n },\n);\n\nBooking.displayName = 'Booking';\n"],"names":["__iconNode","Activity","createLucideIcon","Baby","Bone","Brain","CalendarRange","ClipboardCheck","Ear","Microscope","Pill","Scissors","Smile","Sunset","Syringe","subMonths","date","amount","options","addMonths","bookingAgent","handle","args","CONFIRMATION_CHANNEL_ORDER","OPERATORS_ALL","COUNTRY_GERMANY","filterSpecialties","inputs","s","_a","b","aSeq","bSeq","filterServices","list","specialtyIds","resolveSpecialtyIds","eligibleOperators","useSpecialtiesResolved","op","sid","serviceIds","resolveServiceIds","rid","computeGates","filtered","insuranceVisible","insuranceSatisfied","specialtyVisible","specialtyPicked","serviceVisible","servicePicked","serviceSatisfied","eligibleOps","operatorVisible","dateVisible","slotVisible","detailsVisible","onboardingIncomplete","deriveStep","gates","visible","isFulfilled","deriveCascade","currentStep","visibleSteps","selectedSlot","day","selectedService","specialtyPickedFinal","isReadyToSubmit","resetOnInsuranceChange","value","next","resetOnSpecialtyChange","resetOnSpecialtyIdsChange","resetOnServiceChange","resetOnServiceIdsChange","hasAny","resetOnOperatorChange","resetOnOperatorIdsChange","resetOnDateChange","resetOnSlotChange","applyAutoSelects","resolvedServices","resolveOperatorId","looksLikePhone","trimmed","resolveConfirmationChannels","enabled","set","c","defaultConfirmationSelection","mobile","override","resolvedEnabled","enabledSet","out","mobilePlausible","hasWhatsApp","outSet","NOTE_MAX_LENGTH","CF_REGEX","EMAIL_REGEX","VALIDATE_DEBOUNCE_MS","idleStatus","BookingDetailsForm","forwardRef","onChange","onSubmit","requireCodiceFiscale","requireDateOfBirth","requireInsuranceNumber","insuranceType","showNote","showReturningPatientFlag","privacyPolicyUrl","termsUrl","validateCodiceFiscale","validateInsuranceNumber","submitting","summarySlot","defaultPhoneCountry","confirmationChannels","defaultConfirmationChannels","submitError","ref","t","useTranslation","formId","useId","cfStatus","setCfStatus","useState","insuranceStatus","setInsuranceStatus","touched","setTouched","markTouched","useCallback","field","cfTimerRef","useRef","insuranceTimerRef","useEffect","update","patch","resolvedEnabledChannels","useMemo","pickerVisible","seededRef","seed","selectedChannels","noChannelsSelected","cf","res","insuranceShown","n","emailValid","phoneValid","requiredFieldsValid","_b","consentsTicked","channelsSatisfied","canSubmit","handleSubmit","e","payload","renderConsentLabel","i18nKey","url","safeUrl","jsx","Trans","jsxs","FormField","TextInput","EmailInput","PhoneInput","e164","DatePicker","TextArea","Checkbox","checked","Fragment","CheckboxGroup","Alert","Button","Spinner","rootVariants","cva","SERVICE_ICON_RULES","HeartPulse","Eye","ScanLine","Sparkles","pickIcon","text","pattern","Icon","inferServiceIcon","service","Stethoscope","isoOf","fnsFormat","monthCellBase","monthCellVariants","MonthGrid","availableDates","selectedDate","onSelectDate","locale","loading","initialMonth","startOfMonth","parseISO","viewMonth","setViewMonth","focusDate","setFocusDate","cells","monthStart","monthEnd","endOfMonth","startWeekday","totalDays","grid","i","d","last","monthLabel","weekdayLabels","base","_","availableSet","isAvailable","rovingDate","firstAvailable","isSameMonth","handleKeyDown","event","current","Skeleton","IconButton","ChevronLeft","m","ChevronRight","label","rowIndex","colIndex","inMonth","available","isSelected","isSameDay","state","isRoving","dayLabel","serviceCardVariants","ServiceCardGroup","services","selectedServiceId","onSelect","groupId","focusIndex","setFocusIndex","cardRefs","focusAt","index","id","total","prev","isFocused","ariaLabel","iconNode","node","slotChipVariants","bucketForTime","time","hh","hour","BUCKET_ICONS","Sun","Moon","GroupedTimeSlots","slots","selectedSlotKey","dateLabel","groups","result","slot","availableCount","order","row","EmptyState","bucket","items","FOUR_DAY_WINDOW_SIZE","FourDayPicker","availableSlots","onDateSelect","onWindowChange","loadingDates","loadingSlots","today","startOfDay","windowStart","setWindowStart","isAfter","first","windowEnd","addDays","days","iso","hasPrevious","hasNext","handlePreviousDays","subDays","handleNextDays","isBefore","handleSlotSelect","dateIso","visibleWindowHasSlots","firstAvailableIso","NextAvailableCta","SlotGrid","renderDateStep","props","datePickerStyle","renderSlotStep","InsuranceStep","Select","SpecialtyStep","specialties","valueIds","onChangeIds","pickerStyle","heading","MultiSelect","Combobox","ServiceStep","compact","resolvedStyle","OperatorStep","operators","OnboardingIncompleteAlert","customSlot","nextAvailableDate","onJump","formatted","BookingSuccess","snapshot","mode","showModify","onReset","onModify","channelLabels","description","formattedDate","operator","specialty","EmptyServicesAlert","InlineListBody","cascade","emptyServicesSlot","onboardingIncompleteSlot","specialtyPickerStyle","servicePickerStyle","operatorPickerStyle","detailsProps","getStepNode","step","policy","useStepLabels","AccordionBody","activeStep","setActiveStep","labels","visibleStepsForBody","accordionSteps","stepNum","getStepSummary","stepIsFulfilled","activeIndex","StepperAccordion","idx","sp","sv","opId","o","CalendarBody","filterSteps","hasUnfulfilledFilter","summary","FlexibleBody","filterStepNumbers","ProgressBody","totalSteps","stepSpecs","canGoBack","canGoNext","StepperProgress","EMPTY_SPECIALTIES","EMPTY_OPERATORS","Booking","variant","country","useSpecialties","allowOperatorSelection","lockedOperatorId","autoSelectSingleService","specialtiesProp","operatorsProp","onStepChange","showModifyOnSuccess","surface","className","rest","i18n","resolvedVariant","lastCurrentStepRef","submitState","setSubmitState","submittedSnapshot","setSubmittedSnapshot","details","rootRef","useImperativeHandle","displayedStep","lastDisplayedStepRef","agentHandle","useAgentRegistration","resolvedAriaLabel","successBody","variantBody","Body","bodyProps"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13]}