{"version":3,"file":"chartjs-plugin-gradient.min.js","sources":["../src/helpers.js","../src/colors.js","../src/legend.js","../src/index.js"],"sourcesContent":["import {Chart} from 'chart.js';\nimport {isNumber} from 'chart.js/helpers';\n\nexport const isChartV3 = Chart.version;\n\nconst parse = isChartV3\n ? (scale, value) => scale.parse(value)\n : (scale, value) => value;\n\nfunction scaleValue(scale, value) {\n const normValue = isNumber(value) ? parseFloat(value) : parse(scale, value);\n return scale.getPixelForValue(normValue);\n}\n\n/**\n * @typedef { import(\"chart.js\").Chart } Chart\n * @typedef { import(\"chart.js\").Scale } Scale\n */\n\n/**\n * check if the area is consistent\n * @param {Object} area - area to check\n * @returns {boolean}\n */\nexport const areaIsValid = (area) => area && area.right > area.left && area.bottom > area.top;\n\n/**\n * Create a canvas gradient\n * @param {CanvasRenderingContext2D} ctx - chart canvas context\n * @param {string} axis - axis type of scale\n * @param {Object} area - scale instance\n * @returns {CanvasGradient} created gradient\n */\nexport function createGradient(ctx, axis, area) {\n if (axis === 'r') {\n return ctx.createRadialGradient(area.xCenter, area.yCenter, 0, area.xCenter, area.yCenter, area.drawingArea);\n }\n if (axis === 'y') {\n return ctx.createLinearGradient(0, area.bottom, 0, area.top);\n }\n return ctx.createLinearGradient(area.left, 0, area.right, 0);\n}\n\n/**\n * Add color stop to a gradient\n * @param {CanvasGradient} gradient - gradient instance\n * @param {Array} colors - all colors to add\n */\nexport function applyColors(gradient, colors) {\n colors.forEach(function(item) {\n gradient.addColorStop(\n item.stop, item.color.rgbString()\n );\n });\n}\n\n/**\n * Get the gradient plugin configuration from the state for a specific dataset option\n * @param {Object} state - state of the plugin\n * @param {{key: string, legendItemKey: string}} keyOption - option of the dataset where the gradient is applied\n * @param {number} datasetIndex - dataset index\n * @returns {Object|undefined} gradient plugin configuration from the state for a specific dataset option\n */\nexport function getGradientData(state, keyOption, datasetIndex) {\n if (state.options.has(keyOption.key)) {\n const option = state.options.get(keyOption.key);\n const gradientData = option.filter((el) => el.datasetIndex === datasetIndex);\n if (gradientData.length) {\n return gradientData[0];\n }\n }\n}\n\n/**\n * Get the pixel and its percentage on the scale, used for color stop in the gradient, for the passed value\n * @param {Scale} scale - scale used by dataset\n * @param {string|number} value - value to search\n * @returns {{pixel: number, stop: number}} the pixel and its percentage on the scale, used for color stop in the gradient\n */\nexport function getPixelStop(scale, value) {\n if (scale.type === 'radialLinear') {\n const distance = scale.getDistanceFromCenterForValue(value);\n return {pixel: distance, stop: distance / scale.drawingArea};\n }\n const reverse = scale.options.reverse;\n const pixel = scaleValue(scale, value);\n const stop = scale.getDecimalForPixel(pixel);\n return {pixel, stop: reverse ? 1 - stop : stop};\n}\n","import {color} from 'chart.js/helpers';\nimport {getGradientData, getPixelStop} from './helpers';\n\n// IEC 61966-2-1:1999\nconst toRGBs = (l) => l <= 0.0031308 ? l * 12.92 : Math.pow(l, 1.0 / 2.4) * 1.055 - 0.055;\n// IEC 61966-2-1:1999\nconst fromRGBs = (srgb) => srgb <= 0.04045 ? srgb / 12.92 : Math.pow((srgb + 0.055) / 1.055, 2.4);\n\nfunction interpolate(percent, startColor, endColor) {\n const start = startColor.color.rgb;\n const startR = fromRGBs(start.r / 255);\n const startG = fromRGBs(start.g / 255);\n const startB = fromRGBs(start.b / 255);\n\n const end = endColor.color.rgb;\n const endR = fromRGBs(end.r / 255);\n const endG = fromRGBs(end.g / 255);\n const endB = fromRGBs(end.b / 255);\n\n return color({\n r: Math.round(toRGBs(startR + percent * (endR - startR)) * 255),\n g: Math.round(toRGBs(startG + percent * (endG - startG)) * 255),\n b: Math.round(toRGBs(startB + percent * (endB - startB)) * 255),\n a: start.a + percent * Math.abs(end.a - start.a)\n });\n}\n\n/**\n * Calculate a color from gradient stop color by a value of the dataset.\n * @param {Object} state - state of the plugin\n * @param {{key: string, legendItemKey: string}} keyOption - option of the dataset where the gradient is applied\n * @param {number} datasetIndex - dataset index\n * @param {number} value - value used for searching the color\n * @returns {Object} calculated color\n */\nexport function getInterpolatedColorByValue(state, keyOption, datasetIndex, value) {\n const data = getGradientData(state, keyOption, datasetIndex);\n if (!data || !data.stopColors.length) {\n return;\n }\n const {stop: percent} = getPixelStop(data.scale, value);\n let startColor, endColor;\n for (const stopColor of data.stopColors) {\n if (stopColor.stop === percent) {\n return stopColor.color;\n }\n if (stopColor.stop < percent) {\n startColor = stopColor;\n } else if (stopColor.stop > percent && !endColor) {\n endColor = stopColor;\n }\n }\n if (!endColor) {\n return startColor;\n }\n return interpolate(percent, startColor, endColor);\n}\n","import {defined} from 'chart.js/helpers';\nimport {getInterpolatedColorByValue} from './colors';\nimport {areaIsValid, createGradient, applyColors, getGradientData} from './helpers';\n\nconst legendOptions = [\n {key: 'backgroundColor', legendItemKey: 'fillStyle'},\n {key: 'borderColor', legendItemKey: 'strokeStyle'}];\n\nconst legendBoxHeight = (chart, options) => options.labels && options.labels.font && defined(options.labels.font.size)\n ? options.labels.font.size\n : chart.options.font.size;\n\nfunction setLegendItem(state, ctx, keyOption, item, area) {\n const data = getGradientData(state, keyOption, item.datasetIndex);\n if (!data || !data.stopColors.length) {\n return;\n }\n const value = createGradient(ctx, data.axis, area);\n applyColors(value, data.stopColors);\n item[keyOption.legendItemKey] = value;\n}\n\nfunction buildArea(hitBox, {boxWidth, boxHeight}) {\n return {\n top: hitBox.top,\n left: hitBox.left,\n bottom: hitBox.top + boxHeight,\n right: hitBox.left + boxWidth,\n xCenter: hitBox.left + boxWidth / 2,\n yCenter: hitBox.top + boxHeight / 2,\n drawingArea: Math.max(boxWidth, boxHeight) / 2\n };\n}\n\nfunction applyGradientToLegendByDatasetIndex(chart, state, item, boxSize) {\n const hitBox = chart.legend.legendHitBoxes[item.datasetIndex];\n const area = buildArea(hitBox, boxSize);\n if (areaIsValid(area)) {\n legendOptions.forEach(function(keyOption) {\n setLegendItem(state, chart.ctx, keyOption, item, area);\n });\n }\n}\n\nfunction applyGradientToLegendByDataIndex(chart, state, dataset, datasetIndex) {\n for (const item of chart.legend.legendItems) {\n legendOptions.forEach(function(keyOption) {\n const value = dataset.data[item.index];\n const c = getInterpolatedColorByValue(state, keyOption, datasetIndex, value);\n if (c && c.valid) {\n item[keyOption.legendItemKey] = c.rgbString();\n }\n });\n }\n}\n\n/**\n * @typedef { import(\"chart.js\").Chart } Chart\n */\n\n/**\n * Udpate the legend items, applying the gradients\n * @param {Chart} chart - chart instance\n * @param {Object} state - state of the plugin\n */\nexport function updateLegendItems(chart, state) {\n const legend = chart.legend;\n const options = legend.options;\n const boxHeight = options.labels.boxHeight\n ? options.labels.boxHeight\n : legendBoxHeight(chart, options);\n const boxWidth = options.labels.boxWidth;\n const datasets = chart.data.datasets;\n for (let i = 0; i < datasets.length; i++) {\n const item = legend.legendItems[i];\n if (item.datasetIndex === i) {\n applyGradientToLegendByDatasetIndex(chart, state, item, {boxWidth, boxHeight});\n } else {\n applyGradientToLegendByDataIndex(chart, state, datasets[i], i);\n }\n }\n}\n","import {color} from 'chart.js/helpers';\nimport {updateLegendItems} from './legend';\nimport {areaIsValid, createGradient, applyColors, getPixelStop, isChartV3} from './helpers';\n\nconst chartStates = new Map();\n\nconst getScale = isChartV3\n ? (meta, axis) => meta[axis + 'Scale']\n : (meta, axis) => meta.controller['_' + axis + 'Scale'];\n\nfunction addColors(scale, colors, stopColors) {\n for (const value of Object.keys(colors)) {\n const {pixel, stop} = getPixelStop(scale, value);\n if (isFinite(pixel) && isFinite(stop)) {\n const colorStop = color(colors[value]);\n if (colorStop && colorStop.valid) {\n stopColors.push({\n stop: Math.max(0, Math.min(1, stop)),\n color: colorStop\n });\n }\n }\n }\n stopColors.sort((a, b) => a.stop - b.stop);\n}\n\nfunction setValue(meta, dataset, key, value) {\n dataset[key] = value;\n if (!meta.dataset) {\n return;\n }\n\n if (meta.dataset.options) {\n meta.dataset.options[key] = value;\n } else {\n meta.dataset[key] = value;\n }\n}\n\nfunction getStateOptions(state, meta, key, datasetIndex) {\n let stateOptions = state.options.get(key);\n if (!stateOptions) {\n stateOptions = [];\n state.options.set(key, stateOptions);\n } else if (!meta.hidden) {\n stateOptions = stateOptions.filter((el) => el.datasetIndex !== datasetIndex);\n state.options.set(key, stateOptions);\n }\n return stateOptions;\n}\n\nfunction updateDataset(chart, state, gradient, dataset, datasetIndex) {\n const ctx = chart.ctx;\n const meta = chart.getDatasetMeta(datasetIndex);\n if (meta.hidden) {\n return;\n }\n for (const [key, options] of Object.entries(gradient)) {\n const {axis, colors} = options;\n if (!colors) {\n continue;\n }\n const scale = getScale(meta, axis);\n if (!scale) {\n console.warn(`Scale not found for '${axis}'-axis in datasets[${datasetIndex}] of chart id ${chart.id}, skipping.`);\n continue;\n }\n const stateOptions = getStateOptions(state, meta, key, datasetIndex);\n const option = {\n datasetIndex,\n axis,\n scale,\n stopColors: []\n };\n stateOptions.push(option);\n const value = createGradient(ctx, axis, scale);\n addColors(scale, colors, option.stopColors);\n if (option.stopColors.length) {\n applyColors(value, option.stopColors);\n setValue(meta, dataset, key, value);\n }\n }\n}\n\nexport default {\n id: 'gradient',\n\n beforeInit(chart) {\n const state = {};\n state.options = new Map();\n chartStates.set(chart, state);\n },\n\n beforeDatasetsUpdate(chart) {\n const area = chart.chartArea;\n if (!areaIsValid(area)) {\n return;\n }\n const state = chartStates.get(chart);\n const datasets = chart.data.datasets;\n for (let i = 0; i < datasets.length; i++) {\n const dataset = datasets[i];\n const gradient = dataset.gradient;\n if (gradient) {\n updateDataset(chart, state, gradient, dataset, i);\n }\n }\n },\n\n afterUpdate(chart) {\n const state = chartStates.get(chart);\n if (chart.legend && chart.legend.options.display !== false && isChartV3) {\n updateLegendItems(chart, state);\n }\n },\n\n destroy(chart) {\n chartStates.delete(chart);\n }\n};\n"],"names":["isChartV3","Chart","version","parse","scale","value","areaIsValid","area","right","left","bottom","top","createGradient","ctx","axis","createRadialGradient","xCenter","yCenter","drawingArea","createLinearGradient","applyColors","gradient","colors","forEach","item","addColorStop","stop","color","rgbString","getGradientData","state","keyOption","datasetIndex","options","has","key","gradientData","get","filter","el","length","getPixelStop","type","distance","getDistanceFromCenterForValue","pixel","reverse","normValue","isNumber","parseFloat","getPixelForValue","scaleValue","getDecimalForPixel","toRGBs","l","Math","pow","fromRGBs","srgb","getInterpolatedColorByValue","data","stopColors","percent","startColor","endColor","stopColor","start","rgb","startR","r","startG","g","startB","b","end","endR","endG","endB","round","a","abs","interpolate","legendOptions","legendItemKey","applyGradientToLegendByDatasetIndex","chart","boxSize","hitBox","boxWidth","boxHeight","max","buildArea","legend","legendHitBoxes","setLegendItem","applyGradientToLegendByDataIndex","dataset","legendItems","index","c","valid","updateLegendItems","labels","font","defined","size","legendBoxHeight","datasets","i","chartStates","Map","getScale","meta","controller","addColors","Object","keys","isFinite","colorStop","push","min","sort","setValue","getStateOptions","stateOptions","hidden","set","updateDataset","getDatasetMeta","entries","console","warn","id","option","beforeInit","beforeDatasetsUpdate","chartArea","afterUpdate","display","destroy","delete"],"mappings":"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"}