{"version":3,"file":"FancyButton.mjs","sources":["../src/FancyButton.ts"],"sourcesContent":["/* eslint-disable max-len */\nimport {\n    Container,\n    isMobile,\n    NineSliceSprite,\n    ObservablePoint,\n    Rectangle,\n    Texture,\n    Ticker,\n} from 'pixi.js';\nimport { Group, Tween } from 'tweedle.js';\nimport { ButtonContainer } from './Button';\nimport { fitToView } from './utils/helpers/fit';\nimport { AnyText, getTextView, PixiText } from './utils/helpers/text';\nimport { getView, type GetViewSettings } from './utils/helpers/view';\n\nimport type { Optional, Size, Sprite } from 'pixi.js';\n\ntype State = 'default' | 'hover' | 'pressed' | 'disabled';\ntype Pos = { x?: number; y?: number };\ntype PosList = { [K in State]?: Pos };\n\nexport type Offset = Pos & PosList;\n\ntype ButtonViewType = 'defaultView' | 'hoverView' | 'pressedView' | 'disabledView';\n\ntype BasicButtonViews = {\n    [K in ButtonViewType]?: Container | NineSliceSprite;\n};\n\ntype ButtonViews = BasicButtonViews & {\n    textView?: PixiText;\n    iconView?: Container;\n};\n\ntype AnimationData = {\n    x?: number;\n    y?: number;\n    width?: number;\n    height?: number;\n    scale?: Pos;\n};\n\ntype Animation = {\n    props: AnimationData;\n    duration?: number;\n};\n\ntype StateAnimations = {\n    [K in State]?: Animation;\n};\n\ntype BasicViewsInput = {\n    [K in ButtonViewType]?: GetViewSettings;\n};\n\ntype ViewsInput = BasicViewsInput & {\n    text?: AnyText;\n    icon?: GetViewSettings;\n};\n\nexport type ContentFittingMode =\n    // Fits the text/icon content inside the button.\n    | 'default'\n    // Fill the button with the text/icon content, scaling it up to fill the view space with padding accounted for.\n    | 'fill'\n    // Only apply the default scaling and anchoring, without constraining to the button view's dimensions.\n    | 'none';\n\nexport type ButtonOptions = ViewsInput & {\n    padding?: number;\n    scale?: number;\n    anchor?: number;\n    anchorX?: number;\n    anchorY?: number;\n    offset?: Offset;\n    textOffset?: Offset;\n    iconOffset?: Offset;\n    defaultTextScale?: Pos | number;\n    defaultIconScale?: Pos | number;\n    defaultTextAnchor?: Pos | number;\n    defaultIconAnchor?: Pos | number;\n    animations?: StateAnimations;\n    nineSliceSprite?: [number, number, number, number];\n    contentFittingMode?: ContentFittingMode;\n\n    /** @deprecated refer to contentFittingMode instead */\n    ignoreRefitting?: boolean;\n};\n\n/**\n * Button component with a lot of tweaks.\n *\n * All views, text, icon and animations are optional. You can set them via constructor or update later.\n *\n * By default text view and icon view are centered in the active view.\n *\n * Offset property of the constructor can be used to adjust the position of the text, icon and the views.\n * @example\n * const button = new FancyButton({\n *     defaultView: `button.png`,\n *     hoverView: `button_hover.png`,\n *     pressedView: `button_pressed.png`,\n *     text: 'Click me!',\n *     animations: {\n *          hover: {\n *              props: {\n *                  scale: {\n *                      x: 1.1,\n *                      y: 1.1,\n *                  }\n *              },\n *              duration: 100,\n *          },\n *          pressed: {\n *              props: {\n *                  scale: {\n *                      x: 0.9,\n *                      y: 0.9,\n *                  }\n *              },\n *              duration: 100,\n *          }\n *      }\n * });\n *\n * button.onPress.connect(() => console.log('Button pressed!'));\n */\nexport class FancyButton extends ButtonContainer\n{\n    protected animations!: StateAnimations;\n    protected originalInnerViewState!: AnimationData;\n    protected defaultDuration = 100;\n\n    /** FancyButton options. */\n    protected readonly options: ButtonOptions;\n\n    /** Padding of the button text view. If button text does not fit active view + padding it will scale down to fit. */\n    _padding: number = 0;\n\n    /** Offset of the button state views. If state views have different sizes, this option can help adjust them. */\n    _offset: Offset & Pos = {};\n\n    /** Offset of the text view. Can be set to any state of the button. */\n    _textOffset: Offset = {};\n\n    /** Offset of the icon view. Can be set to any state of the button. */\n    iconOffset: Offset = {};\n\n    //* View that holds all button inner views */\n    innerView = new Container();\n\n    protected _views: ButtonViews = {};\n\n    /** State of the button. Possible valuers are: 'default', 'hover', 'pressed', 'disabled' */\n    state: State = 'default';\n\n    /** Anchor point of the button. */\n    anchor: ObservablePoint;\n\n    /** Base text scaling to take into account when fitting inside the button */\n    protected _defaultTextScale: Pos = { x: 1, y: 1 };\n\n    /** Base icon scaling to take into account when fitting inside the button */\n    protected _defaultIconScale: Pos = { x: 1, y: 1 };\n\n    /** Base text anchor to take into account when fitting and placing inside the button */\n    protected _defaultTextAnchor: Pos = { x: 0.5, y: 0.5 };\n\n    /** Base icon anchor to take into account when fitting and placing inside the button */\n    protected _defaultIconAnchor: Pos = { x: 0.5, y: 0.5 };\n\n    /**\n     * Creates a button with a lot of tweaks.\n     * @param {object} options - Button options.\n     * @param { string | Texture | Container | Sprite | Graphics } options.defaultView - Container-based view that is shown when non of the button events are active.\n     *                                                                                   <br> Can be a string (name of texture) or an instance of Texture, Container, Sprite or Graphics.\n     *                                                                                   <br> If you want to use NineSliceSprite, you have to pass a text (name of texture) or an instance of Texture as a parameter here.\n     * @param { string | Texture | Container | Sprite | Graphics } options.hoverView - Container-based view that is shown when the mouse hovers over the button.\n     *                                                                                   <br> Can be a string (name of texture) or an instance of Texture, Container, Sprite or Graphics.\n     *                                                                                   <br> If you want to use NineSliceSprite, you have to pass a text (name of texture) or an instance of Texture as a parameter here.\n     * @param { string | Texture | Container | Sprite | Graphics } options.pressedView - Container-based view, shown when the mouse press on the component.\n     *                                                                                   <br> Can be a string (name of texture) or an instance of Texture, Container, Sprite or Graphics.\n     *                                                                                   <br> If you want to use NineSliceSprite, you have to pass a text (name of texture) or an instance of Texture as a parameter here.\n     * @param { string | Texture | Container | Sprite | Graphics } options.disabledView - Container-based view shown when the button is disabled.\n     *                                                                                   <br> Can be a string (name of texture) or an instance of Texture, Container, Sprite or Graphics.\n     *                                                                                   <br> If you want to use NineSliceSprite, you have to pass a text (name of texture) or an instance of Texture as a parameter here.\n     * @param { string | Texture | Container | Sprite | Graphics } options.icon - Container-based view for the button icon.\n     * @param {Text} options.text - Text-based view for the button text.\n     * @param {number} options.padding - Padding of the button text and icon views.\n     * If button text or icon does not fit active view + padding it will scale down to fit.\n     * @param {Point} options.offset - Offset of the button state views.\n     * @param {Point} options.textOffset - Offset of the text view.\n     * @param {Point} options.iconOffset - Offset of the icon view.\n     * @param {number} options.scale - Scale of the button. Scale will be applied to a main container,\n     * when all animations scales will be applied to the inner view.\n     * @param {number} options.defaultTextScale - Base text scaling to take into account when fitting inside the button.\n     * @param {number} options.defaultIconScale - Base icon scaling to take into account when fitting inside the button.\n     * @param {number} options.defaultTextAnchor - Base text anchor to take into account when fitting and placing inside the button.\n     * @param {number} options.defaultIconAnchor - Base icon anchor to take into account when fitting and placing inside the button.\n     * @param {number} options.anchor - Anchor point of the button.\n     * @param {number} options.anchorX - Horizontal anchor point of the button.\n     * @param {number} options.anchorY - Vertical anchor point of the button.\n     * @param { Array } options.nineSliceSprite - NineSliceSprite values for views ([number, number, number, number]).\n     *                                      <br> <b>!!! IMPORTANT:</b> To make it work, you have to pass a views (defaultView, hoverView, pressedView, disabledView) parameters as texture name or texture instance.\n     * @param options.animations - Animations that will be played when the button state changes.\n     */\n    constructor(options?: ButtonOptions)\n    {\n        super();\n\n        this.options = options ?? {};\n\n        const {\n            defaultView,\n            hoverView,\n            pressedView,\n            disabledView,\n            text,\n            padding,\n            offset,\n            textOffset,\n            iconOffset,\n            defaultTextScale: textScale,\n            defaultIconScale: iconScale,\n            defaultTextAnchor: textAnchor,\n            defaultIconAnchor: iconAnchor,\n            scale,\n            anchor,\n            anchorX,\n            anchorY,\n            icon,\n            animations,\n        } = options ?? {};\n\n        this.addChild(this.innerView);\n\n        this.anchor = new ObservablePoint({\n            _onUpdate: () => this.updateAnchor(),\n        });\n        this.anchor.set(anchorX ?? anchor ?? 0, anchorY ?? anchor ?? 0);\n\n        this.padding = padding ?? 0;\n        this.offset = offset ?? {};\n        this.textOffset = textOffset ?? {};\n        this.iconOffset = iconOffset ?? {};\n        this.defaultTextScale = textScale ?? { x: 1, y: 1 };\n        this.defaultIconScale = iconScale ?? { x: 1, y: 1 };\n        this.defaultTextAnchor = textAnchor ?? { x: 0.5, y: 0.5 };\n        this.defaultIconAnchor = iconAnchor ?? { x: 0.5, y: 0.5 };\n        this.scale.set(scale ?? 1);\n\n        if (animations)\n        {\n            this.animations = animations;\n            this.setOriginalInnerViewState();\n            Ticker.shared.add(() => Group.shared.update());\n        }\n\n        this.setState('default');\n\n        this.defaultView = defaultView;\n        this.hoverView = hoverView;\n        this.pressedView = pressedView;\n        this.disabledView = disabledView;\n        this.text = text ?? '';\n        if (icon !== undefined)\n        {\n            this.iconView = icon;\n        }\n\n        this.initStateControl();\n    }\n\n    /**\n     * Updates the text of the button and updates its scaling basing on the new size.\n     * @param {string | number} text\n     */\n    set text(text: AnyText)\n    {\n        if (!text || text === 0)\n        {\n            this.removeView('textView');\n\n            return;\n        }\n\n        if (!this._views.textView)\n        {\n            this.createTextView(text);\n\n            return;\n        }\n\n        this._views.textView.text = text.toString();\n    }\n\n    /** Returns the text string of the button text element. */\n    get text(): string | undefined\n    {\n        return this._views.textView?.text;\n    }\n\n    /**\n     * Setter, that prevents all button events from firing.\n     * @param {boolean} enabled\n     */\n    override set enabled(enabled: boolean)\n    {\n        this.button.enabled = enabled;\n\n        this.setState(enabled ? 'default' : 'disabled');\n    }\n\n    override get enabled(): boolean\n    {\n        return this.button.enabled;\n    }\n\n    /**\n     * Updates button state and shows the according views.\n     *\n     * Updates positions and offsets of the views.\n     *\n     * Plays animations if they are set.\n     * @param {State} newState\n     * @param force\n     */\n    setState(newState: State, force = false)\n    {\n        if (!force && this.state === newState)\n        {\n            return;\n        }\n\n        const currentView = this.getStateView(this.state);\n\n        if (currentView) currentView.visible = false;\n\n        this.state = newState;\n\n        const activeView = this.getStateView(newState);\n\n        if (activeView)\n        {\n            this.setOffset(activeView, newState, this.offset);\n            activeView.visible = true;\n        }\n\n        this.updateAnchor();\n\n        this.playAnimations(newState);\n    }\n\n    /**\n     *\n     * Manage button text view.\n     * @param {string | Text} text - can be a string, Text, BitmapText ot HTMLText (Container-based element).\n     */\n    protected createTextView(text: AnyText)\n    {\n        this._views.textView = getTextView(text);\n\n        // If text scale has not manually been set, we will overwrite the base scale with the new text view scale.\n        if (this.options?.defaultTextScale === undefined)\n        {\n            const { x, y } = this._views.textView.scale;\n\n            this._defaultTextScale = { x, y };\n        }\n\n        this.innerView.addChild(this._views.textView);\n\n        this.adjustTextView(this.state);\n    }\n\n    /**\n     * Manages views offsets if it's set.\n     * @param view\n     * @param state\n     * @param offset\n     */\n    protected setOffset(view: Container, state: State, offset: Offset)\n    {\n        const stateOffset = offset\n            ? offset[state]\n            : {\n                x: 0,\n                y: 0,\n            };\n\n        const defaultStateOffset = offset?.default;\n\n        if (stateOffset)\n        {\n            view.x += stateOffset.x ?? 0;\n            view.y += stateOffset.y ?? 0;\n        }\n        else if (defaultStateOffset)\n        {\n            view.x += defaultStateOffset.x ?? 0;\n            view.y += defaultStateOffset.y ?? 0;\n        }\n        else if (offset.x || offset.y)\n        {\n            view.x += offset.x ?? 0;\n            view.y += offset.y ?? 0;\n        }\n    }\n\n    /**\n     * Returns active view for the state.\n     * @param state\n     */\n    protected getStateView(state: State): Container | undefined\n    {\n        if (!this._views) return undefined;\n\n        switch (state)\n        {\n            case 'hover':\n                return this._views.hoverView ?? this._views.defaultView ?? undefined;\n            case 'pressed':\n                return (\n                    this._views.pressedView\n                    ?? this._views.hoverView\n                    ?? this._views.defaultView\n                    ?? undefined\n                );\n            case 'disabled':\n                return this._views.disabledView ?? this._views.defaultView ?? undefined;\n            case 'default':\n                return this._views.defaultView ?? undefined;\n            default:\n                return undefined;\n        }\n    }\n\n    /**\n     * Adjusts text view position and scale.\n     * @param {State} state\n     */\n    protected adjustTextView(state: State)\n    {\n        if (!this.text) return;\n        if (!this._views.textView) return;\n\n        const activeView = this.getStateView(this.state);\n        const anchorX = this._defaultTextAnchor.x ?? 0.5;\n        const anchorY = this._defaultTextAnchor.y ?? 0.5;\n\n        if (activeView)\n        {\n            if (!this.options?.ignoreRefitting)\n            {\n                this._views.textView.scale.set(this._defaultTextScale.x, this._defaultTextScale.y);\n            }\n\n            if (this.contentFittingMode === 'default')\n            {\n                fitToView(activeView, this._views.textView, this.padding, false);\n            }\n\n            if (this.contentFittingMode === 'fill')\n            {\n                // reset to base dimensions for calculations\n                this._views.textView.scale.set(1);\n\n                const availableWidth = activeView.width - (this.padding * 2);\n                const availableHeight = activeView.height - (this.padding * 2);\n                const targetScaleX = availableWidth / this._views.textView.width;\n                const targetScaleY = availableHeight / this._views.textView.height;\n                const scale = Math.min(targetScaleX, targetScaleY);\n\n                this._views.textView.scale.set(\n                    scale * (this._defaultTextScale.x ?? 1),\n                    scale * (this._defaultTextScale.y ?? 1),\n                );\n            }\n\n            this._views.textView.x = activeView.x + (activeView.width / 2);\n            this._views.textView.y = activeView.y + (activeView.height / 2);\n        }\n\n        this._views.textView.anchor.set(anchorX, anchorY);\n        this.setOffset(this._views.textView, state, this.textOffset);\n    }\n\n    /**\n     * Adjusts icon view position and scale.\n     * @param {State} state\n     */\n    protected adjustIconView(state: State)\n    {\n        if (!this._views.iconView)\n        {\n            return;\n        }\n\n        const activeView = this.getStateView(state);\n\n        if (!activeView)\n        {\n            return;\n        }\n\n        if (!this.options?.ignoreRefitting)\n        {\n            this._views.iconView.scale.set(this._defaultIconScale.x, this._defaultIconScale.y);\n        }\n\n        if (this.contentFittingMode === 'default')\n        {\n            fitToView(activeView, this._views.iconView, this.padding, false);\n        }\n\n        if (this.contentFittingMode === 'fill')\n        {\n            // reset to base dimensions for calculations\n            this._views.iconView.scale.set(1);\n\n            const availableWidth = activeView.width - (this.padding * 2);\n            const availableHeight = activeView.height - (this.padding * 2);\n            const targetScaleX = availableWidth / this._views.iconView.width;\n            const targetScaleY = availableHeight / this._views.iconView.height;\n            const scale = Math.min(targetScaleX, targetScaleY);\n\n            this._views.iconView.scale.set(\n                scale * (this._defaultIconScale.x ?? 1),\n                scale * (this._defaultIconScale.y ?? 1),\n            );\n        }\n\n        const anchorX = this._defaultIconAnchor.x ?? 0.5;\n        const anchorY = this._defaultIconAnchor.y ?? 0.5;\n\n        if ('anchor' in this._views.iconView)\n        {\n            (this._views.iconView.anchor as ObservablePoint).set(anchorX, anchorY);\n        }\n        else\n        {\n            this._views.iconView.pivot.set(\n                anchorX * (this._views.iconView.width / this._views.iconView.scale.x),\n                anchorY * (this._views.iconView.height / this._views.iconView.scale.y),\n            );\n        }\n\n        this._views.iconView.x = activeView.x + (activeView.width / 2);\n        this._views.iconView.y = activeView.y + (activeView.height / 2);\n\n        this.setOffset(this._views.iconView, state, this.iconOffset);\n    }\n\n    /**\n     * Reset views positions according to the button anchor setting.\n     * We have to set the anchor position for each view individually, as each of them\n     * can be a different type of view (container without anchor, sprite with anchor, etc)\n     * we have to reset all anchors to 0,0 and then set the positions manually.\n     */\n    protected updateAnchor()\n    {\n        if (!this._views) return;\n\n        const anchorX = this.anchor.x ?? 0;\n        const anchorY = this.anchor.y ?? 0;\n        const views = [\n            this._views.defaultView,\n            this._views.hoverView,\n            this._views.pressedView,\n            this._views.disabledView,\n        ];\n\n        views.forEach((view) =>\n        {\n            if (!view) return;\n\n            (view as Sprite).anchor?.set(0);\n\n            view.x = -view.width * anchorX;\n            view.y = -view.height * anchorY;\n        });\n\n        if (this._views.defaultView)\n        {\n            const { x, y, width, height } = this._views.defaultView;\n\n            this.hitArea = new Rectangle(x, y, width, height);\n        }\n\n        this.adjustIconView(this.state);\n        this.adjustTextView(this.state);\n    }\n\n    /**\n     * Sets the fitting mode for the button's content.\n     * @param {ContentFittingMode} mode - fitting mode type.\n     */\n    set contentFittingMode(mode: ContentFittingMode)\n    {\n        this.options.contentFittingMode = mode;\n    }\n\n    /** Returns the fitting mode for the button's content, defaulting to 'default'. */\n    get contentFittingMode(): ContentFittingMode\n    {\n        return this.options.contentFittingMode ?? 'default';\n    }\n\n    /**\n     * Sets the default view of the button.\n     * @param { string | Container } view - string (path to the image) or a Container-based view\n     */\n    set defaultView(view: GetViewSettings | undefined)\n    {\n        this.updateView('defaultView', view);\n        if (this._views.disabledView && this.state !== 'default')\n        {\n            this._views.disabledView.visible = false;\n        }\n    }\n\n    /** Returns the default view of the button. */\n    get defaultView(): Container | undefined\n    {\n        return this._views.defaultView;\n    }\n\n    /**\n     * Sets the hover view of the button.\n     * @param { string | Container } view - string (path to the image) or a Container-based view\n     */\n    set hoverView(view: GetViewSettings | undefined)\n    {\n        this.updateView('hoverView', view);\n        if (this._views.hoverView && this.state !== 'hover')\n        {\n            this._views.hoverView.visible = false;\n        }\n    }\n\n    /** Returns the hover view of the button. */\n    get hoverView(): Container | undefined\n    {\n        return this._views.hoverView;\n    }\n\n    /** Sets the pressed view of the button. */\n    set pressedView(view: GetViewSettings | undefined)\n    {\n        this.updateView('pressedView', view);\n        if (this._views.pressedView && this.state !== 'pressed')\n        {\n            this._views.pressedView.visible = false;\n        }\n    }\n\n    /** Returns the pressed view of the button. */\n    get pressedView(): Container | undefined\n    {\n        return this._views.pressedView;\n    }\n\n    /** Sets the disabled view of the button. */\n    set disabledView(view: GetViewSettings | undefined)\n    {\n        this.updateView('disabledView', view);\n        if (this._views.disabledView && this.state !== 'disabled')\n        {\n            this._views.disabledView.visible = false;\n        }\n    }\n\n    /** Returns the disabled view of the button. */\n    get disabledView(): Container | undefined\n    {\n        return this._views.disabledView;\n    }\n\n    /**\n     * Helper method to update or cleanup button views.\n     * @param { 'defaultView' | 'hoverView' | 'pressedView' | 'disabledView' } viewType - type of the view to update\n     * @param { string | Texture | Container | null } view - new view\n     */\n    protected updateView(viewType: ButtonViewType, view: GetViewSettings | undefined)\n    {\n        if (view === undefined) return;\n\n        this.removeView(viewType);\n\n        if (this.options?.nineSliceSprite)\n        {\n            if (typeof view === 'string')\n            {\n                this._views[viewType] = new NineSliceSprite({\n                    texture: Texture.from(view),\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 (view instanceof Texture)\n            {\n                this._views[viewType] = new NineSliceSprite({\n                    texture: view,\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. Pass the texture or texture name as instead of the Container extended instance.');\n            }\n        }\n\n        if (!this._views[viewType])\n        {\n            this._views[viewType] = getView(view);\n        }\n\n        this.setOffset(this._views[viewType], this.state, this.offset);\n\n        if (!this._views[viewType].parent)\n        {\n            this.innerView.addChild(this._views[viewType]);\n        }\n\n        this.updateAnchor();\n\n        if (this._views.iconView)\n        {\n            // place icon on top of the view\n            this.innerView.addChild(this._views.iconView);\n        }\n\n        if (this._views.textView)\n        {\n            // place text on top of the view\n            this.innerView.addChild(this._views.textView);\n        }\n\n        this.setState(this.state, true);\n    }\n\n    /**\n     * Removes button view by type\n     * @param {'defaultView' | 'hoverView' | 'pressedView' | 'disabledView'} viewType - type of the view to remove\n     */\n    removeView(viewType: ButtonViewType | 'textView' | 'iconView')\n    {\n        if (this._views[viewType])\n        {\n            this.innerView.removeChild(this._views[viewType]);\n            this._views[viewType] = undefined;\n        }\n    }\n\n    /**\n     * Sets the textView of the button.\n     * @param { string | number | PixiText | Text | BitmapText | HTMLText } textView - string, text or pixi text instance.\n     */\n    set textView(textView: AnyText | null)\n    {\n        if (textView === undefined) return;\n\n        this.removeView('textView');\n\n        if (textView === null)\n        {\n            return;\n        }\n\n        this.createTextView(textView);\n    }\n\n    /**\n     * Returns the text view of the button.\n     * @returns pixi text instance or undefined.\n     */\n    get textView(): PixiText | undefined\n    {\n        return this._views.textView;\n    }\n\n    /**\n     * Sets the iconView of the button.\n     * @param { string | Texture | Container } view - string (path to the image), texture instance or a Container-based view\n     */\n    set iconView(view: GetViewSettings | undefined)\n    {\n        if (view === undefined) return;\n\n        this.removeView('iconView');\n\n        if (view === null)\n        {\n            return;\n        }\n\n        this._views.iconView = getView(view);\n\n        // If icon scale has not manually been set, we will overwrite the base scale with the new icon view scale.\n        if (this.options?.defaultIconScale === undefined)\n        {\n            const { x, y } = this._views.iconView.scale;\n\n            this._defaultIconScale = { x, y };\n        }\n\n        if (!this._views.iconView.parent)\n        {\n            this.innerView.addChild(this._views.iconView);\n        }\n\n        this.setState(this.state, true);\n    }\n\n    /** Returns the icon view of the button. */\n    get iconView(): Container | undefined\n    {\n        return this._views.iconView;\n    }\n\n    /**\n     * Starts animation for the current button state if configured.\n     * @param {State} state\n     */\n    protected playAnimations(state: State)\n    {\n        if (!this.animations) return;\n\n        const stateAnimation = this.animations[state] ?? this.animations.default;\n\n        if (stateAnimation)\n        {\n            const data = stateAnimation;\n\n            this.defaultDuration = data.duration ?? this.defaultDuration;\n\n            new Tween(this.innerView).to(data.props, data.duration).start();\n\n            return;\n        }\n\n        // if there is no animation for the current state, animate the button to the default state\n        new Tween(this.innerView).to(this.originalInnerViewState, this.defaultDuration).start();\n    }\n\n    protected setOriginalInnerViewState()\n    {\n        this.originalInnerViewState = {\n            x: this.innerView.x,\n            y: this.innerView.y,\n            width: this.innerView.width,\n            height: this.innerView.height,\n            scale: {\n                x: this.innerView.scale.x,\n                y: this.innerView.scale.y,\n            },\n        };\n\n        // first animation state is default, so we don't need to animate it\n        // this part will run only once, during initialization\n        const defaultStateAnimation = this.animations?.default;\n\n        if (defaultStateAnimation)\n        {\n            this.innerView.x = defaultStateAnimation.props.x ?? this.originalInnerViewState.x ?? 0;\n            this.innerView.y = defaultStateAnimation.props.y ?? this.originalInnerViewState.y ?? 0;\n            this.innerView.width\n                = defaultStateAnimation.props.width ?? this.originalInnerViewState.width ?? 0;\n            this.innerView.height\n                = defaultStateAnimation.props.height ?? this.originalInnerViewState.height ?? 0;\n            this.innerView.scale.x\n                = defaultStateAnimation.props.scale?.x ?? this.originalInnerViewState.scale?.x ?? 1;\n            this.innerView.scale.y\n                = defaultStateAnimation.props.scale?.y ?? this.originalInnerViewState.scale?.y ?? 1;\n        }\n    }\n\n    protected initStateControl()\n    {\n        this.onDown.connect(() =>\n        {\n            this.setState('pressed');\n        });\n\n        this.onUp.connect(() =>\n        {\n            this.setState(isMobile.any ? 'default' : 'hover');\n        });\n\n        this.onUpOut.connect(() =>\n        {\n            this.setState('default');\n        });\n\n        this.onOut.connect(() =>\n        {\n            if (!this.button.isDown)\n            {\n                this.setState('default');\n            }\n        });\n\n        this.onPress.connect(() =>\n        {\n            this.setState(isMobile.any ? 'default' : 'hover');\n        });\n\n        this.onHover.connect(() =>\n        {\n            if (!this.button.isDown)\n            {\n                this.setState(isMobile.any ? 'default' : 'hover');\n            }\n        });\n    }\n\n    /**\n     * Sets the button padding.\n     * @param {number} padding - padding of the button text and icon views.\n     */\n    set padding(padding: number)\n    {\n        this._padding = padding;\n\n        this.adjustTextView(this.state);\n        this.adjustIconView(this.state);\n    }\n\n    /** Returns the button padding. */\n    get padding(): number\n    {\n        return this._padding;\n    }\n\n    /**\n     * Sets the button offset.\n     * @param { { x?: number; y?: number } } offset - offset of the button.\n     * Can be set for each state of the button.\n     */\n    set offset(offset: Offset)\n    {\n        this._offset = offset;\n\n        this.updateAnchor();\n    }\n\n    /** Returns the button offset. */\n    get offset(): Offset\n    {\n        return this._offset;\n    }\n\n    /**\n     * Sets the button text offset.\n     * @param { { x?: number; y?: number } } textOffset - offsets of the button text view.\n     * can be set for each state of the button.\n     */\n    set textOffset(textOffset: Offset)\n    {\n        this._textOffset = textOffset;\n\n        this.adjustTextView(this.state);\n    }\n\n    /** Returns the button text offset. */\n    get textOffset(): Offset\n    {\n        return this._textOffset;\n    }\n\n    /**\n     * Sets the base scale for the text view to take into account when fitting inside the button.\n     * @param {Pos | number} scale - base scale of the text view.\n     */\n    set defaultTextScale(scale: Pos | number)\n    {\n        if (scale === undefined) return;\n        // Apply to the options so that the manual scale is prioritized.\n        this.options.defaultTextScale = scale;\n        const isNumber = typeof scale === 'number';\n\n        this._defaultTextScale.x = isNumber ? scale : scale.x ?? 1;\n        this._defaultTextScale.y = isNumber ? scale : scale.y ?? 1;\n        this.adjustTextView(this.state);\n    }\n\n    /** Returns the text view base scale. */\n    get defaultTextScale(): Pos\n    {\n        return this.defaultTextScale;\n    }\n\n    /**\n     * Sets the base scale for the icon view to take into account when fitting inside the button.\n     * @param {Pos | number} scale - base scale of the icon view.\n     */\n    set defaultIconScale(scale: Pos | number)\n    {\n        if (scale === undefined) return;\n        // Apply to the options so that the manual scale is prioritized.\n        this.options.defaultIconScale = scale;\n        const isNumber = typeof scale === 'number';\n\n        this._defaultIconScale.x = isNumber ? scale : scale.x ?? 1;\n        this._defaultIconScale.y = isNumber ? scale : scale.y ?? 1;\n        this.adjustIconView(this.state);\n    }\n\n    /** Returns the icon view base scale. */\n    get defaultIconScale(): Pos\n    {\n        return this.defaultIconScale;\n    }\n\n    /**\n     * Sets the base anchor for the text view to take into account when fitting and placing inside the button.\n     * @param {Pos | number} anchor - base anchor of the text view.\n     */\n    set defaultTextAnchor(anchor: Pos | number)\n    {\n        if (anchor === undefined) return;\n        // Apply to the options so that the manual anchor is prioritized.\n        this.options.defaultTextAnchor = anchor;\n        const isNumber = typeof anchor === 'number';\n\n        this._defaultTextAnchor.x = isNumber ? anchor : anchor.x ?? 1;\n        this._defaultTextAnchor.y = isNumber ? anchor : anchor.y ?? 1;\n        this.adjustTextView(this.state);\n    }\n\n    /** Returns the text view base anchor. */\n    get defaultTextAnchor(): Pos\n    {\n        return this.defaultTextAnchor;\n    }\n\n    /**\n     * Sets the base anchor for the icon view to take into account when fitting and placing inside the button.\n     * @param {Pos | number} anchor - base anchor of the icon view.\n     */\n    set defaultIconAnchor(anchor: Pos | number)\n    {\n        if (anchor === undefined) return;\n        // Apply to the options so that the manual anchor is prioritized.\n        this.options.defaultIconAnchor = anchor;\n        const isNumber = typeof anchor === 'number';\n\n        this._defaultIconAnchor.x = isNumber ? anchor : anchor.x ?? 1;\n        this._defaultIconAnchor.y = isNumber ? anchor : anchor.y ?? 1;\n        this.adjustIconView(this.state);\n    }\n\n    /** Returns the icon view base anchor. */\n    get defaultIconAnchor(): Pos\n    {\n        return this.defaultIconAnchor;\n    }\n\n    /**\n     * Sets width of a FancyButtons state views.\n     * If nineSliceSprite is set, then width will be set to nineSliceSprites of a views.\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._views.defaultView)\n            {\n                this._views.defaultView.width = width;\n            }\n            if (this._views.hoverView)\n            {\n                this._views.hoverView.width = width;\n            }\n            if (this._views.pressedView)\n            {\n                this._views.pressedView.width = width;\n            }\n            if (this._views.disabledView)\n            {\n                this._views.disabledView.width = width;\n            }\n\n            this.adjustTextView(this.state);\n            this.adjustIconView(this.state);\n            this.updateAnchor();\n        }\n        else\n        {\n            super.width = width;\n        }\n    }\n\n    /** Gets width of a FancyButton. */\n    override get width(): number\n    {\n        return super.width;\n    }\n\n    /**\n     * Sets height of a FancyButtons state views.\n     * If nineSliceSprite is set, then height will be set to nineSliceSprites of a views.\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._views.defaultView)\n            {\n                this._views.defaultView.height = height;\n            }\n            if (this._views.hoverView)\n            {\n                this._views.hoverView.height = height;\n            }\n            if (this._views.pressedView)\n            {\n                this._views.pressedView.height = height;\n            }\n            if (this._views.disabledView)\n            {\n                this._views.disabledView.height = height;\n            }\n\n            this.adjustTextView(this.state);\n            this.adjustIconView(this.state);\n            this.updateAnchor();\n        }\n        else\n        {\n            super.height = height;\n        }\n    }\n\n    /** Gets height of a FancyButton. */\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._views.defaultView)\n            {\n                this._views.defaultView.setSize(value, height);\n            }\n            if (this._views.hoverView)\n            {\n                this._views.hoverView.setSize(value, height);\n            }\n            if (this._views.pressedView)\n            {\n                this._views.pressedView.setSize(value, height);\n            }\n            if (this._views.disabledView)\n            {\n                this._views.disabledView.setSize(value, height);\n            }\n\n            this.adjustTextView(this.state);\n            this.adjustIconView(this.state);\n            this.updateAnchor();\n        }\n        else\n        {\n            super.setSize(value, height);\n        }\n    }\n}\n"],"names":[],"mappings":"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"}