@salla.sa/twilight-theme-engine 1.0.129 → 1.0.130
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-I2SZGGZK.js → AddToCartForm-ZJIIU4I4.js} +3 -3
- package/dist/{AddToCartForm-I2SZGGZK.js.map → AddToCartForm-ZJIIU4I4.js.map} +1 -1
- package/dist/{BlogAuthorPage-JHZHLSIA.js → BlogAuthorPage-DNZSR42D.js} +18 -17
- package/dist/BlogAuthorPage-DNZSR42D.js.map +1 -0
- package/dist/{BlogCategoryPage-F4264MQG.js → BlogCategoryPage-AC4DDQ7N.js} +18 -17
- package/dist/BlogCategoryPage-AC4DDQ7N.js.map +1 -0
- package/dist/{BlogPage-3TELFUFM.js → BlogPage-F5OY24RP.js} +16 -15
- package/dist/BlogPage-F5OY24RP.js.map +1 -0
- package/dist/{BlogSinglePage-QBADHXXZ.js → BlogSinglePage-YXC5WU3N.js} +16 -15
- package/dist/BlogSinglePage-YXC5WU3N.js.map +1 -0
- package/dist/{BlogTagPage-WEP37KDY.js → BlogTagPage-6QQ2CF2B.js} +18 -17
- package/dist/BlogTagPage-6QQ2CF2B.js.map +1 -0
- package/dist/{BrandsPage-EENWKAIY.js → BrandsPage-UXWNTTT3.js} +17 -16
- package/dist/BrandsPage-UXWNTTT3.js.map +1 -0
- package/dist/{Breadcrumb-A2CNX5VU.js → Breadcrumb-TUXEVRZZ.js} +16 -15
- package/dist/Breadcrumb-TUXEVRZZ.js.map +1 -0
- package/dist/{CartItem-X7UB2GZG.js → CartItem-B7AYUFGZ.js} +16 -15
- package/dist/CartItem-B7AYUFGZ.js.map +1 -0
- package/dist/{CartSummary-EEJ3JO6E.js → CartSummary-LSFD7QUY.js} +16 -15
- package/dist/CartSummary-LSFD7QUY.js.map +1 -0
- package/dist/{Copyright-VGOFMMIR.js → Copyright-HH2S2KDM.js} +3 -3
- package/dist/{Copyright-VGOFMMIR.js.map → Copyright-HH2S2KDM.js.map} +1 -1
- package/dist/{CustomerLayout-2E6ENXOH.js → CustomerLayout-2NVQ6G72.js} +16 -15
- package/dist/CustomerLayout-2NVQ6G72.js.map +1 -0
- package/dist/{Footer-5L3YKKPB.js → Footer-4LQIBAHJ.js} +4 -4
- package/dist/{Footer-5L3YKKPB.js.map → Footer-4LQIBAHJ.js.map} +1 -1
- package/dist/{Header-KMURB263.js → Header-VQTPIQPS.js} +8 -8
- package/dist/{Header-KMURB263.js.map → Header-VQTPIQPS.js.map} +1 -1
- package/dist/{LoyaltyPage-WI2SL6SR.js → LoyaltyPage-NSHSLS4O.js} +16 -15
- package/dist/LoyaltyPage-NSHSLS4O.js.map +1 -0
- package/dist/{LoyaltyPointsPage-RKGFGLL4.js → LoyaltyPointsPage-7CUUKDLR.js} +6 -6
- package/dist/{LoyaltyPointsPage-RKGFGLL4.js.map → LoyaltyPointsPage-7CUUKDLR.js.map} +1 -1
- package/dist/{MainMenu-VFI4SRRS.js → MainMenu-NTSSUK6R.js} +5 -5
- package/dist/{MainMenu-VFI4SRRS.js.map → MainMenu-NTSSUK6R.js.map} +1 -1
- package/dist/MaintenancePage-A7CNHM7B.js +7 -0
- package/dist/{MaintenancePage-7Y4QA5LD.js.map → MaintenancePage-A7CNHM7B.js.map} +1 -1
- package/dist/{MasterLayout-AZSOVNPR.js → MasterLayout-ZOT7XICQ.js} +16 -15
- package/dist/{MasterLayout-AZSOVNPR.js.map → MasterLayout-ZOT7XICQ.js.map} +1 -1
- package/dist/{MobileMenu-PRND3T3Z.js → MobileMenu-RBTT3KLS.js} +17 -16
- package/dist/MobileMenu-RBTT3KLS.js.map +1 -0
- package/dist/{NotificationsPage-VPCF5TNJ.js → NotificationsPage-T775PMFX.js} +16 -15
- package/dist/NotificationsPage-T775PMFX.js.map +1 -0
- package/dist/{OrderSinglePage-BIPGDSSI.js → OrderSinglePage-T5SKWUNW.js} +17 -16
- package/dist/OrderSinglePage-T5SKWUNW.js.map +1 -0
- package/dist/{OrdersPage-DTI5CYHH.js → OrdersPage-PGAD6DDY.js} +16 -15
- package/dist/OrdersPage-PGAD6DDY.js.map +1 -0
- package/dist/{PageSingle-VUKTKJKB.js → PageSingle-6W7U5YLG.js} +3 -3
- package/dist/{PageSingle-VUKTKJKB.js.map → PageSingle-6W7U5YLG.js.map} +1 -1
- package/dist/{ProductDetails-CUSUV3YF.js → ProductDetails-JFOFLMLV.js} +4 -4
- package/dist/{ProductDetails-CUSUV3YF.js.map → ProductDetails-JFOFLMLV.js.map} +1 -1
- package/dist/{ProfilePage-APTF4ZI3.js → ProfilePage-2HZYDJBM.js} +16 -15
- package/dist/ProfilePage-2HZYDJBM.js.map +1 -0
- package/dist/{ReviewsPage-Q5UUELM5.js → ReviewsPage-FYAZU7FT.js} +3 -3
- package/dist/{ReviewsPage-Q5UUELM5.js.map → ReviewsPage-FYAZU7FT.js.map} +1 -1
- package/dist/{SeoCartWidget-7BLWJVZ7.js → SeoCartWidget-7SUVC6MT.js} +16 -15
- package/dist/SeoCartWidget-7SUVC6MT.js.map +1 -0
- package/dist/{SettingsPage-I6STBZ2M.js → SettingsPage-IBWVB4ZJ.js} +16 -15
- package/dist/SettingsPage-IBWVB4ZJ.js.map +1 -0
- package/dist/{StoreClosedNotification-PNOFS2B5.js → StoreClosedNotification-CMOHA4LU.js} +17 -16
- package/dist/{StoreClosedNotification-PNOFS2B5.js.map → StoreClosedNotification-CMOHA4LU.js.map} +1 -1
- package/dist/{TestimonialsPage-S64KZKPY.js → TestimonialsPage-WJMIDBRM.js} +3 -3
- package/dist/{TestimonialsPage-S64KZKPY.js.map → TestimonialsPage-WJMIDBRM.js.map} +1 -1
- package/dist/{ThankYouPage-VGNCUZTV.js → ThankYouPage-NILOPG4H.js} +16 -15
- package/dist/ThankYouPage-NILOPG4H.js.map +1 -0
- package/dist/{WalletPage-MIXW2MTQ.js → WalletPage-5O553SIT.js} +17 -16
- package/dist/WalletPage-5O553SIT.js.map +1 -0
- package/dist/{WishlistPage-RVWSOXRC.js → WishlistPage-JPLKEMDX.js} +18 -17
- package/dist/WishlistPage-JPLKEMDX.js.map +1 -0
- 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.d.ts +8 -0
- package/dist/api/store.d.ts.map +1 -1
- package/dist/api/store.js +3 -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-2A2NODLC.js +14 -0
- package/dist/{chunk-DEZVFNN2.js.map → chunk-2A2NODLC.js.map} +1 -1
- package/dist/{chunk-IWBUTY3D.js → chunk-2UQKQTPB.js} +4 -4
- package/dist/{chunk-IWBUTY3D.js.map → chunk-2UQKQTPB.js.map} +1 -1
- package/dist/{chunk-KQEBYXYB.js → chunk-3CNXPHJE.js} +4 -69
- package/dist/chunk-3CNXPHJE.js.map +1 -0
- package/dist/{chunk-6I2J6V3S.js → chunk-4FYLW5WS.js} +3 -3
- package/dist/{chunk-6I2J6V3S.js.map → chunk-4FYLW5WS.js.map} +1 -1
- package/dist/{chunk-NOVJ3US5.js → chunk-4SMWY54W.js} +3 -3
- package/dist/{chunk-NOVJ3US5.js.map → chunk-4SMWY54W.js.map} +1 -1
- package/dist/{chunk-PTSJOV2E.js → chunk-52MZ4V5T.js} +4 -4
- package/dist/{chunk-PTSJOV2E.js.map → chunk-52MZ4V5T.js.map} +1 -1
- package/dist/{chunk-QRFYOEZY.js → chunk-54FS47CL.js} +3 -3
- package/dist/{chunk-QRFYOEZY.js.map → chunk-54FS47CL.js.map} +1 -1
- package/dist/{chunk-EPTYC5H3.js → chunk-5DVSAKNY.js} +4 -4
- package/dist/{chunk-EPTYC5H3.js.map → chunk-5DVSAKNY.js.map} +1 -1
- package/dist/{chunk-3TKG3ORJ.js → chunk-5JN6P5L5.js} +6 -6
- package/dist/{chunk-3TKG3ORJ.js.map → chunk-5JN6P5L5.js.map} +1 -1
- package/dist/{chunk-FFIONN5M.js → chunk-672DTSG4.js} +7 -7
- package/dist/{chunk-FFIONN5M.js.map → chunk-672DTSG4.js.map} +1 -1
- package/dist/{chunk-ZWOD67SV.js → chunk-AIPIJWOC.js} +3 -3
- package/dist/{chunk-ZWOD67SV.js.map → chunk-AIPIJWOC.js.map} +1 -1
- package/dist/{chunk-XX4L34QI.js → chunk-AN2PETFM.js} +6 -6
- package/dist/{chunk-XX4L34QI.js.map → chunk-AN2PETFM.js.map} +1 -1
- package/dist/{chunk-GJFWNFMU.js → chunk-AXPZEXJN.js} +3 -3
- package/dist/{chunk-GJFWNFMU.js.map → chunk-AXPZEXJN.js.map} +1 -1
- package/dist/{chunk-OQTBHL5T.js → chunk-BSGHOYMT.js} +3 -3
- package/dist/{chunk-OQTBHL5T.js.map → chunk-BSGHOYMT.js.map} +1 -1
- package/dist/{chunk-FBOWKMPX.js → chunk-CGDUSBLK.js} +17 -16
- package/dist/chunk-CGDUSBLK.js.map +1 -0
- package/dist/{chunk-J5DGBS7Q.js → chunk-CKH6WBMA.js} +71 -7
- package/dist/chunk-CKH6WBMA.js.map +1 -0
- package/dist/{chunk-763YWRXT.js → chunk-D423MW2M.js} +3 -3
- package/dist/{chunk-763YWRXT.js.map → chunk-D423MW2M.js.map} +1 -1
- package/dist/{chunk-6VBXPDXM.js → chunk-EDCRELH3.js} +3 -3
- package/dist/{chunk-6VBXPDXM.js.map → chunk-EDCRELH3.js.map} +1 -1
- package/dist/{chunk-VWZG5QKQ.js → chunk-ELARAFMR.js} +3 -3
- package/dist/{chunk-VWZG5QKQ.js.map → chunk-ELARAFMR.js.map} +1 -1
- package/dist/{chunk-OJ7YQEW7.js → chunk-EZP2KOEL.js} +4 -4
- package/dist/{chunk-OJ7YQEW7.js.map → chunk-EZP2KOEL.js.map} +1 -1
- package/dist/chunk-FID76MUV.js +73 -0
- package/dist/chunk-FID76MUV.js.map +1 -0
- package/dist/{chunk-ECY5POOK.js → chunk-GSI42HHP.js} +3 -3
- package/dist/{chunk-ECY5POOK.js.map → chunk-GSI42HHP.js.map} +1 -1
- package/dist/{chunk-747V3UL5.js → chunk-HH7WFQLN.js} +3 -3
- package/dist/{chunk-747V3UL5.js.map → chunk-HH7WFQLN.js.map} +1 -1
- package/dist/{chunk-V4HOZSIW.js → chunk-I5XU5BQH.js} +3 -3
- package/dist/{chunk-V4HOZSIW.js.map → chunk-I5XU5BQH.js.map} +1 -1
- package/dist/{chunk-L75KAYY5.js → chunk-ITMXD75H.js} +12 -11
- package/dist/chunk-ITMXD75H.js.map +1 -0
- package/dist/{chunk-AT3IL55G.js → chunk-IUEYRDEI.js} +3 -3
- package/dist/{chunk-AT3IL55G.js.map → chunk-IUEYRDEI.js.map} +1 -1
- package/dist/{chunk-ASTCQSK6.js → chunk-JLBDDH4N.js} +3 -3
- package/dist/{chunk-ASTCQSK6.js.map → chunk-JLBDDH4N.js.map} +1 -1
- package/dist/{chunk-RPRZYRPX.js → chunk-K3PQSDGA.js} +4 -4
- package/dist/{chunk-RPRZYRPX.js.map → chunk-K3PQSDGA.js.map} +1 -1
- package/dist/{chunk-DEDX3AIO.js → chunk-KME6DTES.js} +7 -7
- package/dist/{chunk-DEDX3AIO.js.map → chunk-KME6DTES.js.map} +1 -1
- package/dist/{chunk-2M5BICJK.js → chunk-NITRRCQV.js} +4 -4
- package/dist/{chunk-2M5BICJK.js.map → chunk-NITRRCQV.js.map} +1 -1
- package/dist/{chunk-2SCIGF3L.js → chunk-NLT6YWUD.js} +4 -4
- package/dist/{chunk-2SCIGF3L.js.map → chunk-NLT6YWUD.js.map} +1 -1
- package/dist/{chunk-RDMEIF2O.js → chunk-OR6HPFZT.js} +4 -4
- package/dist/{chunk-RDMEIF2O.js.map → chunk-OR6HPFZT.js.map} +1 -1
- package/dist/{chunk-F5H7QF2T.js → chunk-ORBMN52O.js} +4 -4
- package/dist/{chunk-F5H7QF2T.js.map → chunk-ORBMN52O.js.map} +1 -1
- package/dist/{chunk-EMOLTV77.js → chunk-QYHNS2KS.js} +4 -4
- package/dist/{chunk-EMOLTV77.js.map → chunk-QYHNS2KS.js.map} +1 -1
- package/dist/{chunk-OOSLYT2L.js → chunk-RQ72QOIC.js} +7 -7
- package/dist/{chunk-OOSLYT2L.js.map → chunk-RQ72QOIC.js.map} +1 -1
- package/dist/{chunk-D7IP4MVJ.js → chunk-RXWWNPCR.js} +5 -5
- package/dist/{chunk-D7IP4MVJ.js.map → chunk-RXWWNPCR.js.map} +1 -1
- package/dist/{chunk-WQJT663R.js → chunk-SCM4P6QG.js} +3 -3
- package/dist/{chunk-WQJT663R.js.map → chunk-SCM4P6QG.js.map} +1 -1
- package/dist/{chunk-G74DWDSJ.js → chunk-T55LMU5R.js} +3 -3
- package/dist/{chunk-G74DWDSJ.js.map → chunk-T55LMU5R.js.map} +1 -1
- package/dist/{chunk-QPKK4LPK.js → chunk-WYWI77EA.js} +23 -4
- package/dist/chunk-WYWI77EA.js.map +1 -0
- package/dist/{chunk-CLZRX5TX.js → chunk-X4A3D5O4.js} +3 -3
- package/dist/{chunk-CLZRX5TX.js.map → chunk-X4A3D5O4.js.map} +1 -1
- package/dist/{chunk-OYPE6432.js → chunk-YGCPRUT6.js} +5 -3
- package/dist/chunk-YGCPRUT6.js.map +1 -0
- package/dist/{chunk-WOMGFBX5.js → chunk-YSSJ2CQC.js} +4 -4
- package/dist/{chunk-WOMGFBX5.js.map → chunk-YSSJ2CQC.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 +14 -13
- package/dist/components/home/index.js +18 -17
- package/dist/components/layout/index.js +4 -4
- package/dist/components/product/index.js +15 -14
- package/dist/components/store/MaintenancePage.d.ts +3 -2
- package/dist/components/store/MaintenancePage.d.ts.map +1 -1
- package/dist/components/store/index.js +16 -15
- package/dist/dev/editor/index.js +1 -1
- package/dist/dev/index.js +1 -1
- package/dist/{document-class-7JZLKPFE.js → document-class-2SKG4YZE.js} +13 -12
- package/dist/{document-class-7JZLKPFE.js.map → document-class-2SKG4YZE.js.map} +1 -1
- package/dist/hooks/index.js +14 -13
- package/dist/hooks/useGtm.js +14 -13
- package/dist/hooks/useMoney.js +14 -13
- package/dist/hooks/useStore.js +14 -13
- package/dist/hooks/useUser.js +3 -3
- package/dist/index.js +14 -13
- package/dist/index.js.map +1 -1
- package/dist/{navigation-L77QYQHZ.js → navigation-7HBHI524.js} +4 -4
- package/dist/{navigation-L77QYQHZ.js.map → navigation-7HBHI524.js.map} +1 -1
- package/dist/{navigation-IUHYIHIQ.js → navigation-WVVYQOOZ.js} +5 -5
- package/dist/{navigation-IUHYIHIQ.js.map → navigation-WVVYQOOZ.js.map} +1 -1
- package/dist/{not-found-YVGX5ST2.js → not-found-ZN7HOUO4.js} +17 -16
- package/dist/not-found-ZN7HOUO4.js.map +1 -0
- package/dist/providers/NavigationProvider.d.ts +2 -0
- package/dist/providers/NavigationProvider.d.ts.map +1 -1
- package/dist/providers/index.js +14 -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 +22 -21
- package/dist/routes/cart.js.map +1 -1
- package/dist/routes/home.js +19 -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 +20 -19
- package/dist/routes/product-listing.js.map +1 -1
- package/dist/routes/product.js +18 -17
- package/dist/routes/product.js.map +1 -1
- 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 +19 -18
- package/dist/{store-lookup-F66OF7JS.js → store-lookup-KSHMPOFT.js} +8 -8
- package/dist/{store-lookup-F66OF7JS.js.map → store-lookup-KSHMPOFT.js.map} +1 -1
- package/dist/tanstack.js +13 -12
- package/dist/tanstack.js.map +1 -1
- package/dist/types/twilight.d.ts +4 -2
- package/dist/types/twilight.d.ts.map +1 -1
- package/dist/utils/index.js +2 -2
- package/dist/utils/maintenance.d.ts +13 -0
- package/dist/utils/maintenance.d.ts.map +1 -1
- package/package.json +1 -1
- package/tailwind/components/store/MaintenancePage.tsx.txt +116 -6
- package/dist/BlogAuthorPage-JHZHLSIA.js.map +0 -1
- package/dist/BlogCategoryPage-F4264MQG.js.map +0 -1
- package/dist/BlogPage-3TELFUFM.js.map +0 -1
- package/dist/BlogSinglePage-QBADHXXZ.js.map +0 -1
- package/dist/BlogTagPage-WEP37KDY.js.map +0 -1
- package/dist/BrandsPage-EENWKAIY.js.map +0 -1
- package/dist/Breadcrumb-A2CNX5VU.js.map +0 -1
- package/dist/CartItem-X7UB2GZG.js.map +0 -1
- package/dist/CartSummary-EEJ3JO6E.js.map +0 -1
- package/dist/CustomerLayout-2E6ENXOH.js.map +0 -1
- package/dist/LoyaltyPage-WI2SL6SR.js.map +0 -1
- package/dist/MaintenancePage-7Y4QA5LD.js +0 -7
- package/dist/MobileMenu-PRND3T3Z.js.map +0 -1
- package/dist/NotificationsPage-VPCF5TNJ.js.map +0 -1
- package/dist/OrderSinglePage-BIPGDSSI.js.map +0 -1
- package/dist/OrdersPage-DTI5CYHH.js.map +0 -1
- package/dist/ProfilePage-APTF4ZI3.js.map +0 -1
- package/dist/SeoCartWidget-7BLWJVZ7.js.map +0 -1
- package/dist/SettingsPage-I6STBZ2M.js.map +0 -1
- package/dist/ThankYouPage-VGNCUZTV.js.map +0 -1
- package/dist/WalletPage-MIXW2MTQ.js.map +0 -1
- package/dist/WishlistPage-RVWSOXRC.js.map +0 -1
- package/dist/chunk-DEZVFNN2.js +0 -14
- package/dist/chunk-FBOWKMPX.js.map +0 -1
- package/dist/chunk-J5DGBS7Q.js.map +0 -1
- package/dist/chunk-KQEBYXYB.js.map +0 -1
- package/dist/chunk-L75KAYY5.js.map +0 -1
- package/dist/chunk-OYPE6432.js.map +0 -1
- package/dist/chunk-QPKK4LPK.js.map +0 -1
- package/dist/not-found-YVGX5ST2.js.map +0 -1
package/dist/skeleton.js
CHANGED
|
@@ -1,29 +1,30 @@
|
|
|
1
1
|
export { BlogSkeleton, BreadcrumbSkeleton, CartSkeleton, CustomerLayoutSkeleton, CustomerPageSkeleton, PageSkeleton, ProductCardSkeleton, ProductDetailSkeleton, ProductGridSkeleton, SkeletonPulse } from './chunk-N7CCSGZF.js';
|
|
2
|
-
export { HomeSkeleton } from './chunk-
|
|
3
|
-
import './chunk-
|
|
4
|
-
import './chunk-
|
|
5
|
-
import './chunk-
|
|
6
|
-
import './chunk-
|
|
2
|
+
export { HomeSkeleton } from './chunk-RXWWNPCR.js';
|
|
3
|
+
import './chunk-AN2PETFM.js';
|
|
4
|
+
import './chunk-T55LMU5R.js';
|
|
5
|
+
import './chunk-K3PQSDGA.js';
|
|
6
|
+
import './chunk-5JN6P5L5.js';
|
|
7
7
|
import './chunk-Y32RHCOH.js';
|
|
8
|
-
import './chunk-
|
|
8
|
+
import './chunk-CGDUSBLK.js';
|
|
9
9
|
import './chunk-FHAHE46U.js';
|
|
10
|
-
import './chunk-
|
|
11
|
-
import './chunk-
|
|
12
|
-
import './chunk-
|
|
10
|
+
import './chunk-672DTSG4.js';
|
|
11
|
+
import './chunk-HH7WFQLN.js';
|
|
12
|
+
import './chunk-3CNXPHJE.js';
|
|
13
13
|
import './chunk-JYV25VNZ.js';
|
|
14
|
-
import './chunk-
|
|
14
|
+
import './chunk-SCM4P6QG.js';
|
|
15
15
|
import './chunk-OXMUPNMH.js';
|
|
16
|
-
import './chunk-
|
|
16
|
+
import './chunk-AXPZEXJN.js';
|
|
17
17
|
import './chunk-VVZNW5CB.js';
|
|
18
18
|
import './chunk-5FJFN3IW.js';
|
|
19
19
|
import './chunk-GD26FI4J.js';
|
|
20
|
+
import './chunk-FID76MUV.js';
|
|
20
21
|
import './chunk-OM2GRPDH.js';
|
|
21
|
-
import './chunk-
|
|
22
|
+
import './chunk-WYWI77EA.js';
|
|
22
23
|
import './chunk-OUW6WESU.js';
|
|
23
24
|
import './chunk-BK5TBUGG.js';
|
|
24
25
|
import './chunk-HI5V5X3S.js';
|
|
25
|
-
import './chunk-
|
|
26
|
-
import './chunk-
|
|
26
|
+
import './chunk-GSI42HHP.js';
|
|
27
|
+
import './chunk-ELARAFMR.js';
|
|
27
28
|
import './chunk-MVT5AF2A.js';
|
|
28
29
|
import './chunk-Z653O7MX.js';
|
|
29
30
|
import './chunk-ZCH7W7DZ.js';
|
|
@@ -34,16 +35,16 @@ import './chunk-7V36I5GT.js';
|
|
|
34
35
|
import './chunk-6WI7R2BD.js';
|
|
35
36
|
import './chunk-JGVEGQHJ.js';
|
|
36
37
|
import './chunk-OAMIDZKW.js';
|
|
37
|
-
import './chunk-
|
|
38
|
+
import './chunk-D423MW2M.js';
|
|
38
39
|
import './chunk-OQIIJRAS.js';
|
|
39
40
|
import './chunk-V2ZDTY6H.js';
|
|
40
|
-
import './chunk-
|
|
41
|
+
import './chunk-54FS47CL.js';
|
|
41
42
|
import './chunk-5XDPAKF5.js';
|
|
42
43
|
import './chunk-GCPEMNSU.js';
|
|
43
|
-
import './chunk-
|
|
44
|
+
import './chunk-BSGHOYMT.js';
|
|
44
45
|
import './chunk-Z5M4YYWT.js';
|
|
45
46
|
import './chunk-TYNZ5B2B.js';
|
|
46
|
-
import './chunk-
|
|
47
|
+
import './chunk-IUEYRDEI.js';
|
|
47
48
|
import './chunk-AXW67SY7.js';
|
|
48
49
|
import './chunk-BYMOPN2S.js';
|
|
49
50
|
import './chunk-SKLEJJ6M.js';
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { category } from './chunk-
|
|
2
|
-
import { blog } from './chunk-
|
|
3
|
-
import { brand } from './chunk-
|
|
4
|
-
import { product } from './chunk-
|
|
1
|
+
import { category } from './chunk-5DVSAKNY.js';
|
|
2
|
+
import { blog } from './chunk-QYHNS2KS.js';
|
|
3
|
+
import { brand } from './chunk-EZP2KOEL.js';
|
|
4
|
+
import { product } from './chunk-K3PQSDGA.js';
|
|
5
5
|
import { DEV_LOOKUP_BUDGET_MS } from './chunk-OXMUPNMH.js';
|
|
6
|
-
import './chunk-
|
|
6
|
+
import './chunk-WYWI77EA.js';
|
|
7
7
|
import './chunk-OUW6WESU.js';
|
|
8
|
-
import './chunk-
|
|
8
|
+
import './chunk-BSGHOYMT.js';
|
|
9
9
|
import './chunk-Z5M4YYWT.js';
|
|
10
10
|
import './chunk-2TLIULJZ.js';
|
|
11
11
|
import './chunk-GYXUYHKO.js';
|
|
@@ -111,5 +111,5 @@ function lookupInStore(source, query) {
|
|
|
111
111
|
}
|
|
112
112
|
|
|
113
113
|
export { lookupInStore };
|
|
114
|
-
//# sourceMappingURL=store-lookup-
|
|
115
|
-
//# sourceMappingURL=store-lookup-
|
|
114
|
+
//# sourceMappingURL=store-lookup-KSHMPOFT.js.map
|
|
115
|
+
//# sourceMappingURL=store-lookup-KSHMPOFT.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/dev/store-lookup.ts"],"names":["categories"],"mappings":"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","file":"store-lookup-
|
|
1
|
+
{"version":3,"sources":["../src/dev/store-lookup.ts"],"names":["categories"],"mappings":"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","file":"store-lookup-KSHMPOFT.js","sourcesContent":["/**\n * Runs in the editor's frame (the storefront), which has the engine's API\n * client set up for the dev store: answers the editor's pickers with the real\n * store's products, categories, brands and blog. Loaded with `import()` on the\n * first lookup, so a storefront never carries it.\n *\n * Each item's `data` is what a block receives for it, in the API's shape: a\n * product block reads only the ids and fetches the rest, while categories and\n * brands are drawn from what is saved.\n */\n\nimport { product } from '../api/product';\nimport { category } from '../api/category';\nimport { brand } from '../api/brands';\nimport { blog } from '../api/blog';\nimport type { Category } from '../types';\nimport { DEV_LOOKUP_BUDGET_MS, type DevLookupItem, type DevLookupSource } from './schema-types';\n\n/** Enough to choose from; a search narrows it further. */\nconst PER_PAGE = 20;\n/** How far a paged list is searched before giving up, so a big store can't stall the picker. */\nconst MAX_PAGES = 10;\n\ninterface Page<T> {\n items: T[];\n next: string | null;\n}\n\n/**\n * The matching items of a paged list, read page after page until there are\n * enough, the pages run out, or the time budget is spent: a brand or article on\n * page three is still found, and what was found so far always reaches the\n * editor before it stops waiting (`DEV_LOOKUP_BUDGET_MS` < its timeout).\n */\nasync function collect<T>(\n fetchPage: (page: number, cursor: string | null) => Promise<Page<T>>,\n keep: (item: T) => boolean\n): Promise<T[]> {\n const deadline = Date.now() + DEV_LOOKUP_BUDGET_MS;\n const found: T[] = [];\n let cursor: string | null = null;\n for (let page = 1; page <= MAX_PAGES; page += 1) {\n const { items, next } = await fetchPage(page, cursor);\n found.push(...items.filter(keep));\n if (found.length >= PER_PAGE || !next || Date.now() >= deadline) break;\n cursor = next;\n }\n return found.slice(0, PER_PAGE);\n}\n\nfunction matches(name: string, query: string): boolean {\n return !query || name.toLowerCase().includes(query.toLowerCase());\n}\n\n/** Categories with their subcategories, flattened, parents first. */\nfunction flatten(categories: Category[]): Category[] {\n return categories.flatMap((c) => [c, ...flatten(c.sub_categories ?? [])]);\n}\n\nasync function products(query: string): Promise<DevLookupItem[]> {\n const { items } = await product.list({\n source: query ? 'search' : 'latest',\n ...(query ? { keyword: query } : {}),\n perPage: PER_PAGE,\n });\n // List responses send the id as a numeric string; the block reads a number. Use it for both.\n return items.map((p) => ({\n id: Number(p.id),\n name: p.name,\n image: p.image?.url,\n url: p.url,\n data: { id: Number(p.id), name: p.name, url: p.url, image: p.image?.url ?? null },\n }));\n}\n\nasync function categories(query: string): Promise<DevLookupItem[]> {\n return flatten(await category.list())\n .filter((c) => matches(c.name, query))\n .slice(0, PER_PAGE)\n .map((c) => ({\n id: c.id,\n name: c.name,\n image: c.image ?? undefined,\n url: c.url,\n data: { id: c.id, name: c.name, url: c.url, image: c.image ?? null, icon: c.icon ?? null },\n }));\n}\n\nasync function brands(query: string): Promise<DevLookupItem[]> {\n const found = await collect(\n (page) => brand.list(page),\n (b) => matches(b.name, query)\n );\n return found.map((b) => ({\n id: b.id,\n name: b.name,\n image: b.logo,\n url: b.url,\n data: { id: b.id, name: b.name, url: b.url, logo: b.logo, banner: b.banner ?? null },\n }));\n}\n\nasync function blogArticles(query: string): Promise<DevLookupItem[]> {\n const found = await collect(\n async (_page, cursor) => {\n const { data, cursor: pages } = await blog.articles.list(cursor ? { cursor } : undefined);\n return { items: data, next: pages?.next ?? null };\n },\n (a) => matches(a.name, query)\n );\n return found.map((a) => ({\n id: a.id,\n name: a.name,\n image: a.image,\n url: a.url,\n data: { id: a.id, name: a.name, url: a.url },\n }));\n}\n\nasync function blogCategories(query: string): Promise<DevLookupItem[]> {\n const { categories: list } = await blog.get();\n return list\n .filter((c) => matches(c.name, query))\n .slice(0, PER_PAGE)\n .map((c) => ({\n id: c.id,\n name: c.name,\n url: c.url,\n data: { id: c.id, name: c.name, url: c.url },\n }));\n}\n\nconst LOOKUPS: Record<DevLookupSource, (query: string) => Promise<DevLookupItem[]>> = {\n products,\n categories,\n brands,\n blog_articles: blogArticles,\n blog_categories: blogCategories,\n};\n\nexport function lookupInStore(source: DevLookupSource, query: string): Promise<DevLookupItem[]> {\n const lookup = LOOKUPS[source];\n if (!lookup) return Promise.reject(new Error(`no lookup for ${source}`));\n return lookup(query.trim());\n}\n"]}
|
package/dist/tanstack.js
CHANGED
|
@@ -1,25 +1,26 @@
|
|
|
1
|
-
export { tanstackDocumentAdapter as attrs, createRouter, createTwilightRootRoute, useTanstackDocumentAttrs as useAttrs } from './chunk-
|
|
2
|
-
import { requestHostOf } from './chunk-
|
|
3
|
-
export { TanStackLinkAdapter, TanStackNavigationProvider, createTanStackLinkAdapter } from './chunk-
|
|
1
|
+
export { tanstackDocumentAdapter as attrs, createRouter, createTwilightRootRoute, useTanstackDocumentAttrs as useAttrs } from './chunk-ITMXD75H.js';
|
|
2
|
+
import { requestHostOf } from './chunk-EDCRELH3.js';
|
|
3
|
+
export { TanStackLinkAdapter, TanStackNavigationProvider, createTanStackLinkAdapter } from './chunk-EDCRELH3.js';
|
|
4
4
|
import './chunk-Z4Y55HWX.js';
|
|
5
5
|
export { tanstackHeadAdapter as head, withHead } from './chunk-EHTLXK5F.js';
|
|
6
6
|
import { CRITICAL_STYLE_HREF } from './chunk-4FJGZQD3.js';
|
|
7
|
-
import './chunk-
|
|
8
|
-
import { readNativeAppHeaders } from './chunk-
|
|
9
|
-
import './chunk-
|
|
10
|
-
import './chunk-
|
|
11
|
-
import { rootHead
|
|
7
|
+
import './chunk-AIPIJWOC.js';
|
|
8
|
+
import { readNativeAppHeaders } from './chunk-YGCPRUT6.js';
|
|
9
|
+
import './chunk-4FYLW5WS.js';
|
|
10
|
+
import './chunk-K3PQSDGA.js';
|
|
11
|
+
import { rootHead } from './chunk-3CNXPHJE.js';
|
|
12
12
|
import './chunk-JYV25VNZ.js';
|
|
13
|
-
import './chunk-
|
|
13
|
+
import './chunk-AXPZEXJN.js';
|
|
14
14
|
import './chunk-5FJFN3IW.js';
|
|
15
15
|
import './chunk-GD26FI4J.js';
|
|
16
|
+
import { maintenanceEvidence, MAINTENANCE_EVIDENCE_HEADER, maintenanceEvidenceHeader } from './chunk-FID76MUV.js';
|
|
16
17
|
import './chunk-OM2GRPDH.js';
|
|
17
|
-
import './chunk-
|
|
18
|
+
import './chunk-WYWI77EA.js';
|
|
18
19
|
import './chunk-OUW6WESU.js';
|
|
19
20
|
import './chunk-JWXJPJBO.js';
|
|
20
21
|
export { mergeDocumentDescriptors as mergeAttrs } from './chunk-CW625T2E.js';
|
|
21
|
-
import './chunk-
|
|
22
|
-
import './chunk-
|
|
22
|
+
import './chunk-54FS47CL.js';
|
|
23
|
+
import './chunk-BSGHOYMT.js';
|
|
23
24
|
import './chunk-Z5M4YYWT.js';
|
|
24
25
|
import './chunk-TYNZ5B2B.js';
|
|
25
26
|
import './chunk-BYMOPN2S.js';
|
package/dist/tanstack.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/tanstack/stylesheet.tsx","../src/tanstack/middleware/store-not-found.ts","../src/tanstack/middleware/twilight.ts","../src/tanstack/middleware/earlyHints.ts"],"names":["createMiddleware"],"mappings":"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","file":"tanstack.js","sourcesContent":["import { useState, useSyncExternalStore } from 'react';\nimport { Asset, useRouter, useRouterState, useTags } from '@tanstack/react-router';\nimport { CRITICAL_STYLE_HREF } from '../boot/critical-style';\n\nexport interface ThemeStylesheetProps {\n /** The full stylesheet's URL (`app.css?url`). */\n href: string;\n /**\n * Inline critical CSS by route id. A page server-rendered as one of these routes paints from it,\n * and `bootClient` adds `href` once its first screen has painted. Pass the same route ids on the\n * client with empty strings, so hydration renders the same tags without shipping the CSS twice.\n */\n critical?: Readonly<Record<string, string>>;\n}\n\nconst subscribeNothing = () => () => {};\n\n/** The theme's stylesheet: inline critical CSS for the routes that have it, the full sheet otherwise. */\nexport function ThemeStylesheet({ href, critical = {} }: ThemeStylesheetProps) {\n const routeId = useRouterState({\n select: (state): string | undefined =>\n state.matches.find((match) => Object.hasOwn(critical, match.routeId))?.routeId,\n });\n // The route the page was server-rendered as: never added or removed on client-side navigations.\n const [criticalRoute] = useState(routeId);\n const hydrated = useSyncExternalStore(\n subscribeNothing,\n () => true,\n () => false\n );\n\n return (\n <>\n {criticalRoute && (\n // Its own precedence, so it lands before the full sheet; React renders the CSS verbatim.\n <style href={CRITICAL_STYLE_HREF} precedence=\"critical\">\n {critical[criticalRoute]}\n </style>\n )}\n {(!criticalRoute || hydrated) && (\n <link id=\"salla-theme-css\" rel=\"stylesheet\" href={href} precedence=\"default\" />\n )}\n {criticalRoute && (\n <noscript>\n <link rel=\"stylesheet\" href={href} />\n </noscript>\n )}\n </>\n );\n}\n\n/** The route's head tags without module preloads: they raced the LCP image, and the entry loads every chunk anyway. */\nexport function ThemeHeadContent() {\n const tags = useTags();\n const nonce = useRouter().options.ssr?.nonce;\n return tags\n .filter((tag) => !(tag.tag === 'link' && tag.attrs?.rel === 'modulepreload'))\n .map((tag) => <Asset {...tag} key={`tsr-meta-${JSON.stringify(tag)}`} nonce={nonce} />);\n}\n","/**\n * Which address was not found, as Twig's `checkUsername` (SallaApp/Store) tells them\n * apart: a store the request named (a username, `?storeId=`), or the domain itself.\n */\nexport type StoreNotFoundKind = 'store' | 'domain';\n\n/** Twig's copy (`error::errors.<kind>.not_found_*`). Arabic in every language, as there. */\nconst COPY: Record<StoreNotFoundKind, { title: string; message: string }> = {\n store: {\n title: 'المتجر غير موجود!',\n message: 'نأسف هذا المتجر غير موجود حاليا!.',\n },\n domain: {\n title: 'نطاق المتجر غير موجود!',\n message: 'نأسف نطاق المتجر المطلوب غير موجود حاليا!.',\n },\n};\n\n/**\n * The page Twig answers with a 410 when no store has the address it was asked for,\n * with what a visitor sees kept: the same markup and the same stylesheet. Dropped: the\n * feedback form, which Twig renders hidden, and the jQuery and legacy scripts behind\n * it. `iframe-embed` is on `<body>` from the start because Twig's script adds it on\n * every load, and it is what hides the `body--bg` background; the empty `msg-container`\n * keeps the block where Twig's sits. The link goes to merchant sign-up on s.salla.sa;\n * Twig's relative `/register` would reach the theme on any host but salla.sa.\n *\n * One constant document, and only {@link COPY} is ever put into it: nothing from the\n * request reaches this page.\n */\nconst PAGE = `<!DOCTYPE html>\n<html lang=\"ar\" dir=\"rtl\">\n<head>\n<meta charset=\"UTF-8\">\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n<meta name=\"theme-color\" content=\"#37a495\">\n<meta name=\"author\" content=\"منصة سلة\">\n<meta name=\"robots\" content=\"noindex, follow\">\n<meta name=\"copyright\" content=\"Salla.sa\">\n<title>{title}</title>\n<link rel=\"icon\" type=\"image/png\" href=\"https://cdn.salla.network/images/logo/logo-square.png\">\n<link rel=\"apple-touch-icon-precomposed\" href=\"https://cdn.salla.network/images/logo/logo-square.png\">\n<link rel=\"stylesheet\" href=\"https://cdn.salla.network/fonts/pingarlt.css?v=0.2\">\n<link rel=\"stylesheet\" href=\"https://cdn.assets.salla.network/prod/stores/vendor/salla/errors/css/app.css?id=0d7e71fbf018a0d5c478129a56c7a71f\">\n</head>\n<body class=\"body body--rtl body--bg iframe-embed\">\n<header id=\"header\" class=\"header header--404\"></header>\n<main id=\"main\" class=\"main main--404\">\n<div class=\"container container--wide\">\n<div class=\"e404-container\">\n<div class=\"landing\">\n<h1 class=\"title title--giant title--404\"><img src=\"https://cdn.assets.salla.network/prod/stores/vendor/salla/errors/images/error.svg\" alt=\"\"/> 410</h1>\n<h3>{title}</h3>\n<p>{message}<br> بإمكانك العودة للصفحة لرئيسية أو التسجيل للتمتع بمتجر رائع!</p>\n<a href=\"https://s.salla.sa/register\">سجل متجرك الأن</a>\n</div>\n</div>\n<div class=\"form-group msg-container\"></div>\n</div>\n</main>\n<footer id=\"footer\" class=\"footer\"></footer>\n</body>\n</html>\n`;\n\n/** Twig's 410 page for `kind`. */\nexport function storeNotFoundPage(kind: StoreNotFoundKind): string {\n const { title, message } = COPY[kind];\n return PAGE.replaceAll('{title}', title).replace('{message}', message);\n}\n\n/** {@link storeNotFoundPage} as Twig sends it: a 410 that no cache keeps. */\nexport function storeNotFoundResponse(kind: StoreNotFoundKind): Response {\n return new Response(storeNotFoundPage(kind), {\n status: 410,\n headers: {\n 'content-type': 'text/html; charset=UTF-8',\n 'cache-control': 'max-age=0, must-revalidate, no-cache, no-store, private',\n },\n });\n}\n","import type { AnyRequestMiddleware } from '@tanstack/react-start';\nimport { createMiddleware } from '@tanstack/react-start';\nimport {\n extractTokenFromCookies,\n resolveAddressedStore,\n resolveRequestScope,\n resolveRequestVersionId,\n AUTH_TOKEN_COOKIE_NAME,\n STORE_BASE_HEADER,\n} from '../../utils/cookies';\nimport { getTwilightContext, runWithTwilightContext } from '../../twilight/context';\nimport type { StoreContext } from '../../api/store';\nimport {\n MAINTENANCE_EVIDENCE_HEADER,\n maintenanceEvidence,\n maintenanceEvidenceHeader,\n} from '../../utils/maintenance';\nimport { requestHostOf } from '../../utils/request-host';\nimport { legacyLocaleRedirectHref } from '../../utils/store-base';\nimport { readNativeAppHeaders } from '../../utils/native-app-headers';\nimport { storeNotFoundResponse } from './store-not-found';\n\n/**\n * A 503 for the maintenance page, so search engines read it as temporary and keep\n * the store indexed. TanStack sets the SSR status from the router alone (200, 404,\n * 500) and ignores `setResponseStatus`, so the status is applied here, on the\n * response the render produced, from the decision `rootBeforeLoad` left in the\n * request context. Only a 200 is rewritten: a redirect or an error keeps its own.\n *\n * `next()` resolves to the middleware context, whose `response` is the render; a\n * bare `Response` is accepted too. The rewrite keeps the body stream, so TanStack\n * treats it as the same response rather than a replacement to cancel.\n */\nexport function withMaintenanceStatus<T>(result: T): T | Response {\n const response =\n result instanceof Response\n ? result\n : (result as { response?: unknown } | null)?.response instanceof Response\n ? ((result as { response: Response }).response as Response)\n : null;\n if (!response || response.status !== 200 || !getTwilightContext().maintenance) return result;\n const unavailable = new Response(response.body, {\n status: 503,\n statusText: 'Service Unavailable',\n headers: response.headers,\n });\n stampMaintenanceEvidence(unavailable.headers);\n return result instanceof Response ? unavailable : { ...result, response: unavailable };\n}\n\n/**\n * Says on the 503 which settings answer closed the store, and logs it once.\n *\n * The page is for everyone but the merchant, so it is usually the merchant's own\n * store state; when it is not (503s interleaved with 200s on one store), the\n * answer's trace and cache status are what settle it. The Store's trace goes in\n * `x-trace-id`, which the dispatcher already logs for a 5xx.\n */\nfunction stampMaintenanceEvidence(headers: Headers): void {\n let settings: StoreContext | undefined;\n try {\n settings = getTwilightContext().settings;\n } catch {\n return;\n }\n const evidence = maintenanceEvidence(settings);\n if (!Object.keys(evidence).length) return;\n headers.set(MAINTENANCE_EVIDENCE_HEADER, maintenanceEvidenceHeader(evidence));\n if (evidence.trace) headers.set('x-trace-id', evidence.trace);\n console.warn('[twilight] maintenance page', {\n ...evidence,\n title: settings?.maintenance_details?.title,\n });\n}\n\n/**\n * Twig's 410 page in place of the render, once rootBeforeLoad has learned that no store\n * has this request's identifier: there is no store to render, so nothing of it is kept.\n * The page says \"domain\" when the host was the identifier (nothing in the request named\n * a store), as Twig's `checkUsername` does for a host that is not salla.sa.\n *\n * A render that threw is answered the same way. A theme's shell renders even when the\n * root route failed, and one that reads the settings there throws, which h3 would\n * otherwise answer with a bare `{\"status\":500,\"unhandled\":true}`.\n */\nexport function withStoreNotFoundPage<T>(result: T): T | Response {\n if (!getTwilightContext().storeNotFound) return result;\n const page = storeNotFoundAnswer();\n const carried = (result as { response?: unknown } | null)?.response;\n return carried instanceof Response ? { ...result, response: page } : page;\n}\n\n/** The render's failure, unless {@link withStoreNotFoundPage} has an answer for it. */\nexport function storeNotFoundOrThrow(error: unknown): Response {\n if (getTwilightContext().storeNotFound) return storeNotFoundAnswer();\n throw error;\n}\n\n/** A store the request named (`?storeId=`, a path segment, a username), else the host's. */\nfunction storeNotFoundAnswer(): Response {\n const { storeId, storeBase } = getTwilightContext();\n return storeNotFoundResponse(storeId || storeBase ? 'store' : 'domain');\n}\n\ninterface TwilightMiddlewareOptions {\n cookieName?: string;\n}\n\nexport const twilightMiddleware = (options?: TwilightMiddlewareOptions): AnyRequestMiddleware => {\n const cookieName = options?.cookieName ?? AUTH_TOKEN_COOKIE_NAME;\n\n return createMiddleware().server(async ({ request, next }) => {\n const cookieHeader = request.headers.get('Cookie');\n const authToken = extractTokenFromCookies(cookieHeader, cookieName);\n // `?scope=` before the cookie: it is how a market is switched (see resolveRequestScope).\n const scope = resolveRequestScope(request.url, cookieHeader);\n const requestHost = requestHostOf(request);\n // Read here and nowhere else: a deployed theme worker has no vars and no\n // bindings, so the request is the only thing that knows which store it is\n // serving. Everything downstream reads it off the context rather than\n // reaching for a build-time constant that is not there in production.\n //\n // The host goes in because it decides whether the request is allowed to name\n // a store at all. On a merchant's own domain it is not: the hostname is the\n // store, and `?storeId=` there would serve a stranger's shop from a domain\n // its owner controls.\n //\n // On those same hosts the store is also the first segment of the path, the\n // root of every URL there, and a store named that way takes the cookie's\n // place: the path is the address the visitor can see.\n //\n // On a Salla shared host the dispatcher names the store instead, from the\n // segment after the locale, and that is where it stays in every URL.\n const { storeId, storeBase, storeBaseFollowsLocale } = resolveAddressedStore(\n request.url,\n cookieHeader,\n requestHost,\n request.headers.get(STORE_BASE_HEADER)\n );\n // The version is read here for the same reason and behind the same gate. A\n // theme editor previews a draft version of a merchant's settings before it is\n // published, and a partner running the theme locally renders against one —\n // both open the storefront in an iframe and say which version in the URL.\n const versionId = resolveRequestVersionId(request.url, cookieHeader, requestHost);\n const nativeAppHeaders = readNativeAppHeaders(request.headers);\n\n // A shared host's address has no language in it any more: `/dev-x/cart`, not\n // `/ar/dev-x/cart`. An old link is sent to the new one once, keeping its language as\n // `?lang=`. Only a page load is redirected; anything else is answered as asked.\n if (\n storeBase &&\n storeBaseFollowsLocale &&\n (request.method === 'GET' || request.method === 'HEAD')\n ) {\n const location = legacyLocaleRedirectHref(request.url, storeBase);\n if (location) return new Response(null, { status: 302, headers: { Location: location } });\n }\n\n const response = await runWithTwilightContext(\n {\n authToken,\n scope,\n storeId,\n storeBase,\n storeBaseFollowsLocale,\n versionId,\n requestHost,\n nativeAppHeaders,\n },\n () => {\n const result = next({ context: { authToken } });\n const settle = <R>(rendered: R) => withMaintenanceStatus(withStoreNotFoundPage(rendered));\n // The continuation stays in this request's scope: it was registered inside `run`.\n return result instanceof Promise\n ? result.then(settle, storeNotFoundOrThrow)\n : settle(result);\n }\n );\n // On a shared host the same URL is answered in the language the `s-lang` cookie names, so\n // a cache in front of the worker must not serve one visitor's page to another.\n return storeBaseFollowsLocale ? varyOnCookie(response) : response;\n });\n};\n\n/** A copy of `response` with `Vary: Cookie` added (the original's headers may be immutable). */\nfunction withVaryCookie(response: Response): Response {\n const headers = new Headers(response.headers);\n headers.append('Vary', 'Cookie');\n return new Response(response.body, {\n status: response.status,\n statusText: response.statusText,\n headers,\n });\n}\n\n/**\n * Adds `Vary: Cookie` to what `next()` produced: its result carries the page's `response`,\n * and a middleware may also pass a bare `Response` through. Anything else is left as it is.\n */\nfunction varyOnCookie<T>(result: T): T {\n if (result instanceof Response) return withVaryCookie(result) as T;\n const carried = (result as { response?: unknown } | null)?.response;\n if (carried instanceof Response) {\n (result as { response: Response }).response = withVaryCookie(carried);\n }\n return result;\n}\n","import type { AnyRequestMiddleware } from '@tanstack/react-start';\nimport { createMiddleware } from '@tanstack/react-start';\nimport { tsrStartManifest } from 'tanstack-start-manifest:v';\nimport { rootHead } from '../../routes/root/head';\n\n/** Known critical assets that should always be preloaded */\nconst CRITICAL_ASSETS = [\n { rel: 'preconnect', href: 'https://api.salla.dev' },\n { rel: 'preconnect', href: 'https://cdn.salla.sa' },\n { rel: 'preconnect', href: 'https://cdn.assets.salla.network', crossOrigin: 'anonymous' },\n { rel: 'preconnect', href: 'https://fonts.gstatic.com', crossOrigin: 'anonymous' },\n] as const;\n\n/** Extract locale from URL path (e.g., /ar/products → 'ar') */\nfunction extractLocale(url: string): string | undefined {\n const match = url.match(/^\\/([a-z]{2})(\\/|$)/);\n return match?.[1];\n}\n\n/** Build Link header value from a link descriptor */\nfunction buildLinkHeader(link: Record<string, unknown>): string | null {\n const href = link.href as string | undefined;\n const rel = link.rel as string | undefined;\n if (!href || !rel) return null;\n\n // Skip print-media stylesheets (already non-blocking)\n if (rel === 'stylesheet') {\n const media = link.media as string | undefined;\n if (media === 'print') return null;\n return `<${href}>; rel=preload; as=style`;\n }\n\n if (rel === 'preload') {\n const asType = link.as as string | undefined;\n if (!asType) return null;\n const parts = [`<${href}>`, 'rel=preload', `as=${asType}`];\n if (asType === 'font' || link.crossOrigin) {\n parts.push('crossorigin');\n }\n return parts.join('; ');\n }\n\n if (rel === 'modulepreload') {\n return `<${href}>; rel=modulepreload`;\n }\n\n return null;\n}\n\nexport const earlyHintsMiddleware = (): AnyRequestMiddleware => {\n let cachedManifestPaths: string[] | null = null;\n\n return createMiddleware().server(async ({ request, next }) => {\n const response = await next();\n\n const accept = request.headers.get('Accept') ?? '';\n if (!accept.includes('text/html') && accept !== '*/*') return response;\n if (!(response instanceof Response)) return response;\n\n const linkHeaders: string[] = [];\n\n // 1. Add critical assets from rootHead (fonts, icons, SDK, etc.)\n try {\n const url = new URL(request.url);\n const locale = extractLocale(url.pathname);\n if (locale) {\n const headResult = rootHead({ params: { locale } });\n const links = (headResult.links as Record<string, unknown>[]) ?? [];\n for (const link of links) {\n const header = buildLinkHeader(link);\n if (header) linkHeaders.push(header);\n }\n }\n } catch (e) {\n // rootHead failed — log why, then fall back to known critical assets\n console.warn('[earlyHints] rootHead failed:', e instanceof Error ? e.message : e);\n for (const asset of CRITICAL_ASSETS) {\n const co = 'crossOrigin' in asset ? asset.crossOrigin : undefined;\n linkHeaders.push(`<${asset.href}>; rel=${asset.rel}${co ? '; crossorigin' : ''}`);\n }\n }\n\n // 2. Add CSS from TanStack Start manifest (bundled theme CSS)\n if (!cachedManifestPaths) {\n try {\n const manifest = tsrStartManifest();\n const rootAssets = manifest.routes['__root__']?.assets ?? [];\n const seen = new Set<string>();\n cachedManifestPaths = [];\n for (const asset of rootAssets) {\n if (asset.tag === 'link' && asset.attrs?.href?.endsWith('.css')) {\n if (!seen.has(asset.attrs.href)) {\n seen.add(asset.attrs.href);\n cachedManifestPaths.push(asset.attrs.href);\n }\n }\n }\n } catch (e) {\n // manifest not available — skip\n console.warn('[earlyHints] tsrStartManifest failed:', e instanceof Error ? e.message : e);\n }\n }\n\n if (cachedManifestPaths) {\n for (const href of cachedManifestPaths) {\n linkHeaders.push(`<${href}>; rel=preload; as=style`);\n }\n }\n\n // Apply Link headers if we have any\n if (linkHeaders.length === 0) {\n console.warn('[earlyHints] no critical assets found — no Link headers added');\n return response;\n }\n\n const headers = new Headers(response.headers);\n for (const linkHeader of linkHeaders) {\n headers.append('Link', linkHeader);\n }\n\n return new Response(response.body, {\n status: response.status,\n statusText: response.statusText,\n headers,\n });\n });\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/tanstack/stylesheet.tsx","../src/tanstack/middleware/store-not-found.ts","../src/tanstack/middleware/twilight.ts","../src/tanstack/middleware/earlyHints.ts"],"names":["createMiddleware"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAeA,IAAM,gBAAA,GAAmB,MAAM,MAAM;AAAC,CAAA;AAG/B,SAAS,gBAAgB,EAAE,IAAA,EAAM,QAAA,GAAW,IAAG,EAAyB;AAC7E,EAAA,MAAM,UAAU,cAAA,CAAe;AAAA,IAC7B,MAAA,EAAQ,CAAC,KAAA,KACP,KAAA,CAAM,QAAQ,IAAA,CAAK,CAAC,KAAA,KAAU,MAAA,CAAO,MAAA,CAAO,QAAA,EAAU,KAAA,CAAM,OAAO,CAAC,CAAA,EAAG;AAAA,GAC1E,CAAA;AAED,EAAA,MAAM,CAAC,aAAa,CAAA,GAAI,QAAA,CAAS,OAAO,CAAA;AACxC,EAAA,MAAM,QAAA,GAAW,oBAAA;AAAA,IACf,gBAAA;AAAA,IACA,MAAM,IAAA;AAAA,IACN,MAAM;AAAA,GACR;AAEA,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,aAAA;AAAA,oBAEC,GAAA,CAAC,WAAM,IAAA,EAAM,mBAAA,EAAqB,YAAW,UAAA,EAC1C,QAAA,EAAA,QAAA,CAAS,aAAa,CAAA,EACzB,CAAA;AAAA,IAAA,CAEA,CAAC,aAAA,IAAiB,QAAA,qBAClB,GAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,iBAAA,EAAkB,GAAA,EAAI,YAAA,EAAa,IAAA,EAAY,UAAA,EAAW,SAAA,EAAU,CAAA;AAAA,IAE9E,aAAA,wBACE,UAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,UAAK,GAAA,EAAI,YAAA,EAAa,MAAY,CAAA,EACrC;AAAA,GAAA,EAEJ,CAAA;AAEJ;AAGO,SAAS,gBAAA,GAAmB;AACjC,EAAA,MAAM,OAAO,OAAA,EAAQ;AACrB,EAAA,MAAM,KAAA,GAAQ,SAAA,EAAU,CAAE,OAAA,CAAQ,GAAA,EAAK,KAAA;AACvC,EAAA,OAAO,IAAA,CACJ,MAAA,CAAO,CAAC,GAAA,KAAQ,EAAE,GAAA,CAAI,GAAA,KAAQ,MAAA,IAAU,GAAA,CAAI,KAAA,EAAO,GAAA,KAAQ,eAAA,CAAgB,CAAA,CAC3E,GAAA,CAAI,CAAC,GAAA,qBAAQ,aAAA,CAAC,KAAA,EAAA,EAAO,GAAG,GAAA,EAAK,GAAA,EAAK,CAAA,SAAA,EAAY,IAAA,CAAK,SAAA,CAAU,GAAG,CAAC,CAAA,CAAA,EAAI,KAAA,EAAc,CAAE,CAAA;AAC1F;;;ACnDA,IAAM,IAAA,GAAsE;AAAA,EAC1E,KAAA,EAAO;AAAA,IACL,KAAA,EAAO,yFAAA;AAAA,IACP,OAAA,EAAS;AAAA,GACX;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,KAAA,EAAO,kHAAA;AAAA,IACP,OAAA,EAAS;AAAA;AAEb,CAAA;AAcA,IAAM,IAAA,GAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAqCN,SAAS,kBAAkB,IAAA,EAAiC;AACjE,EAAA,MAAM,EAAE,KAAA,EAAO,OAAA,EAAQ,GAAI,KAAK,IAAI,CAAA;AACpC,EAAA,OAAO,KAAK,UAAA,CAAW,SAAA,EAAW,KAAK,CAAA,CAAE,OAAA,CAAQ,aAAa,OAAO,CAAA;AACvE;AAGO,SAAS,sBAAsB,IAAA,EAAmC;AACvE,EAAA,OAAO,IAAI,QAAA,CAAS,iBAAA,CAAkB,IAAI,CAAA,EAAG;AAAA,IAC3C,MAAA,EAAQ,GAAA;AAAA,IACR,OAAA,EAAS;AAAA,MACP,cAAA,EAAgB,0BAAA;AAAA,MAChB,eAAA,EAAiB;AAAA;AACnB,GACD,CAAA;AACH;;;AChDO,SAAS,sBAAyB,MAAA,EAAyB;AAChE,EAAA,MAAM,QAAA,GACJ,kBAAkB,QAAA,GACd,MAAA,GACC,QAA0C,QAAA,YAAoB,QAAA,GAC3D,OAAkC,QAAA,GACpC,IAAA;AACR,EAAA,IAAI,CAAC,YAAY,QAAA,CAAS,MAAA,KAAW,OAAO,CAAC,kBAAA,EAAmB,CAAE,WAAA,EAAa,OAAO,MAAA;AACtF,EAAA,MAAM,WAAA,GAAc,IAAI,QAAA,CAAS,QAAA,CAAS,IAAA,EAAM;AAAA,IAC9C,MAAA,EAAQ,GAAA;AAAA,IACR,UAAA,EAAY,qBAAA;AAAA,IACZ,SAAS,QAAA,CAAS;AAAA,GACnB,CAAA;AACD,EAAA,wBAAA,CAAyB,YAAY,OAAO,CAAA;AAC5C,EAAA,OAAO,kBAAkB,QAAA,GAAW,WAAA,GAAc,EAAE,GAAG,MAAA,EAAQ,UAAU,WAAA,EAAY;AACvF;AAUA,SAAS,yBAAyB,OAAA,EAAwB;AACxD,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI;AACF,IAAA,QAAA,GAAW,oBAAmB,CAAE,QAAA;AAAA,EAClC,CAAA,CAAA,MAAQ;AACN,IAAA;AAAA,EACF;AACA,EAAA,MAAM,QAAA,GAAW,oBAAoB,QAAQ,CAAA;AAC7C,EAAA,IAAI,CAAC,MAAA,CAAO,IAAA,CAAK,QAAQ,EAAE,MAAA,EAAQ;AACnC,EAAA,OAAA,CAAQ,GAAA,CAAI,2BAAA,EAA6B,yBAAA,CAA0B,QAAQ,CAAC,CAAA;AAC5E,EAAA,IAAI,SAAS,KAAA,EAAO,OAAA,CAAQ,GAAA,CAAI,YAAA,EAAc,SAAS,KAAK,CAAA;AAC5D,EAAA,OAAA,CAAQ,KAAK,6BAAA,EAA+B;AAAA,IAC1C,GAAG,QAAA;AAAA,IACH,KAAA,EAAO,UAAU,mBAAA,EAAqB;AAAA,GACvC,CAAA;AACH;AAYO,SAAS,sBAAyB,MAAA,EAAyB;AAChE,EAAA,IAAI,CAAC,kBAAA,EAAmB,CAAE,aAAA,EAAe,OAAO,MAAA;AAChD,EAAA,MAAM,OAAO,mBAAA,EAAoB;AACjC,EAAA,MAAM,UAAW,MAAA,EAA0C,QAAA;AAC3D,EAAA,OAAO,mBAAmB,QAAA,GAAW,EAAE,GAAG,MAAA,EAAQ,QAAA,EAAU,MAAK,GAAI,IAAA;AACvE;AAGO,SAAS,qBAAqB,KAAA,EAA0B;AAC7D,EAAA,IAAI,kBAAA,EAAmB,CAAE,aAAA,EAAe,OAAO,mBAAA,EAAoB;AACnE,EAAA,MAAM,KAAA;AACR;AAGA,SAAS,mBAAA,GAAgC;AACvC,EAAA,MAAM,EAAE,OAAA,EAAS,SAAA,EAAU,GAAI,kBAAA,EAAmB;AAClD,EAAA,OAAO,qBAAA,CAAsB,OAAA,IAAW,SAAA,GAAY,OAAA,GAAU,QAAQ,CAAA;AACxE;AAMO,IAAM,kBAAA,GAAqB,CAAC,OAAA,KAA8D;AAC/F,EAAA,MAAM,UAAA,GAAa,SAAS,UAAA,IAAc,sBAAA;AAE1C,EAAA,OAAO,kBAAiB,CAAE,MAAA,CAAO,OAAO,EAAE,OAAA,EAAS,MAAK,KAAM;AAC5D,IAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA;AACjD,IAAA,MAAM,SAAA,GAAY,uBAAA,CAAwB,YAAA,EAAc,UAAU,CAAA;AAElE,IAAA,MAAM,KAAA,GAAQ,mBAAA,CAAoB,OAAA,CAAQ,GAAA,EAAK,YAAY,CAAA;AAC3D,IAAA,MAAM,WAAA,GAAc,cAAc,OAAO,CAAA;AAiBzC,IAAA,MAAM,EAAE,OAAA,EAAS,SAAA,EAAW,sBAAA,EAAuB,GAAI,qBAAA;AAAA,MACrD,OAAA,CAAQ,GAAA;AAAA,MACR,YAAA;AAAA,MACA,WAAA;AAAA,MACA,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,iBAAiB;AAAA,KACvC;AAKA,IAAA,MAAM,SAAA,GAAY,uBAAA,CAAwB,OAAA,CAAQ,GAAA,EAAK,cAAc,WAAW,CAAA;AAChF,IAAA,MAAM,gBAAA,GAAmB,oBAAA,CAAqB,OAAA,CAAQ,OAAO,CAAA;AAK7D,IAAA,IACE,aACA,sBAAA,KACC,OAAA,CAAQ,WAAW,KAAA,IAAS,OAAA,CAAQ,WAAW,MAAA,CAAA,EAChD;AACA,MAAA,MAAM,QAAA,GAAW,wBAAA,CAAyB,OAAA,CAAQ,GAAA,EAAK,SAAS,CAAA;AAChE,MAAA,IAAI,QAAA,EAAU,OAAO,IAAI,QAAA,CAAS,IAAA,EAAM,EAAE,MAAA,EAAQ,GAAA,EAAK,OAAA,EAAS,EAAE,QAAA,EAAU,QAAA,IAAY,CAAA;AAAA,IAC1F;AAEA,IAAA,MAAM,WAAW,MAAM,sBAAA;AAAA,MACrB;AAAA,QACE,SAAA;AAAA,QACA,KAAA;AAAA,QACA,OAAA;AAAA,QACA,SAAA;AAAA,QACA,sBAAA;AAAA,QACA,SAAA;AAAA,QACA,WAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,MAAM;AACJ,QAAA,MAAM,SAAS,IAAA,CAAK,EAAE,SAAS,EAAE,SAAA,IAAa,CAAA;AAC9C,QAAA,MAAM,SAAS,CAAI,QAAA,KAAgB,qBAAA,CAAsB,qBAAA,CAAsB,QAAQ,CAAC,CAAA;AAExF,QAAA,OAAO,MAAA,YAAkB,UACrB,MAAA,CAAO,IAAA,CAAK,QAAQ,oBAAoB,CAAA,GACxC,OAAO,MAAM,CAAA;AAAA,MACnB;AAAA,KACF;AAGA,IAAA,OAAO,sBAAA,GAAyB,YAAA,CAAa,QAAQ,CAAA,GAAI,QAAA;AAAA,EAC3D,CAAC,CAAA;AACH;AAGA,SAAS,eAAe,QAAA,EAA8B;AACpD,EAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAQ,QAAA,CAAS,OAAO,CAAA;AAC5C,EAAA,OAAA,CAAQ,MAAA,CAAO,QAAQ,QAAQ,CAAA;AAC/B,EAAA,OAAO,IAAI,QAAA,CAAS,QAAA,CAAS,IAAA,EAAM;AAAA,IACjC,QAAQ,QAAA,CAAS,MAAA;AAAA,IACjB,YAAY,QAAA,CAAS,UAAA;AAAA,IACrB;AAAA,GACD,CAAA;AACH;AAMA,SAAS,aAAgB,MAAA,EAAc;AACrC,EAAA,IAAI,MAAA,YAAkB,QAAA,EAAU,OAAO,cAAA,CAAe,MAAM,CAAA;AAC5D,EAAA,MAAM,UAAW,MAAA,EAA0C,QAAA;AAC3D,EAAA,IAAI,mBAAmB,QAAA,EAAU;AAC/B,IAAC,MAAA,CAAkC,QAAA,GAAW,cAAA,CAAe,OAAO,CAAA;AAAA,EACtE;AACA,EAAA,OAAO,MAAA;AACT;ACxMA,IAAM,eAAA,GAAkB;AAAA,EACtB,EAAE,GAAA,EAAK,YAAA,EAAc,IAAA,EAAM,uBAAA,EAAwB;AAAA,EACnD,EAAE,GAAA,EAAK,YAAA,EAAc,IAAA,EAAM,sBAAA,EAAuB;AAAA,EAClD,EAAE,GAAA,EAAK,YAAA,EAAc,IAAA,EAAM,kCAAA,EAAoC,aAAa,WAAA,EAAY;AAAA,EACxF,EAAE,GAAA,EAAK,YAAA,EAAc,IAAA,EAAM,2BAAA,EAA6B,aAAa,WAAA;AACvE,CAAA;AAGA,SAAS,cAAc,GAAA,EAAiC;AACtD,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,qBAAqB,CAAA;AAC7C,EAAA,OAAO,QAAQ,CAAC,CAAA;AAClB;AAGA,SAAS,gBAAgB,IAAA,EAA8C;AACrE,EAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,EAAA,MAAM,MAAM,IAAA,CAAK,GAAA;AACjB,EAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,GAAA,EAAK,OAAO,IAAA;AAG1B,EAAA,IAAI,QAAQ,YAAA,EAAc;AACxB,IAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,IAAA,IAAI,KAAA,KAAU,SAAS,OAAO,IAAA;AAC9B,IAAA,OAAO,IAAI,IAAI,CAAA,wBAAA,CAAA;AAAA,EACjB;AAEA,EAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,IAAA,MAAM,SAAS,IAAA,CAAK,EAAA;AACpB,IAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,IAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,CAAA,EAAI,IAAI,KAAK,aAAA,EAAe,CAAA,GAAA,EAAM,MAAM,CAAA,CAAE,CAAA;AACzD,IAAA,IAAI,MAAA,KAAW,MAAA,IAAU,IAAA,CAAK,WAAA,EAAa;AACzC,MAAA,KAAA,CAAM,KAAK,aAAa,CAAA;AAAA,IAC1B;AACA,IAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACxB;AAEA,EAAA,IAAI,QAAQ,eAAA,EAAiB;AAC3B,IAAA,OAAO,IAAI,IAAI,CAAA,oBAAA,CAAA;AAAA,EACjB;AAEA,EAAA,OAAO,IAAA;AACT;AAEO,IAAM,uBAAuB,MAA4B;AAC9D,EAAA,IAAI,mBAAA,GAAuC,IAAA;AAE3C,EAAA,OAAOA,kBAAiB,CAAE,MAAA,CAAO,OAAO,EAAE,OAAA,EAAS,MAAK,KAAM;AAC5D,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,EAAK;AAE5B,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA,IAAK,EAAA;AAChD,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,WAAW,CAAA,IAAK,MAAA,KAAW,OAAO,OAAO,QAAA;AAC9D,IAAA,IAAI,EAAE,QAAA,YAAoB,QAAA,CAAA,EAAW,OAAO,QAAA;AAE5C,IAAA,MAAM,cAAwB,EAAC;AAG/B,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAA;AAC/B,MAAA,MAAM,MAAA,GAAS,aAAA,CAAc,GAAA,CAAI,QAAQ,CAAA;AACzC,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAM,aAAa,QAAA,CAAS,EAAE,QAAQ,EAAE,MAAA,IAAU,CAAA;AAClD,QAAA,MAAM,KAAA,GAAS,UAAA,CAAW,KAAA,IAAuC,EAAC;AAClE,QAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,UAAA,MAAM,MAAA,GAAS,gBAAgB,IAAI,CAAA;AACnC,UAAA,IAAI,MAAA,EAAQ,WAAA,CAAY,IAAA,CAAK,MAAM,CAAA;AAAA,QACrC;AAAA,MACF;AAAA,IACF,SAAS,CAAA,EAAG;AAEV,MAAA,OAAA,CAAQ,KAAK,+BAAA,EAAiC,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,UAAU,CAAC,CAAA;AAChF,MAAA,KAAA,MAAW,SAAS,eAAA,EAAiB;AACnC,QAAA,MAAM,EAAA,GAAK,aAAA,IAAiB,KAAA,GAAQ,KAAA,CAAM,WAAA,GAAc,MAAA;AACxD,QAAA,WAAA,CAAY,IAAA,CAAK,CAAA,CAAA,EAAI,KAAA,CAAM,IAAI,CAAA,OAAA,EAAU,KAAA,CAAM,GAAG,CAAA,EAAG,EAAA,GAAK,eAAA,GAAkB,EAAE,CAAA,CAAE,CAAA;AAAA,MAClF;AAAA,IACF;AAGA,IAAA,IAAI,CAAC,mBAAA,EAAqB;AACxB,MAAA,IAAI;AACF,QAAA,MAAM,WAAW,gBAAA,EAAiB;AAClC,QAAA,MAAM,aAAa,QAAA,CAAS,MAAA,CAAO,UAAU,CAAA,EAAG,UAAU,EAAC;AAC3D,QAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,QAAA,mBAAA,GAAsB,EAAC;AACvB,QAAA,KAAA,MAAW,SAAS,UAAA,EAAY;AAC9B,UAAA,IAAI,KAAA,CAAM,QAAQ,MAAA,IAAU,KAAA,CAAM,OAAO,IAAA,EAAM,QAAA,CAAS,MAAM,CAAA,EAAG;AAC/D,YAAA,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA,EAAG;AAC/B,cAAA,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA;AACzB,cAAA,mBAAA,CAAoB,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA;AAAA,YAC3C;AAAA,UACF;AAAA,QACF;AAAA,MACF,SAAS,CAAA,EAAG;AAEV,QAAA,OAAA,CAAQ,KAAK,uCAAA,EAAyC,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,UAAU,CAAC,CAAA;AAAA,MAC1F;AAAA,IACF;AAEA,IAAA,IAAI,mBAAA,EAAqB;AACvB,MAAA,KAAA,MAAW,QAAQ,mBAAA,EAAqB;AACtC,QAAA,WAAA,CAAY,IAAA,CAAK,CAAA,CAAA,EAAI,IAAI,CAAA,wBAAA,CAA0B,CAAA;AAAA,MACrD;AAAA,IACF;AAGA,IAAA,IAAI,WAAA,CAAY,WAAW,CAAA,EAAG;AAC5B,MAAA,OAAA,CAAQ,KAAK,oEAA+D,CAAA;AAC5E,MAAA,OAAO,QAAA;AAAA,IACT;AAEA,IAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAQ,QAAA,CAAS,OAAO,CAAA;AAC5C,IAAA,KAAA,MAAW,cAAc,WAAA,EAAa;AACpC,MAAA,OAAA,CAAQ,MAAA,CAAO,QAAQ,UAAU,CAAA;AAAA,IACnC;AAEA,IAAA,OAAO,IAAI,QAAA,CAAS,QAAA,CAAS,IAAA,EAAM;AAAA,MACjC,QAAQ,QAAA,CAAS,MAAA;AAAA,MACjB,YAAY,QAAA,CAAS,UAAA;AAAA,MACrB;AAAA,KACD,CAAA;AAAA,EACH,CAAC,CAAA;AACH","file":"tanstack.js","sourcesContent":["import { useState, useSyncExternalStore } from 'react';\nimport { Asset, useRouter, useRouterState, useTags } from '@tanstack/react-router';\nimport { CRITICAL_STYLE_HREF } from '../boot/critical-style';\n\nexport interface ThemeStylesheetProps {\n /** The full stylesheet's URL (`app.css?url`). */\n href: string;\n /**\n * Inline critical CSS by route id. A page server-rendered as one of these routes paints from it,\n * and `bootClient` adds `href` once its first screen has painted. Pass the same route ids on the\n * client with empty strings, so hydration renders the same tags without shipping the CSS twice.\n */\n critical?: Readonly<Record<string, string>>;\n}\n\nconst subscribeNothing = () => () => {};\n\n/** The theme's stylesheet: inline critical CSS for the routes that have it, the full sheet otherwise. */\nexport function ThemeStylesheet({ href, critical = {} }: ThemeStylesheetProps) {\n const routeId = useRouterState({\n select: (state): string | undefined =>\n state.matches.find((match) => Object.hasOwn(critical, match.routeId))?.routeId,\n });\n // The route the page was server-rendered as: never added or removed on client-side navigations.\n const [criticalRoute] = useState(routeId);\n const hydrated = useSyncExternalStore(\n subscribeNothing,\n () => true,\n () => false\n );\n\n return (\n <>\n {criticalRoute && (\n // Its own precedence, so it lands before the full sheet; React renders the CSS verbatim.\n <style href={CRITICAL_STYLE_HREF} precedence=\"critical\">\n {critical[criticalRoute]}\n </style>\n )}\n {(!criticalRoute || hydrated) && (\n <link id=\"salla-theme-css\" rel=\"stylesheet\" href={href} precedence=\"default\" />\n )}\n {criticalRoute && (\n <noscript>\n <link rel=\"stylesheet\" href={href} />\n </noscript>\n )}\n </>\n );\n}\n\n/** The route's head tags without module preloads: they raced the LCP image, and the entry loads every chunk anyway. */\nexport function ThemeHeadContent() {\n const tags = useTags();\n const nonce = useRouter().options.ssr?.nonce;\n return tags\n .filter((tag) => !(tag.tag === 'link' && tag.attrs?.rel === 'modulepreload'))\n .map((tag) => <Asset {...tag} key={`tsr-meta-${JSON.stringify(tag)}`} nonce={nonce} />);\n}\n","/**\n * Which address was not found, as Twig's `checkUsername` (SallaApp/Store) tells them\n * apart: a store the request named (a username, `?storeId=`), or the domain itself.\n */\nexport type StoreNotFoundKind = 'store' | 'domain';\n\n/** Twig's copy (`error::errors.<kind>.not_found_*`). Arabic in every language, as there. */\nconst COPY: Record<StoreNotFoundKind, { title: string; message: string }> = {\n store: {\n title: 'المتجر غير موجود!',\n message: 'نأسف هذا المتجر غير موجود حاليا!.',\n },\n domain: {\n title: 'نطاق المتجر غير موجود!',\n message: 'نأسف نطاق المتجر المطلوب غير موجود حاليا!.',\n },\n};\n\n/**\n * The page Twig answers with a 410 when no store has the address it was asked for,\n * with what a visitor sees kept: the same markup and the same stylesheet. Dropped: the\n * feedback form, which Twig renders hidden, and the jQuery and legacy scripts behind\n * it. `iframe-embed` is on `<body>` from the start because Twig's script adds it on\n * every load, and it is what hides the `body--bg` background; the empty `msg-container`\n * keeps the block where Twig's sits. The link goes to merchant sign-up on s.salla.sa;\n * Twig's relative `/register` would reach the theme on any host but salla.sa.\n *\n * One constant document, and only {@link COPY} is ever put into it: nothing from the\n * request reaches this page.\n */\nconst PAGE = `<!DOCTYPE html>\n<html lang=\"ar\" dir=\"rtl\">\n<head>\n<meta charset=\"UTF-8\">\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n<meta name=\"theme-color\" content=\"#37a495\">\n<meta name=\"author\" content=\"منصة سلة\">\n<meta name=\"robots\" content=\"noindex, follow\">\n<meta name=\"copyright\" content=\"Salla.sa\">\n<title>{title}</title>\n<link rel=\"icon\" type=\"image/png\" href=\"https://cdn.salla.network/images/logo/logo-square.png\">\n<link rel=\"apple-touch-icon-precomposed\" href=\"https://cdn.salla.network/images/logo/logo-square.png\">\n<link rel=\"stylesheet\" href=\"https://cdn.salla.network/fonts/pingarlt.css?v=0.2\">\n<link rel=\"stylesheet\" href=\"https://cdn.assets.salla.network/prod/stores/vendor/salla/errors/css/app.css?id=0d7e71fbf018a0d5c478129a56c7a71f\">\n</head>\n<body class=\"body body--rtl body--bg iframe-embed\">\n<header id=\"header\" class=\"header header--404\"></header>\n<main id=\"main\" class=\"main main--404\">\n<div class=\"container container--wide\">\n<div class=\"e404-container\">\n<div class=\"landing\">\n<h1 class=\"title title--giant title--404\"><img src=\"https://cdn.assets.salla.network/prod/stores/vendor/salla/errors/images/error.svg\" alt=\"\"/> 410</h1>\n<h3>{title}</h3>\n<p>{message}<br> بإمكانك العودة للصفحة لرئيسية أو التسجيل للتمتع بمتجر رائع!</p>\n<a href=\"https://s.salla.sa/register\">سجل متجرك الأن</a>\n</div>\n</div>\n<div class=\"form-group msg-container\"></div>\n</div>\n</main>\n<footer id=\"footer\" class=\"footer\"></footer>\n</body>\n</html>\n`;\n\n/** Twig's 410 page for `kind`. */\nexport function storeNotFoundPage(kind: StoreNotFoundKind): string {\n const { title, message } = COPY[kind];\n return PAGE.replaceAll('{title}', title).replace('{message}', message);\n}\n\n/** {@link storeNotFoundPage} as Twig sends it: a 410 that no cache keeps. */\nexport function storeNotFoundResponse(kind: StoreNotFoundKind): Response {\n return new Response(storeNotFoundPage(kind), {\n status: 410,\n headers: {\n 'content-type': 'text/html; charset=UTF-8',\n 'cache-control': 'max-age=0, must-revalidate, no-cache, no-store, private',\n },\n });\n}\n","import type { AnyRequestMiddleware } from '@tanstack/react-start';\nimport { createMiddleware } from '@tanstack/react-start';\nimport {\n extractTokenFromCookies,\n resolveAddressedStore,\n resolveRequestScope,\n resolveRequestVersionId,\n AUTH_TOKEN_COOKIE_NAME,\n STORE_BASE_HEADER,\n} from '../../utils/cookies';\nimport { getTwilightContext, runWithTwilightContext } from '../../twilight/context';\nimport type { StoreContext } from '../../api/store';\nimport {\n MAINTENANCE_EVIDENCE_HEADER,\n maintenanceEvidence,\n maintenanceEvidenceHeader,\n} from '../../utils/maintenance';\nimport { requestHostOf } from '../../utils/request-host';\nimport { legacyLocaleRedirectHref } from '../../utils/store-base';\nimport { readNativeAppHeaders } from '../../utils/native-app-headers';\nimport { storeNotFoundResponse } from './store-not-found';\n\n/**\n * A 503 for the maintenance page, so search engines read it as temporary and keep\n * the store indexed. TanStack sets the SSR status from the router alone (200, 404,\n * 500) and ignores `setResponseStatus`, so the status is applied here, on the\n * response the render produced, from the decision `rootBeforeLoad` left in the\n * request context. Only a 200 is rewritten: a redirect or an error keeps its own.\n *\n * `next()` resolves to the middleware context, whose `response` is the render; a\n * bare `Response` is accepted too. The rewrite keeps the body stream, so TanStack\n * treats it as the same response rather than a replacement to cancel.\n */\nexport function withMaintenanceStatus<T>(result: T): T | Response {\n const response =\n result instanceof Response\n ? result\n : (result as { response?: unknown } | null)?.response instanceof Response\n ? ((result as { response: Response }).response as Response)\n : null;\n if (!response || response.status !== 200 || !getTwilightContext().maintenance) return result;\n const unavailable = new Response(response.body, {\n status: 503,\n statusText: 'Service Unavailable',\n headers: response.headers,\n });\n stampMaintenanceEvidence(unavailable.headers);\n return result instanceof Response ? unavailable : { ...result, response: unavailable };\n}\n\n/**\n * Says on the 503 which settings answer closed the store, and logs it once.\n *\n * The page is for everyone but the merchant, so it is usually the merchant's own\n * store state; when it is not (503s interleaved with 200s on one store), the\n * answer's trace and cache status are what settle it. The Store's trace goes in\n * `x-trace-id`, which the dispatcher already logs for a 5xx.\n */\nfunction stampMaintenanceEvidence(headers: Headers): void {\n let settings: StoreContext | undefined;\n try {\n settings = getTwilightContext().settings;\n } catch {\n return;\n }\n const evidence = maintenanceEvidence(settings);\n if (!Object.keys(evidence).length) return;\n headers.set(MAINTENANCE_EVIDENCE_HEADER, maintenanceEvidenceHeader(evidence));\n if (evidence.trace) headers.set('x-trace-id', evidence.trace);\n console.warn('[twilight] maintenance page', {\n ...evidence,\n title: settings?.maintenance_details?.title,\n });\n}\n\n/**\n * Twig's 410 page in place of the render, once rootBeforeLoad has learned that no store\n * has this request's identifier: there is no store to render, so nothing of it is kept.\n * The page says \"domain\" when the host was the identifier (nothing in the request named\n * a store), as Twig's `checkUsername` does for a host that is not salla.sa.\n *\n * A render that threw is answered the same way. A theme's shell renders even when the\n * root route failed, and one that reads the settings there throws, which h3 would\n * otherwise answer with a bare `{\"status\":500,\"unhandled\":true}`.\n */\nexport function withStoreNotFoundPage<T>(result: T): T | Response {\n if (!getTwilightContext().storeNotFound) return result;\n const page = storeNotFoundAnswer();\n const carried = (result as { response?: unknown } | null)?.response;\n return carried instanceof Response ? { ...result, response: page } : page;\n}\n\n/** The render's failure, unless {@link withStoreNotFoundPage} has an answer for it. */\nexport function storeNotFoundOrThrow(error: unknown): Response {\n if (getTwilightContext().storeNotFound) return storeNotFoundAnswer();\n throw error;\n}\n\n/** A store the request named (`?storeId=`, a path segment, a username), else the host's. */\nfunction storeNotFoundAnswer(): Response {\n const { storeId, storeBase } = getTwilightContext();\n return storeNotFoundResponse(storeId || storeBase ? 'store' : 'domain');\n}\n\ninterface TwilightMiddlewareOptions {\n cookieName?: string;\n}\n\nexport const twilightMiddleware = (options?: TwilightMiddlewareOptions): AnyRequestMiddleware => {\n const cookieName = options?.cookieName ?? AUTH_TOKEN_COOKIE_NAME;\n\n return createMiddleware().server(async ({ request, next }) => {\n const cookieHeader = request.headers.get('Cookie');\n const authToken = extractTokenFromCookies(cookieHeader, cookieName);\n // `?scope=` before the cookie: it is how a market is switched (see resolveRequestScope).\n const scope = resolveRequestScope(request.url, cookieHeader);\n const requestHost = requestHostOf(request);\n // Read here and nowhere else: a deployed theme worker has no vars and no\n // bindings, so the request is the only thing that knows which store it is\n // serving. Everything downstream reads it off the context rather than\n // reaching for a build-time constant that is not there in production.\n //\n // The host goes in because it decides whether the request is allowed to name\n // a store at all. On a merchant's own domain it is not: the hostname is the\n // store, and `?storeId=` there would serve a stranger's shop from a domain\n // its owner controls.\n //\n // On those same hosts the store is also the first segment of the path, the\n // root of every URL there, and a store named that way takes the cookie's\n // place: the path is the address the visitor can see.\n //\n // On a Salla shared host the dispatcher names the store instead, from the\n // segment after the locale, and that is where it stays in every URL.\n const { storeId, storeBase, storeBaseFollowsLocale } = resolveAddressedStore(\n request.url,\n cookieHeader,\n requestHost,\n request.headers.get(STORE_BASE_HEADER)\n );\n // The version is read here for the same reason and behind the same gate. A\n // theme editor previews a draft version of a merchant's settings before it is\n // published, and a partner running the theme locally renders against one —\n // both open the storefront in an iframe and say which version in the URL.\n const versionId = resolveRequestVersionId(request.url, cookieHeader, requestHost);\n const nativeAppHeaders = readNativeAppHeaders(request.headers);\n\n // A shared host's address has no language in it any more: `/dev-x/cart`, not\n // `/ar/dev-x/cart`. An old link is sent to the new one once, keeping its language as\n // `?lang=`. Only a page load is redirected; anything else is answered as asked.\n if (\n storeBase &&\n storeBaseFollowsLocale &&\n (request.method === 'GET' || request.method === 'HEAD')\n ) {\n const location = legacyLocaleRedirectHref(request.url, storeBase);\n if (location) return new Response(null, { status: 302, headers: { Location: location } });\n }\n\n const response = await runWithTwilightContext(\n {\n authToken,\n scope,\n storeId,\n storeBase,\n storeBaseFollowsLocale,\n versionId,\n requestHost,\n nativeAppHeaders,\n },\n () => {\n const result = next({ context: { authToken } });\n const settle = <R>(rendered: R) => withMaintenanceStatus(withStoreNotFoundPage(rendered));\n // The continuation stays in this request's scope: it was registered inside `run`.\n return result instanceof Promise\n ? result.then(settle, storeNotFoundOrThrow)\n : settle(result);\n }\n );\n // On a shared host the same URL is answered in the language the `s-lang` cookie names, so\n // a cache in front of the worker must not serve one visitor's page to another.\n return storeBaseFollowsLocale ? varyOnCookie(response) : response;\n });\n};\n\n/** A copy of `response` with `Vary: Cookie` added (the original's headers may be immutable). */\nfunction withVaryCookie(response: Response): Response {\n const headers = new Headers(response.headers);\n headers.append('Vary', 'Cookie');\n return new Response(response.body, {\n status: response.status,\n statusText: response.statusText,\n headers,\n });\n}\n\n/**\n * Adds `Vary: Cookie` to what `next()` produced: its result carries the page's `response`,\n * and a middleware may also pass a bare `Response` through. Anything else is left as it is.\n */\nfunction varyOnCookie<T>(result: T): T {\n if (result instanceof Response) return withVaryCookie(result) as T;\n const carried = (result as { response?: unknown } | null)?.response;\n if (carried instanceof Response) {\n (result as { response: Response }).response = withVaryCookie(carried);\n }\n return result;\n}\n","import type { AnyRequestMiddleware } from '@tanstack/react-start';\nimport { createMiddleware } from '@tanstack/react-start';\nimport { tsrStartManifest } from 'tanstack-start-manifest:v';\nimport { rootHead } from '../../routes/root/head';\n\n/** Known critical assets that should always be preloaded */\nconst CRITICAL_ASSETS = [\n { rel: 'preconnect', href: 'https://api.salla.dev' },\n { rel: 'preconnect', href: 'https://cdn.salla.sa' },\n { rel: 'preconnect', href: 'https://cdn.assets.salla.network', crossOrigin: 'anonymous' },\n { rel: 'preconnect', href: 'https://fonts.gstatic.com', crossOrigin: 'anonymous' },\n] as const;\n\n/** Extract locale from URL path (e.g., /ar/products → 'ar') */\nfunction extractLocale(url: string): string | undefined {\n const match = url.match(/^\\/([a-z]{2})(\\/|$)/);\n return match?.[1];\n}\n\n/** Build Link header value from a link descriptor */\nfunction buildLinkHeader(link: Record<string, unknown>): string | null {\n const href = link.href as string | undefined;\n const rel = link.rel as string | undefined;\n if (!href || !rel) return null;\n\n // Skip print-media stylesheets (already non-blocking)\n if (rel === 'stylesheet') {\n const media = link.media as string | undefined;\n if (media === 'print') return null;\n return `<${href}>; rel=preload; as=style`;\n }\n\n if (rel === 'preload') {\n const asType = link.as as string | undefined;\n if (!asType) return null;\n const parts = [`<${href}>`, 'rel=preload', `as=${asType}`];\n if (asType === 'font' || link.crossOrigin) {\n parts.push('crossorigin');\n }\n return parts.join('; ');\n }\n\n if (rel === 'modulepreload') {\n return `<${href}>; rel=modulepreload`;\n }\n\n return null;\n}\n\nexport const earlyHintsMiddleware = (): AnyRequestMiddleware => {\n let cachedManifestPaths: string[] | null = null;\n\n return createMiddleware().server(async ({ request, next }) => {\n const response = await next();\n\n const accept = request.headers.get('Accept') ?? '';\n if (!accept.includes('text/html') && accept !== '*/*') return response;\n if (!(response instanceof Response)) return response;\n\n const linkHeaders: string[] = [];\n\n // 1. Add critical assets from rootHead (fonts, icons, SDK, etc.)\n try {\n const url = new URL(request.url);\n const locale = extractLocale(url.pathname);\n if (locale) {\n const headResult = rootHead({ params: { locale } });\n const links = (headResult.links as Record<string, unknown>[]) ?? [];\n for (const link of links) {\n const header = buildLinkHeader(link);\n if (header) linkHeaders.push(header);\n }\n }\n } catch (e) {\n // rootHead failed — log why, then fall back to known critical assets\n console.warn('[earlyHints] rootHead failed:', e instanceof Error ? e.message : e);\n for (const asset of CRITICAL_ASSETS) {\n const co = 'crossOrigin' in asset ? asset.crossOrigin : undefined;\n linkHeaders.push(`<${asset.href}>; rel=${asset.rel}${co ? '; crossorigin' : ''}`);\n }\n }\n\n // 2. Add CSS from TanStack Start manifest (bundled theme CSS)\n if (!cachedManifestPaths) {\n try {\n const manifest = tsrStartManifest();\n const rootAssets = manifest.routes['__root__']?.assets ?? [];\n const seen = new Set<string>();\n cachedManifestPaths = [];\n for (const asset of rootAssets) {\n if (asset.tag === 'link' && asset.attrs?.href?.endsWith('.css')) {\n if (!seen.has(asset.attrs.href)) {\n seen.add(asset.attrs.href);\n cachedManifestPaths.push(asset.attrs.href);\n }\n }\n }\n } catch (e) {\n // manifest not available — skip\n console.warn('[earlyHints] tsrStartManifest failed:', e instanceof Error ? e.message : e);\n }\n }\n\n if (cachedManifestPaths) {\n for (const href of cachedManifestPaths) {\n linkHeaders.push(`<${href}>; rel=preload; as=style`);\n }\n }\n\n // Apply Link headers if we have any\n if (linkHeaders.length === 0) {\n console.warn('[earlyHints] no critical assets found — no Link headers added');\n return response;\n }\n\n const headers = new Headers(response.headers);\n for (const linkHeader of linkHeaders) {\n headers.append('Link', linkHeader);\n }\n\n return new Response(response.body, {\n status: response.status,\n statusText: response.statusText,\n headers,\n });\n });\n};\n"]}
|
package/dist/types/twilight.d.ts
CHANGED
|
@@ -89,8 +89,10 @@ export interface TwilightProviderProps {
|
|
|
89
89
|
/**
|
|
90
90
|
* The page a customer sees while the store is in maintenance. It takes no props:
|
|
91
91
|
* read `useTwilight().settings.maintenance_details` and `useTwilight().store` for
|
|
92
|
-
* the merchant's wording and the store's contacts.
|
|
93
|
-
*
|
|
92
|
+
* the merchant's wording and the store's contacts. It also renders while the store
|
|
93
|
+
* has not launched yet (`settings.launched === false`), when `maintenance_details`
|
|
94
|
+
* holds the merchant's "finish launching" notice, not wording for customers.
|
|
95
|
+
* Rendered in place of `layout` and the route, with no SDK; see the store data guide.
|
|
94
96
|
* @default MaintenancePage
|
|
95
97
|
*/
|
|
96
98
|
maintenancePage?: ComponentType;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"twilight.d.ts","sourceRoot":"","sources":["../../src/types/twilight.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtD,OAAO,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAEpC,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/C,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAC9C,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAC9C,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/C,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7C,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/C;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,KAAK,CAAC;IACb,sDAAsD;IACtD,SAAS,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,KAAK,KAAK,IAAI,CAAC;IACrD,KAAK,EAAE,KAAK,CAAC;IACb,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAC;IAC/B,MAAM,EAAE,cAAc,CAAC;IACvB,KAAK,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC5B,GAAG,EAAE,WAAW,CAAC;IAEjB,QAAQ,EAAE,YAAY,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,IAAI,EAAE,IAAI,CAAC;IACX,GAAG,EAAE,KAAK,GAAG,KAAK,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,SAAS,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB;;;OAGG;IACH,YAAY,CAAC,EAAE,mBAAmB,CAAC;IACnC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,KAAK,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,KAAK,CAAA;KAAE,KAAK,IAAI,CAAC;IAC1D,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC;;;;;OAKG;IACH,MAAM,CAAC,EAAE,SAAS,GAAG,KAAK,CAAC;IAC3B,iEAAiE;IACjE,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,aAAa,CAAC;IACpC;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;OAGG;IACH,MAAM,CAAC,EAAE,aAAa,CAAC,WAAW,CAAC,GAAG,KAAK,CAAC;IAC5C
|
|
1
|
+
{"version":3,"file":"twilight.d.ts","sourceRoot":"","sources":["../../src/types/twilight.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { stripUnsafeHtml } from '../chunk-RUHSV4Z6.js';
|
|
2
2
|
export { formatSallaPlural } from '../chunk-BT6HEEAP.js';
|
|
3
|
-
export { dispatchRouteChanged } from '../chunk-
|
|
3
|
+
export { dispatchRouteChanged } from '../chunk-AIPIJWOC.js';
|
|
4
4
|
export { sortOptions } from '../chunk-3LZJXKVO.js';
|
|
5
5
|
export { color } from '../chunk-VVZNW5CB.js';
|
|
6
6
|
export { applyAppScopeMocks, registerThemeHookSlots } from '../chunk-5FJFN3IW.js';
|
|
@@ -8,7 +8,7 @@ export { mergeHead, resolveHead, setHeadAdapter } from '../chunk-GD26FI4J.js';
|
|
|
8
8
|
export { buildBaseHead, buildHreflangAlternates, localeToOgLocale } from '../chunk-OM2GRPDH.js';
|
|
9
9
|
export { asset, cdn, isPlaceholder } from '../chunk-ZCH7W7DZ.js';
|
|
10
10
|
export { mergeDocumentDescriptors, mergeElementAttrs, normalizeClasses, syncAttrsToElement, toReactProps } from '../chunk-CW625T2E.js';
|
|
11
|
-
import '../chunk-
|
|
11
|
+
import '../chunk-BSGHOYMT.js';
|
|
12
12
|
import '../chunk-Z5M4YYWT.js';
|
|
13
13
|
export { getSallaSDK, getStoreIdentifier, onSallaEvent, whenSallaLoaded, whenSallaReady } from '../chunk-GYXUYHKO.js';
|
|
14
14
|
export { AUTH_TOKEN_COOKIE_NAME, clearAuthTokenCookie, extractTokenFromCookies } from '../chunk-FHU2MXZA.js';
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { StoreContext } from '../api/store';
|
|
2
|
+
import type { MaintenanceDetails } from '../types';
|
|
2
3
|
/**
|
|
3
4
|
* Remembers that this browser is the merchant looking at their own closed store.
|
|
4
5
|
*
|
|
@@ -47,6 +48,18 @@ export declare function maintenanceEvidence(settings: StoreContext | null | unde
|
|
|
47
48
|
export declare function maintenanceEvidenceHeader(evidence: Record<string, string>): string;
|
|
48
49
|
/** The dashboard page where the merchant turns maintenance mode off, as the backend links it. */
|
|
49
50
|
export declare const MAINTENANCE_SETTINGS_URL = "https://s.salla.sa/channel/settings?legacy=0#maintenance-mode";
|
|
51
|
+
/**
|
|
52
|
+
* Whether the notice is the one the backend sends for a store that has not launched yet.
|
|
53
|
+
*
|
|
54
|
+
* The settings carry no `launched` flag: a store whose `store::launched` setting is `0`
|
|
55
|
+
* gets `maintenance: true` and `StoreStatusAlertWidget::getData(true)`, the merchant's
|
|
56
|
+
* "finish launching" notice, whose button goes to the dashboard's root, and it goes
|
|
57
|
+
* there for every visitor. A closed store's notice links nowhere for a customer and to
|
|
58
|
+
* {@link MAINTENANCE_SETTINGS_URL} for the owner, so the bare dashboard URL tells them
|
|
59
|
+
* apart, as Twig's `CheckStoreStatus` does by rendering `construction` instead of
|
|
60
|
+
* `maintenance`.
|
|
61
|
+
*/
|
|
62
|
+
export declare function isNotLaunchedNotice(details: MaintenanceDetails | null | undefined): boolean;
|
|
50
63
|
/**
|
|
51
64
|
* The button on the SDK's merchant maintenance bar. The API fills the `button_*`
|
|
52
65
|
* fields only inside Twig's owner session, which the engine's settings request has
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"maintenance.d.ts","sourceRoot":"","sources":["../../src/utils/maintenance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"maintenance.d.ts","sourceRoot":"","sources":["../../src/utils/maintenance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAGnD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,yBAAyB,kBAAkB,CAAC;AAUzD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAWjG;AAED,gEAAgE;AAChE,wBAAgB,kBAAkB,CAChC,YAAY,EAAE,MAAM,GAAG,IAAI,EAC3B,QAAQ,EAAE,YAAY,GAAG,IAAI,GAAG,SAAS,GACxC,OAAO,CAGT;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,YAAY,GAAG,IAAI,GAAG,SAAS,EACzC,WAAW,EAAE,OAAO,GACnB,OAAO,CAET;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,2BAA2B,2BAA2B,CAAC;AAEpE;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,YAAY,GAAG,IAAI,GAAG,SAAS,GACxC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAQxB;AAaD,sFAAsF;AACtF,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAIlF;AAOD,iGAAiG;AACjG,eAAO,MAAM,wBAAwB,kEAAgE,CAAC;AAEtG;;;;;;;;;;GAUG;AAEH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAE3F;AAED;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,CACxC,CAAC,SAAS,IAAI,CAAC,YAAY,EAAE,aAAa,GAAG,qBAAqB,CAAC,EACnE,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,MAAM,GAAG,CAAC,CAYrC"}
|
package/package.json
CHANGED
|
@@ -3,6 +3,8 @@ import { useTranslation } from '../../providers/I18nProvider';
|
|
|
3
3
|
import type { Store, StoreSocial } from '../../types';
|
|
4
4
|
|
|
5
5
|
const THUMB_URL = 'https://cdn.assets.salla.network/prod/stores/images/construction-01.png';
|
|
6
|
+
const LAUNCHING_THUMB_URL =
|
|
7
|
+
'https://cdn.assets.salla.network/prod/stores/images/under-construction.png';
|
|
6
8
|
|
|
7
9
|
/** Social networks the page links to, in the old page's order, with their Salla icon class. */
|
|
8
10
|
const SOCIAL_ICONS: [keyof StoreSocial, string][] = [
|
|
@@ -14,6 +16,14 @@ const SOCIAL_ICONS: [keyof StoreSocial, string][] = [
|
|
|
14
16
|
['instagram', 'sicon-instagram'],
|
|
15
17
|
];
|
|
16
18
|
|
|
19
|
+
/** The store's social links the page shows, each with its icon class. */
|
|
20
|
+
function socialLinks(store: Store | undefined) {
|
|
21
|
+
return SOCIAL_ICONS.flatMap(([key, icon]) => {
|
|
22
|
+
const href = store?.social?.[key];
|
|
23
|
+
return href ? [{ key, icon, href }] : [];
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
|
|
17
27
|
// The platform's maintenance page (Store `pages/maintenance.blade.php` + `_maintenance.scss`),
|
|
18
28
|
// trimmed to what it renders: greyscale, logo + title beside the message, contacts under a
|
|
19
29
|
// rule, the illustration alongside; stacked and centred under 1024px.
|
|
@@ -58,10 +68,7 @@ const STYLE = `
|
|
|
58
68
|
function Contacts({ store, arabic }: { store: Store | undefined; arabic: boolean }) {
|
|
59
69
|
const { t } = useTranslation();
|
|
60
70
|
const mobile = store?.contacts?.mobile;
|
|
61
|
-
const socials =
|
|
62
|
-
const href = store?.social?.[key];
|
|
63
|
-
return href ? [{ key, icon, href }] : [];
|
|
64
|
-
});
|
|
71
|
+
const socials = socialLinks(store);
|
|
65
72
|
if (!mobile && socials.length === 0) return null;
|
|
66
73
|
|
|
67
74
|
return (
|
|
@@ -87,11 +94,112 @@ function Contacts({ store, arabic }: { store: Store | undefined; arabic: boolean
|
|
|
87
94
|
);
|
|
88
95
|
}
|
|
89
96
|
|
|
97
|
+
// The platform's page for a store that has not launched yet (Store
|
|
98
|
+
// `pages/construction.blade.php` + the `construction` rules of `_maintenance.scss`): in
|
|
99
|
+
// colour, logo over the illustration over the title, centred, contacts in a bar along the
|
|
100
|
+
// bottom. Its own scroll container, as the maintenance page above is.
|
|
101
|
+
const LAUNCHING_STYLE = `
|
|
102
|
+
.s-launching{display:flex;flex-direction:column;align-items:center;width:100%;height:100vh;height:100dvh;overflow-y:auto;color:#a3a3a3;background:#fff;text-align:center;box-sizing:border-box}
|
|
103
|
+
.s-launching *{box-sizing:border-box}
|
|
104
|
+
.s-launching .ls-panel{display:flex;flex-direction:column;align-items:center;width:100%;max-width:1200px;margin:auto 0;padding:40px 15px 100px;animation:revealMtBlock 1.5s forwards}
|
|
105
|
+
.s-launching .ls-logo{display:block;max-width:70px;margin:0 0 60px}
|
|
106
|
+
.s-launching .ls-thumb{display:block;width:100%;max-width:250px}
|
|
107
|
+
.s-launching h1{font-size:3.125rem;line-height:1;margin:20px 0;color:#000}
|
|
108
|
+
.s-launching .ls-content p{margin:0;white-space:pre-line}
|
|
109
|
+
.s-launching .ls-footer{position:fixed;inset-inline:0;bottom:0;display:flex;align-items:center;justify-content:space-between;padding:0 25px;color:#000;background:#fbfbfb}
|
|
110
|
+
.s-launching .ls-contacts{display:flex;align-items:center}
|
|
111
|
+
.s-launching .ls-contacts h2{margin:1em 0;font-size:1rem;color:#7d7d7d}
|
|
112
|
+
.s-launching .ls-contacts h2::after{content:"|";margin:0 10px;font-weight:700;color:#dbdbdb}
|
|
113
|
+
.s-launching .ls-contacts ul{display:flex;list-style:none;margin:0;padding:0}
|
|
114
|
+
.s-launching .ls-contacts li{padding:0 10px}
|
|
115
|
+
.s-launching .ls-contacts a{display:inline-flex;align-items:center;gap:5px;color:#000;text-decoration:none}
|
|
116
|
+
.s-launching .ls-footer-logo{display:block;max-width:30px}
|
|
117
|
+
@media (max-width:1024px){.s-launching h1{font-size:1.5625rem}}
|
|
118
|
+
@media (max-width:767px){.s-launching .ls-contacts a span{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}}
|
|
119
|
+
@keyframes revealMtBlock{from{opacity:0;transform:translateY(50%)}to{opacity:1;transform:translateY(0)}}
|
|
120
|
+
`;
|
|
121
|
+
|
|
122
|
+
/** The bar along the bottom with the phone and social links; nothing when the store lists none. */
|
|
123
|
+
function LaunchingContacts({ store, arabic }: { store: Store | undefined; arabic: boolean }) {
|
|
124
|
+
const { t } = useTranslation();
|
|
125
|
+
const mobile = store?.contacts?.mobile;
|
|
126
|
+
const socials = socialLinks(store);
|
|
127
|
+
if (!mobile && socials.length === 0) return null;
|
|
128
|
+
|
|
129
|
+
return (
|
|
130
|
+
<footer className="ls-footer">
|
|
131
|
+
<div className="ls-contacts">
|
|
132
|
+
<h2>
|
|
133
|
+
{t('common.elements.contact_us', {
|
|
134
|
+
defaultValue: arabic ? 'تواصل معنا' : 'Contact us',
|
|
135
|
+
})}
|
|
136
|
+
</h2>
|
|
137
|
+
<ul>
|
|
138
|
+
{mobile && (
|
|
139
|
+
<li>
|
|
140
|
+
<a href={`tel:${mobile}`}>
|
|
141
|
+
<i className="sicon-phone" aria-hidden="true" />
|
|
142
|
+
<span dir="ltr">{mobile}</span>
|
|
143
|
+
</a>
|
|
144
|
+
</li>
|
|
145
|
+
)}
|
|
146
|
+
{socials.map(({ key, icon, href }) => (
|
|
147
|
+
<li key={key}>
|
|
148
|
+
<a href={href} target="_blank" rel="noreferrer" aria-label={key}>
|
|
149
|
+
<i className={icon} aria-hidden="true" />
|
|
150
|
+
</a>
|
|
151
|
+
</li>
|
|
152
|
+
))}
|
|
153
|
+
</ul>
|
|
154
|
+
</div>
|
|
155
|
+
{store?.logo && <img className="ls-footer-logo" src={store.logo} alt="" />}
|
|
156
|
+
</footer>
|
|
157
|
+
);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* The page a customer sees while the store has not launched yet. Its wording is the
|
|
162
|
+
* platform's own, not `maintenance_details`: for an unlaunched store that holds the
|
|
163
|
+
* merchant's "finish launching" notice, addressed to the merchant.
|
|
164
|
+
*/
|
|
165
|
+
function LaunchingSoon({ store, arabic }: { store: Store | undefined; arabic: boolean }) {
|
|
166
|
+
const { t } = useTranslation();
|
|
167
|
+
const logoAlt =
|
|
168
|
+
store?.name ||
|
|
169
|
+
t('common.elements.store_logo', { defaultValue: arabic ? 'شعار المتجر' : 'Store logo' });
|
|
170
|
+
|
|
171
|
+
return (
|
|
172
|
+
<div className="s-launching" data-testid="store-launching-soon-page">
|
|
173
|
+
<style>{LAUNCHING_STYLE}</style>
|
|
174
|
+
<section className="ls-panel">
|
|
175
|
+
{store?.logo && <img className="ls-logo" src={store.logo} alt={logoAlt} />}
|
|
176
|
+
<img className="ls-thumb" src={LAUNCHING_THUMB_URL} alt="" />
|
|
177
|
+
<h1>
|
|
178
|
+
{t('pages.launching_soon.title', {
|
|
179
|
+
defaultValue: arabic ? 'ترقَّب إطلاق المتجر' : 'The store is launching soon',
|
|
180
|
+
})}
|
|
181
|
+
</h1>
|
|
182
|
+
<div className="ls-content">
|
|
183
|
+
<p>
|
|
184
|
+
{t('pages.launching_soon.message', {
|
|
185
|
+
defaultValue: arabic
|
|
186
|
+
? 'نعمل على وضع اللمسات الأخيرة لنقدم لك تجربة تسوق متكاملة، قريبًا!'
|
|
187
|
+
: "We're putting the finishing touches on a complete shopping experience for you. Coming soon!",
|
|
188
|
+
})}
|
|
189
|
+
</p>
|
|
190
|
+
</div>
|
|
191
|
+
</section>
|
|
192
|
+
<LaunchingContacts store={store} arabic={arabic} />
|
|
193
|
+
</div>
|
|
194
|
+
);
|
|
195
|
+
}
|
|
196
|
+
|
|
90
197
|
/**
|
|
91
198
|
* The page a customer sees while the store is closed: the platform's maintenance page,
|
|
92
199
|
* fed by the settings' `maintenance_details` (the merchant's title and message) and the
|
|
93
|
-
* store's contacts
|
|
94
|
-
* `
|
|
200
|
+
* store's contacts; or, while the store has not launched yet (`settings.launched` is
|
|
201
|
+
* `false`), the platform's launching-soon page. Rendered by `TwilightProvider` in place
|
|
202
|
+
* of the layout; see `rootBeforeLoad` for who sees it.
|
|
95
203
|
*/
|
|
96
204
|
export function MaintenancePage() {
|
|
97
205
|
const { settings, locale } = getTwilightContext();
|
|
@@ -100,6 +208,8 @@ export function MaintenancePage() {
|
|
|
100
208
|
const details = settings.maintenance_details;
|
|
101
209
|
const arabic = locale.startsWith('ar');
|
|
102
210
|
|
|
211
|
+
if (settings.launched === false) return <LaunchingSoon store={store} arabic={arabic} />;
|
|
212
|
+
|
|
103
213
|
const title =
|
|
104
214
|
details?.title ||
|
|
105
215
|
t('pages.maintenance.title', {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/routes/blog/BlogAuthorPage.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAUA,IAAM,mBAAuD,EAAC;AAC9D,IAAM,iBAAmC,EAAC;AAEnC,SAAS,cAAA,CAAe;AAAA,EAC7B,IAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA,GAAa,gBAAA;AAAA,EACb,QAAA,GAAW,cAAA;AAAA,EACX;AACF,CAAA,EAAyB;AACvB,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM,EAAE,QAAA,EAAU,SAAA,EAAU,GAAI,WAAA,EAAY;AAC5C,EAAA,MAAM,aAAA,GAAgB,MAAA,CAAsB,MAAA,EAAQ,IAAA,IAAQ,IAAI,CAAA;AAEhE,EAAA,MAAM,MAAA,GAAS,YAAY,YAAY;AACrC,IAAA,MAAM,UAAU,aAAA,CAAc,OAAA;AAC9B,IAAA,MAAM,WAAA,GAAc,OAAA,EAAS,KAAA,CAAM,oBAAoB,CAAA;AACvD,IAAA,MAAM,cAAc,WAAA,GAAc,kBAAA,CAAmB,YAAY,CAAC,CAAC,IAAK,OAAA,IAAW,MAAA;AAEnF,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,EAAE,MAAA,EAAQ,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA,EAAG,MAAA,EAAQ,aAAa,CAAA;AACxF,IAAA,aAAA,CAAc,OAAA,GAAU,MAAA,CAAO,MAAA,EAAQ,IAAA,IAAQ,IAAA;AAE/C,IAAA,OAAO;AAAA,MACL,OAAO,MAAA,CAAO,IAAA;AAAA,MACd,IAAA,EAAM,MAAA,CAAO,MAAA,EAAQ,IAAA,IAAQ;AAAA,KAC/B;AAAA,EACF,CAAA,EAAG,CAAC,IAAA,CAAK,EAAE,CAAC,CAAA;AAEZ,EAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,IAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,kBAAW,IAAA,EAAY,CAAA;AAAA,sBACxB,IAAA,CAAC,kBAAe,UAAA,EACd,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,QAAA,EAAA,EAAS,MAAK,mBAAA,EAAoB,CAAA;AAAA,4BAClC,aAAA,EAAA,EAAU,IAAA,EAAK,eAAc,OAAA,EAAS,CAAA,CAAE,mCAAmC,CAAA,EAAG,CAAA;AAAA,wBAC/E,GAAA,CAAC,QAAA,EAAA,EAAS,IAAA,EAAK,iBAAA,EAAkB;AAAA,OAAA,EACnC;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,kBAAW,IAAA,EAAY,CAAA;AAAA,oBAExB,IAAA,CAAC,kBAAe,UAAA,EACd,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,QAAA,EAAA,EAAS,MAAK,mBAAA,EAAoB,CAAA;AAAA,sBAEnC,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,MAAA,EACb,QAAA,kBAAA,GAAA,CAAC,QAAG,SAAA,EAAU,mBAAA,EAAqB,QAAA,EAAA,MAAA,CAAO,IAAA,EAAK,CAAA,EACjD,CAAA;AAAA,sBAEA,GAAA;AAAA,QAAC,SAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,QAAA;AAAA,UACP,MAAA,EAAQ,MAAA,EAAQ,IAAA,GAAO,MAAA,GAAS,MAAA;AAAA,UAChC,IAAA,EAAM,MAAA,EAAQ,IAAA,GAAO,UAAA,GAAa,QAAA;AAAA,UAClC,SAAS,QAAA,GAAW,SAAA;AAAA,UACpB,SAAA,EAAU,aAAA;AAAA,UACV,cAAA,EAAe,sCAAA;AAAA,UACf,KAAA,sBAAQ,aAAA,EAAA,EAAU,IAAA,EAAK,eAAc,OAAA,EAAS,CAAA,CAAE,mCAAmC,CAAA,EAAG,CAAA;AAAA,UACtF,GAAG,CAAC,GAAA,EAAK,aAAa,CAAA,CAAE,GAAA,EAAK,YAAY,GAAG,CAAA;AAAA,UAE3C,QAAA,EAAA,CAAC,KAAA,KACA,KAAA,CAAM,GAAA,CAAI,CAAC,OAAA,qBAAY,GAAA,CAAC,eAAA,EAAA,EAAiC,OAAA,EAAA,EAAZ,OAAA,CAAQ,EAAsB,CAAE;AAAA;AAAA,OAEjF;AAAA,sBAEA,GAAA,CAAC,QAAA,EAAA,EAAS,IAAA,EAAK,iBAAA,EAAkB;AAAA,KAAA,EACnC;AAAA,GAAA,EACF,CAAA;AAEJ","file":"BlogAuthorPage-JHZHLSIA.js","sourcesContent":["import { useRef, useCallback } from 'react';\nimport { ItemsList } from '@salla.sa/twilight-components-react';\nimport { HookSlot } from '../../hooks';\nimport { useTranslation } from '../../providers/I18nProvider';\nimport { useLocation } from '../../providers/NavigationProvider';\nimport { Breadcrumb, NoContent } from '../../components/common';\nimport { blog } from '../../api/blog';\nimport { BlogArticleCard, BlogListLayout } from './components';\nimport type { BlogAuthorLoaderData, ArticleSummary } from './types';\n\nconst EMPTY_CATEGORIES: BlogAuthorLoaderData['categories'] = [];\nconst EMPTY_ARTICLES: ArticleSummary[] = [];\n\nexport function BlogAuthorPage({\n page,\n author,\n categories = EMPTY_CATEGORIES,\n articles = EMPTY_ARTICLES,\n cursor,\n}: BlogAuthorLoaderData) {\n const { t } = useTranslation();\n const { pathname, searchStr } = useLocation();\n const nextCursorRef = useRef<string | null>(cursor?.next ?? null);\n\n const loader = useCallback(async () => {\n const nextUrl = nextCursorRef.current;\n const cursorMatch = nextUrl?.match(/[?&]cursor=([^&]+)/);\n const cursorValue = cursorMatch ? decodeURIComponent(cursorMatch[1]) : (nextUrl ?? undefined);\n\n const result = await blog.articles.list({ author: String(page.id), cursor: cursorValue });\n nextCursorRef.current = result.cursor?.next ?? null;\n\n return {\n items: result.data,\n next: result.cursor?.next ?? null,\n };\n }, [page.id]);\n\n if (articles.length === 0) {\n return (\n <div className=\"container mb-8 sm:mb-24\">\n <Breadcrumb page={page} />\n <BlogListLayout categories={categories}>\n <HookSlot name=\"blog:author.start\" />\n <NoContent icon=\"sicon-inbox\" message={t('pages.blog_categories.no_articles')} />\n <HookSlot name=\"blog:author.end\" />\n </BlogListLayout>\n </div>\n );\n }\n\n return (\n <div className=\"container mb-8 sm:mb-24\">\n <Breadcrumb page={page} />\n\n <BlogListLayout categories={categories}>\n <HookSlot name=\"blog:author.start\" />\n\n <div className=\"mb-6\">\n <h1 className=\"font-bold text-xl\">{author.name}</h1>\n </div>\n\n <ItemsList<ArticleSummary>\n items={articles}\n loader={cursor?.next ? loader : undefined}\n mode={cursor?.next ? 'infinite' : 'static'}\n pageUrl={pathname + searchStr}\n className=\"s-blog-list\"\n itemsClassName=\"grid md:grid-cols-2 gap-2.5 md:gap-8\"\n empty={<NoContent icon=\"sicon-inbox\" message={t('pages.blog_categories.no_articles')} />}\n t={(key, fallback) => t(key, fallback || key)}\n >\n {(items) =>\n items.map((article) => <BlogArticleCard key={article.id} article={article} />)\n }\n </ItemsList>\n\n <HookSlot name=\"blog:author.end\" />\n </BlogListLayout>\n </div>\n );\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/routes/blog/BlogCategoryPage.tsx"],"names":[],"mappings":"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","file":"BlogCategoryPage-F4264MQG.js","sourcesContent":["import { useRef, useCallback } from 'react';\nimport { ItemsList } from '@salla.sa/twilight-components-react';\nimport { HookSlot } from '../../hooks';\nimport { useTranslation } from '../../providers/I18nProvider';\nimport { useLocation } from '../../providers/NavigationProvider';\nimport { Breadcrumb, NoContent } from '../../components/common';\nimport { blog } from '../../api/blog';\nimport { BlogArticleCard, BlogListLayout } from './components';\nimport type { BlogCategoryLoaderData, ArticleSummary } from './types';\n\nconst EMPTY_CATEGORIES: BlogCategoryLoaderData['categories'] = [];\nconst EMPTY_ARTICLES: ArticleSummary[] = [];\n\nexport function BlogCategoryPage({\n page,\n blogCategory,\n categories = EMPTY_CATEGORIES,\n articles = EMPTY_ARTICLES,\n cursor,\n}: BlogCategoryLoaderData) {\n const { t } = useTranslation();\n const { pathname, searchStr } = useLocation();\n const nextCursorRef = useRef<string | null>(cursor?.next ?? null);\n\n const loader = useCallback(async () => {\n const nextUrl = nextCursorRef.current;\n const cursorMatch = nextUrl?.match(/[?&]cursor=([^&]+)/);\n const cursorValue = cursorMatch ? decodeURIComponent(cursorMatch[1]) : (nextUrl ?? undefined);\n\n const result = await blog.articles.list({ category: blogCategory.id, cursor: cursorValue });\n nextCursorRef.current = result.cursor?.next ?? null;\n\n return {\n items: result.data,\n next: result.cursor?.next ?? null,\n };\n }, [blogCategory.id]);\n\n if (articles.length === 0) {\n return (\n <div className=\"container mb-8 sm:mb-24\">\n <Breadcrumb page={page} />\n <BlogListLayout categories={categories}>\n <HookSlot name=\"blog:category.start\" />\n <NoContent icon=\"sicon-inbox\" message={t('pages.blog_categories.no_articles')} />\n <HookSlot name=\"blog:category.end\" />\n </BlogListLayout>\n </div>\n );\n }\n\n return (\n <div className=\"container mb-8 sm:mb-24\">\n <Breadcrumb page={page} />\n\n <BlogListLayout categories={categories}>\n <HookSlot name=\"blog:category.start\" />\n\n <div className=\"mb-6\">\n <h1 className=\"font-bold text-xl\">{blogCategory.name}</h1>\n </div>\n\n <ItemsList<ArticleSummary>\n items={articles}\n loader={cursor?.next ? loader : undefined}\n mode={cursor?.next ? 'infinite' : 'static'}\n pageUrl={pathname + searchStr}\n className=\"s-blog-list\"\n itemsClassName=\"grid md:grid-cols-2 gap-2.5 md:gap-8\"\n empty={<NoContent icon=\"sicon-inbox\" message={t('pages.blog_categories.no_articles')} />}\n t={(key, fallback) => t(key, fallback || key)}\n >\n {(items) =>\n items.map((article) => (\n <BlogArticleCard key={article.id} article={article} showAuthor />\n ))\n }\n </ItemsList>\n\n <HookSlot name=\"blog:category.end\" />\n </BlogListLayout>\n </div>\n );\n}\n"]}
|