07

Scroll-driven timelines

animation-timeline: view() — below-fold marks draw exactly as they're seen, forward and backward, because scroll position IS the playhead. Easing is always linear here: the scroll IS the curve; layering a spring on top would lie about position.

animation-timeline: view()scroll()linear only@supports

Behind @supports (animation-timeline: view()), with the time-based version as fallback — unsupported browsers get a one-shot draw on a soft ease, never a blank mark.

Pipeline marks

scroll up and down — the rules scrub with you

  1. T+00Intakeevents land in the ingest buffer
  2. T+04Validateschema + dedupe against the last 24h window
  3. T+09Enrichgeo, fleet metadata, ownership tags joined in
  4. T+13Routefan-out to storage, alerting and the live board
  5. T+21Settleacked to the source; budget counters updated

Edge-fade affordance

the fades are wired to the scroller's own position — drag the table

noderegioncpumemdisknet-innet-outconnsp50p99errsuptime
edge-fra-01eu-central42%61%38%1.2G0.9G8,41212ms88ms041d
edge-iad-04us-east58%72%51%2.4G2.1G12,9309ms74ms217d
edge-sin-02ap-south31%48%22%0.8G0.7G5,20418ms120ms063d

How it's wired

timeline-scope hoists the scroller's timeline to the wrapper's overlays

.scroll-draw {
  transform-origin: left;
  animation: draw-x 1ms linear both;     /* duration is ignored —          */
  animation-timeline: view();            /* the viewport IS the clock      */
  animation-range: entry 15% cover 45%;
}

.edge-fade            { timeline-scope: --edge-x; }         /* wrapper     */
.edge-fade-scroller   { scroll-timeline: --edge-x x; }      /* names it    */
.edge-fade::after     { animation: fade-opacity-out 1ms linear both;
                        animation-timeline: --edge-x;       /* reads it    */
                        animation-range: 92% 100%; }