/** * @license * Copyright 2024 Nuraly, Laabidi Aymen * SPDX-License-Identifier: MIT */ import { LitElement, nothing } from 'lit'; import { Workflow, WorkflowNode, WorkflowEdge, NodeType, Position, CanvasMode, CanvasType, type UndoProvider } from './workflow-canvas.types.js'; import '../icon/icon.component.js'; import '../input/input.component.js'; import '../chatbot/chatbot.component.js'; import { ChatbotCoreController } from '../chatbot/core/chatbot-core.controller.js'; import { ViewportController, SelectionController, ConnectionController, KeyboardController, DragController, ConfigController, MarqueeController, ClipboardController, UndoController, FrameController, CollaborationController, type MarqueeState } from './controllers/index.js'; import type { ConnectionState, DragState, CanvasHost, ContextMenuState, CanvasViewport } from './interfaces/index.js'; declare const BaseCanvasElement_base: (new (...args: any[]) => import("@nuralyui/common/mixins").DependencyAware) & (new (...args: any[]) => import("@nuralyui/common/mixins").ThemeAware) & (new (...args: any[]) => import("@nuralyui/common/mixins").EventHandlerCapable) & (new (...args: any[]) => import("packages/common/src/shared/base-mixin.js").LightDomContent) & typeof LitElement; /** * Abstract base class for canvas components (workflow & whiteboard). * * Shared infrastructure: controllers, lifecycle, event handlers, * dispatch helpers, frame handling, note editing, and render helpers. * * Subclasses implement abstract hooks for differences in node * normalization, containment dimensions, note config keys, etc. */ export declare abstract class BaseCanvasElement extends BaseCanvasElement_base implements CanvasHost { static useShadowDom: boolean; protected _workflow: Workflow; get workflow(): Workflow; set workflow(value: Workflow); readonly: boolean; disabled: boolean; showMinimap: boolean; showToolbar: boolean; showZoomControls: boolean; showPalette: boolean; canvasId: string; collaborative: boolean; userId: string; namespace: string; get undoProvider(): UndoProvider | null; set undoProvider(provider: UndoProvider | null); viewport: CanvasViewport; mode: CanvasMode; selectedNodeIds: Set; selectedEdgeIds: Set; connectionState: ConnectionState | null; dragState: DragState | null; contextMenu: ContextMenuState | null; isPanning: boolean; panStart: Position; hoveredEdgeId: string | null; marqueeState: MarqueeState | null; lastMousePosition: Position | null; protected editingFrameLabelId: string | null; protected editingNoteId: string | null; configuredNode: WorkflowNode | null; insertPanelNode: WorkflowNode | null; expandedCategories: Set; protected showChatbotPanel: boolean; protected chatbotUnreadCount: number; protected canvasChatbotController: ChatbotCoreController | null; protected noteResizeState: { nodeId: string; startX: number; startY: number; startWidth: number; startHeight: number; } | null; canvasWrapper: HTMLElement; canvasViewport: HTMLElement; configPanel: HTMLElement; insertPanel: HTMLElement; insertPanelColumns: any[]; insertPanelSchemaName: string; protected viewportController: ViewportController; protected selectionController: SelectionController; protected connectionController: ConnectionController; protected dragController: DragController; protected configController: ConfigController; protected marqueeController: MarqueeController; protected clipboardController: ClipboardController; protected keyboardController: KeyboardController; protected undoController: UndoController; protected frameController: FrameController; protected collaborationController: CollaborationController; constructor(); /** Normalize nodes during workflow setter (e.g. uppercase status, clear flags). */ protected abstract normalizeNodes(nodes: WorkflowNode[]): WorkflowNode[]; /** Node dimensions used for frame containment centre-point check. */ protected abstract getNodeDimensionsForContainment(node: WorkflowNode): { width: number; height: number; }; /** Whether a non-frame node should be excluded from containment (e.g. NOTE in workflow). */ protected abstract shouldExcludeFromContainment(node: WorkflowNode): boolean; /** Called after _workflow is set and viewport restored. */ protected abstract onWorkflowLoaded(value: Workflow, oldValue: Workflow): void; /** Config key that stores a note's text content (e.g. 'noteContent' vs 'textContent'). */ protected abstract getNoteContentKey(node: WorkflowNode): string; /** Config keys for note width/height (e.g. noteWidth/noteHeight vs width/height). */ protected abstract getNoteSizeKeys(): { widthKey: string; heightKey: string; }; /** Default note size used when config has no width/height. */ protected abstract getDefaultNoteSize(): { width: number; height: number; }; /** Canvas type for the toolbar template. */ protected abstract getCanvasType(): CanvasType; /** Extra logic at the start of handleCanvasMouseDown (e.g. close colour picker). */ protected onCanvasMouseDownExtra(_e: MouseEvent): void; /** Extra logic in handleGlobalMouseMove; return true to short-circuit remaining handlers. */ protected onGlobalMouseMoveExtra(_e: MouseEvent): boolean; /** Extra logic after standard handleNodeMouseDown (e.g. auto-open chat preview). */ protected onNodeMouseDownExtra(_node: WorkflowNode): void; /** Called at end of connectedCallback. */ protected onConnected(): void; /** Called at end of disconnectedCallback. */ protected onDisconnected(): void; /** Called when note resize starts (e.g. add touch listeners). */ protected onNoteResizeStarted(_node: WorkflowNode, _event: MouseEvent): void; /** Called when note resize stops (e.g. remove touch listeners, broadcast). */ protected onNoteResizeStopped(_nodeId: string): void; /** Return nodes for edge/frame/visible-node rendering. Workflow overrides to apply statuses. */ protected getNodesForRendering(): WorkflowNode[]; private isNodeInsideFrame; private computeFrameContainment; connectedCallback(): Promise; disconnectedCallback(): void; willUpdate(changedProperties: Map): void; setWorkflow(workflow: Workflow): void; dispatchWorkflowChanged(): void; dispatchViewportChanged(): void; dispatchNodeSelected(node: WorkflowNode): void; dispatchNodeMoved(node: WorkflowNode, position: Position): void; protected handleGlobalMouseUp: (e: MouseEvent) => void; protected handleGlobalMouseMove: (e: MouseEvent) => void; protected handleCanvasMouseDown: (e: MouseEvent) => void; protected handleCanvasContextMenu: (e: MouseEvent) => void; protected handleNodeMouseDown(e: CustomEvent): void; protected handleEdgeClick(e: MouseEvent, edge: WorkflowEdge): void; protected handlePortMouseDown(e: CustomEvent): void; protected handlePortMouseUp(e: CustomEvent): void; protected addNode(type: NodeType, position?: Position): void; protected handleCanvasDrop: (e: DragEvent) => void; protected handleCanvasDragOver: (e: DragEvent) => void; protected getPortPosition(node: WorkflowNode, portId: string, isInput: boolean): Position; protected getFrameNodes(): WorkflowNode[]; protected getVisibleNonFrameNodes(): WorkflowNode[]; protected renderExpandedFrame(frame: WorkflowNode): import("lit-html").TemplateResult | null; protected handleFrameMouseDown(e: MouseEvent, frame: WorkflowNode): void; protected handleFrameDblClick(e: MouseEvent, frame: WorkflowNode): void; protected handleFrameResize(e: MouseEvent, frame: WorkflowNode, handle: string): void; protected startEditingFrameLabel(e: MouseEvent, frame: WorkflowNode): void; protected handleFrameLabelBlur(e: FocusEvent, frame: WorkflowNode): void; protected handleFrameLabelKeydown(e: KeyboardEvent, frame: WorkflowNode): void; protected saveFrameLabel(frame: WorkflowNode, newLabel: string): void; protected handleNoteContentChange(e: CustomEvent): void; protected handleNoteEditEnd(_e: CustomEvent): void; protected handleNoteResizeStart(e: CustomEvent): void; protected startNoteResize(node: WorkflowNode, event: MouseEvent): void; protected handleNoteResizeWithCoords(clientX: number, clientY: number): void; protected handleNoteResizeDrag: (event: MouseEvent) => void; protected stopNoteResize: () => void; protected initCanvasChatbotController(): void; toggleChatbotPanel(): void; protected renderEdges(): import("lit-html").SVGTemplateResult; protected renderToolbar(): typeof nothing | import("lit-html").TemplateResult; protected renderZoomControls(): typeof nothing | import("lit-html").TemplateResult; protected renderContextMenu(): typeof nothing | import("lit-html").TemplateResult; protected renderEmptyState(): typeof nothing | import("lit-html").TemplateResult; protected renderMarqueeBox(): import("lit-html").TemplateResult<1>; protected renderRemoteCursors(): typeof nothing | import("lit-html").TemplateResult<1>[]; /** * Render the "{user} is editing" pills above every node that a remote user * currently holds a lock on. Meant to be rendered inside the viewport- * transformed nodes layer so coordinates stay in canvas space. */ protected renderNodeLockOverlays(): typeof nothing | import("lit-html").TemplateResult<1>[]; protected handlePanToUser(userId: string): void; protected renderPresenceBar(): typeof nothing | import("lit-html").TemplateResult<1>; protected renderConfigPanel(): typeof nothing | import("lit-html").TemplateResult; protected renderChatbotPanel(): typeof nothing | import("lit-html").TemplateResult; } export {}; //# sourceMappingURL=base-canvas.component.d.ts.map