import { LayoutProps, Layout, CanvasStyleSignal, PossibleCanvasStyle, LineProps, Line } from '@motion-canvas/2d';
import { SignalValue, PossibleVector2, PossibleColor, Vector2Signal, SimpleSignal, BBox, Vector2 } from '@motion-canvas/core';

interface PlotProps extends LayoutProps {
    minX?: SignalValue<number>;
    minY?: SignalValue<number>;
    min?: SignalValue<PossibleVector2>;
    maxX?: SignalValue<number>;
    maxY?: SignalValue<number>;
    max?: SignalValue<PossibleVector2>;
    ticksX?: SignalValue<number>;
    ticksY?: SignalValue<number>;
    ticks?: SignalValue<PossibleVector2>;
    labelSizeX?: SignalValue<number>;
    labelSizeY?: SignalValue<number>;
    labelSize?: SignalValue<PossibleVector2>;
    labelPaddingX?: SignalValue<number>;
    labelPaddingY?: SignalValue<number>;
    labelPadding?: SignalValue<PossibleVector2>;
    tickPaddingX?: SignalValue<number>;
    tickPaddingY?: SignalValue<number>;
    tickPadding?: SignalValue<PossibleVector2>;
    tickLabelSizeX?: SignalValue<number>;
    tickLabelSizeY?: SignalValue<number>;
    tickLabelSize?: SignalValue<PossibleVector2>;
    tickOverflowX?: SignalValue<number>;
    tickOverflowY?: SignalValue<number>;
    tickOverflow?: SignalValue<PossibleVector2>;
    gridStrokeWidth?: SignalValue<number>;
    axisStrokeWidth?: SignalValue<number>;
    labelX?: SignalValue<string>;
    axisColorX?: SignalValue<PossibleColor>;
    axisTextColorX?: SignalValue<PossibleColor>;
    labelY?: SignalValue<string>;
    axisColorY?: SignalValue<PossibleColor>;
    axisTextColorY?: SignalValue<PossibleColor>;
    labelFormatterX?: (x: number) => string;
    labelFormatterY?: (y: number) => string;
}
declare class Plot extends Layout {
    readonly min: Vector2Signal<this>;
    readonly max: Vector2Signal<this>;
    readonly ticks: Vector2Signal<this>;
    readonly labelSize: Vector2Signal<this>;
    readonly labelPadding: Vector2Signal<this>;
    readonly tickLabelSize: Vector2Signal<this>;
    readonly tickOverflow: Vector2Signal<this>;
    readonly tickPadding: Vector2Signal<this>;
    readonly gridStrokeWidth: Vector2Signal<this>;
    readonly axisStrokeWidth: Vector2Signal<this>;
    readonly axisColorX: CanvasStyleSignal<this>;
    readonly axisTextColorX: CanvasStyleSignal<this>;
    readonly labelX: SimpleSignal<string, this>;
    readonly axisColorY: CanvasStyleSignal<this>;
    readonly axisTextColorY: CanvasStyleSignal<this>;
    readonly labelY: SimpleSignal<string, this>;
    readonly labelFormatterX: (x: number) => string;
    readonly labelFormatterY: (y: number) => string;
    private edgePadding;
    constructor(props?: PlotProps);
    cacheBBox(): BBox;
    protected draw(context: CanvasRenderingContext2D): void;
    getPath(): Path2D;
    getPointFromPlotSpace(point: PossibleVector2): Vector2;
    private mapToX;
    private mapToY;
    private toRelativeGridSize;
    makeGraphData(resolution: number, f: (x: number) => number): [number, number][];
}

interface ScatterPlotProps extends LayoutProps {
    pointRadius?: number;
    pointColor?: PossibleCanvasStyle;
    data?: SignalValue<PossibleVector2[]>;
    start?: SignalValue<number>;
    end?: SignalValue<number>;
}
declare class ScatterPlot extends Layout {
    readonly pointRadius: SimpleSignal<number, this>;
    readonly pointColor: CanvasStyleSignal<this>;
    readonly data: SimpleSignal<[number, number][], this>;
    readonly start: SimpleSignal<number, this>;
    readonly end: SimpleSignal<number, this>;
    private firstIndex;
    private firstPointProgress;
    private lastIndex;
    private pointProgress;
    constructor(props?: ScatterPlotProps);
    protected draw(context: CanvasRenderingContext2D): void;
}

interface LinePlotProps extends LineProps {
    data?: [number, number][];
    points?: never;
}
declare class LinePlot extends Line {
    readonly data: SimpleSignal<[number, number][], this>;
    constructor(props?: LinePlotProps);
    parsedPoints(): Vector2[];
    protected childrenBBox(): BBox;
}

export { LinePlot, type LinePlotProps, Plot, type PlotProps, ScatterPlot, type ScatterPlotProps };
