colorsort-js 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.
Files changed (44) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +17 -0
  3. package/dist/colorsort.js +5412 -0
  4. package/dist/colorsort.js.map +1 -0
  5. package/dist/colorsort.umd.cjs +5 -0
  6. package/dist/colorsort.umd.cjs.map +1 -0
  7. package/dist/trained.json +1804 -0
  8. package/dist/types/src/auto-sort.d.ts +1 -0
  9. package/dist/types/src/auto.d.ts +6 -0
  10. package/dist/types/src/color.d.ts +42 -0
  11. package/dist/types/src/fft.d.ts +3 -0
  12. package/dist/types/src/genetic-algo.d.ts +63 -0
  13. package/dist/types/src/index.d.ts +23 -0
  14. package/dist/types/src/method-runner.d.ts +21 -0
  15. package/dist/types/src/metrics-extended.d.ts +27 -0
  16. package/dist/types/src/metrics-fft.d.ts +44 -0
  17. package/dist/types/src/metrics-hilbert.d.ts +9 -0
  18. package/dist/types/src/metrics-spectral-similarity.d.ts +21 -0
  19. package/dist/types/src/metrics-spectral.d.ts +55 -0
  20. package/dist/types/src/metrics.d.ts +8 -0
  21. package/dist/types/src/randomizer.d.ts +1 -0
  22. package/dist/types/src/resample.d.ts +6 -0
  23. package/dist/types/src/similarity.d.ts +8 -0
  24. package/dist/types/src/sorting-methods/clustering.d.ts +34 -0
  25. package/dist/types/src/sorting-methods/genetic.d.ts +3 -0
  26. package/dist/types/src/sorting-methods/graph.d.ts +14 -0
  27. package/dist/types/src/sorting-methods/harmonize.d.ts +22 -0
  28. package/dist/types/src/sorting-methods/hilbert.d.ts +14 -0
  29. package/dist/types/src/sorting-methods/index.d.ts +21 -0
  30. package/dist/types/src/sorting-methods/momentum.d.ts +12 -0
  31. package/dist/types/src/sorting-methods/principal.d.ts +9 -0
  32. package/dist/types/src/sorting-methods/radial.d.ts +17 -0
  33. package/dist/types/src/sorting-methods/ramp.d.ts +77 -0
  34. package/dist/types/src/sorting-methods/raw.d.ts +7 -0
  35. package/dist/types/src/sorting-methods/spectral.d.ts +26 -0
  36. package/dist/types/src/spectral-edit.d.ts +53 -0
  37. package/dist/types/src/statistics.d.ts +12 -0
  38. package/dist/types/src/type-detect.d.ts +16 -0
  39. package/dist/types/src/type-relative.d.ts +2 -0
  40. package/dist/types/src/type-variances.d.ts +19 -0
  41. package/dist/types/src/uni-neighbors.d.ts +6 -0
  42. package/dist/types/src/uni-tsp.d.ts +2 -0
  43. package/dist/types/src/vector.d.ts +15 -0
  44. package/package.json +61 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colorsort.umd.cjs","sources":["../src/statistics.ts","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/utils/limit.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/utils/clip_rgb.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/utils/type.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/utils/unpack.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/utils/last.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/utils/index.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/input.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/Color.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/version.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/chroma.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/colors/w3cx11.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/hex/hex2rgb.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/hex/rgb2hex.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/named/index.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/ops/alpha.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/ops/clipped.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/lab/lab-constants.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/lab/lab2rgb.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/lab/rgb2lab.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/lab/index.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/ops/darken.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/ops/get.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/ops/luminance.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/interpolator/index.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/generator/mix.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/ops/mix.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/ops/premultiply.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/lch/lch2lab.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/lch/lch2rgb.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/lch/hcl2rgb.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/lch/lab2lch.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/lch/rgb2lch.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/lch/index.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/ops/saturate.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/ops/set.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/ops/shade.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/interpolator/rgb.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/interpolator/lrgb.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/interpolator/lab.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/interpolator/_hsx.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/interpolator/lch.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/num/num2rgb.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/num/rgb2num.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/num/index.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/interpolator/num.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/hcg/hcg2rgb.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/hcg/rgb2hcg.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/hcg/index.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/interpolator/hcg.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/hsi/hsi2rgb.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/hsi/rgb2hsi.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/hsi/index.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/interpolator/hsi.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/hsl/hsl2rgb.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/hsl/rgb2hsl.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/hsl/index.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/interpolator/hsl.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/hsv/hsv2rgb.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/hsv/rgb2hsv.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/hsv/index.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/interpolator/hsv.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/utils/multiply-matrices.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/oklab/oklab2rgb.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/oklab/rgb2oklab.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/oklab/index.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/interpolator/oklab.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/interpolator/oklch.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/generator/average.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/generator/scale.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/generator/bezier.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/rgb/index.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/generator/blend.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/generator/cubehelix.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/generator/random.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/utils/analyze.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/utils/contrast.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/utils/contrastAPCA.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/utils/delta-e.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/utils/distance.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/utils/valid.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/utils/scales.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/colors/colorbrewer.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/cmyk/cmyk2rgb.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/cmyk/rgb2cmyk.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/cmyk/index.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/css/hsl2css.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/css/lab2css.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/css/lch2css.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/css/oklab2css.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/oklch/rgb2oklch.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/css/oklch2css.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/css/rgb2css.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/oklch/oklch2rgb.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/css/css2rgb.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/css/index.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/gl/index.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/hex/index.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/temp/temperature2rgb.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/temp/rgb2temperature.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/temp/index.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/oklch/index.js","../../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/index.js","../../../node_modules/.pnpm/culori@4.0.2/node_modules/culori/src/rgb/parseNumber.js","../../../node_modules/.pnpm/culori@4.0.2/node_modules/culori/src/colors/named.js","../../../node_modules/.pnpm/culori@4.0.2/node_modules/culori/src/rgb/parseNamed.js","../../../node_modules/.pnpm/culori@4.0.2/node_modules/culori/src/rgb/parseHex.js","../../../node_modules/.pnpm/culori@4.0.2/node_modules/culori/src/util/regex.js","../../../node_modules/.pnpm/culori@4.0.2/node_modules/culori/src/rgb/parseRgbLegacy.js","../../../node_modules/.pnpm/culori@4.0.2/node_modules/culori/src/_prepare.js","../../../node_modules/.pnpm/culori@4.0.2/node_modules/culori/src/converter.js","../../../node_modules/.pnpm/culori@4.0.2/node_modules/culori/src/modes.js","../../../node_modules/.pnpm/culori@4.0.2/node_modules/culori/src/parse.js","../../../node_modules/.pnpm/culori@4.0.2/node_modules/culori/src/rgb/parseRgb.js","../../../node_modules/.pnpm/culori@4.0.2/node_modules/culori/src/rgb/parseTransparent.js","../../../node_modules/.pnpm/culori@4.0.2/node_modules/culori/src/interpolate/lerp.js","../../../node_modules/.pnpm/culori@4.0.2/node_modules/culori/src/interpolate/piecewise.js","../../../node_modules/.pnpm/culori@4.0.2/node_modules/culori/src/interpolate/linear.js","../../../node_modules/.pnpm/culori@4.0.2/node_modules/culori/src/fixup/alpha.js","../../../node_modules/.pnpm/culori@4.0.2/node_modules/culori/src/rgb/definition.js","../../../node_modules/.pnpm/culori@4.0.2/node_modules/culori/src/lrgb/convertRgbToLrgb.js","../../../node_modules/.pnpm/culori@4.0.2/node_modules/culori/src/lrgb/convertLrgbToRgb.js","../../../node_modules/.pnpm/culori@4.0.2/node_modules/culori/src/util/normalizeHue.js","../../../node_modules/.pnpm/culori@4.0.2/node_modules/culori/src/fixup/hue.js","../../../node_modules/.pnpm/culori@4.0.2/node_modules/culori/src/difference.js","../../../node_modules/.pnpm/culori@4.0.2/node_modules/culori/src/average.js","../../../node_modules/.pnpm/culori@4.0.2/node_modules/culori/src/lch/convertLabToLch.js","../../../node_modules/.pnpm/culori@4.0.2/node_modules/culori/src/lch/convertLchToLab.js","../../../node_modules/.pnpm/culori@4.0.2/node_modules/culori/src/constants.js","../../../node_modules/.pnpm/culori@4.0.2/node_modules/culori/src/hsl/convertHslToRgb.js","../../../node_modules/.pnpm/culori@4.0.2/node_modules/culori/src/hsl/convertRgbToHsl.js","../../../node_modules/.pnpm/culori@4.0.2/node_modules/culori/src/util/hue.js","../../../node_modules/.pnpm/culori@4.0.2/node_modules/culori/src/hsl/parseHslLegacy.js","../../../node_modules/.pnpm/culori@4.0.2/node_modules/culori/src/hsl/parseHsl.js","../../../node_modules/.pnpm/culori@4.0.2/node_modules/culori/src/hsl/definition.js","../../../node_modules/.pnpm/culori@4.0.2/node_modules/culori/src/hsv/convertHsvToRgb.js","../../../node_modules/.pnpm/culori@4.0.2/node_modules/culori/src/hsv/convertRgbToHsv.js","../../../node_modules/.pnpm/culori@4.0.2/node_modules/culori/src/hsv/definition.js","../../../node_modules/.pnpm/culori@4.0.2/node_modules/culori/src/xyz50/constants.js","../../../node_modules/.pnpm/culori@4.0.2/node_modules/culori/src/lab/convertLabToXyz50.js","../../../node_modules/.pnpm/culori@4.0.2/node_modules/culori/src/xyz50/convertXyz50ToRgb.js","../../../node_modules/.pnpm/culori@4.0.2/node_modules/culori/src/lab/convertLabToRgb.js","../../../node_modules/.pnpm/culori@4.0.2/node_modules/culori/src/xyz50/convertRgbToXyz50.js","../../../node_modules/.pnpm/culori@4.0.2/node_modules/culori/src/lab/convertXyz50ToLab.js","../../../node_modules/.pnpm/culori@4.0.2/node_modules/culori/src/lab/convertRgbToLab.js","../../../node_modules/.pnpm/culori@4.0.2/node_modules/culori/src/lab/parseLab.js","../../../node_modules/.pnpm/culori@4.0.2/node_modules/culori/src/lab/definition.js","../../../node_modules/.pnpm/culori@4.0.2/node_modules/culori/src/lch/parseLch.js","../../../node_modules/.pnpm/culori@4.0.2/node_modules/culori/src/lch/definition.js","../../../node_modules/.pnpm/culori@4.0.2/node_modules/culori/src/oklab/convertLrgbToOklab.js","../../../node_modules/.pnpm/culori@4.0.2/node_modules/culori/src/oklab/convertRgbToOklab.js","../../../node_modules/.pnpm/culori@4.0.2/node_modules/culori/src/oklab/convertOklabToLrgb.js","../../../node_modules/.pnpm/culori@4.0.2/node_modules/culori/src/oklab/convertOklabToRgb.js","../../../node_modules/.pnpm/culori@4.0.2/node_modules/culori/src/okhsl/helpers.js","../../../node_modules/.pnpm/culori@4.0.2/node_modules/culori/src/okhsl/convertOklabToOkhsl.js","../../../node_modules/.pnpm/culori@4.0.2/node_modules/culori/src/okhsl/convertOkhslToOklab.js","../../../node_modules/.pnpm/culori@4.0.2/node_modules/culori/src/okhsl/modeOkhsl.js","../../../node_modules/.pnpm/culori@4.0.2/node_modules/culori/src/okhsv/convertOklabToOkhsv.js","../../../node_modules/.pnpm/culori@4.0.2/node_modules/culori/src/okhsv/convertOkhsvToOklab.js","../../../node_modules/.pnpm/culori@4.0.2/node_modules/culori/src/okhsv/modeOkhsv.js","../../../node_modules/.pnpm/culori@4.0.2/node_modules/culori/src/oklab/parseOklab.js","../../../node_modules/.pnpm/culori@4.0.2/node_modules/culori/src/oklab/definition.js","../../../node_modules/.pnpm/culori@4.0.2/node_modules/culori/src/oklch/parseOklch.js","../../../node_modules/.pnpm/culori@4.0.2/node_modules/culori/src/oklch/definition.js","../../../node_modules/.pnpm/culori@4.0.2/node_modules/culori/src/formatter.js","../src/color.ts","../src/vector.ts","../src/method-runner.ts","../src/sorting-methods/hilbert.ts","../src/genetic-algo.ts","../src/metrics.ts","../src/sorting-methods/genetic.ts","../src/uni-tsp.ts","../src/sorting-methods/principal.ts","../src/sorting-methods/radial.ts","../src/randomizer.ts","../src/uni-neighbors.ts","../src/sorting-methods/clustering.ts","../src/sorting-methods/harmonize.ts","../src/type-relative.ts","../src/type-variances.ts","../src/type-detect.ts","../src/sorting-methods/graph.ts","../src/sorting-methods/momentum.ts","../src/sorting-methods/ramp.ts","../src/sorting-methods/raw.ts","../src/sorting-methods/index.ts","../src/metrics-extended.ts","../src/similarity.ts","../src/resample.ts","../../../node_modules/.pnpm/fft.js@4.0.4/node_modules/fft.js/lib/fft.js","../src/fft.ts","../src/metrics-spectral.ts","../src/metrics-fft.ts","../src/metrics-spectral-similarity.ts","../src/spectral-edit.ts","../src/auto.ts","../src/auto-sort.ts","../src/index.ts"],"sourcesContent":["export function variance(arr: number[]) {\n const m = mean(arr)\n return mean(arr.map((x) => (x - m) ** 2))\n}\n\nexport function mean(arr: number[]) {\n return arr.reduce((a, b) => a + b, 0) / arr.length\n}\n\nexport function energy(magnitudes: number[]) {\n return magnitudes.reduce((sum, m) => sum + m * m, 0)\n}\n\nexport function highFreqRatio(magnitudes: number[]) {\n const cutoff = Math.floor(magnitudes.length * 0.4)\n const highFreqEnergy = magnitudes.slice(cutoff).reduce((sum, m) => sum + m * m, 0)\n const totalEnergy = energy(magnitudes)\n return totalEnergy > 0 ? highFreqEnergy / totalEnergy : 0\n}\n\nexport function round2(x: number) {\n return Math.round((x || 0) * 100) / 100\n}\n\nexport function round3(x: number) {\n return Math.round((x || 0) * 1000) / 1000\n}\n\nexport function round4(x: number) {\n return Math.round((x || 0) * 10000) / 10000\n}\n\n/**\n * Interpolate NaN values in a signal using surrounding valid values\n * This prevents false discontinuities in FFT when achromatic colors produce NaN\n */\nexport function interpolateNaNs(signal: number[]): number[] {\n const result = [...signal]\n\n for (let i = 0; i < result.length; i++) {\n if (!isFinite(result[i])) {\n // Find previous valid value\n let prevIdx = i - 1\n while (prevIdx >= 0 && !isFinite(result[prevIdx])) {\n prevIdx--\n }\n\n // Find next valid value\n let nextIdx = i + 1\n while (nextIdx < result.length && !isFinite(result[nextIdx])) {\n nextIdx++\n }\n\n // Interpolate\n if (prevIdx >= 0 && nextIdx < result.length) {\n // Both neighbors exist - linear interpolation\n const prevVal = result[prevIdx]\n const nextVal = result[nextIdx]\n const span = nextIdx - prevIdx\n const offset = i - prevIdx\n result[i] = prevVal + (nextVal - prevVal) * (offset / span)\n } else if (prevIdx >= 0) {\n // Only previous exists - use it\n result[i] = result[prevIdx]\n } else if (nextIdx < result.length) {\n // Only next exists - use it\n result[i] = result[nextIdx]\n } else {\n // No valid values at all - use 0\n result[i] = 0\n }\n }\n }\n\n return result\n}\n","const { min, max } = Math;\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].slice(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\nconst rnd2 = (a) => Math.round(a * 100) / 100;\nconst rnd3 = (a) => Math.round(a * 100) / 100;\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\n/**\n * Reverse the first three elements of an array\n *\n * @param {any[]} arr\n * @returns {any[]}\n */\nfunction reverse3(arr) {\n return [...arr.slice(0, 3).reverse(), ...arr.slice(3)];\n}\n\nexport { PI, TWOPI, PITHIRD, DEG2RAD, RAD2DEG, min, max, rnd2, rnd3, reverse3 };\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\n if (!_input.sorted) {\n _input.autodetect = _input.autodetect.sort((a, b) => b.p - a.p);\n _input.sorted = true;\n }\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 = '3.2.0';\n","import Color from './Color.js';\nimport { version } from './version.js';\n\nconst chroma = (...args) => {\n return new Color(...args);\n};\n\nchroma.version = version;\n\nexport default chroma;\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","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 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 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","const labConstants = {\n // Corresponds roughly to RGB brighter/darker\n Kn: 18,\n\n // D65 standard referent\n labWhitePoint: 'd65',\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 kE: 216.0 / 24389.0,\n kKE: 8.0,\n kK: 24389.0 / 27.0,\n\n RefWhiteRGB: {\n // sRGB\n X: 0.95047,\n Y: 1,\n Z: 1.08883\n },\n\n MtxRGB2XYZ: {\n m00: 0.4124564390896922,\n m01: 0.21267285140562253,\n m02: 0.0193338955823293,\n m10: 0.357576077643909,\n m11: 0.715152155287818,\n m12: 0.11919202588130297,\n m20: 0.18043748326639894,\n m21: 0.07217499330655958,\n m22: 0.9503040785363679\n },\n\n MtxXYZ2RGB: {\n m00: 3.2404541621141045,\n m01: -0.9692660305051868,\n m02: 0.055643430959114726,\n m10: -1.5371385127977166,\n m11: 1.8760108454466942,\n m12: -0.2040259135167538,\n m20: -0.498531409556016,\n m21: 0.041556017530349834,\n m22: 1.0572251882231791\n },\n\n // used in rgb2xyz\n As: 0.9414285350000001,\n Bs: 1.040417467,\n Cs: 1.089532651,\n\n MtxAdaptMa: {\n m00: 0.8951,\n m01: -0.7502,\n m02: 0.0389,\n m10: 0.2664,\n m11: 1.7135,\n m12: -0.0685,\n m20: -0.1614,\n m21: 0.0367,\n m22: 1.0296\n },\n\n MtxAdaptMaI: {\n m00: 0.9869929054667123,\n m01: 0.43230526972339456,\n m02: -0.008528664575177328,\n m10: -0.14705425642099013,\n m11: 0.5183602715367776,\n m12: 0.04004282165408487,\n m20: 0.15996265166373125,\n m21: 0.0492912282128556,\n m22: 0.9684866957875502\n }\n};\n\nexport default labConstants;\n\n// taken from https://de.mathworks.com/help/images/ref/whitepoint.html\nconst ILLUMINANTS = new Map([\n // ASTM E308-01\n ['a', [1.0985, 0.35585]],\n // Wyszecki & Stiles, p. 769\n ['b', [1.0985, 0.35585]],\n // C ASTM E308-01\n ['c', [0.98074, 1.18232]],\n // D50 (ASTM E308-01)\n ['d50', [0.96422, 0.82521]],\n // D55 (ASTM E308-01)\n ['d55', [0.95682, 0.92149]],\n // D65 (ASTM E308-01)\n ['d65', [0.95047, 1.08883]],\n // E (ASTM E308-01)\n ['e', [1, 1, 1]],\n // F2 (ASTM E308-01)\n ['f2', [0.99186, 0.67393]],\n // F7 (ASTM E308-01)\n ['f7', [0.95041, 1.08747]],\n // F11 (ASTM E308-01)\n ['f11', [1.00962, 0.6435]],\n ['icc', [0.96422, 0.82521]]\n]);\n\nexport function setLabWhitePoint(name) {\n const ill = ILLUMINANTS.get(String(name).toLowerCase());\n if (!ill) {\n throw new Error('unknown Lab illuminant ' + name);\n }\n labConstants.labWhitePoint = name;\n labConstants.Xn = ill[0];\n labConstants.Zn = ill[1];\n}\n\nexport function getLabWhitePoint() {\n return labConstants.labWhitePoint;\n}\n","import LAB_CONSTANTS from './lab-constants.js';\nimport { unpack } from '../../utils/index.js';\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 const [x, y, z] = lab2xyz(L, a, b);\n const [r, g, b_] = xyz2rgb(x, y, z);\n return [r, g, b_, args.length > 3 ? args[3] : 1];\n};\n\nconst lab2xyz = (L, a, b) => {\n const { kE, kK, kKE, Xn, Yn, Zn } = LAB_CONSTANTS;\n\n const fy = (L + 16.0) / 116.0;\n const fx = 0.002 * a + fy;\n const fz = fy - 0.005 * b;\n\n const fx3 = fx * fx * fx;\n const fz3 = fz * fz * fz;\n\n const xr = fx3 > kE ? fx3 : (116.0 * fx - 16.0) / kK;\n const yr = L > kKE ? Math.pow((L + 16.0) / 116.0, 3.0) : L / kK;\n const zr = fz3 > kE ? fz3 : (116.0 * fz - 16.0) / kK;\n\n const x = xr * Xn;\n const y = yr * Yn;\n const z = zr * Zn;\n\n return [x, y, z];\n};\n\nconst compand = (linear) => {\n /* sRGB */\n const sign = Math.sign(linear);\n linear = Math.abs(linear);\n return (\n (linear <= 0.0031308\n ? linear * 12.92\n : 1.055 * Math.pow(linear, 1.0 / 2.4) - 0.055) * sign\n );\n};\n\nconst xyz2rgb = (x, y, z) => {\n const { MtxAdaptMa, MtxAdaptMaI, MtxXYZ2RGB, RefWhiteRGB, Xn, Yn, Zn } =\n LAB_CONSTANTS;\n\n const As = Xn * MtxAdaptMa.m00 + Yn * MtxAdaptMa.m10 + Zn * MtxAdaptMa.m20;\n const Bs = Xn * MtxAdaptMa.m01 + Yn * MtxAdaptMa.m11 + Zn * MtxAdaptMa.m21;\n const Cs = Xn * MtxAdaptMa.m02 + Yn * MtxAdaptMa.m12 + Zn * MtxAdaptMa.m22;\n\n const Ad =\n RefWhiteRGB.X * MtxAdaptMa.m00 +\n RefWhiteRGB.Y * MtxAdaptMa.m10 +\n RefWhiteRGB.Z * MtxAdaptMa.m20;\n const Bd =\n RefWhiteRGB.X * MtxAdaptMa.m01 +\n RefWhiteRGB.Y * MtxAdaptMa.m11 +\n RefWhiteRGB.Z * MtxAdaptMa.m21;\n const Cd =\n RefWhiteRGB.X * MtxAdaptMa.m02 +\n RefWhiteRGB.Y * MtxAdaptMa.m12 +\n RefWhiteRGB.Z * MtxAdaptMa.m22;\n\n const X1 =\n (x * MtxAdaptMa.m00 + y * MtxAdaptMa.m10 + z * MtxAdaptMa.m20) *\n (Ad / As);\n const Y1 =\n (x * MtxAdaptMa.m01 + y * MtxAdaptMa.m11 + z * MtxAdaptMa.m21) *\n (Bd / Bs);\n const Z1 =\n (x * MtxAdaptMa.m02 + y * MtxAdaptMa.m12 + z * MtxAdaptMa.m22) *\n (Cd / Cs);\n\n const X2 =\n X1 * MtxAdaptMaI.m00 + Y1 * MtxAdaptMaI.m10 + Z1 * MtxAdaptMaI.m20;\n const Y2 =\n X1 * MtxAdaptMaI.m01 + Y1 * MtxAdaptMaI.m11 + Z1 * MtxAdaptMaI.m21;\n const Z2 =\n X1 * MtxAdaptMaI.m02 + Y1 * MtxAdaptMaI.m12 + Z1 * MtxAdaptMaI.m22;\n\n const r = compand(\n X2 * MtxXYZ2RGB.m00 + Y2 * MtxXYZ2RGB.m10 + Z2 * MtxXYZ2RGB.m20\n );\n const g = compand(\n X2 * MtxXYZ2RGB.m01 + Y2 * MtxXYZ2RGB.m11 + Z2 * MtxXYZ2RGB.m21\n );\n const b = compand(\n X2 * MtxXYZ2RGB.m02 + Y2 * MtxXYZ2RGB.m12 + Z2 * MtxXYZ2RGB.m22\n );\n\n return [r * 255, g * 255, b * 255];\n};\n\nexport default lab2rgb;\nexport { xyz2rgb };\n","import LAB_CONSTANTS from './lab-constants.js';\nimport { unpack } from '../../utils/index.js';\n\nconst rgb2lab = (...args) => {\n const [r, g, b, ...rest] = unpack(args, 'rgb');\n const [x, y, z] = rgb2xyz(r, g, b);\n const [L, a, b_] = xyz2lab(x, y, z);\n return [L, a, b_, ...(rest.length > 0 && rest[0] < 1 ? [rest[0]] : [])];\n};\n\nfunction xyz2lab(x, y, z) {\n const { Xn, Yn, Zn, kE, kK } = LAB_CONSTANTS;\n const xr = x / Xn;\n const yr = y / Yn;\n const zr = z / Zn;\n\n const fx = xr > kE ? Math.pow(xr, 1.0 / 3.0) : (kK * xr + 16.0) / 116.0;\n const fy = yr > kE ? Math.pow(yr, 1.0 / 3.0) : (kK * yr + 16.0) / 116.0;\n const fz = zr > kE ? Math.pow(zr, 1.0 / 3.0) : (kK * zr + 16.0) / 116.0;\n\n return [116.0 * fy - 16.0, 500.0 * (fx - fy), 200.0 * (fy - fz)];\n}\n\nfunction gammaAdjustSRGB(companded) {\n const sign = Math.sign(companded);\n companded = Math.abs(companded);\n const linear =\n companded <= 0.04045\n ? companded / 12.92\n : Math.pow((companded + 0.055) / 1.055, 2.4);\n return linear * sign;\n}\n\nconst rgb2xyz = (r, g, b) => {\n // normalize and gamma adjust\n r = gammaAdjustSRGB(r / 255);\n g = gammaAdjustSRGB(g / 255);\n b = gammaAdjustSRGB(b / 255);\n\n const { MtxRGB2XYZ, MtxAdaptMa, MtxAdaptMaI, Xn, Yn, Zn, As, Bs, Cs } =\n LAB_CONSTANTS;\n\n let x = r * MtxRGB2XYZ.m00 + g * MtxRGB2XYZ.m10 + b * MtxRGB2XYZ.m20;\n let y = r * MtxRGB2XYZ.m01 + g * MtxRGB2XYZ.m11 + b * MtxRGB2XYZ.m21;\n let z = r * MtxRGB2XYZ.m02 + g * MtxRGB2XYZ.m12 + b * MtxRGB2XYZ.m22;\n\n const Ad = Xn * MtxAdaptMa.m00 + Yn * MtxAdaptMa.m10 + Zn * MtxAdaptMa.m20;\n const Bd = Xn * MtxAdaptMa.m01 + Yn * MtxAdaptMa.m11 + Zn * MtxAdaptMa.m21;\n const Cd = Xn * MtxAdaptMa.m02 + Yn * MtxAdaptMa.m12 + Zn * MtxAdaptMa.m22;\n\n let X = x * MtxAdaptMa.m00 + y * MtxAdaptMa.m10 + z * MtxAdaptMa.m20;\n let Y = x * MtxAdaptMa.m01 + y * MtxAdaptMa.m11 + z * MtxAdaptMa.m21;\n let Z = x * MtxAdaptMa.m02 + y * MtxAdaptMa.m12 + z * MtxAdaptMa.m22;\n\n X *= Ad / As;\n Y *= Bd / Bs;\n Z *= Cd / Cs;\n\n x = X * MtxAdaptMaI.m00 + Y * MtxAdaptMaI.m10 + Z * MtxAdaptMaI.m20;\n y = X * MtxAdaptMaI.m01 + Y * MtxAdaptMaI.m11 + Z * MtxAdaptMaI.m21;\n z = X * MtxAdaptMaI.m02 + Y * MtxAdaptMaI.m12 + Z * MtxAdaptMaI.m22;\n\n return [x, y, z];\n};\n\nexport default rgb2lab;\nexport { rgb2xyz };\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';\nimport { getLabWhitePoint, setLabWhitePoint } from './lab-constants.js';\n\nColor.prototype.lab = function () {\n return rgb2lab(this._rgb);\n};\n\nconst lab = (...args) => new Color(...args, 'lab');\nObject.assign(chroma, { lab, getLabWhitePoint, setLabWhitePoint });\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\nexport { lab, getLabWhitePoint, setLabWhitePoint };\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 { 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, reverse3 } from '../../utils/index.js';\nimport lch2rgb from './lch2rgb.js';\n\nconst hcl2rgb = (...args) => {\n const hcl = reverse3(unpack(args, 'hcl'));\n return lch2rgb(...hcl);\n};\n\nexport default hcl2rgb;\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, ...rest] = unpack(args, 'rgb');\n const [l, a, b_] = rgb2lab(r, g, b);\n const [L, c, h] = lab2lch(l, a, b_);\n return [L, c, h, ...(rest.length > 0 && rest[0] < 1 ? [rest[0]] : [])];\n};\n\nexport default rgb2lch;\n","import { unpack, type, reverse3 } 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 reverse3(rgb2lch(this._rgb));\n};\n\nconst lch = (...args) => new Color(...args, 'lch');\nconst hcl = (...args) => new Color(...args, 'hcl');\n\nObject.assign(chroma, { lch, 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\nexport { lch, hcl };\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 { 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 { 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 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\nconst num = (...args) => new Color(...args, 'num');\n\nObject.assign(chroma, { 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\nexport { num };\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 { 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, 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","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\nconst hcg = (...args) => new Color(...args, 'hcg');\nchroma.hcg = 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\nexport { hcg };\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 { 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\nconst hsi = (...args) => new Color(...args, 'hsi');\nchroma.hsi = 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\nexport { hsi };\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 { unpack } from '../../utils/index.js';\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] = [c[0] * 255, c[1] * 255, 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 { 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, 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\nconst hsl = (...args) => new Color(...args, 'hsl');\nchroma.hsl = 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\nexport { hsl };\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 { 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\nconst hsv = (...args) => new Color(...args, 'hsv');\nchroma.hsv = 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\nexport { hsv };\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","// from https://www.w3.org/TR/css-color-4/multiply-matrices.js\nexport default function multiplyMatrices(A, B) {\n let m = A.length;\n\n if (!Array.isArray(A[0])) {\n // A is vector, convert to [[a, b, c, ...]]\n A = [A];\n }\n\n if (!Array.isArray(B[0])) {\n // B is vector, convert to [[a], [b], [c], ...]]\n B = B.map((x) => [x]);\n }\n\n let p = B[0].length;\n let B_cols = B[0].map((_, i) => B.map((x) => x[i])); // transpose B\n let product = A.map((row) =>\n B_cols.map((col) => {\n if (!Array.isArray(row)) {\n return col.reduce((a, c) => a + c * row, 0);\n }\n\n return row.reduce((a, c, i) => a + c * (col[i] || 0), 0);\n })\n );\n\n if (m === 1) {\n product = product[0]; // Avoid [[a, b, c, ...]]\n }\n\n if (p === 1) {\n return product.map((x) => x[0]); // Avoid [[a], [b], [c], ...]]\n }\n\n return product;\n}\n","import { unpack } from '../../utils/index.js';\nimport multiplyMatrices from '../../utils/multiply-matrices.js';\nimport { xyz2rgb } from '../lab/lab2rgb.js';\n\nconst oklab2rgb = (...args) => {\n args = unpack(args, 'lab');\n const [L, a, b, ...rest] = args;\n const [X, Y, Z] = OKLab_to_XYZ([L, a, b]);\n const [r, g, b_] = xyz2rgb(X, Y, Z);\n return [r, g, b_, ...(rest.length > 0 && rest[0] < 1 ? [rest[0]] : [])];\n};\n\n// from https://www.w3.org/TR/css-color-4/#color-conversion-code\nfunction OKLab_to_XYZ(OKLab) {\n // Given OKLab, convert to XYZ relative to D65\n var LMStoXYZ = [\n [1.2268798758459243, -0.5578149944602171, 0.2813910456659647],\n [-0.0405757452148008, 1.112286803280317, -0.0717110580655164],\n [-0.0763729366746601, -0.4214933324022432, 1.5869240198367816]\n ];\n var OKLabtoLMS = [\n [1.0, 0.3963377773761749, 0.2158037573099136],\n [1.0, -0.1055613458156586, -0.0638541728258133],\n [1.0, -0.0894841775298119, -1.2914855480194092]\n ];\n\n var LMSnl = multiplyMatrices(OKLabtoLMS, OKLab);\n return multiplyMatrices(\n LMStoXYZ,\n LMSnl.map((c) => c ** 3)\n );\n}\n\nexport default oklab2rgb;\n","import { unpack } from '../../utils/index.js';\nimport multiplyMatrices from '../../utils/multiply-matrices.js';\nimport { rgb2xyz } from '../lab/rgb2lab.js';\n\nconst rgb2oklab = (...args) => {\n const [r, g, b, ...rest] = unpack(args, 'rgb');\n const xyz = rgb2xyz(r, g, b);\n const oklab = XYZ_to_OKLab(xyz);\n return [...oklab, ...(rest.length > 0 && rest[0] < 1 ? [rest[0]] : [])];\n};\n\n// from https://www.w3.org/TR/css-color-4/#color-conversion-code\nfunction XYZ_to_OKLab(XYZ) {\n // Given XYZ relative to D65, convert to OKLab\n const XYZtoLMS = [\n [0.819022437996703, 0.3619062600528904, -0.1288737815209879],\n [0.0329836539323885, 0.9292868615863434, 0.0361446663506424],\n [0.0481771893596242, 0.2642395317527308, 0.6335478284694309]\n ];\n const LMStoOKLab = [\n [0.210454268309314, 0.7936177747023054, -0.0040720430116193],\n [1.9779985324311684, -2.4285922420485799, 0.450593709617411],\n [0.0259040424655478, 0.7827717124575296, -0.8086757549230774]\n ];\n\n const LMS = multiplyMatrices(XYZtoLMS, XYZ);\n // JavaScript Math.cbrt returns a sign-matched cube root\n // beware if porting to other languages\n // especially if tempted to use a general power function\n return multiplyMatrices(\n LMStoOKLab,\n LMS.map((c) => Math.cbrt(c))\n );\n // L in range [0,1]. For use in CSS, multiply by 100 and add a percent\n}\n\nexport default rgb2oklab;\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\nconst oklab = (...args) => new Color(...args, 'oklab');\nObject.assign(chroma, { oklab });\n\ninput.format.oklab = oklab2rgb;\n\ninput.autodetect.push({\n p: 2,\n test: (...args) => {\n args = unpack(args, 'oklab');\n if (type(args) === 'array' && args.length === 3) {\n return 'oklab';\n }\n }\n});\n\nexport { oklab };\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 _positions = [0, 1];\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 _positions = [classes[0], classes[classes.length - 1]];\n } else {\n const d = chroma.analyze(_positions);\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 original domain\n return _domain;\n }\n // store original domain so we can return it later\n _domain = domain.slice(0);\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 _positions = [_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 = _positions[0];\n const dd = _positions[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 = _positions;\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//\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 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\nconst rgb = (...args) => new Color(...args, 'rgb');\nObject.assign(chroma, { 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\nexport { rgb };\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\n/**\n * Generates a random color.\n * @param {() => number} rng - A random number generator function.\n */\nexport default (rng = random) => {\n let code = '#';\n for (let i = 0; i < 6; i++) {\n code += digits.charAt(floor(rng() * 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';\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';\nimport mix from '../generator/mix.js';\n\n/**\n * @license\n *\n * The APCA contrast prediction algorithm is based of the formulas published\n * in the APCA-1.0.98G specification by Myndex. The specification is available at:\n * https://raw.githubusercontent.com/Myndex/apca-w3/master/images/APCAw3_0.1.17_APCA0.0.98G.svg\n *\n * Note that the APCA implementation is still beta, so please update to\n * future versions of chroma.js when they become available.\n *\n * You can read more about the APCA Readability Criterion at\n * https://readtech.org/ARC/\n */\n\n// constants\nconst W_offset = 0.027;\nconst P_in = 0.0005;\nconst P_out = 0.1;\nconst R_scale = 1.14;\nconst B_threshold = 0.022;\nconst B_exp = 1.414;\n\nexport default (text, bg) => {\n // parse input colors\n text = new Color(text);\n bg = new Color(bg);\n // if text color has alpha, blend against background\n if (text.alpha() < 1) {\n text = mix(bg, text, text.alpha(), 'rgb');\n }\n const l_text = lum(...text.rgb());\n const l_bg = lum(...bg.rgb());\n\n // soft clamp black levels\n const Y_text =\n l_text >= B_threshold\n ? l_text\n : l_text + Math.pow(B_threshold - l_text, B_exp);\n const Y_bg =\n l_bg >= B_threshold ? l_bg : l_bg + Math.pow(B_threshold - l_bg, B_exp);\n\n // normal polarity (dark text on light background)\n const S_norm = Math.pow(Y_bg, 0.56) - Math.pow(Y_text, 0.57);\n // reverse polarity (light text on dark background)\n const S_rev = Math.pow(Y_bg, 0.65) - Math.pow(Y_text, 0.62);\n // clamp noise then scale\n const C =\n Math.abs(Y_bg - Y_text) < P_in\n ? 0\n : Y_text < Y_bg\n ? S_norm * R_scale\n : S_rev * R_scale;\n // clamp minimum contrast then offset\n const S_apc = Math.abs(C) < P_out ? 0 : C > 0 ? C - W_offset : C + W_offset;\n // scale to 100\n return S_apc * 100;\n};\n\nfunction lum(r, g, b) {\n return (\n 0.2126729 * Math.pow(r / 255, 2.4) +\n 0.7151522 * Math.pow(g / 255, 2.4) +\n 0.072175 * Math.pow(b / 255, 2.4)\n );\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\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 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\nconst colorbrewerTypes = Object.keys(colorbrewer);\nconst typeMap = new Map(colorbrewerTypes.map((key) => [key.toLowerCase(), key]));\n\n// use Proxy to allow case-insensitive access to palettes\nconst colorbrewerProxy =\n typeof Proxy === 'function'\n ? new Proxy(colorbrewer, {\n get(target, prop) {\n const lower = prop.toLowerCase();\n if (typeMap.has(lower)) {\n return target[typeMap.get(lower)];\n }\n },\n getOwnPropertyNames() {\n return Object.getOwnPropertyNames(colorbrewerTypes);\n }\n })\n : colorbrewer;\n\nexport default colorbrewerProxy;\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\nconst cmyk = (...args) => new Color(...args, 'cmyk');\nObject.assign(chroma, { 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\nexport { cmyk };\n","import { unpack, last, rnd2 } from '../../utils/index.js';\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] = rnd2(hsla[0] || 0) + 'deg';\n hsla[1] = rnd2(hsla[1] * 100) + '%';\n hsla[2] = rnd2(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.substr(0, 3)}(${hsla.join(' ')})`;\n};\n\nexport default hsl2css;\n","import { unpack, last, rnd2 } from '../../utils/index.js';\n\n/*\n * supported arguments:\n * - lab2css(l,a,b)\n * - lab2css(l,a,b,alpha)\n * - lab2css([l,a,b], mode)\n * - lab2css([l,a,b,alpha], mode)\n */\nconst lab2css = (...args) => {\n const laba = unpack(args, 'lab');\n let mode = last(args) || 'lab';\n laba[0] = rnd2(laba[0]) + '%';\n laba[1] = rnd2(laba[1]);\n laba[2] = rnd2(laba[2]);\n if (mode === 'laba' || (laba.length > 3 && laba[3] < 1)) {\n laba[3] = '/ ' + (laba.length > 3 ? laba[3] : 1);\n } else {\n laba.length = 3;\n }\n return `lab(${laba.join(' ')})`;\n};\n\nexport default lab2css;\n","import { unpack, last, rnd2 } from '../../utils/index.js';\n\n/*\n * supported arguments:\n * - lab2css(l,a,b)\n * - lab2css(l,a,b,alpha)\n * - lab2css([l,a,b], mode)\n * - lab2css([l,a,b,alpha], mode)\n */\nconst lch2css = (...args) => {\n const lcha = unpack(args, 'lch');\n let mode = last(args) || 'lab';\n lcha[0] = rnd2(lcha[0]) + '%';\n lcha[1] = rnd2(lcha[1]);\n lcha[2] = isNaN(lcha[2]) ? 'none' : rnd2(lcha[2]) + 'deg'; // add deg unit to hue\n if (mode === 'lcha' || (lcha.length > 3 && lcha[3] < 1)) {\n lcha[3] = '/ ' + (lcha.length > 3 ? lcha[3] : 1);\n } else {\n lcha.length = 3;\n }\n return `lch(${lcha.join(' ')})`;\n};\n\nexport default lch2css;\n","import { unpack, rnd2, rnd3 } from '../../utils/index.js';\n\nconst oklab2css = (...args) => {\n const laba = unpack(args, 'lab');\n laba[0] = rnd2(laba[0] * 100) + '%';\n laba[1] = rnd3(laba[1]);\n laba[2] = rnd3(laba[2]);\n if (laba.length > 3 && laba[3] < 1) {\n laba[3] = '/ ' + (laba.length > 3 ? laba[3] : 1);\n } else {\n laba.length = 3;\n }\n return `oklab(${laba.join(' ')})`;\n};\n\nexport default oklab2css;\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, ...rest] = unpack(args, 'rgb');\n const [l, a, b_] = rgb2oklab(r, g, b);\n const [L, c, h] = lab2lch(l, a, b_);\n return [L, c, h, ...(rest.length > 0 && rest[0] < 1 ? [rest[0]] : [])];\n};\n\nexport default rgb2oklch;\n","import { unpack, rnd2, rnd3 } from '../../utils/index.js';\n\nconst oklch2css = (...args) => {\n const lcha = unpack(args, 'lch');\n lcha[0] = rnd2(lcha[0] * 100) + '%';\n lcha[1] = rnd3(lcha[1]);\n lcha[2] = isNaN(lcha[2]) ? 'none' : rnd2(lcha[2]) + 'deg'; // add deg unit to hue\n if (lcha.length > 3 && lcha[3] < 1) {\n lcha[3] = '/ ' + (lcha.length > 3 ? lcha[3] : 1);\n } else {\n lcha.length = 3;\n }\n return `oklch(${lcha.join(' ')})`;\n};\n\nexport default oklch2css;\n","import { unpack, last } from '../../utils/index.js';\nimport hsl2css from './hsl2css.js';\nimport rgb2hsl from '../hsl/rgb2hsl.js';\nimport lab2css from './lab2css.js';\nimport rgb2lab from '../lab/rgb2lab.js';\nimport lch2css from './lch2css.js';\nimport rgb2lch from '../lch/rgb2lch.js';\nimport rgb2oklab from '../oklab/rgb2oklab.js';\nimport oklab2css from './oklab2css.js';\nimport rgb2oklch from '../oklch/rgb2oklch.js';\nimport oklch2css from './oklch2css.js';\nimport { getLabWhitePoint, setLabWhitePoint } from '../lab/lab-constants.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 if (mode.substr(0, 3) === 'lab') {\n // change to D50 lab whitepoint since this is what W3C is using for CSS Lab colors\n const prevWhitePoint = getLabWhitePoint();\n setLabWhitePoint('d50');\n const cssColor = lab2css(rgb2lab(rgba), mode);\n setLabWhitePoint(prevWhitePoint);\n return cssColor;\n }\n if (mode.substr(0, 3) === 'lch') {\n // change to D50 lab whitepoint since this is what W3C is using for CSS Lab colors\n const prevWhitePoint = getLabWhitePoint();\n setLabWhitePoint('d50');\n const cssColor = lch2css(rgb2lch(rgba), mode);\n setLabWhitePoint(prevWhitePoint);\n return cssColor;\n }\n if (mode.substr(0, 5) === 'oklab') {\n return oklab2css(rgb2oklab(rgba));\n }\n if (mode.substr(0, 5) === 'oklch') {\n return oklch2css(rgb2oklch(rgba));\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.substr(0, 3)}(${rgba.slice(0, mode === 'rgb' ? 3 : 4).join(' ')})`;\n};\n\nexport default rgb2css;\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, ...rest] = args;\n const [L, a, b_] = lch2lab(l, c, h);\n const [r, g, b] = oklab2rgb(L, a, b_);\n return [r, g, b, ...(rest.length > 0 && rest[0] < 1 ? [rest[0]] : [])];\n};\n\nexport default oklch2rgb;\n","import hsl2rgb from '../hsl/hsl2rgb.js';\nimport lab2rgb from '../lab/lab2rgb.js';\nimport lch2rgb from '../lch/lch2rgb.js';\nimport oklab2rgb from '../oklab/oklab2rgb.js';\nimport oklch2rgb from '../oklch/oklch2rgb.js';\nimport input from '../input.js';\nimport limit from '../../utils/limit.js';\nimport { getLabWhitePoint, setLabWhitePoint } from '../lab/lab-constants.js';\n\nconst INT_OR_PCT = /((?:-?\\d+)|(?:-?\\d+(?:\\.\\d+)?)%|none)/.source;\nconst FLOAT_OR_PCT = /((?:-?(?:\\d+(?:\\.\\d*)?|\\.\\d+)%?)|none)/.source;\nconst PCT = /((?:-?(?:\\d+(?:\\.\\d*)?|\\.\\d+)%)|none)/.source;\nconst RE_S = /\\s*/.source;\nconst SEP = /\\s+/.source;\nconst COMMA = /\\s*,\\s*/.source;\nconst ANLGE = /((?:-?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:deg)?)|none)/.source;\nconst ALPHA = /\\s*(?:\\/\\s*((?:[01]|[01]?\\.\\d+)|\\d+(?:\\.\\d+)?%))?/.source;\n\n// e.g. rgb(250 20 0), rgb(100% 50% 20%), rgb(100% 50% 20% / 0.5)\nconst RE_RGB = new RegExp(\n '^rgba?\\\\(' +\n RE_S +\n [INT_OR_PCT, INT_OR_PCT, INT_OR_PCT].join(SEP) +\n ALPHA +\n '\\\\)$'\n);\nconst RE_RGB_LEGACY = new RegExp(\n '^rgb\\\\(' +\n RE_S +\n [INT_OR_PCT, INT_OR_PCT, INT_OR_PCT].join(COMMA) +\n RE_S +\n '\\\\)$'\n);\nconst RE_RGBA_LEGACY = new RegExp(\n '^rgba\\\\(' +\n RE_S +\n [INT_OR_PCT, INT_OR_PCT, INT_OR_PCT, FLOAT_OR_PCT].join(COMMA) +\n RE_S +\n '\\\\)$'\n);\n\nconst RE_HSL = new RegExp(\n '^hsla?\\\\(' + RE_S + [ANLGE, PCT, PCT].join(SEP) + ALPHA + '\\\\)$'\n);\nconst RE_HSL_LEGACY = new RegExp(\n '^hsl?\\\\(' + RE_S + [ANLGE, PCT, PCT].join(COMMA) + RE_S + '\\\\)$'\n);\nconst RE_HSLA_LEGACY =\n /^hsla\\(\\s*(-?\\d+(?:\\.\\d+)?),\\s*(-?\\d+(?:\\.\\d+)?)%\\s*,\\s*(-?\\d+(?:\\.\\d+)?)%\\s*,\\s*([01]|[01]?\\.\\d+)\\)$/;\n\nconst RE_LAB = new RegExp(\n '^lab\\\\(' +\n RE_S +\n [FLOAT_OR_PCT, FLOAT_OR_PCT, FLOAT_OR_PCT].join(SEP) +\n ALPHA +\n '\\\\)$'\n);\nconst RE_LCH = new RegExp(\n '^lch\\\\(' +\n RE_S +\n [FLOAT_OR_PCT, FLOAT_OR_PCT, ANLGE].join(SEP) +\n ALPHA +\n '\\\\)$'\n);\nconst RE_OKLAB = new RegExp(\n '^oklab\\\\(' +\n RE_S +\n [FLOAT_OR_PCT, FLOAT_OR_PCT, FLOAT_OR_PCT].join(SEP) +\n ALPHA +\n '\\\\)$'\n);\nconst RE_OKLCH = new RegExp(\n '^oklch\\\\(' +\n RE_S +\n [FLOAT_OR_PCT, FLOAT_OR_PCT, ANLGE].join(SEP) +\n ALPHA +\n '\\\\)$'\n);\n\nconst { round } = Math;\n\nconst roundRGB = (rgb) => {\n return rgb.map((v, i) => (i <= 2 ? limit(round(v), 0, 255) : v));\n};\n\nconst percentToAbsolute = (pct, min = 0, max = 100, signed = false) => {\n if (typeof pct === 'string' && pct.endsWith('%')) {\n pct = parseFloat(pct.substring(0, pct.length - 1)) / 100;\n if (signed) {\n // signed percentages are in the range -100% to 100%\n pct = min + (pct + 1) * 0.5 * (max - min);\n } else {\n pct = min + pct * (max - min);\n }\n }\n return +pct;\n};\n\nconst noneToValue = (v, noneValue) => {\n return v === 'none' ? noneValue : v;\n};\n\nconst css2rgb = (css) => {\n css = css.toLowerCase().trim();\n\n if (css === 'transparent') {\n return [0, 0, 0, 0];\n }\n\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) or rgb(250,20,0)\n if ((m = css.match(RE_RGB)) || (m = css.match(RE_RGB_LEGACY))) {\n let rgb = m.slice(1, 4);\n for (let i = 0; i < 3; i++) {\n rgb[i] = +percentToAbsolute(noneToValue(rgb[i], 0), 0, 255);\n }\n rgb = roundRGB(rgb);\n const alpha = m[4] !== undefined ? +percentToAbsolute(m[4], 0, 1) : 1;\n rgb[3] = alpha; // default alpha\n return rgb;\n }\n\n // rgba(250,20,0,0.4)\n if ((m = css.match(RE_RGBA_LEGACY))) {\n const rgb = m.slice(1, 5);\n for (let i = 0; i < 4; i++) {\n rgb[i] = +percentToAbsolute(rgb[i], 0, 255);\n }\n return rgb;\n }\n\n // hsl(0,100%,50%)\n if ((m = css.match(RE_HSL)) || (m = css.match(RE_HSL_LEGACY))) {\n const hsl = m.slice(1, 4);\n hsl[0] = +noneToValue(hsl[0].replace('deg', ''), 0);\n hsl[1] = +percentToAbsolute(noneToValue(hsl[1], 0), 0, 100) * 0.01;\n hsl[2] = +percentToAbsolute(noneToValue(hsl[2], 0), 0, 100) * 0.01;\n const rgb = roundRGB(hsl2rgb(hsl));\n const alpha = m[4] !== undefined ? +percentToAbsolute(m[4], 0, 1) : 1;\n rgb[3] = alpha;\n return rgb;\n }\n\n // hsla(0,100%,50%,0.5)\n if ((m = css.match(RE_HSLA_LEGACY))) {\n const hsl = m.slice(1, 4);\n hsl[1] *= 0.01;\n hsl[2] *= 0.01;\n const rgb = hsl2rgb(hsl);\n for (let i = 0; i < 3; i++) {\n rgb[i] = round(rgb[i]);\n }\n rgb[3] = +m[4]; // default alpha = 1\n return rgb;\n }\n\n if ((m = css.match(RE_LAB))) {\n const lab = m.slice(1, 4);\n lab[0] = percentToAbsolute(noneToValue(lab[0], 0), 0, 100);\n lab[1] = percentToAbsolute(noneToValue(lab[1], 0), -125, 125, true);\n lab[2] = percentToAbsolute(noneToValue(lab[2], 0), -125, 125, true);\n // convert to D50 Lab whitepoint\n const wp = getLabWhitePoint();\n setLabWhitePoint('d50');\n const rgb = roundRGB(lab2rgb(lab));\n // convert back to original Lab whitepoint\n setLabWhitePoint(wp);\n const alpha = m[4] !== undefined ? +percentToAbsolute(m[4], 0, 1) : 1;\n rgb[3] = alpha;\n return rgb;\n }\n\n if ((m = css.match(RE_LCH))) {\n const lch = m.slice(1, 4);\n lch[0] = percentToAbsolute(lch[0], 0, 100);\n lch[1] = percentToAbsolute(noneToValue(lch[1], 0), 0, 150, false);\n lch[2] = +noneToValue(lch[2].replace('deg', ''), 0);\n // convert to D50 Lab whitepoint\n const wp = getLabWhitePoint();\n setLabWhitePoint('d50');\n const rgb = roundRGB(lch2rgb(lch));\n // convert back to original Lab whitepoint\n setLabWhitePoint(wp);\n const alpha = m[4] !== undefined ? +percentToAbsolute(m[4], 0, 1) : 1;\n rgb[3] = alpha;\n return rgb;\n }\n\n if ((m = css.match(RE_OKLAB))) {\n const oklab = m.slice(1, 4);\n oklab[0] = percentToAbsolute(noneToValue(oklab[0], 0), 0, 1);\n oklab[1] = percentToAbsolute(noneToValue(oklab[1], 0), -0.4, 0.4, true);\n oklab[2] = percentToAbsolute(noneToValue(oklab[2], 0), -0.4, 0.4, true);\n const rgb = roundRGB(oklab2rgb(oklab));\n const alpha = m[4] !== undefined ? +percentToAbsolute(m[4], 0, 1) : 1;\n rgb[3] = alpha;\n return rgb;\n }\n\n if ((m = css.match(RE_OKLCH))) {\n const oklch = m.slice(1, 4);\n oklch[0] = percentToAbsolute(noneToValue(oklch[0], 0), 0, 1);\n oklch[1] = percentToAbsolute(noneToValue(oklch[1], 0), 0, 0.4, false);\n oklch[2] = +noneToValue(oklch[2].replace('deg', ''), 0);\n const rgb = roundRGB(oklch2rgb(oklch));\n const alpha = m[4] !== undefined ? +percentToAbsolute(m[4], 0, 1) : 1;\n rgb[3] = alpha;\n return rgb;\n }\n};\n\ncss2rgb.test = (s) => {\n return (\n // modern\n RE_RGB.test(s) ||\n RE_HSL.test(s) ||\n RE_LAB.test(s) ||\n RE_LCH.test(s) ||\n RE_OKLAB.test(s) ||\n RE_OKLCH.test(s) ||\n // legacy\n RE_RGB_LEGACY.test(s) ||\n RE_RGBA_LEGACY.test(s) ||\n RE_HSL_LEGACY.test(s) ||\n RE_HSLA_LEGACY.test(s) ||\n s === 'transparent'\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\nconst css = (...args) => new Color(...args, 'css');\nchroma.css = 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\nexport { css };\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\nconst gl = (...args) => new Color(...args, 'gl');\nchroma.gl = 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\nexport { gl };\n","import Color from '../../Color.js';\nimport chroma from '../../chroma.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\nconst hex = (...args) => new Color(...args, 'hex');\nchroma.hex = 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\nexport { hex };\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\nconst temp = (...args) => new Color(...args, 'temp');\nObject.assign(chroma, { temp, kelvin: temp, temperature: temp });\n\ninput.format.temp =\n input.format.kelvin =\n input.format.temperature =\n temperature2rgb;\n\nexport { temp, temp as kelvin, temp as temperature };\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\nconst oklch = (...args) => new Color(...args, 'oklch');\nObject.assign(chroma, { oklch });\n\ninput.format.oklch = oklch2rgb;\n\ninput.autodetect.push({\n p: 2,\n test: (...args) => {\n args = unpack(args, 'oklch');\n if (type(args) === 'array' && args.length === 3) {\n return 'oklch';\n }\n }\n});\n\nexport { oklch };\n","// feel free to comment out anything to rollup\n// a smaller chroma.js bundle\nimport chroma from './src/chroma.js';\n\n// io --> convert colors\nimport './src/io/named/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 contrastAPCA from './src/utils/contrastAPCA.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';\nimport Color from './src/Color.js';\n\nObject.assign(chroma, {\n analyze,\n average,\n bezier,\n blend,\n brewer,\n Color,\n colors,\n contrast,\n contrastAPCA,\n cubehelix,\n deltaE,\n distance,\n input,\n interpolate: mix,\n limits,\n mix,\n random,\n scale,\n scales,\n valid\n});\n\nexport default chroma;\n\nexport {\n analyze,\n average,\n bezier,\n blend,\n brewer,\n Color,\n colors,\n contrast,\n contrastAPCA,\n cubehelix,\n deltaE,\n distance,\n input,\n limits,\n mix,\n mix as interpolate,\n random,\n scale,\n scales,\n valid\n};\n\nexport * from './src/io/cmyk/index.js';\nexport * from './src/io/css/index.js';\nexport * from './src/io/gl/index.js';\nexport * from './src/io/hcg/index.js';\nexport * from './src/io/hex/index.js';\nexport * from './src/io/hsi/index.js';\nexport * from './src/io/hsl/index.js';\nexport * from './src/io/hsv/index.js';\nexport * from './src/io/lab/index.js';\nexport * from './src/io/lch/index.js';\nexport * from './src/io/num/index.js';\nexport * from './src/io/rgb/index.js';\nexport * from './src/io/temp/index.js';\nexport * from './src/io/oklab/index.js';\nexport * from './src/io/oklch/index.js';\n","const parseNumber = (color, len) => {\n\tif (typeof color !== 'number') return;\n\n\t// hex3: #c93 -> #cc9933\n\tif (len === 3) {\n\t\treturn {\n\t\t\tmode: 'rgb',\n\t\t\tr: (((color >> 8) & 0xf) | ((color >> 4) & 0xf0)) / 255,\n\t\t\tg: (((color >> 4) & 0xf) | (color & 0xf0)) / 255,\n\t\t\tb: ((color & 0xf) | ((color << 4) & 0xf0)) / 255\n\t\t};\n\t}\n\n\t// hex4: #c931 -> #cc993311\n\tif (len === 4) {\n\t\treturn {\n\t\t\tmode: 'rgb',\n\t\t\tr: (((color >> 12) & 0xf) | ((color >> 8) & 0xf0)) / 255,\n\t\t\tg: (((color >> 8) & 0xf) | ((color >> 4) & 0xf0)) / 255,\n\t\t\tb: (((color >> 4) & 0xf) | (color & 0xf0)) / 255,\n\t\t\talpha: ((color & 0xf) | ((color << 4) & 0xf0)) / 255\n\t\t};\n\t}\n\n\t// hex6: #f0f1f2\n\tif (len === 6) {\n\t\treturn {\n\t\t\tmode: 'rgb',\n\t\t\tr: ((color >> 16) & 0xff) / 255,\n\t\t\tg: ((color >> 8) & 0xff) / 255,\n\t\t\tb: (color & 0xff) / 255\n\t\t};\n\t}\n\n\t// hex8: #f0f1f2ff\n\tif (len === 8) {\n\t\treturn {\n\t\t\tmode: 'rgb',\n\t\t\tr: ((color >> 24) & 0xff) / 255,\n\t\t\tg: ((color >> 16) & 0xff) / 255,\n\t\t\tb: ((color >> 8) & 0xff) / 255,\n\t\t\talpha: (color & 0xff) / 255\n\t\t};\n\t}\n};\n\nexport default parseNumber;\n","const named = {\n\taliceblue: 0xf0f8ff,\n\tantiquewhite: 0xfaebd7,\n\taqua: 0x00ffff,\n\taquamarine: 0x7fffd4,\n\tazure: 0xf0ffff,\n\tbeige: 0xf5f5dc,\n\tbisque: 0xffe4c4,\n\tblack: 0x000000,\n\tblanchedalmond: 0xffebcd,\n\tblue: 0x0000ff,\n\tblueviolet: 0x8a2be2,\n\tbrown: 0xa52a2a,\n\tburlywood: 0xdeb887,\n\tcadetblue: 0x5f9ea0,\n\tchartreuse: 0x7fff00,\n\tchocolate: 0xd2691e,\n\tcoral: 0xff7f50,\n\tcornflowerblue: 0x6495ed,\n\tcornsilk: 0xfff8dc,\n\tcrimson: 0xdc143c,\n\tcyan: 0x00ffff,\n\tdarkblue: 0x00008b,\n\tdarkcyan: 0x008b8b,\n\tdarkgoldenrod: 0xb8860b,\n\tdarkgray: 0xa9a9a9,\n\tdarkgreen: 0x006400,\n\tdarkgrey: 0xa9a9a9,\n\tdarkkhaki: 0xbdb76b,\n\tdarkmagenta: 0x8b008b,\n\tdarkolivegreen: 0x556b2f,\n\tdarkorange: 0xff8c00,\n\tdarkorchid: 0x9932cc,\n\tdarkred: 0x8b0000,\n\tdarksalmon: 0xe9967a,\n\tdarkseagreen: 0x8fbc8f,\n\tdarkslateblue: 0x483d8b,\n\tdarkslategray: 0x2f4f4f,\n\tdarkslategrey: 0x2f4f4f,\n\tdarkturquoise: 0x00ced1,\n\tdarkviolet: 0x9400d3,\n\tdeeppink: 0xff1493,\n\tdeepskyblue: 0x00bfff,\n\tdimgray: 0x696969,\n\tdimgrey: 0x696969,\n\tdodgerblue: 0x1e90ff,\n\tfirebrick: 0xb22222,\n\tfloralwhite: 0xfffaf0,\n\tforestgreen: 0x228b22,\n\tfuchsia: 0xff00ff,\n\tgainsboro: 0xdcdcdc,\n\tghostwhite: 0xf8f8ff,\n\tgold: 0xffd700,\n\tgoldenrod: 0xdaa520,\n\tgray: 0x808080,\n\tgreen: 0x008000,\n\tgreenyellow: 0xadff2f,\n\tgrey: 0x808080,\n\thoneydew: 0xf0fff0,\n\thotpink: 0xff69b4,\n\tindianred: 0xcd5c5c,\n\tindigo: 0x4b0082,\n\tivory: 0xfffff0,\n\tkhaki: 0xf0e68c,\n\tlavender: 0xe6e6fa,\n\tlavenderblush: 0xfff0f5,\n\tlawngreen: 0x7cfc00,\n\tlemonchiffon: 0xfffacd,\n\tlightblue: 0xadd8e6,\n\tlightcoral: 0xf08080,\n\tlightcyan: 0xe0ffff,\n\tlightgoldenrodyellow: 0xfafad2,\n\tlightgray: 0xd3d3d3,\n\tlightgreen: 0x90ee90,\n\tlightgrey: 0xd3d3d3,\n\tlightpink: 0xffb6c1,\n\tlightsalmon: 0xffa07a,\n\tlightseagreen: 0x20b2aa,\n\tlightskyblue: 0x87cefa,\n\tlightslategray: 0x778899,\n\tlightslategrey: 0x778899,\n\tlightsteelblue: 0xb0c4de,\n\tlightyellow: 0xffffe0,\n\tlime: 0x00ff00,\n\tlimegreen: 0x32cd32,\n\tlinen: 0xfaf0e6,\n\tmagenta: 0xff00ff,\n\tmaroon: 0x800000,\n\tmediumaquamarine: 0x66cdaa,\n\tmediumblue: 0x0000cd,\n\tmediumorchid: 0xba55d3,\n\tmediumpurple: 0x9370db,\n\tmediumseagreen: 0x3cb371,\n\tmediumslateblue: 0x7b68ee,\n\tmediumspringgreen: 0x00fa9a,\n\tmediumturquoise: 0x48d1cc,\n\tmediumvioletred: 0xc71585,\n\tmidnightblue: 0x191970,\n\tmintcream: 0xf5fffa,\n\tmistyrose: 0xffe4e1,\n\tmoccasin: 0xffe4b5,\n\tnavajowhite: 0xffdead,\n\tnavy: 0x000080,\n\toldlace: 0xfdf5e6,\n\tolive: 0x808000,\n\tolivedrab: 0x6b8e23,\n\torange: 0xffa500,\n\torangered: 0xff4500,\n\torchid: 0xda70d6,\n\tpalegoldenrod: 0xeee8aa,\n\tpalegreen: 0x98fb98,\n\tpaleturquoise: 0xafeeee,\n\tpalevioletred: 0xdb7093,\n\tpapayawhip: 0xffefd5,\n\tpeachpuff: 0xffdab9,\n\tperu: 0xcd853f,\n\tpink: 0xffc0cb,\n\tplum: 0xdda0dd,\n\tpowderblue: 0xb0e0e6,\n\tpurple: 0x800080,\n\n\t// Added in CSS Colors Level 4:\n\t// https://drafts.csswg.org/css-color/#changes-from-3\n\trebeccapurple: 0x663399,\n\n\tred: 0xff0000,\n\trosybrown: 0xbc8f8f,\n\troyalblue: 0x4169e1,\n\tsaddlebrown: 0x8b4513,\n\tsalmon: 0xfa8072,\n\tsandybrown: 0xf4a460,\n\tseagreen: 0x2e8b57,\n\tseashell: 0xfff5ee,\n\tsienna: 0xa0522d,\n\tsilver: 0xc0c0c0,\n\tskyblue: 0x87ceeb,\n\tslateblue: 0x6a5acd,\n\tslategray: 0x708090,\n\tslategrey: 0x708090,\n\tsnow: 0xfffafa,\n\tspringgreen: 0x00ff7f,\n\tsteelblue: 0x4682b4,\n\ttan: 0xd2b48c,\n\tteal: 0x008080,\n\tthistle: 0xd8bfd8,\n\ttomato: 0xff6347,\n\tturquoise: 0x40e0d0,\n\tviolet: 0xee82ee,\n\twheat: 0xf5deb3,\n\twhite: 0xffffff,\n\twhitesmoke: 0xf5f5f5,\n\tyellow: 0xffff00,\n\tyellowgreen: 0x9acd32\n};\n\nexport default named;\n","import parseNumber from './parseNumber.js';\nimport named from '../colors/named.js';\n\n// Also supports the `transparent` color as defined in:\n// https://drafts.csswg.org/css-color/#transparent-black\nconst parseNamed = color => {\n\treturn parseNumber(named[color.toLowerCase()], 6);\n};\n\nexport default parseNamed;\n","import parseNumber from './parseNumber.js';\n\nconst hex = /^#?([0-9a-f]{8}|[0-9a-f]{6}|[0-9a-f]{4}|[0-9a-f]{3})$/i;\n\nconst parseHex = color => {\n\tlet match;\n\t// eslint-disable-next-line no-cond-assign\n\treturn (match = color.match(hex))\n\t\t? parseNumber(parseInt(match[1], 16), match[1].length)\n\t\t: undefined;\n};\n\nexport default parseHex;\n","/*\n\tBasic building blocks for color regexes\n\t---------------------------------------\n\n\tThese regexes are expressed as strings\n\tto be interpolated in the color regexes.\n */\n\n// <number>\nexport const num = '([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)';\n\n// <number> or 'none'\nexport const num_none = `(?:${num}|none)`;\n\n// <percentage>\nexport const per = `${num}%`;\n\n// <percent> or 'none'\nexport const per_none = `(?:${num}%|none)`;\n\n// <number-percentage> (<alpha-value>)\nexport const num_per = `(?:${num}%|${num})`;\n\n// <number-percentage> (<alpha-value>) or 'none'\nexport const num_per_none = `(?:${num}%|${num}|none)`;\n\n// <hue>\nexport const hue = `(?:${num}(deg|grad|rad|turn)|${num})`;\n\n// <hue> or 'none'\nexport const hue_none = `(?:${num}(deg|grad|rad|turn)|${num}|none)`;\n\nexport const c = `\\\\s*,\\\\s*`; // comma\nexport const so = '\\\\s*'; // space, optional\nexport const s = `\\\\s+`; // space\n\nexport const rx_num_per_none = new RegExp('^' + num_per_none + '$');\n","import { num, per, num_per, c } from '../util/regex.js';\n\n/*\n\trgb() regular expressions for legacy format\n\tReference: https://drafts.csswg.org/css-color/#rgb-functions\n */\nconst rgb_num_old = new RegExp(\n\t`^rgba?\\\\(\\\\s*${num}${c}${num}${c}${num}\\\\s*(?:,\\\\s*${num_per}\\\\s*)?\\\\)$`\n);\n\nconst rgb_per_old = new RegExp(\n\t`^rgba?\\\\(\\\\s*${per}${c}${per}${c}${per}\\\\s*(?:,\\\\s*${num_per}\\\\s*)?\\\\)$`\n);\n\nconst parseRgbLegacy = color => {\n\tlet res = { mode: 'rgb' };\n\tlet match;\n\tif ((match = color.match(rgb_num_old))) {\n\t\tif (match[1] !== undefined) {\n\t\t\tres.r = match[1] / 255;\n\t\t}\n\t\tif (match[2] !== undefined) {\n\t\t\tres.g = match[2] / 255;\n\t\t}\n\t\tif (match[3] !== undefined) {\n\t\t\tres.b = match[3] / 255;\n\t\t}\n\t} else if ((match = color.match(rgb_per_old))) {\n\t\tif (match[1] !== undefined) {\n\t\t\tres.r = match[1] / 100;\n\t\t}\n\t\tif (match[2] !== undefined) {\n\t\t\tres.g = match[2] / 100;\n\t\t}\n\t\tif (match[3] !== undefined) {\n\t\t\tres.b = match[3] / 100;\n\t\t}\n\t} else {\n\t\treturn undefined;\n\t}\n\n\tif (match[4] !== undefined) {\n\t\tres.alpha = Math.max(0, Math.min(1, match[4] / 100));\n\t} else if (match[5] !== undefined) {\n\t\tres.alpha = Math.max(0, Math.min(1, +match[5]));\n\t}\n\n\treturn res;\n};\n\nexport default parseRgbLegacy;\n","import parse from './parse.js';\n\nconst prepare = (color, mode) =>\n\tcolor === undefined\n\t\t? undefined\n\t\t: typeof color !== 'object'\n\t\t? parse(color)\n\t\t: color.mode !== undefined\n\t\t? color\n\t\t: mode\n\t\t? { ...color, mode }\n\t\t: undefined;\n\nexport default prepare;\n","import { converters } from './modes.js';\nimport prepare from './_prepare.js';\n\nconst converter =\n\t(target_mode = 'rgb') =>\n\tcolor =>\n\t\t(color = prepare(color, target_mode)) !== undefined\n\t\t\t? // if the color's mode corresponds to our target mode\n\t\t\t color.mode === target_mode\n\t\t\t\t? // then just return the color\n\t\t\t\t color\n\t\t\t\t: // otherwise check to see if we have a dedicated\n\t\t\t\t// converter for the target mode\n\t\t\t\tconverters[color.mode][target_mode]\n\t\t\t\t? // and return its result...\n\t\t\t\t converters[color.mode][target_mode](color)\n\t\t\t\t: // ...otherwise pass through RGB as an intermediary step.\n\t\t\t\t// if the target mode is RGB...\n\t\t\t\ttarget_mode === 'rgb'\n\t\t\t\t? // just return the RGB\n\t\t\t\t converters[color.mode].rgb(color)\n\t\t\t\t: // otherwise convert color.mode -> RGB -> target_mode\n\t\t\t\t converters.rgb[target_mode](converters[color.mode].rgb(color))\n\t\t\t: undefined;\n\nexport default converter;\n","import converter from './converter.js';\n\nconst converters = {};\nconst modes = {};\n\nconst parsers = [];\nconst colorProfiles = {};\n\nconst identity = v => v;\n\nconst useMode = definition => {\n\tconverters[definition.mode] = {\n\t\t...converters[definition.mode],\n\t\t...definition.toMode\n\t};\n\n\tObject.keys(definition.fromMode || {}).forEach(k => {\n\t\tif (!converters[k]) {\n\t\t\tconverters[k] = {};\n\t\t}\n\t\tconverters[k][definition.mode] = definition.fromMode[k];\n\t});\n\n\t// Color space channel ranges\n\tif (!definition.ranges) {\n\t\tdefinition.ranges = {};\n\t}\n\n\tif (!definition.difference) {\n\t\tdefinition.difference = {};\n\t}\n\n\tdefinition.channels.forEach(channel => {\n\t\t// undefined channel ranges default to the [0, 1] interval\n\t\tif (definition.ranges[channel] === undefined) {\n\t\t\tdefinition.ranges[channel] = [0, 1];\n\t\t}\n\n\t\tif (!definition.interpolate[channel]) {\n\t\t\tthrow new Error(`Missing interpolator for: ${channel}`);\n\t\t}\n\n\t\tif (typeof definition.interpolate[channel] === 'function') {\n\t\t\tdefinition.interpolate[channel] = {\n\t\t\t\tuse: definition.interpolate[channel]\n\t\t\t};\n\t\t}\n\n\t\tif (!definition.interpolate[channel].fixup) {\n\t\t\tdefinition.interpolate[channel].fixup = identity;\n\t\t}\n\t});\n\n\tmodes[definition.mode] = definition;\n\t(definition.parse || []).forEach(parser => {\n\t\tuseParser(parser, definition.mode);\n\t});\n\n\treturn converter(definition.mode);\n};\n\nconst getMode = mode => modes[mode];\n\nconst useParser = (parser, mode) => {\n\tif (typeof parser === 'string') {\n\t\tif (!mode) {\n\t\t\tthrow new Error(`'mode' required when 'parser' is a string`);\n\t\t}\n\t\tcolorProfiles[parser] = mode;\n\t} else if (typeof parser === 'function') {\n\t\tif (parsers.indexOf(parser) < 0) {\n\t\t\tparsers.push(parser);\n\t\t}\n\t}\n};\n\nconst removeParser = parser => {\n\tif (typeof parser === 'string') {\n\t\tdelete colorProfiles[parser];\n\t} else if (typeof parser === 'function') {\n\t\tconst idx = parsers.indexOf(parser);\n\t\tif (idx > 0) {\n\t\t\tparsers.splice(idx, 1);\n\t\t}\n\t}\n};\n\nexport {\n\tuseMode,\n\tgetMode,\n\tuseParser,\n\tremoveParser,\n\tconverters,\n\tparsers,\n\tcolorProfiles\n};\n","import { parsers, colorProfiles, getMode } from './modes.js';\n\n/* eslint-disable-next-line no-control-regex */\nconst IdentStartCodePoint = /[^\\x00-\\x7F]|[a-zA-Z_]/;\n\n/* eslint-disable-next-line no-control-regex */\nconst IdentCodePoint = /[^\\x00-\\x7F]|[-\\w]/;\n\nexport const Tok = {\n\tFunction: 'function',\n\tIdent: 'ident',\n\tNumber: 'number',\n\tPercentage: 'percentage',\n\tParenClose: ')',\n\tNone: 'none',\n\tHue: 'hue',\n\tAlpha: 'alpha'\n};\n\nlet _i = 0;\n\n/*\n\t4.3.10. Check if three code points would start a number\n\thttps://drafts.csswg.org/css-syntax/#starts-with-a-number\n */\nfunction is_num(chars) {\n\tlet ch = chars[_i];\n\tlet ch1 = chars[_i + 1];\n\tif (ch === '-' || ch === '+') {\n\t\treturn /\\d/.test(ch1) || (ch1 === '.' && /\\d/.test(chars[_i + 2]));\n\t}\n\tif (ch === '.') {\n\t\treturn /\\d/.test(ch1);\n\t}\n\treturn /\\d/.test(ch);\n}\n\n/*\n\tCheck if the stream starts with an identifier.\n */\n\nfunction is_ident(chars) {\n\tif (_i >= chars.length) {\n\t\treturn false;\n\t}\n\tlet ch = chars[_i];\n\tif (IdentStartCodePoint.test(ch)) {\n\t\treturn true;\n\t}\n\tif (ch === '-') {\n\t\tif (chars.length - _i < 2) {\n\t\t\treturn false;\n\t\t}\n\t\tlet ch1 = chars[_i + 1];\n\t\tif (ch1 === '-' || IdentStartCodePoint.test(ch1)) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\treturn false;\n}\n\n/*\n\t4.3.3. Consume a numeric token\n\thttps://drafts.csswg.org/css-syntax/#consume-numeric-token\n */\n\nconst huenits = {\n\tdeg: 1,\n\trad: 180 / Math.PI,\n\tgrad: 9 / 10,\n\tturn: 360\n};\n\nfunction num(chars) {\n\tlet value = '';\n\tif (chars[_i] === '-' || chars[_i] === '+') {\n\t\tvalue += chars[_i++];\n\t}\n\tvalue += digits(chars);\n\tif (chars[_i] === '.' && /\\d/.test(chars[_i + 1])) {\n\t\tvalue += chars[_i++] + digits(chars);\n\t}\n\tif (chars[_i] === 'e' || chars[_i] === 'E') {\n\t\tif (\n\t\t\t(chars[_i + 1] === '-' || chars[_i + 1] === '+') &&\n\t\t\t/\\d/.test(chars[_i + 2])\n\t\t) {\n\t\t\tvalue += chars[_i++] + chars[_i++] + digits(chars);\n\t\t} else if (/\\d/.test(chars[_i + 1])) {\n\t\t\tvalue += chars[_i++] + digits(chars);\n\t\t}\n\t}\n\tif (is_ident(chars)) {\n\t\tlet id = ident(chars);\n\t\tif (id === 'deg' || id === 'rad' || id === 'turn' || id === 'grad') {\n\t\t\treturn { type: Tok.Hue, value: value * huenits[id] };\n\t\t}\n\t\treturn undefined;\n\t}\n\tif (chars[_i] === '%') {\n\t\t_i++;\n\t\treturn { type: Tok.Percentage, value: +value };\n\t}\n\treturn { type: Tok.Number, value: +value };\n}\n\n/*\n\tConsume digits.\n */\nfunction digits(chars) {\n\tlet v = '';\n\twhile (/\\d/.test(chars[_i])) {\n\t\tv += chars[_i++];\n\t}\n\treturn v;\n}\n\n/*\n\tConsume an identifier.\n */\nfunction ident(chars) {\n\tlet v = '';\n\twhile (_i < chars.length && IdentCodePoint.test(chars[_i])) {\n\t\tv += chars[_i++];\n\t}\n\treturn v;\n}\n\n/*\n\tConsume an ident-like token.\n */\nfunction identlike(chars) {\n\tlet v = ident(chars);\n\tif (chars[_i] === '(') {\n\t\t_i++;\n\t\treturn { type: Tok.Function, value: v };\n\t}\n\tif (v === 'none') {\n\t\treturn { type: Tok.None, value: undefined };\n\t}\n\treturn { type: Tok.Ident, value: v };\n}\n\nexport function tokenize(str = '') {\n\tlet chars = str.trim();\n\tlet tokens = [];\n\tlet ch;\n\n\t/* reset counter */\n\t_i = 0;\n\n\twhile (_i < chars.length) {\n\t\tch = chars[_i++];\n\n\t\t/*\n\t\t\tConsume whitespace without emitting it\n\t\t */\n\t\tif (ch === '\\n' || ch === '\\t' || ch === ' ') {\n\t\t\twhile (\n\t\t\t\t_i < chars.length &&\n\t\t\t\t(chars[_i] === '\\n' || chars[_i] === '\\t' || chars[_i] === ' ')\n\t\t\t) {\n\t\t\t\t_i++;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (ch === ',') {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (ch === ')') {\n\t\t\ttokens.push({ type: Tok.ParenClose });\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (ch === '+') {\n\t\t\t_i--;\n\t\t\tif (is_num(chars)) {\n\t\t\t\ttokens.push(num(chars));\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (ch === '-') {\n\t\t\t_i--;\n\t\t\tif (is_num(chars)) {\n\t\t\t\ttokens.push(num(chars));\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (is_ident(chars)) {\n\t\t\t\ttokens.push({ type: Tok.Ident, value: ident(chars) });\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (ch === '.') {\n\t\t\t_i--;\n\t\t\tif (is_num(chars)) {\n\t\t\t\ttokens.push(num(chars));\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (ch === '/') {\n\t\t\twhile (\n\t\t\t\t_i < chars.length &&\n\t\t\t\t(chars[_i] === '\\n' || chars[_i] === '\\t' || chars[_i] === ' ')\n\t\t\t) {\n\t\t\t\t_i++;\n\t\t\t}\n\t\t\tlet alpha;\n\t\t\tif (is_num(chars)) {\n\t\t\t\talpha = num(chars);\n\t\t\t\tif (alpha.type !== Tok.Hue) {\n\t\t\t\t\ttokens.push({ type: Tok.Alpha, value: alpha });\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (is_ident(chars)) {\n\t\t\t\tif (ident(chars) === 'none') {\n\t\t\t\t\ttokens.push({\n\t\t\t\t\t\ttype: Tok.Alpha,\n\t\t\t\t\t\tvalue: { type: Tok.None, value: undefined }\n\t\t\t\t\t});\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (/\\d/.test(ch)) {\n\t\t\t_i--;\n\t\t\ttokens.push(num(chars));\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (IdentStartCodePoint.test(ch)) {\n\t\t\t_i--;\n\t\t\ttokens.push(identlike(chars));\n\t\t\tcontinue;\n\t\t}\n\n\t\t/*\n\t\t\tTreat everything not already handled as an error.\n\t\t */\n\t\treturn undefined;\n\t}\n\n\treturn tokens;\n}\n\nexport function parseColorSyntax(tokens) {\n\ttokens._i = 0;\n\tlet token = tokens[tokens._i++];\n\tif (!token || token.type !== Tok.Function || token.value !== 'color') {\n\t\treturn undefined;\n\t}\n\ttoken = tokens[tokens._i++];\n\tif (token.type !== Tok.Ident) {\n\t\treturn undefined;\n\t}\n\tconst mode = colorProfiles[token.value];\n\tif (!mode) {\n\t\treturn undefined;\n\t}\n\tconst res = { mode };\n\tconst coords = consumeCoords(tokens, false);\n\tif (!coords) {\n\t\treturn undefined;\n\t}\n\tconst channels = getMode(mode).channels;\n\tfor (let ii = 0, c, ch; ii < channels.length; ii++) {\n\t\tc = coords[ii];\n\t\tch = channels[ii];\n\t\tif (c.type !== Tok.None) {\n\t\t\tres[ch] = c.type === Tok.Number ? c.value : c.value / 100;\n\t\t\tif (ch === 'alpha') {\n\t\t\t\tres[ch] = Math.max(0, Math.min(1, res[ch]));\n\t\t\t}\n\t\t}\n\t}\n\treturn res;\n}\n\nfunction consumeCoords(tokens, includeHue) {\n\tconst coords = [];\n\tlet token;\n\twhile (tokens._i < tokens.length) {\n\t\ttoken = tokens[tokens._i++];\n\t\tif (\n\t\t\ttoken.type === Tok.None ||\n\t\t\ttoken.type === Tok.Number ||\n\t\t\ttoken.type === Tok.Alpha ||\n\t\t\ttoken.type === Tok.Percentage ||\n\t\t\t(includeHue && token.type === Tok.Hue)\n\t\t) {\n\t\t\tcoords.push(token);\n\t\t\tcontinue;\n\t\t}\n\t\tif (token.type === Tok.ParenClose) {\n\t\t\tif (tokens._i < tokens.length) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tif (coords.length < 3 || coords.length > 4) {\n\t\treturn undefined;\n\t}\n\n\tif (coords.length === 4) {\n\t\tif (coords[3].type !== Tok.Alpha) {\n\t\t\treturn undefined;\n\t\t}\n\t\tcoords[3] = coords[3].value;\n\t}\n\tif (coords.length === 3) {\n\t\tcoords.push({ type: Tok.None, value: undefined });\n\t}\n\n\treturn coords.every(c => c.type !== Tok.Alpha) ? coords : undefined;\n}\n\nexport function parseModernSyntax(tokens, includeHue) {\n\ttokens._i = 0;\n\tlet token = tokens[tokens._i++];\n\tif (!token || token.type !== Tok.Function) {\n\t\treturn undefined;\n\t}\n\tlet coords = consumeCoords(tokens, includeHue);\n\tif (!coords) {\n\t\treturn undefined;\n\t}\n\tcoords.unshift(token.value);\n\treturn coords;\n}\n\nconst parse = color => {\n\tif (typeof color !== 'string') {\n\t\treturn undefined;\n\t}\n\tconst tokens = tokenize(color);\n\tconst parsed = tokens ? parseModernSyntax(tokens, true) : undefined;\n\tlet result = undefined;\n\tlet i = 0;\n\tlet len = parsers.length;\n\twhile (i < len) {\n\t\tif ((result = parsers[i++](color, parsed)) !== undefined) {\n\t\t\treturn result;\n\t\t}\n\t}\n\treturn tokens ? parseColorSyntax(tokens) : undefined;\n};\n\nexport default parse;\n","import { Tok } from '../parse.js';\n\nfunction parseRgb(color, parsed) {\n\tif (!parsed || (parsed[0] !== 'rgb' && parsed[0] !== 'rgba')) {\n\t\treturn undefined;\n\t}\n\tconst res = { mode: 'rgb' };\n\tconst [, r, g, b, alpha] = parsed;\n\tif (r.type === Tok.Hue || g.type === Tok.Hue || b.type === Tok.Hue) {\n\t\treturn undefined;\n\t}\n\tif (r.type !== Tok.None) {\n\t\tres.r = r.type === Tok.Number ? r.value / 255 : r.value / 100;\n\t}\n\tif (g.type !== Tok.None) {\n\t\tres.g = g.type === Tok.Number ? g.value / 255 : g.value / 100;\n\t}\n\tif (b.type !== Tok.None) {\n\t\tres.b = b.type === Tok.Number ? b.value / 255 : b.value / 100;\n\t}\n\tif (alpha.type !== Tok.None) {\n\t\tres.alpha = Math.min(\n\t\t\t1,\n\t\t\tMath.max(\n\t\t\t\t0,\n\t\t\t\talpha.type === Tok.Number ? alpha.value : alpha.value / 100\n\t\t\t)\n\t\t);\n\t}\n\n\treturn res;\n}\n\nexport default parseRgb;\n","const parseTransparent = c =>\n\tc === 'transparent'\n\t\t? { mode: 'rgb', r: 0, g: 0, b: 0, alpha: 0 }\n\t\t: undefined;\n\nexport default parseTransparent;\n","const lerp = (a, b, t) => a + t * (b - a);\nconst unlerp = (a, b, v) => (v - a) / (b - a);\n\nconst blerp = (a00, a01, a10, a11, tx, ty) => {\n\treturn lerp(lerp(a00, a01, tx), lerp(a10, a11, tx), ty);\n};\n\nconst trilerp = (\n\ta000,\n\ta010,\n\ta100,\n\ta110,\n\ta001,\n\ta011,\n\ta101,\n\ta111,\n\ttx,\n\tty,\n\ttz\n) => {\n\treturn lerp(\n\t\tblerp(a000, a010, a100, a110, tx, ty),\n\t\tblerp(a001, a011, a101, a111, tx, ty),\n\t\ttz\n\t);\n};\n\nexport { lerp, blerp, trilerp, unlerp };\n","const get_classes = arr => {\n\tlet classes = [];\n\tfor (let i = 0; i < arr.length - 1; i++) {\n\t\tlet a = arr[i];\n\t\tlet b = arr[i + 1];\n\t\tif (a === undefined && b === undefined) {\n\t\t\tclasses.push(undefined);\n\t\t} else if (a !== undefined && b !== undefined) {\n\t\t\tclasses.push([a, b]);\n\t\t} else {\n\t\t\tclasses.push(a !== undefined ? [a, a] : [b, b]);\n\t\t}\n\t}\n\treturn classes;\n};\n\nconst interpolatorPiecewise = interpolator => arr => {\n\tlet classes = get_classes(arr);\n\treturn t => {\n\t\tlet cls = t * classes.length;\n\t\tlet idx = t >= 1 ? classes.length - 1 : Math.max(Math.floor(cls), 0);\n\t\tlet pair = classes[idx];\n\t\treturn pair === undefined\n\t\t\t? undefined\n\t\t\t: interpolator(pair[0], pair[1], cls - idx);\n\t};\n};\n\nexport { interpolatorPiecewise };\n","import { lerp } from './lerp.js';\nimport { interpolatorPiecewise } from './piecewise.js';\n\nexport const interpolatorLinear = interpolatorPiecewise(lerp);\n","const fixupAlpha = arr => {\n\tlet some_defined = false;\n\tlet res = arr.map(v => {\n\t\tif (v !== undefined) {\n\t\t\tsome_defined = true;\n\t\t\treturn v;\n\t\t}\n\t\treturn 1;\n\t});\n\treturn some_defined ? res : arr;\n};\n\nexport { fixupAlpha };\n","import parseNamed from './parseNamed.js';\nimport parseHex from './parseHex.js';\nimport parseRgbLegacy from './parseRgbLegacy.js';\nimport parseRgb from './parseRgb.js';\nimport parseTransparent from './parseTransparent.js';\nimport { interpolatorLinear } from '../interpolate/linear.js';\nimport { fixupAlpha } from '../fixup/alpha.js';\n\n/*\n\tsRGB color space\n */\n\nconst definition = {\n\tmode: 'rgb',\n\tchannels: ['r', 'g', 'b', 'alpha'],\n\tparse: [\n\t\tparseRgb,\n\t\tparseHex,\n\t\tparseRgbLegacy,\n\t\tparseNamed,\n\t\tparseTransparent,\n\t\t'srgb'\n\t],\n\tserialize: 'srgb',\n\tinterpolate: {\n\t\tr: interpolatorLinear,\n\t\tg: interpolatorLinear,\n\t\tb: interpolatorLinear,\n\t\talpha: { use: interpolatorLinear, fixup: fixupAlpha }\n\t},\n\tgamut: true,\n\twhite: { r: 1, g: 1, b: 1 },\n\tblack: { r: 0, g: 0, b: 0 }\n};\n\nexport default definition;\n","const fn = (c = 0) => {\n\tconst abs = Math.abs(c);\n\tif (abs <= 0.04045) {\n\t\treturn c / 12.92;\n\t}\n\treturn (Math.sign(c) || 1) * Math.pow((abs + 0.055) / 1.055, 2.4);\n};\n\nconst convertRgbToLrgb = ({ r, g, b, alpha }) => {\n\tlet res = {\n\t\tmode: 'lrgb',\n\t\tr: fn(r),\n\t\tg: fn(g),\n\t\tb: fn(b)\n\t};\n\tif (alpha !== undefined) res.alpha = alpha;\n\treturn res;\n};\n\nexport default convertRgbToLrgb;\n","const fn = (c = 0) => {\n\tconst abs = Math.abs(c);\n\tif (abs > 0.0031308) {\n\t\treturn (Math.sign(c) || 1) * (1.055 * Math.pow(abs, 1 / 2.4) - 0.055);\n\t}\n\treturn c * 12.92;\n};\n\nconst convertLrgbToRgb = ({ r, g, b, alpha }, mode = 'rgb') => {\n\tlet res = {\n\t\tmode,\n\t\tr: fn(r),\n\t\tg: fn(g),\n\t\tb: fn(b)\n\t};\n\tif (alpha !== undefined) res.alpha = alpha;\n\treturn res;\n};\n\nexport default convertLrgbToRgb;\n","const normalizeHue = hue => ((hue = hue % 360) < 0 ? hue + 360 : hue);\n\nexport default normalizeHue;\n","import normalizeHue from '../util/normalizeHue.js';\n\nconst hue = (hues, fn) => {\n\treturn hues\n\t\t.map((hue, idx, arr) => {\n\t\t\tif (hue === undefined) {\n\t\t\t\treturn hue;\n\t\t\t}\n\t\t\tlet normalized = normalizeHue(hue);\n\t\t\tif (idx === 0 || hues[idx - 1] === undefined) {\n\t\t\t\treturn normalized;\n\t\t\t}\n\t\t\treturn fn(normalized - normalizeHue(arr[idx - 1]));\n\t\t})\n\t\t.reduce((acc, curr) => {\n\t\t\tif (\n\t\t\t\t!acc.length ||\n\t\t\t\tcurr === undefined ||\n\t\t\t\tacc[acc.length - 1] === undefined\n\t\t\t) {\n\t\t\t\tacc.push(curr);\n\t\t\t\treturn acc;\n\t\t\t}\n\t\t\tacc.push(curr + acc[acc.length - 1]);\n\t\t\treturn acc;\n\t\t}, []);\n};\n\nconst fixupHueShorter = arr =>\n\thue(arr, d => (Math.abs(d) <= 180 ? d : d - 360 * Math.sign(d)));\nconst fixupHueLonger = arr =>\n\thue(arr, d => (Math.abs(d) >= 180 || d === 0 ? d : d - 360 * Math.sign(d)));\nconst fixupHueIncreasing = arr => hue(arr, d => (d >= 0 ? d : d + 360));\nconst fixupHueDecreasing = arr => hue(arr, d => (d <= 0 ? d : d - 360));\n\nexport {\n\tfixupHueShorter,\n\tfixupHueLonger,\n\tfixupHueIncreasing,\n\tfixupHueDecreasing\n};\n","import { getMode } from './modes.js';\nimport converter from './converter.js';\nimport normalizeHue from './util/normalizeHue.js';\n\nconst differenceHueSaturation = (std, smp) => {\n\tif (std.h === undefined || smp.h === undefined || !std.s || !smp.s) {\n\t\treturn 0;\n\t}\n\tlet std_h = normalizeHue(std.h);\n\tlet smp_h = normalizeHue(smp.h);\n\tlet dH = Math.sin((((smp_h - std_h + 360) / 2) * Math.PI) / 180);\n\treturn 2 * Math.sqrt(std.s * smp.s) * dH;\n};\n\nconst differenceHueNaive = (std, smp) => {\n\tif (std.h === undefined || smp.h === undefined) {\n\t\treturn 0;\n\t}\n\tlet std_h = normalizeHue(std.h);\n\tlet smp_h = normalizeHue(smp.h);\n\tif (Math.abs(smp_h - std_h) > 180) {\n\t\t// todo should this be normalized once again?\n\t\treturn std_h - (smp_h - 360 * Math.sign(smp_h - std_h));\n\t}\n\treturn smp_h - std_h;\n};\n\nconst differenceHueChroma = (std, smp) => {\n\tif (std.h === undefined || smp.h === undefined || !std.c || !smp.c) {\n\t\treturn 0;\n\t}\n\tlet std_h = normalizeHue(std.h);\n\tlet smp_h = normalizeHue(smp.h);\n\tlet dH = Math.sin((((smp_h - std_h + 360) / 2) * Math.PI) / 180);\n\treturn 2 * Math.sqrt(std.c * smp.c) * dH;\n};\n\nconst differenceEuclidean = (mode = 'rgb', weights = [1, 1, 1, 0]) => {\n\tlet def = getMode(mode);\n\tlet channels = def.channels;\n\tlet diffs = def.difference;\n\tlet conv = converter(mode);\n\treturn (std, smp) => {\n\t\tlet ConvStd = conv(std);\n\t\tlet ConvSmp = conv(smp);\n\t\treturn Math.sqrt(\n\t\t\tchannels.reduce((sum, k, idx) => {\n\t\t\t\tlet delta = diffs[k]\n\t\t\t\t\t? diffs[k](ConvStd, ConvSmp)\n\t\t\t\t\t: ConvStd[k] - ConvSmp[k];\n\t\t\t\treturn (\n\t\t\t\t\tsum +\n\t\t\t\t\t(weights[idx] || 0) * Math.pow(isNaN(delta) ? 0 : delta, 2)\n\t\t\t\t);\n\t\t\t}, 0)\n\t\t);\n\t};\n};\n\nconst differenceCie76 = () => differenceEuclidean('lab65');\n\nconst differenceCie94 = (kL = 1, K1 = 0.045, K2 = 0.015) => {\n\tlet lab = converter('lab65');\n\n\treturn (std, smp) => {\n\t\tlet LabStd = lab(std);\n\t\tlet LabSmp = lab(smp);\n\n\t\t// Extract Lab values, and compute Chroma\n\t\tlet lStd = LabStd.l;\n\t\tlet aStd = LabStd.a;\n\t\tlet bStd = LabStd.b;\n\t\tlet cStd = Math.sqrt(aStd * aStd + bStd * bStd);\n\n\t\tlet lSmp = LabSmp.l;\n\t\tlet aSmp = LabSmp.a;\n\t\tlet bSmp = LabSmp.b;\n\t\tlet cSmp = Math.sqrt(aSmp * aSmp + bSmp * bSmp);\n\n\t\tlet dL2 = Math.pow(lStd - lSmp, 2);\n\t\tlet dC2 = Math.pow(cStd - cSmp, 2);\n\t\tlet dH2 = Math.pow(aStd - aSmp, 2) + Math.pow(bStd - bSmp, 2) - dC2;\n\n\t\treturn Math.sqrt(\n\t\t\tdL2 / Math.pow(kL, 2) +\n\t\t\t\tdC2 / Math.pow(1 + K1 * cStd, 2) +\n\t\t\t\tdH2 / Math.pow(1 + K2 * cStd, 2)\n\t\t);\n\t};\n};\n\n/*\n\tCIEDE2000 color difference, original Matlab implementation by Gaurav Sharma\n\tBased on \"The CIEDE2000 Color-Difference Formula: Implementation Notes, Supplementary Test Data, and Mathematical Observations\" \n\tby Gaurav Sharma, Wencheng Wu, Edul N. Dalal in Color Research and Application, vol. 30. No. 1, pp. 21-30, February 2005.\n\thttp://www2.ece.rochester.edu/~gsharma/ciede2000/\n */\n\nconst differenceCiede2000 = (Kl = 1, Kc = 1, Kh = 1) => {\n\tlet lab = converter('lab65');\n\treturn (std, smp) => {\n\t\tlet LabStd = lab(std);\n\t\tlet LabSmp = lab(smp);\n\n\t\tlet lStd = LabStd.l;\n\t\tlet aStd = LabStd.a;\n\t\tlet bStd = LabStd.b;\n\t\tlet cStd = Math.sqrt(aStd * aStd + bStd * bStd);\n\n\t\tlet lSmp = LabSmp.l;\n\t\tlet aSmp = LabSmp.a;\n\t\tlet bSmp = LabSmp.b;\n\t\tlet cSmp = Math.sqrt(aSmp * aSmp + bSmp * bSmp);\n\n\t\tlet cAvg = (cStd + cSmp) / 2;\n\n\t\tlet G =\n\t\t\t0.5 *\n\t\t\t(1 -\n\t\t\t\tMath.sqrt(\n\t\t\t\t\tMath.pow(cAvg, 7) / (Math.pow(cAvg, 7) + Math.pow(25, 7))\n\t\t\t\t));\n\n\t\tlet apStd = aStd * (1 + G);\n\t\tlet apSmp = aSmp * (1 + G);\n\n\t\tlet cpStd = Math.sqrt(apStd * apStd + bStd * bStd);\n\t\tlet cpSmp = Math.sqrt(apSmp * apSmp + bSmp * bSmp);\n\n\t\tlet hpStd =\n\t\t\tMath.abs(apStd) + Math.abs(bStd) === 0\n\t\t\t\t? 0\n\t\t\t\t: Math.atan2(bStd, apStd);\n\t\thpStd += (hpStd < 0) * 2 * Math.PI;\n\n\t\tlet hpSmp =\n\t\t\tMath.abs(apSmp) + Math.abs(bSmp) === 0\n\t\t\t\t? 0\n\t\t\t\t: Math.atan2(bSmp, apSmp);\n\t\thpSmp += (hpSmp < 0) * 2 * Math.PI;\n\n\t\tlet dL = lSmp - lStd;\n\t\tlet dC = cpSmp - cpStd;\n\n\t\tlet dhp = cpStd * cpSmp === 0 ? 0 : hpSmp - hpStd;\n\t\tdhp -= (dhp > Math.PI) * 2 * Math.PI;\n\t\tdhp += (dhp < -Math.PI) * 2 * Math.PI;\n\n\t\tlet dH = 2 * Math.sqrt(cpStd * cpSmp) * Math.sin(dhp / 2);\n\n\t\tlet Lp = (lStd + lSmp) / 2;\n\t\tlet Cp = (cpStd + cpSmp) / 2;\n\n\t\tlet hp;\n\t\tif (cpStd * cpSmp === 0) {\n\t\t\thp = hpStd + hpSmp;\n\t\t} else {\n\t\t\thp = (hpStd + hpSmp) / 2;\n\t\t\thp -= (Math.abs(hpStd - hpSmp) > Math.PI) * Math.PI;\n\t\t\thp += (hp < 0) * 2 * Math.PI;\n\t\t}\n\n\t\tlet Lpm50 = Math.pow(Lp - 50, 2);\n\t\tlet T =\n\t\t\t1 -\n\t\t\t0.17 * Math.cos(hp - Math.PI / 6) +\n\t\t\t0.24 * Math.cos(2 * hp) +\n\t\t\t0.32 * Math.cos(3 * hp + Math.PI / 30) -\n\t\t\t0.2 * Math.cos(4 * hp - (63 * Math.PI) / 180);\n\n\t\tlet Sl = 1 + (0.015 * Lpm50) / Math.sqrt(20 + Lpm50);\n\t\tlet Sc = 1 + 0.045 * Cp;\n\t\tlet Sh = 1 + 0.015 * Cp * T;\n\n\t\tlet deltaTheta =\n\t\t\t((30 * Math.PI) / 180) *\n\t\t\tMath.exp(-1 * Math.pow(((180 / Math.PI) * hp - 275) / 25, 2));\n\t\tlet Rc =\n\t\t\t2 *\n\t\t\tMath.sqrt(Math.pow(Cp, 7) / (Math.pow(Cp, 7) + Math.pow(25, 7)));\n\n\t\tlet Rt = -1 * Math.sin(2 * deltaTheta) * Rc;\n\n\t\treturn Math.sqrt(\n\t\t\tMath.pow(dL / (Kl * Sl), 2) +\n\t\t\t\tMath.pow(dC / (Kc * Sc), 2) +\n\t\t\t\tMath.pow(dH / (Kh * Sh), 2) +\n\t\t\t\t(((Rt * dC) / (Kc * Sc)) * dH) / (Kh * Sh)\n\t\t);\n\t};\n};\n\n/*\n\tCMC (l:c) difference formula\n\n\tReferences:\n\t\thttps://en.wikipedia.org/wiki/Color_difference#CMC_l:c_(1984)\n\t\thttp://www.brucelindbloom.com/index.html?Eqn_DeltaE_CMC.html\n */\nconst differenceCmc = (l = 1, c = 1) => {\n\tlet lab = converter('lab65');\n\n\t/*\n\t\tComparte two colors:\n\t\tstd - standard (first) color\n\t\tsmp - sample (second) color\n\t */\n\treturn (std, smp) => {\n\t\t// convert standard color to Lab\n\t\tlet LabStd = lab(std);\n\t\tlet lStd = LabStd.l;\n\t\tlet aStd = LabStd.a;\n\t\tlet bStd = LabStd.b;\n\n\t\t// Obtain hue/chroma\n\t\tlet cStd = Math.sqrt(aStd * aStd + bStd * bStd);\n\t\tlet hStd = Math.atan2(bStd, aStd);\n\t\thStd = hStd + 2 * Math.PI * (hStd < 0);\n\n\t\t// convert sample color to Lab, obtain LCh\n\t\tlet LabSmp = lab(smp);\n\t\tlet lSmp = LabSmp.l;\n\t\tlet aSmp = LabSmp.a;\n\t\tlet bSmp = LabSmp.b;\n\n\t\t// Obtain chroma\n\t\tlet cSmp = Math.sqrt(aSmp * aSmp + bSmp * bSmp);\n\n\t\t// lightness delta squared\n\t\tlet dL2 = Math.pow(lStd - lSmp, 2);\n\n\t\t// chroma delta squared\n\t\tlet dC2 = Math.pow(cStd - cSmp, 2);\n\n\t\t// hue delta squared\n\t\tlet dH2 = Math.pow(aStd - aSmp, 2) + Math.pow(bStd - bSmp, 2) - dC2;\n\n\t\tlet F = Math.sqrt(Math.pow(cStd, 4) / (Math.pow(cStd, 4) + 1900));\n\t\tlet T =\n\t\t\thStd >= (164 / 180) * Math.PI && hStd <= (345 / 180) * Math.PI\n\t\t\t\t? 0.56 + Math.abs(0.2 * Math.cos(hStd + (168 / 180) * Math.PI))\n\t\t\t\t: 0.36 + Math.abs(0.4 * Math.cos(hStd + (35 / 180) * Math.PI));\n\n\t\tlet Sl = lStd < 16 ? 0.511 : (0.040975 * lStd) / (1 + 0.01765 * lStd);\n\t\tlet Sc = (0.0638 * cStd) / (1 + 0.0131 * cStd) + 0.638;\n\t\tlet Sh = Sc * (F * T + 1 - F);\n\n\t\treturn Math.sqrt(\n\t\t\tdL2 / Math.pow(l * Sl, 2) +\n\t\t\t\tdC2 / Math.pow(c * Sc, 2) +\n\t\t\t\tdH2 / Math.pow(Sh, 2)\n\t\t);\n\t};\n};\n\n/*\n\n\tHyAB color difference formula, introduced in:\n\n\t\tAbasi S, Amani Tehran M, Fairchild MD. \n\t\t\"Distance metrics for very large color differences.\"\n\t\tColor Res Appl. 2019; 1–16. \n\t\thttps://doi.org/10.1002/col.22451\n\n\tPDF available at:\n\t\n\t\thttp://markfairchild.org/PDFs/PAP40.pdf\n */\nconst differenceHyab = () => {\n\tlet lab = converter('lab65');\n\treturn (std, smp) => {\n\t\tlet LabStd = lab(std);\n\t\tlet LabSmp = lab(smp);\n\t\tlet dL = LabStd.l - LabSmp.l;\n\t\tlet dA = LabStd.a - LabSmp.a;\n\t\tlet dB = LabStd.b - LabSmp.b;\n\t\treturn Math.abs(dL) + Math.sqrt(dA * dA + dB * dB);\n\t};\n};\n\n/*\n\t\"Measuring perceived color difference using YIQ NTSC\n\ttransmission color space in mobile applications\"\n\t\t\n\t\tby Yuriy Kotsarenko, Fernando Ramos in:\n\t\tProgramación Matemática y Software (2010) \n\n\tAvailable at:\n\t\t\n\t\thttp://www.progmat.uaem.mx:8080/artVol2Num2/Articulo3Vol2Num2.pdf\n */\nconst differenceKotsarenkoRamos = () =>\n\tdifferenceEuclidean('yiq', [0.5053, 0.299, 0.1957]);\n\n/*\n\tΔE_ITP, as defined in Rec. ITU-R BT.2124:\n\n\thttps://www.itu.int/rec/R-REC-BT.2124/en\n*/\nconst differenceItp = () =>\n\tdifferenceEuclidean('itp', [518400, 129600, 518400]);\n\nexport {\n\tdifferenceHueChroma,\n\tdifferenceHueSaturation,\n\tdifferenceHueNaive,\n\tdifferenceEuclidean,\n\tdifferenceCie76,\n\tdifferenceCie94,\n\tdifferenceCiede2000,\n\tdifferenceCmc,\n\tdifferenceHyab,\n\tdifferenceKotsarenkoRamos,\n\tdifferenceItp\n};\n","import converter from './converter.js';\nimport { getMode } from './modes.js';\n\nconst averageAngle = val => {\n\t// See: https://en.wikipedia.org/wiki/Mean_of_circular_quantities\n\tlet sum = val.reduce(\n\t\t(sum, val) => {\n\t\t\tif (val !== undefined) {\n\t\t\t\tlet rad = (val * Math.PI) / 180;\n\t\t\t\tsum.sin += Math.sin(rad);\n\t\t\t\tsum.cos += Math.cos(rad);\n\t\t\t}\n\t\t\treturn sum;\n\t\t},\n\t\t{ sin: 0, cos: 0 }\n\t);\n\tlet angle = (Math.atan2(sum.sin, sum.cos) * 180) / Math.PI;\n\treturn angle < 0 ? 360 + angle : angle;\n};\n\nconst averageNumber = val => {\n\tlet a = val.filter(v => v !== undefined);\n\treturn a.length ? a.reduce((sum, v) => sum + v, 0) / a.length : undefined;\n};\n\nconst isfn = o => typeof o === 'function';\n\nfunction average(colors, mode = 'rgb', overrides) {\n\tlet def = getMode(mode);\n\tlet cc = colors.map(converter(mode));\n\treturn def.channels.reduce(\n\t\t(res, ch) => {\n\t\t\tlet arr = cc.map(c => c[ch]).filter(val => val !== undefined);\n\t\t\tif (arr.length) {\n\t\t\t\tlet fn;\n\t\t\t\tif (isfn(overrides)) {\n\t\t\t\t\tfn = overrides;\n\t\t\t\t} else if (overrides && isfn(overrides[ch])) {\n\t\t\t\t\tfn = overrides[ch];\n\t\t\t\t} else if (def.average && isfn(def.average[ch])) {\n\t\t\t\t\tfn = def.average[ch];\n\t\t\t\t} else {\n\t\t\t\t\tfn = averageNumber;\n\t\t\t\t}\n\t\t\t\tres[ch] = fn(arr, ch);\n\t\t\t}\n\t\t\treturn res;\n\t\t},\n\t\t{ mode }\n\t);\n}\n\nexport { average, averageAngle, averageNumber };\n","import normalizeHue from '../util/normalizeHue.js';\n\n/* \n\tReferences: \n\t\t* https://drafts.csswg.org/css-color/#lab-to-lch\n\t\t* https://drafts.csswg.org/css-color/#color-conversion-code\n*/\nconst convertLabToLch = ({ l, a, b, alpha }, mode = 'lch') => {\n\tif (a === undefined) a = 0;\n\tif (b === undefined) b = 0;\n\tlet c = Math.sqrt(a * a + b * b);\n\tlet res = { mode, l, c };\n\tif (c) res.h = normalizeHue((Math.atan2(b, a) * 180) / Math.PI);\n\tif (alpha !== undefined) res.alpha = alpha;\n\treturn res;\n};\n\nexport default convertLabToLch;\n","/* \n\tReferences: \n\t\t* https://drafts.csswg.org/css-color/#lch-to-lab\n\t\t* https://drafts.csswg.org/css-color/#color-conversion-code\n*/\nconst convertLchToLab = ({ l, c, h, alpha }, mode = 'lab') => {\n\tif (h === undefined) h = 0;\n\tlet res = {\n\t\tmode,\n\t\tl,\n\t\ta: c ? c * Math.cos((h / 180) * Math.PI) : 0,\n\t\tb: c ? c * Math.sin((h / 180) * Math.PI) : 0\n\t};\n\tif (alpha !== undefined) res.alpha = alpha;\n\treturn res;\n};\n\nexport default convertLchToLab;\n","/*\n\tThe XYZ tristimulus values (white point)\n\tof standard illuminants for the CIE 1931 2° \n\tstandard observer.\n\n\tSee: https://en.wikipedia.org/wiki/Standard_illuminant\n */\n\nexport const D50 = {\n\tX: 0.3457 / 0.3585,\n\tY: 1,\n\tZ: (1 - 0.3457 - 0.3585) / 0.3585\n};\n\nexport const D65 = {\n\tX: 0.3127 / 0.329,\n\tY: 1,\n\tZ: (1 - 0.3127 - 0.329) / 0.329\n};\n\nexport const k = Math.pow(29, 3) / Math.pow(3, 3);\nexport const e = Math.pow(6, 3) / Math.pow(29, 3);\n","import normalizeHue from '../util/normalizeHue.js';\n// Based on: https://en.wikipedia.org/wiki/HSL_and_HSV#Converting_to_RGB\n\nexport default function convertHslToRgb({ h, s, l, alpha }) {\n\th = normalizeHue(h !== undefined ? h : 0);\n\tif (s === undefined) s = 0;\n\tif (l === undefined) l = 0;\n\tlet m1 = l + s * (l < 0.5 ? l : 1 - l);\n\tlet m2 = m1 - (m1 - l) * 2 * Math.abs(((h / 60) % 2) - 1);\n\tlet res;\n\tswitch (Math.floor(h / 60)) {\n\t\tcase 0:\n\t\t\tres = { r: m1, g: m2, b: 2 * l - m1 };\n\t\t\tbreak;\n\t\tcase 1:\n\t\t\tres = { r: m2, g: m1, b: 2 * l - m1 };\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tres = { r: 2 * l - m1, g: m1, b: m2 };\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\tres = { r: 2 * l - m1, g: m2, b: m1 };\n\t\t\tbreak;\n\t\tcase 4:\n\t\t\tres = { r: m2, g: 2 * l - m1, b: m1 };\n\t\t\tbreak;\n\t\tcase 5:\n\t\t\tres = { r: m1, g: 2 * l - m1, b: m2 };\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tres = { r: 2 * l - m1, g: 2 * l - m1, b: 2 * l - m1 };\n\t}\n\tres.mode = 'rgb';\n\tif (alpha !== undefined) res.alpha = alpha;\n\treturn res;\n}\n","// Based on: https://en.wikipedia.org/wiki/HSL_and_HSV#Formal_derivation\n\nexport default function convertRgbToHsl({ r, g, b, alpha }) {\n\tif (r === undefined) r = 0;\n\tif (g === undefined) g = 0;\n\tif (b === undefined) b = 0;\n\tlet M = Math.max(r, g, b),\n\t\tm = Math.min(r, g, b);\n\tlet res = {\n\t\tmode: 'hsl',\n\t\ts: M === m ? 0 : (M - m) / (1 - Math.abs(M + m - 1)),\n\t\tl: 0.5 * (M + m)\n\t};\n\tif (M - m !== 0)\n\t\tres.h =\n\t\t\t(M === r\n\t\t\t\t? (g - b) / (M - m) + (g < b) * 6\n\t\t\t\t: M === g\n\t\t\t\t? (b - r) / (M - m) + 2\n\t\t\t\t: (r - g) / (M - m) + 4) * 60;\n\tif (alpha !== undefined) res.alpha = alpha;\n\treturn res;\n}\n","const hueToDeg = (val, unit) => {\n\tswitch (unit) {\n\t\tcase 'deg':\n\t\t\treturn +val;\n\t\tcase 'rad':\n\t\t\treturn (val / Math.PI) * 180;\n\t\tcase 'grad':\n\t\t\treturn (val / 10) * 9;\n\t\tcase 'turn':\n\t\t\treturn val * 360;\n\t}\n};\n\nexport default hueToDeg;\n","import hueToDeg from '../util/hue.js';\nimport { hue, per, num_per, c } from '../util/regex.js';\n\n/*\n\thsl() regular expressions for legacy format\n\tReference: https://drafts.csswg.org/css-color/#the-hsl-notation\n */\nconst hsl_old = new RegExp(\n\t`^hsla?\\\\(\\\\s*${hue}${c}${per}${c}${per}\\\\s*(?:,\\\\s*${num_per}\\\\s*)?\\\\)$`\n);\n\nconst parseHslLegacy = color => {\n\tlet match = color.match(hsl_old);\n\tif (!match) return;\n\tlet res = { mode: 'hsl' };\n\n\tif (match[3] !== undefined) {\n\t\tres.h = +match[3];\n\t} else if (match[1] !== undefined && match[2] !== undefined) {\n\t\tres.h = hueToDeg(match[1], match[2]);\n\t}\n\n\tif (match[4] !== undefined) {\n\t\tres.s = Math.min(Math.max(0, match[4] / 100), 1);\n\t}\n\n\tif (match[5] !== undefined) {\n\t\tres.l = Math.min(Math.max(0, match[5] / 100), 1);\n\t}\n\n\tif (match[6] !== undefined) {\n\t\tres.alpha = Math.max(0, Math.min(1, match[6] / 100));\n\t} else if (match[7] !== undefined) {\n\t\tres.alpha = Math.max(0, Math.min(1, +match[7]));\n\t}\n\treturn res;\n};\n\nexport default parseHslLegacy;\n","import { Tok } from '../parse.js';\n\nfunction parseHsl(color, parsed) {\n\tif (!parsed || (parsed[0] !== 'hsl' && parsed[0] !== 'hsla')) {\n\t\treturn undefined;\n\t}\n\tconst res = { mode: 'hsl' };\n\tconst [, h, s, l, alpha] = parsed;\n\n\tif (h.type !== Tok.None) {\n\t\tif (h.type === Tok.Percentage) {\n\t\t\treturn undefined;\n\t\t}\n\t\tres.h = h.value;\n\t}\n\n\tif (s.type !== Tok.None) {\n\t\tif (s.type === Tok.Hue) {\n\t\t\treturn undefined;\n\t\t}\n\t\tres.s = s.value / 100;\n\t}\n\n\tif (l.type !== Tok.None) {\n\t\tif (l.type === Tok.Hue) {\n\t\t\treturn undefined;\n\t\t}\n\t\tres.l = l.value / 100;\n\t}\n\n\tif (alpha.type !== Tok.None) {\n\t\tres.alpha = Math.min(\n\t\t\t1,\n\t\t\tMath.max(\n\t\t\t\t0,\n\t\t\t\talpha.type === Tok.Number ? alpha.value : alpha.value / 100\n\t\t\t)\n\t\t);\n\t}\n\n\treturn res;\n}\n\nexport default parseHsl;\n","import convertHslToRgb from './convertHslToRgb.js';\nimport convertRgbToHsl from './convertRgbToHsl.js';\nimport parseHslLegacy from './parseHslLegacy.js';\nimport parseHsl from './parseHsl.js';\nimport { fixupHueShorter } from '../fixup/hue.js';\nimport { fixupAlpha } from '../fixup/alpha.js';\nimport { interpolatorLinear } from '../interpolate/linear.js';\nimport { differenceHueSaturation } from '../difference.js';\nimport { averageAngle } from '../average.js';\n\nconst definition = {\n\tmode: 'hsl',\n\n\ttoMode: {\n\t\trgb: convertHslToRgb\n\t},\n\n\tfromMode: {\n\t\trgb: convertRgbToHsl\n\t},\n\n\tchannels: ['h', 's', 'l', 'alpha'],\n\n\tranges: {\n\t\th: [0, 360]\n\t},\n\n\tgamut: 'rgb',\n\n\tparse: [parseHsl, parseHslLegacy],\n\tserialize: c =>\n\t\t`hsl(${c.h !== undefined ? c.h : 'none'} ${\n\t\t\tc.s !== undefined ? c.s * 100 + '%' : 'none'\n\t\t} ${c.l !== undefined ? c.l * 100 + '%' : 'none'}${\n\t\t\tc.alpha < 1 ? ` / ${c.alpha}` : ''\n\t\t})`,\n\n\tinterpolate: {\n\t\th: { use: interpolatorLinear, fixup: fixupHueShorter },\n\t\ts: interpolatorLinear,\n\t\tl: interpolatorLinear,\n\t\talpha: { use: interpolatorLinear, fixup: fixupAlpha }\n\t},\n\n\tdifference: {\n\t\th: differenceHueSaturation\n\t},\n\n\taverage: {\n\t\th: averageAngle\n\t}\n};\n\nexport default definition;\n","import normalizeHue from '../util/normalizeHue.js';\n\n// Based on: https://en.wikipedia.org/wiki/HSL_and_HSV#Converting_to_RGB\n\nexport default function convertHsvToRgb({ h, s, v, alpha }) {\n\th = normalizeHue(h !== undefined ? h : 0);\n\tif (s === undefined) s = 0;\n\tif (v === undefined) v = 0;\n\tlet f = Math.abs(((h / 60) % 2) - 1);\n\tlet res;\n\tswitch (Math.floor(h / 60)) {\n\t\tcase 0:\n\t\t\tres = { r: v, g: v * (1 - s * f), b: v * (1 - s) };\n\t\t\tbreak;\n\t\tcase 1:\n\t\t\tres = { r: v * (1 - s * f), g: v, b: v * (1 - s) };\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tres = { r: v * (1 - s), g: v, b: v * (1 - s * f) };\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\tres = { r: v * (1 - s), g: v * (1 - s * f), b: v };\n\t\t\tbreak;\n\t\tcase 4:\n\t\t\tres = { r: v * (1 - s * f), g: v * (1 - s), b: v };\n\t\t\tbreak;\n\t\tcase 5:\n\t\t\tres = { r: v, g: v * (1 - s), b: v * (1 - s * f) };\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tres = { r: v * (1 - s), g: v * (1 - s), b: v * (1 - s) };\n\t}\n\tres.mode = 'rgb';\n\tif (alpha !== undefined) res.alpha = alpha;\n\treturn res;\n}\n","// Based on: https://en.wikipedia.org/wiki/HSL_and_HSV#Formal_derivation\n\nexport default function convertRgbToHsv({ r, g, b, alpha }) {\n\tif (r === undefined) r = 0;\n\tif (g === undefined) g = 0;\n\tif (b === undefined) b = 0;\n\tlet M = Math.max(r, g, b),\n\t\tm = Math.min(r, g, b);\n\tlet res = {\n\t\tmode: 'hsv',\n\t\ts: M === 0 ? 0 : 1 - m / M,\n\t\tv: M\n\t};\n\tif (M - m !== 0)\n\t\tres.h =\n\t\t\t(M === r\n\t\t\t\t? (g - b) / (M - m) + (g < b) * 6\n\t\t\t\t: M === g\n\t\t\t\t? (b - r) / (M - m) + 2\n\t\t\t\t: (r - g) / (M - m) + 4) * 60;\n\tif (alpha !== undefined) res.alpha = alpha;\n\treturn res;\n}\n","import convertHsvToRgb from './convertHsvToRgb.js';\nimport convertRgbToHsv from './convertRgbToHsv.js';\nimport { fixupHueShorter } from '../fixup/hue.js';\nimport { fixupAlpha } from '../fixup/alpha.js';\nimport { interpolatorLinear } from '../interpolate/linear.js';\nimport { differenceHueSaturation } from '../difference.js';\nimport { averageAngle } from '../average.js';\n\nconst definition = {\n\tmode: 'hsv',\n\n\ttoMode: {\n\t\trgb: convertHsvToRgb\n\t},\n\n\tparse: ['--hsv'],\n\tserialize: '--hsv',\n\n\tfromMode: {\n\t\trgb: convertRgbToHsv\n\t},\n\n\tchannels: ['h', 's', 'v', 'alpha'],\n\n\tranges: {\n\t\th: [0, 360]\n\t},\n\n\tgamut: 'rgb',\n\n\tinterpolate: {\n\t\th: { use: interpolatorLinear, fixup: fixupHueShorter },\n\t\ts: interpolatorLinear,\n\t\tv: interpolatorLinear,\n\t\talpha: { use: interpolatorLinear, fixup: fixupAlpha }\n\t},\n\n\tdifference: {\n\t\th: differenceHueSaturation\n\t},\n\n\taverage: {\n\t\th: averageAngle\n\t}\n};\n\nexport default definition;\n","export const k = Math.pow(29, 3) / Math.pow(3, 3);\nexport const e = Math.pow(6, 3) / Math.pow(29, 3);\n","import { k, e } from '../xyz50/constants.js';\nimport { D50 } from '../constants.js';\n\nlet fn = v => (Math.pow(v, 3) > e ? Math.pow(v, 3) : (116 * v - 16) / k);\n\nconst convertLabToXyz50 = ({ l, a, b, alpha }) => {\n\tif (l === undefined) l = 0;\n\tif (a === undefined) a = 0;\n\tif (b === undefined) b = 0;\n\tlet fy = (l + 16) / 116;\n\tlet fx = a / 500 + fy;\n\tlet fz = fy - b / 200;\n\n\tlet res = {\n\t\tmode: 'xyz50',\n\t\tx: fn(fx) * D50.X,\n\t\ty: fn(fy) * D50.Y,\n\t\tz: fn(fz) * D50.Z\n\t};\n\n\tif (alpha !== undefined) {\n\t\tres.alpha = alpha;\n\t}\n\n\treturn res;\n};\n\nexport default convertLabToXyz50;\n","/*\n\tCIE XYZ D50 values to sRGB.\n\n\tReferences:\n\t\t* https://drafts.csswg.org/css-color/#color-conversion-code\n\t\t* http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html\n*/\n\nimport convertLrgbToRgb from '../lrgb/convertLrgbToRgb.js';\n\nconst convertXyz50ToRgb = ({ x, y, z, alpha }) => {\n\tif (x === undefined) x = 0;\n\tif (y === undefined) y = 0;\n\tif (z === undefined) z = 0;\n\tlet res = convertLrgbToRgb({\n\t\tr:\n\t\t\tx * 3.1341359569958707 -\n\t\t\ty * 1.6173863321612538 -\n\t\t\t0.4906619460083532 * z,\n\t\tg:\n\t\t\tx * -0.978795502912089 +\n\t\t\ty * 1.916254567259524 +\n\t\t\t0.03344273116131949 * z,\n\t\tb:\n\t\t\tx * 0.07195537988411677 -\n\t\t\ty * 0.2289768264158322 +\n\t\t\t1.405386058324125 * z\n\t});\n\tif (alpha !== undefined) {\n\t\tres.alpha = alpha;\n\t}\n\treturn res;\n};\n\nexport default convertXyz50ToRgb;\n","import convertLabToXyz50 from './convertLabToXyz50.js';\nimport convertXyz50ToRgb from '../xyz50/convertXyz50ToRgb.js';\n\nconst convertLabToRgb = lab => convertXyz50ToRgb(convertLabToXyz50(lab));\n\nexport default convertLabToRgb;\n","/*\n\tConvert sRGB values to CIE XYZ D50\n\n\tReferences:\n\t\t* https://drafts.csswg.org/css-color/#color-conversion-code\n\t\t* http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html\n\t\n*/\n\nimport convertRgbToLrgb from '../lrgb/convertRgbToLrgb.js';\n\nconst convertRgbToXyz50 = rgb => {\n\tlet { r, g, b, alpha } = convertRgbToLrgb(rgb);\n\tlet res = {\n\t\tmode: 'xyz50',\n\t\tx:\n\t\t\t0.436065742824811 * r +\n\t\t\t0.3851514688337912 * g +\n\t\t\t0.14307845442264197 * b,\n\t\ty:\n\t\t\t0.22249319175623702 * r +\n\t\t\t0.7168870538238823 * g +\n\t\t\t0.06061979053616537 * b,\n\t\tz:\n\t\t\t0.013923904500943465 * r +\n\t\t\t0.09708128566574634 * g +\n\t\t\t0.7140993584005155 * b\n\t};\n\tif (alpha !== undefined) {\n\t\tres.alpha = alpha;\n\t}\n\treturn res;\n};\n\nexport default convertRgbToXyz50;\n","import { k, e } from '../xyz50/constants.js';\nimport { D50 } from '../constants.js';\n\nconst f = value => (value > e ? Math.cbrt(value) : (k * value + 16) / 116);\n\nconst convertXyz50ToLab = ({ x, y, z, alpha }) => {\n\tif (x === undefined) x = 0;\n\tif (y === undefined) y = 0;\n\tif (z === undefined) z = 0;\n\tlet f0 = f(x / D50.X);\n\tlet f1 = f(y / D50.Y);\n\tlet f2 = f(z / D50.Z);\n\n\tlet res = {\n\t\tmode: 'lab',\n\t\tl: 116 * f1 - 16,\n\t\ta: 500 * (f0 - f1),\n\t\tb: 200 * (f1 - f2)\n\t};\n\n\tif (alpha !== undefined) {\n\t\tres.alpha = alpha;\n\t}\n\n\treturn res;\n};\n\nexport default convertXyz50ToLab;\n","import convertRgbToXyz50 from '../xyz50/convertRgbToXyz50.js';\nimport convertXyz50ToLab from './convertXyz50ToLab.js';\n\nconst convertRgbToLab = rgb => {\n\tlet res = convertXyz50ToLab(convertRgbToXyz50(rgb));\n\n\t// Fixes achromatic RGB colors having a _slight_ chroma due to floating-point errors\n\t// and approximated computations in sRGB <-> CIELab.\n\t// See: https://github.com/d3/d3-color/pull/46\n\tif (rgb.r === rgb.b && rgb.b === rgb.g) {\n\t\tres.a = res.b = 0;\n\t}\n\treturn res;\n};\n\nexport default convertRgbToLab;\n","import { Tok } from '../parse.js';\n\nfunction parseLab(color, parsed) {\n\tif (!parsed || parsed[0] !== 'lab') {\n\t\treturn undefined;\n\t}\n\tconst res = { mode: 'lab' };\n\tconst [, l, a, b, alpha] = parsed;\n\tif (l.type === Tok.Hue || a.type === Tok.Hue || b.type === Tok.Hue) {\n\t\treturn undefined;\n\t}\n\tif (l.type !== Tok.None) {\n\t\tres.l = Math.min(Math.max(0, l.value), 100);\n\t}\n\tif (a.type !== Tok.None) {\n\t\tres.a = a.type === Tok.Number ? a.value : (a.value * 125) / 100;\n\t}\n\tif (b.type !== Tok.None) {\n\t\tres.b = b.type === Tok.Number ? b.value : (b.value * 125) / 100;\n\t}\n\tif (alpha.type !== Tok.None) {\n\t\tres.alpha = Math.min(\n\t\t\t1,\n\t\t\tMath.max(\n\t\t\t\t0,\n\t\t\t\talpha.type === Tok.Number ? alpha.value : alpha.value / 100\n\t\t\t)\n\t\t);\n\t}\n\n\treturn res;\n}\n\nexport default parseLab;\n","import convertLabToRgb from './convertLabToRgb.js';\nimport convertLabToXyz50 from './convertLabToXyz50.js';\nimport convertRgbToLab from './convertRgbToLab.js';\nimport convertXyz50ToLab from './convertXyz50ToLab.js';\nimport parseLab from './parseLab.js';\nimport { interpolatorLinear } from '../interpolate/linear.js';\nimport { fixupAlpha } from '../fixup/alpha.js';\n\nconst definition = {\n\tmode: 'lab',\n\n\ttoMode: {\n\t\txyz50: convertLabToXyz50,\n\t\trgb: convertLabToRgb\n\t},\n\n\tfromMode: {\n\t\txyz50: convertXyz50ToLab,\n\t\trgb: convertRgbToLab\n\t},\n\n\tchannels: ['l', 'a', 'b', 'alpha'],\n\n\tranges: {\n\t\tl: [0, 100],\n\t\ta: [-125, 125],\n\t\tb: [-125, 125]\n\t},\n\n\tparse: [parseLab],\n\tserialize: c =>\n\t\t`lab(${c.l !== undefined ? c.l : 'none'} ${\n\t\t\tc.a !== undefined ? c.a : 'none'\n\t\t} ${c.b !== undefined ? c.b : 'none'}${\n\t\t\tc.alpha < 1 ? ` / ${c.alpha}` : ''\n\t\t})`,\n\n\tinterpolate: {\n\t\tl: interpolatorLinear,\n\t\ta: interpolatorLinear,\n\t\tb: interpolatorLinear,\n\t\talpha: { use: interpolatorLinear, fixup: fixupAlpha }\n\t}\n};\n\nexport default definition;\n","import { Tok } from '../parse.js';\n\nfunction parseLch(color, parsed) {\n\tif (!parsed || parsed[0] !== 'lch') {\n\t\treturn undefined;\n\t}\n\tconst res = { mode: 'lch' };\n\tconst [, l, c, h, alpha] = parsed;\n\tif (l.type !== Tok.None) {\n\t\tif (l.type === Tok.Hue) {\n\t\t\treturn undefined;\n\t\t}\n\t\tres.l = Math.min(Math.max(0, l.value), 100);\n\t}\n\tif (c.type !== Tok.None) {\n\t\tres.c = Math.max(\n\t\t\t0,\n\t\t\tc.type === Tok.Number ? c.value : (c.value * 150) / 100\n\t\t);\n\t}\n\tif (h.type !== Tok.None) {\n\t\tif (h.type === Tok.Percentage) {\n\t\t\treturn undefined;\n\t\t}\n\t\tres.h = h.value;\n\t}\n\tif (alpha.type !== Tok.None) {\n\t\tres.alpha = Math.min(\n\t\t\t1,\n\t\t\tMath.max(\n\t\t\t\t0,\n\t\t\t\talpha.type === Tok.Number ? alpha.value : alpha.value / 100\n\t\t\t)\n\t\t);\n\t}\n\n\treturn res;\n}\n\nexport default parseLch;\n","import convertLabToLch from './convertLabToLch.js';\nimport convertLchToLab from './convertLchToLab.js';\nimport convertLabToRgb from '../lab/convertLabToRgb.js';\nimport convertRgbToLab from '../lab/convertRgbToLab.js';\nimport parseLch from './parseLch.js';\nimport { fixupHueShorter } from '../fixup/hue.js';\nimport { fixupAlpha } from '../fixup/alpha.js';\nimport { interpolatorLinear } from '../interpolate/linear.js';\nimport { differenceHueChroma } from '../difference.js';\nimport { averageAngle } from '../average.js';\n\nconst definition = {\n\tmode: 'lch',\n\n\ttoMode: {\n\t\tlab: convertLchToLab,\n\t\trgb: c => convertLabToRgb(convertLchToLab(c))\n\t},\n\n\tfromMode: {\n\t\trgb: c => convertLabToLch(convertRgbToLab(c)),\n\t\tlab: convertLabToLch\n\t},\n\n\tchannels: ['l', 'c', 'h', 'alpha'],\n\n\tranges: {\n\t\tl: [0, 100],\n\t\tc: [0, 150],\n\t\th: [0, 360]\n\t},\n\n\tparse: [parseLch],\n\tserialize: c =>\n\t\t`lch(${c.l !== undefined ? c.l : 'none'} ${\n\t\t\tc.c !== undefined ? c.c : 'none'\n\t\t} ${c.h !== undefined ? c.h : 'none'}${\n\t\t\tc.alpha < 1 ? ` / ${c.alpha}` : ''\n\t\t})`,\n\n\tinterpolate: {\n\t\th: { use: interpolatorLinear, fixup: fixupHueShorter },\n\t\tc: interpolatorLinear,\n\t\tl: interpolatorLinear,\n\t\talpha: { use: interpolatorLinear, fixup: fixupAlpha }\n\t},\n\n\tdifference: {\n\t\th: differenceHueChroma\n\t},\n\n\taverage: {\n\t\th: averageAngle\n\t}\n};\n\nexport default definition;\n","const convertLrgbToOklab = ({ r, g, b, alpha }) => {\n\tif (r === undefined) r = 0;\n\tif (g === undefined) g = 0;\n\tif (b === undefined) b = 0;\n\n\tlet L = Math.cbrt(\n\t\t0.412221469470763 * r + 0.5363325372617348 * g + 0.0514459932675022 * b\n\t);\n\tlet M = Math.cbrt(\n\t\t0.2119034958178252 * r + 0.6806995506452344 * g + 0.1073969535369406 * b\n\t);\n\tlet S = Math.cbrt(\n\t\t0.0883024591900564 * r + 0.2817188391361215 * g + 0.6299787016738222 * b\n\t);\n\n\tlet res = {\n\t\tmode: 'oklab',\n\t\tl:\n\t\t\t0.210454268309314 * L +\n\t\t\t0.7936177747023054 * M -\n\t\t\t0.0040720430116193 * S,\n\t\ta:\n\t\t\t1.9779985324311684 * L -\n\t\t\t2.4285922420485799 * M +\n\t\t\t0.450593709617411 * S,\n\t\tb:\n\t\t\t0.0259040424655478 * L +\n\t\t\t0.7827717124575296 * M -\n\t\t\t0.8086757549230774 * S\n\t};\n\n\tif (alpha !== undefined) {\n\t\tres.alpha = alpha;\n\t}\n\n\treturn res;\n};\n\nexport default convertLrgbToOklab;\n","import convertRgbToLrgb from '../lrgb/convertRgbToLrgb.js';\nimport convertLrgbToOklab from './convertLrgbToOklab.js';\n\nconst convertRgbToOklab = rgb => {\n\tlet res = convertLrgbToOklab(convertRgbToLrgb(rgb));\n\tif (rgb.r === rgb.b && rgb.b === rgb.g) {\n\t\tres.a = res.b = 0;\n\t}\n\treturn res;\n};\n\nexport default convertRgbToOklab;\n","const convertOklabToLrgb = ({ l, a, b, alpha }) => {\n\tif (l === undefined) l = 0;\n\tif (a === undefined) a = 0;\n\tif (b === undefined) b = 0;\n\n\tlet L = Math.pow(l + 0.3963377773761749 * a + 0.2158037573099136 * b, 3);\n\tlet M = Math.pow(l - 0.1055613458156586 * a - 0.0638541728258133 * b, 3);\n\tlet S = Math.pow(l - 0.0894841775298119 * a - 1.2914855480194092 * b, 3);\n\n\tlet res = {\n\t\tmode: 'lrgb',\n\t\tr:\n\t\t\t4.0767416360759574 * L -\n\t\t\t3.3077115392580616 * M +\n\t\t\t0.2309699031821044 * S,\n\t\tg:\n\t\t\t-1.2684379732850317 * L +\n\t\t\t2.6097573492876887 * M -\n\t\t\t0.3413193760026573 * S,\n\t\tb:\n\t\t\t-0.0041960761386756 * L -\n\t\t\t0.7034186179359362 * M +\n\t\t\t1.7076146940746117 * S\n\t};\n\n\tif (alpha !== undefined) {\n\t\tres.alpha = alpha;\n\t}\n\n\treturn res;\n};\n\nexport default convertOklabToLrgb;\n","import convertLrgbToRgb from '../lrgb/convertLrgbToRgb.js';\nimport convertOklabToLrgb from './convertOklabToLrgb.js';\n\nconst convertOklabToRgb = c => convertLrgbToRgb(convertOklabToLrgb(c));\n\nexport default convertOklabToRgb;\n","/*\n\tAdapted from code by Björn Ottosson,\n\treleased under the MIT license:\n\n\tCopyright (c) 2021 Björn Ottosson\n\n\tPermission is hereby granted, free of charge, to any person obtaining a copy of\n\tthis software and associated documentation files (the \"Software\"), to deal in\n\tthe Software without restriction, including without limitation the rights to\n\tuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\n\tof the Software, and to permit persons to whom the Software is furnished to do\n\tso, subject to the following conditions:\n\n\tThe above copyright notice and this permission notice shall be included in all\n\tcopies or substantial portions of the Software.\n\n\tTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n\tIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n\tFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n\tAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n\tLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n\tOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n\tSOFTWARE.\n */\n\nimport convertOklabToLrgb from '../oklab/convertOklabToLrgb.js';\n\nexport function toe(x) {\n\tconst k_1 = 0.206;\n\tconst k_2 = 0.03;\n\tconst k_3 = (1 + k_1) / (1 + k_2);\n\treturn (\n\t\t0.5 *\n\t\t(k_3 * x -\n\t\t\tk_1 +\n\t\t\tMath.sqrt((k_3 * x - k_1) * (k_3 * x - k_1) + 4 * k_2 * k_3 * x))\n\t);\n}\n\nexport function toe_inv(x) {\n\tconst k_1 = 0.206;\n\tconst k_2 = 0.03;\n\tconst k_3 = (1 + k_1) / (1 + k_2);\n\treturn (x * x + k_1 * x) / (k_3 * (x + k_2));\n}\n\n// Finds the maximum saturation possible for a given hue that fits in sRGB\n// Saturation here is defined as S = C/L\n// a and b must be normalized so a^2 + b^2 == 1\nfunction compute_max_saturation(a, b) {\n\t// Max saturation will be when one of r, g or b goes below zero.\n\n\t// Select different coefficients depending on which component goes below zero first\n\tlet k0, k1, k2, k3, k4, wl, wm, ws;\n\n\tif (-1.88170328 * a - 0.80936493 * b > 1) {\n\t\t// Red component\n\t\tk0 = +1.19086277;\n\t\tk1 = +1.76576728;\n\t\tk2 = +0.59662641;\n\t\tk3 = +0.75515197;\n\t\tk4 = +0.56771245;\n\t\twl = +4.0767416621;\n\t\twm = -3.3077115913;\n\t\tws = +0.2309699292;\n\t} else if (1.81444104 * a - 1.19445276 * b > 1) {\n\t\t// Green component\n\t\tk0 = +0.73956515;\n\t\tk1 = -0.45954404;\n\t\tk2 = +0.08285427;\n\t\tk3 = +0.1254107;\n\t\tk4 = +0.14503204;\n\t\twl = -1.2684380046;\n\t\twm = +2.6097574011;\n\t\tws = -0.3413193965;\n\t} else {\n\t\t// Blue component\n\t\tk0 = +1.35733652;\n\t\tk1 = -0.00915799;\n\t\tk2 = -1.1513021;\n\t\tk3 = -0.50559606;\n\t\tk4 = +0.00692167;\n\t\twl = -0.0041960863;\n\t\twm = -0.7034186147;\n\t\tws = +1.707614701;\n\t}\n\n\t// Approximate max saturation using a polynomial:\n\tlet S = k0 + k1 * a + k2 * b + k3 * a * a + k4 * a * b;\n\n\t// Do one step Halley's method to get closer\n\t// this gives an error less than 10e6, except for some blue hues where the dS/dh is close to infinite\n\t// this should be sufficient for most applications, otherwise do two/three steps\n\n\tlet k_l = +0.3963377774 * a + 0.2158037573 * b;\n\tlet k_m = -0.1055613458 * a - 0.0638541728 * b;\n\tlet k_s = -0.0894841775 * a - 1.291485548 * b;\n\n\t{\n\t\tlet l_ = 1 + S * k_l;\n\t\tlet m_ = 1 + S * k_m;\n\t\tlet s_ = 1 + S * k_s;\n\n\t\tlet l = l_ * l_ * l_;\n\t\tlet m = m_ * m_ * m_;\n\t\tlet s = s_ * s_ * s_;\n\n\t\tlet l_dS = 3 * k_l * l_ * l_;\n\t\tlet m_dS = 3 * k_m * m_ * m_;\n\t\tlet s_dS = 3 * k_s * s_ * s_;\n\n\t\tlet l_dS2 = 6 * k_l * k_l * l_;\n\t\tlet m_dS2 = 6 * k_m * k_m * m_;\n\t\tlet s_dS2 = 6 * k_s * k_s * s_;\n\n\t\tlet f = wl * l + wm * m + ws * s;\n\t\tlet f1 = wl * l_dS + wm * m_dS + ws * s_dS;\n\t\tlet f2 = wl * l_dS2 + wm * m_dS2 + ws * s_dS2;\n\n\t\tS = S - (f * f1) / (f1 * f1 - 0.5 * f * f2);\n\t}\n\n\treturn S;\n}\n\nexport function find_cusp(a, b) {\n\t// First, find the maximum saturation (saturation S = C/L)\n\tlet S_cusp = compute_max_saturation(a, b);\n\n\t// Convert to linear sRGB to find the first point where at least one of r,g or b >= 1:\n\tlet rgb = convertOklabToLrgb({ l: 1, a: S_cusp * a, b: S_cusp * b });\n\tlet L_cusp = Math.cbrt(1 / Math.max(rgb.r, rgb.g, rgb.b));\n\tlet C_cusp = L_cusp * S_cusp;\n\n\treturn [L_cusp, C_cusp];\n}\n\n// Finds intersection of the line defined by\n// L = L0 * (1 - t) + t * L1;\n// C = t * C1;\n// a and b must be normalized so a^2 + b^2 == 1\nfunction find_gamut_intersection(a, b, L1, C1, L0, cusp = null) {\n\tif (!cusp) {\n\t\t// Find the cusp of the gamut triangle\n\t\tcusp = find_cusp(a, b);\n\t}\n\n\t// Find the intersection for upper and lower half seprately\n\tlet t;\n\tif ((L1 - L0) * cusp[1] - (cusp[0] - L0) * C1 <= 0) {\n\t\t// Lower half\n\n\t\tt = (cusp[1] * L0) / (C1 * cusp[0] + cusp[1] * (L0 - L1));\n\t} else {\n\t\t// Upper half\n\n\t\t// First intersect with triangle\n\t\tt = (cusp[1] * (L0 - 1)) / (C1 * (cusp[0] - 1) + cusp[1] * (L0 - L1));\n\n\t\t// Then one step Halley's method\n\t\t{\n\t\t\tlet dL = L1 - L0;\n\t\t\tlet dC = C1;\n\n\t\t\tlet k_l = +0.3963377774 * a + 0.2158037573 * b;\n\t\t\tlet k_m = -0.1055613458 * a - 0.0638541728 * b;\n\t\t\tlet k_s = -0.0894841775 * a - 1.291485548 * b;\n\n\t\t\tlet l_dt = dL + dC * k_l;\n\t\t\tlet m_dt = dL + dC * k_m;\n\t\t\tlet s_dt = dL + dC * k_s;\n\n\t\t\t// If higher accuracy is required, 2 or 3 iterations of the following block can be used:\n\t\t\t{\n\t\t\t\tlet L = L0 * (1 - t) + t * L1;\n\t\t\t\tlet C = t * C1;\n\n\t\t\t\tlet l_ = L + C * k_l;\n\t\t\t\tlet m_ = L + C * k_m;\n\t\t\t\tlet s_ = L + C * k_s;\n\n\t\t\t\tlet l = l_ * l_ * l_;\n\t\t\t\tlet m = m_ * m_ * m_;\n\t\t\t\tlet s = s_ * s_ * s_;\n\n\t\t\t\tlet ldt = 3 * l_dt * l_ * l_;\n\t\t\t\tlet mdt = 3 * m_dt * m_ * m_;\n\t\t\t\tlet sdt = 3 * s_dt * s_ * s_;\n\n\t\t\t\tlet ldt2 = 6 * l_dt * l_dt * l_;\n\t\t\t\tlet mdt2 = 6 * m_dt * m_dt * m_;\n\t\t\t\tlet sdt2 = 6 * s_dt * s_dt * s_;\n\n\t\t\t\tlet r =\n\t\t\t\t\t4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s - 1;\n\t\t\t\tlet r1 =\n\t\t\t\t\t4.0767416621 * ldt -\n\t\t\t\t\t3.3077115913 * mdt +\n\t\t\t\t\t0.2309699292 * sdt;\n\t\t\t\tlet r2 =\n\t\t\t\t\t4.0767416621 * ldt2 -\n\t\t\t\t\t3.3077115913 * mdt2 +\n\t\t\t\t\t0.2309699292 * sdt2;\n\n\t\t\t\tlet u_r = r1 / (r1 * r1 - 0.5 * r * r2);\n\t\t\t\tlet t_r = -r * u_r;\n\n\t\t\t\tlet g =\n\t\t\t\t\t-1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s - 1;\n\t\t\t\tlet g1 =\n\t\t\t\t\t-1.2684380046 * ldt +\n\t\t\t\t\t2.6097574011 * mdt -\n\t\t\t\t\t0.3413193965 * sdt;\n\t\t\t\tlet g2 =\n\t\t\t\t\t-1.2684380046 * ldt2 +\n\t\t\t\t\t2.6097574011 * mdt2 -\n\t\t\t\t\t0.3413193965 * sdt2;\n\n\t\t\t\tlet u_g = g1 / (g1 * g1 - 0.5 * g * g2);\n\t\t\t\tlet t_g = -g * u_g;\n\n\t\t\t\tlet b =\n\t\t\t\t\t-0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s - 1;\n\t\t\t\tlet b1 =\n\t\t\t\t\t-0.0041960863 * ldt -\n\t\t\t\t\t0.7034186147 * mdt +\n\t\t\t\t\t1.707614701 * sdt;\n\t\t\t\tlet b2 =\n\t\t\t\t\t-0.0041960863 * ldt2 -\n\t\t\t\t\t0.7034186147 * mdt2 +\n\t\t\t\t\t1.707614701 * sdt2;\n\n\t\t\t\tlet u_b = b1 / (b1 * b1 - 0.5 * b * b2);\n\t\t\t\tlet t_b = -b * u_b;\n\n\t\t\t\tt_r = u_r >= 0 ? t_r : 10e5;\n\t\t\t\tt_g = u_g >= 0 ? t_g : 10e5;\n\t\t\t\tt_b = u_b >= 0 ? t_b : 10e5;\n\n\t\t\t\tt += Math.min(t_r, Math.min(t_g, t_b));\n\t\t\t}\n\t\t}\n\t}\n\n\treturn t;\n}\n\nexport function get_ST_max(a_, b_, cusp = null) {\n\tif (!cusp) {\n\t\tcusp = find_cusp(a_, b_);\n\t}\n\tlet L = cusp[0];\n\tlet C = cusp[1];\n\treturn [C / L, C / (1 - L)];\n}\n\nexport function get_ST_mid(a_, b_) {\n\tlet S =\n\t\t0.11516993 +\n\t\t1 /\n\t\t\t(+7.4477897 +\n\t\t\t\t4.1590124 * b_ +\n\t\t\t\ta_ *\n\t\t\t\t\t(-2.19557347 +\n\t\t\t\t\t\t1.75198401 * b_ +\n\t\t\t\t\t\ta_ *\n\t\t\t\t\t\t\t(-2.13704948 -\n\t\t\t\t\t\t\t\t10.02301043 * b_ +\n\t\t\t\t\t\t\t\ta_ *\n\t\t\t\t\t\t\t\t\t(-4.24894561 +\n\t\t\t\t\t\t\t\t\t\t5.38770819 * b_ +\n\t\t\t\t\t\t\t\t\t\t4.69891013 * a_))));\n\n\tlet T =\n\t\t0.11239642 +\n\t\t1 /\n\t\t\t(+1.6132032 -\n\t\t\t\t0.68124379 * b_ +\n\t\t\t\ta_ *\n\t\t\t\t\t(+0.40370612 +\n\t\t\t\t\t\t0.90148123 * b_ +\n\t\t\t\t\t\ta_ *\n\t\t\t\t\t\t\t(-0.27087943 +\n\t\t\t\t\t\t\t\t0.6122399 * b_ +\n\t\t\t\t\t\t\t\ta_ *\n\t\t\t\t\t\t\t\t\t(+0.00299215 -\n\t\t\t\t\t\t\t\t\t\t0.45399568 * b_ -\n\t\t\t\t\t\t\t\t\t\t0.14661872 * a_))));\n\n\treturn [S, T];\n}\n\nexport function get_Cs(L, a_, b_) {\n\tlet cusp = find_cusp(a_, b_);\n\n\tlet C_max = find_gamut_intersection(a_, b_, L, 1, L, cusp);\n\tlet ST_max = get_ST_max(a_, b_, cusp);\n\n\tlet S_mid =\n\t\t0.11516993 +\n\t\t1 /\n\t\t\t(+7.4477897 +\n\t\t\t\t4.1590124 * b_ +\n\t\t\t\ta_ *\n\t\t\t\t\t(-2.19557347 +\n\t\t\t\t\t\t1.75198401 * b_ +\n\t\t\t\t\t\ta_ *\n\t\t\t\t\t\t\t(-2.13704948 -\n\t\t\t\t\t\t\t\t10.02301043 * b_ +\n\t\t\t\t\t\t\t\ta_ *\n\t\t\t\t\t\t\t\t\t(-4.24894561 +\n\t\t\t\t\t\t\t\t\t\t5.38770819 * b_ +\n\t\t\t\t\t\t\t\t\t\t4.69891013 * a_))));\n\n\tlet T_mid =\n\t\t0.11239642 +\n\t\t1 /\n\t\t\t(+1.6132032 -\n\t\t\t\t0.68124379 * b_ +\n\t\t\t\ta_ *\n\t\t\t\t\t(+0.40370612 +\n\t\t\t\t\t\t0.90148123 * b_ +\n\t\t\t\t\t\ta_ *\n\t\t\t\t\t\t\t(-0.27087943 +\n\t\t\t\t\t\t\t\t0.6122399 * b_ +\n\t\t\t\t\t\t\t\ta_ *\n\t\t\t\t\t\t\t\t\t(+0.00299215 -\n\t\t\t\t\t\t\t\t\t\t0.45399568 * b_ -\n\t\t\t\t\t\t\t\t\t\t0.14661872 * a_))));\n\n\tlet k = C_max / Math.min(L * ST_max[0], (1 - L) * ST_max[1]);\n\n\tlet C_a = L * S_mid;\n\tlet C_b = (1 - L) * T_mid;\n\tlet C_mid =\n\t\t0.9 *\n\t\tk *\n\t\tMath.sqrt(\n\t\t\tMath.sqrt(\n\t\t\t\t1 / (1 / (C_a * C_a * C_a * C_a) + 1 / (C_b * C_b * C_b * C_b))\n\t\t\t)\n\t\t);\n\n\tC_a = L * 0.4;\n\tC_b = (1 - L) * 0.8;\n\tlet C_0 = Math.sqrt(1 / (1 / (C_a * C_a) + 1 / (C_b * C_b)));\n\treturn [C_0, C_mid, C_max];\n}\n","/*\n\tAdapted from code by Björn Ottosson,\n\treleased under the MIT license:\n\n\tCopyright (c) 2021 Björn Ottosson\n\n\tPermission is hereby granted, free of charge, to any person obtaining a copy of\n\tthis software and associated documentation files (the \"Software\"), to deal in\n\tthe Software without restriction, including without limitation the rights to\n\tuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\n\tof the Software, and to permit persons to whom the Software is furnished to do\n\tso, subject to the following conditions:\n\n\tThe above copyright notice and this permission notice shall be included in all\n\tcopies or substantial portions of the Software.\n\n\tTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n\tIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n\tFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n\tAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n\tLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n\tOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n\tSOFTWARE.\n */\n\nimport normalizeHue from '../util/normalizeHue.js';\nimport { get_Cs, toe } from './helpers.js';\n\nexport default function convertOklabToOkhsl(lab) {\n\tconst l = lab.l !== undefined ? lab.l : 0;\n\tconst a = lab.a !== undefined ? lab.a : 0;\n\tconst b = lab.b !== undefined ? lab.b : 0;\n\n\tconst ret = { mode: 'okhsl', l: toe(l) };\n\n\tif (lab.alpha !== undefined) {\n\t\tret.alpha = lab.alpha;\n\t}\n\tlet c = Math.sqrt(a * a + b * b);\n\tif (!c) {\n\t\tret.s = 0;\n\t\treturn ret;\n\t}\n\tlet [C_0, C_mid, C_max] = get_Cs(l, a / c, b / c);\n\tlet s;\n\tif (c < C_mid) {\n\t\tlet k_0 = 0;\n\t\tlet k_1 = 0.8 * C_0;\n\t\tlet k_2 = 1 - k_1 / C_mid;\n\t\tlet t = (c - k_0) / (k_1 + k_2 * (c - k_0));\n\t\ts = t * 0.8;\n\t} else {\n\t\tlet k_0 = C_mid;\n\t\tlet k_1 = (0.2 * C_mid * C_mid * 1.25 * 1.25) / C_0;\n\t\tlet k_2 = 1 - k_1 / (C_max - C_mid);\n\t\tlet t = (c - k_0) / (k_1 + k_2 * (c - k_0));\n\t\ts = 0.8 + 0.2 * t;\n\t}\n\tif (s) {\n\t\tret.s = s;\n\t\tret.h = normalizeHue((Math.atan2(b, a) * 180) / Math.PI);\n\t}\n\treturn ret;\n}\n","/*\n\tAdapted from code by Björn Ottosson,\n\treleased under the MIT license:\n\n\tCopyright (c) 2021 Björn Ottosson\n\n\tPermission is hereby granted, free of charge, to any person obtaining a copy of\n\tthis software and associated documentation files (the \"Software\"), to deal in\n\tthe Software without restriction, including without limitation the rights to\n\tuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\n\tof the Software, and to permit persons to whom the Software is furnished to do\n\tso, subject to the following conditions:\n\n\tThe above copyright notice and this permission notice shall be included in all\n\tcopies or substantial portions of the Software.\n\n\tTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n\tIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n\tFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n\tAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n\tLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n\tOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n\tSOFTWARE.\n */\n\nimport { toe_inv, get_Cs } from './helpers.js';\n\nexport default function convertOkhslToOklab(hsl) {\n\tlet h = hsl.h !== undefined ? hsl.h : 0;\n\tlet s = hsl.s !== undefined ? hsl.s : 0;\n\tlet l = hsl.l !== undefined ? hsl.l : 0;\n\n\tconst ret = { mode: 'oklab', l: toe_inv(l) };\n\n\tif (hsl.alpha !== undefined) {\n\t\tret.alpha = hsl.alpha;\n\t}\n\n\tif (!s || l === 1) {\n\t\tret.a = ret.b = 0;\n\t\treturn ret;\n\t}\n\n\tlet a_ = Math.cos((h / 180) * Math.PI);\n\tlet b_ = Math.sin((h / 180) * Math.PI);\n\tlet [C_0, C_mid, C_max] = get_Cs(ret.l, a_, b_);\n\tlet t, k_0, k_1, k_2;\n\tif (s < 0.8) {\n\t\tt = 1.25 * s;\n\t\tk_0 = 0;\n\t\tk_1 = 0.8 * C_0;\n\t\tk_2 = 1 - k_1 / C_mid;\n\t} else {\n\t\tt = 5 * (s - 0.8);\n\t\tk_0 = C_mid;\n\t\tk_1 = (0.2 * C_mid * C_mid * 1.25 * 1.25) / C_0;\n\t\tk_2 = 1 - k_1 / (C_max - C_mid);\n\t}\n\tlet C = k_0 + (t * k_1) / (1 - k_2 * t);\n\tret.a = C * a_;\n\tret.b = C * b_;\n\n\treturn ret;\n}\n","import convertRgbToOklab from '../oklab/convertRgbToOklab.js';\nimport convertOklabToRgb from '../oklab/convertOklabToRgb.js';\nimport convertOklabToOkhsl from './convertOklabToOkhsl.js';\nimport convertOkhslToOklab from './convertOkhslToOklab.js';\n\nimport modeHsl from '../hsl/definition.js';\n\nconst modeOkhsl = {\n\t...modeHsl,\n\tmode: 'okhsl',\n\tchannels: ['h', 's', 'l', 'alpha'],\n\tparse: ['--okhsl'],\n\tserialize: '--okhsl',\n\tfromMode: {\n\t\toklab: convertOklabToOkhsl,\n\t\trgb: c => convertOklabToOkhsl(convertRgbToOklab(c))\n\t},\n\ttoMode: {\n\t\toklab: convertOkhslToOklab,\n\t\trgb: c => convertOklabToRgb(convertOkhslToOklab(c))\n\t}\n};\n\nexport default modeOkhsl;\n","/*\n\tAdapted from code by Björn Ottosson,\n\treleased under the MIT license:\n\n\tCopyright (c) 2021 Björn Ottosson\n\n\tPermission is hereby granted, free of charge, to any person obtaining a copy of\n\tthis software and associated documentation files (the \"Software\"), to deal in\n\tthe Software without restriction, including without limitation the rights to\n\tuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\n\tof the Software, and to permit persons to whom the Software is furnished to do\n\tso, subject to the following conditions:\n\n\tThe above copyright notice and this permission notice shall be included in all\n\tcopies or substantial portions of the Software.\n\n\tTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n\tIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n\tFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n\tAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n\tLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n\tOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n\tSOFTWARE.\n */\n\nimport normalizeHue from '../util/normalizeHue.js';\nimport convertOklabToLrgb from '../oklab/convertOklabToLrgb.js';\nimport { get_ST_max, toe_inv, toe } from '../okhsl/helpers.js';\n\nexport default function convertOklabToOkhsv(lab) {\n\tlet l = lab.l !== undefined ? lab.l : 0;\n\tlet a = lab.a !== undefined ? lab.a : 0;\n\tlet b = lab.b !== undefined ? lab.b : 0;\n\n\tlet c = Math.sqrt(a * a + b * b);\n\n\t// TODO: c = 0\n\tlet a_ = c ? a / c : 1;\n\tlet b_ = c ? b / c : 1;\n\n\tlet [S_max, T] = get_ST_max(a_, b_);\n\tlet S_0 = 0.5;\n\tlet k = 1 - S_0 / S_max;\n\n\tlet t = T / (c + l * T);\n\tlet L_v = t * l;\n\tlet C_v = t * c;\n\n\tlet L_vt = toe_inv(L_v);\n\tlet C_vt = (C_v * L_vt) / L_v;\n\n\tlet rgb_scale = convertOklabToLrgb({ l: L_vt, a: a_ * C_vt, b: b_ * C_vt });\n\tlet scale_L = Math.cbrt(\n\t\t1 / Math.max(rgb_scale.r, rgb_scale.g, rgb_scale.b, 0)\n\t);\n\n\tl = l / scale_L;\n\tc = ((c / scale_L) * toe(l)) / l;\n\tl = toe(l);\n\n\tconst ret = {\n\t\tmode: 'okhsv',\n\t\ts: c ? ((S_0 + T) * C_v) / (T * S_0 + T * k * C_v) : 0,\n\t\tv: l ? l / L_v : 0\n\t};\n\tif (ret.s) {\n\t\tret.h = normalizeHue((Math.atan2(b, a) * 180) / Math.PI);\n\t}\n\tif (lab.alpha !== undefined) {\n\t\tret.alpha = lab.alpha;\n\t}\n\treturn ret;\n}\n","/*\n\tCopyright (c) 2021 Björn Ottosson\n\n\tPermission is hereby granted, free of charge, to any person obtaining a copy of\n\tthis software and associated documentation files (the \"Software\"), to deal in\n\tthe Software without restriction, including without limitation the rights to\n\tuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\n\tof the Software, and to permit persons to whom the Software is furnished to do\n\tso, subject to the following conditions:\n\n\tThe above copyright notice and this permission notice shall be included in all\n\tcopies or substantial portions of the Software.\n\n\tTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n\tIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n\tFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n\tAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n\tLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n\tOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n\tSOFTWARE.\n */\n\nimport convertOklabToLrgb from '../oklab/convertOklabToLrgb.js';\nimport { get_ST_max, toe_inv } from '../okhsl/helpers.js';\n\nexport default function convertOkhsvToOklab(hsv) {\n\tconst ret = { mode: 'oklab' };\n\tif (hsv.alpha !== undefined) {\n\t\tret.alpha = hsv.alpha;\n\t}\n\n\tconst h = hsv.h !== undefined ? hsv.h : 0;\n\tconst s = hsv.s !== undefined ? hsv.s : 0;\n\tconst v = hsv.v !== undefined ? hsv.v : 0;\n\n\tconst a_ = Math.cos((h / 180) * Math.PI);\n\tconst b_ = Math.sin((h / 180) * Math.PI);\n\n\tconst [S_max, T] = get_ST_max(a_, b_);\n\tconst S_0 = 0.5;\n\tconst k = 1 - S_0 / S_max;\n\tconst L_v = 1 - (s * S_0) / (S_0 + T - T * k * s);\n\tconst C_v = (s * T * S_0) / (S_0 + T - T * k * s);\n\n\tconst L_vt = toe_inv(L_v);\n\tconst C_vt = (C_v * L_vt) / L_v;\n\tconst rgb_scale = convertOklabToLrgb({\n\t\tl: L_vt,\n\t\ta: a_ * C_vt,\n\t\tb: b_ * C_vt\n\t});\n\tconst scale_L = Math.cbrt(\n\t\t1 / Math.max(rgb_scale.r, rgb_scale.g, rgb_scale.b, 0)\n\t);\n\n\tconst L_new = toe_inv(v * L_v);\n\tconst C = (C_v * L_new) / L_v;\n\n\tret.l = L_new * scale_L;\n\tret.a = C * a_ * scale_L;\n\tret.b = C * b_ * scale_L;\n\n\treturn ret;\n}\n","import convertRgbToOklab from '../oklab/convertRgbToOklab.js';\nimport convertOklabToRgb from '../oklab/convertOklabToRgb.js';\nimport convertOklabToOkhsv from './convertOklabToOkhsv.js';\nimport convertOkhsvToOklab from './convertOkhsvToOklab.js';\n\nimport modeHsv from '../hsv/definition.js';\n\nconst modeOkhsv = {\n\t...modeHsv,\n\tmode: 'okhsv',\n\tchannels: ['h', 's', 'v', 'alpha'],\n\tparse: ['--okhsv'],\n\tserialize: '--okhsv',\n\tfromMode: {\n\t\toklab: convertOklabToOkhsv,\n\t\trgb: c => convertOklabToOkhsv(convertRgbToOklab(c))\n\t},\n\ttoMode: {\n\t\toklab: convertOkhsvToOklab,\n\t\trgb: c => convertOklabToRgb(convertOkhsvToOklab(c))\n\t}\n};\n\nexport default modeOkhsv;\n","import { Tok } from '../parse.js';\n\nfunction parseOklab(color, parsed) {\n\tif (!parsed || parsed[0] !== 'oklab') {\n\t\treturn undefined;\n\t}\n\tconst res = { mode: 'oklab' };\n\tconst [, l, a, b, alpha] = parsed;\n\tif (l.type === Tok.Hue || a.type === Tok.Hue || b.type === Tok.Hue) {\n\t\treturn undefined;\n\t}\n\tif (l.type !== Tok.None) {\n\t\tres.l = Math.min(\n\t\t\tMath.max(0, l.type === Tok.Number ? l.value : l.value / 100),\n\t\t\t1\n\t\t);\n\t}\n\tif (a.type !== Tok.None) {\n\t\tres.a = a.type === Tok.Number ? a.value : (a.value * 0.4) / 100;\n\t}\n\tif (b.type !== Tok.None) {\n\t\tres.b = b.type === Tok.Number ? b.value : (b.value * 0.4) / 100;\n\t}\n\tif (alpha.type !== Tok.None) {\n\t\tres.alpha = Math.min(\n\t\t\t1,\n\t\t\tMath.max(\n\t\t\t\t0,\n\t\t\t\talpha.type === Tok.Number ? alpha.value : alpha.value / 100\n\t\t\t)\n\t\t);\n\t}\n\n\treturn res;\n}\n\nexport default parseOklab;\n","import convertOklabToLrgb from './convertOklabToLrgb.js';\nimport convertLrgbToOklab from './convertLrgbToOklab.js';\nimport convertRgbToOklab from './convertRgbToOklab.js';\nimport convertOklabToRgb from './convertOklabToRgb.js';\nimport parseOklab from './parseOklab.js';\n\nimport lab from '../lab/definition.js';\n\n/*\n\tOklab, a perceptual color space for image processing by Björn Ottosson\n\tReference: https://bottosson.github.io/posts/oklab/\n */\n\nconst definition = {\n\t...lab,\n\tmode: 'oklab',\n\n\ttoMode: {\n\t\tlrgb: convertOklabToLrgb,\n\t\trgb: convertOklabToRgb\n\t},\n\n\tfromMode: {\n\t\tlrgb: convertLrgbToOklab,\n\t\trgb: convertRgbToOklab\n\t},\n\n\tranges: {\n\t\tl: [0, 1],\n\t\ta: [-0.4, 0.4],\n\t\tb: [-0.4, 0.4]\n\t},\n\n\tparse: [parseOklab],\n\tserialize: c =>\n\t\t`oklab(${c.l !== undefined ? c.l : 'none'} ${\n\t\t\tc.a !== undefined ? c.a : 'none'\n\t\t} ${c.b !== undefined ? c.b : 'none'}${\n\t\t\tc.alpha < 1 ? ` / ${c.alpha}` : ''\n\t\t})`\n};\n\nexport default definition;\n","import { Tok } from '../parse.js';\n\nfunction parseOklch(color, parsed) {\n\tif (!parsed || parsed[0] !== 'oklch') {\n\t\treturn undefined;\n\t}\n\tconst res = { mode: 'oklch' };\n\tconst [, l, c, h, alpha] = parsed;\n\tif (l.type !== Tok.None) {\n\t\tif (l.type === Tok.Hue) {\n\t\t\treturn undefined;\n\t\t}\n\t\tres.l = Math.min(\n\t\t\tMath.max(0, l.type === Tok.Number ? l.value : l.value / 100),\n\t\t\t1\n\t\t);\n\t}\n\tif (c.type !== Tok.None) {\n\t\tres.c = Math.max(\n\t\t\t0,\n\t\t\tc.type === Tok.Number ? c.value : (c.value * 0.4) / 100\n\t\t);\n\t}\n\tif (h.type !== Tok.None) {\n\t\tif (h.type === Tok.Percentage) {\n\t\t\treturn undefined;\n\t\t}\n\t\tres.h = h.value;\n\t}\n\tif (alpha.type !== Tok.None) {\n\t\tres.alpha = Math.min(\n\t\t\t1,\n\t\t\tMath.max(\n\t\t\t\t0,\n\t\t\t\talpha.type === Tok.Number ? alpha.value : alpha.value / 100\n\t\t\t)\n\t\t);\n\t}\n\n\treturn res;\n}\n\nexport default parseOklch;\n","import lch from '../lch/definition.js';\nimport convertLabToLch from '../lch/convertLabToLch.js';\nimport convertLchToLab from '../lch/convertLchToLab.js';\nimport convertOklabToRgb from '../oklab/convertOklabToRgb.js';\nimport convertRgbToOklab from '../oklab/convertRgbToOklab.js';\nimport parseOklch from './parseOklch.js';\n\nconst definition = {\n\t...lch,\n\tmode: 'oklch',\n\n\ttoMode: {\n\t\toklab: c => convertLchToLab(c, 'oklab'),\n\t\trgb: c => convertOklabToRgb(convertLchToLab(c, 'oklab'))\n\t},\n\n\tfromMode: {\n\t\trgb: c => convertLabToLch(convertRgbToOklab(c), 'oklch'),\n\t\toklab: c => convertLabToLch(c, 'oklch')\n\t},\n\n\tparse: [parseOklch],\n\tserialize: c =>\n\t\t`oklch(${c.l !== undefined ? c.l : 'none'} ${\n\t\t\tc.c !== undefined ? c.c : 'none'\n\t\t} ${c.h !== undefined ? c.h : 'none'}${\n\t\t\tc.alpha < 1 ? ` / ${c.alpha}` : ''\n\t\t})`,\n\n\tranges: {\n\t\tl: [0, 1],\n\t\tc: [0, 0.4],\n\t\th: [0, 360]\n\t}\n};\n\nexport default definition;\n","import converter from './converter.js';\nimport round from './round.js';\nimport prepare from './_prepare.js';\nimport { getMode } from './modes.js';\n\nlet twoDecimals = round(2);\n\nconst clamp = value => Math.max(0, Math.min(1, value || 0));\nconst fixup = value => Math.round(clamp(value) * 255);\n\nconst rgb = converter('rgb');\nconst hsl = converter('hsl');\n\nexport const serializeHex = color => {\n\tif (color === undefined) {\n\t\treturn undefined;\n\t}\n\n\tlet r = fixup(color.r);\n\tlet g = fixup(color.g);\n\tlet b = fixup(color.b);\n\n\treturn '#' + ((1 << 24) | (r << 16) | (g << 8) | b).toString(16).slice(1);\n};\n\nexport const serializeHex8 = color => {\n\tif (color === undefined) {\n\t\treturn undefined;\n\t}\n\n\tlet a = fixup(color.alpha !== undefined ? color.alpha : 1);\n\treturn serializeHex(color) + ((1 << 8) | a).toString(16).slice(1);\n};\n\nexport const serializeRgb = color => {\n\tif (color === undefined) {\n\t\treturn undefined;\n\t}\n\n\tlet r = fixup(color.r);\n\tlet g = fixup(color.g);\n\tlet b = fixup(color.b);\n\n\tif (color.alpha === undefined || color.alpha === 1) {\n\t\t// opaque color\n\t\treturn `rgb(${r}, ${g}, ${b})`;\n\t} else {\n\t\t// transparent color\n\t\treturn `rgba(${r}, ${g}, ${b}, ${twoDecimals(clamp(color.alpha))})`;\n\t}\n};\n\nexport const serializeHsl = color => {\n\tif (color === undefined) {\n\t\treturn undefined;\n\t}\n\n\tconst h = twoDecimals(color.h || 0);\n\tconst s = twoDecimals(clamp(color.s) * 100) + '%';\n\tconst l = twoDecimals(clamp(color.l) * 100) + '%';\n\n\tif (color.alpha === undefined || color.alpha === 1) {\n\t\t// opaque color\n\t\treturn `hsl(${h}, ${s}, ${l})`;\n\t} else {\n\t\t// transparent color\n\t\treturn `hsla(${h}, ${s}, ${l}, ${twoDecimals(clamp(color.alpha))})`;\n\t}\n};\n\nexport const formatCss = c => {\n\tconst color = prepare(c);\n\tif (!color) {\n\t\treturn undefined;\n\t}\n\tconst def = getMode(color.mode);\n\tif (!def.serialize || typeof def.serialize === 'string') {\n\t\tlet res = `color(${def.serialize || `--${color.mode}`} `;\n\t\tdef.channels.forEach((ch, i) => {\n\t\t\tif (ch !== 'alpha') {\n\t\t\t\tres +=\n\t\t\t\t\t(i ? ' ' : '') +\n\t\t\t\t\t(color[ch] !== undefined ? color[ch] : 'none');\n\t\t\t}\n\t\t});\n\t\tif (color.alpha !== undefined && color.alpha < 1) {\n\t\t\tres += ` / ${color.alpha}`;\n\t\t}\n\t\treturn res + ')';\n\t}\n\tif (typeof def.serialize === 'function') {\n\t\treturn def.serialize(color);\n\t}\n\treturn undefined;\n};\n\nexport const formatHex = c => serializeHex(rgb(c));\nexport const formatHex8 = c => serializeHex8(rgb(c));\nexport const formatRgb = c => serializeRgb(rgb(c));\nexport const formatHsl = c => serializeHsl(hsl(c));\n","import { Vector3 } from './vector.ts'\nimport { UniColor } from './method-runner.ts'\nimport chroma from 'chroma-js'\n\nimport type { Lab, Lch, Hsl, Hsv, Okhsl, Okhsv, Oklab, Oklch } from 'culori/fn'\n\nimport {\n useMode,\n // modeLab65, modeLch65,\n modeLab,\n modeLch,\n modeRgb,\n modeHsl,\n modeHsv,\n modeOkhsl,\n modeOklab,\n modeOkhsv,\n modeOklch,\n formatHex\n} from 'culori/fn'\n\nuseMode(modeRgb)\n\nconst cuLab = useMode(modeLab)\nconst cuLch = useMode(modeLch)\nconst cuHsl = useMode(modeHsl)\nconst cuHsv = useMode(modeHsv)\n\nconst cuOkhsl = useMode(modeOkhsl)\nconst cuOklab = useMode(modeOklab)\nconst cuOkhsv = useMode(modeOkhsv)\nconst cuOklch = useMode(modeOklch)\n\nexport function oklch2hex([l, c, h]: Vector3) {\n return formatHex({ l, c, h, mode: 'oklch' })\n}\n\nexport function oklab2hex([l, a, b]: Vector3) {\n return formatHex({ l, a, b, mode: 'oklab' })\n}\n\nexport function oklch2oklab([l_, c, h]: Vector3): Vector3 {\n const { l, a, b } = cuOklab({ l: l_, c, h, mode: 'oklch' })\n\n return [l, a, b]\n}\n\nexport function oklab2oklch([l_, a, b]: Vector3): Vector3 {\n const { l, c, h } = cuOklch({ l: l_, a, b, mode: 'oklab' })\n\n return [l, c, <number>h]\n}\n\nfunction gl2luminance([r_, g_, b_]: [number, number, number]) {\n // relative luminance\n // see http://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef\n const r = luminance_x(r_)\n const g = luminance_x(g_)\n const b = luminance_x(b_)\n\n return 0.2126 * r + 0.7152 * g + 0.0722 * b\n}\n\nfunction luminance_x(x: number) {\n return x <= 0.03928 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4)\n}\n\nfunction memoize(fn: (arg: any) => any) {\n const map = new Map()\n\n return (a: any) => {\n if (map.has(a)) {\n return map.get(a)\n }\n\n const r = fn(a)\n map.set(a, r)\n return r\n }\n}\n\nexport function hexToRgb(hex: string): [number, number, number] {\n const n = parseInt(hex.slice(1), 16)\n return [(n >> 16) & 255, (n >> 8) & 255, n & 255]\n}\n\n// export function rgbToHex ([r, g, b]: [number, number, number]) {\n// return '#' + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1)\n// }\n\nexport const gl = memoize((c) => {\n const [r, g, b] = hexToRgb(c)\n return [r / 255, g / 255, b / 255]\n})\n\nexport const cmyk = memoize((c) => gl2cmyk(gl(c)))\n\nexport const oklab = memoize((c_) => {\n const { l, a, b } = <Oklab>(<unknown>cuOklab(c_))\n return [l, a, b]\n})\n\nexport const okhsl = memoize((c_) => {\n const { h, s, l } = <Okhsl>(<unknown>cuOkhsl(c_))\n return [h, s, l]\n})\n\nexport const okhsv = memoize((c_) => {\n const { h, s, v } = <Okhsv>(<unknown>cuOkhsv(c_))\n return [h, s, v]\n})\n\nexport const oklch = memoize((c_) => {\n const { l, c, h } = <Oklch>(<unknown>cuOklch(c_))\n return [l, c, h]\n})\n\nexport const lch = memoize((c_) => {\n const { l, c, h } = <Lch>(<unknown>cuLch(c_))\n return [l, c, h]\n})\n\nexport const lab = memoize((c) => {\n const { l, a, b } = <Lab>(<unknown>cuLab(c))\n return [l, a, b]\n})\n\nexport const hsl = memoize((c) => {\n const { h, s, l } = <Hsl>(<unknown>cuHsl(c))\n return [h, s, l]\n})\n\nexport const hsv = memoize((c) => {\n const { h, s, v } = <Hsv>(<unknown>cuHsv(c))\n return [h, s, v]\n})\n\nexport function nonH(H: number) {\n return H === undefined //|| isNaN(H) || H === null\n}\n\n// export const lab2lch = memoize((c: [number, number, number]) => chroma.lab(...c).lch())\n\nexport const luminance = memoize((c: string) => gl2luminance(gl(c)))\n\nexport function compareLumLCH(a: string, b: string) {\n const lA = luminance(a)\n const lB = luminance(b)\n\n if (lA !== lB) {\n return lA - lB\n }\n\n const lchA = lch(a)\n const lchB = lch(b)\n\n if (lchA[0] !== lchB[0]) {\n return lchA[0] - lchB[0]\n }\n\n if (lchA[1] !== lchB[1]) {\n return lchA[1] - lchB[1]\n }\n\n return lchA[2] - lchB[2]\n}\n\nexport function flatRgb(hexes: string[]) {\n return hexes.map((c) => hexToRgb(c)).flat()\n}\n\nexport function deltaE(a: string, b: string, x = 1, y = 1, z = 1) {\n return chroma.deltaE(a, b, x, y, z)\n}\n\nexport function normalizeLab(a: Vector3) {\n return [a[0] / 100, (a[1] + 128) / 255, (a[2] + 128) / 255]\n}\n\nfunction intLab(a: Vector3) {\n return [Math.round((a[0] / 100) * 255), Math.round(a[1] + 128), Math.round(a[2] + 128)]\n}\n\nfunction gl2cmyk([r, g, b]: number[]) {\n const k = 1 - Math.max(r, 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\n return [c, m, y, k]\n}\n\n// https://github.com/w3c/csswg-drafts/issues/6642#issuecomment-945714988\nconst OK2_SCALE = (2.016 + 2.045) / 2\n\nexport function distanceOk2([L1, a1, b1]: Vector3, [L2, a2, b2]: Vector3) {\n let dL = L1 - L2\n let da = OK2_SCALE * (a1 - a2)\n let db = OK2_SCALE * (b1 - b2)\n return Math.sqrt(dL ** 2 + da ** 2 + db ** 2)\n}\n\nexport function convertColors(colors: string[], model: ColorType): [UniColor, string][] {\n if (model === 'rgb') {\n return colors.map((c) => [hexToRgb(c), c])\n } else if (model === 'gl') {\n return colors.map((c) => [gl(c), c])\n } else if (model === 'oklab') {\n return colors.map((c) => [oklab(c), c])\n } else if (model === 'oklch') {\n return colors.map((c) => [oklch(c), c])\n } else if (model === 'okhsl') {\n return colors.map((c) => [okhsl(c), c])\n } else if (model === 'okhsv') {\n return colors.map((c) => [okhsv(c), c])\n } else if (model === 'lab') {\n return colors.map((c) => [lab(c), c])\n } else if (model === 'lab_norm') {\n return colors.map((c) => [normalizeLab(lab(c)), c])\n } else if (model === 'lab_int') {\n return colors.map((c) => [intLab(lab(c)), c])\n } else if (model === 'lch') {\n return colors.map((c) => [lch(c), c])\n } else if (model === 'hsl') {\n return colors.map((c) => [hsl(c), c])\n } else if (model === 'hsv') {\n return colors.map((c) => [hsv(c), c])\n } else if (model === 'hex') {\n return colors.map((c) => [c, c])\n } else if (model === 'cmyk') {\n return colors.map((c) => [cmyk(c), c])\n } else {\n throw `Unknown model ${model}`\n }\n}\n\nexport type ColorType = 'hex' | 'rgb' | 'gl' | 'oklab' | 'oklch' | 'okhsl' | 'okhsv' | 'lab' | 'lab_norm' | 'lab_int' | 'lch' | 'hsv' | 'hsl' | 'cmyk'\n\nexport const COLOR_TYPES = {\n rgb: 'rgb',\n oklab: 'oklab',\n lab: 'lab',\n lab_norm: 'lab_norm',\n lab_int: 'lab_int',\n oklch: 'oklch',\n okhsl: 'okhsl',\n okhsv: 'okhsv',\n hex: 'hex',\n hsv: 'hsv',\n hsl: 'hsl',\n lch: 'lch',\n gl: 'gl',\n cmyk: 'cmyk'\n} as const satisfies Record<ColorType, ColorType>\n","import { nonH } from './color.ts'\n\nexport type Vector3 = [number, number, number]\nexport type Vector4 = [number, number, number, number]\n\nexport function distance(a: Vector3, b: Vector3): number {\n const dx = a[0] - b[0]\n const dy = a[1] - b[1]\n const dz = a[2] - b[2]\n\n return Math.sqrt(dx * dx + dy * dy + dz * dz)\n}\n\nexport function distance12(a: Vector3, b: Vector3): number {\n const dy = a[1] - b[1]\n const dz = a[2] - b[2]\n\n return Math.sqrt(dy * dy + dz * dz)\n}\n\nexport function distance4(a: Vector4, b: Vector4): number {\n const dx = a[0] - b[0]\n const dy = a[1] - b[1]\n const dz = a[2] - b[2]\n const dw = a[3] - b[3]\n\n return Math.sqrt(dx * dx + dy * dy + dz * dz + dw * dw)\n}\n\nexport function distanceRadial0(a: Vector3, b: Vector3) {\n let dx = nonH(a[0]) && nonH(b[0]) ? 0 : a[0] - b[0] || 0\n\n const dy = a[1] - b[1]\n const dz = a[2] - b[2]\n\n dx += dx > 180 ? -360 : dx < -180 ? 360 : 0\n dx /= 180\n\n return Math.sqrt(dx * dx + dy * dy + dz * dz)\n}\n\nexport function distanceRadial2(a: Vector3, b: Vector3) {\n const dx = a[0] - b[0]\n const dy = a[1] - b[1]\n\n let dz = nonH(a[2]) && nonH(b[2]) ? 0 : a[2] - b[2] || 0\n\n dz += dz > 180 ? -360 : dz < -180 ? 360 : 0\n dz /= 180\n\n return Math.sqrt(dx * dx + dy * dy + dz * dz)\n}\n\nexport function normalize(v: Vector3): Vector3 {\n const len = Math.sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2])\n if (len === 0) {\n return [0, 0, 0]\n }\n return [v[0] / len, v[1] / len, v[2] / len]\n}\n\nexport function subtract(a: Vector3, b: Vector3): Vector3 {\n return [a[0] - b[0], a[1] - b[1], a[2] - b[2]]\n}\n\nexport function add(a: Vector3, b: Vector3): Vector3 {\n return [a[0] + b[0], a[1] + b[1], a[2] + b[2]]\n}\n\nexport function dot(a: Vector3, b: Vector3): number {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]\n}\n\nexport function centroid(colors: Vector3[]): Vector3 {\n const sum = colors.reduce((acc, c) => [acc[0] + c[0], acc[1] + c[1], acc[2] + c[2]], [0, 0, 0] as Vector3)\n\n return [sum[0] / colors.length, sum[1] / colors.length, sum[2] / colors.length]\n}\n\nexport function compareColors(a: Vector3, b: Vector3): number {\n if (a[0] !== b[0]) {\n return a[0] - b[0]\n }\n\n if (a[1] !== b[1]) {\n return a[1] - b[1]\n }\n\n return a[2] - b[2]\n}\n\nexport function compareColorsH(a: Vector3, b: Vector3): number {\n if (a[1] !== b[1]) {\n return a[1] - b[1]\n }\n\n if (a[2] !== b[2]) {\n return a[2] - b[2]\n }\n\n return a[0] - b[0]\n}\n\nexport function compareColors210(a: Vector3, b: Vector3): number {\n if (a[2] !== b[2]) {\n return (a[2] ?? 0) - (b[2] ?? 0)\n }\n\n if (a[1] !== b[1]) {\n return a[1] - b[1]\n }\n\n return a[0] - b[0]\n}\n","import { ColorType, convertColors, distanceOk2 } from './color.ts'\nimport { distance, distance4, distanceRadial0, distanceRadial2, Vector3, Vector4 } from './vector.ts'\n// import debug from 'debug'\n\n// const log = debug('cs:runner')\n\nexport type UniColor = Vector3 | Vector4 | any\n\nexport type ColorHelper = {\n toColors(vectors: UniColor[]): string[]\n toColor(vector: UniColor): string\n distance: Distance<UniColor>\n}\n\nexport type ColorHelperDelta = ColorHelper & {\n delta: Distance<UniColor>\n}\n\nexport type Distance<T> = (a: T, b: T, ...args: any[]) => number\nexport type Distance3 = Distance<Vector3>\nexport type Distance4 = Distance<Vector4>\nexport type DistanceU = Distance<UniColor>\nexport type DistanceC = Distance<string>\n\nconst CACHE: { [index: string]: Map<string, number> } = {}\n\nfunction createDistanceCache<T>(distanceFn: Distance<T>): Distance<T> {\n const ds = distanceFn.name || distanceFn.toString()\n const cache = (CACHE[ds] = CACHE[ds] || new Map<string, number>())\n\n return (a: T, b: T) => {\n const key = [a, b].sort().join('|')\n let value = cache.get(key)\n\n if (value === undefined) {\n value = distanceFn(a, b)\n cache.set(key, value)\n }\n\n return value\n }\n}\n\nexport type DistanceOptions = {\n fn: Distance<any>\n color: boolean\n}\n\nfunction modelDistance(model: string) {\n return model.at(-1) === 'h' ? distanceRadial2 : model.at(-3) === 'h' ? distanceRadial0 : model === 'oklab' ? distanceOk2 : model === 'cmyk' ? distance4 : distance\n}\n\nexport function methodRunner<T>(colors: string[], fn: (this: T, vectors: UniColor[]) => UniColor[] | void, model: ColorType = 'gl', deltaMethod_?: Distance<any> | DistanceOptions, distanceMethod_?: Distance<any> | DistanceOptions): string[] {\n // log(`starting '${fn.name || (<any>fn).name_}'`)\n\n const vectorMap = new Map()\n\n let distanceMethodObj = distanceMethod_ ?? modelDistance(model)\n let distanceMethod = distanceMethodObj\n\n if (typeof distanceMethod !== 'function') {\n if (distanceMethod.color) {\n distanceMethod = <DistanceU>((a, b, ...args) => (<DistanceOptions>distanceMethodObj).fn(toColor(a), toColor(b), ...args))\n } else {\n distanceMethod = (<DistanceOptions>distanceMethodObj).fn\n }\n }\n\n let deltaMethodObj = deltaMethod_\n let deltaMethod = deltaMethodObj\n\n if (deltaMethod && typeof deltaMethod !== 'function') {\n if (deltaMethod.color) {\n deltaMethod = <DistanceU>((a, b, ...args) => {\n return (<DistanceOptions>deltaMethodObj).fn(toColor(a), toColor(b), ...args)\n })\n } else {\n deltaMethod = (<DistanceOptions>deltaMethodObj).fn\n }\n }\n\n const vs: [UniColor, string][] = convertColors(colors, model)\n\n for (const [key, value] of vs) {\n vectorMap.set(key, value)\n }\n\n function toColors(vectors: Vector3[]): string[] {\n return vectors.map((c: Vector3) => vectorMap.get(c))\n }\n\n function toColor(vector: Vector3): string {\n return vectorMap.get(vector)\n }\n\n const helper = {\n distance: createDistanceCache(<Distance<any>>distanceMethod),\n delta: deltaMethod ? createDistanceCache(deltaMethod) : undefined,\n toColors,\n toColor\n }\n\n const vectors = [...vectorMap.keys()]\n const sorted = fn.call(<T>helper, vectors)\n\n return (<any[]>sorted)?.map((c: Vector3) => vectorMap.get(c))\n}\n","import { Vector3 } from '../vector.ts'\nimport { methodRunner } from '../method-runner.ts'\n\n/**\n * Convert 3D (0 to 255) coordinates to Hilbert curve index\n * This ensures spatially close points stay close in the sorted order\n */\nexport function hilbertIndex([x, y, z]: [number, number, number]): number {\n let index = 0\n\n for (let i = 8 - 1; i >= 0; i--) {\n const mask = 1 << i\n const px = x & mask ? 1 : 0\n const py = y & mask ? 1 : 0\n const pz = z & mask ? 1 : 0\n\n index = (index << 3) | hilbertPointToIndex([px, py, pz])\n }\n\n return index\n}\n\nfunction hilbertPointToIndex([x, y, z]: [number, number, number]): number {\n // Simplified 3D Hilbert curve mapping (one octant)\n return (x << 2) | (y << 1) | z\n}\n\nexport function sortByHilbertCurve(colors: Vector3[]): Vector3[] {\n const cache = new Map<Vector3, number>()\n\n return [...colors].sort((a, b) => {\n let indexA\n let indexB\n\n if (cache.has(a)) {\n indexA = <number>cache.get(a)\n } else {\n indexA = hilbertIndex(a)\n cache.set(a, indexA)\n }\n\n if (cache.has(b)) {\n indexB = <number>cache.get(b)\n } else {\n indexB = hilbertIndex(b)\n cache.set(b, indexB)\n }\n\n return indexA - indexB\n })\n}\n\nexport function hilbert(colors: string[], model: 'rgb' | 'lab_int' = 'rgb') {\n const preSorted = [...colors].sort()\n\n return methodRunner(\n preSorted,\n (vectors: Vector3[]) => {\n return sortByHilbertCurve(vectors)\n },\n model\n )\n}\n\nhilbert.params = [{ name: 'model', values: ['rgb', 'lab_int'] }]\n","/**\n * Simple Genetic Algorithm implementation for permutation problems\n */\n\nexport interface GAConfig<T, F> {\n populationSize?: number\n generations?: number\n maxStagnation?: number\n mutationRate?: number\n crossoverRate?: number\n eliteSize?: number\n tournamentSize?: number\n random?: () => number\n fitness: (genome: T[]) => F\n seed: () => T[]\n compare?: (a: F, b: F) => number\n onGeneration?: (stats: GenerationStats<T, F>) => void\n}\n\nexport interface Individual<T, F> {\n genome: T[]\n fitness: F\n}\n\nexport interface GenerationStats<T, F> {\n generation: number\n bestFitness: F\n bestGenome: T[]\n averageFitness: number\n}\n\nexport interface GAResult<T, F> {\n bestGenome: T[]\n bestFitness: F\n finalPopulation: Individual<T, F>[]\n peakGeneration: number\n}\n\nexport class GeneticAlgorithm<T, F> {\n private readonly populationSize: number\n private readonly generations: number\n private readonly maxStagnation: number\n private readonly mutationRate: number\n private readonly crossoverRate: number\n private readonly eliteSize: number\n private readonly tournamentSize: number\n private readonly random: () => number\n private readonly fitnessFunc: (genome: T[]) => F\n private readonly seedFunc: () => T[]\n private readonly fitnessCompare: (a: F, b: F) => number\n private readonly onGeneration?: (stats: GenerationStats<T, F>) => void\n\n private population: Individual<T, F>[]\n private currentGeneration: number\n private bestIndividual: T[] | null\n private bestFitness: F\n private peakGeneration: number\n\n constructor(config: GAConfig<T, F>) {\n // Configuration\n this.populationSize = config.populationSize || 100\n this.generations = config.generations || 200\n this.maxStagnation = config.maxStagnation || 20\n this.mutationRate = config.mutationRate || 0.1\n this.crossoverRate = config.crossoverRate || 0.9\n this.eliteSize = config.eliteSize || 5\n this.tournamentSize = config.tournamentSize || 5\n this.random = config.random || Math.random\n\n // User-provided functions\n this.fitnessFunc = config.fitness || (() => 0)\n this.seedFunc = config.seed\n // @ts-ignore\n this.fitnessCompare = config.compare || ((a: number, b: number) => b - a)\n this.onGeneration = config.onGeneration\n\n // State\n this.population = []\n this.currentGeneration = 0\n this.bestIndividual = null\n this.bestFitness = <F>-Infinity\n this.peakGeneration = 0\n }\n\n // Initialize population\n private initializePopulation(): void {\n this.population = []\n for (let i = 0; i < this.populationSize; i++) {\n const genome = this.seedFunc()\n const fitness = this.fitnessFunc(genome)\n this.population.push({ genome, fitness })\n }\n this.sortPopulation()\n this.updateBest()\n }\n\n // Sort population by fitness (descending)\n private sortPopulation(): void {\n this.population.sort((a, b) => this.fitnessCompare(a.fitness, b.fitness))\n }\n\n // Update the best individual tracker\n private updateBest(): void {\n if (this.bestFitness === -Infinity || this.fitnessCompare(this.population[0].fitness, this.bestFitness) < 0) {\n this.peakGeneration = this.currentGeneration\n this.bestFitness = this.population[0].fitness\n this.bestIndividual = [...this.population[0].genome]\n }\n }\n\n // Tournament selection\n private tournamentSelect(): Individual<T, F> {\n const tournament: Individual<T, F>[] = []\n for (let i = 0; i < this.tournamentSize; i++) {\n const idx = Math.floor(this.random() * this.population.length)\n tournament.push(this.population[idx])\n }\n\n tournament.sort((a, b) => this.fitnessCompare(a.fitness, b.fitness))\n return tournament[0]\n }\n\n // Order Crossover (OX) for permutations\n private orderCrossover(parent1: T[], parent2: T[]): T[] {\n const size = parent1.length\n const start = Math.floor(this.random() * size)\n const end = start + Math.floor(this.random() * (size - start))\n\n const child: (T | undefined)[] = Array(size)\n\n // Copy segment from parent1\n for (let i = start; i <= end; i++) {\n child[i] = parent1[i]\n }\n\n // Create a set of items already in child for O(1) lookup\n const usedItems = new Set(child.slice(start, end + 1))\n\n // Collect remaining items from parent2 in order\n const remainingItems: T[] = []\n for (let i = 0; i < size; i++) {\n const item = parent2[i]\n\n if (!usedItems.has(item)) {\n remainingItems.push(item)\n }\n }\n\n // Fill the empty positions with remaining items\n let remainingIndex = 0\n for (let i = 0; i < size; i++) {\n if (child[i] === undefined) {\n child[i] = remainingItems[remainingIndex]\n remainingIndex++\n }\n }\n\n return child as T[]\n }\n\n // Swap mutation for permutations\n private swapMutate(genome: T[]): T[] {\n const mutated = [...genome]\n const idx1 = Math.floor(this.random() * mutated.length)\n const idx2 = Math.floor(this.random() * mutated.length)\n ;[mutated[idx1], mutated[idx2]] = [mutated[idx2], mutated[idx1]]\n return mutated\n }\n\n private shiftMutate(genome: T[]): T[] {\n const mutated = [...genome]\n mutated.push(mutated.shift()!)\n return mutated\n }\n\n private cheatMutate(genome: T[]): T[] {\n let mutated = this.shiftMutate(genome)\n let best = mutated\n let bestScore = this.fitnessFunc(best)\n\n for (let i = 1; i < genome.length; i++) {\n mutated = this.shiftMutate(mutated)\n const score = this.fitnessFunc(mutated)\n\n if (this.fitnessCompare(score, bestScore) < 0) {\n bestScore = score\n best = mutated\n }\n }\n\n const reversed = [...best].reverse()\n\n if (this.fitnessCompare(bestScore, this.fitnessFunc(reversed)) < 0) {\n return reversed\n }\n\n return best\n }\n\n // Create new generation\n private evolve(): void {\n const newPopulation: Individual<T, F>[] = []\n\n // Elitism - keep best individuals\n for (let i = 0; i < this.eliteSize; i++) {\n newPopulation.push({\n genome: [...this.population[i].genome],\n fitness: this.population[i].fitness\n })\n }\n\n // Create offspring\n while (newPopulation.length < this.populationSize) {\n const parent1 = this.tournamentSelect()\n const parent2 = this.tournamentSelect()\n\n // Crossover\n let childGenome: T[]\n if (this.random() < this.crossoverRate) {\n childGenome = this.orderCrossover(parent1.genome, parent2.genome)\n } else {\n childGenome = [...parent1.genome]\n }\n\n // Mutation\n if (this.random() < this.mutationRate) {\n const m = this.random()\n\n if (m < 0.5) {\n childGenome = this.swapMutate(childGenome)\n } else if (m < 0.7) {\n childGenome = this.shiftMutate(childGenome)\n } else if (m < 0.9) {\n childGenome = [...childGenome].reverse()\n } else {\n childGenome = this.cheatMutate(childGenome)\n }\n }\n\n const fitness = this.fitnessFunc(childGenome)\n newPopulation.push({ genome: childGenome, fitness })\n }\n\n this.population = newPopulation\n this.sortPopulation()\n this.updateBest()\n }\n\n // Run the algorithm\n public run(): GAResult<T, F> {\n this.initializePopulation()\n\n for (let gen = 0; gen < this.generations; gen++) {\n this.currentGeneration = gen\n\n // Callback for progress tracking\n if (this.onGeneration) {\n this.onGeneration({\n generation: gen,\n bestFitness: this.population[0].fitness,\n bestGenome: this.population[0].genome,\n averageFitness: this.population.reduce((sum, ind) => sum + (typeof ind.fitness === 'number' ? ind.fitness : 0), 0) / this.population.length\n })\n }\n\n if (this.currentGeneration > this.peakGeneration + this.maxStagnation) {\n break\n }\n\n this.evolve()\n }\n\n return {\n bestGenome: this.cheatMutate(this.bestIndividual!),\n bestFitness: this.bestFitness,\n finalPopulation: this.population,\n peakGeneration: this.peakGeneration\n }\n }\n}\n","import { distance, dot, normalize, subtract, Vector3 } from './vector.ts'\n\n// lab vectors\nexport function metrics(vectors: Vector3[]) {\n if (vectors.length < 2) {\n return { totalDistance: 0, avgAngleChange: 0, maxAngleChange: 0, meanDistance: 0, devDistance: 0 }\n }\n\n let totalDistance = 0\n let angleChanges = []\n let prevDirection = null\n\n const distances = []\n\n for (let i = 1; i < vectors.length; i++) {\n const dist = distance(vectors[i - 1], vectors[i])\n totalDistance += dist\n distances.push(dist)\n\n const direction = normalize(subtract(vectors[i], vectors[i - 1]))\n\n if (prevDirection && dist > 0) {\n const dotProd = Math.max(-1, Math.min(1, dot(prevDirection, direction)))\n const angle = Math.acos(dotProd) * (180 / Math.PI)\n angleChanges.push(angle)\n }\n\n prevDirection = direction\n }\n\n const meanDistance = totalDistance / (vectors.length - 1)\n\n const devDistance = Math.sqrt(distances.reduce((acc, d) => acc + Math.pow(d - meanDistance, 2), 0) / (vectors.length - 1))\n\n const avgAngleChange = angleChanges.length > 0 ? angleChanges.reduce((a, b) => a + b, 0) / angleChanges.length : 0\n\n const maxAngleChange = angleChanges.length > 0 ? Math.max(...angleChanges) : 0\n\n return {\n totalDistance,\n avgAngleChange,\n maxAngleChange,\n meanDistance,\n devDistance\n }\n}\n","import { oklab } from '../color.ts'\nimport { distance } from '../vector.ts'\nimport { GeneticAlgorithm } from '../genetic-algo.ts'\nimport { metrics } from '../metrics.js'\n\nfunction fitness1D(palette: string[]) {\n let totalDistance = 0\n\n for (let i = 0; i < palette.length - 1; i++) {\n const a = oklab(palette[i])\n const b = oklab(palette[i + 1])\n\n totalDistance += distance(a, b)\n }\n\n return -totalDistance // Minimize distance\n}\n\nfunction compare1D(a: number, b: number) {\n return b - a\n}\n\nexport function evolve(colors: string[]) {\n return evolveT(colors, fitness1D, compare1D)\n}\n\nexport function evolveT<T>(colors: string[], fitness: (colors: string[]) => T, compare: (a: T, b: T) => number) {\n let previous = 1\n\n const preSorted = [...colors].sort()\n\n const random = () => {\n previous = (previous * 16807) % 2147483647\n return previous / 2147483647\n }\n\n const populationSize = Math.min(40, Math.max(10, colors.length)) * 5\n const generations = colors.length < 50 ? 250 : Math.floor((125 * 250 * 64) / (populationSize * colors.length))\n\n const ga = new GeneticAlgorithm({\n populationSize,\n generations,\n maxStagnation: colors.length < 50 ? 20 : 10,\n mutationRate: 0.5,\n crossoverRate: 0.9,\n eliteSize: 5,\n random,\n fitness,\n compare,\n seed: () => [...preSorted].sort(() => random() - 0.5)\n // onGeneration: (stats) => {\n // console.log(`Gen ${stats.generation}: Fitness = ${stats.bestFitness.toFixed(2)}`)\n // }\n })\n\n return ga.run().bestGenome\n}\n\nfunction fitness3D(palette: string[]) {\n const oklabColors = palette.map((c) => oklab(c))\n const { avgAngleChange, maxAngleChange, totalDistance } = metrics(oklabColors)\n return [-totalDistance, -avgAngleChange, -maxAngleChange] // Minimize distance\n}\n\nfunction compare3D(fitnessA: number[], fitnessB: number[], tolerance = 0.01) {\n for (let i = 0; i < fitnessA.length; i++) {\n const avg = (fitnessA[i] + fitnessB[i]) / 2\n const threshold = Math.abs(avg * tolerance)\n const diff = fitnessB[i] - fitnessA[i] // B - A for descending\n\n // If difference is significant (outside tolerance)\n if (Math.abs(diff) > threshold) {\n return diff // Positive = B is better, negative = A is better\n }\n\n // Otherwise they're tied, move to next objective\n }\n\n // return 0 // All objectives are tied\n return fitnessB[0] - fitnessA[0]\n}\n\nexport function evolveMulti(colors: string[]) {\n return evolveT(colors, fitness3D, compare3D)\n}\n","import { Distance } from './method-runner.ts'\n\nexport function tspVectors<T>(colors: T[], distance: Distance<T>) {\n let improved = true\n\n while (improved) {\n improved = false\n\n for (let i = 0; i < colors.length - 2; i++) {\n for (let j = i + 1; j < colors.length - 1; j++) {\n const d1 = distance(colors[i], colors[i + 1]) + distance(colors[j], colors[j + 1])\n const d2 = distance(colors[i], colors[j]) + distance(colors[i + 1], colors[j + 1])\n\n if (d2 < d1) {\n colors = [...colors.slice(0, i + 1), ...colors.slice(i + 1, j + 1).reverse(), ...colors.slice(j + 1)]\n improved = true\n }\n }\n }\n }\n\n return colors\n}\n","import { compareColors, compareColorsH, dot, normalize, subtract, Vector3 } from '../vector.ts'\nimport { oklab } from '../color.ts'\nimport { ColorHelper, methodRunner } from '../method-runner.ts'\nimport { tspVectors } from '../uni-tsp.ts'\n\nfunction mean(vectors: Vector3[]): Vector3 {\n const sum = vectors.reduce((acc, v) => [acc[0] + v[0], acc[1] + v[1], acc[2] + v[2]], [0, 0, 0] as Vector3)\n\n return [sum[0] / vectors.length, sum[1] / vectors.length, sum[2] / vectors.length]\n}\n\nfunction covariance(vectors: Vector3[], meanVec: Vector3): number[][] {\n const n = vectors.length\n const cov = [\n [0, 0, 0],\n [0, 0, 0],\n [0, 0, 0]\n ]\n\n for (const v of vectors) {\n const diff = subtract(v, meanVec)\n for (let i = 0; i < 3; i++) {\n for (let j = 0; j < 3; j++) {\n cov[i][j] += (diff[i] * diff[j]) / n\n }\n }\n }\n\n return cov\n}\n\n// Simple power iteration for largest eigenvector\nfunction principalComponent(cov: number[][]): Vector3 {\n let v: Vector3 = [1, 1, 1]\n\n for (let iter = 0; iter < 100; iter++) {\n const newV: Vector3 = [cov[0][0] * v[0] + cov[0][1] * v[1] + cov[0][2] * v[2], cov[1][0] * v[0] + cov[1][1] * v[1] + cov[1][2] * v[2], cov[2][0] * v[0] + cov[2][1] * v[1] + cov[2][2] * v[2]]\n v = normalize(newV)\n }\n\n return v\n}\n\nexport function sortByPrincipalComponent(colors: Vector3[]): Vector3[] {\n if (colors.length === 0) {\n return []\n }\n\n const meanVec = mean(colors)\n const cov = covariance(colors, meanVec)\n const pc = principalComponent(cov)\n\n // Sort by projection onto principal component\n return [...colors].sort((a, b) => {\n const projA = dot(subtract(a, meanVec), pc)\n const projB = dot(subtract(b, meanVec), pc)\n return projA - projB\n })\n}\n\nfunction oklabStats(labs: Vector3[]) {\n const n = labs.length\n const mean = labs.reduce((acc, l) => [acc[0] + l[0], acc[1] + l[1], acc[2] + l[2]], [0, 0, 0]).map((v) => v / n)\n const variance = labs.reduce((acc, l) => [acc[0] + (l[0] - mean[0]) ** 2, acc[1] + (l[1] - mean[1]) ** 2, acc[2] + (l[2] - mean[2]) ** 2], [0, 0, 0])\n\n return variance.map((v) => Math.sqrt(v / n) || 1e-6)\n}\n\nfunction adaptiveOklabDistanceFactory(colors: Vector3[]) {\n const WHAT_A_SIGMA = oklabStats(colors)\n\n return (A: Vector3, B: Vector3) => {\n return Math.hypot((A[0] - B[0]) / WHAT_A_SIGMA[0], (A[1] - B[1]) / WHAT_A_SIGMA[1], (A[2] - B[2]) / WHAT_A_SIGMA[2])\n }\n}\n\nexport function principal(colors: string[], model: 'gl' | 'lab' | 'oklab', post: 'raw' | 'tsp' | 'tsp-adapt' = 'raw') {\n return methodRunner(\n colors,\n function (this: ColorHelper, data: Vector3[]) {\n const preSort = [...data].sort(model.at(-3) ? compareColorsH : compareColors)\n const vec = sortByPrincipalComponent(preSort)\n\n if (post === 'raw') {\n return vec\n }\n\n let distance = this.distance\n let toColor = this.toColor\n\n if (post === 'tsp-adapt') {\n if (model === 'oklab') {\n distance = adaptiveOklabDistanceFactory(preSort)\n } else {\n const oklabs = colors.map((c) => oklab(c))\n const okdist = adaptiveOklabDistanceFactory(oklabs)\n distance = (a, b) => okdist(oklab(toColor(a)), oklab(toColor(b)))\n }\n }\n\n return tspVectors(vec, distance)\n },\n model\n )\n}\n\nprincipal.params = [\n { name: 'model', values: ['gl', 'lab', 'oklab'] },\n { name: 'post', values: ['raw', 'tsp', 'tsp-adapt'] }\n]\n","import { compareColors, compareColorsH, Vector3 } from '../vector.ts'\nimport { ColorHelper, methodRunner } from '../method-runner.ts'\n\nexport function sortByHslSpiral(this: any, colors: Vector3[], model: 'hsl' | 'hsv' | 'lch' | 'okhsl' | 'okhsv' | 'oklch' = 'hsl', mode: 'outward' | 'inward' | 'bottom-up' | 'top-down' = 'bottom-up'): Vector3[] {\n // Convert all colors to HSL with original RGB reference\n const colorsWithHsl = colors.map((vec) => ({\n vec,\n hsl: model.at(-1) === 'h' ? [...vec].reverse() : vec\n }))\n\n // Sort based on the chosen spiral mode\n return colorsWithHsl\n .sort((a, b) => {\n let [h1, s1, l1] = a.hsl\n let [h2, s2, l2] = b.hsl\n\n h1 = h1 || 0\n h2 = h2 || 0\n\n switch (mode) {\n case 'bottom-up':\n // Sort by lightness first, then hue, then saturation\n // Creates a spiral from dark to light\n if (Math.abs(l1 - l2) > 0.05) {\n return l1 - l2\n }\n\n if (Math.abs(h1 - h2) > 5) {\n return h1 - h2\n }\n\n return s1 - s2\n\n case 'top-down':\n // Sort by lightness descending, then hue, then saturation\n if (Math.abs(l1 - l2) > 0.05) {\n return l2 - l1\n }\n\n if (Math.abs(h1 - h2) > 5) {\n return h1 - h2\n }\n\n return s1 - s2\n\n case 'outward':\n // Sort by saturation first (center to edge), then hue, then lightness\n // Creates a spiral from desaturated to saturated\n if (Math.abs(s1 - s2) > 0.05) {\n return s1 - s2\n }\n\n if (Math.abs(h1 - h2) > 5) {\n return h1 - h2\n }\n\n return l1 - l2\n\n case 'inward':\n // Sort by saturation descending, then hue, then lightness\n if (Math.abs(s1 - s2) > 0.05) {\n return s2 - s1\n }\n\n if (Math.abs(h1 - h2) > 5) {\n return h1 - h2\n }\n\n return l1 - l2\n\n default:\n return 0\n }\n })\n .map((item) => item.vec)\n}\n\nexport function spiral(colors: string[], model: 'hsl' | 'hsv' | 'lch' | 'okhsl' | 'okhsv' | 'oklch' = 'hsl', mode: 'outward' | 'inward' | 'bottom-up' | 'top-down' = 'bottom-up') {\n return methodRunner(\n colors,\n function (this: ColorHelper, vectors: Vector3[]) {\n const compare = model.at(-3) ? compareColorsH : compareColors\n const preSorted = [...vectors].sort(compare)\n\n return sortByHslSpiral(preSorted, model, mode)\n },\n model\n )\n}\n\nspiral.params = [\n { name: 'model', values: ['hsl', 'hsv', 'lch', 'okhsl', 'okhsv', 'oklch'] },\n { name: 'mode', values: ['outward', 'inward', 'bottom-up', 'top-down'] }\n]\n\n// Alternative: Pure cylindrical spiral\nexport function sortByHslCylindrical(colors: Vector3[], model: 'hsl' | 'hsv' | 'lch' | 'okhsl' | 'okhsv' | 'oklch' = 'hsl', direction: 'ascending' | 'descending' = 'ascending'): Vector3[] {\n const colorsWithHsl = colors.map((vec) => {\n const hsl = model.at(-1) === 'h' ? [...vec].reverse() : vec\n\n // Calculate spiral parameter: combine hue (angle) and lightness (height)\n // Saturation affects the radius\n const spiralParam = (hsl[2] || 0) * 360 + hsl[0] // Lightness * 360 + Hue\n\n return { vec, hsl, spiralParam }\n })\n\n colorsWithHsl.sort((a, b) => {\n const diff = direction === 'ascending' ? a.spiralParam - b.spiralParam : b.spiralParam - a.spiralParam\n\n // If spiral params are similar, sort by saturation\n if (Math.abs(diff) < 1) {\n return a.hsl[1] - b.hsl[1]\n }\n\n return diff\n })\n\n return colorsWithHsl.map((item) => item.vec)\n}\n\nexport function cylindrical(colors: string[], model: 'hsl' | 'hsv' | 'lch' | 'okhsl' | 'okhsv' | 'oklch' = 'hsl', direction: 'ascending' | 'descending' = 'ascending') {\n return methodRunner(\n colors,\n function (this: ColorHelper, vectors: Vector3[]) {\n const compare = model.at(-3) ? compareColorsH : compareColors\n const preSorted = [...vectors].sort(compare)\n return sortByHslCylindrical(preSorted, model, direction)\n },\n model\n )\n}\n\ncylindrical.params = [\n { name: 'model', values: ['hsl', 'hsv', 'lch', 'okhsl', 'okhsv', 'oklch'] },\n { name: 'direction', values: ['ascending' /*, 'descending' */] }\n]\n","export function randomizer(p = 1) {\n let previous = p\n\n return () => {\n previous = (previous * 16807) % 2147483647\n return previous / 2147483647\n }\n}\n","import { ColorHelper } from './method-runner.ts'\nimport { dot, normalize, subtract, Vector3 } from './vector.ts'\n\nexport type ColorCompare = (a: Vector3, b: Vector3) => number\n\nexport function closest(data: Vector3[], compareColors: ColorCompare) {\n return closestList(data, compareColors)[0]\n}\n\nexport function closestList(data: Vector3[], compareColors: ColorCompare) {\n const list = []\n\n for (let i = 0; i < data.length; i++) {\n for (let j = i + 1; j < data.length; j++) {\n const dx = data[i][0] - data[j][0]\n const dy = data[i][1] - data[j][1]\n const dz = data[i][2] - data[j][2]\n\n const dist = Math.sqrt(dx * dx + dy * dy + dz * dz)\n\n list.push({ data: [data[i], data[j]], dist })\n }\n }\n\n list.sort((a, b) => {\n if (a.dist !== b.dist) {\n return a.dist - b.dist\n }\n\n const aa = [...a.data].sort(compareColors)\n const bb = [...b.data].sort(compareColors)\n\n return compareColors(aa[0], bb[0])\n })\n\n return <[Vector3, Vector3][]>list.map((d) => d.data)\n}\n\nexport function inlinest(data: Vector3[], helper: ColorHelper) {\n if (data.length === 2) {\n return <[Vector3, Vector3]>[...data]\n }\n\n let bestAlignment = -Infinity\n let first: Vector3 | null = null\n let mid: Vector3 | null = null\n let last: Vector3 | null = null\n\n // Evaluate all combinations of three points\n for (let i = 0; i < data.length; i++) {\n for (let j = 0; j < data.length; j++) {\n if (j === i) {\n continue\n }\n for (let k = 0; k < data.length; k++) {\n if (k === i || k === j) {\n continue\n }\n\n const dir1 = normalize(subtract(data[j], data[i]))\n const dir2 = normalize(subtract(data[k], data[j]))\n\n // alignment is 1 when directions are the same, -1 when opposite\n const alignment = dot(dir1, dir2)\n\n if (alignment > bestAlignment) {\n bestAlignment = alignment\n first = data[i]\n mid = data[j]\n last = data[k]\n }\n }\n }\n }\n\n if (helper.distance(<Vector3>first, <Vector3>mid) < helper.distance(<Vector3>mid, <Vector3>last)) {\n last = mid\n } else {\n first = mid\n }\n\n return <[Vector3, Vector3]>[first, last]\n}\n","import { centroid, compareColors, compareColorsH, distance, Vector3 } from '../vector.ts'\nimport { randomizer } from '../randomizer.ts'\nimport { methodRunner } from '../method-runner.ts'\nimport { closestList } from '../uni-neighbors.ts'\nimport { ColorType } from '../color.ts'\n\ninterface ClusterNode {\n colors: Vector3[]\n left?: ClusterNode\n right?: ClusterNode\n centroid: Vector3\n distance: number\n}\n\nfunction clusterDistance(c1: ClusterNode, c2: ClusterNode, linkage: 'single' | 'complete' | 'average' = 'average'): number {\n switch (linkage) {\n case 'single':\n // Minimum distance between any two points\n let minDist = Infinity\n for (const a of c1.colors) {\n for (const b of c2.colors) {\n minDist = Math.min(minDist, distance(a, b))\n }\n }\n return minDist\n\n case 'complete':\n // Maximum distance between any two points\n let maxDist = 0\n for (const a of c1.colors) {\n for (const b of c2.colors) {\n maxDist = Math.max(maxDist, distance(a, b))\n }\n }\n return maxDist\n\n case 'average':\n default:\n // Distance between centroids\n return distance(c1.centroid, c2.centroid)\n }\n}\n\n/**\n * Build hierarchical clustering dendrogram\n */\nfunction buildDendrogram(colors: Vector3[], linkage: 'single' | 'complete' | 'average' = 'average'): ClusterNode {\n // Initialize each color as its own cluster\n let clusters: ClusterNode[] = colors.map((c) => ({\n colors: [c],\n centroid: c,\n distance: 0\n }))\n\n // Agglomeratively merge clusters\n while (clusters.length > 1) {\n let minDist = Infinity\n let mergeI = 0\n let mergeJ = 1\n\n // Find closest pair of clusters\n for (let i = 0; i < clusters.length; i++) {\n for (let j = i + 1; j < clusters.length; j++) {\n const dist = clusterDistance(clusters[i], clusters[j], linkage)\n if (dist < minDist) {\n minDist = dist\n mergeI = i\n mergeJ = j\n }\n }\n }\n\n // Merge the closest clusters\n const merged: ClusterNode = {\n colors: [...clusters[mergeI].colors, ...clusters[mergeJ].colors],\n left: clusters[mergeI],\n right: clusters[mergeJ],\n centroid: centroid([...clusters[mergeI].colors, ...clusters[mergeJ].colors]),\n distance: minDist\n }\n\n // Remove merged clusters and add new one\n clusters = clusters.filter((_, idx) => idx !== mergeI && idx !== mergeJ)\n clusters.push(merged)\n }\n\n return clusters[0]\n}\n\n/**\n * Traverse dendrogram to extract ordered colors\n * Different traversal strategies produce different orderings\n */\nfunction traverseDendrogram(node: ClusterNode, strategy: 'depth-first' | 'breadth-first' | 'balanced' = 'balanced'): Vector3[] {\n if (!node.left && !node.right) {\n return node.colors\n }\n\n if (!node.left || !node.right) {\n return node.colors\n }\n\n switch (strategy) {\n case 'depth-first':\n // Always go left first, then right\n return [...traverseDendrogram(node.left, strategy), ...traverseDendrogram(node.right, strategy)]\n\n case 'breadth-first':\n // Process by cluster size (smaller first)\n if (node.left.colors.length <= node.right.colors.length) {\n return [...traverseDendrogram(node.left, strategy), ...traverseDendrogram(node.right, strategy)]\n } else {\n return [...traverseDendrogram(node.right, strategy), ...traverseDendrogram(node.left, strategy)]\n }\n\n case 'balanced':\n default:\n // Try to alternate between branches for smoother transitions\n const leftColors = traverseDendrogram(node.left, strategy)\n const rightColors = traverseDendrogram(node.right, strategy)\n\n // Check which arrangement creates smoother transition\n const dist1 = distance(leftColors[leftColors.length - 1], rightColors[0])\n const dist2 = distance(rightColors[rightColors.length - 1], leftColors[0])\n\n if (dist1 <= dist2) {\n return [...leftColors, ...rightColors]\n } else {\n return [...rightColors, ...leftColors]\n }\n }\n}\n\nexport function sortByHierarchicalClustering(colors: Vector3[], linkage: 'single' | 'complete' | 'average' = 'average', traversal: 'depth-first' | 'breadth-first' | 'balanced' = 'balanced'): Vector3[] {\n if (colors.length === 0) {\n return []\n }\n if (colors.length === 1) {\n return colors\n }\n\n const dendrogram = buildDendrogram(colors, linkage)\n return traverseDendrogram(dendrogram, traversal)\n}\n\n// ============================================================================\n// K-MEANS CLUSTERING WITH ORDERING\n// ============================================================================\n\nfunction randomCentroids(colors: Vector3[], k: number, random: () => number): Vector3[] {\n const shuffled = [...colors].sort(() => random() - 0.5)\n return shuffled.slice(0, k)\n}\n\nfunction assignClusters(colors: Vector3[], centroids: Vector3[]): number[] {\n return colors.map((color) => {\n let minDist = Infinity\n let cluster = 0\n\n centroids.forEach((centroid, idx) => {\n const dist = distance(color, centroid)\n if (dist < minDist) {\n minDist = dist\n cluster = idx\n }\n })\n\n return cluster\n })\n}\n\nfunction updateCentroids(colors: Vector3[], assignments: number[], k: number, random: () => number): Vector3[] {\n const newCentroids: Vector3[] = []\n\n for (let i = 0; i < k; i++) {\n const clusterColors = colors.filter((_, idx) => assignments[idx] === i)\n if (clusterColors.length > 0) {\n newCentroids.push(centroid(clusterColors))\n } else {\n // If cluster is empty, reinitialize randomly\n newCentroids.push(colors[Math.floor(random() * colors.length)])\n }\n }\n\n return newCentroids\n}\n\n/**\n * K-means clustering followed by ordering clusters and points within clusters\n */\nexport function sortByKMeans(colors: Vector3[], k: number = 8, maxIterations: number = 50): Vector3[] {\n if (colors.length === 0) {\n return []\n }\n if (colors.length <= k) {\n return colors\n }\n\n const random = randomizer()\n\n // Run k-means\n let centroids = randomCentroids(colors, k, random)\n let assignments: number[] = []\n\n for (let iter = 0; iter < maxIterations; iter++) {\n const newAssignments = assignClusters(colors, centroids)\n\n // Check for convergence\n if (JSON.stringify(newAssignments) === JSON.stringify(assignments)) {\n break\n }\n\n assignments = newAssignments\n centroids = updateCentroids(colors, assignments, k, random)\n }\n\n // Group colors by cluster\n const clusters: Vector3[][] = Array.from({ length: k }, () => [])\n colors.forEach((color, idx) => {\n clusters[assignments[idx]].push(color)\n })\n\n // Sort clusters by their centroid (e.g., by brightness)\n const clustersWithCentroids = clusters\n .map((cluster, idx) => ({ cluster, centroid: centroids[idx] }))\n .filter((c) => c.cluster.length > 0)\n .sort((a, b) => {\n // Sort by lightness (sum of RGB values)\n const brightnessA = a.centroid[0] + a.centroid[1] + a.centroid[2]\n const brightnessB = b.centroid[0] + b.centroid[1] + b.centroid[2]\n return brightnessA - brightnessB\n })\n\n // Within each cluster, sort by distance to centroid\n const result: Vector3[] = []\n for (const { cluster, centroid: clusterCentroid } of clustersWithCentroids) {\n const sorted = cluster.sort((a, b) => distance(a, clusterCentroid) - distance(b, clusterCentroid))\n result.push(...sorted)\n }\n\n return result\n}\n\n// ============================================================================\n// DBSCAN CLUSTERING WITH CHAIN ORDERING\n// ============================================================================\n\nfunction regionQuery(colors: Vector3[], pointIdx: number, eps: number): number[] {\n const neighbors: number[] = []\n const point = colors[pointIdx]\n\n colors.forEach((other, idx) => {\n if (distance(point, other) <= eps) {\n neighbors.push(idx)\n }\n })\n\n return neighbors\n}\n\nexport function sortByDBSCAN(colors: Vector3[], eps: number = 30, minPts: number = 3): Vector3[] {\n if (colors.length === 0) {\n return []\n }\n\n const visited = new Set<number>()\n const clusters: number[][] = []\n const noise: number[] = []\n\n // DBSCAN clustering\n colors.forEach((_, idx) => {\n if (visited.has(idx)) {\n return\n }\n visited.add(idx)\n\n const neighbors = regionQuery(colors, idx, eps)\n\n if (neighbors.length < minPts) {\n noise.push(idx)\n } else {\n const cluster: number[] = []\n const queue = [...neighbors]\n\n while (queue.length > 0) {\n const neighborIdx = queue.shift()!\n\n if (!visited.has(neighborIdx)) {\n visited.add(neighborIdx)\n const neighborNeighbors = regionQuery(colors, neighborIdx, eps)\n\n if (neighborNeighbors.length >= minPts) {\n queue.push(...neighborNeighbors)\n }\n }\n\n cluster.push(neighborIdx)\n }\n\n clusters.push(cluster)\n }\n })\n\n // Sort clusters by their average brightness\n clusters.sort((a, b) => {\n const avgA =\n a.reduce((sum, idx) => {\n const c = colors[idx]\n return sum + c[0] + c[1] + c[2]\n }, 0) / a.length\n\n const avgB =\n b.reduce((sum, idx) => {\n const c = colors[idx]\n return sum + c[0] + c[1] + c[2]\n }, 0) / b.length\n\n return avgA - avgB\n })\n\n // Build result: clusters + noise at the end\n const result: Vector3[] = []\n\n for (const cluster of clusters) {\n // Within cluster, create a chain (nearest neighbor)\n const remaining = new Set(cluster)\n const ordered: number[] = []\n\n let current = cluster[0]\n ordered.push(current)\n remaining.delete(current)\n\n while (remaining.size > 0) {\n let nearest = -1\n let minDist = Infinity\n\n for (const idx of remaining) {\n const dist = distance(colors[current], colors[idx])\n if (dist < minDist) {\n minDist = dist\n nearest = idx\n }\n }\n\n if (nearest !== -1) {\n ordered.push(nearest)\n remaining.delete(nearest)\n current = nearest\n } else {\n break\n }\n }\n\n result.push(...ordered.map((idx) => colors[idx]))\n }\n\n // Add noise points at the end\n result.push(...noise.map((idx) => colors[idx]))\n\n return result\n}\n\nconst m = { rgb: <ColorType>'gl', lab: <ColorType>'lab_norm' }\n\nexport function cluster(colors: string[], model: 'rgb' | 'lab' = 'rgb', linkage: 'single' | 'complete' | 'average' = 'average', traversal: 'depth-first' | 'breadth-first' | 'balanced' = 'balanced') {\n return methodRunner(\n colors,\n (vectors) => {\n const preSorted = [...vectors].sort(compareColors)\n return sortByHierarchicalClustering(preSorted, linkage, traversal)\n },\n m[model] || model\n )\n}\n\ncluster.params = [\n { name: 'modes', values: ['rgb', 'lab', 'oklab'] },\n { name: 'linkage', values: ['single', 'complete', 'average'] },\n { name: 'traversal', values: ['depth-first', 'breadth-first', 'balanced'] }\n]\n\nexport function kMeans(colors: string[], model: 'rgb' | 'lab' = 'rgb', k: number = 0.5, iterations: number = 50) {\n return methodRunner(\n colors,\n (vectors) => {\n const preSorted = [...vectors].sort(compareColors)\n return sortByKMeans(preSorted, Math.ceil(k * vectors.length), iterations)\n },\n m[model] || model\n )\n}\n\nkMeans.params = [\n { name: 'modes', values: ['rgb', 'lab', 'oklab'] },\n { name: 'k', values: [0.3, 0.5, 0.7] }, // 0.1 never good\n { name: 'iterations', values: [10, 50, 100, 250] }\n]\n\nexport function dbScan(colors: string[], model: 'rgb' | 'lab' = 'rgb', eps: number = 0.3, pts: number = 3) {\n const compare = model.at(-3) === 'h' ? compareColorsH : compareColors\n\n return methodRunner(\n colors,\n (vectors) => {\n const preSorted = [...vectors].sort(compareColors)\n const [a, b] = <[Vector3, Vector3]>closestList(preSorted, compare).at(-1)\n const d = distance(a, b) * eps\n\n return sortByDBSCAN(preSorted, d, pts)\n },\n m[model] || model\n )\n}\n\ndbScan.params = [\n { name: 'modes', values: ['rgb', 'lab', 'oklab'] },\n {\n name: 'eps',\n values: [\n // 0.1,\n 0.3, 0.5\n ]\n },\n { name: 'pts', values: [3, 5, 7] }\n]\n","import { compareColors, compareColorsH, Vector3 } from '../vector.ts'\nimport { compareLumLCH, deltaE } from '../color.ts'\nimport { ColorHelperDelta, methodRunner } from '../method-runner.ts'\n\ninterface HarmonizeOptions {\n selectStart: (colors: Vector3[]) => Vector3\n distance: (a: Vector3, b: Vector3) => number\n compareColors: (a: Vector3, b: Vector3) => number\n}\n\nexport function harmonize(colors: Vector3[], options: HarmonizeOptions): Vector3[] {\n if (colors.length === 0) {\n return []\n }\n\n if (colors.length === 1) {\n return colors\n }\n\n const { selectStart, distance, compareColors } = options\n\n // Build complete graph edges\n const edges = new Map<Vector3, Vector3[]>()\n\n for (const color of colors) {\n edges.set(\n color,\n colors.filter((c) => c !== color)\n )\n }\n\n // Start greedy traversal\n let current = selectStart(colors)\n\n const result: Vector3[] = [current]\n const visited = new Set<Vector3>([current])\n\n // Greedily pick nearest unvisited neighbor\n while (result.length < colors.length) {\n const neighbors = edges.get(current)!\n const unvisited = neighbors.filter((n) => !visited.has(n))\n\n // Find closest unvisited neighbor\n let nearest = unvisited[0]\n let minDistance = distance(current, nearest)\n\n for (let i = 1; i < unvisited.length; i++) {\n const candidate = unvisited[i]\n const d = distance(current, candidate)\n\n // Use lexicographic comparison as tie-breaker\n if (d < minDistance || (d === minDistance && compareColors(candidate, nearest) < 0)) {\n minDistance = d\n nearest = candidate\n }\n }\n\n current = nearest\n visited.add(current)\n result.push(current)\n }\n\n return result\n}\n\nexport function harmonizeModel(colors: string[], model: 'hsl' | 'hsv' | 'oklch' | 'oklab' | 'okhsl' | 'okhsv' | 'lch' | 'lab' | 'rgb' | 'cmyk' = 'rgb', start: 'bright' | 'dark' = 'bright', distance: 'euclidean' | 'delta' = 'euclidean') {\n return methodRunner(\n colors,\n function (this: ColorHelperDelta, data: Vector3[]) {\n const { toColors } = this\n\n function selectBrightest(colors: Vector3[]): Vector3 {\n const hexes = toColors(colors)\n\n const hex = hexes.reduce((brightest, color) => {\n return compareLumLCH(color, brightest) > 0 ? color : brightest\n })\n\n return colors[hexes.indexOf(hex)]\n }\n\n function selectDarkest(colors: Vector3[]): Vector3 {\n const hexes = toColors(colors)\n\n const hex = hexes.reduce((darkest, color) => {\n return compareLumLCH(color, darkest) < 0 ? color : darkest\n })\n\n return colors[hexes.indexOf(hex)]\n }\n\n return harmonize(data, {\n selectStart: start === 'bright' ? selectBrightest : selectDarkest,\n distance: distance === 'euclidean' ? this.distance : this.delta,\n compareColors: model.at(-3) === 'h' ? compareColorsH : compareColors\n })\n },\n model,\n { fn: deltaE, color: true }\n )\n}\n\nharmonizeModel.params = [\n { name: 'model', values: ['hsl', 'hsv', 'oklch', 'oklab', 'okhsl', 'okhsv', 'lch', 'lab', 'rgb', 'cmyk'] },\n { name: 'start', values: ['bright', 'dark'] }\n]\n\nexport function harmonizeDelta(colors: string[], start: 'bright' | 'dark' = 'bright') {\n return harmonizeModel(colors, 'rgb', start, 'delta')\n}\n\nharmonizeDelta.params = [{ name: 'start', values: ['bright', 'dark'] }]\n","import { Vector3 } from './vector.ts'\n\nexport function relativeDifference(palette: Vector3[]) {\n let sumL = 0,\n sumC = 0,\n sumH = 0\n\n for (const [L, C, H] of palette) {\n sumL += L\n sumC += C\n sumH += H || 0\n }\n\n const avgL = sumL / palette.length\n const avgC = sumC / palette.length\n const avgH = sumH / palette.length\n\n let relativeDifferenceL = 0,\n relativeDifferenceC = 0,\n relativeDifferenceH = 0\n\n // const relativeDifferences = []\n\n for (const [L, C, H] of palette) {\n const dL = Math.abs(L - avgL) / (L + avgL) || 0\n const dC = Math.abs(C - avgC) / (C + avgC) || 0\n const dH = Math.abs(H - avgH) / (H + avgH) || 0\n\n relativeDifferenceL += dL\n relativeDifferenceC += dC\n relativeDifferenceH += dH\n\n // relativeDifferences.push(dL + dC + dH)\n }\n\n return [relativeDifferenceL, relativeDifferenceC, relativeDifferenceH]\n}\n","import { nonH } from './color.ts'\nimport { Vector3 } from './vector.ts'\n\nexport type TypeVariances = {\n L: number\n C: number\n H: number\n meanL: number\n meanC: number\n meanH: number\n}\n\nexport function calculateVariances(lchColors: Vector3[]): TypeVariances {\n // const lchColors = colors.map((c) => lch(c))\n\n // Calculate means\n // const meanA = labColors.reduce((sum, c) => sum + c.a, 0) / labColors.length;\n // const meanB = labColors.reduce((sum, c) => sum + c.b, 0) / labColors.length;\n\n // Convert to LCH to get chroma and hue\n const meanL = lchColors.reduce((sum, [L]) => sum + L, 0) / lchColors.length\n\n const meanC = lchColors.reduce((sum, [, C]) => sum + C, 0) / lchColors.length\n\n // Hue is circular, so we need circular mean\n const meanH = circularMean(lchColors.map(([, , H]) => H).filter((a) => !nonH(a)))\n\n // Calculate variances\n const varianceL = lchColors.reduce((sum, [L]) => sum + Math.pow(L - meanL, 2), 0) / lchColors.length\n\n const varianceC = lchColors.reduce((sum, [, C]) => sum + Math.pow(C - meanC, 2), 0) / lchColors.length\n\n // Circular variance for hue\n const varianceH = circularVariance(\n lchColors.map(([, , H]) => H).filter((a) => !nonH(a)),\n meanH\n )\n\n return {\n L: Math.sqrt(varianceL),\n C: Math.sqrt(varianceC),\n H: Math.sqrt(varianceH),\n meanL,\n meanC,\n meanH\n }\n}\n\n// Helper: Circular mean for hue angles\nfunction circularMean(angles: number[]) {\n if (angles.length === 0) {\n return 0\n }\n\n const rad = angles.filter((a) => !nonH(a)).map((a) => (a * Math.PI) / 180)\n const sinSum = rad.reduce((sum, a) => sum + Math.sin(a), 0)\n const cosSum = rad.reduce((sum, a) => sum + Math.cos(a), 0)\n\n let mean = Math.atan2(sinSum / angles.length, cosSum / angles.length) * (180 / Math.PI)\n\n if (mean < 0) {\n mean += 360\n }\n\n return mean\n}\n\n// Helper: Circular variance for hue\nfunction circularVariance(angles: number[], mean: number) {\n if (angles.length === 0) {\n return 0\n }\n\n const diffs = angles.map((angle) => {\n let diff = angle - mean\n // Handle wrap-around (e.g., 350° and 10° are only 20° apart)\n if (diff > 180) {\n diff -= 360\n }\n if (diff < -180) {\n diff += 360\n }\n return diff * diff\n })\n\n return diffs.reduce((sum, d) => sum + d, 0) / angles.length\n}\n\nexport function calculateAdaptiveWeights(variances: { L: number; C: number; H: number }) {\n const total = Math.max(Number.EPSILON, variances.L + variances.C + (variances.H ?? 0))\n\n return {\n Kl: (total - variances.L) / (2 * total),\n Kc: (total - variances.C) / (2 * total),\n Kh: (total - variances.H) / (2 * total)\n }\n}\n","import { calculateVariances, TypeVariances } from './type-variances.ts'\nimport { nonH } from './color.ts'\nimport { Vector3 } from './vector.ts'\n\nexport type PaletteType = {\n Kl: number\n Kc: number\n Kh: number\n type: string\n data: TypeVariances & {\n lightnessRange: number\n chromaRange: number\n hueSpread: number\n }\n}\n\nexport function detectPaletteType(lchColors: Vector3[]): PaletteType {\n // const lchColors = colors.map((c) => lch(c))\n const variances = calculateVariances(lchColors)\n const lightnesses = lchColors.map(([L]) => L)\n const chromas = lchColors.map(([, C]) => C)\n const lightnessRange = Math.max(...lightnesses) - Math.min(...lightnesses)\n const chromaRange = Math.max(...chromas) - Math.min(...chromas)\n const hueSpread = lchColorsHueSpread(lchColors)\n\n // High variance/range = palette explores this dimension\n // Low variance/range = palette is uniform in this dimension\n\n const data = {\n ...variances,\n lightnessRange,\n chromaRange,\n hueSpread\n }\n\n // if (hueSpread > 180 && variances.H > 70 && lightnessRange < 80) {\n if (hueSpread > 180 && variances.H > 70 && variances.L < 80) {\n // Rainbow palette - wide hue range, narrow lightness\n // Prioritize hue differences\n return { Kl: 0.5, Kc: 1, Kh: 2, type: 'Rainbow', data }\n }\n\n if (lightnessRange > 50 && variances.L > 20 && hueSpread < 30) {\n // Monochromatic gradient - wide lightness range, narrow hue\n // Prioritize lightness differences\n return { Kl: 2, Kc: 0.5, Kh: 0.5, type: 'Monochromatic', data }\n }\n\n if (chromaRange > 50 && variances.C > 15 && hueSpread < 60) {\n // Saturation-focused palette - wide chroma range\n // Prioritize chroma differences\n return { Kl: 0.5, Kc: 2, Kh: 1, type: 'Wide Chroma', data }\n }\n\n if (variances.H < 15 && variances.L < 15 && variances.C < 15) {\n // Very uniform palette - all dimensions have low variance\n // Slightly emphasize all differences equally\n return { Kl: 1.2, Kc: 1.2, Kh: 1.2, type: 'Uniform', data }\n }\n\n // Balanced palette - use standard weights\n return { Kl: 1, Kc: 1, Kh: 1, type: 'Balanced', data }\n}\n\n// Helper: Calculate hue spread (accounting for circularity)\nexport function calculateHueSpread(hues: number[]) {\n if (hues.length === 0) {\n return 0\n }\n\n // Sort hues\n const sorted = [...hues].sort((a, b) => a - b)\n\n // Find largest gap between consecutive hues\n let maxGap = 0\n for (let i = 0; i < sorted.length - 1; i++) {\n const gap = sorted[i + 1] - sorted[i]\n maxGap = Math.max(maxGap, gap)\n }\n\n // Check wrap-around gap\n const wrapGap = 360 - (sorted[sorted.length - 1] - sorted[0])\n maxGap = Math.max(maxGap, wrapGap)\n\n // Spread is 360 minus the largest gap\n return 360 - maxGap\n}\n\nexport function lchColorsHueSpread(lchColors: Vector3[]) {\n return calculateHueSpread(lchColors.map(([, , H]) => H).filter((h) => !nonH(h)))\n}\n","import { compareColors, Vector3 } from '../vector.ts'\nimport { relativeDifference } from '../type-relative.ts'\nimport { detectPaletteType } from '../type-detect.ts'\nimport { calculateAdaptiveWeights, calculateVariances } from '../type-variances.ts'\nimport { ColorHelperDelta, Distance3, methodRunner } from '../method-runner.ts'\nimport { tspVectors } from '../uni-tsp.ts'\nimport { deltaE, lch } from '../color.ts'\n\nexport function graphDeltaE(colors: Vector3[], delta: Distance3): Vector3[] {\n const graph = new Map()\n\n for (let i = 0; i < colors.length; i++) {\n const node = new Set()\n\n for (let j = 0; j < colors.length; j++) {\n if (i !== j) {\n node.add({\n color: colors[j],\n distance: delta(colors[i], colors[j])\n })\n }\n }\n\n graph.set(colors[i], node)\n }\n\n const sortedColors: Vector3[] = []\n const visitedColors = new Set()\n\n function traverse(node: Vector3) {\n sortedColors.push(node)\n visitedColors.add(node)\n\n const neighbors = [...graph.get(node)].sort((a, b) => a.distance - b.distance)\n\n for (const neighbor of neighbors) {\n if (!visitedColors.has(neighbor.color)) {\n traverse(neighbor.color)\n }\n }\n }\n\n traverse(colors[0])\n\n return sortedColors\n}\n\nexport function graph(colors: string[], post: 'tsp' | 'raw' = 'raw') {\n return methodRunner(\n colors,\n function (this: ColorHelperDelta, data: Vector3[]) {\n const preSorted = [...data].sort()\n const vectors = graphDeltaE(preSorted, this.delta)\n\n if (post === 'raw') {\n return vectors\n }\n\n return tspVectors(vectors, this.delta)\n },\n 'hex',\n deltaE\n )\n}\n\ngraph.params = [{ name: 'post', values: ['raw', 'tsp'] }]\n\nexport function graphWeighted(colors: string[]) {\n return methodRunner(\n colors,\n function (this: ColorHelperDelta, data: Vector3[]) {\n const preSorted = [...data].sort(compareColors)\n const weights = relativeDifference(preSorted)\n return graphDeltaE(preSorted, (a, b) => this.delta(a, b, ...weights))\n },\n 'lch',\n { fn: deltaE, color: true }\n )\n}\n\nexport function graphWeightedPlusPlus(colors: string[]) {\n const lchColors = colors.map((c) => lch(c))\n const { Kl, Kc, Kh } = detectPaletteType(lchColors)\n const weights = [Kl, Kc, Kh]\n\n return methodRunner(\n colors,\n function (this: ColorHelperDelta, data: Vector3[]) {\n const preSorted = [...data].sort()\n return graphDeltaE(preSorted, (a, b) => this.delta(a, b, ...weights))\n },\n 'hex',\n deltaE\n )\n}\n\nexport function graphWeightedAdaptive1(colors: string[]) {\n const lchColors = colors.map((c) => lch(c))\n const variances = calculateVariances(lchColors)\n const { Kc, Kh, Kl } = calculateAdaptiveWeights(variances)\n const weights = [Kl, Kc, Kh]\n\n return methodRunner(\n colors,\n function (this: ColorHelperDelta, data: Vector3[]) {\n const preSorted = [...data].sort()\n return graphDeltaE(preSorted, (a, b) => this.delta(a, b, ...weights))\n },\n 'hex',\n deltaE\n )\n}\n\nexport function graphWeightedAdaptive2(colors: string[]) {\n const lchColors = colors.map((c) => lch(c))\n const variances = calculateVariances(lchColors)\n const { Kc, Kh, Kl } = calculateAdaptiveWeights(variances)\n const weights = [Kl, Kc, Kh + 0.5]\n\n return methodRunner(\n colors,\n function (this: ColorHelperDelta, data: Vector3[]) {\n const preSorted = [...data].sort()\n return graphDeltaE(preSorted, (a: Vector3, b: Vector3) => this.delta(a, b, ...weights))\n },\n 'hex',\n deltaE\n )\n}\n","import { compareColors, dot, normalize, subtract, Vector3 } from '../vector.ts'\nimport { detectPaletteType } from '../type-detect.ts'\nimport { metrics } from '../metrics.ts'\nimport { ColorHelper, ColorHelperDelta, Distance3, methodRunner } from '../method-runner.ts'\nimport { tspVectors } from '../uni-tsp.ts'\nimport { closest, closestList, inlinest } from '../uni-neighbors.ts'\nimport { deltaE, lch } from '../color.ts'\n\nfunction calculateScore(from: Vector3, to: Vector3, prevDirection: Vector3, distanceFn: Distance3, momentumWeight: number = 1e6) {\n const dist = distanceFn(from, to)\n const direction = normalize(subtract(to, from))\n let score = dist\n\n if (prevDirection) {\n const alignment = dot(prevDirection, direction)\n const momentumBonus = (1 - alignment) * momentumWeight\n score = dist * (1 + momentumBonus)\n }\n\n return { score, direction }\n}\n\nfunction calculateScoreDeltaE(from: Vector3, to: Vector3, prevDirection: Vector3, distance: Distance3, deltaE: Distance3, momentumWeight: number = 1e6) {\n const delta = deltaE(from, to)\n const dist = (distance(from, to) * delta) / 128\n\n const direction = normalize(subtract(to, from))\n let score = dist\n\n if (prevDirection) {\n const alignment = dot(prevDirection, direction)\n const momentumBonus = (1 - alignment) * momentumWeight\n score = dist * (1 + momentumBonus)\n }\n\n return { score, direction }\n}\n\ntype ScoringFn = (\n a: Vector3,\n b: Vector3,\n c: Vector3\n) => {\n score: number\n direction: Vector3\n}\n\nfunction momentumBidiSort(data: Vector3[], start: [Vector3, Vector3], scoring: ScoringFn) {\n const remaining = new Set(data)\n const sorted = []\n\n // Start with closest two colors\n let [first, last] = start\n\n sorted.push(first, last)\n remaining.delete(first)\n remaining.delete(last)\n\n let prevDirectionStart = normalize(subtract(first, last))\n let prevDirectionEnd = normalize(subtract(last, first))\n\n while (remaining.size > 0) {\n // Find two best candidates overall\n let candidates = []\n\n for (const candidate of remaining) {\n const scoreStart = scoring(first, candidate, prevDirectionStart)\n const scoreEnd = scoring(last, candidate, prevDirectionEnd)\n const minScore = Math.min(scoreStart.score, scoreEnd.score)\n candidates.push({ candidate, scoreStart, scoreEnd, minScore })\n }\n\n // Sort to get the two best candidates by their minimum score\n candidates.sort((a, b) => a.minScore - b.minScore)\n\n // Take the best candidate and determine if it fits better at start or end\n const best = candidates[0]\n\n if (best.scoreStart.score <= best.scoreEnd.score) {\n // Add to start\n sorted.unshift(best.candidate)\n prevDirectionStart = best.scoreStart.direction\n first = best.candidate\n } else {\n // Add to end\n sorted.push(best.candidate)\n prevDirectionEnd = best.scoreEnd.direction\n last = best.candidate\n }\n\n remaining.delete(best.candidate)\n }\n\n return sorted\n}\n\nexport function momentumClosestOklab(colors: string[]) {\n return methodRunner(\n colors,\n function (this: ColorHelper, data: Vector3[]) {\n const preSorted = [...data].sort(compareColors)\n const scoring: ScoringFn = (a: Vector3, b: Vector3, c: Vector3) => calculateScore(a, b, c, this.distance)\n\n return momentumBidiSort(preSorted, closest(preSorted, compareColors), scoring)\n },\n 'oklab'\n )\n}\n\nexport function momentumClosestBestOklab(colors: string[], post: 'raw' | 'tsp' = 'raw') {\n return methodRunner(\n colors,\n function (this: ColorHelper, data: Vector3[]) {\n const preSorted = [...data].sort(compareColors)\n const list = closestList(preSorted, compareColors).slice(0, 128)\n const scoring: ScoringFn = (a: Vector3, b: Vector3, c: Vector3) => calculateScore(a, b, c, this.distance)\n\n const result = list.map((start) => {\n const vectors = momentumBidiSort(preSorted, start, scoring)\n\n return {\n vectors,\n // @ts-ignore\n metrics: metrics(this.toColors(vectors))\n }\n })\n\n result.sort((a, b) => a.metrics.totalDistance - b.metrics.totalDistance)\n\n return post === 'tsp' ? tspVectors(result[0].vectors, this.distance) : result[0].vectors\n },\n 'oklab'\n )\n}\n\nmomentumClosestBestOklab.params = [{ name: 'post', values: ['raw', 'tsp'] }]\n\nexport function momentumClosestBestDeltaEOklab(colors: string[]) {\n return methodRunner(\n colors,\n function (this: ColorHelperDelta, data: Vector3[]) {\n const preSorted = [...data].sort(compareColors)\n const list = closestList(preSorted, compareColors).slice(0, 128)\n const de = (a: Vector3, b: Vector3) => this.delta(a, b)\n const scoring: ScoringFn = (a: Vector3, b: Vector3, c: Vector3) => calculateScoreDeltaE(a, b, c, this.distance, de)\n\n const result = list.map((start) => {\n const vectors = momentumBidiSort(preSorted, start, scoring)\n\n return {\n vectors,\n // @ts-ignore\n metrics: metrics(this.toColors(vectors))\n }\n })\n\n result.sort((a, b) => a.metrics.totalDistance - b.metrics.totalDistance)\n\n return result[0].vectors\n },\n 'oklab',\n { fn: deltaE, color: true }\n )\n}\n\nexport function momentumInlinestOklab(colors: string[]) {\n return methodRunner(\n colors,\n function (this: ColorHelper, data: Vector3[]) {\n const preSorted = [...data].sort(compareColors)\n const scoring: ScoringFn = (a: Vector3, b: Vector3, c: Vector3) => calculateScore(a, b, c, this.distance)\n return momentumBidiSort(preSorted, inlinest(preSorted, this), scoring)\n },\n 'oklab'\n )\n}\n\nexport function momentumInlinestDeltaEOklab(colors: string[]) {\n return methodRunner(\n colors,\n function (this: ColorHelperDelta, data: Vector3[]) {\n const preSorted = [...data].sort(compareColors)\n const de = (a: Vector3, b: Vector3) => this.delta(a, b)\n const scoring: ScoringFn = (a: Vector3, b: Vector3, c: Vector3) => calculateScoreDeltaE(a, b, c, this.distance, de)\n return momentumBidiSort(preSorted, inlinest(preSorted, this), scoring)\n },\n 'oklab',\n { fn: deltaE, color: true }\n )\n}\n\nexport function momentumInlinestDeltaEPlusOklab(colors: string[]) {\n const lchColors = colors.map((c) => lch(c))\n const { Kl, Kc, Kh } = detectPaletteType(lchColors)\n const weights = <[number, number, number]>[Kl, Kc, Kh]\n\n return methodRunner(\n colors,\n function (this: ColorHelperDelta, data: Vector3[]) {\n const preSorted = [...data].sort(compareColors)\n const de = (a: Vector3, b: Vector3) => this.delta(a, b, ...weights)\n const scoring: ScoringFn = (a: Vector3, b: Vector3, c: Vector3) => calculateScoreDeltaE(a, b, c, this.distance, de)\n return momentumBidiSort(preSorted, inlinest(preSorted, this), scoring)\n },\n 'oklab',\n { fn: deltaE, color: true }\n )\n}\n","import { compareColors, compareColors210, Vector3 } from '../vector.ts'\nimport { ColorHelper, methodRunner } from '../method-runner.ts'\n\n/**\n * Sort colors into hue-based ramps\n * Strategy:\n * 1. Group by hue buckets (e.g., reds, oranges, yellows, etc.)\n * 2. Within each bucket, sort by chroma (vivid to muted) then lightness\n * 3. Handle achromatic colors (grays) separately\n */\nexport function sortColorsIntoHueRamps(\n colors: Vector3[],\n hueBuckets: number = 12, // Number of hue buckets (default: 12)\n achromaticThreshold: number = 0.05 // Chroma threshold for grays (default: 0.05)\n): Vector3[] {\n // Separate achromatic (grays) from chromatic colors\n const achromatic: Vector3[] = []\n const chromatic: Vector3[] = []\n\n for (const color of colors) {\n if (color[1] < achromaticThreshold || color[2] === undefined) {\n achromatic.push(color)\n } else {\n chromatic.push(color)\n }\n }\n\n // Sort achromatic by lightness (dark to light)\n achromatic.sort(([al], [bl]) => al - bl)\n\n // Group chromatic colors by hue buckets\n const bucketSize = 360 / hueBuckets\n const buckets: Vector3[][] = Array.from({ length: hueBuckets }, () => [])\n\n for (const color of chromatic) {\n const bucketIndex = Math.floor(color[2] / bucketSize) % hueBuckets\n buckets[bucketIndex].push(color)\n }\n\n // Sort each bucket by chroma (high to low) then by lightness\n buckets.forEach((bucket) => {\n bucket.sort(([al, ac], [bl, bc]) => {\n // Primary sort: chroma (vivid colors first)\n const chromaDiff = bc - ac\n\n if (Math.abs(chromaDiff) > 0.02) {\n return chromaDiff\n }\n\n // Secondary sort: lightness (light to dark)\n return bl - al\n })\n })\n\n // Flatten buckets and combine with achromatic\n const sortedChromatic = buckets.flat()\n\n // Return: achromatic colors first, then chromatic ramps\n return [...achromatic, ...sortedChromatic]\n}\n\n/**\n * Alternative: Sort into a single smooth gradient\n * This creates one continuous ramp through the entire hue spectrum\n */\nexport function sortIntoSmoothGradient(colors: Vector3[]) {\n // Separate achromatic\n const achromatic = colors.filter(([, c]) => c < 0.05)\n const chromatic = colors.filter(([, c]) => c >= 0.05)\n\n // Sort achromatic by lightness\n achromatic.sort(([al], [bl]) => al - bl)\n\n // Sort chromatic by hue, then chroma, then lightness\n chromatic.sort(([al, ac, ah], [bl, bc, bh]) => {\n // Primary: hue\n const hueDiff = ah - bh\n\n if (Math.abs(hueDiff) > 5) {\n return hueDiff\n }\n\n // Secondary: chroma (vivid first)\n const chromaDiff = bc - ac\n\n if (Math.abs(chromaDiff) > 0.02) {\n return chromaDiff\n }\n\n // Tertiary: lightness\n return bl - al\n })\n\n return [...achromatic, ...chromatic]\n}\n\n/**\n * Auto-detect hue clusters using gap detection algorithm\n */\nexport function detectHueClusters(\n colors: Vector3[],\n minGapDegrees: number = 25, // Minimum gap to split clusters\n achromaticThreshold: number = 0.05\n): Vector3[][] {\n // Separate achromatic colors\n const achromatic = colors.filter(([, c, h]) => c < achromaticThreshold || h === undefined)\n const chromatic = colors.filter(([, c, h]) => c >= achromaticThreshold && h !== undefined)\n\n if (chromatic.length === 0) {\n return achromatic.length > 0 ? [achromatic] : []\n }\n\n // Sort chromatic colors by hue\n const sorted = [...chromatic].sort(compareColors210)\n\n // Find gaps in the hue circle\n const gaps: { index: number; size: number }[] = []\n\n for (let i = 0; i < sorted.length; i++) {\n const current = sorted[i][2]\n const next = sorted[(i + 1) % sorted.length][2]\n\n // Calculate gap (considering wrap-around at 360)\n let gap: number\n\n if (i === sorted.length - 1) {\n // Wrap around from last to first\n gap = 360 - current + next\n } else {\n gap = next - current\n }\n\n if (gap >= minGapDegrees) {\n gaps.push({ index: i, size: gap })\n }\n }\n\n // If no significant gaps, treat as one cluster\n if (gaps.length === 0) {\n return achromatic.length > 0 ? [achromatic, sorted] : [sorted]\n }\n\n // Sort gaps by size (largest first)\n gaps.sort((a, b) => b.size - a.size)\n\n // Split into clusters at gap boundaries\n const clusters: Vector3[][] = []\n const splitPoints = gaps.map((g) => g.index).sort((a, b) => a - b)\n\n let start = 0\n\n for (const splitIndex of splitPoints) {\n const cluster = sorted.slice(start, splitIndex + 1)\n if (cluster.length > 0) {\n clusters.push(cluster)\n }\n start = splitIndex + 1\n }\n\n // Add remaining colors (wrap-around cluster)\n if (start < sorted.length) {\n clusters.push(sorted.slice(start))\n }\n\n // Add achromatic as first cluster if exists\n if (achromatic.length > 0) {\n clusters.unshift(achromatic)\n }\n\n return clusters\n}\n\n/**\n * Sort colors within a cluster\n */\n// function sortCluster (cluster: Vector3[]): Vector3[] {\n// // Check if achromatic\n// const isAchromatic = cluster.every(([, c, h]) => (c < 0.05) || (h === undefined))\n//\n// if (isAchromatic) {\n// // Sort grays by lightness\n// return [...cluster].sort(([a], [b]) => a - b)\n// }\n//\n// // For chromatic clusters: sort by hue, then chroma, then lightness\n// return [...cluster].sort((a, b) => {\n// // Primary: hue (smooth progression)\n// const hueDiff = a[2] - b[2]\n//\n// if (Math.abs(hueDiff) > 2) {\n// return hueDiff\n// }\n//\n// // Secondary: chroma (vivid to muted)\n// const chromaDiff = b[1] - a[1]\n//\n// if (Math.abs(chromaDiff) > 0.02) {\n// return chromaDiff\n// }\n//\n// // Tertiary: lightness (light to dark)\n// return b[0] - a[0]\n// })\n// }\n\n/**\n * Main sorting function with auto-detected clusters\n */\nfunction sortColorsIntoHueRampsAdaptive(colors: Vector3[], minGapDegrees: number = 25, achromaticThreshold: number = 0.05, sortStrategy: 'cl' | 'lc' = 'cl') {\n // Auto-detect clusters\n const clusters = detectHueClusters(colors, minGapDegrees, achromaticThreshold)\n\n // Sort each cluster\n const sortedClusters = clusters.map((cluster) => {\n const isAchromatic = cluster.every(([, c, h]) => c < achromaticThreshold || h === undefined)\n\n if (isAchromatic) {\n return [...cluster].sort(compareColors)\n }\n\n return [...cluster].sort((a, b) => {\n const hueDiff = a[2] - b[2]\n\n if (Math.abs(hueDiff) > 2) {\n return hueDiff\n }\n\n if (sortStrategy === 'cl') {\n const chromaDiff = b[1] - a[1]\n\n if (Math.abs(chromaDiff) > 0.02) {\n return chromaDiff\n }\n\n return b[0] - a[0]\n } else {\n const lightDiff = b[0] - a[0]\n\n if (Math.abs(lightDiff) > 0.05) {\n return lightDiff\n }\n\n return b[1] - a[1]\n }\n })\n })\n\n return sortedClusters.flat()\n}\n\n/**\n * Calculate perceptual distance between two colors in OKLCH space\n */\nfunction colorDistance(a: Vector3, b: Vector3): number {\n // Calculate hue distance (circular)\n const hueDiff = Math.abs(a[2] - b[2])\n const hueDistance = Math.min(hueDiff, 360 - hueDiff)\n\n // Weight the components for perceptual similarity\n const lightnessWeight = 1.0\n const chromaWeight = 2.5\n const hueWeight = 2.0 // Hue is most important for grouping\n\n const dL = (a[0] - b[0]) * lightnessWeight\n const dC = (a[1] - b[1]) * chromaWeight\n const dH = (hueDistance / 180) * hueWeight // Normalize to 0-2\n\n return Math.sqrt(dL * dL + dC * dC + dH * dH)\n}\n\n/**\n * Sort colors using nearest-neighbor traveling salesman approach\n * This creates smooth visual progressions\n */\nexport function sortColorsByNearestNeighbor(colors: Vector3[]): Vector3[] {\n if (colors.length === 0) {\n return []\n }\n\n // Start with the lightest, least chromatic color (likely white/light gray)\n const sorted: Vector3[] = []\n const remaining = [...colors].sort(compareColors210)\n\n // Find starting color: highest lightness, lowest chroma\n let startIdx = 0\n let maxScore = -Infinity\n for (const c of remaining) {\n const i = remaining.indexOf(c)\n const score = c[0] * 10 - c[1] * 5\n\n if (score > maxScore) {\n maxScore = score\n startIdx = i\n }\n }\n\n sorted.push(remaining[startIdx])\n remaining.splice(startIdx, 1)\n\n // Greedily pick nearest neighbor each time\n while (remaining.length > 0) {\n const current = sorted[sorted.length - 1]\n let nearestIdx = 0\n let minDistance = Infinity\n\n remaining.forEach((candidate, i) => {\n // const dist = colorDistance(current, candidate)\n const dist = colorDistance(current, candidate)\n\n if (dist < minDistance) {\n minDistance = dist\n nearestIdx = i\n }\n })\n\n sorted.push(remaining[nearestIdx])\n remaining.splice(nearestIdx, 1)\n }\n\n return sorted\n}\n\n/**\n * Alternative: Sort by weighted OKLCH components\n * Prioritize: Chroma tier → Hue → Lightness\n */\nfunction sortColorsByWeightedOKLCH(colors: Vector3[]): Vector3[] {\n return [...colors].sort((a, b) => {\n // Define chroma tiers\n const getChromaTier = (c: number): number => {\n if (c < 0.08) {\n return 0\n } // Achromatic\n if (c < 0.25) {\n return 1\n } // Low chroma\n if (c < 0.5) {\n return 2\n } // Medium chroma\n return 3 // High chroma\n }\n\n const tierA = getChromaTier(a[1])\n const tierB = getChromaTier(b[1])\n\n // Primary: chroma tier (achromatic first)\n if (tierA !== tierB) {\n return tierA - tierB\n }\n\n // For achromatic: sort by lightness\n if (tierA === 0) {\n return b[0] - a[0]\n }\n\n // For chromatic: sort by hue\n // Rotate hue space to start at purple/magenta (~320°)\n const rotateHue = (h: number) => (h + 40) % 360\n const hueA = rotateHue(a[2])\n const hueB = rotateHue(b[2])\n\n const hueDiff = hueA - hueB\n if (Math.abs(hueDiff) > 5) {\n return hueDiff\n }\n\n // Within same hue: sort by lightness (light to dark)\n const lightDiff = b[0] - a[0]\n if (Math.abs(lightDiff) > 0.03) {\n return lightDiff\n }\n\n // Finally by chroma (high to low)\n return b[1] - a[1]\n })\n}\n\nfunction sortColorsLikeFixture(colors: Vector3[]): Vector3[] {\n return [...colors].sort((a, b) => {\n // Only truly neutral colors (C < 0.03) are sorted separately\n // Everything else sorts by hue progression\n const neutralThreshold = 0.03\n\n const aIsNeutral = a[1] < neutralThreshold\n const bIsNeutral = b[1] < neutralThreshold\n\n // Neutral colors first\n if (aIsNeutral !== bIsNeutral) {\n return aIsNeutral ? -1 : 1\n }\n\n // Both neutral: sort by lightness descending\n if (aIsNeutral) {\n return b[0] - a[0]\n }\n\n // Chromatic colors: map hue to match fixture progression\n // Based on fixture analysis, the order is:\n // 270 (one grayish blue) → 310-340 (magentas) → 0-30 (reds) → 30-110 (orange/yellow)\n // → 110-180 (green) → 180-270 (cyan/blue) → 270-310 (blue-purple)\n\n const getHueSortKey = (h: number): number => {\n // Special case: 270 area comes first (grayish blues)\n if (h >= 268 && h < 272) {\n return 0\n }\n\n // Purple/Magenta (310-359) - but exclude near-reds (355-359)\n // Near-reds (355-360) should be treated as reds\n if (h >= 355) {\n return 55 + (h - 355)\n } // Map 355-360 to red range: 55-60\n if (h >= 310 && h < 355) {\n return 5 + (h - 310)\n } // 310-355 → 5-50\n\n // Red (0-30, plus 355-360 from above)\n if (h >= 0 && h < 30) {\n return 60 + h\n } // 0-30 → 60-90\n\n // Orange/Yellow (30-110)\n if (h >= 30 && h < 110) {\n return 90 + (h - 30)\n } // 90-170\n\n // Yellow-Green/Green (110-180)\n if (h >= 110 && h < 180) {\n return 170 + (h - 110)\n } // 170-240\n\n // Cyan (180-220)\n if (h >= 180 && h < 220) {\n return 240 + (h - 180)\n } // 240-280\n\n // Blue (220-268)\n if (h >= 220 && h < 268) {\n return 280 + (h - 220)\n } // 280-328\n\n // Blue-Purple (272-310)\n if (h >= 272 && h < 310) {\n return 328 + (h - 272)\n } // 328-366\n\n return 1000 + h\n }\n\n const keyA = getHueSortKey(a[2])\n const keyB = getHueSortKey(b[2])\n\n // Primary: hue sort key with major band separation\n const hueDiff = keyA - keyB\n\n // Define major hue bands with special magenta split\n const getMajorBand = (key: number, chroma: number): number => {\n if (key < 5) {\n return 0\n } // ~270 area\n if (key >= 5 && key < 50) {\n // 310-355 magentas (excluding near-reds)\n return chroma < 0.25 ? 1 : 7 // Low chroma early, high chroma late\n }\n if (key >= 50 && key < 90) {\n return 2\n } // 355-360 and 0-30 reds\n if (key >= 90 && key < 170) {\n return 3\n } // 30-110 orange/yellow\n if (key >= 170 && key < 240) {\n return 4\n } // 110-180 greens\n if (key >= 240 && key < 280) {\n return 5\n } // 180-220 cyans\n if (key >= 280 && key < 328) {\n return 6\n } // 220-268 blues\n return 8 // 272-310 blue-purples\n }\n\n const bandA = getMajorBand(keyA, a[1])\n const bandB = getMajorBand(keyB, b[1])\n\n // Different bands: sort by band\n if (bandA !== bandB) {\n return bandA - bandB\n }\n\n // Same band: sorting depends on band and chroma tier\n const getChromaTier = (c: number): number => {\n if (c < 0.25) {\n return 2\n } // Low chroma\n if (c < 0.5) {\n return 1\n } // Medium chroma\n return 0 // High chroma comes first\n }\n\n const chromaTierA = getChromaTier(a[1])\n const chromaTierB = getChromaTier(b[1])\n\n if (chromaTierA !== chromaTierB) {\n return chromaTierA - chromaTierB\n }\n\n // Within same chroma tier:\n // - Low chroma magentas (band 1): sort by lightness\n // - High chroma reds/other vivid colors: sort by lightness to create smooth gradients\n // - Medium/low chroma in other bands: sort by hue then lightness\n\n if ((bandA === 1 && chromaTierA === 2) || chromaTierA === 0) {\n // Low chroma magentas OR high chroma any band: lightness first\n const lightDiff = b[0] - a[0]\n if (Math.abs(lightDiff) > 0.01) {\n return lightDiff\n }\n if (Math.abs(hueDiff) > 1) {\n return hueDiff\n }\n return b[1] - a[1]\n }\n\n // Medium/low chroma in non-magenta bands: hue first for grouping\n if (Math.abs(hueDiff) > 5) {\n return hueDiff\n }\n\n const lightDiff = b[0] - a[0]\n if (Math.abs(lightDiff) > 0.01) {\n return lightDiff\n }\n\n return b[1] - a[1]\n })\n}\n\n/**\n * Sort colors using a composite key that mimics the fixture's interleaved structure\n *\n * Key insight from set analysis: The fixture doesn't group by single attributes,\n * but uses a weighted combination that allows similar colors to be scattered\n * across multiple \"passes\" through the hue spectrum.\n */\nfunction sortColorsByHueRamps(colors: Vector3[]): Vector3[] {\n return [...colors].sort((a, b) => {\n // Step 1: Separate pure achromatic\n const aAchro = a[1] < 0.03 || a[2] === undefined\n const bAchro = b[1] < 0.03 || b[2] === undefined\n\n if (aAchro !== bAchro) {\n return aAchro ? -1 : 1\n }\n\n if (aAchro) {\n return b[0] - a[0]\n }\n\n // Step 2: Create composite sort key using weighted dimensions\n // The fixture appears to sort by: (Hue-region × Chroma-tier) + Lightness-momentum\n\n // Normalize hue to start at ~270 (blue-gray transition)\n const normalizeHue = (h: number): number => {\n return (h - 270 + 360) % 360\n }\n\n const hA = normalizeHue(a[2])\n const hB = normalizeHue(b[2])\n\n // Divide hue into coarse regions (not bands, but zones)\n const getHueZone = (h: number): number => {\n // 9 zones of ~40° each\n return Math.floor(h / 40)\n }\n\n const zoneA = getHueZone(hA)\n const zoneB = getHueZone(hB)\n\n // Chroma stratification (creates the interleaving)\n const getChromaStratum = (c: number): number => {\n if (c < 0.15) {\n return 0\n } // very-low\n if (c < 0.3) {\n return 1\n } // low\n if (c < 0.5) {\n return 2\n } // medium\n if (c < 0.7) {\n return 3\n } // high\n return 4 // very-high\n }\n\n const stratumA = getChromaStratum(a[1])\n const stratumB = getChromaStratum(b[1])\n\n // Primary key: Hue zone\n if (zoneA !== zoneB) {\n return zoneA - zoneB\n }\n\n // Secondary key: Chroma stratum (creates sub-ramps within hue zones)\n // Higher chroma comes first within most zones (for vivid to muted progression)\n const chromaOrder = stratumB - stratumA // Reverse order\n if (Math.abs(chromaOrder) > 0) {\n return chromaOrder\n }\n\n // Tertiary key: Lightness (creates the visual gradient)\n // Generally descending (light to dark) for visual flow\n const lightDiff = b[0] - a[0]\n if (Math.abs(lightDiff) > 0.01) {\n return lightDiff\n }\n\n // Quaternary: Fine hue sorting within stratum\n if (Math.abs(hA - hB) > 1) {\n return hA - hB\n }\n\n // Quinary: Fine chroma\n return b[1] - a[1]\n })\n}\n\n/**\n * Alternative: Try reverse-engineering from momentum changes\n * The momentum analysis shows ~30 direction changes, suggesting\n * the fixture treats each momentum shift as a new \"micro-ramp\"\n */\nfunction sortByMomentumMimicry(colors: Vector3[]): Vector3[] {\n return [...colors].sort((a, b) => {\n // Achromatic first\n const aAchro = a[1] < 0.03\n const bAchro = b[1] < 0.03\n if (aAchro !== bAchro) {\n return aAchro ? -1 : 1\n }\n if (aAchro) {\n return b[0] - a[0]\n }\n\n // Compute a \"trajectory score\" that combines all dimensions\n // This creates natural momentum shifts as colors transition\n const getTrajectoryScore = (c: Vector3): number => {\n const hueNorm = ((c[2] - 270 + 360) % 360) / 360 // 0-1\n const chromaNorm = Math.min(c[1], 1) // 0-1\n const lightNorm = c[0] // 0-1\n\n // Weighted combination that prioritizes hue, then chroma stratification\n return (\n hueNorm * 1000 + // Hue is primary (0-1000)\n (1 - chromaNorm) * 100 + // Inverse chroma (0-100) - muted after vivid\n (1 - lightNorm) * 10 // Inverse lightness (0-10) - dark after light\n )\n }\n\n const scoreA = getTrajectoryScore(a)\n const scoreB = getTrajectoryScore(b)\n\n return scoreA - scoreB\n })\n}\n\n/**\n * Sort colors into perceptual hue-based ramps\n *\n * Strategy:\n * 1. Achromatic colors (very low chroma) sorted by lightness\n * 2. Chromatic colors sorted by composite key: Hue Zone → Chroma Stratum → Lightness\n *\n * This creates natural color ramps that work well for palettes of 60+ colors,\n * organizing them into manageable visual groups while maintaining smooth gradients.\n *\n */\nexport function sortColorsByHueRamps2(\n colors: Vector3[], // Oklch, Vector3 is [number, number, number]\n achromaticThreshold: number = 0.03, // Chroma below this is considered achromatic (default: 0.03)\n hueZoneSize: number = 40, // Degrees per hue zone (default: 40)\n hueRotation: number = 270, // Starting hue angle (default: 270)\n chromaOrder: 'vivid' | 'muted' = 'vivid' // Chroma ordering (default: 'vivid-first')\n): Vector3[] {\n return [...colors].sort(compareColors210).sort((a, b) => {\n // Step 1: Separate achromatic colors\n const aAchro = a[1] < achromaticThreshold || a[2] === undefined\n const bAchro = b[1] < achromaticThreshold || b[2] === undefined\n\n if (aAchro !== bAchro) {\n return aAchro ? -1 : 1\n }\n\n if (aAchro) {\n // Sort achromatic by lightness (light to dark)\n // return b[0] - a[0]\n return compareColors(b, a)\n }\n\n // Step 2: Normalize hue to start at rotation point\n const normalizeHue = (h: number): number => {\n return (h - hueRotation + 360) % 360\n }\n\n const hA = normalizeHue(a[2])\n const hB = normalizeHue(b[2])\n\n // Step 3: Divide into hue zones\n const getHueZone = (h: number): number => {\n return Math.floor(h / hueZoneSize)\n }\n\n const zoneA = getHueZone(hA)\n const zoneB = getHueZone(hB)\n\n // Step 4: Stratify by chroma level\n const getChromaStratum = (c: number): number => {\n if (c < 0.15) {\n return 0\n } // very-low\n if (c < 0.3) {\n return 1\n } // low\n if (c < 0.5) {\n return 2\n } // medium\n if (c < 0.7) {\n return 3\n } // high\n return 4 // very-high\n }\n\n const stratumA = getChromaStratum(a[1])\n const stratumB = getChromaStratum(b[1])\n\n // Step 5: Primary sort - Hue zone\n if (zoneA !== zoneB) {\n return zoneA - zoneB\n }\n\n // Step 6: Secondary sort - Chroma stratum\n // This creates sub-ramps within each hue zone\n const chromaDiff =\n chromaOrder === 'vivid'\n ? stratumB - stratumA // Vivid (high chroma) first\n : stratumA - stratumB // Muted (low chroma) first\n\n if (chromaDiff !== 0) {\n return chromaDiff\n }\n\n // Step 7: Tertiary sort - Lightness\n // Creates smooth gradients within each chroma stratum (light to dark)\n const lightDiff = b[0] - a[0]\n\n if (Math.abs(lightDiff) > 0.01) {\n return lightDiff\n }\n\n // Step 8: Quaternary sort - Fine hue\n // Keeps very similar hues together\n if (Math.abs(hA - hB) > 1) {\n return hA - hB\n }\n\n // Step 9: Quinary sort - Fine chroma\n return b[1] - a[1]\n })\n}\n\nexport function sortMultiRampPalette2(lchColors: Vector3[], numRamps: number = 3): Vector3[] {\n let sortedByLightness = [...lchColors].sort((a, b) => a[0] - b[0])\n\n const ramps: Vector3[][] = Array.from({ length: numRamps }, (_, i) => [sortedByLightness[i]])\n\n ramps.sort((a, b) => a[0][2] - b[0][2])\n\n sortedByLightness = sortedByLightness.slice(numRamps)\n\n // Change to assign one color at a time instead of layers of numRamps\n while (sortedByLightness.length) {\n const b = sortedByLightness.shift()!\n\n let bestCost = Infinity\n let bestI = -1\n\n for (let i = 0; i < numRamps; i++) {\n const a = ramps[i].at(-1)!\n const prev = ramps[i].at(-2)\n\n let cost: number\n\n if (prev) {\n const hp = prev[2]\n const z = a[2] - hp\n const zaH = a[2] + z\n cost = Math.pow(zaH - b[2], 2)\n } else {\n cost = Math.pow(a[2] - b[2], 2)\n }\n\n if (cost < bestCost) {\n bestCost = cost\n bestI = i\n }\n }\n\n if (bestI === -1) {\n // throw 'No best'\n bestI = 0\n }\n\n ramps[bestI].push(b)\n }\n\n return ramps.flat()\n}\n\nfunction estimateNumRamps(lchColors: Vector3[], binCount = 72): { suggestedK: number; scores: number[] } {\n const hues = lchColors.map((c) => c[2]) // hue in [0, 360)\n const bins: number[] = <number[]>Array.from({ length: binCount }).fill(0)\n\n for (const h of hues) {\n const bin = Math.floor((h / 360) * binCount) % binCount\n bins[bin]++\n }\n\n // Count how many \"peaks\" (local maxima that are meaningfully separated)\n let peaks = 0\n let inValley = true\n\n for (let i = 0; i < binCount * 2; i++) {\n // ×2 to handle wrap-around\n const idx = i % binCount\n const prev = bins[(idx - 1 + binCount) % binCount]\n const curr = bins[idx]\n const next = bins[(idx + 1) % binCount]\n\n if (curr > prev && curr > next && curr >= 2) {\n // at least 2 colors\n if (inValley) {\n peaks++\n inValley = false\n }\n } else if (curr < prev || curr < next) {\n inValley = true\n }\n }\n\n // Very rough heuristics\n const suggested = Math.max(1, Math.min(8, peaks || 3))\n\n return {\n suggestedK: suggested,\n scores: bins // you can plot this if you want\n }\n}\n\n// function evaluateRampQuality(ramps: ColorInfo[][]): number {\n// let totalCost = 0;\n//\n// for (const ramp of ramps) {\n// for (let i = 1; i < ramp.length; i++) {\n// const prev = ramp[i - 1].lch;\n// const curr = ramp[i].lch;\n//\n// // Penalize hue jumps + non-monotonic lightness very strongly\n// const hueDiff = Math.min(\n// Math.abs(curr[2] - prev[2]),\n// 360 - Math.abs(curr[2] - prev[2])\n// );\n//\n// const lightOk = curr[0] >= prev[0] - 1; // allow tiny inversions\n// totalCost += hueDiff * hueDiff + (lightOk ? 0 : 1000);\n//\n// // Optional: add OK distance penalty for smoothness\n// // totalCost += distanceOk2(oklab(ramp[i-1].hex), oklab(ramp[i].hex)) ** 1.5;\n// }\n// }\n//\n// // Bonus: penalize very unbalanced ramps\n// const sizes = ramps.map(r => r.length);\n// const avg = sizes.reduce((a, b) => a + b, 0) / ramps.length;\n// const balancePenalty = sizes.reduce((sum, s) => sum + Math.abs(s - avg) ** 1.5, 0);\n//\n// return totalCost + balancePenalty * 0.5;\n// }\n\n// function x(palette: string[]) {\n// const costs: number[] = [];\n// for (let k = 1; k <= Math.min(10, palette.length); k++) {\n// const sorted = sortMultiRampPalette(palette, k);\n// // rebuild ramps structure from flat list if needed\n// const ramps = ... // split back into k ramps\n// costs.push(evaluateRampQuality(ramps));\n// }\n//\n// // Find elbow: biggest decrease in cost per added ramp\n// let bestK = 1;\n// let maxDrop = -Infinity;\n//\n// for (let k = 2; k < costs.length; k++) {\n// const drop = costs[k-1] - costs[k];\n// if (drop > maxDrop) {\n// maxDrop = drop;\n// bestK = k;\n// }\n// }\n// }\n\nexport function ramp(colors: string[]) {\n return methodRunner(\n colors,\n function (this: ColorHelper, vectors: Vector3[]) {\n return sortColorsIntoHueRamps(vectors, 12, 0)\n },\n 'oklch'\n )\n}\n\nexport function rampa(colors: string[], gap: number = 360 / 9, threshold: number = 0, strategy: 'cl' | 'lc' = 'cl') {\n return methodRunner(\n colors,\n function (this: ColorHelper, vectors: Vector3[]) {\n return sortColorsIntoHueRampsAdaptive(vectors, gap, threshold, strategy)\n },\n 'oklch'\n )\n}\n\nrampa.params = [\n { name: 'gap', values: [0, 360 / 12, 360 / 9, 360 / 6] },\n { name: 'threshold', values: [0, 0.05, 0.1] },\n { name: 'strategy', values: ['cl', 'lc'] }\n]\n\nexport function rampb(colors: string[]) {\n return methodRunner(\n colors,\n function (this: ColorHelper, vectors: Vector3[]) {\n return sortColorsByNearestNeighbor(vectors)\n },\n 'oklch'\n )\n}\n\nexport function rampc(colors: string[]) {\n return methodRunner(\n colors,\n function (this: ColorHelper, vectors: Vector3[]) {\n return sortColorsByWeightedOKLCH(vectors)\n },\n 'oklch'\n )\n}\n\nexport function rampd(colors: string[]) {\n return methodRunner(\n colors,\n function (this: ColorHelper, vectors: Vector3[]) {\n return sortColorsLikeFixture(vectors)\n },\n 'oklch'\n )\n}\n\nexport function rampe(colors: string[]) {\n return methodRunner(\n colors,\n function (this: ColorHelper, vectors: Vector3[]) {\n return sortColorsByHueRamps(vectors)\n },\n 'oklch'\n )\n}\n\nexport function rampf(colors: string[]) {\n return methodRunner(\n colors,\n function (this: ColorHelper, vectors: Vector3[]) {\n return sortByMomentumMimicry(vectors)\n },\n 'oklch'\n )\n}\n\nexport function rampg(colors: string[], threshold: number, zone: number, rotation: number, order: 'vivid' | 'muted') {\n return methodRunner(\n colors,\n function (this: ColorHelper, vectors: Vector3[]) {\n return sortColorsByHueRamps2(vectors, threshold, zone, rotation, order)\n },\n 'oklch'\n )\n}\n\nrampg.params = [\n { name: 'threshold', values: [0, 0.01, 0.03, 0.06, 0.09] },\n { name: 'zone', values: [20, 40, 60, 90, 120] },\n { name: 'rotation', values: [/**270,**/ 0] },\n { name: 'order', values: ['vivid', 'muted'] }\n]\n\nexport function ramph(colors: string[], ramps: number = 3) {\n return methodRunner(\n colors,\n function (this: ColorHelper, vectors: Vector3[]) {\n return sortMultiRampPalette2(vectors, ramps)\n },\n 'oklch'\n )\n}\n\nramph.params = [{ name: 'ramps', values: [2, 3, 4, 5, 6, 8, 8, 9, 12, 24] }]\n\nramph.valid = (colors: Vector3[], ramps: number) => {\n return colors.length > ramps\n}\n\nexport function rampi(colors: string[]) {\n return methodRunner(\n colors,\n function (this: ColorHelper, vectors: Vector3[]) {\n const ramps = Math.min(vectors.length, estimateNumRamps(vectors).suggestedK)\n\n return sortMultiRampPalette2(vectors, ramps)\n },\n 'oklch'\n )\n}\n","import { compareColors, compareColorsH, Vector3 } from '../vector.ts'\nimport { ColorHelperDelta, methodRunner } from '../method-runner.ts'\n\nexport function raw(colors: string[], model: 'hsl' | 'hsv' | 'oklch' | 'oklab' | 'okhsl' | 'okhsv' | 'lch' | 'lab' | 'rgb' | 'cmyk' = 'rgb') {\n const compare = model.at(-3) === 'h' ? compareColorsH : compareColors\n\n return methodRunner(\n colors,\n function (this: ColorHelperDelta, data: Vector3[]) {\n return data.sort(compare)\n },\n model\n )\n}\n\nraw.params = [{ name: 'model', values: ['hsl', 'hsv', 'oklch', 'oklab', 'okhsl', 'okhsv', 'lch', 'lab', 'rgb', 'cmyk'] }]\n","import { hilbert } from './hilbert.ts'\nimport { evolve, evolveMulti } from './genetic.ts'\nimport { principal } from './principal.ts'\nimport { cylindrical, spiral } from './radial.ts'\nimport { cluster, dbScan, kMeans } from './clustering.ts'\nimport { harmonizeDelta, harmonizeModel } from './harmonize.ts'\nimport { graph, graphWeighted, graphWeightedAdaptive1, graphWeightedAdaptive2, graphWeightedPlusPlus } from './graph.ts'\nimport { momentumClosestOklab, momentumInlinestOklab, momentumInlinestDeltaEOklab, momentumInlinestDeltaEPlusOklab, momentumClosestBestOklab, momentumClosestBestDeltaEOklab } from './momentum.ts'\n\nimport BENCH from '../../data/bench.json' with { type: 'json' }\nimport { UniColor } from '../method-runner.ts'\nimport { ramp, rampa, rampb, rampc, rampd, rampe, rampf, rampg, ramph, rampi } from './ramp.ts'\nimport { raw } from './raw.ts'\n// import debug from 'debug'\n\n// const log = debug('cs:method')\n\nconst METHODS = {\n PCA: ['PCA', 'Principal component analysis', 'https://en.wikipedia.org/wiki/Principal_component_analysis'],\n HIL: ['HIL', 'Hilbert curve', 'https://en.wikipedia.org/wiki/Hilbert_curve'],\n GEN: ['GEN', 'Genetic algorithm', 'https://en.wikipedia.org/wiki/Genetic_algorithm'],\n TSP: ['TSP', 'Travelling salesman problem', 'https://en.wikipedia.org/wiki/Travelling_salesman_problem'],\n NNA: ['NNA', 'Nearest neighbour algorithm', 'https://en.wikipedia.org/wiki/Nearest_neighbour_algorithm'],\n '2-OPT': ['2-OPT', '2-opt', 'https://en.wikipedia.org/wiki/2-opt'],\n MOM: ['MON', 'Greedy with momentum', ' https://en.wikipedia.org/wiki/Greedy_algorithm']\n}\n\nconst MODELS = {\n RGB: ['RGB', 'https://en.wikipedia.org/wiki/RGB_color_model'],\n LAB: ['CIELAB', 'https://en.wikipedia.org/wiki/CIELAB_color_space'],\n OKLAB: ['Oklab', 'https://en.wikipedia.org/wiki/Oklab_color_space'],\n HSL: ['HSL', 'https://en.wikipedia.org/wiki/HSL_and_HSV'],\n LCH: ['LCH', 'https://en.wikipedia.org/wiki/HCL_color_space'],\n OKLCH: ['Oklch', 'https://en.wikipedia.org/wiki/Oklab_color_space'],\n CMYK: ['CMYK', 'https://en.wikipedia.org/wiki/CMYK_color_model']\n}\n\nconst DIFFS = {\n DE: ['DE', 'Delta E', 'http://www.brucelindbloom.com/index.html?Eqn_DeltaE_CIE2000.html']\n}\n\nexport type SortingFunction = Function & {\n params?: { name: string; values: any[] }[]\n valid?: Function\n}\n\nexport type SortingMethod = {\n name: string\n mid: string\n description?: {\n model?: any | null\n method?: any | null\n diff?: any | null\n }\n fn: SortingFunction\n speed?: number\n valid?: Function\n}\n\nexport const SORTING_METHODS_RAW: SortingMethod[] = [\n {\n name: 'Original',\n fn: (c: UniColor) => c,\n mid: 'Original',\n description: {\n model: null\n }\n },\n {\n name: 'HARM',\n fn: harmonizeModel,\n mid: 'HARM',\n description: {}\n },\n {\n name: 'HARMED',\n fn: harmonizeDelta,\n mid: 'HARMED',\n description: {}\n },\n {\n name: 'NNA(Delta E)',\n fn: graph,\n mid: 'NNA(DE) Lab',\n description: {\n method: METHODS.NNA,\n model: MODELS.LAB,\n diff: DIFFS.DE\n }\n },\n {\n name: 'NNA(Delta E+)',\n fn: graphWeighted,\n mid: 'NNA(DE+) Lab',\n description: {\n method: METHODS.NNA,\n model: MODELS.LAB,\n diff: DIFFS.DE\n }\n },\n {\n name: 'NNA(Delta E++)',\n fn: graphWeightedPlusPlus,\n mid: 'NNA(DE++) Lab',\n description: {\n method: METHODS.NNA,\n model: MODELS.LAB,\n diff: DIFFS.DE\n }\n },\n {\n name: 'NNA(Delta E+1)',\n fn: graphWeightedAdaptive1,\n mid: 'NNA(DE+1) Lab',\n description: {\n method: METHODS.NNA,\n model: MODELS.LAB,\n diff: DIFFS.DE\n }\n },\n {\n name: 'NNA(Delta E+2)',\n fn: graphWeightedAdaptive2,\n mid: 'NNA(DE+2) Lab',\n description: {\n method: METHODS.NNA,\n model: MODELS.LAB,\n diff: DIFFS.DE\n }\n },\n {\n name: 'MOM(Closest) Oklab',\n fn: momentumClosestOklab,\n mid: 'MOM(Closest)-Oklab',\n description: {\n method: METHODS.MOM,\n model: MODELS.OKLAB\n }\n },\n {\n name: 'MOM(Closest+) Oklab',\n fn: momentumClosestBestOklab,\n mid: 'MOM(Closest+)-Oklab',\n description: {\n method: METHODS.MOM,\n model: MODELS.OKLAB\n }\n },\n {\n name: 'MOM(Closest+, Delta E) Oklab',\n fn: momentumClosestBestDeltaEOklab,\n mid: 'MOM(Closest+,DE)-Oklab',\n description: {\n method: METHODS.MOM,\n model: MODELS.OKLAB\n }\n },\n {\n name: 'MOM(Inlinest) Oklab',\n fn: momentumInlinestOklab,\n mid: 'MOM(Inlinest)-Oklab',\n description: {\n method: METHODS.MOM,\n model: MODELS.OKLAB\n }\n },\n {\n name: 'MOM(Inlinest, Delta E) Oklab',\n fn: momentumInlinestDeltaEOklab,\n mid: 'MOM(Inlinest,DE)-Oklab',\n description: {\n method: METHODS.MOM,\n model: MODELS.OKLAB,\n diff: DIFFS.DE\n }\n },\n {\n name: 'MOM(Inlinest, Delta E++) Oklab',\n fn: momentumInlinestDeltaEPlusOklab,\n mid: 'MOM(Inlinest,DE++)-Oklab',\n description: {\n method: METHODS.MOM,\n model: MODELS.OKLAB,\n diff: DIFFS.DE\n }\n },\n {\n name: 'Genetic Oklab',\n fn: evolve,\n mid: 'GEN-Oklab',\n description: {\n method: METHODS.GEN,\n model: MODELS.OKLAB\n }\n },\n {\n name: 'Genetic3 Oklab',\n fn: evolveMulti,\n mid: 'GEN3-Oklab',\n description: {\n method: METHODS.GEN,\n model: MODELS.OKLAB\n }\n },\n {\n name: 'Hilbert',\n fn: hilbert,\n mid: 'HIL',\n description: {\n method: METHODS.HIL,\n model: MODELS.RGB\n }\n },\n {\n name: 'PCA',\n fn: principal,\n mid: 'PCA',\n description: {\n method: METHODS.PCA\n }\n },\n {\n name: 'Spiral',\n fn: spiral,\n mid: 'SPI',\n description: {}\n },\n {\n name: 'Cylindrical',\n fn: cylindrical,\n mid: 'CYL',\n description: {}\n },\n {\n name: 'Cluster',\n fn: cluster,\n mid: 'CL',\n description: {}\n },\n {\n name: 'K-means',\n fn: kMeans,\n mid: 'KM',\n description: {}\n },\n {\n name: 'DBSCAN',\n fn: dbScan,\n mid: 'DBSCAN',\n description: {}\n },\n {\n name: 'RAMP',\n fn: ramp,\n mid: 'RAMP',\n description: {}\n },\n {\n name: 'RAMPA',\n fn: rampa,\n mid: 'RAMPA',\n description: {}\n },\n {\n name: 'RAMPB',\n fn: rampb,\n mid: 'RAMPB',\n description: {}\n },\n {\n name: 'RAMPC',\n fn: rampc,\n mid: 'RAMPC',\n description: {}\n },\n {\n name: 'RAMPD',\n fn: rampd,\n mid: 'RAMPD',\n description: {}\n },\n {\n name: 'RAMPE',\n fn: rampe,\n mid: 'RAMPE',\n description: {}\n },\n {\n name: 'RAMPF',\n fn: rampf,\n mid: 'RAMPF',\n description: {}\n },\n {\n name: 'RAMPG',\n fn: rampg,\n mid: 'RAMPG',\n description: {}\n },\n {\n name: 'RAMPH',\n fn: ramph,\n mid: 'RAMPH',\n description: {}\n },\n {\n name: 'RAMPI',\n fn: rampi,\n mid: 'RAMPI',\n description: {}\n },\n {\n name: 'RAW',\n fn: raw,\n mid: 'RAW',\n description: {}\n }\n]\n\nfunction getCombinationsAsArrays(params: { values: any[] }[]): any[][] {\n return params.reduce<any[][]>((acc, { values }) => acc.flatMap((combo) => values.map((value) => [...combo, value])), [[]])\n}\n\nexport const SORTING_METHODS = SORTING_METHODS_RAW.reduce(\n (acc, item) => {\n if (item.fn.params) {\n const combinations = getCombinationsAsArrays(item.fn.params)\n\n for (const combination of combinations) {\n acc.push({\n ...item,\n name: `${item.name} [${combination.join(',')}]`,\n mid: `${item.mid}:[${combination.join(',')}]`,\n speed: (<{ [index: string]: number }>BENCH)[item.mid] || 0,\n fn: (c: UniColor) => item.fn.call(null, c, ...combination),\n valid: item.fn?.valid ? (c: UniColor) => item.fn?.valid?.call(null, c, ...combination) : undefined\n })\n }\n } else {\n acc.push(item)\n }\n\n return acc\n },\n <SortingMethod[]>[]\n)\n","import { distance, Vector3 } from './vector.ts'\nimport { lch, oklab } from './color.ts'\nimport { lchColorsHueSpread } from './type-detect.ts'\nimport { metrics } from './metrics.ts'\n\nexport type MetricsLch<T> = { L: T; C: T; H: T }\n\nexport type MetricsEx<T> = {\n totalDistance: T\n avgAngleChange: T\n maxAngleChange: T\n meanDistance: T\n devDistance: T\n totalCurveDistance: T\n meanCurveDistance: T\n devCurveDistance: T\n lchAvgChange: MetricsLch<T>\n lchMaxChange: MetricsLch<T>\n lchDeviation: MetricsLch<T>\n curveRatio: T\n perceptualUniformity: T\n curveUniformity: T\n // hueSpread: T\n // chromaRange: T\n // lightnessRange: T\n harmonicScore: T\n harmonicCurveScore: T\n}\n\nexport function metricsEx(colors: string[]): MetricsEx<number> {\n if (colors.length < 2) {\n return {\n totalDistance: 0,\n avgAngleChange: 0,\n maxAngleChange: 0,\n meanDistance: 0,\n devDistance: 0,\n totalCurveDistance: 0,\n meanCurveDistance: 0,\n devCurveDistance: 0,\n lchAvgChange: { L: 0, C: 0, H: 0 },\n lchMaxChange: { L: 0, C: 0, H: 0 },\n lchDeviation: { L: 0, C: 0, H: 0 },\n curveRatio: 0,\n perceptualUniformity: 0,\n curveUniformity: 0,\n // hueSpread: 0,\n // chromaRange: 0,\n // lightnessRange: 0,\n harmonicScore: 0,\n harmonicCurveScore: 0\n }\n }\n\n const vectors = colors.map((c) => oklab(c))\n const lchColors = colors.map((c) => lch(c))\n\n const { totalDistance, avgAngleChange, devDistance, maxAngleChange, meanDistance } = metrics(vectors)\n\n const hueSpread = lchColorsHueSpread(lchColors)\n\n let totalCurveDistance = 0\n // let angleChanges = []\n // let prevDirection = null\n // const distances = []\n const curveDistances = []\n\n // Extend endpoints for Catmull-Rom (duplicate first/last points)\n const extendedVectors = [vectors[0], ...vectors, vectors[vectors.length - 1]]\n\n // LCH component changes\n const lChanges = []\n const cChanges = []\n const hChanges = []\n\n for (let i = 1; i < vectors.length; i++) {\n // const dist = distance(vectors[i - 1], vectors[i])\n // totalDistance += dist\n // distances.push(dist)\n\n const curveDist = curveLengthBetween(extendedVectors[i - 1], extendedVectors[i], extendedVectors[i + 1], extendedVectors[i + 2])\n totalCurveDistance += curveDist\n curveDistances.push(curveDist)\n\n // const direction = normalize(subtract(vectors[i], vectors[i - 1]))\n\n // if (prevDirection && dist > 0) {\n // const dotProd = Math.max(-1, Math.min(1, dot(prevDirection, direction)))\n // const angle = Math.acos(dotProd) * (180 / Math.PI)\n // angleChanges.push(angle)\n // }\n\n // prevDirection = direction\n\n // LCH changes\n const [L1, C1, H1] = lchColors[i - 1]\n const [L2, C2, H2] = lchColors[i]\n\n lChanges.push(Math.abs(L2 - L1))\n cChanges.push(Math.abs(C2 - C1))\n\n // Handle hue wraparound (circular 0-360) and NaN for achromatic colors\n if (!isNaN(H1) && !isNaN(H2)) {\n let hDiff = Math.abs(H2 - H1)\n if (hDiff > 180) {\n hDiff = 360 - hDiff\n }\n hChanges.push(hDiff)\n } else if (isNaN(H1) && isNaN(H2)) {\n // Both achromatic - no hue change\n hChanges.push(0)\n } else {\n // One is achromatic, one is chromatic - this is a significant change\n // You could either skip it or treat it as a large change\n // Option 1: Skip (don't push anything)\n // Option 2: Push a penalty value\n hChanges.push(90) // Moderate penalty, or use 180 for max penalty\n }\n }\n\n // const meanDistance = totalDistance / (vectors.length - 1)\n // const devDistance = Math.sqrt(distances.reduce((acc, d) => acc + Math.pow(d - meanDistance, 2), 0) / (vectors.length - 1))\n\n const meanCurveDistance = totalCurveDistance / (vectors.length - 1)\n\n const devCurveDistance = Math.sqrt(curveDistances.reduce((acc, d) => acc + Math.pow(d - meanCurveDistance, 2), 0) / (vectors.length - 1))\n\n // const avgAngleChange = angleChanges.length > 0 ? angleChanges.reduce((a, b) => a + b, 0) / angleChanges.length : 0\n\n // const maxAngleChange = angleChanges.length > 0 ? Math.max(...angleChanges) : 0\n\n // LCH metrics\n const lchAvgChange = {\n L: lChanges.reduce((a, b) => a + b, 0) / lChanges.length,\n C: cChanges.reduce((a, b) => a + b, 0) / cChanges.length,\n H: hChanges.reduce((a, b) => a + b, 0) / hChanges.length\n }\n\n const lchMaxChange = {\n L: Math.max(...lChanges),\n C: Math.max(...cChanges),\n H: Math.max(...hChanges)\n }\n\n // Standard deviation for each LCH component\n const lMean = lchAvgChange.L\n const cMean = lchAvgChange.C\n const hMean = lchAvgChange.H\n\n const lchDeviation = {\n L: Math.sqrt(lChanges.reduce((acc, d) => acc + Math.pow(d - lMean, 2), 0) / lChanges.length),\n C: Math.sqrt(cChanges.reduce((acc, d) => acc + Math.pow(d - cMean, 2), 0) / cChanges.length),\n H: Math.sqrt(hChanges.reduce((acc, d) => acc + Math.pow(d - hMean, 2), 0) / hChanges.length)\n }\n\n // Perceptual uniformity: lower deviation from mean distance = more uniform\n const perceptualUniformity = 1 / (1 + devDistance)\n const curveUniformity = 1 / (1 + devCurveDistance)\n const curveRatio = totalCurveDistance / totalDistance - 1\n\n // Hue spread: how well distributed are hues across the color wheel\n // const hues = lchColors.map(([, , h]) => h).filter((h) => !nonH(h))\n // const hueSpread = hues.length > 1 ? calculateHueSpread(hues) : 0\n\n // Chroma and lightness range\n // const chromas = lchColors.map(([, c]) => c)\n // const lightnesses = lchColors.map(([l]) => l)\n\n // const chromaRange = Math.max(...chromas) - Math.min(...chromas)\n // const lightnessRange = Math.max(...lightnesses) - Math.min(...lightnesses)\n\n // Harmonic score: combines uniform spacing with good hue distribution\n const harmonicScore = perceptualUniformity * 0.4 + Math.min(hueSpread / 180, 1) * 0.3 + (1 / (1 + lchDeviation.H / 45)) * 0.3\n const harmonicCurveScore = curveUniformity * 0.4 + Math.min(hueSpread / 180, 1) * 0.3 + (1 / (1 + lchDeviation.H / 45)) * 0.3\n\n return {\n totalDistance,\n avgAngleChange,\n maxAngleChange,\n meanDistance,\n devDistance,\n totalCurveDistance,\n meanCurveDistance,\n devCurveDistance,\n lchAvgChange,\n lchMaxChange,\n lchDeviation,\n curveRatio,\n perceptualUniformity,\n curveUniformity,\n // hueSpread,\n // chromaRange,\n // lightnessRange,\n harmonicScore,\n harmonicCurveScore\n }\n}\n\nfunction catmullRom(p0: Vector3, p1: Vector3, p2: Vector3, p3: Vector3, t: number): Vector3 {\n const t2 = t * t\n const t3 = t2 * t\n\n return [\n 0.5 * (2 * p1[0] + (-p0[0] + p2[0]) * t + (2 * p0[0] - 5 * p1[0] + 4 * p2[0] - p3[0]) * t2 + (-p0[0] + 3 * p1[0] - 3 * p2[0] + p3[0]) * t3),\n 0.5 * (2 * p1[1] + (-p0[1] + p2[1]) * t + (2 * p0[1] - 5 * p1[1] + 4 * p2[1] - p3[1]) * t2 + (-p0[1] + 3 * p1[1] - 3 * p2[1] + p3[1]) * t3),\n 0.5 * (2 * p1[2] + (-p0[2] + p2[2]) * t + (2 * p0[2] - 5 * p1[2] + 4 * p2[2] - p3[2]) * t2 + (-p0[2] + 3 * p1[2] - 3 * p2[2] + p3[2]) * t3)\n ]\n}\n\n// Calculate curve length between two points using sampling\nfunction curveLengthBetween(p0: Vector3, p1: Vector3, p2: Vector3, p3: Vector3, samples = 12): number {\n let length = 0\n let prevPoint = p1\n\n for (let i = 1; i <= samples; i++) {\n const t = i / samples\n const point = catmullRom(p0, p1, p2, p3, t)\n length += distance(prevPoint, point)\n prevPoint = point\n }\n\n return length\n}\n\nconst asc = (a: number, b: number) => a - b\nconst dsc = (a: number, b: number) => b - a\n\nexport function getMetricsExRange(list: MetricsEx<number>[]): MetricsEx<[number, number]> {\n const range: MetricsEx<number[]> = {\n totalDistance: [],\n avgAngleChange: [],\n maxAngleChange: [],\n meanDistance: [],\n devDistance: [],\n totalCurveDistance: [],\n meanCurveDistance: [],\n devCurveDistance: [],\n lchAvgChange: { L: [], C: [], H: [] },\n lchMaxChange: { L: [], C: [], H: [] },\n lchDeviation: { L: [], C: [], H: [] },\n curveRatio: [],\n perceptualUniformity: [],\n curveUniformity: [],\n // hueSpread: [],\n // chromaRange: [],\n // lightnessRange: [],\n harmonicScore: [],\n harmonicCurveScore: []\n }\n\n for (const i of list) {\n range.totalDistance.push(i.totalDistance)\n range.avgAngleChange.push(i.avgAngleChange)\n range.maxAngleChange.push(i.maxAngleChange)\n range.meanDistance.push(i.meanDistance)\n range.devDistance.push(i.devDistance)\n range.totalCurveDistance.push(i.totalCurveDistance)\n range.meanCurveDistance.push(i.meanCurveDistance)\n range.devCurveDistance.push(i.devCurveDistance)\n range.lchAvgChange.L.push(i.lchAvgChange.L)\n range.lchAvgChange.C.push(i.lchAvgChange.C)\n range.lchAvgChange.H.push(i.lchAvgChange.H)\n range.lchMaxChange.L.push(i.lchMaxChange.L)\n range.lchMaxChange.C.push(i.lchMaxChange.C)\n range.lchMaxChange.H.push(i.lchMaxChange.H)\n range.lchDeviation.L.push(i.lchDeviation.L)\n range.lchDeviation.C.push(i.lchDeviation.C)\n range.lchDeviation.H.push(i.lchDeviation.H)\n range.curveRatio.push(i.curveRatio)\n range.perceptualUniformity.push(i.perceptualUniformity)\n range.curveUniformity.push(i.curveUniformity)\n // range.hueSpread.push(i.hueSpread)\n // range.chromaRange.push(i.chromaRange)\n // range.lightnessRange.push(i.lightnessRange)\n range.harmonicScore.push(i.harmonicScore)\n range.harmonicCurveScore.push(i.harmonicCurveScore)\n }\n\n range.totalDistance.sort(asc)\n range.avgAngleChange.sort(asc)\n range.maxAngleChange.sort(asc)\n range.meanDistance.sort(asc)\n range.devDistance.sort(asc)\n range.totalCurveDistance.sort(asc)\n range.meanCurveDistance.sort(asc)\n range.devCurveDistance.sort(asc)\n range.lchAvgChange.L.sort(asc)\n range.lchAvgChange.C.sort(asc)\n range.lchAvgChange.H.sort(asc)\n range.lchMaxChange.L.sort(asc)\n range.lchMaxChange.C.sort(asc)\n range.lchMaxChange.H.sort(asc)\n range.lchDeviation.L.sort(asc)\n range.lchDeviation.C.sort(asc)\n range.lchDeviation.H.sort(asc)\n range.curveRatio.sort(asc)\n range.perceptualUniformity.sort(dsc)\n range.curveUniformity.sort(dsc)\n // range.hueSpread.sort(asc)\n // range.chromaRange.sort(asc)\n // range.lightnessRange.sort(asc)\n range.harmonicScore.sort(dsc)\n range.harmonicCurveScore.sort(dsc)\n\n return <MetricsEx<[number, number]>>{\n totalDistance: [range.totalDistance[0], <number>range.totalDistance.at(-1)],\n avgAngleChange: [range.avgAngleChange[0], <number>range.avgAngleChange.at(-1)],\n maxAngleChange: [range.maxAngleChange[0], <number>range.maxAngleChange.at(-1)],\n meanDistance: [range.meanDistance[0], <number>range.meanDistance.at(-1)],\n devDistance: [range.devDistance[0], <number>range.devDistance.at(-1)],\n totalCurveDistance: [range.totalCurveDistance[0], <number>range.totalCurveDistance.at(-1)],\n meanCurveDistance: [range.meanCurveDistance[0], <number>range.meanCurveDistance.at(-1)],\n devCurveDistance: [range.devCurveDistance[0], <number>range.devCurveDistance.at(-1)],\n lchAvgChange: {\n L: [range.lchAvgChange.L[0], <number>range.lchAvgChange.L.at(-1)],\n C: [range.lchAvgChange.C[0], <number>range.lchAvgChange.C.at(-1)],\n H: [range.lchAvgChange.H[0], <number>range.lchAvgChange.H.at(-1)]\n },\n lchMaxChange: {\n L: [range.lchMaxChange.L[0], <number>range.lchMaxChange.L.at(-1)],\n C: [range.lchMaxChange.C[0], <number>range.lchMaxChange.C.at(-1)],\n H: [range.lchMaxChange.H[0], <number>range.lchMaxChange.H.at(-1)]\n },\n lchDeviation: {\n L: [range.lchDeviation.L[0], <number>range.lchDeviation.L.at(-1)],\n C: [range.lchDeviation.C[0], <number>range.lchDeviation.C.at(-1)],\n H: [range.lchDeviation.H[0], <number>range.lchDeviation.H.at(-1)]\n },\n curveRatio: [range.curveRatio[0], <number>range.curveRatio.at(-1)],\n perceptualUniformity: [range.perceptualUniformity[0], <number>range.perceptualUniformity.at(-1)],\n curveUniformity: [range.curveUniformity[0], <number>range.curveUniformity.at(-1)],\n // hueSpread: [range.hueSpread[0], <number>range.hueSpread.at(-1)],\n // chromaRange: [range.chromaRange[0], <number>range.chromaRange.at(-1)],\n // lightnessRange: [range.lightnessRange[0], <number>range.lightnessRange.at(-1)],\n harmonicScore: [range.harmonicScore[0], <number>range.harmonicScore.at(-1)],\n harmonicCurveScore: [range.harmonicCurveScore[0], <number>range.harmonicCurveScore.at(-1)]\n }\n}\n\nfunction interpolate(val: number, [min, max]: [number, number]): number {\n if (max === min) {\n return 0\n }\n return Math.max(0, Math.min(1, (val - min) / (max - min)))\n}\n\nfunction interpolateLch(val: MetricsLch<number>, rng: MetricsLch<[number, number]>): MetricsLch<number> {\n return {\n L: interpolate(val.L, rng.L),\n C: interpolate(val.C, rng.C),\n H: interpolate(val.H, rng.H)\n }\n}\n\nexport function metricsExQuality(value: MetricsEx<number>, range: MetricsEx<[number, number]>): MetricsEx<number> {\n return {\n totalDistance: interpolate(value.totalDistance, range.totalDistance),\n avgAngleChange: interpolate(value.avgAngleChange, range.avgAngleChange),\n maxAngleChange: interpolate(value.maxAngleChange, range.maxAngleChange),\n meanDistance: interpolate(value.meanDistance, range.meanDistance),\n devDistance: interpolate(value.devDistance, range.devDistance),\n totalCurveDistance: interpolate(value.totalCurveDistance, range.totalCurveDistance),\n meanCurveDistance: interpolate(value.meanCurveDistance, range.meanCurveDistance),\n devCurveDistance: interpolate(value.devCurveDistance, range.devCurveDistance),\n lchAvgChange: interpolateLch(value.lchAvgChange, range.lchAvgChange),\n lchMaxChange: interpolateLch(value.lchMaxChange, range.lchMaxChange),\n lchDeviation: interpolateLch(value.lchDeviation, range.lchDeviation),\n curveRatio: interpolate(value.curveRatio, range.curveRatio),\n perceptualUniformity: interpolate(value.perceptualUniformity, range.perceptualUniformity),\n curveUniformity: interpolate(value.curveUniformity, range.curveUniformity),\n // hueSpread: interpolate(value.hueSpread, range.hueSpread),\n // chromaRange: interpolate(value.chromaRange, range.chromaRange),\n // lightnessRange: interpolate(value.lightnessRange, range.lightnessRange),\n harmonicScore: interpolate(value.harmonicScore, range.harmonicScore),\n harmonicCurveScore: interpolate(value.harmonicCurveScore, range.harmonicCurveScore)\n }\n}\n\nexport function metricsExQualitySum(value: MetricsEx<number>): number {\n const {\n totalDistance,\n avgAngleChange,\n maxAngleChange,\n meanDistance,\n devDistance,\n totalCurveDistance,\n meanCurveDistance,\n devCurveDistance,\n lchAvgChange: { L: LA, C: CA, H: HA },\n lchMaxChange: { L: LM, C: CM, H: HM },\n lchDeviation: { L: LD, C: CD, H: HD },\n curveRatio,\n perceptualUniformity,\n curveUniformity,\n // hueSpread,\n // chromaRange,\n // lightnessRange,\n harmonicScore,\n harmonicCurveScore\n } = value\n\n return totalDistance + avgAngleChange + maxAngleChange + meanDistance + devDistance + totalCurveDistance + meanCurveDistance + devCurveDistance + LA + CA + HA + LM + CM + HM + LD + CD + HD + curveRatio + perceptualUniformity + curveUniformity + harmonicScore + harmonicCurveScore\n}\n","export function cosineSimilarity(a: number[], b: number[]): number {\n const dotProduct = a.reduce((sum, val, i) => sum + val * b[i], 0)\n const magA = Math.sqrt(a.reduce((sum, val) => sum + val * val, 0))\n const magB = Math.sqrt(b.reduce((sum, val) => sum + val * val, 0))\n\n if (magA === 0 || magB === 0) {\n return 0\n }\n return dotProduct / (magA * magB)\n}\n\nexport function manhattanDistance(fp1: number[], fp2: number[]) {\n return fp1.reduce((sum, val, i) => sum + Math.abs(val - fp2[i]), 0)\n}\n\nexport function euclideanDistance(a: number[], b: number[]): number {\n return Math.sqrt(a.reduce((sum, val, i) => sum + (val - b[i]) ** 2, 0))\n}\n\nexport function gaussianSimilarity(a: number, b: number, sigma: number): number {\n // Gaussian kernel: exp(-distance^2 / (2 * sigma^2))\n // Returns 1 when values are identical, decreases smoothly as they differ\n const distance = Math.abs(a - b)\n return Math.exp(-(distance * distance) / (2 * sigma * sigma))\n}\n\nexport function pearsonCorrelation(a: number[], b: number[]): number {\n const n = a.length\n if (n !== b.length || n === 0) {\n return 0\n }\n\n const meanA = a.reduce((sum, x) => sum + x, 0) / n\n const meanB = b.reduce((sum, x) => sum + x, 0) / n\n\n let numerator = 0\n let sumSqA = 0\n let sumSqB = 0\n\n for (let i = 0; i < n; i++) {\n const diffA = a[i] - meanA\n const diffB = b[i] - meanB\n numerator += diffA * diffB\n sumSqA += diffA * diffA\n sumSqB += diffB * diffB\n }\n\n const denominator = Math.sqrt(sumSqA * sumSqB)\n if (denominator === 0) {\n return 0\n }\n\n // Pearson returns -1 to 1, convert to 0 to 1\n return (numerator / denominator + 1) / 2\n}\n\nexport function fingerprintAverage(fingerprints: number[][]): number[] {\n return fingerprints.reduce((acc, f) => acc.map((v, i) => v + f[i]), <number[]>Array.from({ length: fingerprints[0].length }).fill(0)).map((x) => x / fingerprints.length)\n}\n\nexport function fingerprintMedian(fingerprints: number[][]): number[] {\n if (fingerprints.length === 0) {\n return []\n }\n\n const length = fingerprints[0].length\n const result: number[] = []\n\n for (let i = 0; i < length; i++) {\n const values = fingerprints.map((fp) => fp[i]).sort((a, b) => a - b)\n const mid = Math.floor(values.length / 2)\n result[i] = values.length % 2 === 0 ? (values[mid - 1] + values[mid]) / 2 : values[mid]\n }\n\n return result\n}\n\nexport function fingerprintAverageWithoutOutliers(fingerprints: number[][]): number[] {\n if (fingerprints.length === 0) {\n return []\n }\n\n if (fingerprints.length === 1) {\n return fingerprints[0]\n }\n\n // First, calculate distance of each fingerprint from the median\n const median = fingerprintMedian(fingerprints)\n const distances = fingerprints.map((fp) => Math.sqrt(fp.reduce((sum, val, i) => sum + Math.pow(val - median[i], 2), 0)))\n\n // Calculate IQR for distances\n const sortedDistances = [...distances].sort((a, b) => a - b)\n const q1 = sortedDistances[Math.floor(sortedDistances.length * 0.25)]\n const q3 = sortedDistances[Math.floor(sortedDistances.length * 0.75)]\n const iqr = q3 - q1\n const threshold = q3 + 1.5 * iqr\n\n // Filter out outliers\n const filtered = fingerprints.filter((_, i) => distances[i] <= threshold)\n\n if (!filtered.length) {\n return fingerprintAverage(fingerprints)\n }\n\n // Return average of remaining\n return fingerprintAverage(filtered)\n}\n","import { Vector3 } from './vector.ts'\n\nexport function snapInterpolator(values: number[], samples: number) {\n const step = (values.length - 1) / (samples - 1)\n\n // sample is 0 to (samples - 1)\n return (sample: number) => {\n const pos = sample * step\n const idx1 = Math.floor(pos)\n const idx2 = Math.min(idx1 + 1, values.length - 1)\n const frac = pos - idx1\n const snap = Math.floor((sample + 1) * step) > idx1 && (sample + 1) * step !== idx2\n\n if (snap) {\n return values[idx2]\n }\n\n {\n const s = sample - 1\n const pos = s * step\n const idx1 = Math.floor(pos)\n const idx2 = Math.min(idx1 + 1, values.length - 1)\n const snap = Math.floor((s + 1) * step) > idx1 && (s + 1) * step !== idx2\n\n if (snap) {\n return values[idx2]\n }\n }\n\n return values[idx1] * (1 - frac) + values[idx2] * frac\n }\n}\n\nexport function resamplePaletteSnap(labColors: Vector3[], samples: number = 256): Vector3[] {\n if (labColors.length < 2) {\n return labColors\n }\n\n const result: Vector3[] = []\n\n const iL = snapInterpolator(\n labColors.map((c) => c[0]),\n samples\n )\n const ia = snapInterpolator(\n labColors.map((c) => c[1]),\n samples\n )\n const ib = snapInterpolator(\n labColors.map((c) => c[2]),\n samples\n )\n\n for (let i = 0; i < samples; i++) {\n result.push([iL(i), ia(i), ib(i)])\n }\n\n return result\n}\n\nexport function downsamplePalette(labColors: Vector3[], targetSize: number): Vector3[] {\n if (labColors.length === targetSize) {\n return labColors\n }\n\n const result: Vector3[] = []\n const n = labColors.length\n const step = (n - 1) / (targetSize - 1)\n\n for (let i = 0; i < targetSize; i++) {\n const pos = i * step\n const idx1 = Math.floor(pos)\n const idx2 = Math.min(idx1 + 1, n - 1)\n const frac = pos - idx1\n\n const lab1 = labColors[idx1]\n const lab2 = labColors[idx2]\n\n result.push([lab1[0] * (1 - frac) + lab2[0] * frac, lab1[1] * (1 - frac) + lab2[1] * frac, lab1[2] * (1 - frac) + lab2[2] * frac])\n }\n\n return result\n}\n\nexport function resamplePaletteLinear(labColors: Vector3[], samples: number = 256): Vector3[] {\n if (labColors.length < 2) {\n return labColors\n }\n\n const result: Vector3[] = []\n const step = (labColors.length - 1) / (samples - 1)\n\n for (let i = 0; i < samples; i++) {\n const pos = i * step\n const idx1 = Math.floor(pos)\n const idx2 = Math.min(idx1 + 1, labColors.length - 1)\n const frac = pos - idx1\n\n // Interpolate in Oklab space (no hue wraparound issues!)\n const lab1 = labColors[idx1]\n const lab2 = labColors[idx2]\n\n result.push([\n lab1[0] * (1 - frac) + lab2[0] * frac, // L\n lab1[1] * (1 - frac) + lab2[1] * frac, // a\n lab1[2] * (1 - frac) + lab2[2] * frac // b\n ])\n }\n\n return result\n}\n\nexport function resampleLinear(values: number[], samples: number = 256): number[] {\n const result: number[] = []\n const step = (values.length - 1) / (samples - 1)\n\n for (let i = 0; i < samples; i++) {\n const pos = i * step\n const idx1 = Math.floor(pos)\n const idx2 = Math.min(idx1 + 1, values.length - 1)\n const frac = pos - idx1\n\n result.push(values[idx1] * (1 - frac) + values[idx2] * frac)\n }\n\n return result\n}\n","'use strict';\n\nfunction FFT(size) {\n this.size = size | 0;\n if (this.size <= 1 || (this.size & (this.size - 1)) !== 0)\n throw new Error('FFT size must be a power of two and bigger than 1');\n\n this._csize = size << 1;\n\n // NOTE: Use of `var` is intentional for old V8 versions\n var table = new Array(this.size * 2);\n for (var i = 0; i < table.length; i += 2) {\n const angle = Math.PI * i / this.size;\n table[i] = Math.cos(angle);\n table[i + 1] = -Math.sin(angle);\n }\n this.table = table;\n\n // Find size's power of two\n var power = 0;\n for (var t = 1; this.size > t; t <<= 1)\n power++;\n\n // Calculate initial step's width:\n // * If we are full radix-4 - it is 2x smaller to give inital len=8\n // * Otherwise it is the same as `power` to give len=4\n this._width = power % 2 === 0 ? power - 1 : power;\n\n // Pre-compute bit-reversal patterns\n this._bitrev = new Array(1 << this._width);\n for (var j = 0; j < this._bitrev.length; j++) {\n this._bitrev[j] = 0;\n for (var shift = 0; shift < this._width; shift += 2) {\n var revShift = this._width - shift - 2;\n this._bitrev[j] |= ((j >>> shift) & 3) << revShift;\n }\n }\n\n this._out = null;\n this._data = null;\n this._inv = 0;\n}\nmodule.exports = FFT;\n\nFFT.prototype.fromComplexArray = function fromComplexArray(complex, storage) {\n var res = storage || new Array(complex.length >>> 1);\n for (var i = 0; i < complex.length; i += 2)\n res[i >>> 1] = complex[i];\n return res;\n};\n\nFFT.prototype.createComplexArray = function createComplexArray() {\n const res = new Array(this._csize);\n for (var i = 0; i < res.length; i++)\n res[i] = 0;\n return res;\n};\n\nFFT.prototype.toComplexArray = function toComplexArray(input, storage) {\n var res = storage || this.createComplexArray();\n for (var i = 0; i < res.length; i += 2) {\n res[i] = input[i >>> 1];\n res[i + 1] = 0;\n }\n return res;\n};\n\nFFT.prototype.completeSpectrum = function completeSpectrum(spectrum) {\n var size = this._csize;\n var half = size >>> 1;\n for (var i = 2; i < half; i += 2) {\n spectrum[size - i] = spectrum[i];\n spectrum[size - i + 1] = -spectrum[i + 1];\n }\n};\n\nFFT.prototype.transform = function transform(out, data) {\n if (out === data)\n throw new Error('Input and output buffers must be different');\n\n this._out = out;\n this._data = data;\n this._inv = 0;\n this._transform4();\n this._out = null;\n this._data = null;\n};\n\nFFT.prototype.realTransform = function realTransform(out, data) {\n if (out === data)\n throw new Error('Input and output buffers must be different');\n\n this._out = out;\n this._data = data;\n this._inv = 0;\n this._realTransform4();\n this._out = null;\n this._data = null;\n};\n\nFFT.prototype.inverseTransform = function inverseTransform(out, data) {\n if (out === data)\n throw new Error('Input and output buffers must be different');\n\n this._out = out;\n this._data = data;\n this._inv = 1;\n this._transform4();\n for (var i = 0; i < out.length; i++)\n out[i] /= this.size;\n this._out = null;\n this._data = null;\n};\n\n// radix-4 implementation\n//\n// NOTE: Uses of `var` are intentional for older V8 version that do not\n// support both `let compound assignments` and `const phi`\nFFT.prototype._transform4 = function _transform4() {\n var out = this._out;\n var size = this._csize;\n\n // Initial step (permute and transform)\n var width = this._width;\n var step = 1 << width;\n var len = (size / step) << 1;\n\n var outOff;\n var t;\n var bitrev = this._bitrev;\n if (len === 4) {\n for (outOff = 0, t = 0; outOff < size; outOff += len, t++) {\n const off = bitrev[t];\n this._singleTransform2(outOff, off, step);\n }\n } else {\n // len === 8\n for (outOff = 0, t = 0; outOff < size; outOff += len, t++) {\n const off = bitrev[t];\n this._singleTransform4(outOff, off, step);\n }\n }\n\n // Loop through steps in decreasing order\n var inv = this._inv ? -1 : 1;\n var table = this.table;\n for (step >>= 2; step >= 2; step >>= 2) {\n len = (size / step) << 1;\n var quarterLen = len >>> 2;\n\n // Loop through offsets in the data\n for (outOff = 0; outOff < size; outOff += len) {\n // Full case\n var limit = outOff + quarterLen;\n for (var i = outOff, k = 0; i < limit; i += 2, k += step) {\n const A = i;\n const B = A + quarterLen;\n const C = B + quarterLen;\n const D = C + quarterLen;\n\n // Original values\n const Ar = out[A];\n const Ai = out[A + 1];\n const Br = out[B];\n const Bi = out[B + 1];\n const Cr = out[C];\n const Ci = out[C + 1];\n const Dr = out[D];\n const Di = out[D + 1];\n\n // Middle values\n const MAr = Ar;\n const MAi = Ai;\n\n const tableBr = table[k];\n const tableBi = inv * table[k + 1];\n const MBr = Br * tableBr - Bi * tableBi;\n const MBi = Br * tableBi + Bi * tableBr;\n\n const tableCr = table[2 * k];\n const tableCi = inv * table[2 * k + 1];\n const MCr = Cr * tableCr - Ci * tableCi;\n const MCi = Cr * tableCi + Ci * tableCr;\n\n const tableDr = table[3 * k];\n const tableDi = inv * table[3 * k + 1];\n const MDr = Dr * tableDr - Di * tableDi;\n const MDi = Dr * tableDi + Di * tableDr;\n\n // Pre-Final values\n const T0r = MAr + MCr;\n const T0i = MAi + MCi;\n const T1r = MAr - MCr;\n const T1i = MAi - MCi;\n const T2r = MBr + MDr;\n const T2i = MBi + MDi;\n const T3r = inv * (MBr - MDr);\n const T3i = inv * (MBi - MDi);\n\n // Final values\n const FAr = T0r + T2r;\n const FAi = T0i + T2i;\n\n const FCr = T0r - T2r;\n const FCi = T0i - T2i;\n\n const FBr = T1r + T3i;\n const FBi = T1i - T3r;\n\n const FDr = T1r - T3i;\n const FDi = T1i + T3r;\n\n out[A] = FAr;\n out[A + 1] = FAi;\n out[B] = FBr;\n out[B + 1] = FBi;\n out[C] = FCr;\n out[C + 1] = FCi;\n out[D] = FDr;\n out[D + 1] = FDi;\n }\n }\n }\n};\n\n// radix-2 implementation\n//\n// NOTE: Only called for len=4\nFFT.prototype._singleTransform2 = function _singleTransform2(outOff, off,\n step) {\n const out = this._out;\n const data = this._data;\n\n const evenR = data[off];\n const evenI = data[off + 1];\n const oddR = data[off + step];\n const oddI = data[off + step + 1];\n\n const leftR = evenR + oddR;\n const leftI = evenI + oddI;\n const rightR = evenR - oddR;\n const rightI = evenI - oddI;\n\n out[outOff] = leftR;\n out[outOff + 1] = leftI;\n out[outOff + 2] = rightR;\n out[outOff + 3] = rightI;\n};\n\n// radix-4\n//\n// NOTE: Only called for len=8\nFFT.prototype._singleTransform4 = function _singleTransform4(outOff, off,\n step) {\n const out = this._out;\n const data = this._data;\n const inv = this._inv ? -1 : 1;\n const step2 = step * 2;\n const step3 = step * 3;\n\n // Original values\n const Ar = data[off];\n const Ai = data[off + 1];\n const Br = data[off + step];\n const Bi = data[off + step + 1];\n const Cr = data[off + step2];\n const Ci = data[off + step2 + 1];\n const Dr = data[off + step3];\n const Di = data[off + step3 + 1];\n\n // Pre-Final values\n const T0r = Ar + Cr;\n const T0i = Ai + Ci;\n const T1r = Ar - Cr;\n const T1i = Ai - Ci;\n const T2r = Br + Dr;\n const T2i = Bi + Di;\n const T3r = inv * (Br - Dr);\n const T3i = inv * (Bi - Di);\n\n // Final values\n const FAr = T0r + T2r;\n const FAi = T0i + T2i;\n\n const FBr = T1r + T3i;\n const FBi = T1i - T3r;\n\n const FCr = T0r - T2r;\n const FCi = T0i - T2i;\n\n const FDr = T1r - T3i;\n const FDi = T1i + T3r;\n\n out[outOff] = FAr;\n out[outOff + 1] = FAi;\n out[outOff + 2] = FBr;\n out[outOff + 3] = FBi;\n out[outOff + 4] = FCr;\n out[outOff + 5] = FCi;\n out[outOff + 6] = FDr;\n out[outOff + 7] = FDi;\n};\n\n// Real input radix-4 implementation\nFFT.prototype._realTransform4 = function _realTransform4() {\n var out = this._out;\n var size = this._csize;\n\n // Initial step (permute and transform)\n var width = this._width;\n var step = 1 << width;\n var len = (size / step) << 1;\n\n var outOff;\n var t;\n var bitrev = this._bitrev;\n if (len === 4) {\n for (outOff = 0, t = 0; outOff < size; outOff += len, t++) {\n const off = bitrev[t];\n this._singleRealTransform2(outOff, off >>> 1, step >>> 1);\n }\n } else {\n // len === 8\n for (outOff = 0, t = 0; outOff < size; outOff += len, t++) {\n const off = bitrev[t];\n this._singleRealTransform4(outOff, off >>> 1, step >>> 1);\n }\n }\n\n // Loop through steps in decreasing order\n var inv = this._inv ? -1 : 1;\n var table = this.table;\n for (step >>= 2; step >= 2; step >>= 2) {\n len = (size / step) << 1;\n var halfLen = len >>> 1;\n var quarterLen = halfLen >>> 1;\n var hquarterLen = quarterLen >>> 1;\n\n // Loop through offsets in the data\n for (outOff = 0; outOff < size; outOff += len) {\n for (var i = 0, k = 0; i <= hquarterLen; i += 2, k += step) {\n var A = outOff + i;\n var B = A + quarterLen;\n var C = B + quarterLen;\n var D = C + quarterLen;\n\n // Original values\n var Ar = out[A];\n var Ai = out[A + 1];\n var Br = out[B];\n var Bi = out[B + 1];\n var Cr = out[C];\n var Ci = out[C + 1];\n var Dr = out[D];\n var Di = out[D + 1];\n\n // Middle values\n var MAr = Ar;\n var MAi = Ai;\n\n var tableBr = table[k];\n var tableBi = inv * table[k + 1];\n var MBr = Br * tableBr - Bi * tableBi;\n var MBi = Br * tableBi + Bi * tableBr;\n\n var tableCr = table[2 * k];\n var tableCi = inv * table[2 * k + 1];\n var MCr = Cr * tableCr - Ci * tableCi;\n var MCi = Cr * tableCi + Ci * tableCr;\n\n var tableDr = table[3 * k];\n var tableDi = inv * table[3 * k + 1];\n var MDr = Dr * tableDr - Di * tableDi;\n var MDi = Dr * tableDi + Di * tableDr;\n\n // Pre-Final values\n var T0r = MAr + MCr;\n var T0i = MAi + MCi;\n var T1r = MAr - MCr;\n var T1i = MAi - MCi;\n var T2r = MBr + MDr;\n var T2i = MBi + MDi;\n var T3r = inv * (MBr - MDr);\n var T3i = inv * (MBi - MDi);\n\n // Final values\n var FAr = T0r + T2r;\n var FAi = T0i + T2i;\n\n var FBr = T1r + T3i;\n var FBi = T1i - T3r;\n\n out[A] = FAr;\n out[A + 1] = FAi;\n out[B] = FBr;\n out[B + 1] = FBi;\n\n // Output final middle point\n if (i === 0) {\n var FCr = T0r - T2r;\n var FCi = T0i - T2i;\n out[C] = FCr;\n out[C + 1] = FCi;\n continue;\n }\n\n // Do not overwrite ourselves\n if (i === hquarterLen)\n continue;\n\n // In the flipped case:\n // MAi = -MAi\n // MBr=-MBi, MBi=-MBr\n // MCr=-MCr\n // MDr=MDi, MDi=MDr\n var ST0r = T1r;\n var ST0i = -T1i;\n var ST1r = T0r;\n var ST1i = -T0i;\n var ST2r = -inv * T3i;\n var ST2i = -inv * T3r;\n var ST3r = -inv * T2i;\n var ST3i = -inv * T2r;\n\n var SFAr = ST0r + ST2r;\n var SFAi = ST0i + ST2i;\n\n var SFBr = ST1r + ST3i;\n var SFBi = ST1i - ST3r;\n\n var SA = outOff + quarterLen - i;\n var SB = outOff + halfLen - i;\n\n out[SA] = SFAr;\n out[SA + 1] = SFAi;\n out[SB] = SFBr;\n out[SB + 1] = SFBi;\n }\n }\n }\n};\n\n// radix-2 implementation\n//\n// NOTE: Only called for len=4\nFFT.prototype._singleRealTransform2 = function _singleRealTransform2(outOff,\n off,\n step) {\n const out = this._out;\n const data = this._data;\n\n const evenR = data[off];\n const oddR = data[off + step];\n\n const leftR = evenR + oddR;\n const rightR = evenR - oddR;\n\n out[outOff] = leftR;\n out[outOff + 1] = 0;\n out[outOff + 2] = rightR;\n out[outOff + 3] = 0;\n};\n\n// radix-4\n//\n// NOTE: Only called for len=8\nFFT.prototype._singleRealTransform4 = function _singleRealTransform4(outOff,\n off,\n step) {\n const out = this._out;\n const data = this._data;\n const inv = this._inv ? -1 : 1;\n const step2 = step * 2;\n const step3 = step * 3;\n\n // Original values\n const Ar = data[off];\n const Br = data[off + step];\n const Cr = data[off + step2];\n const Dr = data[off + step3];\n\n // Pre-Final values\n const T0r = Ar + Cr;\n const T1r = Ar - Cr;\n const T2r = Br + Dr;\n const T3r = inv * (Br - Dr);\n\n // Final values\n const FAr = T0r + T2r;\n\n const FBr = T1r;\n const FBi = -T3r;\n\n const FCr = T0r - T2r;\n\n const FDr = T1r;\n const FDi = T3r;\n\n out[outOff] = FAr;\n out[outOff + 1] = 0;\n out[outOff + 2] = FBr;\n out[outOff + 3] = FBi;\n out[outOff + 4] = FCr;\n out[outOff + 5] = 0;\n out[outOff + 6] = FDr;\n out[outOff + 7] = FDi;\n};\n","import FFT from 'fft.js'\nimport { resampleLinear } from './resample.ts'\n\nexport function fft(numbers: number[]) {\n if (!numbers.length) {\n return [0, 0]\n }\n\n const size = Math.pow(2, Math.ceil(Math.log(Math.max(2, numbers.length)) / Math.log(2)))\n const values = numbers.length < size ? resampleLinear(numbers, size) : numbers\n\n const ff = new FFT(size)\n const spectrum: number[] = ff.createComplexArray()\n ff.realTransform(spectrum, values)\n // ff.completeSpectrum(spectrum)\n return spectrum\n}\n\nexport function half(spectrum: number[]) {\n return spectrum.slice(2, Math.floor(spectrum.length / 2))\n}\n\nexport function magnitude(half: number[]) {\n return Array.from({ length: half.length / 2 }).map((_, i) => Math.sqrt(half[i] ** 2 + half[i + 1] ** 2))\n}\n","import { resamplePaletteLinear } from './resample.ts'\nimport { Vector3 } from './vector.ts'\nimport { interpolateNaNs } from './statistics.ts'\nimport { fft, half, magnitude } from './fft.ts'\n\nexport interface ChromaticLch {\n chromatic: Vector3[]\n achromatic: Vector3[]\n}\n\nexport function chromaticLch(lchColors: Vector3[], threshold: number = 0.03): ChromaticLch {\n const chromatic = lchColors.filter((c) => c[1] >= threshold && c[1] !== undefined)\n const achromatic = lchColors.filter((c) => c[1] < threshold || c[1] === undefined)\n\n return {\n chromatic,\n achromatic\n }\n}\n\nexport interface MagnitudesLch {\n lightnessMags: number[]\n chromaMags: number[]\n hueDeltaMags: number[]\n hues: number[]\n hueDeltas: number[]\n sortedHues: number[]\n chromas: number[]\n lightnesses: number[]\n}\n\nexport function fftLch(lchColors: Vector3[]): MagnitudesLch {\n // Extract channels\n const lightnesses = lchColors.map((c) => c[0])\n const chromas = lchColors.map((c) => c[1])\n const hues = lchColors.map((c) => c[2])\n\n // Normalize hues to [0, 360)\n const normalizedHues = hues.map((h) => ((h % 360) + 360) % 360)\n\n // Sort hues and calculate deltas (captures clustering pattern)\n const sortedHues = [...normalizedHues].filter((x) => isFinite(x)).sort((a, b) => a - b)\n\n const hueDeltas: number[] = []\n\n for (let i = 0; i < sortedHues.length - 1; i++) {\n hueDeltas.push(sortedHues[i + 1] - sortedHues[i])\n }\n\n if (sortedHues.length > 0) {\n hueDeltas.push(360 - sortedHues[sortedHues.length - 1] + sortedHues[0])\n }\n\n // Extract magnitudes (first half, excluding DC component)\n const hueDeltaMags = magnitude(half(fft(hueDeltas)))\n const chromaMags = magnitude(half(fft(chromas)))\n const lightnessMags = magnitude(half(fft(lightnesses)))\n\n return {\n hueDeltaMags,\n chromaMags,\n lightnessMags,\n hues: normalizedHues,\n hueDeltas,\n sortedHues,\n chromas,\n lightnesses\n }\n}\n\nexport interface Stats {\n dominantFrequencies: number[]\n smoothness: number\n totalEnergy: number\n probabilities: number[]\n complexity: number\n}\n\nexport function magnitudesStats(magnitudes: number[]): Stats {\n // Find dominant frequencies\n const dominantFrequencies = magnitudes\n .map((mag, i) => ({ freq: i + 1, mag }))\n .sort((a, b) => b.mag - a.mag)\n .slice(0, 3)\n .map((x) => x.freq)\n\n // Calculate smoothness (low-freq energy / high-freq energy)\n const cutoff = Math.ceil(magnitudes.length * 0.3)\n\n const lowFreqEnergy = magnitudes.slice(0, cutoff).reduce((sum, m) => sum + m * m, 0)\n const highFreqEnergy = magnitudes.slice(cutoff).reduce((sum, m) => sum + m * m, 0)\n\n const smoothness = highFreqEnergy > 0 ? lowFreqEnergy / highFreqEnergy : Infinity\n\n // Calculate spectral entropy (complexity measure)\n const totalEnergy = magnitudes.reduce((sum, m) => sum + m * m, 0)\n const probabilities = magnitudes.map((m) => (m * m) / totalEnergy)\n const complexity = -probabilities.reduce((sum, p) => sum + (p > 0 ? p * Math.log(p) : 0), 0)\n\n return {\n dominantFrequencies,\n smoothness,\n totalEnergy,\n probabilities,\n complexity\n }\n}\n\nexport function featuresLch(lchColors: Vector3[]): MagnitudesLch & Stats {\n const { chromatic } = chromaticLch(lchColors)\n const magnitudes = fftLch(chromatic)\n const stats = magnitudesStats(magnitudes.hueDeltaMags)\n\n return {\n ...magnitudes,\n ...stats\n }\n}\n\nexport interface MagnitudesLab {\n lightnessMags: number[]\n aMags: number[]\n bMags: number[]\n chromaMags: number[]\n}\n\nexport function magnitudesLab(labColors: Vector3[]): MagnitudesLab {\n const lightness = labColors.map((c) => c[0])\n const aChannel = interpolateNaNs(labColors.map((c) => c[1]))\n const bChannel = interpolateNaNs(labColors.map((c) => c[2]))\n const chroma = labColors.map((_, i) => Math.sqrt(aChannel[i] ** 2 + bChannel[i] ** 2))\n\n const lightnessMags = magnitude(half(fft(lightness)))\n const aMags = magnitude(half(fft(aChannel)))\n const bMags = magnitude(half(fft(bChannel)))\n const chromaMags = magnitude(half(fft(chroma)))\n\n return {\n lightnessMags,\n aMags,\n bMags,\n chromaMags\n }\n}\n\nexport interface StatsLab {\n lightness: number\n a: number\n b: number\n chroma: number\n}\n\nexport function statsLab({ lightnessMags, aMags, bMags, chromaMags }: MagnitudesLab, calculate: Function): StatsLab {\n return {\n lightness: calculate(lightnessMags),\n a: calculate(aMags),\n b: calculate(bMags),\n chroma: calculate(chromaMags)\n }\n}\n\nexport interface StatsLabEx {\n spectralCentroid: StatsLab\n spectralSpread: StatsLab\n spectralRolloff: StatsLab\n\n energyRatios: {\n lowFreq: number // 0-30% of spectrum\n midFreq: number // 30-70% of spectrum\n highFreq: number // 70-100% of spectrum\n }\n\n // Complexity measures\n smoothness: number // Low-freq / high-freq energy ratio\n complexity: number // Spectral entropy\n dominantFrequencies: number[] // Top 3 frequency bins\n}\n\nexport function statsLabsEx(magnitudesLab: MagnitudesLab): StatsLabEx {\n const spectralCentroid = statsLab(magnitudesLab, calculateCentroid)\n const spectralRolloff = statsLab(magnitudesLab, calculateRolloff)\n\n const { lightnessMags, aMags, bMags, chromaMags } = magnitudesLab\n\n const spectralSpread = {\n lightness: calculateSpread(lightnessMags, spectralCentroid.lightness),\n a: calculateSpread(aMags, spectralCentroid.a),\n b: calculateSpread(bMags, spectralCentroid.b),\n chroma: calculateSpread(chromaMags, spectralCentroid.chroma)\n }\n\n // Use combined spectrum (a + b) for overall color transitions\n const colorSpectrum = aMags.map((a, i) => Math.sqrt(a ** 2 + bMags[i] ** 2))\n\n const energyRatios = calculateEnergyRatios(colorSpectrum)\n const smoothness = calculateSmoothness(colorSpectrum)\n const complexity = calculateComplexity(colorSpectrum)\n const dominantFrequencies = findDominantFrequencies(colorSpectrum, 3)\n\n return {\n spectralCentroid,\n spectralSpread,\n spectralRolloff,\n energyRatios,\n smoothness,\n complexity,\n dominantFrequencies\n }\n}\n\nexport function featuresLab(labColors: Vector3[]): StatsLabEx & MagnitudesLab {\n const resampled = resamplePaletteLinear(labColors, 256)\n const magnitudes = magnitudesLab(resampled)\n const stats = statsLabsEx(magnitudes)\n\n return {\n ...magnitudes,\n ...stats\n }\n}\n\n// ============================================================================\n// Spectral Analysis Helpers\n// ============================================================================\n\nfunction calculateCentroid(spectrum: number[]): number {\n const total = spectrum.reduce((sum, x) => sum + x, 0)\n if (total === 0) {\n return 0\n }\n\n const weightedSum = spectrum.reduce((sum, mag, i) => sum + mag * i, 0)\n return weightedSum / total / spectrum.length // Normalize to 0-1\n}\n\nfunction calculateSpread(spectrum: number[], centroid: number): number {\n const total = spectrum.reduce((sum, x) => sum + x, 0)\n if (total === 0) {\n return 0\n }\n\n const normalizedCentroid = centroid * spectrum.length\n const variance = spectrum.reduce((sum, mag, i) => sum + mag * (i - normalizedCentroid) ** 2, 0) / total\n\n return Math.sqrt(variance) / spectrum.length // Normalize to 0-1\n}\n\nfunction calculateRolloff(spectrum: number[], threshold: number = 0.85): number {\n const energy = spectrum.map((x) => x * x)\n const totalEnergy = energy.reduce((sum, x) => sum + x, 0)\n if (totalEnergy === 0) {\n return 0\n }\n\n let cumEnergy = 0\n for (let i = 0; i < spectrum.length; i++) {\n cumEnergy += energy[i]\n if (cumEnergy >= threshold * totalEnergy) {\n return i / spectrum.length // Normalize to 0-1\n }\n }\n\n return 1.0\n}\n\nfunction calculateEnergyRatios(spectrum: number[]) {\n const energy = spectrum.map((x) => x * x)\n const totalEnergy = energy.reduce((sum, x) => sum + x, 0)\n\n if (totalEnergy === 0) {\n return { lowFreq: 0, midFreq: 0, highFreq: 0 }\n }\n\n const lowIdx = Math.floor(spectrum.length * 0.3)\n const highIdx = Math.floor(spectrum.length * 0.7)\n\n const lowFreqEnergy = energy.slice(0, lowIdx).reduce((sum, x) => sum + x, 0)\n const midFreqEnergy = energy.slice(lowIdx, highIdx).reduce((sum, x) => sum + x, 0)\n const highFreqEnergy = energy.slice(highIdx).reduce((sum, x) => sum + x, 0)\n\n return {\n lowFreq: lowFreqEnergy / totalEnergy,\n midFreq: midFreqEnergy / totalEnergy,\n highFreq: highFreqEnergy / totalEnergy\n }\n}\n\nfunction calculateSmoothness(spectrum: number[]): number {\n const cutoff = Math.floor(spectrum.length * 0.3)\n const energy = spectrum.map((x) => x * x)\n\n const lowFreqEnergy = energy.slice(0, cutoff).reduce((sum, x) => sum + x, 0)\n const highFreqEnergy = energy.slice(cutoff).reduce((sum, x) => sum + x, 0)\n\n return highFreqEnergy > 0 ? lowFreqEnergy / highFreqEnergy : Infinity\n}\n\nfunction calculateComplexity(spectrum: number[]): number {\n const totalEnergy = spectrum.reduce((sum, x) => sum + x * x, 0)\n if (totalEnergy === 0) {\n return 0\n }\n\n const probabilities = spectrum.map((x) => (x * x) / totalEnergy)\n const entropy = -probabilities.reduce((sum, p) => sum + (p > 0 ? p * Math.log(p) : 0), 0)\n\n return entropy\n}\n\nfunction findDominantFrequencies(spectrum: number[], count: number): number[] {\n return spectrum\n .map((mag, i) => ({ freq: i + 1, mag }))\n .sort((a, b) => b.mag - a.mag)\n .slice(0, count)\n .map((x) => x.freq)\n}\n","import { Vector3 } from './vector.ts'\nimport { cosineSimilarity, euclideanDistance, manhattanDistance } from './similarity.ts'\nimport { energy, highFreqRatio, mean, variance } from './statistics.ts'\nimport { chromaticLch, fftLch } from './metrics-spectral.ts'\n\nexport type Analysis = {\n type: string\n confidence: number\n features: {\n chromaticRatio?: number\n achromaticCount?: number\n hueSpread?: number\n chromaticCount?: number\n largeGaps?: number\n avgGap?: number\n maxGap?: number\n chromaVariance?: number\n hueHighFreqRatio?: number\n chromaHighFreqRatio?: number\n }\n fingerprint?: Fingerprint\n spectra?: {\n hueDeltaMags: number[]\n chromaMags: number[]\n lightnessMags: number[]\n hueDeltaEnergy: number\n chromaEnergy: number\n lightnessEnergy: number\n }\n}\n\nexport type Fingerprint = [number, number, number, number, number, number, number]\n\nexport type SpectrumData = { freq: number; hueDelta: number; chroma: number; lightness: number }\n\nfunction analyzePaletteStructure(lchColors: Vector3[]): Analysis {\n // if (lchColors.length < 4) {\n // return {\n // type: 'insufficient-data',\n // confidence: 0,\n // features: {}\n // }\n // }\n\n const { chromatic, achromatic } = chromaticLch(lchColors)\n\n // if (chromatic.length < 3) {\n // return {\n // type: 'achromatic',\n // confidence: 1.0,\n // features: {\n // chromaticRatio: chromatic.length / lchColors.length,\n // achromaticCount: achromatic.length\n // }\n // }\n // }\n\n const {\n hueDeltaMags,\n chromaMags,\n lightnessMags,\n // hues,\n hueDeltas,\n sortedHues,\n chromas,\n lightnesses\n // } = fftLch(chromatic)\n } = fftLch(lchColors)\n\n // Calculate features\n const maxGap = Math.max(...hueDeltas)\n const hueSpread = sortedHues.length > 0 ? 360 - maxGap : 0\n const chromaVariance = variance(chromas)\n const lightnessVariance = variance(lightnesses)\n\n // Detect gaps in hue distribution (indicates multi-ramp)\n const largeGaps = hueDeltas.filter((d) => d > 45).length\n const avgGap = mean(hueDeltas)\n\n // Spectral features (hue-independent)\n const hueDeltaEnergy = energy(hueDeltaMags)\n const chromaEnergy = energy(chromaMags)\n const lightnessEnergy = energy(lightnessMags)\n\n // High-frequency content indicates multi-ramp (abrupt transitions)\n const hueHighFreqRatio = highFreqRatio(hueDeltaMags)\n const chromaHighFreqRatio = highFreqRatio(chromaMags)\n\n // Classification logic\n let type = 'unknown'\n let confidence = 0\n\n if (hueSpread < 60) {\n type = 'monochromatic'\n confidence = 0.9\n } else if (largeGaps >= 2 || hueHighFreqRatio > 0.3) {\n type = 'multi-ramp'\n confidence = Math.min(0.95, 0.6 + hueHighFreqRatio)\n } else if (hueSpread > 300 || largeGaps === 0) {\n type = 'full-spectrum'\n confidence = 0.85\n } else {\n type = 'wide-gamut'\n confidence = 0.7\n }\n\n // Create fingerprint vector (hue-independent features)\n const fingerprint: Fingerprint = <Fingerprint>[\n hueHighFreqRatio,\n chromaHighFreqRatio,\n chromaVariance,\n lightnessVariance,\n largeGaps / hueDeltas.length,\n (maxGap || 0) / 360,\n chromatic.length / lchColors.length,\n // ...hueDeltaMags.slice(0, 4)\n // ...chromaMags.slice(0, 4),\n ...lightnessMags.slice(0, 4)\n ]\n\n return {\n type,\n confidence,\n features: {\n hueSpread,\n chromaticCount: chromatic.length,\n achromaticCount: achromatic.length,\n largeGaps,\n avgGap: avgGap,\n maxGap: maxGap,\n chromaVariance: chromaVariance,\n hueHighFreqRatio: hueHighFreqRatio,\n chromaHighFreqRatio: chromaHighFreqRatio\n },\n fingerprint,\n spectra: {\n hueDeltaMags,\n chromaMags,\n lightnessMags,\n hueDeltaEnergy,\n chromaEnergy,\n lightnessEnergy\n }\n }\n}\n\nexport function metricsFftFingerprint(lchColors: Vector3[]) {\n const analysis: Analysis = analyzePaletteStructure(lchColors)\n\n const spectrumData: SpectrumData[] = analysis?.spectra?.hueDeltaMags\n ? analysis.spectra.hueDeltaMags.slice(0, 16).map((mag, i) => ({\n freq: i,\n hueDelta: mag,\n chroma: analysis?.spectra?.chromaMags[i] || 0,\n lightness: analysis?.spectra?.lightnessMags[i] || 0\n }))\n : []\n\n return {\n analysis,\n spectrumData\n }\n}\n\nexport function compareFingerprints(fp1: Fingerprint, fp2: Fingerprint) {\n const cosine = cosineSimilarity(fp1, fp2)\n const euclidean = euclideanDistance(fp1, fp2)\n const manhattan = manhattanDistance(fp1, fp2)\n\n return {\n cosine,\n euclidean,\n manhattan,\n // Cosine similarity interpretation\n similarity: cosine,\n interpretation: cosine > 0.95 ? 'Nearly Identical' : cosine > 0.85 ? 'Very Similar' : cosine > 0.7 ? 'Similar' : cosine > 0.5 ? 'Somewhat Similar' : cosine > 0.3 ? 'Somewhat Different' : 'Very Different'\n }\n}\n","import { cosineSimilarity, euclideanDistance, gaussianSimilarity, pearsonCorrelation } from './similarity.ts'\nimport { MagnitudesLab, StatsLabEx } from './metrics-spectral.ts'\n\ninterface SimilarityResult {\n overall: number // 0-1, higher = more similar\n structural: number // Based on frequency domain patterns\n perceptual: number // Based on color space distributions\n breakdown: {\n smoothnessSimilarity: number\n complexitySimilarity: number\n energyDistributionSimilarity: number\n centroidSimilarity: number\n rolloffSimilarity: number\n spectrumCorrelation: number\n }\n interpretation: string\n}\n\n/**\n * Compare two palettes using their spectral features\n * Returns similarity score from 0 (completely different) to 1 (identical)\n */\nexport function compareSpectralFeatures(features1: StatsLabEx & MagnitudesLab, features2: StatsLabEx & MagnitudesLab): SimilarityResult {\n // 1. Compare scalar metrics with Gaussian similarity\n const smoothnessSim = gaussianSimilarity(features1.smoothness, features2.smoothness, 1.0)\n\n const complexitySim = gaussianSimilarity(features1.complexity, features2.complexity, 0.5)\n\n // 2. Compare energy distribution using cosine similarity\n const energy1 = [features1.energyRatios.lowFreq, features1.energyRatios.midFreq, features1.energyRatios.highFreq]\n const energy2 = [features2.energyRatios.lowFreq, features2.energyRatios.midFreq, features2.energyRatios.highFreq]\n const energySim = cosineSimilarity(energy1, energy2)\n\n // 3. Compare spectral centroids (average across all channels)\n const centroid1 = [features1.spectralCentroid.lightness, features1.spectralCentroid.a, features1.spectralCentroid.b, features1.spectralCentroid.chroma]\n const centroid2 = [features2.spectralCentroid.lightness, features2.spectralCentroid.a, features2.spectralCentroid.b, features2.spectralCentroid.chroma]\n const centroidSim = 1 - euclideanDistance(centroid1, centroid2) / Math.sqrt(4)\n\n // 4. Compare spectral rolloff\n const rolloff1 = [features1.spectralRolloff.lightness, features1.spectralRolloff.a, features1.spectralRolloff.b, features1.spectralRolloff.chroma]\n const rolloff2 = [features2.spectralRolloff.lightness, features2.spectralRolloff.a, features2.spectralRolloff.b, features2.spectralRolloff.chroma]\n const rolloffSim = 1 - euclideanDistance(rolloff1, rolloff2) / Math.sqrt(4)\n\n // 5. Compare full spectra using correlation (most important!)\n const chromaCorr = pearsonCorrelation(features1.chromaMags, features2.chromaMags)\n const aCorr = pearsonCorrelation(features1.aMags, features2.aMags)\n const bCorr = pearsonCorrelation(features1.bMags, features2.bMags)\n const lightnessCorr = pearsonCorrelation(features1.lightnessMags, features2.lightnessMags)\n\n // Average spectrum correlation\n const spectrumCorr = (chromaCorr + aCorr + bCorr + lightnessCorr) / 4\n\n // Weighted combination for overall similarity\n // Spectrum correlation is most important (50%)\n // Energy distribution captures rhythm (20%)\n // Smoothness captures transition style (15%)\n // Centroid/rolloff capture overall shape (15%)\n const structural = spectrumCorr * 0.5 + energySim * 0.2 + smoothnessSim * 0.15 + ((centroidSim + rolloffSim) / 2) * 0.15\n\n // Perceptual similarity (centroid-based, focuses on color distribution)\n const perceptual = centroidSim * 0.4 + rolloffSim * 0.3 + energySim * 0.3\n\n // Overall similarity (blend structural and perceptual)\n const overall = structural * 0.7 + perceptual * 0.3\n\n // Interpretation\n let interpretation: string\n\n if (overall > 0.9) {\n interpretation = 'Nearly Identical Structure'\n } else if (overall > 0.75) {\n interpretation = 'Very Similar Structure'\n } else if (overall > 0.6) {\n interpretation = 'Similar Structure'\n } else if (overall > 0.45) {\n interpretation = 'Somewhat Similar'\n } else if (overall > 0.3) {\n interpretation = 'Somewhat Different'\n } else {\n interpretation = 'Very Different Structure'\n }\n\n return {\n overall,\n structural,\n perceptual,\n breakdown: {\n smoothnessSimilarity: smoothnessSim,\n complexitySimilarity: complexitySim,\n energyDistributionSimilarity: energySim,\n centroidSimilarity: centroidSim,\n rolloffSimilarity: rolloffSim,\n spectrumCorrelation: spectrumCorr\n },\n interpretation\n }\n}\n","import FFT from 'fft.js'\nimport { Vector3 } from './vector.ts'\nimport { downsamplePalette, resamplePaletteSnap } from './resample.ts'\n\nexport interface SpectralProcessingOptions {\n // EQ (original)\n eq?: { lowGain: number; midGain: number; highGain: number }\n dc?: number\n\n // Compression/Limiting\n compression?: {\n threshold: number // threshold for compression (0-1)\n ratio: number // compression ratio (1 = none, 10 = heavy)\n attack: number // attack coefficient (0-1, higher = faster)\n release: number // release coefficient (0-1, higher = faster)\n }\n\n // Exciter/Saturation (harmonic generation)\n exciter?: {\n amount: number // how much harmonics to add (0-1)\n frequency: number // which freq band to excite (0-1, normalized)\n }\n\n // Phase vocoder effects\n phaseShift?: number // circular phase rotation in degrees\n\n // Reverb (via convolution)\n reverb?: {\n decay: number // decay time (0-1)\n mix: number // wet/dry (0-1)\n }\n\n // Stereo width (for a/b channel separation)\n stereoWidth?: number // 0 = mono, 1 = normal, >1 = widened\n\n // Distortion/waveshaping\n distortion?: {\n amount: number // drive (0-1)\n type: 'soft' | 'hard' | 'tube'\n }\n\n // Comb Filtering\n combFilter?: {\n frequency: number // comb frequency (0-1, normalized)\n feedback: number // feedback amount (0-1)\n mix: number // wet/dry (0-1)\n }\n\n // Spectral Blur\n spectralBlur?: {\n amount: number // blur radius in bins (0-10)\n }\n\n // Spectral Gating\n spectralGate?: {\n threshold: number // gate threshold (0-1)\n ratio: number // attenuation below threshold (0-1)\n }\n\n // Partial Extraction (keep only harmonic-related bins)\n partialExtraction?: {\n fundamental: number // fundamental frequency (0-1, normalized)\n harmonics: number // how many harmonics to keep (1-16)\n bandwidth: number // how wide each harmonic band is (0-1)\n }\n\n // Lightness processing\n lightnessSmoothing?: number // gradient smoothing amount (0-1)\n}\n\nexport function applySpectralProcessing(labColors: Vector3[], options: SpectralProcessingOptions = {}) {\n const N = 256\n const ff = new FFT(N)\n\n // Resample and convert\n const resampledLabs = resamplePaletteSnap(labColors, N)\n\n // Extract channels\n const L = resampledLabs.map((c) => c[0])\n const a = resampledLabs.map((c) => c[1])\n const b = resampledLabs.map((c) => c[2])\n\n // Process lightness with gradient smoothing\n let resultL = [...L]\n\n if (options.lightnessSmoothing) {\n resultL = applyLightnessSmoothing(resultL, labColors.length * options.lightnessSmoothing)\n }\n\n // Process a and b channels\n let resultA = [...a]\n let resultB = [...b]\n\n // Apply distortion (pre-processing, in time domain)\n if (options.distortion) {\n resultA = applyDistortion(resultA, options.distortion)\n resultB = applyDistortion(resultB, options.distortion)\n }\n\n // Apply stereo width\n if (options.stereoWidth !== undefined) {\n const mid = resultA.map((v, i) => (v + resultB[i]) / 2)\n const side = resultA.map((v, i) => (v - resultB[i]) / 2)\n const width = options.stereoWidth\n resultA = mid.map((m, i) => m + side[i] * width)\n resultB = mid.map((m, i) => m - side[i] * width)\n }\n\n // Frequency domain processing\n const rL = processChannelSpectral(ff, resultL, options, true)\n const rA = processChannelSpectral(ff, resultA, options)\n const rB = processChannelSpectral(ff, resultB, options)\n\n resultA = rA.result\n resultB = rB.result\n\n // Apply compression (post-processing, in time domain)\n if (options.compression) {\n resultA = applyCompression(resultA, options.compression)\n resultB = applyCompression(resultB, options.compression)\n }\n\n // Rebuild and clamp\n const processed: Vector3[] = []\n for (let i = 0; i < N; i++) {\n const lab: [number, number, number] = [\n clamp(resultL[i], 0, 1), // L range 0-1\n clamp(resultA[i], -0.4, 0.4), // Oklab a/b typical range\n clamp(resultB[i], -0.4, 0.4)\n ]\n\n processed.push(lab)\n }\n\n const downsampled = downsamplePalette(processed, labColors.length)\n\n return {\n colors: downsampled,\n resampled: resampledLabs,\n processed,\n spectrum: [rL.spectrum.filter((_, i) => i % 2 === 0 && i > 0 && i <= N), rA.spectrum.filter((_, i) => i % 2 === 0 && i > 0 && i <= N), rB.spectrum.filter((_, i) => i % 2 === 0 && i > 0 && i <= N)]\n }\n}\n\nfunction processChannelSpectral(ff: FFT, signal: number[], options: SpectralProcessingOptions, skip: boolean = false) {\n const N = ff.size\n const spectrum = ff.createComplexArray()\n\n ff.realTransform(spectrum, signal)\n\n const half = N / 2\n\n if (!skip) {\n if (options.dc) {\n spectrum[0] *= options.dc\n spectrum[1] *= options.dc\n }\n\n // Apply EQ\n if (options.eq) {\n applyEQ(spectrum, options.eq)\n }\n\n // Apply exciter (harmonic generation)\n if (options.exciter) {\n applyExciter(spectrum, options.exciter)\n }\n\n // Apply phase shift\n if (options.phaseShift) {\n applyPhaseShift(spectrum, options.phaseShift)\n }\n\n // Apply reverb (simplified via spectral smearing)\n if (options.reverb) {\n applyReverb(spectrum, half, options.reverb)\n }\n\n // Apply comb filter\n if (options.combFilter) {\n applyCombFilter(spectrum, options.combFilter)\n }\n\n // Apply spectral blur\n if (options.spectralBlur) {\n applySpectralBlur(spectrum, options.spectralBlur)\n }\n\n // Apply spectral gate\n if (options.spectralGate) {\n applySpectralGate(spectrum, options.spectralGate)\n }\n\n // Apply partial extraction\n if (options.partialExtraction) {\n applyPartialExtraction(spectrum, options.partialExtraction)\n }\n }\n\n // Inverse transform\n ff.completeSpectrum(spectrum)\n const outputComplex = ff.createComplexArray()\n ff.inverseTransform(outputComplex, spectrum)\n\n // Extract real parts (no normalization needed - your FFT library handles it)\n const result: number[] = []\n\n for (let i = 0; i < N; i++) {\n result[i] = outputComplex[i * 2]\n }\n\n return { result, spectrum }\n}\n\nfunction applyEQ(spectrum: number[], eq: { lowGain: number; midGain: number; highGain: number }) {\n const half = spectrum.length / 2\n\n // Octave-based cutoffs (each band is 2x the frequency of previous)\n const lowCutoff = Math.pow(2, 3) * 2 // 2^3 = 8 bins\n const highCutoff = Math.pow(2, 5) * 2 // 2^5 = 32 bins\n\n for (let idx = 2; idx < half; idx += 2) {\n // Skip DC, process all\n let gain = 1.0\n\n if (idx < lowCutoff) {\n gain = eq.lowGain\n } else if (idx < highCutoff) {\n gain = eq.midGain\n } else {\n gain = eq.highGain\n }\n\n // Optional: boost high frequencies more\n const freqScale = 1 + Math.log2(idx / half + 1) * 2\n gain *= freqScale\n\n spectrum[idx] *= gain\n spectrum[idx + 1] *= gain\n }\n}\n\nfunction applyExciter(spectrum: number[], exciter: { amount: number; frequency: number }) {\n const half = spectrum.length / 2\n\n // Generate harmonics by duplicating energy at higher frequencies\n const targetBin = Math.floor(1 + (half / 2) * exciter.frequency)\n const harmonicStart = Math.max(2, targetBin * 2)\n\n for (let idx = harmonicStart; idx < half; idx += 2) {\n const sourceK = Math.floor(idx / 4) * 2\n const srcIdx = sourceK * 2\n\n // Optional: boost high frequencies more\n const freqScale = 1 + Math.log2(idx / half + 1) * 2\n\n spectrum[idx] += spectrum[srcIdx] * exciter.amount * 0.5 * freqScale\n spectrum[idx + 1] += spectrum[srcIdx + 1] * exciter.amount * 0.5 * freqScale\n }\n}\n\nfunction applyPhaseShift(spectrum: number[], degrees: number) {\n const radians = (degrees * Math.PI) / 180\n const half = spectrum.length / 2\n\n for (let idx = 2; idx <= half; idx += 2) {\n const re = spectrum[idx]\n const im = spectrum[idx + 1]\n\n // Rotate by angle in complex plane\n const mag = Math.sqrt(re * re + im * im)\n const phase = Math.atan2(im, re) + radians\n\n spectrum[idx] = mag * Math.cos(phase)\n spectrum[idx + 1] = mag * Math.sin(phase)\n }\n}\n\nfunction applyReverb(spectrum: number[], half: number, reverb: { decay: number; mix: number }) {\n // Simplified reverb via spectral smoothing (low-pass on magnitude)\n const drySpectrum = new Float64Array(spectrum)\n\n for (let k = 1; k < half; k++) {\n const idx = k * 2\n const prevIdx = (k - 1) * 2\n const nextIdx = Math.min(k + 1, half) * 2\n\n // Smooth magnitude, preserve phase\n const re = spectrum[idx]\n const im = spectrum[idx + 1]\n const phase = Math.atan2(im, re)\n\n const prevMag = Math.sqrt(spectrum[prevIdx] ** 2 + spectrum[prevIdx + 1] ** 2)\n const currMag = Math.sqrt(re * re + im * im)\n const nextMag = Math.sqrt(spectrum[nextIdx] ** 2 + spectrum[nextIdx + 1] ** 2)\n\n const smoothMag = ((prevMag + currMag * 2 + nextMag) / 4) * reverb.decay\n\n const wetRe = smoothMag * Math.cos(phase)\n const wetIm = smoothMag * Math.sin(phase)\n\n spectrum[idx] = drySpectrum[idx] * (1 - reverb.mix) + wetRe * reverb.mix\n spectrum[idx + 1] = drySpectrum[idx + 1] * (1 - reverb.mix) + wetIm * reverb.mix\n }\n}\n\nfunction applyDistortion(signal: number[], dist: { amount: number; type: 'soft' | 'hard' | 'tube' }): number[] {\n const drive = 1 + dist.amount * 9\n\n return signal.map((x) => {\n const driven = x * drive\n\n switch (dist.type) {\n case 'soft':\n // Cubic soft clipping\n return driven / (1 + Math.abs(driven))\n\n case 'hard':\n // Hard clipping\n return Math.max(-1, Math.min(1, driven))\n\n case 'tube':\n // Tube-like asymmetric\n return driven > 0 ? driven / (1 + driven * 0.5) : driven / (1 - driven * 0.3)\n\n default:\n return driven\n }\n })\n}\n\nfunction applyCompression(signal: number[], comp: { threshold: number; ratio: number; attack: number; release: number }): number[] {\n let envelope = 0\n const result = []\n\n for (const sample of signal) {\n const absSample = Math.abs(sample)\n\n // Envelope follower\n if (absSample > envelope) {\n envelope += (absSample - envelope) * comp.attack\n } else {\n envelope += (absSample - envelope) * comp.release\n }\n\n // Compression\n let gain = 1\n if (envelope > comp.threshold) {\n const over = envelope - comp.threshold\n const compressed = over / comp.ratio\n gain = (comp.threshold + compressed) / envelope\n }\n\n result.push(sample * gain)\n }\n\n return result\n}\n\nfunction clamp(val: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, val))\n}\n\nfunction applyCombFilter(spectrum: number[], comb: { frequency: number; feedback: number; mix: number }) {\n const half = spectrum.length / 2 / 2\n\n // Comb filter creates notches at regular intervals\n const fundamentalBin = Math.floor(half * comb.frequency)\n if (fundamentalBin === 0) {\n return\n }\n\n const drySpectrum = new Float64Array(spectrum)\n\n // Create notches at multiples of fundamental\n for (let k = 1; k < half; k++) {\n const idx = k * 2\n\n // Calculate distance to nearest comb tooth\n const toothIndex = Math.round(k / fundamentalBin)\n const nearestTooth = toothIndex * fundamentalBin\n const distance = Math.abs(k - nearestTooth)\n const normalizedDistance = distance / fundamentalBin\n\n // Attenuation curve (inverse of feedback at comb teeth)\n const attenuation = 1 - comb.feedback * Math.exp(-normalizedDistance * 5)\n\n spectrum[idx] = drySpectrum[idx] * (1 - comb.mix) + drySpectrum[idx] * attenuation * comb.mix\n spectrum[idx + 1] = drySpectrum[idx + 1] * (1 - comb.mix) + drySpectrum[idx + 1] * attenuation * comb.mix\n }\n}\n\nfunction applySpectralBlur(spectrum: number[], blur: { amount: number }) {\n const half = spectrum.length / 2\n\n if (blur.amount === 0) {\n return\n }\n\n const radius = Math.max(1, Math.round(blur.amount))\n const blurred = new Float64Array(spectrum)\n\n // Gaussian-like blur using box filter approximation\n for (let idx = 2; idx < half; idx += 2) {\n let sumRe = 0\n let sumIm = 0\n let count = 0\n\n for (let offset = -radius; offset <= radius; offset++) {\n const nIdx = idx + offset\n\n if (nIdx >= 2 && nIdx < half) {\n sumRe += spectrum[nIdx]\n sumIm += spectrum[nIdx + 1]\n count++\n }\n }\n\n blurred[idx] = sumRe / count\n blurred[idx + 1] = sumIm / count\n }\n\n // Copy back\n for (let i = 2; i < half; i++) {\n spectrum[i] = blurred[i]\n }\n}\n\nfunction applySpectralGate(spectrum: number[], gate: { threshold: number; ratio: number }) {\n const half = spectrum.length / 2 / 2\n\n // Calculate overall magnitude threshold\n let maxMag = 0\n\n for (let k = 1; k < half; k++) {\n const idx = k * 2\n const mag = Math.sqrt(spectrum[idx] ** 2 + spectrum[idx + 1] ** 2)\n maxMag = Math.max(maxMag, mag)\n }\n\n const threshold = maxMag * gate.threshold\n\n for (let k = 1; k < half; k++) {\n const idx = k * 2\n const re = spectrum[idx]\n const im = spectrum[idx + 1]\n const mag = Math.sqrt(re * re + im * im)\n\n if (mag < threshold) {\n // Attenuate below threshold\n const attenuation = gate.ratio\n spectrum[idx] *= attenuation\n spectrum[idx + 1] *= attenuation\n }\n }\n}\n\nfunction applyPartialExtraction(spectrum: number[], partial: { fundamental: number; harmonics: number; bandwidth: number }) {\n const half = spectrum.length / 2 / 2\n const fundamentalBin = Math.floor(half * partial.fundamental)\n\n if (fundamentalBin === 0) {\n return\n }\n\n const bandwidthBins = Math.max(1, Math.floor(half * partial.bandwidth))\n\n // Create a mask for which bins to keep\n const keep = Array.from({ length: half + 1 }).fill(false)\n\n // Keep DC\n keep[0] = true\n\n // Keep fundamental and harmonics\n for (let h = 1; h <= partial.harmonics; h++) {\n const harmonicBin = fundamentalBin * h\n if (harmonicBin > half) {\n break\n }\n\n // Keep bins around this harmonic\n for (let offset = -bandwidthBins; offset <= bandwidthBins; offset++) {\n const bin = harmonicBin + offset\n if (bin >= 0 && bin <= half) {\n keep[bin] = true\n }\n }\n }\n\n // Zero out bins not in the keep list\n for (let k = 0; k <= half; k++) {\n if (!keep[k]) {\n const idx = k * 2\n spectrum[idx] = 0\n spectrum[idx + 1] = 0\n }\n\n // Mirror\n if (k > 0 && k < half) {\n const N = half * 2\n const negIdx = (N - k) * 2\n if (keep[k]) {\n spectrum[negIdx] = spectrum[k * 2]\n spectrum[negIdx + 1] = -spectrum[k * 2 + 1]\n } else {\n spectrum[negIdx] = 0\n spectrum[negIdx + 1] = 0\n }\n }\n }\n}\n\nfunction applyLightnessSmoothing(lightness: number[], amount: number): number[] {\n if (amount === 0) {\n return lightness\n }\n\n // Simple gaussian-like smoothing\n const result = [...lightness]\n const passes = Math.max(1, Math.round(amount))\n\n for (let pass = 0; pass < passes; pass++) {\n const temp = [...result]\n for (let i = 1; i < result.length - 1; i++) {\n // 3-point average with center weighting\n temp[i] = (result[i - 1] + result[i] * 2 + result[i + 1]) / 4\n }\n result.splice(0, result.length, ...temp)\n }\n\n return result\n}\n","import { cosineSimilarity, MASTER_LCH } from './index.ts'\nimport { compareColors } from './vector.ts'\nimport { Fingerprint, metricsFftFingerprint } from './metrics-fft.ts'\n// import { pearsonCorrelation } from './similarity.ts'\n\nconst SIMILARITY = cosineSimilarity\n\nexport interface Trained {\n mid: string\n colors: number\n fingerprint: number[]\n}\n\nfunction fix(fingerprint: number[]) {\n return fingerprint\n}\n\nexport function getAuto(colors: string[], trained: Trained[]) {\n const lchColors = colors.map(MASTER_LCH).sort(compareColors)\n\n let selected: Trained[] = []\n let selected2: Trained[] = []\n let num = colors.length\n\n while (!selected.length && num > 1) {\n selected = trained.filter((t) => t.colors === num)\n num--\n }\n\n while (!selected2.length && num > 1) {\n selected2 = trained.filter((t) => t.colors === num)\n num--\n }\n\n let { fingerprint } = metricsFftFingerprint(lchColors).analysis\n\n fingerprint = <Fingerprint>fix(<Fingerprint>fingerprint)\n\n selected.sort((a, b) => (b.fingerprint && fingerprint ? SIMILARITY(fingerprint, fix(b.fingerprint)) : 0) - (a.fingerprint && fingerprint ? SIMILARITY(fingerprint, fix(a.fingerprint)) : 0))\n selected2.sort((a, b) => (b.fingerprint && fingerprint ? SIMILARITY(fingerprint, fix(b.fingerprint)) : 0) - (a.fingerprint && fingerprint ? SIMILARITY(fingerprint, fix(a.fingerprint)) : 0))\n\n let noDb = [...selected, ...selected2]\n\n if (colors.length < 64) {\n noDb = noDb.filter((x) => !x.mid.startsWith('RAW'))\n }\n\n if (colors.length < 32) {\n noDb = noDb.filter((x) => !x.mid.startsWith('RAMPH'))\n }\n\n if (colors.length < 6) {\n noDb = noDb.filter((x) => !x.mid.startsWith('SPI'))\n }\n\n if (colors.length < 9) {\n noDb = noDb.filter((x) => !x.mid.startsWith('CYL'))\n }\n\n // if (colors.length < 13) {\n // const noDB = selected\n // .filter(x => !x.mid.startsWith('DBSCAN'))\n // .filter(x => !x.mid.startsWith('RAW'))\n // .filter(x => !x.mid.startsWith('CL'))\n // .filter(x => !x.mid.startsWith('SPI'))\n // .filter(x => !x.mid.startsWith('KM'))\n // .filter(x => !x.mid.startsWith('CYL'))\n //\n // if (noDB.length) {\n // return noDB[0].mid\n // }\n // } else if (colors.length < 17) {\n // const noDB = selected\n // .filter(x => !x.mid.startsWith('DBSCAN'))\n // .filter(x => !x.mid.startsWith('RAW'))\n // .filter(x => !x.mid.startsWith('CL'))\n //\n // if (noDB.length) {\n // return noDB[0].mid\n // }\n // }\n\n if (noDb.length) {\n return noDb[0].mid\n }\n\n if (selected.length) {\n return selected[0].mid\n }\n\n return selected2[0].mid\n}\n","import { getAuto } from './auto.ts'\nimport { SORTING_METHODS } from './sorting-methods'\n\nexport function auto (colors: string[], DATA: any) {\n const mid = getAuto(colors, DATA)\n\n return SORTING_METHODS.find(x => x.mid === mid)?.fn(colors)\n}\n","import { round3 } from './statistics.ts'\n\nexport { SORTING_METHODS } from './sorting-methods/index.ts'\nexport type { SortingMethod } from './sorting-methods/index.ts'\nexport { metrics } from './metrics.js'\nexport { detectPaletteType } from './type-detect.ts'\nexport type { PaletteType } from './type-detect.ts'\n\nexport { metricsEx, getMetricsExRange, metricsExQuality, metricsExQualitySum } from './metrics-extended.ts'\nexport type { MetricsEx } from './metrics-extended.ts'\nexport { flatRgb, oklab, oklch, gl, lch, lab, normalizeLab, oklch2hex, oklab2hex, oklch2oklab } from './color.ts'\n\nexport { randomizer } from './randomizer.ts'\n\nexport { metricsFftFingerprint } from './metrics-fft.ts'\nexport { cosineSimilarity } from './similarity.ts'\nexport { featuresLab } from './metrics-spectral.ts'\nexport { compareSpectralFeatures } from './metrics-spectral-similarity.ts'\n\nexport type { Fingerprint } from './metrics-fft.ts'\nexport type { StatsLabEx, MagnitudesLab } from './metrics-spectral.ts'\n\nexport { applySpectralProcessing } from './spectral-edit.ts'\n\nexport { fingerprintAverage, fingerprintMedian, fingerprintAverageWithoutOutliers } from './similarity.ts'\nexport { compareColors } from './vector.ts'\nexport { getAuto } from './auto.ts'\n\nimport { lch } from './color.ts'\n\nexport const MASTER_LCH = lch\nexport const MASTER_ROUND = round3\n\nexport { auto } from './auto-sort.ts'\n"],"names":["variance","arr","m","mean","x","a","b","energy","magnitudes","sum","highFreqRatio","cutoff","highFreqEnergy","totalEnergy","round3","interpolateNaNs","signal","result","i","prevIdx","nextIdx","prevVal","nextVal","span","offset","min","max","limit","low","high","clip_rgb","rgb","classToType","name","type","obj","unpack","args","keyOrder","k","last","l","PI","rnd2","rnd3","TWOPI","PITHIRD","DEG2RAD","RAD2DEG","reverse3","input","Color","me","mode","autodetect","_input","chk","version","chroma","w3cx11","RE_HEX","RE_HEXA","hex2rgb","hex","u","r","g","round","rgb2hex","str","hxa","n","h","rest","mutate","labConstants","ILLUMINANTS","setLabWhitePoint","ill","getLabWhitePoint","lab2rgb","L","y","z","lab2xyz","b_","xyz2rgb","kE","kK","kKE","Xn","Yn","Zn","LAB_CONSTANTS","fy","fx","fz","fx3","fz3","xr","yr","zr","compand","linear","sign","MtxAdaptMa","MtxAdaptMaI","MtxXYZ2RGB","RefWhiteRGB","As","Bs","Cs","Ad","Bd","Cd","X1","Y1","Z1","X2","Y2","Z2","rgb2lab","rgb2xyz","xyz2lab","gammaAdjustSRGB","companded","MtxRGB2XYZ","X","Y","Z","amount","lab","mc","channel","src","pow","EPS","MAX_ITER","lum","cur_lum","max_iter","test","mid","lm","rgb2luminance","luminance_x","index","mix","col1","col2","f","interpolator","sin","cos","lch2lab","c","lch2rgb","hcl2rgb","hcl","sqrt","atan2","lab2lch","rgb2lch","lch","value","out","xyz0","xyz1","lrgb","x1","y1","z1","x2","y2","z2","interpolate_hsx","hue0","hue1","sat0","sat1","lbv0","lbv1","sat","hue","lbv","dh","num2rgb","num","rgb2num","c1","c2","floor","hcg2rgb","_g","_c","p","q","t","v","rgb2hcg","minRgb","maxRgb","delta","hcg","hsi2rgb","s","acos","rgb2hsi","min_","hsi","hsl2rgb","t3","t2","t1","h_","rgb2hsl","hsl","hsv2rgb","max_","rgb2hsv","hsv","multiplyMatrices","A","B","B_cols","_","product","row","col","oklab2rgb","OKLab_to_XYZ","OKLab","LMStoXYZ","OKLabtoLMS","LMSnl","rgb2oklab","xyz","XYZ_to_OKLab","XYZ","XYZtoLMS","LMStoOKLab","LMS","oklab","oklch","average","colors","weights","w","_average_lrgb","first","cnt","dx","dy","alpha","ci","xyz2","scale","_mode","_nacol","_spread","_positions","_domain","_pos","_padding","_classes","_colors","_out","_min","_max","_correctLightness","_colorCache","_useCache","_gamma","setColors","resetCache","getClass","tMapLightness","tMapDomain","getColor","val","bypassMap","classes","d","domain","tOut","tBreaks","_m","_o","L0","L1","pol","L_actual","L_ideal","L_diff","t0","numColors","dm","dd","__range__","samples","end","asc","left","right","inclusive","range","ascending","binom_row","newrow","j","bezier","I","lab0","lab1","lab2","lab3","labs","el","rnd","rgba","blend","bottom","top","blend_f","c0","each","normal","multiply","darken","lighten","screen","overlay","burn","dodge","cubehelix","start","rotations","gamma","lightness","dl","fract","amp","cos_a","sin_a","digits","random","rng","code","log","abs","analyze","data","key","limits","values","min_log","max_log","pb","pr","cluster","assignments","clusterSizes","repeat","nb_iters","centroids","mindist","best","dist","newCentroids","kClusters","tmpKMeansBreaks","contrast","l1","l2","W_offset","P_in","P_out","R_scale","B_threshold","B_exp","contrastAPCA","text","bg","l_text","l_bg","Y_text","Y_bg","S_norm","S_rev","C","exp","deltaE$1","Kl","Kc","Kh","rad2deg","rad","deg2rad","deg","a1","b1","L2","a2","b2","avgL","C1","C2","avgC","G","a1p","a2p","C1p","C2p","avgCp","arctan1","arctan2","h1p","h2p","avgHp","T","deltaHp","deltaL","deltaCp","sl","sc","sh","deltaTheta","Rt","distance$1","sum_sq","valid","scales","colorbrewer","colorbrewerTypes","typeMap","colorbrewerProxy","target","prop","lower","cmyk2rgb","rgb2cmyk","hsl2css","hsla","lab2css","laba","lch2css","lcha","oklab2css","rgb2oklch","oklch2css","rgb2css","prevWhitePoint","cssColor","oklch2rgb","INT_OR_PCT","FLOAT_OR_PCT","PCT","RE_S","SEP","COMMA","ANLGE","ALPHA","RE_RGB","RE_RGB_LEGACY","RE_RGBA_LEGACY","RE_HSL","RE_HSL_LEGACY","RE_HSLA_LEGACY","RE_LAB","RE_LCH","RE_OKLAB","RE_OKLCH","roundRGB","percentToAbsolute","pct","signed","noneToValue","noneValue","css2rgb","css","wp","gl","temperature2rgb","kelvin","temp","rgb2temperature","minTemp","maxTemp","eps","brewer","deltaE","distance","parseNumber","color","len","named","parseNamed","parseHex","match","per","num_per","rgb_num_old","rgb_per_old","parseRgbLegacy","res","prepare","parse","converter","target_mode","converters","modes","parsers","colorProfiles","identity","useMode","definition","parser","useParser","getMode","IdentStartCodePoint","IdentCodePoint","Tok","_i","is_num","chars","ch","ch1","is_ident","huenits","id","ident","identlike","tokenize","tokens","parseColorSyntax","token","coords","consumeCoords","channels","ii","includeHue","parseModernSyntax","parsed","parseRgb","parseTransparent","lerp","get_classes","interpolatorLinear","cls","idx","pair","fixupAlpha","some_defined","fn","convertRgbToLrgb","convertLrgbToRgb","normalizeHue","hues","normalized","acc","curr","fixupHueShorter","differenceHueSaturation","std","smp","std_h","smp_h","dH","differenceHueChroma","averageAngle","angle","convertLabToLch","convertLchToLab","D50","convertHslToRgb","m1","m2","convertRgbToHsl","M","hueToDeg","unit","hsl_old","parseHslLegacy","parseHsl","convertHsvToRgb","convertRgbToHsv","e","convertLabToXyz50","convertXyz50ToRgb","convertLabToRgb","convertRgbToXyz50","convertXyz50ToLab","f0","f1","f2","convertRgbToLab","parseLab","parseLch","convertLrgbToOklab","S","convertRgbToOklab","convertOklabToLrgb","convertOklabToRgb","toe","k_3","toe_inv","compute_max_saturation","k0","k1","k2","k3","k4","wl","wm","ws","k_l","k_m","k_s","l_","m_","s_","l_dS","m_dS","s_dS","l_dS2","m_dS2","s_dS2","find_cusp","S_cusp","L_cusp","C_cusp","find_gamut_intersection","cusp","dL","dC","l_dt","m_dt","s_dt","ldt","mdt","sdt","ldt2","mdt2","sdt2","r1","r2","u_r","t_r","g1","g2","u_g","t_g","u_b","t_b","get_ST_max","a_","get_Cs","C_max","ST_max","S_mid","T_mid","C_a","C_b","C_mid","convertOklabToOkhsl","ret","C_0","k_0","k_1","k_2","convertOkhslToOklab","modeOkhsl","modeHsl","convertOklabToOkhsv","S_max","S_0","L_v","C_v","L_vt","C_vt","rgb_scale","scale_L","convertOkhsvToOklab","L_new","modeOkhsv","modeHsv","parseOklab","parseOklch","clamp","fixup","serializeHex","formatHex","modeRgb","cuLab","modeLab","cuLch","modeLch","cuHsl","cuHsv","cuOkhsl","cuOklab","modeOklab","cuOkhsv","cuOklch","modeOklch","oklch2hex","oklab2hex","oklch2oklab","gl2luminance","r_","g_","memoize","map","hexToRgb","cmyk","gl2cmyk","c_","okhsl","okhsv","nonH","H","luminance","compareLumLCH","lA","lB","lchA","lchB","flatRgb","hexes","normalizeLab","intLab","OK2_SCALE","distanceOk2","da","db","convertColors","model","dz","distance4","dw","distanceRadial0","distanceRadial2","normalize","subtract","dot","centroid","compareColors","compareColorsH","compareColors210","CACHE","createDistanceCache","distanceFn","ds","cache","modelDistance","methodRunner","deltaMethod_","distanceMethod_","vectorMap","distanceMethodObj","distanceMethod","toColor","deltaMethodObj","deltaMethod","vs","toColors","vectors","vector","helper","hilbertIndex","mask","px","py","pz","hilbertPointToIndex","sortByHilbertCurve","indexA","indexB","hilbert","preSorted","GeneticAlgorithm","config","genome","fitness","tournament","parent1","parent2","size","child","usedItems","remainingItems","item","remainingIndex","mutated","idx1","idx2","bestScore","score","reversed","newPopulation","childGenome","gen","ind","metrics","totalDistance","angleChanges","prevDirection","distances","direction","dotProd","meanDistance","devDistance","avgAngleChange","maxAngleChange","fitness1D","palette","compare1D","evolve","evolveT","compare","previous","populationSize","generations","fitness3D","oklabColors","compare3D","fitnessA","fitnessB","tolerance","avg","threshold","diff","evolveMulti","tspVectors","improved","d1","covariance","meanVec","cov","principalComponent","iter","newV","sortByPrincipalComponent","pc","projA","projB","oklabStats","adaptiveOklabDistanceFactory","WHAT_A_SIGMA","principal","post","preSort","vec","oklabs","okdist","sortByHslSpiral","h1","s1","h2","s2","spiral","sortByHslCylindrical","colorsWithHsl","spiralParam","cylindrical","randomizer","closest","closestList","list","aa","bb","inlinest","bestAlignment","dir1","dir2","alignment","clusterDistance","linkage","minDist","maxDist","buildDendrogram","clusters","mergeI","mergeJ","merged","traverseDendrogram","node","strategy","leftColors","rightColors","dist1","dist2","sortByHierarchicalClustering","traversal","dendrogram","randomCentroids","assignClusters","updateCentroids","clusterColors","sortByKMeans","maxIterations","newAssignments","clustersWithCentroids","brightnessA","brightnessB","clusterCentroid","sorted","regionQuery","pointIdx","neighbors","point","other","sortByDBSCAN","minPts","visited","noise","queue","neighborIdx","neighborNeighbors","avgA","avgB","remaining","ordered","current","nearest","kMeans","iterations","dbScan","pts","harmonize","options","selectStart","edges","unvisited","minDistance","candidate","harmonizeModel","selectBrightest","brightest","selectDarkest","darkest","harmonizeDelta","relativeDifference","sumL","sumC","sumH","avgH","relativeDifferenceL","relativeDifferenceC","relativeDifferenceH","calculateVariances","lchColors","meanL","meanC","meanH","circularMean","varianceL","varianceC","varianceH","circularVariance","angles","sinSum","cosSum","calculateAdaptiveWeights","variances","total","detectPaletteType","lightnesses","chromas","lightnessRange","chromaRange","hueSpread","lchColorsHueSpread","calculateHueSpread","maxGap","gap","wrapGap","graphDeltaE","graph","sortedColors","visitedColors","traverse","neighbor","graphWeighted","graphWeightedPlusPlus","graphWeightedAdaptive1","graphWeightedAdaptive2","calculateScore","from","to","momentumWeight","momentumBonus","calculateScoreDeltaE","momentumBidiSort","scoring","prevDirectionStart","prevDirectionEnd","candidates","scoreStart","scoreEnd","minScore","momentumClosestOklab","momentumClosestBestOklab","momentumClosestBestDeltaEOklab","de","momentumInlinestOklab","momentumInlinestDeltaEOklab","momentumInlinestDeltaEPlusOklab","sortColorsIntoHueRamps","hueBuckets","achromaticThreshold","achromatic","chromatic","al","bl","bucketSize","buckets","bucketIndex","bucket","ac","bc","chromaDiff","sortedChromatic","detectHueClusters","minGapDegrees","gaps","next","splitPoints","splitIndex","sortColorsIntoHueRampsAdaptive","sortStrategy","hueDiff","lightDiff","colorDistance","hueDistance","lightnessWeight","chromaWeight","hueWeight","sortColorsByNearestNeighbor","startIdx","maxScore","nearestIdx","sortColorsByWeightedOKLCH","getChromaTier","tierA","tierB","rotateHue","hueA","hueB","sortColorsLikeFixture","aIsNeutral","bIsNeutral","getHueSortKey","keyA","keyB","getMajorBand","bandA","bandB","chromaTierA","chromaTierB","sortColorsByHueRamps","aAchro","bAchro","hA","hB","getHueZone","zoneA","zoneB","getChromaStratum","stratumA","stratumB","chromaOrder","sortByMomentumMimicry","getTrajectoryScore","hueNorm","chromaNorm","lightNorm","scoreA","scoreB","sortColorsByHueRamps2","hueZoneSize","hueRotation","sortMultiRampPalette2","numRamps","sortedByLightness","ramps","bestCost","bestI","prev","cost","hp","zaH","estimateNumRamps","binCount","bins","bin","peaks","inValley","ramp","rampa","rampb","rampc","rampd","rampe","rampf","rampg","zone","rotation","order","ramph","rampi","raw","METHODS","MODELS","DIFFS","SORTING_METHODS_RAW","getCombinationsAsArrays","params","combo","SORTING_METHODS","combinations","combination","BENCH","metricsEx","totalCurveDistance","curveDistances","extendedVectors","lChanges","cChanges","hChanges","curveDist","curveLengthBetween","H1","H2","hDiff","meanCurveDistance","devCurveDistance","lchAvgChange","lchMaxChange","lMean","cMean","hMean","lchDeviation","perceptualUniformity","curveUniformity","curveRatio","harmonicScore","harmonicCurveScore","catmullRom","p0","p1","p2","p3","length","prevPoint","dsc","getMetricsExRange","interpolate","interpolateLch","metricsExQuality","metricsExQualitySum","LA","CA","HA","LM","CM","HM","LD","CD","HD","cosineSimilarity","dotProduct","magA","magB","euclideanDistance","gaussianSimilarity","sigma","pearsonCorrelation","meanA","meanB","numerator","sumSqA","sumSqB","diffA","diffB","denominator","fingerprintAverage","fingerprints","fingerprintMedian","fp","fingerprintAverageWithoutOutliers","median","sortedDistances","q1","q3","iqr","filtered","snapInterpolator","step","sample","pos","frac","resamplePaletteSnap","labColors","iL","ia","ib","downsamplePalette","targetSize","resamplePaletteLinear","resampleLinear","FFT","table","power","shift","revShift","fft","complex","storage","spectrum","half","width","outOff","bitrev","off","inv","quarterLen","D","Ar","Ai","Br","Bi","Cr","Ci","Dr","Di","MAr","MAi","tableBr","tableBi","MBr","MBi","tableCr","tableCi","MCr","MCi","tableDr","tableDi","MDr","MDi","T0r","T0i","T1r","T1i","T2r","T2i","T3r","T3i","FAr","FAi","FCr","FCi","FBr","FBi","FDr","FDi","evenR","evenI","oddR","oddI","leftR","leftI","rightR","rightI","step2","step3","halfLen","hquarterLen","ST0r","ST0i","ST1r","ST1i","ST2r","ST2i","ST3r","ST3i","SFAr","SFAi","SFBr","SFBi","SA","SB","numbers","ff","magnitude","chromaticLch","fftLch","normalizedHues","sortedHues","hueDeltas","hueDeltaMags","chromaMags","lightnessMags","magnitudesLab","aChannel","bChannel","aMags","bMags","statsLab","calculate","statsLabsEx","spectralCentroid","calculateCentroid","spectralRolloff","calculateRolloff","spectralSpread","calculateSpread","colorSpectrum","energyRatios","calculateEnergyRatios","smoothness","calculateSmoothness","complexity","calculateComplexity","dominantFrequencies","findDominantFrequencies","featuresLab","resampled","stats","mag","normalizedCentroid","cumEnergy","lowIdx","highIdx","lowFreqEnergy","midFreqEnergy","count","analyzePaletteStructure","chromaVariance","lightnessVariance","largeGaps","avgGap","hueDeltaEnergy","chromaEnergy","lightnessEnergy","hueHighFreqRatio","chromaHighFreqRatio","confidence","fingerprint","metricsFftFingerprint","analysis","spectrumData","compareSpectralFeatures","features1","features2","smoothnessSim","complexitySim","energy1","energy2","energySim","centroid1","centroid2","centroidSim","rolloff1","rolloff2","rolloffSim","chromaCorr","aCorr","bCorr","lightnessCorr","spectrumCorr","structural","perceptual","overall","interpretation","applySpectralProcessing","resampledLabs","resultL","applyLightnessSmoothing","resultA","resultB","applyDistortion","side","rL","processChannelSpectral","rA","rB","applyCompression","processed","skip","N","applyEQ","applyExciter","applyPhaseShift","applyReverb","applyCombFilter","applySpectralBlur","applySpectralGate","applyPartialExtraction","outputComplex","eq","lowCutoff","highCutoff","gain","freqScale","exciter","targetBin","harmonicStart","srcIdx","degrees","radians","re","im","phase","reverb","drySpectrum","prevMag","currMag","nextMag","smoothMag","wetRe","wetIm","drive","driven","comp","envelope","absSample","compressed","comb","fundamentalBin","nearestTooth","normalizedDistance","attenuation","blur","radius","blurred","sumRe","sumIm","nIdx","gate","maxMag","partial","bandwidthBins","keep","harmonicBin","negIdx","passes","pass","SIMILARITY","fix","getAuto","trained","MASTER_LCH","selected","selected2","noDb","auto","DATA","MASTER_ROUND"],"mappings":"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","x_google_ignoreList":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,190]}