Scroll-scrubbed photo deck built as a plain, fully editable Etch tree: section > header (eyebrow, h2, intro) > deck wrapper (sticky stage with a fanned card stack, arrows, pagination and an optional draggable scrollbar). Only the card is a component, "Deck Card", with typed props: photo (image), photoAlt, index (e.g. "01"), caption; six instances ship by default, reorder/add/remove them in Layers. Every option is a data attribute on the Deck element (edit it in Etch's attributes panel): data-duration (extra scroll length in vh the deck takes to play through, default 240); data-theme (light|dark) re-themes the section; data-arrows (true|false) and data-arrows-position (sides|sides-outside|top-start|top-end|bottom-start|bottom-center|bottom-end|overlay-bottom-end) and data-arrows-style (circle|square|pill|minimal); data-pagination (dots|lines|progress|fraction|numbers|none) and data-pagination-position (bottom-center|bottom-start|bottom-end|top-start|top-end|overlay-bottom|side-start|side-end); data-controls-layout (split|grouped) grouped puts arrows and pagination in one bar at the pagination position; data-scrollbar (true|false) a draggable progress scrollbar under the deck; dragging it scrolls the page; data-autoplay-button (true|false) a play/pause toggle that smooth-scrolls the page through the deck on its own; data-arrows-mobile (true|false) hides the arrow buttons below the tablet breakpoint (scroll and dots still work). Inlined JS (no library) is the single source of truth on the page's real scroll position: it reads the deck wrapper's position each frame (rAF-throttled, IntersectionObserver-gated) to derive one –progress value; every card's stack offset, rotation, scale and exit animation are pure CSS calc() against its own index, so the deck is perfectly scroll-linked. Arrows, dot clicks and the scrollbar all smooth-scroll the real page to the matching position instead of animating independently, so keyboard, scroll-wheel and pointer stay in sync; the autoplay button smooth-scrolls the page on a timer and pauses on any user scroll or pointer interaction. Inside the Etch builder, under prefers-reduced-motion, or without JS, the pin is skipped and the deck renders as a plain fanned stack showing every caption in normal flow, no motion. Landmark region, arrow/dot buttons with aria-label and aria-current, :focus-visible rings, AA contrast in both themes, forced-colors support.