@cimplify/sdk 0.44.34 → 0.45.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/README.md +21 -16
- package/dist/styles.css +1 -1
- package/package.json +5 -9
- package/dist/cli/commands/deploy.mjs +0 -717
- package/dist/cli/commands/dev.mjs +0 -479
- package/dist/cli/commands/domains.mjs +0 -769
- package/dist/cli/commands/env.mjs +0 -705
- package/dist/cli/commands/link.mjs +0 -378
- package/dist/cli/commands/login.mjs +0 -584
- package/dist/cli/commands/logout.mjs +0 -75
- package/dist/cli/commands/logs.mjs +0 -432
- package/dist/cli/commands/projects.mjs +0 -473
- package/dist/cli/commands/repo.mjs +0 -584
- package/dist/cli/commands/rollback.mjs +0 -553
- package/dist/cli/commands/status.mjs +0 -450
- package/dist/cli/commands/unlink.mjs +0 -79
- package/dist/cli/commands/whoami.mjs +0 -285
- package/dist/cli.js +0 -184
- package/dist/dispatcher.mjs +0 -360
- package/registry/booking-page.json +0 -18
- package/registry/bookings-page.json +0 -17
- package/registry/service-card.json +0 -16
- package/registry/service-grid.json +0 -16
- package/templates/storefront-bakery/.claude/skills/cimplify-storefront/SKILL.md +0 -145
- package/templates/storefront-bakery/.cursor/rules/cimplify-storefront.mdc +0 -25
- package/templates/storefront-bakery/.env.example +0 -16
- package/templates/storefront-bakery/AGENTS.md +0 -120
- package/templates/storefront-bakery/CLAUDE.md +0 -22
- package/templates/storefront-bakery/README.md +0 -73
- package/templates/storefront-bakery/__tests__/brand.test.ts +0 -4
- package/templates/storefront-bakery/__tests__/cart-flow.test.ts +0 -4
- package/templates/storefront-bakery/__tests__/contract.test.ts +0 -4
- package/templates/storefront-bakery/app/about/page.tsx +0 -38
- package/templates/storefront-bakery/app/accessibility/page.tsx +0 -11
- package/templates/storefront-bakery/app/account/addresses/page.tsx +0 -21
- package/templates/storefront-bakery/app/account/orders/page.tsx +0 -21
- package/templates/storefront-bakery/app/account/page.tsx +0 -22
- package/templates/storefront-bakery/app/account/settings/page.tsx +0 -21
- package/templates/storefront-bakery/app/cart/page.tsx +0 -9
- package/templates/storefront-bakery/app/categories/[slug]/listing-client.tsx +0 -19
- package/templates/storefront-bakery/app/categories/[slug]/page.tsx +0 -118
- package/templates/storefront-bakery/app/checkout/page.tsx +0 -17
- package/templates/storefront-bakery/app/collections/[slug]/listing-client.tsx +0 -20
- package/templates/storefront-bakery/app/collections/[slug]/page.tsx +0 -118
- package/templates/storefront-bakery/app/contact/contact-form.tsx +0 -109
- package/templates/storefront-bakery/app/contact/page.tsx +0 -54
- package/templates/storefront-bakery/app/error.tsx +0 -60
- package/templates/storefront-bakery/app/faq/page.tsx +0 -46
- package/templates/storefront-bakery/app/globals.css +0 -47
- package/templates/storefront-bakery/app/layout.tsx +0 -82
- package/templates/storefront-bakery/app/llms.txt/route.ts +0 -94
- package/templates/storefront-bakery/app/login/page.tsx +0 -17
- package/templates/storefront-bakery/app/not-found.tsx +0 -39
- package/templates/storefront-bakery/app/opensearch.xml/route.ts +0 -37
- package/templates/storefront-bakery/app/orders/[id]/page.tsx +0 -21
- package/templates/storefront-bakery/app/page.tsx +0 -97
- package/templates/storefront-bakery/app/privacy/page.tsx +0 -44
- package/templates/storefront-bakery/app/returns/page.tsx +0 -11
- package/templates/storefront-bakery/app/robots.ts +0 -18
- package/templates/storefront-bakery/app/search/page.tsx +0 -38
- package/templates/storefront-bakery/app/search/search-client.tsx +0 -7
- package/templates/storefront-bakery/app/shipping/page.tsx +0 -16
- package/templates/storefront-bakery/app/shop/page.tsx +0 -31
- package/templates/storefront-bakery/app/shop/shop-client.tsx +0 -27
- package/templates/storefront-bakery/app/signup/page.tsx +0 -17
- package/templates/storefront-bakery/app/sitemap-page/page.tsx +0 -167
- package/templates/storefront-bakery/app/sitemap.ts +0 -62
- package/templates/storefront-bakery/app/terms/page.tsx +0 -44
- package/templates/storefront-bakery/app/track-order/page.tsx +0 -24
- package/templates/storefront-bakery/app/track-order/track-order-form.tsx +0 -69
- package/templates/storefront-bakery/components/account-iframe.tsx +0 -13
- package/templates/storefront-bakery/components/cart-drawer.tsx +0 -14
- package/templates/storefront-bakery/components/cart-pill.tsx +0 -36
- package/templates/storefront-bakery/components/category-grid.tsx +0 -28
- package/templates/storefront-bakery/components/collection-strip.tsx +0 -45
- package/templates/storefront-bakery/components/footer.tsx +0 -148
- package/templates/storefront-bakery/components/header.tsx +0 -43
- package/templates/storefront-bakery/components/hero.tsx +0 -25
- package/templates/storefront-bakery/components/nav-link.tsx +0 -20
- package/templates/storefront-bakery/components/policy-page.tsx +0 -49
- package/templates/storefront-bakery/components/product-modal.tsx +0 -104
- package/templates/storefront-bakery/components/providers.tsx +0 -35
- package/templates/storefront-bakery/components/store-product-card.tsx +0 -87
- package/templates/storefront-bakery/lib/brand.ts +0 -570
- package/templates/storefront-bakery/lib/cart.ts +0 -12
- package/templates/storefront-bakery/next.config.ts +0 -42
- package/templates/storefront-bakery/package.json +0 -35
- package/templates/storefront-bakery/postcss.config.mjs +0 -7
- package/templates/storefront-bakery/tsconfig.json +0 -23
- package/templates/storefront-bakery/vitest.config.ts +0 -9
- package/templates/storefront-fashion/.claude/skills/cimplify-storefront/SKILL.md +0 -145
- package/templates/storefront-fashion/.cursor/rules/cimplify-storefront.mdc +0 -25
- package/templates/storefront-fashion/.env.example +0 -16
- package/templates/storefront-fashion/AGENTS.md +0 -126
- package/templates/storefront-fashion/CLAUDE.md +0 -22
- package/templates/storefront-fashion/README.md +0 -77
- package/templates/storefront-fashion/__tests__/brand.test.ts +0 -4
- package/templates/storefront-fashion/__tests__/cart-flow.test.ts +0 -55
- package/templates/storefront-fashion/__tests__/contract.test.ts +0 -4
- package/templates/storefront-fashion/app/about/page.tsx +0 -41
- package/templates/storefront-fashion/app/accessibility/page.tsx +0 -11
- package/templates/storefront-fashion/app/account/addresses/page.tsx +0 -21
- package/templates/storefront-fashion/app/account/orders/page.tsx +0 -21
- package/templates/storefront-fashion/app/account/page.tsx +0 -22
- package/templates/storefront-fashion/app/account/settings/page.tsx +0 -21
- package/templates/storefront-fashion/app/cart/page.tsx +0 -9
- package/templates/storefront-fashion/app/categories/[slug]/listing-client.tsx +0 -19
- package/templates/storefront-fashion/app/categories/[slug]/page.tsx +0 -130
- package/templates/storefront-fashion/app/checkout/page.tsx +0 -17
- package/templates/storefront-fashion/app/collections/[slug]/listing-client.tsx +0 -20
- package/templates/storefront-fashion/app/collections/[slug]/page.tsx +0 -130
- package/templates/storefront-fashion/app/contact/contact-form.tsx +0 -109
- package/templates/storefront-fashion/app/contact/page.tsx +0 -54
- package/templates/storefront-fashion/app/error.tsx +0 -61
- package/templates/storefront-fashion/app/faq/page.tsx +0 -46
- package/templates/storefront-fashion/app/globals.css +0 -46
- package/templates/storefront-fashion/app/layout.tsx +0 -78
- package/templates/storefront-fashion/app/llms.txt/route.ts +0 -94
- package/templates/storefront-fashion/app/login/page.tsx +0 -17
- package/templates/storefront-fashion/app/lookbook/page.tsx +0 -132
- package/templates/storefront-fashion/app/not-found.tsx +0 -39
- package/templates/storefront-fashion/app/opensearch.xml/route.ts +0 -37
- package/templates/storefront-fashion/app/orders/[id]/page.tsx +0 -24
- package/templates/storefront-fashion/app/page.tsx +0 -183
- package/templates/storefront-fashion/app/privacy/page.tsx +0 -44
- package/templates/storefront-fashion/app/products/[slug]/page.tsx +0 -165
- package/templates/storefront-fashion/app/products/[slug]/product-detail.tsx +0 -70
- package/templates/storefront-fashion/app/returns/page.tsx +0 -11
- package/templates/storefront-fashion/app/robots.ts +0 -18
- package/templates/storefront-fashion/app/search/page.tsx +0 -38
- package/templates/storefront-fashion/app/search/search-client.tsx +0 -7
- package/templates/storefront-fashion/app/shipping/page.tsx +0 -16
- package/templates/storefront-fashion/app/shop/page.tsx +0 -63
- package/templates/storefront-fashion/app/shop/shop-client.tsx +0 -32
- package/templates/storefront-fashion/app/signup/page.tsx +0 -17
- package/templates/storefront-fashion/app/sitemap-page/page.tsx +0 -167
- package/templates/storefront-fashion/app/sitemap.ts +0 -59
- package/templates/storefront-fashion/app/size-guide/page.tsx +0 -155
- package/templates/storefront-fashion/app/terms/page.tsx +0 -44
- package/templates/storefront-fashion/app/track-order/page.tsx +0 -24
- package/templates/storefront-fashion/app/track-order/track-order-form.tsx +0 -69
- package/templates/storefront-fashion/components/account-iframe.tsx +0 -13
- package/templates/storefront-fashion/components/brand-marquee.tsx +0 -27
- package/templates/storefront-fashion/components/cart-drawer.tsx +0 -14
- package/templates/storefront-fashion/components/cart-pill.tsx +0 -36
- package/templates/storefront-fashion/components/category-grid.tsx +0 -28
- package/templates/storefront-fashion/components/category-tiles.tsx +0 -104
- package/templates/storefront-fashion/components/collection-strip.tsx +0 -45
- package/templates/storefront-fashion/components/feature-hero.tsx +0 -82
- package/templates/storefront-fashion/components/footer.tsx +0 -153
- package/templates/storefront-fashion/components/header.tsx +0 -43
- package/templates/storefront-fashion/components/hero.tsx +0 -28
- package/templates/storefront-fashion/components/nav-link.tsx +0 -20
- package/templates/storefront-fashion/components/newsletter.tsx +0 -50
- package/templates/storefront-fashion/components/policy-page.tsx +0 -49
- package/templates/storefront-fashion/components/promo-banner.tsx +0 -41
- package/templates/storefront-fashion/components/providers.tsx +0 -35
- package/templates/storefront-fashion/components/section-heading.tsx +0 -37
- package/templates/storefront-fashion/components/store-product-card.tsx +0 -87
- package/templates/storefront-fashion/components/trade-in-cta.tsx +0 -54
- package/templates/storefront-fashion/components/trust-bar.tsx +0 -66
- package/templates/storefront-fashion/e2e/visual.spec.ts +0 -52
- package/templates/storefront-fashion/lib/brand.ts +0 -518
- package/templates/storefront-fashion/lib/cart.ts +0 -12
- package/templates/storefront-fashion/next.config.ts +0 -42
- package/templates/storefront-fashion/package.json +0 -38
- package/templates/storefront-fashion/playwright.config.ts +0 -48
- package/templates/storefront-fashion/postcss.config.mjs +0 -7
- package/templates/storefront-fashion/tsconfig.json +0 -23
- package/templates/storefront-fashion/vitest.config.ts +0 -9
- package/templates/storefront-grocery/.claude/skills/cimplify-storefront/SKILL.md +0 -145
- package/templates/storefront-grocery/.cursor/rules/cimplify-storefront.mdc +0 -25
- package/templates/storefront-grocery/.env.example +0 -16
- package/templates/storefront-grocery/AGENTS.md +0 -96
- package/templates/storefront-grocery/CLAUDE.md +0 -22
- package/templates/storefront-grocery/README.md +0 -73
- package/templates/storefront-grocery/__tests__/brand.test.ts +0 -4
- package/templates/storefront-grocery/__tests__/cart-flow.test.ts +0 -4
- package/templates/storefront-grocery/__tests__/contract.test.ts +0 -4
- package/templates/storefront-grocery/app/about/page.tsx +0 -38
- package/templates/storefront-grocery/app/accessibility/page.tsx +0 -11
- package/templates/storefront-grocery/app/account/addresses/page.tsx +0 -21
- package/templates/storefront-grocery/app/account/orders/page.tsx +0 -21
- package/templates/storefront-grocery/app/account/page.tsx +0 -22
- package/templates/storefront-grocery/app/account/settings/page.tsx +0 -21
- package/templates/storefront-grocery/app/cart/page.tsx +0 -9
- package/templates/storefront-grocery/app/categories/[slug]/listing-client.tsx +0 -19
- package/templates/storefront-grocery/app/categories/[slug]/page.tsx +0 -118
- package/templates/storefront-grocery/app/checkout/page.tsx +0 -17
- package/templates/storefront-grocery/app/collections/[slug]/listing-client.tsx +0 -20
- package/templates/storefront-grocery/app/collections/[slug]/page.tsx +0 -118
- package/templates/storefront-grocery/app/contact/contact-form.tsx +0 -109
- package/templates/storefront-grocery/app/contact/page.tsx +0 -54
- package/templates/storefront-grocery/app/error.tsx +0 -60
- package/templates/storefront-grocery/app/faq/page.tsx +0 -46
- package/templates/storefront-grocery/app/globals.css +0 -45
- package/templates/storefront-grocery/app/layout.tsx +0 -77
- package/templates/storefront-grocery/app/llms.txt/route.ts +0 -94
- package/templates/storefront-grocery/app/login/page.tsx +0 -17
- package/templates/storefront-grocery/app/not-found.tsx +0 -39
- package/templates/storefront-grocery/app/opensearch.xml/route.ts +0 -37
- package/templates/storefront-grocery/app/orders/[id]/page.tsx +0 -21
- package/templates/storefront-grocery/app/page.tsx +0 -97
- package/templates/storefront-grocery/app/privacy/page.tsx +0 -44
- package/templates/storefront-grocery/app/returns/page.tsx +0 -11
- package/templates/storefront-grocery/app/robots.ts +0 -18
- package/templates/storefront-grocery/app/search/page.tsx +0 -38
- package/templates/storefront-grocery/app/search/search-client.tsx +0 -7
- package/templates/storefront-grocery/app/shipping/page.tsx +0 -16
- package/templates/storefront-grocery/app/shop/page.tsx +0 -31
- package/templates/storefront-grocery/app/shop/shop-client.tsx +0 -27
- package/templates/storefront-grocery/app/signup/page.tsx +0 -17
- package/templates/storefront-grocery/app/sitemap-page/page.tsx +0 -167
- package/templates/storefront-grocery/app/sitemap.ts +0 -62
- package/templates/storefront-grocery/app/terms/page.tsx +0 -44
- package/templates/storefront-grocery/app/track-order/page.tsx +0 -24
- package/templates/storefront-grocery/app/track-order/track-order-form.tsx +0 -69
- package/templates/storefront-grocery/components/account-iframe.tsx +0 -13
- package/templates/storefront-grocery/components/cart-drawer.tsx +0 -14
- package/templates/storefront-grocery/components/cart-pill.tsx +0 -36
- package/templates/storefront-grocery/components/category-grid.tsx +0 -28
- package/templates/storefront-grocery/components/collection-strip.tsx +0 -45
- package/templates/storefront-grocery/components/footer.tsx +0 -148
- package/templates/storefront-grocery/components/header.tsx +0 -43
- package/templates/storefront-grocery/components/hero.tsx +0 -25
- package/templates/storefront-grocery/components/nav-link.tsx +0 -20
- package/templates/storefront-grocery/components/policy-page.tsx +0 -49
- package/templates/storefront-grocery/components/product-modal.tsx +0 -104
- package/templates/storefront-grocery/components/providers.tsx +0 -35
- package/templates/storefront-grocery/components/store-product-card.tsx +0 -87
- package/templates/storefront-grocery/lib/brand.ts +0 -375
- package/templates/storefront-grocery/lib/cart.ts +0 -12
- package/templates/storefront-grocery/next.config.ts +0 -42
- package/templates/storefront-grocery/package.json +0 -35
- package/templates/storefront-grocery/postcss.config.mjs +0 -7
- package/templates/storefront-grocery/tsconfig.json +0 -23
- package/templates/storefront-grocery/vitest.config.ts +0 -9
- package/templates/storefront-restaurant/.claude/skills/cimplify-storefront/SKILL.md +0 -145
- package/templates/storefront-restaurant/.cursor/rules/cimplify-storefront.mdc +0 -25
- package/templates/storefront-restaurant/.env.example +0 -16
- package/templates/storefront-restaurant/AGENTS.md +0 -102
- package/templates/storefront-restaurant/CLAUDE.md +0 -22
- package/templates/storefront-restaurant/README.md +0 -73
- package/templates/storefront-restaurant/__tests__/brand.test.ts +0 -4
- package/templates/storefront-restaurant/__tests__/cart-flow.test.ts +0 -4
- package/templates/storefront-restaurant/__tests__/contract.test.ts +0 -4
- package/templates/storefront-restaurant/app/about/page.tsx +0 -38
- package/templates/storefront-restaurant/app/accessibility/page.tsx +0 -11
- package/templates/storefront-restaurant/app/account/addresses/page.tsx +0 -21
- package/templates/storefront-restaurant/app/account/orders/page.tsx +0 -21
- package/templates/storefront-restaurant/app/account/page.tsx +0 -22
- package/templates/storefront-restaurant/app/account/settings/page.tsx +0 -21
- package/templates/storefront-restaurant/app/cart/page.tsx +0 -9
- package/templates/storefront-restaurant/app/categories/[slug]/listing-client.tsx +0 -19
- package/templates/storefront-restaurant/app/categories/[slug]/page.tsx +0 -118
- package/templates/storefront-restaurant/app/checkout/page.tsx +0 -17
- package/templates/storefront-restaurant/app/collections/[slug]/listing-client.tsx +0 -20
- package/templates/storefront-restaurant/app/collections/[slug]/page.tsx +0 -118
- package/templates/storefront-restaurant/app/contact/contact-form.tsx +0 -109
- package/templates/storefront-restaurant/app/contact/page.tsx +0 -54
- package/templates/storefront-restaurant/app/error.tsx +0 -60
- package/templates/storefront-restaurant/app/faq/page.tsx +0 -46
- package/templates/storefront-restaurant/app/globals.css +0 -44
- package/templates/storefront-restaurant/app/layout.tsx +0 -82
- package/templates/storefront-restaurant/app/llms.txt/route.ts +0 -94
- package/templates/storefront-restaurant/app/login/page.tsx +0 -17
- package/templates/storefront-restaurant/app/not-found.tsx +0 -39
- package/templates/storefront-restaurant/app/opensearch.xml/route.ts +0 -37
- package/templates/storefront-restaurant/app/orders/[id]/page.tsx +0 -21
- package/templates/storefront-restaurant/app/page.tsx +0 -97
- package/templates/storefront-restaurant/app/privacy/page.tsx +0 -44
- package/templates/storefront-restaurant/app/reservations/page.tsx +0 -66
- package/templates/storefront-restaurant/app/reservations/reservations-client.tsx +0 -234
- package/templates/storefront-restaurant/app/returns/page.tsx +0 -11
- package/templates/storefront-restaurant/app/robots.ts +0 -18
- package/templates/storefront-restaurant/app/search/page.tsx +0 -38
- package/templates/storefront-restaurant/app/search/search-client.tsx +0 -7
- package/templates/storefront-restaurant/app/shipping/page.tsx +0 -16
- package/templates/storefront-restaurant/app/shop/page.tsx +0 -31
- package/templates/storefront-restaurant/app/shop/shop-client.tsx +0 -27
- package/templates/storefront-restaurant/app/signup/page.tsx +0 -17
- package/templates/storefront-restaurant/app/sitemap-page/page.tsx +0 -167
- package/templates/storefront-restaurant/app/sitemap.ts +0 -62
- package/templates/storefront-restaurant/app/terms/page.tsx +0 -44
- package/templates/storefront-restaurant/app/track-order/page.tsx +0 -24
- package/templates/storefront-restaurant/app/track-order/track-order-form.tsx +0 -69
- package/templates/storefront-restaurant/components/account-iframe.tsx +0 -13
- package/templates/storefront-restaurant/components/cart-drawer.tsx +0 -14
- package/templates/storefront-restaurant/components/cart-pill.tsx +0 -36
- package/templates/storefront-restaurant/components/category-grid.tsx +0 -28
- package/templates/storefront-restaurant/components/collection-strip.tsx +0 -45
- package/templates/storefront-restaurant/components/footer.tsx +0 -148
- package/templates/storefront-restaurant/components/header.tsx +0 -43
- package/templates/storefront-restaurant/components/hero.tsx +0 -25
- package/templates/storefront-restaurant/components/nav-link.tsx +0 -20
- package/templates/storefront-restaurant/components/policy-page.tsx +0 -49
- package/templates/storefront-restaurant/components/product-modal.tsx +0 -104
- package/templates/storefront-restaurant/components/providers.tsx +0 -35
- package/templates/storefront-restaurant/components/store-product-card.tsx +0 -87
- package/templates/storefront-restaurant/lib/brand.ts +0 -377
- package/templates/storefront-restaurant/lib/cart.ts +0 -12
- package/templates/storefront-restaurant/next.config.ts +0 -42
- package/templates/storefront-restaurant/package.json +0 -35
- package/templates/storefront-restaurant/postcss.config.mjs +0 -7
- package/templates/storefront-restaurant/tsconfig.json +0 -23
- package/templates/storefront-restaurant/vitest.config.ts +0 -9
- package/templates/storefront-retail/.claude/skills/cimplify-storefront/SKILL.md +0 -145
- package/templates/storefront-retail/.cursor/rules/cimplify-storefront.mdc +0 -25
- package/templates/storefront-retail/.env.example +0 -16
- package/templates/storefront-retail/AGENTS.md +0 -117
- package/templates/storefront-retail/CLAUDE.md +0 -22
- package/templates/storefront-retail/README.md +0 -77
- package/templates/storefront-retail/__tests__/brand.test.ts +0 -4
- package/templates/storefront-retail/__tests__/cart-flow.test.ts +0 -4
- package/templates/storefront-retail/__tests__/contract.test.ts +0 -4
- package/templates/storefront-retail/app/about/page.tsx +0 -41
- package/templates/storefront-retail/app/accessibility/page.tsx +0 -11
- package/templates/storefront-retail/app/account/addresses/page.tsx +0 -21
- package/templates/storefront-retail/app/account/orders/page.tsx +0 -21
- package/templates/storefront-retail/app/account/page.tsx +0 -22
- package/templates/storefront-retail/app/account/settings/page.tsx +0 -21
- package/templates/storefront-retail/app/cart/page.tsx +0 -9
- package/templates/storefront-retail/app/categories/[slug]/listing-client.tsx +0 -19
- package/templates/storefront-retail/app/categories/[slug]/page.tsx +0 -130
- package/templates/storefront-retail/app/checkout/page.tsx +0 -17
- package/templates/storefront-retail/app/collections/[slug]/listing-client.tsx +0 -20
- package/templates/storefront-retail/app/collections/[slug]/page.tsx +0 -130
- package/templates/storefront-retail/app/contact/contact-form.tsx +0 -109
- package/templates/storefront-retail/app/contact/page.tsx +0 -54
- package/templates/storefront-retail/app/error.tsx +0 -61
- package/templates/storefront-retail/app/faq/page.tsx +0 -46
- package/templates/storefront-retail/app/globals.css +0 -47
- package/templates/storefront-retail/app/layout.tsx +0 -77
- package/templates/storefront-retail/app/llms.txt/route.ts +0 -94
- package/templates/storefront-retail/app/login/page.tsx +0 -17
- package/templates/storefront-retail/app/not-found.tsx +0 -39
- package/templates/storefront-retail/app/opensearch.xml/route.ts +0 -37
- package/templates/storefront-retail/app/orders/[id]/page.tsx +0 -24
- package/templates/storefront-retail/app/page.tsx +0 -182
- package/templates/storefront-retail/app/privacy/page.tsx +0 -44
- package/templates/storefront-retail/app/products/[slug]/page.tsx +0 -165
- package/templates/storefront-retail/app/products/[slug]/product-detail.tsx +0 -70
- package/templates/storefront-retail/app/returns/page.tsx +0 -11
- package/templates/storefront-retail/app/robots.ts +0 -18
- package/templates/storefront-retail/app/search/page.tsx +0 -38
- package/templates/storefront-retail/app/search/search-client.tsx +0 -7
- package/templates/storefront-retail/app/shipping/page.tsx +0 -16
- package/templates/storefront-retail/app/shop/page.tsx +0 -63
- package/templates/storefront-retail/app/shop/shop-client.tsx +0 -32
- package/templates/storefront-retail/app/signup/page.tsx +0 -17
- package/templates/storefront-retail/app/sitemap-page/page.tsx +0 -167
- package/templates/storefront-retail/app/sitemap.ts +0 -59
- package/templates/storefront-retail/app/terms/page.tsx +0 -44
- package/templates/storefront-retail/app/track-order/page.tsx +0 -24
- package/templates/storefront-retail/app/track-order/track-order-form.tsx +0 -69
- package/templates/storefront-retail/components/account-iframe.tsx +0 -13
- package/templates/storefront-retail/components/brand-marquee.tsx +0 -27
- package/templates/storefront-retail/components/cart-drawer.tsx +0 -14
- package/templates/storefront-retail/components/cart-pill.tsx +0 -36
- package/templates/storefront-retail/components/category-grid.tsx +0 -28
- package/templates/storefront-retail/components/category-tiles.tsx +0 -104
- package/templates/storefront-retail/components/collection-strip.tsx +0 -45
- package/templates/storefront-retail/components/feature-hero.tsx +0 -84
- package/templates/storefront-retail/components/footer.tsx +0 -153
- package/templates/storefront-retail/components/header.tsx +0 -45
- package/templates/storefront-retail/components/hero.tsx +0 -28
- package/templates/storefront-retail/components/nav-link.tsx +0 -20
- package/templates/storefront-retail/components/newsletter.tsx +0 -50
- package/templates/storefront-retail/components/policy-page.tsx +0 -49
- package/templates/storefront-retail/components/promo-banner.tsx +0 -41
- package/templates/storefront-retail/components/providers.tsx +0 -35
- package/templates/storefront-retail/components/section-heading.tsx +0 -37
- package/templates/storefront-retail/components/store-product-card.tsx +0 -87
- package/templates/storefront-retail/components/trade-in-cta.tsx +0 -54
- package/templates/storefront-retail/components/trust-bar.tsx +0 -66
- package/templates/storefront-retail/lib/brand.ts +0 -664
- package/templates/storefront-retail/lib/cart.ts +0 -12
- package/templates/storefront-retail/next.config.ts +0 -42
- package/templates/storefront-retail/package.json +0 -35
- package/templates/storefront-retail/postcss.config.mjs +0 -7
- package/templates/storefront-retail/tsconfig.json +0 -23
- package/templates/storefront-retail/vitest.config.ts +0 -9
- package/templates/storefront-services/.claude/skills/cimplify-storefront/SKILL.md +0 -145
- package/templates/storefront-services/.cursor/rules/cimplify-storefront.mdc +0 -25
- package/templates/storefront-services/.env.example +0 -16
- package/templates/storefront-services/AGENTS.md +0 -101
- package/templates/storefront-services/CLAUDE.md +0 -22
- package/templates/storefront-services/README.md +0 -73
- package/templates/storefront-services/__tests__/brand.test.ts +0 -4
- package/templates/storefront-services/__tests__/cart-flow.test.ts +0 -4
- package/templates/storefront-services/__tests__/contract.test.ts +0 -4
- package/templates/storefront-services/app/about/page.tsx +0 -38
- package/templates/storefront-services/app/accessibility/page.tsx +0 -11
- package/templates/storefront-services/app/account/addresses/page.tsx +0 -21
- package/templates/storefront-services/app/account/orders/page.tsx +0 -21
- package/templates/storefront-services/app/account/page.tsx +0 -22
- package/templates/storefront-services/app/account/settings/page.tsx +0 -21
- package/templates/storefront-services/app/book/book-client.tsx +0 -195
- package/templates/storefront-services/app/book/page.tsx +0 -65
- package/templates/storefront-services/app/cart/page.tsx +0 -9
- package/templates/storefront-services/app/categories/[slug]/listing-client.tsx +0 -19
- package/templates/storefront-services/app/categories/[slug]/page.tsx +0 -118
- package/templates/storefront-services/app/checkout/page.tsx +0 -17
- package/templates/storefront-services/app/collections/[slug]/listing-client.tsx +0 -20
- package/templates/storefront-services/app/collections/[slug]/page.tsx +0 -118
- package/templates/storefront-services/app/contact/contact-form.tsx +0 -109
- package/templates/storefront-services/app/contact/page.tsx +0 -54
- package/templates/storefront-services/app/error.tsx +0 -60
- package/templates/storefront-services/app/faq/page.tsx +0 -46
- package/templates/storefront-services/app/globals.css +0 -45
- package/templates/storefront-services/app/layout.tsx +0 -82
- package/templates/storefront-services/app/llms.txt/route.ts +0 -94
- package/templates/storefront-services/app/login/page.tsx +0 -17
- package/templates/storefront-services/app/not-found.tsx +0 -39
- package/templates/storefront-services/app/opensearch.xml/route.ts +0 -37
- package/templates/storefront-services/app/orders/[id]/page.tsx +0 -21
- package/templates/storefront-services/app/page.tsx +0 -97
- package/templates/storefront-services/app/privacy/page.tsx +0 -44
- package/templates/storefront-services/app/returns/page.tsx +0 -11
- package/templates/storefront-services/app/robots.ts +0 -18
- package/templates/storefront-services/app/search/page.tsx +0 -38
- package/templates/storefront-services/app/search/search-client.tsx +0 -7
- package/templates/storefront-services/app/shipping/page.tsx +0 -16
- package/templates/storefront-services/app/shop/page.tsx +0 -31
- package/templates/storefront-services/app/shop/shop-client.tsx +0 -27
- package/templates/storefront-services/app/signup/page.tsx +0 -17
- package/templates/storefront-services/app/sitemap-page/page.tsx +0 -167
- package/templates/storefront-services/app/sitemap.ts +0 -62
- package/templates/storefront-services/app/terms/page.tsx +0 -44
- package/templates/storefront-services/app/track-order/page.tsx +0 -24
- package/templates/storefront-services/app/track-order/track-order-form.tsx +0 -69
- package/templates/storefront-services/components/account-iframe.tsx +0 -13
- package/templates/storefront-services/components/cart-drawer.tsx +0 -14
- package/templates/storefront-services/components/cart-pill.tsx +0 -36
- package/templates/storefront-services/components/category-grid.tsx +0 -28
- package/templates/storefront-services/components/collection-strip.tsx +0 -45
- package/templates/storefront-services/components/footer.tsx +0 -148
- package/templates/storefront-services/components/header.tsx +0 -43
- package/templates/storefront-services/components/hero.tsx +0 -25
- package/templates/storefront-services/components/nav-link.tsx +0 -20
- package/templates/storefront-services/components/policy-page.tsx +0 -49
- package/templates/storefront-services/components/product-modal.tsx +0 -104
- package/templates/storefront-services/components/providers.tsx +0 -35
- package/templates/storefront-services/components/store-product-card.tsx +0 -87
- package/templates/storefront-services/lib/brand.ts +0 -396
- package/templates/storefront-services/lib/cart.ts +0 -12
- package/templates/storefront-services/next.config.ts +0 -42
- package/templates/storefront-services/package.json +0 -35
- package/templates/storefront-services/postcss.config.mjs +0 -7
- package/templates/storefront-services/tsconfig.json +0 -23
- package/templates/storefront-services/vitest.config.ts +0 -9
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import Link from "next/link";
|
|
4
|
-
import {
|
|
5
|
-
CardVariant,
|
|
6
|
-
FoodProductCard,
|
|
7
|
-
RetailProductCard,
|
|
8
|
-
WholesaleProductCard,
|
|
9
|
-
DigitalProductCard,
|
|
10
|
-
BundleProductCard,
|
|
11
|
-
CompositeProductCard,
|
|
12
|
-
StandardServiceCard,
|
|
13
|
-
CompactServiceCard,
|
|
14
|
-
ScheduleServiceCard,
|
|
15
|
-
RentalServiceCard,
|
|
16
|
-
AccommodationCard,
|
|
17
|
-
LeaseServiceCard,
|
|
18
|
-
SubscriptionCard,
|
|
19
|
-
} from "@cimplify/sdk/react";
|
|
20
|
-
import type { CardLayoutProps } from "@cimplify/sdk/react";
|
|
21
|
-
import type { Product } from "@cimplify/sdk";
|
|
22
|
-
import { PRODUCT_TYPE, RENDER_HINT, DURATION_UNIT } from "@cimplify/sdk";
|
|
23
|
-
|
|
24
|
-
const RENTAL_UNITS = new Set<string>([DURATION_UNIT.Days, DURATION_UNIT.Hours]);
|
|
25
|
-
const LEASE_UNITS = new Set<string>([DURATION_UNIT.Weeks, DURATION_UNIT.Months, DURATION_UNIT.Years]);
|
|
26
|
-
|
|
27
|
-
const VARIANT_CARDS: Record<CardVariant, React.ComponentType<CardLayoutProps>> = {
|
|
28
|
-
[CardVariant.Food]: FoodProductCard,
|
|
29
|
-
[CardVariant.Retail]: RetailProductCard,
|
|
30
|
-
[CardVariant.Wholesale]: WholesaleProductCard,
|
|
31
|
-
[CardVariant.Digital]: DigitalProductCard,
|
|
32
|
-
[CardVariant.Bundle]: BundleProductCard,
|
|
33
|
-
[CardVariant.Composite]: CompositeProductCard,
|
|
34
|
-
[CardVariant.Standard]: StandardServiceCard,
|
|
35
|
-
[CardVariant.Compact]: CompactServiceCard,
|
|
36
|
-
[CardVariant.Schedule]: ScheduleServiceCard,
|
|
37
|
-
[CardVariant.Rental]: RentalServiceCard,
|
|
38
|
-
[CardVariant.Accommodation]: AccommodationCard,
|
|
39
|
-
[CardVariant.Lease]: LeaseServiceCard,
|
|
40
|
-
[CardVariant.Subscription]: SubscriptionCard,
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
function resolveVariant(p: Product): CardVariant {
|
|
44
|
-
if (p.type === PRODUCT_TYPE.Bundle) return CardVariant.Bundle;
|
|
45
|
-
if (p.type === PRODUCT_TYPE.Composite) return CardVariant.Composite;
|
|
46
|
-
if (p.quantity_pricing && p.quantity_pricing.length > 1) return CardVariant.Wholesale;
|
|
47
|
-
if (p.type === PRODUCT_TYPE.Digital) return CardVariant.Digital;
|
|
48
|
-
if (p.type === PRODUCT_TYPE.Service) {
|
|
49
|
-
if (p.duration_unit && RENTAL_UNITS.has(p.duration_unit)) return CardVariant.Rental;
|
|
50
|
-
if (p.duration_unit === DURATION_UNIT.Nights) return CardVariant.Accommodation;
|
|
51
|
-
if (p.duration_unit && LEASE_UNITS.has(p.duration_unit)) return CardVariant.Lease;
|
|
52
|
-
if (p.billing_plans && p.billing_plans.length > 0 && !p.duration_minutes) return CardVariant.Subscription;
|
|
53
|
-
return CardVariant.Standard;
|
|
54
|
-
}
|
|
55
|
-
if (p.render_hint === RENDER_HINT.Food) return CardVariant.Food;
|
|
56
|
-
return CardVariant.Retail;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
interface Props {
|
|
60
|
-
product: Product;
|
|
61
|
-
/** Override the auto-detected card variant. */
|
|
62
|
-
variant?: CardVariant;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
/**
|
|
66
|
-
* Variant-aware product card that opens the URL-driven product modal on
|
|
67
|
-
* click. Uses `next/link` with `?product=<slug>` so the link is statically
|
|
68
|
-
* pre-renderable — no `useSearchParams` dependency means cards don't
|
|
69
|
-
* become dynamic islands. The modal (which already reads `useSearchParams`
|
|
70
|
-
* inside a Suspense boundary in the root layout) handles the rest.
|
|
71
|
-
*/
|
|
72
|
-
export function StoreProductCard({ product, variant }: Props) {
|
|
73
|
-
const slug = product.slug || product.id;
|
|
74
|
-
const Card = VARIANT_CARDS[variant ?? resolveVariant(product)];
|
|
75
|
-
const href = `?product=${encodeURIComponent(slug)}`;
|
|
76
|
-
|
|
77
|
-
return (
|
|
78
|
-
<Card
|
|
79
|
-
product={product}
|
|
80
|
-
renderLink={({ className, children }) => (
|
|
81
|
-
<Link href={href} scroll={false} prefetch={false} className={className}>
|
|
82
|
-
{children}
|
|
83
|
-
</Link>
|
|
84
|
-
)}
|
|
85
|
-
/>
|
|
86
|
-
);
|
|
87
|
-
}
|
|
@@ -1,396 +0,0 @@
|
|
|
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
|
-
import type { SeedName } from "@cimplify/sdk/testing/suite";
|
|
7
|
-
|
|
8
|
-
export interface BrandSocial {
|
|
9
|
-
label: string;
|
|
10
|
-
href: string;
|
|
11
|
-
icon?: "instagram" | "x" | "tiktok" | "facebook" | "youtube" | "linkedin" | "whatsapp";
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export interface BrandFaqEntry { q: string; a: string }
|
|
15
|
-
export interface BrandFaqSection { title: string; items: BrandFaqEntry[] }
|
|
16
|
-
export interface BrandPolicySection {
|
|
17
|
-
heading: string;
|
|
18
|
-
body: string | { intro: string; bullets: string[] };
|
|
19
|
-
}
|
|
20
|
-
export interface BrandSitemapSection { title: string; links: { label: string; href: string }[] }
|
|
21
|
-
|
|
22
|
-
export interface Brand {
|
|
23
|
-
name: string; shortName: string; microTag: string; description: string;
|
|
24
|
-
schemaType:
|
|
25
|
-
| "Store" | "Bakery" | "Restaurant" | "BeautySalon"
|
|
26
|
-
| "GroceryStore" | "LocalBusiness" | "Organization";
|
|
27
|
-
currency: string; locale: string;
|
|
28
|
-
contact: {
|
|
29
|
-
address: string; streetAddress: string; city: string; countryCode: string;
|
|
30
|
-
phone: string; phoneTel: string; email: string; privacyEmail: string;
|
|
31
|
-
supportEmail?: string; businessEmail?: string; hours: string;
|
|
32
|
-
};
|
|
33
|
-
socials: BrandSocial[];
|
|
34
|
-
header: { nav: { label: string; href: string }[] };
|
|
35
|
-
hero: {
|
|
36
|
-
badge: string; title: string; subtitle: string;
|
|
37
|
-
primaryCtaLabel: string;
|
|
38
|
-
secondaryCtaLabel?: string; secondaryCtaHref?: string;
|
|
39
|
-
};
|
|
40
|
-
trustItems?: { label: string; value: string; description: string; iconKey: string }[];
|
|
41
|
-
brandStrip?: { headline: string; brands: string[] };
|
|
42
|
-
promo?: { badge: string; title: string; body: string; ctaLabel: string; ctaHref: string };
|
|
43
|
-
tradeIn?: {
|
|
44
|
-
eyebrow: string; title: string; body: string;
|
|
45
|
-
primaryCtaLabel: string; primaryCtaHref: string;
|
|
46
|
-
secondaryCtaLabel: string; secondaryCtaHref: string;
|
|
47
|
-
steps: { step: string; title: string; body: string }[];
|
|
48
|
-
};
|
|
49
|
-
newsletter: {
|
|
50
|
-
eyebrow: string; title: string; body: string; placeholder: string;
|
|
51
|
-
submitLabel: string; successLabel: string;
|
|
52
|
-
};
|
|
53
|
-
about: {
|
|
54
|
-
eyebrow: string; title: string; paragraphs: string[];
|
|
55
|
-
sections: { heading: string; body: string }[];
|
|
56
|
-
};
|
|
57
|
-
faq: {
|
|
58
|
-
eyebrow: string; title: string; sections: BrandFaqSection[];
|
|
59
|
-
contactPrompt: string; contactEmail: string;
|
|
60
|
-
};
|
|
61
|
-
terms: { eyebrow: string; title: string; lastUpdated: string; sections: BrandPolicySection[] };
|
|
62
|
-
privacy: { eyebrow: string; title: string; lastUpdated: string; sections: BrandPolicySection[] };
|
|
63
|
-
shipping: { eyebrow: string; title: string; lastUpdated: string; sections: BrandPolicySection[] };
|
|
64
|
-
returns: { eyebrow: string; title: string; lastUpdated: string; sections: BrandPolicySection[] };
|
|
65
|
-
accessibility: { eyebrow: string; title: string; lastUpdated: string; sections: BrandPolicySection[] };
|
|
66
|
-
account: {
|
|
67
|
-
loginEyebrow: string; loginTitle: string; loginSubtitle: string;
|
|
68
|
-
signupEyebrow: string; signupTitle: string; signupSubtitle: string;
|
|
69
|
-
accountEyebrow: string; accountTitle: string;
|
|
70
|
-
};
|
|
71
|
-
contactPage: {
|
|
72
|
-
eyebrow: string; title: string; body: string;
|
|
73
|
-
reasons: string[];
|
|
74
|
-
directLines: { label: string; value: string; href: string }[];
|
|
75
|
-
};
|
|
76
|
-
trackOrder: { eyebrow: string; title: string; body: string };
|
|
77
|
-
footer: {
|
|
78
|
-
blurb: string; sitemap: BrandSitemapSection[];
|
|
79
|
-
poweredBy?: { label: string; href: string };
|
|
80
|
-
};
|
|
81
|
-
llms: { summary: string };
|
|
82
|
-
mock: { seed: SeedName; businessId: string };
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
export const brand: Brand = {
|
|
86
|
-
name: "Serene Spa",
|
|
87
|
-
shortName: "Serene",
|
|
88
|
-
microTag: "STUDIO · ACCRA",
|
|
89
|
-
description:
|
|
90
|
-
"Massage, facials, hands & feet — by appointment in Cantonments. Calm, considered, by people who trust touch.",
|
|
91
|
-
schemaType: "BeautySalon",
|
|
92
|
-
|
|
93
|
-
currency: "GHS",
|
|
94
|
-
locale: "en_GH",
|
|
95
|
-
|
|
96
|
-
contact: {
|
|
97
|
-
address: "5 Ebony Close, Cantonments, Accra",
|
|
98
|
-
streetAddress: "5 Ebony Close, Cantonments",
|
|
99
|
-
city: "Accra",
|
|
100
|
-
countryCode: "GH",
|
|
101
|
-
phone: "+233 244 777 222",
|
|
102
|
-
phoneTel: "+233244777222",
|
|
103
|
-
email: "hello@serenespa.test",
|
|
104
|
-
privacyEmail: "privacy@serenespa.test",
|
|
105
|
-
hours: "Tue–Sun · 10am–8pm · closed Mondays",
|
|
106
|
-
},
|
|
107
|
-
|
|
108
|
-
socials: [
|
|
109
|
-
{ label: "Instagram", href: "https://instagram.com/serenespa", icon: "instagram" },
|
|
110
|
-
{ label: "Facebook", href: "https://facebook.com/serenespa", icon: "facebook" },
|
|
111
|
-
{ label: "WhatsApp", href: "https://wa.me/233244777222", icon: "whatsapp" },
|
|
112
|
-
],
|
|
113
|
-
|
|
114
|
-
header: {
|
|
115
|
-
nav: [
|
|
116
|
-
{ label: "Treatments", href: "/shop" },
|
|
117
|
-
{ label: "Memberships", href: "/categories/memberships" },
|
|
118
|
-
{ label: "About", href: "/about" },
|
|
119
|
-
{ label: "FAQ", href: "/faq" },
|
|
120
|
-
],
|
|
121
|
-
},
|
|
122
|
-
|
|
123
|
-
hero: {
|
|
124
|
-
badge: "Now booking · April",
|
|
125
|
-
title: "Slow down.\nLet us take care.",
|
|
126
|
-
subtitle:
|
|
127
|
-
"A small studio in Cantonments. Massage, facials, hands and feet — by qualified, kind hands. Couples rooms, infrared sauna, and herbal tea on arrival.",
|
|
128
|
-
primaryCtaLabel: "Book a treatment",
|
|
129
|
-
secondaryCtaLabel: "See the menu",
|
|
130
|
-
secondaryCtaHref: "/shop",
|
|
131
|
-
},
|
|
132
|
-
|
|
133
|
-
trustItems: [
|
|
134
|
-
{
|
|
135
|
-
label: "Studio",
|
|
136
|
-
value: "Six private rooms",
|
|
137
|
-
description: "Two couples rooms, four singles. All en-suite.",
|
|
138
|
-
iconKey: "verified",
|
|
139
|
-
},
|
|
140
|
-
{
|
|
141
|
-
label: "Therapists",
|
|
142
|
-
value: "8 certified practitioners",
|
|
143
|
-
description: "Average 12 years' practice, all ITEC-trained.",
|
|
144
|
-
iconKey: "support",
|
|
145
|
-
},
|
|
146
|
-
{
|
|
147
|
-
label: "Members",
|
|
148
|
-
value: "20% off · always",
|
|
149
|
-
description: "Monthly membership with two treatments included.",
|
|
150
|
-
iconKey: "warranty",
|
|
151
|
-
},
|
|
152
|
-
{
|
|
153
|
-
label: "Booking",
|
|
154
|
-
value: "Same-week availability",
|
|
155
|
-
description: "Free cancellation up to 24 hours.",
|
|
156
|
-
iconKey: "delivery",
|
|
157
|
-
},
|
|
158
|
-
],
|
|
159
|
-
|
|
160
|
-
promo: {
|
|
161
|
-
badge: "April only",
|
|
162
|
-
title: "The Reset Package — 90 minutes for two.",
|
|
163
|
-
body: "Couples massage, infrared sauna, fresh juice, and a debrief. GH₵850 for two when booked together. Through April.",
|
|
164
|
-
ctaLabel: "Reserve the Reset",
|
|
165
|
-
ctaHref: "/shop",
|
|
166
|
-
},
|
|
167
|
-
|
|
168
|
-
newsletter: {
|
|
169
|
-
eyebrow: "Quiet list",
|
|
170
|
-
title: "A short note, once a month.",
|
|
171
|
-
body: "Seasonal treatments, new therapists, and the discount codes worth knowing about. We don't email more than monthly. Unsubscribe in one click.",
|
|
172
|
-
placeholder: "you@email.com",
|
|
173
|
-
submitLabel: "Stay in touch",
|
|
174
|
-
successLabel: "On the list ✓",
|
|
175
|
-
},
|
|
176
|
-
|
|
177
|
-
about: {
|
|
178
|
-
eyebrow: "About Serene",
|
|
179
|
-
title: "A studio, not a chain.",
|
|
180
|
-
paragraphs: [
|
|
181
|
-
"Serene opened in 2020 above a flower shop on Ebony Close. Eight therapists, six rooms, and a quiet rule: no upselling, no time pressure, no two-treatment minimums. You book what you need; we bring the same care to a 30-minute scalp massage as to a 3-hour reset.",
|
|
182
|
-
"Every therapist is ITEC-trained or holds an equivalent international certification. Several are massage specialists with 15+ years of practice — including post-natal, deep-tissue, and oncology-cleared work.",
|
|
183
|
-
"We use locally-sourced shea, baobab, and coconut bases — pressed in Tamale, blended with essential oils we choose ourselves. No hidden synthetic fragrances, ever.",
|
|
184
|
-
],
|
|
185
|
-
sections: [
|
|
186
|
-
{
|
|
187
|
-
heading: "Memberships",
|
|
188
|
-
body: "Monthly members get 20% off everything, two treatments included, and priority booking. Pause any month, no questions.",
|
|
189
|
-
},
|
|
190
|
-
{
|
|
191
|
-
heading: "Gift cards",
|
|
192
|
-
body: "Available in any amount. Delivered instantly by email — printable, redeemable in person or online, with no expiry.",
|
|
193
|
-
},
|
|
194
|
-
{
|
|
195
|
-
heading: "Visit",
|
|
196
|
-
body: "5 Ebony Close, Cantonments · Tue–Sun, 10am–8pm. Mondays the studio rests.",
|
|
197
|
-
},
|
|
198
|
-
],
|
|
199
|
-
},
|
|
200
|
-
|
|
201
|
-
faq: {
|
|
202
|
-
eyebrow: "Q&A",
|
|
203
|
-
title: "What to expect.",
|
|
204
|
-
sections: [
|
|
205
|
-
{
|
|
206
|
-
title: "Booking & arrival",
|
|
207
|
-
items: [
|
|
208
|
-
{ q: "How do I book?", a: "Online via the Treatments menu, or send a WhatsApp to +233 244 777 222. Most slots are bookable same-week." },
|
|
209
|
-
{ q: "What's your cancellation policy?", a: "Free cancellation up to 24 hours before your appointment. Within 24 hours we charge 50% of the treatment cost." },
|
|
210
|
-
{ q: "When should I arrive?", a: "10 minutes early on your first visit (a brief intake form), 5 minutes for return visits." },
|
|
211
|
-
{ q: "Can I bring a guest?", a: "Couples rooms accommodate two. For solo bookings, guests are welcome to wait in our garden lounge." },
|
|
212
|
-
],
|
|
213
|
-
},
|
|
214
|
-
{
|
|
215
|
-
title: "Treatments",
|
|
216
|
-
items: [
|
|
217
|
-
{ q: "What if I have a medical condition?", a: "Tell us at booking. Some treatments — deep-tissue, hot stone, certain pressure points — aren't suitable during pregnancy, post-surgery, or with specific conditions. Our therapists will adjust or recommend alternatives." },
|
|
218
|
-
{ q: "Are your products allergen-free?", a: "Our base oils are shea, baobab, and coconut — locally pressed. Essential oils we use are listed on the product page; flag any allergies at booking." },
|
|
219
|
-
{ q: "Is tipping expected?", a: "Not expected, always appreciated. Cash or via the kiosk after your treatment." },
|
|
220
|
-
],
|
|
221
|
-
},
|
|
222
|
-
{
|
|
223
|
-
title: "Memberships",
|
|
224
|
-
items: [
|
|
225
|
-
{ q: "How does membership work?", a: "GH₵400/month. Includes two 60-minute treatments per month, 20% off everything else, priority booking, and bring-a-guest credits." },
|
|
226
|
-
{ q: "Can I pause it?", a: "Any month, anytime. Email or message us before the next billing date." },
|
|
227
|
-
{ q: "Do treatments roll over?", a: "Up to one treatment, for up to 60 days." },
|
|
228
|
-
],
|
|
229
|
-
},
|
|
230
|
-
],
|
|
231
|
-
contactPrompt: "Other questions? Message us:",
|
|
232
|
-
contactEmail: "hello@serenespa.test",
|
|
233
|
-
},
|
|
234
|
-
|
|
235
|
-
terms: {
|
|
236
|
-
eyebrow: "Terms of service",
|
|
237
|
-
title: "Terms of Service",
|
|
238
|
-
lastUpdated: "1 May 2026",
|
|
239
|
-
sections: [
|
|
240
|
-
{ heading: "1. Who we are", body: "Serene Spa (\"we\", \"us\") is a wellness studio at 5 Ebony Close, Cantonments, Accra. By booking a treatment you (\"you\", \"client\") agree to these terms." },
|
|
241
|
-
{ heading: "2. Bookings", body: "Slot is held when payment is received (full or 50% deposit). Confirmation by email and SMS." },
|
|
242
|
-
{ heading: "3. Cancellations", body: "Free cancellation up to 24 hours before your appointment. Within 24 hours, 50% of the treatment cost is charged." },
|
|
243
|
-
{ heading: "4. Late arrival", body: "Treatments end at the scheduled time. Late arrival shortens the treatment, not the cost." },
|
|
244
|
-
{ heading: "5. Health & contraindications", body: "You're responsible for declaring relevant medical conditions, allergies, and medications. We may decline or adjust treatment in the interest of your safety." },
|
|
245
|
-
{ heading: "6. Memberships", body: "Monthly subscriptions auto-renew. Pause or cancel any month before the next billing date." },
|
|
246
|
-
{ heading: "7. Liability", body: "Maximum liability for any session is the price of that session. We're not liable for items left in the studio." },
|
|
247
|
-
{ heading: "8. Governing law", body: "These terms are governed by the laws of Ghana." },
|
|
248
|
-
],
|
|
249
|
-
},
|
|
250
|
-
|
|
251
|
-
privacy: {
|
|
252
|
-
eyebrow: "Privacy",
|
|
253
|
-
title: "Privacy Policy",
|
|
254
|
-
lastUpdated: "1 May 2026",
|
|
255
|
-
sections: [
|
|
256
|
-
{ heading: "What we collect", body: "Booking details (name, phone, email, treatment, time slot), the intake form for health-relevant context, and payment data via our processors. We do not store payment cards." },
|
|
257
|
-
{ heading: "How we use it", body: { intro: "We use your data to:", bullets: [
|
|
258
|
-
"Confirm and run your appointments.",
|
|
259
|
-
"Adapt treatments to your stated conditions and preferences.",
|
|
260
|
-
"Send appointment reminders by SMS.",
|
|
261
|
-
"Send our monthly note (only if you opted in).",
|
|
262
|
-
] } },
|
|
263
|
-
{ heading: "Health data", body: "Intake-form information is treated as sensitive. Only the therapist scheduled to see you accesses it; we never share with third parties." },
|
|
264
|
-
{ heading: "Who we share it with", body: "Payment processors (Paystack, Stripe), our SMS provider for reminders. No one else." },
|
|
265
|
-
{ heading: "Your rights", body: "Under the Ghana Data Protection Act, 2012 (Act 843), you can access, correct, or delete your data. Email privacy@serenespa.test." },
|
|
266
|
-
{ heading: "Retention", body: "Booking records: 7 years (tax). Intake forms: 3 years from your last visit." },
|
|
267
|
-
],
|
|
268
|
-
},
|
|
269
|
-
|
|
270
|
-
shipping: {
|
|
271
|
-
eyebrow: "At the studio",
|
|
272
|
-
title: "What to expect",
|
|
273
|
-
lastUpdated: "1 May 2026",
|
|
274
|
-
sections: [
|
|
275
|
-
{ heading: "Arriving", body: "10 minutes early on your first visit (brief intake). 5 minutes for return visits. Tea on arrival." },
|
|
276
|
-
{ heading: "Parking", body: "Free street parking on Ebony Close. Free guest parking inside the compound for couples bookings." },
|
|
277
|
-
{ heading: "What we provide", body: "Robe, slippers, towels, locker. Bring nothing." },
|
|
278
|
-
{ heading: "Couples & guests", body: "Couples rooms accommodate two. For solo bookings, your guest is welcome to wait in the garden lounge." },
|
|
279
|
-
],
|
|
280
|
-
},
|
|
281
|
-
|
|
282
|
-
returns: {
|
|
283
|
-
eyebrow: "Cancellations",
|
|
284
|
-
title: "Cancellations & Refunds",
|
|
285
|
-
lastUpdated: "1 May 2026",
|
|
286
|
-
sections: [
|
|
287
|
-
{ heading: "Cancellation window", body: "Free cancellation up to 24 hours before your appointment. Within 24 hours, we charge 50% of the treatment cost." },
|
|
288
|
-
{ heading: "Late arrival", body: "Treatments end at the scheduled time. Late arrival shortens the treatment, not the cost." },
|
|
289
|
-
{ heading: "Membership pause", body: "Pause any month before the next billing date — no charge, no questions." },
|
|
290
|
-
{ heading: "Gift cards", body: "Non-refundable, no expiry. Transferable to anyone with the code." },
|
|
291
|
-
],
|
|
292
|
-
},
|
|
293
|
-
|
|
294
|
-
accessibility: {
|
|
295
|
-
eyebrow: "Accessibility",
|
|
296
|
-
title: "Accessibility Statement",
|
|
297
|
-
lastUpdated: "1 May 2026",
|
|
298
|
-
sections: [
|
|
299
|
-
{ heading: "At the studio", body: "Step-free entrance, accessible bathroom, and a treatment table that lowers to chair-transfer height. Service dogs welcome." },
|
|
300
|
-
{ heading: "Online", body: "We aim for WCAG 2.1 AA on this site." },
|
|
301
|
-
{ heading: "Reporting issues", body: "Email accessibility@serenespa.test or WhatsApp the studio. We respond within a business day." },
|
|
302
|
-
],
|
|
303
|
-
},
|
|
304
|
-
|
|
305
|
-
account: {
|
|
306
|
-
loginEyebrow: "Welcome back",
|
|
307
|
-
loginTitle: "Sign in to Serene",
|
|
308
|
-
loginSubtitle: "Manage your bookings, your membership, and your preferences.",
|
|
309
|
-
signupEyebrow: "Welcome",
|
|
310
|
-
signupTitle: "Create your account",
|
|
311
|
-
signupSubtitle: "Save your treatment history, your therapist preferences, and your favourite blends.",
|
|
312
|
-
accountEyebrow: "Your account",
|
|
313
|
-
accountTitle: "Welcome back",
|
|
314
|
-
},
|
|
315
|
-
|
|
316
|
-
contactPage: {
|
|
317
|
-
eyebrow: "Contact",
|
|
318
|
-
title: "How can we help?",
|
|
319
|
-
body: "Booking question, gift-card enquiry, or just want to say hello — we'll respond within a business day.",
|
|
320
|
-
reasons: ["Booking question", "Membership", "Gift cards", "Private events", "Press / partnerships", "Something else"],
|
|
321
|
-
directLines: [
|
|
322
|
-
{ label: "Email", value: "hello@serenespa.test", href: "mailto:hello@serenespa.test" },
|
|
323
|
-
{ label: "Phone", value: "+233 244 777 222", href: "tel:+233244777222" },
|
|
324
|
-
{ label: "WhatsApp", value: "+233 244 777 222", href: "https://wa.me/233244777222" },
|
|
325
|
-
],
|
|
326
|
-
},
|
|
327
|
-
|
|
328
|
-
trackOrder: {
|
|
329
|
-
eyebrow: "Find a booking",
|
|
330
|
-
title: "Look up your booking.",
|
|
331
|
-
body: "Enter your booking reference and the email used at booking. We'll show the time, the therapist, and any preparation notes.",
|
|
332
|
-
},
|
|
333
|
-
|
|
334
|
-
footer: {
|
|
335
|
-
blurb:
|
|
336
|
-
"A small spa in Cantonments. Massage, facials, hands & feet — by qualified, kind therapists.",
|
|
337
|
-
sitemap: [
|
|
338
|
-
{
|
|
339
|
-
title: "Visit",
|
|
340
|
-
links: [
|
|
341
|
-
{ label: "Treatments", href: "/shop" },
|
|
342
|
-
{ label: "Memberships", href: "/categories/memberships" },
|
|
343
|
-
{ label: "Gift cards", href: "/about" },
|
|
344
|
-
{ label: "Couples", href: "/about" },
|
|
345
|
-
],
|
|
346
|
-
},
|
|
347
|
-
{
|
|
348
|
-
title: "Studio",
|
|
349
|
-
links: [
|
|
350
|
-
{ label: "About", href: "/about" },
|
|
351
|
-
{ label: "Therapists", href: "/about" },
|
|
352
|
-
{ label: "Press", href: "mailto:press@serenespa.test" },
|
|
353
|
-
],
|
|
354
|
-
},
|
|
355
|
-
{
|
|
356
|
-
title: "Help",
|
|
357
|
-
links: [
|
|
358
|
-
{ label: "Contact", href: "/contact" },
|
|
359
|
-
{ label: "Find a booking", href: "/track-order" },
|
|
360
|
-
{ label: "What to expect", href: "/shipping" },
|
|
361
|
-
{ label: "Cancellations", href: "/returns" },
|
|
362
|
-
{ label: "FAQ", href: "/faq" },
|
|
363
|
-
],
|
|
364
|
-
},
|
|
365
|
-
{
|
|
366
|
-
title: "Account",
|
|
367
|
-
links: [
|
|
368
|
-
{ label: "Sign in", href: "/login" },
|
|
369
|
-
{ label: "Create account", href: "/signup" },
|
|
370
|
-
{ label: "Your bookings", href: "/account/orders" },
|
|
371
|
-
{ label: "Settings", href: "/account/settings" },
|
|
372
|
-
],
|
|
373
|
-
},
|
|
374
|
-
{
|
|
375
|
-
title: "Legal",
|
|
376
|
-
links: [
|
|
377
|
-
{ label: "Terms of Service", href: "/terms" },
|
|
378
|
-
{ label: "Privacy Policy", href: "/privacy" },
|
|
379
|
-
{ label: "Accessibility", href: "/accessibility" },
|
|
380
|
-
{ label: "Sitemap", href: "/sitemap-page" },
|
|
381
|
-
],
|
|
382
|
-
},
|
|
383
|
-
],
|
|
384
|
-
poweredBy: { label: "Cimplify", href: "https://app.cimplify.io" },
|
|
385
|
-
},
|
|
386
|
-
|
|
387
|
-
llms: {
|
|
388
|
-
summary:
|
|
389
|
-
"Serene Spa — small wellness studio in Cantonments, Accra. Massage, facials, hands and feet by appointment. Couples rooms, infrared sauna, monthly membership. Booking via website or WhatsApp.",
|
|
390
|
-
},
|
|
391
|
-
|
|
392
|
-
mock: {
|
|
393
|
-
seed: "services",
|
|
394
|
-
businessId: "bus_serene_spa",
|
|
395
|
-
},
|
|
396
|
-
};
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import { useCart } from "@cimplify/sdk/react";
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Reactive cart count for the header pill. Subscribes to the SDK cart
|
|
7
|
-
* state — updates immediately on add / remove / quantity change.
|
|
8
|
-
*/
|
|
9
|
-
export function useCartCount(): { count: number } {
|
|
10
|
-
const { itemCount } = useCart();
|
|
11
|
-
return { count: itemCount };
|
|
12
|
-
}
|
|
@@ -1,42 +0,0 @@
|
|
|
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
|
-
{ protocol: "https", hostname: "static-tmp.cimplify.io", pathname: "/**" },
|
|
37
|
-
{ protocol: "https", hostname: "cdn.cimplify.io", pathname: "/**" },
|
|
38
|
-
],
|
|
39
|
-
},
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
export default nextConfig;
|
|
@@ -1,35 +0,0 @@
|
|
|
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 services --quiet\" \"next dev\"",
|
|
7
|
-
"dev:storefront": "next dev",
|
|
8
|
-
"dev:mock": "bunx @cimplify/sdk --seed services",
|
|
9
|
-
"build": "next build",
|
|
10
|
-
"start": "next start",
|
|
11
|
-
"typecheck": "tsc --noEmit",
|
|
12
|
-
"test": "vitest",
|
|
13
|
-
"test:run": "vitest run",
|
|
14
|
-
"check:brand": "vitest run __tests__/brand.test.ts",
|
|
15
|
-
"check:cart": "vitest run __tests__/cart-flow.test.ts",
|
|
16
|
-
"check:contract": "vitest run __tests__/contract.test.ts",
|
|
17
|
-
"check": "bun run typecheck && bun run test:run"
|
|
18
|
-
},
|
|
19
|
-
"dependencies": {
|
|
20
|
-
"@cimplify/sdk": "^0.44.34",
|
|
21
|
-
"next": "^16.2.4",
|
|
22
|
-
"react": "^19.0.0",
|
|
23
|
-
"react-dom": "^19.0.0"
|
|
24
|
-
},
|
|
25
|
-
"devDependencies": {
|
|
26
|
-
"@tailwindcss/postcss": "^4.2.4",
|
|
27
|
-
"@types/node": "^22.10.0",
|
|
28
|
-
"@types/react": "^19.0.0",
|
|
29
|
-
"@types/react-dom": "^19.0.0",
|
|
30
|
-
"concurrently": "^9.0.0",
|
|
31
|
-
"tailwindcss": "^4.2.4",
|
|
32
|
-
"typescript": "^5.9.3",
|
|
33
|
-
"vitest": "^4.1.5"
|
|
34
|
-
}
|
|
35
|
-
}
|
|
@@ -1,23 +0,0 @@
|
|
|
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
|
-
}
|