// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! // Events might be wrong! We are using vanilla events, but type system is used extended/synthetic events from React perhaps? // // Event System // ---------------------------------------------------------------------- import { AbstractView } from './html.values.js' // TODO: change any to unknown when moving to TS v3 export interface BaseSyntheticEvent { nativeEvent: E; currentTarget: C; target: T; bubbles: boolean; cancelable: boolean; defaultPrevented: boolean; eventPhase: number; isTrusted: boolean; preventDefault(): void; isDefaultPrevented(): boolean; stopPropagation(): void; isPropagationStopped(): boolean; persist(): void; timeStamp: number; type: string; } /** * currentTarget - a reference to the element on which the event listener is registered. * * target - a reference to the element from which the event was originally dispatched. * This might be a child element to the element on which the event listener is registered. * If you thought this should be `EventTarget & T`, see https://github.com/DefinitelyTyped/DefinitelyTyped/issues/11508#issuecomment-256045682 */ export interface SyntheticEvent extends BaseSyntheticEvent {} export interface ExtendedUIEvent extends SyntheticEvent { detail: number view: AbstractView } export interface ExtendedMouseEvent extends ExtendedUIEvent { target: T & EventTarget altKey: boolean button: number buttons: number clientX: number clientY: number ctrlKey: boolean /** * See [DOM Level 3 Events spec](https://www.w3.org/TR/uievents-key/#keys-modifier). for a list of valid (case-sensitive) arguments to this method. */ getModifierState(key: ModifierKey): boolean metaKey: boolean movementX: number movementY: number pageX: number pageY: number relatedTarget: EventTarget | null screenX: number screenY: number shiftKey: boolean } export interface ExtendedClipboardEvent extends SyntheticEvent { clipboardData: DataTransfer } export interface ExtendedCompositionEvent extends SyntheticEvent { data: string } export interface ExtendedDragEvent extends ExtendedMouseEvent { dataTransfer: DataTransfer; } export interface ExtendedPointerEvent extends ExtendedMouseEvent { pointerId: number pressure: number tangentialPressure: number tiltX: number tiltY: number twist: number width: number height: number pointerType: 'mouse' | 'pen' | 'touch'; isPrimary: boolean } export interface ExtendedFocusEvent extends SyntheticEvent { relatedTarget: (EventTarget & RelatedTarget) | null target: EventTarget & Target; } export interface ExtendedFormEvent extends SyntheticEvent { } // export interface ExtendedInvalidEvent extends SyntheticEvent { // target: EventTarget & T // } export interface ExtendedChangeEvent extends SyntheticEvent { target: EventTarget & T } export type ModifierKey = 'Alt' | 'AltGraph' | 'CapsLock' | 'Control' | 'Fn' | 'FnLock' | 'Hyper' | 'Meta' | 'NumLock' | 'ScrollLock' | 'Shift' | 'Super' | 'Symbol' | 'SymbolLock'; export interface ExtendedKeyboardEvent extends ExtendedUIEvent { target: T & EventTarget altKey: boolean /** @deprecated */ charCode: number ctrlKey: boolean code: string /** * See [DOM Level 3 Events spec](https://www.w3.org/TR/uievents-key/#keys-modifier). for a list of valid (case-sensitive) arguments to this method. */ getModifierState(key: ModifierKey): boolean /** * See the [DOM Level 3 Events spec](https://www.w3.org/TR/uievents-key/#named-key-attribute-values). for possible values */ key: string /** @deprecated */ keyCode: number locale: string location: number metaKey: boolean repeat: boolean shiftKey: boolean /** @deprecated */ which: number } export interface ExtendedTouchEvent extends ExtendedUIEvent { altKey: boolean changedTouches: TouchList ctrlKey: boolean /** * See [DOM Level 3 Events spec](https://www.w3.org/TR/uievents-key/#keys-modifier). for a list of valid (case-sensitive) arguments to this method. */ getModifierState(key: ModifierKey): boolean metaKey: boolean shiftKey: boolean targetTouches: TouchList touches: TouchList } export interface ExtendedWheelEvent extends ExtendedMouseEvent { deltaMode: number deltaX: number deltaY: number deltaZ: number } export interface ExtendedAnimationEvent extends SyntheticEvent { animationName: string elapsedTime: number pseudoElement: string } export interface ExtendedTransitionEvent extends SyntheticEvent { elapsedTime: number propertyName: string pseudoElement: string } export type EventHandler> = { bivarianceHack(event: E): void }['bivarianceHack'] //type ReactEventHandler = EventHandler>; export type ClipboardEventHandler = EventHandler> export type CompositionEventHandler = EventHandler> export type DragEventHandler = EventHandler> export type FocusEventHandler = EventHandler> export type FormEventHandler = EventHandler> export type ChangeEventHandler = EventHandler> export type KeyboardEventHandler = EventHandler> export type MouseEventHandler = EventHandler> export type TouchEventHandler = EventHandler> export type PointerEventHandler = EventHandler> export type UIEventHandler = EventHandler> export type WheelEventHandler = EventHandler> export type AnimationEventHandler = EventHandler> export type TransitionEventHandler = EventHandler> export type FormEvent = ExtendedFormEvent export type ButtonMouseEvent = ExtendedMouseEvent export type AnchorMouseEvent = ExtendedMouseEvent export type InputKeyboardEvent = ExtendedKeyboardEvent export type TextareaKeyboardEvent = ExtendedKeyboardEvent // WHAT IS IT? export type TungstenEventHandler = EventHandler>;