From 68d433f7ec71fccef7e588ab62af8eae4ca9df0f Mon Sep 17 00:00:00 2001 From: Claude Belizaire <139932571+Claudesaul@users.noreply.github.com> Date: Wed, 14 Oct 2026 10:49:45 -0400 Subject: [PATCH 1/3] fix(web): model picker no longer jumps at the end of its open animation --- patches/@legendapp__list@3.3.5.patch | 42 ++++++++++++++++++++++------ pnpm-lock.yaml | 8 +++--- 2 files changed, 38 insertions(+), 12 deletions(-) diff --git a/patches/@legendapp__list@3.3.5.patch b/patches/@legendapp__list@3.3.5.patch index 88b739824b01e..42c80edf0c602 100644 --- a/patches/@legendapp__list@3.3.5.patch +++ b/patches/@legendapp__list@3.3.5.patch @@ -1447,7 +1447,7 @@ index 95465f2..d7cbe1c 100644 } } diff --git a/react.js b/react.js -index 914d2da..0c2917d 100644 +index 914d2da..cb76145 100644 --- a/react.js +++ b/react.js @@ -4702,7 +4702,8 @@ function maybeUpdateAnchoredEndSpace(ctx) { @@ -1473,7 +1473,20 @@ index 914d2da..0c2917d 100644 } return nextSize; } -@@ -5651,6 +5658,18 @@ var ContainerSlot = typedMemo(function ContainerSlot2(props) { +@@ -4956,7 +4963,11 @@ function measureContainersInLayoutEffect(ctx, targetContainerIds = null) { + const itemKey = peek$(ctx, `containerItemKey${containerId}`); + const element = viewRef == null ? void 0 : viewRef.current; + if (itemKey !== void 0 && element) { +- const rect = element.getBoundingClientRect(); ++ let rect = element.getBoundingClientRect(); ++ // getBoundingClientRect includes ancestor transforms (e.g. a popup's zoom-in) but ResizeObserver doesn't. ++ if (Math.abs(rect.width - element.offsetWidth) > 1) { ++ rect = { height: element.offsetHeight, width: element.offsetWidth }; ++ } + setContainerLayoutBaseline(element, rect); + measurements.push({ + containerId, +@@ -5651,6 +5662,18 @@ var ContainerSlot = typedMemo(function ContainerSlot2(props) { }); // src/utils/reordering.ts @@ -1492,7 +1505,7 @@ index 914d2da..0c2917d 100644 function sortDOMElements(container, indexByElement) { const elements = Array.from(container.children); if (elements.length <= 1) return elements; -@@ -5690,9 +5709,9 @@ function sortDOMElements(container, indexByElement) { +@@ -5690,9 +5713,9 @@ function sortDOMElements(container, indexByElement) { } } if (nextStableElement) { @@ -1504,7 +1517,7 @@ index 914d2da..0c2917d 100644 } } } -@@ -6446,8 +6465,8 @@ function ScrollAdjust() { +@@ -6446,8 +6469,8 @@ function ScrollAdjust() { window.getComputedStyle(contentNode)[axis.paddingEndProp] ); const temporaryPaddingEnd = `${(currentPaddingEnd || 0) + pad}px`; @@ -1515,7 +1528,7 @@ index 914d2da..0c2917d 100644 scrollBy(); if (resetPaddingRafRef.current !== void 0) { diff --git a/react.mjs b/react.mjs -index 95465f2..b73bfdf 100644 +index 95465f2..427c468 100644 --- a/react.mjs +++ b/react.mjs @@ -4681,7 +4681,8 @@ function maybeUpdateAnchoredEndSpace(ctx) { @@ -1541,7 +1554,20 @@ index 95465f2..b73bfdf 100644 } return nextSize; } -@@ -5630,6 +5637,18 @@ var ContainerSlot = typedMemo(function ContainerSlot2(props) { +@@ -4935,7 +4942,11 @@ function measureContainersInLayoutEffect(ctx, targetContainerIds = null) { + const itemKey = peek$(ctx, `containerItemKey${containerId}`); + const element = viewRef == null ? void 0 : viewRef.current; + if (itemKey !== void 0 && element) { +- const rect = element.getBoundingClientRect(); ++ let rect = element.getBoundingClientRect(); ++ // getBoundingClientRect includes ancestor transforms (e.g. a popup's zoom-in) but ResizeObserver doesn't. ++ if (Math.abs(rect.width - element.offsetWidth) > 1) { ++ rect = { height: element.offsetHeight, width: element.offsetWidth }; ++ } + setContainerLayoutBaseline(element, rect); + measurements.push({ + containerId, +@@ -5630,6 +5641,18 @@ var ContainerSlot = typedMemo(function ContainerSlot2(props) { }); // src/utils/reordering.ts @@ -1560,7 +1586,7 @@ index 95465f2..b73bfdf 100644 function sortDOMElements(container, indexByElement) { const elements = Array.from(container.children); if (elements.length <= 1) return elements; -@@ -5669,9 +5688,9 @@ function sortDOMElements(container, indexByElement) { +@@ -5669,9 +5692,9 @@ function sortDOMElements(container, indexByElement) { } } if (nextStableElement) { @@ -1572,7 +1598,7 @@ index 95465f2..b73bfdf 100644 } } } -@@ -6425,8 +6444,8 @@ function ScrollAdjust() { +@@ -6425,8 +6448,8 @@ function ScrollAdjust() { window.getComputedStyle(contentNode)[axis.paddingEndProp] ); const temporaryPaddingEnd = `${(currentPaddingEnd || 0) + pad}px`; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 57f0a3ad9f82f..1ecbb957dc45c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -167,7 +167,7 @@ patchedDependencies: '@expo/metro-config@58.0.14': 90fa980e8b6480631fb2fbb04559834e3c612db40c550cd828f11be297d8d760 '@expo/ui@58.0.20': 5a26480373850c1a7943919aa21f904151b335a0cb01042109e0746def37923e '@ff-labs/fff-node@0.11.0': cc71fcec015f4d39bc96ae2e2bf6b0ca678124c722c66a7841efce9d34b5983c - '@legendapp/list@3.3.5': 680cc6a5c5b4a4032e467e7b3fde22f89a84c0ee2e6eac6fda737d6277cc0806 + '@legendapp/list@3.3.5': 8e1963fb6a339b7061b0809a8dd6258fe43cd6467ef816fe92768506799d7f7b '@pierre/diffs@1.5.2': 298e94372dbd51846a4e26ece2ecc3e22eb1f94b0450b1f1a9c6fec127809be7 '@react-native-ai/apple@0.12.0': 2d09870c2848d185cb05b53ed823a46e12dba519324d8dd8e584e28731990f9d '@react-native-menu/menu@2.0.0': a4866ecfcd44f318043de839d20110c17e14909004900f002ffe12050376f2ba @@ -340,7 +340,7 @@ importers: version: 58.0.20(patch_hash=5a26480373850c1a7943919aa21f904151b335a0cb01042109e0746def37923e)(@babel/core@7.29.7)(expo@58.0.14)(react-dom@19.3.0(react@19.3.0))(react-native-worklets@0.13.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) '@legendapp/list': specifier: 'catalog:' - version: 3.3.5(patch_hash=680cc6a5c5b4a4032e467e7b3fde22f89a84c0ee2e6eac6fda737d6277cc0806)(react-dom@19.3.0(react@19.3.0))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + version: 3.3.5(patch_hash=8e1963fb6a339b7061b0809a8dd6258fe43cd6467ef816fe92768506799d7f7b)(react-dom@19.3.0(react@19.3.0))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) '@material/material-color-utilities': specifier: 0.3.0 version: 0.3.0 @@ -816,7 +816,7 @@ importers: version: 0.9.0 '@legendapp/list': specifier: 'catalog:' - version: 3.3.5(patch_hash=680cc6a5c5b4a4032e467e7b3fde22f89a84c0ee2e6eac6fda737d6277cc0806)(react-dom@19.3.0(react@19.3.0))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + version: 3.3.5(patch_hash=8e1963fb6a339b7061b0809a8dd6258fe43cd6467ef816fe92768506799d7f7b)(react-dom@19.3.0(react@19.3.0))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) '@noble/hashes': specifier: 'catalog:' version: 1.8.0 @@ -15275,7 +15275,7 @@ snapshots: dependencies: jsbi: 4.3.2 - '@legendapp/list@3.3.5(patch_hash=680cc6a5c5b4a4032e467e7b3fde22f89a84c0ee2e6eac6fda737d6277cc0806)(react-dom@19.3.0(react@19.3.0))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)': + '@legendapp/list@3.3.5(patch_hash=8e1963fb6a339b7061b0809a8dd6258fe43cd6467ef816fe92768506799d7f7b)(react-dom@19.3.0(react@19.3.0))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)': dependencies: react: 19.3.0 use-sync-external-store: 1.6.0(react@19.3.0) From f3c1879809797dfa263b1e5779d6da0ff6341a92 Mon Sep 17 00:00:00 2001 From: Claude Belizaire <139932571+Claudesaul@users.noreply.github.com> Date: Wed, 14 Oct 2026 12:25:53 -0400 Subject: [PATCH 2/3] fix(web): shorten the model picker measurement fix --- patches/@legendapp__list@3.3.5.patch | 36 +++++++++++++--------------- pnpm-lock.yaml | 8 +++---- 2 files changed, 20 insertions(+), 24 deletions(-) diff --git a/patches/@legendapp__list@3.3.5.patch b/patches/@legendapp__list@3.3.5.patch index 42c80edf0c602..536b84116d54f 100644 --- a/patches/@legendapp__list@3.3.5.patch +++ b/patches/@legendapp__list@3.3.5.patch @@ -1447,7 +1447,7 @@ index 95465f2..d7cbe1c 100644 } } diff --git a/react.js b/react.js -index 914d2da..cb76145 100644 +index 914d2da..57e1078 100644 --- a/react.js +++ b/react.js @@ -4702,7 +4702,8 @@ function maybeUpdateAnchoredEndSpace(ctx) { @@ -1473,20 +1473,18 @@ index 914d2da..cb76145 100644 } return nextSize; } -@@ -4956,7 +4963,11 @@ function measureContainersInLayoutEffect(ctx, targetContainerIds = null) { +@@ -4956,7 +4963,9 @@ function measureContainersInLayoutEffect(ctx, targetContainerIds = null) { const itemKey = peek$(ctx, `containerItemKey${containerId}`); const element = viewRef == null ? void 0 : viewRef.current; if (itemKey !== void 0 && element) { - const rect = element.getBoundingClientRect(); -+ let rect = element.getBoundingClientRect(); -+ // getBoundingClientRect includes ancestor transforms (e.g. a popup's zoom-in) but ResizeObserver doesn't. -+ if (Math.abs(rect.width - element.offsetWidth) > 1) { -+ rect = { height: element.offsetHeight, width: element.offsetWidth }; -+ } ++ const box = element.getBoundingClientRect(); ++ // getBoundingClientRect includes ancestor transforms (e.g. a popup's zoom-in), ResizeObserver doesn't. ++ const rect = Math.abs(box.width - element.offsetWidth) > 1 ? { height: element.offsetHeight, width: element.offsetWidth } : box; setContainerLayoutBaseline(element, rect); measurements.push({ containerId, -@@ -5651,6 +5662,18 @@ var ContainerSlot = typedMemo(function ContainerSlot2(props) { +@@ -5651,6 +5660,18 @@ var ContainerSlot = typedMemo(function ContainerSlot2(props) { }); // src/utils/reordering.ts @@ -1505,7 +1503,7 @@ index 914d2da..cb76145 100644 function sortDOMElements(container, indexByElement) { const elements = Array.from(container.children); if (elements.length <= 1) return elements; -@@ -5690,9 +5713,9 @@ function sortDOMElements(container, indexByElement) { +@@ -5690,9 +5711,9 @@ function sortDOMElements(container, indexByElement) { } } if (nextStableElement) { @@ -1517,7 +1515,7 @@ index 914d2da..cb76145 100644 } } } -@@ -6446,8 +6469,8 @@ function ScrollAdjust() { +@@ -6446,8 +6467,8 @@ function ScrollAdjust() { window.getComputedStyle(contentNode)[axis.paddingEndProp] ); const temporaryPaddingEnd = `${(currentPaddingEnd || 0) + pad}px`; @@ -1528,7 +1526,7 @@ index 914d2da..cb76145 100644 scrollBy(); if (resetPaddingRafRef.current !== void 0) { diff --git a/react.mjs b/react.mjs -index 95465f2..427c468 100644 +index 95465f2..dd6ed31 100644 --- a/react.mjs +++ b/react.mjs @@ -4681,7 +4681,8 @@ function maybeUpdateAnchoredEndSpace(ctx) { @@ -1554,20 +1552,18 @@ index 95465f2..427c468 100644 } return nextSize; } -@@ -4935,7 +4942,11 @@ function measureContainersInLayoutEffect(ctx, targetContainerIds = null) { +@@ -4935,7 +4942,9 @@ function measureContainersInLayoutEffect(ctx, targetContainerIds = null) { const itemKey = peek$(ctx, `containerItemKey${containerId}`); const element = viewRef == null ? void 0 : viewRef.current; if (itemKey !== void 0 && element) { - const rect = element.getBoundingClientRect(); -+ let rect = element.getBoundingClientRect(); -+ // getBoundingClientRect includes ancestor transforms (e.g. a popup's zoom-in) but ResizeObserver doesn't. -+ if (Math.abs(rect.width - element.offsetWidth) > 1) { -+ rect = { height: element.offsetHeight, width: element.offsetWidth }; -+ } ++ const box = element.getBoundingClientRect(); ++ // getBoundingClientRect includes ancestor transforms (e.g. a popup's zoom-in), ResizeObserver doesn't. ++ const rect = Math.abs(box.width - element.offsetWidth) > 1 ? { height: element.offsetHeight, width: element.offsetWidth } : box; setContainerLayoutBaseline(element, rect); measurements.push({ containerId, -@@ -5630,6 +5641,18 @@ var ContainerSlot = typedMemo(function ContainerSlot2(props) { +@@ -5630,6 +5639,18 @@ var ContainerSlot = typedMemo(function ContainerSlot2(props) { }); // src/utils/reordering.ts @@ -1586,7 +1582,7 @@ index 95465f2..427c468 100644 function sortDOMElements(container, indexByElement) { const elements = Array.from(container.children); if (elements.length <= 1) return elements; -@@ -5669,9 +5692,9 @@ function sortDOMElements(container, indexByElement) { +@@ -5669,9 +5690,9 @@ function sortDOMElements(container, indexByElement) { } } if (nextStableElement) { @@ -1598,7 +1594,7 @@ index 95465f2..427c468 100644 } } } -@@ -6425,8 +6448,8 @@ function ScrollAdjust() { +@@ -6425,8 +6446,8 @@ function ScrollAdjust() { window.getComputedStyle(contentNode)[axis.paddingEndProp] ); const temporaryPaddingEnd = `${(currentPaddingEnd || 0) + pad}px`; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1ecbb957dc45c..89a6d645ad018 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -167,7 +167,7 @@ patchedDependencies: '@expo/metro-config@58.0.14': 90fa980e8b6480631fb2fbb04559834e3c612db40c550cd828f11be297d8d760 '@expo/ui@58.0.20': 5a26480373850c1a7943919aa21f904151b335a0cb01042109e0746def37923e '@ff-labs/fff-node@0.11.0': cc71fcec015f4d39bc96ae2e2bf6b0ca678124c722c66a7841efce9d34b5983c - '@legendapp/list@3.3.5': 8e1963fb6a339b7061b0809a8dd6258fe43cd6467ef816fe92768506799d7f7b + '@legendapp/list@3.3.5': d202408fe00f17721654e5e24c0b964cc3f00d03ed0742879d4e85b3b6f50b26 '@pierre/diffs@1.5.2': 298e94372dbd51846a4e26ece2ecc3e22eb1f94b0450b1f1a9c6fec127809be7 '@react-native-ai/apple@0.12.0': 2d09870c2848d185cb05b53ed823a46e12dba519324d8dd8e584e28731990f9d '@react-native-menu/menu@2.0.0': a4866ecfcd44f318043de839d20110c17e14909004900f002ffe12050376f2ba @@ -340,7 +340,7 @@ importers: version: 58.0.20(patch_hash=5a26480373850c1a7943919aa21f904151b335a0cb01042109e0746def37923e)(@babel/core@7.29.7)(expo@58.0.14)(react-dom@19.3.0(react@19.3.0))(react-native-worklets@0.13.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) '@legendapp/list': specifier: 'catalog:' - version: 3.3.5(patch_hash=8e1963fb6a339b7061b0809a8dd6258fe43cd6467ef816fe92768506799d7f7b)(react-dom@19.3.0(react@19.3.0))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + version: 3.3.5(patch_hash=d202408fe00f17721654e5e24c0b964cc3f00d03ed0742879d4e85b3b6f50b26)(react-dom@19.3.0(react@19.3.0))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) '@material/material-color-utilities': specifier: 0.3.0 version: 0.3.0 @@ -816,7 +816,7 @@ importers: version: 0.9.0 '@legendapp/list': specifier: 'catalog:' - version: 3.3.5(patch_hash=8e1963fb6a339b7061b0809a8dd6258fe43cd6467ef816fe92768506799d7f7b)(react-dom@19.3.0(react@19.3.0))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + version: 3.3.5(patch_hash=d202408fe00f17721654e5e24c0b964cc3f00d03ed0742879d4e85b3b6f50b26)(react-dom@19.3.0(react@19.3.0))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) '@noble/hashes': specifier: 'catalog:' version: 1.8.0 @@ -15275,7 +15275,7 @@ snapshots: dependencies: jsbi: 4.3.2 - '@legendapp/list@3.3.5(patch_hash=8e1963fb6a339b7061b0809a8dd6258fe43cd6467ef816fe92768506799d7f7b)(react-dom@19.3.0(react@19.3.0))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)': + '@legendapp/list@3.3.5(patch_hash=d202408fe00f17721654e5e24c0b964cc3f00d03ed0742879d4e85b3b6f50b26)(react-dom@19.3.0(react@19.3.0))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)': dependencies: react: 19.3.0 use-sync-external-store: 1.6.0(react@19.3.0) From b35427fed27dc92e44775d83a6982bbb41485f3e Mon Sep 17 00:00:00 2001 From: Claude Belizaire <139932571+Claudesaul@users.noreply.github.com> Date: Wed, 14 Oct 2026 12:36:31 -0400 Subject: [PATCH 3/3] fix(web): measure picker rows with offset sizes --- patches/@legendapp__list@3.3.5.patch | 30 +++++++++++++--------------- pnpm-lock.yaml | 8 ++++---- 2 files changed, 18 insertions(+), 20 deletions(-) diff --git a/patches/@legendapp__list@3.3.5.patch b/patches/@legendapp__list@3.3.5.patch index 536b84116d54f..e79a4a7ff167c 100644 --- a/patches/@legendapp__list@3.3.5.patch +++ b/patches/@legendapp__list@3.3.5.patch @@ -1447,7 +1447,7 @@ index 95465f2..d7cbe1c 100644 } } diff --git a/react.js b/react.js -index 914d2da..57e1078 100644 +index 914d2da..86dbd9a 100644 --- a/react.js +++ b/react.js @@ -4702,7 +4702,8 @@ function maybeUpdateAnchoredEndSpace(ctx) { @@ -1473,18 +1473,17 @@ index 914d2da..57e1078 100644 } return nextSize; } -@@ -4956,7 +4963,9 @@ function measureContainersInLayoutEffect(ctx, targetContainerIds = null) { +@@ -4956,7 +4963,8 @@ function measureContainersInLayoutEffect(ctx, targetContainerIds = null) { const itemKey = peek$(ctx, `containerItemKey${containerId}`); const element = viewRef == null ? void 0 : viewRef.current; if (itemKey !== void 0 && element) { - const rect = element.getBoundingClientRect(); -+ const box = element.getBoundingClientRect(); -+ // getBoundingClientRect includes ancestor transforms (e.g. a popup's zoom-in), ResizeObserver doesn't. -+ const rect = Math.abs(box.width - element.offsetWidth) > 1 ? { height: element.offsetHeight, width: element.offsetWidth } : box; ++ // Unlike getBoundingClientRect, offset sizes ignore ancestor transforms (e.g. a popup's zoom-in), like ResizeObserver. ++ const rect = { height: element.offsetHeight, width: element.offsetWidth }; setContainerLayoutBaseline(element, rect); measurements.push({ containerId, -@@ -5651,6 +5660,18 @@ var ContainerSlot = typedMemo(function ContainerSlot2(props) { +@@ -5651,6 +5659,18 @@ var ContainerSlot = typedMemo(function ContainerSlot2(props) { }); // src/utils/reordering.ts @@ -1503,7 +1502,7 @@ index 914d2da..57e1078 100644 function sortDOMElements(container, indexByElement) { const elements = Array.from(container.children); if (elements.length <= 1) return elements; -@@ -5690,9 +5711,9 @@ function sortDOMElements(container, indexByElement) { +@@ -5690,9 +5710,9 @@ function sortDOMElements(container, indexByElement) { } } if (nextStableElement) { @@ -1515,7 +1514,7 @@ index 914d2da..57e1078 100644 } } } -@@ -6446,8 +6467,8 @@ function ScrollAdjust() { +@@ -6446,8 +6466,8 @@ function ScrollAdjust() { window.getComputedStyle(contentNode)[axis.paddingEndProp] ); const temporaryPaddingEnd = `${(currentPaddingEnd || 0) + pad}px`; @@ -1526,7 +1525,7 @@ index 914d2da..57e1078 100644 scrollBy(); if (resetPaddingRafRef.current !== void 0) { diff --git a/react.mjs b/react.mjs -index 95465f2..dd6ed31 100644 +index 95465f2..cff49dc 100644 --- a/react.mjs +++ b/react.mjs @@ -4681,7 +4681,8 @@ function maybeUpdateAnchoredEndSpace(ctx) { @@ -1552,18 +1551,17 @@ index 95465f2..dd6ed31 100644 } return nextSize; } -@@ -4935,7 +4942,9 @@ function measureContainersInLayoutEffect(ctx, targetContainerIds = null) { +@@ -4935,7 +4942,8 @@ function measureContainersInLayoutEffect(ctx, targetContainerIds = null) { const itemKey = peek$(ctx, `containerItemKey${containerId}`); const element = viewRef == null ? void 0 : viewRef.current; if (itemKey !== void 0 && element) { - const rect = element.getBoundingClientRect(); -+ const box = element.getBoundingClientRect(); -+ // getBoundingClientRect includes ancestor transforms (e.g. a popup's zoom-in), ResizeObserver doesn't. -+ const rect = Math.abs(box.width - element.offsetWidth) > 1 ? { height: element.offsetHeight, width: element.offsetWidth } : box; ++ // Unlike getBoundingClientRect, offset sizes ignore ancestor transforms (e.g. a popup's zoom-in), like ResizeObserver. ++ const rect = { height: element.offsetHeight, width: element.offsetWidth }; setContainerLayoutBaseline(element, rect); measurements.push({ containerId, -@@ -5630,6 +5639,18 @@ var ContainerSlot = typedMemo(function ContainerSlot2(props) { +@@ -5630,6 +5638,18 @@ var ContainerSlot = typedMemo(function ContainerSlot2(props) { }); // src/utils/reordering.ts @@ -1582,7 +1580,7 @@ index 95465f2..dd6ed31 100644 function sortDOMElements(container, indexByElement) { const elements = Array.from(container.children); if (elements.length <= 1) return elements; -@@ -5669,9 +5690,9 @@ function sortDOMElements(container, indexByElement) { +@@ -5669,9 +5689,9 @@ function sortDOMElements(container, indexByElement) { } } if (nextStableElement) { @@ -1594,7 +1592,7 @@ index 95465f2..dd6ed31 100644 } } } -@@ -6425,8 +6446,8 @@ function ScrollAdjust() { +@@ -6425,8 +6445,8 @@ function ScrollAdjust() { window.getComputedStyle(contentNode)[axis.paddingEndProp] ); const temporaryPaddingEnd = `${(currentPaddingEnd || 0) + pad}px`; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 89a6d645ad018..a0b7cdf878bc8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -167,7 +167,7 @@ patchedDependencies: '@expo/metro-config@58.0.14': 90fa980e8b6480631fb2fbb04559834e3c612db40c550cd828f11be297d8d760 '@expo/ui@58.0.20': 5a26480373850c1a7943919aa21f904151b335a0cb01042109e0746def37923e '@ff-labs/fff-node@0.11.0': cc71fcec015f4d39bc96ae2e2bf6b0ca678124c722c66a7841efce9d34b5983c - '@legendapp/list@3.3.5': d202408fe00f17721654e5e24c0b964cc3f00d03ed0742879d4e85b3b6f50b26 + '@legendapp/list@3.3.5': e6383c516a0d67b65333d6fd38d2203734bf24b054b0b0767b034189205aed32 '@pierre/diffs@1.5.2': 298e94372dbd51846a4e26ece2ecc3e22eb1f94b0450b1f1a9c6fec127809be7 '@react-native-ai/apple@0.12.0': 2d09870c2848d185cb05b53ed823a46e12dba519324d8dd8e584e28731990f9d '@react-native-menu/menu@2.0.0': a4866ecfcd44f318043de839d20110c17e14909004900f002ffe12050376f2ba @@ -340,7 +340,7 @@ importers: version: 58.0.20(patch_hash=5a26480373850c1a7943919aa21f904151b335a0cb01042109e0746def37923e)(@babel/core@7.29.7)(expo@58.0.14)(react-dom@19.3.0(react@19.3.0))(react-native-worklets@0.13.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) '@legendapp/list': specifier: 'catalog:' - version: 3.3.5(patch_hash=d202408fe00f17721654e5e24c0b964cc3f00d03ed0742879d4e85b3b6f50b26)(react-dom@19.3.0(react@19.3.0))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + version: 3.3.5(patch_hash=e6383c516a0d67b65333d6fd38d2203734bf24b054b0b0767b034189205aed32)(react-dom@19.3.0(react@19.3.0))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) '@material/material-color-utilities': specifier: 0.3.0 version: 0.3.0 @@ -816,7 +816,7 @@ importers: version: 0.9.0 '@legendapp/list': specifier: 'catalog:' - version: 3.3.5(patch_hash=d202408fe00f17721654e5e24c0b964cc3f00d03ed0742879d4e85b3b6f50b26)(react-dom@19.3.0(react@19.3.0))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + version: 3.3.5(patch_hash=e6383c516a0d67b65333d6fd38d2203734bf24b054b0b0767b034189205aed32)(react-dom@19.3.0(react@19.3.0))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) '@noble/hashes': specifier: 'catalog:' version: 1.8.0 @@ -15275,7 +15275,7 @@ snapshots: dependencies: jsbi: 4.3.2 - '@legendapp/list@3.3.5(patch_hash=d202408fe00f17721654e5e24c0b964cc3f00d03ed0742879d4e85b3b6f50b26)(react-dom@19.3.0(react@19.3.0))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)': + '@legendapp/list@3.3.5(patch_hash=e6383c516a0d67b65333d6fd38d2203734bf24b054b0b0767b034189205aed32)(react-dom@19.3.0(react@19.3.0))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)': dependencies: react: 19.3.0 use-sync-external-store: 1.6.0(react@19.3.0)