genGradientColor.mjs

import oc from './color.mjs'
import iser from './iser.mjs'


/**
 * 產生highchart直條圖用漸變顏色物件
 *
 * Unit Test: {@link https://github.com/yuda-lyu/wsemi/blob/master/test/genGradientColor.test.mjs Github}
 * @memberOf wsemi
 * @param {*} color 輸入color資料
 * @returns {Object} 回傳漸變顏色物件
 * @example
 *
 * console.log(genGradientColor('#000'))
 * // => {
 * //     linearGradient: { x1: 0, x2: 0, y1: 0, y2: 1 },
 * //     stops: [ [ 0, 'rgba(0, 0, 0, 0.4)' ], [ 1, 'rgba(0, 0, 0, 0.9)' ] ]
 * //     }
 *
 * console.log(genGradientColor('hsl (320, 50%, 40%)'))
 * // => {
 * //     linearGradient: { x1: 0, x2: 0, y1: 0, y2: 1 },
 * //     stops: [
 * //         [ 0, 'rgba(153, 51, 119, 0.4)' ],
 * //         [ 1, 'rgba(153, 51, 119, 0.9)' ]
 * //     ]
 * // }
 *
 * console.log(genGradientColor('hsva (320, 100%, 50%, 0.1)'))
 * // => {
 * //     linearGradient: { x1: 0, x2: 0, y1: 0, y2: 1 },
 * //     stops: [ [ 0, 'rgba(128, 0, 85, 0.4)' ], [ 1, 'rgba(128, 0, 85, 0.9)' ] ]
 * // }
 *
 * console.log(genGradientColor('#6a3'))
 * // => {
 * //     linearGradient: { x1: 0, x2: 0, y1: 0, y2: 1 },
 * //     stops: [
 * //         [ 0, 'rgba(102, 170, 51, 0.4)' ],
 * //         [ 1, 'rgba(102, 170, 51, 0.9)' ]
 * //     ]
 * // }
 *
 * console.log(genGradientColor('#6b8e23'))
 * // => {
 * //     linearGradient: { x1: 0, x2: 0, y1: 0, y2: 1 },
 * //     stops: [
 * //         [ 0, 'rgba(107, 142, 35, 0.4)' ],
 * //         [ 1, 'rgba(107, 142, 35, 0.9)' ]
 * //     ]
 * // }
 *
 * console.log(genGradientColor('skyblue'))
 * // => {
 * //     linearGradient: { x1: 0, x2: 0, y1: 0, y2: 1 },
 * //     stops: [
 * //         [ 0, 'rgba(135, 206, 235, 0.4)' ],
 * //         [ 1, 'rgba(135, 206, 235, 0.9)' ]
 * //     ]
 * // }
 *
 */
function genGradientColor(color) {

    //check
    if (iser(color)) {
        return {}
    }

    //rgba
    let rgba
    try {
        rgba = oc.toRgba(color)
    }
    catch (err) {
        return {}
    }

    //cv
    function cv(o, a) {
        o.a = a
        let r = oc.toRgbaString(o)
        return r
    }

    let c0 = cv(rgba, 0.4)
    let c1 = cv(rgba, 0.9)

    return {
        linearGradient: { x1: 0, x2: 0, y1: 0, y2: 1 },
        stops: [
            [0, c0],
            [1, c1]
        ]
    }
}


export default genGradientColor