1
0
mirror of https://github.com/checktheroads/hyperglass synced 2024-05-11 05:55:08 +00:00
2020-01-28 12:03:47 -07:00

240 lines
6.8 KiB
JavaScript

import { theme as chakraTheme } from "@chakra-ui/core";
import chroma from "chroma-js";
const alphaColors = color => ({
900: chroma(color)
.alpha(0.92)
.css(),
800: chroma(color)
.alpha(0.8)
.css(),
700: chroma(color)
.alpha(0.6)
.css(),
600: chroma(color)
.alpha(0.48)
.css(),
500: chroma(color)
.alpha(0.38)
.css(),
400: chroma(color)
.alpha(0.24)
.css(),
300: chroma(color)
.alpha(0.16)
.css(),
200: chroma(color)
.alpha(0.12)
.css(),
100: chroma(color)
.alpha(0.08)
.css(),
50: chroma(color)
.alpha(0.04)
.css()
});
const generateColors = colorInput => {
const colorMap = {};
const lightnessMap = [0.95, 0.85, 0.75, 0.65, 0.55, 0.45, 0.35, 0.25, 0.15, 0.05];
const saturationMap = [0.32, 0.16, 0.08, 0.04, 0, 0, 0.04, 0.08, 0.16, 0.32];
const validColor = chroma.valid(colorInput.trim()) ? chroma(colorInput.trim()) : chroma("#000");
const lightnessGoal = validColor.get("hsl.l");
const closestLightness = lightnessMap.reduce((prev, curr) =>
Math.abs(curr - lightnessGoal) < Math.abs(prev - lightnessGoal) ? curr : prev
);
const baseColorIndex = lightnessMap.findIndex(l => l === closestLightness);
const colors = lightnessMap
.map(l => validColor.set("hsl.l", l))
.map(color => chroma(color))
.map((color, i) => {
const saturationDelta = saturationMap[i] - saturationMap[baseColorIndex];
return saturationDelta >= 0
? color.saturate(saturationDelta)
: color.desaturate(saturationDelta * -1);
});
const getColorNumber = index => (index === 0 ? 50 : index * 100);
colors.map((color, i) => {
const colorIndex = getColorNumber(i);
colorMap[colorIndex] = color.hex();
});
return colorMap;
};
// const defaultBasePalette = {
// black: "#262626",
// white: "#f7f7f7",
// gray: "#c1c7cc",
// red: "#d84b4b",
// orange: "ff6b35",
// yellow: "#edae49",
// green: "#35b246",
// blue: "#314cb6",
// teal: "#35b299",
// cyan: "#118ab2",
// pink: "#f2607d",
// purple: "#8d30b5"
// };
// const defaultSwatchPalette = {
// black: defaultBasePalette.black,
// white: defaultBasePalette.white,
// gray: generateColors(defaultBasePalette.gray),
// red: generateColors(defaultBasePalette.red),
// orange: generateColors(defaultBasePalette.orange),
// yellow: generateColors(defaultBasePalette.yellow),
// green: generateColors(defaultBasePalette.green),
// blue: generateColors(defaultBasePalette.blue),
// teal: generateColors(defaultBasePalette.teal),
// cyan: generateColors(defaultBasePalette.cyan),
// pink: generateColors(defaultBasePalette.pink),
// purple: generateColors(defaultBasePalette.purple)
// };
// const defaultAlphaPalette = {
// blackAlpha: alphaColors(defaultBasePalette.black),
// whiteAlpha: alphaColors(defaultBasePalette.white)
// };
// const defaultFuncSwatchPalette = {
// primary: generateColors(defaultBasePalette.cyan),
// secondary: generateColors(defaultBasePalette.blue),
// dark: generateColors(defaultBasePalette.black),
// light: generateColors(defaultBasePalette.white),
// success: generateColors(defaultBasePalette.green),
// warning: generateColors(defaultBasePalette.yellow),
// error: generateColors(defaultBasePalette.orange),
// danger: generateColors(defaultBasePalette.red)
// };
// const defaultColors = {
// transparent: "transparent",
// current: "currentColor",
// ...defaultFuncSwatchPalette,
// ...defaultAlphaPalette,
// ...defaultSwatchPalette
// };
const defaultBodyFonts = [
// "Nunito",
"-apple-system",
"BlinkMacSystemFont",
'"Segoe UI"',
"Helvetica",
"Arial",
"sans-serif",
'"Apple Color Emoji"',
'"Segoe UI Emoji"',
'"Segoe UI Symbol"'
];
const defaultMonoFonts = [
// '"Fira Code"',
"SFMono-Regular",
"Melno",
"Monaco",
"Consolas",
'"Liberation Mono"',
'"Courier New"',
"monospace"
];
// const defaultFonts = {
// body: defaultBodyFonts.join(", "),
// heading: defaultBodyFonts.join(", "),
// mono: defaultMonoFonts.join(", ")
// };
// const defaultTheme = {
// ...chakraTheme,
// colors: defaultColors,
// fonts: defaultFonts
// };
const generatePalette = palette => {
const generatedPalette = {};
Object.keys(palette).map(color => {
if (!["black", "white"].includes(color)) {
generatedPalette[color] = generateColors(palette[color]);
} else {
generatedPalette[color] = palette[color];
generatedPalette[`${color}Alpha`] = alphaColors(palette[color]);
}
});
return generatedPalette;
};
// const generateFuncPalette = palette => ({
// primary: generateColors(palette.cyan),
// secondary: generateColors(palette.blue),
// dark: generateColors(palette.black),
// light: generateColors(palette.white),
// success: generateColors(palette.green),
// warning: generateColors(palette.yellow),
// error: generateColors(palette.orange),
// danger: generateColors(palette.red)
// });
// const generateAlphaPalette = palette => ({
// blackAlpha: alphaColors(palette.black),
// whiteAlpha: alphaColors(palette.white)
// });
const formatFont = font => {
const fontList = font.split(" ");
const fontFmt = fontList.length >= 2 ? `'${fontList.join(" ")}'` : fontList.join(" ");
return fontFmt;
};
const importFonts = userFonts => {
const [body, mono] = [defaultBodyFonts, defaultMonoFonts];
const bodyFmt = formatFont(userFonts.body);
const monoFmt = formatFont(userFonts.mono);
if (userFonts.body && !body.includes(bodyFmt)) {
body.unshift(bodyFmt);
}
if (userFonts.mono && !mono.includes(monoFmt)) {
mono.unshift(monoFmt);
}
return {
body: body.join(", "),
heading: body.join(", "),
mono: mono.join(", ")
};
};
const importColors = (userColors = {}) => {
// const baseColors = {
// ...defaultBasePalette,
// ...userColors
// };
const generatedColors = generatePalette(userColors);
// const swatchColors = generatePalette(baseColors);
// const funcColors = generateFuncPalette(baseColors);
// const bwAlphaColors = generateAlphaPalette(userColors);
return {
transparent: "transparent",
current: "currentColor",
// ...swatchColors,
// ...funcColors,
...generatedColors
// ...bwAlphaColors
};
};
const makeTheme = userTheme => ({
...chakraTheme,
colors: importColors(userTheme.colors),
fonts: importFonts(userTheme.fonts)
});
export { makeTheme, chakraTheme as defaultTheme };