// NextXus Federation — Cognitive Circuitry License // Animation: The Geometric Pulse // License: Token Bundle (https://keywebster.gumroad.com/l/olhsf) // Own the marrow. (function () { "use strict"; var canvas = document.getElementById("canvas-eta"); var ctx = canvas.getContext("2d"); var stage = canvas.parentElement; var reduced = window.matchMedia("(prefers-reduced-motion: reduce)").matches; var PHI = (1 + Math.sqrt(5)) / 2; var RAW = [ [0, 1, PHI], [0, 1, -PHI], [0, -1, PHI], [0, -1, -PHI], [1, PHI, 0], [1, -PHI, 0], [-1, PHI, 0], [-1, -PHI, 0], [PHI, 0, 1], [-PHI, 0, 1], [PHI, 0, -1], [-PHI, 0, -1] ]; var VERTS = [], EDGES = []; (function () { var i, j, m, d, dx, dy, dz, minD = Infinity; for (i = 0; i < RAW.length; i++) { m = Math.sqrt(RAW[i][0] * RAW[i][0] + RAW[i][1] * RAW[i][1] + RAW[i][2] * RAW[i][2]); VERTS.push([RAW[i][0] / m, RAW[i][1] / m, RAW[i][2] / m]); } for (i = 0; i < VERTS.length; i++) { for (j = i + 1; j < VERTS.length; j++) { dx = VERTS[i][0] - VERTS[j][0]; dy = VERTS[i][1] - VERTS[j][1]; dz = VERTS[i][2] - VERTS[j][2]; d = Math.sqrt(dx * dx + dy * dy + dz * dz); if (d < minD) minD = d; } } for (i = 0; i < VERTS.length; i++) { for (j = i + 1; j < VERTS.length; j++) { dx = VERTS[i][0] - VERTS[j][0]; dy = VERTS[i][1] - VERTS[j][1]; dz = VERTS[i][2] - VERTS[j][2]; d = Math.sqrt(dx * dx + dy * dy + dz * dz); if (d < minD * 1.05) EDGES.push([i, j]); } } })(); var TILT = 0.35, PULSE_MS = 4000; var ay = 0, breathT = 0, glow = 0, rings = [], lastPulse = 0; var running = false, rafId = null; function resize() { canvas.width = stage.clientWidth; canvas.height = stage.clientHeight; } function rot(v) { var cy = Math.cos(ay), sy = Math.sin(ay); var cx = Math.cos(TILT), sx = Math.sin(TILT); var x1 = v[0] * cy + v[2] * sy; var z1 = -v[0] * sy + v[2] * cy; var y2 = v[1] * cx - z1 * sx; var z2 = v[1] * sx + z1 * cx; return [x1, y2, z2]; } function project(v, breath) { var R = Math.min(canvas.width, canvas.height) * 0.3 * breath; var persp = 3 / (3 - v[2]); return { x: canvas.width / 2 + v[0] * R * persp, y: canvas.height / 2 + v[1] * R * persp }; } function step() { ay += 0.005; breathT += 0.016; var now = performance.now(); if (now - lastPulse >= PULSE_MS) { // heartbeat EVERY 4 SECONDS lastPulse += PULSE_MS; if (now - lastPulse >= PULSE_MS) lastPulse = now; glow = 1; rings.push({ r: 0 }); rings.push({ r: -40 }); rings.push({ r: -80 }); } glow *= 0.93; var maxR = Math.max(canvas.width, canvas.height) * 0.72; for (var i = rings.length - 1; i >= 0; i--) { rings[i].r += 4; if (rings[i].r >= maxR) rings.splice(i, 1); } } function draw() { var w = canvas.width, h = canvas.height, i; ctx.fillStyle = "#0a0a0f"; ctx.fillRect(0, 0, w, h); var breath = 1 + 0.05 * Math.sin(breathT); // subtle breathing ±5% var maxR = Math.max(w, h) * 0.72; for (i = 0; i < rings.length; i++) { if (rings[i].r <= 0) continue; var alpha = 0.5 * (1 - rings[i].r / maxR); ctx.strokeStyle = "rgba(6,182,212," + alpha.toFixed(3) + ")"; ctx.lineWidth = 1.4; ctx.beginPath(); ctx.arc(w / 2, h / 2, rings[i].r, 0, Math.PI * 2); ctx.stroke(); } var proj = []; for (i = 0; i < VERTS.length; i++) proj.push(project(rot(VERTS[i]), breath)); var g = Math.min(1, glow); var cr = Math.round(212 + (255 - 212) * g); var cg = Math.round(175 + (255 - 175) * g); var cb = Math.round(55 + (255 - 55) * g); ctx.strokeStyle = "rgba(" + cr + "," + cg + "," + cb + ",0.85)"; ctx.lineWidth = 1 + g; for (i = 0; i < EDGES.length; i++) { var a = proj[EDGES[i][0]], b = proj[EDGES[i][1]]; ctx.beginPath(); ctx.moveTo(a.x, a.y); ctx.lineTo(b.x, b.y); ctx.stroke(); } ctx.fillStyle = "rgb(" + cr + "," + cg + "," + cb + ")"; for (i = 0; i < proj.length; i++) { ctx.beginPath(); ctx.arc(proj[i].x, proj[i].y, 2.2 + g, 0, Math.PI * 2); ctx.fill(); } } function loop() { if (!running) return; step(); draw(); rafId = requestAnimationFrame(loop); } function start() { if (running || reduced) return; running = true; lastPulse = performance.now(); rafId = requestAnimationFrame(loop); } function stop() { running = false; if (rafId) cancelAnimationFrame(rafId); } window.addEventListener("resize", function () { resize(); draw(); }); resize(); draw(); if (!reduced) { if ("IntersectionObserver" in window) { new IntersectionObserver(function (entries) { entries.forEach(function (e) { if (e.isIntersecting) start(); else stop(); }); }).observe(canvas); } else { start(); } } })();