@cimplify/sdk 0.40.1 → 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/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 +2 -1
- package/templates/storefront-retail/app/collections/[slug]/page.tsx +2 -1
- 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 +16 -73
- 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 +3 -3
- 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 +6 -15
- package/templates/storefront-retail/components/feature-hero.tsx +2 -1
- 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 +7 -9
- package/templates/storefront-retail/components/promo-banner.tsx +12 -15
- package/templates/storefront-retail/components/store-product-card.tsx +7 -7
- package/templates/storefront-retail/components/trade-in-cta.tsx +11 -17
- package/templates/storefront-retail/components/trust-bar.tsx +45 -5
- 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,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,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`.
|