@shaquillehinds/smooth-modal v1.23.0
A Simple React Native Bottom Sheet That Just Works.
Works The Same On IOS & Android
P.S There are other components in this package such as:
SmoothBottomModalSmoothBottomSheetSmoothBottomFlatlistSmoothBottomScrollViewSmoothNotificationProvideruseSmoothNotification
The documentation here only covers SmoothBottomModal and SmoothBottomSheet.
SmoothBottomModal & SmoothBottomSheet Documentation
The SmoothBottomModal & SmoothBottomSheet is a customizable, flexible bottom sheet component for React Native, supporting keyboard avoidance, drag behavior, and more.
UnlikeSmoothBottomModal,SmoothBottomSheet doesn't have a backdrop component, can optionally stay mounted when "close" is called and it can't use React Native's default Modal for rendering a new root view overlay.
Required Peer Dependencies
"react-native-gesture-handler": ">=2.7.0",
"react-native-reanimated": ">=3.0.0"Installation
NPM
npm install @shaquillehinds/smooth-modalYarn
yarn add @shaquillehinds/smooth-modalBasic Usage
import { SmoothBottomModal } from '@shaquillehinds/smooth-modal';const [showModal, setShowModal] = useState(false);
<SmoothBottomModal showModal={showModal} setShowModal={setShowModal}>
{/* Modal Content */}
</SmoothBottomModal>;OR
const ref = useRef<BottomSheetModalController>(null);
<SmoothBottomModal ref={ref}>{/* Modal Content */}</SmoothBottomModal>;Props
Core Props
Use Either ref or showModal, avoid using both as it can lead to unpredictable behavoir.
| Prop | Type | Description |
|---|---|---|
| ref | React.Ref<BottomSheetModalController> | Controls the modal's open, close and snap movements. |
| showModal | boolean | Controls whether the modal is visible. |
| setShowModal | React.Dispatch<React.SetStateAction<boolean>> | Function to update the visibility of the modal. |
Drag Behavior
| Prop | Type | Description |
|---|---|---|
| snapPoints | (string\|number)[] | Defines points based on a percentage of the screen's height that the modal can snap to. Example [25, "50", "75%"] |
| dragArea | 'full' \| 'bumper' \| 'none' | Defines which part of the modal is draggable. Default: "bumper" |
| allowDragWhileKeyboardVisible | boolean | Allow dragging the modal even when the keyboard is visible. By default, dragging is disabled while the keyboard is open. |
| hideBumper | boolean | Hides the default bumper (drag handle) from the modal. |
| BumperComponent | () => React.ReactNode | Provide a custom draggable bumper component, replacing the default bumper. |
Keyboard Handling
| Prop | Type | Description |
|---|---|---|
| avoidKeyboard | boolean | Automatically adds bottom padding to prevent the keyboard from overlapping content. |
| inputsForKeyboardToAvoid | React.RefObject<TextInput>[] | Specify input refs to selectively trigger keyboard avoidance padding when focused. |
Mounting Behavior
| Prop | Type | Description |
|---|---|---|
| keepMounted (SmoothBottomSheet Only) | boolean | Prevents the modal from fully unmounting when closed. Useful with bottomOffset to keep the modal slightly visible when closed. |
| bottomOffset | number | Pushes the modal slightly up from the bottom when closed. Works best with keepMounted. |
| onModalShow | () => Promise<void> \| void | Function to run when the modal is shown (mounted). |
| onModalClose | () => Promise<void> \| void | Function to run when the modal is closed (unmounted). |
| disableAndroidBackButton | boolean | Only valid when using 'useNativeModal' prop. Stops modal from closing when the hardware back button is pressed on android. |
Overlay Behavior
| Prop | Type | Description |
|---|---|---|
| enableBackgroundContentPress | boolean | If true and there's no backdrop component, the background content that's below the modal will be touchable. Is always true on SmoothBottomSheet. |
| useNativeModal (SmoothBottomModal Only) | boolean | If true, uses React Native's default modal to render a new root view to render them modal. Useful if you need the modal to be absolute on top of navigation and other content. |
Content Delay
| Prop | Type | Description |
|---|---|---|
| showContentDelay | { type?: 'mount' \| 'opacity'; timeInMilliSecs: number } | Delay content rendering for performance optimization. - "opacity": Delays showing the content with opacity transition. (Default) - "mount": Mounts the content after a delay. |
When using type: "mount", set an explicit height or minHeight in contentContainerStyle to avoid layout shifts. |
Styling
| Prop | Type | Description |
|---|---|---|
| style | StyleProp<ViewStyle> | Styles the modal sheet itself. |
| contentContainerStyle | StyleProp<ViewStyle> | Styles the modal’s internal content container. |
| bumperStyle | StyleProp<ViewStyle> | Styles the bumper (drag handle) itself. |
| bumperContainerStyle | StyleProp<ViewStyle> | Styles the container around the bumper. |
| backgroundColor | string | Sets the background color of the modal and bumper container. |
Backdrop (SmoothBottomModal Only)
| Prop | Type | Description |
|---|---|---|
| BackdropComponent | React.ReactNode | Provide a custom backdrop component instead of the default BlurView. |
| disableCloseOnBackdropPress | boolean | If true, tapping on the backdrop will not close the modal. |
| blurBackdrop | 'ios' \| 'android' \| true | Uses expo blur view as the modal backdrop to blur content underneath the modal. |
| disableBlurWarning | boolean | Disables the Android warning for using blur view. |
Tips
- Use
keepMounted+bottomOffsetonSmoothBottomSheetif you want the modal to stay slightly "peeking" when not fully open. This won't work on SmoothBottomModal only SmoothBottomSheet. - Set a
minHeighton thecontentContainerStyleif usingshowContentDelay.type: 'mount'to avoid abrupt height changes. - Use
inputsForKeyboardToAvoidfor finer control of when padding should be added for the keyboard. - Provide a custom
BackdropComponentif you want to personalize the modal background or add animations.
Examples
Modal with Keyboard Avoidance
const [showModal, setShowModal] = useState(false);
const inputRef = useRef<TextInput>(null);
<SmoothBottomModal
showModal={showModal}
setShowModal={setShowModal}
avoidKeyboard
inputsForKeyboardToAvoid={[inputRef]}
>
<TextInput ref={inputRef} placeholder="Type here" />
</SmoothBottomModal>;Draggable Modal With ScrollView Or Flatlist
If you need the modal to be draggable when scrollable content is at the beginning (scroll offset at 0).
import {
SmoothBottomModal,
SmoothBottomScrollView,
} from '@shaquillehinds/smooth-modal';const [showModal, setShowModal] = useState(false);
<SmoothBottomModal showModal={showModal} setShowModal={setShowModal}>
<SmoothBottomScrollView>{/* ScrollView Content */}</SmoothBottomScrollView>
</SmoothBottomModal>;9 months ago
9 months ago
9 months ago
9 months ago
9 months ago
9 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago