From 985d13ff2beb432836fcee0b0d8152c7f2c86f67 Mon Sep 17 00:00:00 2001 From: Dhruva Vora Date: Mon, 18 May 2026 22:47:08 +0530 Subject: [PATCH] feat: add premium workspace loading experience --- web/src/components/layout/MainLayout.tsx | 5 +- web/src/components/layout/WorkspaceLoader.tsx | 139 ++++++++++++++++++ 2 files changed, 142 insertions(+), 2 deletions(-) create mode 100644 web/src/components/layout/WorkspaceLoader.tsx diff --git a/web/src/components/layout/MainLayout.tsx b/web/src/components/layout/MainLayout.tsx index 7011bef..f64940a 100644 --- a/web/src/components/layout/MainLayout.tsx +++ b/web/src/components/layout/MainLayout.tsx @@ -7,6 +7,7 @@ import Link from "next/link"; import { usePathname, useRouter } from "next/navigation"; import { cn } from "@/lib/utils"; import { clearSession, useIsAuthenticated, useUserRole } from "@/lib/auth"; +import { WorkspaceLoader } from "@/components/layout/WorkspaceLoader"; // GSSoC 2026 - Dhruva5vora const navItems = [ { icon: PenTool, label: "Studio", href: "/studio" }, @@ -32,8 +33,8 @@ export function MainLayout({ children }: { children: React.ReactNode }) { }, [authenticated, router, isMounted]); if (!isMounted || !authenticated) { - return
Preparing workspace...
; - } + return ; //changes made here +} const items = isEditor ? [...navItems, { icon: User, label: "Editor", href: "/editor" }] diff --git a/web/src/components/layout/WorkspaceLoader.tsx b/web/src/components/layout/WorkspaceLoader.tsx new file mode 100644 index 0000000..365b3da --- /dev/null +++ b/web/src/components/layout/WorkspaceLoader.tsx @@ -0,0 +1,139 @@ +"use client"; + +import { motion } from "framer-motion"; // Changed from "motion/react" to "framer-motion" +import { Feather, BookOpen, PenTool } from "lucide-react"; + +/** + * WorkspaceLoader Component + * + * A premium loading experience for Writers Pub. + * Features elegant serif typography, muted olive accents, + * and cinematic animations. + */ +export const WorkspaceLoader = () => { + return ( +
+ {/* Background Ambient Effect */} + + +
+ {/* Animated Icon */} + +
+ + + + +
+
+ + {/* Skeleton Placeholders */} +
+ {[1, 2, 3].map((i) => ( + + + {i === 3 &&
} + + ))} +
+ + {/* Loading Text */} + +

+ Preparing your workspace... +

+ + +
+ "Every masterpiece begins with a blank page." +
+
+
+ + {/* Ambient Floating Elements */} + + + + + + +
+ + {/* Footer Branding */} + + Writers Pub — Est. 2026 + +
+ ); +}; \ No newline at end of file