From 2286122393501d66af4eaf20928e4b7843f15fc7 Mon Sep 17 00:00:00 2001 From: Amitoj Singh Date: Thu, 28 Oct 2021 21:32:44 +0300 Subject: [PATCH 1/3] create ThemeProvider --- beta/src/modules/ThemeProvider.tsx | 48 ++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 beta/src/modules/ThemeProvider.tsx diff --git a/beta/src/modules/ThemeProvider.tsx b/beta/src/modules/ThemeProvider.tsx new file mode 100644 index 00000000000..597a59e5e4a --- /dev/null +++ b/beta/src/modules/ThemeProvider.tsx @@ -0,0 +1,48 @@ +import { createContext, Dispatch, FC, SetStateAction, useEffect, useMemo, useState } from "react"; + +export enum ColorMode { + light = 'light', + dark = 'dark' +} + + +export const ThemeContext = createContext<{ + colorMode: ColorMode, + setColorMode: Dispatch> +}>({ + colorMode: ColorMode.light, + setColorMode: () => { } +}); + +export const ThemeProvider: FC = ({ children }) => { + const [colorMode, setColorMode] = useState(ColorMode.light); + const colorModeKey = "@app/colorMode"; + + useEffect(() => { + const savedColorMode = localStorage.getItem(colorModeKey); + if (savedColorMode) setColorMode(savedColorMode as ColorMode) + }, []) + + + useEffect(() => { + localStorage.setItem(colorModeKey, colorMode); + if (!document) return; + colorMode === ColorMode.dark ? + document.documentElement.classList.add(ColorMode.dark) : + document.documentElement.classList.remove(ColorMode.dark) + }, [colorMode]) + + + return ( + ({ + colorMode, + setColorMode + }), + [colorMode] + )}> + {children} + + ) +} \ No newline at end of file From 6b88724e11e6caf1afef78fe924ade9af9ffa2ab Mon Sep 17 00:00:00 2001 From: Amitoj Singh Date: Thu, 28 Oct 2021 21:33:25 +0300 Subject: [PATCH 2/3] add colorMode toggle --- beta/src/components/Layout/Nav/MobileNav.tsx | 10 +-- beta/src/components/Layout/Nav/Nav.tsx | 65 ++++++++------------ 2 files changed, 30 insertions(+), 45 deletions(-) diff --git a/beta/src/components/Layout/Nav/MobileNav.tsx b/beta/src/components/Layout/Nav/MobileNav.tsx index a6b6cc919b0..90ed70e0d28 100644 --- a/beta/src/components/Layout/Nav/MobileNav.tsx +++ b/beta/src/components/Layout/Nav/MobileNav.tsx @@ -4,9 +4,9 @@ import * as React from 'react'; import cn from 'classnames'; -import {RouteItem} from 'components/Layout/useRouteMeta'; -import {useRouter} from 'next/router'; -import {SidebarRouteTree} from '../Sidebar'; +import { RouteItem } from 'components/Layout/useRouteMeta'; +import { useRouter } from 'next/router'; +import { SidebarRouteTree } from '../Sidebar'; import sidebarHome from '../../../sidebarHome.json'; import sidebarLearn from '../../../sidebarLearn.json'; import sidebarReference from '../../../sidebarReference.json'; @@ -22,7 +22,7 @@ function inferSection(pathname: string): 'learn' | 'reference' | 'home' { } export function MobileNav() { - const {pathname} = useRouter(); + const { pathname } = useRouter(); const [section, setSection] = React.useState(() => inferSection(pathname)); let tree = null; @@ -40,7 +40,7 @@ export function MobileNav() { return ( <> -
+
setSection('home')}> diff --git a/beta/src/components/Layout/Nav/Nav.tsx b/beta/src/components/Layout/Nav/Nav.tsx index af8f2066ba7..e938eaeddde 100644 --- a/beta/src/components/Layout/Nav/Nav.tsx +++ b/beta/src/components/Layout/Nav/Nav.tsx @@ -5,15 +5,15 @@ import * as React from 'react'; import cn from 'classnames'; import NextLink from 'next/link'; -import {useRouter} from 'next/router'; +import { useRouter } from 'next/router'; -import {IconClose} from 'components/Icon/IconClose'; -import {IconHamburger} from 'components/Icon/IconHamburger'; -import {Search} from 'components/Search'; -import {MenuContext} from 'components/useMenu'; - -import {Logo} from '../../Logo'; +import { IconClose } from 'components/Icon/IconClose'; +import { IconHamburger } from 'components/Icon/IconHamburger'; +import { Search } from 'components/Search'; +import { MenuContext } from 'components/useMenu'; +import { Logo } from '../../Logo'; import NavLink from './NavLink'; +import { ColorMode, ThemeContext } from 'modules/ThemeProvider'; const feedbackIcon = ( { - if (typeof document === 'undefined') { - return false; - } - return document.documentElement.classList.contains('dark'); - }); + + // get the current colorMode + const { colorMode, setColorMode } = React.useContext(ThemeContext); + const section = inferSection(pathname); + const toggleColorMode = React.useCallback(() => { + setColorMode(colorMode === ColorMode.dark ? ColorMode.light : ColorMode.dark) + }, [colorMode]) + function handleFeedback() { const nodes: any = document.querySelectorAll( '#_hj_feedback_container button' @@ -115,7 +116,7 @@ export default function Nav() { } return ( -
@@ -174,20 +167,12 @@ export default function Nav() {
); -} +} \ No newline at end of file From 86cf0e6b720d4eabce8da2aca1ba4bfd3ee141c9 Mon Sep 17 00:00:00 2001 From: Amitoj Singh Date: Thu, 28 Oct 2021 21:34:02 +0300 Subject: [PATCH 3/3] make other components dark mode compatible --- beta/src/components/Layout/Page.tsx | 16 ++++----- .../src/components/Layout/Sidebar/Sidebar.tsx | 22 ++++++------ .../components/MDX/CodeBlock/CodeBlock.tsx | 26 +++++++++----- .../components/MDX/Sandpack/CustomPreset.tsx | 27 +++++++++------ beta/src/components/MDX/Sandpack/Preview.tsx | 22 ++++++------ beta/src/components/MDX/Sandpack/Themes.tsx | 29 +++++++++++++++- beta/src/components/Search.tsx | 22 ++++++------ beta/src/pages/_app.tsx | 17 ++++++---- beta/src/pages/_document.tsx | 4 +-- beta/src/styles/sandpack.css | 34 +++++++++++-------- 10 files changed, 135 insertions(+), 84 deletions(-) diff --git a/beta/src/components/Layout/Page.tsx b/beta/src/components/Layout/Page.tsx index 7cbf2505260..700114b84ec 100644 --- a/beta/src/components/Layout/Page.tsx +++ b/beta/src/components/Layout/Page.tsx @@ -2,22 +2,22 @@ * Copyright (c) Facebook, Inc. and its affiliates. */ -import {MenuProvider} from 'components/useMenu'; +import { MenuProvider } from 'components/useMenu'; import * as React from 'react'; -import {Nav} from './Nav'; -import {RouteItem, SidebarContext} from './useRouteMeta'; -import {Sidebar} from './Sidebar'; -import {Footer} from './Footer'; +import { Nav } from './Nav'; +import { RouteItem, SidebarContext } from './useRouteMeta'; +import { Sidebar } from './Sidebar'; +import { Footer } from './Footer'; interface PageProps { children: React.ReactNode; routeTree: RouteItem; } -export function Page({routeTree, children}: PageProps) { +export function Page({ routeTree, children }: PageProps) { return ( -
+