From 660e92bc0fd9b878ca8d50a8b0a66ac426fc2abb Mon Sep 17 00:00:00 2001 From: edenliu Date: Mon, 17 Aug 2026 11:20:47 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20Mermaid=20=E6=B5=AE?= =?UTF-8?q?=E5=B1=82=E5=B9=B6=E6=96=B0=E5=A2=9E=E5=9B=BE=E7=89=87=E9=A2=84?= =?UTF-8?q?=E8=A7=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/desktop/src/app/i18n/zh-CN.curated.ts | 3 + .../src/features/editor/FileTabView.test.tsx | 38 +++++ .../src/features/editor/FileTabView.tsx | 44 +++++ .../extensions/livePreviewBlocks.test.ts | 43 +++++ .../editor/extensions/livePreviewBlocks.ts | 15 ++ .../editor/extensions/livePreviewTheme.ts | 1 + .../src/features/editor/imagePreview.ts | 16 ++ .../mermaid/MermaidFullscreenHost.test.tsx | 51 ++++++ .../editor/mermaid/MermaidFullscreenHost.tsx | 154 ++++++++++++------ 9 files changed, 317 insertions(+), 48 deletions(-) create mode 100644 apps/desktop/src/features/editor/imagePreview.ts diff --git a/apps/desktop/src/app/i18n/zh-CN.curated.ts b/apps/desktop/src/app/i18n/zh-CN.curated.ts index 80b051c6..3dedf21b 100644 --- a/apps/desktop/src/app/i18n/zh-CN.curated.ts +++ b/apps/desktop/src/app/i18n/zh-CN.curated.ts @@ -331,6 +331,9 @@ export const CURATED_ZH_CN_TRANSLATIONS: Readonly> = { "Mermaid canvas": "Mermaid 画布", "Mermaid file mode": "Mermaid 文件模式", "Mermaid preview": "Mermaid 预览", + "Image preview": "图片预览", + "Image canvas": "图片画布", + "Open image preview": "放大查看图片", "Mermaid source is empty.": "Mermaid 源码为空。", "Open Mermaid fullscreen": "全屏查看 Mermaid", "Pinch to zoom • Scroll to pan • Esc to close": diff --git a/apps/desktop/src/features/editor/FileTabView.test.tsx b/apps/desktop/src/features/editor/FileTabView.test.tsx index 06996bba..5c128d93 100644 --- a/apps/desktop/src/features/editor/FileTabView.test.tsx +++ b/apps/desktop/src/features/editor/FileTabView.test.tsx @@ -23,6 +23,10 @@ import { setVaultEntries, } from "../../test/test-utils"; import { resetExternalReloadBaselinesForTests } from "./externalReloadBaselineCache"; +import { + OPEN_IMAGE_PREVIEW_EVENT, + type OpenImagePreviewPayload, +} from "./imagePreview"; function seedTrackedDiff( targetPath: string, @@ -111,6 +115,40 @@ describe("FileTabView", () => { ); }); + it("opens image files in the zoom preview by click", async () => { + const user = userEvent.setup(); + const previews: OpenImagePreviewPayload[] = []; + const handlePreview = (event: Event) => { + previews.push( + (event as CustomEvent).detail, + ); + }; + window.addEventListener(OPEN_IMAGE_PREVIEW_EVENT, handlePreview); + + setEditorTabs([ + { + id: "image-tab", + kind: "file", + relativePath: "assets/photo.webp", + title: "photo.webp", + path: "/vault/assets/photo.webp", + mimeType: "image/webp", + viewer: "image", + content: "", + }, + ]); + + renderComponent(); + await user.click( + screen.getByRole("button", { name: "Open image preview" }), + ); + + expect(previews).toEqual([ + expect.objectContaining({ alt: "photo.webp" }), + ]); + window.removeEventListener(OPEN_IMAGE_PREVIEW_EVENT, handlePreview); + }); + it("supports Command + wheel zoom from fit mode", async () => { setEditorTabs([ { diff --git a/apps/desktop/src/features/editor/FileTabView.tsx b/apps/desktop/src/features/editor/FileTabView.tsx index 8cb14062..7c18705d 100644 --- a/apps/desktop/src/features/editor/FileTabView.tsx +++ b/apps/desktop/src/features/editor/FileTabView.tsx @@ -26,6 +26,7 @@ import { formatZoomPercentage } from "../../app/utils/zoom"; import { FileTextTabView } from "./FileTextTabView"; import { CsvFileTabView } from "./CsvFileTabView"; import { HtmlTabView } from "./HtmlTabView"; +import { openImagePreview } from "./imagePreview"; const IMG_MIN_ZOOM = 0.1; const IMG_MAX_ZOOM = 10; @@ -234,6 +235,17 @@ function ImageFileViewer({ tab }: { tab: FileTab }) { return (
+