diff --git a/.cursor/debug.log b/.cursor/debug.log
new file mode 100644
index 00000000..af2bcd54
--- /dev/null
+++ b/.cursor/debug.log
@@ -0,0 +1,11 @@
+{"sessionId":"debug-session","runId":"pre-fix","hypothesisId":"D","location":"use-keybindings.ts:16","message":"keybindings_listener_mount","data":{"keybindingsEnabled":false,"isRecording":false,"keybindingsCount":24},"timestamp":1769522187702}
+{"sessionId":"debug-session","runId":"pre-fix","hypothesisId":"D","location":"use-keybindings.ts:16","message":"keybindings_listener_mount","data":{"keybindingsEnabled":false,"isRecording":false,"keybindingsCount":24},"timestamp":1769522187709}
+{"sessionId":"debug-session","runId":"pre-fix","hypothesisId":"D","location":"use-keybindings.ts:16","message":"keybindings_listener_mount","data":{"keybindingsEnabled":true,"isRecording":false,"keybindingsCount":24},"timestamp":1769522187729}
+{"sessionId":"debug-session","runId":"pre-fix","hypothesisId":"E","location":"use-keybindings.ts:23","message":"keydown_received","data":{"key":" ","code":"Space","ctrlKey":false,"metaKey":false,"altKey":false,"shiftKey":false,"targetTag":"BODY"},"timestamp":1769522205815}
+{"sessionId":"debug-session","runId":"pre-fix","hypothesisId":"D","location":"use-keybindings.ts:107","message":"invoking_action","data":{"boundAction":"toggle-play","binding":"space"},"timestamp":1769522205816}
+{"sessionId":"debug-session","runId":"pre-fix","hypothesisId":"B","location":"use-keybindings.ts:70","message":"binding_computed","data":{"binding":"space"},"timestamp":1769522205816}
+{"sessionId":"debug-session","runId":"pre-fix","hypothesisId":"D","location":"registry.ts:63","message":"invoke_action_dispatch","data":{"action":"toggle-play","handlersCount":1,"hasHandlers":true,"trigger":"keypress"},"timestamp":1769522205817}
+{"sessionId":"debug-session","runId":"pre-fix","hypothesisId":"E","location":"use-keybindings.ts:23","message":"keydown_received","data":{"key":" ","code":"Space","ctrlKey":false,"metaKey":false,"altKey":false,"shiftKey":false,"targetTag":"BODY"},"timestamp":1769522206526}
+{"sessionId":"debug-session","runId":"pre-fix","hypothesisId":"D","location":"use-keybindings.ts:107","message":"invoking_action","data":{"boundAction":"toggle-play","binding":"space"},"timestamp":1769522206526}
+{"sessionId":"debug-session","runId":"pre-fix","hypothesisId":"D","location":"registry.ts:63","message":"invoke_action_dispatch","data":{"action":"toggle-play","handlersCount":1,"hasHandlers":true,"trigger":"keypress"},"timestamp":1769522206526}
+{"sessionId":"debug-session","runId":"pre-fix","hypothesisId":"B","location":"use-keybindings.ts:70","message":"binding_computed","data":{"binding":"space"},"timestamp":1769522206526}
diff --git a/.cursor/rules/codebase-index.mdc b/.cursor/rules/codebase-index.mdc
index ce51e890..6ef001f5 100644
--- a/.cursor/rules/codebase-index.mdc
+++ b/.cursor/rules/codebase-index.mdc
@@ -113,6 +113,7 @@ index.ts
renderer: RendererManager
save: SaveManager
audio: AudioManager
+ selection: SelectionManager
static getInstance(): EditorCore
static reset(): void
}
@@ -925,6 +926,13 @@ element-utils.ts
startTime: number;
buffer?: AudioBuffer;
}): CreateLibraryAudioElement
+ export function getElementsAtTime({
+ tracks,
+ time,
+ }: {
+ tracks: TimelineTrack[];
+ time: number;
+ }): { trackId: string; elementId: string }[]
index.ts
export function calculateTotalDuration({
@@ -1692,7 +1700,7 @@ platform.ts
export function getPlatformAlternateKey(): string
export function isAppleDevice(): boolean
-strings.ts
+string.ts
export function capitalizeFirstLetter({ string }: { string: string })
export function uppercase({ string }: { string: string })
diff --git a/apps/web/src/app/blog/page.tsx b/apps/web/src/app/blog/page.tsx
index 6f9c57bc..9e3b6d11 100644
--- a/apps/web/src/app/blog/page.tsx
+++ b/apps/web/src/app/blog/page.tsx
@@ -42,7 +42,7 @@ export default async function BlogPage() {
function BlogPostItem({ post }: { post: Post }) {
return (
-
+
{post.title}
{post.description}
diff --git a/apps/web/src/app/contributors/page.tsx b/apps/web/src/app/contributors/page.tsx
index 2e8c49cd..21703852 100644
--- a/apps/web/src/app/contributors/page.tsx
+++ b/apps/web/src/app/contributors/page.tsx
@@ -180,7 +180,7 @@ function AllContributorsSection({
href={contributor.html_url}
target="_blank"
rel="noopener noreferrer"
- className="opacity-100 transition-opacity hover:opacity-70"
+ className="opacity-100 hover:opacity-70"
>
@@ -214,7 +214,7 @@ function ExternalToolsSection() {
Tools we use to build OpenCut
-
+
{EXTERNAL_TOOLS.map((tool, index) => (
-
-
-
-
+
+
{tool.name}
diff --git a/apps/web/src/app/globals.css b/apps/web/src/app/globals.css
index da2523fc..8478dabe 100644
--- a/apps/web/src/app/globals.css
+++ b/apps/web/src/app/globals.css
@@ -15,6 +15,7 @@
--popover: hsl(0, 0%, 100%);
--popover-foreground: hsl(0 0% 2%);
--primary: hsl(203, 100%, 50%);
+ --primary-hover: hsl(203, 100%, 45%);
--primary-foreground: hsl(0, 0%, 100%);
--secondary: hsl(216, 13%, 92%);
--secondary-foreground: hsl(0 0% 2%);
@@ -44,9 +45,6 @@
--sidebar-ring: hsl(0 0% 16.9%);
--panel-background: hsl(216 13% 96%);
--panel-accent: hsl(216, 8%, 90%);
-
- --radius: 1rem;
-
--sidebar: hsl(0 0% 98%);
}
.dark {
@@ -56,7 +54,8 @@
--card-foreground: hsl(0 0% 89%);
--popover: hsl(0 0% 14.9%);
--popover-foreground: hsl(0 0% 98%);
- --primary: hsl(205, 84%, 53%);
+ --primary: hsl(203, 100%, 50%);
+ --primary-hover: hsl(203, 100%, 45%);
--primary-foreground: hsl(0 0% 9%);
--secondary: hsl(0 0% 14.9%);
--secondary-foreground: hsl(0 0% 98%);
@@ -124,15 +123,16 @@
--font-sans: var(--font-inter), sans-serif;
/* Font sizes */
- --text-base: 0.95rem;
+ --text-xl: 1.20rem;
+ --text-base: 0.92rem;
--text-base--line-height: calc(1.5 / 0.95);
--text-xs: 0.75rem;
--text-xs--line-height: calc(1 / 0.8);
/* Border radius */
- --radius-lg: var(--radius);
- --radius-md: calc(var(--radius) - 2px);
- --radius-sm: calc(var(--radius) - 8px);
+ --radius-lg: 0.82rem;
+ --radius-md: 0.65rem;
+ --radius-sm: 0.35rem;
/* Palette mapped to root design tokens */
--color-background: var(--background);
@@ -146,7 +146,7 @@
--color-primary: var(--primary);
--color-primary-foreground: var(--primary-foreground);
-
+ --color-primary-hover: var(--primary-hover);
--color-secondary: var(--secondary);
--color-secondary-foreground: var(--secondary-foreground);
diff --git a/apps/web/src/app/projects/page.tsx b/apps/web/src/app/projects/page.tsx
index 59868704..4c7229a7 100644
--- a/apps/web/src/app/projects/page.tsx
+++ b/apps/web/src/app/projects/page.tsx
@@ -110,7 +110,11 @@ export default function ProjectsPage() {
}
>
{projectsToDisplay.map((project) => (
-
+ p.id)}
+ />
))}
)}
@@ -144,10 +148,10 @@ function ProjectsHeader() {
-
+