{"version":3,"file":"MaskedFrame.mjs","sources":["../src/MaskedFrame.ts"],"sourcesContent":["import { Container, FillStyleInputs, Graphics, Sprite } from 'pixi.js';\nimport { getView } from './utils/helpers/view';\n\nexport type MaskedFrameOptions = {\n    target?: string | Container;\n    mask?: string | Graphics;\n    borderWidth?: number;\n    borderColor?: FillStyleInputs;\n};\n\n/**\n * Draws a border or apply a mask of any shape to a container.\n * @example\n * new MaskedFrame({\n *     target: `avatar.png`,\n *     mask: `avatar_mask.png`,\n *     borderWidth: 5,\n *     borderColor: 0xFFFFFF,\n * });\n */\nexport class MaskedFrame extends Container\n{\n    /** Target container. */\n    target: Container | undefined;\n    border = new Graphics();\n    protected _targetMask: Container | undefined;\n    protected maskData: string | Graphics | undefined;\n    protected borderWidth: number = 0;\n    protected borderColor: FillStyleInputs = 0x000000;\n\n    constructor(options?: MaskedFrameOptions)\n    {\n        super();\n\n        if (options?.target)\n        {\n            this.init(options);\n        }\n    }\n\n    /**\n     * Initializes a component.\n     * @param root0\n     * @param root0.target - Container to apply a mask or a border.\n     * @param root0.mask - Mask.\n     * @param root0.borderWidth - Border width.\n     * @param root0.borderColor - Border color.\n     */\n    init({ target, mask, borderWidth, borderColor }: MaskedFrameOptions)\n    {\n        if (this.target)\n        {\n            this.removeChild(this.target);\n        }\n\n        if (target)\n        {\n            this.target = getView(target);\n        }\n        this.addChild(this.border);\n        if (this.target)\n        {\n            this.addChild(this.target);\n        }\n\n        if (mask) this.applyMask(mask);\n        if (borderWidth) this.setBorder(borderWidth, borderColor ?? 0x000000);\n    }\n\n    /**\n     * Applies a mask to a target container.\n     * @param mask\n     */\n    applyMask(mask: string | Graphics)\n    {\n        this.maskData = mask;\n\n        this._targetMask = getView(mask);\n        this.addChild(this._targetMask);\n        if (this.target)\n        {\n            this.target.mask = this._targetMask;\n        }\n    }\n\n    /**\n     * Shows a border around the target Container, same shape as the mask.\n     * @param borderWidth\n     * @param borderColor\n     */\n    setBorder(borderWidth: number, borderColor: FillStyleInputs)\n    {\n        this.borderWidth = borderWidth;\n        this.borderColor = borderColor;\n\n        this.showBorder();\n\n        if (this.maskData && this._targetMask)\n        {\n            const borderMask\n                = typeof this.maskData === 'string'\n                    ? Sprite.from(this.maskData)\n                    : this.maskData.clone(true);\n\n            borderMask.width += borderWidth * 2;\n            borderMask.height += borderWidth * 2;\n\n            this.mask = borderMask;\n            this.addChild(borderMask);\n            this._targetMask.position.set(borderWidth);\n        }\n    }\n\n    /** Hides a border. */\n    showBorder()\n    {\n        if (!this.target) return;\n\n        const width = this.borderWidth * 2;\n\n        this.border\n            .clear()\n            .rect(0, 0, this.target.width + width, this.target.height + width)\n            .fill(this.borderColor);\n\n        this.target.x = this.borderWidth;\n        this.target.y = this.borderWidth;\n    }\n\n    /** Hides a border. */\n    hideBorder()\n    {\n        this.border.clear();\n    }\n}\n"],"names":[],"mappings":"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"}