
/* ── THE LATTICE IS PINNED, THE CONTENT SCROLLS ────────────────────
   It used to be `absolute inset-0` inside the scroller, which anchors it to
   the scrolled CONTENT box — so the grain slid up with the subjects and the
   bottom of a long rail was bare. The field is meant to be the surface the
   rail is cut into; a surface that travels with the paper is a texture on the
   paper instead.

   A ZERO-HEIGHT STICKY HOST is what pins it without a restructure. The host
   sticks to the top of the scrollport and contributes no height to the flex
   column, so nothing below it moves; the canvas hangs off it absolutely at a
   height taller than any rail and is clipped by the rail's own chamfer. The
   alternative — lifting the layer out to the rail wrapper — needs the
   scroller's opaque fill to move with it, which is six files and a new node
   per rail for the same pixels. */
.ec-rl {
  position: sticky; top: 0; z-index: -1;
  flex: 0 0 0; height: 0; overflow: visible;
  pointer-events: none;
}
/* THE CSS HEIGHT IS A FLOOR, NOT THE ANSWER — script measures the real box
   and overwrites it (see the effect). It is a real number rather than zero so
   that a lattice is never invisible: if script has not run, or measured
   badly, the rail still has its grain and the chamfer clips the excess. */
.ec-rl-host { position: absolute; top: 0; left: 0; width: 100%; height: 900px; }

/* ── THE RAIL ANSWERS ITS SCROLL IN THE GRAIN, NOT OVER IT ─────────
   The scroll answer used to be a soft gradient band driven by a scroll
   timeline, and it glitched. Two reasons, both structural rather than
   tuneable: a timeline-driven transform inside a STICKY zero-height host is
   being positioned by two systems at once, and a scroll timeline's range
   jumps whenever the scroller's content height changes — which, in a rail
   whose subject list filters as you type, is constantly.

   It is a colony now, and it lives INSIDE the lattice rather than on a layer
   above it: scrolling stirs hex-Langton walkers through the same cells the
   pointer and the strike front already light, joined by the same MAX law.
   See THE CRAWL in chrome-bits. That placement is the whole point — the old
   band was additive over the grain, so it moved the ground under 10px copy;
   a walker converts a cell's existing ink to aqua and cannot brighten
   anything. It is also the same automaton as the well's turmites, at rail
   scale, so the rails and the background are visibly one machine.

   Reduced motion switches it off inside the lattice, where the rest of the
   motion budget is already decided. The pinning above stays either way: that
   is a fix, not an effect. */
