From b0329f1372f10b887ad056b9220bf49a4e822e0a Mon Sep 17 00:00:00 2001 From: Maze Winther Date: Mon, 4 Aug 2025 20:45:48 +0200 Subject: refactor: move canvas size to be a project-level setting instead of editor-level --- apps/web/src/lib/editor-utils.ts | 46 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 apps/web/src/lib/editor-utils.ts (limited to 'apps/web/src/lib/editor-utils.ts') diff --git a/apps/web/src/lib/editor-utils.ts b/apps/web/src/lib/editor-utils.ts new file mode 100644 index 00000000..f041aa5e --- /dev/null +++ b/apps/web/src/lib/editor-utils.ts @@ -0,0 +1,46 @@ +import { CanvasSize } from "@/types/editor"; + +const DEFAULT_CANVAS_PRESETS = [ + { name: "16:9", width: 1920, height: 1080 }, + { name: "9:16", width: 1080, height: 1920 }, + { name: "1:1", width: 1080, height: 1080 }, + { name: "4:3", width: 1440, height: 1080 }, +]; + +/** + * Helper function to find the best matching canvas preset for an aspect ratio + * @param aspectRatio The target aspect ratio to match + * @returns The best matching canvas size + */ +export function findBestCanvasPreset(aspectRatio: number): CanvasSize { + // Calculate aspect ratio for each preset and find the closest match + let bestMatch = DEFAULT_CANVAS_PRESETS[0]; // Default to 16:9 HD + let smallestDifference = Math.abs( + aspectRatio - bestMatch.width / bestMatch.height + ); + + for (const preset of DEFAULT_CANVAS_PRESETS) { + const presetAspectRatio = preset.width / preset.height; + const difference = Math.abs(aspectRatio - presetAspectRatio); + + if (difference < smallestDifference) { + smallestDifference = difference; + bestMatch = preset; + } + } + + // If the difference is still significant (> 0.1), create a custom size + // based on the media aspect ratio with a reasonable resolution + const bestAspectRatio = bestMatch.width / bestMatch.height; + if (Math.abs(aspectRatio - bestAspectRatio) > 0.1) { + // Create custom dimensions based on the aspect ratio + if (aspectRatio > 1) { + // Landscape - use 1920 width + return { width: 1920, height: Math.round(1920 / aspectRatio) }; + } + // Portrait or square - use 1080 height + return { width: Math.round(1080 * aspectRatio), height: 1080 }; + } + + return { width: bestMatch.width, height: bestMatch.height }; +} -- cgit v1.3.1