1- import React , { useContext } from 'react' ;
1+ import React , { useContext , useState , useEffect } from 'react' ;
22import PropTypes from 'prop-types' ;
33import { serialize } from 'next-mdx-remote/serialize' ;
44import { MDXRemote } from 'next-mdx-remote' ;
55import matter from 'gray-matter' ;
66import clsx from 'clsx' ;
77import { Tab , Tabs , TabList , TabPanels , TabPanel } from '@reach/tabs' ;
8+ import { MdMenuOpen , MdClose } from 'react-icons/md' ;
89import torchlight from 'remark-torchlight' ;
910import remarkHint from 'remark-hint' ;
1011import rehypeSlug from 'rehype-slug' ;
1112import remarkCodeTabs from '@utils/remarkCodeTabs' ;
13+ import { BreakpointContext } from '@utils/BreakpointContext' ;
1214import { getDocumentList , getDocumentContent , getNavigation } from '@utils/docs' ;
1315import apiVersions from '@/docs/versions' ;
1416import { ApiVersionContext } from '@utils/ApiVersionContext' ;
1517import Header from '@components/base/Header' ;
1618import Footer from '@components/base/Footer' ;
19+ import VersionSelect from '@components/VersionSelect' ;
1720import Head from '@components/Head' ;
1821import Link from '@components/Link' ;
1922import ApiHeading from '@components/ApiHeading' ;
@@ -25,6 +28,7 @@ function asLinkedHeading(as) {
2528
2629const DocsPage = ( { meta, nav, source, slug } ) => {
2730 const { version } = useContext ( ApiVersionContext ) ;
31+ const breakpoint = useContext ( BreakpointContext ) ;
2832
2933 function parseVersionedLinks ( href ) {
3034 return href . replace ( / ( \[ v \] | % 5 B v % 5 D ) / i, version ) ;
@@ -76,16 +80,33 @@ const DocsPage = ({ meta, nav, source, slug }) => {
7680 TabPanel
7781 } ;
7882
83+ const [ menuOpen , setMenuOpen ] = useState ( false ) ;
84+
85+ useEffect ( ( ) => {
86+ if ( breakpoint . isDesktop && menuOpen ) {
87+ setMenuOpen ( false ) ;
88+ }
89+ // eslint-disable-next-line react-hooks/exhaustive-deps
90+ } , [ breakpoint . isDesktop ] ) ;
91+
7992
8093 return (
8194 < >
8295 < Head meta = { meta } />
8396 < Header />
8497
85- < main id = "maincontent" className = "docs-page container" >
86- < aside className = "docs-sidebar" >
98+ < main id = "maincontent" className = "docs-page container-wrapper" >
99+ < button type = "button" className = { clsx ( 'mobile-menu' , menuOpen ? 'menu-open' : null ) } aria-label = "Open documents menu" onClick = { ( ) => setMenuOpen ( ! menuOpen ) } >
100+ { menuOpen ? < MdClose /> : < MdMenuOpen /> }
101+ </ button >
102+ < aside className = { clsx ( 'docs-sidebar' , menuOpen ? 'mobile-open' : null ) } >
87103 < div className = "hidden lg:block h-12 pointer-events-none absolute top-0 left-0 right-0 z-10 bg-gradient-to-b from-warm-50" />
88104 < ul role = "menu" >
105+ { menuOpen && (
106+ < li role = "menuitem" className = "!mb-8" >
107+ < VersionSelect className = "block lg:hidden" />
108+ </ li >
109+ ) }
89110 { nav . map ( page => {
90111 if ( page . title ) {
91112 return (
@@ -98,7 +119,7 @@ const DocsPage = ({ meta, nav, source, slug }) => {
98119
99120 return (
100121 < li key = { url } role = "menuitem" >
101- < Link plain href = { url } className = { clsx ( 'docs-nav-link' , isActive ? 'active' : null ) } > { page . text } </ Link >
122+ < Link plain href = { url } className = { clsx ( 'docs-nav-link' , isActive ? 'active' : null ) } onClick = { ( ) => setMenuOpen ( false ) } > { page . text } </ Link >
102123 </ li >
103124 ) ;
104125 } ) }
0 commit comments