EJECTA
Colophon · build notes

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.

01 — The concept

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.

02 — Palette

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.

Regolith
#8A8B8E
The lit plain itself — mid-grey lunar dust, the canvas base.
Deep crater
#2B2C2F
Shadowed bowls and panel surfaces; the dark the light rakes across.
Rim ink
#54565A
Softened rims and ghost outlines — structure, not text.
Fresh ray
#E4E2DA
The one accent: high-albedo ejecta, fresh rims, the age numeral.
Space
#0B0C0D
The page ground; the plate reads as a specimen lit against it.
Body ink
#ABADB1
Secondary copy — the readable grey, kept above 4.5:1.
03 — Type

Instrument, not ornament

Space Grotesk
Display · 400–700
A geometric grotesk with a slightly technical eye — the survey-instrument voice. Carries the wordmark, headings, and the oversized model-age numeral.
4.00 Gyr
JetBrains Mono · readouts
Tabular figures for every count, density, and age — numbers that must not jitter as they climb. All labels are mono, uppercase, widely tracked.

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.

04 — Technique

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.

05 — Iteration log

Three passes, driven not loaded

Pass 1

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.
Pass 2

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.
Pass 3

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-visible rings, 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.