🚧 True Sheet 4.0 beta rewrites the layout engine. npx expo install @lodev09/react-native-true-sheet@beta Migration guide
Reference

Types

True Native Bottom Sheet type reference.

SheetDetent

<TrueSheet detents={['auto', 0.8, 1]}>
  <View />
</TrueSheet>
ValueDescription🍎🤖🌐
"auto"Auto resize based on content height.16+
"peek"Collapsed height based on the combined header and absolute footer heights, plus the content up to the bottom of a TrueSheetPeek component rendered within it. Falls back to a fixed height of 150 when none is provided.16+
numberFractional height (0-1) representing percentage of screen height.

The "auto" detent derives the sheet height from the content's natural height. With scrolling content, it sizes to the scroll view's content height and resizes as content grows or shrinks. See Scrolling Content.

BackgroundBlur

Blur style that is mapped into native values in iOS.

<TrueSheet backgroundBlur="dark">
  <View />
</TrueSheet>
Value
"light"
"dark"
"default"
"extra-light"
"regular"
"prominent"
"system-ultra-thin-material"
"system-thin-material"
"system-material"
"system-thick-material"
"system-chrome-material"
"system-ultra-thin-material-light"
"system-thin-material-light"
"system-material-light"
"system-thick-material-light"
"system-chrome-material-light"
"system-ultra-thin-material-dark"
"system-thin-material-dark"
"system-material-dark"
"system-thick-material-dark"
"system-chrome-material-dark"

BlurOptions

Options for customizing the blur effect. Only applies when backgroundBlur is set.

<TrueSheet
  backgroundBlur="dark"
  blurOptions={{
    intensity: 80,
    interaction: false,
  }}
>
  <View />
</TrueSheet>
PropertyTypeDescriptionDefault
intensitynumberThe intensity of the blur effect (0-100).system default
interactionbooleanEnables or disables user interaction on the blur view. Disabling can help with visual artifacts on iOS 18+.true

ScrollableOptions

Options for customizing scrollable behavior. Applies to the scrollable provided via scrollableRef.

<TrueSheet
  scrollableRef={scrollableRef}
  scrollableOptions={{
    scrollingExpandsSheet: false,
  }}
>
  <ScrollView ref={scrollableRef}>
    <View />
  </ScrollView>
</TrueSheet>
PropertyTypeDescriptionDefault
contentInsetAdjustmentContentInsetAdjustmentWhat the sheet insets the bottom of the scroll content for: the bottom safe-area inset while the content can scroll, and/or the height of an absolute footer floating over it (which then counts toward the auto detent). See Bottom Safe-Area Inset and Footer Inset.'automatic'
scrollingExpandsSheetbooleanWhen false, scrolling the content does not expand the sheet to the next detent. Only dragging the grabber or sheet background expands it. Useful for YouTube-style comments sheets.true
keyboardScrollOffsetnumberAdditional offset when scrolling to a focused input above the keyboard.0
keyboardOffsetnumberAdjusts the bottom inset applied to the scrollable when the keyboard is shown. Negative values reduce it — pass -insets.bottom to cancel out safe-area padding already included in the content's paddingBottom.0
topScrollEdgeEffectScrollEdgeEffectThe scroll edge effect applied to the top edge of the scroll view and header. iOS 26+ only.'hidden'
bottomScrollEdgeEffectScrollEdgeEffectThe scroll edge effect applied to the bottom edge of the scroll view and footer. iOS 26+ only.'hidden'

HeaderOptions

Options for customizing header behavior.

<TrueSheet
  header={<Header />}
  headerOptions={{
    position: 'absolute',
  }}
>
  {/* ... */}
</TrueSheet>
PropertyTypeDescriptionDefault
position'relative' | 'absolute'How the header participates in the sheet layout. 'relative' takes up space above the content and is included in the auto detent height. 'absolute' floats over the content, pinned to the top edge, and is excluded from the auto detent height.'relative'

FooterOptions

Options for customizing footer behavior.

<TrueSheet
  footer={<Footer />}
  footerOptions={{
    position: 'absolute',
    keyboardOffset: -16,
  }}
>
  {/* ... */}
</TrueSheet>
PropertyTypeDescriptionDefault
position'relative' | 'absolute'How the footer participates in the sheet layout. 'relative' takes up space below the content, pinned to the bottom edge — included in the auto detent height but excluded from the peek detent height (it's pushed off-screen at peek). 'absolute' floats over the content, pinned to the bottom edge — excluded from the auto detent height but included in the peek detent height.'relative'
keyboardOffsetnumberAdjusts how far an absolute footer rises when the keyboard opens. Positive values raise it higher; negative values tuck the footer's own bottom padding behind the keyboard instead of leaving a gap. The built-in safe-area inset is skipped automatically while the keyboard is open. A relative footer stays in the layout flow behind the keyboard, so this has no effect.0
avoidKeyboardbooleanWhether an absolute footer rises above the keyboard. Set to false to keep it at the bottom edge of the sheet. With footer inset adjustment enabled, any footer portion above the keyboard still adds scroll padding and contributes to the expanded auto height. The pinned footer keeps its safe-area padding and ignores keyboardOffset. No effect on relative footers. Native only.true

ContentInsetAdjustment

What the sheet insets the bottom of a plugged scrollable's content for. Set via ScrollableOptions.

ValueDescription
'automatic'The bottom safe-area inset while the content can scroll, plus the height of an absolute footer floating over the scroll view — the footer then counts toward the auto detent. This is the default.
'safe-area'The safe-area inset only — content scrolls under an absolute footer.
'footer'The absolute footer only — you pad for the safe area.
'never'No inset — you pad the content yourself.

The safe-area inset only applies while the sheet's insetAdjustment is 'automatic'; a relative footer absorbs it instead. The footer inset is independent of insetAdjustment — only the part of the footer overlapping the scroll view is applied, and it stacks with the keyboard inset. See Scrolling Content.

ScrollEdgeEffect

Controls the blur/gradient edge effect on the scroll view edges and header/footer overlay views. iOS 26+ only.

ValueDescription
'automatic'System default edge effect style.
'hard'A hard, opaque edge effect.
'soft'A soft, gradient edge effect.
'hidden'No edge effect. This is the default.

GrabberOptions

Options for customizing the grabber (drag handle) appearance.

<TrueSheet
  grabber
  grabberOptions={{
    width: 48,
    height: 6,
    topMargin: 10,
    cornerRadius: 3,
    color: '#FF0000',
    adaptive: false,
  }}
>
  <View />
</TrueSheet>
PropertyTypeDescriptionDefault
widthnumberThe width of the grabber pill.iOS: 36, Android: 32
heightnumberThe height of the grabber pill.iOS: 5, Android: 4
topMarginnumberThe top margin from the sheet edge.iOS: 5, Android: 16
cornerRadiusnumberThe corner radius of the grabber pill.height / 2
colorColorValueThe color of the grabber. Uses native styling when not provided.
adaptivebooleanWhether the grabber adapts to light/dark mode. Uses vibrancy on iOS and theme-based colors on Android.true

AccessibilityOptions

Options for customizing (e.g. localizing) the accessibility strings announced by screen readers.

<TrueSheet
  accessibilityOptions={{
    grabberLabel: 'Poignée de déplacement',
    expandedValue: 'Développé',
    collapsedValue: 'Réduit',
    detentValue: 'Position {index} sur {count}',
  }}
>
  <View />
</TrueSheet>
PropertyTypeDescriptionDefault
grabberLabelstringThe accessibility label of the grabber.iOS: 'Sheet Grabber', Android: 'Drag handle'
grabberHintstringThe accessibility hint of the grabber. iOS only.'Double-tap to expand. Swipe up or down to resize the sheet'
expandedValuestringThe value announced when the sheet is at the last detent.'Expanded'
collapsedValuestringThe value announced when the sheet is at the first detent.'Collapsed'
detentValuestringThe value announced at intermediate detents. Supports {index} and {count} placeholders.'Detent {index} of {count}'
expandActionLabelstringThe label of the expand accessibility action. Android only.'Expand'
collapseActionLabelstringThe label of the collapse accessibility action. Android only.'Collapse'
paneTitlestringThe title announced when the sheet appears. Sets the accessibility pane title on Android and the hidden dialog title on Web.Android: 'Bottom sheet', Web: 'Sheet'

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.

InsetAdjustment

Controls how the bottom safe area inset affects detent heights.

<TrueSheet insetAdjustment="never">
  <View />
</TrueSheet>
ValueDescription
"automatic"System handles insets automatically. This is the default behavior.
"never"TrueSheet will keep the layout as-is for precise sizing.

DetentInfoEventPayload

Object that comes with most sheet events.

{
  index: 1,
  position: 123.5,
  detent: 0.5
}
PropertyTypeDescription
indexnumberThe detent index from the provided detents. See detents prop.
positionnumberThe Y position of the sheet relative to the screen.
detentnumberThe detent value (0-1) for the current index.

PositionChangeEventPayload

Object that comes with the onPositionChange event. Extends DetentInfoEventPayload.

{
  index: 1.5,
  position: 123.5,
  detent: 0.5,
  realtime: true
}
PropertyTypeDescription
indexnumberThe interpolated detent index. Continuous value that smoothly transitions between detents (e.g., 0.5 means halfway between detent 0 and 1).
positionnumberThe Y position of the sheet relative to the screen.
detentnumberThe detent value (0-1) for the nearest detent index.
realtimebooleanWhether the position is a real-time value (e.g., during drag or animation tracking). When false, position should be animated in JS.
Edit on GitHub

On this page