@sonordev/site-kit 5.3.2 → 5.4.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/README.md +17 -0
- package/agent-manifest.json +5 -4
- package/dist/AnalyticsProvider-2XIOMRCN.mjs +11 -0
- package/dist/{AnalyticsProvider-2XK54UZW.mjs.map → AnalyticsProvider-2XIOMRCN.mjs.map} +1 -1
- package/dist/AnalyticsProvider-Y2P2BPOI.js +32 -0
- package/dist/{AnalyticsProvider-PM7SOGOS.js.map → AnalyticsProvider-Y2P2BPOI.js.map} +1 -1
- package/dist/{BlogViewTracker-3BIUF5TI.js → BlogViewTracker-6EGEDPP3.js} +6 -6
- package/dist/{BlogViewTracker-3BIUF5TI.js.map → BlogViewTracker-6EGEDPP3.js.map} +1 -1
- package/dist/{BlogViewTracker-KFUDRDQK.mjs → BlogViewTracker-R4YQ76WP.mjs} +5 -5
- package/dist/{BlogViewTracker-KFUDRDQK.mjs.map → BlogViewTracker-R4YQ76WP.mjs.map} +1 -1
- package/dist/ChatWidget-2OFWPCWF.js +20 -0
- package/dist/{ChatWidget-7BYSGNO2.js.map → ChatWidget-2OFWPCWF.js.map} +1 -1
- package/dist/ChatWidget-4AOGHYXQ.mjs +11 -0
- package/dist/{ChatWidget-4PHZHGG5.mjs.map → ChatWidget-4AOGHYXQ.mjs.map} +1 -1
- package/dist/EngageWidget-SFO2XRNG.mjs +9 -0
- package/dist/{EngageWidget-D6M6QWEC.mjs.map → EngageWidget-SFO2XRNG.mjs.map} +1 -1
- package/dist/EngageWidget-T4KAAD3G.js +18 -0
- package/dist/{EngageWidget-Q4ITKTMJ.js.map → EngageWidget-T4KAAD3G.js.map} +1 -1
- package/dist/{FileField-PQQDX4IR.mjs → FileField-7DF2SLPF.mjs} +5 -5
- package/dist/{FileField-PQQDX4IR.mjs.map → FileField-7DF2SLPF.mjs.map} +1 -1
- package/dist/{FileField-YBBIJOCK.js → FileField-CE2XNBBG.js} +6 -6
- package/dist/{FileField-YBBIJOCK.js.map → FileField-CE2XNBBG.js.map} +1 -1
- package/dist/{FormSpotlight-7TIIWFTP.mjs → FormSpotlight-IRLKSZGV.mjs} +3 -3
- package/dist/{FormSpotlight-7TIIWFTP.mjs.map → FormSpotlight-IRLKSZGV.mjs.map} +1 -1
- package/dist/{FormSpotlight-WUN24F3P.js → FormSpotlight-ZD3WR5BC.js} +15 -15
- package/dist/{FormSpotlight-WUN24F3P.js.map → FormSpotlight-ZD3WR5BC.js.map} +1 -1
- package/dist/{FormStage-TFN2GIBO.mjs → FormStage-2OSRNQJL.mjs} +3 -3
- package/dist/{FormStage-TFN2GIBO.mjs.map → FormStage-2OSRNQJL.mjs.map} +1 -1
- package/dist/{FormStage-CM7OVLUT.js → FormStage-OSPXOUQE.js} +13 -13
- package/dist/{FormStage-CM7OVLUT.js.map → FormStage-OSPXOUQE.js.map} +1 -1
- package/dist/ManagedForm-5G37EDJT.mjs +14 -0
- package/dist/{ManagedForm-ZUXLHEQU.mjs.map → ManagedForm-5G37EDJT.mjs.map} +1 -1
- package/dist/ManagedForm-JCHGBBQW.js +23 -0
- package/dist/{ManagedForm-N63YGVNY.js.map → ManagedForm-JCHGBBQW.js.map} +1 -1
- package/dist/{ManagedNewsletterForm-PIVJTU5L.js → ManagedNewsletterForm-4LVJZROZ.js} +8 -8
- package/dist/{ManagedNewsletterForm-PIVJTU5L.js.map → ManagedNewsletterForm-4LVJZROZ.js.map} +1 -1
- package/dist/{ManagedNewsletterForm-4AVKTZ2A.mjs → ManagedNewsletterForm-QJSVH23S.mjs} +7 -7
- package/dist/{ManagedNewsletterForm-4AVKTZ2A.mjs.map → ManagedNewsletterForm-QJSVH23S.mjs.map} +1 -1
- package/dist/{SignalCore-LT4NCPOR.mjs → SignalCore-L6Z3YTCF.mjs} +5 -5
- package/dist/{SignalCore-LT4NCPOR.mjs.map → SignalCore-L6Z3YTCF.mjs.map} +1 -1
- package/dist/{SignalCore-2M5TISM7.js → SignalCore-NQ4YEOI7.js} +11 -11
- package/dist/{SignalCore-2M5TISM7.js.map → SignalCore-NQ4YEOI7.js.map} +1 -1
- package/dist/SitemapSync-3LUZWBTB.js +18 -0
- package/dist/{SitemapSync-7OBOJG2L.js.map → SitemapSync-3LUZWBTB.js.map} +1 -1
- package/dist/SitemapSync-MYSTLJOM.mjs +9 -0
- package/dist/{SitemapSync-G3OLECFI.mjs.map → SitemapSync-MYSTLJOM.mjs.map} +1 -1
- package/dist/analytics/index.js +9 -9
- package/dist/analytics/index.mjs +4 -4
- package/dist/blog/AuthorPage.d.ts +1 -1
- package/dist/blog/AuthorPage.d.ts.map +1 -1
- package/dist/blog/BlogLayout.d.ts +3 -1
- package/dist/blog/BlogLayout.d.ts.map +1 -1
- package/dist/blog/BlogList.d.ts +3 -1
- package/dist/blog/BlogList.d.ts.map +1 -1
- package/dist/blog/BlogPost.d.ts +3 -1
- package/dist/blog/BlogPost.d.ts.map +1 -1
- package/dist/blog/BlogSidebar.d.ts +3 -1
- package/dist/blog/BlogSidebar.d.ts.map +1 -1
- package/dist/blog/ClusterLandingPage.d.ts +3 -1
- package/dist/blog/ClusterLandingPage.d.ts.map +1 -1
- package/dist/blog/ClusterNavigation.d.ts +3 -1
- package/dist/blog/ClusterNavigation.d.ts.map +1 -1
- package/dist/blog/RelatedPosts.d.ts +4 -1
- package/dist/blog/RelatedPosts.d.ts.map +1 -1
- package/dist/blog/artwork-components.test.d.ts +2 -0
- package/dist/blog/artwork-components.test.d.ts.map +1 -0
- package/dist/blog/artwork.d.ts +14 -0
- package/dist/blog/artwork.d.ts.map +1 -0
- package/dist/blog/artwork.test.d.ts +2 -0
- package/dist/blog/artwork.test.d.ts.map +1 -0
- package/dist/blog/blog-styles.d.ts.map +1 -1
- package/dist/blog/blog-tables.d.ts +13 -0
- package/dist/blog/blog-tables.d.ts.map +1 -0
- package/dist/blog/blog-tables.test.d.ts +2 -0
- package/dist/blog/blog-tables.test.d.ts.map +1 -0
- package/dist/blog/index.d.ts +3 -0
- package/dist/blog/index.d.ts.map +1 -1
- package/dist/blog/index.js +52 -30
- package/dist/blog/index.js.map +1 -1
- package/dist/blog/index.mjs +15 -12
- package/dist/blog/index.mjs.map +1 -1
- package/dist/blog/publication-render.test.d.ts +2 -0
- package/dist/blog/publication-render.test.d.ts.map +1 -0
- package/dist/blog/publication-routes.test.d.ts +2 -0
- package/dist/blog/publication-routes.test.d.ts.map +1 -0
- package/dist/blog/routes.d.ts +40 -0
- package/dist/blog/routes.d.ts.map +1 -0
- package/dist/blog/server-core.d.ts +28 -21
- package/dist/blog/server-core.d.ts.map +1 -1
- package/dist/blog/server-ui.d.ts +4 -0
- package/dist/blog/server-ui.d.ts.map +1 -1
- package/dist/blog/server-ui.js +49 -28
- package/dist/blog/server-ui.js.map +1 -1
- package/dist/blog/server-ui.mjs +9 -15
- package/dist/blog/server-ui.mjs.map +1 -1
- package/dist/blog/server.d.ts +28 -21
- package/dist/blog/server.d.ts.map +1 -1
- package/dist/blog/server.js +71 -42
- package/dist/blog/server.mjs +3 -2
- package/dist/blog/types.d.ts +8 -1
- package/dist/blog/types.d.ts.map +1 -1
- package/dist/blog-styles-6EY3BS5Y.js +595 -0
- package/dist/blog-styles-6EY3BS5Y.js.map +1 -0
- package/dist/blog-styles-7AKRUMV7.mjs +592 -0
- package/dist/blog-styles-7AKRUMV7.mjs.map +1 -0
- package/dist/blog-tables-DWDEWA3S.js +17 -0
- package/dist/blog-tables-DWDEWA3S.js.map +1 -0
- package/dist/blog-tables-QGIHOESZ.mjs +4 -0
- package/dist/blog-tables-QGIHOESZ.mjs.map +1 -0
- package/dist/{chunk-M7FWXEXC.js → chunk-2KIGFOPM.js} +5 -5
- package/dist/{chunk-M7FWXEXC.js.map → chunk-2KIGFOPM.js.map} +1 -1
- package/dist/chunk-4B4S56WJ.mjs +110 -0
- package/dist/chunk-4B4S56WJ.mjs.map +1 -0
- package/dist/{chunk-PZXKFHPO.js → chunk-4WQB2ORG.js} +14 -14
- package/dist/{chunk-PZXKFHPO.js.map → chunk-4WQB2ORG.js.map} +1 -1
- package/dist/{chunk-XQZTOWS3.js → chunk-5737U6DI.js} +14 -14
- package/dist/{chunk-XQZTOWS3.js.map → chunk-5737U6DI.js.map} +1 -1
- package/dist/{chunk-ZOJ3TLO5.mjs → chunk-6CUBSQMD.mjs} +3 -3
- package/dist/{chunk-ZOJ3TLO5.mjs.map → chunk-6CUBSQMD.mjs.map} +1 -1
- package/dist/{chunk-JBGRXICL.js → chunk-746RKQHA.js} +75 -70
- package/dist/chunk-746RKQHA.js.map +1 -0
- package/dist/{chunk-E33HJMRP.js → chunk-7IPSQ5JR.js} +6 -6
- package/dist/{chunk-E33HJMRP.js.map → chunk-7IPSQ5JR.js.map} +1 -1
- package/dist/{chunk-FDVE56JS.js → chunk-7PLH3H3W.js} +3 -3
- package/dist/{chunk-FDVE56JS.js.map → chunk-7PLH3H3W.js.map} +1 -1
- package/dist/chunk-7U7C6XRI.mjs +6 -0
- package/dist/{chunk-OUERH2T4.mjs.map → chunk-7U7C6XRI.mjs.map} +1 -1
- package/dist/{chunk-DZDWBQKA.mjs → chunk-7Y2UPFSY.mjs} +3 -3
- package/dist/{chunk-DZDWBQKA.mjs.map → chunk-7Y2UPFSY.mjs.map} +1 -1
- package/dist/{chunk-JSLYNYTB.mjs → chunk-A2VLEORI.mjs} +3 -3
- package/dist/{chunk-JSLYNYTB.mjs.map → chunk-A2VLEORI.mjs.map} +1 -1
- package/dist/{chunk-6QABCGM6.mjs → chunk-ACTLQ2RH.mjs} +3 -3
- package/dist/{chunk-6QABCGM6.mjs.map → chunk-ACTLQ2RH.mjs.map} +1 -1
- package/dist/{chunk-PEEQMI7U.js → chunk-AWFZIXCT.js} +11 -11
- package/dist/{chunk-PEEQMI7U.js.map → chunk-AWFZIXCT.js.map} +1 -1
- package/dist/{chunk-HVFXFPUJ.mjs → chunk-B36PTS7B.mjs} +413 -94
- package/dist/chunk-B36PTS7B.mjs.map +1 -0
- package/dist/{chunk-KPFPSOYS.js → chunk-DPDV5Z4G.js} +12 -12
- package/dist/{chunk-KPFPSOYS.js.map → chunk-DPDV5Z4G.js.map} +1 -1
- package/dist/{chunk-JTO3K5B7.mjs → chunk-DQM5GR2P.mjs} +4 -4
- package/dist/{chunk-JTO3K5B7.mjs.map → chunk-DQM5GR2P.mjs.map} +1 -1
- package/dist/{chunk-HDQTZAGE.mjs → chunk-EBMPXFOP.mjs} +3 -3
- package/dist/{chunk-HDQTZAGE.mjs.map → chunk-EBMPXFOP.mjs.map} +1 -1
- package/dist/{chunk-DHXQBTXE.mjs → chunk-EEQYKMGH.mjs} +75 -70
- package/dist/chunk-EEQYKMGH.mjs.map +1 -0
- package/dist/{chunk-6VG65AIA.mjs → chunk-G5I3XEQS.mjs} +3 -3
- package/dist/{chunk-6VG65AIA.mjs.map → chunk-G5I3XEQS.mjs.map} +1 -1
- package/dist/chunk-GHECYDSZ.mjs +134 -0
- package/dist/chunk-GHECYDSZ.mjs.map +1 -0
- package/dist/{chunk-6AZTRTCG.js → chunk-GQ6CUOLA.js} +15 -15
- package/dist/{chunk-6AZTRTCG.js.map → chunk-GQ6CUOLA.js.map} +1 -1
- package/dist/{chunk-5BZDHZCN.js → chunk-HBMF3M5F.js} +4 -4
- package/dist/{chunk-5BZDHZCN.js.map → chunk-HBMF3M5F.js.map} +1 -1
- package/dist/{chunk-AVM4OZHR.mjs → chunk-HDDV63XJ.mjs} +3 -3
- package/dist/{chunk-AVM4OZHR.mjs.map → chunk-HDDV63XJ.mjs.map} +1 -1
- package/dist/{chunk-KOP3DPIR.mjs → chunk-HH5KGXTK.mjs} +4 -4
- package/dist/{chunk-KOP3DPIR.mjs.map → chunk-HH5KGXTK.mjs.map} +1 -1
- package/dist/{chunk-CQUA2AUA.mjs → chunk-I4PDSDVE.mjs} +3 -3
- package/dist/{chunk-CQUA2AUA.mjs.map → chunk-I4PDSDVE.mjs.map} +1 -1
- package/dist/{chunk-757HXAYX.js → chunk-ITFZZ6YT.js} +3 -3
- package/dist/{chunk-757HXAYX.js.map → chunk-ITFZZ6YT.js.map} +1 -1
- package/dist/{chunk-N3C323NY.mjs → chunk-JJ26JKBJ.mjs} +3 -3
- package/dist/{chunk-N3C323NY.mjs.map → chunk-JJ26JKBJ.mjs.map} +1 -1
- package/dist/{chunk-Z33JXJTJ.js → chunk-KMGGAL2X.js} +2 -2
- package/dist/{chunk-Z33JXJTJ.js.map → chunk-KMGGAL2X.js.map} +1 -1
- package/dist/{chunk-TS3N3LGZ.mjs → chunk-KQ3VAOAF.mjs} +4 -4
- package/dist/{chunk-TS3N3LGZ.mjs.map → chunk-KQ3VAOAF.mjs.map} +1 -1
- package/dist/{chunk-GPNBBUEN.js → chunk-LBS4PRC7.js} +3 -3
- package/dist/{chunk-GPNBBUEN.js.map → chunk-LBS4PRC7.js.map} +1 -1
- package/dist/chunk-LC7AM4J5.js +118 -0
- package/dist/chunk-LC7AM4J5.js.map +1 -0
- package/dist/{chunk-4DE2KJ7R.js → chunk-LF4L3ZP5.js} +8 -8
- package/dist/{chunk-4DE2KJ7R.js.map → chunk-LF4L3ZP5.js.map} +1 -1
- package/dist/{chunk-DYKFC7WY.js → chunk-LHYVFWHL.js} +8 -8
- package/dist/{chunk-DYKFC7WY.js.map → chunk-LHYVFWHL.js.map} +1 -1
- package/dist/{chunk-67CHHDBL.mjs → chunk-LIYSLNEK.mjs} +96 -644
- package/dist/chunk-LIYSLNEK.mjs.map +1 -0
- package/dist/{chunk-G3YUSRCL.js → chunk-LUYUFILE.js} +4 -4
- package/dist/{chunk-G3YUSRCL.js.map → chunk-LUYUFILE.js.map} +1 -1
- package/dist/{chunk-ZKR5AJV5.mjs → chunk-MIFP6QEQ.mjs} +4 -4
- package/dist/{chunk-ZKR5AJV5.mjs.map → chunk-MIFP6QEQ.mjs.map} +1 -1
- package/dist/{chunk-QZ54OCWD.mjs → chunk-MTANHZKJ.mjs} +7 -7
- package/dist/{chunk-QZ54OCWD.mjs.map → chunk-MTANHZKJ.mjs.map} +1 -1
- package/dist/{chunk-NSLYY62T.mjs → chunk-N6AVWMIB.mjs} +4 -4
- package/dist/{chunk-NSLYY62T.mjs.map → chunk-N6AVWMIB.mjs.map} +1 -1
- package/dist/{chunk-OC6PU7U2.mjs → chunk-N6X76QUF.mjs} +3 -3
- package/dist/{chunk-OC6PU7U2.mjs.map → chunk-N6X76QUF.mjs.map} +1 -1
- package/dist/{chunk-42F5EK24.mjs → chunk-NUH245XK.mjs} +4 -4
- package/dist/{chunk-42F5EK24.mjs.map → chunk-NUH245XK.mjs.map} +1 -1
- package/dist/{chunk-MANX6422.js → chunk-OXZYP32B.js} +7 -7
- package/dist/{chunk-MANX6422.js.map → chunk-OXZYP32B.js.map} +1 -1
- package/dist/{chunk-K37JPEQW.js → chunk-QWLL3B6U.js} +15 -15
- package/dist/{chunk-K37JPEQW.js.map → chunk-QWLL3B6U.js.map} +1 -1
- package/dist/{chunk-AXAIUCSF.mjs → chunk-SJXGIUHP.mjs} +8 -8
- package/dist/{chunk-AXAIUCSF.mjs.map → chunk-SJXGIUHP.mjs.map} +1 -1
- package/dist/{chunk-4TU246Q4.mjs → chunk-SZHKNGNR.mjs} +2 -2
- package/dist/{chunk-4TU246Q4.mjs.map → chunk-SZHKNGNR.mjs.map} +1 -1
- package/dist/{chunk-R3LYTIVN.js → chunk-U53KN4SA.js} +5 -5
- package/dist/{chunk-R3LYTIVN.js.map → chunk-U53KN4SA.js.map} +1 -1
- package/dist/{chunk-Y7SRO7MJ.mjs → chunk-UOLY4NXK.mjs} +3 -3
- package/dist/{chunk-Y7SRO7MJ.mjs.map → chunk-UOLY4NXK.mjs.map} +1 -1
- package/dist/{chunk-Z7K5AMCE.js → chunk-URVGBWCP.js} +4 -4
- package/dist/{chunk-Z7K5AMCE.js.map → chunk-URVGBWCP.js.map} +1 -1
- package/dist/chunk-UTOHMK52.js +8 -0
- package/dist/{chunk-D37M7MIH.js.map → chunk-UTOHMK52.js.map} +1 -1
- package/dist/{chunk-FFJVQWKO.js → chunk-VA36CJRV.js} +4 -4
- package/dist/{chunk-FFJVQWKO.js.map → chunk-VA36CJRV.js.map} +1 -1
- package/dist/{chunk-A3NNUKFA.js → chunk-VWDT7H6L.js} +96 -644
- package/dist/chunk-VWDT7H6L.js.map +1 -0
- package/dist/{chunk-OIJ435IZ.js → chunk-WSUQ76LN.js} +18 -18
- package/dist/{chunk-OIJ435IZ.js.map → chunk-WSUQ76LN.js.map} +1 -1
- package/dist/{chunk-XW5KNCWJ.mjs → chunk-XWF7QPIP.mjs} +3 -3
- package/dist/{chunk-XW5KNCWJ.mjs.map → chunk-XWF7QPIP.mjs.map} +1 -1
- package/dist/chunk-YQTE32QK.js +137 -0
- package/dist/chunk-YQTE32QK.js.map +1 -0
- package/dist/{chunk-DVH3JHZ3.mjs → chunk-ZDFVYSKK.mjs} +4 -4
- package/dist/{chunk-DVH3JHZ3.mjs.map → chunk-ZDFVYSKK.mjs.map} +1 -1
- package/dist/{chunk-GFNXWS3I.js → chunk-ZLPXFV5Y.js} +5 -5
- package/dist/{chunk-GFNXWS3I.js.map → chunk-ZLPXFV5Y.js.map} +1 -1
- package/dist/{chunk-W23TMUKB.js → chunk-ZY5AVC4P.js} +418 -98
- package/dist/chunk-ZY5AVC4P.js.map +1 -0
- package/dist/cli/index.js +3 -3
- package/dist/cli/index.mjs +1 -1
- package/dist/client/index.js +4 -4
- package/dist/client/index.mjs +3 -3
- package/dist/commerce/index.js +56 -56
- package/dist/commerce/index.mjs +5 -5
- package/dist/engage/index.js +10 -10
- package/dist/engage/index.mjs +7 -7
- package/dist/fleet/index.js +8 -8
- package/dist/fleet/index.mjs +4 -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 +63 -63
- package/dist/index.mjs +9 -9
- package/dist/layout/client.js +8 -8
- package/dist/layout/client.mjs +7 -7
- package/dist/layout/index.js +10 -10
- package/dist/layout/index.mjs +8 -8
- package/dist/llms/index.js +12 -12
- package/dist/llms/index.mjs +2 -2
- 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 +5 -5
- package/dist/seo/client.mjs +4 -4
- package/dist/seo/index.js +5 -5
- package/dist/seo/index.mjs +4 -4
- package/dist/server/index.js +3 -3
- package/dist/server/index.mjs +2 -2
- package/dist/shared/version.d.ts +1 -1
- package/dist/signal/index.js +11 -11
- package/dist/signal/index.mjs +2 -2
- package/dist/sitemap/index.js +2 -2
- package/dist/sitemap/index.mjs +1 -1
- package/dist/sync/BookingWidget.d.ts +0 -23
- package/dist/sync/BookingWidget.d.ts.map +1 -1
- package/dist/sync/MeetingFormatStep.d.ts +13 -0
- package/dist/sync/MeetingFormatStep.d.ts.map +1 -0
- package/dist/sync/api.d.ts +9 -10
- package/dist/sync/api.d.ts.map +1 -1
- package/dist/sync/booking-flow.d.ts +7 -0
- package/dist/sync/booking-flow.d.ts.map +1 -0
- package/dist/sync/booking-flow.test.d.ts +2 -0
- package/dist/sync/booking-flow.test.d.ts.map +1 -0
- package/dist/sync/index.d.ts +2 -2
- package/dist/sync/index.d.ts.map +1 -1
- package/dist/sync/index.js +20 -16
- package/dist/sync/index.mjs +4 -4
- package/dist/sync/types.d.ts +34 -0
- package/dist/sync/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/AnalyticsProvider-2XK54UZW.mjs +0 -11
- package/dist/AnalyticsProvider-PM7SOGOS.js +0 -32
- package/dist/ChatWidget-4PHZHGG5.mjs +0 -11
- package/dist/ChatWidget-7BYSGNO2.js +0 -20
- package/dist/EngageWidget-D6M6QWEC.mjs +0 -9
- package/dist/EngageWidget-Q4ITKTMJ.js +0 -18
- package/dist/ManagedForm-N63YGVNY.js +0 -23
- package/dist/ManagedForm-ZUXLHEQU.mjs +0 -14
- package/dist/SitemapSync-7OBOJG2L.js +0 -18
- package/dist/SitemapSync-G3OLECFI.mjs +0 -9
- package/dist/chunk-67CHHDBL.mjs.map +0 -1
- package/dist/chunk-A3NNUKFA.js.map +0 -1
- package/dist/chunk-CGCYZJYX.mjs +0 -41
- package/dist/chunk-CGCYZJYX.mjs.map +0 -1
- package/dist/chunk-D37M7MIH.js +0 -8
- package/dist/chunk-DHXQBTXE.mjs.map +0 -1
- package/dist/chunk-HVFXFPUJ.mjs.map +0 -1
- package/dist/chunk-JBGRXICL.js.map +0 -1
- package/dist/chunk-OUERH2T4.mjs +0 -6
- package/dist/chunk-TPL2IHFI.js +0 -43
- package/dist/chunk-TPL2IHFI.js.map +0 -1
- package/dist/chunk-W23TMUKB.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/blog/excerpt.ts","../src/blog/server-core.ts"],"names":["description"],"mappings":";;;AAkBO,SAAS,eAAA,CAAgB,GAAA,EAAgC,SAAA,GAAY,GAAA,EAAa;AACvF,EAAA,IAAI,CAAC,KAAK,OAAO,EAAA;AACjB,EAAA,IAAI,IAAA,GAAO,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,EAAK;AAG5B,EAAA,IAAI,KAAK,UAAA,CAAW,GAAG,KAAK,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AAChD,IAAA,MAAM,YAAA,GAAe,CAAC,KAAA,KAA2B;AAC/C,MAAA,MAAM,OAAO,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,GAAQ,CAAC,KAAK,CAAA;AAClD,MAAA,OAAO,KACJ,GAAA,CAAI,CAAC,MAAO,CAAA,IAAK,OAAO,MAAM,QAAA,GAAY,CAAA,CAAU,WAAY,CAAA,CAAU,OAAA,IAAW,KAAK,EAAG,CAAA,CAC7F,OAAO,OAAO,CAAA,CACd,KAAK,GAAG,CAAA;AAAA,IACb,CAAA;AACA,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAA,GAAS,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,IAC1B,CAAA,CAAA,MAAQ;AAEN,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,mBAAmB,EAAE,CAAC,CAAA;AAC/C,MAAA,IAAI;AACF,QAAA,MAAA,GAAS,IAAA,CAAK,MAAM,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA,GAAI,KAAA,GAAQ,CAAA,EAAG,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,MAC/D,CAAA,CAAA,MAAQ;AACN,QAAA,MAAA,GAAS,IAAA;AAAA,MACX;AAAA,IACF;AACA,IAAA,IAAA,GAAO,SAAS,YAAA,CAAa,MAAM,IAAI,IAAA,CAAK,OAAA,CAAQ,aAAa,GAAG,CAAA;AAAA,EACtE;AAEA,EAAA,MAAM,KAAA,GAAQ,IAAA,CACX,OAAA,CAAQ,iBAAA,EAAmB,GAAG,CAAA,CAC9B,OAAA,CAAQ,uBAAA,EAAyB,GAAG,CAAA,CACpC,OAAA,CAAQ,wBAAA,EAA0B,IAAI,CAAA,CACtC,OAAA,CAAQ,cAAA,EAAgB,EAAE,CAAA,CAC1B,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAA,CACtB,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA,CACnB,OAAA,CAAQ,MAAA,EAAQ,GAAG,EACnB,IAAA,EAAK;AAER,EAAA,IAAI,KAAA,CAAM,MAAA,IAAU,SAAA,EAAW,OAAO,KAAA;AAGtC,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,YAAY,CAAC,CAAA;AAC3C,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,YAAY,IAAI,CAAA,EAAG,MAAA,CAAO,WAAA,CAAY,IAAI,CAAA,EAAG,MAAA,CAAO,WAAA,CAAY,IAAI,CAAC,CAAA;AACtG,EAAA,IAAI,QAAA,GAAW,SAAA,GAAY,GAAA,EAAK,OAAO,MAAA,CAAO,MAAM,CAAA,EAAG,QAAA,GAAW,CAAC,CAAA,CAAE,IAAA,EAAK;AAE1E,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,SAAS,CAAA;AACpC,EAAA,MAAM,SAAA,GAAY,GAAA,CAAI,WAAA,CAAY,GAAG,CAAA;AACrC,EAAA,OAAO,CAAA,EAAA,CAAI,SAAA,GAAY,SAAA,GAAY,GAAA,GAAM,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,SAAS,CAAA,GAAI,GAAA,EAAK,OAAA,CAAQ,cAAA,EAAgB,EAAE,CAAC,CAAA,MAAA,CAAA;AACrG;;;AC9BO,IAAM,UAAA,GAAa;AAAA,EACxB,OAAO,EAAE,GAAA,EAAK,IAAI,GAAA,EAAK,EAAA,EAAI,aAAa,EAAA,EAAG;AAAA,EAC3C,iBAAiB,EAAE,GAAA,EAAK,KAAK,GAAA,EAAK,GAAA,EAAK,aAAa,GAAA,EAAI;AAAA,EACxD,SAAS,EAAE,GAAA,EAAK,KAAK,GAAA,EAAK,GAAA,EAAK,aAAa,GAAA,EAAI;AAAA,EAChD,IAAA,EAAM,EAAE,GAAA,EAAK,EAAA,EAAG;AAAA,EAChB,gBAAgB,EAAE,GAAA,EAAK,GAAG,GAAA,EAAK,CAAA,EAAG,OAAO,IAAA;AAAK;AAChD;AAcO,SAAS,gBAAA,CAAiB,OAAe,cAAA,EAA8C;AAC5F,EAAA,MAAM,SAAS,KAAA,CAAM,MAAA;AACrB,EAAA,IAAI,MAAA,GAAwC,MAAA;AAC5C,EAAA,IAAI,OAAA,GAAU,yBAAA;AAEd,EAAA,IAAI,MAAA,GAAS,UAAA,CAAW,KAAA,CAAM,GAAA,EAAK;AACjC,IAAA,MAAA,GAAS,OAAA;AACT,IAAA,OAAA,GAAU,CAAA,SAAA,EAAY,SAAS,UAAA,CAAW,KAAA,CAAM,GAAG,CAAA,0BAAA,EAA6B,UAAA,CAAW,MAAM,GAAG,CAAA,CAAA,CAAA;AAAA,EACtG,CAAA,MAAA,IAAW,MAAA,GAAS,UAAA,CAAW,KAAA,CAAM,GAAA,EAAK;AACxC,IAAA,MAAA,GAAS,SAAA;AACT,IAAA,OAAA,GAAU,CAAA,gBAAA,EAAmB,MAAM,CAAA,CAAA,EAAI,UAAA,CAAW,MAAM,GAAG,CAAA,KAAA,CAAA;AAAA,EAC7D,CAAA,MAAA,IAAW,cAAA,IAAkB,CAAC,KAAA,CAAM,WAAA,GAAc,QAAA,CAAS,cAAA,CAAe,WAAA,EAAa,CAAA,EAAG;AACxF,IAAA,MAAA,GAAS,SAAA;AACT,IAAA,OAAA,GAAU,oCAAA;AAAA,EACZ,CAAA,MAAA,IAAW,cAAA,IAAkB,CAAC,KAAA,CAAM,WAAA,GAAc,UAAA,CAAW,cAAA,CAAe,WAAA,EAAa,CAAA,EAAG;AAC1F,IAAA,MAAA,GAAS,SAAA;AACT,IAAA,OAAA,GAAU,0DAAA;AAAA,EACZ;AAEA,EAAA,OAAO,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,QAAQ,KAAA,EAAO,UAAA,CAAW,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAQ;AAC1F;AAKO,SAAS,uBAAA,CAAwB,aAAqB,cAAA,EAA8C;AACzG,EAAA,MAAM,SAAS,WAAA,CAAY,MAAA;AAC3B,EAAA,IAAI,MAAA,GAAwC,MAAA;AAC5C,EAAA,IAAI,OAAA,GAAU,6BAAA;AAEd,EAAA,IAAI,MAAA,GAAS,UAAA,CAAW,eAAA,CAAgB,GAAA,EAAK;AAC3C,IAAA,MAAA,GAAS,OAAA;AACT,IAAA,OAAA,GAAU,CAAA,+BAAA,EAAkC,MAAM,CAAA,CAAA,EAAI,UAAA,CAAW,gBAAgB,GAAG,CAAA,CAAA,CAAA;AAAA,EACtF,CAAA,MAAA,IAAW,MAAA,GAAS,UAAA,CAAW,eAAA,CAAgB,GAAA,EAAK;AAClD,IAAA,MAAA,GAAS,SAAA;AACT,IAAA,OAAA,GAAU,CAAA,sBAAA,EAAyB,MAAM,CAAA,CAAA,EAAI,UAAA,CAAW,gBAAgB,GAAG,CAAA,KAAA,CAAA;AAAA,EAC7E,CAAA,MAAA,IAAW,cAAA,IAAkB,CAAC,WAAA,CAAY,WAAA,GAAc,QAAA,CAAS,cAAA,CAAe,WAAA,EAAa,CAAA,EAAG;AAC9F,IAAA,MAAA,GAAS,SAAA;AACT,IAAA,OAAA,GAAU,0CAAA;AAAA,EACZ;AAEA,EAAA,OAAO,EAAE,KAAA,EAAO,kBAAA,EAAoB,KAAA,EAAO,WAAA,EAAa,QAAQ,KAAA,EAAO,UAAA,CAAW,eAAA,EAAiB,MAAA,EAAQ,OAAA,EAAQ;AACrH;AAKO,SAAS,oBAAoB,IAAA,EAAsD;AACxF,EAAA,MAAM,UAAiC,EAAC;AACxC,EAAA,MAAM,iBAAiB,IAAA,CAAK,eAAA;AAE5B,EAAA,IAAI,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,KAAA,EAAO;AACjC,IAAA,OAAA,CAAQ,IAAA,CAAK,iBAAiB,IAAA,CAAK,UAAA,IAAc,KAAK,KAAA,IAAS,EAAA,EAAI,cAAc,CAAC,CAAA;AAAA,EACpF;AAEA,EAAA,IAAI,KAAK,gBAAA,EAAkB;AACzB,IAAA,OAAA,CAAQ,IAAA,CAAK,uBAAA,CAAwB,IAAA,CAAK,gBAAA,EAAkB,cAAc,CAAC,CAAA;AAAA,EAC7E;AAGA,EAAA,IAAI,IAAA,CAAK,SAAS,cAAA,EAAgB;AAChC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,WAAA,EAAY;AAC1C,IAAA,MAAM,QAAA,GAAW,eAAe,WAAA,EAAY;AAC5C,IAAA,IAAI,CAAC,UAAA,CAAW,QAAA,CAAS,QAAQ,CAAA,EAAG;AAClC,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,KAAA,EAAO,cAAA;AAAA,QACP,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,MAAA,EAAQ,KAAK,KAAA,CAAM,MAAA;AAAA,QACnB,KAAA,EAAO,EAAE,GAAA,EAAK,GAAA,EAAI;AAAA,QAClB,MAAA,EAAQ,SAAA;AAAA,QACR,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,IACH;AAAA,EACF;AAGA,EAAA,IAAI,IAAA,CAAK,eAAe,MAAA,EAAW;AACjC,IAAA,IAAI,UAAA,GAA4C,MAAA;AAChD,IAAA,IAAI,WAAA,GAAc,mCAAA;AAElB,IAAA,IAAI,IAAA,CAAK,aAAa,GAAA,EAAK;AACzB,MAAA,UAAA,GAAa,OAAA;AACb,MAAA,WAAA,GAAc,CAAA,iBAAA,EAAoB,KAAK,UAAU,CAAA,6BAAA,CAAA;AAAA,IACnD,CAAA,MAAA,IAAW,IAAA,CAAK,UAAA,GAAa,IAAA,EAAM;AACjC,MAAA,UAAA,GAAa,SAAA;AACb,MAAA,WAAA,GAAc,CAAA,kBAAA,EAAqB,KAAK,UAAU,CAAA,4CAAA,CAAA;AAAA,IACpD,CAAA,MAAA,IAAW,IAAA,CAAK,UAAA,GAAa,IAAA,EAAM;AACjC,MAAA,WAAA,GAAc,CAAA,uBAAA,EAA0B,KAAK,UAAU,CAAA,iDAAA,CAAA;AAAA,IACzD;AAEA,IAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,MACX,KAAA,EAAO,YAAA;AAAA,MACP,KAAA,EAAO,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA;AAAA,MAC7B,QAAQ,IAAA,CAAK,UAAA;AAAA,MACb,OAAO,EAAE,GAAA,EAAK,MAAM,GAAA,EAAK,IAAA,EAAM,aAAa,IAAA,EAAK;AAAA,MACjD,MAAA,EAAQ,UAAA;AAAA,MACR,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,OAAA;AACT;AASA,eAAsB,YAAY,IAAA,EAA8C;AAC9E,EAAA,MAAM,SAAS,sBAAA,EAAuB;AACtC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAA,CAAQ,KAAK,8BAA8B,CAAA;AAC3C,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAO,GAAI,MAAA;AAE3B,EAAA,IAAI;AACF,IAAA,MAAM,WAAW,MAAM,KAAA,CAAM,GAAG,MAAM,CAAA,mBAAA,EAAsB,IAAI,CAAA,CAAA,EAAI;AAAA,MAClE,OAAA,EAAS,EAAE,WAAA,EAAa,MAAA,EAAO;AAAA,MAC/B,IAAA,EAAM,EAAE,UAAA,EAAY,EAAA;AAAG,KACxB,CAAA;AAED,IAAA,IAAI,CAAC,QAAA,CAAS,EAAA,EAAI,OAAO,IAAA;AAEzB,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,IAAA,OAAO,KAAK,IAAA,IAAQ,IAAA;AAAA,EACtB,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,+BAA+B,KAAK,CAAA;AAClD,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAKA,eAAsB,eAAA,GAEpB;AACA,EAAA,MAAM,SAAS,sBAAA,EAAuB;AACtC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAA,CAAQ,KAAK,8BAA8B,CAAA;AAC3C,IAAA,OAAO,EAAC;AAAA,EACV;AACA,EAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAO,GAAI,MAAA;AAE3B,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,MAAM,CAAA,kBAAA,CAAA,EAAsB;AAAA,MAC1D,OAAA,EAAS,EAAE,WAAA,EAAa,MAAA,EAAO;AAAA,MAC/B,IAAA,EAAM,EAAE,UAAA,EAAY,GAAA;AAAI,KACzB,CAAA;AAED,IAAA,IAAI,CAAC,QAAA,CAAS,EAAA,EAAI,OAAO,EAAC;AAE1B,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,IAAA,OAAO,IAAA,CAAK,SAAS,EAAC;AAAA,EACxB,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,gCAAgC,KAAK,CAAA;AACnD,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AAKA,eAAsB,iBAAA,GAAmF;AACvG,EAAA,MAAM,SAAS,sBAAA,EAAuB;AACtC,EAAA,IAAI,CAAC,MAAA,EAAQ,OAAO,EAAC;AACrB,EAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAO,GAAI,MAAA;AAE3B,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,MAAM,CAAA,uBAAA,CAAA,EAA2B;AAAA,MAC/D,OAAA,EAAS,EAAE,WAAA,EAAa,MAAA,EAAO;AAAA,MAC/B,IAAA,EAAM,EAAE,UAAA,EAAY,GAAA;AAAI,KACzB,CAAA;AAED,IAAA,IAAI,CAAC,QAAA,CAAS,EAAA,EAAI,OAAO,EAAC;AAE1B,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,IAAA,OAAO,IAAA,CAAK,cAAc,EAAC;AAAA,EAC7B,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,qCAAqC,KAAK,CAAA;AACxD,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AAmBA,SAAS,eAAe,OAAA,EAAsC;AAC5D,EAAA,MAAM,GAAA,GAAA,CAAO,OAAA,CAAQ,YAAA,IAAgB,OAAA,EAAS,MAAK,IAAK,OAAA;AACxD,EAAA,MAAM,YAAY,GAAA,CAAI,UAAA,CAAW,GAAG,CAAA,GAAI,GAAA,GAAM,IAAI,GAAG,CAAA,CAAA;AACrD,EAAA,OAAO,SAAA,CAAU,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA,IAAK,OAAA;AACzC;AAKA,eAAsB,wBAAA,CACpB,IAAA,EACA,OAAA,GAA+B,EAAC,EACb;AACnB,EAAA,MAAM,IAAA,GAAO,MAAM,WAAA,CAAY,IAAI,CAAA;AACnC,EAAA,MAAM,EAAE,QAAA,EAAU,OAAA,GAAU,EAAA,EAAI,YAAA,EAAc,eAAc,GAAI,OAAA;AAChE,EAAA,MAAM,IAAA,GAAO,eAAe,OAAO,CAAA;AAEnC,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,gBAAA;AAAA,MACP,WAAA,EAAa;AAAA,KACf;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,KAAA;AACtC,EAAA,MAAM,WAAA,GAAc,eAAA,CAAgB,IAAA,CAAK,gBAAA,IAAoB,KAAK,OAAO,CAAA;AAIzE,EAAA,MAAM,KAAA,GAAQ,KAAK,cAAA,IAAkB,YAAA;AACrC,EAAA,MAAM,MAAM,CAAA,EAAG,OAAO,GAAG,IAAI,CAAA,CAAA,EAAI,KAAK,IAAI,CAAA,CAAA;AAE1C,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,WAAA;AAAA,IACA,SAAA,EAAW;AAAA,MACT,KAAA,EAAO,KAAK,QAAA,IAAY,KAAA;AAAA,MACxB,WAAA,EAAa,KAAK,cAAA,IAAkB,WAAA;AAAA,MACpC,GAAA;AAAA,MACA,QAAA;AAAA,MACA,IAAA,EAAM,SAAA;AAAA,MACN,eAAe,IAAA,CAAK,YAAA;AAAA,MACpB,OAAA,EAAS,IAAA,CAAK,MAAA,GAAS,CAAC,OAAO,IAAA,CAAK,MAAA,KAAW,QAAA,GAAW,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA,GAAI,MAAA;AAAA,MAC5F,QAAQ,KAAA,GACJ;AAAA,QACE;AAAA,UACE,GAAA,EAAK,KAAA;AAAA,UACL,KAAA,EAAO,IAAA;AAAA,UACP,MAAA,EAAQ,GAAA;AAAA,UACR,GAAA,EAAK,IAAA,CAAK,kBAAA,IAAsB,IAAA,CAAK;AAAA;AACvC,OACF,GACA;AAAA,KACN;AAAA,IACA,OAAA,EAAS;AAAA,MACP,IAAA,EAAM,qBAAA;AAAA,MACN,KAAA;AAAA,MACA,WAAA;AAAA,MACA,MAAA,EAAQ,KAAA,GAAQ,CAAC,KAAK,CAAA,GAAI,MAAA;AAAA,MAC1B,OAAA,EAAS;AAAA,KACX;AAAA,IACA,UAAA,EAAY;AAAA,MACV,SAAA,EAAW,KAAK,aAAA,IAAiB;AAAA,KACnC;AAAA,IACA,KAAA,EAAO;AAAA,MACL,wBAAA,EAA0B,KAAK,YAAA,IAAgB,EAAA;AAAA,MAC/C,iBAAA,EAAmB,OAAO,IAAA,CAAK,QAAA,KAAa,WAAW,IAAA,CAAK,QAAA,GAAY,IAAA,CAAK,QAAA,EAAU,IAAA,IAAQ;AAAA;AACjG,GACF;AACF;AAKO,SAAS,0BAA0B,OAAA,EAG7B;AACX,EAAA,MAAM;AAAA,IACJ,KAAA,GAAQ,MAAA;AAAA,IACR,WAAA,GAAc,wCAAA;AAAA,IACd,QAAA;AAAA,IACA,OAAA,GAAU,EAAA;AAAA,IACV,YAAA;AAAA,IACA;AAAA,GACF,GAAI,OAAA;AACJ,EAAA,MAAM,IAAA,GAAO,eAAe,OAAO,CAAA;AAEnC,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,WAAA;AAAA,IACA,SAAA,EAAW;AAAA,MACT,KAAA;AAAA,MACA,WAAA;AAAA,MACA,GAAA,EAAK,CAAA,EAAG,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA;AAAA,MACtB,QAAA;AAAA,MACA,IAAA,EAAM,SAAA;AAAA,MACN,QAAQ,YAAA,GAAe,CAAC,EAAE,GAAA,EAAK,YAAA,EAAc,CAAA,GAAI;AAAA,KACnD;AAAA,IACA,OAAA,EAAS;AAAA,MACP,IAAA,EAAM,qBAAA;AAAA,MACN,KAAA;AAAA,MACA,WAAA;AAAA,MACA,MAAA,EAAQ,YAAA,GAAe,CAAC,YAAY,CAAA,GAAI,MAAA;AAAA,MACxC,OAAA,EAAS;AAAA;AACX,GACF;AACF;AAKO,SAAS,4BAAA,CACd,YAAA,EACA,OAAA,GAA2D,EAAC,EAClD;AACV,EAAA,MAAM,EAAE,QAAA,EAAU,OAAA,GAAU,IAAI,YAAA,EAAc,YAAA,GAAe,SAAQ,GAAI,OAAA;AACzE,EAAA,MAAM,KAAA,GAAQ,GAAG,YAAY,CAAA,OAAA,CAAA;AAC7B,EAAA,MAAM,WAAA,GAAc,uBAAuB,YAAY,CAAA,CAAA,CAAA;AAKvD,EAAA,MAAM,IAAA,GACJ,OAAA,CAAQ,YAAA,IACR,YAAA,CACG,aAAY,CACZ,IAAA,EAAK,CACL,OAAA,CAAQ,aAAA,EAAe,GAAG,CAAA,CAC1B,OAAA,CAAQ,YAAY,EAAE,CAAA;AAE3B,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,WAAA;AAAA,IACA,SAAA,EAAW;AAAA,MACT,KAAA;AAAA,MACA,WAAA;AAAA,MACA,KAAK,CAAA,EAAG,OAAO,CAAA,EAAG,YAAY,aAAa,IAAI,CAAA,CAAA;AAAA,MAC/C,QAAA;AAAA,MACA,IAAA,EAAM,SAAA;AAAA,MACN,QAAQ,YAAA,GAAe,CAAC,EAAE,GAAA,EAAK,YAAA,EAAc,CAAA,GAAI;AAAA;AACnD,GACF;AACF;AAUA,eAAsB,wBAAA,GAAwD;AAC5E,EAAA,MAAM,KAAA,GAAQ,MAAM,eAAA,EAAgB;AACpC,EAAA,OAAO,KAAA,CAAM,IAAI,CAAC,CAAA,MAAO,EAAE,IAAA,EAAM,CAAA,CAAE,MAAK,CAAE,CAAA;AAC5C;AAMA,eAAsB,4BAAA,GAAgE;AACpF,EAAA,MAAM,UAAA,GAAa,MAAM,iBAAA,EAAkB;AAC3C,EAAA,OAAO,UAAA,CAAW,IAAI,CAAC,CAAA,MAAO,EAAE,QAAA,EAAU,CAAA,CAAE,MAAK,CAAE,CAAA;AACrD;AAgBA,eAAsB,oBACpB,OAAA,EACyB;AACzB,EAAA,MAAM,KAAA,GAAQ,MAAM,eAAA,EAAgB;AACpC,EAAA,MAAM,UAAA,GAAa,MAAM,iBAAA,EAAkB;AAC3C,EAAA,MAAM,QAAA,GAAW,MAAM,gBAAA,EAAiB;AAExC,EAAA,MAAM,OAAA,GAA0B;AAAA;AAAA,IAE9B;AAAA,MACE,GAAA,EAAK,GAAG,OAAO,CAAA,KAAA,CAAA;AAAA,MACf,eAAA,EAAiB,OAAA;AAAA,MACjB,QAAA,EAAU;AAAA;AACZ,GACF;AAGA,EAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC5B,IAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,MACX,GAAA,EAAK,CAAA,EAAG,OAAO,CAAA,cAAA,EAAiB,QAAQ,YAAY,CAAA,CAAA;AAAA,MACpD,eAAA,EAAiB,QAAA;AAAA,MACjB,QAAA,EAAU;AAAA,KACX,CAAA;AAAA,EACH,CAAC,CAAA;AAGD,EAAA,UAAA,CAAW,OAAA,CAAQ,CAAC,GAAA,KAAQ;AAC1B,IAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,MACX,GAAA,EAAK,CAAA,EAAG,OAAO,CAAA,eAAA,EAAkB,IAAI,IAAI,CAAA,CAAA;AAAA,MACzC,eAAA,EAAiB,QAAA;AAAA,MACjB,QAAA,EAAU;AAAA,KACX,CAAA;AAAA,EACH,CAAC,CAAA;AAGD,EAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,KAAS;AACtB,IAAA,MAAM,QAAA,GAAY,KAAa,YAAA,KAAiB,QAAA;AAChD,IAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,MACX,GAAA,EAAK,CAAA,EAAG,OAAO,CAAA,MAAA,EAAS,KAAK,IAAI,CAAA,CAAA;AAAA,MACjC,cAAc,IAAA,CAAK,aAAA,GAAgB,IAAI,IAAA,CAAK,IAAA,CAAK,aAAa,CAAA,GAAI,MAAA;AAAA,MAClE,eAAA,EAAiB,WAAW,QAAA,GAAW,SAAA;AAAA,MACvC,QAAA,EAAU,WAAW,GAAA,GAAM;AAAA,KAC5B,CAAA;AAAA,EACH,CAAC,CAAA;AAED,EAAA,OAAO,OAAA;AACT;AASO,SAAS,sBAAA,CACd,IAAA,EACA,OAAA,GAAqE,EAAC,EAC9D;AACR,EAAA,MAAM,EAAE,OAAA,GAAU,EAAA,EAAI,QAAA,EAAU,SAAQ,GAAI,OAAA;AAE5C,EAAA,MAAM,MAAA,GAAc;AAAA,IAClB,UAAA,EAAY,oBAAA;AAAA,IACZ,OAAA,EAAS,aAAA;AAAA,IACT,UAAU,IAAA,CAAK,KAAA;AAAA,IACf,WAAA,EAAa,eAAA,CAAgB,IAAA,CAAK,OAAA,IAAW,KAAK,gBAAgB,CAAA;AAAA,IAClE,GAAA,EAAK,CAAA,EAAG,OAAO,CAAA,MAAA,EAAS,KAAK,IAAI,CAAA,CAAA;AAAA,IACjC,eAAe,IAAA,CAAK,YAAA;AAAA,IACpB,cAAc,IAAA,CAAK,UAAA;AAAA,IACnB,MAAA,EAAQ;AAAA,MACN,OAAA,EAAS,QAAA;AAAA,MACT,IAAA,EAAM,OAAO,IAAA,CAAK,MAAA,KAAW,WAAW,IAAA,CAAK,MAAA,GAAS,KAAK,MAAA,EAAQ;AAAA;AACrE,GACF;AAEA,EAAA,IAAI,KAAK,cAAA,EAAgB;AAGvB,IAAA,MAAA,CAAO,QAAQ,IAAA,CAAK,cAAA;AAAA,EACtB;AAEA,EAAA,IAAI,YAAY,OAAA,EAAS;AACvB,IAAA,MAAA,CAAO,SAAA,GAAY;AAAA,MACjB,OAAA,EAAS,cAAA;AAAA,MACT,IAAA,EAAM,QAAA;AAAA,MACN,MAAM,OAAA,GACF;AAAA,QACE,OAAA,EAAS,aAAA;AAAA,QACT,GAAA,EAAK;AAAA,OACP,GACA;AAAA,KACN;AAAA,EACF;AAGA,EAAA,IAAI,IAAA,CAAK,SAAA,IAAa,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,SAAS,CAAA,IAAK,IAAA,CAAK,SAAA,CAAU,MAAA,GAAS,CAAA,EAAG;AAChF,IAAA,MAAA,CAAO,UAAA,GAAa;AAAA,MAClB,OAAA,EAAS,SAAA;AAAA,MACT,UAAA,EAAY,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,CAAC,GAAA,MAA+C;AAAA,QAC7E,OAAA,EAAS,UAAA;AAAA,QACT,MAAM,GAAA,CAAI,QAAA;AAAA,QACV,cAAA,EAAgB;AAAA,UACd,OAAA,EAAS,QAAA;AAAA,UACT,MAAM,GAAA,CAAI;AAAA;AACZ,OACF,CAAE;AAAA,KACJ;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAKO,SAAS,sBAAA,CACd,OAAA,GAAyE,EAAC,EAClE;AACR,EAAA,MAAM,EAAE,OAAA,GAAU,EAAA,EAAI,QAAA,EAAU,aAAY,GAAI,OAAA;AAEhD,EAAA,OAAO;AAAA,IACL,UAAA,EAAY,oBAAA;AAAA,IACZ,OAAA,EAAS,MAAA;AAAA,IACT,IAAA,EAAM,QAAA,GAAW,CAAA,EAAG,QAAQ,CAAA,KAAA,CAAA,GAAU,MAAA;AAAA,IACtC,aAAa,WAAA,IAAe,mCAAA;AAAA,IAC5B,GAAA,EAAK,GAAG,OAAO,CAAA,KAAA;AAAA,GACjB;AACF;AASO,SAAS,kBACd,QAAA,EACe;AACf,EAAA,IAAI,CAAC,QAAA,IAAY,QAAA,CAAS,MAAA,KAAW,GAAG,OAAO,IAAA;AAE/C,EAAA,OAAO;AAAA,IACL,UAAA,EAAY,oBAAA;AAAA,IACZ,OAAA,EAAS,SAAA;AAAA,IACT,UAAA,EAAY,QAAA,CAAS,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,MACjC,OAAA,EAAS,UAAA;AAAA,MACT,MAAM,GAAA,CAAI,QAAA;AAAA,MACV,cAAA,EAAgB;AAAA,QACd,OAAA,EAAS,QAAA;AAAA,QACT,MAAM,GAAA,CAAI;AAAA;AACZ,KACF,CAAE;AAAA,GACJ;AACF;AAgBO,SAAS,mBAAA,CACd,IAAA,EACA,KAAA,EACA,OAAA,GAAgC,EAAC,EACzB;AACR,EAAA,MAAM,EAAE,OAAA,GAAU,EAAA,EAAG,GAAI,OAAA;AAEzB,EAAA,OAAO;AAAA,IACL,UAAA,EAAY,oBAAA;AAAA,IACZ,OAAA,EAAS,OAAA;AAAA,IACT,MAAM,IAAA,CAAK,KAAA;AAAA,IACX,WAAA,EAAa,eAAA,CAAgB,IAAA,CAAK,OAAA,IAAW,KAAK,gBAAgB,CAAA;AAAA,IAClE,OAAO,IAAA,CAAK,cAAA;AAAA,IACZ,WAAW,IAAA,CAAK,YAAA,GAAe,CAAA,EAAA,EAAK,IAAA,CAAK,YAAY,CAAA,CAAA,CAAA,GAAM,MAAA;AAAA,IAC3D,IAAA,EAAM,KAAA,CAAM,GAAA,CAAI,CAAC,MAAM,KAAA,MAAW;AAAA,MAChC,OAAA,EAAS,WAAA;AAAA,MACT,UAAU,KAAA,GAAQ,CAAA;AAAA,MAClB,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,GAAA,EAAK,IAAA,CAAK,GAAA,IAAO,CAAA,EAAG,OAAO,SAAS,IAAA,CAAK,IAAI,CAAA,MAAA,EAAS,KAAA,GAAQ,CAAC,CAAA;AAAA,KACjE,CAAE;AAAA,GACJ;AACF;AAuBA,IAAM,cAAA,GAAiB,GAAA;AASvB,eAAsB,eAAA,GAA6C;AACjE,EAAA,MAAM,SAAS,sBAAA,EAAuB;AACtC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAA,CAAQ,KAAK,8BAA8B,CAAA;AAC3C,IAAA,OAAO,EAAC;AAAA,EACV;AACA,EAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAO,GAAI,MAAA;AAE3B,EAAA,MAAM,QAA0B,EAAC;AACjC,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,IAAI;AACF,IAAA,OAAO,KAAA,CAAM,SAAS,cAAA,EAAgB;AACpC,MAAA,MAAM,WAAW,MAAM,KAAA;AAAA,QACrB,CAAA,EAAG,MAAM,CAAA,oCAAA,EAAuC,IAAI,CAAA,CAAA;AAAA,QACpD;AAAA,UACE,OAAA,EAAS,EAAE,WAAA,EAAa,MAAA,EAAO;AAAA,UAC/B,IAAA,EAAM,EAAE,UAAA,EAAY,GAAA;AAAI;AAC1B,OACF;AAEA,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAElB,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,MAAA,KAAA,CAAM,IAAA,CAAK,GAAI,IAAA,CAAK,KAAA,IAAS,EAAG,CAAA;AAChC,MAAA,IAAI,CAAC,IAAA,CAAK,UAAA,EAAY,QAAA,EAAU;AAChC,MAAA,IAAA,IAAQ,CAAA;AAAA,IACV;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,wCAAwC,KAAK,CAAA;AAAA,EAC7D;AACA,EAAA,OAAO,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,cAAc,CAAA;AACtC;AAKA,SAAS,UAAU,IAAA,EAAsB;AACvC,EAAA,OAAO,KACJ,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAA,CACrB,OAAA,CAAQ,MAAM,MAAM,CAAA,CACpB,QAAQ,IAAA,EAAM,MAAM,EACpB,OAAA,CAAQ,IAAA,EAAM,QAAQ,CAAA,CACtB,OAAA,CAAQ,MAAM,QAAQ,CAAA;AAC3B;AAKA,SAAS,UAAU,IAAA,EAAsB;AACvC,EAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,UAAA,EAAY,EAAE,EAAE,IAAA,EAAK;AAC3C;AAKA,eAAsB,gBAAgB,OAAA,EAA0C;AAC9E,EAAA,MAAM;AAAA,IACJ,OAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAA,GAAc,gCAAA;AAAA,IACd,QAAA,GAAW,OAAA;AAAA,IACX,SAAA;AAAA,IACA,cAAA;AAAA,IACA,SAAA;AAAA,IACA,GAAA,GAAM,EAAA;AAAA,IACN;AAAA,GACF,GAAI,OAAA;AAEJ,EAAA,MAAM,KAAA,GAAQ,MAAM,eAAA,EAAgB;AACpC,EAAA,MAAM,GAAA,GAAA,iBAAM,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAEnC,EAAA,IAAI,GAAA,GAAM,CAAA;AAAA;AAAA;AAAA,WAAA,EAGC,SAAA,CAAU,QAAQ,CAAC,CAAA;AAAA,UAAA,EACpB,OAAO,CAAA;AAAA,iBAAA,EACA,SAAA,CAAU,WAAW,CAAC,CAAA;AAAA,cAAA,EACzB,QAAQ,CAAA;AAAA,mBAAA,EACH,GAAG,CAAA;AAAA,aAAA,EACT,GAAG,CAAA;AAAA,SAAA,EACP,GAAG,CAAA;AAAA,qBAAA,EACS,OAAO,CAAA;AAAA,CAAA;AAG5B,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,GAAA,IAAO,CAAA,eAAA,EAAkB,SAAA,CAAU,SAAS,CAAC,CAAA;AAAA,CAAA;AAAA,EAC/C;AAEA,EAAA,IAAI,cAAA,EAAgB;AAClB,IAAA,GAAA,IAAO,CAAA,oBAAA,EAAuB,SAAA,CAAU,cAAc,CAAC,CAAA;AAAA,CAAA;AAAA,EACzD;AAEA,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,GAAA,IAAO,CAAA,eAAA,EAAkB,SAAA,CAAU,SAAS,CAAC,CAAA;AAAA,CAAA;AAAA,EAC/C;AAEA,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,GAAA,IAAO,CAAA;AAAA,WAAA,EACE,QAAQ,CAAA;AAAA,aAAA,EACN,SAAA,CAAU,QAAQ,CAAC,CAAA;AAAA,YAAA,EACpB,OAAO,CAAA;AAAA;AAAA,CAAA;AAAA,EAEnB;AAGA,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,OAAA,GAAU,CAAA,EAAG,OAAO,CAAA,MAAA,EAAS,KAAK,IAAI,CAAA,CAAA;AAC5C,IAAA,MAAM,OAAA,GAAU,KAAK,YAAA,GAAe,IAAI,KAAK,IAAA,CAAK,YAAY,CAAA,CAAE,WAAA,EAAY,GAAI,GAAA;AAChF,IAAA,MAAM,MAAA,GAAS,OAAO,IAAA,CAAK,MAAA,KAAW,WAAW,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,MAAA,EAAQ,IAAA,IAAQ,SAAA;AAGpF,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,YAAA,IAAgB,IAAA,CAAK,OAAA,IAAW,EAAA;AACzD,IAAA,MAAMA,YAAAA,GAAc,eAAA,CAAgB,IAAA,CAAK,OAAA,EAAS,GAAG,CAAA,IAAK,SAAA,CAAU,WAAW,CAAA,CAAE,SAAA,CAAU,CAAA,EAAG,GAAG,CAAA,GAAI,KAAA;AAErG,IAAA,GAAA,IAAO,CAAA;AAAA,aAAA,EACI,SAAA,CAAU,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,YAAA,EACtB,OAAO,CAAA;AAAA,+BAAA,EACY,OAAO,CAAA;AAAA,mBAAA,EACnB,SAAA,CAAUA,YAAW,CAAC,CAAA;AAAA,gCAAA,EACT,WAAW,CAAA;AAAA,eAAA,EAC5B,OAAO,CAAA;AAAA,cAAA,EACR,SAAA,CAAU,MAAM,CAAC,CAAA;AAAA,CAAA;AAG7B,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,MAAM,YAAA,GAAe,OAAO,IAAA,CAAK,QAAA,KAAa,WAAW,IAAA,CAAK,QAAA,GAAW,KAAK,QAAA,CAAS,IAAA;AACvF,MAAA,GAAA,IAAO,CAAA,gBAAA,EAAmB,SAAA,CAAU,YAAY,CAAC,CAAA;AAAA,CAAA;AAAA,IACnD;AAEA,IAAA,IAAI,KAAK,IAAA,IAAQ,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,EAAG;AACzC,MAAA,KAAA,MAAW,GAAA,IAAO,KAAK,IAAA,EAAM;AAC3B,QAAA,MAAM,OAAA,GAAU,OAAO,GAAA,KAAQ,QAAA,GAAW,MAAM,GAAA,CAAI,IAAA;AACpD,QAAA,GAAA,IAAO,CAAA,gBAAA,EAAmB,SAAA,CAAU,OAAO,CAAC,CAAA;AAAA,CAAA;AAAA,MAC9C;AAAA,IACF;AAEA,IAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,MAAA,GAAA,IAAO,CAAA,sBAAA,EAAyB,KAAK,cAAc,CAAA;AAAA,CAAA;AAAA,IACrD;AAEA,IAAA,GAAA,IAAO,CAAA;AAAA,CAAA;AAAA,EACT;AAEA,EAAA,GAAA,IAAO,CAAA;AAAA,MAAA,CAAA;AAGP,EAAA,OAAO,GAAA;AACT;AAKA,eAAsB,iBAAiB,OAAA,EAA0C;AAC/E,EAAA,MAAM;AAAA,IACJ,OAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAA,GAAc,gCAAA;AAAA,IACd;AAAA,GACF,GAAI,OAAA;AAEJ,EAAA,MAAM,KAAA,GAAQ,MAAM,eAAA,EAAgB;AACpC,EAAA,MAAM,GAAA,GAAA,iBAAM,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAEnC,EAAA,IAAI,IAAA,GAAO,CAAA;AAAA;AAAA,SAAA,EAEF,SAAA,CAAU,QAAQ,CAAC,CAAA;AAAA,YAAA,EAChB,SAAA,CAAU,WAAW,CAAC,CAAA;AAAA,cAAA,EACpB,OAAO,CAAA;AAAA,cAAA,EACP,OAAO,CAAA;AAAA,MAAA,EACf,OAAO,CAAA;AAAA,WAAA,EACF,GAAG,CAAA;AAAA,CAAA;AAGd,EAAA,IAAI,cAAA,EAAgB;AAClB,IAAA,IAAA,IAAQ,CAAA;AAAA,UAAA,EACA,SAAA,CAAU,cAAc,CAAC,CAAA;AAAA;AAAA,CAAA;AAAA,EAEnC;AAEA,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,OAAA,GAAU,CAAA,EAAG,OAAO,CAAA,MAAA,EAAS,KAAK,IAAI,CAAA,CAAA;AAC5C,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,YAAA,IAAgB,GAAA;AACxD,IAAA,MAAM,SAAA,GAAY,KAAK,YAAA,IAAgB,GAAA;AACvC,IAAA,MAAM,MAAA,GAAS,OAAO,IAAA,CAAK,MAAA,KAAW,WAAW,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,MAAA,EAAQ,IAAA,IAAQ,SAAA;AACpF,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,YAAA,IAAgB,IAAA,CAAK,OAAA,IAAW,EAAA;AAEzD,IAAA,IAAA,IAAQ,CAAA;AAAA,WAAA,EACC,SAAA,CAAU,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,gBAAA,EAChB,OAAO,CAAA;AAAA,QAAA,EACf,OAAO,CAAA;AAAA,aAAA,EACF,IAAI,IAAA,CAAK,OAAO,CAAA,CAAE,aAAa,CAAA;AAAA,eAAA,EAC7B,IAAI,IAAA,CAAK,SAAS,CAAA,CAAE,aAAa,CAAA;AAAA;AAAA,YAAA,EAEpC,SAAA,CAAU,MAAM,CAAC,CAAA;AAAA;AAAA,aAAA,EAEhB,SAAA,CAAU,eAAA,CAAgB,IAAA,CAAK,OAAA,EAAS,GAAG,CAAA,IAAK,SAAA,CAAU,WAAW,CAAA,CAAE,SAAA,CAAU,CAAA,EAAG,GAAG,CAAC,CAAC,CAAA;AAAA,kCAAA,EACpE,WAAW,CAAA;AAAA;AAAA,CAAA;AAAA,EAE7C;AAEA,EAAA,IAAA,IAAQ,CAAA,OAAA,CAAA;AAER,EAAA,OAAO,IAAA;AACT;AAUA,eAAsB,gBAAA,GAA4C;AAChE,EAAA,MAAM,SAAS,sBAAA,EAAuB;AACtC,EAAA,IAAI,CAAC,MAAA,EAAQ,OAAO,EAAC;AACrB,EAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAO,GAAI,MAAA;AAE3B,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,MAAM,CAAA,qBAAA,CAAA,EAAyB;AAAA,MAC7D,OAAA,EAAS,EAAE,WAAA,EAAa,MAAA,EAAO;AAAA,MAC/B,IAAA,EAAM,EAAE,UAAA,EAAY,GAAA;AAAI,KACzB,CAAA;AACD,IAAA,IAAI,CAAC,QAAA,CAAS,EAAA,EAAI,OAAO,EAAC;AAC1B,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AAEjC,IAAA,OAAA,CAAQ,KAAK,QAAA,IAAY,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,MAAY;AAAA,MAC5C,IAAI,CAAA,CAAE,EAAA;AAAA,MACN,cAAc,CAAA,CAAE,YAAA;AAAA,MAChB,cAAc,CAAA,CAAE,YAAA;AAAA,MAChB,YAAY,CAAA,CAAE,UAAA;AAAA,MACd,gBAAgB,CAAA,CAAE,cAAA;AAAA,MAClB,UAAU,CAAA,CAAE,QAAA;AAAA,MACZ,YAAY,CAAA,CAAE,UAAA;AAAA,MACd,iBAAiB,CAAA,CAAE,eAAA;AAAA,MACnB,gBAAgB,CAAA,CAAE,cAAA;AAAA,MAClB,qBAAqB,CAAA,CAAE,mBAAA;AAAA,MACvB,eAAe,CAAA,CAAE,aAAA;AAAA,MACjB,YAAY,CAAA,CAAE,UAAA;AAAA,MACd,MAAA,EAAQ,IAAA;AAAA,MACR,UAAU,EAAC;AAAA,MACX,eAAe;AAAC,KAClB,CAAE,CAAA;AAAA,EACJ,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,yCAAyC,KAAK,CAAA;AAC5D,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AAKA,eAAsB,gBAAgB,IAAA,EAA4C;AAChF,EAAA,MAAM,SAAS,sBAAA,EAAuB;AACtC,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,EAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAO,GAAI,MAAA;AAE3B,EAAA,IAAI;AACF,IAAA,MAAM,WAAW,MAAM,KAAA,CAAM,GAAG,MAAM,CAAA,sBAAA,EAAyB,IAAI,CAAA,CAAA,EAAI;AAAA,MACrE,OAAA,EAAS,EAAE,WAAA,EAAa,MAAA,EAAO;AAAA,MAC/B,IAAA,EAAM,EAAE,UAAA,EAAY,GAAA;AAAI,KACzB,CAAA;AACD,IAAA,IAAI,CAAC,QAAA,CAAS,EAAA,EAAI,OAAO,IAAA;AACzB,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AAEjC,IAAA,OAAO;AAAA,MACL,IAAI,IAAA,CAAK,EAAA;AAAA,MACT,cAAc,IAAA,CAAK,YAAA;AAAA,MACnB,cAAc,IAAA,CAAK,YAAA;AAAA,MACnB,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,gBAAgB,IAAA,CAAK,cAAA;AAAA,MACrB,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,iBAAiB,IAAA,CAAK,eAAA;AAAA;AAAA;AAAA,MAGtB,cAAA,EAAgB,IAAA,CAAK,cAAA,IAAkB,IAAA,CAAK,MAAA,EAAQ,EAAA;AAAA,MACpD,qBAAqB,IAAA,CAAK,mBAAA;AAAA,MAC1B,eAAe,IAAA,CAAK,aAAA;AAAA,MACpB,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,MAAA,EAAQ,KAAK,MAAA,IAAU,IAAA;AAAA,MACvB,QAAA,EAAU,IAAA,CAAK,QAAA,IAAY,EAAC;AAAA,MAC5B,aAAA,EAAe,IAAA,CAAK,aAAA,IAAiB;AAAC,KACxC;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,wCAAwC,KAAK,CAAA;AAC3D,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAMO,SAAS,qBAAqB,IAAA,EAAgD;AACnF,EAAA,IAAI,CAAC,IAAA,CAAK,UAAA,IAAc,CAAC,IAAA,CAAK,cAAc,OAAO,IAAA;AAEnD,EAAA,MAAM,QAAA,GAAW,KAAK,YAAA,KAAiB,QAAA;AAMvC,EAAA,OAAO;AAAA,IACL,YAAA,EAAc,KAAK,YAAA,IAAgB,EAAA;AAAA,IACnC,YAAA,EAAc,KAAK,YAAA,IAAgB,EAAA;AAAA,IACnC,MAAA,EAAQ,QAAA,GACJ,IAAA,GACA,IAAA,CAAK,kBAAA,GACH;AAAA,MACE,MAAM,IAAA,CAAK,kBAAA;AAAA,MACX,KAAA,EAAO,KAAK,mBAAA,IAAuB,EAAA;AAAA,MACnC,QAAA,EAAU,KAAK,sBAAA,IAA0B;AAAA,KAC3C,GACA,IAAA;AAAA,IACN,QAAA,EAAU,IAAA,CAAK,gBAAA,IAAoB,EAAC;AAAA,IACpC,SAAA,EAAW;AAAA,GACb;AACF;AAMA,eAAsB,sBAAsB,YAAA,EAIlC;AACR,EAAA,OAAA,CAAQ,IAAA;AAAA,IACN;AAAA,GACF;AACA,EAAA,MAAM,KAAA,GAAQ,MAAM,kBAAA,CAAmB,YAAY,CAAA;AACnD,EAAA,IAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA;AAE7B,EAAA,MAAM,cAAA,GAAiB,CAAC,GAAG,KAAK,EAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAA,CAAO,CAAA,CAAE,UAAA,IAAc,CAAA,KAAM,CAAA,CAAE,cAAc,CAAA,CAAE,CAAA;AAC1F,EAAA,MAAM,MAAA,GAAS,eAAe,CAAC,CAAA;AAC/B,EAAA,MAAM,eAAA,GAAkB,cAAA,CAAe,KAAA,CAAM,CAAC,CAAA;AAE9C,EAAA,MAAM,gBAAqE,EAAC;AAC5E,EAAA,KAAA,MAAW,WAAW,eAAA,EAAiB;AACrC,IAAA,aAAA,CAAc,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,CAAO,IAAA,EAAM,EAAA,EAAI,OAAA,CAAQ,IAAA,EAAM,MAAA,EAAQ,OAAA,CAAQ,KAAA,EAAO,CAAA;AACjF,IAAA,aAAA,CAAc,IAAA,CAAK,EAAE,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAM,EAAA,EAAI,MAAA,CAAO,IAAA,EAAM,MAAA,EAAQ,MAAA,CAAO,KAAA,EAAO,CAAA;AAAA,EAClF;AAEA,EAAA,OAAO,EAAE,MAAA,EAAQ,eAAA,EAAiB,aAAA,EAAc;AAClD;AAKA,eAAsB,mBAAmB,YAAA,EAAiD;AACxF,EAAA,MAAM,SAAS,sBAAA,EAAuB;AACtC,EAAA,IAAI,CAAC,MAAA,EAAQ,OAAO,EAAC;AACrB,EAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAO,GAAI,MAAA;AAE3B,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,MAAM,CAAA,4BAAA,EAA+B,kBAAA,CAAmB,YAAY,CAAC,CAAA,YAAA,CAAA,EAAgB;AAAA,MACnH,OAAA,EAAS,EAAE,WAAA,EAAa,MAAA,EAAO;AAAA,MAC/B,IAAA,EAAM,EAAE,UAAA,EAAY,GAAA;AAAI,KACzB,CAAA;AACD,IAAA,IAAI,CAAC,QAAA,CAAS,EAAA,EAAI,OAAO,EAAC;AAC1B,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,IAAA,OAAO,IAAA,CAAK,SAAS,EAAC;AAAA,EACxB,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,yCAAyC,KAAK,CAAA;AAC5D,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AAUO,SAAS,6BAAA,CACd,OAAA,EACA,OAAA,GAAmD,EAAC,EAC5C;AACR,EAAA,MAAM,EAAE,OAAA,GAAU,EAAA,EAAI,QAAA,GAAW,SAAQ,GAAI,OAAA;AAE7C,EAAA,OAAO;AAAA,IACL,UAAA,EAAY,oBAAA;AAAA,IACZ,OAAA,EAAS,UAAA;AAAA,IACT,MAAM,OAAA,CAAQ,YAAA;AAAA,IACd,WAAA,EAAa,CAAA,eAAA,EAAkB,OAAA,CAAQ,UAAU,CAAA,CAAA;AAAA,IACjD,aAAA,EAAe,QAAQ,QAAA,CAAS,MAAA;AAAA,IAChC,iBAAiB,OAAA,CAAQ,QAAA,CAAS,GAAA,CAAI,CAAC,MAAM,CAAA,MAAO;AAAA,MAClD,OAAA,EAAS,UAAA;AAAA,MACT,UAAU,CAAA,GAAI,CAAA;AAAA,MACd,MAAM,IAAA,CAAK,KAAA;AAAA,MACX,KAAK,CAAA,EAAG,OAAO,GAAG,QAAQ,CAAA,CAAA,EAAI,KAAK,IAAI,CAAA;AAAA,KACzC,CAAE;AAAA,GACJ;AACF;AAOO,SAAS,4BAAA,CACd,IAAA,EACA,OAAA,EACA,OAAA,GAAwF,EAAC,EACjF;AACR,EAAA,MAAM,EAAE,OAAA,GAAU,EAAA,EAAI,WAAW,OAAA,EAAS,QAAA,EAAU,SAAQ,GAAI,OAAA;AAChE,EAAA,MAAM,QAAA,GAAW,KAAK,YAAA,KAAiB,QAAA;AAEvC,EAAA,MAAM,MAAA,GAAc;AAAA,IAClB,UAAA,EAAY,oBAAA;AAAA,IACZ,OAAA,EAAS,SAAA;AAAA,IACT,UAAU,IAAA,CAAK,KAAA;AAAA,IACf,WAAA,EAAa,eAAA,CAAgB,IAAA,CAAK,OAAA,IAAW,KAAK,gBAAgB,CAAA;AAAA,IAClE,KAAK,CAAA,EAAG,OAAO,GAAG,QAAQ,CAAA,CAAA,EAAI,KAAK,IAAI,CAAA,CAAA;AAAA,IACvC,eAAe,IAAA,CAAK,YAAA;AAAA,IACpB,cAAc,IAAA,CAAK,UAAA;AAAA,IACnB,MAAA,EAAQ;AAAA,MACN,OAAA,EAAS,QAAA;AAAA,MACT,IAAA,EAAM,OAAO,IAAA,CAAK,MAAA,KAAW,WAAW,IAAA,CAAK,MAAA,GAAU,KAAK,MAAA,EAAgB;AAAA,KAC9E;AAAA,IACA,QAAA,EAAU,IAAA,CAAK,eAAA,IAAmB,IAAA,CAAK;AAAA,GACzC;AAEA,EAAA,IAAI,KAAK,cAAA,EAAgB;AAGvB,IAAA,MAAA,CAAO,QAAQ,IAAA,CAAK,cAAA;AAAA,EACtB;AAEA,EAAA,IAAI,YAAY,OAAA,EAAS;AACvB,IAAA,MAAA,CAAO,SAAA,GAAY;AAAA,MACjB,OAAA,EAAS,cAAA;AAAA,MACT,IAAA,EAAM,QAAA;AAAA,MACN,GAAI,WAAW,EAAE,IAAA,EAAM,EAAE,OAAA,EAAS,aAAA,EAAe,GAAA,EAAK,OAAA,EAAQ;AAAE,KAClE;AAAA,EACF;AAGA,EAAA,IAAI,QAAA,IAAY,OAAA,CAAQ,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG;AAC3C,IAAA,MAAA,CAAO,OAAA,GAAU,OAAA,CAAQ,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MAC5C,OAAA,EAAS,SAAA;AAAA,MACT,UAAU,CAAA,CAAE,KAAA;AAAA,MACZ,KAAK,CAAA,EAAG,OAAO,GAAG,QAAQ,CAAA,CAAA,EAAI,EAAE,IAAI,CAAA;AAAA,KACtC,CAAE,CAAA;AAAA,EACJ,CAAA,MAAA,IAAW,CAAC,QAAA,IAAY,OAAA,CAAQ,MAAA,EAAQ;AACtC,IAAA,MAAA,CAAO,QAAA,GAAW;AAAA,MAChB,OAAA,EAAS,SAAA;AAAA,MACT,QAAA,EAAU,QAAQ,MAAA,CAAO,KAAA;AAAA,MACzB,GAAA,EAAK,GAAG,OAAO,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,OAAA,CAAQ,OAAO,IAAI,CAAA;AAAA,KACnD;AAAA,EACF;AAGA,EAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,IAAA,MAAA,CAAO,eAAA,GAAkB;AAAA,MACvB,OAAA,EAAS,OAAA;AAAA,MACT,MAAM,OAAA,CAAQ;AAAA,KAChB;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAMO,SAAS,+BAAA,CACd,IAAA,EACA,OAAA,EACA,OAAA,GAAsE,EAAC,EAC/D;AACR,EAAA,MAAM,EAAE,OAAA,GAAU,EAAA,EAAI,WAAW,MAAA,EAAQ,QAAA,GAAW,SAAQ,GAAI,OAAA;AAEhE,EAAA,MAAM,KAAA,GAAe;AAAA,IACnB,EAAE,SAAS,UAAA,EAAY,QAAA,EAAU,GAAG,IAAA,EAAM,QAAA,EAAU,MAAM,OAAA,EAAQ;AAAA,IAClE,EAAE,OAAA,EAAS,UAAA,EAAY,QAAA,EAAU,CAAA,EAAG,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,CAAA,EAAG,OAAO,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAG;AAAA,IAChF;AAAA,MACE,OAAA,EAAS,UAAA;AAAA,MACT,QAAA,EAAU,CAAA;AAAA,MACV,MAAM,OAAA,CAAQ,YAAA;AAAA,MACd,MAAM,CAAA,EAAG,OAAO,GAAG,QAAQ,CAAA,SAAA,EAAY,QAAQ,YAAY,CAAA;AAAA,KAC7D;AAAA,IACA;AAAA,MACE,OAAA,EAAS,UAAA;AAAA,MACT,QAAA,EAAU,CAAA;AAAA,MACV,MAAM,IAAA,CAAK,KAAA;AAAA,MACX,MAAM,CAAA,EAAG,OAAO,GAAG,QAAQ,CAAA,CAAA,EAAI,KAAK,IAAI,CAAA;AAAA;AAC1C,GACF;AAEA,EAAA,OAAO;AAAA,IACL,UAAA,EAAY,oBAAA;AAAA,IACZ,OAAA,EAAS,gBAAA;AAAA,IACT,eAAA,EAAiB;AAAA,GACnB;AACF;AAKO,SAAS,4BAAA,CACd,OAAA,EACA,OAAA,GAAsE,EAAC,EAC/D;AACR,EAAA,MAAM,EAAE,OAAA,GAAU,EAAA,EAAI,QAAA,GAAW,OAAA,EAAS,UAAS,GAAI,OAAA;AAEvD,EAAA,OAAO;AAAA,IACL,UAAA,EAAY,oBAAA;AAAA,IACZ,OAAA,EAAS,gBAAA;AAAA,IACT,MAAM,OAAA,CAAQ,YAAA;AAAA,IACd,WAAA,EAAa,CAAA,uBAAA,EAA0B,OAAA,CAAQ,UAAU,CAAA,CAAA;AAAA,IACzD,KAAK,CAAA,EAAG,OAAO,GAAG,QAAQ,CAAA,SAAA,EAAY,QAAQ,YAAY,CAAA,CAAA;AAAA,IAC1D,GAAI,QAAA,IAAY;AAAA,MACd,UAAU,EAAE,OAAA,EAAS,WAAW,IAAA,EAAM,QAAA,EAAU,KAAK,OAAA;AAAQ,KAC/D;AAAA,IACA,UAAA,EAAY,QAAQ,MAAA,GAChB;AAAA,MACE,OAAA,EAAS,SAAA;AAAA,MACT,QAAA,EAAU,QAAQ,MAAA,CAAO,KAAA;AAAA,MACzB,GAAA,EAAK,GAAG,OAAO,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,OAAA,CAAQ,OAAO,IAAI,CAAA;AAAA,KACnD,GACA,MAAA;AAAA,IACJ,OAAA,EAAS,OAAA,CAAQ,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MACpC,OAAA,EAAS,SAAA;AAAA,MACT,UAAU,CAAA,CAAE,KAAA;AAAA,MACZ,KAAK,CAAA,EAAG,OAAO,GAAG,QAAQ,CAAA,CAAA,EAAI,EAAE,IAAI,CAAA;AAAA,KACtC,CAAE;AAAA,GACJ;AACF;AAKA,eAAsB,2BAAA,CACpB,WAAA,EACA,OAAA,GAAsE,EAAC,EACvE;AACA,EAAA,MAAM,OAAA,GAAU,MAAM,eAAA,CAAgB,WAAW,CAAA;AACjD,EAAA,IAAI,CAAC,OAAA,EAAS,OAAO,EAAC;AAEtB,EAAA,MAAM,EAAE,QAAA,GAAW,EAAA,EAAI,UAAU,EAAA,EAAI,QAAA,GAAW,SAAQ,GAAI,OAAA;AAC5D,EAAA,MAAM,KAAA,GAAQ,GAAG,OAAA,CAAQ,YAAY,GAAG,QAAA,GAAW,CAAA,GAAA,EAAM,QAAQ,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA;AACxE,EAAA,MAAM,cAAc,CAAA,uBAAA,EAA0B,OAAA,CAAQ,UAAU,CAAA,EAAA,EAAK,QAAQ,aAAa,CAAA,+CAAA,CAAA;AAE1F,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,WAAA;AAAA,IACA,SAAA,EAAW;AAAA,MACT,KAAA;AAAA,MACA,WAAA;AAAA,MACA,KAAK,CAAA,EAAG,OAAO,GAAG,QAAQ,CAAA,SAAA,EAAY,QAAQ,YAAY,CAAA,CAAA;AAAA,MAC1D,IAAA,EAAM;AAAA;AACR,GACF;AACF;AAKA,eAAsB,kBAAA,CACpB,WAAA,EACA,OAAA,GAAiD,EAAC,EACvB;AAC3B,EAAA,MAAM,SAAS,sBAAA,EAAuB;AACtC,EAAA,IAAI,CAAC,MAAA,EAAQ,OAAO,EAAC;AACrB,EAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAO,GAAI,MAAA;AAC3B,EAAA,MAAM,EAAE,KAAA,GAAQ,CAAA,EAAE,GAAI,OAAA;AAStB,EAAA,MAAM,OAAA,GAAU,MAAM,WAAA,CAAY,WAAW,CAAA;AAC7C,EAAA,IAAI,CAAC,OAAA,EAAS,EAAA,EAAI,OAAO,EAAC;AAE1B,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,MAAM,CAAA,oBAAA,CAAA,EAAwB;AAAA,MAC5D,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,WAAA,EAAa,MAAA;AAAA,QACb,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,QACnB,iBAAiB,OAAA,CAAQ,EAAA;AAAA,QACzB;AAAA,OACD,CAAA;AAAA,MACD,IAAA,EAAM,EAAE,UAAA,EAAY,GAAA;AAAI,KACzB,CAAA;AAED,IAAA,IAAI,CAAC,QAAA,CAAS,EAAA,EAAI,OAAO,EAAC;AAE1B,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,IAAA,OAAO,IAAA,CAAK,SAAS,EAAC;AAAA,EACxB,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,wCAAwC,KAAK,CAAA;AAC3D,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AASO,SAAS,wBAAA,CACd,IAAA,EACA,OAAA,GAAmD,EAAC,EAC5C;AACR,EAAA,MAAM,EAAE,OAAA,GAAU,EAAA,EAAI,QAAA,GAAW,QAAO,GAAI,OAAA;AAE5C,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ;AAAA,MACE,OAAA,EAAS,UAAA;AAAA,MACT,QAAA,EAAU,CAAA;AAAA,MACV,IAAA,EAAM,QAAA;AAAA,MACN,IAAA,EAAM;AAAA,KACR;AAAA,IACA;AAAA,MACE,OAAA,EAAS,UAAA;AAAA,MACT,QAAA,EAAU,CAAA;AAAA,MACV,IAAA,EAAM,MAAA;AAAA,MACN,IAAA,EAAM,GAAG,OAAO,CAAA,KAAA;AAAA;AAClB,GACF;AAEA,EAAA,IAAI,KAAK,QAAA,EAAU;AACjB,IAAA,MAAM,YAAA,GAAe,OAAO,IAAA,CAAK,QAAA,KAAa,WAAW,IAAA,CAAK,QAAA,GAAW,KAAK,QAAA,CAAS,IAAA;AACvF,IAAA,MAAM,YAAA,GAAe,OAAO,IAAA,CAAK,QAAA,KAAa,WAC1C,IAAA,CAAK,QAAA,CAAS,WAAA,EAAY,CAAE,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA,GAC/C,KAAK,QAAA,CAAS,IAAA;AAElB,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,OAAA,EAAS,UAAA;AAAA,MACT,QAAA,EAAU,CAAA;AAAA,MACV,IAAA,EAAM,YAAA;AAAA,MACN,IAAA,EAAM,CAAA,EAAG,OAAO,CAAA,eAAA,EAAkB,YAAY,CAAA;AAAA,KAC/C,CAAA;AAED,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,OAAA,EAAS,UAAA;AAAA,MACT,QAAA,EAAU,CAAA;AAAA,MACV,MAAM,IAAA,CAAK,KAAA;AAAA,MACX,IAAA,EAAM,CAAA,EAAG,OAAO,CAAA,MAAA,EAAS,KAAK,IAAI,CAAA;AAAA,KACnC,CAAA;AAAA,EACH,CAAA,MAAO;AACL,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,OAAA,EAAS,UAAA;AAAA,MACT,QAAA,EAAU,CAAA;AAAA,MACV,MAAM,IAAA,CAAK,KAAA;AAAA,MACX,IAAA,EAAM,CAAA,EAAG,OAAO,CAAA,MAAA,EAAS,KAAK,IAAI,CAAA;AAAA,KACnC,CAAA;AAAA,EACH;AAEA,EAAA,OAAO;AAAA,IACL,UAAA,EAAY,oBAAA;AAAA,IACZ,OAAA,EAAS,gBAAA;AAAA,IACT,eAAA,EAAiB;AAAA,GACnB;AACF;AAWO,SAAS,sBAAA,CACd,IAAA,EACA,OAAA,GAAqE,EAAC,EAC5D;AACV,EAAA,MAAM,UAAoB,EAAC;AAO3B,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,WAAA;AACvC,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,MAAM,MAAM,KAAA,CAAM,OAAA,CAAQ,UAAU,CAAA,GAAI,UAAA,GAAa,CAAC,UAAU,CAAA;AAChE,IAAA,OAAA,CAAQ,IAAA,CAAK,GAAG,GAAG,CAAA;AAAA,EACrB,CAAA,MAAO;AAEL,IAAA,OAAA,CAAQ,IAAA,CAAK,sBAAA,CAAuB,IAAA,EAAM,OAAO,CAAC,CAAA;AAGlD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,IAAc,IAAA,CAAa,QAAA;AACjD,IAAA,IAAI,QAAA,IAAY,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG;AACnC,MAAA,MAAM,SAAA,GAAY,kBAAkB,QAAQ,CAAA;AAC5C,MAAA,IAAI,SAAA,EAAW,OAAA,CAAQ,IAAA,CAAK,SAAS,CAAA;AAAA,IACvC;AAAA,EACF;AAGA,EAAA,OAAA,CAAQ,IAAA,CAAK,wBAAA,CAAyB,IAAA,EAAM,OAAO,CAAC,CAAA;AAEpD,EAAA,OAAO,OAAA;AACT;AASA,eAAsB,gBAAgB,IAAA,EAA0C;AAC9E,EAAA,MAAM,SAAS,sBAAA,EAAuB;AACtC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAA,CAAQ,KAAK,8BAA8B,CAAA;AAC3C,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAO,GAAI,MAAA;AAE3B,EAAA,IAAI;AACF,IAAA,MAAM,WAAW,MAAM,KAAA,CAAM,GAAG,MAAM,CAAA,qBAAA,EAAwB,IAAI,CAAA,CAAA,EAAI;AAAA,MACpE,OAAA,EAAS,EAAE,WAAA,EAAa,MAAA,EAAO;AAAA,MAC/B,IAAA,EAAM,EAAE,UAAA,EAAY,EAAA;AAAG,KACxB,CAAA;AAED,IAAA,IAAI,CAAC,QAAA,CAAS,EAAA,EAAI,OAAO,IAAA;AAEzB,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,IAAA,OAAO,KAAK,MAAA,IAAU,IAAA;AAAA,EACxB,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,iCAAiC,KAAK,CAAA;AACpD,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAWA,eAAsB,cAAA,CACpB,IAAA,EACA,KAAA,GAAQ,EAAA,EACR,SAAS,CAAA,EACuE;AAChF,EAAA,MAAM,SAAS,sBAAA,EAAuB;AACtC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAA,CAAQ,KAAK,8BAA8B,CAAA;AAC3C,IAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,OAAO,EAAC,EAAG,OAAO,CAAA,EAAE;AAAA,EAC7C;AACA,EAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAO,GAAI,MAAA;AAE3B,EAAA,IAAI;AACF,IAAA,MAAM,WAAW,MAAM,KAAA;AAAA,MACrB,GAAG,MAAM,CAAA,qBAAA,EAAwB,IAAI,CAAA,aAAA,EAAgB,KAAK,WAAW,MAAM,CAAA,CAAA;AAAA,MAC3E;AAAA,QACE,OAAA,EAAS,EAAE,WAAA,EAAa,MAAA,EAAO;AAAA,QAC/B,IAAA,EAAM,EAAE,UAAA,EAAY,EAAA;AAAG;AACzB,KACF;AAEA,IAAA,IAAI,CAAC,QAAA,CAAS,EAAA,EAAI,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,EAAC,EAAG,KAAA,EAAO,CAAA,EAAE;AAE7D,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,IAAA,IAAI,MAAA,GAA4B,KAAK,MAAA,IAAU,IAAA;AAC/C,IAAA,IAAI,MAAA,IAAU,MAAA,CAAO,EAAA,KAAO,KAAA,CAAA,EAAW;AACrC,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,MAAM,eAAA,CAAgB,IAAI,CAAA;AACvC,QAAA,IAAI,MAAM,MAAA,GAAS,IAAA;AAAA,MACrB,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AACA,IAAA,OAAO;AAAA,MACL,MAAA;AAAA,MACA,KAAA,EAAO,IAAA,CAAK,KAAA,IAAS,EAAC;AAAA,MACtB,KAAA,EAAO,KAAK,KAAA,IAAS;AAAA,KACvB;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,uCAAuC,KAAK,CAAA;AAC1D,IAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,OAAO,EAAC,EAAG,OAAO,CAAA,EAAE;AAAA,EAC7C;AACF;AAKA,eAAsB,iBAAA,GAAiD;AACrE,EAAA,MAAM,SAAS,sBAAA,EAAuB;AACtC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAA,CAAQ,KAAK,8BAA8B,CAAA;AAC3C,IAAA,OAAO,EAAC;AAAA,EACV;AACA,EAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAO,GAAI,MAAA;AAE3B,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,MAAM,CAAA,oBAAA,CAAA,EAAwB;AAAA,MAC5D,OAAA,EAAS,EAAE,WAAA,EAAa,MAAA,EAAO;AAAA,MAC/B,IAAA,EAAM,EAAE,UAAA,EAAY,GAAA;AAAI,KACzB,CAAA;AAED,IAAA,IAAI,CAAC,QAAA,CAAS,EAAA,EAAI,OAAO,EAAC;AAE1B,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,IAAA,MAAM,OAAA,GAAwB,IAAA,CAAK,OAAA,IAAW,EAAC;AAC/C,IAAA,OAAO,OAAA,CAAQ,IAAI,CAAC,CAAA,MAAO,EAAE,IAAA,EAAM,CAAA,CAAE,MAAK,CAAE,CAAA;AAAA,EAC9C,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,uCAAuC,KAAK,CAAA;AAC1D,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AAMA,eAAsB,0BAAA,GAA0D;AAC9E,EAAA,OAAO,iBAAA,EAAkB;AAC3B;AASO,SAAS,0BAAA,CACd,MAAA,EACA,OAAA,GAAmD,EAAC,EAC1C;AACV,EAAA,MAAM,EAAE,OAAA,GAAU,EAAA,EAAI,QAAA,EAAS,GAAI,OAAA;AACnC,EAAA,MAAM,KAAA,GAAQ,CAAA,EAAG,MAAA,CAAO,IAAI,CAAA,EAAG,MAAA,CAAO,KAAA,GAAQ,CAAA,GAAA,EAAM,MAAA,CAAO,KAAK,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA;AACvE,EAAA,MAAM,cAAc,MAAA,CAAO,SAAA,IAAa,OAAO,GAAA,IAAO,CAAA,YAAA,EAAe,OAAO,IAAI,CAAA,CAAA;AAChF,EAAA,MAAM,GAAA,GAAM,CAAA,EAAG,OAAO,CAAA,aAAA,EAAgB,OAAO,IAAI,CAAA,CAAA;AAEjD,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,WAAA;AAAA,IACA,SAAA,EAAW;AAAA,MACT,KAAA;AAAA,MACA,WAAA;AAAA,MACA,GAAA;AAAA,MACA,QAAA;AAAA,MACA,IAAA,EAAM,SAAA;AAAA,MACN,MAAA,EAAQ,OAAO,UAAA,GAAa,CAAC,EAAE,GAAA,EAAK,MAAA,CAAO,UAAA,EAAY,CAAA,GAAI;AAAA,KAC7D;AAAA,IACA,OAAA,EAAS;AAAA,MACP,IAAA,EAAM,SAAA;AAAA,MACN,KAAA;AAAA,MACA,WAAA;AAAA,MACA,QAAQ,MAAA,CAAO,UAAA,GAAa,CAAC,MAAA,CAAO,UAAU,CAAA,GAAI;AAAA,KACpD;AAAA,IACA,UAAA,EAAY;AAAA,MACV,SAAA,EAAW,OAAO,eAAA,IAAmB;AAAA;AACvC,GACF;AACF","file":"chunk-DHXQBTXE.mjs","sourcesContent":["/**\n * Excerpt sanitizing for blog metadata, schema and feeds.\n *\n * Pure (no `server-only` chain) so it is unit-testable and safe to reuse.\n * Source of truth for turning a stored excerpt into display-safe prose.\n */\n\n/**\n * Turn a stored excerpt into something safe to put in a meta description,\n * a schema `description`, or an RSS `<description>`.\n *\n * The AI blog pipeline stores content as JSON sections\n * (`{\"heading\": \"## ...\", \"content\": \"## ...\\n\\nIf you're asking **how**...\"}`)\n * and that value has been shipping verbatim into <meta name=\"description\">.\n * nkylawfirm.com had three live articles whose SERP snippet was raw JSON with\n * markdown asterisks and literal \\n. Parse the sections out, strip markdown,\n * and cap at a sentence boundary.\n */\nexport function sanitizeExcerpt(raw: string | undefined | null, maxLength = 160): string {\n if (!raw) return ''\n let text = String(raw).trim()\n\n // JSON section(s) — take the prose, not the heading, and never the braces.\n if (text.startsWith('{') || text.startsWith('[')) {\n const fromSections = (value: unknown): string => {\n const list = Array.isArray(value) ? value : [value]\n return list\n .map((s) => (s && typeof s === 'object' ? (s as any).content || (s as any).heading || '' : ''))\n .filter(Boolean)\n .join(' ')\n }\n let parsed: unknown\n try {\n parsed = JSON.parse(text)\n } catch {\n // Concatenated objects: \"{...}\\n\\n{...}\" — take the first.\n const first = text.split(/\\}\\s*[\\r\\n]+\\s*\\{/)[0]\n try {\n parsed = JSON.parse(first.endsWith('}') ? first : `${first}}`)\n } catch {\n parsed = null\n }\n }\n text = parsed ? fromSections(parsed) : text.replace(/[{}\"[\\]]/g, ' ')\n }\n\n const plain = text\n .replace(/```[\\s\\S]*?```/g, ' ') // fenced code\n .replace(/!\\[[^\\]]*\\]\\([^)]*\\)/g, ' ') // images\n .replace(/\\[([^\\]]*)\\]\\([^)]*\\)/g, '$1') // links -> text\n .replace(/^#{1,6}\\s+/gm, '') // headings\n .replace(/[*_~`>]/g, '') // emphasis / quotes / code\n .replace(/\\\\n/g, ' ') // literal escaped newlines\n .replace(/\\s+/g, ' ')\n .trim()\n\n if (plain.length <= maxLength) return plain\n\n // Prefer a sentence boundary, then a word boundary.\n const window = plain.slice(0, maxLength + 1)\n const lastStop = Math.max(window.lastIndexOf('. '), window.lastIndexOf('? '), window.lastIndexOf('! '))\n if (lastStop > maxLength * 0.5) return window.slice(0, lastStop + 1).trim()\n\n const cut = plain.slice(0, maxLength)\n const lastSpace = cut.lastIndexOf(' ')\n return `${(lastSpace > maxLength * 0.6 ? cut.slice(0, lastSpace) : cut).replace(/[\\s,;:—–-]+$/, '')}…`\n}\n","/**\n * @sonordev/site-kit/blog/server\n *\n * Data and metadata helpers only (no React components). For `BlogPost` / `BlogList`\n * in the App Router, import from `@sonordev/site-kit/blog/server-ui` so Next never\n * treats `getAllBlogSlugs` / `generateBlogStaticParams` as client code.\n */\n\nimport type { Metadata } from 'next'\nimport type { BlogPost as BlogPostRecord, BlogAuthor, TocItem, TopicCluster, ClusterNavigation } from './types'\n\n/**\n * Server key/URL resolution — SINGLE SOURCE OF TRUTH.\n *\n * Every fetcher below resolves its API config through `resolveServerApiConfig`.\n * Do NOT re-fork a local `getConfig()` here: this file used to carry a drifted\n * copy of that helper, and the copy grew a `process.env.NEXT_PUBLIC_SONOR_API_KEY`\n * fallback the canonical one never had. Because Next inlines `NEXT_PUBLIC_*` into\n * every bundle a module lands in, and this module was reachable from the\n * client-stamped `@sonordev/site-kit/blog` barrel, that fallback published the\n * site's raw `sonor_` project key to the browser. One diverging copy, one leaked\n * credential.\n *\n * This import also carries `server-only` transitively, which is the point: if a\n * client component ever reaches this module again, the consumer's build fails\n * loudly instead of silently shipping an `x-api-key` fetch to visitors.\n */\nimport { resolveServerApiConfig } from '../server/server-fetch'\nimport { sanitizeExcerpt } from './excerpt'\n\nexport { sanitizeExcerpt }\n\n// ============================================================================\n// SEO VALIDATION UTILITIES\n// ============================================================================\n\nexport const SEO_LIMITS = {\n title: { min: 30, max: 60, recommended: 55 },\n metaDescription: { min: 120, max: 160, recommended: 155 },\n excerpt: { min: 100, max: 300, recommended: 200 },\n slug: { max: 75 },\n focusKeyphrase: { min: 2, max: 4, words: true }, // 2-4 words\n} as const\n\nexport interface SeoValidationResult {\n field: string\n value: string\n length: number\n limit: { min?: number; max: number; recommended?: number }\n status: 'good' | 'warning' | 'error'\n message: string\n}\n\n/**\n * Validate SEO title (60 chars max, keyword-first recommended)\n */\nexport function validateSeoTitle(title: string, focusKeyphrase?: string): SeoValidationResult {\n const length = title.length\n let status: SeoValidationResult['status'] = 'good'\n let message = 'Title length is optimal'\n\n if (length > SEO_LIMITS.title.max) {\n status = 'error'\n message = `Title is ${length - SEO_LIMITS.title.max} characters too long (max ${SEO_LIMITS.title.max})`\n } else if (length < SEO_LIMITS.title.min) {\n status = 'warning'\n message = `Title is short (${length}/${SEO_LIMITS.title.min} min)`\n } else if (focusKeyphrase && !title.toLowerCase().includes(focusKeyphrase.toLowerCase())) {\n status = 'warning'\n message = 'Focus keyphrase not found in title'\n } else if (focusKeyphrase && !title.toLowerCase().startsWith(focusKeyphrase.toLowerCase())) {\n status = 'warning'\n message = 'Title should start with focus keyphrase for best results'\n }\n\n return { field: 'title', value: title, length, limit: SEO_LIMITS.title, status, message }\n}\n\n/**\n * Validate meta description (150-160 chars, benefit-driven)\n */\nexport function validateMetaDescription(description: string, focusKeyphrase?: string): SeoValidationResult {\n const length = description.length\n let status: SeoValidationResult['status'] = 'good'\n let message = 'Meta description is optimal'\n\n if (length > SEO_LIMITS.metaDescription.max) {\n status = 'error'\n message = `Description will be truncated (${length}/${SEO_LIMITS.metaDescription.max})`\n } else if (length < SEO_LIMITS.metaDescription.min) {\n status = 'warning'\n message = `Description is short (${length}/${SEO_LIMITS.metaDescription.min} min)`\n } else if (focusKeyphrase && !description.toLowerCase().includes(focusKeyphrase.toLowerCase())) {\n status = 'warning'\n message = 'Focus keyphrase not found in description'\n }\n\n return { field: 'meta_description', value: description, length, limit: SEO_LIMITS.metaDescription, status, message }\n}\n\n/**\n * Full SEO validation for a blog post\n */\nexport function validateBlogPostSeo(post: Partial<BlogPostRecord>): SeoValidationResult[] {\n const results: SeoValidationResult[] = []\n const focusKeyphrase = post.focus_keyphrase\n\n if (post.meta_title || post.title) {\n results.push(validateSeoTitle(post.meta_title || post.title || '', focusKeyphrase))\n }\n\n if (post.meta_description) {\n results.push(validateMetaDescription(post.meta_description, focusKeyphrase))\n }\n\n // Check H1 alignment (title should match keyword)\n if (post.title && focusKeyphrase) {\n const titleLower = post.title.toLowerCase()\n const keyLower = focusKeyphrase.toLowerCase()\n if (!titleLower.includes(keyLower)) {\n results.push({\n field: 'h1_alignment',\n value: post.title,\n length: post.title.length,\n limit: { max: 100 },\n status: 'warning',\n message: 'H1 (title) should include the focus keyphrase',\n })\n }\n }\n\n // Check word count (1200-2500 recommended for long-form)\n if (post.word_count !== undefined) {\n let wordStatus: SeoValidationResult['status'] = 'good'\n let wordMessage = 'Content length is optimal for SEO'\n \n if (post.word_count < 600) {\n wordStatus = 'error'\n wordMessage = `Content is thin (${post.word_count} words). Aim for 1200+ words.`\n } else if (post.word_count < 1200) {\n wordStatus = 'warning'\n wordMessage = `Content is short (${post.word_count} words). Long-form (1200-2500) ranks better.`\n } else if (post.word_count > 2500) {\n wordMessage = `Comprehensive content (${post.word_count} words). Consider splitting into a topic cluster.`\n }\n\n results.push({\n field: 'word_count',\n value: String(post.word_count),\n length: post.word_count,\n limit: { min: 1200, max: 2500, recommended: 1800 },\n status: wordStatus,\n message: wordMessage,\n })\n }\n\n return results\n}\n\n// ============================================================================\n// DATA FETCHING\n// ============================================================================\n\n/**\n * Fetch a blog post by slug (server-side)\n */\nexport async function getBlogPost(slug: string): Promise<BlogPostRecord | null> {\n const config = resolveServerApiConfig()\n if (!config) {\n console.warn('[Blog] No API key configured')\n return null\n }\n const { apiUrl, apiKey } = config\n\n try {\n const response = await fetch(`${apiUrl}/public/blog/posts/${slug}`, {\n headers: { 'x-api-key': apiKey },\n next: { revalidate: 60 },\n })\n\n if (!response.ok) return null\n\n const data = await response.json()\n return data.post || null\n } catch (error) {\n console.error('[Blog] Error fetching post:', error)\n return null\n }\n}\n\n/**\n * Fetch all blog post slugs for static generation\n */\nexport async function getAllBlogSlugs(): Promise<\n { slug: string; id?: string; last_modified?: string; article_type?: string }[]\n> {\n const config = resolveServerApiConfig()\n if (!config) {\n console.warn('[Blog] No API key configured')\n return []\n }\n const { apiUrl, apiKey } = config\n\n try {\n const response = await fetch(`${apiUrl}/public/blog/slugs`, {\n headers: { 'x-api-key': apiKey },\n next: { revalidate: 300 },\n })\n\n if (!response.ok) return []\n\n const data = await response.json()\n return data.slugs || []\n } catch (error) {\n console.error('[Blog] Error fetching slugs:', error)\n return []\n }\n}\n\n/**\n * Fetch blog categories\n */\nexport async function getBlogCategories(): Promise<{ name: string; slug: string; post_count: number }[]> {\n const config = resolveServerApiConfig()\n if (!config) return []\n const { apiUrl, apiKey } = config\n\n try {\n const response = await fetch(`${apiUrl}/public/blog/categories`, {\n headers: { 'x-api-key': apiKey },\n next: { revalidate: 300 },\n })\n\n if (!response.ok) return []\n\n const data = await response.json()\n return data.categories || []\n } catch (error) {\n console.error('[Blog] Error fetching categories:', error)\n return []\n }\n}\n\n// ============================================================================\n// METADATA GENERATION\n// ============================================================================\n\ninterface BlogMetadataOptions {\n /** Site name for og:site_name */\n siteName?: string\n /** Base URL of the site */\n siteUrl?: string\n /** URL path prefix for blog index and posts (default `/blog`, e.g. `/insights`) */\n blogBasePath?: string\n /** Default OG image */\n defaultImage?: string\n /** Twitter handle */\n twitterHandle?: string\n}\n\nfunction blogPathPrefix(options: BlogMetadataOptions): string {\n const raw = (options.blogBasePath ?? '/blog').trim() || '/blog'\n const withSlash = raw.startsWith('/') ? raw : `/${raw}`\n return withSlash.replace(/\\/$/, '') || '/blog'\n}\n\n/**\n * Generate metadata for a blog post page\n */\nexport async function generateBlogPostMetadata(\n slug: string,\n options: BlogMetadataOptions = {}\n): Promise<Metadata> {\n const post = await getBlogPost(slug)\n const { siteName, siteUrl = '', defaultImage, twitterHandle } = options\n const base = blogPathPrefix(options)\n\n if (!post) {\n return {\n title: 'Post Not Found',\n description: 'The requested blog post could not be found.',\n }\n }\n\n const title = post.meta_title || post.title\n const description = sanitizeExcerpt(post.meta_description || post.excerpt)\n // og_image / featured_image_width / featured_image_height never existed in\n // blog_posts (verified against the live schema) — reading them always\n // produced undefined. Resolution goes straight to featured_image.\n const image = post.featured_image || defaultImage\n const url = `${siteUrl}${base}/${post.slug}`\n\n return {\n title,\n description,\n openGraph: {\n title: post.og_title || title,\n description: post.og_description || description,\n url,\n siteName,\n type: 'article',\n publishedTime: post.published_at,\n authors: post.author ? [typeof post.author === 'string' ? post.author : post.author.name] : undefined,\n images: image\n ? [\n {\n url: image,\n width: 1200,\n height: 630,\n alt: post.featured_image_alt || post.title,\n },\n ]\n : undefined,\n },\n twitter: {\n card: 'summary_large_image',\n title,\n description,\n images: image ? [image] : undefined,\n creator: twitterHandle,\n },\n alternates: {\n canonical: post.canonical_url || url,\n },\n other: {\n 'article:published_time': post.published_at || '',\n 'article:section': typeof post.category === 'string' ? post.category : (post.category?.name || ''),\n },\n }\n}\n\n/**\n * Generate metadata for the blog index page\n */\nexport function generateBlogIndexMetadata(options: BlogMetadataOptions & {\n title?: string\n description?: string\n}): Metadata {\n const {\n title = 'Blog',\n description = 'Read our latest articles and insights.',\n siteName,\n siteUrl = '',\n defaultImage,\n twitterHandle,\n } = options\n const base = blogPathPrefix(options)\n\n return {\n title,\n description,\n openGraph: {\n title,\n description,\n url: `${siteUrl}${base}`,\n siteName,\n type: 'website',\n images: defaultImage ? [{ url: defaultImage }] : undefined,\n },\n twitter: {\n card: 'summary_large_image',\n title,\n description,\n images: defaultImage ? [defaultImage] : undefined,\n creator: twitterHandle,\n },\n }\n}\n\n/**\n * Generate metadata for a category page\n */\nexport function generateBlogCategoryMetadata(\n categoryName: string,\n options: BlogMetadataOptions & { categorySlug?: string } = {}\n): Metadata {\n const { siteName, siteUrl = '', defaultImage, blogBasePath = '/blog' } = options\n const title = `${categoryName} - Blog`\n const description = `Browse all posts in ${categoryName}.`\n // The URL wants the route slug, not the display name: lowercasing \"Case\n // Studies\" produced /blog/category/case%20studies against a real route of\n // /blog/category/case-studies. Callers that have the slug pass it; the\n // fallback slugifies the name the same way the dashboard does.\n const slug =\n options.categorySlug ??\n categoryName\n .toLowerCase()\n .trim()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n\n return {\n title,\n description,\n openGraph: {\n title,\n description,\n url: `${siteUrl}${blogBasePath}/category/${slug}`,\n siteName,\n type: 'website',\n images: defaultImage ? [{ url: defaultImage }] : undefined,\n },\n }\n}\n\n// ============================================================================\n// STATIC PARAMS GENERATION\n// ============================================================================\n\n/**\n * Generate static params for blog post pages\n * Usage: export const generateStaticParams = generateBlogStaticParams\n */\nexport async function generateBlogStaticParams(): Promise<{ slug: string }[]> {\n const slugs = await getAllBlogSlugs()\n return slugs.map((s) => ({ slug: s.slug }))\n}\n\n/**\n * Generate static params for category pages\n * Usage: export const generateStaticParams = generateCategoryStaticParams\n */\nexport async function generateCategoryStaticParams(): Promise<{ category: string }[]> {\n const categories = await getBlogCategories()\n return categories.map((c) => ({ category: c.slug }))\n}\n\n// ============================================================================\n// SITEMAP GENERATION\n// ============================================================================\n\ninterface SitemapEntry {\n url: string\n lastModified?: Date\n changeFrequency?: 'always' | 'hourly' | 'daily' | 'weekly' | 'monthly' | 'yearly' | 'never'\n priority?: number\n}\n\n/**\n * Generate sitemap entries for blog posts\n */\nexport async function generateBlogSitemap(\n siteUrl: string\n): Promise<SitemapEntry[]> {\n const slugs = await getAllBlogSlugs()\n const categories = await getBlogCategories()\n const clusters = await getTopicClusters()\n\n const entries: SitemapEntry[] = [\n // Blog index\n {\n url: `${siteUrl}/blog`,\n changeFrequency: 'daily',\n priority: 0.8,\n },\n ]\n\n // Cluster landing pages\n clusters.forEach((cluster) => {\n entries.push({\n url: `${siteUrl}/blog/cluster/${cluster.cluster_slug}`,\n changeFrequency: 'weekly',\n priority: 0.8,\n })\n })\n\n // Category pages\n categories.forEach((cat) => {\n entries.push({\n url: `${siteUrl}/blog/category/${cat.slug}`,\n changeFrequency: 'weekly',\n priority: 0.6,\n })\n })\n\n // Individual posts — pillar posts get higher priority (0.9 vs 0.7)\n slugs.forEach((post) => {\n const isPillar = (post as any).article_type === 'pillar'\n entries.push({\n url: `${siteUrl}/blog/${post.slug}`,\n lastModified: post.last_modified ? new Date(post.last_modified) : undefined,\n changeFrequency: isPillar ? 'weekly' : 'monthly',\n priority: isPillar ? 0.9 : 0.7,\n })\n })\n\n return entries\n}\n\n// ============================================================================\n// JSON-LD SCHEMA GENERATION\n// ============================================================================\n\n/**\n * Generate JSON-LD schema for a blog post\n */\nexport function generateBlogPostSchema(\n post: BlogPostRecord,\n options: { siteUrl?: string; siteName?: string; logoUrl?: string } = {}\n): object {\n const { siteUrl = '', siteName, logoUrl } = options\n\n const schema: any = {\n '@context': 'https://schema.org',\n '@type': 'BlogPosting',\n headline: post.title,\n description: sanitizeExcerpt(post.excerpt || post.meta_description),\n url: `${siteUrl}/blog/${post.slug}`,\n datePublished: post.published_at,\n dateModified: post.updated_at,\n author: {\n '@type': 'Person',\n name: typeof post.author === 'string' ? post.author : post.author?.name,\n },\n }\n\n if (post.featured_image) {\n // A bare URL string is valid schema.org — better than an ImageObject\n // carrying fabricated dimensions (the width/height columns don't exist).\n schema.image = post.featured_image\n }\n\n if (siteName || logoUrl) {\n schema.publisher = {\n '@type': 'Organization',\n name: siteName,\n logo: logoUrl\n ? {\n '@type': 'ImageObject',\n url: logoUrl,\n }\n : undefined,\n }\n }\n\n // Add FAQ schema if present\n if (post.faq_items && Array.isArray(post.faq_items) && post.faq_items.length > 0) {\n schema.mainEntity = {\n '@type': 'FAQPage',\n mainEntity: post.faq_items.map((faq: { question: string; answer: string }) => ({\n '@type': 'Question',\n name: faq.question,\n acceptedAnswer: {\n '@type': 'Answer',\n text: faq.answer,\n },\n })),\n }\n }\n\n return schema\n}\n\n/**\n * Generate JSON-LD schema for blog index/listing page\n */\nexport function generateBlogListSchema(\n options: { siteUrl?: string; siteName?: string; description?: string } = {}\n): object {\n const { siteUrl = '', siteName, description } = options\n\n return {\n '@context': 'https://schema.org',\n '@type': 'Blog',\n name: siteName ? `${siteName} Blog` : 'Blog',\n description: description || 'Our latest articles and insights.',\n url: `${siteUrl}/blog`,\n }\n}\n\n// ============================================================================\n// FAQ SCHEMA (for PAA rankings)\n// ============================================================================\n\n/**\n * Generate standalone FAQ schema (great for PAA inclusion)\n */\nexport function generateFaqSchema(\n faqItems: { question: string; answer: string }[]\n): object | null {\n if (!faqItems || faqItems.length === 0) return null\n\n return {\n '@context': 'https://schema.org',\n '@type': 'FAQPage',\n mainEntity: faqItems.map((faq) => ({\n '@type': 'Question',\n name: faq.question,\n acceptedAnswer: {\n '@type': 'Answer',\n text: faq.answer,\n },\n })),\n }\n}\n\n// ============================================================================\n// HOWTO SCHEMA (for step-by-step posts)\n// ============================================================================\n\nexport interface HowToStep {\n name: string\n text: string\n image?: string\n url?: string\n}\n\n/**\n * Generate HowTo schema for step-by-step posts\n */\nexport function generateHowToSchema(\n post: BlogPostRecord,\n steps: HowToStep[],\n options: { siteUrl?: string } = {}\n): object {\n const { siteUrl = '' } = options\n\n return {\n '@context': 'https://schema.org',\n '@type': 'HowTo',\n name: post.title,\n description: sanitizeExcerpt(post.excerpt || post.meta_description),\n image: post.featured_image,\n totalTime: post.reading_time ? `PT${post.reading_time}M` : undefined,\n step: steps.map((step, index) => ({\n '@type': 'HowToStep',\n position: index + 1,\n name: step.name,\n text: step.text,\n image: step.image,\n url: step.url || `${siteUrl}/blog/${post.slug}#step-${index + 1}`,\n })),\n }\n}\n\n// ============================================================================\n// RSS FEED GENERATION\n// ============================================================================\n\ninterface RssFeedOptions {\n siteUrl: string\n siteName: string\n description?: string\n language?: string\n copyright?: string\n managingEditor?: string\n webMaster?: string\n ttl?: number // Time to live in minutes\n imageUrl?: string\n}\n\n/**\n * Maximum posts a feed will accumulate. Preserves the historical intent of the\n * old `?limit=100` request (which the API silently ignored — it only reads\n * `per_page`, capped at 50, so feeds were stuck at the 12-post default).\n */\nconst FEED_MAX_POSTS = 100\n\n/**\n * Fetch all published blog posts for RSS feed.\n *\n * Paginates with `per_page`/`page` — the only pagination params the deployed\n * controller reads — accumulating up to FEED_MAX_POSTS. A mid-loop failure\n * returns what was accumulated so far: a partial feed beats an empty one.\n */\nexport async function getAllBlogPosts(): Promise<BlogPostRecord[]> {\n const config = resolveServerApiConfig()\n if (!config) {\n console.warn('[Blog] No API key configured')\n return []\n }\n const { apiUrl, apiKey } = config\n\n const posts: BlogPostRecord[] = []\n let page = 1\n try {\n while (posts.length < FEED_MAX_POSTS) {\n const response = await fetch(\n `${apiUrl}/public/blog/posts?per_page=50&page=${page}`,\n {\n headers: { 'x-api-key': apiKey },\n next: { revalidate: 300 },\n }\n )\n\n if (!response.ok) break\n\n const data = await response.json()\n posts.push(...(data.posts || []))\n if (!data.pagination?.has_next) break\n page += 1\n }\n } catch (error) {\n console.error('[Blog] Error fetching posts for RSS:', error)\n }\n return posts.slice(0, FEED_MAX_POSTS)\n}\n\n/**\n * Escape XML special characters\n */\nfunction escapeXml(text: string): string {\n return text\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n}\n\n/**\n * Strip HTML tags for RSS descriptions\n */\nfunction stripHtml(html: string): string {\n return html.replace(/<[^>]*>/g, '').trim()\n}\n\n/**\n * Generate RSS 2.0 feed XML\n */\nexport async function generateRssFeed(options: RssFeedOptions): Promise<string> {\n const {\n siteUrl,\n siteName,\n description = 'Latest blog posts and insights',\n language = 'en-us',\n copyright,\n managingEditor,\n webMaster,\n ttl = 60,\n imageUrl,\n } = options\n\n const posts = await getAllBlogPosts()\n const now = new Date().toUTCString()\n\n let rss = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<rss version=\"2.0\" xmlns:atom=\"http://www.w3.org/2005/Atom\" xmlns:content=\"http://purl.org/rss/1.0/modules/content/\">\n <channel>\n <title>${escapeXml(siteName)}</title>\n <link>${siteUrl}</link>\n <description>${escapeXml(description)}</description>\n <language>${language}</language>\n <lastBuildDate>${now}</lastBuildDate>\n <pubDate>${now}</pubDate>\n <ttl>${ttl}</ttl>\n <atom:link href=\"${siteUrl}/blog/rss.xml\" rel=\"self\" type=\"application/rss+xml\"/>\n`\n\n if (copyright) {\n rss += ` <copyright>${escapeXml(copyright)}</copyright>\\n`\n }\n\n if (managingEditor) {\n rss += ` <managingEditor>${escapeXml(managingEditor)}</managingEditor>\\n`\n }\n\n if (webMaster) {\n rss += ` <webMaster>${escapeXml(webMaster)}</webMaster>\\n`\n }\n\n if (imageUrl) {\n rss += ` <image>\n <url>${imageUrl}</url>\n <title>${escapeXml(siteName)}</title>\n <link>${siteUrl}</link>\n </image>\\n`\n }\n\n // Add each post as an item with FULL content (not excerpts)\n for (const post of posts) {\n const postUrl = `${siteUrl}/blog/${post.slug}`\n const pubDate = post.published_at ? new Date(post.published_at).toUTCString() : now\n const author = typeof post.author === 'string' ? post.author : post.author?.name || 'Unknown'\n \n // Use full content_html if available, otherwise content\n const fullContent = post.content_html || post.content || ''\n const description = sanitizeExcerpt(post.excerpt, 300) || stripHtml(fullContent).substring(0, 300) + '...'\n\n rss += ` <item>\n <title>${escapeXml(post.title)}</title>\n <link>${postUrl}</link>\n <guid isPermaLink=\"true\">${postUrl}</guid>\n <description>${escapeXml(description)}</description>\n <content:encoded><![CDATA[${fullContent}]]></content:encoded>\n <pubDate>${pubDate}</pubDate>\n <author>${escapeXml(author)}</author>\n`\n\n if (post.category) {\n const categoryName = typeof post.category === 'string' ? post.category : post.category.name\n rss += ` <category>${escapeXml(categoryName)}</category>\\n`\n }\n\n if (post.tags && Array.isArray(post.tags)) {\n for (const tag of post.tags) {\n const tagName = typeof tag === 'string' ? tag : tag.name\n rss += ` <category>${escapeXml(tagName)}</category>\\n`\n }\n }\n\n if (post.featured_image) {\n rss += ` <enclosure url=\"${post.featured_image}\" type=\"image/jpeg\"/>\\n`\n }\n\n rss += ` </item>\\n`\n }\n\n rss += ` </channel>\n</rss>`\n\n return rss\n}\n\n/**\n * Generate Atom feed XML\n */\nexport async function generateAtomFeed(options: RssFeedOptions): Promise<string> {\n const {\n siteUrl,\n siteName,\n description = 'Latest blog posts and insights',\n managingEditor,\n } = options\n\n const posts = await getAllBlogPosts()\n const now = new Date().toISOString()\n\n let atom = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<feed xmlns=\"http://www.w3.org/2005/Atom\">\n <title>${escapeXml(siteName)}</title>\n <subtitle>${escapeXml(description)}</subtitle>\n <link href=\"${siteUrl}/blog/feed.xml\" rel=\"self\"/>\n <link href=\"${siteUrl}\"/>\n <id>${siteUrl}/blog</id>\n <updated>${now}</updated>\n`\n\n if (managingEditor) {\n atom += ` <author>\n <name>${escapeXml(managingEditor)}</name>\n </author>\\n`\n }\n\n for (const post of posts) {\n const postUrl = `${siteUrl}/blog/${post.slug}`\n const updated = post.updated_at || post.published_at || now\n const published = post.published_at || now\n const author = typeof post.author === 'string' ? post.author : post.author?.name || 'Unknown'\n const fullContent = post.content_html || post.content || ''\n\n atom += ` <entry>\n <title>${escapeXml(post.title)}</title>\n <link href=\"${postUrl}\"/>\n <id>${postUrl}</id>\n <updated>${new Date(updated).toISOString()}</updated>\n <published>${new Date(published).toISOString()}</published>\n <author>\n <name>${escapeXml(author)}</name>\n </author>\n <summary>${escapeXml(sanitizeExcerpt(post.excerpt, 300) || stripHtml(fullContent).substring(0, 300))}</summary>\n <content type=\"html\"><![CDATA[${fullContent}]]></content>\n </entry>\\n`\n }\n\n atom += `</feed>`\n\n return atom\n}\n\n// ============================================================================\n// TOPIC CLUSTER SUPPORT\n// ============================================================================\n\n/**\n * Fetch all active topic clusters for the project.\n * Uses the real cluster data from Portal API (not heuristic-based).\n */\nexport async function getTopicClusters(): Promise<TopicCluster[]> {\n const config = resolveServerApiConfig()\n if (!config) return []\n const { apiUrl, apiKey } = config\n\n try {\n const response = await fetch(`${apiUrl}/public/blog/clusters`, {\n headers: { 'x-api-key': apiKey },\n next: { revalidate: 300 },\n })\n if (!response.ok) return []\n const data = await response.json()\n\n return (data.clusters || []).map((c: any) => ({\n id: c.id,\n cluster_name: c.cluster_name,\n cluster_slug: c.cluster_slug,\n core_topic: c.core_topic,\n primary_entity: c.primary_entity,\n industry: c.industry,\n geo_target: c.geo_target,\n commercial_goal: c.commercial_goal,\n pillar_post_id: c.pillar_post_id,\n target_service_page: c.target_service_page,\n article_count: c.article_count,\n created_at: c.created_at,\n pillar: null,\n supports: [],\n interlink_map: [],\n }))\n } catch (error) {\n console.error('[Blog] Error fetching topic clusters:', error)\n return []\n }\n}\n\n/**\n * Fetch a single topic cluster with its pillar and support articles.\n */\nexport async function getTopicCluster(slug: string): Promise<TopicCluster | null> {\n const config = resolveServerApiConfig()\n if (!config) return null\n const { apiUrl, apiKey } = config\n\n try {\n const response = await fetch(`${apiUrl}/public/blog/clusters/${slug}`, {\n headers: { 'x-api-key': apiKey },\n next: { revalidate: 300 },\n })\n if (!response.ok) return null\n const data = await response.json()\n\n return {\n id: data.id,\n cluster_name: data.cluster_name,\n cluster_slug: data.cluster_slug,\n core_topic: data.core_topic,\n primary_entity: data.primary_entity,\n industry: data.industry,\n geo_target: data.geo_target,\n commercial_goal: data.commercial_goal,\n // Authoritative column once the API's detail response ships it;\n // derived from the embedded (published) pillar until then.\n pillar_post_id: data.pillar_post_id ?? data.pillar?.id,\n target_service_page: data.target_service_page,\n article_count: data.article_count,\n created_at: data.created_at,\n pillar: data.pillar || null,\n supports: data.supports || [],\n interlink_map: data.interlink_map || [],\n }\n } catch (error) {\n console.error('[Blog] Error fetching topic cluster:', error)\n return null\n }\n}\n\n/**\n * Get cluster navigation context for a blog post.\n * Returns the cluster name, pillar link, and sibling articles.\n */\nexport function getClusterNavigation(post: BlogPostRecord): ClusterNavigation | null {\n if (!post.cluster_id && !post.cluster_slug) return null\n\n const isPillar = post.article_type === 'pillar'\n\n // Mirrored copy: BlogPost.tsx has an identical builder. Keep the two in\n // sync — they CANNOT be consolidated because blog/index is a CLIENT_ENTRY\n // that must never import blog/server-core (see build-entries.ts and\n // client-entry-boundary.test.ts).\n return {\n cluster_name: post.cluster_name || '',\n cluster_slug: post.cluster_slug || '',\n pillar: isPillar\n ? null\n : post.parent_pillar_slug\n ? {\n slug: post.parent_pillar_slug,\n title: post.parent_pillar_title || '',\n category: post.parent_pillar_category || undefined,\n }\n : null,\n siblings: post.sibling_articles || [],\n is_pillar: isPillar,\n }\n}\n\n/**\n * @deprecated Use getTopicCluster(slug) instead. This naive heuristic picks\n * the longest post as pillar. Real cluster data is now managed in the Sonor dashboard.\n */\nexport async function identifyTopicClusters(categorySlug: string): Promise<{\n pillar: BlogPostRecord\n supportingPosts: BlogPostRecord[]\n internalLinks: Array<{ from: string; to: string; anchor: string }>\n} | null> {\n console.warn(\n '[Blog] identifyTopicClusters() is deprecated. Use getTopicCluster(slug) for real cluster data managed in the Sonor dashboard.'\n )\n const posts = await getPostsByCategory(categorySlug)\n if (posts.length < 3) return null\n\n const sortedByLength = [...posts].sort((a, b) => (b.word_count || 0) - (a.word_count || 0))\n const pillar = sortedByLength[0]\n const supportingPosts = sortedByLength.slice(1)\n\n const internalLinks: Array<{ from: string; to: string; anchor: string }> = []\n for (const support of supportingPosts) {\n internalLinks.push({ from: pillar.slug, to: support.slug, anchor: support.title })\n internalLinks.push({ from: support.slug, to: pillar.slug, anchor: pillar.title })\n }\n\n return { pillar, supportingPosts, internalLinks }\n}\n\n/**\n * Fetch posts by category for topic cluster organization\n */\nexport async function getPostsByCategory(categorySlug: string): Promise<BlogPostRecord[]> {\n const config = resolveServerApiConfig()\n if (!config) return []\n const { apiUrl, apiKey } = config\n\n try {\n const response = await fetch(`${apiUrl}/public/blog/posts?category=${encodeURIComponent(categorySlug)}&per_page=50`, {\n headers: { 'x-api-key': apiKey },\n next: { revalidate: 300 },\n })\n if (!response.ok) return []\n const data = await response.json()\n return data.posts || []\n } catch (error) {\n console.error('[Blog] Error fetching category posts:', error)\n return []\n }\n}\n\n// ============================================================================\n// CLUSTER SCHEMA GENERATION\n// ============================================================================\n\n/**\n * Generate ItemList schema for a cluster's pillar page.\n * Wraps supporting posts as a structured list Google can parse.\n */\nexport function generateClusterItemListSchema(\n cluster: TopicCluster,\n options: { siteUrl?: string; basePath?: string } = {}\n): object {\n const { siteUrl = '', basePath = '/blog' } = options\n\n return {\n '@context': 'https://schema.org',\n '@type': 'ItemList',\n name: cluster.cluster_name,\n description: `Articles about ${cluster.core_topic}`,\n numberOfItems: cluster.supports.length,\n itemListElement: cluster.supports.map((post, i) => ({\n '@type': 'ListItem',\n position: i + 1,\n name: post.title,\n url: `${siteUrl}${basePath}/${post.slug}`,\n })),\n }\n}\n\n/**\n * Generate Article schema with cluster relationship (isPartOf / hasPart).\n * - Support articles get `isPartOf` pointing to the pillar.\n * - Pillar articles get `hasPart` listing all supports.\n */\nexport function generateClusterArticleSchema(\n post: BlogPostRecord,\n cluster: TopicCluster,\n options: { siteUrl?: string; basePath?: string; siteName?: string; logoUrl?: string } = {}\n): object {\n const { siteUrl = '', basePath = '/blog', siteName, logoUrl } = options\n const isPillar = post.article_type === 'pillar'\n\n const schema: any = {\n '@context': 'https://schema.org',\n '@type': 'Article',\n headline: post.title,\n description: sanitizeExcerpt(post.excerpt || post.meta_description),\n url: `${siteUrl}${basePath}/${post.slug}`,\n datePublished: post.published_at,\n dateModified: post.updated_at,\n author: {\n '@type': 'Person',\n name: typeof post.author === 'string' ? post.author : (post.author as any)?.name,\n },\n keywords: post.focus_keyphrase || post.keywords,\n }\n\n if (post.featured_image) {\n // A bare URL string is valid schema.org — better than an ImageObject\n // carrying fabricated dimensions (the width/height columns don't exist).\n schema.image = post.featured_image\n }\n\n if (siteName || logoUrl) {\n schema.publisher = {\n '@type': 'Organization',\n name: siteName,\n ...(logoUrl && { logo: { '@type': 'ImageObject', url: logoUrl } }),\n }\n }\n\n // Cluster relationships\n if (isPillar && cluster.supports.length > 0) {\n schema.hasPart = cluster.supports.map((s) => ({\n '@type': 'Article',\n headline: s.title,\n url: `${siteUrl}${basePath}/${s.slug}`,\n }))\n } else if (!isPillar && cluster.pillar) {\n schema.isPartOf = {\n '@type': 'Article',\n headline: cluster.pillar.title,\n url: `${siteUrl}${basePath}/${cluster.pillar.slug}`,\n }\n }\n\n // Geo targeting\n if (cluster.geo_target) {\n schema.spatialCoverage = {\n '@type': 'Place',\n name: cluster.geo_target,\n }\n }\n\n return schema\n}\n\n/**\n * Generate BreadcrumbList schema for a cluster-linked post.\n * Path: Home > Blog > Cluster > Article\n */\nexport function generateClusterBreadcrumbSchema(\n post: BlogPostRecord,\n cluster: TopicCluster,\n options: { siteUrl?: string; siteName?: string; basePath?: string } = {}\n): object {\n const { siteUrl = '', siteName = 'Home', basePath = '/blog' } = options\n\n const items: any[] = [\n { '@type': 'ListItem', position: 1, name: siteName, item: siteUrl },\n { '@type': 'ListItem', position: 2, name: 'Blog', item: `${siteUrl}${basePath}` },\n {\n '@type': 'ListItem',\n position: 3,\n name: cluster.cluster_name,\n item: `${siteUrl}${basePath}/cluster/${cluster.cluster_slug}`,\n },\n {\n '@type': 'ListItem',\n position: 4,\n name: post.title,\n item: `${siteUrl}${basePath}/${post.slug}`,\n },\n ]\n\n return {\n '@context': 'https://schema.org',\n '@type': 'BreadcrumbList',\n itemListElement: items,\n }\n}\n\n/**\n * Generate CollectionPage schema for a cluster landing page.\n */\nexport function generateClusterLandingSchema(\n cluster: TopicCluster,\n options: { siteUrl?: string; basePath?: string; siteName?: string } = {}\n): object {\n const { siteUrl = '', basePath = '/blog', siteName } = options\n\n return {\n '@context': 'https://schema.org',\n '@type': 'CollectionPage',\n name: cluster.cluster_name,\n description: `Comprehensive guide to ${cluster.core_topic}`,\n url: `${siteUrl}${basePath}/cluster/${cluster.cluster_slug}`,\n ...(siteName && {\n isPartOf: { '@type': 'WebSite', name: siteName, url: siteUrl },\n }),\n mainEntity: cluster.pillar\n ? {\n '@type': 'Article',\n headline: cluster.pillar.title,\n url: `${siteUrl}${basePath}/${cluster.pillar.slug}`,\n }\n : undefined,\n hasPart: cluster.supports.map((s) => ({\n '@type': 'Article',\n headline: s.title,\n url: `${siteUrl}${basePath}/${s.slug}`,\n })),\n }\n}\n\n/**\n * Generate metadata for a cluster landing page (Next.js generateMetadata).\n */\nexport async function generateClusterPageMetadata(\n clusterSlug: string,\n options: { siteName?: string; siteUrl?: string; basePath?: string } = {}\n) {\n const cluster = await getTopicCluster(clusterSlug)\n if (!cluster) return {}\n\n const { siteName = '', siteUrl = '', basePath = '/blog' } = options\n const title = `${cluster.cluster_name}${siteName ? ` | ${siteName}` : ''}`\n const description = `Comprehensive guide to ${cluster.core_topic}. ${cluster.article_count} articles covering everything you need to know.`\n\n return {\n title,\n description,\n openGraph: {\n title,\n description,\n url: `${siteUrl}${basePath}/cluster/${cluster.cluster_slug}`,\n type: 'website',\n },\n }\n}\n\n/**\n * Generate \"Related Insights\" section data\n */\nexport async function getRelatedInsights(\n currentSlug: string,\n options: { limit?: number; category?: string } = {}\n): Promise<BlogPostRecord[]> {\n const config = resolveServerApiConfig()\n if (!config) return []\n const { apiUrl, apiKey } = config\n const { limit = 3 } = options\n // options.category is accepted for compatibility, but the endpoint derives\n // relatedness from the current post's own category server-side; a category\n // field in the body has always been ignored.\n\n // The endpoint takes `current_post_id` and looks the post up by id — it has\n // no slug path. Sending `slug` meant the lookup matched nothing and this\n // returned [] on every call since it shipped. Resolve the slug first (60s\n // cache via getBlogPost), then ask with the id.\n const current = await getBlogPost(currentSlug)\n if (!current?.id) return []\n\n try {\n const response = await fetch(`${apiUrl}/public/blog/related`, {\n method: 'POST',\n headers: {\n 'x-api-key': apiKey,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n current_post_id: current.id,\n limit,\n }),\n next: { revalidate: 300 },\n })\n\n if (!response.ok) return []\n\n const data = await response.json()\n return data.posts || []\n } catch (error) {\n console.error('[Blog] Error fetching related posts:', error)\n return []\n }\n}\n\n// ============================================================================\n// BREADCRUMB SCHEMA\n// ============================================================================\n\n/**\n * Generate BreadcrumbList schema for blog navigation\n */\nexport function generateBreadcrumbSchema(\n post: BlogPostRecord,\n options: { siteUrl?: string; siteName?: string } = {}\n): object {\n const { siteUrl = '', siteName = 'Home' } = options\n\n const items = [\n {\n '@type': 'ListItem',\n position: 1,\n name: siteName,\n item: siteUrl,\n },\n {\n '@type': 'ListItem',\n position: 2,\n name: 'Blog',\n item: `${siteUrl}/blog`,\n },\n ]\n\n if (post.category) {\n const categoryName = typeof post.category === 'string' ? post.category : post.category.name\n const categorySlug = typeof post.category === 'string' \n ? post.category.toLowerCase().replace(/\\s+/g, '-')\n : post.category.slug\n\n items.push({\n '@type': 'ListItem',\n position: 3,\n name: categoryName,\n item: `${siteUrl}/blog/category/${categorySlug}`,\n })\n\n items.push({\n '@type': 'ListItem',\n position: 4,\n name: post.title,\n item: `${siteUrl}/blog/${post.slug}`,\n })\n } else {\n items.push({\n '@type': 'ListItem',\n position: 3,\n name: post.title,\n item: `${siteUrl}/blog/${post.slug}`,\n })\n }\n\n return {\n '@context': 'https://schema.org',\n '@type': 'BreadcrumbList',\n itemListElement: items,\n }\n}\n\n// ============================================================================\n// COMBINED SCHEMA (Article + FAQ + Breadcrumb)\n// ============================================================================\n\n/**\n * Generate all relevant schemas for a blog post in a single array\n * This is the recommended way to include multiple schemas.\n * When post has E-E-A-T schema (post.schema), use it instead of generating Article/FAQ.\n */\nexport function generateAllBlogSchemas(\n post: BlogPostRecord,\n options: { siteUrl?: string; siteName?: string; logoUrl?: string } = {}\n): object[] {\n const schemas: object[] = []\n\n // E-E-A-T: use pre-built schema from Signal when present. Single source of\n // truth for E-E-A-T schema resolution: the DB column is schema_json, which\n // the public API passes through raw today; `schema` is the mapped name the\n // dashboard serializer (and a future public mapping) uses. Do NOT also\n // normalize in getBlogPost — that would re-fork this rule.\n const eeatSchema = post.schema ?? post.schema_json\n if (eeatSchema) {\n const arr = Array.isArray(eeatSchema) ? eeatSchema : [eeatSchema]\n schemas.push(...arr)\n } else {\n // 1. Article/BlogPosting schema (always)\n schemas.push(generateBlogPostSchema(post, options))\n\n // 3. FAQ schema (if FAQs present)\n const faqItems = post.faq_items ?? (post as any).faqItems\n if (faqItems && faqItems.length > 0) {\n const faqSchema = generateFaqSchema(faqItems)\n if (faqSchema) schemas.push(faqSchema)\n }\n }\n\n // 2. Breadcrumb schema (always)\n schemas.push(generateBreadcrumbSchema(post, options))\n\n return schemas\n}\n\n// ============================================================================\n// AUTHOR PAGE DATA FETCHING\n// ============================================================================\n\n/**\n * Fetch a single author by slug\n */\nexport async function getAuthorBySlug(slug: string): Promise<BlogAuthor | null> {\n const config = resolveServerApiConfig()\n if (!config) {\n console.warn('[Blog] No API key configured')\n return null\n }\n const { apiUrl, apiKey } = config\n\n try {\n const response = await fetch(`${apiUrl}/public/blog/authors/${slug}`, {\n headers: { 'x-api-key': apiKey },\n next: { revalidate: 60 },\n })\n\n if (!response.ok) return null\n\n const data = await response.json()\n return data.author || null\n } catch (error) {\n console.error('[Blog] Error fetching author:', error)\n return null\n }\n}\n\n/**\n * Fetch an author's posts by slug.\n *\n * `offset` pages through the controller's existing offset support. Older API\n * versions return a stripped `{name, slug}` author on this endpoint; when\n * that shape is detected the full author row is hydrated via getAuthorBySlug\n * (both fetches revalidate:60, so the extra hop is cached and disappears once\n * the API returns the full row itself).\n */\nexport async function getAuthorPosts(\n slug: string,\n limit = 20,\n offset = 0\n): Promise<{ author: BlogAuthor | null; posts: BlogPostRecord[]; total: number }> {\n const config = resolveServerApiConfig()\n if (!config) {\n console.warn('[Blog] No API key configured')\n return { author: null, posts: [], total: 0 }\n }\n const { apiUrl, apiKey } = config\n\n try {\n const response = await fetch(\n `${apiUrl}/public/blog/authors/${slug}/posts?limit=${limit}&offset=${offset}`,\n {\n headers: { 'x-api-key': apiKey },\n next: { revalidate: 60 },\n }\n )\n\n if (!response.ok) return { author: null, posts: [], total: 0 }\n\n const data = await response.json()\n let author: BlogAuthor | null = data.author || null\n if (author && author.id === undefined) {\n try {\n const full = await getAuthorBySlug(slug)\n if (full) author = full\n } catch {\n // keep the stripped {name, slug} object\n }\n }\n return {\n author,\n posts: data.posts || [],\n total: data.total || 0,\n }\n } catch (error) {\n console.error('[Blog] Error fetching author posts:', error)\n return { author: null, posts: [], total: 0 }\n }\n}\n\n/**\n * Fetch all author slugs for static generation\n */\nexport async function getAllAuthorSlugs(): Promise<{ slug: string }[]> {\n const config = resolveServerApiConfig()\n if (!config) {\n console.warn('[Blog] No API key configured')\n return []\n }\n const { apiUrl, apiKey } = config\n\n try {\n const response = await fetch(`${apiUrl}/public/blog/authors`, {\n headers: { 'x-api-key': apiKey },\n next: { revalidate: 300 },\n })\n\n if (!response.ok) return []\n\n const data = await response.json()\n const authors: BlogAuthor[] = data.authors || []\n return authors.map((a) => ({ slug: a.slug }))\n } catch (error) {\n console.error('[Blog] Error fetching author slugs:', error)\n return []\n }\n}\n\n/**\n * Generate static params for author pages\n * Usage: export const generateStaticParams = generateAuthorStaticParams\n */\nexport async function generateAuthorStaticParams(): Promise<{ slug: string }[]> {\n return getAllAuthorSlugs()\n}\n\n// ============================================================================\n// AUTHOR METADATA & SCHEMA\n// ============================================================================\n\n/**\n * Generate Next.js Metadata for an author page\n */\nexport function generateAuthorPageMetadata(\n author: BlogAuthor,\n options: { siteUrl?: string; siteName?: string } = {}\n): Metadata {\n const { siteUrl = '', siteName } = options\n const title = `${author.name}${author.title ? ` - ${author.title}` : ''}`\n const description = author.short_bio || author.bio || `Articles by ${author.name}`\n const url = `${siteUrl}/blog/author/${author.slug}`\n\n return {\n title,\n description,\n openGraph: {\n title,\n description,\n url,\n siteName,\n type: 'profile',\n images: author.avatar_url ? [{ url: author.avatar_url }] : undefined,\n },\n twitter: {\n card: 'summary',\n title,\n description,\n images: author.avatar_url ? [author.avatar_url] : undefined,\n },\n alternates: {\n canonical: author.author_page_url || url,\n },\n }\n}\n\n/**\n * Person JSON-LD for an author page.\n *\n * The implementation lives in `./author-schema` because it is pure, and\n * `AuthorPage` — which is exported from the client-stamped `blog` barrel —\n * needs it. Importing it from here instead would drag this entire server module\n * into the browser bundle. Re-exported so `@sonordev/site-kit/blog/server`\n * keeps its existing public API.\n */\nexport { generateAuthorSchema } from './author-schema'\n\n// -----------------------------------------------------------------------------\n// Blog UI (BlogPost, BlogList) lives in `@sonordev/site-kit/blog/server-ui`.\n// This entry must stay free of React components so Next never marks server\n// helpers (e.g. getAllBlogSlugs) as client — see tsup onSuccess \"use client\".\n// -----------------------------------------------------------------------------\n\n/** Portal blog post document shape (alias of `BlogPost` from `./types`) */\nexport type { BlogPost as BlogPostRecord } from './types'\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/sync/api.ts","../src/sync/BookingWidget.tsx"],"names":["DEFAULT_API_URL"],"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,CAAA","file":"chunk-HVFXFPUJ.mjs","sourcesContent":["/**\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 const msg = await response.json().catch(() => ({ message: response.statusText }))\n const detail = (msg && typeof msg.message === 'string') ? msg.message : response.statusText\n throw new Error(`Failed to fetch booking types: ${response.status} ${detail}`)\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 const msg = await response.json().catch(() => ({ message: response.statusText }))\n const detail = (msg && typeof msg.message === 'string') ? msg.message : response.statusText\n throw new Error(`Failed to fetch booking type: ${response.status} ${detail}`)\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): 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\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 const msg = await response.json().catch(() => ({ message: response.statusText }))\n let detail = (msg && typeof msg.message === 'string') ? String(msg.message).trim() : (response.statusText || '').trim()\n // Avoid \"404 404\": blank when detail is just the status code or only digits\n if (detail === String(response.status) || /^\\d+$/.test(detail)) detail = ''\n const rest = detail ? `${response.status} ${detail}` : String(response.status)\n const fallback =\n response.status === 404 && !detail\n ? 'No times available. In the Portal, check Sync → Booking Types (Schedule a Tour) has a host assigned and the project API key is set for this site.'\n : null\n throw new Error(fallback || `Failed to fetch availability: ${rest}`.trim())\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/**\n * Hold a time slot temporarily (5-10 minutes)\n */\nexport async function createSlotHold(\n holdData: {\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 new Error(`Failed to hold slot: ${response.statusText}`)\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 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 const errorData = await response.json().catch(() => ({}))\n throw new Error(errorData.message || `Failed to create booking: ${response.statusText}`)\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): 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)\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","'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 * 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 = '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 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\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 // 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 // ── Data Loading ──\n\n useEffect(() => {\n if (bookingTypeSlug) {\n setLoading(true)\n fetchBookingTypeDetails(bookingTypeSlug, orgSlug, apiUrl, apiKey)\n .then(type => { setSelectedType(type); setStep('datetime') })\n .catch(err => { setError(err.message); onError?.(err) })\n .finally(() => setLoading(false))\n } else {\n setLoading(true)\n fetchBookingTypes(orgSlug, apiUrl, apiKey)\n .then(types => setBookingTypes(types.filter(t => t.is_active)))\n .catch(err => { setError(err.message); onError?.(err) })\n .finally(() => setLoading(false))\n }\n }, [orgSlug, apiKey, bookingTypeSlug, apiUrl, onError])\n\n useEffect(() => {\n if (!selectedDate || !selectedType) 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 setSlotsLoading(true)\n setSlots([])\n fetchAvailability(selectedType.slug, dateStr, orgSlug, apiUrl, apiKey, timezone)\n .then(s => setSlots(s.filter(slot => slot.available)))\n .catch(err => { setError(err.message); onError?.(err) })\n .finally(() => setSlotsLoading(false))\n }, [selectedDate, selectedType, orgSlug, apiKey, apiUrl, timezone, onError])\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) 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)\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 {\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])\n\n // ── Handlers ──\n\n const handleSlotSelect = useCallback((slot: TimeSlot) => {\n setSelectedSlot(slot)\n setConfirmedSlot(false)\n }, [])\n\n const handleSlotConfirm = useCallback(async () => {\n if (!selectedType || !selectedSlot) return\n if (hold) await releaseSlotHold(hold.holdId, apiUrl, apiKey).catch(() => {})\n\n setLoading(true)\n try {\n const newHold = await createSlotHold(\n {\n bookingType: selectedType.slug,\n slotStart: selectedSlot.start,\n slotEnd: selectedSlot.end,\n hostId: selectedSlot.hostId || '',\n sessionId: `bw-${Date.now()}`,\n },\n apiUrl,\n apiKey,\n )\n setHold(newHold)\n setConfirmedSlot(true)\n setStep('form')\n } catch (err: any) {\n setError(err.message)\n onError?.(err)\n } finally {\n setLoading(false)\n }\n }, [selectedType, selectedSlot, hold, timezone, apiUrl, apiKey, onError])\n\n const handleBookingSubmit = useCallback(async (e: React.FormEvent) => {\n e.preventDefault()\n if (!selectedType || !selectedSlot) return\n setSubmitting(true)\n setError(null)\n\n try {\n const result = await createBooking(\n {\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: `bw-${Date.now()}`,\n sourceUrl: typeof window !== 'undefined' ? window.location.href : undefined,\n },\n apiUrl,\n apiKey,\n )\n setBookingResult(result)\n setStep('success')\n onBookingComplete?.(result)\n } catch (err: any) {\n setError(err.message)\n onError?.(err)\n } finally {\n setSubmitting(false)\n }\n }, [selectedType, selectedSlot, guestInfo, timezone, hold, apiUrl, apiKey, onBookingComplete, onError])\n\n useEffect(() => {\n return () => { if (hold) releaseSlotHold(hold.holdId, apiUrl, apiKey).catch(() => {}) }\n }, [hold, apiUrl, apiKey])\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 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 && (\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\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={() => { setSelectedType(type); setStep('datetime') }}\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 {/* ───── 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 && (\n <button className=\"bw-back\" onClick={() => { setSelectedType(null); setStep('type') }}>\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={selectedType} />\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} 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} 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\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={() => !disabled && 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} />\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} />\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} />\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={() => setStep('datetime')}>\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={selectedType} />\n </div>\n </div>\n </div>\n\n {hold && (\n <div className=\"bw-hold-notice\">\n <SpinnerIcon /> Slot held for you. Complete your details to confirm.\n </div>\n )}\n\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 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 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</label>\n <input\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 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 || !guestInfo.name || !guestInfo.email}>\n {submitting ? <><SpinnerIcon /> Confirming...</> : '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\">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={selectedType} />\n </div>\n\n <p className=\"bw-email-notice\">We’ve emailed your confirmation to <strong>{guestInfo.email}</strong> with everything you need.</p>\n\n <p className=\"bw-cal-links-label\">Add to your calendar</p>\n <div className=\"bw-cal-links\">\n <a href={bookingResult.calendarLinks.google} target=\"_blank\" rel=\"noopener noreferrer\" className=\"bw-cal-link\">\n <CalendarPlusIcon /> Google\n </a>\n <a href={bookingResult.calendarLinks.outlook} target=\"_blank\" rel=\"noopener noreferrer\" className=\"bw-cal-link\">\n <CalendarPlusIcon /> Outlook\n </a>\n <a href={bookingResult.calendarLinks.ics} download className=\"bw-cal-link\">\n <CalendarPlusIcon /> iCal\n </a>\n </div>\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' }\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 }: { type: BookingType | null }) {\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.detail}</> : null}\n {loc.mapUrl ? (\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\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: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\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"]}
|