feat: enhance canvas and layout components with new features and improvements

- Added remote image patterns to the Next.js configuration for enhanced image handling.
- Updated TypeScript configuration to exclude the 'implement' directory.
- Refactored layout component to fetch initial authentication token and pass it to Providers.
- Replaced CanvasToolbar with CanvasSidebar for improved UI layout and functionality.
- Enhanced Canvas component with new drag-and-drop file upload capabilities and batch node movement.
- Updated various node components to support new status handling and improved user interactions.
- Added debounced saving for note and prompt nodes to optimize performance.
This commit is contained in:
Matthias
2026-03-25 17:58:58 +01:00
parent d1834c5694
commit ca40f5cb13
27 changed files with 1363 additions and 207 deletions

View File

@@ -1,7 +1,7 @@
import { notFound, redirect } from "next/navigation";
import Canvas from "@/components/canvas/canvas";
import CanvasToolbar from "@/components/canvas/canvas-toolbar";
import CanvasSidebar from "@/components/canvas/canvas-sidebar";
import { api } from "@/convex/_generated/api";
import type { Id } from "@/convex/_generated/dataModel";
import { fetchAuthQuery, isAuthenticated } from "@/lib/auth-server";
@@ -48,9 +48,11 @@ export default async function CanvasPage({
}
return (
<div className="relative h-screen w-screen overflow-hidden">
<CanvasToolbar canvasId={typedCanvasId} />
<Canvas canvasId={typedCanvasId} />
<div className="flex h-screen w-screen overflow-hidden">
<CanvasSidebar />
<div className="flex-1">
<Canvas canvasId={typedCanvasId} />
</div>
</div>
);
}

View File

@@ -340,7 +340,7 @@ export default function DashboardPage() {
<Button
variant="ghost"
size="sm"
className="text-muted-foreground"
className="cursor-pointer text-muted-foreground"
type="button"
onClick={handleCreateWorkspace}
disabled={isCreatingWorkspace || isSessionPending || !session?.user}
@@ -366,7 +366,7 @@ export default function DashboardPage() {
type="button"
onClick={() => router.push(`/canvas/${canvas._id}`)}
className={cn(
"group flex items-center gap-4 rounded-xl border bg-card p-4 text-left shadow-sm shadow-foreground/3 transition-all",
"group flex cursor-pointer items-center gap-4 rounded-xl border bg-card p-4 text-left shadow-sm shadow-foreground/3 transition-all",
"hover:bg-muted/60 hover:shadow-md hover:shadow-foreground/4",
)}
>

View File

@@ -5,6 +5,7 @@ import { cn } from "@/lib/utils";
import { Providers } from "@/components/providers";
import { Toaster } from "@/components/ui/sonner";
import { InitUser } from "@/components/init-user";
import { getToken } from "@/lib/auth-server";
const manrope = Manrope({ subsets: ["latin"], variable: "--font-sans" });
@@ -13,11 +14,13 @@ export const metadata: Metadata = {
description: "Generated by create next app",
};
export default function RootLayout({
export default async function RootLayout({
children,
}: Readonly<{
children: React.ReactNode;
}>) {
const initialToken = await getToken();
return (
<html
lang="de"
@@ -25,7 +28,7 @@ export default function RootLayout({
className={cn("h-full", "antialiased", "font-sans", manrope.variable)}
>
<body className="min-h-full flex flex-col">
<Providers>
<Providers initialToken={initialToken}>
<InitUser />
{children}
<Toaster />