);
}
diff --git a/app/(dashboard)/settings/loading.tsx b/app/(dashboard)/settings/loading.tsx
new file mode 100644
index 0000000..50eab41
--- /dev/null
+++ b/app/(dashboard)/settings/loading.tsx
@@ -0,0 +1,72 @@
+import { Skeleton } from "@/components/ui/skeleton"
+import { Card, CardHeader, CardContent } from "@/components/ui/card"
+
+function SettingsCardSkeleton({ rows }: { rows: number }) {
+ return (
+
+ )
+}
diff --git a/app/(dashboard)/settings/page.tsx b/app/(dashboard)/settings/page.tsx
index 791df16..6c1082b 100644
--- a/app/(dashboard)/settings/page.tsx
+++ b/app/(dashboard)/settings/page.tsx
@@ -7,6 +7,7 @@ import { Input } from '@/components/ui/input';
import { Label } from '@/components/ui/label';
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card';
import { Separator } from '@/components/ui/separator';
+import { Skeleton } from '@/components/ui/skeleton';
import { Badge } from '@/components/ui/badge';
import {
Select,
@@ -177,8 +178,33 @@ export default function SettingsPage() {
if (loading) {
return (
-
-
+
+
+
+
+
+ {Array.from({ length: 4 }).map((_, i) => (
+
+
+
+
+
+
+ {Array.from({ length: 3 }).map((_, j) => (
+
+ ))}
+
+
+ ))}
+
+
+
);
}
diff --git a/app/(dashboard)/workspaces/loading.tsx b/app/(dashboard)/workspaces/loading.tsx
new file mode 100644
index 0000000..6e85092
--- /dev/null
+++ b/app/(dashboard)/workspaces/loading.tsx
@@ -0,0 +1,44 @@
+import { Skeleton } from "@/components/ui/skeleton"
+import { Card, CardHeader, CardContent } from "@/components/ui/card"
+
+function WorkspaceCardSkeleton() {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default function WorkspacesLoading() {
+ return (
+
+
+
+
+ {Array.from({ length: 6 }).map((_, i) => (
+
+ ))}
+
+
+ )
+}
diff --git a/app/watch/[videoId]/loading.tsx b/app/watch/[videoId]/loading.tsx
new file mode 100644
index 0000000..ccdcb4b
--- /dev/null
+++ b/app/watch/[videoId]/loading.tsx
@@ -0,0 +1,81 @@
+import { Skeleton } from "@/components/ui/skeleton"
+import { Separator } from "@/components/ui/separator"
+
+function CommentSkeleton() {
+ return (
+
+ )
+}
+
+export default function WatchLoading() {
+ return (
+
+
+
+
+
+
+
+
+ {Array.from({ length: 5 }).map((_, i) => (
+
+ ))}
+
+
+
+
+
+
+ )
+}
diff --git a/app/watch/[videoId]/page.tsx b/app/watch/[videoId]/page.tsx
index ab94e66..251439d 100644
--- a/app/watch/[videoId]/page.tsx
+++ b/app/watch/[videoId]/page.tsx
@@ -34,6 +34,7 @@ import { Textarea } from '@/components/ui/textarea';
import { Input } from '@/components/ui/input';
import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar';
import { Separator } from '@/components/ui/separator';
+import { Skeleton } from '@/components/ui/skeleton';
import {
DropdownMenu,
DropdownMenuContent,
@@ -957,8 +958,68 @@ export default function WatchPage() {
if (loading) {
return (
-
-
+
+
+
+
+
+
+ {Array.from({ length: 5 }).map((_, i) => (
+
+ ))}
+
+
+
+
);
}
diff --git a/components/ui/skeleton.tsx b/components/ui/skeleton.tsx
new file mode 100644
index 0000000..7fd3cc6
--- /dev/null
+++ b/components/ui/skeleton.tsx
@@ -0,0 +1,13 @@
+import { cn } from "@/lib/utils"
+
+function Skeleton({ className, ...props }: React.ComponentProps<"div">) {
+ return (
+
+ )
+}
+
+export { Skeleton }