From 43c1955147b1e7625c8815da1ee2c3a130829084 Mon Sep 17 00:00:00 2001 From: Alex MacCaw Date: Wed, 8 Jul 2026 11:04:32 +0100 Subject: [PATCH 1/2] Widen the image-click payload for meowdown's touch taps meowdown's iOS keyboard-flash fix (prosekit/meowdown#263) delivers the tap's cancelled touchend instead of a synthetic click, widening ImageClickPayload.event to MouseEvent | TouchEvent. Mirror that in the lightbox handler and the editor-mock props so the ^0.39.x bump typechecks; the handler only reads event.target, which both carry. Co-Authored-By: Claude Fable 5 --- apps/desktop/src/editor/note-editor.test.tsx | 2 +- apps/desktop/src/editor/note-editor.tsx | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/apps/desktop/src/editor/note-editor.test.tsx b/apps/desktop/src/editor/note-editor.test.tsx index 44d902fa..35856edf 100644 --- a/apps/desktop/src/editor/note-editor.test.tsx +++ b/apps/desktop/src/editor/note-editor.test.tsx @@ -16,7 +16,7 @@ interface CapturedEditorProps { timeFormat?: '12' | '24' children?: ReactNode resolveImageUrl?: (src: string) => string | undefined - onImageClick?: (payload: { src: string; alt: string; event: MouseEvent }) => void + onImageClick?: (payload: { src: string; alt: string; event: MouseEvent | TouchEvent }) => void onLinkClick?: (payload: { href: string; event: MouseEvent }) => void onTagClick?: (payload: { tag: string; event: MouseEvent }) => void onFilePaste?: (file: File) => Promise diff --git a/apps/desktop/src/editor/note-editor.tsx b/apps/desktop/src/editor/note-editor.tsx index df185368..6d9ad685 100644 --- a/apps/desktop/src/editor/note-editor.tsx +++ b/apps/desktop/src/editor/note-editor.tsx @@ -348,7 +348,10 @@ export function NoteEditor({ [], ) const handleImageClick = useCallback( - ({ src, alt, event }: { src: string; alt: string; event: MouseEvent }) => { + // Touch surfaces deliver the tap's `touchend` instead of a click — + // meowdown cancels it so iOS WebKit can't focus the editor (and raise + // the keyboard) under the opening lightbox. + ({ src, alt, event }: { src: string; alt: string; event: MouseEvent | TouchEvent }) => { const displayUrl = resolveImageUrlRef.current?.(src) ?? null if (displayUrl === null) { return From e65a52ee6107a79438002aef5fc92fd087c454b9 Mon Sep 17 00:00:00 2001 From: Alex MacCaw Date: Wed, 8 Jul 2026 11:50:45 +0100 Subject: [PATCH 2/2] Bump meowdown to 0.40.1 for the touch-tap keyboard fix prosekit/meowdown#263 landed as 89aa7e7 and shipped in 0.40.0 (0.40.1 is the latest patch). Bumping the pinned range since ^0.39.0 does not resolve past 0.39.x for a 0.x package. Co-Authored-By: Claude Fable 5 --- apps/desktop/package.json | 4 ++-- pnpm-lock.yaml | 32 +++++++++++++++++++++----------- 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/apps/desktop/package.json b/apps/desktop/package.json index 0dd4adac..2b5ae8bb 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -23,8 +23,8 @@ "@dnd-kit/core": "^6.3.1", "@dnd-kit/sortable": "^10.0.0", "@dnd-kit/utilities": "^3.2.2", - "@meowdown/core": "^0.39.0", - "@meowdown/react": "^0.39.0", + "@meowdown/core": "^0.40.1", + "@meowdown/react": "^0.40.1", "@reflect/core": "workspace:*", "@reflect/db": "workspace:*", "@reflect/design-system": "workspace:*", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ca02d332..d75315da 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -34,11 +34,11 @@ importers: specifier: ^3.2.2 version: 3.2.2(react@19.2.7) '@meowdown/core': - specifier: ^0.39.0 - version: 0.39.0(@shikijs/types@4.3.1)(@types/hast@3.0.4)(prosemirror-model@1.25.9)(prosemirror-state@1.4.4)(prosemirror-transform@1.12.0)(prosemirror-view@1.42.0) + specifier: ^0.40.1 + version: 0.40.1(@shikijs/types@4.3.1)(@types/hast@3.0.4)(prosemirror-model@1.25.9)(prosemirror-state@1.4.4)(prosemirror-transform@1.12.0)(prosemirror-view@1.42.0) '@meowdown/react': - specifier: ^0.39.0 - version: 0.39.0(@lezer/common@1.5.2)(@lezer/highlight@1.2.3)(@shikijs/types@4.3.1)(@types/hast@3.0.4)(@types/react@19.2.17)(date-fns@4.4.0)(prosemirror-model@1.25.9)(prosemirror-state@1.4.4)(prosemirror-transform@1.12.0)(prosemirror-view@1.42.0)(react-dom@19.2.7)(react@19.2.7) + specifier: ^0.40.1 + version: 0.40.1(@lezer/common@1.5.2)(@lezer/highlight@1.2.3)(@shikijs/types@4.3.1)(@types/hast@3.0.4)(@types/react@19.2.17)(date-fns@4.4.0)(prosemirror-model@1.25.9)(prosemirror-state@1.4.4)(prosemirror-transform@1.12.0)(prosemirror-view@1.42.0)(react-dom@19.2.7)(react@19.2.7) '@reflect/core': specifier: workspace:* version: link:../../packages/core @@ -367,6 +367,7 @@ packages: '@aklinker1/rollup-plugin-visualizer@5.12.0': resolution: {integrity: sha512-X24LvEGw6UFmy0lpGJDmXsMyBD58XmX1bbwsaMLhNoM+UMQfQ3b2RtC+nz4b/NoRK5r6QJSKJHBNVeUdwqybaQ==} engines: {node: '>=14'} + hasBin: true peerDependencies: rollup: 2.x || 3.x || 4.x peerDependenciesMeta: @@ -1044,11 +1045,11 @@ packages: '@marijn/find-cluster-break@1.0.3': resolution: {integrity: sha512-FY+MKLBoTsLNJF/eLWaOsXGdz6uh3Iu1axjPf6TUq92IYumcTcXWHoS747JARLkcdlJ/Waiaxc5wQfFO8jC6NA==} - '@meowdown/core@0.39.0': - resolution: {integrity: sha512-dGI13QEOpV+AT8mnBUNuSQxpudF/LMiYF/+WWP7no0VRTt49irMGaYQHvUjw3FyPENmtloa2nZty6d/XetMsPw==} + '@meowdown/core@0.40.1': + resolution: {integrity: sha512-JOOkBLdswEJVyIWU2vp2QFb6ptlvTCpImdynEcjj6+2rJrBoSha8YAoqGhdzoop+cMtIluqC5faOpi2T7i1unA==} - '@meowdown/react@0.39.0': - resolution: {integrity: sha512-3QB6H1XSn7QNCq4iFPlOFbRxAqOPO7qd/dzf4zYbRDgi28WsQeC1FAedrilOZ90auKI755D1QC50Bjbs+OWkKQ==} + '@meowdown/react@0.40.1': + resolution: {integrity: sha512-p5jn0Omzw+SxYyhHMjLwR9MI2IXvXNw/hjueGunctt1fbhIMW9OuEeLe4taPOD80OKKJq6aAfgnYv1mDwBBMTA==} peerDependencies: react: ^19.0.0 react-dom: ^19.0.0 @@ -3477,6 +3478,7 @@ packages: eslint@10.5.0: resolution: {integrity: sha512-1y+7C+vi12bUK1IpZeaV3gsH9fHLBmPvYmPx42pvT/E9yG0IC8g3PUZZgp0+JLJl7ZDK0flc2gc+Aw9dpCvIsQ==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} + hasBin: true peerDependencies: jiti: '*' peerDependenciesMeta: @@ -4108,6 +4110,7 @@ packages: katex@0.17.0: resolution: {integrity: sha512-Vdw0ATsQ9V+LuegM/BTwQqV/6cTl5lbGcIrU+BCgLxyf6bo38ybOr372tuSIxir3CN720flu1meYR6XzNMwQnw==} + hasBin: true keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} @@ -4127,6 +4130,7 @@ packages: kysely-codegen@0.20.0: resolution: {integrity: sha512-LSi2KBG7uDmNCZ+XurLSA9LH7XFyyoQ6xb5DLJSInPTSYLVApjOP2KwO8mSaREWTtoX+C2AG2GTlYR0DLjTbcA==} engines: {node: '>=20.0.0'} + hasBin: true peerDependencies: '@libsql/kysely-libsql': '>=0.3.0 <0.5.0' '@tediousjs/connection-string': ^1.0.0 @@ -4687,6 +4691,7 @@ packages: oxlint@1.71.0: resolution: {integrity: sha512-U1m1X+C0vDj7DC1e13IoZULzEcPczE7UOMTs8VlZGHUEIUaSTZKo5qkPsQEfzpgnQ29Pea/w3Xntk62UCecxZw==} engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true peerDependencies: oxlint-tsgolint: '>=0.22.1' vite-plus: '*' @@ -5666,6 +5671,7 @@ packages: update-browserslist-db@1.2.3: resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -5758,6 +5764,7 @@ packages: vite@7.3.5: resolution: {integrity: sha512-KuOaNhcnGFN2zIPGA7wRmzF+lJA1sea7rHq17aiJ++9lzY1WWG6Jpwqwe1KNbRVPIqHmr8GLYx7jbrQcN/7/ww==} engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true peerDependencies: '@types/node': ^20.19.0 || >=22.12.0 jiti: '>=1.21.0' @@ -5797,6 +5804,7 @@ packages: vite@8.1.0: resolution: {integrity: sha512-BuJcQK/56NQTWDGn4ABea3q4SSBdNPWwNZKTkkUpcMPnLoquSYH8llRtSUIgoL1KSCpHt5eghLShn50mH36y7Q==} engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true peerDependencies: '@types/node': ^20.19.0 || >=22.12.0 '@vitejs/devtools': ^0.3.0 @@ -5839,6 +5847,7 @@ packages: vitest@4.1.9: resolution: {integrity: sha512-nE3/LEyc0z87uHYLZebqCUOaJr2hdtuPp7BQ4BosVFnfltxgAvMG08NyrSGlPpOUWvR27c5flSmYFTNr78L9GQ==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} + hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@opentelemetry/api': ^1.9.0 @@ -5967,6 +5976,7 @@ packages: wxt@0.20.27: resolution: {integrity: sha512-dm6yixz2awM4YMqpTJnsCa8aOPiTrjiIjbWslgR5hCjgwhuft+hLlla339Dt7gIKwQloee4oOruoK++vaX0APA==} engines: {bun: '>=1.2.0', node: '>=20.12.0'} + hasBin: true peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 peerDependenciesMeta: @@ -6960,7 +6970,7 @@ snapshots: '@marijn/find-cluster-break@1.0.3': {} - '@meowdown/core@0.39.0(@shikijs/types@4.3.1)(@types/hast@3.0.4)(prosemirror-model@1.25.9)(prosemirror-state@1.4.4)(prosemirror-transform@1.12.0)(prosemirror-view@1.42.0)': + '@meowdown/core@0.40.1(@shikijs/types@4.3.1)(@types/hast@3.0.4)(prosemirror-model@1.25.9)(prosemirror-state@1.4.4)(prosemirror-transform@1.12.0)(prosemirror-view@1.42.0)': dependencies: '@codemirror/language': 6.12.4 '@codemirror/language-data': 6.5.2 @@ -6998,10 +7008,10 @@ snapshots: - y-prosemirror - yjs - '@meowdown/react@0.39.0(@lezer/common@1.5.2)(@lezer/highlight@1.2.3)(@shikijs/types@4.3.1)(@types/hast@3.0.4)(@types/react@19.2.17)(date-fns@4.4.0)(prosemirror-model@1.25.9)(prosemirror-state@1.4.4)(prosemirror-transform@1.12.0)(prosemirror-view@1.42.0)(react-dom@19.2.7)(react@19.2.7)': + '@meowdown/react@0.40.1(@lezer/common@1.5.2)(@lezer/highlight@1.2.3)(@shikijs/types@4.3.1)(@types/hast@3.0.4)(@types/react@19.2.17)(date-fns@4.4.0)(prosemirror-model@1.25.9)(prosemirror-state@1.4.4)(prosemirror-transform@1.12.0)(prosemirror-view@1.42.0)(react-dom@19.2.7)(react@19.2.7)': dependencies: '@base-ui/react': 1.6.0(@types/react@19.2.17)(date-fns@4.4.0)(react-dom@19.2.7)(react@19.2.7) - '@meowdown/core': 0.39.0(@shikijs/types@4.3.1)(@types/hast@3.0.4)(prosemirror-model@1.25.9)(prosemirror-state@1.4.4)(prosemirror-transform@1.12.0)(prosemirror-view@1.42.0) + '@meowdown/core': 0.40.1(@shikijs/types@4.3.1)(@types/hast@3.0.4)(prosemirror-model@1.25.9)(prosemirror-state@1.4.4)(prosemirror-transform@1.12.0)(prosemirror-view@1.42.0) '@ocavue/utils': 1.7.0 '@prosekit/core': 0.13.0-beta.5(prosemirror-model@1.25.9)(prosemirror-state@1.4.4)(prosemirror-transform@1.12.0) '@prosekit/pm': 0.1.19-beta.2