@@ -37,12 +37,6 @@ const getModeName = (mode) => {
37
37
38
38
export default function DocsLayout ( props ) {
39
39
const [ menuOpen , setMenuOpen ] = useState ( false )
40
- const [ mode , setMode ] = useColorMode ( )
41
- const [ hydrated , setHydrated ] = useState ( false )
42
-
43
- useEffect ( ( ) => {
44
- setHydrated ( true )
45
- } , [ ] )
46
40
47
41
const { pathname } = props . location
48
42
const isLanding = pathname === '/'
@@ -53,8 +47,6 @@ export default function DocsLayout(props) {
53
47
54
48
const showNav = ! props . pageContext ?. frontmatter ?. hidenav
55
49
56
- const nextColorMode = modes [ ( modes . indexOf ( mode ) + 1 ) % modes . length ]
57
-
58
50
return (
59
51
< Fragment >
60
52
< Head { ...props } />
@@ -95,16 +87,7 @@ export default function DocsLayout(props) {
95
87
< NavLink href = "https://github.com/system-ui/theme-ui" >
96
88
GitHub
97
89
</ NavLink >
98
- < Button
99
- aria-label = { `Change color mode to ${ nextColorMode } ` }
100
- sx = { {
101
- ml : 2 ,
102
- whiteSpace : 'pre' ,
103
- } }
104
- onClick = { ( ) => setMode ( nextColorMode ) }
105
- >
106
- { getModeName ( hydrated ? mode : undefined ) }
107
- </ Button >
90
+ < ColorModeSwitcher />
108
91
</ Flex >
109
92
</ Flex >
110
93
</ Flex >
@@ -209,3 +192,27 @@ function HeaderScrollShadow() {
209
192
/>
210
193
)
211
194
}
195
+
196
+ function ColorModeSwitcher ( ) {
197
+ const [ mode , setMode ] = useColorMode ( )
198
+ const [ hydrated , setHydrated ] = useState ( false )
199
+
200
+ useEffect ( ( ) => {
201
+ setHydrated ( true )
202
+ } , [ ] )
203
+
204
+ const nextColorMode = modes [ ( modes . indexOf ( mode ) + 1 ) % modes . length ]
205
+
206
+ return (
207
+ < Button
208
+ aria-label = { `Change color mode to ${ nextColorMode } ` }
209
+ sx = { {
210
+ ml : 2 ,
211
+ whiteSpace : 'pre' ,
212
+ } }
213
+ onClick = { ( ) => setMode ( nextColorMode ) }
214
+ >
215
+ { getModeName ( hydrated ? mode : undefined ) }
216
+ </ Button >
217
+ )
218
+ }
0 commit comments