'use client'; import { ClientOnly, IconButton, Skeleton, Span, type IconButtonProps, type SpanProps, } from '@chakra-ui/react'; import * as React from 'react'; import { LuMoon, LuSun } from 'react-icons/lu'; export type ColorMode = 'light' | 'dark'; export interface UseColorModeReturn { colorMode: ColorMode; setColorMode: (colorMode: ColorMode) => void; toggleColorMode: () => void; } export interface ColorModeProviderProps { children: React.ReactNode; forcedTheme?: ColorMode; } const ColorModeContext = React.createContext(null); export function ColorModeProvider({ children, forcedTheme, }: ColorModeProviderProps) { const [colorMode, setColorModeState] = React.useState( forcedTheme ?? 'dark', ); React.useEffect(() => { if (!forcedTheme) { return; } setColorModeState(forcedTheme); }, [forcedTheme]); React.useEffect(() => { const root = document.documentElement; const nextColorMode = forcedTheme ?? colorMode; const previousColorMode = nextColorMode === 'dark' ? 'light' : 'dark'; root.classList.remove(previousColorMode); root.classList.add(nextColorMode); root.style.colorScheme = nextColorMode; }, [colorMode, forcedTheme]); const setColorMode = (nextColorMode: ColorMode) => { if (forcedTheme) { return; } setColorModeState(nextColorMode); }; const toggleColorMode = () => { setColorMode(colorMode === 'dark' ? 'light' : 'dark'); }; const value: UseColorModeReturn = { colorMode: forcedTheme ?? colorMode, setColorMode, toggleColorMode, }; return ( {children} ); } export function useColorMode(): UseColorModeReturn { return ( React.useContext(ColorModeContext) ?? { colorMode: 'dark', setColorMode: () => {}, toggleColorMode: () => {}, } ); } export function useColorModeValue(light: T, dark: T) { const { colorMode } = useColorMode(); return colorMode === 'dark' ? dark : light; } export function ColorModeIcon() { const { colorMode } = useColorMode(); return colorMode === 'dark' ? : ; } interface ColorModeButtonProps extends Omit {} export const ColorModeButton = React.forwardRef< HTMLButtonElement, ColorModeButtonProps >(function ColorModeButton(props, ref) { const { toggleColorMode } = useColorMode(); return ( }> ); }); export const LightMode = React.forwardRef( function LightMode(props, ref) { return ( ); }, ); export const DarkMode = React.forwardRef( function DarkMode(props, ref) { return ( ); }, );