Skip to content

Instantly share code, notes, and snippets.

@Skitionek
Created November 16, 2018 06:53
Show Gist options
  • Save Skitionek/ad2dcc4ebe7279175fbea5f608f35818 to your computer and use it in GitHub Desktop.
Save Skitionek/ad2dcc4ebe7279175fbea5f608f35818 to your computer and use it in GitHub Desktop.
Invert website lightness
function rgbToHsl([r, g, b]) {
r /= 255, g /= 255, 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; // achromatic
} 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;
if (s == 0) {
r = g = b = l; // achromatic
} else {
function hue2rgb(p, q, t) {
if (t < 0) t += 1;
if (t > 1) t -= 1;
if (t < 1 / 6) return p + (q - p) * 6 * t;
if (t < 1 / 2) return q;
if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;
return p;
}
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 * 255, g * 255, b * 255];
}
function convert(color) {
color = rgbToHsl(color.map(c => Number(c)));
const percent = color[1] > 0.3 ? '' : '%';
color[2] = 1 - color[2];
color = hslToRgb(color);
return `rgb${color[3] ? 'a' : ''}(${Math.round(color[0])}${percent}, ${Math.round(color[1])}${percent}, ${Math.round(color[2])}${percent}${color[3] ? ',' + Math.round(color[3]) : ''})`;
}
function match(shr, p) {
if (shr && shr.style && shr.style[p]) {
let color = shr.style[p].match(/[0-9]*\.[0-9]+|[0-9]+/g);
if (color) {
const update = convert(color, shr, p);
shr.style[p] = update;
}
}
}
function match_adv(shr, p) {
if (shr.style[p]) {
shr.style[p] = shr.style[p].replace(/rgba?\(.+?\)/g, c => {
let color = c.match(/[0-9]*\.[0-9]+|[0-9]+/g);
if (color) {
return convert(color);
}
})
}
}
const styles = {
color: match,
backgroundColor: match,
backgroundImage: match_adv,
borderBottomColor: match,
borderBottom: match_adv,
borderTopColor: match,
borderTop: match_adv,
borderLeftColor: match,
borderLeft: match_adv,
borderRightColor: match,
borderRight: match_adv,
borderColor: match,
outlineColor: match,
caretColor: match,
columnRuleColor: match,
textDecorationColor: match
};
Object.values(document.styleSheets).forEach(sh => {
try {
if (sh) Object.values(sh.cssRules).forEach(shr => {
if (shr && shr.style) {
Object.entries(styles).forEach(([p, func]) => {
func(shr, p);
})
}
})
} catch (e) {
console.log(e);
}
}
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment