Skip to content

Commit e7f2d35

Browse files
committed
feat: light/dark mode control
1 parent e4a2f34 commit e7f2d35

File tree

2 files changed

+37
-0
lines changed

2 files changed

+37
-0
lines changed
+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import React, {useCallback} from 'react'
2+
import {SegmentedControl} from '@primer/react'
3+
import {DeviceDesktopIcon, MoonIcon, SunIcon} from '@primer/octicons-react'
4+
5+
const MODE_ICONS = [
6+
{id: 'auto', name: 'System', icon: DeviceDesktopIcon},
7+
{id: 'day', name: 'Day', icon: SunIcon},
8+
{id: 'night', name: 'Night', icon: MoonIcon},
9+
]
10+
11+
export const ColorPreferencePicker = ({preferredColorMode, setColorPreference}) => {
12+
const handleColorModeChange = useCallback(
13+
modeIndex => {
14+
const mode = MODE_ICONS[modeIndex].id
15+
setColorPreference(mode)
16+
},
17+
[setColorPreference],
18+
)
19+
20+
return (
21+
<SegmentedControl onChange={handleColorModeChange} aria-label="Color mode">
22+
{MODE_ICONS.map((mode, index) => (
23+
<SegmentedControl.IconButton
24+
icon={mode.icon}
25+
aria-label={mode.name}
26+
key={index}
27+
selected={mode.id === preferredColorMode}
28+
></SegmentedControl.IconButton>
29+
))}
30+
</SegmentedControl>
31+
)
32+
}

src/components/header.js

+5
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,17 @@ import {HEADER_HEIGHT, HEADER_BAR} from '../constants'
99
import headerNavItems from '../../content/header-nav.yml'
1010
import {DarkTheme} from '../theme'
1111
import SiteTitle from './site-title'
12+
import {ColorPreferencePicker} from './color-preference-picker'
13+
import {useColorPreference} from '../hooks/use-color-preference'
1214

1315
const NpmHeaderBar = styled(Box)`
1416
height: ${HEADER_BAR}px;
1517
background-image: linear-gradient(139deg, #fb8817, #ff4b01, #c12127, #e02aff);
1618
`
1719

1820
function Header() {
21+
const {preferredColorMode, setColorPreference} = useColorPreference()
22+
1923
const search = useSearch()
2024

2125
return (
@@ -43,6 +47,7 @@ function Header() {
4347
</Box>
4448
</Box>
4549
<Box sx={{display: 'flex'}}>
50+
<ColorPreferencePicker preferredColorMode={preferredColorMode} setColorPreference={setColorPreference} />
4651
<Box sx={{display: ['none', null, null, 'flex'], alignItems: 'center'}}>
4752
{headerNavItems.map((item, index) => (
4853
<Link key={index} href={item.url} sx={{display: 'block', ml: 4, color: 'fg.default'}}>

0 commit comments

Comments
 (0)