@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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cimplify/sdk",
3
- "version": "0.42.0",
3
+ "version": "0.42.1",
4
4
  "description": "Cimplify Commerce SDK for storefronts",
5
5
  "keywords": [
6
6
  "cimplify",
@@ -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. Replace each field with the merchant's actual content.
10
- 2. **Edit `app/globals.css`** — the `@theme { … }` block holds the design tokens (palette, radius, font references). Tweak to match the merchant's brand.
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
- ## File map (what reads from where)
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` | metadata, OpenGraph, Organization JSON-LD |
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/sitemap.ts`, `robots.ts` | (no brand strings — derives from product data) |
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, socials |
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. This fits impulse-purchase food UX. Don't refactor without a reason.
44
- - Schema.org type is `Bakery`. `lib/brand.ts` sets this in `schemaType` — change if rebranding to a different industry.
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
- ## Mock seed
95
+ ## Known TODOs (not blocking, but worth knowing)
47
96
 
48
- Wired to `--seed default` (Akua's Bakery) via `package.json` `dev:mock`. To preview another seed, change the flag or run `bunx @cimplify/sdk --seed restaurant` directly and update `NEXT_PUBLIC_CIMPLIFY_BUSINESS_ID` in `.env.local`.
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`.** 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.
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
- This template is built for streetwear / capsule fashion / lookbook-led brands (Nike, Aritzia, Highsnobiety, drop culture). Key design moves:
13
+ Streetwear / lookbook-led brands (Nike, Aritzia, Highsnobiety, drop culture):
14
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.
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
- ## Industry-specific copy patterns
22
+ ## Page surface
23
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
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
- - ✅ 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`.
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). Replace with apparel data in production. To preview a different seed, edit `dev:mock` in `package.json`.
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**: vibrant green primary, warm cream background.
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
- ## Industry-specific copy patterns
66
+ ## Grocery-specific notes
21
67
 
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`.
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
- ## Mock seed
72
+ ## Known TODOs
29
73
 
30
- Wired to `--seed grocery` (FreshMart).
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
- Boutique restaurant — Sweetgreen / chef-table feel:
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
- - **Lora serif** for headings (warm, food-leaning).
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
- ## Industry-specific copy patterns
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
- - `brand.hero.badge` is `"Tonight's special · Banku & Tilapia"` — a daily-special call-out.
23
- - `brand.hero.primaryCtaLabel` is `"Reserve a table"`.
24
- - `brand.tradeIn` is omitted.
25
- - `brand.faq` covers reservations, dietary, delivery, allergens.
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
- ## Mock seed
77
+ ## Known TODOs
29
78
 
30
- Wired to `--seed restaurant` (Mama's Kitchen).
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
- To rebrand this storefront end-to-end as a different merchant:
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
- 1. **Edit `lib/brand.ts`.** Every visible string reads from this file. Replace each field with the merchant's actual content.
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
- 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`.
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
- ## Rules
18
+ ## Page surface
16
19
 
17
- - ✅ All content edits → `lib/brand.ts`
18
- - ✅ All design-token edits → `app/globals.css` `@theme` block
19
- - ✅ Server Components stay cached via `'use cache'` + `cacheTag(tags.X())` + `cacheLife("hours")`
20
- - ✅ Client islands (header active link, cart pill, product card link) live behind `<Suspense>`
21
- - ❌ Don't hardcode strings. If a string isn't in `brand`, add a new field to the `Brand` interface.
22
- - ❌ Don't disable `cacheComponents: true` in `next.config.ts`.
23
- - ❌ Don't use `unstable_cache` — Next 16 uses the `'use cache'` directive.
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 map (what reads from where)
55
+ ## File ↔ brand-field map
26
56
 
27
57
  | File | Reads from `brand` |
28
58
  |---|---|
29
- | `app/layout.tsx` | metadata, OpenGraph, Organization JSON-LD |
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/products/[slug]/page.tsx` | `brand.name`, `brand.currency` (Product JSON-LD) |
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/not-found.tsx` | `brand.name` (page title) |
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, socials |
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. This fits consideration-purchase electronics UX (specs, reviews, warranty). Do not replace with a modal.
49
- - Schema.org type is `Store`. Change in `lib/brand.ts` (`schemaType`) for a different industry.
50
- - Optional sections render conditionally: `brand.promo`, `brand.tradeIn`, `brand.trustItems`, `brand.brandStrip` — set to `undefined` to hide.
51
- - `app/page.tsx` uses Unsplash fallback hero image (`HERO_FALLBACK_IMAGE`) — replace with your own asset URL.
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) via `package.json` `dev:mock`. To preview another seed, change the flag or run `bunx @cimplify/sdk --seed services` directly and update `NEXT_PUBLIC_CIMPLIFY_BUSINESS_ID` in `.env.local`.
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 # boots mock + Next dev server
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`** — the `@theme { … }` block holds the palette + radius.
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
- Calm, refined wellness — Booksy / Mindbody / boutique-spa territory:
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
- - **Fraunces serif** for headings (warm, slightly editorial).
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
- ## Industry-specific copy patterns
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 bundled brand presets:
24
- - `brand.hero.badge` reads `"Now booking · April"` — month-based availability.
25
- - `brand.hero.primaryCtaLabel` is `"Book a treatment"`.
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
- ## Mock seed
77
+ ## Known TODOs
31
78
 
32
- Wired to `--seed services` (Serene Spa). Products in this seed are *services* (`type: "service"`), so the SDK's variant cards render `StandardServiceCard` automatically.
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