@nuvler/theme-default 1.0.2

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 (55) hide show
  1. package/README.md +94 -0
  2. package/dist/nuvler.theme.json +23 -0
  3. package/dist/src/banner-carousel.d.ts +17 -0
  4. package/dist/src/banner-carousel.js +14 -0
  5. package/dist/src/banner-carousel.js.map +1 -0
  6. package/dist/src/carousel-frame.d.ts +9 -0
  7. package/dist/src/carousel-frame.js +27 -0
  8. package/dist/src/carousel-frame.js.map +1 -0
  9. package/dist/src/definition.d.ts +55 -0
  10. package/dist/src/definition.js +15 -0
  11. package/dist/src/definition.js.map +1 -0
  12. package/dist/src/footer.d.ts +6 -0
  13. package/dist/src/footer.js +7 -0
  14. package/dist/src/footer.js.map +1 -0
  15. package/dist/src/header-interactions.d.ts +14 -0
  16. package/dist/src/header-interactions.js +145 -0
  17. package/dist/src/header-interactions.js.map +1 -0
  18. package/dist/src/header.d.ts +5 -0
  19. package/dist/src/header.js +13 -0
  20. package/dist/src/header.js.map +1 -0
  21. package/dist/src/home.d.ts +5 -0
  22. package/dist/src/home.js +96 -0
  23. package/dist/src/home.js.map +1 -0
  24. package/dist/src/index.d.ts +10 -0
  25. package/dist/src/index.js +8 -0
  26. package/dist/src/index.js.map +1 -0
  27. package/dist/src/product-carousel.d.ts +8 -0
  28. package/dist/src/product-carousel.js +9 -0
  29. package/dist/src/product-carousel.js.map +1 -0
  30. package/dist/src/product-detail-interactive.d.ts +15 -0
  31. package/dist/src/product-detail-interactive.js +126 -0
  32. package/dist/src/product-detail-interactive.js.map +1 -0
  33. package/dist/src/product-detail.d.ts +5 -0
  34. package/dist/src/product-detail.js +27 -0
  35. package/dist/src/product-detail.js.map +1 -0
  36. package/dist/src/products.d.ts +11 -0
  37. package/dist/src/products.js +11 -0
  38. package/dist/src/products.js.map +1 -0
  39. package/dist/src/server-shell.d.ts +15 -0
  40. package/dist/src/server-shell.js +32 -0
  41. package/dist/src/server-shell.js.map +1 -0
  42. package/dist/src/shared.d.ts +17 -0
  43. package/dist/src/shared.js +24 -0
  44. package/dist/src/shared.js.map +1 -0
  45. package/dist/src/theme-component.d.ts +79 -0
  46. package/dist/src/theme-component.js +85 -0
  47. package/dist/src/theme-component.js.map +1 -0
  48. package/dist/src/theme-config.d.ts +41 -0
  49. package/dist/src/theme-config.js +62 -0
  50. package/dist/src/theme-config.js.map +1 -0
  51. package/dist/src/theme.d.ts +2 -0
  52. package/dist/src/theme.js +3 -0
  53. package/dist/src/theme.js.map +1 -0
  54. package/dist/theme.css +2965 -0
  55. package/package.json +74 -0
package/README.md ADDED
@@ -0,0 +1,94 @@
1
+ # Nuvler Default
2
+
3
+ Fonte oficial do tema padrão. O mesmo código possui duas distribuições:
4
+
5
+ - `@nuvler/theme-default`, instalado no build do Store para renderização SSR;
6
+ - artefato imutável do Theme Registry, usado pelo preview e pela transição de
7
+ temas que ainda dependem do runtime remoto.
8
+
9
+ Ele é a referência de compatibilidade entre o Store e temas externos:
10
+
11
+ - `nuvler.theme.json` declara identidade, versão, entrada e estilos;
12
+ - `runtimeVersion` e `sdkVersion` declaram a compatibilidade pública do tema;
13
+ - `src/theme.tsx` é a entrada do preview Vite;
14
+ - `@nuvler/theme-default/server` expõe `NuvlerDefaultShell` para Server
15
+ Components;
16
+ - `@nuvler/theme-default/config`, `/home`, `/products` e `/product-detail`
17
+ permitem que o Store importe apenas o renderer necessário para cada rota;
18
+ - `@nuvler/theme-default/client` expõe a ponte do carrinho para a ilha
19
+ interativa da página de produto;
20
+ - `src/index.ts` expõe `nuvlerDefaultTheme`, `manifest`, `Theme`, `Header`,
21
+ `Footer`, `Home`, `ProductGrid` e `ProductDetail`;
22
+ - `src/theme.css` contém o visual completo do Store, incluindo Home, catálogo,
23
+ PDP, editoriais, carrinho e responsividade.
24
+
25
+ React é `peerDependency`: o tema reutiliza a cópia fornecida pelo
26
+ Store/preview host. Seus contratos vêm de `@nuvler/theme-sdk`.
27
+
28
+ O shell, o conteúdo dos banners, cards, listagens e textos de produto são
29
+ renderizados no servidor. Header, controles de carrossel, galeria, variantes e
30
+ carrinho são ilhas client isoladas; passar Server Components pelo `children`
31
+ dessas ilhas não transforma o restante da página em Client Component.
32
+
33
+ O Store pode injetar seu componente de imagem nos renderizadores locais. Home,
34
+ cards, logo e galeria usam dimensões intrínsecas, `sizes` responsivo e lazy
35
+ loading; somente a imagem principal da primeira seção visual ou da página de
36
+ produto recebe prioridade de LCP. O bundle remoto mantém o `<img>` nativo com
37
+ os mesmos atributos como fallback portátil.
38
+
39
+ A tipografia padrão usa a pilha local `--nuvler-font-sans`, sem requisição de
40
+ fonte e sem bloquear a primeira renderização. O Store define esse token no
41
+ layout global; outros hosts podem sobrescrevê-lo. Quando o token não existir, o
42
+ tema recorre à mesma pilha de fontes de sistema.
43
+
44
+ O tema também serve como referência do performance budget inicial do CLI. Rode
45
+ o build do artefato antes de `theme validate` para incluir o JavaScript
46
+ entregue na medição; os avisos de budget são informativos nesta versão.
47
+
48
+ Para executar:
49
+
50
+ ```bash
51
+ node packages/cli/dist/nuvler.js theme configure \
52
+ --theme themes/nuvler-default \
53
+ --key CHAVE_COPIADA_DO_PAINEL
54
+
55
+ node packages/cli/dist/nuvler.js theme validate \
56
+ --theme themes/nuvler-default
57
+
58
+ npm run typecheck -w @nuvler/theme-default
59
+
60
+ node packages/cli/dist/nuvler.js theme dev \
61
+ --theme themes/nuvler-default
62
+ ```
63
+
64
+ Para compilar, gerar o artefato ou publicar, execute na raiz do tooling:
65
+
66
+ ```bash
67
+ npm run pack:store
68
+ npm publish ./artifacts/nuvler-theme-default-1.0.2.tgz --access public
69
+
70
+ node packages/cli/dist/nuvler.js theme build --theme themes/nuvler-default
71
+ npm run pack:theme -- nuvler-default
72
+ node packages/cli/dist/nuvler.js theme publish --theme themes/nuvler-default --official
73
+ ```
74
+
75
+ O pacote npm contém o renderer local e o CSS. O artefato do Theme Registry é
76
+ gerado separadamente como `artifacts/nuvler-default-1.0.2.nuvler-theme.tgz`.
77
+
78
+ Exemplo no App Router:
79
+
80
+ ```tsx
81
+ import { NuvlerDefaultShell } from "@nuvler/theme-default/server";
82
+ import "@nuvler/theme-default/styles.css";
83
+
84
+ export default function StoreLayout({ children }) {
85
+ return <NuvlerDefaultShell site={site} categories={categories} pages={pages}>
86
+ {children}
87
+ </NuvlerDefaultShell>;
88
+ }
89
+ ```
90
+
91
+ `--official` exige uma sessão `PLATFORM_ADMIN` e publica o tema como
92
+ `PLATFORM/PUBLIC`. Para testar temporariamente outra loja autorizada, use
93
+ `theme dev --store <slug>`; para ver todas as opções, acrescente `--help` ao
94
+ comando.
@@ -0,0 +1,23 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "id": "nuvler-default",
4
+ "name": "Nuvler Default",
5
+ "version": "1.0.2",
6
+ "runtimeVersion": "1",
7
+ "sdkVersion": "^1.2.0",
8
+ "entry": "src/theme.tsx",
9
+ "styles": ["src/theme.css"],
10
+ "presentation": {
11
+ "description": "Tema oficial completo, indicado para produção e usado como base confiável.",
12
+ "templateId": "nuvler-default",
13
+ "colors": {
14
+ "primary": "#176b3a", "primaryText": "#ffffff",
15
+ "secondary": "#d99b31", "secondaryText": "#18221b", "accent": "#b45309",
16
+ "background": "#f7f7f2", "surface": "#ffffff", "surfaceAlt": "#eef2e9",
17
+ "text": "#18221b", "textMuted": "#657068", "border": "#dfe4dd",
18
+ "headerBackground": "#ffffff", "headerText": "#18221b",
19
+ "footerBackground": "#14251a", "footerText": "#f7f7f2"
20
+ },
21
+ "layout": { "containerWidth": 1280, "borderRadius": 18 }
22
+ }
23
+ }
@@ -0,0 +1,17 @@
1
+ import type { ThemeImage } from "@nuvler/theme-sdk";
2
+ import { type ThemeImageComponent } from "./shared.js";
3
+ export interface ThemeBanner {
4
+ imageUrl: string;
5
+ image?: ThemeImage | null;
6
+ imageAlt?: string;
7
+ title?: string;
8
+ description?: string;
9
+ buttonLabel?: string;
10
+ buttonUrl?: string;
11
+ }
12
+ export declare function BannerCarousel({ banners, autoplay, priority, ImageComponent }: {
13
+ banners: ThemeBanner[];
14
+ autoplay: boolean;
15
+ priority?: boolean;
16
+ ImageComponent?: ThemeImageComponent;
17
+ }): import("react").JSX.Element | null;
@@ -0,0 +1,14 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { BannerCarouselFrame } from "./carousel-frame.js";
3
+ import { ThemeImageView } from "./shared.js";
4
+ export function BannerCarousel({ banners, autoplay, priority = false, ImageComponent = ThemeImageView }) {
5
+ if (!banners.length)
6
+ return null;
7
+ return (_jsx(BannerCarouselFrame, { count: banners.length, autoplay: autoplay, children: banners.map((banner, index) => (_jsxs("article", { className: "banner-slide", "data-banner-slide": true, "aria-hidden": index !== 0, children: [_jsx(ImageComponent, { image: banner.image ?? {
8
+ url: banner.imageUrl,
9
+ alt: banner.imageAlt || banner.title || "Banner",
10
+ width: null,
11
+ height: null,
12
+ }, fallbackAlt: banner.title || "Banner", priority: priority && index === 0, sizes: "100vw", fallbackWidth: 1600, fallbackHeight: 640 }), (banner.title || banner.description || (banner.buttonLabel && banner.buttonUrl)) && (_jsx("div", { className: "banner-overlay", children: _jsx("div", { className: "store-container", children: _jsxs("div", { className: "banner-copy", children: [banner.title && _jsx("h2", { children: banner.title }), banner.description && _jsx("p", { children: banner.description }), banner.buttonLabel && banner.buttonUrl && _jsx("a", { className: "button button-primary", href: banner.buttonUrl, children: banner.buttonLabel })] }) }) }))] }, `${banner.imageUrl}-${index}`))) }));
13
+ }
14
+ //# sourceMappingURL=banner-carousel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"banner-carousel.js","sourceRoot":"","sources":["../../src/banner-carousel.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,EAAE,cAAc,EAA4B,MAAM,aAAa,CAAC;AAYvE,MAAM,UAAU,cAAc,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,GAAG,KAAK,EAAE,cAAc,GAAG,cAAc,EAKpG;IACC,IAAI,CAAC,OAAO,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACjC,OAAO,CACL,KAAC,mBAAmB,IAAC,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,YAC3D,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAC9B,mBAAS,SAAS,EAAC,cAAc,4CAAoE,KAAK,KAAK,CAAC,aAC9G,KAAC,cAAc,IACb,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI;wBACrB,GAAG,EAAE,MAAM,CAAC,QAAQ;wBACpB,GAAG,EAAE,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,KAAK,IAAI,QAAQ;wBAChD,KAAK,EAAE,IAAI;wBACX,MAAM,EAAE,IAAI;qBACb,EACD,WAAW,EAAE,MAAM,CAAC,KAAK,IAAI,QAAQ,EACrC,QAAQ,EAAE,QAAQ,IAAI,KAAK,KAAK,CAAC,EACjC,KAAK,EAAC,OAAO,EACb,aAAa,EAAE,IAAI,EACnB,cAAc,EAAE,GAAG,GACnB,EACD,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,WAAW,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CACnF,cAAK,SAAS,EAAC,gBAAgB,YAC7B,cAAK,SAAS,EAAC,iBAAiB,YAC9B,eAAK,SAAS,EAAC,aAAa,aACzB,MAAM,CAAC,KAAK,IAAI,uBAAK,MAAM,CAAC,KAAK,GAAM,EACvC,MAAM,CAAC,WAAW,IAAI,sBAAI,MAAM,CAAC,WAAW,GAAK,EACjD,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,SAAS,IAAI,YAAG,SAAS,EAAC,uBAAuB,EAAC,IAAI,EAAE,MAAM,CAAC,SAAS,YAAG,MAAM,CAAC,WAAW,GAAK,IAC5H,GACF,GACF,CACP,KAxBsD,GAAG,MAAM,CAAC,QAAQ,IAAI,KAAK,EAAE,CAyB5E,CACX,CAAC,GACkB,CACvB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { type ReactNode } from "react";
2
+ export declare function BannerCarouselFrame({ children, count, autoplay, }: {
3
+ children: ReactNode;
4
+ count: number;
5
+ autoplay: boolean;
6
+ }): import("react").JSX.Element;
7
+ export declare function ProductCarouselFrame({ children }: {
8
+ children: ReactNode;
9
+ }): import("react").JSX.Element;
@@ -0,0 +1,27 @@
1
+ "use client";
2
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useEffect, useRef, useState } from "react";
4
+ export function BannerCarouselFrame({ children, count, autoplay, }) {
5
+ const [active, setActive] = useState(0);
6
+ const track = useRef(null);
7
+ useEffect(() => {
8
+ const slides = track.current?.querySelectorAll("[data-banner-slide]");
9
+ slides?.forEach((slide, index) => slide.setAttribute("aria-hidden", String(active !== index)));
10
+ }, [active]);
11
+ useEffect(() => {
12
+ if (!autoplay || count < 2)
13
+ return;
14
+ const timer = window.setInterval(() => setActive((current) => (current + 1) % count), 6000);
15
+ return () => window.clearInterval(timer);
16
+ }, [autoplay, count]);
17
+ return (_jsxs("section", { className: "banner-carousel", "aria-roledescription": "carrossel", "aria-label": "Banners da loja", children: [_jsx("div", { className: "banner-track", ref: track, style: { transform: `translateX(-${active * 100}%)` }, children: children }), count > 1 && _jsxs(_Fragment, { children: [_jsx("button", { className: "carousel-arrow carousel-arrow-prev", type: "button", "aria-label": "Banner anterior", onClick: () => setActive((active - 1 + count) % count), children: "\u2039" }), _jsx("button", { className: "carousel-arrow carousel-arrow-next", type: "button", "aria-label": "Pr\u00F3ximo banner", onClick: () => setActive((active + 1) % count), children: "\u203A" }), _jsx("div", { className: "carousel-dots", children: Array.from({ length: count }, (_, index) => _jsx("button", { type: "button", className: index === active ? "active" : "", "aria-label": `Ir para banner ${index + 1}`, onClick: () => setActive(index) }, index)) })] })] }));
18
+ }
19
+ export function ProductCarouselFrame({ children }) {
20
+ const track = useRef(null);
21
+ const move = (direction) => track.current?.scrollBy({
22
+ left: direction * Math.min(track.current.clientWidth, 900),
23
+ behavior: "smooth",
24
+ });
25
+ return (_jsxs("div", { className: "product-carousel", children: [_jsx("div", { className: "product-carousel-track", ref: track, children: children }), _jsx("button", { type: "button", className: "carousel-arrow carousel-arrow-prev", onClick: () => move(-1), "aria-label": "Produtos anteriores", children: "\u2039" }), _jsx("button", { type: "button", className: "carousel-arrow carousel-arrow-next", onClick: () => move(1), "aria-label": "Pr\u00F3ximos produtos", children: "\u203A" })] }));
26
+ }
27
+ //# sourceMappingURL=carousel-frame.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"carousel-frame.js","sourceRoot":"","sources":["../../src/carousel-frame.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import { Footer } from "./footer.js";
2
+ import { Header } from "./header.js";
3
+ import { Home } from "./home.js";
4
+ import { ProductDetail } from "./product-detail.js";
5
+ import { ProductGrid } from "./products.js";
6
+ export { manifest } from "./theme-config.js";
7
+ export declare const nuvlerDefaultTheme: {
8
+ readonly manifest: import("@nuvler/theme-sdk").ThemeManifest;
9
+ readonly tokens: {
10
+ colors: {
11
+ primary: string;
12
+ primaryText: string;
13
+ secondary: string;
14
+ secondaryText: string;
15
+ accent: string;
16
+ background: string;
17
+ surface: string;
18
+ surfaceAlt: string;
19
+ text: string;
20
+ textMuted: string;
21
+ border: string;
22
+ headerBackground: string;
23
+ headerText: string;
24
+ footerBackground: string;
25
+ footerText: string;
26
+ };
27
+ layout: {
28
+ containerWidth: number;
29
+ borderRadius: number;
30
+ };
31
+ };
32
+ readonly template: {
33
+ announcement: string;
34
+ footerTagline: string;
35
+ footerNavigationLabel: string;
36
+ footerNote: string;
37
+ socialLabel: string;
38
+ benefits: {
39
+ title: string;
40
+ description: string;
41
+ }[];
42
+ fallbackSections(modules: readonly string[]): import("@nuvler/theme-sdk").ThemeHomeSection[];
43
+ primaryAction(modules: readonly string[]): {
44
+ label: string;
45
+ href: string;
46
+ };
47
+ };
48
+ readonly components: {
49
+ readonly Header: typeof Header;
50
+ readonly Footer: typeof Footer;
51
+ readonly Home: typeof Home;
52
+ readonly ProductGrid: typeof ProductGrid;
53
+ readonly ProductDetail: typeof ProductDetail;
54
+ };
55
+ };
@@ -0,0 +1,15 @@
1
+ import { defineTheme } from "@nuvler/theme-sdk";
2
+ import { Footer } from "./footer.js";
3
+ import { Header } from "./header.js";
4
+ import { Home } from "./home.js";
5
+ import { ProductDetail } from "./product-detail.js";
6
+ import { ProductGrid } from "./products.js";
7
+ import { manifest, nuvlerDefaultTemplate, nuvlerDefaultTokens, } from "./theme-config.js";
8
+ export { manifest } from "./theme-config.js";
9
+ export const nuvlerDefaultTheme = defineTheme({
10
+ manifest,
11
+ tokens: nuvlerDefaultTokens,
12
+ template: nuvlerDefaultTemplate,
13
+ components: { Header, Footer, Home, ProductGrid, ProductDetail },
14
+ });
15
+ //# sourceMappingURL=definition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definition.js","sourceRoot":"","sources":["../../src/definition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EACL,QAAQ,EACR,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C,MAAM,CAAC,MAAM,kBAAkB,GAAG,WAAW,CAAC;IAC5C,QAAQ;IACR,MAAM,EAAE,mBAAmB;IAC3B,QAAQ,EAAE,qBAAqB;IAC/B,UAAU,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,aAAa,EAAE;CACjE,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { FooterProps } from "@nuvler/theme-sdk";
2
+ import type { ReactNode } from "react";
3
+ export interface NuvlerDefaultFooterProps extends FooterProps {
4
+ platformBrand?: ReactNode;
5
+ }
6
+ export declare function Footer({ site, pages, template, platformBrand }: NuvlerDefaultFooterProps): import("react").JSX.Element;
@@ -0,0 +1,7 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ export function Footer({ site, pages, template, platformBrand }) {
3
+ const settings = site.settings;
4
+ const name = settings?.siteName || site.tenant.name;
5
+ return _jsxs("footer", { className: "store-footer", children: [_jsxs("div", { className: "store-container footer-grid", children: [_jsxs("div", { children: [_jsx("strong", { className: "footer-brand", children: name }), _jsx("p", { children: settings?.description || template.footerTagline })] }), _jsxs("div", { children: [_jsx("strong", { children: template.footerNavigationLabel }), site.modules.includes("PRODUCTS") && _jsx("a", { href: "/produtos", children: "Todos os produtos" }), site.modules.includes("BLOG") && _jsx("a", { href: "/blog", children: "Blog" }), site.modules.includes("SERVICES") && _jsx("a", { href: "/servicos", children: "Servi\u00E7os" }), site.modules.includes("CASES") && _jsx("a", { href: "/cases", children: "Cases" }), _jsx("a", { href: "/", children: "In\u00EDcio" })] }), pages.length > 0 && _jsxs("div", { children: [_jsx("strong", { children: "Institucional" }), pages.slice(0, 6).map((page) => _jsx("a", { href: `/${page.slug}`, children: page.title }, page.slug))] }), _jsxs("div", { children: [_jsx("strong", { children: "Atendimento" }), settings?.contact.email && _jsx("a", { href: `mailto:${settings.contact.email}`, children: settings.contact.email }), settings?.contact.phone && _jsx("a", { href: `tel:${settings.contact.phone}`, children: settings.contact.phone }), settings?.contact.address && _jsx("span", { children: settings.contact.address })] }), settings?.social && Object.values(settings.social).some(Boolean) && _jsxs("div", { className: "footer-social", children: [_jsx("strong", { children: template.socialLabel }), settings.social.instagram && _jsx("a", { href: settings.social.instagram, target: "_blank", rel: "noreferrer", children: "Instagram" }), settings.social.facebook && _jsx("a", { href: settings.social.facebook, target: "_blank", rel: "noreferrer", children: "Facebook" }), settings.social.youtube && _jsx("a", { href: settings.social.youtube, target: "_blank", rel: "noreferrer", children: "YouTube" }), settings.social.tiktok && _jsx("a", { href: settings.social.tiktok, target: "_blank", rel: "noreferrer", children: "TikTok" })] })] }), _jsxs("div", { className: "store-container footer-bottom", children: [_jsxs("span", { children: ["\u00A9 ", new Date().getFullYear(), " ", name] }), _jsx("span", { children: template.footerNote }), platformBrand && _jsx("span", { "data-nuvler-platform-brand-slot": true, children: platformBrand })] })] });
6
+ }
7
+ //# sourceMappingURL=footer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"footer.js","sourceRoot":"","sources":["../../src/footer.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { ThemeCategory, ThemePageSummary, ThemeProduct, ThemeSite } from "@nuvler/theme-sdk";
2
+ export declare function CategoryNavigation({ categories }: {
3
+ categories: ThemeCategory[];
4
+ }): import("react").JSX.Element;
5
+ export declare function SmartProductSearch({ endpoint, queryParam, searchProducts }: {
6
+ endpoint?: string;
7
+ queryParam?: string;
8
+ searchProducts?: (query: string) => Promise<ThemeProduct[]>;
9
+ }): import("react").JSX.Element;
10
+ export declare function MobileStoreMenu({ site, categories, pages }: {
11
+ site: ThemeSite;
12
+ categories: ThemeCategory[];
13
+ pages: ThemePageSummary[];
14
+ }): import("react").JSX.Element;
@@ -0,0 +1,145 @@
1
+ "use client";
2
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useEffect, useLayoutEffect, useRef, useState } from "react";
4
+ import { categoryUrl, displayPrice, ThemeImageView } from "./shared.js";
5
+ function CategoryTree({ categories, path = [], depth = 0 }) {
6
+ return categories.map((category) => {
7
+ const currentPath = [...path, category.slug];
8
+ return _jsxs("div", { className: "category-nav-tree-node", "data-depth": depth, children: [_jsxs("a", { href: categoryUrl(currentPath), style: { paddingLeft: `${14 + depth * 16}px` }, children: [depth > 0 && _jsx("span", { className: "category-tree-branch", "aria-hidden": "true" }), _jsx("span", { children: category.name })] }), category.children?.length > 0 && _jsx(CategoryTree, { categories: category.children, path: currentPath, depth: depth + 1 })] }, currentPath.join("/"));
9
+ });
10
+ }
11
+ export function CategoryNavigation({ categories }) {
12
+ const innerRef = useRef(null);
13
+ const allRef = useRef(null);
14
+ const itemRefs = useRef([]);
15
+ const [visibleCount, setVisibleCount] = useState(0);
16
+ useLayoutEffect(() => {
17
+ const inner = innerRef.current;
18
+ const all = allRef.current;
19
+ if (!inner || !all)
20
+ return;
21
+ const calculate = () => {
22
+ const styles = window.getComputedStyle(inner);
23
+ const gap = Number.parseFloat(styles.columnGap || styles.gap) || 0;
24
+ let width = all.offsetWidth;
25
+ let count = 0;
26
+ for (const item of itemRefs.current) {
27
+ if (!item || width + gap + item.offsetWidth > inner.clientWidth)
28
+ break;
29
+ width += gap + item.offsetWidth;
30
+ count += 1;
31
+ }
32
+ setVisibleCount(count);
33
+ };
34
+ const frame = window.requestAnimationFrame(calculate);
35
+ const observer = new ResizeObserver(calculate);
36
+ observer.observe(inner);
37
+ return () => { window.cancelAnimationFrame(frame); observer.disconnect(); };
38
+ }, [categories]);
39
+ useEffect(() => {
40
+ const outside = (event) => {
41
+ if (allRef.current?.open && !allRef.current.contains(event.target))
42
+ allRef.current.open = false;
43
+ };
44
+ document.addEventListener("pointerdown", outside);
45
+ return () => document.removeEventListener("pointerdown", outside);
46
+ }, []);
47
+ return _jsx("nav", { className: "category-nav", "aria-label": "Categorias de produtos", children: _jsxs("div", { className: "store-container category-nav-inner", ref: innerRef, children: [_jsxs("details", { className: "category-nav-all", ref: allRef, children: [_jsxs("summary", { className: "all-categories", children: [_jsx("svg", { viewBox: "0 0 24 24", "aria-hidden": "true", children: _jsx("path", { d: "M4 7h16M4 12h16M4 17h16" }) }), _jsx("span", { children: "Todas as categorias" }), _jsx("svg", { className: "category-nav-chevron", viewBox: "0 0 20 20", "aria-hidden": "true", children: _jsx("path", { d: "m6 8 4 4 4-4" }) })] }), _jsxs("div", { className: "category-nav-all-panel", children: [_jsxs("div", { className: "category-nav-panel-heading", children: [_jsxs("div", { children: [_jsx("span", { children: "Explore o cat\u00E1logo" }), _jsx("strong", { children: "Todas as categorias" })] }), _jsx("a", { href: "/produtos", children: "Ver todos" })] }), _jsx("div", { className: "category-nav-tree", children: _jsx(CategoryTree, { categories: categories }) })] })] }), categories.map((category, index) => {
48
+ const overflowed = index >= visibleCount;
49
+ return _jsxs("div", { className: "category-nav-group", "data-overflowed": overflowed || undefined, "aria-hidden": overflowed || undefined, ref: (node) => { itemRefs.current[index] = node; }, children: [_jsxs("a", { href: categoryUrl([category.slug]), children: [category.name, category.children?.length > 0 && _jsx("span", { "aria-hidden": "true", children: "\u2304" })] }), category.children?.length > 0 && _jsx("div", { className: "category-nav-submenu", children: _jsx(CategoryTree, { categories: category.children, path: [category.slug] }) })] }, category.slug);
50
+ })] }) });
51
+ }
52
+ export function SmartProductSearch({ endpoint = "/api/product-suggestions", queryParam = "q", searchProducts }) {
53
+ const [value, setValue] = useState("");
54
+ const [results, setResults] = useState([]);
55
+ const [loading, setLoading] = useState(false);
56
+ const [open, setOpen] = useState(false);
57
+ const [activeIndex, setActiveIndex] = useState(-1);
58
+ const root = useRef(null);
59
+ useEffect(() => {
60
+ const query = value.trim();
61
+ if (query.length < 2) {
62
+ setLoading(false);
63
+ setOpen(false);
64
+ setResults([]);
65
+ setActiveIndex(-1);
66
+ return;
67
+ }
68
+ const controller = new AbortController();
69
+ setOpen(true);
70
+ setLoading(true);
71
+ setActiveIndex(-1);
72
+ const timer = window.setTimeout(() => {
73
+ const separator = endpoint.includes("?") ? "&" : "?";
74
+ const request = searchProducts
75
+ ? searchProducts(query)
76
+ : fetch(`${endpoint}${separator}${encodeURIComponent(queryParam)}=${encodeURIComponent(query)}`, { signal: controller.signal }).then((response) => {
77
+ if (!response.ok)
78
+ throw new Error(`Busca indisponível (${response.status})`);
79
+ return response.json();
80
+ });
81
+ void request
82
+ .then((response) => {
83
+ if (!controller.signal.aborted)
84
+ setResults(Array.isArray(response) ? response.slice(0, 5) : []);
85
+ })
86
+ .catch((error) => {
87
+ if (!(error instanceof DOMException && error.name === "AbortError"))
88
+ setResults([]);
89
+ })
90
+ .finally(() => { if (!controller.signal.aborted)
91
+ setLoading(false); });
92
+ }, 280);
93
+ return () => { window.clearTimeout(timer); controller.abort(); };
94
+ }, [endpoint, queryParam, searchProducts, value]);
95
+ useEffect(() => {
96
+ const close = (event) => { if (!root.current?.contains(event.target))
97
+ setOpen(false); };
98
+ document.addEventListener("pointerdown", close);
99
+ return () => document.removeEventListener("pointerdown", close);
100
+ }, []);
101
+ function handleKeyDown(event) {
102
+ if (event.key === "Escape") {
103
+ setOpen(false);
104
+ setActiveIndex(-1);
105
+ return;
106
+ }
107
+ if (!open || loading || !results.length)
108
+ return;
109
+ if (event.key === "ArrowDown" || event.key === "ArrowUp") {
110
+ event.preventDefault();
111
+ const direction = event.key === "ArrowDown" ? 1 : -1;
112
+ setActiveIndex((current) => {
113
+ if (current < 0)
114
+ return direction > 0 ? 0 : results.length - 1;
115
+ return (current + direction + results.length) % results.length;
116
+ });
117
+ }
118
+ if (event.key === "Enter" && activeIndex >= 0) {
119
+ event.preventDefault();
120
+ window.location.assign(`/produto/${results[activeIndex].slug}`);
121
+ }
122
+ }
123
+ const query = value.trim();
124
+ const resultLabel = `${results.length} ${results.length === 1 ? "resultado" : "resultados"}`;
125
+ return _jsxs("div", { className: "header-search-shell", ref: root, children: [_jsxs("form", { className: "header-search", action: "/produtos", children: [_jsx("label", { className: "sr-only", htmlFor: "theme-store-search", children: "Pesquisar produtos" }), _jsx("input", { id: "theme-store-search", name: "busca", type: "search", placeholder: "Busque por produto, marca ou refer\u00EAncia", autoComplete: "off", value: value, onChange: (event) => setValue(event.target.value), onFocus: () => query.length >= 2 && setOpen(true), onKeyDown: handleKeyDown, "aria-expanded": open, "aria-controls": "theme-search-suggestions", "aria-activedescendant": activeIndex >= 0 ? `theme-search-result-${activeIndex}` : undefined, "aria-autocomplete": "list", role: "combobox" }), _jsx("button", { type: "submit", "aria-label": "Pesquisar produtos", children: _jsxs("svg", { viewBox: "0 0 24 24", "aria-hidden": "true", children: [_jsx("circle", { cx: "11", cy: "11", r: "7" }), _jsx("path", { d: "m16.5 16.5 4 4" })] }) })] }), open && query.length >= 2 && _jsxs("div", { className: "search-suggestions", id: "theme-search-suggestions", role: "listbox", "aria-label": "Sugest\u00F5es de produtos", children: [_jsxs("div", { className: "search-suggestions-heading", children: [_jsxs("strong", { children: ["Sugest\u00F5es para \u201C", query, "\u201D"] }), !loading && _jsx("span", { children: resultLabel })] }), loading && _jsxs("div", { className: "search-suggestions-loading", children: [_jsx("span", { "aria-hidden": "true" }), _jsx("p", { children: "Procurando os produtos mais pr\u00F3ximos\u2026" })] }), !loading && results.map((product, index) => _jsxs("a", { id: `theme-search-result-${index}`, className: activeIndex === index ? "active" : "", href: `/produto/${product.slug}`, role: "option", "aria-selected": activeIndex === index, onPointerEnter: () => setActiveIndex(index), children: [_jsx("span", { className: "search-suggestion-image", children: _jsx(ThemeImageView, { image: product.image, fallbackAlt: product.title, sizes: "56px", fallbackWidth: 112, fallbackHeight: 112 }) }), _jsxs("span", { className: "search-suggestion-copy", children: [_jsx("strong", { children: product.title }), _jsxs("span", { className: "search-suggestion-meta", children: [product.categories[0]?.name && _jsx("small", { children: product.categories[0].name }), product.sku && _jsxs("small", { children: ["Ref. ", product.sku] })] })] }), displayPrice(product) && _jsx("b", { children: displayPrice(product) }), _jsx("span", { className: "search-suggestion-arrow", "aria-hidden": "true", children: "\u2192" })] }, product.slug)), !loading && !results.length && _jsxs("div", { className: "search-suggestions-empty", children: [_jsx("strong", { children: "Nenhum produto encontrado" }), _jsx("p", { children: "Tente outro nome, marca ou refer\u00EAncia." })] }), !loading && _jsxs("a", { className: "search-all-results", href: `/produtos?busca=${encodeURIComponent(query)}`, children: [_jsx("span", { children: "Ver todos os resultados" }), _jsx("strong", { children: "\u2192" })] })] })] });
126
+ }
127
+ function MobileCategories({ categories, path = [] }) {
128
+ return categories.map((category) => {
129
+ const next = [...path, category.slug];
130
+ return category.children?.length ? _jsxs("details", { className: "mobile-menu-category", children: [_jsxs("summary", { children: [_jsx("span", { children: category.name }), _jsx("span", { "aria-hidden": "true", children: "+" })] }), _jsxs("div", { children: [_jsxs("a", { href: categoryUrl(next), children: ["Ver tudo em ", category.name] }), _jsx(MobileCategories, { categories: category.children, path: next })] })] }, category.slug) : _jsx("a", { href: categoryUrl(next), children: category.name }, category.slug);
131
+ });
132
+ }
133
+ export function MobileStoreMenu({ site, categories, pages }) {
134
+ const [open, setOpen] = useState(false);
135
+ useEffect(() => {
136
+ if (!open)
137
+ return;
138
+ const previous = document.body.style.overflow;
139
+ document.body.style.overflow = "hidden";
140
+ return () => { document.body.style.overflow = previous; };
141
+ }, [open]);
142
+ const settings = site.settings;
143
+ return _jsxs(_Fragment, { children: [_jsx("button", { type: "button", className: "mobile-menu-trigger", onClick: () => setOpen(true), "aria-label": "Abrir menu", children: _jsx("svg", { viewBox: "0 0 24 24", "aria-hidden": "true", children: _jsx("path", { d: "M4 7h16M4 12h16M4 17h16" }) }) }), open && _jsx("div", { className: "mobile-menu-backdrop", role: "presentation", onPointerDown: (event) => event.target === event.currentTarget && setOpen(false), children: _jsxs("aside", { className: "mobile-menu-drawer", "aria-label": "Menu da loja", children: [_jsxs("div", { className: "mobile-menu-heading", children: [_jsxs("div", { children: [_jsx("small", { children: "Navegue pela loja" }), _jsx("strong", { children: settings?.siteName || site.tenant.name })] }), _jsx("button", { type: "button", onClick: () => setOpen(false), "aria-label": "Fechar menu", children: "\u00D7" })] }), _jsxs("nav", { className: "mobile-menu-links", children: [_jsx("a", { href: "/", children: "In\u00EDcio" }), site.modules.includes("PRODUCTS") && _jsx("a", { href: "/produtos", children: "Todos os produtos" }), site.modules.includes("BLOG") && _jsx("a", { href: "/blog", children: "Blog" }), site.modules.includes("SERVICES") && _jsx("a", { href: "/servicos", children: "Servi\u00E7os" }), site.modules.includes("CASES") && _jsx("a", { href: "/cases", children: "Cases" }), pages.slice(0, 8).map((page) => _jsx("a", { href: `/${page.slug}`, children: page.title }, page.slug))] }), categories.length > 0 && _jsxs("section", { className: "mobile-menu-categories", children: [_jsx("h2", { children: "Categorias" }), _jsx(MobileCategories, { categories: categories })] })] }) })] });
144
+ }
145
+ //# sourceMappingURL=header-interactions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"header-interactions.js","sourceRoot":"","sources":["../../src/header-interactions.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,EAAE,QAAQ,EAAsB,MAAM,OAAO,CAAC;AAEzF,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAExE,SAAS,YAAY,CAAC,EAAE,UAAU,EAAE,IAAI,GAAG,EAAE,EAAE,KAAK,GAAG,CAAC,EAIvD;IACC,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;QACjC,MAAM,WAAW,GAAG,CAAC,GAAG,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC7C,OAAO,eAAK,SAAS,EAAC,wBAAwB,gBAAa,KAAK,aAC9D,aAAG,IAAI,EAAE,WAAW,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,GAAG,KAAK,GAAG,EAAE,IAAI,EAAE,aAC9E,KAAK,GAAG,CAAC,IAAI,eAAM,SAAS,EAAC,sBAAsB,iBAAa,MAAM,GAAG,EAC1E,yBAAO,QAAQ,CAAC,IAAI,GAAQ,IAC1B,EACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,CAAC,IAAI,KAAC,YAAY,IAAC,UAAU,EAAE,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,GAAI,KALjD,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAMtF,CAAC;IACT,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,EAAE,UAAU,EAAmC;IAChF,MAAM,QAAQ,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,MAAM,CAAqB,IAAI,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAG,MAAM,CAA+B,EAAE,CAAC,CAAC;IAC1D,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAEpD,eAAe,CAAC,GAAG,EAAE;QACnB,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC;QAC/B,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC;QAC3B,IAAI,CAAC,KAAK,IAAI,CAAC,GAAG;YAAE,OAAO;QAC3B,MAAM,SAAS,GAAG,GAAG,EAAE;YACrB,MAAM,MAAM,GAAG,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;YAC9C,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACnE,IAAI,KAAK,GAAG,GAAG,CAAC,WAAW,CAAC;YAC5B,IAAI,KAAK,GAAG,CAAC,CAAC;YACd,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;gBACpC,IAAI,CAAC,IAAI,IAAI,KAAK,GAAG,GAAG,GAAG,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW;oBAAE,MAAM;gBACvE,KAAK,IAAI,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC;gBAChC,KAAK,IAAI,CAAC,CAAC;YACb,CAAC;YACD,eAAe,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC,CAAC;QACF,MAAM,KAAK,GAAG,MAAM,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,SAAS,CAAC,CAAC;QAC/C,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACxB,OAAO,GAAG,EAAE,GAAG,MAAM,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9E,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IAEjB,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,OAAO,GAAG,CAAC,KAAmB,EAAE,EAAE;YACtC,IAAI,MAAM,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAc,CAAC;gBAAE,MAAM,CAAC,OAAO,CAAC,IAAI,GAAG,KAAK,CAAC;QAC1G,CAAC,CAAC;QACF,QAAQ,CAAC,gBAAgB,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QAClD,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IACpE,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,cAAK,SAAS,EAAC,cAAc,gBAAY,wBAAwB,YACtE,eAAK,SAAS,EAAC,oCAAoC,EAAC,GAAG,EAAE,QAAQ,aAC/D,mBAAS,SAAS,EAAC,kBAAkB,EAAC,GAAG,EAAE,MAAM,aAC/C,mBAAS,SAAS,EAAC,gBAAgB,aAAC,cAAK,OAAO,EAAC,WAAW,iBAAa,MAAM,YAAC,eAAM,CAAC,EAAC,yBAAyB,GAAG,GAAM,EAAA,iDAAgC,EAAA,cAAK,SAAS,EAAC,sBAAsB,EAAC,OAAO,EAAC,WAAW,iBAAa,MAAM,YAAC,eAAM,CAAC,EAAC,cAAc,GAAG,GAAM,IAAU,EAChR,eAAK,SAAS,EAAC,wBAAwB,aACrC,eAAK,SAAS,EAAC,4BAA4B,aAAC,0BAAK,qDAA+B,EAAA,mDAAoC,IAAM,EAAA,YAAG,IAAI,EAAC,WAAW,0BAAc,IAAM,EACjK,cAAK,SAAS,EAAC,mBAAmB,YAAC,KAAC,YAAY,IAAC,UAAU,EAAE,UAAU,GAAI,GAAM,IAC7E,IACE,EACT,UAAU,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE;oBAClC,MAAM,UAAU,GAAG,KAAK,IAAI,YAAY,CAAC;oBACzC,OAAO,eAAK,SAAS,EAAC,oBAAoB,qBAAkB,UAAU,IAAI,SAAS,iBAAe,UAAU,IAAI,SAAS,EAAsB,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,aAC/L,aAAG,IAAI,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,aAAG,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,CAAC,IAAI,8BAAkB,MAAM,uBAAS,IAAK,EAC7H,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,CAAC,IAAI,cAAK,SAAS,EAAC,sBAAsB,YAAC,KAAC,YAAY,IAAC,UAAU,EAAE,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAI,GAAM,KAFtB,QAAQ,CAAC,IAAI,CAGvI,CAAC;gBACT,CAAC,CAAC,IACE,GACF,CAAC;AACT,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,EAAE,QAAQ,GAAG,0BAA0B,EAAE,UAAU,GAAG,GAAG,EAAE,cAAc,EAA2G;IACrN,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACvC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAiB,EAAE,CAAC,CAAC;IAC3D,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAE1C,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,UAAU,CAAC,KAAK,CAAC,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,CAAC;YACf,UAAU,CAAC,EAAE,CAAC,CAAC;YACf,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;YACnB,OAAO;QACT,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,OAAO,CAAC,IAAI,CAAC,CAAC;QACd,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;QACnB,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE;YACnC,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YACrD,MAAM,OAAO,GAAG,cAAc;gBAC5B,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC;gBACvB,CAAC,CAAC,KAAK,CAAC,GAAG,QAAQ,GAAG,SAAS,GAAG,kBAAkB,CAAC,UAAU,CAAC,IAAI,kBAAkB,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;oBAChJ,IAAI,CAAC,QAAQ,CAAC,EAAE;wBAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;oBAC7E,OAAO,QAAQ,CAAC,IAAI,EAA6B,CAAC;gBACpD,CAAC,CAAC,CAAC;YACL,KAAK,OAAO;iBACT,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;gBACjB,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO;oBAAE,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAClG,CAAC,CAAC;iBACD,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;gBACxB,IAAI,CAAC,CAAC,KAAK,YAAY,YAAY,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,CAAC;oBAAE,UAAU,CAAC,EAAE,CAAC,CAAC;YACtF,CAAC,CAAC;iBACD,OAAO,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO;gBAAE,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3E,CAAC,EAAE,GAAG,CAAC,CAAC;QACR,OAAO,GAAG,EAAE,GAAG,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IACnE,CAAC,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,cAAc,EAAE,KAAK,CAAC,CAAC,CAAC;IAElD,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,KAAK,GAAG,CAAC,KAAmB,EAAE,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAc,CAAC;YAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9G,QAAQ,CAAC,gBAAgB,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;QAChD,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;IAClE,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,SAAS,aAAa,CAAC,KAAsC;QAC3D,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,CAAC;YACf,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;YACnB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM;YAAE,OAAO;QAChD,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;YACzD,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACrD,cAAc,CAAC,CAAC,OAAO,EAAE,EAAE;gBACzB,IAAI,OAAO,GAAG,CAAC;oBAAE,OAAO,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;gBAC/D,OAAO,CAAC,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;YACjE,CAAC,CAAC,CAAC;QACL,CAAC;QACD,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;YAC9C,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,OAAO,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC3B,MAAM,WAAW,GAAG,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC;IAE7F,OAAO,eAAK,SAAS,EAAC,qBAAqB,EAAC,GAAG,EAAE,IAAI,aACnD,gBAAM,SAAS,EAAC,eAAe,EAAC,MAAM,EAAC,WAAW,aAChD,gBAAO,SAAS,EAAC,SAAS,EAAC,OAAO,EAAC,oBAAoB,mCAA2B,EAClF,gBAAO,EAAE,EAAC,oBAAoB,EAAC,IAAI,EAAC,OAAO,EAAC,IAAI,EAAC,QAAQ,EAAC,WAAW,EAAC,8CAAyC,EAAC,YAAY,EAAC,KAAK,EAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,aAAa,mBAAiB,IAAI,mBAAgB,0BAA0B,2BAAwB,WAAW,IAAI,CAAC,CAAC,CAAC,CAAC,uBAAuB,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS,uBAAoB,MAAM,EAAC,IAAI,EAAC,UAAU,GAAG,EACtd,iBAAQ,IAAI,EAAC,QAAQ,gBAAY,oBAAoB,YAAC,eAAK,OAAO,EAAC,WAAW,iBAAa,MAAM,aAAC,iBAAQ,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,CAAC,EAAC,GAAG,GAAG,EAAA,eAAM,CAAC,EAAC,gBAAgB,GAAG,IAAM,GAAS,IACvK,EACN,IAAI,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,eAAK,SAAS,EAAC,oBAAoB,EAAC,EAAE,EAAC,0BAA0B,EAAC,IAAI,EAAC,SAAS,gBAAY,4BAAuB,aAC/I,eAAK,SAAS,EAAC,4BAA4B,aAAC,2DAAyB,KAAK,cAAW,EAAC,CAAC,OAAO,IAAI,yBAAO,WAAW,GAAQ,IAAO,EAClI,OAAO,IAAI,eAAK,SAAS,EAAC,4BAA4B,aAAC,8BAAkB,MAAM,GAAG,EAAA,0EAA4C,IAAM,EACpI,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,aAAG,EAAE,EAAE,uBAAuB,KAAK,EAAE,EAAE,SAAS,EAAE,WAAW,KAAK,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,YAAY,OAAO,CAAC,IAAI,EAAE,EAAE,IAAI,EAAC,QAAQ,mBAAgB,WAAW,KAAK,KAAK,EAAqB,cAAc,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,aACxR,eAAM,SAAS,EAAC,yBAAyB,YAAC,KAAC,cAAc,IAAC,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,CAAC,KAAK,EAAE,KAAK,EAAC,MAAM,EAAC,aAAa,EAAE,GAAG,EAAE,cAAc,EAAE,GAAG,GAAI,GAAO,EAC3K,gBAAM,SAAS,EAAC,wBAAwB,aAAC,2BAAS,OAAO,CAAC,KAAK,GAAU,EAAA,gBAAM,SAAS,EAAC,wBAAwB,aAAE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,0BAAQ,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,GAAS,EAAE,OAAO,CAAC,GAAG,IAAI,qCAAa,OAAO,CAAC,GAAG,IAAS,IAAQ,IAAO,EAC7P,YAAY,CAAC,OAAO,CAAC,IAAI,sBAAI,YAAY,CAAC,OAAO,CAAC,GAAK,EACxD,eAAM,SAAS,EAAC,yBAAyB,iBAAa,MAAM,uBAAS,KAJ0J,OAAO,CAAC,IAAI,CAKzO,CAAC,EACJ,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,eAAK,SAAS,EAAC,0BAA0B,aAAC,yDAA0C,EAAA,sEAA6C,IAAM,EACtK,CAAC,OAAO,IAAI,aAAG,SAAS,EAAC,oBAAoB,EAAC,IAAI,EAAE,mBAAmB,kBAAkB,CAAC,KAAK,CAAC,EAAE,aAAE,qDAAoC,EAAA,sCAAkB,IAAI,IAC3J,IACF,CAAC;AACT,CAAC;AAED,SAAS,gBAAgB,CAAC,EAAE,UAAU,EAAE,IAAI,GAAG,EAAE,EAAoD;IACnG,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;QACjC,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;QACtC,OAAO,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,mBAA6B,SAAS,EAAC,sBAAsB,aAAC,8BAAS,yBAAO,QAAQ,CAAC,IAAI,GAAQ,EAAA,8BAAkB,MAAM,kBAAS,IAAU,EAAA,0BAAK,aAAG,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,6BAAe,QAAQ,CAAC,IAAI,IAAK,EAAA,KAAC,gBAAgB,IAAC,UAAU,EAAE,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,GAAI,IAAM,KAArQ,QAAQ,CAAC,IAAI,CAAkQ,CAAC,CAAC,CAAC,YAAuB,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,YAAG,QAAQ,CAAC,IAAI,IAAtD,QAAQ,CAAC,IAAI,CAA8C,CAAC;IACzY,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAA+E;IACtI,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;QAC9C,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACxC,OAAO,GAAG,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC5D,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IACX,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;IAC/B,OAAO,8BAAE,iBAAQ,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAC,qBAAqB,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,gBAAa,YAAY,YAAC,cAAK,OAAO,EAAC,WAAW,iBAAa,MAAM,YAAC,eAAM,CAAC,EAAC,yBAAyB,GAAG,GAAM,GAAS,EAAC,IAAI,IAAI,cAAK,SAAS,EAAC,sBAAsB,EAAC,IAAI,EAAC,cAAc,EAAC,aAAa,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,aAAa,IAAI,OAAO,CAAC,KAAK,CAAC,YAAE,iBAAO,SAAS,EAAC,oBAAoB,gBAAY,cAAc,aAAC,eAAK,SAAS,EAAC,qBAAqB,aAAC,0BAAK,gDAAgC,EAAA,2BAAS,QAAQ,EAAE,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,GAAU,IAAM,EAAA,iBAAQ,IAAI,EAAC,QAAQ,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,gBAAa,aAAa,uBAAW,IAAM,EAAA,eAAK,SAAS,EAAC,mBAAmB,aAAC,YAAG,IAAI,EAAC,GAAG,4BAAW,EAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,YAAG,IAAI,EAAC,WAAW,kCAAsB,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,YAAG,IAAI,EAAC,OAAO,qBAAS,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,YAAG,IAAI,EAAC,WAAW,8BAAa,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,YAAG,IAAI,EAAC,QAAQ,sBAAU,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAG,IAAI,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,YAAmB,IAAI,CAAC,KAAK,IAAtB,IAAI,CAAC,IAAI,CAAkB,CAAC,IAAO,EAAC,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,mBAAS,SAAS,EAAC,wBAAwB,aAAC,sCAAmB,EAAA,KAAC,gBAAgB,IAAC,UAAU,EAAE,UAAU,GAAI,IAAU,IAAS,GAAM,IAAI,CAAC;AACjuC,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { HeaderProps } from "@nuvler/theme-sdk";
2
+ import { type ThemeImageComponent } from "./shared.js";
3
+ export declare function Header({ site, categories, pages, template, cart, suggestionsEndpoint, suggestionsQueryParam, searchProducts, ImageComponent }: HeaderProps & {
4
+ ImageComponent?: ThemeImageComponent;
5
+ }): import("react").JSX.Element;
@@ -0,0 +1,13 @@
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { CategoryNavigation, MobileStoreMenu, SmartProductSearch } from "./header-interactions.js";
3
+ import { ThemeImageView } from "./shared.js";
4
+ function SupplementaryLinks({ site, pages }) {
5
+ return _jsxs(_Fragment, { children: [site.modules.includes("BLOG") && _jsx("a", { href: "/blog", children: "Blog" }), site.modules.includes("SERVICES") && _jsx("a", { href: "/servicos", children: "Servi\u00E7os" }), site.modules.includes("CASES") && _jsx("a", { href: "/cases", children: "Cases" }), pages.slice(0, 6).map((page) => _jsx("a", { href: `/${page.slug}`, children: page.title }, page.slug))] });
6
+ }
7
+ export function Header({ site, categories, pages, template, cart, suggestionsEndpoint, suggestionsQueryParam, searchProducts, ImageComponent = ThemeImageView }) {
8
+ const name = site.settings?.siteName || site.tenant.name;
9
+ const hasCategories = categories.length > 0;
10
+ const hasExtra = site.modules.some((module) => ["BLOG", "SERVICES", "CASES"].includes(module)) || pages.length > 0;
11
+ return _jsxs(_Fragment, { children: [_jsx("div", { className: "announcement", children: _jsxs("div", { className: "store-container announcement-inner", children: [_jsx("span", { children: template.announcement }), site.settings?.contact.phone && _jsx("span", { children: site.settings.contact.phone })] }) }), _jsxs("header", { className: "store-header", children: [_jsxs("div", { className: `store-container header-inner${hasCategories && hasExtra ? "" : " header-inner-simple"}`, children: [_jsx(MobileStoreMenu, { site: site, categories: categories, pages: pages }), _jsx("a", { className: "brand", href: "/", "aria-label": `${name} — início`, children: site.settings?.logo?.url ? _jsx(ImageComponent, { image: site.settings.logo, fallbackAlt: name, className: "brand-logo", sizes: "200px", fallbackWidth: 240, fallbackHeight: 96 }) : _jsxs(_Fragment, { children: [_jsx("span", { className: "brand-mark", children: "7" }), _jsx("span", { children: name })] }) }), site.modules.includes("PRODUCTS") && _jsx(SmartProductSearch, { endpoint: suggestionsEndpoint, queryParam: suggestionsQueryParam, searchProducts: searchProducts }), _jsxs("div", { className: "header-message", children: [_jsx("span", { className: "header-message-icon", "aria-hidden": "true", children: _jsx("svg", { viewBox: "0 0 24 24", children: _jsx("path", { d: "m12 3 2.1 4.9L19 10l-4.9 2.1L12 17l-2.1-4.9L5 10l4.9-2.1L12 3Z" }) }) }), _jsxs("span", { className: "header-message-copy", children: [_jsx("small", { children: "Nossa loja" }), _jsx("strong", { children: site.settings?.description?.trim() || template.announcement })] })] }), hasCategories && hasExtra && _jsx("div", { className: "header-actions", children: _jsxs("details", { className: "header-more-menu", children: [_jsxs("summary", { children: ["Mais ", _jsx("span", { "aria-hidden": "true", children: "\u2304" })] }), _jsx("div", { className: "header-more-panel", children: _jsx(SupplementaryLinks, { site: site, pages: pages }) })] }) }), cart] }), hasCategories ? _jsx(CategoryNavigation, { categories: categories }) : _jsx("div", { className: "primary-nav-shell", children: _jsxs("nav", { className: "store-container main-nav", "aria-label": "Navega\u00E7\u00E3o principal", children: [_jsx("a", { href: "/", children: "In\u00EDcio" }), site.modules.includes("PRODUCTS") && _jsx("a", { href: "/produtos", children: "Produtos" }), _jsx(SupplementaryLinks, { site: site, pages: pages })] }) })] })] });
12
+ }
13
+ //# sourceMappingURL=header.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"header.js","sourceRoot":"","sources":["../../src/header.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { HomeProps } from "@nuvler/theme-sdk";
2
+ import { type ThemeImageComponent } from "./shared.js";
3
+ export declare function Home({ sections, products, posts, services, cases, site, template, ImageComponent }: HomeProps & {
4
+ ImageComponent?: ThemeImageComponent;
5
+ }): import("react").JSX.Element;