@sonordev/site-kit 6.3.1 → 6.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/agent-manifest.json +1 -1
- package/dist/{AnalyticsProvider-G46LCH3V.js → AnalyticsProvider-IZXUFR7B.js} +10 -10
- package/dist/{AnalyticsProvider-G46LCH3V.js.map → AnalyticsProvider-IZXUFR7B.js.map} +1 -1
- package/dist/{AnalyticsProvider-IYGKHMVM.mjs → AnalyticsProvider-K5DRCKEB.mjs} +6 -6
- package/dist/{AnalyticsProvider-IYGKHMVM.mjs.map → AnalyticsProvider-K5DRCKEB.mjs.map} +1 -1
- package/dist/{ArticleViewTracker-3USIHB4O.js → ArticleViewTracker-OYYQABG3.js} +6 -6
- package/dist/{ArticleViewTracker-3USIHB4O.js.map → ArticleViewTracker-OYYQABG3.js.map} +1 -1
- package/dist/{ArticleViewTracker-7GEI37VK.mjs → ArticleViewTracker-TLQT5MJP.mjs} +5 -5
- package/dist/{ArticleViewTracker-7GEI37VK.mjs.map → ArticleViewTracker-TLQT5MJP.mjs.map} +1 -1
- package/dist/{ChatWidget-VP3QQJA6.js → ChatWidget-4GAGGANM.js} +11 -11
- package/dist/{ChatWidget-VP3QQJA6.js.map → ChatWidget-4GAGGANM.js.map} +1 -1
- package/dist/ChatWidget-JTI25HIA.mjs +17 -0
- package/dist/{ChatWidget-36IDUB53.mjs.map → ChatWidget-JTI25HIA.mjs.map} +1 -1
- package/dist/EngageWidget-LNTIXBFA.js +21 -0
- package/dist/{EngageWidget-YHMSB4YE.js.map → EngageWidget-LNTIXBFA.js.map} +1 -1
- package/dist/EngageWidget-YM2JPXXJ.mjs +12 -0
- package/dist/{EngageWidget-ILRTLGBB.mjs.map → EngageWidget-YM2JPXXJ.mjs.map} +1 -1
- package/dist/{FileField-DXGPA4OB.mjs → FileField-KIQMFWW6.mjs} +5 -5
- package/dist/FileField-KIQMFWW6.mjs.map +1 -0
- package/dist/{FileField-LMSLNNRX.js → FileField-U327LS7Q.js} +6 -6
- package/dist/FileField-U327LS7Q.js.map +1 -0
- package/dist/{FormSpotlight-SEJ4NJHG.mjs → FormSpotlight-BKMGDP3Z.mjs} +4 -4
- package/dist/{FormSpotlight-SEJ4NJHG.mjs.map → FormSpotlight-BKMGDP3Z.mjs.map} +1 -1
- package/dist/{FormSpotlight-5BQCAXIO.js → FormSpotlight-SAYR5PQW.js} +12 -12
- package/dist/{FormSpotlight-5BQCAXIO.js.map → FormSpotlight-SAYR5PQW.js.map} +1 -1
- package/dist/{FormStage-6OLDPLYU.mjs → FormStage-35VWCKJ4.mjs} +4 -4
- package/dist/{FormStage-6OLDPLYU.mjs.map → FormStage-35VWCKJ4.mjs.map} +1 -1
- package/dist/{FormStage-ZRXENSYN.js → FormStage-GBH4PXW7.js} +11 -11
- package/dist/{FormStage-ZRXENSYN.js.map → FormStage-GBH4PXW7.js.map} +1 -1
- package/dist/ManagedForm-GOZNJ66K.mjs +16 -0
- package/dist/{ManagedForm-AIPXF5QY.mjs.map → ManagedForm-GOZNJ66K.mjs.map} +1 -1
- package/dist/ManagedForm-MKSPZAI3.js +25 -0
- package/dist/{ManagedForm-T464AA5B.js.map → ManagedForm-MKSPZAI3.js.map} +1 -1
- package/dist/{ManagedNewsletterForm-UGDUBYR3.mjs → ManagedNewsletterForm-3FJU7HUS.mjs} +7 -7
- package/dist/{ManagedNewsletterForm-UGDUBYR3.mjs.map → ManagedNewsletterForm-3FJU7HUS.mjs.map} +1 -1
- package/dist/{ManagedNewsletterForm-HKNXIKDV.js → ManagedNewsletterForm-BMXJ2BXD.js} +8 -8
- package/dist/{ManagedNewsletterForm-HKNXIKDV.js.map → ManagedNewsletterForm-BMXJ2BXD.js.map} +1 -1
- package/dist/{SignalCore-OOQHKIUZ.js → SignalCore-DEGICRY2.js} +11 -11
- package/dist/{SignalCore-OOQHKIUZ.js.map → SignalCore-DEGICRY2.js.map} +1 -1
- package/dist/{SignalCore-O3GEJZCN.mjs → SignalCore-N2JUB4D4.mjs} +5 -5
- package/dist/{SignalCore-O3GEJZCN.mjs.map → SignalCore-N2JUB4D4.mjs.map} +1 -1
- package/dist/SitemapSync-HRQ7KLP5.js +18 -0
- package/dist/{SitemapSync-MT3I4W3B.js.map → SitemapSync-HRQ7KLP5.js.map} +1 -1
- package/dist/SitemapSync-JIORN4Z5.mjs +9 -0
- package/dist/{SitemapSync-RG554AJR.mjs.map → SitemapSync-JIORN4Z5.mjs.map} +1 -1
- package/dist/analytics/index.js +9 -9
- package/dist/analytics/index.mjs +4 -4
- package/dist/articles/index.js +1 -1
- package/dist/articles/index.mjs +1 -1
- package/dist/articles/server-ui.js +1 -1
- package/dist/articles/server-ui.mjs +1 -1
- package/dist/{chunk-S7S6ZZ3R.js → chunk-2TSDPEMA.js} +7 -7
- package/dist/{chunk-S7S6ZZ3R.js.map → chunk-2TSDPEMA.js.map} +1 -1
- package/dist/{chunk-XNZ2WFXR.mjs → chunk-377Z7GOV.mjs} +4 -4
- package/dist/{chunk-XNZ2WFXR.mjs.map → chunk-377Z7GOV.mjs.map} +1 -1
- package/dist/{chunk-FVATDBFX.js → chunk-4F4CHBVS.js} +10 -10
- package/dist/{chunk-FVATDBFX.js.map → chunk-4F4CHBVS.js.map} +1 -1
- package/dist/{chunk-HY6EXWLZ.js → chunk-4T3CV7DK.js} +8 -8
- package/dist/{chunk-HY6EXWLZ.js.map → chunk-4T3CV7DK.js.map} +1 -1
- package/dist/{chunk-3EOUKWHB.mjs → chunk-6OA4VMSL.mjs} +3 -3
- package/dist/{chunk-3EOUKWHB.mjs.map → chunk-6OA4VMSL.mjs.map} +1 -1
- package/dist/chunk-6PQJH6YR.js +8 -0
- package/dist/{chunk-ZKOQCKOR.js.map → chunk-6PQJH6YR.js.map} +1 -1
- package/dist/{chunk-GE3CGR2T.js → chunk-7EW22AND.js} +14 -14
- package/dist/{chunk-GE3CGR2T.js.map → chunk-7EW22AND.js.map} +1 -1
- package/dist/{chunk-QRL3QDUE.js → chunk-7RLL67F3.js} +3 -20
- package/dist/chunk-7RLL67F3.js.map +1 -0
- package/dist/{chunk-XV2FFSJU.mjs → chunk-7SHTA3NT.mjs} +10 -11
- package/dist/chunk-7SHTA3NT.mjs.map +1 -0
- package/dist/{chunk-WIRGZMM5.mjs → chunk-A2ENMRTN.mjs} +3 -3
- package/dist/{chunk-WIRGZMM5.mjs.map → chunk-A2ENMRTN.mjs.map} +1 -1
- package/dist/{chunk-4KSE642V.js → chunk-A6PXU6IU.js} +23 -27
- package/dist/chunk-A6PXU6IU.js.map +1 -0
- package/dist/chunk-AGIMH67E.mjs +26 -0
- package/dist/chunk-AGIMH67E.mjs.map +1 -0
- package/dist/{chunk-A3QAZJXC.js → chunk-CB3WK2OW.js} +6 -8
- package/dist/chunk-CB3WK2OW.js.map +1 -0
- package/dist/{chunk-RZUUPX2H.js → chunk-DFVWOIJE.js} +6 -6
- package/dist/{chunk-RZUUPX2H.js.map → chunk-DFVWOIJE.js.map} +1 -1
- package/dist/{chunk-6WWGH6E3.js → chunk-DHCU3RTK.js} +14 -14
- package/dist/{chunk-6WWGH6E3.js.map → chunk-DHCU3RTK.js.map} +1 -1
- package/dist/{chunk-YCE6HRWW.js → chunk-DV5KVNA7.js} +10 -11
- package/dist/chunk-DV5KVNA7.js.map +1 -0
- package/dist/{chunk-JS265UKZ.mjs → chunk-EE7D6BSA.mjs} +3 -3
- package/dist/{chunk-JS265UKZ.mjs.map → chunk-EE7D6BSA.mjs.map} +1 -1
- package/dist/{chunk-OUM77VZ4.mjs → chunk-EE7J66MJ.mjs} +3 -3
- package/dist/{chunk-OUM77VZ4.mjs.map → chunk-EE7J66MJ.mjs.map} +1 -1
- package/dist/{chunk-6TSYWYYR.js → chunk-F5RO6HVF.js} +4 -4
- package/dist/{chunk-6TSYWYYR.js.map → chunk-F5RO6HVF.js.map} +1 -1
- package/dist/chunk-FCAHV5P3.mjs +45 -0
- package/dist/chunk-FCAHV5P3.mjs.map +1 -0
- package/dist/chunk-GBMVAKX3.mjs +6 -0
- package/dist/{chunk-C654VCWV.mjs.map → chunk-GBMVAKX3.mjs.map} +1 -1
- package/dist/{chunk-KAJT3MOM.mjs → chunk-GFWSYLGO.mjs} +4 -4
- package/dist/{chunk-KAJT3MOM.mjs.map → chunk-GFWSYLGO.mjs.map} +1 -1
- package/dist/{chunk-2LX7LHAO.js → chunk-GWQTFMM2.js} +5 -5
- package/dist/{chunk-2LX7LHAO.js.map → chunk-GWQTFMM2.js.map} +1 -1
- package/dist/{chunk-NO4JQ2G3.mjs → chunk-HMTFTO5G.mjs} +10 -14
- package/dist/chunk-HMTFTO5G.mjs.map +1 -0
- package/dist/{chunk-S4DTX5E7.js → chunk-KMJM55P6.js} +4 -4
- package/dist/{chunk-S4DTX5E7.js.map → chunk-KMJM55P6.js.map} +1 -1
- package/dist/{chunk-4HSZPHF7.mjs → chunk-LBGOC22N.mjs} +4 -6
- package/dist/chunk-LBGOC22N.mjs.map +1 -0
- package/dist/{chunk-NKBPEZCX.js → chunk-LPUP2TSV.js} +15 -15
- package/dist/{chunk-NKBPEZCX.js.map → chunk-LPUP2TSV.js.map} +1 -1
- package/dist/{chunk-KUDSEKV7.mjs → chunk-LRSLYZXP.mjs} +4 -4
- package/dist/{chunk-KUDSEKV7.mjs.map → chunk-LRSLYZXP.mjs.map} +1 -1
- package/dist/{chunk-7YFUX2CL.mjs → chunk-M26C37WI.mjs} +3 -3
- package/dist/{chunk-7YFUX2CL.mjs.map → chunk-M26C37WI.mjs.map} +1 -1
- package/dist/{chunk-JPXT5LY2.js → chunk-NNQJUMFQ.js} +204 -12
- package/dist/chunk-NNQJUMFQ.js.map +1 -0
- package/dist/{chunk-A5R62CXI.mjs → chunk-NP6BRB6Z.mjs} +3 -5
- package/dist/chunk-NP6BRB6Z.mjs.map +1 -0
- package/dist/{chunk-DUFU27R2.mjs → chunk-PBBARB5B.mjs} +3 -3
- package/dist/{chunk-DUFU27R2.mjs.map → chunk-PBBARB5B.mjs.map} +1 -1
- package/dist/{chunk-YUCKBIRE.mjs → chunk-PHTL4CPD.mjs} +196 -5
- package/dist/chunk-PHTL4CPD.mjs.map +1 -0
- package/dist/{chunk-XA2GJFVM.js → chunk-RI6DFQCA.js} +3 -5
- package/dist/chunk-RI6DFQCA.js.map +1 -0
- package/dist/{chunk-U274XAMD.js → chunk-RWUFJGZX.js} +12 -13
- package/dist/chunk-RWUFJGZX.js.map +1 -0
- package/dist/{chunk-YYOGUTLV.js → chunk-S3RPDQA7.js} +3 -3
- package/dist/{chunk-YYOGUTLV.js.map → chunk-S3RPDQA7.js.map} +1 -1
- package/dist/{chunk-A4WYSHIX.js → chunk-SBCG2ZLK.js} +3 -5
- package/dist/chunk-SBCG2ZLK.js.map +1 -0
- package/dist/{chunk-YOS4A3QE.mjs → chunk-T4ZA4RCC.mjs} +3 -3
- package/dist/{chunk-YOS4A3QE.mjs.map → chunk-T4ZA4RCC.mjs.map} +1 -1
- package/dist/chunk-TULCHQX2.js +29 -0
- package/dist/chunk-TULCHQX2.js.map +1 -0
- package/dist/{chunk-QRN6HQOX.js → chunk-UTSKVISR.js} +15 -15
- package/dist/{chunk-QRN6HQOX.js.map → chunk-UTSKVISR.js.map} +1 -1
- package/dist/{chunk-TDJZFBHI.mjs → chunk-VQL7XDIY.mjs} +8 -9
- package/dist/chunk-VQL7XDIY.mjs.map +1 -0
- package/dist/{chunk-VJV7WUR2.mjs → chunk-WRRVYPMY.mjs} +3 -5
- package/dist/chunk-WRRVYPMY.mjs.map +1 -0
- package/dist/{chunk-W5MHX6SO.mjs → chunk-X5FQXU5J.mjs} +3 -3
- package/dist/{chunk-W5MHX6SO.mjs.map → chunk-X5FQXU5J.mjs.map} +1 -1
- package/dist/{chunk-MWIIHMYS.mjs → chunk-XUVD6I2E.mjs} +3 -3
- package/dist/{chunk-MWIIHMYS.mjs.map → chunk-XUVD6I2E.mjs.map} +1 -1
- package/dist/{chunk-4EXBEFIV.mjs → chunk-YA2XM3KX.mjs} +4 -4
- package/dist/{chunk-4EXBEFIV.mjs.map → chunk-YA2XM3KX.mjs.map} +1 -1
- package/dist/{chunk-W4NTPOBD.js → chunk-YTVVICWW.js} +5 -5
- package/dist/{chunk-W4NTPOBD.js.map → chunk-YTVVICWW.js.map} +1 -1
- package/dist/{chunk-IDBA3YZ6.mjs → chunk-YVP4JJFL.mjs} +4 -4
- package/dist/{chunk-IDBA3YZ6.mjs.map → chunk-YVP4JJFL.mjs.map} +1 -1
- package/dist/{chunk-UFG2TUBG.js → chunk-ZNYYWNCH.js} +3 -3
- package/dist/{chunk-UFG2TUBG.js.map → chunk-ZNYYWNCH.js.map} +1 -1
- package/dist/cli/index.js +3 -3
- package/dist/cli/index.mjs +1 -1
- package/dist/client/index.js +4 -4
- package/dist/client/index.mjs +3 -3
- package/dist/commerce/index.js +57 -57
- package/dist/commerce/index.mjs +5 -5
- package/dist/engage/index.js +10 -10
- package/dist/engage/index.mjs +7 -7
- package/dist/fleet/index.js +8 -8
- package/dist/fleet/index.mjs +4 -4
- package/dist/forms/FileField.d.ts +2 -4
- package/dist/forms/FileField.d.ts.map +1 -1
- package/dist/forms/FormClient.d.ts +6 -2
- package/dist/forms/FormClient.d.ts.map +1 -1
- package/dist/forms/FormEnhancer.d.ts +2 -1
- package/dist/forms/FormEnhancer.d.ts.map +1 -1
- package/dist/forms/FormField.d.ts.map +1 -1
- package/dist/forms/ManagedForm.d.ts +1 -1
- package/dist/forms/ManagedForm.d.ts.map +1 -1
- package/dist/forms/ServerForm.d.ts +3 -7
- package/dist/forms/ServerForm.d.ts.map +1 -1
- package/dist/forms/StaticForm.d.ts +17 -18
- package/dist/forms/StaticForm.d.ts.map +1 -1
- package/dist/forms/index.js +18 -18
- package/dist/forms/index.mjs +10 -10
- package/dist/forms/server.js +8 -13
- package/dist/forms/server.js.map +1 -1
- package/dist/forms/server.mjs +7 -12
- package/dist/forms/server.mjs.map +1 -1
- package/dist/forms/static.js +5 -8
- package/dist/forms/static.mjs +4 -7
- package/dist/forms/types.d.ts +3 -9
- package/dist/forms/types.d.ts.map +1 -1
- package/dist/images/index.js +11 -11
- package/dist/images/index.mjs +4 -4
- package/dist/index.js +63 -63
- package/dist/index.mjs +9 -9
- package/dist/layout/SiteKitClientProviders.d.ts +1 -3
- package/dist/layout/SiteKitClientProviders.d.ts.map +1 -1
- package/dist/layout/SiteKitLayout.d.ts.map +1 -1
- package/dist/layout/client.d.ts +1 -3
- 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 -11
- package/dist/layout/index.js.map +1 -1
- package/dist/layout/index.mjs +8 -9
- package/dist/layout/index.mjs.map +1 -1
- package/dist/maps/api.d.ts +2 -2
- package/dist/maps/index.js +6 -6
- package/dist/maps/index.js.map +1 -1
- package/dist/maps/index.mjs +4 -4
- package/dist/maps/index.mjs.map +1 -1
- package/dist/search/index.js +4 -4
- package/dist/search/index.mjs +3 -3
- package/dist/seo/client.js +5 -5
- package/dist/seo/client.mjs +4 -4
- package/dist/seo/index.js +5 -5
- package/dist/seo/index.mjs +4 -4
- package/dist/server/index.js +3 -3
- package/dist/server/index.mjs +2 -2
- package/dist/shared/publishCredential.d.ts +1 -9
- package/dist/shared/publishCredential.d.ts.map +1 -1
- package/dist/shared/version.d.ts +1 -1
- package/dist/signal/index.js +11 -11
- package/dist/signal/index.mjs +2 -2
- package/dist/sync/index.js +17 -17
- package/dist/sync/index.mjs +4 -4
- package/package.json +1 -1
- package/dist/ChatWidget-36IDUB53.mjs +0 -17
- package/dist/EngageWidget-ILRTLGBB.mjs +0 -12
- package/dist/EngageWidget-YHMSB4YE.js +0 -21
- package/dist/FileField-DXGPA4OB.mjs.map +0 -1
- package/dist/FileField-LMSLNNRX.js.map +0 -1
- package/dist/ManagedForm-AIPXF5QY.mjs +0 -16
- package/dist/ManagedForm-T464AA5B.js +0 -25
- package/dist/SitemapSync-MT3I4W3B.js +0 -18
- package/dist/SitemapSync-RG554AJR.mjs +0 -9
- package/dist/chunk-4HSZPHF7.mjs.map +0 -1
- package/dist/chunk-4KSE642V.js.map +0 -1
- package/dist/chunk-6FASIYCV.js +0 -224
- package/dist/chunk-6FASIYCV.js.map +0 -1
- package/dist/chunk-A3QAZJXC.js.map +0 -1
- package/dist/chunk-A4WYSHIX.js.map +0 -1
- package/dist/chunk-A5R62CXI.mjs.map +0 -1
- package/dist/chunk-C654VCWV.mjs +0 -6
- package/dist/chunk-HIG7COWF.mjs +0 -60
- package/dist/chunk-HIG7COWF.mjs.map +0 -1
- package/dist/chunk-JPXT5LY2.js.map +0 -1
- package/dist/chunk-NO4JQ2G3.mjs.map +0 -1
- package/dist/chunk-QRL3QDUE.js.map +0 -1
- package/dist/chunk-RH46WZRN.mjs +0 -219
- package/dist/chunk-RH46WZRN.mjs.map +0 -1
- package/dist/chunk-TDJZFBHI.mjs.map +0 -1
- package/dist/chunk-U274XAMD.js.map +0 -1
- package/dist/chunk-VJV7WUR2.mjs.map +0 -1
- package/dist/chunk-XA2GJFVM.js.map +0 -1
- package/dist/chunk-XV2FFSJU.mjs.map +0 -1
- package/dist/chunk-YCE6HRWW.js.map +0 -1
- package/dist/chunk-YUCKBIRE.mjs.map +0 -1
- package/dist/chunk-ZKOQCKOR.js +0 -8
- package/dist/forms/native-fallback.d.ts +0 -41
- package/dist/forms/native-fallback.d.ts.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/forms/delight.tsx","../src/forms/FormField.tsx"],"names":["jsx","jsxs"],"mappings":";;;;;AAmCA,IAAM,QAAA,GAAW,gBAAA;AAEjB,IAAM,GAAA,GAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AA8JL,SAAS,aAAA,GAAgB;AAC9B,EAAA,uBAAOA,cAAA,CAAC,WAAM,EAAA,EAAI,QAAA,EAAU,yBAAyB,EAAE,MAAA,EAAQ,KAAI,EAAG,CAAA;AACxE;AAGO,SAAS,cAAA,GAAiB;AAC/B,EAAA,sCACG,MAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU,cAAA,EAAa,oBAAmB,aAAA,EAAY,MAAA,EACpE,QAAA,kBAAAA,cAAA,CAAC,KAAA,EAAA,EAAI,OAAM,IAAA,EAAK,MAAA,EAAO,MAAK,OAAA,EAAQ,WAAA,EAAY,MAAK,MAAA,EACnD,QAAA,kBAAAA,cAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,CAAA,EAAE,oBAAA;AAAA,MACF,MAAA,EAAO,oCAAA;AAAA,MACP,WAAA,EAAY,KAAA;AAAA,MACZ,aAAA,EAAc,OAAA;AAAA,MACd,cAAA,EAAe;AAAA;AAAA,KAEnB,CAAA,EACF,CAAA;AAEJ;AAaO,SAAS,YAAA,CAAa,EAAE,IAAA,EAAM,KAAA,EAAM,EAAsB;AAC/D,EAAA,IAAI,KAAA,GAAQ,GAAG,OAAO,IAAA;AACtB,EAAA,MAAM,GAAA,GAAM,KAAK,KAAA,CAAO,IAAA,CAAK,IAAI,IAAA,EAAM,KAAK,CAAA,GAAI,KAAA,GAAS,GAAG,CAAA;AAC5D,EAAA,MAAM,QAAQ,IAAA,IAAQ,KAAA;AACtB,EAAA,uBACEC,eAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,aAAA;AAAA,MACV,cAAA,EAAa,UAAA;AAAA,MACb,kBAAA,EAAkB,GAAA;AAAA,MAClB,kBAAA,EAAkB,QAAQ,MAAA,GAAS,MAAA;AAAA,MACnC,IAAA,EAAK,aAAA;AAAA,MACL,eAAA,EAAe,IAAA;AAAA,MACf,eAAA,EAAe,CAAA;AAAA,MACf,eAAA,EAAe,KAAA;AAAA,MACf,YAAA,EAAW,eAAA;AAAA,MAEX,QAAA,EAAA;AAAA,wBAAAA,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAA,EAAoB,cAAA,EAAa,gBAAA,EAC9C,QAAA,EAAA;AAAA,0BAAAD,cAAA,CAAC,KAAA,EAAA,EAAI,WAAU,kBAAA,EAAmB,cAAA,EAAa,iBAAgB,KAAA,EAAO,EAAE,OAAO,CAAA,EAAG,GAAG,KAAI,EAEvF,QAAA,kBAAAA,cAAA,CAAC,UAAe,SAAA,EAAU,mBAAA,EAAoB,gBAAa,gBAAA,EAAiB,aAAA,EAAY,MAAA,EAAA,EAA7E,GAAoF,CAAA,EACjG,CAAA;AAAA,0BACAA,cAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,mBAAA;AAAA,cACV,cAAA,EAAa,gBAAA;AAAA,cACb,KAAA,EAAO,EAAE,IAAA,EAAM,CAAA,KAAA,EAAQ,GAAG,CAAA,QAAA,CAAA,EAAW;AAAA,cACrC,aAAA,EAAY;AAAA;AAAA;AACd,SAAA,EACF,CAAA;AAAA,wBACAA,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mBAAA,EAAoB,gBAAa,gBAAA,EAAiB,aAAA,EAAY,MAAA,EAC3E,QAAA,EAAA,KAAA,GAAQ,OAAA,GAAU,CAAA,EAAG,IAAI,CAAA,IAAA,EAAO,KAAK,CAAA,CAAA,EACxC;AAAA;AAAA;AAAA,GACF;AAEJ;ACtLA,SAAS,iBAAiB,OAAA,EAAsD;AAC9E,EAAA,IAAI,CAAC,OAAA,EAAS,OAAO,EAAC;AACtB,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC1B,IAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,KAAQ;AAC1B,MAAA,IAAI,OAAO,QAAQ,QAAA,EAAU,OAAO,EAAE,KAAA,EAAO,GAAA,EAAK,OAAO,GAAA,EAAI;AAC7D,MAAA,IAAI,OAAO,QAAQ,QAAA,IAAY,GAAA,KAAQ,QAAQ,OAAA,IAAW,GAAA,IAAO,OAAA,IAAW,GAAA,EAAK,OAAO,GAAA;AACxF,MAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,KAAQ,QAAQ,OAAA,IAAW,GAAA,EAAK,OAAO,EAAE,KAAA,EAAQ,GAAA,CAAY,KAAA,EAAO,KAAA,EAAQ,IAAY,KAAA,EAAM;AAC7H,MAAA,OAAO,EAAE,OAAO,MAAA,CAAO,GAAG,GAAG,KAAA,EAAO,MAAA,CAAO,GAAG,CAAA,EAAE;AAAA,IAClD,CAAC,CAAA;AAAA,EACH;AACA,EAAA,IAAI,OAAO,OAAA,KAAY,QAAA,IAAY,OAAA,KAAY,IAAA,EAAM;AACnD,IAAA,MAAM,GAAA,GAAM,OAAA;AACZ,IAAA,IAAI,KAAA,CAAM,QAAQ,GAAA,CAAI,OAAO,GAAG,OAAO,gBAAA,CAAiB,IAAI,OAAO,CAAA;AACnE,IAAA,IAAI,KAAA,CAAM,QAAQ,GAAA,CAAI,KAAK,GAAG,OAAO,gBAAA,CAAiB,IAAI,KAAK,CAAA;AAC/D,IAAA,IAAI,KAAA,CAAM,QAAQ,GAAA,CAAI,OAAO,GAAG,OAAO,gBAAA,CAAiB,IAAI,OAAO,CAAA;AAAA,EACrE;AACA,EAAA,OAAO,EAAC;AACV;AAEO,SAAS,SAAA,CAAU,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,QAAA,EAAU,OAAA,EAAS,MAAA,EAAQ,WAAA,GAAc,SAAA,EAAY,SAAA,EAAW,QAAA,EAAS,EAAmB;AAG3I,EAAA,MAAM,WAAA,GAAc,OAAO,QAAA,KAAa,UAAA;AACxC,EAAA,MAAM,IAAA,GAAO,CAAC,CAAA,KAAe,QAAA,GAAW,CAAC,CAAA;AAEzC,EAAA,MAAM,OAAO,CAAC,CAAA,KACZ,cACI,EAAE,KAAA,EAAO,GAAG,QAAA,EAAU,CAAC,MAAW,IAAA,CAAK,CAAA,CAAE,OAAO,KAAK,CAAA,KACrD,EAAE,YAAA,EAAc,KAAK,MAAA,EAAU;AAErC,EAAA,MAAM,OAAA,GAAU,CAAA,GAAA,EAAO,KAAA,CAA0B,EAAA,IAAM,MAAM,IAAI,CAAA,CAAA;AAEjE,EAAA,MAAM,OAAA,GAAU,gBAAA,CAAiB,KAAA,CAAM,OAAO,CAAA;AAE9C,EAAA,MAAM,cAAA,GAAsC;AAAA,IAC1C,KAAA,EAAO,MAAA;AAAA,IACP,OAAA,EAAS,oCAAA;AAAA,IACT,QAAA,EAAU,2BAAA;AAAA,IACV,MAAA,EAAQ,QACJ,2EAAA,GACA,qEAAA;AAAA,IACJ,YAAA,EAAc,6BAAA;AAAA,IACd,eAAA,EAAiB,6BAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAUjB,KAAA,EAAO,uDAAA;AAAA,IACP,OAAA,EAAS,MAAA;AAAA,IACT,UAAA,EAAY;AAAA,GACd;AAEA,EAAA,MAAM,UAAA,GAAkC;AAAA,IACtC,OAAA,EAAS,OAAA;AAAA,IACT,YAAA,EAAc,CAAA;AAAA,IACd,UAAA,EAAY,6BAAA;AAAA,IACZ,KAAA,EAAO;AAAA,GACT;AAEA,EAAA,MAAM,UAAA,GAAkC;AAAA,IACtC,KAAA,EAAO,0BAAA;AAAA,IACP,QAAA,EAAU,EAAA;AAAA,IACV,SAAA,EAAW;AAAA,GACb;AAEA,EAAA,MAAM,SAAA,GAAiC;AAAA,IACrC,KAAA,EAAO,kCAAA;AAAA,IACP,QAAA,EAAU,EAAA;AAAA,IACV,SAAA,EAAW;AAAA,GACb;AAGA,EAAA,IAAI,KAAA,CAAM,UAAA,KAAe,SAAA,IAAa,KAAA,CAAM,eAAe,gBAAA,EAAkB;AAC3E,IAAA,uBAAOA,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAW,CAAA,EAAG,WAAW,CAAA,SAAA,CAAA,EAAa,KAAA,EAAO,EAAE,MAAA,EAAQ,cAAc,UAAA,EAAY,GAAA,EAAK,UAAU,EAAA,EAAG,EAAI,gBAAM,KAAA,EAAM,CAAA;AAAA,EAChI;AAGA,EAAA,IAAI,KAAA,CAAM,eAAe,WAAA,EAAa;AACpC,IAAA,uBAAOA,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAW,CAAA,EAAG,WAAW,CAAA,WAAA,CAAA,EAAe,KAAA,EAAO,EAAE,KAAA,EAAO,oCAAoC,MAAA,EAAQ,OAAA,IAAY,QAAA,EAAA,KAAA,CAAM,SAAA,IAAa,MAAM,KAAA,EAAM,CAAA;AAAA,EAC3J;AAGA,EAAA,IAAI,KAAA,CAAM,eAAe,QAAA,EAAU;AACjC,IAAA,OAAO,WAAA,mBACHA,cAAAA,CAAC,OAAA,EAAA,EAAM,IAAA,EAAK,QAAA,EAAS,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,KAAA,EAAO,MAAA,CAAO,KAAA,IAAS,EAAE,CAAA,EAAG,QAAA,EAAQ,IAAA,EAAC,CAAA,mBAC5EA,cAAAA,CAAC,OAAA,EAAA,EAAM,IAAA,EAAK,QAAA,EAAS,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,YAAA,EAAc,MAAA,CAAO,KAAA,IAAS,EAAE,CAAA,EAAG,CAAA;AAAA,EAChF;AAEA,EAAA,MAAM,SAAA,GAAY,CAAC,CAAE,KAAA,CAAmC,UAAA;AACxD,EAAA,MAAM,oBAAA,GAAuB,SAAA,GAAY,KAAA,CAAM,KAAA,GAAQ,KAAA,CAAM,WAAA;AAK7D,EAAA,MAAM,UAAA,GAAa,WAAA,KAAgB,OAAA,IAAW,MAAA,CAAA,GAC1C;AAAA,IACE,OAAA,EAAS,CAAC,CAAA,KAAwC;AAChD,MAAA,IAAI,CAAC,CAAA,CAAE,aAAA,CAAc,SAAS,CAAA,CAAE,aAA4B,GAAG,OAAA,IAAU;AAAA,IAC3E,CAAA;AAAA,IACA,MAAA,EAAQ,CAAC,CAAA,KAAwC;AAC/C,MAAA,IAAI,CAAC,CAAA,CAAE,aAAA,CAAc,SAAS,CAAA,CAAE,aAA4B,GAAG,MAAA,IAAS;AAAA,IAC1E;AAAA,MAEF,EAAC;AAEL,EAAA,uBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,EAAG,WAAW,CAAA,QAAA,EAAW,WAAW,CAAA,SAAA,EAAY,KAAA,CAAM,UAAU,CAAA,CAAA,EAAK,GAAG,UAAA,EACtF,QAAA,EAAA;AAAA,oBAAAA,gBAAC,OAAA,EAAA,EAAM,OAAA,EAAS,OAAA,EAAS,SAAA,EAAW,GAAG,WAAW,CAAA,OAAA,CAAA,EAAW,KAAA,EAAO,EAAE,GAAG,UAAA,EAAY,GAAI,SAAA,GAAY,EAAE,UAAU,UAAA,EAAY,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,GAAG,OAAA,EAAS,CAAA,EAAG,MAAA,EAAQ,EAAA,EAAI,UAAU,QAAA,EAAU,IAAA,EAAM,eAAA,EAAiB,UAAA,EAAY,UAAU,MAAA,EAAQ,CAAA,EAAE,GAAI,IAAI,EAC1P,QAAA,EAAA;AAAA,MAAA,KAAA,CAAM,KAAA;AAAA,MACN,KAAA,CAAM,WAAA,oBAAeD,cAAAA,CAAC,MAAA,EAAA,EAAK,OAAO,EAAE,KAAA,EAAO,0BAAA,EAA2B,EAAG,QAAA,EAAA,IAAA,EAAE;AAAA,KAAA,EAC9E,CAAA;AAAA,IAGC,CAAC,MAAA,EAAQ,OAAA,EAAS,OAAA,EAAS,KAAA,EAAO,QAAQ,CAAA,CAAE,QAAA,CAAS,KAAA,CAAM,UAAU,CAAA,oBACpEC,gBAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,QAAA,EAAU,UAAA,EAAW,EAAG,gBAAa,kBAAA,EAAmB,eAAA,EAAe,SAAA,GAAY,MAAA,GAAS,MAAA,EACxG,QAAA,EAAA;AAAA,sBAAAD,cAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,EAAA,EAAI,OAAA;AAAA,UACJ,SAAA,EAAW,GAAG,WAAW,CAAA,OAAA,CAAA;AAAA,UACzB,IAAA,EAAM,MAAM,UAAA,KAAe,OAAA,IAAW,MAAM,UAAA,KAAe,KAAA,GAAQ,QAAQ,KAAA,CAAM,UAAA;AAAA,UACjF,MAAM,KAAA,CAAM,IAAA;AAAA,UACX,GAAG,IAAA,CAAK,MAAA,CAAO,KAAA,IAAS,EAAE,CAAC,CAAA;AAAA,UAC5B,WAAA,EAAa,oBAAA;AAAA,UACb,UAAU,KAAA,CAAM,WAAA;AAAA,UAChB,KAAA,EAAO;AAAA;AAAA,OACT;AAAA,MACC,SAAA,oBAAaA,cAAAA,CAAC,cAAA,EAAA,EAAe;AAAA,KAAA,EAChC,CAAA;AAAA,IAID,KAAA,CAAM,UAAA,KAAe,UAAA,oBACpBA,cAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,EAAA,EAAI,OAAA;AAAA,QACJ,SAAA,EAAW,GAAG,WAAW,CAAA,UAAA,CAAA;AAAA,QACzB,MAAM,KAAA,CAAM,IAAA;AAAA,QACX,GAAG,IAAA,CAAK,MAAA,CAAO,KAAA,IAAS,EAAE,CAAC,CAAA;AAAA,QAC5B,WAAA,EAAa,oBAAA;AAAA,QACb,UAAU,KAAA,CAAM,WAAA;AAAA,QAChB,IAAA,EAAM,CAAA;AAAA,QACN,KAAA,EAAO,EAAE,GAAG,cAAA,EAAgB,QAAQ,UAAA;AAAW;AAAA,KACjD;AAAA,IAID,KAAA,CAAM,UAAA,KAAe,QAAA,oBACpBC,eAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,EAAA,EAAI,OAAA;AAAA,QACJ,SAAA,EAAW,GAAG,WAAW,CAAA,QAAA,CAAA;AAAA,QACzB,MAAM,KAAA,CAAM,IAAA;AAAA,QACX,GAAG,IAAA,CAAK,MAAA,CAAO,KAAA,IAAS,EAAE,CAAC,CAAA;AAAA,QAC5B,UAAU,KAAA,CAAM,WAAA;AAAA,QAChB,KAAA,EAAO,cAAA;AAAA,QAEP,QAAA,EAAA;AAAA,0BAAAD,cAAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,EAAA,EAAI,kCAAwB,kBAAA,EAAmB,CAAA;AAAA,UAC5D,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,qBACZA,cAAAA,CAAC,QAAA,EAAA,EAA0B,KAAA,EAAO,MAAA,CAAO,KAAA,EACtC,QAAA,EAAA,MAAA,CAAO,KAAA,EAAA,EADG,MAAA,CAAO,KAEpB,CACD;AAAA;AAAA;AAAA,KACH;AAAA,IAID,KAAA,CAAM,UAAA,KAAe,cAAA,oBACpBA,cAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,EAAA,EAAI,OAAA;AAAA,QACJ,SAAA,EAAW,CAAA,EAAG,WAAW,CAAA,SAAA,EAAY,WAAW,CAAA,eAAA,CAAA;AAAA,QAChD,MAAM,KAAA,CAAM,IAAA;AAAA,QACX,GAAI,WAAA,GACD;AAAA,UACE,OAAO,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAK,QAAqB,EAAC;AAAA,UACrD,QAAA,EAAU,CAAC,CAAA,KACT,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,CAAA,CAAE,MAAA,CAAO,eAAA,EAAiB,CAAC,GAAA,KAAa,GAAA,CAAI,KAAK,CAAC;AAAA,SACtE,GACA,EAAE,YAAA,EAAc,KAAA,CAAM,QAAQ,KAAK,CAAA,GAAK,KAAA,GAAqB,EAAC,EAAE;AAAA,QACpE,UAAU,KAAA,CAAM,WAAA;AAAA,QAChB,QAAA,EAAQ,IAAA;AAAA,QACR,KAAA,EAAO,EAAE,GAAG,cAAA,EAAgB,QAAQ,GAAA,EAAI;AAAA,QAEvC,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,qBACZA,cAAAA,CAAC,QAAA,EAAA,EAA0B,KAAA,EAAO,MAAA,CAAO,KAAA,EACtC,QAAA,EAAA,MAAA,CAAO,KAAA,EAAA,EADG,MAAA,CAAO,KAEpB,CACD;AAAA;AAAA,KACH;AAAA,IAID,MAAM,UAAA,KAAe,OAAA,oBACpBA,cAAAA,CAAC,SAAI,SAAA,EAAW,CAAA,EAAG,WAAW,CAAA,aAAA,CAAA,EAAiB,OAAO,EAAE,OAAA,EAAS,QAAQ,aAAA,EAAe,QAAA,EAAU,KAAK,CAAA,EAAE,EACtG,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,qBACZC,eAAAA,CAAC,OAAA,EAAA,EAAyB,WAAW,CAAA,EAAG,WAAW,CAAA,cAAA,CAAA,EAAkB,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,YAAY,QAAA,EAAU,GAAA,EAAK,GAAE,EAC1H,QAAA,EAAA;AAAA,sBAAAD,cAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,OAAA;AAAA,UACL,MAAM,KAAA,CAAM,IAAA;AAAA,UACZ,OAAO,MAAA,CAAO,KAAA;AAAA,UACb,GAAI,WAAA,GACD,EAAE,SAAS,KAAA,KAAU,MAAA,CAAO,OAAO,QAAA,EAAU,MAAM,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA,EAAE,GACtE,EAAE,cAAA,EAAgB,KAAA,KAAU,OAAO,KAAA,EAAM;AAAA,UAC7C,UAAU,KAAA,CAAM;AAAA;AAAA,OAClB;AAAA,MACC,MAAA,CAAO;AAAA,KAAA,EAAA,EAVE,MAAA,CAAO,KAWnB,CACD,CAAA,EACH,CAAA;AAAA,IAID,KAAA,CAAM,eAAe,UAAA,IAAc,OAAA,CAAQ,WAAW,CAAA,oBACrDC,gBAAC,OAAA,EAAA,EAAM,SAAA,EAAW,GAAG,WAAW,CAAA,UAAA,CAAA,EAAc,OAAO,EAAE,OAAA,EAAS,QAAQ,UAAA,EAAY,QAAA,EAAU,GAAA,EAAK,CAAA,EAAE,EACnG,QAAA,EAAA;AAAA,sBAAAD,cAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,UAAA;AAAA,UACL,MAAM,KAAA,CAAM,IAAA;AAAA,UACX,GAAI,cACD,EAAE,OAAA,EAAS,CAAC,CAAC,KAAA,EAAO,UAAU,CAAC,CAAA,KAAW,KAAK,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,EAAE,GACjE,EAAE,cAAA,EAAgB,CAAC,CAAC,KAAA,EAAM;AAAA,UAC9B,UAAU,KAAA,CAAM;AAAA;AAAA,OAClB;AAAA,MACC,KAAA,CAAM,aAAa,KAAA,CAAM;AAAA,KAAA,EAC5B,CAAA;AAAA,IAID,KAAA,CAAM,UAAA,KAAe,UAAA,IAAc,OAAA,CAAQ,MAAA,GAAS,qBACnDA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,EAAG,WAAW,oBAAoB,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,aAAA,EAAe,QAAA,EAAU,GAAA,EAAK,CAAA,EAAE,EACzG,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,KAAW;AACvB,MAAA,MAAM,iBAAiB,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,QAAQ,EAAC;AACvD,MAAA,MAAM,SAAA,GAAY,cAAA,CAAe,QAAA,CAAS,MAAA,CAAO,KAAK,CAAA;AAEtD,MAAA,uBACEC,eAAAA,CAAC,OAAA,EAAA,EAAyB,SAAA,EAAW,GAAG,WAAW,CAAA,iBAAA,CAAA,EAAqB,KAAA,EAAO,EAAE,SAAS,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,GAAA,EAAK,GAAE,EAC7H,QAAA,EAAA;AAAA,wBAAAD,cAAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,UAAA;AAAA,YACL,MAAM,KAAA,CAAM,IAAA;AAAA,YACZ,OAAO,MAAA,CAAO,KAAA;AAAA,YACb,GAAI,WAAA,GACD;AAAA,cACE,OAAA,EAAS,SAAA;AAAA,cACT,UAAU,MACR,IAAA;AAAA,gBACE,SAAA,GACI,cAAA,CAAe,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,KAAM,MAAA,CAAO,KAAK,CAAA,GAC/C,CAAC,GAAG,cAAA,EAAgB,OAAO,KAAK;AAAA;AACtC,aACJ,GACA,EAAE,cAAA,EAAgB,SAAA;AAAU;AAAA,SAClC;AAAA,QACC,MAAA,CAAO;AAAA,OAAA,EAAA,EAjBE,OAAO,KAkBnB,CAAA;AAAA,IAEJ,CAAC,CAAA,EACH,CAAA;AAAA,IAID,MAAM,UAAA,KAAe,MAAA,KACpB,WAAA,IAAe,QAAA,EAAU,uBACvBA,cAAAA;AAAA,MAAC,QAAA,CAAS,IAAA;AAAA,MAAT;AAAA,QACC,EAAA,EAAI,OAAA;AAAA,QACJ,MAAM,KAAA,CAAM,IAAA;AAAA,QACZ,KAAA,EAAO,MAAA,CAAO,KAAA,IAAS,EAAE,CAAA;AAAA,QACzB,QAAA,EAAU,IAAA;AAAA,QACV,UAAU,KAAA,CAAM,WAAA;AAAA,QAChB,WAAA,EAAa,MAAM,WAAA,IAAe,eAAA;AAAA,QAClC,SAAA,EAAW,CAAA,EAAG,WAAW,CAAA,QAAA,EAAW,WAAW,CAAA,aAAA;AAAA;AAAA,KACjD;AAAA;AAAA;AAAA,sBAIAA,cAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,EAAA,EAAI,OAAA;AAAA,UACJ,SAAA,EAAW,CAAA,EAAG,WAAW,CAAA,QAAA,EAAW,WAAW,CAAA,aAAA,CAAA;AAAA,UAC/C,IAAA,EAAK,MAAA;AAAA,UACL,MAAM,KAAA,CAAM,IAAA;AAAA,UACZ,YAAA,EAAc,MAAA,CAAO,KAAA,IAAS,EAAE,CAAA,IAAK,MAAA;AAAA,UACrC,UAAU,KAAA,CAAM,WAAA;AAAA,UAChB,KAAA,EAAO;AAAA;AAAA;AACT,KAAA,CAAA;AAAA,IAKH,KAAA,CAAM,UAAA,KAAe,MAAA,oBACpBA,cAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,EAAA,EAAI,OAAA;AAAA,QACJ,SAAA,EAAW,CAAA,EAAG,WAAW,CAAA,QAAA,EAAW,WAAW,CAAA,aAAA,CAAA;AAAA,QAC/C,IAAA,EAAK,MAAA;AAAA,QACL,MAAM,KAAA,CAAM,IAAA;AAAA,QACX,GAAG,IAAA,CAAK,MAAA,CAAO,KAAA,IAAS,EAAE,CAAC,CAAA;AAAA,QAC5B,UAAU,KAAA,CAAM,WAAA;AAAA,QAChB,KAAA,EAAO;AAAA;AAAA,KACT;AAAA,IAID,KAAA,CAAM,UAAA,KAAe,UAAA,oBACpBA,cAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,EAAA,EAAI,OAAA;AAAA,QACJ,SAAA,EAAW,CAAA,EAAG,WAAW,CAAA,QAAA,EAAW,WAAW,CAAA,iBAAA,CAAA;AAAA,QAC/C,IAAA,EAAK,gBAAA;AAAA,QACL,MAAM,KAAA,CAAM,IAAA;AAAA,QACX,GAAG,IAAA,CAAK,MAAA,CAAO,KAAA,IAAS,EAAE,CAAC,CAAA;AAAA,QAC5B,UAAU,KAAA,CAAM,WAAA;AAAA,QAChB,KAAA,EAAO;AAAA;AAAA,KACT;AAAA,IAID,MAAM,UAAA,KAAe,MAAA,KACpB,WAAA,IAAe,QAAA,EAAU,uBACvBA,cAAAA;AAAA,MAAC,QAAA,CAAS,IAAA;AAAA,MAAT;AAAA,QACC,KAAA;AAAA,QACA,OAAA;AAAA,QACA,WAAA;AAAA,QACA,cAAA;AAAA,QACA,QAAA,EAAU;AAAA;AAAA,KACZ;AAAA;AAAA;AAAA,sBAIAA,cAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,EAAA,EAAI,OAAA;AAAA,UACJ,SAAA,EAAW,CAAA,EAAG,WAAW,CAAA,QAAA,EAAW,WAAW,CAAA,aAAA,CAAA;AAAA,UAC/C,IAAA,EAAK,MAAA;AAAA,UACL,MAAM,KAAA,CAAM,IAAA;AAAA,UACZ,UAAU,KAAA,CAAM,WAAA;AAAA,UAChB,KAAA,EAAO;AAAA;AAAA;AACT,KAAA,CAAA;AAAA,IAKH,KAAA,CAAM,UAAA,KAAe,QAAA,oBACpBC,eAAAA,CAAC,SAAI,SAAA,EAAW,CAAA,EAAG,WAAW,CAAA,QAAA,CAAA,EAAY,KAAA,EAAO,EAAE,SAAS,MAAA,EAAQ,GAAA,EAAK,CAAA,EAAE,EAAG,IAAA,EAAM,WAAA,GAAc,MAAA,GAAY,YAAA,EAAc,YAAA,EAAY,WAAA,GAAc,MAAA,GAAY,KAAA,CAAM,KAAA,EACrK,QAAA,EAAA;AAAA,MAAA,CAAC,WAAA,IAAe,CAAC,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAG,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,IAAA;AAAA;AAAA;AAAA,wBAGpCA,eAAAA,CAAC,OAAA,EAAA,EAAuB,WAAW,CAAA,EAAG,WAAW,iBAAiB,KAAA,EAAO,EAAE,QAAA,EAAU,EAAA,EAAI,QAAQ,SAAA,EAAW,KAAA,EAAQ,SAAoB,IAAA,GAAO,kCAAA,GAAqC,sCAAqC,EACvN,QAAA,EAAA;AAAA,0BAAAD,cAAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,OAAA;AAAA,cACL,MAAM,KAAA,CAAM,IAAA;AAAA,cACZ,KAAA,EAAO,IAAA;AAAA,cACP,gBAAiB,KAAA,KAAqB,IAAA;AAAA,cACtC,QAAA,EAAU,KAAA,CAAM,WAAA,IAAe,IAAA,KAAS,CAAA;AAAA,cACxC,KAAA,EAAO,EAAE,QAAA,EAAU,UAAA,EAAY,OAAO,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,OAAA,EAAS,CAAA;AAAE;AAAA,WACjE;AAAA,0BACAA,cAAAA,CAAC,MAAA,EAAA,EAAK,YAAA,EAAY,CAAA,EAAG,IAAI,CAAA,KAAA,EAAQ,IAAA,GAAO,CAAA,GAAI,GAAA,GAAM,EAAE,CAAA,CAAA,EAAI,QAAA,EAAA,QAAA,EAAC;AAAA,SAAA,EAAA,EAT/C,CAAA,CAAA,EAAI,IAAI,CAAA,CAUpB;AAAA,OACD,CAAA;AAAA,MACA,WAAA,IAAe,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,IAAA,qBACnCA,cAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UAEC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,MAAM,IAAA,CAAK,IAAI,CAAA;AAAA,UACxB,SAAA,EAAW,GAAG,WAAW,CAAA,aAAA,CAAA;AAAA,UACzB,KAAA,EAAO;AAAA,YACL,UAAA,EAAY,MAAA;AAAA,YACZ,MAAA,EAAQ,MAAA;AAAA,YACR,QAAA,EAAU,EAAA;AAAA,YACV,MAAA,EAAQ,SAAA;AAAA,YACR,KAAA,EAAQ,KAAA,IAAoB,IAAA,GAAO,kCAAA,GAAqC;AAAA,WAC1E;AAAA,UACD,QAAA,EAAA;AAAA,SAAA;AAAA,QAXM;AAAA,OAcR;AAAA,KAAA,EACH,CAAA;AAAA,IAID,KAAA,CAAM,eAAe,QAAA,oBACpBC,gBAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,EAAG,WAAW,CAAA,QAAA,CAAA,EAC5B,QAAA,EAAA;AAAA,sBAAAD,cAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,EAAA,EAAI,OAAA;AAAA,UACJ,IAAA,EAAK,OAAA;AAAA,UACL,MAAM,KAAA,CAAM,IAAA;AAAA,UACX,GAAI,WAAA,GACD,EAAE,KAAA,EAAO,MAAA,CAAO,SAAS,EAAE,CAAA,EAAG,QAAA,EAAU,CAAC,CAAA,KAAW,IAAA,CAAK,OAAO,CAAA,CAAE,MAAA,CAAO,KAAK,CAAC,CAAA,EAAE,GACjF,EAAE,YAAA,EAAc,MAAA,CAAO,KAAA,IAAS,EAAE,CAAA,EAAE;AAAA,UACxC,GAAA,EAAK,KAAA,CAAM,UAAA,EAAY,GAAA,IAAO,CAAA;AAAA,UAC9B,GAAA,EAAK,KAAA,CAAM,UAAA,EAAY,GAAA,IAAO,GAAA;AAAA,UAC9B,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA;AAAO;AAAA,OACzB;AAAA,sBACAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,EAAG,WAAW,CAAA,cAAA,CAAA,EAAkB,KAAA,EAAO,EAAE,SAAA,EAAW,UAAU,SAAA,EAAW,CAAA,IAAM,QAAA,EAAA,MAAA,CAAO,KAAA,IAAS,EAAE,CAAA,EAAE;AAAA,KAAA,EACrH,CAAA;AAAA,IAID,KAAA,oBAASA,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAW,GAAG,WAAW,CAAA,OAAA,CAAA,EAAW,KAAA,EAAO,UAAA,EAAa,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,IAG1E,MAAM,SAAA,IAAa,CAAC,KAAA,IAAS,KAAA,CAAM,eAAe,UAAA,oBACjDA,cAAAA,CAAC,GAAA,EAAA,EAAE,WAAW,CAAA,EAAG,WAAW,UAAU,KAAA,EAAO,SAAA,EAAY,gBAAM,SAAA,EAAU;AAAA,GAAA,EAE7E,CAAA;AAEJ","file":"chunk-RI6DFQCA.js","sourcesContent":["'use client'\n\n/**\n * Form delight primitives — the interaction layer that makes filling a form\n * feel like progress instead of paperwork. Forms capture the lead; this is\n * conversion surface, not decoration.\n *\n * The bar: AAA-game onboarding. Nothing on screen is inert — the focused\n * field is lit, completing a field LOCKS IN, progress reads like a meter you\n * want to fill, and when the last requirement clears the submit button wakes\n * up. The arc: aura -> lock-in tick -> bar surges -> READY -> press start ->\n * celebration.\n *\n * - FieldValidTick: a check that draws itself the moment a field becomes\n * valid (touched + non-empty + no error), with a ripple ring. The field\n * wrap also flashes a one-shot lock-in ring via [data-sk-valid].\n * - FormMomentum: a fields-completed meter (not steps) — endowed progress;\n * people finish bars they've started. Live sheen, advance flash, leading-\n * edge spark, \"N of M\" label that flips to READY and charges the bar.\n * - [data-sk-ready] (set by FormClient when every required field validates\n * on the final step) wakes the submit button: pop, then breathing glow.\n *\n * Same construction rules as FormCelebration: zero deps, one deduped style\n * tag, data-sk-part on everything, --sk-primary theming, reduced-motion\n * collapses animation to instant states.\n *\n * Contrast guarantee: forms routinely live in sections painted with the\n * brand color itself, where pure --sk-primary chrome is invisible (found\n * live: fill rgb(173,29,37) on section rgb(173,29,37)). Everything here\n * mixes toward currentColor — the section's text color must contrast with\n * the section background, so the mix guarantees the chrome does too.\n */\n\nimport React from 'react'\n\nconst STYLE_ID = 'sk-delight-css'\n\nconst CSS = `\n/* Every frame must carry the centering translateY: the animation fills both\n directions, so a keyframe transform of scale() alone REPLACES the rule's\n translateY(-50%) and drops the tick half its height below center. */\n@keyframes sk-tick-in {\n 0% { transform: translateY(-50%) scale(.3); opacity: 0 }\n 70% { transform: translateY(-50%) scale(1.15) }\n 100% { transform: translateY(-50%) scale(1); opacity: 1 }\n}\n@keyframes sk-tick-draw { to { stroke-dashoffset: 0 } }\n@keyframes sk-tick-ring { 0% { transform: scale(.5); opacity: .7 } 100% { transform: scale(2.2); opacity: 0 } }\n@keyframes sk-lock-in { 0% { opacity: .85; transform: scale(.985) } 100% { opacity: 0; transform: scale(1.012) } }\n@keyframes sk-momentum-sheen { 0% { transform: translateX(-120%) } 100% { transform: translateX(360%) } }\n@keyframes sk-momentum-flash { 0% { opacity: .55 } 100% { opacity: 0 } }\n@keyframes sk-spark-pulse {\n 0%, 100% { box-shadow: 0 0 4px 1px color-mix(in srgb, var(--sk-primary, #2563eb) 60%, currentColor) }\n 50% { box-shadow: 0 0 11px 2px color-mix(in srgb, var(--sk-primary, #2563eb) 60%, currentColor) }\n}\n@keyframes sk-fill-charge {\n 0%, 100% { box-shadow: 0 0 5px 0 color-mix(in srgb, var(--sk-primary, #2563eb) 55%, currentColor) }\n 50% { box-shadow: 0 0 13px 2px color-mix(in srgb, var(--sk-primary, #2563eb) 55%, currentColor) }\n}\n@keyframes sk-label-pop { 0% { transform: scale(.8) } 60% { transform: scale(1.15) } 100% { transform: scale(1) } }\n@keyframes sk-btn-wake { 0% { transform: scale(1) } 40% { transform: scale(1.04) } 100% { transform: scale(1) } }\n@keyframes sk-btn-breathe {\n 0%, 100% { filter: drop-shadow(0 0 0 transparent) }\n 50% { filter: drop-shadow(0 0 9px color-mix(in srgb, var(--sk-primary, #2563eb) 60%, currentColor)) }\n}\n@keyframes sk-submit-pulse { 0%, 100% { opacity: 1 } 50% { opacity: .6 } }\n\n/* ---- Field: aura, lift, lock-in, tick ---- */\n/* Flex, not the default inline formatting context: an <input> is inline-block,\n so the wrapper would be a few px taller than the input (baseline descender\n gap) and the absolutely-centered tick would sit visibly low. */\n[data-sk-part=\"field-input-wrap\"] { display: flex; align-items: center; transition: transform .18s ease; }\n[data-sk-part=\"field-input-wrap\"]:focus-within { transform: translateY(-2px); }\n/* Focus aura — the active field is the lit one. Glow-only pseudo (its own\n box is transparent), so it never occludes the input. */\n[data-sk-part=\"field-input-wrap\"]::before {\n content: ''; position: absolute; inset: -3px;\n border-radius: calc(var(--sk-input-radius, 6px) + 3px);\n box-shadow: 0 0 16px color-mix(in srgb, var(--sk-primary, #2563eb) 55%, currentColor);\n opacity: 0; transition: opacity .25s ease; pointer-events: none;\n}\n[data-sk-part=\"field-input-wrap\"]:focus-within::before { opacity: .5; }\n/* One-shot lock-in ring when the field validates ([data-sk-valid] appears). */\n[data-sk-part=\"field-input-wrap\"]::after {\n content: ''; position: absolute; inset: 0;\n border-radius: var(--sk-input-radius, 6px);\n border: 2px solid color-mix(in srgb, var(--sk-primary, #2563eb) 72%, currentColor);\n opacity: 0; pointer-events: none;\n}\n[data-sk-part=\"field-input-wrap\"][data-sk-valid=\"true\"]::after { animation: sk-lock-in .55s ease-out both; }\n.sk-tick {\n position: absolute; right: 10px; top: 50%; transform: translateY(-50%);\n width: 20px; height: 20px; border-radius: 50%;\n background: color-mix(in srgb, var(--sk-primary, #2563eb) 72%, currentColor);\n display: flex; align-items: center; justify-content: center;\n animation: sk-tick-in .28s cubic-bezier(.22,1.4,.36,1) both;\n pointer-events: none;\n}\n.sk-tick::after {\n content: ''; position: absolute; inset: 0; border-radius: 50%;\n border: 2px solid color-mix(in srgb, var(--sk-primary, #2563eb) 72%, currentColor);\n animation: sk-tick-ring .55s ease-out .06s both;\n}\n.sk-tick path { stroke-dasharray: 14; stroke-dashoffset: 14; animation: sk-tick-draw .22s ease-out .12s forwards; }\n\n/* ---- Momentum meter ---- */\n.sk-momentum { display: flex; align-items: center; gap: 10px; margin: 0 0 16px; }\n.sk-momentum-track {\n flex: 1; position: relative; height: 8px; border-radius: 999px;\n background: color-mix(in srgb, currentColor 14%, transparent);\n}\n.sk-momentum-fill {\n position: relative; overflow: hidden;\n height: 100%; border-radius: 999px;\n background: color-mix(in srgb, var(--sk-primary, #2563eb) 72%, currentColor);\n transition: width .45s cubic-bezier(.22,1,.36,1);\n}\n/* Continuous sheen sweep — the bar reads as live, not static chrome. */\n.sk-momentum-fill::after {\n content: ''; position: absolute; top: 0; bottom: 0; left: 0; width: 45%;\n background: linear-gradient(105deg, transparent, rgba(255,255,255,.4), transparent);\n animation: sk-momentum-sheen 2.6s ease-in-out infinite;\n}\n/* One-shot white flash on each advance (keyed remount restarts it). */\n.sk-momentum-flash {\n position: absolute; inset: 0; border-radius: 999px;\n background: #fff; opacity: 0;\n animation: sk-momentum-flash .5s ease-out;\n}\n/* Leading-edge spark rides the fill tip. */\n.sk-momentum-spark {\n position: absolute; top: 50%; width: 10px; height: 10px; margin-top: -5px;\n border-radius: 50%;\n background: color-mix(in srgb, var(--sk-primary, #2563eb) 55%, currentColor);\n animation: sk-spark-pulse 1.6s ease-in-out infinite;\n transition: left .45s cubic-bezier(.22,1,.36,1);\n pointer-events: none;\n}\n.sk-momentum[data-sk-momentum=\"0\"] .sk-momentum-spark { opacity: 0; }\n.sk-momentum-label {\n font-size: 11px; font-weight: 700; letter-spacing: .08em; text-transform: uppercase;\n opacity: .75; font-variant-numeric: tabular-nums; white-space: nowrap;\n}\n/* Charged state: every requirement met — bar glows, sheen accelerates,\n label flips to READY in brand. */\n.sk-momentum[data-sk-complete=\"true\"] .sk-momentum-fill { animation: sk-fill-charge 1.8s ease-in-out infinite; }\n.sk-momentum[data-sk-complete=\"true\"] .sk-momentum-fill::after { animation-duration: 1.4s; }\n.sk-momentum[data-sk-complete=\"true\"] .sk-momentum-label {\n opacity: 1;\n color: color-mix(in srgb, var(--sk-primary, #2563eb) 60%, currentColor);\n animation: sk-label-pop .4s cubic-bezier(.22,1.4,.36,1);\n}\n\n/* ---- DatePicker: the calendar morphs out of its tile and morphs back in\n on selection (container-transform), and the picked date stamps in. ---- */\n@keyframes sk-cal-out { 0% { opacity: 0; transform: scale(.92) translateY(-8px) } 100% { opacity: 1; transform: scale(1) translateY(0) } }\n@keyframes sk-cal-in { 0% { opacity: 1; transform: scale(1) translateY(0) } 100% { opacity: 0; transform: scale(.94) translateY(-6px) } }\n@keyframes sk-cal-stamp { 0% { transform: scale(.9) } 60% { transform: scale(1.06) } 100% { transform: scale(1) } }\n.sk-datepicker__pop { transform-origin: top center; animation: sk-cal-out .28s cubic-bezier(.22,1.4,.36,1) both; }\n.sk-datepicker__pop[data-sk-closing=\"true\"] { animation: sk-cal-in .18s ease-in both; }\n.sk-datepicker__value--stamp { display: inline-block; animation: sk-cal-stamp .3s cubic-bezier(.22,1.4,.36,1); }\n\n/* ---- Submit: wake on ready, pulse while submitting ---- */\n.sk-form__btn--submit { transition: transform .12s ease; }\n.sk-form__btn--submit:active { transform: scale(.97); }\n[data-sk-ready=\"true\"] .sk-form__btn--submit {\n animation: sk-btn-wake .5s cubic-bezier(.22,1.4,.36,1),\n sk-btn-breathe 2.4s ease-in-out .5s infinite;\n}\n[data-sk-state=\"submitting\"] .sk-form__btn--submit { animation: sk-submit-pulse 1.1s ease-in-out infinite; }\n[data-sk-state=\"submitting\"] .sk-momentum-fill::after { animation-duration: .8s; }\n\n@media (prefers-reduced-motion: reduce) {\n .sk-datepicker__pop { animation: none }\n .sk-datepicker__pop[data-sk-closing=\"true\"] { animation: none }\n .sk-datepicker__value--stamp { animation: none }\n .sk-tick { animation: none }\n .sk-tick::after { animation: none; opacity: 0 }\n .sk-tick path { animation: none; stroke-dashoffset: 0 }\n [data-sk-part=\"field-input-wrap\"] { transition: none }\n [data-sk-part=\"field-input-wrap\"]:focus-within { transform: none }\n [data-sk-part=\"field-input-wrap\"]::before { transition: none }\n [data-sk-part=\"field-input-wrap\"][data-sk-valid=\"true\"]::after { animation: none }\n .sk-momentum-fill { transition: none }\n .sk-momentum-fill::after { animation: none; opacity: 0 }\n .sk-momentum-flash { animation: none }\n .sk-momentum-spark { animation: none; transition: none }\n .sk-momentum[data-sk-complete=\"true\"] .sk-momentum-fill { animation: none }\n .sk-momentum[data-sk-complete=\"true\"] .sk-momentum-label { animation: none }\n .sk-form__btn--submit { transition: none }\n [data-sk-ready=\"true\"] .sk-form__btn--submit { animation: none }\n [data-sk-state=\"submitting\"] .sk-form__btn--submit { animation: none }\n}\n`\n\nexport function DelightStyles() {\n return <style id={STYLE_ID} dangerouslySetInnerHTML={{ __html: CSS }} />\n}\n\n/** Draw-in check shown inside a field wrapper once the value validates. */\nexport function FieldValidTick() {\n return (\n <span className=\"sk-tick\" data-sk-part=\"field-valid-tick\" aria-hidden=\"true\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M3.5 8.5l3 3 6-6.5\"\n stroke=\"var(--sk-form-success-check, #fff)\"\n strokeWidth=\"2.4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </span>\n )\n}\n\nexport interface FormMomentumProps {\n /** Completed required+visible fields. */\n done: number\n /** Total required+visible fields. */\n total: number\n}\n\n/**\n * Fields-completed meter. Hidden when there is nothing to measure (0-1\n * required fields) — a bar that fills in one keystroke reads as noise.\n */\nexport function FormMomentum({ done, total }: FormMomentumProps) {\n if (total < 2) return null\n const pct = Math.round((Math.min(done, total) / total) * 100)\n const ready = done >= total\n return (\n <div\n className=\"sk-momentum\"\n data-sk-part=\"momentum\"\n data-sk-momentum={pct}\n data-sk-complete={ready ? 'true' : undefined}\n role=\"progressbar\"\n aria-valuenow={done}\n aria-valuemin={0}\n aria-valuemax={total}\n aria-label=\"Form progress\"\n >\n <div className=\"sk-momentum-track\" data-sk-part=\"momentum-track\">\n <div className=\"sk-momentum-fill\" data-sk-part=\"momentum-fill\" style={{ width: `${pct}%` }}>\n {/* keyed by pct: remounts on every advance, replaying the flash */}\n <span key={pct} className=\"sk-momentum-flash\" data-sk-part=\"momentum-flash\" aria-hidden=\"true\" />\n </div>\n <span\n className=\"sk-momentum-spark\"\n data-sk-part=\"momentum-spark\"\n style={{ left: `calc(${pct}% - 5px)` }}\n aria-hidden=\"true\"\n />\n </div>\n <span className=\"sk-momentum-label\" data-sk-part=\"momentum-label\" aria-hidden=\"true\">\n {ready ? 'Ready' : `${done} of ${total}`}\n </span>\n </div>\n )\n}\n","/**\n * @sonordev/site-kit/forms - Form Field Component\n *\n * Renders individual form fields based on type.\n *\n * Styling Options:\n * 1. Use CSS variables to customize the default styles\n * 2. Use the `className` prop on ManagedForm for scoped styles\n * 3. Use the custom render function for complete control\n *\n * CSS Variables (set these in your stylesheet or import brand.css):\n * --sk-input-bg: #ffffff\n * --sk-input-text: #111827 (pairs with --sk-input-bg; falls back to\n * --sk-text-primary, so a themed site is covered)\n * --sk-input-border: #d1d5db\n * --sk-input-border-w: 1px\n * --sk-input-border-focus: #2563eb\n * --sk-input-border-error: #dc2626\n * --sk-input-radius: 0.375rem\n * --sk-input-padding: 10px 12px\n * --sk-label-color: inherit\n * --sk-label-weight: 500\n * --sk-error: #dc2626\n * --sk-text-tertiary: #6b7280\n * --sk-font-size: 16px\n */\n\nimport React from 'react'\nimport { FieldValidTick } from './delight'\nimport type { FormField as FormFieldType } from './types'\n\ninterface FormFieldProps {\n /** Render the valid-state tick (touched + validated). Text-like fields only. */\n showValid?: boolean\n field: FormFieldType\n value?: unknown\n error?: string\n /**\n * Omit to render STATIC mode: uncontrolled native controls with\n * `defaultValue`, no React state, no event handlers. That is what lets a\n * Server Component render a complete, submittable form with zero client\n * JavaScript (see StaticForm.tsx). Pass a handler for the usual controlled\n * behaviour once the enhancement hydrates.\n *\n * The two modes MUST emit the same element/class structure — the\n * enhancement replaces the shell in place, and a mismatch shows up as a\n * visible jump. field-parity.test.tsx pins this.\n */\n onChange?: (value: unknown) => void\n /**\n * Focus entered / left this field, for form analytics (`field_interactions`).\n * Interactive mode only; static mode renders no handlers of any kind.\n */\n onFocus?: () => void\n onBlur?: () => void\n /** Optional class name prefix for custom styling */\n classPrefix?: string\n /**\n * Client-only controls, injected by FormClient. DatePicker and FileField\n * carry hooks; importing them here would pull them into this module's chunk\n * and the build would stamp the whole thing `'use client'`, so a Server\n * Component rendering one text input would ship the date picker too.\n * Injection keeps this file hook-free and therefore server-renderable.\n * Absent = static mode falls back to the native control.\n */\n controls?: {\n Date?: React.ComponentType<any>\n File?: React.ComponentType<any>\n }\n}\n\n/**\n * Normalize options from various DB formats into [{value, label}]\n * Handles:\n * - [{value, label}] → pass through\n * - {choices: [\"A\", \"B\"]} → [{value: \"A\", label: \"A\"}, ...]\n * - [\"A\", \"B\"] → [{value: \"A\", label: \"A\"}, ...]\n */\nfunction normalizeOptions(options: unknown): { value: string; label: string }[] {\n if (!options) return []\n if (Array.isArray(options)) {\n return options.map((opt) => {\n if (typeof opt === 'string') return { value: opt, label: opt }\n if (typeof opt === 'object' && opt !== null && 'value' in opt && 'label' in opt) return opt as { value: string; label: string }\n if (typeof opt === 'object' && opt !== null && 'label' in opt) return { value: (opt as any).label, label: (opt as any).label }\n return { value: String(opt), label: String(opt) }\n })\n }\n if (typeof options === 'object' && options !== null) {\n const obj = options as Record<string, unknown>\n if (Array.isArray(obj.choices)) return normalizeOptions(obj.choices)\n if (Array.isArray(obj.items)) return normalizeOptions(obj.items)\n if (Array.isArray(obj.options)) return normalizeOptions(obj.options)\n }\n return []\n}\n\nexport function FormField({ field, value, error, onChange, onFocus, onBlur, classPrefix = 'sk-form' , showValid, controls }: FormFieldProps) {\n // Static mode: no handler, so render native uncontrolled controls. The\n // browser owns the value and a native form POST still carries it.\n const interactive = typeof onChange === 'function'\n const emit = (v: unknown) => onChange?.(v)\n /** value/onChange when interactive, defaultValue when static. */\n const bind = (v: string) =>\n interactive\n ? { value: v, onChange: (e: any) => emit(e.target.value) }\n : { defaultValue: v || undefined }\n // Stable id from field (no hooks - avoids \"Rendered fewer hooks than expected\" with early returns)\n const inputId = `sk-${(field as { id?: string }).id || field.slug}`\n // Normalize options once\n const options = normalizeOptions(field.options)\n // Use CSS variables with inline style fallbacks\n const baseInputStyle: React.CSSProperties = {\n width: '100%',\n padding: 'var(--sk-input-padding, 10px 12px)',\n fontSize: 'var(--sk-font-size, 16px)',\n border: error\n ? 'var(--sk-input-border-w, 1px) solid var(--sk-input-border-error, #dc2626)'\n : 'var(--sk-input-border-w, 1px) solid var(--sk-input-border, #d1d5db)',\n borderRadius: 'var(--sk-input-radius, 6px)',\n backgroundColor: 'var(--sk-input-bg, #ffffff)',\n // fg and bg MUST come from the same source. Inlining bg but letting color\n // cascade from the section produced cream-on-white on brand-colored panels\n // (found live). Default pairs with the white bg; theme both via vars.\n //\n // The fallback chain matters, and it is the reason this was broken on\n // upforgelabs.com: a dark site that set --sk-input-bg and --sk-text-primary\n // but never heard of --sk-input-text landed on #111827 over its own dark\n // field, 1.03:1, an input you cannot read your own typing in. Falling\n // through --sk-text-primary first means theming the page's text is enough.\n color: 'var(--sk-input-text, var(--sk-text-primary, #111827))',\n outline: 'none',\n fontFamily: 'inherit',\n }\n \n const labelStyle: React.CSSProperties = {\n display: 'block',\n marginBottom: 6,\n fontWeight: 'var(--sk-label-weight, 500)' as any,\n color: 'var(--sk-label-color, inherit)',\n }\n \n const errorStyle: React.CSSProperties = {\n color: 'var(--sk-error, #dc2626)',\n fontSize: 14,\n marginTop: 4,\n }\n \n const helpStyle: React.CSSProperties = {\n color: 'var(--sk-text-tertiary, #6b7280)',\n fontSize: 14,\n marginTop: 4,\n }\n \n // Heading / Section Header (display only)\n if (field.field_type === 'heading' || field.field_type === 'section_header') {\n return <h3 className={`${classPrefix}__heading`} style={{ margin: '16px 0 8px', fontWeight: 600, fontSize: 18 }}>{field.label}</h3>\n }\n \n // Paragraph (display only)\n if (field.field_type === 'paragraph') {\n return <p className={`${classPrefix}__paragraph`} style={{ color: 'var(--sk-text-tertiary, #6b7280)', margin: '8px 0' }}>{field.help_text || field.label}</p>\n }\n \n // Hidden field\n if (field.field_type === 'hidden') {\n return interactive\n ? <input type=\"hidden\" name={field.slug} value={String(value || '')} readOnly />\n : <input type=\"hidden\" name={field.slug} defaultValue={String(value || '')} />\n }\n\n const hideLabel = !!(field as { hide_label?: boolean }).hide_label\n const effectivePlaceholder = hideLabel ? field.label : field.placeholder\n\n // Focus reporting sits on the wrapper, so every control inside (radios, the\n // date picker, the file button) reports as this one field. Moves between\n // controls inside the same field are not a new visit to it.\n const focusProps = interactive && (onFocus || onBlur)\n ? {\n onFocus: (e: React.FocusEvent<HTMLDivElement>) => {\n if (!e.currentTarget.contains(e.relatedTarget as Node | null)) onFocus?.()\n },\n onBlur: (e: React.FocusEvent<HTMLDivElement>) => {\n if (!e.currentTarget.contains(e.relatedTarget as Node | null)) onBlur?.()\n },\n }\n : {}\n\n return (\n <div className={`${classPrefix}__field ${classPrefix}__field--${field.field_type}`} {...focusProps}>\n <label htmlFor={inputId} className={`${classPrefix}__label`} style={{ ...labelStyle, ...(hideLabel ? { position: 'absolute', width: 1, height: 1, padding: 0, margin: -1, overflow: 'hidden', clip: 'rect(0,0,0,0)', whiteSpace: 'nowrap', border: 0 } : {}) }}>\n {field.label}\n {field.is_required && <span style={{ color: 'var(--sk-error, #dc2626)' }}> *</span>}\n </label>\n \n {/* Text, Email, Phone/Tel, Number — relative wrapper hosts the valid tick */}\n {['text', 'email', 'phone', 'tel', 'number'].includes(field.field_type) && (\n <div style={{ position: 'relative' }} data-sk-part=\"field-input-wrap\" data-sk-valid={showValid ? 'true' : undefined}>\n <input\n id={inputId}\n className={`${classPrefix}__input`}\n type={field.field_type === 'phone' || field.field_type === 'tel' ? 'tel' : field.field_type}\n name={field.slug}\n {...bind(String(value || ''))}\n placeholder={effectivePlaceholder}\n required={field.is_required}\n style={baseInputStyle}\n />\n {showValid && <FieldValidTick />}\n </div>\n )}\n \n {/* Textarea */}\n {field.field_type === 'textarea' && (\n <textarea\n id={inputId}\n className={`${classPrefix}__textarea`}\n name={field.slug}\n {...bind(String(value || ''))}\n placeholder={effectivePlaceholder}\n required={field.is_required}\n rows={4}\n style={{ ...baseInputStyle, resize: 'vertical' }}\n />\n )}\n \n {/* Select */}\n {field.field_type === 'select' && (\n <select\n id={inputId}\n className={`${classPrefix}__select`}\n name={field.slug}\n {...bind(String(value || ''))}\n required={field.is_required}\n style={baseInputStyle}\n >\n <option value=\"\">{effectivePlaceholder || 'Select an option'}</option>\n {options.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n )}\n \n {/* Multi-select */}\n {field.field_type === 'multi-select' && (\n <select\n id={inputId}\n className={`${classPrefix}__select ${classPrefix}__select--multi`}\n name={field.slug}\n {...(interactive\n ? {\n value: Array.isArray(value) ? (value as string[]) : [],\n onChange: (e: any) =>\n emit(Array.from(e.target.selectedOptions, (opt: any) => opt.value)),\n }\n : { defaultValue: Array.isArray(value) ? (value as string[]) : [] })}\n required={field.is_required}\n multiple\n style={{ ...baseInputStyle, height: 120 }}\n >\n {options.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n )}\n \n {/* Radio */}\n {field.field_type === 'radio' && (\n <div className={`${classPrefix}__radio-group`} style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>\n {options.map((option) => (\n <label key={option.value} className={`${classPrefix}__radio-option`} style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\n <input\n type=\"radio\"\n name={field.slug}\n value={option.value}\n {...(interactive\n ? { checked: value === option.value, onChange: () => emit(option.value) }\n : { defaultChecked: value === option.value })}\n required={field.is_required}\n />\n {option.label}\n </label>\n ))}\n </div>\n )}\n \n {/* Checkbox (single) */}\n {field.field_type === 'checkbox' && options.length === 0 && (\n <label className={`${classPrefix}__checkbox`} style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\n <input\n type=\"checkbox\"\n name={field.slug}\n {...(interactive\n ? { checked: !!value, onChange: (e: any) => emit(e.target.checked) }\n : { defaultChecked: !!value })}\n required={field.is_required}\n />\n {field.help_text || field.label}\n </label>\n )}\n \n {/* Checkbox (multiple options) */}\n {field.field_type === 'checkbox' && options.length > 0 && (\n <div className={`${classPrefix}__checkbox-group`} style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>\n {options.map((option) => {\n const selectedValues = Array.isArray(value) ? value : []\n const isChecked = selectedValues.includes(option.value)\n \n return (\n <label key={option.value} className={`${classPrefix}__checkbox-option`} style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\n <input\n type=\"checkbox\"\n name={field.slug}\n value={option.value}\n {...(interactive\n ? {\n checked: isChecked,\n onChange: () =>\n emit(\n isChecked\n ? selectedValues.filter((v) => v !== option.value)\n : [...selectedValues, option.value],\n ),\n }\n : { defaultChecked: isChecked })}\n />\n {option.label}\n </label>\n )\n })}\n </div>\n )}\n \n {/* Date - Custom calendar picker */}\n {field.field_type === 'date' && (\n interactive && controls?.Date ? (\n <controls.Date\n id={inputId}\n name={field.slug}\n value={String(value || '')}\n onChange={emit}\n required={field.is_required}\n placeholder={field.placeholder || 'Select a date'}\n className={`${classPrefix}__input ${classPrefix}__input--date`}\n />\n ) : (\n // Static: the browser's own date control. Same name and class, so\n // the swap to DatePicker on enhancement is in place.\n <input\n id={inputId}\n className={`${classPrefix}__input ${classPrefix}__input--date`}\n type=\"date\"\n name={field.slug}\n defaultValue={String(value || '') || undefined}\n required={field.is_required}\n style={baseInputStyle}\n />\n )\n )}\n \n {/* Time */}\n {field.field_type === 'time' && (\n <input\n id={inputId}\n className={`${classPrefix}__input ${classPrefix}__input--time`}\n type=\"time\"\n name={field.slug}\n {...bind(String(value || ''))}\n required={field.is_required}\n style={baseInputStyle}\n />\n )}\n \n {/* DateTime */}\n {field.field_type === 'datetime' && (\n <input\n id={inputId}\n className={`${classPrefix}__input ${classPrefix}__input--datetime`}\n type=\"datetime-local\"\n name={field.slug}\n {...bind(String(value || ''))}\n required={field.is_required}\n style={baseInputStyle}\n />\n )}\n \n {/* File */}\n {field.field_type === 'file' && (\n interactive && controls?.File ? (\n <controls.File\n field={field}\n inputId={inputId}\n classPrefix={classPrefix}\n baseInputStyle={baseInputStyle}\n onChange={emit}\n />\n ) : (\n // Static: a real file input so the field is visible and labelled,\n // but the Sonor upload only happens once enhanced.\n <input\n id={inputId}\n className={`${classPrefix}__input ${classPrefix}__input--file`}\n type=\"file\"\n name={field.slug}\n required={field.is_required}\n style={baseInputStyle}\n />\n )\n )}\n \n {/* Rating */}\n {field.field_type === 'rating' && (\n <div className={`${classPrefix}__rating`} style={{ display: 'flex', gap: 4 }} role={interactive ? undefined : 'radiogroup'} aria-label={interactive ? undefined : field.label}>\n {!interactive && [1, 2, 3, 4, 5].map((star) => (\n // Static: a real radio group. Submits natively, and is reachable\n // by keyboard and screen readers without any script.\n <label key={`s${star}`} className={`${classPrefix}__rating-star`} style={{ fontSize: 24, cursor: 'pointer', color: (value as number) >= star ? 'var(--sk-rating-active, #fbbf24)' : 'var(--sk-rating-inactive, #d1d5db)' }}>\n <input\n type=\"radio\"\n name={field.slug}\n value={star}\n defaultChecked={(value as number) === star}\n required={field.is_required && star === 1}\n style={{ position: 'absolute', width: 1, height: 1, opacity: 0 }}\n />\n <span aria-label={`${star} star${star > 1 ? 's' : ''}`}>★</span>\n </label>\n ))}\n {interactive && [1, 2, 3, 4, 5].map((star) => (\n <button\n key={star}\n type=\"button\"\n onClick={() => emit(star)}\n className={`${classPrefix}__rating-star`}\n style={{\n background: 'none',\n border: 'none',\n fontSize: 24,\n cursor: 'pointer',\n color: (value as number) >= star ? 'var(--sk-rating-active, #fbbf24)' : 'var(--sk-rating-inactive, #d1d5db)',\n }}\n >\n ★\n </button>\n ))}\n </div>\n )}\n \n {/* Slider */}\n {field.field_type === 'slider' && (\n <div className={`${classPrefix}__slider`}>\n <input\n id={inputId}\n type=\"range\"\n name={field.slug}\n {...(interactive\n ? { value: Number(value || 50), onChange: (e: any) => emit(Number(e.target.value)) }\n : { defaultValue: Number(value || 50) })}\n min={field.validation?.min || 0}\n max={field.validation?.max || 100}\n style={{ width: '100%' }}\n />\n <div className={`${classPrefix}__slider-value`} style={{ textAlign: 'center', marginTop: 4 }}>{String(value || 50)}</div>\n </div>\n )}\n \n {/* Error message */}\n {error && <p className={`${classPrefix}__error`} style={errorStyle}>{error}</p>}\n \n {/* Help text */}\n {field.help_text && !error && field.field_type !== 'checkbox' && (\n <p className={`${classPrefix}__help`} style={helpStyle}>{field.help_text}</p>\n )}\n </div>\n )\n}\n"]}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
-
var
|
|
5
|
-
var
|
|
4
|
+
var chunkCB3WK2OW_js = require('./chunk-CB3WK2OW.js');
|
|
5
|
+
var chunk2TSDPEMA_js = require('./chunk-2TSDPEMA.js');
|
|
6
6
|
var chunkHGNSJXWT_js = require('./chunk-HGNSJXWT.js');
|
|
7
|
-
var
|
|
7
|
+
var chunkS3RPDQA7_js = require('./chunk-S3RPDQA7.js');
|
|
8
8
|
var chunkUZKXOZHR_js = require('./chunk-UZKXOZHR.js');
|
|
9
9
|
var chunkRC4WWQXR_js = require('./chunk-RC4WWQXR.js');
|
|
10
10
|
var React = require('react');
|
|
@@ -17,15 +17,15 @@ var React__default = /*#__PURE__*/_interopDefault(React);
|
|
|
17
17
|
var dynamic__default = /*#__PURE__*/_interopDefault(dynamic);
|
|
18
18
|
|
|
19
19
|
var LazyAnalyticsProvider = dynamic__default.default(
|
|
20
|
-
() => import('./AnalyticsProvider-
|
|
20
|
+
() => import('./AnalyticsProvider-IZXUFR7B.js').then((m) => ({ default: m.AnalyticsProvider })),
|
|
21
21
|
{ ssr: false }
|
|
22
22
|
);
|
|
23
23
|
var LazyEngageWidget = dynamic__default.default(
|
|
24
|
-
() => import('./EngageWidget-
|
|
24
|
+
() => import('./EngageWidget-LNTIXBFA.js').then((m) => ({ default: m.EngageWidget })),
|
|
25
25
|
{ ssr: false }
|
|
26
26
|
);
|
|
27
27
|
var LazySitemapSync = dynamic__default.default(
|
|
28
|
-
() => import('./SitemapSync-
|
|
28
|
+
() => import('./SitemapSync-HRQ7KLP5.js').then((m) => ({ default: m.SitemapSync })),
|
|
29
29
|
{ ssr: false }
|
|
30
30
|
);
|
|
31
31
|
function SiteKitClientProviders({
|
|
@@ -39,13 +39,12 @@ function SiteKitClientProviders({
|
|
|
39
39
|
sitemapSync = false,
|
|
40
40
|
fleet = true,
|
|
41
41
|
defer = true,
|
|
42
|
-
debug = false
|
|
43
|
-
mapsBrowserKey
|
|
42
|
+
debug = false
|
|
44
43
|
}) {
|
|
45
44
|
const modulesReady = chunkHGNSJXWT_js.useDeferredActivation(defer);
|
|
46
45
|
const analyticsConfig = typeof analytics === "object" ? analytics : {};
|
|
47
46
|
const site = chunkUZKXOZHR_js.resolveSiteHost(analyticsConfig.site);
|
|
48
|
-
|
|
47
|
+
chunkCB3WK2OW_js.publishSiteCredential({ apiKey, apiUrl, site, debug });
|
|
49
48
|
const [visitorId] = React.useState(() => chunkRC4WWQXR_js.getOrCreateVisitorId());
|
|
50
49
|
const [sessionId] = React.useState(() => chunkRC4WWQXR_js.getOrCreateSessionId());
|
|
51
50
|
const pageMetadataRef = React.useRef(null);
|
|
@@ -57,7 +56,7 @@ function SiteKitClientProviders({
|
|
|
57
56
|
const signalConfig = typeof signal === "object" ? signal : {};
|
|
58
57
|
siblings.push(
|
|
59
58
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
60
|
-
|
|
59
|
+
chunkS3RPDQA7_js.SignalBridge,
|
|
61
60
|
{
|
|
62
61
|
enabled: true,
|
|
63
62
|
realtime: signalConfig.realtime !== false,
|
|
@@ -134,7 +133,7 @@ function SiteKitClientProviders({
|
|
|
134
133
|
if (sitemapSync) activeModules.push("sitemapSync");
|
|
135
134
|
siblings.push(
|
|
136
135
|
/* @__PURE__ */ jsxRuntime.jsx(React__default.default.Fragment, { children: modulesReady && /* @__PURE__ */ jsxRuntime.jsx(
|
|
137
|
-
|
|
136
|
+
chunk2TSDPEMA_js.FleetHeartbeat,
|
|
138
137
|
{
|
|
139
138
|
apiUrl,
|
|
140
139
|
apiKey,
|
|
@@ -155,5 +154,5 @@ function SiteKitClientProviders({
|
|
|
155
154
|
}
|
|
156
155
|
|
|
157
156
|
exports.SiteKitClientProviders = SiteKitClientProviders;
|
|
158
|
-
//# sourceMappingURL=chunk-
|
|
159
|
-
//# sourceMappingURL=chunk-
|
|
157
|
+
//# sourceMappingURL=chunk-RWUFJGZX.js.map
|
|
158
|
+
//# sourceMappingURL=chunk-RWUFJGZX.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/layout/SiteKitClientProviders.tsx"],"names":["dynamic","useDeferredActivation","resolveSiteHost","publishSiteCredential","useState","getOrCreateVisitorId","getOrCreateSessionId","useRef","useCallback","jsx","SignalBridge","React","Suspense","FleetHeartbeat","jsxs","Fragment"],"mappings":"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","file":"chunk-RWUFJGZX.js","sourcesContent":["'use client'\n\n/**\n * SiteKitClientProviders — Client Island\n *\n * This is the 'use client' boundary for SiteKitLayout.\n * It composes the client-only providers (Analytics, Engage, Signal, SitemapSync)\n * that require React context or browser APIs.\n *\n * All modules are lazy-loaded via next/dynamic so their JS is only downloaded\n * when the feature is enabled — keeping the initial bundle lightweight.\n *\n * All modules share a unified identity (visitor ID + session ID) read from\n * the storage-backed singleton (shared/identity), ensuring consistent\n * tracking across Analytics, Signal, and Engage.\n *\n * 4.0 INVARIANT — CHILDREN ARE NEVER WRAPPED. Every module here renders as a\n * childless sibling AFTER {children}; nothing provides context around page\n * content. That makes the prerender-bailout / remount-flash class of bug\n * structurally impossible. Do not reintroduce a wrapper.\n *\n * Props are passed down from the server-side SiteKitLayout component,\n * which reads env vars at render time.\n */\n\nimport React, { Suspense, useCallback, useRef, useState, type ReactNode } from 'react'\nimport dynamic from 'next/dynamic'\nimport {\n getOrCreateVisitorId,\n getOrCreateSessionId,\n} from '../shared/identity'\n// Defer non-critical module mounting until the page is quiet: the lazy\n// modules below are dynamic(ssr:false) and never render on the server, but\n// rendering them during hydration still kicks off their chunk downloads +\n// mount effects inside the critical startup window. useDeferredActivation\n// holds them until window.load + idle or first interaction — the same\n// strategy as the hand-rolled per-site deferrals this replaces (upforge\n// `deferred-analytics.tsx`, TPS `DeferredAnalytics.tsx`). The hook is public\n// (`@sonordev/site-kit/client`) so sites can reuse it for their own scripts.\nimport { useDeferredActivation } from '../shared/defer'\n// Single source of truth for seeding the token manager + the __SITE_KIT_*\n// globals — shared with the public `SiteKitCredential` component that\n// non-core layouts (agency-site-kit) use. Do not re-inline it here.\nimport { publishSiteCredential, resolveSiteHost } from '../shared/publishCredential'\nimport type { AnalyticsConfig, EngageConfig, SignalConfig } from './types'\n\n// Lazy-load feature modules — JS only downloaded when feature is enabled\nconst LazyAnalyticsProvider = dynamic(\n () => import('../analytics/AnalyticsProvider').then(m => ({ default: m.AnalyticsProvider })),\n { ssr: false },\n)\nconst LazyEngageWidget = dynamic(\n () => import('../engage/EngageWidget').then(m => ({ default: m.EngageWidget })),\n { ssr: false },\n)\nconst LazySitemapSync = dynamic(\n () => import('../SitemapSync').then(m => ({ default: m.SitemapSync })),\n { ssr: false },\n)\n// SignalBridge is imported STATICALLY, not via dynamic(ssr:false): it is a\n// tiny SSR-safe context shell that renders children immediately and\n// lazy-loads its machinery (SignalCore) as a childless sibling internally.\n// Wrapping children in a dynamic(ssr:false) component was the old SSR-bailout\n// failure mode — do not reintroduce it.\nimport { SignalBridge } from '../signal/SignalBridge'\n// Fleet heartbeat: a deferred, CHILDLESS SIBLING (like Analytics/Engage) that\n// reports this site's kit version + active modules once per session, so the\n// platform can see version drift across the fleet. Tiny and SSR-safe — renders\n// null until the shared idle gate fires; never wraps page content.\nimport { FleetHeartbeat } from '../fleet/FleetHeartbeat'\nimport type { FleetModule } from '../fleet/contract'\n\nexport interface SiteKitClientProvidersProps {\n children: ReactNode\n apiKey: string\n apiUrl: string\n projectId?: string\n analytics?: boolean | AnalyticsConfig\n engage?: boolean | EngageConfig\n signal?: boolean | SignalConfig\n /**\n * Runtime SitemapSync from the visitor's browser. Default FALSE — sitemap\n * registration belongs to build time and to sonor-api's nightly reconciler,\n * not to whoever happens to load the page. See SiteKitLayout for the full\n * reasoning; in short, its guards live in session/localStorage, so every new\n * visitor missed them and re-POSTed the whole sitemap.\n */\n sitemapSync?: boolean\n /**\n * Fleet heartbeat — reports kit version + active modules to Sonor once per\n * session so the platform can track version drift and key state across every\n * site. Default true. Deferred exactly like Analytics; never in the hydration\n * path, carries no visitor data.\n */\n fleet?: boolean\n /**\n * Defer Analytics / Engage / SitemapSync until window load + idle or first\n * interaction (default true). Pass false to restore legacy eager mounting\n * on hydration. SignalBridge is never deferred — it must apply experiment\n * variants as early as possible.\n */\n defer?: boolean\n debug?: boolean\n /** Browser-safe Google Maps key, resolved server-side by SiteKitLayout. */\n}\n\nexport function SiteKitClientProviders({\n children,\n apiKey,\n apiUrl,\n projectId,\n analytics = true,\n engage = true,\n signal = false,\n sitemapSync = false,\n fleet = true,\n defer = true,\n debug = false,\n}: SiteKitClientProvidersProps) {\n // One shared activation gate for all deferred siblings, so they mount in a\n // single commit instead of staggered re-renders.\n const modulesReady = useDeferredActivation(defer)\n // Hoist analytics config so the `site` dimension is resolvable up here.\n const analyticsConfig: AnalyticsConfig =\n typeof analytics === 'object' ? analytics : {}\n\n // Resolve the sub-site identifier — the dimension that lets one Sonor project\n // host many sites (e.g. truepowersystems.com + ohiopowerstudies.com under one\n // TPS project). Precedence lives in resolveSiteHost (shared contract):\n // explicit `analytics.site` > NEXT_PUBLIC_SITE_URL host > window.location.host.\n // Needed as a local too — SignalBridge and the analytics config read it below.\n const site = resolveSiteHost(analyticsConfig.site)\n\n // Seed the token manager + publish the window globals modules read from.\n // No-op on the server; runs during render so it lands before child effects.\n publishSiteCredential({ apiKey, apiUrl, site, debug })\n\n // Unified identity — single source of truth for all modules\n const [visitorId] = useState(() => getOrCreateVisitorId())\n const [sessionId] = useState(() => getOrCreateSessionId())\n\n // Page metadata bridge: Analytics writes, Signal reads\n const pageMetadataRef = useRef<Record<string, unknown> | null>(null)\n const onPageMetadata = useCallback((metadata: Record<string, unknown>) => {\n pageMetadataRef.current = metadata\n }, [])\n\n // Children render FIRST and are never re-parented. Siblings accumulate after.\n const siblings: ReactNode[] = []\n\n // SignalBridge — childless sibling (4.0: useSignal reads the module store,\n // so it no longer needs to wrap anything). Not gated on modulesReady:\n // experiment variants must apply as early as possible.\n if (signal) {\n const signalConfig: SignalConfig =\n typeof signal === 'object' ? signal : {}\n siblings.push(\n <SignalBridge\n key=\"sk-signal\"\n enabled\n realtime={signalConfig.realtime !== false}\n experiments={signalConfig.experiments !== false}\n behaviorTracking={signalConfig.behaviorTracking !== false}\n visitorId={visitorId}\n sessionId={sessionId}\n pageMetadataRef={pageMetadataRef}\n />,\n )\n }\n\n // Add Analytics if enabled (renders alongside, doesn't wrap).\n //\n // CRITICAL: LazyAnalyticsProvider is dynamic(..., { ssr: false }). Wrapping\n // {content} inside an ssr:false component makes the entire page tree skip\n // server rendering — the route de-opts to 100% client rendering and the\n // hero / LCP element only paints after hydration (mobile LCP ~4s, Lighthouse\n // ~85). Analytics tracks via effects + a metadata ref, so it never needs to\n // wrap page content — mount it as a childless sibling, exactly like Engage.\n // Each deferred sibling is appended as `{modulesReady && <Module/>}` so the\n // children slot never moves in the tree — flipping ready only mounts the\n // sibling, it never remounts page content.\n if (analytics) {\n siblings.push(\n <React.Fragment key=\"sk-analytics\">\n {modulesReady && (\n <Suspense fallback={null}>\n <LazyAnalyticsProvider\n apiUrl={apiUrl}\n apiKey={apiKey}\n site={site}\n trackPageViews={analyticsConfig.trackPageViews !== false}\n trackWebVitals={analyticsConfig.trackWebVitals !== false}\n trackScrollDepth={analyticsConfig.trackScrollDepth !== false}\n trackClicks={analyticsConfig.trackClicks !== false}\n sessionTimeout={analyticsConfig.sessionDuration}\n excludePaths={analyticsConfig.excludePaths}\n // Off by default: a cross-origin embed of this site reports\n // nothing (see analytics/send-gate.ts). Opt in per site.\n allowInFrame={analyticsConfig.allowInFrame === true}\n allowLocalhost={analyticsConfig.allowLocalhost === true}\n debug={debug}\n externalVisitorId={visitorId}\n externalSessionId={sessionId}\n onPageMetadata={onPageMetadata}\n />\n </Suspense>\n )}\n </React.Fragment>,\n )\n }\n\n // Engage widget — childless sibling\n if (engage) {\n const engageConfig: EngageConfig =\n typeof engage === 'object' ? engage : {}\n siblings.push(\n <React.Fragment key=\"sk-engage\">\n {modulesReady && (\n <LazyEngageWidget\n apiUrl={apiUrl}\n apiKey={apiKey}\n projectId={projectId}\n allowInFrame={analyticsConfig.allowInFrame === true}\n allowLocalhost={analyticsConfig.allowLocalhost === true}\n position={engageConfig.position || 'bottom-right'}\n offsetBottom={engageConfig.offsetBottom}\n zIndex={engageConfig.zIndex}\n chatEnabled={engageConfig.chatEnabled !== false}\n />\n )}\n </React.Fragment>,\n )\n }\n\n // SitemapSync — childless sibling\n if (sitemapSync) {\n siblings.push(\n <React.Fragment key=\"sk-sitemap\">\n {modulesReady && (\n <LazySitemapSync\n debug={debug}\n allowInFrame={analyticsConfig.allowInFrame === true}\n allowLocalhost={analyticsConfig.allowLocalhost === true}\n />\n )}\n </React.Fragment>,\n )\n }\n\n // Fleet heartbeat — childless sibling on the same modulesReady idle gate.\n // Reports the modules actually enabled on THIS layout (honest client-observable\n // set) so the platform can answer \"which version / modules is each site\n // running\". defer={false}: the modulesReady gate already handled deferral, so\n // the heartbeat fires on mount (still bounded to once per session internally).\n if (fleet) {\n const activeModules: FleetModule[] = []\n if (analytics) activeModules.push('analytics')\n if (engage) activeModules.push('engage')\n if (signal) activeModules.push('signal')\n if (sitemapSync) activeModules.push('sitemapSync')\n siblings.push(\n <React.Fragment key=\"sk-fleet\">\n {modulesReady && (\n <FleetHeartbeat\n apiUrl={apiUrl}\n apiKey={apiKey}\n site={site}\n modules={activeModules}\n allowInFrame={analyticsConfig.allowInFrame === true}\n allowLocalhost={analyticsConfig.allowLocalhost === true}\n defer={false}\n debug={debug}\n />\n )}\n </React.Fragment>,\n )\n }\n\n return (\n <>\n {children}\n {siblings}\n </>\n )\n}\n"]}
|
|
@@ -60,7 +60,7 @@ function useSignal() {
|
|
|
60
60
|
return react.useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);
|
|
61
61
|
}
|
|
62
62
|
var LazySignalCore = dynamic__default.default(
|
|
63
|
-
() => import('./SignalCore-
|
|
63
|
+
() => import('./SignalCore-DEGICRY2.js').then((m) => ({ default: m.SignalCore })),
|
|
64
64
|
{ ssr: false }
|
|
65
65
|
);
|
|
66
66
|
function SignalBridge({
|
|
@@ -172,5 +172,5 @@ exports.useSignalConfig = useSignalConfig;
|
|
|
172
172
|
exports.useSignalEvent = useSignalEvent;
|
|
173
173
|
exports.useSignalExperiment = useSignalExperiment;
|
|
174
174
|
exports.useSignalOutcome = useSignalOutcome;
|
|
175
|
-
//# sourceMappingURL=chunk-
|
|
176
|
-
//# sourceMappingURL=chunk-
|
|
175
|
+
//# sourceMappingURL=chunk-S3RPDQA7.js.map
|
|
176
|
+
//# sourceMappingURL=chunk-S3RPDQA7.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/signal/store.ts","../src/signal/SignalBridge.tsx"],"names":["useSyncExternalStore","dynamic","useState","useRef","useCallback","useMemo","useEffect","jsxs","Fragment","jsx"],"mappings":";;;;;;;;;;;AAyBA,IAAM,gBAAwC,EAAC;AAC/C,IAAM,kBAAmC,EAAC;AAC1C,IAAM,WAAA,GAAc,GAAA;AACpB,IAAI,cAAA,GAAiB,KAAA;AAGrB,IAAM,IAAA,GAA2B,OAAO,MAAA,CAAO;AAAA,EAC7C,MAAA,EAAQ,IAAA;AAAA,EACR,OAAA,EAAS,IAAA;AAAA,EACT,KAAA,EAAO,IAAA;AAAA,EACP,UAAA,EAAY,CAAC,KAAA,KAAgC;AAC3C,IAAA,IAAI,aAAA,CAAc,MAAA,GAAS,WAAA,EAAa,aAAA,CAAc,KAAK,KAAK,CAAA;AAAA,SAAA,IACvD,CAAC,cAAA,EAAgB;AACxB,MAAA,cAAA,GAAiB,IAAA;AACjB,MAAA,OAAA,CAAQ,KAAK,iHAA4G,CAAA;AAAA,IAC3H;AAAA,EACF,CAAA;AAAA,EACA,YAAA,EAAc,CAAC,OAAA,KAA2B;AACxC,IAAA,IAAI,eAAA,CAAgB,MAAA,GAAS,WAAA,EAAa,eAAA,CAAgB,KAAK,OAAO,CAAA;AAAA,EACxE,CAAA;AAAA,EACA,eAAe,MAAM,IAAA;AAAA,EACrB,eAAe,YAAY;AAAA,EAAC;AAC9B,CAAC,CAAA;AAED,IAAI,OAAA,GAA8B,IAAA;AAClC,IAAM,SAAA,uBAAgB,GAAA,EAAgB;AAEtC,SAAS,IAAA,GAAO;AACd,EAAA,KAAA,MAAW,CAAA,IAAK,WAAW,CAAA,EAAE;AAC/B;AAGO,SAAS,cAAc,KAAA,EAAiC;AAC7D,EAAA,MAAM,eAAe,OAAA,KAAY,IAAA;AACjC,EAAA,OAAA,GAAU,KAAA;AACV,EAAA,IAAI,YAAA,EAAc;AAGhB,IAAA,aAAA,CAAc,MAAA,CAAO,CAAC,CAAA,CAAE,OAAA,CAAQ,OAAK,KAAA,CAAM,UAAA,CAAW,CAAC,CAAC,CAAA;AACxD,IAAA,eAAA,CAAgB,MAAA,CAAO,CAAC,CAAA,CAAE,OAAA,CAAQ,OAAK,KAAA,CAAM,YAAA,CAAa,CAAC,CAAC,CAAA;AAAA,EAC9D;AACA,EAAA,IAAA,EAAK;AACP;AAGO,SAAS,WAAA,GAAoB;AAClC,EAAA,OAAA,GAAU,IAAA;AACV,EAAA,IAAA,EAAK;AACP;AAEA,SAAS,UAAU,QAAA,EAAsB;AACvC,EAAA,SAAA,CAAU,IAAI,QAAQ,CAAA;AACtB,EAAA,OAAO,MAAM,SAAA,CAAU,MAAA,CAAO,QAAQ,CAAA;AACxC;AAEA,IAAM,cAAc,MAAM,OAAA;AAC1B,IAAM,oBAAoB,MAAM,IAAA;AAMzB,SAAS,SAAA,GAAgC;AAC9C,EAAA,OAAOA,0BAAA,CAAqB,SAAA,EAAW,WAAA,EAAa,iBAAiB,CAAA;AACvE;ACnDA,IAAM,cAAA,GAAiBC,wBAAA;AAAA,EACrB,MAAM,OAAO,0BAAc,CAAA,CAAE,IAAA,CAAK,QAAM,EAAE,OAAA,EAAS,CAAA,CAAE,UAAA,EAAW,CAAE,CAAA;AAAA,EAClE,EAAE,KAAK,KAAA;AACT,CAAA;AAcO,SAAS,YAAA,CAAa;AAAA,EAC3B,OAAA,GAAU,IAAA;AAAA,EACV,QAAA,GAAW,IAAA;AAAA,EACX,WAAA,GAAc,IAAA;AAAA,EACd,gBAAA,GAAmB,IAAA;AAAA,EACnB,SAAA,EAAW,iBAAA;AAAA,EACX,SAAA,EAAW,iBAAA;AAAA,EACX,eAAA;AAAA,EACA;AACF,CAAA,EAAsB;AACpB,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIC,eAA8B,IAAI,CAAA;AAC9D,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAAS,IAAI,CAAA;AAC3C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAuB,IAAI,CAAA;AAErD,EAAA,MAAM,OAAA,GAAUC,aAA6B,IAAI,CAAA;AAGjD,EAAA,MAAM,gBAAA,GAAmBA,YAAA,CAA+B,EAAE,CAAA;AAC1D,EAAA,MAAM,kBAAA,GAAqBA,YAAA,CAAwB,EAAE,CAAA;AAErD,EAAA,MAAM,WAAA,GAAcC,iBAAA,CAAY,CAAC,KAAA,KAA2B;AAC1D,IAAA,SAAA,CAAU,MAAM,MAAM,CAAA;AACtB,IAAA,UAAA,CAAW,MAAM,OAAO,CAAA;AACxB,IAAA,QAAA,CAAS,MAAM,KAAK,CAAA;AAAA,EACtB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,cAAA,GAAiBA,iBAAA,CAAY,CAAC,GAAA,KAA8B;AAChE,IAAA,OAAA,CAAQ,OAAA,GAAU,GAAA;AAClB,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,gBAAA,CAAiB,OAAA,CAAQ,OAAO,CAAC,CAAA,CAAE,QAAQ,CAAA,KAAA,KAAS,GAAA,CAAI,UAAA,CAAW,KAAK,CAAC,CAAA;AACzE,MAAA,kBAAA,CAAmB,OAAA,CAAQ,OAAO,CAAC,CAAA,CAAE,QAAQ,CAAA,OAAA,KAAW,GAAA,CAAI,YAAA,CAAa,OAAO,CAAC,CAAA;AAAA,IACnF;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,UAAA,GAAaA,iBAAA,CAAY,CAAC,KAAA,KAAgC;AAC9D,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,OAAA,CAAQ,OAAA,CAAQ,WAAW,KAAK,CAAA;AAAA,IAClC,CAAA,MAAO;AACL,MAAA,gBAAA,CAAiB,OAAA,CAAQ,KAAK,KAAK,CAAA;AAAA,IACrC;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,YAAA,GAAeA,iBAAA,CAAY,CAAC,OAAA,KAA2B;AAC3D,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,OAAA,CAAQ,OAAA,CAAQ,aAAa,OAAO,CAAA;AAAA,IACtC,CAAA,MAAO;AACL,MAAA,kBAAA,CAAmB,OAAA,CAAQ,KAAK,OAAO,CAAA;AAAA,IACzC;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,aAAA,GAAgBA,iBAAA,CAAY,CAAC,YAAA,KAAsD;AAGvF,IAAA,OAAO,OAAA,CAAQ,OAAA,EAAS,aAAA,CAAc,YAAY,CAAA,IAAK,IAAA;AAAA,EACzD,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,aAAA,GAAgBA,kBAAY,YAAY;AAC5C,IAAA,MAAM,OAAA,CAAQ,SAAS,aAAA,EAAc;AAAA,EACvC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,YAAA,GAAeC,cAA4B,OAAO;AAAA,IACtD,MAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA,UAAA;AAAA,IACA,YAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACF,CAAA,EAAI,CAAC,MAAA,EAAQ,OAAA,EAAS,OAAO,UAAA,EAAY,YAAA,EAAc,aAAA,EAAe,aAAa,CAAC,CAAA;AAIpF,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,aAAA,CAAc,YAAY,CAAA;AAAA,EAC5B,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AACjB,EAAAA,eAAA,CAAU,MAAM,MAAM,WAAA,EAAY,EAAG,EAAE,CAAA;AAEvC,EAAA,uBACEC,eAAA,CAAAC,mBAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,QAAA;AAAA,IACA,OAAA,oBACCC,cAAA;AAAA,MAAC,cAAA;AAAA,MAAA;AAAA,QACC,OAAA;AAAA,QACA,QAAA;AAAA,QACA,WAAA;AAAA,QACA,gBAAA;AAAA,QACA,iBAAA;AAAA,QACA,iBAAA;AAAA,QACA,eAAA;AAAA,QACA,UAAA,EAAY,cAAA;AAAA,QACZ,OAAA,EAAS;AAAA;AAAA;AACX,GAAA,EAEJ,CAAA;AAEJ;AASO,SAAS,eAAA,GAAuC;AACrD,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,SAAA,EAAU;AAC7B,EAAA,OAAO,MAAA;AACT;AAKO,SAAS,cAAA,GAAiB;AAC/B,EAAA,MAAM,EAAE,UAAA,EAAW,GAAI,SAAA,EAAU;AACjC,EAAA,OAAO,UAAA;AACT;AAKO,SAAS,gBAAA,GAAmB;AACjC,EAAA,MAAM,EAAE,YAAA,EAAa,GAAI,SAAA,EAAU;AACnC,EAAA,OAAO,EAAE,YAAA,EAAa;AACxB;AAKO,SAAS,oBAAoB,YAAA,EAIlC;AACA,EAAA,MAAM,EAAE,aAAA,EAAe,MAAA,EAAO,GAAI,SAAA,EAAU;AAC5C,EAAA,MAAM,UAAA,GAAa,cAAc,YAAY,CAAA;AAG7C,EAAA,MAAM,aAAa,MAAA,EAAQ,WAAA,EAAa,KAAK,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,YAAY,CAAA;AACvE,EAAA,MAAM,SAAA,GAAY,YAAY,MAAA,KAAW,SAAA;AAEzC,EAAA,OAAO;AAAA,IACL,UAAA,EAAY,YAAY,UAAA,GAAa,IAAA;AAAA,IACrC,OAAA,EAAS,SAAA,IAAa,UAAA,GAAa,UAAA,CAAW,WAAA,GAAc,IAAA;AAAA,IAC5D,SAAA,EAAW,CAAC,UAAA,IAAc,UAAA,CAAW,WAAA,KAAgB;AAAA,GACvD;AACF","file":"chunk-YYOGUTLV.js","sourcesContent":["'use client'\n\n/**\n * Signal store — module singleton behind useSignal().\n *\n * 4.0: SignalBridge no longer wraps page children in a React context; it\n * mounts as a childless sibling and publishes its API here. useSignal()\n * subscribes via useSyncExternalStore, so consumers work anywhere in the\n * tree — and BEFORE the bridge mounts, they get a buffering stub whose\n * trackEvent/trackOutcome queue calls that the bridge drains on publish.\n * getExperiment returns null pre-publish, identical to the pre-config\n * `loading` window consumers already handle.\n *\n * Behavior change vs 3.x (major): useSignal() no longer throws outside a\n * SignalBridge. With signal disabled it stays a bounded no-op stub — a\n * one-time debug warning fires instead of a crash.\n */\n\nimport { useSyncExternalStore } from 'react'\nimport type {\n SignalContextValue,\n SignalEvent,\n SignalOutcome,\n} from './types'\n\nconst pendingEvents: Partial<SignalEvent>[] = []\nconst pendingOutcomes: SignalOutcome[] = []\nconst MAX_PENDING = 100\nlet warnedNoBridge = false\n\n/** Frozen pre-bridge stub — stable reference (useSyncExternalStore requirement). */\nconst STUB: SignalContextValue = Object.freeze({\n config: null,\n loading: true,\n error: null,\n trackEvent: (event: Partial<SignalEvent>) => {\n if (pendingEvents.length < MAX_PENDING) pendingEvents.push(event)\n else if (!warnedNoBridge) {\n warnedNoBridge = true\n console.warn('[site-kit] Signal events are queuing but no SignalBridge has mounted — is signal enabled on SiteKitLayout?')\n }\n },\n trackOutcome: (outcome: SignalOutcome) => {\n if (pendingOutcomes.length < MAX_PENDING) pendingOutcomes.push(outcome)\n },\n getExperiment: () => null,\n refreshConfig: async () => {},\n})\n\nlet current: SignalContextValue = STUB\nconst listeners = new Set<() => void>()\n\nfunction emit() {\n for (const l of listeners) l()\n}\n\n/** Bridge-side: publish the live API (called whenever its value changes). */\nexport function publishSignal(value: SignalContextValue): void {\n const firstPublish = current === STUB\n current = value\n if (firstPublish) {\n // Drain calls made before the bridge mounted. The bridge's own trackEvent\n // buffers again internally until SignalCore loads, so nothing is lost.\n pendingEvents.splice(0).forEach(e => value.trackEvent(e))\n pendingOutcomes.splice(0).forEach(o => value.trackOutcome(o))\n }\n emit()\n}\n\n/** Bridge-side: reset on unmount so a remount starts clean (tests, HMR). */\nexport function resetSignal(): void {\n current = STUB\n emit()\n}\n\nfunction subscribe(onChange: () => void) {\n listeners.add(onChange)\n return () => listeners.delete(onChange)\n}\n\nconst getSnapshot = () => current\nconst getServerSnapshot = () => STUB\n\n/**\n * Access Signal (experiments, behavioral events) from anywhere in the tree.\n * No provider required — see module docs for pre-mount buffering semantics.\n */\nexport function useSignal(): SignalContextValue {\n return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot)\n}\n","/**\n * @sonordev/site-kit/signal - SignalBridge\n *\n * Central coordination layer for Signal AI integration.\n *\n * Architecture (2026-07 perf release): SignalBridge is a tiny SSR-SAFE context shell. It\n * renders {children} immediately — children server-render and hydrate\n * normally, no ssr:false wrapper — and lazy-loads the heavy machinery\n * (SignalCore: config fetch, SSE streaming, experiment assignment, event\n * queue, behavior tracking) as a CHILDLESS sibling. The core registers its\n * imperative API into the shell on mount; `trackEvent`/`trackOutcome` calls\n * made before the core is ready are buffered and drained on registration.\n *\n * This removes the old failure mode where enabling `signal` de-opted the\n * whole route to client rendering (the same SSR bailout the analytics\n * sibling-mount fixed) — the #1 recommendation of the 2026-07 perf audit.\n *\n * The core is NOT idle-deferred: experiment variants must apply as early as\n * possible, so it starts loading on hydration.\n */\n\n'use client'\n\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport dynamic from 'next/dynamic'\nimport type { SignalCoreApi, SignalCoreState } from './SignalCore'\nimport type {\n SignalConfig,\n SignalContextValue,\n SignalBridgeProps,\n SignalEvent,\n SignalOutcome,\n ExperimentAssignment,\n} from './types'\n\n// Heavy machinery — loaded client-side only, never wraps content.\nimport { publishSignal, resetSignal, useSignal } from './store'\n\nconst LazySignalCore = dynamic(\n () => import('./SignalCore').then(m => ({ default: m.SignalCore })),\n { ssr: false },\n)\n\n// ============================================\n// Context\n// ============================================\n\n// 4.0: the context is gone. useSignal() reads the module store, so consumers\n// work anywhere in the tree and SignalBridge mounts as a childless sibling.\nexport { useSignal } from './store'\n\n// ============================================\n// SignalBridge Component (shell)\n// ============================================\n\nexport function SignalBridge({\n enabled = true,\n realtime = true,\n experiments = true,\n behaviorTracking = true,\n visitorId: externalVisitorId,\n sessionId: externalSessionId,\n pageMetadataRef,\n children,\n}: SignalBridgeProps) {\n const [config, setConfig] = useState<SignalConfig | null>(null)\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<Error | null>(null)\n\n const coreRef = useRef<SignalCoreApi | null>(null)\n // Calls made before the core chunk loads are buffered here and drained on\n // registration — consumers can call trackEvent/trackOutcome from first render.\n const pendingEventsRef = useRef<Partial<SignalEvent>[]>([])\n const pendingOutcomesRef = useRef<SignalOutcome[]>([])\n\n const handleState = useCallback((state: SignalCoreState) => {\n setConfig(state.config)\n setLoading(state.loading)\n setError(state.error)\n }, [])\n\n const handleRegister = useCallback((api: SignalCoreApi | null) => {\n coreRef.current = api\n if (api) {\n pendingEventsRef.current.splice(0).forEach(event => api.trackEvent(event))\n pendingOutcomesRef.current.splice(0).forEach(outcome => api.trackOutcome(outcome))\n }\n }, [])\n\n const trackEvent = useCallback((event: Partial<SignalEvent>) => {\n if (coreRef.current) {\n coreRef.current.trackEvent(event)\n } else {\n pendingEventsRef.current.push(event)\n }\n }, [])\n\n const trackOutcome = useCallback((outcome: SignalOutcome) => {\n if (coreRef.current) {\n coreRef.current.trackOutcome(outcome)\n } else {\n pendingOutcomesRef.current.push(outcome)\n }\n }, [])\n\n const getExperiment = useCallback((experimentId: string): ExperimentAssignment | null => {\n // null before the core loads — identical to the pre-config-fetch behavior\n // consumers already handle via `loading`.\n return coreRef.current?.getExperiment(experimentId) ?? null\n }, [])\n\n const refreshConfig = useCallback(async () => {\n await coreRef.current?.refreshConfig()\n }, [])\n\n const contextValue = useMemo<SignalContextValue>(() => ({\n config,\n loading,\n error,\n trackEvent,\n trackOutcome,\n getExperiment,\n refreshConfig,\n }), [config, loading, error, trackEvent, trackOutcome, getExperiment, refreshConfig])\n\n // Publish to the module store (drains pre-mount buffered calls on first\n // publish); reset on unmount so tests/HMR start clean.\n useEffect(() => {\n publishSignal(contextValue)\n }, [contextValue])\n useEffect(() => () => resetSignal(), [])\n\n return (\n <>\n {children}\n {enabled && (\n <LazySignalCore\n enabled={enabled}\n realtime={realtime}\n experiments={experiments}\n behaviorTracking={behaviorTracking}\n externalVisitorId={externalVisitorId}\n externalSessionId={externalSessionId}\n pageMetadataRef={pageMetadataRef}\n onRegister={handleRegister}\n onState={handleState}\n />\n )}\n </>\n )\n}\n\n// ============================================\n// Convenience Hooks\n// ============================================\n\n/**\n * Hook to access Signal config\n */\nexport function useSignalConfig(): SignalConfig | null {\n const { config } = useSignal()\n return config\n}\n\n/**\n * Hook for tracking events\n */\nexport function useSignalEvent() {\n const { trackEvent } = useSignal()\n return trackEvent\n}\n\n/**\n * Hook for tracking outcomes/conversions\n */\nexport function useSignalOutcome() {\n const { trackOutcome } = useSignal()\n return { trackOutcome }\n}\n\n/**\n * Hook for experiment assignment\n */\nexport function useSignalExperiment(experimentId: string): {\n assignment: ExperimentAssignment | null\n variant: string | null\n isControl: boolean\n} {\n const { getExperiment, config } = useSignal()\n const assignment = getExperiment(experimentId)\n\n // Check if experiment is running\n const experiment = config?.experiments?.find(e => e.id === experimentId)\n const isRunning = experiment?.status === 'running'\n\n return {\n assignment: isRunning ? assignment : null,\n variant: isRunning && assignment ? assignment.variant_key : null,\n isControl: !assignment || assignment.variant_key === 'control',\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/signal/store.ts","../src/signal/SignalBridge.tsx"],"names":["useSyncExternalStore","dynamic","useState","useRef","useCallback","useMemo","useEffect","jsxs","Fragment","jsx"],"mappings":"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","file":"chunk-S3RPDQA7.js","sourcesContent":["'use client'\n\n/**\n * Signal store — module singleton behind useSignal().\n *\n * 4.0: SignalBridge no longer wraps page children in a React context; it\n * mounts as a childless sibling and publishes its API here. useSignal()\n * subscribes via useSyncExternalStore, so consumers work anywhere in the\n * tree — and BEFORE the bridge mounts, they get a buffering stub whose\n * trackEvent/trackOutcome queue calls that the bridge drains on publish.\n * getExperiment returns null pre-publish, identical to the pre-config\n * `loading` window consumers already handle.\n *\n * Behavior change vs 3.x (major): useSignal() no longer throws outside a\n * SignalBridge. With signal disabled it stays a bounded no-op stub — a\n * one-time debug warning fires instead of a crash.\n */\n\nimport { useSyncExternalStore } from 'react'\nimport type {\n SignalContextValue,\n SignalEvent,\n SignalOutcome,\n} from './types'\n\nconst pendingEvents: Partial<SignalEvent>[] = []\nconst pendingOutcomes: SignalOutcome[] = []\nconst MAX_PENDING = 100\nlet warnedNoBridge = false\n\n/** Frozen pre-bridge stub — stable reference (useSyncExternalStore requirement). */\nconst STUB: SignalContextValue = Object.freeze({\n config: null,\n loading: true,\n error: null,\n trackEvent: (event: Partial<SignalEvent>) => {\n if (pendingEvents.length < MAX_PENDING) pendingEvents.push(event)\n else if (!warnedNoBridge) {\n warnedNoBridge = true\n console.warn('[site-kit] Signal events are queuing but no SignalBridge has mounted — is signal enabled on SiteKitLayout?')\n }\n },\n trackOutcome: (outcome: SignalOutcome) => {\n if (pendingOutcomes.length < MAX_PENDING) pendingOutcomes.push(outcome)\n },\n getExperiment: () => null,\n refreshConfig: async () => {},\n})\n\nlet current: SignalContextValue = STUB\nconst listeners = new Set<() => void>()\n\nfunction emit() {\n for (const l of listeners) l()\n}\n\n/** Bridge-side: publish the live API (called whenever its value changes). */\nexport function publishSignal(value: SignalContextValue): void {\n const firstPublish = current === STUB\n current = value\n if (firstPublish) {\n // Drain calls made before the bridge mounted. The bridge's own trackEvent\n // buffers again internally until SignalCore loads, so nothing is lost.\n pendingEvents.splice(0).forEach(e => value.trackEvent(e))\n pendingOutcomes.splice(0).forEach(o => value.trackOutcome(o))\n }\n emit()\n}\n\n/** Bridge-side: reset on unmount so a remount starts clean (tests, HMR). */\nexport function resetSignal(): void {\n current = STUB\n emit()\n}\n\nfunction subscribe(onChange: () => void) {\n listeners.add(onChange)\n return () => listeners.delete(onChange)\n}\n\nconst getSnapshot = () => current\nconst getServerSnapshot = () => STUB\n\n/**\n * Access Signal (experiments, behavioral events) from anywhere in the tree.\n * No provider required — see module docs for pre-mount buffering semantics.\n */\nexport function useSignal(): SignalContextValue {\n return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot)\n}\n","/**\n * @sonordev/site-kit/signal - SignalBridge\n *\n * Central coordination layer for Signal AI integration.\n *\n * Architecture (2026-07 perf release): SignalBridge is a tiny SSR-SAFE context shell. It\n * renders {children} immediately — children server-render and hydrate\n * normally, no ssr:false wrapper — and lazy-loads the heavy machinery\n * (SignalCore: config fetch, SSE streaming, experiment assignment, event\n * queue, behavior tracking) as a CHILDLESS sibling. The core registers its\n * imperative API into the shell on mount; `trackEvent`/`trackOutcome` calls\n * made before the core is ready are buffered and drained on registration.\n *\n * This removes the old failure mode where enabling `signal` de-opted the\n * whole route to client rendering (the same SSR bailout the analytics\n * sibling-mount fixed) — the #1 recommendation of the 2026-07 perf audit.\n *\n * The core is NOT idle-deferred: experiment variants must apply as early as\n * possible, so it starts loading on hydration.\n */\n\n'use client'\n\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport dynamic from 'next/dynamic'\nimport type { SignalCoreApi, SignalCoreState } from './SignalCore'\nimport type {\n SignalConfig,\n SignalContextValue,\n SignalBridgeProps,\n SignalEvent,\n SignalOutcome,\n ExperimentAssignment,\n} from './types'\n\n// Heavy machinery — loaded client-side only, never wraps content.\nimport { publishSignal, resetSignal, useSignal } from './store'\n\nconst LazySignalCore = dynamic(\n () => import('./SignalCore').then(m => ({ default: m.SignalCore })),\n { ssr: false },\n)\n\n// ============================================\n// Context\n// ============================================\n\n// 4.0: the context is gone. useSignal() reads the module store, so consumers\n// work anywhere in the tree and SignalBridge mounts as a childless sibling.\nexport { useSignal } from './store'\n\n// ============================================\n// SignalBridge Component (shell)\n// ============================================\n\nexport function SignalBridge({\n enabled = true,\n realtime = true,\n experiments = true,\n behaviorTracking = true,\n visitorId: externalVisitorId,\n sessionId: externalSessionId,\n pageMetadataRef,\n children,\n}: SignalBridgeProps) {\n const [config, setConfig] = useState<SignalConfig | null>(null)\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<Error | null>(null)\n\n const coreRef = useRef<SignalCoreApi | null>(null)\n // Calls made before the core chunk loads are buffered here and drained on\n // registration — consumers can call trackEvent/trackOutcome from first render.\n const pendingEventsRef = useRef<Partial<SignalEvent>[]>([])\n const pendingOutcomesRef = useRef<SignalOutcome[]>([])\n\n const handleState = useCallback((state: SignalCoreState) => {\n setConfig(state.config)\n setLoading(state.loading)\n setError(state.error)\n }, [])\n\n const handleRegister = useCallback((api: SignalCoreApi | null) => {\n coreRef.current = api\n if (api) {\n pendingEventsRef.current.splice(0).forEach(event => api.trackEvent(event))\n pendingOutcomesRef.current.splice(0).forEach(outcome => api.trackOutcome(outcome))\n }\n }, [])\n\n const trackEvent = useCallback((event: Partial<SignalEvent>) => {\n if (coreRef.current) {\n coreRef.current.trackEvent(event)\n } else {\n pendingEventsRef.current.push(event)\n }\n }, [])\n\n const trackOutcome = useCallback((outcome: SignalOutcome) => {\n if (coreRef.current) {\n coreRef.current.trackOutcome(outcome)\n } else {\n pendingOutcomesRef.current.push(outcome)\n }\n }, [])\n\n const getExperiment = useCallback((experimentId: string): ExperimentAssignment | null => {\n // null before the core loads — identical to the pre-config-fetch behavior\n // consumers already handle via `loading`.\n return coreRef.current?.getExperiment(experimentId) ?? null\n }, [])\n\n const refreshConfig = useCallback(async () => {\n await coreRef.current?.refreshConfig()\n }, [])\n\n const contextValue = useMemo<SignalContextValue>(() => ({\n config,\n loading,\n error,\n trackEvent,\n trackOutcome,\n getExperiment,\n refreshConfig,\n }), [config, loading, error, trackEvent, trackOutcome, getExperiment, refreshConfig])\n\n // Publish to the module store (drains pre-mount buffered calls on first\n // publish); reset on unmount so tests/HMR start clean.\n useEffect(() => {\n publishSignal(contextValue)\n }, [contextValue])\n useEffect(() => () => resetSignal(), [])\n\n return (\n <>\n {children}\n {enabled && (\n <LazySignalCore\n enabled={enabled}\n realtime={realtime}\n experiments={experiments}\n behaviorTracking={behaviorTracking}\n externalVisitorId={externalVisitorId}\n externalSessionId={externalSessionId}\n pageMetadataRef={pageMetadataRef}\n onRegister={handleRegister}\n onState={handleState}\n />\n )}\n </>\n )\n}\n\n// ============================================\n// Convenience Hooks\n// ============================================\n\n/**\n * Hook to access Signal config\n */\nexport function useSignalConfig(): SignalConfig | null {\n const { config } = useSignal()\n return config\n}\n\n/**\n * Hook for tracking events\n */\nexport function useSignalEvent() {\n const { trackEvent } = useSignal()\n return trackEvent\n}\n\n/**\n * Hook for tracking outcomes/conversions\n */\nexport function useSignalOutcome() {\n const { trackOutcome } = useSignal()\n return { trackOutcome }\n}\n\n/**\n * Hook for experiment assignment\n */\nexport function useSignalExperiment(experimentId: string): {\n assignment: ExperimentAssignment | null\n variant: string | null\n isControl: boolean\n} {\n const { getExperiment, config } = useSignal()\n const assignment = getExperiment(experimentId)\n\n // Check if experiment is running\n const experiment = config?.experiments?.find(e => e.id === experimentId)\n const isRunning = experiment?.status === 'running'\n\n return {\n assignment: isRunning ? assignment : null,\n variant: isRunning && assignment ? assignment.variant_key : null,\n isControl: !assignment || assignment.variant_key === 'control',\n }\n}\n"]}
|
|
@@ -10,13 +10,12 @@ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
|
10
10
|
var React__default = /*#__PURE__*/_interopDefault(React);
|
|
11
11
|
|
|
12
12
|
var InteractiveForm = React.lazy(
|
|
13
|
-
() => import('./ManagedForm-
|
|
13
|
+
() => import('./ManagedForm-MKSPZAI3.js').then((m) => ({ default: m.ManagedForm }))
|
|
14
14
|
);
|
|
15
15
|
function FormEnhancer({
|
|
16
16
|
formId,
|
|
17
17
|
initialConfig,
|
|
18
18
|
className,
|
|
19
|
-
nativeReturnTo,
|
|
20
19
|
experience,
|
|
21
20
|
defaultValues,
|
|
22
21
|
onSuccess,
|
|
@@ -41,7 +40,6 @@ function FormEnhancer({
|
|
|
41
40
|
formId,
|
|
42
41
|
initialConfig,
|
|
43
42
|
className,
|
|
44
|
-
nativeReturnTo,
|
|
45
43
|
experience,
|
|
46
44
|
defaultValues,
|
|
47
45
|
onSuccess,
|
|
@@ -106,5 +104,5 @@ function EnterStyles() {
|
|
|
106
104
|
}
|
|
107
105
|
|
|
108
106
|
exports.FormEnhancer = FormEnhancer;
|
|
109
|
-
//# sourceMappingURL=chunk-
|
|
110
|
-
//# sourceMappingURL=chunk-
|
|
107
|
+
//# sourceMappingURL=chunk-SBCG2ZLK.js.map
|
|
108
|
+
//# sourceMappingURL=chunk-SBCG2ZLK.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/forms/FormEnhancer.tsx"],"names":["lazy","useDeferredActivation","useState","jsxs","jsx","Suspense","React","useRef","useEffect"],"mappings":"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","file":"chunk-SBCG2ZLK.js","sourcesContent":["'use client'\n\n/**\n * FormEnhancer — the only client code a managed form needs up front.\n *\n * Renders the server-rendered shell (<StaticForm>, passed as `children`) until\n * an idle/first-interaction gate fires, then lazy-imports the interactive form\n * and swaps it in. Everything expensive — validation, conditional logic,\n * spotlight/stage, celebration, momentum — lives behind that dynamic import,\n * so a page ships this boundary and nothing else in its initial chunk set.\n *\n * The shell is a REAL form the whole time (native action + signed token), so\n * the progression is:\n *\n * no JS at all -> shell, submits natively. Works.\n * JS, pre-idle -> shell, submits natively. Works.\n * JS, post-idle -> enhanced form, submits over JSON. Works, with delight.\n * chunk 404s -> shell stays. Works. (Never left blank.)\n *\n * That last line is the invariant to protect: the shell is only removed once\n * the enhancement has actually rendered. Do not \"hide the shell then load\" —\n * a CDN hiccup would leave a visitor staring at an empty box where the form\n * used to be.\n *\n * ── Entrance animation ──────────────────────────────────────────────────\n *\n * Above-the-fold forms upgrade while the visitor is looking at them, so the\n * swap must not pop. The wrapper carries `data-sk-form-mount=\"shell\"` and\n * flips to `\"enhanced\"`, and the enhanced form gets `data-sk-enter` for one\n * frame, so a site can style the transition entirely in CSS:\n *\n * [data-sk-form-mount] { transition: opacity .35s ease }\n * [data-sk-form-mount=\"shell\"] { opacity: .6 }\n *\n * Defaults ship as CSS variables rather than hard-coded values:\n *\n * --sk-form-enter-duration (default 320ms)\n * --sk-form-enter-easing (default cubic-bezier(.22,1,.36,1))\n * --sk-form-enter-distance (default 6px)\n *\n * `enter=\"none\"` opts out entirely; `enter=\"custom\"` emits the data\n * attributes but no site-kit styles, leaving the animation to the site.\n * Every default is collapsed by prefers-reduced-motion.\n */\n\nimport React, { lazy, Suspense, useEffect, useRef, useState } from 'react'\nimport { useDeferredActivation } from '../shared/defer'\nimport type { FormExperience, FormSubmission } from './types'\n\n/** The heavy half. Nothing else in this module may import it statically. */\nconst InteractiveForm = lazy(() =>\n import('./ManagedForm').then((m) => ({ default: m.ManagedForm })),\n)\n\nexport type FormEnterAnimation = 'fade' | 'none' | 'custom'\n\nexport interface FormEnhancerProps {\n formId: string\n /** Server-fetched raw config — hands the enhancement its fields instantly. */\n initialConfig?: Record<string, unknown> | null\n className?: string\n /** @deprecated Ignored since 6.3.2 (the no-JavaScript form POST was removed). */\n nativeReturnTo?: string\n experience?: FormExperience\n /** Pre-fill field values by slug. See ManagedForm.defaultValues. */\n defaultValues?: Record<string, unknown>\n onSuccess?: (submission: FormSubmission) => void\n onError?: (error: Error) => void\n /**\n * How the enhanced form arrives. 'fade' (default) crossfades and lifts it\n * into place; 'none' swaps instantly; 'custom' emits the data attributes\n * and no styles so the site owns the animation.\n */\n enter?: FormEnterAnimation\n /**\n * Set false to enhance immediately instead of waiting for idle. Only worth\n * it for a form that is the entire point of the page AND above the fold.\n */\n defer?: boolean\n /** The server-rendered <StaticForm>. Shown until the enhancement mounts. */\n children: React.ReactNode\n}\n\nexport function FormEnhancer({\n formId,\n initialConfig,\n className,\n experience,\n defaultValues,\n onSuccess,\n onError,\n enter = 'fade',\n defer = true,\n children,\n}: FormEnhancerProps) {\n const ready = useDeferredActivation(defer)\n // Flipped only after the enhancement has actually committed to the DOM, so\n // the shell never disappears ahead of its replacement.\n const [enhanced, setEnhanced] = useState(false)\n\n return (\n <div\n data-sk-form-mount={enhanced ? 'enhanced' : 'shell'}\n data-sk-part=\"form-mount\"\n style={enter === 'fade' ? FADE_HOST : undefined}\n >\n {enter === 'fade' && <EnterStyles />}\n {ready ? (\n <Suspense fallback={children}>\n <Enhanced onMount={() => setEnhanced(true)} fallback={children}>\n <InteractiveForm\n formId={formId}\n initialConfig={initialConfig}\n className={className}\n experience={experience}\n defaultValues={defaultValues}\n onSuccess={onSuccess}\n onError={onError}\n />\n </Enhanced>\n </Suspense>\n ) : (\n children\n )}\n </div>\n )\n}\n\n/**\n * Reports the moment the enhancement is on screen, and keeps the shell\n * rendered if it throws. An error boundary is the difference between \"the\n * fancy version failed\" and \"there is no form on this page\".\n */\nclass Enhanced extends React.Component<\n { onMount: () => void; fallback: React.ReactNode; children: React.ReactNode },\n { failed: boolean }\n> {\n state = { failed: false }\n\n static getDerivedStateFromError() {\n return { failed: true }\n }\n\n componentDidCatch(err: unknown) {\n console.error('[Forms] Enhancement failed; keeping the native form:', err)\n }\n\n componentDidMount() {\n if (!this.state.failed) this.props.onMount()\n }\n\n render() {\n if (this.state.failed) return this.props.fallback\n return <FrameTag>{this.props.children}</FrameTag>\n }\n}\n\n/** Adds data-sk-enter for one frame so a CSS transition has something to run. */\nfunction FrameTag({ children }: { children: React.ReactNode }) {\n const ref = useRef<HTMLDivElement>(null)\n useEffect(() => {\n const el = ref.current\n if (!el) return\n el.setAttribute('data-sk-enter', '')\n const id = requestAnimationFrame(() => el.removeAttribute('data-sk-enter'))\n return () => cancelAnimationFrame(id)\n }, [])\n return (\n <div ref={ref} style={{ display: 'contents' }}>\n {children}\n </div>\n )\n}\n\nconst FADE_HOST: React.CSSProperties = {\n transition:\n 'opacity var(--sk-form-enter-duration, 320ms) var(--sk-form-enter-easing, cubic-bezier(.22,1,.36,1))',\n}\n\n/**\n * Scoped to [data-sk-part=\"form-mount\"] so it can never touch a site's own\n * markup. Emitted once per form; identical text dedupes in every browser's\n * style cache and gzips to nothing.\n */\nfunction EnterStyles() {\n return (\n <style\n // biome-ignore lint/security/noDangerouslySetInnerHtml: static string, no interpolation\n dangerouslySetInnerHTML={{\n __html: `\n[data-sk-part=\"form-mount\"][data-sk-form-mount=\"shell\"]{opacity:.55}\n[data-sk-part=\"form-mount\"][data-sk-form-mount=\"enhanced\"]{opacity:1}\n[data-sk-part=\"form-mount\"] [data-sk-enter]{opacity:0;transform:translateY(var(--sk-form-enter-distance,6px))}\n[data-sk-part=\"form-mount\"] [data-sk-enter] *{transition:none!important}\n@media (prefers-reduced-motion: reduce){\n[data-sk-part=\"form-mount\"]{transition:none!important}\n[data-sk-part=\"form-mount\"][data-sk-form-mount=\"shell\"]{opacity:1}\n[data-sk-part=\"form-mount\"] [data-sk-enter]{opacity:1;transform:none}\n}`,\n }}\n />\n )\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
import { useSignalExperiment, useSignalEvent } from './chunk-
|
|
2
|
+
import { useSignalExperiment, useSignalEvent } from './chunk-M26C37WI.mjs';
|
|
3
3
|
import React, { useEffect } from 'react';
|
|
4
4
|
import { jsx, Fragment } from 'react/jsx-runtime';
|
|
5
5
|
|
|
@@ -71,5 +71,5 @@ function ExperimentConversion({
|
|
|
71
71
|
}
|
|
72
72
|
|
|
73
73
|
export { ExperimentConversion, SignalExperiment, useExperimentVariant };
|
|
74
|
-
//# sourceMappingURL=chunk-
|
|
75
|
-
//# sourceMappingURL=chunk-
|
|
74
|
+
//# sourceMappingURL=chunk-T4ZA4RCC.mjs.map
|
|
75
|
+
//# sourceMappingURL=chunk-T4ZA4RCC.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/signal/SignalExperiment.tsx"],"names":[],"mappings":";;;;AAgDO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,YAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,eAAA,GAAkB,IAAA;AAAA,EAClB;AACF,CAAA,EAA0B;AACxB,EAAA,MAAM,EAAE,UAAA,EAAY,OAAA,EAAS,SAAA,EAAU,GAAI,oBAAoB,YAAY,CAAA;AAC3E,EAAA,MAAM,aAAa,cAAA,EAAe;AAGlC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,mBAAmB,OAAA,EAAS;AAC9B,MAAA,UAAA,CAAW;AAAA,QACT,UAAA,EAAY,YAAA;AAAA,QACZ,UAAA,EAAY,YAAA;AAAA,QACZ,UAAA,EAAY;AAAA,UACV,aAAA,EAAe,YAAA;AAAA,UACf,WAAA,EAAa;AAAA;AACf,OACD,CAAA;AAAA,IACH;AAAA,EACF,GAAG,CAAC,YAAA,EAAc,OAAA,EAAS,eAAA,EAAiB,UAAU,CAAC,CAAA;AAGvD,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,uBAAO,GAAA,CAAA,QAAA,EAAA,EAAG,mBAAS,EAAE,OAAA,EAAS,WAAW,SAAA,EAAW,SAAA,EAAW,CAAA,EAAE,CAAA;AAAA,EACnE;AAGA,EAAA,MAAM,kBAAkB,OAAA,IAAW,SAAA;AACnC,EAAA,MAAM,OAAA,GAAU,SAAS,eAAe,CAAA;AAExC,EAAA,IAAI,YAAY,MAAA,EAAW;AACzB,IAAA,uCAAU,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,EACpB;AAGA,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,uCAAU,QAAA,EAAA,QAAA,EAAS,CAAA;AAAA,EACrB;AAEA,EAAA,uBAAO,GAAA,CAAA,QAAA,EAAA,EAAG,QAAA,EAAA,QAAA,CAAS,OAAA,IAAW,IAAA,EAAK,CAAA;AACrC;AAYO,SAAS,qBAAqB,YAAA,EAAsB;AACzD,EAAA,OAAO,oBAAoB,YAAY,CAAA;AACzC;AAoBO,SAAS,oBAAA,CAAqB;AAAA,EACnC,YAAA;AAAA,EACA,WAAA,GAAc,OAAA;AAAA,EACd,KAAA;AAAA,EACA;AACF,CAAA,EAKG;AACD,EAAA,MAAM,aAAa,cAAA,EAAe;AAClC,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,mBAAA,CAAoB,YAAY,CAAA;AAEpD,EAAA,MAAM,oBAAoB,MAAM;AAC9B,IAAA,UAAA,CAAW;AAAA,MACT,UAAA,EAAY,YAAA;AAAA,MACZ,UAAA,EAAY,YAAA;AAAA,MACZ,UAAA,EAAY;AAAA,QACV,aAAA,EAAe,YAAA;AAAA,QACf,WAAA,EAAa,OAAA;AAAA,QACb,YAAA,EAAc,WAAA;AAAA,QACd;AAAA;AACF,KACD,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,OAAO,KAAA,CAAM,aAAa,QAAA,EAAU;AAAA,IAClC,OAAA,EAAS,CAAC,CAAA,KAAwB;AAChC,MAAA,iBAAA,EAAkB;AAElB,MAAA,IAAK,QAAA,CAAS,MAAsD,OAAA,EAAS;AAC3E,QAAC,QAAA,CAAS,KAAA,CAAsD,OAAA,CAAS,CAAC,CAAA;AAAA,MAC5E;AAAA,IACF;AAAA,GACD,CAAA;AACH","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/signal/SignalExperiment.tsx"],"names":[],"mappings":";;;;AAgDO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,YAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,eAAA,GAAkB,IAAA;AAAA,EAClB;AACF,CAAA,EAA0B;AACxB,EAAA,MAAM,EAAE,UAAA,EAAY,OAAA,EAAS,SAAA,EAAU,GAAI,oBAAoB,YAAY,CAAA;AAC3E,EAAA,MAAM,aAAa,cAAA,EAAe;AAGlC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,mBAAmB,OAAA,EAAS;AAC9B,MAAA,UAAA,CAAW;AAAA,QACT,UAAA,EAAY,YAAA;AAAA,QACZ,UAAA,EAAY,YAAA;AAAA,QACZ,UAAA,EAAY;AAAA,UACV,aAAA,EAAe,YAAA;AAAA,UACf,WAAA,EAAa;AAAA;AACf,OACD,CAAA;AAAA,IACH;AAAA,EACF,GAAG,CAAC,YAAA,EAAc,OAAA,EAAS,eAAA,EAAiB,UAAU,CAAC,CAAA;AAGvD,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,uBAAO,GAAA,CAAA,QAAA,EAAA,EAAG,mBAAS,EAAE,OAAA,EAAS,WAAW,SAAA,EAAW,SAAA,EAAW,CAAA,EAAE,CAAA;AAAA,EACnE;AAGA,EAAA,MAAM,kBAAkB,OAAA,IAAW,SAAA;AACnC,EAAA,MAAM,OAAA,GAAU,SAAS,eAAe,CAAA;AAExC,EAAA,IAAI,YAAY,MAAA,EAAW;AACzB,IAAA,uCAAU,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,EACpB;AAGA,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,uCAAU,QAAA,EAAA,QAAA,EAAS,CAAA;AAAA,EACrB;AAEA,EAAA,uBAAO,GAAA,CAAA,QAAA,EAAA,EAAG,QAAA,EAAA,QAAA,CAAS,OAAA,IAAW,IAAA,EAAK,CAAA;AACrC;AAYO,SAAS,qBAAqB,YAAA,EAAsB;AACzD,EAAA,OAAO,oBAAoB,YAAY,CAAA;AACzC;AAoBO,SAAS,oBAAA,CAAqB;AAAA,EACnC,YAAA;AAAA,EACA,WAAA,GAAc,OAAA;AAAA,EACd,KAAA;AAAA,EACA;AACF,CAAA,EAKG;AACD,EAAA,MAAM,aAAa,cAAA,EAAe;AAClC,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,mBAAA,CAAoB,YAAY,CAAA;AAEpD,EAAA,MAAM,oBAAoB,MAAM;AAC9B,IAAA,UAAA,CAAW;AAAA,MACT,UAAA,EAAY,YAAA;AAAA,MACZ,UAAA,EAAY,YAAA;AAAA,MACZ,UAAA,EAAY;AAAA,QACV,aAAA,EAAe,YAAA;AAAA,QACf,WAAA,EAAa,OAAA;AAAA,QACb,YAAA,EAAc,WAAA;AAAA,QACd;AAAA;AACF,KACD,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,OAAO,KAAA,CAAM,aAAa,QAAA,EAAU;AAAA,IAClC,OAAA,EAAS,CAAC,CAAA,KAAwB;AAChC,MAAA,iBAAA,EAAkB;AAElB,MAAA,IAAK,QAAA,CAAS,MAAsD,OAAA,EAAS;AAC3E,QAAC,QAAA,CAAS,KAAA,CAAsD,OAAA,CAAS,CAAC,CAAA;AAAA,MAC5E;AAAA,IACF;AAAA,GACD,CAAA;AACH","file":"chunk-T4ZA4RCC.mjs","sourcesContent":["/**\n * @sonordev/site-kit/signal - SignalExperiment\n * \n * A/B test component that renders different variants based on Signal assignment.\n * Uses Thompson Sampling (Bayesian bandit) for optimization.\n */\n\n'use client'\n\nimport React, { useMemo, useEffect } from 'react'\nimport { useSignalExperiment, useSignalEvent } from './SignalBridge'\n\ninterface SignalExperimentProps {\n /** Unique experiment ID */\n experimentId: string\n \n /** Variants to test - keys are variant names, values are React nodes */\n variants: Record<string, React.ReactNode>\n \n /** Fallback content if no assignment (defaults to 'control' variant) */\n fallback?: React.ReactNode\n \n /** Track impression automatically */\n trackImpression?: boolean\n \n /** Children function for more control */\n children?: (props: { variant: string; isControl: boolean }) => React.ReactNode\n}\n\n/**\n * Renders different content variants based on Signal's A/B assignment.\n * \n * @example\n * // Simple variant switching\n * <SignalExperiment experimentId=\"hero-cta\" variants={{\n * control: <Button>Get Started</Button>,\n * variant_a: <Button variant=\"primary\">Start Free Trial</Button>,\n * variant_b: <Button variant=\"secondary\">Book a Demo</Button>,\n * }} />\n * \n * @example\n * // With render prop for more control\n * <SignalExperiment experimentId=\"pricing-layout\">\n * {({ variant, isControl }) => (\n * <PricingSection layout={isControl ? 'cards' : 'table'} />\n * )}\n * </SignalExperiment>\n */\nexport function SignalExperiment({\n experimentId,\n variants,\n fallback,\n trackImpression = true,\n children,\n}: SignalExperimentProps) {\n const { assignment, variant, isControl } = useSignalExperiment(experimentId)\n const trackEvent = useSignalEvent()\n \n // Track impression when variant is rendered\n useEffect(() => {\n if (trackImpression && variant) {\n trackEvent({\n event_type: 'experiment',\n event_name: 'impression',\n event_data: {\n experiment_id: experimentId,\n variant_key: variant,\n },\n })\n }\n }, [experimentId, variant, trackImpression, trackEvent])\n \n // If using render prop\n if (children) {\n return <>{children({ variant: variant || 'control', isControl })}</>\n }\n \n // Determine what to render\n const selectedVariant = variant || 'control'\n const content = variants[selectedVariant]\n \n if (content !== undefined) {\n return <>{content}</>\n }\n \n // Fallback to provided fallback or control\n if (fallback) {\n return <>{fallback}</>\n }\n \n return <>{variants.control || null}</>\n}\n\n/**\n * Hook for conditional experiment logic\n * \n * @example\n * const { variant, isControl } = useExperimentVariant('pricing-test')\n * \n * return isControl \n * ? <OldPricing />\n * : <NewPricing showAnnual={variant === 'annual_first'} />\n */\nexport function useExperimentVariant(experimentId: string) {\n return useSignalExperiment(experimentId)\n}\n\n/**\n * Component for tracking experiment conversions\n * Wraps interactive elements to track when they convert\n * \n * @example\n * <SignalExperiment experimentId=\"signup-button\" variants={{\n * control: (\n * <ExperimentConversion experimentId=\"signup-button\" outcomeType=\"click\">\n * <Button>Sign Up</Button>\n * </ExperimentConversion>\n * ),\n * variant_a: (\n * <ExperimentConversion experimentId=\"signup-button\" outcomeType=\"click\">\n * <Button variant=\"large\">Join Now - It's Free!</Button>\n * </ExperimentConversion>\n * ),\n * }} />\n */\nexport function ExperimentConversion({\n experimentId,\n outcomeType = 'click',\n value,\n children,\n}: {\n experimentId: string\n outcomeType?: string\n value?: number\n children: React.ReactElement<{ onClick?: (e: React.MouseEvent) => void }>\n}) {\n const trackEvent = useSignalEvent()\n const { variant } = useSignalExperiment(experimentId)\n\n const handleInteraction = () => {\n trackEvent({\n event_type: 'experiment',\n event_name: 'conversion',\n event_data: {\n experiment_id: experimentId,\n variant_key: variant,\n outcome_type: outcomeType,\n value,\n },\n })\n }\n\n return React.cloneElement(children, {\n onClick: (e: React.MouseEvent) => {\n handleInteraction()\n // Call original onClick if exists\n if ((children.props as { onClick?: (e: React.MouseEvent) => void }).onClick) {\n (children.props as { onClick?: (e: React.MouseEvent) => void }).onClick!(e)\n }\n },\n })\n}\n"]}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// src/forms/defaultSuccessMessage.ts
|
|
4
|
+
var DEFAULT_FORM_SUCCESS_MESSAGE = "Thank you for your submission! We will be in touch soon.";
|
|
5
|
+
|
|
6
|
+
// src/forms/normalize-config.ts
|
|
7
|
+
function normalizeFormConfig(data) {
|
|
8
|
+
if (data.steps) {
|
|
9
|
+
data.steps.sort((a, b) => (a.step_number || 0) - (b.step_number || 0));
|
|
10
|
+
}
|
|
11
|
+
if (data.fields) {
|
|
12
|
+
data.fields.sort((a, b) => (a.sort_order || 0) - (b.sort_order || 0));
|
|
13
|
+
}
|
|
14
|
+
const total_steps = data.steps?.length || 1;
|
|
15
|
+
const is_multi_step = total_steps > 1;
|
|
16
|
+
const apiSuccess = typeof data.success_message === "string" ? data.success_message.trim() : "";
|
|
17
|
+
const success_message = apiSuccess || (typeof data.successMessage === "string" ? String(data.successMessage).trim() : "") || DEFAULT_FORM_SUCCESS_MESSAGE;
|
|
18
|
+
return {
|
|
19
|
+
...data,
|
|
20
|
+
success_message,
|
|
21
|
+
total_steps,
|
|
22
|
+
is_multi_step
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
exports.DEFAULT_FORM_SUCCESS_MESSAGE = DEFAULT_FORM_SUCCESS_MESSAGE;
|
|
27
|
+
exports.normalizeFormConfig = normalizeFormConfig;
|
|
28
|
+
//# sourceMappingURL=chunk-TULCHQX2.js.map
|
|
29
|
+
//# sourceMappingURL=chunk-TULCHQX2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/forms/defaultSuccessMessage.ts","../src/forms/normalize-config.ts"],"names":[],"mappings":";;;AACO,IAAM,4BAAA,GACX;;;ACiBK,SAAS,oBAAoB,IAAA,EAA8B;AAChE,EAAA,IAAI,KAAK,KAAA,EAAO;AACd,IAAA,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,EAAQ,CAAA,KAAA,CAAY,EAAE,WAAA,IAAe,CAAA,KAAM,CAAA,CAAE,WAAA,IAAe,CAAA,CAAE,CAAA;AAAA,EACjF;AACA,EAAA,IAAI,KAAK,MAAA,EAAQ;AACf,IAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,EAAQ,CAAA,KAAA,CAAY,EAAE,UAAA,IAAc,CAAA,KAAM,CAAA,CAAE,UAAA,IAAc,CAAA,CAAE,CAAA;AAAA,EAChF;AAEA,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,EAAO,MAAA,IAAU,CAAA;AAC1C,EAAA,MAAM,gBAAgB,WAAA,GAAc,CAAA;AAEpC,EAAA,MAAM,UAAA,GACJ,OAAO,IAAA,CAAK,eAAA,KAAoB,WAAW,IAAA,CAAK,eAAA,CAAgB,MAAK,GAAI,EAAA;AAC3E,EAAA,MAAM,eAAA,GACJ,UAAA,KACC,OAAQ,IAAA,CAAqC,cAAA,KAAmB,QAAA,GAC7D,MAAA,CAAQ,IAAA,CAAqC,cAAc,CAAA,CAAE,IAAA,EAAK,GAClE,EAAA,CAAA,IACJ,4BAAA;AAEF,EAAA,OAAO;AAAA,IACL,GAAG,IAAA;AAAA,IACH,eAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACF;AACF","file":"chunk-TULCHQX2.js","sourcesContent":["/** Shown when the API omits or returns an empty `success_message`. */\nexport const DEFAULT_FORM_SUCCESS_MESSAGE =\n 'Thank you for your submission! We will be in touch soon.'\n","/**\n * Shared form-config normalizer — the ONE place a raw\n * /api/public/forms/config payload becomes a ManagedFormConfig.\n *\n * Deliberately has no `'use client'` directive and no hooks, so it is usable\n * from a Server Component (StaticForm) as well as from useForm's client\n * fetch. Both the server shell and the hydrated enhancement must agree on\n * field order, step count and success copy or the swap visibly jumps, so\n * there must never be a second copy of this.\n */\n\nimport type { ManagedFormConfig } from './types'\nimport { DEFAULT_FORM_SUCCESS_MESSAGE } from './defaultSuccessMessage'\n\n/**\n * Normalize a raw /api/public/forms/config payload into ManagedFormConfig.\n * Single source of truth — used for both the client fetch and server-provided\n * `initialForm`, so the two paths can never drift.\n */\nexport function normalizeFormConfig(data: any): ManagedFormConfig {\n if (data.steps) {\n data.steps.sort((a: any, b: any) => (a.step_number || 0) - (b.step_number || 0))\n }\n if (data.fields) {\n data.fields.sort((a: any, b: any) => (a.sort_order || 0) - (b.sort_order || 0))\n }\n\n const total_steps = data.steps?.length || 1\n const is_multi_step = total_steps > 1\n\n const apiSuccess =\n typeof data.success_message === 'string' ? data.success_message.trim() : ''\n const success_message =\n apiSuccess ||\n (typeof (data as { successMessage?: string }).successMessage === 'string'\n ? String((data as { successMessage?: string }).successMessage).trim()\n : '') ||\n DEFAULT_FORM_SUCCESS_MESSAGE\n\n return {\n ...data,\n success_message,\n total_steps,\n is_multi_step,\n }\n}\n"]}
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
|
|
4
4
|
var chunkESP5RMB7_js = require('./chunk-ESP5RMB7.js');
|
|
5
5
|
var chunkNBOBOYMT_js = require('./chunk-NBOBOYMT.js');
|
|
6
|
-
var
|
|
6
|
+
var chunkNNQJUMFQ_js = require('./chunk-NNQJUMFQ.js');
|
|
7
7
|
var chunkM2N7NY3V_js = require('./chunk-M2N7NY3V.js');
|
|
8
|
-
var
|
|
8
|
+
var chunkLPUP2TSV_js = require('./chunk-LPUP2TSV.js');
|
|
9
9
|
var react = require('react');
|
|
10
10
|
var ReactMarkdown = require('react-markdown');
|
|
11
11
|
var jsxRuntime = require('react/jsx-runtime');
|
|
@@ -92,7 +92,7 @@ function InlineManagedForm({ slug, prefill, primaryColor, primaryRgb }) {
|
|
|
92
92
|
submit,
|
|
93
93
|
isSubmitting,
|
|
94
94
|
isComplete
|
|
95
|
-
} =
|
|
95
|
+
} = chunkNNQJUMFQ_js.useForm(slug, { initialValues: prefill || {} });
|
|
96
96
|
const cardStyle = {
|
|
97
97
|
marginTop: 8,
|
|
98
98
|
padding: 12,
|
|
@@ -441,7 +441,7 @@ function ChatWidget(props) {
|
|
|
441
441
|
const { apiKey } = getApiConfig();
|
|
442
442
|
if (!apiKey) return;
|
|
443
443
|
let cancelled = false;
|
|
444
|
-
|
|
444
|
+
chunkLPUP2TSV_js.sonorFetch(`${baseUrl}/api/public/seo/project-info`, {}, { apiKey, retries: 0 }).then((res) => res.ok ? res.json() : null).then((data) => {
|
|
445
445
|
if (cancelled || !data?.valid || !data?.project_id) return;
|
|
446
446
|
setResolvedProjectId(data.project_id);
|
|
447
447
|
}).catch(() => {
|
|
@@ -458,7 +458,7 @@ function ChatWidget(props) {
|
|
|
458
458
|
return;
|
|
459
459
|
}
|
|
460
460
|
let cancelled = false;
|
|
461
|
-
|
|
461
|
+
chunkLPUP2TSV_js.sonorFetch(`${baseUrl}/engage/widget/config?projectId=${projectId}`, {}, { apiKey, retries: 0 }).then((res) => res.ok ? res.json() : null).then((json) => {
|
|
462
462
|
if (!cancelled) setWidgetConfig(json?.data ?? null);
|
|
463
463
|
}).catch((error) => {
|
|
464
464
|
if (process.env.NODE_ENV === "development") {
|
|
@@ -546,7 +546,7 @@ function EchoChat({ projectId, widgetConfig, config, apiUrl: propApiUrl, signalU
|
|
|
546
546
|
const apiKey = ensureApiKey();
|
|
547
547
|
if (!apiKey) return null;
|
|
548
548
|
try {
|
|
549
|
-
const response = await
|
|
549
|
+
const response = await chunkLPUP2TSV_js.sonorFetch(`${baseUrl}/engage/widget/availability?projectId=${projectId}`, {}, { apiKey, retries: 0 });
|
|
550
550
|
if (response.ok) {
|
|
551
551
|
const { data } = await response.json();
|
|
552
552
|
setAvailability(data);
|
|
@@ -563,7 +563,7 @@ function EchoChat({ projectId, widgetConfig, config, apiUrl: propApiUrl, signalU
|
|
|
563
563
|
const apiKey = ensureApiKey();
|
|
564
564
|
if (!apiKey) return null;
|
|
565
565
|
try {
|
|
566
|
-
const response = await
|
|
566
|
+
const response = await chunkLPUP2TSV_js.sonorFetch(`${baseUrl}/engage/widget/session`, {
|
|
567
567
|
method: "POST",
|
|
568
568
|
headers: { "Content-Type": "application/json" },
|
|
569
569
|
body: JSON.stringify({
|
|
@@ -624,7 +624,7 @@ function EchoChat({ projectId, widgetConfig, config, apiUrl: propApiUrl, signalU
|
|
|
624
624
|
pageUrl: typeof window !== "undefined" ? window.location.href : void 0,
|
|
625
625
|
...siteContext ? { siteContext } : {}
|
|
626
626
|
};
|
|
627
|
-
const res = await
|
|
627
|
+
const res = await chunkLPUP2TSV_js.sonorFetch(url, {
|
|
628
628
|
method: "POST",
|
|
629
629
|
headers: {
|
|
630
630
|
"Content-Type": "application/json"
|
|
@@ -727,7 +727,7 @@ function EchoChat({ projectId, widgetConfig, config, apiUrl: propApiUrl, signalU
|
|
|
727
727
|
if (currentSessionId) {
|
|
728
728
|
const apiKey = ensureApiKey();
|
|
729
729
|
if (apiKey) {
|
|
730
|
-
|
|
730
|
+
chunkLPUP2TSV_js.sonorFetch(`${baseUrl}/engage/widget/messages?sessionId=${currentSessionId}`, {}, { apiKey, retries: 0 }).then((res) => res.ok ? res.json() : null).then((json) => {
|
|
731
731
|
const data = json?.data ?? json;
|
|
732
732
|
if (Array.isArray(data) && data.length) {
|
|
733
733
|
setMessages((prev) => {
|
|
@@ -790,7 +790,7 @@ function EchoChat({ projectId, widgetConfig, config, apiUrl: propApiUrl, signalU
|
|
|
790
790
|
try {
|
|
791
791
|
const apiKey = ensureApiKey();
|
|
792
792
|
if (!apiKey) return;
|
|
793
|
-
const response = await
|
|
793
|
+
const response = await chunkLPUP2TSV_js.sonorFetch(`${baseUrl}/engage/widget/messages?sessionId=${currentSessionId}`, {}, { apiKey, retries: 0 });
|
|
794
794
|
if (response.ok) {
|
|
795
795
|
const { data } = await response.json();
|
|
796
796
|
setMessages((prev) => {
|
|
@@ -920,7 +920,7 @@ function EchoChat({ projectId, widgetConfig, config, apiUrl: propApiUrl, signalU
|
|
|
920
920
|
form.append("file", file);
|
|
921
921
|
form.append("sessionId", sessionId);
|
|
922
922
|
form.append("visitorId", visitorId);
|
|
923
|
-
const res = await
|
|
923
|
+
const res = await chunkLPUP2TSV_js.sonorFetch(`${baseUrl}/engage/widget/upload`, {
|
|
924
924
|
method: "POST",
|
|
925
925
|
body: form
|
|
926
926
|
}, { apiKey, retries: 0 });
|
|
@@ -1020,7 +1020,7 @@ function EchoChat({ projectId, widgetConfig, config, apiUrl: propApiUrl, signalU
|
|
|
1020
1020
|
if (!apiKey) return;
|
|
1021
1021
|
setCheckingHandoff(true);
|
|
1022
1022
|
try {
|
|
1023
|
-
const res = await
|
|
1023
|
+
const res = await chunkLPUP2TSV_js.sonorFetch(`${baseUrl}/engage/widget/handoff`, {
|
|
1024
1024
|
method: "POST",
|
|
1025
1025
|
headers: { "Content-Type": "application/json" },
|
|
1026
1026
|
body: JSON.stringify({ sessionId })
|
|
@@ -1059,7 +1059,7 @@ function EchoChat({ projectId, widgetConfig, config, apiUrl: propApiUrl, signalU
|
|
|
1059
1059
|
setIsLoading(true);
|
|
1060
1060
|
setOfflineError(null);
|
|
1061
1061
|
try {
|
|
1062
|
-
const response = await
|
|
1062
|
+
const response = await chunkLPUP2TSV_js.sonorFetch(`${baseUrl}/engage/widget/offline-form`, {
|
|
1063
1063
|
method: "POST",
|
|
1064
1064
|
headers: { "Content-Type": "application/json" },
|
|
1065
1065
|
body: JSON.stringify({
|
|
@@ -1673,5 +1673,5 @@ function EchoChat({ projectId, widgetConfig, config, apiUrl: propApiUrl, signalU
|
|
|
1673
1673
|
exports.ChatWidget = ChatWidget;
|
|
1674
1674
|
exports.EchoChat = EchoChat;
|
|
1675
1675
|
exports.isChatEnabled = isChatEnabled;
|
|
1676
|
-
//# sourceMappingURL=chunk-
|
|
1677
|
-
//# sourceMappingURL=chunk-
|
|
1676
|
+
//# sourceMappingURL=chunk-UTSKVISR.js.map
|
|
1677
|
+
//# sourceMappingURL=chunk-UTSKVISR.js.map
|