diff --git a/src/app/page.tsx b/src/app/page.tsx index 381fbd80..17bfae25 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,6 +1,18 @@ -import VideoEditor from "@/components/VideoEditor"; +import dynamic from "next/dynamic"; import Footer from "@/components/Footer"; +const VideoEditor = dynamic(() => import("@/components/VideoEditor"), { + ssr: false, + loading: () => ( +
+
+ + Loading Video Editor... +
+
+ ), +}); + export default function Home() { return ( <> diff --git a/src/components/DownloadResult.tsx b/src/components/DownloadResult.tsx index 9cb04286..437354d3 100644 --- a/src/components/DownloadResult.tsx +++ b/src/components/DownloadResult.tsx @@ -1,10 +1,11 @@ "use client"; import { useState, useEffect } from "react"; +import dynamic from "next/dynamic"; import { ExportResult } from "@/lib/types"; import { formatBytes } from "@/lib/utils"; import { Download, RotateCcw, Share2, AlertCircle, Volume2, VolumeX } from "lucide-react"; -import LottiePlayer from "./LottiePlayer"; +const LottiePlayer = dynamic(() => import("./LottiePlayer"), { ssr: false }); import { NativeShareButton } from "./NativeShareButton"; import successAnim from "@/lib/lottie/success.json"; import { cn } from "@/lib/utils"; diff --git a/src/components/ExportOverlay.tsx b/src/components/ExportOverlay.tsx index 702461cb..592c9e16 100644 --- a/src/components/ExportOverlay.tsx +++ b/src/components/ExportOverlay.tsx @@ -3,10 +3,12 @@ import FocusTrap from "focus-trap-react"; import { useEffect, useRef, useCallback, useState } from "react"; import { ExportStatus } from "@/lib/types"; -import LottiePlayer from "./LottiePlayer"; +import dynamic from "next/dynamic"; import spinnerAnim from "@/lib/lottie/spinner.json"; import TipCarousel from "./TipCarousel"; +const LottiePlayer = dynamic(() => import("./LottiePlayer"), { ssr: false }); + interface Props { status: ExportStatus; progress: number; diff --git a/src/components/FileUpload.tsx b/src/components/FileUpload.tsx index f9f2127e..acf47d4a 100644 --- a/src/components/FileUpload.tsx +++ b/src/components/FileUpload.tsx @@ -1,8 +1,10 @@ "use client"; import { useRef, useState, useEffect, useCallback } from "react"; +import dynamic from "next/dynamic"; import { Film, FolderOpen } from "lucide-react"; -import LottiePlayer from "./LottiePlayer"; + +const LottiePlayer = dynamic(() => import("./LottiePlayer"), { ssr: false }); import uploadAnim from "@/lib/lottie/upload.json"; import { cn, formatBytes, formatDuration } from "@/lib/utils"; import { MAX_FILE_SIZE, WARNING_FILE_SIZE } from "@/lib/types"; diff --git a/src/components/VideoEditor.tsx b/src/components/VideoEditor.tsx index b1d2e574..ae42baf3 100644 --- a/src/components/VideoEditor.tsx +++ b/src/components/VideoEditor.tsx @@ -3,6 +3,7 @@ import { useState, useRef, useEffect, useMemo } from "react"; import { useVideoEditor } from "@/hooks/useVideoEditor"; import { TextOverlay } from "@/lib/types"; +import dynamic from "next/dynamic"; import FileUpload from "./FileUpload"; import VideoPreview from "./VideoPreview"; import ThumbnailStrip from "./ThumbnailStrip"; @@ -14,9 +15,10 @@ import TextControls from "./TextControls"; import AudioSpeedControl from "./AudioSpeedControl"; import FormatSelector from "./FormatSelector"; import ExportSettings from "./ExportSettings"; -import ExportOverlay from "./ExportOverlay"; -import DownloadResult from "./DownloadResult"; -import ImageOverlay from "./ImageOverlay" + +const ExportOverlay = dynamic(() => import("./ExportOverlay"), { ssr: false }); +const DownloadResult = dynamic(() => import("./DownloadResult"), { ssr: false }); +const ImageOverlay = dynamic(() => import("./ImageOverlay"), { ssr: false }); import { getPresetById } from "@/lib/presets"; import { cn } from "@/lib/utils"; @@ -24,7 +26,7 @@ import { Layers, Crop, Scissors, RotateCw, Volume2, Type, SlidersHorizontal, Zap, AlertTriangle, Github, Copy } from "lucide-react"; -import OnboardingTour from "./OnboardingTour"; +const OnboardingTour = dynamic(() => import("./OnboardingTour"), { ssr: false }); import { useKeyboardShortcuts } from "@/hooks/useKeyboardShortcuts"; interface SectionProps {