diff --git a/packages/docusaurus-theme-classic/src/theme-classic.d.ts b/packages/docusaurus-theme-classic/src/theme-classic.d.ts index 94c48ac9d3..e2256a4882 100644 --- a/packages/docusaurus-theme-classic/src/theme-classic.d.ts +++ b/packages/docusaurus-theme-classic/src/theme-classic.d.ts @@ -746,12 +746,16 @@ declare module '@theme/TOCCollapsible' { } declare module '@theme/ColorModeToggle' { - import type {SyntheticEvent} from 'react'; + import type {ColorMode} from '@docusaurus/theme-common'; export interface Props { readonly className?: string; - readonly checked: boolean; - readonly onChange: (e: SyntheticEvent) => void; + readonly value: ColorMode; + /** + * The parameter represents the "to-be" value. For example, if currently in + * dark mode, clicking the button should call `onChange("light")` + */ + readonly onChange: (colorMode: ColorMode) => void; } export default function Toggle(props: Props): JSX.Element; diff --git a/packages/docusaurus-theme-classic/src/theme/ColorModeToggle/index.tsx b/packages/docusaurus-theme-classic/src/theme/ColorModeToggle/index.tsx index e23c39571e..e119f2ae33 100644 --- a/packages/docusaurus-theme-classic/src/theme/ColorModeToggle/index.tsx +++ b/packages/docusaurus-theme-classic/src/theme/ColorModeToggle/index.tsx @@ -5,7 +5,7 @@ * LICENSE file in the root directory of this source tree. */ -import React, {useState, useRef, useEffect} from 'react'; +import React from 'react'; import type {Props} from '@theme/ColorModeToggle'; import useIsBrowser from '@docusaurus/useIsBrowser'; import {translate} from '@docusaurus/Translate'; @@ -15,78 +15,51 @@ import IconDarkMode from '@theme/IconDarkMode'; import clsx from 'clsx'; import styles from './styles.module.css'; -function ColorModeToggle({ - className, - checked: defaultChecked, - onChange, -}: Props): JSX.Element { +function ColorModeToggle({className, value, onChange}: Props): JSX.Element { const isBrowser = useIsBrowser(); - const [checked, setChecked] = useState(defaultChecked); - const [focused, setFocused] = useState(false); - const inputRef = useRef(null); - useEffect(() => { - setChecked(defaultChecked); - }, [defaultChecked]); + const title = translate( + { + message: 'Switch between dark and light mode (currently {mode})', + id: 'theme.colorToggle.ariaLabel', + description: 'The ARIA label for the navbar color mode toggle', + }, + { + mode: + value === 'dark' + ? translate({ + message: 'dark mode', + id: 'theme.colorToggle.ariaLabel.mode.dark', + description: 'The name for the dark color mode', + }) + : translate({ + message: 'light mode', + id: 'theme.colorToggle.ariaLabel.mode.light', + description: 'The name for the light color mode', + }), + }, + ); return ( -
- {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events */} -
inputRef.current?.click()}> +
+
- - setChecked(!checked)} - onFocus={() => setFocused(true)} - onBlur={() => setFocused(false)} - onKeyDown={(e) => { - if (e.key === 'Enter') { - inputRef.current?.click(); - } - }} - /> +
); } diff --git a/packages/docusaurus-theme-classic/src/theme/ColorModeToggle/styles.module.css b/packages/docusaurus-theme-classic/src/theme/ColorModeToggle/styles.module.css index a5a7bfb737..37463e0fb3 100644 --- a/packages/docusaurus-theme-classic/src/theme/ColorModeToggle/styles.module.css +++ b/packages/docusaurus-theme-classic/src/theme/ColorModeToggle/styles.module.css @@ -6,28 +6,11 @@ */ .toggle { - position: relative; - width: 32px; - height: 32px; -} - -.toggleScreenReader { - border: 0; - clip: rect(0 0 0 0); - height: 1px; - margin: -1px; - overflow: hidden; - position: absolute; - width: 1px; -} - -.toggleDisabled { - cursor: not-allowed; + width: 2rem; + height: 2rem; } .toggleButton { - cursor: pointer; - user-select: none; -webkit-tap-highlight-color: transparent; align-items: center; display: flex; @@ -35,17 +18,18 @@ width: 100%; height: 100%; border-radius: 50%; + transition: background var(--ifm-transition-fast); } .toggleButton:hover { - background-color: #00000010; -} - -[data-theme='dark'] .toggleButton:hover { - background-color: #ffffff20; + background: var(--ifm-color-emphasis-200); } [data-theme='light'] .darkToggleIcon, [data-theme='dark'] .lightToggleIcon { display: none; } + +.toggleButtonDisabled { + cursor: not-allowed; +} diff --git a/packages/docusaurus-theme-classic/src/theme/Navbar/index.tsx b/packages/docusaurus-theme-classic/src/theme/Navbar/index.tsx index ef4c865e00..1693bb44c7 100644 --- a/packages/docusaurus-theme-classic/src/theme/Navbar/index.tsx +++ b/packages/docusaurus-theme-classic/src/theme/Navbar/index.tsx @@ -88,12 +88,12 @@ function useColorModeToggle() { const { colorMode: {disableSwitch}, } = useThemeConfig(); - const {isDarkTheme, setLightTheme, setDarkTheme} = useColorMode(); - const toggle = useCallback( - (e) => (e.target.checked ? setDarkTheme() : setLightTheme()), - [setLightTheme, setDarkTheme], - ); - return {isDarkTheme, toggle, disabled: disableSwitch}; + const {colorMode, setColorMode} = useColorMode(); + return { + value: colorMode, + onChange: setColorMode, + disabled: disableSwitch, + }; } function useSecondaryMenu({ @@ -173,8 +173,8 @@ function NavbarMobileSidebar({ {!colorModeToggle.disabled && ( )}