// catalog.jsx — Moliterni Motos: header, hero, catálogo com filtros function waLink(text) { return `https://wa.me/${STORE.whatsapp}?text=${encodeURIComponent(text)}`; } // marca reutilizável (foto da moto + wordmark) function Brand({ size = 38 }) { const bike = (window.__resources && window.__resources.logo) || "assets/moliterni-bike.png"; const strokeW = Math.max(0.5, size * 0.022); // engorda o texto p/ casar com a fonte do logo return ( Moliterni Motos ); } // ---------- Header ---------- function Header({ navigate, view }) { const go = (where) => navigate(where); return (
); } // ---------- Hero ---------- function Hero({ featured, onOpen, scrollToEstoque }) { if (!featured) return null; return (
Destaque da semana

Sua próxima
moto está aqui.

O maior estoque de motos usadas de Porto Alegre. Há mais de 10 anos realizando sonhos — atendimento com hora marcada, direto pelo WhatsApp.

{[["+10 anos", "realizando sonhos"], ["Maior estoque", "de usadas em POA"], ["Hora marcada", "sob agendamento"]].map(([a, b]) => (
{a}
{b}
))}
); } // ---------- Filtros + catálogo ---------- function Catalog({ vehicles, onOpen }) { const [cat, setCat] = React.useState("todos"); const [q, setQ] = React.useState(""); const [sort, setSort] = React.useState("recentes"); const maxPreco = React.useMemo(() => Math.max(20000, ...vehicles.map((v) => v.preco)), [vehicles]); const [precoMax, setPrecoMax] = React.useState(maxPreco); React.useEffect(() => { setPrecoMax(maxPreco); }, [maxPreco]); const [showVendidos, setShowVendidos] = React.useState(false); const filtered = React.useMemo(() => { let list = vehicles.filter((v) => { if (cat !== "todos" && v.categoria !== cat) return false; if (!showVendidos && v.status === "vendido") return false; if (v.preco > precoMax) return false; if (q.trim()) { const hay = (v.marca + " " + v.modelo + " " + v.cor + " " + v.ano + " " + segLabel(v.categoria)).toLowerCase(); if (!hay.includes(q.trim().toLowerCase())) return false; } return true; }); const by = { recentes: (a, b) => b.createdAt - a.createdAt, menor: (a, b) => a.preco - b.preco, maior: (a, b) => b.preco - a.preco, km: (a, b) => a.km - b.km, ano: (a, b) => b.ano - a.ano, }[sort]; return [...list].sort(by); }, [vehicles, cat, q, sort, precoMax, showVendidos]); const cats = [{ id: "todos", label: "Todas" }, ...SEGMENTOS]; return (

Estoque

{filtered.length} {filtered.length === 1 ? "moto disponível" : "motos disponíveis"}

{cats.map((c) => ( ))}
{/* barra de filtros */}
setQ(e.target.value)} style={{ paddingLeft: 40 }} />
Preço até{formatBRL(precoMax)}
v.preco), 10000)} max={maxPreco} step={1000} value={precoMax} onChange={(e) => setPrecoMax(Number(e.target.value))} style={{ width: "100%", accentColor: "var(--accent)" }} />
{filtered.length === 0 ? (

Nenhuma moto encontrada com esses filtros.

) : (
{filtered.map((v) => )}
)}
); } Object.assign(window, { Header, Hero, Catalog, Brand, waLink });