@fayz-ai/storefront 0.8.0 → 0.8.3

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/stores/session.store.ts","../src/auth.ts","../src/config.ts","../src/router.ts","../src/format.ts","../src/product-options.ts","../src/stores/cart.store.ts","../src/theme.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/SmoothImage.tsx","../src/components/CartDrawer.tsx","../src/hooks/useProducts.ts","../src/components/Price.tsx","../src/component-selectors.ts","../src/hooks/useStorefront.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/MediaCarousel.tsx","../src/components/sections/ProductSlider.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/components/ProductEnquiryForm.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/define.ts","../src/scaffold.tsx","../src/presets.ts"],"names":["create","persist","createAuthRuntime","adapter","createMockAuthAdapter","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","Send","MessageCircle","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 {\n createAuthRuntime,\n createMockAuthAdapter,\n type AuthPluginOptions,\n} from '@fayz-ai/plugin-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' | (string & {})\n\nexport interface StorefrontAuthConfig {\n adapter?: AuthPluginOptions['adapter']\n provider?: AuthPluginOptions['provider']\n routes?: AuthPluginOptions['routes']\n supabase?: AuthPluginOptions['supabase']\n}\n\nlet _adapter: AuthAdapter | null = null\n\nfunction isAuthAdapter(value: unknown): value is AuthAdapter {\n return Boolean(\n value &&\n typeof value === 'object' &&\n 'getSession' in value &&\n 'signIn' in value &&\n 'signOut' in value,\n )\n}\n\nfunction normalizeAuthConfig(\n configured: StorefrontAuthAdapter | StorefrontAuthConfig | undefined,\n): StorefrontAuthConfig {\n if (!configured) return {}\n if (typeof configured === 'string' || isAuthAdapter(configured)) return { adapter: configured }\n return configured\n}\n\nexport function resolveAuthAdapter(\n configured: StorefrontAuthAdapter | StorefrontAuthConfig | undefined,\n fallback?: { supabaseUrl?: string; supabaseAnonKey?: string },\n): AuthAdapter {\n const config = normalizeAuthConfig(configured)\n return createAuthRuntime({\n provider: config.provider ?? config.adapter ?? (fallback?.supabaseUrl ? 'supabase' : 'mock'),\n adapter: config.adapter,\n routes: config.routes,\n requireAuth: false,\n supabase: {\n url: config.supabase?.url ?? fallback?.supabaseUrl,\n anonKey: config.supabase?.anonKey ?? fallback?.supabaseAnonKey,\n client: config.supabase?.client,\n callbackUrl: config.supabase?.callbackUrl,\n resetPasswordUrl: config.supabase?.resetPasswordUrl,\n },\n }).adapter\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 { 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 { StorefrontAuthConfig } from './auth'\nimport type { StorefrontComponents } from './component-contracts'\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'\nexport type StorefrontCommerceMode = 'checkout' | 'catalog' | 'enquiry'\nexport type StorefrontImageLoadingMode = 'fade' | 'none'\n\nexport interface StorefrontImageLoadingConfig {\n mode?: StorefrontImageLoadingMode\n durationMs?: number\n easing?: string\n blur?: boolean\n}\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 StorefrontDiscountConfig {\n code: string\n percent: number\n title?: string\n}\n\nexport interface StorefrontEnquiryConfig {\n label?: string\n successMessage?: string\n subjectPrefix?: string\n email?: string\n whatsappUrl?: string\n requirePhone?: boolean\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 /** Checkout-first default, catalog-only browsing, or product enquiry flow. */\n commerceMode?: StorefrontCommerceMode\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?: StorefrontAuthConfig\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 /** Product enquiry behavior for catalog/enquiry stores. */\n enquiry?: StorefrontEnquiryConfig\n /** Feature toggles — defaults depend on commerceMode. */\n features?: { discounts?: boolean; accounts?: boolean; cart?: boolean; checkout?: boolean }\n /** Global storefront image reveal behavior. Default is a soft fade. */\n imageLoading?: StorefrontImageLoadingConfig\n /** Code-level component replacements. Kept out of serialized manifests. */\n components?: StorefrontComponents\n /** Code-level route overrides/custom routes. Kept out of serialized manifests. */\n routes?: readonly 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 commerceMode: StorefrontCommerceMode\n enquiry: Required<Pick<StorefrontEnquiryConfig, 'label' | 'successMessage' | 'subjectPrefix'>> &\n Omit<StorefrontEnquiryConfig, 'label' | 'successMessage' | 'subjectPrefix'>\n features: { discounts: boolean; accounts: boolean; cart: boolean; checkout: boolean }\n imageLoading: Required<StorefrontImageLoadingConfig>\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 const commerceMode = config.commerceMode ?? 'checkout'\n const checkoutEnabled = commerceMode === 'checkout'\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 commerceMode,\n enquiry: {\n label: config.enquiry?.label ?? 'Contact me',\n successMessage: config.enquiry?.successMessage ?? 'Thanks. We received your enquiry.',\n subjectPrefix: config.enquiry?.subjectPrefix ?? 'Product enquiry',\n email: config.enquiry?.email,\n whatsappUrl: config.enquiry?.whatsappUrl,\n requirePhone: config.enquiry?.requirePhone,\n },\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 ?? checkoutEnabled,\n cart: config.features?.cart ?? checkoutEnabled,\n checkout: config.features?.checkout ?? checkoutEnabled,\n },\n imageLoading: {\n mode: config.imageLoading?.mode ?? 'fade',\n durationMs: config.imageLoading?.durationMs ?? 420,\n easing: config.imageLoading?.easing ?? 'cubic-bezier(0.22, 1, 0.36, 1)',\n blur: config.imageLoading?.blur ?? 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\nexport function useStorefrontConfigOptional(): ResolvedStorefrontConfig | null {\n return useContext(StorefrontConfigContext)\n}\n\nexport function getStorefrontComponents(config: ResolvedStorefrontConfig): StorefrontComponents {\n return config.components ?? {}\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","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 /** Drop persisted lines the active backend can no longer resolve (e.g. a cart\n * built in an earlier mock-mode session, whose ids don't exist live). The\n * resolver returns false only for a definitive \"not found\"; on error it must\n * return true so a transient failure never discards a legit line. */\n reconcile(resolve: (line: CartLine) => Promise<boolean>): Promise<void>\n}\n\nexport const useCartStore = create<CartState>()(\n persist(\n (set, get) => ({\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 reconcile: async (resolve) => {\n const lines = get().lines\n if (lines.length === 0) return\n const keep = await Promise.all(\n lines.map((line) => resolve(line).catch(() => true)),\n )\n const kept = lines.filter((_, i) => keep[i])\n if (kept.length !== lines.length) set({ lines: kept })\n },\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 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 /** Secondary brand accent (e.g. a gourmet gold beside the primary). Emitted\n * as `--sf-accent` / `--sf-accent-foreground` and the `accent` tailwind token. */\n accent?: string\n accentForeground?: 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 /** Optional oversized display face for hero words (emitted as `--sf-font-display`). */\n display?: string\n /** Optional serif accent for quotes/editorial (emitted as `--sf-font-serif`). */\n serif?: string\n /** Google Fonts families to load (defaults to heading+body+display+serif) */\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 /** Show category shortcuts after primary nav links. Default true. */\n showCategories?: boolean\n /** Show the storefront search in the header. Default true. */\n showSearch?: boolean\n /** Header search presentation: a full input ('full', default) or a compact\n * icon button that expands into an input on click ('icon'). */\n searchStyle?: 'full' | 'icon'\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 /** Brand-token passthrough. Each entry is emitted verbatim as a `--<key>` CSS\n * custom property, so a store can add gradients, glows, extra colors, or\n * letter-spacing the fixed schema doesn't enumerate — without editing the SDK.\n * e.g. { 'grad-ember': 'linear-gradient(...)', 'glow-ember': '0 0 0 1px ...' }. */\n tokens?: Record<string, string>\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 accent: '--sf-accent',\n accentForeground: '--sf-accent-foreground',\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 if (theme.font.display) lines.push(`--sf-font-display: '${theme.font.display}', ${fallback};`)\n if (theme.font.serif) lines.push(`--sf-font-serif: '${theme.font.serif}', serif;`)\n }\n\n // Brand-token passthrough — emit each entry as a raw CSS custom property.\n for (const [key, value] of Object.entries(theme.tokens ?? {})) {\n const name = key.startsWith('--') ? key : `--${key}`\n lines.push(`${name}: ${value};`)\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 =\n theme.font.googleFonts ??\n [theme.font.heading, theme.font.body, theme.font.display, theme.font.serif].filter(\n (f): f is string => Boolean(f),\n )\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","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 headerSearchToggle: 'header-search-toggle',\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 mediaCarousel: 'media-carousel',\n mediaCarouselPrev: 'media-carousel-prev',\n mediaCarouselNext: 'media-carousel-next',\n productSlider: 'product-slider',\n productSliderViewport: 'product-slider-viewport',\n productSliderPrev: 'product-slider-prev',\n productSliderNext: 'product-slider-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 pdpRoot: 'pdp-root',\n pdpGallery: 'pdp-gallery',\n pdpActions: 'pdp-actions',\n pdpEnquiryButton: 'pdp-enquiry-button',\n enquiryForm: 'enquiry-form',\n enquiryName: 'enquiry-name',\n enquiryEmail: 'enquiry-email',\n enquiryPhone: 'enquiry-phone',\n enquirySubject: 'enquiry-subject',\n enquiryMessage: 'enquiry-message',\n enquirySubmit: 'enquiry-submit',\n enquirySuccess: 'enquiry-success',\n enquiryError: 'enquiry-error',\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, iconOnly = false }: { className?: string; iconOnly?: boolean }) {\n const config = useStorefrontConfig()\n const search = useCatalogStore((s) => s.search)\n const setSearch = useCatalogStore((s) => s.setSearch)\n const path = useHashPath()\n const [open, setOpen] = useState(false)\n\n // Icon-only: a compact search button that expands into the input on click and\n // collapses again on Escape / blur-when-empty.\n if (iconOnly && !open) {\n return (\n <button\n type=\"button\"\n aria-label=\"Buscar produtos\"\n data-testid={TID.headerSearchToggle}\n onClick={() => setOpen(true)}\n className=\"rounded-full p-2.5 transition-opacity hover:opacity-70\"\n >\n <Search className=\"h-5 w-5\" />\n </button>\n )\n }\n\n return (\n <div className={`relative ${iconOnly ? 'w-full max-w-xs' : (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 autoFocus={iconOnly}\n onChange={(e) => {\n setSearch(e.target.value)\n if (path !== config.catalogPath) navigateTo(config.catalogPath)\n }}\n onKeyDown={(e) => {\n if (e.key === 'Escape' && iconOnly) setOpen(false)\n }}\n onBlur={() => {\n if (iconOnly && !search) setOpen(false)\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 {config.features.cart && (\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 )}\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 const showCategories = config.theme?.header?.showCategories !== false\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 min-w-max 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 {showCategories &&\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 showSearch = config.theme?.header?.showSearch !== false\n const iconSearch = config.theme?.header?.searchStyle === 'icon'\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 {showSearch ? <SearchInput iconOnly={iconSearch} className=\"hidden w-full max-w-xs sm:block\" /> : <div />}\n <div className=\"text-center\">{logo}</div>\n <div className=\"justify-self-end\">\n <HeaderActions />\n </div>\n </div>\n <div className=\"flex overflow-x-auto border-t py-2.5 sm:justify-center\" 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 {showSearch ? <SearchInput iconOnly={iconSearch} className=\"hidden w-full max-w-sm sm:block\" /> : <div />}\n <div className=\"text-center\">{logo}</div>\n <div className=\"justify-self-end\">\n <HeaderActions />\n </div>\n </div>\n <div className=\"overflow-x-auto border-t\" 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 {showSearch && <SearchInput iconOnly={iconSearch} className=\"hidden w-44 lg:block\" />}\n <HeaderActions />\n </div>\n </div>\n ) : (\n // classic: logo left, nav, then a right-aligned search + actions cluster\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 <div className=\"ml-auto flex items-center gap-2 sm:gap-3\">\n {showSearch && <SearchInput iconOnly={iconSearch} className={iconSearch ? '' : 'hidden w-full max-w-sm sm:block'} />}\n <HeaderActions />\n </div>\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 const labels = {\n categories: 'Departamentos',\n navigation: 'Navegação',\n contact: 'Contato',\n viewAll: 'Ver todos',\n purchases: 'Minhas compras',\n privacy: 'Privacidade',\n terms: 'Termos',\n returns: 'Trocas e devoluções',\n ...config.footer?.labels,\n }\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\">{labels.categories}</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 {labels.viewAll} ({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\">{labels.navigation}</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 {config.features.accounts && (\n <li>\n <Link to=\"/account\" className=\"transition-opacity hover:opacity-70\">{labels.purchases}</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\">{labels.contact}</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\">{labels.privacy}</Link>\n <Link to=\"/terms\" className=\"transition-colors hover:text-foreground\">{labels.terms}</Link>\n <Link to=\"/refunds\" className=\"transition-colors hover:text-foreground\">{labels.returns}</Link>\n </nav>\n <p className=\"text-center\">\n {config.footer?.credit ?? <>© {config.name} — powered by Fayz</>}\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 from 'react'\nimport { useStorefrontConfigOptional, type StorefrontImageLoadingConfig } from '../config'\n\nexport interface SmoothImageProps extends React.ImgHTMLAttributes<HTMLImageElement> {\n imageLoading?: StorefrontImageLoadingConfig\n}\n\nexport function SmoothImage({\n imageLoading,\n loading = 'lazy',\n decoding = 'async',\n onLoad,\n style,\n ...props\n}: SmoothImageProps) {\n const config = useStorefrontConfigOptional()\n const resolved = {\n ...config?.imageLoading,\n ...imageLoading,\n }\n const mode = resolved.mode ?? 'fade'\n const durationMs = resolved.durationMs ?? 420\n const easing = resolved.easing ?? 'cubic-bezier(0.22, 1, 0.36, 1)'\n const blur = resolved.blur ?? true\n const ref = React.useRef<HTMLImageElement | null>(null)\n const [loaded, setLoaded] = React.useState(mode === 'none')\n\n React.useEffect(() => {\n if (mode === 'none') {\n setLoaded(true)\n return\n }\n if (ref.current?.complete && ref.current.naturalWidth > 0) setLoaded(true)\n }, [mode, props.src])\n\n const revealStyle: React.CSSProperties =\n mode === 'none'\n ? {}\n : {\n opacity: loaded ? 1 : 0,\n filter: blur && !loaded ? 'blur(10px)' : 'blur(0px)',\n transition: `opacity ${durationMs}ms ${easing}, filter ${durationMs}ms ${easing}, transform ${durationMs}ms ${easing}`,\n }\n\n return (\n <img\n {...props}\n ref={ref}\n loading={loading}\n decoding={decoding}\n data-sf-image-loaded={loaded ? 'true' : 'false'}\n style={{ ...style, ...revealStyle }}\n onLoad={(event) => {\n setLoaded(true)\n onLoad?.(event)\n }}\n />\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'\nimport { SmoothImage } from './SmoothImage'\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 <SmoothImage 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 components must preserve.\n *\n * Apps can fully customize the visual tree, but replacement components still\n * need these anchors so smoke tests, QA, and agents can operate stores.\n */\nexport const productCardComponentContract = {\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 storefrontComponentContracts = {\n productCard: productCardComponentContract,\n productDetail: {\n root: { 'data-testid': TID.pdpRoot },\n gallery: { 'data-testid': TID.pdpGallery },\n name: { 'data-testid': TID.pdpName },\n description: { 'data-testid': TID.pdpDescription },\n actions: { 'data-testid': TID.pdpActions },\n addButton: { 'data-testid': TID.pdpAddToCart },\n enquiryButton: { 'data-testid': TID.pdpEnquiryButton },\n enquiryForm: { 'data-testid': TID.enquiryForm },\n },\n} as const\n\nexport type ProductCardComponentContract = typeof productCardComponentContract\nexport type ProductDetailComponentContract = typeof storefrontComponentContracts.productDetail\n","import { getShopProvider } from '@fayz-ai/shop/runtime'\nimport type { CreateProductEnquiryInput } from '@fayz-ai/shop/types'\nimport { useStorefrontConfig } from '../config'\nimport { navigateTo } from '../router'\nimport { useCatalogStore } from '../stores/catalog.store'\nimport { useCartStore } from '../stores/cart.store'\nimport type { ProductOptionSelection } from '../product-options'\nimport type { Product } from '@fayz-ai/shop/types'\n\nexport function useStorefront() {\n return useStorefrontConfig()\n}\n\nexport function useCatalog() {\n const config = useStorefrontConfig()\n const catalog = useCatalogStore()\n return {\n ...catalog,\n catalogPath: config.catalogPath,\n config,\n }\n}\n\nexport function useCart() {\n return useCartStore()\n}\n\nexport function useEnquiry() {\n const config = useStorefrontConfig()\n const createProductEnquiry = async (input: CreateProductEnquiryInput) => {\n const provider = getShopProvider()\n if (!provider.createProductEnquiry) {\n throw new Error('The active shop provider does not support product enquiries.')\n }\n return provider.createProductEnquiry(input)\n }\n\n return {\n enquiry: config.enquiry,\n createProductEnquiry,\n }\n}\n\nexport function useStorefrontActions() {\n const addItem = useCartStore((state) => state.addItem)\n const openDrawer = useCartStore((state) => state.openDrawer)\n const closeDrawer = useCartStore((state) => state.closeDrawer)\n const { createProductEnquiry } = useEnquiry()\n\n return {\n navigateTo,\n addToCart: (product: Product, quantity?: number, options?: ProductOptionSelection) =>\n addItem(product, quantity, options),\n openCart: openDrawer,\n closeCart: closeDrawer,\n createProductEnquiry,\n }\n}\n","import React from 'react'\nimport { ShoppingBag } from 'lucide-react'\nimport { useStorefrontConfig } from '../config'\nimport { Link, navigateTo } from '../router'\nimport { getProductOptionGroups } from '../product-options'\nimport { Price } from './Price'\nimport { TID } from '../testids'\nimport { productCardComponentContract } from '../component-selectors'\nimport { useStorefrontActions } from '../hooks/useStorefront'\nimport type { ProductCardProps } from '../component-contracts'\nimport { SmoothImage } from './SmoothImage'\n\nexport function ProductCard({ product, config: providedConfig, actions: providedActions }: ProductCardProps) {\n const runtimeConfig = useStorefrontConfig()\n const runtimeActions = useStorefrontActions()\n const config = providedConfig ?? runtimeConfig\n const actions = providedActions ?? runtimeActions\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 const purchaseMode = config.commerceMode === 'checkout'\n\n return (\n <div\n {...productCardComponentContract.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 <SmoothImage\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 {...productCardComponentContract.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 gap-3 pt-2\">\n {purchaseMode ? (\n <Price\n value={product.price}\n compareAt={product.compareAtPrice}\n testId={productCardComponentContract.priceTestId}\n />\n ) : (\n <span data-testid={productCardComponentContract.priceTestId} className=\"text-sm text-muted-foreground\">\n {config.commerceMode === 'enquiry' ? config.enquiry.label : 'Ver detalhes'}\n </span>\n )}\n <button\n type=\"button\"\n {...productCardComponentContract.addButton}\n disabled={purchaseMode && soldOut}\n aria-label={\n purchaseMode\n ? hasOptions\n ? `Escolher opções de ${product.name}`\n : `Adicionar ${product.name} ao carrinho`\n : `${config.enquiry.label} ${product.name}`\n }\n onClick={() => {\n if (!purchaseMode) {\n navigateTo(`/product/${product.slug}`)\n return\n }\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 actions.addToCart(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 { getStorefrontComponents, useStorefrontConfig } from '../config'\nimport { useStorefrontActions } from '../hooks/useStorefront'\nimport { TID } from '../testids'\n\nexport function ProductGrid({ products, loading }: { products: Product[]; loading: boolean }) {\n const config = useStorefrontConfig()\n const actions = useStorefrontActions()\n const components = getStorefrontComponents(config)\n const ProductCardComponent = components.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\n key={p.id}\n product={p}\n config={config}\n commerceMode={config.commerceMode}\n actions={actions}\n />\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'\nimport type React from 'react'\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 interface MediaCarouselItem {\n title: string\n subtitle?: string\n eyebrow?: string\n cta?: string\n href?: string\n image: string\n imageAlt?: string\n align?: 'start' | 'center' | 'end'\n}\n\nexport type StorefrontSection =\n | { type: 'hero'; variant: HeroVariant; slides: HeroSlide[]; height?: 'tall' | 'medium' }\n | {\n type: 'mediaCarousel'\n items: MediaCarouselItem[]\n height?: 'medium' | 'tall' | 'screen'\n autoplayMs?: number\n overlay?: 'dark' | 'soft' | 'none'\n className?: string\n }\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 | {\n type: 'productSlider'\n title: string\n subtitle?: string\n eyebrow?: string\n filter?: 'sale' | 'new' | 'all'\n categoryName?: string\n collection?: string\n limit?: number\n cta?: string\n href?: string\n className?: string\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\n/** @deprecated Use StorefrontSection. Kept for existing generated stores. */\nexport type HomeSection = StorefrontSection\n\nexport interface HomeConfig {\n sections: readonly StorefrontSection[]\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 credit?: React.ReactNode\n labels?: {\n categories?: string\n navigation?: string\n contact?: string\n viewAll?: string\n purchases?: string\n privacy?: string\n terms?: string\n returns?: string\n }\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 { useStorefrontConfig } from '../../config'\nimport { prefersReducedMotion } from '../../motion'\nimport { Link } from '../../router'\nimport { TID } from '../../testids'\nimport { SmoothImage } from '../SmoothImage'\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 [loadedSlides, setLoadedSlides] = useState<Record<number, boolean>>({})\n const config = useStorefrontConfig()\n const interacted = useRef(false)\n const hClass = height === 'tall' ? 'h-[72vh] min-h-[440px]' : 'h-[48vh] min-h-[340px]'\n const revealImages = config.imageLoading.mode !== 'none'\n const revealStyle = (loaded: boolean): React.CSSProperties | undefined =>\n revealImages\n ? {\n filter: config.imageLoading.blur && !loaded ? 'blur(10px)' : 'blur(0px)',\n transition: `opacity 700ms ease, filter ${config.imageLoading.durationMs}ms ${config.imageLoading.easing}`,\n }\n : undefined\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 <SmoothImage\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 loading={i === 0 ? 'eager' : 'lazy'}\n decoding=\"async\"\n onLoad={() => setLoadedSlides((current) => ({ ...current, [i]: true }))}\n style={revealStyle(Boolean(loadedSlides[i]))}\n className={`absolute inset-0 h-full w-full object-cover transition-opacity duration-700 ${\n i === index && (!revealImages || loadedSlides[i]) ? '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'\nimport { SmoothImage } from '../SmoothImage'\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 <SmoothImage\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 <SmoothImage\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 { getStorefrontComponents, useStorefrontConfig } from '../../config'\nimport { useStorefrontActions } from '../../hooks/useStorefront'\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 actions = useStorefrontActions()\n const components = getStorefrontComponents(config)\n const ProductCardComponent = components.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\n product={p}\n config={config}\n commerceMode={config.commerceMode}\n actions={actions}\n />\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, { useEffect, useRef, useState } from 'react'\nimport { ChevronLeft, ChevronRight } from 'lucide-react'\nimport { Link } from '../../router'\nimport { TID } from '../../testids'\nimport { prefersReducedMotion } from '../../motion'\nimport type { MediaCarouselItem } from '../../sections'\nimport { useStorefrontConfig } from '../../config'\n\nexport interface MediaCarouselProps {\n items: MediaCarouselItem[]\n height?: 'medium' | 'tall' | 'screen'\n autoplayMs?: number\n overlay?: 'dark' | 'soft' | 'none'\n className?: string\n}\n\nconst heightClass = {\n medium: 'h-[58vh] min-h-[420px]',\n tall: 'h-[74vh] min-h-[520px]',\n screen: 'min-h-[calc(100vh-64px)]',\n}\n\nconst alignClass = {\n start: 'items-start text-left',\n center: 'items-center text-center',\n end: 'items-end text-right',\n}\n\nexport function MediaCarousel({\n items,\n height = 'tall',\n autoplayMs = 7000,\n overlay = 'dark',\n className = '',\n}: MediaCarouselProps) {\n const [index, setIndex] = useState(0)\n const [loadedItems, setLoadedItems] = useState<Record<number, boolean>>({})\n const config = useStorefrontConfig()\n const interacted = useRef(false)\n const revealImages = config.imageLoading.mode !== 'none'\n const revealStyle = (loaded: boolean): React.CSSProperties | undefined =>\n revealImages\n ? {\n filter: config.imageLoading.blur && !loaded ? 'blur(10px)' : 'blur(0px)',\n transition: `opacity 700ms ease, filter ${config.imageLoading.durationMs}ms ${config.imageLoading.easing}`,\n }\n : undefined\n\n useEffect(() => {\n if (items.length < 2 || autoplayMs <= 0 || prefersReducedMotion()) return\n const timer = setInterval(() => {\n if (!interacted.current) setIndex((i) => (i + 1) % items.length)\n }, autoplayMs)\n return () => clearInterval(timer)\n }, [autoplayMs, items.length])\n\n if (items.length === 0) return null\n\n const active = items[Math.min(index, items.length - 1)]!\n const goTo = (next: number) => {\n interacted.current = true\n setIndex((next + items.length) % items.length)\n }\n const overlayClass =\n overlay === 'dark'\n ? 'bg-gradient-to-r from-black/70 via-black/25 to-black/25'\n : overlay === 'soft'\n ? 'bg-gradient-to-t from-black/45 via-black/10 to-transparent'\n : ''\n\n return (\n <section data-testid={TID.mediaCarousel} className={`relative isolate overflow-hidden ${heightClass[height]} ${className}`}>\n {items.map((item, i) => (\n <img\n key={`${item.title}-${i}`}\n src={item.image}\n alt={item.imageAlt ?? item.title}\n aria-hidden={i !== index}\n loading={i === 0 ? 'eager' : 'lazy'}\n decoding=\"async\"\n onLoad={() => setLoadedItems((current) => ({ ...current, [i]: true }))}\n style={revealStyle(Boolean(loadedItems[i]))}\n className={`absolute inset-0 -z-10 h-full w-full object-cover transition-opacity duration-700 ${\n i === index && (!revealImages || loadedItems[i]) ? 'opacity-100' : 'opacity-0'\n }`}\n />\n ))}\n <div className={`absolute inset-0 -z-10 ${overlayClass}`} />\n <div className={`flex h-full px-5 py-16 sm:px-10 lg:px-16 ${alignClass[active.align ?? 'start']}`}>\n <div className=\"my-auto max-w-2xl text-white drop-shadow-md\">\n {active.eyebrow && (\n <p className=\"mb-4 text-xs font-semibold uppercase tracking-[0.24em] text-white/80\">{active.eyebrow}</p>\n )}\n <h1 className=\"sf-heading text-5xl font-normal leading-[0.95] sm:text-7xl lg:text-8xl\">{active.title}</h1>\n {active.subtitle && <p className=\"mt-5 max-w-xl text-base leading-8 text-white/88 sm:text-lg\">{active.subtitle}</p>}\n {active.cta && (\n <Link\n to={active.href ?? '/catalog'}\n className=\"mt-8 inline-flex border border-white/75 px-6 py-3 text-xs font-semibold uppercase tracking-[0.18em] text-white transition hover:bg-white hover:text-black\"\n >\n {active.cta}\n </Link>\n )}\n </div>\n </div>\n {items.length > 1 && (\n <>\n <button\n type=\"button\"\n aria-label=\"Previous slide\"\n data-testid={TID.mediaCarouselPrev}\n onClick={() => goTo(index - 1)}\n className=\"absolute left-4 top-1/2 inline-flex h-10 w-10 -translate-y-1/2 items-center justify-center border border-white/60 bg-black/20 text-white backdrop-blur transition hover:bg-white hover:text-black\"\n >\n <ChevronLeft className=\"h-5 w-5\" />\n </button>\n <button\n type=\"button\"\n aria-label=\"Next slide\"\n data-testid={TID.mediaCarouselNext}\n onClick={() => goTo(index + 1)}\n className=\"absolute right-4 top-1/2 inline-flex h-10 w-10 -translate-y-1/2 items-center justify-center border border-white/60 bg-black/20 text-white backdrop-blur transition hover:bg-white hover:text-black\"\n >\n <ChevronRight className=\"h-5 w-5\" />\n </button>\n <div className=\"absolute bottom-5 left-1/2 flex -translate-x-1/2 gap-2\">\n {items.map((item, i) => (\n <button\n key={`${item.title}-dot-${i}`}\n type=\"button\"\n aria-label={`Go to slide ${i + 1}`}\n onClick={() => goTo(i)}\n className={`h-2 rounded-full transition-all ${i === index ? 'w-8 bg-white' : 'w-2 bg-white/55 hover:bg-white'}`}\n />\n ))}\n </div>\n </>\n )}\n </section>\n )\n}\n","import React, { useMemo, useRef } from 'react'\nimport { ChevronLeft, ChevronRight } from 'lucide-react'\nimport { getStorefrontComponents, useStorefrontConfig } from '../../config'\nimport { useProducts } from '../../hooks/useProducts'\nimport { useStorefrontActions } from '../../hooks/useStorefront'\nimport { ProductCard } from '../ProductCard'\nimport { Link } from '../../router'\nimport { TID } from '../../testids'\n\nexport interface ProductSliderProps {\n title: string\n subtitle?: string\n eyebrow?: string\n filter?: 'sale' | 'new' | 'all'\n categoryName?: string\n collection?: string\n limit?: number\n cta?: string\n href?: string\n className?: string\n}\n\nexport function ProductSlider({\n title,\n subtitle,\n eyebrow,\n filter = 'all',\n categoryName,\n collection,\n limit = 10,\n cta = 'View all',\n href,\n className = '',\n}: ProductSliderProps) {\n const config = useStorefrontConfig()\n const actions = useStorefrontActions()\n const viewportRef = useRef<HTMLDivElement>(null)\n const components = getStorefrontComponents(config)\n const ProductCardComponent = components.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 if (categoryName) list = list.filter((p) => p.categoryName === categoryName)\n if (collection) list = list.filter((p) => p.metadata?.collection === collection)\n return list.slice(0, limit)\n }, [categoryName, collection, filter, limit, products])\n\n const scroll = (direction: -1 | 1) => {\n viewportRef.current?.scrollBy({ left: direction * Math.max(320, viewportRef.current.clientWidth * 0.75), behavior: 'smooth' })\n }\n\n if (!loading && visible.length === 0) return null\n\n return (\n <section data-testid={TID.productSlider} className={`mx-auto max-w-7xl px-4 py-14 sm:px-6 ${className}`}>\n <div className=\"mb-8 flex flex-col gap-5 sm:flex-row sm:items-end sm:justify-between\">\n <div className=\"max-w-2xl\">\n {eyebrow && <p className=\"mb-2 text-xs font-semibold uppercase tracking-[0.2em] text-primary\">{eyebrow}</p>}\n <h2 className=\"sf-heading text-3xl font-normal leading-tight tracking-normal sm:text-5xl\">{title}</h2>\n {subtitle && <p className=\"mt-3 leading-7 text-muted-foreground\">{subtitle}</p>}\n </div>\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n aria-label=\"Previous products\"\n data-testid={TID.productSliderPrev}\n onClick={() => scroll(-1)}\n className=\"inline-flex h-10 w-10 items-center justify-center border border-border bg-background transition hover:bg-foreground hover:text-background\"\n >\n <ChevronLeft className=\"h-5 w-5\" />\n </button>\n <button\n type=\"button\"\n aria-label=\"Next products\"\n data-testid={TID.productSliderNext}\n onClick={() => scroll(1)}\n className=\"inline-flex h-10 w-10 items-center justify-center border border-border bg-background transition hover:bg-foreground hover:text-background\"\n >\n <ChevronRight className=\"h-5 w-5\" />\n </button>\n </div>\n </div>\n <div\n ref={viewportRef}\n data-testid={TID.productSliderViewport}\n className=\"flex snap-x gap-5 overflow-x-auto pb-5 [scrollbar-width:thin]\"\n >\n {loading\n ? Array.from({ length: Math.min(limit, 6) }, (_, i) => (\n <div key={i} className=\"h-[360px] min-w-[260px] snap-start animate-pulse bg-muted\" />\n ))\n : visible.map((product) => (\n <div key={product.id} className=\"min-w-[260px] max-w-[300px] flex-[0_0_72vw] snap-start sm:flex-[0_0_300px]\">\n <ProductCardComponent\n product={product}\n config={config}\n commerceMode={config.commerceMode}\n actions={actions}\n />\n </div>\n ))}\n </div>\n {cta && (\n <Link\n to={href ?? config.catalogPath}\n className=\"mt-4 inline-flex border border-foreground/30 px-6 py-3 text-xs font-semibold uppercase tracking-[0.16em] transition hover:bg-foreground hover:text-background\"\n >\n {cta}\n </Link>\n )}\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'\nimport { SmoothImage } from '../SmoothImage'\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 <SmoothImage\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 { StorefrontSection } from './sections'\nimport { HeroSection } from './components/sections/HeroSection'\nimport { CategoryShowcase } from './components/sections/CategoryShowcase'\nimport { ProductRail } from './components/sections/ProductRail'\nimport { MediaCarousel } from './components/sections/MediaCarousel'\nimport { ProductSlider } from './components/sections/ProductSlider'\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('mediaCarousel', MediaCarousel, { source: 'sdk', label: 'Media carousel' })\n registerBlock('categories', CategoryShowcase, { source: 'sdk', label: 'Categories' })\n registerBlock('products', ProductRail, { source: 'sdk', label: 'Product rail' })\n registerBlock('productSlider', ProductSlider, { source: 'sdk', label: 'Product slider' })\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 typed storefront section blueprint into a generic block tree. */\nexport function sectionsToBlocks(sections: readonly StorefrontSection[]): 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 { StorefrontSection } 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 StorefrontSections({ sections }: { sections: readonly StorefrontSection[] }) {\n return <main>{renderBlocks(sectionsToBlocks(sections))}</main>\n}\n\nexport function HomePage({ sections }: { sections: readonly StorefrontSection[] }) {\n return <StorefrontSections sections={sections} />\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 { getStorefrontComponents, useStorefrontConfig } from '../config'\nimport { useStorefrontActions } from '../hooks/useStorefront'\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 component 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 actions = useStorefrontActions()\n const components = getStorefrontComponents(config)\n const Card = components.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\n key={p.id}\n product={p}\n config={config}\n commerceMode={config.commerceMode}\n actions={actions}\n />\n ))}\n </div>\n </section>\n )\n}\n","import React, { useState } from 'react'\nimport { Mail, MessageCircle, Send } from 'lucide-react'\nimport { getShopProvider } from '@fayz-ai/shop/runtime'\nimport type { Product } from '@fayz-ai/shop/types'\nimport { useStorefrontConfig } from '../config'\nimport { storefrontComponentContracts } from '../component-selectors'\nimport { TID } from '../testids'\n\nexport interface ProductEnquiryFormProps {\n product: Product\n onSuccess?: () => void\n}\n\nfunction defaultSubject(prefix: string, product: Product): string {\n return `${prefix}: ${product.name}`\n}\n\nfunction buildWhatsAppHref(url: string, product: Product): string {\n const text = encodeURIComponent(`Hello, I would like more information about ${product.name}.`)\n const sep = url.includes('?') ? '&' : '?'\n return `${url}${sep}text=${text}`\n}\n\nexport function ProductEnquiryForm({ product, onSuccess }: ProductEnquiryFormProps) {\n const config = useStorefrontConfig()\n const [customerName, setCustomerName] = useState('')\n const [customerEmail, setCustomerEmail] = useState('')\n const [customerPhone, setCustomerPhone] = useState('')\n const [subject, setSubject] = useState(defaultSubject(config.enquiry.subjectPrefix, product))\n const [message, setMessage] = useState(`I would like more information about ${product.name}.`)\n const [status, setStatus] = useState<'idle' | 'submitting' | 'success' | 'error'>('idle')\n const [error, setError] = useState<string | null>(null)\n\n const submit = async (event: React.FormEvent) => {\n event.preventDefault()\n setStatus('submitting')\n setError(null)\n try {\n const provider = getShopProvider()\n if (provider.createProductEnquiry) {\n await provider.createProductEnquiry({\n productId: product.id,\n productName: product.name,\n productSlug: product.slug,\n customerName,\n customerEmail,\n customerPhone: customerPhone || undefined,\n subject,\n message,\n sourceUrl: typeof window === 'undefined' ? undefined : window.location.href,\n metadata: { sku: product.sku, categoryName: product.categoryName },\n })\n } else if (config.enquiry.email) {\n window.location.href = `mailto:${config.enquiry.email}?subject=${encodeURIComponent(subject)}&body=${encodeURIComponent(message)}`\n }\n setStatus('success')\n onSuccess?.()\n } catch (e) {\n setStatus('error')\n setError(e instanceof Error ? e.message : String(e))\n }\n }\n\n return (\n <form\n {...storefrontComponentContracts.productDetail.enquiryForm}\n onSubmit={submit}\n className=\"space-y-4\"\n >\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <label className=\"space-y-1.5 text-sm font-medium\">\n <span>Your name</span>\n <input\n data-testid={TID.enquiryName}\n required\n value={customerName}\n onChange={(e) => setCustomerName(e.target.value)}\n className=\"w-full border bg-background px-3 py-2 outline-none focus:border-primary\"\n style={{ borderRadius: 'var(--sf-radius-input)' }}\n />\n </label>\n <label className=\"space-y-1.5 text-sm font-medium\">\n <span>Your email</span>\n <input\n data-testid={TID.enquiryEmail}\n required\n type=\"email\"\n value={customerEmail}\n onChange={(e) => setCustomerEmail(e.target.value)}\n className=\"w-full border bg-background px-3 py-2 outline-none focus:border-primary\"\n style={{ borderRadius: 'var(--sf-radius-input)' }}\n />\n </label>\n </div>\n <label className=\"block space-y-1.5 text-sm font-medium\">\n <span>Phone{config.enquiry.requirePhone ? '' : ' (optional)'}</span>\n <input\n data-testid={TID.enquiryPhone}\n required={config.enquiry.requirePhone}\n value={customerPhone}\n onChange={(e) => setCustomerPhone(e.target.value)}\n className=\"w-full border bg-background px-3 py-2 outline-none focus:border-primary\"\n style={{ borderRadius: 'var(--sf-radius-input)' }}\n />\n </label>\n <label className=\"block space-y-1.5 text-sm font-medium\">\n <span>Subject</span>\n <input\n data-testid={TID.enquirySubject}\n required\n value={subject}\n onChange={(e) => setSubject(e.target.value)}\n className=\"w-full border bg-background px-3 py-2 outline-none focus:border-primary\"\n style={{ borderRadius: 'var(--sf-radius-input)' }}\n />\n </label>\n <label className=\"block space-y-1.5 text-sm font-medium\">\n <span>Message</span>\n <textarea\n data-testid={TID.enquiryMessage}\n required\n rows={5}\n value={message}\n onChange={(e) => setMessage(e.target.value)}\n className=\"w-full resize-none border bg-background px-3 py-2 outline-none focus:border-primary\"\n style={{ borderRadius: 'var(--sf-radius-input)' }}\n />\n </label>\n <div className=\"flex flex-wrap items-center gap-3\">\n <button\n data-testid={TID.enquirySubmit}\n type=\"submit\"\n disabled={status === 'submitting'}\n className=\"sf-cta inline-flex items-center gap-2 bg-primary px-5 py-3 font-semibold text-primary-foreground disabled:cursor-wait disabled:opacity-60\"\n style={{ borderRadius: 'var(--sf-radius-button)' }}\n >\n <Send className=\"h-4 w-4\" />\n {status === 'submitting' ? 'Sending...' : 'Send enquiry'}\n </button>\n {config.enquiry.whatsappUrl && (\n <a\n href={buildWhatsAppHref(config.enquiry.whatsappUrl, product)}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"inline-flex items-center gap-2 border px-5 py-3 text-sm font-semibold transition-colors hover:bg-muted\"\n style={{ borderRadius: 'var(--sf-radius-button)' }}\n >\n <MessageCircle className=\"h-4 w-4\" />\n WhatsApp\n </a>\n )}\n {config.enquiry.email && (\n <a\n href={`mailto:${config.enquiry.email}?subject=${encodeURIComponent(subject)}&body=${encodeURIComponent(message)}`}\n className=\"inline-flex items-center gap-2 border px-5 py-3 text-sm font-semibold transition-colors hover:bg-muted\"\n style={{ borderRadius: 'var(--sf-radius-button)' }}\n >\n <Mail className=\"h-4 w-4\" />\n Email\n </a>\n )}\n </div>\n {status === 'success' && (\n <p data-testid={TID.enquirySuccess} className=\"text-sm font-medium text-emerald-600\">\n {config.enquiry.successMessage}\n </p>\n )}\n {error && (\n <p data-testid={TID.enquiryError} className=\"text-sm font-medium text-red-600\">\n {error}\n </p>\n )}\n </form>\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 { getStorefrontComponents, useStorefrontConfig } from '../config'\nimport { useStorefrontHead } from '../hooks/useStorefrontHead'\nimport { useStorefrontActions } from '../hooks/useStorefront'\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 { ProductEnquiryForm } from '../components/ProductEnquiryForm'\nimport { SmoothImage } from '../components/SmoothImage'\nimport { getProductOptionGroups, type ProductOptionSelection } from '../product-options'\nimport { storefrontComponentContracts } from '../component-selectors'\nimport { TID } from '../testids'\n\nexport function ProductDetailPage({ slug }: { slug: string }) {\n const config = useStorefrontConfig()\n const actions = useStorefrontActions()\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 components = getStorefrontComponents(config)\n const ProductDetailComponent = components.ProductDetail\n const addToCart = () => addItem(product, qty, selectedOptions)\n const openEnquiry = () => {\n document.getElementById('storefront-product-enquiry')?.scrollIntoView({ behavior: 'smooth', block: 'start' })\n }\n const discountPct =\n product.compareAtPrice && product.compareAtPrice > product.price\n ? Math.round((1 - product.price / product.compareAtPrice) * 100)\n : 0\n\n if (ProductDetailComponent) {\n return (\n <ProductDetailComponent\n product={product}\n config={config}\n commerceMode={config.commerceMode}\n primaryImage={image}\n optionGroups={optionGroups}\n selectedOptions={selectedOptions}\n setSelectedOptions={setSelectedOptions}\n quantity={qty}\n setQuantity={setQty}\n soldOut={soldOut}\n lowStock={lowStock}\n actions={actions}\n addToCart={addToCart}\n openEnquiry={openEnquiry}\n />\n )\n }\n\n return (\n <main {...storefrontComponentContracts.productDetail.root} 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\n {...storefrontComponentContracts.productDetail.gallery}\n className=\"group overflow-hidden border bg-muted\"\n style={{ borderRadius: 'var(--sf-radius-card)' }}\n >\n {image && (\n <SmoothImage\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 {config.commerceMode === 'checkout' && (\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\n <p data-testid={TID.pdpDescription} className=\"mt-5 leading-relaxed text-muted-foreground\">\n {product.description}\n </p>\n\n {config.commerceMode === 'checkout' && (\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\n <ProductOptionSelector\n groups={optionGroups}\n value={selectedOptions}\n onChange={setSelectedOptions}\n />\n\n <div {...storefrontComponentContracts.productDetail.actions} className=\"mt-8\">\n {config.commerceMode === 'checkout' ? (\n <div className=\"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={addToCart}\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 ) : config.commerceMode === 'enquiry' ? (\n <button\n type=\"button\"\n {...storefrontComponentContracts.productDetail.enquiryButton}\n onClick={openEnquiry}\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 {config.enquiry.label}\n </button>\n ) : (\n <Link\n to={config.catalogPath}\n className=\"inline-flex border px-5 py-3 text-sm font-semibold transition-colors hover:bg-muted\"\n style={{ borderRadius: 'var(--sf-radius-button)' }}\n >\n Voltar ao catálogo\n </Link>\n )}\n </div>\n\n {config.commerceMode === 'checkout' && (\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 )}\n </div>\n </div>\n\n {config.commerceMode === 'enquiry' && (\n <section id=\"storefront-product-enquiry\" className=\"mt-12 border-t pt-10\">\n <div className=\"mx-auto max-w-3xl\">\n <h2 className=\"sf-heading text-2xl font-semibold\">Need more information?</h2>\n <p className=\"mt-2 text-muted-foreground\">Send an enquiry about this product.</p>\n <div className=\"mt-6\">\n <ProductEnquiryForm product={product} />\n </div>\n </div>\n </section>\n )}\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 provider 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 // Prefer the RPC seam — anon storefronts have no UPDATE grant on the\n // orders table, so a direct updateOrder 401s on pool backends.\n if (provider.confirmPayment) await provider.confirmPayment(order.id)\n else 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'\nimport { SmoothImage } from '../components/SmoothImage'\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 && <SmoothImage 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'\nimport { SmoothImage } from '../components/SmoothImage'\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 && <SmoothImage 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'\nimport { SmoothImage } from '../components/SmoothImage'\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 && <SmoothImage 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, getShopProvider } 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 type { ShopProvider } from '@fayz-ai/shop/provider'\nimport { initCustomerAuth, resolveAuthAdapter } from './auth'\nimport { getStorefrontComponents, StorefrontConfigProvider, resolveConfig, useStorefrontConfig } from './config'\nimport type { StorefrontConfig, StorefrontDiscountConfig } from './config'\nimport type { StorefrontComponents } from './component-contracts'\nimport type { StorefrontSection } from './sections'\nimport { useHashPath, matchPath } from './router'\nimport { useCartStore } from './stores/cart.store'\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) && config.features.checkout) return <CheckoutPage />\n if (matchPath('/account', path) && config.features.accounts) 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 if (resolveConfig(config).features.accounts) {\n initCustomerAuth(resolveAuthAdapter(config.auth, {\n supabaseUrl: config.supabaseUrl,\n supabaseAnonKey: config.supabaseAnonKey,\n }))\n }\n\n if (config.provider) {\n setShopProvider(config.provider)\n } else {\n setShopProvider(createMockShopProvider(buildMockSeed(config)))\n }\n\n // Drop any persisted cart line the active backend can't resolve (e.g. a cart\n // built in an earlier mock-mode session, whose ids don't exist live) so stale\n // ids never reach checkout and 400 the order. Keeps a line on any error so a\n // transient failure never discards a valid item. Runs AFTER the persisted cart\n // has hydrated — zustand/persist rehydrates asynchronously, so reconciling at\n // init would see an empty cart and no-op.\n const reconcileCart = () => {\n const provider = getShopProvider()\n void useCartStore.getState().reconcile(async (line) => {\n const product = await provider.getProduct(line.productId)\n return product != null\n })\n }\n if (useCartStore.persist.hasHydrated()) reconcileCart()\n else useCartStore.persist.onFinishHydration(reconcileCart)\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 const components = getStorefrontComponents(config)\n const chromeProps = { config, commerceMode: config.commerceMode }\n const body = (\n <>\n {config.theme && <StorefrontThemeStyle theme={config.theme} />}\n {!focused &&\n (components.Header ? <components.Header {...chromeProps} /> : <StorefrontHeader />)}\n <StorefrontErrorBoundary key={path}>\n <RouteSwitch path={path} />\n </StorefrontErrorBoundary>\n {!focused && config.features.cart && <CartDrawer />}\n {!focused &&\n (components.Footer ? <components.Footer {...chromeProps} /> : <StorefrontFooter />)}\n <Toaster />\n </>\n )\n\n if (components.Shell) {\n return (\n <components.Shell {...chromeProps}>\n {body}\n </components.Shell>\n )\n }\n\n return (\n <div className=\"min-h-screen bg-background text-foreground\">\n {body}\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\nexport interface CreateStorefrontOptions {\n config: StorefrontConfig\n provider?: ShopProvider\n components?: StorefrontComponents\n routes?: StorefrontConfig['routes']\n pages?: StorefrontConfig['routes']\n sections?: readonly StorefrontSection[]\n}\n\nexport function createStorefront(options: CreateStorefrontOptions): React.ComponentType {\n const routes = [...(options.pages ?? []), ...(options.routes ?? [])]\n const config: StorefrontConfig = {\n ...options.config,\n provider: options.provider ?? options.config.provider,\n components: {\n ...options.config.components,\n ...options.components,\n },\n routes: routes.length > 0 ? routes : options.config.routes,\n home: options.sections\n ? { ...(options.config.home ?? { sections: [] }), sections: options.sections }\n : options.config.home,\n }\n\n return createStorefrontApp(config)\n}\n","import type {\n StorefrontConfig,\n StorefrontRouteDefinition,\n} from './config'\nimport type { StorefrontComponents } from './component-contracts'\nimport type { StorefrontSection } from './sections'\nimport type { CreateStorefrontOptions } from './createStorefrontApp'\n\n/**\n * Identity helpers for generated/custom storefronts.\n *\n * They do not add runtime behavior; they make the intended client-app shape\n * explicit and keep TypeScript inference tight across config, components, routes,\n * sections and app creation options.\n */\nexport function defineStorefrontConfig<const T extends StorefrontConfig>(config: T): T {\n return config\n}\n\nexport function defineStorefrontComponents<const T extends StorefrontComponents>(components: T): T {\n return components\n}\n\nexport function defineStorefrontRoutes<const T extends readonly StorefrontRouteDefinition[]>(routes: T): T {\n return routes\n}\n\nexport function defineStorefrontSections<const T extends readonly StorefrontSection[]>(sections: T): T {\n return sections\n}\n\nexport function defineStorefrontApp<const T extends CreateStorefrontOptions>(options: T): T {\n return options\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 components: runtimeConfig?.components,\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\n/** food — warm appetizing delivery (steakhouse / burger / comfort food): dark inviting\n * header, ember CTA, cream canvas, rounded cards, menu-first home with \"mais pedidos\"\n * rail and social proof. Built for restaurant/food stores — override to go fully dark. */\nexport const foodTemplate: StorefrontTemplate = {\n id: 'food',\n inspiration: 'Delivery / restaurant storefront',\n announcement: 'ENTREGA GRÁTIS ACIMA DE R$ 150 · PEÇA JÁ',\n theme: {\n name: 'food',\n colors: {\n background: '30 33% 97%',\n foreground: '20 14% 15%',\n primary: '14 84% 50%',\n primaryForeground: '0 0% 100%',\n card: '30 33% 99%',\n cardForeground: '20 14% 15%',\n muted: '28 20% 92%',\n mutedForeground: '22 10% 42%',\n border: '28 18% 85%',\n headerBackground: '20 14% 11%',\n headerForeground: '30 24% 96%',\n announcementBackground: '14 84% 50%',\n announcementForeground: '0 0% 100%',\n },\n font: { heading: 'Poppins', body: 'Inter' },\n radius: 'round',\n header: { variant: 'classic' },\n productCard: { style: 'card', imageAspect: 'square' },\n },\n home: (storeName, images) => ({\n sections: [\n {\n type: 'hero',\n variant: 'banner',\n height: 'tall',\n slides: [\n { title: 'Sabor de verdade, na sua porta', subtitle: `${storeName} — feito na hora, do jeito que você ama.`, cta: 'Ver cardápio', href: '/catalog', hue: 20, image: images?.hero?.[0] },\n ],\n },\n {\n type: 'benefits',\n items: [\n { icon: 'Flame', title: 'Feito na hora', text: 'Preparado com capricho' },\n { icon: 'Truck', title: 'Entrega rápida', text: 'Frete grátis acima de R$ 150' },\n { icon: 'CreditCard', title: 'Pagamento fácil', text: 'Pix, cartão e mais' },\n ],\n },\n { type: 'categories', style: 'tiles', title: 'Nosso cardápio' },\n { type: 'products', title: 'Mais pedidos', eyebrow: 'favoritos da casa', filter: 'all', limit: 8 },\n { type: 'banner', title: 'Combo do dia', eyebrow: 'oferta', subtitle: 'Seleção especial com desconto', cta: 'Aproveitar', hue: 14, image: images?.banners?.[0] },\n { type: 'products', title: 'Novidades no cardápio', filter: 'new', limit: 4 },\n {\n type: 'testimonials',\n title: 'O que dizem por aí',\n items: [\n { quote: 'Chegou quentinho e absurdo de bom. Virei cliente!', author: 'Rafael M.' },\n { quote: 'Sabor de restaurante em casa, sem complicação.', author: 'Beatriz L.' },\n { quote: 'Entrega rápida e porção generosa. Recomendo demais.', author: 'Diego S.' },\n ],\n },\n { type: 'newsletter', title: 'Receba nossas ofertas', subtitle: 'Promoções e novidades do cardápio, direto no seu e-mail.' },\n ],\n }),\n}\n\nexport const storefrontTemplates = {\n mare: mareTemplate,\n sertao: sertaoTemplate,\n volt: voltTemplate,\n atelier: atelierTemplate,\n food: foodTemplate,\n} as const\n\nexport type StorefrontTemplateId = keyof typeof storefrontTemplates\n"]}
1
+ {"version":3,"sources":["../src/stores/session.store.ts","../src/auth.ts","../src/config.ts","../src/router.ts","../src/format.ts","../src/stores/delivery.store.ts","../src/product-options.ts","../src/stores/cart.store.ts","../src/theme.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/DeliveryEstimator.tsx","../src/components/SmoothImage.tsx","../src/components/CartDrawer.tsx","../src/hooks/useProducts.ts","../src/components/Price.tsx","../src/component-selectors.ts","../src/hooks/useStorefront.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/MediaCarousel.tsx","../src/components/sections/ProductSlider.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/components/ProductEnquiryForm.tsx","../src/components/ProductGallery.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/define.ts","../src/scaffold.tsx","../src/presets.ts"],"names":["create","persist","createAuthRuntime","adapter","setShopAccessTokenResolver","createMockAuthAdapter","getShopProvider","createContext","useContext","hashRouterAdapter","useState","useEffect","React","normalizePostalCode","lookupPostalCode","useRef","jsx","slug","jsxs","X","Phone","Mail","Search","initial","User","UserCircle","Package","CreditCard","LogOut","ShoppingBag","Fragment","useCallback","validateDiscount","toast","Minus","Plus","formatPostalCode","Truck","MapPin","Trash2","useMemo","ChevronLeft","ChevronRight","LucideIcons","registerBlock","Send","MessageCircle","current","RefreshCcw","ShieldCheck","Lock","PackageCheck","Icon","error","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 {\n createAuthRuntime,\n createMockAuthAdapter,\n type AuthPluginOptions,\n} from '@fayz-ai/plugin-auth'\nimport { getShopProvider } from '@fayz-ai/shop/runtime'\nimport { setShopAccessTokenResolver } from '@fayz-ai/sdk/shop'\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' | (string & {})\n\nexport interface StorefrontAuthConfig {\n adapter?: AuthPluginOptions['adapter']\n provider?: AuthPluginOptions['provider']\n routes?: AuthPluginOptions['routes']\n supabase?: AuthPluginOptions['supabase']\n}\n\nlet _adapter: AuthAdapter | null = null\n\nfunction isAuthAdapter(value: unknown): value is AuthAdapter {\n return Boolean(\n value &&\n typeof value === 'object' &&\n 'getSession' in value &&\n 'signIn' in value &&\n 'signOut' in value,\n )\n}\n\nfunction normalizeAuthConfig(\n configured: StorefrontAuthAdapter | StorefrontAuthConfig | undefined,\n): StorefrontAuthConfig {\n if (!configured) return {}\n if (typeof configured === 'string' || isAuthAdapter(configured)) return { adapter: configured }\n return configured\n}\n\nexport function resolveAuthAdapter(\n configured: StorefrontAuthAdapter | StorefrontAuthConfig | undefined,\n fallback?: { supabaseUrl?: string; supabaseAnonKey?: string },\n): AuthAdapter {\n const config = normalizeAuthConfig(configured)\n return createAuthRuntime({\n provider: config.provider ?? config.adapter ?? (fallback?.supabaseUrl ? 'supabase' : 'mock'),\n adapter: config.adapter,\n routes: config.routes,\n requireAuth: false,\n supabase: {\n url: config.supabase?.url ?? fallback?.supabaseUrl,\n anonKey: config.supabase?.anonKey ?? fallback?.supabaseAnonKey,\n client: config.supabase?.client,\n callbackUrl: config.supabase?.callbackUrl,\n resetPasswordUrl: config.supabase?.resetPasswordUrl,\n },\n }).adapter\n}\n\n// The shopper's current access token, handed to the shop REST client so its\n// requests reach PostgREST as the signed-in user instead of as `anon`. Held\n// here rather than in the session store because it is a credential: it must not\n// be persisted to localStorage alongside the customer id. The Supabase client\n// owns its own refresh; this is only a mirror of the live value.\nlet _accessToken: string | null = null\n\n/** Whether an authenticated identity was ever seen this session. Distinguishes\n * \"signed out\" from \"was never signed in\" — see the onAuthStateChange guard. */\nlet _hadAuthUser = false\n\n/** Refresh the mirrored token from the adapter. Safe to call on any event. */\nasync function syncAccessToken(adapter: AuthAdapter): Promise<void> {\n try {\n const existing = await adapter.getSession()\n _accessToken = existing?.session.accessToken ?? null\n } catch {\n _accessToken = null\n }\n}\n\n/** Called once by createStorefrontApp. Restores any persisted session. */\nexport function initCustomerAuth(adapter: AuthAdapter): void {\n _adapter = adapter\n\n // Registered before the first await so no request can slip out anonymously\n // while the session is still being restored.\n setShopAccessTokenResolver(() => _accessToken)\n\n adapter\n .getSession()\n .then((existing) => {\n _accessToken = existing?.session.accessToken ?? null\n if (!existing) return\n _hadAuthUser = true\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\n adapter.onAuthStateChange((user) => {\n if (!user) {\n _accessToken = null\n // Only tear down the shop session if there WAS an authenticated identity\n // to lose. The Supabase adapter fires this once on boot with a null user\n // (INITIAL_SESSION), and clearing unconditionally wiped the guest's local\n // session on every page load — a guest who checked out could no longer\n // find their order after a reload. The mock adapter never surfaced this\n // because it always restored a session.\n if (_hadAuthUser) {\n _hadAuthUser = false\n useSessionStore.getState().signOut()\n }\n return\n }\n _hadAuthUser = true\n // Covers token refresh too, not just sign-in: the callback carries the user\n // but not the token, and a stale token would 401 every read an hour in.\n void syncAccessToken(adapter)\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 // Before linkCustomer, not after: linkCustomer calls shop_resolve_customer,\n // which reads auth.uid() to fill auth_user_id. Sent with the old token that\n // link silently no-ops and the account stays unlinked forever.\n _accessToken = session.accessToken ?? null\n _hadAuthUser = true\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 _accessToken = session.accessToken ?? null\n _hadAuthUser = true\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 _accessToken = null\n _hadAuthUser = false\n useSessionStore.getState().signOut()\n }\n}\n","import React, { createContext, useContext } from 'react'\nimport type { ShopProvider } from '@fayz-ai/shop/provider'\nimport type { MockShopSeed } from '@fayz-ai/shop/mock'\nimport type { PaymentMethodKind } from '@fayz-ai/shop/types'\nimport type { StorefrontTheme } from './theme'\nimport type { HomeConfig, NavLink, FooterConfig } from './sections'\nimport type { StorefrontAuthConfig } from './auth'\nimport type { StorefrontComponents } from './component-contracts'\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'\nexport type StorefrontCommerceMode = 'checkout' | 'catalog' | 'enquiry'\nexport type StorefrontImageLoadingMode = 'fade' | 'none'\n\nexport interface StorefrontImageLoadingConfig {\n mode?: StorefrontImageLoadingMode\n durationMs?: number\n easing?: string\n blur?: boolean\n}\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 StorefrontDiscountConfig {\n code: string\n percent: number\n title?: string\n}\n\nexport interface StorefrontEnquiryConfig {\n label?: string\n successMessage?: string\n subjectPrefix?: string\n email?: string\n whatsappUrl?: string\n requirePhone?: boolean\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 /** Checkout-first default, catalog-only browsing, or product enquiry flow. */\n commerceMode?: StorefrontCommerceMode\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?: StorefrontAuthConfig\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?: {\n mode?: 'mock' | 'pix-mercadopago'\n /**\n * Which methods the checkout offers. Declaring them is what lets the order\n * record how the buyer intends to pay instead of assuming 'credit_card',\n * which is what it did while the card form was a simulation.\n */\n methods?: readonly PaymentMethodKind[]\n }\n /** Product enquiry behavior for catalog/enquiry stores. */\n enquiry?: StorefrontEnquiryConfig\n /** Feature toggles — defaults depend on commerceMode. */\n features?: { discounts?: boolean; accounts?: boolean; cart?: boolean; checkout?: boolean }\n /** Global storefront image reveal behavior. Default is a soft fade. */\n imageLoading?: StorefrontImageLoadingConfig\n /** Code-level component replacements. Kept out of serialized manifests. */\n components?: StorefrontComponents\n /** Code-level route overrides/custom routes. Kept out of serialized manifests. */\n routes?: readonly 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'; methods: readonly PaymentMethodKind[] }\n commerceMode: StorefrontCommerceMode\n enquiry: Required<Pick<StorefrontEnquiryConfig, 'label' | 'successMessage' | 'subjectPrefix'>> &\n Omit<StorefrontEnquiryConfig, 'label' | 'successMessage' | 'subjectPrefix'>\n features: { discounts: boolean; accounts: boolean; cart: boolean; checkout: boolean }\n imageLoading: Required<StorefrontImageLoadingConfig>\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 const commerceMode = config.commerceMode ?? 'checkout'\n const checkoutEnabled = commerceMode === 'checkout'\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: {\n mode: config.payments?.mode ?? 'mock',\n methods: config.payments?.methods?.length ? config.payments.methods : ['pix', 'credit_card', 'cash'],\n },\n commerceMode,\n enquiry: {\n label: config.enquiry?.label ?? 'Contact me',\n successMessage: config.enquiry?.successMessage ?? 'Thanks. We received your enquiry.',\n subjectPrefix: config.enquiry?.subjectPrefix ?? 'Product enquiry',\n email: config.enquiry?.email,\n whatsappUrl: config.enquiry?.whatsappUrl,\n requirePhone: config.enquiry?.requirePhone,\n },\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 ?? checkoutEnabled,\n cart: config.features?.cart ?? checkoutEnabled,\n checkout: config.features?.checkout ?? checkoutEnabled,\n },\n imageLoading: {\n mode: config.imageLoading?.mode ?? 'fade',\n durationMs: config.imageLoading?.durationMs ?? 420,\n easing: config.imageLoading?.easing ?? 'cubic-bezier(0.22, 1, 0.36, 1)',\n blur: config.imageLoading?.blur ?? 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\nexport function useStorefrontConfigOptional(): ResolvedStorefrontConfig | null {\n return useContext(StorefrontConfigContext)\n}\n\nexport function getStorefrontComponents(config: ResolvedStorefrontConfig): StorefrontComponents {\n return config.components ?? {}\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","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 { create } from 'zustand'\nimport { persist } from 'zustand/middleware'\nimport { lookupPostalCode, normalizePostalCode, type PostalAddress } from '@fayz-ai/core'\nimport { getShopProvider } from '@fayz-ai/shop/runtime'\nimport type { ShippingQuoteOption } from '@fayz-ai/shop/types'\n\n/**\n * Where the shopper wants it delivered, decided before the cart exists.\n *\n * Two different things live here and they are persisted differently on purpose:\n *\n * the ADDRESS is durable — a CEP maps to the same street for years, and\n * carrying it to checkout is the whole point (the buyer types the number and\n * nothing else);\n *\n * the QUOTE is not persisted at all. It is a price, and a price restored from\n * localStorage is a price the shopper can edit with devtools. It is re-asked\n * on demand, and resolved for the current cart through resolveOptionRate —\n * the same rule shop_shipping_for applies — so it can never go stale. The\n * order is charged from shop_place_order, which recomputes from the same\n * zones and ignores anything the client sends.\n */\n\nexport type DeliveryStatus = 'idle' | 'loading' | 'served' | 'unserved' | 'error'\n\nexport interface DeliveryState {\n postalCode: string\n address: PostalAddress | null\n options: ShippingQuoteOption[]\n selectedZoneId: string | null\n status: DeliveryStatus\n error: string | null\n\n /** Look the CEP up and quote it. `subtotal` decides free-above thresholds. */\n resolve: (postalCode: string, subtotal: number) => Promise<void>\n selectZone: (zoneId: string) => void\n clear: () => void\n}\n\nconst EMPTY = {\n postalCode: '',\n address: null,\n options: [] as ShippingQuoteOption[],\n selectedZoneId: null,\n status: 'idle' as DeliveryStatus,\n error: null,\n}\n\nexport const useDeliveryStore = create<DeliveryState>()(\n persist(\n (set, get) => ({\n ...EMPTY,\n\n async resolve(postalCode: string, subtotal: number) {\n const code = normalizePostalCode(postalCode)\n if (code.length !== 8) {\n set({ ...EMPTY, postalCode, status: 'error', error: 'Digite os 8 dígitos do CEP.' })\n return\n }\n\n set({ postalCode: code, status: 'loading', error: null })\n\n // The QUOTE comes first and is the answer that matters. Whether we\n // deliver to a postcode, and for how much, is decided entirely by our\n // own zones against eight digits — it does not need to know the street.\n //\n // Doing it the other way round made the delivery answer depend on a\n // third party: with ViaCEP slow or rate-limited, a perfectly serviceable\n // address reported an error instead of a price.\n let options: ShippingQuoteOption[] = []\n try {\n options = (await getShopProvider().quoteShipping?.(code, subtotal)) ?? []\n } catch {\n set({ ...EMPTY, postalCode: code, status: 'error',\n error: 'Não foi possível calcular o frete agora. Tente de novo.' })\n return\n }\n\n // The ADDRESS is the convenience layer: it saves the buyer typing, and\n // losing it costs typing, not the sale. Failures here never change the\n // delivery verdict already decided above.\n let address: PostalAddress | null = null\n let notFound = false\n try {\n address = await lookupPostalCode(code)\n notFound = address === null\n } catch {\n address = null\n }\n\n set({\n postalCode: code,\n address,\n options,\n selectedZoneId: options[0]?.zoneId ?? null,\n // A store with no zones configured quotes nothing, and that must NOT\n // read as \"we don't deliver here\" — it falls back to the store-wide\n // flat rate, which the cart already knows how to show.\n status: options.length > 0 ? 'served' : 'unserved',\n // Reported alongside the price, not instead of it: the CEP may be\n // mistyped even though its range is covered.\n error: notFound ? 'CEP não encontrado. Confira os números.' : null,\n })\n },\n\n selectZone(zoneId: string) {\n if (get().options.some((option) => option.zoneId === zoneId)) set({ selectedZoneId: zoneId })\n },\n\n clear() {\n set({ ...EMPTY })\n },\n }),\n {\n name: 'fayz.storefront.delivery.v1',\n // Deliberately NOT persisting `options`: a rehydrated\n // price would be shown as current without anything having quoted it. The\n // address survives, the money is asked for again.\n partialize: (state) => ({ postalCode: state.postalCode, address: state.address }),\n onRehydrateStorage: () => (state) => {\n if (state?.address) state.status = 'idle'\n },\n },\n ),\n)\n\n/**\n * The freight for the chosen zone at THIS subtotal, or null when there is no\n * zone in play (no CEP yet, or a store that configured none) and the caller\n * should use the store-wide rate. Null never means free.\n *\n * The free-above rule is applied here rather than trusting the `rate` the\n * server resolved, because that one was resolved for whatever the cart held at\n * quote time. Re-deriving from `baseRate`/`freeAbove` — the same CASE\n * shop_shipping_for runs — means adding an item can never leave a stale price\n * on screen. An earlier version fell back to the config flat rate when the\n * quote went stale, which showed R$ 8 (the flat rate) for an address in an\n * R$ 18 zone: shown one number, charged another.\n */\nexport function resolveOptionRate(option: ShippingQuoteOption, subtotal: number): number {\n if (option.freeAbove != null && subtotal >= option.freeAbove) return 0\n return option.baseRate\n}\n\nexport const selectQuotedShipping = (\n state: Pick<DeliveryState, 'options' | 'selectedZoneId' | 'status'>,\n subtotal: number,\n): number | null => {\n if (state.status !== 'served') return null\n const option = state.options.find((o) => o.zoneId === state.selectedZoneId) ?? state.options[0]\n return option ? resolveOptionRate(option, subtotal) : null\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 { useDeliveryStore, selectQuotedShipping } from './delivery.store'\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 /** Drop persisted lines the active backend can no longer resolve (e.g. a cart\n * built in an earlier mock-mode session, whose ids don't exist live). The\n * resolver returns false only for a definitive \"not found\"; on error it must\n * return true so a transient failure never discards a legit line. */\n reconcile(resolve: (line: CartLine) => Promise<boolean>): Promise<void>\n}\n\nexport const useCartStore = create<CartState>()(\n persist(\n (set, get) => ({\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 reconcile: async (resolve) => {\n const lines = get().lines\n if (lines.length === 0) return\n const keep = await Promise.all(\n lines.map((line) => resolve(line).catch(() => true)),\n )\n const kept = lines.filter((_, i) => keep[i])\n if (kept.length !== lines.length) set({ lines: kept })\n },\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\n/**\n * Freight to display.\n *\n * When the shopper has given a CEP and the store quoted it, that quote wins —\n * it came from the same shipping_zones rows shop_place_order will charge from.\n * Otherwise this falls back to the store-wide rate in config, which is what\n * every storefront did before zones existed.\n *\n * The subtotal is PRE-discount on both sides of this. That is 0017's rule, and\n * the quote is requested against the same number, so a coupon can never make\n * the cart and the order disagree.\n *\n * Read through getState() rather than a hook because this is a plain selector\n * called from several screens; components that render the value subscribe to\n * useDeliveryStore themselves so a fresh quote re-renders them.\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\n const quoted = selectQuotedShipping(useDeliveryStore.getState(), subtotal)\n if (quoted != null) return quoted\n\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 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 /** Secondary brand accent (e.g. a gourmet gold beside the primary). Emitted\n * as `--sf-accent` / `--sf-accent-foreground` and the `accent` tailwind token. */\n accent?: string\n accentForeground?: 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 /** Optional oversized display face for hero words (emitted as `--sf-font-display`). */\n display?: string\n /** Optional serif accent for quotes/editorial (emitted as `--sf-font-serif`). */\n serif?: string\n /** Google Fonts families to load (defaults to heading+body+display+serif) */\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 /** Show category shortcuts after primary nav links. Default true. */\n showCategories?: boolean\n /** Show the storefront search in the header. Default true. */\n showSearch?: boolean\n /** Header search presentation: a full input ('full', default) or a compact\n * icon button that expands into an input on click ('icon'). */\n searchStyle?: 'full' | 'icon'\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 /** Brand-token passthrough. Each entry is emitted verbatim as a `--<key>` CSS\n * custom property, so a store can add gradients, glows, extra colors, or\n * letter-spacing the fixed schema doesn't enumerate — without editing the SDK.\n * e.g. { 'grad-ember': 'linear-gradient(...)', 'glow-ember': '0 0 0 1px ...' }. */\n tokens?: Record<string, string>\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 accent: '--sf-accent',\n accentForeground: '--sf-accent-foreground',\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 if (theme.font.display) lines.push(`--sf-font-display: '${theme.font.display}', ${fallback};`)\n if (theme.font.serif) lines.push(`--sf-font-serif: '${theme.font.serif}', serif;`)\n }\n\n // Brand-token passthrough — emit each entry as a raw CSS custom property.\n for (const [key, value] of Object.entries(theme.tokens ?? {})) {\n const name = key.startsWith('--') ? key : `--${key}`\n lines.push(`${name}: ${value};`)\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 =\n theme.font.googleFonts ??\n [theme.font.heading, theme.font.body, theme.font.display, theme.font.serif].filter(\n (f): f is string => Boolean(f),\n )\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","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 headerSearchToggle: 'header-search-toggle',\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 mediaCarousel: 'media-carousel',\n mediaCarouselPrev: 'media-carousel-prev',\n mediaCarouselNext: 'media-carousel-next',\n productSlider: 'product-slider',\n productSliderViewport: 'product-slider-viewport',\n productSliderPrev: 'product-slider-prev',\n productSliderNext: 'product-slider-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 pdpRoot: 'pdp-root',\n pdpGallery: 'pdp-gallery',\n pdpGalleryImage: 'pdp-gallery-image',\n pdpGalleryThumbs: 'pdp-gallery-thumbs',\n pdpGalleryThumb: 'pdp-gallery-thumb',\n pdpActions: 'pdp-actions',\n pdpEnquiryButton: 'pdp-enquiry-button',\n enquiryForm: 'enquiry-form',\n enquiryName: 'enquiry-name',\n enquiryEmail: 'enquiry-email',\n enquiryPhone: 'enquiry-phone',\n enquirySubject: 'enquiry-subject',\n enquiryMessage: 'enquiry-message',\n enquirySubmit: 'enquiry-submit',\n enquirySuccess: 'enquiry-success',\n enquiryError: 'enquiry-error',\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 // delivery estimate (product page + cart)\n deliveryEstimator: 'delivery-estimator',\n deliveryCepInput: 'delivery-cep-input',\n deliveryCepSubmit: 'delivery-cep-submit',\n deliveryOption: 'delivery-option',\n deliveryUnserved: 'delivery-unserved',\n deliveryError: 'delivery-error',\n deliveryAddress: 'delivery-address',\n deliveryClear: 'delivery-clear',\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, iconOnly = false }: { className?: string; iconOnly?: boolean }) {\n const config = useStorefrontConfig()\n const search = useCatalogStore((s) => s.search)\n const setSearch = useCatalogStore((s) => s.setSearch)\n const path = useHashPath()\n const [open, setOpen] = useState(false)\n\n // Icon-only: a compact search button that expands into the input on click and\n // collapses again on Escape / blur-when-empty.\n if (iconOnly && !open) {\n return (\n <button\n type=\"button\"\n aria-label=\"Buscar produtos\"\n data-testid={TID.headerSearchToggle}\n onClick={() => setOpen(true)}\n className=\"rounded-full p-2.5 transition-opacity hover:opacity-70\"\n >\n <Search className=\"h-5 w-5\" />\n </button>\n )\n }\n\n return (\n <div className={`relative ${iconOnly ? 'w-full max-w-xs' : (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 autoFocus={iconOnly}\n onChange={(e) => {\n setSearch(e.target.value)\n if (path !== config.catalogPath) navigateTo(config.catalogPath)\n }}\n onKeyDown={(e) => {\n if (e.key === 'Escape' && iconOnly) setOpen(false)\n }}\n onBlur={() => {\n if (iconOnly && !search) setOpen(false)\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 {config.features.cart && (\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 )}\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 const showCategories = config.theme?.header?.showCategories !== false\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 min-w-max 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 {showCategories &&\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 showSearch = config.theme?.header?.showSearch !== false\n const iconSearch = config.theme?.header?.searchStyle === 'icon'\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 {showSearch ? <SearchInput iconOnly={iconSearch} className=\"hidden w-full max-w-xs sm:block\" /> : <div />}\n <div className=\"text-center\">{logo}</div>\n <div className=\"justify-self-end\">\n <HeaderActions />\n </div>\n </div>\n <div className=\"flex overflow-x-auto border-t py-2.5 sm:justify-center\" 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 {showSearch ? <SearchInput iconOnly={iconSearch} className=\"hidden w-full max-w-sm sm:block\" /> : <div />}\n <div className=\"text-center\">{logo}</div>\n <div className=\"justify-self-end\">\n <HeaderActions />\n </div>\n </div>\n <div className=\"overflow-x-auto border-t\" 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 {showSearch && <SearchInput iconOnly={iconSearch} className=\"hidden w-44 lg:block\" />}\n <HeaderActions />\n </div>\n </div>\n ) : (\n // classic: logo left, nav, then a right-aligned search + actions cluster\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 <div className=\"ml-auto flex items-center gap-2 sm:gap-3\">\n {showSearch && <SearchInput iconOnly={iconSearch} className={iconSearch ? '' : 'hidden w-full max-w-sm sm:block'} />}\n <HeaderActions />\n </div>\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 const labels = {\n categories: 'Departamentos',\n navigation: 'Navegação',\n contact: 'Contato',\n viewAll: 'Ver todos',\n purchases: 'Minhas compras',\n privacy: 'Privacidade',\n terms: 'Termos',\n returns: 'Trocas e devoluções',\n ...config.footer?.labels,\n }\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\">{labels.categories}</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 {labels.viewAll} ({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\">{labels.navigation}</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 {config.features.accounts && (\n <li>\n <Link to=\"/account\" className=\"transition-opacity hover:opacity-70\">{labels.purchases}</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\">{labels.contact}</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\">{labels.privacy}</Link>\n <Link to=\"/terms\" className=\"transition-colors hover:text-foreground\">{labels.terms}</Link>\n <Link to=\"/refunds\" className=\"transition-colors hover:text-foreground\">{labels.returns}</Link>\n </nav>\n <p className=\"text-center\">\n {config.footer?.credit ?? <>© {config.name} — powered by Fayz</>}\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, { useState } from 'react'\nimport { MapPin, Truck } from 'lucide-react'\nimport { formatPostalCode } from '@fayz-ai/core'\nimport { useDeliveryStore, resolveOptionRate } from '../stores/delivery.store'\nimport { useCartStore, selectSubtotal } from '../stores/cart.store'\nimport { useStorefrontConfig } from '../config'\nimport { formatMoney } from '../format'\nimport { TID } from '../testids'\n\n/**\n * \"Do you deliver to me, for how much, and when\" — asked on the product page,\n * before the shopper has invested anything in a cart.\n *\n * The CEP is kept in the delivery store, so the answer follows them to the cart\n * and lands at checkout with street/district/city/UF already filled. That is\n * the actual payoff: the buyer types a house number instead of an address.\n *\n * `subtotal` is the PRE-discount cart subtotal, the same number shop_place_order\n * uses to resolve free-above thresholds. Quoting against anything else is how\n * the cart and the order end up disagreeing (see migration 0017).\n */\nexport function DeliveryEstimator({ compact = false }: { compact?: boolean }) {\n const config = useStorefrontConfig()\n const cart = useCartStore()\n const delivery = useDeliveryStore()\n const [draft, setDraft] = useState(() => formatPostalCode(delivery.postalCode))\n\n const subtotal = selectSubtotal(cart)\n const money = (value: number) => formatMoney(value, config.currency, config.locale)\n const loading = delivery.status === 'loading'\n\n async function submit(event: React.FormEvent) {\n event.preventDefault()\n await delivery.resolve(draft, subtotal)\n }\n\n function eta(option: { etaMinDays?: number; etaMaxDays?: number }): string | null {\n const { etaMinDays: min, etaMaxDays: max } = option\n if (min == null && max == null) return null\n if (min === 0 && (max === 0 || max === 1)) return 'hoje ou amanhã'\n if (min != null && max != null && min !== max) return `${min} a ${max} dias úteis`\n return `${max ?? min} dia(s) útil(eis)`\n }\n\n return (\n <section\n data-testid={TID.deliveryEstimator}\n className={compact ? 'rounded-lg border p-3' : 'mt-6 rounded-lg border p-4'}\n >\n <div className=\"flex items-center gap-2 text-sm font-semibold\">\n <Truck className=\"h-4 w-4 text-primary\" />\n Calcular entrega\n </div>\n\n <form onSubmit={submit} className=\"mt-3 flex gap-2\">\n <input\n data-testid={TID.deliveryCepInput}\n aria-label=\"CEP\"\n inputMode=\"numeric\"\n autoComplete=\"postal-code\"\n placeholder=\"00000-000\"\n value={draft}\n onChange={(event) => setDraft(formatPostalCode(event.target.value))}\n className=\"min-w-0 flex-1 rounded-lg border bg-background px-3 py-2 text-sm outline-none transition focus:border-primary focus:ring-2 focus:ring-primary/10\"\n />\n <button\n type=\"submit\"\n data-testid={TID.deliveryCepSubmit}\n disabled={loading}\n className=\"shrink-0 rounded-lg bg-primary px-4 py-2 text-sm font-semibold text-primary-foreground transition hover:opacity-90 disabled:opacity-50\"\n >\n {loading ? '...' : 'Calcular'}\n </button>\n </form>\n\n {/* Shown whenever there is one, including alongside a price: the range\n may be covered even though the CEP itself was mistyped. */}\n {delivery.error && (\n <p data-testid={TID.deliveryError} className=\"mt-3 text-sm text-destructive\">\n {delivery.error}\n </p>\n )}\n\n {delivery.address && (\n <p data-testid={TID.deliveryAddress} className=\"mt-3 flex items-start gap-1.5 text-xs text-muted-foreground\">\n <MapPin className=\"mt-0.5 h-3.5 w-3.5 shrink-0\" />\n <span>\n {[delivery.address.street, delivery.address.district].filter(Boolean).join(', ')}\n {delivery.address.street || delivery.address.district ? ' — ' : ''}\n {delivery.address.city}/{delivery.address.state}\n </span>\n </p>\n )}\n\n {delivery.status === 'served' && (\n <ul className=\"mt-3 space-y-2\">\n {delivery.options.map((option) => {\n const selected = delivery.selectedZoneId === option.zoneId\n const label = eta(option)\n // Resolved for the cart as it stands right now, not for whatever it\n // held when the CEP was typed — the same rule the server applies.\n const rate = resolveOptionRate(option, subtotal)\n return (\n <li key={option.zoneId}>\n <button\n type=\"button\"\n data-testid={TID.deliveryOption}\n data-zone={option.zoneId}\n data-rate={rate.toFixed(2)}\n aria-pressed={selected}\n onClick={() => delivery.selectZone(option.zoneId)}\n className={`flex w-full items-center justify-between gap-3 rounded-lg border px-3 py-2 text-left text-sm transition ${\n selected ? 'border-primary bg-primary/5' : 'border-border hover:bg-muted/40'\n }`}\n >\n <span className=\"min-w-0\">\n <span className=\"block truncate font-medium\">\n {option.carrier ? `${option.carrier} · ${option.name}` : option.name}\n </span>\n {label && <span className=\"block text-xs text-muted-foreground\">{label}</span>}\n </span>\n <span className=\"shrink-0 font-semibold\">\n {rate === 0 ? 'Grátis' : money(rate)}\n </span>\n </button>\n </li>\n )\n })}\n </ul>\n )}\n\n {/*\n No options for a valid address. For a store that configured zones this\n means \"outside our delivery area\" and checkout will refuse the order, so\n it is said plainly here rather than at the end of the funnel. A store\n with no zones at all never reaches this state — it quotes nothing and\n keeps its flat rate.\n */}\n {delivery.status === 'unserved' && (\n <p data-testid={TID.deliveryUnserved} className=\"mt-3 text-sm text-destructive\">\n Ainda não entregamos nesse CEP.\n </p>\n )}\n\n {delivery.postalCode && (\n <button\n type=\"button\"\n data-testid={TID.deliveryClear}\n onClick={() => { delivery.clear(); setDraft('') }}\n className=\"mt-3 text-xs text-muted-foreground underline-offset-2 hover:underline\"\n >\n Trocar CEP\n </button>\n )}\n </section>\n )\n}\n","import React from 'react'\nimport { useStorefrontConfigOptional, type StorefrontImageLoadingConfig } from '../config'\n\nexport interface SmoothImageProps extends React.ImgHTMLAttributes<HTMLImageElement> {\n imageLoading?: StorefrontImageLoadingConfig\n}\n\nexport function SmoothImage({\n imageLoading,\n loading = 'lazy',\n decoding = 'async',\n onLoad,\n style,\n ...props\n}: SmoothImageProps) {\n const config = useStorefrontConfigOptional()\n const resolved = {\n ...config?.imageLoading,\n ...imageLoading,\n }\n const mode = resolved.mode ?? 'fade'\n const durationMs = resolved.durationMs ?? 420\n const easing = resolved.easing ?? 'cubic-bezier(0.22, 1, 0.36, 1)'\n const blur = resolved.blur ?? true\n const ref = React.useRef<HTMLImageElement | null>(null)\n const [loaded, setLoaded] = React.useState(mode === 'none')\n\n React.useEffect(() => {\n if (mode === 'none') {\n setLoaded(true)\n return\n }\n if (ref.current?.complete && ref.current.naturalWidth > 0) setLoaded(true)\n }, [mode, props.src])\n\n const revealStyle: React.CSSProperties =\n mode === 'none'\n ? {}\n : {\n opacity: loaded ? 1 : 0,\n filter: blur && !loaded ? 'blur(10px)' : 'blur(0px)',\n transition: `opacity ${durationMs}ms ${easing}, filter ${durationMs}ms ${easing}, transform ${durationMs}ms ${easing}`,\n }\n\n return (\n <img\n {...props}\n ref={ref}\n loading={loading}\n decoding={decoding}\n data-sf-image-loaded={loaded ? 'true' : 'false'}\n style={{ ...style, ...revealStyle }}\n onLoad={(event) => {\n setLoaded(true)\n onLoad?.(event)\n }}\n />\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 { formatPostalCode } from '@fayz-ai/core'\nimport { useDeliveryStore } from '../stores/delivery.store'\nimport { DeliveryEstimator } from './DeliveryEstimator'\nimport { TID } from '../testids'\nimport { SmoothImage } from './SmoothImage'\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 // Subscribed, not just read: selectShipping consults this store through\n // getState(), which does not subscribe, so without this hook a fresh quote\n // would change the price and leave the drawer showing the old one.\n const delivery = useDeliveryStore()\n\n const subtotal = selectSubtotal(cart)\n const discountTotal = selectDiscountTotal(cart)\n const shipping = selectShipping(cart, config)\n\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 <SmoothImage 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 {/* Second chance to give a CEP for anyone who added to cart from\n the catalogue and never opened a product page. */}\n <div className=\"mb-3\">\n <DeliveryEstimator compact />\n </div>\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\">\n Frete\n {delivery.status === 'served' && delivery.postalCode && (\n <span className=\"ml-1 text-xs\">\n · {formatPostalCode(delivery.postalCode)}\n </span>\n )}\n </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 components must preserve.\n *\n * Apps can fully customize the visual tree, but replacement components still\n * need these anchors so smoke tests, QA, and agents can operate stores.\n */\nexport const productCardComponentContract = {\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 storefrontComponentContracts = {\n productCard: productCardComponentContract,\n productDetail: {\n root: { 'data-testid': TID.pdpRoot },\n gallery: { 'data-testid': TID.pdpGallery },\n name: { 'data-testid': TID.pdpName },\n description: { 'data-testid': TID.pdpDescription },\n actions: { 'data-testid': TID.pdpActions },\n addButton: { 'data-testid': TID.pdpAddToCart },\n enquiryButton: { 'data-testid': TID.pdpEnquiryButton },\n enquiryForm: { 'data-testid': TID.enquiryForm },\n },\n} as const\n\nexport type ProductCardComponentContract = typeof productCardComponentContract\nexport type ProductDetailComponentContract = typeof storefrontComponentContracts.productDetail\n","import { getShopProvider } from '@fayz-ai/shop/runtime'\nimport type { CreateProductEnquiryInput } from '@fayz-ai/shop/types'\nimport { useStorefrontConfig } from '../config'\nimport { navigateTo } from '../router'\nimport { useCatalogStore } from '../stores/catalog.store'\nimport { useCartStore } from '../stores/cart.store'\nimport type { ProductOptionSelection } from '../product-options'\nimport type { Product } from '@fayz-ai/shop/types'\n\nexport function useStorefront() {\n return useStorefrontConfig()\n}\n\nexport function useCatalog() {\n const config = useStorefrontConfig()\n const catalog = useCatalogStore()\n return {\n ...catalog,\n catalogPath: config.catalogPath,\n config,\n }\n}\n\nexport function useCart() {\n return useCartStore()\n}\n\nexport function useEnquiry() {\n const config = useStorefrontConfig()\n const createProductEnquiry = async (input: CreateProductEnquiryInput) => {\n const provider = getShopProvider()\n if (!provider.createProductEnquiry) {\n throw new Error('The active shop provider does not support product enquiries.')\n }\n return provider.createProductEnquiry(input)\n }\n\n return {\n enquiry: config.enquiry,\n createProductEnquiry,\n }\n}\n\nexport function useStorefrontActions() {\n const addItem = useCartStore((state) => state.addItem)\n const openDrawer = useCartStore((state) => state.openDrawer)\n const closeDrawer = useCartStore((state) => state.closeDrawer)\n const { createProductEnquiry } = useEnquiry()\n\n return {\n navigateTo,\n addToCart: (product: Product, quantity?: number, options?: ProductOptionSelection) =>\n addItem(product, quantity, options),\n openCart: openDrawer,\n closeCart: closeDrawer,\n createProductEnquiry,\n }\n}\n","import React from 'react'\nimport { ShoppingBag } from 'lucide-react'\nimport { useStorefrontConfig } from '../config'\nimport { Link, navigateTo } from '../router'\nimport { getProductOptionGroups } from '../product-options'\nimport { Price } from './Price'\nimport { TID } from '../testids'\nimport { productCardComponentContract } from '../component-selectors'\nimport { useStorefrontActions } from '../hooks/useStorefront'\nimport type { ProductCardProps } from '../component-contracts'\nimport { SmoothImage } from './SmoothImage'\n\nexport function ProductCard({ product, config: providedConfig, actions: providedActions }: ProductCardProps) {\n const runtimeConfig = useStorefrontConfig()\n const runtimeActions = useStorefrontActions()\n const config = providedConfig ?? runtimeConfig\n const actions = providedActions ?? runtimeActions\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 const purchaseMode = config.commerceMode === 'checkout'\n\n return (\n <div\n {...productCardComponentContract.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 <SmoothImage\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 {...productCardComponentContract.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 gap-3 pt-2\">\n {purchaseMode ? (\n <Price\n value={product.price}\n compareAt={product.compareAtPrice}\n testId={productCardComponentContract.priceTestId}\n />\n ) : (\n <span data-testid={productCardComponentContract.priceTestId} className=\"text-sm text-muted-foreground\">\n {config.commerceMode === 'enquiry' ? config.enquiry.label : 'Ver detalhes'}\n </span>\n )}\n <button\n type=\"button\"\n {...productCardComponentContract.addButton}\n disabled={purchaseMode && soldOut}\n aria-label={\n purchaseMode\n ? hasOptions\n ? `Escolher opções de ${product.name}`\n : `Adicionar ${product.name} ao carrinho`\n : `${config.enquiry.label} ${product.name}`\n }\n onClick={() => {\n if (!purchaseMode) {\n navigateTo(`/product/${product.slug}`)\n return\n }\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 actions.addToCart(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 { getStorefrontComponents, useStorefrontConfig } from '../config'\nimport { useStorefrontActions } from '../hooks/useStorefront'\nimport { TID } from '../testids'\n\nexport function ProductGrid({ products, loading }: { products: Product[]; loading: boolean }) {\n const config = useStorefrontConfig()\n const actions = useStorefrontActions()\n const components = getStorefrontComponents(config)\n const ProductCardComponent = components.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\n key={p.id}\n product={p}\n config={config}\n commerceMode={config.commerceMode}\n actions={actions}\n />\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'\nimport type React from 'react'\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 interface MediaCarouselItem {\n title: string\n subtitle?: string\n eyebrow?: string\n cta?: string\n href?: string\n image: string\n imageAlt?: string\n align?: 'start' | 'center' | 'end'\n}\n\nexport type StorefrontSection =\n | { type: 'hero'; variant: HeroVariant; slides: HeroSlide[]; height?: 'tall' | 'medium' }\n | {\n type: 'mediaCarousel'\n items: MediaCarouselItem[]\n height?: 'medium' | 'tall' | 'screen'\n autoplayMs?: number\n overlay?: 'dark' | 'soft' | 'none'\n className?: string\n }\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 | {\n type: 'productSlider'\n title: string\n subtitle?: string\n eyebrow?: string\n filter?: 'sale' | 'new' | 'all'\n categoryName?: string\n collection?: string\n limit?: number\n cta?: string\n href?: string\n className?: string\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\n/** @deprecated Use StorefrontSection. Kept for existing generated stores. */\nexport type HomeSection = StorefrontSection\n\nexport interface HomeConfig {\n sections: readonly StorefrontSection[]\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 credit?: React.ReactNode\n labels?: {\n categories?: string\n navigation?: string\n contact?: string\n viewAll?: string\n purchases?: string\n privacy?: string\n terms?: string\n returns?: string\n }\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 { useStorefrontConfig } from '../../config'\nimport { prefersReducedMotion } from '../../motion'\nimport { Link } from '../../router'\nimport { TID } from '../../testids'\nimport { SmoothImage } from '../SmoothImage'\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 [loadedSlides, setLoadedSlides] = useState<Record<number, boolean>>({})\n const config = useStorefrontConfig()\n const interacted = useRef(false)\n const hClass = height === 'tall' ? 'h-[72vh] min-h-[440px]' : 'h-[48vh] min-h-[340px]'\n const revealImages = config.imageLoading.mode !== 'none'\n const revealStyle = (loaded: boolean): React.CSSProperties | undefined =>\n revealImages\n ? {\n filter: config.imageLoading.blur && !loaded ? 'blur(10px)' : 'blur(0px)',\n transition: `opacity 700ms ease, filter ${config.imageLoading.durationMs}ms ${config.imageLoading.easing}`,\n }\n : undefined\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 <SmoothImage\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 loading={i === 0 ? 'eager' : 'lazy'}\n decoding=\"async\"\n onLoad={() => setLoadedSlides((current) => ({ ...current, [i]: true }))}\n style={revealStyle(Boolean(loadedSlides[i]))}\n className={`absolute inset-0 h-full w-full object-cover transition-opacity duration-700 ${\n i === index && (!revealImages || loadedSlides[i]) ? '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'\nimport { SmoothImage } from '../SmoothImage'\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 <SmoothImage\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 <SmoothImage\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 { getStorefrontComponents, useStorefrontConfig } from '../../config'\nimport { useStorefrontActions } from '../../hooks/useStorefront'\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 actions = useStorefrontActions()\n const components = getStorefrontComponents(config)\n const ProductCardComponent = components.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\n product={p}\n config={config}\n commerceMode={config.commerceMode}\n actions={actions}\n />\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, { useEffect, useRef, useState } from 'react'\nimport { ChevronLeft, ChevronRight } from 'lucide-react'\nimport { Link } from '../../router'\nimport { TID } from '../../testids'\nimport { prefersReducedMotion } from '../../motion'\nimport type { MediaCarouselItem } from '../../sections'\nimport { useStorefrontConfig } from '../../config'\n\nexport interface MediaCarouselProps {\n items: MediaCarouselItem[]\n height?: 'medium' | 'tall' | 'screen'\n autoplayMs?: number\n overlay?: 'dark' | 'soft' | 'none'\n className?: string\n}\n\nconst heightClass = {\n medium: 'h-[58vh] min-h-[420px]',\n tall: 'h-[74vh] min-h-[520px]',\n screen: 'min-h-[calc(100vh-64px)]',\n}\n\nconst alignClass = {\n start: 'items-start text-left',\n center: 'items-center text-center',\n end: 'items-end text-right',\n}\n\nexport function MediaCarousel({\n items,\n height = 'tall',\n autoplayMs = 7000,\n overlay = 'dark',\n className = '',\n}: MediaCarouselProps) {\n const [index, setIndex] = useState(0)\n const [loadedItems, setLoadedItems] = useState<Record<number, boolean>>({})\n const config = useStorefrontConfig()\n const interacted = useRef(false)\n const revealImages = config.imageLoading.mode !== 'none'\n const revealStyle = (loaded: boolean): React.CSSProperties | undefined =>\n revealImages\n ? {\n filter: config.imageLoading.blur && !loaded ? 'blur(10px)' : 'blur(0px)',\n transition: `opacity 700ms ease, filter ${config.imageLoading.durationMs}ms ${config.imageLoading.easing}`,\n }\n : undefined\n\n useEffect(() => {\n if (items.length < 2 || autoplayMs <= 0 || prefersReducedMotion()) return\n const timer = setInterval(() => {\n if (!interacted.current) setIndex((i) => (i + 1) % items.length)\n }, autoplayMs)\n return () => clearInterval(timer)\n }, [autoplayMs, items.length])\n\n if (items.length === 0) return null\n\n const active = items[Math.min(index, items.length - 1)]!\n const goTo = (next: number) => {\n interacted.current = true\n setIndex((next + items.length) % items.length)\n }\n const overlayClass =\n overlay === 'dark'\n ? 'bg-gradient-to-r from-black/70 via-black/25 to-black/25'\n : overlay === 'soft'\n ? 'bg-gradient-to-t from-black/45 via-black/10 to-transparent'\n : ''\n\n return (\n <section data-testid={TID.mediaCarousel} className={`relative isolate overflow-hidden ${heightClass[height]} ${className}`}>\n {items.map((item, i) => (\n <img\n key={`${item.title}-${i}`}\n src={item.image}\n alt={item.imageAlt ?? item.title}\n aria-hidden={i !== index}\n loading={i === 0 ? 'eager' : 'lazy'}\n decoding=\"async\"\n onLoad={() => setLoadedItems((current) => ({ ...current, [i]: true }))}\n style={revealStyle(Boolean(loadedItems[i]))}\n className={`absolute inset-0 -z-10 h-full w-full object-cover transition-opacity duration-700 ${\n i === index && (!revealImages || loadedItems[i]) ? 'opacity-100' : 'opacity-0'\n }`}\n />\n ))}\n <div className={`absolute inset-0 -z-10 ${overlayClass}`} />\n <div className={`flex h-full px-5 py-16 sm:px-10 lg:px-16 ${alignClass[active.align ?? 'start']}`}>\n <div className=\"my-auto max-w-2xl text-white drop-shadow-md\">\n {active.eyebrow && (\n <p className=\"mb-4 text-xs font-semibold uppercase tracking-[0.24em] text-white/80\">{active.eyebrow}</p>\n )}\n <h1 className=\"sf-heading text-5xl font-normal leading-[0.95] sm:text-7xl lg:text-8xl\">{active.title}</h1>\n {active.subtitle && <p className=\"mt-5 max-w-xl text-base leading-8 text-white/88 sm:text-lg\">{active.subtitle}</p>}\n {active.cta && (\n <Link\n to={active.href ?? '/catalog'}\n className=\"mt-8 inline-flex border border-white/75 px-6 py-3 text-xs font-semibold uppercase tracking-[0.18em] text-white transition hover:bg-white hover:text-black\"\n >\n {active.cta}\n </Link>\n )}\n </div>\n </div>\n {items.length > 1 && (\n <>\n <button\n type=\"button\"\n aria-label=\"Previous slide\"\n data-testid={TID.mediaCarouselPrev}\n onClick={() => goTo(index - 1)}\n className=\"absolute left-4 top-1/2 inline-flex h-10 w-10 -translate-y-1/2 items-center justify-center border border-white/60 bg-black/20 text-white backdrop-blur transition hover:bg-white hover:text-black\"\n >\n <ChevronLeft className=\"h-5 w-5\" />\n </button>\n <button\n type=\"button\"\n aria-label=\"Next slide\"\n data-testid={TID.mediaCarouselNext}\n onClick={() => goTo(index + 1)}\n className=\"absolute right-4 top-1/2 inline-flex h-10 w-10 -translate-y-1/2 items-center justify-center border border-white/60 bg-black/20 text-white backdrop-blur transition hover:bg-white hover:text-black\"\n >\n <ChevronRight className=\"h-5 w-5\" />\n </button>\n <div className=\"absolute bottom-5 left-1/2 flex -translate-x-1/2 gap-2\">\n {items.map((item, i) => (\n <button\n key={`${item.title}-dot-${i}`}\n type=\"button\"\n aria-label={`Go to slide ${i + 1}`}\n onClick={() => goTo(i)}\n className={`h-2 rounded-full transition-all ${i === index ? 'w-8 bg-white' : 'w-2 bg-white/55 hover:bg-white'}`}\n />\n ))}\n </div>\n </>\n )}\n </section>\n )\n}\n","import React, { useMemo, useRef } from 'react'\nimport { ChevronLeft, ChevronRight } from 'lucide-react'\nimport { getStorefrontComponents, useStorefrontConfig } from '../../config'\nimport { useProducts } from '../../hooks/useProducts'\nimport { useStorefrontActions } from '../../hooks/useStorefront'\nimport { ProductCard } from '../ProductCard'\nimport { Link } from '../../router'\nimport { TID } from '../../testids'\n\nexport interface ProductSliderProps {\n title: string\n subtitle?: string\n eyebrow?: string\n filter?: 'sale' | 'new' | 'all'\n categoryName?: string\n collection?: string\n limit?: number\n cta?: string\n href?: string\n className?: string\n}\n\nexport function ProductSlider({\n title,\n subtitle,\n eyebrow,\n filter = 'all',\n categoryName,\n collection,\n limit = 10,\n cta = 'View all',\n href,\n className = '',\n}: ProductSliderProps) {\n const config = useStorefrontConfig()\n const actions = useStorefrontActions()\n const viewportRef = useRef<HTMLDivElement>(null)\n const components = getStorefrontComponents(config)\n const ProductCardComponent = components.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 if (categoryName) list = list.filter((p) => p.categoryName === categoryName)\n if (collection) list = list.filter((p) => p.metadata?.collection === collection)\n return list.slice(0, limit)\n }, [categoryName, collection, filter, limit, products])\n\n const scroll = (direction: -1 | 1) => {\n viewportRef.current?.scrollBy({ left: direction * Math.max(320, viewportRef.current.clientWidth * 0.75), behavior: 'smooth' })\n }\n\n if (!loading && visible.length === 0) return null\n\n return (\n <section data-testid={TID.productSlider} className={`mx-auto max-w-7xl px-4 py-14 sm:px-6 ${className}`}>\n <div className=\"mb-8 flex flex-col gap-5 sm:flex-row sm:items-end sm:justify-between\">\n <div className=\"max-w-2xl\">\n {eyebrow && <p className=\"mb-2 text-xs font-semibold uppercase tracking-[0.2em] text-primary\">{eyebrow}</p>}\n <h2 className=\"sf-heading text-3xl font-normal leading-tight tracking-normal sm:text-5xl\">{title}</h2>\n {subtitle && <p className=\"mt-3 leading-7 text-muted-foreground\">{subtitle}</p>}\n </div>\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n aria-label=\"Previous products\"\n data-testid={TID.productSliderPrev}\n onClick={() => scroll(-1)}\n className=\"inline-flex h-10 w-10 items-center justify-center border border-border bg-background transition hover:bg-foreground hover:text-background\"\n >\n <ChevronLeft className=\"h-5 w-5\" />\n </button>\n <button\n type=\"button\"\n aria-label=\"Next products\"\n data-testid={TID.productSliderNext}\n onClick={() => scroll(1)}\n className=\"inline-flex h-10 w-10 items-center justify-center border border-border bg-background transition hover:bg-foreground hover:text-background\"\n >\n <ChevronRight className=\"h-5 w-5\" />\n </button>\n </div>\n </div>\n <div\n ref={viewportRef}\n data-testid={TID.productSliderViewport}\n className=\"flex snap-x gap-5 overflow-x-auto pb-5 [scrollbar-width:thin]\"\n >\n {loading\n ? Array.from({ length: Math.min(limit, 6) }, (_, i) => (\n <div key={i} className=\"h-[360px] min-w-[260px] snap-start animate-pulse bg-muted\" />\n ))\n : visible.map((product) => (\n <div key={product.id} className=\"min-w-[260px] max-w-[300px] flex-[0_0_72vw] snap-start sm:flex-[0_0_300px]\">\n <ProductCardComponent\n product={product}\n config={config}\n commerceMode={config.commerceMode}\n actions={actions}\n />\n </div>\n ))}\n </div>\n {cta && (\n <Link\n to={href ?? config.catalogPath}\n className=\"mt-4 inline-flex border border-foreground/30 px-6 py-3 text-xs font-semibold uppercase tracking-[0.16em] transition hover:bg-foreground hover:text-background\"\n >\n {cta}\n </Link>\n )}\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'\nimport { SmoothImage } from '../SmoothImage'\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 <SmoothImage\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 { StorefrontSection } from './sections'\nimport { HeroSection } from './components/sections/HeroSection'\nimport { CategoryShowcase } from './components/sections/CategoryShowcase'\nimport { ProductRail } from './components/sections/ProductRail'\nimport { MediaCarousel } from './components/sections/MediaCarousel'\nimport { ProductSlider } from './components/sections/ProductSlider'\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('mediaCarousel', MediaCarousel, { source: 'sdk', label: 'Media carousel' })\n registerBlock('categories', CategoryShowcase, { source: 'sdk', label: 'Categories' })\n registerBlock('products', ProductRail, { source: 'sdk', label: 'Product rail' })\n registerBlock('productSlider', ProductSlider, { source: 'sdk', label: 'Product slider' })\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 typed storefront section blueprint into a generic block tree. */\nexport function sectionsToBlocks(sections: readonly StorefrontSection[]): 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 { StorefrontSection } 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 StorefrontSections({ sections }: { sections: readonly StorefrontSection[] }) {\n return <main>{renderBlocks(sectionsToBlocks(sections))}</main>\n}\n\nexport function HomePage({ sections }: { sections: readonly StorefrontSection[] }) {\n return <StorefrontSections sections={sections} />\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 { getStorefrontComponents, useStorefrontConfig } from '../config'\nimport { useStorefrontActions } from '../hooks/useStorefront'\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 component 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 actions = useStorefrontActions()\n const components = getStorefrontComponents(config)\n const Card = components.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\n key={p.id}\n product={p}\n config={config}\n commerceMode={config.commerceMode}\n actions={actions}\n />\n ))}\n </div>\n </section>\n )\n}\n","import React, { useState } from 'react'\nimport { Mail, MessageCircle, Send } from 'lucide-react'\nimport { getShopProvider } from '@fayz-ai/shop/runtime'\nimport type { Product } from '@fayz-ai/shop/types'\nimport { useStorefrontConfig } from '../config'\nimport { storefrontComponentContracts } from '../component-selectors'\nimport { TID } from '../testids'\n\nexport interface ProductEnquiryFormProps {\n product: Product\n onSuccess?: () => void\n}\n\nfunction defaultSubject(prefix: string, product: Product): string {\n return `${prefix}: ${product.name}`\n}\n\nfunction buildWhatsAppHref(url: string, product: Product): string {\n const text = encodeURIComponent(`Hello, I would like more information about ${product.name}.`)\n const sep = url.includes('?') ? '&' : '?'\n return `${url}${sep}text=${text}`\n}\n\nexport function ProductEnquiryForm({ product, onSuccess }: ProductEnquiryFormProps) {\n const config = useStorefrontConfig()\n const [customerName, setCustomerName] = useState('')\n const [customerEmail, setCustomerEmail] = useState('')\n const [customerPhone, setCustomerPhone] = useState('')\n const [subject, setSubject] = useState(defaultSubject(config.enquiry.subjectPrefix, product))\n const [message, setMessage] = useState(`I would like more information about ${product.name}.`)\n const [status, setStatus] = useState<'idle' | 'submitting' | 'success' | 'error'>('idle')\n const [error, setError] = useState<string | null>(null)\n\n const submit = async (event: React.FormEvent) => {\n event.preventDefault()\n setStatus('submitting')\n setError(null)\n try {\n const provider = getShopProvider()\n if (provider.createProductEnquiry) {\n await provider.createProductEnquiry({\n productId: product.id,\n productName: product.name,\n productSlug: product.slug,\n customerName,\n customerEmail,\n customerPhone: customerPhone || undefined,\n subject,\n message,\n sourceUrl: typeof window === 'undefined' ? undefined : window.location.href,\n metadata: { sku: product.sku, categoryName: product.categoryName },\n })\n } else if (config.enquiry.email) {\n window.location.href = `mailto:${config.enquiry.email}?subject=${encodeURIComponent(subject)}&body=${encodeURIComponent(message)}`\n }\n setStatus('success')\n onSuccess?.()\n } catch (e) {\n setStatus('error')\n setError(e instanceof Error ? e.message : String(e))\n }\n }\n\n return (\n <form\n {...storefrontComponentContracts.productDetail.enquiryForm}\n onSubmit={submit}\n className=\"space-y-4\"\n >\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <label className=\"space-y-1.5 text-sm font-medium\">\n <span>Your name</span>\n <input\n data-testid={TID.enquiryName}\n required\n value={customerName}\n onChange={(e) => setCustomerName(e.target.value)}\n className=\"w-full border bg-background px-3 py-2 outline-none focus:border-primary\"\n style={{ borderRadius: 'var(--sf-radius-input)' }}\n />\n </label>\n <label className=\"space-y-1.5 text-sm font-medium\">\n <span>Your email</span>\n <input\n data-testid={TID.enquiryEmail}\n required\n type=\"email\"\n value={customerEmail}\n onChange={(e) => setCustomerEmail(e.target.value)}\n className=\"w-full border bg-background px-3 py-2 outline-none focus:border-primary\"\n style={{ borderRadius: 'var(--sf-radius-input)' }}\n />\n </label>\n </div>\n <label className=\"block space-y-1.5 text-sm font-medium\">\n <span>Phone{config.enquiry.requirePhone ? '' : ' (optional)'}</span>\n <input\n data-testid={TID.enquiryPhone}\n required={config.enquiry.requirePhone}\n value={customerPhone}\n onChange={(e) => setCustomerPhone(e.target.value)}\n className=\"w-full border bg-background px-3 py-2 outline-none focus:border-primary\"\n style={{ borderRadius: 'var(--sf-radius-input)' }}\n />\n </label>\n <label className=\"block space-y-1.5 text-sm font-medium\">\n <span>Subject</span>\n <input\n data-testid={TID.enquirySubject}\n required\n value={subject}\n onChange={(e) => setSubject(e.target.value)}\n className=\"w-full border bg-background px-3 py-2 outline-none focus:border-primary\"\n style={{ borderRadius: 'var(--sf-radius-input)' }}\n />\n </label>\n <label className=\"block space-y-1.5 text-sm font-medium\">\n <span>Message</span>\n <textarea\n data-testid={TID.enquiryMessage}\n required\n rows={5}\n value={message}\n onChange={(e) => setMessage(e.target.value)}\n className=\"w-full resize-none border bg-background px-3 py-2 outline-none focus:border-primary\"\n style={{ borderRadius: 'var(--sf-radius-input)' }}\n />\n </label>\n <div className=\"flex flex-wrap items-center gap-3\">\n <button\n data-testid={TID.enquirySubmit}\n type=\"submit\"\n disabled={status === 'submitting'}\n className=\"sf-cta inline-flex items-center gap-2 bg-primary px-5 py-3 font-semibold text-primary-foreground disabled:cursor-wait disabled:opacity-60\"\n style={{ borderRadius: 'var(--sf-radius-button)' }}\n >\n <Send className=\"h-4 w-4\" />\n {status === 'submitting' ? 'Sending...' : 'Send enquiry'}\n </button>\n {config.enquiry.whatsappUrl && (\n <a\n href={buildWhatsAppHref(config.enquiry.whatsappUrl, product)}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"inline-flex items-center gap-2 border px-5 py-3 text-sm font-semibold transition-colors hover:bg-muted\"\n style={{ borderRadius: 'var(--sf-radius-button)' }}\n >\n <MessageCircle className=\"h-4 w-4\" />\n WhatsApp\n </a>\n )}\n {config.enquiry.email && (\n <a\n href={`mailto:${config.enquiry.email}?subject=${encodeURIComponent(subject)}&body=${encodeURIComponent(message)}`}\n className=\"inline-flex items-center gap-2 border px-5 py-3 text-sm font-semibold transition-colors hover:bg-muted\"\n style={{ borderRadius: 'var(--sf-radius-button)' }}\n >\n <Mail className=\"h-4 w-4\" />\n Email\n </a>\n )}\n </div>\n {status === 'success' && (\n <p data-testid={TID.enquirySuccess} className=\"text-sm font-medium text-emerald-600\">\n {config.enquiry.successMessage}\n </p>\n )}\n {error && (\n <p data-testid={TID.enquiryError} className=\"text-sm font-medium text-red-600\">\n {error}\n </p>\n )}\n </form>\n )\n}\n","import React, { useEffect, useRef, useState } from 'react'\nimport type { ProductImage } from '@fayz-ai/shop/types'\nimport type { ProductGalleryProps } from '../component-contracts'\nimport { SmoothImage } from './SmoothImage'\nimport { TID } from '../testids'\nimport { storefrontComponentContracts } from '../component-selectors'\n\n/**\n * Product gallery: one framed image, hover-to-zoom, and a thumbnail strip when\n * the product has more than one photo.\n *\n * It replaces a bare <img> that rendered only the primary image. Three things\n * were wrong with that:\n *\n * · the frame was a grid child with the default `stretch`, so it grew to the\n * height of the (much taller) details column and left a slab of empty dark\n * box under a square photo;\n * · `plg_shop_product_images` has always been a collection with sort_order and\n * is_primary, and every extra photo a merchant uploaded was invisible;\n * · zooming is table stakes for anything sold by its looks — food especially.\n *\n * Zoom is pointer-driven: the transform origin follows the cursor, so the part\n * under the pointer is the part magnified. Disabled on coarse pointers, where\n * there is no hover and a stuck 2× would just be a broken image.\n */\nexport function ProductGallery({ product, images, primaryImage }: ProductGalleryProps) {\n const ordered = orderImages(images, primaryImage)\n const [index, setIndex] = useState(0)\n const [zoom, setZoom] = useState<{ x: number; y: number } | null>(null)\n const frameRef = useRef<HTMLDivElement>(null)\n const canHover = useCanHover()\n\n // A different product (client-side navigation) must not keep the previous\n // product's selected slide.\n useEffect(() => { setIndex(0); setZoom(null) }, [product.id])\n\n const current = ordered[Math.min(index, ordered.length - 1)]\n\n function trackPointer(event: React.MouseEvent<HTMLDivElement>) {\n if (!canHover) return\n const frame = frameRef.current\n if (!frame) return\n const rect = frame.getBoundingClientRect()\n setZoom({\n x: ((event.clientX - rect.left) / rect.width) * 100,\n y: ((event.clientY - rect.top) / rect.height) * 100,\n })\n }\n\n function step(delta: number) {\n if (ordered.length < 2) return\n setIndex((current) => (current + delta + ordered.length) % ordered.length)\n setZoom(null)\n }\n\n return (\n <div className=\"flex flex-col gap-3 self-start\">\n <div\n {...storefrontComponentContracts.productDetail.gallery}\n ref={frameRef}\n // `self-start` above and a fixed aspect here: the frame is sized by the\n // image, never by whatever the column beside it happens to contain.\n className=\"group relative aspect-square w-full overflow-hidden border bg-muted\"\n style={{ borderRadius: 'var(--sf-radius-card)' }}\n onMouseMove={trackPointer}\n onMouseLeave={() => setZoom(null)}\n onKeyDown={(event) => {\n if (event.key === 'ArrowRight') step(1)\n if (event.key === 'ArrowLeft') step(-1)\n }}\n tabIndex={ordered.length > 1 ? 0 : -1}\n role={ordered.length > 1 ? 'group' : undefined}\n aria-label={ordered.length > 1 ? `Imagens de ${product.name}` : undefined}\n >\n {/*\n The transform lives on a wrapper, not on the image: SmoothImage writes\n its own inline `transition` for the load fade (SmoothImage.tsx:52,\n spread AFTER any style passed in), which would have stretched the zoom\n to 420ms and left it visibly lagging the cursor.\n */}\n {current && (\n <div\n className=\"h-full w-full transition-transform duration-150 ease-out\"\n style={zoom\n ? { transform: 'scale(2)', transformOrigin: `${zoom.x}% ${zoom.y}%` }\n : { transform: 'scale(1)' }}\n >\n <SmoothImage\n key={current.id}\n src={current.url}\n alt={current.altText ?? product.name}\n data-testid={TID.pdpGalleryImage}\n className=\"h-full w-full object-cover\"\n />\n </div>\n )}\n\n {ordered.length > 1 && (\n <>\n <GalleryArrow side=\"left\" onClick={() => step(-1)} />\n <GalleryArrow side=\"right\" onClick={() => step(1)} />\n <span className=\"pointer-events-none absolute bottom-3 right-3 rounded-full bg-black/60 px-2 py-0.5 text-[11px] font-medium text-white\">\n {index + 1}/{ordered.length}\n </span>\n </>\n )}\n </div>\n\n {ordered.length > 1 && (\n <ul data-testid={TID.pdpGalleryThumbs} className=\"flex gap-2 overflow-x-auto pb-1\">\n {ordered.map((image, position) => (\n <li key={image.id}>\n <button\n type=\"button\"\n data-testid={TID.pdpGalleryThumb}\n data-index={position}\n aria-label={`Imagem ${position + 1} de ${ordered.length}`}\n aria-current={position === index}\n onClick={() => { setIndex(position); setZoom(null) }}\n className={`h-16 w-16 shrink-0 overflow-hidden rounded-lg border transition ${\n position === index ? 'border-primary ring-2 ring-primary/20' : 'border-border opacity-70 hover:opacity-100'\n }`}\n >\n <img src={image.url} alt=\"\" className=\"h-full w-full object-cover\" loading=\"lazy\" />\n </button>\n </li>\n ))}\n </ul>\n )}\n </div>\n )\n}\n\n/** Primary first, then sort_order — the order the merchant set in the admin. */\nfunction orderImages(images: ProductImage[], primary?: ProductImage): ProductImage[] {\n const all = images.length > 0 ? images : primary ? [primary] : []\n return [...all].sort((a, b) => {\n if (a.isPrimary !== b.isPrimary) return a.isPrimary ? -1 : 1\n return (a.sortOrder ?? 0) - (b.sortOrder ?? 0)\n })\n}\n\n/**\n * Whether the device actually has a hover-capable pointer. On a phone every\n * element is permanently \"hovered\" by some emulations, which would leave the\n * photo stuck at 2× with no way back.\n */\nfunction useCanHover(): boolean {\n const [canHover, setCanHover] = useState(false)\n useEffect(() => {\n const query = window.matchMedia?.('(hover: hover) and (pointer: fine)')\n if (!query) return\n setCanHover(query.matches)\n const onChange = (event: MediaQueryListEvent) => setCanHover(event.matches)\n query.addEventListener?.('change', onChange)\n return () => query.removeEventListener?.('change', onChange)\n }, [])\n return canHover\n}\n\nfunction GalleryArrow({ side, onClick }: { side: 'left' | 'right'; onClick: () => void }) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n aria-label={side === 'left' ? 'Imagem anterior' : 'Próxima imagem'}\n className={`absolute top-1/2 z-10 flex h-9 w-9 -translate-y-1/2 items-center justify-center rounded-full bg-background/80 opacity-0 shadow-md backdrop-blur transition hover:bg-background focus:opacity-100 group-hover:opacity-100 ${\n side === 'left' ? 'left-3' : 'right-3'\n }`}\n >\n <span aria-hidden className=\"text-lg leading-none\">{side === 'left' ? '‹' : '›'}</span>\n </button>\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 { getStorefrontComponents, useStorefrontConfig } from '../config'\nimport { useStorefrontHead } from '../hooks/useStorefrontHead'\nimport { useStorefrontActions } from '../hooks/useStorefront'\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 { ProductEnquiryForm } from '../components/ProductEnquiryForm'\nimport { SmoothImage } from '../components/SmoothImage'\nimport { ProductGallery } from '../components/ProductGallery'\nimport { DeliveryEstimator } from '../components/DeliveryEstimator'\nimport { getProductOptionGroups, type ProductOptionSelection } from '../product-options'\nimport { storefrontComponentContracts } from '../component-selectors'\nimport { TID } from '../testids'\n\nexport function ProductDetailPage({ slug }: { slug: string }) {\n const config = useStorefrontConfig()\n const actions = useStorefrontActions()\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 components = getStorefrontComponents(config)\n const ProductDetailComponent = components.ProductDetail\n // Honours the ProductGallery override contract, which has existed in\n // component-contracts.ts since before any component implemented it.\n const GalleryComponent = components.ProductGallery ?? ProductGallery\n const addToCart = () => addItem(product, qty, selectedOptions)\n const openEnquiry = () => {\n document.getElementById('storefront-product-enquiry')?.scrollIntoView({ behavior: 'smooth', block: 'start' })\n }\n const discountPct =\n product.compareAtPrice && product.compareAtPrice > product.price\n ? Math.round((1 - product.price / product.compareAtPrice) * 100)\n : 0\n\n if (ProductDetailComponent) {\n return (\n <ProductDetailComponent\n product={product}\n config={config}\n commerceMode={config.commerceMode}\n primaryImage={image}\n optionGroups={optionGroups}\n selectedOptions={selectedOptions}\n setSelectedOptions={setSelectedOptions}\n quantity={qty}\n setQuantity={setQty}\n soldOut={soldOut}\n lowStock={lowStock}\n actions={actions}\n addToCart={addToCart}\n openEnquiry={openEnquiry}\n />\n )\n }\n\n return (\n <main {...storefrontComponentContracts.productDetail.root} 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 <GalleryComponent\n product={product}\n images={product.images}\n primaryImage={image}\n config={config}\n commerceMode={config.commerceMode}\n />\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 {config.commerceMode === 'checkout' && (\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\n <p data-testid={TID.pdpDescription} className=\"mt-5 leading-relaxed text-muted-foreground\">\n {product.description}\n </p>\n\n {config.commerceMode === 'checkout' && (\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\n <ProductOptionSelector\n groups={optionGroups}\n value={selectedOptions}\n onChange={setSelectedOptions}\n />\n\n <div {...storefrontComponentContracts.productDetail.actions} className=\"mt-8\">\n {config.commerceMode === 'checkout' ? (\n <div className=\"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={addToCart}\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 ) : config.commerceMode === 'enquiry' ? (\n <button\n type=\"button\"\n {...storefrontComponentContracts.productDetail.enquiryButton}\n onClick={openEnquiry}\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 {config.enquiry.label}\n </button>\n ) : (\n <Link\n to={config.catalogPath}\n className=\"inline-flex border px-5 py-3 text-sm font-semibold transition-colors hover:bg-muted\"\n style={{ borderRadius: 'var(--sf-radius-button)' }}\n >\n Voltar ao catálogo\n </Link>\n )}\n </div>\n\n {/* Asked here, before the cart exists: \"do you deliver to me and for\n how much\" is the question that decides whether this page converts,\n and it used to be answerable only at the end of checkout. */}\n {config.commerceMode === 'checkout' && <DeliveryEstimator />}\n\n {config.commerceMode === 'checkout' && (\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 )}\n </div>\n </div>\n\n {config.commerceMode === 'enquiry' && (\n <section id=\"storefront-product-enquiry\" className=\"mt-12 border-t pt-10\">\n <div className=\"mx-auto max-w-3xl\">\n <h2 className=\"sf-heading text-2xl font-semibold\">Need more information?</h2>\n <p className=\"mt-2 text-muted-foreground\">Send an enquiry about this product.</p>\n <div className=\"mt-6\">\n <ProductEnquiryForm product={product} />\n </div>\n </div>\n </section>\n )}\n\n <ProductSpecs product={product} />\n <RelatedProducts product={product} />\n </main>\n )\n}\n","import { getShopProvider } from '@fayz-ai/shop/runtime'\nimport type { Order, ShippingAddressInput, PaymentMethodKind } 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 /** Structured address; without it the order keeps only the free-text note. */\n shippingAddress?: ShippingAddressInput\n paymentMethod?: PaymentMethodKind\n markPaid?: boolean\n}\n\nexport interface PlaceStorefrontOrderResult {\n order: Order\n customerId: string\n}\n\n/**\n * `notes` is the buyer's free-text message to the store — nothing else.\n *\n * It used to double as the delivery address, from back when the order had\n * nowhere structured to put one. Now that the address is a real snapshot plus a\n * row in the address book, repeating it here only creates a second copy that\n * can disagree with the first (it did: it dropped number and district). When a\n * structured address is present, notes carries only what the customer wrote.\n */\nfunction formatDeliveryNotes(\n address: StorefrontCheckoutAddress | undefined,\n shippingAddress?: ShippingAddressInput,\n): string | undefined {\n if (address?.notes?.trim()) return address.notes.trim()\n\n // Structured address present → the order already knows where to deliver.\n if (shippingAddress) return undefined\n\n if (!address) return undefined\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 shippingAddress,\n paymentMethod,\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 provider 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, shippingAddress),\n discountCode: cart.discountCode ?? undefined,\n shippingTotal: selectShipping(cart, config),\n // Structured address + method are what populate public.addresses and the\n // transactions ledger. `notes` stays for backwards compatibility with\n // checkouts that have not been updated yet.\n shippingAddress,\n paymentMethod,\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 // Prefer the RPC seam — anon storefronts have no UPDATE grant on the\n // orders table, so a direct updateOrder 401s on pool backends.\n if (provider.confirmPayment) await provider.confirmPayment(order.id)\n else 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 } from 'lucide-react'\nimport { getShopProvider } from '@fayz-ai/shop/runtime'\nimport { formatPostalCode, normalizePostalCode, lookupPostalCode } from '@fayz-ai/core'\nimport type { CustomerAddress, PaymentMethodKind } from '@fayz-ai/shop/types'\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 { useDeliveryStore } from '../stores/delivery.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'\nimport { SmoothImage } from '../components/SmoothImage'\n\ninterface CheckoutForm {\n email: string\n name: string\n street: string\n city: string\n zip: string\n number: string\n complement: string\n district: string\n state: string\n}\n\ntype AddressMode = 'saved' | 'new'\n\n/**\n * There is no payment service provider connected, so the checkout does not ask\n * for a card number. It used to, prefilled with 4242 4242 4242 4242, and the\n * digits were validated and then thrown away — a PAN typed into React state\n * that reaches no processor is a liability with no upside. The buyer states how\n * they intend to pay; the order stays `pending` until the merchant confirms the\n * money arrived (shop_confirm_payment, which since 0019 only they can call).\n */\nconst PAYMENT_LABELS: Record<PaymentMethodKind, { label: string; hint: string }> = {\n pix: { label: 'Pix', hint: 'Você recebe a chave para pagar após confirmar o pedido' },\n credit_card: { label: 'Cartão de crédito', hint: 'Maquininha na entrega' },\n debit_card: { label: 'Cartão de débito', hint: 'Maquininha na entrega' },\n boleto: { label: 'Boleto', hint: 'Enviado por e-mail após a confirmação' },\n cash: { label: 'Dinheiro', hint: 'Pagamento na entrega' },\n other: { label: 'Combinar com a loja', hint: 'A loja entra em contato para acertar o pagamento' },\n}\n\nconst PROCESSING_STEPS = [\n { icon: Lock, label: 'Validando seus dados...' },\n { icon: PackageCheck, label: 'Registrando seu pedido...' },\n]\n\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 delivery = useDeliveryStore()\n const validateDiscount = useDiscountValidator()\n useStorefrontHead({ title: `Checkout — ${config.name}` })\n\n const paymentMethods = config.payments.methods\n const [selectedAddressId, setSelectedAddressId] = useState('new')\n const [savedAddresses, setSavedAddresses] = useState<CustomerAddress[]>([])\n // 'new' until the address book actually loads: an empty book must show an\n // empty form, never a placeholder address belonging to nobody.\n const [addressMode, setAddressMode] = useState<AddressMode>('new')\n const [paymentMethod, setPaymentMethod] = useState<PaymentMethodKind>(paymentMethods[0] ?? 'pix')\n const [form, setForm] = useState<CheckoutForm>({\n email: session.email ?? '',\n name: session.name ?? '',\n street: '',\n city: '',\n zip: '',\n number: '',\n complement: '',\n district: '',\n state: '',\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 const [zipLookup, setZipLookup] = useState<'idle' | 'loading' | 'found' | 'not-found'>('idle')\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\n const set = (key: keyof CheckoutForm) => (value: string) => setForm((current) => ({ ...current, [key]: value }))\n\n /**\n * Editing the CEP re-fetches the address and refills what the postal service\n * knows, leaving number and complement alone — those are the buyer's and must\n * survive a correction to the postcode.\n *\n * Only what the lookup can supply is overwritten. Silently keeping a stale\n * street from a previous CEP is worse than an empty one: the parcel goes to\n * the wrong place and everything on screen looks filled in.\n */\n async function setZip(value: string) {\n const masked = formatPostalCode(value)\n setForm((current) => ({ ...current, zip: masked }))\n if (normalizePostalCode(masked).length !== 8) {\n setZipLookup('idle')\n return\n }\n setZipLookup('loading')\n try {\n const found = await lookupPostalCode(masked)\n if (!found) {\n setZipLookup('not-found')\n return\n }\n setZipLookup('found')\n setForm((current) => ({\n ...current,\n street: found.street || current.street,\n district: found.district || current.district,\n city: found.city,\n state: found.state,\n }))\n } catch {\n // Offline or the provider is down — the buyer can still type it out.\n setZipLookup('idle')\n }\n }\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 // The signed-in shopper's real address book. RLS scopes it to them, so a\n // guest (or a customer whose account was never linked to an auth identity)\n // simply gets nothing back and types their address.\n useEffect(() => {\n const customerId = session.customerId\n if (!customerId) {\n setSavedAddresses([])\n setAddressMode('new')\n return\n }\n let cancelled = false\n const provider = getShopProvider()\n void provider\n .listCustomerAddresses?.(customerId)\n .then((addresses) => {\n if (cancelled || addresses.length === 0) return\n setSavedAddresses(addresses)\n applySavedAddress(addresses[0]!)\n })\n .catch(() => {})\n return () => {\n cancelled = true\n }\n }, [session.customerId])\n\n /**\n * The CEP given back on the product page lands here.\n *\n * This is the payoff of the whole delivery flow: street, district, city and\n * UF arrive filled and the buyer types a house number. It only fires when no\n * saved address was selected — a signed-in shopper's own address book still\n * wins over a postcode lookup, because it also knows their number and\n * complement, which no postal service can supply.\n */\n useEffect(() => {\n if (addressMode !== 'new') return\n const looked = delivery.address\n if (!looked) return\n setForm((current) => {\n if (current.zip.trim() || current.street.trim()) return current\n return {\n ...current,\n zip: formatPostalCode(looked.postalCode),\n street: looked.street,\n district: looked.district,\n city: looked.city,\n state: looked.state,\n }\n })\n }, [delivery.address, addressMode])\n\n function applySavedAddress(address: CustomerAddress) {\n setAddressMode('saved')\n setSelectedAddressId(address.id)\n setForm((current) => ({\n ...current,\n street: address.street,\n city: address.city,\n zip: address.postalCode,\n number: address.number ?? '',\n complement: address.complement ?? '',\n district: address.district ?? '',\n state: address.state,\n }))\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: '', number: '', complement: '', district: '', state: '' }))\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 // Number and district are required because a courier cannot deliver without\n // them; the old form collected only street/city/CEP and logistics had to guess.\n if (!form.street.trim() || !form.city.trim() || !form.zip.trim() || !form.district.trim()) {\n setError('Preencha ou selecione o endereço de entrega.')\n return false\n }\n // Called out on its own: with the CEP filling everything else, the number is\n // usually the only thing missing, and \"preencha o endereço\" sent people\n // hunting through fields that were already correct.\n if (!form.number.trim()) {\n setError('Falta o número do endereço.')\n return false\n }\n // UF is required now: 117 of the 266 addresses already in the pool have no\n // state, and a carrier cannot quote or ship without one.\n if (form.state.trim().length !== 2) {\n setError('Informe a UF com duas letras (ex.: RJ).')\n return false\n }\n // Coverage. shop_place_order refuses an unserved postal code anyway (0021),\n // so this only turns a raw SQL error into a sentence the buyer can act on —\n // the rule itself lives on the server, not here.\n if (delivery.status === 'unserved' && delivery.postalCode === normalizePostalCode(form.zip)) {\n setError('Ainda não entregamos nesse CEP. Tente outro endereço.')\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 shippingAddress: {\n postalCode: form.zip.trim(),\n street: form.street.trim(),\n number: form.number.trim() || undefined,\n complement: form.complement.trim() || undefined,\n district: form.district.trim() || undefined,\n city: form.city.trim(),\n state: form.state.trim().toUpperCase(),\n },\n // The method the buyer actually chose, which opens the ledger row in\n // public.transactions with the right kind.\n paymentMethod,\n // Never marked paid from the browser. It used to be, through an RPC that\n // was granted to anon — so any buyer holding their own order id could\n // declare it settled. The order is now born `pending` and only the\n // merchant (or a PSP webhook) can confirm the money arrived.\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\">\n {[address.street, address.number].filter(Boolean).join(', ')}\n {address.complement ? ` — ${address.complement}` : ''}\n </span>\n <span className=\"block text-muted-foreground\">\n {[address.district, address.city, address.state].filter(Boolean).join(' · ')} — {address.postalCode}\n </span>\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\">\n {savedAddresses.length > 0 ? '+ Adicionar novo endereço' : 'Informe o endereço de entrega'}\n </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 {/* CEP first, because it FILLS the fields below it. With it at\n the bottom the buyer typed street, district, city and UF by\n hand and only then reached the one field that would have\n supplied all four — and editing it later has to refill\n them, which reads as the form rewriting itself. */}\n <div className=\"grid gap-1 sm:grid-cols-[200px_1fr] sm:items-center\">\n {field('CEP', TID.checkoutZip, form.zip, setZip, {\n placeholder: 'CEP',\n inputMode: 'numeric',\n autoComplete: 'postal-code',\n })}\n <p className=\"px-1 text-xs text-muted-foreground\">\n {zipLookup === 'loading' ? 'Buscando endereço…'\n : zipLookup === 'not-found' ? 'CEP não encontrado — preencha o endereço à mão.'\n : 'Preenchemos o endereço para você.'}\n </p>\n </div>\n {field('Endereço', TID.checkoutStreet, form.street, set('street'), { placeholder: 'Rua, avenida…' })}\n <div className=\"grid grid-cols-2 gap-3\">\n {field('Número', 'checkout-number', form.number, set('number'), { placeholder: 'Número' })}\n {field('Complemento', 'checkout-complement', form.complement, set('complement'), { placeholder: 'Apto, bloco (opcional)' })}\n </div>\n <div className=\"grid grid-cols-2 gap-3\">\n {field('Bairro', 'checkout-district', form.district, set('district'), { placeholder: 'Bairro' })}\n {field('UF', 'checkout-state', form.state, set('state'), { placeholder: 'UF' })}\n </div>\n {field('Cidade', TID.checkoutCity, form.city, set('city'), { placeholder: 'Cidade' })}\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\" role=\"radiogroup\" aria-label=\"Forma de pagamento\">\n {paymentMethods.map((method) => {\n const copy = PAYMENT_LABELS[method]\n const selected = paymentMethod === method\n return (\n <button\n key={method}\n type=\"button\"\n role=\"radio\"\n aria-checked={selected}\n data-testid={`checkout-payment-${method}`}\n onClick={() => setPaymentMethod(method)}\n className={`rounded-lg border p-3 text-left text-sm transition hover:bg-muted/40 ${\n selected ? 'border-primary bg-primary/5' : 'border-border bg-background'\n }`}\n >\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\" />{copy.label}</span>\n {selected && (\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\">{copy.hint}</span>\n </button>\n )\n })}\n </div>\n <p className=\"mt-2 text-xs text-muted-foreground\">\n Nenhuma cobrança é feita agora. Seu pedido é registrado e a loja confirma o pagamento.\n </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 && <SmoothImage 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'\nimport { SmoothImage } from '../components/SmoothImage'\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 && <SmoothImage 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'\nimport { SmoothImage } from '../components/SmoothImage'\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 && <SmoothImage 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, getShopProvider } 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 type { ShopProvider } from '@fayz-ai/shop/provider'\nimport { initCustomerAuth, resolveAuthAdapter } from './auth'\nimport { getStorefrontComponents, StorefrontConfigProvider, resolveConfig, useStorefrontConfig } from './config'\nimport type { StorefrontConfig, StorefrontDiscountConfig } from './config'\nimport type { StorefrontComponents } from './component-contracts'\nimport type { StorefrontSection } from './sections'\nimport { useHashPath, matchPath } from './router'\nimport { useCartStore } from './stores/cart.store'\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) && config.features.checkout) return <CheckoutPage />\n if (matchPath('/account', path) && config.features.accounts) 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 if (resolveConfig(config).features.accounts) {\n initCustomerAuth(resolveAuthAdapter(config.auth, {\n supabaseUrl: config.supabaseUrl,\n supabaseAnonKey: config.supabaseAnonKey,\n }))\n }\n\n if (config.provider) {\n setShopProvider(config.provider)\n } else {\n setShopProvider(createMockShopProvider(buildMockSeed(config)))\n }\n\n // Drop any persisted cart line the active backend can't resolve (e.g. a cart\n // built in an earlier mock-mode session, whose ids don't exist live) so stale\n // ids never reach checkout and 400 the order. Keeps a line on any error so a\n // transient failure never discards a valid item. Runs AFTER the persisted cart\n // has hydrated — zustand/persist rehydrates asynchronously, so reconciling at\n // init would see an empty cart and no-op.\n const reconcileCart = () => {\n const provider = getShopProvider()\n void useCartStore.getState().reconcile(async (line) => {\n const product = await provider.getProduct(line.productId)\n return product != null\n })\n }\n if (useCartStore.persist.hasHydrated()) reconcileCart()\n else useCartStore.persist.onFinishHydration(reconcileCart)\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 const components = getStorefrontComponents(config)\n const chromeProps = { config, commerceMode: config.commerceMode }\n const body = (\n <>\n {config.theme && <StorefrontThemeStyle theme={config.theme} />}\n {!focused &&\n (components.Header ? <components.Header {...chromeProps} /> : <StorefrontHeader />)}\n <StorefrontErrorBoundary key={path}>\n <RouteSwitch path={path} />\n </StorefrontErrorBoundary>\n {!focused && config.features.cart && <CartDrawer />}\n {!focused &&\n (components.Footer ? <components.Footer {...chromeProps} /> : <StorefrontFooter />)}\n <Toaster />\n </>\n )\n\n if (components.Shell) {\n return (\n <components.Shell {...chromeProps}>\n {body}\n </components.Shell>\n )\n }\n\n return (\n <div className=\"min-h-screen bg-background text-foreground\">\n {body}\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\nexport interface CreateStorefrontOptions {\n config: StorefrontConfig\n provider?: ShopProvider\n components?: StorefrontComponents\n routes?: StorefrontConfig['routes']\n pages?: StorefrontConfig['routes']\n sections?: readonly StorefrontSection[]\n}\n\nexport function createStorefront(options: CreateStorefrontOptions): React.ComponentType {\n const routes = [...(options.pages ?? []), ...(options.routes ?? [])]\n const config: StorefrontConfig = {\n ...options.config,\n provider: options.provider ?? options.config.provider,\n components: {\n ...options.config.components,\n ...options.components,\n },\n routes: routes.length > 0 ? routes : options.config.routes,\n home: options.sections\n ? { ...(options.config.home ?? { sections: [] }), sections: options.sections }\n : options.config.home,\n }\n\n return createStorefrontApp(config)\n}\n","import type {\n StorefrontConfig,\n StorefrontRouteDefinition,\n} from './config'\nimport type { StorefrontComponents } from './component-contracts'\nimport type { StorefrontSection } from './sections'\nimport type { CreateStorefrontOptions } from './createStorefrontApp'\n\n/**\n * Identity helpers for generated/custom storefronts.\n *\n * They do not add runtime behavior; they make the intended client-app shape\n * explicit and keep TypeScript inference tight across config, components, routes,\n * sections and app creation options.\n */\nexport function defineStorefrontConfig<const T extends StorefrontConfig>(config: T): T {\n return config\n}\n\nexport function defineStorefrontComponents<const T extends StorefrontComponents>(components: T): T {\n return components\n}\n\nexport function defineStorefrontRoutes<const T extends readonly StorefrontRouteDefinition[]>(routes: T): T {\n return routes\n}\n\nexport function defineStorefrontSections<const T extends readonly StorefrontSection[]>(sections: T): T {\n return sections\n}\n\nexport function defineStorefrontApp<const T extends CreateStorefrontOptions>(options: T): T {\n return options\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 components: runtimeConfig?.components,\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\n/** food — warm appetizing delivery (steakhouse / burger / comfort food): dark inviting\n * header, ember CTA, cream canvas, rounded cards, menu-first home with \"mais pedidos\"\n * rail and social proof. Built for restaurant/food stores — override to go fully dark. */\nexport const foodTemplate: StorefrontTemplate = {\n id: 'food',\n inspiration: 'Delivery / restaurant storefront',\n announcement: 'ENTREGA GRÁTIS ACIMA DE R$ 150 · PEÇA JÁ',\n theme: {\n name: 'food',\n colors: {\n background: '30 33% 97%',\n foreground: '20 14% 15%',\n primary: '14 84% 50%',\n primaryForeground: '0 0% 100%',\n card: '30 33% 99%',\n cardForeground: '20 14% 15%',\n muted: '28 20% 92%',\n mutedForeground: '22 10% 42%',\n border: '28 18% 85%',\n headerBackground: '20 14% 11%',\n headerForeground: '30 24% 96%',\n announcementBackground: '14 84% 50%',\n announcementForeground: '0 0% 100%',\n },\n font: { heading: 'Poppins', body: 'Inter' },\n radius: 'round',\n header: { variant: 'classic' },\n productCard: { style: 'card', imageAspect: 'square' },\n },\n home: (storeName, images) => ({\n sections: [\n {\n type: 'hero',\n variant: 'banner',\n height: 'tall',\n slides: [\n { title: 'Sabor de verdade, na sua porta', subtitle: `${storeName} — feito na hora, do jeito que você ama.`, cta: 'Ver cardápio', href: '/catalog', hue: 20, image: images?.hero?.[0] },\n ],\n },\n {\n type: 'benefits',\n items: [\n { icon: 'Flame', title: 'Feito na hora', text: 'Preparado com capricho' },\n { icon: 'Truck', title: 'Entrega rápida', text: 'Frete grátis acima de R$ 150' },\n { icon: 'CreditCard', title: 'Pagamento fácil', text: 'Pix, cartão e mais' },\n ],\n },\n { type: 'categories', style: 'tiles', title: 'Nosso cardápio' },\n { type: 'products', title: 'Mais pedidos', eyebrow: 'favoritos da casa', filter: 'all', limit: 8 },\n { type: 'banner', title: 'Combo do dia', eyebrow: 'oferta', subtitle: 'Seleção especial com desconto', cta: 'Aproveitar', hue: 14, image: images?.banners?.[0] },\n { type: 'products', title: 'Novidades no cardápio', filter: 'new', limit: 4 },\n {\n type: 'testimonials',\n title: 'O que dizem por aí',\n items: [\n { quote: 'Chegou quentinho e absurdo de bom. Virei cliente!', author: 'Rafael M.' },\n { quote: 'Sabor de restaurante em casa, sem complicação.', author: 'Beatriz L.' },\n { quote: 'Entrega rápida e porção generosa. Recomendo demais.', author: 'Diego S.' },\n ],\n },\n { type: 'newsletter', title: 'Receba nossas ofertas', subtitle: 'Promoções e novidades do cardápio, direto no seu e-mail.' },\n ],\n }),\n}\n\nexport const storefrontTemplates = {\n mare: mareTemplate,\n sertao: sertaoTemplate,\n volt: voltTemplate,\n atelier: atelierTemplate,\n food: foodTemplate,\n} as const\n\nexport type StorefrontTemplateId = keyof typeof storefrontTemplates\n"]}