@salla.sa/twilight-theme-engine 1.0.35 → 1.0.37

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.
Files changed (249) hide show
  1. package/dist/{AddToCartForm-PNZBIPJU.js → AddToCartForm-BAXWUVBW.js} +3 -3
  2. package/dist/{AddToCartForm-PNZBIPJU.js.map → AddToCartForm-BAXWUVBW.js.map} +1 -1
  3. package/dist/{BlogAuthorPage-FTVPPHHS.js → BlogAuthorPage-C7ENIUKC.js} +16 -15
  4. package/dist/BlogAuthorPage-C7ENIUKC.js.map +1 -0
  5. package/dist/{BlogCategoryPage-TJFW7DDI.js → BlogCategoryPage-QODJTKFE.js} +16 -15
  6. package/dist/BlogCategoryPage-QODJTKFE.js.map +1 -0
  7. package/dist/{BlogPage-RD4JUGKY.js → BlogPage-N5BKRIWD.js} +14 -13
  8. package/dist/BlogPage-N5BKRIWD.js.map +1 -0
  9. package/dist/{BlogSinglePage-DVZX3WVW.js → BlogSinglePage-HVSCXCCV.js} +14 -13
  10. package/dist/BlogSinglePage-HVSCXCCV.js.map +1 -0
  11. package/dist/{BlogTagPage-UON2ASKW.js → BlogTagPage-YXYYHD5S.js} +16 -15
  12. package/dist/BlogTagPage-YXYYHD5S.js.map +1 -0
  13. package/dist/{BrandsPage-R4KTDEG3.js → BrandsPage-UP3HKHGR.js} +14 -13
  14. package/dist/BrandsPage-UP3HKHGR.js.map +1 -0
  15. package/dist/{Breadcrumb-YNVX6ZXO.js → Breadcrumb-5464BOGG.js} +14 -13
  16. package/dist/Breadcrumb-5464BOGG.js.map +1 -0
  17. package/dist/{CartItem-6P4AB6LQ.js → CartItem-TARZW35A.js} +14 -13
  18. package/dist/CartItem-TARZW35A.js.map +1 -0
  19. package/dist/{CartSummary-A25PNJSY.js → CartSummary-2KSBKQM7.js} +14 -13
  20. package/dist/CartSummary-2KSBKQM7.js.map +1 -0
  21. package/dist/{Copyright-J6O4JUG7.js → Copyright-2D7W6OS4.js} +3 -3
  22. package/dist/{Copyright-J6O4JUG7.js.map → Copyright-2D7W6OS4.js.map} +1 -1
  23. package/dist/{CustomerLayout-JNUTNHBA.js → CustomerLayout-Z3JGXMO7.js} +14 -13
  24. package/dist/CustomerLayout-Z3JGXMO7.js.map +1 -0
  25. package/dist/{Footer-GR7WW7UA.js → Footer-DFZFOH5E.js} +14 -13
  26. package/dist/{Footer-GR7WW7UA.js.map → Footer-DFZFOH5E.js.map} +1 -1
  27. package/dist/{Header-2CTHBDYE.js → Header-CF5TQMWR.js} +6 -6
  28. package/dist/{Header-2CTHBDYE.js.map → Header-CF5TQMWR.js.map} +1 -1
  29. package/dist/{LoyaltyPage-EHRGBXF6.js → LoyaltyPage-TOXOPXEU.js} +15 -14
  30. package/dist/LoyaltyPage-TOXOPXEU.js.map +1 -0
  31. package/dist/{MainMenu-TFUVK4W7.js → MainMenu-6VTPCMMJ.js} +7 -7
  32. package/dist/{MainMenu-TFUVK4W7.js.map → MainMenu-6VTPCMMJ.js.map} +1 -1
  33. package/dist/{MasterLayout-ODH7CFAU.js → MasterLayout-PQ2XGL6A.js} +14 -13
  34. package/dist/{MasterLayout-ODH7CFAU.js.map → MasterLayout-PQ2XGL6A.js.map} +1 -1
  35. package/dist/{MobileMenu-5OJEI2CQ.js → MobileMenu-UWDB2BHQ.js} +15 -14
  36. package/dist/MobileMenu-UWDB2BHQ.js.map +1 -0
  37. package/dist/{NotificationsPage-U4ULROLR.js → NotificationsPage-3WUAFRTU.js} +14 -13
  38. package/dist/NotificationsPage-3WUAFRTU.js.map +1 -0
  39. package/dist/{OrderSinglePage-O2ODTG33.js → OrderSinglePage-T2UE2EJI.js} +15 -14
  40. package/dist/OrderSinglePage-T2UE2EJI.js.map +1 -0
  41. package/dist/{OrdersPage-72RXJGSH.js → OrdersPage-762O24YK.js} +15 -14
  42. package/dist/OrdersPage-762O24YK.js.map +1 -0
  43. package/dist/{PageSingle-7Y4WJAA6.js → PageSingle-Y6IVAY3E.js} +3 -3
  44. package/dist/{PageSingle-7Y4WJAA6.js.map → PageSingle-Y6IVAY3E.js.map} +1 -1
  45. package/dist/{ProductDetails-GYCTNAWE.js → ProductDetails-7G7QOLTB.js} +3 -3
  46. package/dist/{ProductDetails-GYCTNAWE.js.map → ProductDetails-7G7QOLTB.js.map} +1 -1
  47. package/dist/{ProfilePage-GVYL5NVL.js → ProfilePage-H2JWTJJY.js} +14 -13
  48. package/dist/ProfilePage-H2JWTJJY.js.map +1 -0
  49. package/dist/{SeoCartWidget-KHDAMXBG.js → SeoCartWidget-XYWATIV3.js} +14 -13
  50. package/dist/SeoCartWidget-XYWATIV3.js.map +1 -0
  51. package/dist/{SettingsPage-ZCLDJNHY.js → SettingsPage-WQX22FTS.js} +14 -13
  52. package/dist/SettingsPage-WQX22FTS.js.map +1 -0
  53. package/dist/{StoreClosedNotification-6O34WQJV.js → StoreClosedNotification-TL4XY6OS.js} +15 -14
  54. package/dist/{StoreClosedNotification-6O34WQJV.js.map → StoreClosedNotification-TL4XY6OS.js.map} +1 -1
  55. package/dist/{TestimonialsPage-Y3DCS2RB.js → TestimonialsPage-PWVTHBOS.js} +3 -3
  56. package/dist/{TestimonialsPage-Y3DCS2RB.js.map → TestimonialsPage-PWVTHBOS.js.map} +1 -1
  57. package/dist/{ThankYouPage-MPF4V5T3.js → ThankYouPage-C573J2KJ.js} +14 -13
  58. package/dist/ThankYouPage-C573J2KJ.js.map +1 -0
  59. package/dist/{WalletPage-XVEZKUCP.js → WalletPage-7JE6PELL.js} +15 -14
  60. package/dist/WalletPage-7JE6PELL.js.map +1 -0
  61. package/dist/{WishlistPage-MALKVYV4.js → WishlistPage-XTQ6IRG7.js} +15 -14
  62. package/dist/WishlistPage-XTQ6IRG7.js.map +1 -0
  63. package/dist/api/apps.js +4 -4
  64. package/dist/api/brands.js +5 -5
  65. package/dist/api/cart.js +5 -5
  66. package/dist/api/category.js +5 -5
  67. package/dist/api/client.d.ts.map +1 -1
  68. package/dist/api/client.js +3 -3
  69. package/dist/api/home.js +4 -4
  70. package/dist/api/loyalty.js +5 -5
  71. package/dist/api/menu.js +4 -4
  72. package/dist/api/notification.js +4 -4
  73. package/dist/api/order.js +5 -5
  74. package/dist/api/page.js +5 -5
  75. package/dist/api/product.js +5 -5
  76. package/dist/api/profile.js +3 -3
  77. package/dist/api/store.d.ts.map +1 -1
  78. package/dist/api/store.js +4 -4
  79. package/dist/api/translations.js +4 -4
  80. package/dist/api/user.js +4 -4
  81. package/dist/api/wishlist.js +4 -4
  82. package/dist/{chunk-QOK3ANNB.js → chunk-2AGMXJVP.js} +4 -4
  83. package/dist/{chunk-QOK3ANNB.js.map → chunk-2AGMXJVP.js.map} +1 -1
  84. package/dist/{chunk-Z2BE6MDB.js → chunk-2KZORZZN.js} +14 -6
  85. package/dist/chunk-2KZORZZN.js.map +1 -0
  86. package/dist/{chunk-BOOOVZS4.js → chunk-4PLGRQAS.js} +4 -4
  87. package/dist/{chunk-BOOOVZS4.js.map → chunk-4PLGRQAS.js.map} +1 -1
  88. package/dist/{chunk-DLDDKPRN.js → chunk-5FH6E2FQ.js} +16 -20
  89. package/dist/chunk-5FH6E2FQ.js.map +1 -0
  90. package/dist/{chunk-VBXAGCNI.js → chunk-5R5IGGI3.js} +5 -5
  91. package/dist/{chunk-VBXAGCNI.js.map → chunk-5R5IGGI3.js.map} +1 -1
  92. package/dist/{chunk-FQGCCV4T.js → chunk-5TRRUV7N.js} +3 -3
  93. package/dist/{chunk-FQGCCV4T.js.map → chunk-5TRRUV7N.js.map} +1 -1
  94. package/dist/{chunk-Q56S25OH.js → chunk-63WNORBK.js} +6 -6
  95. package/dist/{chunk-Q56S25OH.js.map → chunk-63WNORBK.js.map} +1 -1
  96. package/dist/chunk-6IATCGID.js +7 -0
  97. package/dist/chunk-6IATCGID.js.map +1 -0
  98. package/dist/{chunk-LG556DIE.js → chunk-6KI2QCPL.js} +3 -3
  99. package/dist/{chunk-LG556DIE.js.map → chunk-6KI2QCPL.js.map} +1 -1
  100. package/dist/{chunk-GQ7IBJ55.js → chunk-6MGDRMZM.js} +4 -4
  101. package/dist/{chunk-GQ7IBJ55.js.map → chunk-6MGDRMZM.js.map} +1 -1
  102. package/dist/{chunk-5ACY5CD3.js → chunk-6XWMNQ52.js} +10 -4
  103. package/dist/chunk-6XWMNQ52.js.map +1 -0
  104. package/dist/{chunk-WXOABH6J.js → chunk-AZ5HAIYQ.js} +26 -11
  105. package/dist/chunk-AZ5HAIYQ.js.map +1 -0
  106. package/dist/chunk-BK4VEUF3.js +14 -0
  107. package/dist/{chunk-IN5RFJF2.js.map → chunk-BK4VEUF3.js.map} +1 -1
  108. package/dist/{chunk-L6UGY2OB.js → chunk-BWIESZJK.js} +3 -3
  109. package/dist/{chunk-L6UGY2OB.js.map → chunk-BWIESZJK.js.map} +1 -1
  110. package/dist/{chunk-Z2P4M6T6.js → chunk-CCCKRNO4.js} +3 -3
  111. package/dist/{chunk-Z2P4M6T6.js.map → chunk-CCCKRNO4.js.map} +1 -1
  112. package/dist/{chunk-RQHOAA7U.js → chunk-CZS4ZHQK.js} +3 -3
  113. package/dist/{chunk-RQHOAA7U.js.map → chunk-CZS4ZHQK.js.map} +1 -1
  114. package/dist/{chunk-TXYT42AU.js → chunk-E5EH32L7.js} +3 -3
  115. package/dist/{chunk-TXYT42AU.js.map → chunk-E5EH32L7.js.map} +1 -1
  116. package/dist/{chunk-6EBQ27KE.js → chunk-EFHSAWDQ.js} +23 -15
  117. package/dist/chunk-EFHSAWDQ.js.map +1 -0
  118. package/dist/{chunk-T3I4T3XB.js → chunk-FKOBOGLQ.js} +7 -7
  119. package/dist/{chunk-T3I4T3XB.js.map → chunk-FKOBOGLQ.js.map} +1 -1
  120. package/dist/{chunk-Y5FBDMFV.js → chunk-JBXTU5NM.js} +22 -12
  121. package/dist/chunk-JBXTU5NM.js.map +1 -0
  122. package/dist/{chunk-OOYJHQLQ.js → chunk-KFH3OBFW.js} +4 -4
  123. package/dist/{chunk-OOYJHQLQ.js.map → chunk-KFH3OBFW.js.map} +1 -1
  124. package/dist/{chunk-LXIEAZZJ.js → chunk-KLTQ2UST.js} +3 -3
  125. package/dist/{chunk-LXIEAZZJ.js.map → chunk-KLTQ2UST.js.map} +1 -1
  126. package/dist/{chunk-6JLVUQWD.js → chunk-MCYEMXFY.js} +4 -4
  127. package/dist/{chunk-6JLVUQWD.js.map → chunk-MCYEMXFY.js.map} +1 -1
  128. package/dist/{chunk-C4S4VXWW.js → chunk-ME727LL4.js} +3 -3
  129. package/dist/{chunk-C4S4VXWW.js.map → chunk-ME727LL4.js.map} +1 -1
  130. package/dist/{chunk-NTOIR3NK.js → chunk-NX6BEOXW.js} +4 -4
  131. package/dist/{chunk-NTOIR3NK.js.map → chunk-NX6BEOXW.js.map} +1 -1
  132. package/dist/{chunk-FPQAYFHZ.js → chunk-OGGWNPF3.js} +3 -3
  133. package/dist/{chunk-FPQAYFHZ.js.map → chunk-OGGWNPF3.js.map} +1 -1
  134. package/dist/{chunk-STHBBSK2.js → chunk-QG2Q6HB5.js} +3 -3
  135. package/dist/{chunk-STHBBSK2.js.map → chunk-QG2Q6HB5.js.map} +1 -1
  136. package/dist/{chunk-CBQKQCKI.js → chunk-RBISDOPR.js} +4 -4
  137. package/dist/{chunk-CBQKQCKI.js.map → chunk-RBISDOPR.js.map} +1 -1
  138. package/dist/{chunk-57RYHNW2.js → chunk-RIZOT5FN.js} +3 -3
  139. package/dist/{chunk-57RYHNW2.js.map → chunk-RIZOT5FN.js.map} +1 -1
  140. package/dist/{chunk-47C6C2NN.js → chunk-TMR7TZMB.js} +4 -4
  141. package/dist/{chunk-47C6C2NN.js.map → chunk-TMR7TZMB.js.map} +1 -1
  142. package/dist/{chunk-5IEQLAAY.js → chunk-ULQMJUO2.js} +4 -4
  143. package/dist/{chunk-5IEQLAAY.js.map → chunk-ULQMJUO2.js.map} +1 -1
  144. package/dist/{chunk-6BVPVYLN.js → chunk-VZHYSYKG.js} +4 -4
  145. package/dist/{chunk-6BVPVYLN.js.map → chunk-VZHYSYKG.js.map} +1 -1
  146. package/dist/{chunk-EV4JSMFZ.js → chunk-X26WB7AG.js} +3 -3
  147. package/dist/{chunk-EV4JSMFZ.js.map → chunk-X26WB7AG.js.map} +1 -1
  148. package/dist/{chunk-E3J2RXBS.js → chunk-XLGVT7QF.js} +3 -3
  149. package/dist/{chunk-E3J2RXBS.js.map → chunk-XLGVT7QF.js.map} +1 -1
  150. package/dist/{chunk-XBLA5RFR.js → chunk-XLVAVCUV.js} +5 -5
  151. package/dist/{chunk-XBLA5RFR.js.map → chunk-XLVAVCUV.js.map} +1 -1
  152. package/dist/{chunk-GCAIIFF3.js → chunk-XTOXFAP7.js} +3 -3
  153. package/dist/{chunk-GCAIIFF3.js.map → chunk-XTOXFAP7.js.map} +1 -1
  154. package/dist/{chunk-B4SPJFNB.js → chunk-YOA3UVDE.js} +4 -4
  155. package/dist/{chunk-B4SPJFNB.js.map → chunk-YOA3UVDE.js.map} +1 -1
  156. package/dist/{chunk-HYESKIWZ.js → chunk-ZNWNJZSM.js} +4 -4
  157. package/dist/{chunk-HYESKIWZ.js.map → chunk-ZNWNJZSM.js.map} +1 -1
  158. package/dist/{chunk-MY3ZH5BA.js → chunk-ZZA7L3RI.js} +6 -6
  159. package/dist/{chunk-MY3ZH5BA.js.map → chunk-ZZA7L3RI.js.map} +1 -1
  160. package/dist/components/cart/index.js +1 -1
  161. package/dist/components/common/index.js +1 -1
  162. package/dist/components/drawer/index.js +12 -11
  163. package/dist/components/home/index.js +15 -14
  164. package/dist/components/layout/index.js +5 -5
  165. package/dist/components/product/index.js +13 -12
  166. package/dist/components/store/index.js +14 -13
  167. package/dist/components/store/index.js.map +1 -1
  168. package/dist/document-class-5BBGX5LN.js +24 -0
  169. package/dist/{document-class-BQBALA53.js.map → document-class-5BBGX5LN.js.map} +1 -1
  170. package/dist/hooks/index.js +12 -11
  171. package/dist/hooks/registerDefaultHooks.d.ts.map +1 -1
  172. package/dist/hooks/useGtm.js +12 -11
  173. package/dist/hooks/useMoney.js +12 -11
  174. package/dist/hooks/useStore.js +12 -11
  175. package/dist/hooks/useUser.js +5 -5
  176. package/dist/index.js +12 -11
  177. package/dist/index.js.map +1 -1
  178. package/dist/{navigation-B6TEUWEK.js → navigation-D7QS3NK2.js} +4 -4
  179. package/dist/{navigation-B6TEUWEK.js.map → navigation-D7QS3NK2.js.map} +1 -1
  180. package/dist/{navigation-RYSVWICZ.js → navigation-DQNNT2LY.js} +5 -5
  181. package/dist/{navigation-RYSVWICZ.js.map → navigation-DQNNT2LY.js.map} +1 -1
  182. package/dist/{not-found-OPY73PW5.js → not-found-QM2L2D7P.js} +14 -13
  183. package/dist/not-found-QM2L2D7P.js.map +1 -0
  184. package/dist/providers/index.js +12 -11
  185. package/dist/routes/account/orders.js +6 -6
  186. package/dist/routes/account.js +14 -14
  187. package/dist/routes/blog.js +10 -10
  188. package/dist/routes/brands.js +6 -6
  189. package/dist/routes/cart.js +20 -19
  190. package/dist/routes/cart.js.map +1 -1
  191. package/dist/routes/home.js +17 -16
  192. package/dist/routes/index.js +3 -3
  193. package/dist/routes/loyalty.js +6 -6
  194. package/dist/routes/page.js +6 -6
  195. package/dist/routes/product-listing.js +17 -16
  196. package/dist/routes/product-listing.js.map +1 -1
  197. package/dist/routes/product.js +15 -14
  198. package/dist/routes/product.js.map +1 -1
  199. package/dist/routes/root/head.d.ts.map +1 -1
  200. package/dist/routes/seo-redirects.js +3 -3
  201. package/dist/routes/testimonials.js +2 -2
  202. package/dist/routes/thank-you.js +6 -6
  203. package/dist/skeleton.js +17 -16
  204. package/dist/tanstack/middleware/twilight.d.ts.map +1 -1
  205. package/dist/tanstack.js +17 -15
  206. package/dist/tanstack.js.map +1 -1
  207. package/dist/twilight/context.d.ts +22 -5
  208. package/dist/twilight/context.d.ts.map +1 -1
  209. package/dist/utils/cookies.d.ts +46 -6
  210. package/dist/utils/cookies.d.ts.map +1 -1
  211. package/dist/utils/fast-checkout.d.ts +4 -0
  212. package/dist/utils/fast-checkout.d.ts.map +1 -0
  213. package/dist/utils/index.js +4 -4
  214. package/dist/utils/runtime-env.d.ts +13 -0
  215. package/dist/utils/runtime-env.d.ts.map +1 -1
  216. package/dist/utils/theme-version.d.ts +33 -0
  217. package/dist/utils/theme-version.d.ts.map +1 -0
  218. package/dist/vite/index.js +2 -2
  219. package/package.json +1 -1
  220. package/dist/BlogAuthorPage-FTVPPHHS.js.map +0 -1
  221. package/dist/BlogCategoryPage-TJFW7DDI.js.map +0 -1
  222. package/dist/BlogPage-RD4JUGKY.js.map +0 -1
  223. package/dist/BlogSinglePage-DVZX3WVW.js.map +0 -1
  224. package/dist/BlogTagPage-UON2ASKW.js.map +0 -1
  225. package/dist/BrandsPage-R4KTDEG3.js.map +0 -1
  226. package/dist/Breadcrumb-YNVX6ZXO.js.map +0 -1
  227. package/dist/CartItem-6P4AB6LQ.js.map +0 -1
  228. package/dist/CartSummary-A25PNJSY.js.map +0 -1
  229. package/dist/CustomerLayout-JNUTNHBA.js.map +0 -1
  230. package/dist/LoyaltyPage-EHRGBXF6.js.map +0 -1
  231. package/dist/MobileMenu-5OJEI2CQ.js.map +0 -1
  232. package/dist/NotificationsPage-U4ULROLR.js.map +0 -1
  233. package/dist/OrderSinglePage-O2ODTG33.js.map +0 -1
  234. package/dist/OrdersPage-72RXJGSH.js.map +0 -1
  235. package/dist/ProfilePage-GVYL5NVL.js.map +0 -1
  236. package/dist/SeoCartWidget-KHDAMXBG.js.map +0 -1
  237. package/dist/SettingsPage-ZCLDJNHY.js.map +0 -1
  238. package/dist/ThankYouPage-MPF4V5T3.js.map +0 -1
  239. package/dist/WalletPage-XVEZKUCP.js.map +0 -1
  240. package/dist/WishlistPage-MALKVYV4.js.map +0 -1
  241. package/dist/chunk-5ACY5CD3.js.map +0 -1
  242. package/dist/chunk-6EBQ27KE.js.map +0 -1
  243. package/dist/chunk-DLDDKPRN.js.map +0 -1
  244. package/dist/chunk-IN5RFJF2.js +0 -14
  245. package/dist/chunk-WXOABH6J.js.map +0 -1
  246. package/dist/chunk-Y5FBDMFV.js.map +0 -1
  247. package/dist/chunk-Z2BE6MDB.js.map +0 -1
  248. package/dist/document-class-BQBALA53.js +0 -23
  249. package/dist/not-found-OPY73PW5.js.map +0 -1
package/dist/tanstack.js CHANGED
@@ -1,21 +1,22 @@
1
- import { rootHead } from './chunk-DLDDKPRN.js';
2
- export { tanstackDocumentAdapter as attrs, createRouter, createTwilightRootRoute, useTanstackDocumentAttrs as useAttrs } from './chunk-DLDDKPRN.js';
3
- export { TanStackLinkAdapter, TanStackNavigationProvider, createTanStackLinkAdapter } from './chunk-L6UGY2OB.js';
1
+ import { rootHead } from './chunk-5FH6E2FQ.js';
2
+ export { tanstackDocumentAdapter as attrs, createRouter, createTwilightRootRoute, useTanstackDocumentAttrs as useAttrs } from './chunk-5FH6E2FQ.js';
3
+ export { TanStackLinkAdapter, TanStackNavigationProvider, createTanStackLinkAdapter } from './chunk-BWIESZJK.js';
4
4
  import './chunk-Z4Y55HWX.js';
5
- export { tanstackHeadAdapter as head, withHead } from './chunk-FQGCCV4T.js';
6
- import './chunk-EV4JSMFZ.js';
5
+ export { tanstackHeadAdapter as head, withHead } from './chunk-5TRRUV7N.js';
6
+ import './chunk-X26WB7AG.js';
7
7
  import './chunk-B3EFOE57.js';
8
- import './chunk-Z2BE6MDB.js';
9
- import './chunk-GCAIIFF3.js';
8
+ import './chunk-2KZORZZN.js';
9
+ import './chunk-XTOXFAP7.js';
10
10
  import './chunk-TZ3E5BN4.js';
11
- import './chunk-TXYT42AU.js';
12
- import './chunk-LG556DIE.js';
13
- import './chunk-E3J2RXBS.js';
11
+ import './chunk-6IATCGID.js';
12
+ import './chunk-E5EH32L7.js';
13
+ import './chunk-6KI2QCPL.js';
14
+ import './chunk-XLGVT7QF.js';
14
15
  import './chunk-MTONGOJD.js';
15
- import './chunk-WXOABH6J.js';
16
- import { AUTH_TOKEN_COOKIE_NAME, extractTokenFromCookies, extractScopeFromCookies, resolveRequestStoreId } from './chunk-Y5FBDMFV.js';
17
- import { runWithTwilightContext } from './chunk-5ACY5CD3.js';
18
- export { getTwilightContext, runWithTwilightContext, updateTwilightContext } from './chunk-5ACY5CD3.js';
16
+ import './chunk-AZ5HAIYQ.js';
17
+ import { AUTH_TOKEN_COOKIE_NAME, extractTokenFromCookies, extractScopeFromCookies, resolveRequestStoreId, resolveRequestVersionId } from './chunk-JBXTU5NM.js';
18
+ import { runWithTwilightContext } from './chunk-6XWMNQ52.js';
19
+ export { getTwilightContext, runWithTwilightContext, updateTwilightContext } from './chunk-6XWMNQ52.js';
19
20
  import './chunk-JWXJPJBO.js';
20
21
  export { mergeDocumentDescriptors as mergeAttrs } from './chunk-CW625T2E.js';
21
22
  import './chunk-TYNZ5B2B.js';
@@ -45,8 +46,9 @@ var twilightMiddleware = (options) => {
45
46
  const scope = extractScopeFromCookies(cookieHeader);
46
47
  const requestHost = requestHostOf(request);
47
48
  const storeId = resolveRequestStoreId(request.url, cookieHeader, requestHost);
49
+ const versionId = resolveRequestVersionId(request.url, cookieHeader, requestHost);
48
50
  return runWithTwilightContext(
49
- { authToken, scope, storeId, requestHost },
51
+ { authToken, scope, storeId, versionId, requestHost },
50
52
  () => next({ context: { authToken } })
51
53
  );
52
54
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/request-host.ts","../src/tanstack/middleware/twilight.ts","../src/tanstack/middleware/earlyHints.ts"],"names":["createMiddleware"],"mappings":"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","file":"tanstack.js","sourcesContent":["/**\n * What the request itself is enough to describe: its host.\n *\n * Small, and deliberately its own module rather than a helper inside the\n * middleware. This value decides two things — which store a live storefront is,\n * and whether the request is allowed to name a store at all — so it is worth\n * testing directly instead of only through the wiring that calls it.\n */\n\n/** The part of a `Request` this needs, so a test does not have to build a whole one. */\nexport interface HostSource {\n url: string;\n headers: { get(name: string): string | null };\n}\n\n/**\n * The host this request arrived on, with its port when it has one.\n *\n * Taken from the request URL, which in a Worker is the address the platform\n * actually routed on, and from the `Host` header only when that fails.\n *\n * **`X-Forwarded-Host` is deliberately not consulted.** A client can set it, and\n * this value gates `allowsRequestStoreId` — so honouring it would be a way to\n * talk a merchant's own domain into behaving like the preview host, and from\n * there into serving a stranger's shop. The dispatcher strips that header today;\n * a theme must not be one edit to another repository's allowlist away from a\n * spoofable identity.\n */\nexport function requestHostOf(request: HostSource): string | null {\n try {\n const fromUrl = new URL(request.url).host;\n if (fromUrl) return fromUrl;\n } catch {\n /* an unparseable URL falls through to the header */\n }\n\n return request.headers.get('Host')?.trim() || null;\n}\n","import type { AnyRequestMiddleware } from '@tanstack/react-start';\nimport { createMiddleware } from '@tanstack/react-start';\nimport {\n extractTokenFromCookies,\n extractScopeFromCookies,\n resolveRequestStoreId,\n AUTH_TOKEN_COOKIE_NAME,\n} from '../../utils/cookies';\nimport { runWithTwilightContext } from '../../twilight/context';\nimport { requestHostOf } from '../../utils/request-host';\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(({ request, next }) => {\n const cookieHeader = request.headers.get('Cookie');\n const authToken = extractTokenFromCookies(cookieHeader, cookieName);\n const scope = extractScopeFromCookies(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 const storeId = resolveRequestStoreId(request.url, cookieHeader, requestHost);\n\n return runWithTwilightContext({ authToken, scope, storeId, requestHost }, () =>\n next({ context: { authToken } })\n );\n });\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: 'modulepreload', href: 'https://cdn.assets.salla.network/static/lit/3.3.3/lit.js' },\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/utils/request-host.ts","../src/tanstack/middleware/twilight.ts","../src/tanstack/middleware/earlyHints.ts"],"names":["createMiddleware"],"mappings":"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","file":"tanstack.js","sourcesContent":["/**\n * What the request itself is enough to describe: its host.\n *\n * Small, and deliberately its own module rather than a helper inside the\n * middleware. This value decides two things — which store a live storefront is,\n * and whether the request is allowed to name a store at all — so it is worth\n * testing directly instead of only through the wiring that calls it.\n */\n\n/** The part of a `Request` this needs, so a test does not have to build a whole one. */\nexport interface HostSource {\n url: string;\n headers: { get(name: string): string | null };\n}\n\n/**\n * The host this request arrived on, with its port when it has one.\n *\n * Taken from the request URL, which in a Worker is the address the platform\n * actually routed on, and from the `Host` header only when that fails.\n *\n * **`X-Forwarded-Host` is deliberately not consulted.** A client can set it, and\n * this value gates `allowsRequestStoreId` — so honouring it would be a way to\n * talk a merchant's own domain into behaving like the preview host, and from\n * there into serving a stranger's shop. The dispatcher strips that header today;\n * a theme must not be one edit to another repository's allowlist away from a\n * spoofable identity.\n */\nexport function requestHostOf(request: HostSource): string | null {\n try {\n const fromUrl = new URL(request.url).host;\n if (fromUrl) return fromUrl;\n } catch {\n /* an unparseable URL falls through to the header */\n }\n\n return request.headers.get('Host')?.trim() || null;\n}\n","import type { AnyRequestMiddleware } from '@tanstack/react-start';\nimport { createMiddleware } from '@tanstack/react-start';\nimport {\n extractTokenFromCookies,\n extractScopeFromCookies,\n resolveRequestStoreId,\n resolveRequestVersionId,\n AUTH_TOKEN_COOKIE_NAME,\n} from '../../utils/cookies';\nimport { runWithTwilightContext } from '../../twilight/context';\nimport { requestHostOf } from '../../utils/request-host';\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(({ request, next }) => {\n const cookieHeader = request.headers.get('Cookie');\n const authToken = extractTokenFromCookies(cookieHeader, cookieName);\n const scope = extractScopeFromCookies(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 const storeId = resolveRequestStoreId(request.url, cookieHeader, requestHost);\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\n return runWithTwilightContext({ authToken, scope, storeId, versionId, requestHost }, () =>\n next({ context: { authToken } })\n );\n });\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: 'modulepreload', href: 'https://cdn.assets.salla.network/static/lit/3.3.3/lit.js' },\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"]}
@@ -49,6 +49,16 @@ export interface TwilightContext {
49
49
  * nothing to carry. See {@link resolveRequestStoreId}.
50
50
  */
51
51
  storeId: string | null;
52
+ /**
53
+ * Which version of the theme's settings this request asked for — the
54
+ * `?versionId=` an editor preview or a local dev session was opened with, or
55
+ * the cookie remembering it.
56
+ *
57
+ * Null on an ordinary storefront visit, which is the common case: nothing
58
+ * named a version, so the store's live one is what the API answers with. See
59
+ * {@link resolveRequestVersionId}.
60
+ */
61
+ versionId: string | null;
52
62
  /**
53
63
  * The host this request arrived on, captured server-side.
54
64
  *
@@ -81,18 +91,25 @@ export declare function updateTwilightContext(partial: Partial<TwilightContext>)
81
91
  * calls outside `runWithTwilightContext`).
82
92
  */
83
93
  export declare function hasTwilightSettings(): boolean;
94
+ /** What a request addressed, as opposed to what it is. */
95
+ export interface RequestAddressing {
96
+ storeId: string | null;
97
+ versionId: string | null;
98
+ requestHost: string | null;
99
+ }
84
100
  /**
85
- * The store this request names and the host it arrived on, without throwing.
101
+ * What this request named and the host it arrived on, without throwing.
86
102
  *
87
103
  * Separate from {@link getTwilightContext} because store identity is read while
88
104
  * deciding *what to fetch* — before there is a context worth having — and on the
89
105
  * server outside a request the getter throws. A caller asking "which store?" has
90
106
  * a sane answer for "none named"; it has none for an exception.
107
+ *
108
+ * The version rides along rather than getting an accessor of its own: it is read
109
+ * at the same moment, for the same reason, and by the same callers, and a second
110
+ * copy of this try/catch would be a second thing to remember to widen.
91
111
  */
92
- export declare function getRequestStore(): {
93
- storeId: string | null;
94
- requestHost: string | null;
95
- };
112
+ export declare function getRequestStore(): RequestAddressing;
96
113
  export declare function getTwilightContext(): TwilightContext;
97
114
  /** @internal Reset store for testing */
98
115
  export declare function resetForTesting(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/twilight/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAK3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAMpD,MAAM,WAAW,gBAAgB,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACjE,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACnE,WAAW,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC/C;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,WAAW,CAAC;IACzB,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;;;;OAIG;IACH,KAAK,EAAE,WAAW,GAAG,IAAI,CAAC;IAC1B,8DAA8D;IAC9D,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB;;;;;;OAMG;IACH,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB;;;;;;OAMG;IACH,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,IAAI,EAAE,IAAI,CAAC;IACX,GAAG,EAAE,KAAK,GAAG,KAAK,CAAC;IACnB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB;qGACiG;IACjG,YAAY,CAAC,EAAE,UAAU,EAAE,CAAC;IAC5B;oGACgG;IAChG,YAAY,CAAC,EAAE,WAAW,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAiHD,wBAAgB,sBAAsB,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAQ3F;AAMD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAKlE;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,IAAI,CAM7E;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAM7C;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,IAAI;IAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAOxF;AAED,wBAAgB,kBAAkB,IAAI,eAAe,CA0DpD;AAED,wCAAwC;AACxC,wBAAgB,eAAe,IAAI,IAAI,CAEtC"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/twilight/context.ts"],"names":[],"mappings":"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"}
@@ -22,16 +22,36 @@ export declare const STORE_ID_COOKIE_NAME = "salla_sid";
22
22
  /** Query parameter naming the store, on a host that serves more than one. */
23
23
  export declare const STORE_ID_PARAM = "storeId";
24
24
  /**
25
- * A store id is an integer, and anything else is not a store id.
25
+ * Which version of the theme's settings to render.
26
26
  *
27
- * Validated rather than passed through because this value ends up in an upstream
28
- * API path. Leading zeroes, signs, decimals and whitespace are all rejected: the
29
- * point is a single canonical form, not the widest set of things that could be
30
- * coerced into a number.
27
+ * A merchant's theme settings are versioned, and the storefront normally shows
28
+ * whichever version is live — the API answers with it, and names it back as
29
+ * `theme.profile.id`. Two places need a different one: the merchant's own theme
30
+ * editor, which previews a draft version before it is published, and a partner
31
+ * running a theme locally against a store whose settings they are editing. Both
32
+ * open the theme inside an iframe, and the version travels in that URL.
33
+ *
34
+ * Named `versionId` rather than the `version_id` the Dashboard uses internally,
35
+ * because it sits beside `?storeId=` and one URL should not spell two ids two
36
+ * ways. The value is the same one either way: the Optimus-encoded version id,
37
+ * which is exactly what `s-version-id` has always carried.
38
+ *
39
+ * The literal is a contract with `VERSION_COOKIE` in store-front-dispacher
40
+ * (`src/dispatch/preview.ts`), on the same terms as {@link STORE_ID_COOKIE_NAME}:
41
+ * nothing checks the two agree, and drift shows a merchant the wrong version of
42
+ * their own settings rather than failing.
31
43
  */
44
+ export declare const VERSION_ID_COOKIE_NAME = "salla_vid";
45
+ /** Query parameter naming the theme-settings version, where one may be named. */
46
+ export declare const VERSION_ID_PARAM = "versionId";
47
+ /** A store id in its canonical form, or null when it is not one. */
32
48
  export declare function parseStoreId(raw: string | null | undefined): string | null;
49
+ /** A theme-settings version id in its canonical form, or null when it is not one. */
50
+ export declare function parseVersionId(raw: string | null | undefined): string | null;
33
51
  /** The store id the dispatcher left in the cookie, or null when absent or malformed. */
34
52
  export declare function extractStoreIdFromCookies(cookieHeader: string | null): string | null;
53
+ /** The version id the dispatcher left in the cookie, or null when absent or malformed. */
54
+ export declare function extractVersionIdFromCookies(cookieHeader: string | null): string | null;
35
55
  /**
36
56
  * The only hosts on which a request may name its own store.
37
57
  *
@@ -59,6 +79,14 @@ export declare const STORE_ID_HOSTS: readonly string[];
59
79
  * a rule like "anything ending in salla.design" is one wildcard DNS record away
60
80
  * from admitting a host nobody meant to admit, and the list of hosts that serve
61
81
  * more than one store is short and known.
82
+ *
83
+ * It gates {@link resolveRequestVersionId} as well, and the name has been left
84
+ * alone rather than generalised because one predicate that both call is the
85
+ * property worth keeping — a second, subtly different list is how a host ends up
86
+ * permitted to name one thing and not the other. A version is worth gating for
87
+ * the same reason a store is: on a merchant's own domain, honouring
88
+ * `?versionId=` would publish whatever draft settings they are still working on
89
+ * to anyone who guessed the URL.
62
90
  */
63
91
  export declare function allowsRequestStoreId(host: string | null | undefined): boolean;
64
92
  /**
@@ -75,7 +103,7 @@ export declare function hostIdentifiesStore(host: string | null | undefined): bo
75
103
  /**
76
104
  * The store this request names, on a host permitted to name one.
77
105
  *
78
- * The host check is inside this function rather than at its call site, because a
106
+ * The host check is inside the resolution rather than at a call site, because a
79
107
  * call site is a thing someone can add without reading this comment. There is no
80
108
  * way to ask "what store did the request name?" without also asking "is this a
81
109
  * host that may say?" — get it wrong and the answer is a security bug that looks
@@ -87,6 +115,18 @@ export declare function hostIdentifiesStore(host: string | null | undefined): bo
87
115
  * just typed.
88
116
  */
89
117
  export declare function resolveRequestStoreId(url: string, cookieHeader: string | null, host: string | null | undefined): string | null;
118
+ /**
119
+ * The theme-settings version this request names, on a host permitted to name one.
120
+ *
121
+ * Same shape and the same host gate as {@link resolveRequestStoreId}, deliberately:
122
+ * both answer "what did this request ask to be shown?", both are reached only on
123
+ * a host that serves more than one thing, and a version that could be named where
124
+ * a store could not would be a second rule to keep in step with the first.
125
+ *
126
+ * Null is the ordinary answer, and it is not a failure — it means nothing
127
+ * addressed a version, so the store's own live one is what gets rendered.
128
+ */
129
+ export declare function resolveRequestVersionId(url: string, cookieHeader: string | null, host: string | null | undefined): string | null;
90
130
  /**
91
131
  * Deletes the auth `token` cookie. This cookie is written client-side by the theme
92
132
  * (TwilightProvider), not by the SDK — `salla.cookie.clearAll()` only clears its own
@@ -1 +1 @@
1
- {"version":3,"file":"cookies.d.ts","sourceRoot":"","sources":["../../src/utils/cookies.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,sBAAsB,UAAU,CAAC;AAC9C,eAAO,MAAM,iBAAiB,UAAU,CAAC;AAEzC;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,oBAAoB,cAAc,CAAC;AAEhD,6EAA6E;AAC7E,eAAO,MAAM,cAAc,YAAY,CAAC;AAExC;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAG1E;AAED,wFAAwF;AACxF,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAEpF;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,cAAc,EAAE,SAAS,MAAM,EAA6B,CAAC;AAoB1E;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAI7E;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAE5E;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,MAAM,GAAG,IAAI,EAC3B,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC9B,MAAM,GAAG,IAAI,CAUf;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAG3C;AAED,wBAAgB,uBAAuB,CACrC,YAAY,EAAE,MAAM,GAAG,IAAI,EAC3B,UAAU,EAAE,MAAM,GACjB,MAAM,GAAG,IAAI,CA2Bf;AAED;;;;;;GAMG;AACH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAeD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,WAAW,GAAG,IAAI,CAQvF;AAED,yDAAyD;AACzD,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAEpF;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,IAAI,WAAW,GAAG,IAAI,GAAG,SAAS,CAI7D;AAED,oFAAoF;AACpF,wBAAgB,cAAc,IAAI,MAAM,GAAG,IAAI,GAAG,SAAS,CAG1D;AAQD;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,GAAG,OAAO,CAYnE;AAED;;;;GAIG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAGzC"}
1
+ {"version":3,"file":"cookies.d.ts","sourceRoot":"","sources":["../../src/utils/cookies.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,sBAAsB,UAAU,CAAC;AAC9C,eAAO,MAAM,iBAAiB,UAAU,CAAC;AAEzC;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,oBAAoB,cAAc,CAAC;AAEhD,6EAA6E;AAC7E,eAAO,MAAM,cAAc,YAAY,CAAC;AAExC;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,sBAAsB,cAAc,CAAC;AAElD,iFAAiF;AACjF,eAAO,MAAM,gBAAgB,cAAc,CAAC;AAmB5C,oEAAoE;AACpE,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAE1E;AAED,qFAAqF;AACrF,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAE5E;AAED,wFAAwF;AACxF,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAEpF;AAED,0FAA0F;AAC1F,wBAAgB,2BAA2B,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAEtF;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,cAAc,EAAE,SAAS,MAAM,EAA6B,CAAC;AAoB1E;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAI7E;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAE5E;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,MAAM,GAAG,IAAI,EAC3B,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC9B,MAAM,GAAG,IAAI,CAEf;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,MAAM,GAAG,IAAI,EAC3B,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC9B,MAAM,GAAG,IAAI,CAEf;AA2BD;;;;GAIG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAG3C;AAED,wBAAgB,uBAAuB,CACrC,YAAY,EAAE,MAAM,GAAG,IAAI,EAC3B,UAAU,EAAE,MAAM,GACjB,MAAM,GAAG,IAAI,CA2Bf;AAED;;;;;;GAMG;AACH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAeD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,WAAW,GAAG,IAAI,CAQvF;AAED,yDAAyD;AACzD,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAEpF;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,IAAI,WAAW,GAAG,IAAI,GAAG,SAAS,CAI7D;AAED,oFAAoF;AACpF,wBAAgB,cAAc,IAAI,MAAM,GAAG,IAAI,GAAG,SAAS,CAG1D;AAQD;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,GAAG,OAAO,CAYnE;AAED;;;;GAIG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAGzC"}
@@ -0,0 +1,4 @@
1
+ /** `salla-add-product-button` only renders its quick-buy widget when a script with this id exists. */
2
+ export declare const FAST_CHECKOUT_SCRIPT_ID = "fast-checkout-js";
3
+ export declare const FAST_CHECKOUT_SCRIPT_URL = "https://cdn.assets.salla.network/mini-checkout/widget/widget.esm.js?v=0.0.9";
4
+ //# sourceMappingURL=fast-checkout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fast-checkout.d.ts","sourceRoot":"","sources":["../../src/utils/fast-checkout.ts"],"names":[],"mappings":"AAAA,sGAAsG;AACtG,eAAO,MAAM,uBAAuB,qBAAqB,CAAC;AAC1D,eAAO,MAAM,wBAAwB,gFAC0C,CAAC"}
@@ -1,13 +1,13 @@
1
1
  export { formatSallaPlural } from '../chunk-BT6HEEAP.js';
2
2
  export { stripUnsafeHtml } from '../chunk-RUHSV4Z6.js';
3
- export { dispatchRouteChanged } from '../chunk-EV4JSMFZ.js';
3
+ export { dispatchRouteChanged } from '../chunk-X26WB7AG.js';
4
4
  export { mergeHead, resolveHead, setHeadAdapter } from '../chunk-B3EFOE57.js';
5
5
  export { sortOptions } from '../chunk-6Z4MOC4S.js';
6
6
  export { buildBaseHead, buildHreflangAlternates, localeToOgLocale } from '../chunk-TZ3E5BN4.js';
7
7
  export { color } from '../chunk-VVZNW5CB.js';
8
- export { applyAppScopeMocks, registerThemeHookSlots } from '../chunk-LG556DIE.js';
9
- export { AUTH_TOKEN_COOKIE_NAME, clearAuthTokenCookie, extractTokenFromCookies, getSallaSDK, getStoreIdentifier } from '../chunk-Y5FBDMFV.js';
10
- import '../chunk-5ACY5CD3.js';
8
+ export { applyAppScopeMocks, registerThemeHookSlots } from '../chunk-6KI2QCPL.js';
9
+ export { AUTH_TOKEN_COOKIE_NAME, clearAuthTokenCookie, extractTokenFromCookies, getSallaSDK, getStoreIdentifier } from '../chunk-JBXTU5NM.js';
10
+ import '../chunk-6XWMNQ52.js';
11
11
  export { asset, cdn, isPlaceholder } from '../chunk-ZCH7W7DZ.js';
12
12
  export { mergeDocumentDescriptors, mergeElementAttrs, normalizeClasses, syncAttrsToElement, toReactProps } from '../chunk-CW625T2E.js';
13
13
  import '../chunk-T72DAX7R.js';
@@ -4,6 +4,19 @@ export interface RuntimeEnv {
4
4
  apiBase?: string;
5
5
  /** Store identifier — `VITE_STORE_DOMAIN`. */
6
6
  storeIdentifier?: string;
7
+ /**
8
+ * The theme-settings version the request named, if any.
9
+ *
10
+ * Published for the same reason `storeIdentifier` is: the dispatcher strips
11
+ * `?versionId=` on the way in, so by the time the browser has the page its own
12
+ * URL no longer says which version it is showing. Without this the hydrated
13
+ * client would ask the API about the store's live version and quietly replace
14
+ * the draft it was handed.
15
+ *
16
+ * Absent — not empty — when nothing named one, so it drops out of the inline
17
+ * script entirely rather than publishing a value that means "live".
18
+ */
19
+ versionId?: string;
7
20
  }
8
21
  /**
9
22
  * A build-time `import.meta.env` var, falling back to the worker's runtime `process.env`
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-env.d.ts","sourceRoot":"","sources":["../../src/utils/runtime-env.ts"],"names":[],"mappings":"AAOA,qFAAqF;AACrF,MAAM,WAAW,UAAU;IACzB,uCAAuC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8CAA8C;IAC9C,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;GAGG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAUvD;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,IAAI,UAAU,CAgB9C;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,IAAI,UAAU,CAGlD;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,GAAE,UAAgC,GAAG,MAAM,GAAG,IAAI,CAK3F"}
1
+ {"version":3,"file":"runtime-env.d.ts","sourceRoot":"","sources":["../../src/utils/runtime-env.ts"],"names":[],"mappings":"AAOA,qFAAqF;AACrF,MAAM,WAAW,UAAU;IACzB,uCAAuC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8CAA8C;IAC9C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;;;;;;;;OAWG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAUvD;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,IAAI,UAAU,CAqB9C;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,IAAI,UAAU,CAGlD;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,GAAE,UAAgC,GAAG,MAAM,GAAG,IAAI,CAK3F"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * The version this request asked for, or null when it asked for none.
3
+ *
4
+ * Deliberately excludes the version the *settings* name. This is the answer to
5
+ * "what did the caller address?", and it has to be available before any settings
6
+ * exist — React Query keys are built from it, and a key that means one thing
7
+ * during SSR and another after hydration is how a page refetches everything it
8
+ * was just handed.
9
+ *
10
+ * 1. what the request named, seeded by `twilightMiddleware` on a host permitted
11
+ * to name one;
12
+ * 2. what SSR resolved and published into the head, which is all the browser has
13
+ * once the dispatcher has stripped `?versionId=` from the URL.
14
+ */
15
+ export declare function requestedThemeVersionId(): string | null;
16
+ /**
17
+ * The version every Salla API call is answered with — what goes in `s-version-id`.
18
+ *
19
+ * The requested version outranks the settings, because a request that named one
20
+ * is the only reason this is ever anything but the live version: falling back to
21
+ * the settings there would let the first answer overwrite the question.
22
+ *
23
+ * The settings' own `theme.profile.id` stays as the fallback, unchanged. It is
24
+ * what this header has always carried, and on an ordinary storefront it still
25
+ * is — it keeps the rest of a page's calls pinned to the version the settings
26
+ * call resolved, rather than letting a version go live mid-render.
27
+ *
28
+ * Reading the settings is guarded because `getTwilightContext().settings` throws
29
+ * a `SettingsError` when they have not loaded — which is the normal state on the
30
+ * very first call, the settings call itself.
31
+ */
32
+ export declare function resolveThemeVersionId(): string | null;
33
+ //# sourceMappingURL=theme-version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme-version.d.ts","sourceRoot":"","sources":["../../src/utils/theme-version.ts"],"names":[],"mappings":"AAsBA;;;;;;;;;;;;;GAaG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,GAAG,IAAI,CAKvD;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,GAAG,IAAI,CAUrD"}
@@ -1,8 +1,8 @@
1
- import { tanstackHeadAdapter } from '../chunk-FQGCCV4T.js';
1
+ import { tanstackHeadAdapter } from '../chunk-5TRRUV7N.js';
2
2
  import { nextjsHeadAdapter } from '../chunk-HOSHJBPS.js';
3
3
  import { setHeadAdapter } from '../chunk-B3EFOE57.js';
4
4
  import { RouteId } from '../chunk-MTONGOJD.js';
5
- import '../chunk-5ACY5CD3.js';
5
+ import '../chunk-6XWMNQ52.js';
6
6
  import '../chunk-T72DAX7R.js';
7
7
  import '../chunk-DGUM43GV.js';
8
8
  import { readFile, readdir } from 'fs/promises';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@salla.sa/twilight-theme-engine",
3
- "version": "1.0.35",
3
+ "version": "1.0.37",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/routes/blog/BlogAuthorPage.tsx"],"names":[],"mappings":"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","file":"BlogAuthorPage-FTVPPHHS.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: author.name, cursor: cursorValue });\n nextCursorRef.current = result.cursor?.next ?? null;\n\n return {\n items: result.data,\n next: result.cursor?.next ?? null,\n };\n }, [author.name]);\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_articles.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_articles.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-TJFW7DDI.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_articles.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_articles.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"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/routes/blog/BlogPage.tsx"],"names":[],"mappings":"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","file":"BlogPage-RD4JUGKY.js","sourcesContent":["import { SallaSlider } from '@salla.sa/twilight-components-react/slider';\nimport { HookSlot, useDate } from '../../hooks';\nimport { useTranslation } from '../../providers/I18nProvider';\nimport type { BlogPageProps, ArticleSummary } from './types';\nimport { Breadcrumb, NoContent, Link, Image } from '../../components/common';\n\nconst EMPTY_CATEGORIES: NonNullable<BlogPageProps['categories']> = [];\nconst EMPTY_ARTICLES: ArticleSummary[] = [];\nconst EMPTY_SLIDES: NonNullable<BlogPageProps['slides']> = [];\n\nexport function BlogPage({\n page,\n categories = EMPTY_CATEGORIES,\n articles = EMPTY_ARTICLES,\n slides = EMPTY_SLIDES,\n}: BlogPageProps) {\n const { t } = useTranslation();\n const { format: formatDate } = useDate();\n\n return (\n <div className=\"container mb-8 sm:mb-24\">\n <div className=\"center-between\">\n <Breadcrumb page={page} />\n </div>\n\n <div className=\"grid grid-cols-1 lg:grid-cols-8 gap-8\">\n <nav aria-label=\"Sidebar\" className=\"hidden lg:block lg:sticky shrink-0 top-24 col-span-2\">\n <h2 className=\"font-bold mb-3\">{t('pages.blog_categories.categories')}</h2>\n <ul>\n {categories.map((category) => (\n <li key={category.id} className={category.is_current ? 'text-primary' : ''}>\n <Link className=\"py-3 block text-sm hover:text-primary\" to={category.url}>\n {category.name}\n </Link>\n </li>\n ))}\n </ul>\n </nav>\n\n <div className=\"main-content lg:col-span-6\">\n <HookSlot name=\"blog:start\" />\n\n {slides.length > 0 && (\n <SallaSlider\n id=\"blog-home-slider\"\n type=\"blog\"\n autoPlay\n autoHeight\n showControls={false}\n pagination\n className=\"blog-slider block rounded overflow-hidden mb-2.5 lg:mb-8\"\n sliderConfig={{ watchOverflow: true }}\n >\n <div slot=\"items\">\n {slides.map((article, index) => (\n <div\n key={article.id}\n className=\"swiper-slide has-overlay blog-slider__slide h-[300px] md:h-[400px] relative bg-border-color flex justify-center\"\n >\n <Image\n className=\"object-cover h-full w-full\"\n src={article.image}\n alt={article.name}\n aspectRatio=\"3/1\"\n priority={index === 0}\n />\n <div className=\"absolute z-10 bottom-0 rtl:right-0 ltr:left-0 p-4 pb-10 rtl:lg:pr-10 ltr:lg:pl-10 lg:pb-20\">\n <div className=\"blog-slider__content relative\">\n <div className=\"z-20 w-full md:w-5/6 lg:w-6/12 text-white\">\n <div className=\"block-slide-anime\">\n <div className=\"mb-2.5 rounded-md inline-flex text-sm rtl:space-x-reverse space-x-5\">\n <div className=\"flex items-center\">\n <i className=\"sicon-calendar-date rtl:ml-1 ltr:mr-1\"></i>\n <span className=\"whitespace-nowrap\">\n {formatDate(article.created_at)}\n </span>\n </div>\n <Link\n to={article.author?.url || '#'}\n className=\"flex items-center hover:underline\"\n >\n <i className=\"sicon-user rtl:ml-1 ltr:mr-1\"></i>\n <span className=\"whitespace-nowrap\">{article.author?.name}</span>\n </Link>\n </div>\n <h3 className=\"text-sm font-bold leading-normal mb-4\">\n <Link to={article.url}>{article.name}</Link>\n </h3>\n </div>\n <p className=\"line-clamp-2 block-slide-anime description\">\n {article.description}\n </p>\n </div>\n </div>\n </div>\n </div>\n ))}\n </div>\n </SallaSlider>\n )}\n\n {!slides.length && (\n <div className=\"sr-only lg:not-sr-only\">\n <h1 className=\"blog-category__title font-bold text-lg mb-8\">\n {t('blocks.footer.blog')}\n </h1>\n </div>\n )}\n\n {slides.length > 0 && <h1 className=\"sr-only\">{t('blocks.footer.blog')}</h1>}\n\n {articles.length > 0 ? (\n <>\n <HookSlot name=\"blog:items.start\" />\n <div className=\"grid md:grid-cols-2 gap-2.5 md:gap-8\">\n {articles.map((article) => (\n <div\n key={article.id}\n className=\"list-block post-entry relative h-full transition-shadow duration-500 bg-white hover:shadow-default rounded-lg justify-around overflow-hidden flex flex-col\"\n >\n <Link\n to={article.url}\n className=\"post-entry__image relative overflow-hidden hover:opacity-90 w-full h-56 bg-border-color flex items-center justify-center\"\n >\n <Image\n className=\"h-full w-full object-cover\"\n src={article.image}\n alt={article.name}\n aspectRatio=\"16/9\"\n />\n </Link>\n\n <div className=\"flex-1 px-5 pt-5 pb-7\">\n <div className=\"mb-2.5 text-gray-500 rounded-md inline-flex text-sm rtl:space-x-reverse space-x-5\">\n <div className=\"flex items-center\">\n <i className=\"sicon-calendar-date rtl:ml-1 ltr:mr-1\"></i>\n <span>{formatDate(article.created_at)}</span>\n </div>\n <Link\n to={article.author?.url || '#'}\n className=\"flex items-center hover:text-dark\"\n >\n <i className=\"sicon-user rtl:ml-1 ltr:mr-1\"></i>\n <span>{article.author?.name}</span>\n </Link>\n </div>\n\n <h3 className=\"post-entry__title text-sm font-bold text-gray-800 leading-6 mb-2.5\">\n <Link to={article.url}>{article.name}</Link>\n </h3>\n <p className=\"text-sm text-gray-500 leading-6 mb-2.5\">\n {article.description}\n </p>\n\n {((article.stats?.likes ?? 0) > 0 || (article.stats?.comments ?? 0) > 0) && (\n <div className=\"post-entry__icons flex items-center gap-2.5 text-gray-500 text-sm\">\n {(article.stats?.likes ?? 0) > 0 && (\n <div className=\"flex items-center gap-1\">\n <i className=\"sicon-thumbs-up\"></i>\n {article.stats?.likes}\n </div>\n )}\n {(article.stats?.comments ?? 0) > 0 && (\n <div className=\"flex items-center gap-1\">\n <i className=\"sicon-chat\"></i>\n {article.stats?.comments}\n </div>\n )}\n </div>\n )}\n </div>\n\n {article.tags && article.tags.length > 0 && (\n <div className=\"p-4 flex flex-wrap items-center border-t border-gray-200\">\n {article.tags.map((tag) => (\n <Link\n key={tag.id}\n to={tag.url}\n className=\"py-2 px-4 rounded-large inline-flex items-center text-gray-500 hover:text-dark justify-center text-sm\"\n >\n <i className=\"font-medium sicon-tag rtl:ml-1.5 ltr:mr-1.5\"></i>\n <span className=\"fix-align whitespace-nowrap\">{tag.name}</span>\n </Link>\n ))}\n </div>\n )}\n </div>\n ))}\n </div>\n <HookSlot name=\"blog:items.end\" />\n </>\n ) : (\n !slides.length && (\n <NoContent icon=\"sicon-inbox\" message={t('pages.blog_articles.no_articles')} />\n )\n )}\n\n <HookSlot name=\"blog:end\" />\n </div>\n </div>\n </div>\n );\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/routes/blog/BlogSinglePage.tsx"],"names":[],"mappings":"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","file":"BlogSinglePage-DVZX3WVW.js","sourcesContent":["import { SallaComments } from '@salla.sa/twilight-components-react/comments';\nimport { HookSlot, useAsset, useDate } from '../../hooks';\nimport { useBlogLike } from '../../hooks/useBlogLike';\nimport { useComments } from '../../hooks/useComments';\nimport { useTranslation } from '../../providers/I18nProvider';\nimport type { BlogSinglePageProps } from './types';\nimport { Breadcrumb, Image, Link } from '../../components/common';\nimport { useTwilight } from '../../providers/twilight-context';\n\nexport function BlogSinglePage({ page, article, related = [] }: BlogSinglePageProps) {\n const { t } = useTranslation();\n const { store } = useTwilight();\n const { cdn } = useAsset();\n const { format: formatDate } = useDate();\n const { active, count, toggle, loading } = useBlogLike(\n Number(article.id) || 0,\n article.stats?.likes ?? 0\n );\n const { commentsKey } = useComments();\n\n return (\n <div key={article.id} className=\"container mb-8 sm:mb-24\">\n <Breadcrumb page={page} />\n\n <div className=\"md:flex items-start\">\n <div className=\"main-content blog-category md:w-96 flex-1 bg-white lg:p-8 rounded-md mb-10 md:mb-0\">\n <HookSlot name=\"blog:single.start\" />\n\n <h1 className=\"font-bold text-3xl mb-5 leading-10\">{article.name}</h1>\n\n <div className=\"mb-10 text-gray-500 rounded-md inline-flex text-sm rtl:space-x-reverse space-x-5\">\n <div className=\"flex items-center\">\n <i className=\"sicon-calendar-date rtl:ml-1 ltr:mr-1\"></i>\n <span>{formatDate(article.created_at)}</span>\n </div>\n <Link to={article.author?.url || '#'} className=\"flex items-center hover:text-dark\">\n <i className=\"sicon-user rtl:ml-1 ltr:mr-1\"></i>\n <span>{article.author?.name}</span>\n </Link>\n </div>\n\n {article.image && (\n <Image\n src={article.image}\n alt={article.name}\n className=\"h-80 mb-10 w-full rounded-md\"\n aspectRatio=\"16/9\"\n priority\n noWrapper\n />\n )}\n\n {store.settings?.blog?.allow_likes_and_comments && (\n <div className=\"flex items-center gap-2.5 text-gray-500 text-base mb-2\">\n <button\n type=\"button\"\n id=\"blog-like\"\n data-blog-id={article.id}\n className={`flex items-center gap-1 transition-colors ${active ? 'text-primary font-semibold liked' : ''}`}\n onClick={toggle}\n disabled={loading}\n >\n {loading ? (\n <span className=\"loader loader--small\"></span>\n ) : (\n <i className={`sicon-thumbs-up ${active ? 'text-primary' : ''}`}></i>\n )}\n <span>{count}</span>\n </button>\n {(article.stats?.comments ?? 0) > 0 && (\n <div className=\"flex items-center gap-1\">\n <i className=\"sicon-chat text-primary\"></i>\n {article.stats?.comments}\n </div>\n )}\n </div>\n )}\n\n <article\n className=\"leading-7 text-sm mb-10\"\n dangerouslySetInnerHTML={{ __html: article.description?.replace(/&nbsp;/g, ' ') || '' }}\n />\n\n {article.tags && article.tags.length > 0 && (\n <div className=\"p-4 flex flex-wrap items-center border-t border-gray-200\">\n {article.tags.map((tag) => (\n <Link\n key={tag.id}\n to={tag.url}\n className=\"py-2 px-4 rounded-large inline-flex items-center text-gray-500 hover:text-dark justify-center text-sm\"\n >\n <i className=\"font-medium sicon-tag rtl:ml-1.5 ltr:mr-1.5\"></i>\n <span className=\"fix-align whitespace-nowrap\">{tag.name}</span>\n </Link>\n ))}\n </div>\n )}\n\n {store.settings?.blog?.allow_likes_and_comments && (\n <SallaComments\n key={commentsKey}\n itemId={Number(article.id) || 0}\n type={'blog' as any}\n />\n )}\n\n <HookSlot name=\"blog:single.end\" />\n </div>\n\n <aside\n aria-label=\"Sidebar\"\n className=\"sticky shrink-0 top-24 md:w-96 rtl:lg:mr-8 ltr:lg:ml-8 pb-11\"\n >\n {related.length > 0 && (\n <>\n <h2 className=\"font-bold mb-3\">{t('pages.blog_articles.related')}</h2>\n\n <HookSlot name=\"blog:single.related.start\" />\n\n {related.map((relatedArticle) => (\n <div\n key={relatedArticle.id}\n className=\"mt-5 flex items-center bg-white p-5 rounded-md\"\n >\n <div className=\"shrink-0\">\n <Link\n to={relatedArticle.url}\n className=\"bg-border-color h-24 w-24 rounded-md overflow-hidden flex items-center justify-center\"\n >\n <span className=\"sr-only\">{relatedArticle.name}</span>\n {relatedArticle.image ? (\n <Image\n className=\"h-full w-full object-cover\"\n src={relatedArticle.image}\n alt={relatedArticle.name}\n aspectRatio=\"1/1\"\n />\n ) : (\n <Image\n className=\"sm:h-full w-10 object-contain opacity-60\"\n src={cdn('/images/placeholder.png')}\n alt=\"post image\"\n />\n )}\n </Link>\n </div>\n <div className=\"rtl:mr-3 ltr:ml-3\">\n <div className=\"flex items-center text-sm text-gray-500 mb-2\">\n <i className=\"sicon-calendar-date rtl:ml-1 ltr:mr-1 rtl:pl-px ltr:pr-px\"></i>\n <time>{formatDate(relatedArticle.created_at)}</time>\n </div>\n <h3 className=\"text-sm font-bold text-gray-800 leading-6\">\n <Link to={relatedArticle.url} className=\"hover:underline\">\n {relatedArticle.name}\n </Link>\n </h3>\n </div>\n </div>\n ))}\n\n <HookSlot name=\"blog:single.related.end\" />\n </>\n )}\n </aside>\n </div>\n </div>\n );\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/routes/blog/BlogTagPage.tsx"],"names":[],"mappings":"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","file":"BlogTagPage-UON2ASKW.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 { BlogTagLoaderData, ArticleSummary } from './types';\n\nconst EMPTY_CATEGORIES: BlogTagLoaderData['categories'] = [];\nconst EMPTY_ARTICLES: ArticleSummary[] = [];\n\nexport function BlogTagPage({\n page,\n blogTag,\n categories = EMPTY_CATEGORIES,\n articles = EMPTY_ARTICLES,\n cursor,\n}: BlogTagLoaderData) {\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({ tag: String(blogTag.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 }, [blogTag.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:tag.start\" />\n <NoContent icon=\"sicon-inbox\" message={t('pages.blog_articles.no_articles')} />\n <HookSlot name=\"blog:tag.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:tag.start\" />\n\n <div className=\"mb-6\">\n <h1 className=\"font-bold text-xl\">{blogTag.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_articles.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:tag.end\" />\n </BlogListLayout>\n </div>\n );\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/routes/brands/BrandsPage.tsx"],"names":[],"mappings":"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","file":"BrandsPage-R4KTDEG3.js","sourcesContent":["import { memo, useState, useRef, useCallback } from 'react';\nimport { useWindowScroll } from '@uidotdev/usehooks';\nimport { Link, Breadcrumb, NoContent, Image } from '../../components/common';\nimport { HookSlot } from '../../hooks';\nimport { useTranslation } from '../../providers/I18nProvider';\nimport type { BrandsPageProps } from './types';\n\nfunction BrandsPageComponent({ page, brands }: BrandsPageProps) {\n const { t } = useTranslation();\n const brandEntries = Object.entries(brands);\n\n const hasBrands = brandEntries.length > 0;\n const [selectedChar, setSelectedChar] = useState<string | null>(null);\n const sectionRefs = useRef<Record<string, HTMLElement | null>>({});\n\n // Use useWindowScroll hook instead of manual listener\n const [{ y }] = useWindowScroll();\n const isSticky = (y ?? 0) > 200;\n\n // Handle brand nav item click - matches brands.js toggle class logic\n const handleBrandClick = useCallback((e: React.MouseEvent<HTMLAnchorElement>) => {\n e.preventDefault();\n const char = e.currentTarget.dataset.id;\n if (char) {\n setSelectedChar(char);\n sectionRefs.current[char]?.scrollIntoView({ behavior: 'smooth' });\n }\n }, []);\n\n return (\n <div className=\"container mb-20\">\n <Breadcrumb page={page} />\n\n <div className=\"flex justify-between pt-2 pb-6\">\n <h1 className=\"font-bold mb-6 md:mb-0\">{page.title}</h1>\n </div>\n\n {hasBrands ? (\n <>\n <div className=\"brands-nav-wrap\">\n <ul\n id=\"brands-nav\"\n className={`brands-nav ${isSticky ? 'is-sticky' : 'is-not-sticky'}`}\n >\n <li></li>\n {brandEntries?.map(([char]) => (\n <li key={char}>\n <a\n className={`brands-nav__item ${selectedChar === char ? 'is-selected' : 'unselected'}`}\n href={`#brand-section-${char}`}\n onClick={handleBrandClick}\n data-id={char}\n >\n <span className=\"fix-align\">{char}</span>\n </a>\n </li>\n ))}\n </ul>\n </div>\n\n <div className=\"px-8 xl:px-0\">\n <HookSlot name=\"brands:index.items.start\" />\n\n {brandEntries.map(([char, brandGroup]) => (\n <section\n key={char}\n id={`brand-section-${char}`}\n ref={(el) => {\n sectionRefs.current[char] = el;\n }}\n className=\"pt-24 first:pt-16 md:first:pt-24\"\n >\n <div className=\"flex items-center mb-10\">\n <span data-id={char} className=\"brand-char\">\n <span className=\"fix-align\">{char}</span>\n </span>\n <div className=\"bg-border-color h-px flex-1\"></div>\n </div>\n <div className=\"grid grid-cols-3 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-6 grid-flow-row gap-4 md:gap-8\">\n {brandGroup.map((brand) => (\n <Link key={brand.id} to={`/brands/${brand.id}`} className=\"brand-item\">\n <Image\n className=\"max-h-full\"\n width={400}\n height={300}\n src={brand.logo}\n alt={brand.name}\n />\n </Link>\n ))}\n </div>\n </section>\n ))}\n\n <HookSlot name=\"brands:index.items.end\" />\n </div>\n </>\n ) : (\n <NoContent\n icon=\"sicon-award-ribbon\"\n message={t('pages.brands.non_brands')}\n actionLabel={t('common.elements.back_home')}\n />\n )}\n </div>\n );\n}\n\nexport const BrandsPage = memo(BrandsPageComponent);\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/common/BreadcrumbTrail.tsx","../src/components/common/BreadcrumbJsonLd.tsx","../src/components/common/Breadcrumb.tsx"],"names":["BreadcrumbTrail","jsx","jsxs","Fragment"],"mappings":"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","file":"Breadcrumb-YNVX6ZXO.js","sourcesContent":["import { memo, useState, useEffect } from 'react';\nimport type { Breadcrumb } from '../../types';\nimport { Link } from './Link';\n\nconst MAX_VISIBLE_ITEMS = 4;\n\ninterface BreadcrumbTrailProps {\n items: Breadcrumb[];\n className?: string;\n}\n\nconst ChevronIcon = () => (\n <svg\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n viewBox=\"0 0 32 32\"\n aria-hidden=\"true\"\n >\n <title>keyboard_arrow_left</title>\n <path d=\"M20.563 22.104l-1.875 1.875-8-8 8-8 1.875 1.875-6.125 6.125z\"></path>\n </svg>\n);\n\nfunction truncateItems(items: Breadcrumb[]): Breadcrumb[] {\n if (items.length <= MAX_VISIBLE_ITEMS) return items;\n\n return [items[0], { name: '…', url: '' }, ...items.slice(-2)];\n}\n\nexport const BreadcrumbTrail = memo(function BreadcrumbTrail({\n items,\n className,\n}: BreadcrumbTrailProps) {\n const [expanded, setExpanded] = useState(false);\n\n useEffect(() => {\n setExpanded(false);\n }, [items]);\n\n if (items.length === 0) return null;\n\n const displayItems = expanded ? items : truncateItems(items);\n\n return (\n <nav className={className ?? 'breadcrumbs w-full py-5'} aria-label=\"Breadcrumb\">\n <ol className=\"s-breadcrumb-wrapper\" itemScope itemType=\"https://schema.org/BreadcrumbList\">\n {displayItems.map((item, index) => {\n const isLast = index === displayItems.length - 1;\n const isEllipsis = item.name === '…' && !item.url;\n\n return (\n <li\n key={`${item.url}-${item.name}`}\n className={['s-breadcrumb-item', isEllipsis ? 'cursor-pointer select-none' : ''].join(\n ' '\n )}\n aria-current={isLast ? 'page' : undefined}\n itemProp=\"itemListElement\"\n itemScope\n itemType=\"https://schema.org/ListItem\"\n >\n {isEllipsis ? (\n <button\n type=\"button\"\n onClick={() => {\n setExpanded(true);\n }}\n className=\"inline-flex items-center gap-1 hover:underline\"\n aria-label=\"Show all breadcrumbs\"\n >\n <span aria-hidden=\"true\" className=\"text-xs\">\n •••\n </span>\n </button>\n ) : isLast ? (\n <span itemProp=\"name\">{item.name}</span>\n ) : (\n <>\n <Link to={item.url} itemProp=\"item\">\n <span itemProp=\"name\">{item.name}</span>\n </Link>\n <span aria-hidden=\"true\" className=\"s-breadcrumb-arrow inline-flex\">\n <ChevronIcon />\n </span>\n <meta itemProp=\"position\" content={String(index + 1)} />\n </>\n )}\n {isLast && <meta itemProp=\"position\" content={String(index + 1)} />}\n </li>\n );\n })}\n </ol>\n </nav>\n );\n});\n","import type { Breadcrumb } from '../../types';\n\ninterface BreadcrumbJsonLdProps {\n items: Breadcrumb[];\n origin: string;\n}\n\nfunction toAbsoluteUrl(origin: string, path: string): string {\n if (path.startsWith('http')) return path;\n return origin + path;\n}\n\nexport function BreadcrumbJsonLd({ items, origin }: BreadcrumbJsonLdProps) {\n if (items.length === 0) return null;\n\n const schema = {\n '@context': 'https://schema.org',\n '@type': 'BreadcrumbList',\n itemListElement: items.map((item, index) => {\n const isLast = index === items.length - 1;\n const url = toAbsoluteUrl(origin, item.url);\n return {\n '@type': 'ListItem',\n position: index + 1,\n name: item.name,\n ...(isLast ? { '@id': url } : { item: url }),\n };\n }),\n };\n\n const html = JSON.stringify(schema);\n\n return (\n <script\n type=\"application/ld+json\"\n suppressHydrationWarning\n dangerouslySetInnerHTML={{ __html: html }}\n />\n );\n}\n","import type { Page } from '../../types';\nimport { useBreadcrumbs } from '../../hooks/useBreadcrumbs';\nimport { useTwilight } from '../../providers/TwilightProvider';\nimport { BreadcrumbTrail } from './BreadcrumbTrail';\nimport { BreadcrumbJsonLd } from './BreadcrumbJsonLd';\n\nexport interface BreadcrumbProps {\n page?: Page | null;\n className?: string;\n}\n\nexport function Breadcrumb({ page, className }: BreadcrumbProps) {\n const { theme, store } = useTwilight();\n const breadcrumbsEnabled = theme.settings.is_breadcrumbs_enabled ?? true;\n const origin = store.url;\n\n const items = useBreadcrumbs(page);\n\n if (!breadcrumbsEnabled) return null;\n\n return (\n <>\n <BreadcrumbTrail items={items} className={className} />\n <BreadcrumbJsonLd items={items} origin={origin} />\n </>\n );\n}\n"]}