const culori = require("culori");
let data = require("./user.json");
for (const k in data.schematic) {
const item = data.schematic[k];
let match_start = 0;
if (typeof item !== 'string') {
continue;
} else if (item.startsWith('rgb(')) {
match_start = 4;
} else if (item.startsWith('rgba(')) {
match_start = 5;
} else {
continue;
}
const parsed = item.substring(match_start, item.length - 1)
.replace(/ /g, '')
.split(',')
.map(v => parseFloat(v));
// 1. Create an sRGB object from the parsed array
const srgbColor = {
mode: 'rgb',
r: parsed[0] / 255,
g: parsed[1] / 255,
b: parsed[2] / 255,
alpha: parsed[3] !== undefined ? parsed[3] : 1
};
// 2. Convert to Oklch space
const oklchColor = culori.oklch(srgbColor);
// 3. Invert only the Lightness (L) component (range 0.0 - 1.0)
oklchColor.l = 1.0 - oklchColor.l;
// make everything darker
oklchColor.l = Math.max(oklchColor.l * 1.2 - 0.2, 0);
// Shift hue
// oklchColor.h += 180;
// 4. Convert back to sRGB
const invertedSrgb = culori.rgb(oklchColor);
// 5. Re-scale to 0-255 bounds and format values
const r = Math.round(invertedSrgb.r * 255);
const g = Math.round(invertedSrgb.g * 255);
const b = Math.round(invertedSrgb.b * 255);
let stringified;
if (parsed.length === 4) {
stringified = `rgba(${r},${g},${b},${parsed[3]})`;
} else {
stringified = `rgb(${r},${g},${b})`;
}
data.schematic[k] = stringified;
}
console.log(JSON.stringify(data, null, '\t'));