From 62d680056708965218153a44e39a514a51997b49 Mon Sep 17 00:00:00 2001 From: Amani Date: Sat, 15 Aug 2026 16:46:15 -0500 Subject: [PATCH 1/2] fix(editor): synchronize overlays with canvas scrolling --- app/note/[id].tsx | 37 ++++++++++---------- package.json | 2 +- src/components/editor/OverlayLayer.tsx | 47 +++++++++----------------- 3 files changed, 36 insertions(+), 50 deletions(-) diff --git a/app/note/[id].tsx b/app/note/[id].tsx index f75f641..46f1c49 100644 --- a/app/note/[id].tsx +++ b/app/note/[id].tsx @@ -793,26 +793,27 @@ export default function NoteScreen() { onCurrentPageChange={handleCurrentPageChange} onPagesChange={handlePagesChange} onPencilDoubleTap={handlePencilDoubleTap} + overlay={ + + } onTransformChange={handleTransform} /> - - ( - () => store.getSnapshot(), - ); + const transformRef = useRef(store.getSnapshot()); + const [hasTransform, setHasTransform] = useState(() => transformRef.current !== null); useEffect(() => { const unsub = store.subscribe(() => { - setTransform(store.getSnapshot()); + const next = store.getSnapshot(); + if (!next) return; + transformRef.current = next; + setHasTransform(true); }); return unsub; }, [store]); const handleTextToolTap = useCallback( (event: GestureResponderEvent) => { + const transform = transformRef.current; if (!transform || activeTool !== 'text') return; const { locationX, locationY } = event.nativeEvent; const coord = screenToPageCoord( @@ -122,7 +122,6 @@ export function OverlayLayer({ pageHeight, pageWidth, pages.length, - transform, ], ); @@ -140,7 +139,7 @@ export function OverlayLayer({ [activeTool, handleTextToolTap, onSelectionChange, selection], ); - if (!transform) { + if (!hasTransform) { return null; } @@ -159,20 +158,6 @@ export function OverlayLayer({ ) : null} {pages.map((page, pageIndex) => { - const rect = pageRectFromTransform( - transform, - pageIndex, - pageWidth, - pageHeight, - CONTENT_PADDING, - PAGE_GAP, - ); - if ( - rect.screenY + rect.height < -200 || - rect.screenY > transform.containerHeight + 200 - ) { - return null; - } const textBoxes = page.textBoxes ?? []; const elements = [...(page.insertedElements ?? [])].sort( (a, b) => (a.zIndex ?? 0) - (b.zIndex ?? 0), @@ -184,10 +169,10 @@ export function OverlayLayer({ style={[ styles.pageHost, { - left: rect.screenX, - top: rect.screenY, - width: rect.width, - height: rect.height, + left: 0, + top: pageIndex * (pageHeight + PAGE_GAP), + width: pageWidth, + height: pageHeight, }, ]} > @@ -204,7 +189,7 @@ export function OverlayLayer({ Date: Sat, 15 Aug 2026 16:58:21 -0500 Subject: [PATCH 2/2] fix(deps): lock mobile ink 0.3.4 --- package-lock.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0e49ca8..60af6d6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "license": "Apache-2.0", "dependencies": { "@expo/vector-icons": "^15.0.3", - "@mathnotes/mobile-ink": "0.3.3", + "@mathnotes/mobile-ink": "0.3.4", "@react-native-async-storage/async-storage": "2.2.0", "@shopify/react-native-skia": "2.2.12", "expo": "54.0.34", @@ -2564,9 +2564,9 @@ } }, "node_modules/@mathnotes/mobile-ink": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@mathnotes/mobile-ink/-/mobile-ink-0.3.3.tgz", - "integrity": "sha512-xVmfoEV7B7EJ29xVvWzWNpipeQktythLNFKo4cd8PzXp3gLPzpeMk2WgKCrv0mqMitWxB9sdeAvDLnktieGE6A==", + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@mathnotes/mobile-ink/-/mobile-ink-0.3.4.tgz", + "integrity": "sha512-3PqHlAekzEwcytOJ/59wJcCDenb9HCkeNANS3sK4/jkamlt7DQrskxmqVKOGZJnhPklaKlBqekjv18K2F8cgpg==", "license": "Apache-2.0", "peerDependencies": { "@shopify/react-native-skia": ">=2.0.0",