svg-colorizer
Version:
Modify colors in SVG elements for web and server-side applications.
1,385 lines (1,367 loc) • 42.1 kB
JavaScript
// lib/core/helpers/getAllElementColors.ts
var getAllElementColors = (elemColors) => {
let allColors = [];
for (const colors of Object.values(elemColors)) {
allColors = [...allColors, ...colors];
}
return allColors;
};
var getAllElementColors_default = getAllElementColors;
// lib/core/helpers/getStyleValueFromLine.ts
var getStyleValueFromLine = (styleAttribute, property) => {
const fillIndex = styleAttribute.indexOf(`${property}:`);
if (fillIndex !== -1) {
const characters = [";", "'", '"'];
const indexes = [];
for (let i = 0; i < characters.length; i++) {
const index = styleAttribute.indexOf(characters[i], fillIndex + 5);
if (index === -1) continue;
indexes.push(index);
}
const endIndex = Math.min(
...indexes
);
if (endIndex !== -1) {
const colorValue = styleAttribute.slice(fillIndex + 5, endIndex).trim();
return colorValue;
}
}
return null;
};
var getStyleValueFromLine_default = getStyleValueFromLine;
// lib/core/helpers/hasCommonElements.ts
var hasCommonElements = (arr1, arr2) => {
for (let i = 0; i < arr1.length; i++) {
if (arr2.indexOf(arr1[i]) !== -1) {
return true;
}
}
return false;
};
var hasCommonElements_default = hasCommonElements;
// lib/core/helpers/environmentals/extractColors/client.ts
var extractColors = (element, onlyParent, asArray) => {
if (!element) {
throw new Error("SVG element should be provided");
}
const colors = {
fill: /* @__PURE__ */ new Set(),
stroke: /* @__PURE__ */ new Set(),
stop: /* @__PURE__ */ new Set()
};
let elements;
if (onlyParent) {
elements = [element];
} else {
elements = element.querySelectorAll("*");
}
for (const element2 of elements) {
const styleAttribute = element2.getAttribute("style");
if (styleAttribute) {
if (styleAttribute.includes("fill")) {
const color = getStyleValueFromLine_default(styleAttribute, "fill");
colors.fill.add(color);
}
if (styleAttribute.includes("stroke")) {
const color = getStyleValueFromLine_default(styleAttribute, "stroke");
colors.stroke.add(color);
}
if (styleAttribute.includes("stop-color")) {
const color = getStyleValueFromLine_default(styleAttribute, "stop-color");
colors.stop.add(color);
}
}
if (element2.hasAttribute("fill")) {
colors.fill.add(element2.getAttribute("fill") || "");
}
if (element2.hasAttribute("stroke")) {
colors.stroke.add(element2.getAttribute("stroke") || "");
}
if (element2.hasAttribute("stop-color")) {
colors.stop.add(element2.getAttribute("stop-color") || "");
}
}
const resultColors = {
fill: [],
stroke: [],
stop: []
};
resultColors.fill = Array.from(colors.fill);
resultColors.stroke = Array.from(colors.stroke);
resultColors.stop = Array.from(colors.stop);
if (asArray) return getAllElementColors_default(resultColors);
return resultColors;
};
var client_default = extractColors;
// lib/core/helpers/environmentals/fillOrReplace/client.ts
var fillOrReplace = (svg, operation, color, ignoreColors, replaceDetails, callback) => {
if (!svg) {
throw new Error("SVG element must be provided");
}
if (operation === "fill" && typeof color !== "string") {
throw new Error("Argument 'color' must be provided");
}
if (operation === "replace" && typeof replaceDetails !== "object") {
throw new Error("Argument 'detailsArray' must be provided");
}
const elements = svg.querySelectorAll("*");
for (const element of elements) {
const elemColors = client_default(element, true);
if (ignoreColors) {
if (hasCommonElements_default(
getAllElementColors_default(elemColors),
ignoreColors
)) continue;
}
if (element.hasAttribute("style")) {
const styleAttribute = element.getAttribute("style");
if (styleAttribute) {
Object.keys(elemColors).forEach((colorType) => {
if (styleAttribute.includes(colorType)) {
let currentColor = getStyleValueFromLine_default(styleAttribute, colorType);
if (operation === "replace") {
const currReplaceDetail = replaceDetails?.find(({ target }) => currentColor === target);
if (currReplaceDetail) {
color = currReplaceDetail.replace;
} else {
return;
}
}
element.setAttribute("style", styleAttribute.replaceAll(currentColor, color));
}
});
}
}
for (const colorKey in elemColors) {
if (element.hasAttribute(colorKey)) {
if (operation === "replace") {
const attribColor = element.getAttribute(colorKey);
const currReplaceDetail = replaceDetails?.find(({ target }) => attribColor === target);
if (currReplaceDetail) {
element.setAttribute(colorKey, currReplaceDetail.replace);
continue;
}
}
color && element.setAttribute(colorKey, color);
}
}
}
;
if (typeof callback === "function") callback();
};
var client_default2 = fillOrReplace;
// lib/core/helpers/environmentals/extractColors/server.ts
var extractColors2 = (elementString, onlyParent, asArray) => {
if (typeof elementString !== "string") {
throw new Error("SVG element string should be provided");
}
const colors = {
fill: /* @__PURE__ */ new Set(),
stroke: /* @__PURE__ */ new Set(),
stop: /* @__PURE__ */ new Set()
};
const fillPattern = /fill:(#[a-f0-9]{3,6})|(rgb\(\d+,\s*\d+,\s*\d+\))/gi;
const strokePattern = /stroke:(#[a-f0-9]{3,6})|(rgb\(\d+,\s*\d+,\s*\d+\))/gi;
const stopPattern = /stop-color:(#[a-f0-9]{3,6})|(rgb\(\d+,\s*\d+,\s*\d+\))/gi;
if (onlyParent) {
const firstTagPattern = /^<([^\s/>]+)(?:\s+[^>]*?)?>/;
const match = elementString.match(firstTagPattern);
elementString = match[0];
}
const styleMatches = elementString.match(/style="([^"]+)"/gi);
if (styleMatches) {
styleMatches.forEach((match) => {
const styles = match.slice(7, -1);
const fillColors = styles.match(fillPattern);
const strokeColors = styles.match(strokePattern);
const stops = styles.match(stopPattern);
if (fillColors) fillColors.forEach((color) => colors.fill.add(color.slice(5)));
if (strokeColors) strokeColors.forEach((color) => colors.stroke.add(color.slice(7)));
if (stops) stops.forEach((color) => colors.stop.add(color.slice(7)));
});
}
const fillMatch = elementString.match(/fill="([^"]+)"/gi);
const strokeMatch = elementString.match(/stroke="([^"]+)"/gi);
const stopMatch = elementString.match(/stop-color="([^"]+)"/gi);
if (fillMatch) fillMatch.forEach((match) => colors.fill.add(match.slice(6, -1)));
if (strokeMatch) strokeMatch.forEach((match) => colors.stroke.add(match.slice(8, -1)));
if (stopMatch) stopMatch.forEach((match) => colors.stop.add(match.slice(13, -1)));
const resultColors = {
fill: Array.from(colors.fill),
stroke: Array.from(colors.stroke),
stop: Array.from(colors.stop)
};
if (asArray) return getAllElementColors_default(resultColors);
return resultColors;
};
var server_default = extractColors2;
// lib/core/helpers/environmentals/fillOrReplace/server.ts
var fillOrReplace2 = (elementString, operation, color, ignoreColors, replaceDetails, callback) => {
if (typeof elementString !== "string") {
throw new Error("SVG string must be provided");
}
if (operation === "fill" && !color) {
throw new Error("color for filling must be provided");
}
if (operation === "replace" && !replaceDetails) {
throw new Error("replace details must be provided");
}
const colors = server_default(elementString, false, true);
colors.forEach((colorItem) => {
if (ignoreColors && ignoreColors?.includes(colorItem)) return;
if (operation === "replace") {
const replaceDetail = replaceDetails?.find((detail) => detail.target === colorItem);
if (replaceDetail) {
const { replace: replace2 } = replaceDetail;
if (replace2) {
color = replace2;
}
} else {
return;
}
}
elementString = elementString.replace(colorItem, color);
});
if (typeof callback === "function") callback();
return elementString;
};
var server_default2 = fillOrReplace2;
// lib/core/colorModifiers/fill.ts
var fill = (elementStringOrElement, color, ignoreColors, callback) => {
if (typeof document !== "undefined") {
return client_default2(elementStringOrElement, "fill", color, ignoreColors, void 0, callback);
} else {
return server_default2(elementStringOrElement, "fill", color, ignoreColors, void 0, callback);
}
};
var fill_default = fill;
// lib/core/colorModifiers/replace.ts
var replace = (svg, detailsArray, callback) => {
if (typeof document !== "undefined") {
return client_default2(svg, "replace", "", void 0, detailsArray, callback);
} else {
return server_default2(svg, "replace", "", void 0, detailsArray, callback);
}
};
var replace_default = replace;
// lib/core/extractors/extractColors.ts
var extractColors3 = (element, onlyParent, asArray) => {
if (typeof document !== "undefined") {
return client_default(element, onlyParent, asArray);
} else {
return server_default(element, onlyParent, asArray);
}
};
var extractColors_default = extractColors3;
// lib/core/helpers/invert/invertColors.ts
var invertColor = (color) => {
let r, g, b;
if (color.startsWith("#")) {
const hex = color.replace("#", "");
r = parseInt(hex.length === 3 ? hex[0] + hex[0] : hex.slice(0, 2), 16);
g = parseInt(hex.length === 3 ? hex[1] + hex[1] : hex.slice(2, 4), 16);
b = parseInt(hex.length === 3 ? hex[2] + hex[2] : hex.slice(4, 6), 16);
} else if (color.startsWith("rgb")) {
const matches = color.match(/\d+/g);
if (!matches || matches.length < 3) throw new Error(`Invalid RGB color: ${color}`);
r = parseInt(matches[0]);
g = parseInt(matches[1]);
b = parseInt(matches[2]);
} else {
const tempDiv = document.createElement("div");
tempDiv.style.color = color;
document.body.appendChild(tempDiv);
const computedColor = getComputedStyle(tempDiv).color;
document.body.removeChild(tempDiv);
const matches = computedColor.match(/\d+/g);
if (!matches || matches.length < 3) throw new Error(`Invalid color: ${color}`);
r = parseInt(matches[0]);
g = parseInt(matches[1]);
b = parseInt(matches[2]);
}
r = 255 - r;
g = 255 - g;
b = 255 - b;
return `#${r.toString(16).padStart(2, "0")}${g.toString(16).padStart(2, "0")}${b.toString(16).padStart(2, "0")}`;
};
var invertColors_default = invertColor;
// lib/core/colorModifiers/invert.ts
var invert = (elementStringOrElement, callback) => {
let allColors = extractColors_default(elementStringOrElement, false, true);
if (!Array.isArray(allColors)) {
allColors = [];
for (const colors of Object.values(allColors)) {
allColors.push(...colors);
}
}
const replaceDetails = allColors.map((color) => ({
target: color,
replace: invertColors_default(color)
}));
return replace_default(elementStringOrElement, replaceDetails, callback);
};
var invert_default = invert;
// lib/core/generators/generateRandomColor.ts
var generateRandomColor = (format = "hex") => {
if (!["hex", "rgb"].includes(format)) {
throw new Error("Invalid format. Format should be 'hex' or 'rgb'");
}
if (format === "hex") {
const hexCode = "#" + Array(6).fill(0).map(() => Math.floor(Math.random() * 16).toString(16)).join("");
return hexCode;
}
if (format === "rgb") {
const r = Math.floor(Math.random() * 256);
const g = Math.floor(Math.random() * 256);
const b = Math.floor(Math.random() * 256);
return `rgb(${r}, ${g}, ${b})`;
}
return "";
};
var generateRandomColor_default = generateRandomColor;
// node_modules/tinycolor2/esm/tinycolor.js
function _typeof(obj) {
"@babel/helpers - typeof";
return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(obj2) {
return typeof obj2;
} : function(obj2) {
return obj2 && "function" == typeof Symbol && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2;
}, _typeof(obj);
}
var trimLeft = /^\s+/;
var trimRight = /\s+$/;
function tinycolor(color, opts) {
color = color ? color : "";
opts = opts || {};
if (color instanceof tinycolor) {
return color;
}
if (!(this instanceof tinycolor)) {
return new tinycolor(color, opts);
}
var rgb = inputToRGB(color);
this._originalInput = color, this._r = rgb.r, this._g = rgb.g, this._b = rgb.b, this._a = rgb.a, this._roundA = Math.round(100 * this._a) / 100, this._format = opts.format || rgb.format;
this._gradientType = opts.gradientType;
if (this._r < 1) this._r = Math.round(this._r);
if (this._g < 1) this._g = Math.round(this._g);
if (this._b < 1) this._b = Math.round(this._b);
this._ok = rgb.ok;
}
tinycolor.prototype = {
isDark: function isDark() {
return this.getBrightness() < 128;
},
isLight: function isLight() {
return !this.isDark();
},
isValid: function isValid() {
return this._ok;
},
getOriginalInput: function getOriginalInput() {
return this._originalInput;
},
getFormat: function getFormat() {
return this._format;
},
getAlpha: function getAlpha() {
return this._a;
},
getBrightness: function getBrightness() {
var rgb = this.toRgb();
return (rgb.r * 299 + rgb.g * 587 + rgb.b * 114) / 1e3;
},
getLuminance: function getLuminance() {
var rgb = this.toRgb();
var RsRGB, GsRGB, BsRGB, R, G, B;
RsRGB = rgb.r / 255;
GsRGB = rgb.g / 255;
BsRGB = rgb.b / 255;
if (RsRGB <= 0.03928) R = RsRGB / 12.92;
else R = Math.pow((RsRGB + 0.055) / 1.055, 2.4);
if (GsRGB <= 0.03928) G = GsRGB / 12.92;
else G = Math.pow((GsRGB + 0.055) / 1.055, 2.4);
if (BsRGB <= 0.03928) B = BsRGB / 12.92;
else B = Math.pow((BsRGB + 0.055) / 1.055, 2.4);
return 0.2126 * R + 0.7152 * G + 0.0722 * B;
},
setAlpha: function setAlpha(value) {
this._a = boundAlpha(value);
this._roundA = Math.round(100 * this._a) / 100;
return this;
},
toHsv: function toHsv() {
var hsv = rgbToHsv(this._r, this._g, this._b);
return {
h: hsv.h * 360,
s: hsv.s,
v: hsv.v,
a: this._a
};
},
toHsvString: function toHsvString() {
var hsv = rgbToHsv(this._r, this._g, this._b);
var h = Math.round(hsv.h * 360), s = Math.round(hsv.s * 100), v = Math.round(hsv.v * 100);
return this._a == 1 ? "hsv(" + h + ", " + s + "%, " + v + "%)" : "hsva(" + h + ", " + s + "%, " + v + "%, " + this._roundA + ")";
},
toHsl: function toHsl() {
var hsl = rgbToHsl(this._r, this._g, this._b);
return {
h: hsl.h * 360,
s: hsl.s,
l: hsl.l,
a: this._a
};
},
toHslString: function toHslString() {
var hsl = rgbToHsl(this._r, this._g, this._b);
var h = Math.round(hsl.h * 360), s = Math.round(hsl.s * 100), l = Math.round(hsl.l * 100);
return this._a == 1 ? "hsl(" + h + ", " + s + "%, " + l + "%)" : "hsla(" + h + ", " + s + "%, " + l + "%, " + this._roundA + ")";
},
toHex: function toHex(allow3Char) {
return rgbToHex(this._r, this._g, this._b, allow3Char);
},
toHexString: function toHexString(allow3Char) {
return "#" + this.toHex(allow3Char);
},
toHex8: function toHex8(allow4Char) {
return rgbaToHex(this._r, this._g, this._b, this._a, allow4Char);
},
toHex8String: function toHex8String(allow4Char) {
return "#" + this.toHex8(allow4Char);
},
toRgb: function toRgb() {
return {
r: Math.round(this._r),
g: Math.round(this._g),
b: Math.round(this._b),
a: this._a
};
},
toRgbString: function toRgbString() {
return this._a == 1 ? "rgb(" + Math.round(this._r) + ", " + Math.round(this._g) + ", " + Math.round(this._b) + ")" : "rgba(" + Math.round(this._r) + ", " + Math.round(this._g) + ", " + Math.round(this._b) + ", " + this._roundA + ")";
},
toPercentageRgb: function toPercentageRgb() {
return {
r: Math.round(bound01(this._r, 255) * 100) + "%",
g: Math.round(bound01(this._g, 255) * 100) + "%",
b: Math.round(bound01(this._b, 255) * 100) + "%",
a: this._a
};
},
toPercentageRgbString: function toPercentageRgbString() {
return this._a == 1 ? "rgb(" + Math.round(bound01(this._r, 255) * 100) + "%, " + Math.round(bound01(this._g, 255) * 100) + "%, " + Math.round(bound01(this._b, 255) * 100) + "%)" : "rgba(" + Math.round(bound01(this._r, 255) * 100) + "%, " + Math.round(bound01(this._g, 255) * 100) + "%, " + Math.round(bound01(this._b, 255) * 100) + "%, " + this._roundA + ")";
},
toName: function toName() {
if (this._a === 0) {
return "transparent";
}
if (this._a < 1) {
return false;
}
return hexNames[rgbToHex(this._r, this._g, this._b, true)] || false;
},
toFilter: function toFilter(secondColor) {
var hex8String = "#" + rgbaToArgbHex(this._r, this._g, this._b, this._a);
var secondHex8String = hex8String;
var gradientType = this._gradientType ? "GradientType = 1, " : "";
if (secondColor) {
var s = tinycolor(secondColor);
secondHex8String = "#" + rgbaToArgbHex(s._r, s._g, s._b, s._a);
}
return "progid:DXImageTransform.Microsoft.gradient(" + gradientType + "startColorstr=" + hex8String + ",endColorstr=" + secondHex8String + ")";
},
toString: function toString(format) {
var formatSet = !!format;
format = format || this._format;
var formattedString = false;
var hasAlpha = this._a < 1 && this._a >= 0;
var needsAlphaFormat = !formatSet && hasAlpha && (format === "hex" || format === "hex6" || format === "hex3" || format === "hex4" || format === "hex8" || format === "name");
if (needsAlphaFormat) {
if (format === "name" && this._a === 0) {
return this.toName();
}
return this.toRgbString();
}
if (format === "rgb") {
formattedString = this.toRgbString();
}
if (format === "prgb") {
formattedString = this.toPercentageRgbString();
}
if (format === "hex" || format === "hex6") {
formattedString = this.toHexString();
}
if (format === "hex3") {
formattedString = this.toHexString(true);
}
if (format === "hex4") {
formattedString = this.toHex8String(true);
}
if (format === "hex8") {
formattedString = this.toHex8String();
}
if (format === "name") {
formattedString = this.toName();
}
if (format === "hsl") {
formattedString = this.toHslString();
}
if (format === "hsv") {
formattedString = this.toHsvString();
}
return formattedString || this.toHexString();
},
clone: function clone() {
return tinycolor(this.toString());
},
_applyModification: function _applyModification(fn, args) {
var color = fn.apply(null, [this].concat([].slice.call(args)));
this._r = color._r;
this._g = color._g;
this._b = color._b;
this.setAlpha(color._a);
return this;
},
lighten: function lighten() {
return this._applyModification(_lighten, arguments);
},
brighten: function brighten() {
return this._applyModification(_brighten, arguments);
},
darken: function darken() {
return this._applyModification(_darken, arguments);
},
desaturate: function desaturate() {
return this._applyModification(_desaturate, arguments);
},
saturate: function saturate() {
return this._applyModification(_saturate, arguments);
},
greyscale: function greyscale() {
return this._applyModification(_greyscale, arguments);
},
spin: function spin() {
return this._applyModification(_spin, arguments);
},
_applyCombination: function _applyCombination(fn, args) {
return fn.apply(null, [this].concat([].slice.call(args)));
},
analogous: function analogous() {
return this._applyCombination(_analogous, arguments);
},
complement: function complement() {
return this._applyCombination(_complement, arguments);
},
monochromatic: function monochromatic() {
return this._applyCombination(_monochromatic, arguments);
},
splitcomplement: function splitcomplement() {
return this._applyCombination(_splitcomplement, arguments);
},
// Disabled until https://github.com/bgrins/TinyColor/issues/254
// polyad: function (number) {
// return this._applyCombination(polyad, [number]);
// },
triad: function triad() {
return this._applyCombination(polyad, [3]);
},
tetrad: function tetrad() {
return this._applyCombination(polyad, [4]);
}
};
tinycolor.fromRatio = function(color, opts) {
if (_typeof(color) == "object") {
var newColor = {};
for (var i in color) {
if (color.hasOwnProperty(i)) {
if (i === "a") {
newColor[i] = color[i];
} else {
newColor[i] = convertToPercentage(color[i]);
}
}
}
color = newColor;
}
return tinycolor(color, opts);
};
function inputToRGB(color) {
var rgb = {
r: 0,
g: 0,
b: 0
};
var a = 1;
var s = null;
var v = null;
var l = null;
var ok = false;
var format = false;
if (typeof color == "string") {
color = stringInputToObject(color);
}
if (_typeof(color) == "object") {
if (isValidCSSUnit(color.r) && isValidCSSUnit(color.g) && isValidCSSUnit(color.b)) {
rgb = rgbToRgb(color.r, color.g, color.b);
ok = true;
format = String(color.r).substr(-1) === "%" ? "prgb" : "rgb";
} else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.v)) {
s = convertToPercentage(color.s);
v = convertToPercentage(color.v);
rgb = hsvToRgb(color.h, s, v);
ok = true;
format = "hsv";
} else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.l)) {
s = convertToPercentage(color.s);
l = convertToPercentage(color.l);
rgb = hslToRgb(color.h, s, l);
ok = true;
format = "hsl";
}
if (color.hasOwnProperty("a")) {
a = color.a;
}
}
a = boundAlpha(a);
return {
ok,
format: color.format || format,
r: Math.min(255, Math.max(rgb.r, 0)),
g: Math.min(255, Math.max(rgb.g, 0)),
b: Math.min(255, Math.max(rgb.b, 0)),
a
};
}
function rgbToRgb(r, g, b) {
return {
r: bound01(r, 255) * 255,
g: bound01(g, 255) * 255,
b: bound01(b, 255) * 255
};
}
function rgbToHsl(r, g, b) {
r = bound01(r, 255);
g = bound01(g, 255);
b = bound01(b, 255);
var max = Math.max(r, g, b), min = Math.min(r, g, b);
var h, s, l = (max + min) / 2;
if (max == min) {
h = s = 0;
} else {
var d = max - min;
s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
switch (max) {
case r:
h = (g - b) / d + (g < b ? 6 : 0);
break;
case g:
h = (b - r) / d + 2;
break;
case b:
h = (r - g) / d + 4;
break;
}
h /= 6;
}
return {
h,
s,
l
};
}
function hslToRgb(h, s, l) {
var r, g, b;
h = bound01(h, 360);
s = bound01(s, 100);
l = bound01(l, 100);
function hue2rgb(p2, q2, t) {
if (t < 0) t += 1;
if (t > 1) t -= 1;
if (t < 1 / 6) return p2 + (q2 - p2) * 6 * t;
if (t < 1 / 2) return q2;
if (t < 2 / 3) return p2 + (q2 - p2) * (2 / 3 - t) * 6;
return p2;
}
if (s === 0) {
r = g = b = l;
} else {
var q = l < 0.5 ? l * (1 + s) : l + s - l * s;
var p = 2 * l - q;
r = hue2rgb(p, q, h + 1 / 3);
g = hue2rgb(p, q, h);
b = hue2rgb(p, q, h - 1 / 3);
}
return {
r: r * 255,
g: g * 255,
b: b * 255
};
}
function rgbToHsv(r, g, b) {
r = bound01(r, 255);
g = bound01(g, 255);
b = bound01(b, 255);
var max = Math.max(r, g, b), min = Math.min(r, g, b);
var h, s, v = max;
var d = max - min;
s = max === 0 ? 0 : d / max;
if (max == min) {
h = 0;
} else {
switch (max) {
case r:
h = (g - b) / d + (g < b ? 6 : 0);
break;
case g:
h = (b - r) / d + 2;
break;
case b:
h = (r - g) / d + 4;
break;
}
h /= 6;
}
return {
h,
s,
v
};
}
function hsvToRgb(h, s, v) {
h = bound01(h, 360) * 6;
s = bound01(s, 100);
v = bound01(v, 100);
var i = Math.floor(h), f = h - i, p = v * (1 - s), q = v * (1 - f * s), t = v * (1 - (1 - f) * s), mod = i % 6, r = [v, q, p, p, t, v][mod], g = [t, v, v, q, p, p][mod], b = [p, p, t, v, v, q][mod];
return {
r: r * 255,
g: g * 255,
b: b * 255
};
}
function rgbToHex(r, g, b, allow3Char) {
var hex = [pad2(Math.round(r).toString(16)), pad2(Math.round(g).toString(16)), pad2(Math.round(b).toString(16))];
if (allow3Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1)) {
return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0);
}
return hex.join("");
}
function rgbaToHex(r, g, b, a, allow4Char) {
var hex = [pad2(Math.round(r).toString(16)), pad2(Math.round(g).toString(16)), pad2(Math.round(b).toString(16)), pad2(convertDecimalToHex(a))];
if (allow4Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1) && hex[3].charAt(0) == hex[3].charAt(1)) {
return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0) + hex[3].charAt(0);
}
return hex.join("");
}
function rgbaToArgbHex(r, g, b, a) {
var hex = [pad2(convertDecimalToHex(a)), pad2(Math.round(r).toString(16)), pad2(Math.round(g).toString(16)), pad2(Math.round(b).toString(16))];
return hex.join("");
}
tinycolor.equals = function(color1, color2) {
if (!color1 || !color2) return false;
return tinycolor(color1).toRgbString() == tinycolor(color2).toRgbString();
};
tinycolor.random = function() {
return tinycolor.fromRatio({
r: Math.random(),
g: Math.random(),
b: Math.random()
});
};
function _desaturate(color, amount) {
amount = amount === 0 ? 0 : amount || 10;
var hsl = tinycolor(color).toHsl();
hsl.s -= amount / 100;
hsl.s = clamp01(hsl.s);
return tinycolor(hsl);
}
function _saturate(color, amount) {
amount = amount === 0 ? 0 : amount || 10;
var hsl = tinycolor(color).toHsl();
hsl.s += amount / 100;
hsl.s = clamp01(hsl.s);
return tinycolor(hsl);
}
function _greyscale(color) {
return tinycolor(color).desaturate(100);
}
function _lighten(color, amount) {
amount = amount === 0 ? 0 : amount || 10;
var hsl = tinycolor(color).toHsl();
hsl.l += amount / 100;
hsl.l = clamp01(hsl.l);
return tinycolor(hsl);
}
function _brighten(color, amount) {
amount = amount === 0 ? 0 : amount || 10;
var rgb = tinycolor(color).toRgb();
rgb.r = Math.max(0, Math.min(255, rgb.r - Math.round(255 * -(amount / 100))));
rgb.g = Math.max(0, Math.min(255, rgb.g - Math.round(255 * -(amount / 100))));
rgb.b = Math.max(0, Math.min(255, rgb.b - Math.round(255 * -(amount / 100))));
return tinycolor(rgb);
}
function _darken(color, amount) {
amount = amount === 0 ? 0 : amount || 10;
var hsl = tinycolor(color).toHsl();
hsl.l -= amount / 100;
hsl.l = clamp01(hsl.l);
return tinycolor(hsl);
}
function _spin(color, amount) {
var hsl = tinycolor(color).toHsl();
var hue = (hsl.h + amount) % 360;
hsl.h = hue < 0 ? 360 + hue : hue;
return tinycolor(hsl);
}
function _complement(color) {
var hsl = tinycolor(color).toHsl();
hsl.h = (hsl.h + 180) % 360;
return tinycolor(hsl);
}
function polyad(color, number) {
if (isNaN(number) || number <= 0) {
throw new Error("Argument to polyad must be a positive number");
}
var hsl = tinycolor(color).toHsl();
var result = [tinycolor(color)];
var step = 360 / number;
for (var i = 1; i < number; i++) {
result.push(tinycolor({
h: (hsl.h + i * step) % 360,
s: hsl.s,
l: hsl.l
}));
}
return result;
}
function _splitcomplement(color) {
var hsl = tinycolor(color).toHsl();
var h = hsl.h;
return [tinycolor(color), tinycolor({
h: (h + 72) % 360,
s: hsl.s,
l: hsl.l
}), tinycolor({
h: (h + 216) % 360,
s: hsl.s,
l: hsl.l
})];
}
function _analogous(color, results, slices) {
results = results || 6;
slices = slices || 30;
var hsl = tinycolor(color).toHsl();
var part = 360 / slices;
var ret = [tinycolor(color)];
for (hsl.h = (hsl.h - (part * results >> 1) + 720) % 360; --results; ) {
hsl.h = (hsl.h + part) % 360;
ret.push(tinycolor(hsl));
}
return ret;
}
function _monochromatic(color, results) {
results = results || 6;
var hsv = tinycolor(color).toHsv();
var h = hsv.h, s = hsv.s, v = hsv.v;
var ret = [];
var modification = 1 / results;
while (results--) {
ret.push(tinycolor({
h,
s,
v
}));
v = (v + modification) % 1;
}
return ret;
}
tinycolor.mix = function(color1, color2, amount) {
amount = amount === 0 ? 0 : amount || 50;
var rgb1 = tinycolor(color1).toRgb();
var rgb2 = tinycolor(color2).toRgb();
var p = amount / 100;
var rgba = {
r: (rgb2.r - rgb1.r) * p + rgb1.r,
g: (rgb2.g - rgb1.g) * p + rgb1.g,
b: (rgb2.b - rgb1.b) * p + rgb1.b,
a: (rgb2.a - rgb1.a) * p + rgb1.a
};
return tinycolor(rgba);
};
tinycolor.readability = function(color1, color2) {
var c1 = tinycolor(color1);
var c2 = tinycolor(color2);
return (Math.max(c1.getLuminance(), c2.getLuminance()) + 0.05) / (Math.min(c1.getLuminance(), c2.getLuminance()) + 0.05);
};
tinycolor.isReadable = function(color1, color2, wcag2) {
var readability = tinycolor.readability(color1, color2);
var wcag2Parms, out;
out = false;
wcag2Parms = validateWCAG2Parms(wcag2);
switch (wcag2Parms.level + wcag2Parms.size) {
case "AAsmall":
case "AAAlarge":
out = readability >= 4.5;
break;
case "AAlarge":
out = readability >= 3;
break;
case "AAAsmall":
out = readability >= 7;
break;
}
return out;
};
tinycolor.mostReadable = function(baseColor, colorList, args) {
var bestColor = null;
var bestScore = 0;
var readability;
var includeFallbackColors, level, size;
args = args || {};
includeFallbackColors = args.includeFallbackColors;
level = args.level;
size = args.size;
for (var i = 0; i < colorList.length; i++) {
readability = tinycolor.readability(baseColor, colorList[i]);
if (readability > bestScore) {
bestScore = readability;
bestColor = tinycolor(colorList[i]);
}
}
if (tinycolor.isReadable(baseColor, bestColor, {
level,
size
}) || !includeFallbackColors) {
return bestColor;
} else {
args.includeFallbackColors = false;
return tinycolor.mostReadable(baseColor, ["#fff", "#000"], args);
}
};
var names = tinycolor.names = {
aliceblue: "f0f8ff",
antiquewhite: "faebd7",
aqua: "0ff",
aquamarine: "7fffd4",
azure: "f0ffff",
beige: "f5f5dc",
bisque: "ffe4c4",
black: "000",
blanchedalmond: "ffebcd",
blue: "00f",
blueviolet: "8a2be2",
brown: "a52a2a",
burlywood: "deb887",
burntsienna: "ea7e5d",
cadetblue: "5f9ea0",
chartreuse: "7fff00",
chocolate: "d2691e",
coral: "ff7f50",
cornflowerblue: "6495ed",
cornsilk: "fff8dc",
crimson: "dc143c",
cyan: "0ff",
darkblue: "00008b",
darkcyan: "008b8b",
darkgoldenrod: "b8860b",
darkgray: "a9a9a9",
darkgreen: "006400",
darkgrey: "a9a9a9",
darkkhaki: "bdb76b",
darkmagenta: "8b008b",
darkolivegreen: "556b2f",
darkorange: "ff8c00",
darkorchid: "9932cc",
darkred: "8b0000",
darksalmon: "e9967a",
darkseagreen: "8fbc8f",
darkslateblue: "483d8b",
darkslategray: "2f4f4f",
darkslategrey: "2f4f4f",
darkturquoise: "00ced1",
darkviolet: "9400d3",
deeppink: "ff1493",
deepskyblue: "00bfff",
dimgray: "696969",
dimgrey: "696969",
dodgerblue: "1e90ff",
firebrick: "b22222",
floralwhite: "fffaf0",
forestgreen: "228b22",
fuchsia: "f0f",
gainsboro: "dcdcdc",
ghostwhite: "f8f8ff",
gold: "ffd700",
goldenrod: "daa520",
gray: "808080",
green: "008000",
greenyellow: "adff2f",
grey: "808080",
honeydew: "f0fff0",
hotpink: "ff69b4",
indianred: "cd5c5c",
indigo: "4b0082",
ivory: "fffff0",
khaki: "f0e68c",
lavender: "e6e6fa",
lavenderblush: "fff0f5",
lawngreen: "7cfc00",
lemonchiffon: "fffacd",
lightblue: "add8e6",
lightcoral: "f08080",
lightcyan: "e0ffff",
lightgoldenrodyellow: "fafad2",
lightgray: "d3d3d3",
lightgreen: "90ee90",
lightgrey: "d3d3d3",
lightpink: "ffb6c1",
lightsalmon: "ffa07a",
lightseagreen: "20b2aa",
lightskyblue: "87cefa",
lightslategray: "789",
lightslategrey: "789",
lightsteelblue: "b0c4de",
lightyellow: "ffffe0",
lime: "0f0",
limegreen: "32cd32",
linen: "faf0e6",
magenta: "f0f",
maroon: "800000",
mediumaquamarine: "66cdaa",
mediumblue: "0000cd",
mediumorchid: "ba55d3",
mediumpurple: "9370db",
mediumseagreen: "3cb371",
mediumslateblue: "7b68ee",
mediumspringgreen: "00fa9a",
mediumturquoise: "48d1cc",
mediumvioletred: "c71585",
midnightblue: "191970",
mintcream: "f5fffa",
mistyrose: "ffe4e1",
moccasin: "ffe4b5",
navajowhite: "ffdead",
navy: "000080",
oldlace: "fdf5e6",
olive: "808000",
olivedrab: "6b8e23",
orange: "ffa500",
orangered: "ff4500",
orchid: "da70d6",
palegoldenrod: "eee8aa",
palegreen: "98fb98",
paleturquoise: "afeeee",
palevioletred: "db7093",
papayawhip: "ffefd5",
peachpuff: "ffdab9",
peru: "cd853f",
pink: "ffc0cb",
plum: "dda0dd",
powderblue: "b0e0e6",
purple: "800080",
rebeccapurple: "663399",
red: "f00",
rosybrown: "bc8f8f",
royalblue: "4169e1",
saddlebrown: "8b4513",
salmon: "fa8072",
sandybrown: "f4a460",
seagreen: "2e8b57",
seashell: "fff5ee",
sienna: "a0522d",
silver: "c0c0c0",
skyblue: "87ceeb",
slateblue: "6a5acd",
slategray: "708090",
slategrey: "708090",
snow: "fffafa",
springgreen: "00ff7f",
steelblue: "4682b4",
tan: "d2b48c",
teal: "008080",
thistle: "d8bfd8",
tomato: "ff6347",
turquoise: "40e0d0",
violet: "ee82ee",
wheat: "f5deb3",
white: "fff",
whitesmoke: "f5f5f5",
yellow: "ff0",
yellowgreen: "9acd32"
};
var hexNames = tinycolor.hexNames = flip(names);
function flip(o) {
var flipped = {};
for (var i in o) {
if (o.hasOwnProperty(i)) {
flipped[o[i]] = i;
}
}
return flipped;
}
function boundAlpha(a) {
a = parseFloat(a);
if (isNaN(a) || a < 0 || a > 1) {
a = 1;
}
return a;
}
function bound01(n, max) {
if (isOnePointZero(n)) n = "100%";
var processPercent = isPercentage(n);
n = Math.min(max, Math.max(0, parseFloat(n)));
if (processPercent) {
n = parseInt(n * max, 10) / 100;
}
if (Math.abs(n - max) < 1e-6) {
return 1;
}
return n % max / parseFloat(max);
}
function clamp01(val) {
return Math.min(1, Math.max(0, val));
}
function parseIntFromHex(val) {
return parseInt(val, 16);
}
function isOnePointZero(n) {
return typeof n == "string" && n.indexOf(".") != -1 && parseFloat(n) === 1;
}
function isPercentage(n) {
return typeof n === "string" && n.indexOf("%") != -1;
}
function pad2(c) {
return c.length == 1 ? "0" + c : "" + c;
}
function convertToPercentage(n) {
if (n <= 1) {
n = n * 100 + "%";
}
return n;
}
function convertDecimalToHex(d) {
return Math.round(parseFloat(d) * 255).toString(16);
}
function convertHexToDecimal(h) {
return parseIntFromHex(h) / 255;
}
var matchers = function() {
var CSS_INTEGER = "[-\\+]?\\d+%?";
var CSS_NUMBER = "[-\\+]?\\d*\\.\\d+%?";
var CSS_UNIT = "(?:" + CSS_NUMBER + ")|(?:" + CSS_INTEGER + ")";
var PERMISSIVE_MATCH3 = "[\\s|\\(]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")\\s*\\)?";
var PERMISSIVE_MATCH4 = "[\\s|\\(]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")\\s*\\)?";
return {
CSS_UNIT: new RegExp(CSS_UNIT),
rgb: new RegExp("rgb" + PERMISSIVE_MATCH3),
rgba: new RegExp("rgba" + PERMISSIVE_MATCH4),
hsl: new RegExp("hsl" + PERMISSIVE_MATCH3),
hsla: new RegExp("hsla" + PERMISSIVE_MATCH4),
hsv: new RegExp("hsv" + PERMISSIVE_MATCH3),
hsva: new RegExp("hsva" + PERMISSIVE_MATCH4),
hex3: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,
hex6: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,
hex4: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,
hex8: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/
};
}();
function isValidCSSUnit(color) {
return !!matchers.CSS_UNIT.exec(color);
}
function stringInputToObject(color) {
color = color.replace(trimLeft, "").replace(trimRight, "").toLowerCase();
var named = false;
if (names[color]) {
color = names[color];
named = true;
} else if (color == "transparent") {
return {
r: 0,
g: 0,
b: 0,
a: 0,
format: "name"
};
}
var match;
if (match = matchers.rgb.exec(color)) {
return {
r: match[1],
g: match[2],
b: match[3]
};
}
if (match = matchers.rgba.exec(color)) {
return {
r: match[1],
g: match[2],
b: match[3],
a: match[4]
};
}
if (match = matchers.hsl.exec(color)) {
return {
h: match[1],
s: match[2],
l: match[3]
};
}
if (match = matchers.hsla.exec(color)) {
return {
h: match[1],
s: match[2],
l: match[3],
a: match[4]
};
}
if (match = matchers.hsv.exec(color)) {
return {
h: match[1],
s: match[2],
v: match[3]
};
}
if (match = matchers.hsva.exec(color)) {
return {
h: match[1],
s: match[2],
v: match[3],
a: match[4]
};
}
if (match = matchers.hex8.exec(color)) {
return {
r: parseIntFromHex(match[1]),
g: parseIntFromHex(match[2]),
b: parseIntFromHex(match[3]),
a: convertHexToDecimal(match[4]),
format: named ? "name" : "hex8"
};
}
if (match = matchers.hex6.exec(color)) {
return {
r: parseIntFromHex(match[1]),
g: parseIntFromHex(match[2]),
b: parseIntFromHex(match[3]),
format: named ? "name" : "hex"
};
}
if (match = matchers.hex4.exec(color)) {
return {
r: parseIntFromHex(match[1] + "" + match[1]),
g: parseIntFromHex(match[2] + "" + match[2]),
b: parseIntFromHex(match[3] + "" + match[3]),
a: convertHexToDecimal(match[4] + "" + match[4]),
format: named ? "name" : "hex8"
};
}
if (match = matchers.hex3.exec(color)) {
return {
r: parseIntFromHex(match[1] + "" + match[1]),
g: parseIntFromHex(match[2] + "" + match[2]),
b: parseIntFromHex(match[3] + "" + match[3]),
format: named ? "name" : "hex"
};
}
return false;
}
function validateWCAG2Parms(parms) {
var level, size;
parms = parms || {
level: "AA",
size: "small"
};
level = (parms.level || "AA").toUpperCase();
size = (parms.size || "small").toLowerCase();
if (level !== "AA" && level !== "AAA") {
level = "AA";
}
if (size !== "small" && size !== "large") {
size = "small";
}
return {
level,
size
};
}
// lib/core/propertyModifiers/modifyColor.ts
var modifyColor = (colorString, property, factor) => {
const color = tinycolor(colorString);
if (!color.isValid()) {
throw new Error(`Invalid color string: ${colorString}`);
}
if (property === "hue" || property === "saturation") {
const hslColor = color.toHsl();
if (property === "hue") {
let newHue = hslColor.h + factor;
newHue = (newHue % 360 + 360) % 360;
hslColor.h = newHue;
} else if (property === "saturation") {
let newSaturation = hslColor.s + factor;
newSaturation = Math.max(0, Math.min(1, newSaturation));
hslColor.s = newSaturation;
}
return tinycolor(hslColor).toRgbString();
}
const rgbColor = color.toRgb();
const { a: alpha, ...colorValues } = { ...rgbColor };
if (property === "brightness") {
for (let x in colorValues) {
const colorValue = colorValues[x] + factor;
const valueInRange = Math.max(0, Math.min(255, colorValue));
rgbColor[x] = valueInRange;
}
}
if (property === "alpha") {
let newAlpha = alpha + factor;
newAlpha = Math.max(0, Math.min(1, newAlpha));
rgbColor.a = newAlpha;
}
return tinycolor(rgbColor).toRgbString();
};
var modifyColor_default = modifyColor;
// lib/core/propertyModifiers/changeProperty.ts
var changeProperty = (svg, factor, property) => {
const isClient = document !== void 0;
if (!svg || typeof factor !== "number") {
throw new Error(`SVG ${isClient ? "HTML Element" : "string"} and brightness factor should be provided`);
}
const colors = extractColors_default(svg, false, true);
const replaceDetails = colors.map((color) => {
const newColor = modifyColor_default(color, property, factor);
return {
target: color,
replace: newColor
};
});
return replace_default(svg, replaceDetails);
};
var changeProperty_default = changeProperty;
// lib/core/propertyModifiers/index.ts
var changeBrightness = (svg, factor) => changeProperty_default(svg, factor, "brightness");
var changeAlpha = (svg, factor) => changeProperty_default(svg, factor, "alpha");
var changeSaturation = (svg, factor) => changeProperty_default(svg, factor, "saturation");
var changeHue = (svg, factor) => changeProperty_default(svg, factor, "hue");
// index.ts
var index_default = {
fill: fill_default,
replace: replace_default,
invert: invert_default,
extractColors: extractColors_default,
generateRandomColor: generateRandomColor_default,
changeBrightness,
changeAlpha,
changeSaturation,
changeHue
};
export {
changeAlpha,
changeBrightness,
changeHue,
changeSaturation,
index_default as default,
extractColors_default as extractColors,
fill_default as fill,
generateRandomColor_default as generateRandomColor,
invert_default as invert,
replace_default as replace
};