summaryrefslogtreecommitdiff
path: root/apps/web/src
diff options
context:
space:
mode:
authoriza <59828082+izadoesdev@users.noreply.github.com>2025-06-24 08:00:20 +0300
committerGitHub <noreply@github.com>2025-06-24 08:00:20 +0300
commit973ee68ae285ae55c07ede266b44b514c1a0f7d8 (patch)
tree04b6fc53b0cb624b9a43176d04ae3a55b1fa164d /apps/web/src
parent55c95cd5748a250b9afd48062811990a7106e7a6 (diff)
parentc7f56d61d776f87607fc02e9f71bb4b8e1a49d98 (diff)
downloadopencut-973ee68ae285ae55c07ede266b44b514c1a0f7d8.tar.gz
Merge pull request #25 from andrewckor/playhead-browse
Implement click-to-seek functionality in timeline
Diffstat (limited to 'apps/web/src')
-rw-r--r--apps/web/src/app/editor/editor.css4
-rw-r--r--apps/web/src/app/editor/page.tsx1
-rw-r--r--apps/web/src/components/editor/timeline.tsx20
3 files changed, 22 insertions, 3 deletions
diff --git a/apps/web/src/app/editor/editor.css b/apps/web/src/app/editor/editor.css
new file mode 100644
index 00000000..f482c6de
--- /dev/null
+++ b/apps/web/src/app/editor/editor.css
@@ -0,0 +1,4 @@
+/* Prevent scroll jumping on Mac devices when using the editor */
+body {
+ overflow: hidden;
+} \ No newline at end of file
diff --git a/apps/web/src/app/editor/page.tsx b/apps/web/src/app/editor/page.tsx
index 64186a3e..2efb59cc 100644
--- a/apps/web/src/app/editor/page.tsx
+++ b/apps/web/src/app/editor/page.tsx
@@ -1,6 +1,7 @@
"use client";
import { useEffect } from "react";
+import "./editor.css";
import {
ResizablePanelGroup,
ResizablePanel,
diff --git a/apps/web/src/components/editor/timeline.tsx b/apps/web/src/components/editor/timeline.tsx
index 9af7a204..db810d30 100644
--- a/apps/web/src/components/editor/timeline.tsx
+++ b/apps/web/src/components/editor/timeline.tsx
@@ -290,11 +290,21 @@ export function Timeline() {
}
};
- // Deselect all clips when clicking empty timeline area
+ const handleSeekToPosition = (e: React.MouseEvent) => {
+ const rect = e.currentTarget.getBoundingClientRect();
+ const clickX = e.clientX - rect.left;
+ const clickedTime = clickX / (50 * zoomLevel);
+ const clampedTime = Math.max(0, Math.min(duration, clickedTime));
+
+ seek(clampedTime);
+ };
+
const handleTimelineAreaClick = (e: React.MouseEvent) => {
- // Only clear selection if the click target is the timeline background (not a child/clip)
if (e.target === e.currentTarget) {
clearSelectedClips();
+
+ // Calculate the clicked time position and seek to it
+ handleSeekToPosition(e);
}
};
@@ -487,10 +497,14 @@ export function Timeline() {
<div className="flex-1 relative overflow-hidden">
<ScrollArea className="w-full">
<div
- className="relative h-12 bg-muted/30"
+ className="relative h-12 bg-muted/30 cursor-pointer"
style={{
width: `${Math.max(1000, duration * 50 * zoomLevel)}px`,
}}
+ onClick={(e) => {
+ // Calculate the clicked time position and seek to it
+ handleSeekToPosition(e);
+ }}
>
{/* Time markers */}
{(() => {