// HeroCanvas.jsx — visualización animada de red/automatización para el hero // // mode="panel" → panel derecho (variante sober), con cards flotantes y red completa // mode="bg" → fondo completo (variante bold), más tenue, sin cards, no compite con el texto // // mouse: { x: 0..1, y: 0..1 } — posición normalizada para parallax function HeroCanvas({ mouse = { x: 0.5, y: 0.5 }, mode }) { const isBg = mode === 'bg'; const mx = mouse.x; const my = mouse.y; // Capas de parallax: offset proporcional a la profundidad // Cuanto mayor depth, más se mueve (aparece más "cerca") function layer(depth, extra) { return { position: 'absolute', inset: 0, transform: `translate(${(mx - 0.5) * -42 * depth}px, ${(my - 0.5) * -24 * depth}px)`, transition: 'transform 0.75s cubic-bezier(0.25, 0.1, 0.25, 1)', willChange: 'transform', ...extra, }; } // Cards de microcopy flotantes const cards = [ { label: 'Lead enriquecido', dot: 'green', pos: { top: '8%', left: '-1%' }, floatCls: 'f0', delay: '0s', }, { label: 'CRM conectado', dot: 'blue', pos: { top: '5%', left: '50%' }, floatCls: 'f2', delay: '1.3s', }, { label: 'IA clasificando', dot: 'processing', pos: { top: '37%', right: '-1%' }, floatCls: 'f1', delay: '0.7s', }, { label: 'Workflow ejecutado ✓', dot: 'green', pos: { top: '66%', left: '46%' }, floatCls: 'f0', delay: '2.1s', }, { label: 'Pipeline actualizado', dot: 'blue', pos: { top: '61%', left: '-1%' }, floatCls: 'f2', delay: '1.6s', }, ]; // Coordenadas de nodos en viewBox 0 0 400 500 // N-central (hub): 200, 250 // N periféricos distribuidos orgánicamente const nodesCx = [ { cx: 66, cy: 96 }, // N1 top-left { cx: 318, cy: 78 }, // N2 top-right { cx: 358, cy: 214 }, // N3 right { cx: 295, cy: 368 }, // N4 bottom-right { cx: 76, cy: 358 }, // N5 bottom-left { cx: 116, cy: 222 }, // N6 mid-left { cx: 248, cy: 148 }, // N7 top-center-right (hub secundario) ]; // Paths de cables (hilos de conexión) const wires = [ 'M66,96 C116,146 156,200 200,250', 'M318,78 C284,132 248,188 200,250', 'M358,214 C306,230 258,242 200,250', 'M200,250 C232,285 262,325 295,368', 'M200,250 C168,288 128,325 76,358', 'M116,222 C148,236 174,244 200,250', 'M200,250 C212,196 228,168 248,148', // hub secundario 'M248,148 C282,112 300,94 318,78', // hub→N2 ]; // Pulsos que viajan por los cables (animados) const pulses = [ { d: 'M66,96 C116,146 156,200 200,250', cls: 'hot', id: 1 }, { d: 'M318,78 C284,132 248,188 200,250', cls: 'hot', id: 2 }, { d: 'M358,214 C306,230 258,242 200,250', cls: 'cool', id: 3 }, { d: 'M200,250 C232,285 262,325 295,368', cls: 'hot', id: 4 }, { d: 'M200,250 C168,288 128,325 76,358', cls: 'cool', id: 5 }, { d: 'M200,250 C212,196 228,168 248,148', cls: 'hot', id: 6 }, ]; return (
{/* Capa 1 — glow ambiental (profundidad baja, se mueve poco) */}
{/* Grid técnico muy sutil */}
{/* Capa 2 — SVG de red (profundidad media) */}
{/* Capa 3 — cards flotantes (primer plano, solo en modo panel) */} {!isBg && (
{cards.map((c, i) => (
{c.label}
))}
)}
); } window.HeroCanvas = HeroCanvas;