@cimplify/sdk 0.44.33 → 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 -569
- package/dist/cli/commands/dev.mjs +0 -434
- package/dist/cli/commands/domains.mjs +0 -653
- package/dist/cli/commands/env.mjs +0 -610
- package/dist/cli/commands/link.mjs +0 -325
- package/dist/cli/commands/login.mjs +0 -515
- package/dist/cli/commands/logout.mjs +0 -54
- package/dist/cli/commands/logs.mjs +0 -358
- package/dist/cli/commands/projects.mjs +0 -327
- package/dist/cli/commands/rollback.mjs +0 -477
- package/dist/cli/commands/status.mjs +0 -380
- package/dist/cli/commands/unlink.mjs +0 -58
- package/dist/cli/commands/whoami.mjs +0 -234
- package/dist/cli.js +0 -184
- package/dist/dispatcher.mjs +0 -286
- 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,69 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import { useState } from "react";
|
|
4
|
-
import { useRouter } from "next/navigation";
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Guest order tracker. Routes /orders/<id> with the entered id; the
|
|
8
|
-
* post-checkout confirmation page already lives at /orders/[id] so this
|
|
9
|
-
* just sends the visitor there. Replace the redirect with a real lookup
|
|
10
|
-
* (e.g. Cimplify orders API + email-match guard) for production.
|
|
11
|
-
*/
|
|
12
|
-
export function TrackOrderForm() {
|
|
13
|
-
const router = useRouter();
|
|
14
|
-
const [orderId, setOrderId] = useState("");
|
|
15
|
-
const [email, setEmail] = useState("");
|
|
16
|
-
|
|
17
|
-
return (
|
|
18
|
-
<form
|
|
19
|
-
onSubmit={(e) => {
|
|
20
|
-
e.preventDefault();
|
|
21
|
-
if (!orderId.trim()) return;
|
|
22
|
-
router.push(`/orders/${encodeURIComponent(orderId.trim())}`);
|
|
23
|
-
}}
|
|
24
|
-
className="space-y-4 rounded-2xl border border-border bg-card p-6"
|
|
25
|
-
>
|
|
26
|
-
<div>
|
|
27
|
-
<label
|
|
28
|
-
htmlFor="orderId"
|
|
29
|
-
className="text-xs font-semibold uppercase tracking-wider text-muted-foreground block mb-1.5"
|
|
30
|
-
>
|
|
31
|
-
Order number
|
|
32
|
-
</label>
|
|
33
|
-
<input
|
|
34
|
-
id="orderId"
|
|
35
|
-
name="orderId"
|
|
36
|
-
required
|
|
37
|
-
value={orderId}
|
|
38
|
-
onChange={(e) => setOrderId(e.target.value)}
|
|
39
|
-
placeholder="ord_abc123…"
|
|
40
|
-
className="w-full px-4 py-3 rounded-md bg-background border border-border focus:border-primary focus:ring-2 focus:ring-primary/20 outline-none text-sm"
|
|
41
|
-
/>
|
|
42
|
-
</div>
|
|
43
|
-
<div>
|
|
44
|
-
<label
|
|
45
|
-
htmlFor="email"
|
|
46
|
-
className="text-xs font-semibold uppercase tracking-wider text-muted-foreground block mb-1.5"
|
|
47
|
-
>
|
|
48
|
-
Order email
|
|
49
|
-
</label>
|
|
50
|
-
<input
|
|
51
|
-
id="email"
|
|
52
|
-
name="email"
|
|
53
|
-
type="email"
|
|
54
|
-
required
|
|
55
|
-
value={email}
|
|
56
|
-
onChange={(e) => setEmail(e.target.value)}
|
|
57
|
-
placeholder="you@email.com"
|
|
58
|
-
className="w-full px-4 py-3 rounded-md bg-background border border-border focus:border-primary focus:ring-2 focus:ring-primary/20 outline-none text-sm"
|
|
59
|
-
/>
|
|
60
|
-
</div>
|
|
61
|
-
<button
|
|
62
|
-
type="submit"
|
|
63
|
-
className="w-full inline-flex items-center justify-center px-5 py-3 rounded-md bg-primary text-primary-foreground font-semibold text-sm hover:bg-primary/90 transition-colors"
|
|
64
|
-
>
|
|
65
|
-
Track order
|
|
66
|
-
</button>
|
|
67
|
-
</form>
|
|
68
|
-
);
|
|
69
|
-
}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import { CimplifyAccount } from "@cimplify/sdk/react";
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Cimplify Account portal — iframe-mounted UI hosted by Cimplify Link.
|
|
7
|
-
* Handles sign-in, sign-up, OTP, addresses, payment methods, sessions,
|
|
8
|
-
* and order history. The iframe owns auth state; we just choose which
|
|
9
|
-
* `section` to land on.
|
|
10
|
-
*/
|
|
11
|
-
export function AccountIframe({ section }: { section?: string }) {
|
|
12
|
-
return <CimplifyAccount section={section} />;
|
|
13
|
-
}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import { useRouter } from "next/navigation";
|
|
4
|
-
import { CartDrawer as SdkCartDrawer } from "@cimplify/sdk/react";
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Side-drawer cart. Auto-opens when an item is added (via
|
|
8
|
-
* `<CartDrawerProvider>` in `providers.tsx`). The header's cart pill
|
|
9
|
-
* also calls `useCartDrawer().open()` to reveal it on click.
|
|
10
|
-
*/
|
|
11
|
-
export function CartDrawer() {
|
|
12
|
-
const router = useRouter();
|
|
13
|
-
return <SdkCartDrawer onCheckout={() => router.push("/checkout")} />;
|
|
14
|
-
}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import { useCartDrawer } from "@cimplify/sdk/react";
|
|
4
|
-
import { useCartCount } from "@/lib/cart";
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Cart pill — dynamic island. Reads the live cart count via the SDK and
|
|
8
|
-
* opens the side cart drawer on click (instead of navigating to /cart).
|
|
9
|
-
* Wrap in `<Suspense fallback={<CartPillSkeleton/>}>` so the cached
|
|
10
|
-
* header chrome streams without blocking on the cart fetch.
|
|
11
|
-
*/
|
|
12
|
-
export function CartPill() {
|
|
13
|
-
const { count } = useCartCount();
|
|
14
|
-
const { open } = useCartDrawer();
|
|
15
|
-
return (
|
|
16
|
-
<button
|
|
17
|
-
type="button"
|
|
18
|
-
onClick={open}
|
|
19
|
-
aria-label={`Open cart, ${count} ${count === 1 ? "item" : "items"}`}
|
|
20
|
-
className="inline-flex items-center gap-1.5 px-3.5 py-2 rounded-full bg-foreground text-background text-xs font-semibold tracking-wide transition-transform hover:scale-105 cursor-pointer"
|
|
21
|
-
>
|
|
22
|
-
Cart · {count}
|
|
23
|
-
</button>
|
|
24
|
-
);
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
export function CartPillSkeleton() {
|
|
28
|
-
return (
|
|
29
|
-
<span
|
|
30
|
-
aria-hidden
|
|
31
|
-
className="inline-flex items-center gap-1.5 px-3.5 py-2 rounded-full bg-foreground/80 text-background text-xs font-semibold tracking-wide"
|
|
32
|
-
>
|
|
33
|
-
Cart · …
|
|
34
|
-
</span>
|
|
35
|
-
);
|
|
36
|
-
}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import { useRouter } from "next/navigation";
|
|
4
|
-
import { CategoryGrid as SdkCategoryGrid } from "@cimplify/sdk/react";
|
|
5
|
-
import type { Category } from "@cimplify/sdk";
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Homepage category tiles — defers to the SDK's <CategoryGrid/> for layout
|
|
9
|
-
* and accessibility, and routes selections to /categories/:slug.
|
|
10
|
-
*/
|
|
11
|
-
export function CategoryGrid({ categories }: { categories?: Category[] }) {
|
|
12
|
-
const router = useRouter();
|
|
13
|
-
return (
|
|
14
|
-
<section className="max-w-7xl mx-auto px-8 pt-14">
|
|
15
|
-
<h2 className="font-serif text-[28px] font-semibold m-0 mb-5">Browse the menu</h2>
|
|
16
|
-
<SdkCategoryGrid
|
|
17
|
-
categories={categories}
|
|
18
|
-
onSelect={(c) => router.push(`/categories/${c.slug}`)}
|
|
19
|
-
classNames={{
|
|
20
|
-
item: "flex flex-col gap-1 p-6 bg-card border border-border rounded-2xl cursor-pointer text-left transition-all hover:border-primary hover:-translate-y-0.5",
|
|
21
|
-
name: "font-serif text-lg font-semibold text-foreground",
|
|
22
|
-
description: "text-xs text-muted-foreground",
|
|
23
|
-
count: "text-xs text-muted-foreground mt-1",
|
|
24
|
-
}}
|
|
25
|
-
/>
|
|
26
|
-
</section>
|
|
27
|
-
);
|
|
28
|
-
}
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import Link from "next/link";
|
|
2
|
-
import type { Collection, Product } from "@cimplify/sdk";
|
|
3
|
-
import { StoreProductCard } from "./store-product-card";
|
|
4
|
-
|
|
5
|
-
interface CollectionStripProps {
|
|
6
|
-
collection: Collection;
|
|
7
|
-
products: Product[];
|
|
8
|
-
collectionHref?: string;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Horizontal strip of products under a collection title. Cards come from the
|
|
13
|
-
* SDK so every variant (Food, Bundle, Composite, Service, …) renders
|
|
14
|
-
* correctly; clicks open the shared URL-driven product modal.
|
|
15
|
-
*/
|
|
16
|
-
export function CollectionStrip({ collection, products, collectionHref }: CollectionStripProps) {
|
|
17
|
-
if (products.length === 0) return null;
|
|
18
|
-
return (
|
|
19
|
-
<section className="max-w-7xl mx-auto px-8 pt-12">
|
|
20
|
-
<header className="grid grid-cols-[1fr_auto] items-end gap-4 mb-5">
|
|
21
|
-
<h2 className="font-serif text-[28px] font-semibold m-0">{collection.name}</h2>
|
|
22
|
-
{collectionHref && (
|
|
23
|
-
<Link
|
|
24
|
-
href={collectionHref}
|
|
25
|
-
className="text-[13px] font-semibold text-primary hover:underline"
|
|
26
|
-
>
|
|
27
|
-
See all →
|
|
28
|
-
</Link>
|
|
29
|
-
)}
|
|
30
|
-
{collection.description && (
|
|
31
|
-
<p className="col-span-full m-0 mt-1 text-sm text-muted-foreground">
|
|
32
|
-
{collection.description}
|
|
33
|
-
</p>
|
|
34
|
-
)}
|
|
35
|
-
</header>
|
|
36
|
-
<div className="grid grid-flow-col auto-cols-[minmax(220px,1fr)] gap-4 overflow-x-auto snap-x snap-mandatory pb-2">
|
|
37
|
-
{products.slice(0, 8).map((p) => (
|
|
38
|
-
<div key={p.id} className="snap-start">
|
|
39
|
-
<StoreProductCard product={p} />
|
|
40
|
-
</div>
|
|
41
|
-
))}
|
|
42
|
-
</div>
|
|
43
|
-
</section>
|
|
44
|
-
);
|
|
45
|
-
}
|
|
@@ -1,148 +0,0 @@
|
|
|
1
|
-
import Link from "next/link";
|
|
2
|
-
import { brand } from "@/lib/brand";
|
|
3
|
-
|
|
4
|
-
const ICONS: Record<string, React.ReactNode> = {
|
|
5
|
-
instagram: (
|
|
6
|
-
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" aria-hidden className="w-5 h-5">
|
|
7
|
-
<rect x="3" y="3" width="18" height="18" rx="5" />
|
|
8
|
-
<circle cx="12" cy="12" r="4" />
|
|
9
|
-
<circle cx="17.5" cy="6.5" r="0.75" fill="currentColor" />
|
|
10
|
-
</svg>
|
|
11
|
-
),
|
|
12
|
-
x: (
|
|
13
|
-
<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden className="w-5 h-5">
|
|
14
|
-
<path d="M18 2h3l-7.5 8.6L22 22h-6.6l-5-6.5L4 22H1l8-9.2L1.4 2H8l4.6 6 5.4-6z" />
|
|
15
|
-
</svg>
|
|
16
|
-
),
|
|
17
|
-
tiktok: (
|
|
18
|
-
<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden className="w-5 h-5">
|
|
19
|
-
<path d="M16 3v3.5a4.5 4.5 0 0 0 4.5 4.5V14a7.5 7.5 0 0 1-4.5-1.5V16a5 5 0 1 1-5-5v3a2 2 0 1 0 2 2V3z" />
|
|
20
|
-
</svg>
|
|
21
|
-
),
|
|
22
|
-
facebook: (
|
|
23
|
-
<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden className="w-5 h-5">
|
|
24
|
-
<path d="M14 9V7a1 1 0 0 1 1-1h2V3h-3a4 4 0 0 0-4 4v2H8v3h2v9h3v-9h2.5l.5-3H13z" />
|
|
25
|
-
</svg>
|
|
26
|
-
),
|
|
27
|
-
youtube: (
|
|
28
|
-
<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden className="w-5 h-5">
|
|
29
|
-
<path d="M22.5 6.5a2.6 2.6 0 0 0-1.8-1.8C19 4.2 12 4.2 12 4.2s-7 0-8.7.5A2.6 2.6 0 0 0 1.5 6.5C1 8.2 1 12 1 12s0 3.8.5 5.5a2.6 2.6 0 0 0 1.8 1.8C5 19.8 12 19.8 12 19.8s7 0 8.7-.5a2.6 2.6 0 0 0 1.8-1.8c.5-1.7.5-5.5.5-5.5s0-3.8-.5-5.5zM10 15.5v-7l6 3.5-6 3.5z" />
|
|
30
|
-
</svg>
|
|
31
|
-
),
|
|
32
|
-
linkedin: (
|
|
33
|
-
<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden className="w-5 h-5">
|
|
34
|
-
<path d="M4 4h4v16H4zM6 2.5a2 2 0 1 0 0 4 2 2 0 0 0 0-4zM10 8h4v2.5h.1c.6-1.1 2-2.5 4-2.5 4 0 4.9 2.6 4.9 6V20h-4v-5c0-1.5-.5-3-2.3-3-1.7 0-2.5 1.3-2.5 3v5h-4z" />
|
|
35
|
-
</svg>
|
|
36
|
-
),
|
|
37
|
-
whatsapp: (
|
|
38
|
-
<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden className="w-5 h-5">
|
|
39
|
-
<path d="M12 2a10 10 0 0 0-8.6 15l-1.4 5 5.2-1.4A10 10 0 1 0 12 2zm5 14.2c-.2.6-1.2 1.2-1.7 1.2-.5.1-1.1.1-1.7-.1-.4-.1-.9-.3-1.5-.6a8.4 8.4 0 0 1-3.7-3.4c-.7-1-1-1.8-1-2.5 0-.7.4-1.1.6-1.3.2-.2.4-.2.5-.2h.4c.1 0 .3 0 .4.3l.6 1.4c.1.2 0 .3 0 .4l-.3.4-.3.3c-.1.1-.2.2-.1.4.2.4.7 1.1 1.4 1.8.9.8 1.7 1.1 1.9 1.2.2.1.3.1.5-.1l.6-.7c.2-.2.3-.2.5-.1l1.4.7c.2.1.3.2.4.3.1.2.1.6 0 1z" />
|
|
40
|
-
</svg>
|
|
41
|
-
),
|
|
42
|
-
};
|
|
43
|
-
|
|
44
|
-
const FALLBACK_ICON = (
|
|
45
|
-
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" aria-hidden className="w-5 h-5">
|
|
46
|
-
<circle cx="12" cy="12" r="9" />
|
|
47
|
-
</svg>
|
|
48
|
-
);
|
|
49
|
-
|
|
50
|
-
export async function Footer() {
|
|
51
|
-
"use cache";
|
|
52
|
-
const year = new Date().getFullYear();
|
|
53
|
-
return (
|
|
54
|
-
<footer className="mt-12 px-8 py-10 text-xs text-muted-foreground border-t border-border bg-card">
|
|
55
|
-
<div className="max-w-7xl mx-auto">
|
|
56
|
-
<div className="grid gap-10 md:grid-cols-[1.4fr_repeat(4,1fr)]">
|
|
57
|
-
<div>
|
|
58
|
-
<p className="font-serif text-2xl text-foreground m-0 mb-2">{brand.name}</p>
|
|
59
|
-
<p className="leading-relaxed mb-4 max-w-sm">{brand.footer.blurb}</p>
|
|
60
|
-
<address className="not-italic space-y-1">
|
|
61
|
-
<p className="m-0">{brand.contact.address}</p>
|
|
62
|
-
<p className="m-0">
|
|
63
|
-
<a
|
|
64
|
-
href={`tel:${brand.contact.phoneTel}`}
|
|
65
|
-
className="hover:text-foreground transition-colors"
|
|
66
|
-
>
|
|
67
|
-
{brand.contact.phone}
|
|
68
|
-
</a>
|
|
69
|
-
</p>
|
|
70
|
-
<p className="m-0">
|
|
71
|
-
<a
|
|
72
|
-
href={`mailto:${brand.contact.email}`}
|
|
73
|
-
className="hover:text-foreground transition-colors"
|
|
74
|
-
>
|
|
75
|
-
{brand.contact.email}
|
|
76
|
-
</a>
|
|
77
|
-
</p>
|
|
78
|
-
<p className="m-0">{brand.contact.hours}</p>
|
|
79
|
-
</address>
|
|
80
|
-
<div className="flex items-center gap-3 mt-5">
|
|
81
|
-
{brand.socials.map((s) => (
|
|
82
|
-
<a
|
|
83
|
-
key={s.label}
|
|
84
|
-
href={s.href}
|
|
85
|
-
aria-label={s.label}
|
|
86
|
-
target="_blank"
|
|
87
|
-
rel="noopener noreferrer"
|
|
88
|
-
className="inline-flex items-center justify-center w-9 h-9 rounded-full border border-border text-muted-foreground hover:text-foreground hover:border-foreground transition-colors"
|
|
89
|
-
>
|
|
90
|
-
{(s.icon && ICONS[s.icon]) ?? FALLBACK_ICON}
|
|
91
|
-
</a>
|
|
92
|
-
))}
|
|
93
|
-
</div>
|
|
94
|
-
</div>
|
|
95
|
-
{brand.footer.sitemap.map((section) => (
|
|
96
|
-
<nav key={section.title} aria-labelledby={`footer-${section.title}`}>
|
|
97
|
-
<p
|
|
98
|
-
id={`footer-${section.title}`}
|
|
99
|
-
className="font-semibold text-foreground mb-3 text-[13px] uppercase tracking-[0.08em]"
|
|
100
|
-
>
|
|
101
|
-
{section.title}
|
|
102
|
-
</p>
|
|
103
|
-
<ul className="space-y-2 m-0 p-0 list-none">
|
|
104
|
-
{section.links.map((link) => (
|
|
105
|
-
<li key={link.label}>
|
|
106
|
-
<Link
|
|
107
|
-
href={link.href}
|
|
108
|
-
className="hover:text-foreground transition-colors"
|
|
109
|
-
>
|
|
110
|
-
{link.label}
|
|
111
|
-
</Link>
|
|
112
|
-
</li>
|
|
113
|
-
))}
|
|
114
|
-
</ul>
|
|
115
|
-
</nav>
|
|
116
|
-
))}
|
|
117
|
-
</div>
|
|
118
|
-
<div className="mt-12 pt-6 border-t border-border flex flex-col sm:flex-row items-center justify-between gap-3">
|
|
119
|
-
<p className="m-0">© {year} {brand.name}. All rights reserved.</p>
|
|
120
|
-
{brand.footer.poweredBy && (
|
|
121
|
-
<p className="m-0 inline-flex items-center gap-1.5">
|
|
122
|
-
<span className="text-muted-foreground/80">Powered by</span>
|
|
123
|
-
<a
|
|
124
|
-
href={brand.footer.poweredBy.href}
|
|
125
|
-
target="_blank"
|
|
126
|
-
rel="noopener noreferrer"
|
|
127
|
-
aria-label={brand.footer.poweredBy.label}
|
|
128
|
-
className="inline-flex items-center gap-1 font-serif text-foreground hover:text-primary transition-colors"
|
|
129
|
-
>
|
|
130
|
-
<span className="font-semibold tracking-tight">{brand.footer.poweredBy.label}</span>
|
|
131
|
-
<svg
|
|
132
|
-
viewBox="0 0 12 12"
|
|
133
|
-
aria-hidden
|
|
134
|
-
className="w-3 h-3 opacity-70"
|
|
135
|
-
fill="none"
|
|
136
|
-
stroke="currentColor"
|
|
137
|
-
strokeWidth="1.5"
|
|
138
|
-
>
|
|
139
|
-
<path d="M3 9L9 3M9 3H4M9 3v5" strokeLinecap="round" strokeLinejoin="round" />
|
|
140
|
-
</svg>
|
|
141
|
-
</a>
|
|
142
|
-
</p>
|
|
143
|
-
)}
|
|
144
|
-
</div>
|
|
145
|
-
</div>
|
|
146
|
-
</footer>
|
|
147
|
-
);
|
|
148
|
-
}
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import Link from "next/link";
|
|
2
|
-
import { Suspense } from "react";
|
|
3
|
-
import { NavLink } from "./nav-link";
|
|
4
|
-
import { CartPill, CartPillSkeleton } from "./cart-pill";
|
|
5
|
-
import { brand } from "@/lib/brand";
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Server-rendered header chrome. Brand mark + nav layout streams from the
|
|
9
|
-
* cache; the active-link styling and live cart count are dynamic islands
|
|
10
|
-
* mounted in their own Suspense boundaries so the chrome never blocks.
|
|
11
|
-
*/
|
|
12
|
-
export function Header() {
|
|
13
|
-
return (
|
|
14
|
-
<header className="sticky top-0 z-30 flex items-center justify-between px-8 py-4 border-b border-border bg-background/90 backdrop-blur-md">
|
|
15
|
-
<Link href="/" className="flex items-baseline gap-2">
|
|
16
|
-
<span className="font-serif text-[22px] font-semibold -tracking-[0.02em]">
|
|
17
|
-
{brand.shortName}
|
|
18
|
-
</span>
|
|
19
|
-
<span className="text-[11px] font-medium uppercase tracking-[0.12em] text-muted-foreground">
|
|
20
|
-
{brand.microTag}
|
|
21
|
-
</span>
|
|
22
|
-
</Link>
|
|
23
|
-
<nav className="flex items-center gap-6">
|
|
24
|
-
{brand.header.nav.map((link) => (
|
|
25
|
-
<Suspense key={link.href} fallback={<NavLinkFallback>{link.label}</NavLinkFallback>}>
|
|
26
|
-
<NavLink href={link.href}>{link.label}</NavLink>
|
|
27
|
-
</Suspense>
|
|
28
|
-
))}
|
|
29
|
-
<Suspense fallback={<CartPillSkeleton />}>
|
|
30
|
-
<CartPill />
|
|
31
|
-
</Suspense>
|
|
32
|
-
</nav>
|
|
33
|
-
</header>
|
|
34
|
-
);
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
function NavLinkFallback({ children }: { children: React.ReactNode }) {
|
|
38
|
-
return (
|
|
39
|
-
<span className="text-[13px] font-medium tracking-wide text-muted-foreground">
|
|
40
|
-
{children}
|
|
41
|
-
</span>
|
|
42
|
-
);
|
|
43
|
-
}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
interface HeroProps {
|
|
2
|
-
badge?: string;
|
|
3
|
-
title: string;
|
|
4
|
-
subtitle?: string;
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
export function Hero({ badge, title, subtitle }: HeroProps) {
|
|
8
|
-
return (
|
|
9
|
-
<section className="px-8 py-16 text-center bg-gradient-to-b from-accent to-background">
|
|
10
|
-
{badge && (
|
|
11
|
-
<span className="inline-block mb-4 px-3.5 py-1.5 rounded-full bg-card border border-accent text-accent-foreground text-[11px] font-semibold uppercase tracking-[0.12em]">
|
|
12
|
-
{badge}
|
|
13
|
-
</span>
|
|
14
|
-
)}
|
|
15
|
-
<h1 className="font-serif text-[clamp(2.25rem,5vw,3.5rem)] font-semibold m-0 -tracking-[0.02em]">
|
|
16
|
-
{title}
|
|
17
|
-
</h1>
|
|
18
|
-
{subtitle && (
|
|
19
|
-
<p className="mx-auto mt-2 max-w-xl text-base text-muted-foreground">
|
|
20
|
-
{subtitle}
|
|
21
|
-
</p>
|
|
22
|
-
)}
|
|
23
|
-
</section>
|
|
24
|
-
);
|
|
25
|
-
}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import Link from "next/link";
|
|
4
|
-
import { usePathname } from "next/navigation";
|
|
5
|
-
|
|
6
|
-
export function NavLink({ href, children }: { href: string; children: React.ReactNode }) {
|
|
7
|
-
const pathname = usePathname();
|
|
8
|
-
const active = pathname === href;
|
|
9
|
-
return (
|
|
10
|
-
<Link
|
|
11
|
-
href={href}
|
|
12
|
-
className={[
|
|
13
|
-
"text-[13px] font-medium tracking-wide transition-colors",
|
|
14
|
-
active ? "text-primary" : "text-muted-foreground hover:text-foreground",
|
|
15
|
-
].join(" ")}
|
|
16
|
-
>
|
|
17
|
-
{children}
|
|
18
|
-
</Link>
|
|
19
|
-
);
|
|
20
|
-
}
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import type { BrandPolicySection } from "@/lib/brand";
|
|
2
|
-
|
|
3
|
-
interface PolicyShape {
|
|
4
|
-
eyebrow: string;
|
|
5
|
-
title: string;
|
|
6
|
-
lastUpdated?: string;
|
|
7
|
-
sections: BrandPolicySection[];
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Shared layout for shipping / returns / accessibility / terms / privacy.
|
|
12
|
-
* Reads a `{ eyebrow, title, lastUpdated, sections[] }` block from brand.
|
|
13
|
-
*/
|
|
14
|
-
export function PolicyPage({ policy }: { policy: PolicyShape }) {
|
|
15
|
-
return (
|
|
16
|
-
<article className="max-w-3xl mx-auto px-8 py-16 prose prose-lg max-w-none">
|
|
17
|
-
<p className="text-[11px] font-semibold uppercase tracking-[0.16em] text-primary mb-2 not-prose">
|
|
18
|
-
{policy.eyebrow}
|
|
19
|
-
</p>
|
|
20
|
-
<h1 className="text-[clamp(2.25rem,5vw,3.5rem)] font-semibold mb-2 -tracking-[0.02em]">
|
|
21
|
-
{policy.title}
|
|
22
|
-
</h1>
|
|
23
|
-
{policy.lastUpdated && (
|
|
24
|
-
<p className="text-sm text-muted-foreground not-prose mb-10">
|
|
25
|
-
Last updated: {policy.lastUpdated}
|
|
26
|
-
</p>
|
|
27
|
-
)}
|
|
28
|
-
<section className="space-y-5 leading-relaxed text-foreground/90">
|
|
29
|
-
{policy.sections.map((s) => (
|
|
30
|
-
<div key={s.heading}>
|
|
31
|
-
<h2 className="text-2xl font-semibold mt-0">{s.heading}</h2>
|
|
32
|
-
{typeof s.body === "string" ? (
|
|
33
|
-
<p>{s.body}</p>
|
|
34
|
-
) : (
|
|
35
|
-
<>
|
|
36
|
-
<p>{s.body.intro}</p>
|
|
37
|
-
<ul className="list-disc pl-6 space-y-2">
|
|
38
|
-
{s.body.bullets.map((b) => (
|
|
39
|
-
<li key={b}>{b}</li>
|
|
40
|
-
))}
|
|
41
|
-
</ul>
|
|
42
|
-
</>
|
|
43
|
-
)}
|
|
44
|
-
</div>
|
|
45
|
-
))}
|
|
46
|
-
</section>
|
|
47
|
-
</article>
|
|
48
|
-
);
|
|
49
|
-
}
|
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import { useEffect } from "react";
|
|
4
|
-
import Image from "next/image";
|
|
5
|
-
import { useRouter, useSearchParams, usePathname } from "next/navigation";
|
|
6
|
-
import { ProductSheet, useProduct, useCart } from "@cimplify/sdk/react";
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* URL-driven product modal. Reads `?product=<slug>` and renders the SDK's
|
|
10
|
-
* `<ProductSheet/>` — vertical layout with image-on-top, then header, then
|
|
11
|
-
* the variant/add-on/composite/bundle customizer. Closing the modal clears
|
|
12
|
-
* the search param. Deep-linkable and survives reloads.
|
|
13
|
-
*/
|
|
14
|
-
export function ProductModal() {
|
|
15
|
-
const router = useRouter();
|
|
16
|
-
const pathname = usePathname();
|
|
17
|
-
const searchParams = useSearchParams();
|
|
18
|
-
const slug = searchParams?.get("product") ?? null;
|
|
19
|
-
|
|
20
|
-
const { product } = useProduct(slug ?? "", { enabled: Boolean(slug) });
|
|
21
|
-
const { addItem } = useCart();
|
|
22
|
-
|
|
23
|
-
useEffect(() => {
|
|
24
|
-
if (!slug) return;
|
|
25
|
-
const original = document.body.style.overflow;
|
|
26
|
-
document.body.style.overflow = "hidden";
|
|
27
|
-
return () => {
|
|
28
|
-
document.body.style.overflow = original;
|
|
29
|
-
};
|
|
30
|
-
}, [slug]);
|
|
31
|
-
|
|
32
|
-
useEffect(() => {
|
|
33
|
-
if (!slug) return;
|
|
34
|
-
const onKey = (e: KeyboardEvent) => {
|
|
35
|
-
if (e.key === "Escape") close();
|
|
36
|
-
};
|
|
37
|
-
window.addEventListener("keydown", onKey);
|
|
38
|
-
return () => window.removeEventListener("keydown", onKey);
|
|
39
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
40
|
-
}, [slug]);
|
|
41
|
-
|
|
42
|
-
if (!slug) return null;
|
|
43
|
-
|
|
44
|
-
function close() {
|
|
45
|
-
const next = new URLSearchParams(searchParams?.toString() ?? "");
|
|
46
|
-
next.delete("product");
|
|
47
|
-
const qs = next.toString();
|
|
48
|
-
router.replace(qs ? `${pathname}?${qs}` : pathname, { scroll: false });
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
return (
|
|
52
|
-
<div
|
|
53
|
-
role="dialog"
|
|
54
|
-
aria-modal="true"
|
|
55
|
-
onClick={close}
|
|
56
|
-
className="fixed inset-0 z-[100] flex items-end sm:items-center justify-center sm:p-6 bg-foreground/50 backdrop-blur-sm"
|
|
57
|
-
>
|
|
58
|
-
<div
|
|
59
|
-
onClick={(e) => e.stopPropagation()}
|
|
60
|
-
className="relative w-full sm:max-w-lg max-h-[92vh] overflow-auto bg-card sm:rounded-3xl rounded-t-3xl shadow-2xl"
|
|
61
|
-
>
|
|
62
|
-
<button
|
|
63
|
-
onClick={close}
|
|
64
|
-
aria-label="Close product details"
|
|
65
|
-
className="absolute top-4 right-4 z-10 w-9 h-9 rounded-full bg-card border border-border text-sm cursor-pointer transition-colors hover:bg-muted"
|
|
66
|
-
>
|
|
67
|
-
✕
|
|
68
|
-
</button>
|
|
69
|
-
{product ? (
|
|
70
|
-
<ProductSheet
|
|
71
|
-
product={product}
|
|
72
|
-
onClose={close}
|
|
73
|
-
onAddToCart={async (p, qty, options) => {
|
|
74
|
-
await addItem(p, qty, options);
|
|
75
|
-
close();
|
|
76
|
-
}}
|
|
77
|
-
renderImage={({ src, alt, className }) => (
|
|
78
|
-
<Image
|
|
79
|
-
src={src}
|
|
80
|
-
alt={alt}
|
|
81
|
-
width={1200}
|
|
82
|
-
height={900}
|
|
83
|
-
className={className}
|
|
84
|
-
style={{ width: "100%", height: "auto", objectFit: "cover" }}
|
|
85
|
-
priority
|
|
86
|
-
/>
|
|
87
|
-
)}
|
|
88
|
-
classNames={{
|
|
89
|
-
root: "p-6 sm:p-8 gap-4",
|
|
90
|
-
image: "rounded-2xl overflow-hidden -mx-6 sm:-mx-8 -mt-6 sm:-mt-8 mb-2",
|
|
91
|
-
header: "flex items-baseline justify-between gap-4",
|
|
92
|
-
name: "font-serif text-2xl font-semibold m-0",
|
|
93
|
-
price: "text-lg font-semibold text-primary",
|
|
94
|
-
description: "text-sm text-muted-foreground leading-relaxed",
|
|
95
|
-
customizer: "pt-2",
|
|
96
|
-
}}
|
|
97
|
-
/>
|
|
98
|
-
) : (
|
|
99
|
-
<div className="p-8 text-center text-muted-foreground">Loading…</div>
|
|
100
|
-
)}
|
|
101
|
-
</div>
|
|
102
|
-
</div>
|
|
103
|
-
);
|
|
104
|
-
}
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import { useMemo, type ReactNode } from "react";
|
|
4
|
-
import { createCimplifyClient } from "@cimplify/sdk";
|
|
5
|
-
import { CimplifyProvider, CartDrawerProvider } from "@cimplify/sdk/react";
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Boots the Cimplify SDK client once on the client-side and exposes it via
|
|
9
|
-
* <CimplifyProvider/>.
|
|
10
|
-
*
|
|
11
|
-
* Base-URL resolution:
|
|
12
|
-
* 1) If NEXT_PUBLIC_CIMPLIFY_API_URL is set, use it verbatim.
|
|
13
|
-
* 2) Otherwise use the current origin so requests flow through the
|
|
14
|
-
* Next.js rewrite in `next.config.ts` to the mock at :8787 (no CORS).
|
|
15
|
-
* 3) Fall back to 127.0.0.1:8787 only during SSR, when there's no window.
|
|
16
|
-
*/
|
|
17
|
-
export function Providers({ children }: { children: ReactNode }) {
|
|
18
|
-
const client = useMemo(() => {
|
|
19
|
-
const baseUrl =
|
|
20
|
-
process.env.NEXT_PUBLIC_CIMPLIFY_API_URL?.trim() ||
|
|
21
|
-
(typeof window !== "undefined" ? window.location.origin : "http://127.0.0.1:8787");
|
|
22
|
-
const publicKey = process.env.NEXT_PUBLIC_CIMPLIFY_PUBLIC_KEY ?? "mock-dev";
|
|
23
|
-
return createCimplifyClient({
|
|
24
|
-
baseUrl,
|
|
25
|
-
publicKey,
|
|
26
|
-
suppressPublicKeyWarning: true,
|
|
27
|
-
});
|
|
28
|
-
}, []);
|
|
29
|
-
|
|
30
|
-
return (
|
|
31
|
-
<CimplifyProvider client={client}>
|
|
32
|
-
<CartDrawerProvider>{children}</CartDrawerProvider>
|
|
33
|
-
</CimplifyProvider>
|
|
34
|
-
);
|
|
35
|
-
}
|