{"version":3,"file":"index.mjs","sources":["../src/constants.ts","../src/utils.ts","../src/Super.ts","../src/Joystick.ts","../src/Collection.ts","../src/index.ts","../src/Factory.ts"],"sourcesContent":["import type { EventType, InteractType } from './types';\n\n/** Defines the different positioning modes available for the joystick */\nexport const MODES = {\n    /** The joystick disappears on release. */\n    dynamic: 'dynamic',\n    /** The joystick stays in place after first touch, and disappears if the subsequent touch is too far. */\n    semi: 'semi',\n    /** The joystick stays at its initial position. */\n    static: 'static',\n} as const;\n\nconst IS_TOUCH = typeof window !== 'undefined' && 'ontouchstart' in window;\nconst IS_POINTER = typeof window !== 'undefined' && !!window.PointerEvent;\n\ntype Bindings = Record<EventType, string>;\nconst EVENTS_TO_BIND: Record<InteractType, Bindings> = {\n    touch: {\n        start: 'touchstart',\n        move: 'touchmove',\n        end: 'touchend, touchcancel',\n        pressure: 'webkitmouseforcechanged',\n    },\n    mouse: {\n        start: 'mousedown',\n        move: 'mousemove',\n        end: 'mouseup, mouseleave',\n        pressure: 'webkitmouseforcechanged',\n    },\n    pointer: {\n        start: 'pointerdown',\n        move: 'pointermove',\n        end: 'pointerup, pointercancel, pointerleave',\n        pressure: 'webkitmouseforcechanged',\n    },\n};\n\nlet primaryBind: Bindings;\nlet secondaryBind: Bindings | undefined;\n\n// Determine which interface to bind.\n// Pointer is the priority because it's the most modern and easy to use.\nif (IS_POINTER) {\n    primaryBind = EVENTS_TO_BIND.pointer;\n} else if (IS_TOUCH) {\n    // Some touch interfaces support both mouse and touch,\n    // so we need to bind both.\n    primaryBind = EVENTS_TO_BIND.touch;\n    secondaryBind = EVENTS_TO_BIND.mouse;\n} else {\n    // Default to mouse.\n    primaryBind = EVENTS_TO_BIND.mouse;\n}\n\n// What will we bind on the dom elements?\nexport const PRIMARY_BIND = primaryBind;\nexport const SECONDARY_BIND = secondaryBind;\n\n// Some static math constants.\nexport const ANGLE_45 = Math.PI / 4;\nexport const ANGLE_90 = Math.PI / 2;\n","import type {\n    AnyPosition,\n    Coordinates,\n    DomEvent,\n    Identifier,\n    ProcessedEvent,\n    SupportedElement,\n    SupportedEvent,\n    SupportedEventHandler,\n} from './types';\n\n/**\n * Calculate the distance between two points.\n * @param {Coordinates} p1 - The first point.\n * @param {Coordinates} p2 - The second point.\n * @returns {number} The distance between the two points.\n */\nexport const distance = (p1: Coordinates, p2: Coordinates): number => {\n    const dx = p2.x - p1.x;\n    const dy = p2.y - p1.y;\n\n    return Math.sqrt(dx * dx + dy * dy);\n};\n\n/**\n * Calculate the angle formed by a segment of two points, in degrees.\n * @param {Coordinates} p1 - The first point.\n * @param {Coordinates} p2 - The second point.\n * @returns {number} The angle between the two points in degrees.\n */\nexport const angle = (p1: Coordinates, p2: Coordinates): number => {\n    const dx = p2.x - p1.x;\n    const dy = p2.y - p1.y;\n\n    return degrees(Math.atan2(dy, dx));\n};\n\n/**\n * Find the coordinates of a point given a distance and angle from another point.\n * @param {Coordinates} p - The starting point.\n * @param {number} d - The distance from the starting point.\n * @param {number} a - The angle from the starting point in degrees.\n * @returns {Coordinates} The coordinates of the new point.\n */\nexport const findCoord = (p: Coordinates, d: number, a: number): Coordinates => {\n    const aInRad = radians(a);\n    return {\n        x: p.x - d * Math.cos(aInRad),\n        y: p.y - d * Math.sin(aInRad),\n    };\n};\n\n/**\n * Convert degrees to radians.\n * @param {number} a - The angle in degrees.\n * @returns {number} The angle in radians.\n */\nexport const radians = (a: number): number => {\n    return a * (Math.PI / 180);\n};\n\n/**\n * Convert radians to degrees.\n * @param {number} a - The angle in radians.\n * @returns {number} The angle in degrees.\n */\nexport const degrees = (a: number): number => {\n    return a * (180 / Math.PI);\n};\n\nconst timers = new Map<() => void, number>();\n/**\n * Throttle a function to be called at most once every 100 milliseconds.\n * @param {() => void} cb - The function to throttle.\n */\nexport const throttle = (cb: () => void): void => {\n    if (timers.has(cb)) {\n        clearTimeout(timers.get(cb));\n    }\n    timers.set(cb, setTimeout(cb, 100) as unknown as number);\n};\n\n/**\n * Bind an event listener to an element.\n * @param {SupportedElement} el - The element to bind the event listener to.\n * @param {string} arg - The event type(s) to bind the event listener to.\n * @param {SupportedEventHandler} handler - The event listener to bind.\n */\nexport const bindEvt = (\n    el: SupportedElement,\n    arg: string,\n    handler: SupportedEventHandler,\n): void => {\n    const types = arg.split(/[ ,]+/g);\n    for (let i = 0; i < types.length; i += 1) {\n        el.addEventListener(types[i], handler as EventListenerOrEventListenerObject, false);\n    }\n};\n\n/**\n * Unbind an event listener from an element.\n * @param {SupportedElement} el - The element to unbind the event listener from.\n * @param {string} arg - The event type(s) to unbind the event listener from.\n * @param {SupportedEventHandler} handler - The event listener to unbind.\n */\nexport const unbindEvt = (\n    el: SupportedElement,\n    arg: string,\n    handler: SupportedEventHandler,\n): void => {\n    const types = arg.split(/[ ,]+/g);\n    for (let i = 0; i < types.length; i += 1) {\n        el.removeEventListener(types[i], handler as EventListenerOrEventListenerObject);\n    }\n};\n\n/**\n * Extract pressure/force value from a processed event.\n * Handles Touch (force), Pointer (pressure), Safari trackpad (webkitForce),\n * and falls back to binary mouse-button detection.\n */\nexport const getPressureFromEvt = (evt: ProcessedEvent): number => {\n    // Compute the pressure data.\n    return 'force' in evt // Pressure on Touch.\n        ? evt.force\n        : 'pressure' in evt // Pressure on Pointers.\n          ? evt.pressure\n          : 'webkitForce' in evt // Pressure on trackpads, max is 3, only in Safari.\n            ? (evt.webkitForce as number) / 3\n            : 'buttons' in evt // Id of the mouse button pressed. 0 is none, 1 is left, 2 is right, ...\n              ? evt.buttons !== 0\n                  ? 1\n                  : 0\n              : 0;\n};\n\n/**\n * Normalize a single interaction event (touch, pointer, or mouse) into\n * a unified DomEvent with identifier, position, pressure, and type.\n */\nexport const processEvent = (evt: SupportedEvent, processedEvt: ProcessedEvent): DomEvent => {\n    // Compute identifier of the event.\n    // It's especially important for touches,\n    // to track the correct touch in a multitouch interaction.\n    const identifier: Identifier = (\n        'identifier' in processedEvt\n            ? processedEvt.identifier\n            : 'pointerId' in processedEvt\n              ? processedEvt.pointerId\n              : // Using 1 as identifier, because pointerId starts at 1.\n                // Using 0 would detach our pressure detection on Safari,\n                // as the webkitForce events are triggered as MouseEvent, with no identifier.\n                // So if we have a \"start\" event with a pointerId of 1, we need a \"pressure\" event\n                // with an identifier of 1 too, so we can track the correct joystick.\n                1\n    ) as Identifier;\n\n    // This is only what we need, to normalize the interaction event.\n    // Everything else is based off this data.\n    return {\n        identifier,\n        isTouch: 'touches' in evt || 'changedTouches' in evt,\n        position: {\n            x: processedEvt.pageX,\n            y: processedEvt.pageY,\n        },\n        pressure: getPressureFromEvt(processedEvt),\n        type: evt.type,\n        initial: evt,\n        raw: processedEvt,\n    };\n};\n\n/**\n * Reconciliation layer for MouseEvent, TouchEvent and PointerEvent.\n * Splits multi-touch events into individual DomEvent items and calls\n * preventDefault() on move events to suppress default browser gestures.\n *\n * We skip preventDefault() on start (pointerdown/touchstart/mousedown) events\n * because the zone element already has `touch-action: none` set, and calling\n * preventDefault() on pointerdown can interfere with multitouch on mobile.\n */\nexport const processEvents = (evt: SupportedEvent): DomEvent[] => {\n    // Only preventDefault on move events — start events rely on\n    // touch-action: none (set on the zone) to prevent default gestures,\n    // and calling preventDefault on pointerdown breaks multitouch.\n    const type = evt.type.toLowerCase();\n    if (type.includes('move')) {\n        evt.preventDefault();\n    }\n\n    // Prepare arrays of initial events.\n    const domEvents: ProcessedEvent[] = [];\n    // TouchEvent may have multitouches, split them out in an array.\n    if ('changedTouches' in evt) {\n        // evt.changedTouches doesn't really offer a nice iterable interface.\n        for (const touch of Array.from(evt.changedTouches)) {\n            if (touch) {\n                domEvents.push(touch);\n            }\n        }\n    } else {\n        domEvents.push(evt);\n    }\n\n    // Will return an array of events, based on touches, pointer or mouse data.\n    return domEvents.map<DomEvent>((domEvt) => {\n        return processEvent(evt, domEvt);\n    });\n};\n\n/**\n * Get the current scroll position of the window.\n * @returns {Coordinates} The current scroll position of the window.\n */\nexport const getScroll = (): Coordinates => ({\n    x: window.scrollX,\n    y: window.scrollY,\n});\n\n/**\n * Apply a position to an element.\n * @param {HTMLElement} el - The element to apply the position to.\n * @param {Coordinates} pos - The position to apply.\n */\nexport const applyPosition = (el: HTMLElement, pos: AnyPosition): void => {\n    const { left, top, right, bottom, x, y } = pos;\n    if (top || right || bottom || left) {\n        extend(el.style, { top, right, bottom, left });\n    } else if (isNumber(x) || isNumber(y)) {\n        extend(el.style, {\n            left: isNumber(x) ? `${x}px` : undefined,\n            top: isNumber(y) ? `${y}px` : undefined,\n        } as Partial<CSSStyleDeclaration>);\n    }\n};\n\n/**\n * Configure a style property object with vendor prefixes.\n * @param {string} prop - The property to configure.\n * @returns {Record<string, string>} The configured style property object.\n */\nexport const configStylePropertyObject = (\n    prop: string,\n    value: string = '',\n): Record<string, string> => ({\n    [prop]: value,\n});\n\n/**\n * Extend an object with the properties of another object.\n * @param {T} objA - The object to extend.\n * @param {Partial<T>} objB - The object to extend with.\n * @returns {T} The extended object.\n */\nexport const extend = <T extends object>(objA: T, objB: Partial<T>): T => {\n    for (const i in objB) {\n        if (Object.hasOwn(objB, i)) {\n            objA[i as keyof T] = objB[i] as T[keyof T];\n        }\n    }\n    return objA;\n};\n\n/**\n * Clamp a position within a range.\n * @param {Coordinates} pos - The position to clamp.\n * @param {Coordinates} joystickPos - The position of the joystick.\n * @param {number} size - The size of the range.\n * @returns {Coordinates} The clamped position.\n */\nexport const clamp = (pos: Coordinates, joystickPos: Coordinates, size: number): Coordinates => ({\n    //                          left-clamping          right-clamping\n    x: Math.min(Math.max(pos.x, joystickPos.x - size), joystickPos.x + size),\n    //                          top-clamping           bottom-clamping\n    y: Math.min(Math.max(pos.y, joystickPos.y - size), joystickPos.y + size),\n});\n\n/**\n * Check if a value is a number.\n * @param {unknown} value - The value to check.\n * @returns {boolean} True if the value is a number, false otherwise.\n */\nexport const isNumber = (value: unknown): value is number => {\n    return typeof value === 'number' && !isNaN(value);\n};\n","import type Collection from './Collection';\nimport type Factory from './Factory';\nimport type Joystick from './Joystick';\nimport { PRIMARY_BIND, SECONDARY_BIND } from './constants';\nimport type {\n    FactoryEventType,\n    EventType,\n    LogLevel,\n    SupportedElement,\n    InternalEventHandler,\n    JoystickEventData,\n    SupportedEvent,\n    DomEventHandler,\n    AttachEventData,\n    Uid,\n} from './types';\nimport * as u from './utils';\n\nexport type SuperEventType<T extends FactoryEventType> = T | `${T}${string}` | `${string}${T}`;\nexport type Name = 'super' | 'joystick' | 'collection' | 'factory';\n\nconst LOG_LEVELS: Record<LogLevel, number> = {\n    debug: 0,\n    info: 1,\n    warning: 2,\n    error: 3,\n    none: 4,\n};\n\nlet currentLogLevel: LogLevel = 'warning';\n\n/**\n * Base class providing the event system and DOM event binding used by\n * Joystick, Collection, and Factory.\n *\n * Events are strings that can be space/comma separated to listen to multiple\n * at once (e.g. `\"start end\"`). Handlers are stored in a `Set` per event type.\n */\nexport class Super {\n    uid: Uid = 0 as Uid;\n    index: number = 0;\n    name: Name = 'super';\n    private _domHandlers_: Map<DomEventHandler, (evt: SupportedEvent) => void> = new Map();\n    private _handlers_: Partial<Record<FactoryEventType, Set<InternalEventHandler<any>>>> = {};\n\n    constructor(name: Name) {\n        this.name = name;\n        this.log('construct', this.name, this.index);\n    }\n\n    mapOnEvents(arg: string, cb: (type: FactoryEventType) => void): void {\n        const types = arg.split(/[ ,]+/g) as FactoryEventType[];\n\n        for (let i = 0; i < types.length; i += 1) {\n            cb(types[i]);\n        }\n    }\n\n    // Basic event system.\n    on(arg: SuperEventType<'attached'>, cb: InternalEventHandler<AttachEventData>): void;\n    on(arg: SuperEventType<'detached'>, cb: InternalEventHandler<AttachEventData>): void;\n    on(arg: SuperEventType<'dir'>, cb: InternalEventHandler<JoystickEventData>): void;\n    on(arg: SuperEventType<'plain'>, cb: InternalEventHandler<JoystickEventData>): void;\n    on(arg: SuperEventType<'move'>, cb: InternalEventHandler<JoystickEventData>): void;\n    on(arg: SuperEventType<'added'>, cb: InternalEventHandler<Joystick>): void;\n    on(arg: SuperEventType<'removed'>, cb: InternalEventHandler<Joystick>): void;\n    on(arg: SuperEventType<'start'>, cb: InternalEventHandler<Joystick>): void;\n    on(arg: SuperEventType<'end'>, cb: InternalEventHandler<Joystick>): void;\n    on(arg: SuperEventType<'shown'>, cb: InternalEventHandler<Joystick>): void;\n    on(arg: SuperEventType<'hidden'>, cb: InternalEventHandler<Joystick>): void;\n    on(arg: SuperEventType<'rested'>, cb: InternalEventHandler<Joystick>): void;\n    on(arg: SuperEventType<'joystickCreated'>, cb: InternalEventHandler<Joystick>): void;\n    on(arg: SuperEventType<'joystickDestroyed'>, cb: InternalEventHandler<Joystick>): void;\n    on(arg: SuperEventType<'collectionCreated'>, cb: InternalEventHandler<Collection>): void;\n    on(arg: SuperEventType<'collectionDestroyed'>, cb: InternalEventHandler<Collection>): void;\n    on(arg: SuperEventType<'factoryCreated'>, cb: InternalEventHandler<Factory>): void;\n    on(arg: SuperEventType<'factoryDestroyed'>, cb: InternalEventHandler<Factory>): void;\n    on(arg: SuperEventType<'pressure'>, cb: InternalEventHandler<number>): void;\n    on<T>(arg: string, cb: InternalEventHandler<T>): void {\n        this.mapOnEvents(arg, (type) => {\n            this._handlers_[type] = this._handlers_[type] || new Set();\n            this._handlers_[type]!.add(cb);\n        });\n    }\n\n    off(arg?: SuperEventType<'attached'>, cb?: InternalEventHandler<AttachEventData>): void;\n    off(arg?: SuperEventType<'detached'>, cb?: InternalEventHandler<AttachEventData>): void;\n    off(arg?: SuperEventType<'dir'>, cb?: InternalEventHandler<JoystickEventData>): void;\n    off(arg?: SuperEventType<'plain'>, cb?: InternalEventHandler<JoystickEventData>): void;\n    off(arg?: SuperEventType<'move'>, cb?: InternalEventHandler<JoystickEventData>): void;\n    off(arg?: SuperEventType<'added'>, cb?: InternalEventHandler<Joystick>): void;\n    off(arg?: SuperEventType<'removed'>, cb?: InternalEventHandler<Joystick>): void;\n    off(arg?: SuperEventType<'start'>, cb?: InternalEventHandler<Joystick>): void;\n    off(arg?: SuperEventType<'end'>, cb?: InternalEventHandler<Joystick>): void;\n    off(arg?: SuperEventType<'shown'>, cb?: InternalEventHandler<Joystick>): void;\n    off(arg?: SuperEventType<'hidden'>, cb?: InternalEventHandler<Joystick>): void;\n    off(arg?: SuperEventType<'rested'>, cb?: InternalEventHandler<Joystick>): void;\n    off(arg?: SuperEventType<'joystickCreated'>, cb?: InternalEventHandler<Joystick>): void;\n    off(arg?: SuperEventType<'joystickDestroyed'>, cb?: InternalEventHandler<Joystick>): void;\n    off(arg?: SuperEventType<'collectionCreated'>, cb?: InternalEventHandler<Collection>): void;\n    off(arg?: SuperEventType<'collectionDestroyed'>, cb?: InternalEventHandler<Collection>): void;\n    off(arg?: SuperEventType<'factoryCreated'>, cb?: InternalEventHandler<Factory>): void;\n    off(arg?: SuperEventType<'factoryDestroyed'>, cb?: InternalEventHandler<Factory>): void;\n    off(arg?: SuperEventType<'pressure'>, cb?: InternalEventHandler<number>): void;\n    off<T>(arg?: string, cb?: InternalEventHandler<T>): void {\n        if (arg === undefined) {\n            // If no arguments provided, clear all handlers.\n            this._handlers_ = {};\n        } else {\n            this.mapOnEvents(arg, (type) => {\n                if (cb === undefined) {\n                    // If no callback provided, clear all handlers for the type.\n                    this._handlers_[type] = new Set();\n                } else if (this._handlers_[type]) {\n                    // If the callback is found, remove it.\n                    this._handlers_[type]!.delete(cb);\n                }\n            });\n        }\n    }\n\n    trigger(arg: SuperEventType<'attached'>, data: AttachEventData): void;\n    trigger(arg: SuperEventType<'detached'>, data: AttachEventData): void;\n    trigger(arg: SuperEventType<'dir'>, data: JoystickEventData): void;\n    trigger(arg: SuperEventType<'plain'>, data: JoystickEventData): void;\n    trigger(arg: SuperEventType<'move'>, data: JoystickEventData): void;\n    trigger(arg: SuperEventType<'added'>, data: Joystick): void;\n    trigger(arg: SuperEventType<'removed'>, data: Joystick): void;\n    trigger(arg: SuperEventType<'start'>, data: Joystick): void;\n    trigger(arg: SuperEventType<'end'>, data: Joystick): void;\n    trigger(arg: SuperEventType<'shown'>, data: Joystick): void;\n    trigger(arg: SuperEventType<'hidden'>, data: Joystick): void;\n    trigger(arg: SuperEventType<'rested'>, data: Joystick): void;\n    trigger(arg: SuperEventType<'joystickCreated'>, data: Joystick): void;\n    trigger(arg: SuperEventType<'joystickDestroyed'>, data: Joystick): void;\n    trigger(arg: SuperEventType<'collectionCreated'>, data: Collection): void;\n    trigger(arg: SuperEventType<'collectionDestroyed'>, data: Collection): void;\n    trigger(arg: SuperEventType<'factoryCreated'>, data: Factory): void;\n    trigger(arg: SuperEventType<'factoryDestroyed'>, data: Factory): void;\n    trigger(arg: SuperEventType<'pressure'>, data: number): void;\n    trigger<T>(arg: string, data: T): void {\n        this.mapOnEvents(arg, (type) => {\n            this.log(`- \"${type}\" [trigger]`);\n            const handlers = this._handlers_[type];\n            if (handlers && handlers.size) {\n                // Snapshot to avoid issues if a handler modifies the Set\n                const snapshot = [...handlers];\n                for (const handler of snapshot) {\n                    handler.call(this, {\n                        type,\n                        target: this,\n                        data,\n                    });\n                }\n            }\n        });\n    }\n\n    // Bind DOM events.\n    bindEvt(el: SupportedElement, type: EventType, handler: DomEventHandler) {\n        const cb = (evt: SupportedEvent) => {\n            for (const domEvt of u.processEvents(evt)) {\n                this.log(`- \"${type}\" [dom:trigger:${domEvt.identifier}]`);\n                handler.call(this, domEvt);\n            }\n        };\n\n        // Save the handler so we can unbind later.\n        this._domHandlers_.set(handler, cb);\n\n        u.bindEvt(el, PRIMARY_BIND[type], cb);\n\n        if (SECONDARY_BIND?.[type]) {\n            // Support multiple interfaces type when necessary.\n            u.bindEvt(el, SECONDARY_BIND[type], cb);\n        }\n    }\n\n    // Unbind DOM events.\n    unbindEvt(el: SupportedElement, type: EventType, handler: DomEventHandler) {\n        const cb = this._domHandlers_.get(handler);\n\n        if (!cb) {\n            this.error(`Internal handler not found for event ${type}.`, handler);\n            return;\n        }\n\n        u.unbindEvt(el, PRIMARY_BIND[type], cb);\n\n        if (SECONDARY_BIND?.[type]) {\n            // Support multiple interfaces type when necessary.\n            u.unbindEvt(el, SECONDARY_BIND[type], cb);\n        }\n\n        this._domHandlers_.delete(handler);\n    }\n\n    logPrefix() {\n        const prefixes: Record<Name, string> = {\n            super: '',\n            joystick: '  ',\n            collection: '    ',\n            factory: '      ',\n        };\n\n        return prefixes[this.name];\n    }\n\n    logSuffix() {\n        return `[${this.name}|${this.uid}]`;\n    }\n\n    static get logLevel(): LogLevel {\n        return currentLogLevel;\n    }\n\n    static set logLevel(level: LogLevel) {\n        currentLogLevel = level;\n    }\n\n    log(...args: any[]) {\n        if (LOG_LEVELS[currentLogLevel] <= LOG_LEVELS.debug) {\n            console.log(this.logPrefix(), ...args, this.logSuffix());\n        }\n    }\n\n    info(...args: any[]) {\n        if (LOG_LEVELS[currentLogLevel] <= LOG_LEVELS.info) {\n            console.info(this.logPrefix(), ...args, this.logSuffix());\n        }\n    }\n\n    warn(...args: any[]) {\n        if (LOG_LEVELS[currentLogLevel] <= LOG_LEVELS.warning) {\n            console.warn(this.logPrefix(), ...args, this.logSuffix());\n        }\n    }\n\n    error(...args: any[]) {\n        if (LOG_LEVELS[currentLogLevel] <= LOG_LEVELS.error) {\n            console.error(this.logPrefix(), ...args, this.logSuffix());\n        }\n    }\n}\n\nexport default Super;\n","import type Collection from './Collection';\nimport Super from './Super';\nimport { ANGLE_45, ANGLE_90, MODES } from './constants';\nimport type {\n    Coordinates,\n    Direction,\n    Identifier,\n    JoystickEventData,\n    JoystickOptions,\n    ProcessedEvent,\n    Uid,\n} from './types';\nimport * as u from './utils';\n\n/**\n * A single virtual joystick element.\n *\n * Manages its own DOM (outer circle + inner thumb), position tracking,\n * direction computation, and fade-in/fade-out lifecycle. Created and\n * owned by a Collection.\n */\nexport class Joystick extends Super {\n    static index: number = 0;\n    private _identifier?: Identifier;\n    private _pressure?: number;\n    uid: Uid;\n    position: Coordinates;\n    frontPosition: Coordinates;\n    collection: Collection;\n    ui: {\n        el: HTMLElement;\n        back: HTMLElement;\n        front: HTMLElement;\n    };\n    pressureInterval?: number;\n    removeTimeout?: number;\n    showTimeout?: number;\n    activeTimeout?: number;\n    restTimeout?: number;\n    direction: Direction = {};\n    options: Required<JoystickOptions>;\n    defaults: Required<Omit<JoystickOptions, 'identifier' | 'position' | 'frontPosition'>> = {\n        size: 100,\n        threshold: 0.1,\n        color: 'white',\n        fadeTime: 250,\n        dataOnly: false,\n        restJoystick: true,\n        restOpacity: 0.5,\n        mode: 'dynamic',\n        zone: document.body,\n        lockX: false,\n        lockY: false,\n        shape: 'circle',\n    };\n\n    constructor(collection: Collection, options: JoystickOptions) {\n        super('joystick');\n\n        this.position = options.position;\n        this.frontPosition = options.frontPosition;\n        this.collection = collection;\n        this.options = { ...this.defaults, ...options };\n\n        // Overwrites\n        if (this.options.mode === 'dynamic') {\n            // For dynamic Joystick, they will fade completely out.\n            this.options.restOpacity = 0;\n        }\n\n        this.uid = Joystick.index++ as Uid;\n\n        this.ui = {\n            el: document.createElement('div'),\n            back: document.createElement('div'),\n            front: document.createElement('div'),\n        };\n    }\n\n    init() {\n        if (!this.options.dataOnly) {\n            this.buildEl();\n        }\n        this.trigger('added', this);\n        this.trigger('joystickCreated', this);\n    }\n\n    get identifier(): Identifier | undefined {\n        return this._identifier;\n    }\n\n    set identifier(identifier: Identifier | undefined) {\n        if (!u.isNumber(identifier)) {\n            this.trigger(`detached`, {\n                collection: this.collection,\n                joystick: this,\n                identifier: this._identifier!,\n            });\n            this._identifier = undefined;\n        } else {\n            this._identifier = identifier;\n            this.trigger(`attached`, {\n                collection: this.collection,\n                joystick: this,\n                identifier,\n            });\n        }\n    }\n\n    private resolveColors(): { front: string; back: string } {\n        const color = this.options.color;\n        if (typeof color === 'object' && color !== null) {\n            return color;\n        }\n        return { front: color as string, back: color as string };\n    }\n\n    private buildEl() {\n        // Build the dom element.\n        this.ui.el.className = `joystick collection_${this.collection.uid}`;\n        this.ui.back.className = 'back';\n        this.ui.front.className = 'front';\n\n        this.ui.el.setAttribute('id', `joystick_${this.collection.uid}_${this.uid}`);\n\n        this.ui.el.appendChild(this.ui.back);\n        this.ui.el.appendChild(this.ui.front);\n\n        // Apply CSS to the dom elements.\n        const animTime = `${this.options.fadeTime}ms`;\n        const borderStyle = u.configStylePropertyObject('borderRadius', '50%');\n        const transitStyle = u.configStylePropertyObject('transition', `opacity ${animTime}`);\n        const colors = this.resolveColors();\n\n        u.extend(this.ui.el.style, {\n            position: 'absolute',\n            opacity: this.options.restOpacity.toString(),\n            display: 'block',\n            zIndex: '999',\n            touchAction: 'none',\n            userSelect: 'none',\n            ...transitStyle,\n        });\n\n        u.extend(this.ui.back.style, {\n            position: 'absolute',\n            display: 'block',\n            width: `${this.options.size}px`,\n            height: `${this.options.size}px`,\n            left: '0',\n            marginLeft: `${-this.options.size / 2}px`,\n            marginTop: `${-this.options.size / 2}px`,\n            background: colors.back,\n            ...(this.options.shape === 'circle' ? borderStyle : {}),\n        });\n\n        u.extend(this.ui.front.style, {\n            width: `${this.options.size / 2}px`,\n            height: `${this.options.size / 2}px`,\n            position: 'absolute',\n            display: 'block',\n            left: '0',\n            marginLeft: `${-this.options.size / 4}px`,\n            marginTop: `${-this.options.size / 4}px`,\n            background: colors.front,\n            opacity: '.5',\n            transform: 'translate(0px, 0px)',\n            ...borderStyle,\n        });\n    }\n\n    get pressure(): number {\n        return this._pressure ?? 0;\n    }\n\n    set pressure(pressure: number) {\n        if (pressure !== this._pressure) {\n            this._pressure = pressure;\n            this.trigger('pressure', pressure);\n        }\n    }\n\n    startPressureInterval(evt: ProcessedEvent): void {\n        if (this.pressureInterval) {\n            return;\n        }\n\n        this.pressureInterval = window.setInterval(() => {\n            this.pressure = u.getPressureFromEvt(evt);\n        }, 100);\n    }\n\n    stopPressureInterval(): void {\n        clearInterval(this.pressureInterval);\n        this.pressureInterval = undefined;\n    }\n\n    // Inject the Joystick instance into DOM.\n    addToDom(): void {\n        // We're not adding it if we're dataOnly or already in dom.\n        if (this.options.dataOnly || this.options.zone.contains(this.ui.el)) {\n            return;\n        }\n        this.options.zone.appendChild(this.ui.el);\n    }\n\n    // Remove the Joystick instance from DOM.\n    removeFromDom(): void {\n        if (this.options.dataOnly || !this.options.zone.contains(this.ui.el)) {\n            return;\n        }\n        this.options.zone.removeChild(this.ui.el);\n    }\n\n    private clearTimeouts(): void {\n        clearTimeout(this.removeTimeout);\n        clearTimeout(this.showTimeout);\n        clearTimeout(this.restTimeout);\n        clearTimeout(this.activeTimeout);\n\n        this.removeTimeout = undefined;\n        this.showTimeout = undefined;\n        this.restTimeout = undefined;\n        this.activeTimeout = undefined;\n    }\n\n    // Fade in the Joystick instance.\n    start(evt: ProcessedEvent, cb?: () => void): void {\n        this.trigger('start', this);\n        // Clear the timeouts.\n        this.clearTimeouts();\n\n        if (this.options.dataOnly) {\n            if (typeof cb === 'function') {\n                cb.call(this);\n            }\n            return;\n        }\n\n        this.addToDom();\n\n        this.startPressureInterval(evt);\n\n        requestAnimationFrame(() => {\n            this.ui.el.style.opacity = '1';\n        });\n\n        this.showTimeout = window.setTimeout(() => {\n            this.showTimeout = undefined;\n            this.trigger('shown', this);\n            if (typeof cb === 'function') {\n                cb.call(this);\n            }\n        }, this.options.fadeTime);\n    }\n\n    // Fade out the Joystick instance.\n    end(cb?: () => void): void {\n        this.resetDirection();\n        this.clearTimeouts();\n        this.stopPressureInterval();\n        this.pressure = 0;\n        this.trigger('end', this);\n\n        if (this.options.dataOnly) {\n            if (typeof cb === 'function') {\n                cb.call(this);\n            }\n            return;\n        }\n\n        // Set the faded out opacity.\n        this.ui.el.style.opacity = this.options.restOpacity.toString();\n\n        // If the Joystick has to rest (go back to center),\n        // we update its position.\n        if (this.options.restJoystick) {\n            const rest = this.options.restJoystick;\n            const newPosition = {\n                x: rest === true || rest.x !== false ? 0 : this.frontPosition.x,\n                y: rest === true || rest.y !== false ? 0 : this.frontPosition.y,\n            };\n\n            this.setPosition(cb, newPosition);\n        }\n\n        // Create a timeout to trigger an event after the fadeTime.\n        // And destroy it if it's a dynamic Joystick.\n        clearTimeout(this.removeTimeout);\n        this.removeTimeout = window.setTimeout(() => {\n            this.removeTimeout = undefined;\n            // If dynamic, we'll completely hide the Joystick (display: none).\n            this.ui.el.style.display = this.options.mode === MODES.dynamic ? 'none' : 'block';\n            this.trigger('hidden', this);\n\n            // We trigger a removed event only in dynamic mode,\n            // which is the only mode where joysticks get removed.\n            if (this.options.mode === MODES.dynamic) {\n                this.trigger('removed', this);\n                this.destroy();\n            }\n\n            if (typeof cb === 'function') {\n                cb.call(this);\n            }\n        }, this.options.fadeTime);\n    }\n\n    setTransition(animated: boolean = false, cb?: () => void) {\n        if (animated) {\n            const activeTime = 100;\n            const animTime = `${activeTime}ms`;\n            const transitStyle = u.extend(\n                // Transition style.\n                u.configStylePropertyObject('transition', `transform ${animTime}`),\n                // Transform style.\n                u.configStylePropertyObject(\n                    'transform',\n                    `translate(${this.frontPosition.x}px, ${this.frontPosition.y}px)`,\n                ),\n            );\n\n            // Apply CSS.\n            u.extend(this.ui.front.style, transitStyle);\n\n            clearTimeout(this.activeTimeout);\n            this.activeTimeout = window.setTimeout(() => {\n                this.activeTimeout = undefined;\n                if (typeof cb === 'function') {\n                    cb.call(this);\n                }\n            }, activeTime);\n        } else {\n            u.extend(this.ui.front.style, u.configStylePropertyObject('transition', 'none'));\n        }\n    }\n\n    // Set the Joystick to the specified position\n    setPosition(cb: (() => void) | undefined, position: Coordinates): void {\n        this.frontPosition = {\n            x: position.x,\n            y: position.y,\n        };\n\n        this.setTransition(true);\n\n        clearTimeout(this.restTimeout);\n        this.restTimeout = window.setTimeout(() => {\n            this.restTimeout = undefined;\n            if (typeof cb === 'function') {\n                cb.call(this);\n            }\n            // Once rested, remove the transition.\n            this.setTransition(false);\n            this.trigger('rested', this);\n        }, this.options.fadeTime);\n    }\n\n    resetDirection(): void {\n        // Fully rebuild the object to let the iteration possible.\n        this.direction = {};\n    }\n\n    computeDirectionAndTriggerEvents(obj: JoystickEventData): JoystickEventData {\n        const rAngle = obj.angle.radian;\n        const direction: Direction = {};\n\n        // Angular direction\n        //     \\  UP /\n        //      \\   /\n        // LEFT       RIGHT\n        //      /   \\\n        //     /DOWN \\\n        //\n        if (rAngle > ANGLE_45 && rAngle < ANGLE_45 * 3 && !obj.lockX) {\n            direction.angle = 'up';\n        } else if (rAngle > -ANGLE_45 && rAngle <= ANGLE_45 && !obj.lockY) {\n            direction.angle = 'left';\n        } else if (rAngle > -ANGLE_45 * 3 && rAngle <= -ANGLE_45 && !obj.lockX) {\n            direction.angle = 'down';\n        } else if (!obj.lockY) {\n            direction.angle = 'right';\n        }\n\n        // Plain direction\n        //    UP                 |\n        // _______               | RIGHT\n        //                  LEFT |\n        //   DOWN                |\n        if (!obj.lockY) {\n            if (rAngle > -ANGLE_90 && rAngle < ANGLE_90) {\n                direction.x = 'left';\n            } else {\n                direction.x = 'right';\n            }\n        }\n\n        if (!obj.lockX) {\n            if (rAngle > 0) {\n                direction.y = 'up';\n            } else {\n                direction.y = 'down';\n            }\n        }\n\n        // Rotate the angle measure from 0 to 180° to have a more human reading of it.\n        obj.angle = {\n            radian: u.radians(180 - obj.angle.degree),\n            degree: 180 - obj.angle.degree,\n        };\n\n        this.triggerDirectionEvents(obj, direction);\n\n        return obj;\n    }\n\n    private triggerDirectionEvents(obj: JoystickEventData, direction: Direction): void {\n        if (obj.force > this.options.threshold) {\n            const oldDirection = {\n                x: this.direction.x,\n                y: this.direction.y,\n                angle: this.direction.angle,\n            };\n\n            this.direction = direction;\n            obj.direction = direction;\n\n            if (oldDirection.x !== direction.x) {\n                this.trigger(`plain plain:${direction.x}`, obj);\n            }\n\n            if (oldDirection.y !== direction.y) {\n                this.trigger(`plain plain:${direction.y}`, obj);\n            }\n\n            if (oldDirection.angle !== direction.angle) {\n                this.trigger(`dir dir:${direction.angle}`, obj);\n            }\n        } else {\n            this.resetDirection();\n        }\n\n        this.trigger('move', obj);\n    }\n\n    // Entirely destroy this Joystick\n    destroy(): void {\n        this.clearTimeouts();\n        this.identifier = undefined;\n        this.removeFromDom();\n        this.trigger('joystickDestroyed', this);\n        this.off();\n    }\n}\n\nexport default Joystick;\n","import type Factory from './Factory';\nimport Joystick from './Joystick';\nimport Super from './Super';\nimport { MODES } from './constants';\nimport type {\n    CollectionOptions,\n    JoystickEventData,\n    DomEvent,\n    Coordinates,\n    AnyPosition,\n    Uid,\n    Identifier,\n} from './types';\nimport * as u from './utils';\n\nexport class Collection extends Super {\n    /**\n     *  The static incremented ID of the Collections.\n     * */\n    static index: number = 0;\n    /**\n     *  The unique ID of this Collection instance.\n     * */\n    uid: Uid;\n    /**\n     *  The parent factory that created this Collection.\n     * */\n    factory: Factory;\n    /**\n     *  The options of this Collection.\n     * */\n    options: Required<CollectionOptions>;\n    /**\n     *  The list of all the Joysticks of this Collection.\n     *\n     *  Indexed by their uid.\n     * */\n    all: Map<Uid, Joystick> = new Map();\n    /**\n     *  The list of the idle Joysticks of this Collection.\n     *\n     *  Idle Joysticks are the ones that are not being moved by the user.\n     *\n     *  Indexed by their uid.\n     * */\n    idles: Set<Uid> = new Set();\n    /**\n     *  The list of the active Joysticks of this Collection.\n     *\n     *  Active Joysticks are the ones that are being moved or touched by the user.\n     *\n     *  Indexed by their event's identifier.\n     * */\n    actives: Map<Identifier, Joystick> = new Map();\n    /**\n     *  The list of the resting Joysticks of this Collection.\n     *\n     *  Resting Joysticks are the ones that are on their way out.\n     *\n     *  Keeping them here, just in case we get a new start before the end.\n     *\n     *  Indexed by their event's identifier.\n     * */\n    resting: Map<Identifier, Joystick> = new Map();\n    /**\n     *  Is the parent element of the Joysticks a flex container?\n     * */\n    parentIsFlex: boolean = false;\n    /**\n     *  The bounding box of the parent element of the Joysticks.\n     * */\n    box: DOMRect;\n    /**\n     *  ResizeObserver watching the zone element for automatic repositioning.\n     * */\n    private resizeObserver?: ResizeObserver;\n    /**\n     *  The default options of a Collection.\n     * */\n    defaults: Required<CollectionOptions> = {\n        catchDistance: 200,\n        color: 'white',\n        dataOnly: false,\n        dynamicPage: false,\n        fadeTime: 250,\n        follow: false,\n        lockX: false,\n        lockY: false,\n        maxNumberOfJoysticks: 10,\n        mode: MODES.dynamic,\n        multitouch: false,\n        position: { top: '0px', left: '0px' },\n        restJoystick: true,\n        restOpacity: 0.5,\n        shape: 'circle',\n        size: 100,\n        threshold: 0.1,\n        zone: document.body,\n    };\n\n    constructor(factory: Factory, options: CollectionOptions) {\n        super('collection');\n        this.factory = factory;\n        this.uid = Collection.index++ as Uid;\n        this.options = { ...this.defaults, ...options };\n\n        // Overwrite the multitouch option if we are in static or semi modes.\n        // As they cannot support multitouch.\n        if (this.options.mode === MODES.static || this.options.mode === MODES.semi) {\n            this.options.multitouch = false;\n        }\n\n        // Overwrite the maxNumberOfJoysticks in a non multitouch setup.\n        if (!this.options.multitouch) {\n            this.options.maxNumberOfJoysticks = 1;\n        }\n\n        // Compute the parentIsFlex value.\n        const computedStyle =\n            this.options.zone.parentElement && getComputedStyle(this.options.zone.parentElement);\n        if (computedStyle?.display === 'flex') {\n            this.parentIsFlex = true;\n        }\n\n        // Warn if the zone has no CSS positioning set.\n        const zonePosition = getComputedStyle(this.options.zone).position;\n        if (zonePosition === 'static') {\n            this.warn(\n                'The zone element has no CSS \"position\" set (it is \"static\").',\n                'Joysticks may not be positioned correctly.',\n                'Set \"position: relative\" (or absolute/fixed) on the zone element.',\n            );\n        }\n\n        // Compute the bounding box of the zone.\n        this.box = this.options.zone.getBoundingClientRect();\n\n        // Bind the start event.\n        this.bindEvt(this.options.zone, 'start', this.processOnStart);\n\n        // Disable the default actions of touches (zooming, panning, etc...)\n        // and prevent text selection while interacting with the joystick.\n        u.extend(this.options.zone.style, {\n            touchAction: 'none',\n            userSelect: 'none',\n            webkitUserSelect: 'none',\n        } as Partial<CSSStyleDeclaration>);\n\n        // Automatically reposition when the zone element resizes.\n        if (typeof ResizeObserver !== 'undefined') {\n            this.resizeObserver = new ResizeObserver(() => {\n                this.reposition();\n            });\n            this.resizeObserver.observe(this.options.zone);\n        }\n    }\n\n    init() {\n        this.trigger('collectionCreated', this);\n\n        // In static mode, we create our own static Joystick.\n        if (this.options.mode === MODES.static) {\n            const joystick = this.createJoystick(this.options.position);\n            joystick.addToDom();\n        }\n    }\n\n    getJoystickByUid(uid?: Uid): Joystick | undefined {\n        // If we have no uid, we return the first Joystick.\n        if (uid === undefined) {\n            return this.all.values().next().value;\n        }\n\n        return this.all.get(uid);\n    }\n\n    private bindJoystick(joystick: Joystick) {\n        // When a Joystick gets destroyed, we clean behind.\n        joystick.on('joystickDestroyed', () => {\n            this.deleteJoystickFromLists(joystick);\n        });\n\n        // When a Joystick gets attached, we move it from idle to active.\n        joystick.on('attached', (evt) => {\n            this.idles.delete(evt.data.joystick.uid);\n            this.actives.set(evt.data.identifier, joystick);\n        });\n\n        // When a Joystick gets detached, we move it from active to idle.\n        joystick.on('detached', (evt) => {\n            this.idles.add(evt.data.joystick.uid);\n            this.deleteIdentifierFromLists(evt.data.identifier);\n        });\n\n        // When a Joystick is released, mark it reusable immediately.\n        // `resting` keeps the identifier-keyed index for same-pointer recovery\n        // in processOnStart; `idles` is the uid-keyed pool getOrCreate uses.\n        joystick.on('end', (evt) => {\n            if (u.isNumber(evt.data.identifier)) {\n                this.actives.delete(evt.data.identifier);\n                this.resting.set(evt.data.identifier, joystick);\n            }\n            this.idles.add(evt.data.uid);\n        });\n\n        // When a Joystick is reused mid-fade, start() clears the removeTimeout\n        // so `hidden` never fires for the prior identifier. Drop the stale\n        // resting entry here, where `joystick.identifier` still holds it.\n        joystick.on('start', (evt) => {\n            if (u.isNumber(evt.data.identifier)) {\n                this.resting.delete(evt.data.identifier);\n            }\n        });\n\n        // After the fade-out completes, drop the resting index entry.\n        // `idles` was already populated on `end`.\n        joystick.on('hidden', (evt) => {\n            if (u.isNumber(evt.data.identifier)) {\n                this.resting.delete(evt.data.identifier);\n            }\n        });\n\n        // Other events that will get bubbled up.\n        joystick.on('pressure', (evt) => {\n            this.trigger(`pressure ${joystick.uid}:pressure`, evt.data);\n        });\n        joystick.on('attached detached', (evt) => {\n            type EvtType = `attached${string}` & `detached${string}`;\n            const type = `${evt.type} ${evt.data.joystick.uid}:${evt.type}`;\n            this.trigger(type as EvtType, evt.data);\n        });\n        joystick.on(\n            'added start shown hidden rested removed end joystickCreated joystickDestroyed',\n            (evt) => {\n                type EvtType = `added${string}` &\n                    `start${string}` &\n                    `shown${string}` &\n                    `hidden${string}` &\n                    `rested${string}` &\n                    `removed${string}` &\n                    `end${string}` &\n                    `joystickCreated${string}` &\n                    `joystickDestroyed${string}`;\n                const type = `${evt.type} ${evt.data.uid}:${evt.type}`;\n                this.trigger(type as EvtType, evt.data);\n            },\n        );\n        joystick.on('move', (evt) => {\n            this.trigger(`move ${evt.data.instance.uid}:move`, evt.data);\n        });\n        joystick.on('dir dir:up dir:right dir:down dir:left', (evt) => {\n            const type = `${evt.type} ${evt.data.instance.uid}:${evt.type}`;\n            this.trigger(type as `dir${string}`, evt.data);\n        });\n        joystick.on('plain plain:up plain:right plain:down plain:left', (evt) => {\n            const type = `${evt.type} ${evt.data.instance.uid}:${evt.type}`;\n            this.trigger(type as `plain${string}`, evt.data);\n        });\n    }\n\n    private deleteJoystickFromLists(joystick: Joystick) {\n        this.deleteUidFromLists(joystick.uid);\n        if (u.isNumber(joystick.identifier)) {\n            this.deleteIdentifierFromLists(joystick.identifier);\n        }\n    }\n\n    private deleteUidFromLists(uid: Uid) {\n        this.all.delete(uid);\n        this.idles.delete(uid);\n    }\n\n    private deleteIdentifierFromLists(identifier: Identifier) {\n        this.actives.delete(identifier);\n        this.resting.delete(identifier);\n    }\n\n    private getOrCreate(position: Coordinates): Joystick {\n        // In semi and static modes, we recycle the idle joystick.\n        if (this.options.mode === MODES.semi || this.options.mode === MODES.static) {\n            // If there is an idle joystick, we use it.\n            const idleUid: Uid | undefined = this.idles.values().next().value;\n            if (u.isNumber(idleUid)) {\n                const joystick = this.all.get(idleUid);\n                if (!joystick) {\n                    this.error(`Couldn't find the joystick ${idleUid}. Creating a new one.`);\n                    // Clean unbound uid.\n                    this.deleteUidFromLists(idleUid);\n                } else {\n                    return joystick;\n                }\n            }\n\n            // In semi mode, we may not have an idle joystick.\n            // So we create a new one.\n            if (this.options.mode === MODES.semi) {\n                return this.createJoystick(position);\n            }\n\n            // This should never be reached.\n            // Static mode should always have an idle joystick.\n            this.warn(\"Couldn't find the expected joystick. Creating a new one.\");\n        }\n\n        // Return a new joystick.\n        return this.createJoystick(position);\n    }\n\n    private createJoystick(position: AnyPosition): Joystick {\n        const scroll = this.factory.scroll;\n        // Offset converts page-absolute coordinates to zone-relative.\n        // In flex containers, absolute children are positioned relative to the\n        // flex item's content box, so we only need scroll offset.\n        const offset = {\n            x: this.parentIsFlex ? scroll.x : scroll.x + this.box.left,\n            y: this.parentIsFlex ? scroll.y : scroll.y + this.box.top,\n        };\n\n        // Two paths: numeric {x, y} from pointer events (dynamic/semi mode)\n        // or CSS strings {top, left, ...} from options (static mode).\n        let toApply: AnyPosition;\n        let newPosition: Coordinates;\n\n        if (u.isNumber(position.x) && u.isNumber(position.y)) {\n            toApply = {\n                x: position.x - offset.x,\n                y: position.y - offset.y,\n            };\n            newPosition = {\n                x: position.x,\n                y: position.y,\n            };\n        } else if (position.top || position.right || position.bottom || position.left) {\n            // Compute coordinates from given CssPosition by creating a stub element.\n            const stub = document.createElement('DIV');\n            u.extend(stub.style, {\n                visibility: 'hidden',\n                position: 'absolute',\n                top: position.top,\n                right: position.right,\n                bottom: position.bottom,\n                left: position.left,\n            });\n\n            // Add it to the dom to get its bounding box.\n            this.options.zone.appendChild(stub);\n            const stubBox = stub.getBoundingClientRect();\n            // Then remove it.\n            this.options.zone.removeChild(stub);\n\n            toApply = position;\n            // No offset needed — the stub is positioned inside the zone,\n            // so stubBox.left already accounts for the zone's position.\n            newPosition = {\n                x: stubBox.left + scroll.x,\n                y: stubBox.top + scroll.y,\n            };\n        } else {\n            this.error('Invalid or missing position.', position);\n            return undefined as unknown as Joystick;\n        }\n\n        const joystick = new Joystick(this, {\n            color: this.options.color,\n            size: this.options.size,\n            threshold: this.options.threshold,\n            fadeTime: this.options.fadeTime,\n            dataOnly: this.options.dataOnly,\n            restJoystick: this.options.restJoystick,\n            restOpacity: this.options.restOpacity,\n            mode: this.options.mode,\n            // Page-absolute position of the joystick center.\n            // Used to compute distance/angle in processOnMove and catchDistance in semi mode.\n            position: newPosition!,\n            zone: this.options.zone,\n            frontPosition: {\n                x: 0,\n                y: 0,\n            },\n            shape: this.options.shape,\n        });\n\n        if (this.all.has(joystick.uid)) {\n            this.error(`Joystick with uid ${joystick.uid} already exists.`);\n        }\n\n        if (!this.options.dataOnly) {\n            // Position the Joystick at the right place.\n            u.applyPosition(joystick.ui.el, toApply!);\n            u.applyPosition(joystick.ui.front, joystick.frontPosition);\n        }\n\n        this.all.set(joystick.uid, joystick);\n        this.idles.add(joystick.uid);\n        this.bindJoystick(joystick);\n\n        // Initialize the joystick.\n        // We do this in order to have the events triggered by the joystick during initialisation caught by the collection.\n        // Otherwise, if everything is done in the constructor, we can't listen for start/created events.\n        joystick.init();\n\n        return joystick;\n    }\n\n    processOnStart(evt: DomEvent, _depth: number = 0) {\n        // Refresh the box position.\n        this.box = this.options.zone.getBoundingClientRect();\n        // If we don't have spots available, we stop right here.\n        if (\n            // Only if the event is already active.\n            !this.actives.has(evt.identifier) &&\n            this.actives.size >= this.options.maxNumberOfJoysticks\n        ) {\n            this.warn('No more joysticks allowed.');\n            return;\n        }\n\n        // Get an existing joystick or create a new one.\n        const joystick =\n            this.actives.get(evt.identifier) ||\n            this.resting.get(evt.identifier) ||\n            this.getOrCreate(evt.position);\n\n        const process = () => {\n            // Show the joystick.\n            joystick.start(evt.raw);\n            // Attach joystick to its event.\n            joystick.identifier = evt.identifier;\n            // Trigger a first move.\n            this.processOnMove(evt, true);\n        };\n\n        // In semi mode, we need to verify what to do, do we recycle (if we're in the catch distance),\n        // or do we create a new one and delete the previous one?\n        if (this.options.mode === MODES.semi) {\n            const distance = u.distance(evt.position, joystick.position);\n            if (distance <= this.options.catchDistance) {\n                // We're in the catch distance, we keep this one.\n                process();\n            } else if (_depth < 3) {\n                // We're too far, delete it and start over.\n                joystick.destroy();\n                this.processOnStart(evt, _depth + 1);\n            } else {\n                this.error('Max semi-mode recursion depth reached.');\n            }\n        } else {\n            // In the other modes, we just process it.\n            process();\n        }\n    }\n\n    /**\n     *  Whenever a move event happens.\n     *\n     *  This is called from the Factory.\n     * */\n    processOnMove(evt: DomEvent, animated: boolean = false) {\n        const joystick = this.actives.get(evt.identifier);\n        const scroll = this.factory.scroll;\n\n        // Can happen in multitouch when more touches exist than maxNumberOfJoysticks —\n        // processOnStart rejected the touch but Factory still dispatches move events for it.\n        if (!joystick) {\n            this.error(`Found zombie joystick onMove with identifier ${evt.identifier}`);\n            this.deleteIdentifierFromLists(evt.identifier);\n            return;\n        }\n\n        // If it's not pressed, and not on its way out, just process it as an end event instead.\n        // It can happen if the joystick is in its resting animation.\n        // if (!evt.pressure && !joystick.removeTimeout) {\n        // this.error(\n        //     `Found unpressed joystick ${joystick?.uid} for identifier ${evt.identifier}`,\n        // );\n        // this.processOnEnd(evt);\n        // return;\n        // }\n\n        // If we're on a dynamic page, we need to refresh positions constantly.\n        if (this.options.dynamicPage) {\n            this.reposition();\n        }\n\n        const size = joystick.options.size / 2;\n        // Position of the touch.\n        let pos: Coordinates = {\n            x: evt.position.x,\n            y: evt.position.y,\n        };\n\n        // Freeze the direction we have locked.\n        if (this.options.lockX) {\n            pos.y = joystick.position.y;\n        }\n        if (this.options.lockY) {\n            pos.x = joystick.position.x;\n        }\n\n        let dist = u.distance(pos, joystick.position);\n        const angle = u.angle(pos, joystick.position);\n        const rAngle = u.radians(angle);\n        const force = dist / size;\n\n        // Save the raw data pre-processing/clamping.\n        const raw: { distance: number; position: Coordinates } = {\n            distance: dist,\n            position: pos,\n        };\n\n        let clamped_dist;\n        let clamped_pos;\n\n        if (joystick.options.shape === 'circle') {\n            // In the case of a circle, the distance is the radius (eg. size) of our joystick.\n            clamped_dist = Math.min(dist, size);\n            // The clamped position is the coordinates of the clamped distance, from the center at the given angle.\n            clamped_pos = u.findCoord(joystick.position, clamped_dist, angle);\n        } else {\n            // In the case of a square, we need to clamp the x and y separately.\n            clamped_pos = u.clamp(pos, joystick.position, size);\n            // The clamped distance becomes the distance between the clamped position and the center.\n            clamped_dist = u.distance(clamped_pos, joystick.position);\n        }\n\n        let baseDelta = { x: 0, y: 0 };\n\n        if (this.options.follow) {\n            // If we want the joystick's basis to follow the touch when it reaches outside its bounds.\n            if (dist > size) {\n                const delta_x = pos.x - clamped_pos.x;\n                const delta_y = pos.y - clamped_pos.y;\n                baseDelta = { x: delta_x, y: -delta_y };\n                // Move the joystick's basis to the touch's position.\n                joystick.position.x += delta_x;\n                joystick.position.y += delta_y;\n                // Apply to the CSS.\n                u.extend(joystick.ui.el.style, {\n                    top: `${joystick.position.y - (this.box.top + scroll.y)}px`,\n                    left: `${joystick.position.x - (this.box.left + scroll.x)}px`,\n                });\n\n                // Compute the new distance.\n                dist = u.distance(pos, joystick.position);\n                // No need to apply the clamped position, as we're following the touch.\n            }\n        } else {\n            // Apply the clamped measures.\n            pos = clamped_pos;\n            dist = clamped_dist;\n        }\n\n        // Move the nibble of the joystick.\n        const xPosition = pos.x - joystick.position.x;\n        const yPosition = pos.y - joystick.position.y;\n\n        joystick.frontPosition = {\n            x: xPosition,\n            y: yPosition,\n        };\n\n        // Apply the transformation to the nibble if we're not data only.\n        if (!this.options.dataOnly) {\n            if (animated) {\n                joystick.setTransition(true, () => {\n                    joystick.setTransition(false);\n                });\n            }\n            joystick.ui.front.style.transform = `translate(${xPosition}px,${yPosition}px)`;\n        }\n\n        // Prepare the event.\n        const toSend: JoystickEventData = {\n            position: pos,\n            force,\n            pressure: evt.pressure,\n            distance: dist,\n            angle: {\n                radian: rAngle,\n                degree: angle,\n            },\n            vector: {\n                x: xPosition / size,\n                y: -yPosition / size,\n            },\n            raw,\n            instance: joystick,\n            lockX: this.options.lockX,\n            lockY: this.options.lockY,\n            baseDelta,\n        };\n\n        joystick.computeDirectionAndTriggerEvents(toSend);\n    }\n\n    processOnEnd(evt: DomEvent) {\n        const joystick = this.actives.get(evt.identifier);\n\n        // This should not happen.\n        if (!joystick) {\n            this.error(`Found zombie joystick onEnd with identifier ${evt.identifier}`);\n            this.deleteIdentifierFromLists(evt.identifier);\n            return;\n        }\n\n        // We hide the joystick.\n        joystick.end();\n    }\n\n    /**\n     * Recalculate the zone bounding box and all joystick positions.\n     * Call this after the zone element has been moved, resized, or\n     * when its layout has changed (e.g. entering fullscreen).\n     * This is a lighter alternative to `dynamicPage: true` which\n     * recalculates on every move event.\n     */\n    reposition() {\n        // Refresh scroll position in case layout context changed (e.g. fullscreen)\n        this.factory.scroll = u.getScroll();\n        this.box = this.options.zone.getBoundingClientRect();\n        const scroll = this.factory.scroll;\n        this.all.forEach((joystick) => {\n            if (joystick.options.dataOnly) {\n                return;\n            }\n            const elBox = joystick.ui.el.getBoundingClientRect();\n            joystick.position = {\n                x: scroll.x + elBox.left,\n                y: scroll.y + elBox.top,\n            };\n        });\n    }\n\n    destroy() {\n        if (this.resizeObserver) {\n            this.resizeObserver.disconnect();\n            this.resizeObserver = undefined;\n        }\n        this.unbindEvt(this.options.zone, 'start', this.processOnStart);\n        // Destroy all joysticks.\n        this.all.forEach((joystick) => {\n            joystick.destroy();\n        });\n\n        // Empty the lists.\n        this.all.clear();\n        this.idles.clear();\n        this.actives.clear();\n        this.resting.clear();\n\n        // Events.\n        this.trigger('collectionDestroyed', this);\n        this.off();\n    }\n}\n\nexport default Collection;\n","import type Collection from './Collection';\nimport Factory from './Factory';\nimport Super from './Super';\nimport type { CollectionOptions, LogLevel } from './types';\n\n/**\n * Singleton Factory instance used to create joystick collections\n */\nexport const factory = new Factory();\n\n/**\n * Creates a new Collection of joysticks with the given options\n * @param options Configuration options for creating the joystick collection\n * @returns A Collection instance that manages the created joysticks\n */\nexport const create = (options: CollectionOptions): Collection => {\n    return factory.create(options);\n};\n\n/**\n * Set the log level for nipplejs.\n * - `'debug'` — all logs (verbose)\n * - `'info'` — info, warnings, and errors\n * - `'warning'` — warnings and errors (default)\n * - `'error'` — errors only\n * - `'none'` — silent\n */\nexport const setLogLevel = (level: LogLevel): void => {\n    Super.logLevel = level;\n};\n\n/**\n * Get the current log level.\n */\nexport const getLogLevel = (): LogLevel => {\n    return Super.logLevel;\n};\n\n/**\n * Default export containing the create function and factory instance\n */\nexport default {\n    create,\n    factory,\n    setLogLevel,\n    getLogLevel,\n} as const;\n","import Collection from './Collection';\nimport type Joystick from './Joystick';\nimport Super from './Super';\nimport { MODES } from './constants';\nimport type { CollectionOptions, DomEvent, Identifier, ProcessedEvent, Uid } from './types';\nimport * as u from './utils';\n\n/**\n * Singleton that manages all joystick Collections.\n *\n * Responsible for creating/destroying collections, tracking joysticks across\n * collections, and binding document-level move/end events so that interactions\n * that leave a collection's zone are still handled.\n */\nexport class Factory extends Super {\n    /** Current window scroll position, kept in sync via a scroll listener. */\n    scroll: { x: number; y: number } = u.getScroll();\n    private binded: boolean = false;\n    private joysticksByUid: Map<Uid, Joystick> = new Map();\n    private joysticksByIdentifier: Map<Identifier, Joystick> = new Map();\n    private collections: Set<Collection> = new Set();\n    private resizeHandler: (() => void) | null = null;\n    private scrollHandler: (() => void) | null = null;\n\n    constructor() {\n        super('factory');\n        this.bindResize();\n        this.bindScroll();\n        this.trigger('factoryCreated', this);\n    }\n\n    // Stable references for throttle (avoids creating new closures per event)\n    private repositionAll = () => {\n        this.collections.forEach((collection) => {\n            collection.reposition();\n        });\n    };\n    private refreshScroll = () => {\n        this.scroll = u.getScroll();\n    };\n\n    // Listen for resize, to reposition every joystick\n    private bindResize() {\n        this.resizeHandler = () => u.throttle(this.repositionAll);\n        u.bindEvt(window, 'resize', this.resizeHandler);\n    }\n\n    // Listen for scrolls, so we have a global scroll value\n    // without having to request it all the time.\n    private bindScroll() {\n        this.scrollHandler = () => u.throttle(this.refreshScroll);\n        u.bindEvt(window, 'scroll', this.scrollHandler);\n    }\n\n    // Get a joystick from its uid.\n    // Public API, not used internally.\n    getJoystickByUid(uid: Uid) {\n        return this.joysticksByUid.get(uid);\n    }\n\n    // Get a joystick from its identifier.\n    // Public API, not used internally.\n    getJoystickByIdentifier(identifier: Identifier) {\n        return this.joysticksByIdentifier.get(identifier);\n    }\n\n    // Collection Factory\n    create(options: CollectionOptions): Collection {\n        const collection = new Collection(this, options);\n        // Bind it to bubble the other events up.\n        this.bindCollection(collection);\n        this.collections.add(collection);\n\n        // Initialize the collection.\n        // We do this in order to have the events triggered by the collection during initialisation caught by the factory.\n        // Otherwise, if everything is done in the constructor, we can't listen for created events.\n        collection.init();\n\n        return collection;\n    }\n\n    private removeJoystickFromLists(joystick: Joystick) {\n        this.joysticksByUid.delete(joystick.uid);\n        if (u.isNumber(joystick.identifier)) {\n            this.joysticksByIdentifier.delete(joystick.identifier);\n        }\n    }\n\n    private bindCollection(collection: Collection) {\n        // When a collection gets destroyed, we clean behind.\n        collection.on('collectionDestroyed', (evt) => {\n            // Clean local lists.\n            this.collections.delete(evt.data);\n            evt.data.all.forEach((joystick) => {\n                this.removeJoystickFromLists(joystick);\n            });\n            this.unbindDocument();\n        });\n\n        collection.on('joystickDestroyed', (evt) => {\n            this.removeJoystickFromLists(evt.data);\n            this.unbindDocument();\n        });\n\n        collection.on('end', (evt) => {\n            if (u.isNumber(evt.data.identifier)) {\n                this.joysticksByIdentifier.delete(evt.data.identifier);\n            }\n            this.unbindDocument();\n        });\n\n        collection.on('added', (evt) => {\n            this.joysticksByUid.set(evt.data.uid, evt.data);\n            this.bindDocument();\n        });\n\n        collection.on('attached', (evt) => {\n            this.joysticksByIdentifier.set(evt.data.identifier, evt.data.joystick);\n        });\n\n        // collection.on('detached', (evt) => {\n        //     this.joysticksByIdentifier.delete(evt.data.identifier);\n        // });\n\n        // Other events that we bubble up.\n        collection.on('pressure', (evt) => {\n            this.trigger(`pressure ${evt.target.uid}:pressure`, evt.data);\n        });\n        collection.on('collectionCreated collectionDestroyed', (evt) => {\n            type EvtType = `collectionCreated${string}` & `collectionDestroyed${string}`;\n            const type = `${evt.type} ${evt.data.uid}:${evt.type}`;\n            this.trigger(type as EvtType, evt.data);\n        });\n        collection.on('attached detached', (evt) => {\n            const type = `${evt.type} ${evt.data.joystick.uid}:${evt.type}`;\n            this.trigger(type as `attached${string}` & `detached${string}`, evt.data);\n        });\n        collection.on(\n            'added start shown hidden rested removed end joystickCreated joystickDestroyed',\n            (evt) => {\n                type EvtType = `added${string}` &\n                    `start${string}` &\n                    `shown${string}` &\n                    `hidden${string}` &\n                    `rested${string}` &\n                    `removed${string}` &\n                    `end${string}` &\n                    `joystickCreated${string}` &\n                    `joystickDestroyed${string}`;\n                const type = `${evt.type} ${evt.data.uid}:${evt.type}`;\n                this.trigger(type as EvtType, evt.data);\n            },\n        );\n        collection.on('move', (evt) => {\n            this.trigger(`move ${evt.data.instance.uid}:move`, evt.data);\n        });\n        collection.on('dir dir:up dir:right dir:down dir:left', (evt) => {\n            const type = `${evt.type} ${evt.data.instance.uid}:${evt.type}`;\n            this.trigger(type as `dir${string}`, evt.data);\n        });\n        collection.on('plain plain:up plain:right plain:down plain:left', (evt) => {\n            const type = `${evt.type} ${evt.data.instance.uid}:${evt.type}`;\n            this.trigger(type as `plain${string}`, evt.data);\n        });\n    }\n\n    cleanInactiveTouches(evt: DomEvent) {\n        // Only TouchEvents carry a full list of currently-active touches.\n        // Pointer events fire one event per pointer, so each pointer's own\n        // pointerup/pointercancel handles cleanup — running this logic for\n        // pointer events would incorrectly end every other active joystick.\n        if (!('touches' in evt.initial)) {\n            return;\n        }\n\n        const activeIdentifiers = Array.from(evt.initial.touches).map((t) => t.identifier);\n        this.log(\n            'Cleaning inactive',\n            activeIdentifiers,\n            Array.from(this.joysticksByIdentifier.keys()),\n        );\n\n        // Snapshot entries to avoid mutating the map while iterating.\n        const entries = Array.from(this.joysticksByIdentifier.entries());\n        for (const [identifier, joystick] of entries) {\n            // No need to clean if the collection is static or semi.\n            if (joystick.collection.options.mode !== MODES.dynamic) {\n                continue;\n            }\n\n            // If we don't find a saved identifier in the list of touches\n            // that are currently active on the event,\n            // we trigger an end event on it.\n            if (!activeIdentifiers.includes(identifier)) {\n                if (!joystick) {\n                    this.error(`No collection found for cleaning identifier ${identifier}`);\n                    return;\n                }\n                this.log('💣 Cleaning', identifier);\n                // Build a synthetic event reusing the current event's position\n                // but with the inactive identifier. We extract specific properties\n                // because spreading native event objects doesn't copy prototype props.\n                const raw = evt.raw;\n                joystick.collection.processOnEnd(\n                    u.processEvent(evt.initial, {\n                        identifier,\n                        pageX: raw.pageX,\n                        pageY: raw.pageY,\n                        clientX: raw.clientX,\n                        clientY: raw.clientY,\n                    } as unknown as ProcessedEvent),\n                );\n            }\n        }\n    }\n\n    bindDocument() {\n        // Bind only if not already binded\n        if (!this.binded) {\n            this.log('bind dom');\n            this.bindEvt(document, 'start', this.onstart);\n            this.bindEvt(document, 'move', this.onmove);\n            this.bindEvt(document, 'end', this.onend);\n            this.bindEvt(document, 'pressure', this.onpressure);\n            this.binded = true;\n        }\n    }\n\n    unbindDocument(force: boolean = false) {\n        // If there are no touch left unbind the document.\n        if (this.binded && (!this.joysticksByUid.size || force === true)) {\n            this.log(`${force ? 'force ' : ''}unbind dom`);\n            this.unbindEvt(document, 'start', this.onstart);\n            this.unbindEvt(document, 'move', this.onmove);\n            this.unbindEvt(document, 'end', this.onend);\n            this.unbindEvt(document, 'pressure', this.onpressure);\n            this.binded = false;\n        }\n    }\n\n    private onstart(evt: DomEvent) {\n        // Each collection handles its own start event on their respective zones.\n        // Clean the inactive touches.\n        this.cleanInactiveTouches(evt);\n    }\n\n    private onmove(evt: DomEvent) {\n        this.handleEventInCollection(evt, (coll) => {\n            coll.processOnMove(evt);\n        });\n    }\n\n    private onend(evt: DomEvent) {\n        // Clean the inactive touches.\n        this.cleanInactiveTouches(evt);\n        // Proceed with each collection.\n        this.handleEventInCollection(evt, (coll) => {\n            coll.processOnEnd(evt);\n        });\n    }\n\n    private onpressure(evt: DomEvent) {\n        evt.initial.preventDefault();\n        const joystick = this.joysticksByIdentifier.get(evt.identifier);\n        if (!joystick) {\n            this.error(`No joystick found for pressure event ${evt.identifier}`);\n            return;\n        }\n        joystick.pressure = evt.pressure;\n    }\n\n    private handleEventInCollection(evt: DomEvent, cb: (coll: Collection) => void) {\n        const joystick = this.joysticksByIdentifier.get(evt.identifier);\n\n        // If the event doesn't have any joystick, we don't call any.\n        if (!joystick) {\n            return;\n        }\n\n        cb(joystick.collection);\n    }\n\n    // Cleanly destroy the factory\n    destroy() {\n        this.unbindDocument(true);\n        this.collections.forEach((collection) => {\n            collection.destroy();\n        });\n        // Unbind window listeners.\n        if (this.resizeHandler) {\n            u.unbindEvt(window, 'resize', this.resizeHandler);\n            this.resizeHandler = null;\n        }\n        if (this.scrollHandler) {\n            u.unbindEvt(window, 'scroll', this.scrollHandler);\n            this.scrollHandler = null;\n        }\n        this.trigger('factoryDestroyed', this);\n        // Clear all the event listeners.\n        this.off();\n    }\n}\n\nexport default Factory;\n"],"names":["MODES","IS_TOUCH","window","EVENTS_TO_BIND","start","move","end","pressure","primaryBind","secondaryBind","PointerEvent","PRIMARY_BIND","SECONDARY_BIND","ANGLE_45","Math","PI","ANGLE_90","distance","p1","p2","dx","x","dy","y","sqrt","radians","a","degrees","timers","Map","throttle","cb","has","clearTimeout","get","set","setTimeout","bindEvt","el","arg","handler","types","split","i","length","addEventListener","unbindEvt","removeEventListener","getPressureFromEvt","evt","force","webkitForce","buttons","processEvent","processedEvt","identifier","pointerId","isTouch","position","pageX","pageY","type","initial","raw","getScroll","scrollX","scrollY","applyPosition","pos","left","top","right","bottom","extend","style","isNumber","configStylePropertyObject","prop","value","objA","objB","Object","hasOwn","isNaN","LOG_LEVELS","debug","info","warning","error","none","currentLogLevel","Super","constructor","name","this","uid","index","_domHandlers_","_handlers_","log","mapOnEvents","on","Set","add","off","delete","trigger","data","handlers","size","snapshot","call","target","domEvt","toLowerCase","includes","preventDefault","domEvents","touch","Array","from","changedTouches","push","map","u.processEvents","u.bindEvt","u.unbindEvt","logPrefix","super","joystick","collection","factory","logSuffix","logLevel","level","args","console","warn","_Joystick","options","direction","defaults","threshold","color","fadeTime","dataOnly","restJoystick","restOpacity","mode","zone","document","body","lockX","lockY","shape","frontPosition","ui","createElement","back","front","init","buildEl","_identifier","u.isNumber","resolveColors","className","setAttribute","appendChild","animTime","borderStyle","u.configStylePropertyObject","transitStyle","colors","u.extend","opacity","toString","display","zIndex","touchAction","userSelect","width","height","marginLeft","marginTop","background","transform","_pressure","startPressureInterval","pressureInterval","setInterval","u.getPressureFromEvt","stopPressureInterval","clearInterval","addToDom","contains","removeFromDom","removeChild","clearTimeouts","removeTimeout","showTimeout","restTimeout","activeTimeout","requestAnimationFrame","resetDirection","rest","newPosition","setPosition","destroy","setTransition","animated","activeTime","computeDirectionAndTriggerEvents","obj","rAngle","angle","radian","u.radians","degree","triggerDirectionEvents","oldDirection","Joystick","_Collection","all","idles","actives","resting","parentIsFlex","catchDistance","dynamicPage","follow","maxNumberOfJoysticks","multitouch","computedStyle","parentElement","getComputedStyle","box","getBoundingClientRect","processOnStart","webkitUserSelect","ResizeObserver","resizeObserver","reposition","observe","createJoystick","getJoystickByUid","values","next","bindJoystick","deleteJoystickFromLists","deleteIdentifierFromLists","instance","deleteUidFromLists","getOrCreate","idleUid","scroll","offset","toApply","stub","visibility","stubBox","u.applyPosition","_depth","process","processOnMove","u.distance","dist","atan2","u.angle","clamped_dist","clamped_pos","min","p","d","aInRad","cos","sin","u.findCoord","joystickPos","max","u.clamp","baseDelta","delta_x","delta_y","xPosition","yPosition","toSend","vector","processOnEnd","u.getScroll","forEach","elBox","disconnect","clear","Collection","binded","joysticksByUid","joysticksByIdentifier","collections","resizeHandler","scrollHandler","repositionAll","refreshScroll","bindResize","bindScroll","u.throttle","getJoystickByIdentifier","create","bindCollection","removeJoystickFromLists","unbindDocument","bindDocument","cleanInactiveTouches","activeIdentifiers","touches","t","keys","entries","u.processEvent","clientX","clientY","onstart","onmove","onend","onpressure","handleEventInCollection","coll","setLogLevel","getLogLevel"],"mappings":"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"}