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

2 hours ago

🎉 New features

  • iOS: Smoother onPositionChange, and onWillDismiss now fires only when a drag-to-dismiss is committed. (#744, #756 by @lodev09)
  • iOS: Added foldOptions for foldables on iOS 27.1+. In tabletop, hingeDetentIndex rests that detent on the hinge; hingeBehavior: 'avoid' keeps the sheet below the hinge, and 'snap' also moves it there when the device folds. (#939 by @lodev09)
  • 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)
  • 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)
  • Added background and backgroundStyle for custom backgrounds, exact colors, and glass or blur tints on all platforms. (#874 by @lodev09)
  • Added detentBackgrounds with color strings or color/blur objects, native iOS transitions, and cross-fades elsewhere. (#876 by @lodev09)
  • Added dismissThreshold on Android and Web. Set it to 'short' to dismiss on a short drag or fling, like Compose Material3's sheet. (#880 by @lodev09)
  • Support Expo SDK 58 and React Native 0.88. The Expo Router Sheet navigator works on Router 58, and reopening a sheet on iOS no longer shows a blank screen. (#896 by @lodev09)
  • Added dimColor and dimOpacity to customize the color and opacity of the dim behind the sheet. (#911, #919, #925 by @IjzerenHein, @nickcernera and @lodev09)

🐛 Bug fixes

  • Android: A sheet presented while another sheet on its screen is hidden by navigation now stacks on it, so dismissing the new sheet no longer leaves the hidden sheet translated and undraggable. (#930 by @1kuko3 and @lodev09)
  • iOS: Typing in an input outside the scrollable (e.g. a multiline input in the footer) no longer scrolls the scrollable on every keystroke. (#891 by @billouboq)
  • iOS: A mounted sheet no longer breaks the native stack's large title collapsing on scroll. (#890 by @lodev09)
  • iOS: Presenting a sheet while a modal is still dismissing now waits for the modal to close, so the sheet opens at the correct size. (#881 by @lodev09)
  • iOS: Fix keyboard alignment for absolute footers on iPad and iPhone. (#855 by @lodev09)
  • 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: A sheet's absolute footer no longer stays raised mid-sheet when the keyboard closes while a stacked sheet is still on top of it. (#917 by @ronnymajani and @lodev09)
  • iOS: A sheet with draggable={false} can no longer be pulled or swiped away; tapping outside it still dismisses it. (#927 by @maxlapides)
  • iOS: Swiping down a short sheet now emits onWillBlur, onWillDismiss, and the parent's onWillFocus before it dismisses. (#935 by @lodev09)
  • iOS: A dimmed sheet's accessibility boundary now updates when footer controls are added, removed, or hidden with display: 'none' without the footer changing height. A footer resizing on a sheet behind a stacked sheet no longer pulls VoiceOver and XCTest away from the sheet on top. (#943 by @maxlapides and @lodev09)
  • iOS: On iPad, hiding the keyboard while the input keeps focus no longer grows the sheet for the minimized keyboard, and a floating keyboard no longer lifts an absolute footer off the sheet. (#945 by @lodev09)
  • Android: A back press while the sheet's native view is being torn down no longer causes an unhandled "TrueSheetView with tag X not found" promise rejection. (#921 by @lodev09)
  • Android: Grabber colors now support PlatformColor resource references as well as static colors. (#916 by @hukpo)
  • Android: Hiding the keyboard after scrolling the sheet's content now settles the sheet with the keyboard instead of leaving a gap, and scrolling with keyboardDismissMode="on-drag" no longer snaps the sheet mid-gesture. (#909 by @billouboq and @lodev09)
  • Android: A sheet mounted during a busy render no longer lays out its content at its parent's size. (#905 by @MAVERlCK)
  • Android: Presenting a sheet while another is still dismissing no longer leaves the new sheet without a dimmed background. (#893 by @shahidrogers)
  • 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: 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)
  • Android: Prevent dragging a sheet behind a dimmed sheet. (#856 by @lodev09)
  • Android: auto sheets now resize to content that changes size during the present animation, such as an @expo/ui Host. The troubleshooting docs cover opening it at the right height. (#867 by @lodev09)
  • Android: A quick downward flick now dismisses the sheet from its lowest detent, like on iOS. Focusing an input outside the sheet's scrollable no longer scrolls it. (#879 by @AndriiSerheniuk and @lodev09)
  • Android: In stacked sheets, the parent's onDidBlur now fires before the child's onDidPresent, like on iOS, and the parent's onDidFocus is no longer skipped when another sheet is presented while it slides back. (#936 by @lodev09)
  • Web: Sheets now open when initialDetentIndex is deferred until the screen is focused, and respect initialDetentAnimated without jumping. (#887 by @lodev09)
  • Web: On mobile browsers, the sheet now fits above the soft keyboard and keeps the focused input visible. (#920 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)
  • Sheet navigator: a sheet pushed while another is still dismissing is no longer dropped. (#898 by @lodev09)
  • Dismissing a sheet before its present finishes now always dismisses it and settles present(), instead of leaving the sheet open or present() hanging. On web, present()/dismiss() now resolve when the animation ends and ignore calls on an already presented or dismissed sheet, like native. (#900 by @lodev09)
  • scrollableRef now resolves scrollables that expose their scroll node through an imperative handle, such as LegendList. (#914 by @cpruijsen)
  • A sheet hosted in a bottom-tab screen is now hidden when the stack enclosing the tabs pushes a screen, and restored on return, instead of covering the pushed screen. (#910 by @IjzerenHein)
  • An input focused in onWillPresent now raises the keyboard together with the sheet, with an absolute footer above the keyboard and the scrollable's focused input and last rows visible. On Android, a stacked parent sheet no longer jumps while the keyboard rises, and returns fully to rest when its child grows past it. (#938 by @lodev09)

💥 Breaking changes

  • iOS: Removed blurOptions; use a third-party blur in background for custom intensity. Blur now takes precedence over backgroundColor; use backgroundStyle.backgroundColor for glass/blur tints and exact colors. (#875 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, #877, #939, #944 by @lodev09)
  • Document that native stacks can't be nested inside sheet screens, with stacked sheets as the recommended alternative. (#822 by @lodev09)
  • New Deep Linking guide and updated AI skill: hold initialDetentIndex until the screen is focused, so a cold start deep link to a modal or sheet-navigator sheet no longer gets the sheet stacked on top. Includes deep-link-only repro routes in the Expo example. (#882 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)
  • Add an internal e2e agent skill for testing the examples on the iOS simulator, Android emulator, and mobile web with argent and collecting e2e evidence. It replaces Maestro. (#904, #923 by @lodev09)
  • Add an internal changelog agent skill for writing, extending, or skipping changelog entries. (#924, #926 by @lodev09)

New Contributors

Full Changelog: v3.11.18...v4.0.0-beta.26

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

NewReleases is sending notifications on new releases.