Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
58 commits
Select commit Hold shift + click to select a range
4b9b0e8
feat!: synchronous per-detent container layout (#735)
lodev09 Jul 15, 2026
ad6dcbc
feat: support auto detent with scrollables (#743)
lodev09 Jul 16, 2026
ce4e50e
chore(example): fix BasicSheet
lodev09 Jul 16, 2026
95fc60a
refactor(ios): unify position tracking into a single display link (#744)
lodev09 Jul 16, 2026
2970017
feat!: content lays out naturally like a regular view (#746)
lodev09 Jul 17, 2026
097e738
feat: add headerOptions prop with absolute header position (#747)
lodev09 Jul 17, 2026
29b6260
feat!: add footerOptions prop with relative footer position (#748)
lodev09 Jul 17, 2026
d6f63a6
feat: relative footer owns the bottom inset for auto detent (#749)
lodev09 Jul 17, 2026
cea41fa
feat: footer owns the bottom inset adjustment (#750)
lodev09 Jul 18, 2026
9fa18dc
chore(example): align footer content padding with relative/absolute p…
lodev09 Jul 18, 2026
b3a4fad
fix: keyboard scroll misses the bottom inset with a footer (#752)
lodev09 Jul 20, 2026
9ff59b7
fix(android): footer jumps when keyboard hides on drag release
lodev09 Jul 20, 2026
31f2714
fix(android): sheet won't drag down from an input when fully expanded
lodev09 Jul 21, 2026
0498a7a
fix(ios): skip size reports while stacked behind a child sheet (#753)
lodev09 Jul 21, 2026
422c270
fix: relative footer stays in the layout flow behind the keyboard (#754)
lodev09 Jul 21, 2026
88963e7
chore: upgrade examples to Expo SDK 57 and RN 0.86 (#755)
lodev09 Jul 22, 2026
24d6373
refactor(ios): restore per-path position tracking (#756)
lodev09 Jul 22, 2026
9499aca
fix: address v4 review findings
lodev09 Jul 22, 2026
64a4130
fix(navigation): expose style, headerOptions, and footerOptions in sc…
lodev09 Jul 22, 2026
1607412
fix(ios): keep capped detent heights distinct to preserve the deck an…
lodev09 Jul 23, 2026
a680c39
fix: pad a late-set footer's first layout with the precalculated bott…
lodev09 Jul 28, 2026
9204318
chore: disable real-time onLayout log on example
lodev09 Jul 28, 2026
ba2cdbf
fix: keep animatedIndex accurate through keyboard growth and settles …
lodev09 Jul 28, 2026
d2325c7
chore: merge main — 3.11.x animatedIndex patch (#762) is on v4 via #761
lodev09 Jul 28, 2026
db87cae
chore: merge main (3.11.10)
lodev09 Aug 9, 2026
f8f1774
chore: release 4.0.0-beta.1
lodev09 Aug 9, 2026
d1d6784
docs: simplify v4 changelog to changes relative to v3
lodev09 Aug 9, 2026
8a36432
docs: require concise changelog entries in agent instructions
lodev09 Aug 9, 2026
b86e981
chore: update podfile lock
lodev09 Aug 10, 2026
7f1ccfe
feat: migrate navigator to standard-navigation (#772)
lodev09 Aug 10, 2026
299f638
chore: merge main into v4
lodev09 Aug 13, 2026
a4aa5e0
chore: release 4.0.0-beta.2
lodev09 Aug 13, 2026
fc39bb3
fix(ios): follow the iOS 26 floating threshold for the footer inset
lodev09 Aug 14, 2026
4a3d8f2
chore: regen podfile lock
lodev09 Aug 14, 2026
44e122b
feat(example): add size toggle to Footer component
lodev09 Aug 14, 2026
3917f2c
feat(example): add theme-aware Text component
lodev09 Aug 14, 2026
463fd31
chore(example): add footer to map sheet and adopt themed text
lodev09 Aug 14, 2026
ebd57ec
chore(example): themed footer palette and scroll sheet placeholder fixes
lodev09 Aug 14, 2026
1e41ab2
fix(ios): footer bottom inset for late-mounted footers
lodev09 Aug 14, 2026
168ccd9
fix: present initial sheet with settled tree and correct footer inset
lodev09 Aug 14, 2026
dacdf22
fix: harden initial present retry and footer inset pairing
lodev09 Aug 14, 2026
d3269bf
chore(example): clean up small footer sheet styling
lodev09 Aug 14, 2026
169251a
chore: release 4.0.0-beta.3
lodev09 Aug 14, 2026
99280ab
docs: update footer docs
lodev09 Aug 15, 2026
e13a5fc
refactor: measure auto detent natural height in shadow node (#783)
lodev09 Aug 17, 2026
2e69ee7
refactor: remove auto bottom inset on scrollables (#784)
lodev09 Aug 18, 2026
a2d5cd7
feat: add keyboardOffset to scrollableOptions (#785)
lodev09 Aug 18, 2026
e6c5610
Merge branch 'main' into v4
lodev09 Aug 18, 2026
9f7111d
feat: add scrollableRef prop for explicit scrollable wiring (#795)
lodev09 Aug 22, 2026
be7f52b
feat: add scrollableOptions.contentInsetAdjustmentBehavior (#796)
lodev09 Aug 22, 2026
ced43a4
fix: keep footer edge effect in sync with keyboard animation on iOS
lodev09 Aug 23, 2026
0758c57
fix(android): sheet stuck at stale detents after half-expanded settle
lodev09 Aug 23, 2026
024a7a7
fix(android): parent sheet lags behind child during auto detent resize
lodev09 Aug 23, 2026
4b38a70
fix(android): keep parent sheet in sync with child during auto detent…
lodev09 Aug 23, 2026
69dc2c6
fix(android): smooth keyboard scroll tracking in scrollable sheets (#…
lodev09 Aug 23, 2026
a64e46c
fix(android): prevent absolute footer jump on keyboard show and hide
lodev09 Aug 23, 2026
b3bed98
chore: release 4.0.0-beta.4
lodev09 Aug 23, 2026
8b948f5
docs(skills): update truesheet-usage skill for v4 (#799)
lodev09 Aug 23, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 0 additions & 12 deletions .yarn/patches/react-native-npm-0.85.3.patch

This file was deleted.

5 changes: 5 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -83,8 +83,13 @@ Add entry to `Unreleased` section in `CHANGELOG.md` for user-facing changes:

- `🎉 New features` - New functionality
- `🐛 Bug fixes` - Bug fixes
- `💥 Breaking changes` - Changes requiring user action to upgrade
- `💡 Others` - Refactors, internal changes

Format: `- **Platform**: Description. ([#123](https://github.com/lodev09/react-native-true-sheet/pull/123) by [@username](https://github.com/username))`

One entry per PR — summarize the PR's user-facing change in a single entry under its primary section.

Be concise — one or two short sentences stating the change and what it means for the user. No implementation details.

Sort entries by platform: **iOS** first, then **Android**, then **Web**, then cross-platform or unscoped entries last.
597 changes: 18 additions & 579 deletions CHANGELOG.md

Large diffs are not rendered by default.

11 changes: 6 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,16 +30,17 @@ The true native bottom sheet experience for your React Native Apps. 💩

### Prerequisites

- React Native 0.81+
- React Native 0.82+
- New Architecture enabled
- Xcode 26.1+

### Compatibility

| TrueSheet | React Native | Expo SDK |
|-----------|--------------|----------|
| 3.7+ | 0.81+ | 54+ |
| 3.6 | 0.80 | 52-53 |
| TrueSheet | React Native | Expo SDK |
|------------|--------------|----------|
| 4.0+ | 0.82+ | 55+ |
| 3.7 - 3.11 | 0.81+ | 54+ |
| 3.6 | 0.80 | 52-53 |

### Expo

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,15 +61,46 @@ class TrueSheetContainerView(reactContext: ThemedReactContext) :
return bottom
}

var insetAdjustment: TrueSheetInsetAdjustment = TrueSheetInsetAdjustment.AUTOMATIC
var scrollViewBottomInset: Int = 0
var scrollableEnabled: Boolean = false
var absoluteFooter: Boolean = false

/**
* Bottom safe-area inset the footer absorbs as padding — the footer
* owns the sheet's bottom edge, so its background fills the inset.
*/
var footerBottomInset: Int = 0
set(value) {
field = value
footerView?.setBottomInset(value)
}
var scrollableOptions: ScrollableOptions? = null
set(value) {
field = value
contentView?.scrollableOptions = value
}

// React tag of the user-provided scrollable within the content (see the scrollableRef prop)
var scrollableHandle: Int = -1
set(value) {
field = value
contentView?.scrollableHandle = value
}

/**
* Bottom safe-area inset the plugged scrollable applies as content padding
* while it can scroll (see ScrollableOptions.contentInsetAdjustment)
*/
var scrollableBottomInset: Int = 0
set(value) {
field = value
contentView?.bottomInset = value
}

var hasAutoDetent = false
set(value) {
field = value
contentView?.hasAutoDetent = value
}

override val eventDispatcher: EventDispatcher?
get() = delegate?.eventDispatcher

Expand All @@ -80,8 +111,7 @@ class TrueSheetContainerView(reactContext: ThemedReactContext) :
}

fun setupScrollable() {
val bottomInset = if (insetAdjustment == TrueSheetInsetAdjustment.AUTOMATIC) scrollViewBottomInset else 0
contentView?.setupScrollable(scrollableEnabled, bottomInset)
contentView?.setupScrollable()
}

fun setupKeyboardHandler() {
Expand All @@ -99,8 +129,14 @@ class TrueSheetContainerView(reactContext: ThemedReactContext) :
is TrueSheetContentView -> {
child.delegate = this
child.scrollableOptions = scrollableOptions
child.scrollableHandle = scrollableHandle
child.bottomInset = scrollableBottomInset
child.hasAutoDetent = hasAutoDetent
contentView = child

// State lands before the view is attached, so pull the current value
contentHeight = child.naturalHeight

// Children mount bottom-up, so the content subtree is complete here.
// Late-mounted peek views attach themselves instead (see TrueSheetPeekView).
findPeekView(child)?.let { attachPeekView(it) }
Expand All @@ -113,6 +149,7 @@ class TrueSheetContainerView(reactContext: ThemedReactContext) :

is TrueSheetFooterView -> {
child.delegate = this
child.setBottomInset(footerBottomInset)
footerView = child
}
}
Expand Down Expand Up @@ -184,6 +221,12 @@ class TrueSheetContainerView(reactContext: ThemedReactContext) :
delegate?.containerViewContentDidChangeSize(width, height)
}

override val footerKeyboardOcclusion: Int
get() = if (absoluteFooter) footerView?.keyboardOcclusionHeight ?: 0 else -(footerView?.height ?: 0)

override val hasRelativeFooter: Boolean
get() = footerView != null && !absoluteFooter

override fun contentViewDidScroll() {
delegate?.containerViewContentDidScroll()
}
Expand All @@ -200,6 +243,8 @@ class TrueSheetContainerView(reactContext: ThemedReactContext) :
override fun footerViewDidChangeSize(width: Int, height: Int) {
footerHeight = height
delegate?.containerViewFooterDidChangeSize(width, height)
// A relative footer takes over the bottom inset — drop the scrollable's
contentView?.updateContentInset()
}

override fun peekViewDidChangeSize(width: Int, height: Int) {
Expand Down
Loading
Loading