@salla.sa/twilight-theme-engine 1.0.123 → 1.0.125
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-VFCTMUDL.js → AddToCartForm-Q6Y7BTDC.js} +3 -3
- package/dist/{AddToCartForm-VFCTMUDL.js.map → AddToCartForm-Q6Y7BTDC.js.map} +1 -1
- package/dist/{BlogAuthorPage-QVHRFMBQ.js → BlogAuthorPage-N34SKQIU.js} +17 -17
- package/dist/{BlogAuthorPage-QVHRFMBQ.js.map → BlogAuthorPage-N34SKQIU.js.map} +1 -1
- package/dist/{BlogCategoryPage-BP5WIW7X.js → BlogCategoryPage-FIQZZVFS.js} +17 -17
- package/dist/{BlogCategoryPage-BP5WIW7X.js.map → BlogCategoryPage-FIQZZVFS.js.map} +1 -1
- package/dist/{BlogPage-YUZCR2YV.js → BlogPage-HKUIDCPI.js} +15 -15
- package/dist/{BlogPage-YUZCR2YV.js.map → BlogPage-HKUIDCPI.js.map} +1 -1
- package/dist/{BlogSinglePage-BJHC7DVC.js → BlogSinglePage-YGMH5NZ2.js} +15 -15
- package/dist/{BlogSinglePage-BJHC7DVC.js.map → BlogSinglePage-YGMH5NZ2.js.map} +1 -1
- package/dist/{BlogTagPage-ND5KMCZZ.js → BlogTagPage-64BDH4C7.js} +17 -17
- package/dist/{BlogTagPage-ND5KMCZZ.js.map → BlogTagPage-64BDH4C7.js.map} +1 -1
- package/dist/{BrandsPage-FGJBQBFL.js → BrandsPage-TCYFRA6G.js} +16 -16
- package/dist/{BrandsPage-FGJBQBFL.js.map → BrandsPage-TCYFRA6G.js.map} +1 -1
- package/dist/{Breadcrumb-2LPY6KHS.js → Breadcrumb-25EMZG3Z.js} +15 -15
- package/dist/{Breadcrumb-2LPY6KHS.js.map → Breadcrumb-25EMZG3Z.js.map} +1 -1
- package/dist/{CartItem-UQF332H4.js → CartItem-QIGMCSE2.js} +15 -15
- package/dist/{CartItem-UQF332H4.js.map → CartItem-QIGMCSE2.js.map} +1 -1
- package/dist/{CartSummary-FV3I7CJV.js → CartSummary-QWTWFV6R.js} +15 -15
- package/dist/{CartSummary-FV3I7CJV.js.map → CartSummary-QWTWFV6R.js.map} +1 -1
- package/dist/{Copyright-AZHDEIJX.js → Copyright-XUD6PWUP.js} +3 -3
- package/dist/{Copyright-AZHDEIJX.js.map → Copyright-XUD6PWUP.js.map} +1 -1
- package/dist/{CustomerLayout-DYA77OLE.js → CustomerLayout-NIENY4TF.js} +15 -15
- package/dist/{CustomerLayout-DYA77OLE.js.map → CustomerLayout-NIENY4TF.js.map} +1 -1
- package/dist/{Footer-BCFWCWWI.js → Footer-3CF5V7OE.js} +4 -4
- package/dist/{Footer-BCFWCWWI.js.map → Footer-3CF5V7OE.js.map} +1 -1
- package/dist/{Header-HALNPMED.js → Header-O4Z6HYNA.js} +8 -8
- package/dist/{Header-HALNPMED.js.map → Header-O4Z6HYNA.js.map} +1 -1
- package/dist/{LiveEditorBar-6SKEWJOX.js → LiveEditorBar-IQLFFBHE.js} +46 -12
- package/dist/LiveEditorBar-IQLFFBHE.js.map +1 -0
- package/dist/{LoyaltyPage-LUQLKTDF.js → LoyaltyPage-DATO5W6R.js} +15 -15
- package/dist/{LoyaltyPage-LUQLKTDF.js.map → LoyaltyPage-DATO5W6R.js.map} +1 -1
- package/dist/{LoyaltyPointsPage-LJLCJBLR.js → LoyaltyPointsPage-YQAJ6PNQ.js} +6 -6
- package/dist/{LoyaltyPointsPage-LJLCJBLR.js.map → LoyaltyPointsPage-YQAJ6PNQ.js.map} +1 -1
- package/dist/{MainMenu-WPVP2XF6.js → MainMenu-NUJSMS3W.js} +5 -5
- package/dist/{MainMenu-WPVP2XF6.js.map → MainMenu-NUJSMS3W.js.map} +1 -1
- package/dist/{MasterLayout-UPFHTRV6.js → MasterLayout-6SJCANZN.js} +15 -15
- package/dist/{MasterLayout-UPFHTRV6.js.map → MasterLayout-6SJCANZN.js.map} +1 -1
- package/dist/{MobileMenu-KMTRWYHV.js → MobileMenu-N7P6Z6TM.js} +16 -16
- package/dist/{MobileMenu-KMTRWYHV.js.map → MobileMenu-N7P6Z6TM.js.map} +1 -1
- package/dist/{NotificationsPage-5GDS22E6.js → NotificationsPage-N4DAQ7RS.js} +15 -15
- package/dist/{NotificationsPage-5GDS22E6.js.map → NotificationsPage-N4DAQ7RS.js.map} +1 -1
- package/dist/{OrderSinglePage-EXVTMRJI.js → OrderSinglePage-NMWLWFX4.js} +16 -16
- package/dist/{OrderSinglePage-EXVTMRJI.js.map → OrderSinglePage-NMWLWFX4.js.map} +1 -1
- package/dist/{OrdersPage-JNIDVHV3.js → OrdersPage-WGA6SAU7.js} +15 -15
- package/dist/{OrdersPage-JNIDVHV3.js.map → OrdersPage-WGA6SAU7.js.map} +1 -1
- package/dist/{PageSingle-KX5XSBWJ.js → PageSingle-MZQWB3OW.js} +3 -3
- package/dist/{PageSingle-KX5XSBWJ.js.map → PageSingle-MZQWB3OW.js.map} +1 -1
- package/dist/{ProductDetails-7EI5PTFY.js → ProductDetails-HYVU4GWC.js} +4 -4
- package/dist/{ProductDetails-7EI5PTFY.js.map → ProductDetails-HYVU4GWC.js.map} +1 -1
- package/dist/{ProfilePage-6FSWT3RC.js → ProfilePage-M5RBRGMH.js} +15 -15
- package/dist/{ProfilePage-6FSWT3RC.js.map → ProfilePage-M5RBRGMH.js.map} +1 -1
- package/dist/{ReviewsPage-2JSZHLPR.js → ReviewsPage-PEQC4IDJ.js} +3 -3
- package/dist/{ReviewsPage-2JSZHLPR.js.map → ReviewsPage-PEQC4IDJ.js.map} +1 -1
- package/dist/{SeoCartWidget-2MI5P2RT.js → SeoCartWidget-P2MT5BRA.js} +15 -15
- package/dist/{SeoCartWidget-2MI5P2RT.js.map → SeoCartWidget-P2MT5BRA.js.map} +1 -1
- package/dist/{SettingsPage-BX3SZNO5.js → SettingsPage-OMPK72Z7.js} +15 -15
- package/dist/{SettingsPage-BX3SZNO5.js.map → SettingsPage-OMPK72Z7.js.map} +1 -1
- package/dist/{StoreClosedNotification-E7WEFZGO.js → StoreClosedNotification-NWEQHHAR.js} +16 -16
- package/dist/{StoreClosedNotification-E7WEFZGO.js.map → StoreClosedNotification-NWEQHHAR.js.map} +1 -1
- package/dist/{TestimonialsPage-5OEZMBRF.js → TestimonialsPage-4AUF6ZWG.js} +3 -3
- package/dist/{TestimonialsPage-5OEZMBRF.js.map → TestimonialsPage-4AUF6ZWG.js.map} +1 -1
- package/dist/{ThankYouPage-3XJUFGSE.js → ThankYouPage-R3EWHCT7.js} +15 -15
- package/dist/{ThankYouPage-3XJUFGSE.js.map → ThankYouPage-R3EWHCT7.js.map} +1 -1
- package/dist/{WalletPage-LUSSC5TL.js → WalletPage-KHQGRDQB.js} +16 -16
- package/dist/{WalletPage-LUSSC5TL.js.map → WalletPage-KHQGRDQB.js.map} +1 -1
- package/dist/{WishlistPage-JK2JLLMR.js → WishlistPage-YJXOMBQ4.js} +17 -17
- package/dist/{WishlistPage-JK2JLLMR.js.map → WishlistPage-YJXOMBQ4.js.map} +1 -1
- package/dist/api/advertisement.js +2 -2
- package/dist/api/apps.js +2 -2
- package/dist/api/blog.js +3 -3
- package/dist/api/brands.js +3 -3
- package/dist/api/cart.js +3 -3
- package/dist/api/category.js +3 -3
- package/dist/api/client.js +1 -1
- package/dist/api/home.js +2 -2
- package/dist/api/loyalty.js +3 -3
- package/dist/api/menu.js +2 -2
- package/dist/api/notification.js +2 -2
- package/dist/api/order.js +3 -3
- package/dist/api/page.js +3 -3
- package/dist/api/product.js +3 -3
- package/dist/api/profile.js +1 -1
- package/dist/api/store.js +2 -2
- package/dist/api/translations.js +2 -2
- package/dist/api/user.js +2 -2
- package/dist/api/wallet.js +2 -2
- package/dist/api/wishlist.js +4 -4
- package/dist/{chunk-N67C5QRH.js → chunk-2CJGX6QU.js} +3 -3
- package/dist/{chunk-N67C5QRH.js.map → chunk-2CJGX6QU.js.map} +1 -1
- package/dist/{chunk-3L4TXBS7.js → chunk-2YCR7EEN.js} +3 -3
- package/dist/{chunk-3L4TXBS7.js.map → chunk-2YCR7EEN.js.map} +1 -1
- package/dist/{chunk-IXZPQR4M.js → chunk-5D26ZL3R.js} +5 -5
- package/dist/{chunk-IXZPQR4M.js.map → chunk-5D26ZL3R.js.map} +1 -1
- package/dist/{chunk-WAZYTMTB.js → chunk-653SIKQV.js} +3 -3
- package/dist/{chunk-WAZYTMTB.js.map → chunk-653SIKQV.js.map} +1 -1
- package/dist/{chunk-SLXTJLF2.js → chunk-B3KRYCIN.js} +4 -4
- package/dist/{chunk-SLXTJLF2.js.map → chunk-B3KRYCIN.js.map} +1 -1
- package/dist/{chunk-EEZNB6HS.js → chunk-DHBDQF2L.js} +4 -4
- package/dist/{chunk-EEZNB6HS.js.map → chunk-DHBDQF2L.js.map} +1 -1
- package/dist/{chunk-2CORNDFS.js → chunk-DMOBC6K3.js} +3 -3
- package/dist/{chunk-2CORNDFS.js.map → chunk-DMOBC6K3.js.map} +1 -1
- package/dist/{chunk-HGEKTJVV.js → chunk-E6J4TSI4.js} +4 -4
- package/dist/{chunk-HGEKTJVV.js.map → chunk-E6J4TSI4.js.map} +1 -1
- package/dist/{chunk-C4GXSAYT.js → chunk-EADPFZYQ.js} +4 -4
- package/dist/{chunk-C4GXSAYT.js.map → chunk-EADPFZYQ.js.map} +1 -1
- package/dist/chunk-FMDGEAFD.js +14 -0
- package/dist/{chunk-DEY7MDGF.js.map → chunk-FMDGEAFD.js.map} +1 -1
- package/dist/{chunk-UBNOFV7C.js → chunk-HEGWAECO.js} +3 -3
- package/dist/{chunk-UBNOFV7C.js.map → chunk-HEGWAECO.js.map} +1 -1
- package/dist/{chunk-3BIT754E.js → chunk-I6SWCTCV.js} +4 -4
- package/dist/{chunk-3BIT754E.js.map → chunk-I6SWCTCV.js.map} +1 -1
- package/dist/{chunk-4KRALUHW.js → chunk-IVW2XKC3.js} +3 -3
- package/dist/{chunk-4KRALUHW.js.map → chunk-IVW2XKC3.js.map} +1 -1
- package/dist/{chunk-AFERG34I.js → chunk-IZTIOJNJ.js} +7 -7
- package/dist/{chunk-AFERG34I.js.map → chunk-IZTIOJNJ.js.map} +1 -1
- package/dist/{chunk-ESZBWB7X.js → chunk-JWBHXCLD.js} +3 -3
- package/dist/{chunk-ESZBWB7X.js.map → chunk-JWBHXCLD.js.map} +1 -1
- package/dist/{chunk-EPPCSJGJ.js → chunk-K4HJD556.js} +3 -3
- package/dist/{chunk-EPPCSJGJ.js.map → chunk-K4HJD556.js.map} +1 -1
- package/dist/{chunk-FLTPDDL3.js → chunk-LCJSZXXV.js} +7 -7
- package/dist/{chunk-FLTPDDL3.js.map → chunk-LCJSZXXV.js.map} +1 -1
- package/dist/{chunk-YPEWTS4L.js → chunk-MHS2SUIJ.js} +4 -4
- package/dist/{chunk-YPEWTS4L.js.map → chunk-MHS2SUIJ.js.map} +1 -1
- package/dist/{chunk-4X4FBQMO.js → chunk-MIKL53WC.js} +3 -3
- package/dist/{chunk-4X4FBQMO.js.map → chunk-MIKL53WC.js.map} +1 -1
- package/dist/{chunk-PDIFXQDX.js → chunk-MVNWWZWQ.js} +23 -4
- package/dist/chunk-MVNWWZWQ.js.map +1 -0
- package/dist/{chunk-3BCIBYJC.js → chunk-N5PGVFSO.js} +3 -3
- package/dist/{chunk-3BCIBYJC.js.map → chunk-N5PGVFSO.js.map} +1 -1
- package/dist/{chunk-ISTESEV6.js → chunk-N6X7ESEY.js} +7 -7
- package/dist/{chunk-ISTESEV6.js.map → chunk-N6X7ESEY.js.map} +1 -1
- package/dist/{chunk-MQLMYMEQ.js → chunk-NWYOIN5R.js} +3 -3
- package/dist/{chunk-MQLMYMEQ.js.map → chunk-NWYOIN5R.js.map} +1 -1
- package/dist/{chunk-74PTCV46.js → chunk-OBSTSW3E.js} +23 -22
- package/dist/chunk-OBSTSW3E.js.map +1 -0
- package/dist/{chunk-ITXVKNO7.js → chunk-OXUPXXE5.js} +4 -4
- package/dist/{chunk-ITXVKNO7.js.map → chunk-OXUPXXE5.js.map} +1 -1
- package/dist/{chunk-G2BBB5AI.js → chunk-P4M57HMD.js} +3 -3
- package/dist/{chunk-G2BBB5AI.js.map → chunk-P4M57HMD.js.map} +1 -1
- package/dist/{chunk-XK5CEGKA.js → chunk-PD7ZQY6T.js} +4 -4
- package/dist/{chunk-XK5CEGKA.js.map → chunk-PD7ZQY6T.js.map} +1 -1
- package/dist/{chunk-S5FRM4TG.js → chunk-PPTOCIKV.js} +6 -6
- package/dist/{chunk-S5FRM4TG.js.map → chunk-PPTOCIKV.js.map} +1 -1
- package/dist/{chunk-Y2OC2467.js → chunk-QFEJAVGD.js} +10 -10
- package/dist/{chunk-Y2OC2467.js.map → chunk-QFEJAVGD.js.map} +1 -1
- package/dist/{chunk-FXYR563Z.js → chunk-RVKKQGHR.js} +3 -3
- package/dist/{chunk-FXYR563Z.js.map → chunk-RVKKQGHR.js.map} +1 -1
- package/dist/{chunk-Z43BQ7ZH.js → chunk-SRMZHB5G.js} +4 -4
- package/dist/{chunk-Z43BQ7ZH.js.map → chunk-SRMZHB5G.js.map} +1 -1
- package/dist/{chunk-DPLMZQ2Q.js → chunk-ST6FMVXY.js} +3 -3
- package/dist/{chunk-DPLMZQ2Q.js.map → chunk-ST6FMVXY.js.map} +1 -1
- package/dist/{chunk-2Q6M3CE5.js → chunk-SVB3WGEG.js} +3 -3
- package/dist/{chunk-2Q6M3CE5.js.map → chunk-SVB3WGEG.js.map} +1 -1
- package/dist/{chunk-IMCS5L4A.js → chunk-UZXRQZV2.js} +3 -3
- package/dist/{chunk-IMCS5L4A.js.map → chunk-UZXRQZV2.js.map} +1 -1
- package/dist/{chunk-MDJK7WHN.js → chunk-V3E2UIZB.js} +4 -4
- package/dist/{chunk-MDJK7WHN.js.map → chunk-V3E2UIZB.js.map} +1 -1
- package/dist/{chunk-36FXIFZ6.js → chunk-VAX5TXTJ.js} +4 -4
- package/dist/{chunk-36FXIFZ6.js.map → chunk-VAX5TXTJ.js.map} +1 -1
- package/dist/{chunk-4JNLIYCE.js → chunk-XDZHVKBK.js} +3 -3
- package/dist/{chunk-4JNLIYCE.js.map → chunk-XDZHVKBK.js.map} +1 -1
- package/dist/{chunk-XJJMGLHB.js → chunk-YRWGUJOR.js} +12 -8
- package/dist/chunk-YRWGUJOR.js.map +1 -0
- package/dist/{chunk-ZTY326ZR.js → chunk-YYNH6PGX.js} +3 -3
- package/dist/{chunk-ZTY326ZR.js.map → chunk-YYNH6PGX.js.map} +1 -1
- package/dist/{chunk-PGXS2QT5.js → chunk-Z4BZW7QS.js} +3 -3
- package/dist/{chunk-PGXS2QT5.js.map → chunk-Z4BZW7QS.js.map} +1 -1
- package/dist/components/cart/index.js +1 -1
- package/dist/components/common/index.js +1 -1
- package/dist/components/drawer/index.js +13 -13
- package/dist/components/home/HomePageRenderer.d.ts.map +1 -1
- package/dist/components/home/index.js +17 -17
- package/dist/components/layout/index.js +4 -4
- package/dist/components/live-editor/LiveEditorBar.d.ts +5 -1
- package/dist/components/live-editor/LiveEditorBar.d.ts.map +1 -1
- package/dist/components/live-editor/frame.d.ts +7 -0
- package/dist/components/live-editor/frame.d.ts.map +1 -1
- package/dist/components/live-editor/index.d.ts.map +1 -1
- package/dist/components/product/index.js +14 -14
- package/dist/components/store/index.js +14 -14
- package/dist/dev/editor/ThemeEditor.d.ts.map +1 -1
- package/dist/dev/editor/index.js +108 -26
- package/dist/dev/editor/index.js.map +1 -1
- package/dist/dev/editor/live-actions.d.ts +19 -0
- package/dist/dev/editor/live-actions.d.ts.map +1 -0
- package/dist/dev/index.js +1 -1
- package/dist/{document-class-LQ6CAJYV.js → document-class-RKLOCL35.js} +11 -11
- package/dist/{document-class-LQ6CAJYV.js.map → document-class-RKLOCL35.js.map} +1 -1
- package/dist/hooks/index.js +13 -13
- package/dist/hooks/useGtm.js +13 -13
- package/dist/hooks/useMoney.js +13 -13
- package/dist/hooks/useStore.js +13 -13
- package/dist/hooks/useUser.js +3 -3
- package/dist/index.js +13 -13
- package/dist/{navigation-YFRK3OW2.js → navigation-DIKCKMZ6.js} +5 -5
- package/dist/{navigation-YFRK3OW2.js.map → navigation-DIKCKMZ6.js.map} +1 -1
- package/dist/{navigation-MEQGPFG2.js → navigation-HHJTUPN2.js} +4 -4
- package/dist/{navigation-MEQGPFG2.js.map → navigation-HHJTUPN2.js.map} +1 -1
- package/dist/{not-found-62H3K6KC.js → not-found-4KKQNZCQ.js} +16 -16
- package/dist/{not-found-62H3K6KC.js.map → not-found-4KKQNZCQ.js.map} +1 -1
- package/dist/providers/index.js +13 -13
- package/dist/routes/account/orders.js +4 -4
- package/dist/routes/account.js +13 -13
- package/dist/routes/blog.js +8 -8
- package/dist/routes/brands.js +4 -4
- package/dist/routes/cart.js +21 -21
- package/dist/routes/home.js +18 -18
- package/dist/routes/index.js +3 -3
- package/dist/routes/loyalty.js +5 -5
- package/dist/routes/page.js +4 -4
- package/dist/routes/product-listing.js +19 -19
- package/dist/routes/product.js +17 -17
- package/dist/routes/seo-redirects.js +3 -3
- package/dist/routes/testimonials.js +2 -2
- package/dist/routes/thank-you.js +4 -4
- package/dist/skeleton.js +18 -18
- package/dist/{store-lookup-HQYYF3ZS.js → store-lookup-EN7CBHC3.js} +8 -8
- package/dist/{store-lookup-HQYYF3ZS.js.map → store-lookup-EN7CBHC3.js.map} +1 -1
- package/dist/tanstack.js +11 -11
- package/dist/utils/index.js +2 -2
- package/package.json +1 -1
- package/tailwind/components/home/HomePageRenderer.tsx.txt +11 -6
- package/tailwind/components/live-editor/LiveEditorBar.tsx.txt +64 -9
- package/tailwind/components/live-editor/frame.ts.txt +34 -1
- package/tailwind/components/live-editor/index.tsx.txt +9 -7
- package/dist/LiveEditorBar-6SKEWJOX.js.map +0 -1
- package/dist/chunk-74PTCV46.js.map +0 -1
- package/dist/chunk-DEY7MDGF.js +0 -14
- package/dist/chunk-PDIFXQDX.js.map +0 -1
- package/dist/chunk-XJJMGLHB.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/dev/dev-settings-store.ts"],"names":["block"],"mappings":"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","file":"chunk-EPPCSJGJ.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, useRef, 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 * Whether a list in a block's fields gained, lost or reordered items. Blocks\n * often hand their items to a web component that takes them once when it\n * starts (a slider moves its slides into its own track), so such a change\n * never reaches the page until the block mounts again. Editing an item's\n * values is not one: the nodes stay put and update in place.\n */\nexport function listsReshaped(\n before: Record<string, unknown>,\n after: Record<string, unknown>\n): boolean {\n for (const key of new Set([...Object.keys(before), ...Object.keys(after)])) {\n const a = before[key];\n const b = after[key];\n if (!Array.isArray(a) && !Array.isArray(b)) continue;\n if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length) return true;\n const aItems = a.map((item) => JSON.stringify(item));\n const bItems = b.map((item) => JSON.stringify(item));\n const moved = aItems.some((item, i) => item !== bItems[i]);\n if (moved && [...aItems].sort().join('\\n') === [...bItems].sort().join('\\n')) return true;\n }\n return false;\n}\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 // Per block: the fields last rendered, and how often its lists were reshaped.\n const seen = useRef(new Map<string, { fields: Record<string, unknown>; mounts: number }>());\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((block) => {\n const last = seen.current.get(block.id);\n const mounts =\n (last?.mounts ?? 0) + (last && listsReshaped(last.fields, block.fields) ? 1 : 0);\n seen.current.set(block.id, { fields: block.fields, mounts });\n // A new key mounts the block again, so a reshaped list reaches the page.\n const devId = mounts ? `${block.id}~${mounts}` : block.id;\n return { ...block.fields, path: block.path, __dev_id: devId } 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
|
+
{"version":3,"sources":["../src/dev/dev-settings-store.ts"],"names":["block"],"mappings":"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","file":"chunk-K4HJD556.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, useRef, 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 * Whether a list in a block's fields gained, lost or reordered items. Blocks\n * often hand their items to a web component that takes them once when it\n * starts (a slider moves its slides into its own track), so such a change\n * never reaches the page until the block mounts again. Editing an item's\n * values is not one: the nodes stay put and update in place.\n */\nexport function listsReshaped(\n before: Record<string, unknown>,\n after: Record<string, unknown>\n): boolean {\n for (const key of new Set([...Object.keys(before), ...Object.keys(after)])) {\n const a = before[key];\n const b = after[key];\n if (!Array.isArray(a) && !Array.isArray(b)) continue;\n if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length) return true;\n const aItems = a.map((item) => JSON.stringify(item));\n const bItems = b.map((item) => JSON.stringify(item));\n const moved = aItems.some((item, i) => item !== bItems[i]);\n if (moved && [...aItems].sort().join('\\n') === [...bItems].sort().join('\\n')) return true;\n }\n return false;\n}\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 // Per block: the fields last rendered, and how often its lists were reshaped.\n const seen = useRef(new Map<string, { fields: Record<string, unknown>; mounts: number }>());\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((block) => {\n const last = seen.current.get(block.id);\n const mounts =\n (last?.mounts ?? 0) + (last && listsReshaped(last.fields, block.fields) ? 1 : 0);\n seen.current.set(block.id, { fields: block.fields, mounts });\n // A new key mounts the block again, so a reshaped list reaches the page.\n const devId = mounts ? `${block.id}~${mounts}` : block.id;\n return { ...block.fields, path: block.path, __dev_id: devId } 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,8 +1,8 @@
|
|
|
1
|
-
import { order } from './chunk-
|
|
1
|
+
import { order } from './chunk-I6SWCTCV.js';
|
|
2
2
|
import { buildHreflangAlternates } from './chunk-OM2GRPDH.js';
|
|
3
|
-
import { unauthorized, orUnauthorized, orThrow } from './chunk-
|
|
3
|
+
import { unauthorized, orUnauthorized, orThrow } from './chunk-HEGWAECO.js';
|
|
4
4
|
import { RouteId } from './chunk-OUW6WESU.js';
|
|
5
|
-
import { getAuthToken } from './chunk-
|
|
5
|
+
import { getAuthToken } from './chunk-UZXRQZV2.js';
|
|
6
6
|
import { getTwilightContext } from './chunk-7VNVCHID.js';
|
|
7
7
|
import { lazy } from 'react';
|
|
8
8
|
|
|
@@ -55,9 +55,9 @@ async function orderSingleLoader({
|
|
|
55
55
|
}
|
|
56
56
|
|
|
57
57
|
// src/routes/account/orders/index.tsx
|
|
58
|
-
var LazyOrdersPage = lazy(() => import('./OrdersPage-
|
|
58
|
+
var LazyOrdersPage = lazy(() => import('./OrdersPage-WGA6SAU7.js').then((m) => ({ default: m.OrdersPage })));
|
|
59
59
|
var LazyOrderSinglePage = lazy(
|
|
60
|
-
() => import('./OrderSinglePage-
|
|
60
|
+
() => import('./OrderSinglePage-NMWLWFX4.js').then((m) => ({ default: m.OrderSinglePage }))
|
|
61
61
|
);
|
|
62
62
|
var OrdersPage = LazyOrdersPage;
|
|
63
63
|
var OrderSinglePage = LazyOrderSinglePage;
|
|
@@ -104,5 +104,5 @@ var OrderSingle = {
|
|
|
104
104
|
};
|
|
105
105
|
|
|
106
106
|
export { OrderSingle, OrderSinglePage, Orders, OrdersPage, orderSingleLoader, ordersLoader };
|
|
107
|
-
//# sourceMappingURL=chunk-
|
|
108
|
-
//# sourceMappingURL=chunk-
|
|
107
|
+
//# sourceMappingURL=chunk-LCJSZXXV.js.map
|
|
108
|
+
//# sourceMappingURL=chunk-LCJSZXXV.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/routes/account/orders/loader.ts","../src/routes/account/orders/index.tsx"],"names":[],"mappings":"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","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/routes/account/orders/loader.ts","../src/routes/account/orders/index.tsx"],"names":[],"mappings":"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","file":"chunk-LCJSZXXV.js","sourcesContent":["import { order } from '../../../api/order';\nimport { getTwilightContext } from '../../../twilight/context';\nimport { RouteId } from '../../../router/route-ids';\nimport { orThrow, orUnauthorized, unauthorized } from '../../../providers/NavigationProvider';\nimport { getAuthToken } from '../../../api/client';\nimport type { OrdersPageProps, OrderSinglePageProps, OrdersQuery } from './types';\nimport type { IdParams } from '../../types';\n\nexport async function ordersLoader(\n ctx: { query?: OrdersQuery; with_items?: boolean | number },\n extend?: (\n data: OrdersPageProps,\n ctx: { params: Record<string, never> }\n ) => Promise<Record<string, unknown>> | Record<string, unknown>\n): Promise<OrdersPageProps> {\n if (!getAuthToken()) throw unauthorized();\n const query = ctx.query;\n const isPending = query?.status === 'pending';\n const response = await orUnauthorized(\n order.list({\n // Only decides the empty state; <salla-orders> applies its own review filter (`?tab=waiting`).\n status: query?.status,\n ...(ctx.with_items ? { with_items: ctx.with_items } : {}),\n })\n );\n const i18n = getTwilightContext().i18n;\n const pageData: OrdersPageProps = {\n page: {\n title: isPending ? i18n.t('common.titles.pending_orders') : i18n.t('common.titles.orders'),\n slug: RouteId.CUSTOMER_ORDERS_INDEX,\n },\n orders: response.data,\n cursor: response.cursor,\n query,\n };\n\n if (extend) {\n const extra = await extend(pageData, { params: {} });\n return { ...pageData, ...extra } as OrdersPageProps;\n }\n return pageData;\n}\n\nexport async function orderSingleLoader({\n params,\n}: {\n params: IdParams;\n}): Promise<OrderSinglePageProps> {\n if (!getAuthToken()) throw unauthorized();\n const [data, componentsOrder] = await Promise.all([\n order.findOrThrow(params.id),\n orThrow(orUnauthorized(order.findForComponents(params.id))),\n ]);\n const i18n = getTwilightContext().i18n;\n return {\n page: {\n slug: RouteId.CUSTOMER_ORDERS_SINGLE,\n id: String(params.id),\n title: i18n\n .t('pages.orders.order_details')\n .replace(':id', String(data.order.reference_id ?? params.id)),\n },\n order: data.order,\n componentsOrder,\n };\n}\n","import type { HeadDescriptor } from '../../../utils/head';\nimport { buildHreflangAlternates } from '../../../utils/baseHead';\nimport { lazy } from 'react';\nimport { ordersLoader, orderSingleLoader } from './loader';\nimport type { OrdersPageProps, OrderSinglePageProps, OrdersSearchParams } from './types';\nimport type { IdParams } from '../../types';\nimport type { TwilightContext } from '../../../twilight/context';\nimport { RouteId } from '../../../router/route-ids';\n\n// Lazy-load components for code-splitting\nconst LazyOrdersPage = lazy(() => import('./OrdersPage').then((m) => ({ default: m.OrdersPage })));\nconst LazyOrderSinglePage = lazy(() =>\n import('./OrderSinglePage').then((m) => ({ default: m.OrderSinglePage }))\n);\n\nexport const OrdersPage = LazyOrdersPage;\nexport const OrderSinglePage = LazyOrderSinglePage;\nexport { ordersLoader, orderSingleLoader } from './loader';\nexport type {\n OrdersPageProps,\n OrderSinglePageProps,\n OrdersSearchParams,\n OrdersQuery,\n} from './types';\n\nasync function ordersLoaderWithExtend(\n ctx: { search?: OrdersSearchParams; locale?: string; with_items?: boolean | number },\n extend?: (\n data: OrdersPageProps,\n ctx: { params: Record<string, never> }\n ) => Promise<Record<string, unknown>> | Record<string, unknown>\n): Promise<OrdersPageProps> {\n const query = ctx.search;\n // ordersLoader already merges the result of `extend`; calling it again here ran it twice.\n return ordersLoader({ query, with_items: ctx.with_items }, extend);\n}\n\nfunction ordersHead(ctx: TwilightContext, data: OrdersPageProps): HeadDescriptor {\n const isPending = data.query?.status === 'pending';\n const base: HeadDescriptor = {\n title: ctx.i18n.t(isPending ? 'common.titles.pending_orders' : 'common.titles.orders'),\n description: data.page.description,\n alternateLanguages: buildHreflangAlternates(ctx.settings, ctx.location.pathname),\n };\n\n return base;\n}\n\nasync function orderSingleLoaderWithExtend(\n ctx: { params: IdParams; locale?: string },\n extend?: (\n data: OrderSinglePageProps,\n ctx: { params: IdParams }\n ) => Promise<Record<string, unknown>> | Record<string, unknown>\n): Promise<OrderSinglePageProps> {\n const data = await orderSingleLoader({ params: ctx.params });\n\n if (extend) {\n const extra = await extend(data, ctx);\n return { ...data, ...extra } as OrderSinglePageProps;\n }\n return data;\n}\n\nfunction orderSingleHead(ctx: TwilightContext, data: OrderSinglePageProps): HeadDescriptor {\n const base: HeadDescriptor = {\n title: data.page.title,\n description: data.page.description,\n alternateLanguages: buildHreflangAlternates(ctx.settings, ctx.location.pathname),\n };\n\n return base;\n}\n\nexport const Orders = {\n id: RouteId.CUSTOMER_ORDERS_INDEX,\n loader: ordersLoaderWithExtend,\n head: ordersHead,\n Component: LazyOrdersPage,\n} as const;\nexport const OrderSingle = {\n id: RouteId.CUSTOMER_ORDERS_SINGLE,\n loader: orderSingleLoaderWithExtend,\n head: orderSingleHead,\n Component: LazyOrderSinglePage,\n} as const;\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { orThrow } from './chunk-
|
|
2
|
-
import { getAuthToken, api } from './chunk-
|
|
1
|
+
import { orThrow } from './chunk-HEGWAECO.js';
|
|
2
|
+
import { getAuthToken, api } from './chunk-UZXRQZV2.js';
|
|
3
3
|
import { queryOptions } from '@tanstack/react-query';
|
|
4
4
|
|
|
5
5
|
var loyalty = {
|
|
@@ -29,5 +29,5 @@ var loyalty = {
|
|
|
29
29
|
};
|
|
30
30
|
|
|
31
31
|
export { loyalty };
|
|
32
|
-
//# sourceMappingURL=chunk-
|
|
33
|
-
//# sourceMappingURL=chunk-
|
|
32
|
+
//# sourceMappingURL=chunk-MHS2SUIJ.js.map
|
|
33
|
+
//# sourceMappingURL=chunk-MHS2SUIJ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/api/loyalty.ts"],"names":[],"mappings":";;;;AAKO,IAAM,OAAA,GAAU;AAAA,EACrB,KAAK,YAA8B;AACjC,IAAA,MAAM,EAAE,MAAK,GAAI,MAAM,IAAI,GAAA,CAAI,SAAS,EAAE,IAAA,EAAwB;AAClE,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAAA,EAEA,UAAA,EAAY,MAAwB,OAAA,CAAQ,OAAA,CAAQ,KAAK,CAAA;AAAA,EAEzD,kBAAkB,YAA6B;AAC7C,IAAA,MAAM,WAAW,MAAM,GAAA,CAAI,GAAA,CAAI,gBAAgB,EAAE,IAAA,EAA2B;AAC5E,IAAA,OAAO,QAAA,CAAS,OAAA;AAAA,EAClB,CAAA;AAAA,EAEA,OAAA,EAAS;AAAA,IACP,MAAA,EAAQ,MACN,YAAA,CAAa;AAAA,MACX,QAAA,EAAU,CAAC,SAAS,CAAA;AAAA,MACpB,OAAA,EAAS,MAAM,OAAA,CAAQ,GAAA;AAAI,KAC5B,CAAA;AAAA,IACH,MAAA,EAAQ,MACN,YAAA,CAA4B;AAAA,MAC1B,QAAA,EAAU,CAAC,SAAA,EAAW,QAAQ,CAAA;AAAA,MAC9B,OAAA,EAAS,MAAM,OAAA,CAAQ,gBAAA,EAAiB;AAAA;AAAA;AAAA,MAGxC,OAAA,EAAS,CAAC,CAAC,YAAA,EAAa;AAAA,MACxB,SAAA,EAAW;AAAA,KACZ;AAAA;AAEP","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/api/loyalty.ts"],"names":[],"mappings":";;;;AAKO,IAAM,OAAA,GAAU;AAAA,EACrB,KAAK,YAA8B;AACjC,IAAA,MAAM,EAAE,MAAK,GAAI,MAAM,IAAI,GAAA,CAAI,SAAS,EAAE,IAAA,EAAwB;AAClE,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAAA,EAEA,UAAA,EAAY,MAAwB,OAAA,CAAQ,OAAA,CAAQ,KAAK,CAAA;AAAA,EAEzD,kBAAkB,YAA6B;AAC7C,IAAA,MAAM,WAAW,MAAM,GAAA,CAAI,GAAA,CAAI,gBAAgB,EAAE,IAAA,EAA2B;AAC5E,IAAA,OAAO,QAAA,CAAS,OAAA;AAAA,EAClB,CAAA;AAAA,EAEA,OAAA,EAAS;AAAA,IACP,MAAA,EAAQ,MACN,YAAA,CAAa;AAAA,MACX,QAAA,EAAU,CAAC,SAAS,CAAA;AAAA,MACpB,OAAA,EAAS,MAAM,OAAA,CAAQ,GAAA;AAAI,KAC5B,CAAA;AAAA,IACH,MAAA,EAAQ,MACN,YAAA,CAA4B;AAAA,MAC1B,QAAA,EAAU,CAAC,SAAA,EAAW,QAAQ,CAAA;AAAA,MAC9B,OAAA,EAAS,MAAM,OAAA,CAAQ,gBAAA,EAAiB;AAAA;AAAA;AAAA,MAGxC,OAAA,EAAS,CAAC,CAAC,YAAA,EAAa;AAAA,MACxB,SAAA,EAAW;AAAA,KACZ;AAAA;AAEP","file":"chunk-MHS2SUIJ.js","sourcesContent":["import { queryOptions } from '@tanstack/react-query';\nimport { api, getAuthToken } from './client';\nimport type { Loyalty, PointBalanceResponse } from '../routes/loyalty/types';\nimport { orThrow } from '../providers/NavigationProvider';\n\nexport const loyalty = {\n get: async (): Promise<Loyalty> => {\n const { data } = await api.get('loyalty').json<{ data: Loyalty }>();\n return data;\n },\n\n getOrThrow: (): Promise<Loyalty> => orThrow(loyalty.get()),\n\n getPointsBalance: async (): Promise<number> => {\n const response = await api.get('balance/points').json<PointBalanceResponse>();\n return response.balance;\n },\n\n queries: {\n detail: () =>\n queryOptions({\n queryKey: ['loyalty'],\n queryFn: () => loyalty.get(),\n }),\n points: () =>\n queryOptions<number | null>({\n queryKey: ['loyalty', 'points'],\n queryFn: () => loyalty.getPointsBalance(),\n // Points are customer-scoped; skip for guests (no token) — the request would\n // otherwise 400 with `token_not_provided`.\n enabled: !!getAuthToken(),\n staleTime: 30_000,\n }),\n },\n};\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { api } from './chunk-
|
|
1
|
+
import { api } from './chunk-UZXRQZV2.js';
|
|
2
2
|
|
|
3
3
|
// src/api/wallet.ts
|
|
4
4
|
var wallet = {
|
|
@@ -20,5 +20,5 @@ var wallet = {
|
|
|
20
20
|
};
|
|
21
21
|
|
|
22
22
|
export { wallet };
|
|
23
|
-
//# sourceMappingURL=chunk-
|
|
24
|
-
//# sourceMappingURL=chunk-
|
|
23
|
+
//# sourceMappingURL=chunk-MIKL53WC.js.map
|
|
24
|
+
//# sourceMappingURL=chunk-MIKL53WC.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/api/wallet.ts"],"names":[],"mappings":";;;AAgCO,IAAM,MAAA,GAAS;AAAA,EACpB,IAAA,EAAM,OAAO,MAAA,GAA2B,EAAC,KAAiC;AACxE,IAAA,MAAM,EAAE,IAAA,GAAO,CAAA,EAAG,OAAA,GAAU,EAAA,EAAI,QAAO,GAAI,MAAA;AAE3C,IAAA,MAAM,YAAA,GAAe,IAAI,eAAA,EAAgB;AACzC,IAAA,YAAA,CAAa,GAAA,CAAI,MAAA,EAAQ,MAAA,CAAO,IAAI,CAAC,CAAA;AACrC,IAAA,YAAA,CAAa,GAAA,CAAI,UAAA,EAAY,MAAA,CAAO,OAAO,CAAC,CAAA;AAE5C,IAAA,MAAM,UAAmC,EAAC;AAC1C,IAAA,IAAI,MAAA,UAAgB,MAAA,GAAS,MAAA;AAE7B,IAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CACpB,GAAA,CAAI,CAAA,eAAA,EAAkB,YAAA,CAAa,QAAA,EAAU,CAAA,CAAA,EAAI,OAAc,CAAA,CAC/D,IAAA,EAAsE;AAEzE,IAAA,MAAM,YAAA,GAAe,SAAS,IAAA,CAAK,YAAA;AAEnC,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,YAAA,CAAa,IAAA,IAAQ,EAAC;AAAA,MAC7B,MAAM,YAAA,CAAa,aAAA;AAAA,MACnB,OAAA,EAAS,SAAS,IAAA,CAAK;AAAA,KACzB;AAAA,EACF;AACF","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/api/wallet.ts"],"names":[],"mappings":";;;AAgCO,IAAM,MAAA,GAAS;AAAA,EACpB,IAAA,EAAM,OAAO,MAAA,GAA2B,EAAC,KAAiC;AACxE,IAAA,MAAM,EAAE,IAAA,GAAO,CAAA,EAAG,OAAA,GAAU,EAAA,EAAI,QAAO,GAAI,MAAA;AAE3C,IAAA,MAAM,YAAA,GAAe,IAAI,eAAA,EAAgB;AACzC,IAAA,YAAA,CAAa,GAAA,CAAI,MAAA,EAAQ,MAAA,CAAO,IAAI,CAAC,CAAA;AACrC,IAAA,YAAA,CAAa,GAAA,CAAI,UAAA,EAAY,MAAA,CAAO,OAAO,CAAC,CAAA;AAE5C,IAAA,MAAM,UAAmC,EAAC;AAC1C,IAAA,IAAI,MAAA,UAAgB,MAAA,GAAS,MAAA;AAE7B,IAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CACpB,GAAA,CAAI,CAAA,eAAA,EAAkB,YAAA,CAAa,QAAA,EAAU,CAAA,CAAA,EAAI,OAAc,CAAA,CAC/D,IAAA,EAAsE;AAEzE,IAAA,MAAM,YAAA,GAAe,SAAS,IAAA,CAAK,YAAA;AAEnC,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,YAAA,CAAa,IAAA,IAAQ,EAAC;AAAA,MAC7B,MAAM,YAAA,CAAa,aAAA;AAAA,MACnB,OAAA,EAAS,SAAS,IAAA,CAAK;AAAA,KACzB;AAAA,EACF;AACF","file":"chunk-MIKL53WC.js","sourcesContent":["import { api } from './client';\n\nexport interface TransactionItem {\n id: number;\n order_id: number;\n transaction_type: string;\n action_type: string;\n type: string;\n title: string;\n description: string;\n amount: number;\n created_at: number;\n expired_at: number;\n}\n\nexport interface WalletListParams {\n page?: number;\n perPage?: number;\n signal?: AbortSignal;\n}\n\nexport interface WalletListResponse {\n data: TransactionItem[];\n next_page_url: string | null;\n}\n\nexport interface WalletListResult {\n items: TransactionItem[];\n next: string | null;\n balance: number;\n}\n\nexport const wallet = {\n list: async (params: WalletListParams = {}): Promise<WalletListResult> => {\n const { page = 1, perPage = 10, signal } = params;\n\n const searchParams = new URLSearchParams();\n searchParams.set('page', String(page));\n searchParams.set('per_page', String(perPage));\n\n const options: Record<string, unknown> = {};\n if (signal) options.signal = signal;\n\n const response = await api\n .get(`balance/wallet?${searchParams.toString()}`, options as any)\n .json<{ data: { transactions: WalletListResponse; balance: number } }>();\n\n const transactions = response.data.transactions;\n\n return {\n items: transactions.data ?? [],\n next: transactions.next_page_url,\n balance: response.data.balance,\n };\n },\n};\n"]}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { isEditorFrame } from './chunk-OXMUPNMH.js';
|
|
2
|
+
|
|
1
3
|
// src/components/live-editor/frame.ts
|
|
2
4
|
var EDITOR_ORIGINS = [
|
|
3
5
|
"https://s.salla.sa",
|
|
@@ -21,6 +23,15 @@ function parentOrigin() {
|
|
|
21
23
|
return null;
|
|
22
24
|
}
|
|
23
25
|
}
|
|
26
|
+
function isLocalEditor(origin) {
|
|
27
|
+
if (origin === window.location.origin) return false;
|
|
28
|
+
try {
|
|
29
|
+
const { protocol, hostname } = new URL(origin);
|
|
30
|
+
return protocol === "http:" && (hostname === "localhost" || hostname === "127.0.0.1");
|
|
31
|
+
} catch {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
24
35
|
function editorOrigin() {
|
|
25
36
|
if (typeof window === "undefined") return null;
|
|
26
37
|
let origin;
|
|
@@ -29,7 +40,15 @@ function editorOrigin() {
|
|
|
29
40
|
} catch {
|
|
30
41
|
return null;
|
|
31
42
|
}
|
|
32
|
-
|
|
43
|
+
if (!origin) return null;
|
|
44
|
+
if (EDITOR_ORIGINS.includes(origin)) return origin;
|
|
45
|
+
return import.meta.env.DEV && isLocalEditor(origin) ? origin : null;
|
|
46
|
+
}
|
|
47
|
+
function editorFrame() {
|
|
48
|
+
if (typeof window === "undefined") return null;
|
|
49
|
+
if (import.meta.env.DEV && isEditorFrame()) return { origin: window.location.origin, dev: true };
|
|
50
|
+
const origin = editorOrigin();
|
|
51
|
+
return origin ? { origin, dev: false } : null;
|
|
33
52
|
}
|
|
34
53
|
function postToEditor(origin, action, data) {
|
|
35
54
|
window.parent.postMessage({ action, data, is_salla: true }, origin);
|
|
@@ -58,6 +77,6 @@ function targetOf(node) {
|
|
|
58
77
|
return null;
|
|
59
78
|
}
|
|
60
79
|
|
|
61
|
-
export { BLOCK_ATTRIBUTE, FRAME_LOADED_ACTION, areaOf,
|
|
62
|
-
//# sourceMappingURL=chunk-
|
|
63
|
-
//# sourceMappingURL=chunk-
|
|
80
|
+
export { BLOCK_ATTRIBUTE, FRAME_LOADED_ACTION, areaOf, editorFrame, postToEditor, targetOf };
|
|
81
|
+
//# sourceMappingURL=chunk-MVNWWZWQ.js.map
|
|
82
|
+
//# sourceMappingURL=chunk-MVNWWZWQ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/live-editor/frame.ts"],"names":[],"mappings":"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","file":"chunk-MVNWWZWQ.js","sourcesContent":["/**\n * The storefront's side of the merchant theme editor's live preview: the editor\n * (`s.salla.sa/themes/editor`) frames the store, and the store tells it which\n * block, header or footer the merchant acted on, with the same `postMessage`\n * protocol the twig themes' `live-themes-editor.js` speaks.\n */\n\nimport { isEditorFrame } from '../../dev/schema-types';\n\n/** Where the theme editor runs. Messages go to the one that framed the page, never to `*`. */\nexport const EDITOR_ORIGINS = [\n 'https://s.salla.sa',\n 'https://salla.design',\n 'https://demostore.salla.sa',\n] as const;\n\n/** Sent once the page has loaded; the editor's preview health check waits for it. */\nexport const FRAME_LOADED_ACTION = 'design::iframe.loaded';\n\nexport type BlockAction = 'edit' | 'hide' | 'moveup' | 'movedown' | 'duplicate' | 'add' | 'delete';\n\nexport type LiveEditorMessage =\n `preview::${BlockAction}.component` | 'preview::edit.header' | 'preview::edit.footer';\n\n/** A home block, rendered by `HomeComponentRenderer`, carries its id here. */\nexport const BLOCK_ATTRIBUTE = 'data-live-block';\n\n/** A theme can name its header or footer for the editor: `data-live-editor=\"header\"`. */\nexport const AREA_ATTRIBUTE = 'data-live-editor';\n\n/** Header and footer of themes that don't mark theirs: the engine's own, and Raed's. */\nexport const AREA_FALLBACKS = {\n header: 'header.store-header, header.site-header',\n footer: '.store-footer',\n} as const;\n\nexport type Area = keyof typeof AREA_FALLBACKS;\n\n/** The origin of the page that frames this one, or `null` at the top or when unknown. */\nfunction parentOrigin(): string | null {\n if (window.self === window.top) return null;\n // Chromium and Safari name it directly; Firefox only through the referrer.\n const ancestor = window.location.ancestorOrigins?.[0];\n if (ancestor) return ancestor;\n try {\n return document.referrer ? new URL(document.referrer).origin : null;\n } catch {\n return null;\n }\n}\n\n/**\n * On a dev server, a page on another localhost port (an editor run locally, or\n * a test harness) can frame the store too. Not its own origin: that is the\n * engine's dev editor, which has its own controls.\n */\nfunction isLocalEditor(origin: string): boolean {\n if (origin === window.location.origin) return false;\n try {\n const { protocol, hostname } = new URL(origin);\n return protocol === 'http:' && (hostname === 'localhost' || hostname === '127.0.0.1');\n } catch {\n return false;\n }\n}\n\n/** The theme editor's origin when it frames this page, otherwise `null`. Browser only. */\nexport function editorOrigin(): string | null {\n if (typeof window === 'undefined') return null;\n let origin: string | null;\n try {\n origin = parentOrigin();\n } catch {\n return null;\n }\n if (!origin) return null;\n if ((EDITOR_ORIGINS as readonly string[]).includes(origin)) return origin;\n return import.meta.env.DEV && isLocalEditor(origin) ? origin : null;\n}\n\nexport interface EditorFrame {\n origin: string;\n /** The engine's own dev editor (`/__twilight/editor`): edits apply live, and blocks can't be hidden. */\n dev: boolean;\n}\n\n/** The editor framing this page, the merchant's or (on a dev server) the engine's own. Browser only. */\nexport function editorFrame(): EditorFrame | null {\n if (typeof window === 'undefined') return null;\n if (import.meta.env.DEV && isEditorFrame()) return { origin: window.location.origin, dev: true };\n const origin = editorOrigin();\n return origin ? { origin, dev: false } : null;\n}\n\nexport function postToEditor(\n origin: string,\n action: LiveEditorMessage | typeof FRAME_LOADED_ACTION,\n data?: { id: string }\n): void {\n window.parent.postMessage({ action, data, is_salla: true }, origin);\n}\n\n/** The header or footer `el` stands for, if any. One inside a dialog (a sheet's copy) is not it. */\nexport function areaOf(el: Element): Area | null {\n if (el.closest('[role=\"dialog\"]')) return null;\n const marked = el.getAttribute(AREA_ATTRIBUTE);\n if (marked === 'header' || marked === 'footer') return marked;\n if (el.matches(AREA_FALLBACKS.header)) return 'header';\n if (el.matches(AREA_FALLBACKS.footer)) return 'footer';\n return null;\n}\n\n/** What the editor can act on: a block with an id, the header, or the footer. */\nexport const TARGET_SELECTOR = [\n `[${BLOCK_ATTRIBUTE}]`,\n `[${AREA_ATTRIBUTE}=\"header\"]`,\n `[${AREA_ATTRIBUTE}=\"footer\"]`,\n AREA_FALLBACKS.header,\n AREA_FALLBACKS.footer,\n].join(', ');\n\n/** The block, header or footer under `node`, nearest first. */\nexport function targetOf(node: EventTarget | null): HTMLElement | null {\n let el = node instanceof Element ? node.closest<HTMLElement>(TARGET_SELECTOR) : null;\n while (el) {\n if (el.hasAttribute(BLOCK_ATTRIBUTE) || areaOf(el)) return el;\n el = el.parentElement?.closest<HTMLElement>(TARGET_SELECTOR) ?? null;\n }\n return null;\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getActiveCurrency } from './chunk-
|
|
1
|
+
import { getActiveCurrency } from './chunk-UZXRQZV2.js';
|
|
2
2
|
import { whenSallaLoaded } from './chunk-GYXUYHKO.js';
|
|
3
3
|
import { getTwilightContext } from './chunk-7VNVCHID.js';
|
|
4
4
|
|
|
@@ -36,5 +36,5 @@ function dispatchProductViewed(product) {
|
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
export { dispatchProductViewed, dispatchRouteChanged };
|
|
39
|
-
//# sourceMappingURL=chunk-
|
|
40
|
-
//# sourceMappingURL=chunk-
|
|
39
|
+
//# sourceMappingURL=chunk-N5PGVFSO.js.map
|
|
40
|
+
//# sourceMappingURL=chunk-N5PGVFSO.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/sdk-events.ts"],"names":[],"mappings":";;;;;AA6BO,SAAS,oBAAA,GAA6B;AAC3C,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAEnC,EAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AACrB,EAAA,IAAI,CAAC,KAAA,EAAO,KAAA,EAAO,QAAA,EAAU;AAE7B,EAAA,MAAM,MAAM,kBAAA,EAAmB;AAC/B,EAAA,KAAA,CAAM,MAAM,QAAA,CAAS,gBAAA,EAAkB,GAAA,CAAI,IAAA,IAAQ,EAAE,CAAA;AACvD;AAMO,SAAS,sBAAsB,OAAA,EAAwB;AAC5D,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACnC,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,IAAK,CAAA;AACvC,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,EAAO,GAAA,IAAO,EAAA;AACpC,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,IAAI,OAAA,CAAQ,EAAA;AAAA,IACZ,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,UAAA,EAAY,OAAA,CAAQ,QAAA,GAAW,CAAC,EAAE,EAAA,EAAI,OAAA,CAAQ,QAAA,CAAS,EAAA,EAAI,MAAM,OAAA,CAAQ,QAAA,CAAS,IAAA,EAAM,IAAI,EAAC;AAAA,IAC7F,QAAA,EAAU,OAAA,CAAQ,QAAA,EAAU,IAAA,IAAQ,EAAA;AAAA,IACpC,KAAA;AAAA,IACA,QAAA,EAAU,CAAA;AAAA,IACV,OAAA,EAAS,EAAA;AAAA,IACT,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,IAAA,IAAQ,EAAA;AAAA,IAC9B,KAAA;AAAA,IACA,QAAA,EAAU,iBAAA,CAAkB,OAAA,CAAQ,QAAQ,CAAA;AAAA,IAC5C,GAAA,EAAK,QAAQ,GAAA,IAAO,EAAA;AAAA,IACpB,KAAA,EAAO,KAAA;AAAA,IACP,KAAK,OAAA,CAAQ,GAAA;AAAA,IACb,SAAA,EAAW;AAAA,GACb;AAEA,EAAA,eAAA;AAAA,IACE,CAAC,GAAA,KAAQ,KAAK,GAAA,CAAI,SAAQ,CAAE,IAAA,CAAK,MAAM,GAAA,CAAI,MAAM,QAAA,CAAS,gBAAA,EAAkB,CAAC,OAAO,CAAC,CAAC;AAAA,GACxF;AACF","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/utils/sdk-events.ts"],"names":[],"mappings":";;;;;AA6BO,SAAS,oBAAA,GAA6B;AAC3C,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAEnC,EAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AACrB,EAAA,IAAI,CAAC,KAAA,EAAO,KAAA,EAAO,QAAA,EAAU;AAE7B,EAAA,MAAM,MAAM,kBAAA,EAAmB;AAC/B,EAAA,KAAA,CAAM,MAAM,QAAA,CAAS,gBAAA,EAAkB,GAAA,CAAI,IAAA,IAAQ,EAAE,CAAA;AACvD;AAMO,SAAS,sBAAsB,OAAA,EAAwB;AAC5D,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACnC,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,IAAK,CAAA;AACvC,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,EAAO,GAAA,IAAO,EAAA;AACpC,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,IAAI,OAAA,CAAQ,EAAA;AAAA,IACZ,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,UAAA,EAAY,OAAA,CAAQ,QAAA,GAAW,CAAC,EAAE,EAAA,EAAI,OAAA,CAAQ,QAAA,CAAS,EAAA,EAAI,MAAM,OAAA,CAAQ,QAAA,CAAS,IAAA,EAAM,IAAI,EAAC;AAAA,IAC7F,QAAA,EAAU,OAAA,CAAQ,QAAA,EAAU,IAAA,IAAQ,EAAA;AAAA,IACpC,KAAA;AAAA,IACA,QAAA,EAAU,CAAA;AAAA,IACV,OAAA,EAAS,EAAA;AAAA,IACT,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,IAAA,IAAQ,EAAA;AAAA,IAC9B,KAAA;AAAA,IACA,QAAA,EAAU,iBAAA,CAAkB,OAAA,CAAQ,QAAQ,CAAA;AAAA,IAC5C,GAAA,EAAK,QAAQ,GAAA,IAAO,EAAA;AAAA,IACpB,KAAA,EAAO,KAAA;AAAA,IACP,KAAK,OAAA,CAAQ,GAAA;AAAA,IACb,SAAA,EAAW;AAAA,GACb;AAEA,EAAA,eAAA;AAAA,IACE,CAAC,GAAA,KAAQ,KAAK,GAAA,CAAI,SAAQ,CAAE,IAAA,CAAK,MAAM,GAAA,CAAI,MAAM,QAAA,CAAS,gBAAA,EAAkB,CAAC,OAAO,CAAC,CAAC;AAAA,GACxF;AACF","file":"chunk-N5PGVFSO.js","sourcesContent":["import { getTwilightContext } from '../twilight/context';\nimport type { PageContext } from '../twilight/context';\nimport type { Product } from '../types';\nimport { getActiveCurrency } from '../api/client';\nimport { whenSallaLoaded } from './sdk-helpers';\n\n/**\n * Payload dispatched via `salla.event.dispatch('route::changed', payload)`\n * after each client-side navigation completes.\n *\n * The page config fields are spread at root level. When the matched route\n * has no page data (e.g., 404, error boundary), an empty object is dispatched.\n *\n * @example\n * ```ts\n * salla.event.on('route::changed', (page: RouteChangedEvent) => {\n * console.log(page.slug, page.title, page.id);\n * });\n * ```\n */\nexport type RouteChangedEvent = PageContext;\n\n/**\n * Dispatch the `route::changed` Salla SDK event with the current page config.\n *\n * Framework-agnostic — reads from the twilight context store which is\n * populated by whichever framework adapter is active (TanStack, Next.js, etc.).\n * Each adapter should call this after navigation resolves.\n */\nexport function dispatchRouteChanged(): void {\n if (typeof window === 'undefined') return;\n\n const salla = window.salla;\n if (!salla?.event?.dispatch) return;\n\n const ctx = getTwilightContext();\n salla.event.dispatch('route::changed', ctx.page ?? {});\n}\n\n/**\n * Dispatch `Product Viewed`, which Twig's product page hands the SDK through `salla.init`'s\n * `events`: store analytics, pixels and apps that remember viewed products listen for it.\n */\nexport function dispatchProductViewed(product: Product): void {\n if (typeof window === 'undefined') return;\n const price = Number(product.price) || 0;\n const image = product.image?.url ?? '';\n const payload = {\n id: product.id,\n name: product.name,\n categories: product.category ? [{ id: product.category.id, name: product.category.name }] : [],\n category: product.category?.name ?? '',\n price,\n quantity: 1,\n variant: '',\n brand: product.brand?.name ?? '',\n image,\n currency: getActiveCurrency(product.currency),\n sku: product.sku ?? '',\n value: price,\n url: product.url,\n image_url: image,\n };\n // After init: analytics drops events until `salla.init` has merged the store's `jitsu` list.\n whenSallaLoaded(\n (sdk) => void sdk.onReady().then(() => sdk.event.dispatch('Product Viewed', [payload]))\n );\n}\n"]}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { useIsHome } from './chunk-
|
|
2
|
-
import { PageAdvertisements } from './chunk-
|
|
1
|
+
import { useIsHome } from './chunk-HEGWAECO.js';
|
|
2
|
+
import { PageAdvertisements } from './chunk-ST6FMVXY.js';
|
|
3
3
|
import { HookSlot, useIsClient } from './chunk-5XDPAKF5.js';
|
|
4
4
|
import { useTranslation } from './chunk-TYNZ5B2B.js';
|
|
5
|
-
import { Image } from './chunk-
|
|
5
|
+
import { Image } from './chunk-2CJGX6QU.js';
|
|
6
6
|
import { useTwilight } from './chunk-DF6FBKDN.js';
|
|
7
7
|
import { lazy, useState } from 'react';
|
|
8
8
|
import { SallaCartSummary } from '@salla.sa/twilight-components-react/cart-summary';
|
|
@@ -13,9 +13,9 @@ import { SallaSearch } from '@salla.sa/twilight-components-react/search';
|
|
|
13
13
|
import { SallaUserMenu } from '@salla.sa/twilight-components-react/user-menu';
|
|
14
14
|
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
15
15
|
|
|
16
|
-
var LazyMainMenu = lazy(() => import('./MainMenu-
|
|
16
|
+
var LazyMainMenu = lazy(() => import('./MainMenu-NUJSMS3W.js').then((m) => ({ default: m.MainMenu })));
|
|
17
17
|
var LazyMobileMenu = lazy(
|
|
18
|
-
() => import('./MobileMenu-
|
|
18
|
+
() => import('./MobileMenu-N7P6Z6TM.js').then((m) => ({ default: m.MobileMenu }))
|
|
19
19
|
);
|
|
20
20
|
function HeaderContacts() {
|
|
21
21
|
const { store } = useTwilight();
|
|
@@ -126,5 +126,5 @@ function Header(_props) {
|
|
|
126
126
|
}
|
|
127
127
|
|
|
128
128
|
export { Header };
|
|
129
|
-
//# sourceMappingURL=chunk-
|
|
130
|
-
//# sourceMappingURL=chunk-
|
|
129
|
+
//# sourceMappingURL=chunk-N6X7ESEY.js.map
|
|
130
|
+
//# sourceMappingURL=chunk-N6X7ESEY.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/navigation/lazy.ts","../src/components/layout/Header.tsx"],"names":[],"mappings":"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","file":"chunk-ISTESEV6.js","sourcesContent":["import { lazy } from 'react';\n\n/**\n * Lazy-loaded navigation components\n * Use these for code-splitting navigation sections\n */\nexport const LazyMainMenu = lazy(() => import('./MainMenu').then((m) => ({ default: m.MainMenu })));\n\nexport const LazyMobileMenu = lazy(() =>\n import('./MobileMenu').then((m) => ({ default: m.MobileMenu }))\n);\n","import { useState } from 'react';\nimport { useIsHome } from '../../providers/NavigationProvider';\nimport { SallaCartSummary } from '@salla.sa/twilight-components-react/cart-summary';\nimport { SallaContacts } from '@salla.sa/twilight-components-react/contacts';\nimport { SallaLocalizationModal } from '@salla.sa/twilight-components-react/localization-modal';\nimport { SallaMenu } from '@salla.sa/twilight-components-react/menu';\nimport { SallaSearch } from '@salla.sa/twilight-components-react/search';\nimport { SallaUserMenu } from '@salla.sa/twilight-components-react/user-menu';\nimport { useTwilight } from '../../providers/twilight-context';\nimport { useTranslation } from '../../providers/I18nProvider';\nimport { HookSlot } from '../../hooks/HookSlot';\nimport { useIsClient } from '../../hooks/useIsClient';\nimport { MainMenu, MobileMenu } from '../navigation';\nimport { Image } from '../common';\nimport { PageAdvertisements } from './PageAdvertisements';\nimport type { Cart } from '../../types';\n\ninterface HeaderProps {\n cart?: Cart;\n}\n\n/** The store's phone and email in the top nav. `<salla-contacts>` fills its light DOM\n * once the SDK is ready, which can come before React hydrates it: a hydration error\n * (React #418). So it renders after mount. */\nfunction HeaderContacts() {\n const { store } = useTwilight();\n const isClient = useIsClient();\n if (!isClient) return null;\n return <SallaContacts contacts={store?.contacts} contactsTitle=\"N/A\" isHeader />;\n}\n\nexport function Header(_props: HeaderProps) {\n const { currency, theme, store } = useTwilight();\n const { locale, languageName } = useTranslation();\n const settings = theme?.settings || {};\n const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false);\n\n // Check if we're on homepage\n const isHomepage = useIsHome();\n\n const StoreTitle = isHomepage ? 'h1' : 'span';\n\n return (\n <header className=\"store-header\" suppressHydrationWarning>\n <HookSlot name=\"header:start\" />\n <div className=\"advertisement-slot\">\n <PageAdvertisements />\n </div>\n {/* Top Nav */}\n <div className={`top-navbar${settings.topnav_is_dark ? ' top-navbar--dark' : ''}`}>\n <div className=\"container flex justify-between\">\n <div className=\"flex-1 flex items-center gap-2\">\n {/* Footer Menu */}\n {settings.important_links && <SallaMenu source=\"footer\" topnav />}\n\n {/* Language & Currency */}\n <div className=\"header-buttons\">\n {(store?.settings?.is_multilingual || store?.settings?.currencies_enabled) && (\n <>\n <button\n type=\"button\"\n onClick={() => window.salla?.event.dispatch('localization::open')}\n className=\"btn--rounded-gray basis-0\"\n >\n <span>{languageName}</span>\n <span className=\"mx-1.5\">|</span>\n <span className={`flag iti__flag iti__${store?.country.toLowerCase()}`}></span>\n\n <span>\n {store?.settings?.use_sar_symbol && currency?.code === 'SAR' ? (\n <i className=\"sicon-sar\"></i>\n ) : (\n <>{currency?.symbol}</>\n )}\n </span>\n </button>\n {/* TODO:: support switch the lang without hit the web API, by set it in the sdk and local storage */}\n {/* TODO:: Support switch the curency without hit the web API, by set it in the sdk and local storage */}\n <SallaLocalizationModal\n language={locale}\n currency={currency?.code || 'SAR'}\n suppressHydrationWarning\n />\n </>\n )}\n </div>\n\n {/* Scopes / Branches */}\n {store?.scope && (\n <button\n type=\"button\"\n className=\"btn--rounded-gray\"\n onClick={() =>\n window.salla?.event.dispatch('scopes::open', {\n mode: 'default',\n })\n }\n >\n <i className=\"sicon-location rtl:ml-1 ltr:mr-1\"></i>\n {store.scope.name}\n </button>\n )}\n\n {/* Search bar */}\n <div className=\"header-search flex-1\">\n {/* todo:: use a search icon insted with open the search popup */}\n <SallaSearch inline oval height={36} />\n </div>\n </div>\n\n <HeaderContacts />\n </div>\n </div>\n\n {/* Main Nav */}\n <div\n id=\"mainnav\"\n className={`main-nav-container shadow-default bg-white flex items-center relative z-50${settings.header_is_sticky ? ' sticky top-0' : ''}`}\n >\n <div className=\"inner bg-inherit w-full\">\n <div className=\"container\">\n <div className=\"flex items-stretch justify-between relative\">\n <div className=\"flex items-center\">\n <a\n className=\"lg:hidden mburger mburger--collapse leading-none rtl:ml-4 ltr:mr-4\"\n href=\"#mobile-menu\"\n aria-label=\"Open-menu\"\n onClick={(e) => {\n e.preventDefault();\n setIsMobileMenuOpen(true);\n }}\n >\n <i className=\"sicon-menu text-primary text-2xl\"></i>\n </a>\n <a className=\"navbar-brand\" href={store?.url || '/'}>\n <div className=\"logo-wrapper\">\n <Image\n src={store?.logo}\n alt={`${store?.name || 'Store'} logo`}\n priority\n width={120}\n height={48}\n />\n </div>\n <StoreTitle className=\"sr-only\">{store?.name || 'Store'}</StoreTitle>\n </a>\n <MainMenu />\n </div>\n <div className=\"flex items-center justify-end my-2.5\">\n <SallaUserMenu avatarOnly showHeader className=\"header-btn\" />\n <SallaCartSummary className=\"ml-4 rtl:ml-[unset] rtl:mr-4\">\n <i slot=\"icon\" className=\"header-btn__icon icon sicon-shopping-bag\"></i>\n </SallaCartSummary>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n {/* Mobile Menu */}\n <MobileMenu isOpen={isMobileMenuOpen} onClose={() => setIsMobileMenuOpen(false)} />\n <HookSlot name=\"header:end\" />\n </header>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/navigation/lazy.ts","../src/components/layout/Header.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;AAMO,IAAM,YAAA,GAAe,IAAA,CAAK,MAAM,OAAO,wBAAY,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,MAAO,EAAE,OAAA,EAAS,CAAA,CAAE,QAAA,GAAW,CAAC,CAAA;AAE3F,IAAM,cAAA,GAAiB,IAAA;AAAA,EAAK,MACjC,OAAO,0BAAc,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,MAAO,EAAE,OAAA,EAAS,CAAA,CAAE,UAAA,EAAW,CAAE;AAChE,CAAA;ACcA,SAAS,cAAA,GAAiB;AACxB,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,WAAA,EAAY;AAC9B,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AACtB,EAAA,uBAAO,GAAA,CAAC,iBAAc,QAAA,EAAU,KAAA,EAAO,UAAU,aAAA,EAAc,KAAA,EAAM,UAAQ,IAAA,EAAC,CAAA;AAChF;AAEO,SAAS,OAAO,MAAA,EAAqB;AAC1C,EAAA,MAAM,EAAE,QAAA,EAAU,KAAA,EAAO,KAAA,KAAU,WAAA,EAAY;AAC/C,EAAA,MAAM,EAAE,MAAA,EAAQ,YAAA,EAAa,GAAI,cAAA,EAAe;AAChD,EAAA,MAAM,QAAA,GAAW,KAAA,EAAO,QAAA,IAAY,EAAC;AACrC,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAI,SAAS,KAAK,CAAA;AAG9D,EAAA,MAAM,aAAa,SAAA,EAAU;AAE7B,EAAA,MAAM,UAAA,GAAa,aAAa,IAAA,GAAO,MAAA;AAEvC,EAAA,uBACE,IAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,cAAA,EAAe,0BAAwB,IAAA,EACvD,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,QAAA,EAAA,EAAS,MAAK,cAAA,EAAe,CAAA;AAAA,wBAC7B,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EACb,QAAA,kBAAA,GAAA,CAAC,sBAAmB,CAAA,EACtB,CAAA;AAAA,oBAEA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,UAAA,EAAa,QAAA,CAAS,cAAA,GAAiB,mBAAA,GAAsB,EAAE,CAAA,CAAA,EAC7E,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gCAAA,EACb,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,gCAAA,EAEZ,QAAA,EAAA;AAAA,QAAA,QAAA,CAAS,mCAAmB,GAAA,CAAC,SAAA,EAAA,EAAU,MAAA,EAAO,QAAA,EAAS,QAAM,IAAA,EAAC,CAAA;AAAA,wBAG/D,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACX,QAAA,EAAA,CAAA,KAAA,EAAO,UAAU,eAAA,IAAmB,KAAA,EAAO,QAAA,EAAU,kBAAA,qBACrD,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,0BAAA,IAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,SAAS,MAAM,MAAA,CAAO,KAAA,EAAO,KAAA,CAAM,SAAS,oBAAoB,CAAA;AAAA,cAChE,SAAA,EAAU,2BAAA;AAAA,cAEV,QAAA,EAAA;AAAA,gCAAA,GAAA,CAAC,UAAM,QAAA,EAAA,YAAA,EAAa,CAAA;AAAA,gCACpB,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,QAAA,EAAS,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,gCAC1B,GAAA,CAAC,UAAK,SAAA,EAAW,CAAA,qBAAA,EAAwB,OAAO,OAAA,CAAQ,WAAA,EAAa,CAAA,CAAA,EAAI,CAAA;AAAA,oCAExE,MAAA,EAAA,EACE,QAAA,EAAA,KAAA,EAAO,QAAA,EAAU,cAAA,IAAkB,UAAU,IAAA,KAAS,KAAA,mBACrD,GAAA,CAAC,GAAA,EAAA,EAAE,WAAU,WAAA,EAAY,CAAA,mBAEzB,GAAA,CAAA,QAAA,EAAA,EAAG,QAAA,EAAA,QAAA,EAAU,QAAO,CAAA,EAExB;AAAA;AAAA;AAAA,WACF;AAAA,0BAGA,GAAA;AAAA,YAAC,sBAAA;AAAA,YAAA;AAAA,cACC,QAAA,EAAU,MAAA;AAAA,cACV,QAAA,EAAU,UAAU,IAAA,IAAQ,KAAA;AAAA,cAC5B,wBAAA,EAAwB;AAAA;AAAA;AAC1B,SAAA,EACF,CAAA,EAEJ,CAAA;AAAA,QAGC,OAAO,KAAA,oBACN,IAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,SAAA,EAAU,mBAAA;AAAA,YACV,SAAS,MACP,MAAA,CAAO,KAAA,EAAO,KAAA,CAAM,SAAS,cAAA,EAAgB;AAAA,cAC3C,IAAA,EAAM;AAAA,aACP,CAAA;AAAA,YAGH,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,GAAA,EAAA,EAAE,WAAU,kCAAA,EAAmC,CAAA;AAAA,cAC/C,MAAM,KAAA,CAAM;AAAA;AAAA;AAAA,SACf;AAAA,wBAIF,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EAEb,QAAA,kBAAA,GAAA,CAAC,WAAA,EAAA,EAAY,MAAA,EAAM,IAAA,EAAC,IAAA,EAAI,IAAA,EAAC,MAAA,EAAQ,EAAA,EAAI,CAAA,EACvC;AAAA,OAAA,EACF,CAAA;AAAA,0BAEC,cAAA,EAAA,EAAe;AAAA,KAAA,EAClB,CAAA,EACF,CAAA;AAAA,oBAGA,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,EAAA,EAAG,SAAA;AAAA,QACH,SAAA,EAAW,CAAA,0EAAA,EAA6E,QAAA,CAAS,gBAAA,GAAmB,kBAAkB,EAAE,CAAA,CAAA;AAAA,QAExI,QAAA,kBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,kBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6CAAA,EACb,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,mBAAA,EACb,QAAA,EAAA;AAAA,4BAAA,GAAA;AAAA,cAAC,GAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,oEAAA;AAAA,gBACV,IAAA,EAAK,cAAA;AAAA,gBACL,YAAA,EAAW,WAAA;AAAA,gBACX,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,kBAAA,CAAA,CAAE,cAAA,EAAe;AACjB,kBAAA,mBAAA,CAAoB,IAAI,CAAA;AAAA,gBAC1B,CAAA;AAAA,gBAEA,QAAA,kBAAA,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,kCAAA,EAAmC;AAAA;AAAA,aAClD;AAAA,iCACC,GAAA,EAAA,EAAE,SAAA,EAAU,gBAAe,IAAA,EAAM,KAAA,EAAO,OAAO,GAAA,EAC9C,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,KAAA,EAAA,EAAI,WAAU,cAAA,EACb,QAAA,kBAAA,GAAA;AAAA,gBAAC,KAAA;AAAA,gBAAA;AAAA,kBACC,KAAK,KAAA,EAAO,IAAA;AAAA,kBACZ,GAAA,EAAK,CAAA,EAAG,KAAA,EAAO,IAAA,IAAQ,OAAO,CAAA,KAAA,CAAA;AAAA,kBAC9B,QAAA,EAAQ,IAAA;AAAA,kBACR,KAAA,EAAO,GAAA;AAAA,kBACP,MAAA,EAAQ;AAAA;AAAA,eACV,EACF,CAAA;AAAA,kCACC,UAAA,EAAA,EAAW,SAAA,EAAU,SAAA,EAAW,QAAA,EAAA,KAAA,EAAO,QAAQ,OAAA,EAAQ;AAAA,aAAA,EAC1D,CAAA;AAAA,gCACC,YAAA,EAAA,EAAS;AAAA,WAAA,EACZ,CAAA;AAAA,0BACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sCAAA,EACb,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,iBAAc,UAAA,EAAU,IAAA,EAAC,UAAA,EAAU,IAAA,EAAC,WAAU,YAAA,EAAa,CAAA;AAAA,4BAC5D,GAAA,CAAC,gBAAA,EAAA,EAAiB,SAAA,EAAU,8BAAA,EAC1B,QAAA,kBAAA,GAAA,CAAC,OAAE,IAAA,EAAK,MAAA,EAAO,SAAA,EAAU,0CAAA,EAA2C,CAAA,EACtE;AAAA,WAAA,EACF;AAAA,SAAA,EACF,GACF,CAAA,EACF;AAAA;AAAA,KACF;AAAA,oBAGA,GAAA,CAAC,kBAAW,MAAA,EAAQ,gBAAA,EAAkB,SAAS,MAAM,mBAAA,CAAoB,KAAK,CAAA,EAAG,CAAA;AAAA,oBACjF,GAAA,CAAC,QAAA,EAAA,EAAS,IAAA,EAAK,YAAA,EAAa;AAAA,GAAA,EAC9B,CAAA;AAEJ","file":"chunk-N6X7ESEY.js","sourcesContent":["import { lazy } from 'react';\n\n/**\n * Lazy-loaded navigation components\n * Use these for code-splitting navigation sections\n */\nexport const LazyMainMenu = lazy(() => import('./MainMenu').then((m) => ({ default: m.MainMenu })));\n\nexport const LazyMobileMenu = lazy(() =>\n import('./MobileMenu').then((m) => ({ default: m.MobileMenu }))\n);\n","import { useState } from 'react';\nimport { useIsHome } from '../../providers/NavigationProvider';\nimport { SallaCartSummary } from '@salla.sa/twilight-components-react/cart-summary';\nimport { SallaContacts } from '@salla.sa/twilight-components-react/contacts';\nimport { SallaLocalizationModal } from '@salla.sa/twilight-components-react/localization-modal';\nimport { SallaMenu } from '@salla.sa/twilight-components-react/menu';\nimport { SallaSearch } from '@salla.sa/twilight-components-react/search';\nimport { SallaUserMenu } from '@salla.sa/twilight-components-react/user-menu';\nimport { useTwilight } from '../../providers/twilight-context';\nimport { useTranslation } from '../../providers/I18nProvider';\nimport { HookSlot } from '../../hooks/HookSlot';\nimport { useIsClient } from '../../hooks/useIsClient';\nimport { MainMenu, MobileMenu } from '../navigation';\nimport { Image } from '../common';\nimport { PageAdvertisements } from './PageAdvertisements';\nimport type { Cart } from '../../types';\n\ninterface HeaderProps {\n cart?: Cart;\n}\n\n/** The store's phone and email in the top nav. `<salla-contacts>` fills its light DOM\n * once the SDK is ready, which can come before React hydrates it: a hydration error\n * (React #418). So it renders after mount. */\nfunction HeaderContacts() {\n const { store } = useTwilight();\n const isClient = useIsClient();\n if (!isClient) return null;\n return <SallaContacts contacts={store?.contacts} contactsTitle=\"N/A\" isHeader />;\n}\n\nexport function Header(_props: HeaderProps) {\n const { currency, theme, store } = useTwilight();\n const { locale, languageName } = useTranslation();\n const settings = theme?.settings || {};\n const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false);\n\n // Check if we're on homepage\n const isHomepage = useIsHome();\n\n const StoreTitle = isHomepage ? 'h1' : 'span';\n\n return (\n <header className=\"store-header\" suppressHydrationWarning>\n <HookSlot name=\"header:start\" />\n <div className=\"advertisement-slot\">\n <PageAdvertisements />\n </div>\n {/* Top Nav */}\n <div className={`top-navbar${settings.topnav_is_dark ? ' top-navbar--dark' : ''}`}>\n <div className=\"container flex justify-between\">\n <div className=\"flex-1 flex items-center gap-2\">\n {/* Footer Menu */}\n {settings.important_links && <SallaMenu source=\"footer\" topnav />}\n\n {/* Language & Currency */}\n <div className=\"header-buttons\">\n {(store?.settings?.is_multilingual || store?.settings?.currencies_enabled) && (\n <>\n <button\n type=\"button\"\n onClick={() => window.salla?.event.dispatch('localization::open')}\n className=\"btn--rounded-gray basis-0\"\n >\n <span>{languageName}</span>\n <span className=\"mx-1.5\">|</span>\n <span className={`flag iti__flag iti__${store?.country.toLowerCase()}`}></span>\n\n <span>\n {store?.settings?.use_sar_symbol && currency?.code === 'SAR' ? (\n <i className=\"sicon-sar\"></i>\n ) : (\n <>{currency?.symbol}</>\n )}\n </span>\n </button>\n {/* TODO:: support switch the lang without hit the web API, by set it in the sdk and local storage */}\n {/* TODO:: Support switch the curency without hit the web API, by set it in the sdk and local storage */}\n <SallaLocalizationModal\n language={locale}\n currency={currency?.code || 'SAR'}\n suppressHydrationWarning\n />\n </>\n )}\n </div>\n\n {/* Scopes / Branches */}\n {store?.scope && (\n <button\n type=\"button\"\n className=\"btn--rounded-gray\"\n onClick={() =>\n window.salla?.event.dispatch('scopes::open', {\n mode: 'default',\n })\n }\n >\n <i className=\"sicon-location rtl:ml-1 ltr:mr-1\"></i>\n {store.scope.name}\n </button>\n )}\n\n {/* Search bar */}\n <div className=\"header-search flex-1\">\n {/* todo:: use a search icon insted with open the search popup */}\n <SallaSearch inline oval height={36} />\n </div>\n </div>\n\n <HeaderContacts />\n </div>\n </div>\n\n {/* Main Nav */}\n <div\n id=\"mainnav\"\n className={`main-nav-container shadow-default bg-white flex items-center relative z-50${settings.header_is_sticky ? ' sticky top-0' : ''}`}\n >\n <div className=\"inner bg-inherit w-full\">\n <div className=\"container\">\n <div className=\"flex items-stretch justify-between relative\">\n <div className=\"flex items-center\">\n <a\n className=\"lg:hidden mburger mburger--collapse leading-none rtl:ml-4 ltr:mr-4\"\n href=\"#mobile-menu\"\n aria-label=\"Open-menu\"\n onClick={(e) => {\n e.preventDefault();\n setIsMobileMenuOpen(true);\n }}\n >\n <i className=\"sicon-menu text-primary text-2xl\"></i>\n </a>\n <a className=\"navbar-brand\" href={store?.url || '/'}>\n <div className=\"logo-wrapper\">\n <Image\n src={store?.logo}\n alt={`${store?.name || 'Store'} logo`}\n priority\n width={120}\n height={48}\n />\n </div>\n <StoreTitle className=\"sr-only\">{store?.name || 'Store'}</StoreTitle>\n </a>\n <MainMenu />\n </div>\n <div className=\"flex items-center justify-end my-2.5\">\n <SallaUserMenu avatarOnly showHeader className=\"header-btn\" />\n <SallaCartSummary className=\"ml-4 rtl:ml-[unset] rtl:mr-4\">\n <i slot=\"icon\" className=\"header-btn__icon icon sicon-shopping-bag\"></i>\n </SallaCartSummary>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n {/* Mobile Menu */}\n <MobileMenu isOpen={isMobileMenuOpen} onClose={() => setIsMobileMenuOpen(false)} />\n <HookSlot name=\"header:end\" />\n </header>\n );\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { api } from './chunk-
|
|
1
|
+
import { api } from './chunk-UZXRQZV2.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-NWYOIN5R.js.map
|
|
28
|
+
//# sourceMappingURL=chunk-NWYOIN5R.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-NWYOIN5R.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"]}
|