@salla.sa/twilight-theme-engine 1.0.88 → 1.0.89
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-YY7DDANL.js → AddToCartForm-DQO6VT4B.js} +3 -3
- package/dist/{AddToCartForm-YY7DDANL.js.map → AddToCartForm-DQO6VT4B.js.map} +1 -1
- package/dist/{BlogAuthorPage-4IXOEQA4.js → BlogAuthorPage-V37VUW6D.js} +9 -9
- package/dist/{BlogAuthorPage-4IXOEQA4.js.map → BlogAuthorPage-V37VUW6D.js.map} +1 -1
- package/dist/{BlogCategoryPage-NYB7EMKQ.js → BlogCategoryPage-JNUNJSJZ.js} +9 -9
- package/dist/{BlogCategoryPage-NYB7EMKQ.js.map → BlogCategoryPage-JNUNJSJZ.js.map} +1 -1
- package/dist/{BlogPage-B2A47OBZ.js → BlogPage-ZUQJEI4Y.js} +8 -8
- package/dist/{BlogPage-B2A47OBZ.js.map → BlogPage-ZUQJEI4Y.js.map} +1 -1
- package/dist/{BlogSinglePage-ZSOHP2GJ.js → BlogSinglePage-C4DZ77ZZ.js} +8 -8
- package/dist/{BlogSinglePage-ZSOHP2GJ.js.map → BlogSinglePage-C4DZ77ZZ.js.map} +1 -1
- package/dist/{BlogTagPage-24MZSPCO.js → BlogTagPage-IOC5THS6.js} +9 -9
- package/dist/{BlogTagPage-24MZSPCO.js.map → BlogTagPage-IOC5THS6.js.map} +1 -1
- package/dist/{BrandsPage-WJUCPMKH.js → BrandsPage-FYSSGMW7.js} +8 -8
- package/dist/{BrandsPage-WJUCPMKH.js.map → BrandsPage-FYSSGMW7.js.map} +1 -1
- package/dist/{Breadcrumb-TMUSQ2XY.js → Breadcrumb-UZKM6E5D.js} +8 -8
- package/dist/{Breadcrumb-TMUSQ2XY.js.map → Breadcrumb-UZKM6E5D.js.map} +1 -1
- package/dist/{CartItem-QH6X7576.js → CartItem-RZHFJNYP.js} +8 -8
- package/dist/{CartItem-QH6X7576.js.map → CartItem-RZHFJNYP.js.map} +1 -1
- package/dist/{CartSummary-MERS5R3X.js → CartSummary-BTIONT3W.js} +8 -8
- package/dist/{CartSummary-MERS5R3X.js.map → CartSummary-BTIONT3W.js.map} +1 -1
- package/dist/{Copyright-JPOX7PLQ.js → Copyright-ABMWKKLY.js} +3 -3
- package/dist/{Copyright-JPOX7PLQ.js.map → Copyright-ABMWKKLY.js.map} +1 -1
- package/dist/{CustomerLayout-ER5SZO7U.js → CustomerLayout-SR7WXPZC.js} +8 -8
- package/dist/{CustomerLayout-ER5SZO7U.js.map → CustomerLayout-SR7WXPZC.js.map} +1 -1
- package/dist/{Footer-7O5CQ72M.js → Footer-Y56SQHHG.js} +4 -4
- package/dist/{Footer-7O5CQ72M.js.map → Footer-Y56SQHHG.js.map} +1 -1
- package/dist/{Header-CH56KO3D.js → Header-S36FMWQ5.js} +4 -4
- package/dist/{Header-CH56KO3D.js.map → Header-S36FMWQ5.js.map} +1 -1
- package/dist/{LoyaltyPage-S74ZELSW.js → LoyaltyPage-IWCKSJTJ.js} +8 -8
- package/dist/{LoyaltyPage-S74ZELSW.js.map → LoyaltyPage-IWCKSJTJ.js.map} +1 -1
- package/dist/{LoyaltyPointsPage-TCKZTXSB.js → LoyaltyPointsPage-7DWWY4LM.js} +3 -3
- package/dist/{LoyaltyPointsPage-TCKZTXSB.js.map → LoyaltyPointsPage-7DWWY4LM.js.map} +1 -1
- package/dist/{MainMenu-3WDXPG2J.js → MainMenu-DBTYYNNI.js} +3 -3
- package/dist/{MainMenu-3WDXPG2J.js.map → MainMenu-DBTYYNNI.js.map} +1 -1
- package/dist/{MasterLayout-EC6LIXFB.js → MasterLayout-ZXZMATPB.js} +8 -8
- package/dist/{MasterLayout-EC6LIXFB.js.map → MasterLayout-ZXZMATPB.js.map} +1 -1
- package/dist/{MobileMenu-VIMGPLKV.js → MobileMenu-HDGZFWZR.js} +8 -8
- package/dist/{MobileMenu-VIMGPLKV.js.map → MobileMenu-HDGZFWZR.js.map} +1 -1
- package/dist/{NotificationsPage-HYID6XAA.js → NotificationsPage-7DF3AJLC.js} +8 -8
- package/dist/{NotificationsPage-HYID6XAA.js.map → NotificationsPage-7DF3AJLC.js.map} +1 -1
- package/dist/{OrderSinglePage-5GMYPKA6.js → OrderSinglePage-FLHEF4AK.js} +8 -8
- package/dist/{OrderSinglePage-5GMYPKA6.js.map → OrderSinglePage-FLHEF4AK.js.map} +1 -1
- package/dist/{OrdersPage-SKTTDOJ6.js → OrdersPage-6BVIHODF.js} +8 -8
- package/dist/{OrdersPage-SKTTDOJ6.js.map → OrdersPage-6BVIHODF.js.map} +1 -1
- package/dist/{PageSingle-RNWFQQEM.js → PageSingle-DJNL362R.js} +3 -3
- package/dist/{PageSingle-RNWFQQEM.js.map → PageSingle-DJNL362R.js.map} +1 -1
- package/dist/{ProductDetails-OYPJ6MW7.js → ProductDetails-PYPZUTCN.js} +3 -3
- package/dist/{ProductDetails-OYPJ6MW7.js.map → ProductDetails-PYPZUTCN.js.map} +1 -1
- package/dist/{ProfilePage-BQE63RHK.js → ProfilePage-6W7C7FXQ.js} +8 -8
- package/dist/{ProfilePage-BQE63RHK.js.map → ProfilePage-6W7C7FXQ.js.map} +1 -1
- package/dist/{ReviewsPage-VEYN7BSR.js → ReviewsPage-HGXGW7WU.js} +3 -3
- package/dist/{ReviewsPage-VEYN7BSR.js.map → ReviewsPage-HGXGW7WU.js.map} +1 -1
- package/dist/{SeoCartWidget-3BVMA4WY.js → SeoCartWidget-ZB6GY65W.js} +8 -8
- package/dist/{SeoCartWidget-3BVMA4WY.js.map → SeoCartWidget-ZB6GY65W.js.map} +1 -1
- package/dist/{SettingsPage-QLKKYVGH.js → SettingsPage-ZSTD6TOR.js} +8 -8
- package/dist/{SettingsPage-QLKKYVGH.js.map → SettingsPage-ZSTD6TOR.js.map} +1 -1
- package/dist/{StoreClosedNotification-LQXGW2SB.js → StoreClosedNotification-NNCBUMMX.js} +9 -9
- package/dist/{StoreClosedNotification-LQXGW2SB.js.map → StoreClosedNotification-NNCBUMMX.js.map} +1 -1
- package/dist/{TestimonialsPage-OKDDAMJL.js → TestimonialsPage-36QYN7RD.js} +3 -3
- package/dist/{TestimonialsPage-OKDDAMJL.js.map → TestimonialsPage-36QYN7RD.js.map} +1 -1
- package/dist/{ThankYouPage-YWLG6UF7.js → ThankYouPage-BD42QNKE.js} +8 -8
- package/dist/{ThankYouPage-YWLG6UF7.js.map → ThankYouPage-BD42QNKE.js.map} +1 -1
- package/dist/{WalletPage-UEYRVSWR.js → WalletPage-5LHVR2EA.js} +8 -8
- package/dist/{WalletPage-UEYRVSWR.js.map → WalletPage-5LHVR2EA.js.map} +1 -1
- package/dist/{WishlistPage-7257GI3Y.js → WishlistPage-2NYODMHF.js} +8 -8
- package/dist/{WishlistPage-7257GI3Y.js.map → WishlistPage-2NYODMHF.js.map} +1 -1
- package/dist/{chunk-H42Z4YFB.js → chunk-2NBURJFN.js} +7 -7
- package/dist/{chunk-H42Z4YFB.js.map → chunk-2NBURJFN.js.map} +1 -1
- package/dist/{chunk-E7WWO3V3.js → chunk-4446UB3M.js} +3 -3
- package/dist/{chunk-E7WWO3V3.js.map → chunk-4446UB3M.js.map} +1 -1
- package/dist/{chunk-7JVKUFFT.js → chunk-4UMNQ4EQ.js} +4 -4
- package/dist/{chunk-7JVKUFFT.js.map → chunk-4UMNQ4EQ.js.map} +1 -1
- package/dist/{chunk-TZ3E5BN4.js → chunk-65KBXGDT.js} +24 -10
- package/dist/chunk-65KBXGDT.js.map +1 -0
- package/dist/{chunk-A64SSH6M.js → chunk-7U5HUPY3.js} +5 -5
- package/dist/{chunk-A64SSH6M.js.map → chunk-7U5HUPY3.js.map} +1 -1
- package/dist/{chunk-PKXEZRSJ.js → chunk-7XM2TC27.js} +5 -5
- package/dist/{chunk-PKXEZRSJ.js.map → chunk-7XM2TC27.js.map} +1 -1
- package/dist/{chunk-3LXB4VFK.js → chunk-DXBYD75N.js} +15 -3
- package/dist/chunk-DXBYD75N.js.map +1 -0
- package/dist/{chunk-NB7KGKLY.js → chunk-JRFGBIX2.js} +3 -3
- package/dist/{chunk-NB7KGKLY.js.map → chunk-JRFGBIX2.js.map} +1 -1
- package/dist/{chunk-NNNTEVFU.js → chunk-JVHC4U2E.js} +4 -4
- package/dist/{chunk-NNNTEVFU.js.map → chunk-JVHC4U2E.js.map} +1 -1
- package/dist/{chunk-UKLZQK2J.js → chunk-L3U7C2DP.js} +6 -6
- package/dist/{chunk-UKLZQK2J.js.map → chunk-L3U7C2DP.js.map} +1 -1
- package/dist/{chunk-6VOF5SB4.js → chunk-PNNBK26L.js} +5 -5
- package/dist/{chunk-6VOF5SB4.js.map → chunk-PNNBK26L.js.map} +1 -1
- package/dist/{chunk-CTCVO7YU.js → chunk-TJGHOSES.js} +16 -14
- package/dist/chunk-TJGHOSES.js.map +1 -0
- package/dist/{chunk-SYVIMWYW.js → chunk-VQNLXDPQ.js} +3 -3
- package/dist/{chunk-SYVIMWYW.js.map → chunk-VQNLXDPQ.js.map} +1 -1
- package/dist/chunk-WKSTFIQX.js +14 -0
- package/dist/{chunk-AUC6QMF7.js.map → chunk-WKSTFIQX.js.map} +1 -1
- package/dist/{chunk-7PQPQEDN.js → chunk-XKIVS72A.js} +7 -6
- package/dist/chunk-XKIVS72A.js.map +1 -0
- package/dist/{chunk-V5OF7CV4.js → chunk-Z3SSHDVW.js} +3 -3
- package/dist/{chunk-V5OF7CV4.js.map → chunk-Z3SSHDVW.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 +6 -6
- package/dist/components/home/index.js +8 -8
- package/dist/components/layout/index.js +1 -1
- package/dist/components/product/index.js +7 -7
- package/dist/components/store/index.js +8 -8
- package/dist/{document-class-WMKWZN7O.js → document-class-T4LRZRRH.js} +6 -6
- package/dist/{document-class-WMKWZN7O.js.map → document-class-T4LRZRRH.js.map} +1 -1
- package/dist/hooks/index.js +6 -6
- package/dist/hooks/useGtm.js +6 -6
- package/dist/hooks/useMoney.js +6 -6
- package/dist/hooks/useStore.js +6 -6
- package/dist/index.js +6 -6
- package/dist/{not-found-NAXLRGC2.js → not-found-3QOH2I4S.js} +8 -8
- package/dist/{not-found-NAXLRGC2.js.map → not-found-3QOH2I4S.js.map} +1 -1
- package/dist/providers/index.js +6 -6
- package/dist/routes/account/orders.js +2 -2
- package/dist/routes/account.js +7 -7
- package/dist/routes/blog.js +6 -6
- package/dist/routes/brands.js +2 -2
- package/dist/routes/cart.js +10 -10
- package/dist/routes/home/index.d.ts.map +1 -1
- package/dist/routes/home.js +9 -9
- package/dist/routes/loyalty.js +3 -3
- package/dist/routes/page.js +2 -2
- package/dist/routes/product-listing/index.d.ts.map +1 -1
- package/dist/routes/product-listing.js +9 -9
- package/dist/routes/product-listing.js.map +1 -1
- package/dist/routes/product.js +8 -8
- package/dist/routes/testimonials.js +3 -3
- package/dist/routes/thank-you.js +2 -2
- package/dist/skeleton.js +9 -9
- package/dist/tanstack/head.d.ts.map +1 -1
- package/dist/tanstack.js +4 -4
- package/dist/utils/apply-theme.d.ts.map +1 -1
- package/dist/utils/baseHead.d.ts +4 -2
- package/dist/utils/baseHead.d.ts.map +1 -1
- package/dist/utils/baseHead.js +1 -1
- package/dist/utils/index.js +1 -1
- package/dist/vite/index.js +2 -1
- package/dist/vite/index.js.map +1 -1
- package/package.json +1 -1
- package/tailwind/routes/home/index.tsx.txt +5 -3
- package/tailwind/routes/product-listing/index.tsx.txt +8 -2
- package/dist/chunk-3LXB4VFK.js.map +0 -1
- package/dist/chunk-7PQPQEDN.js.map +0 -1
- package/dist/chunk-AUC6QMF7.js +0 -14
- package/dist/chunk-CTCVO7YU.js.map +0 -1
- package/dist/chunk-TZ3E5BN4.js.map +0 -1
package/dist/routes/blog.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { blog } from '../chunk-FFCYACTA.js';
|
|
2
|
-
import { buildHreflangAlternates } from '../chunk-
|
|
2
|
+
import { buildHreflangAlternates } from '../chunk-65KBXGDT.js';
|
|
3
3
|
import { notFound, orThrow } from '../chunk-6ZMNTJM3.js';
|
|
4
4
|
import { RouteId } from '../chunk-OUW6WESU.js';
|
|
5
5
|
import '../chunk-QGOPTVV5.js';
|
|
@@ -143,18 +143,18 @@ async function blogTagLoader({
|
|
|
143
143
|
}
|
|
144
144
|
|
|
145
145
|
// src/routes/blog/index.tsx
|
|
146
|
-
var LazyBlogPage = lazy(() => import('../BlogPage-
|
|
146
|
+
var LazyBlogPage = lazy(() => import('../BlogPage-ZUQJEI4Y.js').then((m) => ({ default: m.BlogPage })));
|
|
147
147
|
var LazyBlogSinglePage = lazy(
|
|
148
|
-
() => import('../BlogSinglePage-
|
|
148
|
+
() => import('../BlogSinglePage-C4DZ77ZZ.js').then((m) => ({ default: m.BlogSinglePage }))
|
|
149
149
|
);
|
|
150
150
|
var LazyBlogAuthorPage = lazy(
|
|
151
|
-
() => import('../BlogAuthorPage-
|
|
151
|
+
() => import('../BlogAuthorPage-V37VUW6D.js').then((m) => ({ default: m.BlogAuthorPage }))
|
|
152
152
|
);
|
|
153
153
|
var LazyBlogCategoryPage = lazy(
|
|
154
|
-
() => import('../BlogCategoryPage-
|
|
154
|
+
() => import('../BlogCategoryPage-JNUNJSJZ.js').then((m) => ({ default: m.BlogCategoryPage }))
|
|
155
155
|
);
|
|
156
156
|
var LazyBlogTagPage = lazy(
|
|
157
|
-
() => import('../BlogTagPage-
|
|
157
|
+
() => import('../BlogTagPage-IOC5THS6.js').then((m) => ({ default: m.BlogTagPage }))
|
|
158
158
|
);
|
|
159
159
|
var BlogPage = LazyBlogPage;
|
|
160
160
|
var BlogSinglePage = LazyBlogSinglePage;
|
package/dist/routes/brands.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { brand } from '../chunk-7X4XGKXO.js';
|
|
2
|
-
import { buildHreflangAlternates } from '../chunk-
|
|
2
|
+
import { buildHreflangAlternates } from '../chunk-65KBXGDT.js';
|
|
3
3
|
import '../chunk-6ZMNTJM3.js';
|
|
4
4
|
import { RouteId } from '../chunk-OUW6WESU.js';
|
|
5
5
|
import '../chunk-QGOPTVV5.js';
|
|
@@ -22,7 +22,7 @@ async function brandsLoader() {
|
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
// src/routes/brands/index.tsx
|
|
25
|
-
var LazyBrandsPage = lazy(() => import('../BrandsPage-
|
|
25
|
+
var LazyBrandsPage = lazy(() => import('../BrandsPage-FYSSGMW7.js').then((m) => ({ default: m.BrandsPage })));
|
|
26
26
|
var BrandsPage = LazyBrandsPage;
|
|
27
27
|
async function brandsLoaderWithExtend(_ctx, extend) {
|
|
28
28
|
const data = await brandsLoader();
|
package/dist/routes/cart.js
CHANGED
|
@@ -1,24 +1,24 @@
|
|
|
1
1
|
import { cart } from '../chunk-27Z442XF.js';
|
|
2
2
|
import { loyalty } from '../chunk-B2G7S4UR.js';
|
|
3
3
|
import { CartSkeleton } from '../chunk-N7CCSGZF.js';
|
|
4
|
-
import '../chunk-
|
|
5
|
-
import '../chunk-
|
|
4
|
+
import '../chunk-XKIVS72A.js';
|
|
5
|
+
import '../chunk-4UMNQ4EQ.js';
|
|
6
6
|
import '../chunk-FZYR4BA2.js';
|
|
7
7
|
import '../chunk-556OT3BN.js';
|
|
8
|
-
import { LazySeoCartWidget, LazyCartItem, LazyCartSummary } from '../chunk-
|
|
9
|
-
import '../chunk-
|
|
8
|
+
import { LazySeoCartWidget, LazyCartItem, LazyCartSummary } from '../chunk-WKSTFIQX.js';
|
|
9
|
+
import '../chunk-L3U7C2DP.js';
|
|
10
10
|
import '../chunk-Y32RHCOH.js';
|
|
11
|
-
import '../chunk-
|
|
12
|
-
import '../chunk-
|
|
13
|
-
import '../chunk-
|
|
14
|
-
import '../chunk-
|
|
11
|
+
import '../chunk-TJGHOSES.js';
|
|
12
|
+
import '../chunk-7XM2TC27.js';
|
|
13
|
+
import '../chunk-VQNLXDPQ.js';
|
|
14
|
+
import '../chunk-4446UB3M.js';
|
|
15
15
|
import '../chunk-2JV6WZ6O.js';
|
|
16
16
|
import '../chunk-RV54D2D7.js';
|
|
17
17
|
import '../chunk-ZVZGLEZ6.js';
|
|
18
18
|
import '../chunk-VVZNW5CB.js';
|
|
19
19
|
import '../chunk-5G7NYNX6.js';
|
|
20
20
|
import '../chunk-GD26FI4J.js';
|
|
21
|
-
import { buildHreflangAlternates } from '../chunk-
|
|
21
|
+
import { buildHreflangAlternates } from '../chunk-65KBXGDT.js';
|
|
22
22
|
import '../chunk-6ZMNTJM3.js';
|
|
23
23
|
import { RouteId } from '../chunk-OUW6WESU.js';
|
|
24
24
|
import '../chunk-SAGXF3MU.js';
|
|
@@ -42,7 +42,7 @@ import { HookSlot } from '../chunk-5XDPAKF5.js';
|
|
|
42
42
|
import '../chunk-GCPEMNSU.js';
|
|
43
43
|
import '../chunk-QGOPTVV5.js';
|
|
44
44
|
import { useTranslation } from '../chunk-TYNZ5B2B.js';
|
|
45
|
-
import { LazyBreadcrumb, LazyNoContent } from '../chunk-
|
|
45
|
+
import { LazyBreadcrumb, LazyNoContent } from '../chunk-Z3SSHDVW.js';
|
|
46
46
|
import '../chunk-AXW67SY7.js';
|
|
47
47
|
import '../chunk-BYMOPN2S.js';
|
|
48
48
|
import '../chunk-SKLEJJ6M.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/routes/home/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAI9D,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAC/F,OAAO,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AACpE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7C,YAAY,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC/C,YAAY,EACV,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAE/B,iBAAS,MAAM,CAAC,IAAI,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,cAAc,CAAC,CAEnE;AAED,iBAAS,IAAI,CAAC,GAAG,EAAE,eAAe,GAAG,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/routes/home/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAI9D,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAC/F,OAAO,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AACpE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7C,YAAY,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC/C,YAAY,EACV,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAE/B,iBAAS,MAAM,CAAC,IAAI,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,cAAc,CAAC,CAEnE;AAED,iBAAS,IAAI,CAAC,GAAG,EAAE,eAAe,GAAG,cAAc,CA8BlD;AAED,eAAO,MAAM,IAAI;;;;;CAAoE,CAAC;AAEtF,OAAO,EAAE,UAAU,EAAE,CAAC"}
|
package/dist/routes/home.js
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
export { Home, HomeSkeleton, homeLoader } from '../chunk-
|
|
2
|
-
export { DefaultHomeComponents, registerHomeComponentConfig, registerHomeComponents } from '../chunk-
|
|
1
|
+
export { Home, HomeSkeleton, homeLoader } from '../chunk-XKIVS72A.js';
|
|
2
|
+
export { DefaultHomeComponents, registerHomeComponentConfig, registerHomeComponents } from '../chunk-4UMNQ4EQ.js';
|
|
3
3
|
import '../chunk-FZYR4BA2.js';
|
|
4
4
|
import '../chunk-556OT3BN.js';
|
|
5
|
-
import '../chunk-
|
|
5
|
+
import '../chunk-L3U7C2DP.js';
|
|
6
6
|
import '../chunk-Y32RHCOH.js';
|
|
7
|
-
import '../chunk-
|
|
8
|
-
import '../chunk-
|
|
9
|
-
import '../chunk-
|
|
10
|
-
import '../chunk-
|
|
7
|
+
import '../chunk-TJGHOSES.js';
|
|
8
|
+
import '../chunk-7XM2TC27.js';
|
|
9
|
+
import '../chunk-VQNLXDPQ.js';
|
|
10
|
+
import '../chunk-4446UB3M.js';
|
|
11
11
|
import '../chunk-2JV6WZ6O.js';
|
|
12
12
|
import '../chunk-RV54D2D7.js';
|
|
13
13
|
import '../chunk-ZVZGLEZ6.js';
|
|
14
14
|
import '../chunk-VVZNW5CB.js';
|
|
15
15
|
import '../chunk-5G7NYNX6.js';
|
|
16
16
|
import '../chunk-GD26FI4J.js';
|
|
17
|
-
import '../chunk-
|
|
17
|
+
import '../chunk-65KBXGDT.js';
|
|
18
18
|
import '../chunk-6ZMNTJM3.js';
|
|
19
19
|
import '../chunk-OUW6WESU.js';
|
|
20
20
|
import '../chunk-SAGXF3MU.js';
|
|
@@ -38,7 +38,7 @@ import '../chunk-5XDPAKF5.js';
|
|
|
38
38
|
import '../chunk-GCPEMNSU.js';
|
|
39
39
|
import '../chunk-QGOPTVV5.js';
|
|
40
40
|
import '../chunk-TYNZ5B2B.js';
|
|
41
|
-
import '../chunk-
|
|
41
|
+
import '../chunk-Z3SSHDVW.js';
|
|
42
42
|
import '../chunk-AXW67SY7.js';
|
|
43
43
|
import '../chunk-BYMOPN2S.js';
|
|
44
44
|
import '../chunk-SKLEJJ6M.js';
|
package/dist/routes/loyalty.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { loyalty } from '../chunk-B2G7S4UR.js';
|
|
2
|
-
import { buildHreflangAlternates } from '../chunk-
|
|
2
|
+
import { buildHreflangAlternates } from '../chunk-65KBXGDT.js';
|
|
3
3
|
import { unauthorized, orUnauthorized, redirect } from '../chunk-6ZMNTJM3.js';
|
|
4
4
|
import { RouteId } from '../chunk-OUW6WESU.js';
|
|
5
5
|
import { getAuthToken } from '../chunk-QGOPTVV5.js';
|
|
@@ -56,10 +56,10 @@ async function loyaltyPointsLoader(locale) {
|
|
|
56
56
|
|
|
57
57
|
// src/routes/loyalty/index.tsx
|
|
58
58
|
var LazyLoyaltyPage = lazy(
|
|
59
|
-
() => import('../LoyaltyPage-
|
|
59
|
+
() => import('../LoyaltyPage-IWCKSJTJ.js').then((m) => ({ default: m.LoyaltyPage }))
|
|
60
60
|
);
|
|
61
61
|
var LazyLoyaltyPointsPage = lazy(
|
|
62
|
-
() => import('../LoyaltyPointsPage-
|
|
62
|
+
() => import('../LoyaltyPointsPage-7DWWY4LM.js').then((m) => ({ default: m.LoyaltyPointsPage }))
|
|
63
63
|
);
|
|
64
64
|
var LoyaltyPage = LazyLoyaltyPage;
|
|
65
65
|
var LoyaltyPointsPage = LazyLoyaltyPointsPage;
|
package/dist/routes/page.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { page } from '../chunk-WSBVUIRW.js';
|
|
2
|
-
import { buildHreflangAlternates } from '../chunk-
|
|
2
|
+
import { buildHreflangAlternates } from '../chunk-65KBXGDT.js';
|
|
3
3
|
import '../chunk-6ZMNTJM3.js';
|
|
4
4
|
import { RouteId } from '../chunk-OUW6WESU.js';
|
|
5
5
|
import '../chunk-QGOPTVV5.js';
|
|
@@ -27,7 +27,7 @@ async function pageSingleLoader({ params }) {
|
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
// src/routes/page/index.tsx
|
|
30
|
-
var LazyPageSingle = lazy(() => import('../PageSingle-
|
|
30
|
+
var LazyPageSingle = lazy(() => import('../PageSingle-DJNL362R.js').then((m) => ({ default: m.PageSingle })));
|
|
31
31
|
var PageSingleLazy = LazyPageSingle;
|
|
32
32
|
async function loader(ctx, extend) {
|
|
33
33
|
const data = await pageSingleLoader({ params: ctx.params });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/routes/product-listing/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,KAAK,EAAE,qBAAqB,EAA4B,MAAM,SAAS,CAAC;AAC/E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAG9D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAIpD,wBAAgB,IAAI,CAAC,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,qBAAqB,GAAG,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/routes/product-listing/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,KAAK,EAAE,qBAAqB,EAA4B,MAAM,SAAS,CAAC;AAC/E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAG9D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAIpD,wBAAgB,IAAI,CAAC,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,qBAAqB,GAAG,cAAc,CA+CtF;AAED,MAAM,WAAW,wBAAwB;IACvC,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,iBAAS,kBAAkB,CAAC,KAAK,EAAE,qBAAqB,+BAIvD;AAED,iBAAS,qBAAqB,CAAC,EAAE,WAAW,EAAE,EAAE,wBAAwB,+BAGvE;AAED,eAAO,MAAM,cAAc;;;;;;CAMjB,CAAC;AAEX,OAAO,EAAE,eAAe,EAAE,CAAC;AAC3B,OAAO,EAAE,iBAAiB,EAAE,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAChF,YAAY,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAEhE,YAAY,EACV,qBAAqB,EACrB,uBAAuB,EACvB,wBAAwB,EACxB,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EACnB,uBAAuB,EACvB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,SAAS,CAAC"}
|
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
import { sortOptions } from '../chunk-6Z4MOC4S.js';
|
|
2
2
|
import { category } from '../chunk-GAXVDCMA.js';
|
|
3
3
|
import { brand } from '../chunk-7X4XGKXO.js';
|
|
4
|
-
import { useReorderButtons, LazyTestimonials } from '../chunk-
|
|
4
|
+
import { useReorderButtons, LazyTestimonials } from '../chunk-4UMNQ4EQ.js';
|
|
5
5
|
import '../chunk-FZYR4BA2.js';
|
|
6
6
|
import { product, parseNextPageToken } from '../chunk-556OT3BN.js';
|
|
7
7
|
import { Drawer } from '../chunk-6TKIUG5C.js';
|
|
8
|
-
import { ProductCard } from '../chunk-
|
|
8
|
+
import { ProductCard } from '../chunk-L3U7C2DP.js';
|
|
9
9
|
import { registry, COMPONENT_KEYS } from '../chunk-Y32RHCOH.js';
|
|
10
|
-
import { useStore } from '../chunk-
|
|
11
|
-
import '../chunk-
|
|
12
|
-
import '../chunk-
|
|
13
|
-
import '../chunk-
|
|
10
|
+
import { useStore } from '../chunk-TJGHOSES.js';
|
|
11
|
+
import '../chunk-7XM2TC27.js';
|
|
12
|
+
import '../chunk-VQNLXDPQ.js';
|
|
13
|
+
import '../chunk-4446UB3M.js';
|
|
14
14
|
import '../chunk-2JV6WZ6O.js';
|
|
15
15
|
import '../chunk-RV54D2D7.js';
|
|
16
16
|
import '../chunk-ZVZGLEZ6.js';
|
|
17
17
|
import '../chunk-VVZNW5CB.js';
|
|
18
18
|
import '../chunk-5G7NYNX6.js';
|
|
19
19
|
import '../chunk-GD26FI4J.js';
|
|
20
|
-
import { buildHreflangAlternates } from '../chunk-
|
|
20
|
+
import { buildHreflangAlternates, storePageUrl } from '../chunk-65KBXGDT.js';
|
|
21
21
|
import { unauthorized, notFound, orThrow, useNavigate, useLocation } from '../chunk-6ZMNTJM3.js';
|
|
22
22
|
import { RouteId } from '../chunk-OUW6WESU.js';
|
|
23
23
|
import '../chunk-SAGXF3MU.js';
|
|
@@ -41,7 +41,7 @@ import { HookSlot } from '../chunk-5XDPAKF5.js';
|
|
|
41
41
|
import '../chunk-GCPEMNSU.js';
|
|
42
42
|
import { getAuthToken } from '../chunk-QGOPTVV5.js';
|
|
43
43
|
import { useTranslation } from '../chunk-TYNZ5B2B.js';
|
|
44
|
-
import { LazyBreadcrumb, Image, LazyNoContent, ProductCardSkeleton, LazyRenderWhenVisible } from '../chunk-
|
|
44
|
+
import { LazyBreadcrumb, Image, LazyNoContent, ProductCardSkeleton, LazyRenderWhenVisible } from '../chunk-Z3SSHDVW.js';
|
|
45
45
|
import '../chunk-AXW67SY7.js';
|
|
46
46
|
import '../chunk-BYMOPN2S.js';
|
|
47
47
|
import '../chunk-SKLEJJ6M.js';
|
|
@@ -615,7 +615,7 @@ function head(ctx, data) {
|
|
|
615
615
|
ctx.settings,
|
|
616
616
|
category2?.url ?? (tag?.url || productsPath || ctx.location.pathname)
|
|
617
617
|
);
|
|
618
|
-
const canonical = category2?.url ?? (tag?.url || void 0);
|
|
618
|
+
const canonical = category2?.url ?? (tag?.url || (productsPath ? storePageUrl(ctx.settings, `${ctx.location.pathname}?source=${data.source.type}`) : void 0));
|
|
619
619
|
const title = category2?.name ?? tag?.name ?? data.page.title;
|
|
620
620
|
const image = category2?.image ?? void 0;
|
|
621
621
|
const storeName = ctx.settings?.store?.name;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/routes/product-listing/loader.ts","../../src/routes/product-listing/useAppliedFilters.ts","../../src/routes/product-listing/ProductListPage.tsx","../../src/routes/product-listing/index.tsx"],"names":["i18n","useState","brand","useEffect","useCallback","page","category","jsx"],"mappings":"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","file":"product-listing.js","sourcesContent":["import type { ProductListLoaderData, ProductListLoaderContext, ProductListSource } from './types';\nimport type { ProductsListSource } from '../../api/product';\nimport { category } from '../../api/category';\nimport { product } from '../../api/product';\nimport { brand } from '../../api/brands';\nimport { notFound, orThrow, unauthorized } from '../../providers/NavigationProvider';\nimport { getAuthToken } from '../../api/client';\nimport { getTwilightContext } from '../../twilight/context';\nimport { RouteId } from '../../router/route-ids';\n\nconst DEFAULT_SORT = 'ourSuggest';\n\nconst SOURCE_TO_API: Record<ProductListSource, ProductsListSource> = {\n categories: 'categories',\n latest: 'latest',\n sales: 'sales',\n offers: 'offers',\n search: 'search',\n tags: 'tags',\n brands: 'brands',\n reorder: 'reorder',\n};\n\ntype StaticSource = 'latest' | 'sales' | 'offers' | 'reorder';\n\nconst SOURCE_TITLE_KEY: Record<StaticSource, string> = {\n latest: 'blocks.home.latest_products',\n sales: 'common.titles.most_sales',\n offers: 'common.titles.discounts',\n reorder: 'pages.orders.repurchase',\n};\n\nconst SOURCE_SLUG: Record<StaticSource, string> = {\n latest: 'products?source=latest',\n sales: 'products?source=sales',\n offers: 'products?source=offers',\n reorder: 'products?source=reorder',\n};\n\nexport async function productListLoader(\n ctx: ProductListLoaderContext\n): Promise<ProductListLoaderData> {\n const { params, search } = ctx;\n // A number is a page from an old Twig link; the API pages only by its own cursor.\n const page = search?.page ? String(search.page) : undefined;\n const cursor = page && Number.isNaN(Number(page)) ? page : undefined;\n const sort = search?.sort ?? DEFAULT_SORT;\n\n const sourceType = params.source ?? (params.id ? 'categories' : undefined);\n\n if (!sourceType) {\n throw new Error('ProductList loader requires source type');\n }\n\n if (sourceType === 'categories' && params.id) {\n return loadCategoryProducts(params.id, cursor, sort);\n }\n\n if (sourceType === 'search') {\n const keyword = (search?.q ?? params.keyword ?? '').trim();\n return loadSearchProducts(keyword, cursor, sort);\n }\n\n if (sourceType === 'tags' && params.id) {\n return loadTagProducts(params.id, cursor, sort);\n }\n\n if (sourceType === 'brands' && params.id) {\n return loadBrandProducts(params.id, cursor, sort);\n }\n\n // Only a signed-in customer has products to order again; the API answers a guest 401.\n if (sourceType === 'reorder' && !getAuthToken()) throw unauthorized();\n\n if (sourceType in SOURCE_TITLE_KEY) {\n return loadStaticProducts(\n sourceType as StaticSource,\n params.title ?? '',\n params.slug ?? '',\n cursor,\n sort\n );\n }\n\n throw new Error(`Unknown source type: ${sourceType}`);\n}\n\n// ============================================================================\n// Source-Specific Loaders\n// ============================================================================\n\nasync function loadCategoryProducts(\n id: string,\n cursor: string | undefined,\n sort: string\n): Promise<ProductListLoaderData> {\n const { queryClient, i18n } = getTwilightContext();\n let categoryData, productsResult;\n try {\n [categoryData, productsResult] = await Promise.all([\n queryClient.fetchQuery(category.queries.detail(id)),\n queryClient.fetchQuery(\n product.queries.list({\n source: 'categories',\n sourceValue: id,\n cursor,\n sort,\n filterable: true,\n })\n ),\n ]);\n } catch {\n throw notFound();\n }\n\n if (!categoryData) throw notFound();\n\n return {\n page: {\n slug: RouteId.PRODUCT_INDEX,\n id,\n title: categoryData.name,\n breadcrumbs: [\n { name: i18n.t('common.titles.home'), url: '/' },\n { name: categoryData.name, url: categoryData.url },\n ],\n },\n source: { type: 'categories', value: id, entity: categoryData },\n query: { sort, filters: true },\n products: productsResult.items,\n pagination: {\n next: productsResult.next,\n },\n filters: productsResult.filters,\n };\n}\n\nasync function loadSearchProducts(\n keyword: string,\n cursor: string | undefined,\n sort: string\n): Promise<ProductListLoaderData> {\n if (!keyword) {\n const { i18n } = getTwilightContext();\n return {\n page: {\n slug: RouteId.SEARCH,\n title: i18n.t('pages.products.search_result'),\n breadcrumbs: [\n { name: i18n.t('common.titles.home'), url: '/' },\n { name: i18n.t('pages.products.search_result'), url: '/search' },\n ],\n },\n source: { type: 'search', value: '' },\n query: { sort, filters: true },\n products: [],\n pagination: { next: null },\n };\n }\n\n const { queryClient, i18n } = getTwilightContext();\n const productsResult = await queryClient.fetchQuery(\n product.queries.list({\n source: 'search',\n sourceValue: keyword,\n cursor,\n sort,\n filterable: true,\n })\n );\n\n return {\n page: {\n slug: RouteId.SEARCH,\n title: i18n.t('common.elements.search_about').replace(':word', keyword),\n breadcrumbs: [\n { name: i18n.t('common.titles.home'), url: '/' },\n { name: keyword, url: '/search' },\n ],\n },\n source: { type: 'search', value: keyword },\n query: { sort, filters: true },\n products: productsResult.items,\n pagination: {\n next: productsResult.next,\n },\n filters: productsResult.filters,\n };\n}\n\nasync function loadTagProducts(\n id: string,\n cursor: string | undefined,\n sort: string\n): Promise<ProductListLoaderData> {\n const { queryClient, i18n } = getTwilightContext();\n const [tagData, productsResult] = await Promise.all([\n orThrow(queryClient.fetchQuery(product.queries.tag(id))),\n queryClient.fetchQuery(\n product.queries.list({\n source: 'tags',\n sourceValue: id,\n cursor,\n sort,\n })\n ),\n ]);\n\n if (!tagData) throw notFound();\n\n // List products carry their tags without an id, so the URL is there only sometimes.\n const tagUrl = productsResult.items[0]?.tags?.find((t) => String(t.id) === id)?.url ?? '';\n const tag = { id: Number(tagData.id), name: tagData.name, url: tagUrl };\n\n return {\n page: {\n slug: RouteId.PRODUCT_INDEX_TAG,\n id,\n title: tag.name,\n breadcrumbs: [\n { name: i18n.t('common.titles.home'), url: '/' },\n // Laravel's own `tags/{id}` route, for when the listed tags carry no URL.\n { name: tag.name, url: tag.url || `/tags/${id}` },\n ],\n },\n source: { type: 'tags', value: id, entity: tag },\n query: { sort, filters: false },\n products: productsResult.items,\n pagination: {\n next: productsResult.next,\n },\n };\n}\n\nasync function loadBrandProducts(\n id: string,\n cursor: string | undefined,\n sort: string\n): Promise<ProductListLoaderData> {\n const { queryClient, i18n } = getTwilightContext();\n let brandData, productsResult;\n try {\n [brandData, productsResult] = await Promise.all([\n queryClient.fetchQuery(brand.queries.detail(id)),\n queryClient.fetchQuery(\n product.queries.list({\n source: 'brands',\n sourceValue: id,\n cursor,\n sort,\n })\n ),\n ]);\n } catch {\n throw notFound();\n }\n\n if (!brandData) throw notFound();\n\n return {\n page: {\n slug: RouteId.BRANDS_INDEX,\n id,\n title: brandData.name,\n breadcrumbs: [\n { name: i18n.t('common.titles.home'), url: '/' },\n // The brand API sends no url.\n { name: brandData.name, url: `/brands/${id}` },\n ],\n },\n source: { type: 'brands', value: id, entity: brandData },\n query: { sort, filters: false },\n products: productsResult.items,\n pagination: {\n next: productsResult.next,\n },\n };\n}\n\nconst SOURCE_ROUTE_ID: Record<StaticSource, string> = {\n latest: RouteId.PRODUCT_INDEX_LATEST,\n sales: RouteId.PRODUCT_INDEX_SALES,\n offers: RouteId.PRODUCT_INDEX_OFFERS,\n reorder: RouteId.PRODUCT_INDEX,\n};\n\nasync function loadStaticProducts(\n source: StaticSource,\n title: string,\n slug: string,\n cursor: string | undefined,\n sort: string\n): Promise<ProductListLoaderData> {\n const { queryClient, i18n } = getTwilightContext();\n const resolvedTitle = title || i18n.t(SOURCE_TITLE_KEY[source]);\n const resolvedSlug = slug || SOURCE_SLUG[source];\n const productsResult = await queryClient.fetchQuery({\n ...product.queries.list({\n source: SOURCE_TO_API[source],\n cursor,\n sort,\n }),\n // The reorder key names no customer, so a cached list could be another session's.\n ...(source === 'reorder' && { staleTime: 0 }),\n });\n\n return {\n page: {\n slug: SOURCE_ROUTE_ID[source],\n title: resolvedTitle,\n breadcrumbs: [\n { name: i18n.t('common.titles.home'), url: '/' },\n { name: resolvedTitle, url: `/${resolvedSlug}` },\n ],\n },\n source: { type: source },\n query: { sort, filters: false },\n products: productsResult.items,\n pagination: {\n next: productsResult.next,\n },\n };\n}\n","import { useCallback, useEffect, useState } from 'react';\nimport { product } from '../../api/product';\nimport type { ProductListFilters } from '../../api/product';\nimport type { Product } from '../../types';\nimport type { ProductListLoaderData } from './types';\nimport { onSallaEvent } from '../../utils/sdk-helpers';\n\ntype Source = ProductListLoaderData['source'];\ntype Node = Record<string, unknown>;\n\n/** Path segments that would reach the shared prototype chain if used as object keys. */\nconst UNSAFE_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\n\n/**\n * Reads the `filters[...]` selection `<salla-filters>` writes to the address bar\n * (`filters[k]=v`, `filters[k][]=v`, `filters[k][sub]=v`) back into an object, so a\n * filtered link can be opened directly.\n *\n * The keys come straight from the URL, so nodes are null-prototype objects and any\n * `__proto__` / `constructor` / `prototype` segment drops the whole entry — a crafted\n * `?filters[__proto__][x]=1` must never reach `Object.prototype`.\n */\nexport function parseFiltersFromSearch(search: string): ProductListFilters | null {\n const out: Node = Object.create(null);\n new URLSearchParams(search).forEach((value, rawKey) => {\n if (!rawKey.startsWith('filters[')) return;\n const path = [...rawKey.matchAll(/\\[([^\\]]*)\\]/g)].map((m) => m[1]);\n const isList = path[path.length - 1] === '';\n const keys = isList ? path.slice(0, -1) : path;\n if (!keys.length || keys.includes('') || keys.some((key) => UNSAFE_KEYS.has(key))) return;\n\n let node = out;\n keys.slice(0, -1).forEach((key) => {\n const existing = node[key];\n if (typeof existing !== 'object' || existing === null || Array.isArray(existing)) {\n node[key] = Object.create(null);\n }\n node = node[key] as Node;\n });\n const leaf = keys[keys.length - 1];\n if (isList) {\n node[leaf] = [...(Array.isArray(node[leaf]) ? (node[leaf] as string[]) : []), value];\n } else {\n node[leaf] = value;\n }\n });\n return Object.keys(out).length ? (out as ProductListFilters) : null;\n}\n\ninterface FilteredPage {\n items: Product[];\n next: string | null;\n}\n\nexport type AppliedFiltersStatus = 'idle' | 'loading' | 'ready' | 'error';\n\n/**\n * Applies the `<salla-filters>` selection to the product list.\n *\n * The filters component only rewrites the address bar (`history.pushState`, invisible\n * to the router) and emits `salla-filters::changed`; nothing re-queries the list, so\n * the route's loader output — fetched without filters — kept showing. This listens\n * for that event (and for a filtered URL on first load) and fetches the first page\n * with the selection.\n *\n * Each fetched page is stored with the selection that produced it, so `page` is only\n * ever the page for the *current* selection. Until it arrives `status` is `loading`\n * (and `lastPage` is the previous selection's page, for a dimmed placeholder); if the\n * request fails `status` is `error` and `retry` re-runs it — the old products never\n * pass for the new selection.\n */\nexport function useAppliedFilters(\n source: Source,\n sort: string,\n enabled: boolean\n): {\n filters: ProductListFilters | null;\n page: FilteredPage | null;\n lastPage: FilteredPage | null;\n status: AppliedFiltersStatus;\n retry: () => void;\n} {\n const [filters, setFilters] = useState<ProductListFilters | null>(null);\n const [result, setResult] = useState<{ key: string; page: FilteredPage } | null>(null);\n const [failedKey, setFailedKey] = useState<string | null>(null);\n const [attempt, setAttempt] = useState(0);\n\n useEffect(() => {\n if (!enabled) return;\n setFilters(parseFiltersFromSearch(window.location.search));\n const onChanged = (...args: unknown[]) => {\n const next = args[0] as ProductListFilters | undefined;\n setFilters(next && Object.keys(next).length ? { ...next } : null);\n };\n return onSallaEvent('salla-filters::changed', onChanged);\n }, [enabled, source.type, source.value]);\n\n const key = filters ? JSON.stringify([source.type, source.value, sort, filters]) : '';\n\n useEffect(() => {\n if (!filters) return;\n const controller = new AbortController();\n setFailedKey(null);\n product\n .list({\n source: source.type,\n sourceValue: source.value,\n sort,\n filterable: true,\n filters,\n signal: controller.signal,\n })\n .then((res) => setResult({ key, page: { items: res.items, next: res.next } }))\n .catch(() => {\n // Aborted by a newer selection (its own effect run owns the state now), or failed.\n if (!controller.signal.aborted) setFailedKey(key);\n });\n return () => controller.abort();\n // `key` already encodes filters + source + sort.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [key, attempt]);\n\n const retry = useCallback(() => setAttempt((n) => n + 1), []);\n\n if (!filters) return { filters: null, page: null, lastPage: null, status: 'idle', retry };\n\n const page = result?.key === key ? result.page : null;\n const status: AppliedFiltersStatus = page ? 'ready' : failedKey === key ? 'error' : 'loading';\n return { filters, page, lastPage: result?.page ?? null, status, retry };\n}\n","import { useState, useRef, useEffect, useMemo, useCallback } from 'react';\nimport { HookSlot, useStore } from '../../hooks';\nimport { useTranslation } from '../../providers/I18nProvider';\nimport { useNavigate, useLocation } from '../../providers/NavigationProvider';\nimport { useTwilight } from '../../providers/TwilightProvider';\nimport { sortOptions } from '../../utils/sort-options';\nimport { Drawer } from '../../components/drawer';\nimport { Breadcrumb } from '../../components/common';\nimport { SallaFilters } from '@salla.sa/twilight-components-react/filters';\nimport { ItemsList, ReviewItemSkeleton } from '@salla.sa/twilight-components-react';\nimport { Testimonials, useReorderButtons } from '../../components/home';\nimport { ProductCard } from '../../components/product';\nimport { NoContent, ProductCardSkeleton, Image, RenderWhenVisible } from '../../components/common';\nimport { product, parseNextPageToken } from '../../api/product';\nimport { useAppliedFilters } from './useAppliedFilters';\nimport type { ProductListLoaderData } from './types';\nimport type { Brand } from '../brands/types';\nimport type { Product } from '../../types';\nimport { onSallaEvent } from '../../utils/sdk-helpers';\n\n/** 3-col + 288px sidebar from md; 3-col of the full container below md. */\nconst FILTERED_PRODUCT_IMAGE_SIZES = '(min-width: 768px) 25vw, 33vw';\n\n/**\n * Product List Page - Unified component for all product listing pages\n *\n * Handles:\n * - Category pages (with filters, category entity, testimonials)\n * - Search pages (keyword display, product count)\n * - Tag pages (tag entity)\n * - Brand pages (brand entity with banner/logo)\n * - Static listings (latest, sales, offers)\n */\nexport function ProductListPage({\n page,\n source,\n query,\n products,\n pagination,\n filters,\n}: ProductListLoaderData) {\n const { t } = useTranslation();\n const store = useStore();\n const { theme } = useTwilight();\n const navigate = useNavigate();\n // Sort is now SSR-driven, no local state needed\n const selectedSort = query.sort;\n const [filtersOpen, setFiltersOpen] = useState(false);\n\n // Determine filters visibility\n const showFilters = query.filters && store?.settings?.product?.filters;\n // const isSearch = source.type === 'search';\n const isBrand = source.type === 'brands';\n const brand = isBrand ? (source.entity as Brand | undefined) : null;\n const isReorder = source.type === 'reorder';\n useReorderButtons(isReorder);\n\n // Generate sort options with translations\n const sortOptionsWithTrans = useMemo(() => sortOptions(selectedSort, t), [selectedSort, t]);\n\n // Get location from hook for consistent URL handling\n const location = useLocation();\n\n // Re-query the list with the selection made in `<salla-filters>`: the component only\n // rewrites the address bar and emits `salla-filters::changed`, and the route's loader\n // output was fetched without it.\n const {\n filters: appliedFilters,\n page: filteredPage,\n lastPage,\n status: filterStatus,\n retry: retryFilters,\n } = useAppliedFilters(source, selectedSort, !!showFilters);\n // While the new selection loads, the previous page stays up (dimmed, `aria-busy`); if\n // the request fails nothing stale passes for the new selection. Infinite scroll is only\n // live for the loader's own page or a fully loaded filtered one.\n const shownPage = filterStatus === 'ready' ? filteredPage : lastPage;\n const shownProducts =\n filterStatus === 'error'\n ? []\n : filterStatus === 'idle'\n ? products\n : (shownPage?.items ?? products);\n const shownNext =\n filterStatus === 'idle'\n ? pagination?.next\n : filterStatus === 'ready'\n ? filteredPage?.next\n : null;\n const filteredKey =\n filterStatus === 'idle'\n ? ''\n : `-${filterStatus}${filterStatus === 'ready' ? JSON.stringify(appliedFilters) : ''}`;\n\n // Listen for filters changed event to close drawer\n useEffect(() => {\n const handleFiltersChanged = () => setFiltersOpen(false);\n return onSallaEvent('salla-filters::changed', handleFiltersChanged);\n }, []);\n\n // Handle sort change - use client-side navigation to trigger route loader re-run\n const handleSortChange = useCallback(\n (event: React.ChangeEvent<HTMLSelectElement>) => {\n const newSort = event.target.value;\n\n const params = new URLSearchParams(location.searchStr);\n params.set('sort', newSort);\n params.delete('page'); // clear any cursor token from URL on sort change\n\n // Use client-side navigation to trigger route loader re-execution (SSR-like).\n // Built from the router's location rather than `window.location`: on a host\n // where the store is the root, the address bar carries the store segment and\n // `navigate` would add it a second time.\n navigate(`${location.pathname}?${params.toString()}`);\n },\n [navigate, location.pathname, location.searchStr]\n );\n\n // Key for remounting products list\n const listKey = source.value ?? source.type;\n\n // Track cursor for the next page — initialized from SSR pagination response.\n // On sort change the key prop remounts ItemsList and this effect resets the cursor.\n const nextCursorRef = useRef<string | null>(shownNext ?? null);\n useEffect(() => {\n nextCursorRef.current = shownNext ?? null;\n }, [shownNext]);\n\n const loader = useCallback(async () => {\n const { cursor, page } = parseNextPageToken(nextCursorRef.current);\n\n const result = await product.list({\n source: source.type,\n sourceValue: source.value,\n ...(cursor && { cursor }),\n ...(page !== undefined && { page }),\n sort: selectedSort,\n ...(appliedFilters && { filterable: true, filters: appliedFilters }),\n });\n\n nextCursorRef.current = result.next;\n\n return result;\n }, [source.type, source.value, selectedSort, appliedFilters]);\n\n return (\n <div\n key={listKey}\n className=\"container px-2.5 ms:px-5 mb-10\"\n data-source={isReorder ? 'reorder' : undefined}\n >\n {theme?.settings?.product_index_show_breadcrumbs !== false && <Breadcrumb page={page} />}\n\n {isBrand && brand && (\n <>\n <Image\n width={1200}\n height={300}\n className=\"w-full max-h-[300px] object-cover rounded-md bg-gray-100\"\n src={brand.banner || undefined}\n alt={brand.name}\n priority\n />\n <header className=\"flex flex-col md:flex-row items-center md:items-start text-center rtl:md:text-right ltr:md:text-left mt-2 mb-8\">\n <Image\n className=\"rounded-md w-40 h-24 object-contain shadow-md p-4 bg-white shrink-0\"\n src={brand.logo || undefined}\n alt={brand.name}\n aspectRatio=\"5/3\"\n />\n <div className=\"px-5 pt-3 rtl:text-right\">\n <h1 className=\"text-2xl font-bold mb-1\">{brand.name}</h1>\n {brand.description && (\n <p\n className=\"text-base text-gray-500 font-medium\"\n dangerouslySetInnerHTML={{ __html: brand.description }}\n />\n )}\n </div>\n </header>\n </>\n )}\n\n <HookSlot name=\"product:list.start\" />\n\n <div className={showFilters ? 'md:grid md:grid-cols-[288px_1fr] gap-8' : ''}>\n {/* <FiltersSkeleton></FiltersSkeleton> */}\n {showFilters && (\n <SallaFilters\n id=\"filters-menu\"\n className=\"hidden md:block lg:sticky lg:top-20\"\n filters={filters as any}\n />\n )}\n\n <div className=\"min-w-0\">\n <div className=\"mb-4 sm:mb-6 flex justify-between items-center\">\n <h1 className=\"font-bold text-xl rtl:pl-3 ltr:pr-3\" id=\"page-main-title\">\n {isBrand ? t('common.titles.products') : page.title}\n </h1>\n\n <div className=\"flex items-center space-x-2 rtl:space-x-reverse\">\n {showFilters && (\n <button\n type=\"button\"\n onClick={() => setFiltersOpen(true)}\n className=\"filters-trigger bg-border-color text-primary lg:hidden p-2 rounded\"\n >\n <i className=\"sicon-filter text-gray-text text-2xl\" />\n </button>\n )}\n\n {sortOptionsWithTrans.length > 0 && (\n <div className=\"flex items-center\">\n <label\n className=\"hidden sm:block rtl:ml-3 ltr:mr-3 whitespace-nowrap\"\n htmlFor=\"product-sort\"\n >\n {t('pages.categories.sorting', 'Sort By')}\n </label>\n <select\n id=\"product-sort\"\n className=\"form-input pt-0 pb-1 rtl:md:pl-10 ltr:md:pr-10\"\n value={selectedSort}\n onChange={handleSortChange}\n >\n {sortOptionsWithTrans.map((option) => (\n <option key={option.id} value={option.id}>\n {option.name}\n </option>\n ))}\n </select>\n </div>\n )}\n </div>\n </div>\n\n <HookSlot name=\"product:list.items.start\" />\n\n <div\n className={`flex min-h-screen${filterStatus === 'loading' ? ' opacity-60' : ''}`}\n aria-busy={filterStatus === 'loading'}\n >\n {filterStatus === 'error' ? (\n <div className=\"flex-1 min-w-0 flex flex-col items-center\">\n <NoContent\n icon=\"sicon-shopping-bag\"\n message={t('common.errors.error_occurred', 'Something went wrong')}\n />\n <button type=\"button\" className=\"link--primary mt-4\" onClick={retryFilters}>\n {t('common.elements.try_again', 'Try again')}\n </button>\n </div>\n ) : (\n <ItemsList<Product>\n key={`${listKey}-${selectedSort}${filteredKey}`}\n resetKey={`${listKey}-${selectedSort}${filteredKey}`}\n items={shownProducts}\n loader={loader}\n mode={shownNext ? 'infinite' : 'static'}\n pageUrl={location.pathname + location.searchStr}\n className=\"s-products-list flex-1 min-w-0\"\n itemsClassName={`s-products-list-wrapper s-products-list-vertical-cards${showFilters ? ' s-products-list-with-filters' : ''}`}\n skeleton={<ProductCardSkeleton />}\n skeletonType=\"item\"\n skeletonCount={12}\n empty={\n <NoContent\n icon=\"sicon-shopping-bag\"\n message={t(\n 'pages.categories.no_products',\n 'No products found in this category'\n )}\n />\n }\n t={(key, fallback) => t(key, fallback || key)}\n >\n {(items) =>\n items.map((prod, idx) => (\n <ProductCard\n key={prod.id}\n product={prod}\n index={idx}\n sizes={showFilters ? FILTERED_PRODUCT_IMAGE_SIZES : undefined}\n />\n ))\n }\n </ItemsList>\n )}\n </div>\n\n <HookSlot name=\"product:list.items.end\" />\n </div>\n </div>\n\n {showFilters && (\n <Drawer isOpen={filtersOpen} onClose={() => setFiltersOpen(false)} size=\"md\">\n <div className=\"p-4\">\n <div className=\"flex justify-between items-center mb-4\">\n <h3 className=\"font-bold text-lg\">{t('pages.categories.filters', 'Filters')}</h3>\n <button\n type=\"button\"\n onClick={() => setFiltersOpen(false)}\n className=\"btn--close-sm sicon-cancel text-gray-500\"\n />\n </div>\n <SallaFilters id=\"filters-menu-mobile\" filters={filters as any} />\n </div>\n </Drawer>\n )}\n\n {source.type === 'categories' && store?.settings?.category?.testimonial_enabled && (\n <RenderWhenVisible placeholder={<ReviewItemSkeleton />}>\n <Testimonials data={{}} />\n </RenderWhenVisible>\n )}\n\n <HookSlot name=\"product:list.end\" />\n </div>\n );\n}\n","import { PageSkeleton } from '@salla.sa/twilight-components-react/skeletons';\nimport type { HeadDescriptor } from '../../utils/head';\nimport { buildHreflangAlternates } from '../../utils/baseHead';\nimport { productListLoader } from './loader';\nimport type { ProductListLoaderData, ProductListTag, Category } from './types';\nimport type { TwilightContext } from '../../twilight/context';\nimport { RouteId } from '../../router/route-ids';\nimport { registry, COMPONENT_KEYS } from '../../components/ComponentRegistry';\nimport { ProductListPage } from './ProductListPage';\n\nconst PRODUCTS_SOURCES = new Set(['latest', 'sales', 'offers', 'reorder']);\n\nexport function head(ctx: TwilightContext, data: ProductListLoaderData): HeadDescriptor {\n const entity = data.source.entity;\n const category = data.source.type === 'categories' ? (entity as Category | undefined) : undefined;\n const tag = data.source.type === 'tags' ? (entity as ProductListTag | undefined) : undefined;\n const productsPath = PRODUCTS_SOURCES.has(data.source.type)\n ? `/products?source=${data.source.type}`\n : undefined;\n\n const alternateLanguages = buildHreflangAlternates(\n ctx.settings,\n category?.url ?? (tag?.url || productsPath || ctx.location.pathname)\n );\n const canonical = category?.url ?? (tag?.url || undefined);\n const title = category?.name ?? tag?.name ?? data.page.title;\n const image = category?.image ?? undefined;\n const storeName = ctx.settings?.store?.name;\n // Twig: categories read \"<category> | <store name>\", other listings get the default suffix.\n const pageTitle = category && storeName ? `${title} | ${storeName}` : title;\n\n const base: HeadDescriptor = {\n title: pageTitle,\n appendStoreTitle: !category,\n description: `Browse ${title}`,\n canonical,\n openGraph: {\n type: 'website',\n title: pageTitle,\n description: `Browse ${title}`,\n images: image,\n url: canonical,\n },\n twitter: {\n card: 'summary_large_image',\n title: pageTitle,\n description: `Browse ${title}`,\n images: image,\n },\n alternateLanguages,\n };\n\n return base;\n}\n\nexport interface ProductListSkeletonProps {\n hideFilters?: boolean;\n}\n\nfunction ProductListingPage(props: ProductListLoaderData) {\n const Page =\n registry.resolve<ProductListLoaderData>(COMPONENT_KEYS.PRODUCT_LIST_PAGE) ?? ProductListPage;\n return <Page {...props} />;\n}\n\nfunction ProductListingPending({ hideFilters }: ProductListSkeletonProps) {\n const Skeleton = registry.resolve<ProductListSkeletonProps>(COMPONENT_KEYS.PRODUCT_LIST_SKELETON);\n return Skeleton ? <Skeleton hideFilters={hideFilters} /> : <PageSkeleton />;\n}\n\nexport const ProductListing = {\n id: RouteId.PRODUCT_INDEX,\n loader: productListLoader,\n head,\n Component: ProductListingPage,\n Pending: ProductListingPending,\n} as const;\n\nexport { ProductListPage };\nexport { productListLoader };\nexport { useAppliedFilters, parseFiltersFromSearch } from './useAppliedFilters';\nexport type { AppliedFiltersStatus } from './useAppliedFilters';\n\nexport type {\n ProductListLoaderData,\n ProductListLoaderParams,\n ProductListLoaderContext,\n ProductListSource,\n ProductListTag,\n ProductListEntity,\n ProductListPageMeta,\n ProductListSourceConfig,\n ProductListQuery,\n CategoryPageProps,\n} from './types';\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/routes/product-listing/loader.ts","../../src/routes/product-listing/useAppliedFilters.ts","../../src/routes/product-listing/ProductListPage.tsx","../../src/routes/product-listing/index.tsx"],"names":["i18n","useState","brand","useEffect","useCallback","page","category","jsx"],"mappings":"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","file":"product-listing.js","sourcesContent":["import type { ProductListLoaderData, ProductListLoaderContext, ProductListSource } from './types';\nimport type { ProductsListSource } from '../../api/product';\nimport { category } from '../../api/category';\nimport { product } from '../../api/product';\nimport { brand } from '../../api/brands';\nimport { notFound, orThrow, unauthorized } from '../../providers/NavigationProvider';\nimport { getAuthToken } from '../../api/client';\nimport { getTwilightContext } from '../../twilight/context';\nimport { RouteId } from '../../router/route-ids';\n\nconst DEFAULT_SORT = 'ourSuggest';\n\nconst SOURCE_TO_API: Record<ProductListSource, ProductsListSource> = {\n categories: 'categories',\n latest: 'latest',\n sales: 'sales',\n offers: 'offers',\n search: 'search',\n tags: 'tags',\n brands: 'brands',\n reorder: 'reorder',\n};\n\ntype StaticSource = 'latest' | 'sales' | 'offers' | 'reorder';\n\nconst SOURCE_TITLE_KEY: Record<StaticSource, string> = {\n latest: 'blocks.home.latest_products',\n sales: 'common.titles.most_sales',\n offers: 'common.titles.discounts',\n reorder: 'pages.orders.repurchase',\n};\n\nconst SOURCE_SLUG: Record<StaticSource, string> = {\n latest: 'products?source=latest',\n sales: 'products?source=sales',\n offers: 'products?source=offers',\n reorder: 'products?source=reorder',\n};\n\nexport async function productListLoader(\n ctx: ProductListLoaderContext\n): Promise<ProductListLoaderData> {\n const { params, search } = ctx;\n // A number is a page from an old Twig link; the API pages only by its own cursor.\n const page = search?.page ? String(search.page) : undefined;\n const cursor = page && Number.isNaN(Number(page)) ? page : undefined;\n const sort = search?.sort ?? DEFAULT_SORT;\n\n const sourceType = params.source ?? (params.id ? 'categories' : undefined);\n\n if (!sourceType) {\n throw new Error('ProductList loader requires source type');\n }\n\n if (sourceType === 'categories' && params.id) {\n return loadCategoryProducts(params.id, cursor, sort);\n }\n\n if (sourceType === 'search') {\n const keyword = (search?.q ?? params.keyword ?? '').trim();\n return loadSearchProducts(keyword, cursor, sort);\n }\n\n if (sourceType === 'tags' && params.id) {\n return loadTagProducts(params.id, cursor, sort);\n }\n\n if (sourceType === 'brands' && params.id) {\n return loadBrandProducts(params.id, cursor, sort);\n }\n\n // Only a signed-in customer has products to order again; the API answers a guest 401.\n if (sourceType === 'reorder' && !getAuthToken()) throw unauthorized();\n\n if (sourceType in SOURCE_TITLE_KEY) {\n return loadStaticProducts(\n sourceType as StaticSource,\n params.title ?? '',\n params.slug ?? '',\n cursor,\n sort\n );\n }\n\n throw new Error(`Unknown source type: ${sourceType}`);\n}\n\n// ============================================================================\n// Source-Specific Loaders\n// ============================================================================\n\nasync function loadCategoryProducts(\n id: string,\n cursor: string | undefined,\n sort: string\n): Promise<ProductListLoaderData> {\n const { queryClient, i18n } = getTwilightContext();\n let categoryData, productsResult;\n try {\n [categoryData, productsResult] = await Promise.all([\n queryClient.fetchQuery(category.queries.detail(id)),\n queryClient.fetchQuery(\n product.queries.list({\n source: 'categories',\n sourceValue: id,\n cursor,\n sort,\n filterable: true,\n })\n ),\n ]);\n } catch {\n throw notFound();\n }\n\n if (!categoryData) throw notFound();\n\n return {\n page: {\n slug: RouteId.PRODUCT_INDEX,\n id,\n title: categoryData.name,\n breadcrumbs: [\n { name: i18n.t('common.titles.home'), url: '/' },\n { name: categoryData.name, url: categoryData.url },\n ],\n },\n source: { type: 'categories', value: id, entity: categoryData },\n query: { sort, filters: true },\n products: productsResult.items,\n pagination: {\n next: productsResult.next,\n },\n filters: productsResult.filters,\n };\n}\n\nasync function loadSearchProducts(\n keyword: string,\n cursor: string | undefined,\n sort: string\n): Promise<ProductListLoaderData> {\n if (!keyword) {\n const { i18n } = getTwilightContext();\n return {\n page: {\n slug: RouteId.SEARCH,\n title: i18n.t('pages.products.search_result'),\n breadcrumbs: [\n { name: i18n.t('common.titles.home'), url: '/' },\n { name: i18n.t('pages.products.search_result'), url: '/search' },\n ],\n },\n source: { type: 'search', value: '' },\n query: { sort, filters: true },\n products: [],\n pagination: { next: null },\n };\n }\n\n const { queryClient, i18n } = getTwilightContext();\n const productsResult = await queryClient.fetchQuery(\n product.queries.list({\n source: 'search',\n sourceValue: keyword,\n cursor,\n sort,\n filterable: true,\n })\n );\n\n return {\n page: {\n slug: RouteId.SEARCH,\n title: i18n.t('common.elements.search_about').replace(':word', keyword),\n breadcrumbs: [\n { name: i18n.t('common.titles.home'), url: '/' },\n { name: keyword, url: '/search' },\n ],\n },\n source: { type: 'search', value: keyword },\n query: { sort, filters: true },\n products: productsResult.items,\n pagination: {\n next: productsResult.next,\n },\n filters: productsResult.filters,\n };\n}\n\nasync function loadTagProducts(\n id: string,\n cursor: string | undefined,\n sort: string\n): Promise<ProductListLoaderData> {\n const { queryClient, i18n } = getTwilightContext();\n const [tagData, productsResult] = await Promise.all([\n orThrow(queryClient.fetchQuery(product.queries.tag(id))),\n queryClient.fetchQuery(\n product.queries.list({\n source: 'tags',\n sourceValue: id,\n cursor,\n sort,\n })\n ),\n ]);\n\n if (!tagData) throw notFound();\n\n // List products carry their tags without an id, so the URL is there only sometimes.\n const tagUrl = productsResult.items[0]?.tags?.find((t) => String(t.id) === id)?.url ?? '';\n const tag = { id: Number(tagData.id), name: tagData.name, url: tagUrl };\n\n return {\n page: {\n slug: RouteId.PRODUCT_INDEX_TAG,\n id,\n title: tag.name,\n breadcrumbs: [\n { name: i18n.t('common.titles.home'), url: '/' },\n // Laravel's own `tags/{id}` route, for when the listed tags carry no URL.\n { name: tag.name, url: tag.url || `/tags/${id}` },\n ],\n },\n source: { type: 'tags', value: id, entity: tag },\n query: { sort, filters: false },\n products: productsResult.items,\n pagination: {\n next: productsResult.next,\n },\n };\n}\n\nasync function loadBrandProducts(\n id: string,\n cursor: string | undefined,\n sort: string\n): Promise<ProductListLoaderData> {\n const { queryClient, i18n } = getTwilightContext();\n let brandData, productsResult;\n try {\n [brandData, productsResult] = await Promise.all([\n queryClient.fetchQuery(brand.queries.detail(id)),\n queryClient.fetchQuery(\n product.queries.list({\n source: 'brands',\n sourceValue: id,\n cursor,\n sort,\n })\n ),\n ]);\n } catch {\n throw notFound();\n }\n\n if (!brandData) throw notFound();\n\n return {\n page: {\n slug: RouteId.BRANDS_INDEX,\n id,\n title: brandData.name,\n breadcrumbs: [\n { name: i18n.t('common.titles.home'), url: '/' },\n // The brand API sends no url.\n { name: brandData.name, url: `/brands/${id}` },\n ],\n },\n source: { type: 'brands', value: id, entity: brandData },\n query: { sort, filters: false },\n products: productsResult.items,\n pagination: {\n next: productsResult.next,\n },\n };\n}\n\nconst SOURCE_ROUTE_ID: Record<StaticSource, string> = {\n latest: RouteId.PRODUCT_INDEX_LATEST,\n sales: RouteId.PRODUCT_INDEX_SALES,\n offers: RouteId.PRODUCT_INDEX_OFFERS,\n reorder: RouteId.PRODUCT_INDEX,\n};\n\nasync function loadStaticProducts(\n source: StaticSource,\n title: string,\n slug: string,\n cursor: string | undefined,\n sort: string\n): Promise<ProductListLoaderData> {\n const { queryClient, i18n } = getTwilightContext();\n const resolvedTitle = title || i18n.t(SOURCE_TITLE_KEY[source]);\n const resolvedSlug = slug || SOURCE_SLUG[source];\n const productsResult = await queryClient.fetchQuery({\n ...product.queries.list({\n source: SOURCE_TO_API[source],\n cursor,\n sort,\n }),\n // The reorder key names no customer, so a cached list could be another session's.\n ...(source === 'reorder' && { staleTime: 0 }),\n });\n\n return {\n page: {\n slug: SOURCE_ROUTE_ID[source],\n title: resolvedTitle,\n breadcrumbs: [\n { name: i18n.t('common.titles.home'), url: '/' },\n { name: resolvedTitle, url: `/${resolvedSlug}` },\n ],\n },\n source: { type: source },\n query: { sort, filters: false },\n products: productsResult.items,\n pagination: {\n next: productsResult.next,\n },\n };\n}\n","import { useCallback, useEffect, useState } from 'react';\nimport { product } from '../../api/product';\nimport type { ProductListFilters } from '../../api/product';\nimport type { Product } from '../../types';\nimport type { ProductListLoaderData } from './types';\nimport { onSallaEvent } from '../../utils/sdk-helpers';\n\ntype Source = ProductListLoaderData['source'];\ntype Node = Record<string, unknown>;\n\n/** Path segments that would reach the shared prototype chain if used as object keys. */\nconst UNSAFE_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\n\n/**\n * Reads the `filters[...]` selection `<salla-filters>` writes to the address bar\n * (`filters[k]=v`, `filters[k][]=v`, `filters[k][sub]=v`) back into an object, so a\n * filtered link can be opened directly.\n *\n * The keys come straight from the URL, so nodes are null-prototype objects and any\n * `__proto__` / `constructor` / `prototype` segment drops the whole entry — a crafted\n * `?filters[__proto__][x]=1` must never reach `Object.prototype`.\n */\nexport function parseFiltersFromSearch(search: string): ProductListFilters | null {\n const out: Node = Object.create(null);\n new URLSearchParams(search).forEach((value, rawKey) => {\n if (!rawKey.startsWith('filters[')) return;\n const path = [...rawKey.matchAll(/\\[([^\\]]*)\\]/g)].map((m) => m[1]);\n const isList = path[path.length - 1] === '';\n const keys = isList ? path.slice(0, -1) : path;\n if (!keys.length || keys.includes('') || keys.some((key) => UNSAFE_KEYS.has(key))) return;\n\n let node = out;\n keys.slice(0, -1).forEach((key) => {\n const existing = node[key];\n if (typeof existing !== 'object' || existing === null || Array.isArray(existing)) {\n node[key] = Object.create(null);\n }\n node = node[key] as Node;\n });\n const leaf = keys[keys.length - 1];\n if (isList) {\n node[leaf] = [...(Array.isArray(node[leaf]) ? (node[leaf] as string[]) : []), value];\n } else {\n node[leaf] = value;\n }\n });\n return Object.keys(out).length ? (out as ProductListFilters) : null;\n}\n\ninterface FilteredPage {\n items: Product[];\n next: string | null;\n}\n\nexport type AppliedFiltersStatus = 'idle' | 'loading' | 'ready' | 'error';\n\n/**\n * Applies the `<salla-filters>` selection to the product list.\n *\n * The filters component only rewrites the address bar (`history.pushState`, invisible\n * to the router) and emits `salla-filters::changed`; nothing re-queries the list, so\n * the route's loader output — fetched without filters — kept showing. This listens\n * for that event (and for a filtered URL on first load) and fetches the first page\n * with the selection.\n *\n * Each fetched page is stored with the selection that produced it, so `page` is only\n * ever the page for the *current* selection. Until it arrives `status` is `loading`\n * (and `lastPage` is the previous selection's page, for a dimmed placeholder); if the\n * request fails `status` is `error` and `retry` re-runs it — the old products never\n * pass for the new selection.\n */\nexport function useAppliedFilters(\n source: Source,\n sort: string,\n enabled: boolean\n): {\n filters: ProductListFilters | null;\n page: FilteredPage | null;\n lastPage: FilteredPage | null;\n status: AppliedFiltersStatus;\n retry: () => void;\n} {\n const [filters, setFilters] = useState<ProductListFilters | null>(null);\n const [result, setResult] = useState<{ key: string; page: FilteredPage } | null>(null);\n const [failedKey, setFailedKey] = useState<string | null>(null);\n const [attempt, setAttempt] = useState(0);\n\n useEffect(() => {\n if (!enabled) return;\n setFilters(parseFiltersFromSearch(window.location.search));\n const onChanged = (...args: unknown[]) => {\n const next = args[0] as ProductListFilters | undefined;\n setFilters(next && Object.keys(next).length ? { ...next } : null);\n };\n return onSallaEvent('salla-filters::changed', onChanged);\n }, [enabled, source.type, source.value]);\n\n const key = filters ? JSON.stringify([source.type, source.value, sort, filters]) : '';\n\n useEffect(() => {\n if (!filters) return;\n const controller = new AbortController();\n setFailedKey(null);\n product\n .list({\n source: source.type,\n sourceValue: source.value,\n sort,\n filterable: true,\n filters,\n signal: controller.signal,\n })\n .then((res) => setResult({ key, page: { items: res.items, next: res.next } }))\n .catch(() => {\n // Aborted by a newer selection (its own effect run owns the state now), or failed.\n if (!controller.signal.aborted) setFailedKey(key);\n });\n return () => controller.abort();\n // `key` already encodes filters + source + sort.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [key, attempt]);\n\n const retry = useCallback(() => setAttempt((n) => n + 1), []);\n\n if (!filters) return { filters: null, page: null, lastPage: null, status: 'idle', retry };\n\n const page = result?.key === key ? result.page : null;\n const status: AppliedFiltersStatus = page ? 'ready' : failedKey === key ? 'error' : 'loading';\n return { filters, page, lastPage: result?.page ?? null, status, retry };\n}\n","import { useState, useRef, useEffect, useMemo, useCallback } from 'react';\nimport { HookSlot, useStore } from '../../hooks';\nimport { useTranslation } from '../../providers/I18nProvider';\nimport { useNavigate, useLocation } from '../../providers/NavigationProvider';\nimport { useTwilight } from '../../providers/TwilightProvider';\nimport { sortOptions } from '../../utils/sort-options';\nimport { Drawer } from '../../components/drawer';\nimport { Breadcrumb } from '../../components/common';\nimport { SallaFilters } from '@salla.sa/twilight-components-react/filters';\nimport { ItemsList, ReviewItemSkeleton } from '@salla.sa/twilight-components-react';\nimport { Testimonials, useReorderButtons } from '../../components/home';\nimport { ProductCard } from '../../components/product';\nimport { NoContent, ProductCardSkeleton, Image, RenderWhenVisible } from '../../components/common';\nimport { product, parseNextPageToken } from '../../api/product';\nimport { useAppliedFilters } from './useAppliedFilters';\nimport type { ProductListLoaderData } from './types';\nimport type { Brand } from '../brands/types';\nimport type { Product } from '../../types';\nimport { onSallaEvent } from '../../utils/sdk-helpers';\n\n/** 3-col + 288px sidebar from md; 3-col of the full container below md. */\nconst FILTERED_PRODUCT_IMAGE_SIZES = '(min-width: 768px) 25vw, 33vw';\n\n/**\n * Product List Page - Unified component for all product listing pages\n *\n * Handles:\n * - Category pages (with filters, category entity, testimonials)\n * - Search pages (keyword display, product count)\n * - Tag pages (tag entity)\n * - Brand pages (brand entity with banner/logo)\n * - Static listings (latest, sales, offers)\n */\nexport function ProductListPage({\n page,\n source,\n query,\n products,\n pagination,\n filters,\n}: ProductListLoaderData) {\n const { t } = useTranslation();\n const store = useStore();\n const { theme } = useTwilight();\n const navigate = useNavigate();\n // Sort is now SSR-driven, no local state needed\n const selectedSort = query.sort;\n const [filtersOpen, setFiltersOpen] = useState(false);\n\n // Determine filters visibility\n const showFilters = query.filters && store?.settings?.product?.filters;\n // const isSearch = source.type === 'search';\n const isBrand = source.type === 'brands';\n const brand = isBrand ? (source.entity as Brand | undefined) : null;\n const isReorder = source.type === 'reorder';\n useReorderButtons(isReorder);\n\n // Generate sort options with translations\n const sortOptionsWithTrans = useMemo(() => sortOptions(selectedSort, t), [selectedSort, t]);\n\n // Get location from hook for consistent URL handling\n const location = useLocation();\n\n // Re-query the list with the selection made in `<salla-filters>`: the component only\n // rewrites the address bar and emits `salla-filters::changed`, and the route's loader\n // output was fetched without it.\n const {\n filters: appliedFilters,\n page: filteredPage,\n lastPage,\n status: filterStatus,\n retry: retryFilters,\n } = useAppliedFilters(source, selectedSort, !!showFilters);\n // While the new selection loads, the previous page stays up (dimmed, `aria-busy`); if\n // the request fails nothing stale passes for the new selection. Infinite scroll is only\n // live for the loader's own page or a fully loaded filtered one.\n const shownPage = filterStatus === 'ready' ? filteredPage : lastPage;\n const shownProducts =\n filterStatus === 'error'\n ? []\n : filterStatus === 'idle'\n ? products\n : (shownPage?.items ?? products);\n const shownNext =\n filterStatus === 'idle'\n ? pagination?.next\n : filterStatus === 'ready'\n ? filteredPage?.next\n : null;\n const filteredKey =\n filterStatus === 'idle'\n ? ''\n : `-${filterStatus}${filterStatus === 'ready' ? JSON.stringify(appliedFilters) : ''}`;\n\n // Listen for filters changed event to close drawer\n useEffect(() => {\n const handleFiltersChanged = () => setFiltersOpen(false);\n return onSallaEvent('salla-filters::changed', handleFiltersChanged);\n }, []);\n\n // Handle sort change - use client-side navigation to trigger route loader re-run\n const handleSortChange = useCallback(\n (event: React.ChangeEvent<HTMLSelectElement>) => {\n const newSort = event.target.value;\n\n const params = new URLSearchParams(location.searchStr);\n params.set('sort', newSort);\n params.delete('page'); // clear any cursor token from URL on sort change\n\n // Use client-side navigation to trigger route loader re-execution (SSR-like).\n // Built from the router's location rather than `window.location`: on a host\n // where the store is the root, the address bar carries the store segment and\n // `navigate` would add it a second time.\n navigate(`${location.pathname}?${params.toString()}`);\n },\n [navigate, location.pathname, location.searchStr]\n );\n\n // Key for remounting products list\n const listKey = source.value ?? source.type;\n\n // Track cursor for the next page — initialized from SSR pagination response.\n // On sort change the key prop remounts ItemsList and this effect resets the cursor.\n const nextCursorRef = useRef<string | null>(shownNext ?? null);\n useEffect(() => {\n nextCursorRef.current = shownNext ?? null;\n }, [shownNext]);\n\n const loader = useCallback(async () => {\n const { cursor, page } = parseNextPageToken(nextCursorRef.current);\n\n const result = await product.list({\n source: source.type,\n sourceValue: source.value,\n ...(cursor && { cursor }),\n ...(page !== undefined && { page }),\n sort: selectedSort,\n ...(appliedFilters && { filterable: true, filters: appliedFilters }),\n });\n\n nextCursorRef.current = result.next;\n\n return result;\n }, [source.type, source.value, selectedSort, appliedFilters]);\n\n return (\n <div\n key={listKey}\n className=\"container px-2.5 ms:px-5 mb-10\"\n data-source={isReorder ? 'reorder' : undefined}\n >\n {theme?.settings?.product_index_show_breadcrumbs !== false && <Breadcrumb page={page} />}\n\n {isBrand && brand && (\n <>\n <Image\n width={1200}\n height={300}\n className=\"w-full max-h-[300px] object-cover rounded-md bg-gray-100\"\n src={brand.banner || undefined}\n alt={brand.name}\n priority\n />\n <header className=\"flex flex-col md:flex-row items-center md:items-start text-center rtl:md:text-right ltr:md:text-left mt-2 mb-8\">\n <Image\n className=\"rounded-md w-40 h-24 object-contain shadow-md p-4 bg-white shrink-0\"\n src={brand.logo || undefined}\n alt={brand.name}\n aspectRatio=\"5/3\"\n />\n <div className=\"px-5 pt-3 rtl:text-right\">\n <h1 className=\"text-2xl font-bold mb-1\">{brand.name}</h1>\n {brand.description && (\n <p\n className=\"text-base text-gray-500 font-medium\"\n dangerouslySetInnerHTML={{ __html: brand.description }}\n />\n )}\n </div>\n </header>\n </>\n )}\n\n <HookSlot name=\"product:list.start\" />\n\n <div className={showFilters ? 'md:grid md:grid-cols-[288px_1fr] gap-8' : ''}>\n {/* <FiltersSkeleton></FiltersSkeleton> */}\n {showFilters && (\n <SallaFilters\n id=\"filters-menu\"\n className=\"hidden md:block lg:sticky lg:top-20\"\n filters={filters as any}\n />\n )}\n\n <div className=\"min-w-0\">\n <div className=\"mb-4 sm:mb-6 flex justify-between items-center\">\n <h1 className=\"font-bold text-xl rtl:pl-3 ltr:pr-3\" id=\"page-main-title\">\n {isBrand ? t('common.titles.products') : page.title}\n </h1>\n\n <div className=\"flex items-center space-x-2 rtl:space-x-reverse\">\n {showFilters && (\n <button\n type=\"button\"\n onClick={() => setFiltersOpen(true)}\n className=\"filters-trigger bg-border-color text-primary lg:hidden p-2 rounded\"\n >\n <i className=\"sicon-filter text-gray-text text-2xl\" />\n </button>\n )}\n\n {sortOptionsWithTrans.length > 0 && (\n <div className=\"flex items-center\">\n <label\n className=\"hidden sm:block rtl:ml-3 ltr:mr-3 whitespace-nowrap\"\n htmlFor=\"product-sort\"\n >\n {t('pages.categories.sorting', 'Sort By')}\n </label>\n <select\n id=\"product-sort\"\n className=\"form-input pt-0 pb-1 rtl:md:pl-10 ltr:md:pr-10\"\n value={selectedSort}\n onChange={handleSortChange}\n >\n {sortOptionsWithTrans.map((option) => (\n <option key={option.id} value={option.id}>\n {option.name}\n </option>\n ))}\n </select>\n </div>\n )}\n </div>\n </div>\n\n <HookSlot name=\"product:list.items.start\" />\n\n <div\n className={`flex min-h-screen${filterStatus === 'loading' ? ' opacity-60' : ''}`}\n aria-busy={filterStatus === 'loading'}\n >\n {filterStatus === 'error' ? (\n <div className=\"flex-1 min-w-0 flex flex-col items-center\">\n <NoContent\n icon=\"sicon-shopping-bag\"\n message={t('common.errors.error_occurred', 'Something went wrong')}\n />\n <button type=\"button\" className=\"link--primary mt-4\" onClick={retryFilters}>\n {t('common.elements.try_again', 'Try again')}\n </button>\n </div>\n ) : (\n <ItemsList<Product>\n key={`${listKey}-${selectedSort}${filteredKey}`}\n resetKey={`${listKey}-${selectedSort}${filteredKey}`}\n items={shownProducts}\n loader={loader}\n mode={shownNext ? 'infinite' : 'static'}\n pageUrl={location.pathname + location.searchStr}\n className=\"s-products-list flex-1 min-w-0\"\n itemsClassName={`s-products-list-wrapper s-products-list-vertical-cards${showFilters ? ' s-products-list-with-filters' : ''}`}\n skeleton={<ProductCardSkeleton />}\n skeletonType=\"item\"\n skeletonCount={12}\n empty={\n <NoContent\n icon=\"sicon-shopping-bag\"\n message={t(\n 'pages.categories.no_products',\n 'No products found in this category'\n )}\n />\n }\n t={(key, fallback) => t(key, fallback || key)}\n >\n {(items) =>\n items.map((prod, idx) => (\n <ProductCard\n key={prod.id}\n product={prod}\n index={idx}\n sizes={showFilters ? FILTERED_PRODUCT_IMAGE_SIZES : undefined}\n />\n ))\n }\n </ItemsList>\n )}\n </div>\n\n <HookSlot name=\"product:list.items.end\" />\n </div>\n </div>\n\n {showFilters && (\n <Drawer isOpen={filtersOpen} onClose={() => setFiltersOpen(false)} size=\"md\">\n <div className=\"p-4\">\n <div className=\"flex justify-between items-center mb-4\">\n <h3 className=\"font-bold text-lg\">{t('pages.categories.filters', 'Filters')}</h3>\n <button\n type=\"button\"\n onClick={() => setFiltersOpen(false)}\n className=\"btn--close-sm sicon-cancel text-gray-500\"\n />\n </div>\n <SallaFilters id=\"filters-menu-mobile\" filters={filters as any} />\n </div>\n </Drawer>\n )}\n\n {source.type === 'categories' && store?.settings?.category?.testimonial_enabled && (\n <RenderWhenVisible placeholder={<ReviewItemSkeleton />}>\n <Testimonials data={{}} />\n </RenderWhenVisible>\n )}\n\n <HookSlot name=\"product:list.end\" />\n </div>\n );\n}\n","import { PageSkeleton } from '@salla.sa/twilight-components-react/skeletons';\nimport type { HeadDescriptor } from '../../utils/head';\nimport { buildHreflangAlternates, storePageUrl } from '../../utils/baseHead';\nimport { productListLoader } from './loader';\nimport type { ProductListLoaderData, ProductListTag, Category } from './types';\nimport type { TwilightContext } from '../../twilight/context';\nimport { RouteId } from '../../router/route-ids';\nimport { registry, COMPONENT_KEYS } from '../../components/ComponentRegistry';\nimport { ProductListPage } from './ProductListPage';\n\nconst PRODUCTS_SOURCES = new Set(['latest', 'sales', 'offers', 'reorder']);\n\nexport function head(ctx: TwilightContext, data: ProductListLoaderData): HeadDescriptor {\n const entity = data.source.entity;\n const category = data.source.type === 'categories' ? (entity as Category | undefined) : undefined;\n const tag = data.source.type === 'tags' ? (entity as ProductListTag | undefined) : undefined;\n const productsPath = PRODUCTS_SOURCES.has(data.source.type)\n ? `/products?source=${data.source.type}`\n : undefined;\n\n const alternateLanguages = buildHreflangAlternates(\n ctx.settings,\n category?.url ?? (tag?.url || productsPath || ctx.location.pathname)\n );\n // The sources share one path, so their canonical keeps `source` (Twig gave each its own path).\n const canonical =\n category?.url ??\n (tag?.url ||\n (productsPath\n ? storePageUrl(ctx.settings, `${ctx.location.pathname}?source=${data.source.type}`)\n : undefined));\n const title = category?.name ?? tag?.name ?? data.page.title;\n const image = category?.image ?? undefined;\n const storeName = ctx.settings?.store?.name;\n // Twig: categories read \"<category> | <store name>\", other listings get the default suffix.\n const pageTitle = category && storeName ? `${title} | ${storeName}` : title;\n\n const base: HeadDescriptor = {\n title: pageTitle,\n appendStoreTitle: !category,\n description: `Browse ${title}`,\n canonical,\n openGraph: {\n type: 'website',\n title: pageTitle,\n description: `Browse ${title}`,\n images: image,\n url: canonical,\n },\n twitter: {\n card: 'summary_large_image',\n title: pageTitle,\n description: `Browse ${title}`,\n images: image,\n },\n alternateLanguages,\n };\n\n return base;\n}\n\nexport interface ProductListSkeletonProps {\n hideFilters?: boolean;\n}\n\nfunction ProductListingPage(props: ProductListLoaderData) {\n const Page =\n registry.resolve<ProductListLoaderData>(COMPONENT_KEYS.PRODUCT_LIST_PAGE) ?? ProductListPage;\n return <Page {...props} />;\n}\n\nfunction ProductListingPending({ hideFilters }: ProductListSkeletonProps) {\n const Skeleton = registry.resolve<ProductListSkeletonProps>(COMPONENT_KEYS.PRODUCT_LIST_SKELETON);\n return Skeleton ? <Skeleton hideFilters={hideFilters} /> : <PageSkeleton />;\n}\n\nexport const ProductListing = {\n id: RouteId.PRODUCT_INDEX,\n loader: productListLoader,\n head,\n Component: ProductListingPage,\n Pending: ProductListingPending,\n} as const;\n\nexport { ProductListPage };\nexport { productListLoader };\nexport { useAppliedFilters, parseFiltersFromSearch } from './useAppliedFilters';\nexport type { AppliedFiltersStatus } from './useAppliedFilters';\n\nexport type {\n ProductListLoaderData,\n ProductListLoaderParams,\n ProductListLoaderContext,\n ProductListSource,\n ProductListTag,\n ProductListEntity,\n ProductListPageMeta,\n ProductListSourceConfig,\n ProductListQuery,\n CategoryPageProps,\n} from './types';\n"]}
|
package/dist/routes/product.js
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
import { ProductsSlider, LazyTestimonials } from '../chunk-
|
|
1
|
+
import { ProductsSlider, LazyTestimonials } from '../chunk-4UMNQ4EQ.js';
|
|
2
2
|
import '../chunk-FZYR4BA2.js';
|
|
3
3
|
import { product } from '../chunk-556OT3BN.js';
|
|
4
|
-
import { ProductGallery, LazyProductDetails, LazyAddToCartForm } from '../chunk-
|
|
4
|
+
import { ProductGallery, LazyProductDetails, LazyAddToCartForm } from '../chunk-L3U7C2DP.js';
|
|
5
5
|
import '../chunk-Y32RHCOH.js';
|
|
6
|
-
import { fastCheckoutScript } from '../chunk-
|
|
7
|
-
import '../chunk-
|
|
8
|
-
import '../chunk-
|
|
9
|
-
import '../chunk-
|
|
6
|
+
import { fastCheckoutScript } from '../chunk-TJGHOSES.js';
|
|
7
|
+
import '../chunk-7XM2TC27.js';
|
|
8
|
+
import '../chunk-VQNLXDPQ.js';
|
|
9
|
+
import '../chunk-4446UB3M.js';
|
|
10
10
|
import '../chunk-2JV6WZ6O.js';
|
|
11
11
|
import '../chunk-RV54D2D7.js';
|
|
12
12
|
import '../chunk-ZVZGLEZ6.js';
|
|
13
13
|
import '../chunk-VVZNW5CB.js';
|
|
14
14
|
import '../chunk-5G7NYNX6.js';
|
|
15
15
|
import '../chunk-GD26FI4J.js';
|
|
16
|
-
import { buildHreflangAlternates } from '../chunk-
|
|
16
|
+
import { buildHreflangAlternates } from '../chunk-65KBXGDT.js';
|
|
17
17
|
import '../chunk-6ZMNTJM3.js';
|
|
18
18
|
import { RouteId } from '../chunk-OUW6WESU.js';
|
|
19
19
|
import { useComments } from '../chunk-SAGXF3MU.js';
|
|
@@ -37,7 +37,7 @@ import { HookSlot } from '../chunk-5XDPAKF5.js';
|
|
|
37
37
|
import '../chunk-GCPEMNSU.js';
|
|
38
38
|
import { getActiveCurrency } from '../chunk-QGOPTVV5.js';
|
|
39
39
|
import { useTranslation } from '../chunk-TYNZ5B2B.js';
|
|
40
|
-
import { LazyBreadcrumb, LazyRenderWhenVisible } from '../chunk-
|
|
40
|
+
import { LazyBreadcrumb, LazyRenderWhenVisible } from '../chunk-Z3SSHDVW.js';
|
|
41
41
|
import '../chunk-AXW67SY7.js';
|
|
42
42
|
import '../chunk-BYMOPN2S.js';
|
|
43
43
|
import '../chunk-SKLEJJ6M.js';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { buildHreflangAlternates } from '../chunk-
|
|
1
|
+
import { buildHreflangAlternates } from '../chunk-65KBXGDT.js';
|
|
2
2
|
import { RouteId } from '../chunk-OUW6WESU.js';
|
|
3
3
|
import { getTwilightContext } from '../chunk-N2S25NXP.js';
|
|
4
4
|
import '../chunk-T72DAX7R.js';
|
|
@@ -32,10 +32,10 @@ async function reviewsLoader() {
|
|
|
32
32
|
|
|
33
33
|
// src/routes/testimonials/index.tsx
|
|
34
34
|
var LazyTestimonialsPage = lazy(
|
|
35
|
-
() => import('../TestimonialsPage-
|
|
35
|
+
() => import('../TestimonialsPage-36QYN7RD.js').then((m) => ({ default: m.TestimonialsPage }))
|
|
36
36
|
);
|
|
37
37
|
var LazyReviewsPage = lazy(
|
|
38
|
-
() => import('../ReviewsPage-
|
|
38
|
+
() => import('../ReviewsPage-HGXGW7WU.js').then((m) => ({ default: m.ReviewsPage }))
|
|
39
39
|
);
|
|
40
40
|
var TestimonialsPage = LazyTestimonialsPage;
|
|
41
41
|
var ReviewsPage = LazyReviewsPage;
|
package/dist/routes/thank-you.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { order } from '../chunk-YGJMUJVR.js';
|
|
2
|
-
import { buildHreflangAlternates } from '../chunk-
|
|
2
|
+
import { buildHreflangAlternates } from '../chunk-65KBXGDT.js';
|
|
3
3
|
import '../chunk-6ZMNTJM3.js';
|
|
4
4
|
import { RouteId } from '../chunk-OUW6WESU.js';
|
|
5
5
|
import '../chunk-QGOPTVV5.js';
|
|
@@ -38,7 +38,7 @@ async function thankYouLoader({
|
|
|
38
38
|
|
|
39
39
|
// src/routes/thank-you/index.tsx
|
|
40
40
|
var LazyThankYouPage = lazy(
|
|
41
|
-
() => import('../ThankYouPage-
|
|
41
|
+
() => import('../ThankYouPage-BD42QNKE.js').then((m) => ({ default: m.ThankYouPage }))
|
|
42
42
|
);
|
|
43
43
|
var ThankYouPage = LazyThankYouPage;
|
|
44
44
|
async function loader(ctx, extend) {
|
package/dist/skeleton.js
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
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-
|
|
2
|
+
export { HomeSkeleton } from './chunk-XKIVS72A.js';
|
|
3
|
+
import './chunk-4UMNQ4EQ.js';
|
|
4
4
|
import './chunk-FZYR4BA2.js';
|
|
5
5
|
import './chunk-556OT3BN.js';
|
|
6
|
-
import './chunk-
|
|
6
|
+
import './chunk-L3U7C2DP.js';
|
|
7
7
|
import './chunk-Y32RHCOH.js';
|
|
8
|
-
import './chunk-
|
|
9
|
-
import './chunk-
|
|
10
|
-
import './chunk-
|
|
11
|
-
import './chunk-
|
|
8
|
+
import './chunk-TJGHOSES.js';
|
|
9
|
+
import './chunk-7XM2TC27.js';
|
|
10
|
+
import './chunk-VQNLXDPQ.js';
|
|
11
|
+
import './chunk-4446UB3M.js';
|
|
12
12
|
import './chunk-2JV6WZ6O.js';
|
|
13
13
|
import './chunk-RV54D2D7.js';
|
|
14
14
|
import './chunk-ZVZGLEZ6.js';
|
|
15
15
|
import './chunk-VVZNW5CB.js';
|
|
16
16
|
import './chunk-5G7NYNX6.js';
|
|
17
17
|
import './chunk-GD26FI4J.js';
|
|
18
|
-
import './chunk-
|
|
18
|
+
import './chunk-65KBXGDT.js';
|
|
19
19
|
import './chunk-6ZMNTJM3.js';
|
|
20
20
|
import './chunk-OUW6WESU.js';
|
|
21
21
|
import './chunk-SAGXF3MU.js';
|
|
@@ -39,7 +39,7 @@ import './chunk-5XDPAKF5.js';
|
|
|
39
39
|
import './chunk-GCPEMNSU.js';
|
|
40
40
|
import './chunk-QGOPTVV5.js';
|
|
41
41
|
import './chunk-TYNZ5B2B.js';
|
|
42
|
-
import './chunk-
|
|
42
|
+
import './chunk-Z3SSHDVW.js';
|
|
43
43
|
import './chunk-AXW67SY7.js';
|
|
44
44
|
import './chunk-BYMOPN2S.js';
|
|
45
45
|
import './chunk-SKLEJJ6M.js';
|