@@ -4,6 +4,8 @@ import { colors, mediaQueries, styleConstants } from '../util'
44import { css } from '@emotion/react'
55import { useRouter } from 'next/router'
66import { Container } from './container'
7+ import { useState , useEffect } from 'react'
8+ import { Moon , Sun } from 'lucide-react'
79
810export 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-
8787export 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