@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.
- package/dist/dispatcher.mjs +3 -2
- package/dist/mock/cli.mjs +30 -6
- package/dist/mock/library.js +30 -6
- package/dist/mock/library.mjs +30 -6
- package/dist/mock/msw.js +30 -6
- package/dist/mock/msw.mjs +30 -6
- package/dist/styles.css +1 -1
- package/package.json +1 -1
- package/templates/storefront-bakery/.env.example +5 -0
- package/templates/storefront-bakery/AGENTS.md +57 -0
- package/templates/storefront-bakery/app/about/page.tsx +21 -44
- package/templates/storefront-bakery/app/categories/[slug]/page.tsx +2 -1
- package/templates/storefront-bakery/app/collections/[slug]/page.tsx +2 -1
- package/templates/storefront-bakery/app/error.tsx +60 -0
- package/templates/storefront-bakery/app/faq/page.tsx +13 -89
- package/templates/storefront-bakery/app/layout.tsx +37 -2
- package/templates/storefront-bakery/app/llms.txt/route.ts +94 -0
- package/templates/storefront-bakery/app/not-found.tsx +39 -0
- package/templates/storefront-bakery/app/page.tsx +6 -6
- package/templates/storefront-bakery/app/privacy/page.tsx +24 -68
- package/templates/storefront-bakery/app/robots.ts +18 -0
- package/templates/storefront-bakery/app/shop/page.tsx +3 -2
- package/templates/storefront-bakery/app/sitemap.ts +62 -0
- package/templates/storefront-bakery/app/terms/page.tsx +24 -82
- package/templates/storefront-bakery/components/footer.tsx +88 -130
- package/templates/storefront-bakery/components/header.tsx +8 -16
- package/templates/storefront-bakery/lib/brand.ts +453 -0
- package/templates/storefront-fashion/.env.example +16 -0
- package/templates/storefront-fashion/AGENTS.md +52 -0
- package/templates/storefront-fashion/README.md +77 -0
- package/templates/storefront-fashion/app/about/page.tsx +41 -0
- package/templates/storefront-fashion/app/cart/page.tsx +9 -0
- package/templates/storefront-fashion/app/categories/[slug]/listing-client.tsx +19 -0
- package/templates/storefront-fashion/app/categories/[slug]/page.tsx +130 -0
- package/templates/storefront-fashion/app/checkout/page.tsx +17 -0
- package/templates/storefront-fashion/app/collections/[slug]/listing-client.tsx +20 -0
- package/templates/storefront-fashion/app/collections/[slug]/page.tsx +130 -0
- package/templates/storefront-fashion/app/error.tsx +61 -0
- package/templates/storefront-fashion/app/faq/page.tsx +46 -0
- package/templates/storefront-fashion/app/globals.css +46 -0
- package/templates/storefront-fashion/app/layout.tsx +76 -0
- package/templates/storefront-fashion/app/llms.txt/route.ts +94 -0
- package/templates/storefront-fashion/app/not-found.tsx +39 -0
- package/templates/storefront-fashion/app/orders/[id]/page.tsx +24 -0
- package/templates/storefront-fashion/app/page.tsx +183 -0
- package/templates/storefront-fashion/app/privacy/page.tsx +44 -0
- package/templates/storefront-fashion/app/products/[slug]/page.tsx +165 -0
- package/templates/storefront-fashion/app/products/[slug]/product-detail.tsx +71 -0
- package/templates/storefront-fashion/app/robots.ts +18 -0
- package/templates/storefront-fashion/app/shop/page.tsx +63 -0
- package/templates/storefront-fashion/app/shop/shop-client.tsx +32 -0
- package/templates/storefront-fashion/app/sitemap.ts +59 -0
- package/templates/storefront-fashion/app/terms/page.tsx +44 -0
- package/templates/storefront-fashion/components/brand-marquee.tsx +27 -0
- package/templates/storefront-fashion/components/cart-pill.tsx +32 -0
- package/templates/storefront-fashion/components/category-grid.tsx +28 -0
- package/templates/storefront-fashion/components/category-tiles.tsx +104 -0
- package/templates/storefront-fashion/components/collection-strip.tsx +45 -0
- package/templates/storefront-fashion/components/feature-hero.tsx +82 -0
- package/templates/storefront-fashion/components/footer.tsx +153 -0
- package/templates/storefront-fashion/components/header.tsx +43 -0
- package/templates/storefront-fashion/components/hero.tsx +28 -0
- package/templates/storefront-fashion/components/nav-link.tsx +20 -0
- package/templates/storefront-fashion/components/newsletter.tsx +50 -0
- package/templates/storefront-fashion/components/promo-banner.tsx +41 -0
- package/templates/storefront-fashion/components/providers.tsx +31 -0
- package/templates/storefront-fashion/components/section-heading.tsx +37 -0
- package/templates/storefront-fashion/components/store-product-card.tsx +83 -0
- package/templates/storefront-fashion/components/trade-in-cta.tsx +54 -0
- package/templates/storefront-fashion/components/trust-bar.tsx +66 -0
- package/templates/storefront-fashion/lib/brand.ts +421 -0
- package/templates/storefront-fashion/lib/cart.ts +27 -0
- package/templates/storefront-fashion/next.config.ts +40 -0
- package/templates/storefront-fashion/package.json +28 -0
- package/templates/storefront-fashion/postcss.config.mjs +7 -0
- package/templates/storefront-fashion/tsconfig.json +23 -0
- package/templates/storefront-grocery/.env.example +16 -0
- package/templates/storefront-grocery/AGENTS.md +39 -0
- package/templates/storefront-grocery/README.md +73 -0
- package/templates/storefront-grocery/app/about/page.tsx +38 -0
- package/templates/storefront-grocery/app/cart/page.tsx +9 -0
- package/templates/storefront-grocery/app/categories/[slug]/listing-client.tsx +19 -0
- package/templates/storefront-grocery/app/categories/[slug]/page.tsx +118 -0
- package/templates/storefront-grocery/app/checkout/page.tsx +17 -0
- package/templates/storefront-grocery/app/collections/[slug]/listing-client.tsx +20 -0
- package/templates/storefront-grocery/app/collections/[slug]/page.tsx +118 -0
- package/templates/storefront-grocery/app/error.tsx +60 -0
- package/templates/storefront-grocery/app/faq/page.tsx +46 -0
- package/templates/storefront-grocery/app/globals.css +45 -0
- package/templates/storefront-grocery/app/layout.tsx +75 -0
- package/templates/storefront-grocery/app/llms.txt/route.ts +94 -0
- package/templates/storefront-grocery/app/not-found.tsx +39 -0
- package/templates/storefront-grocery/app/orders/[id]/page.tsx +21 -0
- package/templates/storefront-grocery/app/page.tsx +97 -0
- package/templates/storefront-grocery/app/privacy/page.tsx +44 -0
- package/templates/storefront-grocery/app/robots.ts +18 -0
- package/templates/storefront-grocery/app/shop/page.tsx +31 -0
- package/templates/storefront-grocery/app/shop/shop-client.tsx +27 -0
- package/templates/storefront-grocery/app/sitemap.ts +62 -0
- package/templates/storefront-grocery/app/terms/page.tsx +44 -0
- package/templates/storefront-grocery/components/cart-pill.tsx +32 -0
- package/templates/storefront-grocery/components/category-grid.tsx +28 -0
- package/templates/storefront-grocery/components/collection-strip.tsx +45 -0
- package/templates/storefront-grocery/components/footer.tsx +148 -0
- package/templates/storefront-grocery/components/header.tsx +43 -0
- package/templates/storefront-grocery/components/hero.tsx +25 -0
- package/templates/storefront-grocery/components/nav-link.tsx +20 -0
- package/templates/storefront-grocery/components/providers.tsx +31 -0
- package/templates/storefront-grocery/components/store-product-card.tsx +83 -0
- package/templates/storefront-grocery/lib/brand.ts +284 -0
- package/templates/storefront-grocery/lib/cart.ts +27 -0
- package/templates/storefront-grocery/next.config.ts +40 -0
- package/templates/storefront-grocery/package.json +28 -0
- package/templates/storefront-grocery/postcss.config.mjs +7 -0
- package/templates/storefront-grocery/tsconfig.json +23 -0
- package/templates/storefront-restaurant/.env.example +16 -0
- package/templates/storefront-restaurant/AGENTS.md +39 -0
- package/templates/storefront-restaurant/README.md +73 -0
- package/templates/storefront-restaurant/app/about/page.tsx +38 -0
- package/templates/storefront-restaurant/app/cart/page.tsx +9 -0
- package/templates/storefront-restaurant/app/categories/[slug]/listing-client.tsx +19 -0
- package/templates/storefront-restaurant/app/categories/[slug]/page.tsx +118 -0
- package/templates/storefront-restaurant/app/checkout/page.tsx +17 -0
- package/templates/storefront-restaurant/app/collections/[slug]/listing-client.tsx +20 -0
- package/templates/storefront-restaurant/app/collections/[slug]/page.tsx +118 -0
- package/templates/storefront-restaurant/app/error.tsx +60 -0
- package/templates/storefront-restaurant/app/faq/page.tsx +46 -0
- package/templates/storefront-restaurant/app/globals.css +44 -0
- package/templates/storefront-restaurant/app/layout.tsx +80 -0
- package/templates/storefront-restaurant/app/llms.txt/route.ts +94 -0
- package/templates/storefront-restaurant/app/not-found.tsx +39 -0
- package/templates/storefront-restaurant/app/orders/[id]/page.tsx +21 -0
- package/templates/storefront-restaurant/app/page.tsx +97 -0
- package/templates/storefront-restaurant/app/privacy/page.tsx +44 -0
- package/templates/storefront-restaurant/app/robots.ts +18 -0
- package/templates/storefront-restaurant/app/shop/page.tsx +31 -0
- package/templates/storefront-restaurant/app/shop/shop-client.tsx +27 -0
- package/templates/storefront-restaurant/app/sitemap.ts +62 -0
- package/templates/storefront-restaurant/app/terms/page.tsx +44 -0
- package/templates/storefront-restaurant/components/cart-pill.tsx +32 -0
- package/templates/storefront-restaurant/components/category-grid.tsx +28 -0
- package/templates/storefront-restaurant/components/collection-strip.tsx +45 -0
- package/templates/storefront-restaurant/components/footer.tsx +148 -0
- package/templates/storefront-restaurant/components/header.tsx +43 -0
- package/templates/storefront-restaurant/components/hero.tsx +25 -0
- package/templates/storefront-restaurant/components/nav-link.tsx +20 -0
- package/templates/storefront-restaurant/components/product-modal.tsx +105 -0
- package/templates/storefront-restaurant/components/providers.tsx +31 -0
- package/templates/storefront-restaurant/components/store-product-card.tsx +83 -0
- package/templates/storefront-restaurant/lib/brand.ts +287 -0
- package/templates/storefront-restaurant/lib/cart.ts +27 -0
- package/templates/storefront-restaurant/next.config.ts +40 -0
- package/templates/storefront-restaurant/package.json +28 -0
- package/templates/storefront-restaurant/postcss.config.mjs +7 -0
- package/templates/storefront-restaurant/tsconfig.json +23 -0
- package/templates/storefront-retail/.env.example +5 -0
- package/templates/storefront-retail/AGENTS.md +64 -0
- package/templates/storefront-retail/app/about/page.tsx +24 -54
- package/templates/storefront-retail/app/categories/[slug]/page.tsx +50 -37
- package/templates/storefront-retail/app/collections/[slug]/page.tsx +50 -37
- package/templates/storefront-retail/app/error.tsx +61 -0
- package/templates/storefront-retail/app/faq/page.tsx +11 -92
- package/templates/storefront-retail/app/layout.tsx +37 -8
- package/templates/storefront-retail/app/llms.txt/route.ts +94 -0
- package/templates/storefront-retail/app/not-found.tsx +39 -0
- package/templates/storefront-retail/app/page.tsx +111 -26
- package/templates/storefront-retail/app/privacy/page.tsx +24 -81
- package/templates/storefront-retail/app/products/[slug]/page.tsx +165 -0
- package/templates/storefront-retail/app/products/[slug]/product-detail.tsx +71 -0
- package/templates/storefront-retail/app/robots.ts +18 -0
- package/templates/storefront-retail/app/shop/page.tsx +36 -3
- package/templates/storefront-retail/app/shop/shop-client.tsx +6 -1
- package/templates/storefront-retail/app/sitemap.ts +59 -0
- package/templates/storefront-retail/app/terms/page.tsx +24 -97
- package/templates/storefront-retail/components/brand-marquee.tsx +27 -0
- package/templates/storefront-retail/components/category-tiles.tsx +104 -0
- package/templates/storefront-retail/components/feature-hero.tsx +84 -0
- package/templates/storefront-retail/components/footer.tsx +85 -120
- package/templates/storefront-retail/components/header.tsx +10 -12
- package/templates/storefront-retail/components/newsletter.tsx +50 -0
- package/templates/storefront-retail/components/promo-banner.tsx +41 -0
- package/templates/storefront-retail/components/section-heading.tsx +37 -0
- package/templates/storefront-retail/components/store-product-card.tsx +7 -7
- package/templates/storefront-retail/components/trade-in-cta.tsx +54 -0
- package/templates/storefront-retail/components/trust-bar.tsx +66 -0
- package/templates/storefront-retail/lib/brand.ts +567 -0
- package/templates/storefront-services/.env.example +16 -0
- package/templates/storefront-services/AGENTS.md +41 -0
- package/templates/storefront-services/README.md +73 -0
- package/templates/storefront-services/app/about/page.tsx +38 -0
- package/templates/storefront-services/app/cart/page.tsx +9 -0
- package/templates/storefront-services/app/categories/[slug]/listing-client.tsx +19 -0
- package/templates/storefront-services/app/categories/[slug]/page.tsx +118 -0
- package/templates/storefront-services/app/checkout/page.tsx +17 -0
- package/templates/storefront-services/app/collections/[slug]/listing-client.tsx +20 -0
- package/templates/storefront-services/app/collections/[slug]/page.tsx +118 -0
- package/templates/storefront-services/app/error.tsx +60 -0
- package/templates/storefront-services/app/faq/page.tsx +46 -0
- package/templates/storefront-services/app/globals.css +45 -0
- package/templates/storefront-services/app/layout.tsx +80 -0
- package/templates/storefront-services/app/llms.txt/route.ts +94 -0
- package/templates/storefront-services/app/not-found.tsx +39 -0
- package/templates/storefront-services/app/orders/[id]/page.tsx +21 -0
- package/templates/storefront-services/app/page.tsx +97 -0
- package/templates/storefront-services/app/privacy/page.tsx +44 -0
- package/templates/storefront-services/app/robots.ts +18 -0
- package/templates/storefront-services/app/shop/page.tsx +31 -0
- package/templates/storefront-services/app/shop/shop-client.tsx +27 -0
- package/templates/storefront-services/app/sitemap.ts +62 -0
- package/templates/storefront-services/app/terms/page.tsx +44 -0
- package/templates/storefront-services/components/cart-pill.tsx +32 -0
- package/templates/storefront-services/components/category-grid.tsx +28 -0
- package/templates/storefront-services/components/collection-strip.tsx +45 -0
- package/templates/storefront-services/components/footer.tsx +148 -0
- package/templates/storefront-services/components/header.tsx +43 -0
- package/templates/storefront-services/components/hero.tsx +25 -0
- package/templates/storefront-services/components/nav-link.tsx +20 -0
- package/templates/storefront-services/components/product-modal.tsx +105 -0
- package/templates/storefront-services/components/providers.tsx +31 -0
- package/templates/storefront-services/components/store-product-card.tsx +83 -0
- package/templates/storefront-services/lib/brand.ts +303 -0
- package/templates/storefront-services/lib/cart.ts +27 -0
- package/templates/storefront-services/next.config.ts +40 -0
- package/templates/storefront-services/package.json +28 -0
- package/templates/storefront-services/postcss.config.mjs +7 -0
- package/templates/storefront-services/tsconfig.json +23 -0
- /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
|
+
}
|