@salla.sa/twilight-theme-engine 1.0.94 → 1.0.96
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/dist/{AddToCartForm-MASXVJOI.js → AddToCartForm-DASRXMY7.js} +3 -3
- package/dist/{AddToCartForm-MASXVJOI.js.map → AddToCartForm-DASRXMY7.js.map} +1 -1
- package/dist/{BlogAuthorPage-KRT7MRTC.js → BlogAuthorPage-WFZGYSUB.js} +26 -24
- package/dist/BlogAuthorPage-WFZGYSUB.js.map +1 -0
- package/dist/{BlogCategoryPage-OP3ETAMT.js → BlogCategoryPage-23PFOVVP.js} +26 -24
- package/dist/BlogCategoryPage-23PFOVVP.js.map +1 -0
- package/dist/{BlogPage-RGAQVUDI.js → BlogPage-4RFI56TW.js} +24 -22
- package/dist/BlogPage-4RFI56TW.js.map +1 -0
- package/dist/{BlogSinglePage-VG4UXBTL.js → BlogSinglePage-KMGBQUG5.js} +24 -22
- package/dist/BlogSinglePage-KMGBQUG5.js.map +1 -0
- package/dist/{BlogTagPage-G4IVHJD5.js → BlogTagPage-ZPQJKPBO.js} +26 -24
- package/dist/BlogTagPage-ZPQJKPBO.js.map +1 -0
- package/dist/{BrandsPage-2JMPPOOU.js → BrandsPage-FIHOZYMB.js} +25 -23
- package/dist/BrandsPage-FIHOZYMB.js.map +1 -0
- package/dist/{Breadcrumb-I3ZOGG2Y.js → Breadcrumb-2IXFQL6L.js} +24 -22
- package/dist/Breadcrumb-2IXFQL6L.js.map +1 -0
- package/dist/{CartItem-YTPYETW6.js → CartItem-GRFH5BED.js} +24 -22
- package/dist/CartItem-GRFH5BED.js.map +1 -0
- package/dist/{CartSummary-DND7BO26.js → CartSummary-IOCZJL26.js} +24 -22
- package/dist/CartSummary-IOCZJL26.js.map +1 -0
- package/dist/{Copyright-RWML3BQV.js → Copyright-MDKYCKML.js} +3 -3
- package/dist/{Copyright-RWML3BQV.js.map → Copyright-MDKYCKML.js.map} +1 -1
- package/dist/{CustomerLayout-HCYVBODI.js → CustomerLayout-4737YCAK.js} +24 -22
- package/dist/CustomerLayout-4737YCAK.js.map +1 -0
- package/dist/{Footer-3GEKWEQD.js → Footer-2F652QDB.js} +4 -4
- package/dist/{Footer-3GEKWEQD.js.map → Footer-2F652QDB.js.map} +1 -1
- package/dist/Header-4OATF4LX.js +22 -0
- package/dist/{Header-QG4UO3MF.js.map → Header-4OATF4LX.js.map} +1 -1
- package/dist/{LoyaltyPage-ZMFYQMQY.js → LoyaltyPage-POFUTIPB.js} +24 -22
- package/dist/LoyaltyPage-POFUTIPB.js.map +1 -0
- package/dist/{LoyaltyPointsPage-5PB6IFLY.js → LoyaltyPointsPage-L4S4NZA2.js} +8 -7
- package/dist/LoyaltyPointsPage-L4S4NZA2.js.map +1 -0
- package/dist/{MainMenu-SAUMNMBF.js → MainMenu-ROGX37TG.js} +7 -6
- package/dist/MainMenu-ROGX37TG.js.map +1 -0
- package/dist/{MasterLayout-TY223YR7.js → MasterLayout-PGL5YU2B.js} +24 -22
- package/dist/{MasterLayout-TY223YR7.js.map → MasterLayout-PGL5YU2B.js.map} +1 -1
- package/dist/{MobileMenu-2WOWOFQB.js → MobileMenu-VGXWJHEF.js} +25 -23
- package/dist/MobileMenu-VGXWJHEF.js.map +1 -0
- package/dist/{NotificationsPage-6FX4SOZU.js → NotificationsPage-PZAEKKJO.js} +24 -22
- package/dist/NotificationsPage-PZAEKKJO.js.map +1 -0
- package/dist/{OrderSinglePage-RUMSJIFD.js → OrderSinglePage-KTKLXTUX.js} +25 -23
- package/dist/OrderSinglePage-KTKLXTUX.js.map +1 -0
- package/dist/{OrdersPage-B4Q4QIEM.js → OrdersPage-BY6LYV5M.js} +24 -22
- package/dist/OrdersPage-BY6LYV5M.js.map +1 -0
- package/dist/{PageSingle-F4TDNKUM.js → PageSingle-CJRT3HJZ.js} +6 -5
- package/dist/PageSingle-CJRT3HJZ.js.map +1 -0
- package/dist/{ProductDetails-BNVVUDBH.js → ProductDetails-O2VJVIZC.js} +7 -6
- package/dist/ProductDetails-O2VJVIZC.js.map +1 -0
- package/dist/{ProfilePage-OJSAXSC2.js → ProfilePage-TB7PBODI.js} +24 -22
- package/dist/ProfilePage-TB7PBODI.js.map +1 -0
- package/dist/{RenderWhenVisible-F44J5MMG.js → RenderWhenVisible-KWAXEJOJ.js} +8 -5
- package/dist/RenderWhenVisible-KWAXEJOJ.js.map +1 -0
- package/dist/{ReviewsPage-3IJKJKTY.js → ReviewsPage-5KGCKLFR.js} +3 -3
- package/dist/{ReviewsPage-3IJKJKTY.js.map → ReviewsPage-5KGCKLFR.js.map} +1 -1
- package/dist/{SeoCartWidget-4PN2DW54.js → SeoCartWidget-6BU7WCTP.js} +24 -22
- package/dist/SeoCartWidget-6BU7WCTP.js.map +1 -0
- package/dist/{SettingsPage-BCRNV4GU.js → SettingsPage-G55AM2KS.js} +24 -22
- package/dist/SettingsPage-G55AM2KS.js.map +1 -0
- package/dist/{StoreClosedNotification-IRUTRLIH.js → StoreClosedNotification-C3BBFGAA.js} +25 -23
- package/dist/{StoreClosedNotification-IRUTRLIH.js.map → StoreClosedNotification-C3BBFGAA.js.map} +1 -1
- package/dist/{TestimonialsPage-YU4PLOLR.js → TestimonialsPage-EA4PSO7E.js} +6 -5
- package/dist/TestimonialsPage-EA4PSO7E.js.map +1 -0
- package/dist/{ThankYouPage-MUDELEIQ.js → ThankYouPage-R2OEK7ZZ.js} +24 -22
- package/dist/ThankYouPage-R2OEK7ZZ.js.map +1 -0
- package/dist/{WalletPage-2I4KTR5E.js → WalletPage-MEWHIHUE.js} +25 -23
- package/dist/WalletPage-MEWHIHUE.js.map +1 -0
- package/dist/{WishlistPage-7AYL3RUD.js → WishlistPage-YFKG7CXU.js} +26 -24
- package/dist/WishlistPage-YFKG7CXU.js.map +1 -0
- package/dist/ambient/virtual-modules.d.ts +43 -1
- package/dist/api/advertisement.js +4 -3
- package/dist/api/apps.js +4 -3
- package/dist/api/blog.js +6 -5
- package/dist/api/brands.js +6 -5
- package/dist/api/cart.js +6 -5
- package/dist/api/category.js +6 -5
- package/dist/api/client.js +3 -2
- package/dist/api/home.js +4 -3
- package/dist/api/loyalty.js +6 -5
- package/dist/api/menu.js +4 -3
- package/dist/api/notification.js +4 -3
- package/dist/api/order.js +6 -5
- package/dist/api/page.js +6 -5
- package/dist/api/product.js +6 -5
- package/dist/api/profile.js +3 -2
- package/dist/api/profile.js.map +1 -1
- package/dist/api/store.js +4 -3
- package/dist/api/translations.js +4 -3
- package/dist/api/user.js +4 -3
- package/dist/api/wallet.js +4 -3
- package/dist/api/wishlist.js +7 -6
- package/dist/{chunk-LA7KZ2XY.js → chunk-2D5TFSVG.js} +8 -8
- package/dist/{chunk-LA7KZ2XY.js.map → chunk-2D5TFSVG.js.map} +1 -1
- package/dist/{chunk-HQAFPDJK.js → chunk-2FDLEB5J.js} +3 -3
- package/dist/{chunk-HQAFPDJK.js.map → chunk-2FDLEB5J.js.map} +1 -1
- package/dist/chunk-2FKZAAV7.js +90 -0
- package/dist/chunk-2FKZAAV7.js.map +1 -0
- package/dist/{chunk-YDFOJBEY.js → chunk-3GW3VFR6.js} +3 -3
- package/dist/{chunk-YDFOJBEY.js.map → chunk-3GW3VFR6.js.map} +1 -1
- package/dist/{chunk-CEYT3JER.js → chunk-56T47K7P.js} +4 -4
- package/dist/{chunk-CEYT3JER.js.map → chunk-56T47K7P.js.map} +1 -1
- package/dist/{chunk-LPQ5FUMJ.js → chunk-5SDCUGYR.js} +4 -4
- package/dist/{chunk-LPQ5FUMJ.js.map → chunk-5SDCUGYR.js.map} +1 -1
- package/dist/{chunk-QGOPTVV5.js → chunk-6EQ7G3SZ.js} +4 -3
- package/dist/chunk-6EQ7G3SZ.js.map +1 -0
- package/dist/{chunk-H7CVJFTK.js → chunk-6RHU4TEF.js} +7 -7
- package/dist/{chunk-H7CVJFTK.js.map → chunk-6RHU4TEF.js.map} +1 -1
- package/dist/{chunk-FZYR4BA2.js → chunk-7WTUA4WY.js} +3 -3
- package/dist/{chunk-FZYR4BA2.js.map → chunk-7WTUA4WY.js.map} +1 -1
- package/dist/{chunk-3PXONLUK.js → chunk-BH7YNCYB.js} +3 -3
- package/dist/{chunk-3PXONLUK.js.map → chunk-BH7YNCYB.js.map} +1 -1
- package/dist/{chunk-DBW7XXNE.js → chunk-BPL5H33B.js} +4 -4
- package/dist/{chunk-DBW7XXNE.js.map → chunk-BPL5H33B.js.map} +1 -1
- package/dist/{chunk-66K5P5ZX.js → chunk-CNUBL24W.js} +3 -3
- package/dist/{chunk-66K5P5ZX.js.map → chunk-CNUBL24W.js.map} +1 -1
- package/dist/chunk-COJH52VR.js +443 -0
- package/dist/chunk-COJH52VR.js.map +1 -0
- package/dist/{chunk-6OOTDFC7.js → chunk-D56TVNOG.js} +3 -3
- package/dist/{chunk-6OOTDFC7.js.map → chunk-D56TVNOG.js.map} +1 -1
- package/dist/{chunk-Y7XVWQXG.js → chunk-DNPQ2JBM.js} +4 -4
- package/dist/{chunk-Y7XVWQXG.js.map → chunk-DNPQ2JBM.js.map} +1 -1
- package/dist/{chunk-JJARU7YP.js → chunk-EWLVLDRP.js} +3 -3
- package/dist/{chunk-JJARU7YP.js.map → chunk-EWLVLDRP.js.map} +1 -1
- package/dist/{chunk-Y357MBJI.js → chunk-FNHZEBA5.js} +9 -8
- package/dist/chunk-FNHZEBA5.js.map +1 -0
- package/dist/{chunk-HSWRYXC7.js → chunk-FO4WVGUQ.js} +3 -88
- package/dist/chunk-FO4WVGUQ.js.map +1 -0
- package/dist/{chunk-BNI6SKFL.js → chunk-G3UTLICK.js} +4 -4
- package/dist/{chunk-BNI6SKFL.js.map → chunk-G3UTLICK.js.map} +1 -1
- package/dist/{chunk-C4RXPVDF.js → chunk-GMXI6V2D.js} +6 -5
- package/dist/chunk-GMXI6V2D.js.map +1 -0
- package/dist/{chunk-RKQH63G2.js → chunk-GXHJXZBG.js} +4 -4
- package/dist/{chunk-RKQH63G2.js.map → chunk-GXHJXZBG.js.map} +1 -1
- package/dist/{chunk-43D2CG4F.js → chunk-IBSQO6LW.js} +4 -4
- package/dist/{chunk-43D2CG4F.js.map → chunk-IBSQO6LW.js.map} +1 -1
- package/dist/{chunk-ZVZGLEZ6.js → chunk-IU4KTCS3.js} +3 -3
- package/dist/{chunk-ZVZGLEZ6.js.map → chunk-IU4KTCS3.js.map} +1 -1
- package/dist/{chunk-ZFNLX3F7.js → chunk-J3G4ZD76.js} +13 -12
- package/dist/chunk-J3G4ZD76.js.map +1 -0
- package/dist/{chunk-ENJ3CM5M.js → chunk-J5X4LXNM.js} +3 -3
- package/dist/{chunk-ENJ3CM5M.js.map → chunk-J5X4LXNM.js.map} +1 -1
- package/dist/{chunk-TJF6YZ5I.js → chunk-JKBLG344.js} +8 -7
- package/dist/chunk-JKBLG344.js.map +1 -0
- package/dist/{chunk-RPDMNNRW.js → chunk-JVIPOD6M.js} +20 -19
- package/dist/chunk-JVIPOD6M.js.map +1 -0
- package/dist/{chunk-4WAUITU2.js → chunk-KNIGLCRV.js} +3 -3
- package/dist/{chunk-4WAUITU2.js.map → chunk-KNIGLCRV.js.map} +1 -1
- package/dist/{chunk-OMKLPCBA.js → chunk-KQW6I5CD.js} +4 -4
- package/dist/{chunk-OMKLPCBA.js.map → chunk-KQW6I5CD.js.map} +1 -1
- package/dist/{chunk-HR3QJ3LW.js → chunk-LXNS6CMT.js} +4 -4
- package/dist/{chunk-HR3QJ3LW.js.map → chunk-LXNS6CMT.js.map} +1 -1
- package/dist/chunk-MGDCJQ5P.js +14 -0
- package/dist/{chunk-KZM7HXJ3.js.map → chunk-MGDCJQ5P.js.map} +1 -1
- package/dist/chunk-N45X7D55.js +63 -0
- package/dist/chunk-N45X7D55.js.map +1 -0
- package/dist/{chunk-OH2L4U2C.js → chunk-NZRJOAA7.js} +3 -3
- package/dist/{chunk-OH2L4U2C.js.map → chunk-NZRJOAA7.js.map} +1 -1
- package/dist/{chunk-TEOVJ6WU.js → chunk-O7B5JL6H.js} +4 -4
- package/dist/{chunk-TEOVJ6WU.js.map → chunk-O7B5JL6H.js.map} +1 -1
- package/dist/{chunk-UURVAJ42.js → chunk-OZP2FID7.js} +4 -4
- package/dist/{chunk-UURVAJ42.js.map → chunk-OZP2FID7.js.map} +1 -1
- package/dist/{chunk-HCA2TE4G.js → chunk-PGUKRWOY.js} +5 -5
- package/dist/{chunk-HCA2TE4G.js.map → chunk-PGUKRWOY.js.map} +1 -1
- package/dist/{chunk-3MIFT4VQ.js → chunk-Q62YEBIA.js} +4 -4
- package/dist/{chunk-3MIFT4VQ.js.map → chunk-Q62YEBIA.js.map} +1 -1
- package/dist/{chunk-6DMNJPLW.js → chunk-QS4EDTEX.js} +3 -3
- package/dist/{chunk-6DMNJPLW.js.map → chunk-QS4EDTEX.js.map} +1 -1
- package/dist/{chunk-SAGXF3MU.js → chunk-QZEQOVA5.js} +3 -3
- package/dist/{chunk-SAGXF3MU.js.map → chunk-QZEQOVA5.js.map} +1 -1
- package/dist/{chunk-JTOVO3ZU.js → chunk-RWBTMHLR.js} +5 -5
- package/dist/{chunk-JTOVO3ZU.js.map → chunk-RWBTMHLR.js.map} +1 -1
- package/dist/{chunk-DV6SJHL5.js → chunk-S34G5DL4.js} +4 -4
- package/dist/{chunk-DV6SJHL5.js.map → chunk-S34G5DL4.js.map} +1 -1
- package/dist/{chunk-MKVCFBVF.js → chunk-TIPR4JUO.js} +4 -4
- package/dist/{chunk-MKVCFBVF.js.map → chunk-TIPR4JUO.js.map} +1 -1
- package/dist/{chunk-WHJZP3QJ.js → chunk-ULMSO2XZ.js} +7 -7
- package/dist/{chunk-WHJZP3QJ.js.map → chunk-ULMSO2XZ.js.map} +1 -1
- package/dist/{chunk-IVBOLREE.js → chunk-VWVCSD3N.js} +3 -3
- package/dist/{chunk-IVBOLREE.js.map → chunk-VWVCSD3N.js.map} +1 -1
- package/dist/{chunk-5G7NYNX6.js → chunk-W2LNKEBF.js} +3 -3
- package/dist/{chunk-5G7NYNX6.js.map → chunk-W2LNKEBF.js.map} +1 -1
- package/dist/{chunk-AV6AAVNU.js → chunk-XGNML7XM.js} +7 -7
- package/dist/{chunk-AV6AAVNU.js.map → chunk-XGNML7XM.js.map} +1 -1
- package/dist/{chunk-46NBPXAI.js → chunk-XT6CLGF5.js} +3 -3
- package/dist/{chunk-46NBPXAI.js.map → chunk-XT6CLGF5.js.map} +1 -1
- package/dist/{chunk-SFZ7IIWL.js → chunk-ZEGNYJOR.js} +4 -4
- package/dist/{chunk-SFZ7IIWL.js.map → chunk-ZEGNYJOR.js.map} +1 -1
- package/dist/{chunk-OM26SAHA.js → chunk-ZPVLBXDY.js} +4 -4
- package/dist/{chunk-OM26SAHA.js.map → chunk-ZPVLBXDY.js.map} +1 -1
- package/dist/components/cart/index.js +1 -1
- package/dist/components/common/RenderWhenVisible.d.ts +3 -1
- package/dist/components/common/RenderWhenVisible.d.ts.map +1 -1
- package/dist/components/common/index.js +1 -1
- package/dist/components/common/lazy.d.ts +1 -1
- package/dist/components/common/lazy.d.ts.map +1 -1
- package/dist/components/drawer/index.js +22 -20
- package/dist/components/home/HomePageRenderer.d.ts.map +1 -1
- package/dist/components/home/index.js +26 -24
- package/dist/components/layout/index.js +6 -5
- package/dist/components/product/index.js +23 -21
- package/dist/components/store/index.js +24 -22
- package/dist/components/store/index.js.map +1 -1
- package/dist/components/toast/index.js +4 -3
- package/dist/components/toast/index.js.map +1 -1
- package/dist/components/tracking/index.js +1 -1
- package/dist/dev/DevSettingsWidget.d.ts +6 -7
- package/dist/dev/DevSettingsWidget.d.ts.map +1 -1
- package/dist/dev/dev-settings-store.d.ts +89 -46
- package/dist/dev/dev-settings-store.d.ts.map +1 -1
- package/dist/dev/editor/AddElementDrawer.d.ts +17 -0
- package/dist/dev/editor/AddElementDrawer.d.ts.map +1 -0
- package/dist/dev/editor/BuilderPanel.d.ts +23 -0
- package/dist/dev/editor/BuilderPanel.d.ts.map +1 -0
- package/dist/dev/editor/SettingsPanel.d.ts +9 -0
- package/dist/dev/editor/SettingsPanel.d.ts.map +1 -0
- package/dist/dev/editor/ThemeEditor.d.ts +20 -0
- package/dist/dev/editor/ThemeEditor.d.ts.map +1 -0
- package/dist/dev/editor/catalog.d.ts +10 -0
- package/dist/dev/editor/catalog.d.ts.map +1 -0
- package/dist/dev/editor/fields.d.ts +18 -0
- package/dist/dev/editor/fields.d.ts.map +1 -0
- package/dist/dev/editor/i18n.d.ts +72 -0
- package/dist/dev/editor/i18n.d.ts.map +1 -0
- package/dist/dev/editor/icons.d.ts +21 -0
- package/dist/dev/editor/icons.d.ts.map +1 -0
- package/dist/dev/editor/index.d.ts +8 -0
- package/dist/dev/editor/index.d.ts.map +1 -0
- package/dist/dev/editor/index.js +2059 -0
- package/dist/dev/editor/index.js.map +1 -0
- package/dist/dev/editor/lookup.d.ts +22 -0
- package/dist/dev/editor/lookup.d.ts.map +1 -0
- package/dist/dev/editor/mount.d.ts +4 -0
- package/dist/dev/editor/mount.d.ts.map +1 -0
- package/dist/dev/editor/paths.d.ts +44 -0
- package/dist/dev/editor/paths.d.ts.map +1 -0
- package/dist/dev/editor/pickers.d.ts +12 -0
- package/dist/dev/editor/pickers.d.ts.map +1 -0
- package/dist/dev/editor/styles.d.ts +8 -0
- package/dist/dev/editor/styles.d.ts.map +1 -0
- package/dist/dev/index.d.ts +1 -1
- package/dist/dev/index.d.ts.map +1 -1
- package/dist/dev/index.js +35 -309
- package/dist/dev/index.js.map +1 -1
- package/dist/dev/schema-types.d.ts +124 -4
- package/dist/dev/schema-types.d.ts.map +1 -1
- package/dist/dev/store-lookup.d.ts +13 -0
- package/dist/dev/store-lookup.d.ts.map +1 -0
- package/dist/document-class-2RROXH4K.js +29 -0
- package/dist/{document-class-AJGI7GKJ.js.map → document-class-2RROXH4K.js.map} +1 -1
- package/dist/hooks/index.js +22 -20
- package/dist/hooks/useComments.js +3 -2
- package/dist/hooks/useGtm.js +22 -20
- package/dist/hooks/useMoney.js +22 -20
- package/dist/hooks/useProduct.js +3 -2
- package/dist/hooks/useStore.js +22 -20
- package/dist/hooks/useUser.js +5 -4
- package/dist/hooks/useWishlist.js +3 -2
- package/dist/index.js +22 -20
- package/dist/index.js.map +1 -1
- package/dist/native-app/index.js +3 -2
- package/dist/{navigation-KTFJWOWI.js → navigation-JB2CJXBF.js} +7 -6
- package/dist/navigation-JB2CJXBF.js.map +1 -0
- package/dist/navigation-KTMLD4VB.js +14 -0
- package/dist/{navigation-BARZWXJZ.js.map → navigation-KTMLD4VB.js.map} +1 -1
- package/dist/{not-found-NK6ZFJ7H.js → not-found-ZM6VIELR.js} +25 -23
- package/dist/not-found-ZM6VIELR.js.map +1 -0
- package/dist/providers/index.js +22 -20
- package/dist/routes/account/orders.js +7 -6
- package/dist/routes/account.js +16 -15
- package/dist/routes/account.js.map +1 -1
- package/dist/routes/blog.js +11 -10
- package/dist/routes/blog.js.map +1 -1
- package/dist/routes/brands.js +7 -6
- package/dist/routes/brands.js.map +1 -1
- package/dist/routes/cart.js +30 -28
- package/dist/routes/cart.js.map +1 -1
- package/dist/routes/home/HomePage.d.ts.map +1 -1
- package/dist/routes/home.js +27 -25
- package/dist/routes/index.js +6 -5
- package/dist/routes/loyalty.js +8 -7
- package/dist/routes/loyalty.js.map +1 -1
- package/dist/routes/page.js +7 -6
- package/dist/routes/page.js.map +1 -1
- package/dist/routes/product-listing/index.d.ts +27 -0
- package/dist/routes/product-listing/index.d.ts.map +1 -1
- package/dist/routes/product-listing.js +52 -27
- package/dist/routes/product-listing.js.map +1 -1
- package/dist/routes/product.js +26 -24
- package/dist/routes/product.js.map +1 -1
- package/dist/routes/seo-redirects.js +6 -5
- package/dist/routes/testimonials.js +2 -2
- package/dist/routes/thank-you.js +7 -6
- package/dist/routes/thank-you.js.map +1 -1
- package/dist/skeleton.js +27 -25
- package/dist/store-lookup-T4TK7CKA.js +114 -0
- package/dist/store-lookup-T4TK7CKA.js.map +1 -0
- package/dist/tanstack.js +17 -16
- package/dist/tanstack.js.map +1 -1
- package/dist/utils/index.js +6 -5
- package/dist/utils/index.js.map +1 -1
- package/dist/vite/adapters/tanstack.adapter.d.ts.map +1 -1
- package/dist/vite/index.js +424 -47
- package/dist/vite/index.js.map +1 -1
- package/dist/vite/plugins/twilight-schema.d.ts +7 -2
- package/dist/vite/plugins/twilight-schema.d.ts.map +1 -1
- package/dist/vite/plugins/twilight-schema.plugin.d.ts +26 -0
- package/dist/vite/plugins/twilight-schema.plugin.d.ts.map +1 -1
- package/package.json +5 -1
- package/tailwind/components/common/RenderWhenVisible.tsx.txt +9 -2
- package/tailwind/components/home/HomePageRenderer.tsx.txt +2 -0
- package/tailwind/routes/home/HomePage.tsx.txt +7 -6
- package/tailwind/routes/product-listing/index.tsx.txt +42 -0
- package/dist/BlogAuthorPage-KRT7MRTC.js.map +0 -1
- package/dist/BlogCategoryPage-OP3ETAMT.js.map +0 -1
- package/dist/BlogPage-RGAQVUDI.js.map +0 -1
- package/dist/BlogSinglePage-VG4UXBTL.js.map +0 -1
- package/dist/BlogTagPage-G4IVHJD5.js.map +0 -1
- package/dist/BrandsPage-2JMPPOOU.js.map +0 -1
- package/dist/Breadcrumb-I3ZOGG2Y.js.map +0 -1
- package/dist/CartItem-YTPYETW6.js.map +0 -1
- package/dist/CartSummary-DND7BO26.js.map +0 -1
- package/dist/CustomerLayout-HCYVBODI.js.map +0 -1
- package/dist/Header-QG4UO3MF.js +0 -21
- package/dist/LoyaltyPage-ZMFYQMQY.js.map +0 -1
- package/dist/LoyaltyPointsPage-5PB6IFLY.js.map +0 -1
- package/dist/MainMenu-SAUMNMBF.js.map +0 -1
- package/dist/MobileMenu-2WOWOFQB.js.map +0 -1
- package/dist/NotificationsPage-6FX4SOZU.js.map +0 -1
- package/dist/OrderSinglePage-RUMSJIFD.js.map +0 -1
- package/dist/OrdersPage-B4Q4QIEM.js.map +0 -1
- package/dist/PageSingle-F4TDNKUM.js.map +0 -1
- package/dist/ProductDetails-BNVVUDBH.js.map +0 -1
- package/dist/ProfilePage-OJSAXSC2.js.map +0 -1
- package/dist/RenderWhenVisible-F44J5MMG.js.map +0 -1
- package/dist/SeoCartWidget-4PN2DW54.js.map +0 -1
- package/dist/SettingsPage-BCRNV4GU.js.map +0 -1
- package/dist/TestimonialsPage-YU4PLOLR.js.map +0 -1
- package/dist/ThankYouPage-MUDELEIQ.js.map +0 -1
- package/dist/WalletPage-2I4KTR5E.js.map +0 -1
- package/dist/WishlistPage-7AYL3RUD.js.map +0 -1
- package/dist/chunk-2JV6WZ6O.js +0 -136
- package/dist/chunk-2JV6WZ6O.js.map +0 -1
- package/dist/chunk-C4RXPVDF.js.map +0 -1
- package/dist/chunk-HSWRYXC7.js.map +0 -1
- package/dist/chunk-KZM7HXJ3.js +0 -14
- package/dist/chunk-QGOPTVV5.js.map +0 -1
- package/dist/chunk-RPDMNNRW.js.map +0 -1
- package/dist/chunk-TJF6YZ5I.js.map +0 -1
- package/dist/chunk-Y357MBJI.js.map +0 -1
- package/dist/chunk-ZFNLX3F7.js.map +0 -1
- package/dist/document-class-AJGI7GKJ.js +0 -28
- package/dist/navigation-BARZWXJZ.js +0 -13
- package/dist/navigation-KTFJWOWI.js.map +0 -1
- package/dist/not-found-NK6ZFJ7H.js.map +0 -1
|
@@ -0,0 +1,443 @@
|
|
|
1
|
+
import { EMPTY_PREVIEW_STATE, DEV_LOOKUP_TIMEOUT_MS, isEditorFrame, normalizePreviewState, DEV_PREVIEW_GLOBAL, DEV_PREVIEW_EVENT, DEV_PREVIEW_ENDPOINT } from './chunk-N45X7D55.js';
|
|
2
|
+
import { resolveStoreBase } from './chunk-FO4WVGUQ.js';
|
|
3
|
+
import { useSyncExternalStore, useEffect, useMemo } from 'react';
|
|
4
|
+
|
|
5
|
+
var LEGACY_STORAGE_KEY = "twilight:dev-settings";
|
|
6
|
+
var SAVE_DELAY_MS = 250;
|
|
7
|
+
var CHANNEL_NAME = "twilight:preview";
|
|
8
|
+
var FRAME_MESSAGE = "twilight:editor";
|
|
9
|
+
var FOCUS_WAIT_MS = 2e3;
|
|
10
|
+
var FOCUS_FLASH_MS = 1200;
|
|
11
|
+
var pendingLookups = /* @__PURE__ */ new Map();
|
|
12
|
+
function randomId(bytes = 6) {
|
|
13
|
+
const values = globalThis.crypto.getRandomValues(new Uint8Array(bytes));
|
|
14
|
+
return Array.from(values, (b) => b.toString(16).padStart(2, "0")).join("");
|
|
15
|
+
}
|
|
16
|
+
var tabId;
|
|
17
|
+
function myTabId() {
|
|
18
|
+
tabId ??= randomId();
|
|
19
|
+
return tabId;
|
|
20
|
+
}
|
|
21
|
+
var seedSource;
|
|
22
|
+
var seedState = EMPTY_PREVIEW_STATE;
|
|
23
|
+
function readSeed() {
|
|
24
|
+
const raw = globalThis[DEV_PREVIEW_GLOBAL];
|
|
25
|
+
if (raw !== seedSource) {
|
|
26
|
+
seedSource = raw;
|
|
27
|
+
seedState = normalizePreviewState(raw) ?? EMPTY_PREVIEW_STATE;
|
|
28
|
+
}
|
|
29
|
+
return seedState;
|
|
30
|
+
}
|
|
31
|
+
var SINGLETON_KEY = "__twilightDevSettingsStore__";
|
|
32
|
+
function singleton() {
|
|
33
|
+
const g = globalThis;
|
|
34
|
+
let s = g[SINGLETON_KEY];
|
|
35
|
+
if (!s) {
|
|
36
|
+
const seeded = globalThis[DEV_PREVIEW_GLOBAL] != null;
|
|
37
|
+
s = {
|
|
38
|
+
state: readSeed(),
|
|
39
|
+
listeners: /* @__PURE__ */ new Set(),
|
|
40
|
+
ownBlocks: null,
|
|
41
|
+
meta: { liveBlocks: null, saveStatus: "idle", frameBase: void 0 },
|
|
42
|
+
metaListeners: /* @__PURE__ */ new Set(),
|
|
43
|
+
saveTimer: void 0,
|
|
44
|
+
dirty: false,
|
|
45
|
+
inFlight: false,
|
|
46
|
+
legacyPending: false,
|
|
47
|
+
channel: null,
|
|
48
|
+
getFrame: null,
|
|
49
|
+
dispose: () => {
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
g[SINGLETON_KEY] = s;
|
|
53
|
+
if (typeof window !== "undefined") setUpBrowser(s, seeded);
|
|
54
|
+
}
|
|
55
|
+
return s;
|
|
56
|
+
}
|
|
57
|
+
function setUpBrowser(s, seeded) {
|
|
58
|
+
const listeners = new AbortController();
|
|
59
|
+
const { signal } = listeners;
|
|
60
|
+
if (!seeded) migrateLegacy(s);
|
|
61
|
+
listenForOtherTabs();
|
|
62
|
+
s.channel = openChannel();
|
|
63
|
+
listenForFrameMessages(s, signal);
|
|
64
|
+
window.addEventListener("pagehide", () => flushOnExit(s), { signal });
|
|
65
|
+
s.dispose = () => {
|
|
66
|
+
listeners.abort();
|
|
67
|
+
s.channel?.close();
|
|
68
|
+
clearTimeout(s.saveTimer);
|
|
69
|
+
};
|
|
70
|
+
if (isEditorFrame()) sendToEditor({ kind: "frame-info", base: resolveStoreBase() });
|
|
71
|
+
}
|
|
72
|
+
function migrateLegacy(s) {
|
|
73
|
+
try {
|
|
74
|
+
const raw = window.localStorage.getItem(LEGACY_STORAGE_KEY);
|
|
75
|
+
if (!raw) return;
|
|
76
|
+
const legacy = normalizePreviewState(JSON.parse(raw));
|
|
77
|
+
if (!legacy) return;
|
|
78
|
+
s.state = { enabled: legacy.enabled, settings: legacy.settings, layout: null };
|
|
79
|
+
s.legacyPending = true;
|
|
80
|
+
scheduleSave(s);
|
|
81
|
+
} catch {
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
function receive(raw) {
|
|
85
|
+
const s = singleton();
|
|
86
|
+
if (s.dirty || s.inFlight || s.saveTimer) return;
|
|
87
|
+
const next = normalizePreviewState(raw);
|
|
88
|
+
if (next && JSON.stringify(next) !== JSON.stringify(s.state)) emit(next);
|
|
89
|
+
}
|
|
90
|
+
function listenForOtherTabs() {
|
|
91
|
+
const hot = import.meta.hot;
|
|
92
|
+
if (!hot) return;
|
|
93
|
+
hot.on(DEV_PREVIEW_EVENT, (payload) => {
|
|
94
|
+
if (payload?.from !== myTabId()) receive(payload?.state);
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
function openChannel() {
|
|
98
|
+
if (typeof BroadcastChannel === "undefined") return null;
|
|
99
|
+
const channel = new BroadcastChannel(CHANNEL_NAME);
|
|
100
|
+
channel.onmessage = ({ data }) => {
|
|
101
|
+
if (data && data.from !== myTabId()) receive(data.state);
|
|
102
|
+
};
|
|
103
|
+
return channel;
|
|
104
|
+
}
|
|
105
|
+
function sendToEditor(message) {
|
|
106
|
+
if (isEditorFrame())
|
|
107
|
+
window.parent.postMessage({ type: FRAME_MESSAGE, message }, window.location.origin);
|
|
108
|
+
}
|
|
109
|
+
function sendToFrame(message) {
|
|
110
|
+
singleton().getFrame?.()?.postMessage({ type: FRAME_MESSAGE, message }, window.location.origin);
|
|
111
|
+
}
|
|
112
|
+
function reportToEditor(s) {
|
|
113
|
+
sendToEditor({ kind: "frame-info", base: resolveStoreBase() });
|
|
114
|
+
sendToEditor({ kind: "live-blocks", blocks: s.ownBlocks });
|
|
115
|
+
}
|
|
116
|
+
function listenForFrameMessages(s, signal) {
|
|
117
|
+
window.addEventListener(
|
|
118
|
+
"message",
|
|
119
|
+
(event) => {
|
|
120
|
+
if (event.origin !== window.location.origin || event.data?.type !== FRAME_MESSAGE) return;
|
|
121
|
+
const message = event.data.message;
|
|
122
|
+
if (window.parent !== window && event.source === window.parent) {
|
|
123
|
+
if (message.kind === "request-live-blocks") reportToEditor(s);
|
|
124
|
+
else if (message.kind === "focus-block") scrollToBlock(message.index);
|
|
125
|
+
else if (message.kind === "lookup") void answerLookup(message);
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
const frame = s.getFrame?.();
|
|
129
|
+
if (!frame || event.source !== frame) return;
|
|
130
|
+
if (message.kind === "lookup-result") settleLookup(message);
|
|
131
|
+
else if (message.kind === "live-blocks") setMeta({ liveBlocks: message.blocks });
|
|
132
|
+
else if (message.kind === "frame-info") setMeta({ frameBase: message.base });
|
|
133
|
+
},
|
|
134
|
+
{ signal }
|
|
135
|
+
);
|
|
136
|
+
}
|
|
137
|
+
async function answerLookup(message) {
|
|
138
|
+
const { requestId, source, query } = message;
|
|
139
|
+
try {
|
|
140
|
+
const { lookupInStore } = await import('./store-lookup-T4TK7CKA.js');
|
|
141
|
+
sendToEditor({ kind: "lookup-result", requestId, items: await lookupInStore(source, query) });
|
|
142
|
+
} catch (error) {
|
|
143
|
+
sendToEditor({
|
|
144
|
+
kind: "lookup-result",
|
|
145
|
+
requestId,
|
|
146
|
+
error: error instanceof Error ? error.message : "lookup failed"
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
function settleLookup(message) {
|
|
151
|
+
const pending = pendingLookups.get(message.requestId);
|
|
152
|
+
if (!pending) return;
|
|
153
|
+
pendingLookups.delete(message.requestId);
|
|
154
|
+
clearTimeout(pending.timer);
|
|
155
|
+
if (message.items) pending.resolve(message.items);
|
|
156
|
+
else pending.reject(new Error(message.error ?? "lookup failed"));
|
|
157
|
+
}
|
|
158
|
+
function scrollToBlock(index) {
|
|
159
|
+
const started = Date.now();
|
|
160
|
+
const find = () => {
|
|
161
|
+
const el = document.querySelector(`[data-home-block="${index}"]`);
|
|
162
|
+
if (!el) {
|
|
163
|
+
if (Date.now() - started < FOCUS_WAIT_MS) requestAnimationFrame(find);
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
const { outline, outlineOffset, scrollMarginTop } = el.style;
|
|
167
|
+
el.style.scrollMarginTop = "80px";
|
|
168
|
+
el.scrollIntoView({ behavior: "smooth", block: "start" });
|
|
169
|
+
el.style.outline = "2px solid #0d9488";
|
|
170
|
+
el.style.outlineOffset = "-2px";
|
|
171
|
+
setTimeout(() => {
|
|
172
|
+
el.style.outline = outline;
|
|
173
|
+
el.style.outlineOffset = outlineOffset;
|
|
174
|
+
el.style.scrollMarginTop = scrollMarginTop;
|
|
175
|
+
}, FOCUS_FLASH_MS);
|
|
176
|
+
};
|
|
177
|
+
find();
|
|
178
|
+
}
|
|
179
|
+
function emit(next) {
|
|
180
|
+
const s = singleton();
|
|
181
|
+
s.state = next;
|
|
182
|
+
s.listeners.forEach((l) => l());
|
|
183
|
+
}
|
|
184
|
+
function setMeta(patch) {
|
|
185
|
+
const s = singleton();
|
|
186
|
+
s.meta = { ...s.meta, ...patch };
|
|
187
|
+
s.metaListeners.forEach((l) => l());
|
|
188
|
+
}
|
|
189
|
+
function saveRequest(s, keepalive = false) {
|
|
190
|
+
return fetch(DEV_PREVIEW_ENDPOINT, {
|
|
191
|
+
method: "POST",
|
|
192
|
+
headers: { "content-type": "application/json" },
|
|
193
|
+
body: JSON.stringify({ state: s.state, from: myTabId() }),
|
|
194
|
+
keepalive
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
async function flush(s) {
|
|
198
|
+
if (s.inFlight || !s.dirty) return;
|
|
199
|
+
s.inFlight = true;
|
|
200
|
+
s.dirty = false;
|
|
201
|
+
let failed = false;
|
|
202
|
+
try {
|
|
203
|
+
const res = await saveRequest(s);
|
|
204
|
+
if (!res.ok) throw new Error(`HTTP ${res.status}`);
|
|
205
|
+
if (s.legacyPending) {
|
|
206
|
+
s.legacyPending = false;
|
|
207
|
+
try {
|
|
208
|
+
window.localStorage.removeItem(LEGACY_STORAGE_KEY);
|
|
209
|
+
} catch {
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
if (!s.dirty && !s.saveTimer) setMeta({ saveStatus: "saved" });
|
|
213
|
+
} catch (error) {
|
|
214
|
+
failed = !s.dirty;
|
|
215
|
+
s.dirty = true;
|
|
216
|
+
setMeta({ saveStatus: "error" });
|
|
217
|
+
console.error("[twilight-react:preview] could not save twilight.preview.json", error);
|
|
218
|
+
} finally {
|
|
219
|
+
s.inFlight = false;
|
|
220
|
+
if (!failed && s.dirty && !s.saveTimer) void flush(s);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
function scheduleSave(s) {
|
|
224
|
+
if (typeof window === "undefined" || typeof fetch === "undefined") return;
|
|
225
|
+
s.dirty = true;
|
|
226
|
+
clearTimeout(s.saveTimer);
|
|
227
|
+
setMeta({ saveStatus: "saving" });
|
|
228
|
+
s.saveTimer = setTimeout(() => {
|
|
229
|
+
s.saveTimer = void 0;
|
|
230
|
+
void flush(s);
|
|
231
|
+
}, SAVE_DELAY_MS);
|
|
232
|
+
}
|
|
233
|
+
function flushOnExit(s) {
|
|
234
|
+
if (!s.dirty) return;
|
|
235
|
+
clearTimeout(s.saveTimer);
|
|
236
|
+
s.saveTimer = void 0;
|
|
237
|
+
s.dirty = false;
|
|
238
|
+
void saveRequest(s, true).catch(() => {
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
function commit(next) {
|
|
242
|
+
const s = singleton();
|
|
243
|
+
emit(next);
|
|
244
|
+
try {
|
|
245
|
+
s.channel?.postMessage({ state: next, from: myTabId() });
|
|
246
|
+
} catch {
|
|
247
|
+
}
|
|
248
|
+
scheduleSave(s);
|
|
249
|
+
}
|
|
250
|
+
function newBlockId() {
|
|
251
|
+
return `b-${randomId()}`;
|
|
252
|
+
}
|
|
253
|
+
function blockPath(path) {
|
|
254
|
+
return path.replace(/^home\./, "");
|
|
255
|
+
}
|
|
256
|
+
function updateLayout(update) {
|
|
257
|
+
const { state } = singleton();
|
|
258
|
+
commit({ ...state, layout: update(state.layout ?? []) });
|
|
259
|
+
}
|
|
260
|
+
function blockFor(schema, path) {
|
|
261
|
+
const component = schema.components.find((c) => c.path === path);
|
|
262
|
+
const defaults = schema.blockDefaults?.[path] ?? schema.componentDefaults[path] ?? {};
|
|
263
|
+
return {
|
|
264
|
+
id: newBlockId(),
|
|
265
|
+
path: blockPath(path),
|
|
266
|
+
fields: { ...component?.key ? { key: component.key } : {}, ...defaults }
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
var devSettingsStore = {
|
|
270
|
+
get: () => singleton().state,
|
|
271
|
+
/** What the server rendered: the saved file as of this page load. */
|
|
272
|
+
getServer: () => readSeed(),
|
|
273
|
+
subscribe(listener) {
|
|
274
|
+
const s = singleton();
|
|
275
|
+
s.listeners.add(listener);
|
|
276
|
+
return () => {
|
|
277
|
+
s.listeners.delete(listener);
|
|
278
|
+
};
|
|
279
|
+
},
|
|
280
|
+
/** Turn overrides on, seeding any unset setting with its twilight.json default. */
|
|
281
|
+
enable(schema) {
|
|
282
|
+
const { state } = singleton();
|
|
283
|
+
commit({
|
|
284
|
+
...state,
|
|
285
|
+
enabled: true,
|
|
286
|
+
settings: { ...schema.settingsDefaults, ...state.settings }
|
|
287
|
+
});
|
|
288
|
+
},
|
|
289
|
+
disable() {
|
|
290
|
+
commit({ ...singleton().state, enabled: false });
|
|
291
|
+
},
|
|
292
|
+
setSetting(id, value) {
|
|
293
|
+
const { state } = singleton();
|
|
294
|
+
commit({ ...state, settings: { ...state.settings, [id]: value } });
|
|
295
|
+
},
|
|
296
|
+
/** Restore every setting to its twilight.json default (keeps enabled and the layout). */
|
|
297
|
+
resetSettings(schema) {
|
|
298
|
+
commit({ ...singleton().state, settings: { ...schema.settingsDefaults } });
|
|
299
|
+
},
|
|
300
|
+
// ── Editor ↔ frame ───────────────────────────────────────────────────────
|
|
301
|
+
/** The editor tells the store which window is its storefront frame. */
|
|
302
|
+
connectFrame(getFrame) {
|
|
303
|
+
const s = singleton();
|
|
304
|
+
s.getFrame = getFrame;
|
|
305
|
+
return () => {
|
|
306
|
+
if (s.getFrame === getFrame) s.getFrame = null;
|
|
307
|
+
};
|
|
308
|
+
},
|
|
309
|
+
/** A storefront's home page reports its blocks (`null` when it leaves); in the editor's frame they go to the editor. Not saved. */
|
|
310
|
+
setLiveBlocks(blocks) {
|
|
311
|
+
const s = singleton();
|
|
312
|
+
s.ownBlocks = blocks;
|
|
313
|
+
sendToEditor({ kind: "live-blocks", blocks });
|
|
314
|
+
},
|
|
315
|
+
/** Ask the frame for its home page's blocks and its store base. */
|
|
316
|
+
requestLiveBlocks() {
|
|
317
|
+
sendToFrame({ kind: "request-live-blocks" });
|
|
318
|
+
},
|
|
319
|
+
/**
|
|
320
|
+
* Search the dev store through the editor's frame. Rejects when there is no
|
|
321
|
+
* frame, it doesn't answer in time, or the store refuses; pickers then fall
|
|
322
|
+
* back to samples.
|
|
323
|
+
*/
|
|
324
|
+
lookup(source, query) {
|
|
325
|
+
const frame = singleton().getFrame?.();
|
|
326
|
+
if (!frame) return Promise.reject(new Error("no storefront frame"));
|
|
327
|
+
const requestId = randomId();
|
|
328
|
+
return new Promise((resolve, reject) => {
|
|
329
|
+
const timer = setTimeout(() => {
|
|
330
|
+
pendingLookups.delete(requestId);
|
|
331
|
+
reject(new Error("the storefront did not answer"));
|
|
332
|
+
}, DEV_LOOKUP_TIMEOUT_MS);
|
|
333
|
+
pendingLookups.set(requestId, { resolve, reject, timer });
|
|
334
|
+
sendToFrame({ kind: "lookup", requestId, source, query });
|
|
335
|
+
});
|
|
336
|
+
},
|
|
337
|
+
/** Scroll the editor's frame to the home block at `index`. */
|
|
338
|
+
focusBlock(index) {
|
|
339
|
+
sendToFrame({ kind: "focus-block", index });
|
|
340
|
+
},
|
|
341
|
+
getMeta: () => singleton().meta,
|
|
342
|
+
subscribeMeta(listener) {
|
|
343
|
+
const s = singleton();
|
|
344
|
+
s.metaListeners.add(listener);
|
|
345
|
+
return () => {
|
|
346
|
+
s.metaListeners.delete(listener);
|
|
347
|
+
};
|
|
348
|
+
},
|
|
349
|
+
// ── Home layout ──────────────────────────────────────────────────────────
|
|
350
|
+
/**
|
|
351
|
+
* Take over the home layout. Starts from the blocks the home page showed (the
|
|
352
|
+
* frame's in the editor; an empty page stays empty), otherwise from every
|
|
353
|
+
* twilight.json component.
|
|
354
|
+
*/
|
|
355
|
+
customizeLayout(schema) {
|
|
356
|
+
const s = singleton();
|
|
357
|
+
const live = s.meta.liveBlocks ?? s.ownBlocks;
|
|
358
|
+
const layout = live !== null ? live.filter((block) => typeof block.path === "string").filter((block) => block.path !== "").map(({ path, ...fields }) => ({ id: newBlockId(), path: blockPath(path), fields })) : schema.components.map((component) => blockFor(schema, component.path));
|
|
359
|
+
commit({ ...s.state, enabled: true, layout });
|
|
360
|
+
},
|
|
361
|
+
startEmptyLayout() {
|
|
362
|
+
commit({ ...singleton().state, enabled: true, layout: [] });
|
|
363
|
+
},
|
|
364
|
+
/** Back to the store's own blocks. */
|
|
365
|
+
clearLayout() {
|
|
366
|
+
commit({ ...singleton().state, layout: null });
|
|
367
|
+
},
|
|
368
|
+
/** Insert a twilight.json component at `at` (default: the end); returns the new block's id. */
|
|
369
|
+
addBlock(schema, path, at) {
|
|
370
|
+
const block = blockFor(schema, path);
|
|
371
|
+
updateLayout((layout) => {
|
|
372
|
+
const next = [...layout];
|
|
373
|
+
next.splice(at ?? next.length, 0, block);
|
|
374
|
+
return next;
|
|
375
|
+
});
|
|
376
|
+
return block.id;
|
|
377
|
+
},
|
|
378
|
+
removeBlock(id) {
|
|
379
|
+
updateLayout((layout) => layout.filter((block) => block.id !== id));
|
|
380
|
+
},
|
|
381
|
+
duplicateBlock(id) {
|
|
382
|
+
updateLayout((layout) => {
|
|
383
|
+
const index = layout.findIndex((block) => block.id === id);
|
|
384
|
+
if (index === -1) return layout;
|
|
385
|
+
const copy = { ...layout[index], id: newBlockId(), fields: { ...layout[index].fields } };
|
|
386
|
+
return [...layout.slice(0, index + 1), copy, ...layout.slice(index + 1)];
|
|
387
|
+
});
|
|
388
|
+
},
|
|
389
|
+
/** Move a block to index `to` (its position after the move). */
|
|
390
|
+
moveBlock(id, to) {
|
|
391
|
+
updateLayout((layout) => {
|
|
392
|
+
const from = layout.findIndex((block2) => block2.id === id);
|
|
393
|
+
if (from === -1) return layout;
|
|
394
|
+
const target = Math.max(0, Math.min(to, layout.length - 1));
|
|
395
|
+
if (target === from) return layout;
|
|
396
|
+
const next = [...layout];
|
|
397
|
+
const [block] = next.splice(from, 1);
|
|
398
|
+
next.splice(target, 0, block);
|
|
399
|
+
return next;
|
|
400
|
+
});
|
|
401
|
+
},
|
|
402
|
+
setBlockField(id, fieldId, value) {
|
|
403
|
+
updateLayout(
|
|
404
|
+
(layout) => layout.map(
|
|
405
|
+
(block) => block.id === id ? { ...block, fields: { ...block.fields, [fieldId]: value } } : block
|
|
406
|
+
)
|
|
407
|
+
);
|
|
408
|
+
}
|
|
409
|
+
};
|
|
410
|
+
var SERVER_META = { liveBlocks: null, saveStatus: "idle", frameBase: void 0 };
|
|
411
|
+
function useDevEditorMeta() {
|
|
412
|
+
return useSyncExternalStore(
|
|
413
|
+
devSettingsStore.subscribeMeta,
|
|
414
|
+
devSettingsStore.getMeta,
|
|
415
|
+
() => SERVER_META
|
|
416
|
+
);
|
|
417
|
+
}
|
|
418
|
+
function useDevSettingsState() {
|
|
419
|
+
return useSyncExternalStore(
|
|
420
|
+
devSettingsStore.subscribe,
|
|
421
|
+
devSettingsStore.get,
|
|
422
|
+
devSettingsStore.getServer
|
|
423
|
+
);
|
|
424
|
+
}
|
|
425
|
+
var useDevSettingsOverrides = import.meta.env.DEV ? useDevSettingsState : () => EMPTY_PREVIEW_STATE;
|
|
426
|
+
function useDevLayoutBlocks(components) {
|
|
427
|
+
const overrides = useDevSettingsState();
|
|
428
|
+
useEffect(() => {
|
|
429
|
+
devSettingsStore.setLiveBlocks(components);
|
|
430
|
+
return () => devSettingsStore.setLiveBlocks(null);
|
|
431
|
+
}, [components]);
|
|
432
|
+
return useMemo(() => {
|
|
433
|
+
if (!overrides.enabled || !overrides.layout) return components;
|
|
434
|
+
return overrides.layout.map(
|
|
435
|
+
(block) => ({ ...block.fields, path: block.path, __dev_id: block.id })
|
|
436
|
+
);
|
|
437
|
+
}, [components, overrides]);
|
|
438
|
+
}
|
|
439
|
+
var useDevHomeBlocks = import.meta.env.DEV ? useDevLayoutBlocks : (components) => components;
|
|
440
|
+
|
|
441
|
+
export { blockPath, devSettingsStore, useDevEditorMeta, useDevHomeBlocks, useDevSettingsOverrides, useDevSettingsState };
|
|
442
|
+
//# sourceMappingURL=chunk-COJH52VR.js.map
|
|
443
|
+
//# sourceMappingURL=chunk-COJH52VR.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/dev/dev-settings-store.ts"],"names":["block"],"mappings":"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","file":"chunk-COJH52VR.js","sourcesContent":["/**\n * Client-side store for the dev editor: theme-setting overrides and a dev-owned\n * home layout. Saved to `twilight.preview.json` through the dev server (see\n * `twilight-schema.plugin.ts`), not to localStorage, for three reasons: the\n * server render can read a file, so the page hydrates with the edited layout\n * instead of flashing the store's; the state survives a port or browser\n * change; and the developer can open, diff or delete it.\n *\n * The saved state reaches this module through `virtual:twilight/schema`, which\n * the root route imports on both sides before anything renders and which puts\n * it on `globalThis[DEV_PREVIEW_GLOBAL]`. Server snapshots read that value\n * (the server's modules are re-run after each save); the browser copies it once\n * and then owns the state.\n *\n * The theme editor (`/__twilight/editor`) frames the storefront, so two copies\n * of this store run side by side. Edits reach every copy on the origin at once\n * over a `BroadcastChannel` (the file save is debounced), and only the copy\n * that made an edit saves it. Everything else between an editor and its frame\n * (the home page's blocks, the store base, scroll-to-block) goes by\n * `postMessage` to that one window, so another storefront tab never answers.\n */\n\nimport { useEffect, useMemo, useSyncExternalStore } from 'react';\nimport {\n DEV_LOOKUP_TIMEOUT_MS,\n DEV_PREVIEW_ENDPOINT,\n DEV_PREVIEW_EVENT,\n DEV_PREVIEW_GLOBAL,\n EMPTY_PREVIEW_STATE,\n isEditorFrame,\n normalizePreviewState,\n type DevLookupItem,\n type DevLookupSource,\n type DevPreviewBlock,\n type DevPreviewState,\n type DevSchema,\n} from './schema-types';\nimport { resolveStoreBase } from '../utils/store-identity';\n\nexport type DevSettingsState = DevPreviewState;\nexport type DevSaveStatus = 'idle' | 'saving' | 'saved' | 'error';\ntype LiveBlocks = { path?: string }[];\n\n/** Where the old localStorage-backed widget kept its state; migrated once. */\nconst LEGACY_STORAGE_KEY = 'twilight:dev-settings';\n/** Batch keystrokes into one write. */\nconst SAVE_DELAY_MS = 250;\n/** Same-browser channel every copy of the store listens on, for edits. */\nconst CHANNEL_NAME = 'twilight:preview';\n/** Envelope type of the editor ↔ frame `postMessage`s. */\nconst FRAME_MESSAGE = 'twilight:editor';\n/** How long the frame keeps looking for a block that is still rendering (just added, say). */\nconst FOCUS_WAIT_MS = 2000;\nconst FOCUS_FLASH_MS = 1200;\n\n/** Editor ↔ the storefront it frames. */\ntype FrameMessage =\n | { kind: 'live-blocks'; blocks: LiveBlocks | null }\n | { kind: 'frame-info'; base: string | null }\n | { kind: 'request-live-blocks' }\n | { kind: 'focus-block'; index: number }\n | { kind: 'lookup'; requestId: string; source: DevLookupSource; query: string }\n | { kind: 'lookup-result'; requestId: string; items?: DevLookupItem[]; error?: string };\n\ninterface PendingLookup {\n resolve: (items: DevLookupItem[]) => void;\n reject: (error: Error) => void;\n timer: ReturnType<typeof setTimeout>;\n}\nconst pendingLookups = new Map<string, PendingLookup>();\n\n/** What the editor shows besides the saved state. */\nexport interface DevEditorMeta {\n /** The blocks the framed home page shows; `null` when it is not on the home page. */\n liveBlocks: LiveBlocks | null;\n saveStatus: DevSaveStatus;\n /** The frame's store segment; `undefined` until the frame has said. */\n frameBase: string | null | undefined;\n}\n\n/**\n * A short random hex id. `getRandomValues`, not `randomUUID`: the latter only\n * exists in secure contexts, and the dev server may be opened on a LAN address.\n */\nfunction randomId(bytes = 6): string {\n const values = globalThis.crypto.getRandomValues(new Uint8Array(bytes));\n return Array.from(values, (b) => b.toString(16).padStart(2, '0')).join('');\n}\n\nlet tabId: string | undefined;\n\n/**\n * Sent with every save so this tab can ignore its own broadcast. Made on first\n * use, never at module load: Cloudflare Workers refuse random values in global\n * scope, and this module is in the worker bundle (its use is dev-only, its\n * top level is not).\n */\nfunction myTabId(): string {\n tabId ??= randomId();\n return tabId;\n}\n\nlet seedSource: unknown;\nlet seedState: DevPreviewState = EMPTY_PREVIEW_STATE;\n\n/** The saved file as this page loaded it, normalized once per value so snapshots keep their identity. */\nfunction readSeed(): DevPreviewState {\n const raw = (globalThis as Record<string, unknown>)[DEV_PREVIEW_GLOBAL];\n if (raw !== seedSource) {\n seedSource = raw;\n seedState = normalizePreviewState(raw) ?? EMPTY_PREVIEW_STATE;\n }\n return seedState;\n}\n\n// The widget (bundled into the `/dev` entry) and the theme merge (bundled into\n// the engine index via `useTwilightInit`) import this module from two different\n// chunks, so each would otherwise get its OWN copy of the state — the widget\n// would enable a store the merge never reads. Back the state with a single\n// globalThis-keyed instance so every copy shares one source of truth. Dev-only,\n// so a global is acceptable (and lazy, so the module stays side-effect free and\n// tree-shakes out of production).\ninterface DevStoreSingleton {\n state: DevPreviewState;\n listeners: Set<() => void>;\n /** This page's own home blocks, when it is a storefront on its home page. Never saved. */\n ownBlocks: LiveBlocks | null;\n meta: DevEditorMeta;\n metaListeners: Set<() => void>;\n saveTimer: ReturnType<typeof setTimeout> | undefined;\n /** An edit that has not been sent yet. */\n dirty: boolean;\n /** A save request on its way; the next one waits for it, so saves land in order. */\n inFlight: boolean;\n /** The old localStorage copy is removed only once the file has the migrated values. */\n legacyPending: boolean;\n channel: BroadcastChannel | null;\n /** In the editor: the storefront frame's window. */\n getFrame: (() => Window | null) | null;\n /** Detach this copy's listeners and channel. A page keeps one copy for good; tests swap them. */\n dispose: () => void;\n}\n\nconst SINGLETON_KEY = '__twilightDevSettingsStore__';\n\nfunction singleton(): DevStoreSingleton {\n const g = globalThis as unknown as Record<string, DevStoreSingleton | undefined>;\n let s = g[SINGLETON_KEY];\n if (!s) {\n const seeded = (globalThis as Record<string, unknown>)[DEV_PREVIEW_GLOBAL] != null;\n s = {\n state: readSeed(),\n listeners: new Set(),\n ownBlocks: null,\n meta: { liveBlocks: null, saveStatus: 'idle', frameBase: undefined },\n metaListeners: new Set(),\n saveTimer: undefined,\n dirty: false,\n inFlight: false,\n legacyPending: false,\n channel: null,\n getFrame: null,\n dispose: () => {},\n };\n g[SINGLETON_KEY] = s;\n if (typeof window !== 'undefined') setUpBrowser(s, seeded);\n }\n return s;\n}\n\nfunction setUpBrowser(s: DevStoreSingleton, seeded: boolean): void {\n const listeners = new AbortController();\n const { signal } = listeners;\n if (!seeded) migrateLegacy(s);\n listenForOtherTabs();\n s.channel = openChannel();\n listenForFrameMessages(s, signal);\n window.addEventListener('pagehide', () => flushOnExit(s), { signal });\n s.dispose = () => {\n listeners.abort();\n s.channel?.close();\n clearTimeout(s.saveTimer);\n };\n if (isEditorFrame()) sendToEditor({ kind: 'frame-info', base: resolveStoreBase() });\n}\n\n/** Carry the old widget's settings over; its per-block patches don't map to a layout. */\nfunction migrateLegacy(s: DevStoreSingleton): void {\n try {\n const raw = window.localStorage.getItem(LEGACY_STORAGE_KEY);\n if (!raw) return;\n const legacy = normalizePreviewState(JSON.parse(raw));\n if (!legacy) return;\n s.state = { enabled: legacy.enabled, settings: legacy.settings, layout: null };\n s.legacyPending = true;\n scheduleSave(s);\n } catch {\n // Storage blocked or the old value is corrupt: nothing worth keeping.\n }\n}\n\n/** Vite's HMR client, typed locally: the engine's `ImportMeta` must not clash with `vite/client`. */\ninterface HotContext {\n on(event: string, cb: (payload: { state?: unknown; from?: unknown }) => void): void;\n}\n\n/**\n * Take a state another copy committed. Not while this copy has an edit of its\n * own waiting to be saved: that edit is newer, and saving it will tell the rest.\n */\nfunction receive(raw: unknown): void {\n const s = singleton();\n if (s.dirty || s.inFlight || s.saveTimer) return;\n const next = normalizePreviewState(raw);\n if (next && JSON.stringify(next) !== JSON.stringify(s.state)) emit(next);\n}\n\n/** Tabs in another browser hear about a save from the dev server. */\nfunction listenForOtherTabs(): void {\n const hot = (import.meta as ImportMeta & { hot?: HotContext }).hot;\n if (!hot) return;\n hot.on(DEV_PREVIEW_EVENT, (payload) => {\n if (payload?.from !== myTabId()) receive(payload?.state);\n });\n}\n\nfunction openChannel(): BroadcastChannel | null {\n if (typeof BroadcastChannel === 'undefined') return null;\n const channel = new BroadcastChannel(CHANNEL_NAME);\n channel.onmessage = ({ data }: MessageEvent<{ state?: unknown; from?: string }>) => {\n if (data && data.from !== myTabId()) receive(data.state);\n };\n return channel;\n}\n\nfunction sendToEditor(message: FrameMessage): void {\n if (isEditorFrame())\n window.parent.postMessage({ type: FRAME_MESSAGE, message }, window.location.origin);\n}\n\nfunction sendToFrame(message: FrameMessage): void {\n singleton().getFrame?.()?.postMessage({ type: FRAME_MESSAGE, message }, window.location.origin);\n}\n\nfunction reportToEditor(s: DevStoreSingleton): void {\n sendToEditor({ kind: 'frame-info', base: resolveStoreBase() });\n sendToEditor({ kind: 'live-blocks', blocks: s.ownBlocks });\n}\n\n/**\n * The editor ↔ frame conversation. A frame only takes requests from its own\n * parent; an editor only takes reports from the frame it shows.\n */\nfunction listenForFrameMessages(s: DevStoreSingleton, signal: AbortSignal): void {\n window.addEventListener(\n 'message',\n (event: MessageEvent) => {\n if (event.origin !== window.location.origin || event.data?.type !== FRAME_MESSAGE) return;\n const message = event.data.message as FrameMessage;\n if (window.parent !== window && event.source === window.parent) {\n if (message.kind === 'request-live-blocks') reportToEditor(s);\n else if (message.kind === 'focus-block') scrollToBlock(message.index);\n else if (message.kind === 'lookup') void answerLookup(message);\n return;\n }\n const frame = s.getFrame?.();\n if (!frame || event.source !== frame) return;\n if (message.kind === 'lookup-result') settleLookup(message);\n else if (message.kind === 'live-blocks') setMeta({ liveBlocks: message.blocks });\n else if (message.kind === 'frame-info') setMeta({ frameBase: message.base });\n },\n { signal }\n );\n}\n\n/** In the frame: look the request up in the store and send back what was found, or why not. */\nasync function answerLookup(message: Extract<FrameMessage, { kind: 'lookup' }>): Promise<void> {\n const { requestId, source, query } = message;\n try {\n const { lookupInStore } = await import('./store-lookup');\n sendToEditor({ kind: 'lookup-result', requestId, items: await lookupInStore(source, query) });\n } catch (error) {\n sendToEditor({\n kind: 'lookup-result',\n requestId,\n error: error instanceof Error ? error.message : 'lookup failed',\n });\n }\n}\n\nfunction settleLookup(message: Extract<FrameMessage, { kind: 'lookup-result' }>): void {\n const pending = pendingLookups.get(message.requestId);\n if (!pending) return;\n pendingLookups.delete(message.requestId);\n clearTimeout(pending.timer);\n if (message.items) pending.resolve(message.items);\n else pending.reject(new Error(message.error ?? 'lookup failed'));\n}\n\n/**\n * In the editor's frame: bring a home block into view and flash an outline on\n * it. Dev-only editor chrome, so it styles the element directly rather than\n * through the theme's React tree. A block added a moment ago may not be in the\n * DOM yet, so look for it for a little while.\n */\nfunction scrollToBlock(index: number): void {\n const started = Date.now();\n const find = () => {\n const el = document.querySelector<HTMLElement>(`[data-home-block=\"${index}\"]`);\n if (!el) {\n if (Date.now() - started < FOCUS_WAIT_MS) requestAnimationFrame(find);\n return;\n }\n const { outline, outlineOffset, scrollMarginTop } = el.style;\n // Clear a sticky header, which would otherwise cover the block's top.\n el.style.scrollMarginTop = '80px';\n el.scrollIntoView({ behavior: 'smooth', block: 'start' });\n el.style.outline = '2px solid #0d9488';\n el.style.outlineOffset = '-2px';\n setTimeout(() => {\n el.style.outline = outline;\n el.style.outlineOffset = outlineOffset;\n el.style.scrollMarginTop = scrollMarginTop;\n }, FOCUS_FLASH_MS);\n };\n find();\n}\n\nfunction emit(next: DevPreviewState): void {\n const s = singleton();\n s.state = next;\n s.listeners.forEach((l) => l());\n}\n\nfunction setMeta(patch: Partial<DevEditorMeta>): void {\n const s = singleton();\n s.meta = { ...s.meta, ...patch };\n s.metaListeners.forEach((l) => l());\n}\n\nfunction saveRequest(s: DevStoreSingleton, keepalive = false): Promise<Response> {\n return fetch(DEV_PREVIEW_ENDPOINT, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ state: s.state, from: myTabId() }),\n keepalive,\n });\n}\n\n/** Send the current state, one request at a time; edits made meanwhile go in the next one. */\nasync function flush(s: DevStoreSingleton): Promise<void> {\n if (s.inFlight || !s.dirty) return;\n s.inFlight = true;\n s.dirty = false;\n let failed = false;\n try {\n const res = await saveRequest(s);\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n if (s.legacyPending) {\n s.legacyPending = false;\n try {\n window.localStorage.removeItem(LEGACY_STORAGE_KEY);\n } catch {\n // Storage went away; the file has the values now either way.\n }\n }\n if (!s.dirty && !s.saveTimer) setMeta({ saveStatus: 'saved' });\n } catch (error) {\n // Still unsaved: another tab's state must not replace it, and leaving the\n // page still sends it. Edits made while this request was out are sent once\n // more; the failed one alone waits for the next edit, so nothing loops.\n failed = !s.dirty;\n s.dirty = true;\n setMeta({ saveStatus: 'error' });\n console.error('[twilight-react:preview] could not save twilight.preview.json', error);\n } finally {\n s.inFlight = false;\n if (!failed && s.dirty && !s.saveTimer) void flush(s);\n }\n}\n\nfunction scheduleSave(s: DevStoreSingleton): void {\n if (typeof window === 'undefined' || typeof fetch === 'undefined') return;\n s.dirty = true;\n clearTimeout(s.saveTimer);\n setMeta({ saveStatus: 'saving' });\n s.saveTimer = setTimeout(() => {\n s.saveTimer = undefined;\n void flush(s);\n }, SAVE_DELAY_MS);\n}\n\n/** Closing or reloading the editor must not drop the last edit: send it on the way out. */\nfunction flushOnExit(s: DevStoreSingleton): void {\n if (!s.dirty) return;\n clearTimeout(s.saveTimer);\n s.saveTimer = undefined;\n s.dirty = false;\n void saveRequest(s, true).catch(() => {});\n}\n\nfunction commit(next: DevPreviewState): void {\n const s = singleton();\n emit(next);\n try {\n s.channel?.postMessage({ state: next, from: myTabId() });\n } catch {\n // A value that can't be cloned: the other copies pick it up from the save instead.\n }\n scheduleSave(s);\n}\n\nfunction newBlockId(): string {\n return `b-${randomId()}`;\n}\n\n/** Home loader spelling of a twilight.json path. */\nexport function blockPath(path: string): string {\n return path.replace(/^home\\./, '');\n}\n\nfunction updateLayout(update: (layout: DevPreviewBlock[]) => DevPreviewBlock[]): void {\n const { state } = singleton();\n commit({ ...state, layout: update(state.layout ?? []) });\n}\n\n/** A new block for a twilight.json component, filled with its defaults. */\nfunction blockFor(schema: DevSchema, path: string): DevPreviewBlock {\n const component = schema.components.find((c) => c.path === path);\n const defaults = schema.blockDefaults?.[path] ?? schema.componentDefaults[path] ?? {};\n return {\n id: newBlockId(),\n path: blockPath(path),\n fields: { ...(component?.key ? { key: component.key } : {}), ...defaults },\n };\n}\n\nexport const devSettingsStore = {\n get: (): DevPreviewState => singleton().state,\n /** What the server rendered: the saved file as of this page load. */\n getServer: (): DevPreviewState => readSeed(),\n subscribe(listener: () => void): () => void {\n const s = singleton();\n s.listeners.add(listener);\n return () => {\n s.listeners.delete(listener);\n };\n },\n /** Turn overrides on, seeding any unset setting with its twilight.json default. */\n enable(schema: DevSchema): void {\n const { state } = singleton();\n commit({\n ...state,\n enabled: true,\n settings: { ...schema.settingsDefaults, ...state.settings },\n });\n },\n disable(): void {\n commit({ ...singleton().state, enabled: false });\n },\n setSetting(id: string, value: unknown): void {\n const { state } = singleton();\n commit({ ...state, settings: { ...state.settings, [id]: value } });\n },\n /** Restore every setting to its twilight.json default (keeps enabled and the layout). */\n resetSettings(schema: DevSchema): void {\n commit({ ...singleton().state, settings: { ...schema.settingsDefaults } });\n },\n\n // ── Editor ↔ frame ───────────────────────────────────────────────────────\n\n /** The editor tells the store which window is its storefront frame. */\n connectFrame(getFrame: () => Window | null): () => void {\n const s = singleton();\n s.getFrame = getFrame;\n return () => {\n if (s.getFrame === getFrame) s.getFrame = null;\n };\n },\n /** A storefront's home page reports its blocks (`null` when it leaves); in the editor's frame they go to the editor. Not saved. */\n setLiveBlocks(blocks: LiveBlocks | null): void {\n const s = singleton();\n s.ownBlocks = blocks;\n sendToEditor({ kind: 'live-blocks', blocks });\n },\n /** Ask the frame for its home page's blocks and its store base. */\n requestLiveBlocks(): void {\n sendToFrame({ kind: 'request-live-blocks' });\n },\n /**\n * Search the dev store through the editor's frame. Rejects when there is no\n * frame, it doesn't answer in time, or the store refuses; pickers then fall\n * back to samples.\n */\n lookup(source: DevLookupSource, query: string): Promise<DevLookupItem[]> {\n const frame = singleton().getFrame?.();\n if (!frame) return Promise.reject(new Error('no storefront frame'));\n const requestId = randomId();\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n pendingLookups.delete(requestId);\n reject(new Error('the storefront did not answer'));\n }, DEV_LOOKUP_TIMEOUT_MS);\n pendingLookups.set(requestId, { resolve, reject, timer });\n sendToFrame({ kind: 'lookup', requestId, source, query });\n });\n },\n /** Scroll the editor's frame to the home block at `index`. */\n focusBlock(index: number): void {\n sendToFrame({ kind: 'focus-block', index });\n },\n getMeta: (): DevEditorMeta => singleton().meta,\n subscribeMeta(listener: () => void): () => void {\n const s = singleton();\n s.metaListeners.add(listener);\n return () => {\n s.metaListeners.delete(listener);\n };\n },\n\n // ── Home layout ──────────────────────────────────────────────────────────\n\n /**\n * Take over the home layout. Starts from the blocks the home page showed (the\n * frame's in the editor; an empty page stays empty), otherwise from every\n * twilight.json component.\n */\n customizeLayout(schema: DevSchema): void {\n const s = singleton();\n const live = s.meta.liveBlocks ?? s.ownBlocks;\n const layout: DevPreviewBlock[] =\n live !== null\n ? live\n .filter((block): block is { path: string } => typeof block.path === 'string')\n .filter((block) => block.path !== '')\n .map(({ path, ...fields }) => ({ id: newBlockId(), path: blockPath(path), fields }))\n : schema.components.map((component) => blockFor(schema, component.path));\n commit({ ...s.state, enabled: true, layout });\n },\n startEmptyLayout(): void {\n commit({ ...singleton().state, enabled: true, layout: [] });\n },\n /** Back to the store's own blocks. */\n clearLayout(): void {\n commit({ ...singleton().state, layout: null });\n },\n /** Insert a twilight.json component at `at` (default: the end); returns the new block's id. */\n addBlock(schema: DevSchema, path: string, at?: number): string {\n const block = blockFor(schema, path);\n updateLayout((layout) => {\n const next = [...layout];\n next.splice(at ?? next.length, 0, block);\n return next;\n });\n return block.id;\n },\n removeBlock(id: string): void {\n updateLayout((layout) => layout.filter((block) => block.id !== id));\n },\n duplicateBlock(id: string): void {\n updateLayout((layout) => {\n const index = layout.findIndex((block) => block.id === id);\n if (index === -1) return layout;\n const copy = { ...layout[index], id: newBlockId(), fields: { ...layout[index].fields } };\n return [...layout.slice(0, index + 1), copy, ...layout.slice(index + 1)];\n });\n },\n /** Move a block to index `to` (its position after the move). */\n moveBlock(id: string, to: number): void {\n updateLayout((layout) => {\n const from = layout.findIndex((block) => block.id === id);\n if (from === -1) return layout;\n const target = Math.max(0, Math.min(to, layout.length - 1));\n if (target === from) return layout;\n const next = [...layout];\n const [block] = next.splice(from, 1);\n next.splice(target, 0, block);\n return next;\n });\n },\n setBlockField(id: string, fieldId: string, value: unknown): void {\n updateLayout((layout) =>\n layout.map((block) =>\n block.id === id ? { ...block, fields: { ...block.fields, [fieldId]: value } } : block\n )\n );\n },\n};\n\nconst SERVER_META: DevEditorMeta = { liveBlocks: null, saveStatus: 'idle', frameBase: undefined };\n\n/** The frame's blocks and store base, and the save status, for the editor. */\nexport function useDevEditorMeta(): DevEditorMeta {\n return useSyncExternalStore(\n devSettingsStore.subscribeMeta,\n devSettingsStore.getMeta,\n () => SERVER_META\n );\n}\n\n/** Raw store subscription. */\nexport function useDevSettingsState(): DevPreviewState {\n return useSyncExternalStore(\n devSettingsStore.subscribe,\n devSettingsStore.get,\n devSettingsStore.getServer\n );\n}\n\n/**\n * Overrides for SSR-rendered consumers (the theme). The server and the first\n * browser render both read the saved file, so they agree and nothing flashes.\n *\n * Which hook this is gets decided once, when the module loads: in production\n * `import.meta.env.DEV` is a static `false`, so only the empty one survives\n * bundling and the store subscription (and the whole store module, which has\n * no other prod consumer) is dead-code-eliminated. No hook is ever called\n * conditionally.\n */\nexport const useDevSettingsOverrides: () => DevPreviewState = import.meta.env.DEV\n ? useDevSettingsState\n : () => EMPTY_PREVIEW_STATE;\n\n/** A rendered home block; `__dev_id` keys a dev-layout block across reorders. */\nexport type DevHomeBlock<T> = T & { __dev_id?: string };\n\n/**\n * The home page's blocks: the dev layout when one is saved and enabled, else\n * the store's own blocks untouched. Also reports the store's blocks to the\n * editor so \"Customize\" can start from what the page showed, and withdraws\n * them when the page goes.\n *\n * Same production story as {@link useDevSettingsOverrides}: chosen once at\n * module load, so production keeps only the passthrough.\n */\nfunction useDevLayoutBlocks<T extends { path?: string }>(components: T[]): DevHomeBlock<T>[] {\n const overrides = useDevSettingsState();\n useEffect(() => {\n devSettingsStore.setLiveBlocks(components);\n return () => devSettingsStore.setLiveBlocks(null);\n }, [components]);\n return useMemo(() => {\n if (!overrides.enabled || !overrides.layout) return components;\n return overrides.layout.map(\n (block) => ({ ...block.fields, path: block.path, __dev_id: block.id }) as DevHomeBlock<T>\n );\n }, [components, overrides]);\n}\n\nexport const useDevHomeBlocks: <T extends { path?: string }>(components: T[]) => DevHomeBlock<T>[] =\n import.meta.env.DEV ? useDevLayoutBlocks : (components) => components;\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { api } from './chunk-
|
|
1
|
+
import { api } from './chunk-6EQ7G3SZ.js';
|
|
2
2
|
import { queryOptions } from '@tanstack/react-query';
|
|
3
3
|
|
|
4
4
|
var notification = {
|
|
@@ -24,5 +24,5 @@ var notification = {
|
|
|
24
24
|
};
|
|
25
25
|
|
|
26
26
|
export { notification };
|
|
27
|
-
//# sourceMappingURL=chunk-
|
|
28
|
-
//# sourceMappingURL=chunk-
|
|
27
|
+
//# sourceMappingURL=chunk-D56TVNOG.js.map
|
|
28
|
+
//# sourceMappingURL=chunk-D56TVNOG.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/api/notification.ts"],"names":[],"mappings":";;;AAcO,IAAM,YAAA,GAAe;AAAA,EAC1B,MAAM,YAAgD;AACpD,IAAA,MAAM,WAAW,MAAM,GAAA,CACpB,GAAA,CAAI,eAAe,EACnB,IAAA,EAAmF;AACtF,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,QAAA,CAAS,IAAA,IAAQ,EAAC;AAAA,MACxB,QAAQ,QAAA,CAAS;AAAA,KACnB;AAAA,EACF,CAAA;AAAA,EAEA,UAAA,EAAY,OAAO,EAAA,KAA8B;AAC/C,IAAA,MAAM,IAAI,GAAA,CAAI,CAAA,cAAA,EAAiB,EAAE,CAAA,KAAA,CAAO,EAAE,IAAA,EAAK;AAAA,EACjD,CAAA;AAAA,EAEA,eAAe,YAA2B;AACxC,IAAA,MAAM,GAAA,CAAI,GAAA,CAAI,wBAAwB,CAAA,CAAE,IAAA,EAAK;AAAA,EAC/C,CAAA;AAAA,EAEA,OAAA,EAAS;AAAA,IACP,IAAA,EAAM,MACJ,YAAA,CAAa;AAAA,MACX,QAAA,EAAU,CAAC,eAAA,EAAiB,MAAM,CAAA;AAAA,MAClC,OAAA,EAAS,MAAM,YAAA,CAAa,IAAA;AAAK,KAClC;AAAA;AAEP","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/api/notification.ts"],"names":[],"mappings":";;;AAcO,IAAM,YAAA,GAAe;AAAA,EAC1B,MAAM,YAAgD;AACpD,IAAA,MAAM,WAAW,MAAM,GAAA,CACpB,GAAA,CAAI,eAAe,EACnB,IAAA,EAAmF;AACtF,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,QAAA,CAAS,IAAA,IAAQ,EAAC;AAAA,MACxB,QAAQ,QAAA,CAAS;AAAA,KACnB;AAAA,EACF,CAAA;AAAA,EAEA,UAAA,EAAY,OAAO,EAAA,KAA8B;AAC/C,IAAA,MAAM,IAAI,GAAA,CAAI,CAAA,cAAA,EAAiB,EAAE,CAAA,KAAA,CAAO,EAAE,IAAA,EAAK;AAAA,EACjD,CAAA;AAAA,EAEA,eAAe,YAA2B;AACxC,IAAA,MAAM,GAAA,CAAI,GAAA,CAAI,wBAAwB,CAAA,CAAE,IAAA,EAAK;AAAA,EAC/C,CAAA;AAAA,EAEA,OAAA,EAAS;AAAA,IACP,IAAA,EAAM,MACJ,YAAA,CAAa;AAAA,MACX,QAAA,EAAU,CAAC,eAAA,EAAiB,MAAM,CAAA;AAAA,MAClC,OAAA,EAAS,MAAM,YAAA,CAAa,IAAA;AAAK,KAClC;AAAA;AAEP","file":"chunk-D56TVNOG.js","sourcesContent":["import { queryOptions } from '@tanstack/react-query';\nimport { api } from './client';\nimport type { Notification } from '../routes/account/notifications/types';\n\nexport interface NotificationsListResponse {\n data: Notification[];\n cursor: {\n current: number;\n previous: number | null;\n next: number | null;\n count: number;\n };\n}\n\nexport const notification = {\n list: async (): Promise<NotificationsListResponse> => {\n const response = await api\n .get('notifications')\n .json<{ data: Notification[] | null; cursor: NotificationsListResponse['cursor'] }>();\n return {\n data: response.data ?? [],\n cursor: response.cursor,\n };\n },\n\n markAsRead: async (id: number): Promise<void> => {\n await api.put(`notifications/${id}/read`).json();\n },\n\n markAllAsRead: async (): Promise<void> => {\n await api.put('notifications/read-all').json();\n },\n\n queries: {\n list: () =>\n queryOptions({\n queryKey: ['notifications', 'list'],\n queryFn: () => notification.list(),\n }),\n },\n};\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { orThrow } from './chunk-
|
|
2
|
-
import { api } from './chunk-
|
|
1
|
+
import { orThrow } from './chunk-RWBTMHLR.js';
|
|
2
|
+
import { api } from './chunk-6EQ7G3SZ.js';
|
|
3
3
|
import { queryOptions } from '@tanstack/react-query';
|
|
4
4
|
|
|
5
5
|
var page = {
|
|
@@ -17,5 +17,5 @@ var page = {
|
|
|
17
17
|
};
|
|
18
18
|
|
|
19
19
|
export { page };
|
|
20
|
-
//# sourceMappingURL=chunk-
|
|
21
|
-
//# sourceMappingURL=chunk-
|
|
20
|
+
//# sourceMappingURL=chunk-DNPQ2JBM.js.map
|
|
21
|
+
//# sourceMappingURL=chunk-DNPQ2JBM.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/api/page.ts"],"names":[],"mappings":";;;;AAKO,IAAM,IAAA,GAAO;AAAA,EAClB,IAAA,EAAM,OAAO,IAAA,KAA2C;AACtD,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,GAAA,CAAI,IAAI,CAAA,MAAA,EAAS,IAAI,CAAA,CAAE,CAAA,CAAE,IAAA,EAAgC;AAChF,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAAA,EAEA,aAAa,CAAC,IAAA,KAA2C,QAAQ,IAAA,CAAK,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,EAEhF,OAAA,EAAS;AAAA,IACP,MAAA,EAAQ,CAAC,IAAA,KACP,YAAA,CAAa;AAAA,MACX,QAAA,EAAU,CAAC,OAAA,EAAS,QAAA,EAAU,IAAI,CAAA;AAAA,MAClC,OAAA,EAAS,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI;AAAA,KAC9B;AAAA;AAEP","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/api/page.ts"],"names":[],"mappings":";;;;AAKO,IAAM,IAAA,GAAO;AAAA,EAClB,IAAA,EAAM,OAAO,IAAA,KAA2C;AACtD,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,GAAA,CAAI,IAAI,CAAA,MAAA,EAAS,IAAI,CAAA,CAAE,CAAA,CAAE,IAAA,EAAgC;AAChF,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAAA,EAEA,aAAa,CAAC,IAAA,KAA2C,QAAQ,IAAA,CAAK,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,EAEhF,OAAA,EAAS;AAAA,IACP,MAAA,EAAQ,CAAC,IAAA,KACP,YAAA,CAAa;AAAA,MACX,QAAA,EAAU,CAAC,OAAA,EAAS,QAAA,EAAU,IAAI,CAAA;AAAA,MAClC,OAAA,EAAS,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI;AAAA,KAC9B;AAAA;AAEP","file":"chunk-DNPQ2JBM.js","sourcesContent":["import { queryOptions } from '@tanstack/react-query';\nimport { api } from './client';\nimport type { ApiPageResponse } from '../routes/page/types';\nimport { orThrow } from '../providers/NavigationProvider';\n\nexport const page = {\n find: async (slug: string): Promise<ApiPageResponse> => {\n const { data } = await api.get(`pages/${slug}`).json<{ data: ApiPageResponse }>();\n return data;\n },\n\n findOrThrow: (slug: string): Promise<ApiPageResponse> => orThrow(page.find(slug)),\n\n queries: {\n detail: (slug: string) =>\n queryOptions({\n queryKey: ['pages', 'detail', slug],\n queryFn: () => page.find(slug),\n }),\n },\n};\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getSallaSDK, whenSallaReady } from './chunk-
|
|
1
|
+
import { getSallaSDK, whenSallaReady } from './chunk-2FKZAAV7.js';
|
|
2
2
|
import { useState, useEffect } from 'react';
|
|
3
3
|
|
|
4
4
|
function isNativeApp() {
|
|
@@ -44,5 +44,5 @@ function useNativeStatusBarColor() {
|
|
|
44
44
|
}
|
|
45
45
|
|
|
46
46
|
export { hapticImpact, isNativeApp, openNativeBrowser, openNativeSheet, useIsNativeApp, useNativeStatusBarColor };
|
|
47
|
-
//# sourceMappingURL=chunk-
|
|
48
|
-
//# sourceMappingURL=chunk-
|
|
47
|
+
//# sourceMappingURL=chunk-EWLVLDRP.js.map
|
|
48
|
+
//# sourceMappingURL=chunk-EWLVLDRP.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/native-app/index.ts"],"names":[],"mappings":";;;AAQO,SAAS,WAAA,GAAuB;AACrC,EAAA,OAAO,OAAA,CAAQ,WAAA,EAAY,EAAG,MAAA,EAAQ,aAAa,CAAA;AACrD;AAOO,SAAS,cAAA,GAA0B;AACxC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAS,KAAK,CAAA;AAExC,EAAA,SAAA,CAAU,MAAM,eAAe,MAAM,QAAA,CAAS,aAAa,CAAC,CAAA,EAAG,EAAE,CAAA;AAEjE,EAAA,OAAO,KAAA;AACT;AAeO,SAAS,gBAAgB,KAAA,EAA6B;AAC3D,EAAA,IAAI,CAAC,WAAA,EAAY,EAAG,OAAO,KAAA;AAC3B,EAAA,MAAM,MAAM,WAAA,EAAY;AACxB,EAAA,MAAM,OAAO,KAAA,KAAU,UAAA,GAAa,KAAK,MAAA,EAAQ,aAAA,GAAgB,KAAK,MAAA,EAAQ,cAAA;AAC9E,EAAA,IAAI,OAAO,IAAA,KAAS,UAAA,EAAY,IAAA,CAAK,IAAA,CAAK,KAAK,MAAM,CAAA;AAAA,YAE3C,KAAA,CAAM,QAAA,CAAS,WAAW,KAAK,CAAA,KAAA,CAAA,EAAS,EAAE,CAAA;AACpD,EAAA,OAAO,IAAA;AACT;AASO,SAAS,kBAAkB,GAAA,EAAsB;AACtD,EAAA,IAAI,CAAC,WAAA,EAAY,EAAG,OAAO,KAAA;AAC3B,EAAA,MAAM,MAAM,WAAA,EAAY;AACxB,EAAA,IAAI,OAAO,KAAK,MAAA,EAAQ,WAAA,KAAgB,YAAY,GAAA,CAAI,MAAA,CAAO,YAAY,GAAG,CAAA;AAAA,YACpE,KAAA,CAAM,QAAA,CAAS,sBAAA,EAAwB,EAAE,KAAK,CAAA;AACxD,EAAA,OAAO,IAAA;AACT;AAKO,SAAS,aAAa,MAAA,EAA4B;AACvD,EAAA,WAAA,IAAe,MAAA,EAAQ,MAAA,GAAS,iBAAiB,EAAE,WAAA,EAAa,QAAQ,CAAA;AAC1E;AAOA,SAAS,SAAS,GAAA,EAA4B;AAC5C,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,oDAAoD,CAAA;AAC5E,EAAA,IAAI,CAAC,SAAS,MAAA,CAAO,KAAA,CAAM,CAAC,CAAC,CAAA,KAAM,GAAG,OAAO,IAAA;AAC7C,EAAA,OAAO,CAAA,CAAA,EAAI,MACR,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CACV,GAAA,CAAI,CAAC,OAAA,KAAY,MAAA,CAAO,OAAO,EAAE,QAAA,CAAS,EAAE,EAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAC9D,IAAA,CAAK,EAAE,CAAC,CAAA,CAAA;AACb;AAWO,SAAS,uBAAA,GAAiE;AAC/E,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAmB,IAAI,CAAA;AACrD,EAAA,MAAM,QAAQ,cAAA,EAAe;AAE7B,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,KAAA,IAAS,CAAC,OAAA,EAAS;AACxB,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,gBAAA,CAAiB,OAAO,EAAE,eAAe,CAAA;AAChE,IAAA,IAAI,KAAA,eAAmB,EAAG,KAAA,CAAM,SAAS,yBAAA,EAA2B,EAAE,OAAO,CAAA;AAAA,EAC/E,CAAA,EAAG,CAAC,KAAA,EAAO,OAAO,CAAC,CAAA;AAEnB,EAAA,OAAO,UAAA;AACT","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/native-app/index.ts"],"names":[],"mappings":";;;AAQO,SAAS,WAAA,GAAuB;AACrC,EAAA,OAAO,OAAA,CAAQ,WAAA,EAAY,EAAG,MAAA,EAAQ,aAAa,CAAA;AACrD;AAOO,SAAS,cAAA,GAA0B;AACxC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAS,KAAK,CAAA;AAExC,EAAA,SAAA,CAAU,MAAM,eAAe,MAAM,QAAA,CAAS,aAAa,CAAC,CAAA,EAAG,EAAE,CAAA;AAEjE,EAAA,OAAO,KAAA;AACT;AAeO,SAAS,gBAAgB,KAAA,EAA6B;AAC3D,EAAA,IAAI,CAAC,WAAA,EAAY,EAAG,OAAO,KAAA;AAC3B,EAAA,MAAM,MAAM,WAAA,EAAY;AACxB,EAAA,MAAM,OAAO,KAAA,KAAU,UAAA,GAAa,KAAK,MAAA,EAAQ,aAAA,GAAgB,KAAK,MAAA,EAAQ,cAAA;AAC9E,EAAA,IAAI,OAAO,IAAA,KAAS,UAAA,EAAY,IAAA,CAAK,IAAA,CAAK,KAAK,MAAM,CAAA;AAAA,YAE3C,KAAA,CAAM,QAAA,CAAS,WAAW,KAAK,CAAA,KAAA,CAAA,EAAS,EAAE,CAAA;AACpD,EAAA,OAAO,IAAA;AACT;AASO,SAAS,kBAAkB,GAAA,EAAsB;AACtD,EAAA,IAAI,CAAC,WAAA,EAAY,EAAG,OAAO,KAAA;AAC3B,EAAA,MAAM,MAAM,WAAA,EAAY;AACxB,EAAA,IAAI,OAAO,KAAK,MAAA,EAAQ,WAAA,KAAgB,YAAY,GAAA,CAAI,MAAA,CAAO,YAAY,GAAG,CAAA;AAAA,YACpE,KAAA,CAAM,QAAA,CAAS,sBAAA,EAAwB,EAAE,KAAK,CAAA;AACxD,EAAA,OAAO,IAAA;AACT;AAKO,SAAS,aAAa,MAAA,EAA4B;AACvD,EAAA,WAAA,IAAe,MAAA,EAAQ,MAAA,GAAS,iBAAiB,EAAE,WAAA,EAAa,QAAQ,CAAA;AAC1E;AAOA,SAAS,SAAS,GAAA,EAA4B;AAC5C,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,oDAAoD,CAAA;AAC5E,EAAA,IAAI,CAAC,SAAS,MAAA,CAAO,KAAA,CAAM,CAAC,CAAC,CAAA,KAAM,GAAG,OAAO,IAAA;AAC7C,EAAA,OAAO,CAAA,CAAA,EAAI,MACR,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CACV,GAAA,CAAI,CAAC,OAAA,KAAY,MAAA,CAAO,OAAO,EAAE,QAAA,CAAS,EAAE,EAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAC9D,IAAA,CAAK,EAAE,CAAC,CAAA,CAAA;AACb;AAWO,SAAS,uBAAA,GAAiE;AAC/E,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAmB,IAAI,CAAA;AACrD,EAAA,MAAM,QAAQ,cAAA,EAAe;AAE7B,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,KAAA,IAAS,CAAC,OAAA,EAAS;AACxB,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,gBAAA,CAAiB,OAAO,EAAE,eAAe,CAAA;AAChE,IAAA,IAAI,KAAA,eAAmB,EAAG,KAAA,CAAM,SAAS,yBAAA,EAA2B,EAAE,OAAO,CAAA;AAAA,EAC/E,CAAA,EAAG,CAAC,KAAA,EAAO,OAAO,CAAC,CAAA;AAEnB,EAAA,OAAO,UAAA;AACT","file":"chunk-EWLVLDRP.js","sourcesContent":["import { useEffect, useState, type RefCallback } from 'react';\nimport { getSallaSDK, whenSallaReady } from '../utils/sdk-helpers';\n\n/**\n * True inside the Salla native app's webview, read at call time: the SDK's\n * `salla.mobile.isEnabled()`. False on the server and until the SDK has loaded, so call it\n * from an event handler or an effect, and use {@link useIsNativeApp} to decide what to render.\n */\nexport function isNativeApp(): boolean {\n return Boolean(getSallaSDK()?.mobile?.isEnabled?.());\n}\n\n/**\n * {@link isNativeApp} as state, for a render decision. False on the server and on the first\n * client render, then true once the SDK is ready inside the app: an app that identifies\n * itself through its config has not said so before `init`.\n */\nexport function useIsNativeApp(): boolean {\n const [inApp, setInApp] = useState(false);\n\n useEffect(() => whenSallaReady(() => setInApp(isNativeApp())), []);\n\n return inApp;\n}\n\n/** The native app's own pickers that replace the store's web modals. */\nexport type NativeSheet = 'language' | 'currency';\n\n/**\n * Inside the Salla app, opens the app's own language or currency sheet\n * (`mobile::language.open` / `mobile::currency.open`) and returns `true`; the app\n * applies the choice and reloads. Outside the app it does nothing and returns\n * `false`, so a caller opens the web modal instead:\n *\n * ```ts\n * if (!openNativeSheet('currency')) salla.event.dispatch('localization::open');\n * ```\n */\nexport function openNativeSheet(sheet: NativeSheet): boolean {\n if (!isNativeApp()) return false;\n const sdk = getSallaSDK();\n const open = sheet === 'language' ? sdk?.mobile?.openLanguages : sdk?.mobile?.openCurrencies;\n if (typeof open === 'function') open.call(sdk?.mobile);\n // An SDK without the methods still forwards an emitted `mobile::*` event to the app.\n else sdk?.event.dispatch(`mobile::${sheet}.open`, {});\n return true;\n}\n\n/**\n * Inside the Salla app, hands `url` to the app to open in the device's browser\n * (`mobile::browser.open`) and returns `true`; a page off the store would\n * otherwise load inside the app with no way back. Outside the app it does nothing\n * and returns `false`. The engine's link interceptor calls it for every tap on a\n * link that leaves the store.\n */\nexport function openNativeBrowser(url: string): boolean {\n if (!isNativeApp()) return false;\n const sdk = getSallaSDK();\n if (typeof sdk?.mobile?.openBrowser === 'function') sdk.mobile.openBrowser(url);\n else sdk?.event.dispatch('mobile::browser.open', { url });\n return true;\n}\n\nexport type HapticImpact = 'light' | 'medium' | 'heavy';\n\n/** Asks the native app for a tap vibration. The SDK ignores it outside the app. */\nexport function hapticImpact(impact: HapticImpact): void {\n getSallaSDK()?.mobile?.action?.('haptic.impact', { impact_type: impact });\n}\n\n/**\n * `rgb(232, 245, 255)`, what `getComputedStyle` returns, as `#e8f5ff`. A partial alpha is\n * dropped. A fully transparent colour is no colour at all: an element with no background\n * of its own computes to `rgba(0, 0, 0, 0)`, which would otherwise read as black.\n */\nfunction rgbToHex(rgb: string): string | null {\n const match = rgb.match(/^rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)(?:,\\s*([\\d.]+))?\\)/);\n if (!match || Number(match[4]) === 0) return null;\n return `#${match\n .slice(1, 4)\n .map((channel) => Number(channel).toString(16).padStart(2, '0'))\n .join('')}`;\n}\n\n/**\n * Tells the native app to paint its status bar with the rendered background of the element\n * the returned ref is attached to. The colour is read from the DOM, because a theme's tint\n * is often a relative CSS colour (`hsl(from …)`) with no hex to pass. Does nothing outside\n * the app, and for an element with no background of its own.\n *\n * The ref is a callback, kept in state, so an element that mounts after the app has been\n * recognised still reports its colour.\n */\nexport function useNativeStatusBarColor<T extends HTMLElement>(): RefCallback<T> {\n const [element, setElement] = useState<T | null>(null);\n const inApp = useIsNativeApp();\n\n useEffect(() => {\n if (!inApp || !element) return;\n const color = rgbToHex(getComputedStyle(element).backgroundColor);\n if (color) getSallaSDK()?.event.dispatch('mobile::statusbar.color', { color });\n }, [inApp, element]);\n\n return setElement;\n}\n"]}
|