import { type PerseusPlotterUserInput, type PerseusPlotterWidgetOptions, type PlotterPublicWidgetOptions } from "@khanacademy/perseus-core";
import * as React from "react";
import { PerseusI18nContext } from "../../components/i18n-context";
import type { Widget, WidgetProps } from "../../types";
import type { UnsupportedWidgetPromptJSON } from "../../widget-ai-utils/unsupported-widget";
type Props = WidgetProps<PlotterPublicWidgetOptions, PerseusPlotterUserInput> & {
    labelInterval: NonNullable<PerseusPlotterWidgetOptions["labelInterval"]>;
    picSize: NonNullable<PerseusPlotterWidgetOptions["picSize"]>;
};
type DefaultProps = {
    type: Props["type"];
    labels: Props["labels"];
    categories: Props["categories"];
    scaleY: Props["scaleY"];
    maxY: Props["maxY"];
    snapsPerLine: Props["snapsPerLine"];
    picSize: Props["picSize"];
    picBoxHeight: Props["picBoxHeight"];
    picUrl: Props["picUrl"];
    plotDimensions: Props["plotDimensions"];
    labelInterval: Props["labelInterval"];
};
type State = {
    categoryHeights: Record<string, number>;
};
declare class Plotter extends React.Component<Props, State> implements Widget {
    static contextType: React.Context<import("../../components/i18n-context").I18nContextType>;
    context: React.ContextType<typeof PerseusI18nContext>;
    _isMounted: boolean;
    shouldSetupGraphie: boolean;
    graphieDiv: React.RefObject<HTMLDivElement>;
    graphie: any;
    horizHairline: any;
    hairlineRange: any;
    static defaultProps: DefaultProps;
    state: State;
    componentDidMount(): void;
    UNSAFE_componentWillReceiveProps(nextProps: Props): void;
    componentDidUpdate(prevProps: Props, prevState: State): void;
    componentWillUnmount(): void;
    DOT_PLOT_POINT_SIZE: () => number;
    DOT_PLOT_POINT_PADDING: () => number;
    DOT_TICK_POINT_SIZE: () => number;
    setupGraphie(prevValues: number[]): void;
    showHairlines: (arg1: any) => void;
    hideHairlines: () => void;
    labelCategory: (arg1: any, arg2: any) => Promise<any>;
    setupCategories: (arg1: any) => void;
    _clampValue: (arg1: number, arg2: number, arg3: number) => number;
    _maybeShowDragPrompt: () => void;
    _maybeHideDragPrompt: () => void;
    setupBar: (arg1: any) => number;
    /**
     * Renders a segment of an interactive line to the plotter graph
     * @param i the index of the point to render
     * @param startHeight the initial height of the given point
     * @param config the graph setup, such as scale and dimensions
     */
    setupLine: (arg1: number, arg2: number, arg3: any) => number;
    setupDotplot: (arg1: any, arg2: any) => any;
    setupPic: (arg1: any, arg2: any) => any;
    setupTiledPlot: (arg1: any, arg2: any, arg3: any, arg4: any) => any;
    setPicHeight: (arg1: number, arg2: number) => void;
    changeAndTrack: (userInput: PerseusPlotterUserInput) => void;
    /**
     * Plotter uses Graphie and Graphie is inaccessible,
     * this helps us populate user input in tests
     * (not great, but not a lot of options)
     *
     * @internal
     */
    _testInsertUserInput(userInput: PerseusPlotterUserInput): void;
    drawPicHeights(values: number[], prevValues: number[]): void;
    getPromptJSON(): UnsupportedWidgetPromptJSON;
    /**
     * @deprecated and likely very broken API
     * [LEMS-3185] do not trust serializedState
     */
    getSerializedState(): {
        values: PerseusPlotterUserInput;
        type: import("@khanacademy/perseus-core").PlotType;
        labels: string[];
        categories: string[];
        maxY: number;
        scaleY: number;
        labelInterval: number;
        snapsPerLine: number;
        starting: number[];
        picUrl?: string | null;
        picSize: number;
        picBoxHeight?: number | null;
        plotDimensions: number[];
        trackInteraction: (extraData?: Empty | undefined) => void;
        widgetId: string;
        widgetIndex: number;
        alignment: string | null | undefined;
        static: boolean | null | undefined;
        problemNum: number | null | undefined;
        apiOptions: Readonly<Readonly<{
            isArticle?: boolean;
            onFocusChange?: (newFocusPath: import("../..").FocusPath, oldFocusPath: import("../..").FocusPath, keypadHeight?: number, focusedElement?: HTMLElement) => unknown;
            showAlignmentOptions?: boolean;
            readOnly?: boolean;
            editingDisabled?: boolean;
            answerableCallback?: (arg1: boolean) => unknown;
            getAnotherHint?: () => unknown;
            interactionCallback?: (widgetData: {
                [widgetId: string]: any;
            }) => void;
            imagePlaceholder?: React.ReactNode;
            widgetPlaceholder?: React.ReactNode;
            baseElements?: {
                Link: React.ComponentType<any>;
            };
            imagePreloader?: (dimensions: import("../../types").Dimensions) => React.ReactNode;
            trackInteraction?: (args: {
                type: string;
                id: string;
                correct?: boolean;
            } & Partial<import("../../types").TrackingGradedGroupExtraArguments> & Partial<{
                visible: number;
            }>) => void;
            customKeypad?: boolean;
            nativeKeypadProxy?: (blur: () => void) => import("@khanacademy/math-input").KeypadAPI;
            isMobile?: boolean;
            isMobileApp?: boolean;
            setDrawingAreaAvailable?: (arg1: boolean) => unknown;
            hintProgressColor?: string;
            canScrollPage?: boolean;
            editorChangeDelay?: number;
            flags?: Record<"new-radio-widget" | "image-widget-upgrade", boolean>;
        }> & {
            baseElements: NonNullable<import("../..").APIOptions["baseElements"]>;
            canScrollPage: NonNullable<import("../..").APIOptions["canScrollPage"]>;
            editorChangeDelay: NonNullable<import("../..").APIOptions["editorChangeDelay"]>;
            isArticle: NonNullable<import("../..").APIOptions["isArticle"]>;
            isMobile: NonNullable<import("../..").APIOptions["isMobile"]>;
            isMobileApp: NonNullable<import("../..").APIOptions["isMobileApp"]>;
            editingDisabled: NonNullable<import("../..").APIOptions["editingDisabled"]>;
            onFocusChange: NonNullable<import("../..").APIOptions["onFocusChange"]>;
            readOnly: NonNullable<import("../..").APIOptions["readOnly"]>;
            setDrawingAreaAvailable: NonNullable<import("../..").APIOptions["setDrawingAreaAvailable"]>;
            showAlignmentOptions: NonNullable<import("../..").APIOptions["showAlignmentOptions"]>;
        }>;
        keypadElement?: any;
        questionCompleted?: boolean;
        onFocus: (blurPath: import("../..").FocusPath) => void;
        onBlur: (blurPath: import("../..").FocusPath) => void;
        findWidgets: (criterion: import("../../types").FilterCriterion) => ReadonlyArray<Widget>;
        reviewMode: boolean;
        showSolutions?: import("@khanacademy/perseus-core").ShowSolutions;
        handleUserInput: (newUserInput: PerseusPlotterUserInput, cb?: () => void, silent?: boolean) => void;
        linterContext: import("@khanacademy/perseus-linter").LinterContextProps;
        containerSizeClass: import("../../util/sizing-utils").SizeClass;
    };
    render(): React.ReactNode;
}
declare function getStartUserInput(options: PlotterPublicWidgetOptions): PerseusPlotterUserInput;
declare function getCorrectUserInput(options: PerseusPlotterWidgetOptions): PerseusPlotterUserInput;
/**
 * @deprecated and likely a very broken API
 * [LEMS-3185] do not trust serializedState
 */
declare function getUserInputFromSerializedState(serializedState: any): PerseusPlotterUserInput;
declare const _default: {
    name: string;
    displayName: string;
    hidden: true;
    widget: typeof Plotter;
    getCorrectUserInput: typeof getCorrectUserInput;
    getStartUserInput: typeof getStartUserInput;
    getUserInputFromSerializedState: typeof getUserInputFromSerializedState;
};
export default _default;
