From 6f099b3483137fe2e3482206a6f41a844f361d66 Mon Sep 17 00:00:00 2001 From: Etienne Lescot Date: Sun, 15 Mar 2026 10:46:37 +0100 Subject: [PATCH] feat: add cursor overlay pipeline --- src/assets/cursors/Cursor=Beachball.svg | 46 ++ src/assets/cursors/Cursor=Cross.svg | 5 + src/assets/cursors/Cursor=Default.svg | 5 + src/assets/cursors/Cursor=Hand-(Grabbing).svg | 5 + src/assets/cursors/Cursor=Hand-(Open).svg | 5 + src/assets/cursors/Cursor=Hand-(Pointing).svg | 5 + src/assets/cursors/Cursor=Menu.svg | 18 + src/assets/cursors/Cursor=Move.svg | 5 + src/assets/cursors/Cursor=Resize-(Down).svg | 5 + src/assets/cursors/Cursor=Resize-(Left).svg | 5 + .../cursors/Cursor=Resize-(Left-Right).svg | 5 + src/assets/cursors/Cursor=Resize-(Right).svg | 5 + src/assets/cursors/Cursor=Resize-(Up).svg | 5 + .../cursors/Cursor=Resize-(Up-Down).svg | 5 + .../Cursor=Resize-North-East-South-West.svg | 5 + .../cursors/Cursor=Resize-North-South.svg | 5 + .../Cursor=Resize-North-West-South-East.svg | 5 + .../cursors/Cursor=Resize-West-East.svg | 5 + src/assets/cursors/Cursor=Text-Cursor.svg | 5 + src/assets/cursors/Cursor=Zoom-In.svg | 8 + src/assets/cursors/Cursor=Zoom-Out.svg | 6 + src/components/video-editor/SettingsPanel.tsx | 23 +- src/components/video-editor/VideoEditor.tsx | 26 +- src/components/video-editor/VideoPlayback.tsx | 109 ++- .../video-editor/projectPersistence.ts | 47 +- src/components/video-editor/types.ts | 24 + .../videoPlayback/cursorRenderer.ts | 766 ++++++++++++++++++ .../videoPlayback/motionSmoothing.ts | 149 ++++ .../videoPlayback/uploadedCursorAssets.ts | 70 ++ 29 files changed, 1303 insertions(+), 74 deletions(-) create mode 100644 src/assets/cursors/Cursor=Beachball.svg create mode 100644 src/assets/cursors/Cursor=Cross.svg create mode 100644 src/assets/cursors/Cursor=Default.svg create mode 100644 src/assets/cursors/Cursor=Hand-(Grabbing).svg create mode 100644 src/assets/cursors/Cursor=Hand-(Open).svg create mode 100644 src/assets/cursors/Cursor=Hand-(Pointing).svg create mode 100644 src/assets/cursors/Cursor=Menu.svg create mode 100644 src/assets/cursors/Cursor=Move.svg create mode 100644 src/assets/cursors/Cursor=Resize-(Down).svg create mode 100644 src/assets/cursors/Cursor=Resize-(Left).svg create mode 100644 src/assets/cursors/Cursor=Resize-(Left-Right).svg create mode 100644 src/assets/cursors/Cursor=Resize-(Right).svg create mode 100644 src/assets/cursors/Cursor=Resize-(Up).svg create mode 100644 src/assets/cursors/Cursor=Resize-(Up-Down).svg create mode 100644 src/assets/cursors/Cursor=Resize-North-East-South-West.svg create mode 100644 src/assets/cursors/Cursor=Resize-North-South.svg create mode 100644 src/assets/cursors/Cursor=Resize-North-West-South-East.svg create mode 100644 src/assets/cursors/Cursor=Resize-West-East.svg create mode 100644 src/assets/cursors/Cursor=Text-Cursor.svg create mode 100644 src/assets/cursors/Cursor=Zoom-In.svg create mode 100644 src/assets/cursors/Cursor=Zoom-Out.svg create mode 100644 src/components/video-editor/videoPlayback/cursorRenderer.ts create mode 100644 src/components/video-editor/videoPlayback/motionSmoothing.ts create mode 100644 src/components/video-editor/videoPlayback/uploadedCursorAssets.ts diff --git a/src/assets/cursors/Cursor=Beachball.svg b/src/assets/cursors/Cursor=Beachball.svg new file mode 100644 index 0000000..30bdbe5 --- /dev/null +++ b/src/assets/cursors/Cursor=Beachball.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/cursors/Cursor=Cross.svg b/src/assets/cursors/Cursor=Cross.svg new file mode 100644 index 0000000..b404553 --- /dev/null +++ b/src/assets/cursors/Cursor=Cross.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/cursors/Cursor=Default.svg b/src/assets/cursors/Cursor=Default.svg new file mode 100644 index 0000000..f76f31f --- /dev/null +++ b/src/assets/cursors/Cursor=Default.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/cursors/Cursor=Hand-(Grabbing).svg b/src/assets/cursors/Cursor=Hand-(Grabbing).svg new file mode 100644 index 0000000..0827867 --- /dev/null +++ b/src/assets/cursors/Cursor=Hand-(Grabbing).svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/cursors/Cursor=Hand-(Open).svg b/src/assets/cursors/Cursor=Hand-(Open).svg new file mode 100644 index 0000000..4ceafb0 --- /dev/null +++ b/src/assets/cursors/Cursor=Hand-(Open).svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/cursors/Cursor=Hand-(Pointing).svg b/src/assets/cursors/Cursor=Hand-(Pointing).svg new file mode 100644 index 0000000..19a70a6 --- /dev/null +++ b/src/assets/cursors/Cursor=Hand-(Pointing).svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/cursors/Cursor=Menu.svg b/src/assets/cursors/Cursor=Menu.svg new file mode 100644 index 0000000..3489257 --- /dev/null +++ b/src/assets/cursors/Cursor=Menu.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/assets/cursors/Cursor=Move.svg b/src/assets/cursors/Cursor=Move.svg new file mode 100644 index 0000000..50e56b7 --- /dev/null +++ b/src/assets/cursors/Cursor=Move.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/cursors/Cursor=Resize-(Down).svg b/src/assets/cursors/Cursor=Resize-(Down).svg new file mode 100644 index 0000000..fba3672 --- /dev/null +++ b/src/assets/cursors/Cursor=Resize-(Down).svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/cursors/Cursor=Resize-(Left).svg b/src/assets/cursors/Cursor=Resize-(Left).svg new file mode 100644 index 0000000..6e21fb7 --- /dev/null +++ b/src/assets/cursors/Cursor=Resize-(Left).svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/cursors/Cursor=Resize-(Left-Right).svg b/src/assets/cursors/Cursor=Resize-(Left-Right).svg new file mode 100644 index 0000000..7021d22 --- /dev/null +++ b/src/assets/cursors/Cursor=Resize-(Left-Right).svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/cursors/Cursor=Resize-(Right).svg b/src/assets/cursors/Cursor=Resize-(Right).svg new file mode 100644 index 0000000..1ce801c --- /dev/null +++ b/src/assets/cursors/Cursor=Resize-(Right).svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/cursors/Cursor=Resize-(Up).svg b/src/assets/cursors/Cursor=Resize-(Up).svg new file mode 100644 index 0000000..9c4ac0f --- /dev/null +++ b/src/assets/cursors/Cursor=Resize-(Up).svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/cursors/Cursor=Resize-(Up-Down).svg b/src/assets/cursors/Cursor=Resize-(Up-Down).svg new file mode 100644 index 0000000..b01a40e --- /dev/null +++ b/src/assets/cursors/Cursor=Resize-(Up-Down).svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/cursors/Cursor=Resize-North-East-South-West.svg b/src/assets/cursors/Cursor=Resize-North-East-South-West.svg new file mode 100644 index 0000000..1185c1f --- /dev/null +++ b/src/assets/cursors/Cursor=Resize-North-East-South-West.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/cursors/Cursor=Resize-North-South.svg b/src/assets/cursors/Cursor=Resize-North-South.svg new file mode 100644 index 0000000..57eaa05 --- /dev/null +++ b/src/assets/cursors/Cursor=Resize-North-South.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/cursors/Cursor=Resize-North-West-South-East.svg b/src/assets/cursors/Cursor=Resize-North-West-South-East.svg new file mode 100644 index 0000000..f00fc87 --- /dev/null +++ b/src/assets/cursors/Cursor=Resize-North-West-South-East.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/cursors/Cursor=Resize-West-East.svg b/src/assets/cursors/Cursor=Resize-West-East.svg new file mode 100644 index 0000000..ef1929f --- /dev/null +++ b/src/assets/cursors/Cursor=Resize-West-East.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/cursors/Cursor=Text-Cursor.svg b/src/assets/cursors/Cursor=Text-Cursor.svg new file mode 100644 index 0000000..1bfd080 --- /dev/null +++ b/src/assets/cursors/Cursor=Text-Cursor.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/cursors/Cursor=Zoom-In.svg b/src/assets/cursors/Cursor=Zoom-In.svg new file mode 100644 index 0000000..8ec9b3c --- /dev/null +++ b/src/assets/cursors/Cursor=Zoom-In.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/assets/cursors/Cursor=Zoom-Out.svg b/src/assets/cursors/Cursor=Zoom-Out.svg new file mode 100644 index 0000000..810878b --- /dev/null +++ b/src/assets/cursors/Cursor=Zoom-Out.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/components/video-editor/SettingsPanel.tsx b/src/components/video-editor/SettingsPanel.tsx index 9ef66b1..110f025 100644 --- a/src/components/video-editor/SettingsPanel.tsx +++ b/src/components/video-editor/SettingsPanel.tsx @@ -537,6 +537,7 @@ export function SettingsPanel({ }, [cropRegion, videoWidth, videoHeight], ); + const [showCropDropdown, setShowCropDropdown] = useState(false); const zoomEnabled = Boolean(selectedZoomDepth); const trimEnabled = Boolean(selectedTrimId); @@ -625,20 +626,6 @@ export function SettingsPanel({ } }; - const handleCropToggle = () => { - if (!showCropModal && cropRegion) { - cropSnapshotRef.current = { ...cropRegion }; - } - setShowCropModal(!showCropModal); - }; - - const handleCropCancel = () => { - if (cropSnapshotRef.current && onCropChange) { - onCropChange(cropSnapshotRef.current); - } - setShowCropModal(false); - }; - // Find selected annotation const selectedAnnotation = selectedAnnotationId ? annotationRegions.find((a) => a.id === selectedAnnotationId) @@ -1745,11 +1732,11 @@ export function SettingsPanel({ - {showCropModal && cropRegion && onCropChange && ( + {showCropDropdown && cropRegion && onCropChange && ( <>
setShowCropDropdown(false)} />
@@ -1760,7 +1747,7 @@ export function SettingsPanel({