@sonordev/site-kit 5.3.2 → 5.5.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/AGENTS.md +16 -6
- package/README.md +26 -7
- package/agent-manifest.json +11 -10
- package/dist/AnalyticsProvider-KFXAH4GR.mjs +11 -0
- package/dist/{AnalyticsProvider-2XK54UZW.mjs.map → AnalyticsProvider-KFXAH4GR.mjs.map} +1 -1
- package/dist/AnalyticsProvider-WDDW3IJW.js +32 -0
- package/dist/{AnalyticsProvider-PM7SOGOS.js.map → AnalyticsProvider-WDDW3IJW.js.map} +1 -1
- package/dist/{BlogViewTracker-3BIUF5TI.js → BlogViewTracker-D4DIEP4Q.js} +6 -6
- package/dist/{BlogViewTracker-3BIUF5TI.js.map → BlogViewTracker-D4DIEP4Q.js.map} +1 -1
- package/dist/{BlogViewTracker-KFUDRDQK.mjs → BlogViewTracker-ZVEGGH3Y.mjs} +5 -5
- package/dist/{BlogViewTracker-KFUDRDQK.mjs.map → BlogViewTracker-ZVEGGH3Y.mjs.map} +1 -1
- package/dist/ChatWidget-2ZYPYIMQ.js +22 -0
- package/dist/{ChatWidget-7BYSGNO2.js.map → ChatWidget-2ZYPYIMQ.js.map} +1 -1
- package/dist/ChatWidget-FYCCLMQE.mjs +13 -0
- package/dist/{ChatWidget-4PHZHGG5.mjs.map → ChatWidget-FYCCLMQE.mjs.map} +1 -1
- package/dist/EngageWidget-6HUZYOY7.mjs +11 -0
- package/dist/{EngageWidget-D6M6QWEC.mjs.map → EngageWidget-6HUZYOY7.mjs.map} +1 -1
- package/dist/EngageWidget-MYQTBBW6.js +20 -0
- package/dist/{EngageWidget-Q4ITKTMJ.js.map → EngageWidget-MYQTBBW6.js.map} +1 -1
- package/dist/{FileField-YBBIJOCK.js → FileField-JK2S24XU.js} +6 -6
- package/dist/{FileField-YBBIJOCK.js.map → FileField-JK2S24XU.js.map} +1 -1
- package/dist/{FileField-PQQDX4IR.mjs → FileField-OZZHWGPA.mjs} +5 -5
- package/dist/{FileField-PQQDX4IR.mjs.map → FileField-OZZHWGPA.mjs.map} +1 -1
- package/dist/{FormSpotlight-WUN24F3P.js → FormSpotlight-5AXFQU5M.js} +15 -15
- package/dist/{FormSpotlight-WUN24F3P.js.map → FormSpotlight-5AXFQU5M.js.map} +1 -1
- package/dist/{FormSpotlight-7TIIWFTP.mjs → FormSpotlight-XV42L72H.mjs} +3 -3
- package/dist/{FormSpotlight-7TIIWFTP.mjs.map → FormSpotlight-XV42L72H.mjs.map} +1 -1
- package/dist/{FormStage-CM7OVLUT.js → FormStage-HATUHNRV.js} +13 -13
- package/dist/{FormStage-CM7OVLUT.js.map → FormStage-HATUHNRV.js.map} +1 -1
- package/dist/{FormStage-TFN2GIBO.mjs → FormStage-RUK675HV.mjs} +3 -3
- package/dist/{FormStage-TFN2GIBO.mjs.map → FormStage-RUK675HV.mjs.map} +1 -1
- package/dist/ManagedForm-JWEXJEXK.js +23 -0
- package/dist/{ManagedForm-N63YGVNY.js.map → ManagedForm-JWEXJEXK.js.map} +1 -1
- package/dist/ManagedForm-OA3MNGXT.mjs +14 -0
- package/dist/{ManagedForm-ZUXLHEQU.mjs.map → ManagedForm-OA3MNGXT.mjs.map} +1 -1
- package/dist/{ManagedNewsletterForm-PIVJTU5L.js → ManagedNewsletterForm-AAHH63KT.js} +8 -8
- package/dist/{ManagedNewsletterForm-PIVJTU5L.js.map → ManagedNewsletterForm-AAHH63KT.js.map} +1 -1
- package/dist/{ManagedNewsletterForm-4AVKTZ2A.mjs → ManagedNewsletterForm-HZKTNWLW.mjs} +7 -7
- package/dist/{ManagedNewsletterForm-4AVKTZ2A.mjs.map → ManagedNewsletterForm-HZKTNWLW.mjs.map} +1 -1
- package/dist/{SignalCore-LT4NCPOR.mjs → SignalCore-X3GDGBZD.mjs} +5 -5
- package/dist/{SignalCore-LT4NCPOR.mjs.map → SignalCore-X3GDGBZD.mjs.map} +1 -1
- package/dist/{SignalCore-2M5TISM7.js → SignalCore-YSNZYBKJ.js} +11 -11
- package/dist/{SignalCore-2M5TISM7.js.map → SignalCore-YSNZYBKJ.js.map} +1 -1
- package/dist/SitemapSync-2PTDBH5E.mjs +9 -0
- package/dist/{SitemapSync-G3OLECFI.mjs.map → SitemapSync-2PTDBH5E.mjs.map} +1 -1
- package/dist/SitemapSync-3SFAI546.js +18 -0
- package/dist/{SitemapSync-7OBOJG2L.js.map → SitemapSync-3SFAI546.js.map} +1 -1
- package/dist/analytics/dispatch.d.ts +4 -4
- package/dist/analytics/index.js +15 -15
- package/dist/analytics/index.mjs +6 -6
- package/dist/{api-NTHZ6PAW.mjs → api-D745LGGU.mjs} +3 -3
- package/dist/api-D745LGGU.mjs.map +1 -0
- package/dist/{api-N5OLQXYN.js → api-XR5APCH3.js} +3 -3
- package/dist/api-XR5APCH3.js.map +1 -0
- 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-OIJ435IZ.js → chunk-2CMSWJWC.js} +18 -18
- package/dist/{chunk-OIJ435IZ.js.map → chunk-2CMSWJWC.js.map} +1 -1
- package/dist/{chunk-K37JPEQW.js → chunk-2OU4KBUN.js} +26 -23
- package/dist/chunk-2OU4KBUN.js.map +1 -0
- package/dist/{chunk-JSLYNYTB.mjs → chunk-3B6CXGAK.mjs} +3 -3
- package/dist/{chunk-JSLYNYTB.mjs.map → chunk-3B6CXGAK.mjs.map} +1 -1
- package/dist/{chunk-HMFFAUCD.js → chunk-3DWIYCQX.js} +2 -2
- package/dist/chunk-3DWIYCQX.js.map +1 -0
- package/dist/{chunk-3EPMDPWI.js → chunk-3SDMJMN2.js} +5 -5
- package/dist/{chunk-3EPMDPWI.js.map → chunk-3SDMJMN2.js.map} +1 -1
- package/dist/chunk-4B4S56WJ.mjs +110 -0
- package/dist/chunk-4B4S56WJ.mjs.map +1 -0
- package/dist/chunk-4U5NCKQY.mjs +39 -0
- package/dist/chunk-4U5NCKQY.mjs.map +1 -0
- package/dist/{chunk-CQUA2AUA.mjs → chunk-4XGACM7D.mjs} +3 -3
- package/dist/{chunk-CQUA2AUA.mjs.map → chunk-4XGACM7D.mjs.map} +1 -1
- package/dist/{chunk-AVM4OZHR.mjs → chunk-5TGAUWNO.mjs} +3 -3
- package/dist/{chunk-AVM4OZHR.mjs.map → chunk-5TGAUWNO.mjs.map} +1 -1
- package/dist/{chunk-RO55G3OA.mjs → chunk-64BOVMXG.mjs} +3 -3
- package/dist/{chunk-RO55G3OA.mjs.map → chunk-64BOVMXG.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-N3C323NY.mjs → chunk-7PPNXORV.mjs} +3 -3
- package/dist/{chunk-N3C323NY.mjs.map → chunk-7PPNXORV.mjs.map} +1 -1
- package/dist/{chunk-DYKFC7WY.js → chunk-A3F5GRNJ.js} +8 -8
- package/dist/{chunk-DYKFC7WY.js.map → chunk-A3F5GRNJ.js.map} +1 -1
- package/dist/{chunk-4TU246Q4.mjs → chunk-AEARU24Q.mjs} +40 -26
- package/dist/chunk-AEARU24Q.mjs.map +1 -0
- package/dist/{chunk-5BZDHZCN.js → chunk-BNOQXDPJ.js} +4 -4
- package/dist/{chunk-5BZDHZCN.js.map → chunk-BNOQXDPJ.js.map} +1 -1
- package/dist/{chunk-XQZTOWS3.js → chunk-CT5REGAK.js} +15 -15
- package/dist/{chunk-XQZTOWS3.js.map → chunk-CT5REGAK.js.map} +1 -1
- package/dist/{chunk-KOP3DPIR.mjs → chunk-DRLHQQBH.mjs} +4 -4
- package/dist/{chunk-KOP3DPIR.mjs.map → chunk-DRLHQQBH.mjs.map} +1 -1
- package/dist/{chunk-Y7SRO7MJ.mjs → chunk-DYULWKDC.mjs} +4 -4
- package/dist/{chunk-Y7SRO7MJ.mjs.map → chunk-DYULWKDC.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-ESP5RMB7.js +42 -0
- package/dist/chunk-ESP5RMB7.js.map +1 -0
- package/dist/{chunk-4DE2KJ7R.js → chunk-FF5N5D3D.js} +8 -8
- package/dist/{chunk-4DE2KJ7R.js.map → chunk-FF5N5D3D.js.map} +1 -1
- package/dist/{chunk-757HXAYX.js → chunk-FYVLQ3OU.js} +3 -3
- package/dist/{chunk-757HXAYX.js.map → chunk-FYVLQ3OU.js.map} +1 -1
- package/dist/{chunk-OC6PU7U2.mjs → chunk-G5HUI4BO.mjs} +3 -3
- package/dist/{chunk-OC6PU7U2.mjs.map → chunk-G5HUI4BO.mjs.map} +1 -1
- package/dist/chunk-G6WF4G3E.js +43 -0
- package/dist/chunk-G6WF4G3E.js.map +1 -0
- package/dist/chunk-GHECYDSZ.mjs +134 -0
- package/dist/chunk-GHECYDSZ.mjs.map +1 -0
- package/dist/{chunk-JTO3K5B7.mjs → chunk-HBI67P7Y.mjs} +4 -4
- package/dist/{chunk-JTO3K5B7.mjs.map → chunk-HBI67P7Y.mjs.map} +1 -1
- package/dist/{chunk-FFJVQWKO.js → chunk-HFJQMIFM.js} +4 -4
- package/dist/{chunk-FFJVQWKO.js.map → chunk-HFJQMIFM.js.map} +1 -1
- package/dist/{chunk-A3NNUKFA.js → chunk-HX3BRMOX.js} +96 -644
- package/dist/chunk-HX3BRMOX.js.map +1 -0
- package/dist/{chunk-3TXX5KIN.js → chunk-JNRHTZL4.js} +2 -2
- package/dist/{chunk-3TXX5KIN.js.map → chunk-JNRHTZL4.js.map} +1 -1
- package/dist/{chunk-R3LYTIVN.js → chunk-KAUUGRYB.js} +5 -5
- package/dist/{chunk-R3LYTIVN.js.map → chunk-KAUUGRYB.js.map} +1 -1
- package/dist/{chunk-L2LJQIM3.js → chunk-KPKQKFT4.js} +11 -11
- package/dist/chunk-KPKQKFT4.js.map +1 -0
- package/dist/chunk-LC7AM4J5.js +118 -0
- package/dist/chunk-LC7AM4J5.js.map +1 -0
- package/dist/{chunk-GFNXWS3I.js → chunk-MCJF2KJ6.js} +5 -5
- package/dist/{chunk-GFNXWS3I.js.map → chunk-MCJF2KJ6.js.map} +1 -1
- package/dist/{chunk-Z7K5AMCE.js → chunk-MNYM2XU4.js} +4 -4
- package/dist/{chunk-Z7K5AMCE.js.map → chunk-MNYM2XU4.js.map} +1 -1
- package/dist/{chunk-6QABCGM6.mjs → chunk-MU7IEPDG.mjs} +4 -4
- package/dist/chunk-MU7IEPDG.mjs.map +1 -0
- package/dist/chunk-NSWO43XW.mjs +39 -0
- package/dist/chunk-NSWO43XW.mjs.map +1 -0
- package/dist/{chunk-Z33JXJTJ.js → chunk-NZSFOZJV.js} +40 -26
- package/dist/chunk-NZSFOZJV.js.map +1 -0
- package/dist/{chunk-ZKR5AJV5.mjs → chunk-OFSA7LUH.mjs} +4 -4
- package/dist/{chunk-ZKR5AJV5.mjs.map → chunk-OFSA7LUH.mjs.map} +1 -1
- package/dist/{chunk-M7FWXEXC.js → chunk-PIPLBBDH.js} +8 -8
- package/dist/{chunk-M7FWXEXC.js.map → chunk-PIPLBBDH.js.map} +1 -1
- package/dist/{chunk-FDVE56JS.js → chunk-Q26VZNM2.js} +3 -3
- package/dist/{chunk-FDVE56JS.js.map → chunk-Q26VZNM2.js.map} +1 -1
- package/dist/{chunk-6AZTRTCG.js → chunk-QEGUI2Q2.js} +15 -15
- package/dist/{chunk-6AZTRTCG.js.map → chunk-QEGUI2Q2.js.map} +1 -1
- package/dist/{chunk-GPNBBUEN.js → chunk-QFNSM77X.js} +3 -3
- package/dist/{chunk-GPNBBUEN.js.map → chunk-QFNSM77X.js.map} +1 -1
- package/dist/{chunk-QZ54OCWD.mjs → chunk-R4MX6EOM.mjs} +7 -7
- package/dist/{chunk-QZ54OCWD.mjs.map → chunk-R4MX6EOM.mjs.map} +1 -1
- package/dist/{chunk-67CHHDBL.mjs → chunk-RMMHWSPP.mjs} +96 -644
- package/dist/chunk-RMMHWSPP.mjs.map +1 -0
- package/dist/{chunk-B4BFQSSS.mjs → chunk-RU54J2PY.mjs} +4 -4
- package/dist/chunk-RU54J2PY.mjs.map +1 -0
- package/dist/{chunk-AXAIUCSF.mjs → chunk-RZUZMUTN.mjs} +9 -8
- package/dist/chunk-RZUZMUTN.mjs.map +1 -0
- package/dist/{chunk-NSLYY62T.mjs → chunk-S6FEC6UT.mjs} +9 -5
- package/dist/chunk-S6FEC6UT.mjs.map +1 -0
- package/dist/{chunk-3DPXOZAU.mjs → chunk-SHLWA6JY.mjs} +2 -2
- package/dist/chunk-SHLWA6JY.mjs.map +1 -0
- package/dist/{chunk-E33HJMRP.js → chunk-SQVYLIIN.js} +11 -7
- package/dist/chunk-SQVYLIIN.js.map +1 -0
- package/dist/chunk-SUZ3ZLB2.js +8 -0
- package/dist/{chunk-D37M7MIH.js.map → chunk-SUZ3ZLB2.js.map} +1 -1
- package/dist/{chunk-DZDWBQKA.mjs → chunk-TALEV3IH.mjs} +3 -3
- package/dist/{chunk-DZDWBQKA.mjs.map → chunk-TALEV3IH.mjs.map} +1 -1
- package/dist/{chunk-UOTXSWKZ.mjs → chunk-TP7H6BSK.mjs} +2 -2
- package/dist/{chunk-UOTXSWKZ.mjs.map → chunk-TP7H6BSK.mjs.map} +1 -1
- package/dist/{chunk-XW5KNCWJ.mjs → chunk-TX2QQ7IX.mjs} +3 -3
- package/dist/{chunk-XW5KNCWJ.mjs.map → chunk-TX2QQ7IX.mjs.map} +1 -1
- package/dist/{chunk-PEEQMI7U.js → chunk-UNPEMSLK.js} +12 -11
- package/dist/chunk-UNPEMSLK.js.map +1 -0
- package/dist/{chunk-42F5EK24.mjs → chunk-UZL2QU2V.mjs} +16 -13
- package/dist/chunk-UZL2QU2V.mjs.map +1 -0
- package/dist/{chunk-6VG65AIA.mjs → chunk-V6NOM7PJ.mjs} +3 -3
- package/dist/{chunk-6VG65AIA.mjs.map → chunk-V6NOM7PJ.mjs.map} +1 -1
- package/dist/{chunk-W23TMUKB.js → chunk-VAS3LH5W.js} +418 -98
- package/dist/chunk-VAS3LH5W.js.map +1 -0
- package/dist/{chunk-TS3N3LGZ.mjs → chunk-VYHRAICF.mjs} +4 -4
- package/dist/{chunk-TS3N3LGZ.mjs.map → chunk-VYHRAICF.mjs.map} +1 -1
- package/dist/{chunk-G3YUSRCL.js → chunk-W5NVW23S.js} +4 -4
- package/dist/{chunk-G3YUSRCL.js.map → chunk-W5NVW23S.js.map} +1 -1
- package/dist/chunk-WDBCXRTT.mjs +6 -0
- package/dist/{chunk-OUERH2T4.mjs.map → chunk-WDBCXRTT.mjs.map} +1 -1
- package/dist/{chunk-ZOJ3TLO5.mjs → chunk-WIZRCI6J.mjs} +3 -3
- package/dist/{chunk-ZOJ3TLO5.mjs.map → chunk-WIZRCI6J.mjs.map} +1 -1
- package/dist/{chunk-HDQTZAGE.mjs → chunk-X2XFLYZ3.mjs} +3 -3
- package/dist/{chunk-HDQTZAGE.mjs.map → chunk-X2XFLYZ3.mjs.map} +1 -1
- package/dist/{chunk-HVFXFPUJ.mjs → chunk-XQYC4KMH.mjs} +413 -94
- package/dist/chunk-XQYC4KMH.mjs.map +1 -0
- package/dist/{chunk-KPFPSOYS.js → chunk-YNC5D3FT.js} +12 -12
- package/dist/{chunk-KPFPSOYS.js.map → chunk-YNC5D3FT.js.map} +1 -1
- package/dist/chunk-YQTE32QK.js +137 -0
- package/dist/chunk-YQTE32QK.js.map +1 -0
- package/dist/{chunk-PZXKFHPO.js → chunk-YYAFHIY7.js} +15 -15
- package/dist/chunk-YYAFHIY7.js.map +1 -0
- package/dist/{chunk-MANX6422.js → chunk-Z6S4MWSR.js} +7 -7
- package/dist/{chunk-MANX6422.js.map → chunk-Z6S4MWSR.js.map} +1 -1
- package/dist/{chunk-DVH3JHZ3.mjs → chunk-ZRQFG3L6.mjs} +5 -5
- package/dist/{chunk-DVH3JHZ3.mjs.map → chunk-ZRQFG3L6.mjs.map} +1 -1
- package/dist/cli/agent/checks.d.ts.map +1 -1
- package/dist/cli/agent/ssr-bailout.d.ts +27 -0
- package/dist/cli/agent/ssr-bailout.d.ts.map +1 -0
- package/dist/cli/agent/ssr-bailout.test.d.ts +2 -0
- package/dist/cli/agent/ssr-bailout.test.d.ts.map +1 -0
- package/dist/cli/codemod/transforms.d.ts.map +1 -1
- package/dist/cli/index.js +38 -51
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/index.mjs +36 -49
- package/dist/cli/index.mjs.map +1 -1
- package/dist/cli/migrator/index.d.ts.map +1 -1
- package/dist/client/index.d.ts +1 -0
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +20 -7
- package/dist/client/index.js.map +1 -1
- package/dist/client/index.mjs +5 -4
- package/dist/client/index.mjs.map +1 -1
- package/dist/cms/index.js.map +1 -1
- package/dist/cms/index.mjs.map +1 -1
- package/dist/cms/sanity-image.d.ts +1 -1
- package/dist/commerce/index.js +58 -58
- package/dist/commerce/index.mjs +7 -7
- package/dist/engage/ChatWidget.d.ts.map +1 -1
- package/dist/engage/EngageWidget.d.ts +3 -4
- package/dist/engage/EngageWidget.d.ts.map +1 -1
- package/dist/engage/chat-launcher.test.d.ts +2 -0
- package/dist/engage/chat-launcher.test.d.ts.map +1 -0
- package/dist/engage/index.js +12 -10
- package/dist/engage/index.js.map +1 -1
- package/dist/engage/index.mjs +9 -7
- package/dist/engage/index.mjs.map +1 -1
- package/dist/engage/launcher-placement.d.ts +56 -0
- package/dist/engage/launcher-placement.d.ts.map +1 -0
- package/dist/engage/launcher-placement.test.d.ts +2 -0
- package/dist/engage/launcher-placement.test.d.ts.map +1 -0
- package/dist/engage/types.d.ts +41 -7
- package/dist/engage/types.d.ts.map +1 -1
- 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/ManagedImage.d.ts.map +1 -1
- package/dist/images/index.js +11 -11
- package/dist/images/index.mjs +4 -4
- package/dist/index.js +65 -65
- package/dist/index.mjs +11 -11
- package/dist/layout/SiteKitClientProviders.d.ts.map +1 -1
- package/dist/layout/client.d.ts.map +1 -1
- 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/layout/types.d.ts +7 -3
- package/dist/layout/types.d.ts.map +1 -1
- package/dist/llms/generateLLMsTxt.d.ts.map +1 -1
- package/dist/llms/index.js +12 -12
- package/dist/llms/index.mjs +2 -2
- package/dist/llms/types.d.ts +7 -1
- package/dist/llms/types.d.ts.map +1 -1
- package/dist/maps/index.js +5 -5
- package/dist/maps/index.mjs +3 -3
- package/dist/mcp/WebMcpTools.d.ts +5 -2
- package/dist/mcp/WebMcpTools.d.ts.map +1 -1
- package/dist/mcp/client.js.map +1 -1
- package/dist/mcp/client.mjs.map +1 -1
- package/dist/search/index.js +4 -4
- package/dist/search/index.mjs +3 -3
- package/dist/seo/LocationPageContent.d.ts +6 -5
- package/dist/seo/LocationPageContent.d.ts.map +1 -1
- package/dist/seo/api.d.ts +4 -5
- package/dist/seo/api.d.ts.map +1 -1
- package/dist/seo/client.js +5 -5
- package/dist/seo/client.mjs +4 -4
- package/dist/seo/index.js +42 -42
- package/dist/seo/index.js.map +1 -1
- package/dist/seo/index.mjs +8 -8
- package/dist/seo/index.mjs.map +1 -1
- package/dist/seo/routing.d.ts +9 -23
- package/dist/seo/routing.d.ts.map +1 -1
- package/dist/seo/server-api.d.ts +11 -5
- package/dist/seo/server-api.d.ts.map +1 -1
- package/dist/seo/server.js +18 -18
- package/dist/seo/server.mjs +2 -2
- package/dist/server/index.js +3 -3
- package/dist/server/index.mjs +2 -2
- package/dist/{server-api-HW4PL2L2.mjs → server-api-RG3ZL3DV.mjs} +3 -3
- package/dist/{server-api-HW4PL2L2.mjs.map → server-api-RG3ZL3DV.mjs.map} +1 -1
- package/dist/{server-api-DB2SIUP4.js → server-api-RYJQAUGO.js} +21 -21
- package/dist/{server-api-DB2SIUP4.js.map → server-api-RYJQAUGO.js.map} +1 -1
- package/dist/shared/version.d.ts +1 -1
- package/dist/shared/visual-viewport-gap.d.ts +52 -0
- package/dist/shared/visual-viewport-gap.d.ts.map +1 -0
- package/dist/shared/visual-viewport-gap.test.d.ts +2 -0
- package/dist/shared/visual-viewport-gap.test.d.ts.map +1 -0
- 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/dist/types.d.ts +9 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/skills/site-kit/SKILL.md +8 -3
- 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/api-N5OLQXYN.js.map +0 -1
- package/dist/api-NTHZ6PAW.mjs.map +0 -1
- package/dist/chunk-3DPXOZAU.mjs.map +0 -1
- package/dist/chunk-42F5EK24.mjs.map +0 -1
- package/dist/chunk-4TU246Q4.mjs.map +0 -1
- package/dist/chunk-67CHHDBL.mjs.map +0 -1
- package/dist/chunk-6QABCGM6.mjs.map +0 -1
- package/dist/chunk-A3NNUKFA.js.map +0 -1
- package/dist/chunk-AXAIUCSF.mjs.map +0 -1
- package/dist/chunk-B4BFQSSS.mjs.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-E33HJMRP.js.map +0 -1
- package/dist/chunk-HMFFAUCD.js.map +0 -1
- package/dist/chunk-HVFXFPUJ.mjs.map +0 -1
- package/dist/chunk-JBGRXICL.js.map +0 -1
- package/dist/chunk-K37JPEQW.js.map +0 -1
- package/dist/chunk-L2LJQIM3.js.map +0 -1
- package/dist/chunk-NSLYY62T.mjs.map +0 -1
- package/dist/chunk-OUERH2T4.mjs +0 -6
- package/dist/chunk-PEEQMI7U.js.map +0 -1
- package/dist/chunk-PZXKFHPO.js.map +0 -1
- package/dist/chunk-TPL2IHFI.js +0 -43
- package/dist/chunk-TPL2IHFI.js.map +0 -1
- package/dist/chunk-W23TMUKB.js.map +0 -1
- package/dist/chunk-Z33JXJTJ.js.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { StageStyles, SummaryTick } from './chunk-WSPGXSBU.mjs';
|
|
3
|
-
import { useFieldControls, stageViews, stageFirstName, isEmptyValue, stageEstimate, formatAnswer, AUTO_ADVANCE_TYPES } from './chunk-
|
|
3
|
+
import { useFieldControls, stageViews, stageFirstName, isEmptyValue, stageEstimate, formatAnswer, AUTO_ADVANCE_TYPES } from './chunk-V6NOM7PJ.mjs';
|
|
4
4
|
import { FormField } from './chunk-H7274TKR.mjs';
|
|
5
5
|
import './chunk-BEXTDHO4.mjs';
|
|
6
6
|
import { useState, useRef, useMemo, useEffect, useCallback } from 'react';
|
|
@@ -411,5 +411,5 @@ function FormStage({
|
|
|
411
411
|
}
|
|
412
412
|
|
|
413
413
|
export { FormStage };
|
|
414
|
-
//# sourceMappingURL=FormStage-
|
|
415
|
-
//# sourceMappingURL=FormStage-
|
|
414
|
+
//# sourceMappingURL=FormStage-RUK675HV.mjs.map
|
|
415
|
+
//# sourceMappingURL=FormStage-RUK675HV.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/forms/FormStage.tsx"],"names":[],"mappings":"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","file":"FormStage-TFN2GIBO.mjs","sourcesContent":["'use client'\n\n/**\n * FormStage — the \"stage\" experience: a spotlight ACCORDION. Beats expand and\n * collapse on one surface (paired grid-rows morphs: the active beat blooms\n * while the previous settles into a filled summary row of label · answer ·\n * tick; upcoming beats wait as dim numbered rows). Enter advances: next field\n * in the beat, then the next beat, then the wake-lit submit. Because every\n * answer stays visible, the form is its own review — no confirm screen.\n *\n * A beat is a VIEW, not a field (see experience-plan.ts): consecutive\n * half/third-width fields share a beat exactly like they share a row in the\n * classic grid; full-width fields stand alone; steps break beats.\n *\n * This is a RENDER BRANCH of FormClient, never a customRender: FormClient\n * still owns values/errors/honeypot/submit, so spam defense and validation\n * are identical to classic. Beat index rides the existing step-tracking pipe,\n * turning form_analytics into a per-beat funnel with zero API changes.\n *\n * Loaded lazily by FormClient — classic-form sites never download it.\n */\n\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { useFieldControls } from './field-controls'\nimport { FormField } from './FormField'\nimport { StageStyles, SummaryTick } from './experience-chrome'\nimport {\n AUTO_ADVANCE_TYPES,\n formatAnswer,\n isEmptyValue,\n stageEstimate,\n stageFirstName,\n stageViews,\n} from './experience-plan'\nimport type { StageView } from './experience-plan'\nimport type { ExperienceRenderProps, FormField as FormFieldType } from './types'\n\n/** -1 = at rest (nothing active — every beat settled, submit has the floor). */\nconst REST = -1\n\nexport function FormStage({\n config,\n values,\n errors,\n touched,\n isSubmitting,\n submitError,\n momentum,\n className,\n setFieldValue,\n validateField,\n isFieldVisible,\n fieldIsComplete,\n applyFieldError,\n submit,\n trackStepChange,\n honeypot,\n}: ExperienceRenderProps) {\n // Same on-demand date/file controls the classic form uses.\n const fieldControls = useFieldControls(config.fields)\n const [activeIndex, setActiveIndex] = useState(0)\n // Beats deliberately passed through (including skipped-empty optionals) —\n // drives \"Skipped\" vs \"not there yet\" in the settled rows.\n const [visited, setVisited] = useState<Record<number, boolean>>({})\n // Incremented on each rejected advance so the shake animation replays.\n const [shakeCount, setShakeCount] = useState(0)\n\n const formRef = useRef<HTMLFormElement | null>(null)\n const autoAdvanceTimer = useRef<number | null>(null)\n // Focus is only ever moved after the user has interacted — never on load.\n const hasInteractedRef = useRef(false)\n\n // The run respects conditional visibility live — answering an earlier\n // beat can add or remove later ones.\n const views = useMemo(() => {\n return stageViews(config)\n .map((v) => ({ ...v, fields: v.fields.filter(isFieldVisible) }))\n .filter((v) => v.fields.length > 0)\n }, [config, isFieldVisible])\n const total = views.length\n const questionCount = useMemo(\n () => views.reduce((n, v) => n + v.fields.length, 0),\n [views],\n )\n\n // Clamp if a conditional hid beats behind the cursor.\n useEffect(() => {\n if (activeIndex > 0 && activeIndex >= total) setActiveIndex(total - 1)\n }, [activeIndex, total])\n\n // Greeting: the beat right after the first-name answer says hello.\n const nameViewIndex = useMemo(\n () => views.findIndex((v) => v.fields.some((f) => /^first[_-]?name$/i.test(f.slug))),\n [views],\n )\n const nameField =\n nameViewIndex >= 0\n ? views[nameViewIndex].fields.find((f) => /^first[_-]?name$/i.test(f.slug))\n : undefined\n const firstName = nameField ? stageFirstName(values[nameField.slug]) : null\n\n const clearAutoAdvance = useCallback(() => {\n if (autoAdvanceTimer.current !== null) {\n window.clearTimeout(autoAdvanceTimer.current)\n autoAdvanceTimer.current = null\n }\n }, [])\n useEffect(() => clearAutoAdvance, [clearAutoAdvance])\n\n const beatHasValue = useCallback(\n (index: number) =>\n (views[index]?.fields || []).some((f) => !isEmptyValue(values[f.slug])),\n [views, values],\n )\n const beatComplete = useCallback(\n (index: number) => {\n const v = views[index]\n if (!v) return false\n return v.fields.every(\n (f) => fieldIsComplete(f) || (!f.is_required && isEmptyValue(values[f.slug])),\n ) && (beatHasValue(index) || visited[index] === true)\n },\n [views, fieldIsComplete, values, beatHasValue, visited],\n )\n\n const activate = useCallback(\n (index: number) => {\n hasInteractedRef.current = true\n clearAutoAdvance()\n setShakeCount(0)\n setActiveIndex(index)\n if (index !== REST) trackStepChange(index + 1)\n },\n [clearAutoAdvance, trackStepChange],\n )\n\n const advance = useCallback(() => {\n hasInteractedRef.current = true\n clearAutoAdvance()\n const view = views[activeIndex]\n if (!view) return\n let failed = false\n for (const field of view.fields) {\n const error = validateField(field)\n if (error) {\n applyFieldError(field.slug, error)\n failed = true\n }\n }\n if (failed) {\n setShakeCount((n) => n + 1)\n return\n }\n setShakeCount(0)\n setVisited((prev) => ({ ...prev, [activeIndex]: true }))\n if (activeIndex >= views.length - 1) {\n // Every beat settled — the submit takes the floor (wake glow via\n // [data-sk-ready] once momentum completes).\n setActiveIndex(REST)\n } else {\n setActiveIndex(activeIndex + 1)\n trackStepChange(activeIndex + 2)\n }\n }, [views, activeIndex, validateField, applyFieldError, trackStepChange, clearAutoAdvance])\n\n // advance() closes over stale state inside the auto-advance timeout — the\n // ref always points at the freshest render's advance.\n const advanceRef = useRef(advance)\n advanceRef.current = advance\n\n // Validation errors raised by submit()'s validateAll while at rest: travel\n // to the first offending beat, shaking. (Errors raised by advance() are\n // always in the active beat, so this never fights the user's typing.)\n useEffect(() => {\n const index = views.findIndex((v) => v.fields.some((f) => errors[f.slug]))\n if (index >= 0 && index !== activeIndex) {\n setActiveIndex(index)\n setShakeCount((n) => n + 1)\n trackStepChange(index + 1)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [errors])\n\n // Land focus inside the newly active beat — first errored field after a\n // shake, else the first field. At rest, focus the finale submit so Enter\n // finishes the arc. Only after real interaction, never on load.\n useEffect(() => {\n if (!hasInteractedRef.current) return\n const timer = window.setTimeout(() => {\n if (activeIndex === REST) {\n formRef.current\n ?.querySelector<HTMLElement>('[data-sk-part=\"stage-submit\"]')\n ?.focus()\n return\n }\n const root = formRef.current?.querySelector<HTMLElement>(\n '[data-sk-beat-state=\"active\"]',\n )\n if (!root) return\n const inputs = Array.from(\n root.querySelectorAll<HTMLElement>(\n 'input:not([data-sk-honeypot]), textarea, select',\n ),\n )\n const errored = inputs.find((el) => {\n const name = el.getAttribute('name')\n return name ? !!errors[name] : false\n })\n ;(errored || inputs[0])?.focus({ preventScroll: false })\n }, 90) // let the bloom start so focus scroll lands on settled layout\n return () => window.clearTimeout(timer)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [activeIndex, shakeCount])\n\n const handleFieldChange = useCallback(\n (field: FormFieldType, soloAutoAdvance: boolean) => (value: unknown) => {\n hasInteractedRef.current = true\n setFieldValue(field.slug, value)\n // A solo single-select beat locks in and advances after a moment — the\n // pick IS the confirmation. Grouped beats and text wait for Enter/OK.\n if (soloAutoAdvance && !isEmptyValue(value)) {\n clearAutoAdvance()\n autoAdvanceTimer.current = window.setTimeout(() => {\n autoAdvanceTimer.current = null\n advanceRef.current()\n }, 380)\n }\n },\n [setFieldValue, clearAutoAdvance],\n )\n\n /** Focusable travel order inside the active beat (excludes radio/checkbox\n — those advance via their own click/auto-advance path). */\n const travelInputs = useCallback((): HTMLElement[] => {\n const root = formRef.current?.querySelector<HTMLElement>(\n '[data-sk-beat-state=\"active\"]',\n )\n if (!root) return []\n return Array.from(\n root.querySelectorAll<HTMLElement>(\n 'input:not([data-sk-honeypot]):not([type=\"radio\"]):not([type=\"checkbox\"]), textarea, select',\n ),\n )\n }, [])\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLFormElement>) => {\n if (activeIndex === REST) return\n const target = e.target as HTMLElement\n const tag = target.tagName\n const isField = tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT'\n if (!isField) return\n\n // Enter does the next thing: next field in the beat, else next beat.\n // Shift+Enter keeps making newlines in long answers.\n if (e.key === 'Enter') {\n if (tag === 'TEXTAREA' && e.shiftKey) return\n e.preventDefault()\n const inputs = travelInputs()\n const index = inputs.indexOf(target)\n if (index >= 0 && index < inputs.length - 1) inputs[index + 1].focus()\n else advance()\n return\n }\n\n // Vertical arrows travel too — but never where they already mean\n // something (textarea caret, select option, number/range steppers).\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\n if (tag !== 'INPUT') return\n const type = (target as HTMLInputElement).type\n if (type === 'number' || type === 'range') return\n e.preventDefault()\n const inputs = travelInputs()\n const index = inputs.indexOf(target)\n if (e.key === 'ArrowDown') {\n if (index >= 0 && index < inputs.length - 1) inputs[index + 1].focus()\n else advance()\n } else {\n if (index > 0) inputs[index - 1].focus()\n else if (activeIndex > 0) activate(activeIndex - 1)\n }\n }\n },\n [activeIndex, advance, activate, travelInputs],\n )\n\n // Enter inside a beat routes through keydown; form submission here only\n // fires from the beat's OK button. The finale submit is type=\"button\".\n const handleSubmit = useCallback(\n (e: React.FormEvent) => {\n e.preventDefault()\n if (isSubmitting) return\n if (activeIndex !== REST) advance()\n else void submit()\n },\n [activeIndex, isSubmitting, advance, submit],\n )\n\n const handleFinaleSubmit = useCallback(() => {\n hasInteractedRef.current = true\n clearAutoAdvance()\n if (isSubmitting) return\n // validateAll inside submit() surfaces gaps; the errors effect then\n // travels to the first offending beat.\n void submit()\n }, [isSubmitting, submit, clearAutoAdvance])\n\n const ready = momentum.total > 0 ? momentum.done >= momentum.total : true\n const completeBeats = views.reduce((n, _v, i) => n + (beatComplete(i) ? 1 : 0), 0)\n\n const activeView = activeIndex === REST ? null : views[activeIndex]\n const activeIsGroup = !!activeView && activeView.fields.length > 1\n const activeAllOptionalEmpty =\n !!activeView &&\n activeView.fields.every((f) => !f.is_required && isEmptyValue(values[f.slug]))\n const activeHasTextarea =\n !!activeView && activeView.fields.some((f) => f.field_type === 'textarea')\n const eyebrow =\n activeIndex !== REST && firstName && activeIndex === nameViewIndex + 1\n ? { text: `Nice to meet you, ${firstName}.`, greet: true }\n : activeView?.step?.title\n ? { text: activeView.step.title, greet: false }\n : null\n\n return (\n <form\n ref={formRef}\n className={`sk-form sk-stage ${className || ''}`}\n data-sk-part=\"stage\"\n data-sk-state={isSubmitting ? 'submitting' : 'idle'}\n data-sk-ready={activeIndex === REST && ready && total > 0 ? 'true' : undefined}\n onSubmit={handleSubmit}\n onKeyDown={handleKeyDown}\n >\n <StageStyles />\n\n <header className=\"sk-stage__head\" data-sk-part=\"stage-head\">\n <span className=\"sk-stage__head-name\">{config.name}</span>\n <span className=\"sk-stage__head-meta\" data-sk-part=\"stage-estimate\">\n {`Takes ${stageEstimate(questionCount)}`}\n </span>\n </header>\n\n <div className=\"sk-stage__hud\" data-sk-part=\"stage-hud\">\n <div\n className=\"sk-stage__meter\"\n data-sk-part=\"stage-meter\"\n role=\"progressbar\"\n // A progressbar must have an accessible name; aria-valuetext alone\n // is not one (axe: aria-progressbar-name).\n aria-label=\"Form progress\"\n aria-valuemin={0}\n aria-valuemax={total}\n aria-valuenow={completeBeats}\n aria-valuetext={`${completeBeats} of ${total} answered`}\n >\n {views.map((v, i) => (\n <span\n key={v.fields[0].id}\n className=\"sk-stage__seg\"\n data-sk-lit={beatComplete(i) ? 'true' : undefined}\n data-sk-live={i === activeIndex ? 'true' : undefined}\n aria-hidden=\"true\"\n />\n ))}\n </div>\n <span\n className=\"sk-stage__counter\"\n data-sk-part=\"stage-counter\"\n data-sk-ready={activeIndex === REST && ready ? 'true' : undefined}\n aria-live=\"polite\"\n >\n {activeIndex === REST\n ? ready\n ? 'Ready'\n : `${completeBeats} / ${total}`\n : `${activeIndex + 1} / ${total}`}\n </span>\n </div>\n\n <div className=\"sk-stage__beats\" data-sk-part=\"stage-beats\">\n {views.map((view, i) => {\n const isActive = i === activeIndex\n const filled = visited[i] === true || beatHasValue(i)\n const answers = view.fields\n .map((f) => formatAnswer(values[f.slug]))\n .filter((a): a is string => a !== null)\n const summaryValue = answers.length\n ? answers.join(' · ')\n : filled\n ? 'Skipped'\n : null\n const summaryLabel =\n view.step?.title || view.fields.map((f) => f.label).join(' · ')\n const complete = beatComplete(i) && answers.length > 0\n\n return (\n <section\n key={view.fields[0].id}\n className=\"sk-stage__beat\"\n data-sk-part=\"stage-beat\"\n data-sk-beat-state={isActive ? 'active' : filled ? 'filled' : 'upcoming'}\n data-sk-beat-filled={filled ? 'true' : undefined}\n >\n {/* Settled / waiting row — collapses away while active. */}\n <div className=\"sk-stage__collapse sk-stage__collapse--summary\">\n <div inert={isActive ? true : undefined}>\n <div className=\"sk-stage__summary-inner\">\n <button\n type=\"button\"\n className=\"sk-stage__summary\"\n data-sk-part=\"stage-summary\"\n onClick={() => activate(i)}\n >\n <span className=\"sk-stage__summary-idx\" aria-hidden=\"true\">\n {String(i + 1).padStart(2, '0')}\n </span>\n <span className=\"sk-stage__summary-label\">{summaryLabel}</span>\n {summaryValue !== null && (\n <span\n className={\n 'sk-stage__summary-value' +\n (answers.length === 0\n ? ' sk-stage__summary-value--skipped'\n : '')\n }\n >\n {summaryValue}\n {complete && <SummaryTick />}\n </span>\n )}\n </button>\n </div>\n </div>\n </div>\n\n {/* The lit stage — blooms open while everything else settles. */}\n <div className=\"sk-stage__collapse sk-stage__collapse--body\">\n <div inert={isActive ? undefined : true}>\n <div\n key={isActive ? shakeCount : 0}\n className={\n 'sk-stage__body-inner' +\n (isActive && shakeCount > 0 ? ' sk-stage__shake' : '')\n }\n >\n {isActive && eyebrow && (\n <p\n className={\n 'sk-stage__eyebrow' +\n (eyebrow.greet ? ' sk-stage__eyebrow--greet' : '')\n }\n data-sk-part=\"stage-eyebrow\"\n >\n {eyebrow.text}\n </p>\n )}\n <div\n className={\n 'sk-stage__question' +\n (view.fields.length > 1 ? ' sk-stage__question--group' : '')\n }\n data-sk-part=\"stage-question\"\n >\n <div className=\"sk-stage__fields\">\n {view.fields.map((f) => (\n <FormField\n controls={fieldControls}\n key={f.id}\n // The question IS the label — a hide_label form\n // still asks it.\n field={{ ...f, hide_label: false }}\n value={values[f.slug]}\n error={errors[f.slug]}\n showValid={\n !!touched[f.slug] && !errors[f.slug] && fieldIsComplete(f)\n }\n onChange={handleFieldChange(\n f,\n view.fields.length === 1 &&\n AUTO_ADVANCE_TYPES.includes(f.field_type),\n )}\n classPrefix=\"sk-stage\"\n />\n ))}\n </div>\n <div className=\"sk-stage__actions\" data-sk-part=\"stage-actions\">\n <button\n type=\"submit\"\n className=\"sk-form__btn sk-form__btn--submit\"\n data-sk-part=\"stage-ok\"\n >\n {isActive && activeAllOptionalEmpty ? 'Skip' : 'OK'}\n </button>\n <span className=\"sk-stage__hint\" data-sk-part=\"stage-hint\">\n {isActive && activeHasTextarea ? (\n <>\n <kbd>Enter ↵</kbd> to continue · <kbd>Shift + Enter</kbd>{' '}\n for a new line\n </>\n ) : (\n <>\n press <kbd>Enter ↵</kbd>\n </>\n )}\n </span>\n </div>\n </div>\n </div>\n </div>\n </div>\n </section>\n )\n })}\n </div>\n\n {/* The finale — wakes ([data-sk-ready] pop + breathe) once every\n requirement clears and the run is at rest. */}\n <div className=\"sk-stage__finale\" data-sk-part=\"stage-finale\">\n <button\n type=\"button\"\n className=\"sk-form__btn sk-form__btn--submit\"\n data-sk-part=\"stage-submit\"\n disabled={isSubmitting}\n onClick={handleFinaleSubmit}\n >\n {isSubmitting ? 'Submitting...' : config.submit_button_text}\n </button>\n {activeIndex === REST && ready && (\n <span className=\"sk-stage__hint\">\n press <kbd>Enter ↵</kbd>\n </span>\n )}\n </div>\n\n {submitError && (\n <p\n className=\"sk-stage__submit-error\"\n role=\"alert\"\n style={{ color: 'var(--sk-error, #dc2626)' }}\n >\n {submitError}\n </p>\n )}\n\n {honeypot}\n </form>\n )\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/forms/FormStage.tsx"],"names":[],"mappings":"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","file":"FormStage-RUK675HV.mjs","sourcesContent":["'use client'\n\n/**\n * FormStage — the \"stage\" experience: a spotlight ACCORDION. Beats expand and\n * collapse on one surface (paired grid-rows morphs: the active beat blooms\n * while the previous settles into a filled summary row of label · answer ·\n * tick; upcoming beats wait as dim numbered rows). Enter advances: next field\n * in the beat, then the next beat, then the wake-lit submit. Because every\n * answer stays visible, the form is its own review — no confirm screen.\n *\n * A beat is a VIEW, not a field (see experience-plan.ts): consecutive\n * half/third-width fields share a beat exactly like they share a row in the\n * classic grid; full-width fields stand alone; steps break beats.\n *\n * This is a RENDER BRANCH of FormClient, never a customRender: FormClient\n * still owns values/errors/honeypot/submit, so spam defense and validation\n * are identical to classic. Beat index rides the existing step-tracking pipe,\n * turning form_analytics into a per-beat funnel with zero API changes.\n *\n * Loaded lazily by FormClient — classic-form sites never download it.\n */\n\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { useFieldControls } from './field-controls'\nimport { FormField } from './FormField'\nimport { StageStyles, SummaryTick } from './experience-chrome'\nimport {\n AUTO_ADVANCE_TYPES,\n formatAnswer,\n isEmptyValue,\n stageEstimate,\n stageFirstName,\n stageViews,\n} from './experience-plan'\nimport type { StageView } from './experience-plan'\nimport type { ExperienceRenderProps, FormField as FormFieldType } from './types'\n\n/** -1 = at rest (nothing active — every beat settled, submit has the floor). */\nconst REST = -1\n\nexport function FormStage({\n config,\n values,\n errors,\n touched,\n isSubmitting,\n submitError,\n momentum,\n className,\n setFieldValue,\n validateField,\n isFieldVisible,\n fieldIsComplete,\n applyFieldError,\n submit,\n trackStepChange,\n honeypot,\n}: ExperienceRenderProps) {\n // Same on-demand date/file controls the classic form uses.\n const fieldControls = useFieldControls(config.fields)\n const [activeIndex, setActiveIndex] = useState(0)\n // Beats deliberately passed through (including skipped-empty optionals) —\n // drives \"Skipped\" vs \"not there yet\" in the settled rows.\n const [visited, setVisited] = useState<Record<number, boolean>>({})\n // Incremented on each rejected advance so the shake animation replays.\n const [shakeCount, setShakeCount] = useState(0)\n\n const formRef = useRef<HTMLFormElement | null>(null)\n const autoAdvanceTimer = useRef<number | null>(null)\n // Focus is only ever moved after the user has interacted — never on load.\n const hasInteractedRef = useRef(false)\n\n // The run respects conditional visibility live — answering an earlier\n // beat can add or remove later ones.\n const views = useMemo(() => {\n return stageViews(config)\n .map((v) => ({ ...v, fields: v.fields.filter(isFieldVisible) }))\n .filter((v) => v.fields.length > 0)\n }, [config, isFieldVisible])\n const total = views.length\n const questionCount = useMemo(\n () => views.reduce((n, v) => n + v.fields.length, 0),\n [views],\n )\n\n // Clamp if a conditional hid beats behind the cursor.\n useEffect(() => {\n if (activeIndex > 0 && activeIndex >= total) setActiveIndex(total - 1)\n }, [activeIndex, total])\n\n // Greeting: the beat right after the first-name answer says hello.\n const nameViewIndex = useMemo(\n () => views.findIndex((v) => v.fields.some((f) => /^first[_-]?name$/i.test(f.slug))),\n [views],\n )\n const nameField =\n nameViewIndex >= 0\n ? views[nameViewIndex].fields.find((f) => /^first[_-]?name$/i.test(f.slug))\n : undefined\n const firstName = nameField ? stageFirstName(values[nameField.slug]) : null\n\n const clearAutoAdvance = useCallback(() => {\n if (autoAdvanceTimer.current !== null) {\n window.clearTimeout(autoAdvanceTimer.current)\n autoAdvanceTimer.current = null\n }\n }, [])\n useEffect(() => clearAutoAdvance, [clearAutoAdvance])\n\n const beatHasValue = useCallback(\n (index: number) =>\n (views[index]?.fields || []).some((f) => !isEmptyValue(values[f.slug])),\n [views, values],\n )\n const beatComplete = useCallback(\n (index: number) => {\n const v = views[index]\n if (!v) return false\n return v.fields.every(\n (f) => fieldIsComplete(f) || (!f.is_required && isEmptyValue(values[f.slug])),\n ) && (beatHasValue(index) || visited[index] === true)\n },\n [views, fieldIsComplete, values, beatHasValue, visited],\n )\n\n const activate = useCallback(\n (index: number) => {\n hasInteractedRef.current = true\n clearAutoAdvance()\n setShakeCount(0)\n setActiveIndex(index)\n if (index !== REST) trackStepChange(index + 1)\n },\n [clearAutoAdvance, trackStepChange],\n )\n\n const advance = useCallback(() => {\n hasInteractedRef.current = true\n clearAutoAdvance()\n const view = views[activeIndex]\n if (!view) return\n let failed = false\n for (const field of view.fields) {\n const error = validateField(field)\n if (error) {\n applyFieldError(field.slug, error)\n failed = true\n }\n }\n if (failed) {\n setShakeCount((n) => n + 1)\n return\n }\n setShakeCount(0)\n setVisited((prev) => ({ ...prev, [activeIndex]: true }))\n if (activeIndex >= views.length - 1) {\n // Every beat settled — the submit takes the floor (wake glow via\n // [data-sk-ready] once momentum completes).\n setActiveIndex(REST)\n } else {\n setActiveIndex(activeIndex + 1)\n trackStepChange(activeIndex + 2)\n }\n }, [views, activeIndex, validateField, applyFieldError, trackStepChange, clearAutoAdvance])\n\n // advance() closes over stale state inside the auto-advance timeout — the\n // ref always points at the freshest render's advance.\n const advanceRef = useRef(advance)\n advanceRef.current = advance\n\n // Validation errors raised by submit()'s validateAll while at rest: travel\n // to the first offending beat, shaking. (Errors raised by advance() are\n // always in the active beat, so this never fights the user's typing.)\n useEffect(() => {\n const index = views.findIndex((v) => v.fields.some((f) => errors[f.slug]))\n if (index >= 0 && index !== activeIndex) {\n setActiveIndex(index)\n setShakeCount((n) => n + 1)\n trackStepChange(index + 1)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [errors])\n\n // Land focus inside the newly active beat — first errored field after a\n // shake, else the first field. At rest, focus the finale submit so Enter\n // finishes the arc. Only after real interaction, never on load.\n useEffect(() => {\n if (!hasInteractedRef.current) return\n const timer = window.setTimeout(() => {\n if (activeIndex === REST) {\n formRef.current\n ?.querySelector<HTMLElement>('[data-sk-part=\"stage-submit\"]')\n ?.focus()\n return\n }\n const root = formRef.current?.querySelector<HTMLElement>(\n '[data-sk-beat-state=\"active\"]',\n )\n if (!root) return\n const inputs = Array.from(\n root.querySelectorAll<HTMLElement>(\n 'input:not([data-sk-honeypot]), textarea, select',\n ),\n )\n const errored = inputs.find((el) => {\n const name = el.getAttribute('name')\n return name ? !!errors[name] : false\n })\n ;(errored || inputs[0])?.focus({ preventScroll: false })\n }, 90) // let the bloom start so focus scroll lands on settled layout\n return () => window.clearTimeout(timer)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [activeIndex, shakeCount])\n\n const handleFieldChange = useCallback(\n (field: FormFieldType, soloAutoAdvance: boolean) => (value: unknown) => {\n hasInteractedRef.current = true\n setFieldValue(field.slug, value)\n // A solo single-select beat locks in and advances after a moment — the\n // pick IS the confirmation. Grouped beats and text wait for Enter/OK.\n if (soloAutoAdvance && !isEmptyValue(value)) {\n clearAutoAdvance()\n autoAdvanceTimer.current = window.setTimeout(() => {\n autoAdvanceTimer.current = null\n advanceRef.current()\n }, 380)\n }\n },\n [setFieldValue, clearAutoAdvance],\n )\n\n /** Focusable travel order inside the active beat (excludes radio/checkbox\n — those advance via their own click/auto-advance path). */\n const travelInputs = useCallback((): HTMLElement[] => {\n const root = formRef.current?.querySelector<HTMLElement>(\n '[data-sk-beat-state=\"active\"]',\n )\n if (!root) return []\n return Array.from(\n root.querySelectorAll<HTMLElement>(\n 'input:not([data-sk-honeypot]):not([type=\"radio\"]):not([type=\"checkbox\"]), textarea, select',\n ),\n )\n }, [])\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLFormElement>) => {\n if (activeIndex === REST) return\n const target = e.target as HTMLElement\n const tag = target.tagName\n const isField = tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT'\n if (!isField) return\n\n // Enter does the next thing: next field in the beat, else next beat.\n // Shift+Enter keeps making newlines in long answers.\n if (e.key === 'Enter') {\n if (tag === 'TEXTAREA' && e.shiftKey) return\n e.preventDefault()\n const inputs = travelInputs()\n const index = inputs.indexOf(target)\n if (index >= 0 && index < inputs.length - 1) inputs[index + 1].focus()\n else advance()\n return\n }\n\n // Vertical arrows travel too — but never where they already mean\n // something (textarea caret, select option, number/range steppers).\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\n if (tag !== 'INPUT') return\n const type = (target as HTMLInputElement).type\n if (type === 'number' || type === 'range') return\n e.preventDefault()\n const inputs = travelInputs()\n const index = inputs.indexOf(target)\n if (e.key === 'ArrowDown') {\n if (index >= 0 && index < inputs.length - 1) inputs[index + 1].focus()\n else advance()\n } else {\n if (index > 0) inputs[index - 1].focus()\n else if (activeIndex > 0) activate(activeIndex - 1)\n }\n }\n },\n [activeIndex, advance, activate, travelInputs],\n )\n\n // Enter inside a beat routes through keydown; form submission here only\n // fires from the beat's OK button. The finale submit is type=\"button\".\n const handleSubmit = useCallback(\n (e: React.FormEvent) => {\n e.preventDefault()\n if (isSubmitting) return\n if (activeIndex !== REST) advance()\n else void submit()\n },\n [activeIndex, isSubmitting, advance, submit],\n )\n\n const handleFinaleSubmit = useCallback(() => {\n hasInteractedRef.current = true\n clearAutoAdvance()\n if (isSubmitting) return\n // validateAll inside submit() surfaces gaps; the errors effect then\n // travels to the first offending beat.\n void submit()\n }, [isSubmitting, submit, clearAutoAdvance])\n\n const ready = momentum.total > 0 ? momentum.done >= momentum.total : true\n const completeBeats = views.reduce((n, _v, i) => n + (beatComplete(i) ? 1 : 0), 0)\n\n const activeView = activeIndex === REST ? null : views[activeIndex]\n const activeIsGroup = !!activeView && activeView.fields.length > 1\n const activeAllOptionalEmpty =\n !!activeView &&\n activeView.fields.every((f) => !f.is_required && isEmptyValue(values[f.slug]))\n const activeHasTextarea =\n !!activeView && activeView.fields.some((f) => f.field_type === 'textarea')\n const eyebrow =\n activeIndex !== REST && firstName && activeIndex === nameViewIndex + 1\n ? { text: `Nice to meet you, ${firstName}.`, greet: true }\n : activeView?.step?.title\n ? { text: activeView.step.title, greet: false }\n : null\n\n return (\n <form\n ref={formRef}\n className={`sk-form sk-stage ${className || ''}`}\n data-sk-part=\"stage\"\n data-sk-state={isSubmitting ? 'submitting' : 'idle'}\n data-sk-ready={activeIndex === REST && ready && total > 0 ? 'true' : undefined}\n onSubmit={handleSubmit}\n onKeyDown={handleKeyDown}\n >\n <StageStyles />\n\n <header className=\"sk-stage__head\" data-sk-part=\"stage-head\">\n <span className=\"sk-stage__head-name\">{config.name}</span>\n <span className=\"sk-stage__head-meta\" data-sk-part=\"stage-estimate\">\n {`Takes ${stageEstimate(questionCount)}`}\n </span>\n </header>\n\n <div className=\"sk-stage__hud\" data-sk-part=\"stage-hud\">\n <div\n className=\"sk-stage__meter\"\n data-sk-part=\"stage-meter\"\n role=\"progressbar\"\n // A progressbar must have an accessible name; aria-valuetext alone\n // is not one (axe: aria-progressbar-name).\n aria-label=\"Form progress\"\n aria-valuemin={0}\n aria-valuemax={total}\n aria-valuenow={completeBeats}\n aria-valuetext={`${completeBeats} of ${total} answered`}\n >\n {views.map((v, i) => (\n <span\n key={v.fields[0].id}\n className=\"sk-stage__seg\"\n data-sk-lit={beatComplete(i) ? 'true' : undefined}\n data-sk-live={i === activeIndex ? 'true' : undefined}\n aria-hidden=\"true\"\n />\n ))}\n </div>\n <span\n className=\"sk-stage__counter\"\n data-sk-part=\"stage-counter\"\n data-sk-ready={activeIndex === REST && ready ? 'true' : undefined}\n aria-live=\"polite\"\n >\n {activeIndex === REST\n ? ready\n ? 'Ready'\n : `${completeBeats} / ${total}`\n : `${activeIndex + 1} / ${total}`}\n </span>\n </div>\n\n <div className=\"sk-stage__beats\" data-sk-part=\"stage-beats\">\n {views.map((view, i) => {\n const isActive = i === activeIndex\n const filled = visited[i] === true || beatHasValue(i)\n const answers = view.fields\n .map((f) => formatAnswer(values[f.slug]))\n .filter((a): a is string => a !== null)\n const summaryValue = answers.length\n ? answers.join(' · ')\n : filled\n ? 'Skipped'\n : null\n const summaryLabel =\n view.step?.title || view.fields.map((f) => f.label).join(' · ')\n const complete = beatComplete(i) && answers.length > 0\n\n return (\n <section\n key={view.fields[0].id}\n className=\"sk-stage__beat\"\n data-sk-part=\"stage-beat\"\n data-sk-beat-state={isActive ? 'active' : filled ? 'filled' : 'upcoming'}\n data-sk-beat-filled={filled ? 'true' : undefined}\n >\n {/* Settled / waiting row — collapses away while active. */}\n <div className=\"sk-stage__collapse sk-stage__collapse--summary\">\n <div inert={isActive ? true : undefined}>\n <div className=\"sk-stage__summary-inner\">\n <button\n type=\"button\"\n className=\"sk-stage__summary\"\n data-sk-part=\"stage-summary\"\n onClick={() => activate(i)}\n >\n <span className=\"sk-stage__summary-idx\" aria-hidden=\"true\">\n {String(i + 1).padStart(2, '0')}\n </span>\n <span className=\"sk-stage__summary-label\">{summaryLabel}</span>\n {summaryValue !== null && (\n <span\n className={\n 'sk-stage__summary-value' +\n (answers.length === 0\n ? ' sk-stage__summary-value--skipped'\n : '')\n }\n >\n {summaryValue}\n {complete && <SummaryTick />}\n </span>\n )}\n </button>\n </div>\n </div>\n </div>\n\n {/* The lit stage — blooms open while everything else settles. */}\n <div className=\"sk-stage__collapse sk-stage__collapse--body\">\n <div inert={isActive ? undefined : true}>\n <div\n key={isActive ? shakeCount : 0}\n className={\n 'sk-stage__body-inner' +\n (isActive && shakeCount > 0 ? ' sk-stage__shake' : '')\n }\n >\n {isActive && eyebrow && (\n <p\n className={\n 'sk-stage__eyebrow' +\n (eyebrow.greet ? ' sk-stage__eyebrow--greet' : '')\n }\n data-sk-part=\"stage-eyebrow\"\n >\n {eyebrow.text}\n </p>\n )}\n <div\n className={\n 'sk-stage__question' +\n (view.fields.length > 1 ? ' sk-stage__question--group' : '')\n }\n data-sk-part=\"stage-question\"\n >\n <div className=\"sk-stage__fields\">\n {view.fields.map((f) => (\n <FormField\n controls={fieldControls}\n key={f.id}\n // The question IS the label — a hide_label form\n // still asks it.\n field={{ ...f, hide_label: false }}\n value={values[f.slug]}\n error={errors[f.slug]}\n showValid={\n !!touched[f.slug] && !errors[f.slug] && fieldIsComplete(f)\n }\n onChange={handleFieldChange(\n f,\n view.fields.length === 1 &&\n AUTO_ADVANCE_TYPES.includes(f.field_type),\n )}\n classPrefix=\"sk-stage\"\n />\n ))}\n </div>\n <div className=\"sk-stage__actions\" data-sk-part=\"stage-actions\">\n <button\n type=\"submit\"\n className=\"sk-form__btn sk-form__btn--submit\"\n data-sk-part=\"stage-ok\"\n >\n {isActive && activeAllOptionalEmpty ? 'Skip' : 'OK'}\n </button>\n <span className=\"sk-stage__hint\" data-sk-part=\"stage-hint\">\n {isActive && activeHasTextarea ? (\n <>\n <kbd>Enter ↵</kbd> to continue · <kbd>Shift + Enter</kbd>{' '}\n for a new line\n </>\n ) : (\n <>\n press <kbd>Enter ↵</kbd>\n </>\n )}\n </span>\n </div>\n </div>\n </div>\n </div>\n </div>\n </section>\n )\n })}\n </div>\n\n {/* The finale — wakes ([data-sk-ready] pop + breathe) once every\n requirement clears and the run is at rest. */}\n <div className=\"sk-stage__finale\" data-sk-part=\"stage-finale\">\n <button\n type=\"button\"\n className=\"sk-form__btn sk-form__btn--submit\"\n data-sk-part=\"stage-submit\"\n disabled={isSubmitting}\n onClick={handleFinaleSubmit}\n >\n {isSubmitting ? 'Submitting...' : config.submit_button_text}\n </button>\n {activeIndex === REST && ready && (\n <span className=\"sk-stage__hint\">\n press <kbd>Enter ↵</kbd>\n </span>\n )}\n </div>\n\n {submitError && (\n <p\n className=\"sk-stage__submit-error\"\n role=\"alert\"\n style={{ color: 'var(--sk-error, #dc2626)' }}\n >\n {submitError}\n </p>\n )}\n\n {honeypot}\n </form>\n )\n}\n"]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunk2CMSWJWC_js = require('./chunk-2CMSWJWC.js');
|
|
4
|
+
require('./chunk-Q26VZNM2.js');
|
|
5
|
+
require('./chunk-W5NVW23S.js');
|
|
6
|
+
require('./chunk-IPV2TUAT.js');
|
|
7
|
+
require('./chunk-YNC5D3FT.js');
|
|
8
|
+
require('./chunk-BNOQXDPJ.js');
|
|
9
|
+
require('./chunk-KHPJ3CEL.js');
|
|
10
|
+
require('./chunk-VJMPIRSD.js');
|
|
11
|
+
require('./chunk-QEGUI2Q2.js');
|
|
12
|
+
require('./chunk-HFJQMIFM.js');
|
|
13
|
+
require('./chunk-SUZ3ZLB2.js');
|
|
14
|
+
require('./chunk-SNAQBZPT.js');
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
Object.defineProperty(exports, "ManagedForm", {
|
|
19
|
+
enumerable: true,
|
|
20
|
+
get: function () { return chunk2CMSWJWC_js.ManagedForm; }
|
|
21
|
+
});
|
|
22
|
+
//# sourceMappingURL=ManagedForm-JWEXJEXK.js.map
|
|
23
|
+
//# sourceMappingURL=ManagedForm-JWEXJEXK.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"ManagedForm-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"ManagedForm-JWEXJEXK.js"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export { ManagedForm } from './chunk-R4MX6EOM.mjs';
|
|
2
|
+
import './chunk-V6NOM7PJ.mjs';
|
|
3
|
+
import './chunk-X2XFLYZ3.mjs';
|
|
4
|
+
import './chunk-H7274TKR.mjs';
|
|
5
|
+
import './chunk-DRLHQQBH.mjs';
|
|
6
|
+
import './chunk-TX2QQ7IX.mjs';
|
|
7
|
+
import './chunk-TMVKRQGJ.mjs';
|
|
8
|
+
import './chunk-6EDVCUAG.mjs';
|
|
9
|
+
import './chunk-OFSA7LUH.mjs';
|
|
10
|
+
import './chunk-4XGACM7D.mjs';
|
|
11
|
+
import './chunk-WDBCXRTT.mjs';
|
|
12
|
+
import './chunk-BEXTDHO4.mjs';
|
|
13
|
+
//# sourceMappingURL=ManagedForm-OA3MNGXT.mjs.map
|
|
14
|
+
//# sourceMappingURL=ManagedForm-OA3MNGXT.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"ManagedForm-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"ManagedForm-OA3MNGXT.mjs"}
|
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
var chunkDO6ATNLN_js = require('./chunk-DO6ATNLN.js');
|
|
4
4
|
require('./chunk-HX6ZG3PP.js');
|
|
5
|
-
var
|
|
6
|
-
require('./chunk-
|
|
5
|
+
var chunkYNC5D3FT_js = require('./chunk-YNC5D3FT.js');
|
|
6
|
+
require('./chunk-BNOQXDPJ.js');
|
|
7
7
|
require('./chunk-KHPJ3CEL.js');
|
|
8
8
|
require('./chunk-VJMPIRSD.js');
|
|
9
|
-
require('./chunk-
|
|
10
|
-
require('./chunk-
|
|
11
|
-
require('./chunk-
|
|
9
|
+
require('./chunk-QEGUI2Q2.js');
|
|
10
|
+
require('./chunk-HFJQMIFM.js');
|
|
11
|
+
require('./chunk-SUZ3ZLB2.js');
|
|
12
12
|
require('./chunk-SNAQBZPT.js');
|
|
13
13
|
var jsxRuntime = require('react/jsx-runtime');
|
|
14
14
|
|
|
@@ -29,7 +29,7 @@ function ManagedNewsletterForm({
|
|
|
29
29
|
isSubmitting,
|
|
30
30
|
isComplete,
|
|
31
31
|
submitError
|
|
32
|
-
} =
|
|
32
|
+
} = chunkYNC5D3FT_js.useForm(formSlug, { trackAnalytics: true });
|
|
33
33
|
if (fetchError) {
|
|
34
34
|
console.warn(`[Blog] NewsletterWidget: form "${formSlug}" could not be loaded`, fetchError);
|
|
35
35
|
return null;
|
|
@@ -60,5 +60,5 @@ function ManagedNewsletterForm({
|
|
|
60
60
|
}
|
|
61
61
|
|
|
62
62
|
module.exports = ManagedNewsletterForm;
|
|
63
|
-
//# sourceMappingURL=ManagedNewsletterForm-
|
|
64
|
-
//# sourceMappingURL=ManagedNewsletterForm-
|
|
63
|
+
//# sourceMappingURL=ManagedNewsletterForm-AAHH63KT.js.map
|
|
64
|
+
//# sourceMappingURL=ManagedNewsletterForm-AAHH63KT.js.map
|
package/dist/{ManagedNewsletterForm-PIVJTU5L.js.map → ManagedNewsletterForm-AAHH63KT.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/blog/ManagedNewsletterForm.tsx"],"names":["useForm","jsx","NewsletterShell"],"mappings":";;;;;;;;;;;;;;AAgBe,SAAR,qBAAA,CAAuC;AAAA,EAC5C,QAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,EACyF;AACvF,EAAA,MAAM;AAAA,IACJ,IAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA;AAAA,IACA,MAAA;AAAA,IACA,aAAA;AAAA,IACA,MAAA;AAAA,IACA,YAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,MACEA,wBAAA,CAAQ,QAAA,EAAU,EAAE,cAAA,EAAgB,MAAM,CAAA;AAE9C,EAAA,IAAI,UAAA,EAAY;AAEd,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,+BAAA,EAAkC,QAAQ,CAAA,qBAAA,CAAA,EAAyB,UAAU,CAAA;AAC1F,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,EAAA,MAAM,aACJ,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,eAAe,OAAO,CAAA,IAC9C,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,OAAO,CAAA,IACxC,UAAU,CAAC,CAAA;AACb,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,+BAAA,EAAkC,QAAQ,CAAA,eAAA,CAAiB,CAAA;AACxE,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,uBACEC,cAAA;AAAA,IAACC,gCAAA;AAAA,IAAA;AAAA,MACC,KAAA;AAAA,MACA,WAAA;AAAA,MACA,UAAA;AAAA,MACA,OAAO,MAAA,CAAO,MAAA,CAAO,UAAA,CAAW,IAAI,KAAK,EAAE,CAAA;AAAA,MAC3C,eAAe,CAAC,KAAA,KAAU,aAAA,CAAc,UAAA,CAAW,MAAM,KAAK,CAAA;AAAA,MAC9D,YAAA,EAAc,CAAC,CAAA,KAAM;AACnB,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,KAAK,MAAA,EAAO;AAAA,MACd,CAAA;AAAA,MACA,QAAQ,UAAA,GAAa,SAAA,GAAY,YAAA,GAAe,YAAA,GAAe,cAAc,OAAA,GAAU,MAAA;AAAA,MACvF,cAAA;AAAA,MACA,YAAA,EAAc;AAAA;AAAA,GAChB;AAEJ","file":"ManagedNewsletterForm-
|
|
1
|
+
{"version":3,"sources":["../src/blog/ManagedNewsletterForm.tsx"],"names":["useForm","jsx","NewsletterShell"],"mappings":";;;;;;;;;;;;;;AAgBe,SAAR,qBAAA,CAAuC;AAAA,EAC5C,QAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,EACyF;AACvF,EAAA,MAAM;AAAA,IACJ,IAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA;AAAA,IACA,MAAA;AAAA,IACA,aAAA;AAAA,IACA,MAAA;AAAA,IACA,YAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,MACEA,wBAAA,CAAQ,QAAA,EAAU,EAAE,cAAA,EAAgB,MAAM,CAAA;AAE9C,EAAA,IAAI,UAAA,EAAY;AAEd,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,+BAAA,EAAkC,QAAQ,CAAA,qBAAA,CAAA,EAAyB,UAAU,CAAA;AAC1F,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,EAAA,MAAM,aACJ,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,eAAe,OAAO,CAAA,IAC9C,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,OAAO,CAAA,IACxC,UAAU,CAAC,CAAA;AACb,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,+BAAA,EAAkC,QAAQ,CAAA,eAAA,CAAiB,CAAA;AACxE,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,uBACEC,cAAA;AAAA,IAACC,gCAAA;AAAA,IAAA;AAAA,MACC,KAAA;AAAA,MACA,WAAA;AAAA,MACA,UAAA;AAAA,MACA,OAAO,MAAA,CAAO,MAAA,CAAO,UAAA,CAAW,IAAI,KAAK,EAAE,CAAA;AAAA,MAC3C,eAAe,CAAC,KAAA,KAAU,aAAA,CAAc,UAAA,CAAW,MAAM,KAAK,CAAA;AAAA,MAC9D,YAAA,EAAc,CAAC,CAAA,KAAM;AACnB,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,KAAK,MAAA,EAAO;AAAA,MACd,CAAA;AAAA,MACA,QAAQ,UAAA,GAAa,SAAA,GAAY,YAAA,GAAe,YAAA,GAAe,cAAc,OAAA,GAAU,MAAA;AAAA,MACvF,cAAA;AAAA,MACA,YAAA,EAAc;AAAA;AAAA,GAChB;AAEJ","file":"ManagedNewsletterForm-AAHH63KT.js","sourcesContent":["'use client'\n\n/**\n * Managed-forms mode of NewsletterWidget — its own module, loaded via\n * React.lazy, so the useForm graph (forms engine, sonorFetch, site token)\n * stays out of the blog entry's eager bundle. Blog consumers only pay for\n * it when a formSlug newsletter actually mounts (enforced by the\n * integration harness's bundle budget, which measures the eager\n * static-import graph).\n */\n\nimport React from 'react'\nimport { useForm } from '../forms/useForm'\nimport { NewsletterShell, type NewsletterShellProps } from './NewsletterShell'\nimport type { NewsletterWidgetProps } from './NewsletterWidget'\n\nexport default function ManagedNewsletterForm({\n formSlug,\n title,\n description,\n buttonText,\n successMessage,\n}: Required<Pick<NewsletterWidgetProps, 'formSlug'>> &\n Pick<NewsletterShellProps, 'title' | 'description' | 'buttonText' | 'successMessage'>) {\n const {\n form,\n fetchError,\n allFields,\n values,\n setFieldValue,\n submit,\n isSubmitting,\n isComplete,\n submitError,\n } = useForm(formSlug, { trackAnalytics: true })\n\n if (fetchError) {\n // A typo'd slug must not resurrect the silent dead-form behavior.\n console.warn(`[Blog] NewsletterWidget: form \"${formSlug}\" could not be loaded`, fetchError)\n return null\n }\n if (!form) return null // still loading\n\n const emailField =\n allFields.find((f) => f.field_type === 'email') ??\n allFields.find((f) => f.slug === 'email') ??\n allFields[0]\n if (!emailField) {\n console.warn(`[Blog] NewsletterWidget: form \"${formSlug}\" has no fields`)\n return null\n }\n\n return (\n <NewsletterShell\n title={title}\n description={description}\n buttonText={buttonText}\n email={String(values[emailField.slug] ?? '')}\n onEmailChange={(value) => setFieldValue(emailField.slug, value)}\n onFormSubmit={(e) => {\n e.preventDefault()\n void submit()\n }}\n status={isComplete ? 'success' : isSubmitting ? 'submitting' : submitError ? 'error' : 'idle'}\n successMessage={successMessage}\n errorMessage={submitError}\n />\n )\n}\n"]}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { NewsletterShell } from './chunk-AK6JZ3OE.mjs';
|
|
2
2
|
import './chunk-YFX3Q56O.mjs';
|
|
3
|
-
import { useForm } from './chunk-
|
|
4
|
-
import './chunk-
|
|
3
|
+
import { useForm } from './chunk-DRLHQQBH.mjs';
|
|
4
|
+
import './chunk-TX2QQ7IX.mjs';
|
|
5
5
|
import './chunk-TMVKRQGJ.mjs';
|
|
6
6
|
import './chunk-6EDVCUAG.mjs';
|
|
7
|
-
import './chunk-
|
|
8
|
-
import './chunk-
|
|
9
|
-
import './chunk-
|
|
7
|
+
import './chunk-OFSA7LUH.mjs';
|
|
8
|
+
import './chunk-4XGACM7D.mjs';
|
|
9
|
+
import './chunk-WDBCXRTT.mjs';
|
|
10
10
|
import './chunk-BEXTDHO4.mjs';
|
|
11
11
|
import { jsx } from 'react/jsx-runtime';
|
|
12
12
|
|
|
@@ -58,5 +58,5 @@ function ManagedNewsletterForm({
|
|
|
58
58
|
}
|
|
59
59
|
|
|
60
60
|
export { ManagedNewsletterForm as default };
|
|
61
|
-
//# sourceMappingURL=ManagedNewsletterForm-
|
|
62
|
-
//# sourceMappingURL=ManagedNewsletterForm-
|
|
61
|
+
//# sourceMappingURL=ManagedNewsletterForm-HZKTNWLW.mjs.map
|
|
62
|
+
//# sourceMappingURL=ManagedNewsletterForm-HZKTNWLW.mjs.map
|
package/dist/{ManagedNewsletterForm-4AVKTZ2A.mjs.map → ManagedNewsletterForm-HZKTNWLW.mjs.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/blog/ManagedNewsletterForm.tsx"],"names":[],"mappings":";;;;;;;;;;;;AAgBe,SAAR,qBAAA,CAAuC;AAAA,EAC5C,QAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,EACyF;AACvF,EAAA,MAAM;AAAA,IACJ,IAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA;AAAA,IACA,MAAA;AAAA,IACA,aAAA;AAAA,IACA,MAAA;AAAA,IACA,YAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,MACE,OAAA,CAAQ,QAAA,EAAU,EAAE,cAAA,EAAgB,MAAM,CAAA;AAE9C,EAAA,IAAI,UAAA,EAAY;AAEd,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,+BAAA,EAAkC,QAAQ,CAAA,qBAAA,CAAA,EAAyB,UAAU,CAAA;AAC1F,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,EAAA,MAAM,aACJ,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,eAAe,OAAO,CAAA,IAC9C,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,OAAO,CAAA,IACxC,UAAU,CAAC,CAAA;AACb,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,+BAAA,EAAkC,QAAQ,CAAA,eAAA,CAAiB,CAAA;AACxE,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,uBACE,GAAA;AAAA,IAAC,eAAA;AAAA,IAAA;AAAA,MACC,KAAA;AAAA,MACA,WAAA;AAAA,MACA,UAAA;AAAA,MACA,OAAO,MAAA,CAAO,MAAA,CAAO,UAAA,CAAW,IAAI,KAAK,EAAE,CAAA;AAAA,MAC3C,eAAe,CAAC,KAAA,KAAU,aAAA,CAAc,UAAA,CAAW,MAAM,KAAK,CAAA;AAAA,MAC9D,YAAA,EAAc,CAAC,CAAA,KAAM;AACnB,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,KAAK,MAAA,EAAO;AAAA,MACd,CAAA;AAAA,MACA,QAAQ,UAAA,GAAa,SAAA,GAAY,YAAA,GAAe,YAAA,GAAe,cAAc,OAAA,GAAU,MAAA;AAAA,MACvF,cAAA;AAAA,MACA,YAAA,EAAc;AAAA;AAAA,GAChB;AAEJ","file":"ManagedNewsletterForm-
|
|
1
|
+
{"version":3,"sources":["../src/blog/ManagedNewsletterForm.tsx"],"names":[],"mappings":";;;;;;;;;;;;AAgBe,SAAR,qBAAA,CAAuC;AAAA,EAC5C,QAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,EACyF;AACvF,EAAA,MAAM;AAAA,IACJ,IAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA;AAAA,IACA,MAAA;AAAA,IACA,aAAA;AAAA,IACA,MAAA;AAAA,IACA,YAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,MACE,OAAA,CAAQ,QAAA,EAAU,EAAE,cAAA,EAAgB,MAAM,CAAA;AAE9C,EAAA,IAAI,UAAA,EAAY;AAEd,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,+BAAA,EAAkC,QAAQ,CAAA,qBAAA,CAAA,EAAyB,UAAU,CAAA;AAC1F,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,EAAA,MAAM,aACJ,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,eAAe,OAAO,CAAA,IAC9C,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,OAAO,CAAA,IACxC,UAAU,CAAC,CAAA;AACb,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,+BAAA,EAAkC,QAAQ,CAAA,eAAA,CAAiB,CAAA;AACxE,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,uBACE,GAAA;AAAA,IAAC,eAAA;AAAA,IAAA;AAAA,MACC,KAAA;AAAA,MACA,WAAA;AAAA,MACA,UAAA;AAAA,MACA,OAAO,MAAA,CAAO,MAAA,CAAO,UAAA,CAAW,IAAI,KAAK,EAAE,CAAA;AAAA,MAC3C,eAAe,CAAC,KAAA,KAAU,aAAA,CAAc,UAAA,CAAW,MAAM,KAAK,CAAA;AAAA,MAC9D,YAAA,EAAc,CAAC,CAAA,KAAM;AACnB,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,KAAK,MAAA,EAAO;AAAA,MACd,CAAA;AAAA,MACA,QAAQ,UAAA,GAAa,SAAA,GAAY,YAAA,GAAe,YAAA,GAAe,cAAc,OAAA,GAAU,MAAA;AAAA,MACvF,cAAA;AAAA,MACA,YAAA,EAAc;AAAA;AAAA,GAChB;AAEJ","file":"ManagedNewsletterForm-HZKTNWLW.mjs","sourcesContent":["'use client'\n\n/**\n * Managed-forms mode of NewsletterWidget — its own module, loaded via\n * React.lazy, so the useForm graph (forms engine, sonorFetch, site token)\n * stays out of the blog entry's eager bundle. Blog consumers only pay for\n * it when a formSlug newsletter actually mounts (enforced by the\n * integration harness's bundle budget, which measures the eager\n * static-import graph).\n */\n\nimport React from 'react'\nimport { useForm } from '../forms/useForm'\nimport { NewsletterShell, type NewsletterShellProps } from './NewsletterShell'\nimport type { NewsletterWidgetProps } from './NewsletterWidget'\n\nexport default function ManagedNewsletterForm({\n formSlug,\n title,\n description,\n buttonText,\n successMessage,\n}: Required<Pick<NewsletterWidgetProps, 'formSlug'>> &\n Pick<NewsletterShellProps, 'title' | 'description' | 'buttonText' | 'successMessage'>) {\n const {\n form,\n fetchError,\n allFields,\n values,\n setFieldValue,\n submit,\n isSubmitting,\n isComplete,\n submitError,\n } = useForm(formSlug, { trackAnalytics: true })\n\n if (fetchError) {\n // A typo'd slug must not resurrect the silent dead-form behavior.\n console.warn(`[Blog] NewsletterWidget: form \"${formSlug}\" could not be loaded`, fetchError)\n return null\n }\n if (!form) return null // still loading\n\n const emailField =\n allFields.find((f) => f.field_type === 'email') ??\n allFields.find((f) => f.slug === 'email') ??\n allFields[0]\n if (!emailField) {\n console.warn(`[Blog] NewsletterWidget: form \"${formSlug}\" has no fields`)\n return null\n }\n\n return (\n <NewsletterShell\n title={title}\n description={description}\n buttonText={buttonText}\n email={String(values[emailField.slug] ?? '')}\n onEmailChange={(value) => setFieldValue(emailField.slug, value)}\n onFormSubmit={(e) => {\n e.preventDefault()\n void submit()\n }}\n status={isComplete ? 'success' : isSubmitting ? 'submitting' : submitError ? 'error' : 'idle'}\n successMessage={successMessage}\n errorMessage={submitError}\n />\n )\n}\n"]}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { getOrCreateVisitorId, getOrCreateSessionId } from './chunk-ZZQAGCSI.mjs';
|
|
3
3
|
import './chunk-6EDVCUAG.mjs';
|
|
4
|
-
import { sonorFetch } from './chunk-
|
|
5
|
-
import { getFreshCredential, isSiteToken } from './chunk-
|
|
6
|
-
import './chunk-
|
|
4
|
+
import { sonorFetch } from './chunk-OFSA7LUH.mjs';
|
|
5
|
+
import { getFreshCredential, isSiteToken } from './chunk-4XGACM7D.mjs';
|
|
6
|
+
import './chunk-WDBCXRTT.mjs';
|
|
7
7
|
import './chunk-BEXTDHO4.mjs';
|
|
8
8
|
import { useState, useRef, useEffect, useCallback } from 'react';
|
|
9
9
|
|
|
@@ -326,5 +326,5 @@ function SignalCore({
|
|
|
326
326
|
}
|
|
327
327
|
|
|
328
328
|
export { SignalCore };
|
|
329
|
-
//# sourceMappingURL=SignalCore-
|
|
330
|
-
//# sourceMappingURL=SignalCore-
|
|
329
|
+
//# sourceMappingURL=SignalCore-X3GDGBZD.mjs.map
|
|
330
|
+
//# sourceMappingURL=SignalCore-X3GDGBZD.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/signal/SignalCore.tsx"],"names":[],"mappings":"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","file":"SignalCore-LT4NCPOR.mjs","sourcesContent":["/**\n * @sonordev/site-kit/signal - SignalCore\n *\n * The heavy half of SignalBridge: config fetching, SSE streaming, experiment\n * assignment, event queue/flush, and behavioral tracking. Mounted by the\n * SignalBridge shell as a CHILDLESS lazy sibling — it never wraps page\n * content, so the signal machinery stays out of the server-render path and\n * off the critical hydration chunk. It reports state up to the shell via\n * `onState` and registers its imperative API via `onRegister`.\n */\n\n'use client'\n\nimport { useCallback, useEffect, useRef, useState } from 'react'\n// Single source of truth for visitor/session IDs (storage keys _sk_vid/_sk_sid)\n// — shared with Analytics and Engage. Do NOT re-fork ID logic into this module.\nimport { getOrCreateVisitorId, getOrCreateSessionId } from '../shared/identity'\n// Canonical client transport — the same wrapper Analytics/Forms/Engage route\n// through (see shared/sonorFetch header). It gives every request a per-attempt\n// AbortSignal timeout, so a hung API aborts cleanly instead of being left to log\n// net::ERR_TIMED_OUT — the console error that fails Lighthouse best-practices.\n// It also sets x-api-key from the `apiKey` option, so callers drop the header.\nimport { sonorFetch } from '../shared/sonorFetch'\nimport { getFreshCredential, isSiteToken } from '../shared/siteToken'\nimport type {\n SignalConfig,\n SignalEvent,\n SignalOutcome,\n ExperimentAssignment,\n} from './types'\n\n// ============================================\n// Shell ↔ core contract\n// ============================================\n\nexport interface SignalCoreApi {\n trackEvent: (event: Partial<SignalEvent>) => void\n trackOutcome: (outcome: SignalOutcome) => void\n getExperiment: (experimentId: string) => ExperimentAssignment | null\n refreshConfig: () => Promise<void>\n}\n\nexport interface SignalCoreState {\n config: SignalConfig | null\n loading: boolean\n error: Error | null\n}\n\nexport interface SignalCoreProps {\n enabled: boolean\n realtime: boolean\n experiments: boolean\n behaviorTracking: boolean\n externalVisitorId?: string\n externalSessionId?: string\n pageMetadataRef?: React.RefObject<Record<string, unknown> | null>\n /** Called with the imperative API on mount, and with null on unmount. */\n onRegister: (api: SignalCoreApi | null) => void\n /** Called whenever config/loading/error change, so the shell can re-render consumers. */\n onState: (state: SignalCoreState) => void\n}\n\n// ============================================\n// Utility Functions\n// ============================================\n\nfunction getApiConfig() {\n const apiUrl = typeof window !== 'undefined'\n ? (window as any).__SITE_KIT_API_URL__ || 'https://api.sonor.io'\n : 'https://api.sonor.io'\n const apiKey = typeof window !== 'undefined'\n ? (window as any).__SITE_KIT_API_KEY__\n : undefined\n return { apiUrl, apiKey }\n}\n\n// A visitor's console must stay clean (Lighthouse \"errors logged to the console\"\n// best-practice) — Signal's diagnostics only surface when the site opts into\n// debug via SiteKitClientProviders' __SITE_KIT_DEBUG__ global, mirroring how\n// AnalyticsProvider gates every one of its logs behind its `debug` prop.\nfunction isDebug(): boolean {\n return typeof window !== 'undefined' && !!(window as any).__SITE_KIT_DEBUG__\n}\n\nfunction getDeviceType(): 'desktop' | 'mobile' | 'tablet' {\n if (typeof window === 'undefined') return 'desktop'\n const ua = navigator.userAgent\n if (/tablet|ipad|playbook|silk/i.test(ua)) return 'tablet'\n if (/mobile|iphone|ipod|android|blackberry|opera mini|iemobile/i.test(ua)) return 'mobile'\n return 'desktop'\n}\n\nfunction getBrowser(): string {\n if (typeof window === 'undefined') return 'unknown'\n const ua = navigator.userAgent\n if (ua.includes('Firefox')) return 'Firefox'\n if (ua.includes('Edg')) return 'Edge'\n if (ua.includes('Chrome')) return 'Chrome'\n if (ua.includes('Safari')) return 'Safari'\n return 'Other'\n}\n\nfunction getOS(): string {\n if (typeof window === 'undefined') return 'unknown'\n const ua = navigator.userAgent\n if (ua.includes('Windows')) return 'Windows'\n if (ua.includes('Mac')) return 'macOS'\n if (ua.includes('iPhone') || ua.includes('iPad')) return 'iOS'\n if (ua.includes('Android')) return 'Android'\n if (ua.includes('Linux')) return 'Linux'\n return 'Other'\n}\n\n// ============================================\n// SignalCore Component (childless)\n// ============================================\n\nexport function SignalCore({\n enabled,\n realtime,\n experiments,\n behaviorTracking,\n externalVisitorId,\n externalSessionId,\n pageMetadataRef,\n onRegister,\n onState,\n}: SignalCoreProps) {\n const [config, setConfig] = useState<SignalConfig | null>(null)\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<Error | null>(null)\n\n // Refs for SSE and tracking\n const eventSourceRef = useRef<EventSource | null>(null)\n const eventQueueRef = useRef<Partial<SignalEvent>[]>([])\n const flushTimeoutRef = useRef<NodeJS.Timeout | null>(null)\n const assignmentsRef = useRef<Map<string, ExperimentAssignment>>(new Map())\n\n // Behavioral tracking state\n const pageLoadTimeRef = useRef<number>(Date.now())\n const scrollDepthRef = useRef<number>(0)\n const clickCountRef = useRef<number>(0)\n\n const { apiUrl, apiKey } = getApiConfig()\n\n // Use external IDs from shared identity, fall back to the shared generators\n const resolvedVisitorId = externalVisitorId || getOrCreateVisitorId()\n const resolvedSessionId = externalSessionId || getOrCreateSessionId()\n\n // Mirror state up to the shell so context consumers re-render\n useEffect(() => {\n onState({ config, loading, error })\n }, [config, loading, error, onState])\n\n // ============================================\n // Experiment Assignment\n // ============================================\n\n const loadExperimentAssignment = useCallback(async (experimentId: string): Promise<ExperimentAssignment | null> => {\n // Check localStorage first\n const storageKey = `_signal_exp_${experimentId}`\n const stored = localStorage.getItem(storageKey)\n\n if (stored) {\n try {\n const assignment = JSON.parse(stored) as ExperimentAssignment\n if (assignment.expires > Date.now()) {\n assignmentsRef.current.set(experimentId, assignment)\n return assignment\n }\n } catch {\n // Invalid stored data, continue to fetch\n }\n }\n\n // Fetch from API — idempotent read, so the transport's default retries apply.\n try {\n const response = await sonorFetch(\n `${apiUrl}/api/public/signal/experiment/${experimentId}`,\n {\n headers: {\n 'x-visitor-id': resolvedVisitorId,\n },\n },\n { apiKey },\n )\n\n if (!response.ok) return null\n\n const assignment = await response.json() as ExperimentAssignment\n\n // Store assignment\n localStorage.setItem(storageKey, JSON.stringify(assignment))\n assignmentsRef.current.set(experimentId, assignment)\n\n return assignment\n } catch (err) {\n if (isDebug()) console.error('[Signal] Experiment assignment error:', err)\n return null\n }\n }, [apiUrl, apiKey])\n\n const getExperiment = useCallback((experimentId: string): ExperimentAssignment | null => {\n return assignmentsRef.current.get(experimentId) || null\n }, [])\n\n // ============================================\n // Config Fetching\n // ============================================\n\n const fetchConfig = useCallback(async () => {\n if (!apiKey || !enabled) {\n setLoading(false)\n return\n }\n\n try {\n const response = await sonorFetch(\n `${apiUrl}/api/public/signal/config`,\n {\n headers: {\n 'x-visitor-id': resolvedVisitorId,\n },\n },\n { apiKey },\n )\n\n if (!response.ok) {\n throw new Error(`Failed to fetch Signal config: ${response.statusText}`)\n }\n\n const data = await response.json()\n setConfig(data.config)\n setError(null)\n\n // Load experiment assignments\n if (experiments && data.config?.experiments) {\n for (const exp of data.config.experiments) {\n if (exp.status === 'running') {\n await loadExperimentAssignment(exp.id)\n }\n }\n }\n } catch (err) {\n if (isDebug()) console.error('[Signal] Config fetch error:', err)\n setError(err as Error)\n } finally {\n setLoading(false)\n }\n }, [apiUrl, apiKey, enabled, experiments, resolvedVisitorId, loadExperimentAssignment])\n\n // ============================================\n // SSE Real-time Updates\n // ============================================\n\n const connectSSE = useCallback(() => {\n if (!apiKey || !enabled || !realtime) return\n\n // Close existing connection\n if (eventSourceRef.current) {\n eventSourceRef.current.close()\n eventSourceRef.current = null\n }\n\n // EventSource cannot send headers, so the credential rides in the URL —\n // which server/CDN access logs capture. Per the transport contract in\n // sonorFetch.ts, the raw API key NEVER goes in a URL: only the\n // short-lived minted site token may (bounded exposure, unforgeable HMAC).\n // Raw-key mode (2.x layouts, mint-failure fallback) skips the stream —\n // config still loads via POST, only live push is lost.\n void (async () => {\n const credential = await getFreshCredential(apiKey)\n if (!credential || !isSiteToken(credential)) {\n if (isDebug()) {\n console.warn('[Signal] Realtime stream disabled: requires site-token mode (raw keys never go in URLs)')\n }\n return\n }\n if (eventSourceRef.current) return\n\n const url = `${apiUrl}/api/public/signal/stream?token=${encodeURIComponent(credential)}`\n connectEventSource(url)\n })()\n\n function connectEventSource(url: string) {\n const eventSource = new EventSource(url)\n\n eventSource.addEventListener('config_update', (e) => {\n try {\n const { config: newConfig, version } = JSON.parse(e.data)\n setConfig(prev => {\n if (prev?.version !== version) {\n if (isDebug()) console.log('[Signal] Config updated to version:', version)\n return newConfig\n }\n return prev\n })\n } catch (err) {\n if (isDebug()) console.error('[Signal] SSE parse error:', err)\n }\n })\n\n eventSource.addEventListener('experiment_update', (e) => {\n try {\n const { experiment_id, action } = JSON.parse(e.data)\n if (action === 'started' || action === 'updated') {\n loadExperimentAssignment(experiment_id)\n } else if (action === 'stopped') {\n assignmentsRef.current.delete(experiment_id)\n }\n } catch (err) {\n if (isDebug()) console.error('[Signal] Experiment update error:', err)\n }\n })\n\n eventSource.onerror = () => {\n if (isDebug()) console.warn('[Signal] SSE connection error, reconnecting...')\n eventSource.close()\n if (eventSourceRef.current === eventSource) {\n eventSourceRef.current = null\n }\n // Reconnect after 5 seconds (re-mints the token if it expired)\n setTimeout(connectSSE, 5000)\n }\n\n eventSourceRef.current = eventSource\n }\n }, [apiUrl, apiKey, enabled, realtime, loadExperimentAssignment])\n\n // ============================================\n // Event Tracking\n // ============================================\n\n const flushEvents = useCallback(async () => {\n if (eventQueueRef.current.length === 0) return\n\n const events = [...eventQueueRef.current]\n eventQueueRef.current = []\n\n try {\n // retries: 0 — fire-and-forget tracking; a retried flush after a lost\n // response would double-count events. The transport still aborts a hung\n // request at its timeout (no net::ERR_TIMED_OUT).\n await sonorFetch(\n `${apiUrl}/api/public/signal/events`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n visitor_id: resolvedVisitorId,\n session_id: resolvedSessionId,\n events,\n }),\n },\n { apiKey, retries: 0 },\n )\n } catch (err) {\n // Re-queue failed events\n eventQueueRef.current = [...events, ...eventQueueRef.current]\n if (isDebug()) console.error('[Signal] Event flush error:', err)\n }\n }, [apiUrl, apiKey])\n\n const trackEvent = useCallback((event: Partial<SignalEvent>) => {\n if (!enabled || !apiKey) return\n\n // Enrich event with context\n const enrichedEvent: Partial<SignalEvent> = {\n ...event,\n page_url: window.location.href,\n page_path: window.location.pathname,\n referrer: document.referrer,\n device_type: getDeviceType(),\n browser: getBrowser(),\n os: getOS(),\n viewport_width: window.innerWidth,\n viewport_height: window.innerHeight,\n time_on_page: Date.now() - pageLoadTimeRef.current,\n scroll_depth: scrollDepthRef.current,\n click_count: clickCountRef.current,\n experiments: Array.from(assignmentsRef.current.values()).map(a => ({\n experiment_id: a.experiment_id,\n variant_key: a.variant_key,\n })),\n // Merge page metadata from Analytics if available\n page_metadata: pageMetadataRef?.current ?? undefined,\n timestamp: new Date().toISOString(),\n }\n\n eventQueueRef.current.push(enrichedEvent)\n\n // Debounce flush\n if (flushTimeoutRef.current) {\n clearTimeout(flushTimeoutRef.current)\n }\n flushTimeoutRef.current = setTimeout(flushEvents, 1000)\n }, [enabled, apiKey, flushEvents])\n\n // ============================================\n // Outcome Tracking\n // ============================================\n\n const trackOutcome = useCallback(async (outcome: SignalOutcome) => {\n if (!enabled || !apiKey) return\n\n try {\n // retries: 0 — fire-and-forget conversion signal; never double-fire on a\n // lost response. Still aborts a hung request at the transport timeout.\n await sonorFetch(\n `${apiUrl}/api/public/signal/outcome`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n ...outcome,\n visitor_id: resolvedVisitorId,\n session_id: resolvedSessionId,\n experiments: Array.from(assignmentsRef.current.keys()),\n page_url: window.location.href,\n timestamp: new Date().toISOString(),\n }),\n },\n { apiKey, retries: 0 },\n )\n } catch (err) {\n if (isDebug()) console.error('[Signal] Outcome tracking error:', err)\n }\n }, [apiUrl, apiKey, enabled])\n\n // ============================================\n // Behavioral Tracking\n // ============================================\n\n useEffect(() => {\n if (!behaviorTracking || typeof window === 'undefined') return\n\n // Track scroll depth\n const handleScroll = () => {\n const scrollTop = window.scrollY\n const docHeight = document.documentElement.scrollHeight - window.innerHeight\n const depth = docHeight > 0 ? Math.round((scrollTop / docHeight) * 100) : 0\n scrollDepthRef.current = Math.max(scrollDepthRef.current, depth)\n }\n\n // Track clicks\n const handleClick = () => {\n clickCountRef.current++\n }\n\n window.addEventListener('scroll', handleScroll, { passive: true })\n window.addEventListener('click', handleClick)\n\n // Flush on visibility change or page hide.\n // `pagehide` (not `beforeunload`): fires on iOS Safari, bfcache-safe.\n const handleVisibilityChange = () => {\n if (document.visibilityState === 'hidden') {\n flushEvents()\n }\n }\n\n document.addEventListener('visibilitychange', handleVisibilityChange)\n window.addEventListener('pagehide', flushEvents)\n\n return () => {\n window.removeEventListener('scroll', handleScroll)\n window.removeEventListener('click', handleClick)\n document.removeEventListener('visibilitychange', handleVisibilityChange)\n window.removeEventListener('pagehide', flushEvents)\n }\n }, [behaviorTracking, flushEvents])\n\n // ============================================\n // Initialization + shell registration\n // ============================================\n\n useEffect(() => {\n fetchConfig()\n }, [fetchConfig])\n\n useEffect(() => {\n if (config && realtime) {\n connectSSE()\n }\n\n return () => {\n if (eventSourceRef.current) {\n eventSourceRef.current.close()\n }\n }\n }, [config, realtime, connectSSE])\n\n // Hand the imperative API to the shell; buffered calls drain on register.\n useEffect(() => {\n onRegister({\n trackEvent,\n trackOutcome: (outcome: SignalOutcome) => { void trackOutcome(outcome) },\n getExperiment,\n refreshConfig: fetchConfig,\n })\n return () => onRegister(null)\n }, [onRegister, trackEvent, trackOutcome, getExperiment, fetchConfig])\n\n return null\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/signal/SignalCore.tsx"],"names":[],"mappings":"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","file":"SignalCore-X3GDGBZD.mjs","sourcesContent":["/**\n * @sonordev/site-kit/signal - SignalCore\n *\n * The heavy half of SignalBridge: config fetching, SSE streaming, experiment\n * assignment, event queue/flush, and behavioral tracking. Mounted by the\n * SignalBridge shell as a CHILDLESS lazy sibling — it never wraps page\n * content, so the signal machinery stays out of the server-render path and\n * off the critical hydration chunk. It reports state up to the shell via\n * `onState` and registers its imperative API via `onRegister`.\n */\n\n'use client'\n\nimport { useCallback, useEffect, useRef, useState } from 'react'\n// Single source of truth for visitor/session IDs (storage keys _sk_vid/_sk_sid)\n// — shared with Analytics and Engage. Do NOT re-fork ID logic into this module.\nimport { getOrCreateVisitorId, getOrCreateSessionId } from '../shared/identity'\n// Canonical client transport — the same wrapper Analytics/Forms/Engage route\n// through (see shared/sonorFetch header). It gives every request a per-attempt\n// AbortSignal timeout, so a hung API aborts cleanly instead of being left to log\n// net::ERR_TIMED_OUT — the console error that fails Lighthouse best-practices.\n// It also sets x-api-key from the `apiKey` option, so callers drop the header.\nimport { sonorFetch } from '../shared/sonorFetch'\nimport { getFreshCredential, isSiteToken } from '../shared/siteToken'\nimport type {\n SignalConfig,\n SignalEvent,\n SignalOutcome,\n ExperimentAssignment,\n} from './types'\n\n// ============================================\n// Shell ↔ core contract\n// ============================================\n\nexport interface SignalCoreApi {\n trackEvent: (event: Partial<SignalEvent>) => void\n trackOutcome: (outcome: SignalOutcome) => void\n getExperiment: (experimentId: string) => ExperimentAssignment | null\n refreshConfig: () => Promise<void>\n}\n\nexport interface SignalCoreState {\n config: SignalConfig | null\n loading: boolean\n error: Error | null\n}\n\nexport interface SignalCoreProps {\n enabled: boolean\n realtime: boolean\n experiments: boolean\n behaviorTracking: boolean\n externalVisitorId?: string\n externalSessionId?: string\n pageMetadataRef?: React.RefObject<Record<string, unknown> | null>\n /** Called with the imperative API on mount, and with null on unmount. */\n onRegister: (api: SignalCoreApi | null) => void\n /** Called whenever config/loading/error change, so the shell can re-render consumers. */\n onState: (state: SignalCoreState) => void\n}\n\n// ============================================\n// Utility Functions\n// ============================================\n\nfunction getApiConfig() {\n const apiUrl = typeof window !== 'undefined'\n ? (window as any).__SITE_KIT_API_URL__ || 'https://api.sonor.io'\n : 'https://api.sonor.io'\n const apiKey = typeof window !== 'undefined'\n ? (window as any).__SITE_KIT_API_KEY__\n : undefined\n return { apiUrl, apiKey }\n}\n\n// A visitor's console must stay clean (Lighthouse \"errors logged to the console\"\n// best-practice) — Signal's diagnostics only surface when the site opts into\n// debug via SiteKitClientProviders' __SITE_KIT_DEBUG__ global, mirroring how\n// AnalyticsProvider gates every one of its logs behind its `debug` prop.\nfunction isDebug(): boolean {\n return typeof window !== 'undefined' && !!(window as any).__SITE_KIT_DEBUG__\n}\n\nfunction getDeviceType(): 'desktop' | 'mobile' | 'tablet' {\n if (typeof window === 'undefined') return 'desktop'\n const ua = navigator.userAgent\n if (/tablet|ipad|playbook|silk/i.test(ua)) return 'tablet'\n if (/mobile|iphone|ipod|android|blackberry|opera mini|iemobile/i.test(ua)) return 'mobile'\n return 'desktop'\n}\n\nfunction getBrowser(): string {\n if (typeof window === 'undefined') return 'unknown'\n const ua = navigator.userAgent\n if (ua.includes('Firefox')) return 'Firefox'\n if (ua.includes('Edg')) return 'Edge'\n if (ua.includes('Chrome')) return 'Chrome'\n if (ua.includes('Safari')) return 'Safari'\n return 'Other'\n}\n\nfunction getOS(): string {\n if (typeof window === 'undefined') return 'unknown'\n const ua = navigator.userAgent\n if (ua.includes('Windows')) return 'Windows'\n if (ua.includes('Mac')) return 'macOS'\n if (ua.includes('iPhone') || ua.includes('iPad')) return 'iOS'\n if (ua.includes('Android')) return 'Android'\n if (ua.includes('Linux')) return 'Linux'\n return 'Other'\n}\n\n// ============================================\n// SignalCore Component (childless)\n// ============================================\n\nexport function SignalCore({\n enabled,\n realtime,\n experiments,\n behaviorTracking,\n externalVisitorId,\n externalSessionId,\n pageMetadataRef,\n onRegister,\n onState,\n}: SignalCoreProps) {\n const [config, setConfig] = useState<SignalConfig | null>(null)\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<Error | null>(null)\n\n // Refs for SSE and tracking\n const eventSourceRef = useRef<EventSource | null>(null)\n const eventQueueRef = useRef<Partial<SignalEvent>[]>([])\n const flushTimeoutRef = useRef<NodeJS.Timeout | null>(null)\n const assignmentsRef = useRef<Map<string, ExperimentAssignment>>(new Map())\n\n // Behavioral tracking state\n const pageLoadTimeRef = useRef<number>(Date.now())\n const scrollDepthRef = useRef<number>(0)\n const clickCountRef = useRef<number>(0)\n\n const { apiUrl, apiKey } = getApiConfig()\n\n // Use external IDs from shared identity, fall back to the shared generators\n const resolvedVisitorId = externalVisitorId || getOrCreateVisitorId()\n const resolvedSessionId = externalSessionId || getOrCreateSessionId()\n\n // Mirror state up to the shell so context consumers re-render\n useEffect(() => {\n onState({ config, loading, error })\n }, [config, loading, error, onState])\n\n // ============================================\n // Experiment Assignment\n // ============================================\n\n const loadExperimentAssignment = useCallback(async (experimentId: string): Promise<ExperimentAssignment | null> => {\n // Check localStorage first\n const storageKey = `_signal_exp_${experimentId}`\n const stored = localStorage.getItem(storageKey)\n\n if (stored) {\n try {\n const assignment = JSON.parse(stored) as ExperimentAssignment\n if (assignment.expires > Date.now()) {\n assignmentsRef.current.set(experimentId, assignment)\n return assignment\n }\n } catch {\n // Invalid stored data, continue to fetch\n }\n }\n\n // Fetch from API — idempotent read, so the transport's default retries apply.\n try {\n const response = await sonorFetch(\n `${apiUrl}/api/public/signal/experiment/${experimentId}`,\n {\n headers: {\n 'x-visitor-id': resolvedVisitorId,\n },\n },\n { apiKey },\n )\n\n if (!response.ok) return null\n\n const assignment = await response.json() as ExperimentAssignment\n\n // Store assignment\n localStorage.setItem(storageKey, JSON.stringify(assignment))\n assignmentsRef.current.set(experimentId, assignment)\n\n return assignment\n } catch (err) {\n if (isDebug()) console.error('[Signal] Experiment assignment error:', err)\n return null\n }\n }, [apiUrl, apiKey])\n\n const getExperiment = useCallback((experimentId: string): ExperimentAssignment | null => {\n return assignmentsRef.current.get(experimentId) || null\n }, [])\n\n // ============================================\n // Config Fetching\n // ============================================\n\n const fetchConfig = useCallback(async () => {\n if (!apiKey || !enabled) {\n setLoading(false)\n return\n }\n\n try {\n const response = await sonorFetch(\n `${apiUrl}/api/public/signal/config`,\n {\n headers: {\n 'x-visitor-id': resolvedVisitorId,\n },\n },\n { apiKey },\n )\n\n if (!response.ok) {\n throw new Error(`Failed to fetch Signal config: ${response.statusText}`)\n }\n\n const data = await response.json()\n setConfig(data.config)\n setError(null)\n\n // Load experiment assignments\n if (experiments && data.config?.experiments) {\n for (const exp of data.config.experiments) {\n if (exp.status === 'running') {\n await loadExperimentAssignment(exp.id)\n }\n }\n }\n } catch (err) {\n if (isDebug()) console.error('[Signal] Config fetch error:', err)\n setError(err as Error)\n } finally {\n setLoading(false)\n }\n }, [apiUrl, apiKey, enabled, experiments, resolvedVisitorId, loadExperimentAssignment])\n\n // ============================================\n // SSE Real-time Updates\n // ============================================\n\n const connectSSE = useCallback(() => {\n if (!apiKey || !enabled || !realtime) return\n\n // Close existing connection\n if (eventSourceRef.current) {\n eventSourceRef.current.close()\n eventSourceRef.current = null\n }\n\n // EventSource cannot send headers, so the credential rides in the URL —\n // which server/CDN access logs capture. Per the transport contract in\n // sonorFetch.ts, the raw API key NEVER goes in a URL: only the\n // short-lived minted site token may (bounded exposure, unforgeable HMAC).\n // Raw-key mode (2.x layouts, mint-failure fallback) skips the stream —\n // config still loads via POST, only live push is lost.\n void (async () => {\n const credential = await getFreshCredential(apiKey)\n if (!credential || !isSiteToken(credential)) {\n if (isDebug()) {\n console.warn('[Signal] Realtime stream disabled: requires site-token mode (raw keys never go in URLs)')\n }\n return\n }\n if (eventSourceRef.current) return\n\n const url = `${apiUrl}/api/public/signal/stream?token=${encodeURIComponent(credential)}`\n connectEventSource(url)\n })()\n\n function connectEventSource(url: string) {\n const eventSource = new EventSource(url)\n\n eventSource.addEventListener('config_update', (e) => {\n try {\n const { config: newConfig, version } = JSON.parse(e.data)\n setConfig(prev => {\n if (prev?.version !== version) {\n if (isDebug()) console.log('[Signal] Config updated to version:', version)\n return newConfig\n }\n return prev\n })\n } catch (err) {\n if (isDebug()) console.error('[Signal] SSE parse error:', err)\n }\n })\n\n eventSource.addEventListener('experiment_update', (e) => {\n try {\n const { experiment_id, action } = JSON.parse(e.data)\n if (action === 'started' || action === 'updated') {\n loadExperimentAssignment(experiment_id)\n } else if (action === 'stopped') {\n assignmentsRef.current.delete(experiment_id)\n }\n } catch (err) {\n if (isDebug()) console.error('[Signal] Experiment update error:', err)\n }\n })\n\n eventSource.onerror = () => {\n if (isDebug()) console.warn('[Signal] SSE connection error, reconnecting...')\n eventSource.close()\n if (eventSourceRef.current === eventSource) {\n eventSourceRef.current = null\n }\n // Reconnect after 5 seconds (re-mints the token if it expired)\n setTimeout(connectSSE, 5000)\n }\n\n eventSourceRef.current = eventSource\n }\n }, [apiUrl, apiKey, enabled, realtime, loadExperimentAssignment])\n\n // ============================================\n // Event Tracking\n // ============================================\n\n const flushEvents = useCallback(async () => {\n if (eventQueueRef.current.length === 0) return\n\n const events = [...eventQueueRef.current]\n eventQueueRef.current = []\n\n try {\n // retries: 0 — fire-and-forget tracking; a retried flush after a lost\n // response would double-count events. The transport still aborts a hung\n // request at its timeout (no net::ERR_TIMED_OUT).\n await sonorFetch(\n `${apiUrl}/api/public/signal/events`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n visitor_id: resolvedVisitorId,\n session_id: resolvedSessionId,\n events,\n }),\n },\n { apiKey, retries: 0 },\n )\n } catch (err) {\n // Re-queue failed events\n eventQueueRef.current = [...events, ...eventQueueRef.current]\n if (isDebug()) console.error('[Signal] Event flush error:', err)\n }\n }, [apiUrl, apiKey])\n\n const trackEvent = useCallback((event: Partial<SignalEvent>) => {\n if (!enabled || !apiKey) return\n\n // Enrich event with context\n const enrichedEvent: Partial<SignalEvent> = {\n ...event,\n page_url: window.location.href,\n page_path: window.location.pathname,\n referrer: document.referrer,\n device_type: getDeviceType(),\n browser: getBrowser(),\n os: getOS(),\n viewport_width: window.innerWidth,\n viewport_height: window.innerHeight,\n time_on_page: Date.now() - pageLoadTimeRef.current,\n scroll_depth: scrollDepthRef.current,\n click_count: clickCountRef.current,\n experiments: Array.from(assignmentsRef.current.values()).map(a => ({\n experiment_id: a.experiment_id,\n variant_key: a.variant_key,\n })),\n // Merge page metadata from Analytics if available\n page_metadata: pageMetadataRef?.current ?? undefined,\n timestamp: new Date().toISOString(),\n }\n\n eventQueueRef.current.push(enrichedEvent)\n\n // Debounce flush\n if (flushTimeoutRef.current) {\n clearTimeout(flushTimeoutRef.current)\n }\n flushTimeoutRef.current = setTimeout(flushEvents, 1000)\n }, [enabled, apiKey, flushEvents])\n\n // ============================================\n // Outcome Tracking\n // ============================================\n\n const trackOutcome = useCallback(async (outcome: SignalOutcome) => {\n if (!enabled || !apiKey) return\n\n try {\n // retries: 0 — fire-and-forget conversion signal; never double-fire on a\n // lost response. Still aborts a hung request at the transport timeout.\n await sonorFetch(\n `${apiUrl}/api/public/signal/outcome`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n ...outcome,\n visitor_id: resolvedVisitorId,\n session_id: resolvedSessionId,\n experiments: Array.from(assignmentsRef.current.keys()),\n page_url: window.location.href,\n timestamp: new Date().toISOString(),\n }),\n },\n { apiKey, retries: 0 },\n )\n } catch (err) {\n if (isDebug()) console.error('[Signal] Outcome tracking error:', err)\n }\n }, [apiUrl, apiKey, enabled])\n\n // ============================================\n // Behavioral Tracking\n // ============================================\n\n useEffect(() => {\n if (!behaviorTracking || typeof window === 'undefined') return\n\n // Track scroll depth\n const handleScroll = () => {\n const scrollTop = window.scrollY\n const docHeight = document.documentElement.scrollHeight - window.innerHeight\n const depth = docHeight > 0 ? Math.round((scrollTop / docHeight) * 100) : 0\n scrollDepthRef.current = Math.max(scrollDepthRef.current, depth)\n }\n\n // Track clicks\n const handleClick = () => {\n clickCountRef.current++\n }\n\n window.addEventListener('scroll', handleScroll, { passive: true })\n window.addEventListener('click', handleClick)\n\n // Flush on visibility change or page hide.\n // `pagehide` (not `beforeunload`): fires on iOS Safari, bfcache-safe.\n const handleVisibilityChange = () => {\n if (document.visibilityState === 'hidden') {\n flushEvents()\n }\n }\n\n document.addEventListener('visibilitychange', handleVisibilityChange)\n window.addEventListener('pagehide', flushEvents)\n\n return () => {\n window.removeEventListener('scroll', handleScroll)\n window.removeEventListener('click', handleClick)\n document.removeEventListener('visibilitychange', handleVisibilityChange)\n window.removeEventListener('pagehide', flushEvents)\n }\n }, [behaviorTracking, flushEvents])\n\n // ============================================\n // Initialization + shell registration\n // ============================================\n\n useEffect(() => {\n fetchConfig()\n }, [fetchConfig])\n\n useEffect(() => {\n if (config && realtime) {\n connectSSE()\n }\n\n return () => {\n if (eventSourceRef.current) {\n eventSourceRef.current.close()\n }\n }\n }, [config, realtime, connectSSE])\n\n // Hand the imperative API to the shell; buffered calls drain on register.\n useEffect(() => {\n onRegister({\n trackEvent,\n trackOutcome: (outcome: SignalOutcome) => { void trackOutcome(outcome) },\n getExperiment,\n refreshConfig: fetchConfig,\n })\n return () => onRegister(null)\n }, [onRegister, trackEvent, trackOutcome, getExperiment, fetchConfig])\n\n return null\n}\n"]}
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
|
|
4
4
|
var chunkRC4WWQXR_js = require('./chunk-RC4WWQXR.js');
|
|
5
5
|
require('./chunk-VJMPIRSD.js');
|
|
6
|
-
var
|
|
7
|
-
var
|
|
8
|
-
require('./chunk-
|
|
6
|
+
var chunkQEGUI2Q2_js = require('./chunk-QEGUI2Q2.js');
|
|
7
|
+
var chunkHFJQMIFM_js = require('./chunk-HFJQMIFM.js');
|
|
8
|
+
require('./chunk-SUZ3ZLB2.js');
|
|
9
9
|
require('./chunk-SNAQBZPT.js');
|
|
10
10
|
var react = require('react');
|
|
11
11
|
|
|
@@ -84,7 +84,7 @@ function SignalCore({
|
|
|
84
84
|
}
|
|
85
85
|
}
|
|
86
86
|
try {
|
|
87
|
-
const response = await
|
|
87
|
+
const response = await chunkQEGUI2Q2_js.sonorFetch(
|
|
88
88
|
`${apiUrl}/api/public/signal/experiment/${experimentId}`,
|
|
89
89
|
{
|
|
90
90
|
headers: {
|
|
@@ -112,7 +112,7 @@ function SignalCore({
|
|
|
112
112
|
return;
|
|
113
113
|
}
|
|
114
114
|
try {
|
|
115
|
-
const response = await
|
|
115
|
+
const response = await chunkQEGUI2Q2_js.sonorFetch(
|
|
116
116
|
`${apiUrl}/api/public/signal/config`,
|
|
117
117
|
{
|
|
118
118
|
headers: {
|
|
@@ -148,8 +148,8 @@ function SignalCore({
|
|
|
148
148
|
eventSourceRef.current = null;
|
|
149
149
|
}
|
|
150
150
|
void (async () => {
|
|
151
|
-
const credential = await
|
|
152
|
-
if (!credential || !
|
|
151
|
+
const credential = await chunkHFJQMIFM_js.getFreshCredential(apiKey);
|
|
152
|
+
if (!credential || !chunkHFJQMIFM_js.isSiteToken(credential)) {
|
|
153
153
|
if (isDebug()) {
|
|
154
154
|
console.warn("[Signal] Realtime stream disabled: requires site-token mode (raw keys never go in URLs)");
|
|
155
155
|
}
|
|
@@ -203,7 +203,7 @@ function SignalCore({
|
|
|
203
203
|
const events = [...eventQueueRef.current];
|
|
204
204
|
eventQueueRef.current = [];
|
|
205
205
|
try {
|
|
206
|
-
await
|
|
206
|
+
await chunkQEGUI2Q2_js.sonorFetch(
|
|
207
207
|
`${apiUrl}/api/public/signal/events`,
|
|
208
208
|
{
|
|
209
209
|
method: "POST",
|
|
@@ -253,7 +253,7 @@ function SignalCore({
|
|
|
253
253
|
const trackOutcome = react.useCallback(async (outcome) => {
|
|
254
254
|
if (!enabled || !apiKey) return;
|
|
255
255
|
try {
|
|
256
|
-
await
|
|
256
|
+
await chunkQEGUI2Q2_js.sonorFetch(
|
|
257
257
|
`${apiUrl}/api/public/signal/outcome`,
|
|
258
258
|
{
|
|
259
259
|
method: "POST",
|
|
@@ -328,5 +328,5 @@ function SignalCore({
|
|
|
328
328
|
}
|
|
329
329
|
|
|
330
330
|
exports.SignalCore = SignalCore;
|
|
331
|
-
//# sourceMappingURL=SignalCore-
|
|
332
|
-
//# sourceMappingURL=SignalCore-
|
|
331
|
+
//# sourceMappingURL=SignalCore-YSNZYBKJ.js.map
|
|
332
|
+
//# sourceMappingURL=SignalCore-YSNZYBKJ.js.map
|