Skip to content

Commit 14b5240

Browse files
committed
chore: simplified explainer
1 parent cb16b54 commit 14b5240

3 files changed

Lines changed: 22 additions & 58 deletions

File tree

docs/index.html

Lines changed: 14 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -35,49 +35,23 @@ <h1 class="wordmark">stereo<i>·</i>mosaic<i>·</i>live</h1>
3535
<div class="cell"><span class="cap">Output</span>
3636
<span class="live"><span class="dot"></span>re-resampled on input</span></div>
3737
</div>
38-
<a class="scrollhint" id="scrollhint" href="#explainer" aria-label="Scroll for more">
38+
<a class="scrollhint" id="scrollhint" href="#about" aria-label="Scroll for more">
3939
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><path d="M6 9l6 6 6-6"/></svg>
4040
</a>
4141
</section>
42-
<section class="below" id="explainer">
43-
<span class="num">01 — How it works</span>
44-
<h2>The whole thing is a choice of columns.</h2>
45-
<p>Each output column is taken from one source frame. The mode picks <em>which</em> source
46-
column to sample per frame: pushbroom holds a fixed column (a single slit); xslit slides the
47-
column linearly with frame index (a virtual second slit → perspective); forward sweeps it
48-
quadratically (a looming push-in). The viewpoint dial shifts the base column.</p>
49-
<figure class="inset">
50-
<div class="frame"><canvas id="slices-canvas"></canvas></div>
51-
<div class="controls slices-controls" id="slices-controls">
52-
<label class="toggle"><input class="slices" type="checkbox"> show slices</label>
53-
<label class="dial">viewpoint <input class="vp" type="range" min="0" max="1" step="0.005" value="0.5" aria-label="Viewpoint"></label>
54-
</div>
55-
<figcaption>Tick <b>show slices</b> to draw the per-frame strip seams — the space-time volume the mosaic is cut from.</figcaption>
56-
</figure>
57-
</section>
58-
59-
<section class="below" id="lineage">
60-
<span class="num">02 — Lineage</span>
61-
<h2>Same frames, two slits.</h2>
62-
<p>Pushbroom is the original repo: one fixed slit, flat strips. X-slit is this fork — the slit
63-
slides across the frames and perspective falls out of it. Same footage, one toggle apart.</p>
64-
<figure class="inset">
65-
<div class="frame"><canvas id="lineage-canvas"></canvas></div>
66-
<div class="controls" id="lineage-controls">
67-
<div class="modes">
68-
<button data-m="pushbroom" class="on">pushbroom · original</button>
69-
<button data-m="xslit">xslit · this fork</button>
70-
</div>
71-
<label class="dial">viewpoint <input class="vp" type="range" min="0" max="1" step="0.005" value="0.5" aria-label="Viewpoint"></label>
72-
</div>
73-
</figure>
74-
</section>
75-
76-
<section class="below" id="depth">
77-
<span class="num">03 — Depth</span>
78-
<h2>Depth — next.</h2>
79-
<p class="note">X-slit is quietly stereo — the sweep that bends perspective also leaves depth in
80-
the slope of each feature's trail across the frames. Reading it back is the next step. Not built yet.</p>
42+
<section class="below" id="about">
43+
<span class="num">What this is</span>
44+
<h2>A panorama whose viewpoint you set after the shot.</h2>
45+
<p>One sideways pan in. Every output column is sampled from a single source frame; the
46+
sampling mode decides <em>which</em> column per frame, so projection and viewpoint stay
47+
adjustable after capture. The dial shifts the base column.</p>
48+
<dl class="specs">
49+
<div><dt>pushbroom</dt><dd>Fixed column — one slit, flat strips. The original repo.</dd></div>
50+
<div><dt>xslit</dt><dd>Column slides with frame index — perspective falls out. This fork.</dd></div>
51+
<div><dt>forward</dt><dd>Column sweeps quadratically — a looming push-in.</dd></div>
52+
</dl>
53+
<p class="note">X-slit is incidentally stereo: depth survives in the slope of each feature's
54+
trail across the frames. Reading it back is the next step — not built yet.</p>
8155
</section>
8256

8357
<footer class="foot">

docs/js/page.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,6 @@ function attract(m, controls) {
6767
async function main() {
6868
const hero = await mountViewer("hero-canvas", "hero-controls", { mode: "xslit", drag: true });
6969
heroLayout(); fadeHint();
70-
await mountViewer("slices-canvas", "slices-controls", { mode: "xslit" });
71-
await mountViewer("lineage-canvas", "lineage-controls", { mode: "pushbroom" });
7270
addEventListener("resize", () => { heroLayout(); fadeHint(); });
7371
addEventListener("scroll", fadeHint, { passive: true });
7472
if (document.fonts && document.fonts.ready) document.fonts.ready.then(heroLayout);

docs/style.css

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -85,21 +85,13 @@ canvas{width:100%;aspect-ratio:3982/527;display:block;background:transparent;
8585
.below h2{font:700 clamp(28px,4.6vw,54px)/1.04 "Space Grotesk";letter-spacing:-.02em;margin:0 0 18px;max-width:18ch}
8686
.below p{color:var(--muted);max-width:62ch;font-size:18px}
8787
.below em{color:var(--ink);font-style:italic}
88-
.inset{margin:40px 0 0}
89-
.inset .frame{border:1px solid var(--line2);border-radius:8px;overflow:hidden}
90-
.inset canvas{width:100%;aspect-ratio:3982/527;display:block;background:#000}
91-
.inset .controls{display:flex;gap:22px;align-items:center;flex-wrap:wrap;margin:16px 0 0;font-family:"IBM Plex Mono",monospace;font-size:12px;color:var(--muted)}
92-
.inset .modes{display:flex;border:1px solid var(--line2);border-radius:6px;overflow:hidden}
93-
.inset .modes button{background:transparent;color:var(--muted);border:0;border-right:1px solid var(--line);padding:8px 14px;cursor:pointer;font:inherit;font-size:12px;letter-spacing:.03em}
94-
.inset .modes button:last-child{border-right:0}
95-
.inset .modes button.on{background:var(--sig);color:#0a0c11;font-weight:500}
96-
.inset .dial{display:flex;align-items:center;gap:10px;flex:1;min-width:240px}
97-
.inset .dial input{flex:1;accent-color:var(--sig)}
98-
.inset .toggle{display:flex;align-items:center;gap:8px;cursor:pointer}
99-
.inset .toggle input{accent-color:var(--sig)}
100-
.inset figcaption{margin-top:12px;font:400 12.5px/1.5 "IBM Plex Mono",monospace;color:var(--faint)}
101-
.inset figcaption b{color:var(--muted);font-weight:500}
102-
#depth .note{border-left:2px solid var(--sig);padding:2px 0 2px 18px}
88+
.specs{margin:32px 0 0;max-width:64ch}
89+
.specs > div{display:grid;grid-template-columns:120px 1fr;gap:18px;align-items:baseline;padding:13px 0;border-top:1px solid var(--line)}
90+
.specs > div:last-child{border-bottom:1px solid var(--line)}
91+
.specs dt{font:500 13px/1.4 "IBM Plex Mono",monospace;letter-spacing:.04em;color:var(--sig)}
92+
.specs dd{margin:0;color:var(--muted);font-size:16px}
93+
.below .note{margin-top:28px;border-left:2px solid var(--sig);padding:2px 0 2px 18px}
94+
@media (max-width:560px){.specs > div{grid-template-columns:1fr;gap:4px}}
10395
.foot{max-width:1180px;margin:0 auto;padding:14vh 6vw 10vh;display:flex;justify-content:space-between;gap:24px;flex-wrap:wrap;font:400 13px/1.6 "IBM Plex Mono",monospace;color:var(--faint)}
10496
.foot a{color:var(--muted);text-decoration:none}
10597
.foot a:hover{color:var(--sig)}
@@ -109,5 +101,5 @@ canvas{width:100%;aspect-ratio:3982/527;display:block;background:transparent;
109101

110102
/* no-WebGL2 fallback */
111103
.no-webgl2 .stage{background:#000 center/cover no-repeat url("./asset/poster.jpg")}
112-
.no-webgl2 .console,.no-webgl2 .inset .controls{opacity:.4;pointer-events:none}
104+
.no-webgl2 .console{opacity:.4;pointer-events:none}
113105
.no-webgl2 .hero::after{content:"This demo needs a WebGL2-capable browser.";position:absolute;left:6vw;bottom:120px;z-index:6;font:400 12px/1.4 "IBM Plex Mono",monospace;color:var(--faint)}

0 commit comments

Comments
 (0)