"use client"; import { useEffect, useRef, useState } from "react"; import { useTheme } from "next-themes"; import { Moon, Sun } from "lucide-react"; import { CanvasNodeTemplatePicker } from "@/components/canvas/canvas-node-template-picker"; import { useCanvasPlacement } from "@/components/canvas/canvas-placement-context"; import { useCenteredFlowNodePosition } from "@/hooks/use-centered-flow-node-position"; import { Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, } from "@/components/ui/command"; import type { CanvasNodeTemplate } from "@/lib/canvas-node-templates"; export function CanvasCommandPalette() { const [open, setOpen] = useState(false); const { createNodeWithIntersection } = useCanvasPlacement(); const getCenteredPosition = useCenteredFlowNodePosition(); const { setTheme } = useTheme(); const nodeCountRef = useRef(0); useEffect(() => { const onKeyDown = (e: KeyboardEvent) => { if (!e.metaKey && !e.ctrlKey) return; if (e.key.toLowerCase() !== "k") return; e.preventDefault(); setOpen((prev) => !prev); }; document.addEventListener("keydown", onKeyDown); return () => document.removeEventListener("keydown", onKeyDown); }, []); const handleAddNode = (template: CanvasNodeTemplate) => { const stagger = (nodeCountRef.current % 8) * 24; nodeCountRef.current += 1; setOpen(false); void createNodeWithIntersection({ type: template.type, position: getCenteredPosition(template.width, template.height, stagger), width: template.width, height: template.height, data: template.defaultData, clientRequestId: crypto.randomUUID(), }).catch((error) => { console.error("[CanvasCommandPalette] createNode failed", error); }); }; return ( Keine Treffer. { setTheme("light"); setOpen(false); }} > Hell { setTheme("dark"); setOpen(false); }} > Dunkel
⌘K · Ctrl+K Palette umschalten
); }