← Volver a la home
Cómo se hizo

El organigrama vivo.

La home de CyberSenseAI cuenta una sola idea — «un miembro más del equipo» — con una sola pieza central: un organigrama con física de muelles, dibujado a mano sobre canvas 2D, que crece con el scroll y al que las Personas IA se incorporan como nodos que se enganchan a los equipos. Esta guía documenta el concepto, la técnica y las decisiones.

01El concepto

El producto de CyberSenseAI no es un chatbot: es una Persona IA que ocupa un puesto en el organigrama, con rol, responsabilidades y objetivos. La forma más honesta de contarlo era enseñar el organigrama mismo — y hacer que el visitante viera, en cuatro capítulos de scroll, cómo una organización normal incorpora a sus primeros colaboradores digitales:

El grafo no es un vídeo ni una ilustración: es un sistema físico que se puede agarrar y arrastrar en cualquier momento. Y si nadie lo toca en los primeros segundos, un nodo se sacude solo — un empujón de cortesía que demuestra la física sin esperar permiso. La metáfora deja de ser metáfora cuando el organigrama responde a tu mano.

02Dirección visual

Claro corporativo cálido: marfil de papel de oficina, azul tinta de organigrama impreso y un coral que marca todo lo que es nuevo — las Personas IA. Nada de neones ni gradientes genéricos: la página debe resultar creíble para un CTO o un CISO, y el espectáculo se concentra en la física.

Marfil#F5F0E4
Azul tinta#14294E
Coral#F0563B
Papel#FFFDF6
Tinta suave#4D5C7C
Bricolage Grotesque
Display · titulares, cifras e iniciales de los nodos. Grotesca humanista con carácter, pesos 500–800.
Instrument Sans
Texto · párrafos, navegación y etiquetas del lienzo. Geométrica cálida, muy legible en tamaños pequeños.

La atmósfera se apoya en tres texturas discretas: un grano de papel (SVG feTurbulence en data-URI, multiplicado al 4,5 %), una retícula tenue enmascarada radialmente tras el grafo, y sombras largas y suaves en tarjetas que van ligeramente rotadas (−0,4° a 1,1°) para romper la rigidez del grid.

03La física, a mano

Sin librerías. El grafo es un integrador semi-implícito de Euler con dos substeps por frame y cuatro fuerzas: un muelle hacia el «sitio» que el layout asigna a cada nodo, muelles en las aristas jerárquicas, repulsión de corto alcance entre todos los pares y una gravedad suave que hace que el árbol cuelgue con naturalidad. Este es el corazón real del código de la home:

/* muelle hacia el sitio asignado + gravedad */
n.vx += (hx - n.x) * kk * dt;
n.vy += (hy - n.y) * kk * dt + G * dt * 10;

/* muelles de las aristas (padre ↔ hijo) */
f = (d - ar.resto) * kArista * dt;
n.vx += dx/d*f;  n.vy += dy/d*f;
m.vx -= dx/d*f;  m.vy -= dy/d*f;

/* repulsión de corto alcance, O(n²) con n≈17 */
if (d < lim){ f = (lim - d) * 26 * dt; … }

/* integración con amortiguación exponencial */
n.vx *= Math.exp(-2.6 * dt);
n.x  += n.vx * dt;

Los «sitios» no salen de un algoritmo de layout: están dirigidos artísticamente, nodo a nodo, en coordenadas relativas al viewport — así el árbol siempre compone bien a 1440 px y a 390 px. Cada sitio además respira con un par de senos desfasados, de modo que el organigrama nunca está del todo quieto.

Las aristas se dibujan como curvas cuadráticas con comba: el punto de control se desplaza en perpendicular y hacia abajo, y sobre esa misma curva se mueven los pulsos coral que viajan de los equipos a sus Personas IA:

/* comba perpendicular + un poco de “cuelgue” vertical */
var comba = Math.min(26, d * 0.14);
var cx = mx - dy/d*comba*0.35, cy = my + dx/d*comba*0.35 + comba*0.55;
ctx.quadraticCurveTo(cx, cy, b.x, b.y);

/* punto sobre la Bézier para el pulso viajero */
x = u*u*a.x + 2*u*t*cx + t*t*b.x;
Demo en vivo del mismo integrador — arrastra un nodo

04Scroll como guion

La escena es un contenedor position: sticky de 100 vh sobre el que fluyen cuatro tarjetas-capítulo. La etapa activa no depende de un observer con umbrales frágiles: se calcula de forma determinista desde la posición de scroll, así subir y bajar es siempre reversible:

/* etapa = nº de capítulos cuyo tope superó el 62 % de la pantalla */
var e = 0;
for (i = 0; i < topesPasos.length; i++)
  if (scrollY + innerHeight*0.62 >= topesPasos[i]) e = i + 1;
fijarEtapa(e);

fijarEtapa() hace un diff entre los nodos presentes y los que la etapa exige: los nuevos nacen escalonados (las Personas IA entran desde fuera del lienzo, a 220–340 px/s, y disparan una onda al engancharse); al retroceder, los sobrantes se encogen y se podan. El anillo XAIOS, la insignia de equipo híbrido y el desplazamiento del centro del grafo son valores-objetivo que se persiguen con interpolación exponencial — nada salta, todo llega.

05Rendimiento y respeto

DecisiónPor qué
Canvas 2D, no WebGL17 nodos y ~21 aristas no justifican shaders; el 2D con devicePixelRatio limitado a 2 mantiene 60 fps con un solo requestAnimationFrame.
Pausa fuera de vistaUn IntersectionObserver detiene el bucle cuando la escena sale del viewport y al ocultar la pestaña: coste cero en el resto de la página.
touch-action: pan-yEn móvil, el scroll vertical siempre le pertenece al navegador; el arrastre de nodos convive sin secuestrar la página.
prefers-reduced-motionSin vaivén, sin pulsos, sin escalonados: los nodos aparecen ya asentados (muelles casi críticos) y las revelaciones CSS se anulan. Todo el contenido vive en HTML semántico; el lienzo es decorativo (aria-hidden).
Un solo archivoCSS y JS inline; el único recurso externo son las dos familias de Google Fonts. Sin imágenes: todo es procedural.

06Lo que se descartó

07Pulido de la segunda pasada

Una revisión de peine fino sobre capturas reales cerró doce defectos. Los que cambian técnica o decisiones:

08Lupa final: la tercera pasada

La última revisión buscó los fallos que solo aparecen con la página en producción: pestañas en segundo plano, navegadores capados, móviles reales. Quince cierres: