// V1 — Split Hub // Hub com duas metades verticais (Tech / Arte) que se expandem no hover. // Tech: terminal verde-cyan · Arte: terminal âmbar quente. const V1_W = 1280; const V1_H = 800; function V1Site({ lang: outerLang, fullscreen }) { const [view, setView] = React.useState("hub"); // 'hub' | 'tech' | 'arte' const [lang, setLang] = React.useState(outerLang || "pt"); const t = window.SITE_CONTENT[lang]; return (
{/* persistent chrome */} {view === "hub" && } {view === "tech" && } {view === "arte" && }
); } function V1Chrome({ lang, setLang, view, setView, t }) { return (
M marcos.perdomo {view !== "hub" && ( )}
{t.status} |
{["pt", "en"].map((l) => ( ))}
); } function V1Hub({ t, setView }) { const [hover, setHover] = React.useState(null); // 'tech' | 'arte' | null const techW = hover === "tech" ? "62%" : hover === "arte" ? "38%" : "50%"; const arteW = hover === "arte" ? "62%" : hover === "tech" ? "38%" : "50%"; return (
{/* LEFT — TECH */}
setHover("tech")} onMouseLeave={() => setHover(null)} onClick={() => setView("tech")} style={{ width: techW, transition: "width 400ms cubic-bezier(.2,.7,.2,1)", position: "relative", cursor: "pointer", overflow: "hidden", background: "radial-gradient(80% 60% at 30% 40%, #0d1814 0%, #07090a 60%, #050608 100%)", borderRight: "1px solid rgba(74,222,128,0.15)", }} >
{/* RIGHT — ARTE */}
setHover("arte")} onMouseLeave={() => setHover(null)} onClick={() => setView("arte")} style={{ width: arteW, transition: "width 400ms cubic-bezier(.2,.7,.2,1)", position: "relative", cursor: "pointer", overflow: "hidden", background: "radial-gradient(80% 60% at 70% 40%, #1a120a 0%, #0a0805 60%, #050404 100%)", }} >
{/* center hairline & marker */}
×
{/* HUB top centered headline */}
{t.hub.kicker}
{t.nome}
{t.hub.lead}
); } function V1HubPanel({ side, accent, t, kicker, title, subtitle, cta, active, numerals }) { return (
{kicker}
{title.toLowerCase()}
{subtitle}
{/* faint ascii grid */}
{numerals.map((n, i) => ( {n}. ))}
{cta}
); } // ─── TECH VIEW ─────────────────────────────────────────────────── function V1Tech({ t, setView }) { const [sec, setSec] = React.useState("whoami"); return (
{/* Sidebar */}
// {t.hub.techTag}
{t.tech.title}
{t.tech.subtitle}
{t.tech.sections.map((s) => ( ))}
{t.location}
marcos@perdomo.dev
{/* Main */}
); } function V1TechSection({ id, t }) { const prompt = ~/tech $ ; if (id === "whoami") { return (
{prompt}whoami
{t.tech.intro}
{t.tech.whoami.map((line, i) => (
0{i + 1}{line}
))}
FORMAÇÃO / EDUCATION
{t.tech.education.map((e, i) => (
{e.d}
{e.t}
))}
); } if (id === "services") { return (
{prompt}cat services.md
O que faço
{t.tech.services.map((s) => (
{s.k}
{s.t}
{s.d}
))}
); } if (id === "stack") { return (
{prompt}cat stack.json
Stack
{t.tech.stack.map((s, i) => (
{s}
))}
); } if (id === "certs") { return (
{prompt}ls certifications/
{t.tech.certsCount}
{t.tech.certsNote}
{t.tech.certs.map((c, i) => (
{c}
))}
); } if (id === "contact") { return (
{prompt}./contact --start
{t.tech.contact.lead}
{t.tech.contact.email} · {t.location}
); } return null; } // ─── ARTE VIEW ─────────────────────────────────────────────────── function V1Arte({ t, setView }) { const [sec, setSec] = React.useState("galeria"); const [cat, setCat] = React.useState(t.arte.categorias[0]); return (
// {t.hub.arteTag}
{t.arte.title.toLowerCase()}
{t.arte.sections.map((s) => ( ))}
{t.arte.intro}
{sec === "galeria" && } {sec === "processo" && } {sec === "encomendas" && } {sec === "sobre" && }
); } function V1ArteGallery({ t, cat, setCat }) { const items = t.arte.works.filter((w) => cat === t.arte.categorias[0] || w.cat === cat); return (
{t.arte.categorias.map((c) => ( ))}
{items.map((w, i) => ( ))}
); } function V1ArteCard({ w, idx }) { // placeholder pattern based on category const pat = { "Aviação": "linear-gradient(135deg, #2c1810 0%, #4a2a18 50%, #1a0e08 100%)", "Aviation": "linear-gradient(135deg, #2c1810 0%, #4a2a18 50%, #1a0e08 100%)", "Militaria": "linear-gradient(135deg, #1f2410 0%, #3a3820 50%, #15170c 100%)", "Figura": "linear-gradient(135deg, #2a1818 0%, #4a2828 50%, #1a0f0f 100%)", "Figure": "linear-gradient(135deg, #2a1818 0%, #4a2828 50%, #1a0f0f 100%)", "3D Artístico": "linear-gradient(135deg, #181828 0%, #283058 50%, #0f0f1a 100%)", "3D Artistic": "linear-gradient(135deg, #181828 0%, #283058 50%, #0f0f1a 100%)", "3D Funcional": "linear-gradient(135deg, #1a1a1a 0%, #303030 50%, #0a0a0a 100%)", "3D Functional": "linear-gradient(135deg, #1a1a1a 0%, #303030 50%, #0a0a0a 100%)", }; return (
{/* simple silhouette glyph by category */}
{String(idx + 1).padStart(2, "0")}
{w.esc}
{w.year}
{w.t}
{w.cat}
); } function V1ArteProcess({ t }) { const steps = [ { n: "01", t: "Pesquisa", d: "Referências históricas, fotos do veículo real, cores e marcações." }, { n: "02", t: "Construção", d: "Montagem, ajustes finos, super-detalhamento e correções de escala." }, { n: "03", t: "Pintura", d: "Pré-shading, camadas de cor, lavagens, filtros e desgaste." }, { n: "04", t: "Acabamento", d: "Decais, pigmentos, fixação e base / diorama final." }, ]; return (
{steps.map((s) => (
{s.n}
{s.t}
{s.d}
))}
); } function V1ArteCommissions({ t }) { return (
{t.arte.encomendas.lead}
{t.arte.encomendas.bullets.map((b, i) => (
0{i + 1} {b}
))}
// GPPSD
Conselheiro do Grupo de Plastimodelismo e Pesquisa Santos Dumont — comunidade ativa há décadas, com participações em concursos nacionais e internacionais.
30 anos · Aviação militar · Militaria · Figuras · 3D
); } function V1ArteSobre({ t }) { return (
{t.arte.sobre.map((line, i) => (
0{i + 1} {line}
))}
); } Object.assign(window, { V1Site, V1_W, V1_H, V1Chrome, V1Hub, V1Tech });