From 274d03185b346fd715274018c6804d0229f2f74e Mon Sep 17 00:00:00 2001 From: Harshit Shukla <120409631+Harshitshukla0208@users.noreply.github.com> Date: Wed, 25 Jun 2025 04:54:56 +0530 Subject: fix(issue): Address issue #67 - [BUG] buttons jitter left and right --- apps/web/src/components/editor/timeline.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'apps/web/src/components/editor') diff --git a/apps/web/src/components/editor/timeline.tsx b/apps/web/src/components/editor/timeline.tsx index 12907738..cb375034 100644 --- a/apps/web/src/components/editor/timeline.tsx +++ b/apps/web/src/components/editor/timeline.tsx @@ -221,7 +221,7 @@ export function Timeline() { const clipLeft = clip.startTime * 50 * zoomLevel; const clipTop = trackIdx * 60; const clipBottom = clipTop + 60; - const clipRight = clipLeft + clipWidth; + const clipRight = clipLeft + 60; // Set a fixed width for time display if ( bx1 < clipRight && bx2 > clipLeft && -- cgit v1.3.1 From 84d206c01e1ae02d52e30e82982971436e98828c Mon Sep 17 00:00:00 2001 From: creotove Date: Wed, 25 Jun 2025 08:36:27 +0530 Subject: Fix: [BUG] buttons jitter left and right #67 --- apps/web/src/components/editor/timeline.tsx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'apps/web/src/components/editor') diff --git a/apps/web/src/components/editor/timeline.tsx b/apps/web/src/components/editor/timeline.tsx index 0d021604..81b99747 100644 --- a/apps/web/src/components/editor/timeline.tsx +++ b/apps/web/src/components/editor/timeline.tsx @@ -602,9 +602,10 @@ export function Timeline() {
{/* Time Display */} -
- {Math.floor(currentTime * 10) / 10}s /{" "} - {Math.floor(duration * 10) / 10}s +
+ {currentTime.toFixed(1)}s / {duration.toFixed(1)}s
-- cgit v1.3.1 From 7de09adce696442b0ba536bd3895f335246c744b Mon Sep 17 00:00:00 2001 From: creotove Date: Wed, 25 Jun 2025 08:51:17 +0530 Subject: Fix: unwanted seperator when there is a clip on track. --- apps/web/src/components/editor/timeline.tsx | 53 +++++++++++++++-------------- 1 file changed, 27 insertions(+), 26 deletions(-) (limited to 'apps/web/src/components/editor') diff --git a/apps/web/src/components/editor/timeline.tsx b/apps/web/src/components/editor/timeline.tsx index 81b99747..6c39c893 100644 --- a/apps/web/src/components/editor/timeline.tsx +++ b/apps/web/src/components/editor/timeline.tsx @@ -603,38 +603,39 @@ export function Timeline() { {/* Time Display */}
{currentTime.toFixed(1)}s / {duration.toFixed(1)}s
-
- {/* Test Clip Button - for debugging */} {tracks.length === 0 && ( - - - - - Add a test clip to try playback - + <> +
+ + + + + Add a test clip to try playback + + )}
-- cgit v1.3.1 From 411a9a5f1cdb4b52c65f4a1344c9be7694d130d7 Mon Sep 17 00:00:00 2001 From: Pulkit Garg Date: Wed, 25 Jun 2025 10:26:29 +0530 Subject: feature: add project name editing functionality --- apps/web/src/components/editor-header.tsx | 17 ++-- .../src/components/editor/project-name-editor.tsx | 110 +++++++++++++++++++++ apps/web/src/stores/project-store.ts | 13 +++ 3 files changed, 133 insertions(+), 7 deletions(-) create mode 100644 apps/web/src/components/editor/project-name-editor.tsx (limited to 'apps/web/src/components/editor') diff --git a/apps/web/src/components/editor-header.tsx b/apps/web/src/components/editor-header.tsx index c6cecbe8..6f9f0b2f 100644 --- a/apps/web/src/components/editor-header.tsx +++ b/apps/web/src/components/editor-header.tsx @@ -6,6 +6,7 @@ import { ChevronLeft, Download } from "lucide-react"; import { useProjectStore } from "@/stores/project-store"; import { useTimelineStore } from "@/stores/timeline-store"; import { HeaderBase } from "./header-base"; +import { ProjectNameEditor } from "./editor/project-name-editor"; export function EditorHeader() { const { activeProject } = useProjectStore(); @@ -24,13 +25,15 @@ export function EditorHeader() { }; const leftContent = ( - - - {activeProject?.name || "Loading..."} - +
+ + + + +
); const centerContent = ( diff --git a/apps/web/src/components/editor/project-name-editor.tsx b/apps/web/src/components/editor/project-name-editor.tsx new file mode 100644 index 00000000..aa0141ae --- /dev/null +++ b/apps/web/src/components/editor/project-name-editor.tsx @@ -0,0 +1,110 @@ +"use client"; + +import { useState, useRef, useEffect } from "react"; +import { Input } from "../ui/input"; +import { useProjectStore } from "@/stores/project-store"; +import { Edit2, Check, X } from "lucide-react"; +import { Button } from "../ui/button"; + +interface ProjectNameEditorProps { + className?: string; +} + +export function ProjectNameEditor({ className }: ProjectNameEditorProps) { + const { activeProject, updateProjectName } = useProjectStore(); + const [isEditing, setIsEditing] = useState(false); + const [editValue, setEditValue] = useState(""); + const inputRef = useRef(null); + + useEffect(() => { + if (activeProject) { + setEditValue(activeProject.name); + } + }, [activeProject]); + + useEffect(() => { + if (isEditing && inputRef.current) { + inputRef.current.focus(); + inputRef.current.select(); + } + }, [isEditing]); + + const handleStartEdit = () => { + if (activeProject) { + setEditValue(activeProject.name); + setIsEditing(true); + } + }; + + const handleSave = () => { + if (editValue.trim()) { + updateProjectName(editValue.trim()); + setIsEditing(false); + } + }; + + const handleCancel = () => { + if (activeProject) { + setEditValue(activeProject.name); + } + setIsEditing(false); + }; + + const handleKeyDown = (e: React.KeyboardEvent) => { + if (e.key === "Enter") { + handleSave(); + } else if (e.key === "Escape") { + handleCancel(); + } + }; + + if (!activeProject) { + return Loading...; + } + + if (isEditing) { + return ( +
+ setEditValue(e.target.value)} + onKeyDown={handleKeyDown} + className="h-7 text-sm px-3 py-1 min-w-[200px]" + size={1} + /> + + +
+ ); + } + + return ( +
+ {activeProject.name} + +
+ ); +} \ No newline at end of file diff --git a/apps/web/src/stores/project-store.ts b/apps/web/src/stores/project-store.ts index 734c07e2..0d0812cd 100644 --- a/apps/web/src/stores/project-store.ts +++ b/apps/web/src/stores/project-store.ts @@ -7,6 +7,7 @@ interface ProjectStore { // Actions createNewProject: (name: string) => void; closeProject: () => void; + updateProjectName: (name: string) => void; } export const useProjectStore = create((set) => ({ @@ -25,4 +26,16 @@ export const useProjectStore = create((set) => ({ closeProject: () => { set({ activeProject: null }); }, + + updateProjectName: (name: string) => { + set((state) => ({ + activeProject: state.activeProject + ? { + ...state.activeProject, + name, + updatedAt: new Date(), + } + : null, + })); + }, })); -- cgit v1.3.1 From 7444ab2894a03963c017ec4a788343e5749c405c Mon Sep 17 00:00:00 2001 From: Shubbu03 Date: Wed, 25 Jun 2025 12:13:16 +0530 Subject: UI fixes to the media-panel component --- apps/web/src/components/editor/media-panel.tsx | 72 ++++++++++++++++---------- 1 file changed, 44 insertions(+), 28 deletions(-) (limited to 'apps/web/src/components/editor') diff --git a/apps/web/src/components/editor/media-panel.tsx b/apps/web/src/components/editor/media-panel.tsx index 95cfa0a8..51a92fed 100644 --- a/apps/web/src/components/editor/media-panel.tsx +++ b/apps/web/src/components/editor/media-panel.tsx @@ -84,17 +84,20 @@ export function MediaPanel() { useEffect(() => { const filtered = mediaItems.filter((item) => { - if (mediaFilter && mediaFilter !== 'all' && item.type !== mediaFilter) { + if (mediaFilter && mediaFilter !== "all" && item.type !== mediaFilter) { return false; } - - if (searchQuery && !item.name.toLowerCase().includes(searchQuery.toLowerCase())) { + + if ( + searchQuery && + !item.name.toLowerCase().includes(searchQuery.toLowerCase()) + ) { return false; } - + return true; }); - + setFilteredMediaItems(filtered); }, [mediaItems, mediaFilter, searchQuery]); @@ -209,23 +212,23 @@ export function MediaPanel() { {/* Button to add/upload media */}
{/* Search and filter controls */} - - setSearchQuery(e.target.value)} - /> + + setSearchQuery(e.target.value)} + /> {/* Add media button */} -
+
@@ -276,7 +284,15 @@ export function MediaPanel() { {renderPreview(item)} - {item.name} + + {item.name.length > 8 + ? `${item.name.slice(0, 4)}...${item.name.slice(-3)}` + : item.name} + {/* Show remove button on hover */} -- cgit v1.3.1 From 4db515df518879ea7553db55faba5f092ca9e210 Mon Sep 17 00:00:00 2001 From: Shubbu03 Date: Wed, 25 Jun 2025 12:29:06 +0530 Subject: code rabbit suggested fix --- apps/web/src/components/editor/media-panel.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'apps/web/src/components/editor') diff --git a/apps/web/src/components/editor/media-panel.tsx b/apps/web/src/components/editor/media-panel.tsx index 51a92fed..f2b3f657 100644 --- a/apps/web/src/components/editor/media-panel.tsx +++ b/apps/web/src/components/editor/media-panel.tsx @@ -247,7 +247,7 @@ export function MediaPanel() { <> Add -- cgit v1.3.1 From 66eb6f13d52edfd7497d40315f16e490268632f4 Mon Sep 17 00:00:00 2001 From: DevloperAmanSingh Date: Wed, 25 Jun 2025 13:27:39 +0530 Subject: feat(preview-panel): add volume control and mute functionality to the video player --- apps/web/src/components/editor/preview-panel.tsx | 67 ++++++++++++++++++------ 1 file changed, 50 insertions(+), 17 deletions(-) (limited to 'apps/web/src/components/editor') diff --git a/apps/web/src/components/editor/preview-panel.tsx b/apps/web/src/components/editor/preview-panel.tsx index 624a549e..33bfe688 100644 --- a/apps/web/src/components/editor/preview-panel.tsx +++ b/apps/web/src/components/editor/preview-panel.tsx @@ -5,16 +5,17 @@ import { useMediaStore } from "@/stores/media-store"; import { usePlaybackStore } from "@/stores/playback-store"; import { VideoPlayer } from "@/components/ui/video-player"; import { Button } from "@/components/ui/button"; -import { Play, Pause } from "lucide-react"; +import { Play, Pause, Volume2, VolumeX } from "lucide-react"; import { useState, useRef } from "react"; // Debug flag - set to false to hide active clips info -const SHOW_DEBUG_INFO = process.env.NODE_ENV === 'development'; +const SHOW_DEBUG_INFO = process.env.NODE_ENV === "development"; export function PreviewPanel() { const { tracks } = useTimelineStore(); const { mediaItems } = useMediaStore(); - const { isPlaying, toggle, currentTime } = usePlaybackStore(); + const { isPlaying, toggle, currentTime, muted, toggleMute, volume } = + usePlaybackStore(); const [canvasSize, setCanvasSize] = useState({ width: 1920, height: 1080 }); const [showDebug, setShowDebug] = useState(SHOW_DEBUG_INFO); const previewRef = useRef(null); @@ -30,12 +31,14 @@ export function PreviewPanel() { tracks.forEach((track) => { track.clips.forEach((clip) => { const clipStart = clip.startTime; - const clipEnd = clip.startTime + (clip.duration - clip.trimStart - clip.trimEnd); + const clipEnd = + clip.startTime + (clip.duration - clip.trimStart - clip.trimEnd); if (currentTime >= clipStart && currentTime < clipEnd) { - const mediaItem = clip.mediaId === "test" - ? { type: "test", name: clip.name, url: "", thumbnailUrl: "" } - : mediaItems.find((item) => item.id === clip.mediaId); + const mediaItem = + clip.mediaId === "test" + ? { type: "test", name: clip.name, url: "", thumbnailUrl: "" } + : mediaItems.find((item) => item.id === clip.mediaId); if (mediaItem || clip.mediaId === "test") { activeClips.push({ clip, track, mediaItem }); @@ -134,13 +137,19 @@ export function PreviewPanel() {