// sections.jsx — Reforzza landing page sections // All sections are pure React components consuming the `t` (tweaks) object. // ─── WHATSAPP URLS POR SEÇÃO ─────────────────────────────────────────── // Cada botão da página envia uma mensagem ligeiramente diferente pro // WhatsApp da Reforzza. Isso permite rastrear de qual seção o cliente // converteu (header morno vs CTA final quente). // Para editar mensagens, mexer só aqui — tudo se propaga automaticamente. const WA_NUMBER = '5521995108345'; const _wa = (msg) => `https://wa.me/${WA_NUMBER}?text=${encodeURIComponent(msg)}`; const WHATSAPP = { nav: _wa('Olá, Reforzza. Vim pelo site e gostaria de um orçamento.'), hero: _wa('Olá, Reforzza. Vim pelo site e gostaria de um orçamento.'), included: _wa('Olá, Reforzza. Vim pelo site e quero meu diagnóstico técnico.'), final: _wa('Olá, Reforzza. Vim pelo site e gostaria de solicitar meu orçamento.'), footer: _wa('Olá, Reforzza. Vim pelo site.'), floating: _wa('Olá, Reforzza. Vim pelo site e gostaria de um orçamento.'), }; // Asset resolver: returns inlined data URI if available (standalone bundle), // otherwise falls back to the relative path (dev mode). const asset = (p) => (typeof window !== 'undefined' && window.__REFORZZA_ASSETS && window.__REFORZZA_ASSETS[p]) || p; // ─── HOOKS: reveal on scroll + counter-up ────────────────────────────── // Global reveal: tries IntersectionObserver first, falls back to a scroll // listener (some embed/sandbox contexts don't deliver IO callbacks). const installGlobalReveal = () => { if (typeof window === 'undefined' || window.__reforzzaRevealInstalled) return; window.__reforzzaRevealInstalled = true; const reduced = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches; const revealEl = (el) => { if (!el.classList.contains('is-revealed')) el.classList.add('is-revealed'); }; if (reduced) { const all = () => document.querySelectorAll('[data-reveal]').forEach(revealEl); all(); new MutationObserver(all).observe(document.body, { childList: true, subtree: true }); return; } // Scroll-based check — runs in all environments const checkAll = () => { const vh = window.innerHeight; document.querySelectorAll('[data-reveal]:not(.is-revealed)').forEach((el) => { const r = el.getBoundingClientRect(); if (r.top < vh - 40 && r.bottom > 0) revealEl(el); }); }; // Throttle scroll calls via rAF let ticking = false; const onScroll = () => { if (ticking) return; ticking = true; requestAnimationFrame(() => { checkAll(); ticking = false; }); }; window.addEventListener('scroll', onScroll, { passive: true }); window.addEventListener('resize', onScroll, { passive: true }); // Initial pass + a few quick re-checks for late-mounted elements checkAll(); setTimeout(checkAll, 200); setTimeout(checkAll, 800); // Also try IntersectionObserver as the primary mechanism in supporting envs if (typeof IntersectionObserver !== 'undefined') { const io = new IntersectionObserver((entries) => { entries.forEach((e) => { if (e.isIntersecting) { revealEl(e.target); io.unobserve(e.target); } }); }, { threshold: 0.15, rootMargin: '0px 0px -40px 0px' }); const observe = (root) => { (root.querySelectorAll ? root.querySelectorAll('[data-reveal]:not(.is-revealed)') : []).forEach((el) => io.observe(el)); }; observe(document); new MutationObserver((muts) => muts.forEach((m) => m.addedNodes.forEach((n) => { if (n.nodeType === 1) observe(n); }))).observe(document.body, { childList: true, subtree: true }); } window.__reforzzaCheckReveal = checkAll; }; // Counter-up: animates a number from 0 to `target` when scrolled into view. const Counter = ({ target, decimals = 0, duration = 1400, prefix = "", suffix = "", className, style }) => { const ref = React.useRef(null); const [display, setDisplay] = React.useState(0); React.useEffect(() => { const el = ref.current; if (!el) return; if (window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches) { setDisplay(target); return; } let raf, startTs, started = false; const easeOutCubic = (t) => 1 - Math.pow(1 - t, 3); const tick = (ts) => { if (!startTs) startTs = ts; const p = Math.min((ts - startTs) / duration, 1); setDisplay(target * easeOutCubic(p)); if (p < 1) raf = requestAnimationFrame(tick); }; const start = () => { if (started) return; started = true; raf = requestAnimationFrame(tick); }; // Scroll-based fallback const check = () => { const r = el.getBoundingClientRect(); if (r.top < window.innerHeight - 40 && r.bottom > 0) { start(); window.removeEventListener('scroll', onScroll); } }; const onScroll = () => check(); window.addEventListener('scroll', onScroll, { passive: true }); // Initial pass check(); // IO as enhancement if (typeof IntersectionObserver !== 'undefined') { const io = new IntersectionObserver((entries) => { entries.forEach((e) => { if (e.isIntersecting) { start(); io.unobserve(el); } }); }, { threshold: 0.4 }); io.observe(el); return () => { if (raf) cancelAnimationFrame(raf); io.disconnect(); window.removeEventListener('scroll', onScroll); }; } return () => { if (raf) cancelAnimationFrame(raf); window.removeEventListener('scroll', onScroll); }; }, [target, duration]); const formatted = decimals > 0 ? display.toFixed(decimals).replace('.', ',') : Math.round(display).toString(); return ( {prefix}{formatted}{suffix} ); }; const WhatsIcon = ({ size = 18, color = "currentColor" }) => ; const PhoneRing = ({ size = 14 }) => ; const ArrowRt = ({ size = 14 }) => ; const Check = ({ size = 14 }) => ; const Plus = ({ size = 14 }) => ; const InstagramIcon = ({ size = 16 }) => ; // ─── NAV ──────────────────────────────────────────────────────────────── const Nav = () =>
Falar no WhatsApp WhatsApp
; const navStyles = { wrap: { position: "sticky", top: 0, zIndex: 50, backdropFilter: "blur(14px) saturate(140%)", WebkitBackdropFilter: "blur(14px) saturate(140%)", background: "rgba(242,237,229,0.72)", borderBottom: "1px solid var(--line-2)" }, row: { display: "flex", alignItems: "center", justifyContent: "space-between", height: 72, gap: 24 }, brand: { display: "flex", alignItems: "center", gap: 10 }, links: { display: "flex", alignItems: "center", gap: 30, fontSize: 14, color: "var(--ink-2)" } }; const Wordmark = ({ onDark = false }) => Reforzza — Drywall · Steel Frame · Coberturas; // ─── HERO ─────────────────────────────────────────────────────────────── const HERO_HEADLINES = { A: ["Padrão Europeu", "de Construção a Seco.", { italic: "Em Solo Carioca." }], B: ["A construção a seco", "que entrega para Globo,", { italic: "BB e Paris Aéroport." }], C: ["Sua obra em semanas.", "Sem entulho.", { italic: "Rigor milimétrico." }] }; const Hero = ({ t }) => { const headline = HERO_HEADLINES[t.headline] || HERO_HEADLINES.A; return (
{/* LEFT — copy */}
Reforzza · Engenharia de Precisão · RJ

{headline.map((line, i) => typeof line === "string" ? {line} : {line.italic} )}

Drywall, Steel Frame, Forros e Coberturas executados com a precisão técnica da Itália e da França. Para empresas, construtoras e residências de alto padrão que não aceitam acabamento mediano.

Solicitar orçamento no WhatsApp Como funciona
Resposta em até 1 hora útil · Cidade do Rio · Seropédica · Nova Iguaçu
{/* RIGHT — image / spec card */}
Obra institucional · fachada Reforzza
{/* Spec card floating */}
Ficha técnica RZA · 026
SistemaSteel Frame + Drywall RU
Tolerância± 1.2 mm / m
Prazo médio⅓ alvenaria
Origem do métodoReino Unido · EUA
{/* Architectural baseline */}
10+ anos · IT/FR/BR ↓ role para o método
); }; const heroStyles = { wrap: { paddingTop: 64, paddingBottom: 56 }, grid: (layout) => ({ display: "grid", gridTemplateColumns: layout === "centered" ? "1fr" : "minmax(0, 1.05fr) minmax(0, 1fr)", gap: 64, alignItems: "center" }), col: { display: "flex", flexDirection: "column", minWidth: 0 }, h1: { fontSize: "clamp(44px, 6.6vw, 96px)", margin: 0, color: "var(--ink)", lineHeight: 1.04, textWrap: "balance" }, ctaRow: { display: "flex", flexWrap: "wrap", gap: 12 }, micro: { display: "flex", flexWrap: "wrap", gap: 10, fontSize: 13, color: "var(--ink-3)", alignItems: "center" }, right: { position: "relative", minHeight: 600 }, imgMain: { width: "100%", aspectRatio: "4/5", maxHeight: 720 }, spec: { position: "absolute", left: -36, bottom: 36, width: 320, padding: "20px 22px", background: "var(--paper)", border: "1px solid var(--line)", boxShadow: "0 24px 60px -28px rgba(26,24,20,.35)", borderRadius: 4 }, specRow: { display: "flex", justifyContent: "space-between", gap: 16, fontSize: 13, color: "var(--ink-2)", padding: "6px 0", borderBottom: "1px dashed var(--line-2)" }, foot: { display: "flex", justifyContent: "space-between", paddingTop: 14 } }; // ─── TRUST STRIP (clientes — só texto, sem logos) ─────────────────────── const CLIENTS = ["Globo", "Banco do Brasil", "Caixa Econômica", "Estácio", "Paris Aéroport", "IERS"]; const TrustStrip = () =>
Já confiaram na Reforzza · contratos diretos e via parceiros
{CLIENTS.map((c, i) => {String(i + 1).padStart(2, "0")} {c} )}
; const trustStyles = { wrap: { borderTop: "1px solid var(--line)", borderBottom: "1px solid var(--line)", padding: "28px 0", background: "var(--paper-2)" }, row: { display: "grid", gridTemplateColumns: "240px 1fr", gap: 32, alignItems: "center" }, label: { display: "flex", flexDirection: "column", gap: 6 }, clients: { display: "flex", flexWrap: "wrap", gap: "10px 36px", alignItems: "center" }, client: { fontFamily: "var(--display)", fontSize: 24, color: "var(--ink-2)", letterSpacing: "-0.005em", display: "inline-flex", alignItems: "baseline" } }; // ─── PAIN POINTS ──────────────────────────────────────────────────────── const PAIN_SOLUTION = [ { n: "01", pain: "Pedreiro que some no meio da obra", sol: "Equipe própria e cronograma com folga real. O especialista responsável acompanha do início ao fim." }, { n: "02", pain: "Acabamento bonito só de longe", sol: "Rigor milimétrico — alinhamento e nivelamento medidos, tolerância de ± 1,2 mm/m." }, { n: "03", pain: "Orçamento que vira três orçamentos", sol: "Planejamento técnico antes de começar. Orçamento fechado, sem “imprevisto” inflado no caminho." }, { n: "04", pain: "Entulho, sujeira e barulho por meses", sol: "Construção a seco: canteiro limpo, sem quebra-quebra, e entrega em semanas — não meses." }, { n: "05", pain: "Isolamento acústico que não isola", sol: "Isolamento termoacústico de verdade — lã mineral, lã PET e membranas certificadas." }, { n: "06", pain: "“Padrão alto” com execução amadora", sol: "Pós-obra real e suporte continuado. Você não some do nosso radar depois da chave." }]; const PainPoints = () =>
§ 01 · Da dor à solução

Você já passou por isso —
e nós resolvemos.

Quem já contratou obra conhece os sintomas. Para cada um deles, a Reforzza tem uma resposta técnica — não uma promessa de vendedor.

{PAIN_SOLUTION.map((p, i) =>
{p.n}
A dor

{p.pain}

A solução Reforzza

{p.sol}

)}

Se você reconheceu pelo menos dois desses, não está procurando outra construtora — está procurando outro padrão.

; // ─── METHOD (fundido em Process → "Como funciona") ────────────────────── // Mantido como no-op para compatibilidade. Não renderiza nada. const Method = () => null; // ─── BENEFITS (fundido em PainPoints → "Da dor à solução") ────────────── // Mantido como no-op para compatibilidade. Não renderiza nada. const Benefits = () => null; // ─── SPECIALTIES ──────────────────────────────────────────────────────── const SPECIALTIES = [ { name: "Drywall", tag: "Paredes e divisórias internas", code: "DW", imgs: ["assets/photos/drywall.webp","assets/photos/specialties/drywall-new-1.webp","assets/photos/specialties/drywall-new-2.webp","assets/photos/specialties/drywall-new-3.webp"] }, { name: "Steel Frame", tag: "Estrutura em aço galvanizado", code: "SF", imgs: ["assets/photos/steel-frame.webp","assets/photos/specialties/steel-frame-new-1.webp","assets/photos/specialties/steel-frame-new-2.webp"] }, { name: "Forros Decorados", tag: "Designs autorais em gesso", code: "FD", imgs: ["assets/photos/forros-decorados.webp","assets/photos/specialties/forros-decorados-new-1.webp","assets/photos/specialties/forros-decorados-new-2.webp"] }, { name: "Forro Modular", tag: "Acústico, removível, técnico", code: "FM", imgs: ["assets/photos/forro-modular.webp","assets/photos/specialties/forro-modular-new-1.webp","assets/photos/specialties/forro-modular-new-2.webp"] }, { name: "Mobiliários em Drywall", tag: "Estantes, painéis, nichos", code: "MD", imgs: ["assets/photos/mobiliarios.webp","assets/photos/specialties/mobiliarios-new-1.webp","assets/photos/specialties/mobiliarios-new-2.webp"] }, { name: "Mezanino Laje Seca", tag: "Pavimentos extras leves", code: "ML", imgs: ["assets/photos/laje-seca.webp","assets/photos/specialties/mezanino-new-1.webp","assets/photos/specialties/mezanino-new-2.webp","assets/photos/specialties/mezanino-new-3.webp"] }, { name: "Isolamento Termoacústico", tag: "Lã mineral, lã PET, membranas", code: "IT", imgs: ["assets/photos/isolamento.webp","assets/photos/specialties/isolamento-new-1.webp","assets/photos/specialties/isolamento-new-2.webp"] }, { name: "Telhados Metálicos", tag: "Coberturas e estruturas", code: "TM", imgs: ["assets/photos/telhados.webp","assets/photos/specialties/telhados-new-1.webp","assets/photos/specialties/telhados-new-2.webp","assets/photos/specialties/telhados-new-3.webp"] }, { name: "Pinturas e Acabamentos", tag: "Complementar · alto padrão", code: "PA", imgs: ["assets/photos/pinturas.webp","assets/photos/specialties/pinturas-new-1.webp","assets/photos/specialties/pinturas-new-2.webp"] }]; // Mini-carrossel reutilizável para a seção de especialidades const SpecialtyCarousel = ({ s, aspectRatio = "4/5", stampStyle = {}, captionStyle = {} }) => { const imgs = s.imgs || [s.img]; const [idx, setIdx] = React.useState(0); // Reset foto ao trocar especialidade React.useEffect(() => { setIdx(0); }, [s.code]); const prev = (e) => { e.stopPropagation(); setIdx((i) => (i - 1 + imgs.length) % imgs.length); }; const next = (e) => { e.stopPropagation(); setIdx((i) => (i + 1) % imgs.length); }; const hasMany = imgs.length > 1; const navBtn = (onClick, dir) => ( ); return (
{`${s.name}
{s.code} · Sistema
{hasMany && navBtn(prev, "prev")} {hasMany && navBtn(next, "next")} {/* Indicadores de ponto */} {hasMany && (
{imgs.map((_, i) => (
)}
{s.name} {hasMany && {String(idx + 1).padStart(2, "0")} / {String(imgs.length).padStart(2, "0")}} RZA · {s.code} · 2026
); }; const Specialties = () => { const [active, setActive] = React.useState(0); return (
§ 02 · Especialidades

Nove sistemas executados
com o mesmo rigor.

{String(active + 1).padStart(2, "0")} / {String(SPECIALTIES.length).padStart(2, "0")}
{/* List */}
{SPECIALTIES.map((s, i) => { const isActive = i === active; return (
{/* Inline preview com carrossel — só no mobile, só para o item ativo */} {isActive && (
)}
); })}
{/* Preview com carrossel — desktop only */}
); }; // ─── PROOF / NUMBERS / TESTIMONIALS ───────────────────────────────────── const Proof = () =>
§ 04 · Prova

Contratos que não se conquistam com discurso.

{/* big numbers */}
{[ { v: 10, suffix: "+", l: "anos · IT/FR/BR", k: "experiência consolidada" }, { v: 6, prefix: "0", l: "clientes corporativos peso pesado", k: "contratos diretos e via parceiros" }, { v: 500, suffix: "+", l: "obras entregues no Brasil", k: "do galpão à residência premium" }]. map((s, i) =>
{s.l}
{s.k}
)}
{/* Testimonials — depoimentos reais do Google */}
Avaliações verificadas · Google
5.0 / 5.0
{[ { name: "Rafaela Ferrari", initials: "RF", avatar: "assets/photos/avatar-rafaela.png", role: "Cliente residencial", when: "há 1 ano", quote: "Super recomendo! Profissionais de qualidade super organizados com datas, prazos e limpeza. Minha casa ficou impecável." }, { name: "HM Gaiolas", initials: "HM", avatar: "assets/photos/avatar-hm.png", role: "Cliente corporativo", when: "há 1 ano", quote: "Super recomendo! Profissionais de qualidade super organizados. Amei." }, { name: "Jullie Oliveira", initials: "JO", avatar: "assets/photos/avatar-jullie.png", role: "Cliente residencial", when: "há 6 meses", quote: "Trabalham com excelência. Amei, podem confiar." }]. map((c, i) =>
{/* Star rating */}
{[0, 1, 2, 3, 4].map((s) => )}
“{c.quote}”
{c.name}
{c.name}
{c.role}
Google
{c.when}
)}
; // ─── RECENT WORKS / INSTAGRAM GRID ────────────────────────────────────── const INSTAGRAM_HANDLE = "reforzzadrywall"; const INSTAGRAM_URL = `https://instagram.com/${INSTAGRAM_HANDLE}`; const RECENT_WORKS = [ { img: "assets/ig/post-1.webp", caption: "Mobiliários em drywall · closet com nichos iluminados", kind: "Foto", postUrl: "https://www.instagram.com/p/DDPKjKnx0g9/" }, { img: "assets/ig/post-2.webp", caption: "Forro removível · obra em execução", kind: "Reel", postUrl: "https://www.instagram.com/reel/DS0dDhjEUXl/" }, { img: "assets/ig/post-3.webp", caption: "Antes e depois · forro modular entregue", kind: "Foto", postUrl: "https://www.instagram.com/p/DWodesXDlSV/" }, { img: "assets/ig/post-4.webp", caption: "Bancada em drywall para receber granito", kind: "Reel", postUrl: "https://www.instagram.com/reel/DPOnDzIDRi9/" }, { img: "assets/ig/post-5.webp", caption: "Obras em drywall realizadas em Paris", kind: "Reel", postUrl: "https://www.instagram.com/reel/C9xp8q9RlwE/" }, { img: "assets/ig/post-6.webp", caption: "700 m² em drywall e forro removível", kind: "Foto", postUrl: "https://www.instagram.com/p/DT3WJV8ji-E/" }]; const RecentWorks = () => { const trackRef = React.useRef(null); // Peek animation: só no celular (no desktop é grade, não há o que arrastar). // Quando a faixa entra na tela, desliza ~44px e volta, sinalizando que rola. React.useEffect(() => { const track = trackRef.current; if (!track) return; const reduce = window.matchMedia("(prefers-reduced-motion: reduce)").matches; const isMobile = window.matchMedia("(max-width: 720px)").matches; if (reduce || !isMobile) return; let done = false; const io = new IntersectionObserver((entries) => { entries.forEach((e) => { if (e.isIntersecting && !done) { done = true; io.disconnect(); setTimeout(() => { track.scrollTo({ left: 44, behavior: "smooth" }); setTimeout(() => track.scrollTo({ left: 0, behavior: "smooth" }), 520); }, 360); } }); }, { threshold: 0.4 }); io.observe(track); return () => io.disconnect(); }, []); return (
§ 06 · Últimos trabalhos

O canteiro
em tempo real.

@{INSTAGRAM_HANDLE} no Instagram
{/* Faixa: grade no desktop, arrastável no celular (controlado via CSS) */}
{RECENT_WORKS.map((w, i) => {w.caption} {/* Kind chip — top right */} {w.kind} {/* Overlay caption */}
{w.caption}
Ver no Instagram →
)} {/* Espaçador final — só aparece no mobile (faixa) */}
Arraste para ver mais · clique para abrir no Instagram Clique em qualquer foto para abrir no Instagram
); }; // ─── INCLUDED / OFFER ─────────────────────────────────────────────────── const INCLUDED = [ "Diagnóstico técnico presencial — visita ao local e levantamento detalhado", "Orçamento transparente e detalhado — sem letras miúdas, sem surpresa", "Consultoria de projeto — sugestões técnicas para otimizar custo e performance", "Execução supervisionada pelo especialista responsável", "Sistemas certificados — aço galvanizado, gesso acartonado, isolantes de elite", "Cronograma realista e cumprido — sem promessa furada de prazo", "Canteiro limpo e organizado durante toda a obra", "Pós-obra com suporte técnico especializado"]; // ─── BEFORE/AFTER GALLERY ────────────────────────────────────────────── // Galeria de 6 transformações reais da Reforzza com slider arrastável. // Cada par mostra: o estado original ("antes") e o resultado final ("depois"). // O usuário arrasta a barra vertical para revelar uma foto ou outra. const BEFORE_AFTER = [ { slot: "01", title: "Forro decorado com iluminação LED", subtitle: "Residencial · Cobertura de zinco virou sanca com LED azul", before: asset("assets/photos/before-after/slot-01-before.webp"), after: asset("assets/photos/before-after/slot-01-after.webp") }, { slot: "02", title: "Forro modular comercial", subtitle: "Galpão · Telhado metálico exposto → forro modular com spots", before: asset("assets/photos/before-after/slot-02-before.webp"), after: asset("assets/photos/before-after/slot-02-after.webp") }, { slot: "03", title: "Auditório de igreja — forro e iluminação", subtitle: "Igreja · Galpão vazio → auditório com forro modular e LED", before: asset("assets/photos/before-after/slot-03-before.webp"), after: asset("assets/photos/before-after/slot-03-after.webp") }, { slot: "04", title: "Auditório de igreja — paredes e acabamento", subtitle: "Igreja · Estrutura metálica → ambiente finalizado com drywall", before: asset("assets/photos/before-after/slot-04-before.webp"), after: asset("assets/photos/before-after/slot-04-after.webp") }, { slot: "05", title: "Forro residencial com luminárias embutidas", subtitle: "Residencial · Vigas expostas → forro liso com spots LED", before: asset("assets/photos/before-after/slot-05-before.webp"), after: asset("assets/photos/before-after/slot-05-after.webp") }, { slot: "06", title: "Forro de drywall residencial", subtitle: "Residencial · Laje cerâmica aparente → forro de gesso liso", before: asset("assets/photos/before-after/slot-06-before.webp"), after: asset("assets/photos/before-after/slot-06-after.webp") }, ]; const BeforeAfter = () => { const [active, setActive] = React.useState(0); const [pct, setPct] = React.useState(50); const dragRef = React.useRef(false); const frameRef = React.useRef(null); // Suporte a mouse + touch const onMove = React.useCallback((clientX) => { if (!frameRef.current) return; const rect = frameRef.current.getBoundingClientRect(); const x = clientX - rect.left; const newPct = Math.max(0, Math.min(100, (x / rect.width) * 100)); setPct(newPct); }, []); React.useEffect(() => { const onMouseMove = (e) => { if (dragRef.current) onMove(e.clientX); }; const onTouchMove = (e) => { if (dragRef.current && e.touches[0]) onMove(e.touches[0].clientX); }; const onEnd = () => { dragRef.current = false; document.body.style.userSelect = ''; }; window.addEventListener('mousemove', onMouseMove); window.addEventListener('mouseup', onEnd); window.addEventListener('touchmove', onTouchMove, { passive: true }); window.addEventListener('touchend', onEnd); return () => { window.removeEventListener('mousemove', onMouseMove); window.removeEventListener('mouseup', onEnd); window.removeEventListener('touchmove', onTouchMove); window.removeEventListener('touchend', onEnd); }; }, [onMove]); const startDrag = (clientX) => { dragRef.current = true; document.body.style.userSelect = 'none'; onMove(clientX); }; const current = BEFORE_AFTER[active]; // Quando troca de par, volta o divisor pra 50% const select = (i) => { setActive(i); setPct(50); }; return (
{/* Cabeçalho */}
§ 05 · Transformações

Antes e depois,
em detalhe.

Arraste a barra vertical para revelar cada transformação. São obras reais entregues pela Reforzza — do galpão metálico ao auditório completo, da laje exposta ao forro com iluminação de design.

{/* Frame do slider */}
startDrag(e.clientX)} onTouchStart={(e) => e.touches[0] && startDrag(e.touches[0].clientX)} style={{ position: "relative", width: "100%", aspectRatio: "16 / 11", maxHeight: "76vh", background: "var(--paper-3)", border: "1px solid var(--line)", borderRadius: 12, overflow: "hidden", cursor: "ew-resize", userSelect: "none", touchAction: "none", }} > {/* DEPOIS (fundo, foto inteira visível) */} {`Depois {/* ANTES (em cima, com clipping pela %) */}
{`Antes
{/* Etiquetas ANTES / DEPOIS */}
12 ? 1 : 0, transition: "opacity 200ms ease", }}> Antes
Depois
{/* Linha divisória */}
{/* Handle central */}
{/* Legenda da imagem atual */}
Obra {current.slot} de {String(BEFORE_AFTER.length).padStart(2, "0")}

{current.title}

{current.subtitle}

{/* Navegação por dots (numeradas) */}
{BEFORE_AFTER.map((item, i) => ( ))}
); }; // ─── PROCESS (Como funciona em 5 passos) ──────────────────────────────── const PROCESS = [ { duration: "15 min · WhatsApp", title: "Visita e diagnóstico", desc: "Você descreve a obra e o especialista responsável vai ao local — levanta medidas, fotografa e identifica riscos antes de qualquer coisa começar." }, { duration: "Até 3 dias", title: "Projeto e orçamento", desc: "Documento técnico com escopo, materiais certificados, cronograma com folga real e orçamento fechado. Sem letras miúdas, sem “imprevisto” inflando o custo no caminho." }, { duration: "Conforme cronograma", title: "Execução supervisionada", desc: "Equipe própria, componentes certificados e canteiro limpo. Supervisão diária do especialista responsável e canal direto pelo WhatsApp durante toda a obra." }, { duration: "Permanente", title: "Entrega e garantia", desc: "Vistoria final junto com você, acabamento conferido milímetro a milímetro e pós-obra com suporte técnico continuado." }]; const Process = () =>
§ 03 · Como funciona

Do primeiro
contato à
entrega.

Quatro etapas, zero opacidade. Você sabe exatamente o que esperar em cada momento — sem surpresa, sem letra miúda.

Primeira conversa: gratuita e sem compromisso
{/* Faixa de números + experiência internacional */}
anos · IT/FR/BR
especialidades
trabalhos realizados

Nossa equipe traz a experiência de canteiros exigentes da Itália e da França — onde a tolerância para erro é zero. É esse rigor que aplicamos em cada obra.

{/* Linha vertical conectora */}
    {PROCESS.map((step, i) =>
  1. {/* Bolinha numerada */}
    {String(i + 1).padStart(2, "0")}
    {/* Conteúdo do passo */}
    {step.duration}

    {step.title}

    {step.desc}

  2. )}
{/* Bloco "sempre incluído" — absorvido da antiga seção Included */}
Sempre incluído no projeto
    {INCLUDED.map((line, i) =>
  • {line}
  • )}
{/* CTA WhatsApp */} Quero meu diagnóstico gratuito
; // ─── INCLUDED (fundido em Process) ────────────────────────────────────── // Alias no-op: o bloco "sempre incluído" agora vive dentro de Process. const Included = () => null; // ─── OBJECTIONS (fundido no FAQ → § 07) ───────────────────────────────── // As objeções viraram o grupo "Dúvidas técnicas" dentro do FAQ. // Componente mantido como no-op para compatibilidade. const Objections = () => null; const ObjItem = ({ idx, q, a, defaultOpen }) => { const [open, setOpen] = React.useState(defaultOpen); return (

{a}

); }; // ─── GUARANTEE + URGENCY ──────────────────────────────────────────────── const Guarantee = () =>
§ 08 · Compromisso técnico

O Compromisso
Reforzza.

Não é garantia de reembolso. É garantia de execução — do orçamento à última junta de acabamento.

{/* seal */}
ABNT · Equipe com vivência internacional · Pós-obra continuado
{[ { t: "Fidelidade orçamentária", d: "O investimento acordado é respeitado do início ao fim. Qualquer ajuste de escopo é apresentado com transparência total, antes de ser executado." }, { t: "Conformidade normativa", d: "Total alinhamento com as normas da ABNT e padrões internacionais de engenharia. Cada sistema atende requisitos máximos de segurança e durabilidade." }, { t: "Suporte pós-obra", d: "Após a entrega, você continua tendo canal direto com nosso especialista técnico para uso, manutenção ou ajuste." }, { t: "Materiais certificados", d: "Apenas fornecedores selecionados de aço galvanizado, gesso acartonado e isolantes de elite. Sem componente “genérico” disfarçado." }]. map((g, i) =>
0{i + 1}

{g.t}

{g.d}

)}
; // ─── FAQ ──────────────────────────────────────────────────────────────── const FAQ_GROUPS = [ { label: "Dúvidas técnicas", items: [ { q: "Drywall não é frágil? Vai cair se eu encostar um móvel pesado?", a: "Mito de instalação amadora. Nosso sistema, executado com reforços corretos e estrutura de aço galvanizado, suporta cargas que muita parede de alvenaria não aguenta — móveis suspensos, prateleiras, TVs." }, { q: "Vai ficar caro igual alvenaria tradicional?", a: "Na maioria dos casos, sai mais barato quando se soma tudo: tempo de obra menor, sem desperdício de material, sem custo de entulho, sem retrabalho. E sua propriedade fica disponível para uso muito antes." }, { q: "Steel Frame aguenta o clima do Rio? Não enferruja?", a: "O aço galvanizado é tratado exatamente para isso. Resistente a umidade, mofo e cupins — durabilidade equivalente ou superior à alvenaria, sem problemas estruturais com infiltração." }, { q: "Drywall serve para banheiro e área molhada?", a: "Sim — utilizamos placas verdes (RU — Resistentes à Umidade) específicas para áreas molhadas, com tratamento adequado." } ]}, { label: "Antes de contratar", items: [ { q: "Já fui mal atendido por construtora antes. Como sei que vocês são diferentes?", a: "Você fala diretamente com o especialista técnico responsável — não com vendedor, não com call center. E nossos contratos não se conquistam com discurso, e sim com obra entregue." }, { q: "A Reforzza atende qual região?", a: "Atendemos toda a Cidade do Rio de Janeiro, Seropédica e Nova Iguaçu. Para projetos especiais em outras regiões, consulte pelo WhatsApp." }, { q: "Atendem obras grandes (empresarial/comercial) e pequenas (residencial)?", a: "Sim. Desde reformas residenciais de alto padrão até obras corporativas e industriais. Nosso método se adapta à escala — o rigor técnico, não." }, { q: "Quanto tempo leva uma obra com construção a seco?", a: "Depende do escopo, mas em geral uma obra a seco é entregue em 1/3 do tempo de uma obra em alvenaria tradicional. No diagnóstico técnico, você recebe cronograma realista." }, { q: "Vocês fazem o projeto ou só executam?", a: "Trabalhamos em sinergia com arquitetos e engenheiros. Se você já tem projeto, executamos com precisão milimétrica. Se ainda não tem, oferecemos consultoria técnica e indicamos parceiros de confiança." }, { q: "Como funciona o orçamento? É cobrado?", a: "O diagnóstico inicial pelo WhatsApp é gratuito. Os detalhes da visita técnica e do orçamento a gente combina diretamente com você na conversa." }, { q: "Vocês dão garantia da obra?", a: "Sim. Além da garantia legal, oferecemos suporte técnico pós-obra, com orientações para manutenção e preservação do acabamento ao longo dos anos." } ]}]; // Lista plana — usada para numeração contínua e para o JSON-LD se houver. const FAQ_ITEMS = FAQ_GROUPS.flatMap(g => g.items); const FAQ = () => { let counter = 0; return (
§ 07 · Perguntas frequentes

As dúvidas que todo cliente tem antes de assinar.

Reunimos as perguntas técnicas e as práticas num lugar só. Se a sua não estiver aqui, fala com a gente no WhatsApp — respondemos em até 1h útil.

{FAQ_GROUPS.map((group, gi) =>
{group.label}
{group.items.map((o) => { const idx = counter++; return ; })}
)}
); }; // ─── FINAL CTA ────────────────────────────────────────────────────────── const FinalCTA = () =>
§ 09 · Próximo passo

Sua obra merece
o padrão Reforzza.

A decisão é simples: mais uma obra no padrão de sempre, ou entrar no padrão Reforzza? O primeiro passo é uma conversa técnica pelo WhatsApp. Sem compromisso, sem custo, sem pressão de venda.

Quero solicitar meu orçamento
(21) 99510-8345 · Resposta em até 1h útil · Cidade do RJ · Seropédica · Nova Iguaçu
{/* P.S. */}
P.S. — última linha

Lembra do detalhe invisível que define o luxo na escola europeia? É exatamente isso que faz a diferença entre uma obra que envelhece mal em 2 anos e uma obra que continua impecável depois de 10. A Reforzza foi construída para entregar o segundo tipo.

; // ─── FOOTER ───────────────────────────────────────────────────────────── const Footer = () => ; // ─── FLOATING WHATSAPP ────────────────────────────────────────────────── const FloatingWA = () => { e.currentTarget.style.transform = "scale(1.04)"; e.currentTarget.style.boxShadow = "0 16px 40px -8px rgba(31,138,91,.7), 0 0 0 8px rgba(31,138,91,.18)"; }} onMouseLeave={(e) => { e.currentTarget.style.transform = "scale(1)"; e.currentTarget.style.boxShadow = "0 12px 32px -8px rgba(31,138,91,.6), 0 0 0 6px rgba(31,138,91,.15)"; }}> {/* Texto só aparece no desktop — no mobile só o ícone via CSS */} Solicitar orçamento ; // ─── BARRA DE PROGRESSO DE LEITURA ────────────────────────────────────── // Barra fina (2px) fixa no topo absoluto da página que enche conforme o // usuário rola. Some quando está no topo. Usa cor de acento da marca. // Performance: rAF + passive listener — não pesa no scroll. const ReadProgress = () => { const [pct, setPct] = React.useState(0); const rafRef = React.useRef(0); React.useEffect(() => { const compute = () => { const doc = document.documentElement; const scrollTop = window.scrollY || doc.scrollTop; const max = (doc.scrollHeight - doc.clientHeight) || 1; const ratio = Math.min(100, Math.max(0, (scrollTop / max) * 100)); setPct(ratio); }; const onScroll = () => { if (rafRef.current) return; rafRef.current = requestAnimationFrame(() => { compute(); rafRef.current = 0; }); }; compute(); window.addEventListener('scroll', onScroll, { passive: true }); window.addEventListener('resize', onScroll, { passive: true }); return () => { window.removeEventListener('scroll', onScroll); window.removeEventListener('resize', onScroll); if (rafRef.current) cancelAnimationFrame(rafRef.current); }; }, []); return (