@cimplify/sdk 0.40.1 → 0.42.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 (352) hide show
  1. package/dist/cli/commands/deploy.mjs +561 -0
  2. package/dist/cli/commands/dev.mjs +434 -0
  3. package/dist/cli/commands/domains.mjs +479 -0
  4. package/dist/cli/commands/env.mjs +610 -0
  5. package/dist/cli/commands/link.mjs +325 -0
  6. package/dist/cli/commands/login.mjs +515 -0
  7. package/dist/cli/commands/logout.mjs +54 -0
  8. package/dist/cli/commands/logs.mjs +358 -0
  9. package/dist/cli/commands/projects.mjs +327 -0
  10. package/dist/cli/commands/rollback.mjs +477 -0
  11. package/dist/cli/commands/status.mjs +380 -0
  12. package/dist/cli/commands/unlink.mjs +58 -0
  13. package/dist/cli/commands/whoami.mjs +234 -0
  14. package/dist/dispatcher.mjs +94 -2
  15. package/dist/styles.css +1 -1
  16. package/package.json +1 -1
  17. package/templates/storefront-bakery/.env.example +5 -0
  18. package/templates/storefront-bakery/AGENTS.md +57 -0
  19. package/templates/storefront-bakery/app/about/page.tsx +21 -44
  20. package/templates/storefront-bakery/app/accessibility/page.tsx +11 -0
  21. package/templates/storefront-bakery/app/account/addresses/page.tsx +21 -0
  22. package/templates/storefront-bakery/app/account/orders/page.tsx +21 -0
  23. package/templates/storefront-bakery/app/account/page.tsx +22 -0
  24. package/templates/storefront-bakery/app/account/settings/page.tsx +21 -0
  25. package/templates/storefront-bakery/app/categories/[slug]/page.tsx +2 -1
  26. package/templates/storefront-bakery/app/collections/[slug]/page.tsx +2 -1
  27. package/templates/storefront-bakery/app/contact/contact-form.tsx +109 -0
  28. package/templates/storefront-bakery/app/contact/page.tsx +54 -0
  29. package/templates/storefront-bakery/app/error.tsx +60 -0
  30. package/templates/storefront-bakery/app/faq/page.tsx +13 -89
  31. package/templates/storefront-bakery/app/layout.tsx +37 -2
  32. package/templates/storefront-bakery/app/llms.txt/route.ts +94 -0
  33. package/templates/storefront-bakery/app/login/page.tsx +17 -0
  34. package/templates/storefront-bakery/app/not-found.tsx +39 -0
  35. package/templates/storefront-bakery/app/opensearch.xml/route.ts +37 -0
  36. package/templates/storefront-bakery/app/page.tsx +6 -6
  37. package/templates/storefront-bakery/app/privacy/page.tsx +24 -68
  38. package/templates/storefront-bakery/app/returns/page.tsx +11 -0
  39. package/templates/storefront-bakery/app/robots.ts +18 -0
  40. package/templates/storefront-bakery/app/search/page.tsx +38 -0
  41. package/templates/storefront-bakery/app/search/search-client.tsx +7 -0
  42. package/templates/storefront-bakery/app/shipping/page.tsx +16 -0
  43. package/templates/storefront-bakery/app/shop/page.tsx +3 -2
  44. package/templates/storefront-bakery/app/signup/page.tsx +17 -0
  45. package/templates/storefront-bakery/app/sitemap-page/page.tsx +167 -0
  46. package/templates/storefront-bakery/app/sitemap.ts +62 -0
  47. package/templates/storefront-bakery/app/terms/page.tsx +24 -82
  48. package/templates/storefront-bakery/app/track-order/page.tsx +24 -0
  49. package/templates/storefront-bakery/app/track-order/track-order-form.tsx +69 -0
  50. package/templates/storefront-bakery/components/account-iframe.tsx +13 -0
  51. package/templates/storefront-bakery/components/footer.tsx +88 -130
  52. package/templates/storefront-bakery/components/header.tsx +8 -16
  53. package/templates/storefront-bakery/components/policy-page.tsx +49 -0
  54. package/templates/storefront-bakery/lib/brand.ts +568 -0
  55. package/templates/storefront-fashion/.env.example +16 -0
  56. package/templates/storefront-fashion/AGENTS.md +52 -0
  57. package/templates/storefront-fashion/README.md +77 -0
  58. package/templates/storefront-fashion/app/about/page.tsx +41 -0
  59. package/templates/storefront-fashion/app/accessibility/page.tsx +11 -0
  60. package/templates/storefront-fashion/app/account/addresses/page.tsx +21 -0
  61. package/templates/storefront-fashion/app/account/orders/page.tsx +21 -0
  62. package/templates/storefront-fashion/app/account/page.tsx +22 -0
  63. package/templates/storefront-fashion/app/account/settings/page.tsx +21 -0
  64. package/templates/storefront-fashion/app/cart/page.tsx +9 -0
  65. package/templates/storefront-fashion/app/categories/[slug]/listing-client.tsx +19 -0
  66. package/templates/storefront-fashion/app/categories/[slug]/page.tsx +130 -0
  67. package/templates/storefront-fashion/app/checkout/page.tsx +17 -0
  68. package/templates/storefront-fashion/app/collections/[slug]/listing-client.tsx +20 -0
  69. package/templates/storefront-fashion/app/collections/[slug]/page.tsx +130 -0
  70. package/templates/storefront-fashion/app/contact/contact-form.tsx +109 -0
  71. package/templates/storefront-fashion/app/contact/page.tsx +54 -0
  72. package/templates/storefront-fashion/app/error.tsx +61 -0
  73. package/templates/storefront-fashion/app/faq/page.tsx +46 -0
  74. package/templates/storefront-fashion/app/globals.css +46 -0
  75. package/templates/storefront-fashion/app/layout.tsx +76 -0
  76. package/templates/storefront-fashion/app/llms.txt/route.ts +94 -0
  77. package/templates/storefront-fashion/app/login/page.tsx +17 -0
  78. package/templates/storefront-fashion/app/lookbook/page.tsx +132 -0
  79. package/templates/storefront-fashion/app/not-found.tsx +39 -0
  80. package/templates/storefront-fashion/app/opensearch.xml/route.ts +37 -0
  81. package/templates/storefront-fashion/app/orders/[id]/page.tsx +24 -0
  82. package/templates/storefront-fashion/app/page.tsx +183 -0
  83. package/templates/storefront-fashion/app/privacy/page.tsx +44 -0
  84. package/templates/storefront-fashion/app/products/[slug]/page.tsx +165 -0
  85. package/templates/storefront-fashion/app/products/[slug]/product-detail.tsx +71 -0
  86. package/templates/storefront-fashion/app/returns/page.tsx +11 -0
  87. package/templates/storefront-fashion/app/robots.ts +18 -0
  88. package/templates/storefront-fashion/app/search/page.tsx +38 -0
  89. package/templates/storefront-fashion/app/search/search-client.tsx +7 -0
  90. package/templates/storefront-fashion/app/shipping/page.tsx +16 -0
  91. package/templates/storefront-fashion/app/shop/page.tsx +63 -0
  92. package/templates/storefront-fashion/app/shop/shop-client.tsx +32 -0
  93. package/templates/storefront-fashion/app/signup/page.tsx +17 -0
  94. package/templates/storefront-fashion/app/sitemap-page/page.tsx +167 -0
  95. package/templates/storefront-fashion/app/sitemap.ts +59 -0
  96. package/templates/storefront-fashion/app/size-guide/page.tsx +155 -0
  97. package/templates/storefront-fashion/app/terms/page.tsx +44 -0
  98. package/templates/storefront-fashion/app/track-order/page.tsx +24 -0
  99. package/templates/storefront-fashion/app/track-order/track-order-form.tsx +69 -0
  100. package/templates/storefront-fashion/components/account-iframe.tsx +13 -0
  101. package/templates/storefront-fashion/components/brand-marquee.tsx +27 -0
  102. package/templates/storefront-fashion/components/cart-pill.tsx +32 -0
  103. package/templates/storefront-fashion/components/category-grid.tsx +28 -0
  104. package/templates/storefront-fashion/components/category-tiles.tsx +104 -0
  105. package/templates/storefront-fashion/components/collection-strip.tsx +45 -0
  106. package/templates/storefront-fashion/components/feature-hero.tsx +82 -0
  107. package/templates/storefront-fashion/components/footer.tsx +153 -0
  108. package/templates/storefront-fashion/components/header.tsx +43 -0
  109. package/templates/storefront-fashion/components/hero.tsx +28 -0
  110. package/templates/storefront-fashion/components/nav-link.tsx +20 -0
  111. package/templates/storefront-fashion/components/newsletter.tsx +50 -0
  112. package/templates/storefront-fashion/components/policy-page.tsx +49 -0
  113. package/templates/storefront-fashion/components/promo-banner.tsx +41 -0
  114. package/templates/storefront-fashion/components/providers.tsx +31 -0
  115. package/templates/storefront-fashion/components/section-heading.tsx +37 -0
  116. package/templates/storefront-fashion/components/store-product-card.tsx +83 -0
  117. package/templates/storefront-fashion/components/trade-in-cta.tsx +54 -0
  118. package/templates/storefront-fashion/components/trust-bar.tsx +66 -0
  119. package/templates/storefront-fashion/lib/brand.ts +516 -0
  120. package/templates/storefront-fashion/lib/cart.ts +27 -0
  121. package/templates/storefront-fashion/next.config.ts +40 -0
  122. package/templates/storefront-fashion/package.json +28 -0
  123. package/templates/storefront-fashion/postcss.config.mjs +7 -0
  124. package/templates/storefront-fashion/tsconfig.json +23 -0
  125. package/templates/storefront-grocery/.env.example +16 -0
  126. package/templates/storefront-grocery/AGENTS.md +39 -0
  127. package/templates/storefront-grocery/README.md +73 -0
  128. package/templates/storefront-grocery/app/about/page.tsx +38 -0
  129. package/templates/storefront-grocery/app/accessibility/page.tsx +11 -0
  130. package/templates/storefront-grocery/app/account/addresses/page.tsx +21 -0
  131. package/templates/storefront-grocery/app/account/orders/page.tsx +21 -0
  132. package/templates/storefront-grocery/app/account/page.tsx +22 -0
  133. package/templates/storefront-grocery/app/account/settings/page.tsx +21 -0
  134. package/templates/storefront-grocery/app/cart/page.tsx +9 -0
  135. package/templates/storefront-grocery/app/categories/[slug]/listing-client.tsx +19 -0
  136. package/templates/storefront-grocery/app/categories/[slug]/page.tsx +118 -0
  137. package/templates/storefront-grocery/app/checkout/page.tsx +17 -0
  138. package/templates/storefront-grocery/app/collections/[slug]/listing-client.tsx +20 -0
  139. package/templates/storefront-grocery/app/collections/[slug]/page.tsx +118 -0
  140. package/templates/storefront-grocery/app/contact/contact-form.tsx +109 -0
  141. package/templates/storefront-grocery/app/contact/page.tsx +54 -0
  142. package/templates/storefront-grocery/app/error.tsx +60 -0
  143. package/templates/storefront-grocery/app/faq/page.tsx +46 -0
  144. package/templates/storefront-grocery/app/globals.css +45 -0
  145. package/templates/storefront-grocery/app/layout.tsx +75 -0
  146. package/templates/storefront-grocery/app/llms.txt/route.ts +94 -0
  147. package/templates/storefront-grocery/app/login/page.tsx +17 -0
  148. package/templates/storefront-grocery/app/not-found.tsx +39 -0
  149. package/templates/storefront-grocery/app/opensearch.xml/route.ts +37 -0
  150. package/templates/storefront-grocery/app/orders/[id]/page.tsx +21 -0
  151. package/templates/storefront-grocery/app/page.tsx +97 -0
  152. package/templates/storefront-grocery/app/privacy/page.tsx +44 -0
  153. package/templates/storefront-grocery/app/returns/page.tsx +11 -0
  154. package/templates/storefront-grocery/app/robots.ts +18 -0
  155. package/templates/storefront-grocery/app/search/page.tsx +38 -0
  156. package/templates/storefront-grocery/app/search/search-client.tsx +7 -0
  157. package/templates/storefront-grocery/app/shipping/page.tsx +16 -0
  158. package/templates/storefront-grocery/app/shop/page.tsx +31 -0
  159. package/templates/storefront-grocery/app/shop/shop-client.tsx +27 -0
  160. package/templates/storefront-grocery/app/signup/page.tsx +17 -0
  161. package/templates/storefront-grocery/app/sitemap-page/page.tsx +167 -0
  162. package/templates/storefront-grocery/app/sitemap.ts +62 -0
  163. package/templates/storefront-grocery/app/terms/page.tsx +44 -0
  164. package/templates/storefront-grocery/app/track-order/page.tsx +24 -0
  165. package/templates/storefront-grocery/app/track-order/track-order-form.tsx +69 -0
  166. package/templates/storefront-grocery/components/account-iframe.tsx +13 -0
  167. package/templates/storefront-grocery/components/cart-pill.tsx +32 -0
  168. package/templates/storefront-grocery/components/category-grid.tsx +28 -0
  169. package/templates/storefront-grocery/components/collection-strip.tsx +45 -0
  170. package/templates/storefront-grocery/components/footer.tsx +148 -0
  171. package/templates/storefront-grocery/components/header.tsx +43 -0
  172. package/templates/storefront-grocery/components/hero.tsx +25 -0
  173. package/templates/storefront-grocery/components/nav-link.tsx +20 -0
  174. package/templates/storefront-grocery/components/policy-page.tsx +49 -0
  175. package/templates/storefront-grocery/components/providers.tsx +31 -0
  176. package/templates/storefront-grocery/components/store-product-card.tsx +83 -0
  177. package/templates/storefront-grocery/lib/brand.ts +373 -0
  178. package/templates/storefront-grocery/lib/cart.ts +27 -0
  179. package/templates/storefront-grocery/next.config.ts +40 -0
  180. package/templates/storefront-grocery/package.json +28 -0
  181. package/templates/storefront-grocery/postcss.config.mjs +7 -0
  182. package/templates/storefront-grocery/tsconfig.json +23 -0
  183. package/templates/storefront-restaurant/.env.example +16 -0
  184. package/templates/storefront-restaurant/AGENTS.md +39 -0
  185. package/templates/storefront-restaurant/README.md +73 -0
  186. package/templates/storefront-restaurant/app/about/page.tsx +38 -0
  187. package/templates/storefront-restaurant/app/accessibility/page.tsx +11 -0
  188. package/templates/storefront-restaurant/app/account/addresses/page.tsx +21 -0
  189. package/templates/storefront-restaurant/app/account/orders/page.tsx +21 -0
  190. package/templates/storefront-restaurant/app/account/page.tsx +22 -0
  191. package/templates/storefront-restaurant/app/account/settings/page.tsx +21 -0
  192. package/templates/storefront-restaurant/app/cart/page.tsx +9 -0
  193. package/templates/storefront-restaurant/app/categories/[slug]/listing-client.tsx +19 -0
  194. package/templates/storefront-restaurant/app/categories/[slug]/page.tsx +118 -0
  195. package/templates/storefront-restaurant/app/checkout/page.tsx +17 -0
  196. package/templates/storefront-restaurant/app/collections/[slug]/listing-client.tsx +20 -0
  197. package/templates/storefront-restaurant/app/collections/[slug]/page.tsx +118 -0
  198. package/templates/storefront-restaurant/app/contact/contact-form.tsx +109 -0
  199. package/templates/storefront-restaurant/app/contact/page.tsx +54 -0
  200. package/templates/storefront-restaurant/app/error.tsx +60 -0
  201. package/templates/storefront-restaurant/app/faq/page.tsx +46 -0
  202. package/templates/storefront-restaurant/app/globals.css +44 -0
  203. package/templates/storefront-restaurant/app/layout.tsx +80 -0
  204. package/templates/storefront-restaurant/app/llms.txt/route.ts +94 -0
  205. package/templates/storefront-restaurant/app/login/page.tsx +17 -0
  206. package/templates/storefront-restaurant/app/not-found.tsx +39 -0
  207. package/templates/storefront-restaurant/app/opensearch.xml/route.ts +37 -0
  208. package/templates/storefront-restaurant/app/orders/[id]/page.tsx +21 -0
  209. package/templates/storefront-restaurant/app/page.tsx +97 -0
  210. package/templates/storefront-restaurant/app/privacy/page.tsx +44 -0
  211. package/templates/storefront-restaurant/app/reservations/page.tsx +66 -0
  212. package/templates/storefront-restaurant/app/reservations/reservations-client.tsx +234 -0
  213. package/templates/storefront-restaurant/app/returns/page.tsx +11 -0
  214. package/templates/storefront-restaurant/app/robots.ts +18 -0
  215. package/templates/storefront-restaurant/app/search/page.tsx +38 -0
  216. package/templates/storefront-restaurant/app/search/search-client.tsx +7 -0
  217. package/templates/storefront-restaurant/app/shipping/page.tsx +16 -0
  218. package/templates/storefront-restaurant/app/shop/page.tsx +31 -0
  219. package/templates/storefront-restaurant/app/shop/shop-client.tsx +27 -0
  220. package/templates/storefront-restaurant/app/signup/page.tsx +17 -0
  221. package/templates/storefront-restaurant/app/sitemap-page/page.tsx +167 -0
  222. package/templates/storefront-restaurant/app/sitemap.ts +62 -0
  223. package/templates/storefront-restaurant/app/terms/page.tsx +44 -0
  224. package/templates/storefront-restaurant/app/track-order/page.tsx +24 -0
  225. package/templates/storefront-restaurant/app/track-order/track-order-form.tsx +69 -0
  226. package/templates/storefront-restaurant/components/account-iframe.tsx +13 -0
  227. package/templates/storefront-restaurant/components/cart-pill.tsx +32 -0
  228. package/templates/storefront-restaurant/components/category-grid.tsx +28 -0
  229. package/templates/storefront-restaurant/components/collection-strip.tsx +45 -0
  230. package/templates/storefront-restaurant/components/footer.tsx +148 -0
  231. package/templates/storefront-restaurant/components/header.tsx +43 -0
  232. package/templates/storefront-restaurant/components/hero.tsx +25 -0
  233. package/templates/storefront-restaurant/components/nav-link.tsx +20 -0
  234. package/templates/storefront-restaurant/components/policy-page.tsx +49 -0
  235. package/templates/storefront-restaurant/components/product-modal.tsx +105 -0
  236. package/templates/storefront-restaurant/components/providers.tsx +31 -0
  237. package/templates/storefront-restaurant/components/store-product-card.tsx +83 -0
  238. package/templates/storefront-restaurant/lib/brand.ts +375 -0
  239. package/templates/storefront-restaurant/lib/cart.ts +27 -0
  240. package/templates/storefront-restaurant/next.config.ts +40 -0
  241. package/templates/storefront-restaurant/package.json +28 -0
  242. package/templates/storefront-restaurant/postcss.config.mjs +7 -0
  243. package/templates/storefront-restaurant/tsconfig.json +23 -0
  244. package/templates/storefront-retail/.env.example +5 -0
  245. package/templates/storefront-retail/AGENTS.md +64 -0
  246. package/templates/storefront-retail/app/about/page.tsx +24 -54
  247. package/templates/storefront-retail/app/accessibility/page.tsx +11 -0
  248. package/templates/storefront-retail/app/account/addresses/page.tsx +21 -0
  249. package/templates/storefront-retail/app/account/orders/page.tsx +21 -0
  250. package/templates/storefront-retail/app/account/page.tsx +22 -0
  251. package/templates/storefront-retail/app/account/settings/page.tsx +21 -0
  252. package/templates/storefront-retail/app/categories/[slug]/page.tsx +2 -1
  253. package/templates/storefront-retail/app/collections/[slug]/page.tsx +2 -1
  254. package/templates/storefront-retail/app/contact/contact-form.tsx +109 -0
  255. package/templates/storefront-retail/app/contact/page.tsx +54 -0
  256. package/templates/storefront-retail/app/error.tsx +61 -0
  257. package/templates/storefront-retail/app/faq/page.tsx +11 -92
  258. package/templates/storefront-retail/app/layout.tsx +37 -8
  259. package/templates/storefront-retail/app/llms.txt/route.ts +94 -0
  260. package/templates/storefront-retail/app/login/page.tsx +17 -0
  261. package/templates/storefront-retail/app/not-found.tsx +39 -0
  262. package/templates/storefront-retail/app/opensearch.xml/route.ts +37 -0
  263. package/templates/storefront-retail/app/page.tsx +16 -73
  264. package/templates/storefront-retail/app/privacy/page.tsx +24 -81
  265. package/templates/storefront-retail/app/products/[slug]/page.tsx +165 -0
  266. package/templates/storefront-retail/app/products/[slug]/product-detail.tsx +71 -0
  267. package/templates/storefront-retail/app/returns/page.tsx +11 -0
  268. package/templates/storefront-retail/app/robots.ts +18 -0
  269. package/templates/storefront-retail/app/search/page.tsx +38 -0
  270. package/templates/storefront-retail/app/search/search-client.tsx +7 -0
  271. package/templates/storefront-retail/app/shipping/page.tsx +16 -0
  272. package/templates/storefront-retail/app/shop/page.tsx +3 -3
  273. package/templates/storefront-retail/app/signup/page.tsx +17 -0
  274. package/templates/storefront-retail/app/sitemap-page/page.tsx +167 -0
  275. package/templates/storefront-retail/app/sitemap.ts +59 -0
  276. package/templates/storefront-retail/app/terms/page.tsx +24 -97
  277. package/templates/storefront-retail/app/track-order/page.tsx +24 -0
  278. package/templates/storefront-retail/app/track-order/track-order-form.tsx +69 -0
  279. package/templates/storefront-retail/components/account-iframe.tsx +13 -0
  280. package/templates/storefront-retail/components/brand-marquee.tsx +6 -15
  281. package/templates/storefront-retail/components/feature-hero.tsx +2 -1
  282. package/templates/storefront-retail/components/footer.tsx +85 -120
  283. package/templates/storefront-retail/components/header.tsx +10 -12
  284. package/templates/storefront-retail/components/newsletter.tsx +7 -9
  285. package/templates/storefront-retail/components/policy-page.tsx +49 -0
  286. package/templates/storefront-retail/components/promo-banner.tsx +12 -15
  287. package/templates/storefront-retail/components/store-product-card.tsx +7 -7
  288. package/templates/storefront-retail/components/trade-in-cta.tsx +11 -17
  289. package/templates/storefront-retail/components/trust-bar.tsx +45 -5
  290. package/templates/storefront-retail/lib/brand.ts +663 -0
  291. package/templates/storefront-services/.env.example +16 -0
  292. package/templates/storefront-services/AGENTS.md +41 -0
  293. package/templates/storefront-services/README.md +73 -0
  294. package/templates/storefront-services/app/about/page.tsx +38 -0
  295. package/templates/storefront-services/app/accessibility/page.tsx +11 -0
  296. package/templates/storefront-services/app/account/addresses/page.tsx +21 -0
  297. package/templates/storefront-services/app/account/orders/page.tsx +21 -0
  298. package/templates/storefront-services/app/account/page.tsx +22 -0
  299. package/templates/storefront-services/app/account/settings/page.tsx +21 -0
  300. package/templates/storefront-services/app/book/book-client.tsx +195 -0
  301. package/templates/storefront-services/app/book/page.tsx +65 -0
  302. package/templates/storefront-services/app/cart/page.tsx +9 -0
  303. package/templates/storefront-services/app/categories/[slug]/listing-client.tsx +19 -0
  304. package/templates/storefront-services/app/categories/[slug]/page.tsx +118 -0
  305. package/templates/storefront-services/app/checkout/page.tsx +17 -0
  306. package/templates/storefront-services/app/collections/[slug]/listing-client.tsx +20 -0
  307. package/templates/storefront-services/app/collections/[slug]/page.tsx +118 -0
  308. package/templates/storefront-services/app/contact/contact-form.tsx +109 -0
  309. package/templates/storefront-services/app/contact/page.tsx +54 -0
  310. package/templates/storefront-services/app/error.tsx +60 -0
  311. package/templates/storefront-services/app/faq/page.tsx +46 -0
  312. package/templates/storefront-services/app/globals.css +45 -0
  313. package/templates/storefront-services/app/layout.tsx +80 -0
  314. package/templates/storefront-services/app/llms.txt/route.ts +94 -0
  315. package/templates/storefront-services/app/login/page.tsx +17 -0
  316. package/templates/storefront-services/app/not-found.tsx +39 -0
  317. package/templates/storefront-services/app/opensearch.xml/route.ts +37 -0
  318. package/templates/storefront-services/app/orders/[id]/page.tsx +21 -0
  319. package/templates/storefront-services/app/page.tsx +97 -0
  320. package/templates/storefront-services/app/privacy/page.tsx +44 -0
  321. package/templates/storefront-services/app/returns/page.tsx +11 -0
  322. package/templates/storefront-services/app/robots.ts +18 -0
  323. package/templates/storefront-services/app/search/page.tsx +38 -0
  324. package/templates/storefront-services/app/search/search-client.tsx +7 -0
  325. package/templates/storefront-services/app/shipping/page.tsx +16 -0
  326. package/templates/storefront-services/app/shop/page.tsx +31 -0
  327. package/templates/storefront-services/app/shop/shop-client.tsx +27 -0
  328. package/templates/storefront-services/app/signup/page.tsx +17 -0
  329. package/templates/storefront-services/app/sitemap-page/page.tsx +167 -0
  330. package/templates/storefront-services/app/sitemap.ts +62 -0
  331. package/templates/storefront-services/app/terms/page.tsx +44 -0
  332. package/templates/storefront-services/app/track-order/page.tsx +24 -0
  333. package/templates/storefront-services/app/track-order/track-order-form.tsx +69 -0
  334. package/templates/storefront-services/components/account-iframe.tsx +13 -0
  335. package/templates/storefront-services/components/cart-pill.tsx +32 -0
  336. package/templates/storefront-services/components/category-grid.tsx +28 -0
  337. package/templates/storefront-services/components/collection-strip.tsx +45 -0
  338. package/templates/storefront-services/components/footer.tsx +148 -0
  339. package/templates/storefront-services/components/header.tsx +43 -0
  340. package/templates/storefront-services/components/hero.tsx +25 -0
  341. package/templates/storefront-services/components/nav-link.tsx +20 -0
  342. package/templates/storefront-services/components/policy-page.tsx +49 -0
  343. package/templates/storefront-services/components/product-modal.tsx +105 -0
  344. package/templates/storefront-services/components/providers.tsx +31 -0
  345. package/templates/storefront-services/components/store-product-card.tsx +83 -0
  346. package/templates/storefront-services/lib/brand.ts +394 -0
  347. package/templates/storefront-services/lib/cart.ts +27 -0
  348. package/templates/storefront-services/next.config.ts +40 -0
  349. package/templates/storefront-services/package.json +28 -0
  350. package/templates/storefront-services/postcss.config.mjs +7 -0
  351. package/templates/storefront-services/tsconfig.json +23 -0
  352. /package/templates/{storefront-retail → storefront-grocery}/components/product-modal.tsx +0 -0
@@ -0,0 +1,11 @@
1
+ import type { Metadata } from "next";
2
+ import { brand } from "@/lib/brand";
3
+ import { PolicyPage } from "@/components/policy-page";
4
+
5
+ export const metadata: Metadata = {
6
+ title: `${brand.returns.title} — ${brand.name}`,
7
+ };
8
+
9
+ export default function ReturnsPage() {
10
+ return <PolicyPage policy={brand.returns} />;
11
+ }
@@ -0,0 +1,18 @@
1
+ import type { MetadataRoute } from "next";
2
+
3
+ const SITE_URL =
4
+ process.env.NEXT_PUBLIC_SITE_URL?.trim() || "https://example.com";
5
+
6
+ export default function robots(): MetadataRoute.Robots {
7
+ return {
8
+ rules: [
9
+ {
10
+ userAgent: "*",
11
+ allow: "/",
12
+ disallow: ["/cart", "/checkout", "/orders/", "/api/"],
13
+ },
14
+ ],
15
+ sitemap: `${SITE_URL}/sitemap.xml`,
16
+ host: SITE_URL,
17
+ };
18
+ }
@@ -0,0 +1,38 @@
1
+ import type { Metadata } from "next";
2
+ import { Suspense } from "react";
3
+ import { SearchClient } from "./search-client";
4
+ import { brand } from "@/lib/brand";
5
+
6
+ export const metadata: Metadata = {
7
+ title: `Search — ${brand.name}`,
8
+ description: `Search ${brand.name} — products, collections, categories.`,
9
+ };
10
+
11
+ export default function SearchPage() {
12
+ return (
13
+ <article className="max-w-7xl mx-auto px-6 sm:px-8 py-10">
14
+ <p className="text-[11px] font-semibold uppercase tracking-[0.16em] text-primary mb-2">
15
+ Search
16
+ </p>
17
+ <h1 className="font-serif text-[clamp(2rem,4vw,2.75rem)] font-semibold mb-8 -tracking-[0.02em]">
18
+ Find anything.
19
+ </h1>
20
+ <Suspense fallback={<SearchSkeleton />}>
21
+ <SearchClient />
22
+ </Suspense>
23
+ </article>
24
+ );
25
+ }
26
+
27
+ function SearchSkeleton() {
28
+ return (
29
+ <div>
30
+ <div className="h-12 w-full max-w-xl bg-muted rounded animate-pulse mb-8" />
31
+ <div className="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-3 sm:gap-4">
32
+ {Array.from({ length: 8 }).map((_, i) => (
33
+ <div key={i} className="aspect-[4/3] bg-muted rounded-2xl animate-pulse" />
34
+ ))}
35
+ </div>
36
+ </div>
37
+ );
38
+ }
@@ -0,0 +1,7 @@
1
+ "use client";
2
+
3
+ import { SearchPage } from "@cimplify/sdk/react";
4
+
5
+ export function SearchClient() {
6
+ return <SearchPage />;
7
+ }
@@ -0,0 +1,16 @@
1
+ import type { Metadata } from "next";
2
+ import { brand } from "@/lib/brand";
3
+ import { PolicyPage } from "@/components/policy-page";
4
+
5
+ export const metadata: Metadata = {
6
+ title: `${brand.shipping.title} — ${brand.name}`,
7
+ description: brand.shipping.sections[0]?.body
8
+ ? typeof brand.shipping.sections[0].body === "string"
9
+ ? brand.shipping.sections[0].body
10
+ : brand.shipping.sections[0].body.intro
11
+ : undefined,
12
+ };
13
+
14
+ export default function ShippingPage() {
15
+ return <PolicyPage policy={brand.shipping} />;
16
+ }
@@ -3,11 +3,11 @@ import { Suspense } from "react";
3
3
  import { cacheTag, cacheLife } from "next/cache";
4
4
  import { getServerClient, tags } from "@cimplify/sdk/server";
5
5
  import { ShopClient } from "./shop-client";
6
+ import { brand } from "@/lib/brand";
6
7
 
7
8
  export const metadata: Metadata = {
8
- title: "Shop — Currents Electronics",
9
- description:
10
- "Browse every laptop, phone, audio device, accessory, and gaming product we stock. Authorised dealer pricing, 2-year warranty.",
9
+ title: `Shop — ${brand.name}`,
10
+ description: brand.description,
11
11
  };
12
12
 
13
13
  async function getShopData() {
@@ -0,0 +1,17 @@
1
+ import type { Metadata } from "next";
2
+ import { redirect } from "next/navigation";
3
+ import { brand } from "@/lib/brand";
4
+
5
+ export const metadata: Metadata = {
6
+ title: `Create an account — ${brand.name}`,
7
+ description: brand.account.signupSubtitle,
8
+ };
9
+
10
+ /**
11
+ * Cimplify Link handles sign-up inside the `<CimplifyAccount>` iframe.
12
+ * We bounce /signup to /account; the iframe shows the create-account UI
13
+ * for visitors with no session.
14
+ */
15
+ export default function SignupPage(): never {
16
+ redirect("/account");
17
+ }
@@ -0,0 +1,167 @@
1
+ import type { Metadata } from "next";
2
+ import Link from "next/link";
3
+ import { cacheTag, cacheLife } from "next/cache";
4
+ import { getServerClient, tags, type Product } from "@cimplify/sdk/server";
5
+ import { brand } from "@/lib/brand";
6
+
7
+ export const metadata: Metadata = {
8
+ title: `Sitemap — ${brand.name}`,
9
+ description: "A human-readable index of every page on this site.",
10
+ };
11
+
12
+ interface SitemapData {
13
+ products: { slug: string; name: string }[];
14
+ categories: { slug: string; name: string }[];
15
+ collections: { slug: string; name: string }[];
16
+ }
17
+
18
+ async function getSitemap(): Promise<SitemapData> {
19
+ "use cache";
20
+ cacheTag(tags.products(), tags.categories(), tags.collections());
21
+ cacheLife("hours");
22
+
23
+ const client = getServerClient();
24
+ const [pRes, cRes, colRes] = await Promise.all([
25
+ client.catalogue.getProducts({ limit: 500 }),
26
+ client.catalogue.getCategories(),
27
+ client.catalogue.getCollections(),
28
+ ]);
29
+ return {
30
+ products: (pRes.ok ? pRes.value.items : []).map((p: Product) => ({
31
+ slug: p.slug ?? p.id,
32
+ name: p.name,
33
+ })),
34
+ categories: (cRes.ok ? cRes.value : []).map((c) => ({ slug: c.slug, name: c.name })),
35
+ collections: (colRes.ok ? colRes.value : []).map((c) => ({ slug: c.slug, name: c.name })),
36
+ };
37
+ }
38
+
39
+ const STATIC_LINKS: { title: string; links: { href: string; label: string }[] }[] = [
40
+ {
41
+ title: "Browse",
42
+ links: [
43
+ { href: "/", label: "Home" },
44
+ { href: "/shop", label: "Shop" },
45
+ { href: "/search", label: "Search" },
46
+ ],
47
+ },
48
+ {
49
+ title: "Account",
50
+ links: [
51
+ { href: "/account", label: "Account" },
52
+ { href: "/account/orders", label: "Orders" },
53
+ { href: "/account/addresses", label: "Addresses" },
54
+ { href: "/account/settings", label: "Settings" },
55
+ { href: "/login", label: "Sign in" },
56
+ { href: "/signup", label: "Create account" },
57
+ { href: "/track-order", label: "Track an order" },
58
+ { href: "/cart", label: "Cart" },
59
+ { href: "/checkout", label: "Checkout" },
60
+ ],
61
+ },
62
+ {
63
+ title: "About",
64
+ links: [
65
+ { href: "/about", label: "About" },
66
+ { href: "/faq", label: "FAQ" },
67
+ { href: "/contact", label: "Contact" },
68
+ ],
69
+ },
70
+ {
71
+ title: "Policies",
72
+ links: [
73
+ { href: "/shipping", label: "Shipping" },
74
+ { href: "/returns", label: "Returns" },
75
+ { href: "/accessibility", label: "Accessibility" },
76
+ { href: "/terms", label: "Terms of Service" },
77
+ { href: "/privacy", label: "Privacy Policy" },
78
+ ],
79
+ },
80
+ {
81
+ title: "Machine-readable",
82
+ links: [
83
+ { href: "/sitemap.xml", label: "sitemap.xml (search engines)" },
84
+ { href: "/llms.txt", label: "llms.txt (LLM agents)" },
85
+ { href: "/robots.txt", label: "robots.txt" },
86
+ { href: "/opensearch.xml", label: "opensearch.xml (browser search)" },
87
+ ],
88
+ },
89
+ ];
90
+
91
+ export default async function SitemapHtmlPage() {
92
+ const { products, categories, collections } = await getSitemap();
93
+
94
+ return (
95
+ <article className="max-w-5xl mx-auto px-6 sm:px-8 py-16">
96
+ <p className="text-[11px] font-semibold uppercase tracking-[0.16em] text-primary mb-2">
97
+ Sitemap
98
+ </p>
99
+ <h1 className="text-[clamp(2rem,4vw,2.75rem)] font-semibold mb-2 -tracking-[0.02em]">
100
+ Every page, in one place.
101
+ </h1>
102
+ <p className="text-muted-foreground mb-12">
103
+ For search engines, see <Link href="/sitemap.xml" className="text-primary hover:underline">/sitemap.xml</Link>.
104
+ For LLM agents, see <Link href="/llms.txt" className="text-primary hover:underline">/llms.txt</Link>.
105
+ </p>
106
+ <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-10">
107
+ {STATIC_LINKS.map((s) => (
108
+ <Section key={s.title} title={s.title}>
109
+ {s.links.map((l) => (
110
+ <li key={l.href}>
111
+ <Link href={l.href} className="hover:text-primary transition-colors">
112
+ {l.label}
113
+ </Link>
114
+ </li>
115
+ ))}
116
+ </Section>
117
+ ))}
118
+ {categories.length > 0 && (
119
+ <Section title="Categories">
120
+ {categories.map((c) => (
121
+ <li key={c.slug}>
122
+ <Link href={`/categories/${c.slug}`} className="hover:text-primary transition-colors">
123
+ {c.name}
124
+ </Link>
125
+ </li>
126
+ ))}
127
+ </Section>
128
+ )}
129
+ {collections.length > 0 && (
130
+ <Section title="Collections">
131
+ {collections.map((c) => (
132
+ <li key={c.slug}>
133
+ <Link href={`/collections/${c.slug}`} className="hover:text-primary transition-colors">
134
+ {c.name}
135
+ </Link>
136
+ </li>
137
+ ))}
138
+ </Section>
139
+ )}
140
+ {products.length > 0 && (
141
+ <Section title={`Products (${products.length})`}>
142
+ {products.map((p) => (
143
+ <li key={p.slug}>
144
+ <Link href={`/shop?product=${encodeURIComponent(p.slug)}`} className="hover:text-primary transition-colors">
145
+ {p.name}
146
+ </Link>
147
+ </li>
148
+ ))}
149
+ </Section>
150
+ )}
151
+ </div>
152
+ </article>
153
+ );
154
+ }
155
+
156
+ function Section({ title, children }: { title: string; children: React.ReactNode }) {
157
+ return (
158
+ <div>
159
+ <p className="font-semibold text-[12px] uppercase tracking-[0.12em] text-foreground mb-3">
160
+ {title}
161
+ </p>
162
+ <ul className="space-y-2 m-0 p-0 list-none text-sm text-muted-foreground">
163
+ {children}
164
+ </ul>
165
+ </div>
166
+ );
167
+ }
@@ -0,0 +1,59 @@
1
+ import type { MetadataRoute } from "next";
2
+ import { getServerClient, type Product } from "@cimplify/sdk/server";
3
+
4
+ const SITE_URL =
5
+ process.env.NEXT_PUBLIC_SITE_URL?.trim() || "https://example.com";
6
+
7
+ const STATIC_ROUTES: { path: string; priority: number; changeFrequency: "daily" | "weekly" | "monthly" }[] = [
8
+ { path: "/", priority: 1.0, changeFrequency: "daily" },
9
+ { path: "/shop", priority: 0.9, changeFrequency: "daily" },
10
+ { path: "/about", priority: 0.5, changeFrequency: "monthly" },
11
+ { path: "/faq", priority: 0.4, changeFrequency: "monthly" },
12
+ { path: "/terms", priority: 0.2, changeFrequency: "monthly" },
13
+ { path: "/privacy", priority: 0.2, changeFrequency: "monthly" },
14
+ ];
15
+
16
+ export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
17
+ const now = new Date();
18
+ const client = getServerClient();
19
+
20
+ const [productsRes, categoriesRes, collectionsRes] = await Promise.all([
21
+ client.catalogue.getProducts({ limit: 500 }),
22
+ client.catalogue.getCategories(),
23
+ client.catalogue.getCollections(),
24
+ ]);
25
+
26
+ const products = productsRes.ok ? productsRes.value.items : [];
27
+ const categories = categoriesRes.ok ? categoriesRes.value : [];
28
+ const collections = collectionsRes.ok ? collectionsRes.value : [];
29
+
30
+ const staticEntries: MetadataRoute.Sitemap = STATIC_ROUTES.map((r) => ({
31
+ url: `${SITE_URL}${r.path}`,
32
+ lastModified: now,
33
+ changeFrequency: r.changeFrequency,
34
+ priority: r.priority,
35
+ }));
36
+
37
+ const productEntries: MetadataRoute.Sitemap = products.map((p: Product) => ({
38
+ url: `${SITE_URL}/products/${p.slug ?? p.id}`,
39
+ lastModified: p.updated_at ? new Date(p.updated_at) : now,
40
+ changeFrequency: "weekly",
41
+ priority: 0.7,
42
+ }));
43
+
44
+ const categoryEntries: MetadataRoute.Sitemap = categories.map((c) => ({
45
+ url: `${SITE_URL}/categories/${c.slug}`,
46
+ lastModified: now,
47
+ changeFrequency: "weekly",
48
+ priority: 0.6,
49
+ }));
50
+
51
+ const collectionEntries: MetadataRoute.Sitemap = collections.map((c) => ({
52
+ url: `${SITE_URL}/collections/${c.slug}`,
53
+ lastModified: now,
54
+ changeFrequency: "weekly",
55
+ priority: 0.6,
56
+ }));
57
+
58
+ return [...staticEntries, ...categoryEntries, ...collectionEntries, ...productEntries];
59
+ }
@@ -1,116 +1,43 @@
1
1
  import type { Metadata } from "next";
2
+ import { brand } from "@/lib/brand";
2
3
 
3
4
  export const metadata: Metadata = {
4
- title: "Terms of Service — Currents Electronics",
5
- description: "The rules of the road for ordering from Currents Electronics.",
5
+ title: `Terms of Service — ${brand.name}`,
6
+ description: `The rules of the road for ordering from ${brand.name}.`,
6
7
  };
7
8
 
8
9
  export default function TermsPage() {
10
+ const t = brand.terms;
9
11
  return (
10
12
  <article className="max-w-3xl mx-auto px-8 py-16 prose prose-lg max-w-none">
11
13
  <p className="text-[11px] font-mono uppercase tracking-[0.16em] text-primary mb-2 not-prose">
12
- Terms of service
14
+ {t.eyebrow}
13
15
  </p>
14
16
  <h1 className="text-[clamp(2.25rem,5vw,3.5rem)] font-bold mb-2 -tracking-[0.025em]">
15
- Terms of Service
17
+ {t.title}
16
18
  </h1>
17
19
  <p className="text-sm text-muted-foreground not-prose mb-10">
18
- Last updated: 1 May 2026
20
+ Last updated: {t.lastUpdated}
19
21
  </p>
20
22
 
21
23
  <section className="space-y-5 leading-relaxed text-foreground/90">
22
- <h2 className="text-2xl font-semibold mt-0 -tracking-[0.02em]">
23
- 1. Who we are
24
- </h2>
25
- <p>
26
- Currents Electronics (&quot;we&quot;, &quot;us&quot;) is a consumer
27
- electronics retailer based at Atomic Junction, East Legon, Accra,
28
- Ghana. By placing an order, you (&quot;you&quot;, &quot;customer&quot;)
29
- agree to these terms.
30
- </p>
31
-
32
- <h2 className="text-2xl font-semibold -tracking-[0.02em]">
33
- 2. Authorised dealer status
34
- </h2>
35
- <p>
36
- We are authorised dealers for the brands listed on our About page.
37
- Every product is sourced direct from the manufacturer or a certified
38
- distributor. Serial numbers can be verified on the brand&apos;s
39
- official portal at any time.
40
- </p>
41
-
42
- <h2 className="text-2xl font-semibold -tracking-[0.02em]">
43
- 3. Pricing and payment
44
- </h2>
45
- <p>
46
- Prices are in Ghana Cedis (GH₵) and include VAT where applicable.
47
- Payment is due at checkout via Mobile Money, card, or instalments via
48
- our partner bank. Cash on delivery is available for Accra orders only.
49
- </p>
50
-
51
- <h2 className="text-2xl font-semibold -tracking-[0.02em]">
52
- 4. Warranty
53
- </h2>
54
- <p>
55
- Every product carries a two-year warranty: the standard manufacturer
56
- warranty in year one, plus a Currents-backed extension in year two.
57
- Coverage includes manufacturing defects and battery degradation below
58
- 80%. Accidental damage, liquid damage, and unauthorised modifications
59
- are excluded.
60
- </p>
61
-
62
- <h2 className="text-2xl font-semibold -tracking-[0.02em]">
63
- 5. Returns
64
- </h2>
65
- <p>
66
- Sealed products: 14 days, no questions asked. Opened products:
67
- 7 days, subject to a 10% restocking fee for non-defective items.
68
- Activated SIM-bundled phones cannot be returned once the SIM is
69
- registered. Custom orders and bulk corporate orders are
70
- non-refundable except for defects.
71
- </p>
72
-
73
- <h2 className="text-2xl font-semibold -tracking-[0.02em]">
74
- 6. Trade-in
75
- </h2>
76
- <p>
77
- Trade-in quotes are estimates only. Final value is determined after
78
- inspection by our refurbishment partner. We reserve the right to
79
- revise the quote, and you may decline the revised offer and receive
80
- your device back at our cost.
81
- </p>
82
-
83
- <h2 className="text-2xl font-semibold -tracking-[0.02em]">
84
- 7. Liability
85
- </h2>
86
- <p>
87
- To the maximum extent permitted by Ghanaian law, our liability for
88
- any claim arising from this website or your order is limited to the
89
- value of the order. We&apos;re not liable for indirect or
90
- consequential losses, including data loss.
91
- </p>
92
-
93
- <h2 className="text-2xl font-semibold -tracking-[0.02em]">
94
- 8. Governing law
95
- </h2>
96
- <p>
97
- These terms are governed by the laws of Ghana. Disputes will be
98
- resolved in the courts of Greater Accra.
99
- </p>
100
-
101
- <h2 className="text-2xl font-semibold -tracking-[0.02em]">
102
- 9. Contact
103
- </h2>
104
- <p>
105
- Questions? Email{" "}
106
- <a
107
- href="mailto:hello@currentselectronics.test"
108
- className="text-primary font-semibold hover:underline"
109
- >
110
- hello@currentselectronics.test
111
- </a>
112
- .
113
- </p>
24
+ {t.sections.map((s) => (
25
+ <div key={s.heading}>
26
+ <h2 className="text-2xl font-semibold mt-0 -tracking-[0.02em]">{s.heading}</h2>
27
+ {typeof s.body === "string" ? (
28
+ <p>{s.body}</p>
29
+ ) : (
30
+ <>
31
+ <p>{s.body.intro}</p>
32
+ <ul className="list-disc pl-6 space-y-2">
33
+ {s.body.bullets.map((b) => (
34
+ <li key={b}>{b}</li>
35
+ ))}
36
+ </ul>
37
+ </>
38
+ )}
39
+ </div>
40
+ ))}
114
41
  </section>
115
42
  </article>
116
43
  );
@@ -0,0 +1,24 @@
1
+ import type { Metadata } from "next";
2
+ import { TrackOrderForm } from "./track-order-form";
3
+ import { brand } from "@/lib/brand";
4
+
5
+ export const metadata: Metadata = {
6
+ title: `Track an order — ${brand.name}`,
7
+ description: brand.trackOrder.body,
8
+ };
9
+
10
+ export default function TrackOrderPage() {
11
+ const t = brand.trackOrder;
12
+ return (
13
+ <article className="max-w-2xl mx-auto px-6 sm:px-8 py-16">
14
+ <p className="text-[11px] font-semibold uppercase tracking-[0.16em] text-primary mb-2">
15
+ {t.eyebrow}
16
+ </p>
17
+ <h1 className="font-serif text-[clamp(2rem,5vw,3rem)] font-semibold mb-4 -tracking-[0.02em]">
18
+ {t.title}
19
+ </h1>
20
+ <p className="text-muted-foreground leading-relaxed mb-8">{t.body}</p>
21
+ <TrackOrderForm />
22
+ </article>
23
+ );
24
+ }
@@ -0,0 +1,69 @@
1
+ "use client";
2
+
3
+ import { useState } from "react";
4
+ import { useRouter } from "next/navigation";
5
+
6
+ /**
7
+ * Guest order tracker. Routes /orders/<id> with the entered id; the
8
+ * post-checkout confirmation page already lives at /orders/[id] so this
9
+ * just sends the visitor there. Replace the redirect with a real lookup
10
+ * (e.g. Cimplify orders API + email-match guard) for production.
11
+ */
12
+ export function TrackOrderForm() {
13
+ const router = useRouter();
14
+ const [orderId, setOrderId] = useState("");
15
+ const [email, setEmail] = useState("");
16
+
17
+ return (
18
+ <form
19
+ onSubmit={(e) => {
20
+ e.preventDefault();
21
+ if (!orderId.trim()) return;
22
+ router.push(`/orders/${encodeURIComponent(orderId.trim())}`);
23
+ }}
24
+ className="space-y-4 rounded-2xl border border-border bg-card p-6"
25
+ >
26
+ <div>
27
+ <label
28
+ htmlFor="orderId"
29
+ className="text-xs font-semibold uppercase tracking-wider text-muted-foreground block mb-1.5"
30
+ >
31
+ Order number
32
+ </label>
33
+ <input
34
+ id="orderId"
35
+ name="orderId"
36
+ required
37
+ value={orderId}
38
+ onChange={(e) => setOrderId(e.target.value)}
39
+ placeholder="ord_abc123…"
40
+ className="w-full px-4 py-3 rounded-md bg-background border border-border focus:border-primary focus:ring-2 focus:ring-primary/20 outline-none text-sm"
41
+ />
42
+ </div>
43
+ <div>
44
+ <label
45
+ htmlFor="email"
46
+ className="text-xs font-semibold uppercase tracking-wider text-muted-foreground block mb-1.5"
47
+ >
48
+ Order email
49
+ </label>
50
+ <input
51
+ id="email"
52
+ name="email"
53
+ type="email"
54
+ required
55
+ value={email}
56
+ onChange={(e) => setEmail(e.target.value)}
57
+ placeholder="you@email.com"
58
+ className="w-full px-4 py-3 rounded-md bg-background border border-border focus:border-primary focus:ring-2 focus:ring-primary/20 outline-none text-sm"
59
+ />
60
+ </div>
61
+ <button
62
+ type="submit"
63
+ className="w-full inline-flex items-center justify-center px-5 py-3 rounded-md bg-primary text-primary-foreground font-semibold text-sm hover:bg-primary/90 transition-colors"
64
+ >
65
+ Track order
66
+ </button>
67
+ </form>
68
+ );
69
+ }
@@ -0,0 +1,13 @@
1
+ "use client";
2
+
3
+ import { CimplifyAccount } from "@cimplify/sdk/react";
4
+
5
+ /**
6
+ * Cimplify Account portal — iframe-mounted UI hosted by Cimplify Link.
7
+ * Handles sign-in, sign-up, OTP, addresses, payment methods, sessions,
8
+ * and order history. The iframe owns auth state; we just choose which
9
+ * `section` to land on.
10
+ */
11
+ export function AccountIframe({ section }: { section?: string }) {
12
+ return <CimplifyAccount section={section} />;
13
+ }
@@ -1,28 +1,19 @@
1
- const BRANDS = [
2
- "Apple",
3
- "Samsung",
4
- "Sony",
5
- "Bose",
6
- "Logitech",
7
- "Anker",
8
- "JBL",
9
- "Microsoft",
10
- "Lenovo",
11
- "DJI",
12
- ];
1
+ import { brand } from "@/lib/brand";
13
2
 
14
3
  /**
15
4
  * Brand authority strip. Wordmark-only (avoids licensing issues with real
16
- * logos), JetBrains Mono for the brand-as-typography aesthetic.
5
+ * logos), monospaced for the brand-as-typography aesthetic.
17
6
  */
18
7
  export function BrandMarquee() {
8
+ const strip = brand.brandStrip;
9
+ if (!strip || strip.brands.length === 0) return null;
19
10
  return (
20
11
  <section className="border-y border-border bg-background py-8 sm:py-10 overflow-hidden">
21
12
  <p className="text-center text-[11px] font-mono uppercase tracking-[0.2em] text-muted-foreground mb-6">
22
- Authorised dealer · genuine stock · 2-year warranty
13
+ {strip.headline}
23
14
  </p>
24
15
  <div className="flex items-center justify-around gap-10 sm:gap-14 flex-wrap px-6">
25
- {BRANDS.map((b) => (
16
+ {strip.brands.map((b) => (
26
17
  <span
27
18
  key={b}
28
19
  className="text-[clamp(1.25rem,2vw,1.75rem)] font-semibold text-muted-foreground hover:text-foreground transition-colors -tracking-[0.025em] opacity-70 hover:opacity-100"
@@ -14,7 +14,8 @@ interface FeatureHeroProps {
14
14
 
15
15
  /**
16
16
  * Apple-style split hero. Left: copy + CTAs. Right: large product image.
17
- * Stacks to image-on-top on mobile.
17
+ * Stacks to image-on-top on mobile. Strings come from `brand.hero` at the
18
+ * call site — this component is otherwise design-only.
18
19
  */
19
20
  export function FeatureHero({
20
21
  eyebrow,