import Transformable, { TRANSFORMABLE_PROPS } from './core/Transformable.js'; 
 | 
import Animator, { cloneValue } from './animation/Animator.js'; 
 | 
import BoundingRect from './core/BoundingRect.js'; 
 | 
import Eventful from './core/Eventful.js'; 
 | 
import { calculateTextPosition, parsePercent } from './contain/text.js'; 
 | 
import { guid, isObject, keys, extend, indexOf, logError, mixin, isArrayLike, isTypedArray, isGradientObject, filter, reduce } from './core/util.js'; 
 | 
import { LIGHT_LABEL_COLOR, DARK_LABEL_COLOR } from './config.js'; 
 | 
import { parse, stringify } from './tool/color.js'; 
 | 
import { REDRAW_BIT } from './graphic/constants.js'; 
 | 
export var PRESERVED_NORMAL_STATE = '__zr_normal__'; 
 | 
var PRIMARY_STATES_KEYS = TRANSFORMABLE_PROPS.concat(['ignore']); 
 | 
var DEFAULT_ANIMATABLE_MAP = reduce(TRANSFORMABLE_PROPS, function (obj, key) { 
 | 
    obj[key] = true; 
 | 
    return obj; 
 | 
}, { ignore: false }); 
 | 
var tmpTextPosCalcRes = {}; 
 | 
var tmpBoundingRect = new BoundingRect(0, 0, 0, 0); 
 | 
var Element = (function () { 
 | 
    function Element(props) { 
 | 
        this.id = guid(); 
 | 
        this.animators = []; 
 | 
        this.currentStates = []; 
 | 
        this.states = {}; 
 | 
        this._init(props); 
 | 
    } 
 | 
    Element.prototype._init = function (props) { 
 | 
        this.attr(props); 
 | 
    }; 
 | 
    Element.prototype.drift = function (dx, dy, e) { 
 | 
        switch (this.draggable) { 
 | 
            case 'horizontal': 
 | 
                dy = 0; 
 | 
                break; 
 | 
            case 'vertical': 
 | 
                dx = 0; 
 | 
                break; 
 | 
        } 
 | 
        var m = this.transform; 
 | 
        if (!m) { 
 | 
            m = this.transform = [1, 0, 0, 1, 0, 0]; 
 | 
        } 
 | 
        m[4] += dx; 
 | 
        m[5] += dy; 
 | 
        this.decomposeTransform(); 
 | 
        this.markRedraw(); 
 | 
    }; 
 | 
    Element.prototype.beforeUpdate = function () { }; 
 | 
    Element.prototype.afterUpdate = function () { }; 
 | 
    Element.prototype.update = function () { 
 | 
        this.updateTransform(); 
 | 
        if (this.__dirty) { 
 | 
            this.updateInnerText(); 
 | 
        } 
 | 
    }; 
 | 
    Element.prototype.updateInnerText = function (forceUpdate) { 
 | 
        var textEl = this._textContent; 
 | 
        if (textEl && (!textEl.ignore || forceUpdate)) { 
 | 
            if (!this.textConfig) { 
 | 
                this.textConfig = {}; 
 | 
            } 
 | 
            var textConfig = this.textConfig; 
 | 
            var isLocal = textConfig.local; 
 | 
            var innerTransformable = textEl.innerTransformable; 
 | 
            var textAlign = void 0; 
 | 
            var textVerticalAlign = void 0; 
 | 
            var textStyleChanged = false; 
 | 
            innerTransformable.parent = isLocal ? this : null; 
 | 
            var innerOrigin = false; 
 | 
            innerTransformable.copyTransform(textEl); 
 | 
            if (textConfig.position != null) { 
 | 
                var layoutRect = tmpBoundingRect; 
 | 
                if (textConfig.layoutRect) { 
 | 
                    layoutRect.copy(textConfig.layoutRect); 
 | 
                } 
 | 
                else { 
 | 
                    layoutRect.copy(this.getBoundingRect()); 
 | 
                } 
 | 
                if (!isLocal) { 
 | 
                    layoutRect.applyTransform(this.transform); 
 | 
                } 
 | 
                if (this.calculateTextPosition) { 
 | 
                    this.calculateTextPosition(tmpTextPosCalcRes, textConfig, layoutRect); 
 | 
                } 
 | 
                else { 
 | 
                    calculateTextPosition(tmpTextPosCalcRes, textConfig, layoutRect); 
 | 
                } 
 | 
                innerTransformable.x = tmpTextPosCalcRes.x; 
 | 
                innerTransformable.y = tmpTextPosCalcRes.y; 
 | 
                textAlign = tmpTextPosCalcRes.align; 
 | 
                textVerticalAlign = tmpTextPosCalcRes.verticalAlign; 
 | 
                var textOrigin = textConfig.origin; 
 | 
                if (textOrigin && textConfig.rotation != null) { 
 | 
                    var relOriginX = void 0; 
 | 
                    var relOriginY = void 0; 
 | 
                    if (textOrigin === 'center') { 
 | 
                        relOriginX = layoutRect.width * 0.5; 
 | 
                        relOriginY = layoutRect.height * 0.5; 
 | 
                    } 
 | 
                    else { 
 | 
                        relOriginX = parsePercent(textOrigin[0], layoutRect.width); 
 | 
                        relOriginY = parsePercent(textOrigin[1], layoutRect.height); 
 | 
                    } 
 | 
                    innerOrigin = true; 
 | 
                    innerTransformable.originX = -innerTransformable.x + relOriginX + (isLocal ? 0 : layoutRect.x); 
 | 
                    innerTransformable.originY = -innerTransformable.y + relOriginY + (isLocal ? 0 : layoutRect.y); 
 | 
                } 
 | 
            } 
 | 
            if (textConfig.rotation != null) { 
 | 
                innerTransformable.rotation = textConfig.rotation; 
 | 
            } 
 | 
            var textOffset = textConfig.offset; 
 | 
            if (textOffset) { 
 | 
                innerTransformable.x += textOffset[0]; 
 | 
                innerTransformable.y += textOffset[1]; 
 | 
                if (!innerOrigin) { 
 | 
                    innerTransformable.originX = -textOffset[0]; 
 | 
                    innerTransformable.originY = -textOffset[1]; 
 | 
                } 
 | 
            } 
 | 
            var isInside = textConfig.inside == null 
 | 
                ? (typeof textConfig.position === 'string' && textConfig.position.indexOf('inside') >= 0) 
 | 
                : textConfig.inside; 
 | 
            var innerTextDefaultStyle = this._innerTextDefaultStyle || (this._innerTextDefaultStyle = {}); 
 | 
            var textFill = void 0; 
 | 
            var textStroke = void 0; 
 | 
            var autoStroke = void 0; 
 | 
            if (isInside && this.canBeInsideText()) { 
 | 
                textFill = textConfig.insideFill; 
 | 
                textStroke = textConfig.insideStroke; 
 | 
                if (textFill == null || textFill === 'auto') { 
 | 
                    textFill = this.getInsideTextFill(); 
 | 
                } 
 | 
                if (textStroke == null || textStroke === 'auto') { 
 | 
                    textStroke = this.getInsideTextStroke(textFill); 
 | 
                    autoStroke = true; 
 | 
                } 
 | 
            } 
 | 
            else { 
 | 
                textFill = textConfig.outsideFill; 
 | 
                textStroke = textConfig.outsideStroke; 
 | 
                if (textFill == null || textFill === 'auto') { 
 | 
                    textFill = this.getOutsideFill(); 
 | 
                } 
 | 
                if (textStroke == null || textStroke === 'auto') { 
 | 
                    textStroke = this.getOutsideStroke(textFill); 
 | 
                    autoStroke = true; 
 | 
                } 
 | 
            } 
 | 
            textFill = textFill || '#000'; 
 | 
            if (textFill !== innerTextDefaultStyle.fill 
 | 
                || textStroke !== innerTextDefaultStyle.stroke 
 | 
                || autoStroke !== innerTextDefaultStyle.autoStroke 
 | 
                || textAlign !== innerTextDefaultStyle.align 
 | 
                || textVerticalAlign !== innerTextDefaultStyle.verticalAlign) { 
 | 
                textStyleChanged = true; 
 | 
                innerTextDefaultStyle.fill = textFill; 
 | 
                innerTextDefaultStyle.stroke = textStroke; 
 | 
                innerTextDefaultStyle.autoStroke = autoStroke; 
 | 
                innerTextDefaultStyle.align = textAlign; 
 | 
                innerTextDefaultStyle.verticalAlign = textVerticalAlign; 
 | 
                textEl.setDefaultTextStyle(innerTextDefaultStyle); 
 | 
            } 
 | 
            textEl.__dirty |= REDRAW_BIT; 
 | 
            if (textStyleChanged) { 
 | 
                textEl.dirtyStyle(true); 
 | 
            } 
 | 
        } 
 | 
    }; 
 | 
    Element.prototype.canBeInsideText = function () { 
 | 
        return true; 
 | 
    }; 
 | 
    Element.prototype.getInsideTextFill = function () { 
 | 
        return '#fff'; 
 | 
    }; 
 | 
    Element.prototype.getInsideTextStroke = function (textFill) { 
 | 
        return '#000'; 
 | 
    }; 
 | 
    Element.prototype.getOutsideFill = function () { 
 | 
        return this.__zr && this.__zr.isDarkMode() ? LIGHT_LABEL_COLOR : DARK_LABEL_COLOR; 
 | 
    }; 
 | 
    Element.prototype.getOutsideStroke = function (textFill) { 
 | 
        var backgroundColor = this.__zr && this.__zr.getBackgroundColor(); 
 | 
        var colorArr = typeof backgroundColor === 'string' && parse(backgroundColor); 
 | 
        if (!colorArr) { 
 | 
            colorArr = [255, 255, 255, 1]; 
 | 
        } 
 | 
        var alpha = colorArr[3]; 
 | 
        var isDark = this.__zr.isDarkMode(); 
 | 
        for (var i = 0; i < 3; i++) { 
 | 
            colorArr[i] = colorArr[i] * alpha + (isDark ? 0 : 255) * (1 - alpha); 
 | 
        } 
 | 
        colorArr[3] = 1; 
 | 
        return stringify(colorArr, 'rgba'); 
 | 
    }; 
 | 
    Element.prototype.traverse = function (cb, context) { }; 
 | 
    Element.prototype.attrKV = function (key, value) { 
 | 
        if (key === 'textConfig') { 
 | 
            this.setTextConfig(value); 
 | 
        } 
 | 
        else if (key === 'textContent') { 
 | 
            this.setTextContent(value); 
 | 
        } 
 | 
        else if (key === 'clipPath') { 
 | 
            this.setClipPath(value); 
 | 
        } 
 | 
        else if (key === 'extra') { 
 | 
            this.extra = this.extra || {}; 
 | 
            extend(this.extra, value); 
 | 
        } 
 | 
        else { 
 | 
            this[key] = value; 
 | 
        } 
 | 
    }; 
 | 
    Element.prototype.hide = function () { 
 | 
        this.ignore = true; 
 | 
        this.markRedraw(); 
 | 
    }; 
 | 
    Element.prototype.show = function () { 
 | 
        this.ignore = false; 
 | 
        this.markRedraw(); 
 | 
    }; 
 | 
    Element.prototype.attr = function (keyOrObj, value) { 
 | 
        if (typeof keyOrObj === 'string') { 
 | 
            this.attrKV(keyOrObj, value); 
 | 
        } 
 | 
        else if (isObject(keyOrObj)) { 
 | 
            var obj = keyOrObj; 
 | 
            var keysArr = keys(obj); 
 | 
            for (var i = 0; i < keysArr.length; i++) { 
 | 
                var key = keysArr[i]; 
 | 
                this.attrKV(key, keyOrObj[key]); 
 | 
            } 
 | 
        } 
 | 
        this.markRedraw(); 
 | 
        return this; 
 | 
    }; 
 | 
    Element.prototype.saveCurrentToNormalState = function (toState) { 
 | 
        this._innerSaveToNormal(toState); 
 | 
        var normalState = this._normalState; 
 | 
        for (var i = 0; i < this.animators.length; i++) { 
 | 
            var animator = this.animators[i]; 
 | 
            var fromStateTransition = animator.__fromStateTransition; 
 | 
            if (animator.getLoop() || fromStateTransition && fromStateTransition !== PRESERVED_NORMAL_STATE) { 
 | 
                continue; 
 | 
            } 
 | 
            var targetName = animator.targetName; 
 | 
            var target = targetName 
 | 
                ? normalState[targetName] : normalState; 
 | 
            animator.saveTo(target); 
 | 
        } 
 | 
    }; 
 | 
    Element.prototype._innerSaveToNormal = function (toState) { 
 | 
        var normalState = this._normalState; 
 | 
        if (!normalState) { 
 | 
            normalState = this._normalState = {}; 
 | 
        } 
 | 
        if (toState.textConfig && !normalState.textConfig) { 
 | 
            normalState.textConfig = this.textConfig; 
 | 
        } 
 | 
        this._savePrimaryToNormal(toState, normalState, PRIMARY_STATES_KEYS); 
 | 
    }; 
 | 
    Element.prototype._savePrimaryToNormal = function (toState, normalState, primaryKeys) { 
 | 
        for (var i = 0; i < primaryKeys.length; i++) { 
 | 
            var key = primaryKeys[i]; 
 | 
            if (toState[key] != null && !(key in normalState)) { 
 | 
                normalState[key] = this[key]; 
 | 
            } 
 | 
        } 
 | 
    }; 
 | 
    Element.prototype.hasState = function () { 
 | 
        return this.currentStates.length > 0; 
 | 
    }; 
 | 
    Element.prototype.getState = function (name) { 
 | 
        return this.states[name]; 
 | 
    }; 
 | 
    Element.prototype.ensureState = function (name) { 
 | 
        var states = this.states; 
 | 
        if (!states[name]) { 
 | 
            states[name] = {}; 
 | 
        } 
 | 
        return states[name]; 
 | 
    }; 
 | 
    Element.prototype.clearStates = function (noAnimation) { 
 | 
        this.useState(PRESERVED_NORMAL_STATE, false, noAnimation); 
 | 
    }; 
 | 
    Element.prototype.useState = function (stateName, keepCurrentStates, noAnimation, forceUseHoverLayer) { 
 | 
        var toNormalState = stateName === PRESERVED_NORMAL_STATE; 
 | 
        var hasStates = this.hasState(); 
 | 
        if (!hasStates && toNormalState) { 
 | 
            return; 
 | 
        } 
 | 
        var currentStates = this.currentStates; 
 | 
        var animationCfg = this.stateTransition; 
 | 
        if (indexOf(currentStates, stateName) >= 0 && (keepCurrentStates || currentStates.length === 1)) { 
 | 
            return; 
 | 
        } 
 | 
        var state; 
 | 
        if (this.stateProxy && !toNormalState) { 
 | 
            state = this.stateProxy(stateName); 
 | 
        } 
 | 
        if (!state) { 
 | 
            state = (this.states && this.states[stateName]); 
 | 
        } 
 | 
        if (!state && !toNormalState) { 
 | 
            logError("State " + stateName + " not exists."); 
 | 
            return; 
 | 
        } 
 | 
        if (!toNormalState) { 
 | 
            this.saveCurrentToNormalState(state); 
 | 
        } 
 | 
        var useHoverLayer = !!((state && state.hoverLayer) || forceUseHoverLayer); 
 | 
        if (useHoverLayer) { 
 | 
            this._toggleHoverLayerFlag(true); 
 | 
        } 
 | 
        this._applyStateObj(stateName, state, this._normalState, keepCurrentStates, !noAnimation && !this.__inHover && animationCfg && animationCfg.duration > 0, animationCfg); 
 | 
        var textContent = this._textContent; 
 | 
        var textGuide = this._textGuide; 
 | 
        if (textContent) { 
 | 
            textContent.useState(stateName, keepCurrentStates, noAnimation, useHoverLayer); 
 | 
        } 
 | 
        if (textGuide) { 
 | 
            textGuide.useState(stateName, keepCurrentStates, noAnimation, useHoverLayer); 
 | 
        } 
 | 
        if (toNormalState) { 
 | 
            this.currentStates = []; 
 | 
            this._normalState = {}; 
 | 
        } 
 | 
        else { 
 | 
            if (!keepCurrentStates) { 
 | 
                this.currentStates = [stateName]; 
 | 
            } 
 | 
            else { 
 | 
                this.currentStates.push(stateName); 
 | 
            } 
 | 
        } 
 | 
        this._updateAnimationTargets(); 
 | 
        this.markRedraw(); 
 | 
        if (!useHoverLayer && this.__inHover) { 
 | 
            this._toggleHoverLayerFlag(false); 
 | 
            this.__dirty &= ~REDRAW_BIT; 
 | 
        } 
 | 
        return state; 
 | 
    }; 
 | 
    Element.prototype.useStates = function (states, noAnimation, forceUseHoverLayer) { 
 | 
        if (!states.length) { 
 | 
            this.clearStates(); 
 | 
        } 
 | 
        else { 
 | 
            var stateObjects = []; 
 | 
            var currentStates = this.currentStates; 
 | 
            var len = states.length; 
 | 
            var notChange = len === currentStates.length; 
 | 
            if (notChange) { 
 | 
                for (var i = 0; i < len; i++) { 
 | 
                    if (states[i] !== currentStates[i]) { 
 | 
                        notChange = false; 
 | 
                        break; 
 | 
                    } 
 | 
                } 
 | 
            } 
 | 
            if (notChange) { 
 | 
                return; 
 | 
            } 
 | 
            for (var i = 0; i < len; i++) { 
 | 
                var stateName = states[i]; 
 | 
                var stateObj = void 0; 
 | 
                if (this.stateProxy) { 
 | 
                    stateObj = this.stateProxy(stateName, states); 
 | 
                } 
 | 
                if (!stateObj) { 
 | 
                    stateObj = this.states[stateName]; 
 | 
                } 
 | 
                if (stateObj) { 
 | 
                    stateObjects.push(stateObj); 
 | 
                } 
 | 
            } 
 | 
            var lastStateObj = stateObjects[len - 1]; 
 | 
            var useHoverLayer = !!((lastStateObj && lastStateObj.hoverLayer) || forceUseHoverLayer); 
 | 
            if (useHoverLayer) { 
 | 
                this._toggleHoverLayerFlag(true); 
 | 
            } 
 | 
            var mergedState = this._mergeStates(stateObjects); 
 | 
            var animationCfg = this.stateTransition; 
 | 
            this.saveCurrentToNormalState(mergedState); 
 | 
            this._applyStateObj(states.join(','), mergedState, this._normalState, false, !noAnimation && !this.__inHover && animationCfg && animationCfg.duration > 0, animationCfg); 
 | 
            var textContent = this._textContent; 
 | 
            var textGuide = this._textGuide; 
 | 
            if (textContent) { 
 | 
                textContent.useStates(states, noAnimation, useHoverLayer); 
 | 
            } 
 | 
            if (textGuide) { 
 | 
                textGuide.useStates(states, noAnimation, useHoverLayer); 
 | 
            } 
 | 
            this._updateAnimationTargets(); 
 | 
            this.currentStates = states.slice(); 
 | 
            this.markRedraw(); 
 | 
            if (!useHoverLayer && this.__inHover) { 
 | 
                this._toggleHoverLayerFlag(false); 
 | 
                this.__dirty &= ~REDRAW_BIT; 
 | 
            } 
 | 
        } 
 | 
    }; 
 | 
    Element.prototype.isSilent = function () { 
 | 
        var isSilent = this.silent; 
 | 
        var ancestor = this.parent; 
 | 
        while (!isSilent && ancestor) { 
 | 
            if (ancestor.silent) { 
 | 
                isSilent = true; 
 | 
                break; 
 | 
            } 
 | 
            ancestor = ancestor.parent; 
 | 
        } 
 | 
        return isSilent; 
 | 
    }; 
 | 
    Element.prototype._updateAnimationTargets = function () { 
 | 
        for (var i = 0; i < this.animators.length; i++) { 
 | 
            var animator = this.animators[i]; 
 | 
            if (animator.targetName) { 
 | 
                animator.changeTarget(this[animator.targetName]); 
 | 
            } 
 | 
        } 
 | 
    }; 
 | 
    Element.prototype.removeState = function (state) { 
 | 
        var idx = indexOf(this.currentStates, state); 
 | 
        if (idx >= 0) { 
 | 
            var currentStates = this.currentStates.slice(); 
 | 
            currentStates.splice(idx, 1); 
 | 
            this.useStates(currentStates); 
 | 
        } 
 | 
    }; 
 | 
    Element.prototype.replaceState = function (oldState, newState, forceAdd) { 
 | 
        var currentStates = this.currentStates.slice(); 
 | 
        var idx = indexOf(currentStates, oldState); 
 | 
        var newStateExists = indexOf(currentStates, newState) >= 0; 
 | 
        if (idx >= 0) { 
 | 
            if (!newStateExists) { 
 | 
                currentStates[idx] = newState; 
 | 
            } 
 | 
            else { 
 | 
                currentStates.splice(idx, 1); 
 | 
            } 
 | 
        } 
 | 
        else if (forceAdd && !newStateExists) { 
 | 
            currentStates.push(newState); 
 | 
        } 
 | 
        this.useStates(currentStates); 
 | 
    }; 
 | 
    Element.prototype.toggleState = function (state, enable) { 
 | 
        if (enable) { 
 | 
            this.useState(state, true); 
 | 
        } 
 | 
        else { 
 | 
            this.removeState(state); 
 | 
        } 
 | 
    }; 
 | 
    Element.prototype._mergeStates = function (states) { 
 | 
        var mergedState = {}; 
 | 
        var mergedTextConfig; 
 | 
        for (var i = 0; i < states.length; i++) { 
 | 
            var state = states[i]; 
 | 
            extend(mergedState, state); 
 | 
            if (state.textConfig) { 
 | 
                mergedTextConfig = mergedTextConfig || {}; 
 | 
                extend(mergedTextConfig, state.textConfig); 
 | 
            } 
 | 
        } 
 | 
        if (mergedTextConfig) { 
 | 
            mergedState.textConfig = mergedTextConfig; 
 | 
        } 
 | 
        return mergedState; 
 | 
    }; 
 | 
    Element.prototype._applyStateObj = function (stateName, state, normalState, keepCurrentStates, transition, animationCfg) { 
 | 
        var needsRestoreToNormal = !(state && keepCurrentStates); 
 | 
        if (state && state.textConfig) { 
 | 
            this.textConfig = extend({}, keepCurrentStates ? this.textConfig : normalState.textConfig); 
 | 
            extend(this.textConfig, state.textConfig); 
 | 
        } 
 | 
        else if (needsRestoreToNormal) { 
 | 
            if (normalState.textConfig) { 
 | 
                this.textConfig = normalState.textConfig; 
 | 
            } 
 | 
        } 
 | 
        var transitionTarget = {}; 
 | 
        var hasTransition = false; 
 | 
        for (var i = 0; i < PRIMARY_STATES_KEYS.length; i++) { 
 | 
            var key = PRIMARY_STATES_KEYS[i]; 
 | 
            var propNeedsTransition = transition && DEFAULT_ANIMATABLE_MAP[key]; 
 | 
            if (state && state[key] != null) { 
 | 
                if (propNeedsTransition) { 
 | 
                    hasTransition = true; 
 | 
                    transitionTarget[key] = state[key]; 
 | 
                } 
 | 
                else { 
 | 
                    this[key] = state[key]; 
 | 
                } 
 | 
            } 
 | 
            else if (needsRestoreToNormal) { 
 | 
                if (normalState[key] != null) { 
 | 
                    if (propNeedsTransition) { 
 | 
                        hasTransition = true; 
 | 
                        transitionTarget[key] = normalState[key]; 
 | 
                    } 
 | 
                    else { 
 | 
                        this[key] = normalState[key]; 
 | 
                    } 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
        if (!transition) { 
 | 
            for (var i = 0; i < this.animators.length; i++) { 
 | 
                var animator = this.animators[i]; 
 | 
                var targetName = animator.targetName; 
 | 
                if (!animator.getLoop()) { 
 | 
                    animator.__changeFinalValue(targetName 
 | 
                        ? (state || normalState)[targetName] 
 | 
                        : (state || normalState)); 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
        if (hasTransition) { 
 | 
            this._transitionState(stateName, transitionTarget, animationCfg); 
 | 
        } 
 | 
    }; 
 | 
    Element.prototype._attachComponent = function (componentEl) { 
 | 
        if (componentEl.__zr && !componentEl.__hostTarget) { 
 | 
            if (process.env.NODE_ENV !== 'production') { 
 | 
                throw new Error('Text element has been added to zrender.'); 
 | 
            } 
 | 
            return; 
 | 
        } 
 | 
        if (componentEl === this) { 
 | 
            if (process.env.NODE_ENV !== 'production') { 
 | 
                throw new Error('Recursive component attachment.'); 
 | 
            } 
 | 
            return; 
 | 
        } 
 | 
        var zr = this.__zr; 
 | 
        if (zr) { 
 | 
            componentEl.addSelfToZr(zr); 
 | 
        } 
 | 
        componentEl.__zr = zr; 
 | 
        componentEl.__hostTarget = this; 
 | 
    }; 
 | 
    Element.prototype._detachComponent = function (componentEl) { 
 | 
        if (componentEl.__zr) { 
 | 
            componentEl.removeSelfFromZr(componentEl.__zr); 
 | 
        } 
 | 
        componentEl.__zr = null; 
 | 
        componentEl.__hostTarget = null; 
 | 
    }; 
 | 
    Element.prototype.getClipPath = function () { 
 | 
        return this._clipPath; 
 | 
    }; 
 | 
    Element.prototype.setClipPath = function (clipPath) { 
 | 
        if (this._clipPath && this._clipPath !== clipPath) { 
 | 
            this.removeClipPath(); 
 | 
        } 
 | 
        this._attachComponent(clipPath); 
 | 
        this._clipPath = clipPath; 
 | 
        this.markRedraw(); 
 | 
    }; 
 | 
    Element.prototype.removeClipPath = function () { 
 | 
        var clipPath = this._clipPath; 
 | 
        if (clipPath) { 
 | 
            this._detachComponent(clipPath); 
 | 
            this._clipPath = null; 
 | 
            this.markRedraw(); 
 | 
        } 
 | 
    }; 
 | 
    Element.prototype.getTextContent = function () { 
 | 
        return this._textContent; 
 | 
    }; 
 | 
    Element.prototype.setTextContent = function (textEl) { 
 | 
        var previousTextContent = this._textContent; 
 | 
        if (previousTextContent === textEl) { 
 | 
            return; 
 | 
        } 
 | 
        if (previousTextContent && previousTextContent !== textEl) { 
 | 
            this.removeTextContent(); 
 | 
        } 
 | 
        if (process.env.NODE_ENV !== 'production') { 
 | 
            if (textEl.__zr && !textEl.__hostTarget) { 
 | 
                throw new Error('Text element has been added to zrender.'); 
 | 
            } 
 | 
        } 
 | 
        textEl.innerTransformable = new Transformable(); 
 | 
        this._attachComponent(textEl); 
 | 
        this._textContent = textEl; 
 | 
        this.markRedraw(); 
 | 
    }; 
 | 
    Element.prototype.setTextConfig = function (cfg) { 
 | 
        if (!this.textConfig) { 
 | 
            this.textConfig = {}; 
 | 
        } 
 | 
        extend(this.textConfig, cfg); 
 | 
        this.markRedraw(); 
 | 
    }; 
 | 
    Element.prototype.removeTextConfig = function () { 
 | 
        this.textConfig = null; 
 | 
        this.markRedraw(); 
 | 
    }; 
 | 
    Element.prototype.removeTextContent = function () { 
 | 
        var textEl = this._textContent; 
 | 
        if (textEl) { 
 | 
            textEl.innerTransformable = null; 
 | 
            this._detachComponent(textEl); 
 | 
            this._textContent = null; 
 | 
            this._innerTextDefaultStyle = null; 
 | 
            this.markRedraw(); 
 | 
        } 
 | 
    }; 
 | 
    Element.prototype.getTextGuideLine = function () { 
 | 
        return this._textGuide; 
 | 
    }; 
 | 
    Element.prototype.setTextGuideLine = function (guideLine) { 
 | 
        if (this._textGuide && this._textGuide !== guideLine) { 
 | 
            this.removeTextGuideLine(); 
 | 
        } 
 | 
        this._attachComponent(guideLine); 
 | 
        this._textGuide = guideLine; 
 | 
        this.markRedraw(); 
 | 
    }; 
 | 
    Element.prototype.removeTextGuideLine = function () { 
 | 
        var textGuide = this._textGuide; 
 | 
        if (textGuide) { 
 | 
            this._detachComponent(textGuide); 
 | 
            this._textGuide = null; 
 | 
            this.markRedraw(); 
 | 
        } 
 | 
    }; 
 | 
    Element.prototype.markRedraw = function () { 
 | 
        this.__dirty |= REDRAW_BIT; 
 | 
        var zr = this.__zr; 
 | 
        if (zr) { 
 | 
            if (this.__inHover) { 
 | 
                zr.refreshHover(); 
 | 
            } 
 | 
            else { 
 | 
                zr.refresh(); 
 | 
            } 
 | 
        } 
 | 
        if (this.__hostTarget) { 
 | 
            this.__hostTarget.markRedraw(); 
 | 
        } 
 | 
    }; 
 | 
    Element.prototype.dirty = function () { 
 | 
        this.markRedraw(); 
 | 
    }; 
 | 
    Element.prototype._toggleHoverLayerFlag = function (inHover) { 
 | 
        this.__inHover = inHover; 
 | 
        var textContent = this._textContent; 
 | 
        var textGuide = this._textGuide; 
 | 
        if (textContent) { 
 | 
            textContent.__inHover = inHover; 
 | 
        } 
 | 
        if (textGuide) { 
 | 
            textGuide.__inHover = inHover; 
 | 
        } 
 | 
    }; 
 | 
    Element.prototype.addSelfToZr = function (zr) { 
 | 
        if (this.__zr === zr) { 
 | 
            return; 
 | 
        } 
 | 
        this.__zr = zr; 
 | 
        var animators = this.animators; 
 | 
        if (animators) { 
 | 
            for (var i = 0; i < animators.length; i++) { 
 | 
                zr.animation.addAnimator(animators[i]); 
 | 
            } 
 | 
        } 
 | 
        if (this._clipPath) { 
 | 
            this._clipPath.addSelfToZr(zr); 
 | 
        } 
 | 
        if (this._textContent) { 
 | 
            this._textContent.addSelfToZr(zr); 
 | 
        } 
 | 
        if (this._textGuide) { 
 | 
            this._textGuide.addSelfToZr(zr); 
 | 
        } 
 | 
    }; 
 | 
    Element.prototype.removeSelfFromZr = function (zr) { 
 | 
        if (!this.__zr) { 
 | 
            return; 
 | 
        } 
 | 
        this.__zr = null; 
 | 
        var animators = this.animators; 
 | 
        if (animators) { 
 | 
            for (var i = 0; i < animators.length; i++) { 
 | 
                zr.animation.removeAnimator(animators[i]); 
 | 
            } 
 | 
        } 
 | 
        if (this._clipPath) { 
 | 
            this._clipPath.removeSelfFromZr(zr); 
 | 
        } 
 | 
        if (this._textContent) { 
 | 
            this._textContent.removeSelfFromZr(zr); 
 | 
        } 
 | 
        if (this._textGuide) { 
 | 
            this._textGuide.removeSelfFromZr(zr); 
 | 
        } 
 | 
    }; 
 | 
    Element.prototype.animate = function (key, loop, allowDiscreteAnimation) { 
 | 
        var target = key ? this[key] : this; 
 | 
        if (process.env.NODE_ENV !== 'production') { 
 | 
            if (!target) { 
 | 
                logError('Property "' 
 | 
                    + key 
 | 
                    + '" is not existed in element ' 
 | 
                    + this.id); 
 | 
                return; 
 | 
            } 
 | 
        } 
 | 
        var animator = new Animator(target, loop, allowDiscreteAnimation); 
 | 
        key && (animator.targetName = key); 
 | 
        this.addAnimator(animator, key); 
 | 
        return animator; 
 | 
    }; 
 | 
    Element.prototype.addAnimator = function (animator, key) { 
 | 
        var zr = this.__zr; 
 | 
        var el = this; 
 | 
        animator.during(function () { 
 | 
            el.updateDuringAnimation(key); 
 | 
        }).done(function () { 
 | 
            var animators = el.animators; 
 | 
            var idx = indexOf(animators, animator); 
 | 
            if (idx >= 0) { 
 | 
                animators.splice(idx, 1); 
 | 
            } 
 | 
        }); 
 | 
        this.animators.push(animator); 
 | 
        if (zr) { 
 | 
            zr.animation.addAnimator(animator); 
 | 
        } 
 | 
        zr && zr.wakeUp(); 
 | 
    }; 
 | 
    Element.prototype.updateDuringAnimation = function (key) { 
 | 
        this.markRedraw(); 
 | 
    }; 
 | 
    Element.prototype.stopAnimation = function (scope, forwardToLast) { 
 | 
        var animators = this.animators; 
 | 
        var len = animators.length; 
 | 
        var leftAnimators = []; 
 | 
        for (var i = 0; i < len; i++) { 
 | 
            var animator = animators[i]; 
 | 
            if (!scope || scope === animator.scope) { 
 | 
                animator.stop(forwardToLast); 
 | 
            } 
 | 
            else { 
 | 
                leftAnimators.push(animator); 
 | 
            } 
 | 
        } 
 | 
        this.animators = leftAnimators; 
 | 
        return this; 
 | 
    }; 
 | 
    Element.prototype.animateTo = function (target, cfg, animationProps) { 
 | 
        animateTo(this, target, cfg, animationProps); 
 | 
    }; 
 | 
    Element.prototype.animateFrom = function (target, cfg, animationProps) { 
 | 
        animateTo(this, target, cfg, animationProps, true); 
 | 
    }; 
 | 
    Element.prototype._transitionState = function (stateName, target, cfg, animationProps) { 
 | 
        var animators = animateTo(this, target, cfg, animationProps); 
 | 
        for (var i = 0; i < animators.length; i++) { 
 | 
            animators[i].__fromStateTransition = stateName; 
 | 
        } 
 | 
    }; 
 | 
    Element.prototype.getBoundingRect = function () { 
 | 
        return null; 
 | 
    }; 
 | 
    Element.prototype.getPaintRect = function () { 
 | 
        return null; 
 | 
    }; 
 | 
    Element.initDefaultProps = (function () { 
 | 
        var elProto = Element.prototype; 
 | 
        elProto.type = 'element'; 
 | 
        elProto.name = ''; 
 | 
        elProto.ignore = 
 | 
            elProto.silent = 
 | 
                elProto.isGroup = 
 | 
                    elProto.draggable = 
 | 
                        elProto.dragging = 
 | 
                            elProto.ignoreClip = 
 | 
                                elProto.__inHover = false; 
 | 
        elProto.__dirty = REDRAW_BIT; 
 | 
        var logs = {}; 
 | 
        function logDeprecatedError(key, xKey, yKey) { 
 | 
            if (!logs[key + xKey + yKey]) { 
 | 
                console.warn("DEPRECATED: '" + key + "' has been deprecated. use '" + xKey + "', '" + yKey + "' instead"); 
 | 
                logs[key + xKey + yKey] = true; 
 | 
            } 
 | 
        } 
 | 
        function createLegacyProperty(key, privateKey, xKey, yKey) { 
 | 
            Object.defineProperty(elProto, key, { 
 | 
                get: function () { 
 | 
                    if (process.env.NODE_ENV !== 'production') { 
 | 
                        logDeprecatedError(key, xKey, yKey); 
 | 
                    } 
 | 
                    if (!this[privateKey]) { 
 | 
                        var pos = this[privateKey] = []; 
 | 
                        enhanceArray(this, pos); 
 | 
                    } 
 | 
                    return this[privateKey]; 
 | 
                }, 
 | 
                set: function (pos) { 
 | 
                    if (process.env.NODE_ENV !== 'production') { 
 | 
                        logDeprecatedError(key, xKey, yKey); 
 | 
                    } 
 | 
                    this[xKey] = pos[0]; 
 | 
                    this[yKey] = pos[1]; 
 | 
                    this[privateKey] = pos; 
 | 
                    enhanceArray(this, pos); 
 | 
                } 
 | 
            }); 
 | 
            function enhanceArray(self, pos) { 
 | 
                Object.defineProperty(pos, 0, { 
 | 
                    get: function () { 
 | 
                        return self[xKey]; 
 | 
                    }, 
 | 
                    set: function (val) { 
 | 
                        self[xKey] = val; 
 | 
                    } 
 | 
                }); 
 | 
                Object.defineProperty(pos, 1, { 
 | 
                    get: function () { 
 | 
                        return self[yKey]; 
 | 
                    }, 
 | 
                    set: function (val) { 
 | 
                        self[yKey] = val; 
 | 
                    } 
 | 
                }); 
 | 
            } 
 | 
        } 
 | 
        if (Object.defineProperty) { 
 | 
            createLegacyProperty('position', '_legacyPos', 'x', 'y'); 
 | 
            createLegacyProperty('scale', '_legacyScale', 'scaleX', 'scaleY'); 
 | 
            createLegacyProperty('origin', '_legacyOrigin', 'originX', 'originY'); 
 | 
        } 
 | 
    })(); 
 | 
    return Element; 
 | 
}()); 
 | 
mixin(Element, Eventful); 
 | 
mixin(Element, Transformable); 
 | 
function animateTo(animatable, target, cfg, animationProps, reverse) { 
 | 
    cfg = cfg || {}; 
 | 
    var animators = []; 
 | 
    animateToShallow(animatable, '', animatable, target, cfg, animationProps, animators, reverse); 
 | 
    var finishCount = animators.length; 
 | 
    var doneHappened = false; 
 | 
    var cfgDone = cfg.done; 
 | 
    var cfgAborted = cfg.aborted; 
 | 
    var doneCb = function () { 
 | 
        doneHappened = true; 
 | 
        finishCount--; 
 | 
        if (finishCount <= 0) { 
 | 
            doneHappened 
 | 
                ? (cfgDone && cfgDone()) 
 | 
                : (cfgAborted && cfgAborted()); 
 | 
        } 
 | 
    }; 
 | 
    var abortedCb = function () { 
 | 
        finishCount--; 
 | 
        if (finishCount <= 0) { 
 | 
            doneHappened 
 | 
                ? (cfgDone && cfgDone()) 
 | 
                : (cfgAborted && cfgAborted()); 
 | 
        } 
 | 
    }; 
 | 
    if (!finishCount) { 
 | 
        cfgDone && cfgDone(); 
 | 
    } 
 | 
    if (animators.length > 0 && cfg.during) { 
 | 
        animators[0].during(function (target, percent) { 
 | 
            cfg.during(percent); 
 | 
        }); 
 | 
    } 
 | 
    for (var i = 0; i < animators.length; i++) { 
 | 
        var animator = animators[i]; 
 | 
        if (doneCb) { 
 | 
            animator.done(doneCb); 
 | 
        } 
 | 
        if (abortedCb) { 
 | 
            animator.aborted(abortedCb); 
 | 
        } 
 | 
        if (cfg.force) { 
 | 
            animator.duration(cfg.duration); 
 | 
        } 
 | 
        animator.start(cfg.easing); 
 | 
    } 
 | 
    return animators; 
 | 
} 
 | 
function copyArrShallow(source, target, len) { 
 | 
    for (var i = 0; i < len; i++) { 
 | 
        source[i] = target[i]; 
 | 
    } 
 | 
} 
 | 
function is2DArray(value) { 
 | 
    return isArrayLike(value[0]); 
 | 
} 
 | 
function copyValue(target, source, key) { 
 | 
    if (isArrayLike(source[key])) { 
 | 
        if (!isArrayLike(target[key])) { 
 | 
            target[key] = []; 
 | 
        } 
 | 
        if (isTypedArray(source[key])) { 
 | 
            var len = source[key].length; 
 | 
            if (target[key].length !== len) { 
 | 
                target[key] = new (source[key].constructor)(len); 
 | 
                copyArrShallow(target[key], source[key], len); 
 | 
            } 
 | 
        } 
 | 
        else { 
 | 
            var sourceArr = source[key]; 
 | 
            var targetArr = target[key]; 
 | 
            var len0 = sourceArr.length; 
 | 
            if (is2DArray(sourceArr)) { 
 | 
                var len1 = sourceArr[0].length; 
 | 
                for (var i = 0; i < len0; i++) { 
 | 
                    if (!targetArr[i]) { 
 | 
                        targetArr[i] = Array.prototype.slice.call(sourceArr[i]); 
 | 
                    } 
 | 
                    else { 
 | 
                        copyArrShallow(targetArr[i], sourceArr[i], len1); 
 | 
                    } 
 | 
                } 
 | 
            } 
 | 
            else { 
 | 
                copyArrShallow(targetArr, sourceArr, len0); 
 | 
            } 
 | 
            targetArr.length = sourceArr.length; 
 | 
        } 
 | 
    } 
 | 
    else { 
 | 
        target[key] = source[key]; 
 | 
    } 
 | 
} 
 | 
function isValueSame(val1, val2) { 
 | 
    return val1 === val2 
 | 
        || isArrayLike(val1) && isArrayLike(val2) && is1DArraySame(val1, val2); 
 | 
} 
 | 
function is1DArraySame(arr0, arr1) { 
 | 
    var len = arr0.length; 
 | 
    if (len !== arr1.length) { 
 | 
        return false; 
 | 
    } 
 | 
    for (var i = 0; i < len; i++) { 
 | 
        if (arr0[i] !== arr1[i]) { 
 | 
            return false; 
 | 
        } 
 | 
    } 
 | 
    return true; 
 | 
} 
 | 
function animateToShallow(animatable, topKey, animateObj, target, cfg, animationProps, animators, reverse) { 
 | 
    var targetKeys = keys(target); 
 | 
    var duration = cfg.duration; 
 | 
    var delay = cfg.delay; 
 | 
    var additive = cfg.additive; 
 | 
    var setToFinal = cfg.setToFinal; 
 | 
    var animateAll = !isObject(animationProps); 
 | 
    var existsAnimators = animatable.animators; 
 | 
    var animationKeys = []; 
 | 
    for (var k = 0; k < targetKeys.length; k++) { 
 | 
        var innerKey = targetKeys[k]; 
 | 
        var targetVal = target[innerKey]; 
 | 
        if (targetVal != null && animateObj[innerKey] != null 
 | 
            && (animateAll || animationProps[innerKey])) { 
 | 
            if (isObject(targetVal) 
 | 
                && !isArrayLike(targetVal) 
 | 
                && !isGradientObject(targetVal)) { 
 | 
                if (topKey) { 
 | 
                    if (!reverse) { 
 | 
                        animateObj[innerKey] = targetVal; 
 | 
                        animatable.updateDuringAnimation(topKey); 
 | 
                    } 
 | 
                    continue; 
 | 
                } 
 | 
                animateToShallow(animatable, innerKey, animateObj[innerKey], targetVal, cfg, animationProps && animationProps[innerKey], animators, reverse); 
 | 
            } 
 | 
            else { 
 | 
                animationKeys.push(innerKey); 
 | 
            } 
 | 
        } 
 | 
        else if (!reverse) { 
 | 
            animateObj[innerKey] = targetVal; 
 | 
            animatable.updateDuringAnimation(topKey); 
 | 
            animationKeys.push(innerKey); 
 | 
        } 
 | 
    } 
 | 
    var keyLen = animationKeys.length; 
 | 
    if (!additive && keyLen) { 
 | 
        for (var i = 0; i < existsAnimators.length; i++) { 
 | 
            var animator = existsAnimators[i]; 
 | 
            if (animator.targetName === topKey) { 
 | 
                var allAborted = animator.stopTracks(animationKeys); 
 | 
                if (allAborted) { 
 | 
                    var idx = indexOf(existsAnimators, animator); 
 | 
                    existsAnimators.splice(idx, 1); 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
    if (!cfg.force) { 
 | 
        animationKeys = filter(animationKeys, function (key) { return !isValueSame(target[key], animateObj[key]); }); 
 | 
        keyLen = animationKeys.length; 
 | 
    } 
 | 
    if (keyLen > 0 
 | 
        || (cfg.force && !animators.length)) { 
 | 
        var revertedSource = void 0; 
 | 
        var reversedTarget = void 0; 
 | 
        var sourceClone = void 0; 
 | 
        if (reverse) { 
 | 
            reversedTarget = {}; 
 | 
            if (setToFinal) { 
 | 
                revertedSource = {}; 
 | 
            } 
 | 
            for (var i = 0; i < keyLen; i++) { 
 | 
                var innerKey = animationKeys[i]; 
 | 
                reversedTarget[innerKey] = animateObj[innerKey]; 
 | 
                if (setToFinal) { 
 | 
                    revertedSource[innerKey] = target[innerKey]; 
 | 
                } 
 | 
                else { 
 | 
                    animateObj[innerKey] = target[innerKey]; 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
        else if (setToFinal) { 
 | 
            sourceClone = {}; 
 | 
            for (var i = 0; i < keyLen; i++) { 
 | 
                var innerKey = animationKeys[i]; 
 | 
                sourceClone[innerKey] = cloneValue(animateObj[innerKey]); 
 | 
                copyValue(animateObj, target, innerKey); 
 | 
            } 
 | 
        } 
 | 
        var animator = new Animator(animateObj, false, false, additive ? filter(existsAnimators, function (animator) { return animator.targetName === topKey; }) : null); 
 | 
        animator.targetName = topKey; 
 | 
        if (cfg.scope) { 
 | 
            animator.scope = cfg.scope; 
 | 
        } 
 | 
        if (setToFinal && revertedSource) { 
 | 
            animator.whenWithKeys(0, revertedSource, animationKeys); 
 | 
        } 
 | 
        if (sourceClone) { 
 | 
            animator.whenWithKeys(0, sourceClone, animationKeys); 
 | 
        } 
 | 
        animator.whenWithKeys(duration == null ? 500 : duration, reverse ? reversedTarget : target, animationKeys).delay(delay || 0); 
 | 
        animatable.addAnimator(animator, topKey); 
 | 
        animators.push(animator); 
 | 
    } 
 | 
} 
 | 
export default Element; 
 |