119 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			119 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import { Machine } from '../../machine.js';
 | |
| import { Focus } from '../../utils/calculate-active-index.js';
 | |
| import { ElementPositionState } from '../../utils/element-movement.js';
 | |
| export declare enum MenuState {
 | |
|     Open = 0,
 | |
|     Closed = 1
 | |
| }
 | |
| export declare enum ActivationTrigger {
 | |
|     Pointer = 0,
 | |
|     Other = 1
 | |
| }
 | |
| export type MenuItemDataRef = {
 | |
|     current: {
 | |
|         textValue?: string;
 | |
|         disabled: boolean;
 | |
|         domRef: {
 | |
|             current: HTMLElement | null;
 | |
|         };
 | |
|     };
 | |
| };
 | |
| export interface State {
 | |
|     id: string;
 | |
|     __demoMode: boolean;
 | |
|     menuState: MenuState;
 | |
|     buttonElement: HTMLButtonElement | null;
 | |
|     itemsElement: HTMLElement | null;
 | |
|     items: {
 | |
|         id: string;
 | |
|         dataRef: MenuItemDataRef;
 | |
|     }[];
 | |
|     searchQuery: string;
 | |
|     activeItemIndex: number | null;
 | |
|     activationTrigger: ActivationTrigger;
 | |
|     pendingShouldSort: boolean;
 | |
|     pendingFocus: {
 | |
|         focus: Exclude<Focus, Focus.Specific>;
 | |
|     } | {
 | |
|         focus: Focus.Specific;
 | |
|         id: string;
 | |
|     };
 | |
|     buttonPositionState: ElementPositionState;
 | |
| }
 | |
| export declare enum ActionTypes {
 | |
|     OpenMenu = 0,
 | |
|     CloseMenu = 1,
 | |
|     GoToItem = 2,
 | |
|     Search = 3,
 | |
|     ClearSearch = 4,
 | |
|     RegisterItems = 5,
 | |
|     UnregisterItems = 6,
 | |
|     SetButtonElement = 7,
 | |
|     SetItemsElement = 8,
 | |
|     SortItems = 9,
 | |
|     MarkButtonAsMoved = 10
 | |
| }
 | |
| export type Actions = {
 | |
|     type: ActionTypes.CloseMenu;
 | |
| } | {
 | |
|     type: ActionTypes.OpenMenu;
 | |
|     focus: {
 | |
|         focus: Exclude<Focus, Focus.Specific>;
 | |
|     } | {
 | |
|         focus: Focus.Specific;
 | |
|         id: string;
 | |
|     };
 | |
|     trigger?: ActivationTrigger;
 | |
| } | {
 | |
|     type: ActionTypes.GoToItem;
 | |
|     focus: Focus.Specific;
 | |
|     id: string;
 | |
|     trigger?: ActivationTrigger;
 | |
| } | {
 | |
|     type: ActionTypes.GoToItem;
 | |
|     focus: Exclude<Focus, Focus.Specific>;
 | |
|     trigger?: ActivationTrigger;
 | |
| } | {
 | |
|     type: ActionTypes.Search;
 | |
|     value: string;
 | |
| } | {
 | |
|     type: ActionTypes.ClearSearch;
 | |
| } | {
 | |
|     type: ActionTypes.RegisterItems;
 | |
|     items: {
 | |
|         id: string;
 | |
|         dataRef: MenuItemDataRef;
 | |
|     }[];
 | |
| } | {
 | |
|     type: ActionTypes.UnregisterItems;
 | |
|     items: string[];
 | |
| } | {
 | |
|     type: ActionTypes.SetButtonElement;
 | |
|     element: HTMLButtonElement | null;
 | |
| } | {
 | |
|     type: ActionTypes.SetItemsElement;
 | |
|     element: HTMLElement | null;
 | |
| } | {
 | |
|     type: ActionTypes.SortItems;
 | |
| } | {
 | |
|     type: ActionTypes.MarkButtonAsMoved;
 | |
| };
 | |
| export declare class MenuMachine extends Machine<State, Actions> {
 | |
|     static new({ id, __demoMode }: {
 | |
|         id: string;
 | |
|         __demoMode?: boolean;
 | |
|     }): MenuMachine;
 | |
|     constructor(initialState: State);
 | |
|     reduce(state: Readonly<State>, action: Actions): State;
 | |
|     actions: {
 | |
|         registerItem: (id: string, dataRef: MenuItemDataRef) => void;
 | |
|         unregisterItem: (id: string) => void;
 | |
|     };
 | |
|     selectors: {
 | |
|         activeDescendantId(state: State): string | undefined;
 | |
|         isActive(state: State, id: string): boolean;
 | |
|         shouldScrollIntoView(state: State, id: string): boolean;
 | |
|         didButtonMove(state: State): boolean;
 | |
|     };
 | |
| }
 | 
