/// <reference types="react" />
import { StyleTags, ReactElement } from '../@declares';
import { KeyValueDict } 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> = StyleTags.BasicElement & {
        color?: C;
        tone?: Tones;
        size?: Sizes;
        tabIndex?: number;
        children?: ReactElement;
        'aria-label'?: string;
        isLocked?: boolean;
        isActive?: boolean;
        isActiveStyles?: StyleTags.PropsNFreeCSS;
        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 {
    type Input<C = ButtonTypes.Colors> = ButtonTypes.Input<C> & {
        submitOption?: {
            formName: string;
            acceptInvalidForm?: boolean;
            submitDelegationKey?: ButtonTypes.delegateClickEventProps | ButtonTypes.delegateClickEventProps[];
            callback(form: KeyValueDict, ok: boolean): void;
        };
    } & React.ButtonHTMLAttributes<HTMLButtonElement>;
    namespace Methods {
        type Component = (p: Input) => 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) => 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) => 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 };
