/* Portfolio view: filter chips + result grid. */ function Portfolio({ items, onOpen, onBack }) { const filters = ["Todos", "Casa", "Apartamento", "Terreno"]; const [active, setActive] = React.useState("Todos"); const shown = active === "Todos" ? items : items.filter(i => i.type === active); return (
Portfólio · {items.length} imóveis em Gurupi

Imóveis disponíveis

Casas, apartamentos e terrenos avaliados e documentados. Não achou o ideal? Me chama no WhatsApp que eu busco para você.

{filters.map(f => ( ))}
Falar com a Carina
{shown.map(it => )}
{shown.length === 0 && (
Nenhum imóvel nesta categoria no momento.
)}
); } /* Property detail: gallery + spec grid + sticky consultant card. */ function PropertyDetail({ item, onBack, onAll }) { const media = CARINA_LISTING_MEDIA(item); const images = media.filter(entry => entry.type === "image" && entry.url); const videos = media.filter(entry => entry.type === "video" && entry.url); const listingPhoto = CARINA_LISTING_IMAGE(item); const [activeImage, setActiveImage] = React.useState(listingPhoto); const pricePerM2 = item.type === "Terreno" ? null : CARINA_FMT(Math.round(item.price / parseInt(item.specs.find(s => /Área/.test(s[0]))?.[1] || 100))); const highlights = item.highlights?.length ? item.highlights : [ "Documentação 100% regularizada", "Avaliação justa de mercado", "Localização verificada na prática", "Acompanhamento até a assinatura", "Aceita financiamento bancário", "Visita agendada pelo WhatsApp" ]; const whatsMessage = window.CARINA_PROPERTY_WHATS_MESSAGE(item); return (
{item.tag}
{images.length > 1 && (
{images.slice(0, 10).map((image, index) => ( ))}
)}
{item.bairro} · {item.cidade} · {item.type}

{item.name}

{item.blurb}

{item.specs.map(([k, v]) => (
{k}
{v}
))}
{videos.length > 0 && (

Vídeos do imóvel

{videos.map((video, index) => (
))}
)}

O que faz desse imóvel uma boa escolha

{highlights.map(a => (
{a}
))}
); } function CatalogPage({ items, onOpen, onGo, onAll }) { const filters = ["Todos", ...Array.from(new Set(items.map(item => item.type).filter(Boolean)))]; const selected = new URLSearchParams(window.location.search); const [query, setQuery] = React.useState({ busca: selected.get("busca") || "", tipo: selected.get("tipo") || "", bairro: selected.get("bairro") || "", quartos: selected.get("quartos") || "", preco: selected.get("preco") || "" }); const active = query.tipo || "Todos"; React.useEffect(() => { const onFilters = (event) => setQuery({ busca: event.detail.busca || "", tipo: event.detail.tipo || "", bairro: event.detail.bairro || "", quartos: event.detail.quartos || "", preco: event.detail.preco || "" }); window.addEventListener("carina:filters", onFilters); return () => window.removeEventListener("carina:filters", onFilters); }, []); const shown = items.filter(item => { const search = query.busca.trim().toLowerCase(); const text = [item.name, item.type, item.bairro, item.cidade, item.description, item.blurb].join(" ").toLowerCase(); if (search && !text.includes(search)) return false; if (query.tipo && item.type !== query.tipo) return false; if (query.bairro && item.bairro !== query.bairro) return false; if (query.quartos && Number(item.bedrooms || 0) < Number(query.quartos)) return false; if (query.preco && Number(item.price || 0) > Number(query.preco)) return false; return true; }); return (
{filters.map(filter => ( ))}
{shown.map((it, index) => ( ))}
{shown.length === 0 && (
Nenhum imóvel encontrado nesta categoria.
)}