A stack manager for bottom sheets and modals in React Native. Supports push, switch, and replace navigation modes, iOS-style scale animations, and React context preservation. Works with any bottom sheet or modal library via a pluggable adapter architecture.
@gorhom/bottom-sheet, react-native-modal, react-native-actions-sheet, @swmansion/react-native-bottom-sheet, and a custom modal. You can also build your own.push, switch, and replace modes for managing multiple sheetsyarn add react-native-bottom-sheet-stack
yarn add react-native-reanimated react-native-safe-area-context react-native-teleport react-native-worklets zustand
Additionally, install the dependencies required by the adapter(s) you plan to use (e.g. @gorhom/bottom-sheet and react-native-gesture-handler for GorhomSheetAdapter).
@gorhom/bottom-sheet)import { forwardRef } from 'react';
import { View, Text, Button } from 'react-native';
import { BottomSheetView } from '@gorhom/bottom-sheet';
import {
BottomSheetManagerProvider,
BottomSheetHost,
BottomSheetScaleView,
useBottomSheetManager,
useBottomSheetContext,
} from 'react-native-bottom-sheet-stack';
import { GorhomSheetAdapter } from 'react-native-bottom-sheet-stack/gorhom';
// 1. Define a bottom sheet component
const MySheet = forwardRef((props, ref) => {
const { close } = useBottomSheetContext();
return (
<GorhomSheetAdapter ref={ref} snapPoints={['50%']}>
<BottomSheetView>
<View style={{ padding: 20 }}>
<Text>Hello from Bottom Sheet!</Text>
<Button title="Close" onPress={close} />
</View>
</BottomSheetView>
</GorhomSheetAdapter>
);
});
// 2. Setup provider and host
function App() {
return (
<BottomSheetManagerProvider id="default">
<BottomSheetScaleView>
<YourAppContent />
</BottomSheetScaleView>
<BottomSheetHost />
</BottomSheetManagerProvider>
);
}
// 3. Open bottom sheets from anywhere
function YourAppContent() {
const { open } = useBottomSheetManager();
return (
<Button
title="Open Sheet"
onPress={() => open(<MySheet />, { mode: 'push' })}
/>
);
}
| Adapter | Import | Wraps | Extra Peer Dependencies |
|---|---|---|---|
GorhomSheetAdapter |
react-native-bottom-sheet-stack/gorhom |
@gorhom/bottom-sheet |
@gorhom/bottom-sheet, react-native-gesture-handler |
CustomModalAdapter |
react-native-bottom-sheet-stack |
Custom animated modal | None |
ReactNativeModalAdapter |
react-native-bottom-sheet-stack/react-native-modal |
react-native-modal |
react-native-modal |
ActionsSheetAdapter |
react-native-bottom-sheet-stack/actions-sheet |
react-native-actions-sheet |
react-native-actions-sheet |
SwmansionSheetAdapter |
react-native-bottom-sheet-stack/swmansion |
@swmansion/react-native-bottom-sheet |
@swmansion/react-native-bottom-sheet (Fabric / New Architecture); react-native-keyboard-controller (optional, only for keyboardBehavior="inset") |
Adapters with 3rd-party dependencies are shipped as separate subpath exports so that importing the main package never triggers Metro resolution errors for uninstalled libraries. Each sheet in the stack can use a different adapter.
SwmansionSheetAdapter also adds a few opt-in conveniences over the bare native sheet (handle, fullHeight, fillContent, keyboardBehavior, cornerRadius) — see SwmansionSheetAdapter.
MIT
$ claude mcp add react-native-bottom-sheet-stack \
-- python -m otcore.mcp_server <graph>