{"version":3,"file":"index.cjs","sources":["../../src/index.ts"],"sourcesContent":["/* eslint-disable prefer-const, @typescript-eslint/no-unnecessary-condition */\nimport { Swatch, hslToRgb } from \"@vibrant/color\";\nimport type { Generator } from \"@vibrant/generator\";\nimport type { Palette } from \"@vibrant/color\";\n\nexport interface GeneratorOptions {\n\ttargetDarkLuma: number;\n\tmaxDarkLuma: number;\n\tminLightLuma: number;\n\ttargetLightLuma: number;\n\tminNormalLuma: number;\n\ttargetNormalLuma: number;\n\tmaxNormalLuma: number;\n\ttargetMutesSaturation: number;\n\tmaxMutesSaturation: number;\n\ttargetVibrantSaturation: number;\n\tminVibrantSaturation: number;\n\tweightSaturation: number;\n\tweightLuma: number;\n\tweightPopulation: number;\n}\n\nexport const DefaultOpts: GeneratorOptions = {\n\ttargetDarkLuma: 0.26,\n\tmaxDarkLuma: 0.45,\n\tminLightLuma: 0.55,\n\ttargetLightLuma: 0.74,\n\tminNormalLuma: 0.3,\n\ttargetNormalLuma: 0.5,\n\tmaxNormalLuma: 0.7,\n\ttargetMutesSaturation: 0.3,\n\tmaxMutesSaturation: 0.4,\n\ttargetVibrantSaturation: 1.0,\n\tminVibrantSaturation: 0.35,\n\tweightSaturation: 3,\n\tweightLuma: 6.5,\n\tweightPopulation: 0.5,\n};\n\nfunction _findMaxPopulation(swatches: Array<Swatch>): number {\n\tlet p = 0;\n\n\tswatches.forEach((s) => {\n\t\tp = Math.max(p, s.population);\n\t});\n\n\treturn p;\n}\n\nfunction _isAlreadySelected(palette: Palette, s: Swatch): boolean {\n\treturn (\n\t\tpalette.Vibrant === s ||\n\t\tpalette.DarkVibrant === s ||\n\t\tpalette.LightVibrant === s ||\n\t\tpalette.Muted === s ||\n\t\tpalette.DarkMuted === s ||\n\t\tpalette.LightMuted === s\n\t);\n}\n\nfunction _createComparisonValue(\n\tsaturation: number,\n\ttargetSaturation: number,\n\tluma: number,\n\ttargetLuma: number,\n\tpopulation: number,\n\tmaxPopulation: number,\n\topts: GeneratorOptions,\n): number {\n\tfunction weightedMean(...values: number[]) {\n\t\tlet sum = 0;\n\t\tlet weightSum = 0;\n\t\tfor (let i = 0; i < values.length; i += 2) {\n\t\t\tconst value = values[i];\n\t\t\tconst weight = values[i + 1];\n\t\t\tif (!value || !weight) continue;\n\t\t\tsum += value * weight;\n\t\t\tweightSum += weight;\n\t\t}\n\n\t\treturn sum / weightSum;\n\t}\n\n\tfunction invertDiff(value: number, targetValue: number): number {\n\t\treturn 1 - Math.abs(value - targetValue);\n\t}\n\n\treturn weightedMean(\n\t\tinvertDiff(saturation, targetSaturation),\n\t\topts.weightSaturation,\n\t\tinvertDiff(luma, targetLuma),\n\t\topts.weightLuma,\n\t\tpopulation / maxPopulation,\n\t\topts.weightPopulation,\n\t);\n}\n\nfunction _findColorVariation(\n\tpalette: Palette,\n\tswatches: Array<Swatch>,\n\tmaxPopulation: number,\n\ttargetLuma: number,\n\tminLuma: number,\n\tmaxLuma: number,\n\ttargetSaturation: number,\n\tminSaturation: number,\n\tmaxSaturation: number,\n\topts: GeneratorOptions,\n): Swatch | null {\n\tlet max: Swatch | null = null;\n\tlet maxValue = 0;\n\n\tswatches.forEach((swatch) => {\n\t\tconst [, s, l] = swatch.hsl;\n\n\t\tif (\n\t\t\ts >= minSaturation &&\n\t\t\ts <= maxSaturation &&\n\t\t\tl >= minLuma &&\n\t\t\tl <= maxLuma &&\n\t\t\t!_isAlreadySelected(palette, swatch)\n\t\t) {\n\t\t\tconst value = _createComparisonValue(\n\t\t\t\ts,\n\t\t\t\ttargetSaturation,\n\t\t\t\tl,\n\t\t\t\ttargetLuma,\n\t\t\t\tswatch.population,\n\t\t\t\tmaxPopulation,\n\t\t\t\topts,\n\t\t\t);\n\n\t\t\tif (max === null || value > maxValue) {\n\t\t\t\tmax = swatch;\n\t\t\t\tmaxValue = value;\n\t\t\t}\n\t\t}\n\t});\n\n\treturn max;\n}\n\nfunction _generateVariationColors(\n\tswatches: Array<Swatch>,\n\tmaxPopulation: number,\n\topts: GeneratorOptions,\n): Palette {\n\tconst palette: Palette = {\n\t\tVibrant: null,\n\t\tDarkVibrant: null,\n\t\tLightVibrant: null,\n\t\tMuted: null,\n\t\tDarkMuted: null,\n\t\tLightMuted: null,\n\t};\n\t// mVibrantSwatch = findColor(TARGET_NORMAL_LUMA, MIN_NORMAL_LUMA, MAX_NORMAL_LUMA,\n\t//     TARGET_VIBRANT_SATURATION, MIN_VIBRANT_SATURATION, 1f)\n\tpalette.Vibrant = _findColorVariation(\n\t\tpalette,\n\t\tswatches,\n\t\tmaxPopulation,\n\t\topts.targetNormalLuma,\n\t\topts.minNormalLuma,\n\t\topts.maxNormalLuma,\n\t\topts.targetVibrantSaturation,\n\t\topts.minVibrantSaturation,\n\t\t1,\n\t\topts,\n\t);\n\t// mLightVibrantSwatch = findColor(TARGET_LIGHT_LUMA, MIN_LIGHT_LUMA, 1f,\n\t//     TARGET_VIBRANT_SATURATION, MIN_VIBRANT_SATURATION, 1f)\n\tpalette.LightVibrant = _findColorVariation(\n\t\tpalette,\n\t\tswatches,\n\t\tmaxPopulation,\n\t\topts.targetLightLuma,\n\t\topts.minLightLuma,\n\t\t1,\n\t\topts.targetVibrantSaturation,\n\t\topts.minVibrantSaturation,\n\t\t1,\n\t\topts,\n\t);\n\t// mDarkVibrantSwatch = findColor(TARGET_DARK_LUMA, 0f, MAX_DARK_LUMA,\n\t//     TARGET_VIBRANT_SATURATION, MIN_VIBRANT_SATURATION, 1f)\n\tpalette.DarkVibrant = _findColorVariation(\n\t\tpalette,\n\t\tswatches,\n\t\tmaxPopulation,\n\t\topts.targetDarkLuma,\n\t\t0,\n\t\topts.maxDarkLuma,\n\t\topts.targetVibrantSaturation,\n\t\topts.minVibrantSaturation,\n\t\t1,\n\t\topts,\n\t);\n\t// mMutedSwatch = findColor(TARGET_NORMAL_LUMA, MIN_NORMAL_LUMA, MAX_NORMAL_LUMA,\n\t//     TARGET_MUTED_SATURATION, 0f, MAX_MUTED_SATURATION)\n\tpalette.Muted = _findColorVariation(\n\t\tpalette,\n\t\tswatches,\n\t\tmaxPopulation,\n\t\topts.targetNormalLuma,\n\t\topts.minNormalLuma,\n\t\topts.maxNormalLuma,\n\t\topts.targetMutesSaturation,\n\t\t0,\n\t\topts.maxMutesSaturation,\n\t\topts,\n\t);\n\t// mLightMutedColor = findColor(TARGET_LIGHT_LUMA, MIN_LIGHT_LUMA, 1f,\n\t//     TARGET_MUTED_SATURATION, 0f, MAX_MUTED_SATURATION)\n\tpalette.LightMuted = _findColorVariation(\n\t\tpalette,\n\t\tswatches,\n\t\tmaxPopulation,\n\t\topts.targetLightLuma,\n\t\topts.minLightLuma,\n\t\t1,\n\t\topts.targetMutesSaturation,\n\t\t0,\n\t\topts.maxMutesSaturation,\n\t\topts,\n\t);\n\t// mDarkMutedSwatch = findColor(TARGET_DARK_LUMA, 0f, MAX_DARK_LUMA,\n\t//     TARGET_MUTED_SATURATION, 0f, MAX_MUTED_SATURATION)\n\tpalette.DarkMuted = _findColorVariation(\n\t\tpalette,\n\t\tswatches,\n\t\tmaxPopulation,\n\t\topts.targetDarkLuma,\n\t\t0,\n\t\topts.maxDarkLuma,\n\t\topts.targetMutesSaturation,\n\t\t0,\n\t\topts.maxMutesSaturation,\n\t\topts,\n\t);\n\treturn palette;\n}\n\nfunction _generateEmptySwatches(\n\tpalette: Palette,\n\t_maxPopulation: number,\n\topts: GeneratorOptions,\n): void {\n\tif (!palette.Vibrant && !palette.DarkVibrant && !palette.LightVibrant) {\n\t\tif (!palette.DarkVibrant && palette.DarkMuted) {\n\t\t\tlet [h, s, l] = palette.DarkMuted.hsl;\n\t\t\tl = opts.targetDarkLuma;\n\t\t\tpalette.DarkVibrant = new Swatch(hslToRgb(h, s, l), 0);\n\t\t}\n\t\tif (!palette.LightVibrant && palette.LightMuted) {\n\t\t\tlet [h, s, l] = palette.LightMuted.hsl;\n\t\t\tl = opts.targetDarkLuma;\n\t\t\tpalette.DarkVibrant = new Swatch(hslToRgb(h, s, l), 0);\n\t\t}\n\t}\n\tif (!palette.Vibrant && palette.DarkVibrant) {\n\t\tlet [h, s, l] = palette.DarkVibrant.hsl;\n\t\tl = opts.targetNormalLuma;\n\t\tpalette.Vibrant = new Swatch(hslToRgb(h, s, l), 0);\n\t} else if (!palette.Vibrant && palette.LightVibrant) {\n\t\tlet [h, s, l] = palette.LightVibrant.hsl;\n\t\tl = opts.targetNormalLuma;\n\t\tpalette.Vibrant = new Swatch(hslToRgb(h, s, l), 0);\n\t}\n\tif (!palette.DarkVibrant && palette.Vibrant) {\n\t\tlet [h, s, l] = palette.Vibrant.hsl;\n\t\tl = opts.targetDarkLuma;\n\t\tpalette.DarkVibrant = new Swatch(hslToRgb(h, s, l), 0);\n\t}\n\tif (!palette.LightVibrant && palette.Vibrant) {\n\t\tlet [h, s, l] = palette.Vibrant.hsl;\n\t\tl = opts.targetLightLuma;\n\t\tpalette.LightVibrant = new Swatch(hslToRgb(h, s, l), 0);\n\t}\n\tif (!palette.Muted && palette.Vibrant) {\n\t\tlet [h, s, l] = palette.Vibrant.hsl;\n\t\tl = opts.targetMutesSaturation;\n\t\tpalette.Muted = new Swatch(hslToRgb(h, s, l), 0);\n\t}\n\tif (!palette.DarkMuted && palette.DarkVibrant) {\n\t\tlet [h, s, l] = palette.DarkVibrant.hsl;\n\t\tl = opts.targetMutesSaturation;\n\t\tpalette.DarkMuted = new Swatch(hslToRgb(h, s, l), 0);\n\t}\n\tif (!palette.LightMuted && palette.LightVibrant) {\n\t\tlet [h, s, l] = palette.LightVibrant.hsl;\n\t\tl = opts.targetMutesSaturation;\n\t\tpalette.LightMuted = new Swatch(hslToRgb(h, s, l), 0);\n\t}\n}\n\nexport const DefaultGenerator: Generator = ((\n\tswatches: Array<Swatch>,\n\topts?: GeneratorOptions,\n): Palette => {\n\topts = Object.assign({}, DefaultOpts, opts);\n\tconst maxPopulation = _findMaxPopulation(swatches);\n\n\tconst palette = _generateVariationColors(swatches, maxPopulation, opts);\n\t_generateEmptySwatches(palette, maxPopulation, opts);\n\n\treturn palette;\n}) as never;\n"],"names":["Swatch","hslToRgb"],"mappings":"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"}