import { z } from 'zod';
import { AnyCircuitElement, PcbRouteHint } from 'circuit-json';
import { EditEvent } from '@tscircuit/manual-edit-events';

declare const manual_pcb_position: z.ZodObject<{
    selector: z.ZodString;
    relative_to: z.ZodDefault<z.ZodOptional<z.ZodString>>;
    center: z.ZodObject<{
        x: z.ZodEffects<z.ZodUnion<[z.ZodString, z.ZodNumber]>, number, string | number>;
        y: z.ZodEffects<z.ZodUnion<[z.ZodString, z.ZodNumber]>, number, string | number>;
    }, "strip", z.ZodTypeAny, {
        x: number;
        y: number;
    }, {
        x: string | number;
        y: string | number;
    }>;
}, "strip", z.ZodTypeAny, {
    selector: string;
    relative_to: string;
    center: {
        x: number;
        y: number;
    };
}, {
    selector: string;
    center: {
        x: string | number;
        y: string | number;
    };
    relative_to?: string | undefined;
}>;
type ManualPcbPosition = z.infer<typeof manual_pcb_position>;
type ManualPcbPositionInput = z.input<typeof manual_pcb_position>;

declare const manualLayoutPcb: (elements: AnyCircuitElement[], positions: any[], bc: any) => void;

declare const autoLayoutSchematic: (soup: AnyCircuitElement[], config: any, bc: any) => void;

interface MinimalLayoutBuilder {
    name: string;
    applyToSoup: (soup: AnyCircuitElement[]) => AnyCircuitElement[];
}
interface ManualTraceHint {
    pcb_port_selector: string;
    offsets: PcbRouteHint[];
}
interface ManualEditFile {
    pcb_placements?: ManualPcbPositionInput[];
    manual_trace_hints?: ManualTraceHint[];
    /**
     * @deprecated edit events use ids instead of selectors so
     * aren't safe
     */
    edit_events?: EditEvent[];
}

declare const deriveSelectorFromPcbPortId: ({ soup, pcb_port_id, }: {
    soup: AnyCircuitElement[];
    pcb_port_id: string;
}) => string;

/**
 * Get the manual trace hint from an edit event
 */
declare const getManualTraceHintFromEvent: (soup: AnyCircuitElement[], editEvent: EditEvent) => ManualTraceHint;

interface InternalLayoutBuilderProps {
    manual_pcb_placement_enabled: boolean;
    manual_pcb_placement_config?: {
        positions: ManualPcbPosition[];
    };
    auto_layout_schematic_enabled: boolean;
    auto_layout_schematic_config?: {
        padding?: number | string;
    };
    manual_trace_hints: ManualTraceHint[];
    edit_events: EditEvent[];
}
interface LayoutBuilder extends InternalLayoutBuilderProps {
    autoLayoutSchematic: (opts?: {
        padding?: number;
    }) => this;
    manualPcbPlacement: (positions: ManualPcbPositionInput[]) => this;
    manualEdits: (edits: ManualEditFile) => this;
    extend: <const T extends MinimalLayoutBuilder>(ext: T) => this & Omit<T, "applyToSoup">;
    applyToSoup: (soup: AnyCircuitElement[], bc: any) => AnyCircuitElement[];
}
declare const layout: () => LayoutBuilder;

export { type LayoutBuilder, type ManualEditFile, type ManualPcbPosition, type ManualTraceHint, deriveSelectorFromPcbPortId, getManualTraceHintFromEvent, autoLayoutSchematic as internalAutoLayoutSchematic, manualLayoutPcb as internalManualLayoutPcb, layout };
