@cimplify/sdk 0.42.0 → 0.42.1
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/package.json +1 -1
- package/templates/storefront-bakery/AGENTS.md +61 -10
- package/templates/storefront-fashion/AGENTS.md +80 -26
- package/templates/storefront-grocery/AGENTS.md +56 -11
- package/templates/storefront-restaurant/AGENTS.md +64 -13
- package/templates/storefront-retail/AGENTS.md +65 -24
- package/templates/storefront-services/AGENTS.md +64 -16
package/package.json
CHANGED
|
@@ -6,8 +6,8 @@ If you are an AI agent (Claude, Cursor, Aider, devin, …) working on this store
|
|
|
6
6
|
|
|
7
7
|
To rebrand this storefront end-to-end as a different merchant:
|
|
8
8
|
|
|
9
|
-
1. **Edit `lib/brand.ts`.** Every visible string reads from this file.
|
|
10
|
-
2. **Edit `app/globals.css`** — the `@theme { … }` block holds the design tokens (palette, radius, font references).
|
|
9
|
+
1. **Edit `lib/brand.ts`.** Every visible string reads from this file.
|
|
10
|
+
2. **Edit `app/globals.css`** — the `@theme { … }` block holds the design tokens (palette, radius, font references).
|
|
11
11
|
3. **Edit `.env.local`** — set `NEXT_PUBLIC_CIMPLIFY_API_URL`, `NEXT_PUBLIC_CIMPLIFY_PUBLIC_KEY`, `NEXT_PUBLIC_CIMPLIFY_BUSINESS_ID`, `NEXT_PUBLIC_SITE_URL`.
|
|
12
12
|
|
|
13
13
|
That is the entire rebrand. Do not modify any `.tsx` file in `app/` or `components/` for content changes — they are design-only and read from `brand`.
|
|
@@ -22,30 +22,81 @@ That is the entire rebrand. Do not modify any `.tsx` file in `app/` or `componen
|
|
|
22
22
|
- ❌ Don't disable `cacheComponents: true` in `next.config.ts`.
|
|
23
23
|
- ❌ Don't use `unstable_cache` — Next 16 uses the `'use cache'` directive.
|
|
24
24
|
|
|
25
|
-
##
|
|
25
|
+
## Page surface
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
app/
|
|
29
|
+
page.tsx Home — hero, collection strips, category grid
|
|
30
|
+
shop/page.tsx Full catalogue (SDK <CataloguePage/>)
|
|
31
|
+
search/page.tsx Search (SDK <SearchPage/>)
|
|
32
|
+
collections/[slug]/page.tsx Collection landing
|
|
33
|
+
categories/[slug]/page.tsx Category landing
|
|
34
|
+
|
|
35
|
+
cart/page.tsx SDK <CartPage/>
|
|
36
|
+
checkout/page.tsx SDK <CheckoutPage/>
|
|
37
|
+
orders/[id]/page.tsx Post-checkout confirmation (also target of /track-order)
|
|
38
|
+
|
|
39
|
+
account/page.tsx <CimplifyAccount /> (iframe — handles sign-in, dashboard)
|
|
40
|
+
account/orders/page.tsx <CimplifyAccount section="orders" />
|
|
41
|
+
account/addresses/page.tsx <CimplifyAccount section="addresses" />
|
|
42
|
+
account/settings/page.tsx <CimplifyAccount section="settings" />
|
|
43
|
+
login/page.tsx redirect → /account (iframe owns sign-in UI)
|
|
44
|
+
signup/page.tsx redirect → /account (iframe owns sign-up UI)
|
|
45
|
+
|
|
46
|
+
contact/page.tsx Contact form (Server Action wiring TODO; currently fakes submit)
|
|
47
|
+
track-order/page.tsx Guest order lookup → /orders/[id]
|
|
48
|
+
|
|
49
|
+
about/page.tsx Brand story
|
|
50
|
+
faq/page.tsx FAQ
|
|
51
|
+
shipping/page.tsx Standalone shipping policy
|
|
52
|
+
returns/page.tsx Standalone returns policy
|
|
53
|
+
accessibility/page.tsx Accessibility statement (WCAG 2.1 AA)
|
|
54
|
+
terms/page.tsx Terms of Service
|
|
55
|
+
privacy/page.tsx Privacy Policy
|
|
56
|
+
|
|
57
|
+
sitemap-page/page.tsx Human-readable HTML sitemap
|
|
58
|
+
sitemap.ts XML sitemap (search engines)
|
|
59
|
+
robots.ts robots.txt
|
|
60
|
+
llms.txt/route.ts LLM-friendly Markdown index
|
|
61
|
+
opensearch.xml/route.ts Browser address-bar search description
|
|
62
|
+
error.tsx, not-found.tsx Global boundaries
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## File ↔ brand-field map
|
|
26
66
|
|
|
27
67
|
| File | Reads from `brand` |
|
|
28
68
|
|---|---|
|
|
29
|
-
| `app/layout.tsx` |
|
|
69
|
+
| `app/layout.tsx` | identity, contact, socials, schemaType (Organization JSON-LD), `metadataBase` |
|
|
30
70
|
| `app/page.tsx` | `brand.hero` (Hero badge / title / subtitle) |
|
|
31
71
|
| `app/about/page.tsx` | `brand.about` |
|
|
32
72
|
| `app/faq/page.tsx` | `brand.faq` |
|
|
33
73
|
| `app/terms/page.tsx` | `brand.terms` |
|
|
34
74
|
| `app/privacy/page.tsx` | `brand.privacy` |
|
|
75
|
+
| `app/shipping/page.tsx` | `brand.shipping` |
|
|
76
|
+
| `app/returns/page.tsx` | `brand.returns` |
|
|
77
|
+
| `app/accessibility/page.tsx` | `brand.accessibility` |
|
|
78
|
+
| `app/contact/page.tsx` | `brand.contactPage`, `brand.contact` |
|
|
79
|
+
| `app/track-order/page.tsx` | `brand.trackOrder` |
|
|
80
|
+
| `app/account/*/page.tsx` | `brand.account` (eyebrows + titles only — Cimplify Link iframe owns the UI) |
|
|
81
|
+
| `app/login/page.tsx`, `app/signup/page.tsx` | `brand.account` (metadata only — both redirect to `/account`) |
|
|
35
82
|
| `app/llms.txt/route.ts` | `brand.llms`, contact, currency |
|
|
36
|
-
| `app/
|
|
83
|
+
| `app/opensearch.xml/route.ts` | `brand.shortName`, `brand.name` |
|
|
84
|
+
| `app/sitemap.ts`, `robots.ts` | derives URLs from product/category data |
|
|
37
85
|
| `app/not-found.tsx` | `brand.name` (page title) |
|
|
38
86
|
| `components/header.tsx` | `brand.shortName`, `brand.microTag`, `brand.header.nav` |
|
|
39
|
-
| `components/footer.tsx` | `brand.footer`, contact
|
|
87
|
+
| `components/footer.tsx` | `brand.footer`, `brand.contact`, `brand.socials` |
|
|
40
88
|
|
|
41
89
|
## Bakery-specific notes
|
|
42
90
|
|
|
43
|
-
- Product detail uses a **URL-driven modal** (`?product=<slug>`), not a static `/products/[slug]` route.
|
|
44
|
-
- Schema.org type is `Bakery
|
|
91
|
+
- Product detail uses a **URL-driven modal** (`?product=<slug>`), not a static `/products/[slug]` route. Fits impulse-purchase food UX.
|
|
92
|
+
- Schema.org `@type` is `Bakery` — set in `brand.schemaType`.
|
|
93
|
+
- Mock seed: `--seed default` (Akua's Bakery). To preview a different industry, edit `dev:mock` in `package.json` and update `NEXT_PUBLIC_CIMPLIFY_BUSINESS_ID`.
|
|
45
94
|
|
|
46
|
-
##
|
|
95
|
+
## Known TODOs (not blocking, but worth knowing)
|
|
47
96
|
|
|
48
|
-
|
|
97
|
+
- `app/contact/contact-form.tsx` fakes a successful submit. In production, wire a Server Action that calls `client.support.sendMessage(...)` from `@cimplify/sdk/server`.
|
|
98
|
+
- `components/newsletter.tsx` (homepage strip) similarly fakes submit. Wire to a real list provider.
|
|
99
|
+
- Hero / lookbook imagery is Unsplash placeholder — replace with merchant assets.
|
|
49
100
|
|
|
50
101
|
## Quick start
|
|
51
102
|
|
|
@@ -4,43 +4,97 @@ If you are an AI agent (Claude, Cursor, Aider, devin, …) working on this store
|
|
|
4
4
|
|
|
5
5
|
## TL;DR for rebranding
|
|
6
6
|
|
|
7
|
-
1. **Edit `lib/brand.ts
|
|
8
|
-
2. **Edit `app/globals.css`** —
|
|
7
|
+
1. **Edit `lib/brand.ts`** — every visible string lives here.
|
|
8
|
+
2. **Edit `app/globals.css`** — `@theme { … }` for palette + radius + font references.
|
|
9
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
10
|
|
|
11
11
|
## Aesthetic
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
Streetwear / lookbook-led brands (Nike, Aritzia, Highsnobiety, drop culture):
|
|
14
14
|
|
|
15
|
-
- **Anton display
|
|
16
|
-
- **
|
|
17
|
-
- **
|
|
18
|
-
- **
|
|
19
|
-
- **
|
|
20
|
-
-
|
|
15
|
+
- **Anton display + Inter** — uppercase condensed display, clean body sans.
|
|
16
|
+
- **High-contrast palette** — near-black foreground on near-white background, electric primary (default coral, `oklch(0.7 0.24 30)`).
|
|
17
|
+
- **Sharp corners**: `0.125rem` — minimal rounding.
|
|
18
|
+
- **Editorial full-bleed hero** with image gradient overlay.
|
|
19
|
+
- **Block-letter header** — no logo mark, just the shortName in display type.
|
|
20
|
+
- Schema.org `@type` is `Store`.
|
|
21
21
|
|
|
22
|
-
##
|
|
22
|
+
## Page surface
|
|
23
23
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
24
|
+
```
|
|
25
|
+
app/
|
|
26
|
+
page.tsx Multi-section home — full-bleed editorial hero,
|
|
27
|
+
trust bar, category tiles, promo banner,
|
|
28
|
+
"Just dropped" grid, brand strip, collections,
|
|
29
|
+
studio-collective CTA, best sellers, newsletter
|
|
30
|
+
shop/page.tsx SDK <CataloguePage/> with custom hero
|
|
31
|
+
search/page.tsx Search
|
|
32
|
+
collections/[slug]/page.tsx Collection landing (drops)
|
|
33
|
+
categories/[slug]/page.tsx Category landing
|
|
34
|
+
products/[slug]/page.tsx Full product detail page (Product JSON-LD)
|
|
35
|
+
|
|
36
|
+
size-guide/page.tsx ⭐ Fashion-specific: chest/length/shoulder + waist/hip/inseam
|
|
37
|
+
tables, "how to measure" callout
|
|
38
|
+
lookbook/page.tsx ⭐ Fashion-specific: editorial multi-drop lookbook —
|
|
39
|
+
hero + 3-up tile galleries per drop, "Shop Drop X" CTAs
|
|
40
|
+
|
|
41
|
+
cart/page.tsx, checkout/page.tsx, orders/[id]/page.tsx
|
|
42
|
+
|
|
43
|
+
account/page.tsx <CimplifyAccount /> (iframe)
|
|
44
|
+
account/orders/page.tsx <CimplifyAccount section="orders" />
|
|
45
|
+
account/addresses/page.tsx <CimplifyAccount section="addresses" />
|
|
46
|
+
account/settings/page.tsx <CimplifyAccount section="settings" />
|
|
47
|
+
login/page.tsx, signup/page.tsx redirects → /account
|
|
48
|
+
|
|
49
|
+
contact/page.tsx, track-order/page.tsx
|
|
50
|
+
|
|
51
|
+
about/page.tsx, faq/page.tsx
|
|
52
|
+
shipping/page.tsx (DHL Express worldwide), returns/page.tsx (30 days),
|
|
53
|
+
accessibility/page.tsx, terms/page.tsx, privacy/page.tsx
|
|
54
|
+
|
|
55
|
+
sitemap-page/page.tsx, sitemap.ts, robots.ts, llms.txt/route.ts, opensearch.xml/route.ts
|
|
56
|
+
error.tsx, not-found.tsx
|
|
57
|
+
```
|
|
33
58
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
59
|
+
## File ↔ brand-field map
|
|
60
|
+
|
|
61
|
+
| File | Reads from `brand` |
|
|
62
|
+
|---|---|
|
|
63
|
+
| `app/layout.tsx` | identity, contact, socials, Store JSON-LD |
|
|
64
|
+
| `app/page.tsx` | `brand.hero`, `brand.trustItems`, `brand.brandStrip`, `brand.promo`, `brand.tradeIn` (= studio-collective copy), `brand.newsletter` |
|
|
65
|
+
| `app/about/page.tsx` | `brand.about` |
|
|
66
|
+
| `app/faq/page.tsx` | `brand.faq` (sizing, drops, returns, customs) |
|
|
67
|
+
| `app/shipping/page.tsx` | `brand.shipping` (worldwide DHL, customs) |
|
|
68
|
+
| `app/returns/page.tsx` | `brand.returns` (30 days, free US/UK/EU) |
|
|
69
|
+
| `app/accessibility/page.tsx` | `brand.accessibility` |
|
|
70
|
+
| `app/terms/page.tsx`, `app/privacy/page.tsx` | `brand.terms`, `brand.privacy` |
|
|
71
|
+
| `app/contact/page.tsx` | `brand.contactPage`, `brand.contact` |
|
|
72
|
+
| `app/track-order/page.tsx` | `brand.trackOrder` |
|
|
73
|
+
| `app/account/*/page.tsx` | `brand.account` (iframe owns UI) |
|
|
74
|
+
| `app/products/[slug]/page.tsx` | `brand.name`, `brand.currency` (Product JSON-LD) |
|
|
75
|
+
| `app/size-guide/page.tsx` | currently has its size charts inlined — hoist to `brand.sizeGuide` if you want agents to edit them |
|
|
76
|
+
| `app/lookbook/page.tsx` | currently has the lookbook entries inlined (image URLs + drop names) — hoist to `brand.lookbook` for agent editing |
|
|
77
|
+
| `app/llms.txt/route.ts` | `brand.llms`, contact, currency |
|
|
78
|
+
| `components/header.tsx`, `footer.tsx` | `brand.header`, `brand.footer`, `brand.contact`, `brand.socials` |
|
|
79
|
+
| `components/promo-banner.tsx`, `trade-in-cta.tsx`, `brand-marquee.tsx`, `trust-bar.tsx`, `newsletter.tsx` | corresponding optional sections in `brand` |
|
|
80
|
+
|
|
81
|
+
## Fashion-specific notes
|
|
82
|
+
|
|
83
|
+
- **Hero is full-bleed editorial.** Replace `HERO_FALLBACK_IMAGE` in `app/page.tsx` with the merchant's drop campaign shot for maximum impact.
|
|
84
|
+
- **Drop badges and "limited run" copy** drive urgency. Keep `brand.hero.badge` and `brand.promo.badge` short and time-bounded.
|
|
85
|
+
- **`brand.tradeIn`** is repurposed as the "Studio collective" / membership programme — three-step access flow.
|
|
86
|
+
- **Product detail uses the page-driven model** (`/products/[slug]`) — fashion is a consideration purchase (sizing, fit, fabric details), not impulse.
|
|
87
|
+
- **`brandStrip.headline` is `"Stocked at"`** with editorial publication wordmarks (Vogue, Highsnobiety, etc.) — typography-led, no logo licensing required.
|
|
88
|
+
|
|
89
|
+
## Known TODOs
|
|
90
|
+
|
|
91
|
+
- `app/size-guide/page.tsx` has its size charts inlined as constants. Move them to `brand.sizeGuide` (typed) so agents can edit per-merchant size charts in one file.
|
|
92
|
+
- `app/lookbook/page.tsx` has its drop entries inlined. Move to `brand.lookbook` for agent editing — each drop becomes `{ drop, title, date, byline, hero, tiles[] }`.
|
|
93
|
+
- Contact form + newsletter fake submits.
|
|
40
94
|
|
|
41
95
|
## Mock seed
|
|
42
96
|
|
|
43
|
-
Wired to `--seed retail` (Currents Electronics catalogue
|
|
97
|
+
Wired to `--seed retail` (Currents Electronics catalogue — the closest stand-in until an apparel seed ships). Replace with apparel data in production.
|
|
44
98
|
|
|
45
99
|
## Quick start
|
|
46
100
|
|
|
@@ -10,24 +10,69 @@ If you are an AI agent (Claude, Cursor, Aider, devin, …) working on this store
|
|
|
10
10
|
|
|
11
11
|
## Aesthetic
|
|
12
12
|
|
|
13
|
-
Approachable grocer — Trader Joe's / Whole Foods / abundant-feel:
|
|
14
|
-
|
|
15
13
|
- **Inter sans only** (no serif) — friendly, readable for dense product grids.
|
|
16
|
-
- **Fresh green + cream
|
|
14
|
+
- **Fresh green + cream** — vibrant green primary, warm cream background.
|
|
17
15
|
- **Generous radius**: `0.875rem` — softer than retail.
|
|
18
16
|
- **Bold, slightly heavy** headings.
|
|
17
|
+
- Schema.org `@type` is `GroceryStore`.
|
|
18
|
+
|
|
19
|
+
## Page surface
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
app/
|
|
23
|
+
page.tsx Home — hero ("Free delivery over GH₵150"),
|
|
24
|
+
collection strips, category grid, newsletter
|
|
25
|
+
shop/page.tsx Aisle (SDK <CataloguePage/>)
|
|
26
|
+
search/page.tsx Search
|
|
27
|
+
collections/[slug]/page.tsx Collection landing (e.g. weekly box, deals)
|
|
28
|
+
categories/[slug]/page.tsx Category landing
|
|
29
|
+
|
|
30
|
+
cart/page.tsx, checkout/page.tsx, orders/[id]/page.tsx
|
|
31
|
+
|
|
32
|
+
account/page.tsx <CimplifyAccount /> (iframe)
|
|
33
|
+
account/orders/page.tsx <CimplifyAccount section="orders" />
|
|
34
|
+
account/addresses/page.tsx <CimplifyAccount section="addresses" />
|
|
35
|
+
account/settings/page.tsx <CimplifyAccount section="settings" />
|
|
36
|
+
login/page.tsx, signup/page.tsx redirects → /account
|
|
37
|
+
|
|
38
|
+
contact/page.tsx, track-order/page.tsx
|
|
39
|
+
|
|
40
|
+
about/page.tsx, faq/page.tsx
|
|
41
|
+
shipping/page.tsx (delivery + slots), returns/page.tsx (quality guarantee),
|
|
42
|
+
accessibility/page.tsx, terms/page.tsx, privacy/page.tsx
|
|
43
|
+
|
|
44
|
+
sitemap-page/page.tsx, sitemap.ts, robots.ts, llms.txt/route.ts, opensearch.xml/route.ts
|
|
45
|
+
error.tsx, not-found.tsx
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## File ↔ brand-field map
|
|
49
|
+
|
|
50
|
+
| File | Reads from `brand` |
|
|
51
|
+
|---|---|
|
|
52
|
+
| `app/layout.tsx` | identity, contact, socials, GroceryStore JSON-LD |
|
|
53
|
+
| `app/page.tsx` | `brand.hero` (free-delivery badge) |
|
|
54
|
+
| `app/about/page.tsx` | `brand.about` |
|
|
55
|
+
| `app/faq/page.tsx` | `brand.faq` (delivery slots, sourcing, subscription boxes) |
|
|
56
|
+
| `app/shipping/page.tsx` | `brand.shipping` (delivery slots + free-over threshold) |
|
|
57
|
+
| `app/returns/page.tsx` | `brand.returns` (quality guarantee) |
|
|
58
|
+
| `app/accessibility/page.tsx` | `brand.accessibility` |
|
|
59
|
+
| `app/terms/page.tsx`, `app/privacy/page.tsx` | `brand.terms`, `brand.privacy` |
|
|
60
|
+
| `app/contact/page.tsx` | `brand.contactPage`, `brand.contact` |
|
|
61
|
+
| `app/track-order/page.tsx` | `brand.trackOrder` |
|
|
62
|
+
| `app/account/*/page.tsx` | `brand.account` (iframe owns UI) |
|
|
63
|
+
| `app/llms.txt/route.ts` | `brand.llms`, contact, currency |
|
|
64
|
+
| `components/header.tsx`, `footer.tsx` | `brand.header`, `brand.footer`, `brand.contact`, `brand.socials` |
|
|
19
65
|
|
|
20
|
-
##
|
|
66
|
+
## Grocery-specific notes
|
|
21
67
|
|
|
22
|
-
- `
|
|
23
|
-
- `
|
|
24
|
-
- `
|
|
25
|
-
- `brand.faq` covers delivery slots, sourcing/quality, subscription boxes.
|
|
26
|
-
- Schema.org type is `GroceryStore`.
|
|
68
|
+
- **Subscription boxes** are modelled as products with `billing_plans` (renders the SubscriptionCard variant). The basket-box landing lives at `/categories/baskets`.
|
|
69
|
+
- **Weight-based pricing**: SDK supports `quantity_pricing` tiers per product, but most grocery products are sold by unit/kg. Real weight-at-pack pricing happens on the backend pricing rule.
|
|
70
|
+
- Mock seed: `--seed grocery` (FreshMart).
|
|
27
71
|
|
|
28
|
-
##
|
|
72
|
+
## Known TODOs
|
|
29
73
|
|
|
30
|
-
|
|
74
|
+
- Contact + newsletter fake submits.
|
|
75
|
+
- Hero / category / product imagery is Unsplash placeholder — replace with merchant photography.
|
|
31
76
|
|
|
32
77
|
## Quick start
|
|
33
78
|
|
|
@@ -10,24 +10,75 @@ If you are an AI agent (Claude, Cursor, Aider, devin, …) working on this store
|
|
|
10
10
|
|
|
11
11
|
## Aesthetic
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
- **Lora serif + Inter** — warm, food-friendly headings + clean body.
|
|
14
|
+
- **Forest green + cream** — deep sage primary, warm cream background.
|
|
15
|
+
- **Mid radius**: `0.625rem`.
|
|
16
|
+
- Schema.org `@type` is `Restaurant`.
|
|
14
17
|
|
|
15
|
-
|
|
16
|
-
- **Inter** for body and UI.
|
|
17
|
-
- **Forest green + cream**: deep sage primary, warm cream background, subtle warm accents.
|
|
18
|
-
- **Mid-radius**: `0.625rem` — softer than retail, tighter than spa.
|
|
18
|
+
## Page surface
|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
```
|
|
21
|
+
app/
|
|
22
|
+
page.tsx Home — hero with daily-special badge,
|
|
23
|
+
collection strips, category grid
|
|
24
|
+
shop/page.tsx Full menu (SDK <CataloguePage/>)
|
|
25
|
+
search/page.tsx Search
|
|
26
|
+
collections/[slug]/page.tsx Collection landing (e.g. brunch, mains)
|
|
27
|
+
categories/[slug]/page.tsx Category landing
|
|
28
|
+
|
|
29
|
+
reservations/page.tsx ⭐ Restaurant-specific: reservation widget
|
|
30
|
+
(date + lunch/dinner slot + party size)
|
|
31
|
+
backed by service-type "seating" products
|
|
32
|
+
|
|
33
|
+
cart/page.tsx, checkout/page.tsx, orders/[id]/page.tsx
|
|
34
|
+
|
|
35
|
+
account/page.tsx <CimplifyAccount /> (iframe)
|
|
36
|
+
account/orders/page.tsx <CimplifyAccount section="orders" />
|
|
37
|
+
account/addresses/page.tsx <CimplifyAccount section="addresses" />
|
|
38
|
+
account/settings/page.tsx <CimplifyAccount section="settings" />
|
|
39
|
+
login/page.tsx, signup/page.tsx redirects → /account
|
|
40
|
+
|
|
41
|
+
contact/page.tsx, track-order/page.tsx
|
|
42
|
+
|
|
43
|
+
about/page.tsx, faq/page.tsx
|
|
44
|
+
shipping/page.tsx (delivery), returns/page.tsx (refunds), accessibility/page.tsx
|
|
45
|
+
terms/page.tsx, privacy/page.tsx
|
|
46
|
+
|
|
47
|
+
sitemap-page/page.tsx, sitemap.ts, robots.ts, llms.txt/route.ts, opensearch.xml/route.ts
|
|
48
|
+
error.tsx, not-found.tsx
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## File ↔ brand-field map
|
|
52
|
+
|
|
53
|
+
| File | Reads from `brand` |
|
|
54
|
+
|---|---|
|
|
55
|
+
| `app/layout.tsx` | identity, contact, socials, Restaurant JSON-LD |
|
|
56
|
+
| `app/page.tsx` | `brand.hero` (daily-special badge) |
|
|
57
|
+
| `app/about/page.tsx` | `brand.about` |
|
|
58
|
+
| `app/faq/page.tsx` | `brand.faq` (reservations, dietary, delivery) |
|
|
59
|
+
| `app/shipping/page.tsx` | `brand.shipping` (delivery + pickup) |
|
|
60
|
+
| `app/returns/page.tsx` | `brand.returns` (refund + cancellation) |
|
|
61
|
+
| `app/accessibility/page.tsx` | `brand.accessibility` |
|
|
62
|
+
| `app/terms/page.tsx`, `app/privacy/page.tsx` | `brand.terms`, `brand.privacy` |
|
|
63
|
+
| `app/contact/page.tsx` | `brand.contactPage`, `brand.contact` |
|
|
64
|
+
| `app/track-order/page.tsx` | `brand.trackOrder` |
|
|
65
|
+
| `app/account/*/page.tsx` | `brand.account` (iframe owns the UI) |
|
|
66
|
+
| `app/reservations/*` | derives seating from service-type products in the catalogue |
|
|
67
|
+
| `app/llms.txt/route.ts` | `brand.llms`, contact, currency |
|
|
68
|
+
| `components/header.tsx`, `footer.tsx` | `brand.header`, `brand.footer`, `brand.contact`, `brand.socials` |
|
|
69
|
+
|
|
70
|
+
## Restaurant-specific notes
|
|
21
71
|
|
|
22
|
-
-
|
|
23
|
-
-
|
|
24
|
-
-
|
|
25
|
-
-
|
|
26
|
-
- Schema.org type is `Restaurant`.
|
|
72
|
+
- **Reservations are service-type products.** Add seating options like "Two-top", "Four-top", "Long table for 12" to the catalogue with `type: "service"`. The `/reservations` page filters them in.
|
|
73
|
+
- The reservation widget adds the chosen seating to cart with the date, time, party size, and notes as cart-item notes; checkout finalises the booking via Cimplify's order pipeline.
|
|
74
|
+
- Schema.org `@type` is `Restaurant`. `servesCuisine` etc. can be added to the JSON-LD object in `app/layout.tsx` if needed.
|
|
75
|
+
- Mock seed: `--seed restaurant` (Mama's Kitchen).
|
|
27
76
|
|
|
28
|
-
##
|
|
77
|
+
## Known TODOs
|
|
29
78
|
|
|
30
|
-
|
|
79
|
+
- `/reservations` widget assumes every slot is bookable. For production, wire `useAvailableSlots({ serviceId, date })` from `@cimplify/sdk/react` to filter to actually-free windows.
|
|
80
|
+
- Contact form + newsletter fake their submits.
|
|
81
|
+
- Hero / dish photography is Unsplash — replace with merchant photos.
|
|
31
82
|
|
|
32
83
|
## Quick start
|
|
33
84
|
|
|
@@ -4,39 +4,75 @@ If you are an AI agent (Claude, Cursor, Aider, devin, …) working on this store
|
|
|
4
4
|
|
|
5
5
|
## TL;DR for rebranding
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
1. **Edit `lib/brand.ts`** — every visible string lives here.
|
|
8
|
+
2. **Edit `app/globals.css`** — `@theme { … }` block for palette + radius + font references.
|
|
9
|
+
3. **Edit `.env.local`** — `NEXT_PUBLIC_CIMPLIFY_API_URL`, `NEXT_PUBLIC_CIMPLIFY_PUBLIC_KEY`, `NEXT_PUBLIC_CIMPLIFY_BUSINESS_ID`, `NEXT_PUBLIC_SITE_URL`.
|
|
8
10
|
|
|
9
|
-
|
|
10
|
-
2. **Edit `app/globals.css`** — the `@theme { … }` block holds the design tokens (palette, radius, font references). Tweak to match the merchant's brand.
|
|
11
|
-
3. **Edit `.env.local`** — set `NEXT_PUBLIC_CIMPLIFY_API_URL`, `NEXT_PUBLIC_CIMPLIFY_PUBLIC_KEY`, `NEXT_PUBLIC_CIMPLIFY_BUSINESS_ID`, `NEXT_PUBLIC_SITE_URL`.
|
|
11
|
+
## Aesthetic
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
- **Inter + JetBrains Mono** — clean modern sans, mono-spaced labels for spec-feel.
|
|
14
|
+
- **Cool navy + electric blue**: dark foreground, electric primary.
|
|
15
|
+
- **Sharp corners**: `0.5rem` — modern retail.
|
|
16
|
+
- **Section heroes** in dark with mono-spaced eyebrow labels.
|
|
14
17
|
|
|
15
|
-
##
|
|
18
|
+
## Page surface
|
|
16
19
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
-
|
|
20
|
-
|
|
21
|
-
-
|
|
22
|
-
|
|
23
|
-
|
|
20
|
+
```
|
|
21
|
+
app/
|
|
22
|
+
page.tsx Multi-section home — split hero, trust bar, category tiles,
|
|
23
|
+
promo banner, "Just dropped" grid, brand strip, collections,
|
|
24
|
+
trade-in CTA, best sellers, newsletter
|
|
25
|
+
shop/page.tsx SDK <CataloguePage/> with custom hero
|
|
26
|
+
search/page.tsx Search (SDK <SearchPage/>)
|
|
27
|
+
collections/[slug]/page.tsx Collection landing
|
|
28
|
+
categories/[slug]/page.tsx Category landing
|
|
29
|
+
products/[slug]/page.tsx Full product detail page (Product JSON-LD)
|
|
30
|
+
|
|
31
|
+
cart/page.tsx SDK <CartPage/>
|
|
32
|
+
checkout/page.tsx SDK <CheckoutPage/>
|
|
33
|
+
orders/[id]/page.tsx Post-checkout confirmation
|
|
34
|
+
|
|
35
|
+
account/page.tsx <CimplifyAccount /> (iframe)
|
|
36
|
+
account/orders/page.tsx <CimplifyAccount section="orders" />
|
|
37
|
+
account/addresses/page.tsx <CimplifyAccount section="addresses" />
|
|
38
|
+
account/settings/page.tsx <CimplifyAccount section="settings" />
|
|
39
|
+
login/page.tsx, signup/page.tsx redirects → /account
|
|
40
|
+
|
|
41
|
+
contact/page.tsx Branded contact form
|
|
42
|
+
track-order/page.tsx Guest lookup → /orders/[id]
|
|
43
|
+
|
|
44
|
+
about/page.tsx, faq/page.tsx Brand pages
|
|
45
|
+
shipping/page.tsx, returns/page.tsx, accessibility/page.tsx Standalone policies
|
|
46
|
+
terms/page.tsx, privacy/page.tsx
|
|
47
|
+
|
|
48
|
+
sitemap-page/page.tsx HTML sitemap
|
|
49
|
+
sitemap.ts, robots.ts XML sitemap, robots.txt
|
|
50
|
+
llms.txt/route.ts LLM-friendly site index
|
|
51
|
+
opensearch.xml/route.ts Browser search description
|
|
52
|
+
error.tsx, not-found.tsx Global boundaries
|
|
53
|
+
```
|
|
24
54
|
|
|
25
|
-
## File
|
|
55
|
+
## File ↔ brand-field map
|
|
26
56
|
|
|
27
57
|
| File | Reads from `brand` |
|
|
28
58
|
|---|---|
|
|
29
|
-
| `app/layout.tsx` |
|
|
59
|
+
| `app/layout.tsx` | identity, contact, socials, schemaType (Store JSON-LD) |
|
|
30
60
|
| `app/page.tsx` | `brand.hero`, `brand.trustItems`, `brand.brandStrip`, `brand.promo`, `brand.tradeIn`, `brand.newsletter` |
|
|
31
61
|
| `app/about/page.tsx` | `brand.about` |
|
|
32
62
|
| `app/faq/page.tsx` | `brand.faq` |
|
|
33
63
|
| `app/terms/page.tsx` | `brand.terms` |
|
|
34
64
|
| `app/privacy/page.tsx` | `brand.privacy` |
|
|
35
|
-
| `app/
|
|
65
|
+
| `app/shipping/page.tsx` | `brand.shipping` (warranty + returns + same-day delivery copy) |
|
|
66
|
+
| `app/returns/page.tsx` | `brand.returns` |
|
|
67
|
+
| `app/accessibility/page.tsx` | `brand.accessibility` |
|
|
68
|
+
| `app/contact/page.tsx` | `brand.contactPage`, `brand.contact` |
|
|
69
|
+
| `app/track-order/page.tsx` | `brand.trackOrder` |
|
|
70
|
+
| `app/account/*/page.tsx` | `brand.account` (Cimplify Link iframe owns the UI) |
|
|
71
|
+
| `app/products/[slug]/page.tsx` | `brand.name`, `brand.currency` (Product JSON-LD: brand, offer, availability) |
|
|
36
72
|
| `app/llms.txt/route.ts` | `brand.llms`, contact, currency |
|
|
37
|
-
| `app/
|
|
73
|
+
| `app/opensearch.xml/route.ts` | `brand.shortName`, `brand.name` |
|
|
38
74
|
| `components/header.tsx` | `brand.shortName`, `brand.microTag`, `brand.header.nav` |
|
|
39
|
-
| `components/footer.tsx` | `brand.footer`, contact
|
|
75
|
+
| `components/footer.tsx` | `brand.footer`, `brand.contact`, `brand.socials` |
|
|
40
76
|
| `components/promo-banner.tsx` | `brand.promo` (renders nothing if absent) |
|
|
41
77
|
| `components/trade-in-cta.tsx` | `brand.tradeIn` (renders nothing if absent) |
|
|
42
78
|
| `components/brand-marquee.tsx` | `brand.brandStrip` |
|
|
@@ -45,20 +81,25 @@ That is the entire rebrand. Do not modify any `.tsx` file in `app/` or `componen
|
|
|
45
81
|
|
|
46
82
|
## Retail-specific notes
|
|
47
83
|
|
|
48
|
-
- Product detail is a **full `/products/[slug]` page** with image gallery, customizer, related products rail, and Product JSON-LD.
|
|
49
|
-
- Schema.org type is `Store`.
|
|
50
|
-
- Optional sections render conditionally: `brand.promo`, `brand.tradeIn`, `brand.trustItems`, `brand.brandStrip`
|
|
51
|
-
- `app/page.tsx` uses Unsplash fallback hero
|
|
84
|
+
- Product detail is a **full `/products/[slug]` page** with image gallery, customizer, related products rail, and Product JSON-LD. Consideration purchases (phones, laptops, headphones) need real estate. Don't replace with a modal.
|
|
85
|
+
- Schema.org `@type` is `Store`.
|
|
86
|
+
- Optional sections render conditionally: set `brand.promo`, `brand.tradeIn`, `brand.trustItems`, or `brand.brandStrip` to `undefined` to hide them.
|
|
87
|
+
- `app/page.tsx` uses an Unsplash fallback hero (`HERO_FALLBACK_IMAGE`) — replace with the merchant's own product photography.
|
|
88
|
+
|
|
89
|
+
## Known TODOs
|
|
90
|
+
|
|
91
|
+
- Contact form + newsletter signup currently fake their submit. Wire `client.support.sendMessage(...)` for contact and a real list provider for newsletter.
|
|
92
|
+
- Trust-bar / brand-marquee imagery / wordmarks are placeholders — swap for the merchant's real partners.
|
|
52
93
|
|
|
53
94
|
## Mock seed
|
|
54
95
|
|
|
55
|
-
Wired to `--seed retail` (Currents Electronics)
|
|
96
|
+
Wired to `--seed retail` (Currents Electronics). Edit `dev:mock` in `package.json` to preview another seed.
|
|
56
97
|
|
|
57
98
|
## Quick start
|
|
58
99
|
|
|
59
100
|
```bash
|
|
60
101
|
bun install
|
|
61
|
-
bun dev
|
|
102
|
+
bun dev
|
|
62
103
|
```
|
|
63
104
|
|
|
64
105
|
Open <http://localhost:3000>.
|
|
@@ -5,31 +5,79 @@ If you are an AI agent (Claude, Cursor, Aider, devin, …) working on this store
|
|
|
5
5
|
## TL;DR for rebranding
|
|
6
6
|
|
|
7
7
|
1. **Edit `lib/brand.ts`** — every visible string lives here.
|
|
8
|
-
2. **Edit `app/globals.css`** —
|
|
8
|
+
2. **Edit `app/globals.css`** — `@theme { … }` for palette + radius.
|
|
9
9
|
3. **Edit `.env.local`** — `NEXT_PUBLIC_CIMPLIFY_BUSINESS_ID=bus_serene_spa` for the bundled seed.
|
|
10
10
|
|
|
11
11
|
## Aesthetic
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
- **Fraunces serif + Inter** — warm, slightly editorial headings.
|
|
14
|
+
- **Sand + sage palette** — warm cream background, deep sage primary.
|
|
15
|
+
- **Generous radius**: `1rem` — calm, soft.
|
|
16
|
+
- Lower-contrast than retail / fashion.
|
|
17
|
+
- Schema.org `@type` is `BeautySalon`.
|
|
14
18
|
|
|
15
|
-
|
|
16
|
-
- **Inter** for body and UI.
|
|
17
|
-
- **Sand + sage palette**: warm cream background, deep sage primary.
|
|
18
|
-
- **Soft corners**: `--radius: 1rem` — generous rounding throughout.
|
|
19
|
-
- **Lower-contrast** than retail / fashion; calm-feeling.
|
|
19
|
+
## Page surface
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
```
|
|
22
|
+
app/
|
|
23
|
+
page.tsx Home — hero ("Now booking"), service strips,
|
|
24
|
+
category grid, newsletter
|
|
25
|
+
shop/page.tsx Treatment menu (SDK <CataloguePage/>)
|
|
26
|
+
search/page.tsx Search
|
|
27
|
+
collections/[slug]/page.tsx Collection landing
|
|
28
|
+
categories/[slug]/page.tsx Category landing (e.g. memberships, packages)
|
|
29
|
+
|
|
30
|
+
book/page.tsx ⭐ Services-specific: full booking widget
|
|
31
|
+
(treatment + 14-day date + 30-min slot grid)
|
|
32
|
+
→ adds to cart with slot as note → /checkout
|
|
33
|
+
|
|
34
|
+
cart/page.tsx, checkout/page.tsx, orders/[id]/page.tsx
|
|
35
|
+
|
|
36
|
+
account/page.tsx <CimplifyAccount /> (iframe)
|
|
37
|
+
account/orders/page.tsx <CimplifyAccount section="orders" />
|
|
38
|
+
account/addresses/page.tsx <CimplifyAccount section="addresses" />
|
|
39
|
+
account/settings/page.tsx <CimplifyAccount section="settings" />
|
|
40
|
+
login/page.tsx, signup/page.tsx redirects → /account
|
|
41
|
+
|
|
42
|
+
contact/page.tsx, track-order/page.tsx (find a booking)
|
|
43
|
+
|
|
44
|
+
about/page.tsx, faq/page.tsx
|
|
45
|
+
shipping/page.tsx (what to expect at the studio), returns/page.tsx (cancellations),
|
|
46
|
+
accessibility/page.tsx, terms/page.tsx, privacy/page.tsx
|
|
47
|
+
|
|
48
|
+
sitemap-page/page.tsx, sitemap.ts, robots.ts, llms.txt/route.ts, opensearch.xml/route.ts
|
|
49
|
+
error.tsx, not-found.tsx
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## File ↔ brand-field map
|
|
53
|
+
|
|
54
|
+
| File | Reads from `brand` |
|
|
55
|
+
|---|---|
|
|
56
|
+
| `app/layout.tsx` | identity, contact, socials, BeautySalon JSON-LD |
|
|
57
|
+
| `app/page.tsx` | `brand.hero` ("Now booking") |
|
|
58
|
+
| `app/about/page.tsx` | `brand.about` |
|
|
59
|
+
| `app/faq/page.tsx` | `brand.faq` (booking, contraindications, memberships) |
|
|
60
|
+
| `app/shipping/page.tsx` | `brand.shipping` (what to expect at the studio) |
|
|
61
|
+
| `app/returns/page.tsx` | `brand.returns` (cancellation policy) |
|
|
62
|
+
| `app/accessibility/page.tsx` | `brand.accessibility` |
|
|
63
|
+
| `app/terms/page.tsx`, `app/privacy/page.tsx` | `brand.terms`, `brand.privacy` |
|
|
64
|
+
| `app/contact/page.tsx` | `brand.contactPage`, `brand.contact` |
|
|
65
|
+
| `app/track-order/page.tsx` | `brand.trackOrder` ("find a booking") |
|
|
66
|
+
| `app/account/*/page.tsx` | `brand.account` (iframe owns UI) |
|
|
67
|
+
| `app/book/*` | derives bookable services from product list (`type: "service"`) |
|
|
68
|
+
| `app/llms.txt/route.ts` | `brand.llms`, contact, currency |
|
|
69
|
+
| `components/header.tsx`, `footer.tsx` | `brand.header`, `brand.footer`, `brand.contact`, `brand.socials` |
|
|
70
|
+
|
|
71
|
+
## Services-specific notes
|
|
22
72
|
|
|
23
|
-
The
|
|
24
|
-
-
|
|
25
|
-
-
|
|
26
|
-
- `brand.tradeIn` is omitted (irrelevant for services).
|
|
27
|
-
- `brand.faq` covers booking, cancellation, contraindications, memberships.
|
|
28
|
-
- Schema.org type is `BeautySalon`.
|
|
73
|
+
- **Bookable services are `type: "service"` products.** The `/book` page filters the product list to type=service and treats them as treatments. Their `duration_minutes` is shown on the chip.
|
|
74
|
+
- Cart-item notes carry the booked time slot — checkout sends them through Cimplify's order pipeline. The merchant's downstream system reads the note to schedule the appointment.
|
|
75
|
+
- Mock seed: `--seed services` (Serene Spa).
|
|
29
76
|
|
|
30
|
-
##
|
|
77
|
+
## Known TODOs
|
|
31
78
|
|
|
32
|
-
|
|
79
|
+
- `/book` widget shows every slot as available. For production, wire `useAvailableSlots({ serviceId, date })` from `@cimplify/sdk/react` to filter to genuinely-free windows.
|
|
80
|
+
- Contact + newsletter fake submits.
|
|
33
81
|
|
|
34
82
|
## Quick start
|
|
35
83
|
|