@sonordev/site-kit 5.3.2 → 5.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +16 -6
- package/README.md +26 -7
- package/agent-manifest.json +11 -10
- package/dist/AnalyticsProvider-KFXAH4GR.mjs +11 -0
- package/dist/{AnalyticsProvider-2XK54UZW.mjs.map → AnalyticsProvider-KFXAH4GR.mjs.map} +1 -1
- package/dist/AnalyticsProvider-WDDW3IJW.js +32 -0
- package/dist/{AnalyticsProvider-PM7SOGOS.js.map → AnalyticsProvider-WDDW3IJW.js.map} +1 -1
- package/dist/{BlogViewTracker-3BIUF5TI.js → BlogViewTracker-D4DIEP4Q.js} +6 -6
- package/dist/{BlogViewTracker-3BIUF5TI.js.map → BlogViewTracker-D4DIEP4Q.js.map} +1 -1
- package/dist/{BlogViewTracker-KFUDRDQK.mjs → BlogViewTracker-ZVEGGH3Y.mjs} +5 -5
- package/dist/{BlogViewTracker-KFUDRDQK.mjs.map → BlogViewTracker-ZVEGGH3Y.mjs.map} +1 -1
- package/dist/ChatWidget-2ZYPYIMQ.js +22 -0
- package/dist/{ChatWidget-7BYSGNO2.js.map → ChatWidget-2ZYPYIMQ.js.map} +1 -1
- package/dist/ChatWidget-FYCCLMQE.mjs +13 -0
- package/dist/{ChatWidget-4PHZHGG5.mjs.map → ChatWidget-FYCCLMQE.mjs.map} +1 -1
- package/dist/EngageWidget-6HUZYOY7.mjs +11 -0
- package/dist/{EngageWidget-D6M6QWEC.mjs.map → EngageWidget-6HUZYOY7.mjs.map} +1 -1
- package/dist/EngageWidget-MYQTBBW6.js +20 -0
- package/dist/{EngageWidget-Q4ITKTMJ.js.map → EngageWidget-MYQTBBW6.js.map} +1 -1
- package/dist/{FileField-YBBIJOCK.js → FileField-JK2S24XU.js} +6 -6
- package/dist/{FileField-YBBIJOCK.js.map → FileField-JK2S24XU.js.map} +1 -1
- package/dist/{FileField-PQQDX4IR.mjs → FileField-OZZHWGPA.mjs} +5 -5
- package/dist/{FileField-PQQDX4IR.mjs.map → FileField-OZZHWGPA.mjs.map} +1 -1
- package/dist/{FormSpotlight-WUN24F3P.js → FormSpotlight-5AXFQU5M.js} +15 -15
- package/dist/{FormSpotlight-WUN24F3P.js.map → FormSpotlight-5AXFQU5M.js.map} +1 -1
- package/dist/{FormSpotlight-7TIIWFTP.mjs → FormSpotlight-XV42L72H.mjs} +3 -3
- package/dist/{FormSpotlight-7TIIWFTP.mjs.map → FormSpotlight-XV42L72H.mjs.map} +1 -1
- package/dist/{FormStage-CM7OVLUT.js → FormStage-HATUHNRV.js} +13 -13
- package/dist/{FormStage-CM7OVLUT.js.map → FormStage-HATUHNRV.js.map} +1 -1
- package/dist/{FormStage-TFN2GIBO.mjs → FormStage-RUK675HV.mjs} +3 -3
- package/dist/{FormStage-TFN2GIBO.mjs.map → FormStage-RUK675HV.mjs.map} +1 -1
- package/dist/ManagedForm-JWEXJEXK.js +23 -0
- package/dist/{ManagedForm-N63YGVNY.js.map → ManagedForm-JWEXJEXK.js.map} +1 -1
- package/dist/ManagedForm-OA3MNGXT.mjs +14 -0
- package/dist/{ManagedForm-ZUXLHEQU.mjs.map → ManagedForm-OA3MNGXT.mjs.map} +1 -1
- package/dist/{ManagedNewsletterForm-PIVJTU5L.js → ManagedNewsletterForm-AAHH63KT.js} +8 -8
- package/dist/{ManagedNewsletterForm-PIVJTU5L.js.map → ManagedNewsletterForm-AAHH63KT.js.map} +1 -1
- package/dist/{ManagedNewsletterForm-4AVKTZ2A.mjs → ManagedNewsletterForm-HZKTNWLW.mjs} +7 -7
- package/dist/{ManagedNewsletterForm-4AVKTZ2A.mjs.map → ManagedNewsletterForm-HZKTNWLW.mjs.map} +1 -1
- package/dist/{SignalCore-LT4NCPOR.mjs → SignalCore-X3GDGBZD.mjs} +5 -5
- package/dist/{SignalCore-LT4NCPOR.mjs.map → SignalCore-X3GDGBZD.mjs.map} +1 -1
- package/dist/{SignalCore-2M5TISM7.js → SignalCore-YSNZYBKJ.js} +11 -11
- package/dist/{SignalCore-2M5TISM7.js.map → SignalCore-YSNZYBKJ.js.map} +1 -1
- package/dist/SitemapSync-2PTDBH5E.mjs +9 -0
- package/dist/{SitemapSync-G3OLECFI.mjs.map → SitemapSync-2PTDBH5E.mjs.map} +1 -1
- package/dist/SitemapSync-3SFAI546.js +18 -0
- package/dist/{SitemapSync-7OBOJG2L.js.map → SitemapSync-3SFAI546.js.map} +1 -1
- package/dist/analytics/dispatch.d.ts +4 -4
- package/dist/analytics/index.js +15 -15
- package/dist/analytics/index.mjs +6 -6
- package/dist/{api-NTHZ6PAW.mjs → api-D745LGGU.mjs} +3 -3
- package/dist/api-D745LGGU.mjs.map +1 -0
- package/dist/{api-N5OLQXYN.js → api-XR5APCH3.js} +3 -3
- package/dist/api-XR5APCH3.js.map +1 -0
- package/dist/blog/AuthorPage.d.ts +1 -1
- package/dist/blog/AuthorPage.d.ts.map +1 -1
- package/dist/blog/BlogLayout.d.ts +3 -1
- package/dist/blog/BlogLayout.d.ts.map +1 -1
- package/dist/blog/BlogList.d.ts +3 -1
- package/dist/blog/BlogList.d.ts.map +1 -1
- package/dist/blog/BlogPost.d.ts +3 -1
- package/dist/blog/BlogPost.d.ts.map +1 -1
- package/dist/blog/BlogSidebar.d.ts +3 -1
- package/dist/blog/BlogSidebar.d.ts.map +1 -1
- package/dist/blog/ClusterLandingPage.d.ts +3 -1
- package/dist/blog/ClusterLandingPage.d.ts.map +1 -1
- package/dist/blog/ClusterNavigation.d.ts +3 -1
- package/dist/blog/ClusterNavigation.d.ts.map +1 -1
- package/dist/blog/RelatedPosts.d.ts +4 -1
- package/dist/blog/RelatedPosts.d.ts.map +1 -1
- package/dist/blog/artwork-components.test.d.ts +2 -0
- package/dist/blog/artwork-components.test.d.ts.map +1 -0
- package/dist/blog/artwork.d.ts +14 -0
- package/dist/blog/artwork.d.ts.map +1 -0
- package/dist/blog/artwork.test.d.ts +2 -0
- package/dist/blog/artwork.test.d.ts.map +1 -0
- package/dist/blog/blog-styles.d.ts.map +1 -1
- package/dist/blog/blog-tables.d.ts +13 -0
- package/dist/blog/blog-tables.d.ts.map +1 -0
- package/dist/blog/blog-tables.test.d.ts +2 -0
- package/dist/blog/blog-tables.test.d.ts.map +1 -0
- package/dist/blog/index.d.ts +3 -0
- package/dist/blog/index.d.ts.map +1 -1
- package/dist/blog/index.js +52 -30
- package/dist/blog/index.js.map +1 -1
- package/dist/blog/index.mjs +15 -12
- package/dist/blog/index.mjs.map +1 -1
- package/dist/blog/publication-render.test.d.ts +2 -0
- package/dist/blog/publication-render.test.d.ts.map +1 -0
- package/dist/blog/publication-routes.test.d.ts +2 -0
- package/dist/blog/publication-routes.test.d.ts.map +1 -0
- package/dist/blog/routes.d.ts +40 -0
- package/dist/blog/routes.d.ts.map +1 -0
- package/dist/blog/server-core.d.ts +28 -21
- package/dist/blog/server-core.d.ts.map +1 -1
- package/dist/blog/server-ui.d.ts +4 -0
- package/dist/blog/server-ui.d.ts.map +1 -1
- package/dist/blog/server-ui.js +49 -28
- package/dist/blog/server-ui.js.map +1 -1
- package/dist/blog/server-ui.mjs +9 -15
- package/dist/blog/server-ui.mjs.map +1 -1
- package/dist/blog/server.d.ts +28 -21
- package/dist/blog/server.d.ts.map +1 -1
- package/dist/blog/server.js +71 -42
- package/dist/blog/server.mjs +3 -2
- package/dist/blog/types.d.ts +8 -1
- package/dist/blog/types.d.ts.map +1 -1
- package/dist/blog-styles-6EY3BS5Y.js +595 -0
- package/dist/blog-styles-6EY3BS5Y.js.map +1 -0
- package/dist/blog-styles-7AKRUMV7.mjs +592 -0
- package/dist/blog-styles-7AKRUMV7.mjs.map +1 -0
- package/dist/blog-tables-DWDEWA3S.js +17 -0
- package/dist/blog-tables-DWDEWA3S.js.map +1 -0
- package/dist/blog-tables-QGIHOESZ.mjs +4 -0
- package/dist/blog-tables-QGIHOESZ.mjs.map +1 -0
- package/dist/{chunk-OIJ435IZ.js → chunk-2CMSWJWC.js} +18 -18
- package/dist/{chunk-OIJ435IZ.js.map → chunk-2CMSWJWC.js.map} +1 -1
- package/dist/{chunk-K37JPEQW.js → chunk-2OU4KBUN.js} +26 -23
- package/dist/chunk-2OU4KBUN.js.map +1 -0
- package/dist/{chunk-JSLYNYTB.mjs → chunk-3B6CXGAK.mjs} +3 -3
- package/dist/{chunk-JSLYNYTB.mjs.map → chunk-3B6CXGAK.mjs.map} +1 -1
- package/dist/{chunk-HMFFAUCD.js → chunk-3DWIYCQX.js} +2 -2
- package/dist/chunk-3DWIYCQX.js.map +1 -0
- package/dist/{chunk-3EPMDPWI.js → chunk-3SDMJMN2.js} +5 -5
- package/dist/{chunk-3EPMDPWI.js.map → chunk-3SDMJMN2.js.map} +1 -1
- package/dist/chunk-4B4S56WJ.mjs +110 -0
- package/dist/chunk-4B4S56WJ.mjs.map +1 -0
- package/dist/chunk-4U5NCKQY.mjs +39 -0
- package/dist/chunk-4U5NCKQY.mjs.map +1 -0
- package/dist/{chunk-CQUA2AUA.mjs → chunk-4XGACM7D.mjs} +3 -3
- package/dist/{chunk-CQUA2AUA.mjs.map → chunk-4XGACM7D.mjs.map} +1 -1
- package/dist/{chunk-AVM4OZHR.mjs → chunk-5TGAUWNO.mjs} +3 -3
- package/dist/{chunk-AVM4OZHR.mjs.map → chunk-5TGAUWNO.mjs.map} +1 -1
- package/dist/{chunk-RO55G3OA.mjs → chunk-64BOVMXG.mjs} +3 -3
- package/dist/{chunk-RO55G3OA.mjs.map → chunk-64BOVMXG.mjs.map} +1 -1
- package/dist/{chunk-JBGRXICL.js → chunk-746RKQHA.js} +75 -70
- package/dist/chunk-746RKQHA.js.map +1 -0
- package/dist/{chunk-N3C323NY.mjs → chunk-7PPNXORV.mjs} +3 -3
- package/dist/{chunk-N3C323NY.mjs.map → chunk-7PPNXORV.mjs.map} +1 -1
- package/dist/{chunk-DYKFC7WY.js → chunk-A3F5GRNJ.js} +8 -8
- package/dist/{chunk-DYKFC7WY.js.map → chunk-A3F5GRNJ.js.map} +1 -1
- package/dist/{chunk-4TU246Q4.mjs → chunk-AEARU24Q.mjs} +40 -26
- package/dist/chunk-AEARU24Q.mjs.map +1 -0
- package/dist/{chunk-5BZDHZCN.js → chunk-BNOQXDPJ.js} +4 -4
- package/dist/{chunk-5BZDHZCN.js.map → chunk-BNOQXDPJ.js.map} +1 -1
- package/dist/{chunk-XQZTOWS3.js → chunk-CT5REGAK.js} +15 -15
- package/dist/{chunk-XQZTOWS3.js.map → chunk-CT5REGAK.js.map} +1 -1
- package/dist/{chunk-KOP3DPIR.mjs → chunk-DRLHQQBH.mjs} +4 -4
- package/dist/{chunk-KOP3DPIR.mjs.map → chunk-DRLHQQBH.mjs.map} +1 -1
- package/dist/{chunk-Y7SRO7MJ.mjs → chunk-DYULWKDC.mjs} +4 -4
- package/dist/{chunk-Y7SRO7MJ.mjs.map → chunk-DYULWKDC.mjs.map} +1 -1
- package/dist/{chunk-DHXQBTXE.mjs → chunk-EEQYKMGH.mjs} +75 -70
- package/dist/chunk-EEQYKMGH.mjs.map +1 -0
- package/dist/chunk-ESP5RMB7.js +42 -0
- package/dist/chunk-ESP5RMB7.js.map +1 -0
- package/dist/{chunk-4DE2KJ7R.js → chunk-FF5N5D3D.js} +8 -8
- package/dist/{chunk-4DE2KJ7R.js.map → chunk-FF5N5D3D.js.map} +1 -1
- package/dist/{chunk-757HXAYX.js → chunk-FYVLQ3OU.js} +3 -3
- package/dist/{chunk-757HXAYX.js.map → chunk-FYVLQ3OU.js.map} +1 -1
- package/dist/{chunk-OC6PU7U2.mjs → chunk-G5HUI4BO.mjs} +3 -3
- package/dist/{chunk-OC6PU7U2.mjs.map → chunk-G5HUI4BO.mjs.map} +1 -1
- package/dist/chunk-G6WF4G3E.js +43 -0
- package/dist/chunk-G6WF4G3E.js.map +1 -0
- package/dist/chunk-GHECYDSZ.mjs +134 -0
- package/dist/chunk-GHECYDSZ.mjs.map +1 -0
- package/dist/{chunk-JTO3K5B7.mjs → chunk-HBI67P7Y.mjs} +4 -4
- package/dist/{chunk-JTO3K5B7.mjs.map → chunk-HBI67P7Y.mjs.map} +1 -1
- package/dist/{chunk-FFJVQWKO.js → chunk-HFJQMIFM.js} +4 -4
- package/dist/{chunk-FFJVQWKO.js.map → chunk-HFJQMIFM.js.map} +1 -1
- package/dist/{chunk-A3NNUKFA.js → chunk-HX3BRMOX.js} +96 -644
- package/dist/chunk-HX3BRMOX.js.map +1 -0
- package/dist/{chunk-3TXX5KIN.js → chunk-JNRHTZL4.js} +2 -2
- package/dist/{chunk-3TXX5KIN.js.map → chunk-JNRHTZL4.js.map} +1 -1
- package/dist/{chunk-R3LYTIVN.js → chunk-KAUUGRYB.js} +5 -5
- package/dist/{chunk-R3LYTIVN.js.map → chunk-KAUUGRYB.js.map} +1 -1
- package/dist/{chunk-L2LJQIM3.js → chunk-KPKQKFT4.js} +11 -11
- package/dist/chunk-KPKQKFT4.js.map +1 -0
- package/dist/chunk-LC7AM4J5.js +118 -0
- package/dist/chunk-LC7AM4J5.js.map +1 -0
- package/dist/{chunk-GFNXWS3I.js → chunk-MCJF2KJ6.js} +5 -5
- package/dist/{chunk-GFNXWS3I.js.map → chunk-MCJF2KJ6.js.map} +1 -1
- package/dist/{chunk-Z7K5AMCE.js → chunk-MNYM2XU4.js} +4 -4
- package/dist/{chunk-Z7K5AMCE.js.map → chunk-MNYM2XU4.js.map} +1 -1
- package/dist/{chunk-6QABCGM6.mjs → chunk-MU7IEPDG.mjs} +4 -4
- package/dist/chunk-MU7IEPDG.mjs.map +1 -0
- package/dist/chunk-NSWO43XW.mjs +39 -0
- package/dist/chunk-NSWO43XW.mjs.map +1 -0
- package/dist/{chunk-Z33JXJTJ.js → chunk-NZSFOZJV.js} +40 -26
- package/dist/chunk-NZSFOZJV.js.map +1 -0
- package/dist/{chunk-ZKR5AJV5.mjs → chunk-OFSA7LUH.mjs} +4 -4
- package/dist/{chunk-ZKR5AJV5.mjs.map → chunk-OFSA7LUH.mjs.map} +1 -1
- package/dist/{chunk-M7FWXEXC.js → chunk-PIPLBBDH.js} +8 -8
- package/dist/{chunk-M7FWXEXC.js.map → chunk-PIPLBBDH.js.map} +1 -1
- package/dist/{chunk-FDVE56JS.js → chunk-Q26VZNM2.js} +3 -3
- package/dist/{chunk-FDVE56JS.js.map → chunk-Q26VZNM2.js.map} +1 -1
- package/dist/{chunk-6AZTRTCG.js → chunk-QEGUI2Q2.js} +15 -15
- package/dist/{chunk-6AZTRTCG.js.map → chunk-QEGUI2Q2.js.map} +1 -1
- package/dist/{chunk-GPNBBUEN.js → chunk-QFNSM77X.js} +3 -3
- package/dist/{chunk-GPNBBUEN.js.map → chunk-QFNSM77X.js.map} +1 -1
- package/dist/{chunk-QZ54OCWD.mjs → chunk-R4MX6EOM.mjs} +7 -7
- package/dist/{chunk-QZ54OCWD.mjs.map → chunk-R4MX6EOM.mjs.map} +1 -1
- package/dist/{chunk-67CHHDBL.mjs → chunk-RMMHWSPP.mjs} +96 -644
- package/dist/chunk-RMMHWSPP.mjs.map +1 -0
- package/dist/{chunk-B4BFQSSS.mjs → chunk-RU54J2PY.mjs} +4 -4
- package/dist/chunk-RU54J2PY.mjs.map +1 -0
- package/dist/{chunk-AXAIUCSF.mjs → chunk-RZUZMUTN.mjs} +9 -8
- package/dist/chunk-RZUZMUTN.mjs.map +1 -0
- package/dist/{chunk-NSLYY62T.mjs → chunk-S6FEC6UT.mjs} +9 -5
- package/dist/chunk-S6FEC6UT.mjs.map +1 -0
- package/dist/{chunk-3DPXOZAU.mjs → chunk-SHLWA6JY.mjs} +2 -2
- package/dist/chunk-SHLWA6JY.mjs.map +1 -0
- package/dist/{chunk-E33HJMRP.js → chunk-SQVYLIIN.js} +11 -7
- package/dist/chunk-SQVYLIIN.js.map +1 -0
- package/dist/chunk-SUZ3ZLB2.js +8 -0
- package/dist/{chunk-D37M7MIH.js.map → chunk-SUZ3ZLB2.js.map} +1 -1
- package/dist/{chunk-DZDWBQKA.mjs → chunk-TALEV3IH.mjs} +3 -3
- package/dist/{chunk-DZDWBQKA.mjs.map → chunk-TALEV3IH.mjs.map} +1 -1
- package/dist/{chunk-UOTXSWKZ.mjs → chunk-TP7H6BSK.mjs} +2 -2
- package/dist/{chunk-UOTXSWKZ.mjs.map → chunk-TP7H6BSK.mjs.map} +1 -1
- package/dist/{chunk-XW5KNCWJ.mjs → chunk-TX2QQ7IX.mjs} +3 -3
- package/dist/{chunk-XW5KNCWJ.mjs.map → chunk-TX2QQ7IX.mjs.map} +1 -1
- package/dist/{chunk-PEEQMI7U.js → chunk-UNPEMSLK.js} +12 -11
- package/dist/chunk-UNPEMSLK.js.map +1 -0
- package/dist/{chunk-42F5EK24.mjs → chunk-UZL2QU2V.mjs} +16 -13
- package/dist/chunk-UZL2QU2V.mjs.map +1 -0
- package/dist/{chunk-6VG65AIA.mjs → chunk-V6NOM7PJ.mjs} +3 -3
- package/dist/{chunk-6VG65AIA.mjs.map → chunk-V6NOM7PJ.mjs.map} +1 -1
- package/dist/{chunk-W23TMUKB.js → chunk-VAS3LH5W.js} +418 -98
- package/dist/chunk-VAS3LH5W.js.map +1 -0
- package/dist/{chunk-TS3N3LGZ.mjs → chunk-VYHRAICF.mjs} +4 -4
- package/dist/{chunk-TS3N3LGZ.mjs.map → chunk-VYHRAICF.mjs.map} +1 -1
- package/dist/{chunk-G3YUSRCL.js → chunk-W5NVW23S.js} +4 -4
- package/dist/{chunk-G3YUSRCL.js.map → chunk-W5NVW23S.js.map} +1 -1
- package/dist/chunk-WDBCXRTT.mjs +6 -0
- package/dist/{chunk-OUERH2T4.mjs.map → chunk-WDBCXRTT.mjs.map} +1 -1
- package/dist/{chunk-ZOJ3TLO5.mjs → chunk-WIZRCI6J.mjs} +3 -3
- package/dist/{chunk-ZOJ3TLO5.mjs.map → chunk-WIZRCI6J.mjs.map} +1 -1
- package/dist/{chunk-HDQTZAGE.mjs → chunk-X2XFLYZ3.mjs} +3 -3
- package/dist/{chunk-HDQTZAGE.mjs.map → chunk-X2XFLYZ3.mjs.map} +1 -1
- package/dist/{chunk-HVFXFPUJ.mjs → chunk-XQYC4KMH.mjs} +413 -94
- package/dist/chunk-XQYC4KMH.mjs.map +1 -0
- package/dist/{chunk-KPFPSOYS.js → chunk-YNC5D3FT.js} +12 -12
- package/dist/{chunk-KPFPSOYS.js.map → chunk-YNC5D3FT.js.map} +1 -1
- package/dist/chunk-YQTE32QK.js +137 -0
- package/dist/chunk-YQTE32QK.js.map +1 -0
- package/dist/{chunk-PZXKFHPO.js → chunk-YYAFHIY7.js} +15 -15
- package/dist/chunk-YYAFHIY7.js.map +1 -0
- package/dist/{chunk-MANX6422.js → chunk-Z6S4MWSR.js} +7 -7
- package/dist/{chunk-MANX6422.js.map → chunk-Z6S4MWSR.js.map} +1 -1
- package/dist/{chunk-DVH3JHZ3.mjs → chunk-ZRQFG3L6.mjs} +5 -5
- package/dist/{chunk-DVH3JHZ3.mjs.map → chunk-ZRQFG3L6.mjs.map} +1 -1
- package/dist/cli/agent/checks.d.ts.map +1 -1
- package/dist/cli/agent/ssr-bailout.d.ts +27 -0
- package/dist/cli/agent/ssr-bailout.d.ts.map +1 -0
- package/dist/cli/agent/ssr-bailout.test.d.ts +2 -0
- package/dist/cli/agent/ssr-bailout.test.d.ts.map +1 -0
- package/dist/cli/codemod/transforms.d.ts.map +1 -1
- package/dist/cli/index.js +38 -51
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/index.mjs +36 -49
- package/dist/cli/index.mjs.map +1 -1
- package/dist/cli/migrator/index.d.ts.map +1 -1
- package/dist/client/index.d.ts +1 -0
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +20 -7
- package/dist/client/index.js.map +1 -1
- package/dist/client/index.mjs +5 -4
- package/dist/client/index.mjs.map +1 -1
- package/dist/cms/index.js.map +1 -1
- package/dist/cms/index.mjs.map +1 -1
- package/dist/cms/sanity-image.d.ts +1 -1
- package/dist/commerce/index.js +58 -58
- package/dist/commerce/index.mjs +7 -7
- package/dist/engage/ChatWidget.d.ts.map +1 -1
- package/dist/engage/EngageWidget.d.ts +3 -4
- package/dist/engage/EngageWidget.d.ts.map +1 -1
- package/dist/engage/chat-launcher.test.d.ts +2 -0
- package/dist/engage/chat-launcher.test.d.ts.map +1 -0
- package/dist/engage/index.js +12 -10
- package/dist/engage/index.js.map +1 -1
- package/dist/engage/index.mjs +9 -7
- package/dist/engage/index.mjs.map +1 -1
- package/dist/engage/launcher-placement.d.ts +56 -0
- package/dist/engage/launcher-placement.d.ts.map +1 -0
- package/dist/engage/launcher-placement.test.d.ts +2 -0
- package/dist/engage/launcher-placement.test.d.ts.map +1 -0
- package/dist/engage/types.d.ts +41 -7
- package/dist/engage/types.d.ts.map +1 -1
- package/dist/fleet/index.js +8 -8
- package/dist/fleet/index.mjs +4 -4
- package/dist/forms/index.js +16 -16
- package/dist/forms/index.mjs +9 -9
- package/dist/forms/server.js +10 -10
- package/dist/forms/server.mjs +8 -8
- package/dist/forms/static.js +7 -7
- package/dist/forms/static.mjs +6 -6
- package/dist/images/ManagedImage.d.ts.map +1 -1
- package/dist/images/index.js +11 -11
- package/dist/images/index.mjs +4 -4
- package/dist/index.js +65 -65
- package/dist/index.mjs +11 -11
- package/dist/layout/SiteKitClientProviders.d.ts.map +1 -1
- package/dist/layout/client.d.ts.map +1 -1
- package/dist/layout/client.js +8 -8
- package/dist/layout/client.mjs +7 -7
- package/dist/layout/index.js +10 -10
- package/dist/layout/index.mjs +8 -8
- package/dist/layout/types.d.ts +7 -3
- package/dist/layout/types.d.ts.map +1 -1
- package/dist/llms/generateLLMsTxt.d.ts.map +1 -1
- package/dist/llms/index.js +12 -12
- package/dist/llms/index.mjs +2 -2
- package/dist/llms/types.d.ts +7 -1
- package/dist/llms/types.d.ts.map +1 -1
- package/dist/maps/index.js +5 -5
- package/dist/maps/index.mjs +3 -3
- package/dist/mcp/WebMcpTools.d.ts +5 -2
- package/dist/mcp/WebMcpTools.d.ts.map +1 -1
- package/dist/mcp/client.js.map +1 -1
- package/dist/mcp/client.mjs.map +1 -1
- package/dist/search/index.js +4 -4
- package/dist/search/index.mjs +3 -3
- package/dist/seo/LocationPageContent.d.ts +6 -5
- package/dist/seo/LocationPageContent.d.ts.map +1 -1
- package/dist/seo/api.d.ts +4 -5
- package/dist/seo/api.d.ts.map +1 -1
- package/dist/seo/client.js +5 -5
- package/dist/seo/client.mjs +4 -4
- package/dist/seo/index.js +42 -42
- package/dist/seo/index.js.map +1 -1
- package/dist/seo/index.mjs +8 -8
- package/dist/seo/index.mjs.map +1 -1
- package/dist/seo/routing.d.ts +9 -23
- package/dist/seo/routing.d.ts.map +1 -1
- package/dist/seo/server-api.d.ts +11 -5
- package/dist/seo/server-api.d.ts.map +1 -1
- package/dist/seo/server.js +18 -18
- package/dist/seo/server.mjs +2 -2
- package/dist/server/index.js +3 -3
- package/dist/server/index.mjs +2 -2
- package/dist/{server-api-HW4PL2L2.mjs → server-api-RG3ZL3DV.mjs} +3 -3
- package/dist/{server-api-HW4PL2L2.mjs.map → server-api-RG3ZL3DV.mjs.map} +1 -1
- package/dist/{server-api-DB2SIUP4.js → server-api-RYJQAUGO.js} +21 -21
- package/dist/{server-api-DB2SIUP4.js.map → server-api-RYJQAUGO.js.map} +1 -1
- package/dist/shared/version.d.ts +1 -1
- package/dist/shared/visual-viewport-gap.d.ts +52 -0
- package/dist/shared/visual-viewport-gap.d.ts.map +1 -0
- package/dist/shared/visual-viewport-gap.test.d.ts +2 -0
- package/dist/shared/visual-viewport-gap.test.d.ts.map +1 -0
- package/dist/signal/index.js +11 -11
- package/dist/signal/index.mjs +2 -2
- package/dist/sitemap/index.js +2 -2
- package/dist/sitemap/index.mjs +1 -1
- package/dist/sync/BookingWidget.d.ts +0 -23
- package/dist/sync/BookingWidget.d.ts.map +1 -1
- package/dist/sync/MeetingFormatStep.d.ts +13 -0
- package/dist/sync/MeetingFormatStep.d.ts.map +1 -0
- package/dist/sync/api.d.ts +9 -10
- package/dist/sync/api.d.ts.map +1 -1
- package/dist/sync/booking-flow.d.ts +7 -0
- package/dist/sync/booking-flow.d.ts.map +1 -0
- package/dist/sync/booking-flow.test.d.ts +2 -0
- package/dist/sync/booking-flow.test.d.ts.map +1 -0
- package/dist/sync/index.d.ts +2 -2
- package/dist/sync/index.d.ts.map +1 -1
- package/dist/sync/index.js +20 -16
- package/dist/sync/index.mjs +4 -4
- package/dist/sync/types.d.ts +34 -0
- package/dist/sync/types.d.ts.map +1 -1
- package/dist/types.d.ts +9 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/skills/site-kit/SKILL.md +8 -3
- package/dist/AnalyticsProvider-2XK54UZW.mjs +0 -11
- package/dist/AnalyticsProvider-PM7SOGOS.js +0 -32
- package/dist/ChatWidget-4PHZHGG5.mjs +0 -11
- package/dist/ChatWidget-7BYSGNO2.js +0 -20
- package/dist/EngageWidget-D6M6QWEC.mjs +0 -9
- package/dist/EngageWidget-Q4ITKTMJ.js +0 -18
- package/dist/ManagedForm-N63YGVNY.js +0 -23
- package/dist/ManagedForm-ZUXLHEQU.mjs +0 -14
- package/dist/SitemapSync-7OBOJG2L.js +0 -18
- package/dist/SitemapSync-G3OLECFI.mjs +0 -9
- package/dist/api-N5OLQXYN.js.map +0 -1
- package/dist/api-NTHZ6PAW.mjs.map +0 -1
- package/dist/chunk-3DPXOZAU.mjs.map +0 -1
- package/dist/chunk-42F5EK24.mjs.map +0 -1
- package/dist/chunk-4TU246Q4.mjs.map +0 -1
- package/dist/chunk-67CHHDBL.mjs.map +0 -1
- package/dist/chunk-6QABCGM6.mjs.map +0 -1
- package/dist/chunk-A3NNUKFA.js.map +0 -1
- package/dist/chunk-AXAIUCSF.mjs.map +0 -1
- package/dist/chunk-B4BFQSSS.mjs.map +0 -1
- package/dist/chunk-CGCYZJYX.mjs +0 -41
- package/dist/chunk-CGCYZJYX.mjs.map +0 -1
- package/dist/chunk-D37M7MIH.js +0 -8
- package/dist/chunk-DHXQBTXE.mjs.map +0 -1
- package/dist/chunk-E33HJMRP.js.map +0 -1
- package/dist/chunk-HMFFAUCD.js.map +0 -1
- package/dist/chunk-HVFXFPUJ.mjs.map +0 -1
- package/dist/chunk-JBGRXICL.js.map +0 -1
- package/dist/chunk-K37JPEQW.js.map +0 -1
- package/dist/chunk-L2LJQIM3.js.map +0 -1
- package/dist/chunk-NSLYY62T.mjs.map +0 -1
- package/dist/chunk-OUERH2T4.mjs +0 -6
- package/dist/chunk-PEEQMI7U.js.map +0 -1
- package/dist/chunk-PZXKFHPO.js.map +0 -1
- package/dist/chunk-TPL2IHFI.js +0 -43
- package/dist/chunk-TPL2IHFI.js.map +0 -1
- package/dist/chunk-W23TMUKB.js.map +0 -1
- package/dist/chunk-Z33JXJTJ.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/migrator/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAQH,OAAO,KAAK,EAAE,WAAW,EAA+B,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/migrator/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAQH,OAAO,KAAK,EAAE,WAAW,EAA+B,MAAM,YAAY,CAAA;AAyI1E,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB;AAMD,wBAAsB,YAAY,CAChC,WAAW,EAAE,WAAW,EACxB,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,eAAe,EAAE,CAAC,CA0H5B;AAiSD;;;;;;;;GAQG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAChE,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,eAAe,CAAC,CA2M1B;AA+HD;;;;;;;;;GASG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,EACnE,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,eAAe,CAAC,CAmF1B;AAoFD;;;;;;;;;GASG;AACH,wBAAsB,UAAU,CAC9B,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,EACrG,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,eAAe,CAAC,CA0F1B;AAMD;;GAEG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,EAC7C,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,eAAe,CAAC,CAuC1B;AAMD;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,EAChD,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,eAAe,CAAC,CAiB1B;AAMD;;GAEG;AACH,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,eAAe,CAAC,CA8E1B"}
|
package/dist/client/index.d.ts
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
* the bundle.
|
|
7
7
|
*/
|
|
8
8
|
export { useDeferredActivation } from '../shared/defer';
|
|
9
|
+
export { VisualViewportGap, useVisualViewportGap, VISUAL_VIEWPORT_GAP_PROPERTY, } from '../shared/visual-viewport-gap';
|
|
9
10
|
export { SiteKitCredential } from './SiteKitCredential';
|
|
10
11
|
export type { SiteKitCredentialProps } from './SiteKitCredential';
|
|
11
12
|
export { useSiteKitIdentity, getOrCreateVisitorId, getOrCreateSessionId, } from '../shared/identity';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;AAKvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AACvD,YAAY,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;AAGjE,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,oBAAoB,CAAA;AAC3B,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAIzD,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACnE,YAAY,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;AAKvD,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,4BAA4B,GAC7B,MAAM,+BAA+B,CAAA;AAKtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AACvD,YAAY,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;AAGjE,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,oBAAoB,CAAA;AAC3B,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAIzD,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACnE,YAAY,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAA"}
|
package/dist/client/index.js
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
-
var
|
|
4
|
+
var chunkMCJF2KJ6_js = require('../chunk-MCJF2KJ6.js');
|
|
5
5
|
require('../chunk-OZ3FU4BT.js');
|
|
6
6
|
require('../chunk-SWIKKSKL.js');
|
|
7
7
|
var chunkHGNSJXWT_js = require('../chunk-HGNSJXWT.js');
|
|
8
|
-
var
|
|
8
|
+
var chunk3DWIYCQX_js = require('../chunk-3DWIYCQX.js');
|
|
9
|
+
var chunkG6WF4G3E_js = require('../chunk-G6WF4G3E.js');
|
|
9
10
|
var chunkRC4WWQXR_js = require('../chunk-RC4WWQXR.js');
|
|
10
11
|
require('../chunk-VJMPIRSD.js');
|
|
11
|
-
require('../chunk-
|
|
12
|
-
require('../chunk-
|
|
12
|
+
require('../chunk-HFJQMIFM.js');
|
|
13
|
+
require('../chunk-SUZ3ZLB2.js');
|
|
13
14
|
require('../chunk-SNAQBZPT.js');
|
|
14
15
|
|
|
15
16
|
// src/client/SiteKitCredential.tsx
|
|
@@ -19,7 +20,7 @@ function SiteKitCredential({
|
|
|
19
20
|
site,
|
|
20
21
|
debug
|
|
21
22
|
}) {
|
|
22
|
-
|
|
23
|
+
chunkMCJF2KJ6_js.publishSiteCredential({ apiKey, apiUrl, site, debug });
|
|
23
24
|
return null;
|
|
24
25
|
}
|
|
25
26
|
|
|
@@ -29,11 +30,23 @@ Object.defineProperty(exports, "useDeferredActivation", {
|
|
|
29
30
|
});
|
|
30
31
|
Object.defineProperty(exports, "trackConversion", {
|
|
31
32
|
enumerable: true,
|
|
32
|
-
get: function () { return
|
|
33
|
+
get: function () { return chunk3DWIYCQX_js.trackConversion; }
|
|
33
34
|
});
|
|
34
35
|
Object.defineProperty(exports, "trackEvent", {
|
|
35
36
|
enumerable: true,
|
|
36
|
-
get: function () { return
|
|
37
|
+
get: function () { return chunk3DWIYCQX_js.trackEvent; }
|
|
38
|
+
});
|
|
39
|
+
Object.defineProperty(exports, "VISUAL_VIEWPORT_GAP_PROPERTY", {
|
|
40
|
+
enumerable: true,
|
|
41
|
+
get: function () { return chunkG6WF4G3E_js.VISUAL_VIEWPORT_GAP_PROPERTY; }
|
|
42
|
+
});
|
|
43
|
+
Object.defineProperty(exports, "VisualViewportGap", {
|
|
44
|
+
enumerable: true,
|
|
45
|
+
get: function () { return chunkG6WF4G3E_js.VisualViewportGap; }
|
|
46
|
+
});
|
|
47
|
+
Object.defineProperty(exports, "useVisualViewportGap", {
|
|
48
|
+
enumerable: true,
|
|
49
|
+
get: function () { return chunkG6WF4G3E_js.useVisualViewportGap; }
|
|
37
50
|
});
|
|
38
51
|
Object.defineProperty(exports, "getOrCreateSessionId", {
|
|
39
52
|
enumerable: true,
|
package/dist/client/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/client/SiteKitCredential.tsx"],"names":["publishSiteCredential"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../src/client/SiteKitCredential.tsx"],"names":["publishSiteCredential"],"mappings":";;;;;;;;;;;;;;;AA6CO,SAAS,iBAAA,CAAkB;AAAA,EAChC,MAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA;AACF,CAAA,EAAiC;AAG/B,EAAAA,sCAAA,CAAsB,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,OAAO,CAAA;AACrD,EAAA,OAAO,IAAA;AACT","file":"index.js","sourcesContent":["'use client'\n\n/**\n * SiteKitCredential — publish a minted credential to the browser.\n *\n * The client half of the token mint, for layouts that are NOT core\n * `SiteKitLayout`. A server component mints with `resolveClientCredential`\n * (`@sonordev/site-kit/server`) and renders this to seed the token manager and\n * the `window.__SITE_KIT_*` globals every client module reads:\n *\n * ```tsx\n * // app/layout.tsx (server component)\n * import { resolveClientCredential } from '@sonordev/site-kit/server'\n * import { SiteKitCredential } from '@sonordev/site-kit/client'\n *\n * const credential = await resolveClientCredential(\n * process.env.SONOR_API_KEY ?? '',\n * 'https://api.sonor.io',\n * )\n * return <><SiteKitCredential apiKey={credential} />{children}</>\n * ```\n *\n * Renders null — it is a childless sibling, never a wrapper, so it can't pull\n * page content into a client boundary (CLAUDE.md's cardinal perf rule).\n *\n * WARNING: `apiKey` must be a minted `st1.` token resolved SERVER-side. Passing\n * a raw `sonor_` key from a client component inlines the project secret into\n * the browser bundle and defeats the mint. Never source it from\n * `NEXT_PUBLIC_SONOR_API_KEY`.\n */\nimport { publishSiteCredential } from '../shared/publishCredential'\n\nexport interface SiteKitCredentialProps {\n /** Minted `st1.` token from `resolveClientCredential` (server-side). */\n apiKey?: string\n /** Sonor API base. Defaults to `https://api.sonor.io`. */\n apiUrl?: string\n /**\n * Sub-site host for multi-site projects. Omit to resolve from\n * `NEXT_PUBLIC_SITE_URL` then `window.location.host`.\n */\n site?: string\n debug?: boolean\n}\n\nexport function SiteKitCredential({\n apiKey,\n apiUrl,\n site,\n debug,\n}: SiteKitCredentialProps): null {\n // Publish during render, not in an effect — client modules read these globals\n // in their own mount effects, and effects run child-first.\n publishSiteCredential({ apiKey, apiUrl, site, debug })\n return null\n}\n"]}
|
package/dist/client/index.mjs
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
import { publishSiteCredential } from '../chunk-
|
|
2
|
+
import { publishSiteCredential } from '../chunk-5TGAUWNO.mjs';
|
|
3
3
|
import '../chunk-GZJE23Y5.mjs';
|
|
4
4
|
import '../chunk-ZN4HBK5C.mjs';
|
|
5
5
|
export { useDeferredActivation } from '../chunk-ZVBLXXNJ.mjs';
|
|
6
|
-
export { trackConversion, trackEvent } from '../chunk-
|
|
6
|
+
export { trackConversion, trackEvent } from '../chunk-SHLWA6JY.mjs';
|
|
7
|
+
export { VISUAL_VIEWPORT_GAP_PROPERTY, VisualViewportGap, useVisualViewportGap } from '../chunk-NSWO43XW.mjs';
|
|
7
8
|
export { getOrCreateSessionId, getOrCreateVisitorId, useSiteKitIdentity } from '../chunk-ZZQAGCSI.mjs';
|
|
8
9
|
import '../chunk-6EDVCUAG.mjs';
|
|
9
|
-
import '../chunk-
|
|
10
|
-
import '../chunk-
|
|
10
|
+
import '../chunk-4XGACM7D.mjs';
|
|
11
|
+
import '../chunk-WDBCXRTT.mjs';
|
|
11
12
|
import '../chunk-BEXTDHO4.mjs';
|
|
12
13
|
|
|
13
14
|
// src/client/SiteKitCredential.tsx
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/client/SiteKitCredential.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../src/client/SiteKitCredential.tsx"],"names":[],"mappings":";;;;;;;;;;;;;AA6CO,SAAS,iBAAA,CAAkB;AAAA,EAChC,MAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA;AACF,CAAA,EAAiC;AAG/B,EAAA,qBAAA,CAAsB,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,OAAO,CAAA;AACrD,EAAA,OAAO,IAAA;AACT","file":"index.mjs","sourcesContent":["'use client'\n\n/**\n * SiteKitCredential — publish a minted credential to the browser.\n *\n * The client half of the token mint, for layouts that are NOT core\n * `SiteKitLayout`. A server component mints with `resolveClientCredential`\n * (`@sonordev/site-kit/server`) and renders this to seed the token manager and\n * the `window.__SITE_KIT_*` globals every client module reads:\n *\n * ```tsx\n * // app/layout.tsx (server component)\n * import { resolveClientCredential } from '@sonordev/site-kit/server'\n * import { SiteKitCredential } from '@sonordev/site-kit/client'\n *\n * const credential = await resolveClientCredential(\n * process.env.SONOR_API_KEY ?? '',\n * 'https://api.sonor.io',\n * )\n * return <><SiteKitCredential apiKey={credential} />{children}</>\n * ```\n *\n * Renders null — it is a childless sibling, never a wrapper, so it can't pull\n * page content into a client boundary (CLAUDE.md's cardinal perf rule).\n *\n * WARNING: `apiKey` must be a minted `st1.` token resolved SERVER-side. Passing\n * a raw `sonor_` key from a client component inlines the project secret into\n * the browser bundle and defeats the mint. Never source it from\n * `NEXT_PUBLIC_SONOR_API_KEY`.\n */\nimport { publishSiteCredential } from '../shared/publishCredential'\n\nexport interface SiteKitCredentialProps {\n /** Minted `st1.` token from `resolveClientCredential` (server-side). */\n apiKey?: string\n /** Sonor API base. Defaults to `https://api.sonor.io`. */\n apiUrl?: string\n /**\n * Sub-site host for multi-site projects. Omit to resolve from\n * `NEXT_PUBLIC_SITE_URL` then `window.location.host`.\n */\n site?: string\n debug?: boolean\n}\n\nexport function SiteKitCredential({\n apiKey,\n apiUrl,\n site,\n debug,\n}: SiteKitCredentialProps): null {\n // Publish during render, not in an effect — client modules read these globals\n // in their own mount effects, and effects run child-first.\n publishSiteCredential({ apiKey, apiUrl, site, debug })\n return null\n}\n"]}
|
package/dist/cms/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cms/sanity-image.ts","../../src/cms/PortableTextRenderer.tsx","../../src/cms/sections/HeroSection.tsx","../../src/cms/sections/RichTextSection.tsx","../../src/cms/sections/CtaSection.tsx","../../src/cms/sections/GallerySection.tsx","../../src/cms/sections/TestimonialsSection.tsx","../../src/cms/sections/FaqSection.tsx","../../src/cms/sections/FormSection.tsx","../../src/cms/sections/CustomSection.tsx","../../src/cms/CmsSection.tsx","../../src/cms/CmsPage.tsx","../../src/cms/CmsPreview.tsx"],"names":["imageUrlBuilder","jsx","jsxs","PortableText","getCmsPage","Fragment","useState","useEffect"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Sanity Image URL Builder\n *\n * Wraps @sanity/image-url to produce optimised, hotspot-aware URLs\n * from SanityImageRef objects stored in CMS content.\n */\nimport imageUrlBuilder from '@sanity/image-url'\nimport type { SanityImageRef } from './types'\n\n// ---------------------------------------------------------------------------\n// Singleton builder (configured once per runtime)\n// ---------------------------------------------------------------------------\n\nlet _builder: ReturnType<typeof imageUrlBuilder> | null = null\n\nexport interface SanityImageConfig {\n projectId: string\n dataset: string\n}\n\nconst DEFAULT_CONFIG: SanityImageConfig = {\n projectId: 'l55lyemx',\n dataset: 'production',\n}\n\n/**\n * Initialise (or re-initialise) the image builder with project config.\n * Call once at app startup — e.g. in SiteKitProvider or layout.\n * If never called, falls back to DEFAULT_CONFIG.\n */\nexport function configureSanityImages(config: SanityImageConfig) {\n _builder = imageUrlBuilder(config)\n}\n\nfunction getBuilder() {\n if (!_builder) {\n _builder = imageUrlBuilder(DEFAULT_CONFIG)\n }\n return _builder\n}\n\n// ---------------------------------------------------------------------------\n// URL helpers\n// ---------------------------------------------------------------------------\n\nexport interface ImageUrlOptions {\n width?: number\n height?: number\n /** Device-pixel-ratio multiplier (default 1) */\n dpr?: number\n /** Quality 0-100 (default: Sanity auto) */\n quality?: number\n /** Force a specific format */\n format?: 'webp' | 'avif' | 'png' | 'jpg'\n /** Fit mode */\n fit?: 'clip' | 'crop' | 'fill' | 'fillmax' | 'max' | 'scale' | 'min'\n /** Apply blur (0-2000) */\n blur?: number\n}\n\n/**\n * Build an optimised image URL from a SanityImageRef.\n * Automatically applies hotspot/crop metadata when present.\n *\n * ```ts\n * const url = sanityImageUrl(heroImage, { width: 1200 })\n * ```\n */\nexport function sanityImageUrl(\n image: SanityImageRef | undefined | null,\n options: ImageUrlOptions = {},\n): string {\n if (!image?.asset?._ref) return ''\n\n let builder = getBuilder().image(image).auto('format')\n\n if (options.width) builder = builder.width(options.width)\n if (options.height) builder = builder.height(options.height)\n if (options.dpr) builder = builder.dpr(options.dpr)\n if (options.quality) builder = builder.quality(options.quality)\n if (options.format) builder = builder.format(options.format as any)\n if (options.fit) builder = builder.fit(options.fit)\n if (options.blur) builder = builder.blur(options.blur)\n\n return builder.url()\n}\n\n/**\n * Generate a srcSet string for responsive images.\n *\n * ```tsx\n * <img srcSet={sanityImageSrcSet(img, [400, 800, 1200])} sizes=\"100vw\" />\n * ```\n */\nexport function sanityImageSrcSet(\n image: SanityImageRef | undefined | null,\n widths: number[] = [400, 800, 1200, 1600],\n options: Omit<ImageUrlOptions, 'width'> = {},\n): string {\n if (!image?.asset?._ref) return ''\n return widths\n .map((w) => `${sanityImageUrl(image, { ...options, width: w })} ${w}w`)\n .join(', ')\n}\n\n/**\n * Compute CSS `object-position` from a Sanity hotspot.\n * Returns `undefined` if no hotspot is defined.\n */\nexport function hotspotToObjectPosition(\n image: SanityImageRef | undefined | null,\n): string | undefined {\n if (!image?.hotspot) return undefined\n return `${(image.hotspot.x * 100).toFixed(1)}% ${(image.hotspot.y * 100).toFixed(1)}%`\n}\n","import React from 'react'\nimport { PortableText, type PortableTextComponents } from '@portabletext/react'\nimport type { PortableTextRendererProps, PortableTextContent } from './types'\nimport { sanityImageUrl, sanityImageSrcSet, hotspotToObjectPosition } from './sanity-image'\n\n// ---------------------------------------------------------------------------\n// Default Component Map\n// ---------------------------------------------------------------------------\n\nconst defaultComponents: PortableTextComponents = {\n block: {\n h1: ({ children }) => (\n <h1 className=\"sonor-cms-h1\">{children}</h1>\n ),\n h2: ({ children }) => (\n <h2 className=\"sonor-cms-h2\">{children}</h2>\n ),\n h3: ({ children }) => (\n <h3 className=\"sonor-cms-h3\">{children}</h3>\n ),\n h4: ({ children }) => (\n <h4 className=\"sonor-cms-h4\">{children}</h4>\n ),\n normal: ({ children }) => (\n <p className=\"sonor-cms-p\">{children}</p>\n ),\n blockquote: ({ children }) => (\n <blockquote className=\"sonor-cms-blockquote\">{children}</blockquote>\n ),\n },\n marks: {\n strong: ({ children }) => <strong>{children}</strong>,\n em: ({ children }) => <em>{children}</em>,\n code: ({ children }) => (\n <code className=\"sonor-cms-code\">{children}</code>\n ),\n underline: ({ children }) => <u>{children}</u>,\n 'strike-through': ({ children }) => <s>{children}</s>,\n link: ({ children, value }) => {\n const href = value?.href || '#'\n const isExternal = href.startsWith('http')\n return (\n <a\n href={href}\n className=\"sonor-cms-link\"\n {...(isExternal\n ? { target: '_blank', rel: 'noopener noreferrer' }\n : {})}\n >\n {children}\n </a>\n )\n },\n highlight: ({ children }) => (\n <mark className=\"sonor-cms-highlight\">{children}</mark>\n ),\n },\n list: {\n bullet: ({ children }) => (\n <ul className=\"sonor-cms-ul\">{children}</ul>\n ),\n number: ({ children }) => (\n <ol className=\"sonor-cms-ol\">{children}</ol>\n ),\n },\n listItem: {\n bullet: ({ children }) => <li>{children}</li>,\n number: ({ children }) => <li>{children}</li>,\n },\n types: {\n image: ({ value }) => {\n if (!value?.asset?._ref && !value?.url) return null\n const src = value.url || sanityImageUrl(value, { width: 1200 })\n const srcSet = !value.url ? sanityImageSrcSet(value, [400, 800, 1200, 1600]) : undefined\n const objectPosition = hotspotToObjectPosition(value)\n return (\n <figure className=\"sonor-cms-figure\">\n <img\n src={src}\n srcSet={srcSet}\n sizes=\"(max-width: 768px) 100vw, (max-width: 1200px) 80vw, 1200px\"\n alt={value.alt || ''}\n className=\"sonor-cms-img\"\n loading=\"lazy\"\n style={objectPosition ? { objectPosition } : undefined}\n />\n {value.caption && (\n <figcaption className=\"sonor-cms-figcaption\">\n {typeof value.caption === 'string'\n ? value.caption\n : null}\n </figcaption>\n )}\n </figure>\n )\n },\n },\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\n/**\n * Renders Portable Text content with Sonor default styling.\n * Accepts `components` prop to override or extend defaults.\n */\nexport function PortableTextRenderer({\n value,\n components: overrides,\n className,\n}: PortableTextRendererProps) {\n if (!value || !Array.isArray(value) || value.length === 0) return null\n\n const merged: PortableTextComponents = overrides\n ? {\n ...defaultComponents,\n block: { ...(defaultComponents.block as object), ...(overrides as any).block },\n marks: { ...(defaultComponents.marks as object), ...(overrides as any).marks },\n types: { ...(defaultComponents.types as object), ...(overrides as any).types },\n list: { ...(defaultComponents.list as object), ...(overrides as any).list },\n listItem: { ...(defaultComponents.listItem as object), ...(overrides as any).listItem },\n }\n : defaultComponents\n\n return (\n <div className={className || 'sonor-cms-content'}>\n <PortableText value={value as any} components={merged} />\n </div>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport { sanityImageUrl, hotspotToObjectPosition } from '../sanity-image'\nimport type { SectionRendererProps, PortableTextContent, SanityImageRef } from '../types'\n\nexport function HeroSection({ data, portableTextComponents }: SectionRendererProps) {\n const headline = data.headline as PortableTextContent | undefined\n const subheadline = data.subheadline as PortableTextContent | undefined\n const ctaText = data.ctaText as string | undefined\n const ctaLink = data.ctaLink as string | undefined\n const bgImage = data.backgroundImage as SanityImageRef | undefined\n const bgUrl = sanityImageUrl(bgImage, { width: 1920, quality: 80 })\n const bgPosition = hotspotToObjectPosition(bgImage) || '50% 50%'\n\n return (\n <section\n className=\"sonor-cms-hero\"\n style={\n bgUrl\n ? { backgroundImage: `url(${bgUrl})`, backgroundPosition: bgPosition, backgroundSize: 'cover' }\n : undefined\n }\n >\n {headline && (\n <PortableTextRenderer value={headline} components={portableTextComponents} className=\"sonor-cms-hero-headline\" />\n )}\n {subheadline && (\n <PortableTextRenderer value={subheadline} components={portableTextComponents} className=\"sonor-cms-hero-subheadline\" />\n )}\n {ctaText && ctaLink && (\n <a href={ctaLink} className=\"sonor-cms-hero-cta\">\n {ctaText}\n </a>\n )}\n </section>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport type { SectionRendererProps, PortableTextContent } from '../types'\n\nexport function RichTextSection({ data, portableTextComponents }: SectionRendererProps) {\n const content = data.content as PortableTextContent | undefined\n if (!content) return null\n\n return (\n <section className=\"sonor-cms-richtext\">\n <PortableTextRenderer value={content} components={portableTextComponents} />\n </section>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport type { SectionRendererProps, PortableTextContent } from '../types'\n\nexport function CtaSection({ data, portableTextComponents }: SectionRendererProps) {\n const headline = data.headline as PortableTextContent | undefined\n const description = data.description as PortableTextContent | undefined\n const buttonText = data.buttonText as string | undefined\n const buttonLink = data.buttonLink as string | undefined\n\n return (\n <section className=\"sonor-cms-cta\">\n {headline && (\n <PortableTextRenderer value={headline} components={portableTextComponents} className=\"sonor-cms-cta-headline\" />\n )}\n {description && (\n <PortableTextRenderer value={description} components={portableTextComponents} className=\"sonor-cms-cta-description\" />\n )}\n {buttonText && buttonLink && (\n <a href={buttonLink} className=\"sonor-cms-cta-button\">\n {buttonText}\n </a>\n )}\n </section>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport { sanityImageUrl, sanityImageSrcSet, hotspotToObjectPosition } from '../sanity-image'\nimport type { SectionRendererProps, PortableTextContent, SanityImageRef } from '../types'\n\nexport function GallerySection({ data, portableTextComponents }: SectionRendererProps) {\n const images = (data.images || []) as SanityImageRef[]\n const layout = (data.layout || 'grid') as string\n const caption = data.caption as PortableTextContent | undefined\n\n if (images.length === 0) return null\n\n return (\n <section className=\"sonor-cms-gallery\">\n <div className={`sonor-cms-gallery-${layout}`}>\n {images.map((img, i) => {\n const objectPosition = hotspotToObjectPosition(img)\n return (\n <figure key={img.asset?._ref || i} className=\"sonor-cms-gallery-item\">\n <img\n src={sanityImageUrl(img, { width: 800 })}\n srcSet={sanityImageSrcSet(img, [400, 800, 1200])}\n sizes=\"(max-width: 640px) 100vw, (max-width: 1024px) 50vw, 33vw\"\n alt={img.alt || ''}\n loading=\"lazy\"\n style={objectPosition ? { objectPosition } : undefined}\n />\n </figure>\n )\n })}\n </div>\n {caption && (\n <PortableTextRenderer value={caption} components={portableTextComponents} className=\"sonor-cms-gallery-caption\" />\n )}\n </section>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport { sanityImageUrl } from '../sanity-image'\nimport type { SectionRendererProps, PortableTextContent, SanityImageRef } from '../types'\n\ninterface TestimonialItem {\n quote: PortableTextContent\n author: string\n role?: string\n avatar?: SanityImageRef\n}\n\nexport function TestimonialsSection({ data, portableTextComponents }: SectionRendererProps) {\n const items = (data.items || []) as TestimonialItem[]\n const layout = (data.layout || 'grid') as string\n\n if (items.length === 0) return null\n\n return (\n <section className={`sonor-cms-testimonials sonor-cms-testimonials-${layout}`}>\n {items.map((item, i) => (\n <blockquote key={i} className=\"sonor-cms-testimonial\">\n <PortableTextRenderer value={item.quote} components={portableTextComponents} className=\"sonor-cms-testimonial-quote\" />\n <footer className=\"sonor-cms-testimonial-footer\">\n {item.avatar?.asset?._ref && (\n <img\n src={sanityImageUrl(item.avatar, { width: 80, height: 80, fit: 'crop' })}\n alt={item.avatar.alt || item.author}\n className=\"sonor-cms-testimonial-avatar\"\n width={80}\n height={80}\n loading=\"lazy\"\n />\n )}\n <cite className=\"sonor-cms-testimonial-author\">\n {item.author}\n {item.role && (\n <span className=\"sonor-cms-testimonial-role\">, {item.role}</span>\n )}\n </cite>\n </footer>\n </blockquote>\n ))}\n </section>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport type { SectionRendererProps, PortableTextContent } from '../types'\n\ninterface FaqItem {\n question: string\n answer: PortableTextContent\n}\n\nexport function FaqSection({ data, portableTextComponents }: SectionRendererProps) {\n const items = (data.items || []) as FaqItem[]\n\n if (items.length === 0) return null\n\n return (\n <section className=\"sonor-cms-faq\">\n {items.map((item, i) => (\n <details key={i} className=\"sonor-cms-faq-item\">\n <summary className=\"sonor-cms-faq-question\">{item.question}</summary>\n <div className=\"sonor-cms-faq-answer\">\n <PortableTextRenderer value={item.answer} components={portableTextComponents} />\n </div>\n </details>\n ))}\n </section>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport type { SectionRendererProps, PortableTextContent } from '../types'\n\n/**\n * Form section — renders a heading and a placeholder for the managed form.\n * The actual form rendering depends on ManagedForm from the forms module.\n * Sites should override this section renderer to integrate with their form setup.\n */\nexport function FormSection({ data, portableTextComponents }: SectionRendererProps) {\n const formSlug = data.formSlug as string | undefined\n const heading = data.heading as PortableTextContent | undefined\n\n return (\n <section className=\"sonor-cms-form\">\n {heading && (\n <PortableTextRenderer value={heading} components={portableTextComponents} className=\"sonor-cms-form-heading\" />\n )}\n {formSlug ? (\n <div\n className=\"sonor-cms-form-embed\"\n data-form-slug={formSlug}\n >\n {/* Override FormSection renderer to integrate ManagedForm */}\n </div>\n ) : (\n <p className=\"sonor-cms-form-placeholder\">Form not configured</p>\n )}\n </section>\n )\n}\n","import React from 'react'\nimport type { SectionRendererProps } from '../types'\n\n/**\n * Custom section — passes props to a named component.\n * Sites must provide their own component map via sectionComponents override.\n */\nexport function CustomSection({ data, displayName }: SectionRendererProps) {\n const componentName = data.componentName as string | undefined\n const props = (data.props || {}) as Record<string, unknown>\n\n return (\n <section className=\"sonor-cms-custom\" data-component={componentName}>\n <div className=\"sonor-cms-custom-placeholder\">\n Custom component: {componentName || displayName}\n {/* Override 'custom' in sectionComponents to render actual components */}\n </div>\n </section>\n )\n}\n","import React from 'react'\nimport type { CmsSectionProps, SectionRendererProps, SectionType } from './types'\nimport {\n HeroSection,\n RichTextSection,\n CtaSection,\n GallerySection,\n TestimonialsSection,\n FaqSection,\n FormSection,\n CustomSection,\n} from './sections'\n\nconst defaultRenderers: Record<SectionType, React.ComponentType<SectionRendererProps>> = {\n hero: HeroSection,\n richText: RichTextSection,\n cta: CtaSection,\n gallery: GallerySection,\n testimonials: TestimonialsSection,\n faq: FaqSection,\n form: FormSection,\n custom: CustomSection,\n}\n\n/**\n * Renders a single CMS section using the appropriate renderer for its type.\n * Override specific section renderers via the `sectionComponents` prop.\n */\nexport function CmsSection({ section, sectionComponents, portableTextComponents }: CmsSectionProps) {\n const Renderer =\n sectionComponents?.[section.sectionType] ||\n defaultRenderers[section.sectionType]\n\n if (!Renderer) {\n if (process.env.NODE_ENV === 'development') {\n console.warn(`@sonordev/cms: No renderer for section type: ${section.sectionType}`)\n }\n return null\n }\n\n return (\n <div\n className={`sonor-cms-section sonor-cms-section-${section.sectionType}`}\n data-section-id={section._id}\n data-section-type={section.sectionType}\n >\n <Renderer\n data={section.data}\n sectionType={section.sectionType}\n displayName={section.displayName}\n portableTextComponents={portableTextComponents}\n />\n </div>\n )\n}\n","import React from 'react'\nimport type { CmsPageProps, CmsSectionData } from './types'\nimport { getCmsPage } from './server-api'\nimport { CmsSection } from './CmsSection'\n\n/**\n * Async React Server Component that fetches and renders a full CMS page.\n *\n * @example\n * ```tsx\n * // app/[...slug]/page.tsx\n * import { CmsPage } from '@sonordev/site-kit/cms'\n *\n * export default function Page({ params }) {\n * return <CmsPage path={`/${params.slug.join('/')}`} />\n * }\n * ```\n */\nexport async function CmsPage({\n path,\n sectionComponents,\n portableTextComponents,\n fallback,\n className,\n}: CmsPageProps): Promise<React.ReactElement | null> {\n const page = await getCmsPage(path)\n\n if (!page) {\n if (fallback) return <>{fallback}</>\n return null\n }\n\n if (!page.sections || page.sections.length === 0) {\n if (fallback) return <>{fallback}</>\n return null\n }\n\n return (\n <div\n className={className || 'sonor-cms-page'}\n data-cms-page-id={page._id}\n data-cms-path={page.path}\n >\n {page.sections.map((section: CmsSectionData) => (\n <CmsSection\n key={section._id}\n section={section}\n sectionComponents={sectionComponents}\n portableTextComponents={portableTextComponents}\n />\n ))}\n </div>\n )\n}\n","'use client'\n\nimport React, { useState, useEffect } from 'react'\nimport type { CmsPageData, CmsSectionProps, SectionType, SectionRendererProps } from './types'\nimport { CmsSection } from './CmsSection'\n\ninterface CmsPreviewProps {\n /** Portal API base URL */\n apiUrl?: string\n /** API key for fetching draft content */\n apiKey: string\n /** Page path to preview */\n path: string\n /** Poll interval in ms (0 = no polling) */\n pollInterval?: number\n /** Override section renderers */\n sectionComponents?: Partial<Record<SectionType, React.ComponentType<SectionRendererProps>>>\n /** Override Portable Text components */\n portableTextComponents?: Record<string, React.ComponentType<any>>\n /** Wrapper className */\n className?: string\n}\n\n/**\n * Client component for previewing draft CMS content.\n * Fetches draft content from Portal API and re-renders on changes.\n *\n * @example\n * ```tsx\n * // Used in preview mode (e.g., ?preview=true)\n * import { CmsPreview } from '@sonordev/site-kit/cms'\n *\n * <CmsPreview\n * apiKey={process.env.SONOR_API_KEY!}\n * path=\"/about\"\n * pollInterval={3000}\n * />\n * ```\n */\nexport function CmsPreview({\n apiUrl = process.env.SONOR_API_URL || 'https://api.sonor.io',\n apiKey,\n path,\n pollInterval = 3000,\n sectionComponents,\n portableTextComponents,\n className,\n}: CmsPreviewProps) {\n const [page, setPage] = useState<CmsPageData | null>(null)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n let cancelled = false\n\n async function fetchPage() {\n try {\n const res = await fetch(`${apiUrl}/api/public/cms/page`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n },\n body: JSON.stringify({ path }),\n })\n\n if (!res.ok) {\n setError(`Error ${res.status}`)\n return\n }\n\n const data = await res.json()\n if (!cancelled && data?.found && data.page) {\n setPage(data.page)\n setError(null)\n }\n } catch (err) {\n if (!cancelled) {\n setError('Failed to load preview')\n }\n }\n }\n\n fetchPage()\n\n if (pollInterval > 0) {\n const interval = setInterval(fetchPage, pollInterval)\n return () => {\n cancelled = true\n clearInterval(interval)\n }\n }\n\n return () => {\n cancelled = true\n }\n }, [apiUrl, apiKey, path, pollInterval])\n\n if (error) {\n return (\n <div className=\"sonor-cms-preview-error\">\n <p>Preview error: {error}</p>\n </div>\n )\n }\n\n if (!page) {\n return (\n <div className=\"sonor-cms-preview-loading\">\n <p>Loading preview...</p>\n </div>\n )\n }\n\n return (\n <div\n className={className || 'sonor-cms-page sonor-cms-preview'}\n data-cms-preview=\"true\"\n data-cms-path={page.path}\n >\n {page.sections?.map((section) => (\n <CmsSection\n key={section._id}\n section={section}\n sectionComponents={sectionComponents}\n portableTextComponents={portableTextComponents}\n />\n ))}\n </div>\n )\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/cms/sanity-image.ts","../../src/cms/PortableTextRenderer.tsx","../../src/cms/sections/HeroSection.tsx","../../src/cms/sections/RichTextSection.tsx","../../src/cms/sections/CtaSection.tsx","../../src/cms/sections/GallerySection.tsx","../../src/cms/sections/TestimonialsSection.tsx","../../src/cms/sections/FaqSection.tsx","../../src/cms/sections/FormSection.tsx","../../src/cms/sections/CustomSection.tsx","../../src/cms/CmsSection.tsx","../../src/cms/CmsPage.tsx","../../src/cms/CmsPreview.tsx"],"names":["imageUrlBuilder","jsx","jsxs","PortableText","getCmsPage","Fragment","useState","useEffect"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Sanity Image URL Builder\n *\n * Wraps @sanity/image-url to produce optimised, hotspot-aware URLs\n * from SanityImageRef objects stored in CMS content.\n */\nimport imageUrlBuilder from '@sanity/image-url'\nimport type { SanityImageRef } from './types'\n\n// ---------------------------------------------------------------------------\n// Singleton builder (configured once per runtime)\n// ---------------------------------------------------------------------------\n\nlet _builder: ReturnType<typeof imageUrlBuilder> | null = null\n\nexport interface SanityImageConfig {\n projectId: string\n dataset: string\n}\n\nconst DEFAULT_CONFIG: SanityImageConfig = {\n projectId: 'l55lyemx',\n dataset: 'production',\n}\n\n/**\n * Initialise (or re-initialise) the image builder with project config.\n * Call once at app startup — e.g. at module scope in app/layout.tsx.\n * If never called, falls back to DEFAULT_CONFIG.\n */\nexport function configureSanityImages(config: SanityImageConfig) {\n _builder = imageUrlBuilder(config)\n}\n\nfunction getBuilder() {\n if (!_builder) {\n _builder = imageUrlBuilder(DEFAULT_CONFIG)\n }\n return _builder\n}\n\n// ---------------------------------------------------------------------------\n// URL helpers\n// ---------------------------------------------------------------------------\n\nexport interface ImageUrlOptions {\n width?: number\n height?: number\n /** Device-pixel-ratio multiplier (default 1) */\n dpr?: number\n /** Quality 0-100 (default: Sanity auto) */\n quality?: number\n /** Force a specific format */\n format?: 'webp' | 'avif' | 'png' | 'jpg'\n /** Fit mode */\n fit?: 'clip' | 'crop' | 'fill' | 'fillmax' | 'max' | 'scale' | 'min'\n /** Apply blur (0-2000) */\n blur?: number\n}\n\n/**\n * Build an optimised image URL from a SanityImageRef.\n * Automatically applies hotspot/crop metadata when present.\n *\n * ```ts\n * const url = sanityImageUrl(heroImage, { width: 1200 })\n * ```\n */\nexport function sanityImageUrl(\n image: SanityImageRef | undefined | null,\n options: ImageUrlOptions = {},\n): string {\n if (!image?.asset?._ref) return ''\n\n let builder = getBuilder().image(image).auto('format')\n\n if (options.width) builder = builder.width(options.width)\n if (options.height) builder = builder.height(options.height)\n if (options.dpr) builder = builder.dpr(options.dpr)\n if (options.quality) builder = builder.quality(options.quality)\n if (options.format) builder = builder.format(options.format as any)\n if (options.fit) builder = builder.fit(options.fit)\n if (options.blur) builder = builder.blur(options.blur)\n\n return builder.url()\n}\n\n/**\n * Generate a srcSet string for responsive images.\n *\n * ```tsx\n * <img srcSet={sanityImageSrcSet(img, [400, 800, 1200])} sizes=\"100vw\" />\n * ```\n */\nexport function sanityImageSrcSet(\n image: SanityImageRef | undefined | null,\n widths: number[] = [400, 800, 1200, 1600],\n options: Omit<ImageUrlOptions, 'width'> = {},\n): string {\n if (!image?.asset?._ref) return ''\n return widths\n .map((w) => `${sanityImageUrl(image, { ...options, width: w })} ${w}w`)\n .join(', ')\n}\n\n/**\n * Compute CSS `object-position` from a Sanity hotspot.\n * Returns `undefined` if no hotspot is defined.\n */\nexport function hotspotToObjectPosition(\n image: SanityImageRef | undefined | null,\n): string | undefined {\n if (!image?.hotspot) return undefined\n return `${(image.hotspot.x * 100).toFixed(1)}% ${(image.hotspot.y * 100).toFixed(1)}%`\n}\n","import React from 'react'\nimport { PortableText, type PortableTextComponents } from '@portabletext/react'\nimport type { PortableTextRendererProps, PortableTextContent } from './types'\nimport { sanityImageUrl, sanityImageSrcSet, hotspotToObjectPosition } from './sanity-image'\n\n// ---------------------------------------------------------------------------\n// Default Component Map\n// ---------------------------------------------------------------------------\n\nconst defaultComponents: PortableTextComponents = {\n block: {\n h1: ({ children }) => (\n <h1 className=\"sonor-cms-h1\">{children}</h1>\n ),\n h2: ({ children }) => (\n <h2 className=\"sonor-cms-h2\">{children}</h2>\n ),\n h3: ({ children }) => (\n <h3 className=\"sonor-cms-h3\">{children}</h3>\n ),\n h4: ({ children }) => (\n <h4 className=\"sonor-cms-h4\">{children}</h4>\n ),\n normal: ({ children }) => (\n <p className=\"sonor-cms-p\">{children}</p>\n ),\n blockquote: ({ children }) => (\n <blockquote className=\"sonor-cms-blockquote\">{children}</blockquote>\n ),\n },\n marks: {\n strong: ({ children }) => <strong>{children}</strong>,\n em: ({ children }) => <em>{children}</em>,\n code: ({ children }) => (\n <code className=\"sonor-cms-code\">{children}</code>\n ),\n underline: ({ children }) => <u>{children}</u>,\n 'strike-through': ({ children }) => <s>{children}</s>,\n link: ({ children, value }) => {\n const href = value?.href || '#'\n const isExternal = href.startsWith('http')\n return (\n <a\n href={href}\n className=\"sonor-cms-link\"\n {...(isExternal\n ? { target: '_blank', rel: 'noopener noreferrer' }\n : {})}\n >\n {children}\n </a>\n )\n },\n highlight: ({ children }) => (\n <mark className=\"sonor-cms-highlight\">{children}</mark>\n ),\n },\n list: {\n bullet: ({ children }) => (\n <ul className=\"sonor-cms-ul\">{children}</ul>\n ),\n number: ({ children }) => (\n <ol className=\"sonor-cms-ol\">{children}</ol>\n ),\n },\n listItem: {\n bullet: ({ children }) => <li>{children}</li>,\n number: ({ children }) => <li>{children}</li>,\n },\n types: {\n image: ({ value }) => {\n if (!value?.asset?._ref && !value?.url) return null\n const src = value.url || sanityImageUrl(value, { width: 1200 })\n const srcSet = !value.url ? sanityImageSrcSet(value, [400, 800, 1200, 1600]) : undefined\n const objectPosition = hotspotToObjectPosition(value)\n return (\n <figure className=\"sonor-cms-figure\">\n <img\n src={src}\n srcSet={srcSet}\n sizes=\"(max-width: 768px) 100vw, (max-width: 1200px) 80vw, 1200px\"\n alt={value.alt || ''}\n className=\"sonor-cms-img\"\n loading=\"lazy\"\n style={objectPosition ? { objectPosition } : undefined}\n />\n {value.caption && (\n <figcaption className=\"sonor-cms-figcaption\">\n {typeof value.caption === 'string'\n ? value.caption\n : null}\n </figcaption>\n )}\n </figure>\n )\n },\n },\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\n/**\n * Renders Portable Text content with Sonor default styling.\n * Accepts `components` prop to override or extend defaults.\n */\nexport function PortableTextRenderer({\n value,\n components: overrides,\n className,\n}: PortableTextRendererProps) {\n if (!value || !Array.isArray(value) || value.length === 0) return null\n\n const merged: PortableTextComponents = overrides\n ? {\n ...defaultComponents,\n block: { ...(defaultComponents.block as object), ...(overrides as any).block },\n marks: { ...(defaultComponents.marks as object), ...(overrides as any).marks },\n types: { ...(defaultComponents.types as object), ...(overrides as any).types },\n list: { ...(defaultComponents.list as object), ...(overrides as any).list },\n listItem: { ...(defaultComponents.listItem as object), ...(overrides as any).listItem },\n }\n : defaultComponents\n\n return (\n <div className={className || 'sonor-cms-content'}>\n <PortableText value={value as any} components={merged} />\n </div>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport { sanityImageUrl, hotspotToObjectPosition } from '../sanity-image'\nimport type { SectionRendererProps, PortableTextContent, SanityImageRef } from '../types'\n\nexport function HeroSection({ data, portableTextComponents }: SectionRendererProps) {\n const headline = data.headline as PortableTextContent | undefined\n const subheadline = data.subheadline as PortableTextContent | undefined\n const ctaText = data.ctaText as string | undefined\n const ctaLink = data.ctaLink as string | undefined\n const bgImage = data.backgroundImage as SanityImageRef | undefined\n const bgUrl = sanityImageUrl(bgImage, { width: 1920, quality: 80 })\n const bgPosition = hotspotToObjectPosition(bgImage) || '50% 50%'\n\n return (\n <section\n className=\"sonor-cms-hero\"\n style={\n bgUrl\n ? { backgroundImage: `url(${bgUrl})`, backgroundPosition: bgPosition, backgroundSize: 'cover' }\n : undefined\n }\n >\n {headline && (\n <PortableTextRenderer value={headline} components={portableTextComponents} className=\"sonor-cms-hero-headline\" />\n )}\n {subheadline && (\n <PortableTextRenderer value={subheadline} components={portableTextComponents} className=\"sonor-cms-hero-subheadline\" />\n )}\n {ctaText && ctaLink && (\n <a href={ctaLink} className=\"sonor-cms-hero-cta\">\n {ctaText}\n </a>\n )}\n </section>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport type { SectionRendererProps, PortableTextContent } from '../types'\n\nexport function RichTextSection({ data, portableTextComponents }: SectionRendererProps) {\n const content = data.content as PortableTextContent | undefined\n if (!content) return null\n\n return (\n <section className=\"sonor-cms-richtext\">\n <PortableTextRenderer value={content} components={portableTextComponents} />\n </section>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport type { SectionRendererProps, PortableTextContent } from '../types'\n\nexport function CtaSection({ data, portableTextComponents }: SectionRendererProps) {\n const headline = data.headline as PortableTextContent | undefined\n const description = data.description as PortableTextContent | undefined\n const buttonText = data.buttonText as string | undefined\n const buttonLink = data.buttonLink as string | undefined\n\n return (\n <section className=\"sonor-cms-cta\">\n {headline && (\n <PortableTextRenderer value={headline} components={portableTextComponents} className=\"sonor-cms-cta-headline\" />\n )}\n {description && (\n <PortableTextRenderer value={description} components={portableTextComponents} className=\"sonor-cms-cta-description\" />\n )}\n {buttonText && buttonLink && (\n <a href={buttonLink} className=\"sonor-cms-cta-button\">\n {buttonText}\n </a>\n )}\n </section>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport { sanityImageUrl, sanityImageSrcSet, hotspotToObjectPosition } from '../sanity-image'\nimport type { SectionRendererProps, PortableTextContent, SanityImageRef } from '../types'\n\nexport function GallerySection({ data, portableTextComponents }: SectionRendererProps) {\n const images = (data.images || []) as SanityImageRef[]\n const layout = (data.layout || 'grid') as string\n const caption = data.caption as PortableTextContent | undefined\n\n if (images.length === 0) return null\n\n return (\n <section className=\"sonor-cms-gallery\">\n <div className={`sonor-cms-gallery-${layout}`}>\n {images.map((img, i) => {\n const objectPosition = hotspotToObjectPosition(img)\n return (\n <figure key={img.asset?._ref || i} className=\"sonor-cms-gallery-item\">\n <img\n src={sanityImageUrl(img, { width: 800 })}\n srcSet={sanityImageSrcSet(img, [400, 800, 1200])}\n sizes=\"(max-width: 640px) 100vw, (max-width: 1024px) 50vw, 33vw\"\n alt={img.alt || ''}\n loading=\"lazy\"\n style={objectPosition ? { objectPosition } : undefined}\n />\n </figure>\n )\n })}\n </div>\n {caption && (\n <PortableTextRenderer value={caption} components={portableTextComponents} className=\"sonor-cms-gallery-caption\" />\n )}\n </section>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport { sanityImageUrl } from '../sanity-image'\nimport type { SectionRendererProps, PortableTextContent, SanityImageRef } from '../types'\n\ninterface TestimonialItem {\n quote: PortableTextContent\n author: string\n role?: string\n avatar?: SanityImageRef\n}\n\nexport function TestimonialsSection({ data, portableTextComponents }: SectionRendererProps) {\n const items = (data.items || []) as TestimonialItem[]\n const layout = (data.layout || 'grid') as string\n\n if (items.length === 0) return null\n\n return (\n <section className={`sonor-cms-testimonials sonor-cms-testimonials-${layout}`}>\n {items.map((item, i) => (\n <blockquote key={i} className=\"sonor-cms-testimonial\">\n <PortableTextRenderer value={item.quote} components={portableTextComponents} className=\"sonor-cms-testimonial-quote\" />\n <footer className=\"sonor-cms-testimonial-footer\">\n {item.avatar?.asset?._ref && (\n <img\n src={sanityImageUrl(item.avatar, { width: 80, height: 80, fit: 'crop' })}\n alt={item.avatar.alt || item.author}\n className=\"sonor-cms-testimonial-avatar\"\n width={80}\n height={80}\n loading=\"lazy\"\n />\n )}\n <cite className=\"sonor-cms-testimonial-author\">\n {item.author}\n {item.role && (\n <span className=\"sonor-cms-testimonial-role\">, {item.role}</span>\n )}\n </cite>\n </footer>\n </blockquote>\n ))}\n </section>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport type { SectionRendererProps, PortableTextContent } from '../types'\n\ninterface FaqItem {\n question: string\n answer: PortableTextContent\n}\n\nexport function FaqSection({ data, portableTextComponents }: SectionRendererProps) {\n const items = (data.items || []) as FaqItem[]\n\n if (items.length === 0) return null\n\n return (\n <section className=\"sonor-cms-faq\">\n {items.map((item, i) => (\n <details key={i} className=\"sonor-cms-faq-item\">\n <summary className=\"sonor-cms-faq-question\">{item.question}</summary>\n <div className=\"sonor-cms-faq-answer\">\n <PortableTextRenderer value={item.answer} components={portableTextComponents} />\n </div>\n </details>\n ))}\n </section>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport type { SectionRendererProps, PortableTextContent } from '../types'\n\n/**\n * Form section — renders a heading and a placeholder for the managed form.\n * The actual form rendering depends on ManagedForm from the forms module.\n * Sites should override this section renderer to integrate with their form setup.\n */\nexport function FormSection({ data, portableTextComponents }: SectionRendererProps) {\n const formSlug = data.formSlug as string | undefined\n const heading = data.heading as PortableTextContent | undefined\n\n return (\n <section className=\"sonor-cms-form\">\n {heading && (\n <PortableTextRenderer value={heading} components={portableTextComponents} className=\"sonor-cms-form-heading\" />\n )}\n {formSlug ? (\n <div\n className=\"sonor-cms-form-embed\"\n data-form-slug={formSlug}\n >\n {/* Override FormSection renderer to integrate ManagedForm */}\n </div>\n ) : (\n <p className=\"sonor-cms-form-placeholder\">Form not configured</p>\n )}\n </section>\n )\n}\n","import React from 'react'\nimport type { SectionRendererProps } from '../types'\n\n/**\n * Custom section — passes props to a named component.\n * Sites must provide their own component map via sectionComponents override.\n */\nexport function CustomSection({ data, displayName }: SectionRendererProps) {\n const componentName = data.componentName as string | undefined\n const props = (data.props || {}) as Record<string, unknown>\n\n return (\n <section className=\"sonor-cms-custom\" data-component={componentName}>\n <div className=\"sonor-cms-custom-placeholder\">\n Custom component: {componentName || displayName}\n {/* Override 'custom' in sectionComponents to render actual components */}\n </div>\n </section>\n )\n}\n","import React from 'react'\nimport type { CmsSectionProps, SectionRendererProps, SectionType } from './types'\nimport {\n HeroSection,\n RichTextSection,\n CtaSection,\n GallerySection,\n TestimonialsSection,\n FaqSection,\n FormSection,\n CustomSection,\n} from './sections'\n\nconst defaultRenderers: Record<SectionType, React.ComponentType<SectionRendererProps>> = {\n hero: HeroSection,\n richText: RichTextSection,\n cta: CtaSection,\n gallery: GallerySection,\n testimonials: TestimonialsSection,\n faq: FaqSection,\n form: FormSection,\n custom: CustomSection,\n}\n\n/**\n * Renders a single CMS section using the appropriate renderer for its type.\n * Override specific section renderers via the `sectionComponents` prop.\n */\nexport function CmsSection({ section, sectionComponents, portableTextComponents }: CmsSectionProps) {\n const Renderer =\n sectionComponents?.[section.sectionType] ||\n defaultRenderers[section.sectionType]\n\n if (!Renderer) {\n if (process.env.NODE_ENV === 'development') {\n console.warn(`@sonordev/cms: No renderer for section type: ${section.sectionType}`)\n }\n return null\n }\n\n return (\n <div\n className={`sonor-cms-section sonor-cms-section-${section.sectionType}`}\n data-section-id={section._id}\n data-section-type={section.sectionType}\n >\n <Renderer\n data={section.data}\n sectionType={section.sectionType}\n displayName={section.displayName}\n portableTextComponents={portableTextComponents}\n />\n </div>\n )\n}\n","import React from 'react'\nimport type { CmsPageProps, CmsSectionData } from './types'\nimport { getCmsPage } from './server-api'\nimport { CmsSection } from './CmsSection'\n\n/**\n * Async React Server Component that fetches and renders a full CMS page.\n *\n * @example\n * ```tsx\n * // app/[...slug]/page.tsx\n * import { CmsPage } from '@sonordev/site-kit/cms'\n *\n * export default function Page({ params }) {\n * return <CmsPage path={`/${params.slug.join('/')}`} />\n * }\n * ```\n */\nexport async function CmsPage({\n path,\n sectionComponents,\n portableTextComponents,\n fallback,\n className,\n}: CmsPageProps): Promise<React.ReactElement | null> {\n const page = await getCmsPage(path)\n\n if (!page) {\n if (fallback) return <>{fallback}</>\n return null\n }\n\n if (!page.sections || page.sections.length === 0) {\n if (fallback) return <>{fallback}</>\n return null\n }\n\n return (\n <div\n className={className || 'sonor-cms-page'}\n data-cms-page-id={page._id}\n data-cms-path={page.path}\n >\n {page.sections.map((section: CmsSectionData) => (\n <CmsSection\n key={section._id}\n section={section}\n sectionComponents={sectionComponents}\n portableTextComponents={portableTextComponents}\n />\n ))}\n </div>\n )\n}\n","'use client'\n\nimport React, { useState, useEffect } from 'react'\nimport type { CmsPageData, CmsSectionProps, SectionType, SectionRendererProps } from './types'\nimport { CmsSection } from './CmsSection'\n\ninterface CmsPreviewProps {\n /** Portal API base URL */\n apiUrl?: string\n /** API key for fetching draft content */\n apiKey: string\n /** Page path to preview */\n path: string\n /** Poll interval in ms (0 = no polling) */\n pollInterval?: number\n /** Override section renderers */\n sectionComponents?: Partial<Record<SectionType, React.ComponentType<SectionRendererProps>>>\n /** Override Portable Text components */\n portableTextComponents?: Record<string, React.ComponentType<any>>\n /** Wrapper className */\n className?: string\n}\n\n/**\n * Client component for previewing draft CMS content.\n * Fetches draft content from Portal API and re-renders on changes.\n *\n * @example\n * ```tsx\n * // Used in preview mode (e.g., ?preview=true)\n * import { CmsPreview } from '@sonordev/site-kit/cms'\n *\n * <CmsPreview\n * apiKey={process.env.SONOR_API_KEY!}\n * path=\"/about\"\n * pollInterval={3000}\n * />\n * ```\n */\nexport function CmsPreview({\n apiUrl = process.env.SONOR_API_URL || 'https://api.sonor.io',\n apiKey,\n path,\n pollInterval = 3000,\n sectionComponents,\n portableTextComponents,\n className,\n}: CmsPreviewProps) {\n const [page, setPage] = useState<CmsPageData | null>(null)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n let cancelled = false\n\n async function fetchPage() {\n try {\n const res = await fetch(`${apiUrl}/api/public/cms/page`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n },\n body: JSON.stringify({ path }),\n })\n\n if (!res.ok) {\n setError(`Error ${res.status}`)\n return\n }\n\n const data = await res.json()\n if (!cancelled && data?.found && data.page) {\n setPage(data.page)\n setError(null)\n }\n } catch (err) {\n if (!cancelled) {\n setError('Failed to load preview')\n }\n }\n }\n\n fetchPage()\n\n if (pollInterval > 0) {\n const interval = setInterval(fetchPage, pollInterval)\n return () => {\n cancelled = true\n clearInterval(interval)\n }\n }\n\n return () => {\n cancelled = true\n }\n }, [apiUrl, apiKey, path, pollInterval])\n\n if (error) {\n return (\n <div className=\"sonor-cms-preview-error\">\n <p>Preview error: {error}</p>\n </div>\n )\n }\n\n if (!page) {\n return (\n <div className=\"sonor-cms-preview-loading\">\n <p>Loading preview...</p>\n </div>\n )\n }\n\n return (\n <div\n className={className || 'sonor-cms-page sonor-cms-preview'}\n data-cms-preview=\"true\"\n data-cms-path={page.path}\n >\n {page.sections?.map((section) => (\n <CmsSection\n key={section._id}\n section={section}\n sectionComponents={sectionComponents}\n portableTextComponents={portableTextComponents}\n />\n ))}\n </div>\n )\n}\n"]}
|
package/dist/cms/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cms/sanity-image.ts","../../src/cms/PortableTextRenderer.tsx","../../src/cms/sections/HeroSection.tsx","../../src/cms/sections/RichTextSection.tsx","../../src/cms/sections/CtaSection.tsx","../../src/cms/sections/GallerySection.tsx","../../src/cms/sections/TestimonialsSection.tsx","../../src/cms/sections/FaqSection.tsx","../../src/cms/sections/FormSection.tsx","../../src/cms/sections/CustomSection.tsx","../../src/cms/CmsSection.tsx","../../src/cms/CmsPage.tsx","../../src/cms/CmsPreview.tsx"],"names":["jsxs","jsx"],"mappings":";;;;;;;;AAaA,IAAI,QAAA,GAAsD,IAAA;AAO1D,IAAM,cAAA,GAAoC;AAAA,EACxC,SAAA,EAAW,UAAA;AAAA,EACX,OAAA,EAAS;AACX,CAAA;AAOO,SAAS,sBAAsB,MAAA,EAA2B;AAC/D,EAAA,QAAA,GAAW,gBAAgB,MAAM,CAAA;AACnC;AAEA,SAAS,UAAA,GAAa;AACpB,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,QAAA,GAAW,gBAAgB,cAAc,CAAA;AAAA,EAC3C;AACA,EAAA,OAAO,QAAA;AACT;AA6BO,SAAS,cAAA,CACd,KAAA,EACA,OAAA,GAA2B,EAAC,EACpB;AACR,EAAA,IAAI,CAAC,KAAA,EAAO,KAAA,EAAO,IAAA,EAAM,OAAO,EAAA;AAEhC,EAAA,IAAI,UAAU,UAAA,EAAW,CAAE,MAAM,KAAK,CAAA,CAAE,KAAK,QAAQ,CAAA;AAErD,EAAA,IAAI,QAAQ,KAAA,EAAO,OAAA,GAAU,OAAA,CAAQ,KAAA,CAAM,QAAQ,KAAK,CAAA;AACxD,EAAA,IAAI,QAAQ,MAAA,EAAQ,OAAA,GAAU,OAAA,CAAQ,MAAA,CAAO,QAAQ,MAAM,CAAA;AAC3D,EAAA,IAAI,QAAQ,GAAA,EAAK,OAAA,GAAU,OAAA,CAAQ,GAAA,CAAI,QAAQ,GAAG,CAAA;AAClD,EAAA,IAAI,QAAQ,OAAA,EAAS,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,QAAQ,OAAO,CAAA;AAC9D,EAAA,IAAI,QAAQ,MAAA,EAAQ,OAAA,GAAU,OAAA,CAAQ,MAAA,CAAO,QAAQ,MAAa,CAAA;AAClE,EAAA,IAAI,QAAQ,GAAA,EAAK,OAAA,GAAU,OAAA,CAAQ,GAAA,CAAI,QAAQ,GAAG,CAAA;AAClD,EAAA,IAAI,QAAQ,IAAA,EAAM,OAAA,GAAU,OAAA,CAAQ,IAAA,CAAK,QAAQ,IAAI,CAAA;AAErD,EAAA,OAAO,QAAQ,GAAA,EAAI;AACrB;AASO,SAAS,iBAAA,CACd,KAAA,EACA,MAAA,GAAmB,CAAC,GAAA,EAAK,GAAA,EAAK,IAAA,EAAM,IAAI,CAAA,EACxC,OAAA,GAA0C,EAAC,EACnC;AACR,EAAA,IAAI,CAAC,KAAA,EAAO,KAAA,EAAO,IAAA,EAAM,OAAO,EAAA;AAChC,EAAA,OAAO,OACJ,GAAA,CAAI,CAAC,MAAM,CAAA,EAAG,cAAA,CAAe,OAAO,EAAE,GAAG,SAAS,KAAA,EAAO,CAAA,EAAG,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,CAAG,CAAA,CACrE,KAAK,IAAI,CAAA;AACd;AAMO,SAAS,wBACd,KAAA,EACoB;AACpB,EAAA,IAAI,CAAC,KAAA,EAAO,OAAA,EAAS,OAAO,MAAA;AAC5B,EAAA,OAAO,CAAA,EAAA,CAAI,KAAA,CAAM,OAAA,CAAQ,CAAA,GAAI,KAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA,EAAA,CAAM,MAAM,OAAA,CAAQ,CAAA,GAAI,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AACrF;ACzGA,IAAM,iBAAA,GAA4C;AAAA,EAChD,KAAA,EAAO;AAAA,IACL,EAAA,EAAI,CAAC,EAAE,QAAA,uBACL,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,cAAA,EAAgB,QAAA,EAAS,CAAA;AAAA,IAEzC,EAAA,EAAI,CAAC,EAAE,QAAA,uBACL,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,cAAA,EAAgB,QAAA,EAAS,CAAA;AAAA,IAEzC,EAAA,EAAI,CAAC,EAAE,QAAA,uBACL,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,cAAA,EAAgB,QAAA,EAAS,CAAA;AAAA,IAEzC,EAAA,EAAI,CAAC,EAAE,QAAA,uBACL,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,cAAA,EAAgB,QAAA,EAAS,CAAA;AAAA,IAEzC,MAAA,EAAQ,CAAC,EAAE,QAAA,uBACT,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,aAAA,EAAe,QAAA,EAAS,CAAA;AAAA,IAEvC,UAAA,EAAY,CAAC,EAAE,QAAA,uBACb,GAAA,CAAC,YAAA,EAAA,EAAW,SAAA,EAAU,sBAAA,EAAwB,QAAA,EAAS;AAAA,GAE3D;AAAA,EACA,KAAA,EAAO;AAAA,IACL,QAAQ,CAAC,EAAE,UAAS,qBAAM,GAAA,CAAC,YAAQ,QAAA,EAAS,CAAA;AAAA,IAC5C,IAAI,CAAC,EAAE,UAAS,qBAAM,GAAA,CAAC,QAAI,QAAA,EAAS,CAAA;AAAA,IACpC,IAAA,EAAM,CAAC,EAAE,QAAA,uBACP,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAA,EAAkB,QAAA,EAAS,CAAA;AAAA,IAE7C,WAAW,CAAC,EAAE,UAAS,qBAAM,GAAA,CAAC,OAAG,QAAA,EAAS,CAAA;AAAA,IAC1C,kBAAkB,CAAC,EAAE,UAAS,qBAAM,GAAA,CAAC,OAAG,QAAA,EAAS,CAAA;AAAA,IACjD,IAAA,EAAM,CAAC,EAAE,QAAA,EAAU,OAAM,KAAM;AAC7B,MAAA,MAAM,IAAA,GAAO,OAAO,IAAA,IAAQ,GAAA;AAC5B,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA;AACzC,MAAA,uBACE,GAAA;AAAA,QAAC,GAAA;AAAA,QAAA;AAAA,UACC,IAAA;AAAA,UACA,SAAA,EAAU,gBAAA;AAAA,UACT,GAAI,aACD,EAAE,MAAA,EAAQ,UAAU,GAAA,EAAK,qBAAA,KACzB,EAAC;AAAA,UAEJ;AAAA;AAAA,OACH;AAAA,IAEJ,CAAA;AAAA,IACA,SAAA,EAAW,CAAC,EAAE,QAAA,uBACZ,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qBAAA,EAAuB,QAAA,EAAS;AAAA,GAEpD;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,MAAA,EAAQ,CAAC,EAAE,QAAA,uBACT,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,cAAA,EAAgB,QAAA,EAAS,CAAA;AAAA,IAEzC,MAAA,EAAQ,CAAC,EAAE,QAAA,uBACT,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,cAAA,EAAgB,QAAA,EAAS;AAAA,GAE3C;AAAA,EACA,QAAA,EAAU;AAAA,IACR,QAAQ,CAAC,EAAE,UAAS,qBAAM,GAAA,CAAC,QAAI,QAAA,EAAS,CAAA;AAAA,IACxC,QAAQ,CAAC,EAAE,UAAS,qBAAM,GAAA,CAAC,QAAI,QAAA,EAAS;AAAA,GAC1C;AAAA,EACA,KAAA,EAAO;AAAA,IACL,KAAA,EAAO,CAAC,EAAE,KAAA,EAAM,KAAM;AACpB,MAAA,IAAI,CAAC,KAAA,EAAO,KAAA,EAAO,QAAQ,CAAC,KAAA,EAAO,KAAK,OAAO,IAAA;AAC/C,MAAA,MAAM,GAAA,GAAM,MAAM,GAAA,IAAO,cAAA,CAAe,OAAO,EAAE,KAAA,EAAO,MAAM,CAAA;AAC9D,MAAA,MAAM,MAAA,GAAS,CAAC,KAAA,CAAM,GAAA,GAAM,iBAAA,CAAkB,KAAA,EAAO,CAAC,GAAA,EAAK,GAAA,EAAK,IAAA,EAAM,IAAI,CAAC,CAAA,GAAI,MAAA;AAC/E,MAAA,MAAM,cAAA,GAAiB,wBAAwB,KAAK,CAAA;AACpD,MAAA,uBACE,IAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,kBAAA,EAChB,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,GAAA;AAAA,YACA,MAAA;AAAA,YACA,KAAA,EAAM,4DAAA;AAAA,YACN,GAAA,EAAK,MAAM,GAAA,IAAO,EAAA;AAAA,YAClB,SAAA,EAAU,eAAA;AAAA,YACV,OAAA,EAAQ,MAAA;AAAA,YACR,KAAA,EAAO,cAAA,GAAiB,EAAE,cAAA,EAAe,GAAI;AAAA;AAAA,SAC/C;AAAA,QACC,KAAA,CAAM,OAAA,oBACL,GAAA,CAAC,YAAA,EAAA,EAAW,SAAA,EAAU,sBAAA,EACnB,QAAA,EAAA,OAAO,KAAA,CAAM,OAAA,KAAY,QAAA,GACtB,KAAA,CAAM,OAAA,GACN,IAAA,EACN;AAAA,OAAA,EAEJ,CAAA;AAAA,IAEJ;AAAA;AAEJ,CAAA;AAUO,SAAS,oBAAA,CAAqB;AAAA,EACnC,KAAA;AAAA,EACA,UAAA,EAAY,SAAA;AAAA,EACZ;AACF,CAAA,EAA8B;AAC5B,EAAA,IAAI,CAAC,KAAA,IAAS,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,IAAK,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAElE,EAAA,MAAM,SAAiC,SAAA,GACnC;AAAA,IACE,GAAG,iBAAA;AAAA,IACH,OAAO,EAAE,GAAI,kBAAkB,KAAA,EAAkB,GAAI,UAAkB,KAAA,EAAM;AAAA,IAC7E,OAAO,EAAE,GAAI,kBAAkB,KAAA,EAAkB,GAAI,UAAkB,KAAA,EAAM;AAAA,IAC7E,OAAO,EAAE,GAAI,kBAAkB,KAAA,EAAkB,GAAI,UAAkB,KAAA,EAAM;AAAA,IAC7E,MAAM,EAAE,GAAI,kBAAkB,IAAA,EAAiB,GAAI,UAAkB,IAAA,EAAK;AAAA,IAC1E,UAAU,EAAE,GAAI,kBAAkB,QAAA,EAAqB,GAAI,UAAkB,QAAA;AAAS,GACxF,GACA,iBAAA;AAEJ,EAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,SAAA,IAAa,mBAAA,EAC3B,8BAAC,YAAA,EAAA,EAAa,KAAA,EAAqB,UAAA,EAAY,MAAA,EAAQ,CAAA,EACzD,CAAA;AAEJ;AC7HO,SAAS,WAAA,CAAY,EAAE,IAAA,EAAM,sBAAA,EAAuB,EAAyB;AAClF,EAAA,MAAM,WAAW,IAAA,CAAK,QAAA;AACtB,EAAA,MAAM,cAAc,IAAA,CAAK,WAAA;AACzB,EAAA,MAAM,UAAU,IAAA,CAAK,OAAA;AACrB,EAAA,MAAM,UAAU,IAAA,CAAK,OAAA;AACrB,EAAA,MAAM,UAAU,IAAA,CAAK,eAAA;AACrB,EAAA,MAAM,KAAA,GAAQ,eAAe,OAAA,EAAS,EAAE,OAAO,IAAA,EAAM,OAAA,EAAS,IAAI,CAAA;AAClE,EAAA,MAAM,UAAA,GAAa,uBAAA,CAAwB,OAAO,CAAA,IAAK,SAAA;AAEvD,EAAA,uBACEA,IAAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,gBAAA;AAAA,MACV,KAAA,EACE,KAAA,GACI,EAAE,eAAA,EAAiB,CAAA,IAAA,EAAO,KAAK,CAAA,CAAA,CAAA,EAAK,kBAAA,EAAoB,UAAA,EAAY,cAAA,EAAgB,OAAA,EAAQ,GAC5F,MAAA;AAAA,MAGL,QAAA,EAAA;AAAA,QAAA,QAAA,oBACCC,IAAC,oBAAA,EAAA,EAAqB,KAAA,EAAO,UAAU,UAAA,EAAY,sBAAA,EAAwB,WAAU,yBAAA,EAA0B,CAAA;AAAA,QAEhH,WAAA,oBACCA,GAAAA,CAAC,oBAAA,EAAA,EAAqB,OAAO,WAAA,EAAa,UAAA,EAAY,sBAAA,EAAwB,SAAA,EAAU,4BAAA,EAA6B,CAAA;AAAA,QAEtH,OAAA,IAAW,2BACVA,GAAAA,CAAC,OAAE,IAAA,EAAM,OAAA,EAAS,SAAA,EAAU,oBAAA,EACzB,QAAA,EAAA,OAAA,EACH;AAAA;AAAA;AAAA,GAEJ;AAEJ;AChCO,SAAS,eAAA,CAAgB,EAAE,IAAA,EAAM,sBAAA,EAAuB,EAAyB;AACtF,EAAA,MAAM,UAAU,IAAA,CAAK,OAAA;AACrB,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AAErB,EAAA,uBACEA,GAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,oBAAA,EACjB,QAAA,kBAAAA,GAAAA,CAAC,oBAAA,EAAA,EAAqB,KAAA,EAAO,OAAA,EAAS,UAAA,EAAY,sBAAA,EAAwB,CAAA,EAC5E,CAAA;AAEJ;ACTO,SAAS,UAAA,CAAW,EAAE,IAAA,EAAM,sBAAA,EAAuB,EAAyB;AACjF,EAAA,MAAM,WAAW,IAAA,CAAK,QAAA;AACtB,EAAA,MAAM,cAAc,IAAA,CAAK,WAAA;AACzB,EAAA,MAAM,aAAa,IAAA,CAAK,UAAA;AACxB,EAAA,MAAM,aAAa,IAAA,CAAK,UAAA;AAExB,EAAA,uBACED,IAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,eAAA,EAChB,QAAA,EAAA;AAAA,IAAA,QAAA,oBACCC,IAAC,oBAAA,EAAA,EAAqB,KAAA,EAAO,UAAU,UAAA,EAAY,sBAAA,EAAwB,WAAU,wBAAA,EAAyB,CAAA;AAAA,IAE/G,WAAA,oBACCA,GAAAA,CAAC,oBAAA,EAAA,EAAqB,OAAO,WAAA,EAAa,UAAA,EAAY,sBAAA,EAAwB,SAAA,EAAU,2BAAA,EAA4B,CAAA;AAAA,IAErH,UAAA,IAAc,8BACbA,GAAAA,CAAC,OAAE,IAAA,EAAM,UAAA,EAAY,SAAA,EAAU,sBAAA,EAC5B,QAAA,EAAA,UAAA,EACH;AAAA,GAAA,EAEJ,CAAA;AAEJ;ACpBO,SAAS,cAAA,CAAe,EAAE,IAAA,EAAM,sBAAA,EAAuB,EAAyB;AACrF,EAAA,MAAM,MAAA,GAAU,IAAA,CAAK,MAAA,IAAU,EAAC;AAChC,EAAA,MAAM,MAAA,GAAU,KAAK,MAAA,IAAU,MAAA;AAC/B,EAAA,MAAM,UAAU,IAAA,CAAK,OAAA;AAErB,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAEhC,EAAA,uBACED,IAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,mBAAA,EACjB,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,kBAAA,EAAqB,MAAM,IACxC,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAC,GAAA,EAAK,CAAA,KAAM;AACtB,MAAA,MAAM,cAAA,GAAiB,wBAAwB,GAAG,CAAA;AAClD,MAAA,uBACEA,GAAAA,CAAC,QAAA,EAAA,EAAkC,SAAA,EAAU,0BAC3C,QAAA,kBAAAA,GAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,KAAK,cAAA,CAAe,GAAA,EAAK,EAAE,KAAA,EAAO,KAAK,CAAA;AAAA,UACvC,QAAQ,iBAAA,CAAkB,GAAA,EAAK,CAAC,GAAA,EAAK,GAAA,EAAK,IAAI,CAAC,CAAA;AAAA,UAC/C,KAAA,EAAM,0DAAA;AAAA,UACN,GAAA,EAAK,IAAI,GAAA,IAAO,EAAA;AAAA,UAChB,OAAA,EAAQ,MAAA;AAAA,UACR,KAAA,EAAO,cAAA,GAAiB,EAAE,cAAA,EAAe,GAAI;AAAA;AAAA,OAC/C,EAAA,EARW,GAAA,CAAI,KAAA,EAAO,IAAA,IAAQ,CAShC,CAAA;AAAA,IAEJ,CAAC,CAAA,EACH,CAAA;AAAA,IACC,OAAA,oBACCA,GAAAA,CAAC,oBAAA,EAAA,EAAqB,OAAO,OAAA,EAAS,UAAA,EAAY,sBAAA,EAAwB,SAAA,EAAU,2BAAA,EAA4B;AAAA,GAAA,EAEpH,CAAA;AAEJ;ACxBO,SAAS,mBAAA,CAAoB,EAAE,IAAA,EAAM,sBAAA,EAAuB,EAAyB;AAC1F,EAAA,MAAM,KAAA,GAAS,IAAA,CAAK,KAAA,IAAS,EAAC;AAC9B,EAAA,MAAM,MAAA,GAAU,KAAK,MAAA,IAAU,MAAA;AAE/B,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAE/B,EAAA,uBACEA,GAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAW,CAAA,8CAAA,EAAiD,MAAM,CAAA,CAAA,EACxE,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,MAAM,CAAA,qBAChBD,IAAAA,CAAC,YAAA,EAAA,EAAmB,WAAU,uBAAA,EAC5B,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,wBAAqB,KAAA,EAAO,IAAA,CAAK,OAAO,UAAA,EAAY,sBAAA,EAAwB,WAAU,6BAAA,EAA8B,CAAA;AAAA,oBACrHD,IAAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,8BAAA,EACf,QAAA,EAAA;AAAA,MAAA,IAAA,CAAK,MAAA,EAAQ,KAAA,EAAO,IAAA,oBACnBC,GAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,cAAA,CAAe,IAAA,CAAK,MAAA,EAAQ,EAAE,KAAA,EAAO,EAAA,EAAI,MAAA,EAAQ,EAAA,EAAI,GAAA,EAAK,MAAA,EAAQ,CAAA;AAAA,UACvE,GAAA,EAAK,IAAA,CAAK,MAAA,CAAO,GAAA,IAAO,IAAA,CAAK,MAAA;AAAA,UAC7B,SAAA,EAAU,8BAAA;AAAA,UACV,KAAA,EAAO,EAAA;AAAA,UACP,MAAA,EAAQ,EAAA;AAAA,UACR,OAAA,EAAQ;AAAA;AAAA,OACV;AAAA,sBAEFD,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8BAAA,EACb,QAAA,EAAA;AAAA,QAAA,IAAA,CAAK,MAAA;AAAA,QACL,KAAK,IAAA,oBACJA,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,4BAAA,EAA6B,QAAA,EAAA;AAAA,UAAA,IAAA;AAAA,UAAG,IAAA,CAAK;AAAA,SAAA,EAAK;AAAA,OAAA,EAE9D;AAAA,KAAA,EACF;AAAA,GAAA,EAAA,EAnBe,CAoBjB,CACD,CAAA,EACH,CAAA;AAEJ;ACpCO,SAAS,UAAA,CAAW,EAAE,IAAA,EAAM,sBAAA,EAAuB,EAAyB;AACjF,EAAA,MAAM,KAAA,GAAS,IAAA,CAAK,KAAA,IAAS,EAAC;AAE9B,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAE/B,EAAA,uBACEC,GAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,iBAChB,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,CAAA,qBAChBD,IAAAA,CAAC,SAAA,EAAA,EAAgB,WAAU,oBAAA,EACzB,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,wBAAA,EAA0B,eAAK,QAAA,EAAS,CAAA;AAAA,oBAC3DA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EACb,QAAA,kBAAAA,GAAAA,CAAC,oBAAA,EAAA,EAAqB,KAAA,EAAO,IAAA,CAAK,MAAA,EAAQ,UAAA,EAAY,wBAAwB,CAAA,EAChF;AAAA,GAAA,EAAA,EAJY,CAKd,CACD,CAAA,EACH,CAAA;AAEJ;ACjBO,SAAS,WAAA,CAAY,EAAE,IAAA,EAAM,sBAAA,EAAuB,EAAyB;AAClF,EAAA,MAAM,WAAW,IAAA,CAAK,QAAA;AACtB,EAAA,MAAM,UAAU,IAAA,CAAK,OAAA;AAErB,EAAA,uBACED,IAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,gBAAA,EAChB,QAAA,EAAA;AAAA,IAAA,OAAA,oBACCC,IAAC,oBAAA,EAAA,EAAqB,KAAA,EAAO,SAAS,UAAA,EAAY,sBAAA,EAAwB,WAAU,wBAAA,EAAyB,CAAA;AAAA,IAE9G,2BACCA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,sBAAA;AAAA,QACV,gBAAA,EAAgB;AAAA;AAAA,wBAKlBA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,8BAA6B,QAAA,EAAA,qBAAA,EAAmB;AAAA,GAAA,EAEjE,CAAA;AAEJ;ACvBO,SAAS,aAAA,CAAc,EAAE,IAAA,EAAM,WAAA,EAAY,EAAyB;AACzE,EAAA,MAAM,gBAAgB,IAAA,CAAK,aAAA;AAC3B,EAAe,IAAA,CAAK,KAAA,IAAS;AAE7B,EAAA,uBACEA,GAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,kBAAA,EAAmB,gBAAA,EAAgB,aAAA,EACpD,QAAA,kBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAAA,EAA+B,QAAA,EAAA;AAAA,IAAA,oBAAA;AAAA,IACzB,aAAA,IAAiB;AAAA,GAAA,EAEtC,CAAA,EACF,CAAA;AAEJ;ACNA,IAAM,gBAAA,GAAmF;AAAA,EACvF,IAAA,EAAM,WAAA;AAAA,EACN,QAAA,EAAU,eAAA;AAAA,EACV,GAAA,EAAK,UAAA;AAAA,EACL,OAAA,EAAS,cAAA;AAAA,EACT,YAAA,EAAc,mBAAA;AAAA,EACd,GAAA,EAAK,UAAA;AAAA,EACL,IAAA,EAAM,WAAA;AAAA,EACN,MAAA,EAAQ;AACV,CAAA;AAMO,SAAS,UAAA,CAAW,EAAE,OAAA,EAAS,iBAAA,EAAmB,wBAAuB,EAAoB;AAClG,EAAA,MAAM,WACJ,iBAAA,GAAoB,OAAA,CAAQ,WAAW,CAAA,IACvC,gBAAA,CAAiB,QAAQ,WAAW,CAAA;AAEtC,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,QAAA,KAAa,aAAA,EAAe;AAC1C,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,6CAAA,EAAgD,OAAA,CAAQ,WAAW,CAAA,CAAE,CAAA;AAAA,IACpF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,uBACEC,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,CAAA,oCAAA,EAAuC,OAAA,CAAQ,WAAW,CAAA,CAAA;AAAA,MACrE,mBAAiB,OAAA,CAAQ,GAAA;AAAA,MACzB,qBAAmB,OAAA,CAAQ,WAAA;AAAA,MAE3B,QAAA,kBAAAA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,MAAM,OAAA,CAAQ,IAAA;AAAA,UACd,aAAa,OAAA,CAAQ,WAAA;AAAA,UACrB,aAAa,OAAA,CAAQ,WAAA;AAAA,UACrB;AAAA;AAAA;AACF;AAAA,GACF;AAEJ;ACpCA,eAAsB,OAAA,CAAQ;AAAA,EAC5B,IAAA;AAAA,EACA,iBAAA;AAAA,EACA,sBAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAAqD;AACnD,EAAA,MAAM,IAAA,GAAO,MAAM,UAAA,CAAW,IAAI,CAAA;AAElC,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,IAAI,QAAA,EAAU,uBAAOA,GAAAA,CAAA,YAAG,QAAA,EAAA,QAAA,EAAS,CAAA;AACjC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,QAAA,CAAS,WAAW,CAAA,EAAG;AAChD,IAAA,IAAI,QAAA,EAAU,uBAAOA,GAAAA,CAAA,YAAG,QAAA,EAAA,QAAA,EAAS,CAAA;AACjC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,uBACEA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAW,SAAA,IAAa,gBAAA;AAAA,MACxB,oBAAkB,IAAA,CAAK,GAAA;AAAA,MACvB,iBAAe,IAAA,CAAK,IAAA;AAAA,MAEnB,QAAA,EAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,CAAC,4BAClBA,GAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UAEC,OAAA;AAAA,UACA,iBAAA;AAAA,UACA;AAAA,SAAA;AAAA,QAHK,OAAA,CAAQ;AAAA,OAKhB;AAAA;AAAA,GACH;AAEJ;ACdO,SAAS,UAAA,CAAW;AAAA,EACzB,MAAA,GAAS,OAAA,CAAQ,GAAA,CAAI,aAAA,IAAiB,sBAAA;AAAA,EACtC,MAAA;AAAA,EACA,IAAA;AAAA,EACA,YAAA,GAAe,GAAA;AAAA,EACf,iBAAA;AAAA,EACA,sBAAA;AAAA,EACA;AACF,CAAA,EAAoB;AAClB,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAA6B,IAAI,CAAA;AACzD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAwB,IAAI,CAAA;AAEtD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,SAAA,GAAY,KAAA;AAEhB,IAAA,eAAe,SAAA,GAAY;AACzB,MAAA,IAAI;AACF,QAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,CAAA,EAAG,MAAM,CAAA,oBAAA,CAAA,EAAwB;AAAA,UACvD,MAAA,EAAQ,MAAA;AAAA,UACR,OAAA,EAAS;AAAA,YACP,cAAA,EAAgB,kBAAA;AAAA,YAChB,WAAA,EAAa;AAAA,WACf;AAAA,UACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,MAAM;AAAA,SAC9B,CAAA;AAED,QAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,UAAA,QAAA,CAAS,CAAA,MAAA,EAAS,GAAA,CAAI,MAAM,CAAA,CAAE,CAAA;AAC9B,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,QAAA,IAAI,CAAC,SAAA,IAAa,IAAA,EAAM,KAAA,IAAS,KAAK,IAAA,EAAM;AAC1C,UAAA,OAAA,CAAQ,KAAK,IAAI,CAAA;AACjB,UAAA,QAAA,CAAS,IAAI,CAAA;AAAA,QACf;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,QAAA,CAAS,wBAAwB,CAAA;AAAA,QACnC;AAAA,MACF;AAAA,IACF;AAEA,IAAA,SAAA,EAAU;AAEV,IAAA,IAAI,eAAe,CAAA,EAAG;AACpB,MAAA,MAAM,QAAA,GAAW,WAAA,CAAY,SAAA,EAAW,YAAY,CAAA;AACpD,MAAA,OAAO,MAAM;AACX,QAAA,SAAA,GAAY,IAAA;AACZ,QAAA,aAAA,CAAc,QAAQ,CAAA;AAAA,MACxB,CAAA;AAAA,IACF;AAEA,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AAAA,IACd,CAAA;AAAA,EACF,GAAG,CAAC,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,YAAY,CAAC,CAAA;AAEvC,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yBAAA,EACb,QAAA,kBAAAD,KAAC,GAAA,EAAA,EAAE,QAAA,EAAA;AAAA,MAAA,iBAAA;AAAA,MAAgB;AAAA,KAAA,EAAM,CAAA,EAC3B,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,uBACEC,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BACb,QAAA,kBAAAA,GAAAA,CAAC,GAAA,EAAA,EAAE,QAAA,EAAA,oBAAA,EAAkB,CAAA,EACvB,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACEA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAW,SAAA,IAAa,kCAAA;AAAA,MACxB,kBAAA,EAAiB,MAAA;AAAA,MACjB,iBAAe,IAAA,CAAK,IAAA;AAAA,MAEnB,QAAA,EAAA,IAAA,CAAK,QAAA,EAAU,GAAA,CAAI,CAAC,4BACnBA,GAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UAEC,OAAA;AAAA,UACA,iBAAA;AAAA,UACA;AAAA,SAAA;AAAA,QAHK,OAAA,CAAQ;AAAA,OAKhB;AAAA;AAAA,GACH;AAEJ","file":"index.mjs","sourcesContent":["/**\n * Sanity Image URL Builder\n *\n * Wraps @sanity/image-url to produce optimised, hotspot-aware URLs\n * from SanityImageRef objects stored in CMS content.\n */\nimport imageUrlBuilder from '@sanity/image-url'\nimport type { SanityImageRef } from './types'\n\n// ---------------------------------------------------------------------------\n// Singleton builder (configured once per runtime)\n// ---------------------------------------------------------------------------\n\nlet _builder: ReturnType<typeof imageUrlBuilder> | null = null\n\nexport interface SanityImageConfig {\n projectId: string\n dataset: string\n}\n\nconst DEFAULT_CONFIG: SanityImageConfig = {\n projectId: 'l55lyemx',\n dataset: 'production',\n}\n\n/**\n * Initialise (or re-initialise) the image builder with project config.\n * Call once at app startup — e.g. in SiteKitProvider or layout.\n * If never called, falls back to DEFAULT_CONFIG.\n */\nexport function configureSanityImages(config: SanityImageConfig) {\n _builder = imageUrlBuilder(config)\n}\n\nfunction getBuilder() {\n if (!_builder) {\n _builder = imageUrlBuilder(DEFAULT_CONFIG)\n }\n return _builder\n}\n\n// ---------------------------------------------------------------------------\n// URL helpers\n// ---------------------------------------------------------------------------\n\nexport interface ImageUrlOptions {\n width?: number\n height?: number\n /** Device-pixel-ratio multiplier (default 1) */\n dpr?: number\n /** Quality 0-100 (default: Sanity auto) */\n quality?: number\n /** Force a specific format */\n format?: 'webp' | 'avif' | 'png' | 'jpg'\n /** Fit mode */\n fit?: 'clip' | 'crop' | 'fill' | 'fillmax' | 'max' | 'scale' | 'min'\n /** Apply blur (0-2000) */\n blur?: number\n}\n\n/**\n * Build an optimised image URL from a SanityImageRef.\n * Automatically applies hotspot/crop metadata when present.\n *\n * ```ts\n * const url = sanityImageUrl(heroImage, { width: 1200 })\n * ```\n */\nexport function sanityImageUrl(\n image: SanityImageRef | undefined | null,\n options: ImageUrlOptions = {},\n): string {\n if (!image?.asset?._ref) return ''\n\n let builder = getBuilder().image(image).auto('format')\n\n if (options.width) builder = builder.width(options.width)\n if (options.height) builder = builder.height(options.height)\n if (options.dpr) builder = builder.dpr(options.dpr)\n if (options.quality) builder = builder.quality(options.quality)\n if (options.format) builder = builder.format(options.format as any)\n if (options.fit) builder = builder.fit(options.fit)\n if (options.blur) builder = builder.blur(options.blur)\n\n return builder.url()\n}\n\n/**\n * Generate a srcSet string for responsive images.\n *\n * ```tsx\n * <img srcSet={sanityImageSrcSet(img, [400, 800, 1200])} sizes=\"100vw\" />\n * ```\n */\nexport function sanityImageSrcSet(\n image: SanityImageRef | undefined | null,\n widths: number[] = [400, 800, 1200, 1600],\n options: Omit<ImageUrlOptions, 'width'> = {},\n): string {\n if (!image?.asset?._ref) return ''\n return widths\n .map((w) => `${sanityImageUrl(image, { ...options, width: w })} ${w}w`)\n .join(', ')\n}\n\n/**\n * Compute CSS `object-position` from a Sanity hotspot.\n * Returns `undefined` if no hotspot is defined.\n */\nexport function hotspotToObjectPosition(\n image: SanityImageRef | undefined | null,\n): string | undefined {\n if (!image?.hotspot) return undefined\n return `${(image.hotspot.x * 100).toFixed(1)}% ${(image.hotspot.y * 100).toFixed(1)}%`\n}\n","import React from 'react'\nimport { PortableText, type PortableTextComponents } from '@portabletext/react'\nimport type { PortableTextRendererProps, PortableTextContent } from './types'\nimport { sanityImageUrl, sanityImageSrcSet, hotspotToObjectPosition } from './sanity-image'\n\n// ---------------------------------------------------------------------------\n// Default Component Map\n// ---------------------------------------------------------------------------\n\nconst defaultComponents: PortableTextComponents = {\n block: {\n h1: ({ children }) => (\n <h1 className=\"sonor-cms-h1\">{children}</h1>\n ),\n h2: ({ children }) => (\n <h2 className=\"sonor-cms-h2\">{children}</h2>\n ),\n h3: ({ children }) => (\n <h3 className=\"sonor-cms-h3\">{children}</h3>\n ),\n h4: ({ children }) => (\n <h4 className=\"sonor-cms-h4\">{children}</h4>\n ),\n normal: ({ children }) => (\n <p className=\"sonor-cms-p\">{children}</p>\n ),\n blockquote: ({ children }) => (\n <blockquote className=\"sonor-cms-blockquote\">{children}</blockquote>\n ),\n },\n marks: {\n strong: ({ children }) => <strong>{children}</strong>,\n em: ({ children }) => <em>{children}</em>,\n code: ({ children }) => (\n <code className=\"sonor-cms-code\">{children}</code>\n ),\n underline: ({ children }) => <u>{children}</u>,\n 'strike-through': ({ children }) => <s>{children}</s>,\n link: ({ children, value }) => {\n const href = value?.href || '#'\n const isExternal = href.startsWith('http')\n return (\n <a\n href={href}\n className=\"sonor-cms-link\"\n {...(isExternal\n ? { target: '_blank', rel: 'noopener noreferrer' }\n : {})}\n >\n {children}\n </a>\n )\n },\n highlight: ({ children }) => (\n <mark className=\"sonor-cms-highlight\">{children}</mark>\n ),\n },\n list: {\n bullet: ({ children }) => (\n <ul className=\"sonor-cms-ul\">{children}</ul>\n ),\n number: ({ children }) => (\n <ol className=\"sonor-cms-ol\">{children}</ol>\n ),\n },\n listItem: {\n bullet: ({ children }) => <li>{children}</li>,\n number: ({ children }) => <li>{children}</li>,\n },\n types: {\n image: ({ value }) => {\n if (!value?.asset?._ref && !value?.url) return null\n const src = value.url || sanityImageUrl(value, { width: 1200 })\n const srcSet = !value.url ? sanityImageSrcSet(value, [400, 800, 1200, 1600]) : undefined\n const objectPosition = hotspotToObjectPosition(value)\n return (\n <figure className=\"sonor-cms-figure\">\n <img\n src={src}\n srcSet={srcSet}\n sizes=\"(max-width: 768px) 100vw, (max-width: 1200px) 80vw, 1200px\"\n alt={value.alt || ''}\n className=\"sonor-cms-img\"\n loading=\"lazy\"\n style={objectPosition ? { objectPosition } : undefined}\n />\n {value.caption && (\n <figcaption className=\"sonor-cms-figcaption\">\n {typeof value.caption === 'string'\n ? value.caption\n : null}\n </figcaption>\n )}\n </figure>\n )\n },\n },\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\n/**\n * Renders Portable Text content with Sonor default styling.\n * Accepts `components` prop to override or extend defaults.\n */\nexport function PortableTextRenderer({\n value,\n components: overrides,\n className,\n}: PortableTextRendererProps) {\n if (!value || !Array.isArray(value) || value.length === 0) return null\n\n const merged: PortableTextComponents = overrides\n ? {\n ...defaultComponents,\n block: { ...(defaultComponents.block as object), ...(overrides as any).block },\n marks: { ...(defaultComponents.marks as object), ...(overrides as any).marks },\n types: { ...(defaultComponents.types as object), ...(overrides as any).types },\n list: { ...(defaultComponents.list as object), ...(overrides as any).list },\n listItem: { ...(defaultComponents.listItem as object), ...(overrides as any).listItem },\n }\n : defaultComponents\n\n return (\n <div className={className || 'sonor-cms-content'}>\n <PortableText value={value as any} components={merged} />\n </div>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport { sanityImageUrl, hotspotToObjectPosition } from '../sanity-image'\nimport type { SectionRendererProps, PortableTextContent, SanityImageRef } from '../types'\n\nexport function HeroSection({ data, portableTextComponents }: SectionRendererProps) {\n const headline = data.headline as PortableTextContent | undefined\n const subheadline = data.subheadline as PortableTextContent | undefined\n const ctaText = data.ctaText as string | undefined\n const ctaLink = data.ctaLink as string | undefined\n const bgImage = data.backgroundImage as SanityImageRef | undefined\n const bgUrl = sanityImageUrl(bgImage, { width: 1920, quality: 80 })\n const bgPosition = hotspotToObjectPosition(bgImage) || '50% 50%'\n\n return (\n <section\n className=\"sonor-cms-hero\"\n style={\n bgUrl\n ? { backgroundImage: `url(${bgUrl})`, backgroundPosition: bgPosition, backgroundSize: 'cover' }\n : undefined\n }\n >\n {headline && (\n <PortableTextRenderer value={headline} components={portableTextComponents} className=\"sonor-cms-hero-headline\" />\n )}\n {subheadline && (\n <PortableTextRenderer value={subheadline} components={portableTextComponents} className=\"sonor-cms-hero-subheadline\" />\n )}\n {ctaText && ctaLink && (\n <a href={ctaLink} className=\"sonor-cms-hero-cta\">\n {ctaText}\n </a>\n )}\n </section>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport type { SectionRendererProps, PortableTextContent } from '../types'\n\nexport function RichTextSection({ data, portableTextComponents }: SectionRendererProps) {\n const content = data.content as PortableTextContent | undefined\n if (!content) return null\n\n return (\n <section className=\"sonor-cms-richtext\">\n <PortableTextRenderer value={content} components={portableTextComponents} />\n </section>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport type { SectionRendererProps, PortableTextContent } from '../types'\n\nexport function CtaSection({ data, portableTextComponents }: SectionRendererProps) {\n const headline = data.headline as PortableTextContent | undefined\n const description = data.description as PortableTextContent | undefined\n const buttonText = data.buttonText as string | undefined\n const buttonLink = data.buttonLink as string | undefined\n\n return (\n <section className=\"sonor-cms-cta\">\n {headline && (\n <PortableTextRenderer value={headline} components={portableTextComponents} className=\"sonor-cms-cta-headline\" />\n )}\n {description && (\n <PortableTextRenderer value={description} components={portableTextComponents} className=\"sonor-cms-cta-description\" />\n )}\n {buttonText && buttonLink && (\n <a href={buttonLink} className=\"sonor-cms-cta-button\">\n {buttonText}\n </a>\n )}\n </section>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport { sanityImageUrl, sanityImageSrcSet, hotspotToObjectPosition } from '../sanity-image'\nimport type { SectionRendererProps, PortableTextContent, SanityImageRef } from '../types'\n\nexport function GallerySection({ data, portableTextComponents }: SectionRendererProps) {\n const images = (data.images || []) as SanityImageRef[]\n const layout = (data.layout || 'grid') as string\n const caption = data.caption as PortableTextContent | undefined\n\n if (images.length === 0) return null\n\n return (\n <section className=\"sonor-cms-gallery\">\n <div className={`sonor-cms-gallery-${layout}`}>\n {images.map((img, i) => {\n const objectPosition = hotspotToObjectPosition(img)\n return (\n <figure key={img.asset?._ref || i} className=\"sonor-cms-gallery-item\">\n <img\n src={sanityImageUrl(img, { width: 800 })}\n srcSet={sanityImageSrcSet(img, [400, 800, 1200])}\n sizes=\"(max-width: 640px) 100vw, (max-width: 1024px) 50vw, 33vw\"\n alt={img.alt || ''}\n loading=\"lazy\"\n style={objectPosition ? { objectPosition } : undefined}\n />\n </figure>\n )\n })}\n </div>\n {caption && (\n <PortableTextRenderer value={caption} components={portableTextComponents} className=\"sonor-cms-gallery-caption\" />\n )}\n </section>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport { sanityImageUrl } from '../sanity-image'\nimport type { SectionRendererProps, PortableTextContent, SanityImageRef } from '../types'\n\ninterface TestimonialItem {\n quote: PortableTextContent\n author: string\n role?: string\n avatar?: SanityImageRef\n}\n\nexport function TestimonialsSection({ data, portableTextComponents }: SectionRendererProps) {\n const items = (data.items || []) as TestimonialItem[]\n const layout = (data.layout || 'grid') as string\n\n if (items.length === 0) return null\n\n return (\n <section className={`sonor-cms-testimonials sonor-cms-testimonials-${layout}`}>\n {items.map((item, i) => (\n <blockquote key={i} className=\"sonor-cms-testimonial\">\n <PortableTextRenderer value={item.quote} components={portableTextComponents} className=\"sonor-cms-testimonial-quote\" />\n <footer className=\"sonor-cms-testimonial-footer\">\n {item.avatar?.asset?._ref && (\n <img\n src={sanityImageUrl(item.avatar, { width: 80, height: 80, fit: 'crop' })}\n alt={item.avatar.alt || item.author}\n className=\"sonor-cms-testimonial-avatar\"\n width={80}\n height={80}\n loading=\"lazy\"\n />\n )}\n <cite className=\"sonor-cms-testimonial-author\">\n {item.author}\n {item.role && (\n <span className=\"sonor-cms-testimonial-role\">, {item.role}</span>\n )}\n </cite>\n </footer>\n </blockquote>\n ))}\n </section>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport type { SectionRendererProps, PortableTextContent } from '../types'\n\ninterface FaqItem {\n question: string\n answer: PortableTextContent\n}\n\nexport function FaqSection({ data, portableTextComponents }: SectionRendererProps) {\n const items = (data.items || []) as FaqItem[]\n\n if (items.length === 0) return null\n\n return (\n <section className=\"sonor-cms-faq\">\n {items.map((item, i) => (\n <details key={i} className=\"sonor-cms-faq-item\">\n <summary className=\"sonor-cms-faq-question\">{item.question}</summary>\n <div className=\"sonor-cms-faq-answer\">\n <PortableTextRenderer value={item.answer} components={portableTextComponents} />\n </div>\n </details>\n ))}\n </section>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport type { SectionRendererProps, PortableTextContent } from '../types'\n\n/**\n * Form section — renders a heading and a placeholder for the managed form.\n * The actual form rendering depends on ManagedForm from the forms module.\n * Sites should override this section renderer to integrate with their form setup.\n */\nexport function FormSection({ data, portableTextComponents }: SectionRendererProps) {\n const formSlug = data.formSlug as string | undefined\n const heading = data.heading as PortableTextContent | undefined\n\n return (\n <section className=\"sonor-cms-form\">\n {heading && (\n <PortableTextRenderer value={heading} components={portableTextComponents} className=\"sonor-cms-form-heading\" />\n )}\n {formSlug ? (\n <div\n className=\"sonor-cms-form-embed\"\n data-form-slug={formSlug}\n >\n {/* Override FormSection renderer to integrate ManagedForm */}\n </div>\n ) : (\n <p className=\"sonor-cms-form-placeholder\">Form not configured</p>\n )}\n </section>\n )\n}\n","import React from 'react'\nimport type { SectionRendererProps } from '../types'\n\n/**\n * Custom section — passes props to a named component.\n * Sites must provide their own component map via sectionComponents override.\n */\nexport function CustomSection({ data, displayName }: SectionRendererProps) {\n const componentName = data.componentName as string | undefined\n const props = (data.props || {}) as Record<string, unknown>\n\n return (\n <section className=\"sonor-cms-custom\" data-component={componentName}>\n <div className=\"sonor-cms-custom-placeholder\">\n Custom component: {componentName || displayName}\n {/* Override 'custom' in sectionComponents to render actual components */}\n </div>\n </section>\n )\n}\n","import React from 'react'\nimport type { CmsSectionProps, SectionRendererProps, SectionType } from './types'\nimport {\n HeroSection,\n RichTextSection,\n CtaSection,\n GallerySection,\n TestimonialsSection,\n FaqSection,\n FormSection,\n CustomSection,\n} from './sections'\n\nconst defaultRenderers: Record<SectionType, React.ComponentType<SectionRendererProps>> = {\n hero: HeroSection,\n richText: RichTextSection,\n cta: CtaSection,\n gallery: GallerySection,\n testimonials: TestimonialsSection,\n faq: FaqSection,\n form: FormSection,\n custom: CustomSection,\n}\n\n/**\n * Renders a single CMS section using the appropriate renderer for its type.\n * Override specific section renderers via the `sectionComponents` prop.\n */\nexport function CmsSection({ section, sectionComponents, portableTextComponents }: CmsSectionProps) {\n const Renderer =\n sectionComponents?.[section.sectionType] ||\n defaultRenderers[section.sectionType]\n\n if (!Renderer) {\n if (process.env.NODE_ENV === 'development') {\n console.warn(`@sonordev/cms: No renderer for section type: ${section.sectionType}`)\n }\n return null\n }\n\n return (\n <div\n className={`sonor-cms-section sonor-cms-section-${section.sectionType}`}\n data-section-id={section._id}\n data-section-type={section.sectionType}\n >\n <Renderer\n data={section.data}\n sectionType={section.sectionType}\n displayName={section.displayName}\n portableTextComponents={portableTextComponents}\n />\n </div>\n )\n}\n","import React from 'react'\nimport type { CmsPageProps, CmsSectionData } from './types'\nimport { getCmsPage } from './server-api'\nimport { CmsSection } from './CmsSection'\n\n/**\n * Async React Server Component that fetches and renders a full CMS page.\n *\n * @example\n * ```tsx\n * // app/[...slug]/page.tsx\n * import { CmsPage } from '@sonordev/site-kit/cms'\n *\n * export default function Page({ params }) {\n * return <CmsPage path={`/${params.slug.join('/')}`} />\n * }\n * ```\n */\nexport async function CmsPage({\n path,\n sectionComponents,\n portableTextComponents,\n fallback,\n className,\n}: CmsPageProps): Promise<React.ReactElement | null> {\n const page = await getCmsPage(path)\n\n if (!page) {\n if (fallback) return <>{fallback}</>\n return null\n }\n\n if (!page.sections || page.sections.length === 0) {\n if (fallback) return <>{fallback}</>\n return null\n }\n\n return (\n <div\n className={className || 'sonor-cms-page'}\n data-cms-page-id={page._id}\n data-cms-path={page.path}\n >\n {page.sections.map((section: CmsSectionData) => (\n <CmsSection\n key={section._id}\n section={section}\n sectionComponents={sectionComponents}\n portableTextComponents={portableTextComponents}\n />\n ))}\n </div>\n )\n}\n","'use client'\n\nimport React, { useState, useEffect } from 'react'\nimport type { CmsPageData, CmsSectionProps, SectionType, SectionRendererProps } from './types'\nimport { CmsSection } from './CmsSection'\n\ninterface CmsPreviewProps {\n /** Portal API base URL */\n apiUrl?: string\n /** API key for fetching draft content */\n apiKey: string\n /** Page path to preview */\n path: string\n /** Poll interval in ms (0 = no polling) */\n pollInterval?: number\n /** Override section renderers */\n sectionComponents?: Partial<Record<SectionType, React.ComponentType<SectionRendererProps>>>\n /** Override Portable Text components */\n portableTextComponents?: Record<string, React.ComponentType<any>>\n /** Wrapper className */\n className?: string\n}\n\n/**\n * Client component for previewing draft CMS content.\n * Fetches draft content from Portal API and re-renders on changes.\n *\n * @example\n * ```tsx\n * // Used in preview mode (e.g., ?preview=true)\n * import { CmsPreview } from '@sonordev/site-kit/cms'\n *\n * <CmsPreview\n * apiKey={process.env.SONOR_API_KEY!}\n * path=\"/about\"\n * pollInterval={3000}\n * />\n * ```\n */\nexport function CmsPreview({\n apiUrl = process.env.SONOR_API_URL || 'https://api.sonor.io',\n apiKey,\n path,\n pollInterval = 3000,\n sectionComponents,\n portableTextComponents,\n className,\n}: CmsPreviewProps) {\n const [page, setPage] = useState<CmsPageData | null>(null)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n let cancelled = false\n\n async function fetchPage() {\n try {\n const res = await fetch(`${apiUrl}/api/public/cms/page`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n },\n body: JSON.stringify({ path }),\n })\n\n if (!res.ok) {\n setError(`Error ${res.status}`)\n return\n }\n\n const data = await res.json()\n if (!cancelled && data?.found && data.page) {\n setPage(data.page)\n setError(null)\n }\n } catch (err) {\n if (!cancelled) {\n setError('Failed to load preview')\n }\n }\n }\n\n fetchPage()\n\n if (pollInterval > 0) {\n const interval = setInterval(fetchPage, pollInterval)\n return () => {\n cancelled = true\n clearInterval(interval)\n }\n }\n\n return () => {\n cancelled = true\n }\n }, [apiUrl, apiKey, path, pollInterval])\n\n if (error) {\n return (\n <div className=\"sonor-cms-preview-error\">\n <p>Preview error: {error}</p>\n </div>\n )\n }\n\n if (!page) {\n return (\n <div className=\"sonor-cms-preview-loading\">\n <p>Loading preview...</p>\n </div>\n )\n }\n\n return (\n <div\n className={className || 'sonor-cms-page sonor-cms-preview'}\n data-cms-preview=\"true\"\n data-cms-path={page.path}\n >\n {page.sections?.map((section) => (\n <CmsSection\n key={section._id}\n section={section}\n sectionComponents={sectionComponents}\n portableTextComponents={portableTextComponents}\n />\n ))}\n </div>\n )\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/cms/sanity-image.ts","../../src/cms/PortableTextRenderer.tsx","../../src/cms/sections/HeroSection.tsx","../../src/cms/sections/RichTextSection.tsx","../../src/cms/sections/CtaSection.tsx","../../src/cms/sections/GallerySection.tsx","../../src/cms/sections/TestimonialsSection.tsx","../../src/cms/sections/FaqSection.tsx","../../src/cms/sections/FormSection.tsx","../../src/cms/sections/CustomSection.tsx","../../src/cms/CmsSection.tsx","../../src/cms/CmsPage.tsx","../../src/cms/CmsPreview.tsx"],"names":["jsxs","jsx"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Sanity Image URL Builder\n *\n * Wraps @sanity/image-url to produce optimised, hotspot-aware URLs\n * from SanityImageRef objects stored in CMS content.\n */\nimport imageUrlBuilder from '@sanity/image-url'\nimport type { SanityImageRef } from './types'\n\n// ---------------------------------------------------------------------------\n// Singleton builder (configured once per runtime)\n// ---------------------------------------------------------------------------\n\nlet _builder: ReturnType<typeof imageUrlBuilder> | null = null\n\nexport interface SanityImageConfig {\n projectId: string\n dataset: string\n}\n\nconst DEFAULT_CONFIG: SanityImageConfig = {\n projectId: 'l55lyemx',\n dataset: 'production',\n}\n\n/**\n * Initialise (or re-initialise) the image builder with project config.\n * Call once at app startup — e.g. at module scope in app/layout.tsx.\n * If never called, falls back to DEFAULT_CONFIG.\n */\nexport function configureSanityImages(config: SanityImageConfig) {\n _builder = imageUrlBuilder(config)\n}\n\nfunction getBuilder() {\n if (!_builder) {\n _builder = imageUrlBuilder(DEFAULT_CONFIG)\n }\n return _builder\n}\n\n// ---------------------------------------------------------------------------\n// URL helpers\n// ---------------------------------------------------------------------------\n\nexport interface ImageUrlOptions {\n width?: number\n height?: number\n /** Device-pixel-ratio multiplier (default 1) */\n dpr?: number\n /** Quality 0-100 (default: Sanity auto) */\n quality?: number\n /** Force a specific format */\n format?: 'webp' | 'avif' | 'png' | 'jpg'\n /** Fit mode */\n fit?: 'clip' | 'crop' | 'fill' | 'fillmax' | 'max' | 'scale' | 'min'\n /** Apply blur (0-2000) */\n blur?: number\n}\n\n/**\n * Build an optimised image URL from a SanityImageRef.\n * Automatically applies hotspot/crop metadata when present.\n *\n * ```ts\n * const url = sanityImageUrl(heroImage, { width: 1200 })\n * ```\n */\nexport function sanityImageUrl(\n image: SanityImageRef | undefined | null,\n options: ImageUrlOptions = {},\n): string {\n if (!image?.asset?._ref) return ''\n\n let builder = getBuilder().image(image).auto('format')\n\n if (options.width) builder = builder.width(options.width)\n if (options.height) builder = builder.height(options.height)\n if (options.dpr) builder = builder.dpr(options.dpr)\n if (options.quality) builder = builder.quality(options.quality)\n if (options.format) builder = builder.format(options.format as any)\n if (options.fit) builder = builder.fit(options.fit)\n if (options.blur) builder = builder.blur(options.blur)\n\n return builder.url()\n}\n\n/**\n * Generate a srcSet string for responsive images.\n *\n * ```tsx\n * <img srcSet={sanityImageSrcSet(img, [400, 800, 1200])} sizes=\"100vw\" />\n * ```\n */\nexport function sanityImageSrcSet(\n image: SanityImageRef | undefined | null,\n widths: number[] = [400, 800, 1200, 1600],\n options: Omit<ImageUrlOptions, 'width'> = {},\n): string {\n if (!image?.asset?._ref) return ''\n return widths\n .map((w) => `${sanityImageUrl(image, { ...options, width: w })} ${w}w`)\n .join(', ')\n}\n\n/**\n * Compute CSS `object-position` from a Sanity hotspot.\n * Returns `undefined` if no hotspot is defined.\n */\nexport function hotspotToObjectPosition(\n image: SanityImageRef | undefined | null,\n): string | undefined {\n if (!image?.hotspot) return undefined\n return `${(image.hotspot.x * 100).toFixed(1)}% ${(image.hotspot.y * 100).toFixed(1)}%`\n}\n","import React from 'react'\nimport { PortableText, type PortableTextComponents } from '@portabletext/react'\nimport type { PortableTextRendererProps, PortableTextContent } from './types'\nimport { sanityImageUrl, sanityImageSrcSet, hotspotToObjectPosition } from './sanity-image'\n\n// ---------------------------------------------------------------------------\n// Default Component Map\n// ---------------------------------------------------------------------------\n\nconst defaultComponents: PortableTextComponents = {\n block: {\n h1: ({ children }) => (\n <h1 className=\"sonor-cms-h1\">{children}</h1>\n ),\n h2: ({ children }) => (\n <h2 className=\"sonor-cms-h2\">{children}</h2>\n ),\n h3: ({ children }) => (\n <h3 className=\"sonor-cms-h3\">{children}</h3>\n ),\n h4: ({ children }) => (\n <h4 className=\"sonor-cms-h4\">{children}</h4>\n ),\n normal: ({ children }) => (\n <p className=\"sonor-cms-p\">{children}</p>\n ),\n blockquote: ({ children }) => (\n <blockquote className=\"sonor-cms-blockquote\">{children}</blockquote>\n ),\n },\n marks: {\n strong: ({ children }) => <strong>{children}</strong>,\n em: ({ children }) => <em>{children}</em>,\n code: ({ children }) => (\n <code className=\"sonor-cms-code\">{children}</code>\n ),\n underline: ({ children }) => <u>{children}</u>,\n 'strike-through': ({ children }) => <s>{children}</s>,\n link: ({ children, value }) => {\n const href = value?.href || '#'\n const isExternal = href.startsWith('http')\n return (\n <a\n href={href}\n className=\"sonor-cms-link\"\n {...(isExternal\n ? { target: '_blank', rel: 'noopener noreferrer' }\n : {})}\n >\n {children}\n </a>\n )\n },\n highlight: ({ children }) => (\n <mark className=\"sonor-cms-highlight\">{children}</mark>\n ),\n },\n list: {\n bullet: ({ children }) => (\n <ul className=\"sonor-cms-ul\">{children}</ul>\n ),\n number: ({ children }) => (\n <ol className=\"sonor-cms-ol\">{children}</ol>\n ),\n },\n listItem: {\n bullet: ({ children }) => <li>{children}</li>,\n number: ({ children }) => <li>{children}</li>,\n },\n types: {\n image: ({ value }) => {\n if (!value?.asset?._ref && !value?.url) return null\n const src = value.url || sanityImageUrl(value, { width: 1200 })\n const srcSet = !value.url ? sanityImageSrcSet(value, [400, 800, 1200, 1600]) : undefined\n const objectPosition = hotspotToObjectPosition(value)\n return (\n <figure className=\"sonor-cms-figure\">\n <img\n src={src}\n srcSet={srcSet}\n sizes=\"(max-width: 768px) 100vw, (max-width: 1200px) 80vw, 1200px\"\n alt={value.alt || ''}\n className=\"sonor-cms-img\"\n loading=\"lazy\"\n style={objectPosition ? { objectPosition } : undefined}\n />\n {value.caption && (\n <figcaption className=\"sonor-cms-figcaption\">\n {typeof value.caption === 'string'\n ? value.caption\n : null}\n </figcaption>\n )}\n </figure>\n )\n },\n },\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\n/**\n * Renders Portable Text content with Sonor default styling.\n * Accepts `components` prop to override or extend defaults.\n */\nexport function PortableTextRenderer({\n value,\n components: overrides,\n className,\n}: PortableTextRendererProps) {\n if (!value || !Array.isArray(value) || value.length === 0) return null\n\n const merged: PortableTextComponents = overrides\n ? {\n ...defaultComponents,\n block: { ...(defaultComponents.block as object), ...(overrides as any).block },\n marks: { ...(defaultComponents.marks as object), ...(overrides as any).marks },\n types: { ...(defaultComponents.types as object), ...(overrides as any).types },\n list: { ...(defaultComponents.list as object), ...(overrides as any).list },\n listItem: { ...(defaultComponents.listItem as object), ...(overrides as any).listItem },\n }\n : defaultComponents\n\n return (\n <div className={className || 'sonor-cms-content'}>\n <PortableText value={value as any} components={merged} />\n </div>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport { sanityImageUrl, hotspotToObjectPosition } from '../sanity-image'\nimport type { SectionRendererProps, PortableTextContent, SanityImageRef } from '../types'\n\nexport function HeroSection({ data, portableTextComponents }: SectionRendererProps) {\n const headline = data.headline as PortableTextContent | undefined\n const subheadline = data.subheadline as PortableTextContent | undefined\n const ctaText = data.ctaText as string | undefined\n const ctaLink = data.ctaLink as string | undefined\n const bgImage = data.backgroundImage as SanityImageRef | undefined\n const bgUrl = sanityImageUrl(bgImage, { width: 1920, quality: 80 })\n const bgPosition = hotspotToObjectPosition(bgImage) || '50% 50%'\n\n return (\n <section\n className=\"sonor-cms-hero\"\n style={\n bgUrl\n ? { backgroundImage: `url(${bgUrl})`, backgroundPosition: bgPosition, backgroundSize: 'cover' }\n : undefined\n }\n >\n {headline && (\n <PortableTextRenderer value={headline} components={portableTextComponents} className=\"sonor-cms-hero-headline\" />\n )}\n {subheadline && (\n <PortableTextRenderer value={subheadline} components={portableTextComponents} className=\"sonor-cms-hero-subheadline\" />\n )}\n {ctaText && ctaLink && (\n <a href={ctaLink} className=\"sonor-cms-hero-cta\">\n {ctaText}\n </a>\n )}\n </section>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport type { SectionRendererProps, PortableTextContent } from '../types'\n\nexport function RichTextSection({ data, portableTextComponents }: SectionRendererProps) {\n const content = data.content as PortableTextContent | undefined\n if (!content) return null\n\n return (\n <section className=\"sonor-cms-richtext\">\n <PortableTextRenderer value={content} components={portableTextComponents} />\n </section>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport type { SectionRendererProps, PortableTextContent } from '../types'\n\nexport function CtaSection({ data, portableTextComponents }: SectionRendererProps) {\n const headline = data.headline as PortableTextContent | undefined\n const description = data.description as PortableTextContent | undefined\n const buttonText = data.buttonText as string | undefined\n const buttonLink = data.buttonLink as string | undefined\n\n return (\n <section className=\"sonor-cms-cta\">\n {headline && (\n <PortableTextRenderer value={headline} components={portableTextComponents} className=\"sonor-cms-cta-headline\" />\n )}\n {description && (\n <PortableTextRenderer value={description} components={portableTextComponents} className=\"sonor-cms-cta-description\" />\n )}\n {buttonText && buttonLink && (\n <a href={buttonLink} className=\"sonor-cms-cta-button\">\n {buttonText}\n </a>\n )}\n </section>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport { sanityImageUrl, sanityImageSrcSet, hotspotToObjectPosition } from '../sanity-image'\nimport type { SectionRendererProps, PortableTextContent, SanityImageRef } from '../types'\n\nexport function GallerySection({ data, portableTextComponents }: SectionRendererProps) {\n const images = (data.images || []) as SanityImageRef[]\n const layout = (data.layout || 'grid') as string\n const caption = data.caption as PortableTextContent | undefined\n\n if (images.length === 0) return null\n\n return (\n <section className=\"sonor-cms-gallery\">\n <div className={`sonor-cms-gallery-${layout}`}>\n {images.map((img, i) => {\n const objectPosition = hotspotToObjectPosition(img)\n return (\n <figure key={img.asset?._ref || i} className=\"sonor-cms-gallery-item\">\n <img\n src={sanityImageUrl(img, { width: 800 })}\n srcSet={sanityImageSrcSet(img, [400, 800, 1200])}\n sizes=\"(max-width: 640px) 100vw, (max-width: 1024px) 50vw, 33vw\"\n alt={img.alt || ''}\n loading=\"lazy\"\n style={objectPosition ? { objectPosition } : undefined}\n />\n </figure>\n )\n })}\n </div>\n {caption && (\n <PortableTextRenderer value={caption} components={portableTextComponents} className=\"sonor-cms-gallery-caption\" />\n )}\n </section>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport { sanityImageUrl } from '../sanity-image'\nimport type { SectionRendererProps, PortableTextContent, SanityImageRef } from '../types'\n\ninterface TestimonialItem {\n quote: PortableTextContent\n author: string\n role?: string\n avatar?: SanityImageRef\n}\n\nexport function TestimonialsSection({ data, portableTextComponents }: SectionRendererProps) {\n const items = (data.items || []) as TestimonialItem[]\n const layout = (data.layout || 'grid') as string\n\n if (items.length === 0) return null\n\n return (\n <section className={`sonor-cms-testimonials sonor-cms-testimonials-${layout}`}>\n {items.map((item, i) => (\n <blockquote key={i} className=\"sonor-cms-testimonial\">\n <PortableTextRenderer value={item.quote} components={portableTextComponents} className=\"sonor-cms-testimonial-quote\" />\n <footer className=\"sonor-cms-testimonial-footer\">\n {item.avatar?.asset?._ref && (\n <img\n src={sanityImageUrl(item.avatar, { width: 80, height: 80, fit: 'crop' })}\n alt={item.avatar.alt || item.author}\n className=\"sonor-cms-testimonial-avatar\"\n width={80}\n height={80}\n loading=\"lazy\"\n />\n )}\n <cite className=\"sonor-cms-testimonial-author\">\n {item.author}\n {item.role && (\n <span className=\"sonor-cms-testimonial-role\">, {item.role}</span>\n )}\n </cite>\n </footer>\n </blockquote>\n ))}\n </section>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport type { SectionRendererProps, PortableTextContent } from '../types'\n\ninterface FaqItem {\n question: string\n answer: PortableTextContent\n}\n\nexport function FaqSection({ data, portableTextComponents }: SectionRendererProps) {\n const items = (data.items || []) as FaqItem[]\n\n if (items.length === 0) return null\n\n return (\n <section className=\"sonor-cms-faq\">\n {items.map((item, i) => (\n <details key={i} className=\"sonor-cms-faq-item\">\n <summary className=\"sonor-cms-faq-question\">{item.question}</summary>\n <div className=\"sonor-cms-faq-answer\">\n <PortableTextRenderer value={item.answer} components={portableTextComponents} />\n </div>\n </details>\n ))}\n </section>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport type { SectionRendererProps, PortableTextContent } from '../types'\n\n/**\n * Form section — renders a heading and a placeholder for the managed form.\n * The actual form rendering depends on ManagedForm from the forms module.\n * Sites should override this section renderer to integrate with their form setup.\n */\nexport function FormSection({ data, portableTextComponents }: SectionRendererProps) {\n const formSlug = data.formSlug as string | undefined\n const heading = data.heading as PortableTextContent | undefined\n\n return (\n <section className=\"sonor-cms-form\">\n {heading && (\n <PortableTextRenderer value={heading} components={portableTextComponents} className=\"sonor-cms-form-heading\" />\n )}\n {formSlug ? (\n <div\n className=\"sonor-cms-form-embed\"\n data-form-slug={formSlug}\n >\n {/* Override FormSection renderer to integrate ManagedForm */}\n </div>\n ) : (\n <p className=\"sonor-cms-form-placeholder\">Form not configured</p>\n )}\n </section>\n )\n}\n","import React from 'react'\nimport type { SectionRendererProps } from '../types'\n\n/**\n * Custom section — passes props to a named component.\n * Sites must provide their own component map via sectionComponents override.\n */\nexport function CustomSection({ data, displayName }: SectionRendererProps) {\n const componentName = data.componentName as string | undefined\n const props = (data.props || {}) as Record<string, unknown>\n\n return (\n <section className=\"sonor-cms-custom\" data-component={componentName}>\n <div className=\"sonor-cms-custom-placeholder\">\n Custom component: {componentName || displayName}\n {/* Override 'custom' in sectionComponents to render actual components */}\n </div>\n </section>\n )\n}\n","import React from 'react'\nimport type { CmsSectionProps, SectionRendererProps, SectionType } from './types'\nimport {\n HeroSection,\n RichTextSection,\n CtaSection,\n GallerySection,\n TestimonialsSection,\n FaqSection,\n FormSection,\n CustomSection,\n} from './sections'\n\nconst defaultRenderers: Record<SectionType, React.ComponentType<SectionRendererProps>> = {\n hero: HeroSection,\n richText: RichTextSection,\n cta: CtaSection,\n gallery: GallerySection,\n testimonials: TestimonialsSection,\n faq: FaqSection,\n form: FormSection,\n custom: CustomSection,\n}\n\n/**\n * Renders a single CMS section using the appropriate renderer for its type.\n * Override specific section renderers via the `sectionComponents` prop.\n */\nexport function CmsSection({ section, sectionComponents, portableTextComponents }: CmsSectionProps) {\n const Renderer =\n sectionComponents?.[section.sectionType] ||\n defaultRenderers[section.sectionType]\n\n if (!Renderer) {\n if (process.env.NODE_ENV === 'development') {\n console.warn(`@sonordev/cms: No renderer for section type: ${section.sectionType}`)\n }\n return null\n }\n\n return (\n <div\n className={`sonor-cms-section sonor-cms-section-${section.sectionType}`}\n data-section-id={section._id}\n data-section-type={section.sectionType}\n >\n <Renderer\n data={section.data}\n sectionType={section.sectionType}\n displayName={section.displayName}\n portableTextComponents={portableTextComponents}\n />\n </div>\n )\n}\n","import React from 'react'\nimport type { CmsPageProps, CmsSectionData } from './types'\nimport { getCmsPage } from './server-api'\nimport { CmsSection } from './CmsSection'\n\n/**\n * Async React Server Component that fetches and renders a full CMS page.\n *\n * @example\n * ```tsx\n * // app/[...slug]/page.tsx\n * import { CmsPage } from '@sonordev/site-kit/cms'\n *\n * export default function Page({ params }) {\n * return <CmsPage path={`/${params.slug.join('/')}`} />\n * }\n * ```\n */\nexport async function CmsPage({\n path,\n sectionComponents,\n portableTextComponents,\n fallback,\n className,\n}: CmsPageProps): Promise<React.ReactElement | null> {\n const page = await getCmsPage(path)\n\n if (!page) {\n if (fallback) return <>{fallback}</>\n return null\n }\n\n if (!page.sections || page.sections.length === 0) {\n if (fallback) return <>{fallback}</>\n return null\n }\n\n return (\n <div\n className={className || 'sonor-cms-page'}\n data-cms-page-id={page._id}\n data-cms-path={page.path}\n >\n {page.sections.map((section: CmsSectionData) => (\n <CmsSection\n key={section._id}\n section={section}\n sectionComponents={sectionComponents}\n portableTextComponents={portableTextComponents}\n />\n ))}\n </div>\n )\n}\n","'use client'\n\nimport React, { useState, useEffect } from 'react'\nimport type { CmsPageData, CmsSectionProps, SectionType, SectionRendererProps } from './types'\nimport { CmsSection } from './CmsSection'\n\ninterface CmsPreviewProps {\n /** Portal API base URL */\n apiUrl?: string\n /** API key for fetching draft content */\n apiKey: string\n /** Page path to preview */\n path: string\n /** Poll interval in ms (0 = no polling) */\n pollInterval?: number\n /** Override section renderers */\n sectionComponents?: Partial<Record<SectionType, React.ComponentType<SectionRendererProps>>>\n /** Override Portable Text components */\n portableTextComponents?: Record<string, React.ComponentType<any>>\n /** Wrapper className */\n className?: string\n}\n\n/**\n * Client component for previewing draft CMS content.\n * Fetches draft content from Portal API and re-renders on changes.\n *\n * @example\n * ```tsx\n * // Used in preview mode (e.g., ?preview=true)\n * import { CmsPreview } from '@sonordev/site-kit/cms'\n *\n * <CmsPreview\n * apiKey={process.env.SONOR_API_KEY!}\n * path=\"/about\"\n * pollInterval={3000}\n * />\n * ```\n */\nexport function CmsPreview({\n apiUrl = process.env.SONOR_API_URL || 'https://api.sonor.io',\n apiKey,\n path,\n pollInterval = 3000,\n sectionComponents,\n portableTextComponents,\n className,\n}: CmsPreviewProps) {\n const [page, setPage] = useState<CmsPageData | null>(null)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n let cancelled = false\n\n async function fetchPage() {\n try {\n const res = await fetch(`${apiUrl}/api/public/cms/page`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n },\n body: JSON.stringify({ path }),\n })\n\n if (!res.ok) {\n setError(`Error ${res.status}`)\n return\n }\n\n const data = await res.json()\n if (!cancelled && data?.found && data.page) {\n setPage(data.page)\n setError(null)\n }\n } catch (err) {\n if (!cancelled) {\n setError('Failed to load preview')\n }\n }\n }\n\n fetchPage()\n\n if (pollInterval > 0) {\n const interval = setInterval(fetchPage, pollInterval)\n return () => {\n cancelled = true\n clearInterval(interval)\n }\n }\n\n return () => {\n cancelled = true\n }\n }, [apiUrl, apiKey, path, pollInterval])\n\n if (error) {\n return (\n <div className=\"sonor-cms-preview-error\">\n <p>Preview error: {error}</p>\n </div>\n )\n }\n\n if (!page) {\n return (\n <div className=\"sonor-cms-preview-loading\">\n <p>Loading preview...</p>\n </div>\n )\n }\n\n return (\n <div\n className={className || 'sonor-cms-page sonor-cms-preview'}\n data-cms-preview=\"true\"\n data-cms-path={page.path}\n >\n {page.sections?.map((section) => (\n <CmsSection\n key={section._id}\n section={section}\n sectionComponents={sectionComponents}\n portableTextComponents={portableTextComponents}\n />\n ))}\n </div>\n )\n}\n"]}
|
|
@@ -5,7 +5,7 @@ export interface SanityImageConfig {
|
|
|
5
5
|
}
|
|
6
6
|
/**
|
|
7
7
|
* Initialise (or re-initialise) the image builder with project config.
|
|
8
|
-
* Call once at app startup — e.g.
|
|
8
|
+
* Call once at app startup — e.g. at module scope in app/layout.tsx.
|
|
9
9
|
* If never called, falls back to DEFAULT_CONFIG.
|
|
10
10
|
*/
|
|
11
11
|
export declare function configureSanityImages(config: SanityImageConfig): void;
|