diff --git a/components/DarkModeToggle.tsx b/components/DarkModeToggle.tsx index 16ea1e8f8..d45169780 100644 --- a/components/DarkModeToggle.tsx +++ b/components/DarkModeToggle.tsx @@ -2,39 +2,100 @@ import { useTheme } from 'next-themes'; import { useEffect, useState } from 'react'; import React from 'react'; -export default function DarkModeToggle() { - const { theme, setTheme } = useTheme(); - const [isDarkMode, setIsDarkMode] = useState(theme === 'dark'); - const [isClickable, setIsClickable] = useState(true); - const [img, setImg] = useState('/icons/moon.svg'); - - const toggleDarkMode = () => { - if (!isClickable) return; - - setIsClickable(false); - const newTheme = isDarkMode ? 'light' : 'dark'; - setTheme(newTheme); - setIsDarkMode(!isDarkMode); +function ListItem({ + children, + onClick, +}: { + children: React.ReactNode; + onClick: () => void; +}) { + return ( +
+ {children} +
+ ); +} - setTimeout(() => { - setIsClickable(true); - }, 500); - }; +export default function DarkModeToggle() { + const { theme, setTheme, resolvedTheme } = useTheme(); + const [isDarkMode, setIsDarkMode] = useState(false); useEffect(() => { - if (!theme) setTheme('light'); + setIsDarkMode(resolvedTheme === 'dark'); + }, [resolvedTheme]); - const img = theme === 'dark' ? '/icons/sun.svg' : '/icons/moon.svg'; - setImg(img); - }, [theme, setTheme]); + const [showSelect, setShowSelect] = useState(false); + const [activeThemeIcon, setActiveThemeIcon] = useState(''); + useEffect(() => { + switch (theme) { + case 'system': + return setActiveThemeIcon('/icons/theme-switch.svg'); + case 'light': + return setActiveThemeIcon('/icons/sun.svg'); + case 'dark': + return setActiveThemeIcon('/icons/moon.svg'); + } + }, [theme, resolvedTheme]); return ( - +
+ +
{ + setShowSelect(false); + }} + tabIndex={0} + > + setTheme('system')}> + System theme + System + + setTheme('light')}> + System theme + Light + + setTheme('dark')}> + System theme + Dark + +
+
); } diff --git a/components/Layout.tsx b/components/Layout.tsx index fb13a6a65..8c019d55e 100644 --- a/components/Layout.tsx +++ b/components/Layout.tsx @@ -164,26 +164,29 @@ const MainNavigation = () => { const section = useContext(SectionContext); const showMobileNav = useStore((s: any) => s.overlayNavigation === 'docs'); - const { theme } = useTheme(); + const { resolvedTheme, theme } = useTheme(); const [icon, setIcon] = useState(''); const [menu, setMenu] = useState('bg-black'); const [closeMenu, setCLoseMenu] = useState('url("/icons/cancel.svg")'); useEffect(() => { const icon = theme === 'dark' ? 'herobtn' : ''; - const menu = theme === 'dark' ? 'bg-white' : 'bg-black'; - const dataTheme = theme === 'dark' ? 'dark' : 'light'; + const menu = resolvedTheme === 'dark' ? 'bg-white' : 'bg-black'; + const dataTheme = resolvedTheme === 'dark' ? 'dark' : 'light'; const closeMenu = - theme === 'dark' + resolvedTheme === 'dark' ? 'url("/icons/cancel-dark.svg")' : 'url("/icons/cancel.svg")'; document.documentElement.setAttribute('data-theme', dataTheme); - document.documentElement.setAttribute('class', 'keygrad keyshadow'); + document.documentElement.setAttribute( + 'class', + `keygrad keyshadow ${dataTheme}`, + ); setIcon(icon); setMenu(menu); setCLoseMenu(closeMenu); - }, [theme]); + }, [theme, resolvedTheme]); return (
@@ -402,16 +405,16 @@ const Footer = () => ( ); const Logo = () => { - const { theme } = useTheme(); + const { resolvedTheme } = useTheme(); const [imageSrc, setImageSrc] = useState('/img/logos/logo-blue.svg'); // Default to match the server-side render useEffect(() => { const src = - theme === 'dark' + resolvedTheme === 'dark' ? '/img/logos/logo-white.svg' : '/img/logos/logo-blue.svg'; setImageSrc(src); - }, [theme]); + }, [resolvedTheme]); return (
diff --git a/components/Sidebar.tsx b/components/Sidebar.tsx index cfec6dc8a..0ba798716 100644 --- a/components/Sidebar.tsx +++ b/components/Sidebar.tsx @@ -281,7 +281,7 @@ export const DocsNav = ({ const rotateR = active.getReference ? 'rotate(180deg)' : 'rotate(0)'; const rotateSpec = active.getSpecification ? 'rotate(180deg)' : 'rotate(0)'; - const { theme } = useTheme(); + const { resolvedTheme } = useTheme(); const [learn_icon, setLearn_icon] = useState(''); const [reference_icon, setReference_icon] = useState(''); @@ -289,7 +289,7 @@ export const DocsNav = ({ const [overview_icon, setOverview_icon] = useState(''); useEffect(() => { - if (theme === 'dark') { + if (resolvedTheme === 'dark') { setOverview_icon('/icons/eye-dark.svg'); setLearn_icon('/icons/compass-dark.svg'); setReference_icon('/icons/book-dark.svg'); @@ -300,7 +300,7 @@ export const DocsNav = ({ setReference_icon('/icons/book.svg'); setSpec_icon('/icons/clipboard.svg'); } - }, [theme]); + }, [resolvedTheme]); return (