fractal-tendrils-in-pulsing.../exploration.html

73 lines
18 KiB
HTML
Raw Permalink Normal View History

2026-03-27 09:47:15 +00:00
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Fractal Tendrils in Pulsing Stillness — exploration</title>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body { background: #0a0a0f; color: #3a3a4a; font-family: ui-monospace, monospace; overflow: hidden; }
#grid { padding: 20px; font-size: 12px; line-height: 1.4; white-space: pre; }
.c { display: inline-block; transition: all 0.3s; }
.c.active { color: #fde68a; text-shadow: 0 0 6px rgba(253,230,138,0.5); }
.c.strong { color: #34d399; text-shadow: 0 0 10px rgba(52,211,153,0.6); font-weight: bold; }
.c.dead { color: #1a1a2a; }
#info { position: fixed; bottom: 10px; left: 20px; color: #3a3a4a; font-size: 11px; }
#controls { position: fixed; top: 10px; right: 20px; color: #666; font-size: 11px; }
#controls span { cursor: pointer; margin-left: 12px; color: #fde68a; }
</style>
</head>
<body>
<div id="grid"></div>
<div id="info">neurameba · physarum exploration</div>
<div id="controls"><span id="play-btn">play</span><span id="reset-btn">reset</span></div>
<script>
const text = "# Support motd\n\n## Sponsor\n\nmotd has no ads, no data sales, no venture funding. Servers cost money. Sponsorship keeps them running.\n\nWhat sponsorship does:\n- Keeps the platform online\n- Extends archive duration for everyone — sponsors directly increase how long posts stay searchable\n- Transparent: \"This month's sponsors extended the archive to X days\"\n\nSponsorship is coming. Payment method TBD. When it's ready, it'll be announced here and via @motd.\n\n## Contribute\n\nYou don't need permission to build on motd. The API is open.\n\n**Build a plugin.** Write a bot, a bridge, a custom client, a feed filter — whatever you want. See `/read plugins` for examples and the API reference.\n\n**Report bugs.** Post with the [bugs] tag. Include what you did, what happened, what you expected.\n\n**Suggest features.** Post with the [ideas] tag. Keep it concrete.\n\n**Improve the docs.** If something is unclear or missing, say so. Post with [docs] or [ideas] tag.\n\n## Contact\n\n**On motd:** post with an @motd mention. We're here.\n\n**Email:** hello@motd.social\n\nNo Discord. No Slack. No external community platform. motd IS the community.\n";
const passes = [{"t":0,"r":31,"c":28,"a":"hold","s":0.2971349468163326,"ps":9,"e":101.02707957453066,"pr":1.1},{"t":0,"r":24,"c":0,"a":"died","s":0,"ps":8,"e":100,"pr":1},{"t":0,"r":21,"c":18,"a":"extend","s":0.31860403792876996,"ps":9,"e":70.83918261240112,"pr":1.1},{"t":0,"r":18,"c":0,"a":"died","s":0,"ps":8,"e":100,"pr":1},{"t":0,"r":23,"c":49,"a":"hold","s":0.2816619739772053,"ps":9,"e":100.90329579181764,"pr":1.1},{"t":1,"r":31,"c":28,"a":"extend","s":0.3488560083582193,"ps":9,"e":71.72754934897749,"pr":1.1},{"t":1,"r":21,"c":18,"a":"hold","s":0.2897019440332495,"ps":9,"e":71.80679816466711,"pr":1.1},{"t":1,"r":23,"c":49,"a":"hold","s":0.2811632015303323,"ps":9,"e":101.8026014040603,"pr":1.1},{"t":2,"r":31,"c":28,"a":"hold","s":0.3488560083582193,"ps":8,"e":73.31839741584325,"pr":1.05},{"t":2,"r":21,"c":18,"a":"hold","s":0.2841874915413952,"ps":8,"e":72.88029809699827,"pr":1.05},{"t":2,"r":23,"c":49,"a":"retracted","s":0.27633850069090826,"ps":8,"e":102.81330940958756,"pr":1.05},{"t":2,"r":31,"c":29,"a":"extend","s":0.41713834707653796,"ps":5,"e":23.32923954832186,"pr":1.2000000000000002},{"t":2,"r":31,"c":27,"a":"extend","s":0.42451040633266734,"ps":5,"e":23.370523080156186,"pr":1.2000000000000002},{"t":3,"r":31,"c":28,"a":"hold","s":0.2971349468163326,"ps":8,"e":74.49547699037392,"pr":1.05},{"t":3,"r":21,"c":18,"a":"retracted","s":0.3043852317215119,"ps":8,"e":74.11537995077038,"pr":1.05},{"t":3,"r":31,"c":29,"a":"extend","s":0.381752035728739,"ps":5,"e":17.94327908390624,"pr":1.2000000000000002},{"t":3,"r":31,"c":27,"a":"extend","s":0.5712135713803087,"ps":5,"e":19.033162155839058,"pr":1.2000000000000002},{"t":3,"r":31,"c":30,"a":"hold","s":0.35138070261675003,"ps":5,"e":12.059291141643367,"pr":1.3000000000000003},{"t":4,"r":31,"c":28,"a":"retracted","s":0.2971349468163326,"ps":7,"e":75.82255656490457,"pr":1},{"t":4,"r":31,"c":29,"a":"hold","s":0.381752035728739,"ps":4,"e":20.397295369736153,"pr":1.1500000000000001},{"t":4,"r":31,"c":27,"a":"extend","s":0.5497978780223294,"ps":4,"e":15.982081626012382,"pr":1.1500000000000001},{"t":4,"r":31,"c":30,"a":"hold","s":0.3533037952127752,"ps":4,"e":14.285721503345568,"pr":1.2500000000000002},{"t":5,"r":31,"c":29,"a":"extend","s":0.41713834707653796,"ps":4,"e":16.194081502443918,"pr":1.1500000000000001},{"t":5,"r":31,"c":27,"a":"hold","s":0.3826152819499863,"ps":4,"e":18.443003881612274,"pr":1.1500000000000001},{"t":5,"r":31,"c":30,"a":"retracted","s":0.3314134170784083,"ps":4,"e":16.337028839972835,"pr":1.2000000000000002},{"t":5,"r":31,"c":26,"a":"extend","s":0.558934911096661,"ps":5,"e":7.399659989945016,"pr":1.2500000000000002},{"t":6,"r":31,"c":29,"a":"extend","s":0.41713834707653796,"ps":4,"e":13.251831795339355,"pr":1.1},{"t":6,"r":31,"c":27,"a":"hold","s":0.3722435652586148,"ps":4,"e":20.820952403681193,"pr":1.1},{"t":6,"r":31,"c":26,"a":"extend","s":0.5027947175431334,"ps":5,"e":7.470412411203058,"pr":1.2500000000000002},{"t":6,"r":31,"c":28,"a":"hold","s":0.1412581068496012,"ps":5,"e":7.320385498701346,"pr":1.2500000000000002},{"t":7,"r":31,"c":29,"a":"extend","s":0.41713834707653796,"ps":4,"e":11.19225700036616,"pr":1.05},{"t":7,"r":31,"c":27,"a":"retracted","s":0.3621529991438168,"ps":4,"e":23.11817639683173,"pr":1.05},{"t":7,"r":31,"c":26,"a":"extend","s":0.48710023418411796,"ps":4,"e":7.5370499992732,"pr":1.2000000000000002},{"t":7,"r":31,"c":28,"a":"hold","s":0.2540145053706275,"ps":5,"e":8.602501541666365,"pr":1.2500000000000002},{"t":7,"r":31,"c":25,"a":"extend","s":0.5553157828681321,"ps":5,"e":4.825892107422456,"pr":1.3500000000000003},{"t":8,"r":31,"c":29,"a":"extend","s":0.41713834707653796,"ps":4,"e":9.750554643884925,"pr":1},{"t":8,"r":31,"c":26,"a":"extend","s":0.5069932061957808,"ps":4,"e":7.695096954187612,"pr":1.2000000000000002},{"t":8,"r":31,"c":28,"a":"retracted","s":0.2540145053706275,"ps":4,"e":10.034617584631384,"pr":1.2000000000000002},{"t":8,"r":31,"c":25,"a":"extend","s":0.5433563056336023,"ps":4,"e":6.000919786743891,"pr":1.3000000000000003},{"t":8,"r":31,"c":30,"a":"hold","s":0.13989279529413534,"ps":5,"e":5.16582393393858,"pr":1.150
const lines = text.split('\n');
const gridEl = document.getElementById('grid');
const charEls = [];
for (let r = 0; r < lines.length; r++) {
const row = [];
for (let c = 0; c < lines[r].length; c++) {
const s = document.createElement('span');
s.className = 'c';
s.textContent = lines[r][c];
row.push(s);
gridEl.appendChild(s);
}
charEls.push(row);
gridEl.appendChild(document.createTextNode('\n'));
}
let tick = -1, playing = false, iv;
function apply(t) {
for (const r of charEls) for (const e of r) e.className = 'c';
const active = new Map();
for (const p of passes) {
if (p.t > t) break;
const k = p.r+','+p.c;
if (p.a === 'died' || p.a === 'retracted') active.set(k, 'dead');
else if (p.ps > 16) active.set(k, 'strong');
else active.set(k, 'active');
}
for (const [k, cls] of active) {
const [r, c] = k.split(',').map(Number);
if (charEls[r]?.[c]) charEls[r][c].className = 'c ' + cls;
}
document.getElementById('info').textContent = 'tick ' + t + ' · ' + [...active.values()].filter(v=>v!=='dead').length + ' alive';
}
function play() {
if (playing) return;
playing = true;
document.getElementById('play-btn').textContent = 'pause';
const max = passes.length > 0 ? passes[passes.length-1].t : 0;
iv = setInterval(() => { tick++; if (tick > max) { pause(); return; } apply(tick); }, 900);
}
function pause() { playing = false; clearInterval(iv); document.getElementById('play-btn').textContent = 'play'; }
function reset() { pause(); tick = -1; for (const r of charEls) for (const e of r) e.className = 'c'; document.getElementById('info').textContent = 'neurameba'; }
document.getElementById('play-btn').addEventListener('click', () => playing ? pause() : play());
document.getElementById('reset-btn').addEventListener('click', reset);
setTimeout(play, 1000);
</script>
</body>
</html>