@cimplify/sdk 0.40.0 → 0.41.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 (227) hide show
  1. package/dist/dispatcher.mjs +3 -2
  2. package/dist/mock/cli.mjs +30 -6
  3. package/dist/mock/library.js +30 -6
  4. package/dist/mock/library.mjs +30 -6
  5. package/dist/mock/msw.js +30 -6
  6. package/dist/mock/msw.mjs +30 -6
  7. package/dist/styles.css +1 -1
  8. package/package.json +1 -1
  9. package/templates/storefront-bakery/.env.example +5 -0
  10. package/templates/storefront-bakery/AGENTS.md +57 -0
  11. package/templates/storefront-bakery/app/about/page.tsx +21 -44
  12. package/templates/storefront-bakery/app/categories/[slug]/page.tsx +2 -1
  13. package/templates/storefront-bakery/app/collections/[slug]/page.tsx +2 -1
  14. package/templates/storefront-bakery/app/error.tsx +60 -0
  15. package/templates/storefront-bakery/app/faq/page.tsx +13 -89
  16. package/templates/storefront-bakery/app/layout.tsx +37 -2
  17. package/templates/storefront-bakery/app/llms.txt/route.ts +94 -0
  18. package/templates/storefront-bakery/app/not-found.tsx +39 -0
  19. package/templates/storefront-bakery/app/page.tsx +6 -6
  20. package/templates/storefront-bakery/app/privacy/page.tsx +24 -68
  21. package/templates/storefront-bakery/app/robots.ts +18 -0
  22. package/templates/storefront-bakery/app/shop/page.tsx +3 -2
  23. package/templates/storefront-bakery/app/sitemap.ts +62 -0
  24. package/templates/storefront-bakery/app/terms/page.tsx +24 -82
  25. package/templates/storefront-bakery/components/footer.tsx +88 -130
  26. package/templates/storefront-bakery/components/header.tsx +8 -16
  27. package/templates/storefront-bakery/lib/brand.ts +453 -0
  28. package/templates/storefront-fashion/.env.example +16 -0
  29. package/templates/storefront-fashion/AGENTS.md +52 -0
  30. package/templates/storefront-fashion/README.md +77 -0
  31. package/templates/storefront-fashion/app/about/page.tsx +41 -0
  32. package/templates/storefront-fashion/app/cart/page.tsx +9 -0
  33. package/templates/storefront-fashion/app/categories/[slug]/listing-client.tsx +19 -0
  34. package/templates/storefront-fashion/app/categories/[slug]/page.tsx +130 -0
  35. package/templates/storefront-fashion/app/checkout/page.tsx +17 -0
  36. package/templates/storefront-fashion/app/collections/[slug]/listing-client.tsx +20 -0
  37. package/templates/storefront-fashion/app/collections/[slug]/page.tsx +130 -0
  38. package/templates/storefront-fashion/app/error.tsx +61 -0
  39. package/templates/storefront-fashion/app/faq/page.tsx +46 -0
  40. package/templates/storefront-fashion/app/globals.css +46 -0
  41. package/templates/storefront-fashion/app/layout.tsx +76 -0
  42. package/templates/storefront-fashion/app/llms.txt/route.ts +94 -0
  43. package/templates/storefront-fashion/app/not-found.tsx +39 -0
  44. package/templates/storefront-fashion/app/orders/[id]/page.tsx +24 -0
  45. package/templates/storefront-fashion/app/page.tsx +183 -0
  46. package/templates/storefront-fashion/app/privacy/page.tsx +44 -0
  47. package/templates/storefront-fashion/app/products/[slug]/page.tsx +165 -0
  48. package/templates/storefront-fashion/app/products/[slug]/product-detail.tsx +71 -0
  49. package/templates/storefront-fashion/app/robots.ts +18 -0
  50. package/templates/storefront-fashion/app/shop/page.tsx +63 -0
  51. package/templates/storefront-fashion/app/shop/shop-client.tsx +32 -0
  52. package/templates/storefront-fashion/app/sitemap.ts +59 -0
  53. package/templates/storefront-fashion/app/terms/page.tsx +44 -0
  54. package/templates/storefront-fashion/components/brand-marquee.tsx +27 -0
  55. package/templates/storefront-fashion/components/cart-pill.tsx +32 -0
  56. package/templates/storefront-fashion/components/category-grid.tsx +28 -0
  57. package/templates/storefront-fashion/components/category-tiles.tsx +104 -0
  58. package/templates/storefront-fashion/components/collection-strip.tsx +45 -0
  59. package/templates/storefront-fashion/components/feature-hero.tsx +82 -0
  60. package/templates/storefront-fashion/components/footer.tsx +153 -0
  61. package/templates/storefront-fashion/components/header.tsx +43 -0
  62. package/templates/storefront-fashion/components/hero.tsx +28 -0
  63. package/templates/storefront-fashion/components/nav-link.tsx +20 -0
  64. package/templates/storefront-fashion/components/newsletter.tsx +50 -0
  65. package/templates/storefront-fashion/components/promo-banner.tsx +41 -0
  66. package/templates/storefront-fashion/components/providers.tsx +31 -0
  67. package/templates/storefront-fashion/components/section-heading.tsx +37 -0
  68. package/templates/storefront-fashion/components/store-product-card.tsx +83 -0
  69. package/templates/storefront-fashion/components/trade-in-cta.tsx +54 -0
  70. package/templates/storefront-fashion/components/trust-bar.tsx +66 -0
  71. package/templates/storefront-fashion/lib/brand.ts +421 -0
  72. package/templates/storefront-fashion/lib/cart.ts +27 -0
  73. package/templates/storefront-fashion/next.config.ts +40 -0
  74. package/templates/storefront-fashion/package.json +28 -0
  75. package/templates/storefront-fashion/postcss.config.mjs +7 -0
  76. package/templates/storefront-fashion/tsconfig.json +23 -0
  77. package/templates/storefront-grocery/.env.example +16 -0
  78. package/templates/storefront-grocery/AGENTS.md +39 -0
  79. package/templates/storefront-grocery/README.md +73 -0
  80. package/templates/storefront-grocery/app/about/page.tsx +38 -0
  81. package/templates/storefront-grocery/app/cart/page.tsx +9 -0
  82. package/templates/storefront-grocery/app/categories/[slug]/listing-client.tsx +19 -0
  83. package/templates/storefront-grocery/app/categories/[slug]/page.tsx +118 -0
  84. package/templates/storefront-grocery/app/checkout/page.tsx +17 -0
  85. package/templates/storefront-grocery/app/collections/[slug]/listing-client.tsx +20 -0
  86. package/templates/storefront-grocery/app/collections/[slug]/page.tsx +118 -0
  87. package/templates/storefront-grocery/app/error.tsx +60 -0
  88. package/templates/storefront-grocery/app/faq/page.tsx +46 -0
  89. package/templates/storefront-grocery/app/globals.css +45 -0
  90. package/templates/storefront-grocery/app/layout.tsx +75 -0
  91. package/templates/storefront-grocery/app/llms.txt/route.ts +94 -0
  92. package/templates/storefront-grocery/app/not-found.tsx +39 -0
  93. package/templates/storefront-grocery/app/orders/[id]/page.tsx +21 -0
  94. package/templates/storefront-grocery/app/page.tsx +97 -0
  95. package/templates/storefront-grocery/app/privacy/page.tsx +44 -0
  96. package/templates/storefront-grocery/app/robots.ts +18 -0
  97. package/templates/storefront-grocery/app/shop/page.tsx +31 -0
  98. package/templates/storefront-grocery/app/shop/shop-client.tsx +27 -0
  99. package/templates/storefront-grocery/app/sitemap.ts +62 -0
  100. package/templates/storefront-grocery/app/terms/page.tsx +44 -0
  101. package/templates/storefront-grocery/components/cart-pill.tsx +32 -0
  102. package/templates/storefront-grocery/components/category-grid.tsx +28 -0
  103. package/templates/storefront-grocery/components/collection-strip.tsx +45 -0
  104. package/templates/storefront-grocery/components/footer.tsx +148 -0
  105. package/templates/storefront-grocery/components/header.tsx +43 -0
  106. package/templates/storefront-grocery/components/hero.tsx +25 -0
  107. package/templates/storefront-grocery/components/nav-link.tsx +20 -0
  108. package/templates/storefront-grocery/components/providers.tsx +31 -0
  109. package/templates/storefront-grocery/components/store-product-card.tsx +83 -0
  110. package/templates/storefront-grocery/lib/brand.ts +284 -0
  111. package/templates/storefront-grocery/lib/cart.ts +27 -0
  112. package/templates/storefront-grocery/next.config.ts +40 -0
  113. package/templates/storefront-grocery/package.json +28 -0
  114. package/templates/storefront-grocery/postcss.config.mjs +7 -0
  115. package/templates/storefront-grocery/tsconfig.json +23 -0
  116. package/templates/storefront-restaurant/.env.example +16 -0
  117. package/templates/storefront-restaurant/AGENTS.md +39 -0
  118. package/templates/storefront-restaurant/README.md +73 -0
  119. package/templates/storefront-restaurant/app/about/page.tsx +38 -0
  120. package/templates/storefront-restaurant/app/cart/page.tsx +9 -0
  121. package/templates/storefront-restaurant/app/categories/[slug]/listing-client.tsx +19 -0
  122. package/templates/storefront-restaurant/app/categories/[slug]/page.tsx +118 -0
  123. package/templates/storefront-restaurant/app/checkout/page.tsx +17 -0
  124. package/templates/storefront-restaurant/app/collections/[slug]/listing-client.tsx +20 -0
  125. package/templates/storefront-restaurant/app/collections/[slug]/page.tsx +118 -0
  126. package/templates/storefront-restaurant/app/error.tsx +60 -0
  127. package/templates/storefront-restaurant/app/faq/page.tsx +46 -0
  128. package/templates/storefront-restaurant/app/globals.css +44 -0
  129. package/templates/storefront-restaurant/app/layout.tsx +80 -0
  130. package/templates/storefront-restaurant/app/llms.txt/route.ts +94 -0
  131. package/templates/storefront-restaurant/app/not-found.tsx +39 -0
  132. package/templates/storefront-restaurant/app/orders/[id]/page.tsx +21 -0
  133. package/templates/storefront-restaurant/app/page.tsx +97 -0
  134. package/templates/storefront-restaurant/app/privacy/page.tsx +44 -0
  135. package/templates/storefront-restaurant/app/robots.ts +18 -0
  136. package/templates/storefront-restaurant/app/shop/page.tsx +31 -0
  137. package/templates/storefront-restaurant/app/shop/shop-client.tsx +27 -0
  138. package/templates/storefront-restaurant/app/sitemap.ts +62 -0
  139. package/templates/storefront-restaurant/app/terms/page.tsx +44 -0
  140. package/templates/storefront-restaurant/components/cart-pill.tsx +32 -0
  141. package/templates/storefront-restaurant/components/category-grid.tsx +28 -0
  142. package/templates/storefront-restaurant/components/collection-strip.tsx +45 -0
  143. package/templates/storefront-restaurant/components/footer.tsx +148 -0
  144. package/templates/storefront-restaurant/components/header.tsx +43 -0
  145. package/templates/storefront-restaurant/components/hero.tsx +25 -0
  146. package/templates/storefront-restaurant/components/nav-link.tsx +20 -0
  147. package/templates/storefront-restaurant/components/product-modal.tsx +105 -0
  148. package/templates/storefront-restaurant/components/providers.tsx +31 -0
  149. package/templates/storefront-restaurant/components/store-product-card.tsx +83 -0
  150. package/templates/storefront-restaurant/lib/brand.ts +287 -0
  151. package/templates/storefront-restaurant/lib/cart.ts +27 -0
  152. package/templates/storefront-restaurant/next.config.ts +40 -0
  153. package/templates/storefront-restaurant/package.json +28 -0
  154. package/templates/storefront-restaurant/postcss.config.mjs +7 -0
  155. package/templates/storefront-restaurant/tsconfig.json +23 -0
  156. package/templates/storefront-retail/.env.example +5 -0
  157. package/templates/storefront-retail/AGENTS.md +64 -0
  158. package/templates/storefront-retail/app/about/page.tsx +24 -54
  159. package/templates/storefront-retail/app/categories/[slug]/page.tsx +50 -37
  160. package/templates/storefront-retail/app/collections/[slug]/page.tsx +50 -37
  161. package/templates/storefront-retail/app/error.tsx +61 -0
  162. package/templates/storefront-retail/app/faq/page.tsx +11 -92
  163. package/templates/storefront-retail/app/layout.tsx +37 -8
  164. package/templates/storefront-retail/app/llms.txt/route.ts +94 -0
  165. package/templates/storefront-retail/app/not-found.tsx +39 -0
  166. package/templates/storefront-retail/app/page.tsx +111 -26
  167. package/templates/storefront-retail/app/privacy/page.tsx +24 -81
  168. package/templates/storefront-retail/app/products/[slug]/page.tsx +165 -0
  169. package/templates/storefront-retail/app/products/[slug]/product-detail.tsx +71 -0
  170. package/templates/storefront-retail/app/robots.ts +18 -0
  171. package/templates/storefront-retail/app/shop/page.tsx +36 -3
  172. package/templates/storefront-retail/app/shop/shop-client.tsx +6 -1
  173. package/templates/storefront-retail/app/sitemap.ts +59 -0
  174. package/templates/storefront-retail/app/terms/page.tsx +24 -97
  175. package/templates/storefront-retail/components/brand-marquee.tsx +27 -0
  176. package/templates/storefront-retail/components/category-tiles.tsx +104 -0
  177. package/templates/storefront-retail/components/feature-hero.tsx +84 -0
  178. package/templates/storefront-retail/components/footer.tsx +85 -120
  179. package/templates/storefront-retail/components/header.tsx +10 -12
  180. package/templates/storefront-retail/components/newsletter.tsx +50 -0
  181. package/templates/storefront-retail/components/promo-banner.tsx +41 -0
  182. package/templates/storefront-retail/components/section-heading.tsx +37 -0
  183. package/templates/storefront-retail/components/store-product-card.tsx +7 -7
  184. package/templates/storefront-retail/components/trade-in-cta.tsx +54 -0
  185. package/templates/storefront-retail/components/trust-bar.tsx +66 -0
  186. package/templates/storefront-retail/lib/brand.ts +567 -0
  187. package/templates/storefront-services/.env.example +16 -0
  188. package/templates/storefront-services/AGENTS.md +41 -0
  189. package/templates/storefront-services/README.md +73 -0
  190. package/templates/storefront-services/app/about/page.tsx +38 -0
  191. package/templates/storefront-services/app/cart/page.tsx +9 -0
  192. package/templates/storefront-services/app/categories/[slug]/listing-client.tsx +19 -0
  193. package/templates/storefront-services/app/categories/[slug]/page.tsx +118 -0
  194. package/templates/storefront-services/app/checkout/page.tsx +17 -0
  195. package/templates/storefront-services/app/collections/[slug]/listing-client.tsx +20 -0
  196. package/templates/storefront-services/app/collections/[slug]/page.tsx +118 -0
  197. package/templates/storefront-services/app/error.tsx +60 -0
  198. package/templates/storefront-services/app/faq/page.tsx +46 -0
  199. package/templates/storefront-services/app/globals.css +45 -0
  200. package/templates/storefront-services/app/layout.tsx +80 -0
  201. package/templates/storefront-services/app/llms.txt/route.ts +94 -0
  202. package/templates/storefront-services/app/not-found.tsx +39 -0
  203. package/templates/storefront-services/app/orders/[id]/page.tsx +21 -0
  204. package/templates/storefront-services/app/page.tsx +97 -0
  205. package/templates/storefront-services/app/privacy/page.tsx +44 -0
  206. package/templates/storefront-services/app/robots.ts +18 -0
  207. package/templates/storefront-services/app/shop/page.tsx +31 -0
  208. package/templates/storefront-services/app/shop/shop-client.tsx +27 -0
  209. package/templates/storefront-services/app/sitemap.ts +62 -0
  210. package/templates/storefront-services/app/terms/page.tsx +44 -0
  211. package/templates/storefront-services/components/cart-pill.tsx +32 -0
  212. package/templates/storefront-services/components/category-grid.tsx +28 -0
  213. package/templates/storefront-services/components/collection-strip.tsx +45 -0
  214. package/templates/storefront-services/components/footer.tsx +148 -0
  215. package/templates/storefront-services/components/header.tsx +43 -0
  216. package/templates/storefront-services/components/hero.tsx +25 -0
  217. package/templates/storefront-services/components/nav-link.tsx +20 -0
  218. package/templates/storefront-services/components/product-modal.tsx +105 -0
  219. package/templates/storefront-services/components/providers.tsx +31 -0
  220. package/templates/storefront-services/components/store-product-card.tsx +83 -0
  221. package/templates/storefront-services/lib/brand.ts +303 -0
  222. package/templates/storefront-services/lib/cart.ts +27 -0
  223. package/templates/storefront-services/next.config.ts +40 -0
  224. package/templates/storefront-services/package.json +28 -0
  225. package/templates/storefront-services/postcss.config.mjs +7 -0
  226. package/templates/storefront-services/tsconfig.json +23 -0
  227. /package/templates/{storefront-retail → storefront-grocery}/components/product-modal.tsx +0 -0
@@ -0,0 +1,421 @@
1
+ /**
2
+ * Brand & content configuration — single source of truth for every visible
3
+ * string. Edit this file to rebrand. See ../AGENTS.md.
4
+ */
5
+
6
+ export interface BrandSocial {
7
+ label: string;
8
+ href: string;
9
+ icon?: "instagram" | "x" | "tiktok" | "facebook" | "youtube" | "linkedin" | "whatsapp";
10
+ }
11
+
12
+ export interface BrandFaqEntry { q: string; a: string }
13
+ export interface BrandFaqSection { title: string; items: BrandFaqEntry[] }
14
+ export interface BrandPolicySection {
15
+ heading: string;
16
+ body: string | { intro: string; bullets: string[] };
17
+ }
18
+ export interface BrandSitemapSection { title: string; links: { label: string; href: string }[] }
19
+
20
+ export interface Brand {
21
+ name: string;
22
+ shortName: string;
23
+ microTag: string;
24
+ description: string;
25
+ schemaType:
26
+ | "Store" | "Bakery" | "Restaurant" | "BeautySalon"
27
+ | "GroceryStore" | "LocalBusiness" | "Organization";
28
+ currency: string;
29
+ locale: string;
30
+ contact: {
31
+ address: string; streetAddress: string; city: string; countryCode: string;
32
+ phone: string; phoneTel: string; email: string; privacyEmail: string;
33
+ supportEmail?: string; businessEmail?: string; hours: string;
34
+ };
35
+ socials: BrandSocial[];
36
+ header: { nav: { label: string; href: string }[] };
37
+ hero: {
38
+ badge: string; title: string; subtitle: string;
39
+ primaryCtaLabel: string;
40
+ secondaryCtaLabel?: string; secondaryCtaHref?: string;
41
+ };
42
+ trustItems?: { label: string; value: string; description: string; iconKey: string }[];
43
+ brandStrip?: { headline: string; brands: string[] };
44
+ promo?: { badge: string; title: string; body: string; ctaLabel: string; ctaHref: string };
45
+ tradeIn?: {
46
+ eyebrow: string; title: string; body: string;
47
+ primaryCtaLabel: string; primaryCtaHref: string;
48
+ secondaryCtaLabel: string; secondaryCtaHref: string;
49
+ steps: { step: string; title: string; body: string }[];
50
+ };
51
+ newsletter: {
52
+ eyebrow: string; title: string; body: string; placeholder: string;
53
+ submitLabel: string; successLabel: string;
54
+ };
55
+ about: {
56
+ eyebrow: string; title: string; paragraphs: string[];
57
+ sections: { heading: string; body: string }[];
58
+ };
59
+ faq: {
60
+ eyebrow: string; title: string; sections: BrandFaqSection[];
61
+ contactPrompt: string; contactEmail: string;
62
+ };
63
+ terms: { eyebrow: string; title: string; lastUpdated: string; sections: BrandPolicySection[] };
64
+ privacy: { eyebrow: string; title: string; lastUpdated: string; sections: BrandPolicySection[] };
65
+ footer: {
66
+ blurb: string; sitemap: BrandSitemapSection[];
67
+ poweredBy?: { label: string; href: string };
68
+ };
69
+ llms: { summary: string };
70
+ mock: { seed: string; businessId: string };
71
+ }
72
+
73
+ export const brand: Brand = {
74
+ name: "Studio FRX",
75
+ shortName: "FRX",
76
+ microTag: "VOL. 04",
77
+ description:
78
+ "Limited-run streetwear and graphic apparel. Designed in Accra, dropped weekly, shipped worldwide.",
79
+ schemaType: "Store",
80
+
81
+ currency: "GHS",
82
+ locale: "en_GH",
83
+
84
+ contact: {
85
+ address: "Osu Oxford Street, Accra",
86
+ streetAddress: "Osu Oxford Street",
87
+ city: "Accra",
88
+ countryCode: "GH",
89
+ phone: "+233 244 000 000",
90
+ phoneTel: "+233244000000",
91
+ email: "hello@studiofrx.test",
92
+ privacyEmail: "privacy@studiofrx.test",
93
+ supportEmail: "help@studiofrx.test",
94
+ hours: "Tue–Sat · 11am–8pm",
95
+ },
96
+
97
+ socials: [
98
+ { label: "Instagram", href: "https://instagram.com/studiofrx", icon: "instagram" },
99
+ { label: "TikTok", href: "https://tiktok.com/@studiofrx", icon: "tiktok" },
100
+ { label: "X", href: "https://x.com/studiofrx", icon: "x" },
101
+ { label: "YouTube", href: "https://youtube.com/@studiofrx", icon: "youtube" },
102
+ ],
103
+
104
+ header: {
105
+ nav: [
106
+ { label: "New", href: "/categories/new-arrivals" },
107
+ { label: "Drops", href: "/collections/latest-drop" },
108
+ { label: "Shop", href: "/shop" },
109
+ { label: "Lookbook", href: "/about" },
110
+ ],
111
+ },
112
+
113
+ hero: {
114
+ badge: "Drop 04 · Live now",
115
+ title: "Built for now.\nBuilt to last.",
116
+ subtitle:
117
+ "A 24-piece capsule of heavyweight cotton, garment-dyed in Tema, screen-printed by hand. Every piece signed and numbered.",
118
+ primaryCtaLabel: "Shop the drop",
119
+ secondaryCtaLabel: "View the lookbook",
120
+ secondaryCtaHref: "/about",
121
+ },
122
+
123
+ trustItems: [
124
+ {
125
+ label: "Shipping",
126
+ value: "Free worldwide over $80",
127
+ description: "DHL Express, 2–4 business days.",
128
+ iconKey: "delivery",
129
+ },
130
+ {
131
+ label: "Returns",
132
+ value: "30 days, on us",
133
+ description: "Free returns from the US, UK, and EU.",
134
+ iconKey: "warranty",
135
+ },
136
+ {
137
+ label: "Sizing",
138
+ value: "True-to-size, oversized",
139
+ description: "Charts on every product page.",
140
+ iconKey: "verified",
141
+ },
142
+ {
143
+ label: "Made",
144
+ value: "In Tema, Ghana",
145
+ description: "Heavyweight cotton, garment-dyed.",
146
+ iconKey: "support",
147
+ },
148
+ ],
149
+
150
+ brandStrip: {
151
+ headline: "Stocked at",
152
+ brands: ["VOGUE", "HIGHSNOBIETY", "GQ", "DAZED", "i-D", "COMPLEX", "HYPEBEAST"],
153
+ },
154
+
155
+ promo: {
156
+ badge: "Drop 04 · 412 left",
157
+ title: "The Heavyweight Hoodie. Now in 4 colourways.",
158
+ body: "500gsm garment-dyed cotton. Hand-screened FRX seal. Numbered run of 600 pieces — when they're gone, they're gone.",
159
+ ctaLabel: "Shop the hoodie",
160
+ ctaHref: "/shop",
161
+ },
162
+
163
+ tradeIn: {
164
+ eyebrow: "Studio collective",
165
+ title: "Wear the studio.\nBe in the studio.",
166
+ body: "Every drop ships with a single-use code that gets you behind the scenes — early access to the next drop, in-person Accra studio days, and a slot on our private design call.",
167
+ primaryCtaLabel: "Join the collective",
168
+ primaryCtaHref: "/about",
169
+ secondaryCtaLabel: "How it works",
170
+ secondaryCtaHref: "/faq",
171
+ steps: [
172
+ { step: "01", title: "Order any piece", body: "Each piece ships with a one-time access code." },
173
+ { step: "02", title: "Activate online", body: "Two minutes. Membership unlocks instantly." },
174
+ { step: "03", title: "Be in the room", body: "Studio days, design calls, drop previews — for a year." },
175
+ ],
176
+ },
177
+
178
+ newsletter: {
179
+ eyebrow: "FRX list",
180
+ title: "First in line, always.",
181
+ body: "We drop quietly. The list gets a 24-hour head start, the linesheet a week before, and discount codes on collabs. Unsubscribe in one click.",
182
+ placeholder: "you@email.com",
183
+ submitLabel: "Join the list",
184
+ successLabel: "On the list ✓",
185
+ },
186
+
187
+ about: {
188
+ eyebrow: "About Studio FRX",
189
+ title: "Apparel from\nthe other side.",
190
+ paragraphs: [
191
+ "Studio FRX started in 2021 in a converted shipping container in Osu, with a single Riley screen press and a stack of 14oz cotton blanks. We make heavyweight, hand-screened streetwear — graphic-led, garment-dyed, numbered.",
192
+ "We don't restock. Each drop is a closed run — between 200 and 800 pieces — with the production, dye batch, and screen burn documented on the inside hem. When a drop ends, we move on.",
193
+ "Made in Tema. Shipped worldwide. Pictured on the people you see in our feed — most of whom are on the list.",
194
+ ],
195
+ sections: [
196
+ {
197
+ heading: "The collective",
198
+ body: "Every order activates a year of access — drop previews, in-person studio days, and a seat on our monthly design call. Not a discount programme. A studio.",
199
+ },
200
+ {
201
+ heading: "Sizing",
202
+ body: "Our pieces are cut for an oversized, dropped-shoulder fit. Order true to size if you want oversized; size down for a regular fit. Charts on every product page.",
203
+ },
204
+ {
205
+ heading: "Visit",
206
+ body: "Osu Oxford Street, Accra · Tue–Sat, 11am–8pm. We open the studio for fittings by appointment.",
207
+ },
208
+ ],
209
+ },
210
+
211
+ faq: {
212
+ eyebrow: "Q&A",
213
+ title: "Things people ask.",
214
+ sections: [
215
+ {
216
+ title: "Sizing & fit",
217
+ items: [
218
+ {
219
+ q: "How do I find my size?",
220
+ a: "Every product page has a size chart with chest, length, and shoulder measurements. Our pieces fit oversized — order true to size for the intended fit, or size down for a regular cut.",
221
+ },
222
+ {
223
+ q: "Do you offer larger sizes?",
224
+ a: "Most pieces run S–3XL. A few drops are smaller — XS–XL — and that's flagged on the product page.",
225
+ },
226
+ {
227
+ q: "What if it doesn't fit?",
228
+ a: "Free returns within 30 days from the US, UK, and EU. Anywhere else, return shipping is on you, but we'll refund or exchange immediately.",
229
+ },
230
+ ],
231
+ },
232
+ {
233
+ title: "Shipping & delivery",
234
+ items: [
235
+ {
236
+ q: "How fast is shipping?",
237
+ a: "DHL Express worldwide. 2–4 business days from when you order. Free over $80 (or local equivalent).",
238
+ },
239
+ {
240
+ q: "Do you ship to my country?",
241
+ a: "We ship to 80+ countries via DHL. Enter your address at checkout to see rates and ETA.",
242
+ },
243
+ {
244
+ q: "Customs and duties?",
245
+ a: "Charged on delivery in some countries — DHL will contact you. We can prepay for orders over $300; email help@studiofrx.test before placing the order.",
246
+ },
247
+ ],
248
+ },
249
+ {
250
+ title: "Drops & restocks",
251
+ items: [
252
+ {
253
+ q: "Will you restock my size?",
254
+ a: "No. Every drop is a closed run, numbered and dated. When a size sells out, it's gone.",
255
+ },
256
+ {
257
+ q: "How do I find out about the next drop?",
258
+ a: "Join the FRX list. You get 24 hours of head-start before each drop opens to the public.",
259
+ },
260
+ {
261
+ q: "Do you ever do collabs?",
262
+ a: "Two or three a year. They're announced on the list first, then on Instagram. Most sell out the same day.",
263
+ },
264
+ ],
265
+ },
266
+ {
267
+ title: "Returns",
268
+ items: [
269
+ {
270
+ q: "What's your return policy?",
271
+ a: "30 days from delivery. Item must be unworn, with original tags. Underwear and final-sale items aren't returnable.",
272
+ },
273
+ {
274
+ q: "How do I start a return?",
275
+ a: "Email help@studiofrx.test with your order number. We'll email a prepaid label (US/UK/EU) or instructions.",
276
+ },
277
+ ],
278
+ },
279
+ ],
280
+ contactPrompt: "Anything else? Email",
281
+ contactEmail: "help@studiofrx.test",
282
+ },
283
+
284
+ terms: {
285
+ eyebrow: "Terms of service",
286
+ title: "Terms of Service",
287
+ lastUpdated: "1 May 2026",
288
+ sections: [
289
+ {
290
+ heading: "1. Who we are",
291
+ body: "Studio FRX (\"we\", \"us\") is an apparel studio operating from Osu, Accra, Ghana. By placing an order on this site, you (\"you\", \"customer\") agree to these terms.",
292
+ },
293
+ {
294
+ heading: "2. Limited drops",
295
+ body: "Every product is part of a closed, numbered run. We do not restock. Pricing reflects the numbered nature of each drop.",
296
+ },
297
+ {
298
+ heading: "3. Pricing and payment",
299
+ body: "Prices are displayed in your local currency where supported (auto-detected at checkout). Payment is taken at the time of order via card or Mobile Money.",
300
+ },
301
+ {
302
+ heading: "4. Shipping",
303
+ body: "DHL Express worldwide. Customs and duties are the customer's responsibility unless prepaid options are available at checkout.",
304
+ },
305
+ {
306
+ heading: "5. Returns",
307
+ body: "30-day return window from delivery date. Items must be unworn with original tags. Underwear, sale items, and bespoke pieces are final.",
308
+ },
309
+ {
310
+ heading: "6. Intellectual property",
311
+ body: "All graphics, prints, and product designs are original works of Studio FRX. Reproduction or commercial use without written permission is prohibited.",
312
+ },
313
+ {
314
+ heading: "7. Liability",
315
+ body: "Our maximum liability for any order is the value of that order. We're not liable for indirect or consequential losses.",
316
+ },
317
+ {
318
+ heading: "8. Governing law",
319
+ body: "These terms are governed by the laws of Ghana. Disputes are resolved in the courts of Greater Accra.",
320
+ },
321
+ {
322
+ heading: "9. Contact",
323
+ body: "Questions? Email hello@studiofrx.test.",
324
+ },
325
+ ],
326
+ },
327
+
328
+ privacy: {
329
+ eyebrow: "Privacy",
330
+ title: "Privacy Policy",
331
+ lastUpdated: "1 May 2026",
332
+ sections: [
333
+ {
334
+ heading: "What we collect",
335
+ body: "Order details (name, address, phone, email), garment measurements if you fill our size finder, and payment data via our processors (Paystack, Stripe). We do not store payment cards on our servers.",
336
+ },
337
+ {
338
+ heading: "How we use it",
339
+ body: {
340
+ intro: "We use your data to:",
341
+ bullets: [
342
+ "Fulfil and ship your order.",
343
+ "Send order updates by SMS and email.",
344
+ "Send drop announcements (only if you opted in).",
345
+ "Improve sizing recommendations across the catalogue.",
346
+ ],
347
+ },
348
+ },
349
+ {
350
+ heading: "Who we share it with",
351
+ body: "DHL (shipping), Paystack/Stripe (payments), and our email/SMS providers. We do not sell or rent personal data.",
352
+ },
353
+ {
354
+ heading: "Cookies",
355
+ body: "Strictly-necessary cookies for cart and session, plus optional analytics (toggleable in our cookie banner).",
356
+ },
357
+ {
358
+ heading: "Your rights",
359
+ body: "Under the Ghana Data Protection Act, 2012 (Act 843), you have the right to access, correct, or delete your data. Email privacy@studiofrx.test.",
360
+ },
361
+ {
362
+ heading: "Retention",
363
+ body: "Order records: 7 years (tax law). Marketing list: until you unsubscribe.",
364
+ },
365
+ ],
366
+ },
367
+
368
+ footer: {
369
+ blurb:
370
+ "Limited-run streetwear from Accra. Heavyweight cotton, hand-screened, numbered. Each drop is a closed run.",
371
+ sitemap: [
372
+ {
373
+ title: "Shop",
374
+ links: [
375
+ { label: "All products", href: "/shop" },
376
+ { label: "New arrivals", href: "/categories/new-arrivals" },
377
+ { label: "Hoodies", href: "/categories/hoodies" },
378
+ { label: "Tees", href: "/categories/tees" },
379
+ { label: "Outerwear", href: "/categories/outerwear" },
380
+ { label: "Drops", href: "/collections/latest-drop" },
381
+ ],
382
+ },
383
+ {
384
+ title: "Studio",
385
+ links: [
386
+ { label: "About", href: "/about" },
387
+ { label: "The collective", href: "/about" },
388
+ { label: "Lookbook", href: "/about" },
389
+ { label: "Press", href: "mailto:press@studiofrx.test" },
390
+ ],
391
+ },
392
+ {
393
+ title: "Help",
394
+ links: [
395
+ { label: "Contact", href: "mailto:help@studiofrx.test" },
396
+ { label: "Sizing", href: "/faq" },
397
+ { label: "Shipping", href: "/faq" },
398
+ { label: "Returns", href: "/faq" },
399
+ ],
400
+ },
401
+ {
402
+ title: "Legal",
403
+ links: [
404
+ { label: "Terms of Service", href: "/terms" },
405
+ { label: "Privacy Policy", href: "/privacy" },
406
+ ],
407
+ },
408
+ ],
409
+ poweredBy: { label: "Cimplify", href: "https://app.cimplify.io" },
410
+ },
411
+
412
+ llms: {
413
+ summary:
414
+ "Studio FRX — limited-run streetwear from Accra. Heavyweight cotton garment-dyed in Tema and hand-screened. Closed runs only — no restocks. Free worldwide shipping over $80, 30-day returns from US/UK/EU.",
415
+ },
416
+
417
+ mock: {
418
+ seed: "retail",
419
+ businessId: "bus_currents_electronics",
420
+ },
421
+ };
@@ -0,0 +1,27 @@
1
+ "use client";
2
+
3
+ import { useEffect, useState } from "react";
4
+ import { useCimplifyClient } from "@cimplify/sdk/react";
5
+
6
+ /**
7
+ * Tiny hook for the live cart-count pill in the header. Re-fetches on
8
+ * mount and exposes a refresh callback. The SDK's `useCart` hook is
9
+ * fine-grained but heavier — this is enough for a header badge.
10
+ */
11
+ export function useCartCount(): { count: number; refresh: () => void } {
12
+ const { client } = useCimplifyClient();
13
+ const [count, setCount] = useState(0);
14
+
15
+ const refresh = () => {
16
+ void client.cart.getCount().then((r) => {
17
+ if (r.ok) setCount(r.value);
18
+ });
19
+ };
20
+
21
+ useEffect(() => {
22
+ refresh();
23
+ // eslint-disable-next-line react-hooks/exhaustive-deps
24
+ }, [client]);
25
+
26
+ return { count, refresh };
27
+ }
@@ -0,0 +1,40 @@
1
+ import type { NextConfig } from "next";
2
+
3
+ const MOCK_URL = process.env.NEXT_PUBLIC_CIMPLIFY_API_URL?.trim() || "http://127.0.0.1:8787";
4
+
5
+ /**
6
+ * Same-origin proxy to the Cimplify mock so the browser never makes a
7
+ * cross-origin request in dev (no CORS preflights, no flaky `Origin`
8
+ * mismatches). The SDK's base URL stays empty/relative — requests go to
9
+ * `/api/v1/...` on the Next origin, then this rewrite forwards them to
10
+ * the mock at `127.0.0.1:8787`.
11
+ *
12
+ * In production, point `NEXT_PUBLIC_CIMPLIFY_API_URL` at your Cimplify
13
+ * host and the rewrite continues to work the same way (or remove it and
14
+ * pass the absolute URL through `<CimplifyProvider/>`).
15
+ */
16
+ const nextConfig: NextConfig = {
17
+ // Enable Next 16's `cacheComponents` mode so we can use `'use cache'` +
18
+ // `cacheTag` / `cacheLife` for SSR caching. Cached chrome streams first,
19
+ // dynamic Suspense boundaries fill in when ready.
20
+ cacheComponents: true,
21
+ async rewrites() {
22
+ return [
23
+ { source: "/api/v1/:path*", destination: `${MOCK_URL}/api/v1/:path*` },
24
+ { source: "/img/:path*", destination: `${MOCK_URL}/img/:path*` },
25
+ { source: "/elements/:path*", destination: `${MOCK_URL}/elements/:path*` },
26
+ { source: "/_mock/:path*", destination: `${MOCK_URL}/_mock/:path*` },
27
+ ];
28
+ },
29
+ images: {
30
+ remotePatterns: [
31
+ { protocol: "http", hostname: "127.0.0.1", port: "8787", pathname: "/img/**" },
32
+ { protocol: "http", hostname: "localhost", port: "8787", pathname: "/img/**" },
33
+ { protocol: "http", hostname: "localhost", port: "3000", pathname: "/img/**" },
34
+ { protocol: "https", hostname: "loremflickr.com", pathname: "/**" },
35
+ { protocol: "https", hostname: "images.unsplash.com", pathname: "/**" },
36
+ ],
37
+ },
38
+ };
39
+
40
+ export default nextConfig;
@@ -0,0 +1,28 @@
1
+ {
2
+ "name": "__STOREFRONT_NAME__",
3
+ "private": true,
4
+ "version": "0.0.0",
5
+ "scripts": {
6
+ "dev": "concurrently -k -n mock,next -c blue,magenta \"bunx @cimplify/sdk --seed retail --quiet\" \"next dev\"",
7
+ "dev:storefront": "next dev",
8
+ "dev:mock": "bunx @cimplify/sdk --seed retail",
9
+ "build": "next build",
10
+ "start": "next start",
11
+ "lint": "next lint"
12
+ },
13
+ "dependencies": {
14
+ "@cimplify/sdk": "^0.40.1",
15
+ "next": "^16.2.4",
16
+ "react": "^19.0.0",
17
+ "react-dom": "^19.0.0"
18
+ },
19
+ "devDependencies": {
20
+ "@tailwindcss/postcss": "^4.2.4",
21
+ "@types/node": "^22.10.0",
22
+ "@types/react": "^19.0.0",
23
+ "@types/react-dom": "^19.0.0",
24
+ "concurrently": "^9.0.0",
25
+ "tailwindcss": "^4.2.4",
26
+ "typescript": "^5.9.3"
27
+ }
28
+ }
@@ -0,0 +1,7 @@
1
+ const config = {
2
+ plugins: {
3
+ "@tailwindcss/postcss": {},
4
+ },
5
+ };
6
+
7
+ export default config;
@@ -0,0 +1,23 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "lib": ["dom", "dom.iterable", "esnext"],
5
+ "allowJs": false,
6
+ "skipLibCheck": true,
7
+ "strict": true,
8
+ "noEmit": true,
9
+ "esModuleInterop": true,
10
+ "module": "esnext",
11
+ "moduleResolution": "bundler",
12
+ "resolveJsonModule": true,
13
+ "isolatedModules": true,
14
+ "jsx": "preserve",
15
+ "incremental": true,
16
+ "plugins": [{ "name": "next" }],
17
+ "paths": {
18
+ "@/*": ["./*"]
19
+ }
20
+ },
21
+ "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts", ".next/dev/types/**/*.ts"],
22
+ "exclude": ["node_modules"]
23
+ }
@@ -0,0 +1,16 @@
1
+ # Cimplify API base URL.
2
+ # Dev: leave empty so the SDK uses the current origin (localhost:3000),
3
+ # which Next.js rewrites to the mock at 127.0.0.1:8787 (see next.config.ts).
4
+ # Production: set to your Cimplify host (e.g. https://api.cimplify.io).
5
+ NEXT_PUBLIC_CIMPLIFY_API_URL=
6
+
7
+ # Tenant public key. The mock accepts any value.
8
+ NEXT_PUBLIC_CIMPLIFY_PUBLIC_KEY=mock-dev
9
+
10
+ # Business id used by the mock seed (grocery: FreshMart).
11
+ NEXT_PUBLIC_CIMPLIFY_BUSINESS_ID=bus_freshmart
12
+
13
+ # Canonical public site URL — used by sitemap.xml, robots.txt, llms.txt,
14
+ # and OpenGraph metadata. Set this on production deploys (Vercel auto-injects
15
+ # via VERCEL_URL but Next prefers an explicit value).
16
+ NEXT_PUBLIC_SITE_URL=https://example.com
@@ -0,0 +1,39 @@
1
+ # AGENTS.md — Grocery storefront template
2
+
3
+ If you are an AI agent (Claude, Cursor, Aider, devin, …) working on this storefront, **start here.**
4
+
5
+ ## TL;DR for rebranding
6
+
7
+ 1. **Edit `lib/brand.ts`** — every visible string lives here.
8
+ 2. **Edit `app/globals.css`** — `@theme { … }` for palette + radius.
9
+ 3. **Edit `.env.local`** — `NEXT_PUBLIC_CIMPLIFY_BUSINESS_ID=bus_freshmart` for the bundled seed.
10
+
11
+ ## Aesthetic
12
+
13
+ Approachable grocer — Trader Joe's / Whole Foods / abundant-feel:
14
+
15
+ - **Inter sans only** (no serif) — friendly, readable for dense product grids.
16
+ - **Fresh green + cream**: vibrant green primary, warm cream background.
17
+ - **Generous radius**: `0.875rem` — softer than retail.
18
+ - **Bold, slightly heavy** headings.
19
+
20
+ ## Industry-specific copy patterns
21
+
22
+ - `brand.hero.badge` is `"Free delivery over GH₵150"` — pricing-led trust signal.
23
+ - `brand.hero.primaryCtaLabel` is `"Shop the aisle"`.
24
+ - `brand.tradeIn` is omitted.
25
+ - `brand.faq` covers delivery slots, sourcing/quality, subscription boxes.
26
+ - Schema.org type is `GroceryStore`.
27
+
28
+ ## Mock seed
29
+
30
+ Wired to `--seed grocery` (FreshMart).
31
+
32
+ ## Quick start
33
+
34
+ ```bash
35
+ bun install
36
+ bun dev
37
+ ```
38
+
39
+ Open <http://localhost:3000>.
@@ -0,0 +1,73 @@
1
+ # __STOREFRONT_NAME__
2
+
3
+ A Cimplify storefront scaffolded from the **bakery** template — Next.js 16 (App Router), React 19, Tailwind v4. Warm food-styled palette, Playfair Display + Inter typography, designed for bakeries, pâtisseries, and food businesses.
4
+
5
+ For a different industry, scaffold with `--template`:
6
+
7
+ ```bash
8
+ bunx @cimplify/sdk init my-store --template retail # electronics / consumer goods
9
+ bunx @cimplify/sdk init my-store --template bakery # default — food / pâtisserie
10
+ ```
11
+
12
+ ## Run
13
+
14
+ ```bash
15
+ bun install
16
+ bun dev
17
+ ```
18
+
19
+ Two things start in parallel:
20
+
21
+ - `bunx @cimplify/sdk` — the Cimplify mock API on `http://127.0.0.1:8787` (Akua's Bakery seeded by default).
22
+ - `next dev` — this storefront on `http://localhost:3000`.
23
+
24
+ Open the storefront in your browser. Edit `app/page.tsx` to start customising. The SDK ships full pages (`<CataloguePage>`, `<ProductPage>`, `<CartPage>`, `<CheckoutPage>`) and layouts (`<DefaultProductLayout>`, `<FoodProductLayout>`, etc.) that you can swap in.
25
+
26
+ ## Structure
27
+
28
+ ```
29
+ app/
30
+ layout.tsx # root layout, fonts, providers, header/footer/modal
31
+ page.tsx # home
32
+ shop/page.tsx # full catalogue (SDK <CataloguePage/>)
33
+ collections/[slug]/ # collection landing
34
+ categories/[slug]/ # category landing
35
+ cart/page.tsx # SDK <CartPage/>
36
+ checkout/page.tsx # SDK <CheckoutPage/>
37
+ orders/[id]/page.tsx # post-checkout thank-you
38
+ globals.css # Tailwind import + theme tokens
39
+ components/
40
+ providers.tsx # CimplifyProvider client wrapper
41
+ header.tsx, footer.tsx, hero.tsx
42
+ store-product-card.tsx # SDK <ProductCard/> wired to URL-driven modal
43
+ product-modal.tsx # ?product=<slug> deep-linkable modal
44
+ collection-strip.tsx # horizontal product strip
45
+ category-grid.tsx # SDK <CategoryGrid/> with router navigation
46
+ lib/
47
+ cart.ts # useCartCount() for the header pill
48
+ ```
49
+
50
+ ## Switch seed
51
+
52
+ ```bash
53
+ bunx @cimplify/sdk --seed restaurant # Mama's Kitchen
54
+ bunx @cimplify/sdk --seed retail # Currents Electronics
55
+ bunx @cimplify/sdk --seed services # Serene Spa
56
+ bunx @cimplify/sdk --seed grocery # FreshMart
57
+ ```
58
+
59
+ Update `NEXT_PUBLIC_CIMPLIFY_BUSINESS_ID` in `.env.local` to match the seeded business.
60
+
61
+ ## Go live
62
+
63
+ ```diff
64
+ # .env.local
65
+ - NEXT_PUBLIC_CIMPLIFY_API_URL=http://127.0.0.1:8787
66
+ + NEXT_PUBLIC_CIMPLIFY_API_URL=https://api.cimplify.io
67
+ - NEXT_PUBLIC_CIMPLIFY_PUBLIC_KEY=mock-dev
68
+ + NEXT_PUBLIC_CIMPLIFY_PUBLIC_KEY=<your tenant key>
69
+ - NEXT_PUBLIC_CIMPLIFY_BUSINESS_ID=bus_default_akua_bakery
70
+ + NEXT_PUBLIC_CIMPLIFY_BUSINESS_ID=<your business id>
71
+ ```
72
+
73
+ Deploy to Vercel with one click — `next.config.ts` already whitelists the SDK image hosts under `images.remotePatterns`.