diff options
Diffstat (limited to 'src/components/ThemeToggle')
| -rw-r--r-- | src/components/ThemeToggle/ThemeToggle.module.scss | 50 | ||||
| -rw-r--r-- | src/components/ThemeToggle/ThemeToggle.tsx | 34 |
2 files changed, 84 insertions, 0 deletions
diff --git a/src/components/ThemeToggle/ThemeToggle.module.scss b/src/components/ThemeToggle/ThemeToggle.module.scss new file mode 100644 index 0000000..c780b96 --- /dev/null +++ b/src/components/ThemeToggle/ThemeToggle.module.scss @@ -0,0 +1,50 @@ +@use "@styles/abstracts/functions" as fun; + +.label { + --icon-size: #{fun.convert-px(25)}; + --toggle-width: #{fun.convert-px(45)}; + --toggle-height: calc(var(--toggle-width) / 2); + + display: inline-flex; + align-items: center; +} + +.toggle { + display: inline-flex; + align-items: center; + width: var(--toggle-width); + height: var(--toggle-height); + background: var(--color-shadow-lighter); + border: fun.convert-px(1) solid var(--color-primary); + border-radius: fun.convert-px(32); + box-shadow: inset 0 0 2px 0 var(--color-shadow); + margin: 0 var(--spacing-2xs); + position: relative; + + &::after { + content: ""; + display: block; + width: calc(var(--toggle-width) / 2); + height: calc(var(--toggle-width) / 2); + background: var(--color-primary-lighter); + border: fun.convert-px(1) solid var(--color-primary); + border-radius: 50%; + box-shadow: inset 0 0 fun.convert-px(1) fun.convert-px(1) + var(--color-shadow-light), + 0 0 fun.convert-px(2) fun.convert-px(1) var(--color-shadow-lighter); + position: absolute; + left: fun.convert-px(-2); + transition: all 0.3s ease-in-out 0s; + } +} + +.checkbox { + position: absolute; + opacity: 0; + + &:checked ~ .label { + .toggle::after { + left: calc(100% - (var(--toggle-width) / 2) + #{fun.convert-px(2)}); + } + } +} diff --git a/src/components/ThemeToggle/ThemeToggle.tsx b/src/components/ThemeToggle/ThemeToggle.tsx new file mode 100644 index 0000000..015201b --- /dev/null +++ b/src/components/ThemeToggle/ThemeToggle.tsx @@ -0,0 +1,34 @@ +import { Form } from '@components/Form'; +import { MoonIcon, SunIcon } from '@components/Icons'; +import { t } from '@lingui/macro'; +import { FormEvent, useState } from 'react'; +import styles from './ThemeToggle.module.scss'; + +const ThemeToggle = () => { + const [isDarkTheme, setIsDarkTheme] = useState<boolean>(false); + + const onSubmit = (e: FormEvent) => { + e.preventDefault(); + }; + + return ( + <Form modifier="theme" submitHandler={onSubmit}> + <input + className={styles.checkbox} + type="checkbox" + id="dark-theme" + name="dark-theme" + checked={isDarkTheme} + onChange={() => setIsDarkTheme(!isDarkTheme)} + /> + <label htmlFor="dark-theme" className={styles.label}> + <span className="screen-reader-text">{t`Activate dark theme`}</span> + <SunIcon /> + <span className={styles.toggle}></span> + <MoonIcon /> + </label> + </Form> + ); +}; + +export default ThemeToggle; |
