npm @lodev09/react-native-true-sheet 4.0.0-beta.15
Release 4.0.0-beta.15

3 hours ago

🎉 New features

  • New TrueSheetOverlay component renders its children above every presented sheet — for toasts, dialogs, and other overlays. Replaces the FullWindowOverlay/Modal workaround. (#817 by @lodev09 and @SamuelBrucksch)
  • Added a JS-only lazy prop — set to false to mount sheet content before presentation, allowing auto detents to measure settled content before the sheet opens. (#792 by @maxlapides)
  • iOS: Smoother onPositionChange, and onWillDismiss now fires only when a drag-to-dismiss is committed. (#744, #756 by @lodev09)
  • The auto detent now works with plugged scrollables — the sheet sizes to the scrollable's content height. (#743 by @lodev09)
  • New headerOptions prop with a position option — set to 'absolute' to float the header over the content and exclude it from the auto detent height. (#747 by @lodev09)
  • The footer now absorbs the bottom safe-area inset as padding when insetAdjustment is automatic, except while the keyboard is open. (#749, #750 by @lodev09)
  • New scrollableOptions.keyboardOffset option to adjust the scrollable's keyboard bottom inset. (#785 by @lodev09)
  • The dev menu's element inspector now works inside a presented sheet — header, content, and footer are all inspectable. (#832 by @lodev09)
  • New onDismissAttempt event fires when the user tries to dismiss a sheet with dismissible set to false — confirm unsaved changes, then call dismiss(). (#833 by @lodev09)
  • Added footerOptions.avoidKeyboard on iOS and Android. Set it to false to keep absolute footers behind the keyboard while preserving space for any uncovered portion. (#849 by @lodev09)

🐛 Bug fixes

  • iOS: Unmounting a sheet mid-dismissal and mounting a new one no longer leaks the old sheet's onDidDismiss into the new mount or blocks its auto-present. (#818 by @lodev09)
  • iOS: Fractional detents now resolve against the app's window instead of the full screen, fixing full-height sheets in windowed iPad apps (Stage Manager, iPadOS 26 windowing), and re-resolve when the window is resized or rotated. (#815 by @vilindberg and @lodev09)
  • iOS: VoiceOver users can now dismiss the sheet with the two-finger Z gesture, and the grabber is announced as the sheet's first element so it can be resized or dismissed with swipe gestures. A sheet with a custom grabber no longer expands to the next detent on its own when presented under VoiceOver. (#828, #830 by @lodev09)
  • Android: A stacked parent sheet now follows its child frame-by-frame when the child resizes, and no longer gets stuck at stale detents after a half-expanded settle. (#797 by @lodev09)
  • Android: The scrollable content now tracks the keyboard frame-by-frame — the focused input rides the keyboard up smoothly, and the scroll position eases back on dismiss instead of snapping. (#798 by @lodev09)
  • Android: The library now builds on Android Gradle Plugin 9, which ships built-in Kotlin — the explicit Kotlin plugin is skipped when AGP already provides it. (#819 by @gabrieldonadel)
  • Android: Dragging a sheet down while the keyboard is open now matches iOS — the sheet follows down to its first detent and dismisses the keyboard, dragging further hides a dismissible sheet or fires onDismissAttempt, and an absolute footer rides with the sheet. Stacked parents no longer shift while a child adjusts for the keyboard. (#834 by @lodev09)
  • Android: Short scroll content can now scroll to the bottom while the keyboard is open. (#835 by @lodev09)
  • Android: Fix grabber tap resizing and the footer jumping during sheet transitions. (#850 by @lodev09)
  • Android: Fix scrolling after rotation, including ScrollViews without scrollableRef. (#852 by @lodev09)
  • Web: Stacked sheets now behave like native — a press inside a child no longer dismisses the sheets beneath it, dismissing a parent takes its children, the peek detent tracks content changes, and parents slide behind their child (staying put at full height) all the way up the stack. (#824 by @lodev09)
  • The keyboard-driven scroll inset now accounts for a floating footer's height. (#752 by @lodev09)
  • The peek detent no longer collapses when swapping between two screens that each render a peek component — the last-mounted peek wins. (#851 by @SamuelBrucksch and @lodev09)

💥 Breaking changes

  • iOS: backgroundColor now paints over the Liquid Glass background instead of replacing it, so translucent colors tint the glass — set the new glass prop to false to restore the flat background. (#845 by @lodev09)
  • The footer now lays out relative by default, taking up space below the content — set footerOptions.position to 'absolute' to restore the previous floating behavior. (#748, #754 by @lodev09)
  • Content now wraps its children's height by default instead of filling the sheet — pass flex: 1 via style to fill. (#746 by @lodev09)
  • The container is now sized to the sheet's visible height per detent and tracks it in realtime while dragging, requiring React Native 0.82+. (#735 by @lodev09)
  • anchor is renamed to placement and anchorOffset to placementOffset, with 'left' / 'right' becoming 'leading' / 'trailing' to match the layout-direction behavior native already had — web now follows layout direction too. The new default 'automatic' lets the system decide and only differs from 'center' on iOS 27+, where placement uses the native preferredPlacement API. (#846 by @lodev09)
  • The scrollable's bottom inset is now applied natively on all platforms: the safe-area inset while the content can scroll (mirroring iOS's contentInsetAdjustmentBehavior="automatic") and the height of an absolute footer floating over it, which then counts toward the auto detent — no more manual paddingBottom. Control it with the new scrollableOptions.contentInsetAdjustment ('automatic' | 'safe-area' | 'footer' | 'never'). (#784, #796, #848 by @lodev09)
  • The scrollable prop is replaced by scrollableRef — pass a ref of your ScrollView/FlatList to wire nested scrolling, keyboard insets, and auto detent sizing. (#795 by @lodev09)
  • The sheet navigator is now built on the new standard-navigation peer dependency, with first-class Expo Router support via the Sheet layout from the new /navigation/expo-router entry point. (#772 by @lodev09)

💡 Others

  • Upgrade the examples to Expo SDK 57 and React Native 0.86. (#755 by @lodev09)
  • Update the truesheet-usage AI skill for the v4 API. (#799, #848 by @lodev09)
  • Document that native stacks can't be nested inside sheet screens, with stacked sheets as the recommended alternative. (#822 by @lodev09)
  • The docs site moved from Docusaurus to Fumadocs, with built-in search, a redesigned blog and landing page, and the latest docs served at the root — old /v3 links redirect. (#826 by @lodev09)
  • The v3 docs stay available at /v3 once v4 is released, and the docs version dropdown now tracks each release. (#836 by @lodev09)
  • The examples now adopt the iOS UIScene lifecycle, fixing a launch crash on Xcode 27 and the iOS 27 simulator — the Expo example is upgraded to SDK 57.0.23 with enableSceneSupport, and the Sheet layout is typed against expo-router 57.0.21. (#843, #844 by @lodev09)

New Contributors

Full Changelog: v3.11.14...v4.0.0-beta.15

Don't miss a new react-native-true-sheet release

NewReleases is sending notifications on new releases.