@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.
- package/README.md +94 -0
- package/dist/nuvler.theme.json +23 -0
- package/dist/src/banner-carousel.d.ts +17 -0
- package/dist/src/banner-carousel.js +14 -0
- package/dist/src/banner-carousel.js.map +1 -0
- package/dist/src/carousel-frame.d.ts +9 -0
- package/dist/src/carousel-frame.js +27 -0
- package/dist/src/carousel-frame.js.map +1 -0
- package/dist/src/definition.d.ts +55 -0
- package/dist/src/definition.js +15 -0
- package/dist/src/definition.js.map +1 -0
- package/dist/src/footer.d.ts +6 -0
- package/dist/src/footer.js +7 -0
- package/dist/src/footer.js.map +1 -0
- package/dist/src/header-interactions.d.ts +14 -0
- package/dist/src/header-interactions.js +145 -0
- package/dist/src/header-interactions.js.map +1 -0
- package/dist/src/header.d.ts +5 -0
- package/dist/src/header.js +13 -0
- package/dist/src/header.js.map +1 -0
- package/dist/src/home.d.ts +5 -0
- package/dist/src/home.js +96 -0
- package/dist/src/home.js.map +1 -0
- package/dist/src/index.d.ts +10 -0
- package/dist/src/index.js +8 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/product-carousel.d.ts +8 -0
- package/dist/src/product-carousel.js +9 -0
- package/dist/src/product-carousel.js.map +1 -0
- package/dist/src/product-detail-interactive.d.ts +15 -0
- package/dist/src/product-detail-interactive.js +126 -0
- package/dist/src/product-detail-interactive.js.map +1 -0
- package/dist/src/product-detail.d.ts +5 -0
- package/dist/src/product-detail.js +27 -0
- package/dist/src/product-detail.js.map +1 -0
- package/dist/src/products.d.ts +11 -0
- package/dist/src/products.js +11 -0
- package/dist/src/products.js.map +1 -0
- package/dist/src/server-shell.d.ts +15 -0
- package/dist/src/server-shell.js +32 -0
- package/dist/src/server-shell.js.map +1 -0
- package/dist/src/shared.d.ts +17 -0
- package/dist/src/shared.js +24 -0
- package/dist/src/shared.js.map +1 -0
- package/dist/src/theme-component.d.ts +79 -0
- package/dist/src/theme-component.js +85 -0
- package/dist/src/theme-component.js.map +1 -0
- package/dist/src/theme-config.d.ts +41 -0
- package/dist/src/theme-config.js +62 -0
- package/dist/src/theme-config.js.map +1 -0
- package/dist/src/theme.d.ts +2 -0
- package/dist/src/theme.js +3 -0
- package/dist/src/theme.js.map +1 -0
- package/dist/theme.css +2965 -0
- 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":"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"}
|
|
@@ -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;
|