diff --git a/components/canvas/nodes/base-node-wrapper.tsx b/components/canvas/nodes/base-node-wrapper.tsx
index 91e6f15..e83473c 100644
--- a/components/canvas/nodes/base-node-wrapper.tsx
+++ b/components/canvas/nodes/base-node-wrapper.tsx
@@ -9,8 +9,11 @@ import {
useNodeId,
useReactFlow,
} from "@xyflow/react";
-import { Trash2, Copy } from "lucide-react";
+import { Trash2, Copy, Star } from "lucide-react";
import { useCanvasPlacement } from "@/components/canvas/canvas-placement-context";
+import { useCanvasSync } from "@/components/canvas/canvas-sync-context";
+import type { Id } from "@/convex/_generated/dataModel";
+import { readNodeFavorite, setNodeFavorite } from "@/lib/canvas-node-favorite";
import { isCanvasNodeType } from "@/lib/canvas-node-types";
import { NodeErrorBoundary } from "./node-error-boundary";
@@ -89,6 +92,19 @@ function NodeToolbarActions({
const nodeId = useNodeId();
const { deleteElements, getNode, getNodes, getEdges, setNodes } = useReactFlow();
const { createNodeWithIntersection } = useCanvasPlacement();
+ const { queueNodeDataUpdate } = useCanvasSync();
+ const isFavorite = readNodeFavorite(nodeId ? getNode(nodeId)?.data : undefined);
+
+ const handleFavoriteToggle = () => {
+ if (!nodeId) return;
+ const currentData = getNode(nodeId)?.data;
+ const nextData = setNodeFavorite(!readNodeFavorite(currentData), currentData);
+ void queueNodeDataUpdate({
+ nodeId: nodeId as Id<"nodes">,
+ data: nextData,
+ });
+ };
+
const handleDelete = () => {
if (!nodeId) return;
const node = getNode(nodeId);
@@ -188,6 +204,22 @@ function NodeToolbarActions({
{action.icon}
))}
+