// 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" && (
setView("hub")} style={{
background: "transparent", border: "1px solid rgba(255,255,255,0.1)",
color: "#9ca3af", fontFamily: "inherit", fontSize: 11,
padding: "4px 10px", cursor: "pointer",
}}>← {t.nav.hub}
)}
{t.status}
|
{["pt", "en"].map((l) => (
setLang(l)} style={{
background: lang === l ? "rgba(255,255,255,0.08)" : "transparent",
border: "none", color: lang === l ? "#e6e7eb" : "#6b7280",
fontFamily: "inherit", fontSize: 10, padding: "4px 8px", cursor: "pointer",
textTransform: "uppercase",
}}>{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) => (
setSec(s.id)} style={{
textAlign: "left", border: "none", background: "transparent",
color: sec === s.id ? "#4ade80" : "#9ca3af",
fontFamily: "inherit", fontSize: 13, padding: "8px 0", cursor: "pointer",
display: "flex", alignItems: "center", gap: 10,
borderLeft: sec === s.id ? "2px solid #4ade80" : "2px solid transparent",
paddingLeft: 12,
}}>
$
{s.title}
))}
{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) => (
))}
);
}
if (id === "services") {
return (
{prompt}cat services.md
O que faço
{t.tech.services.map((s) => (
))}
);
}
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.cta1} →
{t.tech.contact.cta2} →
{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) => (
setSec(s.id)} style={{
border: sec === s.id ? "1px solid #f59e0b" : "1px solid rgba(255,255,255,0.1)",
background: sec === s.id ? "rgba(245,158,11,0.08)" : "transparent",
color: sec === s.id ? "#f59e0b" : "#9ca3af",
fontFamily: "inherit", fontSize: 11, padding: "8px 14px", cursor: "pointer",
}}>{s.label}
))}
{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) => (
setCat(c)} style={{
border: cat === c ? "1px solid #f59e0b" : "1px solid rgba(255,255,255,0.08)",
background: cat === c ? "#f59e0b" : "transparent",
color: cat === c ? "#0a0a0c" : "#9ca3af",
fontFamily: "inherit", fontSize: 10, padding: "5px 10px", cursor: "pointer",
letterSpacing: 0.5, textTransform: "uppercase",
}}>{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}
);
}
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 (
);
}
function V1ArteCommissions({ t }) {
return (
{t.arte.encomendas.lead}
{t.arte.encomendas.bullets.map((b, i) => (
0{i + 1}
{b}
))}
{t.arte.encomendas.cta} →
// 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 });