summaryrefslogtreecommitdiff
path: root/apps/web/src/constants
diff options
context:
space:
mode:
Diffstat (limited to 'apps/web/src/constants')
-rw-r--r--apps/web/src/constants/font-constants.ts79
-rw-r--r--apps/web/src/constants/timeline-constants.ts106
2 files changed, 185 insertions, 0 deletions
diff --git a/apps/web/src/constants/font-constants.ts b/apps/web/src/constants/font-constants.ts
new file mode 100644
index 00000000..bfddc182
--- /dev/null
+++ b/apps/web/src/constants/font-constants.ts
@@ -0,0 +1,79 @@
+export interface FontOption {
+ value: string;
+ label: string;
+ category: "system" | "google" | "custom";
+ weights?: number[];
+ hasClassName?: boolean;
+}
+
+export const FONT_OPTIONS: FontOption[] = [
+ // System fonts (always available)
+ { value: "Arial", label: "Arial", category: "system", hasClassName: false },
+ {
+ value: "Helvetica",
+ label: "Helvetica",
+ category: "system",
+ hasClassName: false,
+ },
+ {
+ value: "Times New Roman",
+ label: "Times New Roman",
+ category: "system",
+ hasClassName: false,
+ },
+ {
+ value: "Georgia",
+ label: "Georgia",
+ category: "system",
+ hasClassName: false,
+ },
+
+ // Google Fonts (loaded in layout.tsx)
+ {
+ value: "Inter",
+ label: "Inter",
+ category: "google",
+ weights: [400, 700],
+ hasClassName: true,
+ },
+ {
+ value: "Roboto",
+ label: "Roboto",
+ category: "google",
+ weights: [400, 700],
+ hasClassName: true,
+ },
+ {
+ value: "Open Sans",
+ label: "Open Sans",
+ category: "google",
+ hasClassName: true,
+ },
+ {
+ value: "Playfair Display",
+ label: "Playfair Display",
+ category: "google",
+ hasClassName: true,
+ },
+ {
+ value: "Comic Neue",
+ label: "Comic Neue",
+ category: "google",
+ hasClassName: false,
+ },
+] as const;
+
+export const DEFAULT_FONT = "Arial";
+
+// Type-safe font family union
+export type FontFamily = (typeof FONT_OPTIONS)[number]["value"];
+
+// Helper functions
+export const getFontByValue = (value: string): FontOption | undefined =>
+ FONT_OPTIONS.find((font) => font.value === value);
+
+export const getGoogleFonts = (): FontOption[] =>
+ FONT_OPTIONS.filter((font) => font.category === "google");
+
+export const getSystemFonts = (): FontOption[] =>
+ FONT_OPTIONS.filter((font) => font.category === "system");
diff --git a/apps/web/src/constants/timeline-constants.ts b/apps/web/src/constants/timeline-constants.ts
new file mode 100644
index 00000000..92045c5e
--- /dev/null
+++ b/apps/web/src/constants/timeline-constants.ts
@@ -0,0 +1,106 @@
+import type { TrackType } from "@/types/timeline";
+
+// Track color definitions
+export const TRACK_COLORS: Record<
+ TrackType,
+ { solid: string; background: string; border: string }
+> = {
+ media: {
+ solid: "bg-blue-500",
+ background: "bg-blue-500/20",
+ border: "border-white/80",
+ },
+ text: {
+ solid: "bg-[#9C4937]",
+ background: "bg-[#9C4937]",
+ border: "border-white/80",
+ },
+ audio: {
+ solid: "bg-green-500",
+ background: "bg-green-500/20",
+ border: "border-white/80",
+ },
+} as const;
+
+// Utility functions
+export function getTrackColors(type: TrackType) {
+ return TRACK_COLORS[type];
+}
+
+export function getTrackElementClasses(type: TrackType) {
+ const colors = getTrackColors(type);
+ return `${colors.background} ${colors.border}`;
+}
+
+// Track height definitions
+export const TRACK_HEIGHTS: Record<TrackType, number> = {
+ media: 65,
+ text: 25,
+ audio: 50,
+} as const;
+
+// Utility function for track heights
+export function getTrackHeight(type: TrackType): number {
+ return TRACK_HEIGHTS[type];
+}
+
+// Calculate cumulative height up to (but not including) a track index
+export function getCumulativeHeightBefore(
+ tracks: Array<{ type: TrackType }>,
+ trackIndex: number
+): number {
+ const GAP = 4; // 4px gap between tracks (equivalent to Tailwind's gap-1)
+ return tracks
+ .slice(0, trackIndex)
+ .reduce((sum, track) => sum + getTrackHeight(track.type) + GAP, 0);
+}
+
+// Calculate total height of all tracks
+export function getTotalTracksHeight(
+ tracks: Array<{ type: TrackType }>
+): number {
+ const GAP = 4; // 4px gap between tracks (equivalent to Tailwind's gap-1)
+ const tracksHeight = tracks.reduce(
+ (sum, track) => sum + getTrackHeight(track.type),
+ 0
+ );
+ const gapsHeight = Math.max(0, tracks.length - 1) * GAP; // n-1 gaps for n tracks
+ return tracksHeight + gapsHeight;
+}
+
+// Other timeline constants
+export const TIMELINE_CONSTANTS = {
+ ELEMENT_MIN_WIDTH: 80,
+ PIXELS_PER_SECOND: 50,
+ TRACK_HEIGHT: 60, // Default fallback
+ DEFAULT_TEXT_DURATION: 5,
+ ZOOM_LEVELS: [0.25, 0.5, 1, 1.5, 2, 3, 4],
+} as const;
+
+// FPS presets for project settings
+export const FPS_PRESETS = [
+ { value: "24", label: "24 fps (Film)" },
+ { value: "25", label: "25 fps (PAL)" },
+ { value: "30", label: "30 fps (NTSC)" },
+ { value: "60", label: "60 fps (High)" },
+ { value: "120", label: "120 fps (Slow-mo)" },
+] as const;
+
+// Frame snapping utilities
+export function timeToFrame(time: number, fps: number): number {
+ return Math.round(time * fps);
+}
+
+export function frameToTime(frame: number, fps: number): number {
+ return frame / fps;
+}
+
+export function snapTimeToFrame(time: number, fps: number): number {
+ if (fps <= 0) return time; // Fallback for invalid FPS
+ const frame = timeToFrame(time, fps);
+ return frameToTime(frame, fps);
+}
+
+export function getFrameDuration(fps: number): number {
+ return 1 / fps;
+}