import { IconComponent } from '@consta/icons/Icon';
import React from 'react';
import { AsAttributes, AsTags } from "../../utils/types/AsTags";
import { PropsWithAsAttributes } from "../../utils/types/PropsWithAsAttributes";
import { PropsWithHTMLAttributes, PropsWithHTMLAttributesAndRef } from "../../utils/types/PropsWithHTMLAttributes";
export declare const paginationPropForm: readonly ["default", "brick", "round"];
export declare type PaginationPropForm = typeof paginationPropForm[number];
export declare const paginationPropFormDefault: PaginationPropForm;
export declare const paginationPropSize: readonly ["m", "xs", "s", "l"];
export declare type PaginationPropSize = typeof paginationPropSize[number];
export declare const paginationPropSizeDefault: PaginationPropSize;
export declare const paginationPropType: readonly ["default", "input"];
export declare type PaginationPropType = typeof paginationPropType[number];
export declare const paginationPropTypeDefault: PaginationPropType;
export declare type PaginationArrowTypes = 'first' | 'previous' | 'next' | 'last';
export declare type PaginationPropHotKey = {
    label: string;
    keys: string[];
};
export declare type PaginationPropOnItemClick<ITEM> = (item: ITEM, params: {
    e: React.MouseEvent;
}) => void;
export declare type PaginationPropOnChange<ITEM> = (value: ITEM, params: {
    e: React.MouseEvent | React.KeyboardEvent;
}) => void;
export declare type PaginationPropArrow = boolean | IconComponent | {
    label?: string;
    icon?: IconComponent;
};
export declare type PaginationBasePropArrow = false | {
    label?: string;
    disabled?: boolean;
    icon?: IconComponent;
    onClick?: React.MouseEventHandler;
};
declare type PaginationArrowsProps = {
    outerMostArrows?: [PaginationPropArrow?, PaginationPropArrow?];
} & ({
    arrows: [PaginationPropArrow?, PaginationPropArrow?];
    hotKeys?: [PaginationPropHotKey?, PaginationPropHotKey?];
} | {
    arrows?: never;
    hotKeys?: never;
});
declare type PaginationBaseArrowsProps = {
    outerMostArrows?: [PaginationBasePropArrow?, PaginationBasePropArrow?];
} & ({
    arrows: [PaginationBasePropArrow?, PaginationBasePropArrow?];
    hotKeys?: [PaginationPropHotKey?, PaginationPropHotKey?];
} | {
    arrows?: never;
    hotKeys?: never;
});
declare type Props<ITEM> = {
    form?: PaginationPropForm;
    size?: PaginationPropSize;
    containerEventListener?: HTMLElement | Window;
    value?: ITEM;
    items?: ITEM extends number ? number : ITEM[];
    onChange?: PaginationPropOnChange<ITEM>;
};
export declare type PaginationProps<TYPE extends PaginationPropType> = PropsWithHTMLAttributes<{
    type?: TYPE;
    showFirstPage?: boolean;
    showLastPage?: boolean;
    visibleCount?: number;
} & Props<number>, HTMLDivElement> & PaginationArrowsProps & (TYPE extends 'input' ? {
    getTotalLabel?: (pages: number) => string | number;
} : {
    getTotalLabel?: never;
});
export declare type PaginationComponent = <TYPE extends PaginationPropType>(props: PaginationProps<TYPE>) => React.ReactElement | null;
export declare type PaginationItem = {
    key: number;
    label: string;
    active?: boolean;
    clickable?: boolean;
    page: number;
};
export declare type PaginationBaseItemDefault = {
    key: string | number;
    label?: string;
    as?: AsTags;
    ref?: React.RefObject<HTMLElement>;
    clickable?: boolean;
    attributes?: AsAttributes;
    onClick?: React.MouseEventHandler;
};
export declare type PaginationPropGetItemKey<ITEM> = (item: ITEM) => PaginationBaseItemDefault['key'];
export declare type PaginationPropGetItemLabel<ITEM> = (item: ITEM) => PaginationBaseItemDefault['label'];
export declare type PaginationPropGetItemClickable<ITEM> = (item: ITEM) => PaginationBaseItemDefault['clickable'];
export declare type PaginationPropGetItemAs<ITEM> = (item: ITEM) => PaginationBaseItemDefault['as'];
export declare type PaginationPropGetItemAttributes<ITEM> = (item: ITEM) => PaginationBaseItemDefault['attributes'];
export declare type PaginationPropGetItemRef<ITEM> = (item: ITEM) => PaginationBaseItemDefault['ref'];
export declare type PaginationPropGetItemOnClick<ITEM> = (item: ITEM) => PaginationBaseItemDefault['onClick'];
declare type Mappers<ITEM = PaginationBaseItemDefault> = {
    getItemLabel?: PaginationPropGetItemLabel<ITEM>;
    getItemKey?: PaginationPropGetItemKey<ITEM>;
    getItemAs?: PaginationPropGetItemAs<ITEM>;
    getItemAttributes?: PaginationPropGetItemAttributes<ITEM>;
    getItemRef?: PaginationPropGetItemRef<ITEM>;
    getItemClickable?: PaginationPropGetItemClickable<ITEM>;
    getItemOnClick?: PaginationPropGetItemOnClick<ITEM>;
};
export declare type PaginationBaseProps<ITEM = PaginationBaseItemDefault> = PropsWithHTMLAttributes<Mappers<ITEM> & Props<ITEM> & PaginationBaseArrowsProps & (ITEM extends {
    key: PaginationBaseItemDefault['key'];
} ? {} : {
    getItemKey: PaginationPropGetItemKey<ITEM>;
}), HTMLDivElement>;
export declare type PaginationBaseComponent = <ITEM = PaginationBaseItemDefault>(props: PaginationBaseProps<ITEM>) => React.ReactElement | null;
export declare type PaginationArrowProps = PropsWithHTMLAttributes<{
    icon?: IconComponent;
    form?: PaginationPropForm;
    size?: PaginationPropSize;
    disabled?: boolean;
    orientation?: 'start' | 'end';
    label?: string;
    caption?: string;
}, HTMLButtonElement>;
export declare type PaginationItemProps<AS extends AsTags = 'button'> = PropsWithAsAttributes<{
    form?: PaginationPropForm;
    size?: PaginationPropSize;
    label?: string;
    active?: boolean;
    clickable?: boolean;
}, AS>;
export declare type PaginationItemComponent = <AS extends AsTags = 'button'>(props: PaginationItemProps<AS>) => React.ReactElement | null;
export declare type PaginationNumberInputProps = PropsWithHTMLAttributes<{
    value?: number;
    onChange?: PaginationPropOnChange<number>;
    form?: PaginationPropForm;
    size?: PaginationPropSize;
    total: number;
    getTotalLabel?: (pages: number) => string | number;
}, HTMLDivElement>;
export declare type PaginationListProps<ITEM> = PropsWithHTMLAttributesAndRef<{
    form?: PaginationPropForm;
    size?: PaginationPropSize;
    items: ITEM[];
    value?: ITEM;
    onItemClick?: PaginationPropOnItemClick<ITEM>;
}, HTMLDivElement> & Mappers<ITEM> & (ITEM extends {
    label: string;
} ? {} : {
    getItemKey: PaginationPropGetItemKey<ITEM>;
});
export declare type PaginationListComponent = <ITEM extends PaginationBaseItemDefault>(props: PaginationListProps<ITEM>) => React.ReactElement | null;
export {};
