@vendure-platform/create 0.4.0 → 0.5.1

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 (334) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/README.md +39 -39
  3. package/dist/add-to-existing.js +1 -1
  4. package/dist/assets/demo-data/initial-data.json +663 -663
  5. package/dist/assets/storefront/components.json +20 -20
  6. package/dist/assets/storefront/eslint.config.mjs +10 -10
  7. package/dist/assets/storefront/graphql.config.yml +1 -1
  8. package/dist/assets/storefront/messages/de.json +2 -0
  9. package/dist/assets/storefront/messages/en.json +2 -0
  10. package/dist/assets/storefront/next.config.ts +5 -4
  11. package/dist/assets/storefront/package.json +1 -1
  12. package/dist/assets/storefront/postcss.config.mjs +1 -1
  13. package/dist/assets/storefront/src/app/[locale]/(catalog)/catalog/page.tsx +17 -21
  14. package/dist/assets/storefront/src/app/[locale]/(catalog)/collection/[slug]/page.tsx +64 -42
  15. package/dist/assets/storefront/src/app/[locale]/(catalog)/layout.tsx +1 -5
  16. package/dist/assets/storefront/src/app/[locale]/(catalog)/product/[slug]/actions.ts +69 -65
  17. package/dist/assets/storefront/src/app/[locale]/(catalog)/product/[slug]/page.tsx +68 -37
  18. package/dist/assets/storefront/src/app/[locale]/(catalog)/search/page.tsx +24 -27
  19. package/dist/assets/storefront/src/app/[locale]/(catalog)/search/search-results.tsx +11 -9
  20. package/dist/assets/storefront/src/app/[locale]/(catalog)/search/search-term.tsx +4 -4
  21. package/dist/assets/storefront/src/app/[locale]/(scenario)/[...path]/page.tsx +1 -1
  22. package/dist/assets/storefront/src/app/[locale]/accept-invitation/[token]/accept-invitation-client.tsx +8 -13
  23. package/dist/assets/storefront/src/app/[locale]/accept-invitation/[token]/actions.ts +11 -14
  24. package/dist/assets/storefront/src/app/[locale]/accept-invitation/[token]/page.tsx +30 -33
  25. package/dist/assets/storefront/src/app/[locale]/accept-invitation/[token]/sign-out-and-retry.tsx +6 -6
  26. package/dist/assets/storefront/src/app/[locale]/account/addresses/actions.ts +30 -45
  27. package/dist/assets/storefront/src/app/[locale]/account/addresses/address-form.tsx +166 -159
  28. package/dist/assets/storefront/src/app/[locale]/account/addresses/addresses-client.tsx +35 -26
  29. package/dist/assets/storefront/src/app/[locale]/account/addresses/loading.tsx +1 -3
  30. package/dist/assets/storefront/src/app/[locale]/account/addresses/page.tsx +16 -18
  31. package/dist/assets/storefront/src/app/[locale]/account/approvals/actions.ts +5 -8
  32. package/dist/assets/storefront/src/app/[locale]/account/approvals/page.tsx +77 -69
  33. package/dist/assets/storefront/src/app/[locale]/account/company/actions.ts +10 -11
  34. package/dist/assets/storefront/src/app/[locale]/account/company/addresses/actions.ts +6 -15
  35. package/dist/assets/storefront/src/app/[locale]/account/company/addresses/address-form.tsx +57 -49
  36. package/dist/assets/storefront/src/app/[locale]/account/company/addresses/addresses-client.tsx +23 -25
  37. package/dist/assets/storefront/src/app/[locale]/account/company/addresses/page.tsx +30 -30
  38. package/dist/assets/storefront/src/app/[locale]/account/company/business-units/actions.ts +20 -29
  39. package/dist/assets/storefront/src/app/[locale]/account/company/business-units/business-unit-form.tsx +32 -37
  40. package/dist/assets/storefront/src/app/[locale]/account/company/business-units/business-units-client.tsx +32 -25
  41. package/dist/assets/storefront/src/app/[locale]/account/company/business-units/page.tsx +24 -24
  42. package/dist/assets/storefront/src/app/[locale]/account/company/business-units/types.ts +7 -4
  43. package/dist/assets/storefront/src/app/[locale]/account/company/edit-company-form.tsx +11 -21
  44. package/dist/assets/storefront/src/app/[locale]/account/company/page.tsx +23 -28
  45. package/dist/assets/storefront/src/app/[locale]/account/company/payment-methods/page.tsx +24 -24
  46. package/dist/assets/storefront/src/app/[locale]/account/company/payment-methods/payment-methods-client.tsx +5 -7
  47. package/dist/assets/storefront/src/app/[locale]/account/company/roles/page.tsx +22 -25
  48. package/dist/assets/storefront/src/app/[locale]/account/company/roles/roles-client.tsx +11 -26
  49. package/dist/assets/storefront/src/app/[locale]/account/company/tax-ids/actions.ts +6 -10
  50. package/dist/assets/storefront/src/app/[locale]/account/company/tax-ids/page.tsx +18 -16
  51. package/dist/assets/storefront/src/app/[locale]/account/company/tax-ids/tax-ids-client.tsx +74 -67
  52. package/dist/assets/storefront/src/app/[locale]/account/company/users/actions.ts +16 -25
  53. package/dist/assets/storefront/src/app/[locale]/account/company/users/edit-user-form.tsx +27 -25
  54. package/dist/assets/storefront/src/app/[locale]/account/company/users/invite-user-form.tsx +27 -19
  55. package/dist/assets/storefront/src/app/[locale]/account/company/users/page.tsx +32 -29
  56. package/dist/assets/storefront/src/app/[locale]/account/company/users/users-client.tsx +35 -38
  57. package/dist/assets/storefront/src/app/[locale]/account/error.tsx +1 -3
  58. package/dist/assets/storefront/src/app/[locale]/account/layout.tsx +16 -22
  59. package/dist/assets/storefront/src/app/[locale]/account/orders/[code]/page.tsx +151 -103
  60. package/dist/assets/storefront/src/app/[locale]/account/orders/[code]/reorder-actions.ts +6 -7
  61. package/dist/assets/storefront/src/app/[locale]/account/orders/[code]/reorder-dialog.tsx +22 -48
  62. package/dist/assets/storefront/src/app/[locale]/account/orders/loading.tsx +8 -8
  63. package/dist/assets/storefront/src/app/[locale]/account/orders/page.tsx +101 -61
  64. package/dist/assets/storefront/src/app/[locale]/account/profile/actions.ts +32 -23
  65. package/dist/assets/storefront/src/app/[locale]/account/profile/change-password-form.tsx +6 -16
  66. package/dist/assets/storefront/src/app/[locale]/account/profile/edit-email-form.tsx +7 -17
  67. package/dist/assets/storefront/src/app/[locale]/account/profile/edit-profile-form.tsx +6 -16
  68. package/dist/assets/storefront/src/app/[locale]/account/profile/loading.tsx +12 -18
  69. package/dist/assets/storefront/src/app/[locale]/account/profile/page.tsx +15 -15
  70. package/dist/assets/storefront/src/app/[locale]/account/quick-order/file-upload-tab.tsx +2 -6
  71. package/dist/assets/storefront/src/app/[locale]/account/quick-order/manual-entry-tab.tsx +18 -15
  72. package/dist/assets/storefront/src/app/[locale]/account/quick-order/page.tsx +3 -6
  73. package/dist/assets/storefront/src/app/[locale]/account/quick-order/preview-table.tsx +10 -2
  74. package/dist/assets/storefront/src/app/[locale]/account/quick-order/save-to-list-dialog.tsx +24 -26
  75. package/dist/assets/storefront/src/app/[locale]/account/quick-order/sku-autocomplete.tsx +19 -10
  76. package/dist/assets/storefront/src/app/[locale]/account/quick-order/text-input-tab.tsx +3 -8
  77. package/dist/assets/storefront/src/app/[locale]/account/quotes/[id]/page.tsx +86 -59
  78. package/dist/assets/storefront/src/app/[locale]/account/quotes/actions.ts +38 -45
  79. package/dist/assets/storefront/src/app/[locale]/account/quotes/new/new-quote-form.tsx +3 -5
  80. package/dist/assets/storefront/src/app/[locale]/account/quotes/new/page.tsx +6 -6
  81. package/dist/assets/storefront/src/app/[locale]/account/quotes/page.tsx +92 -59
  82. package/dist/assets/storefront/src/app/[locale]/account/shared-carts/[id]/activity-feed.tsx +152 -0
  83. package/dist/assets/storefront/src/app/[locale]/account/shared-carts/[id]/add-item-search.tsx +132 -0
  84. package/dist/assets/storefront/src/app/[locale]/account/shared-carts/[id]/add-member-form.tsx +140 -0
  85. package/dist/assets/storefront/src/app/[locale]/account/shared-carts/[id]/members-panel.tsx +259 -0
  86. package/dist/assets/storefront/src/app/[locale]/account/shared-carts/[id]/page.tsx +55 -0
  87. package/dist/assets/storefront/src/app/[locale]/account/shared-carts/[id]/rename-dialog.tsx +117 -0
  88. package/dist/assets/storefront/src/app/[locale]/account/shared-carts/[id]/shared-cart-detail-client.tsx +555 -0
  89. package/dist/assets/storefront/src/app/[locale]/account/shared-carts/actions.ts +305 -0
  90. package/dist/assets/storefront/src/app/[locale]/account/shared-carts/new/new-shared-cart-form.tsx +84 -0
  91. package/dist/assets/storefront/src/app/[locale]/account/shared-carts/new/page.tsx +47 -0
  92. package/dist/assets/storefront/src/app/[locale]/account/shared-carts/page.tsx +276 -0
  93. package/dist/assets/storefront/src/app/[locale]/account/shopping-lists/[id]/page.tsx +22 -8
  94. package/dist/assets/storefront/src/app/[locale]/account/shopping-lists/[id]/shopping-list-detail-client.tsx +62 -49
  95. package/dist/assets/storefront/src/app/[locale]/account/shopping-lists/actions.ts +9 -4
  96. package/dist/assets/storefront/src/app/[locale]/account/shopping-lists/create-shopping-list-form.tsx +5 -11
  97. package/dist/assets/storefront/src/app/[locale]/account/shopping-lists/loading.tsx +1 -1
  98. package/dist/assets/storefront/src/app/[locale]/account/shopping-lists/page.tsx +32 -42
  99. package/dist/assets/storefront/src/app/[locale]/account/store-credits/actions.ts +8 -8
  100. package/dist/assets/storefront/src/app/[locale]/account/store-credits/claim-form.tsx +6 -10
  101. package/dist/assets/storefront/src/app/[locale]/account/store-credits/page.tsx +76 -55
  102. package/dist/assets/storefront/src/app/[locale]/account/store-credits/reveal-code.tsx +10 -6
  103. package/dist/assets/storefront/src/app/[locale]/account/verify-email/page.tsx +32 -39
  104. package/dist/assets/storefront/src/app/[locale]/cart/actions.ts +29 -23
  105. package/dist/assets/storefront/src/app/[locale]/cart/cart-items.tsx +111 -40
  106. package/dist/assets/storefront/src/app/[locale]/cart/cart-line-actions.tsx +9 -9
  107. package/dist/assets/storefront/src/app/[locale]/cart/cart-quantity-control.tsx +61 -48
  108. package/dist/assets/storefront/src/app/[locale]/cart/cart-remove-button.tsx +15 -9
  109. package/dist/assets/storefront/src/app/[locale]/cart/cart.tsx +38 -41
  110. package/dist/assets/storefront/src/app/[locale]/cart/code-input.tsx +8 -8
  111. package/dist/assets/storefront/src/app/[locale]/cart/order-summary.tsx +70 -29
  112. package/dist/assets/storefront/src/app/[locale]/cart/page.tsx +11 -11
  113. package/dist/assets/storefront/src/app/[locale]/cart/promotion-code.tsx +48 -42
  114. package/dist/assets/storefront/src/app/[locale]/cart/reapproval-confirm.tsx +22 -20
  115. package/dist/assets/storefront/src/app/[locale]/cart/request-quote-button.tsx +7 -16
  116. package/dist/assets/storefront/src/app/[locale]/checkout/actions.ts +39 -65
  117. package/dist/assets/storefront/src/app/[locale]/checkout/cancel-quote-checkout-button.tsx +5 -5
  118. package/dist/assets/storefront/src/app/[locale]/checkout/checkout-flow.tsx +202 -202
  119. package/dist/assets/storefront/src/app/[locale]/checkout/checkout-provider.tsx +142 -142
  120. package/dist/assets/storefront/src/app/[locale]/checkout/order-summary.tsx +158 -139
  121. package/dist/assets/storefront/src/app/[locale]/checkout/page.tsx +56 -47
  122. package/dist/assets/storefront/src/app/[locale]/checkout/steps/delivery-step.tsx +86 -88
  123. package/dist/assets/storefront/src/app/[locale]/checkout/steps/payment-step.tsx +90 -91
  124. package/dist/assets/storefront/src/app/[locale]/checkout/steps/review-step.tsx +166 -161
  125. package/dist/assets/storefront/src/app/[locale]/checkout/steps/shipping-address-step.tsx +573 -494
  126. package/dist/assets/storefront/src/app/[locale]/error.tsx +3 -5
  127. package/dist/assets/storefront/src/app/[locale]/forgot-password/actions.ts +10 -7
  128. package/dist/assets/storefront/src/app/[locale]/forgot-password/forgot-password-form.tsx +10 -25
  129. package/dist/assets/storefront/src/app/[locale]/forgot-password/page.tsx +5 -5
  130. package/dist/assets/storefront/src/app/[locale]/globals.css +48 -48
  131. package/dist/assets/storefront/src/app/[locale]/layout.tsx +53 -47
  132. package/dist/assets/storefront/src/app/[locale]/not-found.tsx +3 -5
  133. package/dist/assets/storefront/src/app/[locale]/order-confirmation/[code]/order-confirmation.tsx +71 -44
  134. package/dist/assets/storefront/src/app/[locale]/order-confirmation/[code]/page.tsx +7 -5
  135. package/dist/assets/storefront/src/app/[locale]/page.tsx +33 -35
  136. package/dist/assets/storefront/src/app/[locale]/register/actions.ts +7 -7
  137. package/dist/assets/storefront/src/app/[locale]/register/page.tsx +22 -16
  138. package/dist/assets/storefront/src/app/[locale]/register/registration-form.tsx +22 -34
  139. package/dist/assets/storefront/src/app/[locale]/register-company/actions.ts +15 -19
  140. package/dist/assets/storefront/src/app/[locale]/register-company/page.tsx +17 -15
  141. package/dist/assets/storefront/src/app/[locale]/register-company/registration-form.tsx +9 -15
  142. package/dist/assets/storefront/src/app/[locale]/reset-password/actions.ts +7 -8
  143. package/dist/assets/storefront/src/app/[locale]/reset-password/page.tsx +18 -12
  144. package/dist/assets/storefront/src/app/[locale]/reset-password/reset-password-form.tsx +8 -16
  145. package/dist/assets/storefront/src/app/[locale]/shopping-list/[code]/add-to-cart-button.tsx +10 -4
  146. package/dist/assets/storefront/src/app/[locale]/shopping-list/[code]/page.tsx +62 -30
  147. package/dist/assets/storefront/src/app/[locale]/sign-in/actions.ts +14 -16
  148. package/dist/assets/storefront/src/app/[locale]/sign-in/login-form.tsx +17 -30
  149. package/dist/assets/storefront/src/app/[locale]/sign-in/page.tsx +35 -30
  150. package/dist/assets/storefront/src/app/[locale]/verify/actions.ts +8 -8
  151. package/dist/assets/storefront/src/app/[locale]/verify/page.tsx +18 -14
  152. package/dist/assets/storefront/src/app/[locale]/verify/verify-content.tsx +25 -27
  153. package/dist/assets/storefront/src/app/[locale]/verify-pending/page.tsx +23 -23
  154. package/dist/assets/storefront/src/app/api/clear-company-context/route.ts +6 -3
  155. package/dist/assets/storefront/src/app/api/revalidate/route.ts +19 -28
  156. package/dist/assets/storefront/src/app/api/search-analytics/route.ts +1 -1
  157. package/dist/assets/storefront/src/components/commerce/account-nav-items.ts +44 -17
  158. package/dist/assets/storefront/src/components/commerce/account-sidebar.tsx +30 -22
  159. package/dist/assets/storefront/src/components/commerce/active-filters.tsx +1 -1
  160. package/dist/assets/storefront/src/components/commerce/add-to-shared-cart.tsx +247 -0
  161. package/dist/assets/storefront/src/components/commerce/approval-decision-form.tsx +9 -13
  162. package/dist/assets/storefront/src/components/commerce/approval-status-badge.tsx +23 -15
  163. package/dist/assets/storefront/src/components/commerce/business-unit-switcher.tsx +11 -11
  164. package/dist/assets/storefront/src/components/commerce/catalog-search-bar.tsx +2 -2
  165. package/dist/assets/storefront/src/components/commerce/category-product-section.tsx +28 -16
  166. package/dist/assets/storefront/src/components/commerce/category-sidebar.tsx +31 -18
  167. package/dist/assets/storefront/src/components/commerce/collection-hero-banner.tsx +2 -4
  168. package/dist/assets/storefront/src/components/commerce/company-state-badge.tsx +10 -16
  169. package/dist/assets/storefront/src/components/commerce/company-switcher.tsx +12 -12
  170. package/dist/assets/storefront/src/components/commerce/configurator-form.tsx +188 -79
  171. package/dist/assets/storefront/src/components/commerce/facet-filters.tsx +29 -49
  172. package/dist/assets/storefront/src/components/commerce/gift-card-pdp.tsx +4 -4
  173. package/dist/assets/storefront/src/components/commerce/gift-card-product-info.tsx +20 -30
  174. package/dist/assets/storefront/src/components/commerce/instant-search-dropdown.tsx +258 -227
  175. package/dist/assets/storefront/src/components/commerce/order-status-badge.tsx +27 -19
  176. package/dist/assets/storefront/src/components/commerce/packaging-unit-selector.tsx +27 -26
  177. package/dist/assets/storefront/src/components/commerce/permission-gate.tsx +4 -4
  178. package/dist/assets/storefront/src/components/commerce/price-range-filter.tsx +5 -5
  179. package/dist/assets/storefront/src/components/commerce/price-tiers.tsx +38 -21
  180. package/dist/assets/storefront/src/components/commerce/price.tsx +3 -3
  181. package/dist/assets/storefront/src/components/commerce/product-card-list.tsx +35 -14
  182. package/dist/assets/storefront/src/components/commerce/product-card.tsx +31 -16
  183. package/dist/assets/storefront/src/components/commerce/product-carousel.tsx +20 -12
  184. package/dist/assets/storefront/src/components/commerce/product-grid.tsx +14 -13
  185. package/dist/assets/storefront/src/components/commerce/product-image-carousel.tsx +10 -8
  186. package/dist/assets/storefront/src/components/commerce/product-info.tsx +129 -72
  187. package/dist/assets/storefront/src/components/commerce/product-list-expansion.tsx +102 -74
  188. package/dist/assets/storefront/src/components/commerce/product-list-view.tsx +1 -1
  189. package/dist/assets/storefront/src/components/commerce/product-sidebar.tsx +36 -11
  190. package/dist/assets/storefront/src/components/commerce/product-view-switcher.tsx +33 -21
  191. package/dist/assets/storefront/src/components/commerce/quote-action-buttons.tsx +54 -36
  192. package/dist/assets/storefront/src/components/commerce/quote-activity-timeline.tsx +126 -50
  193. package/dist/assets/storefront/src/components/commerce/quote-comment-form.tsx +9 -13
  194. package/dist/assets/storefront/src/components/commerce/quote-csv-export-button.tsx +6 -6
  195. package/dist/assets/storefront/src/components/commerce/quote-product-search.tsx +22 -18
  196. package/dist/assets/storefront/src/components/commerce/quote-request-form.tsx +28 -27
  197. package/dist/assets/storefront/src/components/commerce/quote-status-badge.tsx +26 -18
  198. package/dist/assets/storefront/src/components/commerce/quote-validity-indicator.tsx +7 -7
  199. package/dist/assets/storefront/src/components/commerce/quote-version-comparison.tsx +50 -30
  200. package/dist/assets/storefront/src/components/commerce/related-products.tsx +37 -28
  201. package/dist/assets/storefront/src/components/commerce/shared-cart-role.ts +39 -0
  202. package/dist/assets/storefront/src/components/commerce/shared-cart-status-badge.tsx +28 -0
  203. package/dist/assets/storefront/src/components/commerce/shop-by-category.tsx +8 -7
  204. package/dist/assets/storefront/src/components/commerce/shopping-list-toggle.tsx +14 -20
  205. package/dist/assets/storefront/src/components/commerce/sort-dropdown.tsx +9 -16
  206. package/dist/assets/storefront/src/components/commerce/store-credit-summary.tsx +30 -32
  207. package/dist/assets/storefront/src/components/commerce/subcollection-tiles.tsx +11 -13
  208. package/dist/assets/storefront/src/components/layout/auth-page-shell.tsx +2 -2
  209. package/dist/assets/storefront/src/components/layout/draft-mode-indicator.tsx +2 -7
  210. package/dist/assets/storefront/src/components/layout/draft-mode-link.tsx +4 -2
  211. package/dist/assets/storefront/src/components/layout/footer.tsx +70 -28
  212. package/dist/assets/storefront/src/components/layout/navbar/actions.ts +9 -12
  213. package/dist/assets/storefront/src/components/layout/navbar/cart-icon.tsx +9 -9
  214. package/dist/assets/storefront/src/components/layout/navbar/channel-picker-wrapper.tsx +4 -9
  215. package/dist/assets/storefront/src/components/layout/navbar/channel-picker.tsx +13 -8
  216. package/dist/assets/storefront/src/components/layout/navbar/currency-picker-wrapper.tsx +4 -4
  217. package/dist/assets/storefront/src/components/layout/navbar/currency-picker.tsx +11 -6
  218. package/dist/assets/storefront/src/components/layout/navbar/language-picker.tsx +7 -7
  219. package/dist/assets/storefront/src/components/layout/navbar/login-button.tsx +24 -21
  220. package/dist/assets/storefront/src/components/layout/navbar/mobile-nav.tsx +8 -8
  221. package/dist/assets/storefront/src/components/layout/navbar/nav-menu-items.tsx +4 -6
  222. package/dist/assets/storefront/src/components/layout/navbar/navbar-cart.tsx +1 -1
  223. package/dist/assets/storefront/src/components/layout/navbar/navbar-collections.tsx +41 -42
  224. package/dist/assets/storefront/src/components/layout/navbar/navbar-link.tsx +7 -10
  225. package/dist/assets/storefront/src/components/layout/navbar/navbar-user.tsx +18 -23
  226. package/dist/assets/storefront/src/components/layout/navbar/theme-switcher.tsx +9 -9
  227. package/dist/assets/storefront/src/components/layout/navbar.tsx +36 -31
  228. package/dist/assets/storefront/src/components/layout/search-input.tsx +35 -32
  229. package/dist/assets/storefront/src/components/providers/awaiting-approval-banner.tsx +12 -10
  230. package/dist/assets/storefront/src/components/providers/cart-count-server.tsx +14 -12
  231. package/dist/assets/storefront/src/components/providers/company-context-guard.tsx +4 -4
  232. package/dist/assets/storefront/src/components/providers/company-permissions-server.tsx +2 -6
  233. package/dist/assets/storefront/src/components/providers/theme-provider.tsx +3 -3
  234. package/dist/assets/storefront/src/components/shared/breadcrumbs.tsx +4 -1
  235. package/dist/assets/storefront/src/components/shared/country-select.tsx +63 -67
  236. package/dist/assets/storefront/src/components/shared/pagination.tsx +15 -28
  237. package/dist/assets/storefront/src/components/shared/prefetch-link.tsx +1 -1
  238. package/dist/assets/storefront/src/components/shared/skeletons/search-input-skeleton.tsx +1 -3
  239. package/dist/assets/storefront/src/components/ui/accordion.tsx +46 -51
  240. package/dist/assets/storefront/src/components/ui/alert-dialog.tsx +94 -121
  241. package/dist/assets/storefront/src/components/ui/alert.tsx +48 -54
  242. package/dist/assets/storefront/src/components/ui/aspect-ratio.tsx +5 -7
  243. package/dist/assets/storefront/src/components/ui/avatar.tsx +29 -44
  244. package/dist/assets/storefront/src/components/ui/badge.tsx +28 -37
  245. package/dist/assets/storefront/src/components/ui/breadcrumb.tsx +82 -89
  246. package/dist/assets/storefront/src/components/ui/button.tsx +43 -49
  247. package/dist/assets/storefront/src/components/ui/calendar.tsx +157 -198
  248. package/dist/assets/storefront/src/components/ui/card.tsx +53 -76
  249. package/dist/assets/storefront/src/components/ui/carousel.tsx +194 -212
  250. package/dist/assets/storefront/src/components/ui/chart.tsx +274 -317
  251. package/dist/assets/storefront/src/components/ui/checkbox.tsx +24 -27
  252. package/dist/assets/storefront/src/components/ui/collapsible.tsx +9 -21
  253. package/dist/assets/storefront/src/components/ui/command.tsx +114 -159
  254. package/dist/assets/storefront/src/components/ui/context-menu.tsx +167 -199
  255. package/dist/assets/storefront/src/components/ui/dialog.tsx +97 -114
  256. package/dist/assets/storefront/src/components/ui/drawer.tsx +93 -107
  257. package/dist/assets/storefront/src/components/ui/dropdown-menu.tsx +171 -206
  258. package/dist/assets/storefront/src/components/ui/empty-state.tsx +5 -5
  259. package/dist/assets/storefront/src/components/ui/field.tsx +196 -208
  260. package/dist/assets/storefront/src/components/ui/form.tsx +115 -139
  261. package/dist/assets/storefront/src/components/ui/hover-card.tsx +27 -33
  262. package/dist/assets/storefront/src/components/ui/input-otp.tsx +50 -59
  263. package/dist/assets/storefront/src/components/ui/input.tsx +17 -17
  264. package/dist/assets/storefront/src/components/ui/kbd-shortcut.tsx +3 -1
  265. package/dist/assets/storefront/src/components/ui/label.tsx +16 -19
  266. package/dist/assets/storefront/src/components/ui/menubar.tsx +193 -223
  267. package/dist/assets/storefront/src/components/ui/navigation-menu.tsx +123 -130
  268. package/dist/assets/storefront/src/components/ui/pagination.tsx +87 -108
  269. package/dist/assets/storefront/src/components/ui/popover.tsx +29 -35
  270. package/dist/assets/storefront/src/components/ui/progress.tsx +19 -26
  271. package/dist/assets/storefront/src/components/ui/radio-group.tsx +32 -38
  272. package/dist/assets/storefront/src/components/ui/resizable.tsx +37 -42
  273. package/dist/assets/storefront/src/components/ui/scroll-area.tsx +41 -47
  274. package/dist/assets/storefront/src/components/ui/select.tsx +130 -152
  275. package/dist/assets/storefront/src/components/ui/separator.tsx +21 -21
  276. package/dist/assets/storefront/src/components/ui/sheet.tsx +90 -111
  277. package/dist/assets/storefront/src/components/ui/sidebar.tsx +611 -649
  278. package/dist/assets/storefront/src/components/ui/skeleton.tsx +10 -10
  279. package/dist/assets/storefront/src/components/ui/slider.tsx +50 -55
  280. package/dist/assets/storefront/src/components/ui/sonner.tsx +20 -20
  281. package/dist/assets/storefront/src/components/ui/switch.tsx +23 -26
  282. package/dist/assets/storefront/src/components/ui/table.tsx +65 -97
  283. package/dist/assets/storefront/src/components/ui/tabs.tsx +39 -55
  284. package/dist/assets/storefront/src/components/ui/textarea.tsx +14 -14
  285. package/dist/assets/storefront/src/components/ui/toggle-group.tsx +56 -62
  286. package/dist/assets/storefront/src/components/ui/toggle.tsx +37 -38
  287. package/dist/assets/storefront/src/components/ui/tooltip.tsx +38 -46
  288. package/dist/assets/storefront/src/config/scenario-meta.ts +2 -2
  289. package/dist/assets/storefront/src/config/scenario.ts +14 -16
  290. package/dist/assets/storefront/src/contexts/auth-context.tsx +5 -6
  291. package/dist/assets/storefront/src/graphql-env.d.ts +18 -5
  292. package/dist/assets/storefront/src/graphql.ts +5 -5
  293. package/dist/assets/storefront/src/hooks/use-mobile.ts +13 -13
  294. package/dist/assets/storefront/src/i18n/locale-utils.ts +3 -3
  295. package/dist/assets/storefront/src/i18n/navigation.ts +4 -4
  296. package/dist/assets/storefront/src/i18n/request.ts +4 -4
  297. package/dist/assets/storefront/src/i18n/routing.ts +5 -5
  298. package/dist/assets/storefront/src/i18n/server.ts +3 -3
  299. package/dist/assets/storefront/src/lib/actions/switch-channel.ts +9 -9
  300. package/dist/assets/storefront/src/lib/actions/switch-currency.ts +7 -7
  301. package/dist/assets/storefront/src/lib/auth.ts +1 -1
  302. package/dist/assets/storefront/src/lib/backend-health.ts +3 -3
  303. package/dist/assets/storefront/src/lib/cart-count-context.tsx +10 -4
  304. package/dist/assets/storefront/src/lib/cart-guard-utils.ts +2 -1
  305. package/dist/assets/storefront/src/lib/cart-guard.ts +7 -6
  306. package/dist/assets/storefront/src/lib/channel-server.ts +4 -4
  307. package/dist/assets/storefront/src/lib/company-context.ts +1 -1
  308. package/dist/assets/storefront/src/lib/company-permissions-context.tsx +1 -5
  309. package/dist/assets/storefront/src/lib/currency-server.ts +4 -4
  310. package/dist/assets/storefront/src/lib/format.ts +16 -7
  311. package/dist/assets/storefront/src/lib/metadata.ts +39 -44
  312. package/dist/assets/storefront/src/lib/quantity.ts +2 -4
  313. package/dist/assets/storefront/src/lib/search-bar-context.tsx +7 -4
  314. package/dist/assets/storefront/src/lib/use-recent-searches.ts +8 -6
  315. package/dist/assets/storefront/src/lib/utils.ts +3 -3
  316. package/dist/assets/storefront/src/lib/vendure/actions.ts +18 -16
  317. package/dist/assets/storefront/src/lib/vendure/api.ts +44 -27
  318. package/dist/assets/storefront/src/lib/vendure/approval-utils.ts +9 -8
  319. package/dist/assets/storefront/src/lib/vendure/cached.ts +20 -15
  320. package/dist/assets/storefront/src/lib/vendure/mutations.ts +96 -0
  321. package/dist/assets/storefront/src/lib/vendure/queries.ts +157 -5
  322. package/dist/assets/storefront/src/middleware.ts +1 -1
  323. package/dist/assets/storefront/src/scenarios/customer/hero.tsx +2 -2
  324. package/dist/assets/storefront/src/scenarios/customer/meta.ts +1 -1
  325. package/dist/assets/storefront/src/schema.graphql +134 -0
  326. package/dist/bin/run.js +1 -1
  327. package/dist/cli.d.ts +1 -1
  328. package/dist/index.d.ts +5 -5
  329. package/dist/index.js +1 -1
  330. package/dist/plugin-registry.js +1 -1
  331. package/dist/scaffold-storefront-only.js +1 -1
  332. package/dist/scaffolder.js +1 -1
  333. package/dist/template-renderer.js +1 -1
  334. package/package.json +2 -2
@@ -0,0 +1,276 @@
1
+ import { Price } from '@/components/commerce/price';
2
+ import {
3
+ canCreateSharedCarts,
4
+ canManageSharedCarts,
5
+ roleLabel,
6
+ } from '@/components/commerce/shared-cart-role';
7
+ import { SharedCartStatusBadge } from '@/components/commerce/shared-cart-status-badge';
8
+ import { ErrorState } from '@/components/shared/error-state';
9
+ import { Pagination } from '@/components/shared/pagination';
10
+ import { Badge } from '@/components/ui/badge';
11
+ import { Button } from '@/components/ui/button';
12
+ import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table';
13
+ import { Link, redirect } from '@/i18n/navigation';
14
+ import { formatDate } from '@/lib/format';
15
+ import { cn } from '@/lib/utils';
16
+ import { getActiveCustomer, getCompanyAccount } from '@/lib/vendure/actions';
17
+ import { client } from '@/lib/vendure/api';
18
+ import { GetCompanySharedCartsQuery, GetMySharedCartsQuery } from '@/lib/vendure/queries';
19
+ import { ArrowRight, Plus, ShoppingCart, Users } from 'lucide-react';
20
+ import type { Metadata } from 'next';
21
+ import { setRequestLocale } from 'next-intl/server';
22
+ import { Suspense } from 'react';
23
+
24
+ export const metadata: Metadata = {
25
+ title: 'Shared Carts',
26
+ };
27
+
28
+ const ITEMS_PER_PAGE = 10;
29
+
30
+ export default function SharedCartsPage(props: {
31
+ params: Promise<{ locale: string }>;
32
+ searchParams: Promise<Record<string, string | string[] | undefined>>;
33
+ }) {
34
+ return (
35
+ <Suspense
36
+ fallback={
37
+ <div>
38
+ <div className="flex items-center justify-between mb-6">
39
+ <h1 className="text-3xl font-bold">Shared Carts</h1>
40
+ </div>
41
+ <p className="text-sm text-muted-foreground">Loading shared carts…</p>
42
+ </div>
43
+ }
44
+ >
45
+ <SharedCartsContent params={props.params} searchParamsPromise={props.searchParams} />
46
+ </Suspense>
47
+ );
48
+ }
49
+
50
+ async function SharedCartsContent({
51
+ params,
52
+ searchParamsPromise,
53
+ }: {
54
+ params: Promise<{ locale: string }>;
55
+ searchParamsPromise: Promise<Record<string, string | string[] | undefined>>;
56
+ }) {
57
+ const { locale } = await params;
58
+ setRequestLocale(locale);
59
+ const [searchParams, activeCustomer, companyAccount] = await Promise.all([
60
+ searchParamsPromise,
61
+ getActiveCustomer(),
62
+ getCompanyAccount(),
63
+ ]);
64
+ if (!activeCustomer) return await redirect('/sign-in');
65
+ const canCreate = canCreateSharedCarts(companyAccount?.permissions);
66
+ const isAdmin = canManageSharedCarts(companyAccount?.permissions);
67
+
68
+ // Company admins get a second "All company carts" view; everyone else only ever sees their own.
69
+ const scopeParam = searchParams.scope;
70
+ const scope =
71
+ isAdmin && (Array.isArray(scopeParam) ? scopeParam[0] : scopeParam) === 'company'
72
+ ? 'company'
73
+ : 'mine';
74
+
75
+ const pageParam = searchParams.page;
76
+ const parsedPage = parseInt(Array.isArray(pageParam) ? pageParam[0] : pageParam || '1', 10);
77
+ const currentPage = Number.isFinite(parsedPage) && parsedPage > 0 ? parsedPage : 1;
78
+ const skip = (currentPage - 1) * ITEMS_PER_PAGE;
79
+
80
+ const options = { take: ITEMS_PER_PAGE, skip, sort: { updatedAt: 'DESC' as never } };
81
+ const [result, error] =
82
+ scope === 'company'
83
+ ? await client.query(GetCompanySharedCartsQuery, { options })
84
+ : await client.query(GetMySharedCartsQuery, { options });
85
+
86
+ if (error) {
87
+ return (
88
+ <div>
89
+ <Header canCreate={canCreate} />
90
+ {isAdmin && <ScopeTabs scope={scope} />}
91
+ <ErrorState message="We couldn't load your shared carts. Please try again later." />
92
+ </div>
93
+ );
94
+ }
95
+
96
+ const list =
97
+ 'companySharedCarts' in result.data ? result.data.companySharedCarts : result.data.mySharedCarts;
98
+ const carts = list.items;
99
+ const totalItems = list.totalItems;
100
+ const totalPages = Math.ceil(totalItems / ITEMS_PER_PAGE);
101
+
102
+ return (
103
+ <div>
104
+ <Header canCreate={canCreate} />
105
+ {isAdmin && <ScopeTabs scope={scope} />}
106
+
107
+ {carts.length === 0 ? (
108
+ <EmptyState canCreate={canCreate} scope={scope} />
109
+ ) : (
110
+ <div className="border rounded-lg overflow-hidden">
111
+ <Table>
112
+ <TableHeader className="bg-muted">
113
+ <TableRow>
114
+ <TableHead>Name</TableHead>
115
+ <TableHead>Status</TableHead>
116
+ <TableHead>Your role</TableHead>
117
+ <TableHead>Owner</TableHead>
118
+ <TableHead className="text-center">Members</TableHead>
119
+ <TableHead className="text-center">Items</TableHead>
120
+ <TableHead className="text-right">Total</TableHead>
121
+ <TableHead>Updated</TableHead>
122
+ <TableHead className="w-12" />
123
+ </TableRow>
124
+ </TableHeader>
125
+ <TableBody>
126
+ {carts.map((cart) => {
127
+ const isOwner = cart.owner.id === activeCustomer.id;
128
+ const membership = cart.members.find(
129
+ (m) => m.customer.id === activeCustomer.id,
130
+ );
131
+ const yourRole = isOwner ? 'owner' : membership?.role;
132
+ return (
133
+ <TableRow key={cart.id} className="hover:bg-muted/50">
134
+ <TableCell className="font-medium">
135
+ <Link
136
+ href={`/account/shared-carts/${cart.id}`}
137
+ className="hover:underline underline-offset-4"
138
+ >
139
+ {cart.name}
140
+ </Link>
141
+ </TableCell>
142
+ <TableCell>
143
+ <SharedCartStatusBadge status={cart.status} />
144
+ </TableCell>
145
+ <TableCell>
146
+ {yourRole ? (
147
+ <Badge variant={isOwner ? 'default' : 'outline'}>
148
+ {isOwner ? 'Owner' : roleLabel(yourRole)}
149
+ </Badge>
150
+ ) : (
151
+ <span className="text-muted-foreground">—</span>
152
+ )}
153
+ </TableCell>
154
+ <TableCell>
155
+ {cart.owner.firstName} {cart.owner.lastName}
156
+ </TableCell>
157
+ <TableCell className="text-center tabular-nums">
158
+ {cart.members.length}
159
+ </TableCell>
160
+ <TableCell className="text-center tabular-nums">
161
+ {cart.order.totalQuantity}
162
+ </TableCell>
163
+ <TableCell className="text-right">
164
+ <Price
165
+ value={cart.order.totalWithTax}
166
+ currencyCode={cart.order.currencyCode}
167
+ taxLabel="incl"
168
+ />
169
+ </TableCell>
170
+ <TableCell className="text-muted-foreground whitespace-nowrap">
171
+ {formatDate(cart.updatedAt, locale)}
172
+ </TableCell>
173
+ <TableCell>
174
+ <Button asChild variant="ghost" size="icon">
175
+ <Link
176
+ href={`/account/shared-carts/${cart.id}`}
177
+ aria-label={`Open ${cart.name}`}
178
+ >
179
+ <ArrowRight className="h-4 w-4" />
180
+ </Link>
181
+ </Button>
182
+ </TableCell>
183
+ </TableRow>
184
+ );
185
+ })}
186
+ </TableBody>
187
+ </Table>
188
+ </div>
189
+ )}
190
+
191
+ {totalPages > 1 && (
192
+ <div className="mt-6">
193
+ <Pagination currentPage={currentPage} totalPages={totalPages} />
194
+ </div>
195
+ )}
196
+ </div>
197
+ );
198
+ }
199
+
200
+ function Header({ canCreate }: { canCreate: boolean }) {
201
+ return (
202
+ <div className="flex flex-wrap items-start justify-between gap-4 mb-6">
203
+ <div>
204
+ <h1 className="text-3xl font-bold">Shared Carts</h1>
205
+ <p className="text-sm text-muted-foreground mt-1 max-w-prose">
206
+ Build orders together with your colleagues. Add items, set who can edit, and hand off to
207
+ checkout when you&apos;re ready.
208
+ </p>
209
+ </div>
210
+ {canCreate && (
211
+ <Button asChild>
212
+ <Link href="/account/shared-carts/new">
213
+ <Plus className="h-4 w-4 mr-2" />
214
+ New shared cart
215
+ </Link>
216
+ </Button>
217
+ )}
218
+ </div>
219
+ );
220
+ }
221
+
222
+ // Segmented control letting a company admin switch between their own carts and every cart in the
223
+ // company. Rendered only for admins; the query and access check are enforced server-side.
224
+ function ScopeTabs({ scope }: { scope: 'mine' | 'company' }) {
225
+ const tabClass = (active: boolean) =>
226
+ cn(
227
+ 'px-3 py-1.5 text-sm font-medium rounded-md transition-colors',
228
+ active
229
+ ? 'bg-background shadow-sm text-foreground'
230
+ : 'text-muted-foreground hover:text-foreground',
231
+ );
232
+ return (
233
+ <div className="mb-6 inline-flex rounded-lg border bg-muted p-1">
234
+ <Link href="/account/shared-carts" className={tabClass(scope === 'mine')}>
235
+ My carts
236
+ </Link>
237
+ <Link href="/account/shared-carts?scope=company" className={tabClass(scope === 'company')}>
238
+ All company carts
239
+ </Link>
240
+ </div>
241
+ );
242
+ }
243
+
244
+ function EmptyState({ canCreate, scope }: { canCreate: boolean; scope: 'mine' | 'company' }) {
245
+ return (
246
+ <div className="border border-dashed rounded-lg py-16 px-6 text-center">
247
+ <div className="mx-auto mb-4 flex h-12 w-12 items-center justify-center rounded-full bg-muted">
248
+ <Users className="h-6 w-6 text-muted-foreground" />
249
+ </div>
250
+ <h2 className="text-lg font-semibold">No shared carts yet</h2>
251
+ <p className="text-sm text-muted-foreground mt-1 mx-auto max-w-sm">
252
+ {scope === 'company'
253
+ ? 'No one in your company has created a shared cart yet.'
254
+ : canCreate
255
+ ? 'Start a cart your team can build together, or share your current cart from the cart page.'
256
+ : "You're not a member of any shared carts yet. A colleague can add you to one."}
257
+ </p>
258
+ {canCreate && (
259
+ <div className="mt-6 flex items-center justify-center gap-3">
260
+ <Button asChild>
261
+ <Link href="/account/shared-carts/new">
262
+ <Plus className="h-4 w-4 mr-2" />
263
+ New shared cart
264
+ </Link>
265
+ </Button>
266
+ <Button asChild variant="outline">
267
+ <Link href="/cart">
268
+ <ShoppingCart className="h-4 w-4 mr-2" />
269
+ Go to cart
270
+ </Link>
271
+ </Button>
272
+ </div>
273
+ )}
274
+ </div>
275
+ );
276
+ }
@@ -1,26 +1,40 @@
1
- import type { Metadata } from 'next';
2
- import { Suspense } from 'react';
1
+ import { redirect } from '@/i18n/navigation';
2
+ import { getActiveChannelToken } from '@/lib/channel-server';
3
3
  import { getActiveCustomer } from '@/lib/vendure/actions';
4
4
  import { getActiveChannelCached } from '@/lib/vendure/cached';
5
- import { getActiveChannelToken } from '@/lib/channel-server';
6
- import { getActiveUserShoppingList, getActiveUserShoppingLists } from '../actions';
5
+ import type { Metadata } from 'next';
7
6
  import { notFound } from 'next/navigation';
8
- import { redirect } from '@/i18n/navigation';
7
+ import { Suspense } from 'react';
8
+ import { getActiveUserShoppingList, getActiveUserShoppingLists } from '../actions';
9
9
  import { ShoppingListDetailClient } from './shopping-list-detail-client';
10
10
 
11
11
  export const metadata: Metadata = {
12
12
  title: 'Shopping List',
13
13
  };
14
14
 
15
- export default async function ShoppingListDetailPage({ params }: { params: Promise<{ locale: string; id: string }> }) {
15
+ export default async function ShoppingListDetailPage({
16
+ params,
17
+ }: {
18
+ params: Promise<{ locale: string; id: string }>;
19
+ }) {
16
20
  return (
17
- <Suspense fallback={<div className="flex items-center justify-center py-12"><p className="text-sm text-muted-foreground">Loading...</p></div>}>
21
+ <Suspense
22
+ fallback={
23
+ <div className="flex items-center justify-center py-12">
24
+ <p className="text-sm text-muted-foreground">Loading...</p>
25
+ </div>
26
+ }
27
+ >
18
28
  <ShoppingListDetailContent paramsPromise={params} />
19
29
  </Suspense>
20
30
  );
21
31
  }
22
32
 
23
- async function ShoppingListDetailContent({ paramsPromise }: { paramsPromise: Promise<{ locale: string; id: string }> }) {
33
+ async function ShoppingListDetailContent({
34
+ paramsPromise,
35
+ }: {
36
+ paramsPromise: Promise<{ locale: string; id: string }>;
37
+ }) {
24
38
  const { id } = await paramsPromise;
25
39
 
26
40
  const customer = await getActiveCustomer();
@@ -1,21 +1,6 @@
1
1
  'use client';
2
2
 
3
- import { useCallback, useRef, useState, useTransition } from 'react';
4
- import { useLocale, useTranslations } from 'next-intl';
5
- import { useRouter } from '@/i18n/navigation';
6
- import Image from 'next/image';
7
- import {Link} from '@/i18n/navigation';
8
- import { Button } from '@/components/ui/button';
9
- import { Input } from '@/components/ui/input';
10
- import { Switch } from '@/components/ui/switch';
11
- import { Badge } from '@/components/ui/badge';
12
- import { Label } from '@/components/ui/label';
13
- import {
14
- DropdownMenu,
15
- DropdownMenuContent,
16
- DropdownMenuItem,
17
- DropdownMenuTrigger,
18
- } from '@/components/ui/dropdown-menu';
3
+ import { Price } from '@/components/commerce/price';
19
4
  import {
20
5
  AlertDialog,
21
6
  AlertDialogAction,
@@ -27,30 +12,44 @@ import {
27
12
  AlertDialogTitle,
28
13
  AlertDialogTrigger,
29
14
  } from '@/components/ui/alert-dialog';
15
+ import { Badge } from '@/components/ui/badge';
16
+ import { Button } from '@/components/ui/button';
17
+ import {
18
+ DropdownMenu,
19
+ DropdownMenuContent,
20
+ DropdownMenuItem,
21
+ DropdownMenuTrigger,
22
+ } from '@/components/ui/dropdown-menu';
23
+ import { Input } from '@/components/ui/input';
24
+ import { Label } from '@/components/ui/label';
25
+ import { Switch } from '@/components/ui/switch';
26
+ import { Textarea } from '@/components/ui/textarea';
27
+ import { Link, useRouter } from '@/i18n/navigation';
28
+ import { formatDate } from '@/lib/format';
30
29
  import {
31
30
  ArrowLeft,
31
+ Check,
32
32
  Copy,
33
- MoreHorizontal,
33
+ MessageSquare,
34
34
  Minus,
35
+ MoreHorizontal,
36
+ MoveRight,
35
37
  Pencil,
36
38
  Plus,
37
39
  ShoppingCart,
38
40
  Trash2,
39
- MoveRight,
40
- Check,
41
- MessageSquare,
42
41
  } from 'lucide-react';
43
- import { Price } from '@/components/commerce/price';
44
- import { formatDate } from '@/lib/format';
42
+ import { useLocale, useTranslations } from 'next-intl';
43
+ import Image from 'next/image';
44
+ import { useCallback, useRef, useState, useTransition } from 'react';
45
45
  import { toast } from 'sonner';
46
- import { Textarea } from '@/components/ui/textarea';
47
46
  import {
48
- updateShoppingList,
49
- deleteShoppingList,
50
- setShoppingListVisibility,
51
- removeFromShoppingList,
52
47
  addShoppingListItemsToOrder,
48
+ deleteShoppingList,
53
49
  moveShoppingListItems,
50
+ removeFromShoppingList,
51
+ setShoppingListVisibility,
52
+ updateShoppingList,
54
53
  updateShoppingListItem,
55
54
  } from '../actions';
56
55
 
@@ -224,7 +223,11 @@ function ItemNoteEditor({
224
223
  );
225
224
  }
226
225
 
227
- export function ShoppingListDetailClient({ shoppingList, otherShoppingLists, currencyCode }: ShoppingListDetailClientProps) {
226
+ export function ShoppingListDetailClient({
227
+ shoppingList,
228
+ otherShoppingLists,
229
+ currencyCode,
230
+ }: ShoppingListDetailClientProps) {
228
231
  const tRoot = useTranslations('ShoppingLists');
229
232
  const t = useTranslations('ShoppingLists.detail');
230
233
  const router = useRouter();
@@ -412,7 +415,7 @@ export function ShoppingListDetailClient({ shoppingList, otherShoppingLists, cur
412
415
  <AlertDialogHeader>
413
416
  <AlertDialogTitle>{t('deleteDialogTitle')}</AlertDialogTitle>
414
417
  <AlertDialogDescription>
415
- {t('deleteDialogDescription', {name: shoppingList.name})}
418
+ {t('deleteDialogDescription', { name: shoppingList.name })}
416
419
  </AlertDialogDescription>
417
420
  </AlertDialogHeader>
418
421
  <AlertDialogFooter>
@@ -435,13 +438,13 @@ export function ShoppingListDetailClient({ shoppingList, otherShoppingLists, cur
435
438
  {items.length > 0 && (
436
439
  <div className="flex items-center justify-between mb-4">
437
440
  <p className="text-sm text-muted-foreground">
438
- {tRoot('itemCount', {count: shoppingList.totalItems})}
441
+ {tRoot('itemCount', { count: shoppingList.totalItems })}
439
442
  </p>
440
443
  <Button onClick={handleAddAllToCart} disabled={isPending || inStockItems.length === 0}>
441
444
  <ShoppingCart className="mr-2 h-4 w-4" />
442
445
  {inStockItems.length === items.length
443
446
  ? t('addAllToCartButton')
444
- : t('addInStockToCartButton', {count: inStockItems.length})}
447
+ : t('addInStockToCartButton', { count: inStockItems.length })}
445
448
  </Button>
446
449
  </div>
447
450
  )}
@@ -457,15 +460,15 @@ export function ShoppingListDetailClient({ shoppingList, otherShoppingLists, cur
457
460
  ) : (
458
461
  <div className="space-y-4">
459
462
  {items.map((item) => (
460
- <div
461
- key={item.id}
462
- className="flex items-center gap-4 border rounded-lg p-4"
463
- >
463
+ <div key={item.id} className="flex items-center gap-4 border rounded-lg p-4">
464
464
  {/* Thumbnail */}
465
465
  <Link href={`/product/${item.productVariant.product.slug}`} className="shrink-0">
466
466
  {item.productVariant.product.featuredAsset ? (
467
467
  <Image
468
- src={item.productVariant.product.featuredAsset.preview + '?preset=thumb'}
468
+ src={
469
+ item.productVariant.product.featuredAsset.preview +
470
+ '?preset=thumb'
471
+ }
469
472
  alt={item.productVariant.product.name}
470
473
  width={80}
471
474
  height={80}
@@ -486,14 +489,19 @@ export function ShoppingListDetailClient({ shoppingList, otherShoppingLists, cur
486
489
  </Link>
487
490
  <p className="text-sm text-muted-foreground">{item.productVariant.name}</p>
488
491
  <div className="flex items-center gap-2 mt-1">
489
- <Price value={item.productVariant.priceWithTax} currencyCode={currencyCode} />
492
+ <Price
493
+ value={item.productVariant.priceWithTax}
494
+ currencyCode={currencyCode}
495
+ />
490
496
  {item.purchased && (
491
497
  <Badge variant="secondary">{t('purchasedBadge')}</Badge>
492
498
  )}
493
499
  {item.productVariant.stockLevel === OUT_OF_STOCK ? (
494
500
  <Badge variant="destructive">{t('outOfStockBadge')}</Badge>
495
501
  ) : (
496
- <Badge variant="outline" className="text-green-600 border-green-600">{t('inStockBadge')}</Badge>
502
+ <Badge variant="outline" className="text-green-600 border-green-600">
503
+ {t('inStockBadge')}
504
+ </Badge>
497
505
  )}
498
506
  </div>
499
507
  <ItemQuantityControl
@@ -511,7 +519,7 @@ export function ShoppingListDetailClient({ shoppingList, otherShoppingLists, cur
511
519
  disabled={isPending}
512
520
  />
513
521
  <p className="text-xs text-muted-foreground mt-1">
514
- {t('addedDate', {date: formatDate(item.createdAt, locale)})}
522
+ {t('addedDate', { date: formatDate(item.createdAt, locale) })}
515
523
  </p>
516
524
  </div>
517
525
 
@@ -522,7 +530,11 @@ export function ShoppingListDetailClient({ shoppingList, otherShoppingLists, cur
522
530
  size="sm"
523
531
  onClick={() => handleAddItemToCart(item.id)}
524
532
  disabled={isPending || item.productVariant.stockLevel === OUT_OF_STOCK}
525
- title={item.productVariant.stockLevel === OUT_OF_STOCK ? t('outOfStockTitle') : t('addToCartTitle')}
533
+ title={
534
+ item.productVariant.stockLevel === OUT_OF_STOCK
535
+ ? t('outOfStockTitle')
536
+ : t('addToCartTitle')
537
+ }
526
538
  >
527
539
  <ShoppingCart className="h-4 w-4" />
528
540
  </Button>
@@ -534,15 +546,16 @@ export function ShoppingListDetailClient({ shoppingList, otherShoppingLists, cur
534
546
  </Button>
535
547
  </DropdownMenuTrigger>
536
548
  <DropdownMenuContent align="end">
537
- {otherShoppingLists.length > 0 && otherShoppingLists.map((target) => (
538
- <DropdownMenuItem
539
- key={target.id}
540
- onClick={() => handleMoveItem(item.id, target.id)}
541
- >
542
- <MoveRight className="mr-2 h-4 w-4" />
543
- {t('moveToMenuItem', {listName: target.name})}
544
- </DropdownMenuItem>
545
- ))}
549
+ {otherShoppingLists.length > 0 &&
550
+ otherShoppingLists.map((target) => (
551
+ <DropdownMenuItem
552
+ key={target.id}
553
+ onClick={() => handleMoveItem(item.id, target.id)}
554
+ >
555
+ <MoveRight className="mr-2 h-4 w-4" />
556
+ {t('moveToMenuItem', { listName: target.name })}
557
+ </DropdownMenuItem>
558
+ ))}
546
559
  <DropdownMenuItem
547
560
  onClick={() => handleRemoveItem(item.id)}
548
561
  className="text-destructive"
@@ -1,12 +1,13 @@
1
1
  'use server';
2
2
 
3
3
  import { FragmentOf, readFragment } from '@/graphql';
4
+ import { redirect } from '@/i18n/navigation';
4
5
  import { getAuthToken, setAuthToken } from '@/lib/auth';
5
6
  import { client } from '@/lib/vendure/api';
6
7
  import { ShoppingListFragment, ShoppingListItemFragment } from '@/lib/vendure/fragments';
7
8
  import {
8
- AddToShoppingListMutation,
9
9
  AddShoppingListItemsToOrderMutation,
10
+ AddToShoppingListMutation,
10
11
  CreateShoppingListMutation,
11
12
  DeleteShoppingListMutation,
12
13
  MoveShoppingListItemsMutation,
@@ -22,7 +23,6 @@ import {
22
23
  GetShoppingListsWithItemVariantsQuery,
23
24
  } from '@/lib/vendure/queries';
24
25
  import { updateTag } from 'next/cache';
25
- import { redirect } from '@/i18n/navigation';
26
26
 
27
27
  // --- Data fetching (query + unmask) ---
28
28
 
@@ -162,7 +162,9 @@ export async function createShoppingList(name: string, description?: string) {
162
162
  }
163
163
 
164
164
  export async function updateShoppingList(id: string, name?: string, description?: string) {
165
- const [result, error] = await client.mutate(UpdateShoppingListMutation, { input: { id, name, description } });
165
+ const [result, error] = await client.mutate(UpdateShoppingListMutation, {
166
+ input: { id, name, description },
167
+ });
166
168
 
167
169
  if (error) {
168
170
  return { success: false, error: 'Failed to update shopping list' };
@@ -210,7 +212,10 @@ export async function addShoppingListItemsToOrder(itemIds: string[]) {
210
212
  }
211
213
 
212
214
  export async function moveShoppingListItems(itemIds: string[], targetShoppingListId: string) {
213
- const [result, error] = await client.mutate(MoveShoppingListItemsMutation, { itemIds, targetShoppingListId });
215
+ const [result, error] = await client.mutate(MoveShoppingListItemsMutation, {
216
+ itemIds,
217
+ targetShoppingListId,
218
+ });
214
219
 
215
220
  if (error) {
216
221
  return { success: false, error: 'Failed to move shopping list items' };
@@ -1,21 +1,15 @@
1
1
  'use client';
2
2
 
3
- import { useState, useTransition } from 'react';
4
3
  import { Button } from '@/components/ui/button';
4
+ import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from '@/components/ui/dialog';
5
5
  import { Input } from '@/components/ui/input';
6
6
  import { Label } from '@/components/ui/label';
7
- import {
8
- Dialog,
9
- DialogContent,
10
- DialogHeader,
11
- DialogTitle,
12
- DialogTrigger,
13
- } from '@/components/ui/dialog';
7
+ import { useRouter } from '@/i18n/navigation';
14
8
  import { Plus } from 'lucide-react';
15
- import { createShoppingList } from './actions';
9
+ import { useTranslations } from 'next-intl';
10
+ import { useState, useTransition } from 'react';
16
11
  import { toast } from 'sonner';
17
- import { useRouter } from '@/i18n/navigation';
18
- import {useTranslations} from 'next-intl';
12
+ import { createShoppingList } from './actions';
19
13
 
20
14
  export function CreateShoppingListForm() {
21
15
  const tRoot = useTranslations('ShoppingLists');
@@ -1,5 +1,5 @@
1
- import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table';
2
1
  import { Skeleton } from '@/components/ui/skeleton';
2
+ import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table';
3
3
 
4
4
  export default function ShoppingListsLoading() {
5
5
  return (