A hero image row of five "Story Frame" component instances (photo, alt, eyebrow, title, description, link URL + label — empty URL hides the button, tone select for the index-chip accent): only one frame is active at a time, springing open to fill most of the row while the rest compress to a slim strip that shows just a numbered chip; picking a different frame morphs the widths with an overshoot ("elastic") cubic-bezier by default. Every option is a data attribute on the Carousel element (edit it in Etch's attributes panel): data-theme (light|dark) section theme; data-trigger (click|hover|autoplay) what makes a frame become active: click selects and stays, hover expands on pointer/focus and returns to the previous active frame on leave, autoplay always cycles on a timer regardless of pointer (click/hover still jump the active frame); data-autoplay (true|false) and data-delay (ms, min 1500) — autoplay always runs a background timer in addition to whatever data-trigger is set, unless false; data-loop (true|false) autoplay/next wraps past the last frame instead of stopping; data-easing (spring|smooth|snappy|linear) width-morph curve: spring overshoots and settles (default, matches the source), smooth/snappy are non-overshoot eases, linear is constant-speed; data-duration (ms) width-morph duration; data-radius (none|s|m|l|xl) frame corner radius; data-gap (px) gap between frames; data-ratio (portrait|square|wide) stage block-size ratio against the container width; data-overlay (none|soft|deep) scrim strength behind the active frame caption; data-arrows (true|false) and data-arrows-position (sides|bottom-start|bottom-end|overlay-bottom-end); data-pagination (dots|fraction|none) and data-pagination-position (bottom-start|bottom-center|bottom-end|overlay-bottom-end); data-reduced (fade|none) prefers-reduced-motion behaviour: fade cross-fades the caption without moving the frame widths, none disables the width morph entirely (frames stay evenly sized, only the caption changes). Vanilla JS (no library) drives the active index from data-trigger, autoplay, arrow buttons, pagination dots/fraction, click-anywhere-on-a-frame and ArrowLeft/ArrowRight/Home/End on the row; a live region announces the active frame's title. Without JS every frame renders at equal width with its caption already visible (progressive enhancement), so the content is always reachable. :focus-visible rings, AA caption contrast over any photo via the overlay scrim, forced-colors borders, reduced motion respected per data-reduced.