import React, { useState, useEffect, useMemo } from 'react'; import { ArrowUpRight, ArrowRight, ArrowLeft, Menu, X, Lock, LogOut, Search, Filter, Mail, Phone, MapPin, Calendar, DollarSign, Home as HomeIcon, Briefcase, Trash2, ChevronDown, Check, TrendingUp, Users, FileText, Clock, Download, Eye } from 'lucide-react'; // ============================================================ // CONFIG // ============================================================ const STUDIO = { name: 'CasAmarela', suffix: 'Studio', tagline: 'Estúdio de arquitetura contemporânea', architect: 'Davi Porto', cau: 'A325590-5', city: 'Fortaleza, CE', email: 'contato@casamarela.studio', whatsapp: '+55 85 ', instagram: '@casamarela.studio', founded: '2026', }; const ADMIN_PASSWORD_DEFAULT = 'casamarela2026'; const STATUSES = [ { id: 'lead', label: 'Lead', color: '#8B7E6F' }, { id: 'qualificado', label: 'Qualificado', color: '#5D7B8A' }, { id: 'proposta', label: 'Proposta', color: '#B8893B' }, { id: 'negociacao', label: 'Negociação', color: '#A35C3A' }, { id: 'fechado', label: 'Fechado', color: '#4A6B47' }, { id: 'perdido', label: 'Perdido', color: '#9C9489' }, ]; const PROJECTS = [ { id: 1, name: 'Casa Vento', year: '2026', location: 'Aquiraz, CE', type: 'Residencial', area: '320 m²', description: 'Uma residência que respira. Pátios internos, ventilação cruzada e materiais nativos do litoral cearense compõem uma casa que dispensa ar-condicionado durante quase todo o ano.', palette: ['#D8B98E', '#8B6F4E', '#E8DDC8'], }, { id: 2, name: 'Pavilhão Oiticica', year: '2025', location: 'Fortaleza, CE', type: 'Cultural · TFG', area: '1.200 m²', description: 'Estudo conceitual de pavilhão cultural inspirado em Hélio Oiticica. Estrutura modular em concreto aparente com penetráveis de tecido tropical.', palette: ['#C9A961', '#1F1B17', '#F4EEE3'], }, { id: 3, name: 'Apartamento 808', year: '2025', location: 'Aldeota, Fortaleza', type: 'Reforma · Interiores', area: '110 m²', description: 'Reforma integral de apartamento dos anos 80. Derrubada de paredes, integração total da área social e marcenaria sob medida em freijó.', palette: ['#E8DDC8', '#B8893B', '#1F1B17'], }, { id: 4, name: 'Casa Lobão', year: '2026', location: 'Eusébio, CE', type: 'Residencial', area: '280 m²', description: 'Casa de campo com cobertura em telha cerâmica, varandas profundas e jardim interno. Homenagem à arquitetura nordestina contemporânea.', palette: ['#A35C3A', '#D8B98E', '#F4EEE3'], }, { id: 5, name: 'Café Caju', year: '2025', location: 'Praia de Iracema', type: 'Comercial', area: '85 m²', description: 'Cafeteria de bairro com balcão em madeira de demolição, piso cimentício e iluminação afetiva. Um lugar para ficar.', palette: ['#5D7B8A', '#E8DDC8', '#8B6F4E'], }, { id: 6, name: 'Galpão Maceió', year: '2024', location: 'Maceió, AL', type: 'Galeria · Acadêmico', area: '450 m²', description: 'Conversão de galpão portuário em espaço expositivo. Estrutura metálica preservada, intervenção mínima, máximo respeito à pré-existência.', palette: ['#1F1B17', '#9C9489', '#C9A961'], }, ]; // ============================================================ // STORAGE HELPERS // ============================================================ const storage = { async saveBriefing(data) { const id = `brief_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`; const record = { id, status: 'lead', createdAt: new Date().toISOString(), notes: '', ...data, }; try { await window.storage.set(`briefing:${id}`, JSON.stringify(record), true); return record; } catch (e) { console.error('save error', e); return null; } }, async getAllBriefings() { try { const list = await window.storage.list('briefing:', true); if (!list || !list.keys) return []; const records = await Promise.all( list.keys.map(async (k) => { try { const r = await window.storage.get(k, true); return r ? JSON.parse(r.value) : null; } catch { return null; } }) ); return records.filter(Boolean).sort((a, b) => new Date(b.createdAt) - new Date(a.createdAt) ); } catch (e) { console.error('list error', e); return []; } }, async updateBriefing(id, updates) { try { const existing = await window.storage.get(`briefing:${id}`, true); if (!existing) return null; const record = { ...JSON.parse(existing.value), ...updates }; await window.storage.set(`briefing:${id}`, JSON.stringify(record), true); return record; } catch (e) { console.error('update error', e); return null; } }, async deleteBriefing(id) { try { await window.storage.delete(`briefing:${id}`, true); return true; } catch (e) { console.error('delete error', e); return false; } }, async getPassword() { try { const r = await window.storage.get('admin_pwd', false); return r ? r.value : ADMIN_PASSWORD_DEFAULT; } catch { return ADMIN_PASSWORD_DEFAULT; } }, async setPassword(pwd) { try { await window.storage.set('admin_pwd', pwd, false); return true; } catch { return false; } }, }; // ============================================================ // FONT LOADER // ============================================================ function useGoogleFonts() { useEffect(() => { const id = 'casamarela-fonts'; if (document.getElementById(id)) return; const link = document.createElement('link'); link.id = id; link.rel = 'stylesheet'; link.href = 'https://fonts.googleapis.com/css2?family=Fraunces:ital,opsz,wght@0,9..144,300;0,9..144,400;0,9..144,500;0,9..144,600;1,9..144,300;1,9..144,400&family=DM+Sans:opsz,wght@9..40,300;9..40,400;9..40,500;9..40,600&display=swap'; document.head.appendChild(link); }, []); } // ============================================================ // SHARED UI // ============================================================ const Header = ({ page, setPage, adminAuthed }) => { const [open, setOpen] = useState(false); const links = [ { id: 'home', label: 'Início' }, { id: 'projects', label: 'Projetos' }, { id: 'studio', label: 'Estúdio' }, { id: 'briefing', label: 'Briefing' }, ]; const go = (id) => { setPage(id); setOpen(false); window.scrollTo({ top: 0, behavior: 'smooth' }); }; return (
{open && (
{links.map(l => ( ))}
)}
); }; const Footer = ({ setPage }) => ( ); // ============================================================ // PROJECT TILE (CSS-rendered architectural mood) // ============================================================ const ProjectTile = ({ project, onClick, large }) => ( ); // ============================================================ // HOME // ============================================================ const Home = ({ setPage, setSelectedProject }) => { const featured = PROJECTS.slice(0, 4); return (
{/* HERO */}
Est. 2026 — Fortaleza

— {STUDIO.tagline}

Espaços que respiram
o Brasil que você ama.

CasAmarela é um estúdio de arquitetura que projeta com vagar. Casas, comércios e reformas pensadas a partir do clima, da rotina e dos afetos de quem vai morar.

{/* MANIFESTO STRIP */}

— Manifesto

Acreditamos em arquitetura que não grita. Que envelhece com o lugar. Que cabe na vida real e ainda assim emociona.

{/* FEATURED PROJECTS */}

— Trabalho recente

Projetos selecionados

{featured.map((p, i) => (
{ setSelectedProject(p); setPage('projects'); }} />
))}
{/* PROCESS */}

— Como trabalhamos

Quatro tempos.

Cada projeto começa com escuta e termina com entrega. No meio, desenho, conversa e desenho de novo.

{[ ['01', 'Briefing', 'Conversa inicial. Entendimento do site, das pessoas e do que importa de fato.'], ['02', 'Estudo Preliminar', 'Primeiras propostas espaciais. Volumes, fluxos e a alma do projeto.'], ['03', 'Projeto Executivo', 'Detalhamento completo: arquitetura, complementares, marcenaria e iluminação.'], ['04', 'Acompanhamento', 'Presença em obra para que o projeto chegue inteiro à entrega final.'], ].map(([n, t, d]) => (
{n}

{t}

{d}

))}
{/* CTA */}

— Próximo passo

Tem um projeto em mente?

O briefing leva cerca de 8 minutos. Em até 3 dias úteis você recebe um retorno com proposta inicial e próximos passos.

); }; // ============================================================ // PROJECTS PAGE // ============================================================ const Projects = ({ selected, setSelected }) => { const [filter, setFilter] = useState('todos'); const types = ['todos', ...new Set(PROJECTS.map(p => p.type.split(' · ')[0]))]; const filtered = filter === 'todos' ? PROJECTS : PROJECTS.filter(p => p.type.startsWith(filter)); if (selected) { return (

— Projeto 0{selected.id}

{selected.name}

Local

{selected.location}

Ano

{selected.year}

Tipo

{selected.type}

Área

{selected.area}

— Sobre o projeto

{selected.description}

); } return (

— Portfólio

Trabalhos selecionados

Uma seleção de residências, comércios e estudos conceituais desenvolvidos entre 2024 e 2026.

{types.map(t => ( ))}
{filtered.map(p => ( setSelected(p)} /> ))}
); }; // ============================================================ // STUDIO (ABOUT) // ============================================================ const Studio = ({ setPage }) => (

— O Estúdio

Uma casa amarela no meio do Brasil.

"O nome veio antes do estúdio. Sempre achei que casa devia ter cor — aquela cor que se vê de longe e já avisa que tem alguém esperando."

— Davi Porto, fundador

— Davi Porto

Arquiteto · CAU {STUDIO.cau}

— Quem assina

Davi Porto

Arquiteto e urbanista formado pela UNINOVAFAPI em janeiro de 2026, com registro ativo no Conselho de Arquitetura e Urbanismo do Brasil sob o nº A325590-5.

Filho de Raiane Lobão e Fhabricio Porto, nasceu cercado de afetos que ensinaram cedo o valor da casa como abrigo. Funda o CasAmarela em 2026 com o desejo de fazer arquitetura que parta sempre de uma pergunta simples: como quem mora aqui quer viver?

"Projeto não é fórmula. É escuta."

{/* VALUES */}

— Princípios

No que acreditamos.

{[ ['Lugar', 'Cada projeto começa pelo terreno, pelo clima, pela rua. A arquitetura responde antes de propor.'], ['Tempo', 'Casas se fazem com vagar. Preferimos menos projetos por ano, com presença em cada decisão.'], ['Verdade', 'Materiais que envelhecem bem. Estruturas honestas. Detalhes que não escondem como foram feitos.'], ['Calor', 'Arquitetura brasileira não é estilo — é resposta ao sol, ao vento, à festa. Projetamos para isso.'], ['Detalhe', 'Uma maçaneta mal escolhida desfaz uma sala bem composta. Atenção do início ao fim.'], ['Diálogo', 'O cliente é coautor. O melhor projeto é aquele que o morador reconhece como dele desde o primeiro dia.'], ].map(([t, d]) => (

{t}

{d}

))}
); // ============================================================ // BRIEFING — multi-step form // ============================================================ const BRIEFING_STEPS = [ { id: 'contato', title: 'Quem é você', subtitle: 'Para começarmos a conversa', fields: [ { name: 'nome', label: 'Nome completo', type: 'text', required: true }, { name: 'email', label: 'E-mail', type: 'email', required: true }, { name: 'telefone', label: 'WhatsApp', type: 'tel', required: true, placeholder: '(85) 9 0000-0000' }, { name: 'comoConheceu', label: 'Como nos encontrou?', type: 'select', options: ['Instagram', 'Indicação', 'Google', 'Pinterest', 'Outro'] }, ], }, { id: 'projeto', title: 'O projeto', subtitle: 'Que tipo de trabalho você imagina', fields: [ { name: 'tipoProjeto', label: 'Tipo de projeto', type: 'radio', options: ['Residencial — nova construção', 'Residencial — reforma', 'Comercial', 'Design de interiores', 'Estudo / consultoria', 'Ainda não sei'] }, { name: 'situacaoLocal', label: 'Situação atual', type: 'radio', options: ['Já tenho o terreno/imóvel', 'Estou procurando', 'Imóvel alugado', 'Apenas estudo inicial'] }, { name: 'localizacao', label: 'Cidade e bairro', type: 'text', placeholder: 'Ex.: Aldeota, Fortaleza' }, ], }, { id: 'local', title: 'Sobre o local', subtitle: 'Mais detalhes do espaço', fields: [ { name: 'metragem', label: 'Metragem aproximada (m²)', type: 'text', placeholder: 'Ex.: 250' }, { name: 'caracteristicas', label: 'Características importantes do terreno/imóvel', type: 'textarea', placeholder: 'Vista, vizinhança, orientação solar, declive, árvores existentes, pavimentos...' }, { name: 'levantamentoExistente', label: 'Você já tem documentação técnica?', type: 'multi', options: ['Planta baixa', 'Levantamento topográfico', 'Sondagem do solo', 'Matrícula', 'Nenhum dos anteriores'] }, ], }, { id: 'programa', title: 'Programa de necessidades', subtitle: 'Como o espaço será habitado', fields: [ { name: 'usuarios', label: 'Quem irá usar o espaço?', type: 'textarea', placeholder: 'Ex.: casal, 2 filhos pequenos, 1 cachorro, recebem os pais nos fins de semana...' }, { name: 'comodos', label: 'Cômodos / ambientes desejados', type: 'multi', options: ['Sala de estar', 'Sala de jantar', 'Sala de TV/íntima', 'Cozinha aberta', 'Cozinha fechada', 'Lavanderia', 'Suíte master', 'Quartos secundários', 'Quarto de hóspedes', 'Home office', 'Closet', 'Lavabo', 'Varanda gourmet', 'Piscina', 'Jardim', 'Garagem', 'Área de serviço', 'Quarto de empregada', 'Espaço para hobby', 'Academia', 'Adega'] }, { name: 'rotina', label: 'Como é o dia a dia?', type: 'textarea', placeholder: 'Ex.: trabalho de casa, cozinha todos os dias, recebe amigos no fim de semana, gosta de plantas...' }, ], }, { id: 'estilo', title: 'Estilo & inspiração', subtitle: 'O que toca seus olhos', fields: [ { name: 'estilos', label: 'Estilos que conversam com você', type: 'multi', options: ['Brasileiro contemporâneo', 'Modernista (Niemeyer, Lina Bo Bardi)', 'Minimalista', 'Industrial', 'Rústico / orgânico', 'Mid-century', 'Mediterrâneo', 'Tropical', 'Wabi-sabi', 'Maximalista colorido'] }, { name: 'palavrasChave', label: '3 palavras que descrevem a casa dos seus sonhos', type: 'text', placeholder: 'Ex.: aberta, calma, brasileira' }, { name: 'amaOdeia', label: 'O que você ama / detesta em arquitetura', type: 'textarea', placeholder: 'Materiais, cores, sensações, lembranças...' }, { name: 'referencias', label: 'Tem links/fotos de referência?', type: 'textarea', placeholder: 'Cole aqui links de Pinterest, Instagram ou descreva referências' }, ], }, { id: 'investimento', title: 'Investimento & prazo', subtitle: 'Para alinharmos expectativas', fields: [ { name: 'orcamento', label: 'Faixa de investimento (obra completa)', type: 'radio', options: ['Até R$ 200 mil', 'R$ 200 a 500 mil', 'R$ 500 mil a 1 milhão', 'R$ 1 a 3 milhões', 'Acima de R$ 3 milhões', 'Ainda em estudo'] }, { name: 'prazoIdeal', label: 'Quando gostaria de começar?', type: 'radio', options: ['Imediatamente', 'Em até 3 meses', 'Em até 6 meses', 'Ainda este ano', 'Sem pressa definida'] }, { name: 'consultouOutros', label: 'Já consultou outros profissionais?', type: 'radio', options: ['Sim, tenho propostas', 'Sim, mas sem proposta formal', 'Não, é o primeiro contato'] }, ], }, { id: 'final', title: 'Algo mais', subtitle: 'O que mais você gostaria de compartilhar', fields: [ { name: 'mensagem', label: 'Mensagem livre', type: 'textarea', placeholder: 'Datas importantes, expectativas particulares, qualquer coisa que ajude o início do projeto...' }, ], }, ]; const Briefing = ({ setPage }) => { const [step, setStep] = useState(0); const [data, setData] = useState({}); const [submitting, setSubmitting] = useState(false); const [done, setDone] = useState(false); const [errorMsg, setErrorMsg] = useState(''); const current = BRIEFING_STEPS[step]; const progress = ((step + 1) / BRIEFING_STEPS.length) * 100; const update = (name, value) => setData(d => ({ ...d, [name]: value })); const toggleMulti = (name, value) => { setData(d => { const cur = d[name] || []; return { ...d, [name]: cur.includes(value) ? cur.filter(v => v !== value) : [...cur, value] }; }); }; const isValid = () => { return current.fields.every(f => { if (!f.required) return true; const v = data[f.name]; return v && (typeof v === 'string' ? v.trim() : true); }); }; const handleNext = async () => { if (!isValid()) { setErrorMsg('Preencha os campos obrigatórios'); return; } setErrorMsg(''); if (step < BRIEFING_STEPS.length - 1) { setStep(step + 1); window.scrollTo({ top: 0, behavior: 'smooth' }); } else { setSubmitting(true); const result = await storage.saveBriefing(data); setSubmitting(false); if (result) setDone(true); else setErrorMsg('Não foi possível enviar. Tente novamente.'); } }; const handleBack = () => { if (step > 0) { setStep(step - 1); window.scrollTo({top:0,behavior:'smooth'}); } }; if (done) { return (

— Mensagem recebida

Obrigado, {(data.nome || '').split(' ')[0] || 'até logo'}.

Recebemos o seu briefing. Em até 3 dias úteis você terá um retorno do estúdio com primeiras impressões, perguntas e os próximos passos.

); } return (
{/* Progress */}

Etapa {step + 1} de {BRIEFING_STEPS.length}

{Math.round(progress)}%

{/* Title */}

— {current.subtitle}

{current.title}

{/* Fields */}
{current.fields.map(f => (
{f.type === 'text' || f.type === 'email' || f.type === 'tel' ? ( update(f.name, e.target.value)} placeholder={f.placeholder || ''} className="w-full bg-transparent border-b border-[#1F1B17]/20 py-3 font-dm text-[16px] text-[#1F1B17] placeholder:text-[#756A5C]/60 focus:outline-none focus:border-[#B8893B] transition-colors" /> ) : f.type === 'textarea' ? (