@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,453 @@
1
+ /**
2
+ * Brand & content configuration — the **single source of truth** for every
3
+ * visible string in this storefront.
4
+ *
5
+ * To rebrand the entire site, edit this file. Every page, component,
6
+ * metadata block, JSON-LD object, sitemap, robots.txt, and llms.txt entry
7
+ * reads from `brand`.
8
+ *
9
+ * Schema is intentionally generous: optional fields (tradeIn, trustItems,
10
+ * brandStrip, promo) only render when present, so the same Brand type
11
+ * works across industry templates.
12
+ */
13
+
14
+ export interface BrandSocial {
15
+ /** Display label (Instagram, X, YouTube, …). Used as aria-label and footer chip. */
16
+ label: string;
17
+ href: string;
18
+ /** Optional icon override — defaults to inline SVG keyed by `label`. */
19
+ icon?: "instagram" | "x" | "tiktok" | "facebook" | "youtube" | "linkedin" | "whatsapp";
20
+ }
21
+
22
+ export interface BrandFaqEntry {
23
+ q: string;
24
+ a: string;
25
+ }
26
+
27
+ export interface BrandFaqSection {
28
+ title: string;
29
+ items: BrandFaqEntry[];
30
+ }
31
+
32
+ export interface BrandPolicySection {
33
+ heading: string;
34
+ /** Plain prose, or { intro + bullets } for list-style sections. */
35
+ body: string | { intro: string; bullets: string[] };
36
+ }
37
+
38
+ export interface BrandSitemapSection {
39
+ title: string;
40
+ links: { label: string; href: string }[];
41
+ }
42
+
43
+ export interface Brand {
44
+ name: string;
45
+ shortName: string;
46
+ microTag: string;
47
+ description: string;
48
+ schemaType:
49
+ | "Store"
50
+ | "Bakery"
51
+ | "Restaurant"
52
+ | "BeautySalon"
53
+ | "GroceryStore"
54
+ | "LocalBusiness"
55
+ | "Organization";
56
+
57
+ currency: string;
58
+ locale: string;
59
+
60
+ contact: {
61
+ address: string;
62
+ streetAddress: string;
63
+ city: string;
64
+ countryCode: string;
65
+ phone: string;
66
+ phoneTel: string;
67
+ email: string;
68
+ privacyEmail: string;
69
+ supportEmail?: string;
70
+ businessEmail?: string;
71
+ hours: string;
72
+ };
73
+
74
+ socials: BrandSocial[];
75
+
76
+ header: {
77
+ nav: { label: string; href: string }[];
78
+ };
79
+
80
+ hero: {
81
+ badge: string;
82
+ title: string;
83
+ subtitle: string;
84
+ primaryCtaLabel: string;
85
+ secondaryCtaLabel?: string;
86
+ secondaryCtaHref?: string;
87
+ };
88
+
89
+ trustItems?: { label: string; value: string; description: string; iconKey: string }[];
90
+ brandStrip?: { headline: string; brands: string[] };
91
+ promo?: { badge: string; title: string; body: string; ctaLabel: string; ctaHref: string };
92
+ tradeIn?: {
93
+ eyebrow: string;
94
+ title: string;
95
+ body: string;
96
+ primaryCtaLabel: string;
97
+ primaryCtaHref: string;
98
+ secondaryCtaLabel: string;
99
+ secondaryCtaHref: string;
100
+ steps: { step: string; title: string; body: string }[];
101
+ };
102
+
103
+ newsletter: {
104
+ eyebrow: string;
105
+ title: string;
106
+ body: string;
107
+ placeholder: string;
108
+ submitLabel: string;
109
+ successLabel: string;
110
+ };
111
+
112
+ about: {
113
+ eyebrow: string;
114
+ title: string;
115
+ paragraphs: string[];
116
+ sections: { heading: string; body: string }[];
117
+ };
118
+
119
+ faq: {
120
+ eyebrow: string;
121
+ title: string;
122
+ sections: BrandFaqSection[];
123
+ contactPrompt: string;
124
+ contactEmail: string;
125
+ };
126
+
127
+ terms: {
128
+ eyebrow: string;
129
+ title: string;
130
+ lastUpdated: string;
131
+ sections: BrandPolicySection[];
132
+ };
133
+
134
+ privacy: {
135
+ eyebrow: string;
136
+ title: string;
137
+ lastUpdated: string;
138
+ sections: BrandPolicySection[];
139
+ };
140
+
141
+ footer: {
142
+ blurb: string;
143
+ sitemap: BrandSitemapSection[];
144
+ poweredBy?: { label: string; href: string };
145
+ };
146
+
147
+ llms: {
148
+ summary: string;
149
+ };
150
+
151
+ mock: {
152
+ seed: string;
153
+ businessId: string;
154
+ };
155
+ }
156
+
157
+ export const brand: Brand = {
158
+ name: "Akua's Bakery",
159
+ shortName: "Akua's Bakery",
160
+ microTag: "ACCRA · SINCE 2018",
161
+ description:
162
+ "Sourdough, croissants, cakes, and more — handcrafted in East Legon, delivered across Accra.",
163
+ schemaType: "Bakery",
164
+
165
+ currency: "GHS",
166
+ locale: "en_GH",
167
+
168
+ contact: {
169
+ address: "12 Independence Ave, Accra",
170
+ streetAddress: "12 Independence Ave",
171
+ city: "Accra",
172
+ countryCode: "GH",
173
+ phone: "+233 244 000 000",
174
+ phoneTel: "+233244000000",
175
+ email: "hello@akuasbakery.test",
176
+ privacyEmail: "privacy@akuasbakery.test",
177
+ hours: "Tue–Sun · 8am–8pm · closed Mondays",
178
+ },
179
+
180
+ socials: [
181
+ { label: "Instagram", href: "https://instagram.com/akuasbakery", icon: "instagram" },
182
+ { label: "TikTok", href: "https://tiktok.com/@akuasbakery", icon: "tiktok" },
183
+ { label: "X", href: "https://x.com/akuasbakery", icon: "x" },
184
+ { label: "Facebook", href: "https://facebook.com/akuasbakery", icon: "facebook" },
185
+ { label: "WhatsApp", href: "https://wa.me/233244000000", icon: "whatsapp" },
186
+ ],
187
+
188
+ header: {
189
+ nav: [
190
+ { label: "Home", href: "/" },
191
+ { label: "Shop", href: "/shop" },
192
+ { label: "About", href: "/about" },
193
+ { label: "FAQ", href: "/faq" },
194
+ ],
195
+ },
196
+
197
+ hero: {
198
+ badge: "BAKERY · PÂTISSERIE · COFFEE",
199
+ title: "Fresh from the oven, every day.",
200
+ subtitle:
201
+ "Sourdough, croissants, cakes, and more — handcrafted in East Legon, delivered across Accra.",
202
+ primaryCtaLabel: "Shop the menu",
203
+ },
204
+
205
+ newsletter: {
206
+ eyebrow: "Stay in touch",
207
+ title: "Fresh bakes, in your inbox.",
208
+ body: "One email a week. New seasonal pastries, the cake of the month, and the limited drops you don't want to miss.",
209
+ placeholder: "you@email.com",
210
+ submitLabel: "Subscribe",
211
+ successLabel: "Subscribed ✓",
212
+ },
213
+
214
+ about: {
215
+ eyebrow: "Our story",
216
+ title: "Bread is a love letter.",
217
+ paragraphs: [
218
+ "Akua started baking in 2018 from a converted shipping container in East Legon, with a wood-fired oven, a 12-year-old sourdough starter, and a stubborn belief that good bread shouldn't be a luxury.",
219
+ "Today, we bake out of a 200-square-metre kitchen on Independence Avenue, milling our own heritage flour and supplying restaurants and homes across Greater Accra. Every loaf, every croissant, every cake is mixed, shaped, and baked by hand — usually by Akua, increasingly by a team of ten she trained from scratch.",
220
+ "We're proud to source over 90% of our ingredients within Ghana: flour from the Volta Region, butter from Tamale, hibiscus from local farmers we've worked with for years.",
221
+ ],
222
+ sections: [
223
+ {
224
+ heading: "What we believe",
225
+ body: "Slow over fast. 24-hour ferments, double proofs, cold lamination. Local first — Ghanaian wheat, Ghanaian dairy, Ghanaian hands. People over yield — every team member starts on the bench, learning the doughs by feel.",
226
+ },
227
+ {
228
+ heading: "Visit",
229
+ body: "12 Independence Ave, Accra · open Tuesday–Sunday, 8am–8pm. We close on Mondays so the team can rest and the ovens can rest.",
230
+ },
231
+ ],
232
+ },
233
+
234
+ faq: {
235
+ eyebrow: "Frequently asked",
236
+ title: "Questions, answered.",
237
+ sections: [
238
+ {
239
+ title: "Ordering & delivery",
240
+ items: [
241
+ {
242
+ q: "Where do you deliver?",
243
+ a: "Same-day delivery within Greater Accra for orders placed before 2pm. Outside Accra, we offer next-day shipping by partner courier — checkout will show the available options for your address.",
244
+ },
245
+ {
246
+ q: "Can I pick up my order?",
247
+ a: "Yes. Pickup is available 8am–8pm at our East Legon location, 12 Independence Avenue. Choose 'Pickup' at checkout and we'll have everything boxed and ready when you arrive.",
248
+ },
249
+ {
250
+ q: "How quickly will my order arrive?",
251
+ a: "Same-day delivery typically arrives within 2–4 hours of order confirmation. You'll get an SMS when the rider is en route.",
252
+ },
253
+ {
254
+ q: "Do you offer subscriptions?",
255
+ a: "Yes — our Weekly Loaf Subscription delivers a fresh loaf to your door every week. Pause or skip any time.",
256
+ },
257
+ ],
258
+ },
259
+ {
260
+ title: "Custom cakes & celebrations",
261
+ items: [
262
+ {
263
+ q: "How much notice do you need for a custom cake?",
264
+ a: "48 hours minimum for tier cakes; 7 days for elaborate designs with sugar work or fondant figures.",
265
+ },
266
+ {
267
+ q: "Can I bring my own design?",
268
+ a: "Absolutely — send us a reference image and we'll quote what's possible within your timeline and budget.",
269
+ },
270
+ {
271
+ q: "Do you do wedding cakes?",
272
+ a: "We do, with at least 6 weeks' notice. Tasting sessions are GH₵150 and credited toward your final order.",
273
+ },
274
+ ],
275
+ },
276
+ {
277
+ title: "Allergens & ingredients",
278
+ items: [
279
+ {
280
+ q: "Is your kitchen allergen-free?",
281
+ a: "No. Our kitchen handles wheat, dairy, eggs, and tree nuts. Cross-contamination is possible. Please let us know about severe allergies before ordering.",
282
+ },
283
+ {
284
+ q: "Do you have vegan options?",
285
+ a: "Yes. The country sourdough, whole-wheat seed loaf, baguette, and most of the breads are vegan.",
286
+ },
287
+ ],
288
+ },
289
+ {
290
+ title: "Payment & returns",
291
+ items: [
292
+ {
293
+ q: "What payment methods do you accept?",
294
+ a: "Mobile Money (MTN, Telecel, AirtelTigo), Visa/Mastercard, and cash on delivery for Accra-based orders.",
295
+ },
296
+ {
297
+ q: "What's your return policy?",
298
+ a: "We don't accept returns on baked goods for food-safety reasons, but if anything is wrong with your order — quality, accuracy, or freshness — message us within 24 hours and we'll make it right or refund you.",
299
+ },
300
+ ],
301
+ },
302
+ ],
303
+ contactPrompt: "Still stuck? Email",
304
+ contactEmail: "hello@akuasbakery.test",
305
+ },
306
+
307
+ terms: {
308
+ eyebrow: "Terms of service",
309
+ title: "Terms of Service",
310
+ lastUpdated: "1 May 2026",
311
+ sections: [
312
+ {
313
+ heading: "1. Who we are",
314
+ body: "Akua's Bakery (\"we\", \"us\") is a bakery and pâtisserie operating at 12 Independence Avenue, Accra, Ghana. By placing an order through this website, you (\"you\", \"customer\") agree to these terms.",
315
+ },
316
+ {
317
+ heading: "2. Orders and acceptance",
318
+ body: "Placing an order constitutes an offer to buy. We confirm acceptance by sending an order confirmation email or SMS. Until acceptance, we may decline an order — we'll refund any payment in full, immediately.",
319
+ },
320
+ {
321
+ heading: "3. Pricing and payment",
322
+ body: "Prices are in Ghana Cedis (GH₵) and include VAT where applicable. Payment is due at checkout via Mobile Money, card, or cash on delivery. We reserve the right to correct typographical pricing errors before fulfilment.",
323
+ },
324
+ {
325
+ heading: "4. Delivery and pickup",
326
+ body: "Delivery times are estimates, not guarantees. We're not liable for delays caused by weather, traffic, or events outside our control. If a rider can't reach you within 30 minutes of arrival, the order may be returned to the kitchen — please make sure your address and phone are correct.",
327
+ },
328
+ {
329
+ heading: "5. Custom cakes",
330
+ body: "Custom cake orders require a 50% deposit at booking and the balance before pickup or dispatch. Cancellations more than 72 hours before the event date receive a full refund of the deposit; within 72 hours, the deposit is non-refundable.",
331
+ },
332
+ {
333
+ heading: "6. Allergens",
334
+ body: "Our kitchen handles wheat, dairy, eggs, and tree nuts. We can't guarantee freedom from cross-contamination. Customers with severe allergies order at their own risk.",
335
+ },
336
+ {
337
+ heading: "7. Returns",
338
+ body: "Baked goods are non-returnable for food-safety reasons. If something is wrong with your order, contact us within 24 hours of delivery and we'll replace it, refund it, or credit your account — your choice.",
339
+ },
340
+ {
341
+ heading: "8. Liability",
342
+ body: "To the maximum extent permitted by Ghanaian law, our liability for any claim arising from this website or your order is limited to the value of the order. We're not liable for indirect or consequential losses.",
343
+ },
344
+ {
345
+ heading: "9. Governing law",
346
+ body: "These terms are governed by the laws of Ghana. Disputes will be resolved in the courts of Greater Accra.",
347
+ },
348
+ {
349
+ heading: "10. Contact",
350
+ body: "Questions? Email hello@akuasbakery.test.",
351
+ },
352
+ ],
353
+ },
354
+
355
+ privacy: {
356
+ eyebrow: "Privacy",
357
+ title: "Privacy Policy",
358
+ lastUpdated: "1 May 2026",
359
+ sections: [
360
+ {
361
+ heading: "What we collect",
362
+ body: "We collect only what we need to fulfil your order: your name, phone, delivery address, email, and the items in your order. Payment details are processed by our payment partners (Paystack, Stripe) and never stored on our servers.",
363
+ },
364
+ {
365
+ heading: "How we use it",
366
+ body: {
367
+ intro: "We use your data to:",
368
+ bullets: [
369
+ "Prepare, deliver, and confirm your order.",
370
+ "Send order updates by SMS and email.",
371
+ "Send occasional product news — only if you opted in. Unsubscribe anytime in one click.",
372
+ "Analyse aggregated, anonymised browsing patterns so we can improve the site.",
373
+ ],
374
+ },
375
+ },
376
+ {
377
+ heading: "Who we share it with",
378
+ body: "We share data only with the partners required to fulfil your order: payment processors (Paystack, Stripe), delivery riders, and our email/SMS providers. We do not sell or rent personal data to third parties — ever.",
379
+ },
380
+ {
381
+ heading: "Cookies",
382
+ body: "We use a small number of strictly-necessary cookies to keep your cart working and your session signed in. We don't use third-party advertising or tracking cookies.",
383
+ },
384
+ {
385
+ heading: "Your rights",
386
+ body: "Under the Ghana Data Protection Act, 2012 (Act 843), you have the right to access the data we hold about you, correct it, or have it deleted. Email privacy@akuasbakery.test and we'll respond within 14 days.",
387
+ },
388
+ {
389
+ heading: "Retention",
390
+ body: "We keep order records for 7 years to comply with Ghanaian tax law. Marketing-list opt-ins are kept until you unsubscribe.",
391
+ },
392
+ {
393
+ heading: "Changes",
394
+ body: "If we make material changes to this policy, we'll email customers on our marketing list and update the \"last updated\" date above.",
395
+ },
396
+ ],
397
+ },
398
+
399
+ footer: {
400
+ blurb:
401
+ "Family-run bakery in East Legon. Sourdough, croissants, layered cakes — handcrafted since 2018, delivered across Accra.",
402
+ sitemap: [
403
+ {
404
+ title: "Shop",
405
+ links: [
406
+ { label: "All products", href: "/shop" },
407
+ { label: "Breads", href: "/categories/breads" },
408
+ { label: "Pastries", href: "/categories/pastries" },
409
+ { label: "Cakes", href: "/categories/cakes" },
410
+ { label: "Drinks", href: "/categories/drinks" },
411
+ { label: "Merch & More", href: "/categories/merch" },
412
+ { label: "Classes & Stays", href: "/categories/classes" },
413
+ ],
414
+ },
415
+ {
416
+ title: "Bakery",
417
+ links: [
418
+ { label: "Our story", href: "/about" },
419
+ { label: "FAQ", href: "/faq" },
420
+ { label: "Visit us", href: "/about" },
421
+ { label: "Wholesale", href: "/categories/merch" },
422
+ ],
423
+ },
424
+ {
425
+ title: "Help",
426
+ links: [
427
+ { label: "Contact", href: "mailto:hello@akuasbakery.test" },
428
+ { label: "Custom cakes", href: "/faq" },
429
+ { label: "Allergens", href: "/faq" },
430
+ { label: "Delivery", href: "/faq" },
431
+ ],
432
+ },
433
+ {
434
+ title: "Legal",
435
+ links: [
436
+ { label: "Terms of Service", href: "/terms" },
437
+ { label: "Privacy Policy", href: "/privacy" },
438
+ ],
439
+ },
440
+ ],
441
+ poweredBy: { label: "Cimplify", href: "https://app.cimplify.io" },
442
+ },
443
+
444
+ llms: {
445
+ summary:
446
+ "Family-run bakery in East Legon, Accra. Sourdough, croissants, cakes, and more — handcrafted since 2018. Same-day delivery across Greater Accra; pickup at 12 Independence Ave.",
447
+ },
448
+
449
+ mock: {
450
+ seed: "default",
451
+ businessId: "bus_default_akua_bakery",
452
+ },
453
+ };
@@ -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 (retail: Currents Electronics).
11
+ NEXT_PUBLIC_CIMPLIFY_BUSINESS_ID=bus_currents_electronics
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,52 @@
1
+ # AGENTS.md — Fashion / streetwear 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 reads from this file.
8
+ 2. **Edit `app/globals.css`** — the `@theme { … }` block holds the design tokens (palette, radius, font references). High-contrast neutrals + electric primary by default.
9
+ 3. **Edit `.env.local`** — `NEXT_PUBLIC_CIMPLIFY_API_URL`, `NEXT_PUBLIC_CIMPLIFY_PUBLIC_KEY`, `NEXT_PUBLIC_CIMPLIFY_BUSINESS_ID`, `NEXT_PUBLIC_SITE_URL`.
10
+
11
+ ## Aesthetic
12
+
13
+ This template is built for streetwear / capsule fashion / lookbook-led brands (Nike, Aritzia, Highsnobiety, drop culture). Key design moves:
14
+
15
+ - **Anton display typography** for hero + section titles (uppercase, condensed, heavy).
16
+ - **Inter** for body and UI.
17
+ - **High-contrast palette**: near-black foreground on near-white background, with one electric primary (default: `oklch(0.7 0.24 30)` — coral-orange).
18
+ - **Sharp corners**: `--radius: 0.125rem` — minimal rounding, near-square inputs and buttons.
19
+ - **Editorial full-bleed hero** with image gradient overlay (see `components/feature-hero.tsx`).
20
+ - **Block-letter header** — no logo mark, just the shortName in display type with a microTag.
21
+
22
+ ## Industry-specific copy patterns
23
+
24
+ The bundled brand presets:
25
+ - `brand.hero.badge` is a "drop counter" (e.g. `"Drop 04 · Live now"`).
26
+ - `brand.tradeIn` is repurposed as a "Studio collective" / membership programme.
27
+ - `brand.brandStrip.headline` is `"Stocked at"` with editorial publication wordmarks (Vogue, Highsnobiety, etc.).
28
+ - `brand.faq` covers sizing, drops/restocks, returns, customs.
29
+
30
+ Replace these freely. The components render conditionally — set any optional block to `undefined` to hide it.
31
+
32
+ ## Rules
33
+
34
+ - ✅ All content edits → `lib/brand.ts`
35
+ - ✅ All design-token edits → `app/globals.css` `@theme` block
36
+ - ✅ Server Components stay cached via `'use cache'` + `cacheTag(tags.X())` + `cacheLife("hours")`
37
+ - ✅ Client islands behind `<Suspense>`
38
+ - ❌ Don't hardcode strings.
39
+ - ❌ Don't disable `cacheComponents: true`.
40
+
41
+ ## Mock seed
42
+
43
+ Wired to `--seed retail` (Currents Electronics catalogue). Replace with apparel data in production. To preview a different seed, edit `dev:mock` in `package.json`.
44
+
45
+ ## Quick start
46
+
47
+ ```bash
48
+ bun install
49
+ bun dev
50
+ ```
51
+
52
+ Open <http://localhost:3000>.
@@ -0,0 +1,77 @@
1
+ # __STOREFRONT_NAME__
2
+
3
+ A Cimplify storefront scaffolded from the **retail** template — Next.js 16 (App Router), React 19, Tailwind v4. Cool navy + electric blue palette, Inter + JetBrains Mono typography, modern electronics-store aesthetic.
4
+
5
+ ## Run
6
+
7
+ ```bash
8
+ bun install
9
+ bun dev
10
+ ```
11
+
12
+ Two things start in parallel:
13
+
14
+ - `bunx @cimplify/sdk --seed retail` — the Cimplify mock API on `http://127.0.0.1:8787`, seeded with Currents Electronics.
15
+ - `next dev` — this storefront on `http://localhost:3000`.
16
+
17
+ Open the storefront in your browser. Edit `app/page.tsx` to start customising.
18
+
19
+ ## Structure
20
+
21
+ ```
22
+ app/
23
+ layout.tsx # root layout, fonts, providers, header/footer/modal
24
+ page.tsx # home
25
+ shop/page.tsx # full catalogue (SDK <CataloguePage/>)
26
+ collections/[slug]/ # collection landing
27
+ categories/[slug]/ # category landing
28
+ cart/page.tsx # SDK <CartPage/>
29
+ checkout/page.tsx # SDK <CheckoutPage/>
30
+ orders/[id]/page.tsx # post-checkout thank-you
31
+ about, faq, terms, privacy
32
+ globals.css # Tailwind import + theme tokens
33
+ components/
34
+ providers.tsx # CimplifyProvider client wrapper
35
+ header.tsx, footer.tsx, hero.tsx
36
+ store-product-card.tsx # SDK <ProductCard/> wired to URL-driven modal
37
+ product-modal.tsx # ?product=<slug> deep-linkable modal
38
+ collection-strip.tsx # horizontal product strip
39
+ category-grid.tsx # SDK <CategoryGrid/> with router navigation
40
+ lib/
41
+ cart.ts # useCartCount() for the header pill
42
+ ```
43
+
44
+ ## Switch the seed
45
+
46
+ This template is wired to the `retail` seed. To preview a different industry without re-scaffolding:
47
+
48
+ ```bash
49
+ bunx @cimplify/sdk --seed restaurant # Mama's Kitchen
50
+ bunx @cimplify/sdk --seed services # Serene Spa
51
+ bunx @cimplify/sdk --seed grocery # FreshMart
52
+ ```
53
+
54
+ Update `NEXT_PUBLIC_CIMPLIFY_BUSINESS_ID` in `.env.local` to match the seeded business.
55
+
56
+ For a fresh scaffold with another design altogether:
57
+
58
+ ```bash
59
+ bunx @cimplify/sdk init my-store --template bakery # warm food/pastry
60
+ bunx @cimplify/sdk init my-store --template restaurant # coming soon
61
+ bunx @cimplify/sdk init my-store --template services # coming soon
62
+ bunx @cimplify/sdk init my-store --template grocery # coming soon
63
+ ```
64
+
65
+ ## Go live
66
+
67
+ ```diff
68
+ # .env.local
69
+ - NEXT_PUBLIC_CIMPLIFY_API_URL=http://127.0.0.1:8787
70
+ + NEXT_PUBLIC_CIMPLIFY_API_URL=https://api.cimplify.io
71
+ - NEXT_PUBLIC_CIMPLIFY_PUBLIC_KEY=mock-dev
72
+ + NEXT_PUBLIC_CIMPLIFY_PUBLIC_KEY=<your tenant key>
73
+ - NEXT_PUBLIC_CIMPLIFY_BUSINESS_ID=bus_currents_electronics
74
+ + NEXT_PUBLIC_CIMPLIFY_BUSINESS_ID=<your business id>
75
+ ```
76
+
77
+ Deploy to Vercel with one click — `next.config.ts` already whitelists the SDK image hosts under `images.remotePatterns`.
@@ -0,0 +1,41 @@
1
+ import type { Metadata } from "next";
2
+ import { brand } from "@/lib/brand";
3
+
4
+ export const metadata: Metadata = {
5
+ title: `About — ${brand.name}`,
6
+ description: brand.description,
7
+ };
8
+
9
+ export default function AboutPage() {
10
+ const a = brand.about;
11
+ // Title supports a single \n for a hard line break.
12
+ const titleParts = a.title.split("\n");
13
+ return (
14
+ <article className="max-w-3xl mx-auto px-8 py-16">
15
+ <p className="text-[11px] font-mono uppercase tracking-[0.16em] text-primary mb-2">
16
+ {a.eyebrow}
17
+ </p>
18
+ <h1 className="text-[clamp(2.25rem,5vw,3.5rem)] font-bold mb-6 -tracking-[0.025em] leading-tight">
19
+ {titleParts.map((line, i) => (
20
+ <span key={i}>
21
+ {line}
22
+ {i < titleParts.length - 1 && <br />}
23
+ </span>
24
+ ))}
25
+ </h1>
26
+ <div className="prose prose-lg max-w-none space-y-5 text-foreground/90 leading-relaxed">
27
+ {a.paragraphs.map((p, i) => (
28
+ <p key={i}>{p}</p>
29
+ ))}
30
+ {a.sections.map((s) => (
31
+ <div key={s.heading}>
32
+ <h2 className="text-2xl font-semibold mt-10 mb-3 -tracking-[0.02em]">
33
+ {s.heading}
34
+ </h2>
35
+ <p>{s.body}</p>
36
+ </div>
37
+ ))}
38
+ </div>
39
+ </article>
40
+ );
41
+ }
@@ -0,0 +1,9 @@
1
+ "use client";
2
+
3
+ import { useRouter } from "next/navigation";
4
+ import { CartPage as SdkCartPage } from "@cimplify/sdk/react";
5
+
6
+ export default function CartPage() {
7
+ const router = useRouter();
8
+ return <SdkCartPage onCheckout={() => router.push("/checkout")} />;
9
+ }
@@ -0,0 +1,19 @@
1
+ "use client";
2
+
3
+ import { ProductGrid } from "@cimplify/sdk/react";
4
+ import type { Product } from "@cimplify/sdk";
5
+ import { StoreProductCard } from "@/components/store-product-card";
6
+
7
+ /**
8
+ * Client island for the category listing. Receives server-fetched products
9
+ * as props (serializable) and owns the `renderCard` function.
10
+ */
11
+ export function ListingClient({ products }: { products: Product[] }) {
12
+ return (
13
+ <ProductGrid
14
+ products={products}
15
+ emptyMessage="No products in this category yet."
16
+ renderCard={(p) => <StoreProductCard product={p} />}
17
+ />
18
+ );
19
+ }