.info-panel display: flex; justify-content: space-between; align-items: baseline; margin-top: 1.2rem; flex-wrap: wrap; gap: 12px; background: #03060cee; padding: 0.8rem 1.5rem; border-radius: 3rem; backdrop-filter: blur(4px); border: 1px solid #2affb620;
// ---- GLOBALS ---- let traces = []; // stores each footprint object: x, y, age, intensity, codeChars, drops let animationId = null; let frame = 0; // Mouse / touch drawing state let drawing = false; let lastX = 0, lastY = 0; // visual settings const MAX_TRACES = 38; // maximum footprints at once const FOOTPRINT_RADIUS = 24; // radius of footprint area const FOOTPRINT_LIFE = 220; // frames lifespan (approx 3.6 sec at 60fps) const NEW_STEP_DIST = 28; // min distance to create a new footprint while dragging // ----- helper: generate "code rain drops" for each footprint function generateCodeDrops(baseX, baseY, intensity = 1.0) // each footprint contains a set of falling characters with individual positions & speed const dropCount = Math.floor(12 + intensity * 18); // 12 to 30 drops per foot const drops = []; for(let i = 0; i < dropCount; i++) // random offset within footprint radius + some spread const angle = Math.random() * Math.PI * 2; const radius = Math.random() * FOOTPRINT_RADIUS * 0.9; const offX = Math.cos(angle) * radius; const offY = Math.sin(angle) * radius * 0.7; // slight vertical squash for organic feel // initial vertical offset (above footprint center) const startYOffset = -Math.random() * 30 - 8; drops.push( char: getRandomCodeChar(), x: baseX + offX, y: baseY + offY + startYOffset, speed: 1.2 + Math.random() * 2.4, alpha: 0.7 + Math.random() * 0.5, size: 12 + Math.floor(Math.random() * 8), life: 0, // not used directly, will be removed on footprint reset driftX: (Math.random() - 0.5) * 0.5, ); return drops; // lexicon: programming symbols / matrix style const codeSymbols = [ '0', '1', '#', '', '', '(', ')', '<', '>', '=', ';', ':', '+', '-', '*', '/', '&', ')(); </script> </body> </html>
.stat background: #0e1a1f; padding: 0.25rem 1rem; border-radius: 2rem; font-size: 0.9rem; color: #bbffdd; box-shadow: inset 0 0 4px #00ffb310, 0 2px 5px #00000030; code feet
<script> (function() // ---------- CONFIGURATION ---------- const canvas = document.getElementById('codeFeetCanvas'); const ctx = canvas.getContext('2d'); // set canvas dimensions (fixed logical size, crisp) const W = 900, H = 600; canvas.width = W; canvas.height = H;
canvas:active filter: drop-shadow(0 0 6px #0ff8); .info-panel display: flex
.badge font-family: monospace; font-weight: bold; font-size: 0.85rem; letter-spacing: 1px; background: #00000066; padding: 0.3rem 1rem; border-radius: 2rem; color: #9efff0; border-left: 3px solid #2effc0;
button:hover background: #2effb022; color: #ffffff; border-color: #7effdd; box-shadow: 0 0 8px #0ff6; transform: scale(0.97); padding: 0.8rem 1.5rem
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no"> <title>Code Feet | Digital Footprint Matrix</title> <style> * margin: 0; padding: 0; box-sizing: border-box; user-select: none; /* prevents accidental text selection while interacting */
@keyframes pulseText 0% opacity: 0.7; text-shadow: 0 0 0 #0ff0; 100% opacity: 1; text-shadow: 0 0 3px #0ffa;
button background: none; border: 1px solid #2effb0; color: #b5ffe0; font-family: monospace; font-weight: bold; padding: 0.3rem 1rem; border-radius: 2rem; cursor: pointer; transition: all 0.2s; backdrop-filter: blur(8px); font-size: 0.8rem;
.stat span color: #6effc0; font-weight: bold; font-size: 1.1rem; margin-right: 6px;