{"version":3,"file":"Input.mjs","sources":["../src/Input.ts"],"sourcesContent":["import {\n    Color,\n    Container,\n    DestroyOptions,\n    Graphics,\n    isMobile,\n    NineSliceSprite,\n    Optional,\n    Size,\n    Sprite,\n    Text,\n    Texture,\n    Ticker,\n} from 'pixi.js';\nimport { Signal } from 'typed-signals';\nimport { PixiText, PixiTextClass, PixiTextStyle } from './utils/helpers/text';\nimport { getView } from './utils/helpers/view';\nimport { ALIGN, type Padding } from './utils/HelpTypes';\n\ntype ViewType = Sprite | Graphics | Texture | string;\n\nexport type InputAlign = typeof ALIGN[number];\n\nexport type InputOptions = {\n    bg: ViewType;\n    textStyle?: PixiTextStyle;\n    TextClass?: PixiTextClass;\n    placeholder?: string;\n    value?: string;\n    maxLength?: number;\n    secure?: boolean;\n    align?: InputAlign;\n    padding?: Padding;\n    cleanOnFocus?: boolean;\n    nineSliceSprite?: [number, number, number, number];\n    addMask?: boolean;\n};\n\nconst SECURE_CHARACTER = '*';\n\n/**\n * Container-based component that creates an input to read the user's text.\n * @example\n * new Input({\n *     bg: Sprite.from('input.png'),\n *     placeholder: 'Enter text',\n *     padding: {\n *      top: 11,\n *      right: 11,\n *      bottom: 11,\n *      left: 11\n *     } // alternatively you can use [11, 11, 11, 11] or [11, 11] or just 11\n * });\n */\nexport class Input extends Container\n{\n    protected _bg?: Container | NineSliceSprite | Graphics;\n    protected inputMask: Container | NineSliceSprite | Graphics | undefined;\n    protected _cursor: Sprite | undefined;\n    protected _value: string = '';\n    protected _secure: boolean = false;\n    protected inputField: PixiText | undefined;\n    protected placeholder: PixiText | undefined;\n    protected editing = false;\n    protected tick = 0;\n    protected lastInputData: string = '';\n\n    protected activation = false;\n    protected readonly options: InputOptions;\n    protected input: HTMLInputElement | undefined;\n\n    protected handleActivationBinding = this.handleActivation.bind(this);\n    protected onKeyUpBinding = this.onKeyUp.bind(this);\n    protected stopEditingBinding = this.stopEditing.bind(this);\n    protected onInputBinding = this.onInput.bind(this);\n    protected onPasteBinding = this.onPaste.bind(this);\n\n    /** Fires when input loses focus. */\n    onEnter: Signal<(text: string) => void>;\n\n    /** Fires every time input string is changed. */\n    onChange: Signal<(text: string) => void>;\n\n    /** Top side padding */\n    paddingTop = 0;\n\n    /** Right side padding */\n    paddingRight = 0;\n\n    /** Bottom side padding */\n    paddingBottom = 0;\n\n    /** Left side padding */\n    paddingLeft = 0;\n\n    /**\n     * Creates an input.\n     * @param { number } options - Options object to use.\n     * @param { Sprite | Graphics | Texture | string } options.bg - Background of the Input.\n     * <br> Can be a string (name of texture) or an instance of Texture, Sprite or Graphics.\n     * <br> If you want to use NineSliceSprite, you have to pass a text (name of texture)\n     * or an instance of Texture as a parameter.\n     * @param { PixiTextStyle } options.textStyle - Text style of the Input.\n     * @param { string } options.placeholder - Placeholder of the Input.\n     * @param { string } options.value - Value of the Input.\n     * @param { number } options.maxLength - Max length of the Input.\n     * @param { 'left' | 'center' | 'right' } options.align - Align of the Input.\n     * @param { Padding } options.padding - Padding of the Input.\n     * @param { number } options.padding.top - Top padding of the Input.\n     * @param { number } options.padding.right - Right padding of the Input.\n     * @param { number } options.padding.bottom - Bottom padding of the Input.\n     * @param { number } options.padding.left - Left padding of the Input.\n     * @param { boolean } options.cleanOnFocus - Clean Input on focus.\n     * @param { boolean } options.addMask - Add mask to the Input text, so it is cut off when it does not fit.\n     * @param { Array } options.nineSliceSprite - NineSliceSprite values for bg and fill ([number, number, number, number]).\n     * <br> <b>!!! IMPORTANT:</b> To make it work, you have to pass a texture name or texture instance as a bg parameter.\n     */\n    constructor(options: InputOptions)\n    {\n        super();\n\n        // Establish sensible defaults for all input options\n        // to avoid null checks throughout the component\n        const defaultOptions: InputOptions = {\n            bg: Texture.WHITE,\n            textStyle: {\n                fill: 0x000000,\n                align: 'center',\n            },\n            TextClass: Text,\n            placeholder: '',\n            value: '',\n            maxLength: undefined,\n            secure: false,\n            align: 'left',\n            padding: 0,\n            cleanOnFocus: false,\n            addMask: false,\n        };\n\n        this.options = { ...defaultOptions, ...options };\n\n        const { padding = 0, secure = false } = this.options;\n\n        this.padding = padding;\n        this._secure = secure;\n\n        this.cursor = 'text';\n        this.interactive = true;\n\n        this.on('pointertap', () =>\n        {\n            this.activation = true;\n            isMobile.any && this.handleActivation(); // handleActivation always call before this function called.\n        });\n\n        window.addEventListener(isMobile.any ? 'touchstart' : 'click', this.handleActivationBinding);\n\n        this.onEnter = new Signal();\n        this.onChange = new Signal();\n\n        Ticker.shared.add((ticker) => this.update(ticker.deltaTime));\n\n        if (options.bg)\n        {\n            this.bg = options.bg;\n        }\n        else\n        {\n            console.error('Input: bg is not defined, please define it.');\n        }\n    }\n\n    protected onInput(e: InputEvent)\n    {\n        this.lastInputData = e.data ?? '';\n    }\n\n    protected onKeyUp(e: KeyboardEvent)\n    {\n        const key = e.key;\n\n        const keysToSkip = [\n            'Shift', 'Control', 'Alt', 'Meta',\n            'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown',\n            'CapsLock', 'AltGraph', 'Tab', 'ContextMenu',\n            'F1', 'F2', 'F3', 'F4', 'F5', 'F6', 'F7', 'F8', 'F9', 'F10', 'F11', 'F12',\n            'ScrollLock', 'Pause', 'Insert', 'Delete', 'Home',\n            'End', 'PageUp', 'PageDown', 'NumLock', 'Dead'\n        ];\n\n        if (keysToSkip.includes(key)) return;\n\n        if (e.metaKey) return;\n        if (e.ctrlKey) return;\n\n        if (key === 'Backspace')\n        {\n            this._delete();\n        }\n        else if (key === 'Escape' || key === 'Enter')\n        {\n            this.stopEditing();\n        }\n        else if (key.length === 1)\n        {\n            this._add(key);\n        }\n        else if (this.lastInputData && this.lastInputData.length === 1)\n        {\n            this._add(this.lastInputData);\n        }\n\n        if (this.input)\n        {\n            this.input.value = '';\n        }\n    }\n\n    protected init()\n    {\n        const {\n            textStyle = { fill: 0x000000, align: 'center' },\n            TextClass = Text,\n            placeholder = ''\n        } = this.options;\n\n        const colorSource = textStyle.fill && Color.isColorLike(textStyle.fill)\n            ? textStyle.fill\n            : 0x000000;\n\n        this.inputField = new TextClass({\n            text: '',\n            style: textStyle,\n        });\n\n        this._cursor = new Sprite(Texture.WHITE);\n\n        this._cursor.tint = colorSource;\n        this._cursor.anchor.set(0.5);\n        this._cursor.width = 2;\n        this._cursor.height = this.inputField.height * 0.8;\n        this._cursor.alpha = 0;\n\n        this.placeholder = new TextClass({\n            text: placeholder,\n            style: textStyle,\n        });\n        this.placeholder.visible = !!placeholder;\n\n        this.addChild(this.inputField, this.placeholder, this._cursor);\n\n        this.value = this.options.value ?? '';\n\n        this.align();\n    }\n\n    set bg(bg: ViewType)\n    {\n        if (this._bg)\n        {\n            this._bg.destroy();\n        }\n\n        // Use Texture.WHITE as fallback if bg is undefined\n        const bgValue = bg ?? Texture.WHITE;\n\n        if (this.options?.nineSliceSprite)\n        {\n            if (typeof bgValue === 'string')\n            {\n                this._bg = new NineSliceSprite({\n                    texture: Texture.from(bgValue),\n                    leftWidth: this.options.nineSliceSprite[0],\n                    topHeight: this.options.nineSliceSprite[1],\n                    rightWidth: this.options.nineSliceSprite[2],\n                    bottomHeight: this.options.nineSliceSprite[3],\n                });\n            }\n            else if (bgValue instanceof Texture)\n            {\n                this._bg = new NineSliceSprite({\n                    texture: bgValue,\n                    leftWidth: this.options.nineSliceSprite[0],\n                    topHeight: this.options.nineSliceSprite[1],\n                    rightWidth: this.options.nineSliceSprite[2],\n                    bottomHeight: this.options.nineSliceSprite[3],\n                });\n            }\n            else\n            {\n                console.warn(`NineSliceSprite can not be used with views set as Container.\n                    Pass the texture or texture name as instead of the Container extended instance.`);\n            }\n        }\n\n        if (!this._bg)\n        {\n            this._bg = getView(bgValue);\n        }\n\n        this._bg.cursor = 'text';\n        this._bg.interactive = true;\n\n        this.addChildAt(this._bg, 0);\n\n        if (!this.inputField)\n        {\n            this.init();\n        }\n\n        if (this.options.addMask)\n        {\n            this.createInputMask(bg);\n        }\n    }\n\n    get bg(): Container | NineSliceSprite | Graphics | undefined\n    {\n        return this._bg;\n    }\n\n    protected _add(key: string): void\n    {\n        if (!this.editing)\n        {\n            return;\n        }\n\n        if (this.options.maxLength && this.value.length >= this.options.maxLength)\n        {\n            return;\n        }\n\n        this.value = this.value + key;\n\n        this.onChange.emit(this.value);\n    }\n\n    protected _delete(): void\n    {\n        const length = this.value.length;\n\n        if (!this.editing || length === 0) return;\n\n        this.value = this.value.substring(0, length - 1);\n\n        this.onChange.emit(this.value);\n    }\n\n    protected _startEditing(): void\n    {\n        if (this.options.cleanOnFocus)\n        {\n            this.value = '';\n        }\n\n        this.tick = 0;\n        this.editing = true;\n        if (this.placeholder)\n        {\n            this.placeholder.visible = false;\n        }\n        if (this._cursor)\n        {\n            this._cursor.alpha = 1;\n        }\n\n        this.createInputField();\n\n        this.align();\n    }\n\n    protected createInputField()\n    {\n        if (this.input)\n        {\n            this.input.removeEventListener('blur', this.stopEditingBinding);\n            this.input.removeEventListener('keydown', this.onKeyUpBinding);\n            this.input.removeEventListener('input', this.onInputBinding as EventListener);\n            this.input.removeEventListener('paste', this.onPasteBinding);\n\n            this.input?.blur();\n            this.input?.remove();\n            this.input = undefined;\n        }\n\n        const input: HTMLInputElement = document.createElement('input');\n\n        document.body.appendChild(input);\n\n        input.style.position = 'fixed';\n        input.style.left = `${this.getGlobalPosition().x}px`;\n        input.style.top = `${this.getGlobalPosition().y}px`;\n        input.style.opacity = '0.0000001';\n        input.style.width = `${this._bg?.width ?? 100}px`;\n        input.style.height = `${this._bg?.height ?? 30}px`;\n        input.style.border = 'none';\n        input.style.outline = 'none';\n        input.style.background = 'white';\n\n        // This hack fixes instant hiding keyboard on mobile after showing it\n        if (isMobile.android.device)\n        {\n            setTimeout(() =>\n            {\n                input.focus();\n                input.click();\n            }, 100);\n        }\n        else\n        {\n            input.focus();\n            input.click();\n        }\n\n        input.addEventListener('blur', this.stopEditingBinding);\n        input.addEventListener('keydown', this.onKeyUpBinding);\n        input.addEventListener('input', this.onInputBinding as EventListener);\n        input.addEventListener('paste', this.onPasteBinding);\n\n        this.input = input;\n\n        this.align();\n    }\n\n    protected handleActivation()\n    {\n        if (this.editing) return;\n\n        this.stopEditing();\n\n        if (this.activation)\n        {\n            this._startEditing();\n\n            this.activation = false;\n        }\n    }\n\n    protected stopEditing(): void\n    {\n        if (!this.editing) return;\n\n        if (this._cursor)\n        {\n            this._cursor.alpha = 0;\n        }\n        this.editing = false;\n\n        if (this.placeholder && this.value.length === 0)\n        {\n            this.placeholder.visible = true;\n        }\n\n        this.input?.blur();\n        this.input?.remove();\n        this.input = undefined;\n\n        this.align();\n\n        this.onEnter.emit(this.value);\n    }\n\n    protected update(dt: number): void\n    {\n        if (!this.editing) return;\n        this.tick += dt * 0.1;\n        if (this._cursor)\n        {\n            this._cursor.alpha = Math.round((Math.sin(this.tick) * 0.5) + 0.5);\n        }\n    }\n\n    protected align()\n    {\n        if (!this._bg) return;\n\n        const align = this.getAlign();\n\n        if (this.inputField)\n        {\n            this.inputField.anchor.set(align, 0.5);\n            this.inputField.x\n                = (this._bg.width * align) + (align === 1 ? -this.paddingRight : this.paddingLeft);\n            this.inputField.y = (this._bg.height / 2) + this.paddingTop - this.paddingBottom;\n        }\n\n        if (this.placeholder)\n        {\n            this.placeholder.anchor.set(align, 0.5);\n            this.placeholder.x\n                = (this._bg.width * align) + (align === 1 ? -this.paddingRight : this.paddingLeft);\n            this.placeholder.y = this._bg.height / 2;\n        }\n\n        if (this._cursor && this.inputField)\n        {\n            this._cursor.x = this.getCursorPosX();\n            this._cursor.y = this.inputField.y;\n        }\n    }\n\n    protected getAlign(): 0 | 1 | 0.5\n    {\n        if (!(this._bg && this.inputField)) return 0;\n\n        const maxWidth = this._bg.width * 0.95;\n        const paddings = this.paddingLeft + this.paddingRight - 10;\n        const isOverflowed = this.inputField.width + paddings > maxWidth;\n\n        if (isOverflowed)\n        {\n            return this.editing ? 1 : 0;\n        }\n        switch (this.options.align)\n        {\n            case 'left':\n                return 0;\n            case 'center':\n                return 0.5;\n            case 'right':\n                return 1;\n            default:\n                return 0;\n        }\n    }\n\n    protected getCursorPosX()\n    {\n        if (!this.inputField) return 0;\n\n        const align = this.getAlign();\n\n        switch (align)\n        {\n            case 0:\n                return this.inputField.x + this.inputField.width;\n            case 0.5:\n                return this.inputField.x + (this.inputField.width * 0.5);\n            case 1:\n                return this.inputField.x;\n            default:\n                return 0;\n        }\n    }\n\n    /** Sets the input text. */\n    set value(text: string)\n    {\n        const textLength = text.length;\n\n        this._value = text;\n\n        if (this.inputField)\n        {\n            this.inputField.text = this.secure ? SECURE_CHARACTER.repeat(textLength) : text;\n        }\n\n        if (this.placeholder)\n        {\n            this.placeholder.visible = textLength === 0 && !this.editing;\n        }\n\n        this.align();\n    }\n\n    /** Return text of the input. */\n    get value(): string\n    {\n        return this._value;\n    }\n\n    set secure(val: boolean)\n    {\n        this._secure = val;\n\n        // Update text based on secure state (useful for show/hide password implementations)\n        this.value = this._value;\n    }\n\n    get secure(): boolean\n    {\n        return this._secure;\n    }\n\n    /**\n     * Set paddings\n     * @param value - number, array of 4 numbers or object with keys: top, right, bottom, left\n     * or: [top, right, bottom, left]\n     * or: [top&bottom, right&left]\n     * or: {\n     *  left: 10,\n     *  right: 10,\n     *  top: 10,\n     *  bottom: 10,\n     * }\n     */\n    set padding(value: Padding)\n    {\n        if (typeof value === 'number')\n        {\n            this.paddingTop = value;\n            this.paddingRight = value;\n            this.paddingBottom = value;\n            this.paddingLeft = value;\n        }\n\n        if (Array.isArray(value))\n        {\n            this.paddingTop = value[0] ?? 0;\n            this.paddingRight = value[1] ?? value[0] ?? 0;\n            this.paddingBottom = value[2] ?? value[0] ?? 0;\n            this.paddingLeft = value[3] ?? value[1] ?? value[0] ?? 0;\n        }\n        else if (typeof value === 'object')\n        {\n            this.paddingTop = value.top ?? 0;\n            this.paddingRight = value.right ?? 0;\n            this.paddingBottom = value.bottom ?? 0;\n            this.paddingLeft = value.left ?? 0;\n        }\n    }\n\n    // Return array of paddings [top, right, bottom, left]\n    get padding(): [number, number, number, number]\n    {\n        return [this.paddingTop, this.paddingRight, this.paddingBottom, this.paddingLeft];\n    }\n\n    override destroy(options?: DestroyOptions | boolean)\n    {\n        this.off('pointertap');\n\n        window.removeEventListener(isMobile.any ? 'touchstart' : 'click', this.handleActivationBinding);\n\n        super.destroy(options);\n    }\n\n    /**\n     * Sets width of a Input.\n     * If nineSliceSprite is set, then width will be set to nineSliceSprite.\n     * If nineSliceSprite is not set, then width will control components width as Container.\n     * @param width - Width value.\n     */\n    override set width(width: number)\n    {\n        if (this.options?.nineSliceSprite)\n        {\n            if (this._bg)\n            {\n                this._bg.width = width;\n            }\n\n            this.updateInputMaskSize();\n\n            this.align();\n        }\n        else\n        {\n            super.width = width;\n        }\n    }\n\n    /** Gets width of Input. */\n    override get width(): number\n    {\n        return super.width;\n    }\n\n    /**\n     * Sets height of a Input.\n     * If nineSliceSprite is set, then height will be set to nineSliceSprite.\n     * If nineSliceSprite is not set, then height will control components height as Container.\n     * @param height - Height value.\n     */\n    override set height(height: number)\n    {\n        if (this.options?.nineSliceSprite)\n        {\n            if (this._bg)\n            {\n                this._bg.height = height;\n            }\n\n            this.updateInputMaskSize();\n\n            this.align();\n        }\n        else\n        {\n            super.height = height;\n        }\n    }\n\n    /** Gets height of Input. */\n    override get height(): number\n    {\n        return super.height;\n    }\n\n    override setSize(value: number | Optional<Size, 'height'>, height?: number): void\n    {\n        if (this.options?.nineSliceSprite)\n        {\n            if (this._bg)\n            {\n                this._bg.setSize(value, height);\n            }\n\n            this.updateInputMaskSize();\n            this.align();\n        }\n        else\n        {\n            super.setSize(value, height);\n        }\n    }\n\n    protected createInputMask(bg: ViewType)\n    {\n        if (this.inputMask)\n        {\n            if (this.inputField)\n            {\n                this.inputField.mask = null; // PixiJS API expects null\n            }\n            if (this._cursor)\n            {\n                this._cursor.mask = null; // PixiJS API expects null\n            }\n            this.inputMask.destroy();\n        }\n\n        if (this.options?.nineSliceSprite && typeof bg === 'string')\n        {\n            this.inputMask = new NineSliceSprite({\n                texture: Texture.from(bg),\n                leftWidth: this.options.nineSliceSprite[0],\n                topHeight: this.options.nineSliceSprite[1],\n                rightWidth: this.options.nineSliceSprite[2],\n                bottomHeight: this.options.nineSliceSprite[3],\n            });\n        }\n        else if (bg instanceof Sprite)\n        {\n            this.inputMask = new Sprite(bg.texture);\n        }\n        else if (bg instanceof Graphics)\n        {\n            this.inputMask = bg.clone(true);\n        }\n        else\n        {\n            this.inputMask = getView(bg);\n        }\n\n        if (this.inputField)\n        {\n            this.inputField.mask = this.inputMask;\n        }\n\n        if (this._cursor)\n        {\n            this._cursor.mask = this.inputMask;\n        }\n\n        this.updateInputMaskSize();\n\n        this.addChildAt(this.inputMask, 0);\n    }\n\n    protected updateInputMaskSize()\n    {\n        if (!this.inputMask || !this._bg) return;\n\n        this.inputMask.setSize(\n            this._bg.width - this.paddingLeft - this.paddingRight,\n            this._bg.height - this.paddingTop - this.paddingBottom,\n        );\n\n        this.inputMask.position.set(this.paddingLeft, this.paddingTop);\n    }\n\n    protected onPaste(e: ClipboardEvent)\n    {\n        e.preventDefault();\n\n        const text = (e.clipboardData || (window as any).clipboardData).getData('text');\n\n        if (!text) return;\n\n        this._add(text);\n    }\n}\n"],"names":[],"mappings":"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"}