| 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._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; |