Carousel: Root container. Owns the snap engine — the selected index, the snap offsets computed from the measured viewport, and autoplay — and provides it to all parts via context.
Carousel.Content: Measured slide viewport hosting the horizontal snap FlatList with the Carousel.Item children (fed to the list as data).
Carousel.Item: One slide. Its width is computed by the engine from the measured viewport, itemsPerView, gap, and sidePadding.
Carousel.Previous / Carousel.Next: Navigation buttons, disabled at the ends. Positioned per the root type: overlaid on the slide area (in-place), outside it (modal), or inline (miniatures). Default chevrons mirror in RTL.
Carousel.Dots: Indication-only dots (not pressable), one per snap point. The selected pill interpolates against root progress as the strip is dragged. Hidden when there is at most one snap point.
Carousel.Thumbnails: Horizontal FlatList strip of thumbnails that auto-scrolls the selection toward its center.
Carousel.Thumbnail: Pressable thumbnail navigating to a slide (index required). Renders an image source or custom children, plus an animated selection ring.
For an edge-to-edge carousel with breathing room, use sidePadding instead of padding the container (which clips the strip) or the content row (which desyncs the snap offsets). The engine owns it: the first and last slides rest inset by the padding, intermediate slides keep their align position on screen, and the overlaid navigation buttons keep their inset relative to the padded slide area. Without an explicit gap, the gap defaults to sidePadding.
Autoplay advances to the next snap point on an interval and wraps back to the first at the end. By default it stops permanently on the first user interaction; set stopAutoPlayOnInteraction={false} to only pause while dragging.
renderDot replaces each default dot. Dots are indication-only; interpolate against the progress shared value (continuous snap index) so the indicator follows the drag on the UI thread.
useCarousel() exposes scrollX (physical offset) and progress (continuous snap index) as shared values for parallax and indicator effects. progress is logical: interpolating a physical translateX from it must be mirrored off useIsRTL(), while interpolating start needs no mirroring.
Slides visible per view; fractional values peek the next slide
gap
number
16 / sidePadding
Gap between adjacent slides in pixels; defaults to sidePadding when that is provided
sidePadding
number
0
Engine-owned breathing room at both ends of the strip; edge slides rest inset by it and overlaid nav buttons keep their inset relative to the padded slide area
align
'start' | 'center' | 'end'
'start'
Alignment of the selected slide within the viewport
type
'in-place' | 'modal' | 'miniatures'
'in-place'
Where the navigation buttons sit
defaultIndex
number
0
Snap index the carousel starts on
autoPlay
boolean
false
Advance automatically; wraps to the first snap point at the end
autoPlayInterval
number
4000
Interval between autoplay advances in milliseconds
stopAutoPlayOnInteraction
boolean
true
Stop autoplay permanently on the first user interaction
className
string
-
Additional CSS classes for the root container
onSelectedIndexChange
(index: number) => void
-
Fires when the selected snap index changes. Navigation presses commit immediately; a swipe commits as soon as it crosses the halfway point between two snap points
animation
'disable-all' | undefined
-
'disable-all' disables all animations including children; undefined uses default animations
...ViewProps
ViewProps
-
All standard React Native View props are supported
The engine owns horizontal, snapToOffsets, onScroll, contentOffset, data, renderItem, keyExtractor, getItemLayout, and contentContainerClassName; style the slide row through className / classNames.content instead. CellRendererComponent is reserved by Reanimated's animated FlatList.
prop
type
default
description
children
React.ReactNode
-
Carousel.Item children, one per slide
className
string
-
Additional CSS classes for the slide row
classNames
ElementSlots<CarouselContentSlots>
-
Additional CSS classes for individual slots
styles
Partial<Record<CarouselContentSlots, ViewStyle>>
-
Inline styles for individual slots
...FlatListProps
FlatListProps<ReactNode>
-
Remaining FlatList props are forwarded to the strip
One default dot (see animated property notes below)
The dot slot animates width and backgroundColor, interpolated from root progress. These properties cannot be overridden via className; use the animation prop to customize, or isAnimatedStyleActive={false} to remove them entirely.
The strip owns horizontal, data, renderItem, keyExtractor, onScrollToIndexFailed, and contentContainerClassName; style the content row through classNames.content instead. Auto-scrolls the selected thumbnail toward its center.
Pressable thumbnail (see animated property notes below)
image
Default image element
ring
Selection ring overlay (see animated property notes below)
The container slot animates transform (scale) for press feedback and the ring slot animates opacity for the selection transition. These properties cannot be overridden via className; use the animation prop to customize, or isAnimatedStyleActive={false} to remove them entirely.
Alignment of the selected slide within the viewport
gap
number
Gap between adjacent slides in pixels
sidePadding
number
Breathing room at both ends of the slide strip in pixels
itemsPerView
number
Number of slides visible per view
itemWidth
number
Computed slide width in pixels (0 until the viewport is measured)
viewportWidth
number
Measured width of the slide viewport (0 until measured)
viewportHeight
number
Measured height of the slide viewport (0 until measured)
selectedIndex
number
Currently selected snap index. Navigation presses commit immediately; a swipe commits at the halfway point
snapCount
number
Number of distinct snap points
canScrollPrev
boolean
Whether a previous snap point exists
canScrollNext
boolean
Whether a next snap point exists
scrollTo
(index: number, animated?: boolean) => void
Scroll to the given snap index
scrollPrev
() => void
Scroll to the previous snap point
scrollNext
() => void
Scroll to the next snap point
scrollX
SharedValue<number>
Physical scroll offset of the strip in pixels. Grows toward the physical end regardless of RTL
progress
SharedValue<number>
Continuous snap-index progress (0 to snapCount - 1), interpolating while the strip is dragged. Logical in both layout directions; mirror physical translateX interpolations off useIsRTL()