From d3204f6cd7772fe63d19ef8892664335d615c9de Mon Sep 17 00:00:00 2001 From: vishesh711 Date: Tue, 15 Jul 2025 12:36:53 -0400 Subject: feat: Add comprehensive keyboard shortcuts system for video editor - Implement industry-standard video editing shortcuts (Space, J/K/L, arrows) - Add playback controls: Space (play/pause), J/K/L (rewind/pause/forward) - Add navigation: arrow keys (frame stepping), Shift+arrows (5s jumps), Home/End - Add editing shortcuts: S (split at playhead), N (toggle snapping) - Add selection shortcuts: Ctrl/Cmd+A (select all), Ctrl/Cmd+D (duplicate) - Add keyboard shortcuts help dialog with categorized shortcuts display - Integrate help button in editor header for discoverability - Add TypeScript type declarations for better development experience - Fix Docker build environment variable validation issues All shortcuts follow professional video editing standards (Avid/Premiere/Final Cut). Context-aware shortcuts that don't interfere with text input fields. Toast notifications provide user feedback for better UX. --- apps/web/src/components/editor-header.tsx | 2 + apps/web/src/components/editor/timeline.tsx | 193 +++++++++++++++++- .../web/src/components/keyboard-shortcuts-help.tsx | 220 +++++++++++++++++++++ 3 files changed, 412 insertions(+), 3 deletions(-) create mode 100644 apps/web/src/components/keyboard-shortcuts-help.tsx (limited to 'apps/web/src/components') diff --git a/apps/web/src/components/editor-header.tsx b/apps/web/src/components/editor-header.tsx index c4081c75..3b51e182 100644 --- a/apps/web/src/components/editor-header.tsx +++ b/apps/web/src/components/editor-header.tsx @@ -7,6 +7,7 @@ import { useTimelineStore } from "@/stores/timeline-store"; import { HeaderBase } from "./header-base"; import { formatTimeCode } from "@/lib/time"; import { useProjectStore } from "@/stores/project-store"; +import { KeyboardShortcutsHelp } from "./keyboard-shortcuts-help"; export function EditorHeader() { const { getTotalDuration } = useTimelineStore(); @@ -43,6 +44,7 @@ export function EditorHeader() { const rightContent = (