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(!showSelect)}
+ className='dark-mode-toggle rounded-md dark:hover:bg-gray-700 p-1.5 hover:bg-gray-100 transition duration-150 '
+ >
+
+
+
{
+ setShowSelect(false);
+ }}
+ tabIndex={0}
+ >
+
setTheme('system')}>
+
+ System
+
+
setTheme('light')}>
+
+ Light
+
+
setTheme('dark')}>
+
+ 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 (