import Displayable from '../graphic/Displayable'; 
 | 
import { liftColor } from '../tool/color'; 
 | 
import { BrushScope, SVGVNodeAttrs } from './core'; 
 | 
import { getClassId } from './cssClassId'; 
 | 
  
 | 
export function createCSSEmphasis( 
 | 
    el: Displayable, 
 | 
    attrs: SVGVNodeAttrs, 
 | 
    scope: BrushScope 
 | 
) { 
 | 
    if (!el.ignore) { 
 | 
        if (el.isSilent()) { 
 | 
            // If el is silent, it can not be hovered nor selected. 
 | 
            // So set pointer-events to pass through. 
 | 
            const style = { 
 | 
                'pointer-events': 'none' 
 | 
            }; 
 | 
            setClassAttribute(style, attrs, scope, true); 
 | 
        } 
 | 
        else { 
 | 
            const emphasisStyle = el.states.emphasis && el.states.emphasis.style 
 | 
                ? el.states.emphasis.style 
 | 
                : {}; 
 | 
            let fill = emphasisStyle.fill; 
 | 
            if (!fill) { 
 | 
                // No empahsis fill, lift color 
 | 
                const normalFill = el.style && el.style.fill; 
 | 
                const selectFill = el.states.select 
 | 
                    && el.states.select.style 
 | 
                    && el.states.select.style.fill; 
 | 
                const fromFill = el.currentStates.indexOf('select') >= 0 
 | 
                    ? (selectFill || normalFill) 
 | 
                    : normalFill; 
 | 
                if (fromFill) { 
 | 
                    fill = liftColor(fromFill); 
 | 
                } 
 | 
            } 
 | 
            let lineWidth = emphasisStyle.lineWidth; 
 | 
            if (lineWidth) { 
 | 
                // Symbols use transform to set size, so lineWidth 
 | 
                // should be divided by scaleX 
 | 
                const scaleX = (!emphasisStyle.strokeNoScale && el.transform) 
 | 
                    ? el.transform[0] 
 | 
                    : 1; 
 | 
                lineWidth = lineWidth / scaleX; 
 | 
            } 
 | 
            const style = { 
 | 
                cursor: 'pointer', // TODO: Should this be customized? 
 | 
            } as any; 
 | 
            if (fill) { 
 | 
                style.fill = fill; 
 | 
            } 
 | 
            if (emphasisStyle.stroke) { 
 | 
                style.stroke = emphasisStyle.stroke; 
 | 
            } 
 | 
            if (lineWidth) { 
 | 
                style['stroke-width'] = lineWidth; 
 | 
            } 
 | 
            setClassAttribute(style, attrs, scope, true); 
 | 
        } 
 | 
    } 
 | 
} 
 | 
  
 | 
function setClassAttribute(style: object, attrs: SVGVNodeAttrs, scope: BrushScope, withHover: boolean) { 
 | 
    const styleKey = JSON.stringify(style); 
 | 
    let className = scope.cssStyleCache[styleKey]; 
 | 
    if (!className) { 
 | 
        className = scope.zrId + '-cls-' + getClassId(); 
 | 
        scope.cssStyleCache[styleKey] = className; 
 | 
        scope.cssNodes['.' + className + (withHover ? ':hover' : '')] = style as any; 
 | 
    } 
 | 
    attrs.class = attrs.class ? (attrs.class + ' ' + className) : className; 
 | 
} 
 |