@cimplify/sdk 0.40.1 → 0.42.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/commands/deploy.mjs +561 -0
- package/dist/cli/commands/dev.mjs +434 -0
- package/dist/cli/commands/domains.mjs +479 -0
- package/dist/cli/commands/env.mjs +610 -0
- package/dist/cli/commands/link.mjs +325 -0
- package/dist/cli/commands/login.mjs +515 -0
- package/dist/cli/commands/logout.mjs +54 -0
- package/dist/cli/commands/logs.mjs +358 -0
- package/dist/cli/commands/projects.mjs +327 -0
- package/dist/cli/commands/rollback.mjs +477 -0
- package/dist/cli/commands/status.mjs +380 -0
- package/dist/cli/commands/unlink.mjs +58 -0
- package/dist/cli/commands/whoami.mjs +234 -0
- package/dist/dispatcher.mjs +94 -2
- package/dist/styles.css +1 -1
- package/package.json +1 -1
- package/templates/storefront-bakery/.env.example +5 -0
- package/templates/storefront-bakery/AGENTS.md +57 -0
- package/templates/storefront-bakery/app/about/page.tsx +21 -44
- package/templates/storefront-bakery/app/accessibility/page.tsx +11 -0
- package/templates/storefront-bakery/app/account/addresses/page.tsx +21 -0
- package/templates/storefront-bakery/app/account/orders/page.tsx +21 -0
- package/templates/storefront-bakery/app/account/page.tsx +22 -0
- package/templates/storefront-bakery/app/account/settings/page.tsx +21 -0
- package/templates/storefront-bakery/app/categories/[slug]/page.tsx +2 -1
- package/templates/storefront-bakery/app/collections/[slug]/page.tsx +2 -1
- package/templates/storefront-bakery/app/contact/contact-form.tsx +109 -0
- package/templates/storefront-bakery/app/contact/page.tsx +54 -0
- package/templates/storefront-bakery/app/error.tsx +60 -0
- package/templates/storefront-bakery/app/faq/page.tsx +13 -89
- package/templates/storefront-bakery/app/layout.tsx +37 -2
- package/templates/storefront-bakery/app/llms.txt/route.ts +94 -0
- package/templates/storefront-bakery/app/login/page.tsx +17 -0
- package/templates/storefront-bakery/app/not-found.tsx +39 -0
- package/templates/storefront-bakery/app/opensearch.xml/route.ts +37 -0
- package/templates/storefront-bakery/app/page.tsx +6 -6
- package/templates/storefront-bakery/app/privacy/page.tsx +24 -68
- package/templates/storefront-bakery/app/returns/page.tsx +11 -0
- package/templates/storefront-bakery/app/robots.ts +18 -0
- package/templates/storefront-bakery/app/search/page.tsx +38 -0
- package/templates/storefront-bakery/app/search/search-client.tsx +7 -0
- package/templates/storefront-bakery/app/shipping/page.tsx +16 -0
- package/templates/storefront-bakery/app/shop/page.tsx +3 -2
- package/templates/storefront-bakery/app/signup/page.tsx +17 -0
- package/templates/storefront-bakery/app/sitemap-page/page.tsx +167 -0
- package/templates/storefront-bakery/app/sitemap.ts +62 -0
- package/templates/storefront-bakery/app/terms/page.tsx +24 -82
- package/templates/storefront-bakery/app/track-order/page.tsx +24 -0
- package/templates/storefront-bakery/app/track-order/track-order-form.tsx +69 -0
- package/templates/storefront-bakery/components/account-iframe.tsx +13 -0
- package/templates/storefront-bakery/components/footer.tsx +88 -130
- package/templates/storefront-bakery/components/header.tsx +8 -16
- package/templates/storefront-bakery/components/policy-page.tsx +49 -0
- package/templates/storefront-bakery/lib/brand.ts +568 -0
- package/templates/storefront-fashion/.env.example +16 -0
- package/templates/storefront-fashion/AGENTS.md +52 -0
- package/templates/storefront-fashion/README.md +77 -0
- package/templates/storefront-fashion/app/about/page.tsx +41 -0
- package/templates/storefront-fashion/app/accessibility/page.tsx +11 -0
- package/templates/storefront-fashion/app/account/addresses/page.tsx +21 -0
- package/templates/storefront-fashion/app/account/orders/page.tsx +21 -0
- package/templates/storefront-fashion/app/account/page.tsx +22 -0
- package/templates/storefront-fashion/app/account/settings/page.tsx +21 -0
- package/templates/storefront-fashion/app/cart/page.tsx +9 -0
- package/templates/storefront-fashion/app/categories/[slug]/listing-client.tsx +19 -0
- package/templates/storefront-fashion/app/categories/[slug]/page.tsx +130 -0
- package/templates/storefront-fashion/app/checkout/page.tsx +17 -0
- package/templates/storefront-fashion/app/collections/[slug]/listing-client.tsx +20 -0
- package/templates/storefront-fashion/app/collections/[slug]/page.tsx +130 -0
- package/templates/storefront-fashion/app/contact/contact-form.tsx +109 -0
- package/templates/storefront-fashion/app/contact/page.tsx +54 -0
- package/templates/storefront-fashion/app/error.tsx +61 -0
- package/templates/storefront-fashion/app/faq/page.tsx +46 -0
- package/templates/storefront-fashion/app/globals.css +46 -0
- package/templates/storefront-fashion/app/layout.tsx +76 -0
- package/templates/storefront-fashion/app/llms.txt/route.ts +94 -0
- package/templates/storefront-fashion/app/login/page.tsx +17 -0
- package/templates/storefront-fashion/app/lookbook/page.tsx +132 -0
- package/templates/storefront-fashion/app/not-found.tsx +39 -0
- package/templates/storefront-fashion/app/opensearch.xml/route.ts +37 -0
- package/templates/storefront-fashion/app/orders/[id]/page.tsx +24 -0
- package/templates/storefront-fashion/app/page.tsx +183 -0
- package/templates/storefront-fashion/app/privacy/page.tsx +44 -0
- package/templates/storefront-fashion/app/products/[slug]/page.tsx +165 -0
- package/templates/storefront-fashion/app/products/[slug]/product-detail.tsx +71 -0
- package/templates/storefront-fashion/app/returns/page.tsx +11 -0
- package/templates/storefront-fashion/app/robots.ts +18 -0
- package/templates/storefront-fashion/app/search/page.tsx +38 -0
- package/templates/storefront-fashion/app/search/search-client.tsx +7 -0
- package/templates/storefront-fashion/app/shipping/page.tsx +16 -0
- package/templates/storefront-fashion/app/shop/page.tsx +63 -0
- package/templates/storefront-fashion/app/shop/shop-client.tsx +32 -0
- package/templates/storefront-fashion/app/signup/page.tsx +17 -0
- package/templates/storefront-fashion/app/sitemap-page/page.tsx +167 -0
- package/templates/storefront-fashion/app/sitemap.ts +59 -0
- package/templates/storefront-fashion/app/size-guide/page.tsx +155 -0
- package/templates/storefront-fashion/app/terms/page.tsx +44 -0
- package/templates/storefront-fashion/app/track-order/page.tsx +24 -0
- package/templates/storefront-fashion/app/track-order/track-order-form.tsx +69 -0
- package/templates/storefront-fashion/components/account-iframe.tsx +13 -0
- package/templates/storefront-fashion/components/brand-marquee.tsx +27 -0
- package/templates/storefront-fashion/components/cart-pill.tsx +32 -0
- package/templates/storefront-fashion/components/category-grid.tsx +28 -0
- package/templates/storefront-fashion/components/category-tiles.tsx +104 -0
- package/templates/storefront-fashion/components/collection-strip.tsx +45 -0
- package/templates/storefront-fashion/components/feature-hero.tsx +82 -0
- package/templates/storefront-fashion/components/footer.tsx +153 -0
- package/templates/storefront-fashion/components/header.tsx +43 -0
- package/templates/storefront-fashion/components/hero.tsx +28 -0
- package/templates/storefront-fashion/components/nav-link.tsx +20 -0
- package/templates/storefront-fashion/components/newsletter.tsx +50 -0
- package/templates/storefront-fashion/components/policy-page.tsx +49 -0
- package/templates/storefront-fashion/components/promo-banner.tsx +41 -0
- package/templates/storefront-fashion/components/providers.tsx +31 -0
- package/templates/storefront-fashion/components/section-heading.tsx +37 -0
- package/templates/storefront-fashion/components/store-product-card.tsx +83 -0
- package/templates/storefront-fashion/components/trade-in-cta.tsx +54 -0
- package/templates/storefront-fashion/components/trust-bar.tsx +66 -0
- package/templates/storefront-fashion/lib/brand.ts +516 -0
- package/templates/storefront-fashion/lib/cart.ts +27 -0
- package/templates/storefront-fashion/next.config.ts +40 -0
- package/templates/storefront-fashion/package.json +28 -0
- package/templates/storefront-fashion/postcss.config.mjs +7 -0
- package/templates/storefront-fashion/tsconfig.json +23 -0
- package/templates/storefront-grocery/.env.example +16 -0
- package/templates/storefront-grocery/AGENTS.md +39 -0
- package/templates/storefront-grocery/README.md +73 -0
- package/templates/storefront-grocery/app/about/page.tsx +38 -0
- package/templates/storefront-grocery/app/accessibility/page.tsx +11 -0
- package/templates/storefront-grocery/app/account/addresses/page.tsx +21 -0
- package/templates/storefront-grocery/app/account/orders/page.tsx +21 -0
- package/templates/storefront-grocery/app/account/page.tsx +22 -0
- package/templates/storefront-grocery/app/account/settings/page.tsx +21 -0
- package/templates/storefront-grocery/app/cart/page.tsx +9 -0
- package/templates/storefront-grocery/app/categories/[slug]/listing-client.tsx +19 -0
- package/templates/storefront-grocery/app/categories/[slug]/page.tsx +118 -0
- package/templates/storefront-grocery/app/checkout/page.tsx +17 -0
- package/templates/storefront-grocery/app/collections/[slug]/listing-client.tsx +20 -0
- package/templates/storefront-grocery/app/collections/[slug]/page.tsx +118 -0
- package/templates/storefront-grocery/app/contact/contact-form.tsx +109 -0
- package/templates/storefront-grocery/app/contact/page.tsx +54 -0
- package/templates/storefront-grocery/app/error.tsx +60 -0
- package/templates/storefront-grocery/app/faq/page.tsx +46 -0
- package/templates/storefront-grocery/app/globals.css +45 -0
- package/templates/storefront-grocery/app/layout.tsx +75 -0
- package/templates/storefront-grocery/app/llms.txt/route.ts +94 -0
- package/templates/storefront-grocery/app/login/page.tsx +17 -0
- package/templates/storefront-grocery/app/not-found.tsx +39 -0
- package/templates/storefront-grocery/app/opensearch.xml/route.ts +37 -0
- package/templates/storefront-grocery/app/orders/[id]/page.tsx +21 -0
- package/templates/storefront-grocery/app/page.tsx +97 -0
- package/templates/storefront-grocery/app/privacy/page.tsx +44 -0
- package/templates/storefront-grocery/app/returns/page.tsx +11 -0
- package/templates/storefront-grocery/app/robots.ts +18 -0
- package/templates/storefront-grocery/app/search/page.tsx +38 -0
- package/templates/storefront-grocery/app/search/search-client.tsx +7 -0
- package/templates/storefront-grocery/app/shipping/page.tsx +16 -0
- package/templates/storefront-grocery/app/shop/page.tsx +31 -0
- package/templates/storefront-grocery/app/shop/shop-client.tsx +27 -0
- package/templates/storefront-grocery/app/signup/page.tsx +17 -0
- package/templates/storefront-grocery/app/sitemap-page/page.tsx +167 -0
- package/templates/storefront-grocery/app/sitemap.ts +62 -0
- package/templates/storefront-grocery/app/terms/page.tsx +44 -0
- package/templates/storefront-grocery/app/track-order/page.tsx +24 -0
- package/templates/storefront-grocery/app/track-order/track-order-form.tsx +69 -0
- package/templates/storefront-grocery/components/account-iframe.tsx +13 -0
- package/templates/storefront-grocery/components/cart-pill.tsx +32 -0
- package/templates/storefront-grocery/components/category-grid.tsx +28 -0
- package/templates/storefront-grocery/components/collection-strip.tsx +45 -0
- package/templates/storefront-grocery/components/footer.tsx +148 -0
- package/templates/storefront-grocery/components/header.tsx +43 -0
- package/templates/storefront-grocery/components/hero.tsx +25 -0
- package/templates/storefront-grocery/components/nav-link.tsx +20 -0
- package/templates/storefront-grocery/components/policy-page.tsx +49 -0
- package/templates/storefront-grocery/components/providers.tsx +31 -0
- package/templates/storefront-grocery/components/store-product-card.tsx +83 -0
- package/templates/storefront-grocery/lib/brand.ts +373 -0
- package/templates/storefront-grocery/lib/cart.ts +27 -0
- package/templates/storefront-grocery/next.config.ts +40 -0
- package/templates/storefront-grocery/package.json +28 -0
- package/templates/storefront-grocery/postcss.config.mjs +7 -0
- package/templates/storefront-grocery/tsconfig.json +23 -0
- package/templates/storefront-restaurant/.env.example +16 -0
- package/templates/storefront-restaurant/AGENTS.md +39 -0
- package/templates/storefront-restaurant/README.md +73 -0
- package/templates/storefront-restaurant/app/about/page.tsx +38 -0
- package/templates/storefront-restaurant/app/accessibility/page.tsx +11 -0
- package/templates/storefront-restaurant/app/account/addresses/page.tsx +21 -0
- package/templates/storefront-restaurant/app/account/orders/page.tsx +21 -0
- package/templates/storefront-restaurant/app/account/page.tsx +22 -0
- package/templates/storefront-restaurant/app/account/settings/page.tsx +21 -0
- package/templates/storefront-restaurant/app/cart/page.tsx +9 -0
- package/templates/storefront-restaurant/app/categories/[slug]/listing-client.tsx +19 -0
- package/templates/storefront-restaurant/app/categories/[slug]/page.tsx +118 -0
- package/templates/storefront-restaurant/app/checkout/page.tsx +17 -0
- package/templates/storefront-restaurant/app/collections/[slug]/listing-client.tsx +20 -0
- package/templates/storefront-restaurant/app/collections/[slug]/page.tsx +118 -0
- package/templates/storefront-restaurant/app/contact/contact-form.tsx +109 -0
- package/templates/storefront-restaurant/app/contact/page.tsx +54 -0
- package/templates/storefront-restaurant/app/error.tsx +60 -0
- package/templates/storefront-restaurant/app/faq/page.tsx +46 -0
- package/templates/storefront-restaurant/app/globals.css +44 -0
- package/templates/storefront-restaurant/app/layout.tsx +80 -0
- package/templates/storefront-restaurant/app/llms.txt/route.ts +94 -0
- package/templates/storefront-restaurant/app/login/page.tsx +17 -0
- package/templates/storefront-restaurant/app/not-found.tsx +39 -0
- package/templates/storefront-restaurant/app/opensearch.xml/route.ts +37 -0
- package/templates/storefront-restaurant/app/orders/[id]/page.tsx +21 -0
- package/templates/storefront-restaurant/app/page.tsx +97 -0
- package/templates/storefront-restaurant/app/privacy/page.tsx +44 -0
- package/templates/storefront-restaurant/app/reservations/page.tsx +66 -0
- package/templates/storefront-restaurant/app/reservations/reservations-client.tsx +234 -0
- package/templates/storefront-restaurant/app/returns/page.tsx +11 -0
- package/templates/storefront-restaurant/app/robots.ts +18 -0
- package/templates/storefront-restaurant/app/search/page.tsx +38 -0
- package/templates/storefront-restaurant/app/search/search-client.tsx +7 -0
- package/templates/storefront-restaurant/app/shipping/page.tsx +16 -0
- package/templates/storefront-restaurant/app/shop/page.tsx +31 -0
- package/templates/storefront-restaurant/app/shop/shop-client.tsx +27 -0
- package/templates/storefront-restaurant/app/signup/page.tsx +17 -0
- package/templates/storefront-restaurant/app/sitemap-page/page.tsx +167 -0
- package/templates/storefront-restaurant/app/sitemap.ts +62 -0
- package/templates/storefront-restaurant/app/terms/page.tsx +44 -0
- package/templates/storefront-restaurant/app/track-order/page.tsx +24 -0
- package/templates/storefront-restaurant/app/track-order/track-order-form.tsx +69 -0
- package/templates/storefront-restaurant/components/account-iframe.tsx +13 -0
- package/templates/storefront-restaurant/components/cart-pill.tsx +32 -0
- package/templates/storefront-restaurant/components/category-grid.tsx +28 -0
- package/templates/storefront-restaurant/components/collection-strip.tsx +45 -0
- package/templates/storefront-restaurant/components/footer.tsx +148 -0
- package/templates/storefront-restaurant/components/header.tsx +43 -0
- package/templates/storefront-restaurant/components/hero.tsx +25 -0
- package/templates/storefront-restaurant/components/nav-link.tsx +20 -0
- package/templates/storefront-restaurant/components/policy-page.tsx +49 -0
- package/templates/storefront-restaurant/components/product-modal.tsx +105 -0
- package/templates/storefront-restaurant/components/providers.tsx +31 -0
- package/templates/storefront-restaurant/components/store-product-card.tsx +83 -0
- package/templates/storefront-restaurant/lib/brand.ts +375 -0
- package/templates/storefront-restaurant/lib/cart.ts +27 -0
- package/templates/storefront-restaurant/next.config.ts +40 -0
- package/templates/storefront-restaurant/package.json +28 -0
- package/templates/storefront-restaurant/postcss.config.mjs +7 -0
- package/templates/storefront-restaurant/tsconfig.json +23 -0
- package/templates/storefront-retail/.env.example +5 -0
- package/templates/storefront-retail/AGENTS.md +64 -0
- package/templates/storefront-retail/app/about/page.tsx +24 -54
- package/templates/storefront-retail/app/accessibility/page.tsx +11 -0
- package/templates/storefront-retail/app/account/addresses/page.tsx +21 -0
- package/templates/storefront-retail/app/account/orders/page.tsx +21 -0
- package/templates/storefront-retail/app/account/page.tsx +22 -0
- package/templates/storefront-retail/app/account/settings/page.tsx +21 -0
- package/templates/storefront-retail/app/categories/[slug]/page.tsx +2 -1
- package/templates/storefront-retail/app/collections/[slug]/page.tsx +2 -1
- package/templates/storefront-retail/app/contact/contact-form.tsx +109 -0
- package/templates/storefront-retail/app/contact/page.tsx +54 -0
- package/templates/storefront-retail/app/error.tsx +61 -0
- package/templates/storefront-retail/app/faq/page.tsx +11 -92
- package/templates/storefront-retail/app/layout.tsx +37 -8
- package/templates/storefront-retail/app/llms.txt/route.ts +94 -0
- package/templates/storefront-retail/app/login/page.tsx +17 -0
- package/templates/storefront-retail/app/not-found.tsx +39 -0
- package/templates/storefront-retail/app/opensearch.xml/route.ts +37 -0
- package/templates/storefront-retail/app/page.tsx +16 -73
- package/templates/storefront-retail/app/privacy/page.tsx +24 -81
- package/templates/storefront-retail/app/products/[slug]/page.tsx +165 -0
- package/templates/storefront-retail/app/products/[slug]/product-detail.tsx +71 -0
- package/templates/storefront-retail/app/returns/page.tsx +11 -0
- package/templates/storefront-retail/app/robots.ts +18 -0
- package/templates/storefront-retail/app/search/page.tsx +38 -0
- package/templates/storefront-retail/app/search/search-client.tsx +7 -0
- package/templates/storefront-retail/app/shipping/page.tsx +16 -0
- package/templates/storefront-retail/app/shop/page.tsx +3 -3
- package/templates/storefront-retail/app/signup/page.tsx +17 -0
- package/templates/storefront-retail/app/sitemap-page/page.tsx +167 -0
- package/templates/storefront-retail/app/sitemap.ts +59 -0
- package/templates/storefront-retail/app/terms/page.tsx +24 -97
- package/templates/storefront-retail/app/track-order/page.tsx +24 -0
- package/templates/storefront-retail/app/track-order/track-order-form.tsx +69 -0
- package/templates/storefront-retail/components/account-iframe.tsx +13 -0
- package/templates/storefront-retail/components/brand-marquee.tsx +6 -15
- package/templates/storefront-retail/components/feature-hero.tsx +2 -1
- package/templates/storefront-retail/components/footer.tsx +85 -120
- package/templates/storefront-retail/components/header.tsx +10 -12
- package/templates/storefront-retail/components/newsletter.tsx +7 -9
- package/templates/storefront-retail/components/policy-page.tsx +49 -0
- package/templates/storefront-retail/components/promo-banner.tsx +12 -15
- package/templates/storefront-retail/components/store-product-card.tsx +7 -7
- package/templates/storefront-retail/components/trade-in-cta.tsx +11 -17
- package/templates/storefront-retail/components/trust-bar.tsx +45 -5
- package/templates/storefront-retail/lib/brand.ts +663 -0
- package/templates/storefront-services/.env.example +16 -0
- package/templates/storefront-services/AGENTS.md +41 -0
- package/templates/storefront-services/README.md +73 -0
- package/templates/storefront-services/app/about/page.tsx +38 -0
- package/templates/storefront-services/app/accessibility/page.tsx +11 -0
- package/templates/storefront-services/app/account/addresses/page.tsx +21 -0
- package/templates/storefront-services/app/account/orders/page.tsx +21 -0
- package/templates/storefront-services/app/account/page.tsx +22 -0
- package/templates/storefront-services/app/account/settings/page.tsx +21 -0
- package/templates/storefront-services/app/book/book-client.tsx +195 -0
- package/templates/storefront-services/app/book/page.tsx +65 -0
- package/templates/storefront-services/app/cart/page.tsx +9 -0
- package/templates/storefront-services/app/categories/[slug]/listing-client.tsx +19 -0
- package/templates/storefront-services/app/categories/[slug]/page.tsx +118 -0
- package/templates/storefront-services/app/checkout/page.tsx +17 -0
- package/templates/storefront-services/app/collections/[slug]/listing-client.tsx +20 -0
- package/templates/storefront-services/app/collections/[slug]/page.tsx +118 -0
- package/templates/storefront-services/app/contact/contact-form.tsx +109 -0
- package/templates/storefront-services/app/contact/page.tsx +54 -0
- package/templates/storefront-services/app/error.tsx +60 -0
- package/templates/storefront-services/app/faq/page.tsx +46 -0
- package/templates/storefront-services/app/globals.css +45 -0
- package/templates/storefront-services/app/layout.tsx +80 -0
- package/templates/storefront-services/app/llms.txt/route.ts +94 -0
- package/templates/storefront-services/app/login/page.tsx +17 -0
- package/templates/storefront-services/app/not-found.tsx +39 -0
- package/templates/storefront-services/app/opensearch.xml/route.ts +37 -0
- package/templates/storefront-services/app/orders/[id]/page.tsx +21 -0
- package/templates/storefront-services/app/page.tsx +97 -0
- package/templates/storefront-services/app/privacy/page.tsx +44 -0
- package/templates/storefront-services/app/returns/page.tsx +11 -0
- package/templates/storefront-services/app/robots.ts +18 -0
- package/templates/storefront-services/app/search/page.tsx +38 -0
- package/templates/storefront-services/app/search/search-client.tsx +7 -0
- package/templates/storefront-services/app/shipping/page.tsx +16 -0
- package/templates/storefront-services/app/shop/page.tsx +31 -0
- package/templates/storefront-services/app/shop/shop-client.tsx +27 -0
- package/templates/storefront-services/app/signup/page.tsx +17 -0
- package/templates/storefront-services/app/sitemap-page/page.tsx +167 -0
- package/templates/storefront-services/app/sitemap.ts +62 -0
- package/templates/storefront-services/app/terms/page.tsx +44 -0
- package/templates/storefront-services/app/track-order/page.tsx +24 -0
- package/templates/storefront-services/app/track-order/track-order-form.tsx +69 -0
- package/templates/storefront-services/components/account-iframe.tsx +13 -0
- package/templates/storefront-services/components/cart-pill.tsx +32 -0
- package/templates/storefront-services/components/category-grid.tsx +28 -0
- package/templates/storefront-services/components/collection-strip.tsx +45 -0
- package/templates/storefront-services/components/footer.tsx +148 -0
- package/templates/storefront-services/components/header.tsx +43 -0
- package/templates/storefront-services/components/hero.tsx +25 -0
- package/templates/storefront-services/components/nav-link.tsx +20 -0
- package/templates/storefront-services/components/policy-page.tsx +49 -0
- package/templates/storefront-services/components/product-modal.tsx +105 -0
- package/templates/storefront-services/components/providers.tsx +31 -0
- package/templates/storefront-services/components/store-product-card.tsx +83 -0
- package/templates/storefront-services/lib/brand.ts +394 -0
- package/templates/storefront-services/lib/cart.ts +27 -0
- package/templates/storefront-services/next.config.ts +40 -0
- package/templates/storefront-services/package.json +28 -0
- package/templates/storefront-services/postcss.config.mjs +7 -0
- package/templates/storefront-services/tsconfig.json +23 -0
- /package/templates/{storefront-retail → storefront-grocery}/components/product-modal.tsx +0 -0
|
@@ -1,87 +1,43 @@
|
|
|
1
1
|
import type { Metadata } from "next";
|
|
2
|
+
import { brand } from "@/lib/brand";
|
|
2
3
|
|
|
3
4
|
export const metadata: Metadata = {
|
|
4
|
-
title:
|
|
5
|
-
description:
|
|
6
|
-
"How Akua's Bakery collects, uses, and protects your personal data.",
|
|
5
|
+
title: `Privacy Policy — ${brand.name}`,
|
|
6
|
+
description: `How ${brand.name} collects, uses, and protects your personal data.`,
|
|
7
7
|
};
|
|
8
8
|
|
|
9
9
|
export default function PrivacyPage() {
|
|
10
|
+
const p = brand.privacy;
|
|
10
11
|
return (
|
|
11
12
|
<article className="max-w-3xl mx-auto px-8 py-16 prose prose-lg max-w-none">
|
|
12
13
|
<p className="text-[11px] font-semibold uppercase tracking-[0.16em] text-primary mb-2 not-prose">
|
|
13
|
-
|
|
14
|
+
{p.eyebrow}
|
|
14
15
|
</p>
|
|
15
16
|
<h1 className="font-serif text-[clamp(2.25rem,5vw,3.5rem)] font-semibold mb-2 -tracking-[0.02em]">
|
|
16
|
-
|
|
17
|
+
{p.title}
|
|
17
18
|
</h1>
|
|
18
19
|
<p className="text-sm text-muted-foreground not-prose mb-10">
|
|
19
|
-
Last updated:
|
|
20
|
+
Last updated: {p.lastUpdated}
|
|
20
21
|
</p>
|
|
21
22
|
|
|
22
23
|
<section className="space-y-5 leading-relaxed text-foreground/90">
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
</
|
|
39
|
-
|
|
40
|
-
To analyse aggregated, anonymised browsing patterns so we can
|
|
41
|
-
improve the site.
|
|
42
|
-
</li>
|
|
43
|
-
</ul>
|
|
44
|
-
|
|
45
|
-
<h2 className="font-serif text-2xl font-semibold">Who we share it with</h2>
|
|
46
|
-
<p>
|
|
47
|
-
We share data only with the partners required to fulfil your order:
|
|
48
|
-
payment processors (Paystack, Stripe), delivery riders, and our
|
|
49
|
-
email/SMS providers. We do not sell or rent personal data to third
|
|
50
|
-
parties — ever.
|
|
51
|
-
</p>
|
|
52
|
-
|
|
53
|
-
<h2 className="font-serif text-2xl font-semibold">Cookies</h2>
|
|
54
|
-
<p>
|
|
55
|
-
We use a small number of strictly-necessary cookies to keep your cart
|
|
56
|
-
working and your session signed in. We don't use third-party
|
|
57
|
-
advertising or tracking cookies.
|
|
58
|
-
</p>
|
|
59
|
-
|
|
60
|
-
<h2 className="font-serif text-2xl font-semibold">Your rights</h2>
|
|
61
|
-
<p>
|
|
62
|
-
Under the Ghana Data Protection Act, 2012 (Act 843), you have the
|
|
63
|
-
right to access the data we hold about you, correct it, or have it
|
|
64
|
-
deleted. Email{" "}
|
|
65
|
-
<a
|
|
66
|
-
href="mailto:privacy@akuasbakery.test"
|
|
67
|
-
className="text-primary font-semibold hover:underline"
|
|
68
|
-
>
|
|
69
|
-
privacy@akuasbakery.test
|
|
70
|
-
</a>{" "}
|
|
71
|
-
and we'll respond within 14 days.
|
|
72
|
-
</p>
|
|
73
|
-
|
|
74
|
-
<h2 className="font-serif text-2xl font-semibold">Retention</h2>
|
|
75
|
-
<p>
|
|
76
|
-
We keep order records for 7 years to comply with Ghanaian tax law.
|
|
77
|
-
Marketing-list opt-ins are kept until you unsubscribe.
|
|
78
|
-
</p>
|
|
79
|
-
|
|
80
|
-
<h2 className="font-serif text-2xl font-semibold">Changes</h2>
|
|
81
|
-
<p>
|
|
82
|
-
If we make material changes to this policy, we'll email customers on
|
|
83
|
-
our marketing list and update the "last updated" date above.
|
|
84
|
-
</p>
|
|
24
|
+
{p.sections.map((s) => (
|
|
25
|
+
<div key={s.heading}>
|
|
26
|
+
<h2 className="font-serif text-2xl font-semibold mt-0">{s.heading}</h2>
|
|
27
|
+
{typeof s.body === "string" ? (
|
|
28
|
+
<p>{s.body}</p>
|
|
29
|
+
) : (
|
|
30
|
+
<>
|
|
31
|
+
<p>{s.body.intro}</p>
|
|
32
|
+
<ul className="list-disc pl-6 space-y-2">
|
|
33
|
+
{s.body.bullets.map((b) => (
|
|
34
|
+
<li key={b}>{b}</li>
|
|
35
|
+
))}
|
|
36
|
+
</ul>
|
|
37
|
+
</>
|
|
38
|
+
)}
|
|
39
|
+
</div>
|
|
40
|
+
))}
|
|
85
41
|
</section>
|
|
86
42
|
</article>
|
|
87
43
|
);
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Metadata } from "next";
|
|
2
|
+
import { brand } from "@/lib/brand";
|
|
3
|
+
import { PolicyPage } from "@/components/policy-page";
|
|
4
|
+
|
|
5
|
+
export const metadata: Metadata = {
|
|
6
|
+
title: `${brand.returns.title} — ${brand.name}`,
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
export default function ReturnsPage() {
|
|
10
|
+
return <PolicyPage policy={brand.returns} />;
|
|
11
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { MetadataRoute } from "next";
|
|
2
|
+
|
|
3
|
+
const SITE_URL =
|
|
4
|
+
process.env.NEXT_PUBLIC_SITE_URL?.trim() || "https://example.com";
|
|
5
|
+
|
|
6
|
+
export default function robots(): MetadataRoute.Robots {
|
|
7
|
+
return {
|
|
8
|
+
rules: [
|
|
9
|
+
{
|
|
10
|
+
userAgent: "*",
|
|
11
|
+
allow: "/",
|
|
12
|
+
disallow: ["/cart", "/checkout", "/orders/", "/api/"],
|
|
13
|
+
},
|
|
14
|
+
],
|
|
15
|
+
sitemap: `${SITE_URL}/sitemap.xml`,
|
|
16
|
+
host: SITE_URL,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { Metadata } from "next";
|
|
2
|
+
import { Suspense } from "react";
|
|
3
|
+
import { SearchClient } from "./search-client";
|
|
4
|
+
import { brand } from "@/lib/brand";
|
|
5
|
+
|
|
6
|
+
export const metadata: Metadata = {
|
|
7
|
+
title: `Search — ${brand.name}`,
|
|
8
|
+
description: `Search ${brand.name} — products, collections, categories.`,
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
export default function SearchPage() {
|
|
12
|
+
return (
|
|
13
|
+
<article className="max-w-7xl mx-auto px-6 sm:px-8 py-10">
|
|
14
|
+
<p className="text-[11px] font-semibold uppercase tracking-[0.16em] text-primary mb-2">
|
|
15
|
+
Search
|
|
16
|
+
</p>
|
|
17
|
+
<h1 className="font-serif text-[clamp(2rem,4vw,2.75rem)] font-semibold mb-8 -tracking-[0.02em]">
|
|
18
|
+
Find anything.
|
|
19
|
+
</h1>
|
|
20
|
+
<Suspense fallback={<SearchSkeleton />}>
|
|
21
|
+
<SearchClient />
|
|
22
|
+
</Suspense>
|
|
23
|
+
</article>
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function SearchSkeleton() {
|
|
28
|
+
return (
|
|
29
|
+
<div>
|
|
30
|
+
<div className="h-12 w-full max-w-xl bg-muted rounded animate-pulse mb-8" />
|
|
31
|
+
<div className="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-3 sm:gap-4">
|
|
32
|
+
{Array.from({ length: 8 }).map((_, i) => (
|
|
33
|
+
<div key={i} className="aspect-[4/3] bg-muted rounded-2xl animate-pulse" />
|
|
34
|
+
))}
|
|
35
|
+
</div>
|
|
36
|
+
</div>
|
|
37
|
+
);
|
|
38
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Metadata } from "next";
|
|
2
|
+
import { brand } from "@/lib/brand";
|
|
3
|
+
import { PolicyPage } from "@/components/policy-page";
|
|
4
|
+
|
|
5
|
+
export const metadata: Metadata = {
|
|
6
|
+
title: `${brand.shipping.title} — ${brand.name}`,
|
|
7
|
+
description: brand.shipping.sections[0]?.body
|
|
8
|
+
? typeof brand.shipping.sections[0].body === "string"
|
|
9
|
+
? brand.shipping.sections[0].body
|
|
10
|
+
: brand.shipping.sections[0].body.intro
|
|
11
|
+
: undefined,
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export default function ShippingPage() {
|
|
15
|
+
return <PolicyPage policy={brand.shipping} />;
|
|
16
|
+
}
|
|
@@ -2,10 +2,11 @@ import type { Metadata } from "next";
|
|
|
2
2
|
import { cacheTag, cacheLife } from "next/cache";
|
|
3
3
|
import { getServerClient, tags } from "@cimplify/sdk/server";
|
|
4
4
|
import { ShopClient } from "./shop-client";
|
|
5
|
+
import { brand } from "@/lib/brand";
|
|
5
6
|
|
|
6
7
|
export const metadata: Metadata = {
|
|
7
|
-
title:
|
|
8
|
-
description:
|
|
8
|
+
title: `Shop — ${brand.name}`,
|
|
9
|
+
description: brand.description,
|
|
9
10
|
};
|
|
10
11
|
|
|
11
12
|
async function getShopData() {
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Metadata } from "next";
|
|
2
|
+
import { redirect } from "next/navigation";
|
|
3
|
+
import { brand } from "@/lib/brand";
|
|
4
|
+
|
|
5
|
+
export const metadata: Metadata = {
|
|
6
|
+
title: `Create an account — ${brand.name}`,
|
|
7
|
+
description: brand.account.signupSubtitle,
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Cimplify Link handles sign-up inside the `<CimplifyAccount>` iframe.
|
|
12
|
+
* We bounce /signup to /account; the iframe shows the create-account UI
|
|
13
|
+
* for visitors with no session.
|
|
14
|
+
*/
|
|
15
|
+
export default function SignupPage(): never {
|
|
16
|
+
redirect("/account");
|
|
17
|
+
}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import type { Metadata } from "next";
|
|
2
|
+
import Link from "next/link";
|
|
3
|
+
import { cacheTag, cacheLife } from "next/cache";
|
|
4
|
+
import { getServerClient, tags, type Product } from "@cimplify/sdk/server";
|
|
5
|
+
import { brand } from "@/lib/brand";
|
|
6
|
+
|
|
7
|
+
export const metadata: Metadata = {
|
|
8
|
+
title: `Sitemap — ${brand.name}`,
|
|
9
|
+
description: "A human-readable index of every page on this site.",
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
interface SitemapData {
|
|
13
|
+
products: { slug: string; name: string }[];
|
|
14
|
+
categories: { slug: string; name: string }[];
|
|
15
|
+
collections: { slug: string; name: string }[];
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
async function getSitemap(): Promise<SitemapData> {
|
|
19
|
+
"use cache";
|
|
20
|
+
cacheTag(tags.products(), tags.categories(), tags.collections());
|
|
21
|
+
cacheLife("hours");
|
|
22
|
+
|
|
23
|
+
const client = getServerClient();
|
|
24
|
+
const [pRes, cRes, colRes] = await Promise.all([
|
|
25
|
+
client.catalogue.getProducts({ limit: 500 }),
|
|
26
|
+
client.catalogue.getCategories(),
|
|
27
|
+
client.catalogue.getCollections(),
|
|
28
|
+
]);
|
|
29
|
+
return {
|
|
30
|
+
products: (pRes.ok ? pRes.value.items : []).map((p: Product) => ({
|
|
31
|
+
slug: p.slug ?? p.id,
|
|
32
|
+
name: p.name,
|
|
33
|
+
})),
|
|
34
|
+
categories: (cRes.ok ? cRes.value : []).map((c) => ({ slug: c.slug, name: c.name })),
|
|
35
|
+
collections: (colRes.ok ? colRes.value : []).map((c) => ({ slug: c.slug, name: c.name })),
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const STATIC_LINKS: { title: string; links: { href: string; label: string }[] }[] = [
|
|
40
|
+
{
|
|
41
|
+
title: "Browse",
|
|
42
|
+
links: [
|
|
43
|
+
{ href: "/", label: "Home" },
|
|
44
|
+
{ href: "/shop", label: "Shop" },
|
|
45
|
+
{ href: "/search", label: "Search" },
|
|
46
|
+
],
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
title: "Account",
|
|
50
|
+
links: [
|
|
51
|
+
{ href: "/account", label: "Account" },
|
|
52
|
+
{ href: "/account/orders", label: "Orders" },
|
|
53
|
+
{ href: "/account/addresses", label: "Addresses" },
|
|
54
|
+
{ href: "/account/settings", label: "Settings" },
|
|
55
|
+
{ href: "/login", label: "Sign in" },
|
|
56
|
+
{ href: "/signup", label: "Create account" },
|
|
57
|
+
{ href: "/track-order", label: "Track an order" },
|
|
58
|
+
{ href: "/cart", label: "Cart" },
|
|
59
|
+
{ href: "/checkout", label: "Checkout" },
|
|
60
|
+
],
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
title: "About",
|
|
64
|
+
links: [
|
|
65
|
+
{ href: "/about", label: "About" },
|
|
66
|
+
{ href: "/faq", label: "FAQ" },
|
|
67
|
+
{ href: "/contact", label: "Contact" },
|
|
68
|
+
],
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
title: "Policies",
|
|
72
|
+
links: [
|
|
73
|
+
{ href: "/shipping", label: "Shipping" },
|
|
74
|
+
{ href: "/returns", label: "Returns" },
|
|
75
|
+
{ href: "/accessibility", label: "Accessibility" },
|
|
76
|
+
{ href: "/terms", label: "Terms of Service" },
|
|
77
|
+
{ href: "/privacy", label: "Privacy Policy" },
|
|
78
|
+
],
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
title: "Machine-readable",
|
|
82
|
+
links: [
|
|
83
|
+
{ href: "/sitemap.xml", label: "sitemap.xml (search engines)" },
|
|
84
|
+
{ href: "/llms.txt", label: "llms.txt (LLM agents)" },
|
|
85
|
+
{ href: "/robots.txt", label: "robots.txt" },
|
|
86
|
+
{ href: "/opensearch.xml", label: "opensearch.xml (browser search)" },
|
|
87
|
+
],
|
|
88
|
+
},
|
|
89
|
+
];
|
|
90
|
+
|
|
91
|
+
export default async function SitemapHtmlPage() {
|
|
92
|
+
const { products, categories, collections } = await getSitemap();
|
|
93
|
+
|
|
94
|
+
return (
|
|
95
|
+
<article className="max-w-5xl mx-auto px-6 sm:px-8 py-16">
|
|
96
|
+
<p className="text-[11px] font-semibold uppercase tracking-[0.16em] text-primary mb-2">
|
|
97
|
+
Sitemap
|
|
98
|
+
</p>
|
|
99
|
+
<h1 className="text-[clamp(2rem,4vw,2.75rem)] font-semibold mb-2 -tracking-[0.02em]">
|
|
100
|
+
Every page, in one place.
|
|
101
|
+
</h1>
|
|
102
|
+
<p className="text-muted-foreground mb-12">
|
|
103
|
+
For search engines, see <Link href="/sitemap.xml" className="text-primary hover:underline">/sitemap.xml</Link>.
|
|
104
|
+
For LLM agents, see <Link href="/llms.txt" className="text-primary hover:underline">/llms.txt</Link>.
|
|
105
|
+
</p>
|
|
106
|
+
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-10">
|
|
107
|
+
{STATIC_LINKS.map((s) => (
|
|
108
|
+
<Section key={s.title} title={s.title}>
|
|
109
|
+
{s.links.map((l) => (
|
|
110
|
+
<li key={l.href}>
|
|
111
|
+
<Link href={l.href} className="hover:text-primary transition-colors">
|
|
112
|
+
{l.label}
|
|
113
|
+
</Link>
|
|
114
|
+
</li>
|
|
115
|
+
))}
|
|
116
|
+
</Section>
|
|
117
|
+
))}
|
|
118
|
+
{categories.length > 0 && (
|
|
119
|
+
<Section title="Categories">
|
|
120
|
+
{categories.map((c) => (
|
|
121
|
+
<li key={c.slug}>
|
|
122
|
+
<Link href={`/categories/${c.slug}`} className="hover:text-primary transition-colors">
|
|
123
|
+
{c.name}
|
|
124
|
+
</Link>
|
|
125
|
+
</li>
|
|
126
|
+
))}
|
|
127
|
+
</Section>
|
|
128
|
+
)}
|
|
129
|
+
{collections.length > 0 && (
|
|
130
|
+
<Section title="Collections">
|
|
131
|
+
{collections.map((c) => (
|
|
132
|
+
<li key={c.slug}>
|
|
133
|
+
<Link href={`/collections/${c.slug}`} className="hover:text-primary transition-colors">
|
|
134
|
+
{c.name}
|
|
135
|
+
</Link>
|
|
136
|
+
</li>
|
|
137
|
+
))}
|
|
138
|
+
</Section>
|
|
139
|
+
)}
|
|
140
|
+
{products.length > 0 && (
|
|
141
|
+
<Section title={`Products (${products.length})`}>
|
|
142
|
+
{products.map((p) => (
|
|
143
|
+
<li key={p.slug}>
|
|
144
|
+
<Link href={`/shop?product=${encodeURIComponent(p.slug)}`} className="hover:text-primary transition-colors">
|
|
145
|
+
{p.name}
|
|
146
|
+
</Link>
|
|
147
|
+
</li>
|
|
148
|
+
))}
|
|
149
|
+
</Section>
|
|
150
|
+
)}
|
|
151
|
+
</div>
|
|
152
|
+
</article>
|
|
153
|
+
);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
function Section({ title, children }: { title: string; children: React.ReactNode }) {
|
|
157
|
+
return (
|
|
158
|
+
<div>
|
|
159
|
+
<p className="font-semibold text-[12px] uppercase tracking-[0.12em] text-foreground mb-3">
|
|
160
|
+
{title}
|
|
161
|
+
</p>
|
|
162
|
+
<ul className="space-y-2 m-0 p-0 list-none text-sm text-muted-foreground">
|
|
163
|
+
{children}
|
|
164
|
+
</ul>
|
|
165
|
+
</div>
|
|
166
|
+
);
|
|
167
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { MetadataRoute } from "next";
|
|
2
|
+
import { getServerClient, type Product } from "@cimplify/sdk/server";
|
|
3
|
+
|
|
4
|
+
const SITE_URL =
|
|
5
|
+
process.env.NEXT_PUBLIC_SITE_URL?.trim() || "https://example.com";
|
|
6
|
+
|
|
7
|
+
const STATIC_ROUTES: { path: string; priority: number; changeFrequency: "daily" | "weekly" | "monthly" }[] = [
|
|
8
|
+
{ path: "/", priority: 1.0, changeFrequency: "daily" },
|
|
9
|
+
{ path: "/shop", priority: 0.9, changeFrequency: "daily" },
|
|
10
|
+
{ path: "/about", priority: 0.5, changeFrequency: "monthly" },
|
|
11
|
+
{ path: "/faq", priority: 0.4, changeFrequency: "monthly" },
|
|
12
|
+
{ path: "/terms", priority: 0.2, changeFrequency: "monthly" },
|
|
13
|
+
{ path: "/privacy", priority: 0.2, changeFrequency: "monthly" },
|
|
14
|
+
];
|
|
15
|
+
|
|
16
|
+
export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
|
|
17
|
+
const now = new Date();
|
|
18
|
+
const client = getServerClient();
|
|
19
|
+
|
|
20
|
+
const [productsRes, categoriesRes, collectionsRes] = await Promise.all([
|
|
21
|
+
client.catalogue.getProducts({ limit: 500 }),
|
|
22
|
+
client.catalogue.getCategories(),
|
|
23
|
+
client.catalogue.getCollections(),
|
|
24
|
+
]);
|
|
25
|
+
|
|
26
|
+
const products = productsRes.ok ? productsRes.value.items : [];
|
|
27
|
+
const categories = categoriesRes.ok ? categoriesRes.value : [];
|
|
28
|
+
const collections = collectionsRes.ok ? collectionsRes.value : [];
|
|
29
|
+
|
|
30
|
+
const staticEntries: MetadataRoute.Sitemap = STATIC_ROUTES.map((r) => ({
|
|
31
|
+
url: `${SITE_URL}${r.path}`,
|
|
32
|
+
lastModified: now,
|
|
33
|
+
changeFrequency: r.changeFrequency,
|
|
34
|
+
priority: r.priority,
|
|
35
|
+
}));
|
|
36
|
+
|
|
37
|
+
// Bakery uses a URL-driven product modal (`?product=<slug>` on the home or
|
|
38
|
+
// shop pages). Emit those as deep-linkable URLs so search engines and LLMs
|
|
39
|
+
// can index each product canonically.
|
|
40
|
+
const productEntries: MetadataRoute.Sitemap = products.map((p: Product) => ({
|
|
41
|
+
url: `${SITE_URL}/shop?product=${encodeURIComponent(p.slug ?? p.id)}`,
|
|
42
|
+
lastModified: p.updated_at ? new Date(p.updated_at) : now,
|
|
43
|
+
changeFrequency: "weekly",
|
|
44
|
+
priority: 0.7,
|
|
45
|
+
}));
|
|
46
|
+
|
|
47
|
+
const categoryEntries: MetadataRoute.Sitemap = categories.map((c) => ({
|
|
48
|
+
url: `${SITE_URL}/categories/${c.slug}`,
|
|
49
|
+
lastModified: now,
|
|
50
|
+
changeFrequency: "weekly",
|
|
51
|
+
priority: 0.6,
|
|
52
|
+
}));
|
|
53
|
+
|
|
54
|
+
const collectionEntries: MetadataRoute.Sitemap = collections.map((c) => ({
|
|
55
|
+
url: `${SITE_URL}/collections/${c.slug}`,
|
|
56
|
+
lastModified: now,
|
|
57
|
+
changeFrequency: "weekly",
|
|
58
|
+
priority: 0.6,
|
|
59
|
+
}));
|
|
60
|
+
|
|
61
|
+
return [...staticEntries, ...categoryEntries, ...collectionEntries, ...productEntries];
|
|
62
|
+
}
|
|
@@ -1,101 +1,43 @@
|
|
|
1
1
|
import type { Metadata } from "next";
|
|
2
|
+
import { brand } from "@/lib/brand";
|
|
2
3
|
|
|
3
4
|
export const metadata: Metadata = {
|
|
4
|
-
title:
|
|
5
|
-
description:
|
|
5
|
+
title: `Terms of Service — ${brand.name}`,
|
|
6
|
+
description: `The rules of the road for ordering from ${brand.name}.`,
|
|
6
7
|
};
|
|
7
8
|
|
|
8
9
|
export default function TermsPage() {
|
|
10
|
+
const t = brand.terms;
|
|
9
11
|
return (
|
|
10
12
|
<article className="max-w-3xl mx-auto px-8 py-16 prose prose-lg max-w-none">
|
|
11
13
|
<p className="text-[11px] font-semibold uppercase tracking-[0.16em] text-primary mb-2 not-prose">
|
|
12
|
-
|
|
14
|
+
{t.eyebrow}
|
|
13
15
|
</p>
|
|
14
16
|
<h1 className="font-serif text-[clamp(2.25rem,5vw,3.5rem)] font-semibold mb-2 -tracking-[0.02em]">
|
|
15
|
-
|
|
17
|
+
{t.title}
|
|
16
18
|
</h1>
|
|
17
19
|
<p className="text-sm text-muted-foreground not-prose mb-10">
|
|
18
|
-
Last updated:
|
|
20
|
+
Last updated: {t.lastUpdated}
|
|
19
21
|
</p>
|
|
20
22
|
|
|
21
23
|
<section className="space-y-5 leading-relaxed text-foreground/90">
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
Payment is due at checkout via Mobile Money, card, or cash on delivery.
|
|
40
|
-
We reserve the right to correct typographical pricing errors before
|
|
41
|
-
fulfilment.
|
|
42
|
-
</p>
|
|
43
|
-
|
|
44
|
-
<h2 className="font-serif text-2xl font-semibold">4. Delivery and pickup</h2>
|
|
45
|
-
<p>
|
|
46
|
-
Delivery times are estimates, not guarantees. We're not liable for
|
|
47
|
-
delays caused by weather, traffic, or events outside our control. If
|
|
48
|
-
a rider can't reach you within 30 minutes of arrival, the order may be
|
|
49
|
-
returned to the kitchen — please make sure your address and phone are
|
|
50
|
-
correct.
|
|
51
|
-
</p>
|
|
52
|
-
|
|
53
|
-
<h2 className="font-serif text-2xl font-semibold">5. Custom cakes</h2>
|
|
54
|
-
<p>
|
|
55
|
-
Custom cake orders require a 50% deposit at booking and the balance
|
|
56
|
-
before pickup or dispatch. Cancellations more than 72 hours before the
|
|
57
|
-
event date receive a full refund of the deposit; within 72 hours,
|
|
58
|
-
the deposit is non-refundable.
|
|
59
|
-
</p>
|
|
60
|
-
|
|
61
|
-
<h2 className="font-serif text-2xl font-semibold">6. Allergens</h2>
|
|
62
|
-
<p>
|
|
63
|
-
Our kitchen handles wheat, dairy, eggs, and tree nuts. We can't
|
|
64
|
-
guarantee freedom from cross-contamination. Customers with severe
|
|
65
|
-
allergies order at their own risk.
|
|
66
|
-
</p>
|
|
67
|
-
|
|
68
|
-
<h2 className="font-serif text-2xl font-semibold">7. Returns</h2>
|
|
69
|
-
<p>
|
|
70
|
-
Baked goods are non-returnable for food-safety reasons. If something
|
|
71
|
-
is wrong with your order, contact us within 24 hours of delivery and
|
|
72
|
-
we'll replace it, refund it, or credit your account — your choice.
|
|
73
|
-
</p>
|
|
74
|
-
|
|
75
|
-
<h2 className="font-serif text-2xl font-semibold">8. Liability</h2>
|
|
76
|
-
<p>
|
|
77
|
-
To the maximum extent permitted by Ghanaian law, our liability for any
|
|
78
|
-
claim arising from this website or your order is limited to the value
|
|
79
|
-
of the order. We're not liable for indirect or consequential losses.
|
|
80
|
-
</p>
|
|
81
|
-
|
|
82
|
-
<h2 className="font-serif text-2xl font-semibold">9. Governing law</h2>
|
|
83
|
-
<p>
|
|
84
|
-
These terms are governed by the laws of Ghana. Disputes will be
|
|
85
|
-
resolved in the courts of Greater Accra.
|
|
86
|
-
</p>
|
|
87
|
-
|
|
88
|
-
<h2 className="font-serif text-2xl font-semibold">10. Contact</h2>
|
|
89
|
-
<p>
|
|
90
|
-
Questions? Email{" "}
|
|
91
|
-
<a
|
|
92
|
-
href="mailto:hello@akuasbakery.test"
|
|
93
|
-
className="text-primary font-semibold hover:underline"
|
|
94
|
-
>
|
|
95
|
-
hello@akuasbakery.test
|
|
96
|
-
</a>
|
|
97
|
-
.
|
|
98
|
-
</p>
|
|
24
|
+
{t.sections.map((s) => (
|
|
25
|
+
<div key={s.heading}>
|
|
26
|
+
<h2 className="font-serif text-2xl font-semibold mt-0">{s.heading}</h2>
|
|
27
|
+
{typeof s.body === "string" ? (
|
|
28
|
+
<p>{s.body}</p>
|
|
29
|
+
) : (
|
|
30
|
+
<>
|
|
31
|
+
<p>{s.body.intro}</p>
|
|
32
|
+
<ul className="list-disc pl-6 space-y-2">
|
|
33
|
+
{s.body.bullets.map((b) => (
|
|
34
|
+
<li key={b}>{b}</li>
|
|
35
|
+
))}
|
|
36
|
+
</ul>
|
|
37
|
+
</>
|
|
38
|
+
)}
|
|
39
|
+
</div>
|
|
40
|
+
))}
|
|
99
41
|
</section>
|
|
100
42
|
</article>
|
|
101
43
|
);
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Metadata } from "next";
|
|
2
|
+
import { TrackOrderForm } from "./track-order-form";
|
|
3
|
+
import { brand } from "@/lib/brand";
|
|
4
|
+
|
|
5
|
+
export const metadata: Metadata = {
|
|
6
|
+
title: `Track an order — ${brand.name}`,
|
|
7
|
+
description: brand.trackOrder.body,
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
export default function TrackOrderPage() {
|
|
11
|
+
const t = brand.trackOrder;
|
|
12
|
+
return (
|
|
13
|
+
<article className="max-w-2xl mx-auto px-6 sm:px-8 py-16">
|
|
14
|
+
<p className="text-[11px] font-semibold uppercase tracking-[0.16em] text-primary mb-2">
|
|
15
|
+
{t.eyebrow}
|
|
16
|
+
</p>
|
|
17
|
+
<h1 className="font-serif text-[clamp(2rem,5vw,3rem)] font-semibold mb-4 -tracking-[0.02em]">
|
|
18
|
+
{t.title}
|
|
19
|
+
</h1>
|
|
20
|
+
<p className="text-muted-foreground leading-relaxed mb-8">{t.body}</p>
|
|
21
|
+
<TrackOrderForm />
|
|
22
|
+
</article>
|
|
23
|
+
);
|
|
24
|
+
}
|