{"version":3,"file":"ScrollBox.mjs","sources":["../src/ScrollBox.ts"],"sourcesContent":["import {\n    ColorSource,\n    Container,\n    DestroyOptions,\n    EventMode,\n    FederatedPointerEvent,\n    Graphics,\n    isMobile,\n    Optional,\n    Point,\n    PointData,\n    Size,\n    Ticker,\n} from 'pixi.js';\nimport { Signal } from 'typed-signals';\nimport { List } from './List';\nimport { Trackpad } from './utils/trackpad/Trackpad';\n\nimport type { ListOptions, ListType } from './List';\n\nexport type ScrollBoxOptions = {\n    width?: number;\n    height?: number;\n    background?: ColorSource;\n    type?: ListType;\n    radius?: number;\n    disableDynamicRendering?: boolean;\n    disableEasing?: boolean;\n    dragTrashHold?: number;\n    globalScroll?: boolean;\n    shiftScroll?: boolean;\n    proximityRange?: number;\n    proximityDebounce?: number;\n    disableProximityCheck?: boolean;\n} & Omit<ListOptions, 'children'>;\n\ntype ProximityEventData = {\n    item: Container;\n    index: number;\n    inRange: boolean;\n};\n\n/**\n * Scrollable view, for arranging lists of Pixi container-based elements.\n *\n * Items, that are out of the visible area, are not rendered by default.\n * This behavior can be changed by setting 'disableDynamicRendering' option to true.\n * @example\n * new ScrollBox({\n *     background: 0XFFFFFF,\n *     width: 200,\n *     height: 300,\n *     items: [\n *         new Graphics().drawRect(0, 0, 200, 50).fill(0x000000),\n *         new Graphics().drawRect(0, 0, 200, 50).fill(0x000000),\n *         new Graphics().drawRect(0, 0, 200, 50).fill(0x000000),\n *         new Graphics().drawRect(0, 0, 200, 50).fill(0x000000),\n *         new Graphics().drawRect(0, 0, 200, 50).fill(0x000000),\n *         new Graphics().drawRect(0, 0, 200, 50).fill(0x000000),\n *         new Graphics().drawRect(0, 0, 200, 50).fill(0x000000),\n *     ],\n * });\n */\n\nexport class ScrollBox extends Container\n{\n    protected background: Graphics | undefined;\n    protected borderMask: Graphics | undefined;\n    protected lastWidth: number = 0;\n    protected lastHeight: number = 0;\n    protected _width = 0;\n    protected _height = 0;\n    protected _dimensionChanged = false;\n\n    /**\n     * Arrange container, that holds all inner elements.\n     * Use this control inner arrange container size in case of bidirectional scroll type.\n     */\n    list: List | undefined;\n\n    protected _trackpad: Trackpad | undefined;\n    protected isDragging = 0;\n    protected interactiveStorage: {\n        item: Container;\n        eventMode: EventMode;\n    }[] = [];\n    protected visibleItems: Container[] = [];\n    protected pressedChild: Container | undefined;\n    protected ticker = Ticker.shared;\n    protected options: ScrollBoxOptions = {};\n    protected stopRenderHiddenItemsTimeout: NodeJS.Timeout | undefined;\n    protected onMouseScrollBinding = this.onMouseScroll.bind(this);\n    protected dragStarTouchPoint: PointData | undefined;\n    protected isOver = false;\n\n    protected proximityRange: number = 0;\n    protected proximityStatusCache: boolean[] = [];\n    protected lastScrollX: number | undefined;\n    protected lastScrollY: number | undefined;\n    protected proximityCheckFrameCounter = 0;\n    public onProximityChange = new Signal<(data: ProximityEventData) => void>();\n    public onScroll: Signal<(value: number | PointData) => void> = new Signal();\n\n    /**\n     * @param options\n     * @param {number} options.background - background color of the ScrollBox.\n     * @param {number} options.width - width of the ScrollBox.\n     * @param {number} options.height - height of the ScrollBox.\n     * @param {number} options.radius - radius of the ScrollBox and its masks corners.\n     * @param {number} options.elementsMargin - margin between elements.\n     * @param {number} options.vertPadding - vertical padding of the ScrollBox.\n     * @param {number} options.horPadding - horizontal padding of the ScrollBox.\n     * @param {number} options.padding - padding of the ScrollBox (same horizontal and vertical).\n     * @param {boolean} options.disableDynamicRendering - disables dynamic rendering of the ScrollBox,\n     * so even elements the are not visible will be rendered. Be careful with this options as it can impact performance.\n     * @param {boolean} [options.globalScroll=true] - if true, the ScrollBox will scroll even if the mouse is not over it.\n     * @param {boolean} [options.shiftScroll=false] - if true, the ScrollBox will only scroll horizontally if the shift key\n     * is pressed, and the type is set to 'horizontal'.\n     */\n    constructor(options?: ScrollBoxOptions)\n    {\n        super();\n\n        if (options)\n        {\n            this.init(options);\n        }\n\n        this.ticker.add(this.update, this);\n    }\n\n    /**\n     * Initiates ScrollBox.\n     * @param options\n     * @param {number} options.background - background color of the ScrollBox.\n     * @param {number} options.width - width of the ScrollBox.\n     * @param {number} options.height - height of the ScrollBox.\n     * @param {number} options.radius - radius of the ScrollBox and its masks corners.\n     * @param {number} options.elementsMargin - margin between elements.\n     * @param {number} options.vertPadding - vertical padding of the ScrollBox.\n     * @param {number} options.horPadding - horizontal padding of the ScrollBox.\n     * @param {number} options.padding - padding of the ScrollBox (same horizontal and vertical).\n     * @param {boolean} options.disableDynamicRendering - disables dynamic rendering of the ScrollBox,\n     * so even elements the are not visible will be rendered. Be careful with this options as it can impact performance.\n     * @param {boolean} [options.globalScroll=true] - if true, the ScrollBox will scroll even if the mouse is not over it.\n     * @param {boolean} [options.shiftScroll=false] - if true, the ScrollBox will only scroll horizontally if the shift key\n     */\n    init(options: ScrollBoxOptions)\n    {\n        this.options = options;\n        this.setBackground(options.background);\n\n        this._width = options.width ?? this.background?.width ?? 100;\n        this._height = options.height ?? this.background?.height ?? 100;\n\n        this.proximityRange = options.proximityRange ?? 0;\n\n        if (!this.list)\n        {\n            this.list = new List();\n\n            super.addChild(this.list);\n        }\n\n        this.list?.init({\n            type: options.type,\n            elementsMargin: options.elementsMargin,\n            padding: options.padding,\n            vertPadding: options.vertPadding,\n            horPadding: options.horPadding,\n            topPadding: options.topPadding,\n            bottomPadding: options.bottomPadding,\n            leftPadding: options.leftPadding,\n            rightPadding: options.rightPadding,\n            // For bidirectional type (including when options.type is null/undefined since List defaults to bidirectional),\n            // use ScrollBox width as maxWidth to enable multi-column layout. Other types get 0 to disable width constraints.\n            maxWidth: options.maxWidth || (options.type !== 'horizontal' && options.type !== 'vertical' ? this._width : 0),\n        });\n\n        if (options.items)\n        {\n            this.addItems(options.items);\n        }\n\n        if (this.hasBounds)\n        {\n            this.addMask();\n            this.makeScrollable();\n        }\n\n        if (this._trackpad)\n        {\n            this._trackpad.xAxis.value = 0;\n            this._trackpad.yAxis.value = 0;\n        }\n\n        this.options.globalScroll = options.globalScroll ?? true;\n        this.options.shiftScroll = options.shiftScroll ?? false;\n        this.resize();\n    }\n\n    protected get hasBounds(): boolean\n    {\n        return !!this._width || !!this._height;\n    }\n\n    /**\n     *  Adds array of items to a scrollable list.\n     * @param {Container[]} items - items to add.\n     */\n    addItems(items: Container[])\n    {\n        if (!items?.length) return;\n\n        items.forEach((item) => this.addItem(item));\n    }\n\n    /** Remove all items from a scrollable list. */\n    removeItems()\n    {\n        this.proximityStatusCache.length = 0;\n        this.list?.removeChildren();\n    }\n\n    /**\n     * Adds one or more items to a scrollable list.\n     * @param {Container} items - one or more items to add.\n     */\n    addItem<T extends Container[]>(...items: T): T[0]\n    {\n        if (items.length > 1)\n        {\n            items.forEach((item) => this.addItem(item));\n        }\n        else\n        {\n            const child = items[0];\n\n            if (!child.width || !child.height)\n            {\n                console.error('ScrollBox item should have size');\n            }\n\n            child.eventMode = 'static';\n\n            this.list?.addChild(child);\n            this.proximityStatusCache.push(false);\n\n            if (!this.options.disableDynamicRendering)\n            {\n                child.renderable = this.isItemVisible(child);\n            }\n        }\n\n        this.resize();\n\n        return items[0];\n    }\n\n    /**\n     * Removes an item from a scrollable list.\n     * @param {number} itemID - id of the item to remove.\n     */\n    removeItem(itemID: number)\n    {\n        this.list?.removeItem(itemID);\n        this.proximityStatusCache.splice(itemID, 1);\n        this.resize();\n    }\n\n    /**\n     * Checks if the item is visible or scrolled out of the visible part of the view.* Adds an item to a scrollable list.\n     * @param {Container} item - item to check.\n     * @param padding - proximity padding to consider the item visible.\n     */\n    isItemVisible(item: Container, padding = 0): boolean\n    {\n        let isVisible = false;\n        const list = this.list;\n\n        if (!list) return false;\n\n        if (this.isVertical || this.isBidirectional)\n        {\n            const posY = item.y + list.y;\n\n            if (posY + item.height >= -padding && posY <= (this.options.height ?? this._height) + padding)\n            {\n                isVisible = true;\n            }\n        }\n\n        if (this.isHorizontal || this.isBidirectional)\n        {\n            const posX = item.x + list.x;\n\n            if (posX + item.width >= -padding && posX <= (this.options.width ?? this._width) + padding)\n            {\n                isVisible = true;\n            }\n        }\n\n        return isVisible;\n    }\n\n    /**\n     * Returns all inner items in a list.\n     * @returns {Array<Container> | Array} - list of items.\n     */\n    get items(): Container[] | []\n    {\n        return this.list?.children ?? [];\n    }\n\n    /**\n     * Set ScrollBox background.\n     * @param {number | string} background - background color or texture.\n     */\n    setBackground(background?: ColorSource)\n    {\n        if (this.background)\n        {\n            this.removeChild(this.background);\n        }\n\n        this.options.background = background;\n\n        this.background = new Graphics();\n\n        this.addChildAt(this.background, 0);\n\n        this.resize();\n    }\n\n    protected addMask()\n    {\n        if (!this.borderMask)\n        {\n            this.borderMask = new Graphics();\n            super.addChild(this.borderMask);\n            this.mask = this.borderMask;\n        }\n\n        this.resize();\n    }\n\n    protected makeScrollable()\n    {\n        if (!this._trackpad)\n        {\n            this._trackpad = new Trackpad({\n                disableEasing: this.options.disableEasing,\n            });\n        }\n\n        this.on('pointerdown', (e: FederatedPointerEvent) =>\n        {\n            this.renderAllItems();\n\n            this.isDragging = 1;\n            this.dragStarTouchPoint = this.worldTransform.applyInverse(e.global);\n\n            if (this._trackpad && this.dragStarTouchPoint)\n            {\n                this._trackpad.pointerDown(new Point(this.dragStarTouchPoint.x, this.dragStarTouchPoint.y));\n            }\n\n            const listTouchPoint = this.list?.worldTransform.applyInverse(e.global);\n\n            if (listTouchPoint)\n            {\n                this.visibleItems.forEach((item) =>\n                {\n                    if (\n                        item.x < listTouchPoint.x\n                        && item.x + item.width > listTouchPoint.x\n                        && item.y < listTouchPoint.y\n                        && item.y + item.height > listTouchPoint.y\n                    )\n                    {\n                        this.pressedChild = item;\n                    }\n                });\n            }\n        });\n\n        this.on('pointerup', () =>\n        {\n            this.isDragging = 0;\n            this._trackpad?.pointerUp();\n            this.restoreItemsInteractivity();\n\n            this.pressedChild = undefined;\n\n            this.stopRenderHiddenItems();\n        });\n\n        this.on('pointerover', () =>\n        {\n            this.isOver = true;\n        });\n\n        this.on('pointerout', () =>\n        {\n            this.isOver = false;\n        });\n\n        this.on('pointerupoutside', () =>\n        {\n            this.isDragging = 0;\n            this._trackpad?.pointerUp();\n            this.restoreItemsInteractivity();\n\n            this.pressedChild = undefined;\n\n            this.stopRenderHiddenItems();\n        });\n\n        this.on('globalpointermove', (e: FederatedPointerEvent) =>\n        {\n            if (!this.isDragging) return;\n\n            const touchPoint = this.worldTransform.applyInverse(e.global);\n\n            if (this.dragStarTouchPoint)\n            {\n                const dragTrashHold = this.options.dragTrashHold ?? 10;\n\n                if (this.isHorizontal || this.isBidirectional)\n                {\n                    const xDist = touchPoint.x - this.dragStarTouchPoint.x;\n\n                    if (Math.abs(xDist) > dragTrashHold)\n                    {\n                        this.isDragging = 2;\n                    }\n                }\n\n                if (this.isVertical || this.isBidirectional)\n                {\n                    const yDist = touchPoint.y - this.dragStarTouchPoint.y;\n\n                    if (Math.abs(yDist) > dragTrashHold)\n                    {\n                        this.isDragging = 2;\n                    }\n                }\n            }\n\n            if (this.dragStarTouchPoint && this.isDragging !== 2) return;\n\n            this._trackpad?.pointerMove(new Point(touchPoint.x, touchPoint.y));\n\n            if (this.pressedChild)\n            {\n                this.revertClick(this.pressedChild);\n                this.pressedChild = undefined;\n            }\n\n            if (this.isBidirectional)\n            {\n                this.onScroll?.emit({ x: this.scrollX, y: this.scrollY });\n            }\n            else\n            {\n                this.onScroll?.emit(this.isVertical ? this.scrollY : this.scrollX);\n            }\n        });\n\n        document.addEventListener('wheel', this.onMouseScrollBinding, true);\n    }\n\n    protected setInteractive(interactive: boolean)\n    {\n        this.eventMode = interactive ? 'static' : 'auto';\n    }\n\n    protected get listHeight(): number\n    {\n        return (this.list?.height ?? 0) + (this.list?.topPadding ?? 0) + (this.list?.bottomPadding ?? 0);\n    }\n\n    protected get listWidth(): number\n    {\n        return (this.list?.width ?? 0) + (this.list?.leftPadding ?? 0) + (this.list?.rightPadding ?? 0);\n    }\n\n    /**\n     * Controls item positions and visibility.\n     * @param force\n     */\n    resize(force = false): void\n    {\n        if (!this.hasBounds) return;\n\n        this.renderAllItems();\n\n        if (\n            this.borderMask\n            && (force\n                || this._dimensionChanged\n                || this.lastWidth !== this.listWidth\n                || this.lastHeight !== this.listHeight)\n        )\n        {\n            if (!this.options.width)\n            {\n                this._width += this.listWidth;\n            }\n\n            if (!this.options.height)\n            {\n                this._height += this.listHeight;\n            }\n\n            this.borderMask\n                ?.clear()\n                .roundRect(0, 0, this._width, this._height, (this.options.radius ?? 0) | 0)\n                .fill(0xff00ff)\n                .stroke(0x0);\n\n            if (this.borderMask) this.borderMask.eventMode = 'none';\n\n            const color = this.options.background;\n\n            this.background\n                ?.clear()\n                .roundRect(0, 0, this._width, this._height, (this.options.radius ?? 0) | 0)\n                .fill({\n                    color: color ?? 0x000000,\n                    alpha: color ? 1 : 0.0000001, // if color is not set, set alpha to 0 to be able to drag by click on bg\n                });\n\n            if (this.isBidirectional)\n            {\n                this.setInteractive(this.listWidth > this._width || this.listHeight > this._height);\n            }\n            else if (this.isHorizontal)\n            {\n                this.setInteractive(this.listWidth > this._width);\n            }\n            else\n            {\n                this.setInteractive(this.listHeight > this._height);\n            }\n\n            this.lastWidth = this.listWidth;\n            this.lastHeight = this.listHeight;\n        }\n\n        if (this._trackpad && this.borderMask)\n        {\n            const maxWidth\n                = this.borderMask.width\n                - (this.list?.width ?? 0)\n                - (this.list?.leftPadding ?? 0)\n                - (this.list?.rightPadding ?? 0);\n\n            const maxHeight\n                = this.borderMask.height\n                - (this.list?.height ?? 0)\n                - (this.list?.topPadding ?? 0)\n                - (this.list?.bottomPadding ?? 0);\n\n            if (this.isBidirectional)\n            {\n                this._trackpad.yAxis.max = -Math.abs(maxHeight);\n                this._trackpad.xAxis.max = -Math.abs(maxWidth);\n            }\n            else if (this.isVertical)\n            {\n                this._trackpad.yAxis.max = -Math.abs(maxHeight);\n            }\n            else if (this.isHorizontal)\n            {\n                this._trackpad.xAxis.max = -Math.abs(maxWidth);\n            }\n        }\n\n        if (this._dimensionChanged)\n        {\n            this.list?.arrangeChildren();\n            // Since the scrolling adjustment can happen due to the resize,\n            // we shouldn't update the visible items immediately.\n            this.stopRenderHiddenItems();\n\n            this._dimensionChanged = false;\n        }\n        else\n        {\n            if (force) this.list?.arrangeChildren();\n            this.updateVisibleItems();\n        }\n\n        this.lastScrollX = undefined;\n        this.lastScrollY = undefined;\n    }\n\n    protected onMouseScroll(event: WheelEvent): void\n    {\n        if (!this.isOver && !this.options.globalScroll) return;\n\n        this.renderAllItems();\n\n        const shiftScroll = !!this.options.shiftScroll;\n        const scrollOnX = shiftScroll\n            ? typeof event.deltaX !== 'undefined' || typeof event.deltaY !== 'undefined'\n            : typeof event.deltaX !== 'undefined';\n        const scrollOnY = typeof event.deltaY !== 'undefined';\n\n        if ((this.isHorizontal || this.isBidirectional) && scrollOnX)\n        {\n            const delta = shiftScroll || this.isBidirectional ? event.deltaX : event.deltaY;\n            const targetPos = (this.list?.x ?? 0) - delta;\n\n            if (this.listWidth < this._width)\n            {\n                this._trackpad && (this._trackpad.xAxis.value = 0);\n            }\n            else\n            {\n                const min = this._width - this.listWidth;\n                const max = 0;\n\n                this._trackpad && (this._trackpad.xAxis.value = Math.min(max, Math.max(min, targetPos)));\n            }\n        }\n\n        if ((this.isVertical || this.isBidirectional) && scrollOnY)\n        {\n            const targetPos = (this.list?.y ?? 0) - event.deltaY;\n\n            if (this.listHeight < this._height)\n            {\n                this._trackpad && (this._trackpad.yAxis.value = 0);\n            }\n            else\n            {\n                const min = this._height - this.listHeight;\n                const max = 0;\n\n                this._trackpad && (this._trackpad.yAxis.value = Math.min(max, Math.max(min, targetPos)));\n            }\n        }\n\n        if (this.isBidirectional && (scrollOnX || scrollOnY))\n        {\n            this.onScroll?.emit({ x: this._trackpad?.xAxis.value ?? 0, y: this._trackpad?.yAxis.value ?? 0 });\n        }\n        else if (this.isHorizontal && scrollOnX)\n        {\n            this.onScroll?.emit(this._trackpad?.xAxis.value ?? 0);\n        }\n        else if (this.isVertical && scrollOnY)\n        {\n            this.onScroll?.emit(this._trackpad?.yAxis.value ?? 0);\n        }\n        this.stopRenderHiddenItems();\n    }\n\n    /** Makes it scroll down to the last element. */\n    scrollBottom()\n    {\n        if (!this.interactive)\n        {\n            this.scrollTop();\n        }\n        else\n        {\n            this.scrollTo((this.list?.children.length ?? 1) - 1);\n        }\n    }\n\n    /** Makes it scroll up to the first element. */\n    scrollTop()\n    {\n        this.renderAllItems();\n\n        if (this._trackpad)\n        {\n            this._trackpad.xAxis.value = 0;\n            this._trackpad.yAxis.value = 0;\n        }\n\n        this.stopRenderHiddenItems();\n    }\n\n    protected renderAllItems()\n    {\n        clearTimeout(this.stopRenderHiddenItemsTimeout);\n        this.stopRenderHiddenItemsTimeout = undefined;\n\n        if (this.options.disableDynamicRendering)\n        {\n            return;\n        }\n\n        this.items.forEach((child) =>\n        {\n            child.renderable = true;\n        });\n    }\n\n    protected stopRenderHiddenItems()\n    {\n        if (this.options.disableDynamicRendering)\n        {\n            return;\n        }\n\n        if (this.stopRenderHiddenItemsTimeout)\n        {\n            clearTimeout(this.stopRenderHiddenItemsTimeout);\n            this.stopRenderHiddenItemsTimeout = undefined;\n        }\n\n        this.stopRenderHiddenItemsTimeout = setTimeout(() => this.updateVisibleItems(), 2000);\n    }\n\n    protected updateVisibleItems()\n    {\n        this.visibleItems.length = 0;\n\n        this.items.forEach((child) =>\n        {\n            child.renderable = this.isItemVisible(child);\n            this.visibleItems.push(child);\n        });\n    }\n\n    /**\n     * Scrolls to the element with the given ID.\n     * @param elementID\n     */\n    scrollTo(elementID: number)\n    {\n        if (!this.interactive || !this._trackpad || !this.list)\n        {\n            return;\n        }\n\n        const target = this.list.children[elementID];\n\n        if (!target)\n        {\n            return;\n        }\n\n        this.renderAllItems();\n\n        this._trackpad.xAxis.value\n            = this.isHorizontal || this.isBidirectional\n                ? this._width - target.x - target.width - this.list.rightPadding\n                : 0;\n\n        this._trackpad.yAxis.value\n            = this.isVertical || this.isBidirectional\n                ? this._height - target.y - target.height - this.list.bottomPadding\n                : 0;\n\n        this.stopRenderHiddenItems();\n    }\n\n    /**\n     * Scrolls to the given position.\n     * @param position - x and y position object.\n     * @param position.x - x position.\n     * @param position.y - y position.\n     */\n    scrollToPosition({ x, y }: Partial<PointData>)\n    {\n        if (x === undefined && y === undefined) return;\n        this.renderAllItems();\n        if (x !== undefined) this.scrollX = -x;\n        if (y !== undefined) this.scrollY = -y;\n        this.stopRenderHiddenItems();\n    }\n\n    /** Gets component height. */\n    override get height(): number\n    {\n        return this._height;\n    }\n\n    override set height(value: number)\n    {\n        this._height = value;\n        this._dimensionChanged = true;\n        this.resize();\n        this.scrollTop();\n    }\n\n    /** Gets component width. */\n    override get width(): number\n    {\n        return this._width;\n    }\n\n    override set width(value: number)\n    {\n        this._width = value;\n        this._dimensionChanged = true;\n        this.resize();\n        this.scrollTop();\n    }\n\n    override setSize(value: number | Optional<Size, 'height'>, height?: number): void\n    {\n        if (typeof value === 'object')\n        {\n            height = value.height ?? value.width;\n            value = value.width;\n        }\n        else\n        {\n            height = height ?? value;\n        }\n\n        this._width = value;\n        this._height = height;\n        this._dimensionChanged = true;\n        this.resize();\n        this.scrollTop();\n    }\n\n    override getSize(out?: Size): Size\n    {\n        out = out || { width: 0, height: 0 };\n        out.width = this._width;\n        out.height = this._height;\n\n        return out;\n    }\n\n    /** Gets the current raw scroll position on the x-axis (Negated Value). */\n    get scrollX(): number\n    {\n        return this._trackpad?.xAxis.value ?? 0;\n    }\n\n    /** Sets the current raw scroll position on the x-axis (Negated Value). */\n    set scrollX(value: number)\n    {\n        if (this._trackpad) this._trackpad.xAxis.value = value;\n    }\n\n    /** Gets the current raw scroll position on the y-axis (Negated Value). */\n    get scrollY(): number\n    {\n        return this._trackpad?.yAxis.value ?? 0;\n    }\n\n    /** Sets the current raw scroll position on the y-axis (Negated Value). */\n    set scrollY(value: number)\n    {\n        if (this._trackpad) this._trackpad.yAxis.value = value;\n    }\n\n    protected update()\n    {\n        if (!this.list || !this._trackpad) return;\n\n        this._trackpad.update();\n\n        if (this.isHorizontal || this.isBidirectional)\n        {\n            if (this.list.x !== this._trackpad.x)\n            {\n                this.list.x = this._trackpad.x;\n            }\n        }\n\n        if (this.isVertical || this.isBidirectional)\n        {\n            if (this.list.y !== this._trackpad.y)\n            {\n                this.list.y = this._trackpad.y;\n            }\n        }\n\n        if (\n            !this.options.disableProximityCheck\n            && (this._trackpad.x !== this.lastScrollX || this._trackpad.y !== this.lastScrollY)\n        )\n        {\n            this.proximityCheckFrameCounter++;\n            if (this.proximityCheckFrameCounter >= (this.options.proximityDebounce ?? 10))\n            {\n                this.items.forEach((item, index) =>\n                {\n                    const inRange = this.isItemVisible(item, this.proximityRange);\n                    const wasInRange = this.proximityStatusCache[index];\n\n                    if (inRange !== wasInRange)\n                    {\n                        this.proximityStatusCache[index] = inRange;\n                        this.onProximityChange.emit({ item, index, inRange });\n                    }\n                });\n                this.lastScrollX = this._trackpad.x;\n                this.lastScrollY = this._trackpad.y;\n                this.proximityCheckFrameCounter = 0;\n            }\n        }\n    }\n\n    /**\n     * Destroys the component.\n     * @param {boolean | DestroyOptions} [options] - Options parameter.\n     * A boolean will act as if all options have been set to that value\n     */\n    override destroy(options?: DestroyOptions | boolean)\n    {\n        this.ticker.remove(this.update, this);\n\n        document.removeEventListener('wheel', this.onMouseScrollBinding, true);\n\n        this.background?.destroy();\n        this.list?.destroy();\n\n        super.destroy(options);\n    }\n\n    protected restoreItemsInteractivity()\n    {\n        this.interactiveStorage.forEach((element) =>\n        {\n            element.item.eventMode = element.eventMode;\n        });\n\n        this.interactiveStorage.length = 0;\n    }\n\n    protected revertClick(item: Container)\n    {\n        if (item.eventMode !== 'auto')\n        {\n            if (isMobile.any)\n            {\n                item.emit('pointerupoutside', { target: item } as FederatedPointerEvent);\n            }\n            else\n            {\n                item.emit('mouseupoutside', { target: item } as FederatedPointerEvent);\n            }\n\n            this.interactiveStorage.push({\n                item,\n                eventMode: item.eventMode ?? 'auto',\n            });\n\n            item.eventMode = 'auto';\n        }\n\n        // need to disable click for all children too\n        if (item instanceof Container && item.children)\n        {\n            item.children.forEach((child) => this.revertClick(child));\n        }\n    }\n\n    get scrollHeight(): number\n    {\n        return this.list?.height ?? 0;\n    }\n\n    get scrollWidth(): number\n    {\n        return this.list?.width ?? 0;\n    }\n\n    protected get isVertical(): boolean\n    {\n        const type = this.options.type ?? 'vertical';\n\n        return type === 'vertical';\n    }\n\n    protected get isHorizontal(): boolean\n    {\n        return this.options.type === 'horizontal';\n    }\n\n    protected get isBidirectional(): boolean\n    {\n        return this.options.type === 'bidirectional';\n    }\n}\n"],"names":[],"mappings":"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"}