@vendure-platform/create 0.1.0

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 (531) hide show
  1. package/README.md +70 -0
  2. package/dist/assets/demo-data/branding/logo.svg +4 -0
  3. package/dist/assets/demo-data/images/absorbent-pad.webp +0 -0
  4. package/dist/assets/demo-data/images/adjustable-wrench.webp +0 -0
  5. package/dist/assets/demo-data/images/anchor-bolt.webp +0 -0
  6. package/dist/assets/demo-data/images/angle-grinder.webp +0 -0
  7. package/dist/assets/demo-data/images/barrier-tape.webp +0 -0
  8. package/dist/assets/demo-data/images/bench-grinder.webp +0 -0
  9. package/dist/assets/demo-data/images/bracket.webp +0 -0
  10. package/dist/assets/demo-data/images/broom.webp +0 -0
  11. package/dist/assets/demo-data/images/bucket.webp +0 -0
  12. package/dist/assets/demo-data/images/cable-gland.webp +0 -0
  13. package/dist/assets/demo-data/images/cable-tie.webp +0 -0
  14. package/dist/assets/demo-data/images/cable-tray.webp +0 -0
  15. package/dist/assets/demo-data/images/cable.webp +0 -0
  16. package/dist/assets/demo-data/images/chimney-base-kit.webp +0 -0
  17. package/dist/assets/demo-data/images/chimney-cowl-bird-guard.webp +0 -0
  18. package/dist/assets/demo-data/images/chimney-cowl-open.webp +0 -0
  19. package/dist/assets/demo-data/images/chimney-storm-collar.webp +0 -0
  20. package/dist/assets/demo-data/images/chimney-wall-bracket.webp +0 -0
  21. package/dist/assets/demo-data/images/circular-saw.webp +0 -0
  22. package/dist/assets/demo-data/images/cleaning-spray.webp +0 -0
  23. package/dist/assets/demo-data/images/conduit.webp +0 -0
  24. package/dist/assets/demo-data/images/cordless-drill.webp +0 -0
  25. package/dist/assets/demo-data/images/drill-bits.webp +0 -0
  26. package/dist/assets/demo-data/images/dust-mask.webp +0 -0
  27. package/dist/assets/demo-data/images/ear-defenders.webp +0 -0
  28. package/dist/assets/demo-data/images/ear-plugs.webp +0 -0
  29. package/dist/assets/demo-data/images/extension-lead.webp +0 -0
  30. package/dist/assets/demo-data/images/eye-wash-station.webp +0 -0
  31. package/dist/assets/demo-data/images/face-shield.webp +0 -0
  32. package/dist/assets/demo-data/images/file-set.webp +0 -0
  33. package/dist/assets/demo-data/images/first-aid-kit.webp +0 -0
  34. package/dist/assets/demo-data/images/floor-sign.webp +0 -0
  35. package/dist/assets/demo-data/images/flue-bend-45.webp +0 -0
  36. package/dist/assets/demo-data/images/flue-bend-90.webp +0 -0
  37. package/dist/assets/demo-data/images/flue-section-1000mm.webp +0 -0
  38. package/dist/assets/demo-data/images/flue-section-250mm.webp +0 -0
  39. package/dist/assets/demo-data/images/flue-section-500mm.webp +0 -0
  40. package/dist/assets/demo-data/images/fuse.webp +0 -0
  41. package/dist/assets/demo-data/images/glove-dispenser.webp +0 -0
  42. package/dist/assets/demo-data/images/grinding-disc.webp +0 -0
  43. package/dist/assets/demo-data/images/hacksaw.webp +0 -0
  44. package/dist/assets/demo-data/images/hammer.webp +0 -0
  45. package/dist/assets/demo-data/images/hand-sanitiser.webp +0 -0
  46. package/dist/assets/demo-data/images/head-torch.webp +0 -0
  47. package/dist/assets/demo-data/images/heat-gun.webp +0 -0
  48. package/dist/assets/demo-data/images/hex-bolt.webp +0 -0
  49. package/dist/assets/demo-data/images/hex-key-set.webp +0 -0
  50. package/dist/assets/demo-data/images/hex-nut.webp +0 -0
  51. package/dist/assets/demo-data/images/hi-vis-jacket.webp +0 -0
  52. package/dist/assets/demo-data/images/hi-vis-vest.webp +0 -0
  53. package/dist/assets/demo-data/images/hose-clamp.webp +0 -0
  54. package/dist/assets/demo-data/images/impact-driver.webp +0 -0
  55. package/dist/assets/demo-data/images/jigsaw.webp +0 -0
  56. package/dist/assets/demo-data/images/junction-box.webp +0 -0
  57. package/dist/assets/demo-data/images/knee-pads.webp +0 -0
  58. package/dist/assets/demo-data/images/machine-screw.webp +0 -0
  59. package/dist/assets/demo-data/images/made-to-order-configurable-chimney.webp +0 -0
  60. package/dist/assets/demo-data/images/mallet.webp +0 -0
  61. package/dist/assets/demo-data/images/mcb.webp +0 -0
  62. package/dist/assets/demo-data/images/mop.webp +0 -0
  63. package/dist/assets/demo-data/images/paper-towels.webp +0 -0
  64. package/dist/assets/demo-data/images/pipe-wrench.webp +0 -0
  65. package/dist/assets/demo-data/images/pliers-set.webp +0 -0
  66. package/dist/assets/demo-data/images/pry-bar.webp +0 -0
  67. package/dist/assets/demo-data/images/rcd.webp +0 -0
  68. package/dist/assets/demo-data/images/reciprocating-saw.webp +0 -0
  69. package/dist/assets/demo-data/images/rivet.webp +0 -0
  70. package/dist/assets/demo-data/images/roof-flashing-high-pitch.webp +0 -0
  71. package/dist/assets/demo-data/images/roof-flashing-low-pitch.webp +0 -0
  72. package/dist/assets/demo-data/images/safety-boots.webp +0 -0
  73. package/dist/assets/demo-data/images/safety-glasses.webp +0 -0
  74. package/dist/assets/demo-data/images/safety-harness.webp +0 -0
  75. package/dist/assets/demo-data/images/safety-helmet.webp +0 -0
  76. package/dist/assets/demo-data/images/safety-sign.webp +0 -0
  77. package/dist/assets/demo-data/images/sanding-disc.webp +0 -0
  78. package/dist/assets/demo-data/images/saw-blade.webp +0 -0
  79. package/dist/assets/demo-data/images/screwdriver-set.webp +0 -0
  80. package/dist/assets/demo-data/images/screwdriver.webp +0 -0
  81. package/dist/assets/demo-data/images/self-tapping-screw.webp +0 -0
  82. package/dist/assets/demo-data/images/socket-set.webp +0 -0
  83. package/dist/assets/demo-data/images/socket.webp +0 -0
  84. package/dist/assets/demo-data/images/spanner-set.webp +0 -0
  85. package/dist/assets/demo-data/images/spanner.webp +0 -0
  86. package/dist/assets/demo-data/images/spill-kit.webp +0 -0
  87. package/dist/assets/demo-data/images/spirit-level.webp +0 -0
  88. package/dist/assets/demo-data/images/switch.webp +0 -0
  89. package/dist/assets/demo-data/images/tape-measure.webp +0 -0
  90. package/dist/assets/demo-data/images/terminal-block.webp +0 -0
  91. package/dist/assets/demo-data/images/threaded-rod.webp +0 -0
  92. package/dist/assets/demo-data/images/torque-wrench.webp +0 -0
  93. package/dist/assets/demo-data/images/utility-knife.webp +0 -0
  94. package/dist/assets/demo-data/images/wall-pass-sleeve.webp +0 -0
  95. package/dist/assets/demo-data/images/wall-plug.webp +0 -0
  96. package/dist/assets/demo-data/images/washer.webp +0 -0
  97. package/dist/assets/demo-data/images/waste-bin.webp +0 -0
  98. package/dist/assets/demo-data/images/wire-connector.webp +0 -0
  99. package/dist/assets/demo-data/images/wire-cutters.webp +0 -0
  100. package/dist/assets/demo-data/images/wood-screw.webp +0 -0
  101. package/dist/assets/demo-data/images/work-gloves.webp +0 -0
  102. package/dist/assets/demo-data/images/work-light.webp +0 -0
  103. package/dist/assets/demo-data/initial-data.json +667 -0
  104. package/dist/assets/demo-data/products.csv +779 -0
  105. package/dist/assets/storefront/.env.example +14 -0
  106. package/dist/assets/storefront/.env.local +1 -0
  107. package/dist/assets/storefront/components.json +22 -0
  108. package/dist/assets/storefront/eslint.config.mjs +23 -0
  109. package/dist/assets/storefront/graphql.config.yml +2 -0
  110. package/dist/assets/storefront/messages/de.json +1196 -0
  111. package/dist/assets/storefront/messages/en.json +1196 -0
  112. package/dist/assets/storefront/next-env.d.ts +6 -0
  113. package/dist/assets/storefront/next.config.ts +73 -0
  114. package/dist/assets/storefront/package.json +77 -0
  115. package/dist/assets/storefront/postcss.config.mjs +5 -0
  116. package/dist/assets/storefront/public/next.svg +22 -0
  117. package/dist/assets/storefront/public/scenarios/b2b-wholesale/hero/hero-bg.webp +0 -0
  118. package/dist/assets/storefront/public/scenarios/b2b-wholesale/logo.svg +4 -0
  119. package/dist/assets/storefront/public/scenarios/default/logo.svg +4 -0
  120. package/dist/assets/storefront/public/scenarios/kaminpro/hero/hero-bg.webp +0 -0
  121. package/dist/assets/storefront/public/scenarios/kaminpro/logo.svg +7 -0
  122. package/dist/assets/storefront/public/vendure.svg +4 -0
  123. package/dist/assets/storefront/src/app/[locale]/(catalog)/catalog/page.tsx +65 -0
  124. package/dist/assets/storefront/src/app/[locale]/(catalog)/collection/[slug]/loading.tsx +24 -0
  125. package/dist/assets/storefront/src/app/[locale]/(catalog)/collection/[slug]/page.tsx +194 -0
  126. package/dist/assets/storefront/src/app/[locale]/(catalog)/layout.tsx +9 -0
  127. package/dist/assets/storefront/src/app/[locale]/(catalog)/product/[slug]/actions.ts +139 -0
  128. package/dist/assets/storefront/src/app/[locale]/(catalog)/product/[slug]/loading.tsx +46 -0
  129. package/dist/assets/storefront/src/app/[locale]/(catalog)/product/[slug]/page.tsx +330 -0
  130. package/dist/assets/storefront/src/app/[locale]/(catalog)/search/actions.ts +11 -0
  131. package/dist/assets/storefront/src/app/[locale]/(catalog)/search/loading.tsx +20 -0
  132. package/dist/assets/storefront/src/app/[locale]/(catalog)/search/page.tsx +97 -0
  133. package/dist/assets/storefront/src/app/[locale]/(catalog)/search/search-analytics-tracker.tsx +46 -0
  134. package/dist/assets/storefront/src/app/[locale]/(catalog)/search/search-results.tsx +53 -0
  135. package/dist/assets/storefront/src/app/[locale]/(catalog)/search/search-term.tsx +26 -0
  136. package/dist/assets/storefront/src/app/[locale]/(scenario)/[...path]/page.tsx +31 -0
  137. package/dist/assets/storefront/src/app/[locale]/accept-invitation/[token]/accept-invitation-client.tsx +56 -0
  138. package/dist/assets/storefront/src/app/[locale]/accept-invitation/[token]/actions.ts +32 -0
  139. package/dist/assets/storefront/src/app/[locale]/accept-invitation/[token]/page.tsx +85 -0
  140. package/dist/assets/storefront/src/app/[locale]/accept-invitation/[token]/sign-out-and-retry.tsx +26 -0
  141. package/dist/assets/storefront/src/app/[locale]/account/addresses/actions.ts +125 -0
  142. package/dist/assets/storefront/src/app/[locale]/account/addresses/address-form.tsx +180 -0
  143. package/dist/assets/storefront/src/app/[locale]/account/addresses/addresses-client.tsx +292 -0
  144. package/dist/assets/storefront/src/app/[locale]/account/addresses/loading.tsx +48 -0
  145. package/dist/assets/storefront/src/app/[locale]/account/addresses/page.tsx +54 -0
  146. package/dist/assets/storefront/src/app/[locale]/account/approvals/actions.ts +28 -0
  147. package/dist/assets/storefront/src/app/[locale]/account/approvals/page.tsx +340 -0
  148. package/dist/assets/storefront/src/app/[locale]/account/company/actions.ts +33 -0
  149. package/dist/assets/storefront/src/app/[locale]/account/company/addresses/actions.ts +83 -0
  150. package/dist/assets/storefront/src/app/[locale]/account/company/addresses/address-form.tsx +267 -0
  151. package/dist/assets/storefront/src/app/[locale]/account/company/addresses/addresses-client.tsx +253 -0
  152. package/dist/assets/storefront/src/app/[locale]/account/company/addresses/page.tsx +75 -0
  153. package/dist/assets/storefront/src/app/[locale]/account/company/business-units/actions.ts +70 -0
  154. package/dist/assets/storefront/src/app/[locale]/account/company/business-units/business-unit-form.tsx +153 -0
  155. package/dist/assets/storefront/src/app/[locale]/account/company/business-units/business-units-client.tsx +210 -0
  156. package/dist/assets/storefront/src/app/[locale]/account/company/business-units/page.tsx +66 -0
  157. package/dist/assets/storefront/src/app/[locale]/account/company/business-units/types.ts +8 -0
  158. package/dist/assets/storefront/src/app/[locale]/account/company/edit-company-form.tsx +57 -0
  159. package/dist/assets/storefront/src/app/[locale]/account/company/page.tsx +89 -0
  160. package/dist/assets/storefront/src/app/[locale]/account/company/payment-methods/page.tsx +65 -0
  161. package/dist/assets/storefront/src/app/[locale]/account/company/payment-methods/payment-methods-client.tsx +55 -0
  162. package/dist/assets/storefront/src/app/[locale]/account/company/roles/page.tsx +66 -0
  163. package/dist/assets/storefront/src/app/[locale]/account/company/roles/roles-client.tsx +93 -0
  164. package/dist/assets/storefront/src/app/[locale]/account/company/tax-ids/actions.ts +51 -0
  165. package/dist/assets/storefront/src/app/[locale]/account/company/tax-ids/page.tsx +57 -0
  166. package/dist/assets/storefront/src/app/[locale]/account/company/tax-ids/tax-ids-client.tsx +326 -0
  167. package/dist/assets/storefront/src/app/[locale]/account/company/users/actions.ts +74 -0
  168. package/dist/assets/storefront/src/app/[locale]/account/company/users/edit-user-form.tsx +157 -0
  169. package/dist/assets/storefront/src/app/[locale]/account/company/users/invite-user-form.tsx +133 -0
  170. package/dist/assets/storefront/src/app/[locale]/account/company/users/page.tsx +104 -0
  171. package/dist/assets/storefront/src/app/[locale]/account/company/users/users-client.tsx +266 -0
  172. package/dist/assets/storefront/src/app/[locale]/account/error.tsx +24 -0
  173. package/dist/assets/storefront/src/app/[locale]/account/layout.tsx +50 -0
  174. package/dist/assets/storefront/src/app/[locale]/account/orders/[code]/page.tsx +463 -0
  175. package/dist/assets/storefront/src/app/[locale]/account/orders/[code]/reorder-actions.ts +160 -0
  176. package/dist/assets/storefront/src/app/[locale]/account/orders/[code]/reorder-dialog.tsx +386 -0
  177. package/dist/assets/storefront/src/app/[locale]/account/orders/loading.tsx +45 -0
  178. package/dist/assets/storefront/src/app/[locale]/account/orders/page.tsx +309 -0
  179. package/dist/assets/storefront/src/app/[locale]/account/profile/actions.ts +106 -0
  180. package/dist/assets/storefront/src/app/[locale]/account/profile/change-password-form.tsx +82 -0
  181. package/dist/assets/storefront/src/app/[locale]/account/profile/edit-email-form.tsx +88 -0
  182. package/dist/assets/storefront/src/app/[locale]/account/profile/edit-profile-form.tsx +80 -0
  183. package/dist/assets/storefront/src/app/[locale]/account/profile/loading.tsx +54 -0
  184. package/dist/assets/storefront/src/app/[locale]/account/profile/page.tsx +44 -0
  185. package/dist/assets/storefront/src/app/[locale]/account/quick-order/actions.ts +103 -0
  186. package/dist/assets/storefront/src/app/[locale]/account/quick-order/file-upload-tab.tsx +148 -0
  187. package/dist/assets/storefront/src/app/[locale]/account/quick-order/manual-entry-tab.tsx +112 -0
  188. package/dist/assets/storefront/src/app/[locale]/account/quick-order/page.tsx +26 -0
  189. package/dist/assets/storefront/src/app/[locale]/account/quick-order/preview-table.tsx +170 -0
  190. package/dist/assets/storefront/src/app/[locale]/account/quick-order/quick-order-form.tsx +243 -0
  191. package/dist/assets/storefront/src/app/[locale]/account/quick-order/save-to-list-dialog.tsx +153 -0
  192. package/dist/assets/storefront/src/app/[locale]/account/quick-order/sku-autocomplete.tsx +118 -0
  193. package/dist/assets/storefront/src/app/[locale]/account/quick-order/text-input-tab.tsx +40 -0
  194. package/dist/assets/storefront/src/app/[locale]/account/quotes/[id]/page.tsx +260 -0
  195. package/dist/assets/storefront/src/app/[locale]/account/quotes/actions.ts +253 -0
  196. package/dist/assets/storefront/src/app/[locale]/account/quotes/new/new-quote-form.tsx +28 -0
  197. package/dist/assets/storefront/src/app/[locale]/account/quotes/new/page.tsx +51 -0
  198. package/dist/assets/storefront/src/app/[locale]/account/quotes/page.tsx +248 -0
  199. package/dist/assets/storefront/src/app/[locale]/account/shopping-lists/[id]/loading.tsx +44 -0
  200. package/dist/assets/storefront/src/app/[locale]/account/shopping-lists/[id]/page.tsx +51 -0
  201. package/dist/assets/storefront/src/app/[locale]/account/shopping-lists/[id]/shopping-list-detail-client.tsx +562 -0
  202. package/dist/assets/storefront/src/app/[locale]/account/shopping-lists/actions.ts +235 -0
  203. package/dist/assets/storefront/src/app/[locale]/account/shopping-lists/create-shopping-list-form.tsx +86 -0
  204. package/dist/assets/storefront/src/app/[locale]/account/shopping-lists/loading.tsx +48 -0
  205. package/dist/assets/storefront/src/app/[locale]/account/shopping-lists/page.tsx +176 -0
  206. package/dist/assets/storefront/src/app/[locale]/account/store-credits/actions.ts +31 -0
  207. package/dist/assets/storefront/src/app/[locale]/account/store-credits/claim-form.tsx +41 -0
  208. package/dist/assets/storefront/src/app/[locale]/account/store-credits/page.tsx +190 -0
  209. package/dist/assets/storefront/src/app/[locale]/account/store-credits/reveal-code.tsx +38 -0
  210. package/dist/assets/storefront/src/app/[locale]/account/verify-email/page.tsx +117 -0
  211. package/dist/assets/storefront/src/app/[locale]/cart/actions.ts +128 -0
  212. package/dist/assets/storefront/src/app/[locale]/cart/cart-items.tsx +228 -0
  213. package/dist/assets/storefront/src/app/[locale]/cart/cart-line-actions.tsx +55 -0
  214. package/dist/assets/storefront/src/app/[locale]/cart/cart-quantity-control.tsx +158 -0
  215. package/dist/assets/storefront/src/app/[locale]/cart/cart-remove-button.tsx +36 -0
  216. package/dist/assets/storefront/src/app/[locale]/cart/cart.tsx +151 -0
  217. package/dist/assets/storefront/src/app/[locale]/cart/code-input.tsx +49 -0
  218. package/dist/assets/storefront/src/app/[locale]/cart/loading.tsx +10 -0
  219. package/dist/assets/storefront/src/app/[locale]/cart/order-summary.tsx +178 -0
  220. package/dist/assets/storefront/src/app/[locale]/cart/page.tsx +33 -0
  221. package/dist/assets/storefront/src/app/[locale]/cart/promotion-code.tsx +142 -0
  222. package/dist/assets/storefront/src/app/[locale]/cart/reapproval-confirm.tsx +76 -0
  223. package/dist/assets/storefront/src/app/[locale]/cart/request-quote-button.tsx +80 -0
  224. package/dist/assets/storefront/src/app/[locale]/checkout/actions.ts +192 -0
  225. package/dist/assets/storefront/src/app/[locale]/checkout/cancel-quote-checkout-button.tsx +30 -0
  226. package/dist/assets/storefront/src/app/[locale]/checkout/checkout-flow.tsx +214 -0
  227. package/dist/assets/storefront/src/app/[locale]/checkout/checkout-provider.tsx +181 -0
  228. package/dist/assets/storefront/src/app/[locale]/checkout/loading.tsx +90 -0
  229. package/dist/assets/storefront/src/app/[locale]/checkout/order-summary.tsx +160 -0
  230. package/dist/assets/storefront/src/app/[locale]/checkout/page.tsx +154 -0
  231. package/dist/assets/storefront/src/app/[locale]/checkout/steps/delivery-step.tsx +107 -0
  232. package/dist/assets/storefront/src/app/[locale]/checkout/steps/payment-step.tsx +110 -0
  233. package/dist/assets/storefront/src/app/[locale]/checkout/steps/review-step.tsx +180 -0
  234. package/dist/assets/storefront/src/app/[locale]/checkout/steps/shipping-address-step.tsx +518 -0
  235. package/dist/assets/storefront/src/app/[locale]/checkout/types.ts +7 -0
  236. package/dist/assets/storefront/src/app/[locale]/error.tsx +28 -0
  237. package/dist/assets/storefront/src/app/[locale]/forgot-password/actions.ts +28 -0
  238. package/dist/assets/storefront/src/app/[locale]/forgot-password/forgot-password-form.tsx +128 -0
  239. package/dist/assets/storefront/src/app/[locale]/forgot-password/page.tsx +24 -0
  240. package/dist/assets/storefront/src/app/[locale]/globals.css +72 -0
  241. package/dist/assets/storefront/src/app/[locale]/layout.tsx +202 -0
  242. package/dist/assets/storefront/src/app/[locale]/not-found.tsx +26 -0
  243. package/dist/assets/storefront/src/app/[locale]/order-confirmation/[code]/order-confirmation.tsx +296 -0
  244. package/dist/assets/storefront/src/app/[locale]/order-confirmation/[code]/page.tsx +18 -0
  245. package/dist/assets/storefront/src/app/[locale]/page.tsx +125 -0
  246. package/dist/assets/storefront/src/app/[locale]/register/actions.ts +50 -0
  247. package/dist/assets/storefront/src/app/[locale]/register/page.tsx +82 -0
  248. package/dist/assets/storefront/src/app/[locale]/register/registration-form.tsx +237 -0
  249. package/dist/assets/storefront/src/app/[locale]/register-company/actions.ts +40 -0
  250. package/dist/assets/storefront/src/app/[locale]/register-company/page.tsx +43 -0
  251. package/dist/assets/storefront/src/app/[locale]/register-company/registration-form.tsx +48 -0
  252. package/dist/assets/storefront/src/app/[locale]/reset-password/actions.ts +40 -0
  253. package/dist/assets/storefront/src/app/[locale]/reset-password/page.tsx +32 -0
  254. package/dist/assets/storefront/src/app/[locale]/reset-password/reset-password-form.tsx +96 -0
  255. package/dist/assets/storefront/src/app/[locale]/shopping-list/[code]/add-to-cart-button.tsx +31 -0
  256. package/dist/assets/storefront/src/app/[locale]/shopping-list/[code]/loading.tsx +29 -0
  257. package/dist/assets/storefront/src/app/[locale]/shopping-list/[code]/page.tsx +157 -0
  258. package/dist/assets/storefront/src/app/[locale]/sign-in/actions.ts +76 -0
  259. package/dist/assets/storefront/src/app/[locale]/sign-in/login-form.tsx +177 -0
  260. package/dist/assets/storefront/src/app/[locale]/sign-in/page.tsx +81 -0
  261. package/dist/assets/storefront/src/app/[locale]/verify/actions.ts +41 -0
  262. package/dist/assets/storefront/src/app/[locale]/verify/page.tsx +40 -0
  263. package/dist/assets/storefront/src/app/[locale]/verify/verify-content.tsx +127 -0
  264. package/dist/assets/storefront/src/app/[locale]/verify-pending/page.tsx +67 -0
  265. package/dist/assets/storefront/src/app/api/clear-company-context/route.ts +26 -0
  266. package/dist/assets/storefront/src/app/api/draft/disable/route.ts +12 -0
  267. package/dist/assets/storefront/src/app/api/draft/route.ts +17 -0
  268. package/dist/assets/storefront/src/app/api/revalidate/route.ts +110 -0
  269. package/dist/assets/storefront/src/app/api/search-analytics/route.ts +16 -0
  270. package/dist/assets/storefront/src/app/favicon.ico +0 -0
  271. package/dist/assets/storefront/src/components/commerce/account-nav-items.ts +56 -0
  272. package/dist/assets/storefront/src/components/commerce/account-sidebar.tsx +112 -0
  273. package/dist/assets/storefront/src/components/commerce/active-filters.tsx +107 -0
  274. package/dist/assets/storefront/src/components/commerce/approval-decision-form.tsx +70 -0
  275. package/dist/assets/storefront/src/components/commerce/approval-status-badge.tsx +37 -0
  276. package/dist/assets/storefront/src/components/commerce/business-unit-switcher.tsx +56 -0
  277. package/dist/assets/storefront/src/components/commerce/catalog-search-bar.tsx +83 -0
  278. package/dist/assets/storefront/src/components/commerce/category-product-section.tsx +69 -0
  279. package/dist/assets/storefront/src/components/commerce/category-sidebar.tsx +133 -0
  280. package/dist/assets/storefront/src/components/commerce/collection-hero-banner.tsx +36 -0
  281. package/dist/assets/storefront/src/components/commerce/company-state-badge.tsx +32 -0
  282. package/dist/assets/storefront/src/components/commerce/company-switcher.tsx +58 -0
  283. package/dist/assets/storefront/src/components/commerce/configurator-form.tsx +606 -0
  284. package/dist/assets/storefront/src/components/commerce/facet-filters.tsx +286 -0
  285. package/dist/assets/storefront/src/components/commerce/gift-card-pdp.tsx +43 -0
  286. package/dist/assets/storefront/src/components/commerce/gift-card-product-info.tsx +137 -0
  287. package/dist/assets/storefront/src/components/commerce/highlighted-text.tsx +30 -0
  288. package/dist/assets/storefront/src/components/commerce/instant-search-dropdown.tsx +377 -0
  289. package/dist/assets/storefront/src/components/commerce/order-status-badge.tsx +41 -0
  290. package/dist/assets/storefront/src/components/commerce/packaging-unit-selector.tsx +146 -0
  291. package/dist/assets/storefront/src/components/commerce/permission-gate.tsx +20 -0
  292. package/dist/assets/storefront/src/components/commerce/price-range-filter.tsx +111 -0
  293. package/dist/assets/storefront/src/components/commerce/price-tiers.tsx +98 -0
  294. package/dist/assets/storefront/src/components/commerce/price.tsx +29 -0
  295. package/dist/assets/storefront/src/components/commerce/product-card-list.tsx +121 -0
  296. package/dist/assets/storefront/src/components/commerce/product-card.tsx +89 -0
  297. package/dist/assets/storefront/src/components/commerce/product-carousel.tsx +42 -0
  298. package/dist/assets/storefront/src/components/commerce/product-grid.tsx +54 -0
  299. package/dist/assets/storefront/src/components/commerce/product-image-carousel.tsx +127 -0
  300. package/dist/assets/storefront/src/components/commerce/product-info.tsx +525 -0
  301. package/dist/assets/storefront/src/components/commerce/product-list-expansion.tsx +393 -0
  302. package/dist/assets/storefront/src/components/commerce/product-list-view.tsx +34 -0
  303. package/dist/assets/storefront/src/components/commerce/product-sidebar.tsx +175 -0
  304. package/dist/assets/storefront/src/components/commerce/product-view-switcher.tsx +107 -0
  305. package/dist/assets/storefront/src/components/commerce/quote-action-buttons.tsx +235 -0
  306. package/dist/assets/storefront/src/components/commerce/quote-activity-timeline.tsx +320 -0
  307. package/dist/assets/storefront/src/components/commerce/quote-comment-form.tsx +52 -0
  308. package/dist/assets/storefront/src/components/commerce/quote-csv-export-button.tsx +97 -0
  309. package/dist/assets/storefront/src/components/commerce/quote-product-search.tsx +139 -0
  310. package/dist/assets/storefront/src/components/commerce/quote-request-form.tsx +252 -0
  311. package/dist/assets/storefront/src/components/commerce/quote-status-badge.tsx +41 -0
  312. package/dist/assets/storefront/src/components/commerce/quote-validity-indicator.tsx +33 -0
  313. package/dist/assets/storefront/src/components/commerce/quote-version-comparison.tsx +88 -0
  314. package/dist/assets/storefront/src/components/commerce/related-products.tsx +56 -0
  315. package/dist/assets/storefront/src/components/commerce/shop-by-category.tsx +59 -0
  316. package/dist/assets/storefront/src/components/commerce/shopping-list-toggle.tsx +158 -0
  317. package/dist/assets/storefront/src/components/commerce/sort-dropdown.tsx +51 -0
  318. package/dist/assets/storefront/src/components/commerce/store-credit-summary.tsx +45 -0
  319. package/dist/assets/storefront/src/components/commerce/subcollection-tiles.tsx +56 -0
  320. package/dist/assets/storefront/src/components/layout/auth-page-shell.tsx +15 -0
  321. package/dist/assets/storefront/src/components/layout/draft-mode-action.ts +8 -0
  322. package/dist/assets/storefront/src/components/layout/draft-mode-indicator.tsx +54 -0
  323. package/dist/assets/storefront/src/components/layout/draft-mode-link.tsx +29 -0
  324. package/dist/assets/storefront/src/components/layout/footer.tsx +168 -0
  325. package/dist/assets/storefront/src/components/layout/navbar/actions.ts +33 -0
  326. package/dist/assets/storefront/src/components/layout/navbar/cart-icon.tsx +50 -0
  327. package/dist/assets/storefront/src/components/layout/navbar/channel-picker-wrapper.tsx +19 -0
  328. package/dist/assets/storefront/src/components/layout/navbar/channel-picker.tsx +53 -0
  329. package/dist/assets/storefront/src/components/layout/navbar/currency-picker-wrapper.tsx +21 -0
  330. package/dist/assets/storefront/src/components/layout/navbar/currency-picker.tsx +52 -0
  331. package/dist/assets/storefront/src/components/layout/navbar/language-picker.tsx +51 -0
  332. package/dist/assets/storefront/src/components/layout/navbar/login-button.tsx +34 -0
  333. package/dist/assets/storefront/src/components/layout/navbar/mobile-nav.tsx +74 -0
  334. package/dist/assets/storefront/src/components/layout/navbar/nav-menu-items.tsx +51 -0
  335. package/dist/assets/storefront/src/components/layout/navbar/navbar-cart.tsx +5 -0
  336. package/dist/assets/storefront/src/components/layout/navbar/navbar-collections.tsx +291 -0
  337. package/dist/assets/storefront/src/components/layout/navbar/navbar-link.tsx +28 -0
  338. package/dist/assets/storefront/src/components/layout/navbar/navbar-user.tsx +147 -0
  339. package/dist/assets/storefront/src/components/layout/navbar/theme-switcher.tsx +39 -0
  340. package/dist/assets/storefront/src/components/layout/navbar.tsx +117 -0
  341. package/dist/assets/storefront/src/components/layout/search-input.tsx +71 -0
  342. package/dist/assets/storefront/src/components/providers/awaiting-approval-banner.tsx +58 -0
  343. package/dist/assets/storefront/src/components/providers/cart-count-server.tsx +31 -0
  344. package/dist/assets/storefront/src/components/providers/company-context-guard.tsx +47 -0
  345. package/dist/assets/storefront/src/components/providers/company-permissions-server.tsx +14 -0
  346. package/dist/assets/storefront/src/components/providers/theme-provider.tsx +16 -0
  347. package/dist/assets/storefront/src/components/shared/breadcrumbs.tsx +39 -0
  348. package/dist/assets/storefront/src/components/shared/catalog-sidebar-skeleton.tsx +21 -0
  349. package/dist/assets/storefront/src/components/shared/country-select.tsx +83 -0
  350. package/dist/assets/storefront/src/components/shared/error-state.tsx +16 -0
  351. package/dist/assets/storefront/src/components/shared/pagination.tsx +119 -0
  352. package/dist/assets/storefront/src/components/shared/prefetch-link.tsx +36 -0
  353. package/dist/assets/storefront/src/components/shared/product-grid-skeleton.tsx +26 -0
  354. package/dist/assets/storefront/src/components/shared/scenario-paused.tsx +80 -0
  355. package/dist/assets/storefront/src/components/shared/skeletons/cart-skeleton.tsx +48 -0
  356. package/dist/assets/storefront/src/components/shared/skeletons/navbar-user-skeleton.tsx +9 -0
  357. package/dist/assets/storefront/src/components/shared/skeletons/search-input-skeleton.tsx +7 -0
  358. package/dist/assets/storefront/src/components/shared/skeletons/search-results-skeleton.tsx +17 -0
  359. package/dist/assets/storefront/src/components/ui/accordion.tsx +66 -0
  360. package/dist/assets/storefront/src/components/ui/alert-dialog.tsx +157 -0
  361. package/dist/assets/storefront/src/components/ui/alert.tsx +66 -0
  362. package/dist/assets/storefront/src/components/ui/aspect-ratio.tsx +11 -0
  363. package/dist/assets/storefront/src/components/ui/avatar.tsx +53 -0
  364. package/dist/assets/storefront/src/components/ui/badge.tsx +46 -0
  365. package/dist/assets/storefront/src/components/ui/breadcrumb.tsx +109 -0
  366. package/dist/assets/storefront/src/components/ui/button.tsx +58 -0
  367. package/dist/assets/storefront/src/components/ui/calendar.tsx +213 -0
  368. package/dist/assets/storefront/src/components/ui/card.tsx +92 -0
  369. package/dist/assets/storefront/src/components/ui/carousel.tsx +241 -0
  370. package/dist/assets/storefront/src/components/ui/chart.tsx +357 -0
  371. package/dist/assets/storefront/src/components/ui/checkbox.tsx +32 -0
  372. package/dist/assets/storefront/src/components/ui/collapsible.tsx +33 -0
  373. package/dist/assets/storefront/src/components/ui/command.tsx +184 -0
  374. package/dist/assets/storefront/src/components/ui/context-menu.tsx +252 -0
  375. package/dist/assets/storefront/src/components/ui/dialog.tsx +143 -0
  376. package/dist/assets/storefront/src/components/ui/drawer.tsx +135 -0
  377. package/dist/assets/storefront/src/components/ui/dropdown-menu.tsx +257 -0
  378. package/dist/assets/storefront/src/components/ui/empty-state.tsx +37 -0
  379. package/dist/assets/storefront/src/components/ui/field.tsx +244 -0
  380. package/dist/assets/storefront/src/components/ui/form.tsx +167 -0
  381. package/dist/assets/storefront/src/components/ui/hover-card.tsx +44 -0
  382. package/dist/assets/storefront/src/components/ui/input-otp.tsx +77 -0
  383. package/dist/assets/storefront/src/components/ui/input.tsx +21 -0
  384. package/dist/assets/storefront/src/components/ui/kbd-shortcut.tsx +20 -0
  385. package/dist/assets/storefront/src/components/ui/label.tsx +24 -0
  386. package/dist/assets/storefront/src/components/ui/menubar.tsx +276 -0
  387. package/dist/assets/storefront/src/components/ui/navigation-menu.tsx +168 -0
  388. package/dist/assets/storefront/src/components/ui/pagination.tsx +127 -0
  389. package/dist/assets/storefront/src/components/ui/popover.tsx +48 -0
  390. package/dist/assets/storefront/src/components/ui/progress.tsx +31 -0
  391. package/dist/assets/storefront/src/components/ui/radio-group.tsx +45 -0
  392. package/dist/assets/storefront/src/components/ui/resizable.tsx +56 -0
  393. package/dist/assets/storefront/src/components/ui/scroll-area.tsx +58 -0
  394. package/dist/assets/storefront/src/components/ui/select.tsx +185 -0
  395. package/dist/assets/storefront/src/components/ui/separator.tsx +28 -0
  396. package/dist/assets/storefront/src/components/ui/sheet.tsx +139 -0
  397. package/dist/assets/storefront/src/components/ui/sidebar.tsx +728 -0
  398. package/dist/assets/storefront/src/components/ui/skeleton.tsx +13 -0
  399. package/dist/assets/storefront/src/components/ui/slider.tsx +63 -0
  400. package/dist/assets/storefront/src/components/ui/sonner.tsx +25 -0
  401. package/dist/assets/storefront/src/components/ui/switch.tsx +31 -0
  402. package/dist/assets/storefront/src/components/ui/table.tsx +116 -0
  403. package/dist/assets/storefront/src/components/ui/tabs.tsx +66 -0
  404. package/dist/assets/storefront/src/components/ui/textarea.tsx +18 -0
  405. package/dist/assets/storefront/src/components/ui/toggle-group.tsx +73 -0
  406. package/dist/assets/storefront/src/components/ui/toggle.tsx +47 -0
  407. package/dist/assets/storefront/src/components/ui/tooltip.tsx +61 -0
  408. package/dist/assets/storefront/src/config/branding.ts +4 -0
  409. package/dist/assets/storefront/src/config/scenario-meta.ts +46 -0
  410. package/dist/assets/storefront/src/config/scenario.ts +313 -0
  411. package/dist/assets/storefront/src/contexts/auth-context.tsx +35 -0
  412. package/dist/assets/storefront/src/graphql.ts +14 -0
  413. package/dist/assets/storefront/src/hooks/use-mobile.ts +19 -0
  414. package/dist/assets/storefront/src/i18n/locale-utils.ts +33 -0
  415. package/dist/assets/storefront/src/i18n/locales.ts +18 -0
  416. package/dist/assets/storefront/src/i18n/navigation.ts +35 -0
  417. package/dist/assets/storefront/src/i18n/request.ts +19 -0
  418. package/dist/assets/storefront/src/i18n/routing.ts +19 -0
  419. package/dist/assets/storefront/src/i18n/server.ts +16 -0
  420. package/dist/assets/storefront/src/lib/actions/switch-channel.ts +32 -0
  421. package/dist/assets/storefront/src/lib/actions/switch-currency.ts +25 -0
  422. package/dist/assets/storefront/src/lib/auth.ts +18 -0
  423. package/dist/assets/storefront/src/lib/backend-health.ts +38 -0
  424. package/dist/assets/storefront/src/lib/cart-count-context.tsx +59 -0
  425. package/dist/assets/storefront/src/lib/cart-guard-utils.ts +10 -0
  426. package/dist/assets/storefront/src/lib/cart-guard.ts +104 -0
  427. package/dist/assets/storefront/src/lib/channel-server.ts +28 -0
  428. package/dist/assets/storefront/src/lib/channel.ts +2 -0
  429. package/dist/assets/storefront/src/lib/company-context.ts +35 -0
  430. package/dist/assets/storefront/src/lib/company-permissions-context.tsx +40 -0
  431. package/dist/assets/storefront/src/lib/currency-server.ts +20 -0
  432. package/dist/assets/storefront/src/lib/currency.ts +2 -0
  433. package/dist/assets/storefront/src/lib/format.ts +48 -0
  434. package/dist/assets/storefront/src/lib/metadata.ts +85 -0
  435. package/dist/assets/storefront/src/lib/quantity.test.js +20 -0
  436. package/dist/assets/storefront/src/lib/quantity.ts +20 -0
  437. package/dist/assets/storefront/src/lib/search-bar-context.tsx +45 -0
  438. package/dist/assets/storefront/src/lib/search-helpers.ts +69 -0
  439. package/dist/assets/storefront/src/lib/use-recent-searches.ts +55 -0
  440. package/dist/assets/storefront/src/lib/utils.ts +6 -0
  441. package/dist/assets/storefront/src/lib/vendure/actions.ts +96 -0
  442. package/dist/assets/storefront/src/lib/vendure/api.ts +164 -0
  443. package/dist/assets/storefront/src/lib/vendure/approval-utils.ts +21 -0
  444. package/dist/assets/storefront/src/lib/vendure/cached.ts +71 -0
  445. package/dist/assets/storefront/src/lib/vendure/fragments.ts +213 -0
  446. package/dist/assets/storefront/src/lib/vendure/instant-search-action.ts +104 -0
  447. package/dist/assets/storefront/src/lib/vendure/mutations.ts +1136 -0
  448. package/dist/assets/storefront/src/lib/vendure/queries.ts +1406 -0
  449. package/dist/assets/storefront/src/middleware.ts +11 -0
  450. package/dist/assets/storefront/src/scenarios/b2b-wholesale/branding.ts +180 -0
  451. package/dist/assets/storefront/src/scenarios/b2b-wholesale/hero.tsx +122 -0
  452. package/dist/assets/storefront/src/scenarios/b2b-wholesale/index.ts +21 -0
  453. package/dist/assets/storefront/src/scenarios/b2b-wholesale/meta.ts +3 -0
  454. package/dist/assets/storefront/src/scenarios/default/branding.ts +148 -0
  455. package/dist/assets/storefront/src/scenarios/default/hero.tsx +107 -0
  456. package/dist/assets/storefront/src/scenarios/default/index.ts +12 -0
  457. package/dist/assets/storefront/src/scenarios/default/meta.ts +3 -0
  458. package/dist/assets/storefront/src/scenarios/kaminpro/auth-gate.tsx +36 -0
  459. package/dist/assets/storefront/src/scenarios/kaminpro/branding.ts +238 -0
  460. package/dist/assets/storefront/src/scenarios/kaminpro/cart-items.tsx +359 -0
  461. package/dist/assets/storefront/src/scenarios/kaminpro/hero.tsx +123 -0
  462. package/dist/assets/storefront/src/scenarios/kaminpro/index.ts +50 -0
  463. package/dist/assets/storefront/src/scenarios/kaminpro/meta.ts +9 -0
  464. package/dist/assets/storefront/src/scenarios/kaminpro/pdp/components/banners.tsx +21 -0
  465. package/dist/assets/storefront/src/scenarios/kaminpro/pdp/components/bom-basket.tsx +221 -0
  466. package/dist/assets/storefront/src/scenarios/kaminpro/pdp/components/btn.tsx +38 -0
  467. package/dist/assets/storefront/src/scenarios/kaminpro/pdp/components/chip.tsx +35 -0
  468. package/dist/assets/storefront/src/scenarios/kaminpro/pdp/components/config-header.tsx +72 -0
  469. package/dist/assets/storefront/src/scenarios/kaminpro/pdp/components/field-row.tsx +126 -0
  470. package/dist/assets/storefront/src/scenarios/kaminpro/pdp/components/info-dot.tsx +38 -0
  471. package/dist/assets/storefront/src/scenarios/kaminpro/pdp/components/login-notice.tsx +81 -0
  472. package/dist/assets/storefront/src/scenarios/kaminpro/pdp/components/module-panel.tsx +144 -0
  473. package/dist/assets/storefront/src/scenarios/kaminpro/pdp/components/quote-dialog.tsx +110 -0
  474. package/dist/assets/storefront/src/scenarios/kaminpro/pdp/components/schematic.tsx +674 -0
  475. package/dist/assets/storefront/src/scenarios/kaminpro/pdp/components/why-panel.tsx +66 -0
  476. package/dist/assets/storefront/src/scenarios/kaminpro/pdp/configurator-pdp.tsx +43 -0
  477. package/dist/assets/storefront/src/scenarios/kaminpro/pdp/configurator-shell.tsx +320 -0
  478. package/dist/assets/storefront/src/scenarios/kaminpro/pdp/lib/data.ts +150 -0
  479. package/dist/assets/storefront/src/scenarios/kaminpro/pdp/lib/types.ts +30 -0
  480. package/dist/assets/storefront/src/scenarios/kaminpro/pdp/styles.css +104 -0
  481. package/dist/assets/storefront/src/scenarios/kaminpro/shop-by-system.tsx +97 -0
  482. package/dist/assets/storefront/src/scenarios/kaminpro/system-finder/decision-tree.ts +261 -0
  483. package/dist/assets/storefront/src/scenarios/kaminpro/system-finder/page.tsx +21 -0
  484. package/dist/assets/storefront/src/scenarios/kaminpro/system-finder/wizard.tsx +600 -0
  485. package/dist/assets/storefront/src/schema.graphql.placeholder +5 -0
  486. package/dist/assets/storefront/tsconfig.json +37 -0
  487. package/dist/assets/templates/CLAUDE.md.hbs +63 -0
  488. package/dist/assets/templates/README.md.hbs +53 -0
  489. package/dist/assets/templates/custom-populate.ts.hbs +28 -0
  490. package/dist/assets/templates/docker-compose.yml.hbs +29 -0
  491. package/dist/assets/templates/env.hbs +44 -0
  492. package/dist/assets/templates/environment.d.ts.hbs +32 -0
  493. package/dist/assets/templates/gitignore.hbs +7 -0
  494. package/dist/assets/templates/index.ts.hbs +16 -0
  495. package/dist/assets/templates/npmrc.hbs +1 -0
  496. package/dist/assets/templates/populate.ts.hbs +27 -0
  497. package/dist/assets/templates/root-package.json.hbs +17 -0
  498. package/dist/assets/templates/server-package.json.hbs +31 -0
  499. package/dist/assets/templates/tsconfig.dashboard.json.hbs +17 -0
  500. package/dist/assets/templates/tsconfig.root.json.hbs +16 -0
  501. package/dist/assets/templates/tsconfig.server.json.hbs +20 -0
  502. package/dist/assets/templates/vendure-config.ts.hbs +80 -0
  503. package/dist/assets/templates/vite.config.mts.hbs +27 -0
  504. package/dist/bin/run.d.ts +2 -0
  505. package/dist/bin/run.js +79 -0
  506. package/dist/bin/run.js.map +1 -0
  507. package/dist/cli.d.ts +6 -0
  508. package/dist/cli.js +154 -0
  509. package/dist/cli.js.map +1 -0
  510. package/dist/git-init.d.ts +4 -0
  511. package/dist/git-init.js +60 -0
  512. package/dist/git-init.js.map +1 -0
  513. package/dist/index.d.ts +4 -0
  514. package/dist/index.js +13 -0
  515. package/dist/index.js.map +1 -0
  516. package/dist/plugin-registry.d.ts +10 -0
  517. package/dist/plugin-registry.js +485 -0
  518. package/dist/plugin-registry.js.map +1 -0
  519. package/dist/scaffolder.d.ts +10 -0
  520. package/dist/scaffolder.js +218 -0
  521. package/dist/scaffolder.js.map +1 -0
  522. package/dist/storefront-copier.d.ts +6 -0
  523. package/dist/storefront-copier.js +68 -0
  524. package/dist/storefront-copier.js.map +1 -0
  525. package/dist/template-renderer.d.ts +30 -0
  526. package/dist/template-renderer.js +177 -0
  527. package/dist/template-renderer.js.map +1 -0
  528. package/dist/types.d.ts +60 -0
  529. package/dist/types.js +3 -0
  530. package/dist/types.js.map +1 -0
  531. package/package.json +48 -0
@@ -0,0 +1,104 @@
1
+ /**
2
+ * KaminPro Configurator — local design tokens + utilities.
3
+ *
4
+ * Ported from the Claude Design handoff. Scoped under `.kp-pdp` so they
5
+ * only apply inside the configurator shell and don't leak into the rest
6
+ * of the storefront.
7
+ */
8
+
9
+ .kp-pdp {
10
+ --bg: #0f0e0d;
11
+ --panel: #1c1917;
12
+ --panel-2: #292524;
13
+ --panel-3: #1f1c1a;
14
+ --line: #3a3532;
15
+ --line-2: #4a4441;
16
+ --ink: #e7e5e4;
17
+ --ink-2: #d6d3d1;
18
+ --muted: #a8a29e;
19
+ --muted-2: #78716c;
20
+ --fire: #dc2626;
21
+ --fire-2: #b91c1c;
22
+ --ok: #65a30d;
23
+ --warn: #d97706;
24
+ --paper: #f5f4f2;
25
+
26
+ background: var(--bg);
27
+ color: var(--ink);
28
+ font-family: 'Inter Tight', system-ui, -apple-system, sans-serif;
29
+ font-feature-settings: 'ss01', 'cv11';
30
+ letter-spacing: -0.005em;
31
+ }
32
+
33
+ .kp-pdp .mono { font-family: 'JetBrains Mono', ui-monospace, monospace; }
34
+ .kp-pdp .caps { font-size: 10.5px; font-weight: 600; letter-spacing: 0.08em; text-transform: uppercase; }
35
+
36
+ .kp-pdp .paper-bg {
37
+ background:
38
+ linear-gradient(135deg, rgba(245,244,242,0.02) 0 1px, transparent 1px 6px),
39
+ linear-gradient(45deg, rgba(245,244,242,0.02) 0 1px, transparent 1px 6px),
40
+ radial-gradient(ellipse at top left, rgba(247,246,244,0.05), transparent 60%),
41
+ var(--panel);
42
+ background-size: 8px 8px, 8px 8px, auto, auto;
43
+ }
44
+
45
+ .kp-pdp .stripe {
46
+ background: repeating-linear-gradient(45deg, transparent 0 7px, rgba(168,162,158,0.08) 7px 8px);
47
+ }
48
+
49
+ .kp-pdp .scroll-slim::-webkit-scrollbar { width: 8px; height: 8px; }
50
+ .kp-pdp .scroll-slim::-webkit-scrollbar-track { background: transparent; }
51
+ .kp-pdp .scroll-slim::-webkit-scrollbar-thumb {
52
+ background: var(--line-2);
53
+ border-radius: 4px;
54
+ border: 2px solid var(--panel);
55
+ }
56
+ .kp-pdp .scroll-slim::-webkit-scrollbar-thumb:hover { background: var(--muted-2); }
57
+
58
+ @keyframes kp-pulse-dot {
59
+ 0%, 100% { opacity: 1; transform: scale(1); }
60
+ 50% { opacity: 0.5; transform: scale(1.4); }
61
+ }
62
+ .kp-pdp .pulse-dot { animation: kp-pulse-dot 1.5s ease-in-out infinite; }
63
+
64
+ @keyframes kp-bom-in {
65
+ 0% { opacity: 0; transform: translateY(-4px); background: rgba(220, 38, 38, 0.14); }
66
+ 50% { opacity: 1; transform: translateY(0); background: rgba(220, 38, 38, 0.14); }
67
+ 100% { opacity: 1; transform: translateY(0); background: transparent; }
68
+ }
69
+ .kp-pdp .bom-flash { animation: kp-bom-in 0.45s cubic-bezier(.2,.7,.2,1); }
70
+
71
+ .kp-pdp kbd {
72
+ font-family: 'JetBrains Mono', ui-monospace, monospace;
73
+ font-size: 10px;
74
+ padding: 1px 5px;
75
+ background: var(--panel-2);
76
+ border: 1px solid var(--line-2);
77
+ border-radius: 2px;
78
+ color: var(--muted);
79
+ }
80
+
81
+ .kp-pdp .field-row .schem-line { transition: all .35s cubic-bezier(.2,.7,.2,1); }
82
+
83
+ /* Schematic "recently changed" highlight — draws a crisp 1.5 px red
84
+ outline around the updated SVG group for 1 s, then fades over the
85
+ following 600 ms. Uses four zero-blur drop-shadows offset ±1.5 px
86
+ on each axis to build a sharp outline (interpolating alpha only —
87
+ same 4 filters in both keyframes, so the transition is smooth). */
88
+ @keyframes kp-schem-flash {
89
+ 0%, 62% {
90
+ filter:
91
+ drop-shadow( 1.5px 0 0 rgba(220, 38, 38, 0.5))
92
+ drop-shadow(-1.5px 0 0 rgba(220, 38, 38, 0.5))
93
+ drop-shadow(0 1.5px 0 rgba(220, 38, 38, 0.5))
94
+ drop-shadow(0 -1.5px 0 rgba(220, 38, 38, 0.5));
95
+ }
96
+ 100% {
97
+ filter:
98
+ drop-shadow( 1.5px 0 0 rgba(220, 38, 38, 0))
99
+ drop-shadow(-1.5px 0 0 rgba(220, 38, 38, 0))
100
+ drop-shadow(0 1.5px 0 rgba(220, 38, 38, 0))
101
+ drop-shadow(0 -1.5px 0 rgba(220, 38, 38, 0));
102
+ }
103
+ }
104
+ .kp-pdp .kp-schem-flash { animation: kp-schem-flash 1.6s ease-out; }
@@ -0,0 +1,97 @@
1
+ import Image from 'next/image';
2
+ import {Link} from '@/i18n/navigation';
3
+ import {client} from '@/lib/vendure/api';
4
+ import {GetProductTileQuery} from '@/lib/vendure/queries';
5
+ import {ArrowRight} from 'lucide-react';
6
+
7
+ /**
8
+ * KaminPro-specific replacement for the default `ShopByCategory` tile row.
9
+ *
10
+ * The default row is generic — a flat grid of all top-level collections.
11
+ * For a configurator-first demo that only ships two configurable systems,
12
+ * that layout dilutes the call to action. This override renders a two-tile
13
+ * hero strip linking straight into each configurable product's PDP, using
14
+ * the populator-supplied installation photography as tile background.
15
+ *
16
+ * We intentionally ignore the `collections` prop passed in by the default
17
+ * homepage layout — this isn't a category browse, it's a system picker.
18
+ */
19
+
20
+ const TILES: Array<{
21
+ slug: string;
22
+ title: string;
23
+ subtitle: string;
24
+ fuels: string;
25
+ }> = [
26
+ {
27
+ slug: 'kp-stahlline-dw-system',
28
+ title: 'StahlLine DW',
29
+ subtitle: 'Doppelwandig · Edelstahl · T600',
30
+ fuels: 'Scheitholz · Hackschnitzel · Pellet · Gas · Öl',
31
+ },
32
+ {
33
+ slug: 'kp-polyflex-pp-system',
34
+ title: 'PolyFlex PP',
35
+ subtitle: 'Kunststoff · Kondensat · T120 / T160',
36
+ fuels: 'Gas- & Öl-Brennwertgeräte',
37
+ },
38
+ ];
39
+
40
+ export async function KaminProShopBySystem() {
41
+ const entries = await Promise.all(
42
+ TILES.map(async tile => {
43
+ const [result, error] = await client.query(GetProductTileQuery, {slug: tile.slug});
44
+ if (error) {
45
+ console.warn(`[kaminpro] Failed to load tile product ${tile.slug}:`, error);
46
+ return {tile, product: null};
47
+ }
48
+ return {tile, product: result?.data?.product ?? null};
49
+ }),
50
+ );
51
+
52
+ return (
53
+ <section className="container mx-auto px-4 pt-12 pb-8">
54
+ <header className="mb-6 flex items-baseline justify-between">
55
+ <h2 className="caps text-[color:var(--muted-foreground)]">
56
+ Konfigurierbare Systeme
57
+ </h2>
58
+ <span className="mono text-xs text-[color:var(--muted-foreground)]">
59
+ 2 Produktfamilien · Live-Konfigurator
60
+ </span>
61
+ </header>
62
+ <div className="grid grid-cols-1 md:grid-cols-2 gap-4">
63
+ {entries.map(({tile, product}) => (
64
+ <Link
65
+ key={tile.slug}
66
+ href={`/product/${tile.slug}`}
67
+ className="group relative block overflow-hidden rounded-sm border border-[color:var(--border)] hover:border-[color:var(--primary)]/60 transition-colors aspect-[16/10] bg-[color:var(--card)]"
68
+ >
69
+ {product?.featuredAsset?.preview ? (
70
+ <Image
71
+ src={product.featuredAsset.preview}
72
+ alt={tile.title}
73
+ fill
74
+ sizes="(max-width: 768px) 100vw, 50vw"
75
+ className="object-cover opacity-80 group-hover:opacity-95 group-hover:scale-[1.02] transition-all duration-500"
76
+ />
77
+ ) : null}
78
+ {/* Gradient wash so title/meta remain readable */}
79
+ <div className="absolute inset-0 bg-gradient-to-t from-black/80 via-black/35 to-transparent" />
80
+ <div className="absolute inset-0 flex flex-col justify-end p-6">
81
+ <div className="mono text-[10.5px] uppercase tracking-[0.08em] text-white/60 mb-2">
82
+ {tile.subtitle}
83
+ </div>
84
+ <div className="flex items-baseline gap-3">
85
+ <h3 className="text-3xl md:text-4xl font-semibold text-white tracking-tight">
86
+ {tile.title}
87
+ </h3>
88
+ <ArrowRight className="h-5 w-5 text-white/70 group-hover:translate-x-1 transition-transform" />
89
+ </div>
90
+ <p className="mono text-xs text-white/70 mt-2">{tile.fuels}</p>
91
+ </div>
92
+ </Link>
93
+ ))}
94
+ </div>
95
+ </section>
96
+ );
97
+ }
@@ -0,0 +1,261 @@
1
+ /**
2
+ * System Finder decision tree — pure mapping from wizard answers to
3
+ * recommended chimney system(s). No side effects, no React — testable
4
+ * in isolation.
5
+ *
6
+ * Drives the Results screen and the pre-filled query params handed to
7
+ * the configurator PDP (once PR #222 lands).
8
+ */
9
+
10
+ export type Bauvorhaben = 'neubau' | 'sanierung';
11
+ export type Betriebsart = 'festbrennstoff' | 'gas' | 'oel' | 'pellet';
12
+ export type Druck = 'ueberdruck' | 'unterdruck';
13
+ /**
14
+ * Abgastemperaturklasse — only `t120` / `t160` are user-selectable today
15
+ * (PP vs PVDF for Öl Brennwert). `t600` was reserved for a future
16
+ * StahlLine DW variant but is not wired into any branch yet.
17
+ */
18
+ export type Temperaturklasse = 't120' | 't160';
19
+
20
+ export interface WizardAnswers {
21
+ bauvorhaben?: Bauvorhaben;
22
+ betriebsart?: Betriebsart;
23
+ /** Only asked for `sanierung` — Neubau is pre-specified. */
24
+ druck?: Druck;
25
+ /** Only asked for `oel` + `gas` condensing. Defaults per fuel if not chosen. */
26
+ temperaturklasse?: Temperaturklasse;
27
+ }
28
+
29
+ export type SystemCode = 'stahlline-dw' | 'polyflex-pp' | 'polyflex-pvdf';
30
+
31
+ export interface SystemRecommendation {
32
+ code: SystemCode;
33
+ /** Configurable product slug — handed to the configurator PDP. */
34
+ productSlug: string;
35
+ name: string;
36
+ /** One-line positioning — shown on the card subtitle. */
37
+ tagline: string;
38
+ /** Material descriptor for the chips. */
39
+ material: string;
40
+ /** Supported nominal-diameter range, e.g. "DN 130–250". */
41
+ diameterRange: string;
42
+ /** Max exhaust temperature class, e.g. "T600" or "≤120 °C". */
43
+ maxExhaustTemperature: string;
44
+ /** Wall thickness / insulation descriptor. */
45
+ wallSpec: string;
46
+ /** Reasons this system matches the wizard answers (shown as bullets). */
47
+ reasons: string[];
48
+ }
49
+
50
+ // ─────────────────────────────────────────────────────────────
51
+ // System catalogue
52
+ //
53
+ // NOTE: the `productSlug` values below point at configurable products
54
+ // that will be created by the configurator-populator (Phase 4 / PR
55
+ // vendurehq/vendure-platform#222). Until that lands, "Zum Konfigurator" links
56
+ // will 404 — this is deliberate. The wizard ships with the shape the
57
+ // configurator will fill.
58
+ // ─────────────────────────────────────────────────────────────
59
+
60
+ const STAHLLINE_DW: SystemRecommendation = {
61
+ code: 'stahlline-dw',
62
+ productSlug: 'kp-stahlline-dw-system',
63
+ name: 'StahlLine DW-System',
64
+ tagline: 'Doppelwandig isoliert. Für Festbrennstoffe und traditionelle Anlagen.',
65
+ material: 'Edelstahl 1.4404',
66
+ diameterRange: 'DN 130–250',
67
+ maxExhaustTemperature: 'T600',
68
+ wallSpec: '25 mm Mineralwolle-Isolierung',
69
+ reasons: [],
70
+ };
71
+
72
+ const POLYFLEX_PP: SystemRecommendation = {
73
+ code: 'polyflex-pp',
74
+ productSlug: 'kp-polyflex-pp-system',
75
+ name: 'PolyFlex PP-System',
76
+ tagline: 'Kunststoff-Abgasführung für Brennwertgeräte bis 120 °C.',
77
+ material: 'Polypropylen',
78
+ diameterRange: 'DN 80–125',
79
+ maxExhaustTemperature: '≤ 120 °C (T120)',
80
+ wallSpec: 'Einwandig, säurebeständig',
81
+ reasons: [],
82
+ };
83
+
84
+ const POLYFLEX_PVDF: SystemRecommendation = {
85
+ code: 'polyflex-pvdf',
86
+ productSlug: 'kp-polyflex-pvdf-system',
87
+ name: 'PolyFlex PVDF-System',
88
+ tagline: 'Kunststoff-Abgasführung für höhere Temperaturen bis 160 °C.',
89
+ material: 'PVDF',
90
+ diameterRange: 'DN 100–125',
91
+ maxExhaustTemperature: '≤ 160 °C (T160)',
92
+ wallSpec: 'Einwandig, hitzebeständig',
93
+ reasons: [],
94
+ };
95
+
96
+ // ─────────────────────────────────────────────────────────────
97
+ // Decision function
98
+ // ─────────────────────────────────────────────────────────────
99
+
100
+ /**
101
+ * Maps wizard answers to one or more recommended systems.
102
+ * The first entry is the primary recommendation; subsequent entries are
103
+ * alternatives shown below the primary card.
104
+ */
105
+ export function recommendSystems(answers: WizardAnswers): SystemRecommendation[] {
106
+ const { betriebsart, druck, temperaturklasse } = answers;
107
+
108
+ // Solid-fuel paths — always StahlLine DW. Overpressure is meaningless
109
+ // for Festbrennstoff, so we ignore `druck` even if set.
110
+ if (betriebsart === 'festbrennstoff' || betriebsart === 'pellet') {
111
+ const fuelLabel = betriebsart === 'pellet' ? 'Pelletheizung' : 'Festbrennstoff';
112
+ return [
113
+ {
114
+ ...STAHLLINE_DW,
115
+ reasons: [
116
+ `Edelstahl ist für ${fuelLabel} zwingend vorgeschrieben`,
117
+ 'T600-Klassifikation deckt alle gängigen Holz- und Pelletanlagen ab',
118
+ '25 mm Mineralwolle-Isolierung verhindert Kondensatbildung',
119
+ ],
120
+ },
121
+ ];
122
+ }
123
+
124
+ // Gas — typically PP for modern Brennwert; StahlLine DW as alternative
125
+ // for older Unterdruck-Heizkessel.
126
+ if (betriebsart === 'gas') {
127
+ if (druck === 'unterdruck') {
128
+ return [
129
+ {
130
+ ...STAHLLINE_DW,
131
+ reasons: [
132
+ 'Unterdruckbetrieb mit Gas-Niedertemperaturgeräten erfordert Edelstahl',
133
+ 'PolyFlex-Systeme sind ausschließlich für Überdruckbetrieb zugelassen',
134
+ ],
135
+ },
136
+ ];
137
+ }
138
+ // Default: Gas-Brennwert → PP
139
+ return [
140
+ {
141
+ ...POLYFLEX_PP,
142
+ reasons: [
143
+ 'Gas-Brennwertgeräte arbeiten mit Überdruck und Abgastemperaturen unter 120 °C',
144
+ 'PP ist kostengünstiger als Edelstahl und säurebeständig',
145
+ 'Kondensatabfluss in der T-Stück-Baugruppe bereits integriert',
146
+ ],
147
+ },
148
+ {
149
+ ...STAHLLINE_DW,
150
+ reasons: ['Alternative für traditionelle Gas-Heizwert-Anlagen'],
151
+ },
152
+ ];
153
+ }
154
+
155
+ // Öl — PP or PVDF depending on Abgastemperatur
156
+ if (betriebsart === 'oel') {
157
+ if (druck === 'unterdruck') {
158
+ return [
159
+ {
160
+ ...STAHLLINE_DW,
161
+ reasons: [
162
+ 'Unterdruckbetrieb mit Öl-Niedertemperaturkessel erfordert Edelstahl',
163
+ 'Höhere Abgastemperaturen bei älteren Ölheizungen sind abgedeckt',
164
+ ],
165
+ },
166
+ ];
167
+ }
168
+ if (temperaturklasse === 't160') {
169
+ return [
170
+ {
171
+ ...POLYFLEX_PVDF,
172
+ reasons: [
173
+ 'Öl-Brennwertgeräte mit erhöhter Abgastemperatur (bis 160 °C)',
174
+ 'PVDF widersteht höheren Temperaturen als Standard-PP',
175
+ 'Einwandig verlegbar — platzsparender als Edelstahl',
176
+ ],
177
+ },
178
+ {
179
+ ...POLYFLEX_PP,
180
+ reasons: ['Alternative bei gesicherter Abgastemperatur unter 120 °C'],
181
+ },
182
+ ];
183
+ }
184
+ // Default Öl + Überdruck: PP
185
+ return [
186
+ {
187
+ ...POLYFLEX_PP,
188
+ reasons: [
189
+ 'Öl-Brennwertgeräte im Standardbetrieb bleiben unter 120 °C',
190
+ 'PP ist kostengünstiger als PVDF und säurebeständig',
191
+ ],
192
+ },
193
+ {
194
+ ...POLYFLEX_PVDF,
195
+ reasons: ['Alternative bei erhöhter Abgastemperatur (T160)'],
196
+ },
197
+ ];
198
+ }
199
+
200
+ // Fallback — shouldn't happen if wizard gates `Weiter` correctly.
201
+ return [STAHLLINE_DW, POLYFLEX_PP];
202
+ }
203
+
204
+ // ─────────────────────────────────────────────────────────────
205
+ // Step relevance — which questions apply to a given answer path
206
+ // ─────────────────────────────────────────────────────────────
207
+
208
+ /**
209
+ * Druck is only meaningful for Sanierung — Neubau is pre-specified so
210
+ * the pressure-regime answer is routed through engineering drawings,
211
+ * not the installer.
212
+ */
213
+ export function isDruckRelevant(answers: WizardAnswers): boolean {
214
+ return answers.bauvorhaben === 'sanierung';
215
+ }
216
+
217
+ /**
218
+ * Temperaturklasse is only asked for Sanierung + Öl + Überdruck — the
219
+ * single path where we need to split PP vs PVDF. Neubau + Öl defaults
220
+ * to Überdruck-PP without asking (new builds are pre-specified), and
221
+ * Unterdruck-Öl always routes to StahlLine DW. Gas paths don't split
222
+ * PP / PVDF here (residential Brennwert stays PP; high-temp Gas PVDF
223
+ * is out of demo scope).
224
+ */
225
+ export function isTemperaturklasseRelevant(answers: WizardAnswers): boolean {
226
+ return answers.betriebsart === 'oel' && answers.druck === 'ueberdruck';
227
+ }
228
+
229
+ // ─────────────────────────────────────────────────────────────
230
+ // URL state encoding — base64(JSON) via standard btoa/atob
231
+ // ─────────────────────────────────────────────────────────────
232
+
233
+ /**
234
+ * Encode wizard state into a URL-safe base64 string. Used so that
235
+ * partners can share a direct link to a specific step or result.
236
+ *
237
+ * Opaque-by-design: discrete query params would be more grep-friendly
238
+ * for server-log analytics, but the demo narrative is "share a configured
239
+ * URL" so round-trip integrity beats readability. Revisit if analytics
240
+ * start caring about the shape.
241
+ */
242
+ export function encodeAnswers(answers: WizardAnswers): string {
243
+ if (Object.keys(answers).length === 0) return '';
244
+ const json = JSON.stringify(answers);
245
+ const b64 = btoa(json);
246
+ // URL-safe: replace `+/=` with `-_.` so we don't need extra encoding.
247
+ return b64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
248
+ }
249
+
250
+ export function decodeAnswers(encoded: string | null | undefined): WizardAnswers {
251
+ if (!encoded) return {};
252
+ try {
253
+ const b64 = encoded.replace(/-/g, '+').replace(/_/g, '/');
254
+ const pad = b64.length % 4 === 0 ? '' : '='.repeat(4 - (b64.length % 4));
255
+ const json = atob(b64 + pad);
256
+ const parsed = JSON.parse(json) as WizardAnswers;
257
+ return parsed && typeof parsed === 'object' ? parsed : {};
258
+ } catch {
259
+ return {};
260
+ }
261
+ }
@@ -0,0 +1,21 @@
1
+ import { Suspense } from 'react';
2
+ import { SystemFinderWizard } from './wizard';
3
+
4
+ /**
5
+ * KaminPro System Finder — scenario-specific route component.
6
+ *
7
+ * Server component shell; the actual wizard is a client component to handle
8
+ * URL-synced state. Wrapped in <Suspense> because `useSearchParams` forces
9
+ * static prerender to bail otherwise.
10
+ */
11
+ export function SystemFinderPage() {
12
+ // `--page-top-offset` accounts for the fixed navbar + optional banners
13
+ // (e.g. AwaitingApprovalBanner). See globals.css.
14
+ return (
15
+ <main className="container mx-auto px-4 pt-[calc(var(--page-top-offset)+2rem)] pb-8 md:pt-[calc(var(--page-top-offset)+3rem)] md:pb-12">
16
+ <Suspense fallback={null}>
17
+ <SystemFinderWizard />
18
+ </Suspense>
19
+ </main>
20
+ );
21
+ }