{"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    <ColorModeContext.Provider value={context}>\n      {children}\n    </ColorModeContext.Provider>\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<ColorModeContextType>(\n    () => ({\n      colorMode: \"dark\",\n      toggleColorMode: noop,\n      setColorMode: noop,\n      forced: true,\n    }),\n    [],\n  )\n\n  return <ColorModeContext.Provider value={context} {...props} />\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<ColorModeContextType>(\n    () => ({\n      colorMode: \"light\",\n      toggleColorMode: noop,\n      setColorMode: noop,\n      forced: true,\n    }),\n    [],\n  )\n\n  return <ColorModeContext.Provider value={context} {...props} />\n}\n\nLightMode.displayName = \"LightMode\"\n"],"mappings":"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","names":["value"]}