// hero.jsx — Nexus landing hero with animated architecture constellation
const NEXUS_LOGO = (
NEXUS
);
// ── Constellation: animated architecture nodes + edges behind hero ──
const HeroConstellation = () => {
const canvasRef = React.useRef(null);
const [t, setT] = React.useState(0);
useRaf((sec) => setT(sec), true);
// Nodes laid out across a virtual 1200x700 field. Positions are percentages.
const nodes = [
{ id: 'payload', x: 18, y: 30, label: 'PAYLOAD', r: 7 },
{ id: 'keycloak', x: 14, y: 68, label: 'KEYCLOAK', r: 6 },
{ id: 'postgres', x: 32, y: 80, label: 'POSTGRES', r: 5 },
{ id: 'typesense', x: 50, y: 22, label: 'TYPESENSE', r: 6 },
{ id: 'rag', x: 48, y: 58, label: 'RAG', r: 5 },
{ id: 'mcp', x: 72, y: 38, label: 'MCP', r: 9, hub: true },
{ id: 'claude', x: 90, y: 20, label: 'CLAUDE', r: 5, agent: true },
{ id: 'cursor', x: 92, y: 50, label: 'CURSOR', r: 5, agent: true },
{ id: 'agent', x: 88, y: 78, label: 'AGENT', r: 5, agent: true },
];
const edges = [
['payload', 'typesense'],
['payload', 'postgres'],
['payload', 'keycloak'],
['typesense', 'rag'],
['rag', 'mcp'],
['typesense', 'mcp'],
['mcp', 'claude'],
['mcp', 'cursor'],
['mcp', 'agent'],
];
const find = (id) => nodes.find(n => n.id === id);
return (
{/* Grid */}
{Array.from({ length: 13 }).map((_, i) => (
))}
{Array.from({ length: 8 }).map((_, i) => (
))}
{/* Static edges */}
{edges.map(([a, b], i) => {
const na = find(a), nb = find(b);
const x1 = na.x * 12, y1 = na.y * 7;
const x2 = nb.x * 12, y2 = nb.y * 7;
return (
);
})}
{/* Flowing packets along edges */}
{edges.map(([a, b], i) => {
const na = find(a), nb = find(b);
const x1 = na.x * 12, y1 = na.y * 7;
const x2 = nb.x * 12, y2 = nb.y * 7;
const phase = ((t * 0.25 + i * 0.13) % 1);
const px = x1 + (x2 - x1) * phase;
const py = y1 + (y2 - y1) * phase;
return (
);
})}
{/* Nodes */}
{nodes.map((n) => {
const cx = n.x * 12, cy = n.y * 7;
const pulse = n.hub ? 1 + Math.sin(t * 2) * 0.08 : 1;
const r = n.r * pulse;
const fill = n.hub ? '#a1f75e' : n.agent ? '#0d0d0d' : '#0d0d0d';
const stroke = n.hub ? '#0d0d0d' : '#a1f75e';
return (
{n.hub && (
)}
{n.label}
);
})}
);
};
const Hero = () => {
const [mounted, setMounted] = React.useState(false);
React.useEffect(() => { setMounted(true); }, []);
const enter = (d = 0) => ({
opacity: mounted ? 1 : 0,
transform: mounted ? 'translateY(0)' : 'translateY(20px)',
transition: `opacity 900ms cubic-bezier(.2,.7,.2,1) ${d}ms, transform 900ms cubic-bezier(.2,.7,.2,1) ${d}ms`,
});
return (
{/* Constellation pushed to right half with mask + reduced opacity */}
{/* Left-side darkening for text legibility */}
{/* Bottom fade */}
{/* Nav */}
{/* Main content */}
Conocimiento corporativo, al alcance de tus agentes
Tu empresa sabe mucho.
Haz que la IA
lo sepa también.
Nexus centraliza la información y el conocimiento de tu organización — documentos, artículos, libros, taxonomías — los indexa, los estructura y los expone vía MCP a los agentes de IA que tu empresa ya usa.
{/* Bottom strip — live stats */}
● Multi-tenant
● OIDC / Keycloak
● Hybrid search + RAG
● MCP native
);
};
Object.assign(window, { Hero, NEXUS_LOGO });