@fayz-ai/storefront 0.7.0 → 0.8.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.
package/dist/index.d.ts CHANGED
@@ -44,7 +44,7 @@ export { StorefrontThemeStyle, themeToCss } from './theme';
44
44
  export type { StorefrontTheme, StorefrontThemeColors, StorefrontThemeFont, StorefrontRadius, HeaderVariant, HeroVariant, CardStyle, } from './theme';
45
45
  export type { StorefrontSection, HomeSection, HomeConfig, HeroSlide, MediaCarouselItem, NavLink, FooterConfig } from './sections';
46
46
  export { bannerPlaceholder } from './sections';
47
- export { storefrontTemplates, mareTemplate, sertaoTemplate, voltTemplate, atelierTemplate, } from './presets';
47
+ export { storefrontTemplates, mareTemplate, sertaoTemplate, voltTemplate, atelierTemplate, foodTemplate, } from './presets';
48
48
  export type { StorefrontTemplate, StorefrontTemplateId } from './presets';
49
49
  export { HomePage, StorefrontSections } from './pages/HomePage';
50
50
  export { HeroSection } from './components/sections/HeroSection';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -206,92 +206,6 @@ function matchPath(pattern, path) {
206
206
  function Link({ to, children, ...rest }) {
207
207
  return React6.createElement("a", { href: `#${to}`, ...rest }, children);
208
208
  }
209
- var RADIUS_MAP = {
210
- none: { button: "0px", card: "0px", input: "0px" },
211
- soft: { button: "6px", card: "10px", input: "6px" },
212
- round: { button: "10px", card: "16px", input: "10px" },
213
- pill: { button: "999px", card: "20px", input: "999px" }
214
- };
215
- var COLOR_VAR_MAP = {
216
- background: "--background",
217
- foreground: "--foreground",
218
- primary: "--primary",
219
- primaryForeground: "--primary-foreground",
220
- card: "--card",
221
- cardForeground: "--card-foreground",
222
- muted: "--muted",
223
- mutedForeground: "--muted-foreground",
224
- border: "--border",
225
- headerBackground: "--sf-header-bg",
226
- headerForeground: "--sf-header-fg",
227
- announcementBackground: "--sf-announcement-bg",
228
- announcementForeground: "--sf-announcement-fg"
229
- };
230
- function themeToCss(theme) {
231
- const lines = [];
232
- for (const [key, cssVar] of Object.entries(COLOR_VAR_MAP)) {
233
- const value = theme.colors?.[key];
234
- if (value) lines.push(`${cssVar}: ${value};`);
235
- }
236
- if (!theme.colors?.headerBackground && theme.colors?.background) {
237
- lines.push(`--sf-header-bg: ${theme.colors.background};`);
238
- }
239
- if (!theme.colors?.headerForeground && theme.colors?.foreground) {
240
- lines.push(`--sf-header-fg: ${theme.colors.foreground};`);
241
- }
242
- if (theme.font) {
243
- const fallback = theme.font.fallback ?? "sans-serif";
244
- lines.push(`--font-family: '${theme.font.body}', ${fallback};`);
245
- lines.push(`--sf-font-heading: '${theme.font.heading}', ${fallback};`);
246
- }
247
- const radius = RADIUS_MAP[theme.radius ?? "soft"];
248
- lines.push(`--button-radius: ${radius.button};`);
249
- lines.push(`--card-radius: ${radius.card};`);
250
- lines.push(`--input-radius: ${radius.input};`);
251
- lines.push(`--sf-radius-button: ${radius.button};`);
252
- lines.push(`--sf-radius-card: ${radius.card};`);
253
- lines.push(`--sf-radius-input: ${radius.input};`);
254
- let css = `:root {
255
- ${lines.join("\n ")}
256
- }
257
- `;
258
- css += `body { font-family: var(--font-family); }
259
- `;
260
- css += `h1, h2, h3, h4, .sf-heading { font-family: var(--sf-font-heading, var(--font-family)); }
261
- `;
262
- if (theme.uppercaseButtons) {
263
- css += `.sf-cta { text-transform: uppercase; letter-spacing: 0.08em; }
264
- `;
265
- }
266
- if (theme.header?.uppercaseNav) {
267
- css += `.sf-nav-link { text-transform: uppercase; letter-spacing: 0.06em; font-size: 0.8rem; }
268
- `;
269
- }
270
- return css;
271
- }
272
- function googleFontsHref(theme) {
273
- if (!theme.font) return null;
274
- const families = theme.font.googleFonts ?? [theme.font.heading, theme.font.body];
275
- const unique = [...new Set(families)];
276
- const params = unique.map((f) => `family=${encodeURIComponent(f).replace(/%20/g, "+")}:wght@300;400;500;600;700`).join("&");
277
- return `https://fonts.googleapis.com/css2?${params}&display=swap`;
278
- }
279
- function StorefrontThemeStyle({ theme }) {
280
- const fontsHref = googleFontsHref(theme);
281
- useEffect(() => {
282
- if (!fontsHref) return;
283
- const id = "sf-theme-fonts";
284
- let link = document.getElementById(id);
285
- if (!link) {
286
- link = document.createElement("link");
287
- link.id = id;
288
- link.rel = "stylesheet";
289
- document.head.appendChild(link);
290
- }
291
- link.href = fontsHref;
292
- }, [fontsHref]);
293
- return React6.createElement("style", { "data-sf-theme": theme.name }, themeToCss(theme));
294
- }
295
209
 
296
210
  // src/format.ts
297
211
  function formatMoney(value, currency = "BRL", locale = "pt-BR") {
@@ -344,7 +258,7 @@ function productOptionSelectionKey(selection) {
344
258
  // src/stores/cart.store.ts
345
259
  var useCartStore = create()(
346
260
  persist(
347
- (set) => ({
261
+ (set, get) => ({
348
262
  lines: [],
349
263
  discountCode: null,
350
264
  discountPercent: 0,
@@ -396,7 +310,16 @@ var useCartStore = create()(
396
310
  clearDiscount: () => set({ discountCode: null, discountPercent: 0 }),
397
311
  clear: () => set({ lines: [], discountCode: null, discountPercent: 0 }),
398
312
  openDrawer: () => set({ isOpen: true }),
399
- closeDrawer: () => set({ isOpen: false, justAddedLineId: null })
313
+ closeDrawer: () => set({ isOpen: false, justAddedLineId: null }),
314
+ reconcile: async (resolve) => {
315
+ const lines = get().lines;
316
+ if (lines.length === 0) return;
317
+ const keep = await Promise.all(
318
+ lines.map((line) => resolve(line).catch(() => true))
319
+ );
320
+ const kept = lines.filter((_, i) => keep[i]);
321
+ if (kept.length !== lines.length) set({ lines: kept });
322
+ }
400
323
  }),
401
324
  {
402
325
  name: "fayz.storefront.cart.v1",
@@ -418,6 +341,102 @@ var selectShipping = (s, cfg) => {
418
341
  return cfg.shipping.flatRate;
419
342
  };
420
343
  var selectTotal = (s, cfg) => roundCents(selectSubtotal(s) - selectDiscountTotal(s) + selectShipping(s, cfg));
344
+ var RADIUS_MAP = {
345
+ none: { button: "0px", card: "0px", input: "0px" },
346
+ soft: { button: "6px", card: "10px", input: "6px" },
347
+ round: { button: "10px", card: "16px", input: "10px" },
348
+ pill: { button: "999px", card: "20px", input: "999px" }
349
+ };
350
+ var COLOR_VAR_MAP = {
351
+ background: "--background",
352
+ foreground: "--foreground",
353
+ primary: "--primary",
354
+ primaryForeground: "--primary-foreground",
355
+ card: "--card",
356
+ cardForeground: "--card-foreground",
357
+ muted: "--muted",
358
+ mutedForeground: "--muted-foreground",
359
+ border: "--border",
360
+ headerBackground: "--sf-header-bg",
361
+ headerForeground: "--sf-header-fg",
362
+ announcementBackground: "--sf-announcement-bg",
363
+ announcementForeground: "--sf-announcement-fg",
364
+ accent: "--sf-accent",
365
+ accentForeground: "--sf-accent-foreground"
366
+ };
367
+ function themeToCss(theme) {
368
+ const lines = [];
369
+ for (const [key, cssVar] of Object.entries(COLOR_VAR_MAP)) {
370
+ const value = theme.colors?.[key];
371
+ if (value) lines.push(`${cssVar}: ${value};`);
372
+ }
373
+ if (!theme.colors?.headerBackground && theme.colors?.background) {
374
+ lines.push(`--sf-header-bg: ${theme.colors.background};`);
375
+ }
376
+ if (!theme.colors?.headerForeground && theme.colors?.foreground) {
377
+ lines.push(`--sf-header-fg: ${theme.colors.foreground};`);
378
+ }
379
+ if (theme.font) {
380
+ const fallback = theme.font.fallback ?? "sans-serif";
381
+ lines.push(`--font-family: '${theme.font.body}', ${fallback};`);
382
+ lines.push(`--sf-font-heading: '${theme.font.heading}', ${fallback};`);
383
+ if (theme.font.display) lines.push(`--sf-font-display: '${theme.font.display}', ${fallback};`);
384
+ if (theme.font.serif) lines.push(`--sf-font-serif: '${theme.font.serif}', serif;`);
385
+ }
386
+ for (const [key, value] of Object.entries(theme.tokens ?? {})) {
387
+ const name = key.startsWith("--") ? key : `--${key}`;
388
+ lines.push(`${name}: ${value};`);
389
+ }
390
+ const radius = RADIUS_MAP[theme.radius ?? "soft"];
391
+ lines.push(`--button-radius: ${radius.button};`);
392
+ lines.push(`--card-radius: ${radius.card};`);
393
+ lines.push(`--input-radius: ${radius.input};`);
394
+ lines.push(`--sf-radius-button: ${radius.button};`);
395
+ lines.push(`--sf-radius-card: ${radius.card};`);
396
+ lines.push(`--sf-radius-input: ${radius.input};`);
397
+ let css = `:root {
398
+ ${lines.join("\n ")}
399
+ }
400
+ `;
401
+ css += `body { font-family: var(--font-family); }
402
+ `;
403
+ css += `h1, h2, h3, h4, .sf-heading { font-family: var(--sf-font-heading, var(--font-family)); }
404
+ `;
405
+ if (theme.uppercaseButtons) {
406
+ css += `.sf-cta { text-transform: uppercase; letter-spacing: 0.08em; }
407
+ `;
408
+ }
409
+ if (theme.header?.uppercaseNav) {
410
+ css += `.sf-nav-link { text-transform: uppercase; letter-spacing: 0.06em; font-size: 0.8rem; }
411
+ `;
412
+ }
413
+ return css;
414
+ }
415
+ function googleFontsHref(theme) {
416
+ if (!theme.font) return null;
417
+ const families = theme.font.googleFonts ?? [theme.font.heading, theme.font.body, theme.font.display, theme.font.serif].filter(
418
+ (f) => Boolean(f)
419
+ );
420
+ const unique = [...new Set(families)];
421
+ const params = unique.map((f) => `family=${encodeURIComponent(f).replace(/%20/g, "+")}:wght@300;400;500;600;700`).join("&");
422
+ return `https://fonts.googleapis.com/css2?${params}&display=swap`;
423
+ }
424
+ function StorefrontThemeStyle({ theme }) {
425
+ const fontsHref = googleFontsHref(theme);
426
+ useEffect(() => {
427
+ if (!fontsHref) return;
428
+ const id = "sf-theme-fonts";
429
+ let link = document.getElementById(id);
430
+ if (!link) {
431
+ link = document.createElement("link");
432
+ link.id = id;
433
+ link.rel = "stylesheet";
434
+ document.head.appendChild(link);
435
+ }
436
+ link.href = fontsHref;
437
+ }, [fontsHref]);
438
+ return React6.createElement("style", { "data-sf-theme": theme.name }, themeToCss(theme));
439
+ }
421
440
  var initial = {
422
441
  search: "",
423
442
  categoryId: null,
@@ -526,6 +545,7 @@ function usePopOnChange(value) {
526
545
  var TID = {
527
546
  // header
528
547
  headerSearch: "header-search",
548
+ headerSearchToggle: "header-search-toggle",
529
549
  cartButton: "cart-button",
530
550
  cartCount: "cart-count",
531
551
  accountLink: "account-link",
@@ -714,12 +734,26 @@ function UtilityBar() {
714
734
  /* @__PURE__ */ jsx("span", { className: "ml-auto flex items-center gap-4", children: social?.map((s) => /* @__PURE__ */ jsx("a", { href: s.href, target: "_blank", rel: "noreferrer", className: "hover:underline", children: s.label }, s.href)) })
715
735
  ] }) });
716
736
  }
717
- function SearchInput({ className }) {
737
+ function SearchInput({ className, iconOnly = false }) {
718
738
  const config = useStorefrontConfig();
719
739
  const search = useCatalogStore((s) => s.search);
720
740
  const setSearch = useCatalogStore((s) => s.setSearch);
721
741
  const path = useHashPath();
722
- return /* @__PURE__ */ jsxs("div", { className: `relative ${className ?? ""}`, children: [
742
+ const [open, setOpen] = useState(false);
743
+ if (iconOnly && !open) {
744
+ return /* @__PURE__ */ jsx(
745
+ "button",
746
+ {
747
+ type: "button",
748
+ "aria-label": "Buscar produtos",
749
+ "data-testid": TID.headerSearchToggle,
750
+ onClick: () => setOpen(true),
751
+ className: "rounded-full p-2.5 transition-opacity hover:opacity-70",
752
+ children: /* @__PURE__ */ jsx(Search, { className: "h-5 w-5" })
753
+ }
754
+ );
755
+ }
756
+ return /* @__PURE__ */ jsxs("div", { className: `relative ${iconOnly ? "w-full max-w-xs" : className ?? ""}`, children: [
723
757
  /* @__PURE__ */ jsx(Search, { className: "pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 opacity-60" }),
724
758
  /* @__PURE__ */ jsx(
725
759
  "input",
@@ -728,10 +762,17 @@ function SearchInput({ className }) {
728
762
  type: "search",
729
763
  placeholder: "Buscar produtos...",
730
764
  value: search,
765
+ autoFocus: iconOnly,
731
766
  onChange: (e) => {
732
767
  setSearch(e.target.value);
733
768
  if (path !== config.catalogPath) navigateTo(config.catalogPath);
734
769
  },
770
+ onKeyDown: (e) => {
771
+ if (e.key === "Escape" && iconOnly) setOpen(false);
772
+ },
773
+ onBlur: () => {
774
+ if (iconOnly && !search) setOpen(false);
775
+ },
735
776
  className: "w-full border bg-white/10 py-2 pl-9 pr-4 text-sm outline-none transition-colors placeholder:opacity-60 focus:border-primary focus:bg-white focus:text-gray-900",
736
777
  style: {
737
778
  borderRadius: "var(--sf-radius-input)",
@@ -884,6 +925,7 @@ function StorefrontHeader() {
884
925
  const variant = config.theme?.header?.variant ?? "classic";
885
926
  const scrolled = useScrolled();
886
927
  const showSearch = config.theme?.header?.showSearch !== false;
928
+ const iconSearch = config.theme?.header?.searchStyle === "icon";
887
929
  const logo = /* @__PURE__ */ jsx(Link, { to: "/", className: "sf-heading shrink-0 text-xl font-bold tracking-tight", children: config.logo ?? config.name });
888
930
  return /* @__PURE__ */ jsxs(
889
931
  "header",
@@ -897,7 +939,7 @@ function StorefrontHeader() {
897
939
  // Rio/Flex pattern: centered logo row, nav row below
898
940
  /* @__PURE__ */ jsxs(Fragment, { children: [
899
941
  /* @__PURE__ */ jsxs("div", { className: "mx-auto grid h-16 max-w-7xl grid-cols-[1fr_auto_1fr] items-center px-4 sm:px-6", children: [
900
- showSearch ? /* @__PURE__ */ jsx(SearchInput, { className: "hidden w-full max-w-xs sm:block" }) : /* @__PURE__ */ jsx("div", {}),
942
+ showSearch ? /* @__PURE__ */ jsx(SearchInput, { iconOnly: iconSearch, className: "hidden w-full max-w-xs sm:block" }) : /* @__PURE__ */ jsx("div", {}),
901
943
  /* @__PURE__ */ jsx("div", { className: "text-center", children: logo }),
902
944
  /* @__PURE__ */ jsx("div", { className: "justify-self-end", children: /* @__PURE__ */ jsx(HeaderActions, {}) })
903
945
  ] }),
@@ -907,7 +949,7 @@ function StorefrontHeader() {
907
949
  // Brasília pattern: prominent search left, logo center, actions right; nav row below
908
950
  /* @__PURE__ */ jsxs(Fragment, { children: [
909
951
  /* @__PURE__ */ jsxs("div", { className: "mx-auto grid h-16 max-w-7xl grid-cols-[1fr_auto_1fr] items-center gap-6 px-4 sm:px-6", children: [
910
- showSearch ? /* @__PURE__ */ jsx(SearchInput, { className: "hidden w-full max-w-sm sm:block" }) : /* @__PURE__ */ jsx("div", {}),
952
+ showSearch ? /* @__PURE__ */ jsx(SearchInput, { iconOnly: iconSearch, className: "hidden w-full max-w-sm sm:block" }) : /* @__PURE__ */ jsx("div", {}),
911
953
  /* @__PURE__ */ jsx("div", { className: "text-center", children: logo }),
912
954
  /* @__PURE__ */ jsx("div", { className: "justify-self-end", children: /* @__PURE__ */ jsx(HeaderActions, {}) })
913
955
  ] }),
@@ -919,17 +961,19 @@ function StorefrontHeader() {
919
961
  /* @__PURE__ */ jsx("div", { className: "flex items-center gap-5", children: /* @__PURE__ */ jsx(NavLinks, { className: "hidden sm:flex" }) }),
920
962
  /* @__PURE__ */ jsx("div", { className: "text-center", children: logo }),
921
963
  /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-end gap-3", children: [
922
- showSearch && /* @__PURE__ */ jsx(SearchInput, { className: "hidden w-44 lg:block" }),
964
+ showSearch && /* @__PURE__ */ jsx(SearchInput, { iconOnly: iconSearch, className: "hidden w-44 lg:block" }),
923
965
  /* @__PURE__ */ jsx(HeaderActions, {})
924
966
  ] })
925
967
  ] })
926
968
  ) : (
927
- // classic: logo left, search center-right, actions right (original layout)
969
+ // classic: logo left, nav, then a right-aligned search + actions cluster
928
970
  /* @__PURE__ */ jsxs("div", { className: "mx-auto flex h-16 max-w-7xl items-center gap-6 px-4 sm:px-6", children: [
929
971
  logo,
930
972
  /* @__PURE__ */ jsx(NavLinks, { className: "hidden md:flex" }),
931
- showSearch && /* @__PURE__ */ jsx(SearchInput, { className: "ml-auto hidden w-full max-w-sm sm:block" }),
932
- /* @__PURE__ */ jsx(HeaderActions, {})
973
+ /* @__PURE__ */ jsxs("div", { className: "ml-auto flex items-center gap-2 sm:gap-3", children: [
974
+ showSearch && /* @__PURE__ */ jsx(SearchInput, { iconOnly: iconSearch, className: iconSearch ? "" : "hidden w-full max-w-sm sm:block" }),
975
+ /* @__PURE__ */ jsx(HeaderActions, {})
976
+ ] })
933
977
  ] })
934
978
  )
935
979
  ]
@@ -2937,7 +2981,8 @@ async function placeStorefrontOrder({
2937
2981
  }))
2938
2982
  });
2939
2983
  if (markPaid) {
2940
- await provider.updateOrder(order.id, { financialStatus: "paid" });
2984
+ if (provider.confirmPayment) await provider.confirmPayment(order.id);
2985
+ else await provider.updateOrder(order.id, { financialStatus: "paid" });
2941
2986
  }
2942
2987
  return { order, customerId: customerId ?? order.customerId ?? "" };
2943
2988
  }
@@ -4417,6 +4462,15 @@ function initStorefrontRuntime(config) {
4417
4462
  } else {
4418
4463
  setShopProvider(createMockShopProvider(buildMockSeed(config)));
4419
4464
  }
4465
+ const reconcileCart = () => {
4466
+ const provider = getShopProvider();
4467
+ void useCartStore.getState().reconcile(async (line) => {
4468
+ const product = await provider.getProduct(line.productId);
4469
+ return product != null;
4470
+ });
4471
+ };
4472
+ if (useCartStore.persist.hasHydrated()) reconcileCart();
4473
+ else useCartStore.persist.onFinishHydration(reconcileCart);
4420
4474
  if (config.supabaseUrl || config.supabaseAnonKey) {
4421
4475
  console.warn(
4422
4476
  "@fayz-ai/shop: supabaseUrl/supabaseAnonKey are legacy fields. Pass an explicit provider/adapter or use the Fayz SDK broker path."
@@ -4776,13 +4830,75 @@ var atelierTemplate = {
4776
4830
  ]
4777
4831
  })
4778
4832
  };
4833
+ var foodTemplate = {
4834
+ id: "food",
4835
+ inspiration: "Delivery / restaurant storefront",
4836
+ announcement: "ENTREGA GR\xC1TIS ACIMA DE R$ 150 \xB7 PE\xC7A J\xC1",
4837
+ theme: {
4838
+ name: "food",
4839
+ colors: {
4840
+ background: "30 33% 97%",
4841
+ foreground: "20 14% 15%",
4842
+ primary: "14 84% 50%",
4843
+ primaryForeground: "0 0% 100%",
4844
+ card: "30 33% 99%",
4845
+ cardForeground: "20 14% 15%",
4846
+ muted: "28 20% 92%",
4847
+ mutedForeground: "22 10% 42%",
4848
+ border: "28 18% 85%",
4849
+ headerBackground: "20 14% 11%",
4850
+ headerForeground: "30 24% 96%",
4851
+ announcementBackground: "14 84% 50%",
4852
+ announcementForeground: "0 0% 100%"
4853
+ },
4854
+ font: { heading: "Poppins", body: "Inter" },
4855
+ radius: "round",
4856
+ header: { variant: "classic" },
4857
+ productCard: { style: "card", imageAspect: "square" }
4858
+ },
4859
+ home: (storeName, images) => ({
4860
+ sections: [
4861
+ {
4862
+ type: "hero",
4863
+ variant: "banner",
4864
+ height: "tall",
4865
+ slides: [
4866
+ { title: "Sabor de verdade, na sua porta", subtitle: `${storeName} \u2014 feito na hora, do jeito que voc\xEA ama.`, cta: "Ver card\xE1pio", href: "/catalog", hue: 20, image: images?.hero?.[0] }
4867
+ ]
4868
+ },
4869
+ {
4870
+ type: "benefits",
4871
+ items: [
4872
+ { icon: "Flame", title: "Feito na hora", text: "Preparado com capricho" },
4873
+ { icon: "Truck", title: "Entrega r\xE1pida", text: "Frete gr\xE1tis acima de R$ 150" },
4874
+ { icon: "CreditCard", title: "Pagamento f\xE1cil", text: "Pix, cart\xE3o e mais" }
4875
+ ]
4876
+ },
4877
+ { type: "categories", style: "tiles", title: "Nosso card\xE1pio" },
4878
+ { type: "products", title: "Mais pedidos", eyebrow: "favoritos da casa", filter: "all", limit: 8 },
4879
+ { type: "banner", title: "Combo do dia", eyebrow: "oferta", subtitle: "Sele\xE7\xE3o especial com desconto", cta: "Aproveitar", hue: 14, image: images?.banners?.[0] },
4880
+ { type: "products", title: "Novidades no card\xE1pio", filter: "new", limit: 4 },
4881
+ {
4882
+ type: "testimonials",
4883
+ title: "O que dizem por a\xED",
4884
+ items: [
4885
+ { quote: "Chegou quentinho e absurdo de bom. Virei cliente!", author: "Rafael M." },
4886
+ { quote: "Sabor de restaurante em casa, sem complica\xE7\xE3o.", author: "Beatriz L." },
4887
+ { quote: "Entrega r\xE1pida e por\xE7\xE3o generosa. Recomendo demais.", author: "Diego S." }
4888
+ ]
4889
+ },
4890
+ { type: "newsletter", title: "Receba nossas ofertas", subtitle: "Promo\xE7\xF5es e novidades do card\xE1pio, direto no seu e-mail." }
4891
+ ]
4892
+ })
4893
+ };
4779
4894
  var storefrontTemplates = {
4780
4895
  mare: mareTemplate,
4781
4896
  sertao: sertaoTemplate,
4782
4897
  volt: voltTemplate,
4783
- atelier: atelierTemplate
4898
+ atelier: atelierTemplate,
4899
+ food: foodTemplate
4784
4900
  };
4785
4901
 
4786
- export { BenefitsRow, CartDrawer, CatalogPage, CategoryShowcase, CheckoutPage, FiltersPanel, HeroSection, HomePage, Link, ManifestoBlock, MediaCarousel, MyPurchasesPage, NewsletterBand, OrderConfirmationPage, OrderTrackingTimeline, Price, ProductCard, ProductDetailPage, ProductEnquiryForm, ProductGrid, ProductOptionSelector, ProductRail, ProductSlider, PromoBanner, QuantityInput, Reveal, SmoothImage, StorefrontFooter, StorefrontHeader, StorefrontScaffold, StorefrontSections, StorefrontShell, StorefrontThemeStyle, TID, Testimonials, atelierTemplate, bannerPlaceholder, createStorefront, createStorefrontApp, defineStorefront, defineStorefrontApp, defineStorefrontComponents, defineStorefrontConfig, defineStorefrontRoutes, defineStorefrontSections, establishCustomerSession, formatMoney, formatProductOptionSelection, getCustomerAuthAdapter, getProductOptionGroups, initStorefrontRuntime, mareTemplate, matchPath, navigateTo, normalizeProductOptionSelection, placeStorefrontOrder, prefersReducedMotion, productCardComponentContract, productOptionSelectionKey, registerStorefrontBlocks, resolveAuthAdapter, roundCents, sectionsToBlocks, selectCount, selectDiscountTotal, selectShipping, selectSubtotal, selectTotal, sertaoTemplate, signInByEmail, signOutCustomer, signUpCustomer, storefrontComponentContracts, storefrontTemplates, themeToCss, useCart, useCartStore, useCatalog, useCatalogStore, useCategories, useDiscountValidator, useEnquiry, useHashPath, useInView, useMyOrders, usePopOnChange, useProduct, useProducts, useScrolled, useSessionStore, useStorefront, useStorefrontActions, useStorefrontConfig, useStorefrontConfigOptional, voltTemplate };
4902
+ export { BenefitsRow, CartDrawer, CatalogPage, CategoryShowcase, CheckoutPage, FiltersPanel, HeroSection, HomePage, Link, ManifestoBlock, MediaCarousel, MyPurchasesPage, NewsletterBand, OrderConfirmationPage, OrderTrackingTimeline, Price, ProductCard, ProductDetailPage, ProductEnquiryForm, ProductGrid, ProductOptionSelector, ProductRail, ProductSlider, PromoBanner, QuantityInput, Reveal, SmoothImage, StorefrontFooter, StorefrontHeader, StorefrontScaffold, StorefrontSections, StorefrontShell, StorefrontThemeStyle, TID, Testimonials, atelierTemplate, bannerPlaceholder, createStorefront, createStorefrontApp, defineStorefront, defineStorefrontApp, defineStorefrontComponents, defineStorefrontConfig, defineStorefrontRoutes, defineStorefrontSections, establishCustomerSession, foodTemplate, formatMoney, formatProductOptionSelection, getCustomerAuthAdapter, getProductOptionGroups, initStorefrontRuntime, mareTemplate, matchPath, navigateTo, normalizeProductOptionSelection, placeStorefrontOrder, prefersReducedMotion, productCardComponentContract, productOptionSelectionKey, registerStorefrontBlocks, resolveAuthAdapter, roundCents, sectionsToBlocks, selectCount, selectDiscountTotal, selectShipping, selectSubtotal, selectTotal, sertaoTemplate, signInByEmail, signOutCustomer, signUpCustomer, storefrontComponentContracts, storefrontTemplates, themeToCss, useCart, useCartStore, useCatalog, useCatalogStore, useCategories, useDiscountValidator, useEnquiry, useHashPath, useInView, useMyOrders, usePopOnChange, useProduct, useProducts, useScrolled, useSessionStore, useStorefront, useStorefrontActions, useStorefrontConfig, useStorefrontConfigOptional, voltTemplate };
4787
4903
  //# sourceMappingURL=index.js.map
4788
4904
  //# sourceMappingURL=index.js.map