@fayz-ai/storefront 0.84.3 → 0.85.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/dist/CheckoutPage-4MFKLBEI.js +12 -0
  2. package/dist/{CheckoutPage-G5NYJF3Z.js.map → CheckoutPage-4MFKLBEI.js.map} +1 -1
  3. package/dist/MyPurchasesPage-F25MIFXT.js +11 -0
  4. package/dist/{MyPurchasesPage-GOK2RO7K.js.map → MyPurchasesPage-F25MIFXT.js.map} +1 -1
  5. package/dist/OrderConfirmationPage-SOQDD767.js +10 -0
  6. package/dist/{OrderConfirmationPage-DGLW5W75.js.map → OrderConfirmationPage-SOQDD767.js.map} +1 -1
  7. package/dist/{chunk-P4RRFQQX.js → chunk-BR3XHNVM.js} +5 -5
  8. package/dist/{chunk-P4RRFQQX.js.map → chunk-BR3XHNVM.js.map} +1 -1
  9. package/dist/{chunk-RZWTEC6H.js → chunk-C4XATNI2.js} +3 -3
  10. package/dist/{chunk-RZWTEC6H.js.map → chunk-C4XATNI2.js.map} +1 -1
  11. package/dist/{chunk-45R7CIEA.js → chunk-CE4U65TZ.js} +4 -4
  12. package/dist/{chunk-45R7CIEA.js.map → chunk-CE4U65TZ.js.map} +1 -1
  13. package/dist/{chunk-2D5BEM43.js → chunk-EFHQ5MAJ.js} +3 -3
  14. package/dist/{chunk-2D5BEM43.js.map → chunk-EFHQ5MAJ.js.map} +1 -1
  15. package/dist/{chunk-UJ2TIM4V.js → chunk-ELW7QWDJ.js} +13 -12
  16. package/dist/chunk-ELW7QWDJ.js.map +1 -0
  17. package/dist/{chunk-F3U4KZC7.js → chunk-IUP5SDTX.js} +5 -5
  18. package/dist/{chunk-F3U4KZC7.js.map → chunk-IUP5SDTX.js.map} +1 -1
  19. package/dist/{chunk-ZSNKJGE5.js → chunk-NS6UPIJ3.js} +3 -3
  20. package/dist/{chunk-ZSNKJGE5.js.map → chunk-NS6UPIJ3.js.map} +1 -1
  21. package/dist/{chunk-FPFGRUCS.js → chunk-OOQRYH3N.js} +6 -6
  22. package/dist/{chunk-FPFGRUCS.js.map → chunk-OOQRYH3N.js.map} +1 -1
  23. package/dist/{chunk-GVZ2SAOI.js → chunk-PSDR5TZD.js} +3 -2
  24. package/dist/chunk-PSDR5TZD.js.map +1 -0
  25. package/dist/{chunk-PURHMU2W.js → chunk-RJUEUMR6.js} +4 -4
  26. package/dist/{chunk-PURHMU2W.js.map → chunk-RJUEUMR6.js.map} +1 -1
  27. package/dist/{chunk-BKO2AQ3Q.js → chunk-SLJ4BRXD.js} +3 -3
  28. package/dist/{chunk-BKO2AQ3Q.js.map → chunk-SLJ4BRXD.js.map} +1 -1
  29. package/dist/{chunk-YSQBZ3RM.js → chunk-YCAWAON6.js} +7 -7
  30. package/dist/{chunk-YSQBZ3RM.js.map → chunk-YCAWAON6.js.map} +1 -1
  31. package/dist/{chunk-554XAQWK.js → chunk-YDZU2SZL.js} +4 -4
  32. package/dist/{chunk-554XAQWK.js.map → chunk-YDZU2SZL.js.map} +1 -1
  33. package/dist/{chunk-WSHCQ3Y6.js → chunk-Z5JT7T4I.js} +8 -8
  34. package/dist/{chunk-WSHCQ3Y6.js.map → chunk-Z5JT7T4I.js.map} +1 -1
  35. package/dist/components/delivery/StoreCover.d.ts.map +1 -1
  36. package/dist/document/config.d.ts +8 -0
  37. package/dist/document/config.d.ts.map +1 -1
  38. package/dist/edge.d.ts +1 -1
  39. package/dist/edge.d.ts.map +1 -1
  40. package/dist/edge.js +19 -2
  41. package/dist/edge.js.map +1 -1
  42. package/dist/host/edge-handler.d.ts +26 -0
  43. package/dist/host/edge-handler.d.ts.map +1 -1
  44. package/dist/host.js +4 -4
  45. package/dist/index.js +22 -22
  46. package/dist/render.js +9 -9
  47. package/dist/tanstack.js +8 -8
  48. package/package.json +1 -1
  49. package/dist/CheckoutPage-G5NYJF3Z.js +0 -12
  50. package/dist/MyPurchasesPage-GOK2RO7K.js +0 -11
  51. package/dist/OrderConfirmationPage-DGLW5W75.js +0 -10
  52. package/dist/chunk-GVZ2SAOI.js.map +0 -1
  53. package/dist/chunk-UJ2TIM4V.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/analytics/identity.ts","../src/experiments/react.tsx","../src/analytics/posthog.ts","../src/analytics/meta-pixel.ts","../src/analytics/StorefrontAnalytics.tsx","../src/data/facets.ts","../src/data/loaders.ts","../src/blocks/sections.ts","../src/components/marketing/HeroSection.tsx","../src/stores/catalog.store.ts","../src/components/collection/CategoryShowcase.tsx","../src/hooks/use-enquiry.ts","../src/hooks/use-storefront-actions.ts","../src/hooks/use-market-product.ts","../src/components/Price.tsx","../src/components/PaymentTerms.tsx","../src/extend/component-selectors.ts","../src/components/product/ProductCard.tsx","../src/extend/component-override.ts","../src/components/product/ProductRail.tsx","../src/components/marketing/MediaCarousel.tsx","../src/components/product/ProductSlider.tsx","../src/components/collection/ProductGrid.tsx","../src/hooks/use-categories.ts","../src/components/collection/FiltersPanel.tsx","../src/views/CatalogPage.tsx","../src/hooks/use-product.ts","../src/components/cart/QuantityInput.tsx","../src/components/product/ProductOptionSelector.tsx","../src/components/product/ProductSpecs.tsx","../src/components/product/ProductReviews.tsx","../src/hooks/use-products.ts","../src/components/product/ProductEnquiryForm.tsx","../src/components/product/ProductGallery.tsx","../src/components/product/RelatedProducts.tsx","../src/components/checkout/DeliveryEstimator.tsx","../src/views/ProductDetailPage.tsx","../src/components/marketing/FormBlock.tsx","../src/components/marketing/EntityList.tsx","../src/components/marketing/EditorialSections.tsx","../src/components/marketing/ConversionSections.tsx","../src/components/marketing/CollectionSections.tsx","../src/components/marketing/MiscSections.tsx","../src/components/layout/PageBodyBlocks.tsx","../src/blocks/registry.tsx","../src/document/store-policy.tsx","../src/lib/theme.ts","../src/components/layout/SearchOverlay.tsx","../src/components/layout/StorefrontHeader.tsx","../src/components/layout/StorefrontFooter.tsx","../src/components/cart/CartDrawer.tsx","../src/views/ContentPage.tsx","../src/stores/service.store.ts","../src/components/delivery/store-time.ts","../src/lib/eta.ts","../src/components/delivery/StoreCover.tsx","../src/components/delivery/AddressStrip.tsx","../src/components/delivery/MenuToolbar.tsx","../src/components/delivery/MenuItemRow.tsx","../src/components/delivery/ItemSheet.tsx","../src/components/delivery/ScheduleSheet.tsx","../src/components/delivery/ServiceStatus.tsx","../src/lib/highlights.ts","../src/components/delivery/AccountDrawer.tsx","../src/views/MenuPage.tsx","../src/data/shipping-items.ts","../src/views/NotFoundPage.tsx","../src/views/PolicyPage.tsx","../src/components/layout/StorefrontErrorBoundary.tsx","../src/components/layout/Toaster.tsx","../src/app/createStorefrontApp.tsx"],"names":["React","bootstrap","started","React2","jsx","useRef","useEffect","jsxs","useState","Fragment","ChevronLeft","ChevronRight","useMemo","str","getShopProvider","errorMessage","current","Truck","resolveEntityDeclaration","Icon","getLucideIcon","registered","X","Mail","Search","initial","ShoppingBag","formatPostalCode","create","Plus","Minus","User","Package","MapPin","Clock","LogOut","Check","toast"],"mappings":"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","file":"chunk-UJ2TIM4V.js","sourcesContent":["/**\n * Who a buyer is, to analytics, without telling analytics who they are.\n *\n * `store:<store id>:<sha-256 of the lower-cased e-mail>`. The server computes\n * the same string for the orders it reports (shop migration 0146), which is how\n * a visit and its order meet in one person. The store id keeps one e-mail at two\n * restaurants as two people: every store's buyers stay that store's.\n */\nexport async function storeBuyerId(storeId: string, email: string): Promise<string | null> {\n const clean = email.trim().toLowerCase()\n if (!storeId || !clean.includes('@')) return null\n const subtle = globalThis.crypto?.subtle\n if (!subtle) return null\n const digest = await subtle.digest('SHA-256', new TextEncoder().encode(clean))\n const hex = Array.from(new Uint8Array(digest), (b) => b.toString(16).padStart(2, '0')).join('')\n return `store:${storeId}:${hex}`\n}\n","import React from 'react'\nimport { BlockChildren, BlockRenderer, useBlockPath, type BlockNode } from '@fayz-ai/core'\nimport { trackStorefront } from '../analytics/bus'\nimport { useStorefrontConfig } from '../document/config'\nimport { CONTROL, runningExperiments, type ExperimentAssignment, type ExperimentAssignments } from './assign'\n\n// ---------------------------------------------------------------------------\n// Experiments in the page: the variant the edge decided, read by code\n// (`useExperiment`), by a setting (`Experimental<T>` + `useExperimentValue`)\n// or by the document (the `experiment` / `experimentVariant` blocks).\n//\n// The assignment arrives with the first server-rendered page and is kept for\n// the rest of the visit: client-side navigations run their loaders in the\n// browser, where there is no edge, and a visitor must not flip variants\n// between two pages of the same session.\n// ---------------------------------------------------------------------------\n\n/** A setting whose value depends on an experiment's variant. */\nexport interface ExperimentBinding<T> {\n /** The PostHog flag key, declared in the store's `experiments`. */\n experiment: string\n /** The value for each variant; a variant not listed falls back to `control`. */\n variants: { control: T } & Record<string, T>\n}\n\n/** A plain value, or one bound to an experiment. */\nexport type Experimental<T> = T | ExperimentBinding<T>\n\nexport function isExperimentBinding<T>(value: Experimental<T> | undefined): value is ExperimentBinding<T> {\n return (\n typeof value === 'object' &&\n value !== null &&\n typeof (value as ExperimentBinding<T>).experiment === 'string' &&\n typeof (value as ExperimentBinding<T>).variants === 'object'\n )\n}\n\n/** The value of a setting for a given variant (control when unbound or unmatched). */\nexport function resolveExperimental<T>(value: Experimental<T>, variant: string): T {\n if (!isExperimentBinding(value)) return value\n return value.variants[variant] ?? value.variants.control\n}\n\n// What posthog-js is bootstrapped with: the same id and the same variants the\n// server rendered, so the browser never re-decides. Module state on purpose —\n// the PostHog client starts from an effect that knows nothing of React context.\nlet bootstrap: ExperimentAssignments | null = null\n\n/** The assignment the page was rendered with, for the analytics client. */\nexport function getExperimentBootstrap(): ExperimentAssignments | null {\n return bootstrap\n}\n\ninterface ExperimentState {\n assignments: ExperimentAssignments\n /** Declared experiment keys: a key outside this set is always control. */\n declared: ReadonlySet<string>\n /** Experiments already reported for the current page view. */\n exposed: Set<string>\n}\n\nconst ExperimentContext = React.createContext<ExperimentState | null>(null)\n\nexport interface ExperimentProviderProps {\n /** What the edge decided for this request (`StoreRouteData.experiments`). */\n assignments: ExperimentAssignments | null | undefined\n /** The page being shown. A new path is a new page view: exposures are reported again. */\n path: string\n children?: React.ReactNode\n}\n\nexport function ExperimentProvider({ assignments, path, children }: ExperimentProviderProps) {\n const config = useStorefrontConfig()\n // The first assignment wins for the whole visit (see the header comment).\n const kept = React.useRef<ExperimentAssignments | null>(null)\n if (!kept.current && assignments) kept.current = assignments\n const current = kept.current ?? { flags: {} }\n if (typeof window !== 'undefined' && kept.current && !bootstrap) bootstrap = kept.current\n\n // Only running experiments count: a stale assignment for one that is off\n // renders control and is never reported.\n const declaredKeys = Object.keys(runningExperiments(config.experiments)).sort().join('\\n')\n const declared = React.useMemo(() => new Set(declaredKeys ? declaredKeys.split('\\n') : []), [declaredKeys])\n const exposed = React.useMemo(() => new Set<string>(), [path])\n const value = React.useMemo(() => ({ assignments: current, declared, exposed }), [current, declared, exposed])\n return <ExperimentContext.Provider value={value}>{children}</ExperimentContext.Provider>\n}\n\n/**\n * The variant this visitor sees for `key`, and its payload.\n *\n * 'control' whenever anything is missing — no provider, an undeclared key, no\n * assignment (the experiment is off, the visitor is outside its rollout or is\n * a crawler). The first render that reads an experiment the visitor is in\n * reports the exposure (once per page view): that is the event PostHog's\n * experiment analysis counts visitors from.\n */\nexport function useExperiment(key: string): ExperimentAssignment {\n const state = React.useContext(ExperimentContext)\n const assigned = state?.declared.has(key) ? state.assignments.flags[key] : undefined\n const result: ExperimentAssignment = assigned ?? { variant: CONTROL }\n const variant = result.variant\n // Only a visitor in the experiment is exposed. One shown control because\n // the experiment is off or they fell outside the rollout is not part of the\n // test: counting them as control would dilute that group.\n const inExperiment = Boolean(assigned)\n React.useEffect(() => {\n if (!state || !inExperiment || state.exposed.has(key)) return\n state.exposed.add(key)\n trackStorefront('experiment_exposed', { experiment: key, variant })\n }, [state, key, variant, inExperiment])\n return result\n}\n\n/** A setting resolved for this visitor; reads (and reports) the experiment only when bound. */\nexport function useExperimentValue<T>(value: Experimental<T>): T\nexport function useExperimentValue<T>(value: Experimental<T> | undefined): T | undefined\nexport function useExperimentValue<T>(value: Experimental<T> | undefined): T | undefined {\n const bound = isExperimentBinding(value)\n if (!bound) return value as T | undefined\n // eslint-disable-next-line react-hooks/rules-of-hooks -- `bound` is fixed for a given config value\n const { variant } = useExperiment(value.experiment)\n return resolveExperimental(value, variant)\n}\n\n// --- Blocks -------------------------------------------------------------------\n\n/**\n * The `experiment` block: its children are `experimentVariant` blocks, and\n * only the one named after this visitor's variant renders (the `control` one\n * when nothing matches). How a document tests a section without code:\n *\n * { type: 'experiment', props: { experiment: 'home-hero-copy' }, children: [\n * { type: 'experimentVariant', props: { variant: 'control' }, children: [hero A] },\n * { type: 'experimentVariant', props: { variant: 'test' }, children: [hero B] },\n * ] }\n */\nexport function ExperimentBlock({ experiment, node }: { experiment?: string; node?: BlockNode }) {\n const { variant } = useExperiment(experiment ?? '')\n const path = useBlockPath()\n const variants = node?.children ?? []\n let index = variants.findIndex((child) => child.props?.variant === variant)\n if (index < 0) index = variants.findIndex((child) => child.props?.variant === CONTROL)\n if (index < 0) return null\n // Rendered by position so the editor's path points at the variant actually\n // shown (`…children[1]`), not at whichever one happens to come first.\n return <BlockRenderer node={variants[index]!} path={path ? `${path}.children[${index}]` : undefined} />\n}\n\n/** One variant's blocks. Renders its children; only meaningful inside `experiment`. */\nexport function ExperimentVariantBlock({ node }: { variant?: string; node?: BlockNode }) {\n return <BlockChildren node={node} />\n}\n\nexport const experimentBlockMeta = {\n label: 'Experiment',\n description:\n 'A/B test: shows one of its variants to each visitor, as bucketed at the edge for the declared experiment of the same key. The variant named \"control\" is the fallback.',\n settings: [\n {\n id: 'experiment',\n type: 'text' as const,\n label: 'Experiment key',\n required: true,\n help: 'The PostHog flag key, declared in the store config under `experiments`.',\n },\n ],\n presets: [{ name: 'A/B test', props: { experiment: 'my-experiment' } }],\n enabledOn: ['home', 'catalog', 'product', 'collection', 'content'],\n}\n\nexport const experimentVariantBlockMeta = {\n label: 'Experiment variant',\n description: 'The blocks one variant of an experiment shows.',\n parent: ['experiment'],\n settings: [\n {\n id: 'variant',\n type: 'text' as const,\n label: 'Variant key',\n required: true,\n help: 'Exactly as on the PostHog flag, e.g. \"control\" or \"test\".',\n },\n ],\n presets: [\n { name: 'Control', props: { variant: 'control' } },\n { name: 'Test', props: { variant: 'test' } },\n ],\n enabledOn: ['home', 'catalog', 'product', 'collection', 'content'],\n}\n\n/** Test seam. */\nexport function resetExperimentBootstrap(): void {\n bootstrap = null\n}\n","import { onStorefrontEvent, setStorefrontIdentifier } from './bus'\nimport { storeBuyerId } from './identity'\nimport { readVisitorId } from '../experiments/assign'\nimport { getExperimentBootstrap } from '../experiments/react'\n\nexport interface StorefrontPostHogConfig {\n /** The project token (`phc_…`). Public by design: it can only send events. */\n key: string\n /** The store this site sells for (its tenant id). Every event is grouped under it. */\n storeId: string\n /** Where the client sends. Default `/ingest`, the store's own proxy (see `posthogProxy`). */\n apiHost?: string\n /** The PostHog app, for links the toolbar opens. Default `https://us.posthog.com`. */\n uiHost?: string\n /** Session replay. Default on; inputs are always masked. */\n replay?: boolean\n /** PostHog surveys. Default off: no store runs one, and the client fetched\n * surveys.js (~38 KB) on every page view to find that out. */\n surveys?: boolean\n}\n\nexport interface StorefrontAnalyticsConfig {\n posthog?: StorefrontPostHogConfig\n /**\n * The store's Meta Pixel. Usually left out: the id the merchant saves in\n * Loja › Configurações › Loja › Rastreamento (shop 0148) is used. Set it here\n * only to pin one in code.\n */\n metaPixel?: import('./meta-pixel').StorefrontMetaPixelConfig\n}\n\ninterface StartContext {\n storeName: string\n commerceMode: string\n}\n\nlet started: Promise<void> | null = null\n\n/**\n * Loads PostHog once per page, in the browser only, off the first paint.\n *\n * The store is attached to every event in `before_send` rather than with\n * `posthog.group()`: `group()` turns on person processing for every anonymous\n * visitor, and across hundreds of stores that is the difference between paying\n * for buyers and paying for every passer-by. Only a buyer who reaches the\n * checkout becomes a person (`identify` with the store-scoped buyer id).\n */\nexport function startStorefrontPostHog(config: StorefrontPostHogConfig, context: StartContext): Promise<void> | null {\n if (typeof window === 'undefined' || !config.key || !config.storeId) return null\n if (started) return started\n started = (async () => {\n const { default: posthog } = await import('posthog-js')\n const store = { store_id: config.storeId, store_name: context.storeName, commerce_mode: context.commerceMode }\n // The variants the server rendered, and the id it decided them for (the\n // PostHog cookie, else the store's own `fz_vid` the edge set). Bootstrapped\n // so the browser does not re-decide: same identity, same variants, and\n // every event carries `$feature/<key>` from the first one.\n const experiments = getExperimentBootstrap()\n // Only a NEW visitor's id is bootstrapped. With PostHog's own cookie\n // present it is already the id the edge evaluated, and bootstrapping it\n // again would reset an identified buyer to anonymous.\n const hasPostHogCookie = document.cookie.includes(`ph_${config.key}_posthog=`)\n const visitorId = hasPostHogCookie ? undefined : readVisitorId(document.cookie, config.key)\n const flags = experiments?.flags ?? {}\n const bootstrap = Object.keys(flags).length || visitorId\n ? {\n ...(visitorId ? { distinctID: visitorId } : {}),\n featureFlags: Object.fromEntries(Object.entries(flags).map(([k, a]) => [k, a.variant])),\n featureFlagPayloads: Object.fromEntries(\n Object.entries(flags).filter(([, a]) => a.payload !== undefined).map(([k, a]) => [k, a.payload as never]),\n ),\n }\n : undefined\n posthog.init(config.key, {\n ...(bootstrap ? { bootstrap } : {}),\n // With variants bootstrapped, the browser does not re-ask /flags on\n // load: an answer that differed from the rendered page (a server-side\n // timeout, a rollout change between the two calls) would tag this\n // visitor's events with a variant they never saw.\n ...(Object.keys(flags).length ? { advanced_disable_feature_flags_on_first_load: true } : {}),\n api_host: config.apiHost ?? '/ingest',\n ui_host: config.uiHost ?? 'https://us.posthog.com',\n defaults: '2026-08-30',\n person_profiles: 'identified_only',\n capture_pageview: 'history_change',\n capture_dead_clicks: true,\n capture_heatmaps: true,\n disable_session_recording: config.replay === false,\n session_recording: { maskAllInputs: true },\n disable_surveys: config.surveys !== true,\n before_send: (event) => {\n if (!event) return event\n const groups = (event.properties.$groups as Record<string, string> | undefined) ?? {}\n event.properties.$groups = { ...groups, store: config.storeId }\n return event\n },\n })\n posthog.register(store)\n onStorefrontEvent((event) => {\n // An exposure is PostHog's own `$feature_flag_called`, which its\n // Experiments count visitors from.\n if (event.name === 'experiment_exposed') {\n const { experiment, variant } = event.properties\n if (typeof experiment !== 'string' || typeof variant !== 'string') return\n // Sent by hand with the variant that was RENDERED. Reading the flag\n // (`getFeatureFlag`) would report whatever posthog-js holds now, which\n // is not always what the server drew the page with.\n posthog.capture('$feature_flag_called', {\n $feature_flag: experiment,\n $feature_flag_response: variant,\n [`$feature/${experiment}`]: variant,\n })\n return\n }\n posthog.capture(event.name, event.properties, { timestamp: new Date(event.at) })\n })\n setStorefrontIdentifier((email) => {\n void storeBuyerId(config.storeId, email).then((id) => {\n if (id && posthog.get_distinct_id() !== id) posthog.identify(id, { store_id: config.storeId })\n })\n })\n })().catch(() => { started = null })\n return started\n}\n","import { onStorefrontBuyer, onStorefrontEvent, type StorefrontEvent } from './bus'\n\n/**\n * The store's Meta Pixel as one more listener on the storefront's own events.\n *\n * Components never call Meta: they report to the bus (product viewed, added to\n * cart, checkout started, payment chosen, order placed) and this maps each one\n * to the standard event Meta's ads optimise for. The pixel id is the store's —\n * Loja › Configurações › Loja › Rastreamento (shop 0148), or `analytics.metaPixel`\n * in code.\n *\n * Purchase carries the order id as its `eventID`, so a server-side Conversions\n * API sending the same order later is deduplicated by Meta, not counted twice.\n */\n\nexport interface StorefrontMetaPixelConfig {\n /** Digits only, as Meta shows it in the Events Manager. */\n pixelId: string\n}\n\ntype Fbq = ((...args: unknown[]) => void) & {\n callMethod?: (...args: unknown[]) => void\n queue: unknown[]\n push: unknown\n loaded: boolean\n version: string\n}\n\ndeclare global {\n interface Window {\n fbq?: Fbq\n _fbq?: Fbq\n }\n}\n\nexport const META_PIXEL_ID = /^[0-9]{10,20}$/\n\nexport interface MetaEvent {\n name: 'ViewContent' | 'AddToCart' | 'InitiateCheckout' | 'AddPaymentInfo' | 'Purchase'\n params: Record<string, unknown>\n /** Meta's dedup key; set on Purchase (the order id). */\n eventId?: string\n}\n\nconst num = (v: unknown): number | undefined => (typeof v === 'number' && Number.isFinite(v) ? v : undefined)\nconst str = (v: unknown): string | undefined => (typeof v === 'string' && v ? v : undefined)\n\n/** A storefront event in Meta's words, or null when Meta has no standard event for it. */\nexport function metaEventFor(event: StorefrontEvent, currency: string): MetaEvent | null {\n const p = event.properties\n switch (event.name) {\n case 'product_viewed': {\n const id = str(p.product_id)\n if (!id) return null\n return {\n name: 'ViewContent',\n params: { content_ids: [id], content_name: str(p.product_name), content_type: 'product', value: num(p.price), currency },\n }\n }\n case 'product_added_to_cart': {\n const id = str(p.product_id)\n if (!id) return null\n const quantity = num(p.quantity) ?? 1\n const price = num(p.price)\n return {\n name: 'AddToCart',\n params: {\n content_ids: [id],\n content_name: str(p.product_name),\n content_type: 'product',\n contents: [{ id, quantity, item_price: price }],\n value: price === undefined ? undefined : Math.round(price * quantity * 100) / 100,\n currency,\n },\n }\n }\n case 'checkout_started':\n return { name: 'InitiateCheckout', params: { num_items: num(p.cart_count), value: num(p.cart_subtotal), currency } }\n case 'checkout_payment_selected':\n return { name: 'AddPaymentInfo', params: { payment_method: str(p.payment_method), currency } }\n case 'checkout_completed': {\n const orderId = str(p.order_id)\n const value = num(p.total)\n if (!orderId || value === undefined) return null\n return { name: 'Purchase', params: { value, currency, order_id: orderId }, eventId: orderId }\n }\n default:\n return null\n }\n}\n\nconst strip = (params: Record<string, unknown>) =>\n Object.fromEntries(Object.entries(params).filter(([, v]) => v !== undefined && v !== null))\n\n/**\n * fbevents.js (~115 KB) plus the pixel's config (~95 KB) costs ~360 ms of\n * main-thread work on a mid-range phone. Requested during the page's load it\n * lands inside the window PageSpeed's Total Blocking Time is measured in, so\n * it is deferred to the visitor's first interaction (tap, scroll, key) or 3 s\n * after load, whichever comes first.\n *\n * The trade-off, deliberately: a paid visitor who leaves within 3 s without\n * touching the page registers no PageView in Meta. Anyone who interacts or\n * stays 3 s is counted, and nothing they do is lost — `fbq` queues every call\n * until the script runs, PageView included.\n */\nexport const META_PIXEL_DELAY_MS = 3000\n\nfunction loadFbEventsOnIntentOrDelay(): void {\n let done = false\n const events = ['pointerdown', 'keydown', 'touchstart', 'scroll', 'wheel'] as const\n const inject = () => {\n if (done) return\n done = true\n for (const name of events) window.removeEventListener(name, inject, true)\n window.clearTimeout(timer)\n const script = document.createElement('script')\n script.async = true\n script.src = 'https://connect.facebook.net/en_US/fbevents.js'\n document.head.appendChild(script)\n }\n for (const name of events) window.addEventListener(name, inject, { capture: true, once: true, passive: true })\n let timer = 0\n const arm = () => { timer = window.setTimeout(inject, META_PIXEL_DELAY_MS) }\n if (document.readyState === 'complete') arm()\n else window.addEventListener('load', arm, { once: true })\n}\n\n/** Meta's base code, verbatim in behaviour: a queueing `fbq` until fbevents.js arrives. */\nfunction installFbq(): Fbq {\n if (window.fbq) return window.fbq\n const fbq = function (this: unknown, ...args: unknown[]) {\n if (fbq.callMethod) fbq.callMethod(...args)\n else fbq.queue.push(args)\n } as Fbq\n fbq.push = fbq\n fbq.loaded = true\n fbq.version = '2.0'\n fbq.queue = []\n window.fbq = fbq\n if (!window._fbq) window._fbq = fbq\n loadFbEventsOnIntentOrDelay()\n return fbq\n}\n\nconst PURCHASES_KEY = 'fayz.meta.purchases'\n\n/** An order already reported from this browser — a reload of the order page must not buy twice. */\nfunction purchaseSeen(orderId: string): boolean {\n try {\n const seen = JSON.parse(sessionStorage.getItem(PURCHASES_KEY) ?? '[]') as string[]\n if (seen.includes(orderId)) return true\n sessionStorage.setItem(PURCHASES_KEY, JSON.stringify([...seen.slice(-19), orderId]))\n } catch { /* storage blocked: report it */ }\n return false\n}\n\nlet started: { pixelId: string; stop: () => void } | null = null\n\n/**\n * Loads the pixel once per page (browser only) and starts reporting. Calling it\n * again with the same id is a no-op; with another id, the old listener stops.\n */\nexport function startStorefrontMetaPixel(config: StorefrontMetaPixelConfig, context: { currency: string }): void {\n if (typeof window === 'undefined') return\n const pixelId = config.pixelId.trim()\n if (!META_PIXEL_ID.test(pixelId)) return\n if (started?.pixelId === pixelId) return\n started?.stop()\n\n const fbq = installFbq()\n fbq('init', pixelId)\n\n const offEvents = onStorefrontEvent((event) => {\n const meta = metaEventFor(event, context.currency)\n if (!meta) return\n if (meta.name === 'Purchase' && meta.eventId && purchaseSeen(meta.eventId)) return\n fbq('trackSingle', pixelId, meta.name, strip(meta.params), meta.eventId ? { eventID: meta.eventId } : undefined)\n })\n // Advanced matching: the e-mail the buyer typed at checkout. Meta hashes it in\n // the browser before sending; it never travels as an event property.\n const offBuyer = onStorefrontBuyer((email) => fbq('init', pixelId, { em: email }))\n\n started = { pixelId, stop: () => { offEvents(); offBuyer() } }\n}\n\n/** A page view for the single-page navigation (the base code only reports the first load). */\nexport function trackMetaPageView(): void {\n if (typeof window === 'undefined' || !started) return\n window.fbq?.('trackSingle', started.pixelId, 'PageView')\n}\n\n/** Test seam. */\nexport function resetStorefrontMetaPixel(): void {\n started?.stop()\n started = null\n}\n","import * as React from 'react'\nimport type { ResolvedStorefrontConfig } from '../document/config'\nimport { useCartStore, selectCount, selectSubtotal } from '../stores/cart.store'\nimport { lastStorefrontEventAt, trackStorefront } from './bus'\nimport { startStorefrontPostHog } from './posthog'\nimport { META_PIXEL_ID, startStorefrontMetaPixel, trackMetaPageView } from './meta-pixel'\n\ntype CartSnapshot = ReturnType<typeof useCartStore.getState>\n\n/** The ordering flow: the menu, a product, the cart, the checkout, the order. */\nexport function isOrderingPath(path: string, menuPath: string | undefined): boolean {\n const p = path.split(/[?#]/)[0] || '/'\n if (menuPath && menuPath !== '/' && (p === menuPath || p.startsWith(`${menuPath}/`))) return true\n return /^\\/(product|checkout|cart|order|account)(\\/|$)/.test(p)\n}\n\n/** What a cart change was, line by line: added or removed, and how many. */\nexport function cartChanges(prev: Pick<CartSnapshot, 'lines'>, next: Pick<CartSnapshot, 'lines'>) {\n const key = (l: CartSnapshot['lines'][number]) => l.lineId ?? l.productId\n const before = new Map(prev.lines.map((l) => [key(l), l]))\n const after = new Map(next.lines.map((l) => [key(l), l]))\n const out: Array<{ kind: 'added' | 'removed'; line: CartSnapshot['lines'][number]; quantity: number }> = []\n for (const [id, line] of after) {\n const delta = line.quantity - (before.get(id)?.quantity ?? 0)\n if (delta > 0) out.push({ kind: 'added', line, quantity: delta })\n if (delta < 0) out.push({ kind: 'removed', line, quantity: -delta })\n }\n for (const [id, line] of before) if (!after.has(id)) out.push({ kind: 'removed', line, quantity: line.quantity })\n return out\n}\n\n/**\n * Mounted once by the shell. Starts the analytics client when the store\n * configured one, and reports what no single page owns: cart changes and a\n * shopper leaving the ordering flow for the rest of the site.\n */\nexport function StorefrontAnalytics({ config, path }: { config: ResolvedStorefrontConfig; path: string }) {\n const posthog = config.analytics?.posthog\n // Code wins; otherwise the id the merchant saved (shop 0148, via the public settings).\n const pixelId = config.analytics?.metaPixel?.pixelId ?? config.policy?.metaPixelId ?? null\n const metaPixel = pixelId && META_PIXEL_ID.test(pixelId) ? pixelId : null\n // Cart changes and the exit are reported when ANY sink listens.\n const reporting = Boolean(posthog || metaPixel)\n const menuPath = config.delivery?.menuPath\n const previous = React.useRef<string | null>(null)\n\n React.useEffect(() => {\n if (!posthog) return\n startStorefrontPostHog(posthog, { storeName: config.name, commerceMode: config.commerceMode })\n }, [posthog, config.name, config.commerceMode])\n\n React.useEffect(() => {\n if (!metaPixel) return\n startStorefrontMetaPixel({ pixelId: metaPixel }, { currency: config.currency ?? 'BRL' })\n }, [metaPixel, config.currency])\n\n // One PageView per route: the site navigates without reloading.\n React.useEffect(() => {\n if (metaPixel) trackMetaPageView()\n }, [metaPixel, path])\n\n React.useEffect(() => {\n if (!reporting) return\n // The persisted cart arriving from storage is not a shopper adding to it.\n let ready = useCartStore.persist?.hasHydrated?.() ?? true\n const unhydrated = useCartStore.persist?.onFinishHydration?.(() => { ready = true })\n // The checkout empties the cart once the order exists; that is a sale, not\n // a shopper taking every item back out.\n const unsubscribe = useCartStore.subscribe((next, prev) => {\n if (!ready) return\n const totals = { cart_count: selectCount(next), cart_subtotal: selectSubtotal(next) }\n const justOrdered = next.lines.length === 0 && Date.now() - lastStorefrontEventAt('checkout_completed') < 10_000\n for (const change of justOrdered ? [] : cartChanges(prev, next)) {\n trackStorefront(change.kind === 'added' ? 'product_added_to_cart' : 'product_removed_from_cart', {\n product_id: change.line.productId,\n product_name: change.line.name,\n variant_id: change.line.variantId ?? null,\n options: change.line.optionsLabel ?? null,\n price: change.line.unitPrice,\n quantity: change.quantity,\n ...totals,\n })\n }\n if (next.isOpen && !prev.isOpen) trackStorefront('cart_viewed', totals)\n if (next.discountCode && next.discountCode !== prev.discountCode) {\n trackStorefront('coupon_applied', { coupon: next.discountCode, discount_percent: next.discountPercent, ...totals })\n }\n })\n return () => { unsubscribe(); unhydrated?.() }\n }, [reporting])\n\n React.useEffect(() => {\n if (!reporting) return\n const from = previous.current\n previous.current = path\n if (!from || from === path) return\n if (isOrderingPath(from, menuPath) && !isOrderingPath(path, menuPath)) {\n const cart = useCartStore.getState()\n trackStorefront('delivery_exit', { from, to: path, cart_count: selectCount(cart), cart_subtotal: selectSubtotal(cart) })\n }\n }, [reporting, path, menuPath])\n\n return null\n}\n","// ---------------------------------------------------------------------------\n// Metadata refinements — the one matcher.\n//\n// A store's discovery axes live in `product.metadata`: `collection`, and\n// whatever else that store sells by (`purpose`, `brand`, `room`, `skin type`).\n// The catalogue page refines by them from the URL, a rail refines by them from\n// its props, and a server loader has to answer both — so the rule for \"does\n// this product match this refinement\" is defined once, here, and imported by\n// all three.\n//\n// A leaf module on purpose: the loader must import it without pulling zustand\n// in behind the catalogue store.\n// ---------------------------------------------------------------------------\n\n/**\n * Active refinements, keyed by the `product.metadata` field they match.\n *\n * A metadata value may be a scalar or an array; an array matches if it contains\n * the wanted value, which is what makes multi-valued facets like\n * `purpose: ['estudar', 'presentear']` work.\n */\nexport type CatalogFacets = Readonly<Record<string, string>>\n\n/** Does a product satisfy every active facet? */\nexport function matchesFacets(\n metadata: Record<string, unknown> | null | undefined,\n facets: CatalogFacets,\n): boolean {\n for (const [key, wanted] of Object.entries(facets)) {\n const actual = metadata?.[key]\n if (Array.isArray(actual)) {\n if (!actual.some((v) => String(v) === wanted)) return false\n } else if (String(actual ?? '') !== wanted) {\n return false\n }\n }\n return true\n}\n\n/**\n * One authored refinement, as a repeatable row.\n *\n * A `Record<string, string>` is the natural shape for the matcher and for a\n * hand-written config, but it is not something an editor can render a form for\n * or an agent can generate against — the block schema vocabulary has no map\n * type, and declaring one as a shapeless `list` is a schema that lies (the\n * strict `auditBlocks` bar rejects it). So the authored form is a list of\n * pairs, and both forms normalise here.\n */\nexport interface CatalogFacetEntry {\n key: string\n value: string\n}\n\n/** Either authored form → the map the matcher and the loader use. */\nexport function toFacetMap(\n input: CatalogFacets | readonly CatalogFacetEntry[] | undefined | null,\n): CatalogFacets {\n if (!input) return {}\n if (!Array.isArray(input)) return input as CatalogFacets\n const out: Record<string, string> = {}\n for (const entry of input as readonly CatalogFacetEntry[]) {\n if (entry?.key && entry.value != null) out[entry.key] = String(entry.value)\n }\n return out\n}\n\n/**\n * Ad and analytics click identifiers.\n *\n * They ride along on every inbound link — an Instagram ad to\n * `/catalog?utm_source=instagram`, a Facebook share with `fbclid`, a Google\n * Ads click with `gclid` — and mean nothing to the catalogue. Read as a facet\n * they would match `product.metadata.utm_source`, which no product has, and\n * the shopper the ad just paid for would land on \"Nenhum produto encontrado\".\n */\nconst TRACKING_PARAM =\n /^(utm_[a-z0-9_]+|fbclid|gclid|gbraid|wbraid|dclid|msclkid|ttclid|twclid|li_fat_id|igshid|igsh|mc_cid|mc_eid|_ga|_gl|_hs[a-z]+|hsa_[a-z]+|yclid|srsltid|ref|ref_src)$/i\n\n/** Is this query parameter a tracking identifier rather than a refinement? */\nexport function isTrackingParam(key: string): boolean {\n return TRACKING_PARAM.test(key)\n}\n\n/**\n * The facets a query string carries: every parameter that is neither one the\n * catalogue owns (`reserved`) nor a tracking identifier. This is what lets a\n * store add a discovery axis just by linking to it — `?purpose=estudar`,\n * `?brand=schneider` — without the SDK knowing the axis exists.\n */\nexport function facetsFromQuery(params: URLSearchParams, reserved: ReadonlySet<string>): CatalogFacets {\n const out: Record<string, string> = {}\n for (const [key, value] of params.entries()) {\n if (value && !reserved.has(key) && !isTrackingParam(key)) out[key] = value\n }\n return out\n}\n\n/** Immutably set or drop one key. */\nexport function withFacet(facets: CatalogFacets, key: string, value: string | null): CatalogFacets {\n if (value == null || value === '') {\n if (!(key in facets)) return facets\n const { [key]: _dropped, ...rest } = facets\n return rest\n }\n if (facets[key] === value) return facets\n return { ...facets, [key]: value }\n}\n\n/**\n * Fold the named `collection` shorthand into the facet map.\n *\n * `collection` is the one axis with a name of its own — a block prop, a loader\n * param and a query key all spell it out. It is still just a metadata\n * refinement, so it is merged here rather than filtered separately: two code\n * paths applying refinements is how a rail and the catalogue come to disagree\n * about what \"in this collection\" means.\n */\nexport function mergeCollectionFacet(\n facets: CatalogFacets | readonly CatalogFacetEntry[] | undefined | null,\n collection: string | undefined | null,\n): CatalogFacets {\n const map = toFacetMap(facets)\n return collection ? { collection, ...map } : map\n}\n","import { defineLoader, resolveEntityDeclaration } from '@fayz-ai/core'\nimport type { LoaderContext } from '@fayz-ai/core'\nimport type { ShopProvider } from '@fayz-ai/shop/provider'\nimport type { EntityRecord } from '@fayz-ai/shop/entities'\nimport type { Category, ListProductsOptions, Product, StorefrontFeatured } from '@fayz-ai/shop/types'\nimport { matchesFacets, mergeCollectionFacet, type CatalogFacetEntry } from './facets'\n\n// ---------------------------------------------------------------------------\n// The core storefront loaders — the reads the SDK blocks and the fleet's\n// param-driven routes actually need, behind the ShopProvider port (I11).\n//\n// Every read here goes through `ctx.shop`; nothing imports a backend. Filters\n// the provider cannot push down (category-by-name, collection tag, sale state)\n// are applied over the fetched active list, which keeps loader semantics\n// identical across the mock and Supabase providers and identical to what the\n// blocks did internally before M3. Pushing them into the providers is a\n// provider-contract change tracked for M9, not a loader change: the loader's\n// params are the stable surface.\n// ---------------------------------------------------------------------------\n\nexport type StorefrontLoaderContext = LoaderContext<ShopProvider>\n\nexport type ProductsSort = 'catalog' | 'newest' | 'price-asc' | 'price-desc' | 'name'\n\nexport interface ProductsListParams extends Record<string, unknown> {\n /** Quick filter, mirroring the products/productSlider block vocabulary:\n * 'new' implies sort 'newest'; 'sale' implies onSale. */\n filter?: 'all' | 'new' | 'sale'\n /**\n * Category id, category SLUG, or exact category name — resolved in that\n * order (see {@link filterByCategory}). The slug form is what makes the M3\n * `/category/:slug` page shape portable to a backend with opaque ids.\n */\n category?: string\n /**\n * Matched against each product's `metadata.collection` tag. The named\n * shorthand for `facets: { collection }` — both go through one matcher.\n */\n collection?: string\n /**\n * Arbitrary refinements over `product.metadata`. This is the store's own\n * discovery axis — `purpose`, `brand`, `room` — without the SDK knowing the\n * axis exists. An array-valued metadata field matches if it contains the\n * value. Accepts the authored row form or a plain map; both normalise.\n */\n facets?: Record<string, string> | readonly CatalogFacetEntry[]\n search?: string\n sort?: ProductsSort\n limit?: number\n offset?: number\n inStock?: boolean\n onSale?: boolean\n}\n\nconst SORT_TO_PROVIDER: Record<ProductsSort, Pick<ListProductsOptions, 'orderBy' | 'order'>> = {\n catalog: { orderBy: 'sort_order', order: 'asc' },\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\nasync function productsList(params: ProductsListParams, ctx: StorefrontLoaderContext): Promise<Product[]> {\n const sort: ProductsSort = params.sort ?? (params.filter === 'new' ? 'newest' : 'catalog')\n const onSale = params.onSale ?? params.filter === 'sale'\n const list = await ctx.shop.listProducts({\n status: 'active',\n search: params.search || undefined,\n ...SORT_TO_PROVIDER[sort],\n })\n let out = list\n if (params.category) {\n out = await filterByCategory(out, String(params.category), ctx)\n }\n // `collection` is folded into the facet map rather than filtered separately:\n // two code paths applying metadata refinements is how a rail and the\n // catalogue come to disagree about what \"in this collection\" means. Strict\n // equality also missed an array-valued tag, so a product in two collections\n // was in neither.\n const facets = mergeCollectionFacet(params.facets, params.collection)\n if (Object.keys(facets).length > 0) out = out.filter((p) => matchesFacets(p.metadata, facets))\n if (onSale) out = out.filter((p) => p.compareAtPrice != null && p.compareAtPrice > p.price)\n if (params.inStock) out = out.filter((p) => p.inventoryCount > 0)\n const offset = params.offset ?? 0\n return out.slice(offset, params.limit != null ? offset + params.limit : undefined)\n}\n\n/**\n * The `category` param → a filtered product list, with a DOCUMENTED resolution\n * order:\n *\n * 1. category id (`p.categoryId === param`)\n * 2. exact category name (`p.categoryName === param`)\n * 3. category SLUG (resolved through `listCategories()`, case-insensitive)\n *\n * (1) and (2) are the pre-M3 block vocabulary and stay byte-identical — a\n * store whose ids already match keeps working and pays no extra read, because\n * the categories lookup only happens when the direct match found nothing.\n *\n * (3) is why this function exists. The M3 category-landing shape is\n * `path: '/category/:slug'` + `params: { category: { $param: 'slug' } }`, which\n * previously only worked when a store's category ids HAPPENED to equal its\n * slugs — cristinarotondaro had to remap its mock catalog to make the URLs\n * resolve, and against a live backend with opaque (uuid) ids those same URLs\n * would have silently returned an empty grid. The page shape is portable now.\n */\nasync function filterByCategory(\n products: Product[],\n param: string,\n ctx: StorefrontLoaderContext,\n): Promise<Product[]> {\n const direct = products.filter((p) => p.categoryId === param || p.categoryName === param)\n if (direct.length > 0) return direct\n\n const wanted = param.trim().toLowerCase()\n if (!wanted) return direct\n const categories = await ctx.shop.listCategories()\n const match = findCategoryBySlug(categories, wanted)\n if (!match) return direct\n return products.filter((p) => p.categoryId === match.id || p.categoryName === match.name)\n}\n\n/** Depth-first slug lookup — `listCategories()` may return a nested tree. */\nfunction findCategoryBySlug(categories: Category[], slug: string): Category | null {\n for (const category of categories) {\n if ((category.slug ?? '').trim().toLowerCase() === slug) return category\n const child = category.children ? findCategoryBySlug(category.children, slug) : null\n if (child) return child\n }\n return null\n}\n\nexport interface ProductBySlugParams extends Record<string, unknown> {\n slug: string\n}\n\nasync function productBySlug(params: ProductBySlugParams, ctx: StorefrontLoaderContext): Promise<Product | null> {\n if (!params.slug) return null\n const matches = await ctx.shop.listProducts({ slug: params.slug, status: 'active', limit: 1 })\n const product = matches[0]\n if (!product) return null\n // Variants ride the product-detail read (spine M5): the option picker\n // sources from the 0028 tables through the provider port — never from the\n // productMetadata overlay. Attached here and not in listProducts because a\n // catalog grid does not pay a per-product variant read.\n if (ctx.shop.getProductVariants) {\n const { options, variants } = await ctx.shop.getProductVariants(product.id)\n if (options.length > 0 || variants.length > 0) return { ...product, options, variants }\n }\n return product\n}\n\n/**\n * The store's own «Destaques» (shop 0136), by source: `listing` (the product's\n * «Loja» tab) and `menu` («Cardápio»), each in the merchant's order. A provider\n * that does not implement it, or a failure, answers empty lists so the page\n * falls back to the app's list and then to what is on sale; a highlights row is\n * never worth an error.\n */\nasync function productsFeatured(_params: Record<string, unknown>, ctx: StorefrontLoaderContext): Promise<StorefrontFeatured> {\n const none: StorefrontFeatured = { listing: [], menu: [] }\n if (!ctx.shop.listFeaturedProducts) return none\n try {\n const got = await ctx.shop.listFeaturedProducts()\n return { listing: got?.listing ?? [], menu: got?.menu ?? [] }\n } catch {\n return none\n }\n}\n\nasync function categoriesList(_params: Record<string, unknown>, ctx: StorefrontLoaderContext): Promise<Category[]> {\n return ctx.shop.listCategories()\n}\n\n/**\n * Collections are not a catalog entity (yet — spine M4 can make them one):\n * they are the distinct `metadata.collection` tags stores already put on\n * products. The loader makes the vocabulary readable without inventing data.\n */\n// --- Custom entities (spine M4) -----------------------------------------------\n// The declaration is checked FIRST (I2: an unknown entity names the declared\n// set), then the read goes through the provider port like every other loader.\n// A provider without entity support is a capability error, not a silent [].\n\nfunction entityCapableShop(shop: ShopProvider): Required<Pick<ShopProvider, 'listEntityRecords' | 'getEntityRecordBySlug'>> & ShopProvider {\n if (!shop.listEntityRecords || !shop.getEntityRecordBySlug) {\n throw new Error(\n 'This backend provider does not support custom entities (describeStore capabilities.customEntities). ' +\n 'Both the Fayz Supabase provider and the mock provider do — a custom provider must implement the entity methods.',\n )\n }\n return shop as Required<Pick<ShopProvider, 'listEntityRecords' | 'getEntityRecordBySlug'>> & ShopProvider\n}\n\nexport interface EntityListParams extends Record<string, unknown> {\n entity: string\n limit?: number\n offset?: number\n orderBy?: string\n order?: 'asc' | 'desc'\n}\n\nasync function entityList(params: EntityListParams, ctx: StorefrontLoaderContext): Promise<EntityRecord[]> {\n resolveEntityDeclaration(String(params.entity ?? ''))\n const shop = entityCapableShop(ctx.shop)\n return shop.listEntityRecords(params.entity, {\n limit: params.limit,\n offset: params.offset,\n orderBy: params.orderBy,\n order: params.order,\n })\n}\n\nexport interface EntityBySlugParams extends Record<string, unknown> {\n entity: string\n slug: string\n}\n\nasync function entityBySlug(params: EntityBySlugParams, ctx: StorefrontLoaderContext): Promise<EntityRecord | null> {\n resolveEntityDeclaration(String(params.entity ?? ''))\n if (!params.slug) return null\n const shop = entityCapableShop(ctx.shop)\n return shop.getEntityRecordBySlug(params.entity, params.slug)\n}\n\nasync function collectionsList(_params: Record<string, unknown>, ctx: StorefrontLoaderContext): Promise<string[]> {\n const products = await ctx.shop.listProducts({ status: 'active' })\n const tags = new Set<string>()\n for (const product of products) {\n const tag = product.metadata?.collection\n if (typeof tag === 'string' && tag) tags.add(tag)\n }\n return [...tags].sort()\n}\n\nlet registered = false\n\n/** Register the SDK loaders. Idempotent; called wherever blocks are registered,\n * because the SDK blocks declare their data needs against these ids. */\nexport function registerStorefrontLoaders(): void {\n if (registered) return\n registered = true\n\n defineLoader('products.list', productsList, {\n source: 'sdk',\n title: 'Product list',\n description: 'Active products, filtered and ordered. The read behind every product rail, slider and grid.',\n output: 'Array of Product (id, slug, name, price, compareAtPrice, images, categoryId/Name, metadata …).',\n settings: [\n {\n id: 'filter',\n type: 'select',\n label: 'Quick filter',\n help: \"Mirrors the block vocabulary: 'new' = newest first, 'sale' = only discounted products, 'all' = no quick filter.\",\n options: [\n { value: 'all', label: 'All products' },\n { value: 'new', label: 'New arrivals' },\n { value: 'sale', label: 'On sale' },\n ],\n },\n {\n id: 'category',\n type: 'category',\n label: 'Category',\n help: 'Category id or exact category name. Empty means the whole catalog.',\n },\n {\n id: 'collection',\n type: 'text',\n label: 'Collection tag',\n help: \"Matched against each product's metadata.collection tag. Shorthand for the `collection` key of `facets`.\",\n },\n {\n id: 'facets',\n type: 'list',\n label: 'Metadata refinements',\n help: \"Refinements over product.metadata — the store's own discovery axis (purpose, brand, room). Every row must match. An array-valued metadata field matches if it contains the value.\",\n of: [\n { id: 'key', type: 'text', label: 'Metadata field', required: true },\n { id: 'value', type: 'text', label: 'Value', required: true },\n ],\n },\n { id: 'search', type: 'text', label: 'Search', help: 'Free-text search over name/description.' },\n {\n id: 'sort',\n type: 'select',\n label: 'Sort',\n help: \"Default 'catalog' (the store's own ordering); the 'new' quick filter implies 'newest'.\",\n options: [\n { value: 'catalog', label: 'Catalog order' },\n { value: 'newest', label: 'Newest first' },\n { value: 'price-asc', label: 'Price, low to high' },\n { value: 'price-desc', label: 'Price, high to low' },\n { value: 'name', label: 'Name' },\n ],\n },\n { id: 'limit', type: 'number', label: 'Limit', help: 'Max products returned. Empty returns all.', min: 1 },\n { id: 'offset', type: 'number', label: 'Offset', help: 'Pagination offset, applied with limit.', min: 0 },\n { id: 'inStock', type: 'boolean', label: 'In stock only' },\n { id: 'onSale', type: 'boolean', label: 'On sale only', help: 'Only products with a compare-at price above the current price.' },\n ],\n })\n\n defineLoader('products.bySlug', productBySlug, {\n source: 'sdk',\n title: 'Product by slug',\n description: 'One active product, looked up by its URL slug — the product page read.',\n output:\n 'Product with its option axes and variants attached (options/variants, from the variant tables), or null when no active product has the slug.',\n settings: [\n {\n id: 'slug',\n type: 'text',\n label: 'Slug',\n help: \"The product's URL slug. On a product route, bind it: { slug: { $param: 'slug' } }.\",\n required: true,\n },\n ],\n })\n\n defineLoader('products.featured', productsFeatured, {\n source: 'sdk',\n title: 'Featured products',\n description:\n \"The store's own highlights: products featured («Destaque no site») on the product's Loja tab and in the Cardápio, each in the merchant's order. Only products the shopper can read.\",\n output: '{ listing: string[], menu: string[] } — product ids per source, each in order. Empty lists when the store curated nothing.',\n settings: [],\n })\n\n defineLoader('categories.list', categoriesList, {\n source: 'sdk',\n title: 'Category list',\n description: 'Every catalog category, in store order.',\n output: 'Array of Category (id, name, slug, imageUrl …).',\n settings: [],\n })\n\n defineLoader('collections.list', collectionsList, {\n source: 'sdk',\n title: 'Collection tags',\n description: \"The distinct metadata.collection tags used by the store's active products.\",\n output: 'Sorted array of collection tag strings.',\n settings: [],\n })\n\n defineLoader('entity.list', entityList, {\n source: 'sdk',\n title: 'Entity records',\n description:\n 'Records of a declared custom entity (defineEntity). The read behind the entityList block and any custom listing.',\n output: 'Array of EntityRecord (id, slug, data — the declared fields —, createdAt, updatedAt).',\n settings: [\n {\n id: 'entity',\n type: 'entity',\n label: 'Entity',\n help: \"The defineEntity key, e.g. 'store_location'. Unknown keys are an error naming the declared set.\",\n required: true,\n },\n { id: 'limit', type: 'number', label: 'Limit', help: 'Max records returned. Empty returns all.', min: 1 },\n { id: 'offset', type: 'number', label: 'Offset', help: 'Pagination offset, applied with limit.', min: 0 },\n { id: 'orderBy', type: 'text', label: 'Order by', help: 'A declared field name. Empty keeps creation order.' },\n {\n id: 'order',\n type: 'select',\n label: 'Direction',\n options: [\n { value: 'asc', label: 'Ascending' },\n { value: 'desc', label: 'Descending' },\n ],\n },\n ],\n })\n\n defineLoader('entity.bySlug', entityBySlug, {\n source: 'sdk',\n title: 'Entity record by slug',\n description: 'One record of a declared custom entity, looked up by its URL slug.',\n output: 'EntityRecord, or null when no record has the slug.',\n settings: [\n { id: 'entity', type: 'entity', label: 'Entity', help: 'The defineEntity key.', required: true },\n {\n id: 'slug',\n type: 'text',\n label: 'Slug',\n help: \"The record's URL slug. On a param route, bind it: { slug: { $param: 'slug' } }.\",\n required: true,\n },\n ],\n })\n\n}\n","import type { HeroVariant } from '../lib/theme'\n// Type-only: page-blocks imports StorefrontSection from here at type level too,\n// so a value import would close the cycle. Types are erased, so this one is\n// free — same reason config.ts imports StorefrontSlots this way.\nimport type { StorefrontBlockLike } from './page-blocks'\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 /**\n * Accepts an app's own registered block, not just the SDK's typed sections.\n *\n * `home` and `pages.home` are the same page written two ways, and\n * `pages.home.blocks` has taken `StorefrontBlockLike` since the page-tree\n * work — so the short form five of seven live stores actually write was the\n * one that still could not name a block the union has never heard of. That\n * asymmetry is what forced `sections: mySections as never`, which throws away\n * type checking on the whole array to place one custom block.\n *\n * The typed union is still first in the union, so a bad `variant` on an SDK\n * section remains a type error.\n */\n sections: readonly StorefrontBlockLike[]\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\n// ---------------------------------------------------------------------------\n// Product imagery that does not exist yet.\n//\n// A store generated before anyone uploaded photos used to render a grey hole\n// per card: ProductCard was `{image && <img …>}`, so a product with no image\n// got an empty box. Categories and banners already fell back to generated art;\n// products were the one shape that did not.\n//\n// Amboras solves this by shipping six JPGs — a watch, a sneaker, a piece of\n// clothing — plus a README prescribing aspect ratios. The aspect ratios are the\n// good idea and are kept below. The photographs are not: they are right for a\n// fashion store and wrong for a butcher, a jeweller and a sticker shop, which\n// is three of our six. A generated mark carries no such claim, costs no bytes\n// and no request, and takes the store's own hue.\n// ---------------------------------------------------------------------------\n\n/**\n * The aspect ratios the SDK's layouts are built around. A replacement image\n * that honours these drops in; one that does not will letterbox or crop.\n *\n * product 3:4 portrait (cards, gallery) 750 × 1000\n * banner ~21:9 wide (promo strips) 1600 × 700\n * category 4:5 portrait (showcase tiles) 480 × 600\n *\n * `product` is 3:4 because that is what ProductCard's `imageAspect: 'portrait'`\n * actually renders (`aspect-[3/4]`). Amboras's placeholder README prescribes\n * \"3:4 portrait (800x1000px)\" — 800 × 1000 is 4:5, so following their pixels\n * would letterbox every card by 5%. Ratios are worth copying; arithmetic is\n * worth checking.\n */\nexport const PLACEHOLDER_ASPECTS = {\n product: [750, 1000],\n banner: [1600, 700],\n category: [480, 600],\n} as const\n\n/** Stable hue from a string, so the same product always gets the same mark. */\nfunction hueFrom(seed: string): number {\n let hash = 0\n for (let i = 0; i < seed.length; i++) hash = (hash * 31 + seed.charCodeAt(i)) % 360\n return hash\n}\n\n/** Up to two initials — a mark, not a word, so it never overflows the tile. */\nfunction initials(label: string): string {\n const words = label.trim().split(/\\s+/).filter(Boolean)\n if (words.length === 0) return '?'\n const letters = words.length === 1 ? words[0]!.slice(0, 2) : words[0]![0]! + words[1]![0]!\n return letters.toUpperCase()\n}\n\n/**\n * Portrait product placeholder as an SVG data-URI — deterministic per product\n * name, no network. Defaults to the prescribed 3:4.\n */\nexport function productPlaceholder(\n label: string,\n w: number = PLACEHOLDER_ASPECTS.product[0],\n h: number = PLACEHOLDER_ASPECTS.product[1],\n): string {\n const hue = hueFrom(label)\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(${hue},22%,90%)\"/>` +\n `<stop offset=\"1\" stop-color=\"hsl(${(hue + 40) % 360},26%,78%)\"/>` +\n `</linearGradient></defs>` +\n `<rect width=\"${w}\" height=\"${h}\" fill=\"url(#g)\"/>` +\n `<text x=\"50%\" y=\"50%\" text-anchor=\"middle\" dominant-baseline=\"central\" ` +\n `font-family=\"system-ui,sans-serif\" font-size=\"${Math.round(Math.min(w, h) * 0.28)}\" ` +\n `font-weight=\"600\" fill=\"hsla(${hue},30%,32%,0.42)\">${escapeXml(initials(label))}</text>` +\n `</svg>`\n return `data:image/svg+xml;utf8,${encodeURIComponent(svg)}`\n}\n\n/** A product name is store data and may contain anything — & and < included. */\nfunction escapeXml(text: string): string {\n return text\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&apos;')\n}\n","import React, { useEffect, useRef, useState } from 'react'\nimport { ChevronLeft, ChevronRight } from 'lucide-react'\nimport type { RegistryMeta } from '@fayz-ai/core'\nimport type { HeroSlide } from '../../blocks/sections'\nimport type { HeroVariant } from '../../lib/theme'\nimport { bannerPlaceholder } from '../../blocks/sections'\nimport { useStorefrontConfig } from '../../document/config'\nimport { prefersReducedMotion } from '../../lib/motion'\nimport { Link } from '../../app/router'\nimport { TID } from '../../lib/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 // Defaults to empty, not required: a block inserted from the editor arrives\n // before its content does, and a section that throws on absent props takes the\n // whole page with it. Every array prop in this file defaults for that reason.\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\nexport const heroBlockMeta = {\n label: 'Hero',\n description: 'Full-bleed opening section: one banner, an auto-advancing slider, or two side-by-side tiles.',\n settings: [\n {\n id: 'variant',\n type: 'select',\n label: 'Layout',\n help: 'banner shows the first slide only; slider cycles through every slide; split shows the first two slides as half-width tiles.',\n default: 'banner',\n options: [\n { value: 'banner', label: 'Banner' },\n { value: 'slider', label: 'Slider' },\n { value: 'split', label: 'Split (two tiles)' },\n ],\n },\n {\n id: 'height',\n type: 'select',\n label: 'Height',\n help: 'Applies to the banner and slider layouts; the split layout has a fixed height.',\n default: 'tall',\n options: [\n { value: 'tall', label: 'Tall' },\n { value: 'medium', label: 'Medium' },\n ],\n },\n {\n id: 'slides',\n type: 'list',\n label: 'Slides',\n help: 'One entry is enough for the banner layout. Extra slides are ignored unless the layout is slider (all) or split (first two).',\n required: true,\n of: [\n { id: 'title', type: 'text', label: 'Title', required: true },\n { id: 'subtitle', type: 'text', label: 'Subtitle' },\n { id: 'cta', type: 'text', label: 'Button label', help: 'Leave empty to render no button. Not shown in the split layout.' },\n { id: 'href', type: 'url', label: 'Button link', help: 'Where the button (or the whole tile, in the split layout) goes. Defaults to /catalog.' },\n {\n id: 'image',\n type: 'image',\n label: 'Background image',\n help: 'Optional — a gradient generated from the hue below is used when empty, so a slide always renders.',\n },\n {\n id: 'hue',\n type: 'number',\n label: 'Placeholder hue',\n help: 'Colour of the generated gradient, 0–360. Ignored once an image is set.',\n min: 0,\n max: 360,\n default: 200,\n },\n {\n id: 'boxed',\n type: 'boolean',\n label: 'Boxed copy',\n help: 'Frames the copy in an editorial panel instead of laying it over a dark gradient. Suits light, busy photography.',\n default: false,\n },\n ],\n },\n ],\n presets: [\n {\n name: 'Hero banner',\n props: {\n variant: 'banner',\n height: 'tall',\n slides: [\n { title: 'Coleção nova no ar', subtitle: 'Peças selecionadas, produção limitada.', cta: 'Ver coleção', href: '/catalog', hue: 210 },\n ],\n },\n },\n {\n name: 'Hero slider',\n props: {\n variant: 'slider',\n height: 'medium',\n slides: [\n { title: 'Coleção nova no ar', subtitle: 'Peças selecionadas, produção limitada.', cta: 'Ver coleção', href: '/catalog', hue: 210 },\n { title: 'Frete grátis acima de R$ 199', subtitle: 'Para todo o Brasil, em até 48h.', cta: 'Aproveitar', href: '/catalog', hue: 30 },\n ],\n },\n },\n {\n name: 'Hero split',\n props: {\n variant: 'split',\n slides: [\n { title: 'Novidades', subtitle: 'O que acabou de chegar', href: '/catalog', hue: 210 },\n { title: 'Ofertas', subtitle: 'Seleção com desconto', href: '/catalog', hue: 340 },\n ],\n },\n },\n ],\n // A hero opens a page; on a product page that job belongs to the gallery.\n enabledOn: ['home', 'collection', 'content'],\n} satisfies Omit<RegistryMeta, 'propsSchema'>\n","import { create } from 'zustand'\nimport { withFacet, type CatalogFacets } from '../data/facets'\n\nexport type CatalogSort = 'newest' | 'price-asc' | 'price-desc' | 'name'\n\n// The matcher and the facet type live in ../facets, a leaf module, so the\n// server-side loader can import them without pulling zustand in behind them.\nexport { matchesFacets } from '../data/facets'\nexport type { CatalogFacets }\n\nexport interface CatalogState {\n search: string\n categoryId: string | null\n /** Collection slug, matched against `product.metadata.collection`. */\n collection: string | null\n /** Every active metadata refinement, including `collection`. */\n facets: CatalogFacets\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 setCollection(collection: string | null): void\n /** Set or (with `null`) clear one metadata refinement. */\n setFacet(key: string, value: string | null): void\n clearFacets(): 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 collection: null,\n facets: {} as CatalogFacets,\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 // `collection` is mirrored into `facets` rather than filtered separately, so\n // there is exactly one code path applying metadata refinements.\n setCollection: (collection) =>\n set((s) => ({ collection, facets: withFacet(s.facets, 'collection', collection) })),\n setFacet: (key, value) =>\n set((s) => ({\n facets: withFacet(s.facets, key, value),\n ...(key === 'collection' ? { collection: value } : null),\n })),\n clearFacets: () => set({ facets: {}, collection: null }),\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 React from 'react'\nimport type { BlockNode, RegistryMeta } from '@fayz-ai/core'\nimport type { Category } from '@fayz-ai/shop/types'\nimport { useCatalogStore } from '../../stores/catalog.store'\nimport { useStorefrontConfig } from '../../document/config'\nimport { BlockDataError, useBlockData } from '../../blocks/page-data'\nimport { bannerPlaceholder } from '../../blocks/sections'\nimport { Reveal } from '../../lib/motion'\nimport { navigateTo } from '../../app/router'\nimport { TID } from '../../lib/testids'\nimport { SmoothImage } from '../SmoothImage'\n\nexport function CategoryShowcase({\n style,\n title,\n node,\n}: {\n style: 'bubbles' | 'tiles'\n title?: string\n /** The block node, when rendered from a tree — carries instance `data` overrides. */\n node?: BlockNode\n}) {\n // The declared need ('categories.list', no params): resolved once per page\n // through the provider port, shared with anything else reading categories.\n const { status, data, error, loader } = useBlockData<Category[]>(node, 'categories', {\n loader: 'categories.list',\n params: {},\n })\n const categories = data ?? []\n const config = useStorefrontConfig()\n const setCategoryId = useCatalogStore((s) => s.setCategoryId)\n\n if (status === 'error') return <BlockDataError loader={loader} message={error} />\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 variant={{ width: 96 }}\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 variant={{ sizes: '(min-width: 1024px) 33vw, 100vw' }}\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\nexport const categoriesBlockMeta = {\n label: 'Categories',\n description: 'Index of every catalog category, as round avatars or tall image tiles.',\n // No setting selects which categories to show: the block renders the whole\n // category list from the catalog, so there is nothing per-category to author.\n settings: [\n {\n id: 'style',\n type: 'select',\n label: 'Layout',\n help: 'bubbles = round avatars in a centered row; tiles = tall image cards in a 4-column grid.',\n options: [\n { value: 'bubbles', label: 'Bubbles' },\n { value: 'tiles', label: 'Tiles' },\n ],\n default: 'tiles',\n },\n {\n id: 'title',\n type: 'text',\n label: 'Heading',\n help: 'Optional heading above the categories. Leave empty to render the grid with no heading.',\n },\n ],\n presets: [\n { name: 'Category tiles', props: { style: 'tiles', title: 'Nossas categorias' } },\n { name: 'Category bubbles', props: { style: 'bubbles', title: 'Compre por categoria' } },\n ],\n // Not on 'product': a full category index on a product page competes with the\n // buying decision instead of supporting it.\n enabledOn: ['home', 'catalog', 'content'],\n // The declared read (M3): the whole category list, no params.\n data: { categories: { loader: 'categories.list' } },\n} satisfies Omit<RegistryMeta, 'propsSchema'>\n","import { getShopProvider } from '@fayz-ai/shop/runtime'\nimport type { CreateProductEnquiryInput } from '@fayz-ai/shop/types'\nimport { useStorefrontConfig } from '../document/config'\n\n/** The enquiry path, for stores that take orders as conversations rather than checkouts. */\nexport function useEnquiry() {\n const config = useStorefrontConfig()\n\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 { enquiry: config.enquiry, createProductEnquiry }\n}\n","import type { Product } from '@fayz-ai/shop/types'\nimport { navigateTo } from '../app/router'\nimport { useCartStore } from '../stores/cart.store'\nimport type { ProductOptionSelection } from '../data/product-options'\nimport { useEnquiry } from './use-enquiry'\n\n/** The verbs a block calls — bound so a block never reaches into a store directly. */\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 { useMemo } from 'react'\nimport type { Product } from '@fayz-ai/shop/types'\nimport { useMarketStore, withMarketPrice } from '../stores/market.store'\n\n/**\n * The product as the buyer's market sells it (0116): its price and currency,\n * or out of stock where the market has no price. Re-renders when the market\n * or its price list changes. The default market (and a store without markets)\n * gets the product back untouched.\n */\nexport function useMarketProduct<T extends Product | null | undefined>(product: T): T {\n const active = useMarketStore((s) => s.active)\n const prices = useMarketStore((s) => s.prices)\n return useMemo(\n () => (product ? (withMarketPrice(product, { active, prices }) as T) : product),\n [product, active, prices],\n )\n}\n","import React from 'react'\nimport { formatMoney } from '../lib/format'\nimport { useStorefrontConfig } from '../document/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 React from 'react'\nimport { useStorefrontConfig } from '../document/config'\nimport type { StorefrontConfig } from '../document/config'\nimport { formatMoney } from '../lib/format'\n\n/**\n * The published payment terms — the Pix price and the interest-free instalment.\n *\n * Brazilian storefronts show these on every card and every PDP, and they are\n * not a discount in the SDK's sense: nothing is applied at checkout, no coupon\n * exists, and the instalment is a property of the acquirer, not the order. That\n * is why they live in `config.payments.terms` and render as copy rather than\n * going anywhere near the cart total.\n */\n\nexport interface ResolvedPaymentTerms {\n /** Price when paying by Pix, if the store advertises a Pix discount. */\n pixPrice: number | null\n pixDiscountPercent: number | null\n /** Number of interest-free instalments this price supports (0 = don't show). */\n installments: number\n installmentValue: number\n}\n\nconst DEFAULT_MIN_INSTALLMENT = 10\n\n/**\n * `metadata.pixPrice` wins over the percentage: a store migrating from another\n * platform usually has a real per-SKU Pix price already, and recomputing it\n * from a rounded percentage would disagree with their own listings by cents.\n */\nexport function resolvePaymentTerms(\n price: number,\n config: Pick<StorefrontConfig, 'payments'>,\n metadata?: Record<string, unknown> | null,\n): ResolvedPaymentTerms {\n const terms = config.payments?.terms\n const explicit = typeof metadata?.pixPrice === 'number' ? metadata.pixPrice : null\n const pct = terms?.pixDiscountPercent ?? null\n const pixPrice =\n explicit != null && explicit < price\n ? explicit\n : pct && pct > 0\n ? Number((price * (1 - pct / 100)).toFixed(2))\n : null\n\n const min = terms?.minInstallmentValue ?? DEFAULT_MIN_INSTALLMENT\n const max = terms?.maxInstallments ?? 0\n const installments = max > 1 ? Math.min(max, Math.floor(price / min)) : 0\n\n return {\n pixPrice,\n pixDiscountPercent: pct,\n installments: installments >= 2 ? installments : 0,\n installmentValue: installments >= 2 ? price / installments : 0,\n }\n}\n\nexport interface PaymentTermsProps {\n price: number\n metadata?: Record<string, unknown> | null\n /** `card` is the two-line compact form; `detail` is the PDP block. */\n variant?: 'card' | 'detail'\n className?: string\n}\n\nexport function PaymentTerms({ price, metadata, variant = 'card', className = '' }: PaymentTermsProps) {\n const config = useStorefrontConfig()\n const terms = resolvePaymentTerms(price, config, metadata)\n if (terms.pixPrice == null && terms.installments === 0) return null\n\n const currency = config.currency\n const locale = config.locale\n const compact = variant === 'card'\n\n return (\n <div\n data-testid=\"payment-terms\"\n className={`${compact ? 'mt-0.5 space-y-0.5 text-[11px]' : 'mt-3 space-y-1 text-sm'} leading-tight text-muted-foreground ${className}`}\n >\n {terms.pixPrice != null && (\n <p data-testid=\"payment-terms-pix\">\n <strong className=\"font-semibold text-foreground\">{formatMoney(terms.pixPrice, currency, locale)}</strong>{' '}\n no Pix\n {terms.pixDiscountPercent ? ` (${terms.pixDiscountPercent}% de desconto)` : ''}\n </p>\n )}\n {terms.installments > 0 && (\n <p data-testid=\"payment-terms-installments\">\n ou {terms.installments}x de {formatMoney(terms.installmentValue, currency, locale)} sem juros\n </p>\n )}\n </div>\n )\n}\n","import { TID } from '../lib/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 { useMarketProduct } from '../../hooks/use-market-product'\nimport React from 'react'\nimport { ShoppingBag } from 'lucide-react'\nimport { useStorefrontConfig } from '../../document/config'\nimport { Link, navigateTo } from '../../app/router'\nimport { getProductOptionGroups } from '../../data/product-options'\nimport { Price } from '../Price'\nimport { PaymentTerms } from '../PaymentTerms'\nimport { TID } from '../../lib/testids'\nimport { productCardComponentContract } from '../../extend/component-selectors'\nimport { useStorefrontActions } from '../../hooks/use-storefront-actions'\nimport type { ProductImage } from '@fayz-ai/shop/types'\nimport type { ProductCardImageOrder, ProductCardProps } from '../../extend/component-contracts'\nimport { SmoothImage } from '../SmoothImage'\nimport { productPlaceholder } from '../../blocks/sections'\nimport { Slot } from '../../extend/slots'\nimport { getProductCardBadges, type ProductCardBadge } from '../../extend/extension-points'\n\nconst BADGE_TONE_CLASSES: Record<NonNullable<ProductCardBadge['tone']> | 'default', string> = {\n default: 'bg-gray-900/80 text-white',\n accent: 'bg-primary text-primary-foreground',\n warning: 'bg-amber-500 text-white',\n}\n\n/** Badges contributed through the product.cardBadge extension point (spine\n * M7). Async because handlers may be; renders nothing until they answer. */\nfunction useExtensionBadges(product: ProductCardProps['product']): ProductCardBadge[] {\n const [badges, setBadges] = React.useState<ProductCardBadge[]>([])\n React.useEffect(() => {\n let cancelled = false\n getProductCardBadges(product).then((next) => {\n // Skip the state write when nothing contributed — the common case — so\n // a store with no badge handlers re-renders zero extra times.\n if (!cancelled && next.length > 0) setBadges(next)\n })\n return () => {\n cancelled = true\n }\n }, [product.id, product.price, product.inventoryCount])\n return badges\n}\n\n/**\n * The card's photo, per the declared rule (see {@link ProductCardImageOrder}).\n *\n * Exported and pure for the same reason `orderGalleryImages` is: this single\n * choice is what a store used to replace the whole card for. `position` breaks\n * ties by image id too, so a catalog with duplicate sort orders still renders\n * the same photo on every load — the nondeterminism IS the bug.\n */\nexport function pickProductCardImage(\n images: ProductImage[],\n order: ProductCardImageOrder = 'primary',\n): ProductImage | undefined {\n if (images.length === 0) return undefined\n if (order === 'position') {\n return [...images].sort(\n (a, b) => (a.sortOrder ?? 0) - (b.sortOrder ?? 0) || String(a.id).localeCompare(String(b.id)),\n )[0]\n }\n return images.find((i) => i.isPrimary) ?? images[0]\n}\n\nexport function ProductCard({ product: catalogProduct, config: providedConfig, actions: providedActions, imageOrder = 'primary' }: ProductCardProps) {\n const product = useMarketProduct(catalogProduct)\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 = pickProductCardImage(product.images, imageOrder)\n const cardStyle = config.theme?.productCard?.style ?? 'card'\n const extensionBadges = useExtensionBadges(product)\n const aspect = config.theme?.productCard?.imageAspect === 'portrait' ? 'aspect-[3/4]' : 'aspect-square'\n const purchaseMode = config.commerceMode === 'checkout'\n\n // Every card provides its own product, so a slot rendered once per card in a\n // grid still describes the right one.\n const cardSlotContext = { product, soldOut, onSale, hasOptions }\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 <Slot area=\"productCard\" name=\"top\" context={cardSlotContext} />\n\n <div\n className={`relative ${aspect} overflow-hidden bg-muted`}\n style={{ borderRadius: cardStyle === 'editorial' ? 'var(--sf-radius-card)' : undefined }}\n >\n <Link to={`/product/${product.slug}`} className=\"block h-full w-full\">\n {/* A product with no photo used to render an empty box. It now renders\n a generated mark, so a store built before the photo shoot still\n looks like a store. */}\n <SmoothImage\n src={image?.url ?? productPlaceholder(product.name)}\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 // A card is a quarter of the row on a desktop grid, half on a phone.\n variant={{ sizes: '(min-width: 1024px) 25vw, (min-width: 640px) 33vw, 50vw' }}\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 {extensionBadges.map((badge) => (\n <span\n key={badge.text}\n data-extension-badge={badge.text}\n className={`rounded-full px-2.5 py-0.5 text-xs font-semibold ${BADGE_TONE_CLASSES[badge.tone ?? 'default']}`}\n >\n {badge.text}\n </span>\n ))}\n </div>\n </Link>\n {/* A sibling of the anchor, not a child: the container is `relative`, so\n overlay content positions itself with `absolute`. Three stores wanted\n a chip or a ribbon here and each forked the card to get it. */}\n <Slot area=\"productCard\" name=\"imageOverlay\" context={cardSlotContext} />\n </div>\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\n <Slot area=\"productCard\" name=\"afterName\" context={cardSlotContext} />\n\n <div className=\"mt-auto flex items-center justify-between gap-3 pt-2\">\n {purchaseMode ? (\n // The terms sit under the price rather than beside it: they are two\n // more lines of the same statement, and the add button stays put.\n // Renders nothing unless the store configured `payments.terms`.\n <div className=\"min-w-0\">\n <Price\n value={product.price}\n compareAt={product.compareAtPrice}\n testId={productCardComponentContract.priceTestId}\n />\n <PaymentTerms price={product.price} metadata={product.metadata} variant=\"card\" />\n </div>\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\n <Slot area=\"productCard\" name=\"underPrice\" context={cardSlotContext} />\n </div>\n </div>\n )\n}\n","import type { ComponentType } from 'react'\n\n// ---------------------------------------------------------------------------\n// Overrides that are not all-or-nothing.\n//\n// `components: { ProductDetail: MyDetail }` means \"I own this page and its\n// maintenance debt forever\". Four of our five customizing stores took that deal\n// on ProductCard, and every one of them lost something in the process: the sale\n// badge, the variant guard that keeps quick-add from creating an option-less\n// line, `commerceMode` gating, `theme.productCard` honouring. None of them\n// wanted to reinvent the card — they wanted two or three things about it.\n//\n// So an override may now supply props instead of a component. Lesson taken\n// directly from FastStore's `getOverriddenSection({ Section, components })`,\n// where the granularity is a sub-component rather than the whole section.\n// ---------------------------------------------------------------------------\n\n/**\n * Either the whole component (what stores write today), or an adjustment.\n *\n * `{ props }` alone keeps the SDK component and forces some of its props.\n * `{ component, props }` replaces it and pre-binds props — useful for a wrapper\n * that needs a couple of fixed values.\n */\nexport type ComponentOverride<P> =\n | ComponentType<P>\n | {\n component?: ComponentType<P>\n /** Props forced on the component, overriding what the page passes. */\n props?: Partial<P>\n }\n\n/**\n * True for anything React will render as a component.\n *\n * The `$$typeof` branch is not defensive noise: `React.memo(X)` and\n * `React.forwardRef(X)` return OBJECTS, not functions. Without it, a store\n * writing `ProductCard: memo(MyCard)` would be read as the `{component, props}`\n * form with neither key present, and the SDK would silently render its own card\n * while the store believed its override was live.\n */\nfunction isComponentLike<P>(value: unknown): value is ComponentType<P> {\n if (typeof value === 'function') return true\n return typeof value === 'object' && value !== null && '$$typeof' in value\n}\n\nexport interface ResolvedOverride<P> {\n Component: ComponentType<P>\n /** Props to apply last, so an override wins over what the page computed. */\n props: Partial<P>\n /** True when the store replaced the component rather than adjusting it. */\n replaced: boolean\n}\n\n/**\n * Normalize both override forms against the SDK's own component.\n *\n * Override props are applied AFTER the page's, deliberately: an override that\n * could not win over a computed prop would be unable to change the thing the\n * store is overriding it for.\n */\nexport function resolveOverride<P>(\n override: ComponentOverride<P> | undefined,\n fallback: ComponentType<P>,\n): ResolvedOverride<P> {\n if (!override) return { Component: fallback, props: {}, replaced: false }\n if (isComponentLike<P>(override)) return { Component: override, props: {}, replaced: true }\n const { component, props } = override\n return {\n Component: component ?? fallback,\n props: props ?? {},\n replaced: component != null,\n }\n}\n\n/**\n * The component an override resolves to, or undefined when the store only\n * adjusted props. Lets a page keep its existing `if (Override) …` branch, which\n * exists because replacing a page body is structurally different from tweaking\n * one of its props.\n */\nexport function overrideComponent<P>(override: ComponentOverride<P> | undefined): ComponentType<P> | undefined {\n if (!override) return undefined\n if (isComponentLike<P>(override)) return override\n return override.component\n}\n\n/** The props an override forces, whether or not it also replaces the component. */\nexport function overrideProps<P>(override: ComponentOverride<P> | undefined): Partial<P> {\n if (!override || isComponentLike<P>(override)) return {}\n return override.props ?? {}\n}\n","import React from 'react'\nimport type { BlockNode, RegistryMeta } from '@fayz-ai/core'\nimport type { Product } from '@fayz-ai/shop/types'\nimport { getStorefrontComponents, useStorefrontConfig } from '../../document/config'\nimport { useStorefrontActions } from '../../hooks/use-storefront-actions'\nimport { BlockDataError, useBlockData } from '../../blocks/page-data'\nimport { ProductCard } from './ProductCard'\nimport { Reveal } from '../../lib/motion'\nimport { Link } from '../../app/router'\nimport { TID } from '../../lib/testids'\nimport { resolveOverride } from '../../extend/component-override'\n\nexport function ProductRail({\n title,\n subtitle,\n eyebrow,\n filter = 'all',\n limit = 4,\n node,\n}: {\n title: string\n subtitle?: string\n eyebrow?: string\n filter?: 'sale' | 'new' | 'all'\n limit?: number\n /** The block node, when rendered from a tree — carries instance `data` overrides. */\n node?: BlockNode\n}) {\n const config = useStorefrontConfig()\n const actions = useStorefrontActions()\n const components = getStorefrontComponents(config)\n const { Component: ProductCardComponent, props: cardOverrideProps } = resolveOverride(components.ProductCard, ProductCard)\n // The block's declared need (`productsBlockMeta.data`), resolved once per\n // page by the page-level resolver and deduped with every block asking the\n // same question. Used as plain JSX (no node), the fallback resolves the same\n // loader directly — the read goes through the provider port either way (I11).\n const { status, data, error, loader } = useBlockData<Product[]>(node, 'products', {\n loader: 'products.list',\n params: { filter, limit },\n })\n if (status === 'error') return <BlockDataError loader={loader} message={error} />\n const loading = status !== 'ready'\n const visible = data ?? []\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 {...cardOverrideProps}\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\nexport const productsBlockMeta = {\n label: 'Product rail',\n description: 'Grid of product cards drawn from the catalog by a filter, with an optional heading.',\n settings: [\n { id: 'title', type: 'text', label: 'Title', required: true },\n { id: 'subtitle', type: 'text', label: 'Subtitle', help: 'One line under the title. Optional.' },\n {\n id: 'eyebrow',\n type: 'text',\n label: 'Eyebrow',\n help: \"Small caps label above the title, e.g. 'curadoria'.\",\n },\n {\n id: 'filter',\n type: 'select',\n label: 'Which products',\n help: \"sale = only products with a compare-at price above the current price; new = newest first; all = catalog order. 'sale' renders nothing when no product is discounted.\",\n options: [\n { value: 'all', label: 'All products' },\n { value: 'new', label: 'New arrivals' },\n { value: 'sale', label: 'On sale' },\n ],\n default: 'all',\n },\n {\n id: 'limit',\n type: 'number',\n label: 'How many',\n help: 'Rendered in a 4-column grid, so multiples of 4 fill the last row.',\n min: 1,\n max: 24,\n default: 4,\n },\n ],\n presets: [\n {\n name: 'Featured products',\n props: {\n eyebrow: 'curadoria',\n title: 'Destaques',\n subtitle: 'Uma seleção do que temos de melhor.',\n filter: 'all',\n limit: 4,\n },\n },\n {\n name: 'New arrivals',\n props: { title: 'Novidades', subtitle: 'As últimas peças que chegaram à loja.', filter: 'new', limit: 8 },\n },\n ],\n // 'product' included: an unfiltered rail below a product is the usual\n // \"you may also like\" surface.\n enabledOn: ['home', 'catalog', 'collection', 'product', 'content'],\n // The declared read (M3): resolved once per page, deduped with every other\n // block asking the same question. `$prop` bindings keep the declaration and\n // the rendered block in agreement — setting defaults fill unset props.\n data: {\n products: {\n loader: 'products.list',\n params: { filter: { $prop: 'filter' }, limit: { $prop: 'limit' } },\n },\n },\n} satisfies Omit<RegistryMeta, 'propsSchema'>\n","import React, { useEffect, useRef, useState } from 'react'\nimport { ChevronLeft, ChevronRight } from 'lucide-react'\nimport { Link } from '../../app/router'\nimport { TID } from '../../lib/testids'\nimport { prefersReducedMotion } from '../../lib/motion'\nimport type { RegistryMeta } from '@fayz-ai/core'\nimport type { MediaCarouselItem } from '../../blocks/sections'\n// `image` is required here and the component has no fallback, so the presets\n// generate one — an inserted carousel must never land as a blank slab.\nimport { bannerPlaceholder } from '../../blocks/sections'\nimport { useStorefrontConfig } from '../../document/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 // Empty rather than absent: an inserted block has no content yet, and a\n // section that throws on missing props takes the whole page with it.\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\nexport const mediaCarouselBlockMeta = {\n label: 'Media carousel',\n description: 'Editorial full-bleed image carousel with oversized headline, eyebrow and link.',\n settings: [\n {\n id: 'items',\n type: 'list',\n label: 'Slides',\n help: 'Every slide needs an image — it is the background, there is no fallback. A single slide renders as a static banner (no arrows, no autoplay).',\n required: true,\n of: [\n { id: 'image', type: 'image', label: 'Background image', help: 'Wide landscape art; the copy sits over it.', required: true },\n { id: 'imageAlt', type: 'text', label: 'Image alt text', help: 'Falls back to the title when empty.' },\n { id: 'eyebrow', type: 'text', label: 'Eyebrow', help: 'Small uppercase label above the headline.' },\n { id: 'title', type: 'text', label: 'Headline', help: 'Rendered very large — a few words read best.', required: true },\n { id: 'subtitle', type: 'text', label: 'Subtitle' },\n { id: 'cta', type: 'text', label: 'Button label', help: 'Leave empty to render no button.' },\n { id: 'href', type: 'url', label: 'Button link', help: 'Defaults to /catalog.' },\n {\n id: 'align',\n type: 'select',\n label: 'Copy alignment',\n help: 'Where the copy sits horizontally over the image — move it off the subject of the photo.',\n default: 'start',\n options: [\n { value: 'start', label: 'Left' },\n { value: 'center', label: 'Center' },\n { value: 'end', label: 'Right' },\n ],\n },\n ],\n },\n {\n id: 'height',\n type: 'select',\n label: 'Height',\n default: 'tall',\n options: [\n { value: 'medium', label: 'Medium' },\n { value: 'tall', label: 'Tall' },\n { value: 'screen', label: 'Full screen' },\n ],\n },\n {\n id: 'autoplayMs',\n type: 'number',\n label: 'Autoplay interval (ms)',\n help: 'Set 0 to disable autoplay. Autoplay also stops after the first visitor interaction, with a single slide, or under reduced-motion.',\n default: 7000,\n min: 0,\n max: 30000,\n },\n {\n id: 'overlay',\n type: 'select',\n label: 'Image overlay',\n help: 'The copy is always white — keep dark or soft unless the images are already dark enough to read over.',\n default: 'dark',\n options: [\n { value: 'dark', label: 'Dark' },\n { value: 'soft', label: 'Soft' },\n { value: 'none', label: 'None' },\n ],\n },\n ],\n presets: [\n {\n name: 'Media carousel',\n props: {\n height: 'tall',\n overlay: 'dark',\n autoplayMs: 7000,\n items: [\n {\n eyebrow: 'nova coleção',\n title: 'Feito para durar',\n subtitle: 'Peças autorais, produção limitada e acabamento à mão.',\n cta: 'Ver coleção',\n href: '/catalog',\n align: 'start',\n image: bannerPlaceholder('Feito para durar', 210, 250),\n },\n {\n eyebrow: 'seleção',\n title: 'Os favoritos da casa',\n subtitle: 'O que nossos clientes mais levam.',\n cta: 'Explorar',\n href: '/catalog',\n align: 'start',\n image: bannerPlaceholder('Os favoritos da casa', 30, 12),\n },\n ],\n },\n },\n ],\n // Full-bleed and typographically loud: an opener, not something to drop above a\n // product's buy box.\n enabledOn: ['home', 'collection', 'content'],\n} satisfies Omit<RegistryMeta, 'propsSchema'>\n","import React, { useRef } from 'react'\nimport type { BlockNode, RegistryMeta } from '@fayz-ai/core'\nimport type { Product } from '@fayz-ai/shop/types'\nimport { ChevronLeft, ChevronRight } from 'lucide-react'\nimport { getStorefrontComponents, useStorefrontConfig } from '../../document/config'\nimport { useStorefrontActions } from '../../hooks/use-storefront-actions'\nimport { BlockDataError, useBlockData } from '../../blocks/page-data'\nimport { ProductCard } from './ProductCard'\nimport { Link } from '../../app/router'\nimport { TID } from '../../lib/testids'\nimport { resolveOverride } from '../../extend/component-override'\nimport { toFacetMap, type CatalogFacetEntry } from '../../data/facets'\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 /**\n * Arbitrary `product.metadata` refinements, the same model the catalogue\n * page uses. A rail for a store's own discovery axis needs no SDK change.\n * Authored as rows (`[{ key: 'purpose', value: 'presentear' }]`) or as a map\n * in hand-written config; both normalise.\n */\n facets?: Record<string, string> | readonly CatalogFacetEntry[]\n limit?: number\n cta?: string\n href?: string\n className?: string\n /** The block node, when rendered from a tree — carries instance `data` overrides. */\n node?: BlockNode\n}\n\nexport function ProductSlider({\n title,\n subtitle,\n eyebrow,\n filter = 'all',\n categoryName,\n collection,\n facets,\n limit = 10,\n cta = 'View all',\n href,\n className = '',\n node,\n}: ProductSliderProps) {\n const config = useStorefrontConfig()\n const actions = useStorefrontActions()\n const viewportRef = useRef<HTMLDivElement>(null)\n const components = getStorefrontComponents(config)\n const { Component: ProductCardComponent, props: cardOverrideProps } = resolveOverride(components.ProductCard, ProductCard)\n // The block's declared need, resolved once per page and deduped with every\n // block asking the same question. A document instance may rebind a param\n // (e.g. `category: { $param: 'slug' }`) and this hook follows the rebound\n // declaration; used as plain JSX, the fallback resolves the same loader\n // directly. Either way the read goes through the provider port (I11).\n const { status, data, error, loader } = useBlockData<Product[]>(node, 'products', {\n loader: 'products.list',\n params: { filter, category: categoryName, collection, facets: toFacetMap(facets), limit },\n })\n const loading = status !== 'ready'\n const visible = data ?? []\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 (status === 'error') return <BlockDataError loader={loader} message={error} />\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 {...cardOverrideProps}\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\nexport const productSliderBlockMeta = {\n label: 'Product slider',\n description: 'Side-scrolling carousel of product cards, for a catalog too long to show as a grid.',\n settings: [\n { id: 'title', type: 'text', label: 'Title', required: true },\n { id: 'subtitle', type: 'text', label: 'Subtitle', help: 'One line under the title. Optional.' },\n {\n id: 'eyebrow',\n type: 'text',\n label: 'Eyebrow',\n help: \"Small caps label above the title, e.g. 'novidades'.\",\n },\n {\n id: 'filter',\n type: 'select',\n label: 'Which products',\n help: 'sale = only products with a compare-at price above the current price; new = newest first; all = catalog order. Applied before the category and collection filters.',\n options: [\n { value: 'all', label: 'All products' },\n { value: 'new', label: 'New arrivals' },\n { value: 'sale', label: 'On sale' },\n ],\n default: 'all',\n },\n {\n id: 'categoryName',\n // A real catalog entity backs this, so the author gets a picker — but the\n // component matches `product.categoryName`, so the value must be the\n // category's NAME, not its id.\n type: 'category',\n label: 'Limit to category',\n help: \"Category name, matched exactly against the product's category name (not the category id). Leave empty for the whole catalog.\",\n },\n {\n id: 'collection',\n // Deliberately not the `collection` control: there is no collection\n // entity in the catalog to pick from — this matches the free-form\n // `metadata.collection` tag stored on each product.\n type: 'text',\n label: 'Limit to collection',\n help: \"Matched against each product's `metadata.collection` value. This is a free-form tag set per product, not a catalog entity — leave empty unless the store already uses it.\",\n },\n {\n id: 'facets',\n type: 'list',\n label: 'Metadata refinements',\n help: \"The store's own discovery axis over product.metadata — e.g. purpose = presentear. Every row must match. An array-valued metadata field matches if it contains the value. `collection` above is the named shorthand for one of these.\",\n of: [\n { id: 'key', type: 'text', label: 'Metadata field', help: \"The product.metadata key, e.g. 'purpose'.\", required: true },\n { id: 'value', type: 'text', label: 'Value', help: \"The value to match, e.g. 'presentear'.\", required: true },\n ],\n },\n {\n id: 'limit',\n type: 'number',\n label: 'How many',\n help: 'Cards in the horizontal track. Anything past the viewport is reached by scrolling or the arrows.',\n min: 1,\n max: 24,\n default: 10,\n },\n { id: 'cta', type: 'text', label: 'Link text', help: 'Empty hides the link below the slider.', default: 'View all' },\n {\n id: 'href',\n type: 'url',\n label: 'Link target',\n help: \"Where the link goes. Defaults to the store's catalog page.\",\n },\n ],\n presets: [\n {\n name: 'New arrivals',\n props: {\n eyebrow: 'novidades',\n title: 'Acabou de chegar',\n subtitle: 'As peças mais recentes do nosso catálogo.',\n filter: 'new',\n limit: 10,\n cta: 'Ver tudo',\n },\n },\n {\n name: 'You may also like',\n props: { title: 'Você também pode gostar', filter: 'all', limit: 12, cta: 'Ver tudo' },\n },\n ],\n enabledOn: ['home', 'catalog', 'collection', 'product', 'content'],\n // The declared read (M3). A document instance may override a binding — e.g.\n // a category landing page binds `category` to the route:\n // data: { products: { loader: 'products.list',\n // params: { category: { $param: 'slug' } } } }\n data: {\n products: {\n loader: 'products.list',\n params: {\n filter: { $prop: 'filter' },\n category: { $prop: 'categoryName' },\n collection: { $prop: 'collection' },\n limit: { $prop: 'limit' },\n },\n },\n },\n} satisfies Omit<RegistryMeta, 'propsSchema'>\n","import React from 'react'\nimport type { Product } from '@fayz-ai/shop/types'\nimport { ProductCard } from '../product/ProductCard'\nimport { getStorefrontComponents, useStorefrontConfig } from '../../document/config'\nimport { useStorefrontActions } from '../../hooks/use-storefront-actions'\nimport { TID } from '../../lib/testids'\nimport { resolveOverride } from '../../extend/component-override'\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 { Component: ProductCardComponent, props: cardOverrideProps } = resolveOverride(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 {...cardOverrideProps}\n />\n ))}\n </div>\n )\n}\n","import { useLoader } from '../blocks/page-data'\nimport type { Category } from '@fayz-ai/shop/types'\n\n/**\n * Every catalog category, in store order.\n *\n * Reads through the declared `categories.list` loader instead of calling\n * `getShopProvider().listCategories()` from an effect. Same provider, same\n * query, same result — but a read that goes through the port is deduped with\n * any block on the page asking the same question, and it can be resolved ahead\n * of render. That second property is why the change matters: the footer's\n * category column is on every page of every store, and a read that only exists\n * inside an effect is permanently empty in a headless render (M8) and in any\n * future SSR pass (L4). A read that reaches the provider directly can be\n * neither deduped nor pre-resolved.\n */\nexport function useCategories(): { categories: Category[]; loading: boolean } {\n const { status, data } = useLoader<Category[]>('categories.list', {})\n return { categories: data ?? [], loading: status === 'loading' || status === 'idle' }\n}\n","import React from 'react'\nimport { useCatalogStore } from '../../stores/catalog.store'\nimport type { CatalogSort } from '../../stores/catalog.store'\nimport { useCategories } from '../../hooks/use-categories'\nimport { useStorefrontConfig } from '../../document/config'\nimport { TID } from '../../lib/testids'\n\n/**\n * A declarative refinement over `product.metadata`, rendered as its own filter\n * group. `swatch` turns a value into a colour chip instead of a text row, which\n * is what a colour filter has to be — a list reading \"Preto / Cobre / Prata\" is\n * not how anyone shops for colour.\n */\nexport interface CatalogFacetConfig {\n /** The `product.metadata` key this refines. */\n key: string\n label: string\n values: readonly { value: string; label?: string; swatch?: string }[]\n}\n\nexport function FiltersPanel() {\n const { categories } = useCategories()\n const catalog = useCatalogStore()\n const facets = useStorefrontConfig().catalogFacets ?? []\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 {/* Store-declared metadata facets (colour, purpose, brand, …) */}\n {facets.map((facet) => {\n const active = catalog.facets[facet.key]\n const swatched = facet.values.some((v) => v.swatch)\n return (\n <div key={facet.key} className=\"space-y-2\">\n <h3 className=\"text-sm font-semibold\">{facet.label}</h3>\n <div className={swatched ? 'flex flex-wrap gap-2' : 'space-y-1'}>\n {facet.values.map((v) => {\n const on = active === v.value\n const label = v.label ?? v.value\n const toggle = () => catalog.setFacet(facet.key, on ? null : v.value)\n if (v.swatch) {\n return (\n <button\n key={v.value}\n type=\"button\"\n onClick={toggle}\n title={label}\n aria-pressed={on}\n data-testid={`filter-facet-${facet.key}-${v.value}`}\n // 36px hit area around a 20px chip: a colour swatch is\n // still a touch target.\n className={`grid h-9 w-9 place-items-center rounded-md transition-colors ${\n on ? 'bg-primary/10 ring-1 ring-primary' : 'hover:bg-muted'\n }`}\n >\n <span className=\"sr-only\">{label}</span>\n <span\n aria-hidden\n className=\"h-5 w-5 rounded-full ring-1 ring-inset ring-black/20\"\n style={{ background: v.swatch }}\n />\n </button>\n )\n }\n return (\n <button\n key={v.value}\n type=\"button\"\n onClick={toggle}\n aria-pressed={on}\n data-testid={`filter-facet-${facet.key}-${v.value}`}\n className={`w-full rounded-md px-2 py-1.5 text-left text-sm transition-colors ${\n on ? 'bg-primary/10 font-medium text-primary' : 'hover:bg-muted'\n }`}\n >\n {label}\n </button>\n )\n })}\n </div>\n </div>\n )\n })}\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 React, { useEffect, useMemo, useRef } from 'react'\nimport { X } from 'lucide-react'\nimport type { Product } from '@fayz-ai/shop/types'\nimport { useCatalogStore, type CatalogSort } from '../stores/catalog.store'\nimport { facetsFromQuery, isTrackingParam } from '../data/facets'\nimport { useLoader } from '../blocks/page-data'\nimport { ProductGrid } from '../components/collection/ProductGrid'\nimport { FiltersPanel } from '../components/collection/FiltersPanel'\nimport { useStorefrontConfig } from '../document/config'\nimport { useStorefrontHead } from '../hooks/use-storefront-head'\nimport { matchPath, useRoutePath, useRouterAdapter } from '../app/router'\nimport { Slot } from '../extend/slots'\n\nconst SORTS: CatalogSort[] = ['newest', 'price-asc', 'price-desc', 'name']\n\n/** Query params the catalog owns itself; anything else is a metadata facet. */\nconst RESERVED_PARAMS = new Set(['search', 'q', 'category', 'sort', 'stock', 'min', 'max'])\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(searchParam: 'search' | 'q') {\n const hydrated = useRef(false)\n const adapter = useRouterAdapter()\n const catalog = useCatalogStore()\n\n useEffect(() => {\n if (hydrated.current) return\n hydrated.current = true\n const q = adapter.getCurrentPath().split('?')[1]\n if (!q) return\n const p = new URLSearchParams(q)\n const s = useCatalogStore.getState()\n // Accept both spellings on the way in: a shopper can land on `?q=…` from an\n // ad or an old bookmark and on `?search=…` from a shared filter. Only the\n // write side has to pick one.\n if (p.has('q')) s.setSearch(p.get('q') ?? '')\n else if (p.has('search')) s.setSearch(p.get('search') ?? '')\n if (p.get('category')) s.setCategoryId(p.get('category'))\n // Every non-reserved, non-tracking param is a metadata facet, so a store\n // can add a discovery axis by linking to it — `?purpose=estudar`,\n // `?brand=schneider` — without the SDK knowing the axis exists. Tracking\n // ids (`utm_*`, `fbclid`, `gclid`…) are the exception: an ad link must not\n // become a facet that matches nothing.\n for (const [key, value] of Object.entries(facetsFromQuery(p, RESERVED_PARAMS))) s.setFacet(key, value)\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 current = adapter.getCurrentPath()\n const p = new URLSearchParams()\n // Tracking ids ride through untouched, so the attribution an ad click\n // arrived with survives the shopper's first filter.\n for (const [key, value] of new URLSearchParams(current.split('?')[1] ?? '').entries()) {\n if (isTrackingParam(key)) p.set(key, value)\n }\n if (catalog.search) p.set(searchParam, catalog.search)\n if (catalog.categoryId) p.set('category', catalog.categoryId)\n for (const [key, value] of Object.entries(catalog.facets)) p.set(key, value)\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 // Through the adapter, so the same sync works under either addressing\n // scheme; `replace` keeps typing in the search box out of the back button.\n const base = current.split('?')[0] || '/catalog'\n const qs = p.toString()\n const next = qs ? `${base}?${qs}` : base\n if (next !== current) adapter.replace(next)\n }, [\n catalog.search,\n catalog.categoryId,\n catalog.facets,\n catalog.sort,\n catalog.inStockOnly,\n catalog.priceMin,\n catalog.priceMax,\n searchParam,\n ])\n}\n\nexport function CatalogPage() {\n const config = useStorefrontConfig()\n const catalog = useCatalogStore()\n // On the results page the search term stays spelled `q`, because that is the\n // URL the store's ads and inbound links already carry — rewriting it to\n // `?search=` on the first render would break every one of them.\n const path = useRoutePath()\n const onResultsPage = Boolean(matchPath(config.search.resultsPath, path))\n useCatalogUrlSync(onResultsPage ? 'q' : 'search')\n useStorefrontHead({\n title: catalog.search ? `“${catalog.search}” — ${config.name}` : `${config.name} — Loja`,\n })\n\n // The catalog read goes through the `products.list` loader. With the default\n // state (sort 'newest', no filters) the params match catalogBody's declared\n // need, so the page-level resolver has already answered it; every filter\n // interaction after that is a fresh read through the same loader.\n // Facets go to the loader, not a post-filter: a rail asking for the same\n // refinement has to get the same answer, and the read is then deduped and\n // pre-resolvable like every other declared read.\n const { status, data, error, reload } = useLoader<Product[]>('products.list', {\n sort: catalog.sort,\n category: catalog.categoryId ?? undefined,\n search: catalog.search || undefined,\n facets: Object.keys(catalog.facets).length > 0 ? catalog.facets : undefined,\n })\n const products = data ?? []\n const loading = status !== 'ready' && status !== 'error'\n\n // Price range + availability stay client-side refinements over the fetched\n // set: they narrow what is already loaded and would only fragment the cache\n // key for no change in the fetched rows.\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 const slotContext = { products: filtered, loading }\n\n return (\n <div className=\"mx-auto max-w-7xl px-4 py-8 sm:px-6\">\n <Slot area=\"catalog\" name=\"beforeHeading\" context={slotContext} />\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 {/* Facet filters arrive from a landing page CTA or a home tile, not\n * from the filters panel, so each needs its own way out — otherwise\n * the shopper is stuck inside the refinement with no visible cause. */}\n {Object.keys(catalog.facets).length > 0 && (\n <div className=\"mt-3 flex flex-wrap gap-2\">\n {Object.entries(catalog.facets).map(([key, value]) => (\n <button\n key={key}\n type=\"button\"\n data-testid={`catalog-facet-clear-${key}`}\n onClick={() => catalog.setFacet(key, null)}\n className=\"inline-flex items-center gap-2 rounded-full border px-3 py-1.5 text-sm font-medium capitalize transition hover:bg-muted\"\n >\n {value}\n <X className=\"h-3.5 w-3.5\" aria-hidden />\n <span className=\"sr-only\">Remover filtro {key}</span>\n </button>\n ))}\n </div>\n )}\n </div>\n <Slot area=\"catalog\" name=\"beforeGrid\" context={slotContext} />\n <div className=\"flex flex-col gap-8 lg:flex-row\">\n <div>\n <FiltersPanel />\n <Slot area=\"catalog\" name=\"afterFilters\" context={slotContext} />\n </div>\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 <Slot area=\"catalog\" name=\"afterGrid\" context={slotContext} />\n </div>\n )\n}\n","import type { Product } from '@fayz-ai/shop/types'\nimport { useLoader } from '../blocks/page-data'\n\n/**\n * One active product by slug — the `products.bySlug` loader, by hook.\n *\n * On a composed product page the page-level resolver already answered this\n * (productBody declares `{ slug: { $param: 'slug' } }`), so the hook consumes\n * the resolved entry and no second request happens. Anywhere else it resolves\n * the loader itself, through the same provider port (I11).\n */\nexport function useProduct(slug: string): {\n product: Product | null\n loading: boolean\n error: string | null\n} {\n const { status, data, error } = useLoader<Product | null>('products.bySlug', { slug })\n return {\n product: data ?? null,\n loading: status === 'loading' || status === 'idle',\n error,\n }\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 // 44px de alvo no celular. Medido: -/+ tinham 34x26 e o botao de APAGAR ao\n // lado tinha 28x28 — diminuir a quantidade e apagar a linha ficavam a um erro\n // de dedo um do outro, e um deles nao tem volta.\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=\"min-h-11 min-w-11 px-2.5 py-1.5 text-muted-foreground hover:text-foreground disabled:opacity-40 sm:min-h-0 sm:min-w-0 grid place-items-center\"\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=\"h-11 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 sm:h-auto\"\n />\n <button\n type=\"button\"\n data-testid={incTestId}\n aria-label=\"Aumentar quantidade\"\n onClick={() => onChange(clamp(value + 1))}\n className=\"min-h-11 min-w-11 px-2.5 py-1.5 text-muted-foreground hover:text-foreground disabled:opacity-40 sm:min-h-0 sm:min-w-0 grid place-items-center\"\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 type { ProductOptionGroup, ProductOptionSelection } from '../../data/product-options'\nimport { TID } from '../../lib/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'\nimport { useStorefrontConfig } from '../../document/config'\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 // Discovery facets and payment-rule fields: the SDK gives these meaning\n // elsewhere (filter chips, rails, the price block), so listing them as specs\n // showed the shopper rows like \"Pix Price — 227.92\".\n 'collection', 'purpose', 'pixPrice', 'salePrice', 'compareAtPrice',\n])\n\n// Internal namespaced keys (fayz*, _*) are never shown as specs.\nfunction isInternalKey(key: string, extra?: ReadonlySet<string>): boolean {\n return EXCLUDED_KEYS.has(key) || extra?.has(key) === true || 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 subcategory: 'Subcategoria',\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, extra?: Readonly<Record<string, string>>): string {\n if (extra?.[key]) return extra[key]!\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 config = useStorefrontConfig()\n // Stores put their own bookkeeping in metadata too. `productSpecs.exclude`\n // hides it and `productSpecs.labels` names what is left, without every store\n // having to fork this component.\n const extraExcluded = React.useMemo(\n () => new Set(config.productSpecs?.exclude ?? []),\n [config.productSpecs?.exclude],\n )\n const extraLabels = config.productSpecs?.labels\n\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, extraExcluded)) continue\n const str = scalarToString(value)\n if (str) rows.push([humanize(key, extraLabels), 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 { Star } from 'lucide-react'\nimport type { Product } from '@fayz-ai/shop/types'\nimport { useStorefrontConfig } from '../../document/config'\n\n/**\n * Product reviews.\n *\n * There is no reviews table in the shop schema yet, so this renders whatever\n * the store supplies through `config.reviews` and nothing else. It deliberately\n * does NOT invent ratings: a storefront that shows \"4.8 ★ (127 avaliações)\"\n * with no reviews behind it is lying to the shopper, and a replatform inherits\n * the merchant's reputation, it doesn't manufacture one.\n *\n * With no reviews for a product the block renders an honest empty state, which\n * is also the seam a real reviews backend plugs into later.\n */\n\nexport interface ProductReview {\n id: string\n /** Product slug or SKU this review is about. */\n product: string\n rating: number\n author: string\n /** ISO date. */\n date?: string\n title?: string\n body: string\n /** Verified purchase — shown as a badge when true. */\n verified?: boolean\n}\n\nexport interface StorefrontReviewsConfig {\n /** Every review the store has, across products. */\n items?: readonly ProductReview[]\n /** Hide the section entirely (default true when `items` is set). */\n enabled?: boolean\n /** Copy for the empty state. */\n emptyText?: string\n}\n\nfunction reviewsFor(product: Product, all: readonly ProductReview[]): ProductReview[] {\n return all.filter((r) => r.product === product.slug || r.product === product.sku)\n}\n\nfunction average(list: readonly ProductReview[]): number {\n if (list.length === 0) return 0\n return list.reduce((sum, r) => sum + r.rating, 0) / list.length\n}\n\nfunction Stars({ value, label }: { value: number; label?: string }) {\n return (\n <span className=\"inline-flex items-center gap-0.5\" role=\"img\" aria-label={label ?? `${value.toFixed(1)} de 5`}>\n {[1, 2, 3, 4, 5].map((n) => (\n <Star\n key={n}\n aria-hidden\n className=\"h-4 w-4\"\n // Half stars would need a clip path; rounding to the nearest whole\n // star is honest enough at this size and keeps the markup plain.\n fill={n <= Math.round(value) ? 'currentColor' : 'none'}\n strokeWidth={1.6}\n />\n ))}\n </span>\n )\n}\n\nexport function ProductReviews({ product }: { product: Product }) {\n const config = useStorefrontConfig()\n const reviews = config.reviews\n if (!reviews || reviews.enabled === false) return null\n\n const list = reviewsFor(product, reviews.items ?? [])\n const avg = average(list)\n // 5 → 1, so the bar chart reads top-down like every store's does.\n const buckets = [5, 4, 3, 2, 1].map((star) => ({\n star,\n count: list.filter((r) => Math.round(r.rating) === star).length,\n }))\n\n return (\n <section className=\"mt-14 border-t pt-10\" data-testid=\"product-reviews\">\n <h2 className=\"sf-heading text-xl font-semibold tracking-tight\">Avaliações</h2>\n\n {list.length === 0 ? (\n <p className=\"mt-4 text-sm text-muted-foreground\">\n {reviews.emptyText ?? 'Este produto ainda não recebeu avaliações. Compre e seja o primeiro a avaliar.'}\n </p>\n ) : (\n <>\n <div className=\"mt-5 flex flex-col gap-6 sm:flex-row sm:items-center sm:gap-10\">\n <div className=\"shrink-0\">\n <p className=\"text-4xl font-bold leading-none\" data-testid=\"reviews-average\">\n {avg.toFixed(1)}\n </p>\n <div className=\"mt-2 text-primary\">\n <Stars value={avg} />\n </div>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n {list.length} {list.length === 1 ? 'avaliação' : 'avaliações'}\n </p>\n </div>\n\n <dl className=\"min-w-0 flex-1 space-y-1\">\n {buckets.map(({ star, count }) => (\n <div key={star} className=\"flex items-center gap-3 text-xs\">\n <dt className=\"w-8 shrink-0 text-muted-foreground\">{star}★</dt>\n <dd className=\"h-2 flex-1 overflow-hidden rounded-full bg-muted\">\n <div\n className=\"h-full rounded-full bg-primary\"\n style={{ width: `${list.length ? (count / list.length) * 100 : 0}%` }}\n />\n </dd>\n <span className=\"w-6 shrink-0 text-right text-muted-foreground\">{count}</span>\n </div>\n ))}\n </dl>\n </div>\n\n <ul className=\"mt-8 space-y-6\">\n {list.map((r) => (\n <li key={r.id} className=\"border-b pb-6 last:border-b-0\">\n <div className=\"flex flex-wrap items-center gap-x-3 gap-y-1\">\n <span className=\"text-primary\">\n <Stars value={r.rating} />\n </span>\n <span className=\"text-sm font-semibold\">{r.author}</span>\n {r.verified && (\n <span className=\"rounded-full bg-emerald-50 px-2 py-0.5 text-[11px] font-semibold text-emerald-700\">\n Compra verificada\n </span>\n )}\n {r.date && (\n <time dateTime={r.date} className=\"text-xs text-muted-foreground\">\n {new Date(r.date).toLocaleDateString(config.locale)}\n </time>\n )}\n </div>\n {r.title && <p className=\"mt-2 text-sm font-semibold\">{r.title}</p>}\n <p className=\"mt-1 text-sm leading-relaxed text-muted-foreground\">{r.body}</p>\n </li>\n ))}\n </ul>\n </>\n )}\n </section>\n )\n}\n","import { errorMessage } from '@fayz-ai/core'\nimport { 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(errorMessage(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 { errorMessage } from '@fayz-ai/core'\nimport 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 '../../document/config'\nimport { storefrontComponentContracts } from '../../extend/component-selectors'\nimport { TID } from '../../lib/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(errorMessage(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 '../../extend/component-contracts'\nimport { SmoothImage } from '../SmoothImage'\nimport { productPlaceholder } from '../../blocks/sections'\nimport { TID } from '../../lib/testids'\nimport { storefrontComponentContracts } from '../../extend/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, order = 'primary' }: ProductGalleryProps) {\n const ordered = orderGalleryImages(images, primaryImage, order)\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 {/* A product with no images at all renders the generated mark rather\n than an empty frame — same fallback the card uses, so the PDP and\n the grid agree about what a photoless product looks like. */}\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 ?? 'placeholder'}\n src={current?.url ?? productPlaceholder(product.name)}\n alt={current?.altText ?? product.name}\n data-testid={TID.pdpGalleryImage}\n // `cover`: the frame is filled, and a photo taller than it is wide\n // gives up some of its top and bottom. It briefly rendered as\n // `contain` while the real fault was elsewhere — the delivery\n // variants were arriving STRETCHED (a 1740×2609 photo answered\n // 960×2609), so the square frame was cropping the middle band out\n // of an elongated picture and the page looked like it had zoomed\n // in. With `@fayz-ai/shop` asking the renderer for `resize=contain`\n // the photo has its own proportions again, an honest crop is a\n // crop, and letterboxing a product against grey is the worse of\n // the two looks.\n className=\"h-full w-full object-cover\"\n // Half the viewport beside the details on desktop, the full width\n // on a phone. The 2× zoom layer reads the same source, so the\n // ladder tops out at 1600 — enough for zoom on a laptop.\n variant={{ sizes: '(min-width: 1024px) 50vw, 100vw' }}\n />\n </div>\n\n {ordered.length > 1 && (\n <>\n <GalleryArrow side=\"left\" onClick={() => step(-1)} canHover={canHover} />\n <GalleryArrow side=\"right\" onClick={() => step(1)} canHover={canHover} />\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 <SmoothImage src={image.url} alt=\"\" className=\"h-full w-full object-cover\" loading=\"lazy\" variant={{ width: 64 }} />\n </button>\n </li>\n ))}\n </ul>\n )}\n </div>\n )\n}\n\n/**\n * Gallery ordering, per the declared rule (see ProductGalleryOrder).\n *\n * Exported and pure: this one function is what a store used to fork the whole\n * gallery for — artorious cloned all 158 lines to flip it to sort_order\n * descending. Nothing is ever dropped; only who leads changes.\n *\n * \"Nothing is ever dropped\" was not true: `primary` was consulted only when\n * `images` was EMPTY, so a caller that computed a primary outside the list —\n * the shot for a chosen variant, a hero image resolved elsewhere — handed it\n * over and watched it vanish. It is now prepended when it isn't already there.\n */\nexport function orderGalleryImages(\n images: ProductImage[],\n primary?: ProductImage,\n order: NonNullable<ProductGalleryProps['order']> = 'primary',\n): ProductImage[] {\n const missingPrimary =\n primary != null && !images.some((i) => i.id === primary.id || i.url === primary.url)\n const all = missingPrimary ? [primary!, ...images] : images.length > 0 ? images : primary ? [primary] : []\n return [...all].sort((a, b) => {\n if (order === 'newest') return (b.sortOrder ?? 0) - (a.sortOrder ?? 0)\n if (order === 'primary' && 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\n/**\n * Reveal-on-hover is a HOVER affordance, so it may only hide the control where\n * hover exists. `opacity-0 group-hover:opacity-100` with no coarse-pointer\n * branch left both arrows permanently invisible on every phone — a\n * multi-photo gallery with no discoverable way to reach photo 2 (the thumbnail\n * strip is the only other route, and it is below the fold on a phone).\n *\n * artorious hit this, fixed it in its own gallery clone, and lost the fix when\n * the component was promoted into the SDK — it then had to re-patch it with\n * local CSS (`@media (hover: none) { [data-testid=\"pdp-gallery\"] > button }`).\n * That CSS is deleted; the rule lives here now.\n *\n * `canHover` is FALSE until the effect in useCanHover proves otherwise, so\n * server markup and the first client paint always ship visible arrows and the\n * fade-out only happens where hovering can bring them back.\n */\nfunction GalleryArrow({ side, onClick, canHover }: { side: 'left' | 'right'; onClick: () => void; canHover: boolean }) {\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 shadow-md backdrop-blur transition hover:bg-background ${\n canHover ? 'opacity-0 focus:opacity-100 group-hover:opacity-100' : 'opacity-100'\n } ${side === 'left' ? 'left-3' : 'right-3'}`}\n >\n <span aria-hidden className=\"text-lg leading-none\">{side === 'left' ? '‹' : '›'}</span>\n </button>\n )\n}\n","import React from 'react'\nimport type { ListProductsOptions, Product } from '@fayz-ai/shop/types'\nimport { useProducts } from '../../hooks/use-products'\nimport { getStorefrontComponents, useStorefrontConfig } from '../../document/config'\nimport { useStorefrontActions } from '../../hooks/use-storefront-actions'\nimport { ProductCard } from './ProductCard'\nimport { resolveOverride } from '../../extend/component-override'\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 { Component: Card, props: cardOverrideProps } = resolveOverride(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 {...cardOverrideProps}\n />\n ))}\n </div>\n </section>\n )\n}\n","import React, { useState } from 'react'\nimport { MapPin, Truck } from 'lucide-react'\nimport { formatPostalCode } from '@fayz-ai/core'\nimport { useBuyerCountry } from '../../hooks/use-buyer-country'\nimport { useT } from '../../locales'\nimport { useDeliveryStore, resolveOptionRate } from '../../stores/delivery.store'\nimport { useCartStore, selectSubtotal } from '../../stores/cart.store'\nimport { useStorefrontConfig } from '../../document/config'\nimport { formatMoney } from '../../lib/format'\nimport { TID } from '../../lib/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 t = useT()\n const { country, schema } = useBuyerCountry()\n const isBrazil = country === 'BR'\n // A code kept from another country is not this country's: start empty.\n const [draft, setDraft] = useState(() => (delivery.country === country ? formatPostalCode(delivery.postalCode, country) : ''))\n\n const subtotal = selectSubtotal(cart)\n const money = (value: number) => formatMoney(value, config.currency, config.locale)\n const loading = delivery.status === 'loading'\n // Once a CEP has quoted successfully, the input/submit form is redundant\n // with the address + options already shown below — hide it in favor of\n // that summary. \"Trocar CEP\" (below) calls delivery.clear(), which resets\n // status away from 'served' and brings the form back.\n const resolved = delivery.status === 'served'\n\n async function submit(event: React.FormEvent) {\n event.preventDefault()\n await delivery.resolve(draft, subtotal, country)\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 t('delivery.etaSoon')\n if (min != null && max != null && min !== max) return t('delivery.etaRange', { min, max })\n return t('delivery.etaDays', { days: String(max ?? min) })\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 {!resolved && (\n <>\n <div className=\"flex items-center gap-2 text-sm font-semibold\">\n <Truck className=\"h-4 w-4 text-primary\" />\n {t('delivery.title')}\n </div>\n\n <form onSubmit={submit} className=\"mt-3 flex gap-2\">\n <input\n data-testid={TID.deliveryCepInput}\n aria-label={isBrazil ? 'CEP' : t('delivery.postalLabel')}\n inputMode={schema.postal.inputMode}\n autoComplete=\"postal-code\"\n placeholder={isBrazil ? '00000-000' : schema.postal.example}\n value={draft}\n onChange={(event) => setDraft(formatPostalCode(event.target.value, country))}\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 ? '...' : t('delivery.calculate')}\n </button>\n </form>\n </>\n )}\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.errorKey ? t(delivery.errorKey, delivery.errorVars ?? undefined) : 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].filter(Boolean).join('/')}\n </span>\n </p>\n )}\n\n {/* Outside Brazil there is nothing to quote yet: the store's flat rate\n applies, and saying so beats an empty box. */}\n {!isBrazil && delivery.country === country && delivery.postalCode && delivery.status === 'idle' && (\n <p className=\"mt-2 text-xs text-muted-foreground\">{t('delivery.flatRate')}</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 ? t('summary.free') : 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 {delivery.refusedZone\n // \"Ainda não\" is a promise about the future, and a store that\n // deliberately refuses a region is not making it (0048).\n ? t('delivery.refused')\n : t('delivery.unserved')}\n </p>\n )}\n\n {/* Delivered, priced, and the store confirms before it goes out (0081) —\n said next to the price rather than instead of it, because the order is\n going through and the number is real. */}\n {delivery.reviewZone && delivery.status === 'served' && (\n <p className=\"mt-3 text-sm text-amber-600 dark:text-amber-500\">\n {t('delivery.review')}\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 py-1 text-xs text-muted-foreground underline-offset-2 hover:underline\"\n >\n {t('delivery.change')}\n </button>\n )}\n </section>\n )\n}\n","import { useMarketProduct } from '../hooks/use-market-product'\nimport { trackStorefront } from '../analytics/bus'\nimport React, { useEffect, useState } from 'react'\nimport { ChevronLeft, RefreshCcw, ShieldCheck, Truck } from 'lucide-react'\nimport { useProduct } from '../hooks/use-product'\nimport { useCartStore } from '../stores/cart.store'\nimport { getStorefrontComponents, useStorefrontConfig } from '../document/config'\nimport { useStorefrontHead } from '../hooks/use-storefront-head'\nimport { productSeo } from '../lib/seo'\nimport { useStorefrontActions } from '../hooks/use-storefront-actions'\nimport { Link, useRoutePath } from '../app/router'\nimport { Price } from '../components/Price'\nimport { QuantityInput } from '../components/cart/QuantityInput'\nimport { ProductOptionSelector } from '../components/product/ProductOptionSelector'\nimport { ProductSpecs } from '../components/product/ProductSpecs'\nimport { PaymentTerms } from '../components/PaymentTerms'\nimport { ProductReviews } from '../components/product/ProductReviews'\nimport { RelatedProducts } from '../components/product/RelatedProducts'\nimport { ProductEnquiryForm } from '../components/product/ProductEnquiryForm'\nimport { SmoothImage } from '../components/SmoothImage'\nimport { ProductGallery } from '../components/product/ProductGallery'\nimport { DeliveryEstimator } from '../components/checkout/DeliveryEstimator'\nimport { getProductOptionGroups, type ProductOptionSelection } from '../data/product-options'\nimport { storefrontComponentContracts } from '../extend/component-selectors'\nimport { Slot } from '../extend/slots'\nimport { TID } from '../lib/testids'\nimport { overrideComponent, overrideProps, resolveOverride } from '../extend/component-override'\n\nexport function ProductDetailPage({ slug }: { slug: string }) {\n const config = useStorefrontConfig()\n const actions = useStorefrontActions()\n const { product: catalogProduct, loading } = useProduct(slug)\n // In the buyer's market (0116): its price, or not for sale there.\n const product = useMarketProduct(catalogProduct)\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 // A product page is the store's most valuable SEO surface, so it declares the\n // full descriptor — canonical, share image, Product + BreadcrumbList JSON-LD —\n // not just a title.\n const path = useRoutePath()\n useStorefrontHead(\n product\n ? productSeo(product, { config, path })\n : { title: config.name },\n )\n\n useEffect(() => {\n if (!product) return\n trackStorefront('product_viewed', {\n product_id: product.id,\n product_name: product.name,\n slug: product.slug,\n price: product.price,\n in_stock: product.inventoryCount > 0,\n surface: 'product_page',\n })\n }, [product?.id])\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 <div 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 </div>\n )\n }\n\n if (!product) {\n return (\n // Carries the not-found marker: a product URL whose product is gone is a\n // missing page, not a page about a missing product. Without it a headless\n // render reports `found`, a prerender writes the file, and the store\n // publishes a soft 404 at a real URL for every deleted product.\n <div\n data-storefront-page=\"not-found\"\n className=\"mx-auto max-w-5xl px-4 py-20 text-center sm:px-6\"\n >\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 </div>\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 // Only a REPLACED component takes over the page. A props-only override has no\n // page to take over — it keeps the SDK body — so this stays a plain lookup\n // rather than going through resolveOverride with a self-referential fallback.\n const ProductDetailComponent = overrideComponent(components.ProductDetail)\n const detailOverrideProps = overrideProps(components.ProductDetail)\n // Honours the ProductGallery override contract, which has existed in\n // component-contracts.ts since before any component implemented it.\n const { Component: GalleryComponent, props: galleryOverrideProps } = resolveOverride(\n components.ProductGallery,\n ProductGallery,\n )\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 // One object for all nine PDP slots. Blocks inside them read it through\n // useSlotContext, which is what lets a slot say something about THIS product\n // instead of holding static copy.\n const slotContext = { product, soldOut, lowStock, discountPct }\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 {...detailOverrideProps}\n />\n )\n }\n\n return (\n <div {...storefrontComponentContracts.productDetail.root} className=\"mx-auto max-w-5xl px-4 py-8 sm:px-6\">\n {/* Back to the CATALOGUE — '/' is the home page on a store that has one,\n and \"keep shopping\" from a product means the shelf, not the front door. */}\n <Link to={config.catalogPath} 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 grid-cols-1 gap-10 md:grid-cols-2\">\n <div>\n <GalleryComponent\n product={product}\n images={product.images}\n primaryImage={image}\n config={config}\n commerceMode={config.commerceMode}\n {...galleryOverrideProps}\n />\n <Slot area=\"productDetail\" name=\"afterGallery\" context={slotContext} />\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 <Slot area=\"productDetail\" name=\"beforeTitle\" context={slotContext} />\n\n <h1 data-testid={TID.pdpName} className=\"sf-heading text-3xl font-bold tracking-tight\">\n {product.name}\n </h1>\n\n <Slot area=\"productDetail\" name=\"afterTitle\" context={slotContext} />\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 {/* The PDP is where the Brazilian shopper decides, so the Pix price\n and the instalment belong next to the price, not only on the card. */}\n {config.commerceMode === 'checkout' && (\n <PaymentTerms price={product.price} metadata={product.metadata} variant=\"detail\" />\n )}\n\n <Slot area=\"productDetail\" name=\"afterPrice\" context={slotContext} />\n\n <p data-testid={TID.pdpDescription} className=\"mt-5 leading-relaxed text-muted-foreground\">\n {product.description}\n </p>\n\n <Slot area=\"productDetail\" name=\"afterDescription\" context={slotContext} />\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 {/* Where trust seals go. Three of our stores wanted something here and\n two of them rewrote the page to get it. */}\n <Slot area=\"productDetail\" name=\"beforeAddToCart\" context={slotContext} />\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 <Slot area=\"productDetail\" name=\"afterAddToCart\" context={slotContext} />\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' && product.isPhysical !== false && <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 <Slot area=\"productDetail\" name=\"beforeSpecs\" context={slotContext} />\n\n <ProductSpecs product={product} />\n <ProductReviews product={product} />\n <RelatedProducts product={product} />\n\n <Slot area=\"productDetail\" name=\"afterDetail\" context={slotContext} />\n </div>\n )\n}\n","import { errorMessage } from '@fayz-ai/core'\nimport React, { useState } from 'react'\nimport type { RegistryMeta } from '@fayz-ai/core'\nimport type { CreateProductEnquiryInput } from '@fayz-ai/shop/types'\nimport { useEnquiry } from '../../hooks/use-enquiry'\nimport { TID } from '../../lib/testids'\n\n// ---------------------------------------------------------------------------\n// Form block — a schema'd fields list that submits through the EXISTING\n// enquiry write path (provider.createProductEnquiry). No new backend: the\n// submission lands where product enquiries already land, tagged with the\n// form's subject, so the store owner reads one inbox.\n//\n// This absorbs the hand-written contact forms in the fleet (cristinarotondaro\n// wrote a 70-line AtelierContactForm against the same provider call): the\n// form's IDENTITY fields map onto the enquiry contract by reserved semantics,\n// and everything else folds into the message body as \"Label: value\" lines.\n// ---------------------------------------------------------------------------\n\nexport type FormBlockFieldType = 'text' | 'email' | 'phone' | 'textarea' | 'select'\n\nexport interface FormBlockField {\n id: string\n label: string\n type?: FormBlockFieldType\n required?: boolean\n placeholder?: string\n /** `select` only. */\n options?: readonly { value: string; label: string }[]\n}\n\nexport interface FormBlockProps {\n eyebrow?: string\n title?: string\n subtitle?: string\n /** Enquiry subject — how this form's submissions are recognized in the inbox. */\n subject?: string\n fields?: readonly FormBlockField[]\n submitLabel?: string\n successMessage?: string\n}\n\n/**\n * Fold submitted values into the enquiry contract.\n *\n * Reserved semantics (documented in the block's settings help):\n * · the first `email` field → customerEmail\n * · the first `phone` field → customerPhone\n * · a field with id 'name', else the first plain text field → customerName\n * · every remaining field → a \"Label: value\" line of the message\n *\n * Pure and exported so the mapping — the part that silently eats data when it\n * is wrong — is unit-testable without a DOM.\n */\nexport function buildEnquiryFromForm(\n fields: readonly FormBlockField[],\n values: Record<string, string>,\n subject: string,\n sourceUrl?: string,\n): CreateProductEnquiryInput {\n const emailField = fields.find((f) => f.type === 'email')\n const phoneField = fields.find((f) => f.type === 'phone')\n const nameField =\n fields.find((f) => f.id === 'name') ??\n fields.find((f) => (f.type ?? 'text') === 'text' && f !== emailField && f !== phoneField)\n\n const identity = new Set([emailField?.id, phoneField?.id, nameField?.id])\n const lines = fields\n .filter((f) => !identity.has(f.id))\n .map((f) => ({ field: f, value: (values[f.id] ?? '').trim() }))\n .filter((entry) => entry.value)\n .map(({ field, value }) => (field.type === 'textarea' ? value : `${field.label}: ${value}`))\n\n return {\n productName: subject,\n customerName: (nameField && values[nameField.id]?.trim()) || 'Visitante',\n customerEmail: (emailField && values[emailField.id]?.trim()) || '',\n customerPhone: (phoneField && values[phoneField.id]?.trim()) || undefined,\n subject,\n message: lines.join('\\n') || '(sem mensagem)',\n sourceUrl,\n metadata: { form: subject, values },\n }\n}\n\nconst INPUT_CLASS =\n 'w-full border bg-background px-3 py-2 text-sm outline-none focus:border-primary'\n\nfunction Field({\n field,\n value,\n onChange,\n}: {\n field: FormBlockField\n value: string\n onChange: (value: string) => void\n}) {\n const common = {\n 'data-testid': TID.formBlockField(field.id),\n required: field.required,\n value,\n placeholder: field.placeholder,\n className: INPUT_CLASS,\n style: { borderRadius: 'var(--sf-radius-input)' },\n }\n return (\n <label className={`space-y-1.5 text-sm font-medium ${field.type === 'textarea' ? 'block' : ''}`}>\n <span>\n {field.label}\n {field.required ? '' : ' (opcional)'}\n </span>\n {field.type === 'textarea' ? (\n <textarea {...common} rows={5} onChange={(e) => onChange(e.target.value)} className={`${INPUT_CLASS} resize-none`} />\n ) : field.type === 'select' ? (\n <select {...common} onChange={(e) => onChange(e.target.value)}>\n <option value=\"\">—</option>\n {(field.options ?? []).map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n ) : (\n <input\n {...common}\n type={field.type === 'email' ? 'email' : field.type === 'phone' ? 'tel' : 'text'}\n onChange={(e) => onChange(e.target.value)}\n />\n )}\n </label>\n )\n}\n\nexport function FormBlock({\n eyebrow,\n title,\n subtitle,\n subject = 'Contato',\n fields = [],\n submitLabel = 'Enviar',\n successMessage = 'Recebemos sua mensagem. Obrigado!',\n}: FormBlockProps) {\n const { createProductEnquiry } = useEnquiry()\n const [values, setValues] = useState<Record<string, string>>({})\n const [status, setStatus] = useState<'idle' | 'submitting' | 'success' | 'error'>('idle')\n const [error, setError] = useState<string | null>(null)\n\n if (fields.length === 0) return null\n\n const submit = async (event: React.FormEvent) => {\n event.preventDefault()\n setStatus('submitting')\n setError(null)\n try {\n await createProductEnquiry(\n buildEnquiryFromForm(\n fields,\n values,\n subject,\n typeof window === 'undefined' ? undefined : window.location.href,\n ),\n )\n setStatus('success')\n setValues({})\n } catch (e) {\n setStatus('error')\n setError(errorMessage(e))\n }\n }\n\n return (\n <section data-testid={TID.formBlock} className=\"mx-auto max-w-2xl px-4 py-14 sm:px-6\">\n {(eyebrow || title || subtitle) && (\n <div className=\"mb-8 text-center\">\n {eyebrow && (\n <p className=\"mb-2 text-xs font-semibold uppercase tracking-[0.25em] text-muted-foreground\">{eyebrow}</p>\n )}\n {title && <h2 className=\"sf-heading text-3xl font-bold\">{title}</h2>}\n {subtitle && <p className=\"mt-2 text-muted-foreground\">{subtitle}</p>}\n </div>\n )}\n {status === 'success' ? (\n <p data-testid={TID.formBlockSuccess} className=\"text-center font-medium text-emerald-600\">\n {successMessage}\n </p>\n ) : (\n <form onSubmit={submit} className=\"space-y-4\">\n {fields.map((field) => (\n <Field\n key={field.id}\n field={field}\n value={values[field.id] ?? ''}\n onChange={(value) => setValues((prev) => ({ ...prev, [field.id]: value }))}\n />\n ))}\n <button\n data-testid={TID.formBlockSubmit}\n type=\"submit\"\n disabled={status === 'submitting'}\n className=\"sf-cta w-full bg-primary px-5 py-3 font-semibold text-primary-foreground disabled:cursor-wait disabled:opacity-60 sm:w-auto\"\n style={{ borderRadius: 'var(--sf-radius-button)' }}\n >\n {status === 'submitting' ? 'Enviando...' : submitLabel}\n </button>\n {error && (\n <p data-testid={TID.formBlockError} className=\"text-sm font-medium text-red-600\">\n {error}\n </p>\n )}\n </form>\n )}\n </section>\n )\n}\n\nexport const formBlockMeta = {\n label: 'Form',\n description:\n 'Contact/request form with a declared fields list. Submissions go through the store\\'s enquiry channel (the same inbox as product enquiries), tagged with the form subject.',\n settings: [\n { id: 'eyebrow', type: 'text', label: 'Eyebrow', help: 'Small uppercase label above the title.' },\n { id: 'title', type: 'text', label: 'Title' },\n { id: 'subtitle', type: 'text', label: 'Subtitle' },\n {\n id: 'subject',\n type: 'text',\n label: 'Subject',\n help: 'How this form\\'s submissions are identified in the enquiry inbox, e.g. \"Contato do ateliê\".',\n default: 'Contato',\n },\n {\n id: 'fields',\n type: 'list',\n label: 'Fields',\n required: true,\n help:\n 'Reserved semantics: the first email field becomes the sender address, the first phone field the sender phone, and the field with id \"name\" (or the first text field) the sender name. Every other field lands in the message as \"Label: value\".',\n of: [\n { id: 'id', type: 'text', label: 'Field id', help: 'Stable key, e.g. \"name\", \"email\", \"message\".', required: true },\n { id: 'label', type: 'text', label: 'Label', required: true },\n {\n id: 'type',\n type: 'select',\n label: 'Type',\n default: 'text',\n options: [\n { value: 'text', label: 'Text' },\n { value: 'email', label: 'E-mail' },\n { value: 'phone', label: 'Phone' },\n { value: 'textarea', label: 'Long text' },\n { value: 'select', label: 'Choice' },\n ],\n },\n { id: 'required', type: 'boolean', label: 'Required', default: false },\n { id: 'placeholder', type: 'text', label: 'Placeholder' },\n {\n id: 'options',\n type: 'list',\n label: 'Choices',\n help: 'Only for type \"select\".',\n of: [\n { id: 'value', type: 'text', label: 'Value', required: true },\n { id: 'label', type: 'text', label: 'Label', required: true },\n ],\n },\n ],\n },\n { id: 'submitLabel', type: 'text', label: 'Submit label', default: 'Enviar' },\n {\n id: 'successMessage',\n type: 'text',\n label: 'Success message',\n default: 'Recebemos sua mensagem. Obrigado!',\n },\n ],\n presets: [\n {\n name: 'Contact form',\n props: {\n title: 'Fale com a gente',\n subtitle: 'Respondemos em até um dia útil.',\n subject: 'Contato',\n fields: [\n { id: 'name', label: 'Seu nome', type: 'text', required: true },\n { id: 'email', label: 'Seu e-mail', type: 'email', required: true },\n { id: 'phone', label: 'Telefone', type: 'phone' },\n { id: 'message', label: 'Mensagem', type: 'textarea', required: true },\n ],\n },\n },\n ],\n // A form is a destination, not merchandising — editorial pages and the home.\n enabledOn: ['home', 'catalog', 'collection', 'content'],\n} satisfies Omit<RegistryMeta, 'propsSchema'>\n","import React from 'react'\nimport { hasEntityDeclaration, resolveEntityDeclaration } from '@fayz-ai/core'\nimport type { BlockNode, EntityDeclaration, EntityField, RegistryMeta } from '@fayz-ai/core'\nimport type { EntityRecord } from '@fayz-ai/shop/entities'\nimport { BlockDataError, useBlockData } from '../../blocks/page-data'\nimport { Reveal } from '../../lib/motion'\nimport { TID } from '../../lib/testids'\n\n// ---------------------------------------------------------------------------\n// entityList — the generic block over declared entities (spine M4).\n//\n// One block renders ANY defineEntity kind: its data need goes through the\n// entity.list loader (the only read path, I11), and what it shows per record\n// is the declaration's display fields — or the subset the block instance\n// picks. The block never guesses at shapes: every field it renders is typed by\n// the declaration, so an image field is an <img> and a url field is a link,\n// for store_location today and whatever an app declares tomorrow.\n// ---------------------------------------------------------------------------\n\nfunction fieldValue(field: EntityField, value: unknown): React.ReactNode {\n if (value === null || value === undefined || value === '') return null\n switch (field.type) {\n case 'image':\n return (\n <img\n src={String(value)}\n alt=\"\"\n loading=\"lazy\"\n className=\"h-40 w-full object-cover\"\n style={{ borderRadius: 'var(--sf-radius-card)' }}\n />\n )\n case 'url':\n return (\n <a href={String(value)} className=\"text-primary underline-offset-2 hover:underline\" target=\"_blank\" rel=\"noreferrer\">\n {String(value)}\n </a>\n )\n case 'point': {\n const point = value as { lat?: number; lng?: number }\n return typeof point.lat === 'number' && typeof point.lng === 'number' ? `${point.lat}, ${point.lng}` : null\n }\n case 'boolean':\n return value === true ? '✓' : null\n case 'json':\n // A shape only the app understands; a generic block printing raw JSON at\n // a shopper would always be wrong. Custom rendering is a component\n // override, not this block's guess.\n return null\n default:\n return String(value)\n }\n}\n\nfunction EntityCard({ declaration, record, fields }: { declaration: EntityDeclaration; record: EntityRecord; fields: readonly string[] }) {\n const titleField = declaration.titleField\n const title = titleField ? record.data[titleField] : undefined\n const detailFields = fields.filter((name) => name !== titleField)\n return (\n <div\n className=\"border border-foreground/10 bg-background p-5\"\n style={{ borderRadius: 'var(--sf-radius-card)' }}\n data-entity-record={record.slug ?? record.id}\n >\n {typeof title === 'string' && title && <h3 className=\"sf-heading mb-2 text-lg font-semibold\">{title}</h3>}\n <dl className=\"space-y-1.5\">\n {detailFields.map((name) => {\n const field = declaration.fields[name]\n if (!field) return null\n const rendered = fieldValue(field, record.data[name])\n if (rendered === null) return null\n return (\n <div key={name}>\n <dt className=\"text-[11px] font-semibold uppercase tracking-wide text-muted-foreground\">\n {field.label ?? name}\n </dt>\n <dd className=\"text-sm text-foreground/90\">{rendered}</dd>\n </div>\n )\n })}\n </dl>\n </div>\n )\n}\n\nexport function EntityListBlock({\n entity,\n title,\n subtitle,\n fields,\n limit = 12,\n node,\n}: {\n /** The defineEntity key this block lists. */\n entity: string\n title?: string\n subtitle?: string\n /** Fields to show per record; empty falls back to the declaration's displayFields. */\n fields?: Array<{ field: string }>\n limit?: number\n node?: BlockNode\n}) {\n const { status, data, error, loader } = useBlockData<EntityRecord[]>(node, 'records', {\n loader: 'entity.list',\n params: { entity, limit },\n })\n if (status === 'error') return <BlockDataError loader={loader} message={error} />\n // An undeclared entity always errors through the loader above; the guard only\n // covers the loading render, which shows skeletons and reads no declaration.\n const declaration = entity && hasEntityDeclaration(entity) ? resolveEntityDeclaration(entity) : null\n const loading = status !== 'ready' || !declaration\n const records = data ?? []\n const shownFields =\n fields && fields.length > 0\n ? fields.map((entry) => entry.field).filter(Boolean)\n : declaration?.displayFields ?? []\n\n if (!loading && records.length === 0) return null\n\n return (\n <section data-testid={TID.entityList} className=\"mx-auto max-w-7xl px-4 py-14 sm:px-6\">\n {(title || subtitle) && (\n <Reveal className=\"mb-10 text-center\">\n {title && <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 )}\n <div className=\"grid gap-5 sm:grid-cols-2 lg:grid-cols-3\">\n {loading\n ? Array.from({ length: Math.min(limit, 6) }, (_, i) => (\n <div key={i} className=\"h-36 animate-pulse bg-muted\" style={{ borderRadius: 'var(--sf-radius-card)' }} />\n ))\n : records.map((record, i) => (\n <Reveal key={record.id} delay={i * 60}>\n <EntityCard declaration={declaration} record={record} fields={shownFields} />\n </Reveal>\n ))}\n </div>\n </section>\n )\n}\n\nexport const entityListBlockMeta = {\n label: 'Entity list',\n description:\n 'Cards of records from a declared custom entity (defineEntity) — store locations, consultants, events. Shows the declared display fields.',\n settings: [\n {\n id: 'entity',\n type: 'entity',\n label: 'Entity',\n help: \"The defineEntity key to list, e.g. 'store_location'. Unknown keys fail validation naming the declared set.\",\n required: true,\n },\n { id: 'title', type: 'text', label: 'Title' },\n { id: 'subtitle', type: 'text', label: 'Subtitle', help: 'One line under the title. Optional.' },\n {\n id: 'fields',\n type: 'list',\n label: 'Fields to show',\n help: \"Per-record fields, in order. Empty shows the entity's declared display fields.\",\n of: [{ id: 'field', type: 'text', label: 'Field name', required: true }],\n },\n {\n id: 'limit',\n type: 'number',\n label: 'How many',\n help: 'Rendered in a 3-column grid on desktop.',\n min: 1,\n max: 48,\n default: 12,\n },\n ],\n presets: [\n {\n // The pilot shape (spine M4): a store-locator section over the\n // store_location entity. Inserting it into a store WITHOUT that entity\n // fails validation naming the declared set — which is the correct nudge.\n name: 'Store locator',\n props: { entity: 'store_location', title: 'Nossas lojas', limit: 12 },\n },\n ],\n enabledOn: ['home', 'catalog', 'collection', 'product', 'content'],\n // The declared read (M3): resolved once per page through entity.list; the\n // $prop bindings keep the block instance and its need in agreement.\n data: {\n records: {\n loader: 'entity.list',\n params: { entity: { $prop: 'entity' }, limit: { $prop: 'limit' } },\n },\n },\n} satisfies Omit<RegistryMeta, 'propsSchema'>\n","import React, { useState } from 'react'\nimport { ChevronDown } from 'lucide-react'\nimport type { RegistryMeta } from '@fayz-ai/core'\nimport { Link } from '../../app/router'\nimport { Reveal } from '../../lib/motion'\nimport { SmoothImage } from '../SmoothImage'\n\n// ---------------------------------------------------------------------------\n// Editorial blocks promoted from the fleet (spine M2 \"promote the 8 stranded\n// store blocks\"). Each one existed as an app-registered block in exactly one\n// store, invisible to every other store and to the agent's catalog:\n//\n// seals ← artorious `artorius-seals` (ringed stat badges)\n// storyQuote ← artorious `artorius-story` (serif quote + attribution + image)\n// imageTiles ← compactor `purpose-grid` (photo tiles linking into the catalog)\n// faq ← figurinhas `fx-faq` (collapsible Q&A)\n//\n// What was promoted is the MECHANISM; the store branding stayed behind: the\n// originals hardcoded their DS variables (--coal-950, --gold-400), their asset\n// manifests and their copy. These render from the shared theme tokens\n// (primary/accent/card/--sf-*) and take everything else as settings.\n// ---------------------------------------------------------------------------\n\n// --- seals -------------------------------------------------------------------\n\nexport interface SealItem {\n top?: string\n value: string\n bottom?: string\n tone?: 'primary' | 'accent'\n}\n\nexport function SealsBand({ items = [] }: { items?: SealItem[] }) {\n if (items.length === 0) return null\n return (\n <section data-testid=\"seals-band\" className=\"border-y bg-card\">\n <div className=\"mx-auto flex max-w-5xl flex-wrap items-center justify-center gap-8 px-4 py-10 sm:px-6\">\n {items.map((seal, i) => {\n const color = seal.tone === 'accent' ? 'hsl(var(--sf-accent, var(--primary)))' : 'hsl(var(--primary))'\n return (\n <Reveal key={i} delay={i * 100}>\n <div\n className=\"flex h-28 w-28 flex-col items-center justify-center rounded-full border-2 text-center\"\n style={{ borderColor: color, color }}\n >\n {seal.top && <span className=\"text-[10px] font-semibold uppercase tracking-[0.14em] opacity-80\">{seal.top}</span>}\n <span className=\"sf-heading text-3xl font-bold leading-none\">{seal.value}</span>\n {seal.bottom && <span className=\"text-[10px] font-semibold uppercase tracking-[0.14em] opacity-80\">{seal.bottom}</span>}\n </div>\n </Reveal>\n )\n })}\n </div>\n </section>\n )\n}\n\nexport const sealsBlockMeta = {\n label: 'Seals band',\n description: 'Row of ringed stat badges — \"pronto em 15 minutos\", \"12h na brasa\". Proof, at a glance.',\n settings: [\n {\n id: 'items',\n type: 'list',\n label: 'Seals',\n required: true,\n help: 'Three or four read best. Each seal is top line / big value / bottom line.',\n of: [\n { id: 'top', type: 'text', label: 'Top line', help: 'e.g. \"Pronto em\".' },\n { id: 'value', type: 'text', label: 'Value', help: 'The big number or word, e.g. \"15\".', required: true },\n { id: 'bottom', type: 'text', label: 'Bottom line', help: 'e.g. \"minutos\".' },\n {\n id: 'tone',\n type: 'select',\n label: 'Tone',\n default: 'primary',\n options: [\n { value: 'primary', label: 'Primary' },\n { value: 'accent', label: 'Accent' },\n ],\n },\n ],\n },\n ],\n presets: [\n {\n name: 'Seals band',\n props: {\n items: [\n { top: 'Feito em', value: '48h', bottom: 'sob demanda', tone: 'primary' },\n { top: 'Mais de', value: '1.000', bottom: 'clientes', tone: 'accent' },\n { top: 'Garantia', value: '30', bottom: 'dias', tone: 'primary' },\n ],\n },\n },\n ],\n enabledOn: ['home', 'catalog', 'collection', 'content'],\n} satisfies Omit<RegistryMeta, 'propsSchema'>\n\n// --- storyQuote --------------------------------------------------------------\n\nexport interface StoryQuoteProps {\n eyebrow?: string\n quote: string\n attribution?: string\n image?: string\n}\n\nexport function StoryQuote({ eyebrow, quote, attribution, image }: StoryQuoteProps) {\n return (\n <section data-testid=\"story-quote\" className=\"bg-card\">\n <div\n className={`mx-auto grid max-w-6xl items-center gap-12 px-4 py-16 sm:px-6 ${image ? 'md:grid-cols-2' : ''}`}\n >\n <Reveal>\n {eyebrow && (\n <p className=\"mb-4 text-xs font-semibold uppercase tracking-[0.25em] text-muted-foreground\">{eyebrow}</p>\n )}\n <blockquote\n className=\"text-2xl italic leading-snug sm:text-3xl\"\n style={{ fontFamily: 'var(--sf-font-serif, var(--sf-font-heading, inherit))' }}\n >\n “{quote}”\n </blockquote>\n {attribution && (\n <p className=\"mt-5 text-xs font-semibold uppercase tracking-[0.18em] text-primary\">— {attribution}</p>\n )}\n </Reveal>\n {image && (\n <div className=\"overflow-hidden shadow-lg\" style={{ borderRadius: 'var(--sf-radius-card)' }}>\n <SmoothImage src={image} alt={attribution ?? ''} className=\"h-80 w-full object-cover\" loading=\"lazy\" />\n </div>\n )}\n </div>\n </section>\n )\n}\n\nexport const storyQuoteBlockMeta = {\n label: 'Story quote',\n description: 'Editorial split: a large serif quote with attribution, beside an optional photo.',\n settings: [\n { id: 'eyebrow', type: 'text', label: 'Eyebrow', help: 'Small uppercase label above the quote, e.g. \"A casa\".' },\n { id: 'quote', type: 'richtext', label: 'Quote', help: 'One or two sentences of brand voice — no surrounding quotation marks.', required: true },\n { id: 'attribution', type: 'text', label: 'Attribution', help: 'Who says it, e.g. the founder or the house itself.' },\n { id: 'image', type: 'image', label: 'Photo', help: 'Optional — without it the quote goes full width.' },\n ],\n presets: [\n {\n name: 'Story quote',\n props: {\n eyebrow: 'Nossa casa',\n quote: 'Fazemos pouco, e fazemos bem — cada peça passa pelas mesmas mãos, do primeiro esboço à embalagem.',\n attribution: 'O ateliê',\n },\n },\n ],\n enabledOn: ['home', 'collection', 'content'],\n} satisfies Omit<RegistryMeta, 'propsSchema'>\n\n// --- imageTiles --------------------------------------------------------------\n\nexport interface ImageTile {\n image: string\n label: string\n href?: string\n}\n\nexport interface ImageTilesProps {\n title?: string\n eyebrow?: string\n tiles?: ImageTile[]\n columns?: number\n aspect?: 'portrait' | 'square' | 'wide'\n}\n\nconst TILE_ASPECT: Record<NonNullable<ImageTilesProps['aspect']>, string> = {\n portrait: 'aspect-[4/5]',\n square: 'aspect-square',\n wide: 'aspect-[16/9]',\n}\n\nexport function ImageTiles({ title, eyebrow, tiles = [], columns = 4, aspect = 'portrait' }: ImageTilesProps) {\n if (tiles.length === 0) return null\n const lgCols = columns === 2 ? 'lg:grid-cols-2' : columns === 3 ? 'lg:grid-cols-3' : 'lg:grid-cols-4'\n return (\n <section data-testid=\"image-tiles\" className=\"mx-auto max-w-7xl px-4 py-12 sm:px-6 sm:py-16\">\n {eyebrow && <p className=\"mb-2 text-center text-xs font-semibold uppercase tracking-[0.2em] text-primary\">{eyebrow}</p>}\n {title && <h2 className=\"sf-heading mb-8 text-center text-2xl font-bold sm:text-3xl\">{title}</h2>}\n <div className={`grid grid-cols-2 gap-3 sm:gap-4 ${lgCols}`}>\n {tiles.map((tile) => {\n const content = (\n <div className={`relative ${TILE_ASPECT[aspect] ?? TILE_ASPECT.portrait}`}>\n <img\n src={tile.image}\n alt=\"\"\n loading=\"lazy\"\n className=\"h-full w-full object-cover transition-transform duration-500 ease-out group-hover:scale-[1.04]\"\n />\n {/* Bottom-weighted scrim only: lifestyle shots keep their subject\n * in the upper two thirds; a full overlay buys contrast the\n * photo does not need. */}\n <div\n aria-hidden\n className=\"absolute inset-x-0 bottom-0 h-2/5\"\n style={{ background: 'linear-gradient(180deg, transparent, rgba(0,0,0,0.72))' }}\n />\n <span className=\"sf-heading absolute inset-x-0 bottom-0 p-3 text-base font-bold text-white drop-shadow sm:p-4 sm:text-lg\">\n {tile.label}\n </span>\n </div>\n )\n const style = { borderRadius: 'var(--sf-radius-card)' }\n return tile.href ? (\n <Link key={tile.label} to={tile.href} className=\"group relative block overflow-hidden\" style={style}>\n {content}\n </Link>\n ) : (\n <div key={tile.label} className=\"group relative overflow-hidden\" style={style}>\n {content}\n </div>\n )\n })}\n </div>\n </section>\n )\n}\n\nexport const imageTilesBlockMeta = {\n label: 'Image tiles',\n description:\n 'Grid of photo tiles with a label and a link — shop-by-purpose, collections, lookbook chapters. The discovery axis a category tree does not give you.',\n settings: [\n { id: 'eyebrow', type: 'text', label: 'Eyebrow' },\n { id: 'title', type: 'text', label: 'Title' },\n {\n id: 'tiles',\n type: 'list',\n label: 'Tiles',\n required: true,\n of: [\n { id: 'image', type: 'image', label: 'Photo', required: true },\n { id: 'label', type: 'text', label: 'Label', required: true },\n { id: 'href', type: 'url', label: 'Link', help: 'Usually a filtered catalog url, e.g. /catalog?purpose=estudo.' },\n ],\n },\n { id: 'columns', type: 'number', label: 'Columns (desktop)', min: 2, max: 4, default: 4 },\n {\n id: 'aspect',\n type: 'select',\n label: 'Tile aspect',\n default: 'portrait',\n options: [\n { value: 'portrait', label: 'Portrait (4:5)' },\n { value: 'square', label: 'Square' },\n { value: 'wide', label: 'Wide (16:9)' },\n ],\n },\n ],\n presets: [\n {\n name: 'Image tiles',\n props: {\n title: 'Compre por ocasião',\n tiles: [\n { image: 'https://images.example/dia-a-dia.jpg', label: 'Dia a dia', href: '/catalog' },\n { image: 'https://images.example/presente.jpg', label: 'Para presentear', href: '/catalog' },\n { image: 'https://images.example/festa.jpg', label: 'Ocasiões especiais', href: '/catalog' },\n { image: 'https://images.example/novidades.jpg', label: 'Novidades', href: '/catalog' },\n ],\n },\n },\n ],\n enabledOn: ['home', 'catalog', 'collection', 'content'],\n} satisfies Omit<RegistryMeta, 'propsSchema'>\n\n// --- faq ---------------------------------------------------------------------\n\nexport interface FaqItem {\n q: string\n a: string\n}\n\nexport function FaqSection({ title, subtitle, items = [] }: { title?: string; subtitle?: string; items?: FaqItem[] }) {\n const [open, setOpen] = useState<number | null>(0)\n if (items.length === 0) return null\n return (\n <section data-testid=\"faq-section\" className=\"mx-auto max-w-7xl px-4 py-16 sm:px-6\">\n {(title || subtitle) && (\n <div className=\"mb-10 text-center\">\n {title && <h2 className=\"sf-heading text-3xl font-bold tracking-tight\">{title}</h2>}\n {subtitle && <p className=\"mt-2 text-muted-foreground\">{subtitle}</p>}\n </div>\n )}\n <div className=\"mx-auto max-w-3xl divide-y border bg-card\" style={{ borderRadius: 'var(--sf-radius-card)' }}>\n {items.map((item, i) => {\n const isOpen = open === i\n return (\n <div key={item.q}>\n <button\n type=\"button\"\n onClick={() => setOpen(isOpen ? null : i)}\n aria-expanded={isOpen}\n className=\"flex w-full items-center justify-between gap-4 px-5 py-4 text-left font-semibold hover:text-primary\"\n >\n {item.q}\n <ChevronDown\n className={`h-5 w-5 shrink-0 text-primary transition-transform ${isOpen ? 'rotate-180' : ''}`}\n />\n </button>\n {isOpen && <p className=\"px-5 pb-5 text-sm leading-relaxed text-muted-foreground\">{item.a}</p>}\n </div>\n )\n })}\n </div>\n </section>\n )\n}\n\nexport const faqBlockMeta = {\n label: 'FAQ',\n description: 'Collapsible questions and answers. One open at a time; the first starts open.',\n settings: [\n { id: 'title', type: 'text', label: 'Title', default: 'Perguntas frequentes' },\n { id: 'subtitle', type: 'text', label: 'Subtitle' },\n {\n id: 'items',\n type: 'list',\n label: 'Questions',\n required: true,\n of: [\n { id: 'q', type: 'text', label: 'Question', required: true },\n { id: 'a', type: 'richtext', label: 'Answer', required: true },\n ],\n },\n ],\n presets: [\n {\n name: 'FAQ',\n props: {\n title: 'Perguntas frequentes',\n items: [\n { q: 'Qual o prazo de entrega?', a: 'Enviamos em até 2 dias úteis; o prazo depende do CEP e aparece no fechamento do pedido.' },\n { q: 'Posso trocar ou devolver?', a: 'Sim — você tem 7 dias após o recebimento para solicitar troca ou devolução.' },\n { q: 'Quais as formas de pagamento?', a: 'PIX e cartão de crédito. O pedido é confirmado assim que o pagamento é aprovado.' },\n ],\n },\n },\n ],\n // Objection-handling is welcome wherever the decision happens.\n enabledOn: ['home', 'catalog', 'product', 'collection', 'content'],\n} satisfies Omit<RegistryMeta, 'propsSchema'>\n","import React, { useEffect, useState } from 'react'\nimport { getLucideIcon } from '@fayz-ai/ui/icons'\nimport type { RegistryMeta } from '@fayz-ai/core'\nimport { Link } from '../../app/router'\n\n// ---------------------------------------------------------------------------\n// Conversion blocks promoted from the fleet (spine M2):\n//\n// steps ← figurinhas `fx-steps` (numbered how-it-works strip)\n// countdown ← figurinhas `fx-countdown` (live countdown to a milestone list)\n// tiers ← figurinhas `fx-wholesale` (volume/pricing tier cards + CTA)\n//\n// The originals hardcoded Copa-2026 copy, a WhatsApp number and a blue\n// gradient. The mechanism — numbered steps, the \"next future milestone\"\n// countdown rule, a highlighted tier card — is generic; everything branded\n// became a setting, and color comes from the theme's primary token.\n// ---------------------------------------------------------------------------\n\n// --- steps -------------------------------------------------------------------\n\nexport interface StepItem {\n /** Lucide icon name in PascalCase; unknown names render no icon. */\n icon?: string\n title: string\n text?: string\n}\n\nexport function StepsSection({\n title,\n subtitle,\n items = [],\n}: {\n title?: string\n subtitle?: string\n items?: StepItem[]\n}) {\n if (items.length === 0) return null\n const cols = items.length >= 4 ? 'lg:grid-cols-4' : items.length === 3 ? 'lg:grid-cols-3' : 'lg:grid-cols-2'\n return (\n <section data-testid=\"steps-section\" className=\"mx-auto max-w-7xl px-4 py-16 sm:px-6\">\n {(title || subtitle) && (\n <div className=\"mb-10 text-center\">\n {title && <h2 className=\"sf-heading text-3xl font-bold tracking-tight\">{title}</h2>}\n {subtitle && <p className=\"mt-2 text-muted-foreground\">{subtitle}</p>}\n </div>\n )}\n <div className={`grid gap-6 sm:grid-cols-2 ${cols}`}>\n {items.map((step, i) => {\n const Icon = step.icon ? getLucideIcon(step.icon) : null\n return (\n <div key={step.title} className=\"relative border bg-card p-6\" style={{ borderRadius: 'var(--sf-radius-card)' }}>\n <div className=\"flex items-center gap-3\">\n <span className=\"flex h-11 w-11 items-center justify-center rounded-full bg-primary font-bold text-primary-foreground\">\n {i + 1}\n </span>\n {Icon && <Icon className=\"h-6 w-6 text-primary\" />}\n </div>\n <h3 className=\"mt-4 text-lg font-bold\">{step.title}</h3>\n {step.text && <p className=\"mt-1.5 text-sm text-muted-foreground\">{step.text}</p>}\n </div>\n )\n })}\n </div>\n </section>\n )\n}\n\nexport const stepsBlockMeta = {\n label: 'Steps',\n description: 'Numbered how-it-works cards — order, receive, resell. Three or four steps.',\n settings: [\n { id: 'title', type: 'text', label: 'Title', default: 'Como funciona' },\n { id: 'subtitle', type: 'text', label: 'Subtitle' },\n {\n id: 'items',\n type: 'list',\n label: 'Steps',\n required: true,\n help: 'Numbered automatically, in order.',\n of: [\n { id: 'icon', type: 'text', label: 'Icon', help: 'Lucide icon name in PascalCase, e.g. ShoppingCart, Truck, Repeat.' },\n { id: 'title', type: 'text', label: 'Title', required: true },\n { id: 'text', type: 'text', label: 'Detail' },\n ],\n },\n ],\n presets: [\n {\n name: 'Steps',\n props: {\n title: 'Como funciona',\n items: [\n { icon: 'Search', title: 'Escolha', text: 'Monte seu pedido no catálogo.' },\n { icon: 'ShoppingCart', title: 'Peça', text: 'Feche o carrinho em poucos cliques.' },\n { icon: 'Truck', title: 'Receba', text: 'Entrega rápida para todo o Brasil.' },\n ],\n },\n },\n ],\n enabledOn: ['home', 'catalog', 'collection', 'content'],\n} satisfies Omit<RegistryMeta, 'propsSchema'>\n\n// --- countdown ---------------------------------------------------------------\n\nexport interface CountdownMilestone {\n /** ISO date-time with offset, e.g. '2026-06-11T13:00:00-03:00'. */\n date: string\n /** Heading shown while this milestone is the next one, e.g. 'A Copa começa em'. */\n label: string\n}\n\nfunction useCountdown(target: number) {\n const [now, setNow] = useState(() => Date.now())\n useEffect(() => {\n const id = window.setInterval(() => setNow(Date.now()), 1000)\n return () => window.clearInterval(id)\n }, [])\n const diff = Math.max(0, target - now)\n const s = Math.floor(diff / 1000)\n return {\n days: Math.floor(s / 86400),\n hours: Math.floor((s % 86400) / 3600),\n minutes: Math.floor((s % 3600) / 60),\n seconds: s % 60,\n }\n}\n\n/** The milestone the timer should count to: the next future one, else the last. */\nexport function nextMilestone(\n milestones: readonly CountdownMilestone[],\n now: number,\n): CountdownMilestone | undefined {\n return milestones.find((m) => new Date(m.date).getTime() > now) ?? milestones[milestones.length - 1]\n}\n\nexport function CountdownBand({\n eyebrow,\n milestones = [],\n note,\n}: {\n eyebrow?: string\n milestones?: CountdownMilestone[]\n note?: string\n}) {\n const next = nextMilestone(milestones, Date.now())\n const target = next ? new Date(next.date).getTime() : Date.now()\n const t = useCountdown(target)\n if (!next) return null\n const cells: Array<[number, string]> = [\n [t.days, 'dias'],\n [t.hours, 'horas'],\n [t.minutes, 'min'],\n [t.seconds, 'seg'],\n ]\n return (\n <section data-testid=\"countdown-band\" className=\"bg-primary text-primary-foreground\">\n <div className=\"mx-auto max-w-4xl px-4 py-14 text-center sm:px-6\">\n {eyebrow && <p className=\"text-xs font-bold uppercase tracking-[0.22em] opacity-80\">{eyebrow}</p>}\n <h2 className=\"sf-heading mt-2 text-2xl font-bold sm:text-3xl\">{next.label}</h2>\n <div className=\"mt-8 flex justify-center gap-3 sm:gap-5\">\n {cells.map(([value, unit]) => (\n <div\n key={unit}\n className=\"min-w-[68px] bg-white/15 px-3 py-4 backdrop-blur sm:min-w-[92px]\"\n style={{ borderRadius: 'var(--sf-radius-card)' }}\n >\n <div className=\"text-3xl font-extrabold tabular-nums sm:text-5xl\">{String(value).padStart(2, '0')}</div>\n <div className=\"mt-1 text-[11px] font-semibold uppercase tracking-wider opacity-80\">{unit}</div>\n </div>\n ))}\n </div>\n {note && <p className=\"mt-6 text-sm opacity-80\">{note}</p>}\n </div>\n </section>\n )\n}\n\nexport const countdownBlockMeta = {\n label: 'Countdown',\n description:\n 'Live countdown to the next milestone in a list — a launch, an event, a season. Always ticks toward the next FUTURE date; after the last one it shows zeros.',\n settings: [\n { id: 'eyebrow', type: 'text', label: 'Eyebrow', default: 'Contagem regressiva' },\n {\n id: 'milestones',\n type: 'list',\n label: 'Milestones',\n required: true,\n help: 'Ordered by date. The heading changes as each milestone passes.',\n of: [\n { id: 'date', type: 'text', label: 'Date', help: \"ISO date-time with offset, e.g. '2026-06-11T13:00:00-03:00'.\", required: true },\n { id: 'label', type: 'text', label: 'Heading', help: 'Shown while this milestone is the next one.', required: true },\n ],\n },\n { id: 'note', type: 'text', label: 'Note', help: 'One line under the timer, e.g. \"Garanta antes do lançamento.\"' },\n ],\n presets: [\n {\n name: 'Countdown',\n props: {\n eyebrow: 'Contagem regressiva',\n milestones: [{ date: '2026-12-01T00:00:00-03:00', label: 'A nova coleção chega em' }],\n note: 'Garanta antes do lançamento.',\n },\n },\n ],\n enabledOn: ['home', 'catalog', 'collection', 'content'],\n} satisfies Omit<RegistryMeta, 'propsSchema'>\n\n// --- tiers -------------------------------------------------------------------\n\nexport interface TierItem {\n name: string\n /** What qualifies a buyer for this tier, e.g. 'Packs e caixas fechadas'. */\n qualifier?: string\n /** What the tier gets, e.g. '10% OFF com o cupom REVENDA10'. */\n detail?: string\n highlight?: boolean\n /** Badge on the highlighted card, e.g. 'Mais popular'. */\n badge?: string\n}\n\nexport function TierCards({\n eyebrow,\n title,\n subtitle,\n tiers = [],\n ctaLabel,\n ctaHref,\n}: {\n eyebrow?: string\n title?: string\n subtitle?: string\n tiers?: TierItem[]\n ctaLabel?: string\n ctaHref?: string\n}) {\n if (tiers.length === 0) return null\n const external = ctaHref ? /^[a-z]+:/.test(ctaHref) : false\n return (\n <section data-testid=\"tier-cards\" className=\"bg-muted/50\">\n <div className=\"mx-auto max-w-7xl px-4 py-16 sm:px-6\">\n {(eyebrow || title || subtitle) && (\n <div className=\"mb-10 max-w-2xl\">\n {eyebrow && <p className=\"text-xs font-bold uppercase tracking-[0.2em] text-primary\">{eyebrow}</p>}\n {title && <h2 className=\"sf-heading mt-2 text-3xl font-bold tracking-tight\">{title}</h2>}\n {subtitle && <p className=\"mt-3 text-muted-foreground\">{subtitle}</p>}\n </div>\n )}\n <div className=\"grid gap-5 md:grid-cols-3\">\n {tiers.map((tier) => (\n <div\n key={tier.name}\n className={`border p-6 ${tier.highlight ? 'border-primary bg-primary/5 ring-1 ring-primary' : 'bg-card'}`}\n style={{ borderRadius: 'var(--sf-radius-card)' }}\n >\n {tier.highlight && tier.badge && (\n <span className=\"mb-2 inline-block rounded-full bg-primary px-3 py-1 text-xs font-bold uppercase tracking-wide text-primary-foreground\">\n {tier.badge}\n </span>\n )}\n <h3 className=\"text-xl font-bold\">{tier.name}</h3>\n {tier.qualifier && <p className=\"mt-1 text-sm font-medium text-primary\">{tier.qualifier}</p>}\n {tier.detail && <p className=\"mt-3 text-sm text-muted-foreground\">{tier.detail}</p>}\n </div>\n ))}\n </div>\n {ctaLabel && ctaHref && (\n <div className=\"mt-10\">\n {external ? (\n <a\n href={ctaHref}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"sf-cta inline-flex items-center gap-2 bg-primary px-8 py-3.5 text-sm font-bold text-primary-foreground shadow-lg transition-all hover:-translate-y-0.5 hover:shadow-xl\"\n style={{ borderRadius: 'var(--sf-radius-button)' }}\n >\n {ctaLabel}\n </a>\n ) : (\n <Link\n to={ctaHref}\n className=\"sf-cta inline-flex items-center gap-2 bg-primary px-8 py-3.5 text-sm font-bold text-primary-foreground shadow-lg transition-all hover:-translate-y-0.5 hover:shadow-xl\"\n style={{ borderRadius: 'var(--sf-radius-button)' }}\n >\n {ctaLabel}\n </Link>\n )}\n </div>\n )}\n </div>\n </section>\n )\n}\n\nexport const tiersBlockMeta = {\n label: 'Tier cards',\n description:\n 'Volume/pricing tiers as cards — varejo, revenda, atacado — with one optionally highlighted and a call to action. The block figurinhas needed to sell wholesale.',\n settings: [\n { id: 'eyebrow', type: 'text', label: 'Eyebrow' },\n { id: 'title', type: 'text', label: 'Title' },\n { id: 'subtitle', type: 'text', label: 'Subtitle' },\n {\n id: 'tiers',\n type: 'list',\n label: 'Tiers',\n required: true,\n of: [\n { id: 'name', type: 'text', label: 'Name', required: true },\n { id: 'qualifier', type: 'text', label: 'Qualifier', help: 'What gets a buyer into this tier.' },\n { id: 'detail', type: 'text', label: 'Detail', help: 'What the tier gets.' },\n { id: 'highlight', type: 'boolean', label: 'Highlight', default: false },\n { id: 'badge', type: 'text', label: 'Badge', help: 'Shown on a highlighted card, e.g. \"Mais popular\".' },\n ],\n },\n { id: 'ctaLabel', type: 'text', label: 'CTA label' },\n { id: 'ctaHref', type: 'url', label: 'CTA link', help: 'Internal path or an external url (e.g. a WhatsApp link) — external opens a new tab.' },\n ],\n presets: [\n {\n name: 'Tier cards',\n props: {\n eyebrow: 'Atacado',\n title: 'Condições por volume',\n subtitle: 'Quanto maior o pedido, melhor o preço por unidade.',\n tiers: [\n { name: 'Varejo', qualifier: 'A partir de 1 unidade', detail: 'Preço de tabela, entrega rápida.' },\n { name: 'Revenda', qualifier: 'Caixas fechadas', detail: 'Desconto progressivo e reposição garantida.', highlight: true, badge: 'Mais popular' },\n { name: 'Atacado', qualifier: 'Grandes volumes', detail: 'Preço negociado e prazo dedicado.' },\n ],\n ctaLabel: 'Quero ser parceiro',\n ctaHref: '/catalog',\n },\n },\n ],\n enabledOn: ['home', 'catalog', 'collection', 'content'],\n} satisfies Omit<RegistryMeta, 'propsSchema'>\n","import { useMarketProduct } from '../../hooks/use-market-product'\nimport React from 'react'\nimport { Check } from 'lucide-react'\nimport type { BlockNode, RegistryMeta } from '@fayz-ai/core'\nimport type { Product } from '@fayz-ai/shop/types'\nimport { useStorefrontConfig } from '../../document/config'\nimport { BlockDataError, useBlockData } from '../../blocks/page-data'\nimport { useStorefrontPageOptional } from '../../views/StorefrontPage'\nimport { bannerPlaceholder } from '../../blocks/sections'\nimport { formatMoney } from '../../lib/format'\nimport { Reveal } from '../../lib/motion'\nimport { Link } from '../../app/router'\nimport { TID } from '../../lib/testids'\nimport { SmoothImage } from '../SmoothImage'\n\n// ---------------------------------------------------------------------------\n// Collection blocks — the generic anatomy of a campaign page.\n//\n// Brand/collab landing pages converge on the same four parts: a co-branded\n// hero, a run of product spotlights alternating sides, a decorative motif\n// between them, and a closing CTA into the filtered catalog. These blocks are\n// that anatomy and nothing more — the palette, the motif, the copy and the\n// order all arrive as data from the app.\n//\n// They are ordinary registered blocks, so a campaign page is a `pages.content`\n// entry with a `theme` overlay, not a parallel page system with its own route.\n// The page's own slug is what a CTA defaults to filtering on, read from page\n// context so a page's data does not repeat its slug on every block.\n// ---------------------------------------------------------------------------\n\n/** The collection this block is rendering for: an explicit prop, else the\n * content page's slug. Null on the home page, where there is no collection. */\nfunction useCollectionSlug(explicit?: string): string | null {\n const page = useStorefrontPageOptional()\n if (explicit) return explicit\n if (page?.kind === 'content' || page?.kind === 'collection') return page.params.slug ?? null\n return null\n}\n\nfunction catalogFilterHref(catalogPath: string, slug: string | null): string {\n return slug ? `${catalogPath}?collection=${encodeURIComponent(slug)}` : catalogPath\n}\n\n// --- collectionHero ----------------------------------------------------------\n\nexport interface CollectionHeroProps {\n title: string\n eyebrow?: string\n tagline?: string\n /** Background art. Falls back to a gradient derived from `hue`. */\n image?: string\n imageAlt?: string\n hue?: number\n /** Brand lockup marks shown above the title (store logo + collection logo). */\n logos?: Array<{ src: string; alt: string }>\n cta?: string\n href?: string\n /** Collection tag the CTA filters on. Defaults to the page's own slug. */\n collection?: string\n align?: 'center' | 'start'\n /** Scrim strength over the art. Default 'dark'. */\n overlay?: 'dark' | 'soft' | 'none'\n height?: 'medium' | 'tall'\n}\n\nconst OVERLAY_CLASS = {\n dark: 'bg-gradient-to-t from-black/75 via-black/45 to-black/25',\n soft: 'bg-gradient-to-t from-black/45 via-black/20 to-transparent',\n none: '',\n} as const\n\nexport function CollectionHero({\n title,\n eyebrow,\n tagline,\n image,\n imageAlt,\n hue = 340,\n logos,\n cta,\n href,\n collection,\n align = 'center',\n overlay = 'dark',\n height = 'tall',\n}: CollectionHeroProps) {\n const config = useStorefrontConfig()\n const slug = useCollectionSlug(collection)\n const target = href ?? catalogFilterHref(config.catalogPath, slug)\n const centered = align === 'center'\n\n return (\n <section data-testid={TID.collectionHero} className=\"relative overflow-hidden\">\n <SmoothImage\n src={image ?? bannerPlaceholder(title, hue, hue + 40, 1600, 800)}\n alt={imageAlt ?? title}\n className={`w-full object-cover ${height === 'tall' ? 'h-[68vh] min-h-[420px]' : 'h-[46vh] min-h-[320px]'}`}\n />\n <div\n className={`absolute inset-0 flex flex-col justify-center p-6 text-white sm:p-12 ${OVERLAY_CLASS[overlay]} ${\n centered ? 'items-center text-center' : 'items-start text-left'\n }`}\n >\n <Reveal className={centered ? 'max-w-3xl' : 'max-w-2xl'}>\n {logos && logos.length > 0 && (\n <div className={`mb-6 flex items-center gap-5 ${centered ? 'justify-center' : ''}`}>\n {logos.map((logo, i) => (\n <React.Fragment key={logo.src}>\n {i > 0 && <span className=\"text-2xl font-light opacity-60\" aria-hidden>×</span>}\n <img src={logo.src} alt={logo.alt} className=\"h-10 w-auto object-contain sm:h-14\" />\n </React.Fragment>\n ))}\n </div>\n )}\n {eyebrow && (\n <p className=\"mb-3 text-xs font-semibold uppercase tracking-[0.28em] text-white/80\">{eyebrow}</p>\n )}\n <h1 className=\"sf-heading text-4xl font-bold leading-tight drop-shadow sm:text-6xl\">{title}</h1>\n {tagline && <p className=\"mt-4 max-w-xl text-lg leading-relaxed text-white/90\">{tagline}</p>}\n {cta && (\n <Link\n to={target}\n data-testid={TID.collectionHeroCta}\n className=\"sf-cta mt-8 inline-block bg-white px-9 py-3.5 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 const collectionHeroBlockMeta = {\n label: 'Collection hero',\n description:\n 'Full-bleed campaign hero: co-branded lockup, title, tagline and one CTA into the collection.',\n settings: [\n { id: 'title', type: 'text', label: 'Title', required: true },\n { id: 'eyebrow', type: 'text', label: 'Eyebrow', help: 'Small caps label above the title, e.g. the drop name.' },\n { id: 'tagline', type: 'text', label: 'Tagline', help: 'One line under the title. Optional.' },\n { id: 'image', type: 'image', label: 'Background art', help: 'Wide shot, 1600×800 or larger. A generated gradient stands in while there is none.' },\n { id: 'imageAlt', type: 'text', label: 'Image alt text', help: 'Defaults to the title.' },\n { id: 'hue', type: 'number', label: 'Placeholder hue', help: 'Only used for the generated gradient, 0–360.', min: 0, max: 360, default: 340 },\n {\n id: 'logos',\n type: 'list',\n label: 'Brand lockup',\n help: 'Marks shown above the title, separated by ×. Usually the store logo and the collection logo.',\n of: [\n { id: 'src', type: 'image', label: 'Logo', required: true },\n { id: 'alt', type: 'text', label: 'Alt text', required: true },\n ],\n },\n { id: 'cta', type: 'text', label: 'Button text', help: 'Empty hides the button.' },\n {\n id: 'href',\n type: 'url',\n label: 'Button target',\n help: \"Defaults to the catalog filtered by this page's collection.\",\n },\n {\n id: 'collection',\n type: 'text',\n label: 'Collection tag',\n help: \"Matched against each product's `metadata.collection`. Defaults to this page's own slug — set it only when the page name and the tag differ.\",\n },\n {\n id: 'align',\n type: 'select',\n label: 'Alignment',\n options: [\n { value: 'center', label: 'Centered' },\n { value: 'start', label: 'Left' },\n ],\n default: 'center',\n },\n {\n id: 'overlay',\n type: 'select',\n label: 'Scrim',\n help: 'How much the art is darkened so the type stays readable. Use none only on art that is already dark.',\n options: [\n { value: 'dark', label: 'Dark' },\n { value: 'soft', label: 'Soft' },\n { value: 'none', label: 'None' },\n ],\n default: 'dark',\n },\n {\n id: 'height',\n type: 'select',\n label: 'Height',\n options: [\n { value: 'tall', label: 'Tall (68vh)' },\n { value: 'medium', label: 'Medium (46vh)' },\n ],\n default: 'tall',\n },\n ],\n presets: [\n {\n name: 'Campaign hero',\n props: {\n eyebrow: 'coleção',\n title: 'A nova coleção chegou',\n tagline: 'Peças desenhadas para durar mais de uma estação.',\n cta: 'Ver a coleção',\n align: 'center',\n overlay: 'dark',\n height: 'tall',\n },\n },\n ],\n enabledOn: ['home', 'collection', 'content'],\n} satisfies Omit<RegistryMeta, 'propsSchema'>\n\n// --- productSpotlight --------------------------------------------------------\n\nexport interface ProductSpotlightProps {\n title: string\n eyebrow?: string\n description?: string\n /** Feature bullets rendered with a check mark. */\n features?: readonly string[]\n image?: string\n imageAlt?: string\n hue?: number\n /** Which side the art sits on. Alternate these down the page. */\n side?: 'left' | 'right'\n /**\n * The product this spotlights, by URL slug. When set, the block resolves the\n * live product to show its price and link straight to the PDP — so a\n * spotlight can never advertise a price the catalog no longer charges, or\n * point at a product that isn't there.\n */\n productSlug?: string\n cta?: string\n href?: string\n /** Tint behind the art. Defaults to the page's own surface. */\n background?: string\n /** The block node, when rendered from a tree — carries instance `data` overrides. */\n node?: BlockNode\n}\n\nexport function ProductSpotlight({\n title,\n eyebrow,\n description,\n features,\n image,\n imageAlt,\n hue = 200,\n side = 'left',\n productSlug,\n cta,\n href,\n background,\n node,\n}: ProductSpotlightProps) {\n const config = useStorefrontConfig()\n // The declared read, through the same loader the product page uses — so a\n // spotlight shows the catalog's current price rather than a copy of it that\n // silently goes stale. A document instance may rebind the slug to a route\n // param like any other block need.\n const { status, data, error, loader } = useBlockData<Product | null>(node, 'product', {\n loader: 'products.bySlug',\n params: { slug: productSlug },\n })\n const product = useMarketProduct(productSlug ? (data ?? null) : null)\n\n const target = product ? `/product/${product.slug}` : href\n const art = image ?? product?.images?.[0]?.url ?? bannerPlaceholder(title, hue, hue + 45, 1200, 1200)\n const label = cta ?? (productSlug ? 'Comprar' : undefined)\n const artFirst = side === 'left'\n\n if (productSlug && status === 'error') return <BlockDataError loader={loader} message={error} />\n\n return (\n <section\n data-testid={TID.productSpotlight}\n data-product-slug={productSlug}\n className=\"py-14 sm:py-20\"\n style={background ? { background } : undefined}\n >\n <div className=\"mx-auto grid max-w-6xl items-center gap-10 px-4 sm:px-6 md:grid-cols-2 md:gap-16\">\n <Reveal className={artFirst ? 'md:order-1' : 'md:order-2'}>\n <SmoothImage\n src={art}\n alt={imageAlt ?? product?.name ?? title}\n className=\"aspect-square w-full object-cover\"\n style={{ borderRadius: 'var(--sf-radius-card)' }}\n />\n </Reveal>\n <Reveal delay={120} className={artFirst ? 'md:order-2' : 'md:order-1'}>\n {eyebrow && (\n <p className=\"mb-2 text-xs font-semibold uppercase tracking-[0.22em] text-primary\">{eyebrow}</p>\n )}\n <h2 className=\"sf-heading text-3xl font-bold leading-tight sm:text-4xl\">{title}</h2>\n {description && <p className=\"mt-4 leading-7 text-muted-foreground\">{description}</p>}\n {features && features.length > 0 && (\n <ul className=\"mt-6 space-y-2.5\">\n {features.map((feature) => (\n <li key={feature} className=\"flex items-start gap-2.5\">\n <Check className=\"mt-0.5 h-5 w-5 shrink-0 text-primary\" aria-hidden />\n <span className=\"leading-6\">{feature}</span>\n </li>\n ))}\n </ul>\n )}\n {product && (\n <p className=\"mt-6 text-2xl font-bold\">\n {formatMoney(product.price, config.currency, config.locale)}\n </p>\n )}\n {label && target && (\n <Link\n to={target}\n data-testid={TID.productSpotlightCta}\n className=\"sf-cta mt-6 inline-block bg-primary px-8 py-3 font-semibold text-primary-foreground shadow-sm transition-all hover:-translate-y-0.5 hover:shadow-md\"\n style={{ borderRadius: 'var(--sf-radius-button)' }}\n >\n {label}\n </Link>\n )}\n </Reveal>\n </div>\n </section>\n )\n}\n\nexport const productSpotlightBlockMeta = {\n label: 'Product spotlight',\n description:\n 'One product argued at length: art on one side, copy and feature bullets on the other, with the live price and a link to its page.',\n settings: [\n { id: 'title', type: 'text', label: 'Title', required: true },\n { id: 'eyebrow', type: 'text', label: 'Eyebrow', help: 'Small caps label above the title.' },\n { id: 'description', type: 'richtext', label: 'Description', help: 'A paragraph on why this product is worth the page.' },\n {\n id: 'features',\n type: 'list',\n label: 'Feature bullets',\n help: 'Short claims, each rendered with a check mark.',\n of: [{ id: 'text', type: 'text', label: 'Bullet', required: true }],\n },\n {\n id: 'productSlug',\n // A real catalog entity backs this, so the author gets a picker. The\n // value is the product's URL slug — the same one products.bySlug reads.\n type: 'product',\n label: 'Product',\n help: \"The product's URL slug. Setting it makes the block show the catalog's current price and link to the product page; leave it empty for a purely editorial panel.\",\n },\n { id: 'image', type: 'image', label: 'Art', help: \"Defaults to the product's first photo, then to a generated gradient.\" },\n { id: 'imageAlt', type: 'text', label: 'Image alt text', help: 'Defaults to the product name, then the title.' },\n { id: 'hue', type: 'number', label: 'Placeholder hue', help: 'Only used for the generated gradient, 0–360.', min: 0, max: 360, default: 200 },\n {\n id: 'side',\n type: 'select',\n label: 'Art side',\n help: 'Alternate this down the page so consecutive spotlights do not read as one column.',\n options: [\n { value: 'left', label: 'Left' },\n { value: 'right', label: 'Right' },\n ],\n default: 'left',\n },\n { id: 'cta', type: 'text', label: 'Button text', help: \"Defaults to 'Comprar' when a product is set.\" },\n { id: 'href', type: 'url', label: 'Button target', help: 'Only used when no product is set — with one, the button goes to its page.' },\n { id: 'background', type: 'color', label: 'Background tint', help: 'Behind the whole band. Empty keeps the page surface.' },\n ],\n presets: [\n {\n name: 'Product spotlight',\n props: {\n eyebrow: 'destaque',\n title: 'O produto da coleção',\n description: 'Por que esta peça existe, e para quem.',\n side: 'left',\n },\n },\n ],\n enabledOn: ['home', 'collection', 'content'],\n // The declared read (M3). An instance may rebind the slug to a route param:\n // data: { product: { loader: 'products.bySlug', params: { slug: { $param: 'slug' } } } }\n data: { product: { loader: 'products.bySlug' } },\n} satisfies Omit<RegistryMeta, 'propsSchema'>\n\n// --- motifStrip --------------------------------------------------------------\n\nexport interface MotifStripProps {\n /** Repeated mark — an emoji, or an image URL when `src` is set. */\n symbol?: string\n src?: string\n alt?: string\n /** How many times the mark repeats across the strip. Default 12. */\n count?: number\n background?: string\n height?: 'thin' | 'regular'\n}\n\n/**\n * A decorative band between spotlights. Purely ornamental, so the whole strip\n * is hidden from assistive tech rather than read out as a row of symbols.\n */\nexport function MotifStrip({\n symbol,\n src,\n alt,\n count = 12,\n background,\n height = 'regular',\n}: MotifStripProps) {\n const marks = Array.from({ length: Math.max(1, Math.min(count, 40)) })\n return (\n <div\n data-testid={TID.motifStrip}\n aria-hidden\n className={`flex items-center justify-center gap-5 overflow-hidden ${\n height === 'thin' ? 'py-4' : 'py-7'\n }`}\n style={background ? { background } : undefined}\n >\n {marks.map((_, i) =>\n src ? (\n <img key={i} src={src} alt={alt ?? ''} className=\"h-8 w-auto shrink-0 object-contain opacity-80 sm:h-10\" />\n ) : (\n <span key={i} className=\"shrink-0 text-2xl opacity-80 sm:text-3xl\">\n {symbol ?? '●'}\n </span>\n ),\n )}\n </div>\n )\n}\n\nexport const motifStripBlockMeta = {\n label: 'Motif strip',\n description: 'A decorative band of a repeated mark, for breathing room between spotlights.',\n settings: [\n { id: 'symbol', type: 'text', label: 'Symbol', help: 'A single character or emoji. Ignored when an image is set.', default: '●' },\n { id: 'src', type: 'image', label: 'Mark image', help: 'Use instead of a symbol — a small logo or icon.' },\n { id: 'alt', type: 'text', label: 'Image alt text', help: 'Usually empty: the strip is decoration and is hidden from screen readers.' },\n { id: 'count', type: 'number', label: 'Repeats', help: 'How many marks across the strip. Capped at 40.', min: 1, max: 40, default: 12 },\n { id: 'background', type: 'color', label: 'Background', help: 'Empty keeps the page surface.' },\n {\n id: 'height',\n type: 'select',\n label: 'Height',\n options: [\n { value: 'regular', label: 'Regular' },\n { value: 'thin', label: 'Thin' },\n ],\n default: 'regular',\n },\n ],\n presets: [{ name: 'Motif strip', props: { symbol: '●', count: 12, height: 'regular' } }],\n enabledOn: ['home', 'collection', 'content'],\n} satisfies Omit<RegistryMeta, 'propsSchema'>\n\n// --- collectionCta -----------------------------------------------------------\n\nexport interface CollectionCtaProps {\n title: string\n subtitle?: string\n eyebrow?: string\n cta?: string\n href?: string\n /** Collection tag the CTA filters on. Defaults to the page's own slug. */\n collection?: string\n background?: string\n}\n\n/**\n * The closing band. Defaults to this collection's own catalog filter, which is\n * the point of serving the page from the store: the CTA stays inside the same\n * session and cart instead of handing the shopper off to another site.\n */\nexport function CollectionCta({\n title,\n subtitle,\n eyebrow,\n cta,\n href,\n collection,\n background,\n}: CollectionCtaProps) {\n const config = useStorefrontConfig()\n const slug = useCollectionSlug(collection)\n const target = href ?? catalogFilterHref(config.catalogPath, slug)\n\n return (\n <section\n data-testid={TID.collectionCta}\n className=\"bg-primary py-16 text-primary-foreground\"\n style={background ? { background } : undefined}\n >\n <Reveal className=\"mx-auto max-w-2xl px-4 text-center sm:px-6\">\n {eyebrow && (\n <p className=\"mb-3 text-xs font-semibold uppercase tracking-[0.28em] opacity-80\">{eyebrow}</p>\n )}\n <h2 className=\"sf-heading text-3xl font-bold sm:text-4xl\">{title}</h2>\n {subtitle && <p className=\"mt-3 opacity-90\">{subtitle}</p>}\n <Link\n to={target}\n data-testid={TID.collectionCtaButton}\n className=\"sf-cta mt-8 inline-block bg-background px-9 py-3.5 font-semibold text-foreground shadow-lg transition-all hover:-translate-y-0.5 hover:shadow-xl\"\n style={{ borderRadius: 'var(--sf-radius-button)' }}\n >\n {cta ?? 'Ver a coleção'}\n </Link>\n </Reveal>\n </section>\n )\n}\n\nexport const collectionCtaBlockMeta = {\n label: 'Collection CTA',\n description:\n \"The closing band of a campaign page — one button into the catalog filtered by this collection, so the shopper never leaves the store's own cart and session.\",\n settings: [\n { id: 'title', type: 'text', label: 'Title', required: true },\n { id: 'subtitle', type: 'text', label: 'Subtitle', help: 'One line under the title. Optional.' },\n { id: 'eyebrow', type: 'text', label: 'Eyebrow', help: 'Small caps label above the title.' },\n { id: 'cta', type: 'text', label: 'Button text', default: 'Ver a coleção' },\n {\n id: 'href',\n type: 'url',\n label: 'Button target',\n help: \"Defaults to the catalog filtered by this page's collection — which is the point of the block. Override only to send the shopper somewhere else.\",\n },\n {\n id: 'collection',\n type: 'text',\n label: 'Collection tag',\n help: \"Matched against each product's `metadata.collection`. Defaults to this page's own slug.\",\n },\n { id: 'background', type: 'color', label: 'Background', help: \"Empty uses the page theme's primary colour.\" },\n ],\n presets: [\n {\n name: 'Collection CTA',\n props: { title: 'Leve a coleção inteira', subtitle: 'Todas as peças, em um lugar só.', cta: 'Ver a coleção' },\n },\n ],\n enabledOn: ['home', 'collection', 'content'],\n} satisfies Omit<RegistryMeta, 'propsSchema'>\n","import React, { useState } from 'react'\nimport { getLucideIcon } from '@fayz-ai/ui/icons'\nimport type { RegistryMeta } from '@fayz-ai/core'\nimport { bannerPlaceholder } from '../../blocks/sections'\nimport { Reveal } from '../../lib/motion'\nimport { Link } from '../../app/router'\nimport { TID } from '../../lib/testids'\nimport { SmoothImage } from '../SmoothImage'\n\nfunction Icon({ name, className }: { name: string; className?: string }) {\n const C = getLucideIcon(name)\n return C ? <C className={className} /> : null\n}\n\nexport interface BenefitItem {\n /** Lucide icon name in PascalCase. Ignored when `image` is set. */\n icon?: string\n /** Drawn/brand artwork instead of an icon glyph — the reason compactor forked\n * this block: their four benefit marks are illustrations, and swapping them\n * for outline glyphs would have quietly changed the brand. */\n image?: string\n title: string\n text?: string\n}\n\n// Array props default to empty throughout this file. A block inserted from the\n// editor arrives before its content does, and `items.slice()` on undefined\n// throws — taking down the whole page, not just the section.\nexport function BenefitsRow({\n items = [],\n layout = 'grid',\n}: {\n items?: BenefitItem[]\n layout?: 'grid' | 'strip'\n}) {\n if (items.length === 0) return null\n\n const mark = (item: BenefitItem) =>\n item.image ? (\n <img src={item.image} alt=\"\" loading=\"lazy\" className=\"h-6 w-auto shrink-0\" />\n ) : (\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 )\n\n if (layout === 'strip') {\n // Scrolls horizontally under ~640px rather than wrapping into cramped\n // rows — a strip is a glance, not a reading task (compactor's layout).\n return (\n <section data-testid={TID.benefits} className=\"border-y bg-card\">\n <ul className=\"mx-auto flex max-w-7xl snap-x gap-6 overflow-x-auto px-4 py-4 sm:gap-8 sm:px-6 md:justify-center md:overflow-visible\">\n {items.map((item) => (\n <li key={item.title} className=\"flex shrink-0 snap-start items-center gap-3\">\n {mark(item)}\n <div className=\"min-w-0\">\n <p className=\"whitespace-nowrap text-sm font-semibold leading-tight\">{item.title}</p>\n {item.text && (\n <p className=\"whitespace-nowrap text-xs leading-tight text-muted-foreground\">{item.text}</p>\n )}\n </div>\n </li>\n ))}\n </ul>\n </section>\n )\n }\n\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 {mark(item)}\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 const benefitsBlockMeta = {\n label: 'Benefits row',\n description: 'Compact row of trust badges — shipping, payment, guarantees.',\n settings: [\n {\n id: 'items',\n type: 'list',\n label: 'Benefits',\n help: 'Three reads best (the grid renders at most four); the strip layout scrolls and renders all.',\n required: true,\n of: [\n {\n id: 'icon',\n type: 'text',\n label: 'Icon',\n help: 'Lucide icon name in PascalCase, e.g. Truck, ShieldCheck, CreditCard, RotateCcw, Leaf. An unknown name simply renders no icon.',\n },\n {\n id: 'image',\n type: 'image',\n label: 'Icon image',\n help: 'Brand artwork instead of an icon glyph — wins over the icon name when set.',\n },\n { id: 'title', type: 'text', label: 'Title', help: 'The promise itself, e.g. \"Frete grátis acima de R$ 199\".', required: true },\n { id: 'text', type: 'text', label: 'Detail', help: 'One short qualifying line under the title.' },\n ],\n },\n {\n id: 'layout',\n type: 'select',\n label: 'Layout',\n default: 'grid',\n help: 'Grid centres up to four; strip is a single horizontally-scrolling line, right under a hero.',\n options: [\n { value: 'grid', label: 'Grid' },\n { value: 'strip', label: 'Strip' },\n ],\n },\n ],\n presets: [\n {\n name: 'Benefits row',\n props: {\n items: [\n { icon: 'Truck', title: 'Frete para todo o Brasil', text: 'Envio em até 48h' },\n { icon: 'CreditCard', title: 'Parcele em até 10x', text: 'Ou 5% off no PIX' },\n { icon: 'ShieldCheck', title: 'Compra segura', text: 'Seus dados protegidos' },\n ],\n },\n },\n ],\n // Reassurance is welcome on every surface, and it is small enough to repeat.\n enabledOn: ['home', 'catalog', 'product', 'collection', 'content'],\n} satisfies Omit<RegistryMeta, 'propsSchema'>\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 const bannerBlockMeta = {\n label: 'Promo banner',\n description: 'Wide image banner with centred copy and a single call to action.',\n settings: [\n { id: 'eyebrow', type: 'text', label: 'Eyebrow', help: 'Small uppercase label above the title, e.g. \"oferta da semana\".' },\n { id: 'title', type: 'text', label: 'Title', help: 'Also used as the image alt text.', required: true },\n { id: 'subtitle', type: 'text', label: 'Subtitle' },\n { id: 'cta', type: 'text', label: 'Button label', help: 'Leave empty to render no button.' },\n { id: 'href', type: 'url', label: 'Button link', help: 'Defaults to /catalog.' },\n {\n id: 'image',\n type: 'image',\n label: 'Background image',\n help: 'Optional — a gradient generated from the hue below is used when empty.',\n },\n {\n id: 'hue',\n type: 'number',\n label: 'Placeholder hue',\n help: 'Colour of the generated gradient, 0–360. Ignored once an image is set.',\n min: 0,\n max: 360,\n default: 160,\n },\n ],\n presets: [\n {\n name: 'Promo banner',\n props: {\n eyebrow: 'oferta da semana',\n title: 'Até 25% off na seleção',\n subtitle: 'Peças escolhidas a dedo, estoque limitado.',\n cta: 'Conferir',\n href: '/catalog',\n hue: 340,\n },\n },\n ],\n // A merchandising interruption between sections — it competes with the buy box\n // on a product page.\n enabledOn: ['home', 'catalog', 'collection', 'content'],\n} satisfies Omit<RegistryMeta, 'propsSchema'>\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 const manifestoBlockMeta = {\n label: 'Manifesto',\n description: 'Centred brand statement — a paragraph of voice between two commercial sections.',\n settings: [\n { id: 'title', type: 'text', label: 'Title', help: 'Optional heading above the statement, e.g. \"Nossa história\".' },\n {\n id: 'text',\n type: 'richtext',\n label: 'Statement',\n help: 'Two or three sentences about what the brand stands for. Rendered large and centred, so keep it under ~40 words.',\n required: true,\n },\n ],\n presets: [\n {\n name: 'Manifesto',\n props: {\n title: 'Nossa história',\n text: 'Acreditamos em fazer pouco e fazer bem: ingredientes honestos, produção em pequena escala e cuidado em cada detalhe — do primeiro esboço à caixa que chega na sua casa.',\n },\n },\n ],\n // Brand voice: belongs where someone is still deciding, not on the buy page.\n enabledOn: ['home', 'collection', 'content'],\n} satisfies Omit<RegistryMeta, 'propsSchema'>\n\nexport function Testimonials({\n title,\n items = [],\n}: {\n title?: string\n items?: Array<{ quote: string; author: string }>\n}) {\n if (items.length === 0) return null\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 const testimonialsBlockMeta = {\n label: 'Testimonials',\n description: 'Three customer quotes as cards, with a five-star mark.',\n settings: [\n { id: 'title', type: 'text', label: 'Title', help: 'Optional heading above the cards, e.g. \"O que dizem sobre nós\".' },\n {\n id: 'items',\n type: 'list',\n label: 'Quotes',\n help: 'Three fill the grid; only the first three are rendered.',\n required: true,\n of: [\n {\n id: 'quote',\n type: 'text',\n label: 'Quote',\n help: 'One or two sentences, no surrounding quotation marks — the block adds them.',\n required: true,\n },\n { id: 'author', type: 'text', label: 'Author', help: 'Name as it should appear, e.g. \"Mariana C.\".', required: true },\n ],\n },\n ],\n presets: [\n {\n name: 'Testimonials',\n props: {\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 },\n ],\n // Social proof helps most where the decision happens, including the product page.\n enabledOn: ['home', 'catalog', 'product', 'collection', 'content'],\n} satisfies Omit<RegistryMeta, 'propsSchema'>\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\nexport const newsletterBlockMeta = {\n label: 'Newsletter band',\n description: 'Full-width e-mail capture band in the primary colour.',\n settings: [\n {\n id: 'title',\n type: 'text',\n label: 'Title',\n help: 'Falls back to \"Receba nossas novidades\" when empty.',\n default: 'Receba nossas novidades',\n },\n {\n id: 'subtitle',\n type: 'text',\n label: 'Subtitle',\n help: 'One line on what subscribers actually get — omit it and only the title shows.',\n },\n ],\n presets: [\n {\n name: 'Newsletter band',\n props: {\n title: 'Receba nossas novidades',\n subtitle: 'Lançamentos, histórias e cupons — direto no seu e-mail.',\n },\n },\n ],\n // A closing band: no layout demands and useful at the bottom of any page.\n enabledOn: ['home', 'catalog', 'product', 'collection', 'content'],\n} satisfies Omit<RegistryMeta, 'propsSchema'>\n","import React from 'react'\nimport type { RegistryMeta } from '@fayz-ai/core'\nimport { CatalogPage } from '../../views/CatalogPage'\nimport { ProductDetailPage } from '../../views/ProductDetailPage'\nimport { useStorefrontPage } from '../../views/StorefrontPage'\n\n// ---------------------------------------------------------------------------\n// The native page bodies, as blocks.\n//\n// This is the whole point of Fase 2: `catalogBody` and `productBody` are what a\n// store composes AROUND. Before this, adding a banner above the catalog grid\n// meant reimplementing the catalog page and permanently forfeiting SDK updates\n// to it. Now the grid is a block in a list, and the SDK keeps maintaining it.\n//\n// Shopify calls this section `main` and requires it in every template; VTEX\n// ships `product-details` for the same reason. Neither lets a theme add\n// something above the fold by taking ownership of the fold.\n//\n// Neither block takes settings. That is a real answer, not an omission: the\n// catalog's behaviour is driven by the catalog store (filters, sort, search, all\n// URL-synced) and the product's by the route slug. A setting here would be a\n// second, competing source of truth for state the page already owns.\n// ---------------------------------------------------------------------------\n\nexport function CatalogBodyBlock() {\n return <CatalogPage />\n}\n\nexport const catalogBodyBlockMeta = {\n label: 'Product list',\n description:\n 'The catalog page itself — filters, sort and the product grid. Place blocks before or after it to frame the list without owning it.',\n settings: [],\n presets: [{ name: 'Product list' }],\n enabledOn: ['catalog'],\n // The catalog's INITIAL read (default sort, no filters), declared so the\n // page resolver answers it before the grid asks. Interactive refinements\n // (search, category, sort changes) are runtime state, fetched by the page\n // through the same loader as they happen — moving those into declarations\n // is the M9 rewire.\n data: { products: { loader: 'products.list', params: { sort: 'newest' } } },\n} satisfies Omit<RegistryMeta, 'propsSchema'>\n\nexport function ProductBodyBlock() {\n // The slug comes from the route, through page context — not from a prop the\n // store would have to thread through every block above this one.\n const { params } = useStorefrontPage()\n return <ProductDetailPage slug={params.slug ?? ''} />\n}\n\nexport const productBodyBlockMeta = {\n label: 'Product detail',\n description:\n 'The product page itself — gallery, price, options and the buy button. Place blocks before or after it to add store-specific content around the buying decision.',\n settings: [],\n presets: [{ name: 'Product detail' }],\n enabledOn: ['product'],\n // The product read, bound to the route: the resolver answers it and\n // `useProduct(slug)` inside the page consumes the same key, so the page\n // renders from one fetch. Related products / everything else the detail\n // page reads stays internal until the M9 rewire.\n data: { product: { loader: 'products.bySlug', params: { slug: { $param: 'slug' } } } },\n} satisfies Omit<RegistryMeta, 'propsSchema'>\n","import { defineBlock } from '@fayz-ai/core'\nimport type { BlockNode } from '@fayz-ai/core'\nimport type { StorefrontSection } from './sections'\nimport { registerStorefrontLoaders } from '../data/loaders'\nimport { HeroSection, heroBlockMeta } from '../components/marketing/HeroSection'\nimport { CategoryShowcase, categoriesBlockMeta } from '../components/collection/CategoryShowcase'\nimport { ProductRail, productsBlockMeta } from '../components/product/ProductRail'\nimport { MediaCarousel, mediaCarouselBlockMeta } from '../components/marketing/MediaCarousel'\nimport { ProductSlider, productSliderBlockMeta } from '../components/product/ProductSlider'\nimport {\n CatalogBodyBlock,\n catalogBodyBlockMeta,\n ProductBodyBlock,\n productBodyBlockMeta,\n} from '../components/layout/PageBodyBlocks'\nimport { FormBlock, formBlockMeta } from '../components/marketing/FormBlock'\nimport { EntityListBlock, entityListBlockMeta } from '../components/marketing/EntityList'\nimport {\n SealsBand,\n sealsBlockMeta,\n StoryQuote,\n storyQuoteBlockMeta,\n ImageTiles,\n imageTilesBlockMeta,\n FaqSection,\n faqBlockMeta,\n} from '../components/marketing/EditorialSections'\nimport {\n StepsSection,\n stepsBlockMeta,\n CountdownBand,\n countdownBlockMeta,\n TierCards,\n tiersBlockMeta,\n} from '../components/marketing/ConversionSections'\nimport {\n CollectionHero,\n collectionHeroBlockMeta,\n ProductSpotlight,\n productSpotlightBlockMeta,\n MotifStrip,\n motifStripBlockMeta,\n CollectionCta,\n collectionCtaBlockMeta,\n} from '../components/marketing/CollectionSections'\nimport {\n BenefitsRow,\n benefitsBlockMeta,\n PromoBanner,\n bannerBlockMeta,\n ManifestoBlock,\n manifestoBlockMeta,\n Testimonials,\n testimonialsBlockMeta,\n NewsletterBand,\n newsletterBlockMeta,\n} from '../components/marketing/MiscSections'\nimport { ExperimentBlock, experimentBlockMeta, ExperimentVariantBlock, experimentVariantBlockMeta } from '../experiments/react'\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 // The SDK blocks declare data needs against the SDK loaders, so the two\n // registries are one registration surface: wherever blocks exist, the\n // loaders their needs name exist too (I2 would report them otherwise).\n registerStorefrontLoaders()\n // Each block's schema lives WITH its component (`<name>BlockMeta`), not here.\n // Colocation is what keeps the two from drifting: a prop added to the section\n // and a setting describing it are then one file apart, not two directories.\n defineBlock('hero', HeroSection, { source: 'sdk', ...heroBlockMeta })\n defineBlock('mediaCarousel', MediaCarousel, { source: 'sdk', ...mediaCarouselBlockMeta })\n defineBlock('categories', CategoryShowcase, { source: 'sdk', ...categoriesBlockMeta })\n defineBlock('products', ProductRail, { source: 'sdk', ...productsBlockMeta })\n defineBlock('productSlider', ProductSlider, { source: 'sdk', ...productSliderBlockMeta })\n defineBlock('benefits', BenefitsRow, { source: 'sdk', ...benefitsBlockMeta })\n defineBlock('banner', PromoBanner, { source: 'sdk', ...bannerBlockMeta })\n defineBlock('manifesto', ManifestoBlock, { source: 'sdk', ...manifestoBlockMeta })\n defineBlock('testimonials', Testimonials, { source: 'sdk', ...testimonialsBlockMeta })\n defineBlock('newsletter', NewsletterBand, { source: 'sdk', ...newsletterBlockMeta })\n defineBlock('form', FormBlock, { source: 'sdk', ...formBlockMeta })\n // The generic block over declared entities (M4): one block, any defineEntity\n // kind, reading through entity.list — never a per-entity component fork.\n defineBlock('entityList', EntityListBlock, { source: 'sdk', ...entityListBlockMeta })\n // Blocks promoted from the fleet (M2): each existed as an app-local block in\n // one store; the mechanism is now shared and the branding stayed behind.\n defineBlock('seals', SealsBand, { source: 'sdk', ...sealsBlockMeta })\n defineBlock('storyQuote', StoryQuote, { source: 'sdk', ...storyQuoteBlockMeta })\n defineBlock('imageTiles', ImageTiles, { source: 'sdk', ...imageTilesBlockMeta })\n defineBlock('faq', FaqSection, { source: 'sdk', ...faqBlockMeta })\n defineBlock('steps', StepsSection, { source: 'sdk', ...stepsBlockMeta })\n defineBlock('countdown', CountdownBand, { source: 'sdk', ...countdownBlockMeta })\n defineBlock('tiers', TierCards, { source: 'sdk', ...tiersBlockMeta })\n // The anatomy of a campaign page. A collection is a `pages.content` entry\n // with a theme overlay, so these are ordinary blocks on an ordinary page —\n // not a second page system with its own route.\n defineBlock('collectionHero', CollectionHero, { source: 'sdk', ...collectionHeroBlockMeta })\n defineBlock('productSpotlight', ProductSpotlight, { source: 'sdk', ...productSpotlightBlockMeta })\n defineBlock('motifStrip', MotifStrip, { source: 'sdk', ...motifStripBlockMeta })\n defineBlock('collectionCta', CollectionCta, { source: 'sdk', ...collectionCtaBlockMeta })\n // The native page bodies. A store composes AROUND these rather than replacing\n // the page they live on — see page-blocks.ts.\n defineBlock('catalogBody', CatalogBodyBlock, { source: 'sdk', ...catalogBodyBlockMeta })\n defineBlock('productBody', ProductBodyBlock, { source: 'sdk', ...productBodyBlockMeta })\n // A/B tests in the document: an `experiment` shows one of its\n // `experimentVariant` children per visitor (docs/storefront/EXPERIMENTS.md).\n defineBlock('experiment', ExperimentBlock, { source: 'sdk', ...experimentBlockMeta })\n defineBlock('experimentVariant', ExperimentVariantBlock, { source: 'sdk', ...experimentVariantBlockMeta })\n}\n\n// Registration happens in initStorefrontRuntime (both the scaffold and\n// createStorefront call it) so importing this module stays side-effect-free.\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 { getShopProvider } from '@fayz-ai/shop/runtime'\nimport { setShopCarrierQuotesResolver } from '@fayz-ai/sdk/shop'\nimport type { PublicDeliveryPolicy, ShippingSettings, StoreSettings } from '@fayz-ai/shop/types'\nimport { StorefrontConfigProvider, useStorefrontConfig, type ResolvedStorefrontConfig } from './config'\nimport { normalizeLanguage } from '../locales/messages'\nimport { useBuyerCountry } from '../hooks/use-buyer-country'\nimport { marketForCountry, useMarketStore } from '../stores/market.store'\nimport { useCartStore } from '../stores/cart.store'\n\n// ---------------------------------------------------------------------------\n// The merchant's policy, arriving at the shopper's browser\n// ---------------------------------------------------------------------------\n// A storefront's config is CODE: `createStorefrontApp({ payments: { methods:\n// [...] } })`, evaluated at build time. That made every commercial decision in\n// the store the property of whoever last deployed it — a merchant could not\n// change what the checkout offered, and the settings screens in the admin wrote\n// to nothing anybody read.\n//\n// This closes that loop from the other end. plg_shop_settings is read ONCE at\n// boot through shop_store_settings() (anon, published-only) and overlaid on the\n// resolved config, so every component that already reads `config.payments\n// .methods` or `config.currency` starts obeying the merchant with no change of\n// its own.\n//\n// OVERLAY, not replace, and that asymmetry is the whole compatibility story:\n// only a field the merchant actually DECIDED wins. `undefined` — which is what\n// every column is until a settings screen is saved — leaves the app's own\n// declaration standing. Eight live storefronts share this pool and none of them\n// may change behaviour on the day this ships.\n\n/**\n * Merge a store's saved policy over its declared config.\n *\n * Pure and exported for its own sake: this is the function that decides what a\n * shopper is offered, and it should be testable without a provider, a network or\n * a React tree.\n */\nexport function applyStoreSettings(\n config: ResolvedStorefrontConfig,\n settings: StoreSettings | null | undefined,\n): ResolvedStorefrontConfig {\n if (!settings) return config\n\n const next: ResolvedStorefrontConfig = { ...config, policy: settings }\n\n if (settings.currency) next.currency = settings.currency\n if (settings.locale) next.locale = settings.locale\n\n // An EMPTY list is not a decision to offer nothing — the column treats\n // empty as undecided (see the 0045 header), and the provider maps it to\n // `undefined`, so this branch only ever sees a real choice. Belt and braces:\n // a storefront offering zero payment methods is a checkout nobody can\n // complete, and it must not be reachable through a config merge.\n if (settings.paymentMethods?.length) {\n next.payments = { ...config.payments, methods: settings.paymentMethods }\n }\n\n if (settings.discountsEnabled !== undefined) {\n next.features = { ...config.features, discounts: settings.discountsEnabled }\n }\n\n // Requiring an account is the storefront's side of the server rule: the 0045\n // trigger refuses a guest order outright, so a checkout that still offered\n // guest purchase would collect a whole form and then fail at the last click.\n if (settings.guestCheckout === false) {\n next.features = { ...next.features, accounts: true }\n }\n\n return next\n}\n\n/**\n * The store's saved base freight over the declared one. shop_place_order\n * charges from plg_shop_shipping_settings (via shop_shipping_for), so a config\n * number that disagrees shows the shopper a total the order will not charge.\n */\nexport function applyShippingSettings(\n config: ResolvedStorefrontConfig,\n shipping: ShippingSettings | null | undefined,\n): ResolvedStorefrontConfig {\n if (!shipping) return config\n return { ...config, shipping: { flatRate: shipping.flatRate, freeAbove: shipping.freeAbove ?? undefined } }\n}\n\n/**\n * The store's Delivery settings over a delivery storefront (shop 0130): the\n * minimum order and the time it promises. A store in any other mode, or one that\n * set neither, is left exactly as declared.\n */\nexport function applyDeliveryPolicy(\n config: ResolvedStorefrontConfig,\n policy: PublicDeliveryPolicy | null | undefined,\n): ResolvedStorefrontConfig {\n if (!policy || !config.delivery) return config\n return {\n ...config,\n delivery: {\n ...config.delivery,\n ...(policy.etaMinutes ? { etaMinutes: policy.etaMinutes } : {}),\n ...(policy.minOrderTotal ? { minOrderTotal: policy.minOrderTotal } : {}),\n ...(policy.paused ? { paused: true } : {}),\n },\n }\n}\n\n/**\n * Boot-time read of the store's policy, wrapped around the config provider.\n *\n * Renders the DECLARED config immediately and re-renders with the merchant's\n * policy when it lands. Deliberately not a blocking await: a storefront must\n * paint its catalogue without waiting on a settings round trip, and the fields\n * this can change (currency symbol, which payment chips the checkout shows) are\n * not on the first-paint path of the home page.\n *\n * A provider without `getPublicStoreSettings`, an unpublished store, or a failed\n * request all resolve to the same thing: the declared config, unchanged. There\n * is no error state, because there is nothing for a shopper to do about it.\n */\n/**\n * What the host knows about this visitor, per request: the language its own\n * routing chose and the country its CDN saw. Both optional; both fall back to\n * the store's config. Pass them only where the page is not shared across\n * visitors (or is cached per language), or one visitor's answer is served to all.\n */\nexport interface StorefrontBuyerContext {\n language?: string\n country?: string\n}\n\nfunction applyBuyer(config: ResolvedStorefrontConfig, buyer?: StorefrontBuyerContext): ResolvedStorefrontConfig {\n if (!buyer) return config\n const language = normalizeLanguage(buyer.language) ?? config.language\n const hint = buyer.country?.trim().toUpperCase()\n const countryHint = hint && config.countries.includes(hint) ? hint : config.countryHint\n if (language === config.language && countryHint === config.countryHint) return config\n return { ...config, language, countryHint }\n}\n\nexport function StorefrontConfigHost({\n config,\n buyer,\n children,\n}: {\n config: ResolvedStorefrontConfig\n buyer?: StorefrontBuyerContext\n children: React.ReactNode\n}) {\n const [policy, setPolicy] = React.useState<StoreSettings | null>(null)\n const [shipping, setShipping] = React.useState<ShippingSettings | null>(null)\n const [delivery, setDelivery] = React.useState<PublicDeliveryPolicy | null>(null)\n\n React.useEffect(() => {\n let cancelled = false\n let provider\n try {\n provider = config.provider ?? getShopProvider()\n } catch {\n return // no runtime initialized (SSR/prerender)\n }\n if (typeof provider.getShippingSettings === 'function') {\n void provider\n .getShippingSettings()\n .then((saved) => { if (!cancelled) setShipping(saved) })\n .catch(() => { /* declared shipping stands */ })\n }\n if (config.delivery && typeof provider.getPublicDeliveryPolicy === 'function') {\n void provider\n .getPublicDeliveryPolicy()\n .then((saved) => { if (!cancelled) setDelivery(saved) })\n .catch(() => { /* declared delivery stands */ })\n }\n if (typeof provider.getPublicStoreSettings !== 'function') return\n void provider\n .getPublicStoreSettings()\n .then((settings) => {\n if (cancelled) return\n setPolicy(settings)\n // A cotação roda DENTRO de uma chamada de rede, longe de qualquer\n // render, então ela não lê contexto — recebe a política por um\n // resolvedor, como o carrinho. Sem esta linha, \"eu mesmo calculo o\n // frete\" era uma opção que o lojista marcava e o checkout ignorava.\n setShopCarrierQuotesResolver(() => settings?.carrierQuotes)\n })\n .catch(() => { /* declared config stands */ })\n // Markets (0116). A store without them (or a pool without 0116) answers\n // none, and every price stays exactly as it was.\n if (typeof provider.listMarkets === 'function') {\n void provider\n .listMarkets()\n .then((markets) => { if (!cancelled) useMarketStore.getState().setMarkets(markets) })\n .catch(() => {})\n }\n return () => { cancelled = true }\n }, [config])\n\n const resolved = React.useMemo(\n () => applyBuyer(applyDeliveryPolicy(applyShippingSettings(applyStoreSettings(config, policy), shipping), delivery), buyer),\n [config, policy, shipping, delivery, buyer?.language, buyer?.country],\n )\n\n return (\n <StorefrontConfigProvider value={resolved}>\n <MarketScope>{children}</MarketScope>\n </StorefrontConfigProvider>\n )\n}\n\n/**\n * The buyer's market, applied: the country picks it (ships there, else the\n * default), and its currency, money locale, flat shipping and acquirer replace\n * the store's for everything below — so every price formatted with\n * `config.currency` is already in the market's money. Its price list is loaded\n * once per market, and the cart is repriced whenever the market changes.\n */\nfunction MarketScope({ children }: { children: React.ReactNode }) {\n const base = useStorefrontConfig()\n const { country } = useBuyerCountry()\n const markets = useMarketStore((s) => s.markets)\n const market = markets.length ? marketForCountry(markets, country) : null\n const prices = useMarketStore((s) => (market ? s.prices[market.code] : undefined))\n\n React.useEffect(() => {\n useMarketStore.getState().setActive(market)\n if (!market || market.isDefault || prices) return\n let provider\n try {\n provider = base.provider ?? getShopProvider()\n } catch {\n return\n }\n void provider.getMarketPrices?.(market.code)\n .then((list) => useMarketStore.getState().setPrices(market.code, list))\n .catch(() => {})\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [market?.code, prices])\n\n // Lines added in another market are in another currency.\n React.useEffect(() => {\n if (!market || (!market.isDefault && !prices)) return\n useCartStore.getState().repriceForMarket()\n }, [market?.code, prices])\n\n const value = React.useMemo(() => {\n if (!market) return base\n return {\n ...base,\n market,\n currency: market.currency,\n locale: market.locale || base.locale,\n shipping: market.isDefault\n ? base.shipping\n : { flatRate: market.shippingFlatRate, freeAbove: market.shippingFreeAbove ?? undefined },\n policy: market.paymentProvider ? { ...base.policy, paymentProvider: market.paymentProvider } : base.policy,\n }\n }, [base, market])\n\n return <StorefrontConfigProvider value={value}>{children}</StorefrontConfigProvider>\n}\n","import React, { useEffect } from 'react'\n\n// ---------------------------------------------------------------------------\n// StorefrontTheme — the storefront counterpart of SaasTheme.\n// Personalizes colors (HSL token triplets), typography (Google Fonts pairing),\n// radius and layout properties via CSS custom properties, so every @fayz-ai/ui\n// token class (bg-background, text-primary, ...) picks the brand up for free.\n//\n// Derived from the Nuvemshop template research (docs/archive/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 /**\n * Brand token scales — the schema'd half of the token surface (spine M2).\n * Each map is emitted as namespaced CSS custom properties, so blocks and\n * store CSS consume the brand's rhythm instead of hardcoding magic numbers:\n *\n * spacing `--sf-space-<key>` e.g. { sm: '8px', md: '16px', lg: '32px' }\n * typeScale `--sf-text-<key>` e.g. { body: '1rem', h2: 'clamp(24px,3vw,34px)' }\n * breakpoints `--sf-breakpoint-<key>` e.g. { md: '768px', lg: '1080px' } — CSS\n * custom properties cannot drive media queries; these document the\n * grid for JS consumers and generated styles.\n * motion `--sf-motion-<key>` e.g. { fast: '150ms', reveal: 'cubic-bezier(0.22,1,0.36,1)' }\n *\n * Keys are validated (slug-like) and values must be strings; the free-form\n * escape hatch stays `tokens` below.\n */\n spacing?: Record<string, string>\n typeScale?: Record<string, string>\n breakpoints?: Record<string, string>\n motion?: Record<string, string>\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\n/** The schema'd scale fields and the CSS custom-property prefix each emits. */\nexport const THEME_SCALE_VAR_PREFIX = {\n spacing: '--sf-space',\n typeScale: '--sf-text',\n breakpoints: '--sf-breakpoint',\n motion: '--sf-motion',\n} as const\n\nexport type ThemeScaleField = keyof typeof THEME_SCALE_VAR_PREFIX\n\nexport const THEME_SCALE_FIELDS = Object.keys(THEME_SCALE_VAR_PREFIX) as readonly ThemeScaleField[]\n\nexport interface ThemeCssOptions {\n /** CSS selector the custom properties are emitted under. Defaults to `:root`.\n * A page-scoped theme (a campaign page) passes something like\n * `[data-page=\"verao\"]` so its palette does not leak to the shell. */\n selector?: string\n}\n\nexport function themeToCss(theme: StorefrontTheme, options: ThemeCssOptions = {}): string {\n const selector = options.selector ?? ':root'\n const scoped = selector !== ':root'\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 // Schema'd brand scales → namespaced custom properties.\n for (const [field, prefix] of Object.entries(THEME_SCALE_VAR_PREFIX) as [ThemeScaleField, string][]) {\n for (const [key, value] of Object.entries(theme[field] ?? {})) {\n lines.push(`${prefix}-${key}: ${value};`)\n }\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 // Scoped themes hang their rules off the wrapper element instead of `body`,\n // and prefix every descendant rule, so the page's palette and type stay\n // inside it. `:root` keeps the original global emission verbatim.\n const root = scoped ? selector : 'body'\n const at = (sel: string) => (scoped ? `${selector} ${sel}` : sel)\n\n let css = `${selector} {\\n ${lines.join('\\n ')}\\n}\\n`\n css += `${root} { font-family: var(--font-family); }\\n`\n css += `${['h1', 'h2', 'h3', 'h4', '.sf-heading'].map(at).join(', ')} { font-family: var(--sf-font-heading, var(--font-family)); }\\n`\n if (theme.uppercaseButtons) {\n css += `${at('.sf-cta')} { text-transform: uppercase; letter-spacing: 0.08em; }\\n`\n }\n if (theme.header?.uppercaseNav) {\n css += `${at('.sf-nav-link')} { text-transform: uppercase; letter-spacing: 0.06em; font-size: 0.8rem; }\\n`\n }\n return css\n}\n\n/** The Google Fonts stylesheet for a theme, or null when it names none. Exported for tests. */\nexport function 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 // `googleFonts: []` is how a store that self-hosts its fonts says \"none\":\n // an empty family list must not become a request for no fonts.\n if (!unique.length) return null\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\n * for the store theme; a page-scoped theme mounts another instance with its\n * own `selector`. */\nexport function StorefrontThemeStyle({\n theme,\n selector,\n}: {\n theme: StorefrontTheme\n /** Emit under this selector instead of `:root`. See `themeToCss`. */\n selector?: string\n}) {\n const fontsHref = googleFontsHref(theme)\n // A scoped theme gets its own <link>: sharing the shell's id would have the\n // campaign page's font set replace the store's for the whole document, and\n // unmounting it would leave the store with no fonts at all.\n const linkId = selector ? `sf-theme-fonts-${slugifyToken(selector)}` : 'sf-theme-fonts'\n\n useEffect(() => {\n if (!fontsHref) return\n let link = document.getElementById(linkId) as HTMLLinkElement | null\n if (!link) {\n link = document.createElement('link')\n link.id = linkId\n link.rel = 'stylesheet'\n document.head.appendChild(link)\n }\n link.href = fontsHref\n // Only a scoped theme cleans up — the store theme's fonts live as long as\n // the app does, and removing them on a re-render would flash unstyled text.\n if (!selector) return\n return () => {\n document.getElementById(linkId)?.remove()\n }\n }, [fontsHref, linkId, selector])\n\n return React.createElement(\n 'style',\n { 'data-sf-theme': theme.name },\n themeToCss(theme, { selector }),\n )\n}\n\nfunction slugifyToken(value: string): string {\n return value.replace(/[^a-zA-Z0-9]+/g, '-').replace(/^-|-$/g, '').toLowerCase()\n}\n","import { useMarketProduct } from '../../hooks/use-market-product'\nimport React, { useEffect, useMemo, useRef, useState } from 'react'\nimport { Search, X } from 'lucide-react'\nimport type { Product } from '@fayz-ai/shop/types'\nimport { useStorefrontConfig } from '../../document/config'\nimport { useProducts } from '../../hooks/use-products'\nimport { useCatalogStore } from '../../stores/catalog.store'\nimport { navigateTo } from '../../app/router'\nimport { Price } from '../Price'\nimport { PaymentTerms } from '../PaymentTerms'\nimport { SmoothImage } from '../SmoothImage'\nimport { TID } from '../../lib/testids'\n\n/**\n * Search as a focused moment: the page dims, the field takes the caret, and a\n * few real products answer under it. The shopper either recognises what they\n * wanted — one click to the PDP — or commits to the full result page.\n *\n * The suggestion list is deliberately short. It exists to confirm the store\n * *has* the thing, not to be a second catalogue.\n */\nexport function SearchOverlay({ onClose }: { onClose: () => void }) {\n const config = useStorefrontConfig()\n const { search: searchConfig } = config\n const setCatalogSearch = useCatalogStore((s) => s.setSearch)\n const [term, setTerm] = useState('')\n const inputRef = useRef<HTMLInputElement>(null)\n\n useEffect(() => {\n inputRef.current?.focus()\n // The page behind must not scroll under the overlay.\n const previous = document.body.style.overflow\n document.body.style.overflow = 'hidden'\n return () => {\n document.body.style.overflow = previous\n }\n }, [])\n\n // Debounced so a fast typist fires one query, not one per keystroke.\n const [query, setQuery] = useState('')\n useEffect(() => {\n const id = setTimeout(() => setQuery(term.trim()), 220)\n return () => clearTimeout(id)\n }, [term])\n\n const active = query.length >= searchConfig.minChars\n const { products, loading } = useProducts(\n active ? { status: 'active', search: query, limit: searchConfig.suggestionsLimit } : { status: 'active', limit: 0 },\n )\n const suggestions = useMemo(\n () => (active ? products.slice(0, searchConfig.suggestionsLimit) : []),\n [active, products, searchConfig.suggestionsLimit],\n )\n\n const submit = (value: string) => {\n const q = value.trim()\n if (!q) return\n // Seed the store too, so the results page paints filtered on first frame\n // instead of flashing the whole catalogue and then narrowing.\n setCatalogSearch(q)\n navigateTo(`${searchConfig.resultsPath}?q=${encodeURIComponent(q)}`)\n onClose()\n }\n\n return (\n <div\n data-testid={TID.searchOverlay}\n className=\"fixed inset-0 z-[60] flex flex-col\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Buscar produtos\"\n >\n <button\n type=\"button\"\n aria-label=\"Fechar busca\"\n data-testid={TID.searchOverlayClose}\n onClick={onClose}\n className=\"absolute inset-0 cursor-default bg-black/50 backdrop-blur-[2px]\"\n />\n\n <div className=\"relative w-full border-b bg-background shadow-xl\">\n <div className=\"mx-auto flex max-w-5xl items-center gap-3 px-4 py-4 sm:px-6\">\n <Search className=\"h-5 w-5 shrink-0 opacity-60\" aria-hidden />\n <input\n ref={inputRef}\n data-testid={TID.searchOverlayInput}\n type=\"search\"\n value={term}\n placeholder={searchConfig.placeholder}\n onChange={(e) => setTerm(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Escape') onClose()\n if (e.key === 'Enter') submit(term)\n }}\n className=\"min-w-0 flex-1 bg-transparent text-base outline-none placeholder:opacity-50\"\n />\n <button\n type=\"button\"\n aria-label=\"Fechar busca\"\n onClick={onClose}\n className=\"rounded-full p-2 transition-opacity hover:opacity-60\"\n >\n <X className=\"h-5 w-5\" aria-hidden />\n </button>\n </div>\n\n {active && (\n <div className=\"mx-auto max-w-5xl px-4 pb-4 sm:px-6\">\n {loading && suggestions.length === 0 ? (\n <div className=\"grid gap-4 pb-2 sm:grid-cols-2 lg:grid-cols-4\">\n {Array.from({ length: Math.min(searchConfig.suggestionsLimit, 4) }).map((_, i) => (\n <div key={i} className=\"h-40 animate-pulse rounded-xl bg-muted\" />\n ))}\n </div>\n ) : suggestions.length === 0 ? (\n <p className=\"py-6 text-center text-sm text-muted-foreground\">\n {searchConfig.emptyLabel} “{query}”.\n </p>\n ) : (\n <>\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n {suggestions.map((product) =>\n searchConfig.renderSuggestion ? (\n <React.Fragment key={product.id}>\n {searchConfig.renderSuggestion(product)}\n </React.Fragment>\n ) : (\n <SuggestionCard key={product.id} product={product} onNavigate={onClose} />\n ),\n )}\n </div>\n <button\n type=\"button\"\n data-testid={TID.searchOverlayCta}\n onClick={() => submit(term)}\n className=\"mt-4 w-full rounded-lg bg-primary py-3 text-sm font-semibold text-primary-foreground transition-opacity hover:opacity-90\"\n >\n {searchConfig.ctaLabel}\n </button>\n </>\n )}\n </div>\n )}\n </div>\n </div>\n )\n}\n\nfunction SuggestionCard({ product: catalogProduct, onNavigate }: { product: Product; onNavigate: () => void }) {\n const product = useMarketProduct(catalogProduct)\n const image = product.images.find((i) => i.isPrimary) ?? product.images[0]\n return (\n <button\n type=\"button\"\n data-testid={TID.searchSuggestion}\n data-slug={product.slug}\n onClick={() => {\n navigateTo(`/product/${product.slug}`)\n onNavigate()\n }}\n className=\"group flex flex-col rounded-xl border bg-card p-3 text-left transition-shadow hover:shadow-md\"\n >\n <div className=\"mb-3 aspect-square w-full overflow-hidden rounded-lg bg-muted\">\n {image && (\n <SmoothImage\n src={image.url}\n alt={image.altText ?? product.name}\n className=\"h-full w-full object-contain transition-transform duration-300 group-hover:scale-105\"\n />\n )}\n </div>\n <p className=\"line-clamp-2 text-sm font-medium\">{product.name}</p>\n <div className=\"mt-2 sf-price\">\n <Price value={product.price} compareAt={product.compareAtPrice ?? undefined} />\n <PaymentTerms price={product.price} metadata={product.metadata} variant=\"card\" />\n </div>\n </button>\n )\n}\n","import React, { useState } from 'react'\nimport type { StorefrontRouteChrome } from '../../document/config'\nimport { CreditCard, LogOut, Mail, Menu, Package, Phone, Search, ShoppingBag, User, UserCircle, X } from 'lucide-react'\nimport { signOutCustomer } from '../../data/auth'\nimport { useCartStore, selectCount } from '../../stores/cart.store'\nimport { useCatalogStore } from '../../stores/catalog.store'\nimport { useSessionStore } from '../../stores/session.store'\nimport { useCategories } from '../../hooks/use-categories'\nimport { useStorefrontConfig } from '../../document/config'\nimport { useScrolled, usePopOnChange } from '../../lib/motion'\nimport { Link, navigateTo, useHashPath } from '../../app/router'\nimport { SearchOverlay } from './SearchOverlay'\nimport { TID } from '../../lib/testids'\nimport { Slot } from '../../extend/slots'\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 const [overlay, setOverlay] = useState(false)\n\n // Overlay mode: the field is only ever a trigger. Rendering it as a real\n // input too would put two carets on the page once the overlay opens.\n if (config.search.mode === 'overlay') {\n return (\n <>\n {iconOnly ? (\n <button\n type=\"button\"\n aria-label=\"Buscar produtos\"\n data-testid={TID.headerSearchToggle}\n onClick={() => setOverlay(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 <button\n type=\"button\"\n data-testid={TID.headerSearchToggle}\n onClick={() => setOverlay(true)}\n className={`relative flex items-center gap-2 border px-3 py-2 text-left text-sm opacity-80 transition-opacity hover:opacity-100 ${className ?? ''}`}\n style={{\n borderRadius: 'var(--sf-radius-input)',\n borderColor: 'hsl(var(--sf-header-fg, var(--foreground)) / 0.25)',\n }}\n >\n <Search className=\"h-4 w-4 shrink-0 opacity-60\" aria-hidden />\n <span className=\"truncate\">{search || config.search.placeholder}</span>\n </button>\n )}\n {overlay && <SearchOverlay onClose={() => setOverlay(false)} />}\n </>\n )\n }\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={config.search.placeholder}\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({ onMenuClick }: { onMenuClick?: () => void }) {\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 accountRef = React.useRef<HTMLDivElement>(null)\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\n // `pointerdown`, not `click`: a menu item that navigates unmounts the target\n // before the click bubbles, so the listener would never run.\n React.useEffect(() => {\n if (!accountOpen) return\n const onPointerDown = (event: PointerEvent) => {\n if (!accountRef.current?.contains(event.target as Node)) setAccountOpen(false)\n }\n const onKey = (event: KeyboardEvent) => {\n if (event.key === 'Escape') setAccountOpen(false)\n }\n document.addEventListener('pointerdown', onPointerDown)\n document.addEventListener('keydown', onKey)\n return () => {\n document.removeEventListener('pointerdown', onPointerDown)\n document.removeEventListener('keydown', onKey)\n }\n }, [accountOpen])\n\n return (\n <nav className=\"flex items-center gap-1\">\n <Slot area=\"header\" name=\"beforeActions\" />\n {config.features.accounts && (\n <div ref={accountRef} 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\" onClick={() => setAccountOpen(false)}>\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 {onMenuClick && (\n <button\n type=\"button\"\n aria-label=\"Abrir menu\"\n onClick={onMenuClick}\n className=\"relative rounded-full p-2.5 transition-opacity hover:opacity-70 md:hidden\"\n >\n <Menu className=\"h-5 w-5\" />\n </button>\n )}\n <Slot area=\"header\" name=\"afterActions\" />\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\nfunction MobileMenuDrawer({ open, onClose }: { open: boolean; onClose: () => void }) {\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 onClose()\n }\n\n // a11y: close on Escape\n React.useEffect(() => {\n if (!open) return\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose()\n }\n document.addEventListener('keydown', onKey)\n return () => document.removeEventListener('keydown', onKey)\n }, [open, onClose])\n\n if (!open) return null\n\n return (\n <div className=\"fixed inset-0 z-50 md:hidden\">\n <div\n className=\"absolute inset-0 animate-fade-in bg-black/40\"\n aria-hidden\n onClick={onClose}\n />\n <div\n data-testid=\"mobile-menu-drawer\"\n role=\"dialog\"\n aria-label=\"Menu Principal\"\n className=\"absolute right-0 top-0 flex h-full w-full max-w-[280px] 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\">Menu</h2>\n <button\n type=\"button\"\n aria-label=\"Fechar menu\"\n onClick={onClose}\n className=\"rounded-full p-1.5 hover:bg-muted\"\n >\n <X className=\"h-5 w-5\" />\n </button>\n </div>\n <div className=\"flex-1 overflow-y-auto p-5\">\n <nav className=\"flex flex-col gap-4\">\n {config.nav.map((link) => (\n <Link\n key={link.to}\n to={link.to}\n onClick={onClose}\n className=\"text-base font-semibold transition-opacity hover:opacity-70\"\n >\n {link.label}\n </Link>\n ))}\n {showCategories && categories.length > 0 && (\n <>\n <div className=\"my-2 border-t\" />\n <div className=\"mb-2 text-xs font-bold uppercase tracking-wider text-muted-foreground\">\n Categorias\n </div>\n {categories.map((c) => (\n <button\n key={c.id}\n type=\"button\"\n onClick={() => goCategory(c.id)}\n className=\"text-left text-sm font-medium transition-opacity hover:opacity-80\"\n >\n {c.name}\n </button>\n ))}\n </>\n )}\n </nav>\n </div>\n </div>\n </div>\n )\n}\n\nexport function StorefrontHeader({ chrome }: { chrome?: StorefrontRouteChrome } = {}) {\n const config = useStorefrontConfig()\n // 'minimal' (0094): o cardápio JÁ é a tarefa, e cinco links de marketing no\n // topo são cinco saídas competindo com ela. A navegação não some — recolhe\n // para o menu, que é o que a regra de navegação persistente pede e o que todo\n // app de pedido faz. Marca, busca e carrinho ficam: são as três coisas que um\n // cardápio precisa ter à mão.\n const compact = chrome === 'minimal'\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 [mobileMenuOpen, setMobileMenuOpen] = useState(false)\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 {/* A barra de utilidades some no compacto: telefone e redes sociais são\n conteúdo institucional, e num cardápio eles roubam a primeira dobra de\n quem veio pedir. */}\n {!compact && <UtilityBar />}\n\n {compact ? (\n // O cabeçalho de um app de pedido: marca, busca, carrinho — e o resto da\n // navegação atrás do menu, alcançável e fora do caminho.\n <div className=\"mx-auto flex h-14 max-w-7xl items-center gap-3 px-4 sm:px-6\">\n <button\n type=\"button\"\n aria-label=\"Abrir menu\"\n aria-expanded={mobileMenuOpen}\n onClick={() => setMobileMenuOpen((v) => !v)}\n className=\"-ml-2 grid h-11 w-11 shrink-0 place-items-center rounded-full\"\n >\n <Menu className=\"h-5 w-5\" />\n </button>\n <div className=\"min-w-0 flex-1 truncate\">{logo}</div>\n {showSearch && <SearchInput iconOnly className=\"shrink-0\" />}\n <HeaderActions />\n </div>\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 // NavLinks is hidden below md in the primary row (no room for it there) —\n // below md a hamburger opens MobileMenuDrawer instead, otherwise mobile\n // has no way to reach nav/category links at all.\n <>\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 onMenuClick={() => setMobileMenuOpen(true)} />\n </div>\n </div>\n <MobileMenuDrawer open={mobileMenuOpen} onClose={() => setMobileMenuOpen(false)} />\n </>\n )}\n <Slot area=\"header\" name=\"belowNav\" />\n </header>\n )\n}\n","import React from 'react'\nimport { useStorefrontConfig } from '../../document/config'\nimport { useCategories } from '../../hooks/use-categories'\nimport { useCatalogStore } from '../../stores/catalog.store'\nimport { Link, navigateTo } from '../../app/router'\nimport { Slot } from '../../extend/slots'\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 <Slot area=\"footer\" name=\"before\" />\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 <Slot area=\"footer\" name=\"after\" />\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 React, { useEffect, useState } from 'react'\nimport { X, Trash2 } from 'lucide-react'\nimport {\n useCartStore,\n selectSubtotal,\n selectDiscountTotal,\n selectShipping,\n selectRequiresShipping,\n selectTotal,\n} from '../../stores/cart.store'\nimport { useDiscountValidator } from '../../hooks/use-discount-validator'\nimport { toast } from '../../stores/toast.store'\nimport { getStorefrontComponents, useStorefrontConfig } from '../../document/config'\nimport { navigateTo } from '../../app/router'\nimport { formatMoney } from '../../lib/format'\nimport { QuantityInput } from './QuantityInput'\nimport { formatPostalCode } from '@fayz-ai/core'\nimport { useT } from '../../locales'\nimport { useDeliveryStore } from '../../stores/delivery.store'\nimport { DeliveryEstimator } from '../checkout/DeliveryEstimator'\nimport { TID } from '../../lib/testids'\nimport { SmoothImage } from '../SmoothImage'\nimport { Slot } from '../../extend/slots'\nimport { overrideComponent, overrideProps } from '../../extend/component-override'\nimport { getCartLineAnnotations, type CartLineAnnotation } from '../../extend/extension-points'\nimport type { CartLine } from '../../stores/cart.store'\n\n/** Annotations contributed through the cart.lineAnnotation extension point\n * (spine M7) — rendered under the line's options label. */\nfunction CartLineAnnotations({ line }: { line: CartLine }) {\n const [annotations, setAnnotations] = useState<CartLineAnnotation[]>([])\n useEffect(() => {\n let cancelled = false\n getCartLineAnnotations(line).then((next) => {\n if (!cancelled && next.length > 0) setAnnotations(next)\n })\n return () => {\n cancelled = true\n }\n }, [line.lineId ?? line.productId, line.quantity])\n if (annotations.length === 0) return null\n return (\n <>\n {annotations.map((annotation) => (\n <span key={annotation.key} data-line-annotation={annotation.key} className=\"text-xs text-muted-foreground\">\n {annotation.label}\n </span>\n ))}\n </>\n )\n}\n\nexport function CartDrawer() {\n const config = useStorefrontConfig()\n const cart = useCartStore()\n const components = getStorefrontComponents(config)\n // No SDK default exists for this one, so a props-only override has nothing to\n // adjust — it is component-or-nothing.\n const FooterExtra = overrideComponent(components.CartDrawerFooterExtra)\n const footerExtraProps = overrideProps(components.CartDrawerFooterExtra)\n const validate = useDiscountValidator()\n const t = useT()\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 const cartSlotContext = { lines: cart.lines, subtotal }\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, { freeShipping: result.freeShipping })\n setCode('')\n // A free_shipping coupon discounts 0% of the subtotal — saying \"0% de\n // desconto\" would read as a coupon that did nothing.\n const effect = result.freeShipping ? t('discount.freeShipping') : t('discount.percentOff', { percent: result.percent })\n toast.success(t('discount.appliedToast'), `${applied} • ${effect}`)\n } else {\n setDiscountError(result.message ?? t('discount.invalid'))\n toast.error(t('discount.invalidToast'), result.message ?? t('discount.checkCode'))\n }\n } catch (err) {\n // Sem este catch o cupom falhava EM SILÊNCIO: a validação estourava (era\n // 401 na tabela de cupons), nada era mostrado e o botão voltava ao\n // normal. O comprador clicava e não acontecia nada.\n setDiscountError(t('discount.cannotValidate'))\n toast.error(t('discount.cannotValidateToast'), t('discount.tryLater'))\n console.warn('[cart] falha ao validar cupom', err)\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 // The delivery's minimum (shop 0130). The server refuses below it anyway;\n // saying so here keeps the buyer from filling a whole checkout to hear no.\n const minOrder = config.delivery?.minOrderTotal ?? 0\n const belowMinimum = minOrder > 0 && subtotal < minOrder\n // The house paused its delivery (shop 0131); the server refuses too.\n const paused = Boolean(config.delivery?.paused)\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 {/* One column at every width. The desktop 2-column variant was removed:\n it split the cart into two panels and pushed the items away from the\n total. */}\n <div\n data-testid={TID.cartDrawer}\n role=\"dialog\"\n aria-label={t('cart.title')}\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\">{t('cart.title')}</h2>\n <button\n type=\"button\"\n aria-label={t('cart.close')}\n onClick={cart.closeDrawer}\n className=\"grid min-h-11 min-w-11 place-items-center rounded-full p-1.5 hover:bg-muted sm:min-h-0 sm:min-w-0\"\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 {t('cart.empty')}\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 {config.language === 'pt-BR' ? (\n missingForFree > 0 ? (\n <>Faltam <strong>{money(missingForFree)}</strong> para frete grátis 🚚</>\n ) : (\n <>🎉 Você ganhou <strong>frete grátis</strong>!</>\n )\n ) : missingForFree > 0 ? (\n (() => {\n const [before, after] = t('cart.missingForFree').split('{{amount}}')\n return <>{before}<strong>{money(missingForFree)}</strong>{after}</>\n })()\n ) : (\n <strong>{t('cart.wonFree')}</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\n data-testid={TID.cartLinesList}\n // `min-h-0` não é enfeite: um item flex tem `min-height: auto`\n // por padrão e se recusa a encolher abaixo do próprio conteúdo,\n // então sem isto a lista empurra o rodapé para fora da tela em vez\n // de rolar. É o mesmo motivo do commit que \"devolveu o scroll da\n // lista\" — e ele volta a acontecer toda vez que a regra é esquecida.\n className=\"min-h-0 flex-1 space-y-4 overflow-y-auto py-4 pl-5 pr-6\"\n style={{ scrollbarGutter: 'stable' }}\n >\n <Slot area=\"cart\" name=\"beforeLines\" context={cartSlotContext} />\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\" variant={{ width: 80 }} />\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={t('cart.remove', { name: line.name })}\n onClick={() => cart.removeItem(line.lineId ?? line.productId)}\n className=\"-m-1.5 grid min-h-11 min-w-11 place-items-center p-1.5 text-muted-foreground hover:text-destructive sm:min-h-0 sm:min-w-0\"\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 {/* A observação do item (0094), de volta para quem escreveu.\n Pedir \"sem cebola\" e nunca mais mostrar o recado é pedir\n confiança sem dar como conferir — e sem como corrigir. */}\n {line.notes && (\n <span className=\"text-xs italic text-muted-foreground\">“{line.notes}”</span>\n )}\n <CartLineAnnotations line={line} />\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\n data-testid={TID.cartFooter}\n // Rola por dentro e nunca passa de 55% da altura. O rodapé cresce\n // com o que a loja liga — cupom, zona de entrega, linhas de total —\n // e sem teto ele empurrava o \"Finalizar compra\" para fora da tela\n // numa altura de celular curta, sem nada para rolar. Quem some é a\n // informação, nunca o botão.\n className=\"max-h-[55%] shrink-0 space-y-3 overflow-y-auto border-t px-5 py-4\"\n >\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={t('discount.placeholder')}\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 {t('discount.apply')}\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 <Slot area=\"cart\" name=\"beforeSummary\" context={cartSlotContext} />\n\n {/* Second chance to give a CEP for anyone who added to cart from\n the catalogue and never opened a product page. Absent when\n nothing in the cart travels: asking a buyer of downloads for a\n postcode is asking for an answer nobody uses. */}\n {selectRequiresShipping(cart) && (\n <div className=\"mb-3\">\n <DeliveryEstimator compact />\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\">{t('summary.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 {t('summary.discount')}{' '}\n <button\n type=\"button\"\n onClick={cart.clearDiscount}\n className=\"inline-block py-1 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={cart.discountFreeShipping ? 'text-emerald-700' : 'text-muted-foreground'}>\n {t('summary.shipping')}\n {delivery.status === 'served' && delivery.postalCode && (\n <span className=\"ml-1 text-xs\">\n · {formatPostalCode(delivery.postalCode, delivery.country)}\n </span>\n )}\n {cart.discountFreeShipping && (\n <button\n type=\"button\"\n onClick={cart.clearDiscount}\n className=\"ml-1 py-1 text-xs text-muted-foreground underline\"\n >\n ({cart.discountCode} ✕)\n </button>\n )}\n </dt>\n <dd data-testid={TID.cartShipping} data-price={shipping.toFixed(2)}>\n {shipping === 0 ? t('summary.free') : money(shipping)}\n </dd>\n </div>\n <div className=\"flex justify-between border-t pt-2 text-base font-semibold\">\n <dt>{t('summary.total')}</dt>\n <dd data-testid={TID.cartTotal} data-price={total.toFixed(2)}>{money(total)}</dd>\n </div>\n </dl>\n\n {paused && (\n <p data-testid=\"cart-delivery-paused\" className=\"mb-2 text-sm text-amber-700\">\n {t('cart.deliveryPaused')}\n </p>\n )}\n {!paused && belowMinimum && (\n <p data-testid=\"cart-minimum-order\" className=\"mb-2 text-sm text-amber-700\">\n {t('cart.minimumOrder', { amount: money(minOrder), missing: money(minOrder - subtotal) })}\n </p>\n )}\n <button\n type=\"button\"\n data-testid={TID.goCheckout}\n disabled={belowMinimum || paused}\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 disabled:pointer-events-none disabled:opacity-50\"\n style={{ borderRadius: 'var(--sf-radius-button)' }}\n >\n {t('cart.checkout')}\n </button>\n\n <Slot area=\"cart\" name=\"afterSummary\" context={cartSlotContext} />\n\n {FooterExtra && (\n <FooterExtra cart={cart} config={config} commerceMode={config.commerceMode} {...footerExtraProps} />\n )}\n </div>\n </>\n )}\n </div>\n </div>\n )\n}\n","import React from 'react'\nimport { useStorefrontConfig } from '../document/config'\nimport { useStorefrontHead } from '../hooks/use-storefront-head'\nimport type { StorefrontContentPageConfig } from '../blocks/page-blocks'\nimport { mergePageTheme, pageThemeSelector } from '../blocks/page-blocks'\nimport { StorefrontThemeStyle } from '../lib/theme'\nimport { StorefrontPage } from './StorefrontPage'\n\n// ---------------------------------------------------------------------------\n// An editorial page: title in the head, blocks on the page, store chrome\n// around it — and nothing else. The commerce pages assume a body block\n// (catalogBody/productBody); a content page deliberately assumes nothing, so\n// \"biography\", \"philosophy\" or \"press\" is a document entry instead of a\n// hand-written custom route.\n//\n// A page may also carry its own palette (`page.theme`), which is what turns\n// this into the campaign/collection page too. The overlay is emitted scoped to\n// the wrapper's `data-page`, so nothing it declares reaches the shell.\n// ---------------------------------------------------------------------------\n\nfunction titleFromSlug(slug: string): string {\n return slug\n .split('-')\n .filter(Boolean)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(' ')\n}\n\nexport interface ContentPageProps {\n slug: string\n page: StorefrontContentPageConfig\n /** Params matched from the page's path pattern (`/categoria/:slug`). They\n * win over the page's own slug, so a pattern's `:slug` means the URL's. */\n params?: Record<string, string>\n}\n\nexport function ContentPage({ slug, page, params }: ContentPageProps) {\n const config = useStorefrontConfig()\n const title = page.title ?? titleFromSlug(slug)\n useStorefrontHead({ title: `${title} — ${config.name}` })\n\n const theme = page.theme ? mergePageTheme(config.theme, page.theme) : undefined\n const body = <StorefrontPage kind=\"content\" page={page} params={{ slug, ...params }} />\n if (!theme) return body\n\n return (\n <div data-page={slug} data-testid=\"content-page-themed\">\n <StorefrontThemeStyle theme={theme} selector={pageThemeSelector(slug)} />\n {body}\n </div>\n )\n}\n","import { create } from 'zustand'\nimport { getShopProvider } from '@fayz-ai/shop/runtime'\nimport type { FulfillmentType, ServiceStatus } from '@fayz-ai/shop/types'\n\n/**\n * A loja está aberta agora? (0094)\n *\n * NÃO é persistido, e essa é a decisão central deste arquivo. \"Aberta\" tem\n * validade de minutos: um estado restaurado do localStorage abriria uma loja\n * fechada só porque o comprador deixou a aba aberta desde ontem — e, pior,\n * seria editável pelo devtools. É perguntado ao servidor e reperguntado quando\n * a janela atual termina.\n *\n * Nada aqui autoriza um pedido. O que esta store pinta na tela é cortesia — o\n * bloqueio de verdade é o trigger da 0094, no banco, que recusa o INSERT venha\n * ele de onde vier. Se algum dia as duas discordarem, quem manda é o banco.\n */\n\nexport type ServiceStoreStatus = 'idle' | 'loading' | 'ready'\n\nexport interface ServiceState {\n status: ServiceStoreStatus\n /** null = ainda não perguntamos, ou a loja não implementa (base pré-0094). */\n service: ServiceStatus | null\n fulfillmentType: FulfillmentType\n refresh: (fulfillmentType?: FulfillmentType) => Promise<void>\n}\n\n/**\n * A pergunta que a tela realmente faz.\n *\n * Uma loja que não declarou horário responde `configured: false`, e aqui isso\n * lê como ABERTA — o comportamento anterior à 0094, e o único seguro para as\n * outras vitrines do pool. `null` (provider sem o método, base sem a migration)\n * é o mesmo caso e recebe a mesma resposta.\n */\nexport function selectIsOpen(state: ServiceState): boolean {\n if (!state.service) return true\n if (!state.service.configured) return true\n return state.service.open\n}\n\n/** Devemos desenhar selo de horário? Só quando a loja declarou um. */\nexport function selectShowsHours(state: ServiceState): boolean {\n return Boolean(state.service?.configured)\n}\n\nexport const useServiceStore = create<ServiceState>()((set, get) => ({\n status: 'idle',\n service: null,\n fulfillmentType: 'delivery',\n\n async refresh(fulfillmentType) {\n const type = fulfillmentType ?? get().fulfillmentType\n set({ status: 'loading', fulfillmentType: type })\n try {\n const shop = getShopProvider()\n // Método OPCIONAL: uma loja cuja base não recebeu a 0094 não o tem, e a\n // ausência é a resposta \"sempre aberta\". Não é erro e não vira toast.\n const service = (await shop?.getServiceStatus?.(type)) ?? null\n set({ service, status: 'ready' })\n } catch {\n // Falhar fechada seria pior que o problema: uma consulta que não voltou\n // não é prova de que a loja fechou, e trancar a compra por causa dela\n // custa o pedido. Segue como \"não sabemos\", que lê como aberta.\n set({ service: null, status: 'ready' })\n }\n },\n}))\n","/**\n * Um instante no fuso da LOJA, não no de quem olha.\n *\n * Sem isto, um comprador em Lisboa lê \"abre às 13:00\" para uma loja que abre\n * às 09:00 no Rio — o horário está certo e a frase está errada, que é o pior\n * tipo de bug porque ninguém desconfia dele.\n *\n * Vive num módulo só porque três telas fazem a mesma conta (capa, portão de\n * loja fechada, agendamento). Duas cópias disso divergem no dia em que uma\n * ganhar o dia da semana e a outra não.\n */\nexport function storeTime(\n iso: string,\n timeZone: string,\n options: { weekday?: boolean } = {},\n): string {\n return new Intl.DateTimeFormat('pt-BR', {\n ...(options.weekday ? { weekday: 'short' as const } : {}),\n hour: '2-digit',\n minute: '2-digit',\n timeZone,\n }).format(new Date(iso))\n}\n","/**\n * The delivery estimate as a shopper reads it (shop 0130/0131). A promise of a\n * day is «até 24 h», not «~1440 min»:\n *\n * under an hour → { approx: true, text: '45 min' }\n * under a day → { approx: true, text: '1 h 30 min' }\n * a day or more → { approx: false, text: '24 h' } (whole hours, rounded up)\n *\n * The database says the same in the customer message (shop_eta_phrase).\n */\nexport function etaParts(minutes: number): { approx: boolean; text: string } | null {\n if (!Number.isFinite(minutes) || minutes <= 0) return null\n const m = Math.round(minutes)\n if (m < 60) return { approx: true, text: `${m} min` }\n if (m < 1440) {\n const h = Math.floor(m / 60)\n const rest = m % 60\n return { approx: true, text: rest ? `${h} h ${rest} min` : `${h} h` }\n }\n return { approx: false, text: `${Math.ceil(m / 60)} h` }\n}\n","import React from 'react'\nimport type { FulfillmentType } from '@fayz-ai/shop/types'\nimport { useStorefrontConfig } from '../../document/config'\nimport { useDeliveryStore } from '../../stores/delivery.store'\nimport { useServiceStore, selectIsOpen, selectShowsHours } from '../../stores/service.store'\nimport { storeTime } from './store-time'\nimport { TID } from '../../lib/testids'\nimport { useT } from '../../locales'\nimport { etaParts } from '../../lib/eta'\nimport { UserRound } from 'lucide-react'\nimport { useSessionStore } from '../../stores/session.store'\nimport { useExperimentValue } from '../../experiments/react'\n\n/**\n * A capa: quem é a loja, se está aberta, e como o pedido chega.\n *\n * As três perguntas na ordem em que se pergunta, e todas ACIMA do primeiro\n * item. É o padrão que os cinco produtos medidos compartilham\n * (`docs/artorius/delivery-reference/patterns/`), e não é estética: o modo de\n * entrega muda o preço e o prazo de tudo que vem depois. Perguntar embaixo é\n * deixar a pessoa montar o carrinho com números que ainda vão mudar.\n *\n * O estado fica INLINE com o nome — \"● Aberto até 22:40\" — e não atrás de um\n * modal. O horário de fechar é parte do estado: \"aberto\" às 22:35 e \"aberto\"\n * às 14:00 são informações diferentes para quem vai pedir.\n *\n * Fundo escuro fixo, e não um token de tema: existe uma foto atrás, e um texto\n * que troca de cor com o tema fica ilegível em metade das capas. Sem foto, a\n * mesma faixa escura — o cabeçalho nunca depende de haver imagem.\n */\n// React 19 knows `fetchPriority`; React 18 warns on it and only passes the\n// lowercase attribute through.\nconst COVER_PRIORITY = (React.version.startsWith('18.') ? { fetchpriority: 'high' } : { fetchPriority: 'high' }) as Record<string, string>\n\nexport function StoreCover({ onShowHours, onOpenAccount, children }: {\n /** Drawn last inside the cover — the menu's `menu.coverOverlay` slot. */\n children?: React.ReactNode\n onShowHours?: () => void\n /** The account drawer (AccountDrawer). Absent, no account button is drawn. */\n onOpenAccount?: () => void\n}) {\n const sessionName = useSessionStore((s) => s.name || s.email)\n const config = useStorefrontConfig()\n const t = useT()\n const cover = config.delivery?.coverImage\n const logo = config.delivery?.logoImage\n const locality = config.delivery?.locality\n // 'compact' is a band, not a poster: on a phone the first dishes have to be\n // on the first screen. Measured on Artorius' paid traffic (2026-11-04): the\n // median ad visitor scrolled 0% and left after 24 s, having seen only the\n // banner, the header and the cover.\n const size = useExperimentValue(config.delivery?.coverSize) ?? 'full'\n const compact = size === 'compact'\n\n const modes = config.delivery?.fulfillmentModes ?? ['delivery']\n const type = useDeliveryStore((s) => s.fulfillmentType)\n const etaInfo = type !== 'pickup' && config.delivery?.etaMinutes ? etaParts(config.delivery.etaMinutes) : null\n const etaText = etaInfo ? t(etaInfo.approx ? 'delivery.eta' : 'delivery.etaUpTo', { duration: etaInfo.text }) : ''\n const setFulfillmentType = useDeliveryStore((s) => s.setFulfillmentType)\n const refreshService = useServiceStore((s) => s.refresh)\n\n const service = useServiceStore()\n const showsHours = selectShowsHours(service)\n const open = selectIsOpen(service)\n\n // Trocar de modo repergunta o horário: a 0094 guarda janelas POR\n // fulfillment_type, então uma loja pode entregar até 23h e só deixar retirar\n // até 22h. Um estado herdado do outro modo seria uma promessa errada.\n function choose(next: FulfillmentType) {\n setFulfillmentType(next)\n void refreshService(next)\n }\n\n return (\n <header\n data-testid={TID.storeCover}\n data-cover-size={size}\n className=\"relative isolate bg-neutral-900 text-white\"\n >\n {cover && (\n <img\n src={cover}\n alt=\"\"\n aria-hidden\n // The cover is the menu's largest paint on a phone (Lighthouse's\n // LCP element). High priority moves it ahead of the fonts and\n // scripts competing for the first round trips; React 19 carries it\n // onto the preload it hoists into <head>.\n {...COVER_PRIORITY}\n className=\"absolute inset-0 -z-10 h-full w-full object-cover\"\n />\n )}\n {/* O véu não é decoração: é o que garante contraste de texto sobre uma\n foto que a lojista escolhe e que ninguém aqui pode medir. */}\n <div\n aria-hidden\n className=\"absolute inset-0 -z-10 bg-gradient-to-b from-black/30 via-black/45 to-black/75\"\n />\n\n <div className={`relative mx-auto w-full max-w-3xl px-4 ${compact ? 'pb-3 pt-3' : 'pb-4 pt-8'}`}>\n {/* The account, where the store Artorius came from put it: top right of\n the cover. The initial when signed in, a person when not. */}\n {onOpenAccount && (\n <button\n type=\"button\"\n onClick={onOpenAccount}\n data-testid=\"store-account\"\n aria-label={sessionName ? 'Sua conta' : 'Entrar ou cadastrar'}\n className=\"absolute right-4 top-3 grid h-10 w-10 place-items-center rounded-full bg-black/40 text-sm font-bold ring-1 ring-white/25 backdrop-blur\"\n >\n {sessionName ? sessionName.slice(0, 1).toUpperCase() : <UserRound className=\"h-5 w-5\" />}\n </button>\n )}\n {/* Sem seta de voltar e sem lupa aqui: a moldura do site continua\n acima com a marca e o carrinho, e a busca DO CARDÁPIO é uma barra\n inteira logo abaixo. Três buscas na mesma tela é o que acontece\n quando cada bloco resolve isso por conta própria. */}\n {/* A sombra no texto, e não só o véu: o véu é uniforme e a foto não é —\n um trecho claro atrás do nome apaga a linha da cidade mesmo com o\n gradiente. A lojista escolhe a capa; a legibilidade não pode\n depender dessa escolha. */}\n <div className=\"flex items-center gap-3 [text-shadow:0_1px_3px_rgb(0_0_0_/_0.7)]\">\n <div className={`grid ${compact ? 'h-11 w-11' : 'h-14 w-14'} shrink-0 place-items-center overflow-hidden rounded-xl bg-white/10 ring-1 ring-white/20`}>\n {logo ? (\n <img src={logo} alt=\"\" aria-hidden className=\"h-full w-full object-cover\" />\n ) : (\n <span className=\"text-xl font-bold\">{config.name.slice(0, 1)}</span>\n )}\n </div>\n <div className=\"min-w-0\">\n <h1 className={`truncate ${compact ? 'text-lg' : 'text-xl'} font-bold leading-tight`}>{config.name}</h1>\n {/* Compact folds the locality and the delivery promise into one\n line: the band is short, and the promise is what a delivery\n visitor came to check. */}\n {compact && !config.delivery?.paused ? (\n locality || etaText ? (\n <p data-testid={etaText ? 'store-eta' : undefined} className=\"truncate text-sm text-white/80\">\n {[locality, etaText].filter(Boolean).join(' · ')}\n </p>\n ) : null\n ) : locality ? (\n <p className=\"truncate text-sm text-white/70\">{locality}</p>\n ) : null}\n {/* The store's own promise (Configurações › Delivery, shop 0130). */}\n {/* The top bar's «Delivery» switch, off (shop 0131): said first,\n because it is the one thing that decides whether to go on. */}\n {compact && !config.delivery?.paused ? null : config.delivery?.paused ? (\n <p data-testid=\"store-delivery-paused\" className=\"mt-0.5 inline-flex items-center gap-1.5 truncate text-sm font-semibold text-amber-300\">\n <span className=\"h-2 w-2 shrink-0 rounded-full bg-amber-400\" aria-hidden />\n {t('delivery.paused')}\n </p>\n ) : (() => {\n const eta = type !== 'pickup' && config.delivery?.etaMinutes ? etaParts(config.delivery.etaMinutes) : null\n return eta ? (\n <p data-testid=\"store-eta\" className=\"truncate text-sm text-white/80\">\n {t(eta.approx ? 'delivery.eta' : 'delivery.etaUpTo', { duration: eta.text })}\n </p>\n ) : null\n })()}\n {/* Nada quando a loja não declarou horário: `configured: false` é\n \"não sabemos\", e um \"Aberto\" verde para toda a frota seria uma\n afirmação que ninguém fez. */}\n {showsHours && service.service && (\n // O estado é o botão que abre a placa da porta. Um selo que diz\n // \"Fechado\" e não leva a lugar nenhum deixa a pessoa sem a única\n // pergunta seguinte que ela tem: então quando abre?\n <button\n type=\"button\"\n data-testid={TID.serviceStatus}\n data-open={open ? 'true' : 'false'}\n onClick={onShowHours}\n className=\"mt-0.5 flex items-center gap-1.5 text-sm font-semibold underline-offset-2 hover:underline\"\n >\n <span\n aria-hidden\n className={`h-2 w-2 rounded-full ${open ? 'bg-emerald-400' : 'bg-red-400'}`}\n />\n {open ? <OpenUntil /> : <ClosedUntil />}\n </button>\n )}\n </div>\n </div>\n\n {/* Abas e não botões soltos: é um trilho persistente, e a aba ativa é\n a única coisa branca da faixa. Um modo só não é uma escolha — dois\n controles onde não há decisão a tomar é ruído. */}\n {modes.length > 1 && (\n <div className=\"mt-4 flex gap-1\">\n {modes.map((mode) => {\n const active = type === mode\n return (\n <button\n key={mode}\n type=\"button\"\n data-testid={TID.fulfillmentMode(mode)}\n aria-pressed={active}\n onClick={() => choose(mode as FulfillmentType)}\n className={`rounded-full px-5 py-2 text-sm font-semibold transition ${\n active ? 'bg-white text-neutral-900' : 'text-white/80'\n }`}\n >\n {mode === 'pickup' ? 'Retirada' : 'Entrega'}\n </button>\n )\n })}\n </div>\n )}\n </div>\n {children}\n </header>\n )\n}\n\nfunction OpenUntil() {\n const service = useServiceStore((s) => s.service)\n if (!service) return null\n return (\n <span>\n Aberto{service.closesAt ? ` até ${storeTime(service.closesAt, service.timezone)}` : ''}\n </span>\n )\n}\n\nfunction ClosedUntil() {\n const service = useServiceStore((s) => s.service)\n if (!service) return null\n return (\n <span>\n Fechado\n {service.nextOpenAt ? ` • abre ${storeTime(service.nextOpenAt, service.timezone, { weekday: true })}` : ''}\n </span>\n )\n}\n","import React from 'react'\nimport { Bike, ChevronRight, Clock, Store } from 'lucide-react'\nimport { useStorefrontConfig } from '../../document/config'\nimport { resolveOptionRate, useDeliveryStore } from '../../stores/delivery.store'\nimport { selectSubtotal, useCartStore } from '../../stores/cart.store'\nimport { useServiceStore } from '../../stores/service.store'\nimport { formatMoney } from '../../lib/format'\nimport { TID } from '../../lib/testids'\n\n/**\n * Onde entregar, quanto custa, e quando chega — numa linha, tocável.\n *\n * Era a metade de baixo da antiga `FulfillmentBar`. As abas subiram para a\n * capa, onde o padrão medido as coloca, e o que sobrou é o que os cinco\n * produtos desenham igual: ícone, duas linhas, chevron. A linha de cima é o\n * CUSTO e o PRAZO; a de baixo é o ENDEREÇO. Nessa ordem, porque a pergunta que\n * a pessoa está fazendo é \"vale a pena?\", não \"onde eu moro?\".\n *\n * No modo retirada não há endereço a escolher, então a linha para de ser um\n * botão em vez de virar um botão que não faz nada.\n */\nexport function AddressStrip({\n onChangeAddress,\n onSchedule,\n}: {\n onChangeAddress: () => void\n onSchedule?: () => void\n}) {\n const config = useStorefrontConfig()\n const scheduling = config.delivery?.scheduling ?? false\n const timezone = useServiceStore((s) => s.service?.timezone) ?? 'America/Sao_Paulo'\n\n const delivery = useDeliveryStore()\n const type = delivery.fulfillmentType\n const isPickup = type === 'pickup'\n const money = (v: number) => formatMoney(v, config.currency, config.locale)\n const subtotal = selectSubtotal(useCartStore())\n\n // The address survives a reload; its price does not (delivery.store never\n // persists a quote). Without this the strip read «A partir de …» under the\n // buyer's own street until they reopened the sheet. Quoted once per visit,\n // for the address on screen.\n const resolve = useDeliveryStore((s) => s.resolve)\n const quotedOnce = React.useRef(false)\n React.useEffect(() => {\n if (quotedOnce.current || isPickup) return\n if (delivery.status !== 'idle' || delivery.options.length > 0 || !delivery.postalCode) return\n quotedOnce.current = true\n void resolve(delivery.postalCode, subtotal, delivery.country)\n }, [isPickup, delivery.status, delivery.options.length, delivery.postalCode, delivery.country, subtotal, resolve])\n\n const option =\n delivery.options.find((o) => o.zoneId === delivery.selectedZoneId) ?? delivery.options[0]\n\n // O endereço SALVO ganha do resolvido pelo CEP: ele tem o número, e é o\n // número que faz a linha dizer para onde vai em vez de dizer só a rua.\n const chosen = delivery.savedAddresses.find((a) => a.id === delivery.selectedAddressId)\n\n const pickup = config.delivery?.pickupAddress\n\n // \"A partir de R$ 8,00\" e não \"R$ 8,00\": antes do CEP a taxa é a MENOR das\n // zonas, não a taxa desta pessoa. Dizer um número exato aqui é prometer um\n // preço que o quote pode desmentir três telas depois.\n // The rate for THIS cart (free-above re-derived), as the cart will charge it.\n const rate = option ? resolveOptionRate(option, subtotal) : null\n const feeLine = isPickup\n ? 'Sem taxa de entrega'\n : delivery.status === 'loading'\n ? 'Calculando a taxa…'\n : delivery.status === 'unserved'\n ? 'Não entregamos neste endereço'\n : rate != null\n ? rate === 0\n ? 'Entrega grátis'\n : money(rate)\n // A base of zero is «no base» on the server (an address outside every\n // region is refused, not delivered free), so it must not read as a price.\n : config.shipping.flatRate > 0\n ? `A partir de ${money(config.shipping.flatRate)}`\n : 'Taxa conforme o endereço'\n\n // The store's own estimate (Configurações › Delivery) is already on the\n // cover; repeating the region's days here said the same thing twice.\n const etaLine = option?.etaMaxDays != null && !config.delivery?.etaMinutes\n ? ` • até ${option.etaMaxDays} ${option.etaMaxDays === 1 ? 'dia' : 'dias'}`\n : ''\n\n return (\n <div data-testid={TID.addressStrip} className=\"border-b border-border bg-background\">\n <button\n type=\"button\"\n onClick={isPickup ? undefined : onChangeAddress}\n disabled={isPickup}\n className=\"mx-auto flex w-full max-w-3xl items-center gap-3 px-4 py-3 text-left disabled:cursor-default\"\n >\n {isPickup ? (\n <Store className=\"h-6 w-6 shrink-0 text-muted-foreground\" />\n ) : (\n <Bike className=\"h-6 w-6 shrink-0 text-muted-foreground\" />\n )}\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-xs text-muted-foreground\">\n {isPickup ? 'Retirar na loja' : `Entregar em${etaLine} • ${feeLine}`}\n </p>\n <p className=\"truncate text-sm font-semibold\">\n {isPickup\n ? pickup\n ? `${pickup.street}${pickup.number ? `, ${pickup.number}` : ''}`\n : 'Sem taxa de entrega'\n : chosen\n ? `${chosen.street}, ${chosen.number}${\n chosen.label ? ` · ${chosen.label}` : ''\n }`\n : delivery.address\n ? `${delivery.address.street}${\n delivery.address.district ? `, ${delivery.address.district}` : ''\n }`\n : 'Selecionar endereço'}\n </p>\n </div>\n {!isPickup && <ChevronRight className=\"h-5 w-5 shrink-0 text-muted-foreground\" />}\n </button>\n\n {scheduling && onSchedule && (\n <button\n type=\"button\"\n onClick={onSchedule}\n className=\"mx-auto flex w-full max-w-3xl items-center gap-3 border-t border-border px-4 py-2.5 text-left\"\n >\n <Clock className=\"h-5 w-5 shrink-0 text-muted-foreground\" />\n {delivery.scheduledFor ? (\n <span className=\"text-sm font-semibold\">\n Agendado •{' '}\n {new Intl.DateTimeFormat('pt-BR', {\n weekday: 'short',\n day: '2-digit',\n month: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n timeZone: timezone,\n }).format(new Date(delivery.scheduledFor))}\n </span>\n ) : (\n <span className=\"text-sm text-muted-foreground\">Agendar para depois</span>\n )}\n <ChevronRight className=\"ml-auto h-5 w-5 shrink-0 text-muted-foreground\" />\n </button>\n )}\n </div>\n )\n}\n","import React from 'react'\nimport { Search, X } from 'lucide-react'\nimport { TID } from '../../lib/testids'\n\nexport interface MenuSection {\n id: string\n slug: string\n name: string\n}\n\n/**\n * Buscar dentro do cardápio, e pular para uma seção.\n *\n * Duas coisas numa barra só porque respondem à mesma pergunta — \"onde está o\n * que eu quero?\" — e porque separadas elas competiriam pelo mesmo espaço fixo\n * no topo.\n *\n * A busca é DO CARDÁPIO, não do site. A lupa do cabeçalho levava para\n * /catalog, o que num fluxo de delivery é um convite a sair da compra para\n * navegar a loja. Aqui ela filtra as seções no lugar, sem trocar de rota e sem\n * perder o carrinho.\n *\n * Os chips são âncoras e não filtros: rolam até a seção em vez de esconder as\n * outras. Um cardápio se lê rolando — a pessoa quer descobrir que existe\n * sobremesa sem ter decidido antes que quer sobremesa.\n */\nexport function MenuToolbar({\n sections,\n query,\n onQuery,\n autoFocusSearch,\n}: {\n sections: readonly MenuSection[]\n query: string\n onQuery: (q: string) => void\n autoFocusSearch?: boolean\n}) {\n const inputRef = React.useRef<HTMLInputElement>(null)\n const [active, setActive] = React.useState<string | null>(null)\n\n // As seções chegam depois do primeiro render (o loader é assíncrono), e o\n // observer só fala quando uma fronteira é cruzada — sem isto, ninguém acende\n // até a pessoa rolar, e a barra abre com todos os chips apagados.\n React.useEffect(() => {\n setActive((current) =>\n current && sections.some((s) => s.slug === current) ? current : (sections[0]?.slug ?? null),\n )\n }, [sections])\n\n React.useEffect(() => {\n if (autoFocusSearch) inputRef.current?.focus()\n }, [autoFocusSearch])\n\n // Qual seção está sendo lida agora. Um chip que nunca acende deixa a pessoa\n // sem saber onde está numa lista de quarenta itens — e um `scroll` listener\n // faria esse cálculo a cada quadro; o observer só acorda na fronteira.\n React.useEffect(() => {\n if (typeof IntersectionObserver === 'undefined') return\n const seen = new Map<string, boolean>()\n const observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n const slug = entry.target.getAttribute('data-section-slug')\n if (slug) seen.set(slug, entry.isIntersecting)\n }\n const first = sections.find((s) => seen.get(s.slug))\n if (first) setActive(first.slug)\n },\n // A faixa é a parte da tela logo abaixo da barra: uma seção \"ativa\" é a\n // que está sob os olhos, não a que encostou no rodapé.\n { rootMargin: '-140px 0px -65% 0px', threshold: 0 },\n )\n for (const section of sections) {\n const el = document.getElementById(`menu-${section.slug}`)\n if (el) observer.observe(el)\n }\n return () => observer.disconnect()\n }, [sections])\n\n function jumpTo(slug: string) {\n setActive(slug)\n document.getElementById(`menu-${slug}`)?.scrollIntoView({ behavior: 'smooth', block: 'start' })\n }\n\n return (\n <div className=\"sticky top-0 z-30 border-b border-border bg-background/95 backdrop-blur\">\n <div className=\"mx-auto w-full max-w-3xl px-4 py-3\">\n <div className=\"relative\">\n <Search\n aria-hidden\n className=\"pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground\"\n />\n <input\n ref={inputRef}\n // `type=\"text\"` e não `type=\"search\"`: o campo de busca nativo\n // desenha um \"✕\" próprio, azul e não estilizável, ao lado do nosso\n // — dois botões de limpar na mesma caixa, um deles fora do tema.\n type=\"text\"\n inputMode=\"search\"\n autoComplete=\"off\"\n data-testid={TID.menuSearch}\n value={query}\n onChange={(e) => onQuery(e.target.value)}\n placeholder=\"Buscar no cardápio\"\n aria-label=\"Buscar no cardápio\"\n // h-11 e text-base: 16px é o limite abaixo do qual o iOS dá zoom\n // sozinho ao focar um campo, e o zoom desalinha a barra fixa.\n className=\"h-11 w-full rounded-full border border-border bg-muted/40 pl-9 pr-9 text-base\"\n />\n {query && (\n <button\n type=\"button\"\n onClick={() => onQuery('')}\n aria-label=\"Limpar busca\"\n className=\"absolute right-2 top-1/2 grid h-8 w-8 -translate-y-1/2 place-items-center rounded-full\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n )}\n </div>\n </div>\n\n {/* Sem chips durante a busca: os resultados não têm mais a ordem das\n seções, então uma âncora apontaria para uma seção que a busca acabou\n de esconder. */}\n {!query && sections.length > 1 && (\n <nav\n data-testid={TID.menuCategoryNav}\n aria-label=\"Categorias\"\n className=\"mx-auto w-full max-w-3xl overflow-x-auto pb-3 [scrollbar-width:none] [&::-webkit-scrollbar]:hidden\"\n >\n <ul className=\"flex w-max gap-2 px-4\">\n {sections.map((section) => {\n const on = active === section.slug\n return (\n <li key={section.id}>\n <button\n type=\"button\"\n data-testid={TID.menuCategoryLink(section.slug)}\n aria-current={on ? 'true' : undefined}\n onClick={() => jumpTo(section.slug)}\n className={`whitespace-nowrap rounded-full px-4 py-2 text-sm font-medium transition ${\n on\n ? 'bg-foreground text-background'\n : 'border border-border text-muted-foreground'\n }`}\n >\n {section.name}\n </button>\n </li>\n )\n })}\n </ul>\n </nav>\n )}\n </div>\n )\n}\n","import React from 'react'\nimport { Plus } from 'lucide-react'\nimport type { Product } from '@fayz-ai/shop/types'\nimport { useStorefrontConfig } from '../../document/config'\nimport { formatMoney } from '../../lib/format'\nimport { TID } from '../../lib/testids'\nimport { SmoothImage } from '../SmoothImage'\n\n/**\n * Uma linha do cardápio.\n *\n * Linha e não card, e essa é a diferença que faz o modo delivery parecer um\n * app de delivery: num grid, a foto manda e o texto é legenda; numa lista, o\n * NOME manda, a descrição cabe inteira e a foto é miniatura à direita. Quem\n * está com fome lê nomes, não olha fotos — e num telefone cabem seis linhas\n * onde caberiam dois cards.\n *\n * O clique na linha abre a ficha (opções + observação). O \"+\" pula a ficha e\n * adiciona direto, porque a maioria dos itens não tem o que escolher e obrigar\n * dois toques para isso é o atrito que o cardápio existe para não ter.\n */\nexport function MenuItemRow({\n product,\n onOpen,\n onQuickAdd,\n disabled,\n badge,\n accent,\n fromPrice,\n}: {\n product: Product\n onOpen: (product: Product) => void\n /** Ausente quando o item tem opções obrigatórias — aí não há atalho honesto. */\n onQuickAdd?: (product: Product) => void\n disabled?: boolean\n /** \"MAIS PEDIDO\" e afins. Uma etiqueta editorial, não um estado do produto. */\n badge?: string\n /** Barra colorida à esquerda — acompanha o badge, nunca aparece sozinha. */\n accent?: boolean\n /** O preço é o MENOR de várias combinações, então é \"a partir de\". */\n fromPrice?: boolean\n}) {\n const config = useStorefrontConfig()\n const money = (v: number) => formatMoney(v, config.currency, config.locale)\n const image = product.images?.find((i) => i.isPrimary) ?? product.images?.[0]\n const soldOut = product.inventoryCount <= 0\n const onSale = product.compareAtPrice != null && product.compareAtPrice > product.price\n // Arredondado para baixo: prometer -13% e entregar -12,6% é a única direção\n // do erro que o comprador percebe.\n const off = onSale\n ? Math.floor(((product.compareAtPrice! - product.price) / product.compareAtPrice!) * 100)\n : 0\n\n // Esgotado se apaga em vez de sumir: o item continua fazendo parte do\n // cardápio — some hoje e a pessoa acha que a loja nunca teve. Apagar diz as\n // duas coisas de uma vez, \"existe\" e \"hoje não\", e é o que os apps de\n // delivery fazem. O selo fica em contraste cheio, fora deste apagamento.\n const dim = soldOut ? 'opacity-45' : ''\n\n return (\n <li\n data-testid={TID.menuItem(product.slug)}\n className={`relative border-b border-border last:border-b-0 ${\n accent ? 'border-l-[3px] border-l-primary pl-3' : ''\n }`}\n >\n {/* Abrir a ficha é um alvo do TAMANHO DA LINHA, sobreposto ao conteúdo.\n A alternativa — embrulhar texto e foto num <button> — impede colocar\n o \"+\" junto do preço, porque botão dentro de botão é HTML inválido e\n o navegador desmonta a árvore. Aqui o \"+\" fica ACIMA da sobreposição\n (z-20) e é o único ponto da linha que não abre a ficha. */}\n <button\n type=\"button\"\n onClick={() => onOpen(product)}\n aria-label={product.name}\n className=\"absolute inset-0 z-10\"\n />\n\n <div className=\"flex w-full items-start gap-3 py-4 text-left\">\n <div className=\"min-w-0 flex-1\">\n <h3 className={`text-base font-semibold leading-snug ${dim}`}>{product.name}</h3>\n {product.description && (\n // Três linhas: o suficiente para a frase que vende e curto o\n // bastante para a próxima linha caber na tela.\n <p className={`mt-1 line-clamp-3 text-sm text-muted-foreground ${dim}`}>\n {product.description}\n </p>\n )}\n\n <div className=\"mt-2 flex flex-wrap items-center gap-x-2 gap-y-1\">\n <span className={`flex flex-wrap items-baseline gap-x-2 gap-y-1 ${dim}`}>\n {fromPrice && <span className=\"text-xs text-muted-foreground\">A partir de</span>}\n {/* Promoção muda a COR, e não só o peso: o preço riscado ao lado\n já ocupa o lugar onde o olho procura contraste, e dois cinzas\n diferentes não são uma diferença que alguém lê de relance. */}\n <span\n className={\n onSale ? 'font-bold text-emerald-600 dark:text-emerald-400' : 'font-semibold'\n }\n >\n {money(product.price)}\n </span>\n {onSale && (\n <span className=\"text-sm text-muted-foreground line-through\">\n {money(product.compareAtPrice!)}\n </span>\n )}\n {onSale && off >= 5 && (\n // Cor sozinha não conta a promoção — o texto \"-12%\" conta, e é\n // o que um leitor de tela e um olho daltônico recebem.\n <span className=\"rounded bg-emerald-600 px-1.5 py-0.5 text-[11px] font-bold text-white\">\n -{off}%\n </span>\n )}\n </span>\n\n {/* JUNTO DO PREÇO, na coluna do texto. Estava na coluna da foto,\n onde ocupava largura e encolhia a miniatura só nas linhas que o\n tinham — duas linhas vizinhas com fotos de tamanhos diferentes.\n Sem atalho para o esgotado nem para o que precisa de escolha:\n um \"+\" que abre um modal é um \"+\" que mentiu. */}\n {onQuickAdd && !soldOut && (\n <button\n type=\"button\"\n data-testid={TID.menuQuickAdd(product.slug)}\n onClick={() => onQuickAdd(product)}\n disabled={disabled}\n aria-label={`Adicionar ${product.name}`}\n className=\"relative z-20 grid h-8 w-8 shrink-0 place-items-center rounded-full bg-primary text-primary-foreground disabled:opacity-40\"\n >\n <Plus className=\"h-4 w-4\" />\n </button>\n )}\n </div>\n\n {/* FORA do bloco apagado, de propósito: opacidade compõe em cascata\n e um filho não desfaz a do pai. O selo é justamente a explicação\n do apagamento — se apagar junto, a linha fica só fraca, sem dizer\n por quê. */}\n {soldOut && (\n <p className=\"mt-1.5\">\n <span\n data-testid={TID.menuItemSoldOut}\n className=\"rounded bg-muted px-2 py-0.5 text-xs uppercase tracking-wide text-muted-foreground\"\n >\n Indisponível\n </span>\n </p>\n )}\n </div>\n\n {image && (\n <SmoothImage\n src={image.url}\n alt=\"\"\n variant={{ width: 96 }}\n className={`h-24 w-24 shrink-0 rounded-lg object-cover ${\n soldOut ? 'opacity-40 grayscale' : ''\n }`}\n />\n )}\n </div>\n </li>\n )\n}\n","import React from 'react'\nimport { Minus, Plus, X } from 'lucide-react'\nimport type { Product } from '@fayz-ai/shop/types'\nimport { useStorefrontConfig } from '../../document/config'\nimport { formatMoney } from '../../lib/format'\nimport { TID } from '../../lib/testids'\nimport { SmoothImage } from '../SmoothImage'\nimport { getProductOptionGroups, selectionPrice } from '../../data/product-options'\nimport type { ProductOptionGroup, ProductOptionSelection } from '../../data/product-options'\n\nconst NOTES_MAX = 250\n\n/**\n * A ficha do item: escolher, pedir do seu jeito, e adicionar.\n *\n * Folha e não página, de propósito. O comprador está lendo um cardápio; mandá-lo\n * para outra URL e trazê-lo de volta perde o lugar onde ele estava na lista, e\n * numa lista de quarenta itens esse lugar é a coisa mais cara de recuperar.\n *\n * É um CONFIGURADOR e não um formulário — a diferença que o padrão medido\n * mostra (`03-deliverydireto-item-options.png`): cada grupo é uma seção com\n * título, uma frase de regra (\"Escolha 1 opção\"), linhas de largura inteira\n * com marcador de rádio, o ACRÉSCIMO no próprio item (`+ R$ 10,00`), e um\n * rodapé fixo cujo botão carrega o total corrente.\n *\n * Não reusa o `ProductOptionSelector` do PDP: lá as opções são chips numa\n * página que já mostra o preço em outro lugar; aqui a escolha É a precificação\n * e precisa mostrar o que cada uma custa. O que continua compartilhado é a\n * REGRA — `getProductOptionGroups` decide o que existe e o que falta, e é ela\n * que as duas telas obedecem.\n *\n * LIMITE CONHECIDO: `plg_shop_product_options` é um eixo de VARIANTE (uma\n * combinação, um preço), não um grupo de modificadores (escolha 0..N, cada um\n * com um delta). Então \"adicionais: até 5, cada +R$ 3\" ainda não é\n * representável — falta a 0095. O que esta tela já faz é mostrar o delta REAL\n * de cada valor, lido da tabela de variantes, em vez de esconder que a escolha\n * muda o preço.\n */\nexport function ItemSheet({\n product,\n onClose,\n onAdd,\n disabled,\n disabledReason,\n}: {\n product: Product\n onClose: () => void\n onAdd: (input: { quantity: number; options: ProductOptionSelection; notes?: string }) => void\n /** Loja fechada, por exemplo. O botão continua visível e diz por quê. */\n disabled?: boolean\n disabledReason?: string\n}) {\n const config = useStorefrontConfig()\n const money = (v: number) => formatMoney(v, config.currency, config.locale)\n\n const groups = React.useMemo(() => getProductOptionGroups(product), [product])\n const [options, setOptions] = React.useState<ProductOptionSelection>({})\n const [notes, setNotes] = React.useState('')\n const [quantity, setQuantity] = React.useState(1)\n\n const image = product.images?.find((i) => i.isPrimary) ?? product.images?.[0]\n const stock = product.inventoryCount\n // Um grupo de opção sem escolha feita é um item que não dá para precificar\n // nem para separar. O botão espera.\n const missing = groups.filter((g) => !options[g.label])\n const ready = missing.length === 0\n const unit = selectionPrice(product, options)\n\n // A linha esconde o \"+\" do que está esgotado, mas a FICHA continua abrindo —\n // e abria com o botão ativo, que é como um item indisponível entrava no\n // carrinho pelo caminho mais longo. O portão é aqui, não na lista.\n const soldOut = stock <= 0\n const blocked = disabled || soldOut\n const blockedReason = soldOut ? 'Este item está indisponível no momento.' : disabledReason\n\n return (\n <div\n data-testid={TID.itemSheet}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={product.name}\n className=\"fixed inset-0 z-50 flex flex-col bg-background sm:items-center sm:justify-center sm:bg-black/50 sm:p-6\"\n >\n <div className=\"flex h-full w-full flex-col overflow-hidden bg-background sm:h-auto sm:max-h-[85vh] sm:max-w-lg sm:rounded-2xl\">\n <div className=\"relative shrink-0\">\n {image && (\n <SmoothImage\n src={image.url}\n alt=\"\"\n variant={{ width: 640 }}\n className=\"h-56 w-full object-cover\"\n />\n )}\n <button\n type=\"button\"\n onClick={onClose}\n aria-label=\"Fechar\"\n className=\"absolute left-3 top-3 grid h-9 w-9 place-items-center rounded-full bg-background/90 shadow\"\n >\n <X className=\"h-5 w-5\" />\n </button>\n </div>\n\n <div className=\"min-h-0 flex-1 overflow-y-auto pb-4\">\n <div className=\"px-4 pt-4\">\n <h2 className=\"text-xl font-semibold\">{product.name}</h2>\n {stock > 0 && stock <= 20 && (\n <p className=\"mt-1 text-sm font-medium\">{stock} unidades disponíveis</p>\n )}\n {product.description && (\n <p className=\"mt-3 whitespace-pre-line text-sm text-muted-foreground\">\n {product.description}\n </p>\n )}\n </div>\n\n {groups.map((group) => (\n <OptionGroup\n key={group.id}\n product={product}\n group={group}\n selection={options}\n onSelect={(value) => setOptions((prev) => ({ ...prev, [group.label]: value }))}\n />\n ))}\n\n <div className=\"mt-6 px-4\">\n <label\n htmlFor=\"item-sheet-notes\"\n className=\"text-xs font-medium uppercase tracking-wide text-muted-foreground\"\n >\n Observações do item\n </label>\n <textarea\n id=\"item-sheet-notes\"\n data-testid={TID.itemSheetNotes}\n value={notes}\n // Cortado na digitação e não só validado no envio: o banco recusa\n // acima de 250 (0094), e descobrir isso ao finalizar o pedido é\n // tarde demais para reescrever o recado.\n onChange={(e) => setNotes(e.target.value.slice(0, NOTES_MAX))}\n rows={3}\n placeholder=\"Ex.: sem cebola, ponto da carne…\"\n className=\"mt-2 w-full resize-none rounded-lg border border-border bg-transparent p-3 text-base\"\n />\n <p\n data-testid={TID.itemSheetNotesCount}\n className=\"mt-1 text-right text-xs text-muted-foreground\"\n >\n {notes.length}/{NOTES_MAX}\n </p>\n </div>\n </div>\n\n <div className=\"shrink-0 border-t border-border p-4 pb-[max(1rem,env(safe-area-inset-bottom))]\">\n {blocked && blockedReason && (\n <p className=\"mb-3 text-center text-sm text-muted-foreground\">{blockedReason}</p>\n )}\n <div className=\"flex items-center gap-3\">\n <div className=\"flex items-center gap-2 rounded-full border border-border px-2 py-1\">\n <button\n type=\"button\"\n aria-label=\"Menos um\"\n onClick={() => setQuantity((q) => Math.max(1, q - 1))}\n className=\"grid h-9 w-9 place-items-center rounded-full disabled:opacity-40\"\n disabled={quantity <= 1}\n >\n <Minus className=\"h-4 w-4\" />\n </button>\n <span data-testid={TID.itemSheetQty} className=\"min-w-4 text-center tabular-nums\">\n {quantity}\n </span>\n <button\n type=\"button\"\n aria-label=\"Mais um\"\n onClick={() => setQuantity((q) => Math.min(stock || Infinity, q + 1))}\n className=\"grid h-9 w-9 place-items-center rounded-full disabled:opacity-40\"\n disabled={stock > 0 && quantity >= stock}\n >\n <Plus className=\"h-4 w-4\" />\n </button>\n </div>\n\n {/* O total ANDA com a escolha. Um botão que diz só \"Adicionar\"\n deixa a conta para a gaveta, e é lá que a pessoa descobre que a\n opção que escolheu custava mais. */}\n <button\n type=\"button\"\n data-testid={TID.itemSheetAdd}\n disabled={blocked || !ready}\n onClick={() => onAdd({ quantity, options, notes: notes.trim() || undefined })}\n className=\"flex h-12 flex-1 items-center justify-center rounded-full bg-primary px-6 text-sm font-bold uppercase tracking-wide text-primary-foreground disabled:opacity-40\"\n >\n {ready ? `Adicionar • ${money(unit * quantity)}` : `Escolha ${missing[0]!.label}`}\n </button>\n </div>\n </div>\n </div>\n </div>\n )\n}\n\n/**\n * Um grupo de opções, como seção.\n *\n * O delta sai da tabela de variantes: troca-se ESTE valor na seleção corrente e\n * pergunta-se o preço. Por isso ele é honesto num produto de dois eixos, onde\n * \"+R$ 10\" para 850ml pode depender da base escolhida — e por isso ele muda\n * enquanto a pessoa escolhe, em vez de mentir a partir de um preço-base fixo.\n */\nfunction OptionGroup({\n product,\n group,\n selection,\n onSelect,\n}: {\n product: Product\n group: ProductOptionGroup\n selection: ProductOptionSelection\n onSelect: (value: string) => void\n}) {\n const config = useStorefrontConfig()\n const money = (v: number) => formatMoney(v, config.currency, config.locale)\n const chosen = selection[group.label]\n\n // A referência do delta é a opção mais barata do grupo, não a primeira da\n // lista: \"+ R$ 0,00\" na opção do meio e \"- R$ 10,00\" na de cima seria uma\n // tabela de preços em vez de uma lista de acréscimos.\n const prices = group.values.map((value) =>\n selectionPrice(product, { ...selection, [group.label]: value }),\n )\n const base = Math.min(...prices)\n\n return (\n <section data-testid={TID.itemSheetGroup(group.label)} className=\"mt-6\">\n <div className=\"border-y border-border bg-muted/40 px-4 py-3\">\n <h3 className=\"text-sm font-bold\">{group.label}</h3>\n {/* A regra é dita, não deduzida do formato do marcador. Um rádio\n comunica \"só um\" para quem já sabe o que um rádio é. */}\n <p className=\"text-sm text-muted-foreground\">Escolha 1 opção.</p>\n </div>\n\n <ul>\n {group.values.map((value, index) => {\n const delta = prices[index]! - base\n const on = chosen === value\n return (\n <li key={value} className=\"border-b border-border\">\n <button\n type=\"button\"\n role=\"radio\"\n aria-checked={on}\n onClick={() => onSelect(value)}\n // min-h-14: a linha inteira é o alvo, e ela passa dos 44px que\n // um dedo precisa mesmo quando o texto cabe numa linha só.\n className=\"flex min-h-14 w-full items-center gap-3 px-4 py-3 text-left\"\n >\n <span className=\"min-w-0 flex-1\">\n <span className=\"block text-sm\">{value}</span>\n {delta > 0 && (\n <span className=\"block text-sm font-semibold\">+ {money(delta)}</span>\n )}\n </span>\n <span\n aria-hidden\n className={`grid h-5 w-5 shrink-0 place-items-center rounded-full border-2 ${\n on ? 'border-primary' : 'border-muted-foreground/40'\n }`}\n >\n {on && <span className=\"h-2.5 w-2.5 rounded-full bg-primary\" />}\n </span>\n </button>\n </li>\n )\n })}\n </ul>\n </section>\n )\n}\n","import React from 'react'\nimport { X } from 'lucide-react'\nimport type { ScheduleSlot } from '@fayz-ai/shop/types'\nimport { getShopProvider } from '@fayz-ai/shop/runtime'\nimport { useDeliveryStore } from '../../stores/delivery.store'\nimport { useServiceStore } from '../../stores/service.store'\nimport { TID } from '../../lib/testids'\n\n/**\n * Escolher o dia e a janela.\n *\n * Os slots vêm do servidor (`shop_schedule_slots`), derivados das MESMAS janelas\n * que respondem \"estou aberta?\". Por isso esta tela não valida nada: um horário\n * fora do expediente não é um caso a filtrar aqui, é uma coisa que não chega a\n * existir na lista. Se algum dia chegar, o trigger da 0094 recusa o pedido —\n * duas barreiras, e nenhuma delas é este componente.\n */\nexport function ScheduleSheet({ onClose }: { onClose: () => void }) {\n const fulfillmentType = useDeliveryStore((s) => s.fulfillmentType)\n const scheduledFor = useDeliveryStore((s) => s.scheduledFor)\n const setScheduledFor = useDeliveryStore((s) => s.setScheduledFor)\n const timezone = useServiceStore((s) => s.service?.timezone) ?? 'America/Sao_Paulo'\n\n const [slots, setSlots] = React.useState<ScheduleSlot[] | null>(null)\n\n React.useEffect(() => {\n let alive = true\n void (async () => {\n const rows = (await getShopProvider()?.listScheduleSlots?.(fulfillmentType)) ?? []\n if (alive) setSlots(rows)\n })()\n return () => { alive = false }\n }, [fulfillmentType])\n\n // Agrupado por DIA no fuso da loja. Uma lista corrida de quarenta horários é\n // ilegível; \"quinta\" com seis janelas embaixo é como as pessoas pensam nisso.\n const days = React.useMemo(() => {\n const fmtDay = new Intl.DateTimeFormat('pt-BR', {\n weekday: 'long', day: '2-digit', month: '2-digit', timeZone: timezone,\n })\n const map = new Map<string, ScheduleSlot[]>()\n for (const slot of slots ?? []) {\n const key = fmtDay.format(new Date(slot.startsAt))\n const list = map.get(key) ?? []\n list.push(slot)\n map.set(key, list)\n }\n return [...map.entries()]\n }, [slots, timezone])\n\n const fmtTime = new Intl.DateTimeFormat('pt-BR', {\n hour: '2-digit', minute: '2-digit', timeZone: timezone,\n })\n\n return (\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Agendar\"\n data-testid={TID.scheduleSheet}\n className=\"fixed inset-0 z-50 flex flex-col justify-end bg-black/50 sm:items-center sm:justify-center sm:p-6\"\n >\n <div className=\"max-h-[80vh] w-full overflow-hidden rounded-t-2xl bg-background sm:max-w-md sm:rounded-2xl\">\n <div className=\"flex items-start justify-between gap-4 border-b border-border p-4\">\n <h2 className=\"text-lg font-semibold\">Agendar</h2>\n <button type=\"button\" onClick={onClose} aria-label=\"Fechar\" className=\"-mr-1 -mt-1 p-1\">\n <X className=\"h-5 w-5\" />\n </button>\n </div>\n\n <div className=\"max-h-[60vh] overflow-y-auto p-4\">\n {/* \"O quanto antes\" é uma opção de verdade e a primeira: a maioria\n não quer agendar, quer só desfazer um agendamento anterior. */}\n <button\n type=\"button\"\n onClick={() => { setScheduledFor(null); onClose() }}\n aria-pressed={!scheduledFor}\n className={`mb-4 w-full rounded-lg border px-4 py-3 text-left text-sm ${\n !scheduledFor ? 'border-primary font-medium' : 'border-border'\n }`}\n >\n O quanto antes\n </button>\n\n {slots === null && <p className=\"text-sm text-muted-foreground\">Carregando horários…</p>}\n\n {slots !== null && !slots.length && (\n <p className=\"text-sm text-muted-foreground\">\n Não há horários disponíveis para agendar agora.\n </p>\n )}\n\n {days.map(([day, daySlots]) => (\n <div key={day} className=\"mb-5\">\n <h3 className=\"mb-2 text-sm font-semibold capitalize\">{day}</h3>\n <div className=\"grid grid-cols-2 gap-2\">\n {daySlots.map((slot) => {\n const active = scheduledFor === slot.startsAt\n return (\n <button\n key={slot.startsAt}\n type=\"button\"\n data-testid={TID.scheduleSlot(slot.startsAt)}\n aria-pressed={active}\n onClick={() => { setScheduledFor(slot.startsAt); onClose() }}\n className={`rounded-lg border px-3 py-2 text-sm ${\n active ? 'border-primary font-medium' : 'border-border'\n }`}\n >\n {fmtTime.format(new Date(slot.startsAt))}\n {' – '}\n {fmtTime.format(new Date(slot.endsAt))}\n </button>\n )\n })}\n </div>\n </div>\n ))}\n </div>\n </div>\n </div>\n )\n}\n","import React from 'react'\nimport { X } from 'lucide-react'\nimport type { ServiceHours } from '@fayz-ai/shop/types'\nimport { getShopProvider } from '@fayz-ai/shop/runtime'\nimport { useServiceStore } from '../../stores/service.store'\nimport { storeTime } from './store-time'\nimport { TID } from '../../lib/testids'\n\nconst WEEKDAYS = ['dom', 'seg', 'ter', 'qua', 'qui', 'sex', 'sáb']\n\n/** '17:00:00' → '17:00'. Segundos num horário de loja são ruído. */\nfunction hhmm(time: string): string {\n return time.slice(0, 5)\n}\n\n/** A placa na porta: o horário semanal como a lojista cadastrou. */\nexport function ServiceHoursModal({ onClose }: { onClose: () => void }) {\n const fulfillmentType = useServiceStore((s) => s.fulfillmentType)\n const [hours, setHours] = React.useState<ServiceHours[] | null>(null)\n\n React.useEffect(() => {\n let alive = true\n void (async () => {\n const rows = (await getShopProvider()?.listServiceHours?.(fulfillmentType)) ?? []\n if (alive) setHours(rows)\n })()\n return () => { alive = false }\n }, [fulfillmentType])\n\n // Agrupa por dia: um dia com almoço e jantar são duas linhas na tabela e uma\n // linha na tela (\"09:00 às 14:00 · 18:00 às 23:00\").\n const byDay = React.useMemo(() => {\n const map = new Map<number, ServiceHours[]>()\n for (const h of hours ?? []) {\n const list = map.get(h.weekday) ?? []\n list.push(h)\n map.set(h.weekday, list)\n }\n return map\n }, [hours])\n\n return (\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Horários de funcionamento\"\n data-testid={TID.serviceHoursModal}\n className=\"fixed inset-0 z-50 grid place-items-center bg-black/50 p-4\"\n >\n <div className=\"w-full max-w-sm rounded-2xl bg-background p-6\">\n <div className=\"flex items-start justify-between gap-4\">\n <h2 className=\"text-lg font-semibold\">Horários de funcionamento</h2>\n <button type=\"button\" onClick={onClose} aria-label=\"Fechar\" className=\"-mr-1 -mt-1 p-1\">\n <X className=\"h-5 w-5\" />\n </button>\n </div>\n\n {hours === null && <p className=\"mt-4 text-sm text-muted-foreground\">Carregando…</p>}\n\n {hours !== null && (\n <ul className=\"mt-4 space-y-2 text-sm\">\n {WEEKDAYS.map((label, day) => {\n const windows = byDay.get(day) ?? []\n return (\n <li key={day} className=\"flex items-baseline justify-between gap-4\">\n <span className=\"text-muted-foreground\">{label}</span>\n <span className=\"text-right\">\n {windows.length\n ? windows.map((w) => `${hhmm(w.opensAt)} às ${hhmm(w.closesAt)}`).join(' · ')\n : // Um dia sem janela não é um erro nem um vazio: é uma\n // informação, e escrevê-la evita que alguém volte amanhã\n // para descobrir o mesmo.\n 'Fechado'}\n </span>\n </li>\n )\n })}\n </ul>\n )}\n </div>\n </div>\n )\n}\n\n/**\n * O aviso que aparece quando alguém tenta comprar com a loja fechada.\n *\n * Diz o que fazer, não só o que deu errado: quando abre, e onde ver o resto.\n */\nexport function ClosedStoreDialog({\n onClose,\n onShowHours,\n paused = false,\n}: {\n onClose: () => void\n onShowHours: () => void\n /** The house paused its delivery (shop 0131): no hours to show, just «not now». */\n paused?: boolean\n}) {\n const state = useServiceStore()\n const tz = state.service?.timezone ?? 'America/Sao_Paulo'\n const next = state.service?.nextOpenAt\n\n return (\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n data-testid={TID.serviceClosedGate}\n className=\"fixed inset-0 z-[60] grid place-items-center bg-black/50 p-4\"\n >\n <div className=\"w-full max-w-sm rounded-2xl bg-background p-6 text-center\">\n <h2 className=\"text-lg font-semibold\">{paused ? 'Nosso delivery está fechado no momento' : 'Nossa loja está fechada no momento'}</h2>\n <p className=\"mt-2 text-sm text-muted-foreground\">\n {paused\n ? 'Voltamos em breve. Enquanto isso, fique à vontade para olhar o cardápio.'\n : next\n ? `Abrimos ${storeTime(next, tz, { weekday: true })}. Enquanto isso, fique à vontade para olhar o cardápio.`\n : 'Enquanto isso, fique à vontade para olhar o cardápio.'}\n </p>\n {!paused && (\n <button\n type=\"button\"\n onClick={onShowHours}\n className=\"mt-5 w-full rounded-full bg-primary px-6 py-3 font-semibold text-primary-foreground\"\n >\n Ver horários de funcionamento\n </button>\n )}\n <button type=\"button\" onClick={onClose} className={`${paused ? 'mt-5' : 'mt-3'} w-full py-2 text-sm font-medium`}>\n OK, entendi\n </button>\n </div>\n </div>\n )\n}\n","import type { Product } from '@fayz-ai/shop/types'\n\n/** How many products the delivery menu's «Destaques» row shows, whatever its source. */\nexport const HIGHLIGHT_LIMIT = 6\n\nexport interface HighlightSources {\n /** Storefront product ids the merchant featured on the product's «Loja» tab (shop 0136), in the store's order. */\n listingFeaturedIds?: readonly string[] | null\n /** Storefront product ids whose «Cardápio» item she featured (shop 0136), in the order she drags them. */\n menuFeaturedIds?: readonly string[] | null\n /** `config.delivery.highlightSlugs`, written into the app's code. */\n highlightSlugs?: readonly string[] | null\n limit?: number\n}\n\n/**\n * The delivery menu's «Destaques», chosen from the products on the page.\n *\n * Every source is somebody's statement, tried in this order:\n * 1. the listings she featured on the product's «Loja» tab — the place a\n * store that runs its site from «Loja» chooses;\n * 2. the menu items she featured in «Cardápio»;\n * 3. `highlightSlugs` from the app's code;\n * 4. products she registered a `compareAtPrice` for (and that are in stock).\n * The first source that names something on the page wins; a source that names\n * nothing visible counts as absent, so a featured item that is not published\n * does not blank the row. The order is the source's, not the catalogue's: the\n * flagship goes first for a reason.\n */\nexport function pickHighlights(items: readonly Product[], sources: HighlightSources = {}): Product[] {\n const limit = sources.limit ?? HIGHLIGHT_LIMIT\n const pick = (key: 'id' | 'slug', wanted: readonly string[] | null | undefined): Product[] => {\n if (!wanted?.length) return []\n const byKey = new Map(items.map((p) => [p[key], p]))\n const seen = new Set<string>()\n const out: Product[] = []\n for (const value of wanted) {\n const product = byKey.get(value)\n if (!product || seen.has(product.id)) continue\n seen.add(product.id)\n out.push(product)\n if (out.length >= limit) break\n }\n return out\n }\n\n for (const chosen of [\n pick('id', sources.listingFeaturedIds),\n pick('id', sources.menuFeaturedIds),\n pick('slug', sources.highlightSlugs),\n ]) {\n if (chosen.length) return chosen\n }\n return items\n .filter((p) => p.compareAtPrice != null && p.compareAtPrice > p.price && p.inventoryCount > 0)\n .slice(0, limit)\n}\n","import React from 'react'\nimport { ChevronRight, Clock, LogOut, MapPin, Package, User, X } from 'lucide-react'\nimport { useSessionStore } from '../../stores/session.store'\nimport { signOutCustomer } from '../../data/auth'\nimport { navigateTo } from '../../app/router'\nimport { accountSectionPath } from '../account/section'\n\n/**\n * The delivery page's account menu — a side drawer from the cover's corner.\n *\n * Mirrors the store Artorius used before (Delivery Direto: a ☰ on the cover\n * opens a right-hand drawer whose first row is «Entre ou cadastre-se», then the\n * store's own links). The delivery page has no site header, so without this the\n * buyer could not sign in, see their orders or fix an address from the menu.\n *\n * «Meus pedidos» is a real destination for every buyer, signed in or not: the\n * account page asks a guest to sign in, which is the honest answer.\n */\nexport function AccountDrawer({ onClose, onSignIn, onAddresses, onShowHours }: {\n onClose: () => void\n onSignIn: () => void\n onAddresses: () => void\n onShowHours?: () => void\n}) {\n const session = useSessionStore()\n const signedIn = Boolean(session.email)\n const name = session.name || session.email?.split('@')[0] || ''\n\n React.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 const go = (path: string) => { onClose(); navigateTo(path) }\n\n const row = 'flex w-full items-center gap-3 px-5 py-3.5 text-left text-sm font-medium hover:bg-muted/50'\n\n return (\n <div className=\"fixed inset-0 z-50 flex justify-end\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Sua conta\" data-testid=\"account-drawer\">\n <button type=\"button\" aria-label=\"Fechar\" onClick={onClose} className=\"absolute inset-0 bg-black/50\" />\n <div className=\"relative flex h-full w-[85%] max-w-sm flex-col overflow-y-auto bg-background text-foreground shadow-xl\">\n <div className=\"flex items-center justify-end p-2\">\n <button type=\"button\" onClick={onClose} aria-label=\"Fechar\" className=\"grid h-10 w-10 place-items-center rounded-full\">\n <X className=\"h-5 w-5\" />\n </button>\n </div>\n\n {signedIn ? (\n <div className=\"flex items-center gap-3 border-b border-border px-5 pb-4\" data-testid=\"account-drawer-user\">\n <span className=\"grid h-11 w-11 shrink-0 place-items-center rounded-full bg-primary/15 font-bold text-primary\">\n {name.slice(0, 1).toUpperCase()}\n </span>\n <span className=\"min-w-0\">\n <span className=\"block truncate font-semibold\">{name}</span>\n <span className=\"block truncate text-xs text-muted-foreground\">{session.email}</span>\n </span>\n </div>\n ) : (\n <button\n type=\"button\"\n data-testid=\"account-drawer-sign-in\"\n onClick={() => { onClose(); onSignIn() }}\n className=\"flex items-center gap-3 border-b border-border px-5 pb-4 text-left\"\n >\n <span className=\"grid h-11 w-11 shrink-0 place-items-center rounded-full bg-muted\">\n <User className=\"h-5 w-5\" />\n </span>\n <span className=\"flex-1 font-semibold\">Entre ou cadastre-se</span>\n <ChevronRight className=\"h-5 w-5 text-muted-foreground\" />\n </button>\n )}\n\n <nav className=\"py-2\" aria-label=\"Sua conta\">\n <button type=\"button\" className={row} data-testid=\"account-drawer-orders\" onClick={() => go(accountSectionPath('orders'))}>\n <Package className=\"h-5 w-5 text-muted-foreground\" /> Meus pedidos\n </button>\n <button type=\"button\" className={row} data-testid=\"account-drawer-addresses\" onClick={() => { onClose(); onAddresses() }}>\n <MapPin className=\"h-5 w-5 text-muted-foreground\" /> Meus endereços\n </button>\n {signedIn && (\n <button type=\"button\" className={row} data-testid=\"account-drawer-profile\" onClick={() => go(accountSectionPath('profile'))}>\n <User className=\"h-5 w-5 text-muted-foreground\" /> Meus dados\n </button>\n )}\n {onShowHours && (\n <button type=\"button\" className={row} onClick={() => { onClose(); onShowHours() }}>\n <Clock className=\"h-5 w-5 text-muted-foreground\" /> Horários de funcionamento\n </button>\n )}\n </nav>\n\n {signedIn && (\n <div className=\"mt-auto border-t border-border py-2\">\n <button\n type=\"button\"\n className={`${row} text-destructive`}\n data-testid=\"account-drawer-sign-out\"\n onClick={() => { void signOutCustomer().finally(onClose) }}\n >\n <LogOut className=\"h-5 w-5\" /> Sair\n </button>\n </div>\n )}\n </div>\n </div>\n )\n}\n","import React from 'react'\nimport { trackStorefront } from '../analytics/bus'\nimport type { Category, Product, StorefrontFeatured } from '@fayz-ai/shop/types'\nimport { MENU_DATA_NEEDS } from '../data/menu-needs'\nimport { useLoader } from '../blocks/page-data'\nimport { useCartStore, selectCount, selectSubtotal } from '../stores/cart.store'\nimport { formatMoney } from '../lib/format'\nimport { useStorefrontConfig } from '../document/config'\nimport { getProductOptionGroups } from '../data/product-options'\nimport type { ProductOptionSelection } from '../data/product-options'\nimport { TID } from '../lib/testids'\nimport { pickHighlights } from '../lib/highlights'\nimport { StoreCover } from '../components/delivery/StoreCover'\nimport { AddressStrip } from '../components/delivery/AddressStrip'\nimport { MenuToolbar } from '../components/delivery/MenuToolbar'\nimport { MenuItemRow } from '../components/delivery/MenuItemRow'\nimport { ItemSheet } from '../components/delivery/ItemSheet'\nimport { ScheduleSheet } from '../components/delivery/ScheduleSheet'\nimport { ServiceHoursModal, ClosedStoreDialog } from '../components/delivery/ServiceStatus'\nimport { useServiceStore, selectIsOpen } from '../stores/service.store'\nimport { useToastStore } from '../stores/toast.store'\nimport { AddressSheet } from '../components/delivery/AddressSheet'\nimport { AccountDrawer } from '../components/delivery/AccountDrawer'\nimport { SignInModal } from '../components/account/SignInModal'\nimport { Slot, useSlotFilled, type StorefrontSlotContextMap } from '../extend/slots'\nimport { useExperimentValue } from '../experiments/react'\n\n/**\n * O cardápio — a vitrine do modo delivery (0094).\n *\n * A ordem da página é a ordem das perguntas, e ela é fixa: quem é a loja e se\n * está aberta (capa) → como isso chega e quanto custa (faixa de endereço) →\n * onde está o que eu quero (busca + categorias) → o que tem (seções). É o\n * esqueleto que os cinco produtos medidos compartilham\n * (`docs/artorius/delivery-reference/patterns/`), e cada passo depende da\n * resposta do anterior: descobrir a taxa de entrega depois de montar o\n * carrinho é a pior hora possível para descobrir.\n *\n * Categorias como SEÇÕES numa página só, e não como um filtro que troca a\n * página. Um cardápio se lê rolando: a pessoa quer ver que existe sobremesa\n * sem ter decidido antes que quer sobremesa. Um filtro esconde exatamente essa\n * descoberta, e é por isso que nenhum app de delivery usa um.\n *\n * A `/catalog` com grade e facetas continua existindo e não foi tocada. As duas\n * respondem perguntas diferentes: o catálogo é para quem procura, o cardápio é\n * para quem escolhe.\n */\nexport { menuDataNeeds } from '../data/menu-needs'\n\nexport function MenuPage() {\n const config = useStorefrontConfig()\n const addItem = useCartStore((s) => s.addItem)\n const [openProduct, setOpenProduct] = React.useState<Product | null>(null)\n // The delivery menu opens a product in a sheet, not on its own page: the\n // sheet opening is this store's product view.\n React.useEffect(() => {\n if (!openProduct) return\n trackStorefront('product_viewed', {\n product_id: openProduct.id,\n product_name: openProduct.name,\n slug: openProduct.slug,\n price: openProduct.price,\n in_stock: openProduct.inventoryCount > 0,\n surface: 'menu_sheet',\n })\n }, [openProduct?.id])\n const [showHours, setShowHours] = React.useState(false)\n const [showClosed, setShowClosed] = React.useState(false)\n const [showAddress, setShowAddress] = React.useState(false)\n const [showAccount, setShowAccount] = React.useState(false)\n const [showSignIn, setShowSignIn] = React.useState(false)\n const [showSchedule, setShowSchedule] = React.useState(false)\n const [query, setQuery] = React.useState('')\n\n const serviceState = useServiceStore()\n const refreshService = useServiceStore((s) => s.refresh)\n // The house paused its delivery (the back office's top-bar switch, shop\n // 0131) closes the menu the same way the opening hours do.\n const paused = Boolean(config.delivery?.paused)\n const isOpen = selectIsOpen(serviceState) && !paused\n\n // A capa faz a pergunta \"estou aberta?\"; alguém precisa mandar perguntar. O\n // badge fazia isso quando ele mesmo montava — agora que o estado está na\n // capa, a página é a dona da chamada.\n React.useEffect(() => { void refreshService() }, [refreshService])\n\n\n // A barra fixa do carrinho. Num cardápio de quarenta itens o carrinho fica a\n // quarenta linhas de distância do polegar, e um ícone no topo não é um\n // caminho — é uma lembrança. A barra é a única coisa na tela que diz quanto\n // já custou e para onde ir, e por isso é a ÚNICA ação primária aqui.\n const cart = useCartStore()\n const openDrawer = useCartStore((s) => s.openDrawer)\n const pushToast = useToastStore((s) => s.push)\n const count = selectCount(cart)\n const subtotal = selectSubtotal(cart)\n\n /**\n * O portão da loja fechada.\n *\n * É CORTESIA, não segurança: quem recusa o pedido de verdade é o trigger da\n * 0094, no banco, que não pode ser contornado por devtools nem por um relógio\n * adiantado. Isto existe para a pessoa não montar um carrinho inteiro antes\n * de descobrir — que é o custo real de não avisar.\n */\n function guarded(run: () => void): void {\n if (!isOpen) { setShowClosed(true); return }\n run()\n }\n\n // NOTA: só o ADICIONAR passa por `guarded`. Abrir a ficha, ler a descrição e\n // ver o preço continuam livres com a loja fechada — é exatamente o que o\n // aviso convida a fazer (\"fique à vontade para olhar o cardápio\"), e trancar\n // a leitura contradiria a própria mensagem. A ficha se desabilita sozinha e\n // diz por quê (`disabled` + `disabledReason`).\n\n // `useLoader` e não um fetch no efeito: é o mesmo caminho que o host usa para\n // resolver dados no servidor, e é o que faz /menu chegar ao navegador já com\n // os produtos dentro do HTML em vez de um esqueleto que pisca.\n const products = useLoader<Product[]>(MENU_DATA_NEEDS.products.loader, MENU_DATA_NEEDS.products.params)\n const categories = useLoader<Category[]>(MENU_DATA_NEEDS.categories.loader, MENU_DATA_NEEDS.categories.params)\n const featured = useLoader<StorefrontFeatured>(MENU_DATA_NEEDS.featured.loader, MENU_DATA_NEEDS.featured.params)\n\n // The highlights wait for their own read too: painting the fallback first\n // and swapping it for the store's curation a moment later is a flicker the\n // shopper reads as the page changing its mind.\n const featuredPending = featured.status === 'loading' || featured.status === 'idle'\n const loading = products.status === 'loading' || products.status === 'idle'\n const items = products.data ?? []\n const cats = categories.data ?? []\n\n // Agrupa preservando a ordem das categorias, e junta no fim o que não tem\n // categoria nenhuma — um produto sem categoria é um produto que a lojista\n // ainda não classificou, não um produto que ela quis esconder.\n const allSections = React.useMemo(() => {\n const byCategory = new Map<string, Product[]>()\n const loose: Product[] = []\n for (const p of items) {\n const key = p.categoryId ?? p.categoryName ?? ''\n if (!key) { loose.push(p); continue }\n const list = byCategory.get(key) ?? []\n list.push(p)\n byCategory.set(key, list)\n }\n const ordered = cats\n .map((c) => ({\n id: c.id,\n slug: c.slug ?? c.id,\n name: c.name,\n description: c.description ?? null,\n products: byCategory.get(c.id) ?? byCategory.get(c.name) ?? [],\n }))\n .filter((s) => s.products.length > 0)\n\n if (loose.length) {\n ordered.push({ id: 'outros', slug: 'outros', name: 'Outros', description: null, products: loose })\n }\n // Nenhuma categoria cadastrada não pode significar cardápio vazio: cai numa\n // seção só, com tudo dentro.\n if (!ordered.length && items.length) {\n return [{ id: 'todos', slug: 'todos', name: 'Cardápio', description: null, products: items }]\n }\n return ordered\n }, [items, cats])\n\n /**\n * «Destaques»: the store's curation first, then — without one — what is on\n * sale (`pickHighlights` holds the order of the sources).\n *\n * The reference shows \"MAIS PEDIDO\" here, and we do not have that number:\n * order counts per product exist nowhere in the storefront. Deriving the\n * badge from stock or position would be a recommendation nobody made, and the\n * shopper could not tell it was a guess. Every source used instead is\n * somebody's statement: the merchant's «Destaque no site» switch on the\n * product's «Loja» tab or in «Cardápio» (shop 0136), the app's\n * `highlightSlugs`, or a `compareAtPrice` she registered. None of them, no\n * section.\n */\n const highlights = React.useMemo(\n () => pickHighlights(items, {\n listingFeaturedIds: featured.data?.listing,\n menuFeaturedIds: featured.data?.menu,\n highlightSlugs: config.delivery?.highlightSlugs,\n }),\n [items, featured.data, config.delivery?.highlightSlugs],\n )\n\n // A busca filtra em cima das MESMAS seções, sem trocar de rota: some o que\n // não casa, some a seção que ficou vazia, e a ordem do cardápio se mantém\n // para o que restou.\n const normalized = query.trim().toLowerCase()\n const sections = React.useMemo(() => {\n if (!normalized) return allSections\n return allSections\n .map((section) => ({\n ...section,\n products: section.products.filter(\n (p) =>\n p.name.toLowerCase().includes(normalized) ||\n (p.description ?? '').toLowerCase().includes(normalized),\n ),\n }))\n .filter((section) => section.products.length > 0)\n }, [allSections, normalized])\n\n const matches = sections.reduce((n, s) => n + s.products.length, 0)\n\n /**\n * Adicionar SEM abrir a gaveta, e avisar que entrou.\n *\n * Abrir o carrinho a cada \"+\" interrompe a montagem: num cardápio a pessoa\n * põe oito coisas, e oito vezes ela teria de fechar a gaveta e reencontrar o\n * ponto da lista onde estava. O aviso resolve as duas perguntas que sobram —\n * \"entrou mesmo?\" e \"e agora?\" — e deixa CONTINUAR COMPRANDO ser a opção que\n * não custa nada: é não fazer nada, e o aviso some sozinho.\n */\n function addToCart(product: Product, quantity: number, options?: ProductOptionSelection, notes?: string) {\n addItem(product, quantity, options, notes, { openDrawer: false })\n pushToast({\n title: `${quantity}× ${product.name}`,\n description: 'Adicionado ao carrinho.',\n variant: 'success',\n action: { label: 'Ver carrinho', onClick: openDrawer },\n // Mais longo que o padrão: o aviso carrega uma decisão, e 3,4s é pouco\n // para ler, decidir e acertar um alvo com o polegar.\n durationMs: 5000,\n })\n }\n\n function quickAddable(product: Product): boolean {\n // Só o que não exige escolha. Um \"+\" que abre um modal é um \"+\" que mentiu.\n return getProductOptionGroups(product).length === 0\n }\n\n function rowProps(product: Product) {\n return {\n onOpen: setOpenProduct,\n onQuickAdd: quickAddable(product)\n ? (p: Product) => guarded(() => addToCart(p, 1))\n : undefined,\n // \"A partir de\" quando o preço mostrado é o de UMA combinação entre\n // várias: o número na linha não é o que a pessoa vai pagar.\n fromPrice: getProductOptionGroups(product).length > 0,\n }\n }\n\n // What the menu's slots see (extend/slots.tsx): the same actions the rows\n // use, so a store's carousel or banner adds and opens exactly like them.\n const coverSize = useExperimentValue(config.delivery?.coverSize) ?? 'full'\n const highlightsSlot = useSlotFilled('menu', 'highlights')\n const menuSlot: StorefrontSlotContextMap['menu'] = {\n coverSize,\n highlights,\n section: null,\n openProduct: setOpenProduct,\n quickAdd: (product) => {\n const add = rowProps(product).onQuickAdd\n return add && product.inventoryCount > 0 ? () => add(product) : undefined\n },\n }\n\n return (\n // pb-28 reserva o espaço da barra fixa do carrinho: conteúdo escondido\n // atrás de um elemento fixo é a falha mais comum de barra inferior.\n <main data-testid={TID.menuPage} className=\"w-full pb-28\">\n <StoreCover onShowHours={() => setShowHours(true)} onOpenAccount={() => setShowAccount(true)}>\n <Slot area=\"menu\" name=\"coverOverlay\" context={menuSlot} />\n </StoreCover>\n\n <AddressStrip\n onChangeAddress={() => setShowAddress(true)}\n onSchedule={() => setShowSchedule(true)}\n />\n\n <MenuToolbar\n sections={allSections}\n query={query}\n onQuery={setQuery}\n />\n\n <div className=\"mx-auto w-full max-w-3xl px-4\">\n {loading && (\n // Esqueleto e não \"Carregando…\": a lista aparece no lugar exato onde\n // as caixas já estavam, sem o pulo que um texto centralizado causa.\n <ul aria-hidden className=\"animate-pulse pt-6\">\n {[0, 1, 2, 3, 4].map((i) => (\n <li key={i} className=\"flex items-start gap-3 border-b border-border py-4\">\n <div className=\"min-w-0 flex-1 space-y-2\">\n <div className=\"h-4 w-2/3 rounded bg-muted\" />\n <div className=\"h-3 w-full rounded bg-muted\" />\n <div className=\"h-3 w-1/2 rounded bg-muted\" />\n </div>\n <div className=\"h-24 w-24 shrink-0 rounded-lg bg-muted\" />\n </li>\n ))}\n </ul>\n )}\n\n {!loading && !sections.length && (\n <p className=\"py-12 text-center text-muted-foreground\">\n {normalized\n ? `Nada no cardápio para \"${query.trim()}\".`\n : 'Nenhum item disponível no momento.'}\n </p>\n )}\n\n {/* Durante a busca a contagem substitui os destaques: quem está\n buscando já sabe o que quer, e uma vitrine no topo dos resultados\n empurra para baixo a resposta que ele pediu. */}\n {normalized && matches > 0 && (\n <p className=\"pt-4 text-sm text-muted-foreground\">\n {matches} {matches === 1 ? 'item encontrado' : 'itens encontrados'}\n </p>\n )}\n\n {!normalized && !featuredPending && highlights.length > 0 && (\n <section data-testid={TID.menuHighlights} className=\"mb-10 pt-6\">\n <h2 className=\"text-lg font-bold uppercase tracking-wide\">Destaques</h2>\n {highlightsSlot ? (\n <Slot area=\"menu\" name=\"highlights\" context={menuSlot} />\n ) : (\n <ul className=\"mt-2\">\n {highlights.map((product) => (\n <MenuItemRow\n key={product.id}\n product={product}\n // O selo só quando ele é verdade. Um item curado que não está\n // em promoção não pode dizer que está.\n badge={\n product.compareAtPrice != null && product.compareAtPrice > product.price\n ? 'Em promoção'\n : undefined\n }\n accent\n {...rowProps(product)}\n />\n ))}\n </ul>\n )}\n </section>\n )}\n\n {sections.map((section) => (\n <section\n key={section.id}\n data-testid={TID.menuSection(section.slug)}\n data-section-slug={section.slug}\n className=\"mb-10 scroll-mt-32\"\n id={`menu-${section.slug}`}\n >\n <Slot\n area=\"menu\"\n name=\"sectionIntro\"\n context={{\n ...menuSlot,\n section: { slug: section.slug, name: section.name, description: section.description, products: section.products },\n }}\n />\n <h2 className=\"text-lg font-bold uppercase tracking-wide\">{section.name}</h2>\n {section.description && (\n <p className=\"mt-1 text-sm text-muted-foreground\">{section.description}</p>\n )}\n <ul className=\"mt-2\">\n {section.products.map((product) => (\n <MenuItemRow key={product.id} product={product} {...rowProps(product)} />\n ))}\n </ul>\n </section>\n ))}\n </div>\n\n {openProduct && (\n <ItemSheet\n product={openProduct}\n onClose={() => setOpenProduct(null)}\n disabled={!isOpen}\n disabledReason={!isOpen ? (paused ? 'O delivery está fechado no momento.' : 'A loja está fechada no momento.') : undefined}\n onAdd={({ quantity, options, notes }) => {\n guarded(() => {\n addToCart(openProduct, quantity, options, notes)\n setOpenProduct(null)\n })\n }}\n />\n )}\n\n {count > 0 && <BottomBarSpace />}\n {count > 0 && (\n <div\n data-testid={TID.menuCartBar}\n className=\"fixed inset-x-0 bottom-0 z-40 border-t border-border bg-background p-3 pb-[max(0.75rem,env(safe-area-inset-bottom))]\"\n >\n <button\n type=\"button\"\n // Abre a GAVETA, não o checkout. O botão diz \"Ver carrinho\" e\n // precisa mostrar o carrinho: mandar direto para o pagamento seria\n // a etiqueta prometendo revisão e a ação cobrando — e tiraria o\n // único lugar onde se corrige uma quantidade antes de pagar. A\n // gaveta tem o \"Finalizar compra\" dela, que é o passo seguinte.\n onClick={openDrawer}\n className=\"mx-auto flex h-12 w-full max-w-3xl items-center justify-between rounded-full bg-primary px-5 font-semibold text-primary-foreground\"\n >\n <span className=\"grid h-7 min-w-7 place-items-center rounded-full bg-primary-foreground/20 px-2 text-sm tabular-nums\">\n {count}\n </span>\n <span>Ver carrinho</span>\n <span className=\"tabular-nums\">{formatMoney(subtotal, config.currency, config.locale)}</span>\n </button>\n </div>\n )}\n\n {showAddress && (\n <AddressSheet\n onClose={() => setShowAddress(false)}\n onSignIn={() => { setShowAddress(false); setShowSignIn(true) }}\n />\n )}\n {showAccount && (\n <AccountDrawer\n onClose={() => setShowAccount(false)}\n onSignIn={() => setShowSignIn(true)}\n onAddresses={() => setShowAddress(true)}\n onShowHours={() => setShowHours(true)}\n />\n )}\n {showSignIn && <SignInModal onClose={() => setShowSignIn(false)} onSignedIn={() => setShowSignIn(false)} />}\n {showHours && <ServiceHoursModal onClose={() => setShowHours(false)} />}\n {showSchedule && <ScheduleSheet onClose={() => setShowSchedule(false)} />}\n {showClosed && (\n <ClosedStoreDialog\n paused={paused}\n onClose={() => setShowClosed(false)}\n onShowHours={() => { setShowClosed(false); setShowHours(true) }}\n />\n )}\n </main>\n )\n}\n\n/**\n * Declara ao resto da vitrine que existe uma barra fixa embaixo.\n *\n * O Toaster lê `--fayz-bottom-bar` para nascer ACIMA dela. Sem isto o aviso de\n * \"adicionado\" aparece exatamente atrás do botão \"Ver carrinho\" — o aviso\n * escondido pelo botão que ele existe para oferecer.\n */\nfunction BottomBarSpace() {\n React.useEffect(() => {\n const root = document.documentElement\n root.style.setProperty('--fayz-bottom-bar', '4.5rem')\n return () => { root.style.removeProperty('--fayz-bottom-bar') }\n }, [])\n return null\n}\n","import { setShopShippingItemsResolver } from '@fayz-ai/sdk/shop'\nimport { useCartStore } from '../stores/cart.store'\n\n/**\n * Tells the freight quote what is in the cart.\n *\n * `setShopShippingItemsResolver` shipped with FAY-1301 and NOTHING installed\n * it: the quote function received `items: []` on every call and fell through to\n * a default box for every store on the platform. The box was 4×16×20cm at\n * 0,3kg — the floor Correios accepts — so a costela and an e-book were priced\n * as the same parcel, and the difference between the quote and the label came\n * out of the merchant's margin.\n *\n * A resolver rather than an argument because `delivery.store.resolve(cep,\n * subtotal)` has had that signature since before any carrier existed, and every\n * storefront in the wild calls it that way. Installed once, here, exactly like\n * `setShopAccessTokenResolver` in data/auth.ts.\n *\n * Read through `getState()` and not a hook: this runs inside a network call,\n * not a render.\n */\nexport function initShippingItems(): void {\n setShopShippingItemsResolver(() =>\n useCartStore.getState().lines.map((line) => ({\n quantity: line.quantity,\n weight: line.weight ?? null,\n weightUnit: line.weightUnit ?? null,\n height: line.heightCm ?? null,\n width: line.widthCm ?? null,\n length: line.lengthCm ?? null,\n packageId: line.packageId ?? null,\n // Undefined is a line added before this existed. Treated as physical:\n // freight wrongly charged is a complaint, freight wrongly skipped is a\n // parcel the merchant pays for.\n isPhysical: line.requiresShipping !== false,\n productId: line.productId,\n variantId: line.variantId,\n name: line.name,\n sku: line.sku,\n })),\n )\n}\n","import React from 'react'\nimport { Link } from '../app/router'\nimport { useStorefrontConfig } from '../document/config'\nimport { useStorefrontHead } from '../hooks/use-storefront-head'\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 // `data-storefront-page` is how a headless render (renderStore, M8) reports\n // that a path did not resolve, without re-deriving the routing table on the\n // server: the page that knows it is a 404 says so in the markup, once.\n <main\n data-storefront-page=\"not-found\"\n className=\"mx-auto flex min-h-[60vh] max-w-2xl flex-col items-center justify-center px-4 py-16 text-center\"\n >\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 '../app/router'\nimport { useStorefrontConfig } from '../document/config'\nimport { useStorefrontHead } from '../hooks/use-storefront-head'\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'\nimport { Link } from '../../app/router'\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 <Link to=\"/\" className=\"rounded-lg border px-5 py-2.5 text-sm font-semibold transition hover:bg-muted\">\n Voltar ao início\n </Link>\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 {toast.action && (\n <button\n type=\"button\"\n onClick={() => {\n toast.action!.onClick()\n dismiss(toast.id)\n }}\n className=\"mt-2 text-sm font-semibold text-primary underline underline-offset-2\"\n >\n {toast.action.label}\n </button>\n )}\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 // `--fayz-bottom-bar` é declarada por quem TEM uma barra fixa embaixo (o\n // cardápio, quando há carrinho). Sem isto o aviso nasce exatamente atrás\n // dela — e o aviso que anuncia o item some debaixo do botão que leva a ele.\n <div\n className=\"pointer-events-none fixed right-4 z-[70] flex flex-col gap-2\"\n style={{ bottom: 'calc(1rem + var(--fayz-bottom-bar, 0px))' }}\n >\n {toasts.map((t) => (\n <ToastCard key={t.id} toast={t} />\n ))}\n </div>\n )\n}\n","import React, { useEffect } from 'react'\nimport { StorefrontAnalytics } from '../analytics/StorefrontAnalytics'\nimport { defineEntity } from '@fayz-ai/core'\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 '../data/auth'\nimport { initShippingItems } from '../data/shipping-items'\nimport { registerStorefrontBlocks } from '../blocks/registry'\nimport { getStorefrontComponents, StorefrontConfigProvider, resolveConfig, useStorefrontConfig } from '../document/config'\nimport { StorefrontConfigHost } from '../document/store-policy'\nimport type { StorefrontConfig, StorefrontDiscountConfig } from '../document/config'\nimport type { StorefrontComponents } from '../extend/component-contracts'\nimport type { StorefrontSection } from '../blocks/sections'\nimport {\n matchPath,\n useRoutePath,\n useRouterAdapter,\n useScrollToTopOnNavigate,\n shellRouterAdapter,\n StorefrontRouterProvider,\n} from './router'\nimport { defaultRouterAdapter } from '@fayz-ai/core'\nimport type { RouterAdapter } from '@fayz-ai/core'\nimport { useCartStore } from '../stores/cart.store'\nimport { StorefrontThemeStyle } from '../lib/theme'\nimport { StorefrontHeader } from '../components/layout/StorefrontHeader'\nimport { StorefrontFooter } from '../components/layout/StorefrontFooter'\nimport { CartDrawer } from '../components/cart/CartDrawer'\nimport { StorefrontPage } from '../views/StorefrontPage'\nimport { ContentPage } from '../views/ContentPage'\nimport { matchContentPage } from '../blocks/page-blocks'\nimport { resolveStorefrontRoute } from './serving'\nimport { overrideComponent, overrideProps, resolveOverride } from '../extend/component-override'\nimport { MenuPage } from '../views/MenuPage'\nimport { rememberReturnPath } from './return-path'\nimport { NotFoundPage } from '../views/NotFoundPage'\nimport { PolicyPage } from '../views/PolicyPage'\nimport { StorefrontErrorBoundary } from '../components/layout/StorefrontErrorBoundary'\n\n// The per-shopper pages — checkout, the order confirmation, the shopper's own\n// purchases — are code-split. They never render on the server (their state is\n// the browser's cart and session; see isPublicPath) and most visits never open\n// them, yet as static imports they sat in the entry bundle every first page\n// view downloads and parses before it can hydrate: the menu paid for the whole\n// checkout. They load on navigation, with a placeholder that holds the space.\nconst CheckoutPage = React.lazy(() => import('../views/CheckoutPage').then((m) => ({ default: m.CheckoutPage })))\nconst OrderConfirmationPage = React.lazy(() =>\n import('../views/OrderConfirmationPage').then((m) => ({ default: m.OrderConfirmationPage })),\n)\nconst MyPurchasesPage = React.lazy(() => import('../views/MyPurchasesPage').then((m) => ({ default: m.MyPurchasesPage })))\n\nfunction PrivatePage({ children }: { children: React.ReactNode }) {\n return (\n <React.Suspense fallback={<div aria-busy=\"true\" className=\"min-h-[70vh]\" data-testid=\"private-page-loading\" />}>\n {children}\n </React.Suspense>\n )\n}\nimport { Toaster } from '../components/layout/Toaster'\n\n/**\n * Quanta moldura esta rota recebe.\n *\n * O cardápio pede `minimal` e não `focused`. A distração no cardápio nunca foi\n * a moldura inteira — era só a NAVEGAÇÃO editorial oferecendo saídas\n * (\"Receitas\", \"Para revenda\") no meio de uma compra. O anúncio de promoção e\n * o rodapé continuam fazendo o trabalho deles.\n *\n * `focused` levaria junto marca, carrinho, anúncio e rodapé, e transformaria\n * o cardápio num beco sem os avisos que vendem. `minimal` recolhe a navegação\n * e mantém o resto — que é exatamente o recorte que o padrão medido usa: a\n * moldura do site por cima, e o card da loja começando o fluxo logo abaixo.\n */\nfunction routeChrome(\n config: ReturnType<typeof useStorefrontConfig>,\n path: string,\n): 'default' | 'minimal' | 'focused' {\n const match = resolveStorefrontRoute(config, path)\n if (match.kind === 'custom') {\n if (match.route.chrome) return match.route.chrome\n return match.route.kind === 'checkout' ? 'focused' : 'default'\n }\n if (match.kind === 'checkout') return 'focused'\n if (match.kind === 'menu') return 'minimal'\n return 'default'\n}\n\nfunction RouteSwitch({ path }: { path: string }) {\n const config = useStorefrontConfig()\n // One route table (serving.ts), shared with cacheability, prerender path\n // enumeration and any host asking whether a URL exists. Resolving separately\n // here is how a page gets rendered as one thing and cached as another.\n const match = resolveStorefrontRoute(config, path)\n\n // Lembra a última tela de COMPRA para o \"voltar\" do checkout. Checkout e\n // confirmação ficam de fora de propósito: voltar do checkout para o checkout\n // é o laço que o botão existe para evitar.\n const isShopping = match.kind !== 'checkout' && match.kind !== 'order'\n useEffect(() => {\n if (isShopping) rememberReturnPath(path)\n }, [isShopping, path])\n\n switch (match.kind) {\n case 'custom': {\n const CustomRoute = match.route.component\n return <CustomRoute path={path} params={match.params} config={config} />\n }\n case 'product':\n return <StorefrontPage kind=\"product\" page={config.pages.product} params={match.params} />\n case 'order':\n return <PrivatePage><OrderConfirmationPage orderId={match.params.id!} /></PrivatePage>\n // A disabled feature owns its URL but renders nothing behind it, rather\n // than leaking to an unrelated page.\n case 'checkout':\n return config.features.checkout ? <PrivatePage><CheckoutPage /></PrivatePage> : <NotFoundPage />\n case 'account':\n return config.features.accounts ? <PrivatePage><MyPurchasesPage /></PrivatePage> : <NotFoundPage />\n // O cardápio do modo delivery. A rota já só resolve dentro do modo\n // (serving.ts testa `resolved.delivery`), então aqui não há segundo guard —\n // dois lugares decidindo a mesma coisa é como eles passam a discordar.\n case 'menu':\n return <MenuPage />\n case 'catalog':\n // The search results page IS the catalog, filtered — where the overlay's\n // CTA lands, carrying `?q=`.\n case 'searchResults':\n return <StorefrontPage kind=\"catalog\" page={config.pages.catalog} />\n case 'policy':\n return <PolicyPage kind={match.policy} />\n case 'content': {\n const content = matchContentPage(config.pages, path)\n return content ? (\n <ContentPage slug={content.slug} page={content.page} params={content.params} />\n ) : (\n <NotFoundPage />\n )\n }\n // Root renders home, or the catalog when there is no home page.\n case 'home':\n return config.pages.home ? (\n <StorefrontPage kind=\"home\" page={config.pages.home} />\n ) : (\n <StorefrontPage kind=\"catalog\" page={config.pages.catalog} />\n )\n case 'notFound':\n return <NotFoundPage />\n }\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 minSubtotal: null,\n appliesTo: 'all',\n productIds: [],\n categoryIds: [],\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 const promotions = [...(config.catalog?.promotions ?? []), ...(config.promotions ?? [])]\n if (!config.catalog && configDiscounts.length === 0 && promotions.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 // Document/config promotions reach the mock provider, so evaluatePromotions\n // answers from the same data the promotions section carries — no DB.\n promotions,\n }\n}\n\n/**\n * Register the config's declared entities.\n *\n * They register BEFORE the provider exists: the mock provider's entity stores\n * validate their seed against these declarations, and the `entity.*` loaders\n * resolve them at read time (I2 for unknown keys). Shared with the headless\n * renderer so a preview of an entity-backed page reads the same declarations\n * the live store does.\n */\nexport function registerStorefrontEntities(config: StorefrontConfig): void {\n for (const [key, declaration] of Object.entries(config.entities ?? {})) {\n defineEntity(key, declaration, { source: 'app' })\n }\n}\n\n/**\n * The shop provider a config implies: its explicit provider, or a mock seeded\n * from its catalog, discounts and declared promotions.\n *\n * Extracted so `renderStore` binds the SAME provider the browser runtime would\n * — a headless render that invented its own data source would preview a store\n * nobody ships.\n */\nexport function resolveStorefrontProvider(config: StorefrontConfig): ShopProvider {\n return config.provider ?? createMockShopProvider(buildMockSeed(config))\n}\n\nexport function initStorefrontRuntime(config: StorefrontConfig): void {\n registerStorefrontBlocks()\n registerStorefrontEntities(config)\n if (resolveConfig(config).features.accounts) {\n initCustomerAuth(resolveAuthAdapter(config.auth, {\n supabaseUrl: config.supabaseUrl,\n supabaseAnonKey: config.supabaseAnonKey,\n }))\n }\n\n setShopProvider(resolveStorefrontProvider(config))\n\n // The freight quote asks the cart what it is carrying. Registered here rather\n // than lazily at the first quote because the resolver has to be in place\n // before the product page's first postcode, which happens without a click.\n initShippingItems()\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 // Browser-only, and guarded twice on purpose. A persisted cart is per-shopper\n // state that must never be established in a shared server process, and\n // zustand does not attach the `persist` API at all when no storage backend\n // exists — so on a server this line threw before it could do anything wrong.\n // That made `initStorefrontRuntime` uncallable from a universal entry, which\n // is exactly where an SSR host has to call it.\n if (typeof window !== 'undefined' && useCartStore.persist) {\n if (useCartStore.persist.hasHydrated()) reconcileCart()\n else useCartStore.persist.onFinishHydration(reconcileCart)\n }\n\n if (config.supabaseUrl || config.supabaseAnonKey) {\n console.warn(\n '@fayz-ai/shop: supabaseUrl/supabaseAnonKey are legacy fields. Pass an explicit provider/adapter or use the Fayz SDK broker path.',\n )\n }\n}\n\nexport interface StorefrontShellProps {\n /**\n * Addressing scheme and history owner. Omitted → hash addressing in a\n * browser, or a static adapter bound to `path` when one is given. Supply one\n * to serve the store at real URLs, or to hand history to a host router.\n */\n router?: RouterAdapter\n /**\n * Render this path instead of the live hash location.\n *\n * The headless seam (spine M8): `renderStore` and the preview server drive\n * the shell by path, so a static render never depends on a global\n * `window.location` and one process can render many paths — including\n * concurrently, which a location-mutating renderer could not.\n */\n path?: string\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({ path: pathOverride, router }: StorefrontShellProps = {}) {\n const live = useRouterAdapter()\n // `router` and `path` answer different questions and must both be honoured:\n // the adapter owns addressing and history (how a link is written, where a\n // click goes), while `path` owns WHICH page renders. Letting the adapter win\n // both made `path` dead whenever a host supplied a router — so a host that\n // asked for the not-found page got the page for the URL in the address bar\n // instead, rendered with no data, i.e. a skeleton that never resolves.\n const adapter = router ?? shellRouterAdapter(pathOverride, live)\n return (\n <StorefrontRouterProvider value={adapter}>\n <StorefrontShellBody pathOverride={pathOverride} />\n </StorefrontRouterProvider>\n )\n}\n\nfunction StorefrontShellBody({ pathOverride }: { pathOverride?: string }) {\n const config = useStorefrontConfig()\n const livePath = useRoutePath()\n const path = pathOverride ?? livePath\n useScrollToTopOnNavigate(path)\n const chrome = routeChrome(config, path)\n // Só 'focused' apaga a moldura. 'minimal' MANTÉM o cabeçalho — ele é quem\n // recolhe a navegação de marketing e segura marca, busca e carrinho.\n const focused = chrome === 'focused'\n const components = getStorefrontComponents(config)\n const chromeProps = { config, commerceMode: config.commerceMode, chrome }\n const header = resolveOverride(components.Header, StorefrontHeader)\n const footer = resolveOverride(components.Footer, StorefrontFooter)\n // The Shell has no SDK default — the plain wrapper below is not a component —\n // so it is component-or-nothing rather than a resolveOverride fallback.\n const Shell = overrideComponent(components.Shell)\n const shellProps = overrideProps(components.Shell)\n\n const body = (\n <>\n {config.theme && <StorefrontThemeStyle theme={config.theme} />}\n {!focused && <header.Component {...chromeProps} {...header.props} />}\n <StorefrontErrorBoundary key={path}>\n <RouteSwitch path={path} />\n </StorefrontErrorBoundary>\n {!focused && config.features.cart && <CartDrawer />}\n {!focused && <footer.Component {...chromeProps} {...footer.props} />}\n <Toaster />\n <StorefrontAnalytics config={config} path={path} />\n </>\n )\n\n if (Shell) {\n return (\n <Shell {...chromeProps} {...shellProps}>\n {body}\n </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 // Built once, not per render: an adapter owns its subscriber list, so a fresh\n // instance each render would bind a new listener and orphan the old one.\n const router = defaultRouterAdapter(resolved.routing ?? 'hash')\n\n function StorefrontApp() {\n return (\n <StorefrontConfigHost config={resolved}>\n <StorefrontShell router={router} />\n </StorefrontConfigHost>\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"]}