@fayz-ai/storefront 0.84.1 → 0.84.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/dist/CheckoutPage-G5NYJF3Z.js +12 -0
  2. package/dist/{CheckoutPage-DDY4WLFJ.js.map → CheckoutPage-G5NYJF3Z.js.map} +1 -1
  3. package/dist/MyPurchasesPage-GOK2RO7K.js +11 -0
  4. package/dist/{MyPurchasesPage-IHCB5QRR.js.map → MyPurchasesPage-GOK2RO7K.js.map} +1 -1
  5. package/dist/OrderConfirmationPage-DGLW5W75.js +10 -0
  6. package/dist/{OrderConfirmationPage-SAKAGOCC.js.map → OrderConfirmationPage-DGLW5W75.js.map} +1 -1
  7. package/dist/analytics/meta-pixel.d.ts +13 -0
  8. package/dist/analytics/meta-pixel.d.ts.map +1 -1
  9. package/dist/{chunk-PATS4DIF.js → chunk-2D5BEM43.js} +56 -16
  10. package/dist/chunk-2D5BEM43.js.map +1 -0
  11. package/dist/{chunk-OHWX6BEY.js → chunk-554XAQWK.js} +4 -4
  12. package/dist/{chunk-OHWX6BEY.js.map → chunk-554XAQWK.js.map} +1 -1
  13. package/dist/{chunk-GQ3TCJVX.js → chunk-F3U4KZC7.js} +4 -4
  14. package/dist/{chunk-GQ3TCJVX.js.map → chunk-F3U4KZC7.js.map} +1 -1
  15. package/dist/{chunk-MFAU3AWK.js → chunk-FPFGRUCS.js} +4 -4
  16. package/dist/{chunk-MFAU3AWK.js.map → chunk-FPFGRUCS.js.map} +1 -1
  17. package/dist/{chunk-H6IOPA3J.js → chunk-P4RRFQQX.js} +4 -4
  18. package/dist/{chunk-H6IOPA3J.js.map → chunk-P4RRFQQX.js.map} +1 -1
  19. package/dist/{chunk-D5C5U2SG.js → chunk-PURHMU2W.js} +3 -3
  20. package/dist/{chunk-D5C5U2SG.js.map → chunk-PURHMU2W.js.map} +1 -1
  21. package/dist/{chunk-K27LYMSF.js → chunk-RZWTEC6H.js} +3 -3
  22. package/dist/{chunk-K27LYMSF.js.map → chunk-RZWTEC6H.js.map} +1 -1
  23. package/dist/{chunk-HRLF5NYO.js → chunk-UJ2TIM4V.js} +25 -13
  24. package/dist/chunk-UJ2TIM4V.js.map +1 -0
  25. package/dist/{chunk-CV6RYJIC.js → chunk-WSHCQ3Y6.js} +7 -7
  26. package/dist/{chunk-CV6RYJIC.js.map → chunk-WSHCQ3Y6.js.map} +1 -1
  27. package/dist/{chunk-DRMDBXMT.js → chunk-YSQBZ3RM.js} +6 -6
  28. package/dist/{chunk-DRMDBXMT.js.map → chunk-YSQBZ3RM.js.map} +1 -1
  29. package/dist/{chunk-WPWNYBNG.js → chunk-ZSNKJGE5.js} +3 -3
  30. package/dist/{chunk-WPWNYBNG.js.map → chunk-ZSNKJGE5.js.map} +1 -1
  31. package/dist/data/auth.d.ts +7 -0
  32. package/dist/data/auth.d.ts.map +1 -1
  33. package/dist/index.d.ts +1 -1
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +17 -17
  36. package/dist/index.js.map +1 -1
  37. package/dist/render.js +6 -6
  38. package/dist/tanstack.js +5 -5
  39. package/package.json +3 -3
  40. package/dist/CheckoutPage-DDY4WLFJ.js +0 -12
  41. package/dist/MyPurchasesPage-IHCB5QRR.js +0 -11
  42. package/dist/OrderConfirmationPage-SAKAGOCC.js +0 -10
  43. package/dist/chunk-HRLF5NYO.js.map +0 -1
  44. package/dist/chunk-PATS4DIF.js.map +0 -1
@@ -0,0 +1,12 @@
1
+ export { CheckoutPage } from './chunk-YSQBZ3RM.js';
2
+ import './chunk-WDQFNHYO.js';
3
+ import './chunk-ZSNKJGE5.js';
4
+ import './chunk-FCPOPWG3.js';
5
+ import './chunk-FPFGRUCS.js';
6
+ import './chunk-WXXYJZE6.js';
7
+ import './chunk-RZWTEC6H.js';
8
+ import './chunk-2D5BEM43.js';
9
+ import './chunk-BKO2AQ3Q.js';
10
+ import './chunk-GVZ2SAOI.js';
11
+ //# sourceMappingURL=CheckoutPage-G5NYJF3Z.js.map
12
+ //# sourceMappingURL=CheckoutPage-G5NYJF3Z.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"CheckoutPage-DDY4WLFJ.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"CheckoutPage-G5NYJF3Z.js"}
@@ -0,0 +1,11 @@
1
+ export { MyPurchasesPage } from './chunk-WSHCQ3Y6.js';
2
+ import './chunk-ZSNKJGE5.js';
3
+ import './chunk-PURHMU2W.js';
4
+ import './chunk-FCPOPWG3.js';
5
+ import './chunk-554XAQWK.js';
6
+ import './chunk-RZWTEC6H.js';
7
+ import './chunk-DVQHKNNX.js';
8
+ import './chunk-2D5BEM43.js';
9
+ import './chunk-GVZ2SAOI.js';
10
+ //# sourceMappingURL=MyPurchasesPage-GOK2RO7K.js.map
11
+ //# sourceMappingURL=MyPurchasesPage-GOK2RO7K.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"MyPurchasesPage-IHCB5QRR.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"MyPurchasesPage-GOK2RO7K.js"}
@@ -0,0 +1,10 @@
1
+ export { OrderConfirmationPage } from './chunk-F3U4KZC7.js';
2
+ import './chunk-WDQFNHYO.js';
3
+ import './chunk-PURHMU2W.js';
4
+ import './chunk-FCPOPWG3.js';
5
+ import './chunk-WXXYJZE6.js';
6
+ import './chunk-DVQHKNNX.js';
7
+ import './chunk-2D5BEM43.js';
8
+ import './chunk-GVZ2SAOI.js';
9
+ //# sourceMappingURL=OrderConfirmationPage-DGLW5W75.js.map
10
+ //# sourceMappingURL=OrderConfirmationPage-DGLW5W75.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"OrderConfirmationPage-SAKAGOCC.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"OrderConfirmationPage-DGLW5W75.js"}
@@ -37,6 +37,19 @@ export interface MetaEvent {
37
37
  }
38
38
  /** A storefront event in Meta's words, or null when Meta has no standard event for it. */
39
39
  export declare function metaEventFor(event: StorefrontEvent, currency: string): MetaEvent | null;
40
+ /**
41
+ * fbevents.js (~115 KB) plus the pixel's config (~95 KB) costs ~360 ms of
42
+ * main-thread work on a mid-range phone. Requested during the page's load it
43
+ * lands inside the window PageSpeed's Total Blocking Time is measured in, so
44
+ * it is deferred to the visitor's first interaction (tap, scroll, key) or 3 s
45
+ * after load, whichever comes first.
46
+ *
47
+ * The trade-off, deliberately: a paid visitor who leaves within 3 s without
48
+ * touching the page registers no PageView in Meta. Anyone who interacts or
49
+ * stays 3 s is counted, and nothing they do is lost — `fbq` queues every call
50
+ * until the script runs, PageView included.
51
+ */
52
+ export declare const META_PIXEL_DELAY_MS = 3000;
40
53
  /**
41
54
  * Loads the pixel once per page (browser only) and starts reporting. Calling it
42
55
  * again with the same id is a no-op; with another id, the old listener stops.
@@ -1 +1 @@
1
- {"version":3,"file":"meta-pixel.d.ts","sourceRoot":"","sources":["../../src/analytics/meta-pixel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwC,KAAK,eAAe,EAAE,MAAM,OAAO,CAAA;AAElF;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,yBAAyB;IACxC,2DAA2D;IAC3D,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,KAAK,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC,GAAG;IAC1C,UAAU,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAA;IACzC,KAAK,EAAE,OAAO,EAAE,CAAA;IAChB,IAAI,EAAE,OAAO,CAAA;IACb,MAAM,EAAE,OAAO,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,GAAG,CAAC,EAAE,GAAG,CAAA;QACT,IAAI,CAAC,EAAE,GAAG,CAAA;KACX;CACF;AAED,eAAO,MAAM,aAAa,QAAmB,CAAA;AAE7C,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,aAAa,GAAG,WAAW,GAAG,kBAAkB,GAAG,gBAAgB,GAAG,UAAU,CAAA;IACtF,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC/B,wDAAwD;IACxD,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAKD,0FAA0F;AAC1F,wBAAgB,YAAY,CAAC,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAyCvF;AAsDD;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,yBAAyB,EAAE,OAAO,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAqB/G;AAED,8FAA8F;AAC9F,wBAAgB,iBAAiB,IAAI,IAAI,CAGxC;AAED,iBAAiB;AACjB,wBAAgB,wBAAwB,IAAI,IAAI,CAG/C"}
1
+ {"version":3,"file":"meta-pixel.d.ts","sourceRoot":"","sources":["../../src/analytics/meta-pixel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwC,KAAK,eAAe,EAAE,MAAM,OAAO,CAAA;AAElF;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,yBAAyB;IACxC,2DAA2D;IAC3D,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,KAAK,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC,GAAG;IAC1C,UAAU,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAA;IACzC,KAAK,EAAE,OAAO,EAAE,CAAA;IAChB,IAAI,EAAE,OAAO,CAAA;IACb,MAAM,EAAE,OAAO,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,GAAG,CAAC,EAAE,GAAG,CAAA;QACT,IAAI,CAAC,EAAE,GAAG,CAAA;KACX;CACF;AAED,eAAO,MAAM,aAAa,QAAmB,CAAA;AAE7C,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,aAAa,GAAG,WAAW,GAAG,kBAAkB,GAAG,gBAAgB,GAAG,UAAU,CAAA;IACtF,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC/B,wDAAwD;IACxD,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAKD,0FAA0F;AAC1F,wBAAgB,YAAY,CAAC,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAyCvF;AAKD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,mBAAmB,OAAO,CAAA;AAqDvC;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,yBAAyB,EAAE,OAAO,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAqB/G;AAED,8FAA8F;AAC9F,wBAAgB,iBAAiB,IAAI,IAAI,CAGxC;AAED,iBAAiB;AACjB,wBAAgB,wBAAwB,IAAI,IAAI,CAG/C"}
@@ -2,7 +2,6 @@ import { useStorefrontConfigOptional, currentStaticRenderPass } from './chunk-GV
2
2
  import { create } from 'zustand';
3
3
  import { persist } from 'zustand/middleware';
4
4
  import { createMockAuthAdapter } from '@fayz-ai/auth';
5
- import { createAuthRuntime } from '@fayz-ai/auth/lib/runtime';
6
5
  import { getShopProvider } from '@fayz-ai/shop/runtime';
7
6
  import { setShopAccessTokenResolver } from '@fayz-ai/sdk/shop';
8
7
  import React, { useEffect } from 'react';
@@ -48,19 +47,60 @@ function normalizeAuthConfig(configured) {
48
47
  }
49
48
  function resolveAuthAdapter(configured, fallback) {
50
49
  const config = normalizeAuthConfig(configured);
51
- return createAuthRuntime({
52
- provider: config.provider ?? config.adapter ?? (fallback?.supabaseUrl ? "supabase" : "mock"),
53
- adapter: config.adapter,
54
- routes: config.routes,
55
- requireAuth: false,
56
- supabase: {
57
- url: config.supabase?.url ?? fallback?.supabaseUrl,
58
- anonKey: config.supabase?.anonKey ?? fallback?.supabaseAnonKey,
59
- client: config.supabase?.client,
60
- callbackUrl: config.supabase?.callbackUrl,
61
- resetPasswordUrl: config.supabase?.resetPasswordUrl
50
+ if (isAuthAdapter(config.adapter)) return config.adapter;
51
+ const provider = config.provider ?? config.adapter ?? (fallback?.supabaseUrl ? "supabase" : "mock");
52
+ if (provider !== "supabase") return createMockAuthAdapter();
53
+ return createLazyAuthAdapter(
54
+ () => import('@fayz-ai/auth/lib/runtime').then(
55
+ ({ createAuthRuntime }) => createAuthRuntime({
56
+ provider: "supabase",
57
+ routes: config.routes,
58
+ requireAuth: false,
59
+ supabase: {
60
+ url: config.supabase?.url ?? fallback?.supabaseUrl,
61
+ anonKey: config.supabase?.anonKey ?? fallback?.supabaseAnonKey,
62
+ client: config.supabase?.client,
63
+ callbackUrl: config.supabase?.callbackUrl,
64
+ resetPasswordUrl: config.supabase?.resetPasswordUrl
65
+ }
66
+ }).adapter
67
+ )
68
+ );
69
+ }
70
+ function createLazyAuthAdapter(load) {
71
+ let loading = null;
72
+ const real = () => loading ?? (loading = load());
73
+ const call = (name) => async (...args) => {
74
+ const adapter = await real();
75
+ const fn = adapter[name];
76
+ if (typeof fn !== "function") throw new Error(`[storefront] the auth adapter has no ${String(name)}`);
77
+ return fn.apply(adapter, args);
78
+ };
79
+ return {
80
+ getSession: call("getSession"),
81
+ signIn: call("signIn"),
82
+ signUp: call("signUp"),
83
+ signOut: call("signOut"),
84
+ signInWithOAuth: call("signInWithOAuth"),
85
+ resetPassword: call("resetPassword"),
86
+ updatePassword: call("updatePassword"),
87
+ handleCallback: call("handleCallback"),
88
+ inviteUser: call("inviteUser"),
89
+ resendConfirmation: call("resendConfirmation"),
90
+ adoptSession: call("adoptSession"),
91
+ onAuthStateChange(cb) {
92
+ let unsubscribe = null;
93
+ let cancelled = false;
94
+ void real().then((adapter) => {
95
+ if (!cancelled) unsubscribe = adapter.onAuthStateChange(cb);
96
+ }).catch(() => {
97
+ });
98
+ return () => {
99
+ cancelled = true;
100
+ unsubscribe?.();
101
+ };
62
102
  }
63
- }).adapter;
103
+ };
64
104
  }
65
105
  var _accessToken = null;
66
106
  var _hadAuthUser = false;
@@ -479,6 +519,6 @@ function useStorefrontHead(input) {
479
519
  }, [description]);
480
520
  }
481
521
 
482
- export { EmailConfirmationRequiredError, SmoothImage, TID, establishCustomerSession, formatMoney, getCustomerAuthAdapter, hasCustomerAuth, initCustomerAuth, relinkCustomer, resolveAuthAdapter, roundCents, signInByEmail, signOutCustomer, signUpCustomer, useSessionStore, useStorefrontHead };
483
- //# sourceMappingURL=chunk-PATS4DIF.js.map
484
- //# sourceMappingURL=chunk-PATS4DIF.js.map
522
+ export { EmailConfirmationRequiredError, SmoothImage, TID, createLazyAuthAdapter, establishCustomerSession, formatMoney, getCustomerAuthAdapter, hasCustomerAuth, initCustomerAuth, relinkCustomer, resolveAuthAdapter, roundCents, signInByEmail, signOutCustomer, signUpCustomer, useSessionStore, useStorefrontHead };
523
+ //# sourceMappingURL=chunk-2D5BEM43.js.map
524
+ //# sourceMappingURL=chunk-2D5BEM43.js.map
@@ -0,0 +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,5 +1,5 @@
1
- import { useDeliveryStore, selectSubtotal, useCartStore } from './chunk-K27LYMSF.js';
2
- import { useSessionStore, TID } from './chunk-PATS4DIF.js';
1
+ import { useDeliveryStore, selectSubtotal, useCartStore } from './chunk-RZWTEC6H.js';
2
+ import { useSessionStore, TID } from './chunk-2D5BEM43.js';
3
3
  import React from 'react';
4
4
  import { ChevronLeft, X, MapPin, Check, Pencil, Trash2, Plus } from 'lucide-react';
5
5
  import { normalizePostalCode, formatPostalCode } from '@fayz-ai/core';
@@ -432,5 +432,5 @@ function AddressForm({ onDone, initial, replaces }) {
432
432
  }
433
433
 
434
434
  export { AddressSheet, useAccountAddresses };
435
- //# sourceMappingURL=chunk-OHWX6BEY.js.map
436
- //# sourceMappingURL=chunk-OHWX6BEY.js.map
435
+ //# sourceMappingURL=chunk-554XAQWK.js.map
436
+ //# sourceMappingURL=chunk-554XAQWK.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/delivery/AddressSheet.tsx"],"names":[],"mappings":"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","file":"chunk-OHWX6BEY.js","sourcesContent":["import React from 'react'\nimport { Check, ChevronLeft, MapPin, Pencil, Plus, Trash2, X } from 'lucide-react'\nimport { formatPostalCode, normalizePostalCode } from '@fayz-ai/core'\nimport { useDeliveryStore, type SavedDeliveryAddress } from '../../stores/delivery.store'\nimport { useCartStore, selectSubtotal } from '../../stores/cart.store'\nimport { TID } from '../../lib/testids'\nimport { useSessionStore } from '../../stores/session.store'\nimport { getShopProvider } from '@fayz-ai/shop/runtime'\nimport type { CustomerAddress } from '@fayz-ai/shop/types'\n\n/** Os apelidos que quase todo mundo usa. \"Outro\" abre o campo livre. */\nconst LABELS = ['Casa', 'Trabalho'] as const\n\n/**\n * \"Onde você quer receber?\" — o caderno de endereços do navegador.\n *\n * Copiado do fluxo que os apps de delivery usam, e a razão de ele ser assim é\n * a ordem das perguntas: o CEP resolve rua, bairro e cidade de graça, então a\n * primeira tela pede só o CEP; a segunda pede exatamente o que nenhuma consulta\n * de CEP sabe — número, complemento e ponto de referência — e o número é o\n * único obrigatório.\n *\n * O que faz isso valer a pena é a terceira visita: quem já salvou não digita\n * nada, escolhe da lista. Um checkout que pede o endereço inteiro toda vez é o\n * atrito que faz a pessoa voltar para o app que já sabe onde ela mora.\n *\n * Fica no NAVEGADOR, e é uma escolha, não uma limitação aceita em silêncio: no\n * delivery o endereço vem antes do login. O caderno da conta (`CustomerAddress`)\n * continua existindo e continua ganhando no checkout quando existe.\n */\nexport function AddressSheet({ onClose, onSignIn }: {\n onClose: () => void\n /** Opens the sign-in modal; absent, the signed-out prompt is not drawn. */\n onSignIn?: () => void\n}) {\n const saved = useDeliveryStore((s) => s.savedAddresses)\n const selectedId = useDeliveryStore((s) => s.selectedAddressId)\n const selectAddress = useDeliveryStore((s) => s.selectAddress)\n const removeAddress = useDeliveryStore((s) => s.removeAddress)\n const saveAddress = useDeliveryStore((s) => s.saveAddress)\n const current = useDeliveryStore((s) => s.address)\n const subtotal = selectSubtotal(useCartStore())\n const customerId = useSessionStore((s) => s.customerId)\n const accountBook = useAccountAddresses(customerId)\n\n // The address on screen that is NOT in the book — typed at checkout, or a\n // CEP looked up without a number. It is what the strip shows, so it is what\n // the sheet must show first; opening straight on «Novo endereço» hid it.\n const unsavedCurrent = current && !saved.some((a) => a.id === selectedId) ? current : null\n // Account addresses not already copied into this browser's book.\n const fromAccount = accountBook.filter((a) => !saved.some((b) =>\n normalizePostalCode(b.postalCode) === normalizePostalCode(a.postalCode)\n && b.number.trim().toLowerCase() === (a.number ?? '').trim().toLowerCase()))\n\n const nothingToList = saved.length === 0 && !unsavedCurrent && fromAccount.length === 0 && !customerId\n // Nothing at all to choose from: the form IS the screen.\n const [editing, setEditing] = React.useState<null | { initial?: Partial<SavedDeliveryAddress>; replaces?: string }>(\n nothingToList && !onSignIn ? {} : null,\n )\n\n function pickAccountAddress(a: CustomerAddress) {\n const id = saveAddress({\n label: a.label ?? null,\n postalCode: a.postalCode,\n street: a.street,\n number: a.number ?? '',\n complement: a.complement ?? null,\n reference: null,\n district: a.district ?? '',\n city: a.city,\n state: a.state,\n country: a.country,\n })\n void selectAddress(id, subtotal)\n onClose()\n }\n\n // Esc and a tap outside close it, as the account drawer does; inside the\n // form, Esc steps back to the list first.\n const closeRef = React.useRef<() => void>(() => {})\n closeRef.current = () => { if (editing && !nothingToList) setEditing(null); else onClose() }\n React.useEffect(() => {\n const onKey = (e: KeyboardEvent) => { if (e.key === 'Escape') closeRef.current() }\n window.addEventListener('keydown', onKey)\n return () => window.removeEventListener('keydown', onKey)\n }, [])\n\n return (\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Endereço de entrega\"\n data-testid={TID.addressSheet}\n onClick={(e) => { if (e.target === e.currentTarget) onClose() }}\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=\"flex max-h-[85vh] w-full flex-col overflow-hidden rounded-t-2xl bg-background sm:max-w-md sm:rounded-2xl\">\n <div className=\"flex items-center gap-2 border-b border-border p-4\">\n {editing && !nothingToList && (\n <button\n type=\"button\"\n onClick={() => setEditing(null)}\n aria-label=\"Voltar\"\n className=\"-ml-2 grid h-9 w-9 place-items-center rounded-full\"\n >\n <ChevronLeft className=\"h-5 w-5\" />\n </button>\n )}\n <h2 className=\"flex-1 text-lg font-semibold\">\n {editing ? (editing.replaces ? 'Editar endereço' : 'Novo endereço') : 'Onde você quer receber?'}\n </h2>\n <button\n type=\"button\"\n onClick={onClose}\n aria-label=\"Fechar\"\n className=\"-mr-2 grid h-9 w-9 place-items-center rounded-full\"\n >\n <X className=\"h-5 w-5\" />\n </button>\n </div>\n\n {editing ? (\n <AddressForm\n initial={editing.initial}\n replaces={editing.replaces}\n onDone={() => {\n setEditing(null)\n onClose()\n }}\n />\n ) : (\n <div className=\"min-h-0 flex-1 overflow-y-auto p-4\">\n {unsavedCurrent && (\n <section className=\"mb-4\" data-testid=\"address-current\">\n <h3 className=\"mb-2 text-xs font-semibold uppercase tracking-wide text-muted-foreground\">Endereço atual</h3>\n <div className=\"flex items-start gap-3 rounded-lg border border-primary p-3\">\n <MapPin className=\"mt-0.5 h-5 w-5 shrink-0 text-primary\" />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-sm\">{unsavedCurrent.street}</span>\n <span className=\"block truncate text-xs text-muted-foreground\">\n {[unsavedCurrent.district, unsavedCurrent.city].filter(Boolean).join(' · ')}\n </span>\n </span>\n <button\n type=\"button\"\n data-testid=\"address-complete-current\"\n onClick={() => setEditing({ initial: { postalCode: unsavedCurrent.postalCode } })}\n className=\"shrink-0 text-sm font-semibold text-primary\"\n >\n Completar\n </button>\n </div>\n </section>\n )}\n\n {saved.length > 0 && (\n <section className=\"mb-4\">\n <h3 className=\"mb-2 text-xs font-semibold uppercase tracking-wide text-muted-foreground\">Seus endereços</h3>\n <ul className=\"space-y-2\">\n {saved.map((address) => (\n <li key={address.id} className=\"flex items-start gap-1\">\n <button\n type=\"button\"\n data-testid={TID.savedAddress(address.id)}\n aria-pressed={selectedId === address.id}\n onClick={() => {\n void selectAddress(address.id, subtotal)\n onClose()\n }}\n className={`flex min-w-0 flex-1 items-start gap-3 rounded-lg border p-3 text-left ${\n selectedId === address.id ? 'border-primary' : 'border-border'\n }`}\n >\n {selectedId === address.id\n ? <Check className=\"mt-0.5 h-5 w-5 shrink-0 text-primary\" />\n : <MapPin className=\"mt-0.5 h-5 w-5 shrink-0 text-muted-foreground\" />}\n <AddressLines address={address} />\n </button>\n <button\n type=\"button\"\n data-testid={`edit-address-${address.id}`}\n onClick={() => setEditing({ initial: address, replaces: address.id })}\n aria-label={`Editar ${address.street}, ${address.number}`}\n className=\"mt-1 grid h-10 w-10 shrink-0 place-items-center rounded-full text-muted-foreground\"\n >\n <Pencil className=\"h-4 w-4\" />\n </button>\n <button\n type=\"button\"\n onClick={() => removeAddress(address.id)}\n aria-label={`Remover ${address.street}, ${address.number}`}\n className=\"mt-1 grid h-10 w-10 shrink-0 place-items-center rounded-full text-muted-foreground\"\n >\n <Trash2 className=\"h-4 w-4\" />\n </button>\n </li>\n ))}\n </ul>\n </section>\n )}\n\n {fromAccount.length > 0 && (\n <section className=\"mb-4\" data-testid=\"address-account-book\">\n <h3 className=\"mb-2 text-xs font-semibold uppercase tracking-wide text-muted-foreground\">Da sua conta</h3>\n <ul className=\"space-y-2\">\n {fromAccount.map((address) => (\n <li key={address.id}>\n <button\n type=\"button\"\n onClick={() => pickAccountAddress(address)}\n className=\"flex w-full min-w-0 items-start gap-3 rounded-lg border border-border p-3 text-left\"\n >\n <MapPin className=\"mt-0.5 h-5 w-5 shrink-0 text-muted-foreground\" />\n <AddressLines address={{\n label: address.label ?? null,\n street: address.street,\n number: address.number ?? '',\n complement: address.complement ?? null,\n district: address.district ?? '',\n city: address.city,\n reference: null,\n }} />\n </button>\n </li>\n ))}\n </ul>\n </section>\n )}\n\n {!customerId && onSignIn && (\n <div data-testid=\"address-sign-in\" className=\"mb-4 rounded-lg bg-muted/40 p-3 text-sm\">\n <p>Entre na sua conta para usar os endereços salvos nela.</p>\n <button\n type=\"button\"\n onClick={onSignIn}\n className=\"mt-2 font-semibold text-primary\"\n >\n Entrar ou criar conta\n </button>\n </div>\n )}\n\n <button\n type=\"button\"\n data-testid={TID.addressAddNew}\n onClick={() => setEditing({})}\n className=\"flex w-full items-center justify-center gap-2 rounded-full border border-border px-4 py-3 text-sm font-semibold\"\n >\n <Plus className=\"h-4 w-4\" />\n Adicionar novo endereço\n </button>\n </div>\n )}\n </div>\n </div>\n )\n}\n\nfunction AddressLines({ address }: {\n address: Pick<SavedDeliveryAddress, 'label' | 'street' | 'number' | 'complement' | 'district' | 'city' | 'reference'>\n}) {\n return (\n <span className=\"min-w-0 flex-1\">\n {address.label && <span className=\"block text-sm font-semibold\">{address.label}</span>}\n <span className=\"block truncate text-sm\">\n {address.street}{address.number ? `, ${address.number}` : ''}\n </span>\n <span className=\"block truncate text-xs text-muted-foreground\">\n {[address.complement, address.district, address.city].filter(Boolean).join(' · ')}\n </span>\n {address.reference && (\n <span className=\"mt-0.5 block truncate text-xs text-muted-foreground\">{address.reference}</span>\n )}\n </span>\n )\n}\n\n/**\n * The signed-in customer's own address book (public.addresses, RLS-scoped to\n * them). Empty for a guest, and on any failure: the browser's book still works.\n */\nexport function useAccountAddresses(customerId: string | null): CustomerAddress[] {\n const [rows, setRows] = React.useState<CustomerAddress[]>([])\n React.useEffect(() => {\n if (!customerId) { setRows([]); return }\n const shop = getShopProvider()\n if (typeof shop.listCustomerAddresses !== 'function') return\n let cancelled = false\n shop.listCustomerAddresses(customerId)\n .then((list) => { if (!cancelled) setRows(list) })\n .catch(() => { if (!cancelled) setRows([]) })\n return () => { cancelled = true }\n }, [customerId])\n return rows\n}\n\n/**\n * CEP primeiro, resto depois.\n *\n * Uma tela só com sete campos, sendo quatro deles preenchíveis por consulta, é\n * a forma mais rápida de fazer alguém desistir. Os campos da consulta ficam\n * VISÍVEIS mas em leitura: a pessoa precisa conferir que o CEP achou a rua\n * certa — e conferir é diferente de digitar.\n */\nfunction AddressForm({ onDone, initial, replaces }: {\n onDone: () => void\n /** Prefill: a saved address being edited, or the current one being completed. */\n initial?: Partial<SavedDeliveryAddress>\n /** The saved address this form rewrites; removed when the new one is saved. */\n replaces?: string\n}) {\n const resolve = useDeliveryStore((s) => s.resolve)\n const saveAddress = useDeliveryStore((s) => s.saveAddress)\n const removeAddress = useDeliveryStore((s) => s.removeAddress)\n const looked = useDeliveryStore((s) => s.address)\n const status = useDeliveryStore((s) => s.status)\n const storeError = useDeliveryStore((s) => s.error)\n const refusedZone = useDeliveryStore((s) => s.refusedZone)\n const subtotal = selectSubtotal(useCartStore())\n\n const [cep, setCep] = React.useState(initial?.postalCode ? formatPostalCode(initial.postalCode) : '')\n const [number, setNumber] = React.useState(initial?.number ?? '')\n const [complement, setComplement] = React.useState(initial?.complement ?? '')\n const [reference, setReference] = React.useState(initial?.reference ?? '')\n const [label, setLabel] = React.useState<string>(initial?.label ?? '')\n const [touched, setTouched] = React.useState(false)\n const numberRef = React.useRef<HTMLInputElement>(null)\n\n const digits = normalizePostalCode(cep)\n const found = Boolean(looked) && normalizePostalCode(looked!.postalCode) === digits\n\n // O foco cai no número assim que a rua chega. É o único campo que sobrou\n // para digitar, e fazer a pessoa procurá-lo desfaz o que a consulta ganhou.\n React.useEffect(() => {\n if (found) numberRef.current?.focus()\n }, [found])\n\n async function lookUp() {\n if (digits.length !== 8) return\n await resolve(digits, subtotal)\n }\n\n // A prefilled CEP is looked up at once: editing an address or completing the\n // current one must land on the number, not on a «Buscar» button.\n const prefilled = React.useRef(false)\n React.useEffect(() => {\n if (prefilled.current || !initial?.postalCode) return\n prefilled.current = true\n if (!found) void lookUp()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n function submit(event: React.FormEvent) {\n event.preventDefault()\n setTouched(true)\n if (!found || !number.trim()) return\n if (replaces) removeAddress(replaces)\n saveAddress({\n label: label.trim() || null,\n postalCode: looked!.postalCode,\n street: looked!.street,\n number: number.trim(),\n complement: complement.trim() || null,\n reference: reference.trim() || null,\n district: looked!.district,\n city: looked!.city,\n state: looked!.state,\n })\n onDone()\n }\n\n const numberMissing = touched && !number.trim()\n\n return (\n <form onSubmit={submit} className=\"min-h-0 flex-1 overflow-y-auto p-4\">\n <label htmlFor=\"address-cep\" className=\"text-sm font-medium\">\n CEP\n </label>\n <div className=\"mt-1 flex gap-2\">\n <input\n id=\"address-cep\"\n data-testid={TID.addressCep}\n value={cep}\n onChange={(e) => setCep(formatPostalCode(e.target.value))}\n onBlur={() => void lookUp()}\n // inputMode numérico: um teclado alfabético para oito dígitos é o\n // erro de formulário mobile mais fácil de cometer e de corrigir.\n inputMode=\"numeric\"\n autoComplete=\"postal-code\"\n placeholder=\"00000-000\"\n className=\"h-12 flex-1 rounded-lg border border-border bg-transparent px-3 text-base\"\n />\n <button\n type=\"button\"\n onClick={() => void lookUp()}\n disabled={digits.length !== 8 || status === 'loading'}\n className=\"h-12 rounded-lg bg-primary px-4 text-sm font-semibold text-primary-foreground disabled:opacity-40\"\n >\n {status === 'loading' ? 'Buscando…' : 'Buscar'}\n </button>\n </div>\n {storeError && <p className=\"mt-2 text-sm text-destructive\">{storeError}</p>}\n {/* A recusa da loja (0048) aparece aqui e não só no checkout: descobrir\n que não entregam no seu CEP depois de montar o carrinho é a pior hora\n possível para descobrir. */}\n {refusedZone && (\n <p className=\"mt-2 text-sm text-destructive\">\n Ainda não entregamos nessa região ({refusedZone}).\n </p>\n )}\n\n {found && (\n <>\n <p className=\"mt-4 rounded-lg bg-muted/40 p-3 text-sm\">\n <span className=\"block font-medium\">{looked!.street}</span>\n <span className=\"block text-muted-foreground\">\n {looked!.district} · {looked!.city} — {looked!.state}\n </span>\n </p>\n\n <div className=\"mt-4 grid grid-cols-2 gap-3\">\n <div>\n <label htmlFor=\"address-number\" className=\"text-sm font-medium\">\n Número\n </label>\n <input\n id=\"address-number\"\n ref={numberRef}\n data-testid={TID.addressNumber}\n value={number}\n onChange={(e) => setNumber(e.target.value)}\n inputMode=\"numeric\"\n autoComplete=\"address-line2\"\n aria-invalid={numberMissing || undefined}\n aria-describedby={numberMissing ? 'address-number-error' : undefined}\n className={`mt-1 h-12 w-full rounded-lg border bg-transparent px-3 text-base ${\n numberMissing ? 'border-destructive' : 'border-border'\n }`}\n />\n {numberMissing && (\n // Junto do campo e não num resumo no topo: o erro é sobre ESTE\n // campo, e a pessoa está olhando para ele.\n <p id=\"address-number-error\" className=\"mt-1 text-xs text-destructive\">\n Informe o número.\n </p>\n )}\n </div>\n <div>\n <label htmlFor=\"address-complement\" className=\"text-sm font-medium\">\n Complemento\n </label>\n <input\n id=\"address-complement\"\n data-testid={TID.addressComplement}\n value={complement}\n onChange={(e) => setComplement(e.target.value)}\n placeholder=\"Apto, bloco…\"\n className=\"mt-1 h-12 w-full rounded-lg border border-border bg-transparent px-3 text-base\"\n />\n </div>\n </div>\n\n <div className=\"mt-4\">\n <label htmlFor=\"address-reference\" className=\"text-sm font-medium\">\n Ponto de referência\n </label>\n <input\n id=\"address-reference\"\n data-testid={TID.addressReference}\n value={reference}\n onChange={(e) => setReference(e.target.value)}\n placeholder=\"Portão azul, ao lado da padaria\"\n className=\"mt-1 h-12 w-full rounded-lg border border-border bg-transparent px-3 text-base\"\n />\n </div>\n\n <fieldset className=\"mt-4\">\n <legend className=\"text-sm font-medium\">Salvar como</legend>\n <div className=\"mt-2 flex flex-wrap gap-2\">\n {LABELS.map((name) => (\n <button\n key={name}\n type=\"button\"\n aria-pressed={label === name}\n onClick={() => setLabel(label === name ? '' : name)}\n className={`rounded-full px-4 py-2 text-sm font-medium ${\n label === name\n ? 'bg-foreground text-background'\n : 'border border-border text-muted-foreground'\n }`}\n >\n {name}\n </button>\n ))}\n <input\n value={LABELS.includes(label as (typeof LABELS)[number]) ? '' : label}\n onChange={(e) => setLabel(e.target.value)}\n placeholder=\"Outro\"\n aria-label=\"Outro apelido\"\n className=\"h-10 min-w-24 flex-1 rounded-full border border-border bg-transparent px-4 text-sm\"\n />\n </div>\n </fieldset>\n\n <button\n type=\"submit\"\n data-testid={TID.addressSave}\n className=\"mt-6 h-12 w-full rounded-full bg-primary font-semibold text-primary-foreground\"\n >\n Salvar endereço\n </button>\n </>\n )}\n </form>\n )\n}\n"]}
1
+ {"version":3,"sources":["../src/components/delivery/AddressSheet.tsx"],"names":[],"mappings":"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","file":"chunk-554XAQWK.js","sourcesContent":["import React from 'react'\nimport { Check, ChevronLeft, MapPin, Pencil, Plus, Trash2, X } from 'lucide-react'\nimport { formatPostalCode, normalizePostalCode } from '@fayz-ai/core'\nimport { useDeliveryStore, type SavedDeliveryAddress } from '../../stores/delivery.store'\nimport { useCartStore, selectSubtotal } from '../../stores/cart.store'\nimport { TID } from '../../lib/testids'\nimport { useSessionStore } from '../../stores/session.store'\nimport { getShopProvider } from '@fayz-ai/shop/runtime'\nimport type { CustomerAddress } from '@fayz-ai/shop/types'\n\n/** Os apelidos que quase todo mundo usa. \"Outro\" abre o campo livre. */\nconst LABELS = ['Casa', 'Trabalho'] as const\n\n/**\n * \"Onde você quer receber?\" — o caderno de endereços do navegador.\n *\n * Copiado do fluxo que os apps de delivery usam, e a razão de ele ser assim é\n * a ordem das perguntas: o CEP resolve rua, bairro e cidade de graça, então a\n * primeira tela pede só o CEP; a segunda pede exatamente o que nenhuma consulta\n * de CEP sabe — número, complemento e ponto de referência — e o número é o\n * único obrigatório.\n *\n * O que faz isso valer a pena é a terceira visita: quem já salvou não digita\n * nada, escolhe da lista. Um checkout que pede o endereço inteiro toda vez é o\n * atrito que faz a pessoa voltar para o app que já sabe onde ela mora.\n *\n * Fica no NAVEGADOR, e é uma escolha, não uma limitação aceita em silêncio: no\n * delivery o endereço vem antes do login. O caderno da conta (`CustomerAddress`)\n * continua existindo e continua ganhando no checkout quando existe.\n */\nexport function AddressSheet({ onClose, onSignIn }: {\n onClose: () => void\n /** Opens the sign-in modal; absent, the signed-out prompt is not drawn. */\n onSignIn?: () => void\n}) {\n const saved = useDeliveryStore((s) => s.savedAddresses)\n const selectedId = useDeliveryStore((s) => s.selectedAddressId)\n const selectAddress = useDeliveryStore((s) => s.selectAddress)\n const removeAddress = useDeliveryStore((s) => s.removeAddress)\n const saveAddress = useDeliveryStore((s) => s.saveAddress)\n const current = useDeliveryStore((s) => s.address)\n const subtotal = selectSubtotal(useCartStore())\n const customerId = useSessionStore((s) => s.customerId)\n const accountBook = useAccountAddresses(customerId)\n\n // The address on screen that is NOT in the book — typed at checkout, or a\n // CEP looked up without a number. It is what the strip shows, so it is what\n // the sheet must show first; opening straight on «Novo endereço» hid it.\n const unsavedCurrent = current && !saved.some((a) => a.id === selectedId) ? current : null\n // Account addresses not already copied into this browser's book.\n const fromAccount = accountBook.filter((a) => !saved.some((b) =>\n normalizePostalCode(b.postalCode) === normalizePostalCode(a.postalCode)\n && b.number.trim().toLowerCase() === (a.number ?? '').trim().toLowerCase()))\n\n const nothingToList = saved.length === 0 && !unsavedCurrent && fromAccount.length === 0 && !customerId\n // Nothing at all to choose from: the form IS the screen.\n const [editing, setEditing] = React.useState<null | { initial?: Partial<SavedDeliveryAddress>; replaces?: string }>(\n nothingToList && !onSignIn ? {} : null,\n )\n\n function pickAccountAddress(a: CustomerAddress) {\n const id = saveAddress({\n label: a.label ?? null,\n postalCode: a.postalCode,\n street: a.street,\n number: a.number ?? '',\n complement: a.complement ?? null,\n reference: null,\n district: a.district ?? '',\n city: a.city,\n state: a.state,\n country: a.country,\n })\n void selectAddress(id, subtotal)\n onClose()\n }\n\n // Esc and a tap outside close it, as the account drawer does; inside the\n // form, Esc steps back to the list first.\n const closeRef = React.useRef<() => void>(() => {})\n closeRef.current = () => { if (editing && !nothingToList) setEditing(null); else onClose() }\n React.useEffect(() => {\n const onKey = (e: KeyboardEvent) => { if (e.key === 'Escape') closeRef.current() }\n window.addEventListener('keydown', onKey)\n return () => window.removeEventListener('keydown', onKey)\n }, [])\n\n return (\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Endereço de entrega\"\n data-testid={TID.addressSheet}\n onClick={(e) => { if (e.target === e.currentTarget) onClose() }}\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=\"flex max-h-[85vh] w-full flex-col overflow-hidden rounded-t-2xl bg-background sm:max-w-md sm:rounded-2xl\">\n <div className=\"flex items-center gap-2 border-b border-border p-4\">\n {editing && !nothingToList && (\n <button\n type=\"button\"\n onClick={() => setEditing(null)}\n aria-label=\"Voltar\"\n className=\"-ml-2 grid h-9 w-9 place-items-center rounded-full\"\n >\n <ChevronLeft className=\"h-5 w-5\" />\n </button>\n )}\n <h2 className=\"flex-1 text-lg font-semibold\">\n {editing ? (editing.replaces ? 'Editar endereço' : 'Novo endereço') : 'Onde você quer receber?'}\n </h2>\n <button\n type=\"button\"\n onClick={onClose}\n aria-label=\"Fechar\"\n className=\"-mr-2 grid h-9 w-9 place-items-center rounded-full\"\n >\n <X className=\"h-5 w-5\" />\n </button>\n </div>\n\n {editing ? (\n <AddressForm\n initial={editing.initial}\n replaces={editing.replaces}\n onDone={() => {\n setEditing(null)\n onClose()\n }}\n />\n ) : (\n <div className=\"min-h-0 flex-1 overflow-y-auto p-4\">\n {unsavedCurrent && (\n <section className=\"mb-4\" data-testid=\"address-current\">\n <h3 className=\"mb-2 text-xs font-semibold uppercase tracking-wide text-muted-foreground\">Endereço atual</h3>\n <div className=\"flex items-start gap-3 rounded-lg border border-primary p-3\">\n <MapPin className=\"mt-0.5 h-5 w-5 shrink-0 text-primary\" />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-sm\">{unsavedCurrent.street}</span>\n <span className=\"block truncate text-xs text-muted-foreground\">\n {[unsavedCurrent.district, unsavedCurrent.city].filter(Boolean).join(' · ')}\n </span>\n </span>\n <button\n type=\"button\"\n data-testid=\"address-complete-current\"\n onClick={() => setEditing({ initial: { postalCode: unsavedCurrent.postalCode } })}\n className=\"shrink-0 text-sm font-semibold text-primary\"\n >\n Completar\n </button>\n </div>\n </section>\n )}\n\n {saved.length > 0 && (\n <section className=\"mb-4\">\n <h3 className=\"mb-2 text-xs font-semibold uppercase tracking-wide text-muted-foreground\">Seus endereços</h3>\n <ul className=\"space-y-2\">\n {saved.map((address) => (\n <li key={address.id} className=\"flex items-start gap-1\">\n <button\n type=\"button\"\n data-testid={TID.savedAddress(address.id)}\n aria-pressed={selectedId === address.id}\n onClick={() => {\n void selectAddress(address.id, subtotal)\n onClose()\n }}\n className={`flex min-w-0 flex-1 items-start gap-3 rounded-lg border p-3 text-left ${\n selectedId === address.id ? 'border-primary' : 'border-border'\n }`}\n >\n {selectedId === address.id\n ? <Check className=\"mt-0.5 h-5 w-5 shrink-0 text-primary\" />\n : <MapPin className=\"mt-0.5 h-5 w-5 shrink-0 text-muted-foreground\" />}\n <AddressLines address={address} />\n </button>\n <button\n type=\"button\"\n data-testid={`edit-address-${address.id}`}\n onClick={() => setEditing({ initial: address, replaces: address.id })}\n aria-label={`Editar ${address.street}, ${address.number}`}\n className=\"mt-1 grid h-10 w-10 shrink-0 place-items-center rounded-full text-muted-foreground\"\n >\n <Pencil className=\"h-4 w-4\" />\n </button>\n <button\n type=\"button\"\n onClick={() => removeAddress(address.id)}\n aria-label={`Remover ${address.street}, ${address.number}`}\n className=\"mt-1 grid h-10 w-10 shrink-0 place-items-center rounded-full text-muted-foreground\"\n >\n <Trash2 className=\"h-4 w-4\" />\n </button>\n </li>\n ))}\n </ul>\n </section>\n )}\n\n {fromAccount.length > 0 && (\n <section className=\"mb-4\" data-testid=\"address-account-book\">\n <h3 className=\"mb-2 text-xs font-semibold uppercase tracking-wide text-muted-foreground\">Da sua conta</h3>\n <ul className=\"space-y-2\">\n {fromAccount.map((address) => (\n <li key={address.id}>\n <button\n type=\"button\"\n onClick={() => pickAccountAddress(address)}\n className=\"flex w-full min-w-0 items-start gap-3 rounded-lg border border-border p-3 text-left\"\n >\n <MapPin className=\"mt-0.5 h-5 w-5 shrink-0 text-muted-foreground\" />\n <AddressLines address={{\n label: address.label ?? null,\n street: address.street,\n number: address.number ?? '',\n complement: address.complement ?? null,\n district: address.district ?? '',\n city: address.city,\n reference: null,\n }} />\n </button>\n </li>\n ))}\n </ul>\n </section>\n )}\n\n {!customerId && onSignIn && (\n <div data-testid=\"address-sign-in\" className=\"mb-4 rounded-lg bg-muted/40 p-3 text-sm\">\n <p>Entre na sua conta para usar os endereços salvos nela.</p>\n <button\n type=\"button\"\n onClick={onSignIn}\n className=\"mt-2 font-semibold text-primary\"\n >\n Entrar ou criar conta\n </button>\n </div>\n )}\n\n <button\n type=\"button\"\n data-testid={TID.addressAddNew}\n onClick={() => setEditing({})}\n className=\"flex w-full items-center justify-center gap-2 rounded-full border border-border px-4 py-3 text-sm font-semibold\"\n >\n <Plus className=\"h-4 w-4\" />\n Adicionar novo endereço\n </button>\n </div>\n )}\n </div>\n </div>\n )\n}\n\nfunction AddressLines({ address }: {\n address: Pick<SavedDeliveryAddress, 'label' | 'street' | 'number' | 'complement' | 'district' | 'city' | 'reference'>\n}) {\n return (\n <span className=\"min-w-0 flex-1\">\n {address.label && <span className=\"block text-sm font-semibold\">{address.label}</span>}\n <span className=\"block truncate text-sm\">\n {address.street}{address.number ? `, ${address.number}` : ''}\n </span>\n <span className=\"block truncate text-xs text-muted-foreground\">\n {[address.complement, address.district, address.city].filter(Boolean).join(' · ')}\n </span>\n {address.reference && (\n <span className=\"mt-0.5 block truncate text-xs text-muted-foreground\">{address.reference}</span>\n )}\n </span>\n )\n}\n\n/**\n * The signed-in customer's own address book (public.addresses, RLS-scoped to\n * them). Empty for a guest, and on any failure: the browser's book still works.\n */\nexport function useAccountAddresses(customerId: string | null): CustomerAddress[] {\n const [rows, setRows] = React.useState<CustomerAddress[]>([])\n React.useEffect(() => {\n if (!customerId) { setRows([]); return }\n const shop = getShopProvider()\n if (typeof shop.listCustomerAddresses !== 'function') return\n let cancelled = false\n shop.listCustomerAddresses(customerId)\n .then((list) => { if (!cancelled) setRows(list) })\n .catch(() => { if (!cancelled) setRows([]) })\n return () => { cancelled = true }\n }, [customerId])\n return rows\n}\n\n/**\n * CEP primeiro, resto depois.\n *\n * Uma tela só com sete campos, sendo quatro deles preenchíveis por consulta, é\n * a forma mais rápida de fazer alguém desistir. Os campos da consulta ficam\n * VISÍVEIS mas em leitura: a pessoa precisa conferir que o CEP achou a rua\n * certa — e conferir é diferente de digitar.\n */\nfunction AddressForm({ onDone, initial, replaces }: {\n onDone: () => void\n /** Prefill: a saved address being edited, or the current one being completed. */\n initial?: Partial<SavedDeliveryAddress>\n /** The saved address this form rewrites; removed when the new one is saved. */\n replaces?: string\n}) {\n const resolve = useDeliveryStore((s) => s.resolve)\n const saveAddress = useDeliveryStore((s) => s.saveAddress)\n const removeAddress = useDeliveryStore((s) => s.removeAddress)\n const looked = useDeliveryStore((s) => s.address)\n const status = useDeliveryStore((s) => s.status)\n const storeError = useDeliveryStore((s) => s.error)\n const refusedZone = useDeliveryStore((s) => s.refusedZone)\n const subtotal = selectSubtotal(useCartStore())\n\n const [cep, setCep] = React.useState(initial?.postalCode ? formatPostalCode(initial.postalCode) : '')\n const [number, setNumber] = React.useState(initial?.number ?? '')\n const [complement, setComplement] = React.useState(initial?.complement ?? '')\n const [reference, setReference] = React.useState(initial?.reference ?? '')\n const [label, setLabel] = React.useState<string>(initial?.label ?? '')\n const [touched, setTouched] = React.useState(false)\n const numberRef = React.useRef<HTMLInputElement>(null)\n\n const digits = normalizePostalCode(cep)\n const found = Boolean(looked) && normalizePostalCode(looked!.postalCode) === digits\n\n // O foco cai no número assim que a rua chega. É o único campo que sobrou\n // para digitar, e fazer a pessoa procurá-lo desfaz o que a consulta ganhou.\n React.useEffect(() => {\n if (found) numberRef.current?.focus()\n }, [found])\n\n async function lookUp() {\n if (digits.length !== 8) return\n await resolve(digits, subtotal)\n }\n\n // A prefilled CEP is looked up at once: editing an address or completing the\n // current one must land on the number, not on a «Buscar» button.\n const prefilled = React.useRef(false)\n React.useEffect(() => {\n if (prefilled.current || !initial?.postalCode) return\n prefilled.current = true\n if (!found) void lookUp()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n function submit(event: React.FormEvent) {\n event.preventDefault()\n setTouched(true)\n if (!found || !number.trim()) return\n if (replaces) removeAddress(replaces)\n saveAddress({\n label: label.trim() || null,\n postalCode: looked!.postalCode,\n street: looked!.street,\n number: number.trim(),\n complement: complement.trim() || null,\n reference: reference.trim() || null,\n district: looked!.district,\n city: looked!.city,\n state: looked!.state,\n })\n onDone()\n }\n\n const numberMissing = touched && !number.trim()\n\n return (\n <form onSubmit={submit} className=\"min-h-0 flex-1 overflow-y-auto p-4\">\n <label htmlFor=\"address-cep\" className=\"text-sm font-medium\">\n CEP\n </label>\n <div className=\"mt-1 flex gap-2\">\n <input\n id=\"address-cep\"\n data-testid={TID.addressCep}\n value={cep}\n onChange={(e) => setCep(formatPostalCode(e.target.value))}\n onBlur={() => void lookUp()}\n // inputMode numérico: um teclado alfabético para oito dígitos é o\n // erro de formulário mobile mais fácil de cometer e de corrigir.\n inputMode=\"numeric\"\n autoComplete=\"postal-code\"\n placeholder=\"00000-000\"\n className=\"h-12 flex-1 rounded-lg border border-border bg-transparent px-3 text-base\"\n />\n <button\n type=\"button\"\n onClick={() => void lookUp()}\n disabled={digits.length !== 8 || status === 'loading'}\n className=\"h-12 rounded-lg bg-primary px-4 text-sm font-semibold text-primary-foreground disabled:opacity-40\"\n >\n {status === 'loading' ? 'Buscando…' : 'Buscar'}\n </button>\n </div>\n {storeError && <p className=\"mt-2 text-sm text-destructive\">{storeError}</p>}\n {/* A recusa da loja (0048) aparece aqui e não só no checkout: descobrir\n que não entregam no seu CEP depois de montar o carrinho é a pior hora\n possível para descobrir. */}\n {refusedZone && (\n <p className=\"mt-2 text-sm text-destructive\">\n Ainda não entregamos nessa região ({refusedZone}).\n </p>\n )}\n\n {found && (\n <>\n <p className=\"mt-4 rounded-lg bg-muted/40 p-3 text-sm\">\n <span className=\"block font-medium\">{looked!.street}</span>\n <span className=\"block text-muted-foreground\">\n {looked!.district} · {looked!.city} — {looked!.state}\n </span>\n </p>\n\n <div className=\"mt-4 grid grid-cols-2 gap-3\">\n <div>\n <label htmlFor=\"address-number\" className=\"text-sm font-medium\">\n Número\n </label>\n <input\n id=\"address-number\"\n ref={numberRef}\n data-testid={TID.addressNumber}\n value={number}\n onChange={(e) => setNumber(e.target.value)}\n inputMode=\"numeric\"\n autoComplete=\"address-line2\"\n aria-invalid={numberMissing || undefined}\n aria-describedby={numberMissing ? 'address-number-error' : undefined}\n className={`mt-1 h-12 w-full rounded-lg border bg-transparent px-3 text-base ${\n numberMissing ? 'border-destructive' : 'border-border'\n }`}\n />\n {numberMissing && (\n // Junto do campo e não num resumo no topo: o erro é sobre ESTE\n // campo, e a pessoa está olhando para ele.\n <p id=\"address-number-error\" className=\"mt-1 text-xs text-destructive\">\n Informe o número.\n </p>\n )}\n </div>\n <div>\n <label htmlFor=\"address-complement\" className=\"text-sm font-medium\">\n Complemento\n </label>\n <input\n id=\"address-complement\"\n data-testid={TID.addressComplement}\n value={complement}\n onChange={(e) => setComplement(e.target.value)}\n placeholder=\"Apto, bloco…\"\n className=\"mt-1 h-12 w-full rounded-lg border border-border bg-transparent px-3 text-base\"\n />\n </div>\n </div>\n\n <div className=\"mt-4\">\n <label htmlFor=\"address-reference\" className=\"text-sm font-medium\">\n Ponto de referência\n </label>\n <input\n id=\"address-reference\"\n data-testid={TID.addressReference}\n value={reference}\n onChange={(e) => setReference(e.target.value)}\n placeholder=\"Portão azul, ao lado da padaria\"\n className=\"mt-1 h-12 w-full rounded-lg border border-border bg-transparent px-3 text-base\"\n />\n </div>\n\n <fieldset className=\"mt-4\">\n <legend className=\"text-sm font-medium\">Salvar como</legend>\n <div className=\"mt-2 flex flex-wrap gap-2\">\n {LABELS.map((name) => (\n <button\n key={name}\n type=\"button\"\n aria-pressed={label === name}\n onClick={() => setLabel(label === name ? '' : name)}\n className={`rounded-full px-4 py-2 text-sm font-medium ${\n label === name\n ? 'bg-foreground text-background'\n : 'border border-border text-muted-foreground'\n }`}\n >\n {name}\n </button>\n ))}\n <input\n value={LABELS.includes(label as (typeof LABELS)[number]) ? '' : label}\n onChange={(e) => setLabel(e.target.value)}\n placeholder=\"Outro\"\n aria-label=\"Outro apelido\"\n className=\"h-10 min-w-24 flex-1 rounded-full border border-border bg-transparent px-4 text-sm\"\n />\n </div>\n </fieldset>\n\n <button\n type=\"submit\"\n data-testid={TID.addressSave}\n className=\"mt-6 h-12 w-full rounded-full bg-primary font-semibold text-primary-foreground\"\n >\n Salvar endereço\n </button>\n </>\n )}\n </form>\n )\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  import { SuccessMark } from './chunk-WDQFNHYO.js';
2
- import { CustomerAccountShell, isPaid, financialStatusBadge, OrderTrackingTimeline } from './chunk-D5C5U2SG.js';
2
+ import { CustomerAccountShell, isPaid, financialStatusBadge, OrderTrackingTimeline } from './chunk-PURHMU2W.js';
3
3
  import { SkeletonGroup, Skeleton } from './chunk-FCPOPWG3.js';
4
- import { useStorefrontHead, TID, SmoothImage, formatMoney } from './chunk-PATS4DIF.js';
4
+ import { useStorefrontHead, TID, SmoothImage, formatMoney } from './chunk-2D5BEM43.js';
5
5
  import { useStorefrontConfig, Link, navigateTo } from './chunk-GVZ2SAOI.js';
6
6
  import React, { useState, useEffect } from 'react';
7
7
  import { getShopProvider } from '@fayz-ai/shop/runtime';
@@ -212,5 +212,5 @@ function OrderConfirmationPage({ orderId }) {
212
212
  }
213
213
 
214
214
  export { OrderConfirmationPage };
215
- //# sourceMappingURL=chunk-GQ3TCJVX.js.map
216
- //# sourceMappingURL=chunk-GQ3TCJVX.js.map
215
+ //# sourceMappingURL=chunk-F3U4KZC7.js.map
216
+ //# sourceMappingURL=chunk-F3U4KZC7.js.map