- );
-}
-```
-
----
-
-## Schritt 8 â CSS Import nicht vergessen!
-
-@xyflow/react braucht sein eigenes CSS. Importiere es entweder in der Canvas-Komponente (wie oben) oder global in `app/globals.css`:
-
-```css
-/* app/globals.css â NACH den Tailwind-Imports */
-@import '@xyflow/react/dist/style.css';
-```
-
-> **Tailwind v4 Hinweis:** Falls die React Flow Styles von Tailwinds Reset ĂŒberschrieben werden, importiere sie NACH dem Tailwind-Import.
-
----
-
-## Testing-Reihenfolge
-
-Nachdem du alle Dateien erstellt hast, teste in dieser Reihenfolge:
-
-### Test 1: Canvas rendert
-- Navigiere zu `/canvas/` (du brauchst eine existierende Canvas-ID aus Convex)
-- Erwartung: Leerer Canvas mit Dot-Background, Controls unten links, MiniMap unten rechts
-- Falls 404: PrĂŒfe ob die Route `app/(app)/canvas/[canvasId]/page.tsx` korrekt liegt
-
-### Test 2: Node hinzufĂŒgen
-- Klicke auf "đ Notiz" in der Toolbar
-- Erwartung: Note-Node erscheint auf dem Canvas
-- PrĂŒfe im Convex Dashboard: neuer Eintrag in der `nodes`-Tabelle
-
-### Test 3: Node verschieben
-- Ziehe den Node an eine neue Position, lasse los
-- Erwartung: Node bleibt an der neuen Position
-- PrĂŒfe im Convex Dashboard: `position.x` und `position.y` haben sich aktualisiert
-
-### Test 4: Verbindung erstellen
-- Erstelle einen Prompt-Node und einen (leeren) AI-Image-Node
-- Ziehe vom Source-Handle (rechts am Prompt) zum Target-Handle (links am AI-Image)
-- Erwartung: Edge erscheint als Linie zwischen den Nodes
-- PrĂŒfe im Convex Dashboard: neuer Eintrag in der `edges`-Tabelle
-
-### Test 5: Node löschen
-- Selektiere einen Node (Klick), drĂŒcke `Delete` oder `Backspace`
-- Erwartung: Node verschwindet, zugehörige Edges werden ebenfalls entfernt
-- PrĂŒfe im Convex Dashboard: Node und Edges sind gelöscht
-
----
-
-## Bekannte Fallstricke
-
-### 1. `nodeTypes` innerhalb der Komponente definiert
-â React Flow re-rendert ALLE Nodes bei jedem State-Update. Die Map MUSS in einer eigenen Datei liegen.
-
-### 2. React Flow CSS fehlt
-â Nodes sind unsichtbar oder falsch positioniert. Import von `@xyflow/react/dist/style.css` ist Pflicht.
-
-### 3. Convex-Sync wÀhrend Drag
-â Wenn Convex einen neuen Wert pusht wĂ€hrend der User draggt, springt der Node zur alten Position zurĂŒck. Die `isDragging`-Ref verhindert das.
-
-### 4. Handle-Styling
-â Die Standard-Handles von React Flow sind winzig und dunkel. Die `!`-Klassen in Tailwind erzwingen Custom-Styling ĂŒber die React Flow Defaults.
-
-### 5. Batch-Drag (mehrere Nodes selektiert)
-â `onNodeDragStop` feuert nur fĂŒr den primĂ€r gedraggten Node. FĂŒr Batch-Moves nutze `onSelectionDragStop` oder `batchMove` Mutation.
-
----
-
-## NĂ€chste Schritte (nach Schritt 1â3)
-
-- **Schritt 4:** Sidebar mit Node-Palette + dnd-kit (Drag von Sidebar auf Canvas)
-- **Schritt 5:** Inline-Editing (Text direkt im Node bearbeiten â `updateData` Mutation)
-- **Schritt 6:** Bild-Upload (Convex File Storage + Image-Node)
-- **Schritt 7:** OpenRouter-Integration (Prompt â KI-Bild-Generierung)
-- **Schritt 8:** Node-Status-Modell visuell ausbauen (Shimmer, Progress, Error)
diff --git a/app/(app)/canvas/[canvasId]/page.tsx b/app/(app)/canvas/[canvasId]/page.tsx
index ef6eaad..c1b586d 100644
--- a/app/(app)/canvas/[canvasId]/page.tsx
+++ b/app/(app)/canvas/[canvasId]/page.tsx
@@ -1,9 +1,10 @@
-import { redirect } from "next/navigation";
+import { notFound, redirect } from "next/navigation";
import Canvas from "@/components/canvas/canvas";
import CanvasToolbar from "@/components/canvas/canvas-toolbar";
+import { api } from "@/convex/_generated/api";
import type { Id } from "@/convex/_generated/dataModel";
-import { isAuthenticated } from "@/lib/auth-server";
+import { fetchAuthQuery, isAuthenticated } from "@/lib/auth-server";
export default async function CanvasPage({
params,
@@ -18,6 +19,17 @@ export default async function CanvasPage({
const { canvasId } = await params;
const typedCanvasId = canvasId as Id<"canvases">;
+ try {
+ const canvas = await fetchAuthQuery(api.canvases.get, {
+ canvasId: typedCanvasId,
+ });
+ if (!canvas) {
+ notFound();
+ }
+ } catch {
+ notFound();
+ }
+
return (