import type { Block, TBlock } from "../components/canvas/blocks/Block";
import { BlockConnection } from "../components/canvas/connections/BlockConnection";
import { Component } from "../lib";
import type { TGetCameraBlockScaleLevel } from "../services/camera/defaultGetCameraBlockScaleLevel";
import type { EWheelIntent, TResolveWheelIntent, TResolveWheelIntentOptions } from "../utils/functions/wheelIntent";
import { TConnection } from "./connection/ConnectionState";
import { RootStore } from "./index";
/** @deprecated Use ECanDrag and setting canDrag instead */
export declare enum ECanChangeBlockGeometry {
    ALL = "all",
    ONLY_SELECTED = "onlySelected",
    NONE = "none"
}
export declare enum ECanDrag {
    /** Any component can be dragged. If component is in selection, all selected draggable components move together */
    ALL = "all",
    /** Only selected components can be dragged */
    ONLY_SELECTED = "onlySelected",
    /** Drag is disabled for all components (except manual drag via startDrag) */
    NONE = "none"
}
export type TGraphSettingsConfig<Block extends TBlock = TBlock, Connection extends TConnection = TConnection> = {
    canDragCamera: boolean;
    canZoomCamera: boolean;
    /** @deprecated Use NewBlockLayer parameters instead */
    canDuplicateBlocks?: boolean;
    /** @deprecated Use canDrag instead */
    canChangeBlockGeometry?: ECanChangeBlockGeometry;
    /** Controls which components can be dragged */
    canDrag?: ECanDrag;
    /**
     * Minimum distance in pixels the mouse must move before a drag operation starts.
     * Helps prevent accidental drags during clicks. Default: 3
     */
    dragThreshold?: number;
    /**
     * Controls if connections can be created via anchors
     * If this connection is enabled, then anchors are not draggable and connection creation is handled by ConnectionLayer.
     * */
    canCreateNewConnections: boolean;
    scaleFontSize: number;
    showConnectionArrows: boolean;
    useBezierConnections: boolean;
    bezierConnectionDirection: "vertical" | "horizontal";
    useBlocksAnchors: boolean;
    connectivityComponentOnClickRaise: boolean;
    showConnectionLabels: boolean;
    blockComponents: Record<string, typeof Block<Block>>;
    connection?: typeof BlockConnection<Connection>;
    background?: typeof Component;
    /**
     * When enabled, mouseenter/mouseleave events are re-evaluated after each camera change.
     * Useful for trackpads where panning does not trigger native mousemove events,
     * so hovering over elements requires this emulation to work correctly.
     * Default: false
     */
    emulateMouseEventsOnCameraChange?: boolean;
    /**
     * Classifies wheel input as pan or zoom intent so Camera can route without knowing device type.
     * Receives `mouseWheelBehavior` and `wheelInputDevice` from camera constants so wheel policy
     * stays in the input layer, not Camera.
     *
     * Transitional: today Camera calls {@link GraphEditorSettings.wheelIntentFromEvent} from a raw
     * `wheel` listener. A future input layer will normalize DOM events and emit semantic graph events
     * (`camera:pan`, `camera:zoom`, …); this callback is the classification hook until then.
     *
     * @default {@link createWheelIntentResolver} — gesture-shape heuristics (pan vs zoom intent).
     */
    resolveWheelIntent: TResolveWheelIntent;
    /**
     * Maps camera scale to block zoom tier (minimalistic / schematic / detailed).
     * Always set at runtime; `setupSettings` falls back to the exported `defaultGetCameraBlockScaleLevel` when omitted.
     */
    getCameraBlockScaleLevel: TGetCameraBlockScaleLevel;
};
export declare const DefaultSettings: TGraphSettingsConfig;
export declare class GraphEditorSettings {
    rootStore: RootStore;
    $settings: import("@preact/signals-core").Signal<TGraphSettingsConfig<TBlock, {
        id?: import("./connection/ConnectionState").TConnectionId;
        sourceBlockId?: import("..").TBlockId;
        targetBlockId?: import("..").TBlockId;
        sourceAnchorId?: string;
        targetAnchorId?: string;
        sourcePortId?: import("..").TPortId;
        targetPortId?: import("..").TPortId;
        label?: string;
        styles?: Partial<import("../graphConfig").TConnectionColors> & {
            dashes?: number[];
        };
        dashed?: boolean;
        selected?: boolean;
    }>>;
    $blockComponents: import("@preact/signals-core").ReadonlySignal<Record<string, {
        new (props: import("../components/canvas/blocks/Block").TBlockProps, parent: Component): Block<TBlock, import("../components/canvas/blocks/Block").TBlockProps>;
        IS: "Block";
        create<Props extends import("../lib/CoreComponent").CoreComponentProps, Context extends import("../lib/CoreComponent").CoreComponentContext>(this: Constructor<import("../lib").CoreComponent<Props, Context>>, props?: Props, options?: {
            readonly key?: string;
            readonly ref?: ((inst: unknown) => void) | string;
        }): import("../lib/CoreComponent").ComponentDescriptor<Props, Context>;
        mount<Props extends import("../lib/CoreComponent").CoreComponentProps, Context extends import("../lib/CoreComponent").CoreComponentContext>(Component: Constructor<import("../lib").CoreComponent<Props, Context>>, props?: Props): import("../lib").CoreComponent<Props, Context>;
        unmount(instance: any): void;
    }>>;
    $background: import("@preact/signals-core").ReadonlySignal<typeof Component>;
    $connection: import("@preact/signals-core").ReadonlySignal<{
        new (props: import("../components/canvas/connections/BlockConnection").TConnectionProps, parent: import("../components/canvas/connections/BlockConnections").BlockConnections): BlockConnection<{
            id?: import("./connection/ConnectionState").TConnectionId;
            sourceBlockId?: import("..").TBlockId;
            targetBlockId?: import("..").TBlockId;
            sourceAnchorId?: string;
            targetAnchorId?: string;
            sourcePortId?: import("..").TPortId;
            targetPortId?: import("..").TPortId;
            label?: string;
            styles?: Partial<import("../graphConfig").TConnectionColors> & {
                dashes?: number[];
            };
            dashed?: boolean;
            selected?: boolean;
        }>;
        create<Props extends import("../lib/CoreComponent").CoreComponentProps, Context extends import("../lib/CoreComponent").CoreComponentContext>(this: Constructor<import("../lib").CoreComponent<Props, Context>>, props?: Props, options?: {
            readonly key?: string;
            readonly ref?: ((inst: unknown) => void) | string;
        }): import("../lib/CoreComponent").ComponentDescriptor<Props, Context>;
        mount<Props extends import("../lib/CoreComponent").CoreComponentProps, Context extends import("../lib/CoreComponent").CoreComponentContext>(Component: Constructor<import("../lib").CoreComponent<Props, Context>>, props?: Props): import("../lib").CoreComponent<Props, Context>;
        unmount(instance: any): void;
    }>;
    constructor(rootStore: RootStore);
    setupSettings(config: Partial<TGraphSettingsConfig>): void;
    setConfigFlag<K extends keyof TGraphSettingsConfig>(flagPath: K, value: TGraphSettingsConfig[K]): void;
    getConfigFlag(flagPath: keyof TGraphSettingsConfig): number | boolean | typeof Component | TGetCameraBlockScaleLevel | "vertical" | "horizontal" | TResolveWheelIntent | {
        new (props: import("../components/canvas/connections/BlockConnection").TConnectionProps, parent: import("../components/canvas/connections/BlockConnections").BlockConnections): BlockConnection<{
            id?: import("./connection/ConnectionState").TConnectionId;
            sourceBlockId?: import("..").TBlockId;
            targetBlockId?: import("..").TBlockId;
            sourceAnchorId?: string;
            targetAnchorId?: string;
            sourcePortId?: import("..").TPortId;
            targetPortId?: import("..").TPortId;
            label?: string;
            styles?: Partial<import("../graphConfig").TConnectionColors> & {
                dashes?: number[];
            };
            dashed?: boolean;
            selected?: boolean;
        }>;
        create<Props extends import("../lib/CoreComponent").CoreComponentProps, Context extends import("../lib/CoreComponent").CoreComponentContext>(this: Constructor<import("../lib").CoreComponent<Props, Context>>, props?: Props, options?: {
            readonly key?: string;
            readonly ref?: ((inst: unknown) => void) | string;
        }): import("../lib/CoreComponent").ComponentDescriptor<Props, Context>;
        mount<Props extends import("../lib/CoreComponent").CoreComponentProps, Context extends import("../lib/CoreComponent").CoreComponentContext>(Component: Constructor<import("../lib").CoreComponent<Props, Context>>, props?: Props): import("../lib").CoreComponent<Props, Context>;
        unmount(instance: any): void;
    } | ECanChangeBlockGeometry | ECanDrag | Record<string, {
        new (props: import("../components/canvas/blocks/Block").TBlockProps, parent: Component): Block<TBlock, import("../components/canvas/blocks/Block").TBlockProps>;
        IS: "Block";
        create<Props extends import("../lib/CoreComponent").CoreComponentProps, Context extends import("../lib/CoreComponent").CoreComponentContext>(this: Constructor<import("../lib").CoreComponent<Props, Context>>, props?: Props, options?: {
            readonly key?: string;
            readonly ref?: ((inst: unknown) => void) | string;
        }): import("../lib/CoreComponent").ComponentDescriptor<Props, Context>;
        mount<Props extends import("../lib/CoreComponent").CoreComponentProps, Context extends import("../lib/CoreComponent").CoreComponentContext>(Component: Constructor<import("../lib").CoreComponent<Props, Context>>, props?: Props): import("../lib").CoreComponent<Props, Context>;
        unmount(instance: any): void;
    }>;
    /**
     * Resolves wheel intent using {@link TGraphSettingsConfig.resolveWheelIntent} (typed; prefer over getConfigFlag).
     */
    wheelIntentFromEvent(event: WheelEvent, options: TResolveWheelIntentOptions): EWheelIntent;
    $connectionsSettings: import("@preact/signals-core").ReadonlySignal<{
        useBezierConnections: boolean;
        showConnectionLabels: boolean;
        canCreateNewConnections: boolean;
        showConnectionArrows: boolean;
        bezierConnectionDirection: "vertical" | "horizontal";
    }>;
    /**
     * Computed canDrag setting with backward compatibility.
     * Priority: canChangeBlockGeometry (deprecated, for existing users) > canDrag > default ALL
     */
    $canDrag: import("@preact/signals-core").ReadonlySignal<ECanDrag>;
    /**
     * Drag threshold in pixels. Default: 3
     */
    $dragThreshold: import("@preact/signals-core").ReadonlySignal<number>;
    toJSON(): TGraphSettingsConfig<TBlock, {
        id?: import("./connection/ConnectionState").TConnectionId;
        sourceBlockId?: import("..").TBlockId;
        targetBlockId?: import("..").TBlockId;
        sourceAnchorId?: string;
        targetAnchorId?: string;
        sourcePortId?: import("..").TPortId;
        targetPortId?: import("..").TPortId;
        label?: string;
        styles?: Partial<import("../graphConfig").TConnectionColors> & {
            dashes?: number[];
        };
        dashed?: boolean;
        selected?: boolean;
    }>;
    get asConfig(): TGraphSettingsConfig;
    reset(): void;
}
