@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
@@ -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 {};