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) => ( + + +
+
+
+

+ {space.name} +

+
+ +
+ + + + {/* Whiteboard Preview */} +
+ {`${space.name} +
+
+ + + + {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}

+
); }