plane/apps/app/helpers/theme.helper.ts

103 lines
3.3 KiB
TypeScript
Raw Normal View History

2023-07-04 06:07:26 +00:00
import { TRgb, hexToRgb } from "helpers/color.helper";
2023-07-04 06:07:26 +00:00
type TShades = {
2023-07-04 17:38:27 +00:00
10: TRgb;
20: TRgb;
30: TRgb;
40: TRgb;
2023-07-04 06:07:26 +00:00
50: TRgb;
2023-07-04 17:38:27 +00:00
60: TRgb;
70: TRgb;
80: TRgb;
90: TRgb;
2023-07-04 06:07:26 +00:00
100: TRgb;
200: TRgb;
300: TRgb;
400: TRgb;
500: TRgb;
600: TRgb;
700: TRgb;
800: TRgb;
900: TRgb;
};
const calculateShades = (hexValue: string): TShades => {
const shades: Partial<TShades> = {};
2023-07-04 17:38:27 +00:00
const { r, g, b } = hexToRgb(hexValue);
2023-07-04 06:07:26 +00:00
const convertHexToSpecificShade = (shade: number): TRgb => {
2023-07-04 17:38:27 +00:00
if (shade <= 100) {
const decimalValue = (100 - shade) / 100;
2023-07-04 06:07:26 +00:00
2023-07-04 17:38:27 +00:00
const newR = Math.floor(r + (255 - r) * decimalValue);
const newG = Math.floor(g + (255 - g) * decimalValue);
const newB = Math.floor(b + (255 - b) * decimalValue);
2023-07-04 06:07:26 +00:00
return {
r: newR,
g: newG,
b: newB,
};
} else {
2023-07-04 17:38:27 +00:00
const decimalValue = 1 - Math.ceil((shade - 100) / 100) / 10;
2023-07-04 06:07:26 +00:00
2023-07-04 17:38:27 +00:00
const newR = Math.ceil(r * decimalValue);
const newG = Math.ceil(g * decimalValue);
const newB = Math.ceil(b * decimalValue);
2023-07-04 06:07:26 +00:00
return {
r: newR,
g: newG,
b: newB,
};
}
};
2023-07-06 09:03:56 +00:00
for (let i = 10; i <= 900; i >= 100 ? (i += 100) : (i += 10))
shades[i as keyof TShades] = convertHexToSpecificShade(i);
2023-07-04 17:38:27 +00:00
2023-07-04 06:07:26 +00:00
return shades as TShades;
};
2023-07-04 17:38:27 +00:00
export const applyTheme = (palette: string, isDarkPalette: boolean) => {
2023-07-06 09:03:56 +00:00
// palette: [bg, text, primary, sidebarBg, sidebarText]
2023-07-04 17:38:27 +00:00
const values: string[] = palette.split(",");
values.push(isDarkPalette ? "dark" : "light");
const bgShades = calculateShades(values[0]);
const textShades = calculateShades(values[1]);
2023-07-06 09:03:56 +00:00
const primaryShades = calculateShades(values[2]);
const sidebarBackgroundShades = calculateShades(values[3]);
const sidebarTextShades = calculateShades(values[4]);
2023-07-04 17:38:27 +00:00
2023-07-06 09:03:56 +00:00
for (let i = 10; i <= 900; i >= 100 ? (i += 100) : (i += 10)) {
2023-07-04 17:38:27 +00:00
const shade = i as keyof TShades;
const bgRgbValues = `${bgShades[shade].r}, ${bgShades[shade].g}, ${bgShades[shade].b}`;
const textRgbValues = `${textShades[shade].r}, ${textShades[shade].g}, ${textShades[shade].b}`;
2023-07-06 09:03:56 +00:00
const primaryRgbValues = `${primaryShades[shade].r}, ${primaryShades[shade].g}, ${primaryShades[shade].b}`;
const sidebarBackgroundRgbValues = `${sidebarBackgroundShades[shade].r}, ${sidebarBackgroundShades[shade].g}, ${sidebarBackgroundShades[shade].b}`;
const sidebarTextRgbValues = `${sidebarTextShades[shade].r}, ${sidebarTextShades[shade].g}, ${sidebarTextShades[shade].b}`;
2023-07-04 17:38:27 +00:00
document
.querySelector<HTMLElement>("[data-theme='custom']")
2023-07-06 09:03:56 +00:00
?.style.setProperty(`--color-background-${shade}`, bgRgbValues);
2023-07-04 17:38:27 +00:00
document
.querySelector<HTMLElement>("[data-theme='custom']")
?.style.setProperty(`--color-text-${shade}`, textRgbValues);
document
.querySelector<HTMLElement>("[data-theme='custom']")
2023-07-06 09:03:56 +00:00
?.style.setProperty(`--color-primary-${shade}`, primaryRgbValues);
2023-07-04 17:38:27 +00:00
document
.querySelector<HTMLElement>("[data-theme='custom']")
2023-07-06 09:03:56 +00:00
?.style.setProperty(`--color-sidebar-background-${shade}`, sidebarBackgroundRgbValues);
2023-07-04 17:38:27 +00:00
document
.querySelector<HTMLElement>("[data-theme='custom']")
2023-07-06 09:03:56 +00:00
?.style.setProperty(`--color-sidebar-text-${shade}`, sidebarTextRgbValues);
2023-07-04 17:38:27 +00:00
}
document
.querySelector<HTMLElement>("[data-theme='custom']")
2023-07-06 09:03:56 +00:00
?.style.setProperty("--color-scheme", values[5]);
2023-07-04 17:38:27 +00:00
};