{"version":3,"file":"EventSystem.mjs","sources":["../src/EventSystem.ts"],"sourcesContent":["import { extensions, ExtensionType } from '@pixi/core';\nimport { EventBoundary } from './EventBoundary';\nimport { EventsTicker } from './EventTicker';\nimport { FederatedPointerEvent } from './FederatedPointerEvent';\nimport { FederatedWheelEvent } from './FederatedWheelEvent';\n\nimport type { ExtensionMetadata, IPointData, IRenderer, ISystem } from '@pixi/core';\nimport type { DisplayObject } from '@pixi/display';\nimport type { PixiTouch } from './FederatedEvent';\nimport type { EventMode } from './FederatedEventTarget';\nimport type { FederatedMouseEvent } from './FederatedMouseEvent';\n\nconst MOUSE_POINTER_ID = 1;\nconst TOUCH_TO_POINTER: Record = {\n touchstart: 'pointerdown',\n touchend: 'pointerup',\n touchendoutside: 'pointerupoutside',\n touchmove: 'pointermove',\n touchcancel: 'pointercancel',\n};\n\n/** @ignore */\nexport interface EventSystemOptions\n{\n /**\n * The default event mode mode for all display objects.\n * This option only is available when using **@pixi/events** package\n * (included in the **pixi.js** and **pixi.js-legacy** bundle), otherwise it will be ignored.\n * @memberof PIXI.IRendererOptions\n */\n eventMode?: EventMode;\n\n /**\n * The event features that are enabled by the EventSystem\n * This option only is available when using **@pixi/events** package\n * (included in the **pixi.js** and **pixi.js-legacy** bundle), otherwise it will be ignored.\n * @memberof PIXI.IRendererOptions\n * @example\n * const app = new PIXI.Application({\n * view: canvas,\n * events: {\n * move: true,\n * globalMove: false,\n * click: true,\n * wheel: true,\n * },\n * });\n */\n eventFeatures?: Partial\n}\n\n/**\n * The event features that are enabled by the EventSystem\n * This option only is available when using **@pixi/events** package\n * (included in the **pixi.js** and **pixi.js-legacy** bundle), otherwise it will be ignored.\n * @memberof PIXI\n * @since 7.2.0\n */\ninterface EventSystemFeatures\n{\n /**\n * Enables pointer events associated with pointer movement:\n * - `pointermove` / `mousemove` / `touchmove`\n * - `pointerout` / `mouseout`\n * - `pointerover` / `mouseover`\n */\n move: boolean;\n // eslint-disable-next-line jsdoc/multiline-blocks\n /**\n * Enables global pointer move events:\n * - `globalpointermove`\n * - `globalmousemove`\n * - `globaltouchemove`\n */\n globalMove: boolean;\n /**\n * Enables pointer events associated with clicking:\n * - `pointerup` / `mouseup` / `touchend` / 'rightup'\n * - `pointerupoutside` / `mouseupoutside` / `touchendoutside` / 'rightupoutside'\n * - `pointerdown` / 'mousedown' / `touchstart` / 'rightdown'\n * - `click` / `tap`\n */\n click: boolean;\n /** - Enables wheel events. */\n wheel: boolean;\n}\n\n/**\n * The system for handling UI events.\n * @memberof PIXI\n */\nexport class EventSystem implements ISystem\n{\n /** @ignore */\n static extension: ExtensionMetadata = {\n name: 'events',\n type: [\n ExtensionType.RendererSystem,\n ExtensionType.CanvasRendererSystem\n ],\n };\n\n /**\n * The event features that are enabled by the EventSystem\n * This option only is available when using **@pixi/events** package\n * (included in the **pixi.js** and **pixi.js-legacy** bundle), otherwise it will be ignored.\n * @since 7.2.0\n */\n public static defaultEventFeatures: EventSystemFeatures = {\n move: true,\n globalMove: true,\n click: true,\n wheel: true,\n };\n\n private static _defaultEventMode: EventMode;\n\n /**\n * The default interaction mode for all display objects.\n * @see PIXI.DisplayObject.eventMode\n * @type {PIXI.EventMode}\n * @readonly\n * @since 7.2.0\n */\n public static get defaultEventMode()\n {\n return this._defaultEventMode;\n }\n\n /**\n * The {@link PIXI.EventBoundary} for the stage.\n *\n * The {@link PIXI.EventBoundary#rootTarget rootTarget} of this root boundary is automatically set to\n * the last rendered object before any event processing is initiated. This means the main scene\n * needs to be rendered atleast once before UI events will start propagating.\n *\n * The root boundary should only be changed during initialization. Otherwise, any state held by the\n * event boundary may be lost (like hovered & pressed DisplayObjects).\n */\n public readonly rootBoundary: EventBoundary;\n\n /** Does the device support touch events https://www.w3.org/TR/touch-events/ */\n public readonly supportsTouchEvents = 'ontouchstart' in globalThis;\n\n /** Does the device support pointer events https://www.w3.org/Submission/pointer-events/ */\n public readonly supportsPointerEvents = !!globalThis.PointerEvent;\n\n /**\n * Should default browser actions automatically be prevented.\n * Does not apply to pointer events for backwards compatibility\n * preventDefault on pointer events stops mouse events from firing\n * Thus, for every pointer event, there will always be either a mouse of touch event alongside it.\n * @default true\n */\n public autoPreventDefault: boolean;\n\n /**\n * Dictionary of how different cursor modes are handled. Strings are handled as CSS cursor\n * values, objects are handled as dictionaries of CSS values for {@code domElement},\n * and functions are called instead of changing the CSS.\n * Default CSS cursor values are provided for 'default' and 'pointer' modes.\n */\n public cursorStyles: Record void) | CSSStyleDeclaration>;\n\n /**\n * The DOM element to which the root event listeners are bound. This is automatically set to\n * the renderer's {@link PIXI.Renderer#view view}.\n */\n public domElement: HTMLElement = null;\n\n /** The resolution used to convert between the DOM client space into world space. */\n public resolution = 1;\n\n /** The renderer managing this {@link PIXI.EventSystem}. */\n public renderer: IRenderer;\n\n /**\n * The event features that are enabled by the EventSystem\n * This option only is available when using **@pixi/events** package\n * (included in the **pixi.js** and **pixi.js-legacy** bundle), otherwise it will be ignored.\n * @since 7.2.0\n * @example\n * const app = new PIXI.Application()\n * app.renderer.events.features.globalMove = false\n *\n * // to override all features use Object.assign\n * Object.assign(app.renderer.events.features, {\n * move: false,\n * globalMove: false,\n * click: false,\n * wheel: false,\n * })\n */\n public readonly features: EventSystemFeatures;\n\n private currentCursor: string;\n private rootPointerEvent: FederatedPointerEvent;\n private rootWheelEvent: FederatedWheelEvent;\n private eventsAdded: boolean;\n\n /**\n * @param {PIXI.Renderer} renderer\n */\n constructor(renderer: IRenderer)\n {\n this.renderer = renderer;\n this.rootBoundary = new EventBoundary(null);\n EventsTicker.init(this);\n\n this.autoPreventDefault = true;\n this.eventsAdded = false;\n\n this.rootPointerEvent = new FederatedPointerEvent(null);\n this.rootWheelEvent = new FederatedWheelEvent(null);\n\n this.cursorStyles = {\n default: 'inherit',\n pointer: 'pointer',\n };\n\n this.features = new Proxy({ ...EventSystem.defaultEventFeatures }, {\n set: (target, key, value) =>\n {\n if (key === 'globalMove')\n {\n this.rootBoundary.enableGlobalMoveEvents = value;\n }\n target[key as keyof EventSystemFeatures] = value;\n\n return true;\n }\n });\n\n this.onPointerDown = this.onPointerDown.bind(this);\n this.onPointerMove = this.onPointerMove.bind(this);\n this.onPointerUp = this.onPointerUp.bind(this);\n this.onPointerOverOut = this.onPointerOverOut.bind(this);\n this.onWheel = this.onWheel.bind(this);\n }\n\n /**\n * Runner init called, view is available at this point.\n * @ignore\n */\n init(options: EventSystemOptions): void\n {\n const { view, resolution } = this.renderer;\n\n this.setTargetElement(view as HTMLCanvasElement);\n this.resolution = resolution;\n EventSystem._defaultEventMode = options.eventMode ?? 'auto';\n Object.assign(this.features, options.eventFeatures ?? {});\n this.rootBoundary.enableGlobalMoveEvents = this.features.globalMove;\n }\n\n /**\n * Handle changing resolution.\n * @ignore\n */\n resolutionChange(resolution: number): void\n {\n this.resolution = resolution;\n }\n\n /** Destroys all event listeners and detaches the renderer. */\n destroy(): void\n {\n this.setTargetElement(null);\n this.renderer = null;\n }\n\n /**\n * Sets the current cursor mode, handling any callbacks or CSS style changes.\n * @param mode - cursor mode, a key from the cursorStyles dictionary\n */\n public setCursor(mode: string): void\n {\n mode = mode || 'default';\n let applyStyles = true;\n\n // offscreen canvas does not support setting styles, but cursor modes can be functions,\n // in order to handle pixi rendered cursors, so we can't bail\n if (globalThis.OffscreenCanvas && this.domElement instanceof OffscreenCanvas)\n {\n applyStyles = false;\n }\n // if the mode didn't actually change, bail early\n if (this.currentCursor === mode)\n {\n return;\n }\n this.currentCursor = mode;\n const style = this.cursorStyles[mode];\n\n // only do things if there is a cursor style for it\n if (style)\n {\n switch (typeof style)\n {\n case 'string':\n // string styles are handled as cursor CSS\n if (applyStyles)\n {\n this.domElement.style.cursor = style;\n }\n break;\n case 'function':\n // functions are just called, and passed the cursor mode\n style(mode);\n break;\n case 'object':\n // if it is an object, assume that it is a dictionary of CSS styles,\n // apply it to the interactionDOMElement\n if (applyStyles)\n {\n Object.assign(this.domElement.style, style);\n }\n break;\n }\n }\n else if (applyStyles && typeof mode === 'string' && !Object.prototype.hasOwnProperty.call(this.cursorStyles, mode))\n {\n // if it mode is a string (not a Symbol) and cursorStyles doesn't have any entry\n // for the mode, then assume that the dev wants it to be CSS for the cursor.\n this.domElement.style.cursor = mode;\n }\n }\n\n /**\n * The global pointer event.\n * Useful for getting the pointer position without listening to events.\n * @since 7.2.0\n */\n public get pointer(): Readonly\n {\n return this.rootPointerEvent;\n }\n\n /**\n * Event handler for pointer down events on {@link PIXI.EventSystem#domElement this.domElement}.\n * @param nativeEvent - The native mouse/pointer/touch event.\n */\n private onPointerDown(nativeEvent: MouseEvent | PointerEvent | TouchEvent): void\n {\n if (!this.features.click) return;\n this.rootBoundary.rootTarget = this.renderer.lastObjectRendered as DisplayObject;\n\n const events = this.normalizeToPointerData(nativeEvent);\n\n /*\n * No need to prevent default on natural pointer events, as there are no side effects\n * Normalized events, however, may have the double mousedown/touchstart issue on the native android browser,\n * so still need to be prevented.\n */\n\n // Guaranteed that there will be at least one event in events, and all events must have the same pointer type\n\n if (this.autoPreventDefault && (events[0] as any).isNormalized)\n {\n const cancelable = nativeEvent.cancelable || !('cancelable' in nativeEvent);\n\n if (cancelable)\n {\n nativeEvent.preventDefault();\n }\n }\n\n for (let i = 0, j = events.length; i < j; i++)\n {\n const nativeEvent = events[i];\n const federatedEvent = this.bootstrapEvent(this.rootPointerEvent, nativeEvent);\n\n this.rootBoundary.mapEvent(federatedEvent);\n }\n\n this.setCursor(this.rootBoundary.cursor);\n }\n\n /**\n * Event handler for pointer move events on on {@link PIXI.EventSystem#domElement this.domElement}.\n * @param nativeEvent - The native mouse/pointer/touch events.\n */\n private onPointerMove(nativeEvent: MouseEvent | PointerEvent | TouchEvent): void\n {\n if (!this.features.move) return;\n this.rootBoundary.rootTarget = this.renderer.lastObjectRendered as DisplayObject;\n\n EventsTicker.pointerMoved();\n\n const normalizedEvents = this.normalizeToPointerData(nativeEvent);\n\n for (let i = 0, j = normalizedEvents.length; i < j; i++)\n {\n const event = this.bootstrapEvent(this.rootPointerEvent, normalizedEvents[i]);\n\n this.rootBoundary.mapEvent(event);\n }\n\n this.setCursor(this.rootBoundary.cursor);\n }\n\n /**\n * Event handler for pointer up events on {@link PIXI.EventSystem#domElement this.domElement}.\n * @param nativeEvent - The native mouse/pointer/touch event.\n */\n private onPointerUp(nativeEvent: MouseEvent | PointerEvent | TouchEvent): void\n {\n if (!this.features.click) return;\n this.rootBoundary.rootTarget = this.renderer.lastObjectRendered as DisplayObject;\n\n let target = nativeEvent.target;\n\n // if in shadow DOM use composedPath to access target\n if (nativeEvent.composedPath && nativeEvent.composedPath().length > 0)\n {\n target = nativeEvent.composedPath()[0];\n }\n\n const outside = target !== this.domElement ? 'outside' : '';\n const normalizedEvents = this.normalizeToPointerData(nativeEvent);\n\n for (let i = 0, j = normalizedEvents.length; i < j; i++)\n {\n const event = this.bootstrapEvent(this.rootPointerEvent, normalizedEvents[i]);\n\n event.type += outside;\n\n this.rootBoundary.mapEvent(event);\n }\n\n this.setCursor(this.rootBoundary.cursor);\n }\n\n /**\n * Event handler for pointer over & out events on {@link PIXI.EventSystem#domElement this.domElement}.\n * @param nativeEvent - The native mouse/pointer/touch event.\n */\n private onPointerOverOut(nativeEvent: MouseEvent | PointerEvent | TouchEvent): void\n {\n if (!this.features.click) return;\n this.rootBoundary.rootTarget = this.renderer.lastObjectRendered as DisplayObject;\n\n const normalizedEvents = this.normalizeToPointerData(nativeEvent);\n\n for (let i = 0, j = normalizedEvents.length; i < j; i++)\n {\n const event = this.bootstrapEvent(this.rootPointerEvent, normalizedEvents[i]);\n\n this.rootBoundary.mapEvent(event);\n }\n\n this.setCursor(this.rootBoundary.cursor);\n }\n\n /**\n * Passive handler for `wheel` events on {@link PIXI.EventSystem.domElement this.domElement}.\n * @param nativeEvent - The native wheel event.\n */\n protected onWheel(nativeEvent: WheelEvent): void\n {\n if (!this.features.wheel) return;\n const wheelEvent = this.normalizeWheelEvent(nativeEvent);\n\n this.rootBoundary.rootTarget = this.renderer.lastObjectRendered as DisplayObject;\n this.rootBoundary.mapEvent(wheelEvent);\n }\n\n /**\n * Sets the {@link PIXI.EventSystem#domElement domElement} and binds event listeners.\n *\n * To deregister the current DOM element without setting a new one, pass {@code null}.\n * @param element - The new DOM element.\n */\n public setTargetElement(element: HTMLElement): void\n {\n this.removeEvents();\n this.domElement = element;\n EventsTicker.domElement = element;\n this.addEvents();\n }\n\n /** Register event listeners on {@link PIXI.Renderer#domElement this.domElement}. */\n private addEvents(): void\n {\n if (this.eventsAdded || !this.domElement)\n {\n return;\n }\n\n EventsTicker.addTickerListener();\n\n const style = this.domElement.style as CrossCSSStyleDeclaration;\n\n if (style)\n {\n if ((globalThis.navigator as any).msPointerEnabled)\n {\n style.msContentZooming = 'none';\n style.msTouchAction = 'none';\n }\n else if (this.supportsPointerEvents)\n {\n style.touchAction = 'none';\n }\n }\n\n /*\n * These events are added first, so that if pointer events are normalized, they are fired\n * in the same order as non-normalized events. ie. pointer event 1st, mouse / touch 2nd\n */\n if (this.supportsPointerEvents)\n {\n globalThis.document.addEventListener('pointermove', this.onPointerMove, true);\n this.domElement.addEventListener('pointerdown', this.onPointerDown, true);\n // pointerout is fired in addition to pointerup (for touch events) and pointercancel\n // we already handle those, so for the purposes of what we do in onPointerOut, we only\n // care about the pointerleave event\n this.domElement.addEventListener('pointerleave', this.onPointerOverOut, true);\n this.domElement.addEventListener('pointerover', this.onPointerOverOut, true);\n // globalThis.addEventListener('pointercancel', this.onPointerCancel, true);\n globalThis.addEventListener('pointerup', this.onPointerUp, true);\n }\n else\n {\n globalThis.document.addEventListener('mousemove', this.onPointerMove, true);\n this.domElement.addEventListener('mousedown', this.onPointerDown, true);\n this.domElement.addEventListener('mouseout', this.onPointerOverOut, true);\n this.domElement.addEventListener('mouseover', this.onPointerOverOut, true);\n globalThis.addEventListener('mouseup', this.onPointerUp, true);\n\n if (this.supportsTouchEvents)\n {\n this.domElement.addEventListener('touchstart', this.onPointerDown, true);\n // this.domElement.addEventListener('touchcancel', this.onPointerCancel, true);\n this.domElement.addEventListener('touchend', this.onPointerUp, true);\n this.domElement.addEventListener('touchmove', this.onPointerMove, true);\n }\n }\n\n this.domElement.addEventListener('wheel', this.onWheel, {\n passive: true,\n capture: true,\n });\n\n this.eventsAdded = true;\n }\n\n /** Unregister event listeners on {@link PIXI.EventSystem#domElement this.domElement}. */\n private removeEvents(): void\n {\n if (!this.eventsAdded || !this.domElement)\n {\n return;\n }\n\n EventsTicker.removeTickerListener();\n\n const style = this.domElement.style as CrossCSSStyleDeclaration;\n\n if ((globalThis.navigator as any).msPointerEnabled)\n {\n style.msContentZooming = '';\n style.msTouchAction = '';\n }\n else if (this.supportsPointerEvents)\n {\n style.touchAction = '';\n }\n\n if (this.supportsPointerEvents)\n {\n globalThis.document.removeEventListener('pointermove', this.onPointerMove, true);\n this.domElement.removeEventListener('pointerdown', this.onPointerDown, true);\n this.domElement.removeEventListener('pointerleave', this.onPointerOverOut, true);\n this.domElement.removeEventListener('pointerover', this.onPointerOverOut, true);\n // globalThis.removeEventListener('pointercancel', this.onPointerCancel, true);\n globalThis.removeEventListener('pointerup', this.onPointerUp, true);\n }\n else\n {\n globalThis.document.removeEventListener('mousemove', this.onPointerMove, true);\n this.domElement.removeEventListener('mousedown', this.onPointerDown, true);\n this.domElement.removeEventListener('mouseout', this.onPointerOverOut, true);\n this.domElement.removeEventListener('mouseover', this.onPointerOverOut, true);\n globalThis.removeEventListener('mouseup', this.onPointerUp, true);\n\n if (this.supportsTouchEvents)\n {\n this.domElement.removeEventListener('touchstart', this.onPointerDown, true);\n // this.domElement.removeEventListener('touchcancel', this.onPointerCancel, true);\n this.domElement.removeEventListener('touchend', this.onPointerUp, true);\n this.domElement.removeEventListener('touchmove', this.onPointerMove, true);\n }\n }\n\n this.domElement.removeEventListener('wheel', this.onWheel, true);\n\n this.domElement = null;\n this.eventsAdded = false;\n }\n\n /**\n * Maps x and y coords from a DOM object and maps them correctly to the PixiJS view. The\n * resulting value is stored in the point. This takes into account the fact that the DOM\n * element could be scaled and positioned anywhere on the screen.\n * @param {PIXI.IPointData} point - the point that the result will be stored in\n * @param {number} x - the x coord of the position to map\n * @param {number} y - the y coord of the position to map\n */\n public mapPositionToPoint(point: IPointData, x: number, y: number): void\n {\n const rect = this.domElement.isConnected\n ? this.domElement.getBoundingClientRect()\n : {\n x: 0,\n y: 0,\n width: (this.domElement as any).width,\n height: (this.domElement as any).height,\n left: 0,\n top: 0\n };\n\n const resolutionMultiplier = 1.0 / this.resolution;\n\n point.x = ((x - rect.left) * ((this.domElement as any).width / rect.width)) * resolutionMultiplier;\n point.y = ((y - rect.top) * ((this.domElement as any).height / rect.height)) * resolutionMultiplier;\n }\n\n /**\n * Ensures that the original event object contains all data that a regular pointer event would have\n * @param event - The original event data from a touch or mouse event\n * @returns An array containing a single normalized pointer event, in the case of a pointer\n * or mouse event, or a multiple normalized pointer events if there are multiple changed touches\n */\n private normalizeToPointerData(event: TouchEvent | MouseEvent | PointerEvent): PointerEvent[]\n {\n const normalizedEvents = [];\n\n if (this.supportsTouchEvents && event instanceof TouchEvent)\n {\n for (let i = 0, li = event.changedTouches.length; i < li; i++)\n {\n const touch = event.changedTouches[i] as PixiTouch;\n\n if (typeof touch.button === 'undefined') touch.button = 0;\n if (typeof touch.buttons === 'undefined') touch.buttons = 1;\n if (typeof touch.isPrimary === 'undefined')\n {\n touch.isPrimary = event.touches.length === 1 && event.type === 'touchstart';\n }\n if (typeof touch.width === 'undefined') touch.width = touch.radiusX || 1;\n if (typeof touch.height === 'undefined') touch.height = touch.radiusY || 1;\n if (typeof touch.tiltX === 'undefined') touch.tiltX = 0;\n if (typeof touch.tiltY === 'undefined') touch.tiltY = 0;\n if (typeof touch.pointerType === 'undefined') touch.pointerType = 'touch';\n if (typeof touch.pointerId === 'undefined') touch.pointerId = touch.identifier || 0;\n if (typeof touch.pressure === 'undefined') touch.pressure = touch.force || 0.5;\n if (typeof touch.twist === 'undefined') touch.twist = 0;\n if (typeof touch.tangentialPressure === 'undefined') touch.tangentialPressure = 0;\n // TODO: Remove these, as layerX/Y is not a standard, is deprecated, has uneven\n // support, and the fill ins are not quite the same\n // offsetX/Y might be okay, but is not the same as clientX/Y when the canvas's top\n // left is not 0,0 on the page\n if (typeof touch.layerX === 'undefined') touch.layerX = touch.offsetX = touch.clientX;\n if (typeof touch.layerY === 'undefined') touch.layerY = touch.offsetY = touch.clientY;\n\n // mark the touch as normalized, just so that we know we did it\n touch.isNormalized = true;\n touch.type = event.type;\n\n normalizedEvents.push(touch);\n }\n }\n // apparently PointerEvent subclasses MouseEvent, so yay\n else if (!globalThis.MouseEvent\n || (event instanceof MouseEvent && (!this.supportsPointerEvents || !(event instanceof globalThis.PointerEvent))))\n {\n const tempEvent = event as PixiPointerEvent;\n\n if (typeof tempEvent.isPrimary === 'undefined') tempEvent.isPrimary = true;\n if (typeof tempEvent.width === 'undefined') tempEvent.width = 1;\n if (typeof tempEvent.height === 'undefined') tempEvent.height = 1;\n if (typeof tempEvent.tiltX === 'undefined') tempEvent.tiltX = 0;\n if (typeof tempEvent.tiltY === 'undefined') tempEvent.tiltY = 0;\n if (typeof tempEvent.pointerType === 'undefined') tempEvent.pointerType = 'mouse';\n if (typeof tempEvent.pointerId === 'undefined') tempEvent.pointerId = MOUSE_POINTER_ID;\n if (typeof tempEvent.pressure === 'undefined') tempEvent.pressure = 0.5;\n if (typeof tempEvent.twist === 'undefined') tempEvent.twist = 0;\n if (typeof tempEvent.tangentialPressure === 'undefined') tempEvent.tangentialPressure = 0;\n\n // mark the mouse event as normalized, just so that we know we did it\n tempEvent.isNormalized = true;\n\n normalizedEvents.push(tempEvent);\n }\n else\n {\n normalizedEvents.push(event);\n }\n\n return normalizedEvents as PointerEvent[];\n }\n\n /**\n * Normalizes the native {@link https://w3c.github.io/uievents/#interface-wheelevent WheelEvent}.\n *\n * The returned {@link PIXI.FederatedWheelEvent} is a shared instance. It will not persist across\n * multiple native wheel events.\n * @param nativeEvent - The native wheel event that occurred on the canvas.\n * @returns A federated wheel event.\n */\n protected normalizeWheelEvent(nativeEvent: WheelEvent): FederatedWheelEvent\n {\n const event = this.rootWheelEvent;\n\n this.transferMouseData(event, nativeEvent);\n\n // When WheelEvent is triggered by scrolling with mouse wheel, reading WheelEvent.deltaMode\n // before deltaX/deltaY/deltaZ on Firefox will result in WheelEvent.DOM_DELTA_LINE (1),\n // while reading WheelEvent.deltaMode after deltaX/deltaY/deltaZ on Firefox or reading\n // in any order on other browsers will result in WheelEvent.DOM_DELTA_PIXEL (0).\n // Therefore, we need to read WheelEvent.deltaMode after deltaX/deltaY/deltaZ in order to\n // make its behavior more consistent across browsers.\n // @see https://github.com/pixijs/pixijs/issues/8970\n event.deltaX = nativeEvent.deltaX;\n event.deltaY = nativeEvent.deltaY;\n event.deltaZ = nativeEvent.deltaZ;\n event.deltaMode = nativeEvent.deltaMode;\n\n this.mapPositionToPoint(event.screen, nativeEvent.clientX, nativeEvent.clientY);\n event.global.copyFrom(event.screen);\n event.offset.copyFrom(event.screen);\n\n event.nativeEvent = nativeEvent;\n event.type = nativeEvent.type;\n\n return event;\n }\n\n /**\n * Normalizes the `nativeEvent` into a federateed {@link PIXI.FederatedPointerEvent}.\n * @param event\n * @param nativeEvent\n */\n private bootstrapEvent(event: FederatedPointerEvent, nativeEvent: PointerEvent): FederatedPointerEvent\n {\n event.originalEvent = null;\n event.nativeEvent = nativeEvent;\n\n event.pointerId = nativeEvent.pointerId;\n event.width = nativeEvent.width;\n event.height = nativeEvent.height;\n event.isPrimary = nativeEvent.isPrimary;\n event.pointerType = nativeEvent.pointerType;\n event.pressure = nativeEvent.pressure;\n event.tangentialPressure = nativeEvent.tangentialPressure;\n event.tiltX = nativeEvent.tiltX;\n event.tiltY = nativeEvent.tiltY;\n event.twist = nativeEvent.twist;\n this.transferMouseData(event, nativeEvent);\n\n this.mapPositionToPoint(event.screen, nativeEvent.clientX, nativeEvent.clientY);\n event.global.copyFrom(event.screen);// global = screen for top-level\n event.offset.copyFrom(event.screen);// EventBoundary recalculates using its rootTarget\n\n event.isTrusted = nativeEvent.isTrusted;\n if (event.type === 'pointerleave')\n {\n event.type = 'pointerout';\n }\n if (event.type.startsWith('mouse'))\n {\n event.type = event.type.replace('mouse', 'pointer');\n }\n if (event.type.startsWith('touch'))\n {\n event.type = TOUCH_TO_POINTER[event.type] || event.type;\n }\n\n return event;\n }\n\n /**\n * Transfers base & mouse event data from the {@code nativeEvent} to the federated event.\n * @param event\n * @param nativeEvent\n */\n private transferMouseData(event: FederatedMouseEvent, nativeEvent: MouseEvent): void\n {\n event.isTrusted = nativeEvent.isTrusted;\n event.srcElement = nativeEvent.srcElement;\n event.timeStamp = performance.now();\n event.type = nativeEvent.type;\n\n event.altKey = nativeEvent.altKey;\n event.button = nativeEvent.button;\n event.buttons = nativeEvent.buttons;\n event.client.x = nativeEvent.clientX;\n event.client.y = nativeEvent.clientY;\n event.ctrlKey = nativeEvent.ctrlKey;\n event.metaKey = nativeEvent.metaKey;\n event.movement.x = nativeEvent.movementX;\n event.movement.y = nativeEvent.movementY;\n event.page.x = nativeEvent.pageX;\n event.page.y = nativeEvent.pageY;\n event.relatedTarget = null;\n event.shiftKey = nativeEvent.shiftKey;\n }\n}\n\ninterface CrossCSSStyleDeclaration extends CSSStyleDeclaration\n{\n msContentZooming: string;\n msTouchAction: string;\n}\n\ninterface PixiPointerEvent extends PointerEvent\n{\n isPrimary: boolean;\n width: number;\n height: number;\n tiltX: number;\n tiltY: number;\n pointerType: string;\n pointerId: number;\n pressure: number;\n twist: number;\n tangentialPressure: number;\n isNormalized: boolean;\n type: string;\n}\n\nextensions.add(EventSystem);\n"],"names":["_EventSystem","nativeEvent"],"mappings":"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"}