// B&L ENGENHARIA — Página de Empreendimentos (portfólio completo) // Cada empreendimento: 2 fotos + ficha técnica. Filtros por Cidade e por Tipo. const EMPREENDIMENTOS = [ { id: "parque-lilases", name: "Parque Lilases", accent: "Lilases", construtora: "Ascen Construtora", tipo: "Comercial", tipologia: "Edifício comercial", city: "São Carlos / SP", year: "2024", area: "16.675,14 m²", projeto: "Hidrossanitário", metodo: "BIM", photos: [ { src: "assets/projetos/parque-lilases-1.png", pos: "50% 62%", alt: "Edifício Comercial Parque Lilases — vista aérea diurna" }, { src: "assets/projetos/parque-lilases-2.png", pos: "50% 35%", alt: "Edifício Comercial Parque Lilases — fachada ao entardecer" }, ], }, { id: "vox-corporate", name: "Vox Corporate", accent: "Corporate", construtora: "Enoch Construtora", tipo: "Comercial", tipologia: "Edifício comercial", city: "Ribeirão Preto / SP", area: "46.781,53 m²", projeto: "Hidrossanitário e Prevenção Contra Incêndio com SPK", metodo: "CAD", photos: [ { src: "assets/projetos/vox-corporate.jpg", pos: "50% 30%", alt: "Vox Corporate — fachada" }, { src: "assets/projetos/vox-corporate-2.jpg", pos: "50% 50%", alt: "Vox Corporate — ambiente corporativo interno" }, ], }, { id: "wyndham", name: "Hotel Wyndham", accent: "Wyndham", construtora: "Enoch Construtora", tipo: "Hotel", tipologia: "Hotel", city: "Ribeirão Preto / SP", area: "18.822,80 m²", projeto: "Hidrossanitário", metodo: "CAD", photos: [ { src: "assets/projetos/wyndham-1.jpeg", pos: "50% 40%", alt: "Hotel Wyndham — fachada ao entardecer" }, { src: "assets/projetos/wyndham-2.jpg", pos: "50% 50%", alt: "Hotel Wyndham — rooftop com piscina à noite" }, ], }, { id: "la-coruna", name: "Plaza La Coruña", accent: "Coruña", construtora: "Stéfani Nogueira", tipo: "Residencial", tipologia: "Edifício residencial", city: "Franca / SP", area: "15.568,39 m²", projeto: "Hidrossanitário e Prevenção Contra Incêndio", metodo: "CAD", photos: [ { src: "assets/projetos/la-coruna-1.jpg", pos: "50% 50%", alt: "Plaza La Coruña — vista aérea das torres" }, { src: "assets/projetos/la-coruna-2.avif", pos: "50% 50%", alt: "Plaza La Coruña — piscina com deck e vista" }, ], }, { id: "magnolia", name: "Magnólia", accent: "Magnólia", construtora: "Stéfani Nogueira", tipo: "Residencial", tipologia: "Edifício residencial", city: "Ribeirão Preto / SP", area: "21.136,10 m²", projeto: "Hidrossanitário e Prevenção Contra Incêndio", metodo: "CAD", photos: [ { src: "assets/projetos/magnolia-1.avif", pos: "50% 60%", alt: "Magnólia — fachada com identidade do empreendimento" }, { src: "assets/projetos/magnolia-2.avif", pos: "50% 50%", alt: "Magnólia — espaço gourmet com churrasqueira" }, ], }, { id: "high-redentora", name: "High Redentora", accent: "Redentora", construtora: "Stéfani Nogueira", tipo: "Residencial", tipologia: "Edifício residencial", city: "São José do Rio Preto / SP", area: "33.868,95 m²", projeto: "Hidrossanitário", metodo: "CAD", photos: [ { src: "assets/projetos/high-redentora-1.avif", pos: "50% 50%", alt: "High Redentora — torre única em vista aérea" }, { src: "assets/projetos/high-redentora-2.avif", pos: "50% 50%", alt: "High Redentora — salão com forro de madeira" }, ], }, { id: "outlet-santa-maria", name: "Outlet Santa Maria", accent: "Santa Maria", construtora: "Construtora Pereira Alvim", tipo: "Comercial", tipologia: "Shopping Center", city: "Ribeirão Preto / SP", year: "2022", area: "34.477,53 m²", projeto: "Hidrossanitário e Prevenção Contra Incêndio com Sprinklers (SPK)", metodo: "BIM", photos: [ { src: "assets/projetos/outlet-santa-maria.jpg", pos: "50% 55%", alt: "Outlet Santa Maria — acesso coberto" }, { src: "assets/projetos/outlet-santa-maria-2.jpeg", pos: "50% 50%", alt: "Outlet Santa Maria — vista aérea da fachada" }, ], }, { id: "high-business", name: "High Business", accent: "Business", construtora: "Ascen Construtora", tipo: "Comercial", tipologia: "Edifício comercial", city: "Franca / SP", year: "2019", area: "24.765,21 m²", projeto: "Hidrossanitário e Prevenção Contra Incêndio com Sprinklers (SPK)", metodo: "CAD", photos: [ { src: "assets/projetos/high-business-1.jpg", pos: "50% 50%", alt: "High Business — área corporativa interna" }, { src: "assets/projetos/high-business-2.png", pos: "50% 45%", alt: "High Business — fachada em vidro" }, ], }, { id: "das-artes", name: "Edifício das Artes", accent: "Artes", construtora: "Ascen Construtora", tipo: "Residencial", tipologia: "Edifício residencial", city: "Franca / SP", area: "17.981,43 m²", projeto: "Hidrossanitário e Prevenção Contra Incêndio", metodo: "BIM", photos: [ { src: "assets/projetos/das-artes-1.jpg", pos: "50% 50%", alt: "Edifício das Artes — living integrado" }, { src: "assets/projetos/das-artes-2.png", pos: "50% 35%", alt: "Edifício das Artes — fachada" }, ], }, { id: "villa-guaimbe", name: "Villa Guaimbê", accent: "Guaimbê", construtora: "Ascen Construtora", tipo: "Residencial", tipologia: "Edifício residencial", city: "Ribeirão Preto / SP", area: "17.777,92 m²", projeto: "Hidrossanitário e Prevenção Contra Incêndio", metodo: "BIM", photos: [ { src: "assets/projetos/villa-guaimbe-1.png", pos: "50% 45%", alt: "Villa Guaimbê — hall de entrada" }, { src: "assets/projetos/villa-guaimbe-2.png", pos: "50% 40%", alt: "Villa Guaimbê — fachada" }, ], }, { id: "ventisette", name: "Ventisette", accent: "Ventisette", construtora: "Ascen Construtora", tipo: "Residencial", tipologia: "Edifício residencial", city: "Franca / SP", area: "18.925,15 m²", projeto: "Hidrossanitário e Prevenção Contra Incêndio", metodo: "BIM", photos: [ { src: "assets/projetos/ventisette-1.jpg", pos: "50% 50%", alt: "Ventisette — living com vista" }, { src: "assets/projetos/ventisette-2.png", pos: "50% 35%", alt: "Ventisette — fachada ao entardecer" }, ], }, { id: "auge", name: "Auge", accent: "Auge", construtora: "Ascen Construtora", tipo: "Residencial", tipologia: "Edifício residencial", city: "Franca / SP", area: "18.892,12 m²", projeto: "Hidrossanitário e Prevenção Contra Incêndio", metodo: "BIM", photos: [ { src: "assets/projetos/auge-1.jpg", pos: "50% 50%", alt: "Auge — lobby de recepção" }, { src: "assets/projetos/auge-2.png", pos: "50% 40%", alt: "Auge — fachada iluminada" }, ], }, { id: "le-monde", name: "Le Monde", accent: "Monde", construtora: "Copema Construtora", tipo: "Residencial · Comercial", tipoClass: "comercial", tipos: ["Residencial", "Comercial"], tipologia: "Edifício residencial / comercial", city: "Ribeirão Preto / SP", area: "52.137,74 m²", projeto: "Hidrossanitário e Prevenção Contra Incêndio com Sprinkler (SPK)", metodo: "CAD", photos: [ { src: "assets/projetos/le-monde-1.webp", pos: "50% 45%", alt: "Le Monde — torre ao entardecer" }, { src: "assets/projetos/le-monde-2.webp", pos: "50% 45%", alt: "Le Monde — implantação diurna" }, ], }, { id: "quartier", name: "Quartier", accent: "Quartier", construtora: "Copema Construtora", tipo: "Comercial", tipologia: "Edifício comercial", city: "Ribeirão Preto / SP", area: "25.594,54 m²", projeto: "Hidrossanitário e Prevenção Contra Incêndio com Sprinkler (SPK)", metodo: "CAD", photos: [ { src: "assets/projetos/quartier-1.jpg", pos: "50% 50%", alt: "Quartier — lobby de recepção" }, { src: "assets/projetos/quartier-2.jpg", pos: "50% 35%", alt: "Quartier — fachada ao entardecer" }, ], }, { id: "les-alpes", name: "Les Alpes", accent: "Alpes", construtora: "Copema Construtora", tipo: "Residencial", tipologia: "Edifício residencial", nota: "Bellegard · Bellevue · Beaumont", city: "Ribeirão Preto / SP", area: "19.776,35 m²", projeto: "Hidrossanitário e Prevenção Contra Incêndio", metodo: "CAD", photos: [ { src: "assets/projetos/les-alpes-1.webp", pos: "50% 50%", alt: "Les Alpes — vista aérea do conjunto" }, { src: "assets/projetos/les-alpes-2.webp", pos: "50% 40%", alt: "Les Alpes — fachada à noite" }, ], }, { id: "grand-paysage", name: "Grand Paysage", accent: "Paysage", construtora: "Copema Construtora", tipo: "Residencial", tipologia: "Edifício residencial", city: "Campinas / SP", area: "14.492,09 m²", projeto: "Hidrossanitário e Prevenção Contra Incêndio", metodo: "CAD", photos: [ { src: "assets/projetos/grand-paysage-fachada.png", pos: "50% 50%", alt: "Grand Paysage — fachada" }, { src: "assets/projetos/grand-paysage-1.webp", pos: "50% 50%", alt: "Grand Paysage — lounge com sofás" }, ], }, ]; const TIPOS = ["Comercial", "Residencial", "Hotel", "Industrial"]; // Cidades derivadas dos dados, ordenadas por nº de empreendimentos. function citiesFromData(data) { const counts = {}; data.forEach((e) => { counts[e.city] = (counts[e.city] || 0) + 1; }); return Object.keys(counts).sort((a, b) => counts[b] - counts[a] || a.localeCompare(b)); } // Construtoras derivadas dos dados (apenas as informadas), ordenadas por nº de empreendimentos. function construtorasFromData(data) { const counts = {}; data.forEach((e) => { if (e.construtora) counts[e.construtora] = (counts[e.construtora] || 0) + 1; }); return Object.keys(counts).sort((a, b) => counts[b] - counts[a] || a.localeCompare(b)); } function NameWithAccent({ name, accent }) { if (!accent || !name.includes(accent)) return {name}; const i = name.lastIndexOf(accent); return ( {name.slice(0, i)} {accent} {name.slice(i + accent.length)} ); } function FichaRow({ k, children }) { return (
{k} {children}
); } function EmpCard({ e, n }) { const [primary, secondary] = e.photos; return (
№ {String(n).padStart(2, "0")} {e.tipo}

{e.city}
{primary ? ( {primary.alt} ) : ( )} {e.year && {e.year}}
{secondary ? ( {secondary.alt} ) : ( )}
{e.construtora && {e.construtora}} {e.tipologia} {e.nota && {e.nota}} {e.area} {e.projeto} {e.metodo === "BIM" ? (BIM) : (e.metodo || "—")}
); } function FilterGroup({ label, options, value, onChange, allLabel }) { const active = value !== "Todos"; return (
{label}
); } function EmpreendimentosPage() { const [cidade, setCidade] = React.useState("Todos"); const [tipo, setTipo] = React.useState("Todos"); const [construtora, setConstrutora] = React.useState("Todos"); const cities = React.useMemo(() => citiesFromData(EMPREENDIMENTOS), []); const construtoras = React.useMemo(() => construtorasFromData(EMPREENDIMENTOS), []); const filtered = EMPREENDIMENTOS.filter( (e) => (cidade === "Todos" || e.city === cidade) && (tipo === "Todos" || (e.tipos || [e.tipo]).includes(tipo)) && (construtora === "Todos" || e.construtora === construtora) ); return (