}
onViewportChange={handleViewportChange}
onViewportPreviewChange={handleViewportPreviewChange}
onCanvasMouseDown={handleCanvasMouseDown}
boxSelectEnabled={canvasTool === "box-select"}
onCanvasDoubleClick={handleCanvasDoubleClick}
onCanvasDeselect={deselectCanvas}
onContextMenu={handleCanvasContextMenu}
onDrop={handleDrop}
onFileDragEnter={handleFileDragEnter}
onFileDragLeave={handleFileDragLeave}
onFileDragOver={handleFileDragOver}
>
{
setSelectedConnectionId(connectionId);
setSelectedNodeIds(new Set());
setContextMenu(null);
}}
onConnectionContextMenu={(event, connectionId) => {
setSelectedConnectionId(connectionId);
setSelectedNodeIds(new Set());
closeConnectionCreateMenu();
setContextMenu({ type: "connection", x: event.clientX, y: event.clientY, connectionId });
}}
onNodeMouseDown={handleNodeMouseDown}
onNodeHoverStart={handleCanvasNodeHoverStart}
onNodeHoverEnd={handleCanvasNodeHoverEnd}
onConnectStart={handleConnectStart}
onNodeResize={handleNodeResize}
onToggleFrame={toggleFrameCollapsed}
onNodeTitleChange={handleNodeTitleChange}
onNodeContextMenu={handleNodeContextMenu}
onNodeContentChange={handleNodeContentChange}
onToggleBatch={toggleBatchExpanded}
onSetBatchPrimary={setBatchPrimary}
onRetry={retryCanvasNode}
onCancelTask={cancelNodeTask}
onOpenTaskDetails={openCanvasNodeTaskDetails}
onOpenVersions={openCanvasNodeVersions}
onViewImage={viewCanvasNodeImage}
onReplaceMedia={(node) => handleUploadRequest(node.id)}
onOpenTextEditor={openTextNodeEditor}
onOpenDirector={editCanvasDirector}
onOpenDrawing={openDrawingNode}
/>
{focusMode ? (
setFocusDockRevealed((value) => !value)}
onToggleAgent={() => (assistantOpen ? closeAgent() : openAgent())}
onExit={exitFocusMode}
onZoomIn={zoomCanvasIn}
onZoomOut={zoomCanvasOut}
onFit={resetViewport}
/>
) : null}
{emptyCanvasState}
{!focusMode || focusDockRevealed ? (
createNode(CanvasNodeType.Image)}
onAddVideo={() => createNode(CanvasNodeType.Video)}
onAddAudio={() => createNode(CanvasNodeType.Audio)}
onAddText={() => createNode(CanvasNodeType.Text)}
onChooseStyle={() => setStylePickerOpen(true)}
onAddScript={() => createNode(CanvasNodeType.Script)}
onAddFrame={() => createNode(CanvasNodeType.Frame)}
onAddDrawing={() => createNode(CanvasNodeType.Drawing)}
onOpenDirector={() => createDirectorShot()}
onUndo={undoCanvas}
onRedo={redoCanvas}
onUpload={() => handleUploadRequest()}
onDelete={() => deleteNodes(new Set(selectedNodeIds))}
onClear={() => setClearConfirmOpen(true)}
onDeselect={deselectCanvas}
onBackgroundModeChange={setBackgroundMode}
onShowImageInfoChange={setShowImageInfo}
onOpenMyAssets={() => {
openAssetsAtPosition();
}}
onOpenProjectCharacters={() => openProjectAssets("character")}
/>
) : null}
{assistantMounted ? (
{(resizing) => (
setCinematicAgentEntry(false)}
resizing={resizing}
/>
)}
) : null}
{angleNode?.metadata?.content ? (