Depth-of-field photo reel built as a plain, fully editable Etch tree: section > container > header (eyebrow, h2, intro) > strip (Swiper track of six "Filmstrip Frame" component instances, caption bar, scroll/drag hint, controls). Only the frame is a component, with typed props: photo (image), photoAlt, title and index (auto-numbered when blank); duplicate, reorder or delete frames in Layers. The active frame renders large and sharp; the upcoming frames recede to the right, shrinking, tilting and blurring by a fixed step each (set with a –dist custom property the script writes on every slide on each transition) until they fade out past data-depth. Every option is a data attribute on the Strip element (edit it in Etch's attributes panel): data-theme (light|dark) re-themes the strip; data-radius (none|s|m|l|xl) frame corner radius; data-depth (how many receding frames stay visible before they fade out, default 4); data-tilt (deg of perspective tilt per receding step, default 6); data-scale-step (size shrink per step 0-1, default 0.09); data-blur-step (px blur per step, default 3); data-gap (px overlap between frames, default -40, negative = overlap); data-autoplay (true|false), data-delay (ms, min 1800), data-speed (transition ms, default 600); data-loop (true|false); data-drag (true|false; wheel, touch swipe and mouse drag); data-arrows (true|false); data-hint (true|false; shows the "Scroll / Drag" corner hint). Inlined JS waits for a global Swiper 11 (injects the jsDelivr build once if nothing provides it), is init-guarded, keeps loop and autoplay off inside the Etch builder, writes the caption title/counter from the active slide, and wires keyboard arrows, the a11y module, pause on keyboard focus, a pause/play toggle and no autoplay or animated transitions under prefers-reduced-motion. Without JS the strip is a native horizontal scroll-snap row with every frame sharp and the controls hidden. Labelled region landmark, per-slide group labels, :focus-visible rings, AA contrast in both themes, forced-colors support.