Row of portrait photo cards built as a plain, fully editable Etch tree: section > container > header (eyebrow, h2, intro) > row of "Photo Pair" component instances. Only the card is a component, with typed props: imageA/imageAAlt (the resting photo), imageB/imageBAlt (the photo revealed underneath), label, linkLabel + linkHref (the corner link only renders when a URL is filled); duplicate, reorder or delete cards in Layers. On hover or keyboard focus the top photo iris-wipes closed (CSS clip-path circle, no canvas) toward the pointer (or a fixed centre), revealing the second photo underneath a soft animated grain-texture flash (inline SVG feTurbulence, opacity-only — no @keyframes). Row options are data attributes on the Row element: data-origin (pointer|center) the wipe closes toward the cursor position or a fixed center point; data-grain (true|false) a textured grain flash layered into the transition; data-caption (bottom|hidden) show or hide the caption band. Pointer tracking is skipped on coarse/touch pointers (the wipe always closes toward centre there) and a tap toggles the reveal so the second photo is reachable without hover. prefers-reduced-motion swaps the wipe for an instant crossfade. :focus-visible ring, AA caption contrast, forced-colors border fallback.