diff options
| author | Armand Philippot <git@armandphilippot.com> | 2022-01-17 23:08:44 +0100 |
|---|---|---|
| committer | Armand Philippot <git@armandphilippot.com> | 2022-01-17 23:08:44 +0100 |
| commit | d42f9e348261fd1738e7977db89b06007ec8da10 (patch) | |
| tree | 9aa456ecc1e5a51c64def22fd6c020aaa0d45536 | |
| parent | 24d617d2ace0d68ee559ec34e888bf34493b9cf9 (diff) | |
feat: add a setting to disable animations and transitions
Some users may not know the reduced motion settings, so I provide an
option directly on the website to disable animations.
| -rw-r--r-- | src/components/Settings/ReduceMotion/ReduceMotion.tsx | 35 | ||||
| -rw-r--r-- | src/components/Settings/Settings.tsx | 2 | ||||
| -rw-r--r-- | src/styles/base/_helpers.scss | 8 |
3 files changed, 45 insertions, 0 deletions
diff --git a/src/components/Settings/ReduceMotion/ReduceMotion.tsx b/src/components/Settings/ReduceMotion/ReduceMotion.tsx new file mode 100644 index 0000000..01f8b67 --- /dev/null +++ b/src/components/Settings/ReduceMotion/ReduceMotion.tsx @@ -0,0 +1,35 @@ +import { Toggle } from '@components/Form'; +import { t } from '@lingui/macro'; +import { LocalStorage } from '@services/local-storage'; +import { useEffect, useState } from 'react'; + +const ReduceMotion = () => { + const [isDeactivated, setIsDeactivated] = useState<boolean>(false); + + useEffect(() => { + const initialState = LocalStorage.get('reduced-motion'); + if (initialState) setIsDeactivated(initialState === 'true' ? true : false); + }, []); + + useEffect(() => { + document.documentElement.dataset.reducedMotion = `${isDeactivated}`; + LocalStorage.set('reduced-motion', `${isDeactivated}`); + }, [isDeactivated]); + + const updateState = () => { + setIsDeactivated(!isDeactivated); + }; + + return ( + <Toggle + id="reduced-motion" + label={t`Animations:`} + leftChoice={t`On`} + rightChoice={t`Off`} + value={isDeactivated} + changeHandler={updateState} + /> + ); +}; + +export default ReduceMotion; diff --git a/src/components/Settings/Settings.tsx b/src/components/Settings/Settings.tsx index 7d5516c..bd2f33d 100644 --- a/src/components/Settings/Settings.tsx +++ b/src/components/Settings/Settings.tsx @@ -1,6 +1,7 @@ import { CogIcon } from '@components/Icons'; import ThemeToggle from '@components/Settings/ThemeToggle/ThemeToggle'; import { t } from '@lingui/macro'; +import ReduceMotion from './ReduceMotion/ReduceMotion'; import styles from './Settings.module.scss'; const Settings = () => { @@ -10,6 +11,7 @@ const Settings = () => { <CogIcon /> {t`Settings`} </div> <ThemeToggle /> + <ReduceMotion /> </> ); }; diff --git a/src/styles/base/_helpers.scss b/src/styles/base/_helpers.scss index 9fe2bd4..65f06d8 100644 --- a/src/styles/base/_helpers.scss +++ b/src/styles/base/_helpers.scss @@ -44,6 +44,14 @@ @include mix.motion("reduce") { * { + animation: none !important; + transition: none !important; + } +} + +[data-reduced-motion="true"] { + * { + animation: none !important; transition: none !important; } } |
