@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 +1 @@
1
- {"version":3,"sources":["../src/lib/format.ts","../src/stores/session.store.ts","../src/data/auth.ts","../src/lib/testids.ts","../src/components/SmoothImage.tsx","../src/hooks/use-storefront-head.ts"],"names":[],"mappings":"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","file":"chunk-2D5BEM43.js","sourcesContent":["export function formatMoney(value: number, currency = 'BRL', locale = 'pt-BR'): string {\n return new Intl.NumberFormat(locale, { style: 'currency', currency }).format(value)\n}\n\nexport function roundCents(value: number): number {\n return Math.round(value * 100) / 100\n}\n","import { create } from 'zustand'\nimport { persist } from 'zustand/middleware'\n\n// Customer session state. Identity is established through the shared\n// @fayz-ai/auth AuthAdapter (see ../auth.ts) — this store only mirrors the\n// linked ShopCustomer for synchronous UI access.\n\nexport interface SessionState {\n customerId: string | null\n email: string | null\n name: string | null\n setSession(session: { customerId: string; email: string; name?: string | null }): void\n signOut(): void\n}\n\nexport const useSessionStore = create<SessionState>()(\n persist(\n (set) => ({\n customerId: null,\n email: null,\n name: null,\n setSession: ({ customerId, email, name }) =>\n set({ customerId, email, name: name ?? null }),\n signOut: () => set({ customerId: null, email: null, name: null }),\n }),\n { name: 'fayz.storefront.session.v1' },\n ),\n)\n","import type { AuthAdapter, AuthUser } from '@fayz-ai/core'\nimport { createMockAuthAdapter } from '@fayz-ai/auth'\nimport type { AuthPluginOptions } from '@fayz-ai/auth/domain/auth-config'\nimport { getShopProvider } from '@fayz-ai/shop/runtime'\nimport { setShopAccessTokenResolver } from '@fayz-ai/sdk/shop'\nimport { useSessionStore } from '../stores/session.store'\n\n// ---------------------------------------------------------------------------\n// Customer auth — the SAME AuthAdapter contract createSaasApp uses, so the\n// mock and Supabase adapters from @fayz-ai/auth serve both the saas admin and\n// the storefront customer. The storefront adds one layer on top: linking the\n// auth identity to a ShopCustomer record (find-or-create by email) so orders\n// and purchase history attach to a customer.\n// ---------------------------------------------------------------------------\n\nexport type StorefrontAuthAdapter = AuthAdapter | 'mock' | 'supabase' | (string & {})\n\n/** Thrown by signUpCustomer when the adapter reports a user but no live\n * session (Supabase's signal for \"email confirmation required\" — see\n * createSupabaseAuthAdapter's signUp, which returns accessToken: '' instead\n * of null/an error). Signup succeeded; the customer just isn't authenticated\n * yet, so we must not link/persist a session for them. */\nexport class EmailConfirmationRequiredError extends Error {\n readonly email: string\n\n constructor(email: string) {\n super('Cadastro realizado. Confirme seu e-mail para continuar.')\n this.name = 'EmailConfirmationRequiredError'\n this.email = email\n }\n}\n\nexport interface StorefrontAuthConfig {\n adapter?: AuthPluginOptions['adapter']\n provider?: AuthPluginOptions['provider']\n routes?: AuthPluginOptions['routes']\n supabase?: AuthPluginOptions['supabase']\n}\n\nlet _adapter: AuthAdapter | null = null\n\nfunction isAuthAdapter(value: unknown): value is AuthAdapter {\n return Boolean(\n value &&\n typeof value === 'object' &&\n 'getSession' in value &&\n 'signIn' in value &&\n 'signOut' in value,\n )\n}\n\nfunction normalizeAuthConfig(\n configured: StorefrontAuthAdapter | StorefrontAuthConfig | undefined,\n): StorefrontAuthConfig {\n if (!configured) return {}\n if (typeof configured === 'string' || isAuthAdapter(configured)) return { adapter: configured }\n return configured\n}\n\nexport function resolveAuthAdapter(\n configured: StorefrontAuthAdapter | StorefrontAuthConfig | undefined,\n fallback?: { supabaseUrl?: string; supabaseAnonKey?: string },\n): AuthAdapter {\n const config = normalizeAuthConfig(configured)\n if (isAuthAdapter(config.adapter)) return config.adapter\n const provider = config.provider ?? config.adapter ?? (fallback?.supabaseUrl ? 'supabase' : 'mock')\n if (provider !== 'supabase') return createMockAuthAdapter()\n // The Supabase adapter pulls @supabase/supabase-js (auth, realtime, storage:\n // ~190 KB raw) — the largest library a storefront page loaded, and one the\n // first render never uses: the server already sent the page's data. It is\n // loaded on first use instead (the session restore at boot asks right away,\n // but from its own chunk, after the entry has run).\n return createLazyAuthAdapter(() =>\n import('@fayz-ai/auth/lib/runtime').then(\n ({ createAuthRuntime }) =>\n createAuthRuntime({\n provider: 'supabase',\n routes: config.routes,\n requireAuth: false,\n supabase: {\n url: config.supabase?.url ?? fallback?.supabaseUrl,\n anonKey: config.supabase?.anonKey ?? fallback?.supabaseAnonKey,\n client: config.supabase?.client,\n callbackUrl: config.supabase?.callbackUrl,\n resetPasswordUrl: config.supabase?.resetPasswordUrl,\n },\n }).adapter,\n ),\n )\n}\n\n/**\n * An AuthAdapter whose implementation is loaded on first use. Every method but\n * `onAuthStateChange` is async already, so callers cannot tell; the listener is\n * attached once the real adapter is there, and its unsubscribe works before or\n * after that.\n */\nexport function createLazyAuthAdapter(load: () => Promise<AuthAdapter>): AuthAdapter {\n let loading: Promise<AuthAdapter> | null = null\n const real = () => (loading ??= load())\n const call =\n <K extends keyof AuthAdapter>(name: K) =>\n async (...args: unknown[]) => {\n const adapter = await real()\n const fn = adapter[name] as ((...a: unknown[]) => unknown) | undefined\n if (typeof fn !== 'function') throw new Error(`[storefront] the auth adapter has no ${String(name)}`)\n return fn.apply(adapter, args)\n }\n return {\n getSession: call('getSession'),\n signIn: call('signIn'),\n signUp: call('signUp'),\n signOut: call('signOut'),\n signInWithOAuth: call('signInWithOAuth'),\n resetPassword: call('resetPassword'),\n updatePassword: call('updatePassword'),\n handleCallback: call('handleCallback'),\n inviteUser: call('inviteUser'),\n resendConfirmation: call('resendConfirmation'),\n adoptSession: call('adoptSession'),\n onAuthStateChange(cb) {\n let unsubscribe: (() => void) | null = null\n let cancelled = false\n void real()\n .then((adapter) => {\n if (!cancelled) unsubscribe = adapter.onAuthStateChange(cb)\n })\n .catch(() => {})\n return () => {\n cancelled = true\n unsubscribe?.()\n }\n },\n } as AuthAdapter\n}\n\n// The shopper's current access token, handed to the shop REST client so its\n// requests reach PostgREST as the signed-in user instead of as `anon`. Held\n// here rather than in the session store because it is a credential: it must not\n// be persisted to localStorage alongside the customer id. The Supabase client\n// owns its own refresh; this is only a mirror of the live value.\nlet _accessToken: string | null = null\n\n/** Whether an authenticated identity was ever seen this session. Distinguishes\n * \"signed out\" from \"was never signed in\" — see the onAuthStateChange guard. */\nlet _hadAuthUser = false\n\n/** Refresh the mirrored token from the adapter. Safe to call on any event. */\nasync function syncAccessToken(adapter: AuthAdapter): Promise<void> {\n try {\n const existing = await adapter.getSession()\n _accessToken = existing?.session.accessToken ?? null\n } catch {\n _accessToken = null\n }\n}\n\n/** Called once by createStorefrontApp. Restores any persisted session. */\nexport function initCustomerAuth(adapter: AuthAdapter): void {\n _adapter = adapter\n\n // Registered before the first await so no request can slip out anonymously\n // while the session is still being restored.\n setShopAccessTokenResolver(() => _accessToken)\n\n adapter\n .getSession()\n .then((existing) => {\n _accessToken = existing?.session.accessToken ?? null\n if (!existing) return\n _hadAuthUser = true\n // Every boot, not only on an email change: the persisted id goes stale\n // with the same email, and this call is what writes auth_user_id, which\n // the phone/CPF prefill and save both filter on.\n void linkCustomer(existing.user).catch(() => {})\n })\n .catch(() => {})\n\n adapter.onAuthStateChange((user) => {\n if (!user) {\n _accessToken = null\n // Only tear down the shop session if there WAS an authenticated identity\n // to lose. The Supabase adapter fires this once on boot with a null user\n // (INITIAL_SESSION), and clearing unconditionally wiped the guest's local\n // session on every page load — a guest who checked out could no longer\n // find their order after a reload. The mock adapter never surfaced this\n // because it always restored a session.\n if (_hadAuthUser) {\n _hadAuthUser = false\n useSessionStore.getState().signOut()\n }\n return\n }\n _hadAuthUser = true\n // Covers token refresh too, not just sign-in: the callback carries the user\n // but not the token, and a stale token would 401 every read an hour in.\n // Magic link / OAuth sign-ins arrive only here; link once the token is live.\n const linked = useSessionStore.getState()\n const needsLink = !linked.customerId\n || (linked.email ?? '').toLowerCase() !== (user.email ?? '').toLowerCase()\n void syncAccessToken(adapter).then(() => {\n if (needsLink && user.email) return linkCustomer(user).then(() => undefined)\n }).catch(() => {})\n })\n}\n\n/** True once an authenticated shopper identity has been seen this session. */\nexport function hasCustomerAuth(): boolean {\n return _hadAuthUser\n}\n\n/** Re-resolve the signed-in shopper's row (phone and document included) and re-point the session at it. */\nexport async function relinkCustomer(): Promise<{ customerId: string; phone: string | null; document: string | null } | null> {\n if (!_hadAuthUser) return null\n const existing = await getCustomerAuthAdapter().getSession().catch(() => null)\n if (!existing?.user.email) return null\n const customer = await resolveShopCustomer(existing.user.email.trim().toLowerCase(), existing.user.fullName ?? '')\n const store = useSessionStore.getState()\n store.setSession({ customerId: customer.id, email: existing.user.email.trim().toLowerCase(), name: store.name })\n return { customerId: customer.id, phone: customer.phone ?? null, document: customer.document ?? null }\n}\n\nexport function getCustomerAuthAdapter(): AuthAdapter {\n if (!_adapter) _adapter = createMockAuthAdapter()\n return _adapter\n}\n\n/** Resolve (find-or-create + server-side auth link) the ShopCustomer for an email. */\nasync function resolveShopCustomer(email: string, name: string) {\n const provider = getShopProvider()\n // Preferred: provider.resolveCustomer find-or-creates AND links auth.uid\n // server-side (RLS-safe). Falls back to generic CRUD for legacy providers.\n if (provider.resolveCustomer) return provider.resolveCustomer({ email, name })\n const matches = await provider.listCustomers({ search: email, limit: 10 })\n const existing = matches.find((c) => (c.email ?? '').toLowerCase() === email)\n if (existing) return existing\n const parts = name.trim().split(/\\s+/).filter(Boolean)\n return provider.createCustomer({\n firstName: parts[0] ?? email.split('@')[0] ?? 'Cliente',\n lastName: parts.slice(1).join(' '),\n email,\n })\n}\n\n/** Find-or-create the ShopCustomer for an auth identity and persist the session. */\nasync function linkCustomer(user: AuthUser, fullName?: string): Promise<{ customerId: string }> {\n const email = (user.email ?? '').trim().toLowerCase()\n const name = fullName ?? user.fullName ?? ''\n const customer = await resolveShopCustomer(email, name)\n useSessionStore.getState().setSession({\n customerId: customer.id,\n email,\n name: name || `${customer.firstName} ${customer.lastName}`.trim(),\n })\n return { customerId: customer.id }\n}\n\nexport interface EstablishSessionOptions {\n /** Provided → adapter.signIn; omitted → passwordless customer identity via signUp (mock-friendly). */\n password?: string\n name?: string\n}\n\n/**\n * Sign a customer in through the auth adapter and link the ShopCustomer.\n * Used by the account page sign-in AND by checkout (so a buyer is signed in\n * for \"my purchases\" immediately after purchase) — one auth path, two doors.\n */\nexport async function establishCustomerSession(\n email: string,\n opts?: EstablishSessionOptions,\n): Promise<{ customerId: string }> {\n const normalized = email.trim().toLowerCase()\n if (opts?.password) {\n const adapter = getCustomerAuthAdapter()\n const session = await adapter.signIn(normalized, opts.password)\n // Before linkCustomer, not after: linkCustomer calls shop_resolve_customer,\n // which reads auth.uid() to fill auth_user_id. Sent with the old token that\n // link silently no-ops and the account stays unlinked forever.\n _accessToken = session.accessToken ?? null\n _hadAuthUser = true\n return linkCustomer(session.user.email ? session.user : { ...session.user, email: normalized }, opts.name)\n }\n // Guest / passwordless checkout: do NOT create an auth account (that made\n // returning guests fail with \"user already registered\" on Supabase). Just\n // resolve the ShopCustomer and persist the local session for order history.\n return linkCustomer({ id: '', email: normalized } as AuthUser, opts?.name)\n}\n\n/** Convenience wrapper — passwordless email sign-in (guest checkout path). */\nexport function signInByEmail(email: string, name?: string): Promise<{ customerId: string }> {\n return establishCustomerSession(email, { name })\n}\n\n/** Explicit account creation (account page \"Criar conta\" form). */\nexport async function signUpCustomer(\n email: string,\n password: string,\n name: string,\n): Promise<{ customerId: string }> {\n const adapter = getCustomerAuthAdapter()\n const normalized = email.trim().toLowerCase()\n const session = await adapter.signUp(normalized, password, name)\n // Empty accessToken == account created but not authenticated (email\n // confirmation pending). Do NOT link/persist a session for an unconfirmed\n // user — see EmailConfirmationRequiredError.\n if (!session.accessToken) throw new EmailConfirmationRequiredError(normalized)\n _accessToken = session.accessToken\n _hadAuthUser = true\n return linkCustomer(session.user.email ? session.user : { ...session.user, email: normalized }, name)\n}\n\nexport async function signOutCustomer(): Promise<void> {\n try {\n await getCustomerAuthAdapter().signOut()\n } finally {\n _accessToken = null\n _hadAuthUser = false\n useSessionStore.getState().signOut()\n }\n}\n","// Single source of truth for e2e selectors. Components import from here;\n// Playwright specs assert against the same constants — they cannot drift.\nexport const TID = {\n // header\n headerSearch: 'header-search',\n headerSearchToggle: 'header-search-toggle',\n searchOverlay: 'search-overlay',\n searchOverlayInput: 'search-overlay-input',\n searchOverlayClose: 'search-overlay-close',\n searchOverlayCta: 'search-overlay-cta',\n searchSuggestion: 'search-suggestion',\n cartButton: 'cart-button',\n cartCount: 'cart-count',\n accountLink: 'account-link',\n accountDropdown: 'account-dropdown',\n announcementBar: 'announcement-bar',\n navLink: (label: string) => `nav-${label.toLowerCase().replace(/\\s+/g, '-')}`,\n navCategory: (slug: string) => `nav-cat-${slug}`,\n accountName: 'account-name',\n // home sections\n hero: 'home-hero',\n heroPrev: 'hero-prev',\n heroNext: 'hero-next',\n mediaCarousel: 'media-carousel',\n mediaCarouselPrev: 'media-carousel-prev',\n mediaCarouselNext: 'media-carousel-next',\n productSlider: 'product-slider',\n productSliderViewport: 'product-slider-viewport',\n productSliderPrev: 'product-slider-prev',\n productSliderNext: 'product-slider-next',\n categoryShowcase: 'category-showcase',\n productRail: 'product-rail',\n entityList: 'entity-list',\n benefits: 'benefits-row',\n promoBanner: 'promo-banner',\n manifesto: 'manifesto',\n testimonials: 'testimonials',\n newsletter: 'newsletter',\n newsletterEmail: 'newsletter-email',\n newsletterSubmit: 'newsletter-submit',\n newsletterDone: 'newsletter-done',\n formBlock: 'form-block',\n formBlockField: (id: string) => `form-block-field-${id}`,\n formBlockSubmit: 'form-block-submit',\n formBlockSuccess: 'form-block-success',\n formBlockError: 'form-block-error',\n // collection / campaign page blocks\n collectionHero: 'collection-hero',\n collectionHeroCta: 'collection-hero-cta',\n productSpotlight: 'product-spotlight',\n productSpotlightCta: 'product-spotlight-cta',\n motifStrip: 'motif-strip',\n collectionCta: 'collection-cta',\n collectionCtaButton: 'collection-cta-button',\n // catalog\n productGrid: 'product-grid',\n productCard: 'product-card',\n productCardName: 'product-card-name',\n productCardPrice: 'product-card-price',\n productCardAdd: 'product-card-add',\n badgeSale: 'badge-sale',\n badgeSoldout: 'badge-soldout',\n // filters\n filterCategory: (slug: string) => `filter-category-${slug}`,\n filterPriceMin: 'filter-price-min',\n filterPriceMax: 'filter-price-max',\n filterInstock: 'filter-instock',\n sortSelect: 'sort-select',\n filtersClear: 'filters-clear',\n // product detail\n pdpName: 'pdp-name',\n pdpPrice: 'pdp-price',\n pdpComparePrice: 'pdp-compare-price',\n pdpDescription: 'pdp-description',\n productOptionGroup: (id: string) => `product-option-${id.toLowerCase().replace(/\\s+/g, '-')}`,\n productOptionValue: (id: string, value: string) => `product-option-${id.toLowerCase().replace(/\\s+/g, '-')}-${value.toLowerCase().replace(/\\s+/g, '-')}`,\n pdpQtyInput: 'pdp-qty-input',\n pdpAddToCart: 'pdp-add-to-cart',\n pdpRoot: 'pdp-root',\n pdpGallery: 'pdp-gallery',\n pdpGalleryImage: 'pdp-gallery-image',\n pdpGalleryThumbs: 'pdp-gallery-thumbs',\n pdpGalleryThumb: 'pdp-gallery-thumb',\n pdpActions: 'pdp-actions',\n pdpEnquiryButton: 'pdp-enquiry-button',\n enquiryForm: 'enquiry-form',\n enquiryName: 'enquiry-name',\n enquiryEmail: 'enquiry-email',\n enquiryPhone: 'enquiry-phone',\n enquirySubject: 'enquiry-subject',\n enquiryMessage: 'enquiry-message',\n enquirySubmit: 'enquiry-submit',\n enquirySuccess: 'enquiry-success',\n enquiryError: 'enquiry-error',\n // cart\n cartDrawer: 'cart-drawer',\n cartLinesList: 'cart-lines-list',\n cartFooter: 'cart-footer',\n cartLine: 'cart-line',\n lineQty: 'line-qty',\n lineInc: 'line-inc',\n lineDec: 'line-dec',\n lineRemove: 'line-remove',\n cartSubtotal: 'cart-subtotal',\n discountInput: 'discount-input',\n discountApply: 'discount-apply',\n discountRow: 'discount-row',\n discountError: 'discount-error',\n cartShipping: 'cart-shipping',\n shippingProgress: 'shipping-progress',\n cartTotal: 'cart-total',\n goCheckout: 'go-checkout',\n cartEmpty: 'cart-empty',\n // menu / delivery mode (0094)\n menuPage: 'menu-page',\n menuSection: (slug: string) => `menu-section-${slug}`,\n menuItem: (slug: string) => `menu-item-${slug}`,\n menuQuickAdd: (slug: string) => `menu-quick-add-${slug}`,\n devPlaceOrderWithoutCharge: 'dev-place-order-without-charge',\n menuCartBar: 'menu-cart-bar',\n menuItemSoldOut: 'menu-sold-out',\n itemSheet: 'item-sheet',\n itemSheetNotes: 'item-sheet-notes',\n itemSheetNotesCount: 'item-sheet-notes-count',\n itemSheetQty: 'item-sheet-qty',\n itemSheetAdd: 'item-sheet-add',\n serviceStatus: 'service-status',\n serviceHoursModal: 'service-hours-modal',\n serviceClosedGate: 'service-closed-gate',\n fulfillmentMode: (mode: string) => `fulfillment-mode-${mode}`,\n scheduleSheet: 'schedule-sheet',\n scheduleSlot: (iso: string) => `schedule-slot-${iso}`,\n storeCover: 'store-cover',\n menuSearch: 'menu-search',\n menuCategoryNav: 'menu-category-nav',\n menuCategoryLink: (slug: string) => `menu-category-link-${slug}`,\n menuHighlights: 'menu-highlights',\n menuItemBadge: (slug: string) => `menu-item-badge-${slug}`,\n deliveryTabBar: 'delivery-tab-bar',\n deliveryTab: (key: string) => `delivery-tab-${key}`,\n addressStrip: 'address-strip',\n addressSheet: 'address-sheet',\n addressCep: 'address-cep',\n addressNumber: 'address-number',\n addressComplement: 'address-complement',\n addressReference: 'address-reference',\n addressSave: 'address-save',\n addressAddNew: 'address-add-new',\n savedAddress: (id: string) => `saved-address-${id}`,\n itemSheetGroup: (label: string) => `item-sheet-group-${label}`,\n // delivery estimate (product page + cart)\n deliveryEstimator: 'delivery-estimator',\n deliveryCepInput: 'delivery-cep-input',\n deliveryCepSubmit: 'delivery-cep-submit',\n deliveryOption: 'delivery-option',\n deliveryUnserved: 'delivery-unserved',\n deliveryError: 'delivery-error',\n deliveryAddress: 'delivery-address',\n deliveryClear: 'delivery-clear',\n // checkout\n checkoutEmail: 'checkout-email',\n checkoutName: 'checkout-name',\n checkoutDocument: 'checkout-document',\n checkoutStreet: 'checkout-street',\n checkoutCity: 'checkout-city',\n checkoutZip: 'checkout-zip',\n checkoutCard: 'checkout-card',\n checkoutExpiry: 'checkout-expiry',\n checkoutCvc: 'checkout-cvc',\n placeOrder: 'place-order',\n // checkout em passos\n checkoutSteps: 'checkout-steps',\n checkoutStep: (n: number) => `checkout-step-${n}`,\n checkoutPayment: 'checkout-payment',\n checkoutPaymentTotal: 'checkout-payment-total',\n checkoutContinue: 'checkout-continue',\n checkoutBack: 'checkout-back',\n checkoutDone: 'checkout-done',\n // payment step\n pixPanel: 'pix-panel',\n pixCode: 'pix-code',\n pixCopy: 'pix-copy',\n pixConfirm: 'pix-confirm',\n checkoutError: 'checkout-error',\n checkoutProcessing: 'checkout-processing',\n // confirmation\n orderNumber: 'order-number',\n orderStatus: 'order-status',\n orderTracking: 'order-tracking',\n orderTrackingStep: (step: string) => `order-tracking-step-${step}`,\n orderTotal: 'order-total',\n viewPurchases: 'view-purchases',\n // account\n customerAccountShell: 'customer-account-shell',\n customerAccountMenu: 'customer-account-menu',\n orderDetail: 'order-detail',\n authTabSignin: 'auth-tab-signin',\n authTabSignup: 'auth-tab-signup',\n signinEmail: 'signin-email',\n signinPassword: 'signin-password',\n signinPasswordConfirm: 'signin-password-confirm',\n signinName: 'signin-name',\n signinSubmit: 'signin-submit',\n authError: 'auth-error',\n authNotice: 'auth-notice',\n checkoutExpired: 'checkout-expired',\n purchasesList: 'purchases-list',\n purchaseItem: 'purchase-item',\n purchasesEmpty: 'purchases-empty',\n signout: 'signout',\n} as const\n","import React from 'react'\nimport { imageSrcSet, imageVariantUrl, isStorageImageUrl, IMAGE_SRCSET_WIDTHS } from '@fayz-ai/shop'\nimport { useStorefrontConfigOptional, type StorefrontImageLoadingConfig } from '../document/config'\n\n/**\n * How large the image is drawn, so the browser can pick a variant.\n *\n * `width` — a fixed slot (a thumbnail): one variant at that width, at 2× for\n * dense screens. `sizes` — a fluid slot (a card, the gallery): the full\n * srcset ladder plus the CSS `sizes` hint. Both only take effect when the\n * store serves variants (`imageLoading.transform`) and the URL is a storage\n * object; otherwise the one file is loaded, as before.\n */\nexport interface SmoothImageVariant {\n width?: number\n sizes?: string\n widths?: readonly number[]\n quality?: number\n}\n\nexport interface SmoothImageProps extends React.ImgHTMLAttributes<HTMLImageElement> {\n imageLoading?: StorefrontImageLoadingConfig\n variant?: SmoothImageVariant\n}\n\n/**\n * Has the app finished its first client render?\n *\n * The fade is a CLIENT entrance: an image that mounts while the shopper is\n * already looking at the store should arrive softly. An image that came down\n * in the server's HTML is a different thing — it is already on the page, and\n * starting it at `opacity: 0` means the browser holds a blank rectangle from\n * first paint until JavaScript has hydrated and the file has loaded. On the\n * Artorius catalogue that was eight blank cards for about a second, on a page\n * whose HTML had described them all along.\n *\n * So the reveal is skipped for the first render — the one the server also\n * performed, which keeps hydration matching — and applies to every mount after\n * it. Module scope, and only ever written from an effect: on the server it\n * stays false for the life of the worker, which is what makes the server's\n * markup and the client's first pass agree.\n */\nlet clientMounted = false\n\nexport function SmoothImage({\n imageLoading,\n variant,\n loading = 'lazy',\n decoding = 'async',\n onLoad,\n style,\n src,\n srcSet,\n sizes,\n ...props\n}: SmoothImageProps) {\n const config = useStorefrontConfigOptional()\n const resolved = {\n ...config?.imageLoading,\n ...imageLoading,\n }\n const mode = resolved.mode ?? 'fade'\n const durationMs = resolved.durationMs ?? 420\n const easing = resolved.easing ?? 'cubic-bezier(0.22, 1, 0.36, 1)'\n const blur = resolved.blur ?? true\n const transform = resolved.transform ?? 'none'\n const ref = React.useRef<HTMLImageElement | null>(null)\n const [loaded, setLoaded] = React.useState(() => mode === 'none' || !clientMounted)\n\n // Delivery-time variants, decided per render from the same three inputs\n // the browser will see. Explicit srcSet/sizes from the caller win.\n const delivered = React.useMemo(() => {\n if (transform !== 'supabase' || !src || srcSet || !isStorageImageUrl(src)) return { src, srcSet, sizes }\n if (variant?.width) {\n const w = variant.width\n const q = variant.quality\n return {\n src: imageVariantUrl(src, { width: w, quality: q }),\n srcSet: `${imageVariantUrl(src, { width: w, quality: q })} 1x, ${imageVariantUrl(src, { width: w * 2, quality: q })} 2x`,\n sizes,\n }\n }\n return {\n // A middle rung as the fallback `src`, for a browser without srcset.\n src: imageVariantUrl(src, { width: 960, quality: variant?.quality }),\n srcSet: imageSrcSet(src, variant?.widths ?? IMAGE_SRCSET_WIDTHS, { quality: variant?.quality }),\n sizes: variant?.sizes ?? sizes ?? '100vw',\n }\n }, [transform, src, srcSet, sizes, variant?.width, variant?.sizes, variant?.widths, variant?.quality])\n\n React.useEffect(() => {\n clientMounted = true\n }, [])\n\n React.useEffect(() => {\n if (mode === 'none') {\n setLoaded(true)\n return\n }\n // A cached file can finish before React attaches onLoad — without this the\n // image would stay at `opacity: 0` forever.\n if (ref.current?.complete && ref.current.naturalWidth > 0) setLoaded(true)\n }, [mode, delivered.src])\n\n const revealStyle: React.CSSProperties =\n mode === 'none'\n ? {}\n : {\n opacity: loaded ? 1 : 0,\n filter: blur && !loaded ? 'blur(10px)' : 'blur(0px)',\n transition: `opacity ${durationMs}ms ${easing}, filter ${durationMs}ms ${easing}, transform ${durationMs}ms ${easing}`,\n }\n\n return (\n <img\n {...props}\n src={delivered.src}\n srcSet={delivered.srcSet}\n sizes={delivered.sizes}\n ref={ref}\n loading={loading}\n decoding={decoding}\n data-sf-image-loaded={loaded ? 'true' : 'false'}\n style={{ ...style, ...revealStyle }}\n onLoad={(event) => {\n setLoaded(true)\n onLoad?.(event)\n }}\n />\n )\n}\n","import { useEffect } from 'react'\nimport { currentStaticRenderPass } from '../app/static-render'\nimport type { StaticHeadInput } from '../app/static-render'\n\n/**\n * Minimal per-route head manager: sets document.title and meta description so\n * each storefront page (product, catalog, account, checkout) has its own title\n * and shareable description instead of one static SPA title. A real SSR/prerender\n * pass (M12) layers OG/canonical on top; this covers the client-rendered baseline.\n *\n * Under a static render (`renderStore`, spine M8) there is no document and no\n * effect phase, so the same declaration is reported to the render pass instead.\n * That is how headless HTML gets the title THIS route sets, rather than a title\n * the renderer guessed by re-deriving the routing table on the server.\n *\n * Canonical, image, type and JSON-LD are static-render only by design: they\n * matter to a crawler reading the served HTML, and a client-side page that\n * injected them after hydration would be describing a URL that, under hash\n * addressing, is not its own anyway.\n */\nexport function useStorefrontHead(input: StaticHeadInput): void {\n const { title, description } = input\n currentStaticRenderPass()?.head(input)\n\n useEffect(() => {\n if (title) document.title = title\n }, [title])\n\n useEffect(() => {\n if (!description) return\n let tag = document.head.querySelector<HTMLMetaElement>('meta[name=\"description\"]')\n if (!tag) {\n tag = document.createElement('meta')\n tag.setAttribute('name', 'description')\n document.head.appendChild(tag)\n }\n tag.setAttribute('content', description.slice(0, 160))\n }, [description])\n}\n"]}
1
+ {"version":3,"sources":["../src/lib/format.ts","../src/stores/session.store.ts","../src/data/auth.ts","../src/lib/testids.ts","../src/components/SmoothImage.tsx","../src/hooks/use-storefront-head.ts"],"names":[],"mappings":"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","file":"chunk-EFHQ5MAJ.js","sourcesContent":["export function formatMoney(value: number, currency = 'BRL', locale = 'pt-BR'): string {\n return new Intl.NumberFormat(locale, { style: 'currency', currency }).format(value)\n}\n\nexport function roundCents(value: number): number {\n return Math.round(value * 100) / 100\n}\n","import { create } from 'zustand'\nimport { persist } from 'zustand/middleware'\n\n// Customer session state. Identity is established through the shared\n// @fayz-ai/auth AuthAdapter (see ../auth.ts) — this store only mirrors the\n// linked ShopCustomer for synchronous UI access.\n\nexport interface SessionState {\n customerId: string | null\n email: string | null\n name: string | null\n setSession(session: { customerId: string; email: string; name?: string | null }): void\n signOut(): void\n}\n\nexport const useSessionStore = create<SessionState>()(\n persist(\n (set) => ({\n customerId: null,\n email: null,\n name: null,\n setSession: ({ customerId, email, name }) =>\n set({ customerId, email, name: name ?? null }),\n signOut: () => set({ customerId: null, email: null, name: null }),\n }),\n { name: 'fayz.storefront.session.v1' },\n ),\n)\n","import type { AuthAdapter, AuthUser } from '@fayz-ai/core'\nimport { createMockAuthAdapter } from '@fayz-ai/auth'\nimport type { AuthPluginOptions } from '@fayz-ai/auth/domain/auth-config'\nimport { getShopProvider } from '@fayz-ai/shop/runtime'\nimport { setShopAccessTokenResolver } from '@fayz-ai/sdk/shop'\nimport { useSessionStore } from '../stores/session.store'\n\n// ---------------------------------------------------------------------------\n// Customer auth — the SAME AuthAdapter contract createSaasApp uses, so the\n// mock and Supabase adapters from @fayz-ai/auth serve both the saas admin and\n// the storefront customer. The storefront adds one layer on top: linking the\n// auth identity to a ShopCustomer record (find-or-create by email) so orders\n// and purchase history attach to a customer.\n// ---------------------------------------------------------------------------\n\nexport type StorefrontAuthAdapter = AuthAdapter | 'mock' | 'supabase' | (string & {})\n\n/** Thrown by signUpCustomer when the adapter reports a user but no live\n * session (Supabase's signal for \"email confirmation required\" — see\n * createSupabaseAuthAdapter's signUp, which returns accessToken: '' instead\n * of null/an error). Signup succeeded; the customer just isn't authenticated\n * yet, so we must not link/persist a session for them. */\nexport class EmailConfirmationRequiredError extends Error {\n readonly email: string\n\n constructor(email: string) {\n super('Cadastro realizado. Confirme seu e-mail para continuar.')\n this.name = 'EmailConfirmationRequiredError'\n this.email = email\n }\n}\n\nexport interface StorefrontAuthConfig {\n adapter?: AuthPluginOptions['adapter']\n provider?: AuthPluginOptions['provider']\n routes?: AuthPluginOptions['routes']\n supabase?: AuthPluginOptions['supabase']\n}\n\nlet _adapter: AuthAdapter | null = null\n\nfunction isAuthAdapter(value: unknown): value is AuthAdapter {\n return Boolean(\n value &&\n typeof value === 'object' &&\n 'getSession' in value &&\n 'signIn' in value &&\n 'signOut' in value,\n )\n}\n\nfunction normalizeAuthConfig(\n configured: StorefrontAuthAdapter | StorefrontAuthConfig | undefined,\n): StorefrontAuthConfig {\n if (!configured) return {}\n if (typeof configured === 'string' || isAuthAdapter(configured)) return { adapter: configured }\n return configured\n}\n\nexport function resolveAuthAdapter(\n configured: StorefrontAuthAdapter | StorefrontAuthConfig | undefined,\n fallback?: { supabaseUrl?: string; supabaseAnonKey?: string },\n): AuthAdapter {\n const config = normalizeAuthConfig(configured)\n if (isAuthAdapter(config.adapter)) return config.adapter\n const provider = config.provider ?? config.adapter ?? (fallback?.supabaseUrl ? 'supabase' : 'mock')\n if (provider !== 'supabase') return createMockAuthAdapter()\n // The Supabase adapter pulls @supabase/supabase-js (auth, realtime, storage:\n // ~190 KB raw) — the largest library a storefront page loaded, and one the\n // first render never uses: the server already sent the page's data. It is\n // loaded on first use instead (the session restore at boot asks right away,\n // but from its own chunk, after the entry has run).\n return createLazyAuthAdapter(() =>\n import('@fayz-ai/auth/lib/runtime').then(\n ({ createAuthRuntime }) =>\n createAuthRuntime({\n provider: 'supabase',\n routes: config.routes,\n requireAuth: false,\n supabase: {\n url: config.supabase?.url ?? fallback?.supabaseUrl,\n anonKey: config.supabase?.anonKey ?? fallback?.supabaseAnonKey,\n client: config.supabase?.client,\n callbackUrl: config.supabase?.callbackUrl,\n resetPasswordUrl: config.supabase?.resetPasswordUrl,\n },\n }).adapter,\n ),\n )\n}\n\n/**\n * An AuthAdapter whose implementation is loaded on first use. Every method but\n * `onAuthStateChange` is async already, so callers cannot tell; the listener is\n * attached once the real adapter is there, and its unsubscribe works before or\n * after that.\n */\nexport function createLazyAuthAdapter(load: () => Promise<AuthAdapter>): AuthAdapter {\n let loading: Promise<AuthAdapter> | null = null\n const real = () => (loading ??= load())\n const call =\n <K extends keyof AuthAdapter>(name: K) =>\n async (...args: unknown[]) => {\n const adapter = await real()\n const fn = adapter[name] as ((...a: unknown[]) => unknown) | undefined\n if (typeof fn !== 'function') throw new Error(`[storefront] the auth adapter has no ${String(name)}`)\n return fn.apply(adapter, args)\n }\n return {\n getSession: call('getSession'),\n signIn: call('signIn'),\n signUp: call('signUp'),\n signOut: call('signOut'),\n signInWithOAuth: call('signInWithOAuth'),\n resetPassword: call('resetPassword'),\n updatePassword: call('updatePassword'),\n handleCallback: call('handleCallback'),\n inviteUser: call('inviteUser'),\n resendConfirmation: call('resendConfirmation'),\n adoptSession: call('adoptSession'),\n onAuthStateChange(cb) {\n let unsubscribe: (() => void) | null = null\n let cancelled = false\n void real()\n .then((adapter) => {\n if (!cancelled) unsubscribe = adapter.onAuthStateChange(cb)\n })\n .catch(() => {})\n return () => {\n cancelled = true\n unsubscribe?.()\n }\n },\n } as AuthAdapter\n}\n\n// The shopper's current access token, handed to the shop REST client so its\n// requests reach PostgREST as the signed-in user instead of as `anon`. Held\n// here rather than in the session store because it is a credential: it must not\n// be persisted to localStorage alongside the customer id. The Supabase client\n// owns its own refresh; this is only a mirror of the live value.\nlet _accessToken: string | null = null\n\n/** Whether an authenticated identity was ever seen this session. Distinguishes\n * \"signed out\" from \"was never signed in\" — see the onAuthStateChange guard. */\nlet _hadAuthUser = false\n\n/** Refresh the mirrored token from the adapter. Safe to call on any event. */\nasync function syncAccessToken(adapter: AuthAdapter): Promise<void> {\n try {\n const existing = await adapter.getSession()\n _accessToken = existing?.session.accessToken ?? null\n } catch {\n _accessToken = null\n }\n}\n\n/** Called once by createStorefrontApp. Restores any persisted session. */\nexport function initCustomerAuth(adapter: AuthAdapter): void {\n _adapter = adapter\n\n // Registered before the first await so no request can slip out anonymously\n // while the session is still being restored.\n setShopAccessTokenResolver(() => _accessToken)\n\n adapter\n .getSession()\n .then((existing) => {\n _accessToken = existing?.session.accessToken ?? null\n if (!existing) return\n _hadAuthUser = true\n // Every boot, not only on an email change: the persisted id goes stale\n // with the same email, and this call is what writes auth_user_id, which\n // the phone/CPF prefill and save both filter on.\n void linkCustomer(existing.user).catch(() => {})\n })\n .catch(() => {})\n\n adapter.onAuthStateChange((user) => {\n if (!user) {\n _accessToken = null\n // Only tear down the shop session if there WAS an authenticated identity\n // to lose. The Supabase adapter fires this once on boot with a null user\n // (INITIAL_SESSION), and clearing unconditionally wiped the guest's local\n // session on every page load — a guest who checked out could no longer\n // find their order after a reload. The mock adapter never surfaced this\n // because it always restored a session.\n if (_hadAuthUser) {\n _hadAuthUser = false\n useSessionStore.getState().signOut()\n }\n return\n }\n _hadAuthUser = true\n // Covers token refresh too, not just sign-in: the callback carries the user\n // but not the token, and a stale token would 401 every read an hour in.\n // Magic link / OAuth sign-ins arrive only here; link once the token is live.\n const linked = useSessionStore.getState()\n const needsLink = !linked.customerId\n || (linked.email ?? '').toLowerCase() !== (user.email ?? '').toLowerCase()\n void syncAccessToken(adapter).then(() => {\n if (needsLink && user.email) return linkCustomer(user).then(() => undefined)\n }).catch(() => {})\n })\n}\n\n/** True once an authenticated shopper identity has been seen this session. */\nexport function hasCustomerAuth(): boolean {\n return _hadAuthUser\n}\n\n/** Re-resolve the signed-in shopper's row (phone and document included) and re-point the session at it. */\nexport async function relinkCustomer(): Promise<{ customerId: string; phone: string | null; document: string | null } | null> {\n if (!_hadAuthUser) return null\n const existing = await getCustomerAuthAdapter().getSession().catch(() => null)\n if (!existing?.user.email) return null\n const customer = await resolveShopCustomer(existing.user.email.trim().toLowerCase(), existing.user.fullName ?? '')\n const store = useSessionStore.getState()\n store.setSession({ customerId: customer.id, email: existing.user.email.trim().toLowerCase(), name: store.name })\n return { customerId: customer.id, phone: customer.phone ?? null, document: customer.document ?? null }\n}\n\nexport function getCustomerAuthAdapter(): AuthAdapter {\n if (!_adapter) _adapter = createMockAuthAdapter()\n return _adapter\n}\n\n/** Resolve (find-or-create + server-side auth link) the ShopCustomer for an email. */\nasync function resolveShopCustomer(email: string, name: string) {\n const provider = getShopProvider()\n // Preferred: provider.resolveCustomer find-or-creates AND links auth.uid\n // server-side (RLS-safe). Falls back to generic CRUD for legacy providers.\n if (provider.resolveCustomer) return provider.resolveCustomer({ email, name })\n const matches = await provider.listCustomers({ search: email, limit: 10 })\n const existing = matches.find((c) => (c.email ?? '').toLowerCase() === email)\n if (existing) return existing\n const parts = name.trim().split(/\\s+/).filter(Boolean)\n return provider.createCustomer({\n firstName: parts[0] ?? email.split('@')[0] ?? 'Cliente',\n lastName: parts.slice(1).join(' '),\n email,\n })\n}\n\n/** Find-or-create the ShopCustomer for an auth identity and persist the session. */\nasync function linkCustomer(user: AuthUser, fullName?: string): Promise<{ customerId: string }> {\n const email = (user.email ?? '').trim().toLowerCase()\n const name = fullName ?? user.fullName ?? ''\n const customer = await resolveShopCustomer(email, name)\n useSessionStore.getState().setSession({\n customerId: customer.id,\n email,\n name: name || `${customer.firstName} ${customer.lastName}`.trim(),\n })\n return { customerId: customer.id }\n}\n\nexport interface EstablishSessionOptions {\n /** Provided → adapter.signIn; omitted → passwordless customer identity via signUp (mock-friendly). */\n password?: string\n name?: string\n}\n\n/**\n * Sign a customer in through the auth adapter and link the ShopCustomer.\n * Used by the account page sign-in AND by checkout (so a buyer is signed in\n * for \"my purchases\" immediately after purchase) — one auth path, two doors.\n */\nexport async function establishCustomerSession(\n email: string,\n opts?: EstablishSessionOptions,\n): Promise<{ customerId: string }> {\n const normalized = email.trim().toLowerCase()\n if (opts?.password) {\n const adapter = getCustomerAuthAdapter()\n const session = await adapter.signIn(normalized, opts.password)\n // Before linkCustomer, not after: linkCustomer calls shop_resolve_customer,\n // which reads auth.uid() to fill auth_user_id. Sent with the old token that\n // link silently no-ops and the account stays unlinked forever.\n _accessToken = session.accessToken ?? null\n _hadAuthUser = true\n return linkCustomer(session.user.email ? session.user : { ...session.user, email: normalized }, opts.name)\n }\n // Guest / passwordless checkout: do NOT create an auth account (that made\n // returning guests fail with \"user already registered\" on Supabase). Just\n // resolve the ShopCustomer and persist the local session for order history.\n return linkCustomer({ id: '', email: normalized } as AuthUser, opts?.name)\n}\n\n/** Convenience wrapper — passwordless email sign-in (guest checkout path). */\nexport function signInByEmail(email: string, name?: string): Promise<{ customerId: string }> {\n return establishCustomerSession(email, { name })\n}\n\n/** Explicit account creation (account page \"Criar conta\" form). */\nexport async function signUpCustomer(\n email: string,\n password: string,\n name: string,\n): Promise<{ customerId: string }> {\n const adapter = getCustomerAuthAdapter()\n const normalized = email.trim().toLowerCase()\n const session = await adapter.signUp(normalized, password, name)\n // Empty accessToken == account created but not authenticated (email\n // confirmation pending). Do NOT link/persist a session for an unconfirmed\n // user — see EmailConfirmationRequiredError.\n if (!session.accessToken) throw new EmailConfirmationRequiredError(normalized)\n _accessToken = session.accessToken\n _hadAuthUser = true\n return linkCustomer(session.user.email ? session.user : { ...session.user, email: normalized }, name)\n}\n\nexport async function signOutCustomer(): Promise<void> {\n try {\n await getCustomerAuthAdapter().signOut()\n } finally {\n _accessToken = null\n _hadAuthUser = false\n useSessionStore.getState().signOut()\n }\n}\n","// Single source of truth for e2e selectors. Components import from here;\n// Playwright specs assert against the same constants — they cannot drift.\nexport const TID = {\n // header\n headerSearch: 'header-search',\n headerSearchToggle: 'header-search-toggle',\n searchOverlay: 'search-overlay',\n searchOverlayInput: 'search-overlay-input',\n searchOverlayClose: 'search-overlay-close',\n searchOverlayCta: 'search-overlay-cta',\n searchSuggestion: 'search-suggestion',\n cartButton: 'cart-button',\n cartCount: 'cart-count',\n accountLink: 'account-link',\n accountDropdown: 'account-dropdown',\n announcementBar: 'announcement-bar',\n navLink: (label: string) => `nav-${label.toLowerCase().replace(/\\s+/g, '-')}`,\n navCategory: (slug: string) => `nav-cat-${slug}`,\n accountName: 'account-name',\n // home sections\n hero: 'home-hero',\n heroPrev: 'hero-prev',\n heroNext: 'hero-next',\n mediaCarousel: 'media-carousel',\n mediaCarouselPrev: 'media-carousel-prev',\n mediaCarouselNext: 'media-carousel-next',\n productSlider: 'product-slider',\n productSliderViewport: 'product-slider-viewport',\n productSliderPrev: 'product-slider-prev',\n productSliderNext: 'product-slider-next',\n categoryShowcase: 'category-showcase',\n productRail: 'product-rail',\n entityList: 'entity-list',\n benefits: 'benefits-row',\n promoBanner: 'promo-banner',\n manifesto: 'manifesto',\n testimonials: 'testimonials',\n newsletter: 'newsletter',\n newsletterEmail: 'newsletter-email',\n newsletterSubmit: 'newsletter-submit',\n newsletterDone: 'newsletter-done',\n formBlock: 'form-block',\n formBlockField: (id: string) => `form-block-field-${id}`,\n formBlockSubmit: 'form-block-submit',\n formBlockSuccess: 'form-block-success',\n formBlockError: 'form-block-error',\n // collection / campaign page blocks\n collectionHero: 'collection-hero',\n collectionHeroCta: 'collection-hero-cta',\n productSpotlight: 'product-spotlight',\n productSpotlightCta: 'product-spotlight-cta',\n motifStrip: 'motif-strip',\n collectionCta: 'collection-cta',\n collectionCtaButton: 'collection-cta-button',\n // catalog\n productGrid: 'product-grid',\n productCard: 'product-card',\n productCardName: 'product-card-name',\n productCardPrice: 'product-card-price',\n productCardAdd: 'product-card-add',\n badgeSale: 'badge-sale',\n badgeSoldout: 'badge-soldout',\n // filters\n filterCategory: (slug: string) => `filter-category-${slug}`,\n filterPriceMin: 'filter-price-min',\n filterPriceMax: 'filter-price-max',\n filterInstock: 'filter-instock',\n sortSelect: 'sort-select',\n filtersClear: 'filters-clear',\n // product detail\n pdpName: 'pdp-name',\n pdpPrice: 'pdp-price',\n pdpComparePrice: 'pdp-compare-price',\n pdpDescription: 'pdp-description',\n productOptionGroup: (id: string) => `product-option-${id.toLowerCase().replace(/\\s+/g, '-')}`,\n productOptionValue: (id: string, value: string) => `product-option-${id.toLowerCase().replace(/\\s+/g, '-')}-${value.toLowerCase().replace(/\\s+/g, '-')}`,\n pdpQtyInput: 'pdp-qty-input',\n pdpAddToCart: 'pdp-add-to-cart',\n pdpRoot: 'pdp-root',\n pdpGallery: 'pdp-gallery',\n pdpGalleryImage: 'pdp-gallery-image',\n pdpGalleryThumbs: 'pdp-gallery-thumbs',\n pdpGalleryThumb: 'pdp-gallery-thumb',\n pdpActions: 'pdp-actions',\n pdpEnquiryButton: 'pdp-enquiry-button',\n enquiryForm: 'enquiry-form',\n enquiryName: 'enquiry-name',\n enquiryEmail: 'enquiry-email',\n enquiryPhone: 'enquiry-phone',\n enquirySubject: 'enquiry-subject',\n enquiryMessage: 'enquiry-message',\n enquirySubmit: 'enquiry-submit',\n enquirySuccess: 'enquiry-success',\n enquiryError: 'enquiry-error',\n // cart\n cartDrawer: 'cart-drawer',\n cartLinesList: 'cart-lines-list',\n cartFooter: 'cart-footer',\n cartLine: 'cart-line',\n lineQty: 'line-qty',\n lineInc: 'line-inc',\n lineDec: 'line-dec',\n lineRemove: 'line-remove',\n cartSubtotal: 'cart-subtotal',\n discountInput: 'discount-input',\n discountApply: 'discount-apply',\n discountRow: 'discount-row',\n discountError: 'discount-error',\n cartShipping: 'cart-shipping',\n shippingProgress: 'shipping-progress',\n cartTotal: 'cart-total',\n goCheckout: 'go-checkout',\n cartEmpty: 'cart-empty',\n // menu / delivery mode (0094)\n menuPage: 'menu-page',\n menuSection: (slug: string) => `menu-section-${slug}`,\n menuItem: (slug: string) => `menu-item-${slug}`,\n menuQuickAdd: (slug: string) => `menu-quick-add-${slug}`,\n devPlaceOrderWithoutCharge: 'dev-place-order-without-charge',\n menuCartBar: 'menu-cart-bar',\n menuItemSoldOut: 'menu-sold-out',\n itemSheet: 'item-sheet',\n itemSheetNotes: 'item-sheet-notes',\n itemSheetNotesCount: 'item-sheet-notes-count',\n itemSheetQty: 'item-sheet-qty',\n itemSheetAdd: 'item-sheet-add',\n serviceStatus: 'service-status',\n serviceHoursModal: 'service-hours-modal',\n serviceClosedGate: 'service-closed-gate',\n fulfillmentMode: (mode: string) => `fulfillment-mode-${mode}`,\n scheduleSheet: 'schedule-sheet',\n scheduleSlot: (iso: string) => `schedule-slot-${iso}`,\n storeCover: 'store-cover',\n menuSearch: 'menu-search',\n menuCategoryNav: 'menu-category-nav',\n menuCategoryLink: (slug: string) => `menu-category-link-${slug}`,\n menuHighlights: 'menu-highlights',\n menuItemBadge: (slug: string) => `menu-item-badge-${slug}`,\n deliveryTabBar: 'delivery-tab-bar',\n deliveryTab: (key: string) => `delivery-tab-${key}`,\n addressStrip: 'address-strip',\n addressSheet: 'address-sheet',\n addressCep: 'address-cep',\n addressNumber: 'address-number',\n addressComplement: 'address-complement',\n addressReference: 'address-reference',\n addressSave: 'address-save',\n addressAddNew: 'address-add-new',\n savedAddress: (id: string) => `saved-address-${id}`,\n itemSheetGroup: (label: string) => `item-sheet-group-${label}`,\n // delivery estimate (product page + cart)\n deliveryEstimator: 'delivery-estimator',\n deliveryCepInput: 'delivery-cep-input',\n deliveryCepSubmit: 'delivery-cep-submit',\n deliveryOption: 'delivery-option',\n deliveryUnserved: 'delivery-unserved',\n deliveryError: 'delivery-error',\n deliveryAddress: 'delivery-address',\n deliveryClear: 'delivery-clear',\n // checkout\n checkoutEmail: 'checkout-email',\n checkoutName: 'checkout-name',\n checkoutDocument: 'checkout-document',\n checkoutStreet: 'checkout-street',\n checkoutCity: 'checkout-city',\n checkoutZip: 'checkout-zip',\n checkoutCard: 'checkout-card',\n checkoutExpiry: 'checkout-expiry',\n checkoutCvc: 'checkout-cvc',\n placeOrder: 'place-order',\n // checkout em passos\n checkoutSteps: 'checkout-steps',\n checkoutStep: (n: number) => `checkout-step-${n}`,\n checkoutPayment: 'checkout-payment',\n checkoutPaymentTotal: 'checkout-payment-total',\n checkoutContinue: 'checkout-continue',\n checkoutBack: 'checkout-back',\n checkoutDone: 'checkout-done',\n // payment step\n pixPanel: 'pix-panel',\n pixCode: 'pix-code',\n pixCopy: 'pix-copy',\n pixConfirm: 'pix-confirm',\n checkoutError: 'checkout-error',\n checkoutProcessing: 'checkout-processing',\n // confirmation\n orderNumber: 'order-number',\n orderStatus: 'order-status',\n orderTracking: 'order-tracking',\n orderTrackingStep: (step: string) => `order-tracking-step-${step}`,\n orderTotal: 'order-total',\n viewPurchases: 'view-purchases',\n // account\n customerAccountShell: 'customer-account-shell',\n customerAccountMenu: 'customer-account-menu',\n orderDetail: 'order-detail',\n authTabSignin: 'auth-tab-signin',\n authTabSignup: 'auth-tab-signup',\n signinEmail: 'signin-email',\n signinPassword: 'signin-password',\n signinPasswordConfirm: 'signin-password-confirm',\n signinName: 'signin-name',\n signinSubmit: 'signin-submit',\n authError: 'auth-error',\n authNotice: 'auth-notice',\n checkoutExpired: 'checkout-expired',\n purchasesList: 'purchases-list',\n purchaseItem: 'purchase-item',\n purchasesEmpty: 'purchases-empty',\n signout: 'signout',\n} as const\n","import React from 'react'\nimport { imageSrcSet, imageVariantUrl, isStorageImageUrl, IMAGE_SRCSET_WIDTHS } from '@fayz-ai/shop'\nimport { useStorefrontConfigOptional, type StorefrontImageLoadingConfig } from '../document/config'\n\n/**\n * How large the image is drawn, so the browser can pick a variant.\n *\n * `width` — a fixed slot (a thumbnail): one variant at that width, at 2× for\n * dense screens. `sizes` — a fluid slot (a card, the gallery): the full\n * srcset ladder plus the CSS `sizes` hint. Both only take effect when the\n * store serves variants (`imageLoading.transform`) and the URL is a storage\n * object; otherwise the one file is loaded, as before.\n */\nexport interface SmoothImageVariant {\n width?: number\n sizes?: string\n widths?: readonly number[]\n quality?: number\n}\n\nexport interface SmoothImageProps extends React.ImgHTMLAttributes<HTMLImageElement> {\n imageLoading?: StorefrontImageLoadingConfig\n variant?: SmoothImageVariant\n}\n\n/**\n * Has the app finished its first client render?\n *\n * The fade is a CLIENT entrance: an image that mounts while the shopper is\n * already looking at the store should arrive softly. An image that came down\n * in the server's HTML is a different thing — it is already on the page, and\n * starting it at `opacity: 0` means the browser holds a blank rectangle from\n * first paint until JavaScript has hydrated and the file has loaded. On the\n * Artorius catalogue that was eight blank cards for about a second, on a page\n * whose HTML had described them all along.\n *\n * So the reveal is skipped for the first render — the one the server also\n * performed, which keeps hydration matching — and applies to every mount after\n * it. Module scope, and only ever written from an effect: on the server it\n * stays false for the life of the worker, which is what makes the server's\n * markup and the client's first pass agree.\n */\nlet clientMounted = false\n\nexport function SmoothImage({\n imageLoading,\n variant,\n loading = 'lazy',\n decoding = 'async',\n onLoad,\n style,\n src,\n srcSet,\n sizes,\n ...props\n}: SmoothImageProps) {\n const config = useStorefrontConfigOptional()\n const resolved = {\n ...config?.imageLoading,\n ...imageLoading,\n }\n const mode = resolved.mode ?? 'fade'\n const durationMs = resolved.durationMs ?? 420\n const easing = resolved.easing ?? 'cubic-bezier(0.22, 1, 0.36, 1)'\n const blur = resolved.blur ?? true\n const transform = resolved.transform ?? 'none'\n const ref = React.useRef<HTMLImageElement | null>(null)\n const [loaded, setLoaded] = React.useState(() => mode === 'none' || !clientMounted)\n\n // Delivery-time variants, decided per render from the same three inputs\n // the browser will see. Explicit srcSet/sizes from the caller win.\n const delivered = React.useMemo(() => {\n if (transform !== 'supabase' || !src || srcSet || !isStorageImageUrl(src)) return { src, srcSet, sizes }\n if (variant?.width) {\n const w = variant.width\n const q = variant.quality\n return {\n src: imageVariantUrl(src, { width: w, quality: q }),\n srcSet: `${imageVariantUrl(src, { width: w, quality: q })} 1x, ${imageVariantUrl(src, { width: w * 2, quality: q })} 2x`,\n sizes,\n }\n }\n return {\n // A middle rung as the fallback `src`, for a browser without srcset.\n src: imageVariantUrl(src, { width: 960, quality: variant?.quality }),\n srcSet: imageSrcSet(src, variant?.widths ?? IMAGE_SRCSET_WIDTHS, { quality: variant?.quality }),\n sizes: variant?.sizes ?? sizes ?? '100vw',\n }\n }, [transform, src, srcSet, sizes, variant?.width, variant?.sizes, variant?.widths, variant?.quality])\n\n React.useEffect(() => {\n clientMounted = true\n }, [])\n\n React.useEffect(() => {\n if (mode === 'none') {\n setLoaded(true)\n return\n }\n // A cached file can finish before React attaches onLoad — without this the\n // image would stay at `opacity: 0` forever.\n if (ref.current?.complete && ref.current.naturalWidth > 0) setLoaded(true)\n }, [mode, delivered.src])\n\n const revealStyle: React.CSSProperties =\n mode === 'none'\n ? {}\n : {\n opacity: loaded ? 1 : 0,\n filter: blur && !loaded ? 'blur(10px)' : 'blur(0px)',\n transition: `opacity ${durationMs}ms ${easing}, filter ${durationMs}ms ${easing}, transform ${durationMs}ms ${easing}`,\n }\n\n return (\n <img\n {...props}\n src={delivered.src}\n srcSet={delivered.srcSet}\n sizes={delivered.sizes}\n ref={ref}\n loading={loading}\n decoding={decoding}\n data-sf-image-loaded={loaded ? 'true' : 'false'}\n style={{ ...style, ...revealStyle }}\n onLoad={(event) => {\n setLoaded(true)\n onLoad?.(event)\n }}\n />\n )\n}\n","import { useEffect } from 'react'\nimport { currentStaticRenderPass } from '../app/static-render'\nimport type { StaticHeadInput } from '../app/static-render'\n\n/**\n * Minimal per-route head manager: sets document.title and meta description so\n * each storefront page (product, catalog, account, checkout) has its own title\n * and shareable description instead of one static SPA title. A real SSR/prerender\n * pass (M12) layers OG/canonical on top; this covers the client-rendered baseline.\n *\n * Under a static render (`renderStore`, spine M8) there is no document and no\n * effect phase, so the same declaration is reported to the render pass instead.\n * That is how headless HTML gets the title THIS route sets, rather than a title\n * the renderer guessed by re-deriving the routing table on the server.\n *\n * Canonical, image, type and JSON-LD are static-render only by design: they\n * matter to a crawler reading the served HTML, and a client-side page that\n * injected them after hydration would be describing a URL that, under hash\n * addressing, is not its own anyway.\n */\nexport function useStorefrontHead(input: StaticHeadInput): void {\n const { title, description } = input\n currentStaticRenderPass()?.head(input)\n\n useEffect(() => {\n if (title) document.title = title\n }, [title])\n\n useEffect(() => {\n if (!description) return\n let tag = document.head.querySelector<HTMLMetaElement>('meta[name=\"description\"]')\n if (!tag) {\n tag = document.createElement('meta')\n tag.setAttribute('name', 'description')\n document.head.appendChild(tag)\n }\n tag.setAttribute('content', description.slice(0, 160))\n }, [description])\n}\n"]}
@@ -1,12 +1,12 @@
1
- import { trackStorefront, onStorefrontEvent, setStorefrontIdentifier, lastStorefrontEventAt, Slot, useBuyerCountry, useDiscountValidator, useT, StorefrontPage, useToastStore, useSlotFilled, SignInModal, toast, onStorefrontBuyer, getProductCardBadges, useStorefrontPageOptional, useStorefrontPage, getCartLineAnnotations, rememberReturnPath } from './chunk-FPFGRUCS.js';
1
+ import { trackStorefront, onStorefrontEvent, setStorefrontIdentifier, lastStorefrontEventAt, Slot, useBuyerCountry, useDiscountValidator, useT, StorefrontPage, useToastStore, useSlotFilled, SignInModal, toast, onStorefrontBuyer, getProductCardBadges, useStorefrontPageOptional, useStorefrontPage, getCartLineAnnotations, rememberReturnPath } from './chunk-OOQRYH3N.js';
2
2
  import { prefersReducedMotion, Reveal, useScrolled, usePopOnChange } from './chunk-WXXYJZE6.js';
3
- import { AddressSheet } from './chunk-554XAQWK.js';
4
- import { useCartStore, selectSubtotal, selectCount, useMarketStore, withMarketPrice, getProductOptionGroups, marketForCountry, useDeliveryStore, selectDiscountTotal, selectShipping, selectTotal, selectRequiresShipping, resolveOptionRate, selectionPrice } from './chunk-RZWTEC6H.js';
3
+ import { AddressSheet } from './chunk-YDZU2SZL.js';
4
+ import { useCartStore, selectSubtotal, selectCount, useMarketStore, withMarketPrice, getProductOptionGroups, marketForCountry, useDeliveryStore, selectDiscountTotal, selectShipping, selectTotal, selectRequiresShipping, resolveOptionRate, selectionPrice } from './chunk-C4XATNI2.js';
5
5
  import { accountSectionPath } from './chunk-DVQHKNNX.js';
6
- import { TID, SmoothImage, formatMoney, useStorefrontHead, useSessionStore, initCustomerAuth, resolveAuthAdapter, signOutCustomer } from './chunk-2D5BEM43.js';
7
- import { productSeo, MENU_DATA_NEEDS, resolveStorefrontRoute } from './chunk-45R7CIEA.js';
8
- import { useBlockData, BlockDataError, useLoader, mergePageTheme, pageThemeSelector, matchContentPage } from './chunk-BKO2AQ3Q.js';
9
- import { Link, useStorefrontConfig, navigateTo, getStorefrontComponents, useRoutePath, matchPath, StorefrontConfigProvider, resolveConfig, useRouterAdapter, shellRouterAdapter, StorefrontRouterProvider, useScrollToTopOnNavigate, normalizeLanguage, useHashPath } from './chunk-GVZ2SAOI.js';
6
+ import { TID, SmoothImage, formatMoney, useStorefrontHead, useSessionStore, initCustomerAuth, resolveAuthAdapter, signOutCustomer } from './chunk-EFHQ5MAJ.js';
7
+ import { productSeo, MENU_DATA_NEEDS, resolveStorefrontRoute } from './chunk-CE4U65TZ.js';
8
+ import { useBlockData, BlockDataError, useLoader, mergePageTheme, pageThemeSelector, matchContentPage } from './chunk-SLJ4BRXD.js';
9
+ import { Link, useStorefrontConfig, navigateTo, getStorefrontComponents, useRoutePath, matchPath, StorefrontConfigProvider, resolveConfig, useRouterAdapter, shellRouterAdapter, StorefrontRouterProvider, useScrollToTopOnNavigate, normalizeLanguage, useHashPath } from './chunk-PSDR5TZD.js';
10
10
  import { runningExperiments, CONTROL, readVisitorId } from './chunk-4REZOGGW.js';
11
11
  import * as React30 from 'react';
12
12
  import React30__default, { useState, useRef, useEffect, useMemo } from 'react';
@@ -6087,6 +6087,7 @@ function StoreCover({ onShowHours, onOpenAccount, children }) {
6087
6087
  "img",
6088
6088
  {
6089
6089
  src: cover,
6090
+ ...config.delivery?.coverImageSrcSet ? { srcSet: config.delivery.coverImageSrcSet, sizes: "100vw" } : {},
6090
6091
  alt: "",
6091
6092
  "aria-hidden": true,
6092
6093
  ...COVER_PRIORITY,
@@ -7415,11 +7416,11 @@ function Toaster() {
7415
7416
  )
7416
7417
  );
7417
7418
  }
7418
- var CheckoutPage = React30__default.lazy(() => import('./CheckoutPage-G5NYJF3Z.js').then((m) => ({ default: m.CheckoutPage })));
7419
+ var CheckoutPage = React30__default.lazy(() => import('./CheckoutPage-4MFKLBEI.js').then((m) => ({ default: m.CheckoutPage })));
7419
7420
  var OrderConfirmationPage = React30__default.lazy(
7420
- () => import('./OrderConfirmationPage-DGLW5W75.js').then((m) => ({ default: m.OrderConfirmationPage }))
7421
+ () => import('./OrderConfirmationPage-SOQDD767.js').then((m) => ({ default: m.OrderConfirmationPage }))
7421
7422
  );
7422
- var MyPurchasesPage = React30__default.lazy(() => import('./MyPurchasesPage-GOK2RO7K.js').then((m) => ({ default: m.MyPurchasesPage })));
7423
+ var MyPurchasesPage = React30__default.lazy(() => import('./MyPurchasesPage-F25MIFXT.js').then((m) => ({ default: m.MyPurchasesPage })));
7423
7424
  function PrivatePage({ children }) {
7424
7425
  return /* @__PURE__ */ jsx(React30__default.Suspense, { fallback: /* @__PURE__ */ jsx("div", { "aria-busy": "true", className: "min-h-[70vh]", "data-testid": "private-page-loading" }), children });
7425
7426
  }
@@ -7611,5 +7612,5 @@ function createStorefront(options) {
7611
7612
  }
7612
7613
 
7613
7614
  export { AddressStrip, BenefitsRow, CartDrawer, CatalogPage, CategoryShowcase, ClosedStoreDialog, CollectionCta, CollectionHero, ContentPage, CountdownBand, EntityListBlock, ExperimentBlock, ExperimentProvider, ExperimentVariantBlock, FaqSection, FiltersPanel, FormBlock, HeroSection, ImageTiles, ItemSheet, ManifestoBlock, MediaCarousel, MenuItemRow, MenuPage, MenuToolbar, MotifStrip, NewsletterBand, PLACEHOLDER_ASPECTS, PaymentTerms, Price, ProductCard, ProductDetailPage, ProductEnquiryForm, ProductGallery, ProductGrid, ProductOptionSelector, ProductRail, ProductReviews, ProductSlider, ProductSpecs, ProductSpotlight, PromoBanner, QuantityInput, ScheduleSheet, SealsBand, SearchOverlay, ServiceHoursModal, StepsSection, StoreCover, StorefrontAnalytics, StorefrontConfigHost, StorefrontFooter, StorefrontHeader, StorefrontShell, StorefrontThemeStyle, StoryQuote, THEME_SCALE_FIELDS, THEME_SCALE_VAR_PREFIX, Testimonials, TierCards, applyDeliveryPolicy, applyStoreSettings, bannerPlaceholder, buildEnquiryFromForm, createStorefront, createStorefrontApp, entityListBlockMeta, initStorefrontRuntime, isExperimentBinding, matchesFacets, mergeCollectionFacet, nextMilestone, orderGalleryImages, overrideComponent, overrideProps, pickProductCardImage, productCardComponentContract, productPlaceholder, registerStorefrontBlocks, registerStorefrontEntities, registerStorefrontLoaders, resolveExperimental, resolveOverride, resolvePaymentTerms, resolveStorefrontProvider, sectionsToBlocks, selectIsOpen, selectShowsHours, startStorefrontPostHog, storeBuyerId, storefrontComponentContracts, themeToCss, toFacetMap, useCatalogStore, useCategories, useEnquiry, useExperiment, useExperimentValue, useMarketProduct, useProduct, useProducts, useServiceStore, useStorefrontActions, withFacet };
7614
- //# sourceMappingURL=chunk-UJ2TIM4V.js.map
7615
- //# sourceMappingURL=chunk-UJ2TIM4V.js.map
7615
+ //# sourceMappingURL=chunk-ELW7QWDJ.js.map
7616
+ //# sourceMappingURL=chunk-ELW7QWDJ.js.map