@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/dist/src/home.js
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { BannerCarousel } from "./banner-carousel.js";
|
|
3
|
+
import { ProductCarousel } from "./product-carousel.js";
|
|
4
|
+
import { ThemeImageView } from "./shared.js";
|
|
5
|
+
function text(data, key, fallback = "") {
|
|
6
|
+
const value = data[key];
|
|
7
|
+
return typeof value === "string" && value.trim() ? value.trim() : fallback;
|
|
8
|
+
}
|
|
9
|
+
function limit(data) {
|
|
10
|
+
const value = Number(data.limit);
|
|
11
|
+
return Number.isInteger(value) ? Math.min(12, Math.max(1, value)) : 6;
|
|
12
|
+
}
|
|
13
|
+
function imageValue(value) {
|
|
14
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
15
|
+
return null;
|
|
16
|
+
const image = value;
|
|
17
|
+
if (typeof image.url !== "string" || !image.url)
|
|
18
|
+
return null;
|
|
19
|
+
return {
|
|
20
|
+
url: image.url,
|
|
21
|
+
alt: typeof image.alt === "string" ? image.alt : null,
|
|
22
|
+
width: typeof image.width === "number" ? image.width : null,
|
|
23
|
+
height: typeof image.height === "number" ? image.height : null,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
function sectionImage(data, fallbackAlt) {
|
|
27
|
+
const enriched = imageValue(data.image);
|
|
28
|
+
if (enriched)
|
|
29
|
+
return enriched;
|
|
30
|
+
const imageUrl = text(data, "imageUrl");
|
|
31
|
+
return imageUrl ? {
|
|
32
|
+
url: imageUrl,
|
|
33
|
+
alt: text(data, "imageAlt", fallbackAlt),
|
|
34
|
+
width: null,
|
|
35
|
+
height: null,
|
|
36
|
+
} : null;
|
|
37
|
+
}
|
|
38
|
+
function banners(data) {
|
|
39
|
+
if (!Array.isArray(data.banners))
|
|
40
|
+
return [];
|
|
41
|
+
return data.banners.flatMap((entry) => {
|
|
42
|
+
if (!entry || typeof entry !== "object")
|
|
43
|
+
return [];
|
|
44
|
+
const item = entry;
|
|
45
|
+
if (typeof item.imageUrl !== "string" || !item.imageUrl)
|
|
46
|
+
return [];
|
|
47
|
+
return [{ imageUrl: item.imageUrl, image: imageValue(item.image), imageAlt: typeof item.imageAlt === "string" ? item.imageAlt : undefined, title: typeof item.title === "string" ? item.title : undefined, description: typeof item.description === "string" ? item.description : undefined, buttonLabel: typeof item.buttonLabel === "string" ? item.buttonLabel : undefined, buttonUrl: typeof item.buttonUrl === "string" ? item.buttonUrl : undefined }];
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
function Heading({ data, title, href }) {
|
|
51
|
+
return _jsxs("div", { className: "section-heading", children: [_jsxs("div", { children: [_jsx("span", { children: text(data, "eyebrow", "Em destaque") }), _jsx("h2", { children: text(data, "title", title) })] }), _jsx("a", { href: href, children: "Ver todos" })] });
|
|
52
|
+
}
|
|
53
|
+
function Hero({ section, site, action, priority, ImageComponent = ThemeImageView }) {
|
|
54
|
+
const name = site.settings?.siteName || site.tenant.name;
|
|
55
|
+
const title = text(section.data, "title", "Tudo o que você procura, em um só lugar.");
|
|
56
|
+
const description = text(section.data, "description", site.settings?.description || `Conheça a seleção de produtos da ${name}.`);
|
|
57
|
+
const image = sectionImage(section.data, title);
|
|
58
|
+
const copy = _jsxs("div", { className: "hero-copy", children: [_jsx("span", { className: "hero-eyebrow", children: text(section.data, "eyebrow", "Bem-vindo à nossa loja") }), _jsx("h1", { children: title }), _jsx("p", { children: description }), _jsxs("div", { className: "hero-actions", children: [_jsx("a", { className: "button button-primary", href: text(section.data, "buttonUrl", action.href), children: text(section.data, "buttonLabel", action.label) }), site.modules.includes("PRODUCTS") && _jsxs("a", { className: "text-link", href: "/produtos", children: ["Ver cat\u00E1logo completo ", _jsx("span", { children: "\u2192" })] })] })] });
|
|
59
|
+
if (image)
|
|
60
|
+
return _jsxs("section", { className: "hero-section hero-section-image", children: [_jsx(ImageComponent, { image: image, fallbackAlt: title, className: "hero-background-image", priority: priority, sizes: "100vw", fallbackWidth: 1600, fallbackHeight: 700 }), _jsx("div", { className: "hero-background-overlay", "aria-hidden": "true" }), _jsx("div", { className: "store-container hero-image-content", children: copy })] });
|
|
61
|
+
return _jsx("section", { className: "hero-section", children: _jsxs("div", { className: "store-container hero-grid", children: [copy, _jsxs("div", { className: "hero-art", "aria-hidden": "true", children: [_jsx("div", { className: "hero-orbit hero-orbit-one" }), _jsx("div", { className: "hero-orbit hero-orbit-two" }), _jsx("div", { className: "hero-seven", children: "7" }), _jsx("span", { className: "hero-card hero-card-top", children: "Sele\u00E7\u00E3o especial" }), _jsx("span", { className: "hero-card hero-card-bottom", children: "Atendimento humano" })] })] }) });
|
|
62
|
+
}
|
|
63
|
+
function EditorialGrid({ items, basePath, ImageComponent = ThemeImageView }) {
|
|
64
|
+
if (!items.length)
|
|
65
|
+
return _jsxs("div", { className: "empty-state", children: [_jsx("span", { children: "7" }), _jsx("h2", { children: "Nenhum conte\u00FAdo publicado" }), _jsx("p", { children: "As publica\u00E7\u00F5es aparecer\u00E3o aqui quando estiverem dispon\u00EDveis." })] });
|
|
66
|
+
return _jsx("div", { className: "editorial-grid", children: items.map((item) => _jsxs("article", { className: "editorial-card", children: [_jsx("a", { className: "editorial-card-image", href: `${basePath}/${item.slug}`, children: _jsx(ImageComponent, { image: item.image || item.thumbnail || item.coverImage, fallbackAlt: item.title, sizes: "(max-width: 720px) 92vw, 33vw", fallbackWidth: 720, fallbackHeight: 480 }) }), _jsxs("div", { className: "editorial-card-content", children: [(item.category?.title || item.category?.name) && _jsx("span", { children: item.category.title || item.category.name }), _jsx("h2", { children: _jsx("a", { href: `${basePath}/${item.slug}`, children: item.title }) }), _jsx("p", { children: item.description }), _jsxs("a", { className: "text-link", href: `${basePath}/${item.slug}`, children: ["Saiba mais ", _jsx("span", { children: "\u2192" })] })] })] }, item.slug)) });
|
|
67
|
+
}
|
|
68
|
+
function TextSection({ section, ImageComponent = ThemeImageView }) {
|
|
69
|
+
const title = text(section.data, "title", "Conteúdo");
|
|
70
|
+
const description = text(section.data, "description", text(section.data, "text"));
|
|
71
|
+
const image = sectionImage(section.data, title);
|
|
72
|
+
if (section.type === "image-text")
|
|
73
|
+
return _jsx("section", { className: "store-section image-text-section", children: _jsxs("div", { className: "store-container image-text-layout", "data-position": section.data.imagePosition === "right" ? "right" : "left", children: [image && _jsx("div", { className: "image-text-media", children: _jsx(ImageComponent, { image: image, fallbackAlt: title, sizes: "(max-width: 900px) 100vw, 50vw", fallbackWidth: 800, fallbackHeight: 600 }) }), _jsxs("div", { className: "image-text-copy", children: [text(section.data, "eyebrow") && _jsx("span", { children: text(section.data, "eyebrow") }), _jsx("h2", { children: title }), description && _jsx("p", { children: description })] })] }) });
|
|
74
|
+
return _jsx("section", { className: "store-section editorial-section", children: _jsxs("div", { className: "store-container editorial-content", children: [text(section.data, "eyebrow") && _jsx("span", { children: text(section.data, "eyebrow") }), _jsx("h2", { children: title }), description && _jsx("p", { children: description }), section.type === "cta" && text(section.data, "buttonLabel") && text(section.data, "buttonUrl") && _jsx("a", { className: "button button-primary", href: text(section.data, "buttonUrl"), children: text(section.data, "buttonLabel") })] }) });
|
|
75
|
+
}
|
|
76
|
+
export function Home({ sections, products, posts, services, cases, site, template, ImageComponent = ThemeImageView }) {
|
|
77
|
+
const visible = [...sections].filter((section) => section.enabled).sort((a, b) => a.order - b.order);
|
|
78
|
+
const rendered = visible.length ? visible : template.fallbackSections(site.modules);
|
|
79
|
+
const catalog = site.settings?.catalog ?? { showCategory: true, showDescription: true };
|
|
80
|
+
return _jsxs(_Fragment, { children: [rendered.map((section, index) => {
|
|
81
|
+
if (section.type === "hero")
|
|
82
|
+
return _jsx(Hero, { section: section, site: site, action: template.primaryAction(site.modules), priority: index === 0, ImageComponent: ImageComponent }, section.id || index);
|
|
83
|
+
if (section.type === "banner-carousel")
|
|
84
|
+
return _jsx(BannerCarousel, { banners: banners(section.data), autoplay: section.data.autoplay !== false, priority: index === 0, ImageComponent: ImageComponent }, section.id || index);
|
|
85
|
+
if (["image-text", "rich-text", "cta"].includes(section.type))
|
|
86
|
+
return _jsx(TextSection, { section: section, ImageComponent: ImageComponent }, section.id || index);
|
|
87
|
+
if (section.type === "products-grid" || section.type === "products-carousel") {
|
|
88
|
+
const category = text(section.data, "categorySlug");
|
|
89
|
+
const items = products.filter((product) => !category || product.categories.some(({ slug }) => slug === category)).slice(0, limit(section.data));
|
|
90
|
+
return _jsx("section", { className: "store-section", children: _jsxs("div", { className: "store-container", children: [_jsx(Heading, { data: section.data, title: section.type === "products-grid" ? "Produtos em destaque" : "Vitrine de produtos", href: "/produtos" }), _jsx(ProductCarousel, { products: items, showCategory: catalog.showCategory, showDescription: catalog.showDescription, ImageComponent: ImageComponent })] }) }, section.id || index);
|
|
91
|
+
}
|
|
92
|
+
const map = section.type === "services-grid" ? { items: services, path: "/servicos", title: "Nossos serviços" } : section.type === "cases-grid" ? { items: cases, path: "/cases", title: "Cases e resultados" } : { items: posts, path: "/blog", title: "Conteúdos recentes" };
|
|
93
|
+
return _jsx("section", { className: "store-section", children: _jsxs("div", { className: "store-container", children: [_jsx(Heading, { data: section.data, title: map.title, href: map.path }), _jsx(EditorialGrid, { items: map.items.slice(0, limit(section.data)), basePath: map.path, ImageComponent: ImageComponent })] }) }, section.id || index);
|
|
94
|
+
}), _jsx("section", { className: "benefits-section", children: _jsx("div", { className: "store-container benefits-grid", children: template.benefits.map((benefit) => _jsxs("div", { children: [_jsx("strong", { children: benefit.title }), _jsx("span", { children: benefit.description })] }, benefit.title)) }) })] });
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=home.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"home.js","sourceRoot":"","sources":["../../src/home.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { nuvlerDefaultTheme, manifest } from "./definition.js";
|
|
2
|
+
export { Theme, createNuvlerDefaultRuntime } from "./theme-component.js";
|
|
3
|
+
export type { NuvlerDefaultThemeProps } from "./theme-component.js";
|
|
4
|
+
export { Header } from "./header.js";
|
|
5
|
+
export { Footer } from "./footer.js";
|
|
6
|
+
export type { NuvlerDefaultFooterProps } from "./footer.js";
|
|
7
|
+
export { Home } from "./home.js";
|
|
8
|
+
export { ProductGrid, ProductCard } from "./products.js";
|
|
9
|
+
export { ProductDetail } from "./product-detail.js";
|
|
10
|
+
export type { FooterProps, HeaderProps, HomeProps, NuvlerStoreThemeDefinition, ProductDetailProps, ProductGridProps, SiteTemplate, ThemeCategory, ThemeCartItem, ThemeContact, ThemeEditorialItem, ThemeHomeSection, ThemeImage, ThemeManifest, ThemePageSummary, ThemeProduct, ThemeSettings, ThemeSite, } from "@nuvler/theme-sdk";
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { nuvlerDefaultTheme, manifest } from "./definition.js";
|
|
2
|
+
export { Theme, createNuvlerDefaultRuntime } from "./theme-component.js";
|
|
3
|
+
export { Header } from "./header.js";
|
|
4
|
+
export { Footer } from "./footer.js";
|
|
5
|
+
export { Home } from "./home.js";
|
|
6
|
+
export { ProductGrid, ProductCard } from "./products.js";
|
|
7
|
+
export { ProductDetail } from "./product-detail.js";
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,KAAK,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAEzE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ThemeProduct } from "@nuvler/theme-sdk";
|
|
2
|
+
import type { ThemeImageComponent } from "./shared.js";
|
|
3
|
+
export declare function ProductCarousel({ products, showCategory, showDescription, ImageComponent }: {
|
|
4
|
+
products: ThemeProduct[];
|
|
5
|
+
showCategory: boolean;
|
|
6
|
+
showDescription: boolean;
|
|
7
|
+
ImageComponent?: ThemeImageComponent;
|
|
8
|
+
}): import("react").JSX.Element;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { ProductCarouselFrame } from "./carousel-frame.js";
|
|
3
|
+
import { ProductCard } from "./products.js";
|
|
4
|
+
export function ProductCarousel({ products, showCategory, showDescription, ImageComponent }) {
|
|
5
|
+
if (!products.length)
|
|
6
|
+
return _jsxs("div", { className: "empty-state", children: [_jsx("span", { children: "7" }), _jsx("h2", { children: "Nenhum produto encontrado" }), _jsx("p", { children: "Escolha outra categoria ou publique produtos para esta vitrine." })] });
|
|
7
|
+
return (_jsx(ProductCarouselFrame, { children: products.map((product) => (_jsx("div", { className: "product-carousel-item", children: _jsx(ProductCard, { product: product, showCategory: showCategory, showDescription: showDescription, ImageComponent: ImageComponent }) }, product.slug))) }));
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=product-carousel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"product-carousel.js","sourceRoot":"","sources":["../../src/product-carousel.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG5C,MAAM,UAAU,eAAe,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,eAAe,EAAE,cAAc,EAAuH;IAC9M,IAAI,CAAC,QAAQ,CAAC,MAAM;QAAE,OAAO,eAAK,SAAS,EAAC,aAAa,aAAC,+BAAc,EAAA,qDAAkC,EAAA,0FAAsE,IAAM,CAAC;IACvL,OAAO,CACL,KAAC,oBAAoB,cAClB,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CACzB,cAAK,SAAS,EAAC,uBAAuB,YACpC,KAAC,WAAW,IAAC,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,cAAc,EAAE,cAAc,GAAI,IADrF,OAAO,CAAC,IAAI,CAElD,CACP,CAAC,GACmB,CACxB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type ReactNode } from "react";
|
|
2
|
+
import type { ProductDetailProps } from "@nuvler/theme-sdk";
|
|
3
|
+
type AddToCart = NonNullable<ProductDetailProps["onAddToCart"]>;
|
|
4
|
+
export declare function ThemeInteractionProvider({ children, onAddToCart, }: {
|
|
5
|
+
children: ReactNode;
|
|
6
|
+
onAddToCart?: AddToCart;
|
|
7
|
+
}): import("react").JSX.Element;
|
|
8
|
+
interface ProductDetailInteractiveProps extends Omit<ProductDetailProps, "descriptionContent"> {
|
|
9
|
+
information: ReactNode;
|
|
10
|
+
benefits: ReactNode;
|
|
11
|
+
galleryImages: ReactNode;
|
|
12
|
+
galleryThumbnails: ReactNode;
|
|
13
|
+
}
|
|
14
|
+
export declare function ProductDetailInteractive({ product, contact, productUrl, onAddToCart, information, benefits, galleryImages, galleryThumbnails, }: ProductDetailInteractiveProps): import("react").JSX.Element;
|
|
15
|
+
export {};
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { createContext, useEffect, useContext, useMemo, useRef, useState, } from "react";
|
|
4
|
+
const ThemeInteractionContext = createContext({});
|
|
5
|
+
export function ThemeInteractionProvider({ children, onAddToCart, }) {
|
|
6
|
+
const value = useMemo(() => ({ onAddToCart }), [onAddToCart]);
|
|
7
|
+
return _jsx(ThemeInteractionContext.Provider, { value: value, children: children });
|
|
8
|
+
}
|
|
9
|
+
export function ProductDetailInteractive({ product, contact, productUrl, onAddToCart, information, benefits, galleryImages, galleryThumbnails, }) {
|
|
10
|
+
const context = useContext(ThemeInteractionContext);
|
|
11
|
+
const addToCart = onAddToCart ?? context.onAddToCart;
|
|
12
|
+
const initialVariant = product.variants.find((item) => item.active);
|
|
13
|
+
const [selected, setSelected] = useState(() => Object.fromEntries(product.variantOptions.map((option) => [
|
|
14
|
+
option.name,
|
|
15
|
+
initialVariant?.values.find(({ name }) => name === option.name)?.value ?? option.values[0] ?? "",
|
|
16
|
+
])));
|
|
17
|
+
const [imageUrl, setImageUrl] = useState();
|
|
18
|
+
const galleryRef = useRef(null);
|
|
19
|
+
const [zoomEnabled, setZoomEnabled] = useState(true);
|
|
20
|
+
const [zoom, setZoom] = useState({
|
|
21
|
+
visible: false,
|
|
22
|
+
x: 50,
|
|
23
|
+
y: 50,
|
|
24
|
+
size: 220,
|
|
25
|
+
backgroundX: 0,
|
|
26
|
+
backgroundY: 0,
|
|
27
|
+
backgroundWidth: 0,
|
|
28
|
+
backgroundHeight: 0,
|
|
29
|
+
});
|
|
30
|
+
const variant = useMemo(() => product.variants.find((item) => (item.active && item.values.every(({ name, value }) => selected[name] === value))), [product.variants, selected]);
|
|
31
|
+
const images = useMemo(() => {
|
|
32
|
+
if (variant?.image?.url)
|
|
33
|
+
return [variant.image];
|
|
34
|
+
const unique = new Map();
|
|
35
|
+
[product.image, ...(product.images || [])].forEach((image) => {
|
|
36
|
+
if (image?.url)
|
|
37
|
+
unique.set(image.url, image);
|
|
38
|
+
});
|
|
39
|
+
return [...unique.values()];
|
|
40
|
+
}, [product.image, product.images, variant]);
|
|
41
|
+
const selectedImage = images.find((image) => image.url === imageUrl) || images[0] || product.image;
|
|
42
|
+
const phone = contact?.whatsapp?.replace(/\D/g, "");
|
|
43
|
+
const variantDescription = variant?.values.map(({ name, value }) => `${name}: ${value}`).join(", ") || "";
|
|
44
|
+
const message = `Olá! Gostaria de solicitar um orçamento para ${product.title}${variantDescription ? ` (${variantDescription})` : ""}${variant?.sku ? ` — ref. ${variant.sku}` : ""}.${productUrl ? ` ${productUrl}` : ""}`;
|
|
45
|
+
const whatsapp = phone ? `https://wa.me/${phone}?text=${encodeURIComponent(message)}` : null;
|
|
46
|
+
const hasVariants = product.variantOptions.length > 0;
|
|
47
|
+
const canPurchase = !hasVariants || Boolean(variant);
|
|
48
|
+
useEffect(() => {
|
|
49
|
+
const gallery = galleryRef.current;
|
|
50
|
+
if (!gallery)
|
|
51
|
+
return;
|
|
52
|
+
const selectedUrl = selectedImage?.url ?? "";
|
|
53
|
+
const allowedUrls = new Set(images.flatMap((image) => image.url ? [image.url] : []));
|
|
54
|
+
gallery.querySelectorAll("[data-product-main-image]").forEach((node) => {
|
|
55
|
+
node.hidden = node.dataset.productMainImage !== selectedUrl;
|
|
56
|
+
});
|
|
57
|
+
gallery.querySelectorAll("[data-product-thumbnail]").forEach((button) => {
|
|
58
|
+
const url = button.dataset.productThumbnail ?? "";
|
|
59
|
+
button.hidden = !allowedUrls.has(url);
|
|
60
|
+
button.classList.toggle("active", url === selectedUrl);
|
|
61
|
+
button.setAttribute("aria-pressed", String(url === selectedUrl));
|
|
62
|
+
});
|
|
63
|
+
}, [images, selectedImage?.url]);
|
|
64
|
+
function moveZoom(event) {
|
|
65
|
+
if (event.pointerType !== "mouse" || !selectedImage?.url || !zoomEnabled || event.target.closest(".product-zoom-toggle")) {
|
|
66
|
+
setZoom((current) => ({ ...current, visible: false }));
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
const bounds = event.currentTarget.getBoundingClientRect();
|
|
70
|
+
const image = event.currentTarget.querySelector("[data-product-main-image]:not([hidden]) img");
|
|
71
|
+
const naturalWidth = image?.naturalWidth || selectedImage.width || bounds.width;
|
|
72
|
+
const naturalHeight = image?.naturalHeight || selectedImage.height || bounds.height;
|
|
73
|
+
const imageAspect = naturalWidth / naturalHeight;
|
|
74
|
+
const containerAspect = bounds.width / bounds.height;
|
|
75
|
+
const renderedWidth = imageAspect > containerAspect ? bounds.width : bounds.height * imageAspect;
|
|
76
|
+
const renderedHeight = imageAspect > containerAspect ? bounds.width / imageAspect : bounds.height;
|
|
77
|
+
const left = (bounds.width - renderedWidth) / 2;
|
|
78
|
+
const top = (bounds.height - renderedHeight) / 2;
|
|
79
|
+
const pointerX = Math.max(left, Math.min(left + renderedWidth, event.clientX - bounds.left));
|
|
80
|
+
const pointerY = Math.max(top, Math.min(top + renderedHeight, event.clientY - bounds.top));
|
|
81
|
+
const size = Math.min(280, Math.max(210, bounds.width * 0.42));
|
|
82
|
+
const scale = 2.5;
|
|
83
|
+
const backgroundWidth = renderedWidth * scale;
|
|
84
|
+
const backgroundHeight = renderedHeight * scale;
|
|
85
|
+
setZoom({
|
|
86
|
+
visible: true,
|
|
87
|
+
x: pointerX / bounds.width * 100,
|
|
88
|
+
y: pointerY / bounds.height * 100,
|
|
89
|
+
size,
|
|
90
|
+
backgroundX: size / 2 - (pointerX - left) / renderedWidth * backgroundWidth,
|
|
91
|
+
backgroundY: size / 2 - (pointerY - top) / renderedHeight * backgroundHeight,
|
|
92
|
+
backgroundWidth,
|
|
93
|
+
backgroundHeight,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
return (_jsxs("div", { className: "product-detail", children: [_jsxs("div", { className: "product-gallery", ref: galleryRef, children: [_jsxs("div", { className: "product-main-image product-image-magnifier", "data-zoom-enabled": zoomEnabled, onPointerEnter: moveZoom, onPointerMove: moveZoom, onPointerLeave: () => setZoom((current) => ({ ...current, visible: false })), children: [galleryImages, selectedImage?.url && _jsxs("button", { className: `product-zoom-toggle${zoomEnabled ? " active" : ""}`, type: "button", "aria-pressed": zoomEnabled, "aria-label": zoomEnabled ? "Desativar lupa" : "Ativar lupa", onClick: () => {
|
|
97
|
+
setZoomEnabled((enabled) => !enabled);
|
|
98
|
+
setZoom((current) => ({ ...current, visible: false }));
|
|
99
|
+
}, children: [_jsxs("svg", { viewBox: "0 0 24 24", "aria-hidden": "true", children: [_jsx("circle", { cx: "10.5", cy: "10.5", r: "6.5" }), _jsx("path", { d: "m15.5 15.5 5 5M10.5 7.5v6M7.5 10.5h6" }), !zoomEnabled && _jsx("path", { className: "zoom-off-line", d: "M3 3l18 18" })] }), _jsx("span", { children: "Lupa" })] }), selectedImage?.url && _jsx("span", { className: `product-zoom-lens${zoom.visible ? " visible" : ""}`, "aria-hidden": "true", style: {
|
|
100
|
+
left: `${zoom.x}%`,
|
|
101
|
+
top: `${zoom.y}%`,
|
|
102
|
+
width: zoom.size,
|
|
103
|
+
height: zoom.size,
|
|
104
|
+
backgroundImage: `url(${JSON.stringify(selectedImage.url)})`,
|
|
105
|
+
backgroundPosition: `${zoom.backgroundX}px ${zoom.backgroundY}px`,
|
|
106
|
+
backgroundSize: `${zoom.backgroundWidth}px ${zoom.backgroundHeight}px`,
|
|
107
|
+
} })] }), _jsx("div", { className: "product-thumbnails", onClick: (event) => {
|
|
108
|
+
const button = event.target.closest("[data-product-thumbnail]");
|
|
109
|
+
if (button?.dataset.productThumbnail)
|
|
110
|
+
setImageUrl(button.dataset.productThumbnail);
|
|
111
|
+
}, children: galleryThumbnails })] }), _jsxs("div", { className: "product-info", children: [information, _jsxs("div", { className: "product-purchase", children: [hasVariants && _jsxs("div", { className: "variant-selector", children: [product.variantOptions.map((option) => _jsxs("fieldset", { children: [_jsxs("legend", { children: [option.name, ": ", _jsx("strong", { children: selected[option.name] })] }), _jsx("div", { className: "variant-values", children: option.values.map((value) => _jsx("button", { type: "button", className: selected[option.name] === value ? "active" : "", "aria-pressed": selected[option.name] === value, onClick: () => {
|
|
112
|
+
setSelected((current) => ({ ...current, [option.name]: value }));
|
|
113
|
+
setImageUrl(undefined);
|
|
114
|
+
}, children: value }, value)) })] }, option.name)), variant
|
|
115
|
+
? _jsxs("p", { className: "selected-variant", children: [_jsx("strong", { children: variant.name || variantDescription }), variant.sku && _jsxs("span", { children: ["Refer\u00EAncia: ", variant.sku] })] })
|
|
116
|
+
: _jsx("p", { className: "variant-unavailable", children: "Esta combina\u00E7\u00E3o n\u00E3o est\u00E1 dispon\u00EDvel." })] }), canPurchase && addToCart && _jsx("button", { type: "button", className: "button button-primary button-block", onClick: () => addToCart({
|
|
117
|
+
productSlug: product.slug,
|
|
118
|
+
title: product.title,
|
|
119
|
+
sku: variant?.sku || product.sku,
|
|
120
|
+
variantId: variant?.id,
|
|
121
|
+
variantName: variantDescription,
|
|
122
|
+
image: variant?.image || product.image,
|
|
123
|
+
unitPrice: variant ? null : product.promotionalPrice ?? product.price,
|
|
124
|
+
}), children: "Adicionar ao or\u00E7amento" }), canPurchase && whatsapp && _jsx("a", { className: `button ${addToCart ? "button-secondary" : "button-primary"} button-block`, href: whatsapp, target: "_blank", rel: "noreferrer", children: "Or\u00E7ar somente este item" }), canPurchase && !whatsapp && contact?.email && _jsx("a", { className: "button button-primary button-block", href: `mailto:${contact.email}?subject=${encodeURIComponent(`Orçamento: ${product.title}`)}&body=${encodeURIComponent(message)}`, children: "Solicitar or\u00E7amento por e-mail" }), canPurchase && !whatsapp && !contact?.email && contact?.phone && _jsx("a", { className: "button button-primary button-block", href: `tel:${contact.phone}`, children: "Ligar e solicitar or\u00E7amento" })] }), benefits] })] }));
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=product-detail-interactive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"product-detail-interactive.js","sourceRoot":"","sources":["../../src/product-detail-interactive.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { ProductDetailProps } from "@nuvler/theme-sdk";
|
|
2
|
+
import { type ThemeImageComponent } from "./shared.js";
|
|
3
|
+
export declare function ProductDetail({ product, contact, productUrl, descriptionContent, onAddToCart, ImageComponent, }: ProductDetailProps & {
|
|
4
|
+
ImageComponent?: ThemeImageComponent;
|
|
5
|
+
}): import("react").JSX.Element;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { ProductDetailInteractive } from "./product-detail-interactive.js";
|
|
3
|
+
import { ThemeImageView } from "./shared.js";
|
|
4
|
+
export function ProductDetail({ product, contact, productUrl, descriptionContent, onAddToCart, ImageComponent = ThemeImageView, }) {
|
|
5
|
+
const initialVariant = product.variants.find((variant) => variant.active);
|
|
6
|
+
const uniqueImages = new Map();
|
|
7
|
+
[
|
|
8
|
+
initialVariant?.image,
|
|
9
|
+
product.image,
|
|
10
|
+
...(product.images ?? []),
|
|
11
|
+
...product.variants.map((variant) => variant.image),
|
|
12
|
+
].forEach((image) => {
|
|
13
|
+
if (image?.url)
|
|
14
|
+
uniqueImages.set(image.url, image);
|
|
15
|
+
});
|
|
16
|
+
const images = [...uniqueImages.values()];
|
|
17
|
+
const galleryImages = images.length > 0
|
|
18
|
+
? images.map((image, index) => (_jsx("span", { "data-product-main-image": image.url, hidden: index !== 0, children: _jsx(ImageComponent, { image: image, fallbackAlt: initialVariant?.name || product.title, priority: index === 0, sizes: "(max-width: 900px) 100vw, 50vw", fallbackWidth: 1000, fallbackHeight: 1000 }) }, image.url)))
|
|
19
|
+
: _jsx("span", { "data-product-main-image": "", children: _jsx(ImageComponent, { image: null, fallbackAlt: product.title }) });
|
|
20
|
+
const galleryThumbnails = images.length > 1
|
|
21
|
+
? images.map((image, index) => (_jsx("button", { className: index === 0 ? "active" : "", type: "button", "aria-pressed": index === 0, "aria-label": `Exibir imagem ${index + 1} de ${product.title}`, "data-product-thumbnail": image.url, children: _jsx(ImageComponent, { image: image, fallbackAlt: `${product.title} ${index + 1}`, sizes: "96px", fallbackWidth: 192, fallbackHeight: 192 }) }, `${image.url}-${index}`)))
|
|
22
|
+
: null;
|
|
23
|
+
const information = _jsxs(_Fragment, { children: [product.categories[0] && _jsx("span", { className: "product-category", children: product.categories[0].name }), _jsx("h1", { children: product.title }), _jsx("div", { className: "product-description", children: descriptionContent })] });
|
|
24
|
+
const benefits = _jsxs("div", { className: "purchase-benefits", children: [_jsxs("span", { children: [_jsx("strong", { children: "Atendimento direto" }), " Fale com quem entende do produto"] }), _jsxs("span", { children: [_jsx("strong", { children: "Or\u00E7amento personalizado" }), " Condi\u00E7\u00F5es para a sua necessidade"] })] });
|
|
25
|
+
return (_jsx(ProductDetailInteractive, { product: product, contact: contact, productUrl: productUrl, onAddToCart: onAddToCart, information: information, benefits: benefits, galleryImages: galleryImages, galleryThumbnails: galleryThumbnails }));
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=product-detail.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"product-detail.js","sourceRoot":"","sources":["../../src/product-detail.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ProductGridProps, ThemeProduct } from "@nuvler/theme-sdk";
|
|
2
|
+
import { type ThemeImageComponent } from "./shared.js";
|
|
3
|
+
export declare function ProductCard({ product, showCategory, showDescription, ImageComponent }: {
|
|
4
|
+
product: ThemeProduct;
|
|
5
|
+
showCategory?: boolean;
|
|
6
|
+
showDescription?: boolean;
|
|
7
|
+
ImageComponent?: ThemeImageComponent;
|
|
8
|
+
}): import("react").JSX.Element;
|
|
9
|
+
export declare function ProductGrid({ products, columns, showCategory, showDescription, ImageComponent }: ProductGridProps & {
|
|
10
|
+
ImageComponent?: ThemeImageComponent;
|
|
11
|
+
}): import("react").JSX.Element;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { plainText, ThemeImageView } from "./shared.js";
|
|
3
|
+
export function ProductCard({ product, showCategory = true, showDescription = true, ImageComponent = ThemeImageView }) {
|
|
4
|
+
return _jsxs("article", { className: "product-card", children: [_jsx("a", { className: "product-card-image", href: `/produto/${product.slug}`, children: _jsx(ImageComponent, { image: product.image, fallbackAlt: product.title, sizes: "(max-width: 720px) 92vw, (max-width: 1100px) 45vw, 25vw", fallbackWidth: 720, fallbackHeight: 720 }) }), _jsxs("div", { className: "product-card-content", children: [showCategory && _jsx("span", { className: `product-category${product.categories[0] ? "" : " product-category-empty"}`, children: product.categories[0]?.name || "Sem categoria" }), _jsx("h3", { children: _jsx("a", { href: `/produto/${product.slug}`, children: product.title }) }), showDescription && product.description && _jsx("p", { className: "product-card-description", children: plainText(product.description) }), _jsx("a", { className: "button button-secondary button-block", href: `/produto/${product.slug}`, children: "Ver detalhes e or\u00E7ar" })] })] });
|
|
5
|
+
}
|
|
6
|
+
export function ProductGrid({ products, columns = 4, showCategory = true, showDescription = true, ImageComponent = ThemeImageView }) {
|
|
7
|
+
if (!products.length)
|
|
8
|
+
return _jsxs("div", { className: "empty-state", children: [_jsx("span", { children: "7" }), _jsx("h2", { children: "Nenhum produto encontrado" }), _jsx("p", { children: "Novos itens aparecer\u00E3o aqui assim que forem publicados." })] });
|
|
9
|
+
return _jsx("div", { className: "product-grid", "data-columns": columns, children: products.map((product) => _jsx(ProductCard, { product: product, showCategory: showCategory, showDescription: showDescription, ImageComponent: ImageComponent }, product.slug)) });
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=products.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"products.js","sourceRoot":"","sources":["../../src/products.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,cAAc,EAA4B,MAAM,aAAa,CAAC;AAElF,MAAM,UAAU,WAAW,CAAC,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI,EAAE,eAAe,GAAG,IAAI,EAAE,cAAc,GAAG,cAAc,EAKlH;IACC,OAAO,mBAAS,SAAS,EAAC,cAAc,aAAC,YAAG,SAAS,EAAC,oBAAoB,EAAC,IAAI,EAAE,YAAY,OAAO,CAAC,IAAI,EAAE,YAAE,KAAC,cAAc,IAAC,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,CAAC,KAAK,EAAE,KAAK,EAAC,yDAAyD,EAAC,aAAa,EAAE,GAAG,EAAE,cAAc,EAAE,GAAG,GAAI,GAAI,EAAA,eAAK,SAAS,EAAC,sBAAsB,aAAE,YAAY,IAAI,eAAM,SAAS,EAAE,mBAAmB,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,yBAAyB,EAAE,YAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,eAAe,GAAQ,EAAC,uBAAI,YAAG,IAAI,EAAE,YAAY,OAAO,CAAC,IAAI,EAAE,YAAG,OAAO,CAAC,KAAK,GAAK,GAAK,EAAC,eAAe,IAAI,OAAO,CAAC,WAAW,IAAI,YAAG,SAAS,EAAC,0BAA0B,YAAE,SAAS,CAAC,OAAO,CAAC,WAAW,CAAC,GAAK,EAAC,YAAG,SAAS,EAAC,sCAAsC,EAAC,IAAI,EAAE,YAAY,OAAO,CAAC,IAAI,EAAE,0CAA0B,IAAM,IAAU,CAAC;AACryB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,EAAE,QAAQ,EAAE,OAAO,GAAG,CAAC,EAAE,YAAY,GAAG,IAAI,EAAE,eAAe,GAAG,IAAI,EAAE,cAAc,GAAG,cAAc,EAA+D;IAC9L,IAAI,CAAC,QAAQ,CAAC,MAAM;QAAE,OAAO,eAAK,SAAS,EAAC,aAAa,aAAC,+BAAc,EAAA,qDAAkC,EAAA,uFAA8D,IAAM,CAAC;IAC/K,OAAO,cAAK,SAAS,EAAC,cAAc,kBAAe,OAAO,YAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,KAAC,WAAW,IAAoB,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,cAAc,EAAE,cAAc,IAA5H,OAAO,CAAC,IAAI,CAAoH,CAAC,GAAO,CAAC;AACpP,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
import type { ThemeCategory, ThemePageSummary, ThemeSite } from "@nuvler/theme-sdk";
|
|
3
|
+
import type { ThemeImageComponent } from "./shared.js";
|
|
4
|
+
export interface NuvlerDefaultShellProps {
|
|
5
|
+
site: ThemeSite;
|
|
6
|
+
categories: ThemeCategory[];
|
|
7
|
+
pages: ThemePageSummary[];
|
|
8
|
+
children: ReactNode;
|
|
9
|
+
cart?: ReactNode;
|
|
10
|
+
platformBrand?: ReactNode;
|
|
11
|
+
suggestionsEndpoint?: string;
|
|
12
|
+
suggestionsQueryParam?: string;
|
|
13
|
+
ImageComponent?: ThemeImageComponent;
|
|
14
|
+
}
|
|
15
|
+
export declare function NuvlerDefaultShell({ site, categories, pages, children, cart, platformBrand, suggestionsEndpoint, suggestionsQueryParam, ImageComponent, }: NuvlerDefaultShellProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Footer } from "./footer.js";
|
|
3
|
+
import { Header } from "./header.js";
|
|
4
|
+
import { manifest, nuvlerDefaultTemplate, nuvlerDefaultTokens, } from "./theme-config.js";
|
|
5
|
+
export function NuvlerDefaultShell({ site, categories, pages, children, cart, platformBrand, suggestionsEndpoint, suggestionsQueryParam, ImageComponent, }) {
|
|
6
|
+
const configured = site.settings?.theme;
|
|
7
|
+
const tokens = {
|
|
8
|
+
colors: { ...nuvlerDefaultTokens.colors, ...configured?.colors },
|
|
9
|
+
layout: { ...nuvlerDefaultTokens.layout, ...configured?.layout },
|
|
10
|
+
};
|
|
11
|
+
const style = {
|
|
12
|
+
"--color-primary": tokens.colors.primary,
|
|
13
|
+
"--color-primary-text": tokens.colors.primaryText,
|
|
14
|
+
"--color-secondary": tokens.colors.secondary,
|
|
15
|
+
"--color-secondary-text": tokens.colors.secondaryText,
|
|
16
|
+
"--color-accent": tokens.colors.accent,
|
|
17
|
+
"--store-background": tokens.colors.background,
|
|
18
|
+
"--store-surface": tokens.colors.surface,
|
|
19
|
+
"--store-surface-alt": tokens.colors.surfaceAlt,
|
|
20
|
+
"--store-text": tokens.colors.text,
|
|
21
|
+
"--store-muted": tokens.colors.textMuted,
|
|
22
|
+
"--store-line": tokens.colors.border,
|
|
23
|
+
"--store-header-background": tokens.colors.headerBackground,
|
|
24
|
+
"--store-header-text": tokens.colors.headerText,
|
|
25
|
+
"--store-footer-background": tokens.colors.footerBackground,
|
|
26
|
+
"--store-footer-text": tokens.colors.footerText,
|
|
27
|
+
"--container-width": `${tokens.layout.containerWidth}px`,
|
|
28
|
+
"--border-radius": `${tokens.layout.borderRadius}px`,
|
|
29
|
+
};
|
|
30
|
+
return (_jsxs("div", { className: "store-shell nuvler-default-theme", "data-theme-id": manifest.id, "data-theme-version": manifest.version, "data-nuvler-renderer": "server", style: style, children: [_jsx(Header, { site: site, categories: categories, pages: pages, template: nuvlerDefaultTemplate, cart: cart, suggestionsEndpoint: suggestionsEndpoint, suggestionsQueryParam: suggestionsQueryParam, ImageComponent: ImageComponent }), _jsx("div", { className: "store-page", children: children }), _jsx(Footer, { site: site, pages: pages, template: nuvlerDefaultTemplate, platformBrand: platformBrand })] }));
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=server-shell.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-shell.js","sourceRoot":"","sources":["../../src/server-shell.tsx"],"names":[],"mappings":";AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EACL,QAAQ,EACR,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAe3B,MAAM,UAAU,kBAAkB,CAAC,EACjC,IAAI,EACJ,UAAU,EACV,KAAK,EACL,QAAQ,EACR,IAAI,EACJ,aAAa,EACb,mBAAmB,EACnB,qBAAqB,EACrB,cAAc,GACU;IACxB,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC;IACxC,MAAM,MAAM,GAAG;QACb,MAAM,EAAE,EAAE,GAAG,mBAAmB,CAAC,MAAM,EAAE,GAAG,UAAU,EAAE,MAAM,EAAE;QAChE,MAAM,EAAE,EAAE,GAAG,mBAAmB,CAAC,MAAM,EAAE,GAAG,UAAU,EAAE,MAAM,EAAE;KACjE,CAAC;IACF,MAAM,KAAK,GAAG;QACZ,iBAAiB,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO;QACxC,sBAAsB,EAAE,MAAM,CAAC,MAAM,CAAC,WAAW;QACjD,mBAAmB,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS;QAC5C,wBAAwB,EAAE,MAAM,CAAC,MAAM,CAAC,aAAa;QACrD,gBAAgB,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM;QACtC,oBAAoB,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU;QAC9C,iBAAiB,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO;QACxC,qBAAqB,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU;QAC/C,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI;QAClC,eAAe,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS;QACxC,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM;QACpC,2BAA2B,EAAE,MAAM,CAAC,MAAM,CAAC,gBAAgB;QAC3D,qBAAqB,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU;QAC/C,2BAA2B,EAAE,MAAM,CAAC,MAAM,CAAC,gBAAgB;QAC3D,qBAAqB,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU;QAC/C,mBAAmB,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,cAAc,IAAI;QACxD,iBAAiB,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,YAAY,IAAI;KACpC,CAAC;IAEnB,OAAO,CACL,eACE,SAAS,EAAC,kCAAkC,mBAC7B,QAAQ,CAAC,EAAE,wBACN,QAAQ,CAAC,OAAO,0BACf,QAAQ,EAC7B,KAAK,EAAE,KAAK,aAEZ,KAAC,MAAM,IACL,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,qBAAqB,EAC/B,IAAI,EAAE,IAAI,EACV,mBAAmB,EAAE,mBAAmB,EACxC,qBAAqB,EAAE,qBAAqB,EAC5C,cAAc,EAAE,cAAc,GAC9B,EACF,cAAK,SAAS,EAAC,YAAY,YAAE,QAAQ,GAAO,EAC5C,KAAC,MAAM,IACL,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,qBAAqB,EAC/B,aAAa,EAAE,aAAa,GAC5B,IACE,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ComponentType } from "react";
|
|
2
|
+
import type { ThemeImage, ThemeProduct } from "@nuvler/theme-sdk";
|
|
3
|
+
export interface ThemeImageViewProps {
|
|
4
|
+
image: ThemeImage | null | undefined;
|
|
5
|
+
fallbackAlt: string;
|
|
6
|
+
className?: string;
|
|
7
|
+
priority?: boolean;
|
|
8
|
+
loading?: "eager" | "lazy";
|
|
9
|
+
sizes?: string;
|
|
10
|
+
fallbackWidth?: number;
|
|
11
|
+
fallbackHeight?: number;
|
|
12
|
+
}
|
|
13
|
+
export type ThemeImageComponent = ComponentType<ThemeImageViewProps>;
|
|
14
|
+
export declare function ThemeImageView({ image, fallbackAlt, className, priority, loading, sizes, fallbackWidth, fallbackHeight, }: ThemeImageViewProps): import("react").JSX.Element;
|
|
15
|
+
export declare function plainText(value: string): string;
|
|
16
|
+
export declare function displayPrice(product: ThemeProduct): string | null;
|
|
17
|
+
export declare function categoryUrl(path: string[]): string;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
export function ThemeImageView({ image, fallbackAlt, className, priority = false, loading = "lazy", sizes, fallbackWidth = 900, fallbackHeight = 900, }) {
|
|
3
|
+
if (!image?.url) {
|
|
4
|
+
return _jsx("span", { className: `store-image-placeholder ${className ?? ""}`, "aria-hidden": "true", children: _jsx("span", { children: "7" }) });
|
|
5
|
+
}
|
|
6
|
+
return _jsx("img", { src: image.url, alt: image.alt || fallbackAlt, width: image.width || fallbackWidth, height: image.height || fallbackHeight, className: className, loading: priority ? "eager" : loading, fetchPriority: priority ? "high" : "auto", decoding: "async", sizes: sizes });
|
|
7
|
+
}
|
|
8
|
+
export function plainText(value) {
|
|
9
|
+
return value
|
|
10
|
+
.replace(/<(script|style)\b[^>]*>[\s\S]*?<\/\1>/gi, " ")
|
|
11
|
+
.replace(/<[^>]+>/g, " ")
|
|
12
|
+
.replace(/\s+/g, " ")
|
|
13
|
+
.trim();
|
|
14
|
+
}
|
|
15
|
+
export function displayPrice(product) {
|
|
16
|
+
const price = product.promotionalPrice ?? product.price;
|
|
17
|
+
return typeof price === "number"
|
|
18
|
+
? new Intl.NumberFormat("pt-BR", { style: "currency", currency: "BRL" }).format(price)
|
|
19
|
+
: null;
|
|
20
|
+
}
|
|
21
|
+
export function categoryUrl(path) {
|
|
22
|
+
return `/categoria/${path.map(encodeURIComponent).join("/")}`;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/shared.tsx"],"names":[],"mappings":";AAgBA,MAAM,UAAU,cAAc,CAAC,EAC7B,KAAK,EACL,WAAW,EACX,SAAS,EACT,QAAQ,GAAG,KAAK,EAChB,OAAO,GAAG,MAAM,EAChB,KAAK,EACL,aAAa,GAAG,GAAG,EACnB,cAAc,GAAG,GAAG,GACA;IACpB,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC;QAChB,OAAO,eAAM,SAAS,EAAE,2BAA2B,SAAS,IAAI,EAAE,EAAE,iBAAc,MAAM,YAAC,+BAAc,GAAO,CAAC;IACjH,CAAC;IACD,OAAO,cACL,GAAG,EAAE,KAAK,CAAC,GAAG,EACd,GAAG,EAAE,KAAK,CAAC,GAAG,IAAI,WAAW,EAC7B,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,aAAa,EACnC,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,cAAc,EACtC,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EACrC,aAAa,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EACzC,QAAQ,EAAC,OAAO,EAChB,KAAK,EAAE,KAAK,GACZ,CAAC;AACL,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,OAAO,KAAK;SACT,OAAO,CAAC,yCAAyC,EAAE,GAAG,CAAC;SACvD,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC;SACxB,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,IAAI,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAqB;IAChD,MAAM,KAAK,GAAG,OAAO,CAAC,gBAAgB,IAAI,OAAO,CAAC,KAAK,CAAC;IACxD,OAAO,OAAO,KAAK,KAAK,QAAQ;QAC9B,CAAC,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;QACtF,CAAC,CAAC,IAAI,CAAC;AACX,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAc;IACxC,OAAO,cAAc,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AAChE,CAAC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import type { NuvlerStoreThemeDefinition, ThemeCategory, ThemeEditorialItem, ThemeHomeSection, ThemePageSummary, ThemeProduct, ThemeRuntimeAdapters, ThemeSite } from "@nuvler/theme-sdk";
|
|
2
|
+
interface PreviewContext {
|
|
3
|
+
store: {
|
|
4
|
+
name: string;
|
|
5
|
+
slug: string;
|
|
6
|
+
};
|
|
7
|
+
site: {
|
|
8
|
+
modules: string[];
|
|
9
|
+
settings: ThemeSite["settings"];
|
|
10
|
+
};
|
|
11
|
+
navigation: {
|
|
12
|
+
pages: ThemePageSummary[];
|
|
13
|
+
categories: ThemeCategory[];
|
|
14
|
+
};
|
|
15
|
+
home: {
|
|
16
|
+
content: {
|
|
17
|
+
sections: ThemeHomeSection[];
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
catalog: {
|
|
21
|
+
products: ThemeProduct[];
|
|
22
|
+
};
|
|
23
|
+
editorial: {
|
|
24
|
+
posts: ThemeEditorialItem[];
|
|
25
|
+
services: ThemeEditorialItem[];
|
|
26
|
+
cases: ThemeEditorialItem[];
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
type PreviewRoute = {
|
|
30
|
+
type: "home" | "loading" | "not-found" | "page";
|
|
31
|
+
title?: string;
|
|
32
|
+
} | {
|
|
33
|
+
type: "catalog";
|
|
34
|
+
products: ThemeProduct[];
|
|
35
|
+
pagination: {
|
|
36
|
+
page: number;
|
|
37
|
+
total: number;
|
|
38
|
+
totalPages: number;
|
|
39
|
+
hasPreviousPage: boolean;
|
|
40
|
+
hasNextPage: boolean;
|
|
41
|
+
};
|
|
42
|
+
search: string;
|
|
43
|
+
categorySlug: string | null;
|
|
44
|
+
categoryPath: string[];
|
|
45
|
+
variants: string[];
|
|
46
|
+
facets: Array<{
|
|
47
|
+
name: string;
|
|
48
|
+
values: Array<{
|
|
49
|
+
value: string;
|
|
50
|
+
count: number;
|
|
51
|
+
}>;
|
|
52
|
+
}>;
|
|
53
|
+
} | {
|
|
54
|
+
type: "product";
|
|
55
|
+
product: ThemeProduct;
|
|
56
|
+
} | {
|
|
57
|
+
type: "editorial-list";
|
|
58
|
+
title: string;
|
|
59
|
+
basePath: string;
|
|
60
|
+
items: ThemeEditorialItem[];
|
|
61
|
+
} | {
|
|
62
|
+
type: "editorial-detail";
|
|
63
|
+
basePath: string;
|
|
64
|
+
item: ThemeEditorialItem;
|
|
65
|
+
};
|
|
66
|
+
export interface NuvlerDefaultThemeProps {
|
|
67
|
+
context: PreviewContext;
|
|
68
|
+
route?: PreviewRoute;
|
|
69
|
+
adapters?: ThemeRuntimeAdapters;
|
|
70
|
+
}
|
|
71
|
+
export declare function createNuvlerDefaultRuntime(themeDefinition: NuvlerStoreThemeDefinition): {
|
|
72
|
+
({ context, route, adapters }: NuvlerDefaultThemeProps): import("react").JSX.Element;
|
|
73
|
+
displayName: string;
|
|
74
|
+
};
|
|
75
|
+
export declare const Theme: {
|
|
76
|
+
({ context, route, adapters }: NuvlerDefaultThemeProps): import("react").JSX.Element;
|
|
77
|
+
displayName: string;
|
|
78
|
+
};
|
|
79
|
+
export {};
|