"use client"
import type { IconButtonProps, SpanProps } from "@chakra-ui/react"
import { IconButton, Span, ButtonGroup } from "@chakra-ui/react"
import { ThemeProvider, useTheme } from "next-themes"
import type { ThemeProviderProps } from "next-themes"
import * as React from "react"
import { LuMoon, LuSun } from "react-icons/lu"
export interface ColorModeProviderProps extends ThemeProviderProps {}
export const ColorModeProvider = (props: ColorModeProviderProps) => ;
export type ColorMode = "light" | "dark"
export interface UseColorModeReturn {
colorMode: ColorMode
setColorMode: (colorMode: ColorMode) => void
toggleColorMode: (remove?: boolean) => void
systemTheme: ColorMode | undefined
theme?: string
}
export const useColorMode = (): UseColorModeReturn => {
const { resolvedTheme, setTheme, forcedTheme, systemTheme, theme } = useTheme()
const colorMode = forcedTheme || resolvedTheme
//console.log(`Use Color Mode -- system theme: ${systemTheme} | Used Theme ${theme} | Color mode ${colorMode}`);
const toggleColorMode = () => {
// https://lea.verou.me/blog/2026/dark-mode-toggles/#good-two-state-ux
// only change override (or remove) if *user* initiated
// dont do anything if system theme changes
const inverseTheme = resolvedTheme === 'dark' ? 'light' : 'dark';
// if user-initiated toggle
//
// and is going back to system theme
if(systemTheme === inverseTheme) {
// then remove override
setTheme('system');
localStorage.removeItem('theme');
console.debug('removed theme override');
} else {
// otherwise, going to non-system theme
// add override
setTheme(inverseTheme);
console.debug(`setting theme override to ${inverseTheme}`);
}
}
return {
colorMode: colorMode as ColorMode,
setColorMode: setTheme,
toggleColorMode,
systemTheme,
theme
}
};
export const useColorModeValue = (light: T, dark: T) => {
const { colorMode } = useColorMode()
return colorMode === "dark" ? dark : light
};
export const ColorModeIcon = () => {
const { colorMode } = useColorMode()
return colorMode === "dark" ? :
};
interface ColorModeButtonProps extends Omit {}
export const ColorModeButton = React.forwardRef<
HTMLButtonElement,
ColorModeButtonProps
>((props, ref) => {
const { toggleColorMode } = useColorMode();
const toggleButton = (
toggleColorMode()}
variant="ghost"
aria-label="Toggle color mode"
size="sm"
ref={ref}
{...props}
css={{
_icon: {
width: "5",
height: "5",
},
}}
>
);
return (
{toggleButton}
)
});
export const LightMode = React.forwardRef(
(props, ref) => ,
)
export const DarkMode = React.forwardRef(
(props, ref) => ,
)