// ====================== SHARED DATA ======================
const CATEGORIES = [
{ id: "escritorio", label: "Materiais de Escritório", short: "DE ESCRITÓRIO", slot: "Foto: material de escritório" },
{ id: "limpeza", label: "Produtos de Limpeza", short: "DE LIMPEZA", slot: "Foto: produtos de limpeza" },
{ id: "copa", label: "Produtos de Copa", short: "DE COPA", slot: "Foto: café / produtos de copa" },
{ id: "descartaveis", label: "Descartáveis", short: "DESCARTÁVEIS", slot: "Foto: copos descartáveis" },
{ id: "equipamentos", label: "Equipamentos", short: "EQUIPAMENTOS", slot: "Foto: cadeira / equipamento" },
{ id: "papelaria", label: "Papelaria", short: "PAPELARIA", slot: "Foto: caderno / papelaria" }];
const EQUIP_SUB = ["Cadeiras de Escritório", "Mesas e Estações", "Bebedouros", "Ventiladores", "Aspiradores", "Carrinhos de Limpeza"];
// URLs das categorias já publicadas (as demais ainda abrem aviso/Home)
const PAGE_URLS = {
limpeza: "Produtos de Limpeza.html",
escritorio: "Materiais de Escritorio.html",
copa: "Copa e Cozinha.html",
};
// só as categorias que já têm página publicada aparecem no site
const VISIBLE_CATEGORIES = CATEGORIES.filter((c) => PAGE_URLS[c.id]);
// ====================== IMAGE PLACEHOLDER ======================
// Striped placeholder with image icon + monospace label, per user request.
function ImgSlot({ label = "Imagem", radius = 8, dark = false, style, iconSize = 26, compact = false }) {
const fg = dark ? "rgba(255,255,255,.62)" : "#9aa3b5";
const stripe = dark ? "rgba(255,255,255,.05)" : "rgba(22,41,77,.045)";
const base = dark ? "rgba(255,255,255,.04)" : "#eef1f6";
return (
{!compact &&
{label}
}
);
}
// ====================== JGF LOGO (real brand image) ======================
function Logo({ scale = 1, white = false }) {
return (
);
}
// ====================== TOAST SYSTEM ======================
const ToastCtx = React.createContext(() => {});
function ToastProvider({ children }) {
const [toasts, setToasts] = React.useState([]);
const push = React.useCallback((msg, kind = "info") => {
const id = Math.random().toString(36).slice(2);
setToasts((t) => [...t, { id, msg, kind }]);
setTimeout(() => setToasts((t) => t.filter((x) => x.id !== id)), 2600);
}, []);
return (
{children}
{toasts.map((t) =>
{t.msg}
)}
);
}
const useToast = () => React.useContext(ToastCtx);
// ====================== PERSISTENT CART (shared across pages via localStorage) ======================
const CART_KEY = "jgf_cart_v1";
const WHATSAPP_NUMBER = "558173008306"; // <-- número que recebe os pedidos (DDI 55 + DDD 81)
function usePersistentCart() {
const [cart, setCart] = React.useState(() => {
try { return JSON.parse(localStorage.getItem(CART_KEY) || "[]"); } catch (e) { return []; }
});
React.useEffect(() => {
try { localStorage.setItem(CART_KEY, JSON.stringify(cart)); } catch (e) {}
}, [cart]);
// keep multiple open tabs / pages in sync
React.useEffect(() => {
const onStorage = (e) => {
if (e.key === CART_KEY) {
try { setCart(JSON.parse(e.newValue || "[]")); } catch (err) {}
}
};
window.addEventListener("storage", onStorage);
return () => window.removeEventListener("storage", onStorage);
}, []);
return [cart, setCart];
}
Object.assign(window, { CATEGORIES, VISIBLE_CATEGORIES, EQUIP_SUB, PAGE_URLS, ImgSlot, Logo, ToastProvider, useToast, usePersistentCart, WHATSAPP_NUMBER });