import { useState, useEffect, useRef } from "react"; const FONT_URL = "https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600;700&display=swap"; // ── Terminal data cascade lines ─────────────────────────────────────────────── const TERMINAL_LINES = [ "INIT SEQUENCE 0x4F2A...", "AUTH TOKEN: ██████████████", "SCAN FREQ 847.221 MHz", "SECTOR [CLASSIFIED]", "NODE_ID NX-9912-DELTA", "TIMESTAMP 2025.03.06", "CLEARANCE LEVEL-OMEGA", "STATUS AUTHORIZED", "PAYLOAD ENCRYPTED", "UPLINK ACTIVE", "SIGNAL ████░░░░ 61%", "VERIFY SHA256:c0d3f", "MATRIX 7×7 LATTICE", "HASH 0xDEADBEEF", "PING 12.4ms OK", "TRACE DISABLED", "VAULT SEALED", "PROTOCOL OMEGA-9", "ENTROPY HIGH", "FRAME #00441", "BUFFER FLUSHED", "CIPHER AES-256", "RELAY PROXIED", "ECHO SILENT", "LOCK ENGAGED", "GRID REF 44.0N 76.2W", "KERNEL 3.14.159", "DAEMON RUNNING", "WATCHDOG ARMED", "ROUTE OBFUSCATED", ]; function useAnimFrame(cb) { const ref = useRef(); useEffect(() => { let id; const loop = (t) => { cb(t); id = requestAnimationFrame(loop); }; id = requestAnimationFrame(loop); return () => cancelAnimationFrame(id); }, [cb]); } // ── Noise / grain canvas ────────────────────────────────────────────────────── function GrainOverlay({ strength = 0.18 }) { const canvasRef = useRef(); const tick = useRef(0); useEffect(() => { const canvas = canvasRef.current; if (!canvas) return; const ctx = canvas.getContext("2d"); let raf; const draw = () => { tick.current++; if (tick.current % 2 !== 0) { raf = requestAnimationFrame(draw); return; } const { width, height } = canvas; const img = ctx.createImageData(width, height); const d = img.data; for (let i = 0; i < d.length; i += 4) { const px = i / 4; const x = px % width; const y = Math.floor(px / width); // Vignette factor — stronger at edges const cx = x / width - 0.5, cy = y / height - 0.5; const dist = Math.sqrt(cx * cx + cy * cy); const vignette = Math.min(1, dist * 2.2); const noise = (Math.random() - 0.5) * 255 * (strength + vignette * 0.18); d[i] = d[i + 1] = d[i + 2] = 128 + noise; d[i + 3] = Math.floor(18 + vignette * 30); } ctx.putImageData(img, 0, 0); raf = requestAnimationFrame(draw); }; const resize = () => { canvas.width = canvas.offsetWidth; canvas.height = canvas.offsetHeight; }; resize(); draw(); window.addEventListener("resize", resize); return () => { cancelAnimationFrame(raf); window.removeEventListener("resize", resize); }; }, [strength]); return ( ); } // ── SVG geometric overlay ───────────────────────────────────────────────────── function GeometricOverlay() { return ( ); } // ── Terminal code cascade ───────────────────────────────────────────────────── function TerminalMask() { const [offset, setOffset] = useState(0); const [glitch, setGlitch] = useState({ row: -1, px: 0 }); useEffect(() => { const iv = setInterval(() => { setOffset((o) => (o + 1) % TERMINAL_LINES.length); }, 120); const gv = setInterval(() => { setGlitch({ row: Math.floor(Math.random() * 18), px: (Math.random() - 0.5) * 8 }); setTimeout(() => setGlitch({ row: -1, px: 0 }), 80); }, 900); return () => { clearInterval(iv); clearInterval(gv); }; }, []); const visible = Array.from({ length: 20 }, (_, i) => TERMINAL_LINES[(offset + i) % TERMINAL_LINES.length] ); return (