How the plain was built
EJECTA is a fictional orbital survey instrument for a wave about deep time. Its single job: make one geological idea legible — that a surface with no wind or water dates itself by how many craters it holds, until it fills up and forgets.
A ledger with no eraser but the next impact
On an airless world nothing removes a crater except a later crater landing on top of it. So the ground accumulates its whole history in one plane. EJECTA renders that plane top-down as an orbital plate: fresh impacts arrive bright with pale ejecta rays, the rays fade to grey, and new craters overprint older ones into faint palimpsests. The audience is anyone who has wondered how we date a world we have never drilled — the answer is that we count.
Argued from regolith
The Moon is nearly colourless, so the palette is disciplined greys with a single warm-white accent reserved for lines and marks — fresh rims and ejecta rays. Body copy runs on a dedicated light ink so it clears 4.5:1 on the near-black page, never competing with the accent.
Instrument, not ornament
The one typographic move: the model age set enormous in Space Grotesk, tight tracking, next to a whispered mono unit. A single big number is the whole promise of the page — 3.9 billion years, read off the ground.
How the signature works
The plate is two canvases. A persistent off-screen surface holds the permanent morphology: every crater is stamped there — a bowl gradient, a shadow crescent on the anti-light side, and a rim that is bright on the light-facing arc and dark opposite, lit from 34° NW. Because new craters paint straight over old ones, overprinting and erasure are free — no bookkeeping, just paint order. A faint regolith wash every couple of seconds softens old craters into ghosts.
The bright ejecta rays are the only transient layer, kept as objects with a life and redrawn additively on the visible canvas each frame so they fade independently of the permanent bowl. That split is what lets a fresh crater look fresh while its neighbours have already greyed out.
The clock is honest crater chronology. Every impact increments a cumulative flux; the visible count saturates because each new crater probabilistically destroys older ones, holding density near equilibrium. Model age is read off the cumulative count with a decelerating curve toward 4.5 Gyr — so it climbs fast early, then stalls once the plain is full and can only report a lower bound. The size-frequency plot bins craters by diameter and draws the classic falling cumulative line against a reference production slope. No libraries — plain canvas 2D, DPR capped at 2, rAF paused on document.hidden, and a settled saturated frame under prefers-reduced-motion.
Three passes, driven not loaded
Craft
- Age recalibrated to the promise. The first build seeded a visually saturated plain that nonetheless read only ~2.4 Gyr — undated the "four billion years" headline. Retuned the chronology constant and raised the pre-seed to ~1,140 impacts so a resting plate reads ≈3.9–4.0 Gyr, matching the mid-span deep-time resting state the brief requires.
- Accessible h1 fixed. The heading's accessible name concatenated to "EJECTAA plain…"; inserted a visually-hidden separator so it now reads "EJECTA — A plain that keeps four billion years of impacts".
- Confirmed the ink/line split: the warm-white accent is used only for rays, rims and the age numeral; all small text runs on body-ink greys above 4.5:1.
Depth
- Rare large impactor. Added a ~1.8% chance for an oversized impact that throws plate-crossing rays — a punctuation in the steady bombardment, and the second-read moment a viewer waits to see again.
- Palimpsest weathering tuned so ancient craters genuinely soften into ghosts rather than staying crisp, giving the plain visible depth of history under the fresh scars.
- Verified the self-drawing SFD tracks the accumulating population against the reference production slope as impacts land.
Hardening
- 375px collision fixed. The plate's top-left and top-right corner tags overlapped on narrow screens; the descriptive tag now hides below 560px, leaving the live age tag clear. Verified no horizontal overflow (scrollWidth = 375, nav and wordmark within the viewport).
- Chanel rule. Removed a redundant white top-left overlay wash — the per-crater directional shading already carries the light direction, so one gradient does the job the two were splitting.
- Re-checked reduced-motion (a single settled saturated frame, no loop),
:focus-visiblerings, DPR cap, debounced resize re-seed, and rAF pause on tab hide. Headless run: zero console errors at 1440 and 375, one h1, age and overprint count both climbing over a 7-second drive.
What I'm least sure of: the density-to-age mapping is a plausible stylisation of crater chronology, not a calibrated production function — it is tuned to read premium and behave honestly (rise, then stall at saturation), not to reproduce a specific lunar isochron.