"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) => , )