@salla.sa/twilight-theme-engine 1.0.85 → 1.0.87

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 (390) hide show
  1. package/README.md +4 -3
  2. package/bin/twilight-check-manifest.mjs +16 -0
  3. package/dist/{AddToCartForm-B5C2M4OZ.js → AddToCartForm-P644O2QL.js} +4 -4
  4. package/dist/{AddToCartForm-B5C2M4OZ.js.map → AddToCartForm-P644O2QL.js.map} +1 -1
  5. package/dist/{BlogAuthorPage-GTF4UGSS.js → BlogAuthorPage-VWSO6MPY.js} +13 -11
  6. package/dist/BlogAuthorPage-VWSO6MPY.js.map +1 -0
  7. package/dist/{BlogCategoryPage-TN7Y4NBP.js → BlogCategoryPage-K2KSQ6T6.js} +13 -11
  8. package/dist/BlogCategoryPage-K2KSQ6T6.js.map +1 -0
  9. package/dist/{BlogPage-TDB3M3PI.js → BlogPage-XRM7VWOZ.js} +12 -10
  10. package/dist/BlogPage-XRM7VWOZ.js.map +1 -0
  11. package/dist/{BlogSinglePage-4A52Q5QW.js → BlogSinglePage-XIAXT54H.js} +12 -10
  12. package/dist/BlogSinglePage-XIAXT54H.js.map +1 -0
  13. package/dist/{BlogTagPage-TOVPBETA.js → BlogTagPage-IHOA267V.js} +13 -11
  14. package/dist/BlogTagPage-IHOA267V.js.map +1 -0
  15. package/dist/{BrandsPage-VUDGYSQI.js → BrandsPage-ZFEILRT3.js} +12 -10
  16. package/dist/BrandsPage-ZFEILRT3.js.map +1 -0
  17. package/dist/{Breadcrumb-CI3SN5YR.js → Breadcrumb-CVSISL2K.js} +12 -10
  18. package/dist/Breadcrumb-CVSISL2K.js.map +1 -0
  19. package/dist/{CartItem-BHLEURAB.js → CartItem-EOI7P3JA.js} +12 -10
  20. package/dist/CartItem-EOI7P3JA.js.map +1 -0
  21. package/dist/{CartSummary-QERVESYN.js → CartSummary-RZGUBDKJ.js} +12 -10
  22. package/dist/CartSummary-RZGUBDKJ.js.map +1 -0
  23. package/dist/{Copyright-RL6ALKRC.js → Copyright-5BLYSP24.js} +4 -4
  24. package/dist/{Copyright-RL6ALKRC.js.map → Copyright-5BLYSP24.js.map} +1 -1
  25. package/dist/{CustomerLayout-VRZUWGQK.js → CustomerLayout-6F4BJAMU.js} +12 -10
  26. package/dist/CustomerLayout-6F4BJAMU.js.map +1 -0
  27. package/dist/{Footer-ZWBZCMDL.js → Footer-NF2NLDLR.js} +6 -6
  28. package/dist/{Footer-ZWBZCMDL.js.map → Footer-NF2NLDLR.js.map} +1 -1
  29. package/dist/{Header-WNK4O66B.js → Header-6DQJ5X7J.js} +9 -7
  30. package/dist/{Header-WNK4O66B.js.map → Header-6DQJ5X7J.js.map} +1 -1
  31. package/dist/{LoyaltyPage-CGTHWJ76.js → LoyaltyPage-YHWHIWCS.js} +12 -10
  32. package/dist/LoyaltyPage-YHWHIWCS.js.map +1 -0
  33. package/dist/{LoyaltyPointsPage-QSU6K3PW.js → LoyaltyPointsPage-T6K3H5A5.js} +10 -3
  34. package/dist/LoyaltyPointsPage-T6K3H5A5.js.map +1 -0
  35. package/dist/{MainMenu-V3T7F32R.js → MainMenu-Y2TAM7DK.js} +4 -4
  36. package/dist/{MainMenu-V3T7F32R.js.map → MainMenu-Y2TAM7DK.js.map} +1 -1
  37. package/dist/{MasterLayout-XQF644LD.js → MasterLayout-GBEEFFPG.js} +12 -10
  38. package/dist/{MasterLayout-XQF644LD.js.map → MasterLayout-GBEEFFPG.js.map} +1 -1
  39. package/dist/{MobileMenu-U4BVQYKH.js → MobileMenu-RE5XVGZL.js} +12 -10
  40. package/dist/MobileMenu-RE5XVGZL.js.map +1 -0
  41. package/dist/{NotificationsPage-ZRRQY7TF.js → NotificationsPage-QAFWZAS3.js} +12 -10
  42. package/dist/NotificationsPage-QAFWZAS3.js.map +1 -0
  43. package/dist/{OrderSinglePage-O3XYVMG5.js → OrderSinglePage-T4PRXTKG.js} +12 -10
  44. package/dist/OrderSinglePage-T4PRXTKG.js.map +1 -0
  45. package/dist/{OrdersPage-CMXZF5MI.js → OrdersPage-3S6ZS56E.js} +12 -10
  46. package/dist/OrdersPage-3S6ZS56E.js.map +1 -0
  47. package/dist/{PageSingle-IIG2US43.js → PageSingle-W3UTXDOW.js} +4 -4
  48. package/dist/{PageSingle-IIG2US43.js.map → PageSingle-W3UTXDOW.js.map} +1 -1
  49. package/dist/{ProductDetails-65GDABI7.js → ProductDetails-X5A7TG3F.js} +14 -7
  50. package/dist/ProductDetails-X5A7TG3F.js.map +1 -0
  51. package/dist/{ProfilePage-SNJ4WXU4.js → ProfilePage-DUH3AILJ.js} +12 -10
  52. package/dist/ProfilePage-DUH3AILJ.js.map +1 -0
  53. package/dist/{ReviewsPage-UT7UT55J.js → ReviewsPage-2C2P7VS3.js} +4 -4
  54. package/dist/{ReviewsPage-UT7UT55J.js.map → ReviewsPage-2C2P7VS3.js.map} +1 -1
  55. package/dist/{SeoCartWidget-DBJAXJKT.js → SeoCartWidget-VYLGEW2I.js} +12 -10
  56. package/dist/SeoCartWidget-VYLGEW2I.js.map +1 -0
  57. package/dist/{SettingsPage-FLTIOPU5.js → SettingsPage-OZJEW6CW.js} +12 -10
  58. package/dist/SettingsPage-OZJEW6CW.js.map +1 -0
  59. package/dist/{StoreClosedNotification-ZT3QKDKS.js → StoreClosedNotification-QHIZBNXO.js} +13 -11
  60. package/dist/{StoreClosedNotification-ZT3QKDKS.js.map → StoreClosedNotification-QHIZBNXO.js.map} +1 -1
  61. package/dist/{TestimonialsPage-CU7HKU4O.js → TestimonialsPage-K6WJKKME.js} +4 -4
  62. package/dist/{TestimonialsPage-CU7HKU4O.js.map → TestimonialsPage-K6WJKKME.js.map} +1 -1
  63. package/dist/{ThankYouPage-5X6B4X3T.js → ThankYouPage-H6QQEI5R.js} +12 -10
  64. package/dist/ThankYouPage-H6QQEI5R.js.map +1 -0
  65. package/dist/{WalletPage-H2BKIDPA.js → WalletPage-G5IBGN6B.js} +12 -10
  66. package/dist/WalletPage-G5IBGN6B.js.map +1 -0
  67. package/dist/{WishlistPage-RS5UCIQ3.js → WishlistPage-AIOTAB6L.js} +12 -10
  68. package/dist/WishlistPage-AIOTAB6L.js.map +1 -0
  69. package/dist/api/advertisement.d.ts +33 -0
  70. package/dist/api/advertisement.d.ts.map +1 -0
  71. package/dist/api/advertisement.js +8 -0
  72. package/dist/api/advertisement.js.map +1 -0
  73. package/dist/boot/critical-style.d.ts +3 -0
  74. package/dist/boot/critical-style.d.ts.map +1 -0
  75. package/dist/boot/index.d.ts +15 -0
  76. package/dist/boot/index.d.ts.map +1 -0
  77. package/dist/boot.d.ts +1 -0
  78. package/dist/boot.js +69 -0
  79. package/dist/boot.js.map +1 -0
  80. package/dist/chunk-4FJGZQD3.js +6 -0
  81. package/dist/chunk-4FJGZQD3.js.map +1 -0
  82. package/dist/{chunk-SDFDS4Q3.js → chunk-BCJTF3V7.js} +20 -4
  83. package/dist/chunk-BCJTF3V7.js.map +1 -0
  84. package/dist/chunk-DBW7XXNE.js +103 -0
  85. package/dist/chunk-DBW7XXNE.js.map +1 -0
  86. package/dist/{chunk-22SH7OVF.js → chunk-E7WWO3V3.js} +3 -3
  87. package/dist/{chunk-22SH7OVF.js.map → chunk-E7WWO3V3.js.map} +1 -1
  88. package/dist/{chunk-SE5JYWOK.js → chunk-EZHXVHXY.js} +4 -4
  89. package/dist/{chunk-SE5JYWOK.js.map → chunk-EZHXVHXY.js.map} +1 -1
  90. package/dist/{chunk-JO7JWV34.js → chunk-FWYKOQV5.js} +5 -5
  91. package/dist/chunk-FWYKOQV5.js.map +1 -0
  92. package/dist/{chunk-JRNH3FUF.js → chunk-FYHF62KI.js} +4 -4
  93. package/dist/{chunk-JRNH3FUF.js.map → chunk-FYHF62KI.js.map} +1 -1
  94. package/dist/{chunk-UJKFBZFJ.js → chunk-GJ5IMPNY.js} +7 -7
  95. package/dist/{chunk-UJKFBZFJ.js.map → chunk-GJ5IMPNY.js.map} +1 -1
  96. package/dist/chunk-IVBOLREE.js +29 -0
  97. package/dist/chunk-IVBOLREE.js.map +1 -0
  98. package/dist/chunk-LWPKBVIE.js +14 -0
  99. package/dist/{chunk-7WAXN2PP.js.map → chunk-LWPKBVIE.js.map} +1 -1
  100. package/dist/{chunk-SX5MF2YA.js → chunk-N3BCZIGS.js} +4 -4
  101. package/dist/{chunk-SX5MF2YA.js.map → chunk-N3BCZIGS.js.map} +1 -1
  102. package/dist/{chunk-NZVR4OF7.js → chunk-NXQZ4RLM.js} +8 -8
  103. package/dist/chunk-NXQZ4RLM.js.map +1 -0
  104. package/dist/{chunk-NXQJA7D3.js → chunk-PCURRKIH.js} +3 -3
  105. package/dist/{chunk-NXQJA7D3.js.map → chunk-PCURRKIH.js.map} +1 -1
  106. package/dist/{chunk-4CZRUAZB.js → chunk-PU2LHFDQ.js} +10 -11
  107. package/dist/chunk-PU2LHFDQ.js.map +1 -0
  108. package/dist/{chunk-OWX2CPNQ.js → chunk-UQIVX4YA.js} +3 -3
  109. package/dist/{chunk-OWX2CPNQ.js.map → chunk-UQIVX4YA.js.map} +1 -1
  110. package/dist/chunk-X5NK4TZH.js +228 -0
  111. package/dist/chunk-X5NK4TZH.js.map +1 -0
  112. package/dist/{chunk-6SWDSRIL.js → chunk-XKNXYQ2K.js} +6 -6
  113. package/dist/{chunk-6SWDSRIL.js.map → chunk-XKNXYQ2K.js.map} +1 -1
  114. package/dist/{chunk-KHBSGD2D.js → chunk-XO7B3VWS.js} +3 -3
  115. package/dist/{chunk-KHBSGD2D.js.map → chunk-XO7B3VWS.js.map} +1 -1
  116. package/dist/cli/check-manifest.d.ts +10 -0
  117. package/dist/cli/check-manifest.d.ts.map +1 -0
  118. package/dist/cli/check-manifest.js +44 -0
  119. package/dist/cli/check-manifest.js.map +1 -0
  120. package/dist/components/cart/index.js +1 -1
  121. package/dist/components/common/index.js +2 -2
  122. package/dist/components/drawer/index.js +10 -8
  123. package/dist/components/home/index.js +12 -10
  124. package/dist/components/layout/Footer.d.ts.map +1 -1
  125. package/dist/components/layout/MasterLayout.d.ts.map +1 -1
  126. package/dist/components/layout/PageAdvertisements.d.ts +7 -0
  127. package/dist/components/layout/PageAdvertisements.d.ts.map +1 -0
  128. package/dist/components/layout/index.d.ts +1 -0
  129. package/dist/components/layout/index.d.ts.map +1 -1
  130. package/dist/components/layout/index.js +8 -1
  131. package/dist/components/product/index.js +11 -9
  132. package/dist/components/store/index.js +12 -10
  133. package/dist/components/store/index.js.map +1 -1
  134. package/dist/{document-class-67HTP45G.js → document-class-FRL7JHWD.js} +6 -5
  135. package/dist/{document-class-67HTP45G.js.map → document-class-FRL7JHWD.js.map} +1 -1
  136. package/dist/hooks/index.js +10 -8
  137. package/dist/hooks/useGtm.js +10 -8
  138. package/dist/hooks/useMoney.js +10 -8
  139. package/dist/hooks/useStore.js +10 -8
  140. package/dist/index.js +10 -8
  141. package/dist/index.js.map +1 -1
  142. package/dist/{not-found-QTHBFPNT.js → not-found-E6AR4CZ4.js} +12 -10
  143. package/dist/not-found-E6AR4CZ4.js.map +1 -0
  144. package/dist/providers/index.js +10 -8
  145. package/dist/routes/account/orders.js +1 -1
  146. package/dist/routes/account.js +6 -6
  147. package/dist/routes/blog.js +5 -5
  148. package/dist/routes/brands.js +1 -1
  149. package/dist/routes/cart.js +14 -12
  150. package/dist/routes/cart.js.map +1 -1
  151. package/dist/routes/home.js +13 -11
  152. package/dist/routes/loyalty.js +2 -2
  153. package/dist/routes/page.js +1 -1
  154. package/dist/routes/product-listing.js +12 -10
  155. package/dist/routes/product-listing.js.map +1 -1
  156. package/dist/routes/product.js +12 -10
  157. package/dist/routes/product.js.map +1 -1
  158. package/dist/routes/root/beforeLoad.d.ts +2 -2
  159. package/dist/routes/root/beforeLoad.d.ts.map +1 -1
  160. package/dist/routes/root/head.d.ts.map +1 -1
  161. package/dist/routes/testimonials.js +2 -2
  162. package/dist/routes/thank-you.js +1 -1
  163. package/dist/skeleton.js +13 -11
  164. package/dist/tanstack/document-class.d.ts.map +1 -1
  165. package/dist/tanstack/index.d.ts +1 -0
  166. package/dist/tanstack/index.d.ts.map +1 -1
  167. package/dist/tanstack/stylesheet.d.ts +15 -0
  168. package/dist/tanstack/stylesheet.d.ts.map +1 -0
  169. package/dist/tanstack.js +33 -4
  170. package/dist/tanstack.js.map +1 -1
  171. package/dist/utils/index.js +2 -2
  172. package/dist/vite/index.d.ts +1 -1
  173. package/dist/vite/index.d.ts.map +1 -1
  174. package/dist/vite/index.js +14 -25
  175. package/dist/vite/index.js.map +1 -1
  176. package/dist/vite/plugins/twilight-manifest.d.ts +23 -0
  177. package/dist/vite/plugins/twilight-manifest.d.ts.map +1 -1
  178. package/dist/vite/plugins/twilight-schema.plugin.d.ts.map +1 -1
  179. package/package.json +16 -3
  180. package/tailwind/components/Component.tsx.txt +21 -0
  181. package/tailwind/components/ComponentRegistry.ts.txt +66 -0
  182. package/tailwind/components/cart/CartItem.tsx.txt +211 -0
  183. package/tailwind/components/cart/CartSummary.tsx.txt +269 -0
  184. package/tailwind/components/cart/PreOrderNotification.tsx.txt +16 -0
  185. package/tailwind/components/cart/PriceQuoteButton.tsx.txt +21 -0
  186. package/tailwind/components/cart/SeoCartWidget.tsx.txt +99 -0
  187. package/tailwind/components/cart/index.ts.txt +11 -0
  188. package/tailwind/components/cart/lazy.ts.txt +15 -0
  189. package/tailwind/components/collapse/Collapse.tsx.txt +95 -0
  190. package/tailwind/components/collapse/index.ts.txt +41 -0
  191. package/tailwind/components/common/Breadcrumb.tsx.txt +27 -0
  192. package/tailwind/components/common/BreadcrumbJsonLd.tsx.txt +40 -0
  193. package/tailwind/components/common/BreadcrumbTrail.tsx.txt +97 -0
  194. package/tailwind/components/common/CurrencySymbol.tsx.txt +8 -0
  195. package/tailwind/components/common/DeferredData.tsx.txt +122 -0
  196. package/tailwind/components/common/ErrorPage.tsx.txt +69 -0
  197. package/tailwind/components/common/Image.tsx.txt +119 -0
  198. package/tailwind/components/common/Link.tsx.txt +36 -0
  199. package/tailwind/components/common/Link.types.ts.txt +85 -0
  200. package/tailwind/components/common/NoContent.tsx.txt +27 -0
  201. package/tailwind/components/common/RenderWhenVisible.tsx.txt +92 -0
  202. package/tailwind/components/common/index.ts.txt +42 -0
  203. package/tailwind/components/common/lazy.ts.txt +28 -0
  204. package/tailwind/components/defineComponent.ts.txt +32 -0
  205. package/tailwind/components/drawer/Drawer.tsx.txt +219 -0
  206. package/tailwind/components/drawer/index.ts.txt +38 -0
  207. package/tailwind/components/dropdown/Dropdown.tsx.txt +166 -0
  208. package/tailwind/components/dropdown/index.ts.txt +40 -0
  209. package/tailwind/components/home/BundleComponent.tsx.txt +35 -0
  210. package/tailwind/components/home/ComponentErrorBoundary.tsx.txt +98 -0
  211. package/tailwind/components/home/FeaturedProductsStyle1.tsx.txt +125 -0
  212. package/tailwind/components/home/FeaturedProductsStyle2.tsx.txt +127 -0
  213. package/tailwind/components/home/FeaturedProductsStyle3.tsx.txt +71 -0
  214. package/tailwind/components/home/FixedBanner.tsx.txt +68 -0
  215. package/tailwind/components/home/FixedProducts.tsx.txt +72 -0
  216. package/tailwind/components/home/HomePageRenderer.tsx.txt +284 -0
  217. package/tailwind/components/home/PageBlocks.tsx.txt +24 -0
  218. package/tailwind/components/home/ParallaxBackground.tsx.txt +50 -0
  219. package/tailwind/components/home/PhotosSlider.tsx.txt +61 -0
  220. package/tailwind/components/home/ProductsSlider.tsx.txt +87 -0
  221. package/tailwind/components/home/ReorderProducts.tsx.txt +38 -0
  222. package/tailwind/components/home/SquarePhotos.tsx.txt +68 -0
  223. package/tailwind/components/home/StoreFeatures.tsx.txt +34 -0
  224. package/tailwind/components/home/Testimonials.tsx.txt +36 -0
  225. package/tailwind/components/home/Youtube.tsx.txt +48 -0
  226. package/tailwind/components/home/index.ts.txt +50 -0
  227. package/tailwind/components/home/lazy.ts.txt +17 -0
  228. package/tailwind/components/home/register.ts.txt +44 -0
  229. package/tailwind/components/home/reorder-hooks.ts.txt +52 -0
  230. package/tailwind/components/home/types.ts.txt +4 -0
  231. package/tailwind/components/layout/Copyright.tsx.txt +23 -0
  232. package/tailwind/components/layout/CustomerLayout.tsx.txt +91 -0
  233. package/tailwind/components/layout/Footer.tsx.txt +341 -0
  234. package/tailwind/components/layout/Header.tsx.txt +154 -0
  235. package/tailwind/components/layout/MasterLayout.tsx.txt +62 -0
  236. package/tailwind/components/layout/PageAdvertisements.tsx.txt +131 -0
  237. package/tailwind/components/layout/WidgetHead.tsx.txt +53 -0
  238. package/tailwind/components/layout/index.ts.txt +27 -0
  239. package/tailwind/components/layout/lazy.ts.txt +25 -0
  240. package/tailwind/components/layout/types.ts.txt +11 -0
  241. package/tailwind/components/modal/ImageModal.tsx.txt +70 -0
  242. package/tailwind/components/modal/Modal.tsx.txt +245 -0
  243. package/tailwind/components/modal/index.ts.txt +39 -0
  244. package/tailwind/components/modal/lazy.ts.txt +10 -0
  245. package/tailwind/components/navigation/MainMenu.tsx.txt +94 -0
  246. package/tailwind/components/navigation/MobileMenu.tsx.txt +160 -0
  247. package/tailwind/components/navigation/index.ts.txt +4 -0
  248. package/tailwind/components/navigation/lazy.ts.txt +11 -0
  249. package/tailwind/components/product/AddToCartForm.tsx.txt +365 -0
  250. package/tailwind/components/product/ProductCard.tsx.txt +305 -0
  251. package/tailwind/components/product/ProductDetails.tsx.txt +267 -0
  252. package/tailwind/components/product/ProductGallery.tsx.txt +234 -0
  253. package/tailwind/components/product/index.ts.txt +15 -0
  254. package/tailwind/components/product/lazy.ts.txt +9 -0
  255. package/tailwind/components/snippets/AppsSnippets.tsx.txt +225 -0
  256. package/tailwind/components/snippets/SallaSdkScripts.tsx.txt +14 -0
  257. package/tailwind/components/snippets/index.ts.txt +4 -0
  258. package/tailwind/components/store/StoreClosedNotification.tsx.txt +73 -0
  259. package/tailwind/components/store/index.ts.txt +8 -0
  260. package/tailwind/components/store/lazy.ts.txt +8 -0
  261. package/tailwind/components/toast/Toaster.tsx.txt +177 -0
  262. package/tailwind/components/toast/index.ts.txt +10 -0
  263. package/tailwind/components/toast/types.ts.txt +38 -0
  264. package/tailwind/components/toast/useToast.ts.txt +61 -0
  265. package/tailwind/components/tracking/GoogleTag.tsx.txt +77 -0
  266. package/tailwind/components/tracking/SiftSnippet.tsx.txt +49 -0
  267. package/tailwind/components/tracking/TwilightBundles.tsx.txt +67 -0
  268. package/tailwind/components/tracking/index.ts.txt +11 -0
  269. package/tailwind/components/tracking/lazy.ts.txt +11 -0
  270. package/tailwind/components/useComponent.ts.txt +12 -0
  271. package/tailwind/routes/account/index.tsx.txt +16 -0
  272. package/tailwind/routes/account/notifications/NotificationsPage.tsx.txt +54 -0
  273. package/tailwind/routes/account/notifications/index.tsx.txt +39 -0
  274. package/tailwind/routes/account/notifications/loader.ts.txt +22 -0
  275. package/tailwind/routes/account/notifications/types.ts.txt +18 -0
  276. package/tailwind/routes/account/orders/OrderSinglePage.tsx.txt +181 -0
  277. package/tailwind/routes/account/orders/OrdersPage.tsx.txt +28 -0
  278. package/tailwind/routes/account/orders/index.tsx.txt +86 -0
  279. package/tailwind/routes/account/orders/loader.ts.txt +66 -0
  280. package/tailwind/routes/account/orders/single/OrderActions.tsx.txt +197 -0
  281. package/tailwind/routes/account/orders/single/OrderHeader.tsx.txt +143 -0
  282. package/tailwind/routes/account/orders/single/OrderItemRow.tsx.txt +209 -0
  283. package/tailwind/routes/account/orders/single/OrderSections.tsx.txt +215 -0
  284. package/tailwind/routes/account/orders/single/types.ts.txt +38 -0
  285. package/tailwind/routes/account/orders/types.ts.txt +29 -0
  286. package/tailwind/routes/account/profile/ProfilePage.tsx.txt +30 -0
  287. package/tailwind/routes/account/profile/index.tsx.txt +39 -0
  288. package/tailwind/routes/account/profile/loader.ts.txt +16 -0
  289. package/tailwind/routes/account/profile/types.ts.txt +5 -0
  290. package/tailwind/routes/account/settings/SettingsPage.tsx.txt +13 -0
  291. package/tailwind/routes/account/settings/index.tsx.txt +39 -0
  292. package/tailwind/routes/account/settings/loader.ts.txt +13 -0
  293. package/tailwind/routes/account/settings/types.ts.txt +5 -0
  294. package/tailwind/routes/account/types.ts.txt +320 -0
  295. package/tailwind/routes/account/wallet/WalletPage.tsx.txt +195 -0
  296. package/tailwind/routes/account/wallet/index.tsx.txt +38 -0
  297. package/tailwind/routes/account/wallet/loader.ts.txt +27 -0
  298. package/tailwind/routes/account/wallet/types.ts.txt +11 -0
  299. package/tailwind/routes/account/wishlist/WishlistPage.tsx.txt +314 -0
  300. package/tailwind/routes/account/wishlist/WishlistShare.tsx.txt +248 -0
  301. package/tailwind/routes/account/wishlist/index.tsx.txt +40 -0
  302. package/tailwind/routes/account/wishlist/loader.ts.txt +26 -0
  303. package/tailwind/routes/account/wishlist/types.ts.txt +9 -0
  304. package/tailwind/routes/blog/BlogAuthorPage.tsx.txt +82 -0
  305. package/tailwind/routes/blog/BlogCategoryPage.tsx.txt +84 -0
  306. package/tailwind/routes/blog/BlogPage.tsx.txt +191 -0
  307. package/tailwind/routes/blog/BlogSinglePage.tsx.txt +168 -0
  308. package/tailwind/routes/blog/BlogTagPage.tsx.txt +84 -0
  309. package/tailwind/routes/blog/BlogTags.tsx.txt +54 -0
  310. package/tailwind/routes/blog/components.tsx.txt +87 -0
  311. package/tailwind/routes/blog/index.tsx.txt +238 -0
  312. package/tailwind/routes/blog/loader.ts.txt +173 -0
  313. package/tailwind/routes/blog/types.ts.txt +106 -0
  314. package/tailwind/routes/brands/BrandsPage.tsx.txt +179 -0
  315. package/tailwind/routes/brands/index.tsx.txt +47 -0
  316. package/tailwind/routes/brands/loader.ts.txt +14 -0
  317. package/tailwind/routes/brands/types.ts.txt +53 -0
  318. package/tailwind/routes/cart/CartPage.tsx.txt +112 -0
  319. package/tailwind/routes/cart/index.tsx.txt +39 -0
  320. package/tailwind/routes/cart/loader.ts.txt +15 -0
  321. package/tailwind/routes/cart/types.ts.txt +6 -0
  322. package/tailwind/routes/home/HomePage.tsx.txt +53 -0
  323. package/tailwind/routes/home/index.tsx.txt +56 -0
  324. package/tailwind/routes/home/loader.ts.txt +24 -0
  325. package/tailwind/routes/home/types.ts.txt +11 -0
  326. package/tailwind/routes/index.ts.txt +94 -0
  327. package/tailwind/routes/lazy.ts.txt +105 -0
  328. package/tailwind/routes/loyalty/LoyaltyPage.tsx.txt +17 -0
  329. package/tailwind/routes/loyalty/LoyaltyPointsPage.tsx.txt +11 -0
  330. package/tailwind/routes/loyalty/index.tsx.txt +81 -0
  331. package/tailwind/routes/loyalty/loader.ts.txt +53 -0
  332. package/tailwind/routes/loyalty/types.ts.txt +109 -0
  333. package/tailwind/routes/not-found.tsx.txt +50 -0
  334. package/tailwind/routes/page/PageSingle.tsx.txt +34 -0
  335. package/tailwind/routes/page/index.tsx.txt +60 -0
  336. package/tailwind/routes/page/loader.ts.txt +19 -0
  337. package/tailwind/routes/page/types.ts.txt +34 -0
  338. package/tailwind/routes/product/ProductPage.tsx.txt +77 -0
  339. package/tailwind/routes/product/index.tsx.txt +157 -0
  340. package/tailwind/routes/product/loader.ts.txt +35 -0
  341. package/tailwind/routes/product/types.ts.txt +6 -0
  342. package/tailwind/routes/product-listing/ProductListPage.tsx.txt +321 -0
  343. package/tailwind/routes/product-listing/index.tsx.txt +95 -0
  344. package/tailwind/routes/product-listing/loader.ts.txt +323 -0
  345. package/tailwind/routes/product-listing/types.ts.txt +96 -0
  346. package/tailwind/routes/product-listing/useAppliedFilters.ts.txt +130 -0
  347. package/tailwind/routes/product-short-link.ts.txt +104 -0
  348. package/tailwind/routes/root/beforeLoad.ts.txt +354 -0
  349. package/tailwind/routes/root/head.ts.txt +424 -0
  350. package/tailwind/routes/root/index.ts.txt +2 -0
  351. package/tailwind/routes/seo-redirects.ts.txt +82 -0
  352. package/tailwind/routes/testimonials/ReviewsPage.tsx.txt +12 -0
  353. package/tailwind/routes/testimonials/TestimonialsPage.tsx.txt +80 -0
  354. package/tailwind/routes/testimonials/index.tsx.txt +80 -0
  355. package/tailwind/routes/testimonials/loader.ts.txt +29 -0
  356. package/tailwind/routes/testimonials/types.ts.txt +9 -0
  357. package/tailwind/routes/thank-you/ThankYouPage.tsx.txt +241 -0
  358. package/tailwind/routes/thank-you/index.tsx.txt +49 -0
  359. package/tailwind/routes/thank-you/loader.ts.txt +40 -0
  360. package/tailwind/routes/thank-you/types.ts.txt +16 -0
  361. package/tailwind/routes/types.ts.txt +41 -0
  362. package/dist/BlogAuthorPage-GTF4UGSS.js.map +0 -1
  363. package/dist/BlogCategoryPage-TN7Y4NBP.js.map +0 -1
  364. package/dist/BlogPage-TDB3M3PI.js.map +0 -1
  365. package/dist/BlogSinglePage-4A52Q5QW.js.map +0 -1
  366. package/dist/BlogTagPage-TOVPBETA.js.map +0 -1
  367. package/dist/BrandsPage-VUDGYSQI.js.map +0 -1
  368. package/dist/Breadcrumb-CI3SN5YR.js.map +0 -1
  369. package/dist/CartItem-BHLEURAB.js.map +0 -1
  370. package/dist/CartSummary-QERVESYN.js.map +0 -1
  371. package/dist/CustomerLayout-VRZUWGQK.js.map +0 -1
  372. package/dist/LoyaltyPage-CGTHWJ76.js.map +0 -1
  373. package/dist/LoyaltyPointsPage-QSU6K3PW.js.map +0 -1
  374. package/dist/MobileMenu-U4BVQYKH.js.map +0 -1
  375. package/dist/NotificationsPage-ZRRQY7TF.js.map +0 -1
  376. package/dist/OrderSinglePage-O3XYVMG5.js.map +0 -1
  377. package/dist/OrdersPage-CMXZF5MI.js.map +0 -1
  378. package/dist/ProductDetails-65GDABI7.js.map +0 -1
  379. package/dist/ProfilePage-SNJ4WXU4.js.map +0 -1
  380. package/dist/SeoCartWidget-DBJAXJKT.js.map +0 -1
  381. package/dist/SettingsPage-FLTIOPU5.js.map +0 -1
  382. package/dist/ThankYouPage-5X6B4X3T.js.map +0 -1
  383. package/dist/WalletPage-H2BKIDPA.js.map +0 -1
  384. package/dist/WishlistPage-RS5UCIQ3.js.map +0 -1
  385. package/dist/chunk-4CZRUAZB.js.map +0 -1
  386. package/dist/chunk-7WAXN2PP.js +0 -14
  387. package/dist/chunk-JO7JWV34.js.map +0 -1
  388. package/dist/chunk-NZVR4OF7.js.map +0 -1
  389. package/dist/chunk-SDFDS4Q3.js.map +0 -1
  390. package/dist/not-found-QTHBFPNT.js.map +0 -1
@@ -0,0 +1,68 @@
1
+ import { memo } from 'react';
2
+ import { Link } from '../common';
3
+
4
+ interface ImageData {
5
+ url?: string;
6
+ alt?: string;
7
+ }
8
+
9
+ interface SquarePhotoItem {
10
+ id?: string | number;
11
+ url?: string;
12
+ link_type?: string;
13
+ /** The Store API sends the URL itself to the engine; Twig gets `{ url, alt }`. */
14
+ image?: string | ImageData;
15
+ text?: string;
16
+ }
17
+
18
+ const imageUrl = (item: SquarePhotoItem) =>
19
+ typeof item.image === 'string' ? item.image : item.image?.url;
20
+
21
+ export interface SquarePhotosProps {
22
+ data: {
23
+ title?: string;
24
+ items: SquarePhotoItem[];
25
+ position?: number;
26
+ [key: string]: unknown;
27
+ };
28
+ }
29
+
30
+ export const SquarePhotos = memo(function SquarePhotos({ data }: SquarePhotosProps) {
31
+ const items = data.items || [];
32
+ const title = data.title;
33
+
34
+ if (!items.length) return null;
35
+
36
+ const gridCols =
37
+ items.length <= 3 ? `one-row md:grid-cols-${items.length}` : 'md:grid-cols-3 two-row';
38
+
39
+ return (
40
+ <>
41
+ {title && (
42
+ <div className="s-block__title">
43
+ <div className="right-side">
44
+ <h2>{title}</h2>
45
+ </div>
46
+ </div>
47
+ )}
48
+
49
+ <div className={`grid ${gridCols} grid-flow-row gap-3 sm:gap-8`}>
50
+ {items.map((item) => (
51
+ <Link
52
+ {...(item.link_type === 'external_link' ? { target: '_blank' } : {})}
53
+ key={item.id ?? imageUrl(item) ?? item.url}
54
+ className={`banner-entry square-photos ${item.text ? 'has-overlay with-hover' : ''}`}
55
+ style={{ backgroundImage: `url(${imageUrl(item)})` }}
56
+ to={item.url || '#'}
57
+ >
58
+ {item.text && (
59
+ <h3 className="text-with-border">
60
+ <span>{item.text}</span>
61
+ </h3>
62
+ )}
63
+ </Link>
64
+ ))}
65
+ </div>
66
+ </>
67
+ );
68
+ });
@@ -0,0 +1,34 @@
1
+ import { memo } from 'react';
2
+ import type { Feature } from '../../types';
3
+
4
+ export interface StoreFeaturesProps {
5
+ data: {
6
+ features: Feature[];
7
+ [key: string]: unknown;
8
+ };
9
+ }
10
+
11
+ export const StoreFeatures = memo(function StoreFeatures({ data }: StoreFeaturesProps) {
12
+ const { features } = data;
13
+
14
+ if (!features.length) return null;
15
+
16
+ return (
17
+ <>
18
+ <div className="grid grid-cols-[repeat(2,minmax(0,1fr))] md:grid-cols-[repeat(3,minmax(0,1fr))] gap-4 sm:gap-6 xl:gap-8">
19
+ {features.map((feature) => (
20
+ <div
21
+ key={`${feature.icon}:${feature.title}:${feature.description ?? ''}`}
22
+ className="s-block--features__item"
23
+ >
24
+ <div className="feature-icon">
25
+ <i className={feature.icon}></i>
26
+ </div>
27
+ <h2>{feature.title}</h2>
28
+ <p>{feature.description}</p>
29
+ </div>
30
+ ))}
31
+ </div>
32
+ </>
33
+ );
34
+ });
@@ -0,0 +1,36 @@
1
+ import { memo } from 'react';
2
+ import { SallaReviews } from '@salla.sa/twilight-components-react/reviews';
3
+
4
+ type ReviewType = 'all' | 'store' | 'products';
5
+ type SortingOption = 'top_rating' | 'random' | 'latest';
6
+
7
+ export interface TestimonialsProps {
8
+ data: {
9
+ limit?: string | number;
10
+ type?: ReviewType;
11
+ sort?: SortingOption;
12
+ hide_customer_info?: boolean;
13
+ display_all_url?: string;
14
+ [key: string]: unknown;
15
+ };
16
+ }
17
+
18
+ export const Testimonials = memo(function Testimonials({ data }: TestimonialsProps) {
19
+ const limit = data.limit !== undefined ? parseInt(String(data.limit), 10) : 10;
20
+ const type: ReviewType = data.type || 'store';
21
+ const sort: SortingOption = data.sort || 'latest';
22
+ const hideCustomerInfo = data.hide_customer_info ?? false;
23
+ const displayAllUrl = data.display_all_url;
24
+
25
+ return (
26
+ <>
27
+ <SallaReviews
28
+ limit={limit}
29
+ sort={sort}
30
+ type={type}
31
+ {...(displayAllUrl ? { displayAllLink: true } : {})}
32
+ {...(hideCustomerInfo ? { hideCustomerInfo: true } : {})}
33
+ />
34
+ </>
35
+ );
36
+ });
@@ -0,0 +1,48 @@
1
+ import { memo, useEffect, useState } from 'react';
2
+
3
+ export interface YoutubeProps {
4
+ data: {
5
+ youtube_id: string;
6
+ position?: number;
7
+ [key: string]: unknown;
8
+ };
9
+ }
10
+
11
+ export const Youtube = memo(function Youtube({ data }: YoutubeProps) {
12
+ const { youtube_id: youtubeId } = data;
13
+ const [isLoaded, setIsLoaded] = useState(false);
14
+
15
+ useEffect(() => {
16
+ if (!youtubeId) return;
17
+
18
+ // Lazy load the lite-youtube web component
19
+ let mounted = true;
20
+ import('@justinribeiro/lite-youtube')
21
+ .then(() => {
22
+ if (mounted) setIsLoaded(true);
23
+ })
24
+ .catch((err) => {
25
+ console.error('Failed to load lite-youtube:', err);
26
+ });
27
+
28
+ return () => {
29
+ mounted = false;
30
+ };
31
+ }, [youtubeId]);
32
+
33
+ if (!youtubeId) return null;
34
+
35
+ return (
36
+ <>
37
+ <div className="container">
38
+ <div className="videoWrapper">
39
+ {isLoaded ? (
40
+ <lite-youtube videoid={youtubeId} params="rel=0"></lite-youtube>
41
+ ) : (
42
+ <div className="animate-pulse bg-gray-200 w-full h-full min-h-[300px] rounded" />
43
+ )}
44
+ </div>
45
+ </div>
46
+ </>
47
+ );
48
+ });
@@ -0,0 +1,50 @@
1
+ import {
2
+ LazyProductsSlider,
3
+ LazyStoreFeatures,
4
+ LazyFixedBanner,
5
+ LazyFixedProducts,
6
+ LazyFeaturedProductsStyle1,
7
+ LazyFeaturedProductsStyle2,
8
+ LazyFeaturedProductsStyle3,
9
+ LazyParallaxBackground,
10
+ LazyPhotosSlider,
11
+ LazySquarePhotos,
12
+ LazyTestimonials,
13
+ LazyYoutube,
14
+ LazyBundleComponent,
15
+ } from './lazy';
16
+
17
+ export {
18
+ LazyProductsSlider as ProductsSlider,
19
+ LazyStoreFeatures as StoreFeatures,
20
+ LazyFixedBanner as FixedBanner,
21
+ LazyFixedProducts as FixedProducts,
22
+ LazyFeaturedProductsStyle1 as FeaturedProductsStyle1,
23
+ LazyFeaturedProductsStyle2 as FeaturedProductsStyle2,
24
+ LazyFeaturedProductsStyle3 as FeaturedProductsStyle3,
25
+ LazyParallaxBackground as ParallaxBackground,
26
+ LazyPhotosSlider as PhotosSlider,
27
+ LazySquarePhotos as SquarePhotos,
28
+ LazyTestimonials as Testimonials,
29
+ LazyYoutube as Youtube,
30
+ LazyBundleComponent as BundleComponent,
31
+ };
32
+
33
+ // Shared types
34
+ export type { AnyHomeComponent } from './types';
35
+ export type { BundleComponentProps } from './BundleComponent';
36
+
37
+ // Re-export from HomePageRenderer
38
+ export type { HomeComponentsProps, HomeComponentConfig } from './HomePageRenderer';
39
+
40
+ // Home registration (DefaultHomeComponents + registerHomeComponents)
41
+ export { DefaultHomeComponents, registerHomeComponents } from './register';
42
+
43
+ // Home page infrastructure
44
+ export { HomeComponentRenderer, registerHomeComponentConfig } from './HomePageRenderer';
45
+ export { PageBlocks } from './PageBlocks';
46
+ export type { PageBlocksProps } from './PageBlocks';
47
+ export { ComponentErrorBoundary } from './ComponentErrorBoundary';
48
+
49
+ export { ReorderProducts } from './ReorderProducts';
50
+ export { useReorderButtons } from './reorder-hooks';
@@ -0,0 +1,17 @@
1
+ import { lazy } from 'react';
2
+
3
+ export { ProductsSlider as LazyProductsSlider } from './ProductsSlider';
4
+ export { StoreFeatures as LazyStoreFeatures } from './StoreFeatures';
5
+ export { FixedBanner as LazyFixedBanner } from './FixedBanner';
6
+ export { FixedProducts as LazyFixedProducts } from './FixedProducts';
7
+ export { FeaturedProductsStyle1 as LazyFeaturedProductsStyle1 } from './FeaturedProductsStyle1';
8
+ export { FeaturedProductsStyle2 as LazyFeaturedProductsStyle2 } from './FeaturedProductsStyle2';
9
+ export { FeaturedProductsStyle3 as LazyFeaturedProductsStyle3 } from './FeaturedProductsStyle3';
10
+ export { ParallaxBackground as LazyParallaxBackground } from './ParallaxBackground';
11
+ export { PhotosSlider as LazyPhotosSlider } from './PhotosSlider';
12
+ export { SquarePhotos as LazySquarePhotos } from './SquarePhotos';
13
+ export const LazyTestimonials = lazy(() =>
14
+ import('./Testimonials').then((m) => ({ default: m.Testimonials }))
15
+ );
16
+ export { Youtube as LazyYoutube } from './Youtube';
17
+ export { BundleComponent as LazyBundleComponent } from './BundleComponent';
@@ -0,0 +1,44 @@
1
+ import {
2
+ LazyProductsSlider,
3
+ LazyStoreFeatures,
4
+ LazyFixedBanner,
5
+ LazyFixedProducts,
6
+ LazyFeaturedProductsStyle1,
7
+ LazyFeaturedProductsStyle2,
8
+ LazyFeaturedProductsStyle3,
9
+ LazyParallaxBackground,
10
+ LazyPhotosSlider,
11
+ LazySquarePhotos,
12
+ LazyTestimonials,
13
+ LazyYoutube,
14
+ LazyBundleComponent,
15
+ } from './lazy';
16
+ import type { AnyHomeComponent } from './types';
17
+ import { registry } from '../ComponentRegistry';
18
+
19
+ export const DefaultHomeComponents: Record<string, AnyHomeComponent | null> = {
20
+ 'fixed-banner': LazyFixedBanner,
21
+ 'photos-slider': LazyPhotosSlider,
22
+ testimonial: LazyTestimonials,
23
+ 'store-features': LazyStoreFeatures,
24
+ youtube: LazyYoutube,
25
+ 'square-photos': LazySquarePhotos,
26
+ 'fixed-products': LazyFixedProducts,
27
+ 'products-slider': LazyProductsSlider,
28
+ 'parallax-background': LazyParallaxBackground,
29
+ 'featured-products:style1': LazyFeaturedProductsStyle1,
30
+ 'featured-products:style2': LazyFeaturedProductsStyle2,
31
+ 'featured-products:style3': LazyFeaturedProductsStyle3,
32
+ 'bundle-component': LazyBundleComponent,
33
+ };
34
+
35
+ export function registerHomeComponents(
36
+ components: Record<string, AnyHomeComponent | null> = DefaultHomeComponents,
37
+ prefix = 'home:'
38
+ ): void {
39
+ Object.entries(components).forEach(([path, component]) => {
40
+ if (component) {
41
+ registry.register(`${prefix}${path}`, component);
42
+ }
43
+ });
44
+ }
@@ -0,0 +1,52 @@
1
+ import { useEffect } from 'react';
2
+ import { useTranslation } from '../../providers/I18nProvider';
3
+ import { whenSallaLoaded } from '../../utils/sdk-helpers';
4
+
5
+ interface ReorderLabels {
6
+ /** The add button's text in a reorder list. */
7
+ add: string;
8
+ /** Its text for an out-of-stock product. */
9
+ outOfStock: string;
10
+ }
11
+
12
+ let registered = false;
13
+
14
+ /**
15
+ * Twig's ReorderProductsWidget script: inside a reorder list the add button reads the block's
16
+ * title and adds the product as the customer last ordered it. The SDK has no way to remove a
17
+ * hook, so it is registered once per page load.
18
+ */
19
+ function registerReorderHooks(labels: ReorderLabels): void {
20
+ if (registered) return;
21
+ registered = true;
22
+ whenSallaLoaded((sdk) => {
23
+ sdk.hooks?.registerHook?.('salla-add-product-button', 'componentDidLoad', (component) => {
24
+ if (!component.host?.closest('[source="reorder"], [data-source="reorder"]')) return;
25
+ const isOutOfStock =
26
+ component.productStatus === 'out' || component.productStatus === 'out-and-notify';
27
+ const setLabel = () => component.btn?.setText(isOutOfStock ? labels.outOfStock : labels.add);
28
+ setLabel();
29
+ sdk.lang?.onLoaded?.(setLabel);
30
+ if (isOutOfStock) return;
31
+ component.addProductToCart = async (event: Event) => {
32
+ event.preventDefault();
33
+ // The click lands on the inner button, which has no product-id; without one the SDK uses the page's.
34
+ const productId = component.productId ?? component.host.getAttribute('product-id');
35
+ await sdk.order.api.reorderProduct?.(productId ?? undefined);
36
+ };
37
+ });
38
+ });
39
+ }
40
+
41
+ /**
42
+ * Inside an element with `data-source="reorder"`, make each add button read "order again" and
43
+ * add the product as the customer last ordered it, as Twig's reorder block and page do.
44
+ */
45
+ export function useReorderButtons(enabled: boolean): void {
46
+ const { t } = useTranslation();
47
+ const add = t('pages.orders.repurchase');
48
+ const outOfStock = t('pages.products.out_of_stock');
49
+ useEffect(() => {
50
+ if (enabled) registerReorderHooks({ add, outOfStock });
51
+ }, [enabled, add, outOfStock]);
52
+ }
@@ -0,0 +1,4 @@
1
+ import type { ComponentType } from 'react';
2
+
3
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Dynamic registry requires `any` for data prop (specific component props can't satisfy contravariance with Record<string, unknown>)
4
+ export type AnyHomeComponent = ComponentType<{ data: any; priority?: boolean }>;
@@ -0,0 +1,23 @@
1
+ import { useTranslation } from '../../providers/I18nProvider';
2
+ import { Link } from '../common';
3
+
4
+ export interface CopyrightProps {
5
+ storeName?: string;
6
+ }
7
+
8
+ /**
9
+ * Simple copyright component - shows "Copyright | Year StoreName | Powered by Salla"
10
+ */
11
+ export function Copyright({ storeName = '' }: CopyrightProps) {
12
+ const { t } = useTranslation();
13
+ const year = new Date().getFullYear();
14
+
15
+ return (
16
+ <>
17
+ {t('blocks.footer.copyright', 'Copyright')} | {year}{' '}
18
+ <Link to="/" className="hover:text-primary">
19
+ {storeName}
20
+ </Link>{' '}
21
+ </>
22
+ );
23
+ }
@@ -0,0 +1,91 @@
1
+ import { useMemo } from 'react';
2
+ import { useUser } from '../../hooks';
3
+ import { useDocumentClass } from '../../hooks/useDocumentClass';
4
+ import { SallaFileUpload } from '@salla.sa/twilight-components-react/file-upload';
5
+ import { SallaUserMenu } from '@salla.sa/twilight-components-react/user-menu';
6
+ import { Breadcrumb } from '../common';
7
+ import type { LayoutProps } from './types';
8
+ import { useTranslation } from '../../providers/I18nProvider';
9
+ import { useLocation } from '../../providers/NavigationProvider';
10
+ import type { Page } from '../../types';
11
+ import { RouteId } from '../../router/route-ids';
12
+
13
+ interface CustomerLayoutProps extends LayoutProps {
14
+ page?: Page;
15
+ }
16
+
17
+ export function CustomerLayout({ children, page }: CustomerLayoutProps) {
18
+ const { data: user } = useUser();
19
+ const { t } = useTranslation();
20
+ const { pathname } = useLocation();
21
+
22
+ // Twig's salla-breadcrumb puts "My account" before every customer page but these two.
23
+ const crumbPage = useMemo(() => {
24
+ if (
25
+ !page ||
26
+ page.breadcrumbs?.length ||
27
+ ([RouteId.CUSTOMER_PROFILE, RouteId.CUSTOMER_WISHLIST] as string[]).includes(page.slug)
28
+ ) {
29
+ return page;
30
+ }
31
+ return {
32
+ ...page,
33
+ breadcrumbs: [
34
+ { name: t('common.titles.home'), url: '/' },
35
+ { name: t('common.titles.profile'), url: '/account/profile' },
36
+ { name: page.title, url: pathname },
37
+ ],
38
+ };
39
+ }, [page, pathname, t]);
40
+
41
+ // Marks every customer/account page so a theme can scope styles to them
42
+ // (route classes vary per page; this one is shared).
43
+ useDocumentClass({ body: { class: 'customer' } });
44
+
45
+ return (
46
+ <>
47
+ <div className="profile-header gradient-bg">
48
+ <div className="container relative flex justify-between h-full items-center">
49
+ {crumbPage && (
50
+ <Breadcrumb page={crumbPage} className="breadcrumbs w-full py-5 self-start" />
51
+ )}
52
+ </div>
53
+ </div>
54
+
55
+ {/* Main content area */}
56
+ <div className="container lg:mb-24">
57
+ <div className="flex items-start flex-col lg:flex-row justify-center">
58
+ <nav
59
+ aria-label="Sidebar"
60
+ className="shrink-0 lg:sticky top-24 lg:-mt-28 lg:shadow-default rounded-md lg:bg-white w-full lg:w-72 rtl:lg:ml-8 ltr:lg:mr-8 lg:pt-8 lg:pb-11 sidebar space-y-px"
61
+ >
62
+ {page?.slug === RouteId.CUSTOMER_PROFILE && (
63
+ <div className="text-center md:mb-9">
64
+ <div className="h-20 w-20 m-auto avatar-wrap bg-gray-100 rounded-full overflow-hidden">
65
+ <SallaFileUpload profileImage value={user?.avatar}>
66
+ <span className="avatar-placeholder flex justify-center items-center flex-col w-full h-full">
67
+ <span className="sicon-user text-2xl text-gray-400"></span>
68
+ </span>
69
+ </SallaFileUpload>
70
+ </div>
71
+ </div>
72
+ )}
73
+
74
+ <div className="hidden lg:block">
75
+ <SallaUserMenu inline />
76
+ </div>
77
+ </nav>
78
+
79
+ <div className="main-content w-full flex-1 lg:pt-10 max-w-3xl">
80
+ {page?.title && (
81
+ <h1 className="font-bold text-lg text-center sm:rtl:text-right sm:ltr:text-left mb-2">
82
+ {page.title}
83
+ </h1>
84
+ )}
85
+ {children}
86
+ </div>
87
+ </div>
88
+ </div>
89
+ </>
90
+ );
91
+ }