mirror of
				https://github.com/checktheroads/hyperglass
				synced 2024-05-11 05:55:08 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			240 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			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 };
 |