@doswiftly/cli 0.1.18 → 0.1.20

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 (277) hide show
  1. package/README.md +23 -323
  2. package/dist/commands/check.js +1 -1
  3. package/dist/commands/check.js.map +1 -1
  4. package/dist/commands/deploy.d.ts +20 -0
  5. package/dist/commands/deploy.d.ts.map +1 -1
  6. package/dist/commands/deploy.js +249 -17
  7. package/dist/commands/deploy.js.map +1 -1
  8. package/dist/commands/doctor.js +3 -3
  9. package/dist/commands/doctor.js.map +1 -1
  10. package/dist/commands/init.js +4 -4
  11. package/dist/commands/sdk.js +5 -5
  12. package/dist/commands/sdk.js.map +1 -1
  13. package/dist/commands/template.js +4 -4
  14. package/dist/commands/template.js.map +1 -1
  15. package/dist/commands/types.js +5 -5
  16. package/dist/commands/types.js.map +1 -1
  17. package/dist/commands/verify.js +2 -2
  18. package/dist/commands/verify.js.map +1 -1
  19. package/dist/lib/package-manager.d.ts +1 -1
  20. package/dist/lib/package-manager.js +1 -1
  21. package/package.json +4 -4
  22. package/templates/storefront-minimal/.github/workflows/build-template.yml +10 -0
  23. package/templates/storefront-minimal/wrangler.toml +11 -0
  24. package/templates/storefront-nextjs/.github/workflows/build-template.yml +10 -0
  25. package/templates/storefront-nextjs/README.md +16 -12
  26. package/templates/storefront-nextjs/app/account/orders/page.tsx +2 -2
  27. package/templates/storefront-nextjs/app/account/page.tsx +2 -2
  28. package/templates/storefront-nextjs/app/auth/login/page.tsx +1 -1
  29. package/templates/storefront-nextjs/app/auth/register/page.tsx +1 -1
  30. package/templates/storefront-nextjs/app/cart/page.tsx +1 -1
  31. package/templates/storefront-nextjs/app/categories/[slug]/page.tsx +2 -2
  32. package/templates/storefront-nextjs/app/categories/page.tsx +1 -1
  33. package/templates/storefront-nextjs/app/collections/[slug]/page.tsx +1 -1
  34. package/templates/storefront-nextjs/app/collections/page.tsx +1 -1
  35. package/templates/storefront-nextjs/app/page.tsx +1 -1
  36. package/templates/storefront-nextjs/app/products/[slug]/page.tsx +1 -1
  37. package/templates/storefront-nextjs/app/products/page.tsx +2 -2
  38. package/templates/storefront-nextjs/app/search/page.tsx +1 -1
  39. package/templates/storefront-nextjs/components/auth/auth-guard.tsx +1 -1
  40. package/templates/storefront-nextjs/components/commerce/add-to-cart-button.tsx +1 -1
  41. package/templates/storefront-nextjs/components/commerce/cart-icon.tsx +1 -1
  42. package/templates/storefront-nextjs/components/commerce/currency-selector.tsx +2 -2
  43. package/templates/storefront-nextjs/components/commerce/product-filters.tsx +1 -1
  44. package/templates/storefront-nextjs/components/commerce/product-price.tsx +1 -1
  45. package/templates/storefront-nextjs/components/commerce/search-input.tsx +1 -1
  46. package/templates/storefront-nextjs/components/commerce/sort-select.tsx +1 -1
  47. package/templates/storefront-nextjs/components/providers.tsx +1 -1
  48. package/templates/storefront-nextjs/lib/currency.tsx +3 -3
  49. package/templates/storefront-nextjs/lib/format.ts +1 -1
  50. package/templates/storefront-nextjs/lib/graphql-queries.ts +3 -3
  51. package/templates/storefront-nextjs/package.dev.json +1 -1
  52. package/templates/storefront-nextjs/package.json +1 -1
  53. package/templates/storefront-nextjs/package.json.template +1 -1
  54. package/templates/storefront-nextjs/wrangler.toml +11 -0
  55. package/templates/storefront-nextjs-shadcn/.github/workflows/build-template.yml +10 -0
  56. package/templates/storefront-nextjs-shadcn/.github/workflows/deploy.yml +47 -0
  57. package/templates/storefront-nextjs-shadcn/.github/workflows/preview.yml +47 -0
  58. package/templates/storefront-nextjs-shadcn/CLAUDE.md +172 -35
  59. package/templates/storefront-nextjs-shadcn/README.md +29 -162
  60. package/templates/storefront-nextjs-shadcn/app/{about → [locale]/about}/page.tsx +17 -14
  61. package/templates/storefront-nextjs-shadcn/app/[locale]/account/addresses/page.tsx +226 -0
  62. package/templates/storefront-nextjs-shadcn/app/[locale]/account/error.tsx +46 -0
  63. package/templates/storefront-nextjs-shadcn/app/[locale]/account/loading.tsx +19 -0
  64. package/templates/storefront-nextjs-shadcn/app/{account → [locale]/account}/loyalty/page.tsx +89 -193
  65. package/templates/storefront-nextjs-shadcn/app/[locale]/account/orders/[id]/loading.tsx +60 -0
  66. package/templates/storefront-nextjs-shadcn/app/[locale]/account/orders/[id]/page.tsx +119 -0
  67. package/templates/storefront-nextjs-shadcn/app/{account → [locale]/account}/orders/[id]/tracking/page.tsx +27 -25
  68. package/templates/storefront-nextjs-shadcn/app/[locale]/account/orders/page.tsx +101 -0
  69. package/templates/storefront-nextjs-shadcn/app/{account → [locale]/account}/page.tsx +9 -7
  70. package/templates/storefront-nextjs-shadcn/app/[locale]/account/settings/page.tsx +208 -0
  71. package/templates/storefront-nextjs-shadcn/app/{auth → [locale]/auth}/forgot-password/page.tsx +24 -17
  72. package/templates/storefront-nextjs-shadcn/app/{auth → [locale]/auth}/login/page.tsx +5 -2
  73. package/templates/storefront-nextjs-shadcn/app/{auth → [locale]/auth}/register/page.tsx +5 -2
  74. package/templates/storefront-nextjs-shadcn/app/[locale]/blog/[slug]/loading.tsx +17 -0
  75. package/templates/storefront-nextjs-shadcn/app/{blog → [locale]/blog}/[slug]/page.tsx +44 -3
  76. package/templates/storefront-nextjs-shadcn/app/[locale]/blog/loading.tsx +19 -0
  77. package/templates/storefront-nextjs-shadcn/app/{brands → [locale]/brands}/page.tsx +2 -1
  78. package/templates/storefront-nextjs-shadcn/app/[locale]/cart/loading.tsx +26 -0
  79. package/templates/storefront-nextjs-shadcn/app/{cart → [locale]/cart}/page.tsx +20 -13
  80. package/templates/storefront-nextjs-shadcn/app/[locale]/categories/[slug]/category-products-client.tsx +58 -0
  81. package/templates/storefront-nextjs-shadcn/app/[locale]/categories/[slug]/loading.tsx +32 -0
  82. package/templates/storefront-nextjs-shadcn/app/[locale]/categories/[slug]/page.tsx +95 -0
  83. package/templates/storefront-nextjs-shadcn/app/{categories → [locale]/categories}/page.tsx +21 -12
  84. package/templates/storefront-nextjs-shadcn/app/[locale]/checkout/error.tsx +43 -0
  85. package/templates/storefront-nextjs-shadcn/app/[locale]/checkout/loading.tsx +31 -0
  86. package/templates/storefront-nextjs-shadcn/app/{checkout → [locale]/checkout}/page.tsx +334 -253
  87. package/templates/storefront-nextjs-shadcn/app/{checkout → [locale]/checkout}/success/[orderId]/page.tsx +36 -34
  88. package/templates/storefront-nextjs-shadcn/app/[locale]/collections/[handle]/loading.tsx +19 -0
  89. package/templates/storefront-nextjs-shadcn/app/{collections → [locale]/collections}/[handle]/page.tsx +6 -4
  90. package/templates/storefront-nextjs-shadcn/app/[locale]/collections/loading.tsx +18 -0
  91. package/templates/storefront-nextjs-shadcn/app/{collections → [locale]/collections}/page.tsx +20 -12
  92. package/templates/storefront-nextjs-shadcn/app/{contact → [locale]/contact}/page.tsx +24 -21
  93. package/templates/storefront-nextjs-shadcn/app/{error.tsx → [locale]/error.tsx} +13 -8
  94. package/templates/storefront-nextjs-shadcn/app/[locale]/layout.tsx +92 -0
  95. package/templates/storefront-nextjs-shadcn/app/{not-found.tsx → [locale]/not-found.tsx} +13 -18
  96. package/templates/storefront-nextjs-shadcn/app/{page.tsx → [locale]/page.tsx} +8 -4
  97. package/templates/storefront-nextjs-shadcn/app/[locale]/products/[slug]/error.tsx +43 -0
  98. package/templates/storefront-nextjs-shadcn/app/[locale]/products/[slug]/loading.tsx +29 -0
  99. package/templates/storefront-nextjs-shadcn/app/{products → [locale]/products}/[slug]/page.tsx +17 -14
  100. package/templates/storefront-nextjs-shadcn/app/{products → [locale]/products}/[slug]/product-client.tsx +18 -62
  101. package/templates/storefront-nextjs-shadcn/app/[locale]/products/loading.tsx +32 -0
  102. package/templates/storefront-nextjs-shadcn/app/{products → [locale]/products}/page.tsx +6 -3
  103. package/templates/storefront-nextjs-shadcn/app/[locale]/products/products-client.tsx +450 -0
  104. package/templates/storefront-nextjs-shadcn/app/[locale]/search/loading.tsx +18 -0
  105. package/templates/storefront-nextjs-shadcn/app/{wishlist → [locale]/wishlist}/page.tsx +27 -28
  106. package/templates/storefront-nextjs-shadcn/app/api/auth/clear-token/route.ts +2 -86
  107. package/templates/storefront-nextjs-shadcn/app/api/auth/set-token/route.ts +2 -124
  108. package/templates/storefront-nextjs-shadcn/app/global-error.tsx +117 -0
  109. package/templates/storefront-nextjs-shadcn/app/globals.css +8 -0
  110. package/templates/storefront-nextjs-shadcn/app/layout.tsx +8 -35
  111. package/templates/storefront-nextjs-shadcn/codegen.ts +48 -31
  112. package/templates/storefront-nextjs-shadcn/components/account/address-form.tsx +25 -20
  113. package/templates/storefront-nextjs-shadcn/components/account/address-list.tsx +11 -10
  114. package/templates/storefront-nextjs-shadcn/components/account/customer-info.fragment.graphql +36 -0
  115. package/templates/storefront-nextjs-shadcn/components/account/order-details.tsx +17 -13
  116. package/templates/storefront-nextjs-shadcn/components/account/order-history.tsx +42 -30
  117. package/templates/storefront-nextjs-shadcn/components/account/order-summary.fragment.graphql +36 -0
  118. package/templates/storefront-nextjs-shadcn/components/auth/account-menu.tsx +18 -16
  119. package/templates/storefront-nextjs-shadcn/components/auth/login-form.tsx +37 -58
  120. package/templates/storefront-nextjs-shadcn/components/auth/register-form.tsx +85 -66
  121. package/templates/storefront-nextjs-shadcn/components/blog/blog-card.tsx +1 -1
  122. package/templates/storefront-nextjs-shadcn/components/blog/blog-sidebar.tsx +1 -1
  123. package/templates/storefront-nextjs-shadcn/components/brand/brand-card.tsx +1 -1
  124. package/templates/storefront-nextjs-shadcn/components/cart/cart-drawer.tsx +10 -6
  125. package/templates/storefront-nextjs-shadcn/components/cart/cart-icon.tsx +9 -6
  126. package/templates/storefront-nextjs-shadcn/components/cart/cart-item.tsx +8 -6
  127. package/templates/storefront-nextjs-shadcn/components/cart/cart-line.fragment.graphql +53 -0
  128. package/templates/storefront-nextjs-shadcn/components/cart/cart-summary.tsx +10 -8
  129. package/templates/storefront-nextjs-shadcn/components/cart/promo-code-input.tsx +8 -5
  130. package/templates/storefront-nextjs-shadcn/components/cart/shipping-estimator.tsx +38 -20
  131. package/templates/storefront-nextjs-shadcn/components/checkout/payment-method-card.tsx +15 -25
  132. package/templates/storefront-nextjs-shadcn/components/checkout/payment-step.tsx +10 -8
  133. package/templates/storefront-nextjs-shadcn/components/checkout/tax-breakdown.tsx +9 -6
  134. package/templates/storefront-nextjs-shadcn/components/commerce/currency-selector.tsx +7 -5
  135. package/templates/storefront-nextjs-shadcn/components/commerce/pagination.tsx +8 -5
  136. package/templates/storefront-nextjs-shadcn/components/commerce/product-actions.tsx +6 -4
  137. package/templates/storefront-nextjs-shadcn/components/commerce/search-input.tsx +10 -9
  138. package/templates/storefront-nextjs-shadcn/components/common/category-card.tsx +1 -1
  139. package/templates/storefront-nextjs-shadcn/components/common/collection-card.tsx +1 -1
  140. package/templates/storefront-nextjs-shadcn/components/common/price-display.tsx +35 -11
  141. package/templates/storefront-nextjs-shadcn/components/common/social-share.tsx +9 -6
  142. package/templates/storefront-nextjs-shadcn/components/discount/discount-breakdown.tsx +22 -12
  143. package/templates/storefront-nextjs-shadcn/components/discount/discount-code-input.tsx +18 -15
  144. package/templates/storefront-nextjs-shadcn/components/error/error-boundary.tsx +53 -28
  145. package/templates/storefront-nextjs-shadcn/components/filters/dynamic-attribute-filters.tsx +7 -5
  146. package/templates/storefront-nextjs-shadcn/components/filters/range-slider-filter.tsx +5 -5
  147. package/templates/storefront-nextjs-shadcn/components/gift-card/gift-card-balance.tsx +19 -15
  148. package/templates/storefront-nextjs-shadcn/components/gift-card/gift-card-input.tsx +13 -10
  149. package/templates/storefront-nextjs-shadcn/components/home/category-grid.tsx +10 -6
  150. package/templates/storefront-nextjs-shadcn/components/home/collection-card.fragment.graphql +21 -0
  151. package/templates/storefront-nextjs-shadcn/components/home/featured-collections.tsx +3 -13
  152. package/templates/storefront-nextjs-shadcn/components/home/featured-products.tsx +12 -8
  153. package/templates/storefront-nextjs-shadcn/components/home/hero-section.tsx +13 -8
  154. package/templates/storefront-nextjs-shadcn/components/home/index.ts +0 -1
  155. package/templates/storefront-nextjs-shadcn/components/home/newsletter-signup.tsx +10 -8
  156. package/templates/storefront-nextjs-shadcn/components/hydrated.tsx +24 -0
  157. package/templates/storefront-nextjs-shadcn/components/layout/breadcrumbs.tsx +41 -16
  158. package/templates/storefront-nextjs-shadcn/components/layout/category-node.fragment.graphql +22 -0
  159. package/templates/storefront-nextjs-shadcn/components/layout/currency-selector.tsx +7 -4
  160. package/templates/storefront-nextjs-shadcn/components/layout/footer.tsx +24 -23
  161. package/templates/storefront-nextjs-shadcn/components/layout/header.tsx +52 -34
  162. package/templates/storefront-nextjs-shadcn/components/layout/language-switcher.tsx +54 -0
  163. package/templates/storefront-nextjs-shadcn/components/layout/mobile-menu.tsx +33 -30
  164. package/templates/storefront-nextjs-shadcn/components/layout/navigation.tsx +27 -24
  165. package/templates/storefront-nextjs-shadcn/components/loyalty/points-balance.tsx +2 -11
  166. package/templates/storefront-nextjs-shadcn/components/loyalty/points-history.tsx +8 -25
  167. package/templates/storefront-nextjs-shadcn/components/loyalty/referral-section.tsx +32 -42
  168. package/templates/storefront-nextjs-shadcn/components/loyalty/rewards-catalog.tsx +17 -41
  169. package/templates/storefront-nextjs-shadcn/components/loyalty/tier-progress.tsx +2 -29
  170. package/templates/storefront-nextjs-shadcn/components/order/index.ts +6 -1
  171. package/templates/storefront-nextjs-shadcn/components/product/add-to-cart-button.tsx +6 -14
  172. package/templates/storefront-nextjs-shadcn/components/product/b2b-price-display.tsx +4 -2
  173. package/templates/storefront-nextjs-shadcn/components/product/filter-active-pills.tsx +72 -0
  174. package/templates/storefront-nextjs-shadcn/components/product/filter-mobile-sheet.tsx +87 -0
  175. package/templates/storefront-nextjs-shadcn/components/product/filter-price-range.tsx +140 -0
  176. package/templates/storefront-nextjs-shadcn/components/product/index.ts +9 -2
  177. package/templates/storefront-nextjs-shadcn/components/product/product-card.fragment.graphql +49 -0
  178. package/templates/storefront-nextjs-shadcn/components/product/product-card.tsx +11 -37
  179. package/templates/storefront-nextjs-shadcn/components/product/product-detail.fragment.graphql +52 -0
  180. package/templates/storefront-nextjs-shadcn/components/product/product-filters.tsx +179 -124
  181. package/templates/storefront-nextjs-shadcn/components/product/product-grid.tsx +3 -5
  182. package/templates/storefront-nextjs-shadcn/components/product/product-image.tsx +3 -7
  183. package/templates/storefront-nextjs-shadcn/components/product/product-price.tsx +2 -2
  184. package/templates/storefront-nextjs-shadcn/components/product/product-reviews.tsx +5 -4
  185. package/templates/storefront-nextjs-shadcn/components/product/product-sort.tsx +44 -19
  186. package/templates/storefront-nextjs-shadcn/components/product/product-variant-selector.tsx +8 -23
  187. package/templates/storefront-nextjs-shadcn/components/product/product-variant.fragment.graphql +51 -0
  188. package/templates/storefront-nextjs-shadcn/components/product/review-card.tsx +1 -1
  189. package/templates/storefront-nextjs-shadcn/components/product/review-form.tsx +26 -34
  190. package/templates/storefront-nextjs-shadcn/components/product/savings-display.tsx +17 -2
  191. package/templates/storefront-nextjs-shadcn/components/product/similar-products.tsx +3 -2
  192. package/templates/storefront-nextjs-shadcn/components/providers/index.ts +1 -1
  193. package/templates/storefront-nextjs-shadcn/components/providers/language-sync-provider.tsx +27 -0
  194. package/templates/storefront-nextjs-shadcn/components/providers/stores-provider.tsx +63 -0
  195. package/templates/storefront-nextjs-shadcn/components/providers/theme-provider.tsx +1 -1
  196. package/templates/storefront-nextjs-shadcn/components/returns/index.ts +2 -2
  197. package/templates/storefront-nextjs-shadcn/components/returns/return-request-form.tsx +59 -72
  198. package/templates/storefront-nextjs-shadcn/components/search/search-bar.tsx +7 -4
  199. package/templates/storefront-nextjs-shadcn/components/search/search-results.tsx +3 -2
  200. package/templates/storefront-nextjs-shadcn/components/shipping/shipping-method-selector.tsx +12 -9
  201. package/templates/storefront-nextjs-shadcn/components/ui/empty-state.tsx +23 -12
  202. package/templates/storefront-nextjs-shadcn/components/ui/form.tsx +174 -0
  203. package/templates/storefront-nextjs-shadcn/components/ui/index.ts +30 -2
  204. package/templates/storefront-nextjs-shadcn/components/ui/progress.tsx +40 -0
  205. package/templates/storefront-nextjs-shadcn/components/ui/sheet.tsx +107 -0
  206. package/templates/storefront-nextjs-shadcn/components/ui/slider.tsx +33 -0
  207. package/templates/storefront-nextjs-shadcn/components/ui/textarea.tsx +24 -0
  208. package/templates/storefront-nextjs-shadcn/components/wishlist/wishlist-button.tsx +7 -4
  209. package/templates/storefront-nextjs-shadcn/components/wishlist/wishlist-icon.tsx +4 -2
  210. package/templates/storefront-nextjs-shadcn/components/wishlist/wishlist-item.tsx +2 -10
  211. package/templates/storefront-nextjs-shadcn/generated/graphql.ts +13387 -0
  212. package/templates/storefront-nextjs-shadcn/graphql/custom.example.graphql +159 -0
  213. package/templates/storefront-nextjs-shadcn/hooks/index.ts +3 -0
  214. package/templates/storefront-nextjs-shadcn/hooks/use-auth-sync.ts +42 -0
  215. package/templates/storefront-nextjs-shadcn/hooks/use-auth.ts +17 -295
  216. package/templates/storefront-nextjs-shadcn/hooks/use-cart-actions.ts +34 -229
  217. package/templates/storefront-nextjs-shadcn/hooks/use-cart-di.ts +67 -0
  218. package/templates/storefront-nextjs-shadcn/hooks/use-cart-sync.ts +16 -12
  219. package/templates/storefront-nextjs-shadcn/i18n/navigation.ts +12 -0
  220. package/templates/storefront-nextjs-shadcn/i18n/request.ts +17 -0
  221. package/templates/storefront-nextjs-shadcn/i18n/routing.ts +17 -0
  222. package/templates/storefront-nextjs-shadcn/lib/auth/routes.ts +4 -17
  223. package/templates/storefront-nextjs-shadcn/lib/graphql/client.ts +22 -99
  224. package/templates/storefront-nextjs-shadcn/lib/graphql/config.ts +33 -0
  225. package/templates/storefront-nextjs-shadcn/lib/graphql/fragments.ts +34 -0
  226. package/templates/storefront-nextjs-shadcn/lib/graphql/hooks.ts +720 -632
  227. package/templates/storefront-nextjs-shadcn/lib/graphql/query-keys.ts +88 -0
  228. package/templates/storefront-nextjs-shadcn/lib/graphql/server.ts +132 -182
  229. package/templates/storefront-nextjs-shadcn/lib/graphql/types.ts +62 -0
  230. package/templates/storefront-nextjs-shadcn/lib/theme/theme-config.ts +0 -17
  231. package/templates/storefront-nextjs-shadcn/messages/en.json +869 -0
  232. package/templates/storefront-nextjs-shadcn/messages/pl.json +869 -0
  233. package/templates/storefront-nextjs-shadcn/next-env.d.ts +6 -0
  234. package/templates/storefront-nextjs-shadcn/next.config.ts +6 -5
  235. package/templates/storefront-nextjs-shadcn/package.dev.json +1 -3
  236. package/templates/storefront-nextjs-shadcn/package.json +14 -14
  237. package/templates/storefront-nextjs-shadcn/package.json.template +6 -7
  238. package/templates/storefront-nextjs-shadcn/proxy.ts +115 -47
  239. package/templates/storefront-nextjs-shadcn/stores/cart-store.ts +24 -56
  240. package/templates/storefront-nextjs-shadcn/stores/checkout-store.ts +64 -75
  241. package/templates/storefront-nextjs-shadcn/stores/wishlist-store.ts +178 -177
  242. package/templates/storefront-nextjs-shadcn/tsconfig.json +23 -5
  243. package/templates/storefront-nextjs-shadcn/wrangler.toml +11 -0
  244. package/templates/storefront-nextjs-shadcn/CART_INTEGRATION.md +0 -282
  245. package/templates/storefront-nextjs-shadcn/GRAPHQL_DOCUMENT_NAMES.md +0 -190
  246. package/templates/storefront-nextjs-shadcn/GRAPHQL_ERROR_HANDLING.md +0 -263
  247. package/templates/storefront-nextjs-shadcn/GRAPHQL_FIXES_SUMMARY.md +0 -135
  248. package/templates/storefront-nextjs-shadcn/GRAPHQL_INTEGRATION_COMPLETE.md +0 -142
  249. package/templates/storefront-nextjs-shadcn/INTEGRATION_CHECKLIST.md +0 -448
  250. package/templates/storefront-nextjs-shadcn/PRODUCT_DETAIL_PAGE_IMPLEMENTATION.md +0 -307
  251. package/templates/storefront-nextjs-shadcn/THEME_CUSTOMIZATION.md +0 -245
  252. package/templates/storefront-nextjs-shadcn/app/account/addresses/page.tsx +0 -215
  253. package/templates/storefront-nextjs-shadcn/app/account/orders/[id]/page.tsx +0 -128
  254. package/templates/storefront-nextjs-shadcn/app/account/orders/page.tsx +0 -80
  255. package/templates/storefront-nextjs-shadcn/app/account/settings/page.tsx +0 -171
  256. package/templates/storefront-nextjs-shadcn/app/categories/[slug]/page.tsx +0 -78
  257. package/templates/storefront-nextjs-shadcn/app/products/products-client.tsx +0 -192
  258. package/templates/storefront-nextjs-shadcn/components/providers/currency-provider.tsx +0 -103
  259. package/templates/storefront-nextjs-shadcn/graphql/collections.example.ts +0 -168
  260. package/templates/storefront-nextjs-shadcn/graphql/products.example.ts +0 -160
  261. package/templates/storefront-nextjs-shadcn/lib/auth/cookies.ts +0 -220
  262. package/templates/storefront-nextjs-shadcn/lib/config.ts +0 -46
  263. package/templates/storefront-nextjs-shadcn/lib/currency/IMPLEMENTATION_SUMMARY.md +0 -254
  264. package/templates/storefront-nextjs-shadcn/lib/currency/README.md +0 -464
  265. package/templates/storefront-nextjs-shadcn/lib/currency/cookie-manager.test.ts +0 -328
  266. package/templates/storefront-nextjs-shadcn/lib/currency/cookie-manager.ts +0 -295
  267. package/templates/storefront-nextjs-shadcn/lib/currency/index.ts +0 -27
  268. package/templates/storefront-nextjs-shadcn/lib/format.ts +0 -226
  269. package/templates/storefront-nextjs-shadcn/lib/hooks.ts +0 -30
  270. package/templates/storefront-nextjs-shadcn/stores/auth-store.ts +0 -66
  271. package/templates/storefront-nextjs-shadcn/stores/currency-store.ts +0 -103
  272. /package/templates/storefront-nextjs-shadcn/app/{blog → [locale]/blog}/page.tsx +0 -0
  273. /package/templates/storefront-nextjs-shadcn/app/{brands → [locale]/brands}/[slug]/page.tsx +0 -0
  274. /package/templates/storefront-nextjs-shadcn/app/{returns → [locale]/returns}/page.tsx +0 -0
  275. /package/templates/storefront-nextjs-shadcn/app/{search → [locale]/search}/page.tsx +0 -0
  276. /package/templates/storefront-nextjs-shadcn/app/{search → [locale]/search}/search-client.tsx +0 -0
  277. /package/templates/storefront-nextjs-shadcn/app/{shipping → [locale]/shipping}/page.tsx +0 -0
@@ -15,13 +15,8 @@ import { Textarea } from '@/components/ui/textarea';
15
15
  import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
16
16
  import { cn } from '@/lib/utils';
17
17
  import { toast } from 'sonner';
18
+ import { useTranslations } from 'next-intl';
18
19
 
19
- // Ensure Textarea exists or create a simple version
20
- const TextareaComponent = typeof Textarea === 'undefined'
21
- ? ({ className, ...props }: React.TextareaHTMLAttributes<HTMLTextAreaElement>) => (
22
- <textarea className={cn('flex min-h-[80px] w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50', className)} {...props} />
23
- )
24
- : Textarea;
25
20
 
26
21
  interface ReviewFormProps {
27
22
  productId: string;
@@ -51,6 +46,7 @@ export function ReviewForm({
51
46
  orderId,
52
47
  className,
53
48
  }: ReviewFormProps) {
49
+ const t = useTranslations('product.review');
54
50
  const [isSubmitting, setIsSubmitting] = useState(false);
55
51
  const [rating, setRating] = useState(0);
56
52
  const [hoverRating, setHoverRating] = useState(0);
@@ -89,17 +85,17 @@ export function ReviewForm({
89
85
  e.preventDefault();
90
86
 
91
87
  if (rating === 0) {
92
- toast.error('Wybierz ocenę');
88
+ toast.error(t('selectRating'));
93
89
  return;
94
90
  }
95
91
 
96
92
  if (!content.trim()) {
97
- toast.error('Napisz treść opinii');
93
+ toast.error(t('writeReview'));
98
94
  return;
99
95
  }
100
96
 
101
97
  if (!authorName.trim()) {
102
- toast.error('Podaj swoje imię');
98
+ toast.error(t('enterName'));
103
99
  return;
104
100
  }
105
101
 
@@ -127,9 +123,9 @@ export function ReviewForm({
127
123
  setAuthorName('');
128
124
  setAuthorEmail('');
129
125
 
130
- toast.success('Dziękujemy za opinię!');
126
+ toast.success(t('thankYou'));
131
127
  } catch (error) {
132
- toast.error('Nie udało się dodać opinii. Spróbuj ponownie.');
128
+ toast.error(t('failed'));
133
129
  } finally {
134
130
  setIsSubmitting(false);
135
131
  }
@@ -138,16 +134,16 @@ export function ReviewForm({
138
134
  return (
139
135
  <Card className={className}>
140
136
  <CardHeader>
141
- <CardTitle>Dodaj opinię</CardTitle>
137
+ <CardTitle>{t('addReview')}</CardTitle>
142
138
  <p className="text-sm text-muted-foreground">
143
- Podziel się swoją opinią o produkcie: {productTitle}
139
+ {t('shareOpinion', { productTitle })}
144
140
  </p>
145
141
  </CardHeader>
146
142
  <CardContent>
147
143
  <form onSubmit={handleSubmit} className="space-y-6">
148
144
  {/* Rating */}
149
145
  <div>
150
- <Label className="mb-2 block">Ocena *</Label>
146
+ <Label className="mb-2 block">{t('rating')} *</Label>
151
147
  <div className="flex items-center gap-1">
152
148
  {[1, 2, 3, 4, 5].map((star) => (
153
149
  <button
@@ -170,11 +166,7 @@ export function ReviewForm({
170
166
  ))}
171
167
  {rating > 0 && (
172
168
  <span className="ml-2 text-sm text-muted-foreground">
173
- {rating === 1 && 'Bardzo słabo'}
174
- {rating === 2 && 'Słabo'}
175
- {rating === 3 && 'Średnio'}
176
- {rating === 4 && 'Dobrze'}
177
- {rating === 5 && 'Doskonale'}
169
+ {t(`ratingLabels.${rating}` as 'ratingLabels.1' | 'ratingLabels.2' | 'ratingLabels.3' | 'ratingLabels.4' | 'ratingLabels.5')}
178
170
  </span>
179
171
  )}
180
172
  </div>
@@ -182,12 +174,12 @@ export function ReviewForm({
182
174
 
183
175
  {/* Title */}
184
176
  <div>
185
- <Label htmlFor="title">Tytuł opinii</Label>
177
+ <Label htmlFor="title">{t('title')}</Label>
186
178
  <Input
187
179
  id="title"
188
180
  value={title}
189
181
  onChange={(e) => setTitle(e.target.value)}
190
- placeholder="Krótkie podsumowanie..."
182
+ placeholder={t('titlePlaceholder')}
191
183
  maxLength={100}
192
184
  className="mt-1.5"
193
185
  />
@@ -195,12 +187,12 @@ export function ReviewForm({
195
187
 
196
188
  {/* Content */}
197
189
  <div>
198
- <Label htmlFor="content">Treść opinii *</Label>
199
- <TextareaComponent
190
+ <Label htmlFor="content">{t('content')} *</Label>
191
+ <Textarea
200
192
  id="content"
201
193
  value={content}
202
194
  onChange={(e: React.ChangeEvent<HTMLTextAreaElement>) => setContent(e.target.value)}
203
- placeholder="Opisz swoje doświadczenia z produktem..."
195
+ placeholder={t('contentPlaceholder')}
204
196
  rows={4}
205
197
  className="mt-1.5"
206
198
  required
@@ -209,12 +201,12 @@ export function ReviewForm({
209
201
 
210
202
  {/* Pros */}
211
203
  <div>
212
- <Label>Zalety</Label>
204
+ <Label>{t('pros')}</Label>
213
205
  <div className="flex gap-2 mt-1.5">
214
206
  <Input
215
207
  value={newPro}
216
208
  onChange={(e) => setNewPro(e.target.value)}
217
- placeholder="Dodaj zaletę..."
209
+ placeholder={t('addPro')}
218
210
  maxLength={50}
219
211
  onKeyDown={(e) => e.key === 'Enter' && (e.preventDefault(), handleAddPro())}
220
212
  />
@@ -251,12 +243,12 @@ export function ReviewForm({
251
243
 
252
244
  {/* Cons */}
253
245
  <div>
254
- <Label>Wady</Label>
246
+ <Label>{t('cons')}</Label>
255
247
  <div className="flex gap-2 mt-1.5">
256
248
  <Input
257
249
  value={newCon}
258
250
  onChange={(e) => setNewCon(e.target.value)}
259
- placeholder="Dodaj wadę..."
251
+ placeholder={t('addCon')}
260
252
  maxLength={50}
261
253
  onKeyDown={(e) => e.key === 'Enter' && (e.preventDefault(), handleAddCon())}
262
254
  />
@@ -294,7 +286,7 @@ export function ReviewForm({
294
286
  {/* Author Info */}
295
287
  <div className="grid grid-cols-1 sm:grid-cols-2 gap-4">
296
288
  <div>
297
- <Label htmlFor="authorName">Twoje imię *</Label>
289
+ <Label htmlFor="authorName">{t('yourName')} *</Label>
298
290
  <Input
299
291
  id="authorName"
300
292
  value={authorName}
@@ -305,17 +297,17 @@ export function ReviewForm({
305
297
  />
306
298
  </div>
307
299
  <div>
308
- <Label htmlFor="authorEmail">Email (opcjonalnie)</Label>
300
+ <Label htmlFor="authorEmail">{t('emailOptional')}</Label>
309
301
  <Input
310
302
  id="authorEmail"
311
303
  type="email"
312
304
  value={authorEmail}
313
305
  onChange={(e) => setAuthorEmail(e.target.value)}
314
- placeholder="jan@email.com"
306
+ placeholder={t('emailPlaceholder')}
315
307
  className="mt-1.5"
316
308
  />
317
309
  <p className="text-xs text-muted-foreground mt-1">
318
- Nie będzie widoczny publicznie
310
+ {t('emailNotPublic')}
319
311
  </p>
320
312
  </div>
321
313
  </div>
@@ -325,10 +317,10 @@ export function ReviewForm({
325
317
  {isSubmitting ? (
326
318
  <>
327
319
  <Loader2 className="h-4 w-4 mr-2 animate-spin" />
328
- Wysyłanie...
320
+ {t('submitting')}
329
321
  </>
330
322
  ) : (
331
- 'Dodaj opinię'
323
+ t('addReview')
332
324
  )}
333
325
  </Button>
334
326
  </form>
@@ -1,8 +1,8 @@
1
1
  "use client";
2
2
 
3
3
  import { TrendingDown, DollarSign, Percent } from "lucide-react";
4
- import { useCurrencyStore } from "@/stores/currency-store";
5
- import { formatAmount } from "@/lib/format";
4
+ import { useCurrencyStore } from "@doswiftly/storefront-sdk/react";
5
+ import { formatAmount } from "@doswiftly/storefront-sdk";
6
6
 
7
7
  export interface SavingsDisplayProps {
8
8
  originalPrice: number;
@@ -27,10 +27,15 @@ export function SavingsDisplay({
27
27
  className = "",
28
28
  }: SavingsDisplayProps) {
29
29
  const preferredCurrency = useCurrencyStore((state) => state.currency);
30
+ const isLoaded = useCurrencyStore((state) => state.isLoaded);
30
31
  const finalCurrency = currency || preferredCurrency || "PLN";
31
32
 
32
33
  if (salePrice >= originalPrice) return null;
33
34
 
35
+ if (!isLoaded && !currency) {
36
+ return <span className={`inline-block h-4 w-20 animate-pulse rounded bg-muted ${className}`} />;
37
+ }
38
+
34
39
  const savingsAmount = originalPrice - salePrice;
35
40
  const savingsPercentage = Math.round(
36
41
  (savingsAmount / originalPrice) * 100
@@ -127,6 +132,7 @@ export function TotalSavings({
127
132
  className = "",
128
133
  }: TotalSavingsProps) {
129
134
  const preferredCurrency = useCurrencyStore((state) => state.currency);
135
+ const isLoaded = useCurrencyStore((state) => state.isLoaded);
130
136
  const finalCurrency = currency || preferredCurrency || "PLN";
131
137
 
132
138
  const totalSavings = items.reduce((sum, item) => {
@@ -136,6 +142,10 @@ export function TotalSavings({
136
142
 
137
143
  if (totalSavings <= 0) return null;
138
144
 
145
+ if (!isLoaded && !currency) {
146
+ return <span className={`inline-block h-5 w-24 animate-pulse rounded bg-muted ${className}`} />;
147
+ }
148
+
139
149
  return (
140
150
  <div
141
151
  className={`flex items-center justify-between rounded-lg bg-green-50 dark:bg-green-900/20 px-4 py-3 ${className}`}
@@ -169,10 +179,15 @@ export function SavingsBreakdown({
169
179
  className = "",
170
180
  }: SavingsBreakdownProps) {
171
181
  const preferredCurrency = useCurrencyStore((state) => state.currency);
182
+ const isLoaded = useCurrencyStore((state) => state.isLoaded);
172
183
  const finalCurrency = currency || preferredCurrency || "PLN";
173
184
 
174
185
  if (salePrice >= originalPrice) return null;
175
186
 
187
+ if (!isLoaded && !currency) {
188
+ return <span className={`inline-block h-24 w-full animate-pulse rounded bg-muted ${className}`} />;
189
+ }
190
+
176
191
  const savingsAmount = originalPrice - salePrice;
177
192
  const savingsPercentage = Math.round(
178
193
  (savingsAmount / originalPrice) * 100
@@ -1,10 +1,11 @@
1
1
  "use client";
2
2
 
3
- import { ProductCard, type ProductCardProduct } from "./product-card";
3
+ import { ProductCard } from "./product-card";
4
4
  import { cn } from "@/lib/utils";
5
+ import type { ProductCardFields } from "@/lib/graphql/fragments";
5
6
 
6
7
  export interface SimilarProductsProps {
7
- products: ProductCardProduct[];
8
+ products: ProductCardFields[];
8
9
  title?: string;
9
10
  className?: string;
10
11
  columns?: 2 | 3 | 4;
@@ -4,5 +4,5 @@
4
4
  * @module storefront-nextjs/components/providers
5
5
  */
6
6
 
7
- export { CurrencyProvider } from './currency-provider';
8
7
  export { QueryProvider } from './query-provider';
8
+ export { StoresProvider } from './stores-provider';
@@ -0,0 +1,27 @@
1
+ "use client";
2
+
3
+ import { useEffect } from "react";
4
+ import { useLanguageStore } from "@doswiftly/storefront-sdk/react";
5
+
6
+ interface LanguageSyncProviderProps {
7
+ locale: string;
8
+ children: React.ReactNode;
9
+ }
10
+
11
+ /**
12
+ * Syncs the URL locale (from next-intl) with the SDK language store.
13
+ *
14
+ * Flow: URL (/en) -> next-intl -> LanguageSyncProvider -> SDK store -> X-Lang header -> backend
15
+ */
16
+ export function LanguageSyncProvider({
17
+ locale,
18
+ children,
19
+ }: LanguageSyncProviderProps) {
20
+ const setLanguage = useLanguageStore((s) => s.setLanguage);
21
+
22
+ useEffect(() => {
23
+ setLanguage(locale);
24
+ }, [locale, setLanguage]);
25
+
26
+ return <>{children}</>;
27
+ }
@@ -0,0 +1,63 @@
1
+ 'use client';
2
+
3
+ import { useRef, type ReactNode } from 'react';
4
+ import { useQueryClient } from '@tanstack/react-query';
5
+ import { createCartStore, CartProvider } from '@/stores/cart-store';
6
+ import { CheckoutProvider, createCheckoutStore } from '@/stores/checkout-store';
7
+ import { WishlistProvider, createWishlistStore } from '@/stores/wishlist-store';
8
+ import { useCartDI } from '@/hooks/use-cart-di';
9
+ import { queryKeys } from '@/lib/graphql/query-keys';
10
+ import { toast } from 'sonner';
11
+
12
+ /**
13
+ * Provides Context-based Zustand stores to the component tree.
14
+ *
15
+ * Creates store instances once via useRef (stable across re-renders)
16
+ * and wraps children in Provider components.
17
+ *
18
+ * Cart store uses SDK DI pattern — template provides CartActions implementation,
19
+ * SDK orchestrates state (init, mutations, error handling).
20
+ *
21
+ * Must be placed inside StorefrontProvider (SDK stores) and QueryProvider.
22
+ */
23
+ export function StoresProvider({ children }: { children: ReactNode }) {
24
+ const queryClient = useQueryClient();
25
+ const cartActions = useCartDI();
26
+ const actionsRef = useRef(cartActions);
27
+ actionsRef.current = cartActions;
28
+
29
+ const cartStoreRef = useRef<ReturnType<typeof createCartStore> | null>(null);
30
+ if (!cartStoreRef.current) {
31
+ cartStoreRef.current = createCartStore({
32
+ getActions: () => actionsRef.current,
33
+ onMutationSuccess: (action) => {
34
+ queryClient.invalidateQueries({ queryKey: queryKeys.cart.all() });
35
+ if (action === 'addToCart') {
36
+ toast.success('Added to cart');
37
+ } else if (action === 'removeFromCart') {
38
+ toast.success('Removed from cart');
39
+ }
40
+ },
41
+ onMutationError: (_action, error) => {
42
+ const message = error instanceof Error ? error.message : 'Cart operation failed';
43
+ toast.error(message);
44
+ },
45
+ });
46
+ }
47
+
48
+ const checkoutStoreRef = useRef<ReturnType<typeof createCheckoutStore> | null>(null);
49
+ if (!checkoutStoreRef.current) checkoutStoreRef.current = createCheckoutStore();
50
+
51
+ const wishlistStoreRef = useRef<ReturnType<typeof createWishlistStore> | null>(null);
52
+ if (!wishlistStoreRef.current) wishlistStoreRef.current = createWishlistStore();
53
+
54
+ return (
55
+ <CartProvider store={cartStoreRef.current}>
56
+ <CheckoutProvider store={checkoutStoreRef.current}>
57
+ <WishlistProvider store={wishlistStoreRef.current}>
58
+ {children}
59
+ </WishlistProvider>
60
+ </CheckoutProvider>
61
+ </CartProvider>
62
+ );
63
+ }
@@ -2,7 +2,7 @@
2
2
 
3
3
  import * as React from "react";
4
4
  import { ThemeProvider as NextThemesProvider } from "next-themes";
5
- import { type ThemeProviderProps } from "next-themes/dist/types";
5
+ import { type ThemeProviderProps } from "next-themes";
6
6
 
7
7
  /**
8
8
  * ThemeProvider - Provides theme context (light/dark/system)
@@ -9,9 +9,9 @@
9
9
 
10
10
  export {
11
11
  ReturnRequestForm,
12
- ReturnRequestFormSkeleton,
13
12
  type ReturnRequestFormProps,
14
- type EligibleOrderItem,
13
+ type ReturnableItem,
14
+ type ReturnFormData,
15
15
  } from "./return-request-form";
16
16
 
17
17
  export {