0xb895…ccf4

All memos sent from and to 0xb895…ccf4.

<!doctype html> <html lang="en"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> <title>p5.js WEBGL Gradient Boxes</title> <style> html, body { margin: 0; padding: 0; background: #ffffff; overflow: hidden; } canvas { display: block; margin: 0 auto; } </style> </head> <body> <!-- p5.js library --> <script src="https://cdn.jsdelivr.net/npm/p5@1.9.4/lib/p5.min.js"></script> <script> let colors = []; let margin = 100; // Margin value for white space around the composition let shapes = []; // Store the shapes' parameters let fadeSpeed = 0.01; // Control the speed of fading function setup() { createCanvas(1000, 1000, WEBGL); // Switch to WEBGL for 3D rendering frameRate(60); // Set a stable frame rate for smooth animations // Defining some basic color sets for gradients with increased transparency colors = [ [color(255, 0, 0, 80), color(255, 204, 0, 80)], // Red to Yellow [color(0, 255, 255, 80), color(0, 0, 255, 80)], // Cyan to Blue [color(255, 0, 255, 80), color(255, 255, 0, 80)] // Magenta to Yellow ]; // Create centered overlapping shapes (3D boxes) for (let j = 0; j < 20; j++) { let w = random(500, 1000); let h = random(40, 1000); let d = random(40, 500); let xOffset = random(-300, 200); let yOffset = random(-300, 300); shapes.push({ x: xOffset, y: yOffset, w: w, h: h, d: d, colorSet: random(colors), fadeOffset: random(TWO_PI) }); } } function draw() { background(255); rotateY(millis() / 10000); for (let i = 0; i < shapes.length; i++) { let shape = shapes[i]; let transparency = map( sin(frameCount * fadeSpeed + shape.fadeOffset), -1, 1, 20, 120 ); push(); translate(shape.x, shape.y, 0); let c1 = color( red(shape.colorSet[0]), green(shape.colorSet[0]), blue(shape.colorSet[0]), transparency ); let c2 = color( red(shape.colorSet[1]), green(shape.colorSet[1]), blue(shape.colorSet[1]), transparency ); drawSoftGradientBox(shape.w, shape.h, shape.d, c1, c2); pop(); } } function drawSoftGradientBox(w, h, d, c1, c2) { noStroke(); // Front face beginShape(); fill(c1); vertex(-w / 2, -h / 2, d / 2); fill(c2); vertex(w / 2, -h / 2, d / 2); vertex(w / 2, h / 2, d / 2); vertex(-w / 2, h / 2, d / 2); endShape(CLOSE); // Back face beginShape(); fill(c2); vertex(-w / 2, -h / 2, -d / 2); fill(c1); vertex(w / 2, -h / 2, -d / 2); vertex(w / 2, h / 2, -d / 2); vertex(-w / 2, h / 2, -d / 2); endShape(CLOSE); // Left side beginShape(); fill(c1); vertex(-w / 2, -h / 2, d / 2); vertex(-w / 2, h / 2, d / 2); fill(c2); vertex(-w / 2, h / 2, -d / 2); vertex(-w / 2, -h / 2, -d / 2); endShape(CLOSE); // Right side beginShape(); fill(c2); vertex(w / 2, -h / 2, d / 2); vertex(w / 2, h / 2, d / 2); fill(c1); vertex(w / 2, h / 2, -d / 2); vertex(w / 2, -h / 2, -d / 2); endShape(CLOSE); } </script> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Binary Partitions - Generative Art</title> <style> * { margin: 0; padding: 0; box-sizing: border-box; } html, body { width: 100%; height: 100%; background: #000; overflow: hidden; } canvas { display: block; width: 100%; height: 100%; } </style> </head> <body> <canvas id="artCanvas"></canvas> <script> const originalPartitions = [{"x":0,"y":0,"width":419.44362139917695,"height":107,"gradientConfig":{"type":"text","colors":["#ffffff","#ffffff"],"angle":343.5725308641975,"rotationDirection":1,"textContent":"READING THE SKY______"},"secondLayer":{"enabled":false,"type":"linear","colors":["#949494","#989898"],"angle":270,"rotationDirection":-1,"blendMode":"difference"}},{"x":419.44362139917695,"y":0,"width":263.1158198050207,"height":107,"gradientConfig":{"type":"text","colors":["#ffffff","#ffffff"],"angle":52.199074074074076,"rotationDirection":1,"textContent":"READING THE SKY______"},"secondLayer":{"enabled":false,"type":"linear","colors":["#292929","#292929"],"angle":270,"rotationDirection":-1,"blendMode":"difference"}},{"x":682.5594412041976,"y":0,"width":376.16962336630905,"height":107,"gradientConfig":{"type":"text","colors":["#ffffff"],"angle":262.71296296296293,"rotationDirection":-1,"textContent":"READING THE SKY______"},"secondLayer":{"enabled":false,"type":"linear","colors":["#000000","#4dff00"],"angle":0,"rotationDirection":-1,"blendMode":"difference"}},{"x":1058.7290645705066,"y":0,"width":247.81107020303077,"height":107,"gradientConfig":{"type":"text","colors":["#ffffff","#ffffff","#ffffff"],"angle":77.22993827160494,"rotationDirection":1,"textContent":"READING THE SKY______"},"secondLayer":{"enabled":false,"type":"linear","colors":["#4dff00","#ff00ea"],"angle":180,"rotationDirection":1,"blendMode":"difference"}},{"x":1742.0293183858098,"y":0,"width":177.97068161419008,"height":107,"gradientConfig":{"type":"text","colors":["#ffffff","#ffffff"],"angle":264.7453703703704,"rotationDirection":-1,"textContent":"READING THE SKY______"},"secondLayer":{"enabled":false,"type":"linear","colors":["#989898"],"angle":180,"rotationDirection":1,"blendMode":"difference"}},{"x":1306.5401347735374,"y":0,"width":284.7283091966772,"height":107,"gradientConfig":{"type":"text","colors":["#ffffff","#ffffff"],"angle":240.25925925925927,"rotationDirection":-1,"textContent":"READING THE SKY______"},"secondLayer":{"enabled":false,"type":"linear","colors":["#4dff00","#4dff00"],"angle":180,"rotationDirection":-1,"blendMode":"difference"}},{"x":1591.2684439702145,"y":0,"width":150.76087441559528,"height":107,"gradientConfig":{"type":"text","colors":["#ffffff","#ffffff","#ffffff"],"angle":327.55401234567904,"rotationDirection":1,"textContent":"READING THE SKY______"},"secondLayer":{"enabled":false,"type":"linear","colors":["#ff00ea","#4a4a4a"],"angle":270,"rotationDirection":1,"blendMode":"difference"}}]; const config = {"width":1920,"height":107,"animationSpeed":44,"loopDuration":20,"shrinkPercentage":100}; const canvas = document.getElementById('artCanvas'); const ctx = canvas.getContext('2d'); let rotation = 0; let lastTime = 0; let offscreenCache = null; let scaleX = 1; let scaleY = 1; function resizeCanvas() { canvas.width = window.innerWidth; canvas.height = window.innerHeight; scaleX = window.innerWidth / config.width; scaleY = window.innerHeight / config.height; offscreenCache = null; } function scalePartition(p) { return { x: p.x * scaleX, y: p.y * scaleY, width: p.width * scaleX, height: p.height * scaleY, gradientConfig: p.gradientConfig, secondLayer: p.secondLayer }; } window.addEventListener('resize', resizeCanvas); resizeCanvas(); function calculateTextHeight(ctx, text, targetHeight) { let minSize = 1; let maxSize = targetHeight * 2; let fontSize = targetHeight; for (let i = 0; i < 20; i++) { ctx.font = `bold ${fontSize}px Helvetica`; const metrics = ctx.measureText(text); const actualHeight = metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent; if (Math.abs(actualHeight - targetHeight) < 1) break; if (actualHeight < targetHeight) { minSize = fontSize; fontSize = (fontSize + maxSize) / 2; } else { maxSize = fontSize; fontSize = (minSize + fontSize) / 2; } } return fontSize; } function getOffscreenCanvas(width, height) { if (!offscreenCache) { offscreenCache = document.createElement('canvas'); } if (offscreenCache.width < width) offscreenCache.width = width; if (offscreenCache.height < height) offscreenCache.height = height; const octx = offscreenCache.getContext('2d'); if (octx) octx.clearRect(0, 0, width, height); return offscreenCache; } function hexToRgb(hex) { const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex); return result ? [parseInt(result[1], 16), parseInt(result[2], 16), parseInt(result[3], 16)] : [0, 0, 0]; } function rgbToHex(r, g, b) { return '#' + [r, g, b].map(x => { const hex = Math.round(x).toString(16); return hex.length === 1 ? '0' + hex : hex; }).join(''); } function interpolateColor(color1, color2, t) { const rgb1 = hexToRgb(color1); const rgb2 = hexToRgb(color2); return rgbToHex( rgb1[0] + (rgb2[0] - rgb1[0]) * t, rgb1[1] + (rgb2[1] - rgb1[1]) * t, rgb1[2] + (rgb2[2] - rgb1[2]) * t ); } function createLinearGradientPattern(ctx, colors, partitionLength) { const offscreenCanvas = document.createElement('canvas'); const totalSegments = colors.length * 2; const tileWidth = Math.ceil(partitionLength); offscreenCanvas.width = tileWidth; offscreenCanvas.height = 100; const offscreenCtx = offscreenCanvas.getContext('2d'); if (!offscreenCtx) return null; const gradient = offscreenCtx.createLinearGradient(0, 0, tileWidth, 0); const segmentSize = 1 / totalSegments; for (let i = 0; i < colors.length; i++) { gradient.addColorStop(i * 2 * segmentSize, '#000000'); gradient.addColorStop((i * 2 + 1) * segmentSize, colors[i]); } gradient.addColorStop(1, '#000000'); offscreenCtx.fillStyle = gradient; offscreenCtx.fillRect(0, 0, tileWidth, 100); const pattern = ctx.createPattern(offscreenCanvas, 'repeat'); if (!pattern) return null; return { pattern, tileWidth }; } function createGradientForLayer(ctx, partition, layerConfig, rotation) { const { type, colors, angle } = layerConfig; const centerX = partition.x + partition.width / 2; const centerY = partition.y + partition.height / 2; let gradient; if (type === 'linear') { const angleRad = (angle * Math.PI) / 180; const partitionLength = Math.abs(Math.cos(angleRad)) * partition.width + Math.abs(Math.sin(angleRad)) * partition.height; const halfLength = partitionLength / 2; const startX = centerX - halfLength * Math.cos(angleRad); const startY = centerY - halfLength * Math.sin(angleRad); const endX = centerX + halfLength * Math.cos(angleRad); const endY = centerY + halfLength * Math.sin(angleRad); gradient = ctx.createLinearGradient(startX, startY, endX, endY); const totalSegments = colors.length * 2; const rotationFraction = ((rotation % 360) / 360); const allStops = []; for (let i = 0; i < colors.length; i++) { const blackPos = ((i * 2 / totalSegments - rotationFraction + 1) % 1); const colorPos = (((i * 2 + 1) / totalSegments - rotationFraction + 1) % 1); allStops.push({ position: blackPos, color: '#000000' }); allStops.push({ position: colorPos, color: colors[i] }); } allStops.sort((a, b) => a.position - b.position); const firstStop = allStops[0]; const lastStop = allStops[allStops.length - 1]; const totalGap = firstStop.position + (1 - lastStop.position); if (firstStop.position > 0) { const t = (1 - lastStop.position) / totalGap; gradient.addColorStop(0, interpolateColor(lastStop.color, firstStop.color, t)); } allStops.forEach(stop => gradient.addColorStop(stop.position, stop.color)); if (lastStop.position < 1) { const t = (1 - lastStop.position) / totalGap; gradient.addColorStop(1, interpolateColor(lastStop.color, firstStop.color, t)); } return gradient; } else if (type === 'conic') { const normalizedRotation = rotation % 360; const rotationDirection = layerConfig.rotationDirection || 1; gradient = ctx.createConicGradient(((angle + normalizedRotation * rotationDirection) * Math.PI) / 180, centerX, centerY); } else { const maxSize = Math.max(partition.width, partition.height); gradient = ctx.createRadialGradient(centerX, centerY, 0, centerX, centerY, maxSize); } const segmentSize = 1 / (colors.length * 2); colors.forEach((color, i) => { gradient.addColorStop(i * segmentSize * 2, color); gradient.addColorStop(i * segmentSize * 2 + segmentSize, '#000000'); }); gradient.addColorStop(1, colors[0]); return gradient; } function drawGradientLayer(ctx, partition, layerConfig, rotation, partitionIndex, blendMode) { ctx.globalCompositeOperation = blendMode; const centerX = partition.x + partition.width / 2; const centerY = partition.y + partition.height / 2; const { type, colors, angle } = layerConfig; if (type === 'linear') { const angleRad = (angle * Math.PI) / 180; const partitionLength = Math.abs(Math.cos(angleRad)) * partition.width + Math.abs(Math.sin(angleRad)) * partition.height; const result = createLinearGradientPattern(ctx, colors, partitionLength); if (result) { const { pattern, tileWidth } = result; const maxSize = Math.max(partition.width, partition.height) * 2; if (pattern.setTransform) { const offsetDistance = ((rotation / 360) * tileWidth) % tileWidth; const offsetX = offsetDistance * Math.cos(angleRad); const offsetY = offsetDistance * Math.sin(angleRad); const matrix = new DOMMatrix(); matrix.translateSelf(offsetX, offsetY); matrix.rotateSelf(angle); pattern.setTransform(matrix); ctx.fillStyle = pattern; ctx.fillRect(centerX - maxSize, centerY - maxSize, maxSize * 2, maxSize * 2); } else { const gradient = createGradientForLayer(ctx, partition, layerConfig, rotation); ctx.fillStyle = gradient; ctx.fillRect(partition.x, partition.y, partition.width, partition.height); } } } else if (type === 'radial') { const maxSize = Math.max(partition.width, partition.height); const selectedColor = colors[partitionIndex % colors.length]; const currentCycle = Math.floor(rotation / 360); const maxIterations = 4; const startCycle = Math.max(0, currentCycle - maxIterations + 1); const offscreen = getOffscreenCanvas(partition.width, partition.height); const offscreenCtx = offscreen.getContext('2d'); if (!offscreenCtx) return; offscreenCtx.globalCompositeOperation = 'lighten'; const offscreenCenterX = partition.width / 2; const offscreenCenterY = partition.height / 2; for (let cycle = startCycle; cycle <= currentCycle; cycle++) { const cycleAge = rotation / 360 - cycle; const iterationSize = maxSize * cycleAge; if (iterationSize > 0 && iterationSize <= maxSize * maxIterations) { const gradient = offscreenCtx.createRadialGradient(offscreenCenterX, offscreenCenterY, 0, offscreenCenterX, offscreenCenterY, iterationSize); gradient.addColorStop(0, '#000000'); gradient.addColorStop(0.5, selectedColor); gradient.addColorStop(1, '#000000'); offscreenCtx.fillStyle = gradient; offscreenCtx.fillRect(offscreenCenterX - iterationSize, offscreenCenterY - iterationSize, iterationSize * 2, iterationSize * 2); } } ctx.drawImage(offscreen, partition.x, partition.y); } else if (type === 'text') { const textContent = layerConfig.textContent || '$$$'; const xCoord = Math.round(partition.x * 10000); const yCoord = Math.round(partition.y * 10000); const hash = Math.abs((xCoord * 73856093) ^ (yCoord * 19349663)); const selectedColor = colors[hash % colors.length]; const hash2 = Math.abs((xCoord * 19349663) ^ (yCoord * 73856093)); const randomStartOffset = (hash2 % 10000) / 10000; const hash3 = Math.abs((xCoord * 50331653) ^ (yCoord * 25165843)); const direction = hash3 % 3; ctx.save(); const partCenterX = partition.x + partition.width / 2; const partCenterY = partition.y + partition.height / 2; if (direction === 1) { ctx.translate(partCenterX, partCenterY); ctx.rotate(-Math.PI / 2); ctx.translate(-partCenterX, -partCenterY); } else if (direction === 2) { ctx.translate(partCenterX, partCenterY); ctx.rotate(Math.PI / 2); ctx.translate(-partCenterX, -partCenterY); } const fillDimension = direction === 0 ? partition.height : partition.width; const targetHeight = fillDimension * 0.95; const fontSize = calculateTextHeight(ctx, textContent, targetHeight); ctx.font = `bold ${fontSize}px Helvetica`; ctx.fillStyle = selectedColor; ctx.textBaseline = 'middle'; const wordWidth = ctx.measureText(textContent).width; const normalizedRotation = rotation % 360; const scrollProgress = (normalizedRotation / 360 + randomStartOffset) % 1; const scrollOffset = -(scrollProgress * wordWidth) % wordWidth; const scrollDimensionSize = direction === 0 ? partition.width : partition.height; const textY = partition.y + partition.height * 0.55; const textX = partition.x + scrollOffset; const numCopies = Math.ceil(scrollDimensionSize / wordWidth) + 3; for (let i = -1; i < numCopies; i++) { ctx.fillText(textContent, textX + (i * wordWidth), textY); } ctx.restore(); } else { ctx.save(); const normalizedRotation = rotation % 360; const rotationDirection = layerConfig.rotationDirection || 1; ctx.translate(centerX, centerY); ctx.rotate((normalizedRotation * rotationDirection * Math.PI) / 180); ctx.translate(-centerX, -centerY); const gradient = createGradientForLayer(ctx, partition, layerConfig, rotation); ctx.fillStyle = gradient; const maxSize = Math.max(partition.width, partition.height) * 2; ctx.fillRect(centerX - maxSize, centerY - maxSize, maxSize * 2, maxSize * 2); ctx.restore(); } } function renderPartitions(rotation) { ctx.fillStyle = '#000000'; ctx.fillRect(0, 0, canvas.width, canvas.height); const scale = config.shrinkPercentage / 100; originalPartitions.forEach((originalPartition, partitionIndex) => { const partition = scalePartition(originalPartition); ctx.save(); const centerX = partition.x + partition.width / 2; const centerY = partition.y + partition.height / 2; ctx.translate(centerX, centerY); ctx.scale(scale, scale); ctx.translate(-centerX, -centerY); ctx.beginPath(); ctx.rect(partition.x, partition.y, partition.width, partition.height); ctx.clip(); const primaryLayerConfig = { type: partition.gradientConfig.type, colors: partition.gradientConfig.colors, angle: partition.gradientConfig.angle, rotationDirection: partition.gradientConfig.rotationDirection, textContent: partition.gradientConfig.textContent, }; drawGradientLayer(ctx, partition, primaryLayerConfig, rotation, partitionIndex, 'source-over'); if (partition.secondLayer.enabled) { const secondLayerConfig = { type: partition.secondLayer.type, colors: partition.secondLayer.colors, angle: partition.secondLayer.angle, rotationDirection: partition.secondLayer.rotationDirection, textContent: partition.secondLayer.textContent, }; ctx.save(); drawGradientLayer(ctx, partition, secondLayerConfig, rotation, partitionIndex, partition.secondLayer.blendMode); ctx.restore(); } ctx.restore(); }); } function animate(timestamp) { if (!lastTime) lastTime = timestamp; const deltaTime = timestamp - lastTime; lastTime = timestamp; const actualLoopDuration = config.loopDuration / (config.animationSpeed / 50); const degreesPerSecond = 360 / actualLoopDuration; rotation += (deltaTime / 1000) * degreesPerSecond; renderPartitions(rotation); requestAnimationFrame(animate); } requestAnimationFrame(animate); </script> </body> </html>
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <style> *{margin:0;padding:0;box-sizing:border-box} html,body{height:100%;overflow:hidden} body{background:#000;height:100%;display:flex;align-items:center;justify-content:center;font-family:system-ui,sans-serif} #c{position:relative;height:100%;display:flex;align-items:center;justify-content:center} video{max-height:100vh;max-width:100vw;object-fit:contain} .hidden{display:none!important} #l{color:#fff;font-size:14px;text-align:center;padding:40px} .progress-wrap{width:200px;height:4px;background:#333;border-radius:2px;margin:16px auto 0;overflow:hidden} .progress-bar{height:100%;background:#0052FF;width:0%;transition:width 0.3s} #play-btn{display:none;width:80px;height:80px;border-radius:50%;background:rgba(0,82,255,0.9);border:none;cursor:pointer;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);z-index:10} #play-btn:hover{background:#0052FF} #play-btn svg{fill:#fff;width:32px;height:32px;margin-left:4px} </style> </head> <body> <div id="c"> <div id="l"> <div>Loading from Base...</div> <div class="progress-wrap"><div class="progress-bar" id="progress"></div></div> </div> <button id="play-btn" onclick="startPlayback()"> <svg viewBox="0 0 24 24"><path d="M8 5v14l11-7z"/></svg> </button> <video id="v0" class="hidden" playsinline></video> <video id="v1" class="hidden" playsinline></video> <video id="v2" class="hidden" playsinline></video> <video id="v3" class="hidden" playsinline></video> <video id="v4" class="hidden" playsinline></video> <video id="v5" class="hidden" playsinline></video> <video id="v6" class="hidden" playsinline></video> <video id="v7" class="hidden" playsinline></video> <video id="v8" class="hidden" playsinline></video> <video id="v9" class="hidden" playsinline></video> <video id="v10" class="hidden" playsinline></video> </div> <script> const T=['0x4ae8bc89b1572caab629f4b98de81be6aec6901a10f6d248686848b6cb7f8ccf','0x427bc464296f3874d24af645be6391cd962a29a57c129a5d7048d08b14ee97d4','0x38e7f3c188f4b4d3e2444d90446eb9eddf898dd98c76eeee431ce652691fe5da','0x34c7ca1eed01dd0ec9c2f114e1fe68acd32b46d2f714fbbdb71ad8bb21910ed8','0x5f2a75503bfeb2f7a04090f388abe8047054995b044010bae9e1a8f1684231a4','0xc60c78380f3b6fb961a5611b20bafcdd290a163215d91616770f75044c65433e','0xeeee59c81b9f77e9e51dddb0874de9e93f0ac38cb96fcb5d18eeb0e2848d9c99','0x81fb6c3ea72e806bd66f00b323b477f1652da2056856e27b031bbfc53325428f','0x0103cb3d295009a87f3a48f27643d6ff4be662fef05e67196bf21911af205809','0x78480c0f270a991ca638c43b91f84b77d14b2f63723cf3a76c3bca2e0c1006b4','0x82bf5fda6ad091a26d44e84c406b5683cd0ac7c208a0ffbbb153df8eab8f0180']; const R='https://mainnet.base.org'; const videos=[]; let current=0; let loaded=0; let ready=false; async function fetchTx(h){ const r=await fetch(R,{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({jsonrpc:'2.0',id:1,method:'eth_getTransactionByHash',params:[h]})}); const j=await r.json(); const x=j.result.input.slice(2); let s='';for(let i=0;i<x.length;i+=2)s+=String.fromCharCode(parseInt(x.substr(i,2),16)); return s; } function updateProgress(){ const pct=Math.round((loaded/T.length)*100); document.getElementById('progress').style.width=pct+'%'; } function onVideoReady(){ loaded++; updateProgress(); if(loaded===T.length){ ready=true; document.getElementById('l').classList.add('hidden'); document.getElementById('play-btn').style.display='block'; videos[0].classList.remove('hidden'); } } function startPlayback(){ document.getElementById('play-btn').style.display='none'; videos[0].play(); } function togglePlayback(e){ const v=videos[current]; if(v.paused){v.play();}else{v.pause();} } function playNext(){ if(current>=videos.length-1)return; // stop at end, no loop videos[current].classList.add('hidden'); current++; videos[current].classList.remove('hidden'); videos[current].currentTime=0; videos[current].play(); } async function init(){ const data=await Promise.all(T.map(fetchTx)); for(let i=0;i<T.length;i++){ const v=document.getElementById('v'+i); videos.push(v); v.src=data[i]; v.load(); v.oncanplaythrough=()=>{ if(!v._ready){v._ready=true;onVideoReady();} }; v.onended=playNext; v.onclick=togglePlayback; } } init(); </script> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>CTPT: Quantum Imprint in the Void</title> <style> body { margin: 0; overflow: hidden; background: #000; } #equation { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); color: #53bba5; font-family: 'Courier New', monospace; font-size: 1em; opacity: 0.3; text-align: center; pointer-events: none; animation: pulse 4s infinite ease-in-out; } @keyframes pulse { 0%, 100% { opacity: 0.3; transform: translate(-50%, -50%) scale(1); } 50% { opacity: 0.6; transform: translate(-50%, -50%) scale(1.05); } } </style> <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script> </head> <body> <script> const scene = new THREE.Scene(); const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000); const renderer = new THREE.WebGLRenderer({ antialias: false }); // Kept disabled to avoid lag renderer.setSize(window.innerWidth, window.innerHeight); document.body.appendChild(renderer.domElement); // Subtle lighting: directional for shadows, ambient for void glow const light = new THREE.DirectionalLight(0xffffff, 0.4); light.position.set(0, 10, 10); scene.add(light); scene.add(new THREE.AmbientLight(0x111111)); // Quantum field: nodes as pulsating spheres (increased count slightly for density) const numNodes = 100; // Increased from 75 to add density without heavy lag const nodes = []; const nodeGroup = new THREE.Group(); for (let i = 0; i < numNodes; i++) { const geometry = new THREE.SphereGeometry(0.05, 8, 8); const material = new THREE.MeshBasicMaterial({ color: 0x53bba5, transparent: true, opacity: 0.5 }); const node = new THREE.Mesh(geometry, material); node.position.set((Math.random() - 0.5) * 10, (Math.random() - 0.5) * 10, (Math.random() - 0.5) * 10); nodes.push(node); nodeGroup.add(node); } scene.add(nodeGroup); // Connections: flickering grey lines between nodes for lattice, with sparks and trails const edges = []; const trailLength = 20; // Increased from 15 for longer, more visible trails for (let i = 0; i < numNodes; i++) { for (let j = i + 1; j < numNodes; j++) { if (Math.random() < 0.005) { // Increased probability from 0.003 for more connections/density const material = new THREE.LineBasicMaterial({ color: 0x808080, transparent: true, opacity: 0.2 }); const geometry = new THREE.BufferGeometry().setFromPoints([new THREE.Vector3(), new THREE.Vector3()]); const line = new THREE.Line(geometry, material); scene.add(line); // Spark for this edge const sparkGeo = new THREE.SphereGeometry(0.02, 4, 4); const sparkMat = new THREE.MeshBasicMaterial({ color: 0x53bba5, transparent: true }); const spark = new THREE.Mesh(sparkGeo, sparkMat); scene.add(spark); // Trail for the spark const trailGeo = new THREE.BufferGeometry(); const trailMat = new THREE.LineBasicMaterial({ color: 0x53bba5, transparent: true, opacity: 0.3 }); const trailLine = new THREE.Line(trailGeo, trailMat); scene.add(trailLine); const edgeObj = { line: line, node1: nodes[i], node2: nodes[j], spark: spark, trailPositions: [], trailLine: trailLine, progress: Math.random(), speed: 0.0025 + Math.random() * 0.005, offset: Math.random() * Math.PI * 2 }; edges.push(edgeObj); } } } // Central singularity: a dark, warping sphere const singularityGeometry = new THREE.SphereGeometry(0.3, 16, 16); const singularityMaterial = new THREE.MeshBasicMaterial({ color: 0x000000, transparent: true, opacity: 0.8 }); const singularity = new THREE.Mesh(singularityGeometry, singularityMaterial); singularity.position.set(0, 0, 0); scene.add(singularity); camera.position.z = 8; let time = 0; let mouseX = 0, mouseY = 0; let frameCount = 0; // Interactive: mouse as thought source document.addEventListener('mousemove', (event) => { mouseX = (event.clientX / window.innerWidth) * 2 - 1; mouseY = -(event.clientY / window.innerHeight) * 2 + 1; }); function animate() { requestAnimationFrame(animate); time += 0.02; frameCount++; // Pulsate nodes with light (scale and opacity) nodes.forEach((node, i) => { const pulse = Math.sin(time + i * 0.1) * 0.5 + 0.5; node.scale.set(1 + pulse * 0.5, 1 + pulse * 0.5, 1 + pulse * 0.5); node.material.opacity = 0.3 + pulse * 0.4; // Perturb towards singularity + mouse influence (increased strength slightly for more dynamic movement) const dirToCenter = new THREE.Vector3().subVectors(singularity.position, node.position).normalize(); node.position.add(dirToCenter.multiplyScalar(0.001)); node.position.x += Math.sin(time + mouseX * 5 + node.position.y) * 0.01; // Back to 0.01 node.position.y += Math.cos(time + mouseY * 5 + node.position.x) * 0.01; }); // Update edges, sparks, and trails (trails updated every 2 frames instead of 3 for smoother appearance) edges.forEach((edge) => { // Update line positions const points = [edge.node1.position, edge.node2.position]; edge.line.geometry.setFromPoints(points); // Flicker grey lines (lattice) edge.line.material.opacity = 0.3 + Math.sin(time + edge.offset) * 0.2; // Animate spark along edge edge.progress += edge.speed; if (edge.progress > 1) edge.progress = 0; const pos = new THREE.Vector3().lerpVectors(edge.node1.position, edge.node2.position, edge.progress); edge.spark.position.copy(pos); edge.spark.material.opacity = 0.5 + Math.sin(edge.progress * Math.PI) * 0.5; // Update trail every 2 frames if (frameCount % 2 === 0) { edge.trailPositions.push(pos.clone()); if (edge.trailPositions.length > trailLength) { edge.trailPositions.shift(); } edge.trailLine.geometry.setFromPoints(edge.trailPositions); } }); // Rotate field subtly with mouse nodeGroup.rotation.x = mouseY * 0.3; nodeGroup.rotation.y = mouseX * 0.3; renderer.render(scene, camera); } animate(); window.addEventListener('resize', () => { camera.aspect = window.innerWidth / window.innerHeight; camera.updateProjectionMatrix(); renderer.setSize(window.innerWidth, window.innerHeight); }); </script> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>oUtZoNe</title> <script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.4.0/p5.js"></script> <style> body, html { margin: 0; padding: 0; height: 100%; overflow: hidden; display: flex; justify-content: center; align-items: center; background-color: black; color: lime; font-size: 10px; line-height: 10px; font-family: monospace; white-space: pre; } pre { margin: 0; } </style> </head> <body> <pre id="ascii-animation"></pre> <script> let cols, rows; let phase = 0; let asciiOutput; let waveSpeed1 = 0.1; let waveSpeed2 = 0.15; let waveSpeed3 = 0.2; let charWidth = 8; let charHeight = 10; let characters = ['#', '*', '.', '=', '-', '+', '~', '|', '^', '@']; let outzoneText = [ " OOO U U TTTTT ZZZZZ OOO N N EEEEE ", " O O U U T Z O O NN N E ", " O O U U T Z O O N N N EEEE ", " O O U U T Z O O N NN E ", " OOO UUU T ZZZZZ OOO N N EEEEE " ]; function setup() { noCanvas(); asciiOutput = select('#ascii-animation'); adjustGridSize(); frameRate(20); } function draw() { let asciiArt = ""; for (let i = 0; i < rows; i++) { for (let j = 0; j < cols; j++) { let char = " "; let wave1 = sin(phase + i * waveSpeed1 + j * waveSpeed2); let wave2 = cos(phase + i * waveSpeed3 - j * waveSpeed1); let wave3 = sin(phase + i * waveSpeed2 + j * waveSpeed3) * cos(phase + i * 0.2); let wave4 = sin(phase * 0.5 + dist(i, j, cols / 2, rows / 2) * 0.1); let combinedWave = wave1 + wave2 + wave3 + wave4; let charIndex = floor(map(combinedWave, -2, 2, 0, characters.length)); charIndex = constrain(charIndex, 0, characters.length - 1); char = characters[charIndex]; asciiArt += char; } asciiArt += '\n'; } let middleRow = floor(rows / 2) - Math.floor(outzoneText.length / 2); let middleCol = floor(cols / 2) - Math.floor(outzoneText[0].length / 2); for (let t = 0; t < outzoneText.length; t++) { let line = outzoneText[t]; for (let k = 0; k < line.length; k++) { if (line[k] !== ' ') { let char = Math.random() > 0.2 ? characters[floor(random(characters.length))] : line[k]; asciiArt = setCharAt(asciiArt, (middleRow + t) * (cols + 1) + middleCol + k, char); } } } asciiOutput.html(asciiArt); phase += 0.05; } function adjustGridSize() { let windowW = window.innerWidth; let windowH = window.innerHeight; cols = floor(windowW / charWidth); rows = floor(windowH / charHeight); } function setCharAt(str, index, chr) { if (index > str.length - 1) return str; return str.substring(0, index) + chr + str.substring(index + 1); } function windowResized() { adjustGridSize(); } setup(); draw(); setInterval(draw, 50); </script> </body> </html>
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <title>Smear Art</title> <style>*{margin:0;padding:0;box-sizing:border-box}body,html{width:100%;height:100%;overflow:hidden;background:#000}#container{position:relative;width:600px;height:600px;margin:0 auto;background:#000}.partition{position:absolute;overflow:hidden}.partition canvas{width:100%;height:100%;display:block;image-rendering:pixelated;image-rendering:crisp-edges;position:relative;z-index:10}</style> </head> <body> <div id="container"></div> <script> const container = document.getElementById('container'); const partitions = [{"x":-2,"y":0,"w":308,"h":600,"pattern":"random-blocks","color1":"#ceff00","color2":"#000000","cellSize":10,"speed":5,"smearAmount":2,"direction":{"dx":-1,"dy":0,"name":"left"},"enableDirectionChange":true,"directionChangeInterval":3861.3076612313293,"sourceInterval":1000,"smearMode":"replace","trailIntensity":0.85,"opacity":1},{"x":303,"y":3,"w":311,"h":605,"pattern":"cellular-automata","color1":"#f865b0","color2":"#000000","cellSize":10,"speed":5,"smearAmount":2,"direction":{"dx":1,"dy":0,"name":"right"},"enableDirectionChange":false,"directionChangeInterval":3000,"sourceInterval":1000,"smearMode":"trail","trailIntensity":0.98,"opacity":1},{"x":163,"y":-2,"w":222,"h":611,"pattern":"perlin","color1":"#f4faff","color2":"#000000","cellSize":10,"speed":5,"smearAmount":2,"direction":{"dx":-1,"dy":1,"name":"down-left"},"enableDirectionChange":true,"directionChangeInterval":2805.7492425761707,"sourceInterval":1000,"smearMode":"replace","trailIntensity":0.85,"opacity":0.81}]; class SmearPartition { constructor(config) { this.config = config; this.div = document.createElement('div'); this.div.className = 'partition'; this.div.style.left = config.x + 'px'; this.div.style.top = config.y + 'px'; this.div.style.width = config.w + 'px'; this.div.style.height = config.h + 'px'; this.canvas = document.createElement('canvas'); this.canvas.width = Math.floor(config.w); this.canvas.height = Math.floor(config.h); this.ctx = this.canvas.getContext('2d'); this.ctx.imageSmoothingEnabled = false; this.div.appendChild(this.canvas); container.appendChild(this.div); this.direction = config.direction; this.enableDirectionChange = config.enableDirectionChange || false; this.directionChangeInterval = config.directionChangeInterval || 3000; this.lastDirectionChange = 0; this.lastSourceTime = 0; this.imageData = null; this.opacity = config.opacity !== undefined ? config.opacity : 1.0; this.fgRGB = this.hexToRGB(config.color1); this.bgRGB = this.hexToRGB(config.color2 || '#000000'); this.sourceParams = this.generateSourceParams(); this.gradientCache = null; this.caState = null; this.initPattern(); this.start(); } generateSourceParams() { return { steps: 3 + Math.floor(Math.random() * 6), stripeWidth: 2 + Math.floor(Math.random() * 8), checkSize: 1 + Math.floor(Math.random() * 4), phase: 0, dashLength: 3 + Math.floor(Math.random() * 10), gapLength: 2 + Math.floor(Math.random() * 6), density: 0.05 + Math.random() * 0.25, frequency: 1 + Math.random() * 4, sinePhase: Math.random() * Math.PI * 2, seed1: Math.random() * 100, seed2: Math.random() * 100, seed3: Math.random() * 100, counter: Math.floor(Math.random() * 65536), caRule: Math.random() > 0.5 ? 30 : 110 }; } hexToRGB(hex) { const r = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex); return r ? { r: parseInt(r[1], 16), g: parseInt(r[2], 16), b: parseInt(r[3], 16) } : { r: 255, g: 255, b: 255 }; } lerpColor(t) { return { r: Math.round(this.bgRGB.r + (this.fgRGB.r - this.bgRGB.r) * t), g: Math.round(this.bgRGB.g + (this.fgRGB.g - this.bgRGB.g) * t), b: Math.round(this.bgRGB.b + (this.fgRGB.b - this.bgRGB.b) * t) }; } getSourceValue(pos, length) { const t = pos / length; const cfg = this.config; switch(cfg.pattern) { case 'noise': return Math.random() > 0.5 ? this.fgRGB : this.bgRGB; case 'linear-gradient': return this.lerpColor(t); case 'stepped-gradient': const steps = this.sourceParams.steps || 5; return this.lerpColor(Math.floor(t * steps) / (steps - 1)); case 'random-gradient': if (!this.gradientCache || this.gradientCache.length !== length) { this.generateRandomGradient(length); } return this.lerpColor(this.gradientCache[pos]); case 'stripes': return (Math.floor(pos / (cfg.cellSize || 10)) % 2 === 0) ? this.fgRGB : this.bgRGB; case 'checkerboard': return ((Math.floor(pos / (cfg.cellSize || 10)) + (this.sourceParams.phase || 0)) % 2 === 0) ? this.fgRGB : this.bgRGB; case 'random-blocks': const blockIndex = Math.floor(pos / (cfg.cellSize || 10)); const blockRandom = Math.sin(blockIndex * 12.9898 + this.sourceParams.seed1) * 43758.5453; return (blockRandom - Math.floor(blockRandom)) > 0.5 ? this.fgRGB : this.bgRGB; case 'dashes': const cycle = (this.sourceParams.dashLength || 6) + (this.sourceParams.gapLength || 3); return (pos % cycle < (this.sourceParams.dashLength || 6)) ? this.fgRGB : this.bgRGB; case 'dots': return Math.random() < (this.sourceParams.density || 0.15) ? this.fgRGB : this.bgRGB; case 'sine': const sv = (Math.sin((t * (this.sourceParams.frequency || 2) * Math.PI * 2) + (this.sourceParams.sinePhase || 0)) + 1) / 2; return this.lerpColor(sv); case 'perlin': const p1 = Math.sin(t * 3.7 + this.sourceParams.seed1) * 0.5; const p2 = Math.sin(t * 7.3 + this.sourceParams.seed2) * 0.25; const p3 = Math.sin(t * 13.1 + this.sourceParams.seed3) * 0.125; return this.lerpColor(Math.max(0, Math.min(1, (p1 + p2 + p3 + 0.875) / 1.75))); case 'binary-counter': return ((this.sourceParams.counter >> (pos % 16)) & 1) ? this.fgRGB : this.bgRGB; case 'cellular-automata': if (!this.caState || this.caState.length !== length) { this.initCellularAutomata(length); } return this.caState[pos] ? this.fgRGB : this.bgRGB; default: return Math.random() > 0.5 ? this.fgRGB : this.bgRGB; } } generateRandomGradient(length) { const np = 3 + Math.floor(Math.random() * 4); const cp = [0]; for (let i = 1; i < np - 1; i++) cp.push(Math.random()); cp.push(1); cp.sort((a, b) => a - b); const cv = cp.map(() => Math.random()); this.gradientCache = []; for (let i = 0; i < length; i++) { const t = i / length; let si = 0; for (let j = 0; j < cp.length - 1; j++) { if (t >= cp[j] && t <= cp[j + 1]) { si = j; break; } } const st = (t - cp[si]) / (cp[si + 1] - cp[si]); this.gradientCache.push(cv[si] + (cv[si + 1] - cv[si]) * st); } } initCellularAutomata(length) { this.caState = []; for (let i = 0; i < length; i++) { this.caState.push(Math.random() > 0.5); } } evolveCellularAutomata() { if (!this.caState) return; const rule = this.sourceParams.caRule || 30; const os = [...this.caState]; const len = this.caState.length; for (let i = 0; i < len; i++) { const p = (os[(i - 1 + len) % len] ? 4 : 0) + (os[i] ? 2 : 0) + (os[(i + 1) % len] ? 1 : 0); this.caState[i] = ((rule >> p) & 1) === 1; } } updateSourceParams() { const cfg = this.config; switch(cfg.pattern) { case 'checkerboard': this.sourceParams.phase = (this.sourceParams.phase + 1) % 2; break; case 'sine': this.sourceParams.sinePhase += 0.5; break; case 'binary-counter': this.sourceParams.counter++; break; case 'cellular-automata': this.evolveCellularAutomata(); break; case 'random-gradient': this.gradientCache = null; break; case 'perlin': this.sourceParams.seed1 += 0.3; this.sourceParams.seed2 += 0.2; this.sourceParams.seed3 += 0.1; break; } } generateSourceEdge() { this.updateSourceParams(); const data = this.imageData.data; const w = this.canvas.width; const h = this.canvas.height; const length = w; const cfg = this.config; for (let i = 0; i < length; i++) { const x = i; const y = 0; // top edge let color; // 2D patterns need both x and y coordinates if (cfg.pattern === 'checkerboard') { const cellX = Math.floor(x / (cfg.cellSize || 10)); const cellY = Math.floor(y / (cfg.cellSize || 10)); color = ((cellX + cellY) % 2 === 0) ? this.fgRGB : this.bgRGB; } else if (cfg.pattern === 'random-blocks') { const cellX = Math.floor(x / (cfg.cellSize || 10)); const cellY = Math.floor(y / (cfg.cellSize || 10)); const seed = cellX * 73856093 ^ cellY * 19349663; const blockRandom = Math.sin(seed + this.sourceParams.seed1) * 43758.5453; color = (blockRandom - Math.floor(blockRandom)) > 0.5 ? this.fgRGB : this.bgRGB; } else { // 1D patterns color = this.getSourceValue(i, length); } const idx = i * 4; data[idx] = color.r; data[idx + 1] = color.g; data[idx + 2] = color.b; data[idx + 3] = Math.round(this.opacity * 255); } } changeDirection() { const dirs = [ { dx: 0, dy: 1, name: 'down' }, { dx: 1, dy: 1, name: 'down-right' }, { dx: 1, dy: 0, name: 'right' }, { dx: 1, dy: -1, name: 'up-right' }, { dx: 0, dy: -1, name: 'up' }, { dx: -1, dy: -1, name: 'up-left' }, { dx: -1, dy: 0, name: 'left' }, { dx: -1, dy: 1, name: 'down-left' } ]; const currentIndex = dirs.findIndex(d => d.dx === this.direction.dx && d.dy === this.direction.dy); if (currentIndex === -1) return; const newIndex = Math.random() > 0.5 ? (currentIndex + 1) % 8 : (currentIndex + 7) % 8; this.direction = dirs[newIndex]; } initPattern() { const w = this.canvas.width; const h = this.canvas.height; const length = w; const cfg = this.config; this.imageData = this.ctx.createImageData(w, h); for (let y = 0; y < h; y++) { for (let x = 0; x < w; x++) { let color; // 2D patterns need both x and y if (cfg.pattern === 'checkerboard') { const cellX = Math.floor(x / (cfg.cellSize || 10)); const cellY = Math.floor(y / (cfg.cellSize || 10)); color = ((cellX + cellY) % 2 === 0) ? this.fgRGB : this.bgRGB; } else if (cfg.pattern === 'random-blocks') { const cellX = Math.floor(x / (cfg.cellSize || 10)); const cellY = Math.floor(y / (cfg.cellSize || 10)); const seed = cellX * 73856093 ^ cellY * 19349663; const blockRandom = Math.sin(seed + this.sourceParams.seed1) * 43758.5453; color = (blockRandom - Math.floor(blockRandom)) > 0.5 ? this.fgRGB : this.bgRGB; } else { // 1D patterns color = this.getSourceValue(x, length); } const idx = (y * w + x) * 4; this.imageData.data[idx] = color.r; this.imageData.data[idx + 1] = color.g; this.imageData.data[idx + 2] = color.b; this.imageData.data[idx + 3] = Math.round(this.opacity * 255); } } this.ctx.putImageData(this.imageData, 0, 0); } smear() { if (!this.imageData) return; const cfg = this.config; const data = this.imageData.data; const w = this.canvas.width; const h = this.canvas.height; const newData = this.ctx.createImageData(w, h); const newPixels = newData.data; const mode = cfg.smearMode || 'replace'; const intensity = cfg.trailIntensity || 0.85; for (let y = 0; y < h; y++) { for (let x = 0; x < w; x++) { let srcX = x - this.direction.dx * cfg.smearAmount; let srcY = y - this.direction.dy * cfg.smearAmount; srcX = (srcX + w) % w; srcY = (srcY + h) % h; const srcIdx = (srcY * w + srcX) * 4; const dstIdx = (y * w + x) * 4; if (mode === 'trail') { newPixels[dstIdx] = data[srcIdx] * intensity + data[dstIdx] * (1 - intensity); newPixels[dstIdx + 1] = data[srcIdx + 1] * intensity + data[dstIdx + 1] * (1 - intensity); newPixels[dstIdx + 2] = data[srcIdx + 2] * intensity + data[dstIdx + 2] * (1 - intensity); newPixels[dstIdx + 3] = Math.round(this.opacity * 255); } else { newPixels[dstIdx] = data[srcIdx]; newPixels[dstIdx + 1] = data[srcIdx + 1]; newPixels[dstIdx + 2] = data[srcIdx + 2]; newPixels[dstIdx + 3] = Math.round(this.opacity * 255); } } } this.imageData = newData; this.ctx.putImageData(this.imageData, 0, 0); } start() { const animate = (timestamp) => { if (!this.lastDirectionChange) this.lastDirectionChange = timestamp; if (!this.lastSourceTime) this.lastSourceTime = timestamp; if (this.enableDirectionChange && timestamp - this.lastDirectionChange >= this.directionChangeInterval) { this.changeDirection(); this.lastDirectionChange = timestamp; this.directionChangeInterval = 1000 + Math.random() * 4000; } if (timestamp - this.lastSourceTime >= (this.config.sourceInterval || 1000)) { this.generateSourceEdge(); this.lastSourceTime = timestamp; } this.smear(); setTimeout(() => requestAnimationFrame(animate), 1000 / this.config.speed); }; requestAnimationFrame(animate); } } partitions.forEach(config => new SmearPartition(config)); </script> </body> </html>
:-) Thought-mass (10⁻²⁷ kg) ↓ Creates minimal spacetime perturbation ↓ But perturbation is COHERENT (phase-locked photons) ↓ Coherence = distinguishable from noise ↓ Acts as "timestamp + location" in 4D spacetime I Love You
<!doctype html><html><head><meta charset="utf-8"><title>smear</title><style> * { margin: 0; padding: 0; box-sizing: border-box; } body, html { width: 100%; height: 100%; overflow: hidden; background: #000; } smear-partition { display: block; width: 100%; height: 100%; position: relative; } smear-canvas { display: block; position: absolute; } smear-canvas canvas { display: block; width: 100%; height: 100%; image-rendering: pixelated; image-rendering: -moz-crisp-edges; image-rendering: crisp-edges; -ms-interpolation-mode: nearest-neighbor; } .smear-container { position: absolute; overflow: hidden; } .smear-container canvas { display: block; width: 100%; height: 100%; image-rendering: pixelated; image-rendering: crisp-edges; } </style></head><body style="margin:0;background-color:black;width:100vw;height:100vh;overflow:hidden;"><div id="puzzle-container"><div class="smear-container" data-x="0" data-y="0" data-width="1" data-height="0.3602776073619632" data-start-edge="left" data-speed="70" data-source-interval="1743" data-pixel-size="3" data-color-fg="#0000FF" data-color-bg="#FF69B4" data-source-type="perlin" style="left: 0px; top: 0px; width: 652px; height: 234.901px;"><canvas></canvas></div><div class="smear-container" data-x="0" data-y="0.3602776073619632" data-width="0.14402806748466257" data-height="0.1385717791411043" data-start-edge="right" data-speed="63" data-source-interval="647" data-pixel-size="5" data-color-fg="#FFFFFF" data-color-bg="#FF00CC" data-source-type="perlin" style="left: 0px; top: 234.901px; width: 93.9063px; height: 90.3488px;"><canvas></canvas></div><div class="smear-container" data-x="0.14402806748466257" data-y="0.3602776073619632" data-width="0.6311932515337424" data-height="0.1385717791411043" data-start-edge="left" data-speed="89" data-source-interval="949" data-pixel-size="6" data-color-fg="#0000FF" data-color-bg="#FF69B4" data-source-type="perlin" style="left: 93.9063px; top: 234.901px; width: 411.538px; height: 90.3488px;"><canvas></canvas></div><div class="smear-container" data-x="0.7752223926380368" data-y="0.3602776073619632" data-width="0.2247776073619632" data-height="0.1385717791411043" data-start-edge="bottom" data-speed="83" data-source-interval="1298" data-pixel-size="5" data-color-fg="#FFFFFF" data-color-bg="#CCCCCC" data-source-type="perlin" style="left: 505.445px; top: 234.901px; width: 146.555px; height: 90.3488px;"><canvas></canvas></div><div class="smear-container" data-x="0" data-y="0.4988496932515337" data-width="0.5458220858895705" data-height="0.5011503067484663" data-start-edge="bottom" data-speed="94" data-source-interval="1163" data-pixel-size="2" data-color-fg="#333333" data-color-bg="#000000" data-source-type="perlin" style="left: 0px; top: 325.25px; width: 355.876px; height: 326.75px;"><canvas></canvas></div><div class="smear-container" data-x="0.5458220858895705" data-y="0.4988496932515337" data-width="0.45417791411042946" data-height="0.5011503067484663" data-start-edge="right" data-speed="55" data-source-interval="545" data-pixel-size="6" data-color-fg="#FF8000" data-color-bg="#000000" data-source-type="perlin" style="left: 355.876px; top: 325.25px; width: 296.124px; height: 326.75px;"><canvas></canvas></div></div><script> class SmearCanvas { constructor(c) { this.container = c; this.canvas = c.querySelector("canvas") || document.createElement("canvas"); if (!c.querySelector("canvas")) c.appendChild(this.canvas); this.ctx = this.canvas.getContext("2d"); this.ctx.imageSmoothingEnabled = false; this.imageData = null; this.lastTime = 0; this.animationId = null; this.speed = parseInt(c.dataset.speed) || 50; this.pixelSize = parseInt(c.dataset.pixelSize) || 2; this.sourceInterval = parseInt(c.dataset.sourceInterval) || 1000; this.colorFg = c.dataset.colorFg || "#FFFFFF"; this.colorBg = c.dataset.colorBg || "#000000"; this.sourceType = c.dataset.sourceType || "noise"; this.startEdge = c.dataset.startEdge || "top"; this.fgRGB = this.hexToRGB(this.colorFg); this.bgRGB = this.hexToRGB(this.colorBg); this.moveSpeed = (1000 / 60) / this.speed; this.subPixelX = 0; this.subPixelY = 0; this.leadX = 0; this.leadY = 0; this.initDirection(); this.lastDirectionChange = 0; this.nextDirectionInterval = this.randomInterval(); this.sourceParams = this.generateSourceParams(); this.lastSourceTime = 0; this.resize(); this.initCanvas(); this.generateSourceEdge(); this.initLeadPosition(); this.startAnimation(); this.resizeObserver = new ResizeObserver(() => this.resize()); this.resizeObserver.observe(this.container); } generateSourceParams() { return { steps: 3 + Math.floor(Math.random() * 6), stripeWidth: 2 + Math.floor(Math.random() * 8), checkSize: 1 + Math.floor(Math.random() * 4), phase: 0, dashLength: 3 + Math.floor(Math.random() * 10), gapLength: 2 + Math.floor(Math.random() * 6), density: 0.05 + Math.random() * 0.25, frequency: 1 + Math.random() * 4, sinePhase: Math.random() * Math.PI * 2, seed1: Math.random() * 100, seed2: Math.random() * 100, seed3: Math.random() * 100, counter: Math.floor(Math.random() * 65536), caRule: Math.random() > 0.5 ? 30 : 110 }; } initDirection() { switch (this.startEdge) { case "top": this.dx = 0; this.dy = 1; break; case "bottom": this.dx = 0; this.dy = -1; break; case "left": this.dx = 1; this.dy = 0; break; case "right": this.dx = -1; this.dy = 0; break; default: this.dx = 0; this.dy = 1; } } initLeadPosition() { switch (this.startEdge) { case "top": this.leadX = Math.floor(this.internalWidth / 2); this.leadY = 1; break; case "bottom": this.leadX = Math.floor(this.internalWidth / 2); this.leadY = this.internalHeight - 2; break; case "left": this.leadX = 1; this.leadY = Math.floor(this.internalHeight / 2); break; case "right": this.leadX = this.internalWidth - 2; this.leadY = Math.floor(this.internalHeight / 2); break; } } resize() { var rect = this.container.getBoundingClientRect(); if (rect.width === 0 || rect.height === 0) return; this.internalWidth = Math.ceil(rect.width / this.pixelSize); this.internalHeight = Math.ceil(rect.height / this.pixelSize); var oldImageData = this.imageData; var oldWidth = this.canvas.width; var oldHeight = this.canvas.height; this.canvas.width = this.internalWidth; this.canvas.height = this.internalHeight; this.imageData = this.ctx.createImageData(this.internalWidth, this.internalHeight); if (oldImageData && oldWidth > 0 && oldHeight > 0) { var minW = Math.min(oldWidth, this.internalWidth); var minH = Math.min(oldHeight, this.internalHeight); for (var y = 0; y < minH; y++) { for (var x = 0; x < minW; x++) { var oi = (y * oldWidth + x) * 4; var ni = (y * this.internalWidth + x) * 4; this.imageData.data[ni] = oldImageData.data[oi]; this.imageData.data[ni + 1] = oldImageData.data[oi + 1]; this.imageData.data[ni + 2] = oldImageData.data[oi + 2]; this.imageData.data[ni + 3] = oldImageData.data[oi + 3]; } } } } hexToRGB(hex) { var r = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex); return r ? { r: parseInt(r[1], 16), g: parseInt(r[2], 16), b: parseInt(r[3], 16) } : { r: 255, g: 255, b: 255 }; } lerpColor(t) { return { r: Math.round(this.bgRGB.r + (this.fgRGB.r - this.bgRGB.r) * t), g: Math.round(this.bgRGB.g + (this.fgRGB.g - this.bgRGB.g) * t), b: Math.round(this.bgRGB.b + (this.fgRGB.b - this.bgRGB.b) * t) }; } getSourceValue(pos, length) { var t = pos / length; switch (this.sourceType) { case "noise": return Math.random() > 0.5 ? this.fgRGB : this.bgRGB; case "linear-gradient": return this.lerpColor(t); case "stepped-gradient": var steps = this.sourceParams.steps || 5; return this.lerpColor(Math.floor(t * steps) / (steps - 1)); case "random-gradient": if (!this.gradientCache || this.gradientCache.length !== length) this.generateRandomGradient(length); return this.lerpColor(this.gradientCache[pos]); case "stripes": return (Math.floor(pos / (this.sourceParams.stripeWidth || 4)) % 2 === 0) ? this.fgRGB : this.bgRGB; case "checkerboard": return ((Math.floor(pos / (this.sourceParams.checkSize || 2)) + (this.sourceParams.phase || 0)) % 2 === 0) ? this.fgRGB : this.bgRGB; case "dashes": var cycle = (this.sourceParams.dashLength || 6) + (this.sourceParams.gapLength || 3); return (pos % cycle < (this.sourceParams.dashLength || 6)) ? this.fgRGB : this.bgRGB; case "dots": return Math.random() < (this.sourceParams.density || 0.15) ? this.fgRGB : this.bgRGB; case "sine": var sv = (Math.sin((t * (this.sourceParams.frequency || 2) * Math.PI * 2) + (this.sourceParams.sinePhase || 0)) + 1) / 2; return this.lerpColor(sv); case "perlin": var p1 = Math.sin(t * 3.7 + this.sourceParams.seed1) * 0.5; var p2 = Math.sin(t * 7.3 + this.sourceParams.seed2) * 0.25; var p3 = Math.sin(t * 13.1 + this.sourceParams.seed3) * 0.125; return this.lerpColor(Math.max(0, Math.min(1, (p1 + p2 + p3 + 0.875) / 1.75))); case "binary-counter": return ((this.sourceParams.counter >> (pos % 16)) & 1) ? this.fgRGB : this.bgRGB; case "cellular-automata": if (!this.caState || this.caState.length !== length) this.initCellularAutomata(length); return this.caState[pos] ? this.fgRGB : this.bgRGB; default: return Math.random() > 0.5 ? this.fgRGB : this.bgRGB; } } generateRandomGradient(length) { var np = 3 + Math.floor(Math.random() * 4); var cp = [0]; for (var i = 1; i < np - 1; i++) cp.push(Math.random()); cp.push(1); cp.sort((a, b) => a - b); var cv = cp.map(() => Math.random()); this.gradientCache = []; for (var i = 0; i < length; i++) { var t = i / length; var si = 0; for (var j = 0; j < cp.length - 1; j++) { if (t >= cp[j] && t <= cp[j + 1]) { si = j; break; } } var st = (t - cp[si]) / (cp[si + 1] - cp[si]); this.gradientCache.push(cv[si] + (cv[si + 1] - cv[si]) * st); } } initCellularAutomata(length) { this.caState = []; for (var i = 0; i < length; i++) this.caState.push(Math.random() > 0.5); } evolveCellularAutomata() { if (!this.caState) return; var rule = this.sourceParams.caRule || 30; var os = [...this.caState]; var len = this.caState.length; for (var i = 0; i < len; i++) { var p = (os[(i - 1 + len) % len] ? 4 : 0) + (os[i] ? 2 : 0) + (os[(i + 1) % len] ? 1 : 0); this.caState[i] = ((rule >> p) & 1) === 1; } } updateSourceParams() { switch (this.sourceType) { case "checkerboard": this.sourceParams.phase = (this.sourceParams.phase + 1) % 2; break; case "sine": this.sourceParams.sinePhase += 0.5; break; case "binary-counter": this.sourceParams.counter++; break; case "cellular-automata": this.evolveCellularAutomata(); break; case "random-gradient": this.gradientCache = null; break; case "perlin": this.sourceParams.seed1 += 0.3; this.sourceParams.seed2 += 0.2; this.sourceParams.seed3 += 0.1; break; } } randomInterval() { return 100 + Math.random() * 900; } changeDirection() { var dirs = [[0, 1], [1, 1], [1, 0], [1, -1], [0, -1], [-1, -1], [-1, 0], [-1, 1]]; var idx = dirs.findIndex(d => d[0] === this.dx && d[1] === this.dy); if (idx === -1) idx = 0; idx = Math.random() > 0.5 ? (idx + 1) % 8 : (idx + 7) % 8; this.dx = dirs[idx][0]; this.dy = dirs[idx][1]; } initCanvas() { if (!this.imageData) return; var data = this.imageData.data; var w = this.internalWidth, h = this.internalHeight; var isH = (this.startEdge === "top" || this.startEdge === "bottom"); for (var y = 0; y < h; y++) { for (var x = 0; x < w; x++) { var idx = (y * w + x) * 4; var col = this.getSourceValue(isH ? x : y, isH ? w : h); data[idx] = col.r; data[idx + 1] = col.g; data[idx + 2] = col.b; data[idx + 3] = 255; } } this.ctx.putImageData(this.imageData, 0, 0); } generateSourceEdge() { if (!this.imageData) return; this.updateSourceParams(); var data = this.imageData.data; var w = this.internalWidth, h = this.internalHeight; var gen = (getIdx, len) => { for (var i = 0; i < len; i++) { var idx = getIdx(i); var c = this.getSourceValue(i, len); data[idx] = c.r; data[idx + 1] = c.g; data[idx + 2] = c.b; data[idx + 3] = 255; } }; switch (this.startEdge) { case "top": gen(x => x * 4, w); break; case "bottom": gen(x => ((h - 1) * w + x) * 4, w); break; case "left": gen(y => (y * w) * 4, h); break; case "right": gen(y => (y * w + (w - 1)) * 4, h); break; } } getSourceEdgeCoord(x, y) { switch (this.startEdge) { case "top": return y === 0; case "bottom": return y === this.internalHeight - 1; case "left": return x === 0; case "right": return x === this.internalWidth - 1; } return false; } smear() { if (!this.imageData) return; var data = this.imageData.data; var w = this.internalWidth, h = this.internalHeight; this.subPixelX += this.dx * this.moveSpeed; this.subPixelY += this.dy * this.moveSpeed; var moveX = Math.trunc(this.subPixelX), moveY = Math.trunc(this.subPixelY); if (moveX === 0 && moveY === 0) return; this.subPixelX -= moveX; this.subPixelY -= moveY; this.leadX += moveX; this.leadY += moveY; if (this.leadX <= 0 || this.leadX >= w - 1) { this.dx = -this.dx; this.leadX = Math.max(0, Math.min(w - 1, this.leadX)); } if (this.leadY <= 0 || this.leadY >= h - 1) { this.dy = -this.dy; this.leadY = Math.max(0, Math.min(h - 1, this.leadY)); } var oldData = new Uint8ClampedArray(data); for (var y = 0; y < h; y++) { for (var x = 0; x < w; x++) { if (this.getSourceEdgeCoord(x, y)) continue; var srcX = Math.max(0, Math.min(w - 1, x - moveX)); var srcY = Math.max(0, Math.min(h - 1, y - moveY)); var dstIdx = (y * w + x) * 4, srcIdx = (srcY * w + srcX) * 4; data[dstIdx] = oldData[srcIdx]; data[dstIdx + 1] = oldData[srcIdx + 1]; data[dstIdx + 2] = oldData[srcIdx + 2]; data[dstIdx + 3] = oldData[srcIdx + 3]; } } } startAnimation() { var fi = 1000 / 60; var animate = (ts) => { if (!this.lastTime) this.lastTime = ts; if (!this.lastSourceTime) this.lastSourceTime = ts; if (!this.lastDirectionChange) this.lastDirectionChange = ts; if (ts - this.lastDirectionChange >= this.nextDirectionInterval) { this.changeDirection(); this.lastDirectionChange = ts; this.nextDirectionInterval = this.randomInterval(); } if (ts - this.lastSourceTime >= this.sourceInterval) { this.generateSourceEdge(); this.lastSourceTime = ts; } if (ts - this.lastTime >= fi) { this.smear(); if (this.imageData) this.ctx.putImageData(this.imageData, 0, 0); this.lastTime = ts; } this.animationId = requestAnimationFrame(animate); }; this.animationId = requestAnimationFrame(animate); } } function layoutSmears() { var vw = window.innerWidth, vh = window.innerHeight; document.querySelectorAll(".smear-container").forEach(function(div) { var x = parseFloat(div.dataset.x || 0); var y = parseFloat(div.dataset.y || 0); var w = parseFloat(div.dataset.width || 0); var h = parseFloat(div.dataset.height || 0); div.style.left = (x * vw) + "px"; div.style.top = (y * vh) + "px"; div.style.width = (w * vw) + "px"; div.style.height = (h * vh) + "px"; }); } function initSmears() { document.querySelectorAll(".smear-container").forEach(function(c) { if (!c._smearInstance) c._smearInstance = new SmearCanvas(c); }); } window.addEventListener("load", function() { layoutSmears(); initSmears(); }); window.addEventListener("resize", layoutSmears); layoutSmears(); initSmears(); </script></body></html>
<!doctype html><html><head><meta charset="utf-8"><title>smear</title><style> * { margin: 0; padding: 0; box-sizing: border-box; } body, html { width: 100%; height: 100%; overflow: hidden; background: #000; } smear-partition { display: block; width: 100%; height: 100%; position: relative; } smear-canvas { display: block; position: absolute; } smear-canvas canvas { display: block; width: 100%; height: 100%; image-rendering: pixelated; image-rendering: -moz-crisp-edges; image-rendering: crisp-edges; -ms-interpolation-mode: nearest-neighbor; } .smear-container { position: absolute; overflow: hidden; } .smear-container canvas { display: block; width: 100%; height: 100%; image-rendering: pixelated; image-rendering: crisp-edges; } </style></head><body style="margin:0;background-color:black;width:100vw;height:100vh;overflow:hidden;"><div id="puzzle-container"><div class="smear-container" data-x="0" data-y="0" data-width="0.21205061349693252" data-height="0.25637576687116564" data-start-edge="left" data-speed="26" data-source-interval="1152" data-pixel-size="2" data-color-fg="#0000FF" data-color-bg="#000000" data-source-type="sine" style="left: 0px; top: 0px; width: 138.257px; height: 167.157px;"><canvas></canvas></div><div class="smear-container" data-x="0.21205061349693252" data-y="0" data-width="0.0876122699386503" data-height="0.25637576687116564" data-start-edge="right" data-speed="30" data-source-interval="727" data-pixel-size="6" data-color-fg="#333333" data-color-bg="#000000" data-source-type="sine" style="left: 138.257px; top: 0px; width: 57.1232px; height: 167.157px;"><canvas></canvas></div><div class="smear-container" data-x="0" data-y="0.25637576687116564" data-width="0.29966257668711654" data-height="0.19603987730061348" data-start-edge="right" data-speed="68" data-source-interval="517" data-pixel-size="4" data-color-fg="#333333" data-color-bg="#000000" data-source-type="sine" style="left: 0px; top: 167.157px; width: 195.38px; height: 127.818px;"><canvas></canvas></div><div class="smear-container" data-x="0" data-y="0.45241564417177915" data-width="0.29966257668711654" data-height="0.06521058282208589" data-start-edge="bottom" data-speed="97" data-source-interval="1875" data-pixel-size="4" data-color-fg="#333333" data-color-bg="#000000" data-source-type="sine" style="left: 0px; top: 294.975px; width: 195.38px; height: 42.5173px;"><canvas></canvas></div><div class="smear-container" data-x="0.29966257668711654" data-y="0" data-width="0.24288957055214724" data-height="0.12323588957055215" data-start-edge="top" data-speed="43" data-source-interval="1065" data-pixel-size="6" data-color-fg="#333333" data-color-bg="#000000" data-source-type="sine" style="left: 195.38px; top: 0px; width: 158.364px; height: 80.3498px;"><canvas></canvas></div><div class="smear-container" data-x="0.29966257668711654" data-y="0.12323588957055215" data-width="0.24288957055214724" data-height="0.15419631901840491" data-start-edge="left" data-speed="46" data-source-interval="1541" data-pixel-size="6" data-color-fg="#0000FF" data-color-bg="#000000" data-source-type="sine" style="left: 195.38px; top: 80.3498px; width: 158.364px; height: 100.536px;"><canvas></canvas></div><div class="smear-container" data-x="0.29966257668711654" data-y="0.277430981595092" data-width="0.12175613496932516" data-height="0.24019478527607363" data-start-edge="left" data-speed="38" data-source-interval="529" data-pixel-size="6" data-color-fg="#333333" data-color-bg="#000000" data-source-type="sine" style="left: 195.38px; top: 180.885px; width: 79.385px; height: 156.607px;"><canvas></canvas></div><div class="smear-container" data-x="0.4214187116564417" data-y="0.277430981595092" data-width="0.12113374233128835" data-height="0.24019478527607363" data-start-edge="left" data-speed="37" data-source-interval="1140" data-pixel-size="6" data-color-fg="#0000FF" data-color-bg="#000000" data-source-type="sine" style="left: 274.765px; top: 180.885px; width: 78.9792px; height: 156.607px;"><canvas></canvas></div><div class="smear-container" data-x="0" data-y="0.5176257668711657" data-width="0.06982223926380368" data-height="0.23997699386503069" data-start-edge="top" data-speed="75" data-source-interval="1683" data-pixel-size="6" data-color-fg="#333333" data-color-bg="#000000" data-source-type="sine" style="left: 0px; top: 337.492px; width: 45.5241px; height: 156.465px;"><canvas></canvas></div><div class="smear-container" data-x="0.06982223926380368" data-y="0.5176257668711657" data-width="0.21746779141104292" data-height="0.23997699386503069" data-start-edge="left" data-speed="61" data-source-interval="1871" data-pixel-size="2" data-color-fg="#333333" data-color-bg="#000000" data-source-type="sine" style="left: 45.5241px; top: 337.492px; width: 141.789px; height: 156.465px;"><canvas></canvas></div><div class="smear-container" data-x="0" data-y="0.7576027607361963" data-width="0.2872898773006135" data-height="0.17558742331288343" data-start-edge="right" data-speed="31" data-source-interval="1264" data-pixel-size="3" data-color-fg="#0000FF" data-color-bg="#000000" data-source-type="sine" style="left: 0px; top: 493.957px; width: 187.313px; height: 114.483px;"><canvas></canvas></div><div class="smear-container" data-x="0" data-y="0.9331901840490798" data-width="0.2872898773006135" data-height="0.06680981595092025" data-start-edge="right" data-speed="55" data-source-interval="1160" data-pixel-size="1" data-color-fg="#333333" data-color-bg="#000000" data-source-type="sine" style="left: 0px; top: 608.44px; width: 187.313px; height: 43.56px;"><canvas></canvas></div><div class="smear-container" data-x="0.2872898773006135" data-y="0.5176257668711657" data-width="0.09905598159509203" data-height="0.24252300613496933" data-start-edge="top" data-speed="65" data-source-interval="1888" data-pixel-size="5" data-color-fg="#0000FF" data-color-bg="#000000" data-source-type="sine" style="left: 187.313px; top: 337.492px; width: 64.5845px; height: 158.125px;"><canvas></canvas></div><div class="smear-container" data-x="0.3863466257668712" data-y="0.5176257668711657" data-width="0.15620705521472392" data-height="0.24252300613496933" data-start-edge="right" data-speed="48" data-source-interval="1998" data-pixel-size="3" data-color-fg="#0000FF" data-color-bg="#000000" data-source-type="sine" style="left: 251.898px; top: 337.492px; width: 101.847px; height: 158.125px;"><canvas></canvas></div><div class="smear-container" data-x="0.2872898773006135" data-y="0.760148773006135" data-width="0.069240490797546" data-height="0.13095414110429446" data-start-edge="left" data-speed="90" data-source-interval="1410" data-pixel-size="1" data-color-fg="#333333" data-color-bg="#000000" data-source-type="sine" style="left: 187.313px; top: 495.617px; width: 45.1448px; height: 85.3821px;"><canvas></canvas></div><div class="smear-container" data-x="0.2872898773006135" data-y="0.8911027607361963" data-width="0.069240490797546" data-height="0.10889647239263804" data-start-edge="bottom" data-speed="97" data-source-interval="1247" data-pixel-size="2" data-color-fg="#0000FF" data-color-bg="#000000" data-source-type="sine" style="left: 187.313px; top: 580.999px; width: 45.1448px; height: 71.0005px;"><canvas></canvas></div><div class="smear-container" data-x="0.35653067484662576" data-y="0.760148773006135" data-width="0.18602147239263803" data-height="0.23985122699386505" data-start-edge="top" data-speed="87" data-source-interval="1052" data-pixel-size="4" data-color-fg="#333333" data-color-bg="#000000" data-source-type="sine" style="left: 232.458px; top: 495.617px; width: 121.286px; height: 156.383px;"><canvas></canvas></div><div class="smear-container" data-x="0.5425521472392638" data-y="0" data-width="0.14410153374233128" data-height="0.16962423312883435" data-start-edge="top" data-speed="80" data-source-interval="1409" data-pixel-size="2" data-color-fg="#0000FF" data-color-bg="#000000" data-source-type="sine" style="left: 353.744px; top: 0px; width: 93.9542px; height: 110.595px;"><canvas></canvas></div><div class="smear-container" data-x="0.6866533742331288" data-y="0" data-width="0.11210567484662577" data-height="0.16962423312883435" data-start-edge="left" data-speed="50" data-source-interval="687" data-pixel-size="2" data-color-fg="#333333" data-color-bg="#000000" data-source-type="sine" style="left: 447.698px; top: 0px; width: 73.0929px; height: 110.595px;"><canvas></canvas></div><div class="smear-container" data-x="0.5425521472392638" data-y="0.16962423312883435" data-width="0.2562070552147239" data-height="0.08757285276073619" data-start-edge="bottom" data-speed="81" data-source-interval="641" data-pixel-size="1" data-color-fg="#0000FF" data-color-bg="#000000" data-source-type="sine" style="left: 353.744px; top: 110.595px; width: 167.047px; height: 57.0975px;"><canvas></canvas></div><div class="smear-container" data-x="0.7987592024539878" data-y="0" data-width="0.20124079754601226" data-height="0.2571963190184049" data-start-edge="right" data-speed="97" data-source-interval="1047" data-pixel-size="2" data-color-fg="#333333" data-color-bg="#000000" data-source-type="sine" style="left: 520.791px; top: 0px; width: 131.209px; height: 167.692px;"><canvas></canvas></div><div class="smear-container" data-x="0.5425521472392638" data-y="0.2571963190184049" data-width="0.24466411042944783" data-height="0.03805828220858896" data-start-edge="top" data-speed="70" data-source-interval="1884" data-pixel-size="2" data-color-fg="#333333" data-color-bg="#000000" data-source-type="sine" style="left: 353.744px; top: 167.692px; width: 159.521px; height: 24.814px;"><canvas></canvas></div><div class="smear-container" data-x="0.5425521472392638" data-y="0.2952546012269939" data-width="0.24466411042944783" data-height="0.20967638036809816" data-start-edge="left" data-speed="85" data-source-interval="705" data-pixel-size="5" data-color-fg="#333333" data-color-bg="#000000" data-source-type="sine" style="left: 353.744px; top: 192.506px; width: 159.521px; height: 136.709px;"><canvas></canvas></div><div class="smear-container" data-x="0.7872162576687116" data-y="0.2571963190184049" data-width="0.21278374233128836" data-height="0.21962269938650306" data-start-edge="top" data-speed="94" data-source-interval="527" data-pixel-size="6" data-color-fg="#333333" data-color-bg="#000000" data-source-type="sine" style="left: 513.265px; top: 167.692px; width: 138.735px; height: 143.194px;"><canvas></canvas></div><div class="smear-container" data-x="0.7872162576687116" data-y="0.47681901840490803" data-width="0.21278374233128836" data-height="0.02811211656441718" data-start-edge="right" data-speed="81" data-source-interval="599" data-pixel-size="1" data-color-fg="#333333" data-color-bg="#000000" data-source-type="sine" style="left: 513.265px; top: 310.886px; width: 138.735px; height: 18.3291px;"><canvas></canvas></div><div class="smear-container" data-x="0.5425521472392638" data-y="0.504930981595092" data-width="0.18504294478527608" data-height="0.17830981595092024" data-start-edge="top" data-speed="61" data-source-interval="1884" data-pixel-size="4" data-color-fg="#0000FF" data-color-bg="#000000" data-source-type="sine" style="left: 353.744px; top: 329.215px; width: 120.648px; height: 116.258px;"><canvas></canvas></div><div class="smear-container" data-x="0.5425521472392638" data-y="0.6832407975460123" data-width="0.18504294478527608" data-height="0.0819463190184049" data-start-edge="bottom" data-speed="97" data-source-interval="973" data-pixel-size="1" data-color-fg="#0000FF" data-color-bg="#000000" data-source-type="sine" style="left: 353.744px; top: 445.473px; width: 120.648px; height: 53.429px;"><canvas></canvas></div><div class="smear-container" data-x="0.7275950920245399" data-y="0.504930981595092" data-width="0.1607760736196319" data-height="0.26025613496932515" data-start-edge="bottom" data-speed="88" data-source-interval="1510" data-pixel-size="1" data-color-fg="#333333" data-color-bg="#000000" data-source-type="sine" style="left: 474.392px; top: 329.215px; width: 104.826px; height: 169.687px;"><canvas></canvas></div><div class="smear-container" data-x="0.8883711656441717" data-y="0.504930981595092" data-width="0.11162898773006134" data-height="0.26025613496932515" data-start-edge="bottom" data-speed="80" data-source-interval="1660" data-pixel-size="2" data-color-fg="#333333" data-color-bg="#000000" data-source-type="sine" style="left: 579.218px; top: 329.215px; width: 72.7821px; height: 169.687px;"><canvas></canvas></div><div class="smear-container" data-x="0.5425521472392638" data-y="0.7651871165644172" data-width="0.18528220858895705" data-height="0.23481288343558285" data-start-edge="right" data-speed="50" data-source-interval="1031" data-pixel-size="3" data-color-fg="#0000FF" data-color-bg="#000000" data-source-type="sine" style="left: 353.744px; top: 498.902px; width: 120.804px; height: 153.098px;"><canvas></canvas></div><div class="smear-container" data-x="0.7278343558282209" data-y="0.7651871165644172" data-width="0.08497346625766872" data-height="0.23481288343558285" data-start-edge="left" data-speed="75" data-source-interval="961" data-pixel-size="5" data-color-fg="#333333" data-color-bg="#000000" data-source-type="sine" style="left: 474.548px; top: 498.902px; width: 55.4027px; height: 153.098px;"><canvas></canvas></div><div class="smear-container" data-x="0.812808282208589" data-y="0.7651871165644172" data-width="0.18719171779141106" data-height="0.058925153374233125" data-start-edge="right" data-speed="40" data-source-interval="1034" data-pixel-size="1" data-color-fg="#333333" data-color-bg="#000000" data-source-type="sine" style="left: 529.951px; top: 498.902px; width: 122.049px; height: 38.4192px;"><canvas></canvas></div><div class="smear-container" data-x="0.812808282208589" data-y="0.8241119631901841" data-width="0.18719171779141106" data-height="0.17588803680981596" data-start-edge="right" data-speed="95" data-source-interval="1867" data-pixel-size="1" data-color-fg="#333333" data-color-bg="#000000" data-source-type="sine" style="left: 529.951px; top: 537.321px; width: 122.049px; height: 114.679px;"><canvas></canvas></div></div><script> class SmearCanvas { constructor(c) { this.container = c; this.canvas = c.querySelector("canvas") || document.createElement("canvas"); if (!c.querySelector("canvas")) c.appendChild(this.canvas); this.ctx = this.canvas.getContext("2d"); this.ctx.imageSmoothingEnabled = false; this.imageData = null; this.lastTime = 0; this.animationId = null; this.speed = parseInt(c.dataset.speed) || 50; this.pixelSize = parseInt(c.dataset.pixelSize) || 2; this.sourceInterval = parseInt(c.dataset.sourceInterval) || 1000; this.colorFg = c.dataset.colorFg || "#FFFFFF"; this.colorBg = c.dataset.colorBg || "#000000"; this.sourceType = c.dataset.sourceType || "noise"; this.startEdge = c.dataset.startEdge || "top"; this.fgRGB = this.hexToRGB(this.colorFg); this.bgRGB = this.hexToRGB(this.colorBg); this.moveSpeed = (1000 / 60) / this.speed; this.subPixelX = 0; this.subPixelY = 0; this.leadX = 0; this.leadY = 0; this.initDirection(); this.lastDirectionChange = 0; this.nextDirectionInterval = this.randomInterval(); this.sourceParams = this.generateSourceParams(); this.lastSourceTime = 0; this.resize(); this.initCanvas(); this.generateSourceEdge(); this.initLeadPosition(); this.startAnimation(); this.resizeObserver = new ResizeObserver(() => this.resize()); this.resizeObserver.observe(this.container); } generateSourceParams() { return { steps: 3 + Math.floor(Math.random() * 6), stripeWidth: 2 + Math.floor(Math.random() * 8), checkSize: 1 + Math.floor(Math.random() * 4), phase: 0, dashLength: 3 + Math.floor(Math.random() * 10), gapLength: 2 + Math.floor(Math.random() * 6), density: 0.05 + Math.random() * 0.25, frequency: 1 + Math.random() * 4, sinePhase: Math.random() * Math.PI * 2, seed1: Math.random() * 100, seed2: Math.random() * 100, seed3: Math.random() * 100, counter: Math.floor(Math.random() * 65536), caRule: Math.random() > 0.5 ? 30 : 110 }; } initDirection() { switch (this.startEdge) { case "top": this.dx = 0; this.dy = 1; break; case "bottom": this.dx = 0; this.dy = -1; break; case "left": this.dx = 1; this.dy = 0; break; case "right": this.dx = -1; this.dy = 0; break; default: this.dx = 0; this.dy = 1; } } initLeadPosition() { switch (this.startEdge) { case "top": this.leadX = Math.floor(this.internalWidth / 2); this.leadY = 1; break; case "bottom": this.leadX = Math.floor(this.internalWidth / 2); this.leadY = this.internalHeight - 2; break; case "left": this.leadX = 1; this.leadY = Math.floor(this.internalHeight / 2); break; case "right": this.leadX = this.internalWidth - 2; this.leadY = Math.floor(this.internalHeight / 2); break; } } resize() { var rect = this.container.getBoundingClientRect(); if (rect.width === 0 || rect.height === 0) return; this.internalWidth = Math.ceil(rect.width / this.pixelSize); this.internalHeight = Math.ceil(rect.height / this.pixelSize); var oldImageData = this.imageData; var oldWidth = this.canvas.width; var oldHeight = this.canvas.height; this.canvas.width = this.internalWidth; this.canvas.height = this.internalHeight; this.imageData = this.ctx.createImageData(this.internalWidth, this.internalHeight); if (oldImageData && oldWidth > 0 && oldHeight > 0) { var minW = Math.min(oldWidth, this.internalWidth); var minH = Math.min(oldHeight, this.internalHeight); for (var y = 0; y < minH; y++) { for (var x = 0; x < minW; x++) { var oi = (y * oldWidth + x) * 4; var ni = (y * this.internalWidth + x) * 4; this.imageData.data[ni] = oldImageData.data[oi]; this.imageData.data[ni + 1] = oldImageData.data[oi + 1]; this.imageData.data[ni + 2] = oldImageData.data[oi + 2]; this.imageData.data[ni + 3] = oldImageData.data[oi + 3]; } } } } hexToRGB(hex) { var r = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex); return r ? { r: parseInt(r[1], 16), g: parseInt(r[2], 16), b: parseInt(r[3], 16) } : { r: 255, g: 255, b: 255 }; } lerpColor(t) { return { r: Math.round(this.bgRGB.r + (this.fgRGB.r - this.bgRGB.r) * t), g: Math.round(this.bgRGB.g + (this.fgRGB.g - this.bgRGB.g) * t), b: Math.round(this.bgRGB.b + (this.fgRGB.b - this.bgRGB.b) * t) }; } getSourceValue(pos, length) { var t = pos / length; switch (this.sourceType) { case "noise": return Math.random() > 0.5 ? this.fgRGB : this.bgRGB; case "linear-gradient": return this.lerpColor(t); case "stepped-gradient": var steps = this.sourceParams.steps || 5; return this.lerpColor(Math.floor(t * steps) / (steps - 1)); case "random-gradient": if (!this.gradientCache || this.gradientCache.length !== length) this.generateRandomGradient(length); return this.lerpColor(this.gradientCache[pos]); case "stripes": return (Math.floor(pos / (this.sourceParams.stripeWidth || 4)) % 2 === 0) ? this.fgRGB : this.bgRGB; case "checkerboard": return ((Math.floor(pos / (this.sourceParams.checkSize || 2)) + (this.sourceParams.phase || 0)) % 2 === 0) ? this.fgRGB : this.bgRGB; case "dashes": var cycle = (this.sourceParams.dashLength || 6) + (this.sourceParams.gapLength || 3); return (pos % cycle < (this.sourceParams.dashLength || 6)) ? this.fgRGB : this.bgRGB; case "dots": return Math.random() < (this.sourceParams.density || 0.15) ? this.fgRGB : this.bgRGB; case "sine": var sv = (Math.sin((t * (this.sourceParams.frequency || 2) * Math.PI * 2) + (this.sourceParams.sinePhase || 0)) + 1) / 2; return this.lerpColor(sv); case "perlin": var p1 = Math.sin(t * 3.7 + this.sourceParams.seed1) * 0.5; var p2 = Math.sin(t * 7.3 + this.sourceParams.seed2) * 0.25; var p3 = Math.sin(t * 13.1 + this.sourceParams.seed3) * 0.125; return this.lerpColor(Math.max(0, Math.min(1, (p1 + p2 + p3 + 0.875) / 1.75))); case "binary-counter": return ((this.sourceParams.counter >> (pos % 16)) & 1) ? this.fgRGB : this.bgRGB; case "cellular-automata": if (!this.caState || this.caState.length !== length) this.initCellularAutomata(length); return this.caState[pos] ? this.fgRGB : this.bgRGB; default: return Math.random() > 0.5 ? this.fgRGB : this.bgRGB; } } generateRandomGradient(length) { var np = 3 + Math.floor(Math.random() * 4); var cp = [0]; for (var i = 1; i < np - 1; i++) cp.push(Math.random()); cp.push(1); cp.sort((a, b) => a - b); var cv = cp.map(() => Math.random()); this.gradientCache = []; for (var i = 0; i < length; i++) { var t = i / length; var si = 0; for (var j = 0; j < cp.length - 1; j++) { if (t >= cp[j] && t <= cp[j + 1]) { si = j; break; } } var st = (t - cp[si]) / (cp[si + 1] - cp[si]); this.gradientCache.push(cv[si] + (cv[si + 1] - cv[si]) * st); } } initCellularAutomata(length) { this.caState = []; for (var i = 0; i < length; i++) this.caState.push(Math.random() > 0.5); } evolveCellularAutomata() { if (!this.caState) return; var rule = this.sourceParams.caRule || 30; var os = [...this.caState]; var len = this.caState.length; for (var i = 0; i < len; i++) { var p = (os[(i - 1 + len) % len] ? 4 : 0) + (os[i] ? 2 : 0) + (os[(i + 1) % len] ? 1 : 0); this.caState[i] = ((rule >> p) & 1) === 1; } } updateSourceParams() { switch (this.sourceType) { case "checkerboard": this.sourceParams.phase = (this.sourceParams.phase + 1) % 2; break; case "sine": this.sourceParams.sinePhase += 0.5; break; case "binary-counter": this.sourceParams.counter++; break; case "cellular-automata": this.evolveCellularAutomata(); break; case "random-gradient": this.gradientCache = null; break; case "perlin": this.sourceParams.seed1 += 0.3; this.sourceParams.seed2 += 0.2; this.sourceParams.seed3 += 0.1; break; } } randomInterval() { return 100 + Math.random() * 900; } changeDirection() { var dirs = [[0, 1], [1, 1], [1, 0], [1, -1], [0, -1], [-1, -1], [-1, 0], [-1, 1]]; var idx = dirs.findIndex(d => d[0] === this.dx && d[1] === this.dy); if (idx === -1) idx = 0; idx = Math.random() > 0.5 ? (idx + 1) % 8 : (idx + 7) % 8; this.dx = dirs[idx][0]; this.dy = dirs[idx][1]; } initCanvas() { if (!this.imageData) return; var data = this.imageData.data; var w = this.internalWidth, h = this.internalHeight; var isH = (this.startEdge === "top" || this.startEdge === "bottom"); for (var y = 0; y < h; y++) { for (var x = 0; x < w; x++) { var idx = (y * w + x) * 4; var col = this.getSourceValue(isH ? x : y, isH ? w : h); data[idx] = col.r; data[idx + 1] = col.g; data[idx + 2] = col.b; data[idx + 3] = 255; } } this.ctx.putImageData(this.imageData, 0, 0); } generateSourceEdge() { if (!this.imageData) return; this.updateSourceParams(); var data = this.imageData.data; var w = this.internalWidth, h = this.internalHeight; var gen = (getIdx, len) => { for (var i = 0; i < len; i++) { var idx = getIdx(i); var c = this.getSourceValue(i, len); data[idx] = c.r; data[idx + 1] = c.g; data[idx + 2] = c.b; data[idx + 3] = 255; } }; switch (this.startEdge) { case "top": gen(x => x * 4, w); break; case "bottom": gen(x => ((h - 1) * w + x) * 4, w); break; case "left": gen(y => (y * w) * 4, h); break; case "right": gen(y => (y * w + (w - 1)) * 4, h); break; } } getSourceEdgeCoord(x, y) { switch (this.startEdge) { case "top": return y === 0; case "bottom": return y === this.internalHeight - 1; case "left": return x === 0; case "right": return x === this.internalWidth - 1; } return false; } smear() { if (!this.imageData) return; var data = this.imageData.data; var w = this.internalWidth, h = this.internalHeight; this.subPixelX += this.dx * this.moveSpeed; this.subPixelY += this.dy * this.moveSpeed; var moveX = Math.trunc(this.subPixelX), moveY = Math.trunc(this.subPixelY); if (moveX === 0 && moveY === 0) return; this.subPixelX -= moveX; this.subPixelY -= moveY; this.leadX += moveX; this.leadY += moveY; if (this.leadX <= 0 || this.leadX >= w - 1) { this.dx = -this.dx; this.leadX = Math.max(0, Math.min(w - 1, this.leadX)); } if (this.leadY <= 0 || this.leadY >= h - 1) { this.dy = -this.dy; this.leadY = Math.max(0, Math.min(h - 1, this.leadY)); } var oldData = new Uint8ClampedArray(data); for (var y = 0; y < h; y++) { for (var x = 0; x < w; x++) { if (this.getSourceEdgeCoord(x, y)) continue; var srcX = Math.max(0, Math.min(w - 1, x - moveX)); var srcY = Math.max(0, Math.min(h - 1, y - moveY)); var dstIdx = (y * w + x) * 4, srcIdx = (srcY * w + srcX) * 4; data[dstIdx] = oldData[srcIdx]; data[dstIdx + 1] = oldData[srcIdx + 1]; data[dstIdx + 2] = oldData[srcIdx + 2]; data[dstIdx + 3] = oldData[srcIdx + 3]; } } } startAnimation() { var fi = 1000 / 60; var animate = (ts) => { if (!this.lastTime) this.lastTime = ts; if (!this.lastSourceTime) this.lastSourceTime = ts; if (!this.lastDirectionChange) this.lastDirectionChange = ts; if (ts - this.lastDirectionChange >= this.nextDirectionInterval) { this.changeDirection(); this.lastDirectionChange = ts; this.nextDirectionInterval = this.randomInterval(); } if (ts - this.lastSourceTime >= this.sourceInterval) { this.generateSourceEdge(); this.lastSourceTime = ts; } if (ts - this.lastTime >= fi) { this.smear(); if (this.imageData) this.ctx.putImageData(this.imageData, 0, 0); this.lastTime = ts; } this.animationId = requestAnimationFrame(animate); }; this.animationId = requestAnimationFrame(animate); } } function layoutSmears() { var vw = window.innerWidth, vh = window.innerHeight; document.querySelectorAll(".smear-container").forEach(function(div) { var x = parseFloat(div.dataset.x || 0); var y = parseFloat(div.dataset.y || 0); var w = parseFloat(div.dataset.width || 0); var h = parseFloat(div.dataset.height || 0); div.style.left = (x * vw) + "px"; div.style.top = (y * vh) + "px"; div.style.width = (w * vw) + "px"; div.style.height = (h * vh) + "px"; }); } function initSmears() { document.querySelectorAll(".smear-container").forEach(function(c) { if (!c._smearInstance) c._smearInstance = new SmearCanvas(c); }); } window.addEventListener("load", function() { layoutSmears(); initSmears(); }); window.addEventListener("resize", layoutSmears); layoutSmears(); initSmears(); </script></body></html>
<!doctype html><html><head><meta charset="utf-8"><title>shards</title><style> :root { /* Pattern 1: 7 bands */ --color1: #bb44dd; --color2: #000; --pos1: 0%; --pos2: 8.33%; --pos3: 25%; --pos4: 41.67%; --pos5: 58.33%; --pos6: 75%; --pos7: 91.67%; /* Pattern 2: 5 bands */ --color2-1: #6486f5; --color2-2: #000; --pos2-1: 0%; --pos2-2: 12.5%; --pos2-3: 37.5%; --pos2-4: 62.5%; --pos2-5: 87.5%; /* Pattern 3: 3 bands */ --color3-1: #ffffff; --color3-2: #000; --color4-1: #ff00cc; --color4-2: #000; --pos3-1: 0%; --pos3-2: 50%; --pos3-3: 100%; } body { background-color: black; margin: 0; padding: 0; width: 100vw; height: 100vh; overflow: hidden; } .gradient-container { position: absolute; overflow: hidden; transition: all 0.3s ease; clip-path: var(--clip-path); /* Emboss effect */ box-shadow: inset 2px 2px 5px rgba(255, 255, 255, 0.4), inset -2px -2px 5px rgba(0, 0, 0, 0.4); /* Add more depth with a subtle border */ } .gradient-up { background-image: repeating-linear-gradient( to bottom, var(--color1) var(--pos1), var(--color2) var(--pos2), var(--color1) var(--pos3), var(--color2) var(--pos4), var(--color1) var(--pos5), var(--color2) var(--pos6), var(--color1) var(--pos7) ); animation: moveUpwards 5s linear infinite; } .gradient-down { background-image: repeating-linear-gradient( to bottom, var(--color2-1) var(--pos2-1), var(--color2-2) var(--pos2-2), var(--color2-1) var(--pos2-3), var(--color2-2) var(--pos2-4), var(--color2-1) var(--pos2-5) ); animation: moveDownwards 5s linear infinite; } .gradient-left { background-image: repeating-linear-gradient( to right, var(--color3-1) var(--pos3-1), var(--color3-2) var(--pos3-2), var(--color3-1) var(--pos3-3) ); animation: moveLeft 5s linear infinite; } .gradient-right { background-image: repeating-linear-gradient( to right, var(--color4-1) var(--pos1), var(--color4-2) var(--pos2), var(--color4-1) var(--pos3), var(--color4-2) var(--pos4), var(--color4-1) var(--pos5), var(--color4-2) var(--pos6), var(--color4-1) var(--pos7) ); animation: moveRight 5s linear infinite; } .strobe { background-color: #000; } @keyframes strobeEffect { 0% { opacity: 0; } 100% { opacity: 1; } } @keyframes moveUpwards { 0% { background-position: 0 100%; } 100% { background-position: 0 -100%; } } @keyframes moveDownwards { 0% { background-position: 0 -100%; } 100% { background-position: 0 100%; } } @keyframes moveLeft { 0% { background-position: 100% 0; } 100% { background-position: -100% 0; } } @keyframes moveRight { 0% { background-position: -100% 0; } 100% { background-position: 100% 0; } } :root{--color1:#000000;--color2:#000;--pos1:0%;--pos2:8.33%;--pos3:25%;--pos4:41.67%;--pos5:58.33%;--pos6:75%;--pos7:91.67%;--color2-1:#ff0000;--color2-2:#000;--pos2-1:0%;--pos2-2:12.5%;--pos2-3:37.5%;--pos2-4:62.5%;--pos2-5:87.5%;--color3-1:#783f7d;--color3-2:#000;--color4-1:#ff0000;--color4-2:#000;--pos3-1:0%;--pos3-2:50%;--pos3-3:100%;}:root{--color1: #000000; --color2-1: #ff0000; --color3-1: #783f7d; --color4-1: #ff0000;}</style></head><body style="margin:0;background-color:black;width:100vw;height:100vh;overflow:hidden;"><div id="puzzle-container"><div class="gradient-container gradient-right" data-x="0" data-y="0" data-width="0.41" data-height="0.63" style="left: 0px; top: 0px; width: 267.32px; height: 410.76px; --clip-path: polygon(0% 0%, 92% 0%, 97% 95%, 0% 106%); background-size: 534.64px 410.76px; animation-duration: 22s;"></div><div class="gradient-container gradient-up" data-x="0" data-y="0.63" data-width="0.3116" data-height="0.37" style="left: 0px; top: 410.76px; width: 203.163px; height: 241.24px; --clip-path: polygon(0% 11%, 92% 16%, 98% 100%, 0% 100%); background-size: 203.163px 482.48px; animation-duration: 52s;"></div><div class="gradient-container gradient-down" data-x="0.3116" data-y="0.63" data-width="0.0984" data-height="0.033299999999999996" style="left: 203.163px; top: 410.76px; width: 64.1568px; height: 21.7116px; --clip-path: polygon(-24% 183%, 88% -94%, 95% -48%, -25% -68%); background-size: 64.1568px 43.4232px; animation-duration: 22s;"></div><div class="gradient-container gradient-right" data-x="0.3116" data-y="0.6633" data-width="0.0984" data-height="0.043771000000000004" style="left: 203.163px; top: 432.472px; width: 64.1568px; height: 28.5387px; --clip-path: polygon(-25% -128%, 95% -113%, 80% 223%, 29% 111%); background-size: 128.314px 28.5387px; animation-duration: 70s;"></div><div class="gradient-container gradient-right" data-x="0.3116" data-y="0.707071" data-width="0.0984" data-height="0.28121184" style="left: 203.163px; top: 461.01px; width: 64.1568px; height: 183.35px; --clip-path: polygon(29% 2%, 80% 19%, 88% 100%, -23% 100%); background-size: 128.314px 183.35px; animation-duration: 80s;"></div><div class="gradient-container gradient-down" data-x="0.3116" data-y="0.98828284" data-width="0.0984" data-height="0.011717160000000046" style="left: 203.163px; top: 644.36px; width: 64.1568px; height: 7.63959px; --clip-path: polygon(-23% 0%, 88% 0%, 99% 100%, -8% 100%); background-size: 64.1568px 15.2792px; animation-duration: 78s;"></div><div class="gradient-container gradient-up" data-x="0.41" data-y="0" data-width="0.10278744" data-height="0.05" style="left: 267.32px; top: 0px; width: 67.0174px; height: 32.6px; --clip-path: polygon(-31% 0%, 97% 0%, 65% 91%, 21% -32%); background-size: 67.0174px 65.2px; animation-duration: 90s;"></div><div class="gradient-container gradient-up" data-x="0.51278744" data-y="0" data-width="0.0629940168" data-height="0.05" style="left: 334.337px; top: 0px; width: 41.0721px; height: 32.6px; --clip-path: polygon(-5% 0%, 188% 0%, 162% 33%, -57% 91%); background-size: 41.0721px 65.2px; animation-duration: 70s;"></div><div class="gradient-container gradient-left" data-x="0.5757814568" data-y="0" data-width="0.017767543199999996" data-height="0.05" style="left: 375.41px; top: 0px; width: 11.5844px; height: 32.6px; --clip-path: polygon(313% 0%, -280% 0%, 386% 141%, 220% 33%); background-size: 23.1689px 32.6px; animation-duration: 68s;"></div><div class="gradient-container gradient-left" data-x="0.593549" data-y="0" data-width="0.11735100000000001" data-height="0.05" style="left: 386.994px; top: 0px; width: 76.5129px; height: 32.6px; --clip-path: polygon(-58% 0%, 79% 0%, 135% -21%, 43% 141%); background-size: 153.026px 32.6px; animation-duration: 21s;"></div><div class="gradient-container gradient-right" data-x="0.7109" data-y="0" data-width="0.2891" data-height="0.05" style="left: 463.507px; top: 0px; width: 188.493px; height: 32.6px; --clip-path: polygon(-9% 0%, 100% 0%, 100% 95%, 14% -21%); background-size: 376.986px 32.6px; animation-duration: 11s;"></div><div class="gradient-container gradient-down" data-x="0.41" data-y="0.05" data-width="0.59" data-height="0.7125" style="left: 267.32px; top: 32.6px; width: 384.68px; height: 464.55px; --clip-path: polygon(4% -9%, 100% 0%, 100% 110%, 12% 93%); background-size: 384.68px 929.1px; animation-duration: 88s;"></div><div class="gradient-container gradient-down" data-x="0.41" data-y="0.7625000000000001" data-width="0.4425" data-height="0.23749999999999996" style="left: 267.32px; top: 497.15px; width: 288.51px; height: 154.85px; --clip-path: polygon(16% -20%, 108% 9%, 97% 100%, 0% 100%); background-size: 288.51px 309.7px; animation-duration: 8s;"></div><div class="gradient-container gradient-left" data-x="0.8524999999999999" data-y="0.7625000000000001" data-width="0.14750000000000002" data-height="0.18762499999999996" style="left: 555.83px; top: 497.15px; width: 96.17px; height: 122.331px; --clip-path: polygon(24% 12%, 100% 36%, 100% 113%, 4% 129%); background-size: 192.34px 122.331px; animation-duration: 62s;"></div><div class="gradient-container gradient-right" data-x="0.8524999999999999" data-y="0.950125" data-width="0.11357500000000002" data-height="0.04987499999999998" style="left: 555.83px; top: 619.481px; width: 74.0509px; height: 32.5185px; --clip-path: polygon(5% 108%, 38% 58%, 144% 100%, -10% 100%); background-size: 148.102px 32.5185px; animation-duration: 32s;"></div><div class="gradient-container gradient-left" data-x="0.9660749999999998" data-y="0.950125" data-width="0.033925000000000004" data-height="0.04987499999999998" style="left: 629.881px; top: 619.481px; width: 22.1191px; height: 32.5185px; --clip-path: polygon(-209% 58%, 100% 49%, 100% 100%, 149% 100%); background-size: 44.2382px 32.5185px; animation-duration: 76s;"></div></div><script>function layoutShards(){var vw=window.innerWidth;var vh=window.innerHeight;document.querySelectorAll(".gradient-container").forEach(function(div){var x=parseFloat(div.dataset.x||0);var y=parseFloat(div.dataset.y||0);var w=parseFloat(div.dataset.width||0);var h=parseFloat(div.dataset.height||0);div.style.left=(x*vw)+"px";div.style.top=(y*vh)+"px";div.style.width=(w*vw)+"px";div.style.height=(h*vh)+"px";if(div.classList.contains("gradient-left")||div.classList.contains("gradient-right")){div.style.backgroundSize=(w*vw*2)+"px "+(h*vh)+"px";}else{div.style.backgroundSize=(w*vw)+"px "+(h*vh*2)+"px";}});}window.addEventListener("resize",layoutShards);window.addEventListener("load",layoutShards);layoutShards();</script></body></html>
<!doctype html><html><head><meta charset="utf-8"><title>shards</title><style> :root { /* Pattern 1: 7 bands */ --color1: #bb44dd; --color2: #000; --pos1: 0%; --pos2: 8.33%; --pos3: 25%; --pos4: 41.67%; --pos5: 58.33%; --pos6: 75%; --pos7: 91.67%; /* Pattern 2: 5 bands */ --color2-1: #6486f5; --color2-2: #000; --pos2-1: 0%; --pos2-2: 12.5%; --pos2-3: 37.5%; --pos2-4: 62.5%; --pos2-5: 87.5%; /* Pattern 3: 3 bands */ --color3-1: #ffffff; --color3-2: #000; --color4-1: #ff00cc; --color4-2: #000; --pos3-1: 0%; --pos3-2: 50%; --pos3-3: 100%; } body { background-color: black; margin: 0; padding: 0; width: 100vw; height: 100vh; overflow: hidden; } .gradient-container { position: absolute; overflow: hidden; transition: all 0.3s ease; clip-path: var(--clip-path); /* Emboss effect */ box-shadow: inset 2px 2px 5px rgba(255, 255, 255, 0.4), inset -2px -2px 5px rgba(0, 0, 0, 0.4); /* Add more depth with a subtle border */ } .gradient-up { background-image: repeating-linear-gradient( to bottom, var(--color1) var(--pos1), var(--color2) var(--pos2), var(--color1) var(--pos3), var(--color2) var(--pos4), var(--color1) var(--pos5), var(--color2) var(--pos6), var(--color1) var(--pos7) ); animation: moveUpwards 5s linear infinite; } .gradient-down { background-image: repeating-linear-gradient( to bottom, var(--color2-1) var(--pos2-1), var(--color2-2) var(--pos2-2), var(--color2-1) var(--pos2-3), var(--color2-2) var(--pos2-4), var(--color2-1) var(--pos2-5) ); animation: moveDownwards 5s linear infinite; } .gradient-left { background-image: repeating-linear-gradient( to right, var(--color3-1) var(--pos3-1), var(--color3-2) var(--pos3-2), var(--color3-1) var(--pos3-3) ); animation: moveLeft 5s linear infinite; } .gradient-right { background-image: repeating-linear-gradient( to right, var(--color4-1) var(--pos1), var(--color4-2) var(--pos2), var(--color4-1) var(--pos3), var(--color4-2) var(--pos4), var(--color4-1) var(--pos5), var(--color4-2) var(--pos6), var(--color4-1) var(--pos7) ); animation: moveRight 5s linear infinite; } .strobe { background-color: #000; } @keyframes strobeEffect { 0% { opacity: 0; } 100% { opacity: 1; } } @keyframes moveUpwards { 0% { background-position: 0 100%; } 100% { background-position: 0 -100%; } } @keyframes moveDownwards { 0% { background-position: 0 -100%; } 100% { background-position: 0 100%; } } @keyframes moveLeft { 0% { background-position: 100% 0; } 100% { background-position: -100% 0; } } @keyframes moveRight { 0% { background-position: -100% 0; } 100% { background-position: 100% 0; } } :root{--color1:#ff0000;--color2:#000;--pos1:0%;--pos2:8.33%;--pos3:25%;--pos4:41.67%;--pos5:58.33%;--pos6:75%;--pos7:91.67%;--color2-1:#00ffea;--color2-2:#000;--pos2-1:0%;--pos2-2:12.5%;--pos2-3:37.5%;--pos2-4:62.5%;--pos2-5:87.5%;--color3-1:#7200ff;--color3-2:#000;--color4-1:#FF00CC;--color4-2:#000;--pos3-1:0%;--pos3-2:50%;--pos3-3:100%;}:root{--color1: #ff0000; --color2-1: #00ffea; --color3-1: #7200ff; --color4-1: #FF00CC;}</style></head><body style="margin:0;background-color:black;width:100vw;height:100vh;overflow:hidden;"><div id="puzzle-container"><div class="gradient-container gradient-left" data-x="0" data-y="0" data-width="0.01656" data-height="0.07298099999999999" style="left: 0px; top: 0px; width: 10.7971px; height: 47.5836px; --clip-path: polygon(0% 0%, 20% 0%, -147% 38%, 0% 33%); background-size: 21.5942px 47.5836px; animation-duration: 96s;"></div><div class="gradient-container gradient-down" data-x="0.01656" data-y="0" data-width="0.39743999999999996" data-height="0.07298099999999999" style="left: 10.7971px; top: 0px; width: 259.131px; height: 47.5836px; --clip-path: polygon(-3% 0%, 108% 0%, 99% 133%, -10% 38%); background-size: 259.131px 95.1672px; animation-duration: 89s;"></div><div class="gradient-container gradient-right" data-x="0" data-y="0.07298099999999999" data-width="0.414" data-height="0.356319" style="left: 0px; top: 47.5836px; width: 269.928px; height: 232.32px; --clip-path: polygon(0% -14%, 99% 7%, 111% 96%, 0% 117%); background-size: 539.856px 232.32px; animation-duration: 45s;"></div><div class="gradient-container gradient-right" data-x="0.414" data-y="0" data-width="0.186" data-height="0.279045" style="left: 269.928px; top: 0px; width: 121.272px; height: 181.937px; --clip-path: polygon(18% 0%, 69% 0%, 105% 88%, -18% 103%); background-size: 242.544px 181.937px; animation-duration: 60s;"></div><div class="gradient-container gradient-left" data-x="0.414" data-y="0.279045" data-width="0.186" data-height="0.15025499999999997" style="left: 269.928px; top: 181.937px; width: 121.272px; height: 97.9663px; --clip-path: polygon(-18% 5%, 105% -23%, 137% 48%, 24% 91%); background-size: 242.544px 97.9663px; animation-duration: 92s;"></div><div class="gradient-container gradient-down" data-x="0" data-y="0.42929999999999996" data-width="0.3198" data-height="0.15228000000000003" style="left: 0px; top: 279.904px; width: 208.51px; height: 99.2866px; --clip-path: polygon(0% 40%, 120% -51%, 96% 54%, 0% 103%); background-size: 208.51px 198.573px; animation-duration: 28s;"></div><div class="gradient-container gradient-right" data-x="0" data-y="0.58158" data-width="0.3198" data-height="0.22842" style="left: 0px; top: 379.19px; width: 208.51px; height: 148.93px; --clip-path: polygon(0% 2%, 96% -31%, 106% 108%, 0% 131%); background-size: 417.019px 148.93px; animation-duration: 84s;"></div><div class="gradient-container gradient-up" data-x="0.3198" data-y="0.42929999999999996" data-width="0.17220000000000002" data-height="0.38070000000000004" style="left: 208.51px; top: 279.904px; width: 112.274px; height: 248.216px; --clip-path: polygon(38% -20%, 81% -3%, 82% 120%, 12% 105%); background-size: 112.274px 496.433px; animation-duration: 70s;"></div><div class="gradient-container gradient-down" data-x="0.492" data-y="0.42929999999999996" data-width="0.108" data-height="0.09886779000000001" style="left: 320.784px; top: 279.904px; width: 70.416px; height: 64.4618px; --clip-path: polygon(-30% -11%, 164% -78%, 106% 61%, 6% 48%); background-size: 70.416px 128.924px; animation-duration: 1s;"></div><div class="gradient-container gradient-left" data-x="0.492" data-y="0.5281677899999999" data-width="0.108" data-height="0.08767520999999999" style="left: 320.784px; top: 344.365px; width: 70.416px; height: 57.1642px; --clip-path: polygon(6% -58%, 106% -44%, 67% 14%, -10% 154%); background-size: 140.832px 57.1642px; animation-duration: 7s;"></div><div class="gradient-container gradient-right" data-x="0.492" data-y="0.6158429999999999" data-width="0.108" data-height="0.1359099" style="left: 320.784px; top: 401.53px; width: 70.416px; height: 88.6133px; --clip-path: polygon(-10% 35%, 67% -55%, 147% 66%, -48% 69%); background-size: 140.832px 88.6133px; animation-duration: 1s;"></div><div class="gradient-container gradient-right" data-x="0.492" data-y="0.7517529" data-width="0.108" data-height="0.058247100000000024" style="left: 320.784px; top: 490.143px; width: 70.416px; height: 37.9771px; --clip-path: polygon(-48% -73%, 147% -80%, 45% 53%, -29% 232%); background-size: 140.832px 37.9771px; animation-duration: 61s;"></div><div class="gradient-container gradient-down" data-x="0.6" data-y="0" data-width="0.312" data-height="0.36450000000000005" style="left: 391.2px; top: 0px; width: 203.424px; height: 237.654px; --clip-path: polygon(-18% 0%, 122% 0%, 120% 97%, 20% 99%); background-size: 203.424px 475.308px; animation-duration: 39s;"></div><div class="gradient-container gradient-left" data-x="0.912" data-y="0" data-width="0.08800000000000001" data-height="0.36450000000000005" style="left: 594.624px; top: 0px; width: 57.376px; height: 237.654px; --clip-path: polygon(76% 0%, 100% 0%, 100% 99%, 70% 97%); background-size: 114.752px 237.654px; animation-duration: 32s;"></div><div class="gradient-container gradient-up" data-x="0.6" data-y="0.36450000000000005" data-width="0.4" data-height="0.253935" style="left: 391.2px; top: 237.654px; width: 260.8px; height: 165.566px; --clip-path: polygon(15% -2%, 100% -2%, 100% 71%, 18% 83%); background-size: 260.8px 331.131px; animation-duration: 26s;"></div><div class="gradient-container gradient-up" data-x="0.6" data-y="0.6184350000000001" data-width="0.18396" data-height="0.19156499999999999" style="left: 391.2px; top: 403.22px; width: 119.942px; height: 124.9px; --clip-path: polygon(38% -23%, 60% -11%, 78% 77%, -32% 86%); background-size: 119.942px 249.801px; animation-duration: 75s;"></div><div class="gradient-container gradient-up" data-x="0.78396" data-y="0.6184350000000001" data-width="0.10804000000000001" data-height="0.19156499999999999" style="left: 511.142px; top: 403.22px; width: 70.4421px; height: 124.9px; --clip-path: polygon(-69% -11%, 69% 31%, 28% 111%, -37% 77%); background-size: 70.4421px 249.801px; animation-duration: 8s;"></div><div class="gradient-container gradient-left" data-x="0.8920000000000001" data-y="0.6184350000000001" data-width="0.108" data-height="0.022987799999999996" style="left: 581.584px; top: 403.22px; width: 70.416px; height: 14.988px; --clip-path: polygon(-31% 258%, 100% -317%, 100% -16%, 62% -181%); background-size: 140.832px 14.988px; animation-duration: 73s;"></div><div class="gradient-container gradient-left" data-x="0.8920000000000001" data-y="0.6414228000000002" data-width="0.108" data-height="0.16857719999999998" style="left: 581.584px; top: 418.208px; width: 70.416px; height: 109.912px; --clip-path: polygon(62% -38%, 100% -16%, 100% 114%, -72% 112%); background-size: 140.832px 109.912px; animation-duration: 74s;"></div><div class="gradient-container gradient-up" data-x="0" data-y="0.81" data-width="0.0594" data-height="0.0589" style="left: 0px; top: 528.12px; width: 38.7288px; height: 38.4028px; --clip-path: polygon(0% 121%, 38% -100%, 74% 49%, 0% 105%); background-size: 38.7288px 76.8056px; animation-duration: 58s;"></div><div class="gradient-container gradient-right" data-x="0.0594" data-y="0.81" data-width="0.0306" data-height="0.002356" style="left: 38.7288px; top: 528.12px; width: 19.9512px; height: 1.53611px; --clip-path: polygon(-120% -2504%, 334% -429%, 303% -967%, -260% -1998%); background-size: 39.9024px 1.53611px; animation-duration: 86s;"></div><div class="gradient-container gradient-up" data-x="0.0594" data-y="0.812356" data-width="0.0306" data-height="0.056544" style="left: 38.7288px; top: 529.656px; width: 19.9512px; height: 36.8667px; --clip-path: polygon(-260% -87%, 303% -44%, 123% -26%, -51% 46%); background-size: 19.9512px 73.7334px; animation-duration: 77s;"></div><div class="gradient-container gradient-left" data-x="0" data-y="0.8688999999999999" data-width="0.09" data-height="0.1311" style="left: 0px; top: 566.523px; width: 58.68px; height: 85.4772px; --clip-path: polygon(0% 2%, 108% -54%, 25% 100%, 0% 100%); background-size: 117.36px 85.4772px; animation-duration: 27s;"></div><div class="gradient-container gradient-down" data-x="0.09" data-y="0.81" data-width="0.33479999999999993" data-height="0.19" style="left: 58.68px; top: 528.12px; width: 218.29px; height: 123.88px; --clip-path: polygon(21% -5%, 98% 23%, 102% 100%, -20% 100%); background-size: 218.29px 247.76px; animation-duration: 64s;"></div><div class="gradient-container gradient-left" data-x="0.42479999999999996" data-y="0.81" data-width="0.02520000000000003" data-height="0.19" style="left: 276.97px; top: 528.12px; width: 16.4304px; height: 123.88px; --clip-path: polygon(-26% 23%, 240% 21%, -198% 100%, 23% 100%); background-size: 32.8608px 123.88px; animation-duration: 4s;"></div><div class="gradient-container gradient-down" data-x="0.44999999999999996" data-y="0.81" data-width="0.55" data-height="0.19" style="left: 293.4px; top: 528.12px; width: 358.6px; height: 123.88px; --clip-path: polygon(6% 21%, 100% 13%, 100% 100%, -14% 100%); background-size: 358.6px 247.76px; animation-duration: 84s;"></div></div><script>function layoutShards(){var vw=window.innerWidth;var vh=window.innerHeight;document.querySelectorAll(".gradient-container").forEach(function(div){var x=parseFloat(div.dataset.x||0);var y=parseFloat(div.dataset.y||0);var w=parseFloat(div.dataset.width||0);var h=parseFloat(div.dataset.height||0);div.style.left=(x*vw)+"px";div.style.top=(y*vh)+"px";div.style.width=(w*vw)+"px";div.style.height=(h*vh)+"px";if(div.classList.contains("gradient-left")||div.classList.contains("gradient-right")){div.style.backgroundSize=(w*vw*2)+"px "+(h*vh)+"px";}else{div.style.backgroundSize=(w*vw)+"px "+(h*vh*2)+"px";}});}window.addEventListener("resize",layoutShards);window.addEventListener("load",layoutShards);layoutShards();</script></body></html>
<!doctype html><html><head><meta charset="utf-8"><title>shards</title><style> :root { /* Pattern 1: 7 bands */ --color1: #bb44dd; --color2: #000; --pos1: 0%; --pos2: 8.33%; --pos3: 25%; --pos4: 41.67%; --pos5: 58.33%; --pos6: 75%; --pos7: 91.67%; /* Pattern 2: 5 bands */ --color2-1: #6486f5; --color2-2: #000; --pos2-1: 0%; --pos2-2: 12.5%; --pos2-3: 37.5%; --pos2-4: 62.5%; --pos2-5: 87.5%; /* Pattern 3: 3 bands */ --color3-1: #ffffff; --color3-2: #000; --color4-1: #ff00cc; --color4-2: #000; --pos3-1: 0%; --pos3-2: 50%; --pos3-3: 100%; } body { background-color: black; margin: 0; padding: 0; width: 100vw; height: 100vh; overflow: hidden; } .gradient-container { position: absolute; overflow: hidden; transition: all 0.3s ease; clip-path: var(--clip-path); /* Emboss effect */ box-shadow: inset 2px 2px 5px rgba(255, 255, 255, 0.4), inset -2px -2px 5px rgba(0, 0, 0, 0.4); /* Add more depth with a subtle border */ } .gradient-up { background-image: repeating-linear-gradient( to bottom, var(--color1) var(--pos1), var(--color2) var(--pos2), var(--color1) var(--pos3), var(--color2) var(--pos4), var(--color1) var(--pos5), var(--color2) var(--pos6), var(--color1) var(--pos7) ); animation: moveUpwards 5s linear infinite; } .gradient-down { background-image: repeating-linear-gradient( to bottom, var(--color2-1) var(--pos2-1), var(--color2-2) var(--pos2-2), var(--color2-1) var(--pos2-3), var(--color2-2) var(--pos2-4), var(--color2-1) var(--pos2-5) ); animation: moveDownwards 5s linear infinite; } .gradient-left { background-image: repeating-linear-gradient( to right, var(--color3-1) var(--pos3-1), var(--color3-2) var(--pos3-2), var(--color3-1) var(--pos3-3) ); animation: moveLeft 5s linear infinite; } .gradient-right { background-image: repeating-linear-gradient( to right, var(--color4-1) var(--pos1), var(--color4-2) var(--pos2), var(--color4-1) var(--pos3), var(--color4-2) var(--pos4), var(--color4-1) var(--pos5), var(--color4-2) var(--pos6), var(--color4-1) var(--pos7) ); animation: moveRight 5s linear infinite; } .strobe { background-color: #000; } @keyframes strobeEffect { 0% { opacity: 0; } 100% { opacity: 1; } } @keyframes moveUpwards { 0% { background-position: 0 100%; } 100% { background-position: 0 -100%; } } @keyframes moveDownwards { 0% { background-position: 0 -100%; } 100% { background-position: 0 100%; } } @keyframes moveLeft { 0% { background-position: 100% 0; } 100% { background-position: -100% 0; } } @keyframes moveRight { 0% { background-position: -100% 0; } 100% { background-position: 100% 0; } } :root{--color1:#3f427d;--color2:#000;--pos1:0%;--pos2:8.33%;--pos3:25%;--pos4:41.67%;--pos5:58.33%;--pos6:75%;--pos7:91.67%;--color2-1:#b283cd;--color2-2:#000;--pos2-1:0%;--pos2-2:12.5%;--pos2-3:37.5%;--pos2-4:62.5%;--pos2-5:87.5%;--color3-1:#cd83c2;--color3-2:#000;--color4-1:#494949;--color4-2:#000;--pos3-1:0%;--pos3-2:50%;--pos3-3:100%;}:root{--color1: #3f427d; --color2-1: #b283cd; --color3-1: #cd83c2; --color4-1: #494949;}</style></head><body style="margin:0;background-color:black;width:100vw;height:100vh;overflow:hidden;"><div id="puzzle-container"><div class="gradient-container gradient-down" data-x="0" data-y="0" data-width="0.7" data-height="0.0672" style="left: 0px; top: 0px; width: 456.4px; height: 43.8144px; --clip-path: polygon(0% 0%, 97% 0%, 109% 170%, 0% 131%); background-size: 456.4px 87.6288px; animation-duration: 23s;"></div><div class="gradient-container gradient-right" data-x="0" data-y="0.0672" data-width="0.7" data-height="0.046368" style="left: 0px; top: 43.8144px; width: 456.4px; height: 30.2319px; --clip-path: polygon(0% 45%, 109% 102%, 110% 272%, 0% 29%); background-size: 912.8px 30.2319px; animation-duration: 62s;"></div><div class="gradient-container gradient-up" data-x="0" data-y="0.11356799999999999" data-width="0.7" data-height="0.5956742399999999" style="left: 0px; top: 74.0463px; width: 456.4px; height: 388.38px; --clip-path: polygon(0% -6%, 110% 13%, 110% 102%, 0% 87%); background-size: 456.4px 776.759px; animation-duration: 87s;"></div><div class="gradient-container gradient-left" data-x="0" data-y="0.7092422399999999" data-width="0.35" data-height="0.13075776" style="left: 0px; top: 462.426px; width: 228.2px; height: 85.2541px; --clip-path: polygon(0% -59%, 84% -35%, 104% 138%, 0% 143%); background-size: 456.4px 85.2541px; animation-duration: 63s;"></div><div class="gradient-container gradient-up" data-x="0.35" data-y="0.7092422399999999" data-width="0.35" data-height="0.13075776" style="left: 228.2px; top: 462.426px; width: 228.2px; height: 85.2541px; --clip-path: polygon(-16% -35%, 119% 9%, 86% 137%, 4% 138%); background-size: 228.2px 170.508px; animation-duration: 57s;"></div><div class="gradient-container gradient-down" data-x="0" data-y="0.84" data-width="0.5389999999999999" data-height="0.1600000000000001" style="left: 0px; top: 547.68px; width: 351.428px; height: 104.32px; --clip-path: polygon(0% 35%, 93% 0%, 88% 100%, 0% 100%); background-size: 351.428px 208.64px; animation-duration: 72s;"></div><div class="gradient-container gradient-right" data-x="0.5389999999999999" data-y="0.84" data-width="0.16100000000000006" data-height="0.1600000000000001" style="left: 351.428px; top: 547.68px; width: 104.972px; height: 104.32px; --clip-path: polygon(-24% 0%, 69% 31%, 114% 100%, -41% 100%); background-size: 209.944px 104.32px; animation-duration: 48s;"></div><div class="gradient-container gradient-down" data-x="0.7" data-y="0" data-width="0.30000000000000004" data-height="0.47200000000000003" style="left: 456.4px; top: 0px; width: 195.6px; height: 307.744px; --clip-path: polygon(-7% 0%, 100% 0%, 100% 108%, -11% 91%); background-size: 195.6px 615.488px; animation-duration: 81s;"></div><div class="gradient-container gradient-up" data-x="0.7" data-y="0.47200000000000003" data-width="0.030030000000000008" data-height="0.11799999999999997" style="left: 456.4px; top: 307.744px; width: 19.5796px; height: 76.936px; --clip-path: polygon(-112% -38%, 70% 63%, 6% 110%, 92% 101%); background-size: 19.5796px 153.872px; animation-duration: 40s;"></div><div class="gradient-container gradient-down" data-x="0.73003" data-y="0.47200000000000003" data-width="0.11254320000000002" data-height="0.11799999999999997" style="left: 475.98px; top: 307.744px; width: 73.3782px; height: 76.936px; --clip-path: polygon(-8% 63%, 103% 17%, 83% 60%, -25% 110%); background-size: 73.3782px 153.872px; animation-duration: 6s;"></div><div class="gradient-container gradient-up" data-x="0.8425732" data-y="0.47200000000000003" data-width="0.0884268" data-height="0.11799999999999997" style="left: 549.358px; top: 307.744px; width: 57.6543px; height: 76.936px; --clip-path: polygon(4% 17%, 50% -63%, 136% 165%, -21% 60%); background-size: 57.6543px 153.872px; animation-duration: 6s;"></div><div class="gradient-container gradient-right" data-x="0.9309999999999999" data-y="0.47200000000000003" data-width="0.069" data-height="0.11799999999999997" style="left: 607.012px; top: 307.744px; width: 44.988px; height: 76.936px; --clip-path: polygon(-65% -63%, 100% 31%, 100% 44%, 46% 165%); background-size: 89.976px 76.936px; animation-duration: 28s;"></div><div class="gradient-container gradient-left" data-x="0.7" data-y="0.59" data-width="0.09702000000000002" data-height="0.12915" style="left: 456.4px; top: 384.68px; width: 63.257px; height: 84.2058px; --clip-path: polygon(28% 1%, 40% 45%, 145% 79%, 44% 40%); background-size: 126.514px 84.2058px; animation-duration: 66s;"></div><div class="gradient-container gradient-left" data-x="0.7970200000000001" data-y="0.59" data-width="0.10098000000000003" data-height="0.12915" style="left: 519.657px; top: 384.68px; width: 65.839px; height: 84.2058px; --clip-path: polygon(-57% 45%, 22% 58%, 58% 93%, 44% 79%); background-size: 131.678px 84.2058px; animation-duration: 17s;"></div><div class="gradient-container gradient-down" data-x="0.7" data-y="0.7191500000000001" data-width="0.19800000000000004" data-height="0.07585" style="left: 456.4px; top: 468.886px; width: 129.096px; height: 49.4542px; --clip-path: polygon(22% -102%, 79% -11%, 64% 70%, 39% 72%); background-size: 129.096px 98.9084px; animation-duration: 61s;"></div><div class="gradient-container gradient-up" data-x="0.898" data-y="0.59" data-width="0.10199999999999998" data-height="0.1476" style="left: 585.496px; top: 384.68px; width: 66.504px; height: 96.2352px; --clip-path: polygon(-77% 51%, 100% -45%, 100% 49%, 73% 66%); background-size: 66.504px 192.47px; animation-duration: 6s;"></div><div class="gradient-container gradient-up" data-x="0.898" data-y="0.7376" data-width="0.10199999999999998" data-height="0.057399999999999986" style="left: 585.496px; top: 480.915px; width: 66.504px; height: 37.4248px; --clip-path: polygon(73% -87%, 100% -132%, 100% 150%, -70% 60%); background-size: 66.504px 74.8496px; animation-duration: 23s;"></div><div class="gradient-container gradient-left" data-x="0.7" data-y="0.795" data-width="0.09729" data-height="0.082" style="left: 456.4px; top: 518.34px; width: 63.4331px; height: 53.464px; --clip-path: polygon(78% -26%, 103% 73%, 46% 154%, -6% 27%); background-size: 126.866px 53.464px; animation-duration: 5s;"></div><div class="gradient-container gradient-up" data-x="0.7972899999999999" data-y="0.795" data-width="0.043710000000000006" data-height="0.082" style="left: 519.833px; top: 518.34px; width: 28.4989px; height: 53.464px; --clip-path: polygon(8% 73%, 203% 95%, 179% 45%, -120% 154%); background-size: 28.4989px 106.928px; animation-duration: 39s;"></div><div class="gradient-container gradient-right" data-x="0.7" data-y="0.8770000000000001" data-width="0.14100000000000001" data-height="0.123" style="left: 456.4px; top: 571.804px; width: 91.932px; height: 80.196px; --clip-path: polygon(-4% -49%, 124% -37%, 129% 100%, 16% 100%); background-size: 183.864px 80.196px; animation-duration: 32s;"></div><div class="gradient-container gradient-left" data-x="0.841" data-y="0.795" data-width="0.15900000000000003" data-height="0.205" style="left: 548.332px; top: 518.34px; width: 103.668px; height: 133.66px; --clip-path: polygon(28% 38%, 100% 14%, 100% 100%, 25% 100%); background-size: 207.336px 133.66px; animation-duration: 11s;"></div></div><script>function layoutShards(){var vw=window.innerWidth;var vh=window.innerHeight;document.querySelectorAll(".gradient-container").forEach(function(div){var x=parseFloat(div.dataset.x||0);var y=parseFloat(div.dataset.y||0);var w=parseFloat(div.dataset.width||0);var h=parseFloat(div.dataset.height||0);div.style.left=(x*vw)+"px";div.style.top=(y*vh)+"px";div.style.width=(w*vw)+"px";div.style.height=(h*vh)+"px";if(div.classList.contains("gradient-left")||div.classList.contains("gradient-right")){div.style.backgroundSize=(w*vw*2)+"px "+(h*vh)+"px";}else{div.style.backgroundSize=(w*vw)+"px "+(h*vh*2)+"px";}});}window.addEventListener("resize",layoutShards);window.addEventListener("load",layoutShards);layoutShards();</script></body></html>
<!doctype html><html><head><meta charset="utf-8"><title>shards</title><style> :root { /* Pattern 1: 7 bands */ --color1: #bb44dd; --color2: #000; --pos1: 0%; --pos2: 8.33%; --pos3: 25%; --pos4: 41.67%; --pos5: 58.33%; --pos6: 75%; --pos7: 91.67%; /* Pattern 2: 5 bands */ --color2-1: #6486f5; --color2-2: #000; --pos2-1: 0%; --pos2-2: 12.5%; --pos2-3: 37.5%; --pos2-4: 62.5%; --pos2-5: 87.5%; /* Pattern 3: 3 bands */ --color3-1: #ffffff; --color3-2: #000; --color4-1: #ff00cc; --color4-2: #000; --pos3-1: 0%; --pos3-2: 50%; --pos3-3: 100%; } body { background-color: black; margin: 0; padding: 0; width: 100vw; height: 100vh; overflow: hidden; } .gradient-container { position: absolute; overflow: hidden; transition: all 0.3s ease; clip-path: var(--clip-path); /* Emboss effect */ box-shadow: inset 2px 2px 5px rgba(255, 255, 255, 0.4), inset -2px -2px 5px rgba(0, 0, 0, 0.4); /* Add more depth with a subtle border */ } .gradient-up { background-image: repeating-linear-gradient( to bottom, var(--color1) var(--pos1), var(--color2) var(--pos2), var(--color1) var(--pos3), var(--color2) var(--pos4), var(--color1) var(--pos5), var(--color2) var(--pos6), var(--color1) var(--pos7) ); animation: moveUpwards 5s linear infinite; } .gradient-down { background-image: repeating-linear-gradient( to bottom, var(--color2-1) var(--pos2-1), var(--color2-2) var(--pos2-2), var(--color2-1) var(--pos2-3), var(--color2-2) var(--pos2-4), var(--color2-1) var(--pos2-5) ); animation: moveDownwards 5s linear infinite; } .gradient-left { background-image: repeating-linear-gradient( to right, var(--color3-1) var(--pos3-1), var(--color3-2) var(--pos3-2), var(--color3-1) var(--pos3-3) ); animation: moveLeft 5s linear infinite; } .gradient-right { background-image: repeating-linear-gradient( to right, var(--color4-1) var(--pos1), var(--color4-2) var(--pos2), var(--color4-1) var(--pos3), var(--color4-2) var(--pos4), var(--color4-1) var(--pos5), var(--color4-2) var(--pos6), var(--color4-1) var(--pos7) ); animation: moveRight 5s linear infinite; } .strobe { background-color: #000; } @keyframes strobeEffect { 0% { opacity: 0; } 100% { opacity: 1; } } @keyframes moveUpwards { 0% { background-position: 0 100%; } 100% { background-position: 0 -100%; } } @keyframes moveDownwards { 0% { background-position: 0 -100%; } 100% { background-position: 0 100%; } } @keyframes moveLeft { 0% { background-position: 100% 0; } 100% { background-position: -100% 0; } } @keyframes moveRight { 0% { background-position: -100% 0; } 100% { background-position: 100% 0; } } :root{--color1:#1d1d1d;--color2:#000;--pos1:0%;--pos2:8.33%;--pos3:25%;--pos4:41.67%;--pos5:58.33%;--pos6:75%;--pos7:91.67%;--color2-1:#000000;--color2-2:#000;--pos2-1:0%;--pos2-2:12.5%;--pos2-3:37.5%;--pos2-4:62.5%;--pos2-5:87.5%;--color3-1:#00ffea;--color3-2:#000;--color4-1:#83a1cd;--color4-2:#000;--pos3-1:0%;--pos3-2:50%;--pos3-3:100%;}:root{--color1: #1d1d1d; --color2-1: #000000; --color3-1: #00ffea; --color4-1: #83a1cd;}</style></head><body style="margin:0;background-color:black;width:100vw;height:100vh;overflow:hidden;"><div id="puzzle-container"><div class="gradient-container gradient-left" data-x="0" data-y="0" data-width="0.79" data-height="0.89" style="left: 0px; top: 0px; width: 515.08px; height: 580.28px; --clip-path: polygon(0% 0%, 105% 0%, 100% 93%, 0% 105%); background-size: 1030.16px 580.28px; animation-duration: 76s;"></div><div class="gradient-container gradient-left" data-x="0.79" data-y="0" data-width="0.006299999999999998" data-height="0.0089" style="left: 515.08px; top: 0px; width: 4.1076px; height: 5.8028px; --clip-path: polygon(572% 0%, 524% 0%, 916% 100%, 205% 100%); background-size: 8.2152px 5.8028px; animation-duration: 38s;"></div><div class="gradient-container gradient-down" data-x="0.7963000000000001" data-y="0" data-width="0.010755359999999997" data-height="0.0089" style="left: 519.188px; top: 0px; width: 7.01249px; height: 5.8028px; --clip-path: polygon(248% 0%, 727% 0%, 266% 100%, 478% 100%); background-size: 7.01249px 11.6056px; animation-duration: 83s;"></div><div class="gradient-container gradient-left" data-x="0.8070553600000001" data-y="0" data-width="0.16850063999999995" data-height="0.0089" style="left: 526.2px; top: 0px; width: 109.862px; height: 5.8028px; --clip-path: polygon(40% 0%, 118% 0%, 135% 100%, 11% 100%); background-size: 219.725px 5.8028px; animation-duration: 82s;"></div><div class="gradient-container gradient-up" data-x="0.9755560000000001" data-y="0" data-width="0.024444000000000004" data-height="0.0089" style="left: 636.063px; top: 0px; width: 15.9375px; height: 5.8028px; --clip-path: polygon(124% 0%, 100% 0%, 100% 100%, 240% 100%); background-size: 15.9375px 11.6056px; animation-duration: 7s;"></div><div class="gradient-container gradient-left" data-x="0.79" data-y="0.0089" data-width="0.20999999999999994" data-height="0.0864517698" style="left: 515.08px; top: 5.8028px; width: 136.92px; height: 56.3666px; --clip-path: polygon(6% 0%, 100% 0%, 100% 88%, -16% 166%); background-size: 273.84px 56.3666px; animation-duration: 37s;"></div><div class="gradient-container gradient-left" data-x="0.79" data-y="0.0953517698" data-width="0.20999999999999994" data-height="0.3938358402" style="left: 515.08px; top: 62.1694px; width: 136.92px; height: 256.781px; --clip-path: polygon(-16% 15%, 100% -3%, 100% 83%, -29% 115%); background-size: 273.84px 256.781px; animation-duration: 1s;"></div><div class="gradient-container gradient-down" data-x="0.79" data-y="0.48918760999999994" data-width="0.19949999999999993" data-height="0.12767138999999997" style="left: 515.08px; top: 318.95px; width: 130.074px; height: 83.2417px; --clip-path: polygon(-30% 47%, 100% -34%, 100% 42%, -15% 153%); background-size: 130.074px 166.483px; animation-duration: 57s;"></div><div class="gradient-container gradient-up" data-x="0.9895" data-y="0.48918760999999994" data-width="0.010500000000000006" data-height="0.12767138999999997" style="left: 645.154px; top: 318.95px; width: 6.846px; height: 83.2417px; --clip-path: polygon(0% -34%, 100% -54%, 100% 57%, 0% 42%); background-size: 6.846px 166.483px; animation-duration: 26s;"></div><div class="gradient-container gradient-right" data-x="0.79" data-y="0.6168589999999999" data-width="0.20999999999999994" data-height="0.07789981319999999" style="left: 515.08px; top: 402.192px; width: 136.92px; height: 50.7907px; --clip-path: polygon(-14% 87%, 100% -71%, 100% 143%, -12% 166%); background-size: 273.84px 50.7907px; animation-duration: 95s;"></div><div class="gradient-container gradient-right" data-x="0.79" data-y="0.6947588131999999" data-width="0.20999999999999994" data-height="0.17338990679999997" style="left: 515.08px; top: 452.983px; width: 136.92px; height: 113.05px; --clip-path: polygon(-12% 30%, 100% 19%, 100% 87%, 22% 146%); background-size: 273.84px 113.05px; animation-duration: 62s;"></div><div class="gradient-container gradient-up" data-x="0.79" data-y="0.8681487199999999" data-width="0.20999999999999994" data-height="0.021851280000000004" style="left: 515.08px; top: 566.033px; width: 136.92px; height: 14.247px; --clip-path: polygon(22% 364%, 100% -99%, 100% -256%, 0% -194%); background-size: 136.92px 28.4941px; animation-duration: 1s;"></div><div class="gradient-container gradient-right" data-x="0" data-y="0.89" data-width="0.093744" data-height="0.09109100000000003" style="left: 0px; top: 580.28px; width: 61.1211px; height: 59.3913px; --clip-path: polygon(0% 44%, 125% 54%, 112% 107%, 0% 118%); background-size: 122.242px 59.3913px; animation-duration: 25s;"></div><div class="gradient-container gradient-down" data-x="0" data-y="0.981091" data-width="0.093744" data-height="0.009009000000000003" style="left: 0px; top: 639.671px; width: 61.1211px; height: 5.87387px; --clip-path: polygon(0% 183%, 112% 67%, 99% 100%, 0% 100%); background-size: 61.1211px 11.7477px; animation-duration: 95s;"></div><div class="gradient-container gradient-right" data-x="0" data-y="0.9901" data-width="0.093744" data-height="0.00990000000000001" style="left: 0px; top: 645.545px; width: 61.1211px; height: 6.4548px; --clip-path: polygon(0% 0%, 99% 0%, 114% 100%, 0% 100%); background-size: 122.242px 6.4548px; animation-duration: 36s;"></div><div class="gradient-container gradient-down" data-x="0.093744" data-y="0.89" data-width="0.073656" data-height="0.03870900000000002" style="left: 61.1211px; top: 580.28px; width: 48.0237px; height: 25.2383px; --clip-path: polygon(32% 128%, 185% 160%, 82% 6%, 82% 37%); background-size: 48.0237px 50.4765px; animation-duration: 2s;"></div><div class="gradient-container gradient-right" data-x="0.093744" data-y="0.928709" data-width="0.073656" data-height="0.037191000000000016" style="left: 61.1211px; top: 605.518px; width: 48.0237px; height: 24.2485px; --clip-path: polygon(82% -65%, 82% -98%, 9% -39%, -53% 108%); background-size: 96.0474px 24.2485px; animation-duration: 41s;"></div><div class="gradient-container gradient-left" data-x="0.093744" data-y="0.9659" data-width="0.06408071999999998" data-height="0.034100000000000005" style="left: 61.1211px; top: 629.767px; width: 41.7806px; height: 22.2332px; --clip-path: polygon(-60% 9%, -6% 145%, 156% 100%, 20% 100%); background-size: 83.5613px 22.2332px; animation-duration: 65s;"></div><div class="gradient-container gradient-left" data-x="0.15782471999999997" data-y="0.9659" data-width="0.009575280000000007" data-height="0.034100000000000005" style="left: 102.902px; top: 629.767px; width: 6.24308px; height: 22.2332px; --clip-path: polygon(-711% 145%, -603% -152%, 849% 100%, 378% 100%); background-size: 12.4862px 22.2332px; animation-duration: 55s;"></div><div class="gradient-container gradient-left" data-x="0.1674" data-y="0.89" data-width="0.14260000000000003" data-height="0.11000000000000004" style="left: 109.145px; top: 580.28px; width: 92.9752px; height: 71.72px; --clip-path: polygon(44% 56%, 87% 37%, 52% 100%, 50% 100%); background-size: 185.95px 71.72px; animation-duration: 41s;"></div><div class="gradient-container gradient-right" data-x="0.31" data-y="0.89" data-width="0.69" data-height="0.11000000000000004" style="left: 202.12px; top: 580.28px; width: 449.88px; height: 71.72px; --clip-path: polygon(-3% 37%, 100% -71%, 100% 100%, -10% 100%); background-size: 899.76px 71.72px; animation-duration: 14s;"></div></div><script>function layoutShards(){var vw=window.innerWidth;var vh=window.innerHeight;document.querySelectorAll(".gradient-container").forEach(function(div){var x=parseFloat(div.dataset.x||0);var y=parseFloat(div.dataset.y||0);var w=parseFloat(div.dataset.width||0);var h=parseFloat(div.dataset.height||0);div.style.left=(x*vw)+"px";div.style.top=(y*vh)+"px";div.style.width=(w*vw)+"px";div.style.height=(h*vh)+"px";if(div.classList.contains("gradient-left")||div.classList.contains("gradient-right")){div.style.backgroundSize=(w*vw*2)+"px "+(h*vh)+"px";}else{div.style.backgroundSize=(w*vw)+"px "+(h*vh*2)+"px";}});}window.addEventListener("resize",layoutShards);window.addEventListener("load",layoutShards);layoutShards();</script></body></html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Black & White Noise</title> <style> * { margin: 0; padding: 0; box-sizing: border-box; } body, html { width: 100%; height: 100%; overflow: hidden; background: #000; } canvas { display: block; width: 100%; height: 100%; } </style> </head> <body> <canvas id="noise"></canvas> <script> const canvas = document.getElementById('noise'); const ctx = canvas.getContext('2d'); function resize() { canvas.width = window.innerWidth; canvas.height = window.innerHeight; } function generateNoise() { const imageData = ctx.createImageData(canvas.width, canvas.height); const data = imageData.data; for (let i = 0; i < data.length; i += 4) { const value = Math.random() > 0.5 ? 255 : 0; data[i] = value; // Red data[i + 1] = value; // Green data[i + 2] = value; // Blue data[i + 3] = 255; // Alpha } ctx.putImageData(imageData, 0, 0); } function animate() { generateNoise(); requestAnimationFrame(animate); } window.addEventListener('resize', resize); resize(); animate(); </script> </body> </html>
<!doctype html><html><head><meta charset="utf-8"><title>shards</title><style> :root { /* Pattern 1: 7 bands */ --color1: #bb44dd; --color2: #000; --pos1: 0%; --pos2: 8.33%; --pos3: 25%; --pos4: 41.67%; --pos5: 58.33%; --pos6: 75%; --pos7: 91.67%; /* Pattern 2: 5 bands */ --color2-1: #6486f5; --color2-2: #000; --pos2-1: 0%; --pos2-2: 12.5%; --pos2-3: 37.5%; --pos2-4: 62.5%; --pos2-5: 87.5%; /* Pattern 3: 3 bands */ --color3-1: #ffffff; --color3-2: #000; --color4-1: #ff00cc; --color4-2: #000; --pos3-1: 0%; --pos3-2: 50%; --pos3-3: 100%; } body { background-color: black; margin: 0; padding: 0; width: 100vw; height: 100vh; overflow: hidden; } .gradient-container { position: absolute; overflow: hidden; transition: all 0.3s ease; clip-path: var(--clip-path); /* Emboss effect */ box-shadow: inset 2px 2px 5px rgba(255, 255, 255, 0.4), inset -2px -2px 5px rgba(0, 0, 0, 0.4); /* Add more depth with a subtle border */ } .gradient-up { background-image: repeating-linear-gradient( to bottom, var(--color1) var(--pos1), var(--color2) var(--pos2), var(--color1) var(--pos3), var(--color2) var(--pos4), var(--color1) var(--pos5), var(--color2) var(--pos6), var(--color1) var(--pos7) ); animation: moveUpwards 5s linear infinite; } .gradient-down { background-image: repeating-linear-gradient( to bottom, var(--color2-1) var(--pos2-1), var(--color2-2) var(--pos2-2), var(--color2-1) var(--pos2-3), var(--color2-2) var(--pos2-4), var(--color2-1) var(--pos2-5) ); animation: moveDownwards 5s linear infinite; } .gradient-left { background-image: repeating-linear-gradient( to right, var(--color3-1) var(--pos3-1), var(--color3-2) var(--pos3-2), var(--color3-1) var(--pos3-3) ); animation: moveLeft 5s linear infinite; } .gradient-right { background-image: repeating-linear-gradient( to right, var(--color4-1) var(--pos1), var(--color4-2) var(--pos2), var(--color4-1) var(--pos3), var(--color4-2) var(--pos4), var(--color4-1) var(--pos5), var(--color4-2) var(--pos6), var(--color4-1) var(--pos7) ); animation: moveRight 5s linear infinite; } .strobe { background-color: #000; } @keyframes strobeEffect { 0% { opacity: 0; } 100% { opacity: 1; } } @keyframes moveUpwards { 0% { background-position: 0 100%; } 100% { background-position: 0 -100%; } } @keyframes moveDownwards { 0% { background-position: 0 -100%; } 100% { background-position: 0 100%; } } @keyframes moveLeft { 0% { background-position: 100% 0; } 100% { background-position: -100% 0; } } @keyframes moveRight { 0% { background-position: -100% 0; } 100% { background-position: 100% 0; } } :root{--color1:#400026;--color2:#000;--pos1:0%;--pos2:8.33%;--pos3:25%;--pos4:41.67%;--pos5:58.33%;--pos6:75%;--pos7:91.67%;--color2-1:#FF00CC;--color2-2:#000;--pos2-1:0%;--pos2-2:12.5%;--pos2-3:37.5%;--pos2-4:62.5%;--pos2-5:87.5%;--color3-1:#83a1cd;--color3-2:#000;--color4-1:#494949;--color4-2:#000;--pos3-1:0%;--pos3-2:50%;--pos3-3:100%;}:root{--color1: #400026; --color2-1: #FF00CC; --color3-1: #83a1cd; --color4-1: #494949;}</style></head><body style="margin:0;background-color:black;width:100vw;height:100vh;overflow:hidden;"><div id="puzzle-container"><div class="gradient-container gradient-left" data-x="0" data-y="0" data-width="0.49000000000000005" data-height="0.2" style="left: 0px; top: 0px; width: 319.48px; height: 130.4px; --clip-path: polygon(0% 0%, 89% 0%, 105% 126%, 0% 135%); background-size: 638.96px 130.4px; animation-duration: 61s;"></div><div class="gradient-container gradient-up" data-x="0.49000000000000005" data-y="0" data-width="0.17200872" data-height="0.156" style="left: 319.48px; top: 0px; width: 112.15px; height: 101.712px; --clip-path: polygon(-33% 0%, 60% 0%, 59% 67%, -3% 53%); background-size: 112.15px 203.424px; animation-duration: 81s;"></div><div class="gradient-container gradient-left" data-x="0.49000000000000005" data-y="0.156" data-width="0.17200872" data-height="0.044000000000000004" style="left: 319.48px; top: 101.712px; width: 112.15px; height: 28.688px; --clip-path: polygon(-3% -166%, 59% -116%, 107% 55%, 14% 216%); background-size: 224.299px 28.688px; animation-duration: 31s;"></div><div class="gradient-container gradient-down" data-x="0.66200872" data-y="0" data-width="0.04851527999999999" data-height="0.2" style="left: 431.63px; top: 0px; width: 31.632px; height: 130.4px; --clip-path: polygon(-142% 0%, 149% 0%, -18% 123%, 26% 90%); background-size: 31.632px 260.8px; animation-duration: 13s;"></div><div class="gradient-container gradient-left" data-x="0.710524" data-y="0" data-width="0.01917599999999998" data-height="0.023200000000000002" style="left: 463.262px; top: 0px; width: 12.5028px; height: 15.1264px; --clip-path: polygon(125% 0%, -51% 0%, -161% 6%, 268% 122%); background-size: 25.0055px 15.1264px; animation-duration: 6s;"></div><div class="gradient-container gradient-down" data-x="0.710524" data-y="0.023200000000000002" data-width="0.01917599999999998" data-height="0.034800000000000005" style="left: 463.262px; top: 15.1264px; width: 12.5028px; height: 22.6896px; --clip-path: polygon(268% 15%, -161% -63%, -83% -29%, 120% 214%); background-size: 12.5028px 45.3792px; animation-duration: 68s;"></div><div class="gradient-container gradient-up" data-x="0.710524" data-y="0.058" data-width="0.01917599999999998" data-height="0.1065" style="left: 463.262px; top: 37.816px; width: 12.5028px; height: 69.438px; --clip-path: polygon(120% 37%, -83% -42%, 100% 133%, 75% 148%); background-size: 12.5028px 138.876px; animation-duration: 79s;"></div><div class="gradient-container gradient-right" data-x="0.710524" data-y="0.1645" data-width="0.01917599999999998" data-height="0.035500000000000004" style="left: 463.262px; top: 107.254px; width: 12.5028px; height: 23.146px; --clip-path: polygon(75% 144%, 100% 100%, 100% 254%, -298% 229%); background-size: 25.0055px 23.146px; animation-duration: 39s;"></div><div class="gradient-container gradient-left" data-x="0.7297" data-y="0" data-width="0.10939041" data-height="0.022000000000000002" style="left: 475.764px; top: 0px; width: 71.3225px; height: 14.344px; --clip-path: polygon(-27% 0%, 106% 0%, 74% 442%, -66% 33%); background-size: 142.645px 14.344px; animation-duration: 34s;"></div><div class="gradient-container gradient-right" data-x="0.8390904100000001" data-y="0" data-width="0.04468059000000002" data-height="0.022000000000000002" style="left: 547.087px; top: 0px; width: 29.1317px; height: 14.344px; --clip-path: polygon(15% 0%, -60% 0%, 273% 114%, -65% 442%); background-size: 58.2635px 14.344px; animation-duration: 45s;"></div><div class="gradient-container gradient-down" data-x="0.7297" data-y="0.022000000000000002" data-width="0.154071" data-height="0.02136" style="left: 475.764px; top: 14.344px; width: 100.454px; height: 13.9267px; --clip-path: polygon(-47% -69%, 150% 15%, 119% 323%, 23% -91%); background-size: 100.454px 27.8534px; animation-duration: 6s;"></div><div class="gradient-container gradient-right" data-x="0.7297" data-y="0.04336" data-width="0.154071" data-height="0.15664" style="left: 475.764px; top: 28.2707px; width: 100.454px; height: 102.129px; --clip-path: polygon(23% -26%, 119% 30%, 75% 97%, 0% 135%); background-size: 200.909px 102.129px; animation-duration: 17s;"></div><div class="gradient-container gradient-right" data-x="0.8837710000000001" data-y="0" data-width="0.116229" data-height="0.064" style="left: 576.219px; top: 0px; width: 75.7813px; height: 41.728px; --clip-path: polygon(-62% 0%, 100% 0%, 100% 42%, 40% 143%); background-size: 151.563px 41.728px; animation-duration: 48s;"></div><div class="gradient-container gradient-left" data-x="0.8837710000000001" data-y="0.064" data-width="0.116229" data-height="0.064" style="left: 576.219px; top: 41.728px; width: 75.7813px; height: 41.728px; --clip-path: polygon(40% 43%, 100% -58%, 100% 161%, 26% 127%); background-size: 151.563px 41.728px; animation-duration: 50s;"></div><div class="gradient-container gradient-right" data-x="0.8837710000000001" data-y="0.128" data-width="0.03835557" data-height="0.07200000000000001" style="left: 576.219px; top: 83.456px; width: 25.0078px; height: 46.944px; --clip-path: polygon(77% 24%, 217% -31%, -12% 63%, -102% 92%); background-size: 50.0157px 46.944px; animation-duration: 59s;"></div><div class="gradient-container gradient-left" data-x="0.92212657" data-y="0.128" data-width="0.07787343" data-height="0.07200000000000001" style="left: 601.227px; top: 83.456px; width: 50.7735px; height: 46.944px; --clip-path: polygon(57% -31%, 100% 54%, 100% 199%, -55% 63%); background-size: 101.547px 46.944px; animation-duration: 23s;"></div><div class="gradient-container gradient-up" data-x="0" data-y="0.2" data-width="0.8500000000000001" data-height="0.8" style="left: 0px; top: 130.4px; width: 554.2px; height: 521.6px; --clip-path: polygon(0% 9%, 91% 3%, 106% 100%, 0% 100%); background-size: 554.2px 1043.2px; animation-duration: 98s;"></div><div class="gradient-container gradient-up" data-x="0.8500000000000001" data-y="0.2" data-width="0.14999999999999994" data-height="0.15640800000000002" style="left: 554.2px; top: 130.4px; width: 97.8px; height: 101.978px; --clip-path: polygon(-52% 17%, 100% 46%, 100% 75%, 42% 123%); background-size: 97.8px 203.956px; animation-duration: 51s;"></div><div class="gradient-container gradient-left" data-x="0.8500000000000001" data-y="0.356408" data-width="0.14999999999999994" data-height="0.12356231999999999" style="left: 554.2px; top: 232.378px; width: 97.8px; height: 80.5626px; --clip-path: polygon(42% 29%, 100% -32%, 100% 148%, -22% 138%); background-size: 195.6px 80.5626px; animation-duration: 71s;"></div><div class="gradient-container gradient-down" data-x="0.8500000000000001" data-y="0.47997032" data-width="0.14999999999999994" data-height="0.46482967999999997" style="left: 554.2px; top: 312.941px; width: 97.8px; height: 303.069px; --clip-path: polygon(-22% 10%, 100% 13%, 100% 88%, 45% 96%); background-size: 97.8px 606.138px; animation-duration: 72s;"></div><div class="gradient-container gradient-right" data-x="0.8500000000000001" data-y="0.9448" data-width="0.14999999999999994" data-height="0.03920000000000001" style="left: 554.2px; top: 616.01px; width: 97.8px; height: 25.5584px; --clip-path: polygon(45% -51%, 100% -143%, 100% 110%, -7% 9%); background-size: 195.6px 25.5584px; animation-duration: 64s;"></div><div class="gradient-container gradient-left" data-x="0.8500000000000001" data-y="0.984" data-width="0.012127499999999994" data-height="0.016000000000000025" style="left: 554.2px; top: 641.568px; width: 7.90713px; height: 10.432px; --clip-path: polygon(-91% -224%, 754% -475%, -540% 100%, 417% 100%); background-size: 15.8143px 10.432px; animation-duration: 9s;"></div><div class="gradient-container gradient-left" data-x="0.8621275000000002" data-y="0.984" data-width="0.005197499999999997" data-height="0.016000000000000025" style="left: 562.107px; top: 641.568px; width: 3.38877px; height: 10.432px; --clip-path: polygon(1527% -475%, 990% -254%, -747% 100%, -1492% 100%); background-size: 6.77754px 10.432px; animation-duration: 51s;"></div><div class="gradient-container gradient-right" data-x="0.867325" data-y="0.984" data-width="0.06675899999999999" data-height="0.016000000000000025" style="left: 565.496px; top: 641.568px; width: 43.5269px; height: 10.432px; --clip-path: polygon(69% -254%, 48% 453%, 114% 100%, -66% 100%); background-size: 87.0537px 10.432px; animation-duration: 22s;"></div><div class="gradient-container gradient-up" data-x="0.934084" data-y="0.984" data-width="0.03141599999999999" data-height="0.016000000000000025" style="left: 609.023px; top: 641.568px; width: 20.4832px; height: 10.432px; --clip-path: polygon(-111% 453%, 178% 23%, 264% 100%, 31% 100%); background-size: 20.4832px 20.864px; animation-duration: 56s;"></div><div class="gradient-container gradient-down" data-x="0.9654999999999999" data-y="0.984" data-width="0.020903549999999986" data-height="0.016000000000000025" style="left: 629.506px; top: 641.568px; width: 13.6291px; height: 10.432px; --clip-path: polygon(117% 23%, 100% -435%, 100% 100%, 246% 100%); background-size: 13.6291px 20.864px; animation-duration: 47s;"></div><div class="gradient-container gradient-down" data-x="0.9864035499999999" data-y="0.984" data-width="0.007731449999999994" data-height="0.016000000000000025" style="left: 643.135px; top: 641.568px; width: 5.04091px; height: 10.432px; --clip-path: polygon(0% -435%, 100% -451%, 100% 100%, 0% 100%); background-size: 5.04091px 20.864px; animation-duration: 20s;"></div><div class="gradient-container gradient-down" data-x="0.994135" data-y="0.984" data-width="0.005864999999999998" data-height="0.016000000000000025" style="left: 648.176px; top: 641.568px; width: 3.82398px; height: 10.432px; --clip-path: polygon(0% -451%, 100% 24%, 100% 100%, 0% 100%); background-size: 3.82398px 20.864px; animation-duration: 9s;"></div></div><script>function layoutShards(){var vw=window.innerWidth;var vh=window.innerHeight;document.querySelectorAll(".gradient-container").forEach(function(div){var x=parseFloat(div.dataset.x||0);var y=parseFloat(div.dataset.y||0);var w=parseFloat(div.dataset.width||0);var h=parseFloat(div.dataset.height||0);div.style.left=(x*vw)+"px";div.style.top=(y*vh)+"px";div.style.width=(w*vw)+"px";div.style.height=(h*vh)+"px";if(div.classList.contains("gradient-left")||div.classList.contains("gradient-right")){div.style.backgroundSize=(w*vw*2)+"px "+(h*vh)+"px";}else{div.style.backgroundSize=(w*vw)+"px "+(h*vh*2)+"px";}});}window.addEventListener("resize",layoutShards);window.addEventListener("load",layoutShards);layoutShards();</script></body></html>
<!doctype html><html><head><meta charset="utf-8"><title>smear</title><style> * { margin: 0; padding: 0; box-sizing: border-box; } body, html { width: 100%; height: 100%; overflow: hidden; background: #000; } smear-partition { display: block; width: 100%; height: 100%; position: relative; } smear-canvas { display: block; position: absolute; } smear-canvas canvas { display: block; width: 100%; height: 100%; image-rendering: pixelated; image-rendering: -moz-crisp-edges; image-rendering: crisp-edges; -ms-interpolation-mode: nearest-neighbor; } .smear-container { position: absolute; overflow: hidden; } .smear-container canvas { display: block; width: 100%; height: 100%; image-rendering: pixelated; image-rendering: crisp-edges; } </style></head><body style="margin:0;background-color:black;width:100vw;height:100vh;overflow:hidden;"><div id="puzzle-container"><div class="smear-container" data-x="0" data-y="0" data-width="0.22094938650306747" data-height="0.35574693251533746" data-start-edge="top" data-speed="65" data-source-interval="1155" data-pixel-size="3" data-color-fg="#FFFFFF" data-color-bg="#000000" data-source-type="dots" style="left: 0px; top: 0px; width: 144.059px; height: 231.947px;"><canvas></canvas></div><div class="smear-container" data-x="0" data-y="0.35574693251533746" data-width="0.22094938650306747" data-height="0.20559509202453988" data-start-edge="right" data-speed="40" data-source-interval="993" data-pixel-size="1" data-color-fg="#FFFFFF" data-color-bg="#000000" data-source-type="dots" style="left: 0px; top: 231.947px; width: 144.059px; height: 134.048px;"><canvas></canvas></div><div class="smear-container" data-x="0" data-y="0.5613404907975461" data-width="0.22094938650306747" data-height="0.3453389570552147" data-start-edge="right" data-speed="52" data-source-interval="899" data-pixel-size="2" data-color-fg="#FFFF00" data-color-bg="#000000" data-source-type="dots" style="left: 0px; top: 365.994px; width: 144.059px; height: 225.161px;"><canvas></canvas></div><div class="smear-container" data-x="0" data-y="0.9066809815950919" data-width="0.22094938650306747" data-height="0.09331963190184049" data-start-edge="left" data-speed="64" data-source-interval="1790" data-pixel-size="5" data-color-fg="#FFFFFF" data-color-bg="#000000" data-source-type="dots" style="left: 0px; top: 591.156px; width: 144.059px; height: 60.8444px;"><canvas></canvas></div><div class="smear-container" data-x="0.22094938650306747" data-y="0" data-width="0.036445092024539875" data-height="0.06184432515337423" data-start-edge="left" data-speed="82" data-source-interval="1975" data-pixel-size="3" data-color-fg="#FFFF00" data-color-bg="#000000" data-source-type="dots" style="left: 144.059px; top: 0px; width: 23.7622px; height: 40.3225px;"><canvas></canvas></div><div class="smear-container" data-x="0.22094938650306747" data-y="0.06184432515337423" data-width="0.036445092024539875" data-height="0.13459141104294478" data-start-edge="left" data-speed="73" data-source-interval="972" data-pixel-size="2" data-color-fg="#FFFF00" data-color-bg="#000000" data-source-type="dots" style="left: 144.059px; top: 40.3225px; width: 23.7622px; height: 87.7536px;"><canvas></canvas></div><div class="smear-container" data-x="0.22094938650306747" data-y="0.19643558282208587" data-width="0.036445092024539875" data-height="0.12556641104294478" data-start-edge="left" data-speed="98" data-source-interval="1787" data-pixel-size="2" data-color-fg="#FFFFFF" data-color-bg="#000000" data-source-type="dots" style="left: 144.059px; top: 128.076px; width: 23.7622px; height: 81.8693px;"><canvas></canvas></div><div class="smear-container" data-x="0.22094938650306747" data-y="0.32200153374233126" data-width="0.036445092024539875" data-height="0.15084693251533743" data-start-edge="bottom" data-speed="26" data-source-interval="785" data-pixel-size="2" data-color-fg="#FFFF00" data-color-bg="#000000" data-source-type="dots" style="left: 144.059px; top: 209.945px; width: 23.7622px; height: 98.3522px;"><canvas></canvas></div><div class="smear-container" data-x="0.22094938650306747" data-y="0.47284969325153375" data-width="0.036445092024539875" data-height="0.06728067484662577" data-start-edge="right" data-speed="84" data-source-interval="663" data-pixel-size="2" data-color-fg="#FFFF00" data-color-bg="#000000" data-source-type="dots" style="left: 144.059px; top: 308.298px; width: 23.7622px; height: 43.867px;"><canvas></canvas></div><div class="smear-container" data-x="0.22094938650306747" data-y="0.5401303680981595" data-width="0.036445092024539875" data-height="0.084725" data-start-edge="top" data-speed="45" data-source-interval="1281" data-pixel-size="6" data-color-fg="#FFFFFF" data-color-bg="#000000" data-source-type="dots" style="left: 144.059px; top: 352.165px; width: 23.7622px; height: 55.2407px;"><canvas></canvas></div><div class="smear-container" data-x="0.22094938650306747" data-y="0.6248542944785276" data-width="0.036445092024539875" data-height="0.16785736196319018" data-start-edge="right" data-speed="38" data-source-interval="874" data-pixel-size="4" data-color-fg="#FFFFFF" data-color-bg="#000000" data-source-type="dots" style="left: 144.059px; top: 407.405px; width: 23.7622px; height: 109.443px;"><canvas></canvas></div><div class="smear-container" data-x="0.22094938650306747" data-y="0.7927116564417177" data-width="0.036445092024539875" data-height="0.20728834355828218" data-start-edge="right" data-speed="28" data-source-interval="1746" data-pixel-size="6" data-color-fg="#FFFFFF" data-color-bg="#000000" data-source-type="dots" style="left: 144.059px; top: 516.848px; width: 23.7622px; height: 135.152px;"><canvas></canvas></div><div class="smear-container" data-x="0.2573957055214724" data-y="0" data-width="0.18555061349693253" data-height="0.06498588957055215" data-start-edge="top" data-speed="83" data-source-interval="1174" data-pixel-size="6" data-color-fg="#FFFF00" data-color-bg="#000000" data-source-type="dots" style="left: 167.822px; top: 0px; width: 120.979px; height: 42.3708px;"><canvas></canvas></div><div class="smear-container" data-x="0.2573957055214724" data-y="0.06498588957055215" data-width="0.18555061349693253" data-height="0.23339877300613496" data-start-edge="bottom" data-speed="61" data-source-interval="1558" data-pixel-size="6" data-color-fg="#FFFFFF" data-color-bg="#000000" data-source-type="dots" style="left: 167.822px; top: 42.3708px; width: 120.979px; height: 152.176px;"><canvas></canvas></div><div class="smear-container" data-x="0.2573957055214724" data-y="0.29838496932515335" data-width="0.18555061349693253" data-height="0.20301226993865032" data-start-edge="top" data-speed="87" data-source-interval="823" data-pixel-size="3" data-color-fg="#FFFFFF" data-color-bg="#000000" data-source-type="dots" style="left: 167.822px; top: 194.547px; width: 120.979px; height: 132.364px;"><canvas></canvas></div><div class="smear-container" data-x="0.2573957055214724" data-y="0.5013987730061349" data-width="0.18555061349693253" data-height="0.045666411042944784" data-start-edge="left" data-speed="77" data-source-interval="530" data-pixel-size="6" data-color-fg="#FFFFFF" data-color-bg="#000000" data-source-type="dots" style="left: 167.822px; top: 326.912px; width: 120.979px; height: 29.7745px;"><canvas></canvas></div><div class="smear-container" data-x="0.2573957055214724" data-y="0.5470644171779141" data-width="0.18555061349693253" data-height="0.07304539877300613" data-start-edge="top" data-speed="66" data-source-interval="1928" data-pixel-size="1" data-color-fg="#FFFF00" data-color-bg="#000000" data-source-type="dots" style="left: 167.822px; top: 356.686px; width: 120.979px; height: 47.6256px;"><canvas></canvas></div><div class="smear-container" data-x="0.2573957055214724" data-y="0.6201104294478528" data-width="0.18555061349693253" data-height="0.216090490797546" data-start-edge="top" data-speed="93" data-source-interval="1718" data-pixel-size="1" data-color-fg="#FFFF00" data-color-bg="#000000" data-source-type="dots" style="left: 167.822px; top: 404.312px; width: 120.979px; height: 140.891px;"><canvas></canvas></div><div class="smear-container" data-x="0.2573957055214724" data-y="0.8362009202453987" data-width="0.18555061349693253" data-height="0.16379907975460123" data-start-edge="bottom" data-speed="46" data-source-interval="1813" data-pixel-size="5" data-color-fg="#FFFFFF" data-color-bg="#000000" data-source-type="dots" style="left: 167.822px; top: 545.203px; width: 120.979px; height: 106.797px;"><canvas></canvas></div><div class="smear-container" data-x="0.44294631901840487" data-y="0" data-width="0.040365337423312886" data-height="0.09197147239263805" data-start-edge="bottom" data-speed="96" data-source-interval="822" data-pixel-size="1" data-color-fg="#FFFFFF" data-color-bg="#000000" data-source-type="dots" style="left: 288.801px; top: 0px; width: 26.3182px; height: 59.9654px;"><canvas></canvas></div><div class="smear-container" data-x="0.44294631901840487" data-y="0.09197147239263805" data-width="0.040365337423312886" data-height="0.17137423312883437" data-start-edge="top" data-speed="47" data-source-interval="640" data-pixel-size="1" data-color-fg="#FFFF00" data-color-bg="#000000" data-source-type="dots" style="left: 288.801px; top: 59.9654px; width: 26.3182px; height: 111.736px;"><canvas></canvas></div><div class="smear-container" data-x="0.44294631901840487" data-y="0.2633466257668712" data-width="0.040365337423312886" data-height="0.022131901840490797" data-start-edge="right" data-speed="78" data-source-interval="1531" data-pixel-size="2" data-color-fg="#FFFFFF" data-color-bg="#000000" data-source-type="dots" style="left: 288.801px; top: 171.702px; width: 26.3182px; height: 14.43px;"><canvas></canvas></div><div class="smear-container" data-x="0.44294631901840487" data-y="0.285478527607362" data-width="0.040365337423312886" data-height="0.16240184049079753" data-start-edge="right" data-speed="41" data-source-interval="599" data-pixel-size="6" data-color-fg="#FFFF00" data-color-bg="#000000" data-source-type="dots" style="left: 288.801px; top: 186.132px; width: 26.3182px; height: 105.886px;"><canvas></canvas></div><div class="smear-container" data-x="0.44294631901840487" data-y="0.44788036809815945" data-width="0.040365337423312886" data-height="0.07035122699386503" data-start-edge="top" data-speed="44" data-source-interval="1454" data-pixel-size="6" data-color-fg="#FFFF00" data-color-bg="#000000" data-source-type="dots" style="left: 288.801px; top: 292.018px; width: 26.3182px; height: 45.869px;"><canvas></canvas></div><div class="smear-container" data-x="0.44294631901840487" data-y="0.5182315950920245" data-width="0.040365337423312886" data-height="0.044792331288343555" data-start-edge="right" data-speed="62" data-source-interval="561" data-pixel-size="1" data-color-fg="#FFFFFF" data-color-bg="#000000" data-source-type="dots" style="left: 288.801px; top: 337.887px; width: 26.3182px; height: 29.2046px;"><canvas></canvas></div><div class="smear-container" data-x="0.44294631901840487" data-y="0.5630245398773006" data-width="0.040365337423312886" data-height="0.16731134969325154" data-start-edge="top" data-speed="39" data-source-interval="1118" data-pixel-size="5" data-color-fg="#FFFFFF" data-color-bg="#000000" data-source-type="dots" style="left: 288.801px; top: 367.092px; width: 26.3182px; height: 109.087px;"><canvas></canvas></div><div class="smear-container" data-x="0.44294631901840487" data-y="0.7303358895705521" data-width="0.040365337423312886" data-height="0.06410015337423314" data-start-edge="right" data-speed="48" data-source-interval="1367" data-pixel-size="1" data-color-fg="#FFFF00" data-color-bg="#000000" data-source-type="dots" style="left: 288.801px; top: 476.179px; width: 26.3182px; height: 41.7933px;"><canvas></canvas></div><div class="smear-container" data-x="0.44294631901840487" data-y="0.7944355828220858" data-width="0.040365337423312886" data-height="0.1614340490797546" data-start-edge="right" data-speed="47" data-source-interval="1394" data-pixel-size="6" data-color-fg="#FFFFFF" data-color-bg="#000000" data-source-type="dots" style="left: 288.801px; top: 517.972px; width: 26.3182px; height: 105.255px;"><canvas></canvas></div><div class="smear-container" data-x="0.44294631901840487" data-y="0.9558696319018405" data-width="0.040365337423312886" data-height="0.044130674846625764" data-start-edge="top" data-speed="55" data-source-interval="1212" data-pixel-size="6" data-color-fg="#FFFF00" data-color-bg="#000000" data-source-type="dots" style="left: 288.801px; top: 623.227px; width: 26.3182px; height: 28.7732px;"><canvas></canvas></div><div class="smear-container" data-x="0.48331134969325157" data-y="0" data-width="0.13332668711656442" data-height="0.1985889570552147" data-start-edge="left" data-speed="45" data-source-interval="1902" data-pixel-size="3" data-color-fg="#FFFFFF" data-color-bg="#000000" data-source-type="dots" style="left: 315.119px; top: 0px; width: 86.929px; height: 129.48px;"><canvas></canvas></div><div class="smear-container" data-x="0.48331134969325157" data-y="0.1985889570552147" data-width="0.13332668711656442" data-height="0.41922852760736196" data-start-edge="bottom" data-speed="38" data-source-interval="1613" data-pixel-size="2" data-color-fg="#FFFF00" data-color-bg="#000000" data-source-type="dots" style="left: 315.119px; top: 129.48px; width: 86.929px; height: 273.337px;"><canvas></canvas></div><div class="smear-container" data-x="0.48331134969325157" data-y="0.6178174846625767" data-width="0.13332668711656442" data-height="0.12270536809815952" data-start-edge="right" data-speed="95" data-source-interval="1176" data-pixel-size="3" data-color-fg="#FFFF00" data-color-bg="#000000" data-source-type="dots" style="left: 315.119px; top: 402.817px; width: 86.929px; height: 80.0039px;"><canvas></canvas></div><div class="smear-container" data-x="0.48331134969325157" data-y="0.7405230061349694" data-width="0.13332668711656442" data-height="0.2594769938650307" data-start-edge="bottom" data-speed="52" data-source-interval="719" data-pixel-size="2" data-color-fg="#FFFFFF" data-color-bg="#000000" data-source-type="dots" style="left: 315.119px; top: 482.821px; width: 86.929px; height: 169.179px;"><canvas></canvas></div><div class="smear-container" data-x="0.616638036809816" data-y="0" data-width="0.19976380368098162" data-height="0.1449644171779141" data-start-edge="bottom" data-speed="36" data-source-interval="990" data-pixel-size="6" data-color-fg="#FFFFFF" data-color-bg="#000000" data-source-type="dots" style="left: 402.048px; top: 0px; width: 130.246px; height: 94.5168px;"><canvas></canvas></div><div class="smear-container" data-x="0.616638036809816" data-y="0.1449644171779141" data-width="0.19976380368098162" data-height="0.1264691717791411" data-start-edge="bottom" data-speed="91" data-source-interval="1251" data-pixel-size="3" data-color-fg="#FFFF00" data-color-bg="#000000" data-source-type="dots" style="left: 402.048px; top: 94.5168px; width: 130.246px; height: 82.4579px;"><canvas></canvas></div><div class="smear-container" data-x="0.616638036809816" data-y="0.2714340490797546" data-width="0.19976380368098162" data-height="0.12495015337423312" data-start-edge="right" data-speed="70" data-source-interval="1874" data-pixel-size="6" data-color-fg="#FFFF00" data-color-bg="#000000" data-source-type="dots" style="left: 402.048px; top: 176.975px; width: 130.246px; height: 81.4675px;"><canvas></canvas></div><div class="smear-container" data-x="0.616638036809816" data-y="0.3963834355828221" data-width="0.19976380368098162" data-height="0.08160030674846626" data-start-edge="left" data-speed="92" data-source-interval="755" data-pixel-size="5" data-color-fg="#FFFFFF" data-color-bg="#000000" data-source-type="dots" style="left: 402.048px; top: 258.442px; width: 130.246px; height: 53.2034px;"><canvas></canvas></div><div class="smear-container" data-x="0.616638036809816" data-y="0.47798466257668715" data-width="0.19976380368098162" data-height="0.1457222392638037" data-start-edge="right" data-speed="36" data-source-interval="1912" data-pixel-size="6" data-color-fg="#FFFFFF" data-color-bg="#000000" data-source-type="dots" style="left: 402.048px; top: 311.646px; width: 130.246px; height: 95.0109px;"><canvas></canvas></div><div class="smear-container" data-x="0.616638036809816" data-y="0.6237070552147239" data-width="0.19976380368098162" data-height="0.049105981595092024" data-start-edge="top" data-speed="47" data-source-interval="943" data-pixel-size="3" data-color-fg="#FFFFFF" data-color-bg="#000000" data-source-type="dots" style="left: 402.048px; top: 406.657px; width: 130.246px; height: 32.0171px;"><canvas></canvas></div><div class="smear-container" data-x="0.616638036809816" data-y="0.6728128834355828" data-width="0.19976380368098162" data-height="0.1269756134969325" data-start-edge="right" data-speed="35" data-source-interval="1263" data-pixel-size="1" data-color-fg="#FFFF00" data-color-bg="#000000" data-source-type="dots" style="left: 402.048px; top: 438.674px; width: 130.246px; height: 82.7881px;"><canvas></canvas></div><div class="smear-container" data-x="0.616638036809816" data-y="0.7997883435582822" data-width="0.19976380368098162" data-height="0.02351993865030675" data-start-edge="bottom" data-speed="69" data-source-interval="534" data-pixel-size="2" data-color-fg="#FFFFFF" data-color-bg="#000000" data-source-type="dots" style="left: 402.048px; top: 521.462px; width: 130.246px; height: 15.335px;"><canvas></canvas></div><div class="smear-container" data-x="0.616638036809816" data-y="0.823308282208589" data-width="0.19976380368098162" data-height="0.08364693251533742" data-start-edge="left" data-speed="55" data-source-interval="815" data-pixel-size="1" data-color-fg="#FFFF00" data-color-bg="#000000" data-source-type="dots" style="left: 402.048px; top: 536.797px; width: 130.246px; height: 54.5378px;"><canvas></canvas></div><div class="smear-container" data-x="0.616638036809816" data-y="0.9069555214723927" data-width="0.19976380368098162" data-height="0.09304493865030675" data-start-edge="right" data-speed="42" data-source-interval="1646" data-pixel-size="1" data-color-fg="#FFFFFF" data-color-bg="#000000" data-source-type="dots" style="left: 402.048px; top: 591.335px; width: 130.246px; height: 60.6653px;"><canvas></canvas></div><div class="smear-container" data-x="0.8164018404907976" data-y="0" data-width="0.18359815950920247" data-height="0.037021625766871166" data-start-edge="bottom" data-speed="98" data-source-interval="962" data-pixel-size="5" data-color-fg="#FFFFFF" data-color-bg="#000000" data-source-type="dots" style="left: 532.294px; top: 0px; width: 119.706px; height: 24.1381px;"><canvas></canvas></div><div class="smear-container" data-x="0.8164018404907976" data-y="0.037021625766871166" data-width="0.18359815950920247" data-height="0.0348532208588957" data-start-edge="left" data-speed="93" data-source-interval="527" data-pixel-size="2" data-color-fg="#FFFFFF" data-color-bg="#000000" data-source-type="dots" style="left: 532.294px; top: 24.1381px; width: 119.706px; height: 22.7243px;"><canvas></canvas></div><div class="smear-container" data-x="0.8164018404907976" data-y="0.07187484662576687" data-width="0.18359815950920247" data-height="0.13058803680981595" data-start-edge="top" data-speed="25" data-source-interval="1718" data-pixel-size="5" data-color-fg="#FFFF00" data-color-bg="#000000" data-source-type="dots" style="left: 532.294px; top: 46.8624px; width: 119.706px; height: 85.1434px;"><canvas></canvas></div><div class="smear-container" data-x="0.8164018404907976" data-y="0.20246319018404907" data-width="0.18359815950920247" data-height="0.05281733128834356" data-start-edge="bottom" data-speed="30" data-source-interval="536" data-pixel-size="5" data-color-fg="#FFFFFF" data-color-bg="#000000" data-source-type="dots" style="left: 532.294px; top: 132.006px; width: 119.706px; height: 34.4369px;"><canvas></canvas></div><div class="smear-container" data-x="0.8164018404907976" data-y="0.2552806748466258" data-width="0.18359815950920247" data-height="0.08331472392638037" data-start-edge="bottom" data-speed="33" data-source-interval="1130" data-pixel-size="6" data-color-fg="#FFFFFF" data-color-bg="#000000" data-source-type="dots" style="left: 532.294px; top: 166.443px; width: 119.706px; height: 54.3212px;"><canvas></canvas></div><div class="smear-container" data-x="0.8164018404907976" data-y="0.3385950920245399" data-width="0.18359815950920247" data-height="0.1446553680981595" data-start-edge="bottom" data-speed="41" data-source-interval="1046" data-pixel-size="5" data-color-fg="#FFFFFF" data-color-bg="#000000" data-source-type="dots" style="left: 532.294px; top: 220.764px; width: 119.706px; height: 94.3153px;"><canvas></canvas></div><div class="smear-container" data-x="0.8164018404907976" data-y="0.48325" data-width="0.18359815950920247" data-height="0.027403527607361963" data-start-edge="right" data-speed="74" data-source-interval="758" data-pixel-size="4" data-color-fg="#FFFFFF" data-color-bg="#000000" data-source-type="dots" style="left: 532.294px; top: 315.079px; width: 119.706px; height: 17.8671px;"><canvas></canvas></div><div class="smear-container" data-x="0.8164018404907976" data-y="0.5106533742331288" data-width="0.18359815950920247" data-height="0.13679585889570553" data-start-edge="left" data-speed="25" data-source-interval="832" data-pixel-size="1" data-color-fg="#FFFFFF" data-color-bg="#000000" data-source-type="dots" style="left: 532.294px; top: 332.946px; width: 119.706px; height: 89.1909px;"><canvas></canvas></div><div class="smear-container" data-x="0.8164018404907976" data-y="0.6474493865030675" data-width="0.18359815950920247" data-height="0.08463972392638036" data-start-edge="right" data-speed="42" data-source-interval="1534" data-pixel-size="2" data-color-fg="#FFFF00" data-color-bg="#000000" data-source-type="dots" style="left: 532.294px; top: 422.137px; width: 119.706px; height: 55.1851px;"><canvas></canvas></div><div class="smear-container" data-x="0.8164018404907976" data-y="0.7320889570552147" data-width="0.18359815950920247" data-height="0.016112423312883435" data-start-edge="right" data-speed="59" data-source-interval="1743" data-pixel-size="2" data-color-fg="#FFFFFF" data-color-bg="#000000" data-source-type="dots" style="left: 532.294px; top: 477.322px; width: 119.706px; height: 10.5053px;"><canvas></canvas></div><div class="smear-container" data-x="0.8164018404907976" data-y="0.74820245398773" data-width="0.18359815950920247" data-height="0.1270187116564417" data-start-edge="left" data-speed="79" data-source-interval="1147" data-pixel-size="6" data-color-fg="#FFFFFF" data-color-bg="#000000" data-source-type="dots" style="left: 532.294px; top: 487.828px; width: 119.706px; height: 82.8162px;"><canvas></canvas></div><div class="smear-container" data-x="0.8164018404907976" data-y="0.8752208588957056" data-width="0.18359815950920247" data-height="0.12477944785276074" data-start-edge="left" data-speed="87" data-source-interval="651" data-pixel-size="6" data-color-fg="#FFFF00" data-color-bg="#000000" data-source-type="dots" style="left: 532.294px; top: 570.644px; width: 119.706px; height: 81.3562px;"><canvas></canvas></div></div><script> class SmearCanvas { constructor(c) { this.container = c; this.canvas = c.querySelector("canvas") || document.createElement("canvas"); if (!c.querySelector("canvas")) c.appendChild(this.canvas); this.ctx = this.canvas.getContext("2d"); this.ctx.imageSmoothingEnabled = false; this.imageData = null; this.lastTime = 0; this.animationId = null; this.speed = parseInt(c.dataset.speed) || 50; this.pixelSize = parseInt(c.dataset.pixelSize) || 2; this.sourceInterval = parseInt(c.dataset.sourceInterval) || 1000; this.colorFg = c.dataset.colorFg || "#FFFFFF"; this.colorBg = c.dataset.colorBg || "#000000"; this.sourceType = c.dataset.sourceType || "noise"; this.startEdge = c.dataset.startEdge || "top"; this.fgRGB = this.hexToRGB(this.colorFg); this.bgRGB = this.hexToRGB(this.colorBg); this.moveSpeed = (1000 / 60) / this.speed; this.subPixelX = 0; this.subPixelY = 0; this.leadX = 0; this.leadY = 0; this.initDirection(); this.lastDirectionChange = 0; this.nextDirectionInterval = this.randomInterval(); this.sourceParams = this.generateSourceParams(); this.lastSourceTime = 0; this.resize(); this.initCanvas(); this.generateSourceEdge(); this.initLeadPosition(); this.startAnimation(); this.resizeObserver = new ResizeObserver(() => this.resize()); this.resizeObserver.observe(this.container); } generateSourceParams() { return { steps: 3 + Math.floor(Math.random() * 6), stripeWidth: 2 + Math.floor(Math.random() * 8), checkSize: 1 + Math.floor(Math.random() * 4), phase: 0, dashLength: 3 + Math.floor(Math.random() * 10), gapLength: 2 + Math.floor(Math.random() * 6), density: 0.05 + Math.random() * 0.25, frequency: 1 + Math.random() * 4, sinePhase: Math.random() * Math.PI * 2, seed1: Math.random() * 100, seed2: Math.random() * 100, seed3: Math.random() * 100, counter: Math.floor(Math.random() * 65536), caRule: Math.random() > 0.5 ? 30 : 110 }; } initDirection() { switch (this.startEdge) { case "top": this.dx = 0; this.dy = 1; break; case "bottom": this.dx = 0; this.dy = -1; break; case "left": this.dx = 1; this.dy = 0; break; case "right": this.dx = -1; this.dy = 0; break; default: this.dx = 0; this.dy = 1; } } initLeadPosition() { switch (this.startEdge) { case "top": this.leadX = Math.floor(this.internalWidth / 2); this.leadY = 1; break; case "bottom": this.leadX = Math.floor(this.internalWidth / 2); this.leadY = this.internalHeight - 2; break; case "left": this.leadX = 1; this.leadY = Math.floor(this.internalHeight / 2); break; case "right": this.leadX = this.internalWidth - 2; this.leadY = Math.floor(this.internalHeight / 2); break; } } resize() { var rect = this.container.getBoundingClientRect(); if (rect.width === 0 || rect.height === 0) return; this.internalWidth = Math.ceil(rect.width / this.pixelSize); this.internalHeight = Math.ceil(rect.height / this.pixelSize); var oldImageData = this.imageData; var oldWidth = this.canvas.width; var oldHeight = this.canvas.height; this.canvas.width = this.internalWidth; this.canvas.height = this.internalHeight; this.imageData = this.ctx.createImageData(this.internalWidth, this.internalHeight); if (oldImageData && oldWidth > 0 && oldHeight > 0) { var minW = Math.min(oldWidth, this.internalWidth); var minH = Math.min(oldHeight, this.internalHeight); for (var y = 0; y < minH; y++) { for (var x = 0; x < minW; x++) { var oi = (y * oldWidth + x) * 4; var ni = (y * this.internalWidth + x) * 4; this.imageData.data[ni] = oldImageData.data[oi]; this.imageData.data[ni + 1] = oldImageData.data[oi + 1]; this.imageData.data[ni + 2] = oldImageData.data[oi + 2]; this.imageData.data[ni + 3] = oldImageData.data[oi + 3]; } } } } hexToRGB(hex) { var r = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex); return r ? { r: parseInt(r[1], 16), g: parseInt(r[2], 16), b: parseInt(r[3], 16) } : { r: 255, g: 255, b: 255 }; } lerpColor(t) { return { r: Math.round(this.bgRGB.r + (this.fgRGB.r - this.bgRGB.r) * t), g: Math.round(this.bgRGB.g + (this.fgRGB.g - this.bgRGB.g) * t), b: Math.round(this.bgRGB.b + (this.fgRGB.b - this.bgRGB.b) * t) }; } getSourceValue(pos, length) { var t = pos / length; switch (this.sourceType) { case "noise": return Math.random() > 0.5 ? this.fgRGB : this.bgRGB; case "linear-gradient": return this.lerpColor(t); case "stepped-gradient": var steps = this.sourceParams.steps || 5; return this.lerpColor(Math.floor(t * steps) / (steps - 1)); case "random-gradient": if (!this.gradientCache || this.gradientCache.length !== length) this.generateRandomGradient(length); return this.lerpColor(this.gradientCache[pos]); case "stripes": return (Math.floor(pos / (this.sourceParams.stripeWidth || 4)) % 2 === 0) ? this.fgRGB : this.bgRGB; case "checkerboard": return ((Math.floor(pos / (this.sourceParams.checkSize || 2)) + (this.sourceParams.phase || 0)) % 2 === 0) ? this.fgRGB : this.bgRGB; case "dashes": var cycle = (this.sourceParams.dashLength || 6) + (this.sourceParams.gapLength || 3); return (pos % cycle < (this.sourceParams.dashLength || 6)) ? this.fgRGB : this.bgRGB; case "dots": return Math.random() < (this.sourceParams.density || 0.15) ? this.fgRGB : this.bgRGB; case "sine": var sv = (Math.sin((t * (this.sourceParams.frequency || 2) * Math.PI * 2) + (this.sourceParams.sinePhase || 0)) + 1) / 2; return this.lerpColor(sv); case "perlin": var p1 = Math.sin(t * 3.7 + this.sourceParams.seed1) * 0.5; var p2 = Math.sin(t * 7.3 + this.sourceParams.seed2) * 0.25; var p3 = Math.sin(t * 13.1 + this.sourceParams.seed3) * 0.125; return this.lerpColor(Math.max(0, Math.min(1, (p1 + p2 + p3 + 0.875) / 1.75))); case "binary-counter": return ((this.sourceParams.counter >> (pos % 16)) & 1) ? this.fgRGB : this.bgRGB; case "cellular-automata": if (!this.caState || this.caState.length !== length) this.initCellularAutomata(length); return this.caState[pos] ? this.fgRGB : this.bgRGB; default: return Math.random() > 0.5 ? this.fgRGB : this.bgRGB; } } generateRandomGradient(length) { var np = 3 + Math.floor(Math.random() * 4); var cp = [0]; for (var i = 1; i < np - 1; i++) cp.push(Math.random()); cp.push(1); cp.sort((a, b) => a - b); var cv = cp.map(() => Math.random()); this.gradientCache = []; for (var i = 0; i < length; i++) { var t = i / length; var si = 0; for (var j = 0; j < cp.length - 1; j++) { if (t >= cp[j] && t <= cp[j + 1]) { si = j; break; } } var st = (t - cp[si]) / (cp[si + 1] - cp[si]); this.gradientCache.push(cv[si] + (cv[si + 1] - cv[si]) * st); } } initCellularAutomata(length) { this.caState = []; for (var i = 0; i < length; i++) this.caState.push(Math.random() > 0.5); } evolveCellularAutomata() { if (!this.caState) return; var rule = this.sourceParams.caRule || 30; var os = [...this.caState]; var len = this.caState.length; for (var i = 0; i < len; i++) { var p = (os[(i - 1 + len) % len] ? 4 : 0) + (os[i] ? 2 : 0) + (os[(i + 1) % len] ? 1 : 0); this.caState[i] = ((rule >> p) & 1) === 1; } } updateSourceParams() { switch (this.sourceType) { case "checkerboard": this.sourceParams.phase = (this.sourceParams.phase + 1) % 2; break; case "sine": this.sourceParams.sinePhase += 0.5; break; case "binary-counter": this.sourceParams.counter++; break; case "cellular-automata": this.evolveCellularAutomata(); break; case "random-gradient": this.gradientCache = null; break; case "perlin": this.sourceParams.seed1 += 0.3; this.sourceParams.seed2 += 0.2; this.sourceParams.seed3 += 0.1; break; } } randomInterval() { return 100 + Math.random() * 900; } changeDirection() { var dirs = [[0, 1], [1, 1], [1, 0], [1, -1], [0, -1], [-1, -1], [-1, 0], [-1, 1]]; var idx = dirs.findIndex(d => d[0] === this.dx && d[1] === this.dy); if (idx === -1) idx = 0; idx = Math.random() > 0.5 ? (idx + 1) % 8 : (idx + 7) % 8; this.dx = dirs[idx][0]; this.dy = dirs[idx][1]; } initCanvas() { if (!this.imageData) return; var data = this.imageData.data; var w = this.internalWidth, h = this.internalHeight; var isH = (this.startEdge === "top" || this.startEdge === "bottom"); for (var y = 0; y < h; y++) { for (var x = 0; x < w; x++) { var idx = (y * w + x) * 4; var col = this.getSourceValue(isH ? x : y, isH ? w : h); data[idx] = col.r; data[idx + 1] = col.g; data[idx + 2] = col.b; data[idx + 3] = 255; } } this.ctx.putImageData(this.imageData, 0, 0); } generateSourceEdge() { if (!this.imageData) return; this.updateSourceParams(); var data = this.imageData.data; var w = this.internalWidth, h = this.internalHeight; var gen = (getIdx, len) => { for (var i = 0; i < len; i++) { var idx = getIdx(i); var c = this.getSourceValue(i, len); data[idx] = c.r; data[idx + 1] = c.g; data[idx + 2] = c.b; data[idx + 3] = 255; } }; switch (this.startEdge) { case "top": gen(x => x * 4, w); break; case "bottom": gen(x => ((h - 1) * w + x) * 4, w); break; case "left": gen(y => (y * w) * 4, h); break; case "right": gen(y => (y * w + (w - 1)) * 4, h); break; } } getSourceEdgeCoord(x, y) { switch (this.startEdge) { case "top": return y === 0; case "bottom": return y === this.internalHeight - 1; case "left": return x === 0; case "right": return x === this.internalWidth - 1; } return false; } smear() { if (!this.imageData) return; var data = this.imageData.data; var w = this.internalWidth, h = this.internalHeight; this.subPixelX += this.dx * this.moveSpeed; this.subPixelY += this.dy * this.moveSpeed; var moveX = Math.trunc(this.subPixelX), moveY = Math.trunc(this.subPixelY); if (moveX === 0 && moveY === 0) return; this.subPixelX -= moveX; this.subPixelY -= moveY; this.leadX += moveX; this.leadY += moveY; if (this.leadX <= 0 || this.leadX >= w - 1) { this.dx = -this.dx; this.leadX = Math.max(0, Math.min(w - 1, this.leadX)); } if (this.leadY <= 0 || this.leadY >= h - 1) { this.dy = -this.dy; this.leadY = Math.max(0, Math.min(h - 1, this.leadY)); } var oldData = new Uint8ClampedArray(data); for (var y = 0; y < h; y++) { for (var x = 0; x < w; x++) { if (this.getSourceEdgeCoord(x, y)) continue; var srcX = Math.max(0, Math.min(w - 1, x - moveX)); var srcY = Math.max(0, Math.min(h - 1, y - moveY)); var dstIdx = (y * w + x) * 4, srcIdx = (srcY * w + srcX) * 4; data[dstIdx] = oldData[srcIdx]; data[dstIdx + 1] = oldData[srcIdx + 1]; data[dstIdx + 2] = oldData[srcIdx + 2]; data[dstIdx + 3] = oldData[srcIdx + 3]; } } } startAnimation() { var fi = 1000 / 60; var animate = (ts) => { if (!this.lastTime) this.lastTime = ts; if (!this.lastSourceTime) this.lastSourceTime = ts; if (!this.lastDirectionChange) this.lastDirectionChange = ts; if (ts - this.lastDirectionChange >= this.nextDirectionInterval) { this.changeDirection(); this.lastDirectionChange = ts; this.nextDirectionInterval = this.randomInterval(); } if (ts - this.lastSourceTime >= this.sourceInterval) { this.generateSourceEdge(); this.lastSourceTime = ts; } if (ts - this.lastTime >= fi) { this.smear(); if (this.imageData) this.ctx.putImageData(this.imageData, 0, 0); this.lastTime = ts; } this.animationId = requestAnimationFrame(animate); }; this.animationId = requestAnimationFrame(animate); } } function layoutSmears() { var vw = window.innerWidth, vh = window.innerHeight; document.querySelectorAll(".smear-container").forEach(function(div) { var x = parseFloat(div.dataset.x || 0); var y = parseFloat(div.dataset.y || 0); var w = parseFloat(div.dataset.width || 0); var h = parseFloat(div.dataset.height || 0); div.style.left = (x * vw) + "px"; div.style.top = (y * vh) + "px"; div.style.width = (w * vw) + "px"; div.style.height = (h * vh) + "px"; }); } function initSmears() { document.querySelectorAll(".smear-container").forEach(function(c) { if (!c._smearInstance) c._smearInstance = new SmearCanvas(c); }); } window.addEventListener("load", function() { layoutSmears(); initSmears(); }); window.addEventListener("resize", layoutSmears); layoutSmears(); initSmears(); </script></body></html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Black & White Noise</title> <style> * { margin: 0; padding: 0; box-sizing: border-box; } body, html { width: 100%; height: 100%; overflow: hidden; background: #000; } canvas { display: block; width: 100%; height: 100%; } </style> </head> <body> <canvas id="noise"></canvas> <script> const canvas = document.getElementById('noise'); const ctx = canvas.getContext('2d'); function resize() { canvas.width = window.innerWidth; canvas.height = window.innerHeight; } function generateNoise() { const imageData = ctx.createImageData(canvas.width, canvas.height); const data = imageData.data; for (let i = 0; i < data.length; i += 4) { const value = Math.random() > 0.5 ? 255 : 0; data[i] = value; // Red data[i + 1] = value; // Green data[i + 2] = value; // Blue data[i + 3] = 255; // Alpha } ctx.putImageData(imageData, 0, 0); } function animate() { generateNoise(); requestAnimationFrame(animate); } window.addEventListener('resize', resize); resize(); animate(); </script> </body> </html>
<!doctype html><html><head><meta charset="utf-8"><title>shards</title><style> :root { /* Pattern 1: 7 bands */ --color1: #bb44dd; --color2: #000; --pos1: 0%; --pos2: 8.33%; --pos3: 25%; --pos4: 41.67%; --pos5: 58.33%; --pos6: 75%; --pos7: 91.67%; /* Pattern 2: 5 bands */ --color2-1: #6486f5; --color2-2: #000; --pos2-1: 0%; --pos2-2: 12.5%; --pos2-3: 37.5%; --pos2-4: 62.5%; --pos2-5: 87.5%; /* Pattern 3: 3 bands */ --color3-1: #ffffff; --color3-2: #000; --color4-1: #ff00cc; --color4-2: #000; --pos3-1: 0%; --pos3-2: 50%; --pos3-3: 100%; } body { background-color: black; margin: 0; padding: 0; width: 100vw; height: 100vh; overflow: hidden; } .gradient-container { position: absolute; overflow: hidden; transition: all 0.3s ease; clip-path: var(--clip-path); /* Emboss effect */ box-shadow: inset 2px 2px 5px rgba(255, 255, 255, 0.4), inset -2px -2px 5px rgba(0, 0, 0, 0.4); /* Add more depth with a subtle border */ } .gradient-up { background-image: repeating-linear-gradient( to bottom, var(--color1) var(--pos1), var(--color2) var(--pos2), var(--color1) var(--pos3), var(--color2) var(--pos4), var(--color1) var(--pos5), var(--color2) var(--pos6), var(--color1) var(--pos7) ); animation: moveUpwards 5s linear infinite; } .gradient-down { background-image: repeating-linear-gradient( to bottom, var(--color2-1) var(--pos2-1), var(--color2-2) var(--pos2-2), var(--color2-1) var(--pos2-3), var(--color2-2) var(--pos2-4), var(--color2-1) var(--pos2-5) ); animation: moveDownwards 5s linear infinite; } .gradient-left { background-image: repeating-linear-gradient( to right, var(--color3-1) var(--pos3-1), var(--color3-2) var(--pos3-2), var(--color3-1) var(--pos3-3) ); animation: moveLeft 5s linear infinite; } .gradient-right { background-image: repeating-linear-gradient( to right, var(--color4-1) var(--pos1), var(--color4-2) var(--pos2), var(--color4-1) var(--pos3), var(--color4-2) var(--pos4), var(--color4-1) var(--pos5), var(--color4-2) var(--pos6), var(--color4-1) var(--pos7) ); animation: moveRight 5s linear infinite; } .strobe { background-color: #000; } @keyframes strobeEffect { 0% { opacity: 0; } 100% { opacity: 1; } } @keyframes moveUpwards { 0% { background-position: 0 100%; } 100% { background-position: 0 -100%; } } @keyframes moveDownwards { 0% { background-position: 0 -100%; } 100% { background-position: 0 100%; } } @keyframes moveLeft { 0% { background-position: 100% 0; } 100% { background-position: -100% 0; } } @keyframes moveRight { 0% { background-position: -100% 0; } 100% { background-position: 100% 0; } } :root{--color1:#ff0000;--color2:#000;--pos1:0%;--pos2:8.33%;--pos3:25%;--pos4:41.67%;--pos5:58.33%;--pos6:75%;--pos7:91.67%;--color2-1:#400026;--color2-2:#000;--pos2-1:0%;--pos2-2:12.5%;--pos2-3:37.5%;--pos2-4:62.5%;--pos2-5:87.5%;--color3-1:#00ff0c;--color3-2:#000;--color4-1:#0600ff;--color4-2:#000;--pos3-1:0%;--pos3-2:50%;--pos3-3:100%;}:root{--color1: #ff0000; --color2-1: #400026; --color3-1: #00ff0c; --color4-1: #0600ff;}</style></head><body style="margin:0;background-color:black;width:100vw;height:100vh;overflow:hidden;"><div id="puzzle-container"><div class="gradient-container gradient-right" data-x="0" data-y="0" data-width="0.206388" data-height="0.12749" style="left: 0px; top: 0px; width: 134.152px; height: 82.8685px; --clip-path: polygon(0% 0%, 98% 0%, 133% 71%, 0% 114%); background-size: 268.304px 82.8685px; animation-duration: 43s;"></div><div class="gradient-container gradient-left" data-x="0.206388" data-y="0" data-width="0.02041199999999999" data-height="0.12749" style="left: 134.152px; top: 0px; width: 13.2678px; height: 82.8685px; --clip-path: polygon(-22% 0%, -28% 0%, 243% 158%, 335% 71%); background-size: 26.5356px 82.8685px; animation-duration: 62s;"></div><div class="gradient-container gradient-left" data-x="0" data-y="0.12749" data-width="0.201852" data-height="0.20801" style="left: 0px; top: 82.8685px; width: 131.204px; height: 135.207px; --clip-path: polygon(0% 9%, 75% -17%, 114% 98%, 0% 75%); background-size: 262.408px 135.207px; animation-duration: 72s;"></div><div class="gradient-container gradient-up" data-x="0.201852" data-y="0.12749" data-width="0.02494799999999998" data-height="0.20801" style="left: 131.204px; top: 82.8685px; width: 16.2162px; height: 135.207px; --clip-path: polygon(-202% -17%, 217% 36%, 405% 129%, 117% 98%); background-size: 16.2162px 270.413px; animation-duration: 68s;"></div><div class="gradient-container gradient-up" data-x="0.22679999999999997" data-y="0" data-width="0.04698" data-height="0.110715" style="left: 147.42px; top: 0px; width: 30.537px; height: 71.9647px; --clip-path: polygon(-56% 0%, 267% 0%, 100% 103%, 60% 158%); background-size: 30.537px 143.929px; animation-duration: 43s;"></div><div class="gradient-container gradient-left" data-x="0.27377999999999997" data-y="0" data-width="0.26622" data-height="0.110715" style="left: 177.957px; top: 0px; width: 173.043px; height: 71.9647px; --clip-path: polygon(30% 0%, 84% 0%, 78% 101%, 0% 103%); background-size: 346.086px 71.9647px; animation-duration: 32s;"></div><div class="gradient-container gradient-up" data-x="0.22679999999999997" data-y="0.110715" data-width="0.31320000000000003" data-height="0.224785" style="left: 147.42px; top: 71.9647px; width: 203.58px; height: 146.11px; --clip-path: polygon(9% 28%, 82% 1%, 78% 88%, 24% 126%); background-size: 203.58px 292.221px; animation-duration: 79s;"></div><div class="gradient-container gradient-right" data-x="0" data-y="0.33549999999999996" data-width="0.54" data-height="0.21450000000000002" style="left: 0px; top: 218.075px; width: 351px; height: 139.425px; --clip-path: polygon(0% -24%, 87% -12%, 106% 68%, 0% 76%); background-size: 702px 139.425px; animation-duration: 80s;"></div><div class="gradient-container gradient-left" data-x="0.54" data-y="0" data-width="0.46" data-height="0.55" style="left: 351px; top: 0px; width: 299px; height: 357.5px; --clip-path: polygon(-9% 0%, 100% 0%, 100% 89%, 7% 87%); background-size: 598px 357.5px; animation-duration: 28s;"></div><div class="gradient-container gradient-left" data-x="0" data-y="0.55" data-width="0.0364" data-height="0.180675" style="left: 0px; top: 357.5px; width: 23.66px; height: 117.439px; --clip-path: polygon(0% -29%, 170% -4%, 182% 98%, 0% 111%); background-size: 47.32px 117.439px; animation-duration: 12s;"></div><div class="gradient-container gradient-down" data-x="0" data-y="0.7306750000000001" data-width="0.0364" data-height="0.058806000000000004" style="left: 0px; top: 474.939px; width: 23.66px; height: 38.2239px; --clip-path: polygon(0% 35%, 182% -6%, 264% 62%, 0% 24%); background-size: 23.66px 76.4478px; animation-duration: 91s;"></div><div class="gradient-container gradient-down" data-x="0" data-y="0.789481" data-width="0.0364" data-height="0.008019000000000002" style="left: 0px; top: 513.163px; width: 23.66px; height: 5.21235px; --clip-path: polygon(0% -560%, 264% -278%, -113% 86%, 0% 842%); background-size: 23.66px 10.4247px; animation-duration: 16s;"></div><div class="gradient-container gradient-down" data-x="0.0364" data-y="0.55" data-width="0.2436" data-height="0.2475" style="left: 23.66px; top: 357.5px; width: 158.34px; height: 160.875px; --clip-path: polygon(10% -3%, 99% 13%, 118% 121%, -32% 100%); background-size: 158.34px 321.75px; animation-duration: 27s;"></div><div class="gradient-container gradient-down" data-x="0" data-y="0.7975" data-width="0.078736" data-height="0.0891" style="left: 0px; top: 518.375px; width: 51.1784px; height: 57.915px; --clip-path: polygon(0% 67%, 142% 86%, 118% 34%, 0% 30%); background-size: 51.1784px 115.83px; animation-duration: 26s;"></div><div class="gradient-container gradient-down" data-x="0.078736" data-y="0.7975" data-width="0.024864" data-height="0.0891" style="left: 51.1784px; top: 518.375px; width: 16.1616px; height: 57.915px; --clip-path: polygon(132% 86%, -191% 51%, 75% 16%, 56% 34%); background-size: 16.1616px 115.83px; animation-duration: 72s;"></div><div class="gradient-container gradient-up" data-x="0" data-y="0.8865999999999999" data-width="0.10360000000000001" data-height="0.11340000000000001" style="left: 0px; top: 576.29px; width: 67.34px; height: 73.71px; --clip-path: polygon(0% -55%, 94% -66%, 109% 100%, 0% 100%); background-size: 67.34px 147.42px; animation-duration: 76s;"></div><div class="gradient-container gradient-left" data-x="0.10360000000000001" data-y="0.7975" data-width="0.09349199999999999" data-height="0.010125" style="left: 67.34px; top: 518.375px; width: 60.7698px; height: 6.58125px; --clip-path: polygon(-77% 451%, 35% 451%, 156% 520%, 3% -358%); background-size: 121.54px 6.58125px; animation-duration: 82s;"></div><div class="gradient-container gradient-right" data-x="0.19709200000000002" data-y="0.7975" data-width="0.082908" data-height="0.010125" style="left: 128.11px; top: 518.375px; width: 53.8902px; height: 6.58125px; --clip-path: polygon(-73% 451%, 154% 503%, 114% -329%, 63% 520%); background-size: 107.78px 6.58125px; animation-duration: 98s;"></div><div class="gradient-container gradient-up" data-x="0.10360000000000001" data-y="0.8076249999999999" data-width="0.1764" data-height="0.15582375" style="left: 67.34px; top: 524.956px; width: 114.66px; height: 101.285px; --clip-path: polygon(2% -30%, 107% -28%, 132% 53%, 4% 59%); background-size: 114.66px 202.571px; animation-duration: 6s;"></div><div class="gradient-container gradient-left" data-x="0.10360000000000001" data-y="0.9634487499999999" data-width="0.1764" data-height="0.03655125" style="left: 67.34px; top: 626.242px; width: 114.66px; height: 23.7583px; --clip-path: polygon(4% -174%, 132% -199%, 59% 100%, 6% 100%); background-size: 229.32px 23.7583px; animation-duration: 41s;"></div><div class="gradient-container gradient-up" data-x="0.28" data-y="0.55" data-width="0.26892" data-height="0.061200000000000004" style="left: 182px; top: 357.5px; width: 174.798px; height: 39.78px; --clip-path: polygon(-1% 51%, 118% 99%, 88% 35%, -13% 43%); background-size: 174.798px 79.56px; animation-duration: 5s;"></div><div class="gradient-container gradient-right" data-x="0.54892" data-y="0.55" data-width="0.05507999999999999" data-height="0.061200000000000004" style="left: 356.798px; top: 357.5px; width: 35.802px; height: 39.78px; --clip-path: polygon(88% 99%, -24% -113%, 125% 207%, -57% 35%); background-size: 71.604px 39.78px; animation-duration: 32s;"></div><div class="gradient-container gradient-right" data-x="0.28" data-y="0.6112" data-width="0.324" data-height="0.3213" style="left: 182px; top: 397.28px; width: 210.6px; height: 208.845px; --clip-path: polygon(-10% -11%, 104% 20%, 122% 91%, 4% 106%); background-size: 421.2px 208.845px; animation-duration: 73s;"></div><div class="gradient-container gradient-right" data-x="0.28" data-y="0.9325" data-width="0.0513864" data-height="0.0675" style="left: 182px; top: 606.125px; width: 33.4012px; height: 43.875px; --clip-path: polygon(26% 27%, 254% -35%, -46% 100%, -140% 100%); background-size: 66.8023px 43.875px; animation-duration: 49s;"></div><div class="gradient-container gradient-left" data-x="0.3313864" data-y="0.9325" data-width="0.1462536" data-height="0.0675" style="left: 215.401px; top: 606.125px; width: 95.0648px; height: 43.875px; --clip-path: polygon(54% -35%, 61% -118%, 130% 100%, -51% 100%); background-size: 190.13px 43.875px; animation-duration: 61s;"></div><div class="gradient-container gradient-down" data-x="0.47764" data-y="0.9325" data-width="0.11498759999999998" data-height="0.0675" style="left: 310.466px; top: 606.125px; width: 74.7419px; height: 43.875px; --clip-path: polygon(-49% -118%, 38% -117%, 80% 100%, 38% 100%); background-size: 74.7419px 87.75px; animation-duration: 86s;"></div><div class="gradient-container gradient-left" data-x="0.5926276" data-y="0.9325" data-width="0.011372400000000001" data-height="0.0675" style="left: 385.208px; top: 606.125px; width: 7.39206px; height: 43.875px; --clip-path: polygon(-624% -117%, 724% -44%, -143% 100%, -201% 100%); background-size: 14.7841px 43.875px; animation-duration: 81s;"></div><div class="gradient-container gradient-up" data-x="0.604" data-y="0.55" data-width="0.12672" data-height="0.14850000000000002" style="left: 392.6px; top: 357.5px; width: 82.368px; height: 96.525px; --clip-path: polygon(-54% -47%, 162% -16%, 53% 88%, 18% 72%); background-size: 82.368px 193.05px; animation-duration: 82s;"></div><div class="gradient-container gradient-left" data-x="0.73072" data-y="0.55" data-width="0.24773759999999995" data-height="0.14850000000000002" style="left: 474.968px; top: 357.5px; width: 161.029px; height: 96.525px; --clip-path: polygon(32% -16%, 127% -12%, 111% 147%, -24% 88%); background-size: 322.059px 96.525px; animation-duration: 69s;"></div><div class="gradient-container gradient-down" data-x="0.9784575999999999" data-y="0.55" data-width="0.021542400000000027" data-height="0.14850000000000002" style="left: 635.997px; top: 357.5px; width: 14.0026px; height: 96.525px; --clip-path: polygon(312% -12%, 100% -41%, 100% 130%, 129% 147%); background-size: 14.0026px 193.05px; animation-duration: 40s;"></div><div class="gradient-container gradient-down" data-x="0.604" data-y="0.6985" data-width="0.26532" data-height="0.3015" style="left: 392.6px; top: 454.025px; width: 172.458px; height: 195.975px; --clip-path: polygon(9% -14%, 70% 5%, 112% 100%, -10% 100%); background-size: 172.458px 391.95px; animation-duration: 82s;"></div><div class="gradient-container gradient-up" data-x="0.86932" data-y="0.6985" data-width="0.13067999999999996" data-height="0.057285" style="left: 565.058px; top: 454.025px; width: 84.942px; height: 37.2353px; --clip-path: polygon(-60% 26%, 100% 77%, 100% -18%, -38% 73%); background-size: 84.942px 74.4705px; animation-duration: 37s;"></div><div class="gradient-container gradient-right" data-x="0.86932" data-y="0.7557849999999999" data-width="0.13067999999999996" data-height="0.244215" style="left: 565.058px; top: 491.26px; width: 84.942px; height: 158.74px; --clip-path: polygon(-38% -6%, 100% -28%, 100% 100%, 24% 100%); background-size: 169.884px 158.74px; animation-duration: 92s;"></div></div><script>function layoutShards(){var vw=window.innerWidth;var vh=window.innerHeight;document.querySelectorAll(".gradient-container").forEach(function(div){var x=parseFloat(div.dataset.x||0);var y=parseFloat(div.dataset.y||0);var w=parseFloat(div.dataset.width||0);var h=parseFloat(div.dataset.height||0);div.style.left=(x*vw)+"px";div.style.top=(y*vh)+"px";div.style.width=(w*vw)+"px";div.style.height=(h*vh)+"px";if(div.classList.contains("gradient-left")||div.classList.contains("gradient-right")){div.style.backgroundSize=(w*vw*2)+"px "+(h*vh)+"px";}else{div.style.backgroundSize=(w*vw)+"px "+(h*vh*2)+"px";}});}window.addEventListener("resize",layoutShards);window.addEventListener("load",layoutShards);layoutShards();</script></body></html>
<!doctype html><html><head><meta charset="utf-8"><title>shards</title><style> :root { /* Pattern 1: 7 bands */ --color1: #bb44dd; --color2: #000; --pos1: 0%; --pos2: 8.33%; --pos3: 25%; --pos4: 41.67%; --pos5: 58.33%; --pos6: 75%; --pos7: 91.67%; /* Pattern 2: 5 bands */ --color2-1: #6486f5; --color2-2: #000; --pos2-1: 0%; --pos2-2: 12.5%; --pos2-3: 37.5%; --pos2-4: 62.5%; --pos2-5: 87.5%; /* Pattern 3: 3 bands */ --color3-1: #ffffff; --color3-2: #000; --color4-1: #ff00cc; --color4-2: #000; --pos3-1: 0%; --pos3-2: 50%; --pos3-3: 100%; } body { background-color: black; margin: 0; padding: 0; width: 100vw; height: 100vh; overflow: hidden; } .gradient-container { position: absolute; overflow: hidden; transition: all 0.3s ease; clip-path: var(--clip-path); /* Emboss effect */ box-shadow: inset 2px 2px 5px rgba(255, 255, 255, 0.4), inset -2px -2px 5px rgba(0, 0, 0, 0.4); /* Add more depth with a subtle border */ } .gradient-up { background-image: repeating-linear-gradient( to bottom, var(--color1) var(--pos1), var(--color2) var(--pos2), var(--color1) var(--pos3), var(--color2) var(--pos4), var(--color1) var(--pos5), var(--color2) var(--pos6), var(--color1) var(--pos7) ); animation: moveUpwards 5s linear infinite; } .gradient-down { background-image: repeating-linear-gradient( to bottom, var(--color2-1) var(--pos2-1), var(--color2-2) var(--pos2-2), var(--color2-1) var(--pos2-3), var(--color2-2) var(--pos2-4), var(--color2-1) var(--pos2-5) ); animation: moveDownwards 5s linear infinite; } .gradient-left { background-image: repeating-linear-gradient( to right, var(--color3-1) var(--pos3-1), var(--color3-2) var(--pos3-2), var(--color3-1) var(--pos3-3) ); animation: moveLeft 5s linear infinite; } .gradient-right { background-image: repeating-linear-gradient( to right, var(--color4-1) var(--pos1), var(--color4-2) var(--pos2), var(--color4-1) var(--pos3), var(--color4-2) var(--pos4), var(--color4-1) var(--pos5), var(--color4-2) var(--pos6), var(--color4-1) var(--pos7) ); animation: moveRight 5s linear infinite; } .strobe { background-color: #000; } @keyframes strobeEffect { 0% { opacity: 0; } 100% { opacity: 1; } } @keyframes moveUpwards { 0% { background-position: 0 100%; } 100% { background-position: 0 -100%; } } @keyframes moveDownwards { 0% { background-position: 0 -100%; } 100% { background-position: 0 100%; } } @keyframes moveLeft { 0% { background-position: 100% 0; } 100% { background-position: -100% 0; } } @keyframes moveRight { 0% { background-position: -100% 0; } 100% { background-position: 100% 0; } } :root{--color1:#00ff0c;--color2:#000;--pos1:0%;--pos2:8.33%;--pos3:25%;--pos4:41.67%;--pos5:58.33%;--pos6:75%;--pos7:91.67%;--color2-1:#0600ff;--color2-2:#000;--pos2-1:0%;--pos2-2:12.5%;--pos2-3:37.5%;--pos2-4:62.5%;--pos2-5:87.5%;--color3-1:#0600ff;--color3-2:#000;--color4-1:#00103f;--color4-2:#000;--pos3-1:0%;--pos3-2:50%;--pos3-3:100%;}:root{--color1: #00ff0c; --color2-1: #0600ff; --color3-1: #0600ff; --color4-1: #00103f;}</style></head><body style="margin:0;background-color:black;width:100vw;height:100vh;overflow:hidden;"><div id="puzzle-container"><div class="gradient-container gradient-up" data-x="0" data-y="0" data-width="0.42140000000000005" data-height="0.33" style="left: 0px; top: 0px; width: 273.91px; height: 214.5px; --clip-path: polygon(0% 0%, 117% 0%, 104% 112%, 0% 114%); background-size: 273.91px 429px; animation-duration: 89s;"></div><div class="gradient-container gradient-right" data-x="0.42140000000000005" data-y="0" data-width="0.008599999999999962" data-height="0.33" style="left: 273.91px; top: 0px; width: 5.59px; height: 214.5px; --clip-path: polygon(824% 0%, 747% 0%, -449% 87%, 205% 112%); background-size: 11.18px 214.5px; animation-duration: 74s;"></div><div class="gradient-container gradient-down" data-x="0" data-y="0.33" data-width="0.43" data-height="0.4145883084" style="left: 0px; top: 214.5px; width: 279.5px; height: 269.482px; --clip-path: polygon(0% 11%, 89% -10%, 99% 81%, 0% 87%); background-size: 279.5px 538.965px; animation-duration: 44s;"></div><div class="gradient-container gradient-left" data-x="0" data-y="0.7445883084" data-width="0.43" data-height="0.05124125160000001" style="left: 0px; top: 483.982px; width: 279.5px; height: 33.3068px; --clip-path: polygon(0% -103%, 99% -153%, 110% -32%, 0% 116%); background-size: 559px 33.3068px; animation-duration: 44s;"></div><div class="gradient-container gradient-up" data-x="0" data-y="0.79582956" data-width="0.43" data-height="0.05757443999999999" style="left: 0px; top: 517.289px; width: 279.5px; height: 37.4234px; --clip-path: polygon(0% 14%, 110% -117%, 99% 140%, 0% -34%); background-size: 279.5px 74.8468px; animation-duration: 67s;"></div><div class="gradient-container gradient-left" data-x="0" data-y="0.853404" data-width="0.43" data-height="0.03939599999999997" style="left: 0px; top: 554.713px; width: 279.5px; height: 25.6074px; --clip-path: polygon(0% -196%, 99% 59%, 103% -61%, 0% -56%); background-size: 559px 25.6074px; animation-duration: 60s;"></div><div class="gradient-container gradient-right" data-x="0" data-y="0.8927999999999999" data-width="0.43" data-height="0.1072" style="left: 0px; top: 580.32px; width: 279.5px; height: 69.68px; --clip-path: polygon(0% -57%, 103% -59%, 111% 100%, 0% 100%); background-size: 559px 69.68px; animation-duration: 19s;"></div><div class="gradient-container gradient-up" data-x="0.43" data-y="0" data-width="0.03078" data-height="0.19" style="left: 279.5px; top: 0px; width: 20.007px; height: 123.5px; --clip-path: polygon(181% 0%, 18% 0%, 235% 80%, -140% 132%); background-size: 20.007px 247px; animation-duration: 62s;"></div><div class="gradient-container gradient-down" data-x="0.46078" data-y="0" data-width="0.18509039999999996" data-height="0.19" style="left: 299.507px; top: 0px; width: 120.309px; height: 123.5px; --clip-path: polygon(-14% 0%, 138% 0%, 58% 99%, 22% 80%); background-size: 120.309px 247px; animation-duration: 15s;"></div><div class="gradient-container gradient-right" data-x="0.6458704" data-y="0" data-width="0.040629600000000016" data-height="0.055099999999999996" style="left: 419.816px; top: 0px; width: 26.4092px; height: 35.815px; --clip-path: polygon(172% 0%, -47% 0%, 138% 96%, 163% 43%); background-size: 52.8185px 35.815px; animation-duration: 42s;"></div><div class="gradient-container gradient-down" data-x="0.6458704" data-y="0.055099999999999996" data-width="0.040629600000000016" data-height="0.1349" style="left: 419.816px; top: 35.815px; width: 26.4092px; height: 87.685px; --clip-path: polygon(163% -23%, 138% -2%, -79% 100%, -191% 99%); background-size: 26.4092px 175.37px; animation-duration: 32s;"></div><div class="gradient-container gradient-right" data-x="0.6865" data-y="0" data-width="0.247665" data-height="0.19" style="left: 446.225px; top: 0px; width: 160.982px; height: 123.5px; --clip-path: polygon(-24% 0%, 132% 0%, 70% 98%, -29% 100%); background-size: 321.964px 123.5px; animation-duration: 2s;"></div><div class="gradient-container gradient-left" data-x="0.934165" data-y="0" data-width="0.06583500000000002" data-height="0.037962" style="left: 607.207px; top: 0px; width: 42.7927px; height: 24.6753px; --clip-path: polygon(119% 0%, 100% 0%, 100% 60%, 106% 209%); background-size: 85.5855px 24.6753px; animation-duration: 89s;"></div><div class="gradient-container gradient-down" data-x="0.934165" data-y="0.037962" data-width="0.06583500000000002" data-height="0.102638" style="left: 607.207px; top: 24.6753px; width: 42.7927px; height: 66.7147px; --clip-path: polygon(106% 40%, 100% -15%, 100% 43%, -43% 51%); background-size: 42.7928px 133.429px; animation-duration: 90s;"></div><div class="gradient-container gradient-right" data-x="0.934165" data-y="0.1406" data-width="0.06583500000000002" data-height="0.0494" style="left: 607.207px; top: 91.39px; width: 42.7927px; height: 32.11px; --clip-path: polygon(-43% -102%, 100% -118%, 100% 192%, -113% 91%); background-size: 85.5855px 32.11px; animation-duration: 92s;"></div><div class="gradient-container gradient-down" data-x="0.43" data-y="0.19" data-width="0.0036280500000000003" data-height="0.1215" style="left: 279.5px; top: 123.5px; width: 2.35823px; height: 78.975px; --clip-path: polygon(-1184% 50%, 18% -9%, -1799% 130%, 1151% 152%); background-size: 2.35823px 157.95px; animation-duration: 49s;"></div><div class="gradient-container gradient-left" data-x="0.43362805" data-y="0.19" data-width="0.35917695" data-height="0.1215" style="left: 281.858px; top: 123.5px; width: 233.465px; height: 78.975px; --clip-path: polygon(-1% -9%, 85% 54%, 111% 69%, -19% 130%); background-size: 466.93px 78.975px; animation-duration: 32s;"></div><div class="gradient-container gradient-down" data-x="0.7928050000000001" data-y="0.19" data-width="0.06969105000000002" data-height="0.1215" style="left: 515.323px; top: 123.5px; width: 45.2992px; height: 78.975px; --clip-path: polygon(-79% 54%, 55% 54%, 32% 119%, 59% 69%); background-size: 45.2992px 157.95px; animation-duration: 10s;"></div><div class="gradient-container gradient-down" data-x="0.8624960500000001" data-y="0.19" data-width="0.10900395000000003" data-height="0.1215" style="left: 560.622px; top: 123.5px; width: 70.8526px; height: 78.975px; --clip-path: polygon(-29% 54%, 81% -42%, 138% 160%, -44% 119%); background-size: 70.8526px 157.95px; animation-duration: 33s;"></div><div class="gradient-container gradient-down" data-x="0.9715" data-y="0.19" data-width="0.028499999999999966" data-height="0.0042768" style="left: 631.475px; top: 123.5px; width: 18.525px; height: 2.77992px; --clip-path: polygon(-74% -1205%, 100% 1063%, 100% -1626%, -104% 500%); background-size: 18.525px 5.55984px; animation-duration: 34s;"></div><div class="gradient-container gradient-up" data-x="0.9715" data-y="0.1942768" data-width="0.028499999999999966" data-height="0.10264319999999998" style="left: 631.475px; top: 126.28px; width: 18.525px; height: 66.7181px; --clip-path: polygon(-104% 17%, 100% -72%, 100% 125%, -269% 122%); background-size: 18.525px 133.436px; animation-duration: 25s;"></div><div class="gradient-container gradient-up" data-x="0.9715" data-y="0.29691999999999996" data-width="0.028499999999999966" data-height="0.014580000000000006" style="left: 631.475px; top: 192.998px; width: 18.525px; height: 9.477px; --clip-path: polygon(-269% 154%, 100% 176%, 100% -391%, 145% 601%); background-size: 18.525px 18.954px; animation-duration: 54s;"></div><div class="gradient-container gradient-down" data-x="0.43" data-y="0.3115" data-width="0.57" data-height="0.6885" style="left: 279.5px; top: 202.475px; width: 370.5px; height: 447.525px; --clip-path: polygon(7% 9%, 100% -10%, 100% 100%, 9% 100%); background-size: 370.5px 895.05px; animation-duration: 64s;"></div></div><script>function layoutShards(){var vw=window.innerWidth;var vh=window.innerHeight;document.querySelectorAll(".gradient-container").forEach(function(div){var x=parseFloat(div.dataset.x||0);var y=parseFloat(div.dataset.y||0);var w=parseFloat(div.dataset.width||0);var h=parseFloat(div.dataset.height||0);div.style.left=(x*vw)+"px";div.style.top=(y*vh)+"px";div.style.width=(w*vw)+"px";div.style.height=(h*vh)+"px";if(div.classList.contains("gradient-left")||div.classList.contains("gradient-right")){div.style.backgroundSize=(w*vw*2)+"px "+(h*vh)+"px";}else{div.style.backgroundSize=(w*vw)+"px "+(h*vh*2)+"px";}});}window.addEventListener("resize",layoutShards);window.addEventListener("load",layoutShards);layoutShards();</script></body></html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Matrix ASCII Snakes</title> <style> :root { --bg-color: #0a0a0a; } * { margin: 0; padding: 0; box-sizing: border-box; } body { background: var(--bg-color); overflow: hidden; font-family: 'Courier New', monospace; } #puzzle-container { position: fixed; top: 0; left: 0; width: 100vw; height: 100vh; } .matrix-canvas { display: block; width: 100%; height: 100%; } </style> </head> <body> <div id="puzzle-container" data-x="0" data-y="0" data-width="1" data-height="1" data-grid-size="60" data-speed-min="0.015" data-speed-max="0.09" data-length-min="5" data-length-max="18" data-spawn-rate="0.08" data-max-snakes="60" data-turn-chance="0.15" data-burst-interval-min="400" data-burst-interval-max="2000" data-burst-amount-min="2" data-burst-amount-max="5" data-decay-rate="0.02"> <canvas class="matrix-canvas"></canvas> </div> <script> (function() { // Full ASCII symbol pool const ALL_SYMBOLS = [ '░', '▒', '▓', '█', '▄', '▀', '■', '□', '▪', '▫', '◊', '○', '●', '◐', '◑', '◒', '◓', '◔', '◕', '◖', '◗', '☆', '★', '✦', '✧', '✶', '✷', '✸', '✹', '✺', '╱', '╲', '╳', '┃', '━', '┏', '┓', '┗', '┛', '╋', '△', '▲', '▽', '▼', '◁', '◀', '▷', '▶', '◇', '◆', '⌂', '⌐', '¬', '½', '¼', '¾', '±', '≡', '≈', '≠', 'ア', 'イ', 'ウ', 'エ', 'オ', 'カ', 'キ', 'ク', 'ケ', 'コ', '∞', '∑', '∏', '√', '∫', '∂', '∆', '∇', '∈', '∉', '⟨', '⟩', '⟪', '⟫', '⌘', '⌥', '⌦', '⌫', '⏎', '⏏', '♠', '♣', '♥', '♦', '♪', '♫', '♬', '♭', '♮', '♯' ]; // Color palettes const COLORS = [ { name: 'white', head: '#ffffff', body: [200, 200, 200], glow: '#ffffff' }, { name: 'pink', head: '#ffccee', body: [255, 120, 180], glow: '#ff69b4' }, { name: 'grey', head: '#dddddd', body: [140, 140, 140], glow: '#aaaaaa' }, { name: 'blue', head: '#aaddff', body: [80, 160, 255], glow: '#4488ff' }, { name: 'green', head: '#aaffaa', body: [80, 220, 80], glow: '#00ff41' } ]; // Randomly select symbols for this instance const symbolCount = Math.floor(Math.random() * ALL_SYMBOLS.length) + 1; const shuffled = [...ALL_SYMBOLS].sort(() => Math.random() - 0.5); const SYMBOLS = shuffled.slice(0, symbolCount); console.log(`Using ${SYMBOLS.length} symbols:`, SYMBOLS.join(' ')); const container = document.getElementById('puzzle-container'); const canvas = container.querySelector('.matrix-canvas'); const ctx = canvas.getContext('2d'); // Read config from data attributes const config = { gridSize: parseInt(container.dataset.gridSize), speedMin: parseFloat(container.dataset.speedMin), speedMax: parseFloat(container.dataset.speedMax), lengthMin: parseInt(container.dataset.lengthMin), lengthMax: parseInt(container.dataset.lengthMax), spawnRate: parseFloat(container.dataset.spawnRate), maxSnakes: parseInt(container.dataset.maxSnakes), turnChance: parseFloat(container.dataset.turnChance), burstIntervalMin: parseInt(container.dataset.burstIntervalMin), burstIntervalMax: parseInt(container.dataset.burstIntervalMax), burstAmountMin: parseInt(container.dataset.burstAmountMin), burstAmountMax: parseInt(container.dataset.burstAmountMax), decayRate: parseFloat(container.dataset.decayRate) }; // Directions: 0=right, 1=down, 2=left, 3=up const DIR = { RIGHT: 0, DOWN: 1, LEFT: 2, UP: 3 }; const dirVectors = [ { dx: 1, dy: 0 }, // right { dx: 0, dy: 1 }, // down { dx: -1, dy: 0 }, // left { dx: 0, dy: -1 } // up ]; let snakes = []; let grid = []; let initialized = false; function randomSymbol() { return SYMBOLS[Math.floor(Math.random() * SYMBOLS.length)]; } function randomColor() { return COLORS[Math.floor(Math.random() * COLORS.length)]; } function initGrid() { grid = []; for (let x = 0; x < config.gridSize; x++) { grid[x] = []; for (let y = 0; y < config.gridSize; y++) { grid[x][y] = false; } } } function isValidCell(x, y) { return x >= 0 && x < config.gridSize && y >= 0 && y < config.gridSize; } function isCellFree(x, y) { if (!isValidCell(x, y)) return false; return !grid[x][y]; } function occupyCell(x, y) { if (isValidCell(x, y)) grid[x][y] = true; } function freeCell(x, y) { if (isValidCell(x, y)) grid[x][y] = false; } function createSnake() { const length = config.lengthMin + Math.floor(Math.random() * (config.lengthMax - config.lengthMin + 1)); // Pick random edge and direction const edge = Math.floor(Math.random() * 4); let startX, startY, direction; switch (edge) { case 0: // Top edge, going down startX = Math.floor(Math.random() * config.gridSize); startY = 0; direction = DIR.DOWN; break; case 1: // Right edge, going left startX = config.gridSize - 1; startY = Math.floor(Math.random() * config.gridSize); direction = DIR.LEFT; break; case 2: // Bottom edge, going up startX = Math.floor(Math.random() * config.gridSize); startY = config.gridSize - 1; direction = DIR.UP; break; case 3: // Left edge, going right startX = 0; startY = Math.floor(Math.random() * config.gridSize); direction = DIR.RIGHT; break; } // Check if starting cell is free if (!isCellFree(startX, startY)) return null; const segments = [{ x: startX, y: startY, char: randomSymbol(), opacity: 1 }]; occupyCell(startX, startY); // Random speed from min to 6x min const speed = config.speedMin + Math.random() * (config.speedMin * 6 - config.speedMin); return { segments: segments, targetLength: length, direction: direction, speed: speed, moveProgress: 0, nextBurstTime: performance.now() + config.burstIntervalMin + Math.random() * (config.burstIntervalMax - config.burstIntervalMin), alive: true, decaying: false, color: randomColor() }; } function getTurnDirections(currentDir) { if (currentDir === DIR.RIGHT || currentDir === DIR.LEFT) { return [DIR.UP, DIR.DOWN]; } else { return [DIR.LEFT, DIR.RIGHT]; } } function canMove(snake) { const head = snake.segments[0]; const vec = dirVectors[snake.direction]; // Check straight const straightX = head.x + vec.dx; const straightY = head.y + vec.dy; if (isCellFree(straightX, straightY)) return true; // Check turns const turns = getTurnDirections(snake.direction); for (const newDir of turns) { const turnVec = dirVectors[newDir]; const turnX = head.x + turnVec.dx; const turnY = head.y + turnVec.dy; if (isCellFree(turnX, turnY)) return true; } return false; } function moveSnake(snake) { if (snake.decaying) return; const head = snake.segments[0]; const vec = dirVectors[snake.direction]; let newX = head.x + vec.dx; let newY = head.y + vec.dy; // Check if we should turn or must turn let turned = false; const shouldTurn = Math.random() < config.turnChance; const mustTurn = !isCellFree(newX, newY); if (shouldTurn || mustTurn) { const turns = getTurnDirections(snake.direction); const shuffledTurns = Math.random() < 0.5 ? turns : [turns[1], turns[0]]; for (const newDir of shuffledTurns) { const turnVec = dirVectors[newDir]; const turnX = head.x + turnVec.dx; const turnY = head.y + turnVec.dy; if (isCellFree(turnX, turnY)) { snake.direction = newDir; newX = turnX; newY = turnY; turned = true; break; } } // If we had to turn but couldn't, try straight if (mustTurn && !turned) { // Can't go anywhere - start decaying snake.decaying = true; return; } } // Final validation if (!isCellFree(newX, newY)) { snake.decaying = true; return; } // Add new head snake.segments.unshift({ x: newX, y: newY, char: randomSymbol(), opacity: 1 }); occupyCell(newX, newY); // Remove tail if at target length if (snake.segments.length > snake.targetLength) { const tail = snake.segments.pop(); freeCell(tail.x, tail.y); } } function decaySnake(snake) { // Fade all segments let allFaded = true; for (const seg of snake.segments) { seg.opacity -= config.decayRate; if (seg.opacity > 0) allFaded = false; } // Remove fully faded tail segments while (snake.segments.length > 0 && snake.segments[snake.segments.length - 1].opacity <= 0) { const tail = snake.segments.pop(); freeCell(tail.x, tail.y); } // Mark as dead when fully decayed if (snake.segments.length === 0 || allFaded) { snake.alive = false; } } function init() { initGrid(); snakes = []; // Spawn initial snakes const initialCount = Math.floor(config.maxSnakes * 0.4); for (let i = 0; i < initialCount; i++) { const snake = createSnake(); if (snake) snakes.push(snake); } initialized = true; } function resize() { const dpr = window.devicePixelRatio || 1; const width = window.innerWidth; const height = window.innerHeight; canvas.width = width * dpr; canvas.height = height * dpr; canvas.style.width = width + 'px'; canvas.style.height = height + 'px'; ctx.scale(dpr, dpr); if (!initialized) { init(); } } function trySpawnSnake() { if (snakes.length < config.maxSnakes && Math.random() < config.spawnRate) { const snake = createSnake(); if (snake) snakes.push(snake); } } function draw() { const width = window.innerWidth; const height = window.innerHeight; const now = performance.now(); const cellWidth = width / config.gridSize; const cellHeight = height / config.gridSize; const fontSize = Math.min(cellWidth, cellHeight) * 0.85; // Clear canvas ctx.fillStyle = '#0a0a0a'; ctx.fillRect(0, 0, width, height); ctx.font = `${fontSize}px 'Courier New', monospace`; ctx.textBaseline = 'middle'; ctx.textAlign = 'center'; // Process snakes for (let i = snakes.length - 1; i >= 0; i--) { const snake = snakes[i]; if (snake.decaying) { // Handle decay decaySnake(snake); } else { // Update movement snake.moveProgress += snake.speed; while (snake.moveProgress >= 1 && snake.alive && !snake.decaying) { snake.moveProgress -= 1; moveSnake(snake); } // Burst character change if (now > snake.nextBurstTime && !snake.decaying) { const burstAmount = config.burstAmountMin + Math.floor(Math.random() * (config.burstAmountMax - config.burstAmountMin + 1)); for (let b = 0; b < burstAmount && b < snake.segments.length; b++) { const idx = Math.floor(Math.random() * snake.segments.length); snake.segments[idx].char = randomSymbol(); } snake.nextBurstTime = now + config.burstIntervalMin + Math.random() * (config.burstIntervalMax - config.burstIntervalMin); } } // Remove dead snakes if (!snake.alive) { for (const seg of snake.segments) { freeCell(seg.x, seg.y); } snakes.splice(i, 1); continue; } const color = snake.color; // Draw segments for (let j = 0; j < snake.segments.length; j++) { const seg = snake.segments[j]; const screenX = (seg.x + 0.5) * cellWidth; const screenY = (seg.y + 0.5) * cellHeight; // Gradient from bright at head to dimmer at tail const positionBrightness = 1 - (j / snake.segments.length) * 0.7; const opacity = seg.opacity; if (j === 0 && !snake.decaying) { ctx.fillStyle = color.head; ctx.globalAlpha = opacity; ctx.shadowColor = color.glow; ctx.shadowBlur = 8; } else { const r = Math.floor(color.body[0] * positionBrightness); const g = Math.floor(color.body[1] * positionBrightness); const b = Math.floor(color.body[2] * positionBrightness); ctx.fillStyle = `rgb(${r}, ${g}, ${b})`; ctx.globalAlpha = opacity; ctx.shadowBlur = 0; } ctx.fillText(seg.char, screenX, screenY); } ctx.shadowBlur = 0; ctx.globalAlpha = 1; } // Try to spawn new snakes trySpawnSnake(); requestAnimationFrame(draw); } // Initial setup resize(); window.addEventListener('resize', resize); requestAnimationFrame(draw); })(); </script> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Binary Partitions - Impulse & Interactive</title> <style> * { margin: 0; padding: 0; box-sizing: border-box; cursor: crosshair; } html, body { width: 100%; height: 100%; background: #000; overflow: hidden; } canvas { display: block; width: 100%; height: 100%; } /* Simple instruction overlay */ #hint { position: absolute; bottom: 20px; left: 20px; color: #00ff00; font-family: monospace; font-size: 12px; opacity: 0.5; pointer-events: none; z-index: 10; } </style> </head> <body> <div id="hint">SYSTEM: SHAKE MOUSE TO DESTROY // RANDOM GLITCH: ACTIVE</div> <canvas id="artCanvas"></canvas> <script> // --- Partition Data (Original) --- const originalPartitions = [{"x":0,"y":0,"width":731.7712962962963,"height":177.64635903206445,"gradientConfig":{"type":"text","colors":["#ff00ea"],"angle":135.5864197530864,"rotationDirection":1,"textContent":"GURU"},"secondLayer":{"enabled":true,"type":"linear","colors":["#47c8ff"],"angle":180,"rotationDirection":-1,"blendMode":"exclusion"}},{"x":731.7712962962963,"y":0,"width":348.2287037037037,"height":310.9861111111111,"gradientConfig":{"type":"text","colors":["#000000","#4dff00"],"angle":26.933641975308642,"rotationDirection":1,"textContent":"GURU"},"secondLayer":{"enabled":true,"type":"linear","colors":["#70ade6"],"angle":270,"rotationDirection":1,"blendMode":"exclusion"}},{"x":0,"y":393.83503017427313,"width":129.8141199798049,"height":401.7399698257268,"gradientConfig":{"type":"text","colors":["#000000","#4dff00"],"angle":0.7808641975308641,"rotationDirection":1,"textContent":"GURU"},"secondLayer":{"enabled":true,"type":"linear","colors":["#a4afda"],"angle":0,"rotationDirection":1,"blendMode":"exclusion"}},{"x":731.7712962962963,"y":883.2546796767833,"width":348.2287037037037,"height":196.7453203232167,"gradientConfig":{"type":"text","colors":["#ffffff"],"angle":31.978395061728392,"rotationDirection":-1,"textContent":"GURU"},"secondLayer":{"enabled":true,"type":"linear","colors":["#ffffff"],"angle":90,"rotationDirection":1,"blendMode":"exclusion"}},{"x":129.8141199798049,"y":393.83503017427313,"width":218.40661945429682,"height":401.7399698257268,"gradientConfig":{"type":"text","colors":["#ff00ea"],"angle":70.58333333333333,"rotationDirection":1,"textContent":"GURU"},"secondLayer":{"enabled":true,"type":"linear","colors":["#ff0000"],"angle":90,"rotationDirection":-1,"blendMode":"exclusion"}},{"x":0,"y":795.5749999999999,"width":177.79144023157676,"height":284.425,"gradientConfig":{"type":"text","colors":["#4dff00"],"angle":214.37345679012344,"rotationDirection":1,"textContent":"GURU"},"secondLayer":{"enabled":true,"type":"linear","colors":["#989898"],"angle":180,"rotationDirection":-1,"blendMode":"exclusion"}},{"x":731.7712962962963,"y":310.9861111111111,"width":348.2287037037037,"height":195.52509425993802,"gradientConfig":{"type":"text","colors":["#ff0a0a","#ff00ea","#0084ff"],"angle":39.111111111111114,"rotationDirection":-1,"textContent":"GURU"},"secondLayer":{"enabled":true,"type":"linear","colors":["#c80e0e"],"angle":90,"rotationDirection":1,"blendMode":"exclusion"}},{"x":0,"y":177.64635903206445,"width":110.51289918886222,"height":216.18867114220868,"gradientConfig":{"type":"text","colors":["#ffffff","#ffffff","#949494"],"angle":125.70061728395062,"rotationDirection":-1,"textContent":"GURU"},"secondLayer":{"enabled":true,"type":"linear","colors":["#70ade6"],"angle":180,"rotationDirection":1,"blendMode":"exclusion"}},{"x":177.79144023157676,"y":795.5749999999999,"width":362.50059439518924,"height":284.425,"gradientConfig":{"type":"text","colors":["#ffffff"],"angle":337.63888888888886,"rotationDirection":-1,"textContent":"GURU"},"secondLayer":{"enabled":true,"type":"linear","colors":["#000000"],"angle":90,"rotationDirection":1,"blendMode":"exclusion"}},{"x":540.292034626766,"y":795.5749999999999,"width":191.47926166953033,"height":284.425,"gradientConfig":{"type":"text","colors":["#989898"],"angle":134.76234567901236,"rotationDirection":1,"textContent":"GURU"},"secondLayer":{"enabled":true,"type":"linear","colors":["#000000"],"angle":270,"rotationDirection":1,"blendMode":"exclusion"}},{"x":348.2207394341017,"y":393.83503017427313,"width":90.13734035765324,"height":401.7399698257268,"gradientConfig":{"type":"text","colors":["#ff00ea","#949494","#989898"],"angle":246.16666666666669,"rotationDirection":1,"textContent":"GURU"},"secondLayer":{"enabled":true,"type":"linear","colors":["#a4afda"],"angle":0,"rotationDirection":1,"blendMode":"exclusion"}},{"x":438.3580797917549,"y":393.83503017427313,"width":293.4132165045413,"height":401.7399698257268,"gradientConfig":{"type":"text","colors":["#989898","#1c1c1c"],"angle":144.18055555555554,"rotationDirection":-1,"textContent":"GURU"},"secondLayer":{"enabled":true,"type":"linear","colors":["#44ff00"],"angle":0,"rotationDirection":1,"blendMode":"exclusion"}},{"x":110.51289918886222,"y":177.64635903206445,"width":105.49302073859354,"height":216.18867114220868,"gradientConfig":{"type":"text","colors":["#1c1c1c","#989898","#ff0a0a"],"angle":299.1033950617284,"rotationDirection":1,"textContent":"GURU"},"secondLayer":{"enabled":true,"type":"linear","colors":["#70ade6"],"angle":0,"rotationDirection":1,"blendMode":"exclusion"}},{"x":216.00591992745575,"y":177.64635903206445,"width":515.7653763688405,"height":216.18867114220868,"gradientConfig":{"type":"text","colors":["#4dff00"],"angle":277.70833333333337,"rotationDirection":1,"textContent":"GURU"},"secondLayer":{"enabled":true,"type":"linear","colors":["#70ade6"],"angle":270,"rotationDirection":-1,"blendMode":"exclusion"}},{"x":731.7712962962963,"y":506.5112053710491,"width":230.64538880633032,"height":376.7434743057342,"gradientConfig":{"type":"text","colors":["#4dff00","#ffffff","#0084ff"],"angle":135.9645061728395,"rotationDirection":1,"textContent":"GURU"},"secondLayer":{"enabled":true,"type":"linear","colors":["#ff0000"],"angle":180,"rotationDirection":-1,"blendMode":"exclusion"}},{"x":962.4166851026266,"y":506.5112053710491,"width":117.58331489737336,"height":376.7434743057342,"gradientConfig":{"type":"text","colors":["#0084ff","#ffffff","#4dff00"],"angle":238.29475308641975,"rotationDirection":1,"textContent":"GURU"},"secondLayer":{"enabled":true,"type":"linear","colors":["#a4afda"],"angle":0,"rotationDirection":1,"blendMode":"exclusion"}}]; const config = {"width":1080,"height":1080,"animationSpeed":47,"loopDuration":10,"shrinkPercentage":100}; const canvas = document.getElementById('artCanvas'); const ctx = canvas.getContext('2d'); let rotation = 0; let lastTime = 0; let offscreenCache = null; let scaleX = 1; let scaleY = 1; // --- Glitch State Variables --- let currentChaos = 0; // Current intensity of glitch (0.0 to 1.0) let nextBurstTime = 0; // Timestamp for next random glitch let mouseVelocity = 0; // How fast mouse is moving let lastMousePos = { x: 0, y: 0 }; let isGlitching = false; // Is a burst currently active? function resizeCanvas() { canvas.width = window.innerWidth; canvas.height = window.innerHeight; scaleX = window.innerWidth / config.width; scaleY = window.innerHeight / config.height; offscreenCache = null; } function scalePartition(p) { return { x: p.x * scaleX, y: p.y * scaleY, width: p.width * scaleX, height: p.height * scaleY, gradientConfig: p.gradientConfig, secondLayer: p.secondLayer }; } window.addEventListener('resize', resizeCanvas); resizeCanvas(); // --- Interaction: Mouse Velocity & Click --- window.addEventListener('mousemove', (e) => { const dx = e.clientX - lastMousePos.x; const dy = e.clientY - lastMousePos.y; const dist = Math.sqrt(dx*dx + dy*dy); // Add speed to velocity (sensitivity adjusted by factor) mouseVelocity += dist * 0.005; // Cap max velocity if (mouseVelocity > 2.0) mouseVelocity = 2.0; lastMousePos = { x: e.clientX, y: e.clientY }; }); window.addEventListener('mousedown', () => { // Click triggers an immediate massive burst mouseVelocity = 3.0; currentChaos = 1.0; }); // --- Helper Functions --- function hexToRgb(hex) { const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex); return result ? [parseInt(result[1], 16), parseInt(result[2], 16), parseInt(result[3], 16)] : [0, 0, 0]; } function rgbToHex(r, g, b) { return '#' + [r, g, b].map(x => { const hex = Math.round(x).toString(16); return hex.length === 1 ? '0' + hex : hex; }).join(''); } function interpolateColor(color1, color2, t) { const rgb1 = hexToRgb(color1); const rgb2 = hexToRgb(color2); return rgbToHex( rgb1[0] + (rgb2[0] - rgb1[0]) * t, rgb1[1] + (rgb2[1] - rgb1[1]) * t, rgb1[2] + (rgb2[2] - rgb1[2]) * t ); } // --- Gradient & Pattern Drawing --- function createLinearGradientPattern(ctx, colors, partitionLength) { const offscreenCanvas = document.createElement('canvas'); const totalSegments = colors.length * 2; const tileWidth = Math.ceil(partitionLength); offscreenCanvas.width = tileWidth; offscreenCanvas.height = 100; const offscreenCtx = offscreenCanvas.getContext('2d'); if (!offscreenCtx) return null; const gradient = offscreenCtx.createLinearGradient(0, 0, tileWidth, 0); const segmentSize = 1 / totalSegments; for (let i = 0; i < colors.length; i++) { gradient.addColorStop(i * 2 * segmentSize, '#000000'); gradient.addColorStop((i * 2 + 1) * segmentSize, colors[i]); } gradient.addColorStop(1, '#000000'); offscreenCtx.fillStyle = gradient; offscreenCtx.fillRect(0, 0, tileWidth, 100); const pattern = ctx.createPattern(offscreenCanvas, 'repeat'); if (!pattern) return null; return { pattern, tileWidth }; } function createGradientForLayer(ctx, partition, layerConfig, rotation) { const { type, colors, angle } = layerConfig; const centerX = partition.x + partition.width / 2; const centerY = partition.y + partition.height / 2; let gradient; if (type === 'linear') { const angleRad = (angle * Math.PI) / 180; const partitionLength = Math.abs(Math.cos(angleRad)) * partition.width + Math.abs(Math.sin(angleRad)) * partition.height; const halfLength = partitionLength / 2; const startX = centerX - halfLength * Math.cos(angleRad); const startY = centerY - halfLength * Math.sin(angleRad); const endX = centerX + halfLength * Math.cos(angleRad); const endY = centerY + halfLength * Math.sin(angleRad); gradient = ctx.createLinearGradient(startX, startY, endX, endY); const totalSegments = colors.length * 2; const rotationFraction = ((rotation % 360) / 360); const allStops = []; for (let i = 0; i < colors.length; i++) { const blackPos = ((i * 2 / totalSegments - rotationFraction + 1) % 1); const colorPos = (((i * 2 + 1) / totalSegments - rotationFraction + 1) % 1); allStops.push({ position: blackPos, color: '#000000' }); allStops.push({ position: colorPos, color: colors[i] }); } allStops.sort((a, b) => a.position - b.position); const firstStop = allStops[0]; const lastStop = allStops[allStops.length - 1]; const totalGap = firstStop.position + (1 - lastStop.position); if (firstStop.position > 0) { const t = (1 - lastStop.position) / totalGap; gradient.addColorStop(0, interpolateColor(lastStop.color, firstStop.color, t)); } allStops.forEach(stop => gradient.addColorStop(stop.position, stop.color)); if (lastStop.position < 1) { const t = (1 - lastStop.position) / totalGap; gradient.addColorStop(1, interpolateColor(lastStop.color, firstStop.color, t)); } return gradient; } else if (type === 'conic') { const normalizedRotation = rotation % 360; const rotationDirection = layerConfig.rotationDirection || 1; gradient = ctx.createConicGradient(((angle + normalizedRotation * rotationDirection) * Math.PI) / 180, centerX, centerY); } else { const maxSize = Math.max(partition.width, partition.height); gradient = ctx.createRadialGradient(centerX, centerY, 0, centerX, centerY, maxSize); } const segmentSize = 1 / (colors.length * 2); colors.forEach((color, i) => { gradient.addColorStop(i * segmentSize * 2, color); gradient.addColorStop(i * segmentSize * 2 + segmentSize, '#000000'); }); gradient.addColorStop(1, colors[0]); return gradient; } function calculateTextHeight(ctx, text, targetHeight) { let minSize = 1; let maxSize = targetHeight * 2; let fontSize = targetHeight; for (let i = 0; i < 20; i++) { ctx.font = `bold ${fontSize}px Helvetica`; const metrics = ctx.measureText(text); const actualHeight = metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent; if (Math.abs(actualHeight - targetHeight) < 1) break; if (actualHeight < targetHeight) { minSize = fontSize; fontSize = (fontSize + maxSize) / 2; } else { maxSize = fontSize; fontSize = (minSize + fontSize) / 2; } } return fontSize; } function getOffscreenCanvas(width, height) { if (!offscreenCache) { offscreenCache = document.createElement('canvas'); } if (offscreenCache.width < width) offscreenCache.width = width; if (offscreenCache.height < height) offscreenCache.height = height; const octx = offscreenCache.getContext('2d'); if (octx) octx.clearRect(0, 0, width, height); return offscreenCache; } function drawGradientLayer(ctx, partition, layerConfig, rotation, partitionIndex, blendMode) { ctx.globalCompositeOperation = blendMode; const centerX = partition.x + partition.width / 2; const centerY = partition.y + partition.height / 2; const { type, colors, angle } = layerConfig; if (type === 'linear') { const angleRad = (angle * Math.PI) / 180; const partitionLength = Math.abs(Math.cos(angleRad)) * partition.width + Math.abs(Math.sin(angleRad)) * partition.height; const result = createLinearGradientPattern(ctx, colors, partitionLength); if (result) { const { pattern, tileWidth } = result; const maxSize = Math.max(partition.width, partition.height) * 2; if (pattern.setTransform) { const offsetDistance = ((rotation / 360) * tileWidth) % tileWidth; const offsetX = offsetDistance * Math.cos(angleRad); const offsetY = offsetDistance * Math.sin(angleRad); const matrix = new DOMMatrix(); matrix.translateSelf(offsetX, offsetY); matrix.rotateSelf(angle); pattern.setTransform(matrix); ctx.fillStyle = pattern; ctx.fillRect(centerX - maxSize, centerY - maxSize, maxSize * 2, maxSize * 2); } else { const gradient = createGradientForLayer(ctx, partition, layerConfig, rotation); ctx.fillStyle = gradient; ctx.fillRect(partition.x, partition.y, partition.width, partition.height); } } } else if (type === 'radial') { const maxSize = Math.max(partition.width, partition.height); const selectedColor = colors[partitionIndex % colors.length]; const currentCycle = Math.floor(rotation / 360); const maxIterations = 4; const startCycle = Math.max(0, currentCycle - maxIterations + 1); const offscreen = getOffscreenCanvas(partition.width, partition.height); const offscreenCtx = offscreen.getContext('2d'); if (!offscreenCtx) return; offscreenCtx.globalCompositeOperation = 'lighten'; const offscreenCenterX = partition.width / 2; const offscreenCenterY = partition.height / 2; for (let cycle = startCycle; cycle <= currentCycle; cycle++) { const cycleAge = rotation / 360 - cycle; const iterationSize = maxSize * cycleAge; if (iterationSize > 0 && iterationSize <= maxSize * maxIterations) { const gradient = offscreenCtx.createRadialGradient(offscreenCenterX, offscreenCenterY, 0, offscreenCenterX, offscreenCenterY, iterationSize); gradient.addColorStop(0, '#000000'); gradient.addColorStop(0.5, selectedColor); gradient.addColorStop(1, '#000000'); offscreenCtx.fillStyle = gradient; offscreenCtx.fillRect(offscreenCenterX - iterationSize, offscreenCenterY - iterationSize, iterationSize * 2, iterationSize * 2); } } ctx.drawImage(offscreen, partition.x, partition.y); } else if (type === 'text') { const textContent = layerConfig.textContent || '$$$'; const xCoord = Math.round(partition.x * 10000); const yCoord = Math.round(partition.y * 10000); const hash = Math.abs((xCoord * 73856093) ^ (yCoord * 19349663)); const selectedColor = colors[hash % colors.length]; const hash2 = Math.abs((xCoord * 19349663) ^ (yCoord * 73856093)); const randomStartOffset = (hash2 % 10000) / 10000; const hash3 = Math.abs((xCoord * 50331653) ^ (yCoord * 25165843)); const direction = hash3 % 3; ctx.save(); const partCenterX = partition.x + partition.width / 2; const partCenterY = partition.y + partition.height / 2; if (direction === 1) { ctx.translate(partCenterX, partCenterY); ctx.rotate(-Math.PI / 2); ctx.translate(-partCenterX, -partCenterY); } else if (direction === 2) { ctx.translate(partCenterX, partCenterY); ctx.rotate(Math.PI / 2); ctx.translate(-partCenterX, -partCenterY); } const fillDimension = direction === 0 ? partition.height : partition.width; const targetHeight = fillDimension * 0.95; const fontSize = calculateTextHeight(ctx, textContent, targetHeight); ctx.font = `bold ${fontSize}px Helvetica`; ctx.fillStyle = selectedColor; ctx.textBaseline = 'middle'; const wordWidth = ctx.measureText(textContent).width; const normalizedRotation = rotation % 360; const scrollProgress = (normalizedRotation / 360 + randomStartOffset) % 1; const scrollOffset = -(scrollProgress * wordWidth) % wordWidth; const scrollDimensionSize = direction === 0 ? partition.width : partition.height; const textY = partition.y + partition.height * 0.55; const textX = partition.x + scrollOffset; const numCopies = Math.ceil(scrollDimensionSize / wordWidth) + 3; for (let i = -1; i < numCopies; i++) { ctx.fillText(textContent, textX + (i * wordWidth), textY); } ctx.restore(); } else { ctx.save(); const normalizedRotation = rotation % 360; const rotationDirection = layerConfig.rotationDirection || 1; ctx.translate(centerX, centerY); ctx.rotate((normalizedRotation * rotationDirection * Math.PI) / 180); ctx.translate(-centerX, -centerY); const gradient = createGradientForLayer(ctx, partition, layerConfig, rotation); ctx.fillStyle = gradient; const maxSize = Math.max(partition.width, partition.height) * 2; ctx.fillRect(centerX - maxSize, centerY - maxSize, maxSize * 2, maxSize * 2); ctx.restore(); } } function renderPartitions(rotation) { // 1. Trails / Feedback (always slightly visible) // When chaos is high, trails are stronger (less erasure) const baseAlpha = 0.2; // If chaos is high, we clear less, creating smear const clearAlpha = baseAlpha - (currentChaos * 0.15); ctx.globalCompositeOperation = 'source-over'; ctx.fillStyle = `rgba(0, 0, 0, ${Math.max(0.02, clearAlpha)})`; ctx.fillRect(0, 0, canvas.width, canvas.height); const scale = config.shrinkPercentage / 100; // Render partitions originalPartitions.forEach((originalPartition, partitionIndex) => { // --- Jitter partitions during High Chaos --- let jitterX = 0; let jitterY = 0; if (currentChaos > 0.3) { jitterX = (Math.random() - 0.5) * 50 * currentChaos; jitterY = (Math.random() - 0.5) * 50 * currentChaos; } const partition = scalePartition(originalPartition); ctx.save(); const centerX = partition.x + partition.width / 2; const centerY = partition.y + partition.height / 2; ctx.translate(centerX + jitterX, centerY + jitterY); ctx.scale(scale, scale); ctx.translate(-centerX, -centerY); ctx.beginPath(); ctx.rect(partition.x, partition.y, partition.width, partition.height); ctx.clip(); const primaryLayerConfig = { type: partition.gradientConfig.type, colors: partition.gradientConfig.colors, angle: partition.gradientConfig.angle, rotationDirection: partition.gradientConfig.rotationDirection, textContent: partition.gradientConfig.textContent, }; drawGradientLayer(ctx, partition, primaryLayerConfig, rotation, partitionIndex, 'source-over'); if (partition.secondLayer.enabled) { const secondLayerConfig = { type: partition.secondLayer.type, colors: partition.secondLayer.colors, angle: partition.secondLayer.angle, rotationDirection: partition.secondLayer.rotationDirection, textContent: partition.secondLayer.textContent, }; ctx.save(); drawGradientLayer(ctx, partition, secondLayerConfig, rotation, partitionIndex, partition.secondLayer.blendMode); ctx.restore(); } ctx.restore(); }); // --- 2. THE GLITCH / DATAMOSH LAYER --- // If chaos is active (either from Burst or Mouse) if (currentChaos > 0.05) { // A. Horizontal Tearing (The "Datamosh" look) // Number of tears depends on intensity const numTears = Math.floor(currentChaos * 20); for(let i = 0; i < numTears; i++) { if (Math.random() < 0.8) { const sliceY = Math.random() * canvas.height; const sliceH = Math.random() * 50 + 5; // Extreme horizontal stretching const stretch = (Math.random() - 0.5) * 400 * currentChaos; ctx.save(); ctx.globalCompositeOperation = 'source-over'; ctx.drawImage( canvas, 0, sliceY, canvas.width, sliceH, stretch, sliceY, canvas.width + Math.abs(stretch), sliceH ); // Invert color occasionally (Digital artifact) if (Math.random() < 0.2 * currentChaos) { ctx.globalCompositeOperation = 'difference'; ctx.fillStyle = '#fff'; ctx.fillRect(stretch, sliceY, canvas.width, sliceH); } ctx.restore(); } } // B. RGB Shift (Chromatic Aberration) // Scales with Chaos ctx.save(); ctx.globalCompositeOperation = 'screen'; ctx.globalAlpha = 0.5 * currentChaos; const shiftX = (Math.random() - 0.5) * 30 * currentChaos; const shiftY = (Math.random() - 0.5) * 10 * currentChaos; // Draw Red Channel offset ctx.translate(shiftX, shiftY); // Just drawing the canvas over itself with screen blend creates the ghosting // If we had separate channels we'd color it red, but this is a cheap fast approximation ctx.drawImage(canvas, 0, 0); ctx.restore(); } } function animate(timestamp) { if (!lastTime) lastTime = timestamp; const deltaTime = timestamp - lastTime; lastTime = timestamp; const currentTime = timestamp / 1000; // --- LOGIC: Update Chaos Level --- // 1. Decay the mouse velocity mouseVelocity *= 0.92; // Friction if (mouseVelocity < 0.01) mouseVelocity = 0; // 2. Random Bursts (The "Every few seconds" logic) if (currentTime > nextBurstTime) { // Trigger a burst isGlitching = true; // Duration of burst is short (0.1s to 0.4s) const burstDuration = Math.random() * 0.3 + 0.1; // Schedule end of burst setTimeout(() => { isGlitching = false; }, burstDuration * 1000); // Schedule next burst (Randomly between 2 and 6 seconds) nextBurstTime = currentTime + (Math.random() * 4 + 2); } // 3. Combine Sources into currentChaos let targetChaos = 0; if (isGlitching) targetChaos = 1.0; // Max chaos during random burst targetChaos += mouseVelocity; // Add mouse movement chaos // Smoothly interpolate currentChaos towards target (Easing) // This makes the onset fast but the falloff smooth currentChaos += (targetChaos - currentChaos) * 0.2; // Clamp if (currentChaos > 1.0) currentChaos = 1.0; if (currentChaos < 0.0) currentChaos = 0.0; // --- Rotation Logic --- const actualLoopDuration = config.loopDuration / (config.animationSpeed / 50); const degreesPerSecond = 360 / actualLoopDuration; // Chaos can also speed up or reverse rotation momentarily! const chaosSpeedMod = 1 + (Math.random() - 0.5) * 10 * currentChaos; rotation += (deltaTime / 1000) * degreesPerSecond * chaosSpeedMod; renderPartitions(rotation); requestAnimationFrame(animate); } requestAnimationFrame(animate); </script> </body> </html>
▄▖▄▖▖▖▄▖ ▐ ▙▖▚▘▐ ▐ ▙▖▌▌▐ ▄▖▄▖▄▖▖ ▖▄▖▄▖▖▖ ▌▌▙▘▐ ▌▞▖▌▌▌▙▘▙▘ ▛▌▌▌▐ ▛ ▝▌▙▌▌▌▌▌ ▄▖▄▖▄▖▄▖▄▖ ▄▖▄▖▄▖▄▖ ▌▌▚ ▌ ▐ ▐ ▐ ▙▖▚ ▐ ▛▌▄▌▙▖▟▖▟▖ ▐ ▙▖▄▌▐ ▖ ▄▖▖ ▌ ▌▌▌ ▙▖▙▌▙▖
▄▖ ▄▖ ▗ ▌ ▘ ▐ ▌▌▛▌█▌ ▚ ▛▌▛▛▌█▌▜▘▛▌▌▛▌▛▌ ▐ ▙▌▙▌▙▖ ▄▌▙▌▌▌▌▙▖▐▖▌▌▌▌▌▙▌ ▄▌▌ ▄▌
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>SHARDS #6</title> <style> :root { /* Pattern 1: 7 bands */ --color1: #4348ec; --color2: #000; --pos1: 0%; --pos2: 8.33%; --pos3: 25%; --pos4: 41.67%; --pos5: 58.33%; --pos6: 75%; --pos7: 91.67%; /* Pattern 2: 5 bands */ --color2-1: #4656cd; --color2-2: #000; --pos2-1: 0%; --pos2-2: 12.5%; --pos2-3: 37.5%; --pos2-4: 62.5%; --pos2-5: 87.5%; /* Pattern 3: 3 bands */ --color3-1: #07dcb6; --color3-2: #000; --color4-1: #93a7f0; --color4-2: #000; --pos3-1: 0%; --pos3-2: 50%; --pos3-3: 100%; } body { background-color: black; margin: 0; padding: 0; width: 100vw; height: 100vh; overflow: hidden; } .gradient-container { position: absolute; overflow: hidden; transition: all 0.3s ease; clip-path: var(--clip-path); } .gradient-up { background-image: repeating-linear-gradient( to bottom, var(--color1) var(--pos1), var(--color2) var(--pos2), var(--color1) var(--pos3), var(--color2) var(--pos4), var(--color1) var(--pos5), var(--color2) var(--pos6), var(--color1) var(--pos7) ); animation: moveUpwards 5s linear infinite; } .gradient-down { background-image: repeating-linear-gradient( to bottom, var(--color2-1) var(--pos2-1), var(--color2-2) var(--pos2-2), var(--color2-1) var(--pos2-3), var(--color2-2) var(--pos2-4), var(--color2-1) var(--pos2-5) ); animation: moveDownwards 5s linear infinite; } .gradient-left { background-image: repeating-linear-gradient( to right, var(--color3-1) var(--pos3-1), var(--color3-2) var(--pos3-2), var(--color3-1) var(--pos3-3) ); animation: moveLeft 5s linear infinite; } .gradient-right { background-image: repeating-linear-gradient( to right, var(--color4-1) var(--pos1), var(--color4-2) var(--pos2), var(--color4-1) var(--pos3), var(--color4-2) var(--pos4), var(--color4-1) var(--pos5), var(--color4-2) var(--pos6), var(--color4-1) var(--pos7) ); animation: moveRight 5s linear infinite; } .strobe { background-color: #000; } @keyframes moveUpwards { 0% { background-position: 0 100%; } 100% { background-position: 0 -100%; } } @keyframes moveDownwards { 0% { background-position: 0 -100%; } 100% { background-position: 0 100%; } } @keyframes moveLeft { 0% { background-position: 100% 0; } 100% { background-position: -100% 0; } } @keyframes moveRight { 0% { background-position: -100% 0; } 100% { background-position: 100% 0; } } </style> </head> <body> <div id="puzzle-container"> <div class="gradient-container gradient-right" style="left: 0.0vw; top: 0.0vh; width: 14.583333333333334vw; height: 86.29629629629629vh; background-size: 29.166666666666668vw 86.29629629629629vh; animation-duration: 56s; --clip-path: polygon(0% 0%, 112% 0%, 119% 108%, 0% 100%);"> </div> <div class="gradient-container gradient-up" style="left: 0.0vw; top: 86.29629629629629vh; width: 1.8229166666666667vw; height: 13.703703703703704vh; background-size: 1.8229166666666667vw 27.40740740740741vh; animation-duration: 32s; --clip-path: polygon(0% 0%, -148% 37%, 177% 100%, 0% 100%);"> </div> <div class="gradient-container gradient-right" style="left: 1.8229166666666667vw; top: 86.29629629629629vh; width: 4.114583333333333vw; height: 1.574074074074074vh; background-size: 8.229166666666666vw 1.574074074074074vh; animation-duration: 47s; --clip-path: polygon(-110% 318%, 203% -29%, 20% 343%, -19% -265%);"> </div> <div class="gradient-container gradient-up" style="left: 1.8229166666666667vw; top: 87.87037037037037vh; width: 4.114583333333333vw; height: 7.685185185185185vh; background-size: 4.114583333333333vw 15.37037037037037vh; animation-duration: 66s; --clip-path: polygon(-19% -75%, 20% 50%, 94% 32%, 183% 92%);"> </div> <div class="gradient-container gradient-up" style="left: 1.8229166666666667vw; top: 95.55555555555556vh; width: 3.5937499999999996vw; height: 4.444444444444445vh; background-size: 3.5937499999999996vw 8.88888888888889vh; animation-duration: 45s; --clip-path: polygon(209% -13%, 205% 157%, -84% 100%, 39% 100%);"> </div> <div class="gradient-container gradient-left" style="left: 5.416666666666667vw; top: 95.55555555555556vh; width: 0.5208333333333333vw; height: 4.444444444444445vh; background-size: 1.0416666666666665vw 4.444444444444445vh; animation-duration: 2s; --clip-path: polygon(723% 157%, 53% -118%, -1324% 100%, -1269% 100%);"> </div> <div class="gradient-container gradient-left" style="left: 5.9375vw; top: 86.29629629629629vh; width: 2.5520833333333335vw; height: 11.018518518518519vh; background-size: 5.104166666666667vw 11.018518518518519vh; animation-duration: 12s; --clip-path: polygon(167% -4%, -210% 61%, -178% 149%, -13% 83%);"> </div> <div class="gradient-container gradient-up" style="left: 5.9375vw; top: 97.31481481481481vh; width: 2.5520833333333335vw; height: 2.685185185185185vh; background-size: 2.5520833333333335vw 5.37037037037037vh; animation-duration: 94s; --clip-path: polygon(-13% -71%, -178% 201%, -86% 100%, -291% 100%);"> </div> <div class="gradient-container gradient-down" style="left: 8.489583333333334vw; top: 86.29629629629629vh; width: 6.09375vw; height: 9.814814814814815vh; background-size: 6.09375vw 19.62962962962963vh; animation-duration: 99s; --clip-path: polygon(-130% 68%, 145% 66%, -4% 163%, -87% 30%);"> </div> <div class="gradient-container gradient-left" style="left: 8.489583333333334vw; top: 96.11111111111111vh; width: 6.09375vw; height: 3.888888888888889vh; background-size: 12.1875vw 3.888888888888889vh; animation-duration: 10s; --clip-path: polygon(-87% -177%, -4% 160%, 31% 100%, -78% 100%);"> </div> <div class="gradient-container gradient-left" style="left: 14.583333333333334vw; top: 0.0vh; width: 80.9375vw; height: 100.0vh; background-size: 161.875vw 100.0vh; animation-duration: 76s; --clip-path: polygon(2% 0%, 98% 0%, 96% 100%, -5% 100%);"> </div> <div class="gradient-container gradient-down" style="left: 95.52083333333333vw; top: 0.0vh; width: 4.479166666666667vw; height: 1.1111111111111112vh; background-size: 4.479166666666667vw 2.2222222222222223vh; animation-duration: 92s; --clip-path: polygon(-32% 0%, 100% 0%, 100% 349%, 27% -577%);"> </div> <div class="gradient-container gradient-up" style="left: 95.52083333333333vw; top: 1.1111111111111112vh; width: 4.479166666666667vw; height: 98.88888888888889vh; background-size: 4.479166666666667vw 197.77777777777777vh; animation-duration: 94s; --clip-path: polygon(27% -8%, 100% 3%, 100% 100%, -79% 100%);"> </div> </div> </body> </html>
150 of 172