{# Composable click-through carousel. One widget, used everywhere. A carousel is just an ordered list of frames; every surface (app product pages, landing) calls this same macro with a different frame list. Do not fork it for bespoke layouts -- if a surface needs more, extend the macro. Click-through, not animated: the viewer advances frames with the prev/next controls, the dots, or the arrow keys. No autoplay, no auto-advance, no slide animation -- frames swap instantly. Each frame is a `CarouselFrame { image, alt, caption: Option<_> }` (see `src/templates/mod.rs`). Usage: {%- import "partials/carousel.html" as carousel -%} {% call carousel::carousel("af-shots", frames) %} Progressive enhancement: with JS off, the first frame shows and the controls are inert -- you still see a screenshot, nothing breaks. #} {% macro carousel(id, frames) -%}