{"version":3,"sources":["../src/color-mode-provider.tsx"],"sourcesContent":["import { useSafeLayoutEffect } from \"@chakra-ui/react-use-safe-layout-effect\"\nimport { useCallback, useEffect, useMemo, useState } from \"react\"\nimport { ColorModeContext } from \"./color-mode-context\"\nimport {\n ColorMode,\n ColorModeContextType,\n ColorModeOptions,\n} from \"./color-mode-types\"\nimport { getColorModeUtils } from \"./color-mode.utils\"\nimport { localStorageManager, StorageManager } from \"./storage-manager\"\n\nconst noop = () => {}\n\nexport interface ColorModeProviderProps {\n value?: ColorMode\n children?: React.ReactNode\n options?: ColorModeOptions\n colorModeManager?: StorageManager\n}\n\nfunction getTheme(manager: StorageManager, fallback?: ColorMode) {\n return manager.type === \"cookie\" && manager.ssr\n ? manager.get(fallback)\n : fallback\n}\n\n/**\n * Provides context for the color mode based on config in `theme`\n * Returns the color mode and function to toggle the color mode\n */\nexport function ColorModeProvider(props: ColorModeProviderProps) {\n const {\n value,\n children,\n options: {\n useSystemColorMode,\n initialColorMode,\n disableTransitionOnChange,\n } = {},\n colorModeManager = localStorageManager,\n } = props\n\n const defaultColorMode = initialColorMode === \"dark\" ? \"dark\" : \"light\"\n\n const [colorMode, rawSetColorMode] = useState(() =>\n getTheme(colorModeManager, defaultColorMode),\n )\n\n const [resolvedColorMode, setResolvedColorMode] = useState(() =>\n getTheme(colorModeManager),\n )\n\n const { getSystemTheme, setClassName, setDataset, addListener } = useMemo(\n () => getColorModeUtils({ preventTransition: disableTransitionOnChange }),\n [disableTransitionOnChange],\n )\n\n const resolvedValue =\n initialColorMode === \"system\" && !colorMode ? resolvedColorMode : colorMode\n\n const setColorMode = useCallback(\n (value: ColorMode | \"system\") => {\n //\n const resolved = value === \"system\" ? getSystemTheme() : value\n rawSetColorMode(resolved)\n\n setClassName(resolved === \"dark\")\n setDataset(resolved)\n\n colorModeManager.set(resolved)\n },\n [colorModeManager, getSystemTheme, setClassName, setDataset],\n )\n\n useSafeLayoutEffect(() => {\n if (initialColorMode === \"system\") {\n setResolvedColorMode(getSystemTheme())\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n useEffect(() => {\n const managerValue = colorModeManager.get()\n\n if (managerValue) {\n setColorMode(managerValue)\n return\n }\n\n if (initialColorMode === \"system\") {\n setColorMode(\"system\")\n return\n }\n\n setColorMode(defaultColorMode)\n }, [colorModeManager, defaultColorMode, initialColorMode, setColorMode])\n\n const toggleColorMode = useCallback(() => {\n setColorMode(resolvedValue === \"dark\" ? \"light\" : \"dark\")\n }, [resolvedValue, setColorMode])\n\n useEffect(() => {\n if (!useSystemColorMode) return\n return addListener(setColorMode)\n }, [useSystemColorMode, addListener, setColorMode])\n\n // presence of `value` indicates a controlled context\n const context = useMemo(\n () => ({\n colorMode: value ?? (resolvedValue as ColorMode),\n toggleColorMode: value ? noop : toggleColorMode,\n setColorMode: value ? noop : setColorMode,\n forced: value !== undefined,\n }),\n [resolvedValue, toggleColorMode, setColorMode, value],\n )\n\n return (\n \n {children}\n \n )\n}\n\nColorModeProvider.displayName = \"ColorModeProvider\"\n\n/**\n * Locks the color mode to `dark`, without any way to change it.\n */\nexport function DarkMode(props: React.PropsWithChildren<{}>) {\n const context = useMemo(\n () => ({\n colorMode: \"dark\",\n toggleColorMode: noop,\n setColorMode: noop,\n forced: true,\n }),\n [],\n )\n\n return \n}\n\nDarkMode.displayName = \"DarkMode\"\n\n/**\n * Locks the color mode to `light` without any way to change it.\n */\nexport function LightMode(props: React.PropsWithChildren<{}>) {\n const context = useMemo(\n () => ({\n colorMode: \"light\",\n toggleColorMode: noop,\n setColorMode: noop,\n forced: true,\n }),\n [],\n )\n\n return \n}\n\nLightMode.displayName = \"LightMode\"\n"],"mappings":"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","names":["value"]}