diff options
| author | Armand Philippot <git@armandphilippot.com> | 2022-01-17 22:26:16 +0100 |
|---|---|---|
| committer | Armand Philippot <git@armandphilippot.com> | 2022-01-17 22:54:17 +0100 |
| commit | a6233863da4203bec781e817963ac3733279cab5 (patch) | |
| tree | b075753c4336b737d41c178451551c40c1016951 /src/components/ThemeToggle | |
| parent | 68138f0dcd8b3db2c23b31a20508726f245b5ba5 (diff) | |
refactor(settings): make toggle reusable
Toggle will be used for others settings so I extract the functionnality
from ThemeToggle.
Diffstat (limited to 'src/components/ThemeToggle')
| -rw-r--r-- | src/components/ThemeToggle/ThemeToggle.module.scss | 54 | ||||
| -rw-r--r-- | src/components/ThemeToggle/ThemeToggle.tsx | 45 |
2 files changed, 0 insertions, 99 deletions
diff --git a/src/components/ThemeToggle/ThemeToggle.module.scss b/src/components/ThemeToggle/ThemeToggle.module.scss deleted file mode 100644 index 74fb542..0000000 --- a/src/components/ThemeToggle/ThemeToggle.module.scss +++ /dev/null @@ -1,54 +0,0 @@ -@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; -} - -.title { - margin-right: var(--spacing-xs); -} - -.toggle { - display: inline-flex; - align-items: center; - width: var(--toggle-width); - height: var(--toggle-height); - background: var(--color-shadow-light); - border: fun.convert-px(1) solid var(--color-primary); - border-radius: fun.convert-px(32); - box-shadow: inset 0 0 fun.convert-px(3) 0 var(--color-shadow-dark); - 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), - 0 0 fun.convert-px(2) fun.convert-px(1) var(--color-shadow-light); - 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 deleted file mode 100644 index c44f6df..0000000 --- a/src/components/ThemeToggle/ThemeToggle.tsx +++ /dev/null @@ -1,45 +0,0 @@ -import { Form } from '@components/Form'; -import { MoonIcon, SunIcon } from '@components/Icons'; -import Spinner from '@components/Spinner/Spinner'; -import { t } from '@lingui/macro'; -import { useTheme } from 'next-themes'; -import { FormEvent, useEffect, useState } from 'react'; -import styles from './ThemeToggle.module.scss'; - -const ThemeToggle = () => { - const [isMounted, setIsMounted] = useState<boolean>(false); - const { resolvedTheme, setTheme } = useTheme(); - - useEffect(() => { - setIsMounted(true); - }, []); - - const onSubmit = (e: FormEvent) => { - e.preventDefault(); - }; - - if (!isMounted) return <Spinner />; - - const isDarkTheme = resolvedTheme === 'dark'; - - return ( - <Form modifier="theme" submitHandler={onSubmit}> - <input - className={styles.checkbox} - type="checkbox" - id="dark-theme" - name="dark-theme" - checked={isDarkTheme} - onChange={() => setTheme(isDarkTheme ? 'light' : 'dark')} - /> - <label htmlFor="dark-theme" className={styles.label}> - <span className={styles.title}>{t`Theme:`}</span> - <SunIcon /> - <span className={styles.toggle}></span> - <MoonIcon /> - </label> - </Form> - ); -}; - -export default ThemeToggle; |
