{"version":3,"file":"EventBoundary.mjs","sources":["../src/EventBoundary.ts"],"sourcesContent":["import { Point, utils } from 'pixijs/core';\nimport { FederatedMouseEvent } from './FederatedMouseEvent';\nimport { FederatedPointerEvent } from './FederatedPointerEvent';\nimport { FederatedWheelEvent } from './FederatedWheelEvent';\n\nimport type { DisplayObject } from 'pixijs/display';\nimport type { FederatedEvent } from './FederatedEvent';\nimport type { Cursor, FederatedEventHandler, FederatedEventTarget, IFederatedDisplayObject } from './FederatedEventTarget';\n\n// The maximum iterations used in propagation. This prevent infinite loops.\nconst PROPAGATION_LIMIT = 2048;\n\nconst tempHitLocation = new Point();\nconst tempLocalMapping = new Point();\n\n/**\n * The tracking data for each pointer held in the state of an {@link PIXI.EventBoundary}.\n *\n * ```ts\n * pressTargetsByButton: {\n *     [id: number]: FederatedEventTarget[];\n * };\n * clicksByButton: {\n *     [id: number]: {\n *         clickCount: number;\n *         target: FederatedEventTarget;\n *         timeStamp: number;\n *     };\n * };\n * overTargets: FederatedEventTarget[];\n * ```\n * @typedef {object} TrackingData\n * @property {Record.<number, PIXI.FederatedEventTarget>} pressTargetsByButton - The pressed display objects'\n *  propagation paths by each button of the pointer.\n * @property {Record.<number, object>} clicksByButton - Holds clicking data for each button of the pointer.\n * @property {PIXI.DisplayObject[]} overTargets - The DisplayObject propagation path over which the pointer is hovering.\n * @memberof PIXI\n */\ntype TrackingData = {\n    pressTargetsByButton: {\n        [id: number]: FederatedEventTarget[];\n    };\n    clicksByButton: {\n        [id: number]: {\n            clickCount: number;\n            target: FederatedEventTarget;\n            timeStamp: number;\n        }\n    };\n    overTargets: FederatedEventTarget[];\n};\n\n/**\n * Internal storage of an event listener in EventEmitter.\n * @ignore\n */\ntype EmitterListener = { fn(...args: any[]): any, context: any, once: boolean };\n\n/**\n * Internal storage of event listeners in EventEmitter.\n * @ignore\n */\ntype EmitterListeners = Record<string, EmitterListener | EmitterListener[]>;\n\n/**\n * Event boundaries are \"barriers\" where events coming from an upstream scene are modified before downstream propagation.\n *\n * ## Root event boundary\n *\n * The {@link PIXI.EventSystem#rootBoundary rootBoundary} handles events coming from the &lt;canvas /&gt;.\n * {@link PIXI.EventSystem} handles the normalization from native {@link https://dom.spec.whatwg.org/#event Events}\n * into {@link PIXI.FederatedEvent FederatedEvents}. The rootBoundary then does the hit-testing and event dispatch\n * for the upstream normalized event.\n *\n * ## Additional event boundaries\n *\n * An additional event boundary may be desired within an application's scene graph. For example, if a portion of the scene is\n * is flat with many children at one level - a spatial hash maybe needed to accelerate hit testing. In this scenario, the\n * container can be detached from the scene and glued using a custom event boundary.\n *\n * ```ts\n * import { Container } from 'pixijs/display';\n * import { EventBoundary } from 'pixijs/events';\n * import { SpatialHash } from 'pixi-spatial-hash';\n *\n * class HashedHitTestingEventBoundary\n * {\n *     private spatialHash: SpatialHash;\n *\n *     constructor(scene: Container, spatialHash: SpatialHash)\n *     {\n *         super(scene);\n *         this.spatialHash = spatialHash;\n *     }\n *\n *     hitTestRecursive(...)\n *     {\n *         // TODO: If target === this.rootTarget, then use spatial hash to get a\n *         // list of possible children that match the given (x,y) coordinates.\n *     }\n * }\n *\n * class VastScene extends DisplayObject\n * {\n *     protected eventBoundary: EventBoundary;\n *     protected scene: Container;\n *     protected spatialHash: SpatialHash;\n *\n *     constructor()\n *     {\n *         this.scene = new Container();\n *         this.spatialHash = new SpatialHash();\n *         this.eventBoundary = new HashedHitTestingEventBoundary(this.scene, this.spatialHash);\n *\n *         // Populate this.scene with a ton of children, while updating this.spatialHash\n *     }\n * }\n * ```\n * @memberof PIXI\n */\nexport class EventBoundary\n{\n    /**\n     * The root event-target residing below the event boundary.\n     *\n     * All events are dispatched trickling down and bubbling up to this `rootTarget`.\n     */\n    public rootTarget: DisplayObject;\n\n    /**\n     * Emits events after they were dispatched into the scene graph.\n     *\n     * This can be used for global events listening, regardless of the scene graph being used. It should\n     * not be used by interactive libraries for normal use.\n     *\n     * Special events that do not bubble all the way to the root target are not emitted from here,\n     * e.g. pointerenter, pointerleave, click.\n     */\n    public dispatch: utils.EventEmitter = new utils.EventEmitter();\n\n    /** The cursor preferred by the event targets underneath this boundary. */\n    public cursor: Cursor | string;\n\n    /**\n     * This flag would emit `pointermove`, `touchmove`, and `mousemove` events on all DisplayObjects.\n     *\n     * The `moveOnAll` semantics mirror those of earlier versions of PixiJS. This was disabled in favor of\n     * the Pointer Event API's approach.\n     */\n    public moveOnAll = false;\n\n    /**\n     * Maps event types to forwarding handles for them.\n     *\n     * {@link PIXI.EventBoundary EventBoundary} provides mapping for \"pointerdown\", \"pointermove\",\n     * \"pointerout\", \"pointerleave\", \"pointerover\", \"pointerup\", and \"pointerupoutside\" by default.\n     * @see PIXI.EventBoundary#addEventMapping\n     */\n    protected mappingTable: Record<string, Array<{\n        fn: (e: FederatedEvent) => void,\n        priority: number\n    }>>;\n\n    /**\n     * State object for mapping methods.\n     * @see PIXI.EventBoundary#trackingData\n     */\n    protected mappingState: Record<string, any> = {\n        trackingData: {}\n    };\n\n    /**\n     * The event pool maps event constructors to an free pool of instances of those specific events.\n     * @see PIXI.EventBoundary#allocateEvent\n     * @see PIXI.EventBoundary#freeEvent\n     */\n    protected eventPool: Map<typeof FederatedEvent, FederatedEvent[]> = new Map();\n\n    /**\n     * @param rootTarget - The holder of the event boundary.\n     */\n    constructor(rootTarget?: DisplayObject)\n    {\n        this.rootTarget = rootTarget;\n\n        this.hitPruneFn = this.hitPruneFn.bind(this);\n        this.hitTestFn = this.hitTestFn.bind(this);\n        this.mapPointerDown = this.mapPointerDown.bind(this);\n        this.mapPointerMove = this.mapPointerMove.bind(this);\n        this.mapPointerOut = this.mapPointerOut.bind(this);\n        this.mapPointerOver = this.mapPointerOver.bind(this);\n        this.mapPointerUp = this.mapPointerUp.bind(this);\n        this.mapPointerUpOutside = this.mapPointerUpOutside.bind(this);\n        this.mapWheel = this.mapWheel.bind(this);\n\n        this.mappingTable = {};\n        this.addEventMapping('pointerdown', this.mapPointerDown);\n        this.addEventMapping('pointermove', this.mapPointerMove);\n        this.addEventMapping('pointerout', this.mapPointerOut);\n        this.addEventMapping('pointerleave', this.mapPointerOut);\n        this.addEventMapping('pointerover', this.mapPointerOver);\n        this.addEventMapping('pointerup', this.mapPointerUp);\n        this.addEventMapping('pointerupoutside', this.mapPointerUpOutside);\n        this.addEventMapping('wheel', this.mapWheel);\n    }\n\n    /**\n     * Adds an event mapping for the event `type` handled by `fn`.\n     *\n     * Event mappings can be used to implement additional or custom events. They take an event\n     * coming from the upstream scene (or directly from the {@link PIXI.EventSystem}) and dispatch new downstream events\n     * generally trickling down and bubbling up to {@link PIXI.EventBoundary.rootTarget this.rootTarget}.\n     *\n     * To modify the semantics of existing events, the built-in mapping methods of EventBoundary should be overridden\n     * instead.\n     * @param type - The type of upstream event to map.\n     * @param fn - The mapping method. The context of this function must be bound manually, if desired.\n     */\n    public addEventMapping(type: string, fn: (e: FederatedEvent) => void): void\n    {\n        if (!this.mappingTable[type])\n        {\n            this.mappingTable[type] = [];\n        }\n\n        this.mappingTable[type].push({\n            fn,\n            priority: 0,\n        });\n        this.mappingTable[type].sort((a, b) => a.priority - b.priority);\n    }\n\n    /**\n     * Dispatches the given event\n     * @param e\n     * @param type\n     */\n    public dispatchEvent(e: FederatedEvent, type?: string): void\n    {\n        e.propagationStopped = false;\n        e.propagationImmediatelyStopped = false;\n\n        this.propagate(e, type);\n        this.dispatch.emit(type || e.type, e);\n    }\n\n    /**\n     * Maps the given upstream event through the event boundary and propagates it downstream.\n     * @param e\n     */\n    public mapEvent(e: FederatedEvent): void\n    {\n        if (!this.rootTarget)\n        {\n            return;\n        }\n\n        const mappers = this.mappingTable[e.type];\n\n        if (mappers)\n        {\n            for (let i = 0, j = mappers.length; i < j; i++)\n            {\n                mappers[i].fn(e);\n            }\n        }\n        else\n        {\n            console.warn(`[EventBoundary]: Event mapping not defined for ${e.type}`);\n        }\n    }\n\n    /**\n     * Finds the DisplayObject that is the target of a event at the given coordinates.\n     *\n     * The passed (x,y) coordinates are in the world space above this event boundary.\n     * @param x\n     * @param y\n     */\n    public hitTest(\n        x: number,\n        y: number,\n    ): DisplayObject\n    {\n        const invertedPath = this.hitTestRecursive(\n            this.rootTarget,\n            this.rootTarget.interactive,\n            tempHitLocation.set(x, y),\n            this.hitTestFn,\n            this.hitPruneFn,\n        );\n\n        return invertedPath && invertedPath[0];\n    }\n\n    /**\n     * Propagate the passed event from from {@link EventBoundary.rootTarget this.rootTarget} to its\n     * target {@code e.target}.\n     * @param e - The event to propagate.\n     * @param type\n     */\n    public propagate(e: FederatedEvent, type?: string): void\n    {\n        if (!e.target)\n        {\n            // This usually occurs when the scene graph is not interactive.\n            return;\n        }\n\n        const composedPath = e.composedPath();\n\n        // Capturing phase\n        e.eventPhase = e.CAPTURING_PHASE;\n\n        for (let i = 0, j = composedPath.length - 1; i < j; i++)\n        {\n            e.currentTarget = composedPath[i];\n\n            this.notifyTarget(e, type);\n\n            if (e.propagationStopped || e.propagationImmediatelyStopped) return;\n        }\n\n        // At target phase\n        e.eventPhase = e.AT_TARGET;\n        e.currentTarget = e.target;\n\n        this.notifyTarget(e, type);\n\n        if (e.propagationStopped || e.propagationImmediatelyStopped) return;\n\n        // Bubbling phase\n        e.eventPhase = e.BUBBLING_PHASE;\n\n        for (let i = composedPath.length - 2; i >= 0; i--)\n        {\n            e.currentTarget = composedPath[i];\n\n            this.notifyTarget(e, type);\n\n            if (e.propagationStopped || e.propagationImmediatelyStopped) return;\n        }\n    }\n\n    /**\n     * Emits the event {@link e} to all display objects. The event is propagated in the bubbling phase always.\n     *\n     * This is used in the `pointermove` legacy mode.\n     * @param e - The emitted event.\n     * @param type - The listeners to notify.\n     * @param target\n     */\n    public all(e: FederatedEvent, type?: string, target: FederatedEventTarget = this.rootTarget): void\n    {\n        e.eventPhase = e.BUBBLING_PHASE;\n\n        const children = target.children;\n\n        if (children)\n        {\n            for (let i = 0; i < children.length; i++)\n            {\n                this.all(e, type, children[i]);\n            }\n        }\n\n        e.currentTarget = target;\n        this.notifyTarget(e, type);\n    }\n\n    /**\n     * Finds the propagation path from {@link PIXI.EventBoundary.rootTarget rootTarget} to the passed\n     * {@code target}. The last element in the path is {@code target}.\n     * @param target\n     */\n    public propagationPath(target: FederatedEventTarget): FederatedEventTarget[]\n    {\n        const propagationPath = [target];\n\n        for (let i = 0; i < PROPAGATION_LIMIT && target !== this.rootTarget; i++)\n        {\n            if (!target.parent)\n            {\n                throw new Error('Cannot find propagation path to disconnected target');\n            }\n\n            propagationPath.push(target.parent);\n\n            target = target.parent;\n        }\n\n        propagationPath.reverse();\n\n        return propagationPath;\n    }\n\n    /**\n     * Recursive implementation for {@link EventBoundary.hitTest hitTest}.\n     * @param currentTarget - The DisplayObject that is to be hit tested.\n     * @param interactive - Flags whether `currentTarget` or one of its parents are interactive.\n     * @param location - The location that is being tested for overlap.\n     * @param testFn - Callback that determines whether the target passes hit testing. This callback\n     *  can assume that `pruneFn` failed to prune the display object.\n     * @param pruneFn - Callback that determiness whether the target and all of its children\n     *  cannot pass the hit test. It is used as a preliminary optimization to prune entire subtrees\n     *  of the scene graph.\n     * @returns An array holding the hit testing target and all its ancestors in order. The first element\n     *  is the target itself and the last is {@link EventBoundary.rootTarget rootTarget}. This is the opposite\n     *  order w.r.t. the propagation path. If no hit testing target is found, null is returned.\n     */\n    protected hitTestRecursive(\n        currentTarget: DisplayObject,\n        interactive: boolean,\n        location: Point,\n        testFn: (object: DisplayObject, pt: Point) => boolean,\n        pruneFn?: (object: DisplayObject, pt: Point) => boolean,\n    ): DisplayObject[]\n    {\n        if (!currentTarget || !currentTarget.visible)\n        {\n            return null;\n        }\n\n        // Attempt to prune this DisplayObject and its subtree as an optimization.\n        if (pruneFn(currentTarget, location))\n        {\n            return null;\n        }\n\n        // Find a child that passes the hit testing and return one, if any.\n        if (currentTarget.interactiveChildren && currentTarget.children)\n        {\n            const children = currentTarget.children;\n\n            for (let i = children.length - 1; i >= 0; i--)\n            {\n                const child = children[i] as DisplayObject;\n\n                const nestedHit = this.hitTestRecursive(\n                    child,\n                    interactive || child.interactive,\n                    location,\n                    testFn,\n                    pruneFn,\n                );\n\n                if (nestedHit)\n                {\n                    // Its a good idea to check if a child has lost its parent.\n                    // this means it has been removed whilst looping so its best\n                    if (nestedHit.length > 0 && !nestedHit[nestedHit.length - 1].parent)\n                    {\n                        continue;\n                    }\n\n                    // Only add the current hit-test target to the hit-test chain if the chain\n                    // has already started (i.e. the event target has been found) or if the current\n                    // target is interactive (i.e. it becomes the event target).\n                    if (nestedHit.length > 0 || currentTarget.interactive)\n                    {\n                        nestedHit.push(currentTarget);\n                    }\n\n                    return nestedHit;\n                }\n            }\n        }\n\n        // Finally, hit test this DisplayObject itself.\n        if (interactive && testFn(currentTarget, location))\n        {\n            // The current hit-test target is the event's target only if it is interactive. Otherwise,\n            // the first interactive ancestor will be the event's target.\n            return currentTarget.interactive ? [currentTarget] : [];\n        }\n\n        return null;\n    }\n\n    /**\n     * Checks whether the display object or any of its children cannot pass the hit test at all.\n     *\n     * {@link EventBoundary}'s implementation uses the {@link PIXI.DisplayObject.hitArea hitArea}\n     * and {@link PIXI.DisplayObject._mask} for pruning.\n     * @param displayObject\n     * @param location\n     */\n    protected hitPruneFn(displayObject: DisplayObject, location: Point): boolean\n    {\n        if (displayObject.hitArea)\n        {\n            displayObject.worldTransform.applyInverse(location, tempLocalMapping);\n\n            if (!displayObject.hitArea.contains(tempLocalMapping.x, tempLocalMapping.y))\n            {\n                return true;\n            }\n        }\n\n        if (displayObject._mask)\n        {\n            const maskObject = ((displayObject._mask as any).isMaskData\n                ? (displayObject._mask as any).maskObject : displayObject._mask);\n\n            if (maskObject && !maskObject.containsPoint?.(location))\n            {\n                return true;\n            }\n        }\n\n        return false;\n    }\n\n    /**\n     * Checks whether the display object passes hit testing for the given location.\n     * @param displayObject\n     * @param location\n     * @returns - Whether `displayObject` passes hit testing for `location`.\n     */\n    protected hitTestFn(displayObject: DisplayObject, location: Point): boolean\n    {\n        // If the display object failed pruning with a hitArea, then it must pass it.\n        if (displayObject.hitArea)\n        {\n            return true;\n        }\n\n        if ((displayObject as any).containsPoint)\n        {\n            return (displayObject as any).containsPoint(location) as boolean;\n        }\n\n        // TODO: Should we hit test based on bounds?\n\n        return false;\n    }\n\n    /**\n     * Notify all the listeners to the event's `currentTarget`.\n     *\n     * If the `currentTarget` contains the property `on<type>`, then it is called here,\n     * simulating the behavior from version 6.x and prior.\n     * @param e - The event passed to the target.\n     * @param type\n     */\n    protected notifyTarget(e: FederatedEvent, type?: string): void\n    {\n        type = type ?? e.type;\n\n        // call the `on${type}` for the current target if it exists\n        const handlerKey = `on${type}` as keyof IFederatedDisplayObject;\n\n        (e.currentTarget[handlerKey] as FederatedEventHandler<FederatedEvent<UIEvent>>)?.(e);\n\n        const key = e.eventPhase === e.CAPTURING_PHASE || e.eventPhase === e.AT_TARGET ? `${type}capture` : type;\n\n        this.notifyListeners(e, key);\n\n        if (e.eventPhase === e.AT_TARGET)\n        {\n            this.notifyListeners(e, type);\n        }\n    }\n\n    /**\n     * Maps the upstream `pointerdown` events to a downstream `pointerdown` event.\n     *\n     * `touchstart`, `rightdown`, `mousedown` events are also dispatched for specific pointer types.\n     * @param from\n     */\n    protected mapPointerDown(from: FederatedEvent): void\n    {\n        if (!(from instanceof FederatedPointerEvent))\n        {\n            console.warn('EventBoundary cannot map a non-pointer event as a pointer event');\n\n            return;\n        }\n\n        const e = this.createPointerEvent(from);\n\n        this.dispatchEvent(e, 'pointerdown');\n\n        if (e.pointerType === 'touch')\n        {\n            this.dispatchEvent(e, 'touchstart');\n        }\n        else if (e.pointerType === 'mouse' || e.pointerType === 'pen')\n        {\n            const isRightButton = e.button === 2;\n\n            this.dispatchEvent(e, isRightButton ? 'rightdown' : 'mousedown');\n        }\n\n        const trackingData = this.trackingData(from.pointerId);\n\n        trackingData.pressTargetsByButton[from.button] = e.composedPath();\n\n        this.freeEvent(e);\n    }\n\n    /**\n     * Maps the upstream `pointermove` to downstream `pointerout`, `pointerover`, and `pointermove` events, in that order.\n     *\n     * The tracking data for the specific pointer has an updated `overTarget`. `mouseout`, `mouseover`,\n     * `mousemove`, and `touchmove` events are fired as well for specific pointer types.\n     * @param from - The upstream `pointermove` event.\n     */\n    protected mapPointerMove(from: FederatedEvent): void\n    {\n        if (!(from instanceof FederatedPointerEvent))\n        {\n            console.warn('EventBoundary cannot map a non-pointer event as a pointer event');\n\n            return;\n        }\n\n        const e = this.createPointerEvent(from);\n        const isMouse = e.pointerType === 'mouse' || e.pointerType === 'pen';\n        const trackingData = this.trackingData(from.pointerId);\n        const outTarget = this.findMountedTarget(trackingData.overTargets);\n\n        // First pointerout/pointerleave\n        if (trackingData.overTargets?.length > 0 && outTarget !== e.target)\n        {\n            // pointerout always occurs on the overTarget when the pointer hovers over another element.\n            const outType = from.type === 'mousemove' ? 'mouseout' : 'pointerout';\n            const outEvent = this.createPointerEvent(from, outType, outTarget);\n\n            this.dispatchEvent(outEvent, 'pointerout');\n            if (isMouse) this.dispatchEvent(outEvent, 'mouseout');\n\n            // If the pointer exits overTarget and its descendants, then a pointerleave event is also fired. This event\n            // is dispatched to all ancestors that no longer capture the pointer.\n            if (!e.composedPath().includes(outTarget))\n            {\n                const leaveEvent = this.createPointerEvent(from, 'pointerleave', outTarget);\n\n                leaveEvent.eventPhase = leaveEvent.AT_TARGET;\n\n                while (leaveEvent.target && !e.composedPath().includes(leaveEvent.target))\n                {\n                    leaveEvent.currentTarget = leaveEvent.target;\n\n                    this.notifyTarget(leaveEvent);\n                    if (isMouse) this.notifyTarget(leaveEvent, 'mouseleave');\n\n                    leaveEvent.target = leaveEvent.target.parent;\n                }\n\n                this.freeEvent(leaveEvent);\n            }\n\n            this.freeEvent(outEvent);\n        }\n\n        // Then pointerover\n        if (outTarget !== e.target)\n        {\n            // pointerover always occurs on the new overTarget\n            const overType = from.type === 'mousemove' ? 'mouseover' : 'pointerover';\n            const overEvent = this.clonePointerEvent(e, overType);// clone faster\n\n            this.dispatchEvent(overEvent, 'pointerover');\n            if (isMouse) this.dispatchEvent(overEvent, 'mouseover');\n\n            // Probe whether the newly hovered DisplayObject is an ancestor of the original overTarget.\n            let overTargetAncestor = outTarget?.parent;\n\n            while (overTargetAncestor && overTargetAncestor !== this.rootTarget.parent)\n            {\n                if (overTargetAncestor === e.target) break;\n\n                overTargetAncestor = overTargetAncestor.parent;\n            }\n\n            // The pointer has entered a non-ancestor of the original overTarget. This means we need a pointerentered\n            // event.\n            const didPointerEnter = !overTargetAncestor || overTargetAncestor === this.rootTarget.parent;\n\n            if (didPointerEnter)\n            {\n                const enterEvent = this.clonePointerEvent(e, 'pointerenter');\n\n                enterEvent.eventPhase = enterEvent.AT_TARGET;\n\n                while (enterEvent.target\n                        && enterEvent.target !== outTarget\n                        && enterEvent.target !== this.rootTarget.parent)\n                {\n                    enterEvent.currentTarget = enterEvent.target;\n\n                    this.notifyTarget(enterEvent);\n                    if (isMouse) this.notifyTarget(enterEvent, 'mouseenter');\n\n                    enterEvent.target = enterEvent.target.parent;\n                }\n\n                this.freeEvent(enterEvent);\n            }\n\n            this.freeEvent(overEvent);\n        }\n\n        const propagationMethod = this.moveOnAll ? 'all' : 'dispatchEvent';\n\n        // Then pointermove\n        this[propagationMethod](e, 'pointermove');\n        this.all(e, 'globalpointermove');\n\n        if (e.pointerType === 'touch')\n        {\n            this[propagationMethod](e, 'touchmove');\n            this.all(e, 'globaltouchmove');\n        }\n\n        if (isMouse)\n        {\n            this[propagationMethod](e, 'mousemove');\n            this.all(e, 'globalmousemove');\n            this.cursor = e.target?.cursor;\n        }\n\n        trackingData.overTargets = e.composedPath();\n\n        this.freeEvent(e);\n    }\n\n    /**\n     * Maps the upstream `pointerover` to downstream `pointerover` and `pointerenter` events, in that order.\n     *\n     * The tracking data for the specific pointer gets a new `overTarget`.\n     * @param from - The upstream `pointerover` event.\n     */\n    protected mapPointerOver(from: FederatedEvent): void\n    {\n        if (!(from instanceof FederatedPointerEvent))\n        {\n            console.warn('EventBoundary cannot map a non-pointer event as a pointer event');\n\n            return;\n        }\n\n        const trackingData = this.trackingData(from.pointerId);\n        const e = this.createPointerEvent(from);\n        const isMouse = e.pointerType === 'mouse' || e.pointerType === 'pen';\n\n        this.dispatchEvent(e, 'pointerover');\n        if (isMouse) this.dispatchEvent(e, 'mouseover');\n        if (e.pointerType === 'mouse') this.cursor = e.target?.cursor;\n\n        // pointerenter events must be fired since the pointer entered from upstream.\n        const enterEvent = this.clonePointerEvent(e, 'pointerenter');\n\n        enterEvent.eventPhase = enterEvent.AT_TARGET;\n\n        while (enterEvent.target && enterEvent.target !== this.rootTarget.parent)\n        {\n            enterEvent.currentTarget = enterEvent.target;\n\n            this.notifyTarget(enterEvent);\n            if (isMouse) this.notifyTarget(enterEvent, 'mouseenter');\n\n            enterEvent.target = enterEvent.target.parent;\n        }\n\n        trackingData.overTargets = e.composedPath();\n\n        this.freeEvent(e);\n        this.freeEvent(enterEvent);\n    }\n\n    /**\n     * Maps the upstream `pointerout` to downstream `pointerout`, `pointerleave` events, in that order.\n     *\n     * The tracking data for the specific pointer is cleared of a `overTarget`.\n     * @param from - The upstream `pointerout` event.\n     */\n    protected mapPointerOut(from: FederatedEvent): void\n    {\n        if (!(from instanceof FederatedPointerEvent))\n        {\n            console.warn('EventBoundary cannot map a non-pointer event as a pointer event');\n\n            return;\n        }\n\n        const trackingData = this.trackingData(from.pointerId);\n\n        if (trackingData.overTargets)\n        {\n            const isMouse = from.pointerType === 'mouse' || from.pointerType === 'pen';\n            const outTarget = this.findMountedTarget(trackingData.overTargets);\n\n            // pointerout first\n            const outEvent = this.createPointerEvent(from, 'pointerout', outTarget);\n\n            this.dispatchEvent(outEvent);\n            if (isMouse) this.dispatchEvent(outEvent, 'mouseout');\n\n            // pointerleave(s) are also dispatched b/c the pointer must've left rootTarget and its descendants to\n            // get an upstream pointerout event (upstream events do not know rootTarget has descendants).\n            const leaveEvent = this.createPointerEvent(from, 'pointerleave', outTarget);\n\n            leaveEvent.eventPhase = leaveEvent.AT_TARGET;\n\n            while (leaveEvent.target && leaveEvent.target !== this.rootTarget.parent)\n            {\n                leaveEvent.currentTarget = leaveEvent.target;\n\n                this.notifyTarget(leaveEvent);\n                if (isMouse) this.notifyTarget(leaveEvent, 'mouseleave');\n\n                leaveEvent.target = leaveEvent.target.parent;\n            }\n\n            trackingData.overTargets = null;\n\n            this.freeEvent(outEvent);\n            this.freeEvent(leaveEvent);\n        }\n\n        this.cursor = null;\n    }\n\n    /**\n     * Maps the upstream `pointerup` event to downstream `pointerup`, `pointerupoutside`,\n     * and `click`/`rightclick`/`pointertap` events, in that order.\n     *\n     * The `pointerupoutside` event bubbles from the original `pointerdown` target to the most specific\n     * ancestor of the `pointerdown` and `pointerup` targets, which is also the `click` event's target. `touchend`,\n     * `rightup`, `mouseup`, `touchendoutside`, `rightupoutside`, `mouseupoutside`, and `tap` are fired as well for\n     * specific pointer types.\n     * @param from - The upstream `pointerup` event.\n     */\n    protected mapPointerUp(from: FederatedEvent): void\n    {\n        if (!(from instanceof FederatedPointerEvent))\n        {\n            console.warn('EventBoundary cannot map a non-pointer event as a pointer event');\n\n            return;\n        }\n\n        const now = performance.now();\n        const e = this.createPointerEvent(from);\n\n        this.dispatchEvent(e, 'pointerup');\n\n        if (e.pointerType === 'touch')\n        {\n            this.dispatchEvent(e, 'touchend');\n        }\n        else if (e.pointerType === 'mouse' || e.pointerType === 'pen')\n        {\n            const isRightButton = e.button === 2;\n\n            this.dispatchEvent(e, isRightButton ? 'rightup' : 'mouseup');\n        }\n\n        const trackingData = this.trackingData(from.pointerId);\n        const pressTarget = this.findMountedTarget(trackingData.pressTargetsByButton[from.button]);\n\n        let clickTarget = pressTarget;\n\n        // pointerupoutside only bubbles. It only bubbles upto the parent that doesn't contain\n        // the pointerup location.\n        if (pressTarget && !e.composedPath().includes(pressTarget))\n        {\n            let currentTarget = pressTarget;\n\n            while (currentTarget && !e.composedPath().includes(currentTarget))\n            {\n                e.currentTarget = currentTarget;\n\n                this.notifyTarget(e, 'pointerupoutside');\n\n                if (e.pointerType === 'touch')\n                {\n                    this.notifyTarget(e, 'touchendoutside');\n                }\n                else if (e.pointerType === 'mouse' || e.pointerType === 'pen')\n                {\n                    const isRightButton = e.button === 2;\n\n                    this.notifyTarget(e, isRightButton ? 'rightupoutside' : 'mouseupoutside');\n                }\n\n                currentTarget = currentTarget.parent;\n            }\n\n            delete trackingData.pressTargetsByButton[from.button];\n\n            // currentTarget is the most specific ancestor holding both the pointerdown and pointerup\n            // targets. That is - it's our click target!\n            clickTarget = currentTarget;\n        }\n\n        // click!\n        if (clickTarget)\n        {\n            const clickEvent = this.clonePointerEvent(e, 'click');\n\n            clickEvent.target = clickTarget;\n            clickEvent.path = null;\n\n            if (!trackingData.clicksByButton[from.button])\n            {\n                trackingData.clicksByButton[from.button] = {\n                    clickCount: 0,\n                    target: clickEvent.target,\n                    timeStamp: now,\n                };\n            }\n\n            const clickHistory = trackingData.clicksByButton[from.button];\n\n            if (clickHistory.target === clickEvent.target\n                && now - clickHistory.timeStamp < 200)\n            {\n                ++clickHistory.clickCount;\n            }\n            else\n            {\n                clickHistory.clickCount = 1;\n            }\n\n            clickHistory.target = clickEvent.target;\n            clickHistory.timeStamp = now;\n\n            clickEvent.detail = clickHistory.clickCount;\n\n            if (clickEvent.pointerType === 'mouse')\n            {\n                const isRightButton = clickEvent.button === 2;\n\n                this.dispatchEvent(clickEvent, isRightButton ? 'rightclick' : 'click');\n            }\n            else if (clickEvent.pointerType === 'touch')\n            {\n                this.dispatchEvent(clickEvent, 'tap');\n            }\n\n            this.dispatchEvent(clickEvent, 'pointertap');\n\n            this.freeEvent(clickEvent);\n        }\n\n        this.freeEvent(e);\n    }\n\n    /**\n     * Maps the upstream `pointerupoutside` event to a downstream `pointerupoutside` event, bubbling from the original\n     * `pointerdown` target to `rootTarget`.\n     *\n     * (The most specific ancestor of the `pointerdown` event and the `pointerup` event must the {@code EventBoundary}'s\n     * root because the `pointerup` event occurred outside of the boundary.)\n     *\n     * `touchendoutside`, `mouseupoutside`, and `rightupoutside` events are fired as well for specific pointer\n     * types. The tracking data for the specific pointer is cleared of a `pressTarget`.\n     * @param from - The upstream `pointerupoutside` event.\n     */\n    protected mapPointerUpOutside(from: FederatedEvent): void\n    {\n        if (!(from instanceof FederatedPointerEvent))\n        {\n            console.warn('EventBoundary cannot map a non-pointer event as a pointer event');\n\n            return;\n        }\n\n        const trackingData = this.trackingData(from.pointerId);\n        const pressTarget = this.findMountedTarget(trackingData.pressTargetsByButton[from.button]);\n        const e = this.createPointerEvent(from);\n\n        if (pressTarget)\n        {\n            let currentTarget = pressTarget;\n\n            while (currentTarget)\n            {\n                e.currentTarget = currentTarget;\n\n                this.notifyTarget(e, 'pointerupoutside');\n\n                if (e.pointerType === 'touch')\n                {\n                    this.notifyTarget(e, 'touchendoutside');\n                }\n                else if (e.pointerType === 'mouse' || e.pointerType === 'pen')\n                {\n                    this.notifyTarget(e, e.button === 2 ? 'rightupoutside' : 'mouseupoutside');\n                }\n\n                currentTarget = currentTarget.parent;\n            }\n\n            delete trackingData.pressTargetsByButton[from.button];\n        }\n\n        this.freeEvent(e);\n    }\n\n    /**\n     * Maps the upstream `wheel` event to a downstream `wheel` event.\n     * @param from - The upstream `wheel` event.\n     */\n    protected mapWheel(from: FederatedEvent): void\n    {\n        if (!(from instanceof FederatedWheelEvent))\n        {\n            console.warn('EventBoundary cannot map a non-wheel event as a wheel event');\n\n            return;\n        }\n\n        const wheelEvent = this.createWheelEvent(from);\n\n        this.dispatchEvent(wheelEvent);\n        this.freeEvent(wheelEvent);\n    }\n\n    /**\n     * Finds the most specific event-target in the given propagation path that is still mounted in the scene graph.\n     *\n     * This is used to find the correct `pointerup` and `pointerout` target in the case that the original `pointerdown`\n     * or `pointerover` target was unmounted from the scene graph.\n     * @param propagationPath - The propagation path was valid in the past.\n     * @returns - The most specific event-target still mounted at the same location in the scene graph.\n     */\n    protected findMountedTarget(propagationPath: FederatedEventTarget[]): FederatedEventTarget\n    {\n        if (!propagationPath)\n        {\n            return null;\n        }\n\n        let currentTarget = propagationPath[0];\n\n        for (let i = 1; i < propagationPath.length; i++)\n        {\n            // Set currentTarget to the next target in the path only if it is still attached to the\n            // scene graph (i.e. parent still points to the expected ancestor).\n            if (propagationPath[i].parent === currentTarget)\n            {\n                currentTarget = propagationPath[i];\n            }\n            else\n            {\n                break;\n            }\n        }\n\n        return currentTarget;\n    }\n\n    /**\n     * Creates an event whose {@code originalEvent} is {@code from}, with an optional `type` and `target` override.\n     *\n     * The event is allocated using {@link PIXI.EventBoundary#allocateEvent this.allocateEvent}.\n     * @param from - The {@code originalEvent} for the returned event.\n     * @param [type=from.type] - The type of the returned event.\n     * @param target - The target of the returned event.\n     */\n    protected createPointerEvent(\n        from: FederatedPointerEvent,\n        type?: string,\n        target?: FederatedEventTarget\n    ): FederatedPointerEvent\n    {\n        const event = this.allocateEvent(FederatedPointerEvent);\n\n        this.copyPointerData(from, event);\n        this.copyMouseData(from, event);\n        this.copyData(from, event);\n\n        event.nativeEvent = from.nativeEvent;\n        event.originalEvent = from;\n        event.target = target ?? this.hitTest(event.global.x, event.global.y) as FederatedEventTarget;\n\n        if (typeof type === 'string')\n        {\n            event.type = type;\n        }\n\n        return event;\n    }\n\n    /**\n     * Creates a wheel event whose {@code originalEvent} is {@code from}.\n     *\n     * The event is allocated using {@link PIXI.EventBoundary#allocateEvent this.allocateEvent}.\n     * @param from - The upstream wheel event.\n     */\n    protected createWheelEvent(from: FederatedWheelEvent): FederatedWheelEvent\n    {\n        const event = this.allocateEvent(FederatedWheelEvent);\n\n        this.copyWheelData(from, event);\n        this.copyMouseData(from, event);\n        this.copyData(from, event);\n\n        event.nativeEvent = from.nativeEvent;\n        event.originalEvent = from;\n        event.target = this.hitTest(event.global.x, event.global.y);\n\n        return event;\n    }\n\n    /**\n     * Clones the event {@code from}, with an optional {@code type} override.\n     *\n     * The event is allocated using {@link PIXI.EventBoundary#allocateEvent this.allocateEvent}.\n     * @param from - The event to clone.\n     * @param [type=from.type] - The type of the returned event.\n     */\n    protected clonePointerEvent(from: FederatedPointerEvent, type?: string): FederatedPointerEvent\n    {\n        const event = this.allocateEvent(FederatedPointerEvent);\n\n        event.nativeEvent = from.nativeEvent;\n        event.originalEvent = from.originalEvent;\n\n        this.copyPointerData(from, event);\n        this.copyMouseData(from, event);\n        this.copyData(from, event);\n\n        // copy propagation path for perf\n        event.target = from.target;\n        event.path = from.composedPath().slice();\n        event.type = type ?? event.type;\n\n        return event;\n    }\n\n    /**\n     * Copies wheel {@link PIXI.FederatedWheelEvent} data from {@code from} into {@code to}.\n     *\n     * The following properties are copied:\n     * + deltaMode\n     * + deltaX\n     * + deltaY\n     * + deltaZ\n     * @param from\n     * @param to\n     */\n    protected copyWheelData(from: FederatedWheelEvent, to: FederatedWheelEvent): void\n    {\n        to.deltaMode = from.deltaMode;\n        to.deltaX = from.deltaX;\n        to.deltaY = from.deltaY;\n        to.deltaZ = from.deltaZ;\n    }\n\n    /**\n     * Copies pointer {@link PIXI.FederatedPointerEvent} data from {@code from} into {@code to}.\n     *\n     * The following properties are copied:\n     * + pointerId\n     * + width\n     * + height\n     * + isPrimary\n     * + pointerType\n     * + pressure\n     * + tangentialPressure\n     * + tiltX\n     * + tiltY\n     * @param from\n     * @param to\n     */\n    protected copyPointerData(from: FederatedEvent, to: FederatedEvent): void\n    {\n        if (!(from instanceof FederatedPointerEvent && to instanceof FederatedPointerEvent)) return;\n\n        to.pointerId = from.pointerId;\n        to.width = from.width;\n        to.height = from.height;\n        to.isPrimary = from.isPrimary;\n        to.pointerType = from.pointerType;\n        to.pressure = from.pressure;\n        to.tangentialPressure = from.tangentialPressure;\n        to.tiltX = from.tiltX;\n        to.tiltY = from.tiltY;\n        to.twist = from.twist;\n    }\n\n    /**\n     * Copies mouse {@link PIXI.FederatedMouseEvent} data from {@code from} to {@code to}.\n     *\n     * The following properties are copied:\n     * + altKey\n     * + button\n     * + buttons\n     * + clientX\n     * + clientY\n     * + metaKey\n     * + movementX\n     * + movementY\n     * + pageX\n     * + pageY\n     * + x\n     * + y\n     * + screen\n     * + global\n     * @param from\n     * @param to\n     */\n    protected copyMouseData(from: FederatedEvent, to: FederatedEvent): void\n    {\n        if (!(from instanceof FederatedMouseEvent && to instanceof FederatedMouseEvent)) return;\n\n        to.altKey = from.altKey;\n        to.button = from.button;\n        to.buttons = from.buttons;\n        to.client.copyFrom(from.client);\n        to.ctrlKey = from.ctrlKey;\n        to.metaKey = from.metaKey;\n        to.movement.copyFrom(from.movement);\n\n        to.screen.copyFrom(from.screen);\n        to.global.copyFrom(from.global);\n    }\n\n    /**\n     * Copies base {@link PIXI.FederatedEvent} data from {@code from} into {@code to}.\n     *\n     * The following properties are copied:\n     * + isTrusted\n     * + srcElement\n     * + timeStamp\n     * + type\n     * @param from - The event to copy data from.\n     * @param to - The event to copy data into.\n     */\n    protected copyData(from: FederatedEvent, to: FederatedEvent): void\n    {\n        to.isTrusted = from.isTrusted;\n        to.srcElement = from.srcElement;\n        to.timeStamp = performance.now();\n        to.type = from.type;\n        to.detail = from.detail;\n        to.view = from.view;\n        to.which = from.which;\n        to.layer.copyFrom(from.layer);\n        to.page.copyFrom(from.page);\n    }\n\n    /**\n     * @param id - The pointer ID.\n     * @returns The tracking data stored for the given pointer. If no data exists, a blank\n     *  state will be created.\n     */\n    protected trackingData(id: number): TrackingData\n    {\n        if (!this.mappingState.trackingData[id])\n        {\n            this.mappingState.trackingData[id] = {\n                pressTargetsByButton: {},\n                clicksByButton: {},\n                overTarget: null\n            };\n        }\n\n        return this.mappingState.trackingData[id];\n    }\n\n    /**\n     * Allocate a specific type of event from {@link PIXI.EventBoundary#eventPool this.eventPool}.\n     *\n     * This allocation is constructor-agnostic, as long as it only takes one argument - this event\n     * boundary.\n     * @param constructor - The event's constructor.\n     */\n    protected allocateEvent<T extends FederatedEvent>(\n        constructor: { new(boundary: EventBoundary): T }\n    ): T\n    {\n        if (!this.eventPool.has(constructor as any))\n        {\n            this.eventPool.set(constructor as any, []);\n        }\n\n        const event = this.eventPool.get(constructor as any).pop() as T\n            || new constructor(this);\n\n        event.eventPhase = event.NONE;\n        event.currentTarget = null;\n        event.path = null;\n        event.target = null;\n\n        return event;\n    }\n\n    /**\n     * Frees the event and puts it back into the event pool.\n     *\n     * It is illegal to reuse the event until it is allocated again, using `this.allocateEvent`.\n     *\n     * It is also advised that events not allocated from {@link PIXI.EventBoundary#allocateEvent this.allocateEvent}\n     * not be freed. This is because of the possibility that the same event is freed twice, which can cause\n     * it to be allocated twice & result in overwriting.\n     * @param event - The event to be freed.\n     * @throws Error if the event is managed by another event boundary.\n     */\n    protected freeEvent<T extends FederatedEvent>(event: T): void\n    {\n        if (event.manager !== this) throw new Error('It is illegal to free an event not managed by this EventBoundary!');\n\n        const constructor = event.constructor;\n\n        if (!this.eventPool.has(constructor as any))\n        {\n            this.eventPool.set(constructor as any, []);\n        }\n\n        this.eventPool.get(constructor as any).push(event);\n    }\n\n    /**\n     * Similar to {@link EventEmitter.emit}, except it stops if the `propagationImmediatelyStopped` flag\n     * is set on the event.\n     * @param e - The event to call each listener with.\n     * @param type - The event key.\n     */\n    private notifyListeners(e: FederatedEvent, type: string): void\n    {\n        const listeners = ((e.currentTarget as any)._events as EmitterListeners)[type];\n\n        if (!listeners) return;\n\n        if ('fn' in listeners)\n        {\n            if (listeners.once) e.currentTarget.removeListener(type, listeners.fn, undefined, true);\n            listeners.fn.call(listeners.context, e);\n        }\n        else\n        {\n            for (\n                let i = 0, j = listeners.length;\n                i < j && !e.propagationImmediatelyStopped;\n                i++)\n            {\n                if (listeners[i].once) e.currentTarget.removeListener(type, listeners[i].fn, undefined, true);\n                listeners[i].fn.call(listeners[i].context, e);\n            }\n        }\n    }\n}\n\n/**\n * Fired when a mouse button (usually a mouse left-button) is pressed on the display.\n * object. DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * These events are propagating from the {@link PIXI.EventSystem EventSystem} in pixijs/events.\n * @event PIXI.DisplayObject#mousedown\n * @param {PIXI.FederatedPointerEvent} event - The mousedown event.\n */\n\n/**\n * Capture phase equivalent of {@code mousedown}.\n *\n * These events are propagating from the {@link PIXI.EventSystem EventSystem} in pixijs/events.\n * @event PIXI.DisplayObject#mousedowncapture\n * @param {PIXI.FederatedPointerEvent} event - The capture phase mousedown.\n */\n\n/**\n * Fired when a pointer device secondary button (usually a mouse right-button) is pressed\n * on the display object. DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * These events are propagating from the {@link PIXI.EventSystem EventSystem} in pixijs/events.\n * @event PIXI.DisplayObject#rightdown\n * @param {PIXI.FederatedPointerEvent} event - Event\n */\n\n/**\n * Capture phase equivalent of {@code rightdown}.\n *\n * These events are propagating from the {@link PIXI.EventSystem EventSystem} in pixijs/events.\n * @event PIXI.DisplayObject#rightdowncapture\n * @param {PIXI.FederatedPointerEvent} event - The rightdowncapture event.\n */\n\n/**\n * Fired when a pointer device button (usually a mouse left-button) is released over the display\n * object. DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * These events are propagating from the {@link PIXI.EventSystem EventSystem} in pixijs/events.\n * @event PIXI.DisplayObject#mouseup\n * @param {PIXI.FederatedPointerEvent} event - Event\n */\n\n/**\n * Capture phase equivalent of {@code mouseup}.\n *\n * These events are propagating from the {@link PIXI.EventSystem EventSystem} in pixijs/events.\n * @event PIXI.DisplayObject#mouseupcapture\n * @param {PIXI.FederatedPointerEvent} event - Event\n */\n\n/**\n * Fired when a pointer device secondary button (usually a mouse right-button) is released\n * over the display object. DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * These events are propagating from the {@link PIXI.EventSystem EventSystem} in pixijs/events.\n * @event PIXI.DisplayObject#rightup\n * @param {PIXI.FederatedPointerEvent} event - Event\n */\n\n/**\n * Capture phase equivalent of {@code rightup}.\n *\n * These events are propagating from the {@link PIXI.EventSystem EventSystem} in pixijs/events.\n * @event PIXI.DisplayObject#rightupcapture\n * @param {PIXI.FederatedPointerEvent} event - Event\n */\n\n/**\n * Fired when a pointer device button (usually a mouse left-button) is pressed and released on\n * the display object. DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * A {@code click} event fires after the {@code pointerdown} and {@code pointerup} events, in that\n * order. If the mouse is moved over another DisplayObject after the {@code pointerdown} event, the\n * {@code click} event is fired on the most specific common ancestor of the two target DisplayObjects.\n *\n * The {@code detail} property of the event is the number of clicks that occurred within a 200ms\n * window of each other upto the current click. For example, it will be {@code 2} for a double click.\n *\n * These events are propagating from the {@link PIXI.EventSystem EventSystem} in pixijs/events.\n * @event PIXI.DisplayObject#click\n * @param {PIXI.FederatedPointerEvent} event - Event\n */\n\n/**\n * Capture phase equivalent of {@code click}.\n *\n * These events are propagating from the {@link PIXI.EventSystem EventSystem} in pixijs/events.\n * @event PIXI.DisplayObject#clickcapture\n * @param {PIXI.FederatedPointerEvent} event - Event\n */\n\n/**\n * Fired when a pointer device secondary button (usually a mouse right-button) is pressed\n * and released on the display object. DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * This event follows the semantics of {@code click}.\n *\n * These events are propagating from the {@link PIXI.EventSystem EventSystem} in pixijs/events.\n * @event PIXI.DisplayObject#rightclick\n * @param {PIXI.FederatedPointerEvent} event - Event\n */\n\n/**\n * Capture phase equivalent of {@code rightclick}.\n *\n * These events are propagating from the {@link PIXI.EventSystem EventSystem} in pixijs/events.\n * @event PIXI.DisplayObject#rightclickcapture\n * @param {PIXI.FederatedPointerEvent} event - Event\n */\n\n/**\n * Fired when a pointer device button (usually a mouse left-button) is released outside the\n * display object that initially registered a\n * [mousedown]{@link PIXI.DisplayObject#event:mousedown}.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * This event is specific to the Federated Events API. It does not have a capture phase, unlike most of the\n * other events. It only bubbles to the most specific ancestor of the targets of the corresponding {@code pointerdown}\n * and {@code pointerup} events, i.e. the target of the {@code click} event.\n *\n * These events are propagating from the {@link PIXI.EventSystem EventSystem} in pixijs/events.\n * @event PIXI.DisplayObject#mouseupoutside\n * @param {PIXI.FederatedPointerEvent} event - Event\n */\n\n/**\n * Capture phase equivalent of {@code mouseupoutside}.\n *\n * These events are propagating from the {@link PIXI.EventSystem EventSystem} in pixijs/events.\n * @event PIXI.DisplayObject#mouseupoutsidecapture\n * @param {PIXI.FederatedPointerEvent} event - Event\n */\n\n/**\n * Fired when a pointer device secondary button (usually a mouse right-button) is released\n * outside the display object that initially registered a\n * [rightdown]{@link PIXI.DisplayObject#event:rightdown}.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * These events are propagating from the {@link PIXI.EventSystem EventSystem} in pixijs/events.\n * @event PIXI.DisplayObject#rightupoutside\n * @param {PIXI.FederatedPointerEvent} event - Event\n */\n\n/**\n * Capture phase equivalent of {@code rightupoutside}.\n *\n * These events are propagating from the {@link PIXI.EventSystem EventSystem} in pixijs/events.\n * @event PIXI.DisplayObject#rightupoutsidecapture\n * @param {PIXI.FederatedPointerEvent} event - Event\n */\n\n/**\n * Fired when a pointer device (usually a mouse) is moved globally over the scene.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * These events are propagating from the {@link PIXI.EventSystem EventSystem} in pixijs/events.\n * @event PIXI.DisplayObject#globalmousemove\n * @param {PIXI.FederatedPointerEvent} event - Event\n */\n\n/**\n * Fired when a pointer device (usually a mouse) is moved while over the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * These events are propagating from the {@link PIXI.EventSystem EventSystem} in pixijs/events.\n * @event PIXI.DisplayObject#mousemove\n * @param {PIXI.FederatedPointerEvent} event - Event\n */\n\n/**\n * Capture phase equivalent of {@code mousemove}.\n *\n * These events are propagating from the {@link PIXI.EventSystem EventSystem} in pixijs/events.\n * @event PIXI.DisplayObject#mousemovecapture\n * @param {PIXI.FederatedPointerEvent} event - Event\n */\n\n/**\n * Fired when a pointer device (usually a mouse) is moved onto the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * These events are propagating from the {@link PIXI.EventSystem EventSystem} in pixijs/events.\n * @event PIXI.DisplayObject#mouseover\n * @param {PIXI.FederatedPointerEvent} event - Event\n */\n\n/**\n * Capture phase equivalent of {@code mouseover}.\n *\n * These events are propagating from the {@link PIXI.EventSystem EventSystem} in pixijs/events.\n * @event PIXI.DisplayObject#mouseovercapture\n * @param {PIXI.FederatedPointerEvent} event - Event\n */\n\n/**\n * Fired when the mouse pointer is moved over a DisplayObject and its descendant's hit testing boundaries.\n *\n * These events are propagating from the {@link PIXI.EventSystem EventSystem} in pixijs/events.\n * @event PIXI.DisplayObject#mouseenter\n * @param {PIXI.FederatedPointerEvent} event - Event\n */\n\n/**\n * Capture phase equivalent of {@code mouseenter}\n *\n * These events are propagating from the {@link PIXI.EventSystem EventSystem} in pixijs/events.\n * @event PIXI.DisplayObject#mouseentercapture\n * @param {PIXI.FederatedPointerEvent} event - Event\n */\n\n/**\n * Fired when a pointer device (usually a mouse) is moved off the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * This may be fired on a DisplayObject that was removed from the scene graph immediately after\n * a {@code mouseover} event.\n *\n * These events are propagating from the {@link PIXI.EventSystem EventSystem} in pixijs/events.\n * @event PIXI.DisplayObject#mouseout\n * @param {PIXI.FederatedPointerEvent} event - Event\n */\n\n/**\n * Capture phase equivalent of {@code mouseout}.\n *\n * These events are propagating from the {@link PIXI.EventSystem EventSystem} in pixijs/events.\n * @event PIXI.DisplayObject#mouseoutcapture\n * @param {PIXI.FederatedPointerEvent} event - Event\n */\n\n/**\n * Fired when the mouse pointer exits a DisplayObject and its descendants.\n *\n * These events are propagating from the {@link PIXI.EventSystem EventSystem} in pixijs/events.\n * @event PIXI.DisplayObject#mouseleave\n * @param {PIXI.FederatedPointerEvent} event\n */\n\n/**\n * Capture phase equivalent of {@code mouseleave}.\n *\n * These events are propagating from the {@link PIXI.EventSystem EventSystem} in pixijs/events.\n * @event PIXI.DisplayObject#mouseleavecapture\n * @param {PIXI.FederatedPointerEvent} event - Event\n */\n\n/**\n * Fired when a pointer device button is pressed on the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * These events are propagating from the {@link PIXI.EventSystem EventSystem} in pixijs/events.\n * @event PIXI.DisplayObject#pointerdown\n * @param {PIXI.FederatedPointerEvent} event - Event\n */\n\n/**\n * Capture phase equivalent of {@code pointerdown}.\n *\n * These events are propagating from the {@link PIXI.EventSystem EventSystem} in pixijs/events.\n * @event PIXI.DisplayObject#pointerdowncapture\n * @param {PIXI.FederatedPointerEvent} event - Event\n */\n\n/**\n * Fired when a pointer device button is released over the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * These events are propagating from the {@link PIXI.EventSystem EventSystem} in pixijs/events.\n * @event PIXI.DisplayObject#pointerup\n * @param {PIXI.FederatedPointerEvent} event - Event\n */\n\n/**\n * Capture phase equivalent of {@code pointerup}.\n *\n * These events are propagating from the {@link PIXI.EventSystem EventSystem} in pixijs/events.\n * @event PIXI.DisplayObject#pointerupcapture\n * @param {PIXI.FederatedPointerEvent} event - Event\n */\n\n/**\n * Fired when the operating system cancels a pointer event.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * These events are propagating from the {@link PIXI.EventSystem EventSystem} in pixijs/events.\n * @event PIXI.DisplayObject#pointercancel\n * @param {PIXI.FederatedPointerEvent} event - Event\n */\n\n/**\n * Capture phase equivalent of {@code pointercancel}.\n *\n * These events are propagating from the {@link PIXI.EventSystem EventSystem} in pixijs/events.\n * @event PIXI.DisplayObject#pointercancelcapture\n * @param {PIXI.FederatedPointerEvent} event - Event\n */\n\n/**\n * Fired when a pointer device button is pressed and released on the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * These events are propagating from the {@link PIXI.EventSystem EventSystem} in pixijs/events.\n * @event PIXI.DisplayObject#pointertap\n * @param {PIXI.FederatedPointerEvent} event - Event\n */\n\n/**\n * Capture phase equivalent of {@code pointertap}.\n *\n * These events are propagating from the {@link PIXI.EventSystem EventSystem} in pixijs/events.\n * @event PIXI.DisplayObject#pointertapcapture\n * @param {PIXI.FederatedPointerEvent} event - Event\n */\n\n/**\n * Fired when a pointer device button is released outside the display object that initially\n * registered a [pointerdown]{@link PIXI.DisplayObject#event:pointerdown}.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * This event is specific to the Federated Events API. It does not have a capture phase, unlike most of the\n * other events. It only bubbles to the most specific ancestor of the targets of the corresponding {@code pointerdown}\n * and {@code pointerup} events, i.e. the target of the {@code click} event.\n *\n * These events are propagating from the {@link PIXI.EventSystem EventSystem} in pixijs/events.\n * @event PIXI.DisplayObject#pointerupoutside\n * @param {PIXI.FederatedPointerEvent} event - Event\n */\n\n/**\n * Capture phase equivalent of {@code pointerupoutside}.\n *\n * These events are propagating from the {@link PIXI.EventSystem EventSystem} in pixijs/events.\n * @event PIXI.DisplayObject#pointerupoutsidecapture\n * @param {PIXI.FederatedPointerEvent} event - Event\n */\n\n/**\n * Fired when a pointer device is moved globally over the scene.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * These events are propagating from the {@link PIXI.EventSystem EventSystem} in pixijs/events.\n * @event PIXI.DisplayObject#globalpointermove\n * @param {PIXI.FederatedPointerEvent} event - Event\n */\n\n/**\n * Fired when a pointer device is moved while over the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * These events are propagating from the {@link PIXI.EventSystem EventSystem} in pixijs/events.\n * @event PIXI.DisplayObject#pointermove\n * @param {PIXI.FederatedPointerEvent} event - Event\n */\n\n/**\n * Capture phase equivalent of {@code pointermove}.\n *\n * These events are propagating from the {@link PIXI.EventSystem EventSystem} in pixijs/events.\n * @event PIXI.DisplayObject#pointermovecapture\n * @param {PIXI.FederatedPointerEvent} event - Event\n */\n\n/**\n * Fired when a pointer device is moved onto the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * These events are propagating from the {@link PIXI.EventSystem EventSystem} in pixijs/events.\n * @event PIXI.DisplayObject#pointerover\n * @param {PIXI.FederatedPointerEvent} event - Event\n */\n\n/**\n * Capture phase equivalent of {@code pointerover}.\n *\n * These events are propagating from the {@link PIXI.EventSystem EventSystem} in pixijs/events.\n * @event PIXI.DisplayObject#pointerovercapture\n * @param {PIXI.FederatedPointerEvent} event - Event\n */\n\n/**\n * Fired when the pointer is moved over a DisplayObject and its descendant's hit testing boundaries.\n *\n * These events are propagating from the {@link PIXI.EventSystem EventSystem} in pixijs/events.\n * @event PIXI.DisplayObject#pointerenter\n * @param {PIXI.FederatedPointerEvent} event - Event\n */\n\n/**\n * Capture phase equivalent of {@code pointerenter}\n *\n * These events are propagating from the {@link PIXI.EventSystem EventSystem} in pixijs/events.\n * @event PIXI.DisplayObject#pointerentercapture\n * @param {PIXI.FederatedPointerEvent} event - Event\n */\n\n/**\n * Fired when a pointer device is moved off the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * These events are propagating from the {@link PIXI.EventSystem EventSystem} in pixijs/events.\n * @event PIXI.DisplayObject#pointerout\n * @param {PIXI.FederatedPointerEvent} event - Event\n */\n\n/**\n * Capture phase equivalent of {@code pointerout}.\n *\n * These events are propagating from the {@link PIXI.EventSystem EventSystem} in pixijs/events.\n * @event PIXI.DisplayObject#pointeroutcapture\n * @param {PIXI.FederatedPointerEvent} event - Event\n */\n\n/**\n * Fired when the pointer leaves the hit testing boundaries of a DisplayObject and its descendants.\n *\n * This event notifies only the target and does not bubble.\n *\n * These events are propagating from the {@link PIXI.EventSystem EventSystem} in pixijs/events.\n * @event PIXI.DisplayObject#pointerleave\n * @param {PIXI.FederatedPointerEvent} event - The `pointerleave` event.\n */\n\n/**\n * Capture phase equivalent of {@code pointerleave}.\n *\n * These events are propagating from the {@link PIXI.EventSystem EventSystem} in pixijs/events.\n * @event PIXI.DisplayObject#pointerleavecapture\n * @param {PIXI.FederatedPointerEvent} event - Event\n */\n\n/**\n * Fired when a touch point is placed on the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * These events are propagating from the {@link PIXI.EventSystem EventSystem} in pixijs/events.\n * @event PIXI.DisplayObject#touchstart\n * @param {PIXI.FederatedPointerEvent} event - Event\n */\n\n/**\n * Capture phase equivalent of {@code touchstart}.\n *\n * These events are propagating from the {@link PIXI.EventSystem EventSystem} in pixijs/events.\n * @event PIXI.DisplayObject#touchstartcapture\n * @param {PIXI.FederatedPointerEvent} event - Event\n */\n\n/**\n * Fired when a touch point is removed from the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * These events are propagating from the {@link PIXI.EventSystem EventSystem} in pixijs/events.\n * @event PIXI.DisplayObject#touchend\n * @param {PIXI.FederatedPointerEvent} event - Event\n */\n\n/**\n * Capture phase equivalent of {@code touchend}.\n *\n * These events are propagating from the {@link PIXI.EventSystem EventSystem} in pixijs/events.\n * @event PIXI.DisplayObject#touchendcapture\n * @param {PIXI.FederatedPointerEvent} event - Event\n */\n\n/**\n * Fired when the operating system cancels a touch.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * These events are propagating from the {@link PIXI.EventSystem EventSystem} in pixijs/events.\n * @event PIXI.DisplayObject#touchcancel\n * @param {PIXI.FederatedPointerEvent} event - Event\n */\n\n/**\n * Capture phase equivalent of {@code touchcancel}.\n *\n * These events are propagating from the {@link PIXI.EventSystem EventSystem} in pixijs/events.\n * @event PIXI.DisplayObject#touchcancelcapture\n * @param {PIXI.FederatedPointerEvent} event - Event\n */\n\n/**\n * Fired when a touch point is placed and removed from the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * These events are propagating from the {@link PIXI.EventSystem EventSystem} in pixijs/events.\n * @event PIXI.DisplayObject#tap\n * @param {PIXI.FederatedPointerEvent} event - Event\n */\n\n/**\n * Capture phase equivalent of {@code tap}.\n *\n * These events are propagating from the {@link PIXI.EventSystem EventSystem} in pixijs/events.\n * @event PIXI.DisplayObject#tapcapture\n * @param {PIXI.FederatedPointerEvent} event - Event\n */\n\n/**\n * Fired when a touch point is removed outside of the display object that initially\n * registered a [touchstart]{@link PIXI.DisplayObject#event:touchstart}.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * These events are propagating from the {@link PIXI.EventSystem EventSystem} in pixijs/events.\n * @event PIXI.DisplayObject#touchendoutside\n * @param {PIXI.FederatedPointerEvent} event - Event\n */\n\n/**\n * Capture phase equivalent of {@code touchendoutside}.\n *\n * These events are propagating from the {@link PIXI.EventSystem EventSystem} in pixijs/events.\n * @event PIXI.DisplayObject#touchendoutsidecapture\n * @param {PIXI.FederatedPointerEvent} event - Event\n */\n\n/**\n * Fired when a touch point is moved globally over the scene.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * These events are propagating from the {@link PIXI.EventSystem EventSystem} in pixijs/events.\n * @event PIXI.DisplayObject#globaltouchmove\n * @param {PIXI.FederatedPointerEvent} event - Event\n */\n\n/**\n * Fired when a touch point is moved along the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * These events are propagating from the {@link PIXI.EventSystem EventSystem} in pixijs/events.\n * @event PIXI.DisplayObject#touchmove\n * @param {PIXI.FederatedPointerEvent} event - Event\n */\n\n/**\n * Capture phase equivalent of {@code touchmove}.\n *\n * These events are propagating from the {@link PIXI.EventSystem EventSystem} in pixijs/events.\n * @event PIXI.DisplayObject#touchmovecapture\n * @param {PIXI.FederatedPointerEvent} event - Event\n */\n\n/**\n * Fired when a the user scrolls with the mouse cursor over a DisplayObject.\n *\n * These events are propagating from the {@link PIXI.EventSystem EventSystem} in pixijs/events.\n * @event PIXI.DisplayObject#wheel\n * @type {PIXI.FederatedWheelEvent}\n */\n\n/**\n * Capture phase equivalent of {@code wheel}.\n *\n * These events are propagating from the {@link PIXI.EventSystem EventSystem} in pixijs/events.\n * @event PIXI.DisplayObject#wheelcapture\n * @type {PIXI.FederatedWheelEvent}\n */\n"],"names":[],"mappings":"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"}