summaryrefslogtreecommitdiff
path: root/apps/web
diff options
context:
space:
mode:
authorantonio-jb <antonio_ajb@outlook.com>2025-07-27 17:03:33 +0200
committerantonio-jb <antonio_ajb@outlook.com>2025-07-27 17:03:33 +0200
commitdf3b0920104ba79fdfc0e7d4bce926073badb889 (patch)
tree924af291c8a289757deee88cb7b304191e9c00d8 /apps/web
parent14475dc9a692aeffa8ef3caccecc1d3164ce4cfc (diff)
downloadopencut-df3b0920104ba79fdfc0e7d4bce926073badb889.tar.gz
fix: remove thick black border from checkbox for cleaner UI
Diffstat (limited to 'apps/web')
-rw-r--r--apps/web/package.json1
-rw-r--r--apps/web/src/app/projects/page.tsx2
-rw-r--r--apps/web/src/hooks/use-editor-actions.ts280
3 files changed, 176 insertions, 107 deletions
diff --git a/apps/web/package.json b/apps/web/package.json
index f5cd7da4..e19e1953 100644
--- a/apps/web/package.json
+++ b/apps/web/package.json
@@ -72,6 +72,7 @@
"devDependencies": {
"@tailwindcss/typography": "^0.5.16",
"@types/bun": "latest",
+ "@types/node": "^24.1.0",
"@types/pg": "^8.15.4",
"@types/react": "^18.2.48",
"@types/react-dom": "^18.2.18",
diff --git a/apps/web/src/app/projects/page.tsx b/apps/web/src/app/projects/page.tsx
index 4b68791b..2cd20730 100644
--- a/apps/web/src/app/projects/page.tsx
+++ b/apps/web/src/app/projects/page.tsx
@@ -399,7 +399,7 @@ function ProjectCard({
>
{isSelectionMode && (
<div className="absolute top-3 left-3 z-10">
- <div className="w-5 h-5 rounded bg-background/80 backdrop-blur-sm border flex items-center justify-center">
+ <div className="w-4.9 h-4.9 rounded-full bg-background/80 backdrop-blur-sm border flex items-center justify-center">
<Checkbox
checked={isSelected}
onCheckedChange={(checked) =>
diff --git a/apps/web/src/hooks/use-editor-actions.ts b/apps/web/src/hooks/use-editor-actions.ts
index b2fad55f..bfe9a7b9 100644
--- a/apps/web/src/hooks/use-editor-actions.ts
+++ b/apps/web/src/hooks/use-editor-actions.ts
@@ -26,136 +26,204 @@ export function useEditorActions() {
const { activeProject } = useProjectStore();
// Playback actions
- useActionHandler("toggle-play", () => {
- toggle();
- }, undefined);
-
- useActionHandler("stop-playback", () => {
- if (isPlaying) {
+ useActionHandler(
+ "toggle-play",
+ () => {
toggle();
- }
- seek(0);
- }, undefined);
+ },
+ undefined
+ );
+
+ useActionHandler(
+ "stop-playback",
+ () => {
+ if (isPlaying) {
+ toggle();
+ }
+ seek(0);
+ },
+ undefined
+ );
- useActionHandler("seek-forward", (args) => {
- const seconds = args?.seconds ?? 1;
- seek(Math.min(duration, currentTime + seconds));
- }, undefined);
+ useActionHandler(
+ "seek-forward",
+ (args) => {
+ const seconds = args?.seconds ?? 1;
+ seek(Math.min(duration, currentTime + seconds));
+ },
+ undefined
+ );
- useActionHandler("seek-backward", (args) => {
- const seconds = args?.seconds ?? 1;
- seek(Math.max(0, currentTime - seconds));
- }, undefined);
+ useActionHandler(
+ "seek-backward",
+ (args) => {
+ const seconds = args?.seconds ?? 1;
+ seek(Math.max(0, currentTime - seconds));
+ },
+ undefined
+ );
- useActionHandler("frame-step-forward", () => {
- const projectFps = activeProject?.fps || 30;
- seek(Math.min(duration, currentTime + 1 / projectFps));
- }, undefined);
+ useActionHandler(
+ "frame-step-forward",
+ () => {
+ const projectFps = activeProject?.fps || 30;
+ seek(Math.min(duration, currentTime + 1 / projectFps));
+ },
+ undefined
+ );
- useActionHandler("frame-step-backward", () => {
- const projectFps = activeProject?.fps || 30;
- seek(Math.max(0, currentTime - 1 / projectFps));
- }, undefined);
+ useActionHandler(
+ "frame-step-backward",
+ () => {
+ const projectFps = activeProject?.fps || 30;
+ seek(Math.max(0, currentTime - 1 / projectFps));
+ },
+ undefined
+ );
- useActionHandler("jump-forward", (args) => {
- const seconds = args?.seconds ?? 5;
- seek(Math.min(duration, currentTime + seconds));
- }, undefined);
+ useActionHandler(
+ "jump-forward",
+ (args) => {
+ const seconds = args?.seconds ?? 5;
+ seek(Math.min(duration, currentTime + seconds));
+ },
+ undefined
+ );
- useActionHandler("jump-backward", (args) => {
- const seconds = args?.seconds ?? 5;
- seek(Math.max(0, currentTime - seconds));
- }, undefined);
+ useActionHandler(
+ "jump-backward",
+ (args) => {
+ const seconds = args?.seconds ?? 5;
+ seek(Math.max(0, currentTime - seconds));
+ },
+ undefined
+ );
- useActionHandler("goto-start", () => {
- seek(0);
- }, undefined);
+ useActionHandler(
+ "goto-start",
+ () => {
+ seek(0);
+ },
+ undefined
+ );
- useActionHandler("goto-end", () => {
- seek(duration);
- }, undefined);
+ useActionHandler(
+ "goto-end",
+ () => {
+ seek(duration);
+ },
+ undefined
+ );
// Timeline editing actions
- useActionHandler("split-element", () => {
- if (selectedElements.length !== 1) {
- toast.error("Select exactly one element to split");
- return;
- }
+ useActionHandler(
+ "split-element",
+ () => {
+ if (selectedElements.length !== 1) {
+ toast.error("Select exactly one element to split");
+ return;
+ }
- const { trackId, elementId } = selectedElements[0];
- const track = tracks.find((t: any) => t.id === trackId);
- const element = track?.elements.find((el: any) => el.id === elementId);
+ const { trackId, elementId } = selectedElements[0];
+ const track = tracks.find((t: any) => t.id === trackId);
+ const element = track?.elements.find((el: any) => el.id === elementId);
- if (element) {
- const effectiveStart = element.startTime;
- const effectiveEnd =
- element.startTime +
- (element.duration - element.trimStart - element.trimEnd);
+ if (element) {
+ const effectiveStart = element.startTime;
+ const effectiveEnd =
+ element.startTime +
+ (element.duration - element.trimStart - element.trimEnd);
- if (currentTime > effectiveStart && currentTime < effectiveEnd) {
- splitElement(trackId, elementId, currentTime);
- } else {
- toast.error("Playhead must be within selected element");
+ if (currentTime > effectiveStart && currentTime < effectiveEnd) {
+ splitElement(trackId, elementId, currentTime);
+ } else {
+ toast.error("Playhead must be within selected element");
+ }
}
- }
- }, undefined);
+ },
+ undefined
+ );
- useActionHandler("delete-selected", () => {
- if (selectedElements.length === 0) {
- return;
- }
- selectedElements.forEach(
- ({ trackId, elementId }: { trackId: string; elementId: string }) => {
- removeElementFromTrack(trackId, elementId);
+ useActionHandler(
+ "delete-selected",
+ () => {
+ if (selectedElements.length === 0) {
+ return;
}
- );
- clearSelectedElements();
- }, undefined);
+ selectedElements.forEach(
+ ({ trackId, elementId }: { trackId: string; elementId: string }) => {
+ removeElementFromTrack(trackId, elementId);
+ }
+ );
+ clearSelectedElements();
+ },
+ undefined
+ );
- useActionHandler("select-all", () => {
- const allElements = tracks.flatMap((track: any) =>
- track.elements.map((element: any) => ({
- trackId: track.id,
- elementId: element.id,
- }))
- );
- setSelectedElements(allElements);
- }, undefined);
+ useActionHandler(
+ "select-all",
+ () => {
+ const allElements = tracks.flatMap((track: any) =>
+ track.elements.map((element: any) => ({
+ trackId: track.id,
+ elementId: element.id,
+ }))
+ );
+ setSelectedElements(allElements);
+ },
+ undefined
+ );
- useActionHandler("duplicate-selected", () => {
- if (selectedElements.length !== 1) {
- toast.error("Select exactly one element to duplicate");
- return;
- }
+ useActionHandler(
+ "duplicate-selected",
+ () => {
+ if (selectedElements.length !== 1) {
+ toast.error("Select exactly one element to duplicate");
+ return;
+ }
- const { trackId, elementId } = selectedElements[0];
- const track = tracks.find((t: any) => t.id === trackId);
- const element = track?.elements.find((el: any) => el.id === elementId);
+ const { trackId, elementId } = selectedElements[0];
+ const track = tracks.find((t: any) => t.id === trackId);
+ const element = track?.elements.find((el: any) => el.id === elementId);
- if (element) {
- const newStartTime =
- element.startTime +
- (element.duration - element.trimStart - element.trimEnd) +
- 0.1;
- const { id, ...elementWithoutId } = element;
+ if (element) {
+ const newStartTime =
+ element.startTime +
+ (element.duration - element.trimStart - element.trimEnd) +
+ 0.1;
+ const { id, ...elementWithoutId } = element;
- addElementToTrack(trackId, {
- ...elementWithoutId,
- startTime: newStartTime,
- });
- }
- }, undefined);
+ addElementToTrack(trackId, {
+ ...elementWithoutId,
+ startTime: newStartTime,
+ });
+ }
+ },
+ undefined
+ );
- useActionHandler("toggle-snapping", () => {
- toggleSnapping();
- }, undefined);
+ useActionHandler(
+ "toggle-snapping",
+ () => {
+ toggleSnapping();
+ },
+ undefined
+ );
// History actions
- useActionHandler("undo", () => {
- undo();
- }, undefined);
+ useActionHandler(
+ "undo",
+ () => {
+ undo();
+ },
+ undefined
+ );
- useActionHandler("redo", () => {
- redo();
- }, undefined);
+ useActionHandler(
+ "redo",
+ () => {
+ redo();
+ },
+ undefined
+ );
}