diff --git a/packages/logos-docusaurus-theme/src/client/containers/ThemeProvider/ThemeProvider.tsx b/packages/logos-docusaurus-theme/src/client/containers/ThemeProvider/ThemeProvider.tsx index 5dfc41e..a4a1e41 100644 --- a/packages/logos-docusaurus-theme/src/client/containers/ThemeProvider/ThemeProvider.tsx +++ b/packages/logos-docusaurus-theme/src/client/containers/ThemeProvider/ThemeProvider.tsx @@ -10,8 +10,7 @@ export const ThemeProvider: React.FC> = ({ return ( - - + {children} ) diff --git a/packages/logos-docusaurus-theme/src/client/lib/themes.ts b/packages/logos-docusaurus-theme/src/client/lib/themes.ts index 91bdb4b..f6ced77 100644 --- a/packages/logos-docusaurus-theme/src/client/lib/themes.ts +++ b/packages/logos-docusaurus-theme/src/client/lib/themes.ts @@ -4,14 +4,22 @@ import { css } from '@emotion/react' import { useMemo } from 'react' import { useThemeOptions } from './useThemeOptions' -const useThemeCssVars = (theme: Theme, colorMode: string) => +const useThemeCssVars = (light: Theme, dark: Theme, fallback: Theme) => useMemo( () => css` - [data-theme=${colorMode}] { - ${theme.cssVars} + html:not([data-theme]) { + ${fallback.cssVars} + } + + html[data-theme='light'] { + ${light.cssVars} + } + + html[data-theme='dark'] { + ${dark.cssVars} } `, - [theme], + [dark, light], ) export const useTheme = () => { @@ -43,7 +51,6 @@ export const useTheme = () => { light: themes.light, current: themes[colorMode.colorMode], colorMode: colorMode.colorMode, - lightCssVars: useThemeCssVars(themes.light, 'light'), - darkCssVars: useThemeCssVars(themes.dark, 'dark'), + cssVars: useThemeCssVars(themes.light, themes.dark, themes.light), } } diff --git a/packages/logos-docusaurus-theme/src/client/theme/ThemedImage/index.tsx b/packages/logos-docusaurus-theme/src/client/theme/ThemedImage/index.tsx new file mode 100644 index 0000000..1f775e5 --- /dev/null +++ b/packages/logos-docusaurus-theme/src/client/theme/ThemedImage/index.tsx @@ -0,0 +1,41 @@ +import React from 'react' +import clsx from 'clsx' +import useIsBrowser from '@docusaurus/useIsBrowser' +import { useColorMode } from '@docusaurus/theme-common' +import type { Props } from '@theme/ThemedImage' + +import styles from './styles.module.css' + +export default function ThemedImage(props: Props): JSX.Element { + const isBrowser = useIsBrowser() + const { colorMode } = useColorMode() + const { sources, className, alt, ...propsRest } = props + + type SourceName = keyof Props['sources'] + + const clientThemes: SourceName[] = colorMode === 'dark' ? ['dark'] : ['light'] + + const renderedSourceNames: SourceName[] = isBrowser + ? clientThemes + : // We need to render both images on the server to avoid flash + // See https://github.com/facebook/docusaurus/pull/3730 + ['light', 'dark'] + + return ( + <> + {renderedSourceNames.map((sourceName) => ( + {alt} + ))} + + ) +} diff --git a/packages/logos-docusaurus-theme/src/client/theme/ThemedImage/styles.module.css b/packages/logos-docusaurus-theme/src/client/theme/ThemedImage/styles.module.css new file mode 100644 index 0000000..b3b7715 --- /dev/null +++ b/packages/logos-docusaurus-theme/src/client/theme/ThemedImage/styles.module.css @@ -0,0 +1,19 @@ +.themedImage { + display: none; +} + +[data-theme='light'] .themedImage--light { + display: initial; +} + +[data-theme='dark'] .themedImage--dark { + display: initial; +} + +/* +JS disabled??? Show light version by default => better than showing nothing +TODO bad, but we currently always show light mode when there's no data-theme + */ +html:not([data-theme]) .themedImage--light { + display: initial; +}