import { type Edge, type Node } from "@xyflow/react";
import "@xyflow/react/dist/style.css";
import type { GraphOrientation, GraphLayoutSnapshot, TaskDependency, TaskItem, TaskStatus, TaskPriority, TaskExecutionState, ProjectPermission, TaskAssigneeType } from "../types";
type TaskNodeData = {
    taskId: string;
    taskKey: string | null;
    title: string;
    taskType: string | null;
    status: TaskStatus;
    executionState: TaskExecutionState | null | undefined;
    showExecutionStateBadge: boolean;
    priority: TaskPriority | null;
    assigneeType: TaskAssigneeType | null;
    assigneeDisplayName: string | null;
    isSelected: boolean;
    isBlocked: boolean;
    orientation: GraphOrientation;
    dependencySourceHandle: "right" | "bottom";
    hierarchySourceHandle: "right" | "bottom";
    onSelect: (taskId: string) => void;
    /** When set, shows a create-dependent-task control near the right handle. */
    onAddDependentTaskFromNode?: (taskId: string) => void;
    /** When set, shows a create-subtask control near the bottom handle. */
    onAddChildTaskFromNode?: (taskId: string) => void;
    /** When set (e.g. project template editor), shows a remove control on each node. */
    onRemoveTask?: (taskId: string) => void;
};
type TaskGraphEdgeData = {
    relationship: "dependency" | "hierarchy";
    taskId?: string;
    dependsOnTaskId?: string;
};
type TaskGraphEdge = Edge<TaskGraphEdgeData>;
export declare function buildDependencyGraphLayout(args: {
    tasks: TaskItem[];
    dependencies: TaskDependency[];
    orientation?: GraphOrientation;
    autoLayoutStrategy?: "allEdges" | "hierarchy";
}): {
    nodes: Node<TaskNodeData>[];
    edges: TaskGraphEdge[];
};
export declare function DependencyGraphView(props: {
    projectId?: string;
    layoutKey?: string;
    tasks: TaskItem[];
    dependencies: TaskDependency[];
    savedLayout?: GraphLayoutSnapshot | null;
    selectedTaskId: string | null;
    selectedDependencyId?: string | null;
    onSelectTask: (taskId: string) => void;
    onSelectDependency?: (taskId: string, dependencyId: string) => void;
    onClearDependencySelection?: () => void;
    permission?: ProjectPermission;
    canPersistLayout?: boolean;
    onPersistLayout?: (layout: GraphLayoutSnapshot) => Promise<GraphLayoutSnapshot | null>;
    onLayoutSaved?: (layout: GraphLayoutSnapshot | null) => void;
    highlightBlockedTasks?: boolean;
    showExecutionStateBadges?: boolean;
    emptyStateTitle?: string;
    emptyStateDescription?: string;
    orientation?: GraphOrientation;
    autoLayoutStrategy?: "allEdges" | "hierarchy";
    showOrientationToggle?: boolean;
    /** Debounce before persisting layout (API or parent callback). Use 0 for immediate sync (e.g. project template draft). */
    layoutSaveDebounceMs?: number;
    /** When set, shows a create-dependent-task action near the right handle of each node. */
    onAddDependentTaskFromNode?: (taskId: string) => void;
    /** When set, shows a create-subtask action near the bottom handle of each node. */
    onAddChildTaskFromNode?: (taskId: string) => void;
    /** Remove control on each node (e.g. project template task templates). */
    onRemoveTask?: (taskId: string) => void;
    /** Enable creating graph relationships by dragging from source handles to target handles. */
    allowDependencyConnect?: boolean;
    /** Called when the graph creates a new dependency link. */
    onCreateDependency?: (dependsOnTaskId: string, taskId: string) => void;
    /** Called when the graph creates a parent-child relationship from the bottom handle. */
    onCreateChildRelationship?: (parentTaskId: string, childTaskId: string) => void;
    /** MiniMap (overview) width in px. */
    miniMapWidth?: number;
    /** MiniMap (overview) height in px. */
    miniMapHeight?: number;
    /**
     * When false, the overview minimap is not rendered.
     * When true, the minimap is always shown.
     * When omitted (undefined), visibility follows container width (hidden below a minimum width).
     */
    showMiniMap?: boolean;
    /** Whether the surrounding task editor is currently maximized. */
    isMaximized?: boolean;
    /** Toggle the surrounding task editor maximize state. */
    onToggleMaximized?: () => void;
}): import("react").JSX.Element;
export {};
