This documentation is available as Markdown for AI agents and LLMs. See the full Markdown index or append .md to any documentation URL.

Carousel

Jetpack Compose Carousel components for displaying scrollable collections of items.

Android
Included in Expo Go
Recommended version:
~56.0.26

Expo UI provides three carousel components matching the official Jetpack Compose Carousel API: HorizontalCenteredHeroCarousel, HorizontalMultiBrowseCarousel, and HorizontalUncontainedCarousel.

Material 3 multi-browse carousel with a hero item and smaller peek itemsMaterial 3 multi-browse carousel with a hero item and smaller peek items

Installation

Terminal
- npx expo install @expo/ui
- yarn expo install @expo/ui
- pnpm expo install @expo/ui
- bun expo install @expo/ui

If you are installing this in an existing React Native app, make sure to install expo in your project.

Usage

HorizontalCenteredHeroCarousel

Centers one large hero item between two small peek items — ideal for spotlighting content like movie posters.

CenteredHeroExample.tsx
import { Host, HorizontalCenteredHeroCarousel, Box, Text } from '@expo/ui/jetpack-compose'; import { size, background } from '@expo/ui/jetpack-compose/modifiers'; export default function CenteredHeroExample() { const colors = ['#6200EE', '#03DAC5', '#FF5722', '#4CAF50', '#2196F3']; return ( <Host matchContents={{ vertical: true }} style={{ width: '100%' }}> <HorizontalCenteredHeroCarousel itemSpacing={8}> {colors.map((color, index) => ( <Box key={index} contentAlignment="center" modifiers={[size(300, 200), background(color)]}> <Text color="#FFFFFF">Slide {index + 1}</Text> </Box> ))} </HorizontalCenteredHeroCarousel> </Host> ); }

HorizontalMultiBrowseCarousel

Shows a large item alongside smaller peek items, letting users browse what comes next.

MultiBrowseExample.tsx
import { Host, HorizontalMultiBrowseCarousel, Box, Text } from '@expo/ui/jetpack-compose'; import { size, background } from '@expo/ui/jetpack-compose/modifiers'; export default function MultiBrowseExample() { const colors = ['#6200EE', '#03DAC5', '#FF5722', '#4CAF50', '#2196F3']; return ( <Host matchContents={{ vertical: true }} style={{ width: '100%' }}> <HorizontalMultiBrowseCarousel preferredItemWidth={200} itemSpacing={8} flingBehavior="singleAdvance"> {colors.map((color, index) => ( <Box key={index} contentAlignment="center" modifiers={[size(200, 180), background(color)]}> <Text color="#FFFFFF">Card {index + 1}</Text> </Box> ))} </HorizontalMultiBrowseCarousel> </Host> ); }

HorizontalUncontainedCarousel

Each item has a fixed width with free-form scrolling.

UncontainedExample.tsx
import { Host, HorizontalUncontainedCarousel, Box, Text } from '@expo/ui/jetpack-compose'; import { size, background } from '@expo/ui/jetpack-compose/modifiers'; export default function UncontainedExample() { const items = ['Photo 1', 'Photo 2', 'Photo 3', 'Photo 4', 'Photo 5']; return ( <Host matchContents={{ vertical: true }} style={{ width: '100%' }}> <HorizontalUncontainedCarousel itemWidth={160} itemSpacing={12} contentPadding={{ start: 16, top: 0, end: 16, bottom: 0 }}> {items.map(item => ( <Box key={item} contentAlignment="center" modifiers={[size(160, 180), background('#3F51B5')]}> <Text color="#FFFFFF">{item}</Text> </Box> ))} </HorizontalUncontainedCarousel> </Host> ); }

API

import { HorizontalCenteredHeroCarousel, HorizontalMultiBrowseCarousel, HorizontalUncontainedCarousel, } from '@expo/ui/jetpack-compose';

No API data file found, sorry!