/**
 * Copyright (c) 2018-2026 mol* contributors, licensed under MIT, See LICENSE file for more info.
 *
 * @author David Sehnal <david.sehnal@gmail.com>
 * @author Alexander Rose <alexander.rose@weirdbyte.de>
 * @author Lukáš Polák <admin@lukaspolak.cz>
 */
import * as React from 'react';
import { Vec2 } from '../../mol-math/linear-algebra.js';
import { Legend as LegendData } from '../../mol-util/legend.js';
import { ParamDefinition as PD } from '../../mol-util/param-definition.js';
import { ParamMapping } from '../../mol-util/param-mapping.js';
import { PluginUIComponent } from '../base.js';
import { PluginUIContext } from '../context.js';
import { ActionMenu } from './action-menu.js';
export type ParameterControlsCategoryFilter = string | null | (string | null)[];
export interface ParameterControlsProps<P extends PD.Params = PD.Params> {
    params: P;
    values: any;
    onChange?: ParamsOnChange<PD.ValuesFor<P>>;
    onChangeValues?: (values: PD.ValuesFor<P>, prev: PD.ValuesFor<P>) => void;
    isDisabled?: boolean;
    onEnter?: () => void;
}
export declare class ParameterControls<P extends PD.Params> extends React.PureComponent<ParameterControlsProps<P>> {
    onChange: ParamOnChange;
    renderGroup(group: ParamInfo[]): import("react/jsx-runtime").JSX.Element[] | null;
    renderPart(groups: ParamInfo[][]): JSX.Element[] | null;
    paramGroups: (params: PD.Params) => {
        essentials: ParamInfo[][];
        advanced: ParamInfo[][];
    };
    render(): import("react/jsx-runtime").JSX.Element | JSX.Element[] | null;
}
export declare class ParameterMappingControl<S, T> extends PluginUIComponent<{
    mapping: ParamMapping<S, T, PluginUIContext>;
}, {
    isDisabled: boolean;
}> {
    state: {
        isDisabled: boolean;
    };
    setSettings: (p: {
        param: PD.Base<any>;
        name: string;
        value: any;
    }, old: any) => void;
    componentDidMount(): void;
    render(): import("react/jsx-runtime").JSX.Element;
}
type ParamInfo = [string, PD.Any, ParamControl];
export declare class ParamHelp<L extends LegendData> extends React.PureComponent<{
    legend?: L;
    description?: string;
}> {
    render(): import("react/jsx-runtime").JSX.Element;
}
export type ParamsOnChange<P> = (params: {
    param: PD.Base<any>;
    name: string;
    value: any;
}, values: Readonly<P>) => void;
export type ParamOnChange = (params: {
    param: PD.Base<any>;
    name: string;
    value: any;
}) => void;
export interface ParamProps<P extends PD.Base<any> = PD.Base<any>> {
    name: string;
    value: P['defaultValue'];
    param: P;
    isDisabled?: boolean;
    onChange: ParamOnChange;
    onEnter?: () => void;
}
export type ParamControl = React.ComponentClass<ParamProps<any>>;
export declare function ToggleParamHelpButton({ show, toggle, title }: {
    show: boolean;
    toggle: () => void;
    title?: string;
}): import("react/jsx-runtime").JSX.Element;
export declare abstract class SimpleParam<P extends PD.Any> extends React.PureComponent<ParamProps<P>, {
    showHelp: boolean;
}> {
    state: {
        showHelp: boolean;
    };
    protected update(value: P['defaultValue']): void;
    abstract renderControl(): JSX.Element;
    renderAddOn(): JSX.Element | null;
    toggleHelp: () => void;
    render(): import("react/jsx-runtime").JSX.Element;
}
export declare class BoolControl extends SimpleParam<PD.BooleanParam> {
    onClick: (e: React.MouseEvent<HTMLButtonElement>) => void;
    renderControl(): import("react/jsx-runtime").JSX.Element;
}
export declare class LineGraphControl extends React.PureComponent<ParamProps<PD.LineGraph>, {
    isExpanded: boolean;
    isOverPoint: boolean;
    message: string;
}> {
    state: {
        isExpanded: boolean;
        isOverPoint: boolean;
        message: string;
    };
    private pointToLabel;
    onHover: (point?: Vec2) => void;
    onDrag: (point: Vec2) => void;
    onChange: (value: PD.LineGraph["defaultValue"]) => void;
    toggleExpanded: (e: React.MouseEvent<HTMLButtonElement>) => void;
    render(): import("react/jsx-runtime").JSX.Element;
}
export declare class NumberInputControl extends React.PureComponent<ParamProps<PD.Numeric>> {
    state: {
        value: string;
    };
    update: (value: number) => void;
    render(): import("react/jsx-runtime").JSX.Element;
}
export declare class NumberRangeControl extends SimpleParam<PD.Numeric> {
    onChange: (v: number) => void;
    renderControl(): import("react/jsx-runtime").JSX.Element;
}
export declare class TextControl extends SimpleParam<PD.Text> {
    updateValue: (value: string) => void;
    renderControl(): import("react/jsx-runtime").JSX.Element;
}
export declare class PureSelectControl extends React.PureComponent<ParamProps<PD.Select<string | number>> & {
    title?: string;
}> {
    protected update(value: string | number): void;
    onChange: (e: React.ChangeEvent<HTMLSelectElement>) => void;
    render(): import("react/jsx-runtime").JSX.Element;
}
export declare class SelectControl extends React.PureComponent<ParamProps<PD.Select<string | number>>, {
    showHelp: boolean;
    showOptions: boolean;
}> {
    state: {
        showHelp: boolean;
        showOptions: boolean;
    };
    onSelect: ActionMenu.OnSelect;
    toggle: () => void;
    cycle: () => void;
    items: (param: PD.Select<any>) => ActionMenu.Items[];
    renderControl(): import("react/jsx-runtime").JSX.Element;
    renderAddOn(): import("react/jsx-runtime").JSX.Element | null;
    toggleHelp: () => void;
    render(): import("react/jsx-runtime").JSX.Element;
}
export declare class ValueRefControl extends React.PureComponent<ParamProps<PD.ValueRef<any>>, {
    showHelp: boolean;
    showOptions: boolean;
}> {
    state: {
        showHelp: boolean;
        showOptions: boolean;
    };
    onSelect: ActionMenu.OnSelect;
    toggle: () => void;
    private get items();
    renderControl(): import("react/jsx-runtime").JSX.Element;
    renderAddOn(): import("react/jsx-runtime").JSX.Element | null;
    toggleHelp: () => void;
    render(): import("react/jsx-runtime").JSX.Element;
}
export declare class IntervalControl extends React.PureComponent<ParamProps<PD.Interval>, {
    isExpanded: boolean;
}> {
    state: {
        isExpanded: boolean;
    };
    components: {
        0: PD.Numeric;
        1: PD.Numeric;
    };
    change(value: PD.MultiSelect<any>['defaultValue']): void;
    componentChange: ParamOnChange;
    toggleExpanded: (e: React.MouseEvent<HTMLButtonElement>) => void;
    render(): import("react/jsx-runtime").JSX.Element;
}
export declare class BoundedIntervalControl extends SimpleParam<PD.Interval> {
    onChange: (v: [number, number]) => void;
    renderControl(): import("react/jsx-runtime").JSX.Element;
}
export declare class ColorControl extends SimpleParam<PD.Color> {
    onChange: (e: React.ChangeEvent<HTMLSelectElement>) => void;
    stripStyle(): React.CSSProperties;
    renderControl(): import("react/jsx-runtime").JSX.Element;
}
export declare class ColorListControl extends React.PureComponent<ParamProps<PD.ColorList>, {
    showHelp: boolean;
    show?: 'edit' | 'presets';
}> {
    state: {
        showHelp: boolean;
        show: "edit" | "presets" | undefined;
    };
    protected update(value: PD.ColorList['defaultValue']): void;
    toggleEdit: () => void;
    togglePresets: () => void;
    renderControl(): import("react/jsx-runtime").JSX.Element;
    selectPreset: ActionMenu.OnSelect;
    colorsChanged: ParamOnChange;
    isInterpolatedChanged: ParamOnChange;
    renderColors(): import("react/jsx-runtime").JSX.Element | null;
    toggleHelp: () => void;
    render(): import("react/jsx-runtime").JSX.Element;
}
export declare class OffsetColorListControl extends React.PureComponent<ParamProps<PD.ColorList>, {
    showHelp: boolean;
    show?: 'edit' | 'presets';
}> {
    state: {
        showHelp: boolean;
        show: "edit" | "presets" | undefined;
    };
    protected update(value: PD.ColorList['defaultValue']): void;
    toggleEdit: () => void;
    togglePresets: () => void;
    renderControl(): import("react/jsx-runtime").JSX.Element;
    selectPreset: ActionMenu.OnSelect;
    colorsChanged: ParamOnChange;
    isInterpolatedChanged: ParamOnChange;
    renderColors(): import("react/jsx-runtime").JSX.Element | null;
    toggleHelp: () => void;
    render(): import("react/jsx-runtime").JSX.Element;
}
export declare class Vec3Control extends React.PureComponent<ParamProps<PD.Vec3>, {
    isExpanded: boolean;
}> {
    state: {
        isExpanded: boolean;
    };
    components: {
        0: PD.Numeric;
        1: PD.Numeric;
        2: PD.Numeric;
    };
    change(value: PD.MultiSelect<any>['defaultValue']): void;
    componentChange: ParamOnChange;
    toggleExpanded: (e: React.MouseEvent<HTMLButtonElement>) => void;
    render(): import("react/jsx-runtime").JSX.Element;
}
export declare class Mat4Control extends React.PureComponent<ParamProps<PD.Mat4>, {
    isExpanded: boolean;
}> {
    state: {
        isExpanded: boolean;
    };
    components: {
        json: PD.Text<string>;
    };
    change(value: PD.MultiSelect<any>['defaultValue']): void;
    componentChange: ParamOnChange;
    toggleExpanded: (e: React.MouseEvent<HTMLButtonElement>) => void;
    changeValue(idx: number): (v: number) => void;
    get grid(): import("react/jsx-runtime").JSX.Element;
    render(): import("react/jsx-runtime").JSX.Element;
}
export declare class UrlControl extends SimpleParam<PD.UrlParam> {
    onChange: (e: React.ChangeEvent<HTMLInputElement>) => void;
    onKeyPress: (e: React.KeyboardEvent<HTMLInputElement>) => void;
    renderControl(): import("react/jsx-runtime").JSX.Element;
}
export declare class FileControl extends React.PureComponent<ParamProps<PD.FileParam>> {
    state: {
        showHelp: boolean;
    };
    change(value: File): void;
    onChangeFile: (e: React.ChangeEvent<HTMLInputElement>) => void;
    toggleHelp: () => void;
    renderControl(): import("react/jsx-runtime").JSX.Element;
    render(): import("react/jsx-runtime").JSX.Element;
}
export declare class FileListControl extends React.PureComponent<ParamProps<PD.FileListParam>> {
    state: {
        showHelp: boolean;
    };
    change(value: FileList): void;
    onChangeFileList: (e: React.ChangeEvent<HTMLInputElement>) => void;
    toggleHelp: () => void;
    renderControl(): import("react/jsx-runtime").JSX.Element;
    render(): import("react/jsx-runtime").JSX.Element;
}
export declare class MultiSelectControl extends React.PureComponent<ParamProps<PD.MultiSelect<any>>, {
    isExpanded: boolean;
}> {
    state: {
        isExpanded: boolean;
    };
    change(value: PD.MultiSelect<any>['defaultValue']): void;
    toggle(key: string): (e: React.MouseEvent<HTMLButtonElement>) => void;
    toggleExpanded: (e: React.MouseEvent<HTMLButtonElement>) => void;
    render(): import("react/jsx-runtime").JSX.Element;
}
export declare class GroupControl extends React.PureComponent<ParamProps<PD.Group<any>> & {
    inMapped?: boolean;
}, {
    isExpanded: boolean;
    showPresets: boolean;
    showHelp: boolean;
}> {
    state: {
        isExpanded: boolean;
        showPresets: boolean;
        showHelp: boolean;
    };
    change(value: any): void;
    onChangeParam: ParamOnChange;
    toggleExpanded: () => void;
    toggleShowPresets: () => void;
    presetItems: (param: PD.Group<any>) => ActionMenu.Items[];
    onSelectPreset: ActionMenu.OnSelect;
    pivotedPresets(): import("react/jsx-runtime").JSX.Element | null;
    presets(): import("react/jsx-runtime").JSX.Element | null;
    pivoted(): import("react/jsx-runtime").JSX.Element;
    render(): import("react/jsx-runtime").JSX.Element | null;
}
export declare class MappedControl extends React.PureComponent<ParamProps<PD.Mapped<any>>, {
    isExpanded: boolean;
}> {
    state: {
        isExpanded: boolean;
    };
    private valuesCache;
    private setValues;
    private getValues;
    change(value: PD.Mapped<any>['defaultValue']): void;
    onChangeName: ParamOnChange;
    onChangeParam: ParamOnChange;
    toggleExpanded: () => void;
    areParamsEmpty(params: PD.Params): boolean;
    render(): import("react/jsx-runtime").JSX.Element;
}
export declare class ObjectListControl extends React.PureComponent<ParamProps<PD.ObjectList>, {
    isExpanded: boolean;
}> {
    state: {
        isExpanded: boolean;
    };
    change(value: any): void;
    add: (v: object) => void;
    actions: {
        update: (v: object, i: number) => void;
        move: (i: number, dir: -1 | 1) => void;
        remove: (i: number) => void;
    };
    toggleExpanded: (e: React.MouseEvent<HTMLButtonElement>) => void;
    render(): import("react/jsx-runtime").JSX.Element;
}
export declare class ConditionedControl extends React.PureComponent<ParamProps<PD.Conditioned<any, any, any>>> {
    change(value: PD.Conditioned<any, any, any>['defaultValue']): void;
    onChangeCondition: ParamOnChange;
    onChangeParam: ParamOnChange;
    render(): import("react/jsx-runtime").JSX.Element;
}
export declare class ConvertedControl extends React.PureComponent<ParamProps<PD.Converted<any, any>>> {
    onChange: ParamOnChange;
    render(): import("react/jsx-runtime").JSX.Element | null;
}
export declare class ScriptControl extends React.PureComponent<ParamProps<PD.Script>> {
    onChange: ParamOnChange;
    render(): import("react/jsx-runtime").JSX.Element;
}
export {};
