CCCPaste

KiCad dark mode generator

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'));