import { extendTheme, type ThemeConfig } from "@chakra-ui/react";
export const LS_THEME_MODE = "nexbox-theme-mode";
export type ThemeMode = "light" | "dark" | "system";
export function isThemeMode(v: unknown): v is ThemeMode {
return v === "light" || v === "dark" || v === "system";
}
export function readInitialThemeMode(): ThemeMode {
try {
const m = localStorage.getItem(LS_THEME_MODE);
if (isThemeMode(m)) return m;
} catch {
}
return "system";
}
export function systemPrefersDark(): boolean {
try {
return window.matchMedia("(prefers-color-scheme: dark)").matches;
} catch {
return false;
}
}
export function resolveScheme(mode: ThemeMode): "light" | "dark" {
if (mode === "light") return "light";
if (mode === "dark") return "dark";
return systemPrefersDark() ? "dark" : "light";
}
function readInitialScheme(): "light" | "dark" {
return resolveScheme(readInitialThemeMode());
}
const config: ThemeConfig = {
initialColorMode: readInitialScheme(),
useSystemColorMode: false,
};
const theme = extendTheme({
config,
fonts: {
heading: 'var(--app-font-family, Inter), system-ui, sans-serif',
body: 'var(--app-font-family, Inter), system-ui, sans-serif',
},
colors: {
brand: {
50: "#eef2ff",
100: "#e0e7ff",
200: "#c7d2fe",
300: "#a5b4fc",
400: "#818cf8",
500: "#6366f1",
600: "#4f46e5",
700: "#4338ca",
800: "#3730a3",
900: "#312e81",
},
},
styles: {
global: (props: any) => ({
body: {
bg: props.colorMode === 'dark' ? '#000000' : '#f7fafc',
color: props.colorMode === 'dark' ? '#e0e0e0' : '#1a202c',
},
}),
},
components: {
Button: {
baseStyle: {
borderRadius: "lg",
fontWeight: "medium",
},
},
Card: {
baseStyle: {
container: {
borderRadius: "xl",
bg: undefined,
borderColor: undefined,
borderWidth: undefined,
},
},
},
Tooltip: {
baseStyle: {
bg: "var(--nexbox-tooltip-bg, #ffffff)",
color: "var(--nexbox-tooltip-fg, #1a1a1a)",
"--tooltip-bg": "var(--nexbox-tooltip-bg, #ffffff)",
"--tooltip-fg": "var(--nexbox-tooltip-fg, #1a1a1a)",
"--popper-arrow-bg": "var(--nexbox-tooltip-bg, #ffffff)",
px: "8px",
py: "2px",
borderRadius: "full",
fontWeight: "medium",
fontSize: "xs",
backdropFilter: "var(--nexbox-tooltip-blur, none)",
WebkitBackdropFilter: "var(--nexbox-tooltip-blur, none)",
border: "1px solid",
borderColor: "var(--nexbox-tooltip-border, rgba(0,0,0,0.10))",
maxW: "xs",
zIndex: "tooltip",
} as any,
defaultProps: {
closeOnMouseDown: true,
closeDelay: 0,
openDelay: 150,
} as any,
},
},
});
export default theme;