@vendure-platform/create 0.5.0 → 0.5.2

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 +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/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,12 +1,21 @@
1
1
  'use client';
2
2
 
3
- import {useState} from 'react';
4
- import {useLocale} from 'next-intl';
5
- import {Card, CardContent, CardHeader, CardTitle} from '@/components/ui/card';
6
- import {Price} from '@/components/commerce/price';
7
- import {formatDateTime} from '@/lib/format';
8
- import {FileText, MessageSquare, Send, ArrowRight, Plus, Minus, ChevronDown, ChevronRight} from 'lucide-react';
9
- import type {QuoteVersion, QuoteComment} from '@/lib/vendure/queries';
3
+ import { Price } from '@/components/commerce/price';
4
+ import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
5
+ import { formatDateTime } from '@/lib/format';
6
+ import type { QuoteComment, QuoteVersion } from '@/lib/vendure/queries';
7
+ import {
8
+ ArrowRight,
9
+ ChevronDown,
10
+ ChevronRight,
11
+ FileText,
12
+ MessageSquare,
13
+ Minus,
14
+ Plus,
15
+ Send,
16
+ } from 'lucide-react';
17
+ import { useLocale } from 'next-intl';
18
+ import { useState } from 'react';
10
19
 
11
20
  type TimelineItem =
12
21
  | { type: 'version'; version: QuoteVersion; timestamp: number }
@@ -24,17 +33,27 @@ interface QuoteActivityTimelineProps {
24
33
  currencyCode: string;
25
34
  }
26
35
 
27
- export function QuoteActivityTimeline({versions, comments, currentVersionNumber, currencyCode}: QuoteActivityTimelineProps) {
36
+ export function QuoteActivityTimeline({
37
+ versions,
38
+ comments,
39
+ currentVersionNumber,
40
+ currencyCode,
41
+ }: QuoteActivityTimelineProps) {
28
42
  const locale = useLocale();
29
43
  const sorted = [...versions].sort((a, b) => a.versionNumber - b.versionNumber);
30
44
 
31
45
  // Build timeline items
32
46
  const items: TimelineItem[] = [];
33
47
  for (const version of sorted) {
34
- items.push({type: 'version', version, timestamp: new Date(version.createdAt).getTime()});
48
+ items.push({ type: 'version', version, timestamp: new Date(version.createdAt).getTime() });
35
49
  }
36
50
  for (const comment of comments) {
37
- items.push({type: 'comment', comment, timestamp: new Date(comment.createdAt).getTime(), grouped: false});
51
+ items.push({
52
+ type: 'comment',
53
+ comment,
54
+ timestamp: new Date(comment.createdAt).getTime(),
55
+ grouped: false,
56
+ });
38
57
  }
39
58
  items.sort((a, b) => a.timestamp - b.timestamp);
40
59
 
@@ -44,12 +63,18 @@ export function QuoteActivityTimeline({versions, comments, currentVersionNumber,
44
63
  if (item.type === 'comment') {
45
64
  for (let j = i - 1; j >= 0; j--) {
46
65
  if (Math.abs(item.timestamp - items[j].timestamp) > GROUP_THRESHOLD_MS) break;
47
- if (items[j].type === 'version') {item.grouped = true; break;}
66
+ if (items[j].type === 'version') {
67
+ item.grouped = true;
68
+ break;
69
+ }
48
70
  }
49
71
  if (!item.grouped) {
50
72
  for (let j = i + 1; j < items.length; j++) {
51
73
  if (Math.abs(items[j].timestamp - item.timestamp) > GROUP_THRESHOLD_MS) break;
52
- if (items[j].type === 'version') {item.grouped = true; break;}
74
+ if (items[j].type === 'version') {
75
+ item.grouped = true;
76
+ break;
77
+ }
53
78
  }
54
79
  }
55
80
  }
@@ -103,8 +128,8 @@ export function QuoteActivityTimeline({versions, comments, currentVersionNumber,
103
128
  // ── Version diff logic ──
104
129
 
105
130
  interface VersionDiff {
106
- addedItems: Array<{productName: string; sku: string; quantity: number; unitPrice: number}>;
107
- removedItems: Array<{productName: string; sku: string}>;
131
+ addedItems: Array<{ productName: string; sku: string; quantity: number; unitPrice: number }>;
132
+ removedItems: Array<{ productName: string; sku: string }>;
108
133
  changedItems: Array<{
109
134
  productName: string;
110
135
  sku: string;
@@ -119,8 +144,8 @@ interface VersionDiff {
119
144
  }
120
145
 
121
146
  function computeDiff(prev: QuoteVersion, curr: QuoteVersion): VersionDiff {
122
- const prevBySku = new Map(prev.lineItems.map(li => [li.sku, li]));
123
- const currBySku = new Map(curr.lineItems.map(li => [li.sku, li]));
147
+ const prevBySku = new Map(prev.lineItems.map((li) => [li.sku, li]));
148
+ const currBySku = new Map(curr.lineItems.map((li) => [li.sku, li]));
124
149
 
125
150
  const addedItems: VersionDiff['addedItems'] = [];
126
151
  const removedItems: VersionDiff['removedItems'] = [];
@@ -129,7 +154,12 @@ function computeDiff(prev: QuoteVersion, curr: QuoteVersion): VersionDiff {
129
154
  for (const [sku, item] of currBySku) {
130
155
  const prevItem = prevBySku.get(sku);
131
156
  if (!prevItem) {
132
- addedItems.push({productName: item.productName, sku, quantity: item.quantity, unitPrice: item.unitPrice});
157
+ addedItems.push({
158
+ productName: item.productName,
159
+ sku,
160
+ quantity: item.quantity,
161
+ unitPrice: item.unitPrice,
162
+ });
133
163
  } else {
134
164
  const priceChanged = item.unitPrice !== prevItem.unitPrice;
135
165
  const qtyChanged = item.quantity !== prevItem.quantity;
@@ -149,19 +179,21 @@ function computeDiff(prev: QuoteVersion, curr: QuoteVersion): VersionDiff {
149
179
  }
150
180
  for (const [sku, item] of prevBySku) {
151
181
  if (!currBySku.has(sku)) {
152
- removedItems.push({productName: item.productName, sku});
182
+ removedItems.push({ productName: item.productName, sku });
153
183
  }
154
184
  }
155
185
 
156
- return {addedItems, removedItems, changedItems, totalDelta: curr.total - prev.total};
186
+ return { addedItems, removedItems, changedItems, totalDelta: curr.total - prev.total };
157
187
  }
158
188
 
159
189
  function buildSummary(diff: VersionDiff): string {
160
190
  const parts: string[] = [];
161
- if (diff.addedItems.length > 0) parts.push(`+${diff.addedItems.length} item${diff.addedItems.length > 1 ? 's' : ''}`);
162
- if (diff.removedItems.length > 0) parts.push(`-${diff.removedItems.length} item${diff.removedItems.length > 1 ? 's' : ''}`);
163
- const priceChanges = diff.changedItems.filter(c => c.priceChanged).length;
164
- const qtyChanges = diff.changedItems.filter(c => c.qtyChanged).length;
191
+ if (diff.addedItems.length > 0)
192
+ parts.push(`+${diff.addedItems.length} item${diff.addedItems.length > 1 ? 's' : ''}`);
193
+ if (diff.removedItems.length > 0)
194
+ parts.push(`-${diff.removedItems.length} item${diff.removedItems.length > 1 ? 's' : ''}`);
195
+ const priceChanges = diff.changedItems.filter((c) => c.priceChanged).length;
196
+ const qtyChanges = diff.changedItems.filter((c) => c.qtyChanged).length;
165
197
  if (priceChanges > 0) parts.push(`${priceChanges} price change${priceChanges > 1 ? 's' : ''}`);
166
198
  if (qtyChanges > 0) parts.push(`${qtyChanges} qty change${qtyChanges > 1 ? 's' : ''}`);
167
199
  return parts.join(', ');
@@ -169,7 +201,19 @@ function buildSummary(diff: VersionDiff): string {
169
201
 
170
202
  // ── Timeline entries ──
171
203
 
172
- function VersionEntry({version, isCurrent, diff, locale, currencyCode}: {version: QuoteVersion; isCurrent: boolean; diff?: VersionDiff; locale: string; currencyCode: string}) {
204
+ function VersionEntry({
205
+ version,
206
+ isCurrent,
207
+ diff,
208
+ locale,
209
+ currencyCode,
210
+ }: {
211
+ version: QuoteVersion;
212
+ isCurrent: boolean;
213
+ diff?: VersionDiff;
214
+ locale: string;
215
+ currencyCode: string;
216
+ }) {
173
217
  const isFirst = version.versionNumber === 1;
174
218
  const summary = diff ? buildSummary(diff) : null;
175
219
  const totalChanges = diff
@@ -178,18 +222,22 @@ function VersionEntry({version, isCurrent, diff, locale, currencyCode}: {version
178
222
  const hasChanges = totalChanges > 0;
179
223
  const [expanded, setExpanded] = useState(totalChanges <= COLLAPSE_THRESHOLD);
180
224
 
181
- const allDiffRows = diff ? [
182
- ...diff.addedItems.map(item => ({type: 'added' as const, ...item})),
183
- ...diff.removedItems.map(item => ({type: 'removed' as const, ...item})),
184
- ...diff.changedItems.map(item => ({type: 'changed' as const, ...item})),
185
- ] : [];
225
+ const allDiffRows = diff
226
+ ? [
227
+ ...diff.addedItems.map((item) => ({ type: 'added' as const, ...item })),
228
+ ...diff.removedItems.map((item) => ({ type: 'removed' as const, ...item })),
229
+ ...diff.changedItems.map((item) => ({ type: 'changed' as const, ...item })),
230
+ ]
231
+ : [];
186
232
 
187
233
  return (
188
234
  <div className="relative flex gap-3 py-3 group">
189
235
  <div className="relative z-10 flex-shrink-0">
190
- <div className={`h-6 w-6 rounded-full flex items-center justify-center shadow-sm ${
191
- isFirst ? 'bg-muted text-muted-foreground' : 'bg-primary text-primary-foreground'
192
- }`}>
236
+ <div
237
+ className={`h-6 w-6 rounded-full flex items-center justify-center shadow-sm ${
238
+ isFirst ? 'bg-muted text-muted-foreground' : 'bg-primary text-primary-foreground'
239
+ }`}
240
+ >
193
241
  {isFirst ? <FileText className="h-3 w-3" /> : <Send className="h-3 w-3" />}
194
242
  </div>
195
243
  </div>
@@ -206,12 +254,12 @@ function VersionEntry({version, isCurrent, diff, locale, currencyCode}: {version
206
254
  </span>
207
255
  )}
208
256
  </div>
209
- {summary && (
210
- <p className="text-xs text-muted-foreground mt-0.5">{summary}</p>
211
- )}
257
+ {summary && <p className="text-xs text-muted-foreground mt-0.5">{summary}</p>}
212
258
  </div>
213
259
  <div className="text-right flex-shrink-0 ml-4">
214
- <p className="text-xs text-muted-foreground">{formatDateTime(version.createdAt, locale)}</p>
260
+ <p className="text-xs text-muted-foreground">
261
+ {formatDateTime(version.createdAt, locale)}
262
+ </p>
215
263
  <p className="text-sm font-medium">
216
264
  <Price value={version.total} currencyCode={currencyCode} taxLabel="excl" />
217
265
  </p>
@@ -225,28 +273,37 @@ function VersionEntry({version, isCurrent, diff, locale, currencyCode}: {version
225
273
  onClick={() => setExpanded(!expanded)}
226
274
  className="flex items-center gap-1 text-xs text-muted-foreground hover:text-foreground transition-colors mb-1"
227
275
  >
228
- {expanded
229
- ? <ChevronDown className="h-3 w-3" />
230
- : <ChevronRight className="h-3 w-3" />
231
- }
276
+ {expanded ? (
277
+ <ChevronDown className="h-3 w-3" />
278
+ ) : (
279
+ <ChevronRight className="h-3 w-3" />
280
+ )}
232
281
  {expanded ? 'Hide' : 'Show'} {totalChanges} changes
233
282
  </button>
234
283
  )}
235
284
  {expanded && (
236
285
  <div className="text-xs space-y-1 border-l-2 border-muted pl-3">
237
- {allDiffRows.map(row => {
286
+ {allDiffRows.map((row) => {
238
287
  if (row.type === 'added') {
239
288
  return (
240
- <div key={row.sku} className="flex items-center gap-1.5 text-green-600 dark:text-green-400">
289
+ <div
290
+ key={row.sku}
291
+ className="flex items-center gap-1.5 text-green-600 dark:text-green-400"
292
+ >
241
293
  <Plus className="h-3 w-3" />
242
294
  <span>{row.productName}</span>
243
- <span className="text-muted-foreground">× {row.quantity}</span>
295
+ <span className="text-muted-foreground">
296
+ × {row.quantity}
297
+ </span>
244
298
  </div>
245
299
  );
246
300
  }
247
301
  if (row.type === 'removed') {
248
302
  return (
249
- <div key={row.sku} className="flex items-center gap-1.5 text-red-600 dark:text-red-400 line-through">
303
+ <div
304
+ key={row.sku}
305
+ className="flex items-center gap-1.5 text-red-600 dark:text-red-400 line-through"
306
+ >
250
307
  <Minus className="h-3 w-3" />
251
308
  <span>{row.productName}</span>
252
309
  </div>
@@ -259,11 +316,22 @@ function VersionEntry({version, isCurrent, diff, locale, currencyCode}: {version
259
316
  {row.priceChanged && (
260
317
  <span>
261
318
  <span className="text-muted-foreground line-through">
262
- <Price value={row.prevPrice} currencyCode={currencyCode} />
263
- </span>
264
- {' '}
265
- <span className={row.newPrice < row.prevPrice ? 'text-green-600' : 'text-red-600'}>
266
- <Price value={row.newPrice} currencyCode={currencyCode} />
319
+ <Price
320
+ value={row.prevPrice}
321
+ currencyCode={currencyCode}
322
+ />
323
+ </span>{' '}
324
+ <span
325
+ className={
326
+ row.newPrice < row.prevPrice
327
+ ? 'text-green-600'
328
+ : 'text-red-600'
329
+ }
330
+ >
331
+ <Price
332
+ value={row.newPrice}
333
+ currencyCode={currencyCode}
334
+ />
267
335
  </span>
268
336
  </span>
269
337
  )}
@@ -284,7 +352,15 @@ function VersionEntry({version, isCurrent, diff, locale, currencyCode}: {version
284
352
  );
285
353
  }
286
354
 
287
- function CommentEntry({comment, grouped, locale}: {comment: QuoteComment; grouped: boolean; locale: string}) {
355
+ function CommentEntry({
356
+ comment,
357
+ grouped,
358
+ locale,
359
+ }: {
360
+ comment: QuoteComment;
361
+ grouped: boolean;
362
+ locale: string;
363
+ }) {
288
364
  const authorName = comment.authorCustomer
289
365
  ? `${comment.authorCustomer.firstName} ${comment.authorCustomer.lastName}`
290
366
  : 'Seller';
@@ -1,19 +1,19 @@
1
1
  'use client';
2
2
 
3
- import {useState, useTransition} from 'react';
4
- import {Button} from '@/components/ui/button';
5
- import {Textarea} from '@/components/ui/textarea';
6
- import {Send} from 'lucide-react';
7
- import {addQuoteComment} from '@/app/[locale]/account/quotes/actions';
3
+ import { addQuoteComment } from '@/app/[locale]/account/quotes/actions';
4
+ import { Button } from '@/components/ui/button';
5
+ import { Textarea } from '@/components/ui/textarea';
6
+ import { Send } from 'lucide-react';
7
+ import { useState, useTransition } from 'react';
8
8
 
9
9
  interface QuoteCommentFormProps {
10
10
  quoteId: string;
11
11
  }
12
12
 
13
- export function QuoteCommentForm({quoteId}: QuoteCommentFormProps) {
13
+ export function QuoteCommentForm({ quoteId }: QuoteCommentFormProps) {
14
14
  const [text, setText] = useState('');
15
15
  const [isPending, startTransition] = useTransition();
16
- const [result, setResult] = useState<{success: boolean; message?: string} | null>(null);
16
+ const [result, setResult] = useState<{ success: boolean; message?: string } | null>(null);
17
17
 
18
18
  function handleSubmit() {
19
19
  if (!text.trim()) return;
@@ -39,12 +39,8 @@ export function QuoteCommentForm({quoteId}: QuoteCommentFormProps) {
39
39
  {result && !result.success && (
40
40
  <p className="text-sm text-red-600">{result.message || 'Failed to add comment'}</p>
41
41
  )}
42
- <Button
43
- size="sm"
44
- onClick={handleSubmit}
45
- disabled={isPending || !text.trim()}
46
- >
47
- <Send className="h-4 w-4 mr-1"/>
42
+ <Button size="sm" onClick={handleSubmit} disabled={isPending || !text.trim()}>
43
+ <Send className="h-4 w-4 mr-1" />
48
44
  Send
49
45
  </Button>
50
46
  </div>
@@ -1,7 +1,7 @@
1
1
  'use client';
2
2
 
3
- import {Download} from 'lucide-react';
4
- import {Button} from '@/components/ui/button';
3
+ import { Button } from '@/components/ui/button';
4
+ import { Download } from 'lucide-react';
5
5
 
6
6
  interface QuoteCsvExportButtonProps {
7
7
  quoteNumber: string;
@@ -37,7 +37,7 @@ export function QuoteCsvExportButton({
37
37
  v1LineItems,
38
38
  }: QuoteCsvExportButtonProps) {
39
39
  const hasComparison = v1LineItems && v1LineItems.length > 0;
40
- const v1BySku = new Map(v1LineItems?.map(item => [item.sku, item]) ?? []);
40
+ const v1BySku = new Map(v1LineItems?.map((item) => [item.sku, item]) ?? []);
41
41
 
42
42
  function handleExport() {
43
43
  const headers = ['SKU', 'Product Name', 'Quantity', 'Unit Price', 'Line Total'];
@@ -78,8 +78,8 @@ export function QuoteCsvExportButton({
78
78
  rows.push(['', '', '', 'Shipping', (shippingCost / 100).toFixed(2)]);
79
79
  rows.push(['', '', '', 'Total', (total / 100).toFixed(2)]);
80
80
 
81
- const csv = rows.map(row => row.join(',')).join('\n');
82
- const blob = new Blob([csv], {type: 'text/csv;charset=utf-8;'});
81
+ const csv = rows.map((row) => row.join(',')).join('\n');
82
+ const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });
83
83
  const url = URL.createObjectURL(blob);
84
84
  const link = document.createElement('a');
85
85
  link.href = url;
@@ -90,7 +90,7 @@ export function QuoteCsvExportButton({
90
90
 
91
91
  return (
92
92
  <Button variant="outline" size="sm" onClick={handleExport}>
93
- <Download className="h-4 w-4 mr-2"/>
93
+ <Download className="h-4 w-4 mr-2" />
94
94
  Export CSV
95
95
  </Button>
96
96
  );
@@ -1,12 +1,12 @@
1
1
  'use client';
2
2
 
3
- import { useState, useTransition, useRef, useEffect, useCallback } from 'react';
4
- import Image from 'next/image';
5
- import { Input } from '@/components/ui/input';
6
- import { Plus, Search, Loader2 } from 'lucide-react';
7
3
  import { searchVariantsForQuote } from '@/app/[locale]/account/quotes/actions';
8
- import type { QuoteLineItemDraft } from './quote-request-form';
4
+ import { Input } from '@/components/ui/input';
5
+ import { Loader2, Plus, Search } from 'lucide-react';
9
6
  import { useTranslations } from 'next-intl';
7
+ import Image from 'next/image';
8
+ import { useCallback, useEffect, useRef, useState, useTransition } from 'react';
9
+ import type { QuoteLineItemDraft } from './quote-request-form';
10
10
 
11
11
  interface QuoteProductSearchProps {
12
12
  onAddItem: (item: QuoteLineItemDraft) => void;
@@ -16,16 +16,18 @@ interface QuoteProductSearchProps {
16
16
  export function QuoteProductSearch({ onAddItem, currencyCode }: QuoteProductSearchProps) {
17
17
  const t = useTranslations('Quotes');
18
18
  const [searchTerm, setSearchTerm] = useState('');
19
- const [results, setResults] = useState<Array<{
20
- productVariantId: string;
21
- productName: string;
22
- variantName: string;
23
- sku: string;
24
- imageUrl?: string;
25
- price: number;
26
- currencyCode: string;
27
- inStock: boolean;
28
- }>>([]);
19
+ const [results, setResults] = useState<
20
+ Array<{
21
+ productVariantId: string;
22
+ productName: string;
23
+ variantName: string;
24
+ sku: string;
25
+ imageUrl?: string;
26
+ price: number;
27
+ currencyCode: string;
28
+ inStock: boolean;
29
+ }>
30
+ >([]);
29
31
  const [isPending, startTransition] = useTransition();
30
32
  const [isOpen, setIsOpen] = useState(false);
31
33
  const containerRef = useRef<HTMLDivElement>(null);
@@ -66,7 +68,7 @@ export function QuoteProductSearch({ onAddItem, currencyCode }: QuoteProductSear
66
68
  return () => document.removeEventListener('mousedown', handleClickOutside);
67
69
  }, []);
68
70
 
69
- const handleAdd = (item: typeof results[number]) => {
71
+ const handleAdd = (item: (typeof results)[number]) => {
70
72
  onAddItem({
71
73
  productVariantId: item.productVariantId,
72
74
  productName: item.productName,
@@ -89,8 +91,10 @@ export function QuoteProductSearch({ onAddItem, currencyCode }: QuoteProductSear
89
91
  <Search className="absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground" />
90
92
  <Input
91
93
  value={searchTerm}
92
- onChange={e => handleSearch(e.target.value)}
93
- onKeyDown={e => { if (e.key === 'Escape') setIsOpen(false); }}
94
+ onChange={(e) => handleSearch(e.target.value)}
95
+ onKeyDown={(e) => {
96
+ if (e.key === 'Escape') setIsOpen(false);
97
+ }}
94
98
  placeholder={t('requestForm.searchPlaceholder')}
95
99
  className="pl-10"
96
100
  />
@@ -1,14 +1,14 @@
1
1
  'use client';
2
2
 
3
- import { useState, useTransition } from 'react';
4
- import Image from 'next/image';
3
+ import { Price } from '@/components/commerce/price';
5
4
  import { Button } from '@/components/ui/button';
6
5
  import { Input } from '@/components/ui/input';
7
- import { Textarea } from '@/components/ui/textarea';
8
6
  import { Label } from '@/components/ui/label';
9
- import { Price } from '@/components/commerce/price';
10
- import { Minus, Plus, Trash2, Send } from 'lucide-react';
7
+ import { Textarea } from '@/components/ui/textarea';
8
+ import { Minus, Plus, Send, Trash2 } from 'lucide-react';
11
9
  import { useTranslations } from 'next-intl';
10
+ import Image from 'next/image';
11
+ import { useState, useTransition } from 'react';
12
12
 
13
13
  export interface QuoteLineItemDraft {
14
14
  productVariantId: string;
@@ -54,7 +54,7 @@ export function QuoteRequestForm({
54
54
  const [error, setError] = useState<string | null>(null);
55
55
 
56
56
  const updateQuantity = (index: number, delta: number) => {
57
- setLineItems(prev =>
57
+ setLineItems((prev) =>
58
58
  prev.map((item, i) =>
59
59
  i === index ? { ...item, quantity: Math.max(1, item.quantity + delta) } : item,
60
60
  ),
@@ -62,22 +62,20 @@ export function QuoteRequestForm({
62
62
  };
63
63
 
64
64
  const setQuantity = (index: number, quantity: number) => {
65
- setLineItems(prev =>
65
+ setLineItems((prev) =>
66
66
  prev.map((item, i) => (i === index ? { ...item, quantity: Math.max(1, quantity) } : item)),
67
67
  );
68
68
  };
69
69
 
70
70
  const removeItem = (index: number) => {
71
- setLineItems(prev => prev.filter((_, i) => i !== index));
71
+ setLineItems((prev) => prev.filter((_, i) => i !== index));
72
72
  };
73
73
 
74
74
  const addItem = (item: QuoteLineItemDraft) => {
75
- setLineItems(prev => {
76
- const existing = prev.findIndex(li => li.productVariantId === item.productVariantId);
75
+ setLineItems((prev) => {
76
+ const existing = prev.findIndex((li) => li.productVariantId === item.productVariantId);
77
77
  if (existing >= 0) {
78
- return prev.map((li, i) =>
79
- i === existing ? { ...li, quantity: li.quantity + 1 } : li,
80
- );
78
+ return prev.map((li, i) => (i === existing ? { ...li, quantity: li.quantity + 1 } : li));
81
79
  }
82
80
  return [...prev, item];
83
81
  });
@@ -91,7 +89,7 @@ export function QuoteRequestForm({
91
89
  setError(null);
92
90
  startTransition(async () => {
93
91
  const result = await onSubmit(
94
- lineItems.map(li => ({
92
+ lineItems.map((li) => ({
95
93
  productVariantId: li.productVariantId,
96
94
  quantity: li.quantity,
97
95
  note: li.note || undefined,
@@ -111,9 +109,7 @@ export function QuoteRequestForm({
111
109
  <div className="text-sm">
112
110
  <span className="font-medium">{sender.name}</span>
113
111
  <span className="text-muted-foreground ml-2">{sender.email}</span>
114
- {sender.company && (
115
- <span className="text-muted-foreground ml-2">({sender.company})</span>
116
- )}
112
+ {sender.company && <span className="text-muted-foreground ml-2">({sender.company})</span>}
117
113
  </div>
118
114
  </div>
119
115
 
@@ -127,7 +123,10 @@ export function QuoteRequestForm({
127
123
  ) : (
128
124
  <div className="divide-y rounded-lg border">
129
125
  {lineItems.map((item, index) => (
130
- <div key={`${item.productVariantId}-${index}`} className="flex items-center gap-4 p-3">
126
+ <div
127
+ key={`${item.productVariantId}-${index}`}
128
+ className="flex items-center gap-4 p-3"
129
+ >
131
130
  {item.imageUrl ? (
132
131
  <Image
133
132
  src={`${item.imageUrl}?preset=tiny`}
@@ -167,7 +166,9 @@ export function QuoteRequestForm({
167
166
  type="number"
168
167
  min={1}
169
168
  value={item.quantity}
170
- onChange={e => setQuantity(index, parseInt(e.target.value, 10) || 1)}
169
+ onChange={(e) =>
170
+ setQuantity(index, parseInt(e.target.value, 10) || 1)
171
+ }
171
172
  className="h-8 w-20 text-center text-sm"
172
173
  />
173
174
  <Button
@@ -181,7 +182,10 @@ export function QuoteRequestForm({
181
182
  </Button>
182
183
  </div>
183
184
  <div className="text-sm text-right w-24">
184
- <Price value={item.unitPrice * item.quantity} currencyCode={item.currencyCode} />
185
+ <Price
186
+ value={item.unitPrice * item.quantity}
187
+ currencyCode={item.currencyCode}
188
+ />
185
189
  </div>
186
190
  <Button
187
191
  type="button"
@@ -219,7 +223,7 @@ export function QuoteRequestForm({
219
223
  <Textarea
220
224
  id="quote-note"
221
225
  value={note}
222
- onChange={e => setNote(e.target.value)}
226
+ onChange={(e) => setNote(e.target.value)}
223
227
  placeholder={t('requestForm.messagePlaceholder')}
224
228
  rows={3}
225
229
  />
@@ -235,16 +239,13 @@ export function QuoteRequestForm({
235
239
  {t('requestForm.cancelButton')}
236
240
  </Button>
237
241
  )}
238
- <Button
239
- onClick={handleSubmit}
240
- disabled={isPending || lineItems.length === 0}
241
- >
242
+ <Button onClick={handleSubmit} disabled={isPending || lineItems.length === 0}>
242
243
  <Send className="h-4 w-4 mr-2" />
243
244
  {isPending
244
245
  ? t('requestForm.submittingButton')
245
246
  : mode === 'from-cart'
246
- ? t('requestForm.submitFromCartButton')
247
- : t('requestForm.submitButton')}
247
+ ? t('requestForm.submitFromCartButton')
248
+ : t('requestForm.submitButton')}
248
249
  </Button>
249
250
  </div>
250
251
  </div>