Configuration
True Native Bottom Sheet configuration props.
Configuration props available for TrueSheet. Extends ViewProps.
<TrueSheet
ref={sheet}
detents={['auto', 0.8, 1]}
backgroundColor="#696969"
// ...
>
<View />
</TrueSheet>ref
We use ref to reference our sheet and call the imperative methods. Learn more about refs here.
detents
Array of detents you want the sheet to support. See this guide for example.
| Type | Default | π | π€ | π |
|---|---|---|---|---|
SheetDetent[] | [0.5, 1] | β | β | β |
A sheet can only support up to 3 detents only! AKA collapsed, half-expanded, and expanded.
It's recommended to sort detents from smallest to largest.
name
The name to reference this sheet. It has to be unique. You can then present this sheet globally using its name. See this guide for example.
| Type | Default | π | π€ | π |
|---|---|---|---|---|
string | β | β | β |
backgroundColor
The sheet's background color. Uses the system default when not provided.
| Type | Default | π | π€ | π |
|---|---|---|---|---|
ColorValue | system default | β | β | β |
Without a color or blur, iOS 26+ uses Liquid Glass, while earlier iOS versions use system-material blur. Android and Web use Material Design 3's colorSurfaceContainerLow, which adapts to light/dark mode.
On supported iOS 26.1+ devices, backgroundColor uses a native color effect. It does not tint Liquid Glass. Other devices paint the background color.
On iOS, backgroundBlur takes precedence over backgroundColor. Use backgroundStyle.backgroundColor to tint glass or blur, or for an exact opaque color over full-screen modals.
detentBackgrounds
Backgrounds matched to detents by index. Each entry is a color string or an object with either color or blur.
A string such as "#18202b" is shorthand for { color: "#18202b" }.
null, undefined, and missing entries inherit backgroundColor/backgroundBlur.
An entry replaces the sheet background, so a color entry overrides the sheet blur.
| Type | Default | π | π€ | π |
|---|---|---|---|---|
(DetentBackground | null)[] | β | β | β |
<TrueSheet
detents={['peek', 'auto', 1]}
detentBackgrounds={[null, { blur: 'system-material' }, '#18202b']}
/>| Platform | Transition | Blur entries |
|---|---|---|
| iOS 26.1+ with native effect support | UIKit transitions as the sheet moves | Native blur effect |
| Other iOS devices | Cross-fade after passing the midpoint between detents | Blur view at system intensity |
| Android and Web | Color cross-fade after passing the midpoint between detents | Inherit the sheet background |
The midpoint rule applies in both directions, including resize().
Presentation starts with the entry at the presented index.
background and backgroundStyle remain above these effects and apply across all detents.
An opaque background wrapper hides the detent backgrounds.
See per-detent backgrounds for Liquid Glass limitations.
background
A custom background behind the header, content, and footer. Accepts a ReactNode.
The wrapper fills the sheet, sits above the sheet background effects, and ignores touches.
It does not affect content height or detent calculations.
| Type | Default | π | π€ | π |
|---|---|---|---|---|
ReactNode | β | β | β |
Size the element to fill the wrapper:
<TrueSheet background={<View style={[StyleSheet.absoluteFill, { backgroundColor: '#18202b' }]} />}>
<Text>Sheet content</Text>
</TrueSheet>For a custom blur, see the Backgrounds guide.
backgroundStyle
Style for the background wrapper. Only backgroundColor is supported.
The style works without a background element and applies across all detents.
| Type | Default | π | π€ | π |
|---|---|---|---|---|
StyleProp<Pick<ViewStyle, 'backgroundColor'>> | β | β | β |
Use an opaque color for an exact background color, including over full-screen modals. Use a translucent color to tint the glass or blur:
<TrueSheet
backgroundBlur="system-material"
backgroundStyle={{ backgroundColor: 'rgba(0, 122, 255, 0.25)' }}
>
<Text>Sheet content</Text>
</TrueSheet>backgroundBlur
The blur effect style on iOS, such as "light", "dark", or "system-material". It takes precedence over backgroundColor.
Use backgroundStyle.backgroundColor to tint the blur.
| Type | Default | π | π€ | π |
|---|---|---|---|---|
BackgroundBlur | β |
On supported iOS 26.1+ devices, this uses a native effect that replaces Liquid Glass.
Earlier iOS versions and devices without the setters use a non-interactive blur view at system intensity.
Design compatibility mode on iOS 26 also uses this fallback.
On iOS 27+, UIDesignRequiresCompatibility is ignored.
On iOS 26.0, this blur sits above Liquid Glass.
For custom intensity or blur on other platforms, use a third-party blur in background.
cornerRadius
The sheet corner radius.
| Type | Default | π | π€ | π |
|---|---|---|---|---|
number | system default | β | β | β |
When not provided, iOS uses the device's native corner radius automatically, while Android defaults to 16 (following Material Design 3 guidelines).
elevation
The elevation (shadow depth) of the sheet.
| Type | Default | π | π€ | π |
|---|---|---|---|---|
number | 4 | β | β |
maxContentHeight
The absolute maximum height of the sheet content, regardless of detents.
| Type | Default | π | π€ | π |
|---|---|---|---|---|
number | β | β | β |
maxContentWidth
The maximum width of the sheet content.
| Type | Default | π | π€ | π |
|---|---|---|---|---|
number | β | β | β |
On Android and Web, the sheet defaults to a maximum width of 640dp. Setting this prop overrides that default. On iOS, the sheet uses the system default width.
This prop is ignored on phones in portrait orientation β the sheet always spans the full width.
placement
Horizontal placement of the sheet. 'leading' and 'trailing' follow the layout direction (left/right in LTR, right/left in RTL).
| Type | Default | π | π€ | π |
|---|---|---|---|---|
'automatic' | 'leading' | 'center' | 'trailing' | 'automatic' | β | β | β |
'automatic' lets the system decide. It only differs from 'center' on iOS 27+, where both map to UISheetPresentationController's native preferredPlacement. On Android, Web, and iOS 26 and below, 'automatic' and 'center' both center the sheet.
On iOS 26 and below, edge placement uses sourceView. System-defined margins prevent fully flush edge attachment.
This prop is ignored on phones in portrait orientation.
placementOffset
The offset from the screen edge. Only applies when placement is 'leading' or 'trailing'.
| Type | Default | π | π€ | π |
|---|---|---|---|---|
number | 16 | β | β |
dismissible
If set to false, the sheet will prevent interactive dismissal via dragging or clicking outside of it.
| Type | Default | π | π€ | π |
|---|---|---|---|---|
boolean | true | β | β | β |
Blocked attempts fire onDismissAttempt. Use it to confirm before dismissing programmatically, e.g. when a form has unsaved changes.
dismissThreshold
How far the sheet must be swiped down from its lowest detent to dismiss. The default 'half' matches iOS. Use 'short' for Compose Material3's ModalBottomSheet feel.
| Type | Default | π | π€ | π |
|---|---|---|---|---|
DismissThreshold | 'half' | β | β |
draggable
If set to false, the sheet will disable dragging to resize. The sheet can only be resized programmatically using the resize method.
| Type | Default | π | π€ | π |
|---|---|---|---|---|
boolean | true | β | β | β |
When draggable is false, the grabber is automatically hidden.
On iOS 26+, draggable={false} doesn't turn off Liquid Glass's touch response: the sheet still stretches slightly and follows the finger while a touch moves over it (e.g. a slider inside the sheet). Set backgroundColor to replace the glass with a native color effect on iOS 26.1+, which doesn't react to touches.
dimmed
Specify whether the sheet background is dimmed. Set to false to allow interaction with the background components.
| Type | Default | π | π€ | π |
|---|---|---|---|---|
boolean | true | β | β | β |
dimColor
The color of the dim behind the sheet.
| Type | Default | π | π€ | π |
|---|---|---|---|---|
ColorValue | "black" | β | β | β |
This is ignored if dimmed is set to false.
dimOpacity
The opacity of the dim behind the sheet, from 0 to 1.
| Type | Default | π | π€ | π |
|---|---|---|---|---|
number | 0.5 | β | β | β |
This is ignored if dimmed is set to false.
At 0, the dim is invisible but still blocks touches to the background. Set dimmed to false to allow interaction instead.
On iOS, setting dimColor or dimOpacity replaces the system dim with a custom dim layer. Stacked sheets each add their own layer, so the background gets darker with every sheet.
dimmedDetentIndex
The detent index that the sheet should start to dim the background.
| Type | Default | π | π€ | π |
|---|---|---|---|---|
number | 0 | β | β | β |
This is ignored if dimmed is set to false.
initialDetentIndex
Initially present the sheet, after mounting, at a given detent index.
| Type | Default | π | π€ | π |
|---|---|---|---|---|
number | -1 | β | β | β |
initialDetentAnimated
Specify whether the sheet should animate after mounting.
Used with initialDetentIndex.
| Type | Default | π | π€ | π |
|---|---|---|---|---|
boolean | true | β | β | β |
lazy
Specify whether the sheet content should mount lazily, on first presentation. Set to false to mount the content before presentation without presenting the sheet. Use this when content is not ready on the first render, then call present() after your readiness signal so auto detents measure the settled content.
| Type | Default | π | π€ | π |
|---|---|---|---|---|
boolean | true | β | β |
Content that requires window attachment to measure, such as SwiftUI-hosted views, still only measures during presentation.
grabber
Shows a native grabber (or drag handle) on the sheet.
| Type | Default | π | π€ | π |
|---|---|---|---|---|
boolean | true | β | β | β |
iOS uses the native UISheetPresentationController grabber by default, while Android renders a native view following Material Design 3 specifications (32x4dp, centered, with the standard drag handle color).
When grabberOptions is provided, iOS uses a custom grabber view instead of the system default.
grabberOptions
Options for customizing the grabber appearance. Only applies when grabber is true.
| Type | Default | π | π€ | π |
|---|---|---|---|---|
GrabberOptions | β | β |
<TrueSheet
grabber
grabberOptions={{
width: 48,
height: 6,
topMargin: 10,
color: '#FF0000',
}}
>
<View />
</TrueSheet>On iOS, when grabberOptions is not provided, the native system grabber is used. When any option is provided, a custom grabber view with vibrancy effect is rendered instead.
accessibilityOptions
Options for customizing (e.g. localizing) the accessibility strings announced by screen readers.
| Type | Default | π | π€ | π |
|---|---|---|---|---|
AccessibilityOptions | β | β | β |
<TrueSheet
accessibilityOptions={{
grabberLabel: 'PoignΓ©e de dΓ©placement',
expandedValue: 'DΓ©veloppΓ©',
collapsedValue: 'RΓ©duit',
}}
>
<View />
</TrueSheet>On iOS, the grabber strings only apply when grabberOptions is provided. Without it, iOS uses the system grabber which is already localized by the system.
header
A component that is fixed at the top of the sheet content. Useful for search bars, titles, or other header content. The header height is automatically accounted for in layout calculations. Accepts a functional Component or ReactElement. See this guide for example.
| Type | Default | π | π€ | π |
|---|---|---|---|---|
ComponentType<...> | ReactElement | β | β | β |
headerStyle
Style for the header container.
| Type | Default | π | π€ | π |
|---|---|---|---|---|
StyleProp<ViewStyle> | β | β | β |
headerOptions
Options for customizing header behavior.
| Type | Default | π | π€ | π |
|---|---|---|---|---|
HeaderOptions | β | β | β |
footer
A component that is pinned at the bottom of the sheet. The footer height is automatically accounted for in layout calculations. Accepts a functional Component or ReactElement. See this guide for example.
| Type | Default | π | π€ | π |
|---|---|---|---|---|
ComponentType<...> | ReactElement | β | β | β |
footerStyle
Style for the footer container.
| Type | Default | π | π€ | π |
|---|---|---|---|---|
StyleProp<ViewStyle> | β | β | β |
footerOptions
Options for customizing footer behavior.
| Type | Default | π | π€ | π |
|---|---|---|---|---|
FooterOptions | β | β | β |
scrollableRef
A ref to the scrollable component (e.g. ScrollView, FlatList) rendered within the sheet content. Required for scrollable handling β nested scrolling, keyboard insets, and auto detent sizing are wired to this scrollable. See this guide for more information.
| Type | Default | π | π€ | π |
|---|---|---|---|---|
RefObject<Component> | β | β | β |
scrollableOptions
Options for customizing scrollable behavior. Applies to the scrollable provided via scrollableRef. See this guide for more information.
| Type | Default | π | π€ | π |
|---|---|---|---|---|
ScrollableOptions | β | β | β |
presentation
Controls the sheet presentation style on iPad and web (landscape/tablet).
'page': bottom-attached page sheet (full or readable width).'form': centered floating form sheet (default form-sheet width).
'form' is absolute β maxContentWidth is ignored when set.
| Type | Default | π | π€ | π |
|---|---|---|---|---|
'page' | 'form' | 'page' | 17+ | β |
insetAdjustment
Controls how the bottom safe area inset affects detent heights.
| Type | Default | π | π€ | π |
|---|---|---|---|---|
InsetAdjustment | "automatic" | β | β |
detached
Renders the sheet as a detached floating card, not attached to the bottom edge.
| Type | Default | π | π€ | π |
|---|---|---|---|---|
boolean | false | β |
detachedOffset
The offset from the bottom edge when detached is enabled.
| Type | Default | π | π€ | π |
|---|---|---|---|---|
number | 16 | β |
style
The sheet's content style override.
Content lays out naturally by default β like a regular view or a screen. Pass flex: 1 to fill the sheet's visible height per detent.
| Type | Default | π | π€ | π |
|---|---|---|---|---|
StyleProp<ViewStyle> | β | β | β |