2020-05-22 14:38:19 +02:00
|
|
|
import React, { ReactElement } from 'react'
|
2020-04-11 23:37:19 +02:00
|
|
|
import { Helmet } from 'react-helmet'
|
2019-10-03 19:18:01 +02:00
|
|
|
import useDarkMode from 'use-dark-mode'
|
2021-03-06 01:35:05 +01:00
|
|
|
import * as styles from './ThemeSwitch.module.css'
|
2019-11-15 22:10:53 +01:00
|
|
|
import Icon from '../atoms/Icon'
|
2019-12-14 15:46:43 +01:00
|
|
|
import { useSiteMetadata } from '../../hooks/use-site-metadata'
|
2019-10-03 19:18:01 +02:00
|
|
|
|
|
|
|
const ThemeToggleInput = ({
|
|
|
|
isDark,
|
|
|
|
toggleDark
|
|
|
|
}: {
|
|
|
|
isDark: boolean
|
|
|
|
toggleDark(): void
|
|
|
|
}) => (
|
|
|
|
<input
|
|
|
|
onChange={toggleDark}
|
|
|
|
type="checkbox"
|
|
|
|
name="toggle"
|
|
|
|
value="toggle"
|
|
|
|
aria-describedby="toggle"
|
|
|
|
checked={isDark}
|
|
|
|
/>
|
|
|
|
)
|
|
|
|
|
2019-11-24 14:29:25 +01:00
|
|
|
const HeadMarkup = ({ themeColor }: { themeColor: string }) => (
|
|
|
|
<Helmet>
|
|
|
|
<meta name="theme-color" content={themeColor} />
|
|
|
|
<meta
|
|
|
|
name="apple-mobile-web-app-status-bar-style"
|
|
|
|
content="black-translucent"
|
|
|
|
/>
|
|
|
|
</Helmet>
|
|
|
|
)
|
|
|
|
|
2020-05-22 14:38:19 +02:00
|
|
|
export default function ThemeSwitch(): ReactElement {
|
2019-12-14 15:46:43 +01:00
|
|
|
const { darkModeConfig } = useSiteMetadata()
|
|
|
|
const darkMode = useDarkMode(false, darkModeConfig)
|
2019-11-09 19:20:39 +01:00
|
|
|
const themeColor = darkMode.value ? '#1d2224' : '#e7eef4'
|
|
|
|
|
2019-10-03 19:18:01 +02:00
|
|
|
return (
|
2019-11-09 19:20:39 +01:00
|
|
|
<>
|
2019-11-24 14:29:25 +01:00
|
|
|
<HeadMarkup themeColor={themeColor} />
|
2020-04-04 10:34:19 +02:00
|
|
|
<aside className={styles.themeSwitch} title="Toggle Dark Mode">
|
2019-11-09 19:20:39 +01:00
|
|
|
<label
|
|
|
|
htmlFor="toggle"
|
|
|
|
className={styles.checkbox}
|
|
|
|
onClick={darkMode.toggle}
|
2019-12-09 22:49:41 +01:00
|
|
|
onKeyPress={darkMode.toggle}
|
|
|
|
role="presentation"
|
2019-11-09 19:20:39 +01:00
|
|
|
>
|
|
|
|
<span className={styles.label}>Toggle Dark Mode</span>
|
|
|
|
<ThemeToggleInput
|
|
|
|
isDark={darkMode.value}
|
|
|
|
toggleDark={darkMode.toggle}
|
|
|
|
/>
|
2020-04-04 10:34:19 +02:00
|
|
|
<div aria-live="assertive">
|
|
|
|
{darkMode.value ? <Icon name="Sun" /> : <Icon name="Moon" />}
|
|
|
|
</div>
|
2019-11-09 19:20:39 +01:00
|
|
|
</label>
|
|
|
|
</aside>
|
|
|
|
</>
|
2019-10-03 19:18:01 +02:00
|
|
|
)
|
|
|
|
}
|