import type { AriaAttributes, FocusEventHandler, HTMLAttributes, KeyboardEventHandler, MouseEventHandler, ReactNode } from 'react';
import React from 'react';
import type { TokenProps, TokenSize } from '../Token/index.js';
import type { MenuItemState } from '../MenuItem/index.js';
import type { CommonProps } from '../../internal/CommonWrapper/index.js';
import type { TGetRootNode } from '../../lib/rootNode/index.js';
export declare enum TokenInputType {
    WithReference = 0,
    WithoutReference = 1,
    Combined = 2
}
export type TokenInputMenuAlign = 'left' | 'cursor';
export interface TokenInputProps<T> extends CommonProps, Pick<AriaAttributes, 'aria-describedby' | 'aria-label'>, Pick<HTMLAttributes<HTMLElement>, 'id'> {
    /** Токены, которые будут отображаться в поле ввода. */
    selectedItems?: T[];
    /** Событие добавления нового токена. */
    onValueChange?: (items: T[]) => void;
    /** HTML-событие `onmouseenter`.
     * @ignore */
    onMouseEnter?: MouseEventHandler<HTMLDivElement>;
    /** HTML-событие `onmouseleave`.
     * @ignore */
    onMouseLeave?: MouseEventHandler<HTMLDivElement>;
    /** HTML-событие `onfocus`.
     * @ignore */
    onFocus?: FocusEventHandler<HTMLTextAreaElement>;
    /** HTML-событие `onblur`.
     * @ignore */
    onBlur?: FocusEventHandler<HTMLTextAreaElement>;
    /** HTML-событие `onkeydown`. */
    onKeyDown?: KeyboardEventHandler<HTMLTextAreaElement>;
    /** Устанавливает фокус на поле с токенами после окончания загрузки страницы. */
    autoFocus?: boolean;
    /** Размер поля с токенами. */
    size?: TokenSize;
    /** Тип инпута.
     * Возможные значения:
     * - `TokenInputType.Combined` — в поле можно выбирать значения из справочника и добавлять свои значения.
     * - `TokenInputType.WithReference` — можно только выбрать значения из справочника, но нельзя добавлять свои.
     * - `TokenInputType.WithoutReference` — можно добавлять любые значения, но подсказок из справочника нет. */
    type?: TokenInputType;
    /** Ширина выпадающего списка. */
    menuWidth?: React.CSSProperties['width'];
    /** Выравнивание выпадающего списка. */
    menuAlign?: TokenInputMenuAlign;
    /** Задаёт функцию поиска значений, которая должна возвращать Promise с массивом значений. По умолчанию ожидаются строки.
     * Элементы могут быть любого типа. В этом случае необходимо определить свойства `renderItem`, `valueToString`. */
    getItems?: (query: string) => Promise<Array<TokenInputExtendedItem<T>>>;
    /** Ограничивает отображение выпадающего списка при фокусе на пустом поле: выпадающий список появится, только когда будет введён хотя бы один символ токена. */
    hideMenuIfEmptyInputValue?: boolean;
    /** Отрисовывает элемент списка. */
    renderItem?: (item: T, state: MenuItemState) => React.ReactNode | null;
    /** Отрисовывает выбранное значение. */
    renderValue?: (item: T) => React.ReactNode;
    /** Возвращает строковое представление `value`. Необходимо при фокусировке.
     * @default item => item */
    valueToString?: (item: T) => string;
    /** Отрисовывает сообщение об общем количестве элементов.
     * @param {number} found - количество элементов по результатам поиска. Учитывает только компонент MenuItem. Им оборачиваются элементы, возвращаемые `getItems()`.
     * @param {number} total - количество всех элементов. */
    renderTotalCount?: (found: number, total: number) => React.ReactNode;
    /** Определяет общее количество элементов. Необходим для работы `renderTotalCount`. */
    totalCount?: number;
    /** Отрисовывает сообщение о пустом результате поиска. При `renderAddButton` не работает. */
    renderNotFound?: () => React.ReactNode;
    /** Преобразует значение в элемент списка. */
    valueToItem?: (value: string) => T;
    /** Сравнивает полученные результаты с `value`. */
    itemToId?: (item: T) => string | number | undefined;
    /** Текст, который отображается если не введено никакое значение. */
    placeholder?: string;
    /** Символы, которые разделяют введённый текст на токены. По умолчанию — запятая. */
    delimiters?: string[];
    /** Меняет визуальное отображение токена на состояние «ошибка». Может быть полезен при разработке собственной валидации, если вы не используете пакет [React UI Validations](https://tech.skbkontur.ru/kontur-ui/?path=/docs/react-ui-validations_displaying-getting-started--docs). */
    error?: boolean;
    /** Меняет визуальное отображение токена на состояние «предупреждение». Может быть полезен при разработке собственной валидации, если вы не используете пакет [React UI Validations](https://tech.skbkontur.ru/kontur-ui/?path=/docs/react-ui-validations_displaying-getting-started--docs). */
    warning?: boolean;
    /** Блокирует поле с токенами. */
    disabled?: boolean;
    /** Ширина поля с токенами. */
    width?: string | number;
    /** Максимальная высота выпадающего списка. */
    maxMenuHeight?: number | string;
    /** Отрисовывает токен и даёт возможность кастомизировать внешний вид и поведение токена. */
    renderToken?: (item: T, props: Partial<TokenProps>, index: number) => ReactNode;
    /** Событие изменения текста в поле ввода, если результатом функции будет строка, то она станет следующим состоянием полем ввода. */
    onInputValueChange?: (value: string) => void;
    /** Отрисовывает кнопку добавления нового токена в выпадающем списке. */
    renderAddButton?: (query?: string, onAddItem?: () => void) => ReactNode;
    /** Событие обработки ввода строки в поле ввода и последующая потеря фокуса компонентом.
     * Функция срабатывает с аргументом поля строки.
     * Если при потере фокуса в выпадающем списке будет только один элемент и результат `valueToString` с этим элементом будет совпадать со значением в текстовом поле, то сработает `onValueChange` со значением данного элемента.
     * Сама функция также может вернуть значение, не равное undefined, с которым будет вызван `onValueChange`. Если возвращаемое значение будет равно null, то сработает очистка текущего значения поля, а в режиме редактирования токен будет удален. */
    onUnexpectedInput?: (value: string) => void | null | undefined | T;
    /** Задаёт типы вводимых данных. Передаёт браузеру информацию о том, какой набор символов показать при вводе данных в конкретное поле на устройствах с экранной клавиатурой. */
    inputMode?: React.HTMLAttributes<HTMLTextAreaElement>['inputMode'];
    /**
     * Максимальная высота компонента. При её достижении появится скроллбар
     */
    maxHeight?: number;
}
export interface TokenInputState<T> {
    autocompleteItems?: Array<TokenInputExtendedItem<T>>;
    activeTokens: T[];
    editingTokenIndex: number;
    clickedToken?: T;
    clickedTokenTimeout?: number;
    inFocus?: boolean;
    inputValue: string;
    reservedInputValue: string | undefined;
    inputValueWidth: number;
    inputValueHeight: number;
    preventBlur?: boolean;
    loading?: boolean;
}
export type TokenInputExtendedItem<T> = T | (() => React.ReactElement<T>) | React.ReactElement<T>;
export declare const DefaultState: {
    inputValue: string;
    reservedInputValue: undefined;
    autocompleteItems: undefined;
    activeTokens: never[];
    editingTokenIndex: number;
    inFocus: boolean;
    loading: boolean;
    preventBlur: boolean;
    inputValueWidth: number;
    inputValueHeight: number;
};
export declare const TokenInputDataTids: {
    readonly root: "TokenInput__root";
    readonly tokenInputMenu: "TokenInputMenu__root";
    readonly label: "TokenInput__label";
};
type DefaultProps<T> = Required<Pick<TokenInputProps<T>, 'selectedItems' | 'delimiters' | 'renderItem' | 'renderValue' | 'valueToString' | 'valueToItem' | 'itemToId' | 'onValueChange' | 'width' | 'onBlur' | 'onFocus' | 'onMouseEnter' | 'onMouseLeave' | 'menuWidth' | 'menuAlign'>>;
/** Поле с токенами — это поле ввода со списком подсказок. Значения в поле отображаются в виде отдельных токенов — компонент [Token](https://tech.skbkontur.ru/kontur-ui/?path=/docs/react-ui_input-data-tokeninput-token--docs).
 */
export declare class TokenInput<T = string> extends React.PureComponent<TokenInputProps<T>, TokenInputState<T>> {
    static __KONTUR_REACT_UI__: string;
    static displayName: string;
    static defaultProps: DefaultProps<any>;
    private getDelimiters;
    private getProps;
    private get textareaId();
    state: TokenInputState<T>;
    private readonly _textareaId;
    private rootId;
    private readonly locale;
    private globalObject;
    private emotion;
    private cx;
    private styles;
    private theme;
    private size;
    private input;
    private tokensInputMenu;
    private textHelper;
    private wrapper;
    private scrollContainerRef;
    getRootNode: TGetRootNode;
    private setRootNode;
    private memoizedTokens;
    componentDidMount(): void;
    componentDidUpdate(prevProps: TokenInputProps<T> & DefaultProps<T>, prevState: TokenInputState<T>): void;
    componentWillUnmount(): void;
    /** Программно устанавливает фокус на поле.
     * Появляется фокусная рамка, элемент получает клавиатурные события и воспринимается как текущий элемент для чтения скринридерами.
     * @public
     */
    focus(): void;
    /** Программно снимает фокус с поля.
     * @public
     */
    blur(): void;
    /** Кратковременно визуально подсвечивает поле ввода, чтобы привлечь внимание пользователя.
     * @public
     */
    blink(): void;
    render(): React.JSX.Element;
    private getLabelSizeClassName;
    private getInputSizeClassName;
    private renderMain;
    /**
     * Сбрасывает введённое пользователем значение.
     * @public
     */
    reset(): void;
    private isEqual;
    private hasValueInItems;
    private get showAddItemHint();
    private get type();
    private get menuRef();
    private get isCursorVisible();
    private get isEditingMode();
    private isCursorVisibleForState;
    private inputRef;
    private tokensInputMenuRef;
    private textHelperRef;
    private wrapperRef;
    private dispatch;
    private updateInputTextWidth;
    private handleInputFocus;
    private handleInputBlur;
    private handleOutsideBlur;
    private get isInputChanged();
    private get isInputValueChanged();
    private get isTokenValueChanged();
    private isBlurToMenu;
    private handleWrapperMouseDown;
    private handleWrapperMouseUp;
    private handleCopy;
    private handleInputPaste;
    private tryGetItems;
    private handleKeyDown;
    private handleInputKeyDown;
    private moveFocusToLastToken;
    private focusInput;
    private selectInputText;
    private handleWrapperKeyDown;
    private handleWrapperArrows;
    private handleWrapperArrowsWithoutShift;
    private handleWrapperArrowsWithShift;
    private handleValueChange;
    private handleAddItem;
    private selectItem;
    private handleRemoveToken;
    private handleTokenClick;
    private handleTokenEdit;
    private finishTokenEdit;
    private checkForUnexpectedInput;
    private handleChangeInputValue;
    private highlightMenuItem;
    private renderTokensStart;
    private renderTokensEnd;
    private renderToken;
    private renderAddButton;
    private isTokenDisabled;
    private getAvailableTokenIndex;
}
export {};
