authorgravatar for me@t3.ggTheo Browne <me@t3.gg> 2026-08-23 20:27:37-07:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2026-08-23 20:27:37-07:00
log643daa51616d0bfcd4c8235ae6966a68f106dcfe
tree1b7a57579d03a08c7625070fa2d882de7d151261
parent17dbe8dda3ba87eb83804bc93fc0cb945186d204
signature Signed by PGP key B5690EEEBB952194

fix(web): prevent expanded tool calls from hiding thread content (#8052)


2 files changed, 62 insertions(+), 14 deletions(-)

patches/@legendapp__list@3.3.5.patch+57-9
...@@ -204,7 +204,7 @@ index ce1fe00001c9e5aee6c6ea8bb2d4757d4586d002..3ccf6f16067152dfcb0c143371e2ec6a...@@ -204,7 +204,7 @@ index ce1fe00001c9e5aee6c6ea8bb2d4757d4586d002..3ccf6f16067152dfcb0c143371e2ec6a
204 * Number of columns to render items in.204 * Number of columns to render items in.
205 * @default 1205 * @default 1
206diff --git a/react-native.js b/react-native.js206diff --git a/react-native.js b/react-native.js
207index b3c5a306b293f797a8b338adfca3060c0f6db22b..89077be4d6833cfaabf9d6d6205d9551505e32b4 100644207index b3c5a306b293f797a8b338adfca3060c0f6db22b..4227ed22da8865b7493f47f199f4d8f4a5493efb 100644
208--- a/react-native.js208--- a/react-native.js
209+++ b/react-native.js209+++ b/react-native.js
210@@ -954,7 +954,7 @@ function setInitialRenderState(ctx, {210@@ -954,7 +954,7 @@ function setInitialRenderState(ctx, {
...@@ -513,14 +513,6 @@ index b3c5a306b293f797a8b338adfca3060c0f6db22b..89077be4d6833cfaabf9d6d6205d9551...@@ -513,14 +513,6 @@ index b3c5a306b293f797a8b338adfca3060c0f6db22b..89077be4d6833cfaabf9d6d6205d9551
513 estimatedItemSize = 100,513 estimatedItemSize = 100,
514 estimatedListSize,514 estimatedListSize,
515 extraData,515 extraData,
516@@ -7105,6 +7260,7 @@ var LegendListInner = typedForwardRef(function LegendListInner2(props, forwarded
517 onLayout: onLayoutProp,
518 onLoad,
519 onMomentumScrollEnd,
520+ onScrollBeginDrag,
521 onRefresh,
522 onScroll: onScrollProp,
523 onScrollBeginDrag,
524@@ -7200,7 +7356,7 @@ var LegendListInner = typedForwardRef(function LegendListInner2(props, forwarded516@@ -7200,7 +7356,7 @@ var LegendListInner = typedForwardRef(function LegendListInner2(props, forwarded
525 const combinedRef = useCombinedRef(refScroller, refScrollView);517 const combinedRef = useCombinedRef(refScroller, refScrollView);
526 const keyExtractor = keyExtractorProp != null ? keyExtractorProp : ((_item, index) => index.toString());518 const keyExtractor = keyExtractorProp != null ? keyExtractorProp : ((_item, index) => index.toString());
...@@ -925,6 +917,62 @@ index 40e87cda8c9bc79a889e5542f29af429a24b24d4..2d556eecb0bafe2f54084c809f82144c...@@ -925,6 +917,62 @@ index 40e87cda8c9bc79a889e5542f29af429a24b24d4..2d556eecb0bafe2f54084c809f82144c
925 onScroll: onScrollHandler,917 onScroll: onScrollHandler,
926 recycleItems,918 recycleItems,
927 refreshControl: refreshControlElement ? stylePaddingTopState > 0 ? React2.cloneElement(refreshControlElement, {919 refreshControl: refreshControlElement ? stylePaddingTopState > 0 ? React2.cloneElement(refreshControlElement, {
920diff --git a/react.js b/react.js
921index 914d2dafaafa001c9ab6791a0a0581659295e333..06466096ceb96ef8773f7f7e202a19c9b774d49b 100644
922--- a/react.js
923+++ b/react.js
924@@ -4702,7 +4702,8 @@ function maybeUpdateAnchoredEndSpace(ctx) {
925 contentBelowAnchor = Math.max(0, contentBelowAnchor - ctx.scrollAxisGap);
926 contentBelowAnchor += (ctx.values.get("footerSize") || 0) + getStylePaddingEnd(state.props);
927 isReady = !hasUnknownTailSize;
928- nextSize = hasUnknownTailSize ? previousSize || 0 : Math.max(0, state.scrollLength - contentBelowAnchor - anchorOffset);
929+ const knownSizeBound = Math.max(0, state.scrollLength - contentBelowAnchor - anchorOffset);
930+ nextSize = hasUnknownTailSize ? Math.min(previousSize || 0, knownSizeBound) : knownSizeBound;
931 } else if (anchorIndex >= 0) {
932 isReady = false;
933 }
934@@ -4721,7 +4722,13 @@ function maybeUpdateAnchoredEndSpace(ctx) {
935 updateContentMetricsState(ctx);
936 updateScroll(ctx, state.scroll, true, { markHasScrolled: false });
937 }
938 (_b = anchoredEndSpace == null ? void 0 : anchoredEndSpace.onReady) == null ? void 0 : _b.call(anchoredEndSpace, { anchorIndex: nextAnchorIndex, anchorKey: nextAnchorKey, size: nextSize });
939+ } else if (!isReady && didSizeChange && nextSize < (previousSize || 0)) {
940+ set$(ctx, "anchoredEndSpaceSize", nextSize);
941+ (_a3 = anchoredEndSpace == null ? void 0 : anchoredEndSpace.onSizeChanged) == null ? void 0 : _a3.call(anchoredEndSpace, nextSize);
942+ if (anchoredEndSpace == null ? void 0 : anchoredEndSpace.includeInEndInset) {
943+ updateScroll(ctx, state.scroll, true, { markHasScrolled: false });
944+ }
945 }
946 return nextSize;
947 }
948diff --git a/react.mjs b/react.mjs
949index 95465f2ab89ce41a10553f58af83618f7310e83c..4b5f06c60f1e8bbd9035a49980d9e86820262da4 100644
950--- a/react.mjs
951+++ b/react.mjs
952@@ -4681,7 +4681,8 @@ function maybeUpdateAnchoredEndSpace(ctx) {
953 contentBelowAnchor = Math.max(0, contentBelowAnchor - ctx.scrollAxisGap);
954 contentBelowAnchor += (ctx.values.get("footerSize") || 0) + getStylePaddingEnd(state.props);
955 isReady = !hasUnknownTailSize;
956- nextSize = hasUnknownTailSize ? previousSize || 0 : Math.max(0, state.scrollLength - contentBelowAnchor - anchorOffset);
957+ const knownSizeBound = Math.max(0, state.scrollLength - contentBelowAnchor - anchorOffset);
958+ nextSize = hasUnknownTailSize ? Math.min(previousSize || 0, knownSizeBound) : knownSizeBound;
959 } else if (anchorIndex >= 0) {
960 isReady = false;
961 }
962@@ -4700,7 +4701,13 @@ function maybeUpdateAnchoredEndSpace(ctx) {
963 updateContentMetricsState(ctx);
964 updateScroll(ctx, state.scroll, true, { markHasScrolled: false });
965 }
966 (_b = anchoredEndSpace == null ? void 0 : anchoredEndSpace.onReady) == null ? void 0 : _b.call(anchoredEndSpace, { anchorIndex: nextAnchorIndex, anchorKey: nextAnchorKey, size: nextSize });
967+ } else if (!isReady && didSizeChange && nextSize < (previousSize || 0)) {
968+ set$(ctx, "anchoredEndSpaceSize", nextSize);
969+ (_a3 = anchoredEndSpace == null ? void 0 : anchoredEndSpace.onSizeChanged) == null ? void 0 : _a3.call(anchoredEndSpace, nextSize);
970+ if (anchoredEndSpace == null ? void 0 : anchoredEndSpace.includeInEndInset) {
971+ updateScroll(ctx, state.scroll, true, { markHasScrolled: false });
972+ }
973 }
974 return nextSize;
975 }
928diff --git a/reanimated.d.ts b/reanimated.d.ts976diff --git a/reanimated.d.ts b/reanimated.d.ts
929index e5043320700b12f34f4c0babbc341f85ca8135c1..2ce63830a28636b21937a0741fd0e613dae950fe 100644977index e5043320700b12f34f4c0babbc341f85ca8135c1..2ce63830a28636b21937a0741fd0e613dae950fe 100644
930--- a/reanimated.d.ts978--- a/reanimated.d.ts
pnpm-lock.yaml+5-5
...@@ -84,7 +84,7 @@ patchedDependencies:...@@ -84,7 +84,7 @@ patchedDependencies:
84 '@effect/vitest@4.0.0-beta.103': a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b84 '@effect/vitest@4.0.0-beta.103': a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b
85 '@expo/metro-config@56.0.14': 8cb08b5bb7051ed9d2dbe46a2c293c5a1e17f1bd6ddf30de27909e18c921ff4685 '@expo/metro-config@56.0.14': 8cb08b5bb7051ed9d2dbe46a2c293c5a1e17f1bd6ddf30de27909e18c921ff46
86 '@ff-labs/fff-node@0.9.4': ab9ff544009e1891cfe3930105862d3699007f38922a79f3c98d90018deca36886 '@ff-labs/fff-node@0.9.4': ab9ff544009e1891cfe3930105862d3699007f38922a79f3c98d90018deca368
87 '@legendapp/list@3.3.5': 6befc76c7f590a0b0915b531386ce7e3bbb364612868e1f04e4ac84f60a39ab587 '@legendapp/list@3.3.5': 3362284f1fca70407e7c594cb8db04086bfebff5de10568f85c08661d405deee
88 '@pierre/diffs@1.3.0-beta.10': 7ef7cb0cbabb17c15cdb137554068b36f15f6f5265e73fb51452aa3380db91aa88 '@pierre/diffs@1.3.0-beta.10': 7ef7cb0cbabb17c15cdb137554068b36f15f6f5265e73fb51452aa3380db91aa
89 '@react-native-menu/menu@2.0.0': c7f66d121c726ade4f5c4e1aed11a691e5711d244c544084e289ac26132a004589 '@react-native-menu/menu@2.0.0': c7f66d121c726ade4f5c4e1aed11a691e5711d244c544084e289ac26132a0045
90 '@react-native/gradle-plugin@0.85.3': c1b594a16e682d621b6a960926f8ce13fc92edfb397884cfe7fcb0518996a78490 '@react-native/gradle-plugin@0.85.3': c1b594a16e682d621b6a960926f8ce13fc92edfb397884cfe7fcb0518996a784
...@@ -224,7 +224,7 @@ importers:...@@ -224,7 +224,7 @@ importers:
224 version: 56.0.18(3cdc0dde9f93166d952f1e1bd0cb25c0)224 version: 56.0.18(3cdc0dde9f93166d952f1e1bd0cb25c0)
225 '@legendapp/list':225 '@legendapp/list':
226 specifier: 'catalog:'226 specifier: 'catalog:'
227 version: 3.3.5(patch_hash=6befc76c7f590a0b0915b531386ce7e3bbb364612868e1f04e4ac84f60a39ab5)(react-dom@19.2.3(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)227 version: 3.3.5(patch_hash=3362284f1fca70407e7c594cb8db04086bfebff5de10568f85c08661d405deee)(react-dom@19.2.3(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
228 '@noble/curves':228 '@noble/curves':
229 specifier: 'catalog:'229 specifier: 'catalog:'
230 version: 1.9.1230 version: 1.9.1
...@@ -553,7 +553,7 @@ importers:...@@ -553,7 +553,7 @@ importers:
553 version: 0.9.0553 version: 0.9.0
554 '@legendapp/list':554 '@legendapp/list':
555 specifier: 'catalog:'555 specifier: 'catalog:'
556 version: 3.3.5(patch_hash=6befc76c7f590a0b0915b531386ce7e3bbb364612868e1f04e4ac84f60a39ab5)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)556 version: 3.3.5(patch_hash=3362284f1fca70407e7c594cb8db04086bfebff5de10568f85c08661d405deee)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
557 '@lexical/react':557 '@lexical/react':
558 specifier: ^0.41.0558 specifier: ^0.41.0
559 version: 0.41.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(yjs@13.6.31)559 version: 0.41.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(yjs@13.6.31)
...@@ -12946,7 +12946,7 @@ snapshots:...@@ -12946,7 +12946,7 @@ snapshots:
12946 dependencies:12946 dependencies:
12947 jsbi: 4.3.212947 jsbi: 4.3.2
1294812948
12949 '@legendapp/list@3.3.5(patch_hash=6befc76c7f590a0b0915b531386ce7e3bbb364612868e1f04e4ac84f60a39ab5)(react-dom@19.2.3(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)':12949 '@legendapp/list@3.3.5(patch_hash=3362284f1fca70407e7c594cb8db04086bfebff5de10568f85c08661d405deee)(react-dom@19.2.3(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)':
12950 dependencies:12950 dependencies:
12951 react: 19.2.312951 react: 19.2.3
12952 use-sync-external-store: 1.6.0(react@19.2.3)12952 use-sync-external-store: 1.6.0(react@19.2.3)
...@@ -12954,7 +12954,7 @@ snapshots:...@@ -12954,7 +12954,7 @@ snapshots:
12954 react-dom: 19.2.3(react@19.2.3)12954 react-dom: 19.2.3(react@19.2.3)
12955 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)12955 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
1295612956
12957 '@legendapp/list@3.3.5(patch_hash=6befc76c7f590a0b0915b531386ce7e3bbb364612868e1f04e4ac84f60a39ab5)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':12957 '@legendapp/list@3.3.5(patch_hash=3362284f1fca70407e7c594cb8db04086bfebff5de10568f85c08661d405deee)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
12958 dependencies:12958 dependencies:
12959 react: 19.2.612959 react: 19.2.6
12960 use-sync-external-store: 1.6.0(react@19.2.6)12960 use-sync-external-store: 1.6.0(react@19.2.6)