export type MouseButton = 'left' | 'middle' | 'right'; export type KeyboardModifier = 'shift' | 'alt' | 'accel'; export type MouseState = { buttons: Record; button: MouseButton | null; u: number; v: number; x: number; y: number; moveX: number; moveY: number; gestureX: number; gestureY: number; }; export type WheelState = { u: number; v: number; x: number; y: number; moveX: number; moveY: number; spinX: number; spinY: number; }; export type KeyboardState = Record; export type PickRef = { pickId: number; pickIndex: number; }; export type PointerCaptureAPI = { hasCapture: () => PickRef | null; beginCapture: (ref: PickRef) => void; endCapture: () => void; }; export type PointerLockAPI = { beginLock: () => void; endLock: () => void; hasLock: () => boolean; }; export type EventCallback = CanvasEvent> = (event: T) => void; export type EventBinding = CanvasEvent> = { id: number; callback: EventCallback; }; export type EventHandler = CanvasEvent> = EventCallback | EventBinding; export type CanvasEvent = { type: string; target: T; preventDefault: () => void; stopPropagation: () => void; defaultPrevented: boolean; propagationStopped: boolean; detail: number; which: number; }; export type KeyboardEvent = CanvasEvent & { altKey: boolean; code: string; ctrlKey: boolean; isComposing: boolean; key: string; locale: string; location: number; metaKey: boolean; repeat: boolean; shiftKey: boolean; }; export type PointerEvent = CanvasEvent & MouseState & PickRef & { height: number; isPrimary: boolean; pointerId: number; pointerType: string; pressure: number; tangentialPressure: number; tiltX: number; tiltY: number; twist: number; width: number; clientX: number; clientY: number; relatedTarget: EventTarget | null; screenX: number; screenY: number; altKey: boolean; ctrlKey: boolean; metaKey: boolean; shiftKey: boolean; }; export type WheelEvent = CanvasEvent & WheelState & PickRef & { clientX: number; clientY: number; relatedTarget: EventTarget | null; screenX: number; screenY: number; altKey: boolean; ctrlKey: boolean; metaKey: boolean; shiftKey: boolean; };