forked from github/plane
3c2f5d12ed
* chore: add next theme and initial setup * chore: add dark mode colors to layouts * chore: user general setting page theming * chore: dashboard theming * chore: project page theming * chore: workspace setting page theming * chore: my issue page theming * chore: cmdk theming * chore: change hardcode bg and text color to theme * chore: change color name according to the design * style: fix card in the dashboard * style: fix merge conflict design issues * style: add light high contrast and dark high contrast * style: fix cmd k menu color and selection * feat: change theme from cmdk menu * chore: add multiple theme field to custom theme * chore: removed custom theming * fix: build error --------- Co-authored-by: Saheb Giri <iamsahebgiri@gmail.com>
61 lines
1.9 KiB
TypeScript
61 lines
1.9 KiB
TypeScript
import { useState, useEffect, ChangeEvent } from "react";
|
|
import { useTheme } from "next-themes";
|
|
import { THEMES_OBJ } from "constants/themes";
|
|
import { CustomSelect } from "components/ui";
|
|
import { CustomThemeModal } from "./custom-theme-modal";
|
|
|
|
export const ThemeSwitch = () => {
|
|
const [mounted, setMounted] = useState(false);
|
|
const [customThemeModal, setCustomThemeModal] = useState(false);
|
|
const { theme, setTheme } = useTheme();
|
|
|
|
// useEffect only runs on the client, so now we can safely show the UI
|
|
useEffect(() => {
|
|
setMounted(true);
|
|
}, []);
|
|
|
|
if (!mounted) {
|
|
return null;
|
|
}
|
|
|
|
return (
|
|
<>
|
|
<CustomSelect
|
|
value={theme}
|
|
label={theme ? THEMES_OBJ.find((t) => t.value === theme)?.label : "Select your theme"}
|
|
onChange={({ value, type }: { value: string; type: string }) => {
|
|
if (value === "custom") {
|
|
if (!customThemeModal) setCustomThemeModal(true);
|
|
} else {
|
|
const cssVars = [
|
|
"--color-bg-base",
|
|
"--color-bg-surface-1",
|
|
"--color-bg-surface-2",
|
|
|
|
"--color-border",
|
|
"--color-bg-sidebar",
|
|
"--color-accent",
|
|
|
|
"--color-text-base",
|
|
"--color-text-secondary",
|
|
];
|
|
cssVars.forEach((cssVar) => document.documentElement.style.removeProperty(cssVar));
|
|
}
|
|
document.documentElement.style.setProperty("color-scheme", type);
|
|
setTheme(value);
|
|
}}
|
|
input
|
|
width="w-full"
|
|
position="right"
|
|
>
|
|
{THEMES_OBJ.map(({ value, label, type }) => (
|
|
<CustomSelect.Option key={value} value={{ value, type }}>
|
|
{label}
|
|
</CustomSelect.Option>
|
|
))}
|
|
</CustomSelect>
|
|
{/* <CustomThemeModal isOpen={customThemeModal} handleClose={() => setCustomThemeModal(false)} /> */}
|
|
</>
|
|
);
|
|
};
|