UNPKG

@yandex/ui

Version:

Yandex UI components

132 lines (131 loc) 4.51 kB
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; }