diff --git a/apps/web/src/components/spaces-grid.tsx b/apps/web/src/components/spaces-grid.tsx
new file mode 100644
index 0000000..72f3c89
--- /dev/null
+++ b/apps/web/src/components/spaces-grid.tsx
@@ -0,0 +1,167 @@
+import { MoreHorizontal, Plus, Search } from "lucide-react";
+import { Badge } from "@/components/ui/badge";
+import { Button } from "@/components/ui/button";
+import {
+ Card,
+ CardContent,
+ CardFooter,
+ CardHeader,
+} from "@/components/ui/card";
+import { Input } from "@/components/ui/input";
+
+type Space = {
+ id: string;
+ name: string;
+ lastEdited: string;
+ preview: string;
+ itemCount: number;
+ color: string;
+};
+
+// Mock data for demonstration
+const mockSpaces: Space[] = [
+ {
+ id: "1",
+ name: "Product Strategy",
+ lastEdited: "2 hours ago",
+ preview: "/whiteboard-with-product-strategy-diagrams-and-stic.jpg",
+ itemCount: 12,
+ color: "bg-blue-500",
+ },
+ {
+ id: "2",
+ name: "Research Notes",
+ lastEdited: "1 day ago",
+ preview: "/whiteboard-with-research-mind-map-and-connections.jpg",
+ itemCount: 8,
+ color: "bg-green-500",
+ },
+ {
+ id: "3",
+ name: "Meeting Ideas",
+ lastEdited: "3 days ago",
+ preview: "/whiteboard-with-meeting-notes-and-action-items.jpg",
+ itemCount: 15,
+ color: "bg-purple-500",
+ },
+ {
+ id: "4",
+ name: "Design System",
+ lastEdited: "1 week ago",
+ preview: "/whiteboard-with-ui-components-and-design-patterns.jpg",
+ itemCount: 24,
+ color: "bg-orange-500",
+ },
+ {
+ id: "5",
+ name: "Learning Path",
+ lastEdited: "2 weeks ago",
+ preview: "/whiteboard-with-learning-roadmap-and-progress-trac.jpg",
+ itemCount: 6,
+ color: "bg-pink-500",
+ },
+ {
+ id: "6",
+ name: "Project Planning",
+ lastEdited: "3 weeks ago",
+ preview: "/whiteboard-with-project-timeline-and-milestones.jpg",
+ itemCount: 18,
+ color: "bg-cyan-500",
+ },
+];
+
+export function SpacesGrid() {
+ return (
+
+ {/* Header */}
+
+
+
Your Spaces
+
+ Organize your thoughts and ideas in visual workspaces
+
+
+
+
+
+ {/* Search and Filters */}
+
+
+
+
+
+
+ {mockSpaces.length} spaces
+
+
+
+ {/* Spaces Grid */}
+
+ {mockSpaces.map((space) => (
+
+
+
+
+
+
+ {/* Whiteboard Preview */}
+
+

+
+
+
+
+
+ {space.itemCount} items
+ Edited {space.lastEdited}
+
+
+ ))}
+
+
+ {/* Empty State (when no spaces exist) */}
+ {mockSpaces.length === 0 && (
+
+
+
+ No spaces yet
+
+
+ Create your first space to start organizing your thoughts and ideas
+ visually.
+
+
+
+ )}
+
+ );
+}
diff --git a/apps/web/src/components/ui/badge.tsx b/apps/web/src/components/ui/badge.tsx
new file mode 100644
index 0000000..0bd8cfc
--- /dev/null
+++ b/apps/web/src/components/ui/badge.tsx
@@ -0,0 +1,40 @@
+import { cva, type VariantProps } from "class-variance-authority";
+import type * as React from "react";
+
+import { cn } from "@/lib/utils";
+
+const badgeVariants = cva(
+ "inline-flex w-fit shrink-0 items-center justify-center gap-1 overflow-hidden whitespace-nowrap rounded-md border px-2 py-0.5 font-medium text-xs shadow-xs [&>svg]:pointer-events-none [&>svg]:size-3",
+ {
+ variants: {
+ variant: {
+ default: "border-transparent bg-primary text-primary-foreground",
+ outline: "text-foreground",
+ secondary: "border-border/50 bg-secondary text-secondary-foreground",
+ success: "border-success-border/50 bg-success text-success-foreground",
+ warning: "border-warning-border/50 bg-warning text-warning-foreground",
+ info: "border-info-border/50 bg-info text-info-foreground",
+ danger: "border-danger-border/50 bg-danger text-danger-foreground",
+ },
+ },
+ defaultVariants: {
+ variant: "default",
+ },
+ }
+);
+
+function Badge({
+ className,
+ variant,
+ ...props
+}: React.ComponentProps<"span"> & VariantProps) {
+ return (
+
+ );
+}
+
+export { Badge, badgeVariants };
diff --git a/apps/web/src/routes/dashboard.tsx b/apps/web/src/routes/dashboard.tsx
index a9ec151..06f9fb3 100644
--- a/apps/web/src/routes/dashboard.tsx
+++ b/apps/web/src/routes/dashboard.tsx
@@ -1,6 +1,7 @@
import { useQuery } from "@tanstack/react-query";
import { createFileRoute } from "@tanstack/react-router";
import { useEffect } from "react";
+import { SpacesGrid } from "@/components/spaces-grid";
import { authClient } from "@/lib/auth-client";
import { trpc } from "@/utils/trpc";
@@ -32,6 +33,7 @@ function RouteComponent() {
Dashboard
Welcome {session?.name ?? session?.email}
privateData: {privateData.data?.message}
+
);
}