diff --git a/CHANGELOG.md b/CHANGELOG.md index 25e35a24..96ab77c0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -32,6 +32,16 @@ refactors, dependency updates, CI changes, and code cleanup do not belong here. --- +## [1.2.9] - 2026-08-17 + +### Added + +- Added click-to-open image previews for Markdown images and image files, with trackpad zoom, panning, toolbar zoom controls, reset, Escape-to-close, and a close button. + +### Fixed + +- Kept the original Mermaid editor and rendered diagram mounted while the full-screen preview is open, preventing editor rerenders and scroll-position shifts when the preview closes. + ## [1.2.8] - 2026-08-15 ### Changed diff --git a/apps/desktop/native-backend/Cargo.toml b/apps/desktop/native-backend/Cargo.toml index 6478585e..9a15de01 100644 --- a/apps/desktop/native-backend/Cargo.toml +++ b/apps/desktop/native-backend/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "neverwrite-native-backend" -version = "1.2.8" +version = "1.2.9" edition = "2021" [dependencies] diff --git a/apps/desktop/package-lock.json b/apps/desktop/package-lock.json index a1c43e9f..b40bf19b 100644 --- a/apps/desktop/package-lock.json +++ b/apps/desktop/package-lock.json @@ -1,12 +1,12 @@ { "name": "bifrostwrite-desktop", - "version": "1.2.8", + "version": "1.2.9", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "bifrostwrite-desktop", - "version": "1.2.8", + "version": "1.2.9", "hasInstallScript": true, "dependencies": { "@codemirror/commands": "^6.10.3", diff --git a/apps/desktop/package.json b/apps/desktop/package.json index c2e0d981..041395db 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -1,7 +1,7 @@ { "name": "bifrostwrite-desktop", "private": true, - "version": "1.2.8", + "version": "1.2.9", "homepage": "https://github.com/bifrost-proxy/BifrostWrite", "type": "module", "engines": { diff --git a/apps/desktop/src-tauri/Cargo.toml b/apps/desktop/src-tauri/Cargo.toml index b670a543..607d2577 100644 --- a/apps/desktop/src-tauri/Cargo.toml +++ b/apps/desktop/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "bifrostwrite-desktop" -version = "1.2.8" +version = "1.2.9" edition = "2021" description = "Tauri desktop shell for BifrostWrite" license = "Apache-2.0" diff --git a/apps/desktop/src-tauri/tauri.conf.json b/apps/desktop/src-tauri/tauri.conf.json index 566da2c1..71a30d37 100644 --- a/apps/desktop/src-tauri/tauri.conf.json +++ b/apps/desktop/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "$schema": "https://schema.tauri.app/config/2", "productName": "BifrostWrite", - "version": "1.2.8", + "version": "1.2.9", "identifier": "com.bifrostwrite.desktop", "build": { "beforeDevCommand": "npm run renderer:dev", 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 (
+