Carousel
Organism
A horizontally paged slide viewer: swipe (or use the prev/next arrows and the dot indicators) to move one slide at a time.
Playground
Every control sets a real prop of CarouselProps. The JSX below updates as you go.
Web
iOS
Android
JSX · CarouselProps
Variants
4 examples from src/organisms/carousel/carousel.md, each rendered live from its own JSX.
Anatomy
1
Viewport
2
Slide
3
Arrow
4
Dots
Dimmed parts appear only in some states or variants.
Props
9 props on CarouselProps, grouped as they are declared in source. Required props are marked *.
Accessibility and keyboard
Keyboard
ArrowLeft
ArrowRight
Previous · next slide
Tab
Reaches arrows and dots
Semantics
Roles
button
group
States
disabled
selected
ARIA on web
aria-current
aria-disabled
Below the platform minimum, the touch area grows to 44 pt on iOS and 48 dp on Android without moving the layout.
From the docs
On web, Tab visits the carousel in the order it reads: the previous arrow, the slide viewport, the next arrow, then the slide picker (an arrow disabled at the end of a non-looping carousel is skipped). Tab reaches the viewport while its slides overflow it, and the focused viewport draws the theme's focus ring around the slide. Left and Right move between slides, while Home and End reach the first and last. Controls inside a slide keep their own keyboard behavior. The named slide-picker buttons report the current sl
The active dot follows the committed slide (a dot press, the arrows, the keyboard, a controlled index, a finished swipe) in both surface modes; the strip is absent with one slide, with showDots={false}, and by default on Android.
Platform skins
The playground's props on each platform: same tree, native shapes, type and touch sizes.
Usage
Paging snaps to the viewport width, the current slide drives the dots, and the arrows step the index (clamped, or wrapped when loop). Slides hold any content; pass an items array of { key, content }.
Each slide is itself the card: it paints the surface, rounds the corners and clips its content to them. So pass the slide's content, not a Card. A plain string renders in the slide's own type, inset from its edge; any other node fills the slide inside its 1px edge, so a picture is masked to the slide's shape. A Card nested inside frames the slide twice, and on Android the Material 3 item's 28dp corners cut the Card's own 12dp edge.
The prev and next arrows sit beside the slides, never over them, so nothing near a slide's edge is hidden behind an arrow; the slides narrow by the two arrow gutters instead.
Tokens
Read from the playground render. Values follow the scheme and the ion hue.
--bf
--f-dp
--fd
--ft
--gl
--ion
--ion-soft
--ln
--ln2
--sf2
--sf4