{"version":3,"file":"Trackpad.mjs","sources":["../../../src/components/trackpad/Trackpad.ts"],"sourcesContent":["import { Point, Rectangle } from 'pixi.js';\nimport { type ConstrainEase, SlidingNumber } from './SlidingNumber';\n\n/**\n * Configuration options for the Trackpad component\n */\nexport interface TrackpadOptions {\n    /** Custom easing function for x-axis constraint bouncing */\n    xEase?: ConstrainEase;\n    /** Custom easing function for y-axis constraint bouncing */\n    yEase?: ConstrainEase;\n    /**\n     * Percentage of overflow allowed when dragging beyond x-axis constraints\n     * Setting this value to a negative number disables x-axis scrolling entirely.\n     */\n    xConstrainPercent?: number;\n    /**\n     * Percentage of overflow allowed when dragging beyond y-axis constraints\n     * Setting this value to a negative number disables y-axis scrolling entirely.\n     */\n    yConstrainPercent?: number;\n    /** Maximum speed for both axes. Default: 400 */\n    maxSpeed?: number;\n    /** Whether to constrain movement within bounds. Default: true */\n    constrain?: boolean;\n    /** Disable easing when releasing the trackpad. Default: false */\n    disableEasing?: boolean;\n}\n\n/**\n * Trackpad provides touch/mouse-based 2D scrolling with momentum and constraints.\n * Useful for implementing scrollable containers, map panning, or any 2D draggable interface.\n *\n * Features:\n * - Separate x and y axis scrolling with momentum\n * - Constrained movement within bounds\n * - Customizable easing and overflow\n * - Frame-based updates for smooth animation\n *\n * @example\n * ```typescript\n * // Create a trackpad for a scrollable container\n * const trackpad = new Trackpad({\n *     constrain: true,\n *     maxSpeed: 400,\n *     xConstrainPercent: 0.2,\n *     yConstrainPercent: 0.2\n * });\n *\n * // Set the visible frame size\n * trackpad.resize(800, 600);\n *\n * // Set the content bounds\n * trackpad.setBounds(0, 1200, 0, 900);\n *\n * // Handle pointer events\n * container.on('pointerdown', (e) => trackpad.pointerDown(e.global));\n * container.on('pointermove', (e) => trackpad.pointerMove(e.global));\n * container.on('pointerup', () => trackpad.pointerUp());\n *\n * // Update loop\n * ticker.add(() => {\n *     trackpad.update();\n *     content.x = trackpad.x;\n *     content.y = trackpad.y;\n * });\n * ```\n */\nexport class Trackpad {\n    /** Manages scrolling behavior for the x-axis */\n    public xAxis: SlidingNumber;\n    /** Manages scrolling behavior for the y-axis */\n    public yAxis: SlidingNumber;\n\n    protected _isDown!: boolean;\n    protected _globalPosition: Point;\n    protected _frame: Rectangle;\n    protected _bounds: Rectangle;\n    protected _dirty!: boolean;\n    protected disableEasing = false;\n\n    constructor(options: TrackpadOptions) {\n        this.xAxis = new SlidingNumber({\n            ease: options.xEase,\n            maxSpeed: options.maxSpeed,\n            constrain: options.constrain,\n            constrainPercent: options.xConstrainPercent,\n        });\n\n        this.yAxis = new SlidingNumber({\n            ease: options.yEase,\n            maxSpeed: options.maxSpeed,\n            constrain: options.constrain,\n            constrainPercent: options.yConstrainPercent,\n        });\n\n        this.disableEasing = options.disableEasing ?? false;\n\n        this._frame = new Rectangle();\n\n        this._bounds = new Rectangle();\n        this._globalPosition = new Point();\n    }\n\n    /**\n     * Handles pointer down events to start tracking\n     * @param pos Global position of the pointer\n     */\n    public pointerDown(pos: Point): void {\n        this._globalPosition = pos;\n        this.xAxis.grab(pos.x);\n        this.yAxis.grab(pos.y);\n        this._isDown = true;\n    }\n\n    /**\n     * Handles pointer up events to end tracking\n     */\n    public pointerUp(): void {\n        this._isDown = false;\n    }\n\n    /**\n     * Handles pointer move events to update tracking\n     * @param pos Global position of the pointer\n     */\n    public pointerMove(pos: Point): void {\n        this._globalPosition = pos;\n    }\n\n    /**\n     * Updates the trackpad position and momentum.\n     * Should be called each frame to maintain smooth scrolling.\n     */\n    update(): void {\n        if (this._dirty) {\n            this._dirty = false;\n\n            this.xAxis.min = this._bounds.left;\n            this.xAxis.min = this._bounds.right - this._frame.width;\n\n            this.xAxis.min = this._bounds.top;\n            this.xAxis.min = this._bounds.bottom - this._frame.height;\n        }\n\n        if (this._isDown) {\n            this.xAxis.hold(this._globalPosition.x);\n            this.yAxis.hold(this._globalPosition.y);\n        } else {\n            this.xAxis.slide(this.disableEasing);\n            this.yAxis.slide(this.disableEasing);\n        }\n    }\n\n    /**\n     * Sets the size of the visible frame/viewport\n     * @param w Width of the frame in pixels\n     * @param h Height of the frame in pixels\n     */\n    resize(w: number, h: number): void {\n        this._frame.x = 0;\n        this._frame.width = w;\n\n        this._frame.y = 0;\n        this._frame.height = h;\n\n        this._dirty = true;\n    }\n\n    /**\n     * Sets the bounds for content scrolling\n     * @param minX Minimum x coordinate (left)\n     * @param maxX Maximum x coordinate (right)\n     * @param minY Minimum y coordinate (top)\n     * @param maxY Maximum y coordinate (bottom)\n     */\n    setBounds(minX: number, maxX: number, minY: number, maxY: number): void {\n        this._bounds.x = minX;\n        this._bounds.width = maxX - minX;\n        this._bounds.y = minY;\n        this._bounds.height = maxY - minY;\n\n        this._dirty = true;\n    }\n\n    /**\n     * Gets or sets the current x position of the trackpad.\n     * This is a shorthand for accessing the xAxis value.\n     */\n    get x(): number {\n        return this.xAxis.value;\n    }\n    set x(value: number) {\n        this.xAxis.value = value;\n    }\n\n    /**\n     * Gets or sets the current y position of the trackpad.\n     * This is a shorthand for accessing the yAxis value.\n     */\n    get y(): number {\n        return this.yAxis.value;\n    }\n    set y(value: number) {\n        this.yAxis.value = value;\n    }\n}\n"],"names":[],"mappings":";;;;;AAoEO,MAAM,SAAS;AAAA,EAalB,YAAY,SAA0B;AAX/B;AAAA;AAEA;AAAA;AAEG;AACA;AACA;AACA;AACA;AACA,yCAAgB;AAGjB,SAAA,QAAQ,IAAI,cAAc;AAAA,MAC3B,MAAM,QAAQ;AAAA,MACd,UAAU,QAAQ;AAAA,MAClB,WAAW,QAAQ;AAAA,MACnB,kBAAkB,QAAQ;AAAA,IAAA,CAC7B;AAEI,SAAA,QAAQ,IAAI,cAAc;AAAA,MAC3B,MAAM,QAAQ;AAAA,MACd,UAAU,QAAQ;AAAA,MAClB,WAAW,QAAQ;AAAA,MACnB,kBAAkB,QAAQ;AAAA,IAAA,CAC7B;AAEI,SAAA,gBAAgB,QAAQ,iBAAiB;AAEzC,SAAA,SAAS,IAAI,UAAU;AAEvB,SAAA,UAAU,IAAI,UAAU;AACxB,SAAA,kBAAkB,IAAI,MAAM;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO9B,YAAY,KAAkB;AACjC,SAAK,kBAAkB;AAClB,SAAA,MAAM,KAAK,IAAI,CAAC;AAChB,SAAA,MAAM,KAAK,IAAI,CAAC;AACrB,SAAK,UAAU;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAMZ,YAAkB;AACrB,SAAK,UAAU;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOZ,YAAY,KAAkB;AACjC,SAAK,kBAAkB;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO3B,SAAe;AACX,QAAI,KAAK,QAAQ;AACb,WAAK,SAAS;AAET,WAAA,MAAM,MAAM,KAAK,QAAQ;AAC9B,WAAK,MAAM,MAAM,KAAK,QAAQ,QAAQ,KAAK,OAAO;AAE7C,WAAA,MAAM,MAAM,KAAK,QAAQ;AAC9B,WAAK,MAAM,MAAM,KAAK,QAAQ,SAAS,KAAK,OAAO;AAAA,IAAA;AAGvD,QAAI,KAAK,SAAS;AACd,WAAK,MAAM,KAAK,KAAK,gBAAgB,CAAC;AACtC,WAAK,MAAM,KAAK,KAAK,gBAAgB,CAAC;AAAA,IAAA,OACnC;AACE,WAAA,MAAM,MAAM,KAAK,aAAa;AAC9B,WAAA,MAAM,MAAM,KAAK,aAAa;AAAA,IAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQJ,OAAO,GAAW,GAAiB;AAC/B,SAAK,OAAO,IAAI;AAChB,SAAK,OAAO,QAAQ;AAEpB,SAAK,OAAO,IAAI;AAChB,SAAK,OAAO,SAAS;AAErB,SAAK,SAAS;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUlB,UAAU,MAAc,MAAc,MAAc,MAAoB;AACpE,SAAK,QAAQ,IAAI;AACZ,SAAA,QAAQ,QAAQ,OAAO;AAC5B,SAAK,QAAQ,IAAI;AACZ,SAAA,QAAQ,SAAS,OAAO;AAE7B,SAAK,SAAS;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOlB,IAAI,IAAY;AACZ,WAAO,KAAK,MAAM;AAAA,EAAA;AAAA,EAEtB,IAAI,EAAE,OAAe;AACjB,SAAK,MAAM,QAAQ;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOvB,IAAI,IAAY;AACZ,WAAO,KAAK,MAAM;AAAA,EAAA;AAAA,EAEtB,IAAI,EAAE,OAAe;AACjB,SAAK,MAAM,QAAQ;AAAA,EAAA;AAE3B;"}