@yandex/ui
Version:
Yandex UI components
132 lines (131 loc) • 4.51 kB
TypeScript
import React, { ReactNode, PureComponent, CSSProperties, Ref } from 'react';
import { RenderOverride } from '../lib/render-override';
import { IMenuItemProps as MenuItemProps } from './Item/Menu-Item';
import './Menu.css';
export { MenuItemProps };
export declare type ItemSimple = {
/**
* Значение, которое соответствует пункту меню. Это значение передается в обработчик, который указан в `onChange`
*/
value: any;
/**
* Содержимое пункта меню. Например: строка с названием пункта меню или иконка
*/
content: ReactNode;
/**
* Неактивное состояние элемента
*/
disabled?: boolean;
/**
* Идентификатор компонента
*/
id?: string;
};
export declare type ItemGroup = {
/**
* Заголовок группы
*/
title?: string;
/**
* Набор элементов в группе
*/
items: ItemSimple[];
};
export declare type MixedItem = ItemSimple | ItemGroup;
export declare type ChangeEvent<T> = React.ChangeEvent<T & {
name?: string;
value: any;
}>;
export declare type ChangeEventHandler<T> = (event: ChangeEvent<T>) => void;
export interface IMenuProps {
/**
* Состояние фокуса на меню. Необходимо для активации клавиатурной навигации
*/
focused?: boolean;
/**
* Список пунктов меню
*/
items: MixedItem[];
/**
* Обработчик изменения значения
*/
onChange?: ChangeEventHandler<HTMLElement>;
/**
* Обработчик изменения активного значения в меню
*/
onActiveItemChange?: (id: string) => void;
/**
* Пункт меню или список пунктов, которые выбраны по умолчанию.
* Значения должны совпадать со значениями `value`, которые указаны в `items`
*/
value?: any;
/**
* Неактивное состояние компонента.
* Состояние, при котором меню отображается, но недоступно для действий пользователя
*/
disabled?: boolean;
/**
* Ссылка на корневой DOM-элемент компонента
*/
innerRef?: Ref<HTMLElement>;
/**
* Дополнительный класс
*/
className?: string;
/**
* Html атрибут `style`
*/
style?: CSSProperties;
/**
* Переопределяет компонент `Item`
*/
renderItem?: RenderOverride<MenuItemProps>;
}
export declare const cnMenu: import("@bem-react/classname").ClassNameFormatter;
/**
* Компонент для создания меню.
* @param {IMenuProps} props
*/
export declare class Menu extends PureComponent<IMenuProps> {
static displayName: string;
readonly state: {
hoveredIndex: number;
};
/**
* Контейнер с ссылкой на корневой DOM элемент меню.
*/
private readonly innerRef;
/**
* Массив ссылок на пункты меню для правильного подскролла.
*/
private itemsRef;
private uniqId;
componentDidMount(): void;
componentDidUpdate(prevProps: IMenuProps): void;
componentWillUnmount(): void;
render(): JSX.Element;
private forwardRefs;
private mapChildren;
private onKeyDown;
private static scrollToItem;
private onMenuItemClick;
private subscribeToEvents;
private unsubscribeFromEvents;
private setHoveredOnMouseEnter;
private setHoveredOnMouseLeave;
private hoverAndScrollToFirstSelectedElement;
/**
* Возвращает следующий индекс активного элемента для выделения в меню.
*
* @param direction Направление, может быть `1` — down, либо `-1` — up.
*/
private getNextNotDisabledIndex;
/**
* Вызывает событие onActiveItemChange.
*/
private triggerOnMenuItemChange;
/**
* Вызывает событие onChange.
*/
private triggerOnChange;
}