import { PointType, ZoneType, FilterConfig, StoreType } from '../types'; import { UserSheet } from '@gridsheet/core'; import { Dispatcher } from '../store'; import { FC } from 'react'; export type MenuContext = { /** Current sheet instance */ sheet: UserSheet; /** Currently focused cell */ choosing: PointType; /** Currently selected zone */ selectingZone: ZoneType; /** True when the left (row) header is being selected */ leftHeaderSelecting: boolean; /** True when the top (column) header is being selected */ topHeaderSelecting: boolean; cut(): Promise; copy(): Promise; paste(onlyValue?: boolean): Promise; undo(): void; redo(): void; insertRowsAbove(y: number, numRows: number): void; insertRowsBelow(y: number, numRows: number): void; removeRows(y: number, numRows: number): void; insertColsLeft(x: number, numCols: number): void; insertColsRight(x: number, numCols: number): void; removeCols(x: number, numCols: number): void; sortRows(x: number, direction: 'asc' | 'desc'): Promise; filterRows(x: number, filter?: FilterConfig): Promise; clearFilter(x?: number): void; toggleSortFixed(y: number): void; toggleFilterFixed(y: number): void; search(): void; updateColLabel(x: number, label: string | undefined): void; /** Close the currently open menu */ close(): void; }; export type MenuDividerItem = { type: 'divider'; visible?: (ctx: MenuContext) => boolean; }; /** * Base structure shared by all menu item descriptors. * `Args` is the tuple of coordinate arguments passed after `ctx`: * - `[]` → ContextMenu (no coordinate) * - `[y: number]` → RowMenu * - `[x: number]` → ColMenu */ export type MenuItemBase = { type?: 'item'; id?: string; label: string | ((ctx: MenuContext, ...args: Args) => string); shortcuts?: string[] | ((ctx: MenuContext, ...args: Args) => string[]); visible?: (ctx: MenuContext, ...args: Args) => boolean; disabled?: (ctx: MenuContext, ...args: Args) => boolean; /** Render a checkmark prefix when defined. */ checked?: (ctx: MenuContext, ...args: Args) => boolean; onClick: (ctx: MenuContext, ...args: Args) => void | Promise; }; /** * A menu entry that renders a registered React component. * Use `registerMenuComponent(id, Component)` to associate an id with a component, * then reference it here as `{ type: 'component', componentId: id }`. */ export type MenuComponentItem = { type: 'component'; componentId: string; visible?: (ctx: MenuContext, ...args: Args) => boolean; }; export type ContextMenuItemDescriptor = MenuDividerItem | MenuItemBase | MenuComponentItem; export type RowMenuItemDescriptor = MenuDividerItem | MenuItemBase<[y: number]> | MenuComponentItem<[y: number]>; export type ColMenuItemDescriptor = MenuDividerItem | MenuItemBase<[x: number]> | MenuComponentItem<[x: number]>; export declare const defaultContextMenuDescriptors: ContextMenuItemDescriptor[]; export declare const defaultRowMenuDescriptors: RowMenuItemDescriptor[]; export declare const defaultColMenuDescriptors: ColMenuItemDescriptor[]; export declare function buildMenuContext(store: StoreType, dispatch: Dispatcher, close: () => void): MenuContext; export type ContextMenuSectionProps = { close: () => void; }; export type RowMenuSectionProps = { y: number; close: () => void; }; export type ColMenuSectionProps = { x: number; close: () => void; /** Signal waiting state to parent menu. Pass null to clear. */ onWaiting?: (message: string | null, cancel?: () => void) => void; }; /** * Register a React component under a string id so it can be referenced in menu * descriptors via `{ type: 'component', componentId: '...' }`. * * Built-in ids: `'col-filter'`, `'col-sort'`, `'col-label'`. * You can override any built-in by registering your own component with the same id. */ export declare function registerMenuComponent(id: string, component: FC): void; /** Look up a previously registered component by id. */ export declare function getMenuComponent(id: string): FC | undefined; //# sourceMappingURL=menu.d.ts.map