@vendure-platform/create 0.5.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 (325) hide show
  1. package/CHANGELOG.md +4 -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/next.config.ts +5 -4
  9. package/dist/assets/storefront/package.json +1 -1
  10. package/dist/assets/storefront/postcss.config.mjs +1 -1
  11. package/dist/assets/storefront/src/app/[locale]/(catalog)/catalog/page.tsx +17 -21
  12. package/dist/assets/storefront/src/app/[locale]/(catalog)/collection/[slug]/page.tsx +64 -42
  13. package/dist/assets/storefront/src/app/[locale]/(catalog)/layout.tsx +1 -5
  14. package/dist/assets/storefront/src/app/[locale]/(catalog)/product/[slug]/actions.ts +69 -65
  15. package/dist/assets/storefront/src/app/[locale]/(catalog)/product/[slug]/page.tsx +64 -38
  16. package/dist/assets/storefront/src/app/[locale]/(catalog)/search/page.tsx +24 -27
  17. package/dist/assets/storefront/src/app/[locale]/(catalog)/search/search-results.tsx +11 -9
  18. package/dist/assets/storefront/src/app/[locale]/(catalog)/search/search-term.tsx +4 -4
  19. package/dist/assets/storefront/src/app/[locale]/(scenario)/[...path]/page.tsx +1 -1
  20. package/dist/assets/storefront/src/app/[locale]/accept-invitation/[token]/accept-invitation-client.tsx +8 -13
  21. package/dist/assets/storefront/src/app/[locale]/accept-invitation/[token]/actions.ts +11 -14
  22. package/dist/assets/storefront/src/app/[locale]/accept-invitation/[token]/page.tsx +30 -33
  23. package/dist/assets/storefront/src/app/[locale]/accept-invitation/[token]/sign-out-and-retry.tsx +6 -6
  24. package/dist/assets/storefront/src/app/[locale]/account/addresses/actions.ts +30 -45
  25. package/dist/assets/storefront/src/app/[locale]/account/addresses/address-form.tsx +166 -159
  26. package/dist/assets/storefront/src/app/[locale]/account/addresses/addresses-client.tsx +35 -26
  27. package/dist/assets/storefront/src/app/[locale]/account/addresses/loading.tsx +1 -3
  28. package/dist/assets/storefront/src/app/[locale]/account/addresses/page.tsx +16 -18
  29. package/dist/assets/storefront/src/app/[locale]/account/approvals/actions.ts +5 -8
  30. package/dist/assets/storefront/src/app/[locale]/account/approvals/page.tsx +77 -69
  31. package/dist/assets/storefront/src/app/[locale]/account/company/actions.ts +10 -11
  32. package/dist/assets/storefront/src/app/[locale]/account/company/addresses/actions.ts +6 -15
  33. package/dist/assets/storefront/src/app/[locale]/account/company/addresses/address-form.tsx +57 -49
  34. package/dist/assets/storefront/src/app/[locale]/account/company/addresses/addresses-client.tsx +23 -25
  35. package/dist/assets/storefront/src/app/[locale]/account/company/addresses/page.tsx +30 -30
  36. package/dist/assets/storefront/src/app/[locale]/account/company/business-units/actions.ts +20 -29
  37. package/dist/assets/storefront/src/app/[locale]/account/company/business-units/business-unit-form.tsx +32 -37
  38. package/dist/assets/storefront/src/app/[locale]/account/company/business-units/business-units-client.tsx +32 -25
  39. package/dist/assets/storefront/src/app/[locale]/account/company/business-units/page.tsx +24 -24
  40. package/dist/assets/storefront/src/app/[locale]/account/company/business-units/types.ts +7 -4
  41. package/dist/assets/storefront/src/app/[locale]/account/company/edit-company-form.tsx +11 -21
  42. package/dist/assets/storefront/src/app/[locale]/account/company/page.tsx +23 -28
  43. package/dist/assets/storefront/src/app/[locale]/account/company/payment-methods/page.tsx +24 -24
  44. package/dist/assets/storefront/src/app/[locale]/account/company/payment-methods/payment-methods-client.tsx +5 -7
  45. package/dist/assets/storefront/src/app/[locale]/account/company/roles/page.tsx +22 -25
  46. package/dist/assets/storefront/src/app/[locale]/account/company/roles/roles-client.tsx +11 -26
  47. package/dist/assets/storefront/src/app/[locale]/account/company/tax-ids/actions.ts +6 -10
  48. package/dist/assets/storefront/src/app/[locale]/account/company/tax-ids/page.tsx +18 -16
  49. package/dist/assets/storefront/src/app/[locale]/account/company/tax-ids/tax-ids-client.tsx +74 -67
  50. package/dist/assets/storefront/src/app/[locale]/account/company/users/actions.ts +16 -25
  51. package/dist/assets/storefront/src/app/[locale]/account/company/users/edit-user-form.tsx +27 -25
  52. package/dist/assets/storefront/src/app/[locale]/account/company/users/invite-user-form.tsx +27 -19
  53. package/dist/assets/storefront/src/app/[locale]/account/company/users/page.tsx +32 -29
  54. package/dist/assets/storefront/src/app/[locale]/account/company/users/users-client.tsx +35 -38
  55. package/dist/assets/storefront/src/app/[locale]/account/error.tsx +1 -3
  56. package/dist/assets/storefront/src/app/[locale]/account/layout.tsx +16 -22
  57. package/dist/assets/storefront/src/app/[locale]/account/orders/[code]/page.tsx +151 -103
  58. package/dist/assets/storefront/src/app/[locale]/account/orders/[code]/reorder-actions.ts +6 -7
  59. package/dist/assets/storefront/src/app/[locale]/account/orders/[code]/reorder-dialog.tsx +22 -48
  60. package/dist/assets/storefront/src/app/[locale]/account/orders/loading.tsx +8 -8
  61. package/dist/assets/storefront/src/app/[locale]/account/orders/page.tsx +101 -61
  62. package/dist/assets/storefront/src/app/[locale]/account/profile/actions.ts +32 -23
  63. package/dist/assets/storefront/src/app/[locale]/account/profile/change-password-form.tsx +6 -16
  64. package/dist/assets/storefront/src/app/[locale]/account/profile/edit-email-form.tsx +7 -17
  65. package/dist/assets/storefront/src/app/[locale]/account/profile/edit-profile-form.tsx +6 -16
  66. package/dist/assets/storefront/src/app/[locale]/account/profile/loading.tsx +12 -18
  67. package/dist/assets/storefront/src/app/[locale]/account/profile/page.tsx +15 -15
  68. package/dist/assets/storefront/src/app/[locale]/account/quick-order/file-upload-tab.tsx +2 -6
  69. package/dist/assets/storefront/src/app/[locale]/account/quick-order/manual-entry-tab.tsx +18 -15
  70. package/dist/assets/storefront/src/app/[locale]/account/quick-order/page.tsx +3 -6
  71. package/dist/assets/storefront/src/app/[locale]/account/quick-order/preview-table.tsx +10 -2
  72. package/dist/assets/storefront/src/app/[locale]/account/quick-order/save-to-list-dialog.tsx +24 -26
  73. package/dist/assets/storefront/src/app/[locale]/account/quick-order/sku-autocomplete.tsx +19 -10
  74. package/dist/assets/storefront/src/app/[locale]/account/quick-order/text-input-tab.tsx +3 -8
  75. package/dist/assets/storefront/src/app/[locale]/account/quotes/[id]/page.tsx +86 -59
  76. package/dist/assets/storefront/src/app/[locale]/account/quotes/actions.ts +38 -45
  77. package/dist/assets/storefront/src/app/[locale]/account/quotes/new/new-quote-form.tsx +3 -5
  78. package/dist/assets/storefront/src/app/[locale]/account/quotes/new/page.tsx +6 -6
  79. package/dist/assets/storefront/src/app/[locale]/account/quotes/page.tsx +92 -59
  80. package/dist/assets/storefront/src/app/[locale]/account/shared-carts/[id]/add-item-search.tsx +11 -9
  81. package/dist/assets/storefront/src/app/[locale]/account/shared-carts/[id]/add-member-form.tsx +31 -15
  82. package/dist/assets/storefront/src/app/[locale]/account/shared-carts/[id]/members-panel.tsx +52 -33
  83. package/dist/assets/storefront/src/app/[locale]/account/shared-carts/[id]/page.tsx +22 -14
  84. package/dist/assets/storefront/src/app/[locale]/account/shared-carts/[id]/rename-dialog.tsx +34 -13
  85. package/dist/assets/storefront/src/app/[locale]/account/shared-carts/actions.ts +117 -72
  86. package/dist/assets/storefront/src/app/[locale]/account/shared-carts/new/new-shared-cart-form.tsx +21 -14
  87. package/dist/assets/storefront/src/app/[locale]/account/shared-carts/new/page.tsx +10 -10
  88. package/dist/assets/storefront/src/app/[locale]/account/shared-carts/page.tsx +54 -41
  89. package/dist/assets/storefront/src/app/[locale]/account/shopping-lists/[id]/page.tsx +22 -8
  90. package/dist/assets/storefront/src/app/[locale]/account/shopping-lists/[id]/shopping-list-detail-client.tsx +62 -49
  91. package/dist/assets/storefront/src/app/[locale]/account/shopping-lists/actions.ts +9 -4
  92. package/dist/assets/storefront/src/app/[locale]/account/shopping-lists/create-shopping-list-form.tsx +5 -11
  93. package/dist/assets/storefront/src/app/[locale]/account/shopping-lists/loading.tsx +1 -1
  94. package/dist/assets/storefront/src/app/[locale]/account/shopping-lists/page.tsx +32 -42
  95. package/dist/assets/storefront/src/app/[locale]/account/store-credits/actions.ts +8 -8
  96. package/dist/assets/storefront/src/app/[locale]/account/store-credits/claim-form.tsx +6 -10
  97. package/dist/assets/storefront/src/app/[locale]/account/store-credits/page.tsx +76 -55
  98. package/dist/assets/storefront/src/app/[locale]/account/store-credits/reveal-code.tsx +10 -6
  99. package/dist/assets/storefront/src/app/[locale]/account/verify-email/page.tsx +32 -39
  100. package/dist/assets/storefront/src/app/[locale]/cart/actions.ts +29 -23
  101. package/dist/assets/storefront/src/app/[locale]/cart/cart-items.tsx +111 -40
  102. package/dist/assets/storefront/src/app/[locale]/cart/cart-line-actions.tsx +9 -9
  103. package/dist/assets/storefront/src/app/[locale]/cart/cart-quantity-control.tsx +61 -48
  104. package/dist/assets/storefront/src/app/[locale]/cart/cart-remove-button.tsx +15 -9
  105. package/dist/assets/storefront/src/app/[locale]/cart/cart.tsx +38 -41
  106. package/dist/assets/storefront/src/app/[locale]/cart/code-input.tsx +8 -8
  107. package/dist/assets/storefront/src/app/[locale]/cart/order-summary.tsx +50 -32
  108. package/dist/assets/storefront/src/app/[locale]/cart/page.tsx +11 -11
  109. package/dist/assets/storefront/src/app/[locale]/cart/promotion-code.tsx +48 -42
  110. package/dist/assets/storefront/src/app/[locale]/cart/reapproval-confirm.tsx +22 -20
  111. package/dist/assets/storefront/src/app/[locale]/cart/request-quote-button.tsx +7 -16
  112. package/dist/assets/storefront/src/app/[locale]/checkout/actions.ts +39 -65
  113. package/dist/assets/storefront/src/app/[locale]/checkout/cancel-quote-checkout-button.tsx +5 -5
  114. package/dist/assets/storefront/src/app/[locale]/checkout/checkout-flow.tsx +202 -202
  115. package/dist/assets/storefront/src/app/[locale]/checkout/checkout-provider.tsx +142 -142
  116. package/dist/assets/storefront/src/app/[locale]/checkout/order-summary.tsx +158 -139
  117. package/dist/assets/storefront/src/app/[locale]/checkout/page.tsx +56 -47
  118. package/dist/assets/storefront/src/app/[locale]/checkout/steps/delivery-step.tsx +86 -88
  119. package/dist/assets/storefront/src/app/[locale]/checkout/steps/payment-step.tsx +90 -91
  120. package/dist/assets/storefront/src/app/[locale]/checkout/steps/review-step.tsx +166 -161
  121. package/dist/assets/storefront/src/app/[locale]/checkout/steps/shipping-address-step.tsx +573 -494
  122. package/dist/assets/storefront/src/app/[locale]/error.tsx +3 -5
  123. package/dist/assets/storefront/src/app/[locale]/forgot-password/actions.ts +10 -7
  124. package/dist/assets/storefront/src/app/[locale]/forgot-password/forgot-password-form.tsx +10 -25
  125. package/dist/assets/storefront/src/app/[locale]/forgot-password/page.tsx +5 -5
  126. package/dist/assets/storefront/src/app/[locale]/globals.css +48 -48
  127. package/dist/assets/storefront/src/app/[locale]/layout.tsx +53 -47
  128. package/dist/assets/storefront/src/app/[locale]/not-found.tsx +3 -5
  129. package/dist/assets/storefront/src/app/[locale]/order-confirmation/[code]/order-confirmation.tsx +71 -44
  130. package/dist/assets/storefront/src/app/[locale]/order-confirmation/[code]/page.tsx +7 -5
  131. package/dist/assets/storefront/src/app/[locale]/page.tsx +33 -35
  132. package/dist/assets/storefront/src/app/[locale]/register/actions.ts +7 -7
  133. package/dist/assets/storefront/src/app/[locale]/register/page.tsx +22 -16
  134. package/dist/assets/storefront/src/app/[locale]/register/registration-form.tsx +22 -34
  135. package/dist/assets/storefront/src/app/[locale]/register-company/actions.ts +15 -19
  136. package/dist/assets/storefront/src/app/[locale]/register-company/page.tsx +17 -15
  137. package/dist/assets/storefront/src/app/[locale]/register-company/registration-form.tsx +9 -15
  138. package/dist/assets/storefront/src/app/[locale]/reset-password/actions.ts +7 -8
  139. package/dist/assets/storefront/src/app/[locale]/reset-password/page.tsx +18 -12
  140. package/dist/assets/storefront/src/app/[locale]/reset-password/reset-password-form.tsx +8 -16
  141. package/dist/assets/storefront/src/app/[locale]/shopping-list/[code]/add-to-cart-button.tsx +10 -4
  142. package/dist/assets/storefront/src/app/[locale]/shopping-list/[code]/page.tsx +62 -30
  143. package/dist/assets/storefront/src/app/[locale]/sign-in/actions.ts +14 -16
  144. package/dist/assets/storefront/src/app/[locale]/sign-in/login-form.tsx +17 -30
  145. package/dist/assets/storefront/src/app/[locale]/sign-in/page.tsx +35 -30
  146. package/dist/assets/storefront/src/app/[locale]/verify/actions.ts +8 -8
  147. package/dist/assets/storefront/src/app/[locale]/verify/page.tsx +18 -14
  148. package/dist/assets/storefront/src/app/[locale]/verify/verify-content.tsx +25 -27
  149. package/dist/assets/storefront/src/app/[locale]/verify-pending/page.tsx +23 -23
  150. package/dist/assets/storefront/src/app/api/clear-company-context/route.ts +6 -3
  151. package/dist/assets/storefront/src/app/api/revalidate/route.ts +19 -28
  152. package/dist/assets/storefront/src/app/api/search-analytics/route.ts +1 -1
  153. package/dist/assets/storefront/src/components/commerce/account-nav-items.ts +43 -18
  154. package/dist/assets/storefront/src/components/commerce/account-sidebar.tsx +30 -22
  155. package/dist/assets/storefront/src/components/commerce/active-filters.tsx +1 -1
  156. package/dist/assets/storefront/src/components/commerce/add-to-shared-cart.tsx +49 -27
  157. package/dist/assets/storefront/src/components/commerce/approval-decision-form.tsx +9 -13
  158. package/dist/assets/storefront/src/components/commerce/approval-status-badge.tsx +23 -15
  159. package/dist/assets/storefront/src/components/commerce/business-unit-switcher.tsx +11 -11
  160. package/dist/assets/storefront/src/components/commerce/catalog-search-bar.tsx +2 -2
  161. package/dist/assets/storefront/src/components/commerce/category-product-section.tsx +28 -16
  162. package/dist/assets/storefront/src/components/commerce/category-sidebar.tsx +31 -18
  163. package/dist/assets/storefront/src/components/commerce/collection-hero-banner.tsx +2 -4
  164. package/dist/assets/storefront/src/components/commerce/company-state-badge.tsx +10 -16
  165. package/dist/assets/storefront/src/components/commerce/company-switcher.tsx +12 -12
  166. package/dist/assets/storefront/src/components/commerce/configurator-form.tsx +188 -79
  167. package/dist/assets/storefront/src/components/commerce/facet-filters.tsx +29 -49
  168. package/dist/assets/storefront/src/components/commerce/gift-card-pdp.tsx +4 -4
  169. package/dist/assets/storefront/src/components/commerce/gift-card-product-info.tsx +20 -30
  170. package/dist/assets/storefront/src/components/commerce/instant-search-dropdown.tsx +258 -227
  171. package/dist/assets/storefront/src/components/commerce/order-status-badge.tsx +27 -19
  172. package/dist/assets/storefront/src/components/commerce/packaging-unit-selector.tsx +27 -26
  173. package/dist/assets/storefront/src/components/commerce/permission-gate.tsx +4 -4
  174. package/dist/assets/storefront/src/components/commerce/price-range-filter.tsx +5 -5
  175. package/dist/assets/storefront/src/components/commerce/price-tiers.tsx +38 -21
  176. package/dist/assets/storefront/src/components/commerce/price.tsx +3 -3
  177. package/dist/assets/storefront/src/components/commerce/product-card-list.tsx +35 -14
  178. package/dist/assets/storefront/src/components/commerce/product-card.tsx +31 -16
  179. package/dist/assets/storefront/src/components/commerce/product-carousel.tsx +20 -12
  180. package/dist/assets/storefront/src/components/commerce/product-grid.tsx +14 -13
  181. package/dist/assets/storefront/src/components/commerce/product-image-carousel.tsx +10 -8
  182. package/dist/assets/storefront/src/components/commerce/product-info.tsx +118 -74
  183. package/dist/assets/storefront/src/components/commerce/product-list-expansion.tsx +102 -74
  184. package/dist/assets/storefront/src/components/commerce/product-list-view.tsx +1 -1
  185. package/dist/assets/storefront/src/components/commerce/product-sidebar.tsx +36 -11
  186. package/dist/assets/storefront/src/components/commerce/product-view-switcher.tsx +33 -21
  187. package/dist/assets/storefront/src/components/commerce/quote-action-buttons.tsx +54 -36
  188. package/dist/assets/storefront/src/components/commerce/quote-activity-timeline.tsx +126 -50
  189. package/dist/assets/storefront/src/components/commerce/quote-comment-form.tsx +9 -13
  190. package/dist/assets/storefront/src/components/commerce/quote-csv-export-button.tsx +6 -6
  191. package/dist/assets/storefront/src/components/commerce/quote-product-search.tsx +22 -18
  192. package/dist/assets/storefront/src/components/commerce/quote-request-form.tsx +28 -27
  193. package/dist/assets/storefront/src/components/commerce/quote-status-badge.tsx +26 -18
  194. package/dist/assets/storefront/src/components/commerce/quote-validity-indicator.tsx +7 -7
  195. package/dist/assets/storefront/src/components/commerce/quote-version-comparison.tsx +50 -30
  196. package/dist/assets/storefront/src/components/commerce/related-products.tsx +37 -28
  197. package/dist/assets/storefront/src/components/commerce/shared-cart-status-badge.tsx +12 -8
  198. package/dist/assets/storefront/src/components/commerce/shop-by-category.tsx +8 -7
  199. package/dist/assets/storefront/src/components/commerce/shopping-list-toggle.tsx +14 -20
  200. package/dist/assets/storefront/src/components/commerce/sort-dropdown.tsx +9 -16
  201. package/dist/assets/storefront/src/components/commerce/store-credit-summary.tsx +30 -32
  202. package/dist/assets/storefront/src/components/commerce/subcollection-tiles.tsx +11 -13
  203. package/dist/assets/storefront/src/components/layout/auth-page-shell.tsx +2 -2
  204. package/dist/assets/storefront/src/components/layout/draft-mode-indicator.tsx +2 -7
  205. package/dist/assets/storefront/src/components/layout/draft-mode-link.tsx +4 -2
  206. package/dist/assets/storefront/src/components/layout/footer.tsx +70 -28
  207. package/dist/assets/storefront/src/components/layout/navbar/actions.ts +9 -12
  208. package/dist/assets/storefront/src/components/layout/navbar/cart-icon.tsx +9 -9
  209. package/dist/assets/storefront/src/components/layout/navbar/channel-picker-wrapper.tsx +4 -9
  210. package/dist/assets/storefront/src/components/layout/navbar/channel-picker.tsx +13 -8
  211. package/dist/assets/storefront/src/components/layout/navbar/currency-picker-wrapper.tsx +4 -4
  212. package/dist/assets/storefront/src/components/layout/navbar/currency-picker.tsx +11 -6
  213. package/dist/assets/storefront/src/components/layout/navbar/language-picker.tsx +7 -7
  214. package/dist/assets/storefront/src/components/layout/navbar/login-button.tsx +24 -21
  215. package/dist/assets/storefront/src/components/layout/navbar/mobile-nav.tsx +8 -8
  216. package/dist/assets/storefront/src/components/layout/navbar/nav-menu-items.tsx +4 -6
  217. package/dist/assets/storefront/src/components/layout/navbar/navbar-cart.tsx +1 -1
  218. package/dist/assets/storefront/src/components/layout/navbar/navbar-collections.tsx +41 -42
  219. package/dist/assets/storefront/src/components/layout/navbar/navbar-link.tsx +7 -10
  220. package/dist/assets/storefront/src/components/layout/navbar/navbar-user.tsx +18 -23
  221. package/dist/assets/storefront/src/components/layout/navbar/theme-switcher.tsx +9 -9
  222. package/dist/assets/storefront/src/components/layout/navbar.tsx +36 -31
  223. package/dist/assets/storefront/src/components/layout/search-input.tsx +35 -32
  224. package/dist/assets/storefront/src/components/providers/awaiting-approval-banner.tsx +12 -10
  225. package/dist/assets/storefront/src/components/providers/cart-count-server.tsx +14 -12
  226. package/dist/assets/storefront/src/components/providers/company-context-guard.tsx +4 -4
  227. package/dist/assets/storefront/src/components/providers/company-permissions-server.tsx +2 -6
  228. package/dist/assets/storefront/src/components/providers/theme-provider.tsx +3 -3
  229. package/dist/assets/storefront/src/components/shared/breadcrumbs.tsx +4 -1
  230. package/dist/assets/storefront/src/components/shared/country-select.tsx +63 -67
  231. package/dist/assets/storefront/src/components/shared/pagination.tsx +15 -28
  232. package/dist/assets/storefront/src/components/shared/prefetch-link.tsx +1 -1
  233. package/dist/assets/storefront/src/components/shared/skeletons/search-input-skeleton.tsx +1 -3
  234. package/dist/assets/storefront/src/components/ui/accordion.tsx +46 -51
  235. package/dist/assets/storefront/src/components/ui/alert-dialog.tsx +94 -121
  236. package/dist/assets/storefront/src/components/ui/alert.tsx +48 -54
  237. package/dist/assets/storefront/src/components/ui/aspect-ratio.tsx +5 -7
  238. package/dist/assets/storefront/src/components/ui/avatar.tsx +29 -44
  239. package/dist/assets/storefront/src/components/ui/badge.tsx +28 -37
  240. package/dist/assets/storefront/src/components/ui/breadcrumb.tsx +82 -89
  241. package/dist/assets/storefront/src/components/ui/button.tsx +43 -49
  242. package/dist/assets/storefront/src/components/ui/calendar.tsx +157 -198
  243. package/dist/assets/storefront/src/components/ui/card.tsx +53 -76
  244. package/dist/assets/storefront/src/components/ui/carousel.tsx +194 -212
  245. package/dist/assets/storefront/src/components/ui/chart.tsx +274 -317
  246. package/dist/assets/storefront/src/components/ui/checkbox.tsx +24 -27
  247. package/dist/assets/storefront/src/components/ui/collapsible.tsx +9 -21
  248. package/dist/assets/storefront/src/components/ui/command.tsx +114 -159
  249. package/dist/assets/storefront/src/components/ui/context-menu.tsx +167 -199
  250. package/dist/assets/storefront/src/components/ui/dialog.tsx +97 -114
  251. package/dist/assets/storefront/src/components/ui/drawer.tsx +93 -107
  252. package/dist/assets/storefront/src/components/ui/dropdown-menu.tsx +171 -206
  253. package/dist/assets/storefront/src/components/ui/empty-state.tsx +5 -5
  254. package/dist/assets/storefront/src/components/ui/field.tsx +196 -208
  255. package/dist/assets/storefront/src/components/ui/form.tsx +115 -139
  256. package/dist/assets/storefront/src/components/ui/hover-card.tsx +27 -33
  257. package/dist/assets/storefront/src/components/ui/input-otp.tsx +50 -59
  258. package/dist/assets/storefront/src/components/ui/input.tsx +17 -17
  259. package/dist/assets/storefront/src/components/ui/kbd-shortcut.tsx +3 -1
  260. package/dist/assets/storefront/src/components/ui/label.tsx +16 -19
  261. package/dist/assets/storefront/src/components/ui/menubar.tsx +193 -223
  262. package/dist/assets/storefront/src/components/ui/navigation-menu.tsx +123 -130
  263. package/dist/assets/storefront/src/components/ui/pagination.tsx +87 -108
  264. package/dist/assets/storefront/src/components/ui/popover.tsx +29 -35
  265. package/dist/assets/storefront/src/components/ui/progress.tsx +19 -26
  266. package/dist/assets/storefront/src/components/ui/radio-group.tsx +32 -38
  267. package/dist/assets/storefront/src/components/ui/resizable.tsx +37 -42
  268. package/dist/assets/storefront/src/components/ui/scroll-area.tsx +41 -47
  269. package/dist/assets/storefront/src/components/ui/select.tsx +130 -152
  270. package/dist/assets/storefront/src/components/ui/separator.tsx +21 -21
  271. package/dist/assets/storefront/src/components/ui/sheet.tsx +90 -111
  272. package/dist/assets/storefront/src/components/ui/sidebar.tsx +611 -649
  273. package/dist/assets/storefront/src/components/ui/skeleton.tsx +10 -10
  274. package/dist/assets/storefront/src/components/ui/slider.tsx +50 -55
  275. package/dist/assets/storefront/src/components/ui/sonner.tsx +20 -20
  276. package/dist/assets/storefront/src/components/ui/switch.tsx +23 -26
  277. package/dist/assets/storefront/src/components/ui/table.tsx +65 -97
  278. package/dist/assets/storefront/src/components/ui/tabs.tsx +39 -55
  279. package/dist/assets/storefront/src/components/ui/textarea.tsx +14 -14
  280. package/dist/assets/storefront/src/components/ui/toggle-group.tsx +56 -62
  281. package/dist/assets/storefront/src/components/ui/toggle.tsx +37 -38
  282. package/dist/assets/storefront/src/components/ui/tooltip.tsx +38 -46
  283. package/dist/assets/storefront/src/config/scenario-meta.ts +2 -2
  284. package/dist/assets/storefront/src/config/scenario.ts +14 -16
  285. package/dist/assets/storefront/src/contexts/auth-context.tsx +5 -6
  286. package/dist/assets/storefront/src/graphql.ts +5 -5
  287. package/dist/assets/storefront/src/hooks/use-mobile.ts +13 -13
  288. package/dist/assets/storefront/src/i18n/locale-utils.ts +3 -3
  289. package/dist/assets/storefront/src/i18n/navigation.ts +4 -4
  290. package/dist/assets/storefront/src/i18n/request.ts +4 -4
  291. package/dist/assets/storefront/src/i18n/routing.ts +5 -5
  292. package/dist/assets/storefront/src/i18n/server.ts +3 -3
  293. package/dist/assets/storefront/src/lib/actions/switch-channel.ts +9 -9
  294. package/dist/assets/storefront/src/lib/actions/switch-currency.ts +7 -7
  295. package/dist/assets/storefront/src/lib/auth.ts +1 -1
  296. package/dist/assets/storefront/src/lib/backend-health.ts +3 -3
  297. package/dist/assets/storefront/src/lib/cart-count-context.tsx +10 -4
  298. package/dist/assets/storefront/src/lib/cart-guard-utils.ts +2 -1
  299. package/dist/assets/storefront/src/lib/cart-guard.ts +7 -6
  300. package/dist/assets/storefront/src/lib/channel-server.ts +4 -4
  301. package/dist/assets/storefront/src/lib/company-context.ts +1 -1
  302. package/dist/assets/storefront/src/lib/company-permissions-context.tsx +1 -5
  303. package/dist/assets/storefront/src/lib/currency-server.ts +4 -4
  304. package/dist/assets/storefront/src/lib/format.ts +16 -7
  305. package/dist/assets/storefront/src/lib/metadata.ts +39 -44
  306. package/dist/assets/storefront/src/lib/quantity.ts +2 -4
  307. package/dist/assets/storefront/src/lib/search-bar-context.tsx +7 -4
  308. package/dist/assets/storefront/src/lib/use-recent-searches.ts +8 -6
  309. package/dist/assets/storefront/src/lib/utils.ts +3 -3
  310. package/dist/assets/storefront/src/lib/vendure/actions.ts +18 -16
  311. package/dist/assets/storefront/src/lib/vendure/api.ts +36 -23
  312. package/dist/assets/storefront/src/lib/vendure/approval-utils.ts +9 -8
  313. package/dist/assets/storefront/src/lib/vendure/cached.ts +20 -15
  314. package/dist/assets/storefront/src/lib/vendure/queries.ts +15 -5
  315. package/dist/assets/storefront/src/middleware.ts +1 -1
  316. package/dist/assets/storefront/src/scenarios/customer/hero.tsx +2 -2
  317. package/dist/assets/storefront/src/scenarios/customer/meta.ts +1 -1
  318. package/dist/bin/run.js +1 -1
  319. package/dist/cli.d.ts +1 -1
  320. package/dist/index.d.ts +5 -5
  321. package/dist/index.js +1 -1
  322. package/dist/scaffold-storefront-only.js +1 -1
  323. package/dist/scaffolder.js +1 -1
  324. package/dist/template-renderer.js +1 -1
  325. package/package.json +2 -2
@@ -1,32 +1,32 @@
1
- import type {Metadata} from 'next';
2
- import {Suspense} from 'react';
3
- import {ChevronLeft, AlertTriangle, Info} from 'lucide-react';
4
- import {client} from '@/lib/vendure/api';
5
- import {GetMyQuoteDetailQuery} from '@/lib/vendure/queries';
6
- import {Button} from '@/components/ui/button';
7
- import {Card, CardContent, CardHeader, CardTitle} from '@/components/ui/card';
8
- import {Separator} from '@/components/ui/separator';
9
- import {Price} from '@/components/commerce/price';
10
- import {QuoteStatusBadge} from '@/components/commerce/quote-status-badge';
11
- import {QuoteActionButtons} from '@/components/commerce/quote-action-buttons';
12
- import {QuoteVersionComparison} from '@/components/commerce/quote-version-comparison';
13
- import {QuoteActivityTimeline} from '@/components/commerce/quote-activity-timeline';
14
- import {QuoteValidityIndicator} from '@/components/commerce/quote-validity-indicator';
15
- import {QuoteCsvExportButton} from '@/components/commerce/quote-csv-export-button';
16
- import {formatDate} from '@/lib/format';
17
- import {getActiveChannelCached} from '@/lib/vendure/cached';
18
- import {getActiveChannelToken} from '@/lib/channel-server';
19
- import {setRequestLocale, getTranslations} from 'next-intl/server';
20
- import {Link, redirect} from '@/i18n/navigation';
1
+ import { Price } from '@/components/commerce/price';
2
+ import { QuoteActionButtons } from '@/components/commerce/quote-action-buttons';
3
+ import { QuoteActivityTimeline } from '@/components/commerce/quote-activity-timeline';
4
+ import { QuoteCsvExportButton } from '@/components/commerce/quote-csv-export-button';
5
+ import { QuoteStatusBadge } from '@/components/commerce/quote-status-badge';
6
+ import { QuoteValidityIndicator } from '@/components/commerce/quote-validity-indicator';
7
+ import { QuoteVersionComparison } from '@/components/commerce/quote-version-comparison';
8
+ import { Button } from '@/components/ui/button';
9
+ import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
10
+ import { Separator } from '@/components/ui/separator';
11
+ import { Link, redirect } from '@/i18n/navigation';
12
+ import { getActiveChannelToken } from '@/lib/channel-server';
13
+ import { formatDate } from '@/lib/format';
14
+ import { client } from '@/lib/vendure/api';
15
+ import { getActiveChannelCached } from '@/lib/vendure/cached';
16
+ import { GetMyQuoteDetailQuery } from '@/lib/vendure/queries';
17
+ import { AlertTriangle, ChevronLeft, Info } from 'lucide-react';
18
+ import type { Metadata } from 'next';
19
+ import { getTranslations, setRequestLocale } from 'next-intl/server';
20
+ import { Suspense } from 'react';
21
21
 
22
22
  const TERMINAL_STATUSES = new Set(['ACCEPTED', 'REJECTED', 'CANCELLED', 'EXPIRED']);
23
23
 
24
24
  interface QuoteDetailPageProps {
25
- params: Promise<{locale: string; id: string}>;
25
+ params: Promise<{ locale: string; id: string }>;
26
26
  }
27
27
 
28
- export async function generateMetadata({params}: QuoteDetailPageProps): Promise<Metadata> {
29
- const {id} = await params;
28
+ export async function generateMetadata({ params }: QuoteDetailPageProps): Promise<Metadata> {
29
+ const { id } = await params;
30
30
  return {
31
31
  title: `Quote ${id}`,
32
32
  };
@@ -36,19 +36,15 @@ type QuoteDetailTranslations = Awaited<ReturnType<typeof getTranslations<'Quotes
36
36
 
37
37
  function getValidityBanner(validUntil: string | null | undefined, t: QuoteDetailTranslations) {
38
38
  if (!validUntil) return null;
39
- const daysRemaining = Math.ceil(
40
- (new Date(validUntil).getTime() - Date.now()) / (1000 * 60 * 60 * 24),
41
- );
39
+ const daysRemaining = Math.ceil((new Date(validUntil).getTime() - Date.now()) / (1000 * 60 * 60 * 24));
42
40
  if (daysRemaining < 0) {
43
41
  return (
44
42
  <div className="rounded-lg border border-red-200 bg-red-50 p-4 mb-6">
45
43
  <div className="flex gap-3">
46
- <AlertTriangle className="h-5 w-5 text-red-600 flex-shrink-0 mt-0.5"/>
44
+ <AlertTriangle className="h-5 w-5 text-red-600 flex-shrink-0 mt-0.5" />
47
45
  <div>
48
46
  <h3 className="font-medium text-red-900">{t('quoteExpiredTitle')}</h3>
49
- <p className="text-sm text-red-800 mt-1">
50
- {t('quoteExpiredMessage')}
51
- </p>
47
+ <p className="text-sm text-red-800 mt-1">{t('quoteExpiredMessage')}</p>
52
48
  </div>
53
49
  </div>
54
50
  </div>
@@ -58,11 +54,11 @@ function getValidityBanner(validUntil: string | null | undefined, t: QuoteDetail
58
54
  return (
59
55
  <div className="rounded-lg border border-amber-200 bg-amber-50 p-4 mb-6">
60
56
  <div className="flex gap-3">
61
- <AlertTriangle className="h-5 w-5 text-amber-600 flex-shrink-0 mt-0.5"/>
57
+ <AlertTriangle className="h-5 w-5 text-amber-600 flex-shrink-0 mt-0.5" />
62
58
  <div>
63
59
  <h3 className="font-medium text-amber-900">{t('quoteExpiringSoonTitle')}</h3>
64
60
  <p className="text-sm text-amber-800 mt-1">
65
- {t('quoteExpiresIn', {days: daysRemaining})}
61
+ {t('quoteExpiresIn', { days: daysRemaining })}
66
62
  </p>
67
63
  </div>
68
64
  </div>
@@ -74,19 +70,29 @@ function getValidityBanner(validUntil: string | null | undefined, t: QuoteDetail
74
70
 
75
71
  export default async function QuoteDetailPage(props: QuoteDetailPageProps) {
76
72
  return (
77
- <Suspense fallback={<div><p className="text-sm text-muted-foreground">Loading quote...</p></div>}>
73
+ <Suspense
74
+ fallback={
75
+ <div>
76
+ <p className="text-sm text-muted-foreground">Loading quote...</p>
77
+ </div>
78
+ }
79
+ >
78
80
  <QuoteDetailContent paramsPromise={props.params} />
79
81
  </Suspense>
80
82
  );
81
83
  }
82
84
 
83
- async function QuoteDetailContent({paramsPromise}: {paramsPromise: Promise<{locale: string; id: string}>}) {
84
- const {locale, id} = await paramsPromise;
85
+ async function QuoteDetailContent({
86
+ paramsPromise,
87
+ }: {
88
+ paramsPromise: Promise<{ locale: string; id: string }>;
89
+ }) {
90
+ const { locale, id } = await paramsPromise;
85
91
  setRequestLocale(locale);
86
92
  const channelToken = await getActiveChannelToken();
87
93
  const [t, [result, error], channel] = await Promise.all([
88
94
  getTranslations('Quotes'),
89
- client.query(GetMyQuoteDetailQuery, {id}),
95
+ client.query(GetMyQuoteDetailQuery, { id }),
90
96
  getActiveChannelCached(channelToken),
91
97
  ]);
92
98
  const currencyCode = channel.defaultCurrencyCode;
@@ -100,17 +106,18 @@ async function QuoteDetailContent({paramsPromise}: {paramsPromise: Promise<{loca
100
106
  }
101
107
  const version = quote.currentVersion;
102
108
  const isTerminal = TERMINAL_STATUSES.has(quote.status);
103
- const v1 = quote.versions.find(v => v.versionNumber === 1);
104
- const v1LineItems = v1 && quote.versions.length > 1
105
- ? v1.lineItems.map(item => ({sku: item.sku, unitPrice: item.unitPrice}))
106
- : undefined;
109
+ const v1 = quote.versions.find((v) => v.versionNumber === 1);
110
+ const v1LineItems =
111
+ v1 && quote.versions.length > 1
112
+ ? v1.lineItems.map((item) => ({ sku: item.sku, unitPrice: item.unitPrice }))
113
+ : undefined;
107
114
 
108
115
  return (
109
116
  <div>
110
117
  <div className="mb-6">
111
118
  <Button variant="ghost" size="sm" asChild className="mb-4">
112
119
  <Link href="/account/quotes">
113
- <ChevronLeft className="h-4 w-4 mr-2"/>
120
+ <ChevronLeft className="h-4 w-4 mr-2" />
114
121
  {t('backToQuotes')}
115
122
  </Link>
116
123
  </Button>
@@ -119,7 +126,7 @@ async function QuoteDetailContent({paramsPromise}: {paramsPromise: Promise<{loca
119
126
  <div>
120
127
  <h1 className="text-3xl font-bold">Quote {quote.quoteNumber}</h1>
121
128
  <p className="text-muted-foreground mt-1">
122
- {t('createdOn', {date: formatDate(quote.createdAt, locale, 'long')})}
129
+ {t('createdOn', { date: formatDate(quote.createdAt, locale, 'long') })}
123
130
  </p>
124
131
  </div>
125
132
  </div>
@@ -134,7 +141,7 @@ async function QuoteDetailContent({paramsPromise}: {paramsPromise: Promise<{loca
134
141
  v1LineItems={v1LineItems}
135
142
  />
136
143
  )}
137
- <QuoteStatusBadge status={quote.status}/>
144
+ <QuoteStatusBadge status={quote.status} />
138
145
  </div>
139
146
  </div>
140
147
  </div>
@@ -142,12 +149,10 @@ async function QuoteDetailContent({paramsPromise}: {paramsPromise: Promise<{loca
142
149
  {quote.status === 'IN_REVIEW' && (
143
150
  <div className="rounded-lg border border-blue-200 bg-blue-50 p-4 mb-6">
144
151
  <div className="flex gap-3">
145
- <Info className="h-5 w-5 text-blue-600 flex-shrink-0 mt-0.5"/>
152
+ <Info className="h-5 w-5 text-blue-600 flex-shrink-0 mt-0.5" />
146
153
  <div>
147
154
  <h3 className="font-medium text-blue-900">{t('inReviewBannerTitle')}</h3>
148
- <p className="text-sm text-blue-800 mt-1">
149
- {t('inReviewBannerMessage')}
150
- </p>
155
+ <p className="text-sm text-blue-800 mt-1">{t('inReviewBannerMessage')}</p>
151
156
  </div>
152
157
  </div>
153
158
  </div>
@@ -176,23 +181,41 @@ async function QuoteDetailContent({paramsPromise}: {paramsPromise: Promise<{loca
176
181
  <CardContent>
177
182
  <div className="space-y-2">
178
183
  <div className="flex justify-between text-sm">
179
- <span className="text-muted-foreground">{t('subtotal')} <span className="text-[10px]">({t('subtotalExclTax')})</span></span>
180
- <span><Price value={version.subtotal} currencyCode={currencyCode}/></span>
184
+ <span className="text-muted-foreground">
185
+ {t('subtotal')}{' '}
186
+ <span className="text-[10px]">({t('subtotalExclTax')})</span>
187
+ </span>
188
+ <span>
189
+ <Price value={version.subtotal} currencyCode={currencyCode} />
190
+ </span>
181
191
  </div>
182
192
  <div className="flex justify-between text-sm">
183
193
  <span className="text-muted-foreground">{t('shipping')}</span>
184
194
  <span>
185
- {version.shippingCost > 0
186
- ? <Price value={version.shippingCost} currencyCode={currencyCode}/>
187
- : t('shippingIncluded')}
195
+ {version.shippingCost > 0 ? (
196
+ <Price
197
+ value={version.shippingCost}
198
+ currencyCode={currencyCode}
199
+ />
200
+ ) : (
201
+ t('shippingIncluded')
202
+ )}
188
203
  </span>
189
204
  </div>
190
- <Separator className="my-2"/>
205
+ <Separator className="my-2" />
191
206
  <div className="flex justify-between font-bold text-lg">
192
207
  <span>{t('total')}</span>
193
- <span><Price value={version.total} currencyCode={currencyCode} taxLabel="excl" /></span>
208
+ <span>
209
+ <Price
210
+ value={version.total}
211
+ currencyCode={currencyCode}
212
+ taxLabel="excl"
213
+ />
214
+ </span>
194
215
  </div>
195
- <p className="text-xs text-muted-foreground mt-2 italic">{t('taxCalculatedAtCheckout')}</p>
216
+ <p className="text-xs text-muted-foreground mt-2 italic">
217
+ {t('taxCalculatedAtCheckout')}
218
+ </p>
196
219
  </div>
197
220
  </CardContent>
198
221
  </Card>
@@ -217,7 +240,7 @@ async function QuoteDetailContent({paramsPromise}: {paramsPromise: Promise<{loca
217
240
  <CardContent className="space-y-3 text-sm">
218
241
  <div className="flex items-center justify-between">
219
242
  <span className="text-muted-foreground">{t('infoStatus')}</span>
220
- <QuoteStatusBadge status={quote.status}/>
243
+ <QuoteStatusBadge status={quote.status} />
221
244
  </div>
222
245
  <div className="flex justify-between">
223
246
  <span className="text-muted-foreground">{t('infoQuoteNumber')}</span>
@@ -226,20 +249,24 @@ async function QuoteDetailContent({paramsPromise}: {paramsPromise: Promise<{loca
226
249
  {quote.validUntil && (
227
250
  <div className="flex justify-between">
228
251
  <span className="text-muted-foreground">{t('infoValidUntil')}</span>
229
- <QuoteValidityIndicator validUntil={quote.validUntil}/>
252
+ <QuoteValidityIndicator validUntil={quote.validUntil} />
230
253
  </div>
231
254
  )}
232
255
  {quote.convertedOrderId && (
233
256
  <div className="flex justify-between">
234
257
  <span className="text-muted-foreground">{t('infoConvertedOrder')}</span>
235
- <span className="font-medium text-green-700">{t('infoConvertedOrderYes')}</span>
258
+ <span className="font-medium text-green-700">
259
+ {t('infoConvertedOrderYes')}
260
+ </span>
236
261
  </div>
237
262
  )}
238
263
  </CardContent>
239
264
  </Card>
240
265
 
241
266
  {/* Actions */}
242
- {(quote.status === 'DRAFT' || quote.status === 'QUOTED' || (quote.status === 'ACCEPTED' && !quote.convertedOrderId)) && (
267
+ {(quote.status === 'DRAFT' ||
268
+ quote.status === 'QUOTED' ||
269
+ (quote.status === 'ACCEPTED' && !quote.convertedOrderId)) && (
243
270
  <Card>
244
271
  <CardHeader>
245
272
  <CardTitle>{t('actionsCardTitle')}</CardTitle>
@@ -1,21 +1,21 @@
1
1
  'use server';
2
2
 
3
- import {client} from '@/lib/vendure/api';
3
+ import { redirect } from '@/i18n/navigation';
4
+ import { client } from '@/lib/vendure/api';
4
5
  import {
5
- RequestQuoteFromCartMutation,
6
- SubmitQuoteMutation,
6
+ AcceptAndConvertQuoteMutation,
7
7
  AcceptQuoteMutation,
8
+ AddQuoteCommentMutation,
9
+ CancelQuoteCheckoutMutation,
8
10
  RejectQuoteMutation,
11
+ RemoveAllOrderLinesMutation,
9
12
  RequestQuoteChangesMutation,
10
- AcceptAndConvertQuoteMutation,
11
- AddQuoteCommentMutation,
13
+ RequestQuoteFromCartMutation,
12
14
  RequestQuoteMutation,
13
- RemoveAllOrderLinesMutation,
14
- CancelQuoteCheckoutMutation,
15
+ SubmitQuoteMutation,
15
16
  } from '@/lib/vendure/mutations';
16
- import {QuoteStockCheckQuery, SearchVariantsQuery} from '@/lib/vendure/queries';
17
- import {revalidatePath, updateTag} from 'next/cache';
18
- import {redirect} from '@/i18n/navigation';
17
+ import { QuoteStockCheckQuery, SearchVariantsQuery } from '@/lib/vendure/queries';
18
+ import { revalidatePath, updateTag } from 'next/cache';
19
19
 
20
20
  function invalidateCart() {
21
21
  updateTag('cart');
@@ -29,17 +29,16 @@ type QuoteLineItemInput = { productVariantId: string; quantity: number; note?: s
29
29
  * Returns the quote ID on success, or throws on failure.
30
30
  */
31
31
  async function createAndSubmitQuote(lineItems: QuoteLineItemInput[], note?: string) {
32
- const [result, error] = await client.mutate(
33
- RequestQuoteMutation,
34
- {input: {lineItems, note: note || undefined}},
35
- );
32
+ const [result, error] = await client.mutate(RequestQuoteMutation, {
33
+ input: { lineItems, note: note || undefined },
34
+ });
36
35
  if (error) {
37
36
  throw new Error(error.message || 'Failed to create quote');
38
37
  }
39
38
  const quoteId = result.data.requestQuote.id;
40
39
  // Auto-submit — if this fails, user lands on the quote detail page
41
40
  // where they can see the DRAFT and manually submit
42
- const [, submitError] = await client.mutate(SubmitQuoteMutation, {quoteId});
41
+ const [, submitError] = await client.mutate(SubmitQuoteMutation, { quoteId });
43
42
  if (submitError) {
44
43
  console.error('[createAndSubmitQuote] Submit failed:', submitError);
45
44
  }
@@ -57,8 +56,8 @@ export async function searchVariantsForQuote(term: string) {
57
56
  }
58
57
 
59
58
  return result.data.search.items
60
- .filter(item => item.price.__typename === 'SinglePrice')
61
- .map(item => ({
59
+ .filter((item) => item.price.__typename === 'SinglePrice')
60
+ .map((item) => ({
62
61
  productVariantId: item.productVariantId,
63
62
  productName: item.productName,
64
63
  variantName: item.productVariantName,
@@ -75,13 +74,13 @@ export async function requestQuoteFromCart() {
75
74
  if (error) {
76
75
  const message = error.message || 'Failed to request quote';
77
76
  console.error('[requestQuoteFromCart] FAILED:', message);
78
- return {success: false, message};
77
+ return { success: false, message };
79
78
  }
80
79
  const quoteId = result.data.requestQuoteFromCart.id;
81
80
 
82
81
  // Auto-submit — if this fails, user still lands on the quote detail page
83
82
  // where they can see the DRAFT and manually submit
84
- const [, submitError] = await client.mutate(SubmitQuoteMutation, {quoteId});
83
+ const [, submitError] = await client.mutate(SubmitQuoteMutation, { quoteId });
85
84
  if (submitError) {
86
85
  console.error('[requestQuoteFromCart] Submit failed, redirecting to draft:', submitError);
87
86
  }
@@ -91,20 +90,20 @@ export async function requestQuoteFromCart() {
91
90
  }
92
91
 
93
92
  export async function submitQuote(quoteId: string) {
94
- const [, error] = await client.mutate(SubmitQuoteMutation, {quoteId});
93
+ const [, error] = await client.mutate(SubmitQuoteMutation, { quoteId });
95
94
 
96
95
  if (error) {
97
96
  const message = error.message || 'Failed to submit quote';
98
97
  console.error('[submitQuote] FAILED:', message);
99
- return {success: false, message};
98
+ return { success: false, message };
100
99
  }
101
100
 
102
101
  revalidatePath('/account/quotes', 'layout');
103
- return {success: true};
102
+ return { success: true };
104
103
  }
105
104
 
106
105
  export async function acceptQuote(quoteId: string) {
107
- const [, error] = await client.mutate(AcceptQuoteMutation, {quoteId});
106
+ const [, error] = await client.mutate(AcceptQuoteMutation, { quoteId });
108
107
 
109
108
  if (error) {
110
109
  return {
@@ -114,11 +113,11 @@ export async function acceptQuote(quoteId: string) {
114
113
  }
115
114
 
116
115
  revalidatePath('/account/quotes', 'layout');
117
- return {success: true};
116
+ return { success: true };
118
117
  }
119
118
 
120
119
  export async function rejectQuote(quoteId: string, reason?: string) {
121
- const [, error] = await client.mutate(RejectQuoteMutation, {quoteId, reason: reason ?? null});
120
+ const [, error] = await client.mutate(RejectQuoteMutation, { quoteId, reason: reason ?? null });
122
121
 
123
122
  if (error) {
124
123
  return {
@@ -128,11 +127,11 @@ export async function rejectQuote(quoteId: string, reason?: string) {
128
127
  }
129
128
 
130
129
  revalidatePath('/account/quotes', 'layout');
131
- return {success: true};
130
+ return { success: true };
132
131
  }
133
132
 
134
133
  export async function requestQuoteChanges(quoteId: string, reason?: string) {
135
- const [, error] = await client.mutate(RequestQuoteChangesMutation, {quoteId, reason: reason ?? null});
134
+ const [, error] = await client.mutate(RequestQuoteChangesMutation, { quoteId, reason: reason ?? null });
136
135
 
137
136
  if (error) {
138
137
  return {
@@ -142,11 +141,11 @@ export async function requestQuoteChanges(quoteId: string, reason?: string) {
142
141
  }
143
142
 
144
143
  revalidatePath('/account/quotes', 'layout');
145
- return {success: true};
144
+ return { success: true };
146
145
  }
147
146
 
148
147
  export async function acceptAndConvertQuote(quoteId: string) {
149
- const [result, error] = await client.mutate(AcceptAndConvertQuoteMutation, {quoteId});
148
+ const [result, error] = await client.mutate(AcceptAndConvertQuoteMutation, { quoteId });
150
149
 
151
150
  if (error) {
152
151
  return {
@@ -167,15 +166,15 @@ export async function acceptAndConvertQuote(quoteId: string) {
167
166
  export async function cancelQuoteCheckout() {
168
167
  const [, error] = await client.mutate(CancelQuoteCheckoutMutation, {});
169
168
  if (error) {
170
- return {success: false, message: error.message || 'Failed to cancel'};
169
+ return { success: false, message: error.message || 'Failed to cancel' };
171
170
  }
172
171
  invalidateCart();
173
172
  revalidatePath('/checkout', 'layout');
174
- return {success: true};
173
+ return { success: true };
175
174
  }
176
175
 
177
176
  export async function addQuoteComment(quoteId: string, text: string) {
178
- const [, error] = await client.mutate(AddQuoteCommentMutation, {quoteId, text});
177
+ const [, error] = await client.mutate(AddQuoteCommentMutation, { quoteId, text });
179
178
 
180
179
  if (error) {
181
180
  return {
@@ -185,23 +184,20 @@ export async function addQuoteComment(quoteId: string, text: string) {
185
184
  }
186
185
 
187
186
  revalidatePath('/account/quotes', 'layout');
188
- return {success: true};
187
+ return { success: true };
189
188
  }
190
189
 
191
190
  /**
192
191
  * Standalone flow: create quote from line items, submit, redirect to detail.
193
192
  * On success, redirects (throws NEXT_REDIRECT) — only failure returns a result.
194
193
  */
195
- export async function requestQuoteWithItems(
196
- lineItems: QuoteLineItemInput[],
197
- note?: string,
198
- ) {
194
+ export async function requestQuoteWithItems(lineItems: QuoteLineItemInput[], note?: string) {
199
195
  let quoteId: string;
200
196
  try {
201
197
  quoteId = await createAndSubmitQuote(lineItems, note);
202
198
  } catch (err) {
203
199
  const message = err instanceof Error ? err.message : 'Failed to create quote';
204
- return {success: false as const, message};
200
+ return { success: false as const, message };
205
201
  }
206
202
  revalidatePath('/account/quotes', 'layout');
207
203
  await redirect(`/account/quotes/${quoteId}`);
@@ -211,16 +207,13 @@ export async function requestQuoteWithItems(
211
207
  * Cart flow: create quote from line items, submit, clear cart, redirect.
212
208
  * On success, redirects (throws NEXT_REDIRECT) — only failure returns a result.
213
209
  */
214
- export async function requestQuoteFromCartWithReview(
215
- lineItems: QuoteLineItemInput[],
216
- note?: string,
217
- ) {
210
+ export async function requestQuoteFromCartWithReview(lineItems: QuoteLineItemInput[], note?: string) {
218
211
  let quoteId: string;
219
212
  try {
220
213
  quoteId = await createAndSubmitQuote(lineItems, note);
221
214
  } catch (err) {
222
215
  const message = err instanceof Error ? err.message : 'Failed to create quote';
223
- return {success: false as const, message};
216
+ return { success: false as const, message };
224
217
  }
225
218
  const [, clearError] = await client.mutate(RemoveAllOrderLinesMutation, {});
226
219
  if (clearError) {
@@ -242,12 +235,12 @@ type StockCheckResult = {
242
235
  };
243
236
 
244
237
  export async function checkQuoteStock(quoteId: string): Promise<StockCheckResult> {
245
- const [result, error] = await client.query(QuoteStockCheckQuery, {quoteId});
238
+ const [result, error] = await client.query(QuoteStockCheckQuery, { quoteId });
246
239
  if (error) {
247
240
  // Fail open — if the stock check itself fails, let the conversion
248
241
  // service catch real stock issues. Better than showing an empty warning.
249
242
  console.error('[checkQuoteStock] Failed:', error);
250
- return {allInStock: true, outOfStockItems: []};
243
+ return { allInStock: true, outOfStockItems: [] };
251
244
  }
252
245
  return result.data.quoteStockCheck as StockCheckResult;
253
246
  }
@@ -1,8 +1,8 @@
1
1
  'use client';
2
2
 
3
- import { QuoteRequestForm } from '@/components/commerce/quote-request-form';
4
- import { QuoteProductSearch } from '@/components/commerce/quote-product-search';
5
3
  import { requestQuoteWithItems } from '@/app/[locale]/account/quotes/actions';
4
+ import { QuoteProductSearch } from '@/components/commerce/quote-product-search';
5
+ import { QuoteRequestForm } from '@/components/commerce/quote-request-form';
6
6
  import { useRouter } from '@/i18n/navigation';
7
7
 
8
8
  interface NewQuoteFormProps {
@@ -20,9 +20,7 @@ export function NewQuoteForm({ sender, currencyCode }: NewQuoteFormProps) {
20
20
  mode="standalone"
21
21
  onSubmit={requestQuoteWithItems}
22
22
  onCancel={() => router.push('/account/quotes')}
23
- renderSearch={(addItem) => (
24
- <QuoteProductSearch onAddItem={addItem} currencyCode={currencyCode} />
25
- )}
23
+ renderSearch={(addItem) => <QuoteProductSearch onAddItem={addItem} currencyCode={currencyCode} />}
26
24
  />
27
25
  );
28
26
  }
@@ -1,13 +1,13 @@
1
- import type { Metadata } from 'next';
2
- import { client } from '@/lib/vendure/api';
3
1
  import { readFragment } from '@/graphql';
4
- import { GetActiveCustomerQuery, GetActiveChannelQuery, GetCompanyAccountQuery } from '@/lib/vendure/queries';
5
- import { ActiveCustomerFragment, CompanyFragment } from '@/lib/vendure/fragments';
6
2
  import { redirect } from '@/i18n/navigation';
7
- import { NewQuoteForm } from './new-quote-form';
8
- import { locale as rootLocale } from 'next/root-params';
9
3
  import type { Locale } from '@/i18n/routing';
4
+ import { client } from '@/lib/vendure/api';
5
+ import { ActiveCustomerFragment, CompanyFragment } from '@/lib/vendure/fragments';
6
+ import { GetActiveChannelQuery, GetActiveCustomerQuery, GetCompanyAccountQuery } from '@/lib/vendure/queries';
7
+ import type { Metadata } from 'next';
10
8
  import { getTranslations } from 'next-intl/server';
9
+ import { locale as rootLocale } from 'next/root-params';
10
+ import { NewQuoteForm } from './new-quote-form';
11
11
 
12
12
  export async function generateMetadata(): Promise<Metadata> {
13
13
  const locale = (await rootLocale()) as Locale;