@sonordev/site-kit 5.5.0 → 5.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/agent-manifest.json +1 -1
- package/dist/AnalyticsProvider-6PXC7UDP.js +32 -0
- package/dist/{AnalyticsProvider-WDDW3IJW.js.map → AnalyticsProvider-6PXC7UDP.js.map} +1 -1
- package/dist/AnalyticsProvider-FVQIYSLY.mjs +11 -0
- package/dist/{AnalyticsProvider-KFXAH4GR.mjs.map → AnalyticsProvider-FVQIYSLY.mjs.map} +1 -1
- package/dist/{BlogViewTracker-D4DIEP4Q.js → BlogViewTracker-S4HSRCW7.js} +6 -6
- package/dist/{BlogViewTracker-D4DIEP4Q.js.map → BlogViewTracker-S4HSRCW7.js.map} +1 -1
- package/dist/{BlogViewTracker-ZVEGGH3Y.mjs → BlogViewTracker-ZUGLBOVI.mjs} +5 -5
- package/dist/{BlogViewTracker-ZVEGGH3Y.mjs.map → BlogViewTracker-ZUGLBOVI.mjs.map} +1 -1
- package/dist/ChatWidget-2TQWCXWP.js +22 -0
- package/dist/{ChatWidget-2ZYPYIMQ.js.map → ChatWidget-2TQWCXWP.js.map} +1 -1
- package/dist/ChatWidget-DG52ZIE6.mjs +13 -0
- package/dist/{ChatWidget-FYCCLMQE.mjs.map → ChatWidget-DG52ZIE6.mjs.map} +1 -1
- package/dist/EngageWidget-2VUJADIU.mjs +12 -0
- package/dist/{EngageWidget-6HUZYOY7.mjs.map → EngageWidget-2VUJADIU.mjs.map} +1 -1
- package/dist/EngageWidget-Z7RC2INM.js +21 -0
- package/dist/{EngageWidget-MYQTBBW6.js.map → EngageWidget-Z7RC2INM.js.map} +1 -1
- package/dist/{FileField-OZZHWGPA.mjs → FileField-FSQ7W3A5.mjs} +5 -5
- package/dist/{FileField-OZZHWGPA.mjs.map → FileField-FSQ7W3A5.mjs.map} +1 -1
- package/dist/{FileField-JK2S24XU.js → FileField-UOQHL25J.js} +6 -6
- package/dist/{FileField-JK2S24XU.js.map → FileField-UOQHL25J.js.map} +1 -1
- package/dist/{FormSpotlight-XV42L72H.mjs → FormSpotlight-RHL5FWM2.mjs} +3 -3
- package/dist/{FormSpotlight-XV42L72H.mjs.map → FormSpotlight-RHL5FWM2.mjs.map} +1 -1
- package/dist/{FormSpotlight-5AXFQU5M.js → FormSpotlight-TED32NHP.js} +15 -15
- package/dist/{FormSpotlight-5AXFQU5M.js.map → FormSpotlight-TED32NHP.js.map} +1 -1
- package/dist/{FormStage-RUK675HV.mjs → FormStage-DINIRFOX.mjs} +3 -3
- package/dist/{FormStage-RUK675HV.mjs.map → FormStage-DINIRFOX.mjs.map} +1 -1
- package/dist/{FormStage-HATUHNRV.js → FormStage-PFEBKHGY.js} +13 -13
- package/dist/{FormStage-HATUHNRV.js.map → FormStage-PFEBKHGY.js.map} +1 -1
- package/dist/ManagedForm-43WLCUAK.js +23 -0
- package/dist/{ManagedForm-JWEXJEXK.js.map → ManagedForm-43WLCUAK.js.map} +1 -1
- package/dist/ManagedForm-545YAUFC.mjs +14 -0
- package/dist/{ManagedForm-OA3MNGXT.mjs.map → ManagedForm-545YAUFC.mjs.map} +1 -1
- package/dist/{ManagedNewsletterForm-AAHH63KT.js → ManagedNewsletterForm-I3QN57HB.js} +8 -8
- package/dist/{ManagedNewsletterForm-AAHH63KT.js.map → ManagedNewsletterForm-I3QN57HB.js.map} +1 -1
- package/dist/{ManagedNewsletterForm-HZKTNWLW.mjs → ManagedNewsletterForm-ZPY5RRKX.mjs} +7 -7
- package/dist/{ManagedNewsletterForm-HZKTNWLW.mjs.map → ManagedNewsletterForm-ZPY5RRKX.mjs.map} +1 -1
- package/dist/{SignalCore-X3GDGBZD.mjs → SignalCore-EEH5IM4U.mjs} +5 -5
- package/dist/{SignalCore-X3GDGBZD.mjs.map → SignalCore-EEH5IM4U.mjs.map} +1 -1
- package/dist/{SignalCore-YSNZYBKJ.js → SignalCore-M4AXIMV4.js} +11 -11
- package/dist/{SignalCore-YSNZYBKJ.js.map → SignalCore-M4AXIMV4.js.map} +1 -1
- package/dist/SitemapSync-46G7LVZS.mjs +9 -0
- package/dist/{SitemapSync-2PTDBH5E.mjs.map → SitemapSync-46G7LVZS.mjs.map} +1 -1
- package/dist/SitemapSync-XK4JKCS7.js +18 -0
- package/dist/{SitemapSync-3SFAI546.js.map → SitemapSync-XK4JKCS7.js.map} +1 -1
- package/dist/SitemapSync.d.ts +3 -2
- package/dist/SitemapSync.d.ts.map +1 -1
- package/dist/analytics/AnalyticsProvider.d.ts +3 -1
- package/dist/analytics/AnalyticsProvider.d.ts.map +1 -1
- package/dist/analytics/WebVitals.d.ts +3 -1
- package/dist/analytics/WebVitals.d.ts.map +1 -1
- package/dist/analytics/index.js +13 -13
- package/dist/analytics/index.mjs +5 -5
- package/dist/analytics/send-gate.d.ts +8 -37
- package/dist/analytics/send-gate.d.ts.map +1 -1
- package/dist/blog/index.js +20 -20
- package/dist/blog/index.mjs +3 -3
- package/dist/blog/server-ui.js +14 -14
- package/dist/blog/server-ui.mjs +2 -2
- package/dist/{chunk-RMMHWSPP.mjs → chunk-473WDGQZ.mjs} +3 -3
- package/dist/{chunk-RMMHWSPP.mjs.map → chunk-473WDGQZ.mjs.map} +1 -1
- package/dist/{chunk-FYVLQ3OU.js → chunk-53KMRZT7.js} +3 -3
- package/dist/{chunk-FYVLQ3OU.js.map → chunk-53KMRZT7.js.map} +1 -1
- package/dist/{chunk-S6FEC6UT.mjs → chunk-5KIEZHVK.mjs} +14 -17
- package/dist/chunk-5KIEZHVK.mjs.map +1 -0
- package/dist/{chunk-MCJF2KJ6.js → chunk-5KIO6FXE.js} +5 -5
- package/dist/{chunk-MCJF2KJ6.js.map → chunk-5KIO6FXE.js.map} +1 -1
- package/dist/chunk-5RNAUYWE.js +50 -0
- package/dist/chunk-5RNAUYWE.js.map +1 -0
- package/dist/{chunk-MU7IEPDG.mjs → chunk-5UFDHGFE.mjs} +3 -3
- package/dist/{chunk-MU7IEPDG.mjs.map → chunk-5UFDHGFE.mjs.map} +1 -1
- package/dist/{chunk-V6NOM7PJ.mjs → chunk-6OP5XSMM.mjs} +3 -3
- package/dist/{chunk-V6NOM7PJ.mjs.map → chunk-6OP5XSMM.mjs.map} +1 -1
- package/dist/{chunk-TALEV3IH.mjs → chunk-7AUDKXY5.mjs} +3 -3
- package/dist/{chunk-TALEV3IH.mjs.map → chunk-7AUDKXY5.mjs.map} +1 -1
- package/dist/{chunk-3B6CXGAK.mjs → chunk-7C7XO5HX.mjs} +3 -3
- package/dist/{chunk-3B6CXGAK.mjs.map → chunk-7C7XO5HX.mjs.map} +1 -1
- package/dist/chunk-A6UYV475.mjs +45 -0
- package/dist/chunk-A6UYV475.mjs.map +1 -0
- package/dist/{chunk-ZRQFG3L6.mjs → chunk-AHZR4VGY.mjs} +4 -4
- package/dist/{chunk-ZRQFG3L6.mjs.map → chunk-AHZR4VGY.mjs.map} +1 -1
- package/dist/{chunk-YYAFHIY7.js → chunk-AY7JBGYC.js} +14 -14
- package/dist/{chunk-YYAFHIY7.js.map → chunk-AY7JBGYC.js.map} +1 -1
- package/dist/{chunk-CT5REGAK.js → chunk-B64AZC6P.js} +14 -14
- package/dist/{chunk-CT5REGAK.js.map → chunk-B64AZC6P.js.map} +1 -1
- package/dist/{chunk-VAS3LH5W.js → chunk-B6O7D5U4.js} +55 -49
- package/dist/chunk-B6O7D5U4.js.map +1 -0
- package/dist/{chunk-A3F5GRNJ.js → chunk-BWSMUSDB.js} +8 -8
- package/dist/{chunk-A3F5GRNJ.js.map → chunk-BWSMUSDB.js.map} +1 -1
- package/dist/{chunk-2CMSWJWC.js → chunk-BZLIOT7Q.js} +18 -18
- package/dist/{chunk-2CMSWJWC.js.map → chunk-BZLIOT7Q.js.map} +1 -1
- package/dist/{chunk-DRLHQQBH.mjs → chunk-C2MSD2UM.mjs} +4 -4
- package/dist/{chunk-DRLHQQBH.mjs.map → chunk-C2MSD2UM.mjs.map} +1 -1
- package/dist/{chunk-YNC5D3FT.js → chunk-CQRLKNHQ.js} +12 -12
- package/dist/{chunk-YNC5D3FT.js.map → chunk-CQRLKNHQ.js.map} +1 -1
- package/dist/{chunk-RZUZMUTN.mjs → chunk-CQS5ZYI6.mjs} +21 -9
- package/dist/chunk-CQS5ZYI6.mjs.map +1 -0
- package/dist/{chunk-W5NVW23S.js → chunk-DHIWR7CG.js} +4 -4
- package/dist/{chunk-W5NVW23S.js.map → chunk-DHIWR7CG.js.map} +1 -1
- package/dist/chunk-DQUBETXH.mjs +6 -0
- package/dist/{chunk-WDBCXRTT.mjs.map → chunk-DQUBETXH.mjs.map} +1 -1
- package/dist/{chunk-TX2QQ7IX.mjs → chunk-GJ6NOLGC.mjs} +3 -3
- package/dist/{chunk-TX2QQ7IX.mjs.map → chunk-GJ6NOLGC.mjs.map} +1 -1
- package/dist/{chunk-R4MX6EOM.mjs → chunk-GPLCPMVD.mjs} +7 -7
- package/dist/{chunk-R4MX6EOM.mjs.map → chunk-GPLCPMVD.mjs.map} +1 -1
- package/dist/{chunk-2OU4KBUN.js → chunk-H3D3ZGOJ.js} +15 -15
- package/dist/{chunk-2OU4KBUN.js.map → chunk-H3D3ZGOJ.js.map} +1 -1
- package/dist/{chunk-UZL2QU2V.mjs → chunk-H44XZUOV.mjs} +4 -4
- package/dist/{chunk-UZL2QU2V.mjs.map → chunk-H44XZUOV.mjs.map} +1 -1
- package/dist/{chunk-OFSA7LUH.mjs → chunk-HIHAXEPD.mjs} +4 -4
- package/dist/{chunk-OFSA7LUH.mjs.map → chunk-HIHAXEPD.mjs.map} +1 -1
- package/dist/{chunk-DYULWKDC.mjs → chunk-IYCLN3XS.mjs} +14 -33
- package/dist/chunk-IYCLN3XS.mjs.map +1 -0
- package/dist/{chunk-BNOQXDPJ.js → chunk-JE5DWAE6.js} +4 -4
- package/dist/{chunk-BNOQXDPJ.js.map → chunk-JE5DWAE6.js.map} +1 -1
- package/dist/{chunk-VYHRAICF.mjs → chunk-JNABXCLY.mjs} +4 -4
- package/dist/{chunk-VYHRAICF.mjs.map → chunk-JNABXCLY.mjs.map} +1 -1
- package/dist/{chunk-4XGACM7D.mjs → chunk-K2V3ZW36.mjs} +3 -3
- package/dist/{chunk-4XGACM7D.mjs.map → chunk-K2V3ZW36.mjs.map} +1 -1
- package/dist/chunk-KSL3WA2I.js +8 -0
- package/dist/{chunk-SUZ3ZLB2.js.map → chunk-KSL3WA2I.js.map} +1 -1
- package/dist/{chunk-HX3BRMOX.js → chunk-KY6M76JW.js} +3 -3
- package/dist/{chunk-HX3BRMOX.js.map → chunk-KY6M76JW.js.map} +1 -1
- package/dist/{chunk-X2XFLYZ3.mjs → chunk-LCSYJXIO.mjs} +3 -3
- package/dist/{chunk-X2XFLYZ3.mjs.map → chunk-LCSYJXIO.mjs.map} +1 -1
- package/dist/{chunk-UNPEMSLK.js → chunk-N2PGTPWN.js} +24 -12
- package/dist/chunk-N2PGTPWN.js.map +1 -0
- package/dist/{chunk-7PPNXORV.mjs → chunk-OA7KKOAK.mjs} +25 -31
- package/dist/chunk-OA7KKOAK.mjs.map +1 -0
- package/dist/{chunk-QEGUI2Q2.js → chunk-OC7AO7XS.js} +15 -15
- package/dist/{chunk-QEGUI2Q2.js.map → chunk-OC7AO7XS.js.map} +1 -1
- package/dist/{chunk-5TGAUWNO.mjs → chunk-QNPVVWR7.mjs} +3 -3
- package/dist/{chunk-5TGAUWNO.mjs.map → chunk-QNPVVWR7.mjs.map} +1 -1
- package/dist/{chunk-MNYM2XU4.js → chunk-R3KTBKSW.js} +4 -4
- package/dist/{chunk-MNYM2XU4.js.map → chunk-R3KTBKSW.js.map} +1 -1
- package/dist/{chunk-WIZRCI6J.mjs → chunk-RIYAMYLV.mjs} +3 -3
- package/dist/{chunk-WIZRCI6J.mjs.map → chunk-RIYAMYLV.mjs.map} +1 -1
- package/dist/{chunk-SQVYLIIN.js → chunk-S4RC6VAQ.js} +16 -19
- package/dist/chunk-S4RC6VAQ.js.map +1 -0
- package/dist/{chunk-Z6S4MWSR.js → chunk-SYGGZZMU.js} +21 -17
- package/dist/chunk-SYGGZZMU.js.map +1 -0
- package/dist/{chunk-FF5N5D3D.js → chunk-T5VTQUNF.js} +8 -8
- package/dist/{chunk-FF5N5D3D.js.map → chunk-T5VTQUNF.js.map} +1 -1
- package/dist/{chunk-G5HUI4BO.mjs → chunk-USKIL6V6.mjs} +3 -3
- package/dist/{chunk-G5HUI4BO.mjs.map → chunk-USKIL6V6.mjs.map} +1 -1
- package/dist/{chunk-PIPLBBDH.js → chunk-UU47DGHE.js} +22 -41
- package/dist/chunk-UU47DGHE.js.map +1 -0
- package/dist/{chunk-XQYC4KMH.mjs → chunk-VHZ4LHQT.mjs} +48 -42
- package/dist/chunk-VHZ4LHQT.mjs.map +1 -0
- package/dist/{chunk-Q26VZNM2.js → chunk-X5TCH7VZ.js} +3 -3
- package/dist/{chunk-Q26VZNM2.js.map → chunk-X5TCH7VZ.js.map} +1 -1
- package/dist/{chunk-QFNSM77X.js → chunk-XK5AIWQG.js} +3 -3
- package/dist/{chunk-QFNSM77X.js.map → chunk-XK5AIWQG.js.map} +1 -1
- package/dist/{chunk-KAUUGRYB.js → chunk-XR32C47O.js} +26 -32
- package/dist/chunk-XR32C47O.js.map +1 -0
- package/dist/{chunk-HBI67P7Y.mjs → chunk-YCI36ZUS.mjs} +18 -14
- package/dist/chunk-YCI36ZUS.mjs.map +1 -0
- package/dist/{chunk-HFJQMIFM.js → chunk-YYN4YZYZ.js} +4 -4
- package/dist/{chunk-HFJQMIFM.js.map → chunk-YYN4YZYZ.js.map} +1 -1
- package/dist/cli/api/{uptrade.d.ts → sonor.d.ts} +3 -2
- package/dist/cli/api/sonor.d.ts.map +1 -0
- package/dist/cli/commands/config-regression.test.d.ts +2 -0
- package/dist/cli/commands/config-regression.test.d.ts.map +1 -0
- package/dist/cli/commands/faqs.d.ts.map +1 -1
- package/dist/cli/commands/images.d.ts.map +1 -1
- package/dist/cli/commands/locations.d.ts.map +1 -1
- package/dist/cli/commands/migrate.d.ts.map +1 -1
- package/dist/cli/commands/setup.d.ts.map +1 -1
- package/dist/cli/config.d.ts +31 -0
- package/dist/cli/config.d.ts.map +1 -0
- package/dist/cli/config.test.d.ts +2 -0
- package/dist/cli/config.test.d.ts.map +1 -0
- package/dist/cli/index.js +459 -470
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/index.mjs +452 -463
- package/dist/cli/index.mjs.map +1 -1
- package/dist/cli/migrator/index.d.ts +1 -0
- package/dist/cli/migrator/index.d.ts.map +1 -1
- package/dist/cli/state.d.ts +7 -0
- package/dist/cli/state.d.ts.map +1 -0
- package/dist/cli/state.test.d.ts +2 -0
- package/dist/cli/state.test.d.ts.map +1 -0
- package/dist/client/index.js +4 -4
- package/dist/client/index.mjs +3 -3
- package/dist/commerce/index.js +57 -57
- package/dist/commerce/index.mjs +6 -6
- package/dist/engage/EngageWidget.d.ts +3 -2
- package/dist/engage/EngageWidget.d.ts.map +1 -1
- package/dist/engage/index.js +11 -10
- package/dist/engage/index.js.map +1 -1
- package/dist/engage/index.mjs +8 -7
- package/dist/engage/index.mjs.map +1 -1
- package/dist/fleet/FleetHeartbeat.d.ts +3 -2
- package/dist/fleet/FleetHeartbeat.d.ts.map +1 -1
- package/dist/fleet/heartbeat.d.ts +3 -2
- package/dist/fleet/heartbeat.d.ts.map +1 -1
- package/dist/fleet/heartbeat.test.d.ts +2 -0
- package/dist/fleet/heartbeat.test.d.ts.map +1 -0
- package/dist/fleet/index.js +9 -8
- package/dist/fleet/index.mjs +5 -4
- package/dist/forms/index.js +16 -16
- package/dist/forms/index.mjs +9 -9
- package/dist/forms/server.js +10 -10
- package/dist/forms/server.mjs +8 -8
- package/dist/forms/static.js +7 -7
- package/dist/forms/static.mjs +6 -6
- package/dist/images/index.js +11 -11
- package/dist/images/index.mjs +4 -4
- package/dist/index.js +64 -64
- package/dist/index.mjs +10 -10
- package/dist/layout/SiteKitClientProviders.d.ts.map +1 -1
- package/dist/layout/client.d.ts.map +1 -1
- package/dist/layout/client.js +9 -8
- package/dist/layout/client.mjs +8 -7
- package/dist/layout/index.js +11 -10
- package/dist/layout/index.js.map +1 -1
- package/dist/layout/index.mjs +9 -8
- package/dist/layout/index.mjs.map +1 -1
- package/dist/layout/types.d.ts +2 -0
- package/dist/layout/types.d.ts.map +1 -1
- package/dist/maps/index.js +5 -5
- package/dist/maps/index.mjs +3 -3
- package/dist/search/index.js +4 -4
- package/dist/search/index.mjs +3 -3
- package/dist/seo/client.js +6 -6
- package/dist/seo/client.mjs +5 -5
- package/dist/seo/index.js +6 -6
- package/dist/seo/index.mjs +5 -5
- package/dist/server/index.js +3 -3
- package/dist/server/index.mjs +2 -2
- package/dist/shared/reporting-gate.d.ts +43 -0
- package/dist/shared/reporting-gate.d.ts.map +1 -0
- package/dist/shared/version.d.ts +1 -1
- package/dist/signal/index.js +11 -11
- package/dist/signal/index.mjs +2 -2
- package/dist/sync/AddToCalendar.d.ts +19 -0
- package/dist/sync/AddToCalendar.d.ts.map +1 -0
- package/dist/sync/BookingWidget.d.ts.map +1 -1
- package/dist/sync/add-to-calendar.test.d.ts +2 -0
- package/dist/sync/add-to-calendar.test.d.ts.map +1 -0
- package/dist/sync/api-errors.test.d.ts +2 -0
- package/dist/sync/api-errors.test.d.ts.map +1 -0
- package/dist/sync/api.d.ts.map +1 -1
- package/dist/sync/index.js +17 -17
- package/dist/sync/index.mjs +4 -4
- package/dist/sync/types.d.ts +14 -0
- package/dist/sync/types.d.ts.map +1 -1
- package/package.json +4 -4
- package/dist/AnalyticsProvider-KFXAH4GR.mjs +0 -11
- package/dist/AnalyticsProvider-WDDW3IJW.js +0 -32
- package/dist/ChatWidget-2ZYPYIMQ.js +0 -22
- package/dist/ChatWidget-FYCCLMQE.mjs +0 -13
- package/dist/EngageWidget-6HUZYOY7.mjs +0 -11
- package/dist/EngageWidget-MYQTBBW6.js +0 -20
- package/dist/ManagedForm-JWEXJEXK.js +0 -23
- package/dist/ManagedForm-OA3MNGXT.mjs +0 -14
- package/dist/SitemapSync-2PTDBH5E.mjs +0 -9
- package/dist/SitemapSync-3SFAI546.js +0 -18
- package/dist/chunk-7PPNXORV.mjs.map +0 -1
- package/dist/chunk-DYULWKDC.mjs.map +0 -1
- package/dist/chunk-HBI67P7Y.mjs.map +0 -1
- package/dist/chunk-KAUUGRYB.js.map +0 -1
- package/dist/chunk-NVSWTDWU.mjs +0 -25
- package/dist/chunk-NVSWTDWU.mjs.map +0 -1
- package/dist/chunk-OL2QBWAU.js +0 -29
- package/dist/chunk-OL2QBWAU.js.map +0 -1
- package/dist/chunk-PIPLBBDH.js.map +0 -1
- package/dist/chunk-RZUZMUTN.mjs.map +0 -1
- package/dist/chunk-S6FEC6UT.mjs.map +0 -1
- package/dist/chunk-SQVYLIIN.js.map +0 -1
- package/dist/chunk-SUZ3ZLB2.js +0 -8
- package/dist/chunk-UNPEMSLK.js.map +0 -1
- package/dist/chunk-VAS3LH5W.js.map +0 -1
- package/dist/chunk-WDBCXRTT.mjs +0 -6
- package/dist/chunk-XQYC4KMH.mjs.map +0 -1
- package/dist/chunk-Z6S4MWSR.js.map +0 -1
- package/dist/cli/api/uptrade.d.ts.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
import { sonorFetch } from './chunk-
|
|
2
|
+
import { sonorFetch } from './chunk-HIHAXEPD.mjs';
|
|
3
3
|
import { useState, useRef, useMemo, useCallback, useEffect, useId } from 'react';
|
|
4
4
|
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
5
5
|
|
|
@@ -77,6 +77,42 @@ function MeetingFormatStep({ options, busy, format, address, onFormatChange, onA
|
|
|
77
77
|
` })
|
|
78
78
|
] });
|
|
79
79
|
}
|
|
80
|
+
function CalendarPlusIcon() {
|
|
81
|
+
return /* @__PURE__ */ jsxs("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [
|
|
82
|
+
/* @__PURE__ */ jsx("rect", { x: "1.5", y: "2.5", width: "13", height: "12", rx: "1.5", stroke: "currentColor", strokeWidth: "1.2" }),
|
|
83
|
+
/* @__PURE__ */ jsx("path", { d: "M1.5 6.5H14.5", stroke: "currentColor", strokeWidth: "1.2" }),
|
|
84
|
+
/* @__PURE__ */ jsx("path", { d: "M5 1V4M11 1V4", stroke: "currentColor", strokeWidth: "1.2", strokeLinecap: "round" }),
|
|
85
|
+
/* @__PURE__ */ jsx("path", { d: "M8 9V12M6.5 10.5H9.5", stroke: "currentColor", strokeWidth: "1.2", strokeLinecap: "round" })
|
|
86
|
+
] });
|
|
87
|
+
}
|
|
88
|
+
function AddToCalendar({ result }) {
|
|
89
|
+
if (result.booking.status === "pending") return null;
|
|
90
|
+
if (result.invitation === "google") {
|
|
91
|
+
const host = result.booking.hostName?.trim();
|
|
92
|
+
return /* @__PURE__ */ jsx("p", { className: "bw-invite-notice", children: host ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
93
|
+
"Your calendar invite is on its way from ",
|
|
94
|
+
/* @__PURE__ */ jsx("strong", { children: host }),
|
|
95
|
+
"."
|
|
96
|
+
] }) : "Your calendar invite is on its way." });
|
|
97
|
+
}
|
|
98
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
99
|
+
/* @__PURE__ */ jsx("p", { className: "bw-cal-links-label", children: "Add to your calendar" }),
|
|
100
|
+
/* @__PURE__ */ jsxs("div", { className: "bw-cal-links", children: [
|
|
101
|
+
/* @__PURE__ */ jsxs("a", { href: result.calendarLinks.google, target: "_blank", rel: "noopener noreferrer", className: "bw-cal-link", children: [
|
|
102
|
+
/* @__PURE__ */ jsx(CalendarPlusIcon, {}),
|
|
103
|
+
" Google"
|
|
104
|
+
] }),
|
|
105
|
+
/* @__PURE__ */ jsxs("a", { href: result.calendarLinks.outlook, target: "_blank", rel: "noopener noreferrer", className: "bw-cal-link", children: [
|
|
106
|
+
/* @__PURE__ */ jsx(CalendarPlusIcon, {}),
|
|
107
|
+
" Outlook"
|
|
108
|
+
] }),
|
|
109
|
+
/* @__PURE__ */ jsxs("a", { href: result.calendarLinks.ics, download: true, className: "bw-cal-link", children: [
|
|
110
|
+
/* @__PURE__ */ jsx(CalendarPlusIcon, {}),
|
|
111
|
+
" iCal"
|
|
112
|
+
] })
|
|
113
|
+
] })
|
|
114
|
+
] });
|
|
115
|
+
}
|
|
80
116
|
|
|
81
117
|
// src/sync/api.ts
|
|
82
118
|
var DEFAULT_API_URL = "https://api.sonor.io";
|
|
@@ -97,9 +133,7 @@ async function fetchBookingTypes(orgSlug, apiUrl, apiKey) {
|
|
|
97
133
|
const endpoint = key ? `${url}/sync/widget/types` : `${url}/sync/public/${orgSlug}/types`;
|
|
98
134
|
const response = await sonorFetch(endpoint, { headers: buildHeaders() }, { apiKey: key, retries: 0 });
|
|
99
135
|
if (!response.ok) {
|
|
100
|
-
|
|
101
|
-
const detail = msg && typeof msg.message === "string" ? msg.message : response.statusText;
|
|
102
|
-
throw new Error(`Failed to fetch booking types: ${response.status} ${detail}`);
|
|
136
|
+
throw await bookingRequestError(response, "We couldn't load the booking types. Please try again.");
|
|
103
137
|
}
|
|
104
138
|
const data = await response.json();
|
|
105
139
|
return data.types || [];
|
|
@@ -111,9 +145,7 @@ async function fetchBookingTypeDetails(typeSlug, orgSlug, apiUrl, apiKey) {
|
|
|
111
145
|
const endpoint = key ? `${url}/sync/widget/types/${typeSlug}` : `${url}/sync/public/${orgSlug}/types/${typeSlug}`;
|
|
112
146
|
const response = await sonorFetch(endpoint, { headers: buildHeaders() }, { apiKey: key, retries: 0 });
|
|
113
147
|
if (!response.ok) {
|
|
114
|
-
|
|
115
|
-
const detail = msg && typeof msg.message === "string" ? msg.message : response.statusText;
|
|
116
|
-
throw new Error(`Failed to fetch booking type: ${response.status} ${detail}`);
|
|
148
|
+
throw await bookingRequestError(response, "We couldn't load this meeting. Please try again.");
|
|
117
149
|
}
|
|
118
150
|
return response.json();
|
|
119
151
|
}
|
|
@@ -128,12 +160,7 @@ async function fetchAvailability(typeSlug, date, orgSlug, apiUrl, apiKey, timezo
|
|
|
128
160
|
const endpoint = key ? `${url}/sync/widget/availability/${typeSlug}?${params}` : `${url}/sync/public/${orgSlug}/availability/${typeSlug}?${params}`;
|
|
129
161
|
const response = await sonorFetch(endpoint, { headers: buildHeaders() }, { apiKey: key, retries: 0 });
|
|
130
162
|
if (!response.ok) {
|
|
131
|
-
|
|
132
|
-
let detail = msg && typeof msg.message === "string" ? String(msg.message).trim() : (response.statusText || "").trim();
|
|
133
|
-
if (detail === String(response.status) || /^\d+$/.test(detail)) detail = "";
|
|
134
|
-
const rest = detail ? `${response.status} ${detail}` : String(response.status);
|
|
135
|
-
const fallback = response.status === 404 && !detail ? "No times available. In the Portal, check Sync \u2192 Booking Types (Schedule a Tour) has a host assigned and the project API key is set for this site." : null;
|
|
136
|
-
throw new Error(fallback || `Failed to fetch availability: ${rest}`.trim());
|
|
163
|
+
throw await bookingRequestError(response, response.status === 404 ? "No times are available for this meeting. Please contact the host." : "We couldn't load available times. Please try again.");
|
|
137
164
|
}
|
|
138
165
|
const data = await response.json();
|
|
139
166
|
const raw = data.slots || [];
|
|
@@ -146,8 +173,9 @@ async function fetchAvailability(typeSlug, date, orgSlug, apiUrl, apiKey, timezo
|
|
|
146
173
|
}
|
|
147
174
|
async function bookingRequestError(response, fallback) {
|
|
148
175
|
const body = await response.json().catch(() => ({}));
|
|
149
|
-
const
|
|
150
|
-
|
|
176
|
+
const raw = body?.error?.message ?? body?.message;
|
|
177
|
+
const message = Array.isArray(raw) ? raw.filter((value) => typeof value === "string").join(". ") : raw;
|
|
178
|
+
return new Error(typeof message === "string" && message.trim() && !/^\d+$/.test(message.trim()) ? message.trim() : fallback);
|
|
151
179
|
}
|
|
152
180
|
async function createSlotHold(holdData, apiUrl, apiKey) {
|
|
153
181
|
const cfg = getApiConfig();
|
|
@@ -334,14 +362,6 @@ function CheckCircleIcon() {
|
|
|
334
362
|
/* @__PURE__ */ jsx("path", { d: "M18 28.5L24.5 35L38 21.5", stroke: "white", strokeWidth: "3", strokeLinecap: "round", strokeLinejoin: "round" })
|
|
335
363
|
] });
|
|
336
364
|
}
|
|
337
|
-
function CalendarPlusIcon() {
|
|
338
|
-
return /* @__PURE__ */ jsxs("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [
|
|
339
|
-
/* @__PURE__ */ jsx("rect", { x: "1.5", y: "2.5", width: "13", height: "12", rx: "1.5", stroke: "currentColor", strokeWidth: "1.2" }),
|
|
340
|
-
/* @__PURE__ */ jsx("path", { d: "M1.5 6.5H14.5", stroke: "currentColor", strokeWidth: "1.2" }),
|
|
341
|
-
/* @__PURE__ */ jsx("path", { d: "M5 1V4M11 1V4", stroke: "currentColor", strokeWidth: "1.2", strokeLinecap: "round" }),
|
|
342
|
-
/* @__PURE__ */ jsx("path", { d: "M8 9V12M6.5 10.5H9.5", stroke: "currentColor", strokeWidth: "1.2", strokeLinecap: "round" })
|
|
343
|
-
] });
|
|
344
|
-
}
|
|
345
365
|
function ArrowLeftIcon() {
|
|
346
366
|
return /* @__PURE__ */ jsx("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ jsx("path", { d: "M10 3L5 8L10 13", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }) });
|
|
347
367
|
}
|
|
@@ -1025,23 +1045,7 @@ function BookingWidget({
|
|
|
1025
1045
|
/* @__PURE__ */ jsx("strong", { children: guestInfo.email }),
|
|
1026
1046
|
"."
|
|
1027
1047
|
] }),
|
|
1028
|
-
|
|
1029
|
-
/* @__PURE__ */ jsx("p", { className: "bw-cal-links-label", children: "Add to your calendar" }),
|
|
1030
|
-
/* @__PURE__ */ jsxs("div", { className: "bw-cal-links", children: [
|
|
1031
|
-
/* @__PURE__ */ jsxs("a", { href: bookingResult.calendarLinks.google, target: "_blank", rel: "noopener noreferrer", className: "bw-cal-link", children: [
|
|
1032
|
-
/* @__PURE__ */ jsx(CalendarPlusIcon, {}),
|
|
1033
|
-
" Google"
|
|
1034
|
-
] }),
|
|
1035
|
-
/* @__PURE__ */ jsxs("a", { href: bookingResult.calendarLinks.outlook, target: "_blank", rel: "noopener noreferrer", className: "bw-cal-link", children: [
|
|
1036
|
-
/* @__PURE__ */ jsx(CalendarPlusIcon, {}),
|
|
1037
|
-
" Outlook"
|
|
1038
|
-
] }),
|
|
1039
|
-
/* @__PURE__ */ jsxs("a", { href: bookingResult.calendarLinks.ics, download: true, className: "bw-cal-link", children: [
|
|
1040
|
-
/* @__PURE__ */ jsx(CalendarPlusIcon, {}),
|
|
1041
|
-
" iCal"
|
|
1042
|
-
] })
|
|
1043
|
-
] })
|
|
1044
|
-
] }),
|
|
1048
|
+
/* @__PURE__ */ jsx(AddToCalendar, { result: bookingResult }),
|
|
1045
1049
|
(bookingResult.rescheduleUrl || bookingResult.cancelUrl) && /* @__PURE__ */ jsxs("p", { className: "bw-manage-links", children: [
|
|
1046
1050
|
"Need to change it?",
|
|
1047
1051
|
" ",
|
|
@@ -1396,6 +1400,8 @@ var WIDGET_CSS = `
|
|
|
1396
1400
|
transition: all 0.15s;
|
|
1397
1401
|
}
|
|
1398
1402
|
.bw-cal-link:hover { border-color: var(--sk-primary); color: var(--sk-primary); }
|
|
1403
|
+
.bw-invite-notice { font-size: 0.8125rem; color: var(--sk-text-secondary); margin: 0 0 20px 0; }
|
|
1404
|
+
.bw-invite-notice strong { color: var(--sk-text-primary); font-weight: 500; }
|
|
1399
1405
|
|
|
1400
1406
|
.bw-email-notice { font-size: 0.8125rem; color: var(--sk-text-tertiary); margin: 0 0 16px 0; }
|
|
1401
1407
|
.bw-email-notice strong { color: var(--sk-text-primary); font-weight: 500; }
|
|
@@ -1406,5 +1412,5 @@ var WIDGET_CSS = `
|
|
|
1406
1412
|
`;
|
|
1407
1413
|
|
|
1408
1414
|
export { BookingWidget, createBooking, createSlotHold, detectTimezone, fetchAvailability, fetchAvailableDates, fetchBookingTypeDetails, fetchBookingTypes, formatDate, formatDuration, formatTime, prepareMeeting, releaseSlotHold };
|
|
1409
|
-
//# sourceMappingURL=chunk-
|
|
1410
|
-
//# sourceMappingURL=chunk-
|
|
1415
|
+
//# sourceMappingURL=chunk-VHZ4LHQT.mjs.map
|
|
1416
|
+
//# sourceMappingURL=chunk-VHZ4LHQT.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/sync/MeetingFormatStep.tsx","../src/sync/AddToCalendar.tsx","../src/sync/api.ts","../src/sync/booking-flow.ts","../src/sync/BookingWidget.tsx"],"names":["jsxs","jsx","DEFAULT_API_URL","Fragment"],"mappings":"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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA","file":"chunk-VHZ4LHQT.mjs","sourcesContent":["'use client'\n\nimport React, { useId } from 'react'\nimport type { MeetingFormat, MeetingOptions, MeetingAddress } from './types'\n\nexport function MeetingFormatStep({ options, busy, format, address, onFormatChange, onAddressChange, onContinue, onBack }: {\n options: MeetingOptions\n busy: boolean\n format: MeetingFormat | null\n address: MeetingAddress\n onFormatChange: (format: MeetingFormat) => void\n onAddressChange: (address: MeetingAddress) => void\n onContinue: (format: MeetingFormat, address?: MeetingAddress) => void\n onBack?: () => void\n}) {\n const id = useId()\n const choices: { value: MeetingFormat; label: string; description: string }[] = [\n { value: 'virtual', label: 'Virtual', description: 'Meet online with a Google Meet link.' },\n { value: 'office', label: 'Come to us', description: 'Meet in person at our office.' },\n { value: 'client_location', label: 'We come to you', description: `We can meet at your location within about ${options.travel_radius_miles} miles of our office.` },\n ]\n return <form onSubmit={e => { e.preventDefault(); if (format) onContinue(format, format === 'client_location' ? address : undefined) }} className=\"bw-step sk-meeting-step\">\n {onBack && <button type=\"button\" className=\"bw-back sk-meeting-change\" onClick={onBack} disabled={busy}>← Change service</button>}\n <h2 className=\"bw-heading\">How would you like to meet?</h2>\n <fieldset disabled={busy} className=\"sk-meeting-choices\">\n <legend className=\"sk-meeting-legend\">Meeting format</legend>\n {choices.map(choice => <label key={choice.value} className={`sk-meeting-choice ${format === choice.value ? 'sk-meeting-selected' : ''}`}>\n <input type=\"radio\" name={`${id}-format`} value={choice.value} checked={format === choice.value} onChange={() => onFormatChange(choice.value)} required />\n <span><strong>{choice.label}</strong><span>{choice.description}</span></span>\n </label>)}\n </fieldset>\n {format === 'office' && <div className=\"sk-meeting-address\">\n <p>{options.office_address}</p>\n <p>{options.office_instructions}</p>\n <a href={`https://www.google.com/maps/search/?api=1&query=${encodeURIComponent(options.office_address)}`} target=\"_blank\" rel=\"noopener noreferrer\">Get directions</a>\n </div>}\n {format === 'client_location' && <fieldset disabled={busy} className=\"bw-form sk-meeting-fields\">\n <legend>Your meeting address</legend>\n {([\n ['street', 'Street address', 'street-address'], ['unit', 'Suite or unit (optional)', 'address-line2'],\n ['city', 'City', 'address-level2'], ['region', 'State or region', 'address-level1'],\n ['postalCode', 'Postal code', 'postal-code'], ['country', 'Country', 'country-name'],\n ] as const).map(([key, label, autocomplete]) => <div className=\"bw-field\" key={key}>\n <label htmlFor={`${id}-${key}`}>{label}</label>\n <input id={`${id}-${key}`} value={address[key]} required={key !== 'unit'} maxLength={200} autoComplete={autocomplete}\n onChange={e => onAddressChange({ ...address, [key]: e.target.value })} />\n </div>)}\n <div className=\"bw-field\"><label htmlFor={`${id}-notes`}>Parking or access notes (optional)</label>\n <textarea id={`${id}-notes`} value={address.notes} maxLength={2000} onChange={e => onAddressChange({ ...address, notes: e.target.value })} />\n </div>\n {options.travel_review_required && <p>We’ll reserve your requested time and confirm after checking travel arrangements.</p>}\n </fieldset>}\n <button className=\"bw-submit\" type=\"submit\" disabled={!format || busy}>{busy ? 'Checking meeting details…' : 'Choose a time'}</button>\n <style>{`\n .sk-meeting-choices { border: 0; padding: 0; margin: 20px 0; display: grid; gap: 10px; }\n .sk-meeting-legend { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); }\n .sk-meeting-choice { display: flex; align-items: flex-start; gap: 12px; padding: 16px; border: 1px solid var(--sk-border); border-radius: var(--sk-radius); cursor: pointer; background: var(--sk-surface); }\n .sk-meeting-choice input { margin-top: 4px; accent-color: var(--sk-primary); }\n .sk-meeting-choice strong { display: block; color: var(--sk-text-primary); }\n .sk-meeting-choice span span { display: block; margin-top: 4px; font-size: 14px; color: var(--sk-text-secondary); }\n .sk-meeting-selected { border-color: var(--sk-primary); background: var(--sk-primary-light); }\n .sk-meeting-address { padding: 16px; background: var(--sk-surface); border-radius: var(--sk-radius); margin-bottom: 16px; white-space: pre-wrap; }\n .sk-meeting-address a { display: inline-block; margin-top: 8px; color: var(--sk-primary); }\n .sk-meeting-fields { border: 0; padding: 0; margin-bottom: 20px; }\n .sk-meeting-fields legend { margin-bottom: 12px; font-weight: 600; }\n .sk-meeting-step .bw-submit { width: 100%; }\n `}</style>\n </form>\n}\n","'use client'\n\nimport React from 'react'\nimport type { BookingResult } from './types'\n\nexport function CalendarPlusIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"1.5\" y=\"2.5\" width=\"13\" height=\"12\" rx=\"1.5\" stroke=\"currentColor\" strokeWidth=\"1.2\"/>\n <path d=\"M1.5 6.5H14.5\" stroke=\"currentColor\" strokeWidth=\"1.2\"/>\n <path d=\"M5 1V4M11 1V4\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\"/>\n <path d=\"M8 9V12M6.5 10.5H9.5\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\"/>\n </svg>\n )\n}\n\n/**\n * The success screen's calendar block: the single place that decides how a\n * guest gets the meeting onto their calendar, so they end up with one entry.\n *\n * When `invitation` is 'google', the host's Google Calendar has already sent\n * the guest an invitation. The Google and Outlook links build a separate\n * personal event with no tie to it, so a guest who clicked one had two entries\n * for the same meeting. The guest is told who the invite is from instead.\n *\n * Sonor-issued invitations, and APIs too old to send `invitation`, keep the\n * links. A pending request shows neither, because the time isn't confirmed.\n */\nexport function AddToCalendar({ result }: { result: BookingResult }) {\n if (result.booking.status === 'pending') return null\n if (result.invitation === 'google') {\n const host = result.booking.hostName?.trim()\n return (\n <p className=\"bw-invite-notice\">\n {host ? <>Your calendar invite is on its way from <strong>{host}</strong>.</> : 'Your calendar invite is on its way.'}\n </p>\n )\n }\n return (\n <>\n <p className=\"bw-cal-links-label\">Add to your calendar</p>\n <div className=\"bw-cal-links\">\n <a href={result.calendarLinks.google} target=\"_blank\" rel=\"noopener noreferrer\" className=\"bw-cal-link\">\n <CalendarPlusIcon /> Google\n </a>\n <a href={result.calendarLinks.outlook} target=\"_blank\" rel=\"noopener noreferrer\" className=\"bw-cal-link\">\n <CalendarPlusIcon /> Outlook\n </a>\n <a href={result.calendarLinks.ics} download className=\"bw-cal-link\">\n <CalendarPlusIcon /> iCal\n </a>\n </div>\n </>\n )\n}\n","import type { MeetingFormat, MeetingAddress, PreparedMeeting } from './types'\n/**\n * Sync API Functions - Client-side API calls for booking widget\n *\n * Two modes:\n * 1. API-key flow (preferred): Uses x-api-key header → /sync/widget/* endpoints.\n * Project is resolved server-side from the key. No orgSlug needed.\n * 2. Public/orgSlug flow (legacy): Uses /sync/public/:org/* endpoints. No auth.\n */\n\nimport { sonorFetch } from '../shared/sonorFetch'\nimport type {\n BookingType,\n TimeSlot,\n SlotHold,\n BookingResult,\n GuestInfo,\n} from './types'\n\nconst DEFAULT_API_URL = 'https://api.sonor.io'\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Config helper (same pattern as analytics, commerce, engage)\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction getApiConfig() {\n const apiUrl = typeof window !== 'undefined'\n ? (window as any).__SITE_KIT_API_URL__ || DEFAULT_API_URL\n : DEFAULT_API_URL\n const apiKey = typeof window !== 'undefined'\n ? (window as any).__SITE_KIT_API_KEY__\n : undefined\n return { apiUrl, apiKey }\n}\n\n/**\n * Build headers – only Content-Type for POSTs. The credential is NOT set here:\n * it's passed to sonorFetch via options.apiKey so a stale minted-token seed is\n * refreshed transparently (a hand-set x-api-key header would pin the stale seed\n * and 401). The public/orgSlug flow simply passes no key and stays unauthed.\n */\nfunction buildHeaders(isPost = false): Record<string, string> {\n const headers: Record<string, string> = {}\n if (isPost) headers['Content-Type'] = 'application/json'\n return headers\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Read endpoints\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Fetch booking types.\n * - With apiKey → GET /sync/widget/types\n * - With orgSlug → GET /sync/public/:org/types\n */\nexport async function fetchBookingTypes(\n orgSlug?: string,\n apiUrl?: string,\n apiKey?: string,\n): Promise<BookingType[]> {\n const cfg = getApiConfig()\n const url = apiUrl || cfg.apiUrl\n const key = apiKey || cfg.apiKey\n\n const endpoint = key\n ? `${url}/sync/widget/types`\n : `${url}/sync/public/${orgSlug}/types`\n\n const response = await sonorFetch(endpoint, { headers: buildHeaders() }, { apiKey: key, retries: 0 })\n \n if (!response.ok) {\n throw await bookingRequestError(response, \"We couldn't load the booking types. Please try again.\")\n }\n \n const data = await response.json()\n return data.types || []\n}\n\n/**\n * Fetch booking type details\n */\nexport async function fetchBookingTypeDetails(\n typeSlug: string,\n orgSlug?: string,\n apiUrl?: string,\n apiKey?: string,\n): Promise<BookingType> {\n const cfg = getApiConfig()\n const url = apiUrl || cfg.apiUrl\n const key = apiKey || cfg.apiKey\n\n const endpoint = key\n ? `${url}/sync/widget/types/${typeSlug}`\n : `${url}/sync/public/${orgSlug}/types/${typeSlug}`\n\n const response = await sonorFetch(endpoint, { headers: buildHeaders() }, { apiKey: key, retries: 0 })\n \n if (!response.ok) {\n throw await bookingRequestError(response, \"We couldn't load this meeting. Please try again.\")\n }\n \n return response.json()\n}\n\n/**\n * Fetch available time slots for a specific date\n */\nexport async function fetchAvailability(\n typeSlug: string,\n date: string, // YYYY-MM-DD format\n orgSlug?: string,\n apiUrl?: string,\n apiKey?: string,\n timezone?: string,\n hostId?: string,\n meetingToken?: string,\n): Promise<TimeSlot[]> {\n const cfg = getApiConfig()\n const url = apiUrl || cfg.apiUrl\n const key = apiKey || cfg.apiKey\n\n const params = new URLSearchParams({ date })\n if (timezone) params.append('timezone', timezone)\n if (hostId) params.append('hostId', hostId)\n if (meetingToken) params.append('meetingToken', meetingToken)\n\n const endpoint = key\n ? `${url}/sync/widget/availability/${typeSlug}?${params}`\n : `${url}/sync/public/${orgSlug}/availability/${typeSlug}?${params}`\n\n const response = await sonorFetch(endpoint, { headers: buildHeaders() }, { apiKey: key, retries: 0 })\n \n if (!response.ok) {\n throw await bookingRequestError(response, response.status === 404\n ? 'No times are available for this meeting. Please contact the host.'\n : \"We couldn't load available times. Please try again.\")\n }\n \n const data = await response.json()\n const raw = data.slots || []\n // Normalize API shape (startTime/endTime, no available) to widget shape (start/end, available)\n return raw.map((slot: Record<string, unknown>) => ({\n start: slot.startTime ?? slot.start,\n end: slot.endTime ?? slot.end,\n hostId: slot.hostId,\n available: slot.available !== false,\n })) as TimeSlot[]\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Write endpoints\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** Single source of truth for Sync errors across format, availability and reservation requests. */\nasync function bookingRequestError(response: Response, fallback: string): Promise<Error> {\n const body = await response.json().catch(() => ({}))\n // Sonor's global exception filter wraps errors; older APIs returned them flat.\n const raw = body?.error?.message ?? body?.message\n const message = Array.isArray(raw) ? raw.filter(value => typeof value === 'string').join('. ') : raw\n return new Error(typeof message === 'string' && message.trim() && !/^\\d+$/.test(message.trim())\n ? message.trim() : fallback)\n}\n\n/**\n * Hold a time slot temporarily (5-10 minutes)\n */\nexport async function createSlotHold(\n holdData: {\n meetingToken?: string\n org?: string\n bookingType: string\n slotStart: string\n slotEnd: string\n hostId: string\n sessionId: string\n guestEmail?: string\n },\n apiUrl?: string,\n apiKey?: string,\n): Promise<SlotHold> {\n const cfg = getApiConfig()\n const url = apiUrl || cfg.apiUrl\n const key = apiKey || cfg.apiKey\n\n const endpoint = key\n ? `${url}/sync/widget/hold`\n : `${url}/sync/public/hold`\n\n const response = await sonorFetch(endpoint, {\n method: 'POST',\n headers: buildHeaders(true),\n body: JSON.stringify(holdData),\n }, { apiKey: key, retries: 0 })\n\n if (!response.ok) {\n throw await bookingRequestError(response, 'We couldn’t reserve that time. Please choose another time.')\n }\n \n return response.json()\n}\n\n/**\n * Release a slot hold\n */\nexport async function releaseSlotHold(\n holdId: string,\n apiUrl?: string,\n apiKey?: string,\n): Promise<void> {\n const cfg = getApiConfig()\n const url = apiUrl || cfg.apiUrl\n const key = apiKey || cfg.apiKey\n\n const endpoint = key\n ? `${url}/sync/widget/hold/${holdId}`\n : `${url}/sync/public/hold/${holdId}`\n\n await sonorFetch(endpoint, {\n method: 'DELETE',\n headers: buildHeaders(),\n }, { apiKey: key, retries: 0 })\n}\n\n/**\n * Create a booking\n */\nexport async function createBooking(\n bookingData: {\n meetingToken?: string\n org?: string\n bookingType: string\n scheduledAt: string\n hostId: string\n name: string\n email: string\n phone?: string\n company?: string\n message?: string\n source: string\n timezone?: string\n holdId?: string\n sessionId?: string\n sourceUrl?: string\n },\n apiUrl?: string,\n apiKey?: string,\n): Promise<BookingResult> {\n const cfg = getApiConfig()\n const url = apiUrl || cfg.apiUrl\n const key = apiKey || cfg.apiKey\n\n const endpoint = key\n ? `${url}/sync/widget/booking`\n : `${url}/sync/public/booking`\n\n const response = await sonorFetch(endpoint, {\n method: 'POST',\n headers: buildHeaders(true),\n body: JSON.stringify(bookingData),\n }, { apiKey: key, retries: 0 })\n\n if (!response.ok) {\n throw await bookingRequestError(response, 'We couldn’t complete your booking. Please try again.')\n }\n \n return response.json()\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Utility helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Get available dates for a month (helper for calendar view)\n * Returns dates that have at least one available slot\n */\nexport async function fetchAvailableDates(\n typeSlug: string,\n startDate: string, // YYYY-MM-DD\n endDate: string, // YYYY-MM-DD\n orgSlug?: string,\n apiUrl?: string,\n apiKey?: string,\n timezone?: string,\n meetingToken?: string,\n): Promise<string[]> {\n const availableDates: string[] = []\n // startDate/endDate are YYYY-MM-DD → parsed as UTC midnight. Keep the whole loop\n // in UTC (getUTCDate/setUTCDate + toISOString) so day-stepping matches the date\n // string we read back — mixing in local getDate/setDate can skip or duplicate a\n // day across a DST boundary.\n const start = new Date(startDate)\n const end = new Date(endDate)\n\n const current = new Date(start)\n while (current <= end) {\n const dateStr = current.toISOString().split('T')[0]\n\n try {\n const slots = await fetchAvailability(typeSlug, dateStr, orgSlug, apiUrl, apiKey, timezone, undefined, meetingToken)\n if (slots.some(s => s.available)) {\n availableDates.push(dateStr)\n }\n } catch {\n // Skip dates that fail to load\n }\n\n current.setUTCDate(current.getUTCDate() + 1)\n }\n\n return availableDates\n}\n\n/**\n * Detect user's timezone\n */\nexport function detectTimezone(): string {\n try {\n return Intl.DateTimeFormat().resolvedOptions().timeZone\n } catch {\n return 'America/New_York'\n }\n}\n\n/**\n * Format time for display\n */\nexport function formatTime(isoString: string, timezone: string): string {\n const date = new Date(isoString)\n return date.toLocaleTimeString('en-US', {\n hour: 'numeric',\n minute: '2-digit',\n hour12: true,\n timeZone: timezone,\n })\n}\n\n/**\n * Format date for display\n */\nexport function formatDate(isoString: string, timezone: string): string {\n const date = new Date(isoString)\n return date.toLocaleDateString('en-US', {\n weekday: 'long',\n month: 'long',\n day: 'numeric',\n year: 'numeric',\n timeZone: timezone,\n })\n}\n\n/**\n * Format duration for display\n */\nexport function formatDuration(minutes: number): string {\n if (minutes < 60) {\n return `${minutes} min`\n }\n const hours = Math.floor(minutes / 60)\n const mins = minutes % 60\n if (mins === 0) {\n return `${hours} hour${hours > 1 ? 's' : ''}`\n }\n return `${hours}h ${mins}m`\n}\n\n/** Resolve and validate the location before exposing appointment times. */\nexport async function prepareMeeting(bookingType: string, format: MeetingFormat, address: MeetingAddress | undefined,\n orgSlug?: string, apiUrl?: string, apiKey?: string): Promise<PreparedMeeting> {\n const cfg = getApiConfig()\n const url = apiUrl || cfg.apiUrl\n const key = apiKey || cfg.apiKey\n const endpoint = key ? `${url}/sync/widget/meeting` : `${url}/sync/public/${orgSlug}/meeting`\n const response = await sonorFetch(endpoint, { method: 'POST', headers: buildHeaders(true),\n body: JSON.stringify({ bookingType, format, address }),\n }, { apiKey: key, retries: 0 })\n if (!response.ok) {\n throw await bookingRequestError(response, 'We couldn’t check your meeting details. Please try again.')\n }\n return response.json()\n}\n","import type { PreparedMeeting, SlotHold } from './types'\n\nexport type BookingRecovery = 'meeting' | 'hold'\n\n/** A valid hold carries its prepared meeting context, even after the intent expires. */\nexport function expiredBookingContext(meeting: PreparedMeeting | null, hold: SlotHold | null, now = Date.now()): BookingRecovery | null {\n if (hold) return Date.parse(hold.expiresAt) <= now ? 'hold' : null\n return meeting && Date.parse(meeting.expiresAt) <= now ? 'meeting' : null\n}\n\n/** Single source of truth for the API's recoverable reservation errors. */\nexport function bookingRecoveryFromError(error: unknown): BookingRecovery | null {\n const message = error instanceof Error ? error.message : ''\n if (/meeting details expired|choose how you.d like to meet first/i.test(message)) return 'meeting'\n if (/time reservation expired|invalid slot hold|meeting details changed/i.test(message)) return 'hold'\n return null\n}\n","'use client'\n\n/**\n * BookingWidget - Premium embeddable booking widget for client sites\n *\n * Calendly-inspired scheduling experience:\n * 1. Full month calendar for date selection\n * 2. Scrollable time-slot column\n * 3. Polished guest information form\n * 4. Animated booking confirmation\n *\n * Ships with self-contained CSS (no external deps) so it works on any site.\n *\n * @example\n * ```tsx\n * import { BookingWidget } from '@sonordev/site-kit'\n *\n * <BookingWidget\n * orgSlug=\"manhattan-development-group\"\n * bookingTypeSlug=\"schedule-a-tour\"\n * hideTypeSelector\n * onBookingComplete={(r) => console.log(r)}\n * />\n * ```\n */\n\nimport { MeetingFormatStep } from './MeetingFormatStep'\nimport { AddToCalendar, CalendarPlusIcon } from './AddToCalendar'\nimport { prepareMeeting } from './api'\nimport { bookingRecoveryFromError, expiredBookingContext } from './booking-flow'\nimport type { BookingRecovery } from './booking-flow'\nimport type { MeetingFormat, MeetingAddress, PreparedMeeting } from './types'\nimport * as React from 'react'\nimport { useState, useEffect, useCallback, useMemo, useRef } from 'react'\nimport type {\n BookingWidgetProps,\n BookingType,\n TimeSlot,\n GuestInfo,\n BookingResult,\n SlotHold,\n} from './types'\nimport {\n fetchBookingTypes,\n fetchBookingTypeDetails,\n fetchAvailability,\n createSlotHold,\n releaseSlotHold,\n createBooking,\n detectTimezone,\n formatTime,\n formatDate,\n formatDuration,\n} from './api'\n\n// ─── Constants ─────────────────────────────────────────────────────────────────\n\nconst DEFAULT_API_URL = 'https://api.sonor.io'\nconst DAYS = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'] as const\nconst MONTHS = [\n 'January','February','March','April','May','June',\n 'July','August','September','October','November','December',\n] as const\n\ntype BookingStep = 'format' | 'type' | 'datetime' | 'form' | 'success'\n\n// ─── Helpers ───────────────────────────────────────────────────────────────────\n\nfunction isSameDay(a: Date, b: Date) {\n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n )\n}\n\nfunction isBeforeDay(a: Date, b: Date) {\n const ac = new Date(a.getFullYear(), a.getMonth(), a.getDate())\n const bc = new Date(b.getFullYear(), b.getMonth(), b.getDate())\n return ac < bc\n}\n\nfunction calendarDays(year: number, month: number): (Date | null)[] {\n const first = new Date(year, month, 1)\n const last = new Date(year, month + 1, 0)\n const cells: (Date | null)[] = []\n for (let i = 0; i < first.getDay(); i++) cells.push(null) // leading blanks\n for (let d = 1; d <= last.getDate(); d++) cells.push(new Date(year, month, d))\n return cells\n}\n\n/**\n * Format a Date as YYYY-MM-DD from its LOCAL calendar components. The calendar\n * cells are local-midnight Dates (new Date(year, month, day)); toISOString()\n * would convert to UTC and roll back a day for any guest east of UTC, sending\n * the wrong date to the availability API. Always format the clicked day locally.\n */\nfunction toLocalDateStr(d: Date): string {\n const y = d.getFullYear()\n const m = String(d.getMonth() + 1).padStart(2, '0')\n const day = String(d.getDate()).padStart(2, '0')\n return `${y}-${m}-${day}`\n}\n\n// ─── SVG Icons (inline, no deps) ──────────────────────────────────────────────\n\nfunction ChevronLeft() {\n return (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M12.5 15L7.5 10L12.5 5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n )\n}\n\nfunction ChevronRight() {\n return (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M7.5 5L12.5 10L7.5 15\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n )\n}\n\nfunction ClockIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"8\" cy=\"8\" r=\"6.5\" stroke=\"currentColor\" strokeWidth=\"1.2\"/>\n <path d=\"M8 4.5V8L10 10\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n )\n}\n\nfunction GlobeIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"8\" cy=\"8\" r=\"6.5\" stroke=\"currentColor\" strokeWidth=\"1.2\"/>\n <path d=\"M1.5 8H14.5\" stroke=\"currentColor\" strokeWidth=\"1.2\"/>\n <path d=\"M8 1.5C9.66 3.34 10.61 5.62 10.61 8C10.61 10.38 9.66 12.66 8 14.5C6.34 12.66 5.39 10.38 5.39 8C5.39 5.62 6.34 3.34 8 1.5Z\" stroke=\"currentColor\" strokeWidth=\"1.2\"/>\n </svg>\n )\n}\n\nfunction CheckCircleIcon() {\n return (\n <svg width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"28\" cy=\"28\" r=\"28\" fill=\"var(--sk-primary)\"/>\n <path d=\"M18 28.5L24.5 35L38 21.5\" stroke=\"white\" strokeWidth=\"3\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n )\n}\n\nfunction ArrowLeftIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 3L5 8L10 13\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n )\n}\n\nfunction SpinnerIcon() {\n return (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" className=\"bw-spinner\">\n <circle cx=\"10\" cy=\"10\" r=\"8\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeDasharray=\"50.265\" strokeDashoffset=\"25\" opacity=\"0.3\"/>\n <circle cx=\"10\" cy=\"10\" r=\"8\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeDasharray=\"50.265\" strokeDashoffset=\"37.7\"/>\n </svg>\n )\n}\n\n// ─── Component ─────────────────────────────────────────────────────────────────\n\nexport function BookingWidget({\n orgSlug,\n apiKey: propApiKey,\n apiUrl: propApiUrl,\n bookingTypeSlug,\n timezone: propTimezone,\n className = '',\n daysToShow = 60,\n onBookingComplete,\n onError,\n hideTypeSelector = false,\n autoSelectFirstDay = true,\n styles = {},\n}: BookingWidgetProps) {\n // Resolve API key: prop > window global\n const apiKey = propApiKey || (typeof window !== 'undefined' ? (window as any).__SITE_KIT_API_KEY__ : undefined)\n const apiUrl = propApiUrl || (typeof window !== 'undefined' ? (window as any).__SITE_KIT_API_URL__ : undefined) || DEFAULT_API_URL\n // ── State ──\n const [step, setStep] = useState<BookingStep>(bookingTypeSlug ? 'datetime' : 'type')\n const [loading, setLoading] = useState(false)\n const [slotsLoading, setSlotsLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n const [bookingTypes, setBookingTypes] = useState<BookingType[]>([])\n const [selectedType, setSelectedType] = useState<BookingType | null>(null)\n const [viewMonth, setViewMonth] = useState(() => new Date())\n const [selectedDate, setSelectedDate] = useState<Date | null>(null)\n const [slots, setSlots] = useState<TimeSlot[]>([])\n const [selectedSlot, setSelectedSlot] = useState<TimeSlot | null>(null)\n const [confirmedSlot, setConfirmedSlot] = useState(false)\n const [hold, setHold] = useState<SlotHold | null>(null)\n const [guestInfo, setGuestInfo] = useState<GuestInfo>({ name: '', email: '' })\n const [bookingResult, setBookingResult] = useState<BookingResult | null>(null)\n const [submitting, setSubmitting] = useState(false)\n const [meeting, setMeeting] = useState<PreparedMeeting | null>(null)\n const [meetingFormat, setMeetingFormat] = useState<MeetingFormat | null>(null)\n const [meetingAddress, setMeetingAddress] = useState<MeetingAddress>({ street: '', city: '', region: '', postalCode: '', country: 'United States', unit: '', notes: '' })\n const [recovery, setRecovery] = useState<BookingRecovery | null>(null)\n const [sessionId] = useState(() => `bw-${Date.now()}-${Math.random().toString(36).slice(2)}`)\n const requestRef = useRef(0)\n const busyRef = useRef(false)\n const bookingInFlightRef = useRef(false)\n const holdRef = useRef<SlotHold | null>(null)\n const onErrorRef = useRef(onError)\n onErrorRef.current = onError\n // Auto-select probe: finding the first day with open slots\n const [autoProbing, setAutoProbing] = useState(false)\n const probeRef = useRef(0)\n const prefetchedRef = useRef<{ dateStr: string; slots: TimeSlot[] } | null>(null)\n\n const slotsRef = useRef<HTMLDivElement>(null)\n const today = useMemo(() => { const d = new Date(); d.setHours(0,0,0,0); return d }, [])\n const timezone = useMemo(() => propTimezone || detectTimezone(), [propTimezone])\n\n const shortTz = useMemo(() => {\n try {\n const parts = Intl.DateTimeFormat('en-US', { timeZone: timezone, timeZoneName: 'short' })\n .formatToParts(new Date())\n return parts.find(p => p.type === 'timeZoneName')?.value || timezone\n } catch { return timezone }\n }, [timezone])\n\n // Calendar grid for the current view month\n const days = useMemo(() => calendarDays(viewMonth.getFullYear(), viewMonth.getMonth()), [viewMonth])\n const maxDate = useMemo(() => { const d = new Date(today); d.setDate(d.getDate() + daysToShow); return d }, [today, daysToShow])\n\n const setActiveHold = useCallback((value: SlotHold | null) => {\n holdRef.current = value\n setHold(value)\n }, [])\n\n // Single reset path for changing services, formats, times, and expired reservations.\n const resetScheduling = useCallback((nextStep: BookingStep, clearMeeting = false) => {\n ++requestRef.current\n const previous = holdRef.current\n setActiveHold(null)\n if (previous) releaseSlotHold(previous.holdId, apiUrl, apiKey).catch(() => {})\n setSelectedDate(null)\n setSelectedSlot(null)\n setConfirmedSlot(false)\n setSlots([])\n setSlotsLoading(false)\n prefetchedRef.current = null\n if (clearMeeting) setMeeting(null)\n setRecovery(null)\n setError(null)\n setStep(nextStep)\n }, [apiUrl, apiKey, setActiveHold])\n\n const reportRequestError = useCallback((err: Error) => {\n setRecovery(bookingRecoveryFromError(err))\n setError(err.message)\n onErrorRef.current?.(err)\n }, [])\n\n useEffect(() => () => {\n ++requestRef.current\n // A submitted booking must finish on the server. Other abandoned holds can be released.\n if (holdRef.current && !bookingInFlightRef.current) {\n releaseSlotHold(holdRef.current.holdId, apiUrl, apiKey).catch(() => {})\n }\n holdRef.current = null\n }, [apiUrl, apiKey])\n\n // ── Data Loading ──\n\n useEffect(() => {\n let cancelled = false\n ++requestRef.current\n busyRef.current = false\n bookingInFlightRef.current = false\n resetScheduling(bookingTypeSlug ? 'datetime' : 'type', true)\n setSelectedType(null)\n setMeetingFormat(null)\n setBookingResult(null)\n setSubmitting(false)\n if (bookingTypeSlug) {\n setLoading(true)\n fetchBookingTypeDetails(bookingTypeSlug, orgSlug, apiUrl, apiKey)\n .then(type => { if (!cancelled) { setSelectedType(type); setStep(type.meeting_options ? 'format' : 'datetime') } })\n .catch(err => { if (!cancelled) reportRequestError(err) })\n .finally(() => { if (!cancelled) setLoading(false) })\n } else {\n setLoading(true)\n fetchBookingTypes(orgSlug, apiUrl, apiKey)\n .then(types => { if (!cancelled) setBookingTypes(types.filter(t => t.is_active)) })\n .catch(err => { if (!cancelled) reportRequestError(err) })\n .finally(() => { if (!cancelled) setLoading(false) })\n }\n return () => { cancelled = true; ++requestRef.current }\n }, [orgSlug, apiKey, bookingTypeSlug, apiUrl, resetScheduling, reportRequestError])\n\n useEffect(() => {\n if (!selectedDate || !selectedType || (selectedType.meeting_options && !meeting)) return\n const dateStr = toLocalDateStr(selectedDate)\n setSelectedSlot(null)\n setConfirmedSlot(false)\n\n // The auto-select probe already fetched this day — reuse its slots\n const prefetched = prefetchedRef.current\n if (prefetched && prefetched.dateStr === dateStr) {\n prefetchedRef.current = null\n setSlots(prefetched.slots)\n setSlotsLoading(false)\n return\n }\n\n let cancelled = false\n setSlotsLoading(true)\n setSlots([])\n fetchAvailability(selectedType.slug, dateStr, orgSlug, apiUrl, apiKey, timezone, undefined, meeting?.meetingToken)\n .then(s => { if (!cancelled) setSlots(s.filter(slot => slot.available)) })\n .catch(err => { if (!cancelled) reportRequestError(err) })\n .finally(() => { if (!cancelled) setSlotsLoading(false) })\n return () => { cancelled = true }\n }, [selectedDate, selectedType, orgSlug, apiKey, apiUrl, timezone, reportRequestError, meeting])\n\n // Auto-select the first day with open slots so guests land on pickable\n // times instead of an empty calendar. Sequential bounded probe: starts at\n // the earliest bookable day (min-notice aware), stops at the first hit.\n useEffect(() => {\n if (!autoSelectFirstDay || !selectedType || selectedDate || step !== 'datetime' || recovery || (selectedType.meeting_options && !meeting)) return\n const probeId = ++probeRef.current\n let cancelled = false\n const PROBE_DAYS = 14\n const startOffset = Math.floor((selectedType.min_notice_hours || 0) / 24)\n\n ;(async () => {\n setAutoProbing(true)\n try {\n for (let i = startOffset; i < startOffset + PROBE_DAYS; i++) {\n const d = new Date(today)\n d.setDate(d.getDate() + i)\n if (d > maxDate) break\n const dateStr = toLocalDateStr(d)\n const s = await fetchAvailability(selectedType.slug, dateStr, orgSlug, apiUrl, apiKey, timezone, undefined, meeting?.meetingToken)\n if (cancelled || probeRef.current !== probeId) return\n const open = s.filter(slot => slot.available)\n if (open.length > 0) {\n prefetchedRef.current = { dateStr, slots: open }\n setViewMonth(new Date(d.getFullYear(), d.getMonth(), 1))\n setSelectedDate(d)\n return\n }\n }\n } catch (err) {\n if (!cancelled && bookingRecoveryFromError(err)) reportRequestError(err as Error)\n // Probe is best-effort — the guest can still pick a day manually.\n } finally {\n if (!cancelled && probeRef.current === probeId) setAutoProbing(false)\n }\n })()\n\n return () => {\n cancelled = true\n setAutoProbing(false)\n }\n }, [autoSelectFirstDay, selectedType, selectedDate, orgSlug, apiKey, apiUrl, timezone, today, maxDate, step, meeting, recovery, reportRequestError])\n\n useEffect(() => {\n if ((step !== 'datetime' && step !== 'form') || loading || submitting) return\n const expiry = hold?.expiresAt || meeting?.expiresAt\n if (!expiry || !Number.isFinite(Date.parse(expiry))) return\n const checkExpiry = () => {\n const expired = expiredBookingContext(meeting, hold)\n if (!busyRef.current && expired) setRecovery(expired)\n }\n const timer = setTimeout(checkExpiry, Math.max(0, Date.parse(expiry) - Date.now()))\n // Background tabs may throttle timers, so refresh the reservation state on return.\n window.addEventListener('focus', checkExpiry)\n return () => { clearTimeout(timer); window.removeEventListener('focus', checkExpiry) }\n }, [meeting, hold, step, loading, submitting])\n\n // ── Handlers ──\n\n const handleSlotSelect = useCallback((slot: TimeSlot) => {\n if (busyRef.current) return\n setSelectedSlot(slot)\n setConfirmedSlot(false)\n }, [])\n\n const handleSlotConfirm = useCallback(async () => {\n if (!selectedType || !selectedSlot || busyRef.current || recovery) return\n const expired = expiredBookingContext(meeting, null)\n if (expired) { setRecovery(expired); return }\n const requestId = ++requestRef.current\n busyRef.current = true\n setLoading(true)\n setError(null)\n try {\n const previous = holdRef.current\n setActiveHold(null)\n if (previous) await releaseSlotHold(previous.holdId, apiUrl, apiKey).catch(() => {})\n if (requestId !== requestRef.current) return\n const newHold = await createSlotHold(\n {\n meetingToken: meeting?.meetingToken,\n org: apiKey ? undefined : orgSlug,\n bookingType: selectedType.slug,\n slotStart: selectedSlot.start,\n slotEnd: selectedSlot.end,\n hostId: selectedSlot.hostId || '',\n sessionId,\n },\n apiUrl,\n apiKey,\n )\n if (requestId !== requestRef.current) {\n await releaseSlotHold(newHold.holdId, apiUrl, apiKey).catch(() => {})\n return\n }\n setActiveHold(newHold)\n setConfirmedSlot(true)\n setStep('form')\n } catch (err: any) {\n if (requestId === requestRef.current) reportRequestError(err)\n } finally {\n if (requestId === requestRef.current) { busyRef.current = false; setLoading(false) }\n }\n }, [selectedType, selectedSlot, apiUrl, apiKey, meeting, sessionId, orgSlug, recovery, setActiveHold, reportRequestError])\n\n const handleBookingSubmit = useCallback(async (e: React.FormEvent) => {\n e.preventDefault()\n if (!selectedType || !selectedSlot || busyRef.current || recovery) return\n const expired = expiredBookingContext(meeting, hold)\n if (expired) { setRecovery(expired); return }\n const requestId = ++requestRef.current\n busyRef.current = true\n bookingInFlightRef.current = true\n setSubmitting(true)\n setError(null)\n\n try {\n const result = await createBooking(\n {\n meetingToken: meeting?.meetingToken,\n org: apiKey ? undefined : orgSlug,\n bookingType: selectedType.slug,\n scheduledAt: selectedSlot.start,\n hostId: selectedSlot.hostId || '',\n name: guestInfo.name,\n email: guestInfo.email,\n phone: guestInfo.phone,\n message: guestInfo.notes,\n source: 'main-site',\n timezone,\n holdId: hold?.holdId,\n sessionId,\n sourceUrl: typeof window !== 'undefined' ? window.location.href : undefined,\n },\n apiUrl,\n apiKey,\n )\n if (requestId !== requestRef.current) return\n setActiveHold(null)\n setBookingResult(result)\n setStep('success')\n onBookingComplete?.(result)\n } catch (err: any) {\n if (requestId === requestRef.current) reportRequestError(err)\n else if (hold) releaseSlotHold(hold.holdId, apiUrl, apiKey).catch(() => {})\n } finally {\n if (requestId === requestRef.current) {\n busyRef.current = false\n bookingInFlightRef.current = false\n setSubmitting(false)\n }\n }\n }, [selectedType, selectedSlot, guestInfo, timezone, hold, apiUrl, apiKey, onBookingComplete, meeting, sessionId, orgSlug, recovery, setActiveHold, reportRequestError])\n\n const chooseFormat = async (format: MeetingFormat, address?: MeetingAddress) => {\n if (!selectedType || busyRef.current) return\n const requestId = ++requestRef.current\n busyRef.current = true\n setLoading(true)\n setError(null)\n try {\n const prepared = await prepareMeeting(selectedType.slug, format, address, orgSlug, apiUrl, apiKey)\n if (requestId !== requestRef.current) return\n setMeeting(prepared)\n setRecovery(null)\n setSelectedDate(null)\n setSelectedSlot(null)\n prefetchedRef.current = null\n setStep('datetime')\n } catch (err: any) { if (requestId === requestRef.current) reportRequestError(err) }\n finally { if (requestId === requestRef.current) { busyRef.current = false; setLoading(false) } }\n }\n const changeFormat = () => {\n if (!busyRef.current) resetScheduling('format', true)\n }\n const changeService = () => {\n if (busyRef.current) return\n resetScheduling('type', true)\n setSelectedType(null)\n setMeetingFormat(null)\n }\n const recoverReservation = () => {\n if (busyRef.current) return\n const needsMeeting = recovery === 'meeting' || expiredBookingContext(meeting, null) === 'meeting'\n resetScheduling(needsMeeting ? 'format' : 'datetime', needsMeeting)\n }\n const displayType = selectedType ? { ...selectedType,\n ...(meeting ? { location_type: meeting.location_type, location_details: meeting.location_details, location_instructions: meeting.location_instructions } : {}),\n ...(bookingResult ? { location_type: bookingResult.booking.location_type || selectedType.location_type,\n location_details: bookingResult.booking.location_details, location_instructions: bookingResult.booking.location_instructions,\n video_link: bookingResult.booking.video_link } : {}),\n } : null\n const isPending = bookingResult?.booking.status === 'pending'\n\n // ── Month Navigation ──\n\n const canGoPrev = viewMonth.getFullYear() > today.getFullYear() || viewMonth.getMonth() > today.getMonth()\n const canGoNext = viewMonth < maxDate\n\n const goMonth = (dir: -1 | 1) => {\n if (busyRef.current) return\n setViewMonth(prev => new Date(prev.getFullYear(), prev.getMonth() + dir, 1))\n }\n\n // ── Group slots by morning/afternoon ──\n\n const groupedSlots = useMemo(() => {\n const morning: TimeSlot[] = []\n const afternoon: TimeSlot[] = []\n const evening: TimeSlot[] = []\n for (const s of slots) {\n const h = new Date(s.start).getHours()\n if (h < 12) morning.push(s)\n else if (h < 17) afternoon.push(s)\n else evening.push(s)\n }\n return { morning, afternoon, evening }\n }, [slots])\n\n // ── CSS vars ──\n\n const cssVars = {\n '--sk-primary': styles.primaryColor || '#0069ff',\n '--sk-primary-hover': styles.primaryColor\n ? `color-mix(in srgb, ${styles.primaryColor} 90%, black)`\n : '#0055d4',\n '--sk-primary-light': styles.primaryColor\n ? `color-mix(in srgb, ${styles.primaryColor} 12%, ${styles.backgroundColor || 'white'})`\n : '#e8f1ff',\n '--sk-bg': styles.backgroundColor || '#ffffff',\n '--sk-bg-elevated': styles.elevatedColor || '#f9fafb',\n '--sk-surface': styles.surfaceColor || '#f3f4f6',\n '--sk-text-primary': styles.textPrimary || '#1a1a1a',\n '--sk-text-secondary': styles.textSecondary || '#6b7280',\n '--sk-text-tertiary': styles.textTertiary || '#9ca3af',\n '--sk-border': styles.borderColor || '#e5e7eb',\n '--sk-error': '#dc2626',\n '--sk-success': '#047857',\n '--sk-warning': '#b45309',\n '--sk-radius': styles.borderRadius || '8px',\n '--sk-font': styles.fontFamily || \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\",\n '--sk-input-border': styles.inputBorderColor || styles.borderColor || '#e5e7eb',\n '--sk-input-focus-ring': styles.primaryColor\n ? `color-mix(in srgb, ${styles.primaryColor} 12%, ${styles.backgroundColor || 'white'})`\n : '#e8f1ff',\n } as React.CSSProperties\n\n // ── Render ──\n\n return (\n <div className={`bw-root ${className}`} style={cssVars}>\n {/* Error Toast */}\n {error && !recovery && (\n <div className=\"bw-error\" role=\"alert\">\n <span>{error}</span>\n <button onClick={() => setError(null)} aria-label=\"Dismiss error\">×</button>\n </div>\n )}\n {recovery && (\n <div className=\"sk-booking-recovery\" role=\"alert\">\n <p>{recovery === 'meeting' ? 'Your meeting details need to be checked again.' : 'Your time reservation expired. Choose a time to continue.'} Your entered details are saved.</p>\n <button type=\"button\" className=\"bw-submit\" onClick={recoverReservation} disabled={loading || submitting}>\n {recovery === 'meeting' ? 'Review meeting details' : 'Choose another time'}\n </button>\n </div>\n )}\n\n {/* ───── Type Selection ───── */}\n {step === 'type' && !hideTypeSelector && (\n <div className=\"bw-step bw-fade-in\">\n <h2 className=\"bw-heading\">Select a Service</h2>\n {loading ? (\n <div className=\"bw-loading\"><SpinnerIcon /> Loading services...</div>\n ) : (\n <div className=\"bw-type-list\">\n {bookingTypes.map(type => (\n <button\n key={type.id}\n className=\"bw-type-card\"\n onClick={() => { if (!busyRef.current) { resetScheduling(type.meeting_options ? 'format' : 'datetime', true); setSelectedType(type) } }}\n >\n <span className=\"bw-type-name\">{type.name}</span>\n {type.description && <span className=\"bw-type-desc\">{type.description}</span>}\n <span className=\"bw-type-meta\">\n <ClockIcon /> {formatDuration(type.duration_minutes)}\n {type.price_cents ? ` · $${(type.price_cents / 100).toFixed(2)}` : ' · Free'}\n {getLocationDisplay(type) ? ` · ${getLocationDisplay(type)!.label}` : ''}\n </span>\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n\n {step === 'format' && selectedType?.meeting_options && (\n <MeetingFormatStep options={selectedType.meeting_options} busy={loading}\n format={meetingFormat} address={meetingAddress} onFormatChange={setMeetingFormat} onAddressChange={setMeetingAddress}\n onContinue={chooseFormat} onBack={!bookingTypeSlug && !hideTypeSelector ? changeService : undefined} />\n )}\n {selectedType?.meeting_options && (step === 'datetime' || step === 'form') && (\n <button type=\"button\" className=\"bw-back sk-meeting-change\" onClick={changeFormat} disabled={loading || submitting}>← Change meeting format</button>\n )}\n\n {/* ───── Date & Time ───── */}\n {step === 'datetime' && selectedType && (\n <div className=\"bw-step bw-fade-in\">\n {/* Booking info header */}\n <div className=\"bw-info-header\">\n {!bookingTypeSlug && !hideTypeSelector && (\n <button className=\"bw-back\" onClick={changeService} disabled={loading} aria-label=\"Change service\">\n <ArrowLeftIcon />\n </button>\n )}\n <div>\n <h2 className=\"bw-heading\">{selectedType.name}</h2>\n <div className=\"bw-meta-row\">\n <span className=\"bw-badge\"><ClockIcon /> {formatDuration(selectedType.duration_minutes)}</span>\n <span className=\"bw-badge\"><GlobeIcon /> {shortTz}</span>\n <LocationBadge type={displayType} />\n </div>\n </div>\n </div>\n\n <div className=\"bw-datetime-layout\">\n {/* Calendar */}\n <div className=\"bw-calendar\">\n <div className=\"bw-cal-header\">\n <button className=\"bw-cal-nav\" onClick={() => goMonth(-1)} disabled={!canGoPrev || loading || !!recovery} aria-label=\"Previous month\">\n <ChevronLeft />\n </button>\n <span className=\"bw-cal-title\">{MONTHS[viewMonth.getMonth()]} {viewMonth.getFullYear()}</span>\n <button className=\"bw-cal-nav\" onClick={() => goMonth(1)} disabled={!canGoNext || loading || !!recovery} aria-label=\"Next month\">\n <ChevronRight />\n </button>\n </div>\n <div className=\"bw-cal-weekdays\">\n {DAYS.map(d => <span key={d} className=\"bw-cal-wd\">{d}</span>)}\n </div>\n <div className=\"bw-cal-grid\">\n {days.map((date, i) => {\n if (!date) return <span key={`e-${i}`} className=\"bw-cal-empty\" />\n const past = isBeforeDay(date, today)\n const future = date > maxDate\n const disabled = past || future || loading || !!recovery\n const sel = selectedDate && isSameDay(date, selectedDate)\n const isToday = isSameDay(date, today)\n return (\n <button\n key={date.toISOString()}\n className={`bw-cal-day${sel ? ' selected' : ''}${isToday ? ' today' : ''}${disabled ? ' disabled' : ''}`}\n onClick={() => { if (!disabled && !busyRef.current) setSelectedDate(date) }}\n disabled={disabled}\n aria-label={date.toLocaleDateString('en-US', { weekday: 'long', month: 'long', day: 'numeric' })}\n aria-pressed={sel || undefined}\n >\n {date.getDate()}\n </button>\n )\n })}\n </div>\n </div>\n\n {/* Time Slots (appear when date selected) */}\n <div className={`bw-times${selectedDate ? ' visible' : ''}`} ref={slotsRef}>\n {!selectedDate ? (\n autoProbing ? (\n <div className=\"bw-times-skeleton\" aria-hidden=\"true\">\n <div className=\"bw-skel-line\" />\n {[0, 1, 2, 3, 4].map(i => <div key={i} className=\"bw-skel-slot\" />)}\n </div>\n ) : (\n <div className=\"bw-times-placeholder\">\n <CalendarPlusIcon />\n <span>Select a date to view available times</span>\n </div>\n )\n ) : slotsLoading ? (\n <div className=\"bw-times-skeleton\" aria-hidden=\"true\">\n <div className=\"bw-skel-line\" />\n {[0, 1, 2, 3, 4].map(i => <div key={i} className=\"bw-skel-slot\" />)}\n </div>\n ) : slots.length === 0 ? (\n <div className=\"bw-times-empty\">No available times on this date. Try another day.</div>\n ) : (\n <div className=\"bw-times-scroll\">\n <p className=\"bw-times-date\">\n {selectedDate.toLocaleDateString('en-US', { weekday: 'long', month: 'short', day: 'numeric' })}\n </p>\n {groupedSlots.morning.length > 0 && (\n <div className=\"bw-time-group\">\n <span className=\"bw-time-label\">Morning</span>\n {groupedSlots.morning.map(slot => (\n <TimeButton key={slot.start} slot={slot} selected={selectedSlot?.start === slot.start} confirmed={confirmedSlot && selectedSlot?.start === slot.start} onClick={() => handleSlotSelect(slot)} onConfirm={handleSlotConfirm} timezone={timezone} loading={loading || !!recovery} />\n ))}\n </div>\n )}\n {groupedSlots.afternoon.length > 0 && (\n <div className=\"bw-time-group\">\n <span className=\"bw-time-label\">Afternoon</span>\n {groupedSlots.afternoon.map(slot => (\n <TimeButton key={slot.start} slot={slot} selected={selectedSlot?.start === slot.start} confirmed={confirmedSlot && selectedSlot?.start === slot.start} onClick={() => handleSlotSelect(slot)} onConfirm={handleSlotConfirm} timezone={timezone} loading={loading || !!recovery} />\n ))}\n </div>\n )}\n {groupedSlots.evening.length > 0 && (\n <div className=\"bw-time-group\">\n <span className=\"bw-time-label\">Evening</span>\n {groupedSlots.evening.map(slot => (\n <TimeButton key={slot.start} slot={slot} selected={selectedSlot?.start === slot.start} confirmed={confirmedSlot && selectedSlot?.start === slot.start} onClick={() => handleSlotSelect(slot)} onConfirm={handleSlotConfirm} timezone={timezone} loading={loading || !!recovery} />\n ))}\n </div>\n )}\n {(groupedSlots.afternoon.length > 0 || groupedSlots.evening.length > 0) && (\n <p className=\"bw-times-scroll-hint\">Scroll for more times</p>\n )}\n </div>\n )}\n </div>\n </div>\n </div>\n )}\n\n {/* ───── Guest Form ───── */}\n {step === 'form' && selectedType && selectedSlot && (\n <div className=\"bw-step bw-fade-in\">\n <div className=\"bw-info-header\">\n <button className=\"bw-back\" onClick={recoverReservation} disabled={submitting} aria-label=\"Choose another time\">\n <ArrowLeftIcon />\n </button>\n <div>\n <h2 className=\"bw-heading\">Your Details</h2>\n <div className=\"bw-meta-row\">\n <span className=\"bw-badge\"><ClockIcon /> {formatDuration(selectedType.duration_minutes)}</span>\n <span className=\"bw-badge-accent\">\n {formatDate(selectedSlot.start, timezone)} · {formatTime(selectedSlot.start, timezone)}\n </span>\n <LocationBadge type={displayType} />\n </div>\n </div>\n </div>\n\n {hold && !recovery && (\n <div className=\"bw-hold-notice\">\n <SpinnerIcon /> Slot held for you. Complete your details to confirm.\n </div>\n )}\n\n <LocationRow type={displayType} meetingFormat={meeting?.format} />\n {meeting?.requires_review && <p>We’ll confirm your visit after reviewing travel arrangements.</p>}\n <form onSubmit={handleBookingSubmit} className=\"bw-form\">\n <div className=\"bw-field\">\n <label htmlFor=\"bw-name\">Name <span className=\"bw-req\">*</span></label>\n <input\n id=\"bw-name\"\n type=\"text\"\n required\n readOnly={submitting}\n value={guestInfo.name}\n onChange={e => setGuestInfo(p => ({ ...p, name: e.target.value }))}\n placeholder=\"Jane Smith\"\n autoComplete=\"name\"\n />\n </div>\n <div className=\"bw-field\">\n <label htmlFor=\"bw-email\">Email <span className=\"bw-req\">*</span></label>\n <input\n id=\"bw-email\"\n type=\"email\"\n required\n readOnly={submitting}\n value={guestInfo.email}\n onChange={e => setGuestInfo(p => ({ ...p, email: e.target.value }))}\n placeholder=\"jane@example.com\"\n autoComplete=\"email\"\n />\n </div>\n <div className=\"bw-field\">\n <label htmlFor=\"bw-phone\">Phone {meeting?.format === 'client_location' && <span className=\"bw-req\">*</span>}</label>\n <input\n required={meeting?.format === 'client_location'}\n readOnly={submitting}\n id=\"bw-phone\"\n type=\"tel\"\n value={guestInfo.phone || ''}\n onChange={e => setGuestInfo(p => ({ ...p, phone: e.target.value }))}\n placeholder=\"(555) 123-4567\"\n autoComplete=\"tel\"\n />\n </div>\n <div className=\"bw-field\">\n <label htmlFor=\"bw-notes\">Notes</label>\n <textarea\n id=\"bw-notes\"\n readOnly={submitting}\n value={guestInfo.notes || ''}\n onChange={e => setGuestInfo(p => ({ ...p, notes: e.target.value }))}\n placeholder=\"Anything you'd like us to know...\"\n rows={3}\n />\n </div>\n <button type=\"submit\" className=\"bw-submit\" disabled={submitting || !!recovery || !guestInfo.name || !guestInfo.email}>\n {submitting ? <><SpinnerIcon /> Confirming...</> : meeting?.requires_review ? 'Request meeting' : 'Confirm booking'}\n </button>\n </form>\n </div>\n )}\n\n {/* ───── Success ───── */}\n {step === 'success' && bookingResult && (\n <div className=\"bw-step bw-fade-in bw-success\">\n <div className=\"bw-success-icon\"><CheckCircleIcon /></div>\n <h2 className=\"bw-heading\">{isPending ? 'Meeting request received' : 'You’re booked!'}</h2>\n\n <div className=\"bw-details-card\">\n <div className=\"bw-detail-row\">\n <span className=\"bw-detail-label\">When</span>\n <span className=\"bw-detail-value\">\n {formatDate(selectedSlot?.start || bookingResult.booking.scheduledAt || '', timezone)}<br/>\n {formatTime(selectedSlot?.start || bookingResult.booking.scheduledAt || '', timezone)} ({shortTz})\n </span>\n </div>\n <div className=\"bw-detail-row\">\n <span className=\"bw-detail-label\">Duration</span>\n <span className=\"bw-detail-value\">{formatDuration(selectedType?.duration_minutes ?? bookingResult.booking.durationMinutes ?? 0)}</span>\n </div>\n {bookingResult.booking.hostName && (\n <div className=\"bw-detail-row\">\n <span className=\"bw-detail-label\">With</span>\n <span className=\"bw-detail-value\">{bookingResult.booking.hostName}</span>\n </div>\n )}\n <LocationRow type={displayType} meetingFormat={meeting?.format} />\n </div>\n\n <p className=\"bw-email-notice\">{isPending ? 'We’ll send your confirmation to ' : 'Your meeting details will arrive at '}<strong>{guestInfo.email}</strong>.</p>\n\n <AddToCalendar result={bookingResult} />\n\n {(bookingResult.rescheduleUrl || bookingResult.cancelUrl) && (\n <p className=\"bw-manage-links\">\n Need to change it?{' '}\n {bookingResult.rescheduleUrl && (\n <a href={bookingResult.rescheduleUrl} target=\"_blank\" rel=\"noopener noreferrer\">Reschedule</a>\n )}\n {bookingResult.rescheduleUrl && bookingResult.cancelUrl && ' · '}\n {bookingResult.cancelUrl && (\n <a href={bookingResult.cancelUrl} target=\"_blank\" rel=\"noopener noreferrer\">Cancel</a>\n )}\n </p>\n )}\n\n {(bookingResult.confirmationCode || bookingResult.booking.confirmationCode) && (\n <p className=\"bw-conf-code\">Confirmation code: <strong>{bookingResult.confirmationCode || bookingResult.booking.confirmationCode}</strong></p>\n )}\n </div>\n )}\n\n {/* Loading overlay for initial type load */}\n {loading && step === 'datetime' && !selectedType && (\n <div className=\"bw-loading\"><SpinnerIcon /> Loading...</div>\n )}\n\n <style>{WIDGET_CSS}</style>\n </div>\n )\n}\n\n// ─── Location display helper + sub-components ──────────────────────────────────\n\ntype LocationDisplay = { kind: string; label: string; detail?: string; mapUrl?: string }\n\nfunction getLocationDisplay(type: BookingType | null): LocationDisplay | null {\n if (!type) return null\n const details = type.location_details?.trim() || undefined\n switch (type.location_type) {\n case 'in_person':\n return {\n kind: 'in_person',\n label: 'In person',\n detail: details,\n mapUrl: details\n ? `https://www.google.com/maps/search/?api=1&query=${encodeURIComponent(details)}`\n : undefined,\n }\n case 'phone':\n return { kind: 'phone', label: 'Phone call', detail: details ? `We'll call you at ${details}` : \"We'll call you\" }\n case 'custom':\n return { kind: 'custom', label: details || 'See details' }\n case 'virtual':\n default:\n return { kind: 'virtual', label: 'Video call', detail: type.video_link }\n }\n}\n\nfunction LocationBadge({ type }: { type: BookingType | null }) {\n const loc = getLocationDisplay(type)\n if (!loc) return null\n return <span className=\"bw-badge\"><MapPinIcon /> {loc.label}</span>\n}\n\nfunction LocationRow({ type, meetingFormat }: { type: BookingType | null; meetingFormat?: MeetingFormat }) {\n const loc = getLocationDisplay(type)\n if (!loc) return null\n return (\n <div className=\"bw-detail-row\">\n <span className=\"bw-detail-label\">Where</span>\n <span className=\"bw-detail-value\">\n {loc.label}\n {loc.detail ? <><br />{loc.kind === 'virtual' ? <a href={loc.detail} target=\"_blank\" rel=\"noopener noreferrer\">Join Google Meet</a> : loc.detail}</> : null}\n {type?.location_instructions && <><br /><span style={{ whiteSpace: 'pre-wrap' }}>{type.location_instructions}</span></>}\n {loc.mapUrl && meetingFormat !== 'client_location' ? (\n <><br /><a href={loc.mapUrl} target=\"_blank\" rel=\"noopener noreferrer\" className=\"bw-where-link\">Get directions →</a></>\n ) : null}\n {loc.kind === 'virtual' ? (\n <><br /><span className=\"bw-where-muted\">Video link is in your confirmation email.</span></>\n ) : null}\n </span>\n </div>\n )\n}\n\nfunction MapPinIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z\" />\n <circle cx=\"12\" cy=\"10\" r=\"3\" />\n </svg>\n )\n}\n\n// ─── TimeButton Sub-component ──────────────────────────────────────────────────\n\nfunction TimeButton({\n slot, selected, confirmed, onClick, onConfirm, timezone, loading,\n}: {\n slot: TimeSlot; selected: boolean; confirmed: boolean; onClick: () => void; onConfirm: () => void; timezone: string; loading: boolean\n}) {\n if (selected && !confirmed) {\n return (\n <div className=\"bw-time-btn-wrap selected\">\n <span className=\"bw-time-text\">{formatTime(slot.start, timezone)}</span>\n <button className=\"bw-time-confirm\" onClick={onConfirm} disabled={loading}>\n {loading ? <SpinnerIcon /> : 'Confirm'}\n </button>\n </div>\n )\n }\n return (\n <button className={`bw-time-btn${selected ? ' selected' : ''}`} onClick={onClick} disabled={loading}>\n {formatTime(slot.start, timezone)}\n </button>\n )\n}\n\n// ─── Styles ────────────────────────────────────────────────────────────────────\n\nconst WIDGET_CSS = `\n/* ── Base ── */\n.bw-root {\n font-family: var(--sk-font);\n color: var(--sk-text-primary);\n line-height: 1.5;\n -webkit-font-smoothing: antialiased;\n box-sizing: border-box;\n isolation: isolate;\n}\n.bw-root *, .bw-root *::before, .bw-root *::after { box-sizing: border-box; }\n\n/* ── Animation ── */\n@keyframes bw-fade-in { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: none; } }\n@keyframes bw-spin { to { transform: rotate(360deg); } }\n@keyframes bw-shimmer { to { background-position: -200% 0; } }\n.bw-fade-in { animation: bw-fade-in 0.25s ease-out; }\n.bw-spinner { animation: bw-spin 0.8s linear infinite; }\n\n/* ── Accessibility ── */\n.bw-root :is(button, a):focus-visible { outline: 2px solid var(--sk-primary); outline-offset: 2px; }\n@media (prefers-reduced-motion: reduce) {\n .bw-fade-in, .bw-skel-slot, .bw-skel-line { animation: none; }\n}\n\n/* ── Loading skeleton (time slots) ── */\n.bw-skel-line {\n height: 14px; width: 70%; margin-bottom: 14px; border-radius: 4px;\n background: linear-gradient(90deg, var(--sk-surface) 25%, var(--sk-bg-elevated) 50%, var(--sk-surface) 75%);\n background-size: 200% 100%; animation: bw-shimmer 1.1s linear infinite;\n}\n.bw-skel-slot {\n height: 44px; margin-bottom: 6px; border-radius: var(--sk-radius);\n background: linear-gradient(90deg, var(--sk-surface) 25%, var(--sk-bg-elevated) 50%, var(--sk-surface) 75%);\n background-size: 200% 100%; animation: bw-shimmer 1.1s linear infinite;\n}\n\n/* ── Error ── */\n.bw-error {\n display: flex; align-items: center; justify-content: space-between; gap: 12px;\n background: color-mix(in srgb, var(--sk-error) 10%, var(--sk-bg));\n border: 1px solid color-mix(in srgb, var(--sk-error) 35%, var(--sk-bg));\n color: var(--sk-error);\n padding: 10px 14px; border-radius: var(--sk-radius); margin-bottom: 16px; font-size: 0.875rem;\n}\n.bw-error button { background: none; border: none; color: inherit; cursor: pointer; font-size: 1.25rem; line-height: 1; padding: 0; }\n.sk-booking-recovery { padding: 16px; margin-bottom: 16px; border: 1px solid var(--sk-border); border-radius: var(--sk-radius); background: var(--sk-surface); color: var(--sk-text-primary); }\n.sk-booking-recovery p { margin: 0 0 12px; font-size: 0.875rem; }\n.sk-booking-recovery .bw-submit { width: auto; }\n.bw-back:disabled { cursor: wait; opacity: 0.55; }\n\n/* ── Headings ── */\n.bw-heading { font-size: 1.125rem; font-weight: 600; margin: 0; letter-spacing: -0.01em; }\n.bw-meta-row { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 6px; }\n.bw-badge {\n display: inline-flex; align-items: center; gap: 4px;\n font-size: 0.8125rem; color: var(--sk-text-secondary); font-weight: 400;\n}\n.bw-badge-accent {\n display: inline-flex; align-items: center; gap: 4px;\n font-size: 0.8125rem; color: var(--sk-primary); font-weight: 500;\n}\n\n/* ── Info Header ── */\n.bw-info-header { display: flex; align-items: flex-start; gap: 8px; margin-bottom: 20px; }\n.bw-back {\n display: inline-flex; align-items: center; justify-content: center;\n width: 32px; height: 32px; border-radius: 50%; border: 1px solid var(--sk-border);\n background: var(--sk-bg); cursor: pointer; color: var(--sk-text-secondary); flex-shrink: 0; margin-top: 1px;\n transition: all 0.15s;\n}\n.bw-back.sk-meeting-change { width: auto; height: auto; min-height: 36px; padding: 8px 12px; border-radius: var(--sk-radius); margin-bottom: 12px; font-size: 0.8125rem; }\n.bw-back:hover { background: var(--sk-surface); border-color: var(--sk-border); }\n\n/* ── Loading ── */\n.bw-loading {\n display: flex; align-items: center; justify-content: center; gap: 8px;\n padding: 32px; color: var(--sk-text-secondary); font-size: 0.875rem;\n}\n\n/* ── Type Selection ── */\n.bw-type-list { display: flex; flex-direction: column; gap: 10px; }\n.bw-type-card {\n display: flex; flex-direction: column; text-align: left; gap: 4px;\n padding: 16px; border: 1.5px solid var(--sk-border); border-radius: var(--sk-radius);\n background: var(--sk-bg); cursor: pointer; transition: all 0.15s;\n}\n.bw-type-card:hover { border-color: var(--sk-primary); box-shadow: 0 0 0 3px var(--sk-primary-light); }\n.bw-type-name { font-weight: 600; font-size: 0.9375rem; }\n.bw-type-desc { color: var(--sk-text-secondary); font-size: 0.8125rem; }\n.bw-type-meta { display: flex; align-items: center; gap: 4px; font-size: 0.8125rem; color: var(--sk-text-tertiary); margin-top: 4px; }\n\n/* ── Date-Time Layout ── */\n.bw-datetime-layout {\n display: flex; gap: 0; border-top: 1px solid var(--sk-border); padding-top: 16px;\n}\n@media (max-width: 559px) {\n .bw-datetime-layout { flex-direction: column; }\n}\n@media (min-width: 560px) {\n .bw-datetime-layout { min-height: 400px; }\n .bw-calendar { flex: 1 1 auto; padding-right: 16px; border-right: 1px solid var(--sk-border); }\n .bw-times { width: 180px; flex-shrink: 0; padding-left: 16px; }\n}\n\n/* ── Calendar ── */\n.bw-cal-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 12px; }\n.bw-cal-title { font-weight: 600; font-size: 0.9375rem; color: var(--sk-text-primary); }\n.bw-cal-nav {\n display: inline-flex; align-items: center; justify-content: center;\n width: 32px; height: 32px; border-radius: 50%; border: none;\n background: transparent; cursor: pointer; color: var(--sk-text-primary); transition: background 0.15s;\n}\n.bw-cal-nav:hover:not(:disabled) { background: var(--sk-surface); }\n.bw-cal-nav:disabled { opacity: 0.25; cursor: default; }\n\n.bw-cal-weekdays { display: grid; grid-template-columns: repeat(7, 1fr); gap: 0; text-align: center; margin-bottom: 4px; }\n.bw-cal-wd { font-size: 0.6875rem; font-weight: 600; color: var(--sk-text-tertiary); text-transform: uppercase; letter-spacing: 0.04em; padding: 4px 0; }\n\n.bw-cal-grid { display: grid; grid-template-columns: repeat(7, 1fr); gap: 2px; }\n.bw-cal-empty { aspect-ratio: 1; }\n.bw-cal-day {\n aspect-ratio: 1; display: flex; align-items: center; justify-content: center;\n border: none; background: none; border-radius: 50%;\n font-size: 0.8125rem; font-weight: 500; cursor: pointer;\n color: var(--sk-text-primary); transition: all 0.15s; position: relative;\n}\n.bw-cal-day:hover:not(.disabled):not(.selected) { background: var(--sk-surface); }\n.bw-cal-day.today:not(.selected)::after {\n content: ''; position: absolute; bottom: 3px; left: 50%; transform: translateX(-50%);\n width: 4px; height: 4px; border-radius: 50%; background: var(--sk-primary);\n}\n.bw-cal-day.selected {\n background: var(--sk-primary); color: #fff; font-weight: 600;\n}\n/* Past / out-of-range: visible on light and dark parent pages */\n.bw-root button.bw-cal-day.disabled {\n color: var(--sk-text-tertiary);\n cursor: default;\n opacity: 1;\n}\n\n/* ── Time Slots ── */\n.bw-times { transition: opacity 0.2s; }\n.bw-times:not(.visible) { opacity: 0.5; }\n.bw-times.visible { opacity: 1; }\n.bw-times-placeholder {\n display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 8px;\n height: 100%; min-height: 160px; color: var(--sk-text-tertiary); font-size: 0.8125rem; text-align: center; padding: 16px;\n}\n.bw-times-empty {\n display: flex; align-items: center; justify-content: center;\n height: 100%; min-height: 160px; color: var(--sk-text-tertiary); font-size: 0.8125rem; text-align: center; padding: 16px;\n}\n.bw-times-scroll { overflow-y: auto; max-height: 400px; overflow-x: hidden; }\n.bw-times-date { font-weight: 600; font-size: 0.8125rem; color: var(--sk-text-primary); margin: 0 0 12px 0; }\n.bw-time-group { margin-bottom: 16px; }\n.bw-times-scroll-hint {\n font-size: 0.6875rem; color: var(--sk-text-tertiary); text-align: center; margin: 8px 0 0 0; padding-bottom: 8px;\n}\n.bw-time-label { display: block; font-size: 0.6875rem; font-weight: 600; color: var(--sk-text-tertiary); text-transform: uppercase; letter-spacing: 0.04em; margin-bottom: 6px; }\n\n.bw-time-btn {\n display: block; width: 100%; min-height: 44px;\n padding: 10px 12px; margin-bottom: 6px;\n border: 1.5px solid var(--sk-border); border-radius: var(--sk-radius);\n background: var(--sk-bg); cursor: pointer;\n font-size: 0.875rem; font-weight: 500; color: var(--sk-primary); text-align: center;\n transition: all 0.15s;\n}\n.bw-time-btn:hover:not(:disabled) {\n border-color: var(--sk-primary); background: var(--sk-primary-light);\n}\n.bw-time-btn.selected {\n border-color: var(--sk-primary); background: var(--sk-primary); color: #fff;\n}\n.bw-time-btn:disabled { opacity: 0.5; cursor: not-allowed; }\n\n.bw-time-btn-wrap {\n display: flex; align-items: center; gap: 6px; margin-bottom: 6px;\n border: 1.5px solid var(--sk-primary); border-radius: var(--sk-radius); overflow: hidden;\n animation: bw-fade-in 0.15s ease-out;\n}\n.bw-time-btn-wrap .bw-time-text {\n flex: 1; padding: 10px 12px; font-size: 0.875rem; font-weight: 500; color: var(--sk-text-primary); text-align: center;\n background: var(--sk-primary-light);\n}\n.bw-time-confirm {\n display: inline-flex; align-items: center; justify-content: center; gap: 4px;\n min-height: 44px; padding: 10px 16px; border: none;\n background: var(--sk-primary); color: #fff;\n font-size: 0.8125rem; font-weight: 600; cursor: pointer;\n transition: background 0.15s;\n}\n.bw-time-confirm:hover:not(:disabled) { background: var(--sk-primary-hover); }\n.bw-time-confirm:disabled { opacity: 0.7; cursor: not-allowed; }\n\n/* ── Form ── */\n.bw-hold-notice {\n display: flex; align-items: center; gap: 8px;\n background: var(--sk-primary-light); color: var(--sk-primary);\n padding: 10px 14px; border-radius: var(--sk-radius);\n font-size: 0.8125rem; font-weight: 500; margin-bottom: 20px;\n}\n.bw-form { display: flex; flex-direction: column; gap: 16px; }\n.bw-field label {\n display: block; font-size: 0.8125rem; font-weight: 500; color: var(--sk-text-primary); margin-bottom: 4px;\n}\n.bw-req { color: var(--sk-error); }\n.bw-field input, .bw-field textarea {\n display: block; width: 100%;\n padding: 10px 12px; border: 1.5px solid var(--sk-input-border); border-radius: var(--sk-radius);\n font-size: 0.9375rem; font-family: inherit; color: var(--sk-text-primary); background: var(--sk-bg);\n transition: border-color 0.15s, box-shadow 0.15s;\n}\n.bw-field input::placeholder, .bw-field textarea::placeholder { color: var(--sk-text-tertiary); }\n.bw-field input:focus, .bw-field textarea:focus {\n outline: none; border-color: var(--sk-primary);\n box-shadow: 0 0 0 3px var(--sk-input-focus-ring);\n}\n.bw-submit {\n display: inline-flex; align-items: center; justify-content: center; gap: 8px;\n width: 100%; min-height: 48px; padding: 14px; margin-top: 4px;\n background: var(--sk-primary); color: #fff; border: none;\n border-radius: var(--sk-radius); font-size: 0.9375rem; font-weight: 600;\n cursor: pointer; transition: background 0.15s;\n}\n.bw-submit:hover:not(:disabled) { background: var(--sk-primary-hover); }\n.bw-submit:disabled { opacity: 0.55; cursor: not-allowed; }\n\n/* ── Success ── */\n.bw-success { text-align: center; }\n.bw-success-icon { margin: 0 auto 16px; width: 56px; height: 56px; animation: bw-fade-in 0.4s ease-out; }\n.bw-conf-code {\n display: inline-block; font-family: 'SF Mono', 'Fira Code', monospace;\n background: var(--sk-surface); padding: 6px 14px; border-radius: 6px;\n font-size: 0.8125rem; color: var(--sk-text-secondary); margin: 4px 0 20px; letter-spacing: 0.04em;\n}\n\n.bw-details-card {\n text-align: left; background: var(--sk-bg-elevated); border: 1px solid var(--sk-border);\n border-radius: var(--sk-radius); padding: 16px; margin-bottom: 20px;\n}\n.bw-detail-row { display: flex; gap: 12px; padding: 8px 0; border-bottom: 1px solid var(--sk-border); }\n.bw-detail-row:last-child { border-bottom: none; }\n.bw-detail-label { width: 70px; flex-shrink: 0; font-size: 0.8125rem; color: var(--sk-text-tertiary); font-weight: 500; }\n.bw-detail-value { font-size: 0.875rem; font-weight: 500; color: var(--sk-text-primary); }\n\n.bw-cal-links-label { font-size: 0.8125rem; color: var(--sk-text-secondary); margin: 0 0 8px 0; }\n.bw-cal-links { display: flex; gap: 8px; justify-content: center; margin-bottom: 20px; flex-wrap: wrap; }\n.bw-cal-link {\n display: inline-flex; align-items: center; gap: 6px;\n padding: 8px 14px; border: 1.5px solid var(--sk-border); border-radius: var(--sk-radius);\n text-decoration: none; color: var(--sk-text-primary); font-size: 0.8125rem; font-weight: 500;\n transition: all 0.15s;\n}\n.bw-cal-link:hover { border-color: var(--sk-primary); color: var(--sk-primary); }\n.bw-invite-notice { font-size: 0.8125rem; color: var(--sk-text-secondary); margin: 0 0 20px 0; }\n.bw-invite-notice strong { color: var(--sk-text-primary); font-weight: 500; }\n\n.bw-email-notice { font-size: 0.8125rem; color: var(--sk-text-tertiary); margin: 0 0 16px 0; }\n.bw-email-notice strong { color: var(--sk-text-primary); font-weight: 500; }\n.bw-where-link { color: var(--sk-primary, #14B8A6); text-decoration: none; font-weight: 500; }\n.bw-where-muted { color: var(--sk-text-tertiary); font-size: 0.8125rem; }\n.bw-manage-links { font-size: 0.8125rem; color: var(--sk-text-tertiary); margin: 12px 0 0 0; }\n.bw-manage-links a { color: var(--sk-primary, #14B8A6); text-decoration: none; font-weight: 500; }\n`\n\nexport default BookingWidget\n"]}
|
|
@@ -28,7 +28,7 @@ function useFieldControls(fields) {
|
|
|
28
28
|
}
|
|
29
29
|
if (needsFile && !requested.current.file) {
|
|
30
30
|
requested.current.file = true;
|
|
31
|
-
import('./FileField-
|
|
31
|
+
import('./FileField-UOQHL25J.js').then((m) => {
|
|
32
32
|
if (!cancelled) setControls((prev) => ({ ...prev, File: m.FileField }));
|
|
33
33
|
}).catch(() => {
|
|
34
34
|
requested.current.file = false;
|
|
@@ -144,5 +144,5 @@ exports.stageEstimate = stageEstimate;
|
|
|
144
144
|
exports.stageFirstName = stageFirstName;
|
|
145
145
|
exports.stageViews = stageViews;
|
|
146
146
|
exports.useFieldControls = useFieldControls;
|
|
147
|
-
//# sourceMappingURL=chunk-
|
|
148
|
-
//# sourceMappingURL=chunk-
|
|
147
|
+
//# sourceMappingURL=chunk-X5TCH7VZ.js.map
|
|
148
|
+
//# sourceMappingURL=chunk-X5TCH7VZ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/forms/field-controls.ts","../src/forms/experience-plan.ts"],"names":["useMemo","useState","useRef","useEffect"],"mappings":"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","file":"chunk-Q26VZNM2.js","sourcesContent":["'use client'\n\n/**\n * The field controls that need React hooks, loaded only when a form actually\n * has a field that uses them.\n *\n * FormField deliberately does NOT import these. DatePicker carries 17 hooks\n * and FileField holds upload state; importing them there put both in\n * FormField's chunk, which the build stamps `'use client'` — so a Server\n * Component rendering a single text input shipped 38 KB of date picker to the\n * browser. Injecting them from the client side keeps FormField hook-free and\n * therefore server-renderable, which is the whole basis of StaticForm.\n *\n * Injection alone still put both controls in the forms entry's eager graph,\n * because a module-level constant referencing them is a static import: every\n * form paid for the date picker, and most forms have no date field. They are\n * now fetched on demand, per control, from the field list.\n *\n * The wait costs nothing visually. FormField already renders the native\n * control when a control is absent (static mode does exactly this), so a date\n * field paints as `<input type=\"date\">` and upgrades in place when the chunk\n * lands — the same enhancement path a no-JS visitor never leaves.\n *\n * Every client renderer of <FormField> (FormClient, FormSpotlight, FormStage)\n * calls this hook, so the experiences and the classic form always offer\n * identical controls.\n */\n\nimport { useEffect, useMemo, useRef, useState } from 'react'\nimport type { FormField as FormFieldType } from './types'\n\nexport interface FieldControls {\n Date?: React.ComponentType<any>\n File?: React.ComponentType<any>\n}\n\n/** Stable identity for the common case (no date, no file) — no render churn. */\nconst NO_CONTROLS: FieldControls = {}\n\nexport function useFieldControls(fields: FormFieldType[] | undefined): FieldControls {\n const needsDate = useMemo(\n () => (fields ?? []).some((f) => f.field_type === 'date' || f.field_type === 'datetime'),\n [fields],\n )\n const needsFile = useMemo(\n () => (fields ?? []).some((f) => f.field_type === 'file'),\n [fields],\n )\n\n const [controls, setControls] = useState<FieldControls>(NO_CONTROLS)\n // Guards re-import when a conditional field toggles visibility mid-fill.\n const requested = useRef({ date: false, file: false })\n\n useEffect(() => {\n let cancelled = false\n\n if (needsDate && !requested.current.date) {\n requested.current.date = true\n import('./DatePicker')\n .then((m) => {\n if (!cancelled) setControls((prev) => ({ ...prev, Date: m.DatePicker }))\n })\n .catch(() => {\n // Chunk never arrived — the native date input stays, which submits\n // the same value. A failed fetch must not cost the lead.\n requested.current.date = false\n })\n }\n\n if (needsFile && !requested.current.file) {\n requested.current.file = true\n import('./FileField')\n .then((m) => {\n if (!cancelled) setControls((prev) => ({ ...prev, File: m.FileField }))\n })\n .catch(() => {\n requested.current.file = false\n })\n }\n\n return () => {\n cancelled = true\n }\n }, [needsDate, needsFile])\n\n return controls\n}\n","/**\n * Shared planning helpers for the alternate form experiences (stage,\n * spotlight). Pure data — no React, no CSS — so FormClient can import the\n * counts it needs for tracking WITHOUT pulling an experience component (and\n * its stylesheet) into every site's forms bundle. The components themselves\n * are lazy-loaded; this module is the only part that ships eagerly.\n */\n\nimport type {\n FormField as FormFieldType,\n FormStep,\n ManagedFormConfig,\n} from './types'\n\n/** Display-only / non-question field types — never staged. */\nconst NON_QUESTION_TYPES = ['heading', 'section_header', 'paragraph', 'hidden']\n\nexport interface StageQuestion {\n field: FormFieldType\n /** The step (chapter) this question belongs to, when the form is multi-step. */\n step?: FormStep\n}\n\nexport interface StageView {\n fields: FormFieldType[]\n step?: FormStep\n}\n\n/**\n * Flatten a form into its ordered question list. Steps become chapters:\n * multi-step forms iterate steps in step_number order (fields are already\n * sorted by sort_order via normalizeFormConfig); stepless fields trail.\n */\nexport function stageQuestions(config: ManagedFormConfig): StageQuestion[] {\n const input = (config.fields || []).filter(\n (f) => !NON_QUESTION_TYPES.includes(f.field_type),\n )\n if (!config.is_multi_step || !config.steps?.length) {\n return input.map((field) => ({ field }))\n }\n const ordered = [...config.steps].sort((a, b) => a.step_number - b.step_number)\n const out: StageQuestion[] = []\n const claimed = new Set<string>()\n for (const step of ordered) {\n for (const field of input) {\n if (field.step_id === step.id) {\n out.push({ field, step })\n claimed.add(field.id)\n }\n }\n }\n for (const field of input) {\n if (!claimed.has(field.id)) out.push({ field })\n }\n return out\n}\n\nconst WIDTH_FRACTION: Record<string, number> = {\n full: 1,\n half: 1 / 2,\n third: 1 / 3,\n quarter: 1 / 4,\n}\n\n/**\n * Group questions into beats using the classic grid's own row math:\n * consecutive sub-full-width fields fill a row (2 halves, 3 thirds...) and\n * that row is one beat; a full-width field closes any open row and stands\n * alone; a chapter change always starts a fresh beat.\n */\nexport function stageViews(config: ManagedFormConfig): StageView[] {\n const questions = stageQuestions(config)\n const views: StageView[] = []\n let open: StageView | null = null\n let openWidth = 0\n\n const close = () => {\n if (open) views.push(open)\n open = null\n openWidth = 0\n }\n\n for (const q of questions) {\n const fraction = WIDTH_FRACTION[q.field.width] ?? 1\n const chapterChanged = open && open.step?.id !== q.step?.id\n if (fraction >= 1 || chapterChanged) close()\n if (!open) {\n open = { fields: [q.field], step: q.step }\n openWidth = fraction\n if (fraction >= 1) close()\n continue\n }\n if (openWidth + fraction > 1.0001) close()\n if (!open) {\n open = { fields: [q.field], step: q.step }\n openWidth = fraction\n continue\n }\n open.fields.push(q.field)\n openWidth += fraction\n }\n close()\n return views\n}\n\nexport function countStageViews(config: ManagedFormConfig): number {\n return stageViews(config).length\n}\n\nexport function countStageQuestions(config: ManagedFormConfig): number {\n return stageQuestions(config).length\n}\n\n/**\n * Honest, friendly time estimate: \"about 40 seconds\".\n * ~8s per question, rounded to something a human would actually say.\n */\nexport function stageEstimate(questionCount: number): string {\n const seconds = questionCount * 8\n if (seconds < 50) return `about ${Math.max(15, Math.ceil(seconds / 5) * 5)} seconds`\n if (seconds <= 90) return 'about a minute'\n return `about ${Math.round(seconds / 60)} minutes`\n}\n\n/** First name for the greeting — conservative: short, single token, else null. */\nexport function stageFirstName(value: unknown): string | null {\n if (typeof value !== 'string') return null\n const token = value.trim().split(/\\s+/)[0]\n if (!token || token.length > 24) return null\n return token\n}\n\nexport function isEmptyValue(value: unknown): boolean {\n if (value === undefined || value === null || value === '') return true\n if (Array.isArray(value)) return value.length === 0\n return false\n}\n\nexport function formatAnswer(value: unknown): string | null {\n if (isEmptyValue(value)) return null\n if (Array.isArray(value)) return value.map(String).join(', ')\n if (typeof value === 'boolean') return value ? 'Yes' : 'No'\n return String(value)\n}\n\n/** Single-select types where picking an answer advances after a lock-in beat. */\nexport const AUTO_ADVANCE_TYPES = ['radio', 'select', 'rating']\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/forms/field-controls.ts","../src/forms/experience-plan.ts"],"names":["useMemo","useState","useRef","useEffect"],"mappings":"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","file":"chunk-X5TCH7VZ.js","sourcesContent":["'use client'\n\n/**\n * The field controls that need React hooks, loaded only when a form actually\n * has a field that uses them.\n *\n * FormField deliberately does NOT import these. DatePicker carries 17 hooks\n * and FileField holds upload state; importing them there put both in\n * FormField's chunk, which the build stamps `'use client'` — so a Server\n * Component rendering a single text input shipped 38 KB of date picker to the\n * browser. Injecting them from the client side keeps FormField hook-free and\n * therefore server-renderable, which is the whole basis of StaticForm.\n *\n * Injection alone still put both controls in the forms entry's eager graph,\n * because a module-level constant referencing them is a static import: every\n * form paid for the date picker, and most forms have no date field. They are\n * now fetched on demand, per control, from the field list.\n *\n * The wait costs nothing visually. FormField already renders the native\n * control when a control is absent (static mode does exactly this), so a date\n * field paints as `<input type=\"date\">` and upgrades in place when the chunk\n * lands — the same enhancement path a no-JS visitor never leaves.\n *\n * Every client renderer of <FormField> (FormClient, FormSpotlight, FormStage)\n * calls this hook, so the experiences and the classic form always offer\n * identical controls.\n */\n\nimport { useEffect, useMemo, useRef, useState } from 'react'\nimport type { FormField as FormFieldType } from './types'\n\nexport interface FieldControls {\n Date?: React.ComponentType<any>\n File?: React.ComponentType<any>\n}\n\n/** Stable identity for the common case (no date, no file) — no render churn. */\nconst NO_CONTROLS: FieldControls = {}\n\nexport function useFieldControls(fields: FormFieldType[] | undefined): FieldControls {\n const needsDate = useMemo(\n () => (fields ?? []).some((f) => f.field_type === 'date' || f.field_type === 'datetime'),\n [fields],\n )\n const needsFile = useMemo(\n () => (fields ?? []).some((f) => f.field_type === 'file'),\n [fields],\n )\n\n const [controls, setControls] = useState<FieldControls>(NO_CONTROLS)\n // Guards re-import when a conditional field toggles visibility mid-fill.\n const requested = useRef({ date: false, file: false })\n\n useEffect(() => {\n let cancelled = false\n\n if (needsDate && !requested.current.date) {\n requested.current.date = true\n import('./DatePicker')\n .then((m) => {\n if (!cancelled) setControls((prev) => ({ ...prev, Date: m.DatePicker }))\n })\n .catch(() => {\n // Chunk never arrived — the native date input stays, which submits\n // the same value. A failed fetch must not cost the lead.\n requested.current.date = false\n })\n }\n\n if (needsFile && !requested.current.file) {\n requested.current.file = true\n import('./FileField')\n .then((m) => {\n if (!cancelled) setControls((prev) => ({ ...prev, File: m.FileField }))\n })\n .catch(() => {\n requested.current.file = false\n })\n }\n\n return () => {\n cancelled = true\n }\n }, [needsDate, needsFile])\n\n return controls\n}\n","/**\n * Shared planning helpers for the alternate form experiences (stage,\n * spotlight). Pure data — no React, no CSS — so FormClient can import the\n * counts it needs for tracking WITHOUT pulling an experience component (and\n * its stylesheet) into every site's forms bundle. The components themselves\n * are lazy-loaded; this module is the only part that ships eagerly.\n */\n\nimport type {\n FormField as FormFieldType,\n FormStep,\n ManagedFormConfig,\n} from './types'\n\n/** Display-only / non-question field types — never staged. */\nconst NON_QUESTION_TYPES = ['heading', 'section_header', 'paragraph', 'hidden']\n\nexport interface StageQuestion {\n field: FormFieldType\n /** The step (chapter) this question belongs to, when the form is multi-step. */\n step?: FormStep\n}\n\nexport interface StageView {\n fields: FormFieldType[]\n step?: FormStep\n}\n\n/**\n * Flatten a form into its ordered question list. Steps become chapters:\n * multi-step forms iterate steps in step_number order (fields are already\n * sorted by sort_order via normalizeFormConfig); stepless fields trail.\n */\nexport function stageQuestions(config: ManagedFormConfig): StageQuestion[] {\n const input = (config.fields || []).filter(\n (f) => !NON_QUESTION_TYPES.includes(f.field_type),\n )\n if (!config.is_multi_step || !config.steps?.length) {\n return input.map((field) => ({ field }))\n }\n const ordered = [...config.steps].sort((a, b) => a.step_number - b.step_number)\n const out: StageQuestion[] = []\n const claimed = new Set<string>()\n for (const step of ordered) {\n for (const field of input) {\n if (field.step_id === step.id) {\n out.push({ field, step })\n claimed.add(field.id)\n }\n }\n }\n for (const field of input) {\n if (!claimed.has(field.id)) out.push({ field })\n }\n return out\n}\n\nconst WIDTH_FRACTION: Record<string, number> = {\n full: 1,\n half: 1 / 2,\n third: 1 / 3,\n quarter: 1 / 4,\n}\n\n/**\n * Group questions into beats using the classic grid's own row math:\n * consecutive sub-full-width fields fill a row (2 halves, 3 thirds...) and\n * that row is one beat; a full-width field closes any open row and stands\n * alone; a chapter change always starts a fresh beat.\n */\nexport function stageViews(config: ManagedFormConfig): StageView[] {\n const questions = stageQuestions(config)\n const views: StageView[] = []\n let open: StageView | null = null\n let openWidth = 0\n\n const close = () => {\n if (open) views.push(open)\n open = null\n openWidth = 0\n }\n\n for (const q of questions) {\n const fraction = WIDTH_FRACTION[q.field.width] ?? 1\n const chapterChanged = open && open.step?.id !== q.step?.id\n if (fraction >= 1 || chapterChanged) close()\n if (!open) {\n open = { fields: [q.field], step: q.step }\n openWidth = fraction\n if (fraction >= 1) close()\n continue\n }\n if (openWidth + fraction > 1.0001) close()\n if (!open) {\n open = { fields: [q.field], step: q.step }\n openWidth = fraction\n continue\n }\n open.fields.push(q.field)\n openWidth += fraction\n }\n close()\n return views\n}\n\nexport function countStageViews(config: ManagedFormConfig): number {\n return stageViews(config).length\n}\n\nexport function countStageQuestions(config: ManagedFormConfig): number {\n return stageQuestions(config).length\n}\n\n/**\n * Honest, friendly time estimate: \"about 40 seconds\".\n * ~8s per question, rounded to something a human would actually say.\n */\nexport function stageEstimate(questionCount: number): string {\n const seconds = questionCount * 8\n if (seconds < 50) return `about ${Math.max(15, Math.ceil(seconds / 5) * 5)} seconds`\n if (seconds <= 90) return 'about a minute'\n return `about ${Math.round(seconds / 60)} minutes`\n}\n\n/** First name for the greeting — conservative: short, single token, else null. */\nexport function stageFirstName(value: unknown): string | null {\n if (typeof value !== 'string') return null\n const token = value.trim().split(/\\s+/)[0]\n if (!token || token.length > 24) return null\n return token\n}\n\nexport function isEmptyValue(value: unknown): boolean {\n if (value === undefined || value === null || value === '') return true\n if (Array.isArray(value)) return value.length === 0\n return false\n}\n\nexport function formatAnswer(value: unknown): string | null {\n if (isEmptyValue(value)) return null\n if (Array.isArray(value)) return value.map(String).join(', ')\n if (typeof value === 'boolean') return value ? 'Yes' : 'No'\n return String(value)\n}\n\n/** Single-select types where picking an answer advances after a lock-in beat. */\nexport const AUTO_ADVANCE_TYPES = ['radio', 'select', 'rating']\n"]}
|
|
@@ -60,7 +60,7 @@ function useSignal() {
|
|
|
60
60
|
return react.useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);
|
|
61
61
|
}
|
|
62
62
|
var LazySignalCore = dynamic__default.default(
|
|
63
|
-
() => import('./SignalCore-
|
|
63
|
+
() => import('./SignalCore-M4AXIMV4.js').then((m) => ({ default: m.SignalCore })),
|
|
64
64
|
{ ssr: false }
|
|
65
65
|
);
|
|
66
66
|
function SignalBridge({
|
|
@@ -172,5 +172,5 @@ exports.useSignalConfig = useSignalConfig;
|
|
|
172
172
|
exports.useSignalEvent = useSignalEvent;
|
|
173
173
|
exports.useSignalExperiment = useSignalExperiment;
|
|
174
174
|
exports.useSignalOutcome = useSignalOutcome;
|
|
175
|
-
//# sourceMappingURL=chunk-
|
|
176
|
-
//# sourceMappingURL=chunk-
|
|
175
|
+
//# sourceMappingURL=chunk-XK5AIWQG.js.map
|
|
176
|
+
//# sourceMappingURL=chunk-XK5AIWQG.js.map
|