seismic-color-chart 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chroma-color-scale.min.js","sources":["../node_modules/chroma-js/src/utils/limit.js","../node_modules/chroma-js/src/utils/clip_rgb.js","../node_modules/chroma-js/src/utils/type.js","../node_modules/chroma-js/src/utils/unpack.js","../node_modules/chroma-js/src/utils/last.js","../node_modules/chroma-js/src/utils/index.js","../node_modules/chroma-js/src/io/input.js","../node_modules/chroma-js/src/Color.js","../node_modules/chroma-js/src/version.js","../node_modules/chroma-js/src/chroma.js","../node_modules/chroma-js/src/io/cmyk/cmyk2rgb.js","../node_modules/chroma-js/src/io/cmyk/rgb2cmyk.js","../node_modules/chroma-js/src/io/cmyk/index.js","../node_modules/chroma-js/src/io/css/hsl2css.js","../node_modules/chroma-js/src/io/hsl/rgb2hsl.js","../node_modules/chroma-js/src/io/css/rgb2css.js","../node_modules/chroma-js/src/io/hsl/hsl2rgb.js","../node_modules/chroma-js/src/io/css/css2rgb.js","../node_modules/chroma-js/src/io/css/index.js","../node_modules/chroma-js/src/io/gl/index.js","../node_modules/chroma-js/src/io/hcg/hcg2rgb.js","../node_modules/chroma-js/src/io/hcg/index.js","../node_modules/chroma-js/src/io/hcg/rgb2hcg.js","../node_modules/chroma-js/src/io/hex/hex2rgb.js","../node_modules/chroma-js/src/io/hex/rgb2hex.js","../node_modules/chroma-js/src/io/hex/index.js","../node_modules/chroma-js/src/io/hsi/hsi2rgb.js","../node_modules/chroma-js/src/io/hsi/rgb2hsi.js","../node_modules/chroma-js/src/io/hsi/index.js","../node_modules/chroma-js/src/io/hsl/index.js","../node_modules/chroma-js/src/io/hsv/hsv2rgb.js","../node_modules/chroma-js/src/io/hsv/rgb2hsv.js","../node_modules/chroma-js/src/io/hsv/index.js","../node_modules/chroma-js/src/io/lab/lab-constants.js","../node_modules/chroma-js/src/io/lab/lab2rgb.js","../node_modules/chroma-js/src/io/lab/rgb2lab.js","../node_modules/chroma-js/src/io/lab/index.js","../node_modules/chroma-js/src/io/lch/lch2lab.js","../node_modules/chroma-js/src/io/lch/lch2rgb.js","../node_modules/chroma-js/src/io/lch/lab2lch.js","../node_modules/chroma-js/src/io/lch/rgb2lch.js","../node_modules/chroma-js/src/io/lch/index.js","../node_modules/chroma-js/src/io/lch/hcl2rgb.js","../node_modules/chroma-js/src/colors/w3cx11.js","../node_modules/chroma-js/src/io/named/index.js","../node_modules/chroma-js/src/io/num/index.js","../node_modules/chroma-js/src/io/num/rgb2num.js","../node_modules/chroma-js/src/io/num/num2rgb.js","../node_modules/chroma-js/src/io/rgb/index.js","../node_modules/chroma-js/src/io/temp/temperature2rgb.js","../node_modules/chroma-js/src/io/temp/rgb2temperature.js","../node_modules/chroma-js/src/io/temp/index.js","../node_modules/chroma-js/src/io/oklab/oklab2rgb.js","../node_modules/chroma-js/src/io/oklab/rgb2oklab.js","../node_modules/chroma-js/src/io/oklab/index.js","../node_modules/chroma-js/src/io/oklch/index.js","../node_modules/chroma-js/src/io/oklch/rgb2oklch.js","../node_modules/chroma-js/src/io/oklch/oklch2rgb.js","../node_modules/chroma-js/src/ops/alpha.js","../node_modules/chroma-js/src/ops/clipped.js","../node_modules/chroma-js/src/ops/darken.js","../node_modules/chroma-js/src/ops/get.js","../node_modules/chroma-js/src/ops/luminance.js","../node_modules/chroma-js/src/interpolator/index.js","../node_modules/chroma-js/src/generator/mix.js","../node_modules/chroma-js/src/ops/mix.js","../node_modules/chroma-js/src/ops/premultiply.js","../node_modules/chroma-js/src/ops/saturate.js","../node_modules/chroma-js/src/ops/set.js","../node_modules/chroma-js/src/ops/shade.js","../node_modules/chroma-js/src/interpolator/rgb.js","../node_modules/chroma-js/src/interpolator/lrgb.js","../node_modules/chroma-js/src/interpolator/lab.js","../node_modules/chroma-js/src/interpolator/_hsx.js","../node_modules/chroma-js/src/interpolator/lch.js","../node_modules/chroma-js/src/interpolator/num.js","../node_modules/chroma-js/src/interpolator/hcg.js","../node_modules/chroma-js/src/interpolator/hsi.js","../node_modules/chroma-js/src/interpolator/hsl.js","../node_modules/chroma-js/src/interpolator/hsv.js","../node_modules/chroma-js/src/interpolator/oklab.js","../node_modules/chroma-js/src/interpolator/oklch.js","../node_modules/chroma-js/src/generator/average.js","../node_modules/chroma-js/src/generator/scale.js","../node_modules/chroma-js/src/generator/blend.js","../node_modules/chroma-js/src/generator/cubehelix.js","../node_modules/chroma-js/src/generator/random.js","../node_modules/chroma-js/src/utils/analyze.js","../node_modules/chroma-js/src/utils/delta-e.js","../node_modules/chroma-js/src/utils/valid.js","../node_modules/chroma-js/src/utils/scales.js","../node_modules/chroma-js/src/colors/colorbrewer.js","../node_modules/chroma-js/index.js","../node_modules/chroma-js/src/generator/bezier.js","../node_modules/chroma-js/src/utils/contrast.js","../node_modules/chroma-js/src/utils/distance.js","../src/chroma-color-scale.js"],"sourcesContent":["import { min, max } from './index.js';\n\nexport default (x, low = 0, high = 1) => {\n return min(max(low, x), high);\n};\n","import limit from './limit.js';\n\nexport default (rgb) => {\n rgb._clipped = false;\n rgb._unclipped = rgb.slice(0);\n for (let i = 0; i <= 3; i++) {\n if (i < 3) {\n if (rgb[i] < 0 || rgb[i] > 255) rgb._clipped = true;\n rgb[i] = limit(rgb[i], 0, 255);\n } else if (i === 3) {\n rgb[i] = limit(rgb[i], 0, 1);\n }\n }\n return rgb;\n};\n","// ported from jQuery's $.type\nconst classToType = {};\nfor (let name of [\n 'Boolean',\n 'Number',\n 'String',\n 'Function',\n 'Array',\n 'Date',\n 'RegExp',\n 'Undefined',\n 'Null'\n]) {\n classToType[`[object ${name}]`] = name.toLowerCase();\n}\nexport default function (obj) {\n return classToType[Object.prototype.toString.call(obj)] || 'object';\n}\n","import type from './type.js';\n\nexport default (args, keyOrder = null) => {\n // if called with more than 3 arguments, we return the arguments\n if (args.length >= 3) return Array.prototype.slice.call(args);\n // with less than 3 args we check if first arg is object\n // and use the keyOrder string to extract and sort properties\n if (type(args[0]) == 'object' && keyOrder) {\n return keyOrder\n .split('')\n .filter((k) => args[0][k] !== undefined)\n .map((k) => args[0][k]);\n }\n // otherwise we just return the first argument\n // (which we suppose is an array of args)\n return args[0];\n};\n","import type from './type.js';\n\nexport default (args) => {\n if (args.length < 2) return null;\n const l = args.length - 1;\n if (type(args[l]) == 'string') return args[l].toLowerCase();\n return null;\n};\n","const { PI, min, max } = Math;\n\nexport { default as clip_rgb } from './clip_rgb.js';\nexport { default as limit } from './limit.js';\nexport { default as type } from './type.js';\nexport { default as unpack } from './unpack.js';\nexport { default as last } from './last.js';\n\nconst TWOPI = PI * 2;\nconst PITHIRD = PI / 3;\nconst DEG2RAD = PI / 180;\nconst RAD2DEG = 180 / PI;\n\nexport { PI, TWOPI, PITHIRD, DEG2RAD, RAD2DEG, min, max };\n","export default {\n format: {},\n autodetect: []\n};\n","import { last, clip_rgb, type } from './utils/index.js';\nimport _input from './io/input.js';\n\nclass Color {\n constructor(...args) {\n const me = this;\n if (\n type(args[0]) === 'object' &&\n args[0].constructor &&\n args[0].constructor === this.constructor\n ) {\n // the argument is already a Color instance\n return args[0];\n }\n // last argument could be the mode\n let mode = last(args);\n let autodetect = false;\n if (!mode) {\n autodetect = true;\n if (!_input.sorted) {\n _input.autodetect = _input.autodetect.sort((a, b) => b.p - a.p);\n _input.sorted = true;\n }\n // auto-detect format\n for (let chk of _input.autodetect) {\n mode = chk.test(...args);\n if (mode) break;\n }\n }\n if (_input.format[mode]) {\n const rgb = _input.format[mode].apply(\n null,\n autodetect ? args : args.slice(0, -1)\n );\n me._rgb = clip_rgb(rgb);\n } else {\n throw new Error('unknown format: ' + args);\n }\n // add alpha channel\n if (me._rgb.length === 3) me._rgb.push(1);\n }\n toString() {\n if (type(this.hex) == 'function') return this.hex();\n return `[${this._rgb.join(',')}]`;\n }\n}\nexport default Color;\n","// this gets updated automatically\nexport const version = '2.6.0';\n","import Color from './Color.js';\nimport { version } from './version.js';\n\nconst chroma = (...args) => {\n return new chroma.Color(...args);\n};\n\nchroma.Color = Color;\nchroma.version = version;\n\nexport default chroma;\n","import { unpack } from '../../utils/index.js';\n\nconst cmyk2rgb = (...args) => {\n args = unpack(args, 'cmyk');\n const [c, m, y, k] = args;\n const alpha = args.length > 4 ? args[4] : 1;\n if (k === 1) return [0, 0, 0, alpha];\n return [\n c >= 1 ? 0 : 255 * (1 - c) * (1 - k), // r\n m >= 1 ? 0 : 255 * (1 - m) * (1 - k), // g\n y >= 1 ? 0 : 255 * (1 - y) * (1 - k), // b\n alpha\n ];\n};\n\nexport default cmyk2rgb;\n","import { unpack } from '../../utils/index.js';\nconst { max } = Math;\n\nconst rgb2cmyk = (...args) => {\n let [r, g, b] = unpack(args, 'rgb');\n r = r / 255;\n g = g / 255;\n b = b / 255;\n const k = 1 - max(r, max(g, b));\n const f = k < 1 ? 1 / (1 - k) : 0;\n const c = (1 - r - k) * f;\n const m = (1 - g - k) * f;\n const y = (1 - b - k) * f;\n return [c, m, y, k];\n};\n\nexport default rgb2cmyk;\n","import chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport { unpack, type } from '../../utils/index.js';\nimport cmyk2rgb from './cmyk2rgb.js';\nimport rgb2cmyk from './rgb2cmyk.js';\n\nColor.prototype.cmyk = function () {\n return rgb2cmyk(this._rgb);\n};\n\nchroma.cmyk = (...args) => new Color(...args, 'cmyk');\n\ninput.format.cmyk = cmyk2rgb;\n\ninput.autodetect.push({\n p: 2,\n test: (...args) => {\n args = unpack(args, 'cmyk');\n if (type(args) === 'array' && args.length === 4) {\n return 'cmyk';\n }\n }\n});\n","import { unpack, last } from '../../utils/index.js';\nconst rnd = (a) => Math.round(a * 100) / 100;\n\n/*\n * supported arguments:\n * - hsl2css(h,s,l)\n * - hsl2css(h,s,l,a)\n * - hsl2css([h,s,l], mode)\n * - hsl2css([h,s,l,a], mode)\n * - hsl2css({h,s,l,a}, mode)\n */\nconst hsl2css = (...args) => {\n const hsla = unpack(args, 'hsla');\n let mode = last(args) || 'lsa';\n hsla[0] = rnd(hsla[0] || 0);\n hsla[1] = rnd(hsla[1] * 100) + '%';\n hsla[2] = rnd(hsla[2] * 100) + '%';\n if (mode === 'hsla' || (hsla.length > 3 && hsla[3] < 1)) {\n hsla[3] = hsla.length > 3 ? hsla[3] : 1;\n mode = 'hsla';\n } else {\n hsla.length = 3;\n }\n return `${mode}(${hsla.join(',')})`;\n};\n\nexport default hsl2css;\n","import { unpack, min, max } from '../../utils/index.js';\n\n/*\n * supported arguments:\n * - rgb2hsl(r,g,b)\n * - rgb2hsl(r,g,b,a)\n * - rgb2hsl([r,g,b])\n * - rgb2hsl([r,g,b,a])\n * - rgb2hsl({r,g,b,a})\n */\nconst rgb2hsl = (...args) => {\n args = unpack(args, 'rgba');\n let [r, g, b] = args;\n\n r /= 255;\n g /= 255;\n b /= 255;\n\n const minRgb = min(r, g, b);\n const maxRgb = max(r, g, b);\n\n const l = (maxRgb + minRgb) / 2;\n let s, h;\n\n if (maxRgb === minRgb) {\n s = 0;\n h = Number.NaN;\n } else {\n s =\n l < 0.5\n ? (maxRgb - minRgb) / (maxRgb + minRgb)\n : (maxRgb - minRgb) / (2 - maxRgb - minRgb);\n }\n\n if (r == maxRgb) h = (g - b) / (maxRgb - minRgb);\n else if (g == maxRgb) h = 2 + (b - r) / (maxRgb - minRgb);\n else if (b == maxRgb) h = 4 + (r - g) / (maxRgb - minRgb);\n\n h *= 60;\n if (h < 0) h += 360;\n if (args.length > 3 && args[3] !== undefined) return [h, s, l, args[3]];\n return [h, s, l];\n};\n\nexport default rgb2hsl;\n","import { unpack, last } from '../../utils/index.js';\nimport hsl2css from './hsl2css.js';\nimport rgb2hsl from '../hsl/rgb2hsl.js';\nconst { round } = Math;\n\n/*\n * supported arguments:\n * - rgb2css(r,g,b)\n * - rgb2css(r,g,b,a)\n * - rgb2css([r,g,b], mode)\n * - rgb2css([r,g,b,a], mode)\n * - rgb2css({r,g,b,a}, mode)\n */\nconst rgb2css = (...args) => {\n const rgba = unpack(args, 'rgba');\n let mode = last(args) || 'rgb';\n if (mode.substr(0, 3) == 'hsl') {\n return hsl2css(rgb2hsl(rgba), mode);\n }\n rgba[0] = round(rgba[0]);\n rgba[1] = round(rgba[1]);\n rgba[2] = round(rgba[2]);\n if (mode === 'rgba' || (rgba.length > 3 && rgba[3] < 1)) {\n rgba[3] = rgba.length > 3 ? rgba[3] : 1;\n mode = 'rgba';\n }\n return `${mode}(${rgba.slice(0, mode === 'rgb' ? 3 : 4).join(',')})`;\n};\n\nexport default rgb2css;\n","import { unpack } from '../../utils/index.js';\nconst { round } = Math;\n\nconst hsl2rgb = (...args) => {\n args = unpack(args, 'hsl');\n const [h, s, l] = args;\n let r, g, b;\n if (s === 0) {\n r = g = b = l * 255;\n } else {\n const t3 = [0, 0, 0];\n const c = [0, 0, 0];\n const t2 = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const t1 = 2 * l - t2;\n const h_ = h / 360;\n t3[0] = h_ + 1 / 3;\n t3[1] = h_;\n t3[2] = h_ - 1 / 3;\n for (let i = 0; i < 3; i++) {\n if (t3[i] < 0) t3[i] += 1;\n if (t3[i] > 1) t3[i] -= 1;\n if (6 * t3[i] < 1) c[i] = t1 + (t2 - t1) * 6 * t3[i];\n else if (2 * t3[i] < 1) c[i] = t2;\n else if (3 * t3[i] < 2) c[i] = t1 + (t2 - t1) * (2 / 3 - t3[i]) * 6;\n else c[i] = t1;\n }\n [r, g, b] = [round(c[0] * 255), round(c[1] * 255), round(c[2] * 255)];\n }\n if (args.length > 3) {\n // keep alpha channel\n return [r, g, b, args[3]];\n }\n return [r, g, b, 1];\n};\n\nexport default hsl2rgb;\n","import hsl2rgb from '../hsl/hsl2rgb.js';\nimport input from '../input.js';\n\nconst RE_RGB = /^rgb\\(\\s*(-?\\d+),\\s*(-?\\d+)\\s*,\\s*(-?\\d+)\\s*\\)$/;\nconst RE_RGBA =\n /^rgba\\(\\s*(-?\\d+),\\s*(-?\\d+)\\s*,\\s*(-?\\d+)\\s*,\\s*([01]|[01]?\\.\\d+)\\)$/;\nconst RE_RGB_PCT =\n /^rgb\\(\\s*(-?\\d+(?:\\.\\d+)?)%,\\s*(-?\\d+(?:\\.\\d+)?)%\\s*,\\s*(-?\\d+(?:\\.\\d+)?)%\\s*\\)$/;\nconst RE_RGBA_PCT =\n /^rgba\\(\\s*(-?\\d+(?:\\.\\d+)?)%,\\s*(-?\\d+(?:\\.\\d+)?)%\\s*,\\s*(-?\\d+(?:\\.\\d+)?)%\\s*,\\s*([01]|[01]?\\.\\d+)\\)$/;\nconst RE_HSL =\n /^hsl\\(\\s*(-?\\d+(?:\\.\\d+)?),\\s*(-?\\d+(?:\\.\\d+)?)%\\s*,\\s*(-?\\d+(?:\\.\\d+)?)%\\s*\\)$/;\nconst RE_HSLA =\n /^hsla\\(\\s*(-?\\d+(?:\\.\\d+)?),\\s*(-?\\d+(?:\\.\\d+)?)%\\s*,\\s*(-?\\d+(?:\\.\\d+)?)%\\s*,\\s*([01]|[01]?\\.\\d+)\\)$/;\n\nconst { round } = Math;\n\nconst css2rgb = (css) => {\n css = css.toLowerCase().trim();\n let m;\n\n if (input.format.named) {\n try {\n return input.format.named(css);\n // eslint-disable-next-line\n } catch (e) {}\n }\n\n // rgb(250,20,0)\n if ((m = css.match(RE_RGB))) {\n const rgb = m.slice(1, 4);\n for (let i = 0; i < 3; i++) {\n rgb[i] = +rgb[i];\n }\n rgb[3] = 1; // default alpha\n return rgb;\n }\n\n // rgba(250,20,0,0.4)\n if ((m = css.match(RE_RGBA))) {\n const rgb = m.slice(1, 5);\n for (let i = 0; i < 4; i++) {\n rgb[i] = +rgb[i];\n }\n return rgb;\n }\n\n // rgb(100%,0%,0%)\n if ((m = css.match(RE_RGB_PCT))) {\n const rgb = m.slice(1, 4);\n for (let i = 0; i < 3; i++) {\n rgb[i] = round(rgb[i] * 2.55);\n }\n rgb[3] = 1; // default alpha\n return rgb;\n }\n\n // rgba(100%,0%,0%,0.4)\n if ((m = css.match(RE_RGBA_PCT))) {\n const rgb = m.slice(1, 5);\n for (let i = 0; i < 3; i++) {\n rgb[i] = round(rgb[i] * 2.55);\n }\n rgb[3] = +rgb[3];\n return rgb;\n }\n\n // hsl(0,100%,50%)\n if ((m = css.match(RE_HSL))) {\n const hsl = m.slice(1, 4);\n hsl[1] *= 0.01;\n hsl[2] *= 0.01;\n const rgb = hsl2rgb(hsl);\n rgb[3] = 1;\n return rgb;\n }\n\n // hsla(0,100%,50%,0.5)\n if ((m = css.match(RE_HSLA))) {\n const hsl = m.slice(1, 4);\n hsl[1] *= 0.01;\n hsl[2] *= 0.01;\n const rgb = hsl2rgb(hsl);\n rgb[3] = +m[4]; // default alpha = 1\n return rgb;\n }\n};\n\ncss2rgb.test = (s) => {\n return (\n RE_RGB.test(s) ||\n RE_RGBA.test(s) ||\n RE_RGB_PCT.test(s) ||\n RE_RGBA_PCT.test(s) ||\n RE_HSL.test(s) ||\n RE_HSLA.test(s)\n );\n};\n\nexport default css2rgb;\n","import chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport { type } from '../../utils/index.js';\n\nimport rgb2css from './rgb2css.js';\nimport css2rgb from './css2rgb.js';\n\nColor.prototype.css = function (mode) {\n return rgb2css(this._rgb, mode);\n};\n\nchroma.css = (...args) => new Color(...args, 'css');\n\ninput.format.css = css2rgb;\n\ninput.autodetect.push({\n p: 5,\n test: (h, ...rest) => {\n if (!rest.length && type(h) === 'string' && css2rgb.test(h)) {\n return 'css';\n }\n }\n});\n","import Color from '../../Color.js';\nimport chroma from '../../chroma.js';\nimport input from '../input.js';\nimport { unpack } from '../../utils/index.js';\n\ninput.format.gl = (...args) => {\n const rgb = unpack(args, 'rgba');\n rgb[0] *= 255;\n rgb[1] *= 255;\n rgb[2] *= 255;\n return rgb;\n};\n\nchroma.gl = (...args) => new Color(...args, 'gl');\n\nColor.prototype.gl = function () {\n const rgb = this._rgb;\n return [rgb[0] / 255, rgb[1] / 255, rgb[2] / 255, rgb[3]];\n};\n","import { unpack } from '../../utils/index.js';\nconst { floor } = Math;\n\n/*\n * this is basically just HSV with some minor tweaks\n *\n * hue.. [0..360]\n * chroma .. [0..1]\n * grayness .. [0..1]\n */\n\nconst hcg2rgb = (...args) => {\n args = unpack(args, 'hcg');\n let [h, c, _g] = args;\n let r, g, b;\n _g = _g * 255;\n const _c = c * 255;\n if (c === 0) {\n r = g = b = _g;\n } else {\n if (h === 360) h = 0;\n if (h > 360) h -= 360;\n if (h < 0) h += 360;\n h /= 60;\n const i = floor(h);\n const f = h - i;\n const p = _g * (1 - c);\n const q = p + _c * (1 - f);\n const t = p + _c * f;\n const v = p + _c;\n switch (i) {\n case 0:\n [r, g, b] = [v, t, p];\n break;\n case 1:\n [r, g, b] = [q, v, p];\n break;\n case 2:\n [r, g, b] = [p, v, t];\n break;\n case 3:\n [r, g, b] = [p, q, v];\n break;\n case 4:\n [r, g, b] = [t, p, v];\n break;\n case 5:\n [r, g, b] = [v, p, q];\n break;\n }\n }\n return [r, g, b, args.length > 3 ? args[3] : 1];\n};\n\nexport default hcg2rgb;\n","import { unpack, type } from '../../utils/index.js';\nimport chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport hcg2rgb from './hcg2rgb.js';\nimport rgb2hcg from './rgb2hcg.js';\n\nColor.prototype.hcg = function () {\n return rgb2hcg(this._rgb);\n};\n\nchroma.hcg = (...args) => new Color(...args, 'hcg');\n\ninput.format.hcg = hcg2rgb;\n\ninput.autodetect.push({\n p: 1,\n test: (...args) => {\n args = unpack(args, 'hcg');\n if (type(args) === 'array' && args.length === 3) {\n return 'hcg';\n }\n }\n});\n","import { unpack, max, min } from '../../utils/index.js';\n\nconst rgb2hcg = (...args) => {\n const [r, g, b] = unpack(args, 'rgb');\n const minRgb = min(r, g, b);\n const maxRgb = max(r, g, b);\n const delta = maxRgb - minRgb;\n const c = (delta * 100) / 255;\n const _g = (minRgb / (255 - delta)) * 100;\n let h;\n if (delta === 0) {\n h = Number.NaN;\n } else {\n if (r === maxRgb) h = (g - b) / delta;\n if (g === maxRgb) h = 2 + (b - r) / delta;\n if (b === maxRgb) h = 4 + (r - g) / delta;\n h *= 60;\n if (h < 0) h += 360;\n }\n return [h, c, _g];\n};\n\nexport default rgb2hcg;\n","const RE_HEX = /^#?([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/;\nconst RE_HEXA = /^#?([A-Fa-f0-9]{8}|[A-Fa-f0-9]{4})$/;\n\nconst hex2rgb = (hex) => {\n if (hex.match(RE_HEX)) {\n // remove optional leading #\n if (hex.length === 4 || hex.length === 7) {\n hex = hex.substr(1);\n }\n // expand short-notation to full six-digit\n if (hex.length === 3) {\n hex = hex.split('');\n hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];\n }\n const u = parseInt(hex, 16);\n const r = u >> 16;\n const g = (u >> 8) & 0xff;\n const b = u & 0xff;\n return [r, g, b, 1];\n }\n\n // match rgba hex format, eg #FF000077\n if (hex.match(RE_HEXA)) {\n if (hex.length === 5 || hex.length === 9) {\n // remove optional leading #\n hex = hex.substr(1);\n }\n // expand short-notation to full eight-digit\n if (hex.length === 4) {\n hex = hex.split('');\n hex =\n hex[0] +\n hex[0] +\n hex[1] +\n hex[1] +\n hex[2] +\n hex[2] +\n hex[3] +\n hex[3];\n }\n const u = parseInt(hex, 16);\n const r = (u >> 24) & 0xff;\n const g = (u >> 16) & 0xff;\n const b = (u >> 8) & 0xff;\n const a = Math.round(((u & 0xff) / 0xff) * 100) / 100;\n return [r, g, b, a];\n }\n\n // we used to check for css colors here\n // if _input.css? and rgb = _input.css hex\n // return rgb\n\n throw new Error(`unknown hex color: ${hex}`);\n};\n\nexport default hex2rgb;\n","import { unpack, last } from '../../utils/index.js';\nconst { round } = Math;\n\nconst rgb2hex = (...args) => {\n let [r, g, b, a] = unpack(args, 'rgba');\n let mode = last(args) || 'auto';\n if (a === undefined) a = 1;\n if (mode === 'auto') {\n mode = a < 1 ? 'rgba' : 'rgb';\n }\n r = round(r);\n g = round(g);\n b = round(b);\n const u = (r << 16) | (g << 8) | b;\n let str = '000000' + u.toString(16); //#.toUpperCase();\n str = str.substr(str.length - 6);\n let hxa = '0' + round(a * 255).toString(16);\n hxa = hxa.substr(hxa.length - 2);\n switch (mode.toLowerCase()) {\n case 'rgba':\n return `#${str}${hxa}`;\n case 'argb':\n return `#${hxa}${str}`;\n default:\n return `#${str}`;\n }\n};\n\nexport default rgb2hex;\n","import chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport { type } from '../../utils/index.js';\nimport input from '../input.js';\nimport hex2rgb from './hex2rgb.js';\nimport rgb2hex from './rgb2hex.js';\n\nColor.prototype.hex = function (mode) {\n return rgb2hex(this._rgb, mode);\n};\n\nchroma.hex = (...args) => new Color(...args, 'hex');\n\ninput.format.hex = hex2rgb;\ninput.autodetect.push({\n p: 4,\n test: (h, ...rest) => {\n if (\n !rest.length &&\n type(h) === 'string' &&\n [3, 4, 5, 6, 7, 8, 9].indexOf(h.length) >= 0\n ) {\n return 'hex';\n }\n }\n});\n","import { unpack, limit, TWOPI, PITHIRD } from '../../utils/index.js';\nconst { cos } = Math;\n\n/*\n * hue [0..360]\n * saturation [0..1]\n * intensity [0..1]\n */\nconst hsi2rgb = (...args) => {\n /*\n borrowed from here:\n http://hummer.stanford.edu/museinfo/doc/examples/humdrum/keyscape2/hsi2rgb.cpp\n */\n args = unpack(args, 'hsi');\n let [h, s, i] = args;\n let r, g, b;\n\n if (isNaN(h)) h = 0;\n if (isNaN(s)) s = 0;\n // normalize hue\n if (h > 360) h -= 360;\n if (h < 0) h += 360;\n h /= 360;\n if (h < 1 / 3) {\n b = (1 - s) / 3;\n r = (1 + (s * cos(TWOPI * h)) / cos(PITHIRD - TWOPI * h)) / 3;\n g = 1 - (b + r);\n } else if (h < 2 / 3) {\n h -= 1 / 3;\n r = (1 - s) / 3;\n g = (1 + (s * cos(TWOPI * h)) / cos(PITHIRD - TWOPI * h)) / 3;\n b = 1 - (r + g);\n } else {\n h -= 2 / 3;\n g = (1 - s) / 3;\n b = (1 + (s * cos(TWOPI * h)) / cos(PITHIRD - TWOPI * h)) / 3;\n r = 1 - (g + b);\n }\n r = limit(i * r * 3);\n g = limit(i * g * 3);\n b = limit(i * b * 3);\n return [r * 255, g * 255, b * 255, args.length > 3 ? args[3] : 1];\n};\n\nexport default hsi2rgb;\n","import { unpack, TWOPI } from '../../utils/index.js';\nconst { min, sqrt, acos } = Math;\n\nconst rgb2hsi = (...args) => {\n /*\n borrowed from here:\n http://hummer.stanford.edu/museinfo/doc/examples/humdrum/keyscape2/rgb2hsi.cpp\n */\n let [r, g, b] = unpack(args, 'rgb');\n r /= 255;\n g /= 255;\n b /= 255;\n let h;\n const min_ = min(r, g, b);\n const i = (r + g + b) / 3;\n const s = i > 0 ? 1 - min_ / i : 0;\n if (s === 0) {\n h = NaN;\n } else {\n h = (r - g + (r - b)) / 2;\n h /= sqrt((r - g) * (r - g) + (r - b) * (g - b));\n h = acos(h);\n if (b > g) {\n h = TWOPI - h;\n }\n h /= TWOPI;\n }\n return [h * 360, s, i];\n};\n\nexport default rgb2hsi;\n","import { unpack, type } from '../../utils/index.js';\nimport chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport hsi2rgb from './hsi2rgb.js';\nimport rgb2hsi from './rgb2hsi.js';\n\nColor.prototype.hsi = function () {\n return rgb2hsi(this._rgb);\n};\n\nchroma.hsi = (...args) => new Color(...args, 'hsi');\n\ninput.format.hsi = hsi2rgb;\n\ninput.autodetect.push({\n p: 2,\n test: (...args) => {\n args = unpack(args, 'hsi');\n if (type(args) === 'array' && args.length === 3) {\n return 'hsi';\n }\n }\n});\n","import { unpack, type } from '../../utils/index.js';\nimport chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport hsl2rgb from './hsl2rgb.js';\nimport rgb2hsl from './rgb2hsl.js';\n\nColor.prototype.hsl = function () {\n return rgb2hsl(this._rgb);\n};\n\nchroma.hsl = (...args) => new Color(...args, 'hsl');\n\ninput.format.hsl = hsl2rgb;\n\ninput.autodetect.push({\n p: 2,\n test: (...args) => {\n args = unpack(args, 'hsl');\n if (type(args) === 'array' && args.length === 3) {\n return 'hsl';\n }\n }\n});\n","import { unpack } from '../../utils/index.js';\nconst { floor } = Math;\n\nconst hsv2rgb = (...args) => {\n args = unpack(args, 'hsv');\n let [h, s, v] = args;\n let r, g, b;\n v *= 255;\n if (s === 0) {\n r = g = b = v;\n } else {\n if (h === 360) h = 0;\n if (h > 360) h -= 360;\n if (h < 0) h += 360;\n h /= 60;\n\n const i = floor(h);\n const f = h - i;\n const p = v * (1 - s);\n const q = v * (1 - s * f);\n const t = v * (1 - s * (1 - f));\n\n switch (i) {\n case 0:\n [r, g, b] = [v, t, p];\n break;\n case 1:\n [r, g, b] = [q, v, p];\n break;\n case 2:\n [r, g, b] = [p, v, t];\n break;\n case 3:\n [r, g, b] = [p, q, v];\n break;\n case 4:\n [r, g, b] = [t, p, v];\n break;\n case 5:\n [r, g, b] = [v, p, q];\n break;\n }\n }\n return [r, g, b, args.length > 3 ? args[3] : 1];\n};\n\nexport default hsv2rgb;\n","import { unpack } from '../../utils/index.js';\nconst { min, max } = Math;\n\n/*\n * supported arguments:\n * - rgb2hsv(r,g,b)\n * - rgb2hsv([r,g,b])\n * - rgb2hsv({r,g,b})\n */\nconst rgb2hsl = (...args) => {\n args = unpack(args, 'rgb');\n let [r, g, b] = args;\n const min_ = min(r, g, b);\n const max_ = max(r, g, b);\n const delta = max_ - min_;\n let h, s, v;\n v = max_ / 255.0;\n if (max_ === 0) {\n h = Number.NaN;\n s = 0;\n } else {\n s = delta / max_;\n if (r === max_) h = (g - b) / delta;\n if (g === max_) h = 2 + (b - r) / delta;\n if (b === max_) h = 4 + (r - g) / delta;\n h *= 60;\n if (h < 0) h += 360;\n }\n return [h, s, v];\n};\n\nexport default rgb2hsl;\n","import { unpack, type } from '../../utils/index.js';\nimport chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport hsv2rgb from './hsv2rgb.js';\nimport rgb2hsv from './rgb2hsv.js';\n\nColor.prototype.hsv = function () {\n return rgb2hsv(this._rgb);\n};\n\nchroma.hsv = (...args) => new Color(...args, 'hsv');\n\ninput.format.hsv = hsv2rgb;\n\ninput.autodetect.push({\n p: 2,\n test: (...args) => {\n args = unpack(args, 'hsv');\n if (type(args) === 'array' && args.length === 3) {\n return 'hsv';\n }\n }\n});\n","export default {\n // Corresponds roughly to RGB brighter/darker\n Kn: 18,\n\n // D65 standard referent\n Xn: 0.95047,\n Yn: 1,\n Zn: 1.08883,\n\n t0: 0.137931034, // 4 / 29\n t1: 0.206896552, // 6 / 29\n t2: 0.12841855, // 3 * t1 * t1\n t3: 0.008856452 // t1 * t1 * t1\n};\n","import LAB_CONSTANTS from './lab-constants.js';\nimport { unpack } from '../../utils/index.js';\nconst { pow } = Math;\n\n/*\n * L* [0..100]\n * a [-100..100]\n * b [-100..100]\n */\nconst lab2rgb = (...args) => {\n args = unpack(args, 'lab');\n const [l, a, b] = args;\n let x, y, z, r, g, b_;\n\n y = (l + 16) / 116;\n x = isNaN(a) ? y : y + a / 500;\n z = isNaN(b) ? y : y - b / 200;\n\n y = LAB_CONSTANTS.Yn * lab_xyz(y);\n x = LAB_CONSTANTS.Xn * lab_xyz(x);\n z = LAB_CONSTANTS.Zn * lab_xyz(z);\n\n r = xyz_rgb(3.2404542 * x - 1.5371385 * y - 0.4985314 * z); // D65 -> sRGB\n g = xyz_rgb(-0.969266 * x + 1.8760108 * y + 0.041556 * z);\n b_ = xyz_rgb(0.0556434 * x - 0.2040259 * y + 1.0572252 * z);\n\n return [r, g, b_, args.length > 3 ? args[3] : 1];\n};\n\nconst xyz_rgb = (r) => {\n return 255 * (r <= 0.00304 ? 12.92 * r : 1.055 * pow(r, 1 / 2.4) - 0.055);\n};\n\nconst lab_xyz = (t) => {\n return t > LAB_CONSTANTS.t1\n ? t * t * t\n : LAB_CONSTANTS.t2 * (t - LAB_CONSTANTS.t0);\n};\n\nexport default lab2rgb;\n","import LAB_CONSTANTS from './lab-constants.js';\nimport { unpack } from '../../utils/index.js';\nconst { pow } = Math;\n\nconst rgb2lab = (...args) => {\n const [r, g, b] = unpack(args, 'rgb');\n const [x, y, z] = rgb2xyz(r, g, b);\n const l = 116 * y - 16;\n return [l < 0 ? 0 : l, 500 * (x - y), 200 * (y - z)];\n};\n\nconst rgb_xyz = (r) => {\n if ((r /= 255) <= 0.04045) return r / 12.92;\n return pow((r + 0.055) / 1.055, 2.4);\n};\n\nconst xyz_lab = (t) => {\n if (t > LAB_CONSTANTS.t3) return pow(t, 1 / 3);\n return t / LAB_CONSTANTS.t2 + LAB_CONSTANTS.t0;\n};\n\nconst rgb2xyz = (r, g, b) => {\n r = rgb_xyz(r);\n g = rgb_xyz(g);\n b = rgb_xyz(b);\n const x = xyz_lab(\n (0.4124564 * r + 0.3575761 * g + 0.1804375 * b) / LAB_CONSTANTS.Xn\n );\n const y = xyz_lab(\n (0.2126729 * r + 0.7151522 * g + 0.072175 * b) / LAB_CONSTANTS.Yn\n );\n const z = xyz_lab(\n (0.0193339 * r + 0.119192 * g + 0.9503041 * b) / LAB_CONSTANTS.Zn\n );\n return [x, y, z];\n};\n\nexport default rgb2lab;\n","import { unpack, type } from '../../utils/index.js';\nimport chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport lab2rgb from './lab2rgb.js';\nimport rgb2lab from './rgb2lab.js';\n\nColor.prototype.lab = function () {\n return rgb2lab(this._rgb);\n};\n\nchroma.lab = (...args) => new Color(...args, 'lab');\n\ninput.format.lab = lab2rgb;\n\ninput.autodetect.push({\n p: 2,\n test: (...args) => {\n args = unpack(args, 'lab');\n if (type(args) === 'array' && args.length === 3) {\n return 'lab';\n }\n }\n});\n","import { unpack, DEG2RAD } from '../../utils/index.js';\nconst { sin, cos } = Math;\n\nconst lch2lab = (...args) => {\n /*\n Convert from a qualitative parameter h and a quantitative parameter l to a 24-bit pixel.\n These formulas were invented by David Dalrymple to obtain maximum contrast without going\n out of gamut if the parameters are in the range 0-1.\n\n A saturation multiplier was added by Gregor Aisch\n */\n let [l, c, h] = unpack(args, 'lch');\n if (isNaN(h)) h = 0;\n h = h * DEG2RAD;\n return [l, cos(h) * c, sin(h) * c];\n};\n\nexport default lch2lab;\n","import { unpack } from '../../utils/index.js';\nimport lch2lab from './lch2lab.js';\nimport lab2rgb from '../lab/lab2rgb.js';\n\nconst lch2rgb = (...args) => {\n args = unpack(args, 'lch');\n const [l, c, h] = args;\n const [L, a, b_] = lch2lab(l, c, h);\n const [r, g, b] = lab2rgb(L, a, b_);\n return [r, g, b, args.length > 3 ? args[3] : 1];\n};\n\nexport default lch2rgb;\n","import { unpack, RAD2DEG } from '../../utils/index.js';\nconst { sqrt, atan2, round } = Math;\n\nconst lab2lch = (...args) => {\n const [l, a, b] = unpack(args, 'lab');\n const c = sqrt(a * a + b * b);\n let h = (atan2(b, a) * RAD2DEG + 360) % 360;\n if (round(c * 10000) === 0) h = Number.NaN;\n return [l, c, h];\n};\n\nexport default lab2lch;\n","import { unpack } from '../../utils/index.js';\nimport rgb2lab from '../lab/rgb2lab.js';\nimport lab2lch from './lab2lch.js';\n\nconst rgb2lch = (...args) => {\n const [r, g, b] = unpack(args, 'rgb');\n const [l, a, b_] = rgb2lab(r, g, b);\n return lab2lch(l, a, b_);\n};\n\nexport default rgb2lch;\n","import { unpack, type } from '../../utils/index.js';\nimport chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport lch2rgb from './lch2rgb.js';\nimport hcl2rgb from './hcl2rgb.js';\nimport rgb2lch from './rgb2lch.js';\n\nColor.prototype.lch = function () {\n return rgb2lch(this._rgb);\n};\nColor.prototype.hcl = function () {\n return rgb2lch(this._rgb).reverse();\n};\n\nchroma.lch = (...args) => new Color(...args, 'lch');\nchroma.hcl = (...args) => new Color(...args, 'hcl');\n\ninput.format.lch = lch2rgb;\ninput.format.hcl = hcl2rgb;\n['lch', 'hcl'].forEach((m) =>\n input.autodetect.push({\n p: 2,\n test: (...args) => {\n args = unpack(args, m);\n if (type(args) === 'array' && args.length === 3) {\n return m;\n }\n }\n })\n);\n","import { unpack } from '../../utils/index.js';\nimport lch2rgb from './lch2rgb.js';\n\nconst hcl2rgb = (...args) => {\n const hcl = unpack(args, 'hcl').reverse();\n return lch2rgb(...hcl);\n};\n\nexport default hcl2rgb;\n","/**\n\tX11 color names\n\n\thttp://www.w3.org/TR/css3-color/#svg-color\n*/\n\nconst w3cx11 = {\n aliceblue: '#f0f8ff',\n antiquewhite: '#faebd7',\n aqua: '#00ffff',\n aquamarine: '#7fffd4',\n azure: '#f0ffff',\n beige: '#f5f5dc',\n bisque: '#ffe4c4',\n black: '#000000',\n blanchedalmond: '#ffebcd',\n blue: '#0000ff',\n blueviolet: '#8a2be2',\n brown: '#a52a2a',\n burlywood: '#deb887',\n cadetblue: '#5f9ea0',\n chartreuse: '#7fff00',\n chocolate: '#d2691e',\n coral: '#ff7f50',\n cornflowerblue: '#6495ed',\n cornsilk: '#fff8dc',\n crimson: '#dc143c',\n cyan: '#00ffff',\n darkblue: '#00008b',\n darkcyan: '#008b8b',\n darkgoldenrod: '#b8860b',\n darkgray: '#a9a9a9',\n darkgreen: '#006400',\n darkgrey: '#a9a9a9',\n darkkhaki: '#bdb76b',\n darkmagenta: '#8b008b',\n darkolivegreen: '#556b2f',\n darkorange: '#ff8c00',\n darkorchid: '#9932cc',\n darkred: '#8b0000',\n darksalmon: '#e9967a',\n darkseagreen: '#8fbc8f',\n darkslateblue: '#483d8b',\n darkslategray: '#2f4f4f',\n darkslategrey: '#2f4f4f',\n darkturquoise: '#00ced1',\n darkviolet: '#9400d3',\n deeppink: '#ff1493',\n deepskyblue: '#00bfff',\n dimgray: '#696969',\n dimgrey: '#696969',\n dodgerblue: '#1e90ff',\n firebrick: '#b22222',\n floralwhite: '#fffaf0',\n forestgreen: '#228b22',\n fuchsia: '#ff00ff',\n gainsboro: '#dcdcdc',\n ghostwhite: '#f8f8ff',\n gold: '#ffd700',\n goldenrod: '#daa520',\n gray: '#808080',\n green: '#008000',\n greenyellow: '#adff2f',\n grey: '#808080',\n honeydew: '#f0fff0',\n hotpink: '#ff69b4',\n indianred: '#cd5c5c',\n indigo: '#4b0082',\n ivory: '#fffff0',\n khaki: '#f0e68c',\n laserlemon: '#ffff54',\n lavender: '#e6e6fa',\n lavenderblush: '#fff0f5',\n lawngreen: '#7cfc00',\n lemonchiffon: '#fffacd',\n lightblue: '#add8e6',\n lightcoral: '#f08080',\n lightcyan: '#e0ffff',\n lightgoldenrod: '#fafad2',\n lightgoldenrodyellow: '#fafad2',\n lightgray: '#d3d3d3',\n lightgreen: '#90ee90',\n lightgrey: '#d3d3d3',\n lightpink: '#ffb6c1',\n lightsalmon: '#ffa07a',\n lightseagreen: '#20b2aa',\n lightskyblue: '#87cefa',\n lightslategray: '#778899',\n lightslategrey: '#778899',\n lightsteelblue: '#b0c4de',\n lightyellow: '#ffffe0',\n lime: '#00ff00',\n limegreen: '#32cd32',\n linen: '#faf0e6',\n magenta: '#ff00ff',\n maroon: '#800000',\n maroon2: '#7f0000',\n maroon3: '#b03060',\n mediumaquamarine: '#66cdaa',\n mediumblue: '#0000cd',\n mediumorchid: '#ba55d3',\n mediumpurple: '#9370db',\n mediumseagreen: '#3cb371',\n mediumslateblue: '#7b68ee',\n mediumspringgreen: '#00fa9a',\n mediumturquoise: '#48d1cc',\n mediumvioletred: '#c71585',\n midnightblue: '#191970',\n mintcream: '#f5fffa',\n mistyrose: '#ffe4e1',\n moccasin: '#ffe4b5',\n navajowhite: '#ffdead',\n navy: '#000080',\n oldlace: '#fdf5e6',\n olive: '#808000',\n olivedrab: '#6b8e23',\n orange: '#ffa500',\n orangered: '#ff4500',\n orchid: '#da70d6',\n palegoldenrod: '#eee8aa',\n palegreen: '#98fb98',\n paleturquoise: '#afeeee',\n palevioletred: '#db7093',\n papayawhip: '#ffefd5',\n peachpuff: '#ffdab9',\n peru: '#cd853f',\n pink: '#ffc0cb',\n plum: '#dda0dd',\n powderblue: '#b0e0e6',\n purple: '#800080',\n purple2: '#7f007f',\n purple3: '#a020f0',\n rebeccapurple: '#663399',\n red: '#ff0000',\n rosybrown: '#bc8f8f',\n royalblue: '#4169e1',\n saddlebrown: '#8b4513',\n salmon: '#fa8072',\n sandybrown: '#f4a460',\n seagreen: '#2e8b57',\n seashell: '#fff5ee',\n sienna: '#a0522d',\n silver: '#c0c0c0',\n skyblue: '#87ceeb',\n slateblue: '#6a5acd',\n slategray: '#708090',\n slategrey: '#708090',\n snow: '#fffafa',\n springgreen: '#00ff7f',\n steelblue: '#4682b4',\n tan: '#d2b48c',\n teal: '#008080',\n thistle: '#d8bfd8',\n tomato: '#ff6347',\n turquoise: '#40e0d0',\n violet: '#ee82ee',\n wheat: '#f5deb3',\n white: '#ffffff',\n whitesmoke: '#f5f5f5',\n yellow: '#ffff00',\n yellowgreen: '#9acd32'\n};\n\nexport default w3cx11;\n","import Color from '../../Color.js';\nimport input from '../input.js';\nimport { type } from '../../utils/index.js';\n\nimport w3cx11 from '../../colors/w3cx11.js';\nimport hex2rgb from '../hex/hex2rgb.js';\nimport rgb2hex from '../hex/rgb2hex.js';\n\nColor.prototype.name = function () {\n const hex = rgb2hex(this._rgb, 'rgb');\n for (let n of Object.keys(w3cx11)) {\n if (w3cx11[n] === hex) return n.toLowerCase();\n }\n return hex;\n};\n\ninput.format.named = (name) => {\n name = name.toLowerCase();\n if (w3cx11[name]) return hex2rgb(w3cx11[name]);\n throw new Error('unknown color name: ' + name);\n};\n\ninput.autodetect.push({\n p: 5,\n test: (h, ...rest) => {\n if (!rest.length && type(h) === 'string' && w3cx11[h.toLowerCase()]) {\n return 'named';\n }\n }\n});\n","import chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport { type } from '../../utils/index.js';\nimport num2rgb from './num2rgb.js';\nimport rgb2num from './rgb2num.js';\n\nColor.prototype.num = function () {\n return rgb2num(this._rgb);\n};\n\nchroma.num = (...args) => new Color(...args, 'num');\n\ninput.format.num = num2rgb;\n\ninput.autodetect.push({\n p: 5,\n test: (...args) => {\n if (\n args.length === 1 &&\n type(args[0]) === 'number' &&\n args[0] >= 0 &&\n args[0] <= 0xffffff\n ) {\n return 'num';\n }\n }\n});\n","import { unpack } from '../../utils/index.js';\n\nconst rgb2num = (...args) => {\n const [r, g, b] = unpack(args, 'rgb');\n return (r << 16) + (g << 8) + b;\n};\n\nexport default rgb2num;\n","import { type } from '../../utils/index.js';\n\nconst num2rgb = (num) => {\n if (type(num) == 'number' && num >= 0 && num <= 0xffffff) {\n const r = num >> 16;\n const g = (num >> 8) & 0xff;\n const b = num & 0xff;\n return [r, g, b, 1];\n }\n throw new Error('unknown num color: ' + num);\n};\n\nexport default num2rgb;\n","import chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport { unpack, type } from '../../utils/index.js';\nconst { round } = Math;\n\nColor.prototype.rgb = function (rnd = true) {\n if (rnd === false) return this._rgb.slice(0, 3);\n return this._rgb.slice(0, 3).map(round);\n};\n\nColor.prototype.rgba = function (rnd = true) {\n return this._rgb.slice(0, 4).map((v, i) => {\n return i < 3 ? (rnd === false ? v : round(v)) : v;\n });\n};\n\nchroma.rgb = (...args) => new Color(...args, 'rgb');\n\ninput.format.rgb = (...args) => {\n const rgba = unpack(args, 'rgba');\n if (rgba[3] === undefined) rgba[3] = 1;\n return rgba;\n};\n\ninput.autodetect.push({\n p: 3,\n test: (...args) => {\n args = unpack(args, 'rgba');\n if (\n type(args) === 'array' &&\n (args.length === 3 ||\n (args.length === 4 &&\n type(args[3]) == 'number' &&\n args[3] >= 0 &&\n args[3] <= 1))\n ) {\n return 'rgb';\n }\n }\n});\n","/*\n * Based on implementation by Neil Bartlett\n * https://github.com/neilbartlett/color-temperature\n */\n\nconst { log } = Math;\n\nconst temperature2rgb = (kelvin) => {\n const temp = kelvin / 100;\n let r, g, b;\n if (temp < 66) {\n r = 255;\n g =\n temp < 6\n ? 0\n : -155.25485562709179 -\n 0.44596950469579133 * (g = temp - 2) +\n 104.49216199393888 * log(g);\n b =\n temp < 20\n ? 0\n : -254.76935184120902 +\n 0.8274096064007395 * (b = temp - 10) +\n 115.67994401066147 * log(b);\n } else {\n r =\n 351.97690566805693 +\n 0.114206453784165 * (r = temp - 55) -\n 40.25366309332127 * log(r);\n g =\n 325.4494125711974 +\n 0.07943456536662342 * (g = temp - 50) -\n 28.0852963507957 * log(g);\n b = 255;\n }\n return [r, g, b, 1];\n};\n\nexport default temperature2rgb;\n","/*\n * Based on implementation by Neil Bartlett\n * https://github.com/neilbartlett/color-temperature\n **/\n\nimport temperature2rgb from './temperature2rgb.js';\nimport { unpack } from '../../utils/index.js';\nconst { round } = Math;\n\nconst rgb2temperature = (...args) => {\n const rgb = unpack(args, 'rgb');\n const r = rgb[0],\n b = rgb[2];\n let minTemp = 1000;\n let maxTemp = 40000;\n const eps = 0.4;\n let temp;\n while (maxTemp - minTemp > eps) {\n temp = (maxTemp + minTemp) * 0.5;\n const rgb = temperature2rgb(temp);\n if (rgb[2] / rgb[0] >= b / r) {\n maxTemp = temp;\n } else {\n minTemp = temp;\n }\n }\n return round(temp);\n};\n\nexport default rgb2temperature;\n","import chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport temperature2rgb from './temperature2rgb.js';\nimport rgb2temperature from './rgb2temperature.js';\n\nColor.prototype.temp =\n Color.prototype.kelvin =\n Color.prototype.temperature =\n function () {\n return rgb2temperature(this._rgb);\n };\n\nchroma.temp =\n chroma.kelvin =\n chroma.temperature =\n (...args) => new Color(...args, 'temp');\n\ninput.format.temp =\n input.format.kelvin =\n input.format.temperature =\n temperature2rgb;\n","import { unpack } from '../../utils/index.js';\nconst { pow, sign } = Math;\n\n/*\n * L* [0..100]\n * a [-100..100]\n * b [-100..100]\n */\nconst oklab2rgb = (...args) => {\n args = unpack(args, 'lab');\n const [L, a, b] = args;\n\n const l = pow(L + 0.3963377774 * a + 0.2158037573 * b, 3);\n const m = pow(L - 0.1055613458 * a - 0.0638541728 * b, 3);\n const s = pow(L - 0.0894841775 * a - 1.291485548 * b, 3);\n\n return [\n 255 * lrgb2rgb(+4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s),\n 255 * lrgb2rgb(-1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s),\n 255 * lrgb2rgb(-0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s),\n args.length > 3 ? args[3] : 1\n ];\n};\n\nexport default oklab2rgb;\n\nfunction lrgb2rgb(c) {\n const abs = Math.abs(c);\n if (abs > 0.0031308) {\n return (sign(c) || 1) * (1.055 * pow(abs, 1 / 2.4) - 0.055);\n }\n return c * 12.92;\n}\n","import { unpack } from '../../utils/index.js';\nconst { cbrt, pow, sign } = Math;\n\nconst rgb2oklab = (...args) => {\n // OKLab color space implementation taken from\n // https://bottosson.github.io/posts/oklab/\n const [r, g, b] = unpack(args, 'rgb');\n const [lr, lg, lb] = [\n rgb2lrgb(r / 255),\n rgb2lrgb(g / 255),\n rgb2lrgb(b / 255)\n ];\n const l = cbrt(0.4122214708 * lr + 0.5363325363 * lg + 0.0514459929 * lb);\n const m = cbrt(0.2119034982 * lr + 0.6806995451 * lg + 0.1073969566 * lb);\n const s = cbrt(0.0883024619 * lr + 0.2817188376 * lg + 0.6299787005 * lb);\n\n return [\n 0.2104542553 * l + 0.793617785 * m - 0.0040720468 * s,\n 1.9779984951 * l - 2.428592205 * m + 0.4505937099 * s,\n 0.0259040371 * l + 0.7827717662 * m - 0.808675766 * s\n ];\n};\n\nexport default rgb2oklab;\n\nfunction rgb2lrgb(c) {\n const abs = Math.abs(c);\n if (abs < 0.04045) {\n return c / 12.92;\n }\n return (sign(c) || 1) * pow((abs + 0.055) / 1.055, 2.4);\n}\n","import { unpack, type } from '../../utils/index.js';\nimport chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport oklab2rgb from './oklab2rgb.js';\nimport rgb2oklab from './rgb2oklab.js';\n\nColor.prototype.oklab = function () {\n return rgb2oklab(this._rgb);\n};\n\nchroma.oklab = (...args) => new Color(...args, 'oklab');\n\ninput.format.oklab = oklab2rgb;\n\ninput.autodetect.push({\n p: 3,\n test: (...args) => {\n args = unpack(args, 'oklab');\n if (type(args) === 'array' && args.length === 3) {\n return 'oklab';\n }\n }\n});\n","import { unpack, type } from '../../utils/index.js';\nimport chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport oklch2rgb from './oklch2rgb.js';\nimport rgb2oklch from './rgb2oklch.js';\n\nColor.prototype.oklch = function () {\n return rgb2oklch(this._rgb);\n};\n\nchroma.oklch = (...args) => new Color(...args, 'oklch');\n\ninput.format.oklch = oklch2rgb;\n\ninput.autodetect.push({\n p: 3,\n test: (...args) => {\n args = unpack(args, 'oklch');\n if (type(args) === 'array' && args.length === 3) {\n return 'oklch';\n }\n }\n});\n","import { unpack } from '../../utils/index.js';\nimport rgb2oklab from '../oklab/rgb2oklab.js';\nimport lab2lch from '../lch/lab2lch.js';\n\nconst rgb2oklch = (...args) => {\n const [r, g, b] = unpack(args, 'rgb');\n const [l, a, b_] = rgb2oklab(r, g, b);\n return lab2lch(l, a, b_);\n};\n\nexport default rgb2oklch;\n","import { unpack } from '../../utils/index.js';\nimport lch2lab from '../lch/lch2lab.js';\nimport oklab2rgb from '../oklab/oklab2rgb.js';\n\nconst oklch2rgb = (...args) => {\n args = unpack(args, 'lch');\n const [l, c, h] = args;\n const [L, a, b_] = lch2lab(l, c, h);\n const [r, g, b] = oklab2rgb(L, a, b_);\n return [r, g, b, args.length > 3 ? args[3] : 1];\n};\n\nexport default oklch2rgb;\n","import Color from '../Color.js';\nimport { type } from '../utils/index.js';\n\nColor.prototype.alpha = function (a, mutate = false) {\n if (a !== undefined && type(a) === 'number') {\n if (mutate) {\n this._rgb[3] = a;\n return this;\n }\n return new Color([this._rgb[0], this._rgb[1], this._rgb[2], a], 'rgb');\n }\n return this._rgb[3];\n};\n","import Color from '../Color.js';\n\nColor.prototype.clipped = function () {\n return this._rgb._clipped || false;\n};\n","import '../io/lab/index.js';\nimport Color from '../Color.js';\nimport LAB_CONSTANTS from '../io/lab/lab-constants.js';\n\nColor.prototype.darken = function (amount = 1) {\n const me = this;\n const lab = me.lab();\n lab[0] -= LAB_CONSTANTS.Kn * amount;\n return new Color(lab, 'lab').alpha(me.alpha(), true);\n};\n\nColor.prototype.brighten = function (amount = 1) {\n return this.darken(-amount);\n};\n\nColor.prototype.darker = Color.prototype.darken;\nColor.prototype.brighter = Color.prototype.brighten;\n","import Color from '../Color.js';\n\nColor.prototype.get = function (mc) {\n const [mode, channel] = mc.split('.');\n const src = this[mode]();\n if (channel) {\n const i = mode.indexOf(channel) - (mode.substr(0, 2) === 'ok' ? 2 : 0);\n if (i > -1) return src[i];\n throw new Error(`unknown channel ${channel} in mode ${mode}`);\n } else {\n return src;\n }\n};\n","import Color from '../Color.js';\nimport { type } from '../utils/index.js';\nconst { pow } = Math;\n\nconst EPS = 1e-7;\nconst MAX_ITER = 20;\n\nColor.prototype.luminance = function (lum, mode = 'rgb') {\n if (lum !== undefined && type(lum) === 'number') {\n if (lum === 0) {\n // return pure black\n return new Color([0, 0, 0, this._rgb[3]], 'rgb');\n }\n if (lum === 1) {\n // return pure white\n return new Color([255, 255, 255, this._rgb[3]], 'rgb');\n }\n // compute new color using...\n let cur_lum = this.luminance();\n let max_iter = MAX_ITER;\n\n const test = (low, high) => {\n const mid = low.interpolate(high, 0.5, mode);\n const lm = mid.luminance();\n if (Math.abs(lum - lm) < EPS || !max_iter--) {\n // close enough\n return mid;\n }\n return lm > lum ? test(low, mid) : test(mid, high);\n };\n\n const rgb = (\n cur_lum > lum\n ? test(new Color([0, 0, 0]), this)\n : test(this, new Color([255, 255, 255]))\n ).rgb();\n return new Color([...rgb, this._rgb[3]]);\n }\n return rgb2luminance(...this._rgb.slice(0, 3));\n};\n\nconst rgb2luminance = (r, g, b) => {\n // relative luminance\n // see http://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef\n r = luminance_x(r);\n g = luminance_x(g);\n b = luminance_x(b);\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n};\n\nconst luminance_x = (x) => {\n x /= 255;\n return x <= 0.03928 ? x / 12.92 : pow((x + 0.055) / 1.055, 2.4);\n};\n","export default {};\n","import Color from '../Color.js';\nimport { type } from '../utils/index.js';\nimport interpolator from '../interpolator/index.js';\n\nexport default (col1, col2, f = 0.5, ...rest) => {\n let mode = rest[0] || 'lrgb';\n if (!interpolator[mode] && !rest.length) {\n // fall back to the first supported mode\n mode = Object.keys(interpolator)[0];\n }\n if (!interpolator[mode]) {\n throw new Error(`interpolation mode ${mode} is not defined`);\n }\n if (type(col1) !== 'object') col1 = new Color(col1);\n if (type(col2) !== 'object') col2 = new Color(col2);\n return interpolator[mode](col1, col2, f).alpha(\n col1.alpha() + f * (col2.alpha() - col1.alpha())\n );\n};\n","import Color from '../Color.js';\nimport mix from '../generator/mix.js';\n\nColor.prototype.mix = Color.prototype.interpolate = function (\n col2,\n f = 0.5,\n ...rest\n) {\n return mix(this, col2, f, ...rest);\n};\n","import Color from '../Color.js';\n\nColor.prototype.premultiply = function (mutate = false) {\n const rgb = this._rgb;\n const a = rgb[3];\n if (mutate) {\n this._rgb = [rgb[0] * a, rgb[1] * a, rgb[2] * a, a];\n return this;\n } else {\n return new Color([rgb[0] * a, rgb[1] * a, rgb[2] * a, a], 'rgb');\n }\n};\n","import '../io/lch/index.js';\nimport Color from '../Color.js';\nimport LAB_CONSTANTS from '../io/lab/lab-constants.js';\n\nColor.prototype.saturate = function (amount = 1) {\n const me = this;\n const lch = me.lch();\n lch[1] += LAB_CONSTANTS.Kn * amount;\n if (lch[1] < 0) lch[1] = 0;\n return new Color(lch, 'lch').alpha(me.alpha(), true);\n};\n\nColor.prototype.desaturate = function (amount = 1) {\n return this.saturate(-amount);\n};\n","import Color from '../Color.js';\nimport { type } from '../utils/index.js';\n\nColor.prototype.set = function (mc, value, mutate = false) {\n const [mode, channel] = mc.split('.');\n const src = this[mode]();\n if (channel) {\n const i = mode.indexOf(channel) - (mode.substr(0, 2) === 'ok' ? 2 : 0);\n if (i > -1) {\n if (type(value) == 'string') {\n switch (value.charAt(0)) {\n case '+':\n src[i] += +value;\n break;\n case '-':\n src[i] += +value;\n break;\n case '*':\n src[i] *= +value.substr(1);\n break;\n case '/':\n src[i] /= +value.substr(1);\n break;\n default:\n src[i] = +value;\n }\n } else if (type(value) === 'number') {\n src[i] = value;\n } else {\n throw new Error(`unsupported value for Color.set`);\n }\n const out = new Color(src, mode);\n if (mutate) {\n this._rgb = out._rgb;\n return this;\n }\n return out;\n }\n throw new Error(`unknown channel ${channel} in mode ${mode}`);\n } else {\n return src;\n }\n};\n","import '../io/lab/index.js';\nimport Color from '../Color.js';\nimport mix from '../generator/mix.js';\n\nColor.prototype.tint = function (f = 0.5, ...rest) {\n return mix(this, 'white', f, ...rest);\n};\n\nColor.prototype.shade = function (f = 0.5, ...rest) {\n return mix(this, 'black', f, ...rest);\n};\n","import Color from '../Color.js';\nimport index from './index.js';\n\nconst rgb = (col1, col2, f) => {\n const xyz0 = col1._rgb;\n const xyz1 = col2._rgb;\n return new Color(\n xyz0[0] + f * (xyz1[0] - xyz0[0]),\n xyz0[1] + f * (xyz1[1] - xyz0[1]),\n xyz0[2] + f * (xyz1[2] - xyz0[2]),\n 'rgb'\n );\n};\n\n// register interpolator\nindex.rgb = rgb;\n\nexport default rgb;\n","import Color from '../Color.js';\nconst { sqrt, pow } = Math;\nimport index from './index.js';\n\nconst lrgb = (col1, col2, f) => {\n const [x1, y1, z1] = col1._rgb;\n const [x2, y2, z2] = col2._rgb;\n return new Color(\n sqrt(pow(x1, 2) * (1 - f) + pow(x2, 2) * f),\n sqrt(pow(y1, 2) * (1 - f) + pow(y2, 2) * f),\n sqrt(pow(z1, 2) * (1 - f) + pow(z2, 2) * f),\n 'rgb'\n );\n};\n\n// register interpolator\nindex.lrgb = lrgb;\n\nexport default lrgb;\n","import '../io/lab/index.js';\nimport index from './index.js';\nimport Color from '../Color.js';\n\nconst lab = (col1, col2, f) => {\n const xyz0 = col1.lab();\n const xyz1 = col2.lab();\n return new Color(\n xyz0[0] + f * (xyz1[0] - xyz0[0]),\n xyz0[1] + f * (xyz1[1] - xyz0[1]),\n xyz0[2] + f * (xyz1[2] - xyz0[2]),\n 'lab'\n );\n};\n\n// register interpolator\nindex.lab = lab;\n\nexport default lab;\n","import Color from '../Color.js';\n\nexport default (col1, col2, f, m) => {\n let xyz0, xyz1;\n if (m === 'hsl') {\n xyz0 = col1.hsl();\n xyz1 = col2.hsl();\n } else if (m === 'hsv') {\n xyz0 = col1.hsv();\n xyz1 = col2.hsv();\n } else if (m === 'hcg') {\n xyz0 = col1.hcg();\n xyz1 = col2.hcg();\n } else if (m === 'hsi') {\n xyz0 = col1.hsi();\n xyz1 = col2.hsi();\n } else if (m === 'lch' || m === 'hcl') {\n m = 'hcl';\n xyz0 = col1.hcl();\n xyz1 = col2.hcl();\n } else if (m === 'oklch') {\n xyz0 = col1.oklch().reverse();\n xyz1 = col2.oklch().reverse();\n }\n\n let hue0, hue1, sat0, sat1, lbv0, lbv1;\n if (m.substr(0, 1) === 'h' || m === 'oklch') {\n [hue0, sat0, lbv0] = xyz0;\n [hue1, sat1, lbv1] = xyz1;\n }\n\n let sat, hue, lbv, dh;\n\n if (!isNaN(hue0) && !isNaN(hue1)) {\n // both colors have hue\n if (hue1 > hue0 && hue1 - hue0 > 180) {\n dh = hue1 - (hue0 + 360);\n } else if (hue1 < hue0 && hue0 - hue1 > 180) {\n dh = hue1 + 360 - hue0;\n } else {\n dh = hue1 - hue0;\n }\n hue = hue0 + f * dh;\n } else if (!isNaN(hue0)) {\n hue = hue0;\n if ((lbv1 == 1 || lbv1 == 0) && m != 'hsv') sat = sat0;\n } else if (!isNaN(hue1)) {\n hue = hue1;\n if ((lbv0 == 1 || lbv0 == 0) && m != 'hsv') sat = sat1;\n } else {\n hue = Number.NaN;\n }\n\n if (sat === undefined) sat = sat0 + f * (sat1 - sat0);\n lbv = lbv0 + f * (lbv1 - lbv0);\n return m === 'oklch'\n ? new Color([lbv, sat, hue], m)\n : new Color([hue, sat, lbv], m);\n};\n","import '../io/lch/index.js';\nimport interpolate_hsx from './_hsx.js';\nimport index from './index.js';\n\nconst lch = (col1, col2, f) => {\n return interpolate_hsx(col1, col2, f, 'lch');\n};\n\n// register interpolator\nindex.lch = lch;\nindex.hcl = lch;\n\nexport default lch;\n","import '../io/num/index.js';\nimport index from './index.js';\n\nimport Color from '../Color.js';\n\nconst num = (col1, col2, f) => {\n const c1 = col1.num();\n const c2 = col2.num();\n return new Color(c1 + f * (c2 - c1), 'num');\n};\n\n// register interpolator\nindex.num = num;\n\nexport default num;\n","import '../io/hcg/index.js';\nimport interpolate_hsx from './_hsx.js';\nimport index from './index.js';\n\nconst hcg = (col1, col2, f) => {\n return interpolate_hsx(col1, col2, f, 'hcg');\n};\n\n// register interpolator\nindex.hcg = hcg;\n\nexport default hcg;\n","import '../io/hsi/index.js';\nimport interpolate_hsx from './_hsx.js';\nimport index from './index.js';\n\nconst hsi = (col1, col2, f) => {\n return interpolate_hsx(col1, col2, f, 'hsi');\n};\n\n// register interpolator\nindex.hsi = hsi;\n\nexport default hsi;\n","import '../io/hsl/index.js';\nimport interpolate_hsx from './_hsx.js';\nimport index from './index.js';\n\nconst hsl = (col1, col2, f) => {\n return interpolate_hsx(col1, col2, f, 'hsl');\n};\n\n// register interpolator\nindex.hsl = hsl;\n\nexport default hsl;\n","import '../io/hsv/index.js';\nimport interpolate_hsx from './_hsx.js';\nimport index from './index.js';\n\nconst hsv = (col1, col2, f) => {\n return interpolate_hsx(col1, col2, f, 'hsv');\n};\n\n// register interpolator\nindex.hsv = hsv;\n\nexport default hsv;\n","import '../io/oklab/index.js';\nimport index from './index.js';\nimport Color from '../Color.js';\n\nconst oklab = (col1, col2, f) => {\n const xyz0 = col1.oklab();\n const xyz1 = col2.oklab();\n return new Color(\n xyz0[0] + f * (xyz1[0] - xyz0[0]),\n xyz0[1] + f * (xyz1[1] - xyz0[1]),\n xyz0[2] + f * (xyz1[2] - xyz0[2]),\n 'oklab'\n );\n};\n\n// register interpolator\nindex.oklab = oklab;\n\nexport default oklab;\n","import '../io/lch/index.js';\nimport interpolate_hsx from './_hsx.js';\nimport index from './index.js';\n\nconst oklch = (col1, col2, f) => {\n return interpolate_hsx(col1, col2, f, 'oklch');\n};\n\n// register interpolator\nindex.oklch = oklch;\n\nexport default oklch;\n","import Color from '../Color.js';\nimport { clip_rgb } from '../utils/index.js';\n\nconst { pow, sqrt, PI, cos, sin, atan2 } = Math;\n\nexport default (colors, mode = 'lrgb', weights = null) => {\n const l = colors.length;\n if (!weights) weights = Array.from(new Array(l)).map(() => 1);\n // normalize weights\n const k =\n l /\n weights.reduce(function (a, b) {\n return a + b;\n });\n weights.forEach((w, i) => {\n weights[i] *= k;\n });\n // convert colors to Color objects\n colors = colors.map((c) => new Color(c));\n if (mode === 'lrgb') {\n return _average_lrgb(colors, weights);\n }\n const first = colors.shift();\n const xyz = first.get(mode);\n const cnt = [];\n let dx = 0;\n let dy = 0;\n // initial color\n for (let i = 0; i < xyz.length; i++) {\n xyz[i] = (xyz[i] || 0) * weights[0];\n cnt.push(isNaN(xyz[i]) ? 0 : weights[0]);\n if (mode.charAt(i) === 'h' && !isNaN(xyz[i])) {\n const A = (xyz[i] / 180) * PI;\n dx += cos(A) * weights[0];\n dy += sin(A) * weights[0];\n }\n }\n\n let alpha = first.alpha() * weights[0];\n colors.forEach((c, ci) => {\n const xyz2 = c.get(mode);\n alpha += c.alpha() * weights[ci + 1];\n for (let i = 0; i < xyz.length; i++) {\n if (!isNaN(xyz2[i])) {\n cnt[i] += weights[ci + 1];\n if (mode.charAt(i) === 'h') {\n const A = (xyz2[i] / 180) * PI;\n dx += cos(A) * weights[ci + 1];\n dy += sin(A) * weights[ci + 1];\n } else {\n xyz[i] += xyz2[i] * weights[ci + 1];\n }\n }\n }\n });\n\n for (let i = 0; i < xyz.length; i++) {\n if (mode.charAt(i) === 'h') {\n let A = (atan2(dy / cnt[i], dx / cnt[i]) / PI) * 180;\n while (A < 0) A += 360;\n while (A >= 360) A -= 360;\n xyz[i] = A;\n } else {\n xyz[i] = xyz[i] / cnt[i];\n }\n }\n alpha /= l;\n return new Color(xyz, mode).alpha(alpha > 0.99999 ? 1 : alpha, true);\n};\n\nconst _average_lrgb = (colors, weights) => {\n const l = colors.length;\n const xyz = [0, 0, 0, 0];\n for (let i = 0; i < colors.length; i++) {\n const col = colors[i];\n const f = weights[i] / l;\n const rgb = col._rgb;\n xyz[0] += pow(rgb[0], 2) * f;\n xyz[1] += pow(rgb[1], 2) * f;\n xyz[2] += pow(rgb[2], 2) * f;\n xyz[3] += rgb[3] * f;\n }\n xyz[0] = sqrt(xyz[0]);\n xyz[1] = sqrt(xyz[1]);\n xyz[2] = sqrt(xyz[2]);\n if (xyz[3] > 0.9999999) xyz[3] = 1;\n return new Color(clip_rgb(xyz));\n};\n","// minimal multi-purpose interface\n\n// @requires utils color analyze\nimport chroma from '../chroma.js';\nimport { limit, type } from '../utils/index.js';\n\nconst { pow } = Math;\n\nexport default function (colors) {\n // constructor\n let _mode = 'rgb';\n let _nacol = chroma('#ccc');\n let _spread = 0;\n // const _fixed = false;\n let _domain = [0, 1];\n let _pos = [];\n let _padding = [0, 0];\n let _classes = false;\n let _colors = [];\n let _out = false;\n let _min = 0;\n let _max = 1;\n let _correctLightness = false;\n let _colorCache = {};\n let _useCache = true;\n let _gamma = 1;\n\n // private methods\n\n const setColors = function (colors) {\n colors = colors || ['#fff', '#000'];\n if (\n colors &&\n type(colors) === 'string' &&\n chroma.brewer &&\n chroma.brewer[colors.toLowerCase()]\n ) {\n colors = chroma.brewer[colors.toLowerCase()];\n }\n if (type(colors) === 'array') {\n // handle single color\n if (colors.length === 1) {\n colors = [colors[0], colors[0]];\n }\n // make a copy of the colors\n colors = colors.slice(0);\n // convert to chroma classes\n for (let c = 0; c < colors.length; c++) {\n colors[c] = chroma(colors[c]);\n }\n // auto-fill color position\n _pos.length = 0;\n for (let c = 0; c < colors.length; c++) {\n _pos.push(c / (colors.length - 1));\n }\n }\n resetCache();\n return (_colors = colors);\n };\n\n const getClass = function (value) {\n if (_classes != null) {\n const n = _classes.length - 1;\n let i = 0;\n while (i < n && value >= _classes[i]) {\n i++;\n }\n return i - 1;\n }\n return 0;\n };\n\n let tMapLightness = (t) => t;\n let tMapDomain = (t) => t;\n\n // const classifyValue = function(value) {\n // let val = value;\n // if (_classes.length > 2) {\n // const n = _classes.length-1;\n // const i = getClass(value);\n // const minc = _classes[0] + ((_classes[1]-_classes[0]) * (0 + (_spread * 0.5))); // center of 1st class\n // const maxc = _classes[n-1] + ((_classes[n]-_classes[n-1]) * (1 - (_spread * 0.5))); // center of last class\n // val = _min + ((((_classes[i] + ((_classes[i+1] - _classes[i]) * 0.5)) - minc) / (maxc-minc)) * (_max - _min));\n // }\n // return val;\n // };\n\n const getColor = function (val, bypassMap) {\n let col, t;\n if (bypassMap == null) {\n bypassMap = false;\n }\n if (isNaN(val) || val === null) {\n return _nacol;\n }\n if (!bypassMap) {\n if (_classes && _classes.length > 2) {\n // find the class\n const c = getClass(val);\n t = c / (_classes.length - 2);\n } else if (_max !== _min) {\n // just interpolate between min/max\n t = (val - _min) / (_max - _min);\n } else {\n t = 1;\n }\n } else {\n t = val;\n }\n\n // domain map\n t = tMapDomain(t);\n\n if (!bypassMap) {\n t = tMapLightness(t); // lightness correction\n }\n\n if (_gamma !== 1) {\n t = pow(t, _gamma);\n }\n\n t = _padding[0] + t * (1 - _padding[0] - _padding[1]);\n\n t = limit(t, 0, 1);\n\n const k = Math.floor(t * 10000);\n\n if (_useCache && _colorCache[k]) {\n col = _colorCache[k];\n } else {\n if (type(_colors) === 'array') {\n //for i in [0.._pos.length-1]\n for (let i = 0; i < _pos.length; i++) {\n const p = _pos[i];\n if (t <= p) {\n col = _colors[i];\n break;\n }\n if (t >= p && i === _pos.length - 1) {\n col = _colors[i];\n break;\n }\n if (t > p && t < _pos[i + 1]) {\n t = (t - p) / (_pos[i + 1] - p);\n col = chroma.interpolate(\n _colors[i],\n _colors[i + 1],\n t,\n _mode\n );\n break;\n }\n }\n } else if (type(_colors) === 'function') {\n col = _colors(t);\n }\n if (_useCache) {\n _colorCache[k] = col;\n }\n }\n return col;\n };\n\n var resetCache = () => (_colorCache = {});\n\n setColors(colors);\n\n // public interface\n\n const f = function (v) {\n const c = chroma(getColor(v));\n if (_out && c[_out]) {\n return c[_out]();\n } else {\n return c;\n }\n };\n\n f.classes = function (classes) {\n if (classes != null) {\n if (type(classes) === 'array') {\n _classes = classes;\n _domain = [classes[0], classes[classes.length - 1]];\n } else {\n const d = chroma.analyze(_domain);\n if (classes === 0) {\n _classes = [d.min, d.max];\n } else {\n _classes = chroma.limits(d, 'e', classes);\n }\n }\n return f;\n }\n return _classes;\n };\n\n f.domain = function (domain) {\n if (!arguments.length) {\n return _domain;\n }\n _min = domain[0];\n _max = domain[domain.length - 1];\n _pos = [];\n const k = _colors.length;\n if (domain.length === k && _min !== _max) {\n // update positions\n for (let d of Array.from(domain)) {\n _pos.push((d - _min) / (_max - _min));\n }\n } else {\n for (let c = 0; c < k; c++) {\n _pos.push(c / (k - 1));\n }\n if (domain.length > 2) {\n // set domain map\n const tOut = domain.map((d, i) => i / (domain.length - 1));\n const tBreaks = domain.map((d) => (d - _min) / (_max - _min));\n if (!tBreaks.every((val, i) => tOut[i] === val)) {\n tMapDomain = (t) => {\n if (t <= 0 || t >= 1) return t;\n let i = 0;\n while (t >= tBreaks[i + 1]) i++;\n const f =\n (t - tBreaks[i]) / (tBreaks[i + 1] - tBreaks[i]);\n const out = tOut[i] + f * (tOut[i + 1] - tOut[i]);\n return out;\n };\n }\n }\n }\n _domain = [_min, _max];\n return f;\n };\n\n f.mode = function (_m) {\n if (!arguments.length) {\n return _mode;\n }\n _mode = _m;\n resetCache();\n return f;\n };\n\n f.range = function (colors, _pos) {\n setColors(colors, _pos);\n return f;\n };\n\n f.out = function (_o) {\n _out = _o;\n return f;\n };\n\n f.spread = function (val) {\n if (!arguments.length) {\n return _spread;\n }\n _spread = val;\n return f;\n };\n\n f.correctLightness = function (v) {\n if (v == null) {\n v = true;\n }\n _correctLightness = v;\n resetCache();\n if (_correctLightness) {\n tMapLightness = function (t) {\n const L0 = getColor(0, true).lab()[0];\n const L1 = getColor(1, true).lab()[0];\n const pol = L0 > L1;\n let L_actual = getColor(t, true).lab()[0];\n const L_ideal = L0 + (L1 - L0) * t;\n let L_diff = L_actual - L_ideal;\n let t0 = 0;\n let t1 = 1;\n let max_iter = 20;\n while (Math.abs(L_diff) > 1e-2 && max_iter-- > 0) {\n (function () {\n if (pol) {\n L_diff *= -1;\n }\n if (L_diff < 0) {\n t0 = t;\n t += (t1 - t) * 0.5;\n } else {\n t1 = t;\n t += (t0 - t) * 0.5;\n }\n L_actual = getColor(t, true).lab()[0];\n return (L_diff = L_actual - L_ideal);\n })();\n }\n return t;\n };\n } else {\n tMapLightness = (t) => t;\n }\n return f;\n };\n\n f.padding = function (p) {\n if (p != null) {\n if (type(p) === 'number') {\n p = [p, p];\n }\n _padding = p;\n return f;\n } else {\n return _padding;\n }\n };\n\n f.colors = function (numColors, out) {\n // If no arguments are given, return the original colors that were provided\n if (arguments.length < 2) {\n out = 'hex';\n }\n let result = [];\n\n if (arguments.length === 0) {\n result = _colors.slice(0);\n } else if (numColors === 1) {\n result = [f(0.5)];\n } else if (numColors > 1) {\n const dm = _domain[0];\n const dd = _domain[1] - dm;\n result = __range__(0, numColors, false).map((i) =>\n f(dm + (i / (numColors - 1)) * dd)\n );\n } else {\n // returns all colors based on the defined classes\n colors = [];\n let samples = [];\n if (_classes && _classes.length > 2) {\n for (\n let i = 1, end = _classes.length, asc = 1 <= end;\n asc ? i < end : i > end;\n asc ? i++ : i--\n ) {\n samples.push((_classes[i - 1] + _classes[i]) * 0.5);\n }\n } else {\n samples = _domain;\n }\n result = samples.map((v) => f(v));\n }\n\n if (chroma[out]) {\n result = result.map((c) => c[out]());\n }\n return result;\n };\n\n f.cache = function (c) {\n if (c != null) {\n _useCache = c;\n return f;\n } else {\n return _useCache;\n }\n };\n\n f.gamma = function (g) {\n if (g != null) {\n _gamma = g;\n return f;\n } else {\n return _gamma;\n }\n };\n\n f.nodata = function (d) {\n if (d != null) {\n _nacol = chroma(d);\n return f;\n } else {\n return _nacol;\n }\n };\n\n return f;\n}\n\nfunction __range__(left, right, inclusive) {\n let range = [];\n let ascending = left < right;\n let end = !inclusive ? right : ascending ? right + 1 : right - 1;\n for (let i = left; ascending ? i < end : i > end; ascending ? i++ : i--) {\n range.push(i);\n }\n return range;\n}\n","/*\n * interpolates between a set of colors uzing a bezier spline\n * blend mode formulas taken from https://web.archive.org/web/20180110014946/http://www.venture-ware.com/kevin/coding/lets-learn-math-photoshop-blend-modes/\n */\n\nimport '../io/rgb/index.js';\nimport chroma from '../chroma.js';\n\nconst blend = (bottom, top, mode) => {\n if (!blend[mode]) {\n throw new Error('unknown blend mode ' + mode);\n }\n return blend[mode](bottom, top);\n};\n\nconst blend_f = (f) => (bottom, top) => {\n const c0 = chroma(top).rgb();\n const c1 = chroma(bottom).rgb();\n return chroma.rgb(f(c0, c1));\n};\n\nconst each = (f) => (c0, c1) => {\n const out = [];\n out[0] = f(c0[0], c1[0]);\n out[1] = f(c0[1], c1[1]);\n out[2] = f(c0[2], c1[2]);\n return out;\n};\n\nconst normal = (a) => a;\nconst multiply = (a, b) => (a * b) / 255;\nconst darken = (a, b) => (a > b ? b : a);\nconst lighten = (a, b) => (a > b ? a : b);\nconst screen = (a, b) => 255 * (1 - (1 - a / 255) * (1 - b / 255));\nconst overlay = (a, b) =>\n b < 128 ? (2 * a * b) / 255 : 255 * (1 - 2 * (1 - a / 255) * (1 - b / 255));\nconst burn = (a, b) => 255 * (1 - (1 - b / 255) / (a / 255));\nconst dodge = (a, b) => {\n if (a === 255) return 255;\n a = (255 * (b / 255)) / (1 - a / 255);\n return a > 255 ? 255 : a;\n};\n\n// # add = (a,b) ->\n// # if (a + b > 255) then 255 else a + b\n\nblend.normal = blend_f(each(normal));\nblend.multiply = blend_f(each(multiply));\nblend.screen = blend_f(each(screen));\nblend.overlay = blend_f(each(overlay));\nblend.darken = blend_f(each(darken));\nblend.lighten = blend_f(each(lighten));\nblend.dodge = blend_f(each(dodge));\nblend.burn = blend_f(each(burn));\n// blend.add = blend_f(each(add));\n\nexport default blend;\n","// cubehelix interpolation\n// based on D.A. Green \"A colour scheme for the display of astronomical intensity images\"\n// http://astron-soc.in/bulletin/11June/289392011.pdf\nimport { type, clip_rgb, TWOPI } from '../utils/index.js';\nimport chroma from '../chroma.js';\nconst { pow, sin, cos } = Math;\n\nexport default function (\n start = 300,\n rotations = -1.5,\n hue = 1,\n gamma = 1,\n lightness = [0, 1]\n) {\n let dh = 0,\n dl;\n if (type(lightness) === 'array') {\n dl = lightness[1] - lightness[0];\n } else {\n dl = 0;\n lightness = [lightness, lightness];\n }\n const f = function (fract) {\n const a = TWOPI * ((start + 120) / 360 + rotations * fract);\n const l = pow(lightness[0] + dl * fract, gamma);\n const h = dh !== 0 ? hue[0] + fract * dh : hue;\n const amp = (h * l * (1 - l)) / 2;\n const cos_a = cos(a);\n const sin_a = sin(a);\n const r = l + amp * (-0.14861 * cos_a + 1.78277 * sin_a);\n const g = l + amp * (-0.29227 * cos_a - 0.90649 * sin_a);\n const b = l + amp * (+1.97294 * cos_a);\n return chroma(clip_rgb([r * 255, g * 255, b * 255, 1]));\n };\n f.start = function (s) {\n if (s == null) {\n return start;\n }\n start = s;\n return f;\n };\n f.rotations = function (r) {\n if (r == null) {\n return rotations;\n }\n rotations = r;\n return f;\n };\n f.gamma = function (g) {\n if (g == null) {\n return gamma;\n }\n gamma = g;\n return f;\n };\n f.hue = function (h) {\n if (h == null) {\n return hue;\n }\n hue = h;\n if (type(hue) === 'array') {\n dh = hue[1] - hue[0];\n if (dh === 0) {\n hue = hue[1];\n }\n } else {\n dh = 0;\n }\n return f;\n };\n f.lightness = function (h) {\n if (h == null) {\n return lightness;\n }\n if (type(h) === 'array') {\n lightness = h;\n dl = h[1] - h[0];\n } else {\n lightness = [h, h];\n dl = 0;\n }\n return f;\n };\n f.scale = () => chroma.scale(f);\n f.hue(hue);\n return f;\n}\n","import Color from '../Color.js';\nconst digits = '0123456789abcdef';\n\nconst { floor, random } = Math;\n\nexport default () => {\n let code = '#';\n for (let i = 0; i < 6; i++) {\n code += digits.charAt(floor(random() * 16));\n }\n return new Color(code, 'hex');\n};\n","import type from './type.js';\n\nconst { log, pow, floor, abs } = Math;\n\nexport function analyze(data, key = null) {\n const r = {\n min: Number.MAX_VALUE,\n max: Number.MAX_VALUE * -1,\n sum: 0,\n values: [],\n count: 0\n };\n if (type(data) === 'object') {\n data = Object.values(data);\n }\n data.forEach((val) => {\n if (key && type(val) === 'object') val = val[key];\n if (val !== undefined && val !== null && !isNaN(val)) {\n r.values.push(val);\n r.sum += val;\n if (val < r.min) r.min = val;\n if (val > r.max) r.max = val;\n r.count += 1;\n }\n });\n\n r.domain = [r.min, r.max];\n\n r.limits = (mode, num) => limits(r, mode, num);\n\n return r;\n}\n\nexport function limits(data, mode = 'equal', num = 7) {\n if (type(data) == 'array') {\n data = analyze(data);\n }\n const { min, max } = data;\n const values = data.values.sort((a, b) => a - b);\n\n if (num === 1) {\n return [min, max];\n }\n\n const limits = [];\n\n if (mode.substr(0, 1) === 'c') {\n // continuous\n limits.push(min);\n limits.push(max);\n }\n\n if (mode.substr(0, 1) === 'e') {\n // equal interval\n limits.push(min);\n for (let i = 1; i < num; i++) {\n limits.push(min + (i / num) * (max - min));\n }\n limits.push(max);\n } else if (mode.substr(0, 1) === 'l') {\n // log scale\n if (min <= 0) {\n throw new Error(\n 'Logarithmic scales are only possible for values > 0'\n );\n }\n const min_log = Math.LOG10E * log(min);\n const max_log = Math.LOG10E * log(max);\n limits.push(min);\n for (let i = 1; i < num; i++) {\n limits.push(pow(10, min_log + (i / num) * (max_log - min_log)));\n }\n limits.push(max);\n } else if (mode.substr(0, 1) === 'q') {\n // quantile scale\n limits.push(min);\n for (let i = 1; i < num; i++) {\n const p = ((values.length - 1) * i) / num;\n const pb = floor(p);\n if (pb === p) {\n limits.push(values[pb]);\n } else {\n // p > pb\n const pr = p - pb;\n limits.push(values[pb] * (1 - pr) + values[pb + 1] * pr);\n }\n }\n limits.push(max);\n } else if (mode.substr(0, 1) === 'k') {\n // k-means clustering\n /*\n implementation based on\n http://code.google.com/p/figue/source/browse/trunk/figue.js#336\n simplified for 1-d input values\n */\n let cluster;\n const n = values.length;\n const assignments = new Array(n);\n const clusterSizes = new Array(num);\n let repeat = true;\n let nb_iters = 0;\n let centroids = null;\n\n // get seed values\n centroids = [];\n centroids.push(min);\n for (let i = 1; i < num; i++) {\n centroids.push(min + (i / num) * (max - min));\n }\n centroids.push(max);\n\n while (repeat) {\n // assignment step\n for (let j = 0; j < num; j++) {\n clusterSizes[j] = 0;\n }\n for (let i = 0; i < n; i++) {\n const value = values[i];\n let mindist = Number.MAX_VALUE;\n let best;\n for (let j = 0; j < num; j++) {\n const dist = abs(centroids[j] - value);\n if (dist < mindist) {\n mindist = dist;\n best = j;\n }\n clusterSizes[best]++;\n assignments[i] = best;\n }\n }\n\n // update centroids step\n const newCentroids = new Array(num);\n for (let j = 0; j < num; j++) {\n newCentroids[j] = null;\n }\n for (let i = 0; i < n; i++) {\n cluster = assignments[i];\n if (newCentroids[cluster] === null) {\n newCentroids[cluster] = values[i];\n } else {\n newCentroids[cluster] += values[i];\n }\n }\n for (let j = 0; j < num; j++) {\n newCentroids[j] *= 1 / clusterSizes[j];\n }\n\n // check convergence\n repeat = false;\n for (let j = 0; j < num; j++) {\n if (newCentroids[j] !== centroids[j]) {\n repeat = true;\n break;\n }\n }\n\n centroids = newCentroids;\n nb_iters++;\n\n if (nb_iters > 200) {\n repeat = false;\n }\n }\n\n // finished k-means clustering\n // the next part is borrowed from gabrielflor.it\n const kClusters = {};\n for (let j = 0; j < num; j++) {\n kClusters[j] = [];\n }\n for (let i = 0; i < n; i++) {\n cluster = assignments[i];\n kClusters[cluster].push(values[i]);\n }\n let tmpKMeansBreaks = [];\n for (let j = 0; j < num; j++) {\n tmpKMeansBreaks.push(kClusters[j][0]);\n tmpKMeansBreaks.push(kClusters[j][kClusters[j].length - 1]);\n }\n tmpKMeansBreaks = tmpKMeansBreaks.sort((a, b) => a - b);\n limits.push(tmpKMeansBreaks[0]);\n for (let i = 1; i < tmpKMeansBreaks.length; i += 2) {\n const v = tmpKMeansBreaks[i];\n if (!isNaN(v) && limits.indexOf(v) === -1) {\n limits.push(v);\n }\n }\n }\n return limits;\n}\n","import Color from '../Color.js';\nconst { sqrt, pow, min, max, atan2, abs, cos, sin, exp, PI } = Math;\n\nexport default function (a, b, Kl = 1, Kc = 1, Kh = 1) {\n // Delta E (CIE 2000)\n // see http://www.brucelindbloom.com/index.html?Eqn_DeltaE_CIE2000.html\n var rad2deg = function (rad) {\n return (360 * rad) / (2 * PI);\n };\n var deg2rad = function (deg) {\n return (2 * PI * deg) / 360;\n };\n a = new Color(a);\n b = new Color(b);\n const [L1, a1, b1] = Array.from(a.lab());\n const [L2, a2, b2] = Array.from(b.lab());\n const avgL = (L1 + L2) / 2;\n const C1 = sqrt(pow(a1, 2) + pow(b1, 2));\n const C2 = sqrt(pow(a2, 2) + pow(b2, 2));\n const avgC = (C1 + C2) / 2;\n const G = 0.5 * (1 - sqrt(pow(avgC, 7) / (pow(avgC, 7) + pow(25, 7))));\n const a1p = a1 * (1 + G);\n const a2p = a2 * (1 + G);\n const C1p = sqrt(pow(a1p, 2) + pow(b1, 2));\n const C2p = sqrt(pow(a2p, 2) + pow(b2, 2));\n const avgCp = (C1p + C2p) / 2;\n const arctan1 = rad2deg(atan2(b1, a1p));\n const arctan2 = rad2deg(atan2(b2, a2p));\n const h1p = arctan1 >= 0 ? arctan1 : arctan1 + 360;\n const h2p = arctan2 >= 0 ? arctan2 : arctan2 + 360;\n const avgHp =\n abs(h1p - h2p) > 180 ? (h1p + h2p + 360) / 2 : (h1p + h2p) / 2;\n const T =\n 1 -\n 0.17 * cos(deg2rad(avgHp - 30)) +\n 0.24 * cos(deg2rad(2 * avgHp)) +\n 0.32 * cos(deg2rad(3 * avgHp + 6)) -\n 0.2 * cos(deg2rad(4 * avgHp - 63));\n let deltaHp = h2p - h1p;\n deltaHp =\n abs(deltaHp) <= 180\n ? deltaHp\n : h2p <= h1p\n ? deltaHp + 360\n : deltaHp - 360;\n deltaHp = 2 * sqrt(C1p * C2p) * sin(deg2rad(deltaHp) / 2);\n const deltaL = L2 - L1;\n const deltaCp = C2p - C1p;\n const sl = 1 + (0.015 * pow(avgL - 50, 2)) / sqrt(20 + pow(avgL - 50, 2));\n const sc = 1 + 0.045 * avgCp;\n const sh = 1 + 0.015 * avgCp * T;\n const deltaTheta = 30 * exp(-pow((avgHp - 275) / 25, 2));\n const Rc = 2 * sqrt(pow(avgCp, 7) / (pow(avgCp, 7) + pow(25, 7)));\n const Rt = -Rc * sin(2 * deg2rad(deltaTheta));\n const result = sqrt(\n pow(deltaL / (Kl * sl), 2) +\n pow(deltaCp / (Kc * sc), 2) +\n pow(deltaHp / (Kh * sh), 2) +\n Rt * (deltaCp / (Kc * sc)) * (deltaHp / (Kh * sh))\n );\n return max(0, min(100, result));\n}\n","import Color from '../Color.js';\n\nexport default (...args) => {\n try {\n new Color(...args);\n return true;\n // eslint-disable-next-line\n } catch (e) {\n return false;\n }\n};\n","// some pre-defined color scales:\nimport chroma from '../chroma.js';\nimport '../io/hsl/index.js';\nimport scale from '../generator/scale.js';\n\nexport default {\n cool() {\n return scale([chroma.hsl(180, 1, 0.9), chroma.hsl(250, 0.7, 0.4)]);\n },\n hot() {\n return scale(['#000', '#f00', '#ff0', '#fff'], [0, 0.25, 0.75, 1]).mode(\n 'rgb'\n );\n }\n};\n","/**\n ColorBrewer colors for chroma.js\n\n Copyright (c) 2002 Cynthia Brewer, Mark Harrower, and The\n Pennsylvania State University.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software distributed\n under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR\n CONDITIONS OF ANY KIND, either express or implied. See the License for the\n specific language governing permissions and limitations under the License.\n*/\n\nconst colorbrewer = {\n // sequential\n OrRd: ['#fff7ec', '#fee8c8', '#fdd49e', '#fdbb84', '#fc8d59', '#ef6548', '#d7301f', '#b30000', '#7f0000'],\n PuBu: ['#fff7fb', '#ece7f2', '#d0d1e6', '#a6bddb', '#74a9cf', '#3690c0', '#0570b0', '#045a8d', '#023858'],\n BuPu: ['#f7fcfd', '#e0ecf4', '#bfd3e6', '#9ebcda', '#8c96c6', '#8c6bb1', '#88419d', '#810f7c', '#4d004b'],\n Oranges: ['#fff5eb', '#fee6ce', '#fdd0a2', '#fdae6b', '#fd8d3c', '#f16913', '#d94801', '#a63603', '#7f2704'],\n BuGn: ['#f7fcfd', '#e5f5f9', '#ccece6', '#99d8c9', '#66c2a4', '#41ae76', '#238b45', '#006d2c', '#00441b'],\n YlOrBr: ['#ffffe5', '#fff7bc', '#fee391', '#fec44f', '#fe9929', '#ec7014', '#cc4c02', '#993404', '#662506'],\n YlGn: ['#ffffe5', '#f7fcb9', '#d9f0a3', '#addd8e', '#78c679', '#41ab5d', '#238443', '#006837', '#004529'],\n Reds: ['#fff5f0', '#fee0d2', '#fcbba1', '#fc9272', '#fb6a4a', '#ef3b2c', '#cb181d', '#a50f15', '#67000d'],\n RdPu: ['#fff7f3', '#fde0dd', '#fcc5c0', '#fa9fb5', '#f768a1', '#dd3497', '#ae017e', '#7a0177', '#49006a'],\n Greens: ['#f7fcf5', '#e5f5e0', '#c7e9c0', '#a1d99b', '#74c476', '#41ab5d', '#238b45', '#006d2c', '#00441b'],\n YlGnBu: ['#ffffd9', '#edf8b1', '#c7e9b4', '#7fcdbb', '#41b6c4', '#1d91c0', '#225ea8', '#253494', '#081d58'],\n Purples: ['#fcfbfd', '#efedf5', '#dadaeb', '#bcbddc', '#9e9ac8', '#807dba', '#6a51a3', '#54278f', '#3f007d'],\n GnBu: ['#f7fcf0', '#e0f3db', '#ccebc5', '#a8ddb5', '#7bccc4', '#4eb3d3', '#2b8cbe', '#0868ac', '#084081'],\n Greys: ['#ffffff', '#f0f0f0', '#d9d9d9', '#bdbdbd', '#969696', '#737373', '#525252', '#252525', '#000000'],\n YlOrRd: ['#ffffcc', '#ffeda0', '#fed976', '#feb24c', '#fd8d3c', '#fc4e2a', '#e31a1c', '#bd0026', '#800026'],\n PuRd: ['#f7f4f9', '#e7e1ef', '#d4b9da', '#c994c7', '#df65b0', '#e7298a', '#ce1256', '#980043', '#67001f'],\n Blues: ['#f7fbff', '#deebf7', '#c6dbef', '#9ecae1', '#6baed6', '#4292c6', '#2171b5', '#08519c', '#08306b'],\n PuBuGn: ['#fff7fb', '#ece2f0', '#d0d1e6', '#a6bddb', '#67a9cf', '#3690c0', '#02818a', '#016c59', '#014636'],\n Viridis: ['#440154', '#482777', '#3f4a8a', '#31678e', '#26838f', '#1f9d8a', '#6cce5a', '#b6de2b', '#fee825'],\n\n // diverging\n Spectral: ['#9e0142', '#d53e4f', '#f46d43', '#fdae61', '#fee08b', '#ffffbf', '#e6f598', '#abdda4', '#66c2a5', '#3288bd', '#5e4fa2'],\n RdYlGn: ['#a50026', '#d73027', '#f46d43', '#fdae61', '#fee08b', '#ffffbf', '#d9ef8b', '#a6d96a', '#66bd63', '#1a9850', '#006837'],\n RdBu: ['#67001f', '#b2182b', '#d6604d', '#f4a582', '#fddbc7', '#f7f7f7', '#d1e5f0', '#92c5de', '#4393c3', '#2166ac', '#053061'],\n PiYG: ['#8e0152', '#c51b7d', '#de77ae', '#f1b6da', '#fde0ef', '#f7f7f7', '#e6f5d0', '#b8e186', '#7fbc41', '#4d9221', '#276419'],\n PRGn: ['#40004b', '#762a83', '#9970ab', '#c2a5cf', '#e7d4e8', '#f7f7f7', '#d9f0d3', '#a6dba0', '#5aae61', '#1b7837', '#00441b'],\n RdYlBu: ['#a50026', '#d73027', '#f46d43', '#fdae61', '#fee090', '#ffffbf', '#e0f3f8', '#abd9e9', '#74add1', '#4575b4', '#313695'],\n BrBG: ['#543005', '#8c510a', '#bf812d', '#dfc27d', '#f6e8c3', '#f5f5f5', '#c7eae5', '#80cdc1', '#35978f', '#01665e', '#003c30'],\n RdGy: ['#67001f', '#b2182b', '#d6604d', '#f4a582', '#fddbc7', '#ffffff', '#e0e0e0', '#bababa', '#878787', '#4d4d4d', '#1a1a1a'],\n PuOr: ['#7f3b08', '#b35806', '#e08214', '#fdb863', '#fee0b6', '#f7f7f7', '#d8daeb', '#b2abd2', '#8073ac', '#542788', '#2d004b'],\n\n // qualitative\n Set2: ['#66c2a5', '#fc8d62', '#8da0cb', '#e78ac3', '#a6d854', '#ffd92f', '#e5c494', '#b3b3b3'],\n Accent: ['#7fc97f', '#beaed4', '#fdc086', '#ffff99', '#386cb0', '#f0027f', '#bf5b17', '#666666'],\n Set1: ['#e41a1c', '#377eb8', '#4daf4a', '#984ea3', '#ff7f00', '#ffff33', '#a65628', '#f781bf', '#999999'],\n Set3: ['#8dd3c7', '#ffffb3', '#bebada', '#fb8072', '#80b1d3', '#fdb462', '#b3de69', '#fccde5', '#d9d9d9', '#bc80bd', '#ccebc5', '#ffed6f'],\n Dark2: ['#1b9e77', '#d95f02', '#7570b3', '#e7298a', '#66a61e', '#e6ab02', '#a6761d', '#666666'],\n Paired: ['#a6cee3', '#1f78b4', '#b2df8a', '#33a02c', '#fb9a99', '#e31a1c', '#fdbf6f', '#ff7f00', '#cab2d6', '#6a3d9a', '#ffff99', '#b15928'],\n Pastel2: ['#b3e2cd', '#fdcdac', '#cbd5e8', '#f4cae4', '#e6f5c9', '#fff2ae', '#f1e2cc', '#cccccc'],\n Pastel1: ['#fbb4ae', '#b3cde3', '#ccebc5', '#decbe4', '#fed9a6', '#ffffcc', '#e5d8bd', '#fddaec', '#f2f2f2']\n};\n\n// add lowercase aliases for case-insensitive matches\nfor (let key of Object.keys(colorbrewer)) {\n colorbrewer[key.toLowerCase()] = colorbrewer[key];\n}\n\nexport default colorbrewer;\n","import chroma from './src/chroma.js';\n\n// feel free to comment out anything to rollup\n// a smaller chroma.js built\n\n// io --> convert colors\nimport './src/io/cmyk/index.js';\nimport './src/io/css/index.js';\nimport './src/io/gl/index.js';\nimport './src/io/hcg/index.js';\nimport './src/io/hex/index.js';\nimport './src/io/hsi/index.js';\nimport './src/io/hsl/index.js';\nimport './src/io/hsv/index.js';\nimport './src/io/lab/index.js';\nimport './src/io/lch/index.js';\nimport './src/io/named/index.js';\nimport './src/io/num/index.js';\nimport './src/io/rgb/index.js';\nimport './src/io/temp/index.js';\nimport './src/io/oklab/index.js';\nimport './src/io/oklch/index.js';\n\n// operators --> modify existing Colors\nimport './src/ops/alpha.js';\nimport './src/ops/clipped.js';\nimport './src/ops/darken.js';\nimport './src/ops/get.js';\nimport './src/ops/luminance.js';\nimport './src/ops/mix.js';\nimport './src/ops/premultiply.js';\nimport './src/ops/saturate.js';\nimport './src/ops/set.js';\nimport './src/ops/shade.js';\n\n// interpolators\nimport './src/interpolator/rgb.js';\nimport './src/interpolator/lrgb.js';\nimport './src/interpolator/lab.js';\nimport './src/interpolator/lch.js';\nimport './src/interpolator/num.js';\nimport './src/interpolator/hcg.js';\nimport './src/interpolator/hsi.js';\nimport './src/interpolator/hsl.js';\nimport './src/interpolator/hsv.js';\nimport './src/interpolator/oklab.js';\nimport './src/interpolator/oklch.js';\n\n// generators -- > create new colors\nimport average from './src/generator/average.js';\nimport bezier from './src/generator/bezier.js';\nimport blend from './src/generator/blend.js';\nimport cubehelix from './src/generator/cubehelix.js';\nimport mix from './src/generator/mix.js';\nimport random from './src/generator/random.js';\nimport scale from './src/generator/scale.js';\n\n// other utility methods\nimport { analyze } from './src/utils/analyze.js';\nimport contrast from './src/utils/contrast.js';\nimport deltaE from './src/utils/delta-e.js';\nimport distance from './src/utils/distance.js';\nimport { limits } from './src/utils/analyze.js';\nimport valid from './src/utils/valid.js';\nimport input from './src/io/input.js';\n\n// scale\nimport scales from './src/utils/scales.js';\n\n// colors\nimport colors from './src/colors/w3cx11.js';\nimport brewer from './src/colors/colorbrewer.js';\n\nObject.assign(chroma, {\n average,\n bezier,\n blend,\n cubehelix,\n mix,\n interpolate: mix,\n random,\n scale,\n analyze,\n contrast,\n deltaE,\n distance,\n limits,\n valid,\n scales,\n input,\n colors,\n brewer\n});\n\nexport default chroma;\n","//\n// interpolates between a set of colors uzing a bezier spline\n//\n\n// @requires utils lab\nimport Color from '../Color.js';\nimport '../io/lab/index.js';\nimport scale from './scale.js';\n\n// nth row of the pascal triangle\nconst binom_row = function (n) {\n let row = [1, 1];\n for (let i = 1; i < n; i++) {\n let newrow = [1];\n for (let j = 1; j <= row.length; j++) {\n newrow[j] = (row[j] || 0) + row[j - 1];\n }\n row = newrow;\n }\n return row;\n};\n\nconst bezier = function (colors) {\n let I, lab0, lab1, lab2;\n colors = colors.map((c) => new Color(c));\n if (colors.length === 2) {\n // linear interpolation\n [lab0, lab1] = colors.map((c) => c.lab());\n I = function (t) {\n const lab = [0, 1, 2].map((i) => lab0[i] + t * (lab1[i] - lab0[i]));\n return new Color(lab, 'lab');\n };\n } else if (colors.length === 3) {\n // quadratic bezier interpolation\n [lab0, lab1, lab2] = colors.map((c) => c.lab());\n I = function (t) {\n const lab = [0, 1, 2].map(\n (i) =>\n (1 - t) * (1 - t) * lab0[i] +\n 2 * (1 - t) * t * lab1[i] +\n t * t * lab2[i]\n );\n return new Color(lab, 'lab');\n };\n } else if (colors.length === 4) {\n // cubic bezier interpolation\n let lab3;\n [lab0, lab1, lab2, lab3] = colors.map((c) => c.lab());\n I = function (t) {\n const lab = [0, 1, 2].map(\n (i) =>\n (1 - t) * (1 - t) * (1 - t) * lab0[i] +\n 3 * (1 - t) * (1 - t) * t * lab1[i] +\n 3 * (1 - t) * t * t * lab2[i] +\n t * t * t * lab3[i]\n );\n return new Color(lab, 'lab');\n };\n } else if (colors.length >= 5) {\n // general case (degree n bezier)\n let labs, row, n;\n labs = colors.map((c) => c.lab());\n n = colors.length - 1;\n row = binom_row(n);\n I = function (t) {\n const u = 1 - t;\n const lab = [0, 1, 2].map((i) =>\n labs.reduce(\n (sum, el, j) =>\n sum + row[j] * u ** (n - j) * t ** j * el[i],\n 0\n )\n );\n return new Color(lab, 'lab');\n };\n } else {\n throw new RangeError('No point in running bezier with only one color.');\n }\n return I;\n};\n\nexport default (colors) => {\n const f = bezier(colors);\n f.scale = () => scale(f);\n return f;\n};\n","import Color from '../Color.js';\nimport '../ops/luminance.js';\n\nexport default (a, b) => {\n // WCAG contrast ratio\n // see http://www.w3.org/TR/2008/REC-WCAG20-20081211/#contrast-ratiodef\n a = new Color(a);\n b = new Color(b);\n const l1 = a.luminance();\n const l2 = b.luminance();\n return l1 > l2 ? (l1 + 0.05) / (l2 + 0.05) : (l2 + 0.05) / (l1 + 0.05);\n};\n","import Color from '../Color.js';\n\n// simple Euclidean distance\nexport default function (a, b, mode = 'lab') {\n // Delta E (CIE 1976)\n // see http://www.brucelindbloom.com/index.html?Equations.html\n a = new Color(a);\n b = new Color(b);\n const l1 = a.get(mode);\n const l2 = b.get(mode);\n let sum_sq = 0;\n for (let i in l1) {\n const d = (l1[i] || 0) - (l2[i] || 0);\n sum_sq += d * d;\n }\n return Math.sqrt(sum_sq);\n}\n","import chroma from 'chroma-js';\r\n\r\nexport class ChromaColorScale extends HTMLElement {\r\n static get observedAttributes() {\r\n return ['min', 'max']; // 声明需要监听的min和max属性\r\n }\r\n attributeChangedCallback(name, oldValue, newValue) {\r\n if (oldValue === newValue) return;\r\n\r\n let numValue = Number(newValue);\r\n if (isNaN(numValue)) return;\r\n\r\n switch (name) {\r\n case 'min':\r\n // 确保min小于当前max\r\n if (numValue >= this.state.max) {\r\n this.showErrorMessage('最小值必须小于最大值');\r\n return;\r\n }\r\n this.state.min = numValue;\r\n this.minInput.value = numValue;\r\n break;\r\n case 'max':\r\n // 确保max大于当前min\r\n if (numValue <= this.state.min) {\r\n this.showErrorMessage('最大值必须大于最小值');\r\n return;\r\n }\r\n this.state.max = numValue;\r\n this.maxInput.value = numValue;\r\n break;\r\n }\r\n\r\n // 重新计算步长并渲染色条\r\n this.state.step = this.calculateOptimalStep(this.state.min, this.state.max);\r\n this.renderColorBarPreview();\r\n this.renderPanelColorbar();\r\n }\r\n\r\n constructor() {\r\n super();\r\n const shadow = this.attachShadow({ mode: 'open' });\r\n\r\n // 添加自定义消息提示的样式\r\n const messageStyle = `\r\n <style>\r\n /* 仿Ant Design的消息提示样式 */\r\n .message-container {\r\n position: fixed;\r\n top: 24px;\r\n left: 50%;\r\n transform: translateX(-50%);\r\n z-index: 999999;\r\n pointer-events: none;\r\n }\r\n .message-item {\r\n padding: 8px 16px;\r\n margin-bottom: 8px;\r\n border-radius: 4px;\r\n background: #fff;\r\n box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 9px 28px 8px rgba(0, 0, 0, 0.05);\r\n display: flex;\r\n align-items: center;\r\n min-width: 300px;\r\n max-width: 500px;\r\n animation: messageFadeIn 0.3s ease-in-out;\r\n }\r\n .message-error {\r\n border-left: 4px solid #ff4d4f;\r\n }\r\n .message-success {\r\n border-left: 4px solid #52c41a;\r\n }\r\n .message-success .message-icon {\r\n color: #52c41a;\r\n }\r\n .message-icon {\r\n margin-right: 8px;\r\n color: #ff4d4f;\r\n font-size: 16px;\r\n }\r\n .message-content {\r\n color: #444;\r\n font-size: 14px;\r\n line-height: 1.5;\r\n }\r\n @keyframes messageFadeIn {\r\n from {\r\n opacity: 0;\r\n transform: translateY(-10px);\r\n }\r\n to {\r\n opacity: 1;\r\n transform: translateY(0);\r\n }\r\n }\r\n @keyframes messageFadeOut {\r\n from {\r\n opacity: 1;\r\n transform: translateY(0);\r\n }\r\n to {\r\n opacity: 0;\r\n transform: translateY(-10px);\r\n }\r\n }\r\n /* 新增:Antd风格ColorPicker样式 */\r\n .color-picker-modal {\r\n position: fixed;\r\n z-index: 99999;\r\n background: #fff;\r\n border-radius: 8px;\r\n box-shadow: 0 10px 30px rgba(0, 0, 0, 0.15);\r\n padding: 16px;\r\n width: 280px;\r\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\r\n }\r\n .color-picker-header {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n margin-bottom: 12px;\r\n }\r\n .color-picker-title {\r\n font-size: 14px;\r\n color: #1f2937;\r\n font-weight: 500;\r\n }\r\n .color-picker-close {\r\n width: 24px;\r\n height: 24px;\r\n border-radius: 50%;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n cursor: pointer;\r\n color: #6b7280;\r\n transition: all 0.2s;\r\n }\r\n .color-picker-close:hover {\r\n background: #f3f4f6;\r\n color: #1f2937;\r\n }\r\n .color-picker-body {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 12px;\r\n }\r\n .color-picker-spectrum {\r\n width: 100%;\r\n height: 160px;\r\n position: relative;\r\n border-radius: 4px;\r\n overflow: hidden;\r\n cursor: crosshair;\r\n }\r\n .color-picker-spectrum-gradient {\r\n width: 100%;\r\n height: 100%;\r\n background: linear-gradient(to right, #fff, rgba(255,255,255,0)),\r\n linear-gradient(to top, #000, rgba(0,0,0,0));\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n }\r\n .color-picker-spectrum-handle {\r\n position: absolute;\r\n width: 16px;\r\n height: 16px;\r\n border-radius: 50%;\r\n border: 2px solid #fff;\r\n box-shadow: 0 0 0 1px rgba(0,0,0,0.2);\r\n transform: translate(-8px, -8px);\r\n z-index: 10;\r\n }\r\n .color-picker-hue {\r\n width: 100%;\r\n height: 12px;\r\n position: relative;\r\n border-radius: 6px;\r\n overflow: hidden;\r\n cursor: pointer;\r\n background: linear-gradient(to right, \r\n #f00 0%, #ff0 17%, #0f0 33%, \r\n #0ff 50%, #00f 67%, #f0f 83%, #f00 100%);\r\n }\r\n .color-picker-hue-handle {\r\n position: absolute;\r\n top: 0;\r\n bottom: 0;\r\n width: 4px;\r\n background: #fff;\r\n box-shadow: 0 0 0 1px rgba(0,0,0,0.2);\r\n transform: translateX(-2px);\r\n z-index: 10;\r\n }\r\n .color-picker-input {\r\n display: flex;\r\n gap: 8px;\r\n align-items: center;\r\n }\r\n .color-picker-input input {\r\n flex: 1;\r\n padding: 6px 8px;\r\n border: 1px solid #d1d5db;\r\n border-radius: 4px;\r\n font-size: 13px;\r\n color: #1f2937;\r\n outline: none;\r\n transition: border-color 0.2s;\r\n }\r\n .color-picker-input input:focus {\r\n border-color: #3b82f6;\r\n box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.1);\r\n }\r\n .color-picker-preview {\r\n width: 24px;\r\n height: 24px;\r\n border-radius: 4px;\r\n border: 1px solid #d1d5db;\r\n }\r\n .color-picker-footer {\r\n display: flex;\r\n justify-content: flex-end;\r\n gap: 8px;\r\n margin-top: 8px;\r\n }\r\n .color-picker-btn {\r\n padding: 6px 12px;\r\n border-radius: 4px;\r\n font-size: 13px;\r\n font-weight: 500;\r\n cursor: pointer;\r\n transition: all 0.2s;\r\n }\r\n .color-picker-btn-cancel {\r\n border: 1px solid #d1d5db;\r\n background: #fff;\r\n color: #374151;\r\n }\r\n .color-picker-btn-cancel:hover {\r\n background: #f9fafb;\r\n border-color: #b3b9c6;\r\n }\r\n .color-picker-btn-confirm {\r\n border: 1px solid #3b82f6;\r\n background: #3b82f6;\r\n color: #fff;\r\n }\r\n .color-picker-btn-confirm:hover {\r\n background: #2563eb;\r\n border-color: #2563eb;\r\n }\r\n </style>\r\n `;\r\n\r\n shadow.innerHTML = messageStyle + `\r\n <style>\r\n * {\r\n margin: 0;\r\n padding: 0;\r\n box-sizing: border-box;\r\n overflow: visible !important;\r\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif;\r\n }\r\n :host { \r\n display: block; \r\n position: fixed; \r\n top: 0;\r\n right: 0;\r\n bottom: 0;\r\n left: auto;\r\n width: 150px; /* 适度加宽主面板 */\r\n height: 100vh !important; \r\n margin: 0; \r\n padding: 0; \r\n overflow: hidden !important; \r\n box-sizing: border-box;\r\n z-index: 999; \r\n }\r\n .main-container { \r\n position: absolute; \r\n top: 0; \r\n right: 0; \r\n height: 100vh; \r\n width: 100%;\r\n display: flex;\r\n flex-direction: column;\r\n box-sizing: border-box;\r\n overflow: hidden;\r\n padding: 0px 0; /* 适度增加内边距 */\r\n }\r\n .text-sm { \r\n font-size: 12px; /* 调整为适中大小 */\r\n color: #444; \r\n line-height: 1.4; /* 适度增加行高 */\r\n }\r\n .btn { \r\n padding: 6px 12px; /* 适度增加按钮内边距 */\r\n border: 1px solid #ddd; \r\n border-radius: 6px; \r\n cursor: pointer; \r\n background: #f8f9fa; \r\n font-size: 12px; /* 调整为适中大小 */\r\n color: #333;\r\n transition: all 0.2s ease;\r\n font-weight: 500;\r\n }\r\n .btn:hover { \r\n background: #e9ecef; \r\n border-color: #ccc;\r\n box-shadow: 0 1px 3px rgba(0,0,0,0.1);\r\n }\r\n .btn:active {\r\n background: #dee2e6;\r\n box-shadow: inset 0 1px 2px rgba(0,0,0,0.1);\r\n }\r\n .input-sm { \r\n width: 55px; /* 适度加宽 */\r\n padding: 6px 8px; /* 适度增加内边距 */\r\n border: 1px solid #ddd; \r\n border-radius: 6px; \r\n font-size: 12px; /* 调整为适中大小 */\r\n color: #333;\r\n transition: border-color 0.2s ease, box-shadow 0.2s ease;\r\n }\r\n .input-md { \r\n width: 75px; /* 适度加宽 */\r\n padding: 6px 8px; /* 适度增加内边距 */\r\n border: 1px solid #ddd; \r\n border-radius: 6px; \r\n font-size: 12px; /* 调整为适中大小 */\r\n color: #333;\r\n transition: border-color 0.2s ease, box-shadow 0.2s ease;\r\n }\r\n .input-sm:focus, .input-md:focus {\r\n outline: none;\r\n border-color: #4d90fe;\r\n box-shadow: 0 0 0 3px rgba(77, 144, 254, 0.1);\r\n }\r\n .select-sm { \r\n padding: 6px 8px; /* 适度增加内边距 */\r\n border: 1px solid #ddd; \r\n border-radius: 6px; \r\n font-size: 12px; /* 调整为适中大小 */\r\n color: #333;\r\n transition: border-color 0.2s ease;\r\n }\r\n .select-sm:focus {\r\n outline: none;\r\n border-color: #4d90fe;\r\n }\r\n .checkbox { \r\n vertical-align: middle; \r\n margin: 0 5px; /* 适度增加间距 */\r\n width: 15px; /* 适度加大 */\r\n height: 15px; /* 适度加大 */\r\n border-radius: 4px;\r\n cursor: pointer;\r\n }\r\n .radio { \r\n vertical-align: middle; \r\n margin: 0 5px; /* 适度增加间距 */\r\n width: 15px; /* 适度加大 */\r\n height: 15px; /* 适度加大 */\r\n cursor: pointer;\r\n }\r\n .color-picker { \r\n width: 38px; /* 适度加宽 */\r\n height: 28px; /* 适度加高 */\r\n padding: 0; \r\n border: 1px solid #ddd; \r\n cursor: pointer; \r\n border-radius: 6px;\r\n }\r\n\r\n /* 色条预览区 - 核心调整 */\r\n .preview-container { \r\n display: flex; \r\n align-items: flex-start; \r\n height: 100%; \r\n box-sizing: border-box; \r\n overflow: hidden;\r\n padding: 0 10px; /* 适度增加内边距 */\r\n }\r\n .color-bar { \r\n width: 65px; /* 适度加宽 */\r\n height: 100%; \r\n border: 1px solid #ddd; \r\n border-radius: 8px;\r\n box-sizing: border-box; \r\n box-shadow: 0 1px 3px rgba(0,0,0,0.1);\r\n }\r\n .value-labels { \r\n margin-left: 10px; /* 适度增加间距 */\r\n height: calc(100% - 20px); \r\n position: relative; \r\n width: 65px; /* 适度加宽标签容器 */\r\n }\r\n .label-item { \r\n position: absolute; \r\n font-size: 12px; /* 调整为适中大小 */\r\n color: #333; \r\n white-space: nowrap; \r\n transform: translateY(-50%);\r\n left: 0;\r\n right: 0;\r\n text-align: left;\r\n max-height: 22px;\r\n overflow: visible !important;\r\n line-height: 1.4; /* 适度增加行高 */\r\n font-weight: 500;\r\n }\r\n\r\n /* 设置面板 */\r\n .setting-panel {\r\n display: none;\r\n position: fixed; \r\n top: 20px;\r\n right: 160px; /* 适配主面板宽度调整 */\r\n background: white;\r\n border: 1px solid #ddd;\r\n border-radius: 12px;\r\n width: 540px; /* 适度加宽面板 */\r\n box-shadow: 0 4px 20px rgba(0,0,0,0.15);\r\n z-index: 10000; \r\n overflow: hidden;\r\n }\r\n .setting-panel.active { display: block; }\r\n\r\n .panel-header {\r\n padding: 10px 15px; /* 适度增加内边距 */\r\n background: #f8f9fa;\r\n border-bottom: 1px solid #eee;\r\n cursor: move;\r\n user-select: none;\r\n font-size: 14px; /* 调整为适中大小 */\r\n font-weight: 600;\r\n color: #333;\r\n border-radius: 12px 12px 0 0;\r\n }\r\n .panel-header:hover {\r\n background: #e9ecef;\r\n }\r\n\r\n .panel-content { display: flex; }\r\n\r\n .left-settings {\r\n flex: 1;\r\n padding: 15px; /* 适度增加内边距 */\r\n border-right: 1px solid #eee;\r\n }\r\n\r\n .right-colorbar {\r\n width: 215px; /* 适度加宽 */\r\n padding: 15px; /* 适度增加内边距 */\r\n }\r\n\r\n .section-title {\r\n font-size: 13px; /* 调整为适中大小 */\r\n font-weight: 600;\r\n margin: 15px 0 8px; /* 适度增加间距 */\r\n color: #222;\r\n padding-bottom: 4px; /* 适度增加下划线间距 */\r\n border-bottom: 1px solid #eee;\r\n }\r\n .section-title:first-child { \r\n margin-top: 0; \r\n margin-bottom: 12px;\r\n }\r\n\r\n .display-options { margin-bottom: 15px; font-size: 14px; }\r\n .display-option { margin: 8px 0; /* 适度增加间距 */ display: flex; align-items: center; gap: 8px; /* 适度增加间隙 */ }\r\n .display-option input[type=\"radio\"] { margin-left: 0; }\r\n\r\n .range-settings { margin: 15px 0; font-size: 14px; }\r\n .range-row { margin: 8px 0; /* 适度增加间距 */ display: flex; align-items: center; gap: 8px; /* 适度增加间隙 */ }\r\n .range-row label { text-align: right; font-weight: 500; color: #444; font-size: 14px; /* 调整为适中大小 */ }\r\n /* 新增:个数/增量选项样式 */\r\n .range-mode-option { margin: 8px 0; /* 适度增加间距 */ display: flex; align-items: center; gap: 8px; /* 适度增加间隙 */ }\r\n .range-mode-option input[type=\"radio\"] { margin-left: 0; }\r\n .input-disabled { \r\n background-color: #f8f9fa; \r\n cursor: not-allowed; \r\n border-color: #ddd; \r\n color: #888;\r\n }\r\n\r\n .label-settings { margin-bottom: 15px; font-size: 14px; }\r\n .label-option { margin: 8px 0; /* 适度增加间距 */ display: flex; align-items: center; gap: 8px; /* 适度增加间隙 */ }\r\n .precision-control { display: inline-flex; align-items: center; gap: 6px; /* 适度增加间隙 */ }\r\n\r\n .color-library { margin-bottom: 15px; font-size: 14px; }\r\n /* 自定义选择器样式 - 仅显示色条 */\r\n .custom-select-display {\r\n width: 100%;\r\n height: 32px; /* 适度加高 */\r\n border: 1px solid #ddd; \r\n border-radius: 8px;\r\n cursor: pointer;\r\n position: relative;\r\n overflow: hidden;\r\n background: white;\r\n transition: border-color 0.2s ease, box-shadow 0.2s ease;\r\n }\r\n .custom-select-display:hover {\r\n border-color: #ccc;\r\n box-shadow: 0 1px 3px rgba(0,0,0,0.1);\r\n }\r\n /* 选中色条预览 - 占满整个显示容器 */\r\n .selected-color-bar {\r\n width: 100%;\r\n height: 100%;\r\n }\r\n /* 下拉箭头样式 */\r\n .select-arrow {\r\n position: absolute;\r\n right: 12px; /* 适度调整位置 */\r\n top: 50%;\r\n transform: translateY(-50%);\r\n width: 0;\r\n height: 0;\r\n border-left: 6px solid transparent; /* 适度加大箭头 */\r\n border-right: 6px solid transparent; /* 适度加大箭头 */\r\n border-top: 6px solid #666; /* 适度加大箭头 */\r\n pointer-events: none;\r\n }\r\n /* 隐藏原生select */\r\n #colorLibrary {\r\n display: none !important;\r\n }\r\n /* 色库下拉框核心样式 */\r\n #libraryOptions {\r\n width: 100% !important;\r\n min-width: 250px; /* 适度加宽 */\r\n box-sizing: border-box;\r\n border-radius: 0 0 8px 8px;\r\n overflow: hidden;\r\n box-shadow: 0 4px 12px rgba(0,0,0,0.1);\r\n }\r\n .library-option {\r\n display: flex;\r\n align-items: center;\r\n padding: 8px 12px; /* 适度增加内边距 */\r\n gap: 10px; /* 适度增加间隙 */\r\n width: 100%;\r\n box-sizing: border-box;\r\n transition: background-color 0.2s ease;\r\n border-bottom: 1px solid #f0f0f0;\r\n }\r\n .library-option:last-child {\r\n border-bottom: none;\r\n }\r\n .option-color-bar {\r\n width: 190px; /* 适度加宽 */\r\n height: 22px; /* 适度加高 */\r\n border: 1px solid #ddd; \r\n border-radius: 4px;\r\n flex-shrink: 0;\r\n }\r\n .option-text {\r\n font-size: 12px; /* 保持原有大小 */\r\n color: #333;\r\n flex: 1;\r\n font-weight: 500;\r\n /* 新增省略显示样式 - 关键修改:增加 !important 强制生效 */\r\n white-space: nowrap !important; /* 强制不换行 */\r\n overflow: hidden !important; /* 隐藏超出内容 */\r\n text-overflow: ellipsis !important; /* 超出部分显示... */\r\n max-width: 80px !important; /* 限制最大宽度,可根据需要调整 */\r\n /* 悬浮提示相关 */\r\n position: relative;\r\n }\r\n\r\n .library-actions { display: flex; gap: 8px; /* 适度增加间隙 */ margin: 10px 0; }\r\n\r\n .bottom-buttons {\r\n display: flex;\r\n justify-content: space-between;\r\n padding: 10px 15px; /* 适度增加内边距 */\r\n border-top: 1px solid #eee;\r\n background: #f8f9fa;\r\n border-radius: 0 0 12px 12px;\r\n }\r\n .left-buttons { display: flex; gap: 8px; /* 适度增加间隙 */ }\r\n .right-buttons { display: flex; gap: 8px; /* 适度增加间隙 */ }\r\n\r\n /* 面板内色条样式 */\r\n .colorbar-preview {\r\n width: 85px; /* 适度加宽 */\r\n height: 490px; \r\n margin: 0 auto;\r\n }\r\n .colorbar-labels {\r\n margin-left: 10px; /* 适度增加间距 */\r\n height: 490px; \r\n position: relative; \r\n width: 65px; /* 适度加宽 */\r\n }\r\n .colorbar-label {\r\n position: absolute;\r\n font-size: 12px; /* 调整为适中大小 */\r\n color: #333;\r\n transform: translateY(-50%);\r\n white-space: nowrap; \r\n line-height: 1.4; /* 适度增加行高 */\r\n font-weight: 500;\r\n }\r\n /* 隐藏数字左侧正方形 */\r\n .color-marker {\r\n display: none; \r\n width: 16px; \r\n height: 16px; \r\n border: 1px solid #666;\r\n left: -24px; \r\n transform: translateY(-50%);\r\n box-sizing: border-box;\r\n border-radius: 0;\r\n cursor: ns-resize;\r\n z-index: 10;\r\n }\r\n .color-marker.dragging {\r\n border-width: 2px;\r\n border-color: #0066cc;\r\n box-shadow: 0 0 5px rgba(0, 102, 204, 0.8);\r\n }\r\n .colorbar-container { \r\n display: flex; \r\n justify-content: flex-start; \r\n margin: 10px 0 10px 12px; /* 适度调整间距 */\r\n }\r\n\r\n /* 移除了colorbar-actions相关样式 */\r\n </style>\r\n\r\n <div class=\"main-container\">\r\n <div class=\"preview-container\" id=\"colorBarPreview\">\r\n <canvas class=\"color-bar\" id=\"previewCanvas\"></canvas>\r\n <div class=\"value-labels\" id=\"valueLabels\"></div>\r\n </div>\r\n\r\n <div class=\"setting-panel\" id=\"settingPanel\">\r\n <div class=\"panel-header\" id=\"panelHandle\">色标设置</div>\r\n <div class=\"panel-content\">\r\n <div class=\"left-settings\">\r\n <div class=\"section-title\">色块</div>\r\n <div class=\"display-options\">\r\n <div class=\"display-option\">\r\n <input type=\"radio\" id=\"continuous\" name=\"displayMode\" class=\"radio\" checked>\r\n <label for=\"continuous\">连续显示</label>\r\n </div>\r\n <div class=\"display-option\">\r\n <input type=\"radio\" id=\"discrete\" name=\"displayMode\" class=\"radio\">\r\n <label for=\"discrete\">离散显示</label>\r\n <span class=\"text-sm\">数量由范围设置决定</span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"section-title\">范围</div>\r\n <div class=\"range-settings\">\r\n <div class=\"range-row\">\r\n <label>最小值:</label>\r\n <input type=\"number\" id=\"minVal\" value=\"0\" class=\"input-md\">\r\n </div>\r\n <div class=\"range-row\">\r\n <label>最大值:</label>\r\n <input type=\"number\" id=\"maxVal\" value=\"60000\" class=\"input-md\">\r\n <input type=\"button\" value=\"设置\" class=\"btn\" id=\"setRange\">\r\n </div>\r\n <div class=\"range-mode-option\">\r\n <input type=\"radio\" id=\"countMode\" name=\"rangeMode\" class=\"radio\" checked>\r\n <label for=\"countMode\">个数:</label>\r\n <input type=\"number\" id=\"rangeCount\" value=\"16\" class=\"input-md\" min=\"2\">\r\n </div>\r\n <div class=\"range-mode-option\">\r\n <input type=\"radio\" id=\"stepMode\" name=\"rangeMode\" class=\"radio\">\r\n <label for=\"stepMode\">增量:</label>\r\n <input type=\"number\" id=\"rangeStep\" value=\"3750\" class=\"input-md\" min=\"1\" disabled>\r\n </div>\r\n </div>\r\n\r\n <div class=\"section-title\">标注</div>\r\n <div class=\"label-settings\">\r\n <div class=\"label-option\">\r\n <input type=\"radio\" id=\"integer\" name=\"labelType\" class=\"radio\" checked>\r\n <label for=\"integer\">整数</label>\r\n </div>\r\n <div class=\"label-option\">\r\n <input type=\"radio\" id=\"float\" name=\"labelType\" class=\"radio\">\r\n <label for=\"float\">浮点数</label>\r\n <div class=\"precision-control\">\r\n <label>精度</label>\r\n <input type=\"number\" id=\"precision\" class=\"input-sm\" value=\"1\" min=\"1\" max=\"10\">\r\n </div>\r\n <label>\r\n <input type=\"checkbox\" class=\"checkbox\" id=\"scientific\"> 科学计数\r\n </label>\r\n </div>\r\n </div>\r\n\r\n <div class=\"section-title\">色库</div>\r\n <div class=\"color-library\">\r\n <div id=\"librarySelectContainer\" style=\"position: relative; width: 100%;\">\r\n <div class=\"custom-select-display\" id=\"customSelectDisplay\">\r\n <div class=\"selected-color-bar\" id=\"selectedColorBar\"></div>\r\n <div class=\"select-arrow\"></div>\r\n </div>\r\n <select id=\"colorLibrary\">\r\n <option value=\"default\">Default</option>\r\n <option value=\"BlkWhiClt\">BlkWhiClt</option>\r\n <option value=\"BlkWhiYlw\">BlkWhiYlw</option>\r\n <option value=\"BluWhiClt\">BluWhiClt</option>\r\n </select>\r\n <div id=\"libraryOptions\" style=\"position: absolute; top: 100%; left: 0; right: 0; background: white; border: 1px solid #ccc; border-top: none; border-radius: 0 0 3px 3px; box-shadow: 0 2px 4px rgba(0,0,0,0.1); z-index: 10001; display: none;\">\r\n <div class=\"library-option\" data-value=\"default\">\r\n <div class=\"option-color-bar\" id=\"defaultColorBar\"></div>\r\n <span class=\"option-text\" title=\"Default\">Default</span>\r\n </div>\r\n <div class=\"library-option\" data-value=\"BlkWhiClt\">\r\n <div class=\"option-color-bar\" id=\"BlkWhiCltColorBar\"></div>\r\n <span class=\"option-text\" title=\"BlkWhiClt\">BlkWhiClt</span>\r\n </div>\r\n <div class=\"library-option\" data-value=\"BlkWhiYlw\">\r\n <div class=\"option-color-bar\" id=\"BlkWhiYlwColorBar\"></div>\r\n <span class=\"option-text\" title=\"BlkWhiYlw\">BlkWhiYlw</span>\r\n </div>\r\n <div class=\"library-option\" data-value=\"BluWhiClt\">\r\n <div class=\"option-color-bar\" id=\"BluWhiCltColorBar\"></div>\r\n <span class=\"option-text\" title=\"BluWhiClt\">BluWhiClt</span>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"library-actions\">\r\n <input type=\"button\" value=\"导入\" class=\"btn\" id=\"importLib\">\r\n <input type=\"button\" value=\"保存\" class=\"btn\" id=\"saveLib\">\r\n </div>\r\n <!-- 移除了添加到色库的复选框 -->\r\n </div>\r\n </div>\r\n\r\n <div class=\"right-colorbar\">\r\n <div class=\"colorbar-container\">\r\n <div class=\"colorbar-labels\" id=\"colorbarLabels\"></div>\r\n <canvas class=\"colorbar-preview\" id=\"panelColorbar\"></canvas>\r\n </div>\r\n \r\n <!-- 移除了colorbar-actions按钮组 -->\r\n \r\n </div>\r\n </div>\r\n\r\n <div class=\"bottom-buttons\">\r\n <div class=\"left-buttons\">\r\n <input type=\"button\" value=\"缺省\" class=\"btn\" id=\"resetDefault\">\r\n </div>\r\n <div class=\"right-buttons\">\r\n <input type=\"button\" value=\"确定\" class=\"btn\" id=\"confirm\">\r\n <input type=\"button\" value=\"取消\" class=\"btn\" id=\"cancel\">\r\n <input type=\"button\" value=\"应用\" class=\"btn\" id=\"apply\">\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- 消息提示容器 -->\r\n <div class=\"message-container\" id=\"messageContainer\"></div>\r\n `;\r\n\r\n // 获取DOM元素\r\n this.colorBarPreview = shadow.getElementById('colorBarPreview');\r\n this.previewCanvas = shadow.getElementById('previewCanvas');\r\n this.valueLabels = shadow.getElementById('valueLabels');\r\n this.settingPanel = shadow.getElementById('settingPanel');\r\n this.panelHandle = shadow.getElementById('panelHandle');\r\n this.minInput = shadow.getElementById('minVal');\r\n this.maxInput = shadow.getElementById('maxVal');\r\n this.setRangeBtn = shadow.getElementById('setRange');\r\n this.displayModeRadios = shadow.querySelectorAll('input[name=\"displayMode\"]');\r\n this.labelTypeRadios = shadow.querySelectorAll('input[name=\"labelType\"]');\r\n this.precisionInput = shadow.getElementById('precision');\r\n this.scientificCheckbox = shadow.getElementById('scientific');\r\n this.colorLibrarySelect = shadow.getElementById('colorLibrary');\r\n // 移除了addToLibCheckbox的获取\r\n this.colorbarLabels = shadow.getElementById('colorbarLabels');\r\n this.panelColorbar = shadow.getElementById('panelColorbar');\r\n this.resetBtn = shadow.getElementById('resetDefault');\r\n this.confirmBtn = shadow.getElementById('confirm');\r\n this.cancelBtn = shadow.getElementById('cancel');\r\n this.applyBtn = shadow.getElementById('apply');\r\n\r\n // 个数/增量相关元素\r\n this.rangeModeRadios = shadow.querySelectorAll('input[name=\"rangeMode\"]');\r\n this.rangeCountInput = shadow.getElementById('rangeCount');\r\n this.rangeStepInput = shadow.getElementById('rangeStep');\r\n\r\n // 色库下拉框自定义元素\r\n this.librarySelectContainer = shadow.getElementById('librarySelectContainer');\r\n this.libraryOptions = shadow.getElementById('libraryOptions');\r\n this.libraryOptionItems = shadow.querySelectorAll('.library-option');\r\n this.customSelectDisplay = shadow.getElementById('customSelectDisplay');\r\n this.selectedColorBar = shadow.getElementById('selectedColorBar');\r\n\r\n // 色库颜色条画布元素\r\n this.defaultColorBar = shadow.getElementById('defaultColorBar');\r\n this.BlkWhiCltColorBar = shadow.getElementById('BlkWhiCltColorBar');\r\n this.BlkWhiYlwColorBar = shadow.getElementById('BlkWhiYlwColorBar');\r\n this.BluWhiCltColorBar = shadow.getElementById('BluWhiCltColorBar');\r\n\r\n // 消息提示容器\r\n this.messageContainer = shadow.getElementById('messageContainer');\r\n\r\n // 初始状态\r\n const initialMin = this.hasAttribute('min') ? Number(this.getAttribute('min')) : 0;\r\n const initialMax = this.hasAttribute('max') ? Number(this.getAttribute('max')) : 60000;\r\n\r\n // 增加数值合法性校验\r\n this.initialMin = isNaN(initialMin) || initialMin < 0 ? 0 : initialMin;\r\n this.initialMax = isNaN(initialMax) || initialMax <= this.initialMin ? 60000 : initialMax;\r\n const initialCount = 16;\r\n const initialStep = (initialMax - initialMin) / initialCount;\r\n\r\n this.state = {\r\n min: this.initialMin,\r\n max: this.initialMax,\r\n start: 0,\r\n step: 4000,\r\n displayMode: 'continuous',\r\n labelType: 'integer',\r\n precision: 1,\r\n scientific: false,\r\n colorLibrary: 'default',\r\n // 移除了addToLib状态变量\r\n rangeMode: 'count',\r\n rangeCount: initialCount,\r\n rangeStep: initialStep,\r\n // 修改:originalStopRatios 改为和default色库一致的比例\r\n originalStopRatios: [0, 0.2, 0.4, 0.6, 0.8, 1],\r\n // 修改:stops的value基于min/max和比例计算,和default色库一致\r\n stops: [\r\n { value: initialMin + (initialMax - initialMin) * 0, color: '#0000FF' },\r\n { value: initialMin + (initialMax - initialMin) * 0.2, color: '#0080FF' },\r\n { value: initialMin + (initialMax - initialMin) * 0.4, color: '#00FFFF' },\r\n { value: initialMin + (initialMax - initialMin) * 0.6, color: '#00FF00' },\r\n { value: initialMin + (initialMax - initialMin) * 0.8, color: '#FFFF00' },\r\n { value: initialMin + (initialMax - initialMin) * 1, color: '#FF0000' }\r\n ],\r\n panelVisible: false,\r\n originalState: null,\r\n panelPosition: { top: 20, right: 160 } // 适配新的面板宽度\r\n };\r\n\r\n // 拖拽状态管理\r\n this.dragState = {\r\n isDragging: false,\r\n draggingStopIndex: -1,\r\n dragStartY: 0,\r\n dragStartValue: 0,\r\n canvasRect: null\r\n };\r\n\r\n // ColorPicker状态管理\r\n this.colorPickerState = {\r\n isOpen: false,\r\n targetStop: null, // 选中的色块\r\n hue: 0, // 色相 0-360\r\n saturation: 1, // 饱和度 0-1\r\n lightness: 0.5, // 亮度 0-1\r\n pickerElement: null, // 颜色选择器DOM\r\n isDraggingHue: false, // 是否拖拽色相条\r\n isDraggingSpectrum: false // 是否拖拽色域\r\n };\r\n\r\n // 初始化色库下拉框的颜色条\r\n this.initLibraryColorBars();\r\n this.renderSelectedColorBar('default');\r\n\r\n // ========== 新增:从localStorage加载保存的自定义色库 ==========\r\n this.loadCustomLibsFromStorage();\r\n\r\n // 绑定事件\r\n this.bindEvents();\r\n // 初始化渲染\r\n this.saveOriginalState();\r\n this.rangeStepInput.value = this.state.rangeStep;\r\n this.renderColorBarPreview();\r\n this.renderPanelColorbar();\r\n }\r\n\r\n // 自定义错误消息提示方法(仿Ant Design message.error)\r\n showErrorMessage(content) {\r\n // 创建消息元素\r\n const messageItem = document.createElement('div');\r\n messageItem.className = 'message-item message-error';\r\n messageItem.innerHTML = `\r\n <span class=\"message-icon\">❌</span>\r\n <span class=\"message-content\">${content}</span>\r\n `;\r\n\r\n // 添加到容器\r\n this.messageContainer.appendChild(messageItem);\r\n\r\n // 3秒后自动消失\r\n setTimeout(() => {\r\n messageItem.style.animation = 'messageFadeOut 0.3s ease-in-out';\r\n setTimeout(() => {\r\n this.messageContainer.removeChild(messageItem);\r\n }, 300);\r\n }, 3000);\r\n }\r\n // 自定义成功消息提示方法(仿Ant Design message.success)\r\n showSuccessMessage(content) {\r\n // 创建消息元素\r\n const messageItem = document.createElement('div');\r\n messageItem.className = 'message-item message-success';\r\n messageItem.innerHTML = `\r\n <span class=\"message-icon\">✓</span>\r\n <span class=\"message-content\">${content}</span>\r\n `;\r\n\r\n // 添加到容器\r\n this.messageContainer.appendChild(messageItem);\r\n\r\n // 3秒后自动消失\r\n setTimeout(() => {\r\n messageItem.style.animation = 'messageFadeOut 0.3s ease-in-out';\r\n setTimeout(() => {\r\n this.messageContainer.removeChild(messageItem);\r\n }, 300);\r\n }, 3000);\r\n }\r\n\r\n // 渲染选中的色条\r\n renderSelectedColorBar(lib) {\r\n const canvas = document.createElement('canvas');\r\n canvas.width = 320; // 适配加宽的选择器\r\n canvas.height = 32; // 适配加高的选择器\r\n canvas.style.width = '100%';\r\n canvas.style.height = '100%';\r\n this.selectedColorBar.innerHTML = '';\r\n this.selectedColorBar.appendChild(canvas);\r\n\r\n const ctx = canvas.getContext('2d');\r\n const gradient = ctx.createLinearGradient(0, 0, canvas.width, 0);\r\n\r\n // 先检查是否是自定义色库\r\n if (this.customColorLibs && this.customColorLibs[lib]) {\r\n const customLib = this.customColorLibs[lib];\r\n customLib.ratios.forEach((ratio, index) => {\r\n gradient.addColorStop(ratio, customLib.stops[index].color);\r\n });\r\n } else {\r\n // 原有逻辑保持不变\r\n switch (lib) {\r\n case 'default':\r\n gradient.addColorStop(0, '#0000FF');\r\n gradient.addColorStop(0.2, '#0080FF');\r\n gradient.addColorStop(0.4, '#00FFFF');\r\n gradient.addColorStop(0.6, '#00FF00');\r\n gradient.addColorStop(0.8, '#FFFF00');\r\n gradient.addColorStop(1, '#FF0000');\r\n break;\r\n case 'BlkWhiClt':\r\n gradient.addColorStop(0, '#000000');\r\n gradient.addColorStop(0.25, '#666666');\r\n gradient.addColorStop(0.5, '#999999');\r\n gradient.addColorStop(0.75, '#CCCCCC');\r\n gradient.addColorStop(1, '#FFFFFF');\r\n break;\r\n case 'BlkWhiYlw':\r\n gradient.addColorStop(0, '#000000');\r\n gradient.addColorStop(0.33, '#888800');\r\n gradient.addColorStop(0.66, '#FFFF00');\r\n gradient.addColorStop(1, '#FFFFFF');\r\n break;\r\n case 'BluWhiClt':\r\n gradient.addColorStop(0, '#00008B');\r\n gradient.addColorStop(0.25, '#1E90FF');\r\n gradient.addColorStop(0.5, '#87CEFA');\r\n gradient.addColorStop(0.75, '#E0FFFF');\r\n gradient.addColorStop(1, '#FFFFFF');\r\n break;\r\n }\r\n }\r\n\r\n ctx.fillStyle = gradient;\r\n ctx.fillRect(0, 0, canvas.width, canvas.height);\r\n\r\n ctx.strokeStyle = '#ccc';\r\n ctx.lineWidth = 1;\r\n ctx.strokeRect(0, 0, canvas.width, canvas.height);\r\n }\r\n\r\n // 初始化色库下拉选项的颜色条\r\n initLibraryColorBars() {\r\n this.renderLibraryColorBar(this.defaultColorBar, [\r\n { color: '#0000FF', pos: 0 },\r\n { color: '#0080FF', pos: 0.2 },\r\n { color: '#00FFFF', pos: 0.4 },\r\n { color: '#00FF00', pos: 0.6 },\r\n { color: '#FFFF00', pos: 0.8 },\r\n { color: '#FF0000', pos: 1 }\r\n ]);\r\n\r\n this.renderLibraryColorBar(this.BlkWhiCltColorBar, [\r\n { color: '#000000', pos: 0 },\r\n { color: '#666666', pos: 0.25 },\r\n { color: '#999999', pos: 0.5 },\r\n { color: '#CCCCCC', pos: 0.75 },\r\n { color: '#FFFFFF', pos: 1 }\r\n ]);\r\n\r\n this.renderLibraryColorBar(this.BlkWhiYlwColorBar, [\r\n { color: '#000000', pos: 0 },\r\n { color: '#888800', pos: 0.33 },\r\n { color: '#FFFF00', pos: 0.66 },\r\n { color: '#FFFFFF', pos: 1 }\r\n ]);\r\n\r\n this.renderLibraryColorBar(this.BluWhiCltColorBar, [\r\n { color: '#00008B', pos: 0 },\r\n { color: '#1E90FF', pos: 0.25 },\r\n { color: '#87CEFA', pos: 0.5 },\r\n { color: '#E0FFFF', pos: 0.75 },\r\n { color: '#FFFFFF', pos: 1 }\r\n ]);\r\n }\r\n\r\n // 渲染单个色库选项的颜色条\r\n renderLibraryColorBar(container, colorStops) {\r\n const canvas = document.createElement('canvas');\r\n canvas.width = 190; // 匹配加宽的option-color-bar\r\n canvas.height = 22; // 匹配加高的option-color-bar\r\n canvas.style.width = '100%';\r\n canvas.style.height = '100%';\r\n container.innerHTML = '';\r\n container.appendChild(canvas);\r\n\r\n const ctx = canvas.getContext('2d');\r\n const gradient = ctx.createLinearGradient(0, 0, canvas.width, 0);\r\n\r\n colorStops.forEach(stop => {\r\n gradient.addColorStop(stop.pos, stop.color);\r\n });\r\n\r\n ctx.fillStyle = gradient;\r\n ctx.fillRect(0, 0, canvas.width, canvas.height);\r\n\r\n ctx.strokeStyle = '#ccc';\r\n ctx.lineWidth = 1;\r\n ctx.strokeRect(0, 0, canvas.width, canvas.height);\r\n }\r\n\r\n // 计算增量默认值\r\n calculateDefaultStep(min, max, count) {\r\n return Math.max(1, (max - min) / Math.max(2, count));\r\n }\r\n\r\n // 生成随机HEX颜色\r\n generateRandomColor() {\r\n const letters = '0123456789ABCDEF';\r\n let color = '#';\r\n for (let i = 0; i < 6; i++) {\r\n color += letters[Math.floor(Math.random() * 16)];\r\n }\r\n return color;\r\n }\r\n\r\n // 根据个数/增量模式计算标注步长\r\n calculateStepByRangeMode(min, max) {\r\n const { rangeMode, rangeCount, rangeStep } = this.state;\r\n\r\n if (rangeMode === 'count') {\r\n return (max - min) / (Math.max(2, rangeCount) - 1);\r\n } else {\r\n return Math.max(1, rangeStep);\r\n }\r\n }\r\n\r\n // 计算离散模式下的块数量\r\n calculateDiscreteBlockCount(min, max) {\r\n const { rangeMode, rangeCount, rangeStep } = this.state;\r\n\r\n if (rangeMode === 'count') {\r\n return Math.max(2, rangeCount);\r\n } else {\r\n return Math.max(2, Math.ceil((max - min) / Math.max(1, rangeStep)));\r\n }\r\n }\r\n\r\n // 动态计算合理的标注步长\r\n calculateOptimalStep(min, max) {\r\n if (this.state.rangeMode) {\r\n return this.calculateStepByRangeMode(min, max);\r\n }\r\n\r\n const range = max - min;\r\n const targetLabels = 16;\r\n let step = Math.pow(10, Math.floor(Math.log10(range / targetLabels)));\r\n\r\n const steps = [step, step * 2, step * 5, step * 10];\r\n let optimalStep = step;\r\n for (const s of steps) {\r\n if (range / s <= targetLabels + 2) {\r\n optimalStep = s;\r\n break;\r\n }\r\n }\r\n\r\n return optimalStep;\r\n }\r\n\r\n // 【新增】打开颜色选择器\r\n openColorPicker(x, y) {\r\n // 如果已打开,先关闭\r\n if (this.colorPickerState.isOpen) {\r\n this.closeColorPicker();\r\n }\r\n\r\n // 创建ColorPicker DOM\r\n const picker = document.createElement('div');\r\n picker.className = 'color-picker-modal';\r\n\r\n // ========== 修正后的边界检测逻辑 ==========\r\n // 弹窗实际尺寸(和CSS定义一致)\r\n const pickerWidth = 280;\r\n const pickerHeight = 320;\r\n\r\n // 获取浏览器视口尺寸\r\n const viewportWidth = window.innerWidth;\r\n const viewportHeight = window.innerHeight;\r\n\r\n // 基础位置:优先显示在鼠标右下方,避免遮挡点击位置\r\n let left = x + 10;\r\n let top = y + 10;\r\n\r\n // 右边界修正:如果超出右侧,就显示在鼠标左侧\r\n if (left + pickerWidth > viewportWidth) {\r\n left = x - pickerWidth - 10;\r\n // 确保左边界不小于0\r\n left = Math.max(10, left);\r\n }\r\n\r\n // 下边界修正:如果超出底部,就显示在鼠标上方\r\n if (top + pickerHeight > viewportHeight) {\r\n top = y - pickerHeight - 10;\r\n // 确保上边界不小于0\r\n top = Math.max(10, top);\r\n }\r\n\r\n // 最终兜底:确保弹窗完全在视口内\r\n left = Math.min(left, viewportWidth - pickerWidth - 10);\r\n top = Math.min(top, viewportHeight - pickerHeight - 10);\r\n\r\n // 应用位置\r\n picker.style.left = `${left}px`;\r\n picker.style.top = `${top}px`;\r\n // ========== 边界检测结束 ==========\r\n\r\n // 生成当前颜色的HEX值\r\n const currentColor = chroma.hsl(\r\n this.colorPickerState.hue,\r\n this.colorPickerState.saturation,\r\n this.colorPickerState.lightness\r\n ).hex();\r\n\r\n // ColorPicker HTML结构(保持不变)\r\n picker.innerHTML = `\r\n <div class=\"color-picker-header\">\r\n <div class=\"color-picker-title\">选择颜色</div>\r\n <div class=\"color-picker-close\" id=\"cp-close\">✕</div>\r\n </div>\r\n <div class=\"color-picker-body\">\r\n <div class=\"color-picker-spectrum\" id=\"cp-spectrum\">\r\n <div class=\"color-picker-spectrum-gradient\"></div>\r\n <div class=\"color-picker-spectrum-handle\" id=\"cp-spectrum-handle\" \r\n style=\"left: ${this.colorPickerState.saturation * 100}%; top: ${(1 - this.colorPickerState.lightness) * 100}%; background: ${currentColor}\"></div>\r\n </div>\r\n <div class=\"color-picker-hue\" id=\"cp-hue\">\r\n <div class=\"color-picker-hue-handle\" id=\"cp-hue-handle\" \r\n style=\"left: ${(this.colorPickerState.hue / 360) * 100}%\"></div>\r\n </div>\r\n <div class=\"color-picker-input\">\r\n <input type=\"text\" id=\"cp-input\" value=\"${currentColor}\" maxlength=\"7\">\r\n <div class=\"color-picker-preview\" id=\"cp-preview\" style=\"background: ${currentColor}\"></div>\r\n </div>\r\n </div>\r\n <div class=\"color-picker-footer\">\r\n <button class=\"color-picker-btn color-picker-btn-cancel\" id=\"cp-cancel\">取消</button>\r\n <button class=\"color-picker-btn color-picker-btn-confirm\" id=\"cp-confirm\">确认</button>\r\n </div>\r\n `;\r\n\r\n // 剩余代码完全保持不变(添加到shadow DOM、绑定事件等)\r\n this.shadowRoot.appendChild(picker);\r\n this.colorPickerState.pickerElement = picker;\r\n this.colorPickerState.isOpen = true;\r\n\r\n\r\n // 获取ColorPicker元素\r\n const spectrum = picker.querySelector('#cp-spectrum');\r\n const spectrumHandle = picker.querySelector('#cp-spectrum-handle');\r\n const hueBar = picker.querySelector('#cp-hue');\r\n const hueHandle = picker.querySelector('#cp-hue-handle');\r\n const colorInput = picker.querySelector('#cp-input');\r\n const preview = picker.querySelector('#cp-preview');\r\n const closeBtn = picker.querySelector('#cp-close');\r\n const cancelBtn = picker.querySelector('#cp-cancel');\r\n const confirmBtn = picker.querySelector('#cp-confirm');\r\n const _this = this;\r\n\r\n // 更新色域背景色(根据当前色相)\r\n const updateSpectrumBg = () => {\r\n const hueColor = chroma.hsl(_this.colorPickerState.hue, 1, 0.5).hex();\r\n spectrum.style.background = hueColor;\r\n };\r\n updateSpectrumBg();\r\n\r\n // 更新颜色预览和输入框\r\n const updateColorPreview = () => {\r\n const hex = chroma.hsl(\r\n _this.colorPickerState.hue,\r\n _this.colorPickerState.saturation,\r\n _this.colorPickerState.lightness\r\n ).hex();\r\n colorInput.value = hex;\r\n preview.style.background = hex;\r\n spectrumHandle.style.background = hex;\r\n };\r\n\r\n // 色域拖拽逻辑\r\n spectrum.addEventListener('mousedown', (e) => {\r\n _this.colorPickerState.isDraggingSpectrum = true;\r\n const rect = spectrum.getBoundingClientRect();\r\n const x = e.clientX - rect.left;\r\n const y = e.clientY - rect.top;\r\n // 计算饱和度和亮度\r\n _this.colorPickerState.saturation = Math.max(0, Math.min(1, x / rect.width));\r\n _this.colorPickerState.lightness = Math.max(0, Math.min(1, 1 - (y / rect.height)));\r\n // 更新手柄位置和颜色\r\n spectrumHandle.style.left = `${_this.colorPickerState.saturation * 100}%`;\r\n spectrumHandle.style.top = `${(1 - _this.colorPickerState.lightness) * 100}%`;\r\n updateColorPreview();\r\n });\r\n\r\n // 色相条拖拽逻辑\r\n hueBar.addEventListener('mousedown', (e) => {\r\n _this.colorPickerState.isDraggingHue = true;\r\n const rect = hueBar.getBoundingClientRect();\r\n const x = e.clientX - rect.left;\r\n // 计算色相\r\n _this.colorPickerState.hue = Math.max(0, Math.min(360, (x / rect.width) * 360));\r\n // 更新手柄位置\r\n hueHandle.style.left = `${(x / rect.width) * 100}%`;\r\n updateSpectrumBg();\r\n updateColorPreview();\r\n });\r\n\r\n // 全局鼠标移动事件\r\n document.addEventListener('mousemove', (e) => {\r\n // 拖拽色域\r\n if (_this.colorPickerState.isDraggingSpectrum) {\r\n const rect = spectrum.getBoundingClientRect();\r\n const x = Math.max(0, Math.min(rect.width, e.clientX - rect.left));\r\n const y = Math.max(0, Math.min(rect.height, e.clientY - rect.top));\r\n _this.colorPickerState.saturation = x / rect.width;\r\n _this.colorPickerState.lightness = 1 - (y / rect.height);\r\n spectrumHandle.style.left = `${_this.colorPickerState.saturation * 100}%`;\r\n spectrumHandle.style.top = `${(1 - _this.colorPickerState.lightness) * 100}%`;\r\n updateColorPreview();\r\n }\r\n\r\n // 拖拽色相\r\n if (_this.colorPickerState.isDraggingHue) {\r\n const rect = hueBar.getBoundingClientRect();\r\n const x = Math.max(0, Math.min(rect.width, e.clientX - rect.left));\r\n _this.colorPickerState.hue = (x / rect.width) * 360;\r\n hueHandle.style.left = `${(x / rect.width) * 100}%`;\r\n updateSpectrumBg();\r\n updateColorPreview();\r\n }\r\n });\r\n\r\n // 全局鼠标松开事件\r\n document.addEventListener('mouseup', () => {\r\n _this.colorPickerState.isDraggingSpectrum = false;\r\n _this.colorPickerState.isDraggingHue = false;\r\n });\r\n\r\n // 输入框事件\r\n colorInput.addEventListener('input', (e) => {\r\n const value = e.target.value.trim();\r\n // 验证HEX颜色格式\r\n if (/^#([0-9A-Fa-f]{6})$/.test(value)) {\r\n try {\r\n const hsl = chroma(value).hsl();\r\n _this.colorPickerState.hue = hsl[0];\r\n _this.colorPickerState.saturation = hsl[1];\r\n _this.colorPickerState.lightness = hsl[2];\r\n // 更新手柄位置\r\n spectrumHandle.style.left = `${_this.colorPickerState.saturation * 100}%`;\r\n spectrumHandle.style.top = `${(1 - _this.colorPickerState.lightness) * 100}%`;\r\n hueHandle.style.left = `${(_this.colorPickerState.hue / 360) * 100}%`;\r\n updateSpectrumBg();\r\n preview.style.background = value;\r\n } catch (err) {\r\n _this.showErrorMessage('无效的颜色值');\r\n }\r\n }\r\n });\r\n\r\n // 关闭按钮\r\n closeBtn.addEventListener('click', () => {\r\n _this.closeColorPicker();\r\n });\r\n\r\n // 取消按钮\r\n cancelBtn.addEventListener('click', () => {\r\n _this.closeColorPicker();\r\n });\r\n\r\n // 确认按钮\r\n confirmBtn.addEventListener('click', () => {\r\n const hex = colorInput.value.trim();\r\n if (/^#([0-9A-Fa-f]{6})$/.test(hex)) {\r\n // 更新目标色块颜色\r\n _this.colorPickerState.targetStop.color = hex;\r\n // 重新渲染\r\n _this.renderPanelColorbar();\r\n _this.renderColorBarPreview();\r\n // 关闭选择器\r\n _this.closeColorPicker();\r\n } else {\r\n _this.showErrorMessage('请输入有效的HEX颜色值(如#FF0000)');\r\n }\r\n });\r\n this.clickOutsideHandler = clickOutside;\r\n // 点击选择器外部关闭\r\n const clickOutside = function (e) {\r\n if (_this.colorPickerState.pickerElement && !_this.colorPickerState.pickerElement.contains(e.target)) {\r\n _this.closeColorPicker();\r\n document.removeEventListener('click', clickOutside);\r\n }\r\n };\r\n document.addEventListener('click', clickOutside);\r\n }\r\n\r\n // 【新增】关闭颜色选择器\r\n closeColorPicker() {\r\n // 移除全局clickOutside事件\r\n document.removeEventListener('click', this.clickOutsideHandler);\r\n\r\n if (this.colorPickerState.pickerElement) {\r\n this.shadowRoot.removeChild(this.colorPickerState.pickerElement);\r\n }\r\n this.colorPickerState = {\r\n ...this.colorPickerState,\r\n isOpen: false,\r\n pickerElement: null,\r\n isDraggingHue: false,\r\n isDraggingSpectrum: false\r\n };\r\n }\r\n\r\n // 事件绑定\r\n bindEvents() {\r\n // ========== 新增:绑定导入/保存按钮事件 ==========\r\n this.importLibBtn = this.shadowRoot.getElementById('importLib');\r\n this.saveLibBtn = this.shadowRoot.getElementById('saveLib');\r\n\r\n // 保存按钮点击事件\r\n this.saveLibBtn.addEventListener('click', () => {\r\n this.exportColorScaleToTxt();\r\n });\r\n\r\n // 导入按钮点击事件\r\n this.importLibBtn.addEventListener('click', () => {\r\n // 创建隐藏的文件选择器\r\n const fileInput = document.createElement('input');\r\n fileInput.type = 'file';\r\n fileInput.accept = '.txt';\r\n\r\n // 文件选择事件\r\n fileInput.addEventListener('change', (e) => {\r\n const file = e.target.files[0];\r\n if (file) {\r\n this.importColorScaleFromTxt(file);\r\n }\r\n });\r\n\r\n // 触发文件选择对话框\r\n fileInput.click();\r\n });\r\n\r\n const _this = this;\r\n\r\n this.colorBarPreview.addEventListener('dblclick', (e) => {\r\n e.stopPropagation();\r\n this.state.panelVisible = true;\r\n // 新增这一行:打开面板时重新保存当前状态作为取消的恢复基准\r\n this.saveOriginalState();\r\n this.settingPanel.classList.add('active');\r\n this.updatePanelPosition();\r\n });\r\n\r\n // 面板拖拽\r\n let isDraggingPanel = false;\r\n let startX, startY;\r\n let initialTop, initialRight;\r\n\r\n this.panelHandle.addEventListener('mousedown', (e) => {\r\n isDraggingPanel = true;\r\n startX = e.clientX;\r\n startY = e.clientY;\r\n initialTop = this.state.panelPosition.top;\r\n initialRight = this.state.panelPosition.right;\r\n this.panelHandle.style.background = '#e0e0e0';\r\n document.body.style.cursor = 'move';\r\n });\r\n\r\n document.addEventListener('mousemove', (e) => {\r\n if (!isDraggingPanel) return;\r\n const deltaX = e.clientX - startX;\r\n const deltaY = e.clientY - startY;\r\n this.state.panelPosition = {\r\n top: initialTop + deltaY,\r\n right: initialRight - deltaX\r\n };\r\n this.updatePanelPosition();\r\n });\r\n\r\n document.addEventListener('mouseup', () => {\r\n if (isDraggingPanel) {\r\n isDraggingPanel = false;\r\n this.panelHandle.style.background = '#f0f0f0';\r\n document.body.style.cursor = '';\r\n }\r\n });\r\n\r\n // 范围设置\r\n this.setRangeBtn.addEventListener('click', () => {\r\n const min = Number(this.minInput.value);\r\n const max = Number(this.maxInput.value);\r\n if (isNaN(min) || isNaN(max) || min >= max) {\r\n this.showErrorMessage('请输入有效范围(最小值 < 最大值)');\r\n return;\r\n }\r\n\r\n if (this.state.rangeMode === 'count') {\r\n const count = Number(this.rangeCountInput.value);\r\n if (isNaN(count) || count < 2) {\r\n this.showErrorMessage('个数必须是大于等于2的数字');\r\n this.rangeCountInput.value = this.state.rangeCount;\r\n return;\r\n }\r\n this.state.rangeCount = count;\r\n\r\n const newStep = this.calculateDefaultStep(min, max, count);\r\n this.state.rangeStep = newStep;\r\n this.rangeStepInput.value = newStep;\r\n } else {\r\n const step = Number(this.rangeStepInput.value);\r\n if (isNaN(step) || step < 1) {\r\n this.showErrorMessage('增量必须是大于等于1的数字');\r\n this.rangeStepInput.value = this.state.rangeStep;\r\n return;\r\n }\r\n this.state.rangeStep = step;\r\n }\r\n\r\n this.state.min = min;\r\n this.state.max = max;\r\n\r\n this.state.step = this.calculateOptimalStep(min, max);\r\n\r\n this.state.stops = this.state.originalStopRatios.map((ratio, index) => {\r\n return {\r\n value: min + (max - min) * ratio,\r\n color: this.state.stops[index]?.color || this.state.stops[0].color\r\n };\r\n });\r\n\r\n this.renderColorBarPreview();\r\n this.renderPanelColorbar();\r\n });\r\n\r\n // 个数/增量模式切换事件\r\n this.rangeModeRadios.forEach(radio => {\r\n radio.addEventListener('change', (e) => {\r\n const mode = e.target.id === 'countMode' ? 'count' : 'step';\r\n this.state.rangeMode = mode;\r\n\r\n if (mode === 'count') {\r\n this.rangeCountInput.disabled = false;\r\n this.rangeCountInput.classList.remove('input-disabled');\r\n this.rangeStepInput.disabled = true;\r\n this.rangeStepInput.classList.add('input-disabled');\r\n } else {\r\n this.rangeCountInput.disabled = true;\r\n this.rangeCountInput.classList.add('input-disabled');\r\n this.rangeStepInput.disabled = false;\r\n this.rangeStepInput.classList.remove('input-disabled');\r\n }\r\n\r\n if (this.state.min < this.state.max) {\r\n this.state.step = this.calculateStepByRangeMode(this.state.min, this.state.max);\r\n this.renderColorBarPreview();\r\n this.renderPanelColorbar();\r\n }\r\n });\r\n });\r\n\r\n // 个数输入框变更事件\r\n this.rangeCountInput.addEventListener('change', (e) => {\r\n const val = Number(e.target.value);\r\n if (!isNaN(val) && val >= 2) {\r\n this.state.rangeCount = val;\r\n\r\n if (this.state.min < this.state.max) {\r\n const newStep = this.calculateDefaultStep(this.state.min, this.state.max, val);\r\n this.state.rangeStep = newStep;\r\n this.rangeStepInput.value = newStep;\r\n }\r\n } else {\r\n this.showErrorMessage('个数必须是大于等于2的数字');\r\n e.target.value = this.state.rangeCount;\r\n }\r\n if (this.state.min < this.state.max) {\r\n this.renderColorBarPreview();\r\n this.renderPanelColorbar();\r\n }\r\n });\r\n\r\n // 增量输入框变更事件\r\n this.rangeStepInput.addEventListener('change', (e) => {\r\n const val = Number(e.target.value);\r\n if (!isNaN(val) && val >= 1) {\r\n this.state.rangeStep = val;\r\n } else {\r\n this.showErrorMessage('增量必须是大于等于1的数字');\r\n e.target.value = this.state.rangeStep;\r\n }\r\n if (this.state.min < this.state.max) {\r\n this.renderColorBarPreview();\r\n this.renderPanelColorbar();\r\n }\r\n });\r\n\r\n // 其他事件绑定\r\n this.displayModeRadios.forEach(radio => {\r\n radio.addEventListener('change', (e) => {\r\n this.state.displayMode = e.target.id;\r\n this.renderColorBarPreview();\r\n this.renderPanelColorbar();\r\n });\r\n });\r\n\r\n this.labelTypeRadios.forEach(radio => {\r\n radio.addEventListener('change', (e) => {\r\n this.state.labelType = e.target.id;\r\n this.renderColorBarPreview();\r\n this.renderPanelColorbar();\r\n });\r\n });\r\n\r\n this.precisionInput.addEventListener('change', (e) => {\r\n let val = Number(e.target.value);\r\n if (isNaN(val)) {\r\n val = 1;\r\n e.target.value = 1;\r\n } else if (val < 1) {\r\n val = 1;\r\n e.target.value = 1;\r\n } else if (val > 10) {\r\n val = 10;\r\n e.target.value = 10;\r\n }\r\n this.state.precision = val;\r\n this.renderColorBarPreview();\r\n this.renderPanelColorbar();\r\n });\r\n\r\n this.scientificCheckbox.addEventListener('change', (e) => {\r\n this.state.scientific = e.target.checked;\r\n this.renderColorBarPreview();\r\n this.renderPanelColorbar();\r\n });\r\n\r\n // 色库下拉框事件\r\n this.librarySelectContainer.addEventListener('click', (e) => {\r\n e.stopPropagation();\r\n this.libraryOptions.style.display = this.libraryOptions.style.display === 'block' ? 'none' : 'block';\r\n });\r\n\r\n document.addEventListener('click', () => {\r\n this.libraryOptions.style.display = 'none';\r\n });\r\n\r\n this.libraryOptionItems.forEach(item => {\r\n item.addEventListener('click', (e) => {\r\n e.stopPropagation();\r\n const value = item.dataset.value;\r\n this.colorLibrarySelect.value = value;\r\n this.state.colorLibrary = value;\r\n\r\n this.renderSelectedColorBar(value);\r\n\r\n this.updateLibraryStops(value);\r\n\r\n this.libraryOptions.style.display = 'none';\r\n\r\n this.renderColorBarPreview();\r\n this.renderPanelColorbar();\r\n });\r\n\r\n item.addEventListener('mouseenter', () => {\r\n item.style.background = '#f5f5f5';\r\n });\r\n item.addEventListener('mouseleave', () => {\r\n item.style.background = 'white';\r\n });\r\n });\r\n\r\n this.colorLibrarySelect.addEventListener('change', (e) => {\r\n const lib = e.target.value;\r\n this.state.colorLibrary = lib;\r\n\r\n this.renderSelectedColorBar(lib);\r\n\r\n this.updateLibraryStops(lib);\r\n this.renderColorBarPreview();\r\n this.renderPanelColorbar();\r\n });\r\n\r\n // 移除了addToLibCheckbox的change事件绑定\r\n\r\n this.resetBtn.addEventListener('click', () => {\r\n const resetMin = this.initialMin;\r\n const resetMax = this.initialMax;\r\n const resetCount = 16;\r\n const resetStep = this.calculateDefaultStep(resetMin, resetMax, resetCount);\r\n\r\n this.state = {\r\n ...this.state,\r\n min: resetMin,\r\n max: resetMax,\r\n start: 0,\r\n step: 4000,\r\n displayMode: 'continuous',\r\n labelType: 'integer',\r\n precision: 1,\r\n scientific: false,\r\n colorLibrary: 'default',\r\n // 移除了addToLib的重置\r\n rangeMode: 'count',\r\n rangeCount: resetCount,\r\n rangeStep: resetStep,\r\n // 修改:重置时的originalStopRatios也改为default比例\r\n originalStopRatios: [0, 0.2, 0.4, 0.6, 0.8, 1],\r\n // 修改:重置时的stops也基于比例计算\r\n stops: [\r\n { value: resetMin + (resetMax - resetMin) * 0, color: '#0000FF' },\r\n { value: resetMin + (resetMax - resetMin) * 0.2, color: '#0080FF' },\r\n { value: resetMin + (resetMax - resetMin) * 0.4, color: '#00FFFF' },\r\n { value: resetMin + (resetMax - resetMin) * 0.6, color: '#00FF00' },\r\n { value: resetMin + (resetMax - resetMin) * 0.8, color: '#FFFF00' },\r\n { value: resetMin + (resetMax - resetMin) * 1, color: '#FF0000' }\r\n ]\r\n };\r\n this.minInput.value = resetMin;\r\n this.maxInput.value = resetMax;\r\n this.displayModeRadios[0].checked = true;\r\n this.labelTypeRadios[0].checked = true;\r\n this.precisionInput.value = 1;\r\n this.scientificCheckbox.checked = false;\r\n this.colorLibrarySelect.value = 'default';\r\n // 移除了addToLibCheckbox的重置\r\n this.rangeModeRadios[0].checked = true;\r\n this.rangeCountInput.value = resetCount;\r\n this.rangeStepInput.value = resetStep;\r\n this.rangeCountInput.disabled = false;\r\n this.rangeCountInput.classList.remove('input-disabled');\r\n this.rangeStepInput.disabled = true;\r\n this.rangeStepInput.classList.add('input-disabled');\r\n\r\n this.renderColorBarPreview();\r\n this.renderPanelColorbar();\r\n });\r\n\r\n this.confirmBtn.addEventListener('click', () => {\r\n this.saveOriginalState();\r\n this.state.panelVisible = false;\r\n this.settingPanel.classList.remove('active');\r\n this.dispatchEvent(new CustomEvent('scaleConfirm', {\r\n detail: JSON.parse(JSON.stringify(this.state)),\r\n bubbles: true,\r\n composed: true\r\n }));\r\n });\r\n\r\n this.cancelBtn.addEventListener('click', () => {\r\n if (this.state.originalState) {\r\n this.state = JSON.parse(JSON.stringify(this.state.originalState));\r\n this.minInput.value = this.state.min;\r\n this.maxInput.value = this.state.max;\r\n this.displayModeRadios.forEach(radio => {\r\n radio.checked = radio.id === this.state.displayMode;\r\n });\r\n this.labelTypeRadios.forEach(radio => {\r\n radio.checked = radio.id === this.state.labelType;\r\n });\r\n this.precisionInput.value = this.state.precision;\r\n this.scientificCheckbox.checked = this.state.scientific;\r\n this.colorLibrarySelect.value = this.state.colorLibrary;\r\n // 移除了addToLibCheckbox的重置\r\n this.rangeModeRadios.forEach(radio => {\r\n radio.checked = (radio.id === 'countMode' && this.state.rangeMode === 'count') ||\r\n (radio.id === 'stepMode' && this.state.rangeMode === 'step');\r\n });\r\n this.rangeCountInput.value = this.state.rangeCount;\r\n this.rangeStepInput.value = this.state.rangeStep;\r\n this.rangeCountInput.disabled = this.state.rangeMode !== 'count';\r\n this.rangeStepInput.disabled = this.state.rangeMode !== 'step';\r\n if (this.state.rangeMode === 'count') {\r\n this.rangeCountInput.classList.remove('input-disabled');\r\n this.rangeStepInput.classList.add('input-disabled');\r\n } else {\r\n this.rangeCountInput.classList.add('input-disabled');\r\n this.rangeStepInput.classList.remove('input-disabled');\r\n }\r\n\r\n this.updatePanelPosition();\r\n this.renderColorBarPreview();\r\n this.renderPanelColorbar();\r\n }\r\n this.state.panelVisible = false;\r\n this.settingPanel.classList.remove('active');\r\n });\r\n\r\n this.applyBtn.addEventListener('click', () => {\r\n this.renderColorBarPreview();\r\n this.renderPanelColorbar();\r\n this.dispatchEvent(new CustomEvent('scaleApply', {\r\n detail: JSON.parse(JSON.stringify(this.state)),\r\n bubbles: true,\r\n composed: true\r\n }));\r\n });\r\n\r\n // 双击新增色块\r\n this.panelColorbar.addEventListener('dblclick', function (e) {\r\n if (_this.state.displayMode !== 'continuous') return;\r\n\r\n e.stopPropagation();\r\n\r\n const rect = this.getBoundingClientRect();\r\n const y = e.clientY - rect.top;\r\n const clickValue = _this.getValueFromY(y);\r\n\r\n const tolerance = (_this.state.max - _this.state.min) * 0.03;\r\n const targetIndex = _this.state.stops.findIndex(stop =>\r\n Math.abs(stop.value - clickValue) < tolerance\r\n );\r\n\r\n if (targetIndex !== -1) {\r\n if (_this.state.stops.length > 2) {\r\n // 直接删除,不再显示确认弹窗\r\n _this.state.stops.splice(targetIndex, 1);\r\n _this.state.originalStopRatios = _this.state.stops.map(stop => (stop.value - _this.state.min) / (_this.state.max - _this.state.min));\r\n _this.renderPanelColorbar();\r\n _this.renderColorBarPreview();\r\n } else {\r\n // 使用自定义错误提示替代alert\r\n _this.showErrorMessage('至少需要保留2个色块以保证渐变效果,请不要删除最后2个色块!');\r\n }\r\n } else {\r\n const newColor = _this.generateRandomColor();\r\n\r\n _this.state.stops.push({ value: clickValue, color: newColor });\r\n _this.state.stops.sort((a, b) => a.value - b.value);\r\n _this.state.originalStopRatios = _this.state.stops.map(stop => (stop.value - _this.state.min) / (_this.state.max - _this.state.min));\r\n _this.renderPanelColorbar();\r\n _this.renderColorBarPreview();\r\n\r\n // 移除了alert弹窗,实现直接添加\r\n // alert(`已新增色块,值:${_this.formatNumber(clickValue)},颜色:${newColor}`);\r\n }\r\n });\r\n\r\n // 右键点击颜色块修改颜色(替换为Antd风格ColorPicker)\r\n this.panelColorbar.addEventListener('contextmenu', function (e) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n const rect = this.getBoundingClientRect();\r\n const y = e.clientY - rect.top;\r\n const clickValue = _this.getValueFromY(y);\r\n\r\n const tolerance = (_this.state.max - _this.state.min) * 0.03;\r\n const targetStop = _this.state.stops.find(stop => Math.abs(stop.value - clickValue) < tolerance);\r\n\r\n if (targetStop) {\r\n // 初始化ColorPicker状态\r\n _this.colorPickerState.targetStop = targetStop;\r\n // 将目标颜色转换为HSL\r\n const hsl = chroma(targetStop.color).hsl();\r\n _this.colorPickerState.hue = hsl[0];\r\n _this.colorPickerState.saturation = hsl[1];\r\n _this.colorPickerState.lightness = hsl[2];\r\n\r\n // 打开ColorPicker\r\n _this.openColorPicker(e.clientX, e.clientY);\r\n }\r\n });\r\n\r\n // 色块拖拽逻辑\r\n this.panelColorbar.addEventListener('mousedown', (e) => {\r\n if (this.state.displayMode !== 'continuous') return;\r\n\r\n const rect = this.panelColorbar.getBoundingClientRect();\r\n const y = e.clientY - rect.top;\r\n this.dragState.draggingStopIndex = this.findClosestStop(y);\r\n\r\n if (this.dragState.draggingStopIndex !== -1) {\r\n this.dragState.isDragging = true;\r\n this.dragState.dragStartY = e.clientY;\r\n this.dragState.dragStartValue = this.state.stops[this.dragState.draggingStopIndex].value;\r\n this.dragState.canvasRect = this.panelColorbar.getBoundingClientRect();\r\n\r\n document.body.style.cursor = 'ns-resize';\r\n e.preventDefault();\r\n }\r\n });\r\n\r\n document.addEventListener('mousemove', (e) => {\r\n if (!this.dragState.isDragging || this.dragState.draggingStopIndex === -1) return;\r\n\r\n const y = e.clientY - this.dragState.canvasRect.top;\r\n const newValue = this.getValueFromY(y);\r\n\r\n const { min, max, stops } = this.state;\r\n const currentStop = stops[this.dragState.draggingStopIndex];\r\n\r\n const sortedStops = [...stops].sort((a, b) => a.value - b.value);\r\n const currentIndexInSorted = sortedStops.findIndex(s =>\r\n Math.abs(s.value - currentStop.value) < 1\r\n );\r\n\r\n let clampedValue = newValue;\r\n if (currentIndexInSorted > 0) {\r\n clampedValue = Math.max(sortedStops[currentIndexInSorted - 1].value + 1, clampedValue);\r\n } else {\r\n clampedValue = Math.max(min, clampedValue);\r\n }\r\n\r\n if (currentIndexInSorted < sortedStops.length - 1) {\r\n clampedValue = Math.min(sortedStops[currentIndexInSorted + 1].value - 1, clampedValue);\r\n } else {\r\n clampedValue = Math.min(max, clampedValue);\r\n }\r\n\r\n stops[this.dragState.draggingStopIndex].value = clampedValue;\r\n this.state.originalStopRatios = this.state.stops.map(stop => (stop.value - min) / (max - min));\r\n\r\n this.renderPanelColorbar();\r\n this.renderColorBarPreview();\r\n });\r\n\r\n document.addEventListener('mouseup', () => {\r\n if (this.dragState.isDragging) {\r\n this.dragState = {\r\n isDragging: false,\r\n draggingStopIndex: -1,\r\n dragStartY: 0,\r\n dragStartValue: 0,\r\n canvasRect: null\r\n };\r\n\r\n document.body.style.cursor = '';\r\n }\r\n });\r\n\r\n document.addEventListener('mouseleave', () => {\r\n if (this.dragState.isDragging) {\r\n document.dispatchEvent(new MouseEvent('mouseup'));\r\n }\r\n });\r\n }\r\n\r\n // 更新色库对应的色标配置\r\n // 更新色库对应的色标配置\r\n updateLibraryStops(lib) {\r\n const { min, max } = this.state;\r\n\r\n // 优先处理自定义色库\r\n if (this.customColorLibs && this.customColorLibs[lib]) {\r\n const customLib = this.customColorLibs[lib];\r\n this.state.originalStopRatios = customLib.ratios;\r\n // 关键:根据当前的min/max重新计算value,而不是使用保存的旧值\r\n this.state.stops = customLib.stops.map((stop, index) => ({\r\n value: min + (max - min) * customLib.ratios[index],\r\n color: stop.color\r\n }));\r\n return;\r\n }\r\n\r\n // 原有内置色库逻辑保持不变\r\n switch (lib) {\r\n case 'default':\r\n this.state.originalStopRatios = [0, 0.2, 0.4, 0.6, 0.8, 1];\r\n this.state.stops = [\r\n { value: min, color: '#0000FF' },\r\n { value: min + (max - min) * 0.2, color: '#0080FF' },\r\n { value: min + (max - min) * 0.4, color: '#00FFFF' },\r\n { value: min + (max - min) * 0.6, color: '#00FF00' },\r\n { value: min + (max - min) * 0.8, color: '#FFFF00' },\r\n { value: max, color: '#FF0000' }\r\n ];\r\n break;\r\n case 'BlkWhiClt':\r\n this.state.originalStopRatios = [0, 0.25, 0.5, 0.75, 1];\r\n this.state.stops = [\r\n { value: min, color: '#000000' },\r\n { value: min + (max - min) * 0.25, color: '#666666' },\r\n { value: min + (max - min) * 0.5, color: '#999999' },\r\n { value: min + (max - min) * 0.75, color: '#CCCCCC' },\r\n { value: max, color: '#FFFFFF' }\r\n ];\r\n break;\r\n case 'BlkWhiYlw':\r\n this.state.originalStopRatios = [0, 0.33, 0.66, 1];\r\n this.state.stops = [\r\n { value: min, color: '#000000' },\r\n { value: min + (max - min) * 0.33, color: '#888800' },\r\n { value: min + (max - min) * 0.66, color: '#FFFF00' },\r\n { value: max, color: '#FFFFFF' }\r\n ];\r\n break;\r\n case 'BluWhiClt':\r\n this.state.originalStopRatios = [0, 0.25, 0.5, 0.75, 1];\r\n this.state.stops = [\r\n { value: min, color: '#00008B' },\r\n { value: min + (max - min) * 0.25, color: '#1E90FF' },\r\n { value: min + (max - min) * 0.5, color: '#87CEFA' },\r\n { value: min + (max - min) * 0.75, color: '#E0FFFF' },\r\n { value: max, color: '#FFFFFF' }\r\n ];\r\n break;\r\n }\r\n }\r\n\r\n // Y坐标转数值计算\r\n getValueFromY(y) {\r\n const { min, max } = this.state;\r\n const canvasHeight = 490;\r\n const usableHeight = 470;\r\n\r\n const clampedY = Math.max(10, Math.min(canvasHeight - 10, y));\r\n const percent = 1 - ((clampedY - 10) / usableHeight);\r\n return min + (max - min) * percent;\r\n }\r\n\r\n // 精准找到鼠标点击的stop索引\r\n findClosestStop(y) {\r\n const { stops, min, max } = this.state;\r\n if (stops.length === 0) return -1;\r\n\r\n const clickValue = this.getValueFromY(y);\r\n const tolerance = (max - min) * 0.03;\r\n\r\n let closestIndex = -1;\r\n let minDiff = Infinity;\r\n\r\n stops.forEach((stop, index) => {\r\n const diff = Math.abs(stop.value - clickValue);\r\n if (diff < minDiff && diff < tolerance) {\r\n minDiff = diff;\r\n closestIndex = index;\r\n }\r\n });\r\n\r\n return closestIndex;\r\n }\r\n\r\n // 更新面板位置\r\n updatePanelPosition() {\r\n this.settingPanel.style.top = `${this.state.panelPosition.top}px`;\r\n this.settingPanel.style.right = `${this.state.panelPosition.right}px`;\r\n }\r\n\r\n // 保存原始状态\r\n saveOriginalState() {\r\n this.state.originalState = JSON.parse(JSON.stringify(this.state));\r\n }\r\n\r\n // 格式化数字\r\n formatNumber(num) {\r\n const { labelType, precision, scientific } = this.state;\r\n if (scientific) {\r\n return num.toExponential(precision);\r\n }\r\n if (labelType === 'float') {\r\n return num.toFixed(precision);\r\n }\r\n return Math.round(num).toString();\r\n }\r\n\r\n // 渲染色条预览\r\n renderColorBarPreview() {\r\n const canvas = this.previewCanvas;\r\n const labelsContainer = this.valueLabels;\r\n const { min, max, step, stops, displayMode } = this.state;\r\n\r\n const containerHeight = this.colorBarPreview.clientHeight;\r\n canvas.width = 65; // 适配加宽的色条\r\n canvas.height = containerHeight;\r\n const ctx = canvas.getContext('2d');\r\n\r\n ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n\r\n if (displayMode === 'continuous') {\r\n const sortedStops = [...stops].sort((a, b) => a.value - b.value);\r\n const gradient = ctx.createLinearGradient(0, 0, 0, canvas.height);\r\n sortedStops.forEach(stop => {\r\n const percent = (stop.value - min) / (max - min);\r\n const reversedPercent = 1 - percent;\r\n gradient.addColorStop(reversedPercent, stop.color);\r\n });\r\n ctx.fillStyle = gradient;\r\n ctx.fillRect(0, 0, canvas.width, canvas.height);\r\n\r\n labelsContainer.innerHTML = '';\r\n const usableHeight = containerHeight - 20;\r\n\r\n let currentVal = min;\r\n while (currentVal <= max) {\r\n const label = document.createElement('div');\r\n label.className = 'label-item';\r\n label.dataset.value = this.formatNumber(currentVal);\r\n label.textContent = this.formatNumber(currentVal);\r\n\r\n const percent = (currentVal - min) / (max - min);\r\n const pixelTop = 10 + (usableHeight * (1 - percent));\r\n\r\n label.style.position = 'absolute';\r\n label.style.top = `${pixelTop}px`;\r\n label.style.transform = 'translateY(-50%)';\r\n\r\n labelsContainer.appendChild(label);\r\n\r\n currentVal += step;\r\n }\r\n } else if (displayMode === 'discrete') {\r\n const blockCount = this.calculateDiscreteBlockCount(min, max);\r\n const blockHeight = containerHeight / blockCount;\r\n const discreteStep = (max - min) / blockCount;\r\n\r\n const colorScale = chroma.scale(\r\n stops.sort((a, b) => a.value - b.value).map(s => s.color)\r\n ).domain([min, max]);\r\n\r\n for (let i = 0; i < blockCount; i++) {\r\n const reversedIndex = blockCount - 1 - i;\r\n const blockStart = min + reversedIndex * discreteStep;\r\n const blockEnd = Math.min(blockStart + discreteStep, max);\r\n const blockMidValue = (blockStart + blockEnd) / 2;\r\n\r\n const y = i * blockHeight;\r\n const height = Math.min(blockHeight, containerHeight - y);\r\n\r\n const blockColor = colorScale(blockMidValue).hex();\r\n ctx.fillStyle = blockColor;\r\n ctx.fillRect(0, y, canvas.width, height);\r\n\r\n ctx.strokeStyle = '#ffffff';\r\n ctx.lineWidth = 1;\r\n ctx.strokeRect(0, y, canvas.width, height);\r\n }\r\n\r\n labelsContainer.innerHTML = '';\r\n for (let i = 0; i < blockCount; i++) {\r\n const reversedIndex = blockCount - 1 - i;\r\n const blockStart = min + reversedIndex * discreteStep;\r\n const blockEnd = Math.min(blockStart + discreteStep, max);\r\n const labelText = `${this.formatNumber(blockStart)}-${this.formatNumber(blockEnd)}`;\r\n\r\n const label = document.createElement('div');\r\n label.className = 'label-item';\r\n label.textContent = labelText;\r\n\r\n const pixelTop = i * blockHeight + blockHeight / 2;\r\n label.style.position = 'absolute';\r\n label.style.top = `${pixelTop}px`;\r\n label.style.transform = 'translateY(-50%)';\r\n\r\n labelsContainer.appendChild(label);\r\n }\r\n }\r\n }\r\n\r\n // 面板内色标渲染\r\n renderPanelColorbar() {\r\n const canvas = this.panelColorbar;\r\n const labelsContainer = this.colorbarLabels;\r\n const { min, max, step, stops, displayMode } = this.state;\r\n\r\n canvas.width = 100;\r\n canvas.height = 490;\r\n const ctx = canvas.getContext('2d');\r\n\r\n ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n ctx.imageSmoothingEnabled = false;\r\n\r\n if (displayMode === 'continuous') {\r\n const sortedStops = [...stops].sort((a, b) => a.value - b.value);\r\n const gradient = ctx.createLinearGradient(0, 10, 0, canvas.height - 10);\r\n sortedStops.forEach(stop => {\r\n const percent = (stop.value - min) / (max - min);\r\n const reversedPercent = 1 - percent;\r\n gradient.addColorStop(reversedPercent, stop.color);\r\n });\r\n\r\n ctx.fillStyle = gradient;\r\n ctx.fillRect(0, 10, 65, 470); // 适配加宽的色条\r\n\r\n sortedStops.forEach(stop => {\r\n const baseColor = stop.color && /^#([0-9A-Fa-f]{6})$/.test(stop.color)\r\n ? stop.color\r\n : '#0000FF';\r\n const fillColor = baseColor;\r\n\r\n const percent = (stop.value - min) / (max - min);\r\n const reversedPercent = 1 - percent;\r\n const y = 10 + 470 * reversedPercent;\r\n\r\n const barRightX = 65; // 适配加宽的色条\r\n const blockW = 16;\r\n const blockH = 12;\r\n const triangleW = 8;\r\n\r\n ctx.save();\r\n ctx.beginPath();\r\n ctx.moveTo(barRightX, y);\r\n ctx.lineTo(barRightX + triangleW, y - blockH / 2);\r\n ctx.lineTo(barRightX + triangleW + blockW, y - blockH / 2);\r\n ctx.lineTo(barRightX + triangleW + blockW, y + blockH / 2);\r\n ctx.lineTo(barRightX + triangleW, y + blockH / 2);\r\n ctx.closePath();\r\n\r\n ctx.fillStyle = fillColor;\r\n ctx.fill();\r\n\r\n ctx.strokeStyle = '#000000';\r\n ctx.lineWidth = 2;\r\n ctx.lineJoin = 'round';\r\n ctx.stroke();\r\n\r\n ctx.restore();\r\n });\r\n\r\n // 生成数值标签(使用动态计算的step)\r\n labelsContainer.innerHTML = '';\r\n const containerHeight = 490;\r\n\r\n // 修复:从min开始,按step递增,直到超过max\r\n let currentVal = min;\r\n while (currentVal <= max) {\r\n const percent = (currentVal - min) / (max - min);\r\n const pixelTop = 10 + 470 * (1 - percent); // 基数改为470\r\n\r\n const labelWrapper = document.createElement('div');\r\n labelWrapper.style.position = 'absolute';\r\n labelWrapper.style.top = `${pixelTop}px`;\r\n labelWrapper.style.transform = 'translateY(-50%)';\r\n labelWrapper.style.left = '0';\r\n\r\n // 移除数字左侧的marker元素\r\n const label = document.createElement('div');\r\n label.className = 'colorbar-label';\r\n label.textContent = this.formatNumber(currentVal);\r\n labelWrapper.appendChild(label);\r\n\r\n labelsContainer.appendChild(labelWrapper);\r\n\r\n // 增加步长,避免死循环\r\n currentVal += step;\r\n }\r\n } else if (displayMode === 'discrete') {\r\n // 离散显示:根据范围的个数/增量来计算块数量\r\n const blockCount = this.calculateDiscreteBlockCount(min, max);\r\n const discreteStep = (max - min) / blockCount;\r\n const blockHeight = 470 / blockCount; // 基于470px可用高度计算\r\n\r\n // 创建颜色比例尺(完全复用连续显示的颜色配置)\r\n const colorScale = chroma.scale(\r\n stops.sort((a, b) => a.value - b.value).map(s => s.color)\r\n ).domain([min, max]);\r\n\r\n // 绘制离散色块 - 反转顺序,最大值在上\r\n for (let i = 0; i < blockCount; i++) {\r\n // 反转索引:让最大值对应的色块显示在顶部\r\n const reversedIndex = blockCount - 1 - i;\r\n const blockStart = min + reversedIndex * discreteStep;\r\n const blockEnd = Math.min(blockStart + discreteStep, max);\r\n const blockMidValue = (blockStart + blockEnd) / 2;\r\n\r\n // 计算色块位置(高值在上,从顶部10px开始)\r\n const y = 10 + i * blockHeight;\r\n const height = Math.min(blockHeight, 470 - i * blockHeight);\r\n\r\n // 获取当前块的颜色(精准匹配连续渐变对应位置)\r\n const blockColor = colorScale(blockMidValue).hex();\r\n ctx.fillStyle = blockColor;\r\n ctx.fillRect(0, y, 60, height);\r\n\r\n // 绘制分隔线\r\n ctx.strokeStyle = '#ffffff';\r\n ctx.lineWidth = 1;\r\n ctx.strokeRect(0, y, 60, height);\r\n }\r\n\r\n // 渲染离散区间标签 - 根据个数/增量动态生成\r\n labelsContainer.innerHTML = '';\r\n for (let i = 0; i < blockCount; i++) {\r\n // 反转索引:让最大值对应的标签显示在顶部\r\n const reversedIndex = blockCount - 1 - i;\r\n const blockStart = min + reversedIndex * discreteStep;\r\n const blockEnd = Math.min(blockStart + discreteStep, max);\r\n const labelText = `${this.formatNumber(blockStart)}-${this.formatNumber(blockEnd)}`;\r\n\r\n const labelWrapper = document.createElement('div');\r\n const pixelTop = 10 + i * blockHeight + blockHeight / 2;\r\n labelWrapper.style.position = 'absolute';\r\n labelWrapper.style.top = `${pixelTop}px`;\r\n labelWrapper.style.transform = 'translateY(-50%)';\r\n labelWrapper.style.left = '0';\r\n\r\n const label = document.createElement('div');\r\n label.className = 'colorbar-label';\r\n label.textContent = labelText;\r\n labelWrapper.appendChild(label);\r\n\r\n labelsContainer.appendChild(labelWrapper);\r\n }\r\n }\r\n }\r\n\r\n // 对外暴露的获取颜色方法\r\n getColor(value) {\r\n // 处理数组输入\r\n if (Array.isArray(value)) {\r\n return value.map(val => this.getSingleColor(val));\r\n }\r\n // 处理单个数值输入\r\n return this.getSingleColor(value);\r\n }\r\n\r\n // ========== 新增:导出色条为TXT文件 ==========\r\n exportColorScaleToTxt() {\r\n const { min, max, stops, colorLibrary } = this.state;\r\n\r\n // 构造要保存的数据结构\r\n const colorScaleData = {\r\n name: `${colorLibrary}_${new Date().getTime()}`, // 生成唯一名称\r\n min: min,\r\n max: max,\r\n stops: stops.map(stop => ({\r\n value: stop.value,\r\n color: stop.color,\r\n ratio: (stop.value - min) / (max - min) // 保存比例,方便导入后适配新范围\r\n }))\r\n };\r\n\r\n // 转换为JSON字符串并格式化\r\n const jsonString = JSON.stringify(colorScaleData, null, 2);\r\n\r\n // 创建Blob对象(TXT格式)\r\n const blob = new Blob([jsonString], { type: 'text/plain' });\r\n\r\n // 创建下载链接\r\n const url = URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = `color_scale_${colorScaleData.name}.txt`;\r\n document.body.appendChild(a);\r\n\r\n // 触发下载\r\n a.click();\r\n\r\n // 清理\r\n setTimeout(() => {\r\n document.body.removeChild(a);\r\n URL.revokeObjectURL(url);\r\n }, 100);\r\n\r\n this.showSuccessMessage('色条数据已保存为TXT文件');\r\n }\r\n\r\n // ========== 新增:从TXT文件导入色条 ==========\r\n importColorScaleFromTxt(file) {\r\n return new Promise((resolve, reject) => {\r\n if (!file) {\r\n reject('未选择文件');\r\n return;\r\n }\r\n\r\n // 验证文件类型\r\n if (file.type !== 'text/plain' && !file.name.endsWith('.txt')) {\r\n this.showErrorMessage('请选择TXT格式的文件');\r\n reject('文件类型错误');\r\n return;\r\n }\r\n\r\n const reader = new FileReader();\r\n\r\n // 读取文件成功\r\n reader.onload = (e) => {\r\n try {\r\n // 解析JSON数据\r\n const colorScaleData = JSON.parse(e.target.result);\r\n\r\n // 验证数据结构\r\n if (!colorScaleData.name || !Array.isArray(colorScaleData.stops)) {\r\n this.showErrorMessage('TXT文件格式错误:缺少必要字段');\r\n reject('数据格式错误');\r\n return;\r\n }\r\n\r\n // 适配当前的min/max(使用保存的比例重新计算value)\r\n const { min, max } = this.state;\r\n const adaptedStops = colorScaleData.stops.map(stop => ({\r\n value: min + (max - min) * stop.ratio,\r\n color: stop.color\r\n }));\r\n\r\n // 生成唯一标识(避免重复)\r\n const uniqueKey = `custom_${Date.now()}`;\r\n const customLibName = colorScaleData.name || `自定义色条_${new Date().toLocaleString()}`;\r\n\r\n // 1. 添加到原生select\r\n const option = document.createElement('option');\r\n option.value = uniqueKey;\r\n option.textContent = customLibName;\r\n this.colorLibrarySelect.appendChild(option);\r\n\r\n // 2. 添加到自定义下拉选项\r\n const customOption = document.createElement('div');\r\n customOption.className = 'library-option';\r\n customOption.dataset.value = uniqueKey;\r\n customOption.innerHTML = `\r\n <div class=\"option-color-bar\" id=\"${uniqueKey}ColorBar\"></div>\r\n <span class=\"option-text\" title=\"${customLibName}\">${customLibName}</span>\r\n `;\r\n this.libraryOptions.appendChild(customOption);\r\n\r\n // 3. 渲染自定义色条预览\r\n const customColorBar = this.shadowRoot.getElementById(`${uniqueKey}ColorBar`);\r\n this.renderLibraryColorBar(customColorBar,\r\n adaptedStops.map(stop => ({\r\n color: stop.color,\r\n pos: (stop.value - min) / (max - min)\r\n }))\r\n );\r\n\r\n // 4. 绑定事件(和其他选项保持一致)\r\n customOption.addEventListener('click', (e) => {\r\n e.stopPropagation();\r\n const value = customOption.dataset.value;\r\n this.colorLibrarySelect.value = value;\r\n this.state.colorLibrary = value;\r\n\r\n // 渲染选中的色条预览\r\n this.renderSelectedColorBar(value);\r\n\r\n // 关键:使用统一的updateLibraryStops方法\r\n this.updateLibraryStops(value);\r\n\r\n this.libraryOptions.style.display = 'none';\r\n this.renderColorBarPreview();\r\n this.renderPanelColorbar();\r\n });\r\n\r\n customOption.addEventListener('mouseenter', () => {\r\n customOption.style.background = '#f5f5f5';\r\n });\r\n customOption.addEventListener('mouseleave', () => {\r\n customOption.style.background = 'white';\r\n });\r\n\r\n // 5. 更新updateLibraryStops方法的映射(临时存储,刷新后丢失,如需持久化需用localStorage)\r\n // 5. 更新自定义色库映射并保存到localStorage\r\n this.customColorLibs = this.customColorLibs || {};\r\n this.customColorLibs[uniqueKey] = {\r\n name: customLibName,\r\n stops: adaptedStops,\r\n ratios: adaptedStops.map(stop => (stop.value - min) / (max - min))\r\n };\r\n\r\n // ========== 新增:保存到localStorage ==========\r\n try {\r\n localStorage.setItem('chromaColorCustomLibs', JSON.stringify(this.customColorLibs));\r\n } catch (err) {\r\n console.error('保存自定义色库到缓存失败:', err);\r\n this.showErrorMessage('色库导入成功,但缓存保存失败(可能存储空间不足)');\r\n }\r\n\r\n this.showSuccessMessage(`成功导入色条:${customLibName}`);\r\n resolve(uniqueKey);\r\n\r\n } catch (err) {\r\n this.showErrorMessage('解析TXT文件失败:' + err.message);\r\n reject(err);\r\n }\r\n };\r\n\r\n // 读取文件失败\r\n reader.onerror = () => {\r\n this.showErrorMessage('读取文件失败');\r\n reject('文件读取错误');\r\n };\r\n\r\n // 开始读取文件\r\n reader.readAsText(file);\r\n\r\n });\r\n }\r\n\r\n // ========== 新增:从localStorage加载自定义色库 ==========\r\n loadCustomLibsFromStorage() {\r\n try {\r\n const savedLibs = localStorage.getItem('chromaColorCustomLibs');\r\n if (!savedLibs) return;\r\n\r\n this.customColorLibs = JSON.parse(savedLibs);\r\n const { min, max } = this.state;\r\n\r\n // 遍历加载所有保存的自定义色库\r\n Object.keys(this.customColorLibs).forEach(key => {\r\n const lib = this.customColorLibs[key];\r\n\r\n // 1. 添加到原生select\r\n const option = document.createElement('option');\r\n option.value = key;\r\n option.textContent = lib.name;\r\n this.colorLibrarySelect.appendChild(option);\r\n\r\n // 2. 添加到自定义下拉选项\r\n const customOption = document.createElement('div');\r\n customOption.className = 'library-option';\r\n customOption.dataset.value = key;\r\n customOption.innerHTML = `\r\n <div class=\"option-color-bar\" id=\"${key}ColorBar\"></div>\r\n <span class=\"option-text\" title=\"${lib.name}\">${lib.name}</span>\r\n `;\r\n this.libraryOptions.appendChild(customOption);\r\n\r\n // 3. 渲染自定义色条预览\r\n const customColorBar = this.shadowRoot.getElementById(`${key}ColorBar`);\r\n this.renderLibraryColorBar(customColorBar,\r\n lib.stops.map((stop, index) => ({\r\n color: stop.color,\r\n pos: lib.ratios[index] // 使用保存的比例,而不是计算值\r\n }))\r\n );\r\n\r\n // 4. 绑定事件(简化,统一使用内置逻辑)\r\n const _this = this;\r\n customOption.addEventListener('click', (e) => {\r\n e.stopPropagation();\r\n const value = customOption.dataset.value;\r\n _this.colorLibrarySelect.value = value;\r\n _this.state.colorLibrary = value;\r\n\r\n // 关键:使用统一的updateLibraryStops方法更新配置\r\n _this.updateLibraryStops(value);\r\n // 渲染选中的色条预览\r\n _this.renderSelectedColorBar(value);\r\n\r\n _this.libraryOptions.style.display = 'none';\r\n _this.renderColorBarPreview();\r\n _this.renderPanelColorbar();\r\n });\r\n\r\n customOption.addEventListener('mouseenter', () => {\r\n customOption.style.background = '#f5f5f5';\r\n });\r\n customOption.addEventListener('mouseleave', () => {\r\n customOption.style.background = 'white';\r\n });\r\n });\r\n } catch (err) {\r\n console.error('加载保存的自定义色库失败:', err);\r\n this.showErrorMessage('加载保存的色库失败,将使用默认配置');\r\n }\r\n }\r\n\r\n // 内部辅助方法:获取单个数值对应的颜色\r\n getSingleColor(num) {\r\n const { min, max, stops, displayMode } = this.state;\r\n\r\n // 【关键修改】边界值处理:不在范围内直接返回null\r\n if (num < min || num > max) {\r\n return null;\r\n }\r\n\r\n // 基于chroma-js计算渐变颜色(和色条渲染逻辑保持一致)\r\n const sortedStops = [...stops].sort((a, b) => a.value - b.value);\r\n const colorScale = chroma.scale(\r\n sortedStops.map(s => s.color)\r\n ).domain(\r\n sortedStops.map(s => s.value)\r\n );\r\n\r\n return colorScale(num).hex();\r\n }\r\n}\r\n\r\n// 注册自定义元素\r\nif (!customElements.get('chroma-color-scale')) {\r\n customElements.define('chroma-color-scale', ChromaColorScale);\r\n}"],"names":["limit","x","low","high","min","max","clip_rgb","rgb","_clipped","_unclipped","slice","i","classToType","name","toLowerCase","type","obj","Object","prototype","toString","call","unpack","args","keyOrder","length","Array","split","filter","k","undefined","map","last","l","PI","Math","TWOPI","PITHIRD","DEG2RAD","RAD2DEG","input","format","autodetect","Color","constructor","me","this","mode","_input","sorted","sort","a","b","p","chk","test","Error","apply","_rgb","push","hex","join","chroma","version","cmyk","r","g","f","rgb2cmyk","c","m","y","alpha","rnd","round","rgb2hsl","minRgb","maxRgb","s","h","Number","NaN","rgb2css","rgba","substr","hsla","hsl2css","hsl2rgb","t3","t2","t1","h_","RE_RGB","RE_RGBA","RE_RGB_PCT","RE_RGBA_PCT","RE_HSL","RE_HSLA","css2rgb","css","trim","named","e","match","hsl","rest","gl","floor","hcg","delta","_g","rgb2hcg","_c","q","t","v","RE_HEX","RE_HEXA","hex2rgb","u","parseInt","rgb2hex","str","hxa","indexOf","cos","sqrt","acos","hsi","min_","rgb2hsi","isNaN","hsv","max_","rgb2hsv","LAB_CONSTANTS","pow","lab2rgb","z","b_","lab_xyz","xyz_rgb","rgb2lab","rgb2xyz","rgb_xyz","xyz_lab","lab","sin","lch2lab","lch2rgb","L","atan2","lab2lch","rgb2lch","lch","hcl","reverse","forEach","w3cx11","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","green","greenyellow","grey","honeydew","hotpink","indianred","indigo","ivory","khaki","laserlemon","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrod","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","maroon2","maroon3","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","purple2","purple3","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","n","keys","num","rgb2num","log","temperature2rgb","kelvin","temp","temperature","minTemp","maxTemp","rgb2temperature","sign","oklab2rgb","lrgb2rgb","abs","cbrt","rgb2oklab","lr","lg","lb","rgb2lrgb","oklab","oklch","rgb2oklch","mutate","clipped","darken","amount","brighten","darker","brighter","get","mc","channel","src","luminance","lum","cur_lum","max_iter","mid","interpolate","lm","rgb2luminance","luminance_x","index","mix","col1","col2","interpolator","premultiply","saturate","desaturate","set","value","charAt","out","tint","shade","xyz0","xyz1","lrgb","x1","y1","z1","x2","y2","z2","interpolate_hsx","hue0","hue1","sat0","sat1","lbv0","lbv1","sat","hue","lbv","dh","c1","c2","_average_lrgb","colors","weights","xyz","col","scale","_mode","_nacol","_spread","_domain","_pos","_padding","_classes","_colors","_out","_min","_max","_correctLightness","_colorCache","_useCache","_gamma","setColors","brewer","resetCache","tMapLightness","tMapDomain","getColor","val","bypassMap","getClass","classes","d","analyze","limits","domain","arguments","from","tOut","tBreaks","every","_m","range","_o","spread","correctLightness","L0","L1","pol","L_actual","L_ideal","L_diff","t0","padding","numColors","result","dm","dd","left","right","inclusive","ascending","end","__range__","samples","asc","cache","gamma","nodata","blend","bottom","top","blend_f","c0","each","normal","multiply","screen","overlay","lighten","dodge","burn","random","data","key","MAX_VALUE","sum","values","count","min_log","LOG10E","max_log","pb","pr","cluster","assignments","clusterSizes","repeat","nb_iters","centroids","j","best","mindist","dist","newCentroids","kClusters","tmpKMeansBreaks","exp","scales","cool","hot","colorbrewer","OrRd","PuBu","BuPu","Oranges","BuGn","YlOrBr","YlGn","Reds","RdPu","Greens","YlGnBu","Purples","GnBu","Greys","YlOrRd","PuRd","Blues","PuBuGn","Viridis","Spectral","RdYlGn","RdBu","PiYG","PRGn","RdYlBu","BrBG","RdGy","PuOr","Set2","Accent","Set1","Set3","Dark2","Paired","Pastel2","Pastel1","assign","average","reduce","w","first","shift","cnt","dx","dy","A","ci","xyz2","bezier","I","lab0","lab1","lab2","lab3","RangeError","labs","row","newrow","binom_row","el","cubehelix","start","rotations","lightness","dl","fract","amp","cos_a","sin_a","code","contrast","l1","l2","deltaE","Kl","Kc","Kh","rad2deg","rad","deg2rad","deg","a1","b1","L2","a2","b2","avgL","avgC","G","a1p","a2p","C1p","C2p","avgCp","arctan1","arctan2","h1p","h2p","avgHp","T","deltaHp","deltaL","deltaCp","sl","sc","sh","deltaTheta","Rt","distance","sum_sq","valid","ChromaColorScale","HTMLElement","observedAttributes","attributeChangedCallback","oldValue","newValue","numValue","state","showErrorMessage","minInput","maxInput","step","calculateOptimalStep","renderColorBarPreview","renderPanelColorbar","super","shadow","attachShadow","innerHTML","messageStyle","colorBarPreview","getElementById","previewCanvas","valueLabels","settingPanel","panelHandle","setRangeBtn","displayModeRadios","querySelectorAll","labelTypeRadios","precisionInput","scientificCheckbox","colorLibrarySelect","colorbarLabels","panelColorbar","resetBtn","confirmBtn","cancelBtn","applyBtn","rangeModeRadios","rangeCountInput","rangeStepInput","librarySelectContainer","libraryOptions","libraryOptionItems","customSelectDisplay","selectedColorBar","defaultColorBar","BlkWhiCltColorBar","BlkWhiYlwColorBar","BluWhiCltColorBar","messageContainer","initialMin","hasAttribute","getAttribute","initialMax","initialStep","displayMode","labelType","precision","scientific","colorLibrary","rangeMode","rangeCount","rangeStep","originalStopRatios","stops","color","panelVisible","originalState","panelPosition","dragState","isDragging","draggingStopIndex","dragStartY","dragStartValue","canvasRect","colorPickerState","isOpen","targetStop","saturation","pickerElement","isDraggingHue","isDraggingSpectrum","initLibraryColorBars","renderSelectedColorBar","loadCustomLibsFromStorage","bindEvents","saveOriginalState","content","messageItem","document","createElement","className","appendChild","setTimeout","style","animation","removeChild","showSuccessMessage","lib","canvas","width","height","ctx","getContext","gradient","createLinearGradient","customColorLibs","customLib","ratios","ratio","addColorStop","fillStyle","fillRect","strokeStyle","lineWidth","strokeRect","renderLibraryColorBar","pos","container","colorStops","stop","calculateDefaultStep","generateRandomColor","calculateStepByRangeMode","calculateDiscreteBlockCount","ceil","log10","steps","optimalStep","targetLabels","openColorPicker","closeColorPicker","picker","viewportWidth","window","innerWidth","viewportHeight","innerHeight","currentColor","shadowRoot","spectrum","querySelector","spectrumHandle","hueBar","hueHandle","colorInput","preview","closeBtn","_this","updateSpectrumBg","hueColor","background","updateColorPreview","addEventListener","rect","getBoundingClientRect","clientX","clientY","target","err","clickOutsideHandler","clickOutside","contains","removeEventListener","importLibBtn","saveLibBtn","exportColorScaleToTxt","fileInput","accept","file","files","importColorScaleFromTxt","click","stopPropagation","classList","add","updatePanelPosition","startX","startY","initialTop","initialRight","isDraggingPanel","body","cursor","deltaX","deltaY","newStep","radio","id","disabled","remove","checked","display","item","dataset","updateLibraryStops","resetMin","resetMax","resetStep","dispatchEvent","CustomEvent","detail","JSON","parse","stringify","bubbles","composed","clickValue","getValueFromY","tolerance","targetIndex","findIndex","splice","newColor","preventDefault","find","findClosestStop","currentStop","sortedStops","currentIndexInSorted","clampedValue","MouseEvent","canvasHeight","closestIndex","minDiff","Infinity","diff","formatNumber","toExponential","toFixed","labelsContainer","containerHeight","clientHeight","clearRect","reversedPercent","usableHeight","currentVal","label","textContent","pixelTop","position","transform","blockCount","blockHeight","discreteStep","colorScale","blockStart","blockMidValue","blockColor","blockEnd","labelText","imageSmoothingEnabled","fillColor","save","beginPath","moveTo","lineTo","barRightX","blockH","closePath","fill","lineJoin","stroke","restore","labelWrapper","isArray","getSingleColor","colorScaleData","Date","getTime","jsonString","blob","Blob","url","URL","createObjectURL","href","download","revokeObjectURL","Promise","resolve","reject","endsWith","reader","FileReader","onload","adaptedStops","uniqueKey","now","customLibName","toLocaleString","option","customOption","customColorBar","localStorage","setItem","console","error","message","onerror","readAsText","savedLibs","getItem","customElements","define"],"mappings":"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"}