From 3be195cc15f54bff333acaa3d296943d1f3d0104 Mon Sep 17 00:00:00 2001 From: xKeCo Date: Wed, 1 Apr 2026 01:41:20 -0500 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat:=20smooth=20auto-follow=20zoom?= =?UTF-8?q?=20with=20export=20parity?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/video-editor/SettingsPanel.tsx | 41 ++++++++++++++ src/components/video-editor/VideoEditor.tsx | 24 ++++++++ src/components/video-editor/VideoPlayback.tsx | 49 ++++++++++++++++- .../video-editor/projectPersistence.ts | 1 + src/components/video-editor/types.ts | 2 + .../video-editor/videoPlayback/constants.ts | 2 + .../videoPlayback/cursorFollowUtils.ts | 54 ++++++++++++++++++ .../videoPlayback/overlayUtils.ts | 2 +- .../videoPlayback/zoomRegionUtils.ts | 55 +++++++++++++++---- src/i18n/locales/en/settings.json | 8 ++- src/i18n/locales/es/settings.json | 8 ++- src/i18n/locales/zh-CN/settings.json | 8 ++- src/lib/exporter/frameRenderer.ts | 47 +++++++++++++++- src/lib/exporter/gifExporter.ts | 2 + src/lib/exporter/videoExporter.ts | 2 + 15 files changed, 287 insertions(+), 18 deletions(-) create mode 100644 src/components/video-editor/videoPlayback/cursorFollowUtils.ts diff --git a/src/components/video-editor/SettingsPanel.tsx b/src/components/video-editor/SettingsPanel.tsx index f5afe35..bec50c2 100644 --- a/src/components/video-editor/SettingsPanel.tsx +++ b/src/components/video-editor/SettingsPanel.tsx @@ -92,6 +92,9 @@ interface SettingsPanelProps { onWallpaperChange: (path: string) => void; selectedZoomDepth?: ZoomDepth | null; onZoomDepthChange?: (depth: ZoomDepth) => void; + selectedZoomFocusMode?: import("./types").ZoomFocusMode | null; + onZoomFocusModeChange?: (mode: import("./types").ZoomFocusMode) => void; + hasCursorTelemetry?: boolean; selectedZoomId?: string | null; onZoomDelete?: (id: string) => void; selectedTrimId?: string | null; @@ -161,6 +164,9 @@ export function SettingsPanel({ onWallpaperChange, selectedZoomDepth, onZoomDepthChange, + selectedZoomFocusMode, + onZoomFocusModeChange, + hasCursorTelemetry = false, selectedZoomId, onZoomDelete, selectedTrimId, @@ -500,6 +506,41 @@ export function SettingsPanel({ {!zoomEnabled && (

{t("zoom.selectRegion")}

)} + {zoomEnabled && hasCursorTelemetry && ( +
+ + {t("zoom.focusMode.title")} + +
+ {(["manual", "auto"] as const).map((mode) => { + const isActive = selectedZoomFocusMode === mode; + return ( + + ); + })} +
+ {selectedZoomFocusMode === "auto" && ( +

+ {t("zoom.focusMode.autoDescription")} +

+ )} +
+ )} {zoomEnabled && (