diff --git a/resources/js/components/editor/EditorSkeleton.jsx b/resources/js/components/editor/EditorSkeleton.jsx
new file mode 100644
index 0000000..ebe86bd
--- /dev/null
+++ b/resources/js/components/editor/EditorSkeleton.jsx
@@ -0,0 +1,85 @@
+import { useLayoutEffect, useState } from 'react';
+import { Skeleton } from '@/components/ui/skeleton';
+import { LAYOUT_CONSTANTS, calculateOptimalMaxWidth, calculateResponsiveWidth, calculateResponsiveScale } from '@/modules/editor/utils/layout-constants';
+
+// Hook for responsive dimensions (same as Editor)
+const useResponsiveDimensions = () => {
+ const [dimensions, setDimensions] = useState(() => ({
+ maxWidth: calculateOptimalMaxWidth(),
+ responsiveWidth: calculateResponsiveWidth(),
+ }));
+
+ useLayoutEffect(() => {
+ const newMaxWidth = calculateOptimalMaxWidth();
+ const newResponsiveWidth = calculateResponsiveWidth();
+ setDimensions({
+ maxWidth: newMaxWidth,
+ responsiveWidth: newResponsiveWidth,
+ });
+ }, []);
+
+ return dimensions;
+};
+
+// Hook for responsive canvas scale (same as EditorCanvas)
+const useResponsiveCanvas = (maxWidth = 350) => {
+ const [scale, setScale] = useState(() => calculateResponsiveScale(maxWidth));
+
+ useLayoutEffect(() => {
+ setScale(calculateResponsiveScale(maxWidth));
+ }, [maxWidth]);
+
+ return scale;
+};
+
+const EditorSkeleton = () => {
+ const { maxWidth, responsiveWidth } = useResponsiveDimensions();
+ const scale = useResponsiveCanvas(maxWidth);
+ const displayWidth = LAYOUT_CONSTANTS.CANVAS_WIDTH * scale;
+ const displayHeight = LAYOUT_CONSTANTS.CANVAS_HEIGHT * scale;
+
+ return (
+
+ {/* Header Skeleton - EditorHeader currently returns empty <>> */}
+
+ {/* Header is empty in actual component, so we skip it */}
+
+
+ {/* Canvas Skeleton - matching EditorCanvas structure */}
+
+
+ {/* Controls Skeleton - matching EditorControls structure */}
+
+ {/* Play/Pause button */}
+
+
+ {/* Edit button */}
+
+
+ {/* Refresh button */}
+
+
+ {/* Download button */}
+
+
+
+ );
+};
+
+export default EditorSkeleton;
\ No newline at end of file
diff --git a/resources/js/pages/home/home.tsx b/resources/js/pages/home/home.tsx
index d664a44..10c60c2 100644
--- a/resources/js/pages/home/home.tsx
+++ b/resources/js/pages/home/home.tsx
@@ -1,3 +1,4 @@
+import EditorSkeleton from '@/components/editor/EditorSkeleton.jsx';
import { useEffect, useState } from 'react';
import BrandLogo from './partials/BrandLogo.jsx';
import FAQDiscord from './partials/FAQDiscord.jsx';
@@ -24,13 +25,7 @@ const Home = ({ faqData, popularKeywords }) => {
- {isClient && Editor ? (
-
- ) : (
-
- )}
+ {isClient && Editor ?
:
}
diff --git a/resources/js/pages/memes/show.tsx b/resources/js/pages/memes/show.tsx
index 4b6f60b..42a2f21 100644
--- a/resources/js/pages/memes/show.tsx
+++ b/resources/js/pages/memes/show.tsx
@@ -1,9 +1,9 @@
import { MemeCard } from '@/components/custom/meme-card';
+import EditorSkeleton from '@/components/editor/EditorSkeleton';
import { Breadcrumb, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator } from '@/components/ui/breadcrumb';
import { Button } from '@/components/ui/button';
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card';
import { KeywordBadge } from '@/components/ui/keyword-badge';
-import { Spinner } from '@/components/ui/spinner';
import Footer from '@/pages/home/partials/Footer';
import { Link } from '@inertiajs/react';
import { ArrowLeft } from 'lucide-react';
@@ -94,14 +94,7 @@ export default function MemeShow({ meme, relatedMemes }: Props) {
setInitialText={(setText) => setText('add your meme caption here')}
/>
) : (
-
-
-
-
- Loading meme video editor...
-
-
-
+
)}