/// <reference types="react" />
import { StyleProps, ReactElement } from '../@declares';
import { Records } from 'jmini';
declare namespace ButtonTypes {
    type Seeds = 'button' | 'label' | 'anchor';
    type Tones = 'plain' | 'link' | 'normal' | 'border' | 'prime' | 'sub' | 'clear' | 'fillToBorder' | 'borderToFill';
    type Colors = 'plain' | 'theme' | 'posi' | 'nega' | 'warn' | 'cloud' | 'trans' | 'white';
    type Sizes = 'plain' | 'xsmall' | 'small' | 'regular' | 'large';
    type delegateClickEventProps = 'auxEnter' | 'enter' | 'space';
    type ClearColors = Colors | 'layer';
    type SubColors = Colors | 'layer';
    type Input<C = Colors> = StyleProps.BasicElement & {
        color?: C;
        tone?: Tones;
        size?: Sizes;
        tabIndex?: number;
        children?: ReactElement;
        'aria-label'?: string;
        isLocked?: boolean;
        isActive?: boolean;
        isActiveStyles?: StyleProps.StyleProps;
        isActiveClassName?: string;
    };
    namespace SizeMethods {
        type Component<I> = React.FC<I>;
        type FNs<I> = {
            Plain: React.FC<I>;
            XS: React.FC<I>;
            S: React.FC<I>;
            R: React.FC<I>;
            L: React.FC<I>;
        };
    }
    type SizeMethods<I> = SizeMethods.Component<I> & SizeMethods.FNs<I>;
}
declare namespace Button {
    namespace OnFormSubmit {
        type Input = [
            string,
            Callback<any>
        ] | [
            string,
            Callback<any>,
            Options
        ];
        type Callback<T = Records> = {
            (args: CallbackParams<T>): void;
        };
        type CallbackParams<T = Records> = {
            body: T;
            isValid: boolean;
            /**
             * ⚠️ Warning: Be careful when using this function to avoid deadlocks.
             * after serialLock function is called, the form submission will be stopped receive new form submissions until release function is called.
             *  */
            serialLock(): {
                release(): void;
            };
        };
        type Options = {
            validOnly?: boolean;
            submitableKey?: ButtonTypes.delegateClickEventProps | ButtonTypes.delegateClickEventProps[];
            /**
             * releaseOnFinish
             * [default] true
             *  */
            releaseOnFinish?: boolean;
        };
    }
    type Input<C = ButtonTypes.Colors> = ButtonTypes.Input<C> & {
        onFormSubmit?: OnFormSubmit.Input;
        submitOption?: {
            formName: string;
            acceptInvalidForm?: boolean;
            submitDelegationKey?: ButtonTypes.delegateClickEventProps | ButtonTypes.delegateClickEventProps[];
            callback(form: Records, ok: boolean): void;
        };
    } & React.ButtonHTMLAttributes<HTMLButtonElement>;
    namespace Methods {
        type Component = (p: Input) => React.JSX.Element;
        type FNs = {
            Plain: ButtonTypes.SizeMethods<Input<''>>;
            Link: ButtonTypes.SizeMethods<Input<''>>;
            Normal: ButtonTypes.SizeMethods<Input>;
            Border: ButtonTypes.SizeMethods<Input>;
            Prime: ButtonTypes.SizeMethods<Input>;
            Sub: ButtonTypes.SizeMethods<Input<ButtonTypes.SubColors>>;
            Clear: ButtonTypes.SizeMethods<Input<ButtonTypes.ClearColors>>;
            FillToBorder: ButtonTypes.SizeMethods<Input>;
            BorderToFill: ButtonTypes.SizeMethods<Input>;
        };
    }
    type Methods = Methods.Component & Methods.FNs;
}
declare namespace Label {
    type Input<C = ButtonTypes.Colors> = ButtonTypes.Input<C> & {
        htmlFor?: string;
    } & React.LabelHTMLAttributes<HTMLLabelElement>;
    namespace Methods {
        type Component = (p: Input) => React.JSX.Element;
        type FNs = {
            Plain: ButtonTypes.SizeMethods<Input<''>>;
            Link: ButtonTypes.SizeMethods<Input<''>>;
            Normal: ButtonTypes.SizeMethods<Input>;
            Border: ButtonTypes.SizeMethods<Input>;
            Prime: ButtonTypes.SizeMethods<Input>;
            Sub: ButtonTypes.SizeMethods<Input<ButtonTypes.SubColors>>;
            Clear: ButtonTypes.SizeMethods<Input<ButtonTypes.ClearColors>>;
            FillToBorder: ButtonTypes.SizeMethods<Input>;
            BorderToFill: ButtonTypes.SizeMethods<Input>;
        };
    }
    type Methods = Methods.Component & Methods.FNs;
}
declare namespace Anchor {
    type Input<C = ButtonTypes.Colors> = ButtonTypes.Input<C> & {
        href?: string;
        newTab?: boolean;
        sync?: boolean;
        download?: any;
        shiftQueryParams?: boolean;
    } & React.ButtonHTMLAttributes<HTMLAnchorElement>;
    namespace Methods {
        type Component = (p: Input) => React.JSX.Element;
        type FNs = {
            Plain: ButtonTypes.SizeMethods<Input<''>>;
            Link: ButtonTypes.SizeMethods<Input<''>>;
            Normal: ButtonTypes.SizeMethods<Input>;
            Border: ButtonTypes.SizeMethods<Input>;
            Prime: ButtonTypes.SizeMethods<Input>;
            Sub: ButtonTypes.SizeMethods<Input<ButtonTypes.SubColors>>;
            Clear: ButtonTypes.SizeMethods<Input<ButtonTypes.ClearColors>>;
            FillToBorder: ButtonTypes.SizeMethods<Input>;
            BorderToFill: ButtonTypes.SizeMethods<Input>;
        };
    }
    type Methods = Methods.Component & Methods.FNs;
}
declare const Button: Button.Methods;
declare const Label: Label.Methods;
declare const Anchor: Anchor.Methods;
export { ButtonTypes, Button, Label, Anchor };
