/**
 * Parse/serialize an SVG path `d` into an editable cubic-Bézier anchor model
 * used by the node editor. Every segment is normalized to a cubic so each
 * anchor has at most an incoming + outgoing control handle — the same mental
 * model as the motion-path editor.
 *
 * Supported input commands: M m L l H h V v C c S s Q q T t Z z.
 * Arcs (A/a) are not supported; `parsePath` returns null so the caller can
 * keep node-editing disabled for those paths.
 */
export interface Anchor {
    x: number;
    y: number;
    /** Incoming control point (absolute). Undefined = straight into anchor. */
    cin?: {
        x: number;
        y: number;
    };
    /** Outgoing control point (absolute). */
    cout?: {
        x: number;
        y: number;
    };
}
export interface SubPath {
    anchors: Anchor[];
    closed: boolean;
}
export declare function parsePath(d: string): SubPath[] | null;
/**
 * Reduce anchor count via Ramer–Douglas–Peucker on anchor positions. Used to
 * make a dense freehand outline node-editable (otherwise it has hundreds of
 * handles). Kept anchors retain their Bézier handles; dropped ones become
 * straight. `tolerance` is in the path's own coordinate units.
 */
export declare function simplifyAnchors(subs: SubPath[], tolerance: number): SubPath[];
export declare function serializePath(subs: SubPath[]): string;
