jetstream v2 in zig stream.waow.tech
Something went wrong. Try again.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455(() => { function createRiver() { return { packets: [] }; } function arrive(river, seed, now) { river.packets.push({seed:seed>>>0,at:now}); if (river.packets.length > 64) river.packets.shift(); } function render(river, now, columns, reduced=false) { river.packets=river.packets.filter(packet=>now-packet.at<2600); const glyphs=['~','~','~','~','≈','≈']; const rows=Array.from({length:4},(_,row)=>Array.from({length:columns},(_,x)=> (x+row*3)%7===6?'·':glyphs[(Math.imul(x+row*7919+1,0x45d9f3b)>>>16)%glyphs.length])); for(const {seed,at} of river.packets){ const age=now-at, row=seed%4; const start=(seed>>>4)%columns; const travel=reduced?0:Math.floor(age*(.018+row*.004)); const head=(start+travel)%columns; const strength=1-age/2600; const length=2+(seed>>>12)%5; for(let tail=0;tail<length;tail++){ const x=(head-tail+columns)%columns; if(tail<length*strength) rows[row][x]=tail===0&&strength>.45?'≈':'~'; } } return rows.map(row=>row.join('')).join('\n'); } if(typeof module!=='undefined') module.exports={createRiver,arrive,render}; if(typeof document==='undefined') return; const element=document.getElementById('river'); if(!element) return; const river=createRiver(), reduced=matchMedia('(prefers-reduced-motion: reduce)'); let columns=60, frame=0, painted=0; function draw(now){ frame=0; if(document.hidden) return; if(now-painted>=80||reduced.matches){ element.textContent=render(river,now,columns,reduced.matches);painted=now; } if(!reduced.matches&&river.packets.length) frame=requestAnimationFrame(draw); } function wake(){if(!frame&&!document.hidden)frame=requestAnimationFrame(draw);} function resize(){ const style=getComputedStyle(element); const measure=document.createElement('canvas').getContext('2d'); measure.font=style.font; const cell=measure.measureText('~').width+(parseFloat(style.letterSpacing)||0); columns=Math.max(12,Math.min(72,Math.floor(element.parentElement.clientWidth/cell))); element.textContent=render(river,performance.now(),columns,reduced.matches); } addEventListener('stream-arrival',event=>{arrive(river,event.detail,performance.now());wake();}); document.addEventListener('visibilitychange',wake); reduced.addEventListener('change',()=>{resize();wake();}); new ResizeObserver(resize).observe(element.parentElement); resize();})();