discourse/app/assets/javascripts/wizard/addon/lib/preview.js

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

151 lines
3.2 KiB
JavaScript
Raw Normal View History

2016-09-17 04:12:56 +08:00
/*eslint no-bitwise:0 */
2016-09-17 04:39:12 +08:00
export const LOREM = `
Lorem ipsum dolor sit amet,
consectetur adipiscing elit.
Nullam eget sem non elit
tincidunt rhoncus. Fusce
velit nisl, porttitor sed
nisl ac, consectetur interdum
metus. Fusce in consequat
augue, vel facilisis felis.`;
2016-09-17 04:39:12 +08:00
2016-09-17 04:12:56 +08:00
export function parseColor(color) {
const m = color.match(/^#([0-9a-f]{6})$/i);
if (m) {
const c = m[1];
return [
parseInt(c.slice(0, 2), 16),
parseInt(c.slice(2, 4), 16),
parseInt(c.slice(4, 6), 16),
2016-09-17 04:12:56 +08:00
];
}
return [0, 0, 0];
}
export function brightness(color) {
return color[0] * 0.299 + color[1] * 0.587 + color[2] * 0.114;
}
function rgbToHsl(r, g, b) {
r /= 255;
g /= 255;
b /= 255;
let max = Math.max(r, g, b),
min = Math.min(r, g, b);
let h,
s,
l = (max + min) / 2;
if (max === min) {
h = s = 0;
} else {
const 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 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;
}
function hslToRgb(h, s, l) {
let r, g, b;
if (s === 0) {
r = g = b = l; // achromatic
} else {
const q = l < 0.5 ? l * (1 + s) : l + s - l * s;
const 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];
}
export function lighten(color, percent) {
const hsl = rgbToHsl(color[0], color[1], color[2]);
const scale = percent / 100.0;
const diff = scale > 0 ? 1.0 - hsl[2] : hsl[2];
hsl[2] = hsl[2] + diff * scale;
color = hslToRgb(hsl[0], hsl[1], hsl[2]);
return (
"#" +
(0 | ((1 << 8) + color[0])).toString(16).slice(1) +
(0 | ((1 << 8) + color[1])).toString(16).slice(1) +
(0 | ((1 << 8) + color[2])).toString(16).slice(1)
2016-09-17 04:12:56 +08:00
);
}
export function chooseBrighter(primary, secondary) {
const primaryCol = parseColor(primary);
const secondaryCol = parseColor(secondary);
return brightness(primaryCol) < brightness(secondaryCol)
? secondary
: primary;
}
export function chooseDarker(primary, secondary) {
if (chooseBrighter(primary, secondary) === primary) {
return secondary;
} else {
return primary;
}
}
2016-09-17 04:12:56 +08:00
export function darkLightDiff(adjusted, comparison, lightness, darkness) {
const adjustedCol = parseColor(adjusted);
const comparisonCol = parseColor(comparison);
return lighten(
adjustedCol,
brightness(adjustedCol) < brightness(comparisonCol) ? lightness : darkness
);
}
export function drawHeader(ctx, colors, width, headerHeight) {
2016-09-17 04:12:56 +08:00
ctx.save();
ctx.beginPath();
ctx.rect(0, 0, width, headerHeight);
2016-09-17 04:12:56 +08:00
ctx.fillStyle = colors.header_background;
ctx.shadowColor = "rgba(0, 0, 0, 0.25)";
ctx.shadowBlur = 2;
ctx.shadowOffsetX = 0;
ctx.shadowOffsetY = 2;
ctx.fill();
ctx.restore();
}