// 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 */}
{NEXUS_LOGO} by Irontec
{/* 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.

Empezar con Nexus Ver arquitectura
{/* Bottom strip — live stats */}
  Multi-tenant
  OIDC / Keycloak
  Hybrid search + RAG
  MCP native
Scroll
); }; Object.assign(window, { Hero, NEXUS_LOGO });