UNPKG

mind-elixir

Version:

Mind elixir is a free open source mind map core.

72 lines (71 loc) 3.09 kB
import type { Arrow } from '../arrow'; import type { Summary } from '../summary'; import type { NodeObj } from '../types/index'; type OperationBase<Name extends string, Target> = { name: Name; target: Target; }; export type NodeOperation = OperationBase<'addChild' | 'insertParent' | 'beginEdit', NodeObj> | (OperationBase<'insertSibling', NodeObj> & { position: 'before' | 'after'; }) | (OperationBase<'reshapeNode', NodeObj> & { origin: NodeObj; }) | (OperationBase<'finishEdit', NodeObj> & { origin: string; }) | (OperationBase<'moveNodesAfter' | 'moveNodesBefore' | 'moveNodesIn', NodeObj[]> & { destination: NodeObj; }) | OperationBase<'removeNodes' | 'copyNodes', NodeObj[]>; export type SummaryOperation = OperationBase<'createSummary' | 'removeSummary' | 'finishEditSummary', Summary>; export type ArrowOperation = OperationBase<'createArrow' | 'removeArrow' | 'finishEditArrowLabel', Arrow> | (OperationBase<'reshapeArrow', Arrow> & { origin: Arrow; }); export type Operation = NodeOperation | SummaryOperation | ArrowOperation; export type OperationType = Operation['name']; /** Data mutation events such as node, arrow and summary operations. */ export type OperationEventMap = { /** Public data mutation event. Every operation uses `target`; batch operations use an array. */ operation: (operation: Operation) => void; }; /** Selection state events for nodes, arrows and summaries. */ export type SelectionEventMap = { selectNewNode: (node: NodeObj) => void; selectNodes: (nodes: NodeObj[]) => void; unselectNodes: (nodes: NodeObj[]) => void; selectArrow: (arrow: Arrow) => void; unselectArrow: () => void; selectSummary: (summary: Summary) => void; unselectSummary: () => void; }; /** Viewport and map state events. */ export type ViewportEventMap = { expandNode: (node: NodeObj) => void; changeDirection: (direction: number) => void; scale: (scale: number) => void; move: (data: { dx: number; dy: number; }) => void; }; /** Internal rendering events. */ export type RenderEventMap = { linkDiv: () => void; /** Please use throttling to prevent performance degradation. */ updateArrowDelta: (arrow: Arrow) => void; }; /** Internal context-menu event. */ export type ContextMenuEventMap = { showContextMenu: (event: MouseEvent) => void; }; /** * Events emitted by a MindElixir instance. * * The intersections keep the existing bus API compatible while grouping event * names by responsibility for maintainers and generated type declarations. */ export type EventMap = OperationEventMap & SelectionEventMap & ViewportEventMap & RenderEventMap & ContextMenuEventMap; export declare function createBus<T extends Record<string, (...args: any[]) => void> = EventMap>(): { handlers: Record<keyof T, ((...arg: any[]) => void)[]>; addListener: <K extends keyof T>(type: K, handler: T[K]) => void; fire: <K extends keyof T>(type: K, ...payload: Parameters<T[K]>) => void; removeListener: <K extends keyof T>(type: K, handler: T[K]) => void; }; export {};