Skip to content

Commit 320b39d

Browse files
authored
Update site-header.tsx
dark mode feature added
1 parent 5fcfe1f commit 320b39d

File tree

1 file changed

+32
-6
lines changed

1 file changed

+32
-6
lines changed

site/components/site-header.tsx

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import { colors, mediaQueries, styleConstants } from '../util'
44
import { css } from '@emotion/react'
55
import { useRouter } from 'next/router'
66
import { Container } from './container'
7+
import {useState, useEffect} from'react'
8+
import { Moon, Sun } from 'lucide-react'
79

810
export const animatedUnderline = css({
911
'&::after': {
@@ -70,9 +72,8 @@ function UkraineBanner() {
7072
css={{
7173
fontWeight: 'bold',
7274
color: '#fff',
73-
fontSize: 20,
74-
75-
[mediaQueries.mdUp]: {
75+
fontSize: 20,
76+
[mediaQueries.mdUp]: {
7677
fontSize: 28
7778
}
7879
}}
@@ -83,13 +84,26 @@ function UkraineBanner() {
8384
</a>
8485
)
8586
}
86-
8787
export function SiteHeader() {
8888
const router = useRouter()
8989

9090
const path = router.asPath
9191
const onCommunityPage = path === '/docs/community'
92+
const [darkMode, setDarkMode] = useState(false);
93+
useEffect(() => {
94+
const isDark = localStorage.getItem('darkMode') === 'true';
95+
setDarkMode(isDark);
96+
if (isDark) {
97+
document.documentElement.classList.add('dark');
98+
}
99+
}, []);
92100

101+
const toggleDarkMode = () => {
102+
const newDarkMode = !darkMode;
103+
setDarkMode(newDarkMode);
104+
localStorage.setItem('darkMode', String(newDarkMode));
105+
document.documentElement.classList.toggle('dark');
106+
};
93107
return (
94108
<>
95109
<UkraineBanner />
@@ -100,7 +114,6 @@ export function SiteHeader() {
100114
boxShadow: '0 .125rem .25rem rgba(0, 0, 0, .075)',
101115
paddingTop: '0.25rem',
102116
marginBottom: '1.5rem',
103-
104117
[mediaQueries.mdUp]: {
105118
marginBottom: '2.5rem'
106119
}
@@ -153,7 +166,6 @@ export function SiteHeader() {
153166
css={{
154167
marginLeft: 'auto',
155168
overflowX: 'auto',
156-
157169
// For proper scrollbar placement on mobile. Note, mobile scrollbars
158170
// are pretty different between Safari and Chrome
159171
padding: '0.25rem 0'
@@ -170,6 +182,20 @@ export function SiteHeader() {
170182
listStyle: 'none'
171183
}}
172184
>
185+
186+
<li>
187+
<button
188+
onClick={toggleDarkMode}
189+
className="p-2 rounded-full hover:bg-gray-200 dark:hover:bg-gray-700 transition-colors"
190+
aria-label="Toggle dark mode"
191+
>
192+
{darkMode ? (
193+
<Sun className="h-5 w-5 text-gray-700 dark:text-gray-200" />
194+
) : (
195+
<Moon className="h-5 w-5 text-gray-700 dark:text-gray-200" />
196+
)}
197+
</button>
198+
</li>
173199
<li>
174200
<HeaderLink
175201
href="/docs"

0 commit comments

Comments
 (0)