@fayz-ai/storefront 0.2.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.
Files changed (175) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +39 -0
  3. package/dist/auth.d.ts +29 -0
  4. package/dist/auth.d.ts.map +1 -0
  5. package/dist/blocks.d.ts +6 -0
  6. package/dist/blocks.d.ts.map +1 -0
  7. package/dist/components/CartDrawer.d.ts +3 -0
  8. package/dist/components/CartDrawer.d.ts.map +1 -0
  9. package/dist/components/CustomerAccountShell.d.ts +13 -0
  10. package/dist/components/CustomerAccountShell.d.ts.map +1 -0
  11. package/dist/components/FiltersPanel.d.ts +3 -0
  12. package/dist/components/FiltersPanel.d.ts.map +1 -0
  13. package/dist/components/OrderTrackingTimeline.d.ts +7 -0
  14. package/dist/components/OrderTrackingTimeline.d.ts.map +1 -0
  15. package/dist/components/Price.d.ts +11 -0
  16. package/dist/components/Price.d.ts.map +1 -0
  17. package/dist/components/ProductCard.d.ts +7 -0
  18. package/dist/components/ProductCard.d.ts.map +1 -0
  19. package/dist/components/ProductGrid.d.ts +7 -0
  20. package/dist/components/ProductGrid.d.ts.map +1 -0
  21. package/dist/components/ProductOptionSelector.d.ts +9 -0
  22. package/dist/components/ProductOptionSelector.d.ts.map +1 -0
  23. package/dist/components/ProductSpecs.d.ts +8 -0
  24. package/dist/components/ProductSpecs.d.ts.map +1 -0
  25. package/dist/components/QuantityInput.d.ts +12 -0
  26. package/dist/components/QuantityInput.d.ts.map +1 -0
  27. package/dist/components/RelatedProducts.d.ts +9 -0
  28. package/dist/components/RelatedProducts.d.ts.map +1 -0
  29. package/dist/components/SignInModal.d.ts +19 -0
  30. package/dist/components/SignInModal.d.ts.map +1 -0
  31. package/dist/components/StorefrontErrorBoundary.d.ts +20 -0
  32. package/dist/components/StorefrontErrorBoundary.d.ts.map +1 -0
  33. package/dist/components/StorefrontFooter.d.ts +3 -0
  34. package/dist/components/StorefrontFooter.d.ts.map +1 -0
  35. package/dist/components/StorefrontHeader.d.ts +3 -0
  36. package/dist/components/StorefrontHeader.d.ts.map +1 -0
  37. package/dist/components/Toaster.d.ts +3 -0
  38. package/dist/components/Toaster.d.ts.map +1 -0
  39. package/dist/components/sections/CategoryShowcase.d.ts +6 -0
  40. package/dist/components/sections/CategoryShowcase.d.ts.map +1 -0
  41. package/dist/components/sections/HeroSection.d.ts +9 -0
  42. package/dist/components/sections/HeroSection.d.ts.map +1 -0
  43. package/dist/components/sections/MiscSections.d.ts +33 -0
  44. package/dist/components/sections/MiscSections.d.ts.map +1 -0
  45. package/dist/components/sections/ProductRail.d.ts +9 -0
  46. package/dist/components/sections/ProductRail.d.ts.map +1 -0
  47. package/dist/config.d.ts +149 -0
  48. package/dist/config.d.ts.map +1 -0
  49. package/dist/createStorefrontApp.d.ts +16 -0
  50. package/dist/createStorefrontApp.d.ts.map +1 -0
  51. package/dist/format.d.ts +3 -0
  52. package/dist/format.d.ts.map +1 -0
  53. package/dist/hooks/index.d.ts +6 -0
  54. package/dist/hooks/index.d.ts.map +1 -0
  55. package/dist/hooks/useCategories.d.ts +6 -0
  56. package/dist/hooks/useCategories.d.ts.map +1 -0
  57. package/dist/hooks/useDiscountValidator.d.ts +14 -0
  58. package/dist/hooks/useDiscountValidator.d.ts.map +1 -0
  59. package/dist/hooks/useMyOrders.d.ts +7 -0
  60. package/dist/hooks/useMyOrders.d.ts.map +1 -0
  61. package/dist/hooks/useProduct.d.ts +7 -0
  62. package/dist/hooks/useProduct.d.ts.map +1 -0
  63. package/dist/hooks/useProducts.d.ts +8 -0
  64. package/dist/hooks/useProducts.d.ts.map +1 -0
  65. package/dist/hooks/useStorefrontHead.d.ts +11 -0
  66. package/dist/hooks/useStorefrontHead.d.ts.map +1 -0
  67. package/dist/index.cjs +4186 -0
  68. package/dist/index.cjs.map +1 -0
  69. package/dist/index.d.ts +55 -0
  70. package/dist/index.d.ts.map +1 -0
  71. package/dist/index.js +4085 -0
  72. package/dist/index.js.map +1 -0
  73. package/dist/motion.d.ts +19 -0
  74. package/dist/motion.d.ts.map +1 -0
  75. package/dist/order-status.d.ts +10 -0
  76. package/dist/order-status.d.ts.map +1 -0
  77. package/dist/pages/CatalogPage.d.ts +3 -0
  78. package/dist/pages/CatalogPage.d.ts.map +1 -0
  79. package/dist/pages/CheckoutPage.d.ts +3 -0
  80. package/dist/pages/CheckoutPage.d.ts.map +1 -0
  81. package/dist/pages/HomePage.d.ts +6 -0
  82. package/dist/pages/HomePage.d.ts.map +1 -0
  83. package/dist/pages/MyPurchasesPage.d.ts +3 -0
  84. package/dist/pages/MyPurchasesPage.d.ts.map +1 -0
  85. package/dist/pages/NotFoundPage.d.ts +4 -0
  86. package/dist/pages/NotFoundPage.d.ts.map +1 -0
  87. package/dist/pages/OrderConfirmationPage.d.ts +5 -0
  88. package/dist/pages/OrderConfirmationPage.d.ts.map +1 -0
  89. package/dist/pages/PolicyPage.d.ts +15 -0
  90. package/dist/pages/PolicyPage.d.ts.map +1 -0
  91. package/dist/pages/ProductDetailPage.d.ts +5 -0
  92. package/dist/pages/ProductDetailPage.d.ts.map +1 -0
  93. package/dist/presets.d.ts +33 -0
  94. package/dist/presets.d.ts.map +1 -0
  95. package/dist/product-options.d.ts +12 -0
  96. package/dist/product-options.d.ts.map +1 -0
  97. package/dist/router.d.ts +285 -0
  98. package/dist/router.d.ts.map +1 -0
  99. package/dist/scaffold.d.ts +14 -0
  100. package/dist/scaffold.d.ts.map +1 -0
  101. package/dist/sections.d.ts +84 -0
  102. package/dist/sections.d.ts.map +1 -0
  103. package/dist/slot-contracts.d.ts +34 -0
  104. package/dist/slot-contracts.d.ts.map +1 -0
  105. package/dist/stores/cart.store.d.ts +58 -0
  106. package/dist/stores/cart.store.d.ts.map +1 -0
  107. package/dist/stores/catalog.store.d.ts +18 -0
  108. package/dist/stores/catalog.store.d.ts.map +1 -0
  109. package/dist/stores/session.store.d.ts +23 -0
  110. package/dist/stores/session.store.d.ts.map +1 -0
  111. package/dist/stores/toast.store.d.ts +27 -0
  112. package/dist/stores/toast.store.d.ts.map +1 -0
  113. package/dist/testids.d.ts +93 -0
  114. package/dist/testids.d.ts.map +1 -0
  115. package/dist/theme.d.ts +59 -0
  116. package/dist/theme.d.ts.map +1 -0
  117. package/dist/workflows/checkout.d.ts +33 -0
  118. package/dist/workflows/checkout.d.ts.map +1 -0
  119. package/package.json +56 -0
  120. package/src/auth.ts +134 -0
  121. package/src/blocks.tsx +47 -0
  122. package/src/components/CartDrawer.tsx +250 -0
  123. package/src/components/CustomerAccountShell.tsx +102 -0
  124. package/src/components/FiltersPanel.tsx +109 -0
  125. package/src/components/OrderTrackingTimeline.tsx +135 -0
  126. package/src/components/Price.tsx +32 -0
  127. package/src/components/ProductCard.tsx +104 -0
  128. package/src/components/ProductGrid.tsx +34 -0
  129. package/src/components/ProductOptionSelector.tsx +50 -0
  130. package/src/components/ProductSpecs.tsx +75 -0
  131. package/src/components/QuantityInput.tsx +52 -0
  132. package/src/components/RelatedProducts.tsx +31 -0
  133. package/src/components/SignInModal.tsx +120 -0
  134. package/src/components/StorefrontErrorBoundary.tsx +51 -0
  135. package/src/components/StorefrontFooter.tsx +100 -0
  136. package/src/components/StorefrontHeader.tsx +342 -0
  137. package/src/components/Toaster.tsx +60 -0
  138. package/src/components/sections/CategoryShowcase.tsx +79 -0
  139. package/src/components/sections/HeroSection.tsx +177 -0
  140. package/src/components/sections/MiscSections.tsx +157 -0
  141. package/src/components/sections/ProductRail.tsx +73 -0
  142. package/src/config.ts +176 -0
  143. package/src/createStorefrontApp.tsx +171 -0
  144. package/src/format.ts +7 -0
  145. package/src/hooks/index.ts +5 -0
  146. package/src/hooks/useCategories.ts +26 -0
  147. package/src/hooks/useDiscountValidator.ts +43 -0
  148. package/src/hooks/useMyOrders.ts +41 -0
  149. package/src/hooks/useProduct.ts +36 -0
  150. package/src/hooks/useProducts.ts +39 -0
  151. package/src/hooks/useStorefrontHead.ts +25 -0
  152. package/src/index.ts +132 -0
  153. package/src/motion.tsx +94 -0
  154. package/src/order-status.ts +33 -0
  155. package/src/pages/CatalogPage.tsx +118 -0
  156. package/src/pages/CheckoutPage.tsx +578 -0
  157. package/src/pages/HomePage.tsx +12 -0
  158. package/src/pages/MyPurchasesPage.tsx +310 -0
  159. package/src/pages/NotFoundPage.tsx +25 -0
  160. package/src/pages/OrderConfirmationPage.tsx +189 -0
  161. package/src/pages/PolicyPage.tsx +47 -0
  162. package/src/pages/ProductDetailPage.tsx +184 -0
  163. package/src/presets.ts +258 -0
  164. package/src/product-options.ts +63 -0
  165. package/src/router.ts +49 -0
  166. package/src/scaffold.tsx +109 -0
  167. package/src/sections.ts +69 -0
  168. package/src/slot-contracts.ts +20 -0
  169. package/src/stores/cart.store.ts +149 -0
  170. package/src/stores/catalog.store.ts +39 -0
  171. package/src/stores/session.store.ts +28 -0
  172. package/src/stores/toast.store.ts +43 -0
  173. package/src/testids.ts +103 -0
  174. package/src/theme.ts +160 -0
  175. package/src/workflows/checkout.ts +91 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/stores/session.store.ts","../src/auth.ts","../src/config.ts","../src/router.ts","../src/theme.ts","../src/format.ts","../src/product-options.ts","../src/stores/cart.store.ts","../src/stores/catalog.store.ts","../src/hooks/useCategories.ts","../src/motion.tsx","../src/testids.ts","../src/components/StorefrontHeader.tsx","../src/components/StorefrontFooter.tsx","../src/hooks/useDiscountValidator.ts","../src/stores/toast.store.ts","../src/components/QuantityInput.tsx","../src/components/CartDrawer.tsx","../src/hooks/useProducts.ts","../src/components/Price.tsx","../src/slot-contracts.ts","../src/components/ProductCard.tsx","../src/components/ProductGrid.tsx","../src/components/FiltersPanel.tsx","../src/hooks/useStorefrontHead.ts","../src/pages/CatalogPage.tsx","../src/sections.ts","../src/components/sections/HeroSection.tsx","../src/components/sections/CategoryShowcase.tsx","../src/components/sections/ProductRail.tsx","../src/components/sections/MiscSections.tsx","../src/blocks.tsx","../src/pages/HomePage.tsx","../src/hooks/useProduct.ts","../src/components/ProductOptionSelector.tsx","../src/components/ProductSpecs.tsx","../src/components/RelatedProducts.tsx","../src/pages/ProductDetailPage.tsx","../src/workflows/checkout.ts","../src/components/SignInModal.tsx","../src/pages/CheckoutPage.tsx","../src/components/CustomerAccountShell.tsx","../src/order-status.ts","../src/components/OrderTrackingTimeline.tsx","../src/pages/OrderConfirmationPage.tsx","../src/hooks/useMyOrders.ts","../src/pages/MyPurchasesPage.tsx","../src/pages/NotFoundPage.tsx","../src/pages/PolicyPage.tsx","../src/components/StorefrontErrorBoundary.tsx","../src/components/Toaster.tsx","../src/createStorefrontApp.tsx","../src/scaffold.tsx","../src/presets.ts"],"names":["create","persist","createMockAuthAdapter","adapter","getShopProvider","createContext","useContext","hashRouterAdapter","useState","useEffect","React","useRef","jsx","slug","jsxs","X","Phone","Mail","Search","initial","User","UserCircle","Package","CreditCard","LogOut","ShoppingBag","Fragment","useCallback","validateDiscount","toast","Minus","Plus","Trash2","useMemo","ChevronLeft","ChevronRight","LucideIcons","registerBlock","Truck","RefreshCcw","ShieldCheck","Lock","PackageCheck","Icon","error","MapPin","Check","XCircle","RotateCcw","Clock","QrCode","AlertCircle","Info","setShopProvider","createMockShopProvider","defineApp","registerScaffold"],"mappings":"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","file":"index.cjs","sourcesContent":["import { create } from 'zustand'\nimport { persist } from 'zustand/middleware'\n\n// Customer session state. Identity is established through the shared\n// @fayz-ai/auth AuthAdapter (see ../auth.ts) — this store only mirrors the\n// linked ShopCustomer for synchronous UI access.\n\nexport interface SessionState {\n customerId: string | null\n email: string | null\n name: string | null\n setSession(session: { customerId: string; email: string; name?: string | null }): void\n signOut(): void\n}\n\nexport const useSessionStore = create<SessionState>()(\n persist(\n (set) => ({\n customerId: null,\n email: null,\n name: null,\n setSession: ({ customerId, email, name }) =>\n set({ customerId, email, name: name ?? null }),\n signOut: () => set({ customerId: null, email: null, name: null }),\n }),\n { name: 'fayz.storefront.session.v1' },\n ),\n)\n","import type { AuthAdapter, AuthUser } from '@fayz-ai/core'\nimport { createMockAuthAdapter } from '@fayz-ai/auth'\nimport { getShopProvider } from '@fayz-ai/shop/runtime'\nimport { useSessionStore } from './stores/session.store'\n\n// ---------------------------------------------------------------------------\n// Customer auth — the SAME AuthAdapter contract createSaasApp uses, so the\n// mock and Supabase adapters from @fayz-ai/auth serve both the saas admin and\n// the storefront customer. The storefront adds one layer on top: linking the\n// auth identity to a ShopCustomer record (find-or-create by email) so orders\n// and purchase history attach to a customer.\n// ---------------------------------------------------------------------------\n\nexport type StorefrontAuthAdapter = AuthAdapter | 'mock' | 'supabase'\n\nlet _adapter: AuthAdapter | null = null\n\nexport function resolveAuthAdapter(\n configured: StorefrontAuthAdapter | undefined,\n): AuthAdapter {\n if (configured && configured !== 'mock' && configured !== 'supabase') return configured\n if (configured === 'supabase') {\n console.warn(\n '@fayz-ai/shop: auth.adapter=\"supabase\" is legacy. Pass an explicit AuthAdapter or use the Fayz SDK broker path.',\n )\n }\n return createMockAuthAdapter()\n}\n\n/** Called once by createStorefrontApp. Restores any persisted session. */\nexport function initCustomerAuth(adapter: AuthAdapter): void {\n _adapter = adapter\n adapter\n .getSession()\n .then((existing) => {\n if (!existing) return\n const store = useSessionStore.getState()\n // Re-link only when the persisted shop session doesn't match the auth user\n if (store.email !== existing.user.email) {\n void linkCustomer(existing.user)\n }\n })\n .catch(() => {})\n adapter.onAuthStateChange((user) => {\n if (!user) useSessionStore.getState().signOut()\n })\n}\n\nexport function getCustomerAuthAdapter(): AuthAdapter {\n if (!_adapter) _adapter = createMockAuthAdapter()\n return _adapter\n}\n\n/** Resolve (find-or-create + server-side auth link) the ShopCustomer for an email. */\nasync function resolveShopCustomer(email: string, name: string) {\n const provider = getShopProvider()\n // Preferred: provider.resolveCustomer find-or-creates AND links auth.uid\n // server-side (RLS-safe). Falls back to generic CRUD for legacy providers.\n if (provider.resolveCustomer) return provider.resolveCustomer({ email, name })\n const matches = await provider.listCustomers({ search: email, limit: 10 })\n const existing = matches.find((c) => (c.email ?? '').toLowerCase() === email)\n if (existing) return existing\n const parts = name.trim().split(/\\s+/).filter(Boolean)\n return provider.createCustomer({\n firstName: parts[0] ?? email.split('@')[0] ?? 'Cliente',\n lastName: parts.slice(1).join(' '),\n email,\n })\n}\n\n/** Find-or-create the ShopCustomer for an auth identity and persist the session. */\nasync function linkCustomer(user: AuthUser, fullName?: string): Promise<{ customerId: string }> {\n const email = (user.email ?? '').trim().toLowerCase()\n const name = fullName ?? user.fullName ?? ''\n const customer = await resolveShopCustomer(email, name)\n useSessionStore.getState().setSession({\n customerId: customer.id,\n email,\n name: name || `${customer.firstName} ${customer.lastName}`.trim(),\n })\n return { customerId: customer.id }\n}\n\nexport interface EstablishSessionOptions {\n /** Provided → adapter.signIn; omitted → passwordless customer identity via signUp (mock-friendly). */\n password?: string\n name?: string\n}\n\n/**\n * Sign a customer in through the auth adapter and link the ShopCustomer.\n * Used by the account page sign-in AND by checkout (so a buyer is signed in\n * for \"my purchases\" immediately after purchase) — one auth path, two doors.\n */\nexport async function establishCustomerSession(\n email: string,\n opts?: EstablishSessionOptions,\n): Promise<{ customerId: string }> {\n const normalized = email.trim().toLowerCase()\n if (opts?.password) {\n const adapter = getCustomerAuthAdapter()\n const session = await adapter.signIn(normalized, opts.password)\n return linkCustomer(session.user.email ? session.user : { ...session.user, email: normalized }, opts.name)\n }\n // Guest / passwordless checkout: do NOT create an auth account (that made\n // returning guests fail with \"user already registered\" on Supabase). Just\n // resolve the ShopCustomer and persist the local session for order history.\n return linkCustomer({ id: '', email: normalized } as AuthUser, opts?.name)\n}\n\n/** Convenience wrapper — passwordless email sign-in (guest checkout path). */\nexport function signInByEmail(email: string, name?: string): Promise<{ customerId: string }> {\n return establishCustomerSession(email, { name })\n}\n\n/** Explicit account creation (account page \"Criar conta\" form). */\nexport async function signUpCustomer(\n email: string,\n password: string,\n name: string,\n): Promise<{ customerId: string }> {\n const adapter = getCustomerAuthAdapter()\n const normalized = email.trim().toLowerCase()\n const session = await adapter.signUp(normalized, password, name)\n return linkCustomer(session.user.email ? session.user : { ...session.user, email: normalized }, name)\n}\n\nexport async function signOutCustomer(): Promise<void> {\n try {\n await getCustomerAuthAdapter().signOut()\n } finally {\n useSessionStore.getState().signOut()\n }\n}\n","import React, { createContext, useContext } from 'react'\nimport type { Product } from '@fayz-ai/shop/types'\nimport type { ShopProvider } from '@fayz-ai/shop/provider'\nimport type { MockShopSeed } from '@fayz-ai/shop/mock'\nimport type { StorefrontTheme } from './theme'\nimport type { HomeConfig, NavLink, FooterConfig } from './sections'\nimport type { StorefrontAuthAdapter } from './auth'\n\nexport interface ProductCardSlotProps {\n product: Product\n}\n\nexport type StorefrontRouteKind =\n | 'home'\n | 'catalog'\n | 'product'\n | 'checkout'\n | 'account'\n | 'order'\n | 'custom'\n\nexport type StorefrontRouteParams = Record<string, string>\n\nexport interface StorefrontRouteComponentProps {\n path: string\n params: StorefrontRouteParams\n config: ResolvedStorefrontConfig\n}\n\nexport type StorefrontRouteChrome = 'default' | 'focused'\n\nexport interface StorefrontRouteDefinition {\n /**\n * Stable identifier for generated-code diffs, QA reports, and route ownership.\n */\n id: string\n /**\n * Hash route pattern. Supports the same params as matchPath, e.g. '/checkout'\n * or '/collections/:slug'. Custom routes are matched before SDK defaults.\n */\n path: string\n /**\n * Intent label for agents and manifests. It does not change matching behavior.\n */\n kind?: StorefrontRouteKind\n /**\n * Shell chrome for the route. `focused` hides storefront nav/footer/cart\n * around high-intent flows such as checkout.\n */\n chrome?: StorefrontRouteChrome\n /**\n * App-owned screen/workflow that can still use storefront/shop primitives.\n */\n component: React.ComponentType<StorefrontRouteComponentProps>\n}\n\nexport interface StorefrontSlots {\n /**\n * Product card renderer used by catalog grids and product rails.\n *\n * Custom renderers must preserve `productCardSlotContract` selectors so\n * checkout smoke tests, QA, and agents can still operate the storefront.\n */\n ProductCard?: React.ComponentType<ProductCardSlotProps>\n}\n\nexport interface StorefrontDiscountConfig {\n code: string\n percent: number\n title?: string\n}\n\nexport interface StorefrontConfig {\n /** Store display name (header, page title) */\n name: string\n /** Optional logo node; defaults to the store name */\n logo?: React.ReactNode\n /** ISO 4217 — default 'BRL' */\n currency?: string\n /** Intl locale for money/date formatting — default 'pt-BR' */\n locale?: string\n /** Visual identity: colors, fonts, radius, header/card personality */\n theme?: StorefrontTheme\n /** Promo message above the header (e.g. 'FRETE GRÁTIS ACIMA DE R$ 300') */\n announcement?: string\n /** Home page blueprint. When set, `/` renders it and the catalog moves to /catalog. */\n home?: HomeConfig\n /** Header nav links — defaults derived from home/catalog routing */\n nav?: NavLink[]\n /** Footer content (about text, contact, social) */\n footer?: FooterConfig\n /** Preferred backend descriptor for manifest/scaffold metadata. */\n backend?: { provider?: 'mock' | 'fayz-api' | 'fayz-shop' | 'custom'; url?: string }\n /** @deprecated Use backend/provider adapters. Storefront no longer creates Supabase clients. */\n supabaseUrl?: string\n /** @deprecated Use backend/provider adapters. Storefront no longer creates Supabase clients. */\n supabaseAnonKey?: string\n /** Explicit provider override (tests, custom backends) */\n provider?: ShopProvider\n /** Per-store mock catalog (products/categories/discounts) for mock mode */\n catalog?: MockShopSeed\n /** Store-level discount codes available regardless of provider backend. */\n discounts?: StorefrontDiscountConfig[]\n /**\n * Institutional/legal page content (privacy, terms, returns). Plain text —\n * blank lines separate paragraphs. Unset pages render a placeholder so the\n * routes (and footer links) exist even before the store writes its policy.\n */\n legal?: { privacy?: string; terms?: string; returns?: string }\n /** Customer auth — same AuthAdapter contract as createSaasApp. Default: mock. */\n auth?: { adapter?: StorefrontAuthAdapter }\n /** Shipping pricing — default { flatRate: 0 } */\n shipping?: { flatRate?: number; freeAbove?: number }\n /**\n * Payment behavior. v1 default 'mock' instantly marks orders paid with NO\n * real charge (demo). M4 sets 'pix-mercadopago' so orders stay pending until\n * a real payment webhook confirms settlement.\n */\n payments?: { mode?: 'mock' | 'pix-mercadopago' }\n /** Feature toggles — discounts default off; accounts default on */\n features?: { discounts?: boolean; accounts?: boolean }\n /** Code-level customization slots. Kept out of serialized manifests. */\n slots?: StorefrontSlots\n /** Code-level route overrides/custom routes. Kept out of serialized manifests. */\n routes?: StorefrontRouteDefinition[]\n}\n\nexport interface ResolvedStorefrontConfig extends StorefrontConfig {\n currency: string\n locale: string\n shipping: { flatRate: number; freeAbove?: number }\n payments: { mode: 'mock' | 'pix-mercadopago' }\n features: { discounts: boolean; accounts: boolean }\n /** Where the full product list lives ('/' without a home page, '/catalog' with one) */\n catalogPath: string\n nav: NavLink[]\n}\n\nexport function resolveConfig(config: StorefrontConfig): ResolvedStorefrontConfig {\n const catalogPath = config.home ? '/catalog' : '/'\n return {\n ...config,\n currency: config.currency ?? 'BRL',\n locale: config.locale ?? 'pt-BR',\n shipping: { flatRate: config.shipping?.flatRate ?? 0, freeAbove: config.shipping?.freeAbove },\n payments: { mode: config.payments?.mode ?? 'mock' },\n features: {\n // Auto-enable the coupon UI when the store actually ships discount codes\n // (via config.discounts or a seeded catalog), unless explicitly overridden —\n // otherwise a store can advertise a coupon with no field to enter it.\n discounts:\n config.features?.discounts ??\n Boolean(config.discounts?.length || config.catalog?.discounts?.length),\n accounts: config.features?.accounts ?? true,\n },\n catalogPath,\n nav:\n config.nav ??\n (config.home\n ? [\n { label: 'Início', to: '/' },\n { label: 'Loja', to: '/catalog' },\n ]\n : [{ label: 'Loja', to: '/' }]),\n }\n}\n\nconst StorefrontConfigContext = createContext<ResolvedStorefrontConfig | null>(null)\n\nexport const StorefrontConfigProvider = StorefrontConfigContext.Provider\n\nexport function useStorefrontConfig(): ResolvedStorefrontConfig {\n const ctx = useContext(StorefrontConfigContext)\n if (!ctx) throw new Error('useStorefrontConfig must be used inside createStorefrontApp')\n return ctx\n}\n","import React, { useEffect, useState } from 'react'\nimport { hashRouterAdapter } from '@fayz-ai/core'\n\n// Minimal hash router for the storefront. Deliberately not react-router:\n// an SDK package shipping a router dependency creates singleton hazards\n// under source-alias dev setups, and six routes don't justify one.\n\nconst adapter = hashRouterAdapter()\n\nexport function navigateTo(to: string): void {\n adapter.navigate(to)\n}\n\nexport function useHashPath(): string {\n const [path, setPath] = useState(() => adapter.getCurrentPath() || '/')\n useEffect(() => {\n const unsub = adapter.onPathChange((p) => {\n setPath(p || '/')\n window.scrollTo(0, 0)\n })\n return unsub\n }, [])\n return path\n}\n\n/** Match '/product/:slug' against '/product/leather-backpack' → { slug: 'leather-backpack' } */\nexport function matchPath(pattern: string, path: string): Record<string, string> | null {\n const cleanPath = (path.split('?')[0] ?? '').replace(/\\/+$/, '') || '/'\n const patternParts = pattern.split('/').filter(Boolean)\n const pathParts = cleanPath.split('/').filter(Boolean)\n if (patternParts.length !== pathParts.length) return null\n const params: Record<string, string> = {}\n for (let i = 0; i < patternParts.length; i++) {\n const pat = patternParts[i]!\n const part = pathParts[i]!\n if (pat.startsWith(':')) params[pat.slice(1)] = decodeURIComponent(part)\n else if (pat !== part) return null\n }\n return params\n}\n\nexport interface LinkProps extends React.AnchorHTMLAttributes<HTMLAnchorElement> {\n to: string\n}\n\n/** Real anchor (#/path) — middle-click/cmd-click friendly, Playwright friendly. */\nexport function Link({ to, children, ...rest }: LinkProps) {\n return React.createElement('a', { href: `#${to}`, ...rest }, children)\n}\n","import React, { useEffect } from 'react'\n\n// ---------------------------------------------------------------------------\n// StorefrontTheme — the storefront counterpart of SaasTheme.\n// Personalizes colors (HSL token triplets), typography (Google Fonts pairing),\n// radius and layout properties via CSS custom properties, so every @fayz-ai/ui\n// token class (bg-background, text-primary, ...) picks the brand up for free.\n//\n// Derived from the Nuvemshop template research (docs/storefront-templates-research.md):\n// the personalization axes are palette, font pairing, radius, header treatment,\n// hero style and product-card style.\n// ---------------------------------------------------------------------------\n\nexport type StorefrontRadius = 'none' | 'soft' | 'round' | 'pill'\nexport type HeaderVariant = 'classic' | 'centered' | 'search' | 'minimal'\nexport type HeroVariant = 'banner' | 'split' | 'slider'\nexport type CardStyle = 'card' | 'editorial'\n\nexport interface StorefrontThemeColors {\n /** HSL triplets, e.g. '40 20% 94%' — same convention as SaasTheme */\n background?: string\n foreground?: string\n primary?: string\n primaryForeground?: string\n card?: string\n cardForeground?: string\n muted?: string\n mutedForeground?: string\n border?: string\n /** Header treatment — dark headers (Brasília) set these */\n headerBackground?: string\n headerForeground?: string\n /** Announcement bar */\n announcementBackground?: string\n announcementForeground?: string\n}\n\nexport interface StorefrontThemeFont {\n /** Display font for headings, e.g. 'Marcellus' */\n heading: string\n /** Body font, e.g. 'Rubik' */\n body: string\n /** Google Fonts families to load (defaults to heading+body) */\n googleFonts?: string[]\n /** Fallback stack — default sans-serif; use 'serif' for editorial themes */\n fallback?: 'sans-serif' | 'serif'\n}\n\nexport interface StorefrontTheme {\n name: string\n colors?: StorefrontThemeColors\n font?: StorefrontThemeFont\n radius?: StorefrontRadius\n /** Layout personality */\n header?: {\n variant?: HeaderVariant\n /** Uppercase nav links (premium retail tone) */\n uppercaseNav?: boolean\n }\n productCard?: {\n style?: CardStyle\n imageAspect?: 'square' | 'portrait'\n }\n /** Uppercase CTA buttons with letter-spacing (Uyuni/Flex tone) */\n uppercaseButtons?: boolean\n}\n\nconst RADIUS_MAP: Record<StorefrontRadius, { button: string; card: string; input: string }> = {\n none: { button: '0px', card: '0px', input: '0px' },\n soft: { button: '6px', card: '10px', input: '6px' },\n round: { button: '10px', card: '16px', input: '10px' },\n pill: { button: '999px', card: '20px', input: '999px' },\n}\n\nconst COLOR_VAR_MAP: Record<keyof StorefrontThemeColors, string> = {\n background: '--background',\n foreground: '--foreground',\n primary: '--primary',\n primaryForeground: '--primary-foreground',\n card: '--card',\n cardForeground: '--card-foreground',\n muted: '--muted',\n mutedForeground: '--muted-foreground',\n border: '--border',\n headerBackground: '--sf-header-bg',\n headerForeground: '--sf-header-fg',\n announcementBackground: '--sf-announcement-bg',\n announcementForeground: '--sf-announcement-fg',\n}\n\nexport function themeToCss(theme: StorefrontTheme): string {\n const lines: string[] = []\n\n for (const [key, cssVar] of Object.entries(COLOR_VAR_MAP) as [keyof StorefrontThemeColors, string][]) {\n const value = theme.colors?.[key]\n if (value) lines.push(`${cssVar}: ${value};`)\n }\n // Header defaults to the page background unless the theme sets one\n if (!theme.colors?.headerBackground && theme.colors?.background) {\n lines.push(`--sf-header-bg: ${theme.colors.background};`)\n }\n if (!theme.colors?.headerForeground && theme.colors?.foreground) {\n lines.push(`--sf-header-fg: ${theme.colors.foreground};`)\n }\n\n if (theme.font) {\n const fallback = theme.font.fallback ?? 'sans-serif'\n lines.push(`--font-family: '${theme.font.body}', ${fallback};`)\n lines.push(`--sf-font-heading: '${theme.font.heading}', ${fallback};`)\n }\n\n const radius = RADIUS_MAP[theme.radius ?? 'soft']\n lines.push(`--button-radius: ${radius.button};`)\n lines.push(`--card-radius: ${radius.card};`)\n lines.push(`--input-radius: ${radius.input};`)\n lines.push(`--sf-radius-button: ${radius.button};`)\n lines.push(`--sf-radius-card: ${radius.card};`)\n lines.push(`--sf-radius-input: ${radius.input};`)\n\n let css = `:root {\\n ${lines.join('\\n ')}\\n}\\n`\n css += `body { font-family: var(--font-family); }\\n`\n css += `h1, h2, h3, h4, .sf-heading { font-family: var(--sf-font-heading, var(--font-family)); }\\n`\n if (theme.uppercaseButtons) {\n css += `.sf-cta { text-transform: uppercase; letter-spacing: 0.08em; }\\n`\n }\n if (theme.header?.uppercaseNav) {\n css += `.sf-nav-link { text-transform: uppercase; letter-spacing: 0.06em; font-size: 0.8rem; }\\n`\n }\n return css\n}\n\nfunction googleFontsHref(theme: StorefrontTheme): string | null {\n if (!theme.font) return null\n const families = theme.font.googleFonts ?? [theme.font.heading, theme.font.body]\n const unique = [...new Set(families)]\n const params = unique\n .map((f) => `family=${encodeURIComponent(f).replace(/%20/g, '+')}:wght@300;400;500;600;700`)\n .join('&')\n return `https://fonts.googleapis.com/css2?${params}&display=swap`\n}\n\n/** Injects theme CSS variables + Google Fonts. Mount once inside the app root. */\nexport function StorefrontThemeStyle({ theme }: { theme: StorefrontTheme }) {\n const fontsHref = googleFontsHref(theme)\n\n useEffect(() => {\n if (!fontsHref) return\n const id = 'sf-theme-fonts'\n let link = document.getElementById(id) as HTMLLinkElement | null\n if (!link) {\n link = document.createElement('link')\n link.id = id\n link.rel = 'stylesheet'\n document.head.appendChild(link)\n }\n link.href = fontsHref\n }, [fontsHref])\n\n return React.createElement('style', { 'data-sf-theme': theme.name }, themeToCss(theme))\n}\n","export function formatMoney(value: number, currency = 'BRL', locale = 'pt-BR'): string {\n return new Intl.NumberFormat(locale, { style: 'currency', currency }).format(value)\n}\n\nexport function roundCents(value: number): number {\n return Math.round(value * 100) / 100\n}\n","import type { Product } from '@fayz-ai/shop/types'\n\nexport interface ProductOptionGroup {\n id: string\n label: string\n values: string[]\n}\n\nexport type ProductOptionSelection = Record<string, string>\n\nfunction cleanValues(value: unknown): string[] {\n if (!Array.isArray(value)) return []\n return Array.from(new Set(value.filter((item): item is string => typeof item === 'string' && item.trim().length > 0)))\n}\n\nfunction cleanOptionGroup(value: unknown): ProductOptionGroup | null {\n if (!value || typeof value !== 'object') return null\n const record = value as Record<string, unknown>\n const id = typeof record.id === 'string' ? record.id : typeof record.name === 'string' ? record.name : null\n const label = typeof record.label === 'string' ? record.label : typeof record.name === 'string' ? record.name : id\n const values = cleanValues(record.values)\n if (!id || !label || values.length === 0) return null\n return { id, label, values }\n}\n\nexport function getProductOptionGroups(product: Product): ProductOptionGroup[] {\n const options = product.metadata.options\n const explicit = Array.isArray(options)\n ? options.map(cleanOptionGroup).filter((group): group is ProductOptionGroup => Boolean(group))\n : []\n\n if (explicit.length > 0) return explicit\n\n const groups: ProductOptionGroup[] = []\n const sizes = cleanValues(product.metadata.sizes)\n const colors = cleanValues(product.metadata.colors)\n\n if (sizes.length > 0) groups.push({ id: 'Tamanho', label: 'Tamanho', values: sizes })\n if (colors.length > 0) groups.push({ id: 'Cor', label: 'Cor', values: colors })\n\n return groups\n}\n\nexport function normalizeProductOptionSelection(selection?: ProductOptionSelection | null): ProductOptionSelection {\n if (!selection) return {}\n return Object.fromEntries(\n Object.entries(selection)\n .filter((entry): entry is [string, string] => entry[0].trim().length > 0 && entry[1].trim().length > 0)\n .sort(([a], [b]) => a.localeCompare(b)),\n )\n}\n\nexport function formatProductOptionSelection(selection?: ProductOptionSelection | null): string {\n return Object.entries(normalizeProductOptionSelection(selection))\n .map(([label, value]) => `${label}: ${value}`)\n .join(' · ')\n}\n\nexport function productOptionSelectionKey(selection?: ProductOptionSelection | null): string {\n const normalized = normalizeProductOptionSelection(selection)\n const entries = Object.entries(normalized)\n return entries.length > 0 ? JSON.stringify(entries) : ''\n}\n","import { create } from 'zustand'\nimport { persist } from 'zustand/middleware'\nimport type { Product } from '@fayz-ai/shop/types'\nimport { roundCents } from '../format'\nimport type { ResolvedStorefrontConfig } from '../config'\nimport {\n formatProductOptionSelection,\n normalizeProductOptionSelection,\n productOptionSelectionKey,\n type ProductOptionSelection,\n} from '../product-options'\n\nexport interface CartLine {\n lineId: string\n productId: string\n slug: string\n name: string\n sku: string | null\n options: ProductOptionSelection\n optionsLabel: string\n unitPrice: number\n quantity: number\n imageUrl: string | null\n /** inventoryCount at add time — clamps quantity */\n maxQuantity: number\n}\n\nexport interface CartState {\n lines: CartLine[]\n discountCode: string | null\n discountPercent: number\n isOpen: boolean\n /** Line most recently added — lets the drawer briefly highlight it. */\n justAddedLineId: string | null\n addItem(product: Product, qty?: number, options?: ProductOptionSelection): void\n setQuantity(lineId: string, qty: number): void\n removeItem(lineId: string): void\n applyDiscount(code: string, percent: number): void\n clearDiscount(): void\n clear(): void\n openDrawer(): void\n closeDrawer(): void\n}\n\nexport const useCartStore = create<CartState>()(\n persist(\n (set) => ({\n lines: [],\n discountCode: null,\n discountPercent: 0,\n isOpen: false,\n justAddedLineId: null,\n\n addItem: (product, qty = 1, options) =>\n set((state) => {\n const normalizedOptions = normalizeProductOptionSelection(options)\n const optionKey = productOptionSelectionKey(normalizedOptions)\n const lineId = optionKey ? `${product.id}:${optionKey}` : product.id\n const existing = state.lines.find((l) => (l.lineId ?? l.productId) === lineId)\n if (existing) {\n const nextQty = Math.min(existing.quantity + qty, existing.maxQuantity || Infinity)\n return {\n // Auto-open the cart on add — the standard premium \"slide-in cart\"\n // signal — and flag the line so the drawer can highlight it.\n isOpen: true,\n justAddedLineId: lineId,\n lines: state.lines.map((l) =>\n (l.lineId ?? l.productId) === lineId ? { ...l, lineId, quantity: nextQty } : l,\n ),\n }\n }\n const image = product.images.find((i) => i.isPrimary) ?? product.images[0]\n const line: CartLine = {\n lineId,\n productId: product.id,\n slug: product.slug,\n name: product.name,\n sku: product.sku,\n options: normalizedOptions,\n optionsLabel: formatProductOptionSelection(normalizedOptions),\n unitPrice: product.price,\n quantity: Math.min(qty, product.inventoryCount || Infinity),\n imageUrl: image?.url ?? null,\n maxQuantity: product.inventoryCount,\n }\n return { isOpen: true, justAddedLineId: lineId, lines: [...state.lines, line] }\n }),\n\n setQuantity: (lineId, qty) =>\n set((state) => {\n if (qty <= 0) return { lines: state.lines.filter((l) => (l.lineId ?? l.productId) !== lineId) }\n return {\n lines: state.lines.map((l) =>\n (l.lineId ?? l.productId) === lineId\n ? { ...l, quantity: Math.min(qty, l.maxQuantity || Infinity) }\n : l,\n ),\n }\n }),\n\n removeItem: (lineId) =>\n set((state) => ({ lines: state.lines.filter((l) => (l.lineId ?? l.productId) !== lineId) })),\n\n applyDiscount: (code, percent) => set({ discountCode: code, discountPercent: percent }),\n clearDiscount: () => set({ discountCode: null, discountPercent: 0 }),\n clear: () => set({ lines: [], discountCode: null, discountPercent: 0 }),\n openDrawer: () => set({ isOpen: true }),\n closeDrawer: () => set({ isOpen: false, justAddedLineId: null }),\n }),\n {\n name: 'fayz.storefront.cart.v1',\n partialize: (state) => ({\n lines: state.lines,\n discountCode: state.discountCode,\n discountPercent: state.discountPercent,\n }),\n },\n ),\n)\n\n// ---------------------------------------------------------------------------\n// Money selectors — the single place cart math happens. Checkout passes these\n// exact values to createOrder so drawer totals always match order totals.\n// ---------------------------------------------------------------------------\n\nexport const selectCount = (s: Pick<CartState, 'lines'>): number =>\n s.lines.reduce((n, l) => n + l.quantity, 0)\n\nexport const selectSubtotal = (s: Pick<CartState, 'lines'>): number =>\n roundCents(s.lines.reduce((sum, l) => sum + l.unitPrice * l.quantity, 0))\n\nexport const selectDiscountTotal = (s: Pick<CartState, 'lines' | 'discountPercent'>): number =>\n roundCents(selectSubtotal(s) * (s.discountPercent / 100))\n\nexport const selectShipping = (\n s: Pick<CartState, 'lines'>,\n cfg: ResolvedStorefrontConfig,\n): number => {\n if (s.lines.length === 0) return 0\n const subtotal = selectSubtotal(s)\n if (cfg.shipping.freeAbove != null && subtotal >= cfg.shipping.freeAbove) return 0\n return cfg.shipping.flatRate\n}\n\nexport const selectTotal = (\n s: Pick<CartState, 'lines' | 'discountPercent'>,\n cfg: ResolvedStorefrontConfig,\n): number =>\n roundCents(selectSubtotal(s) - selectDiscountTotal(s) + selectShipping(s, cfg))\n","import { create } from 'zustand'\n\nexport type CatalogSort = 'newest' | 'price-asc' | 'price-desc' | 'name'\n\nexport interface CatalogState {\n search: string\n categoryId: string | null\n priceMin: number | null\n priceMax: number | null\n inStockOnly: boolean\n sort: CatalogSort\n setSearch(search: string): void\n setCategoryId(categoryId: string | null): void\n setPriceMin(priceMin: number | null): void\n setPriceMax(priceMax: number | null): void\n setInStockOnly(inStockOnly: boolean): void\n setSort(sort: CatalogSort): void\n reset(): void\n}\n\nconst initial = {\n search: '',\n categoryId: null,\n priceMin: null,\n priceMax: null,\n inStockOnly: false,\n sort: 'newest' as CatalogSort,\n}\n\nexport const useCatalogStore = create<CatalogState>()((set) => ({\n ...initial,\n setSearch: (search) => set({ search }),\n setCategoryId: (categoryId) => set({ categoryId }),\n setPriceMin: (priceMin) => set({ priceMin }),\n setPriceMax: (priceMax) => set({ priceMax }),\n setInStockOnly: (inStockOnly) => set({ inStockOnly }),\n setSort: (sort) => set({ sort }),\n reset: () => set(initial),\n}))\n","import { useEffect, useState } from 'react'\nimport { getShopProvider } from '@fayz-ai/shop/runtime'\nimport type { Category } from '@fayz-ai/shop/types'\n\nexport function useCategories(): { categories: Category[]; loading: boolean } {\n const [categories, setCategories] = useState<Category[]>([])\n const [loading, setLoading] = useState(true)\n\n useEffect(() => {\n let cancelled = false\n getShopProvider()\n .listCategories()\n .then((data) => {\n if (!cancelled) setCategories(data)\n })\n .catch(() => {})\n .finally(() => {\n if (!cancelled) setLoading(false)\n })\n return () => {\n cancelled = true\n }\n }, [])\n\n return { categories, loading }\n}\n","import React, { useEffect, useRef, useState } from 'react'\n\n// ---------------------------------------------------------------------------\n// Core motion primitives — every storefront inherits these; stores never\n// implement animation ad hoc. All effects respect prefers-reduced-motion.\n// ---------------------------------------------------------------------------\n\nexport function prefersReducedMotion(): boolean {\n if (typeof window === 'undefined' || !window.matchMedia) return false\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches\n}\n\n/** True once the element has entered the viewport (one-shot). */\nexport function useInView<T extends HTMLElement>(margin = '0px 0px -8% 0px'): [React.RefObject<T>, boolean] {\n const ref = useRef<T>(null)\n const [inView, setInView] = useState(() => prefersReducedMotion())\n\n useEffect(() => {\n if (inView) return\n const el = ref.current\n if (!el || typeof IntersectionObserver === 'undefined') {\n setInView(true)\n return\n }\n const observer = new IntersectionObserver(\n (entries) => {\n if (entries.some((e) => e.isIntersecting)) {\n setInView(true)\n observer.disconnect()\n }\n },\n { rootMargin: margin },\n )\n observer.observe(el)\n return () => observer.disconnect()\n }, [inView, margin])\n\n return [ref, inView]\n}\n\nexport interface RevealProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Stagger delay in ms */\n delay?: number\n children: React.ReactNode\n}\n\n/** Plays a fade-up entrance when the element scrolls into view.\n * Content is VISIBLE by default — never pre-hidden — so screenshots,\n * crawlers and environments without IntersectionObserver always see it;\n * the animation's own from-state handles the fade. */\nexport function Reveal({ delay = 0, children, className, style, ...rest }: RevealProps) {\n const [ref, inView] = useInView<HTMLDivElement>()\n return (\n <div\n ref={ref}\n className={`${inView ? 'animate-fade-up' : ''} ${className ?? ''}`}\n style={{ ...style, animationDelay: delay ? `${delay}ms` : undefined }}\n {...rest}\n >\n {children}\n </div>\n )\n}\n\n/** True after the window has scrolled past the threshold (header treatments). */\nexport function useScrolled(threshold = 8): boolean {\n const [scrolled, setScrolled] = useState(false)\n useEffect(() => {\n const onScroll = () => setScrolled(window.scrollY > threshold)\n onScroll()\n window.addEventListener('scroll', onScroll, { passive: true })\n return () => window.removeEventListener('scroll', onScroll)\n }, [threshold])\n return scrolled\n}\n\n/** Re-triggers a CSS animation class whenever `value` changes (cart badge pop). */\nexport function usePopOnChange(value: number): boolean {\n const [pop, setPop] = useState(false)\n const prev = useRef(value)\n useEffect(() => {\n if (prev.current !== value && value > 0) {\n setPop(true)\n const t = setTimeout(() => setPop(false), 400)\n return () => clearTimeout(t)\n }\n prev.current = value\n return undefined\n }, [value])\n useEffect(() => {\n prev.current = value\n })\n return pop\n}\n","// Single source of truth for e2e selectors. Components import from here;\n// Playwright specs assert against the same constants — they cannot drift.\nexport const TID = {\n // header\n headerSearch: 'header-search',\n cartButton: 'cart-button',\n cartCount: 'cart-count',\n accountLink: 'account-link',\n accountDropdown: 'account-dropdown',\n announcementBar: 'announcement-bar',\n navLink: (label: string) => `nav-${label.toLowerCase().replace(/\\s+/g, '-')}`,\n navCategory: (slug: string) => `nav-cat-${slug}`,\n accountName: 'account-name',\n // home sections\n hero: 'home-hero',\n heroPrev: 'hero-prev',\n heroNext: 'hero-next',\n categoryShowcase: 'category-showcase',\n productRail: 'product-rail',\n benefits: 'benefits-row',\n promoBanner: 'promo-banner',\n manifesto: 'manifesto',\n testimonials: 'testimonials',\n newsletter: 'newsletter',\n newsletterEmail: 'newsletter-email',\n newsletterSubmit: 'newsletter-submit',\n newsletterDone: 'newsletter-done',\n // catalog\n productGrid: 'product-grid',\n productCard: 'product-card',\n productCardName: 'product-card-name',\n productCardPrice: 'product-card-price',\n productCardAdd: 'product-card-add',\n badgeSale: 'badge-sale',\n badgeSoldout: 'badge-soldout',\n // filters\n filterCategory: (slug: string) => `filter-category-${slug}`,\n filterPriceMin: 'filter-price-min',\n filterPriceMax: 'filter-price-max',\n filterInstock: 'filter-instock',\n sortSelect: 'sort-select',\n filtersClear: 'filters-clear',\n // product detail\n pdpName: 'pdp-name',\n pdpPrice: 'pdp-price',\n pdpComparePrice: 'pdp-compare-price',\n pdpDescription: 'pdp-description',\n productOptionGroup: (id: string) => `product-option-${id.toLowerCase().replace(/\\s+/g, '-')}`,\n productOptionValue: (id: string, value: string) => `product-option-${id.toLowerCase().replace(/\\s+/g, '-')}-${value.toLowerCase().replace(/\\s+/g, '-')}`,\n pdpQtyInput: 'pdp-qty-input',\n pdpAddToCart: 'pdp-add-to-cart',\n // cart\n cartDrawer: 'cart-drawer',\n cartLine: 'cart-line',\n lineQty: 'line-qty',\n lineInc: 'line-inc',\n lineDec: 'line-dec',\n lineRemove: 'line-remove',\n cartSubtotal: 'cart-subtotal',\n discountInput: 'discount-input',\n discountApply: 'discount-apply',\n discountRow: 'discount-row',\n discountError: 'discount-error',\n cartShipping: 'cart-shipping',\n shippingProgress: 'shipping-progress',\n cartTotal: 'cart-total',\n goCheckout: 'go-checkout',\n cartEmpty: 'cart-empty',\n // checkout\n checkoutEmail: 'checkout-email',\n checkoutName: 'checkout-name',\n checkoutStreet: 'checkout-street',\n checkoutCity: 'checkout-city',\n checkoutZip: 'checkout-zip',\n checkoutCard: 'checkout-card',\n checkoutExpiry: 'checkout-expiry',\n checkoutCvc: 'checkout-cvc',\n placeOrder: 'place-order',\n checkoutError: 'checkout-error',\n checkoutProcessing: 'checkout-processing',\n // confirmation\n orderNumber: 'order-number',\n orderStatus: 'order-status',\n orderTracking: 'order-tracking',\n orderTrackingStep: (step: string) => `order-tracking-step-${step}`,\n orderTotal: 'order-total',\n viewPurchases: 'view-purchases',\n // account\n customerAccountShell: 'customer-account-shell',\n customerAccountMenu: 'customer-account-menu',\n orderDetail: 'order-detail',\n authTabSignin: 'auth-tab-signin',\n authTabSignup: 'auth-tab-signup',\n signinEmail: 'signin-email',\n signinPassword: 'signin-password',\n signinName: 'signin-name',\n signinSubmit: 'signin-submit',\n authError: 'auth-error',\n purchasesList: 'purchases-list',\n purchaseItem: 'purchase-item',\n purchasesEmpty: 'purchases-empty',\n signout: 'signout',\n} as const\n","import React, { useState } from 'react'\nimport { CreditCard, LogOut, Mail, Package, Phone, Search, ShoppingBag, User, UserCircle, X } from 'lucide-react'\nimport { signOutCustomer } from '../auth'\nimport { useCartStore, selectCount } from '../stores/cart.store'\nimport { useCatalogStore } from '../stores/catalog.store'\nimport { useSessionStore } from '../stores/session.store'\nimport { useCategories } from '../hooks/useCategories'\nimport { useStorefrontConfig } from '../config'\nimport { useScrolled, usePopOnChange } from '../motion'\nimport { Link, navigateTo, useHashPath } from '../router'\nimport { TID } from '../testids'\n\n// Header tokens come from the theme (--sf-header-bg/fg) so dark headers\n// (Brasília pattern) work without component changes. Dividers derive from the\n// header FOREGROUND (not the page --border token, which is light and shows as\n// white lines on dark headers).\nconst headerStyle: React.CSSProperties = {\n backgroundColor: 'hsl(var(--sf-header-bg, var(--background)))',\n color: 'hsl(var(--sf-header-fg, var(--foreground)))',\n borderColor: 'hsl(var(--sf-header-fg, var(--foreground)) / 0.14)',\n}\n\nconst headerDivider: React.CSSProperties = {\n borderColor: 'hsl(var(--sf-header-fg, var(--foreground)) / 0.14)',\n}\n\nconst ANNOUNCEMENT_KEY = 'fayz.storefront.announcement.dismissed'\n\nfunction AnnouncementBar() {\n const config = useStorefrontConfig()\n const [dismissed, setDismissed] = useState(() => {\n try {\n return localStorage.getItem(ANNOUNCEMENT_KEY) === config.announcement\n } catch {\n return false\n }\n })\n if (!config.announcement || dismissed) return null\n\n const dismiss = () => {\n setDismissed(true)\n try {\n localStorage.setItem(ANNOUNCEMENT_KEY, config.announcement ?? '')\n } catch {\n /* storage unavailable — dismiss for this session only */\n }\n }\n\n return (\n <div\n data-testid={TID.announcementBar}\n className=\"relative px-4 py-2 text-center text-xs font-semibold tracking-wide\"\n style={{\n backgroundColor: 'hsl(var(--sf-announcement-bg, var(--primary)))',\n color: 'hsl(var(--sf-announcement-fg, var(--primary-foreground)))',\n }}\n >\n {config.announcement}\n <button\n type=\"button\"\n aria-label=\"Fechar aviso\"\n onClick={dismiss}\n className=\"absolute right-2 top-1/2 -translate-y-1/2 rounded-full p-1 opacity-70 transition-opacity hover:opacity-100\"\n >\n <X className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n )\n}\n\n/** Slim utility strip (Flex pattern): contact on the left, social on the right. */\nfunction UtilityBar() {\n const config = useStorefrontConfig()\n const contact = config.footer?.contact\n const social = config.footer?.social\n if (!contact?.phone && !contact?.email && !social?.length) return null\n return (\n <div className=\"hidden border-b text-xs opacity-80 md:block\" style={headerDivider}>\n <div className=\"mx-auto flex h-8 max-w-7xl items-center gap-5 px-4 sm:px-6\">\n {contact?.phone && (\n <span className=\"inline-flex items-center gap-1.5\">\n <Phone className=\"h-3 w-3\" /> {contact.phone}\n </span>\n )}\n {contact?.email && (\n <span className=\"inline-flex items-center gap-1.5\">\n <Mail className=\"h-3 w-3\" /> {contact.email}\n </span>\n )}\n <span className=\"ml-auto flex items-center gap-4\">\n {social?.map((s) => (\n <a key={s.href} href={s.href} target=\"_blank\" rel=\"noreferrer\" className=\"hover:underline\">\n {s.label}\n </a>\n ))}\n </span>\n </div>\n </div>\n )\n}\n\nfunction SearchInput({ className }: { className?: string }) {\n const config = useStorefrontConfig()\n const search = useCatalogStore((s) => s.search)\n const setSearch = useCatalogStore((s) => s.setSearch)\n const path = useHashPath()\n\n return (\n <div className={`relative ${className ?? ''}`}>\n <Search className=\"pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 opacity-60\" />\n <input\n data-testid={TID.headerSearch}\n type=\"search\"\n placeholder=\"Buscar produtos...\"\n value={search}\n onChange={(e) => {\n setSearch(e.target.value)\n if (path !== config.catalogPath) navigateTo(config.catalogPath)\n }}\n className=\"w-full border bg-white/10 py-2 pl-9 pr-4 text-sm outline-none transition-colors placeholder:opacity-60 focus:border-primary focus:bg-white focus:text-gray-900\"\n style={{\n borderRadius: 'var(--sf-radius-input)',\n borderColor: 'hsl(var(--sf-header-fg, var(--foreground)) / 0.25)',\n }}\n />\n </div>\n )\n}\n\nfunction HeaderActions() {\n const config = useStorefrontConfig()\n const count = useCartStore(selectCount)\n const openDrawer = useCartStore((s) => s.openDrawer)\n const session = useSessionStore()\n const [accountOpen, setAccountOpen] = useState(false)\n const pop = usePopOnChange(count)\n const firstName = session.name?.split(/\\s+/)[0]\n const initial = (firstName ?? session.email ?? 'C').slice(0, 1).toUpperCase()\n return (\n <nav className=\"flex items-center gap-1\">\n {config.features.accounts && (\n <div className=\"relative\">\n {session.email ? (\n <button\n type=\"button\"\n data-testid={TID.accountLink}\n aria-label=\"Abrir menu da conta\"\n aria-expanded={accountOpen}\n onClick={() => setAccountOpen((open) => !open)}\n className=\"flex items-center gap-1.5 rounded-full p-1.5 transition-opacity hover:opacity-80\"\n >\n <span className=\"flex h-8 w-8 items-center justify-center rounded-full bg-primary text-sm font-bold text-primary-foreground\">\n {initial}\n </span>\n {firstName && (\n <span data-testid={TID.accountName} className=\"hidden max-w-24 truncate text-sm font-medium lg:inline\">\n {firstName}\n </span>\n )}\n </button>\n ) : (\n <Link\n to=\"/account\"\n data-testid={TID.accountLink}\n aria-label=\"Minhas compras\"\n className=\"flex items-center gap-1.5 rounded-full p-2.5 transition-opacity hover:opacity-70\"\n >\n <User className=\"h-5 w-5\" />\n </Link>\n )}\n {accountOpen && session.email && (\n <div\n data-testid={TID.accountDropdown}\n className=\"absolute right-0 top-full z-50 mt-3 w-72 overflow-hidden rounded-xl border bg-background text-foreground shadow-xl\"\n >\n <div className=\"border-b p-4\">\n <p className=\"font-semibold\">{session.name || firstName || 'Cliente'}</p>\n <p className=\"truncate text-sm text-muted-foreground\">{session.email}</p>\n </div>\n <div className=\"p-2\">\n <Link to=\"/account\" className=\"flex items-center gap-3 rounded-lg px-3 py-2.5 text-sm font-semibold hover:bg-muted\">\n <UserCircle className=\"h-4 w-4\" />\n Perfil\n </Link>\n <Link to=\"/account\" className=\"flex items-center gap-3 rounded-lg px-3 py-2.5 text-sm font-semibold hover:bg-muted\">\n <Package className=\"h-4 w-4\" />\n Meus pedidos\n </Link>\n <Link to=\"/account\" className=\"flex items-center gap-3 rounded-lg px-3 py-2.5 text-sm font-semibold hover:bg-muted\">\n <CreditCard className=\"h-4 w-4\" />\n Pagamentos\n </Link>\n <button\n type=\"button\"\n onClick={() => {\n setAccountOpen(false)\n void signOutCustomer()\n }}\n className=\"flex w-full items-center gap-3 rounded-lg px-3 py-2.5 text-left text-sm font-semibold hover:bg-muted\"\n >\n <LogOut className=\"h-4 w-4\" />\n Sair\n </button>\n </div>\n </div>\n )}\n </div>\n )}\n <button\n type=\"button\"\n data-testid={TID.cartButton}\n aria-label=\"Carrinho\"\n onClick={openDrawer}\n className=\"relative rounded-full p-2.5 transition-opacity hover:opacity-70\"\n >\n <ShoppingBag className=\"h-5 w-5\" />\n {count > 0 && (\n <span\n data-testid={TID.cartCount}\n className={`absolute -right-0.5 -top-0.5 flex h-5 min-w-5 items-center justify-center rounded-full bg-primary px-1 text-xs font-semibold text-primary-foreground ${\n pop ? 'animate-badge-pop' : ''\n }`}\n >\n {count}\n </span>\n )}\n </button>\n </nav>\n )\n}\n\nfunction NavLinks({ className }: { className?: string }) {\n const config = useStorefrontConfig()\n const { categories } = useCategories()\n const setCategoryId = useCatalogStore((s) => s.setCategoryId)\n\n const goCategory = (categoryId: string) => {\n useCatalogStore.getState().reset()\n setCategoryId(categoryId)\n navigateTo(config.catalogPath)\n }\n\n return (\n <nav className={`flex items-center gap-6 ${className ?? ''}`}>\n {config.nav.map((link) => (\n <Link\n key={link.to}\n to={link.to}\n data-testid={TID.navLink(link.label)}\n className=\"sf-nav-link text-sm font-medium transition-opacity hover:opacity-70\"\n >\n {link.label}\n </Link>\n ))}\n {categories.slice(0, 6).map((c) => (\n <button\n key={c.id}\n type=\"button\"\n data-testid={TID.navCategory(c.slug)}\n onClick={() => goCategory(c.id)}\n className=\"sf-nav-link group relative hidden text-sm font-medium transition-opacity hover:opacity-80 lg:inline\"\n >\n {c.name}\n <span className=\"absolute -bottom-1 left-0 h-0.5 w-0 bg-primary transition-all duration-300 group-hover:w-full\" />\n </button>\n ))}\n </nav>\n )\n}\n\nexport function StorefrontHeader() {\n const config = useStorefrontConfig()\n const variant = config.theme?.header?.variant ?? 'classic'\n const scrolled = useScrolled()\n const logo = (\n <Link to=\"/\" className=\"sf-heading shrink-0 text-xl font-bold tracking-tight\">\n {config.logo ?? config.name}\n </Link>\n )\n\n return (\n <header\n className={`sticky top-0 z-40 border-b transition-shadow duration-300 ${scrolled ? 'shadow-md' : ''}`}\n style={headerStyle}\n >\n <AnnouncementBar />\n <UtilityBar />\n\n {variant === 'centered' ? (\n // Rio/Flex pattern: centered logo row, nav row below\n <>\n <div className=\"mx-auto grid h-16 max-w-7xl grid-cols-[1fr_auto_1fr] items-center px-4 sm:px-6\">\n <SearchInput className=\"hidden w-full max-w-xs sm:block\" />\n <div className=\"text-center\">{logo}</div>\n <div className=\"justify-self-end\">\n <HeaderActions />\n </div>\n </div>\n <div className=\"hidden justify-center border-t py-2.5 sm:flex\" style={headerDivider}>\n <NavLinks />\n </div>\n </>\n ) : variant === 'search' ? (\n // Brasília pattern: prominent search left, logo center, actions right; nav row below\n <>\n <div className=\"mx-auto grid h-16 max-w-7xl grid-cols-[1fr_auto_1fr] items-center gap-6 px-4 sm:px-6\">\n <SearchInput className=\"hidden w-full max-w-sm sm:block\" />\n <div className=\"text-center\">{logo}</div>\n <div className=\"justify-self-end\">\n <HeaderActions />\n </div>\n </div>\n <div className=\"hidden border-t sm:block\" style={headerDivider}>\n <div className=\"mx-auto max-w-7xl px-4 py-2.5 sm:px-6\">\n <NavLinks />\n </div>\n </div>\n </>\n ) : variant === 'minimal' ? (\n // Uyuni pattern: nav left, centered logo, actions right — single compact row\n <div className=\"mx-auto grid h-16 max-w-7xl grid-cols-[1fr_auto_1fr] items-center px-4 sm:px-6\">\n <div className=\"flex items-center gap-5\">\n <NavLinks className=\"hidden sm:flex\" />\n </div>\n <div className=\"text-center\">{logo}</div>\n <div className=\"flex items-center justify-end gap-3\">\n <SearchInput className=\"hidden w-44 lg:block\" />\n <HeaderActions />\n </div>\n </div>\n ) : (\n // classic: logo left, search center-right, actions right (original layout)\n <div className=\"mx-auto flex h-16 max-w-7xl items-center gap-6 px-4 sm:px-6\">\n {logo}\n <NavLinks className=\"hidden md:flex\" />\n <SearchInput className=\"ml-auto hidden w-full max-w-sm sm:block\" />\n <HeaderActions />\n </div>\n )}\n </header>\n )\n}\n","import React from 'react'\nimport { useStorefrontConfig } from '../config'\nimport { useCategories } from '../hooks/useCategories'\nimport { useCatalogStore } from '../stores/catalog.store'\nimport { Link, navigateTo } from '../router'\n\nexport function StorefrontFooter() {\n const config = useStorefrontConfig()\n const { categories } = useCategories()\n const visibleCategories = categories.slice(0, 8)\n const hiddenCategoryCount = Math.max(categories.length - visibleCategories.length, 0)\n\n const goCategory = (categoryId: string) => {\n useCatalogStore.getState().reset()\n useCatalogStore.getState().setCategoryId(categoryId)\n navigateTo(config.catalogPath)\n }\n\n return (\n <footer className=\"mt-16 border-t bg-card\">\n <div className=\"mx-auto grid max-w-7xl gap-10 px-4 py-12 sm:grid-cols-2 sm:px-6 lg:grid-cols-4\">\n <div>\n <p className=\"sf-heading text-lg font-bold\">{config.name}</p>\n {config.footer?.about && (\n <p className=\"mt-3 text-sm leading-relaxed text-muted-foreground\">{config.footer.about}</p>\n )}\n </div>\n\n <div>\n <h3 className=\"mb-3 text-sm font-semibold uppercase tracking-wide text-muted-foreground\">Departamentos</h3>\n <ul className=\"space-y-2 text-sm\">\n {visibleCategories.map((c) => (\n <li key={c.id}>\n <button\n type=\"button\"\n onClick={() => goCategory(c.id)}\n className=\"max-w-full truncate text-left transition-opacity hover:opacity-70\"\n >\n {c.name}\n </button>\n </li>\n ))}\n {hiddenCategoryCount > 0 && (\n <li>\n <Link to={config.catalogPath} className=\"font-medium underline-offset-2 transition-opacity hover:underline\">\n Ver todos ({categories.length})\n </Link>\n </li>\n )}\n </ul>\n </div>\n\n <div>\n <h3 className=\"mb-3 text-sm font-semibold uppercase tracking-wide text-muted-foreground\">Navegação</h3>\n <ul className=\"space-y-2 text-sm\">\n {config.nav.map((link) => (\n <li key={link.to}>\n <Link to={link.to} className=\"transition-opacity hover:opacity-70\">{link.label}</Link>\n </li>\n ))}\n <li>\n <Link to=\"/account\" className=\"transition-opacity hover:opacity-70\">Minhas compras</Link>\n </li>\n </ul>\n </div>\n\n <div>\n <h3 className=\"mb-3 text-sm font-semibold uppercase tracking-wide text-muted-foreground\">Contato</h3>\n <ul className=\"space-y-2 text-sm text-muted-foreground\">\n {config.footer?.contact?.phone && <li>{config.footer.contact.phone}</li>}\n {config.footer?.contact?.email && <li>{config.footer.contact.email}</li>}\n {config.footer?.contact?.address && <li>{config.footer.contact.address}</li>}\n {config.footer?.social?.map((s) => (\n <li key={s.href}>\n <a href={s.href} target=\"_blank\" rel=\"noreferrer\" className=\"transition-opacity hover:opacity-70\">\n {s.label}\n </a>\n </li>\n ))}\n </ul>\n </div>\n </div>\n <div className=\"border-t\">\n <div className=\"mx-auto flex max-w-7xl flex-col items-center gap-3 px-4 py-5 text-xs text-muted-foreground sm:flex-row sm:justify-between sm:px-6\">\n <nav className=\"flex flex-wrap items-center justify-center gap-x-5 gap-y-2\">\n <Link to=\"/privacy\" className=\"transition-colors hover:text-foreground\">Privacidade</Link>\n <Link to=\"/terms\" className=\"transition-colors hover:text-foreground\">Termos</Link>\n <Link to=\"/refunds\" className=\"transition-colors hover:text-foreground\">Trocas e devoluções</Link>\n </nav>\n <p className=\"text-center\">\n © {config.name} — powered by Fayz · Fotos:{' '}\n <a href=\"https://unsplash.com\" target=\"_blank\" rel=\"noreferrer\" className=\"underline-offset-2 hover:underline\">\n Unsplash\n </a>\n </p>\n </div>\n </div>\n </footer>\n )\n}\n","import { useCallback } from 'react'\nimport { validateDiscount } from '@fayz-ai/shop'\nimport { useStorefrontConfig } from '../config'\n\nexport interface DiscountValidation {\n valid: boolean\n percent: number\n message?: string\n}\n\nconst REASON_MESSAGE: Record<string, string> = {\n expired: 'Cupom expirado.',\n not_started: 'Cupom ainda não está ativo.',\n usage_limit: 'Cupom esgotado.',\n not_found: 'Cupom inválido ou expirado.',\n}\n\n/**\n * Storefront coupon validator. The store's own config.discounts (simple percent\n * codes) are trusted directly; everything else goes through the provider-backed\n * validateDiscount primitive, which enforces status/date-window/usage-limit.\n * The storefront cart models discounts as a percentage, so non-percentage codes\n * are rejected for client-side preview (the server still honors them at checkout).\n */\nexport function useDiscountValidator(): (code: string) => Promise<DiscountValidation> {\n const config = useStorefrontConfig()\n return useCallback(async (code: string) => {\n const normalized = code.trim().toUpperCase()\n if (!normalized) return { valid: false, percent: 0, message: 'Informe um cupom.' }\n\n const configDiscount = config.discounts?.find((d) => d.code.trim().toUpperCase() === normalized)\n if (configDiscount) return { valid: true, percent: configDiscount.percent }\n\n const validation = await validateDiscount({ code: normalized })\n if (!validation.valid) {\n return { valid: false, percent: 0, message: REASON_MESSAGE[validation.reason ?? 'not_found'] ?? 'Cupom inválido ou expirado.' }\n }\n if (validation.type !== 'percentage') {\n return { valid: false, percent: 0, message: 'Este cupom não é suportado na loja.' }\n }\n return { valid: true, percent: validation.value }\n }, [config.discounts])\n}\n","import { create } from 'zustand'\n\nexport type ToastVariant = 'success' | 'error' | 'info'\n\nexport interface Toast {\n id: string\n title: string\n description?: string\n variant: ToastVariant\n durationMs: number\n}\n\ninterface ToastState {\n toasts: Toast[]\n push(input: { title: string; description?: string; variant?: ToastVariant; durationMs?: number }): string\n dismiss(id: string): void\n}\n\nlet seq = 0\n\nexport const useToastStore = create<ToastState>((set) => ({\n toasts: [],\n push: (input) => {\n const id = `toast-${++seq}-${Date.now()}`\n const toast: Toast = {\n id,\n title: input.title,\n description: input.description,\n variant: input.variant ?? 'info',\n durationMs: input.durationMs ?? 3400,\n }\n set((s) => ({ toasts: [...s.toasts, toast] }))\n return id\n },\n dismiss: (id) => set((s) => ({ toasts: s.toasts.filter((t) => t.id !== id) })),\n}))\n\n/** Imperative toast API — callable from components, store actions, or workflows. */\nexport const toast = {\n success: (title: string, description?: string) => useToastStore.getState().push({ title, description, variant: 'success' }),\n error: (title: string, description?: string) => useToastStore.getState().push({ title, description, variant: 'error' }),\n info: (title: string, description?: string) => useToastStore.getState().push({ title, description, variant: 'info' }),\n}\n","import React from 'react'\nimport { Minus, Plus } from 'lucide-react'\n\nexport interface QuantityInputProps {\n value: number\n onChange(next: number): void\n min?: number\n max?: number\n testId?: string\n incTestId?: string\n decTestId?: string\n}\n\nexport function QuantityInput({ value, onChange, min = 1, max, testId, incTestId, decTestId }: QuantityInputProps) {\n const clamp = (n: number) => Math.max(min, max != null ? Math.min(n, max) : n)\n return (\n <div className=\"inline-flex items-center rounded-lg border\">\n <button\n type=\"button\"\n data-testid={decTestId}\n aria-label=\"Diminuir quantidade\"\n onClick={() => onChange(clamp(value - 1))}\n className=\"px-2.5 py-1.5 text-muted-foreground hover:text-foreground disabled:opacity-40\"\n disabled={value <= min}\n >\n <Minus className=\"h-3.5 w-3.5\" />\n </button>\n <input\n data-testid={testId}\n type=\"number\"\n value={value}\n min={min}\n max={max}\n onChange={(e) => {\n const n = parseInt(e.target.value, 10)\n if (!isNaN(n)) onChange(clamp(n))\n }}\n className=\"w-12 border-x bg-transparent py-1.5 text-center text-sm [appearance:textfield] [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none\"\n />\n <button\n type=\"button\"\n data-testid={incTestId}\n aria-label=\"Aumentar quantidade\"\n onClick={() => onChange(clamp(value + 1))}\n className=\"px-2.5 py-1.5 text-muted-foreground hover:text-foreground disabled:opacity-40\"\n disabled={max != null && value >= max}\n >\n <Plus className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n )\n}\n","import React, { useEffect, useState } from 'react'\nimport { X, Trash2 } from 'lucide-react'\nimport {\n useCartStore,\n selectSubtotal,\n selectDiscountTotal,\n selectShipping,\n selectTotal,\n} from '../stores/cart.store'\nimport { useDiscountValidator } from '../hooks/useDiscountValidator'\nimport { toast } from '../stores/toast.store'\nimport { useStorefrontConfig } from '../config'\nimport { navigateTo } from '../router'\nimport { formatMoney } from '../format'\nimport { QuantityInput } from './QuantityInput'\nimport { TID } from '../testids'\n\nexport function CartDrawer() {\n const config = useStorefrontConfig()\n const cart = useCartStore()\n const validate = useDiscountValidator()\n const [code, setCode] = useState('')\n const [discountError, setDiscountError] = useState<string | null>(null)\n const [applying, setApplying] = useState(false)\n\n // a11y: close on Escape while the drawer is open.\n useEffect(() => {\n if (!cart.isOpen) return\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') cart.closeDrawer()\n }\n document.addEventListener('keydown', onKey)\n return () => document.removeEventListener('keydown', onKey)\n }, [cart.isOpen, cart.closeDrawer])\n\n const subtotal = selectSubtotal(cart)\n const discountTotal = selectDiscountTotal(cart)\n const shipping = selectShipping(cart, config)\n const total = selectTotal(cart, config)\n const money = (v: number) => formatMoney(v, config.currency, config.locale)\n\n async function applyCode() {\n setApplying(true)\n setDiscountError(null)\n try {\n const result = await validate(code)\n if (result.valid) {\n const applied = code.trim().toUpperCase()\n cart.applyDiscount(applied, result.percent)\n setCode('')\n toast.success('Cupom aplicado!', `${applied} • ${result.percent}% de desconto`)\n } else {\n setDiscountError(result.message ?? 'Cupom inválido.')\n toast.error('Cupom inválido', result.message ?? 'Verifique o código e tente novamente.')\n }\n } finally {\n setApplying(false)\n }\n }\n\n if (!cart.isOpen) return null\n\n // Free-shipping nudge: how far from the threshold this cart is\n const freeAbove = config.shipping.freeAbove\n const missingForFree = freeAbove != null && subtotal < freeAbove ? freeAbove - subtotal : 0\n const progress = freeAbove != null ? Math.min(100, (subtotal / freeAbove) * 100) : 0\n\n return (\n <div className=\"fixed inset-0 z-50\">\n <div\n className=\"absolute inset-0 animate-fade-in bg-black/40\"\n aria-hidden\n onClick={cart.closeDrawer}\n />\n <div\n data-testid={TID.cartDrawer}\n role=\"dialog\"\n aria-label=\"Carrinho\"\n className=\"absolute right-0 top-0 flex h-full w-full max-w-md animate-slide-in-from-right flex-col bg-background shadow-2xl\"\n >\n <div className=\"flex items-center justify-between border-b px-5 py-4\">\n <h2 className=\"text-lg font-semibold\">Carrinho</h2>\n <button\n type=\"button\"\n aria-label=\"Fechar carrinho\"\n onClick={cart.closeDrawer}\n className=\"rounded-full p-1.5 hover:bg-muted\"\n >\n <X className=\"h-5 w-5\" />\n </button>\n </div>\n\n {cart.lines.length === 0 ? (\n <div data-testid={TID.cartEmpty} className=\"flex flex-1 items-center justify-center p-8 text-center text-muted-foreground\">\n Seu carrinho está vazio.\n </div>\n ) : (\n <>\n {freeAbove != null && (\n <div data-testid={TID.shippingProgress} className=\"border-b bg-muted/40 px-5 py-3\">\n <p className=\"text-xs font-medium\">\n {missingForFree > 0 ? (\n <>Faltam <strong>{money(missingForFree)}</strong> para frete grátis 🚚</>\n ) : (\n <>🎉 Você ganhou <strong>frete grátis</strong>!</>\n )}\n </p>\n <div className=\"mt-2 h-1.5 overflow-hidden rounded-full bg-border\">\n <div\n className=\"h-full rounded-full bg-primary transition-all duration-500 ease-out\"\n style={{ width: `${progress}%` }}\n />\n </div>\n </div>\n )}\n <div className=\"flex-1 space-y-4 overflow-y-auto px-5 py-4\">\n {cart.lines.map((line) => (\n <div\n key={line.lineId ?? line.productId}\n data-testid={TID.cartLine}\n data-product-id={line.productId}\n data-line-id={line.lineId ?? line.productId}\n className={`flex animate-fade-up gap-3 rounded-lg p-1.5 transition-all hover:bg-muted/40 ${\n (line.lineId ?? line.productId) === cart.justAddedLineId\n ? 'bg-primary/5 ring-1 ring-primary/30'\n : ''\n }`}\n >\n {line.imageUrl && (\n <img src={line.imageUrl} alt={line.name} className=\"h-20 w-20 shrink-0 rounded-lg border object-cover\" />\n )}\n <div className=\"flex flex-1 flex-col\">\n <div className=\"flex items-start justify-between gap-2\">\n <span className=\"text-sm font-medium leading-snug\">{line.name}</span>\n <button\n type=\"button\"\n data-testid={TID.lineRemove}\n aria-label={`Remover ${line.name}`}\n onClick={() => cart.removeItem(line.lineId ?? line.productId)}\n className=\"text-muted-foreground hover:text-destructive\"\n >\n <Trash2 className=\"h-4 w-4\" />\n </button>\n </div>\n <span className=\"text-xs text-muted-foreground\">{line.sku}</span>\n {line.optionsLabel && (\n <span className=\"text-xs text-muted-foreground\">{line.optionsLabel}</span>\n )}\n <div className=\"mt-auto flex items-center justify-between pt-2\">\n <QuantityInput\n value={line.quantity}\n max={line.maxQuantity || undefined}\n onChange={(n) => cart.setQuantity(line.lineId ?? line.productId, n)}\n testId={TID.lineQty}\n incTestId={TID.lineInc}\n decTestId={TID.lineDec}\n />\n <span\n className=\"text-sm font-semibold\"\n data-price={(line.unitPrice * line.quantity).toFixed(2)}\n >\n {money(line.unitPrice * line.quantity)}\n </span>\n </div>\n </div>\n </div>\n ))}\n </div>\n\n <div className=\"space-y-3 border-t px-5 py-4\">\n {config.features.discounts && (\n <div className=\"space-y-1\">\n <div className=\"flex gap-2\">\n <input\n data-testid={TID.discountInput}\n type=\"text\"\n placeholder=\"Cupom de desconto\"\n value={code}\n onChange={(e) => setCode(e.target.value)}\n className=\"flex-1 rounded-lg border bg-background px-3 py-2 text-sm uppercase\"\n />\n <button\n type=\"button\"\n data-testid={TID.discountApply}\n onClick={applyCode}\n disabled={applying || !code.trim()}\n className=\"rounded-lg border px-3 py-2 text-sm font-medium hover:bg-muted disabled:opacity-50\"\n >\n Aplicar\n </button>\n </div>\n {discountError && (\n <p data-testid={TID.discountError} className=\"text-xs text-destructive\">\n {discountError}\n </p>\n )}\n </div>\n )}\n\n <dl className=\"space-y-1.5 text-sm\">\n <div className=\"flex justify-between\">\n <dt className=\"text-muted-foreground\">Subtotal</dt>\n <dd data-testid={TID.cartSubtotal} data-price={subtotal.toFixed(2)}>{money(subtotal)}</dd>\n </div>\n {discountTotal > 0 && (\n <div className=\"flex justify-between text-emerald-700\" data-testid={TID.discountRow}>\n <dt>\n Desconto{' '}\n <button\n type=\"button\"\n onClick={cart.clearDiscount}\n className=\"text-xs text-muted-foreground underline\"\n >\n ({cart.discountCode} ✕)\n </button>\n </dt>\n <dd data-price={discountTotal.toFixed(2)}>−{money(discountTotal)}</dd>\n </div>\n )}\n <div className=\"flex justify-between\">\n <dt className=\"text-muted-foreground\">Frete</dt>\n <dd data-testid={TID.cartShipping} data-price={shipping.toFixed(2)}>\n {shipping === 0 ? 'Grátis' : money(shipping)}\n </dd>\n </div>\n <div className=\"flex justify-between border-t pt-2 text-base font-semibold\">\n <dt>Total</dt>\n <dd data-testid={TID.cartTotal} data-price={total.toFixed(2)}>{money(total)}</dd>\n </div>\n </dl>\n\n <button\n type=\"button\"\n data-testid={TID.goCheckout}\n onClick={() => {\n cart.closeDrawer()\n navigateTo('/checkout')\n }}\n className=\"sf-cta w-full bg-primary py-3.5 font-semibold text-primary-foreground shadow-md transition-all hover:-translate-y-0.5 hover:shadow-lg\"\n style={{ borderRadius: 'var(--sf-radius-button)' }}\n >\n Finalizar compra\n </button>\n </div>\n </>\n )}\n </div>\n </div>\n )\n}\n","import { useEffect, useState } from 'react'\nimport { getShopProvider } from '@fayz-ai/shop/runtime'\nimport type { Product, ListProductsOptions } from '@fayz-ai/shop/types'\n\nexport function useProducts(opts: ListProductsOptions): {\n products: Product[]\n loading: boolean\n error: string | null\n reload: () => void\n} {\n const [products, setProducts] = useState<Product[]>([])\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n const [nonce, setNonce] = useState(0)\n const key = JSON.stringify(opts)\n\n useEffect(() => {\n let cancelled = false\n setLoading(true)\n getShopProvider()\n .listProducts(JSON.parse(key) as ListProductsOptions)\n .then((data) => {\n if (cancelled) return\n setProducts(data)\n setError(null)\n })\n .catch((e: unknown) => {\n if (!cancelled) setError(e instanceof Error ? e.message : String(e))\n })\n .finally(() => {\n if (!cancelled) setLoading(false)\n })\n return () => {\n cancelled = true\n }\n }, [key, nonce])\n\n return { products, loading, error, reload: () => setNonce((n) => n + 1) }\n}\n","import React from 'react'\nimport { formatMoney } from '../format'\nimport { useStorefrontConfig } from '../config'\n\nexport interface PriceProps {\n value: number\n compareAt?: number | null\n testId?: string\n compareTestId?: string\n className?: string\n}\n\n/** Formatted money. Always carries data-price so tests assert raw numbers, never locale strings. */\nexport function Price({ value, compareAt, testId, compareTestId, className }: PriceProps) {\n const { currency, locale } = useStorefrontConfig()\n return (\n <span className={`inline-flex items-baseline gap-2 ${className ?? ''}`}>\n <span data-testid={testId} data-price={value.toFixed(2)} className=\"font-semibold\">\n {formatMoney(value, currency, locale)}\n </span>\n {compareAt != null && compareAt > value && (\n <span\n data-testid={compareTestId}\n data-price={compareAt.toFixed(2)}\n className=\"text-sm text-muted-foreground line-through\"\n >\n {formatMoney(compareAt, currency, locale)}\n </span>\n )}\n </span>\n )\n}\n","import { TID } from './testids'\n\n/**\n * Stable selectors that custom storefront slots must preserve.\n *\n * Apps can fully customize the visual tree, but catalog/product-rail slots still\n * need these anchors so checkout smoke tests, QA, and agents can operate stores.\n */\nexport const productCardSlotContract = {\n root: { 'data-testid': TID.productCard },\n name: { 'data-testid': TID.productCardName },\n priceTestId: TID.productCardPrice,\n addButton: { 'data-testid': TID.productCardAdd },\n} as const\n\nexport const storefrontSlotContracts = {\n productCard: productCardSlotContract,\n} as const\n\nexport type ProductCardSlotContract = typeof productCardSlotContract\n","import React from 'react'\nimport { ShoppingBag } from 'lucide-react'\nimport type { Product } from '@fayz-ai/shop/types'\nimport { useCartStore } from '../stores/cart.store'\nimport { useStorefrontConfig } from '../config'\nimport { Link, navigateTo } from '../router'\nimport { getProductOptionGroups } from '../product-options'\nimport { Price } from './Price'\nimport { TID } from '../testids'\nimport { productCardSlotContract } from '../slot-contracts'\n\nexport interface ProductCardProps {\n product: Product\n}\n\nexport function ProductCard({ product }: ProductCardProps) {\n const config = useStorefrontConfig()\n const addItem = useCartStore((s) => s.addItem)\n const hasOptions = getProductOptionGroups(product).length > 0\n const soldOut = product.inventoryCount <= 0\n const onSale = product.compareAtPrice != null && product.compareAtPrice > product.price\n const image = product.images.find((i) => i.isPrimary) ?? product.images[0]\n const cardStyle = config.theme?.productCard?.style ?? 'card'\n const aspect = config.theme?.productCard?.imageAspect === 'portrait' ? 'aspect-[3/4]' : 'aspect-square'\n\n return (\n <div\n {...productCardSlotContract.root}\n data-slug={product.slug}\n className={`group flex flex-col overflow-hidden transition-all duration-300 ${\n cardStyle === 'editorial'\n ? 'hover:-translate-y-1'\n : 'border bg-card hover:-translate-y-1 hover:shadow-lg'\n }`}\n style={{ borderRadius: 'var(--sf-radius-card)' }}\n >\n <Link to={`/product/${product.slug}`} className={`relative block ${aspect} overflow-hidden bg-muted`} style={{ borderRadius: cardStyle === 'editorial' ? 'var(--sf-radius-card)' : undefined }}>\n {image && (\n <img\n src={image.url}\n alt={image.altText ?? product.name}\n className=\"h-full w-full object-cover transition-transform duration-300 group-hover:scale-105\"\n loading=\"lazy\"\n />\n )}\n <div className=\"absolute left-3 top-3 flex gap-2\">\n {onSale && !soldOut && (\n <span\n data-testid={TID.badgeSale}\n className=\"rounded-full bg-red-600 px-2.5 py-0.5 text-xs font-semibold text-white\"\n >\n Oferta\n </span>\n )}\n {soldOut && (\n <span\n data-testid={TID.badgeSoldout}\n className=\"rounded-full bg-gray-900/80 px-2.5 py-0.5 text-xs font-semibold text-white\"\n >\n Esgotado\n </span>\n )}\n </div>\n </Link>\n\n <div className={`flex flex-1 flex-col gap-1 ${cardStyle === 'editorial' ? 'px-1 py-3' : 'p-4'}`}>\n <span className=\"text-xs text-muted-foreground\">{product.categoryName}</span>\n <Link\n to={`/product/${product.slug}`}\n {...productCardSlotContract.name}\n className=\"font-medium leading-snug hover:underline\"\n >\n {product.name}\n </Link>\n <div className=\"mt-auto flex items-center justify-between pt-2\">\n <Price\n value={product.price}\n compareAt={product.compareAtPrice}\n testId={productCardSlotContract.priceTestId}\n />\n <button\n type=\"button\"\n {...productCardSlotContract.addButton}\n disabled={soldOut}\n aria-label={hasOptions ? `Escolher opções de ${product.name}` : `Adicionar ${product.name} ao carrinho`}\n onClick={() => {\n // Products with variants (size/color) must pick an option on the PDP\n // — quick-adding would create an option-less line. Others add inline\n // (addItem auto-opens the cart drawer).\n if (hasOptions) {\n navigateTo(`/product/${product.slug}`)\n return\n }\n addItem(product)\n }}\n className=\"rounded-full border bg-background/90 p-2.5 text-foreground shadow-sm transition-all duration-200 hover:scale-110 hover:bg-primary hover:text-primary-foreground hover:shadow disabled:cursor-not-allowed disabled:opacity-40 lg:translate-y-1 lg:opacity-0 lg:group-hover:translate-y-0 lg:group-hover:opacity-100 lg:disabled:opacity-0 lg:group-hover:disabled:opacity-40\"\n >\n <ShoppingBag className=\"h-4 w-4\" />\n </button>\n </div>\n </div>\n </div>\n )\n}\n","import React from 'react'\nimport type { Product } from '@fayz-ai/shop/types'\nimport { ProductCard } from './ProductCard'\nimport { useStorefrontConfig } from '../config'\nimport { TID } from '../testids'\n\nexport function ProductGrid({ products, loading }: { products: Product[]; loading: boolean }) {\n const config = useStorefrontConfig()\n const ProductCardComponent = config.slots?.ProductCard ?? ProductCard\n\n if (loading) {\n return (\n <div data-testid={TID.productGrid} className=\"grid grid-cols-2 gap-5 md:grid-cols-3 xl:grid-cols-4\">\n {Array.from({ length: 8 }, (_, i) => (\n <div key={i} className=\"aspect-[3/4] animate-pulse rounded-xl bg-muted\" />\n ))}\n </div>\n )\n }\n if (products.length === 0) {\n return (\n <div data-testid={TID.productGrid} className=\"py-20 text-center text-muted-foreground\">\n Nenhum produto encontrado.\n </div>\n )\n }\n return (\n <div data-testid={TID.productGrid} className=\"grid grid-cols-2 gap-5 md:grid-cols-3 xl:grid-cols-4\">\n {products.map((p) => (\n <ProductCardComponent key={p.id} product={p} />\n ))}\n </div>\n )\n}\n","import React from 'react'\nimport { useCatalogStore } from '../stores/catalog.store'\nimport type { CatalogSort } from '../stores/catalog.store'\nimport { useCategories } from '../hooks/useCategories'\nimport { TID } from '../testids'\n\nexport function FiltersPanel() {\n const { categories } = useCategories()\n const catalog = useCatalogStore()\n\n return (\n <aside className=\"w-full shrink-0 space-y-6 lg:w-56\">\n {/* Sort */}\n <div className=\"space-y-2\">\n <h3 className=\"text-sm font-semibold\">Ordenar por</h3>\n <select\n data-testid={TID.sortSelect}\n value={catalog.sort}\n onChange={(e) => catalog.setSort(e.target.value as CatalogSort)}\n className=\"w-full rounded-lg border bg-background px-3 py-2 text-sm\"\n >\n <option value=\"newest\">Mais recentes</option>\n <option value=\"price-asc\">Menor preço</option>\n <option value=\"price-desc\">Maior preço</option>\n <option value=\"name\">Nome (A–Z)</option>\n </select>\n </div>\n\n {/* Categories */}\n <div className=\"space-y-2\">\n <h3 className=\"text-sm font-semibold\">Categorias</h3>\n <ul className=\"space-y-1\">\n <li>\n <button\n type=\"button\"\n onClick={() => catalog.setCategoryId(null)}\n className={`w-full rounded-md px-2 py-1.5 text-left text-sm transition-colors ${\n catalog.categoryId === null ? 'bg-primary/10 font-medium text-primary' : 'hover:bg-muted'\n }`}\n >\n Todas\n </button>\n </li>\n {categories.map((c) => (\n <li key={c.id}>\n <button\n type=\"button\"\n data-testid={TID.filterCategory(c.slug)}\n onClick={() => catalog.setCategoryId(catalog.categoryId === c.id ? null : c.id)}\n className={`w-full rounded-md px-2 py-1.5 text-left text-sm transition-colors ${\n catalog.categoryId === c.id ? 'bg-primary/10 font-medium text-primary' : 'hover:bg-muted'\n }`}\n >\n {c.name}\n </button>\n </li>\n ))}\n </ul>\n </div>\n\n {/* Price range */}\n <div className=\"space-y-2\">\n <h3 className=\"text-sm font-semibold\">Preço</h3>\n <div className=\"flex items-center gap-2\">\n <input\n data-testid={TID.filterPriceMin}\n type=\"number\"\n placeholder=\"Mín\"\n min={0}\n value={catalog.priceMin ?? ''}\n onChange={(e) => catalog.setPriceMin(e.target.value === '' ? null : Number(e.target.value))}\n className=\"w-full rounded-lg border bg-background px-2.5 py-1.5 text-sm\"\n />\n <span className=\"text-muted-foreground\">–</span>\n <input\n data-testid={TID.filterPriceMax}\n type=\"number\"\n placeholder=\"Máx\"\n min={0}\n value={catalog.priceMax ?? ''}\n onChange={(e) => catalog.setPriceMax(e.target.value === '' ? null : Number(e.target.value))}\n className=\"w-full rounded-lg border bg-background px-2.5 py-1.5 text-sm\"\n />\n </div>\n </div>\n\n {/* Availability */}\n <label className=\"flex cursor-pointer items-center gap-2 text-sm\">\n <input\n data-testid={TID.filterInstock}\n type=\"checkbox\"\n checked={catalog.inStockOnly}\n onChange={(e) => catalog.setInStockOnly(e.target.checked)}\n className=\"h-4 w-4 rounded border\"\n />\n Somente em estoque\n </label>\n\n <button\n type=\"button\"\n data-testid={TID.filtersClear}\n onClick={() => catalog.reset()}\n className=\"text-sm text-muted-foreground underline-offset-2 hover:text-foreground hover:underline\"\n >\n Limpar filtros\n </button>\n </aside>\n )\n}\n","import { useEffect } from 'react'\n\n/**\n * Minimal per-route head manager: sets document.title and meta description so\n * each storefront page (product, catalog, account, checkout) has its own title\n * and shareable description instead of one static SPA title. A real SSR/prerender\n * pass (M12) layers OG/canonical on top; this covers the client-rendered baseline.\n */\nexport function useStorefrontHead(input: { title?: string; description?: string | null }): void {\n const { title, description } = input\n useEffect(() => {\n if (title) document.title = title\n }, [title])\n\n useEffect(() => {\n if (!description) return\n let tag = document.head.querySelector<HTMLMetaElement>('meta[name=\"description\"]')\n if (!tag) {\n tag = document.createElement('meta')\n tag.setAttribute('name', 'description')\n document.head.appendChild(tag)\n }\n tag.setAttribute('content', description.slice(0, 160))\n }, [description])\n}\n","import React, { useEffect, useMemo, useRef } from 'react'\nimport { useCatalogStore, type CatalogSort } from '../stores/catalog.store'\nimport { useProducts } from '../hooks/useProducts'\nimport { ProductGrid } from '../components/ProductGrid'\nimport { FiltersPanel } from '../components/FiltersPanel'\nimport { useStorefrontConfig } from '../config'\nimport { useStorefrontHead } from '../hooks/useStorefrontHead'\nimport type { ListProductsOptions } from '@fayz-ai/shop/types'\n\nconst SORT_MAP: Record<string, Pick<ListProductsOptions, 'orderBy' | 'order'>> = {\n newest: { orderBy: 'created_at', order: 'desc' },\n 'price-asc': { orderBy: 'price', order: 'asc' },\n 'price-desc': { orderBy: 'price', order: 'desc' },\n name: { orderBy: 'name', order: 'asc' },\n}\n\nconst SORTS: CatalogSort[] = ['newest', 'price-asc', 'price-desc', 'name']\n\n/**\n * Two-way sync between catalog filters and the URL hash query, so a filtered/\n * searched catalog is shareable, bookmarkable, and survives a refresh. Uses\n * history.replaceState (no navigation / no scroll jump).\n */\nfunction useCatalogUrlSync() {\n const hydrated = useRef(false)\n const catalog = useCatalogStore()\n\n useEffect(() => {\n if (hydrated.current) return\n hydrated.current = true\n const q = window.location.hash.split('?')[1]\n if (!q) return\n const p = new URLSearchParams(q)\n const s = useCatalogStore.getState()\n if (p.has('search')) s.setSearch(p.get('search') ?? '')\n if (p.get('category')) s.setCategoryId(p.get('category'))\n const sort = p.get('sort')\n if (sort && (SORTS as string[]).includes(sort)) s.setSort(sort as CatalogSort)\n if (p.get('stock') === '1') s.setInStockOnly(true)\n if (p.has('min')) s.setPriceMin(Number(p.get('min')) || null)\n if (p.has('max')) s.setPriceMax(Number(p.get('max')) || null)\n }, [])\n\n useEffect(() => {\n const p = new URLSearchParams()\n if (catalog.search) p.set('search', catalog.search)\n if (catalog.categoryId) p.set('category', catalog.categoryId)\n if (catalog.sort !== 'newest') p.set('sort', catalog.sort)\n if (catalog.inStockOnly) p.set('stock', '1')\n if (catalog.priceMin != null) p.set('min', String(catalog.priceMin))\n if (catalog.priceMax != null) p.set('max', String(catalog.priceMax))\n const base = window.location.hash.split('?')[0] || '#/catalog'\n const qs = p.toString()\n const next = qs ? `${base}?${qs}` : base\n if (next !== window.location.hash) window.history.replaceState(null, '', next)\n }, [catalog.search, catalog.categoryId, catalog.sort, catalog.inStockOnly, catalog.priceMin, catalog.priceMax])\n}\n\nexport function CatalogPage() {\n const config = useStorefrontConfig()\n const catalog = useCatalogStore()\n useCatalogUrlSync()\n useStorefrontHead({\n title: catalog.search ? `“${catalog.search}” — ${config.name}` : `${config.name} — Loja`,\n })\n\n const providerOpts: ListProductsOptions = {\n status: 'active',\n categoryId: catalog.categoryId ?? undefined,\n search: catalog.search || undefined,\n ...SORT_MAP[catalog.sort],\n }\n const { products, loading, error, reload } = useProducts(providerOpts)\n\n // Price range + availability are client-side refinements over the fetched set\n const filtered = useMemo(\n () =>\n products.filter((p) => {\n if (catalog.priceMin != null && p.price < catalog.priceMin) return false\n if (catalog.priceMax != null && p.price > catalog.priceMax) return false\n if (catalog.inStockOnly && p.inventoryCount <= 0) return false\n return true\n }),\n [products, catalog.priceMin, catalog.priceMax, catalog.inStockOnly],\n )\n\n return (\n <main className=\"mx-auto max-w-7xl px-4 py-8 sm:px-6\">\n <div className=\"mb-8\">\n <h1 className=\"text-2xl font-bold tracking-tight\">{config.name}</h1>\n <p className=\"mt-1 text-muted-foreground\">\n {catalog.search\n ? `Resultados para “${catalog.search}”`\n : 'Produtos selecionados com qualidade e entrega rápida.'}\n </p>\n </div>\n <div className=\"flex flex-col gap-8 lg:flex-row\">\n <FiltersPanel />\n <div className=\"flex-1\">\n {error ? (\n <div className=\"rounded-2xl border bg-card py-16 text-center\">\n <p className=\"text-muted-foreground\">Não foi possível carregar os produtos.</p>\n <button\n type=\"button\"\n onClick={reload}\n className=\"mt-4 rounded-lg border px-4 py-2 text-sm font-semibold transition hover:bg-muted\"\n >\n Tentar novamente\n </button>\n </div>\n ) : (\n <ProductGrid products={filtered} loading={loading} />\n )}\n </div>\n </div>\n </main>\n )\n}\n","import type { HeroVariant } from './theme'\n\n// ---------------------------------------------------------------------------\n// Home-page section blueprint — the storefront's PageConfig equivalent.\n// A template (or the Fayz agent) declares the home as an ordered list of\n// typed sections; HomePage renders them. Every recurring block found in the\n// Nuvemshop research maps to one section type.\n// ---------------------------------------------------------------------------\n\nexport interface HeroSlide {\n title: string\n subtitle?: string\n cta?: string\n href?: string\n /** Image URL; omit for a gradient placeholder derived from `hue` */\n image?: string\n hue?: number\n /** Editorial boxed copy block (Uyuni) instead of free overlay */\n boxed?: boolean\n}\n\nexport type HomeSection =\n | { type: 'hero'; variant: HeroVariant; slides: HeroSlide[]; height?: 'tall' | 'medium' }\n | { type: 'categories'; style: 'bubbles' | 'tiles'; title?: string }\n | {\n type: 'products'\n title: string\n subtitle?: string\n /** Small-caps label above the title (e.g. 'curadoria') */\n eyebrow?: string\n /** 'sale' = compareAtPrice set; 'new' = newest first; 'all' = catalog order */\n filter?: 'sale' | 'new' | 'all'\n limit?: number\n }\n | { type: 'benefits'; items: Array<{ icon: string; title: string; text?: string }> }\n | { type: 'banner'; title: string; subtitle?: string; eyebrow?: string; cta?: string; href?: string; image?: string; hue?: number }\n | { type: 'manifesto'; title?: string; text: string }\n | { type: 'testimonials'; title?: string; items: Array<{ quote: string; author: string }> }\n | { type: 'newsletter'; title?: string; subtitle?: string }\n\nexport interface HomeConfig {\n sections: HomeSection[]\n}\n\nexport interface NavLink {\n label: string\n to: string\n}\n\nexport interface FooterConfig {\n about?: string\n contact?: { phone?: string; email?: string; address?: string }\n social?: Array<{ label: string; href: string }>\n}\n\n/** Wide gradient SVG data-URI — deterministic hero/banner art, no network. */\nexport function bannerPlaceholder(label: string, hueA: number, hueB: number, w = 1600, h = 700): string {\n const svg =\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${w}\" height=\"${h}\">` +\n `<defs><linearGradient id=\"g\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\">` +\n `<stop offset=\"0\" stop-color=\"hsl(${hueA},40%,78%)\"/>` +\n `<stop offset=\"1\" stop-color=\"hsl(${hueB},45%,55%)\"/>` +\n `</linearGradient></defs>` +\n `<rect width=\"${w}\" height=\"${h}\" fill=\"url(#g)\"/>` +\n `<circle cx=\"${w * 0.8}\" cy=\"${h * 0.3}\" r=\"${h * 0.45}\" fill=\"hsla(${hueB},50%,90%,0.25)\"/>` +\n `<circle cx=\"${w * 0.15}\" cy=\"${h * 0.85}\" r=\"${h * 0.35}\" fill=\"hsla(${hueA},45%,30%,0.12)\"/>` +\n `</svg>`\n return `data:image/svg+xml;utf8,${encodeURIComponent(svg)}`\n}\n","import React, { useEffect, useRef, useState } from 'react'\nimport { ChevronLeft, ChevronRight } from 'lucide-react'\nimport type { HeroSlide } from '../../sections'\nimport type { HeroVariant } from '../../theme'\nimport { bannerPlaceholder } from '../../sections'\nimport { prefersReducedMotion } from '../../motion'\nimport { Link } from '../../router'\nimport { TID } from '../../testids'\n\nfunction slideImage(slide: HeroSlide, w = 1600, h = 700): string {\n return slide.image ?? bannerPlaceholder(slide.title, slide.hue ?? 200, (slide.hue ?? 200) + 40, w, h)\n}\n\nfunction SlideCopy({ slide, active }: { slide: HeroSlide; active: boolean }) {\n const stagger = (i: number) =>\n active ? { className: 'animate-fade-up', style: { animationDelay: `${i * 120}ms` } } : { className: 'opacity-0' }\n\n const inner = (\n <>\n <h2 className={`sf-heading text-3xl font-bold leading-tight tracking-tight sm:text-5xl ${stagger(0).className}`} style={stagger(0).style}>\n {slide.title}\n </h2>\n {slide.subtitle && (\n <p className={`mt-3 max-w-md text-base sm:text-lg ${stagger(1).className}`} style={stagger(1).style}>\n {slide.subtitle}\n </p>\n )}\n {slide.cta && (\n <div className={stagger(2).className} style={stagger(2).style}>\n <Link\n to={slide.href ?? '/catalog'}\n className=\"sf-cta mt-6 inline-block bg-primary px-8 py-3.5 font-semibold text-primary-foreground shadow-lg transition-all hover:-translate-y-0.5 hover:shadow-xl\"\n style={{ borderRadius: 'var(--sf-radius-button)' }}\n >\n {slide.cta}\n </Link>\n </div>\n )}\n </>\n )\n if (slide.boxed) {\n return (\n <div className=\"border border-foreground/30 bg-background/90 p-8 backdrop-blur-sm sm:p-10\">{inner}</div>\n )\n }\n return <div className=\"text-white\">{inner}</div>\n}\n\nexport function HeroSection({\n variant,\n slides,\n height = 'tall',\n}: {\n variant: HeroVariant\n slides: HeroSlide[]\n height?: 'tall' | 'medium'\n}) {\n const [index, setIndex] = useState(0)\n const interacted = useRef(false)\n const hClass = height === 'tall' ? 'h-[72vh] min-h-[440px]' : 'h-[48vh] min-h-[340px]'\n\n // Auto-advance until the visitor takes over; never under reduced motion.\n useEffect(() => {\n if (variant !== 'slider' || slides.length < 2 || prefersReducedMotion()) return\n const timer = setInterval(() => {\n if (!interacted.current) setIndex((i) => (i + 1) % slides.length)\n }, 7000)\n return () => clearInterval(timer)\n }, [variant, slides.length])\n\n const goTo = (i: number) => {\n interacted.current = true\n setIndex((i + slides.length) % slides.length)\n }\n\n if (slides.length === 0) return null\n\n if (variant === 'split') {\n return (\n <section data-testid={TID.hero} className=\"grid gap-px sm:grid-cols-2\">\n {slides.slice(0, 2).map((slide, i) => (\n <Link\n key={i}\n to={slide.href ?? '/catalog'}\n className=\"group relative block h-[42vh] min-h-[320px] overflow-hidden\"\n >\n <img\n src={slideImage(slide, 900, 700)}\n alt={slide.title}\n className=\"h-full w-full object-cover transition-transform duration-700 ease-out group-hover:scale-105\"\n />\n <div className=\"absolute inset-0 flex flex-col items-center justify-center bg-gradient-to-t from-black/65 via-black/25 to-black/10 p-6 text-center text-white\">\n <h2\n className=\"sf-heading animate-fade-up text-3xl font-bold uppercase tracking-wide drop-shadow-md sm:text-4xl\"\n style={{ animationDelay: `${i * 150}ms` }}\n >\n {slide.title}\n </h2>\n {slide.subtitle && (\n <p className=\"animate-fade-up mt-2 max-w-sm drop-shadow\" style={{ animationDelay: `${i * 150 + 120}ms` }}>\n {slide.subtitle}\n </p>\n )}\n <span className=\"mt-4 inline-block border-b-2 border-white/0 pb-0.5 text-sm font-semibold uppercase tracking-wider opacity-0 transition-all duration-300 group-hover:border-white group-hover:opacity-100\">\n Explorar →\n </span>\n </div>\n </Link>\n ))}\n </section>\n )\n }\n\n const active = slides[Math.min(index, slides.length - 1)]!\n\n return (\n <section data-testid={TID.hero} className={`relative w-full overflow-hidden ${hClass}`}>\n {/* stacked slides, crossfade + Ken Burns on the active one */}\n {slides.map((slide, i) => (\n <img\n key={i}\n src={slideImage(slide)}\n alt={slide.title}\n aria-hidden={i !== index}\n className={`absolute inset-0 h-full w-full object-cover transition-opacity duration-700 ${\n i === index ? 'animate-kenburns opacity-100' : 'opacity-0'\n }`}\n />\n ))}\n <div\n className={`absolute inset-0 flex items-end p-6 sm:p-12 ${\n active.boxed ? '' : 'bg-gradient-to-t from-black/60 via-black/20 to-transparent'\n }`}\n >\n <div className=\"mx-auto w-full max-w-7xl\">\n <div className=\"max-w-xl\">\n <SlideCopy key={index} slide={active} active />\n </div>\n </div>\n </div>\n\n {variant === 'slider' && slides.length > 1 && (\n <>\n <button\n type=\"button\"\n aria-label=\"Slide anterior\"\n data-testid={TID.heroPrev}\n onClick={() => goTo(index - 1)}\n className=\"absolute left-4 top-1/2 -translate-y-1/2 rounded-full bg-white/85 p-2.5 shadow transition-transform hover:scale-110 hover:bg-white\"\n >\n <ChevronLeft className=\"h-5 w-5 text-gray-900\" />\n </button>\n <button\n type=\"button\"\n aria-label=\"Próximo slide\"\n data-testid={TID.heroNext}\n onClick={() => goTo(index + 1)}\n className=\"absolute right-4 top-1/2 -translate-y-1/2 rounded-full bg-white/85 p-2.5 shadow transition-transform hover:scale-110 hover:bg-white\"\n >\n <ChevronRight className=\"h-5 w-5 text-gray-900\" />\n </button>\n <div className=\"absolute bottom-4 left-1/2 flex -translate-x-1/2 gap-2\">\n {slides.map((_, i) => (\n <button\n key={i}\n type=\"button\"\n aria-label={`Ir para o slide ${i + 1}`}\n onClick={() => goTo(i)}\n className={`h-2 rounded-full transition-all duration-300 ${i === index ? 'w-7 bg-white' : 'w-2 bg-white/60 hover:bg-white/80'}`}\n />\n ))}\n </div>\n </>\n )}\n </section>\n )\n}\n","import React from 'react'\nimport { useCategories } from '../../hooks/useCategories'\nimport { useCatalogStore } from '../../stores/catalog.store'\nimport { useStorefrontConfig } from '../../config'\nimport { bannerPlaceholder } from '../../sections'\nimport { Reveal } from '../../motion'\nimport { navigateTo } from '../../router'\nimport { TID } from '../../testids'\n\nexport function CategoryShowcase({ style, title }: { style: 'bubbles' | 'tiles'; title?: string }) {\n const { categories } = useCategories()\n const config = useStorefrontConfig()\n const setCategoryId = useCatalogStore((s) => s.setCategoryId)\n\n if (categories.length === 0) return null\n\n const go = (categoryId: string) => {\n useCatalogStore.getState().reset()\n setCategoryId(categoryId)\n navigateTo(config.catalogPath)\n }\n\n if (style === 'bubbles') {\n return (\n <section data-testid={TID.categoryShowcase} className=\"mx-auto max-w-7xl px-4 py-12 sm:px-6\">\n {title && (\n <Reveal>\n <h2 className=\"sf-heading mb-8 text-center text-3xl font-bold\">{title}</h2>\n </Reveal>\n )}\n <div className=\"flex flex-wrap items-start justify-center gap-8\">\n {categories.map((c, i) => (\n <Reveal key={c.id} delay={i * 80}>\n <button type=\"button\" onClick={() => go(c.id)} className=\"group flex w-28 flex-col items-center gap-3\">\n <span className=\"block h-24 w-24 overflow-hidden rounded-full border-2 border-transparent shadow-sm transition-all duration-300 group-hover:scale-105 group-hover:border-primary group-hover:shadow-md\">\n <img\n src={c.imageUrl ?? bannerPlaceholder(c.name, 30 + i * 70, 70 + i * 70, 200, 200)}\n alt={c.name}\n className=\"h-full w-full object-cover\"\n />\n </span>\n <span className=\"text-center text-xs font-medium leading-tight\">{c.name}</span>\n </button>\n </Reveal>\n ))}\n </div>\n </section>\n )\n }\n\n return (\n <section data-testid={TID.categoryShowcase} className=\"mx-auto max-w-7xl px-4 py-12 sm:px-6\">\n {title && (\n <Reveal>\n <h2 className=\"sf-heading mb-8 text-center text-3xl font-bold\">{title}</h2>\n </Reveal>\n )}\n <div className=\"grid grid-cols-2 gap-4 lg:grid-cols-4\">\n {categories.map((c, i) => (\n <Reveal key={c.id} delay={i * 90}>\n <button type=\"button\" onClick={() => go(c.id)} className=\"group relative block aspect-[4/5] w-full overflow-hidden\" style={{ borderRadius: 'var(--sf-radius-card)' }}>\n <img\n src={c.imageUrl ?? bannerPlaceholder(c.name, 30 + i * 70, 70 + i * 70, 480, 600)}\n alt={c.name}\n className=\"h-full w-full object-cover transition-transform duration-700 ease-out group-hover:scale-110\"\n />\n <span className=\"absolute inset-x-0 bottom-0 bg-gradient-to-t from-black/70 via-black/30 to-transparent p-5 pt-12 text-left\">\n <span className=\"sf-heading block text-lg font-semibold text-white\">{c.name}</span>\n <span className=\"mt-0.5 block text-xs text-white/80 opacity-0 transition-opacity duration-300 group-hover:opacity-100\">\n Explorar →\n </span>\n </span>\n </button>\n </Reveal>\n ))}\n </div>\n </section>\n )\n}\n","import React, { useMemo } from 'react'\nimport { useProducts } from '../../hooks/useProducts'\nimport { useStorefrontConfig } from '../../config'\nimport { ProductCard } from '../ProductCard'\nimport { Reveal } from '../../motion'\nimport { Link } from '../../router'\nimport { TID } from '../../testids'\n\nexport function ProductRail({\n title,\n subtitle,\n eyebrow,\n filter = 'all',\n limit = 4,\n}: {\n title: string\n subtitle?: string\n eyebrow?: string\n filter?: 'sale' | 'new' | 'all'\n limit?: number\n}) {\n const config = useStorefrontConfig()\n const ProductCardComponent = config.slots?.ProductCard ?? ProductCard\n const { products, loading } = useProducts(\n filter === 'new'\n ? { status: 'active', orderBy: 'created_at', order: 'desc' }\n : { status: 'active' },\n )\n\n const visible = useMemo(() => {\n let list = products\n if (filter === 'sale') list = list.filter((p) => p.compareAtPrice != null && p.compareAtPrice > p.price)\n return list.slice(0, limit)\n }, [products, filter, limit])\n\n if (!loading && visible.length === 0) return null\n\n return (\n <section data-testid={TID.productRail} className=\"mx-auto max-w-7xl px-4 py-14 sm:px-6\">\n <Reveal className=\"mb-10 text-center\">\n {eyebrow && (\n <p className=\"mb-2 text-xs font-semibold uppercase tracking-[0.2em] text-primary\">{eyebrow}</p>\n )}\n <h2 className=\"sf-heading text-3xl font-bold tracking-tight\">{title}</h2>\n {subtitle && <p className=\"mt-2 text-muted-foreground\">{subtitle}</p>}\n </Reveal>\n {loading ? (\n <div className=\"grid grid-cols-2 gap-5 md:grid-cols-4\">\n {Array.from({ length: limit }, (_, i) => (\n <div key={i} className=\"aspect-[3/4] animate-pulse bg-muted\" style={{ borderRadius: 'var(--sf-radius-card)' }} />\n ))}\n </div>\n ) : (\n <div className=\"grid grid-cols-2 gap-5 md:grid-cols-4\">\n {visible.map((p, i) => (\n <Reveal key={p.id} delay={i * 90}>\n <ProductCardComponent product={p} />\n </Reveal>\n ))}\n </div>\n )}\n <Reveal className=\"mt-10 text-center\" delay={200}>\n <Link\n to={config.catalogPath}\n className=\"sf-cta inline-block border border-foreground/30 px-7 py-2.5 text-sm font-semibold transition-all hover:-translate-y-0.5 hover:bg-foreground hover:text-background hover:shadow\"\n style={{ borderRadius: 'var(--sf-radius-button)' }}\n >\n Ver tudo\n </Link>\n </Reveal>\n </section>\n )\n}\n","import React, { useState } from 'react'\nimport * as LucideIcons from 'lucide-react'\nimport { bannerPlaceholder } from '../../sections'\nimport { Reveal } from '../../motion'\nimport { Link } from '../../router'\nimport { TID } from '../../testids'\n\nfunction Icon({ name, className }: { name: string; className?: string }) {\n const C = (LucideIcons as unknown as Record<string, React.ComponentType<{ className?: string }>>)[name]\n return C ? <C className={className} /> : null\n}\n\nexport function BenefitsRow({ items }: { items: Array<{ icon: string; title: string; text?: string }> }) {\n return (\n <section data-testid={TID.benefits} className=\"border-y bg-card\">\n <div className=\"mx-auto grid max-w-7xl grid-cols-1 gap-6 px-4 py-9 sm:grid-cols-3 sm:px-6\">\n {items.slice(0, 4).map((item, i) => (\n <Reveal key={i} delay={i * 120} className=\"flex items-center justify-center gap-3 text-center sm:text-left\">\n <span className=\"flex h-12 w-12 shrink-0 items-center justify-center rounded-full bg-primary/10\">\n <Icon name={item.icon} className=\"h-6 w-6 text-primary\" />\n </span>\n <div>\n <p className=\"font-semibold\">{item.title}</p>\n {item.text && <p className=\"text-sm text-muted-foreground\">{item.text}</p>}\n </div>\n </Reveal>\n ))}\n </div>\n </section>\n )\n}\n\nexport function PromoBanner({\n title,\n subtitle,\n eyebrow,\n cta,\n href,\n image,\n hue = 160,\n}: {\n title: string\n subtitle?: string\n eyebrow?: string\n cta?: string\n href?: string\n image?: string\n hue?: number\n}) {\n return (\n <section data-testid={TID.promoBanner} className=\"group relative my-12 overflow-hidden\">\n <img\n src={image ?? bannerPlaceholder(title, hue, hue + 50, 1600, 420)}\n alt={title}\n className=\"h-80 w-full object-cover transition-transform duration-700 ease-out group-hover:scale-105\"\n />\n <div className=\"absolute inset-0 flex flex-col items-center justify-center bg-gradient-to-t from-black/65 via-black/35 to-black/20 p-6 text-center text-white\">\n <Reveal>\n {eyebrow && (\n <p className=\"mb-2 text-xs font-semibold uppercase tracking-[0.25em] text-white/80\">{eyebrow}</p>\n )}\n <h2 className=\"sf-heading text-3xl font-bold drop-shadow sm:text-5xl\">{title}</h2>\n {subtitle && <p className=\"mt-3 max-w-lg text-white/90\">{subtitle}</p>}\n {cta && (\n <Link\n to={href ?? '/catalog'}\n className=\"sf-cta mt-6 inline-block bg-white px-8 py-3 font-semibold text-gray-900 shadow-lg transition-all hover:-translate-y-0.5 hover:shadow-xl\"\n style={{ borderRadius: 'var(--sf-radius-button)' }}\n >\n {cta}\n </Link>\n )}\n </Reveal>\n </div>\n </section>\n )\n}\n\nexport function ManifestoBlock({ title, text }: { title?: string; text: string }) {\n return (\n <section data-testid={TID.manifesto} className=\"mx-auto max-w-3xl px-4 py-14 text-center sm:px-6\">\n {title && <h2 className=\"sf-heading mb-5 text-2xl font-bold\">{title}</h2>}\n <p className=\"sf-heading text-xl leading-relaxed text-muted-foreground sm:text-2xl\">{text}</p>\n </section>\n )\n}\n\nexport function Testimonials({ title, items }: { title?: string; items: Array<{ quote: string; author: string }> }) {\n return (\n <section data-testid={TID.testimonials} className=\"bg-muted/50 py-14\">\n <div className=\"mx-auto max-w-7xl px-4 sm:px-6\">\n {title && (\n <Reveal>\n <h2 className=\"sf-heading mb-10 text-center text-3xl font-bold\">{title}</h2>\n </Reveal>\n )}\n <div className=\"grid gap-6 md:grid-cols-3\">\n {items.slice(0, 3).map((t, i) => (\n <Reveal key={i} delay={i * 130}>\n <figure\n className=\"h-full bg-card p-7 shadow-sm transition-shadow hover:shadow-md\"\n style={{ borderRadius: 'var(--sf-radius-card)' }}\n >\n <div className=\"mb-3 text-primary\" aria-hidden>★★★★★</div>\n <blockquote className=\"leading-relaxed\">“{t.quote}”</blockquote>\n <figcaption className=\"mt-4 text-sm font-semibold text-muted-foreground\">— {t.author}</figcaption>\n </figure>\n </Reveal>\n ))}\n </div>\n </div>\n </section>\n )\n}\n\nexport function NewsletterBand({ title, subtitle }: { title?: string; subtitle?: string }) {\n const [email, setEmail] = useState('')\n const [done, setDone] = useState(false)\n return (\n <section data-testid={TID.newsletter} className=\"bg-primary py-16 text-primary-foreground\">\n <Reveal className=\"mx-auto max-w-xl px-4 text-center sm:px-6\">\n <h2 className=\"sf-heading text-3xl font-bold\">{title ?? 'Receba nossas novidades'}</h2>\n {subtitle && <p className=\"mt-2 opacity-90\">{subtitle}</p>}\n {done ? (\n <p data-testid={TID.newsletterDone} className=\"mt-6 font-medium\">Inscrição confirmada! 🎉</p>\n ) : (\n <form\n className=\"mt-6 flex gap-2\"\n onSubmit={(e) => {\n e.preventDefault()\n if (email.trim()) setDone(true)\n }}\n >\n <input\n data-testid={TID.newsletterEmail}\n type=\"email\"\n required\n placeholder=\"Seu e-mail\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n className=\"flex-1 border-0 bg-white/95 px-4 py-3 text-sm text-gray-900 outline-none\"\n style={{ borderRadius: 'var(--sf-radius-input)' }}\n />\n <button\n type=\"submit\"\n data-testid={TID.newsletterSubmit}\n className=\"sf-cta bg-foreground px-6 py-3 text-sm font-semibold text-background\"\n style={{ borderRadius: 'var(--sf-radius-button)' }}\n >\n Assinar\n </button>\n </form>\n )}\n </Reveal>\n </section>\n )\n}\n","import { registerBlock } from '@fayz-ai/core'\nimport type { BlockNode } from '@fayz-ai/core'\nimport type { HomeSection } from './sections'\nimport { HeroSection } from './components/sections/HeroSection'\nimport { CategoryShowcase } from './components/sections/CategoryShowcase'\nimport { ProductRail } from './components/sections/ProductRail'\nimport {\n BenefitsRow,\n PromoBanner,\n ManifestoBlock,\n Testimonials,\n NewsletterBand,\n} from './components/sections/MiscSections'\n\n// ---------------------------------------------------------------------------\n// Storefront blocks — the section components registered into the universal\n// block registry. This replaces HomePage's hardcoded switch: a home page is now\n// a block tree (`{ type, props }[]`) resolved through the registry, identical\n// to how admin pages will compose. Section prop shapes are unchanged, so the\n// components are registered directly.\n// ---------------------------------------------------------------------------\n\nlet registered = false\n\nexport function registerStorefrontBlocks(): void {\n if (registered) return\n registered = true\n registerBlock('hero', HeroSection, { source: 'sdk', label: 'Hero' })\n registerBlock('categories', CategoryShowcase, { source: 'sdk', label: 'Categories' })\n registerBlock('products', ProductRail, { source: 'sdk', label: 'Product rail' })\n registerBlock('benefits', BenefitsRow, { source: 'sdk', label: 'Benefits row' })\n registerBlock('banner', PromoBanner, { source: 'sdk', label: 'Promo banner' })\n registerBlock('manifesto', ManifestoBlock, { source: 'sdk', label: 'Manifesto' })\n registerBlock('testimonials', Testimonials, { source: 'sdk', label: 'Testimonials' })\n registerBlock('newsletter', NewsletterBand, { source: 'sdk', label: 'Newsletter band' })\n}\n\n// Register on import so any consumer of the storefront package has the blocks.\nregisterStorefrontBlocks()\n\n/** Convert the legacy HomeSection[] blueprint into a generic block tree. */\nexport function sectionsToBlocks(sections: HomeSection[]): BlockNode[] {\n return sections.map((section, i) => {\n const { type, ...props } = section\n return { type, id: `${type}-${i}`, props: props as Record<string, unknown> }\n })\n}\n","import React from 'react'\nimport { renderBlocks } from '@fayz-ai/core'\nimport type { HomeSection } from '../sections'\nimport { sectionsToBlocks } from '../blocks'\n\n// The home page is now a block tree resolved through the universal block\n// registry (see ../blocks). Section components and their props are unchanged;\n// only the dispatch mechanism moved from a switch to the registry, so the same\n// composition works from a pure-data AppManifest.\nexport function HomePage({ sections }: { sections: HomeSection[] }) {\n return <main>{renderBlocks(sectionsToBlocks(sections))}</main>\n}\n","import { useEffect, useState } from 'react'\nimport { getShopProvider } from '@fayz-ai/shop/runtime'\nimport type { Product } from '@fayz-ai/shop/types'\n\nexport function useProduct(slug: string): {\n product: Product | null\n loading: boolean\n error: string | null\n} {\n const [product, setProduct] = useState<Product | null>(null)\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n let cancelled = false\n setLoading(true)\n getShopProvider()\n .listProducts({ slug, status: 'active', limit: 1 })\n .then((data) => {\n if (cancelled) return\n setProduct(data[0] ?? null)\n setError(null)\n })\n .catch((e: unknown) => {\n if (!cancelled) setError(e instanceof Error ? e.message : String(e))\n })\n .finally(() => {\n if (!cancelled) setLoading(false)\n })\n return () => {\n cancelled = true\n }\n }, [slug])\n\n return { product, loading, error }\n}\n","import React from 'react'\nimport type { ProductOptionGroup, ProductOptionSelection } from '../product-options'\nimport { TID } from '../testids'\n\nexport interface ProductOptionSelectorProps {\n groups: ProductOptionGroup[]\n value: ProductOptionSelection\n onChange: (value: ProductOptionSelection) => void\n}\n\nexport function ProductOptionSelector({ groups, value, onChange }: ProductOptionSelectorProps) {\n if (groups.length === 0) return null\n\n return (\n <div className=\"mt-6 space-y-4\">\n {groups.map((group) => (\n <div key={group.id} data-testid={TID.productOptionGroup(group.id)}>\n <div className=\"mb-2 flex items-center justify-between gap-3\">\n <p className=\"text-sm font-medium\">{group.label}</p>\n {value[group.label] && (\n <p className=\"truncate text-xs text-muted-foreground\">{value[group.label]}</p>\n )}\n </div>\n <div className=\"flex flex-wrap gap-2\">\n {group.values.map((option) => {\n const selected = value[group.label] === option\n return (\n <button\n key={option}\n type=\"button\"\n data-testid={TID.productOptionValue(group.id, option)}\n aria-pressed={selected}\n onClick={() => onChange({ ...value, [group.label]: option })}\n className={[\n 'min-h-10 rounded-full border px-4 text-sm font-medium transition-colors',\n selected\n ? 'border-primary bg-primary text-primary-foreground'\n : 'border-border bg-background text-foreground hover:border-primary/60',\n ].join(' ')}\n >\n {option}\n </button>\n )\n })}\n </div>\n </div>\n ))}\n </div>\n )\n}\n","import React from 'react'\nimport type { Product } from '@fayz-ai/shop/types'\n\n// Metadata keys that drive the option selector (size/color) are excluded here so\n// specs don't duplicate the picker; the rest are internal SDK/seed/overlay keys\n// that aren't customer-facing specs.\nconst EXCLUDED_KEYS = new Set([\n 'options', 'sizes', 'colors',\n 'fayzStoreCategory', 'source', 'storeKey', 'storeName', 'tenantId', 'slug',\n])\n\n// Internal namespaced keys (fayz*, _*) are never shown as specs.\nfunction isInternalKey(key: string): boolean {\n return EXCLUDED_KEYS.has(key) || key.startsWith('_') || key.startsWith('fayz')\n}\n\n// Friendly PT-BR labels for common metadata keys; unknown keys are humanized.\nconst LABELS: Record<string, string> = {\n colorway: 'Cor',\n color: 'Cor',\n fit: 'Caimento',\n material: 'Material',\n vintage: 'Safra',\n region: 'Região',\n grape: 'Uva',\n pairing: 'Harmonização',\n abv: 'Teor alcoólico',\n volume: 'Volume',\n brand: 'Marca',\n origin: 'Origem',\n warranty: 'Garantia',\n dimensions: 'Dimensões',\n}\n\nfunction humanize(key: string): string {\n if (LABELS[key]) return LABELS[key]\n const spaced = key.replace(/([a-z0-9])([A-Z])/g, '$1 $2').replace(/[_-]+/g, ' ').trim()\n return spaced.charAt(0).toUpperCase() + spaced.slice(1)\n}\n\nfunction scalarToString(value: unknown): string | null {\n if (typeof value === 'string') return value.trim() || null\n if (typeof value === 'number') return String(value)\n if (typeof value === 'boolean') return value ? 'Sim' : 'Não'\n return null\n}\n\n/** Real product specs from standard fields + scalar metadata. Renders nothing\n * when there's nothing to show. No invented data. */\nexport function ProductSpecs({ product }: { product: Product }) {\n const rows: Array<[string, string]> = []\n if (product.sku) rows.push(['SKU', product.sku])\n if (product.categoryName) rows.push(['Categoria', product.categoryName])\n if (product.weight != null) rows.push(['Peso', `${product.weight} ${product.weightUnit}`])\n for (const [key, value] of Object.entries(product.metadata ?? {})) {\n if (isInternalKey(key)) continue\n const str = scalarToString(value)\n if (str) rows.push([humanize(key), str])\n }\n if (rows.length === 0) return null\n\n return (\n <section className=\"mt-14\">\n <h2 className=\"sf-heading text-xl font-semibold tracking-tight\">Especificações</h2>\n <dl className=\"mt-5 grid gap-x-12 sm:grid-cols-2\">\n {rows.map(([label, value]) => (\n <div key={label} className=\"flex items-center justify-between gap-4 border-b py-3 text-sm\">\n <dt className=\"text-muted-foreground\">{label}</dt>\n <dd className=\"text-right font-medium\">{value}</dd>\n </div>\n ))}\n </dl>\n </section>\n )\n}\n","import React from 'react'\nimport type { ListProductsOptions, Product } from '@fayz-ai/shop/types'\nimport { useProducts } from '../hooks/useProducts'\nimport { useStorefrontConfig } from '../config'\nimport { ProductCard } from './ProductCard'\n\n/** \"Você também pode gostar\" — products from the same category, excluding the\n * current one. Renders through the store's configured card slot for visual\n * consistency with the catalog. Hidden when there's nothing relevant. */\nexport function RelatedProducts({ product }: { product: Product }) {\n const config = useStorefrontConfig()\n const Card = config.slots?.ProductCard ?? ProductCard\n const opts: ListProductsOptions = product.categoryId\n ? { categoryId: product.categoryId, status: 'active', limit: 5 }\n : { status: 'active', limit: 5 }\n const { products, loading } = useProducts(opts)\n const related = products.filter((p) => p.id !== product.id).slice(0, 4)\n\n if (loading || related.length === 0) return null\n\n return (\n <section className=\"mt-16\">\n <h2 className=\"sf-heading text-xl font-semibold tracking-tight\">Você também pode gostar</h2>\n <div className=\"mt-6 grid grid-cols-2 gap-5 md:grid-cols-4\">\n {related.map((p) => (\n <Card key={p.id} product={p} />\n ))}\n </div>\n </section>\n )\n}\n","import React, { useEffect, useState } from 'react'\nimport { ChevronLeft, RefreshCcw, ShieldCheck, Truck } from 'lucide-react'\nimport { useProduct } from '../hooks/useProduct'\nimport { useCartStore } from '../stores/cart.store'\nimport { useStorefrontConfig } from '../config'\nimport { useStorefrontHead } from '../hooks/useStorefrontHead'\nimport { Link } from '../router'\nimport { Price } from '../components/Price'\nimport { QuantityInput } from '../components/QuantityInput'\nimport { ProductOptionSelector } from '../components/ProductOptionSelector'\nimport { ProductSpecs } from '../components/ProductSpecs'\nimport { RelatedProducts } from '../components/RelatedProducts'\nimport { getProductOptionGroups, type ProductOptionSelection } from '../product-options'\nimport { TID } from '../testids'\n\nexport function ProductDetailPage({ slug }: { slug: string }) {\n const config = useStorefrontConfig()\n const { product, loading } = useProduct(slug)\n const addItem = useCartStore((s) => s.addItem)\n const [qty, setQty] = useState(1)\n const [selectedOptions, setSelectedOptions] = useState<ProductOptionSelection>({})\n\n const optionGroups = product ? getProductOptionGroups(product) : []\n useStorefrontHead({\n title: product ? `${product.name} — ${config.name}` : config.name,\n description: product?.description,\n })\n\n useEffect(() => {\n if (!product) return\n const defaults = Object.fromEntries(\n getProductOptionGroups(product).map((group) => [group.label, group.values[0] ?? '']),\n )\n setSelectedOptions(defaults)\n }, [product?.id])\n\n if (loading) {\n return (\n <main className=\"mx-auto max-w-5xl px-4 py-8 sm:px-6\">\n <div className=\"grid animate-pulse gap-10 md:grid-cols-2\">\n <div className=\"aspect-square rounded-2xl bg-muted\" />\n <div className=\"space-y-4 py-4\">\n <div className=\"h-8 w-3/4 rounded bg-muted\" />\n <div className=\"h-6 w-1/3 rounded bg-muted\" />\n <div className=\"h-24 rounded bg-muted\" />\n </div>\n </div>\n </main>\n )\n }\n\n if (!product) {\n return (\n <main className=\"mx-auto max-w-5xl px-4 py-20 text-center sm:px-6\">\n <p className=\"text-lg text-muted-foreground\">Produto não encontrado.</p>\n <Link to=\"/\" className=\"mt-4 inline-block text-primary underline\">Voltar à loja</Link>\n </main>\n )\n }\n\n const soldOut = product.inventoryCount <= 0\n const lowStock = !soldOut && product.inventoryCount <= 5\n const image = product.images.find((i) => i.isPrimary) ?? product.images[0]\n const discountPct =\n product.compareAtPrice && product.compareAtPrice > product.price\n ? Math.round((1 - product.price / product.compareAtPrice) * 100)\n : 0\n\n return (\n <main className=\"mx-auto max-w-5xl px-4 py-8 sm:px-6\">\n <Link to=\"/\" className=\"mb-6 inline-flex items-center gap-1 text-sm text-muted-foreground hover:text-foreground\">\n <ChevronLeft className=\"h-4 w-4\" /> Continuar comprando\n </Link>\n\n <div className=\"grid animate-fade-up gap-10 md:grid-cols-2\">\n <div className=\"group overflow-hidden border bg-muted\" style={{ borderRadius: 'var(--sf-radius-card)' }}>\n {image && (\n <img\n src={image.url}\n alt={image.altText ?? product.name}\n className=\"aspect-square w-full object-cover transition-transform duration-700 ease-out group-hover:scale-105\"\n />\n )}\n </div>\n\n <div className=\"flex flex-col py-2 lg:sticky lg:top-24 lg:self-start\">\n <nav className=\"mb-3 flex flex-wrap items-center gap-1.5 text-xs text-muted-foreground\">\n <Link to=\"/\" className=\"transition-colors hover:text-foreground\">Início</Link>\n {product.categoryName && (\n <>\n <span aria-hidden>/</span>\n <span>{product.categoryName}</span>\n </>\n )}\n <span aria-hidden>/</span>\n <span className=\"text-foreground\">{product.name}</span>\n </nav>\n\n <h1 data-testid={TID.pdpName} className=\"sf-heading text-3xl font-bold tracking-tight\">\n {product.name}\n </h1>\n\n <div className=\"mt-3 flex items-center gap-3\">\n <div className=\"text-xl\">\n <Price\n value={product.price}\n compareAt={product.compareAtPrice}\n testId={TID.pdpPrice}\n compareTestId={TID.pdpComparePrice}\n />\n </div>\n {discountPct > 0 && (\n <span className=\"rounded-full bg-primary/10 px-2.5 py-1 text-xs font-bold text-primary\">\n −{discountPct}%\n </span>\n )}\n </div>\n\n <p data-testid={TID.pdpDescription} className=\"mt-5 leading-relaxed text-muted-foreground\">\n {product.description}\n </p>\n\n <div className=\"mt-4 flex flex-wrap items-center gap-x-3 gap-y-1 text-sm\">\n {soldOut ? (\n <span className=\"inline-flex items-center gap-2 font-medium text-muted-foreground\">\n <span className=\"h-2 w-2 rounded-full bg-muted-foreground\" /> Sem estoque\n </span>\n ) : lowStock ? (\n <span className=\"inline-flex items-center gap-2 font-semibold text-amber-600\">\n <span className=\"h-2 w-2 animate-pulse rounded-full bg-amber-500\" />\n Últimas unidades — só {product.inventoryCount} restantes\n </span>\n ) : (\n <span className=\"inline-flex items-center gap-2 font-medium text-emerald-600\">\n <span className=\"h-2 w-2 rounded-full bg-emerald-500\" /> Em estoque\n </span>\n )}\n {product.sku && <span className=\"text-muted-foreground\">SKU: {product.sku}</span>}\n </div>\n\n <ProductOptionSelector\n groups={optionGroups}\n value={selectedOptions}\n onChange={setSelectedOptions}\n />\n\n <div className=\"mt-8 flex items-center gap-4\">\n <QuantityInput\n value={qty}\n onChange={setQty}\n max={soldOut ? 1 : product.inventoryCount}\n testId={TID.pdpQtyInput}\n />\n <button\n type=\"button\"\n data-testid={TID.pdpAddToCart}\n disabled={soldOut}\n onClick={() => addItem(product, qty, selectedOptions)}\n className=\"sf-cta flex-1 bg-primary py-3.5 font-semibold text-primary-foreground shadow-md transition-all hover:-translate-y-0.5 hover:shadow-lg disabled:cursor-not-allowed disabled:opacity-40 disabled:shadow-none disabled:hover:translate-y-0\"\n style={{ borderRadius: 'var(--sf-radius-button)' }}\n >\n {soldOut ? 'Esgotado' : 'Adicionar ao carrinho'}\n </button>\n </div>\n\n <div className=\"mt-6 grid grid-cols-3 gap-3 border-t pt-6 text-center\">\n <div className=\"flex flex-col items-center gap-1.5 text-[11px] font-medium text-muted-foreground\">\n <Truck className=\"h-5 w-5 text-primary\" /> Envio rápido\n </div>\n <div className=\"flex flex-col items-center gap-1.5 text-[11px] font-medium text-muted-foreground\">\n <RefreshCcw className=\"h-5 w-5 text-primary\" /> Troca fácil\n </div>\n <div className=\"flex flex-col items-center gap-1.5 text-[11px] font-medium text-muted-foreground\">\n <ShieldCheck className=\"h-5 w-5 text-primary\" /> Pagamento seguro\n </div>\n </div>\n </div>\n </div>\n\n <ProductSpecs product={product} />\n <RelatedProducts product={product} />\n </main>\n )\n}\n","import { getShopProvider } from '@fayz-ai/shop/runtime'\nimport type { Order } from '@fayz-ai/shop/types'\nimport { establishCustomerSession } from '../auth'\nimport type { ResolvedStorefrontConfig } from '../config'\nimport type { CartState } from '../stores/cart.store'\nimport { selectShipping } from '../stores/cart.store'\nimport type { SessionState } from '../stores/session.store'\n\nexport interface StorefrontCheckoutCustomer {\n email: string\n name: string\n}\n\nexport interface StorefrontCheckoutAddress {\n street?: string\n city?: string\n zip?: string\n notes?: string\n}\n\nexport interface PlaceStorefrontOrderInput {\n config: ResolvedStorefrontConfig\n cart: Pick<CartState, 'lines' | 'discountCode' | 'discountPercent'>\n session?: Pick<SessionState, 'customerId' | 'email'>\n customer: StorefrontCheckoutCustomer\n address?: StorefrontCheckoutAddress\n markPaid?: boolean\n}\n\nexport interface PlaceStorefrontOrderResult {\n order: Order\n customerId: string\n}\n\nfunction formatDeliveryNotes(address: StorefrontCheckoutAddress | undefined): string | undefined {\n if (!address) return undefined\n if (address.notes?.trim()) return address.notes.trim()\n\n const parts = [address.street, address.city, address.zip]\n .map((part) => part?.trim())\n .filter(Boolean)\n\n return parts.length > 0 ? `Entrega: ${parts.join(', ')}` : undefined\n}\n\n/**\n * Storefront checkout primitive for custom/generated checkout screens.\n * It owns the order payload math and customer-session handshake so app-owned\n * routes can customize UX without copying provider/business logic.\n */\nexport async function placeStorefrontOrder({\n config,\n cart,\n session,\n customer,\n address,\n markPaid = false,\n}: PlaceStorefrontOrderInput): Promise<PlaceStorefrontOrderResult> {\n const email = customer.email.trim().toLowerCase()\n const name = customer.name.trim()\n const provider = getShopProvider()\n\n let customerId = session?.customerId ?? null\n if (!customerId || session?.email !== email) {\n const established = await establishCustomerSession(email, { name })\n customerId = established.customerId\n }\n\n // Trusted placement: send only product ids + quantities. The provider\n // (shop_place_order RPC on Supabase, in-memory parity in mock) re-reads\n // prices, validates the discount, and decrements inventory server-side.\n const order = await provider.placeOrder({\n customerId: customerId ?? undefined,\n customer: { name, email },\n currency: config.currency,\n notes: formatDeliveryNotes(address),\n discountCode: cart.discountCode ?? undefined,\n shippingTotal: selectShipping(cart, config),\n items: cart.lines.map((line) => ({\n productId: line.productId,\n quantity: line.quantity,\n optionsLabel: line.optionsLabel || undefined,\n })),\n })\n\n if (markPaid) {\n await provider.updateOrder(order.id, { financialStatus: 'paid' })\n }\n\n return { order, customerId: customerId ?? order.customerId ?? '' }\n}\n","import React, { useEffect, useState } from 'react'\nimport { Lock, X } from 'lucide-react'\nimport { establishCustomerSession } from '../auth'\nimport { useSessionStore } from '../stores/session.store'\nimport { Link } from '../router'\n\ninterface SignInModalProps {\n /** Prefill the email field (e.g. from a checkout contact field). */\n defaultEmail?: string\n onClose: () => void\n /** Called after a successful sign-in, with the resolved session. */\n onSignedIn?: (session: { email: string | null; name: string | null }) => void\n}\n\n/**\n * Customer sign-in as a focused modal dialog. Used from checkout (\"Já tem\n * conta? Entrar\") so a returning buyer can authenticate without leaving the\n * page. Auth goes through the shared establishCustomerSession path.\n */\nexport function SignInModal({ defaultEmail = '', onClose, onSignedIn }: SignInModalProps) {\n const [email, setEmail] = useState(defaultEmail)\n const [password, setPassword] = useState('')\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n const onKey = (event: KeyboardEvent) => { if (event.key === 'Escape') onClose() }\n document.addEventListener('keydown', onKey)\n return () => document.removeEventListener('keydown', onKey)\n }, [onClose])\n\n async function submit(event: React.FormEvent) {\n event.preventDefault()\n if (!email.trim() || !password) return\n setBusy(true)\n setError(null)\n try {\n await establishCustomerSession(email, { password })\n const session = useSessionStore.getState()\n onSignedIn?.({ email: session.email, name: session.name })\n onClose()\n } catch {\n setError('Não foi possível entrar. Verifique seu e-mail e senha.')\n } finally {\n setBusy(false)\n }\n }\n\n return (\n <div\n className=\"fixed inset-0 z-[60] flex items-center justify-center p-4\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Entrar na sua conta\"\n >\n <div className=\"absolute inset-0 animate-fade-in bg-foreground/40 backdrop-blur-sm\" onClick={onClose} />\n <div\n className=\"relative z-10 w-full max-w-sm animate-fade-up border bg-card p-6 shadow-2xl\"\n style={{ borderRadius: 'var(--sf-radius-card)' }}\n >\n <button\n type=\"button\"\n onClick={onClose}\n aria-label=\"Fechar\"\n className=\"absolute right-4 top-4 rounded-full p-1 text-muted-foreground transition hover:bg-muted hover:text-foreground\"\n >\n <X className=\"h-5 w-5\" />\n </button>\n\n <div className=\"flex items-center gap-2\">\n <span className=\"flex h-9 w-9 items-center justify-center rounded-full bg-primary/10 text-primary\">\n <Lock className=\"h-4 w-4\" />\n </span>\n <div>\n <h2 className=\"sf-heading text-lg font-semibold leading-tight\">Entrar na sua conta</h2>\n <p className=\"text-xs text-muted-foreground\">Use seus dados salvos e acompanhe pedidos.</p>\n </div>\n </div>\n\n <form onSubmit={submit} className=\"mt-5 space-y-3\">\n <input\n type=\"email\"\n required\n autoFocus\n placeholder=\"voce@exemplo.com\"\n value={email}\n onChange={(event) => setEmail(event.target.value)}\n className=\"w-full border bg-background px-3 py-2.5 text-sm outline-none transition focus:border-primary focus:ring-2 focus:ring-primary/10\"\n style={{ borderRadius: 'var(--sf-radius-input)' }}\n />\n <input\n type=\"password\"\n required\n placeholder=\"Senha\"\n value={password}\n onChange={(event) => setPassword(event.target.value)}\n className=\"w-full border bg-background px-3 py-2.5 text-sm outline-none transition focus:border-primary focus:ring-2 focus:ring-primary/10\"\n style={{ borderRadius: 'var(--sf-radius-input)' }}\n />\n {error && <p className=\"text-sm text-destructive\">{error}</p>}\n <button\n type=\"submit\"\n disabled={busy}\n className=\"sf-cta w-full bg-primary py-3 font-semibold text-primary-foreground shadow-md transition-all hover:-translate-y-0.5 hover:shadow-lg disabled:opacity-60\"\n style={{ borderRadius: 'var(--sf-radius-button)' }}\n >\n {busy ? 'Entrando…' : 'Entrar'}\n </button>\n </form>\n\n <p className=\"mt-4 text-center text-sm text-muted-foreground\">\n Não tem conta?{' '}\n <Link to=\"/account\" onClick={onClose} className=\"font-semibold text-primary hover:underline\">\n Criar conta\n </Link>\n </p>\n </div>\n </div>\n )\n}\n","import React, { useEffect, useState } from 'react'\nimport { CreditCard, Lock, PackageCheck, ShieldCheck, Trash2 } from 'lucide-react'\nimport { prefersReducedMotion } from '../motion'\nimport {\n useCartStore,\n selectSubtotal,\n selectDiscountTotal,\n selectShipping,\n selectTotal,\n} from '../stores/cart.store'\nimport { useSessionStore } from '../stores/session.store'\nimport { useStorefrontConfig } from '../config'\nimport { Link, navigateTo } from '../router'\nimport { formatMoney } from '../format'\nimport { TID } from '../testids'\nimport { placeStorefrontOrder } from '../workflows/checkout'\nimport { useDiscountValidator } from '../hooks/useDiscountValidator'\nimport { toast } from '../stores/toast.store'\nimport { useStorefrontHead } from '../hooks/useStorefrontHead'\nimport { SignInModal } from '../components/SignInModal'\n\ninterface CheckoutForm {\n email: string\n name: string\n street: string\n city: string\n zip: string\n card: string\n expiry: string\n cvc: string\n}\n\ntype AddressMode = 'saved' | 'new'\ntype PaymentMode = 'saved' | 'new'\n\nconst SAVED_ADDRESSES = [\n { id: 'home', label: 'Casa', street: 'Rua das Flores, 123', city: 'São Paulo', zip: '01310-100' },\n]\n\nconst SAVED_PAYMENT_METHODS = [\n { id: 'visa', label: 'Visa final 4242', card: '4242 4242 4242 4242', expiry: '12/29', cvc: '123' },\n]\n\nconst PROCESSING_STEPS = [\n { icon: Lock, label: 'Validando seus dados...' },\n { icon: CreditCard, label: 'Processando pagamento...' },\n { icon: PackageCheck, label: 'Confirmando seu pedido...' },\n]\n\nconst DEFAULT_ADDRESS = SAVED_ADDRESSES[0]!\nconst DEFAULT_PAYMENT = SAVED_PAYMENT_METHODS[0]!\nconst sleep = (ms: number) => new Promise<void>((resolve) => setTimeout(resolve, ms))\n\nfunction ProcessingOverlay({ step }: { step: number }) {\n const current = PROCESSING_STEPS[Math.min(step, PROCESSING_STEPS.length - 1)]!\n const Icon = current.icon\n return (\n <div\n data-testid={TID.checkoutProcessing}\n className=\"fixed inset-0 z-50 flex animate-fade-in flex-col items-center justify-center bg-background/95 backdrop-blur-sm\"\n role=\"status\"\n aria-live=\"polite\"\n >\n <div className=\"relative flex h-24 w-24 items-center justify-center\">\n <span className=\"absolute inset-0 animate-spin rounded-full border-[3px] border-muted border-t-primary\" style={{ animationDuration: '1.1s' }} />\n <Icon key={step} className=\"h-9 w-9 animate-pop-in text-primary\" />\n </div>\n <p key={`label-${step}`} className=\"mt-6 animate-fade-up font-medium\">{current.label}</p>\n <p className=\"mt-8 text-xs text-muted-foreground\">Pagamento seguro - não feche esta janela</p>\n </div>\n )\n}\n\nfunction field(\n label: string,\n testId: string,\n value: string,\n onChange: (value: string) => void,\n props?: React.InputHTMLAttributes<HTMLInputElement>,\n) {\n return (\n <label className=\"block\">\n <span className=\"sr-only\">{label}</span>\n <input\n data-testid={testId}\n aria-label={label}\n value={value}\n onChange={(event) => onChange(event.target.value)}\n className=\"w-full rounded-lg border bg-background px-3.5 py-3 text-sm outline-none transition focus:border-primary focus:ring-2 focus:ring-primary/10\"\n {...props}\n />\n </label>\n )\n}\n\nexport function CheckoutPage() {\n const config = useStorefrontConfig()\n const cart = useCartStore()\n const session = useSessionStore()\n const validateDiscount = useDiscountValidator()\n useStorefrontHead({ title: `Checkout — ${config.name}` })\n\n const [selectedAddressId, setSelectedAddressId] = useState(DEFAULT_ADDRESS.id)\n const [selectedPaymentId, setSelectedPaymentId] = useState(DEFAULT_PAYMENT.id)\n const [savedAddresses, setSavedAddresses] = useState(SAVED_ADDRESSES)\n const [savedPaymentMethods, setSavedPaymentMethods] = useState(SAVED_PAYMENT_METHODS)\n const [addressMode, setAddressMode] = useState<AddressMode>('saved')\n const [paymentMode, setPaymentMode] = useState<PaymentMode>('saved')\n const [form, setForm] = useState<CheckoutForm>({\n email: session.email ?? '',\n name: session.name ?? '',\n street: DEFAULT_ADDRESS.street,\n city: DEFAULT_ADDRESS.city,\n zip: DEFAULT_ADDRESS.zip,\n card: DEFAULT_PAYMENT.card,\n expiry: DEFAULT_PAYMENT.expiry,\n cvc: DEFAULT_PAYMENT.cvc,\n })\n const [error, setError] = useState<string | null>(null)\n const [discountCode, setDiscountCode] = useState('')\n const [discountError, setDiscountError] = useState<string | null>(null)\n const [discountSuccess, setDiscountSuccess] = useState<string | null>(null)\n const [applyingDiscount, setApplyingDiscount] = useState(false)\n const [placing, setPlacing] = useState(false)\n const [processingStep, setProcessingStep] = useState(0)\n const [showSignin, setShowSignin] = useState(false)\n\n const subtotal = selectSubtotal(cart)\n const discountTotal = selectDiscountTotal(cart)\n const shipping = selectShipping(cart, config)\n const total = selectTotal(cart, config)\n const money = (value: number) => formatMoney(value, config.currency, config.locale)\n\n useEffect(() => {\n if (cart.lines.length === 0 && !placing) navigateTo(config.catalogPath)\n }, [cart.lines.length, config.catalogPath, placing])\n\n const set = (key: keyof CheckoutForm) => (value: string) => setForm((current) => ({ ...current, [key]: value }))\n\n async function applyDiscountCode() {\n setApplyingDiscount(true)\n setDiscountError(null)\n setDiscountSuccess(null)\n try {\n const appliedCode = discountCode.trim().toUpperCase()\n const result = await validateDiscount(discountCode)\n if (result.valid) {\n cart.applyDiscount(appliedCode, result.percent)\n setDiscountCode(appliedCode)\n setDiscountSuccess(`${appliedCode} aplicado: ${result.percent}% de desconto.`)\n toast.success('Cupom aplicado!', `${appliedCode} • ${result.percent}% de desconto`)\n } else {\n setDiscountError(result.message ?? 'Cupom inválido.')\n toast.error('Cupom inválido', result.message ?? 'Verifique o código e tente novamente.')\n }\n } finally {\n setApplyingDiscount(false)\n }\n }\n\n function clearDiscountCode() {\n cart.clearDiscount()\n setDiscountCode('')\n setDiscountSuccess(null)\n setDiscountError(null)\n }\n\n function applySavedAddress(address: typeof SAVED_ADDRESSES[number]) {\n setAddressMode('saved')\n setSelectedAddressId(address.id)\n setForm((current) => ({ ...current, street: address.street, city: address.city, zip: address.zip }))\n }\n\n function selectAddress(addressId: string) {\n const address = savedAddresses.find((item) => item.id === addressId)\n if (address) applySavedAddress(address)\n }\n\n function addNewAddress() {\n setAddressMode('new')\n setSelectedAddressId('new')\n setForm((current) => ({ ...current, street: '', city: '', zip: '' }))\n }\n\n function removeAddress(addressId: string) {\n const nextAddresses = savedAddresses.filter((item) => item.id !== addressId)\n setSavedAddresses(nextAddresses)\n if (selectedAddressId !== addressId) return\n const fallback = nextAddresses[0]\n if (fallback) applySavedAddress(fallback)\n else addNewAddress()\n }\n\n function applySavedPayment(method: typeof SAVED_PAYMENT_METHODS[number]) {\n setPaymentMode('saved')\n setSelectedPaymentId(method.id)\n setForm((current) => ({ ...current, card: method.card, expiry: method.expiry, cvc: method.cvc }))\n }\n\n function selectPayment(paymentId: string) {\n const method = savedPaymentMethods.find((item) => item.id === paymentId)\n if (method) applySavedPayment(method)\n }\n\n function addNewPayment() {\n setPaymentMode('new')\n setSelectedPaymentId('new')\n setForm((current) => ({ ...current, card: '', expiry: '', cvc: '' }))\n }\n\n function removePayment(paymentId: string) {\n const nextMethods = savedPaymentMethods.filter((item) => item.id !== paymentId)\n setSavedPaymentMethods(nextMethods)\n if (selectedPaymentId !== paymentId) return\n const fallback = nextMethods[0]\n if (fallback) applySavedPayment(fallback)\n else addNewPayment()\n }\n\n function validate(): boolean {\n setError(null)\n if (!form.email.trim() || !/.+@.+\\..+/.test(form.email)) {\n setError('Informe um e-mail válido.')\n return false\n }\n if (!form.name.trim()) {\n setError('Informe seu nome completo.')\n return false\n }\n if (!form.street.trim() || !form.city.trim() || !form.zip.trim()) {\n setError('Preencha ou selecione o endereço de entrega.')\n return false\n }\n if (!/^\\d{16}$/.test(form.card.replace(/\\s+/g, '')) || !form.expiry.trim() || !form.cvc.trim()) {\n setError('Selecione ou preencha um método de pagamento válido.')\n return false\n }\n return true\n }\n\n async function placeOrder() {\n if (!validate()) return\n\n setPlacing(true)\n setProcessingStep(0)\n const stepMs = prefersReducedMotion() ? 120 : 600\n const stepTimers = [\n setTimeout(() => setProcessingStep(1), stepMs),\n setTimeout(() => setProcessingStep(2), stepMs * 2),\n ]\n const minDuration = sleep(stepMs * 2)\n try {\n const { order } = await placeStorefrontOrder({\n config,\n cart,\n session,\n customer: { email: form.email, name: form.name },\n address: { street: form.street, city: form.city, zip: form.zip },\n // Demo only: mock mode instantly approves. Real Pix/Mercado Pago (M4)\n // leaves the order pending until the payment webhook confirms.\n markPaid: config.payments.mode === 'mock',\n })\n\n await minDuration\n cart.clear()\n navigateTo(`/order/${order.id}`)\n } catch (error) {\n setError(error instanceof Error ? error.message : 'Não foi possível concluir o pedido.')\n setPlacing(false)\n } finally {\n stepTimers.forEach(clearTimeout)\n }\n }\n\n const primaryCta = placing ? 'Processando...' : `Comprar agora - ${money(total)}`\n\n return (\n <main className=\"min-h-screen bg-background\">\n {placing && <ProcessingOverlay step={processingStep} />}\n {showSignin && !session.email && (\n <SignInModal\n defaultEmail={form.email}\n onClose={() => setShowSignin(false)}\n onSignedIn={(signed) =>\n setForm((current) => ({ ...current, email: signed.email ?? current.email, name: signed.name || current.name }))\n }\n />\n )}\n <header className=\"border-b bg-background\">\n <div className=\"mx-auto flex max-w-6xl items-center justify-between gap-4 px-4 py-6 sm:px-6\">\n <Link to={config.catalogPath} className=\"text-sm text-muted-foreground hover:text-foreground\">\n Voltar à loja\n </Link>\n <div className=\"text-center\">\n <div className=\"sf-heading text-2xl font-bold tracking-tight\">{config.logo ?? config.name}</div>\n <div className=\"mt-2 flex items-center justify-center gap-2 text-xs text-muted-foreground\">\n <Lock className=\"h-3.5 w-3.5\" />\n Checkout seguro\n </div>\n </div>\n <a href=\"mailto:suporte@example.com\" className=\"text-sm text-muted-foreground hover:text-foreground\">\n Ajuda\n </a>\n </div>\n </header>\n\n <div className=\"mx-auto grid max-w-6xl gap-8 px-4 py-8 sm:px-6 lg:grid-cols-5 lg:px-6\">\n <section className=\"lg:col-span-3 lg:pr-10\">\n <nav className=\"mb-8 flex flex-wrap items-center gap-2 text-sm text-muted-foreground\" aria-label=\"Checkout steps\">\n <span className=\"font-medium text-foreground\">Informações</span>\n <span>/</span>\n <span>Entrega</span>\n <span>/</span>\n <span>Pagamento</span>\n </nav>\n\n <div className=\"space-y-8\">\n <section>\n <div className=\"mb-3 flex items-center justify-between gap-4\">\n <h1 className=\"text-xl font-semibold tracking-tight\">Informações de contato</h1>\n {session.email ? (\n <span className=\"text-sm text-muted-foreground\">Conectado como {session.email}</span>\n ) : (\n <button\n type=\"button\"\n onClick={() => setShowSignin((value) => !value)}\n className=\"text-sm font-medium text-primary hover:underline\"\n >\n Já tem conta? Entrar\n </button>\n )}\n </div>\n <div className=\"grid gap-3 sm:grid-cols-2\">\n {field('E-mail', TID.checkoutEmail, form.email, set('email'), {\n type: 'email',\n placeholder: 'E-mail ou telefone',\n })}\n {field('Nome completo', TID.checkoutName, form.name, set('name'), {\n placeholder: 'Nome completo',\n })}\n </div>\n </section>\n\n <section>\n <h2 className=\"mb-3 text-xl font-semibold tracking-tight\">Endereço de entrega</h2>\n <div className=\"mb-3 grid gap-3\">\n {savedAddresses.map((address) => (\n <div\n key={address.id}\n className={`group relative rounded-lg border p-3 pr-11 text-left text-sm transition hover:bg-muted/40 ${\n selectedAddressId === address.id ? 'border-primary bg-primary/5' : 'border-border bg-background'\n }`}\n >\n <button type=\"button\" onClick={() => selectAddress(address.id)} className=\"block w-full text-left\">\n <span className=\"flex items-center justify-between gap-3 font-semibold\">\n {address.label}\n {addressMode === 'saved' && selectedAddressId === address.id && (\n <span className=\"rounded-full bg-primary/10 px-2 py-0.5 text-[11px] font-bold text-primary\">Selecionado</span>\n )}\n </span>\n <span className=\"mt-1 block text-muted-foreground\">{address.street}</span>\n <span className=\"block text-muted-foreground\">{address.city} - {address.zip}</span>\n </button>\n <button\n type=\"button\"\n onClick={() => removeAddress(address.id)}\n className=\"absolute right-3 top-3 inline-flex h-8 w-8 items-center justify-center rounded-full text-muted-foreground opacity-0 transition hover:bg-destructive/10 hover:text-destructive focus:opacity-100 group-hover:opacity-100\"\n aria-label={`Remover endereço ${address.label}`}\n title=\"Remover endereço\"\n >\n <Trash2 className=\"h-4 w-4\" />\n </button>\n </div>\n ))}\n <button\n type=\"button\"\n onClick={addNewAddress}\n className={`rounded-lg border border-dashed p-3 text-left text-sm transition hover:bg-muted/40 ${\n addressMode === 'new' ? 'border-primary bg-primary/5' : 'border-border bg-muted/20'\n }`}\n >\n <span className=\"block font-semibold text-primary\">+ Adicionar novo endereço</span>\n <span className=\"mt-1 block text-muted-foreground\">Preencher outro endereço para esta compra</span>\n </button>\n </div>\n {addressMode === 'new' && (\n <div className=\"grid gap-3\">\n {field('Endereço', TID.checkoutStreet, form.street, set('street'), { placeholder: 'Endereço' })}\n <div className=\"grid gap-3 sm:grid-cols-[1fr_160px]\">\n {field('Cidade', TID.checkoutCity, form.city, set('city'), { placeholder: 'Cidade' })}\n {field('CEP', TID.checkoutZip, form.zip, set('zip'), { placeholder: 'CEP' })}\n </div>\n </div>\n )}\n </section>\n\n <section>\n <h2 className=\"mb-3 text-xl font-semibold tracking-tight\">Pagamento</h2>\n <div className=\"mb-3 grid gap-3\">\n {savedPaymentMethods.map((method) => (\n <div\n key={method.id}\n className={`group relative rounded-lg border p-3 pr-11 text-left text-sm transition hover:bg-muted/40 ${\n selectedPaymentId === method.id ? 'border-primary bg-primary/5' : 'border-border bg-background'\n }`}\n >\n <button type=\"button\" onClick={() => selectPayment(method.id)} className=\"block w-full text-left\">\n <span className=\"flex items-center justify-between gap-3 font-semibold\">\n <span className=\"flex items-center gap-2\"><CreditCard className=\"h-4 w-4\" />{method.label}</span>\n {paymentMode === 'saved' && selectedPaymentId === method.id && (\n <span className=\"rounded-full bg-primary/10 px-2 py-0.5 text-[11px] font-bold text-primary\">Selecionado</span>\n )}\n </span>\n <span className=\"mt-1 block text-muted-foreground\">Expira em {method.expiry}</span>\n </button>\n <button\n type=\"button\"\n onClick={() => removePayment(method.id)}\n className=\"absolute right-3 top-3 inline-flex h-8 w-8 items-center justify-center rounded-full text-muted-foreground opacity-0 transition hover:bg-destructive/10 hover:text-destructive focus:opacity-100 group-hover:opacity-100\"\n aria-label={`Remover cartão ${method.label}`}\n title=\"Remover cartão\"\n >\n <Trash2 className=\"h-4 w-4\" />\n </button>\n </div>\n ))}\n <button\n type=\"button\"\n onClick={addNewPayment}\n className={`rounded-lg border border-dashed p-3 text-left text-sm transition hover:bg-muted/40 ${\n paymentMode === 'new' ? 'border-primary bg-primary/5' : 'border-border bg-muted/20'\n }`}\n >\n <span className=\"flex items-center gap-2 font-semibold text-primary\"><CreditCard className=\"h-4 w-4\" />+ Adicionar novo cartão</span>\n <span className=\"mt-1 block text-muted-foreground\">Usar outro cartão nesta compra</span>\n </button>\n </div>\n {paymentMode === 'new' && (\n <div className=\"grid gap-3\">\n {field('Número do cartão', TID.checkoutCard, form.card, set('card'), {\n placeholder: 'Número do cartão',\n inputMode: 'numeric',\n })}\n <div className=\"grid gap-3 sm:grid-cols-2\">\n {field('Validade', TID.checkoutExpiry, form.expiry, set('expiry'), { placeholder: 'MM/AA' })}\n {field('CVC', TID.checkoutCvc, form.cvc, set('cvc'), { placeholder: 'CVC', inputMode: 'numeric' })}\n </div>\n </div>\n )}\n <p className=\"mt-2 text-xs text-muted-foreground\">Pagamento de demonstração - nenhuma cobrança é feita.</p>\n </section>\n\n {error && (\n <p data-testid={TID.checkoutError} className=\"rounded-lg border border-destructive/30 bg-destructive/5 px-3 py-2 text-sm text-destructive\">\n {error}\n </p>\n )}\n\n </div>\n\n <footer className=\"mt-10 flex flex-wrap gap-4 border-t pt-5 text-xs text-muted-foreground\">\n <a href=\"#/privacy\" className=\"hover:text-foreground\">Privacidade</a>\n <a href=\"#/terms\" className=\"hover:text-foreground\">Termos</a>\n <a href=\"#/refunds\" className=\"hover:text-foreground\">Trocas e devoluções</a>\n </footer>\n </section>\n\n <aside className=\"rounded-xl border bg-muted/20 p-5 lg:sticky lg:top-6 lg:col-span-2 lg:self-start\">\n <h2 className=\"sr-only\">Resumo do pedido</h2>\n <ul className=\"space-y-4\">\n {cart.lines.map((line) => (\n <li key={line.lineId ?? line.productId} className=\"flex gap-3 text-sm\">\n <div className=\"relative h-16 w-16 flex-none overflow-hidden rounded-lg border bg-background\">\n {line.imageUrl && <img src={line.imageUrl} alt={line.name} className=\"h-full w-full object-cover\" />}\n <span className=\"absolute -right-1 -top-1 flex h-5 min-w-5 items-center justify-center rounded-full bg-muted-foreground px-1.5 text-[10px] font-bold text-background\">\n {line.quantity}\n </span>\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate font-medium\">{line.name}</p>\n {line.sku && <p className=\"text-xs text-muted-foreground\">{line.sku}</p>}\n {line.optionsLabel && <p className=\"text-xs text-muted-foreground\">{line.optionsLabel}</p>}\n </div>\n <span data-price={(line.unitPrice * line.quantity).toFixed(2)}>\n {money(line.unitPrice * line.quantity)}\n </span>\n </li>\n ))}\n </ul>\n {config.features.discounts && (\n <div className=\"mt-5 space-y-2 border-t pt-5\">\n <div className=\"flex gap-2\">\n <input\n data-testid={TID.discountInput}\n type=\"text\"\n placeholder=\"Cupom de desconto\"\n value={discountCode}\n onChange={(event) => {\n setDiscountCode(event.target.value)\n setDiscountSuccess(null)\n setDiscountError(null)\n }}\n className=\"min-w-0 flex-1 rounded-lg border bg-background px-3 py-2 text-sm uppercase\"\n />\n <button\n type=\"button\"\n data-testid={TID.discountApply}\n onClick={applyDiscountCode}\n disabled={applyingDiscount || !discountCode.trim()}\n className=\"rounded-lg border px-3 py-2 text-sm font-semibold hover:bg-muted disabled:opacity-50\"\n >\n Aplicar\n </button>\n </div>\n {discountError && (\n <p data-testid={TID.discountError} className=\"text-xs text-destructive\">\n {discountError}\n </p>\n )}\n {discountSuccess && (\n <p className=\"text-xs font-semibold text-emerald-700\">\n {discountSuccess}\n </p>\n )}\n </div>\n )}\n <dl className=\"mt-8 space-y-3 border-t pt-6 text-sm\">\n <div className=\"flex justify-between\">\n <dt className=\"text-muted-foreground\">Subtotal</dt>\n <dd data-price={subtotal.toFixed(2)}>{money(subtotal)}</dd>\n </div>\n {discountTotal > 0 && (\n <div className=\"flex justify-between text-emerald-700\" data-testid={TID.discountRow}>\n <dt>\n Desconto{' '}\n <button\n type=\"button\"\n onClick={clearDiscountCode}\n className=\"text-xs text-muted-foreground underline\"\n >\n ({cart.discountCode} ×)\n </button>\n </dt>\n <dd data-price={discountTotal.toFixed(2)}>-{money(discountTotal)}</dd>\n </div>\n )}\n <div className=\"flex justify-between\">\n <dt className=\"text-muted-foreground\">Entrega</dt>\n <dd data-price={shipping.toFixed(2)}>{shipping === 0 ? 'Grátis' : money(shipping)}</dd>\n </div>\n <div className=\"flex justify-between border-t pt-5 text-lg font-bold\">\n <dt>Total</dt>\n <dd data-price={total.toFixed(2)}>{money(total)}</dd>\n </div>\n </dl>\n <div className=\"mt-6 flex items-center gap-2 text-xs text-muted-foreground\">\n <ShieldCheck className=\"h-4 w-4 text-primary\" />\n Compra protegida e dados criptografados.\n </div>\n <div className=\"mt-6 grid gap-3 border-t pt-5\">\n <button\n type=\"button\"\n data-testid={TID.placeOrder}\n onClick={placeOrder}\n disabled={placing}\n className=\"rounded-lg bg-primary px-6 py-4 text-sm font-bold text-primary-foreground transition hover:opacity-90 disabled:opacity-60\"\n >\n {primaryCta}\n </button>\n <Link to={config.catalogPath} className=\"text-center text-sm text-muted-foreground hover:text-foreground\">\n Voltar ao carrinho\n </Link>\n </div>\n </aside>\n </div>\n </main>\n )\n}\n","import React from 'react'\nimport { CreditCard, LogOut, MapPin, Package, ShieldCheck, User } from 'lucide-react'\nimport { signOutCustomer } from '../auth'\nimport { useStorefrontConfig } from '../config'\nimport { Link } from '../router'\nimport { useSessionStore } from '../stores/session.store'\nimport { TID } from '../testids'\n\nexport type AccountSection = 'profile' | 'orders' | 'addresses' | 'payments'\n\ninterface CustomerAccountShellProps {\n title: string\n subtitle?: string\n active: AccountSection\n /** Switch the active section in-place. */\n onSelect?: (section: AccountSection) => void\n children: React.ReactNode\n}\n\nconst menuItems = [\n { id: 'profile', label: 'Perfil', icon: User },\n { id: 'orders', label: 'Meus pedidos', icon: Package },\n { id: 'addresses', label: 'Endereços', icon: MapPin },\n { id: 'payments', label: 'Pagamentos', icon: CreditCard },\n] as const\n\nexport function CustomerAccountShell({ title, subtitle, active, onSelect, children }: CustomerAccountShellProps) {\n const config = useStorefrontConfig()\n const session = useSessionStore()\n const displayName = session.name || session.email?.split('@')[0] || 'Cliente'\n const displayEmail = session.email || 'Conta criada no checkout'\n\n return (\n <main data-testid={TID.customerAccountShell} className=\"mx-auto max-w-6xl px-4 py-8 sm:px-6\">\n <div className=\"mb-6 flex flex-wrap items-center justify-between gap-4\">\n <div>\n <p className=\"text-sm font-medium text-muted-foreground\">{config.name}</p>\n <h1 className=\"sf-heading text-3xl font-bold tracking-tight\">{title}</h1>\n {subtitle && <p className=\"mt-1 text-sm text-muted-foreground\">{subtitle}</p>}\n </div>\n <Link to={config.catalogPath} className=\"rounded-lg border px-4 py-2 text-sm font-semibold hover:bg-muted\">\n Voltar à loja\n </Link>\n </div>\n\n <div className=\"grid gap-6 lg:grid-cols-[260px_minmax(0,1fr)]\">\n <aside className=\"h-fit rounded-xl border bg-card p-4\">\n <div className=\"flex items-center gap-3 border-b pb-4\">\n <div className=\"flex h-11 w-11 items-center justify-center rounded-full bg-primary/10 font-bold text-primary\">\n {displayName.slice(0, 1).toUpperCase()}\n </div>\n <div className=\"min-w-0\">\n <p className=\"truncate font-semibold\">{displayName}</p>\n <p className=\"truncate text-xs text-muted-foreground\">{displayEmail}</p>\n </div>\n </div>\n\n <nav data-testid={TID.customerAccountMenu} className=\"mt-4 space-y-1\" aria-label=\"Área do cliente\">\n {menuItems.map((item) => {\n const Icon = item.icon\n const selected = item.id === active\n return (\n <button\n key={item.id}\n type=\"button\"\n aria-current={selected ? 'page' : undefined}\n onClick={() => onSelect?.(item.id)}\n className={`flex w-full items-center gap-3 rounded-lg px-3 py-2.5 text-left text-sm font-semibold transition ${\n selected ? 'bg-primary/10 text-primary' : 'text-muted-foreground hover:bg-muted hover:text-foreground'\n }`}\n >\n <Icon className=\"h-4 w-4\" />\n {item.label}\n </button>\n )\n })}\n </nav>\n\n <div className=\"mt-4 rounded-lg bg-muted/40 p-3 text-xs text-muted-foreground\">\n <div className=\"flex items-center gap-2 font-semibold text-foreground\">\n <ShieldCheck className=\"h-4 w-4 text-primary\" />\n Conta protegida\n </div>\n <p className=\"mt-1\">Pedidos, pagamentos e endereços ficam organizados para próximas compras.</p>\n </div>\n\n <button\n type=\"button\"\n data-testid={TID.signout}\n onClick={() => void signOutCustomer()}\n className=\"mt-4 flex w-full items-center gap-3 rounded-lg px-3 py-2.5 text-sm font-semibold text-muted-foreground transition hover:bg-muted hover:text-foreground\"\n >\n <LogOut className=\"h-4 w-4\" />\n Sair\n </button>\n </aside>\n\n <section className=\"min-w-0\">{children}</section>\n </div>\n </main>\n )\n}\n","import type { FinancialStatus } from '@fayz-ai/shop/types'\n\ntype Tone = 'positive' | 'pending' | 'negative'\n\nconst FINANCIAL: Record<FinancialStatus, { label: string; tone: Tone }> = {\n pending: { label: 'Pendente', tone: 'pending' },\n paid: { label: 'Pago', tone: 'positive' },\n partially_paid: { label: 'Parcialmente pago', tone: 'pending' },\n partially_refunded: { label: 'Parcialmente reembolsado', tone: 'negative' },\n refunded: { label: 'Reembolsado', tone: 'negative' },\n voided: { label: 'Cancelado', tone: 'negative' },\n}\n\nconst TONE_CLASS: Record<Tone, string> = {\n positive: 'bg-emerald-100 text-emerald-800',\n pending: 'bg-amber-100 text-amber-800',\n negative: 'bg-rose-100 text-rose-800',\n}\n\n/** One source of truth for a financial-status pill — label + color by status,\n * so a pending or refunded order never renders inside a green \"success\" pill. */\nexport function financialStatusBadge(status: FinancialStatus): { label: string; className: string } {\n const entry = FINANCIAL[status] ?? { label: status, tone: 'pending' as Tone }\n return { label: entry.label, className: TONE_CLASS[entry.tone] }\n}\n\nexport function isPaid(status: FinancialStatus): boolean {\n return status === 'paid' || status === 'partially_paid'\n}\n\nexport function isRefunded(status: FinancialStatus): boolean {\n return status === 'refunded' || status === 'partially_refunded'\n}\n","import React from 'react'\nimport { Check, Clock, PackageCheck, RotateCcw, Truck, XCircle } from 'lucide-react'\nimport type { Order } from '@fayz-ai/shop/types'\nimport { isPaid, isRefunded } from '../order-status'\nimport { TID } from '../testids'\n\ntype TrackingState = 'complete' | 'current' | 'pending' | 'cancelled'\n\ninterface TrackingStep {\n id: string\n label: string\n description: string\n state: TrackingState\n icon: React.ComponentType<{ className?: string }>\n}\n\nfunction orderTrackingSteps(order: Order): TrackingStep[] {\n const received: TrackingStep = {\n id: 'received',\n label: 'Pedido recebido',\n description: `#${order.orderNumber}`,\n state: 'complete',\n icon: Check,\n }\n\n // Terminal states short-circuit the happy path.\n if (order.status === 'cancelled' || order.financialStatus === 'voided') {\n return [\n received,\n { id: 'payment', label: 'Pedido cancelado', description: 'Este pedido foi cancelado', state: 'cancelled', icon: XCircle },\n ]\n }\n if (isRefunded(order.financialStatus)) {\n return [\n received,\n { id: 'payment', label: 'Pagamento aprovado', description: 'Compra confirmada', state: 'complete', icon: Check },\n {\n id: 'refund',\n label: order.financialStatus === 'refunded' ? 'Reembolsado' : 'Reembolso parcial',\n description: 'Valor devolvido ao cliente',\n state: 'cancelled',\n icon: RotateCcw,\n },\n ]\n }\n\n const paid = isPaid(order.financialStatus)\n const partiallyFulfilled = order.fulfillmentStatus === 'partially_fulfilled'\n const fulfilled = order.fulfillmentStatus === 'fulfilled'\n\n return [\n received,\n {\n id: 'payment',\n label: paid ? 'Pagamento aprovado' : 'Aguardando pagamento',\n description: paid ? 'Compra confirmada' : 'Processando',\n state: paid ? 'complete' : 'current',\n icon: Check,\n },\n {\n id: 'preparing',\n label: 'Preparando envio',\n description: paid ? 'Separando produtos' : 'Começa após o pagamento',\n state: fulfilled || partiallyFulfilled ? 'complete' : paid ? 'current' : 'pending',\n icon: PackageCheck,\n },\n {\n id: 'delivery',\n label: fulfilled ? 'Pedido enviado' : partiallyFulfilled ? 'Envio parcial' : 'Entrega',\n description: fulfilled ? 'A caminho do cliente' : partiallyFulfilled ? 'Parte do pedido saiu' : 'Próxima etapa',\n state: fulfilled ? 'complete' : partiallyFulfilled ? 'current' : 'pending',\n icon: fulfilled || partiallyFulfilled ? Truck : Clock,\n },\n ]\n}\n\nconst GRID_COLS: Record<number, string> = {\n 2: 'sm:grid-cols-2',\n 3: 'sm:grid-cols-3',\n 4: 'sm:grid-cols-4',\n}\n\nexport function OrderTrackingTimeline({ order, compact = false }: { order: Order; compact?: boolean }) {\n const steps = orderTrackingSteps(order)\n\n return (\n <ol\n data-testid={TID.orderTracking}\n className={`grid ${compact ? 'gap-2' : 'gap-3'} ${GRID_COLS[steps.length] ?? 'sm:grid-cols-4'}`}\n aria-label=\"Acompanhamento do pedido\"\n >\n {steps.map((step) => {\n const Icon = step.icon\n const cancelled = step.state === 'cancelled'\n const active = step.state !== 'pending'\n return (\n <li\n key={step.id}\n data-testid={TID.orderTrackingStep(step.id)}\n data-state={step.state}\n className={[\n 'relative min-w-0 rounded-xl border p-3',\n cancelled\n ? 'border-rose-200 bg-rose-50 text-rose-700'\n : active\n ? 'border-primary/35 bg-primary/5'\n : 'bg-muted/20 text-muted-foreground',\n compact ? 'text-xs' : 'text-sm',\n ].join(' ')}\n >\n <div className=\"flex items-start gap-2\">\n <span\n className={[\n 'grid h-7 w-7 shrink-0 place-items-center rounded-full border',\n cancelled\n ? 'border-rose-300 bg-rose-500 text-white'\n : active\n ? 'border-primary bg-primary text-primary-foreground'\n : 'border-muted-foreground/30 bg-background',\n ].join(' ')}\n aria-hidden\n >\n <Icon className=\"h-3.5 w-3.5\" />\n </span>\n <span className=\"min-w-0\">\n <span className=\"block truncate font-semibold text-foreground\">{step.label}</span>\n <span className=\"mt-0.5 block truncate text-muted-foreground\">{step.description}</span>\n </span>\n </div>\n </li>\n )\n })}\n </ol>\n )\n}\n","import React, { useEffect, useState } from 'react'\nimport { getShopProvider } from '@fayz-ai/shop/runtime'\nimport { prefersReducedMotion } from '../motion'\nimport type { Order } from '@fayz-ai/shop/types'\nimport { useStorefrontConfig } from '../config'\nimport { Link } from '../router'\nimport { formatMoney } from '../format'\nimport { TID } from '../testids'\nimport { CustomerAccountShell } from '../components/CustomerAccountShell'\nimport { OrderTrackingTimeline } from '../components/OrderTrackingTimeline'\nimport { financialStatusBadge } from '../order-status'\nimport { useStorefrontHead } from '../hooks/useStorefrontHead'\n\nconst CONFETTI_COLORS = ['hsl(var(--primary))', '#f59e0b', '#10b981', '#3b82f6', '#ec4899']\n\n/** One-shot celebration: circle pops in, check draws itself, confetti rains. */\nfunction SuccessMark() {\n const reduced = prefersReducedMotion()\n return (\n <div className=\"relative mx-auto h-24 w-24\">\n {!reduced &&\n Array.from({ length: 14 }, (_, i) => (\n <span\n key={i}\n aria-hidden\n className=\"absolute h-2 w-2 animate-confetti-fall rounded-sm\"\n style={{\n left: `${(i * 7.3) % 100}%`,\n top: '-4px',\n backgroundColor: CONFETTI_COLORS[i % CONFETTI_COLORS.length],\n animationDelay: `${200 + (i % 7) * 90}ms`,\n }}\n />\n ))}\n <span className={`absolute inset-0 rounded-full bg-emerald-100 ${reduced ? '' : 'animate-pop-in'}`} />\n <svg viewBox=\"0 0 48 48\" className=\"absolute inset-0 h-full w-full p-6\" aria-hidden>\n <path\n d=\"M10 25 L20 35 L38 14\"\n fill=\"none\"\n stroke=\"rgb(5 150 105)\"\n strokeWidth=\"5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeDasharray=\"48\"\n className={reduced ? '' : 'animate-draw-check'}\n />\n </svg>\n </div>\n )\n}\n\nexport function OrderConfirmationPage({ orderId }: { orderId: string }) {\n const config = useStorefrontConfig()\n const [order, setOrder] = useState<Order | null>(null)\n const [loading, setLoading] = useState(true)\n const money = (v: number) => formatMoney(v, config.currency, config.locale)\n useStorefrontHead({ title: order ? `Pedido #${order.orderNumber} — ${config.name}` : config.name })\n\n useEffect(() => {\n let cancelled = false\n getShopProvider()\n .getOrder(orderId)\n .then((o) => {\n if (!cancelled) setOrder(o)\n })\n .finally(() => {\n if (!cancelled) setLoading(false)\n })\n return () => {\n cancelled = true\n }\n }, [orderId])\n\n if (loading) {\n return <main className=\"mx-auto max-w-2xl px-4 py-20 text-center text-muted-foreground\">Carregando…</main>\n }\n if (!order) {\n return (\n <main className=\"mx-auto max-w-2xl px-4 py-20 text-center\">\n <p className=\"text-muted-foreground\">Pedido não encontrado.</p>\n <Link to=\"/\" className=\"mt-4 inline-block text-primary underline\">Voltar à loja</Link>\n </main>\n )\n }\n\n return (\n <CustomerAccountShell\n title=\"Detalhe do pedido\"\n subtitle=\"Compra confirmada e vinculada à sua conta.\"\n active=\"orders\"\n >\n <article data-testid={TID.orderDetail} className=\"animate-fade-up rounded-xl border bg-card p-6 sm:p-8\">\n <div className=\"grid gap-6 border-b pb-6 sm:grid-cols-[120px_minmax(0,1fr)]\">\n <SuccessMark />\n <div className=\"text-center sm:text-left\">\n <h2 className=\"sf-heading text-3xl font-bold tracking-tight\">\n Pedido confirmado!\n </h2>\n <p className=\"mt-1 text-muted-foreground\">\n Obrigado pela compra, {order.customerName ?? 'cliente'}. Enviamos a confirmação para {order.customerEmail}.\n </p>\n <p className=\"mt-4 text-lg\">\n Pedido <span data-testid={TID.orderNumber} className=\"font-semibold\">#{order.orderNumber}</span>{' '}\n <span\n data-testid={TID.orderStatus}\n className={`ml-2 inline-flex rounded-full px-2.5 py-0.5 text-sm font-medium ${financialStatusBadge(order.financialStatus).className}`}\n >\n {financialStatusBadge(order.financialStatus).label}\n </span>\n </p>\n </div>\n </div>\n\n <div className=\"mt-6 grid gap-4 rounded-xl border bg-muted/20 p-4 text-sm sm:grid-cols-3\">\n <div>\n <p className=\"text-muted-foreground\">Cliente</p>\n <p className=\"mt-1 font-semibold\">{order.customerName ?? 'Cliente'}</p>\n <p className=\"text-muted-foreground\">{order.customerEmail}</p>\n </div>\n <div>\n <p className=\"text-muted-foreground\">Entrega</p>\n <p className=\"mt-1 font-semibold\">{order.fulfillmentStatus === 'fulfilled' ? 'Enviado' : 'Preparando envio'}</p>\n <p className=\"text-muted-foreground\">{order.notes ?? 'Endereço salvo no pedido'}</p>\n </div>\n <div>\n <p className=\"text-muted-foreground\">Pagamento</p>\n <p className=\"mt-1 font-semibold\">{financialStatusBadge(order.financialStatus).label}</p>\n <p className=\"text-muted-foreground\">Processado no checkout</p>\n </div>\n </div>\n\n <div className=\"mt-6\">\n <h3 className=\"mb-3 text-sm font-semibold uppercase text-muted-foreground\">\n Acompanhamento\n </h3>\n <OrderTrackingTimeline order={order} />\n </div>\n\n <ul className=\"mt-8 space-y-3 text-left\">\n {order.items.map((item) => (\n <li key={item.id} className=\"flex items-center gap-3 text-sm\">\n {item.imageUrl && <img src={item.imageUrl} alt={item.name} className=\"h-12 w-12 rounded-lg border object-cover\" />}\n <span className=\"flex-1\">\n {item.name} <span className=\"text-muted-foreground\">× {item.quantity}</span>\n </span>\n <span data-price={item.total.toFixed(2)}>{money(item.total)}</span>\n </li>\n ))}\n </ul>\n\n <dl className=\"mt-4 space-y-1.5 border-t pt-4 text-left text-sm\">\n <div className=\"flex justify-between\">\n <dt className=\"text-muted-foreground\">Subtotal</dt>\n <dd data-price={order.subtotal.toFixed(2)}>{money(order.subtotal)}</dd>\n </div>\n {order.discountTotal > 0 && (\n <div className=\"flex justify-between text-emerald-700\">\n <dt>Desconto {order.discountCode ? `(${order.discountCode})` : ''}</dt>\n <dd data-price={order.discountTotal.toFixed(2)}>−{money(order.discountTotal)}</dd>\n </div>\n )}\n <div className=\"flex justify-between\">\n <dt className=\"text-muted-foreground\">Frete</dt>\n <dd data-price={order.shippingTotal.toFixed(2)}>\n {order.shippingTotal === 0 ? 'Grátis' : money(order.shippingTotal)}\n </dd>\n </div>\n <div className=\"flex justify-between border-t pt-2 text-base font-semibold\">\n <dt>Total</dt>\n <dd data-testid={TID.orderTotal} data-price={order.total.toFixed(2)}>{money(order.total)}</dd>\n </div>\n </dl>\n\n <div className=\"mt-8 flex flex-wrap gap-3\">\n <Link\n to=\"/account\"\n data-testid={TID.viewPurchases}\n className=\"rounded-xl bg-primary px-5 py-2.5 font-semibold text-primary-foreground hover:opacity-90\"\n >\n Minhas compras\n </Link>\n <Link to=\"/\" className=\"rounded-xl border px-5 py-2.5 font-semibold hover:bg-muted\">\n Continuar comprando\n </Link>\n </div>\n </article>\n </CustomerAccountShell>\n )\n}\n","import { useCallback, useEffect, useState } from 'react'\nimport { getShopProvider } from '@fayz-ai/shop/runtime'\nimport type { Order } from '@fayz-ai/shop/types'\nimport { useSessionStore } from '../stores/session.store'\n\nexport function useMyOrders(): { orders: Order[]; loading: boolean; refresh: () => void } {\n const customerId = useSessionStore((s) => s.customerId)\n const email = useSessionStore((s) => s.email)\n const [orders, setOrders] = useState<Order[]>([])\n const [loading, setLoading] = useState(true)\n const [tick, setTick] = useState(0)\n\n const refresh = useCallback(() => setTick((t) => t + 1), [])\n\n useEffect(() => {\n let cancelled = false\n if (!customerId && !email) {\n setOrders([])\n setLoading(false)\n return\n }\n setLoading(true)\n // Scope by customerId (RLS-enforced to the owner on Supabase) when available;\n // fall back to email only for legacy sessions without a linked customer.\n const query = customerId ? { customerId, limit: 50 } : { customerEmail: email!, limit: 50 }\n getShopProvider()\n .listOrders(query)\n .then((data) => {\n if (!cancelled) setOrders(data)\n })\n .catch(() => {})\n .finally(() => {\n if (!cancelled) setLoading(false)\n })\n return () => {\n cancelled = true\n }\n }, [customerId, email, tick])\n\n return { orders, loading, refresh }\n}\n","import React, { useState } from 'react'\nimport { CreditCard, MapPin, Package, QrCode } from 'lucide-react'\nimport { getShopProvider } from '@fayz-ai/shop/runtime'\nimport { useSessionStore } from '../stores/session.store'\nimport { establishCustomerSession, signUpCustomer } from '../auth'\nimport { useMyOrders } from '../hooks/useMyOrders'\nimport { useStorefrontConfig } from '../config'\nimport { Link } from '../router'\nimport { formatMoney } from '../format'\nimport { TID } from '../testids'\nimport { CustomerAccountShell, type AccountSection } from '../components/CustomerAccountShell'\nimport { OrderTrackingTimeline } from '../components/OrderTrackingTimeline'\nimport { financialStatusBadge } from '../order-status'\nimport { useStorefrontHead } from '../hooks/useStorefrontHead'\n\nfunction AuthForm() {\n const [mode, setMode] = useState<'signin' | 'signup'>('signin')\n const [email, setEmail] = useState('')\n const [password, setPassword] = useState('')\n const [name, setName] = useState('')\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n async function submit(e: React.FormEvent) {\n e.preventDefault()\n setError(null)\n if (!email.trim() || !password) return\n if (mode === 'signup' && !name.trim()) {\n setError('Informe seu nome.')\n return\n }\n setBusy(true)\n try {\n if (mode === 'signup') await signUpCustomer(email, password, name.trim())\n else await establishCustomerSession(email, { password })\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Não foi possível entrar. Verifique seus dados.')\n } finally {\n setBusy(false)\n }\n }\n\n const tab = (id: 'signin' | 'signup', label: string, testId: string) => (\n <button\n type=\"button\"\n data-testid={testId}\n onClick={() => {\n setMode(id)\n setError(null)\n }}\n className={`flex-1 border-b-2 pb-2.5 text-sm font-semibold transition-colors ${\n mode === id ? 'border-primary text-primary' : 'border-transparent text-muted-foreground hover:text-foreground'\n }`}\n >\n {label}\n </button>\n )\n\n return (\n <div className=\"mx-auto max-w-sm animate-fade-up border bg-card p-7\" style={{ borderRadius: 'var(--sf-radius-card)' }}>\n <h2 className=\"sf-heading text-xl font-semibold\">Minha conta</h2>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n Acompanhe pedidos e acelere seus próximos checkouts.\n </p>\n <div className=\"mt-5 flex gap-2\">\n {tab('signin', 'Entrar', TID.authTabSignin)}\n {tab('signup', 'Criar conta', TID.authTabSignup)}\n </div>\n <form className=\"mt-5 space-y-3\" onSubmit={submit}>\n {mode === 'signup' && (\n <input\n data-testid={TID.signinName}\n type=\"text\"\n required\n placeholder=\"Nome completo\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n className=\"w-full border bg-background px-3 py-2.5 text-sm\"\n style={{ borderRadius: 'var(--sf-radius-input)' }}\n />\n )}\n <input\n data-testid={TID.signinEmail}\n type=\"email\"\n required\n placeholder=\"voce@exemplo.com\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n className=\"w-full border bg-background px-3 py-2.5 text-sm\"\n style={{ borderRadius: 'var(--sf-radius-input)' }}\n />\n <input\n data-testid={TID.signinPassword}\n type=\"password\"\n required\n placeholder=\"Senha\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n className=\"w-full border bg-background px-3 py-2.5 text-sm\"\n style={{ borderRadius: 'var(--sf-radius-input)' }}\n />\n {error && (\n <p data-testid={TID.authError} className=\"text-sm text-destructive\">{error}</p>\n )}\n <button\n type=\"submit\"\n data-testid={TID.signinSubmit}\n disabled={busy}\n className=\"sf-cta w-full bg-primary py-3 font-semibold text-primary-foreground shadow-md transition-all hover:-translate-y-0.5 hover:shadow-lg disabled:opacity-60\"\n style={{ borderRadius: 'var(--sf-radius-button)' }}\n >\n {busy ? 'Entrando…' : mode === 'signup' ? 'Criar conta' : 'Entrar'}\n </button>\n </form>\n </div>\n )\n}\n\nfunction OrdersPanel() {\n const config = useStorefrontConfig()\n const { orders, loading } = useMyOrders()\n const money = (v: number) => formatMoney(v, config.currency, config.locale)\n\n if (loading) return <div className=\"py-16 text-center text-muted-foreground\">Carregando…</div>\n if (orders.length === 0) {\n return (\n <div data-testid={TID.purchasesEmpty} className=\"rounded-2xl border bg-card py-16 text-center\">\n <Package className=\"mx-auto h-10 w-10 text-muted-foreground\" />\n <p className=\"mt-3 text-muted-foreground\">Você ainda não tem pedidos.</p>\n <Link to=\"/\" className=\"mt-4 inline-block text-primary underline\">Explorar a loja</Link>\n </div>\n )\n }\n return (\n <ul data-testid={TID.purchasesList} className=\"space-y-4\">\n {orders.map((order) => (\n <li\n key={order.id}\n data-testid={TID.purchaseItem}\n data-order-number={order.orderNumber}\n className=\"rounded-2xl border bg-card p-5\"\n >\n <div className=\"flex items-center justify-between\">\n <span className=\"font-semibold\">Pedido #{order.orderNumber}</span>\n <span className={`inline-flex rounded-full px-2.5 py-0.5 text-xs font-medium ${financialStatusBadge(order.financialStatus).className}`}>\n {financialStatusBadge(order.financialStatus).label}\n </span>\n </div>\n <p className=\"mt-0.5 text-xs text-muted-foreground\">\n {new Date(order.createdAt).toLocaleDateString(config.locale)}\n </p>\n <div className=\"mt-4\">\n <OrderTrackingTimeline order={order} compact />\n </div>\n <ul className=\"mt-3 flex flex-wrap gap-2\">\n {order.items.map((item) => (\n <li key={item.id} className=\"flex items-center gap-2 rounded-lg border px-2 py-1 text-xs\">\n {item.imageUrl && <img src={item.imageUrl} alt={item.name} className=\"h-6 w-6 rounded object-cover\" />}\n {item.name} × {item.quantity}\n </li>\n ))}\n </ul>\n <div className=\"mt-3 flex items-center justify-between border-t pt-3 text-sm\">\n <Link to={`/order/${order.id}`} className=\"font-medium text-primary hover:underline\">\n Ver detalhes\n </Link>\n <span>\n <span className=\"mr-2 text-muted-foreground\">Total</span>\n <span className=\"font-semibold\" data-price={order.total.toFixed(2)}>{money(order.total)}</span>\n </span>\n </div>\n </li>\n ))}\n </ul>\n )\n}\n\nfunction ProfilePanel() {\n const session = useSessionStore()\n const [name, setName] = useState(session.name ?? '')\n const [saving, setSaving] = useState(false)\n const [saved, setSaved] = useState(false)\n\n async function save(e: React.FormEvent) {\n e.preventDefault()\n const trimmed = name.trim()\n if (!trimmed) return\n setSaving(true)\n setSaved(false)\n try {\n if (session.customerId) {\n const parts = trimmed.split(/\\s+/).filter(Boolean)\n await getShopProvider().updateCustomer(session.customerId, {\n firstName: parts[0] ?? trimmed,\n lastName: parts.slice(1).join(' '),\n })\n }\n useSessionStore.setState({ name: trimmed })\n setSaved(true)\n } finally {\n setSaving(false)\n }\n }\n\n return (\n <form onSubmit={save} className=\"max-w-md rounded-2xl border bg-card p-6\">\n <h2 className=\"sf-heading text-lg font-semibold\">Perfil</h2>\n <p className=\"mt-1 text-sm text-muted-foreground\">Seus dados para os próximos checkouts.</p>\n <label className=\"mt-5 block text-sm font-medium\">\n Nome completo\n <input\n value={name}\n onChange={(e) => { setName(e.target.value); setSaved(false) }}\n className=\"mt-1 w-full rounded-lg border bg-background px-3 py-2.5 text-sm\"\n placeholder=\"Seu nome\"\n />\n </label>\n <label className=\"mt-4 block text-sm font-medium\">\n E-mail\n <input\n value={session.email ?? ''}\n readOnly\n className=\"mt-1 w-full cursor-not-allowed rounded-lg border bg-muted/40 px-3 py-2.5 text-sm text-muted-foreground\"\n />\n </label>\n <div className=\"mt-5 flex items-center gap-3\">\n <button\n type=\"submit\"\n disabled={saving}\n className=\"sf-cta rounded-lg bg-primary px-5 py-2.5 text-sm font-semibold text-primary-foreground disabled:opacity-60\"\n >\n {saving ? 'Salvando…' : 'Salvar'}\n </button>\n {saved && <span className=\"text-sm font-medium text-emerald-700\">Salvo</span>}\n </div>\n </form>\n )\n}\n\nfunction AddressesPanel() {\n return (\n <div className=\"rounded-2xl border bg-card p-6\">\n <div className=\"flex items-center gap-2\">\n <MapPin className=\"h-5 w-5 text-primary\" />\n <h2 className=\"sf-heading text-lg font-semibold\">Endereços</h2>\n </div>\n <p className=\"mt-2 text-sm text-muted-foreground\">\n Você informa o endereço de entrega no checkout. Em breve será possível salvar endereços para reutilizar\n nas próximas compras.\n </p>\n <Link to=\"/\" className=\"mt-4 inline-block text-sm font-semibold text-primary underline\">\n Continuar comprando\n </Link>\n </div>\n )\n}\n\nfunction PaymentsPanel() {\n return (\n <div className=\"rounded-2xl border bg-card p-6\">\n <div className=\"flex items-center gap-2\">\n <CreditCard className=\"h-5 w-5 text-primary\" />\n <h2 className=\"sf-heading text-lg font-semibold\">Pagamentos</h2>\n </div>\n <p className=\"mt-2 text-sm text-muted-foreground\">\n Os pagamentos são processados com segurança no checkout — nenhum dado de pagamento fica salvo nesta conta.\n </p>\n <div className=\"mt-4 flex items-center gap-2 rounded-lg bg-muted/40 px-3 py-2.5 text-sm\">\n <QrCode className=\"h-4 w-4 text-primary\" />\n <span>Pix e cartão via Mercado Pago no momento da compra.</span>\n </div>\n </div>\n )\n}\n\nconst SECTION_SUBTITLE: Record<AccountSection, string> = {\n profile: 'Seus dados de contato.',\n orders: 'Acompanhe seus pedidos e entregas.',\n addresses: 'Endereços de entrega.',\n payments: 'Como você paga na loja.',\n}\n\nexport function MyPurchasesPage() {\n const config = useStorefrontConfig()\n const session = useSessionStore()\n const [section, setSection] = useState<AccountSection>('orders')\n useStorefrontHead({ title: `Minha conta — ${config.name}` })\n\n if (!session.email) {\n return (\n <main className=\"mx-auto max-w-3xl px-4 py-12 sm:px-6\">\n <AuthForm />\n </main>\n )\n }\n\n return (\n <CustomerAccountShell\n title=\"Minha conta\"\n subtitle={SECTION_SUBTITLE[section]}\n active={section}\n onSelect={setSection}\n >\n {section === 'profile' && <ProfilePanel />}\n {section === 'orders' && <OrdersPanel />}\n {section === 'addresses' && <AddressesPanel />}\n {section === 'payments' && <PaymentsPanel />}\n </CustomerAccountShell>\n )\n}\n","import React from 'react'\nimport { Link } from '../router'\nimport { useStorefrontConfig } from '../config'\nimport { useStorefrontHead } from '../hooks/useStorefrontHead'\n\n/** Fallback for unknown routes. Previously these silently rendered the home/catalog page with a 200. */\nexport function NotFoundPage() {\n const config = useStorefrontConfig()\n useStorefrontHead({ title: `Página não encontrada — ${config.name}` })\n return (\n <main className=\"mx-auto flex min-h-[60vh] max-w-2xl flex-col items-center justify-center px-4 py-16 text-center\">\n <p className=\"sf-heading text-5xl font-bold tracking-tight text-primary\">404</p>\n <h1 className=\"mt-3 text-xl font-semibold\">Página não encontrada</h1>\n <p className=\"mt-2 text-sm text-muted-foreground\">\n O endereço que você tentou acessar não existe ou foi movido.\n </p>\n <Link\n to={config.catalogPath}\n className=\"mt-6 rounded-lg bg-primary px-5 py-2.5 text-sm font-semibold text-primary-foreground transition hover:opacity-90\"\n >\n Ir para a loja\n </Link>\n </main>\n )\n}\n","import React from 'react'\nimport { Link } from '../router'\nimport { useStorefrontConfig } from '../config'\nimport { useStorefrontHead } from '../hooks/useStorefrontHead'\n\nconst TITLES = {\n privacy: 'Política de Privacidade',\n terms: 'Termos de Uso',\n returns: 'Trocas e Devoluções',\n} as const\n\nexport type PolicyKind = keyof typeof TITLES\n\n/** Institutional/legal pages. Content comes from config.legal; absent pages show\n * a placeholder so the routes + footer links exist (no 404) before the store\n * publishes its policy — a payment-processor / go-live requirement. */\nexport function PolicyPage({ kind }: { kind: PolicyKind }) {\n const config = useStorefrontConfig()\n const title = TITLES[kind]\n const content = config.legal?.[kind]\n const email = config.footer?.contact?.email\n useStorefrontHead({ title: `${title} — ${config.name}` })\n\n return (\n <main className=\"mx-auto max-w-3xl px-4 py-12 sm:px-6\">\n <Link to={config.catalogPath} className=\"text-sm text-muted-foreground transition-colors hover:text-foreground\">\n ← Voltar à loja\n </Link>\n <h1 className=\"sf-heading mt-4 text-3xl font-bold tracking-tight\">{title}</h1>\n <div className=\"mt-6 space-y-4 leading-relaxed text-muted-foreground\">\n {content ? (\n content.split('\\n').filter((line) => line.trim()).map((paragraph, i) => <p key={i}>{paragraph}</p>)\n ) : (\n <>\n <p>O conteúdo desta política ainda será publicado pela loja.</p>\n {email && (\n <p>\n Em caso de dúvidas, fale com a gente em{' '}\n <a href={`mailto:${email}`} className=\"text-primary underline\">{email}</a>.\n </p>\n )}\n </>\n )}\n </div>\n </main>\n )\n}\n","import React from 'react'\n\ninterface Props {\n children: React.ReactNode\n}\n\ninterface State {\n error: Error | null\n}\n\n/**\n * Catches render/runtime errors in the storefront tree so a single thrown\n * error (e.g. a provider failure) shows a recoverable fallback instead of a\n * blank white screen. Key it by route to auto-clear on navigation.\n */\nexport class StorefrontErrorBoundary extends React.Component<Props, State> {\n state: State = { error: null }\n\n static getDerivedStateFromError(error: Error): State {\n return { error }\n }\n\n componentDidCatch(error: Error, info: React.ErrorInfo): void {\n // eslint-disable-next-line no-console\n console.error('[storefront] render error:', error, info.componentStack)\n }\n\n render(): React.ReactNode {\n if (!this.state.error) return this.props.children\n return (\n <div className=\"flex min-h-[60vh] flex-col items-center justify-center gap-4 px-4 py-16 text-center\">\n <h1 className=\"sf-heading text-xl font-semibold\">Algo deu errado</h1>\n <p className=\"max-w-md text-sm text-muted-foreground\">\n Ocorreu um erro ao carregar esta parte da loja. Tente recarregar a página.\n </p>\n <div className=\"flex flex-wrap justify-center gap-3\">\n <button\n type=\"button\"\n onClick={() => window.location.reload()}\n className=\"rounded-lg bg-primary px-5 py-2.5 text-sm font-semibold text-primary-foreground transition hover:opacity-90\"\n >\n Recarregar\n </button>\n <a href=\"#/\" className=\"rounded-lg border px-5 py-2.5 text-sm font-semibold transition hover:bg-muted\">\n Voltar ao início\n </a>\n </div>\n </div>\n )\n }\n}\n","import React, { useEffect } from 'react'\nimport { AlertCircle, Check, Info, X } from 'lucide-react'\nimport { useToastStore, type Toast } from '../stores/toast.store'\n\nconst ICON: Record<Toast['variant'], React.ComponentType<{ className?: string }>> = {\n success: Check,\n error: AlertCircle,\n info: Info,\n}\n\nconst ACCENT: Record<Toast['variant'], string> = {\n success: 'bg-emerald-500/10 text-emerald-600',\n error: 'bg-destructive/10 text-destructive',\n info: 'bg-primary/10 text-primary',\n}\n\nfunction ToastCard({ toast }: { toast: Toast }) {\n const dismiss = useToastStore((s) => s.dismiss)\n const Icon = ICON[toast.variant]\n\n useEffect(() => {\n const timer = window.setTimeout(() => dismiss(toast.id), toast.durationMs)\n return () => window.clearTimeout(timer)\n }, [toast.id, toast.durationMs, dismiss])\n\n return (\n <div\n role=\"status\"\n className=\"pointer-events-auto flex w-80 max-w-[calc(100vw-2rem)] animate-slide-in-from-right items-start gap-3 rounded-xl border bg-card p-3.5 shadow-lg\"\n >\n <span className={`grid h-8 w-8 shrink-0 place-items-center rounded-full ${ACCENT[toast.variant]}`}>\n <Icon className=\"h-4 w-4\" />\n </span>\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-semibold leading-tight\">{toast.title}</p>\n {toast.description && <p className=\"mt-0.5 text-xs text-muted-foreground\">{toast.description}</p>}\n </div>\n <button\n type=\"button\"\n aria-label=\"Fechar\"\n onClick={() => dismiss(toast.id)}\n className=\"text-muted-foreground transition-colors hover:text-foreground\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n </div>\n )\n}\n\nexport function Toaster() {\n const toasts = useToastStore((s) => s.toasts)\n if (toasts.length === 0) return null\n return (\n <div className=\"pointer-events-none fixed bottom-4 right-4 z-[70] flex flex-col gap-2\">\n {toasts.map((t) => (\n <ToastCard key={t.id} toast={t} />\n ))}\n </div>\n )\n}\n","import React from 'react'\nimport { setShopProvider } from '@fayz-ai/shop/runtime'\nimport { createMockShopProvider } from '@fayz-ai/shop/mock'\nimport type { MockShopSeed } from '@fayz-ai/shop/mock'\nimport type { Discount } from '@fayz-ai/shop/types'\nimport { initCustomerAuth, resolveAuthAdapter } from './auth'\nimport { StorefrontConfigProvider, resolveConfig, useStorefrontConfig } from './config'\nimport type { StorefrontConfig, StorefrontDiscountConfig } from './config'\nimport { useHashPath, matchPath } from './router'\nimport { StorefrontThemeStyle } from './theme'\nimport { StorefrontHeader } from './components/StorefrontHeader'\nimport { StorefrontFooter } from './components/StorefrontFooter'\nimport { CartDrawer } from './components/CartDrawer'\nimport { CatalogPage } from './pages/CatalogPage'\nimport { HomePage } from './pages/HomePage'\nimport { ProductDetailPage } from './pages/ProductDetailPage'\nimport { CheckoutPage } from './pages/CheckoutPage'\nimport { OrderConfirmationPage } from './pages/OrderConfirmationPage'\nimport { MyPurchasesPage } from './pages/MyPurchasesPage'\nimport { NotFoundPage } from './pages/NotFoundPage'\nimport { PolicyPage } from './pages/PolicyPage'\nimport { StorefrontErrorBoundary } from './components/StorefrontErrorBoundary'\nimport { Toaster } from './components/Toaster'\n\nfunction getCustomRouteMatch(config: ReturnType<typeof useStorefrontConfig>, path: string) {\n for (const route of config.routes ?? []) {\n const params = matchPath(route.path, path)\n if (params) return { route, params }\n }\n return null\n}\n\nfunction isFocusedRoute(config: ReturnType<typeof useStorefrontConfig>, path: string): boolean {\n const custom = getCustomRouteMatch(config, path)\n if (custom) return custom.route.chrome === 'focused' || custom.route.kind === 'checkout'\n return Boolean(matchPath('/checkout', path))\n}\n\nfunction RouteSwitch({ path }: { path: string }) {\n const config = useStorefrontConfig()\n\n const custom = getCustomRouteMatch(config, path)\n if (custom) {\n const CustomRoute = custom.route.component\n return <CustomRoute path={path} params={custom.params} config={config} />\n }\n\n const product = matchPath('/product/:slug', path)\n if (product?.slug) return <ProductDetailPage slug={product.slug} />\n\n const order = matchPath('/order/:id', path)\n if (order?.id) return <OrderConfirmationPage orderId={order.id} />\n\n if (matchPath('/checkout', path)) return <CheckoutPage />\n if (matchPath('/account', path)) return <MyPurchasesPage />\n if (matchPath('/catalog', path)) return <CatalogPage />\n if (matchPath('/privacy', path)) return <PolicyPage kind=\"privacy\" />\n if (matchPath('/terms', path)) return <PolicyPage kind=\"terms\" />\n if (matchPath('/refunds', path)) return <PolicyPage kind=\"returns\" />\n\n // Root renders home (or catalog when there's no home). Any other unmatched\n // path is a genuine 404 — don't silently fall back to the storefront.\n if (path === '/' || path === '') {\n return config.home ? <HomePage sections={config.home.sections} /> : <CatalogPage />\n }\n return <NotFoundPage />\n}\n\n/**\n * Side-effect runtime init shared by the factory and the manifest scaffold:\n * wires customer auth and the shop provider. Idempotent and safe to call once\n * before first render. Provider resolution: explicit > catalog mock > empty mock.\n */\n/**\n * config.discounts are simple {code, percent} entries the UI validator trusts\n * (useDiscountValidator). They must ALSO be seeded into the provider, or\n * placeOrder won't find the code server-side and will charge full price — the\n * shopper sees a discounted total but is billed the undiscounted one.\n */\nfunction storefrontDiscountToSeed(discount: StorefrontDiscountConfig): Discount {\n const ts = new Date().toISOString()\n return {\n id: `cfg-discount-${discount.code.trim().toLowerCase()}`,\n tenantId: 'mock',\n title: discount.title ?? `${discount.percent}% off`,\n code: discount.code.trim().toUpperCase(),\n type: 'percentage',\n method: 'code',\n value: discount.percent,\n usageLimit: null,\n oncePerCustomer: false,\n startsAt: ts,\n endsAt: null,\n status: 'active',\n timesUsed: 0,\n createdAt: ts,\n updatedAt: ts,\n }\n}\n\nfunction buildMockSeed(config: StorefrontConfig): MockShopSeed | undefined {\n const configDiscounts = (config.discounts ?? []).map(storefrontDiscountToSeed)\n if (!config.catalog && configDiscounts.length === 0) return undefined\n // Config-level codes win over catalog seeds sharing the same code.\n const catalogDiscounts = (config.catalog?.discounts ?? []).filter(\n (cd) => !configDiscounts.some((cfg) => (cd.code ?? '').toUpperCase() === cfg.code),\n )\n return {\n ...config.catalog,\n discounts: [...catalogDiscounts, ...configDiscounts],\n }\n}\n\nexport function initStorefrontRuntime(config: StorefrontConfig): void {\n initCustomerAuth(resolveAuthAdapter(config.auth?.adapter))\n\n if (config.provider) {\n setShopProvider(config.provider)\n } else {\n setShopProvider(createMockShopProvider(buildMockSeed(config)))\n }\n\n if (config.supabaseUrl || config.supabaseAnonKey) {\n console.warn(\n '@fayz-ai/shop: supabaseUrl/supabaseAnonKey are legacy fields. Pass an explicit provider/adapter or use the Fayz SDK broker path.',\n )\n }\n}\n\n/** The inner storefront UI. Reads everything from the config context, so it is\n * shared by createStorefrontApp and the manifest-driven StorefrontScaffold. */\nexport function StorefrontShell() {\n const config = useStorefrontConfig()\n const path = useHashPath()\n const focused = isFocusedRoute(config, path)\n return (\n <div className=\"min-h-screen bg-background text-foreground\">\n {config.theme && <StorefrontThemeStyle theme={config.theme} />}\n {!focused && <StorefrontHeader />}\n <StorefrontErrorBoundary key={path}>\n <RouteSwitch path={path} />\n </StorefrontErrorBoundary>\n {!focused && <CartDrawer />}\n {!focused && <StorefrontFooter />}\n <Toaster />\n </div>\n )\n}\n\n/**\n * Declarative storefront factory — the customer-facing counterpart of\n * createSaasApp. Sugar over the manifest path: it is equivalent to\n * renderApp(defineStorefront(config)), sharing initStorefrontRuntime +\n * StorefrontShell with the scaffold.\n *\n * const App = createStorefrontApp({ name: 'Aurora Goods', currency: 'BRL' })\n */\nexport function createStorefrontApp(config: StorefrontConfig): React.ComponentType {\n const resolved = resolveConfig(config)\n initStorefrontRuntime(config)\n\n function StorefrontApp() {\n return (\n <StorefrontConfigProvider value={resolved}>\n <StorefrontShell />\n </StorefrontConfigProvider>\n )\n }\n StorefrontApp.displayName = 'StorefrontApp'\n return StorefrontApp\n}\n","import React from 'react'\nimport { registerScaffold, defineApp } from '@fayz-ai/core'\nimport type { AppManifest, BackendProvider } from '@fayz-ai/core'\nimport { StorefrontConfigProvider, resolveConfig } from './config'\nimport type { StorefrontConfig } from './config'\nimport type { StorefrontTheme } from './theme'\nimport type { HomeConfig, NavLink, FooterConfig } from './sections'\nimport { initStorefrontRuntime, StorefrontShell } from './createStorefrontApp'\nimport './blocks' // ensure section blocks are registered\n\ntype StorefrontBackendProvider = NonNullable<StorefrontConfig['backend']>['provider']\nconst runtimeConfigRegistry = new Map<string, StorefrontConfig>()\n\n// ---------------------------------------------------------------------------\n// Storefront scaffold — renders a store from a pure-data AppManifest. The\n// storefront surface keeps its declarative config under surface.options, so the\n// mapping is loss-free for the serializable fields (the code escape hatches —\n// custom provider/adapter/logo — arrive via the registries instead).\n// ---------------------------------------------------------------------------\n\nfunction slug(name: string): string {\n return name.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '') || 'app'\n}\n\n/** StorefrontConfig → AppManifest (the sugar-to-data direction). */\nexport function defineStorefront(config: StorefrontConfig): AppManifest {\n const id = slug(config.name)\n runtimeConfigRegistry.set(id, config)\n const backendProvider = (config.backend?.provider ?? (config.provider ? 'custom' : 'mock')) as BackendProvider\n\n return defineApp({\n id,\n name: config.name,\n backend: {\n provider: backendProvider,\n url: config.backend?.url,\n },\n locale: {\n default: config.locale ?? 'pt-BR',\n supported: [config.locale ?? 'pt-BR'],\n currency: config.currency ?? 'BRL',\n },\n theme: config.theme as Record<string, unknown> | undefined,\n surfaces: {\n storefront: {\n scaffold: 'storefront',\n options: {\n announcement: config.announcement,\n home: config.home,\n nav: config.nav,\n footer: config.footer,\n shipping: config.shipping,\n features: config.features,\n catalog: config.catalog,\n },\n },\n },\n })\n}\n\n/** AppManifest → StorefrontConfig (the data-to-render direction). */\nfunction manifestToStorefrontConfig(manifest: AppManifest, surfaceName: string): StorefrontConfig {\n const runtimeConfig = runtimeConfigRegistry.get(manifest.id)\n const surface = manifest.surfaces[surfaceName]\n const o = (surface?.options ?? {}) as Record<string, unknown>\n return {\n ...runtimeConfig,\n name: manifest.name,\n currency: (manifest.locale as { currency?: string } | undefined)?.currency,\n locale: (manifest.locale as { default?: string } | undefined)?.default,\n theme: manifest.theme as StorefrontTheme | undefined,\n announcement: o.announcement as string | undefined,\n home: o.home as HomeConfig | undefined,\n nav: o.nav as NavLink[] | undefined,\n footer: o.footer as FooterConfig | undefined,\n shipping: o.shipping as StorefrontConfig['shipping'],\n features: o.features as StorefrontConfig['features'],\n catalog: o.catalog as StorefrontConfig['catalog'],\n backend: {\n provider: manifest.backend?.provider as StorefrontBackendProvider,\n url: manifest.backend?.url,\n },\n slots: runtimeConfig?.slots,\n routes: runtimeConfig?.routes,\n provider: runtimeConfig?.provider,\n auth: runtimeConfig?.auth,\n logo: runtimeConfig?.logo,\n }\n}\n\nexport function StorefrontScaffold({ manifest, surface }: { manifest: AppManifest; surface: string }) {\n const config = React.useMemo(() => manifestToStorefrontConfig(manifest, surface), [manifest, surface])\n const resolved = React.useMemo(() => resolveConfig(config), [config])\n const inited = React.useRef(false)\n if (!inited.current) {\n initStorefrontRuntime(config)\n inited.current = true\n }\n return (\n <StorefrontConfigProvider value={resolved}>\n <StorefrontShell />\n </StorefrontConfigProvider>\n )\n}\nStorefrontScaffold.displayName = 'StorefrontScaffold'\n\n// Self-register so `renderApp(manifest)` can resolve the 'storefront' scaffold\n// whenever this package is imported.\nregisterScaffold('storefront', StorefrontScaffold, { source: 'sdk', label: 'Storefront' })\n","import type { StorefrontTheme } from './theme'\nimport type { HomeConfig } from './sections'\n\n// ---------------------------------------------------------------------------\n// Template presets — recreations of the four Nuvemshop patterns selected in\n// docs/storefront-templates-research.md. Each is { theme, home() } so an app\n// (or the Fayz agent) starts from a complete professional store and overrides\n// copy, colors, hero images and sections — the saas-core theming workflow.\n// ---------------------------------------------------------------------------\n\n/** Real imagery for a template home — resolved at build time (e.g. via\n * scripts/fetch-unsplash.mjs); falls back to gradient placeholders when omitted. */\nexport interface TemplateImages {\n hero?: Array<string | undefined>\n banners?: Array<string | undefined>\n}\n\nexport interface StorefrontTemplate {\n id: string\n /** The Nuvemshop pattern this recreates */\n inspiration: string\n theme: StorefrontTheme\n /** Default home blueprint — pass the store name for copy interpolation */\n home: (storeName: string, images?: TemplateImages) => HomeConfig\n announcement?: string\n}\n\n/** maré — elegant fashion (Rio): airy warm paper, olive ink, sand CTA, centered logo. */\nexport const mareTemplate: StorefrontTemplate = {\n id: 'mare',\n inspiration: 'Nuvemshop Rio',\n announcement: 'FRETE GRÁTIS EM COMPRAS ACIMA DE R$ 300',\n theme: {\n name: 'mare',\n colors: {\n background: '40 14% 93%',\n foreground: '90 8% 38%',\n primary: '42 32% 61%',\n primaryForeground: '40 30% 12%',\n card: '40 20% 97%',\n cardForeground: '90 10% 25%',\n muted: '40 12% 88%',\n mutedForeground: '90 6% 50%',\n border: '40 10% 82%',\n announcementBackground: '90 10% 30%',\n announcementForeground: '40 20% 95%',\n },\n font: { heading: 'Plus Jakarta Sans', body: 'Plus Jakarta Sans' },\n radius: 'soft',\n header: { variant: 'centered' },\n productCard: { style: 'editorial', imageAspect: 'portrait' },\n },\n home: (storeName, images) => ({\n sections: [\n {\n type: 'hero',\n variant: 'banner',\n height: 'tall',\n slides: [\n { title: 'Feito para durar', subtitle: `A nova coleção ${storeName} chegou — peças atemporais em materiais honestos.`, cta: 'Ver coleção', hue: 75, image: images?.hero?.[0] },\n ],\n },\n { type: 'categories', style: 'bubbles' },\n { type: 'products', title: 'Destaques', filter: 'all', limit: 4 },\n { type: 'banner', title: 'Até 30% off', eyebrow: 'por tempo limitado', subtitle: 'Peças selecionadas da estação', cta: 'Aproveitar', hue: 40, image: images?.banners?.[0] },\n { type: 'products', title: 'Promoções', filter: 'sale', limit: 4 },\n { type: 'products', title: 'Lançamentos', filter: 'new', limit: 4 },\n { type: 'newsletter', title: 'Assine nossa newsletter', subtitle: 'Novidades e ofertas exclusivas, sem spam.' },\n ],\n }),\n}\n\n/** sertão — editorial organic (Uyuni): cream paper, coffee serif ink, boxed hero, manifesto. */\nexport const sertaoTemplate: StorefrontTemplate = {\n id: 'sertao',\n inspiration: 'Nuvemshop Uyuni',\n theme: {\n name: 'sertao',\n colors: {\n background: '30 100% 98%',\n foreground: '28 42% 32%',\n primary: '28 42% 32%',\n primaryForeground: '30 100% 97%',\n card: '32 60% 96%',\n cardForeground: '28 40% 26%',\n muted: '32 40% 92%',\n mutedForeground: '28 22% 48%',\n border: '28 30% 80%',\n },\n font: { heading: 'Marcellus', body: 'Marcellus', fallback: 'serif' },\n radius: 'none',\n header: { variant: 'minimal', uppercaseNav: true },\n productCard: { style: 'editorial', imageAspect: 'portrait' },\n uppercaseButtons: true,\n },\n home: (storeName, images) => ({\n sections: [\n {\n type: 'hero',\n variant: 'banner',\n height: 'tall',\n slides: [\n { title: 'Essenciais naturais', subtitle: 'Conheça nossa coleção', cta: 'Ver mais', hue: 28, boxed: true, image: images?.hero?.[0] },\n ],\n },\n {\n type: 'manifesto',\n text: `Num mundo de pressa e excesso, ${storeName} escolhe o caminho lento: ingredientes honestos, produção pequena e cuidado em cada detalhe.`,\n },\n { type: 'categories', style: 'tiles' },\n { type: 'products', title: 'ESSENCIAIS', filter: 'all', limit: 4 },\n {\n type: 'testimonials',\n title: 'Nossos clientes',\n items: [\n { quote: 'Qualidade impecável e um cheiro que abraça.', author: 'Helena M.' },\n { quote: 'Compro há dois anos e nunca me decepcionou.', author: 'Rafael T.' },\n { quote: 'Entrega rápida e embalagem linda, dá gosto de presentear.', author: 'Cláudia P.' },\n ],\n },\n { type: 'products', title: 'NOVIDADES', filter: 'new', limit: 4 },\n {\n type: 'benefits',\n items: [\n { icon: 'Truck', title: 'Frete para todo o Brasil', text: 'Envio em até 48h' },\n { icon: 'Leaf', title: '100% vegano', text: 'Sem testes em animais' },\n { icon: 'RotateCcw', title: 'Troca fácil', text: '30 dias para trocar' },\n ],\n },\n { type: 'newsletter', title: 'NEWSLETTER', subtitle: 'Histórias, lançamentos e cuidado — direto no seu e-mail.' },\n ],\n }),\n}\n\n/** volt — bold tech (Brasília): white canvas, near-black ink, vivid CTA, dark search-first header, split hero. */\nexport const voltTemplate: StorefrontTemplate = {\n id: 'volt',\n inspiration: 'Nuvemshop Brasília',\n announcement: 'CUPOM BEMVINDO10 — 10% DE DESCONTO NA PRIMEIRA COMPRA',\n theme: {\n name: 'volt',\n colors: {\n background: '0 0% 100%',\n foreground: '0 0% 7%',\n primary: '341 100% 45%',\n primaryForeground: '0 0% 100%',\n card: '0 0% 98%',\n cardForeground: '0 0% 10%',\n muted: '0 0% 94%',\n mutedForeground: '0 0% 40%',\n border: '0 0% 88%',\n headerBackground: '0 0% 6%',\n headerForeground: '0 0% 98%',\n announcementBackground: '341 100% 45%',\n announcementForeground: '0 0% 100%',\n },\n font: { heading: 'Chakra Petch', body: 'Rubik' },\n radius: 'soft',\n header: { variant: 'search', uppercaseNav: true },\n productCard: { style: 'card', imageAspect: 'square' },\n },\n home: (storeName, images) => ({\n sections: [\n {\n type: 'hero',\n variant: 'split',\n slides: [\n { title: 'Tecnologia', subtitle: 'O melhor do hardware e dos acessórios', hue: 250, image: images?.hero?.[0] },\n { title: 'Ofertas', subtitle: `Descontos semanais ${storeName}`, hue: 341, href: '/catalog', image: images?.hero?.[1] },\n ],\n },\n {\n type: 'benefits',\n items: [\n { icon: 'CreditCard', title: '3x sem juros', text: 'Em todo o site' },\n { icon: 'Truck', title: 'Envio em 24h', text: 'Para todo o Brasil' },\n { icon: 'ShieldCheck', title: 'Compra segura', text: 'Seus dados protegidos' },\n ],\n },\n { type: 'products', title: 'NOVIDADES', filter: 'new', limit: 4 },\n { type: 'banner', title: 'DESCONTOS SEMANAIS', eyebrow: 'toda sexta', subtitle: 'Ofertas novas, estoque limitado', cta: 'Conferir', hue: 341, image: images?.banners?.[0] },\n { type: 'products', title: 'PROMOÇÕES', filter: 'sale', limit: 4 },\n { type: 'newsletter', title: 'Entre para o clube', subtitle: 'Cupons e lançamentos antes de todo mundo.' },\n ],\n }),\n}\n\n/** atelier — classic premium retail (Flex): white, near-black, gold accent, slider hero, trust badges. */\nexport const atelierTemplate: StorefrontTemplate = {\n id: 'atelier',\n inspiration: 'Nuvemshop Flex',\n theme: {\n name: 'atelier',\n colors: {\n background: '0 0% 100%',\n foreground: '0 0% 9%',\n primary: '40 45% 48%',\n primaryForeground: '0 0% 100%',\n card: '0 0% 99%',\n cardForeground: '0 0% 9%',\n muted: '40 10% 95%',\n mutedForeground: '0 0% 42%',\n border: '0 0% 88%',\n announcementBackground: '0 0% 9%',\n announcementForeground: '0 0% 98%',\n },\n font: { heading: 'Outfit', body: 'Outfit' },\n radius: 'none',\n header: { variant: 'centered', uppercaseNav: true },\n productCard: { style: 'card', imageAspect: 'square' },\n uppercaseButtons: true,\n },\n announcement: 'PARCELE EM ATÉ 10X · 5% OFF NO PIX',\n home: (storeName, images) => ({\n sections: [\n {\n type: 'hero',\n variant: 'slider',\n height: 'medium',\n slides: [\n { title: 'Feito para quem valoriza detalhes', subtitle: `Coleção exclusiva ${storeName}`, cta: 'APROVEITE', hue: 40, image: images?.hero?.[0] },\n { title: 'Clássicos que não saem de moda', subtitle: 'Peças autorais, produção limitada', cta: 'VER COLEÇÃO', hue: 210, image: images?.hero?.[1] },\n ],\n },\n {\n type: 'benefits',\n items: [\n { icon: 'CreditCard', title: 'Parcele em até 10x', text: 'Ou 5% off no PIX' },\n { icon: 'Lock', title: 'Site 100% seguro', text: 'Seus dados protegidos' },\n { icon: 'Award', title: 'Peças exclusivas', text: 'Produtos 100% autorais' },\n ],\n },\n { type: 'categories', style: 'tiles' },\n { type: 'products', title: 'Novidades', filter: 'new', limit: 4 },\n { type: 'banner', title: 'Promoções', eyebrow: 'seleção especial', subtitle: 'Selecionados com até 25% off', cta: 'Ver ofertas', hue: 40, image: images?.banners?.[0] },\n { type: 'products', title: 'Promoções', filter: 'sale', limit: 4 },\n {\n type: 'testimonials',\n title: 'O que dizem sobre nós',\n items: [\n { quote: 'Acabamento perfeito, superou a expectativa.', author: 'Mariana C.' },\n { quote: 'Atendimento impecável do pedido à entrega.', author: 'Jorge L.' },\n { quote: 'Virou minha loja favorita para presentes.', author: 'Paula R.' },\n ],\n },\n { type: 'newsletter' },\n ],\n }),\n}\n\nexport const storefrontTemplates = {\n mare: mareTemplate,\n sertao: sertaoTemplate,\n volt: voltTemplate,\n atelier: atelierTemplate,\n} as const\n\nexport type StorefrontTemplateId = keyof typeof storefrontTemplates\n"]}