@@ -14,10 +14,12 @@ import useThemeContext from '@theme/hooks/useThemeContext';
1414import { useThemeConfig } from '@docusaurus/theme-common' ;
1515import useHideableNavbar from '@theme/hooks/useHideableNavbar' ;
1616import useLockBodyScroll from '@theme/hooks/useLockBodyScroll' ;
17+ import useUserPreferencesContext from '@theme/hooks/useUserPreferencesContext' ;
1718import useWindowSize , { windowSizes } from '@theme/hooks/useWindowSize' ;
1819import NavbarItem from '@theme/NavbarItem' ;
1920import Logo from '@theme/Logo' ;
2021import IconMenu from '@theme/IconMenu' ;
22+ import { translate } from '@docusaurus/Translate' ;
2123
2224import styles from './styles.module.scss' ;
2325import useDocusaurusContext from '@docusaurus/useDocusaurusContext' ;
@@ -54,18 +56,27 @@ function Navbar(): JSX.Element {
5456 } ,
5557 } ,
5658 } = useDocusaurusContext ( ) ;
57- const [ sidebarShown , setSidebarShown ] = useState ( false ) ;
59+ const [ navbarSidebarOpen , setNavbarSidebarOpen ] = useState ( false ) ;
60+ const { sidebarOpen, setSidebarOpen } = useUserPreferencesContext ( ) ;
5861 const { isDarkTheme, setLightTheme, setDarkTheme } = useThemeContext ( ) ;
5962 const { navbarRef, isNavbarVisible } = useHideableNavbar ( hideOnScroll ) ;
6063
61- useLockBodyScroll ( sidebarShown ) ;
64+ useLockBodyScroll ( sidebarOpen ) ;
65+ useLockBodyScroll ( navbarSidebarOpen ) ;
6266
6367 const showSidebar = useCallback ( ( ) => {
64- setSidebarShown ( true ) ;
65- } , [ setSidebarShown ] ) ;
68+ setSidebarOpen ( true ) ;
69+ } , [ ] ) ;
6670 const hideSidebar = useCallback ( ( ) => {
67- setSidebarShown ( false ) ;
68- } , [ setSidebarShown ] ) ;
71+ setSidebarOpen ( false ) ;
72+ } , [ ] ) ;
73+
74+ const showNavbarSidebar = useCallback ( ( ) => {
75+ setNavbarSidebarOpen ( true ) ;
76+ } , [ ] ) ;
77+ const hideNavbarSidebar = useCallback ( ( ) => {
78+ setNavbarSidebarOpen ( false ) ;
79+ } , [ ] ) ;
6980
7081 const onToggleChange = useCallback (
7182 e => ( e . target . checked ? setDarkTheme ( ) : setLightTheme ( ) ) ,
@@ -76,7 +87,8 @@ function Navbar(): JSX.Element {
7687
7788 useEffect ( ( ) => {
7889 if ( windowSize === windowSizes . desktop ) {
79- setSidebarShown ( false ) ;
90+ hideSidebar ( ) ;
91+ hideNavbarSidebar ( ) ;
8092 }
8193 } , [ windowSize ] ) ;
8294
@@ -89,7 +101,7 @@ function Navbar(): JSX.Element {
89101 className = { clsx ( 'navbar' , 'navbar--fixed-top' , {
90102 'navbar--dark' : style === 'dark' ,
91103 'navbar--primary' : style === 'primary' ,
92- 'navbar-sidebar--show' : sidebarShown ,
104+ 'navbar-sidebar--show' : navbarSidebarOpen ,
93105 [ styles . navbarHideable ] : hideOnScroll ,
94106 [ styles . navbarHidden ] : hideOnScroll && ! isNavbarVisible ,
95107 } ) }
@@ -135,9 +147,35 @@ function Navbar(): JSX.Element {
135147 < NavbarItem { ...item } key = { i } />
136148 ) ) }
137149 </ div >
138- { windowSize === windowSizes . mobile && < SidebarToggle /> }
150+ { windowSize === windowSizes . mobile && (
151+ < button
152+ aria-label = {
153+ sidebarOpen
154+ ? translate ( {
155+ id : 'theme.docs.sidebar.responsiveCloseButtonLabel' ,
156+ message : 'Close menu' ,
157+ description :
158+ 'The ARIA label for close button of mobile doc sidebar' ,
159+ } )
160+ : translate ( {
161+ id : 'theme.docs.sidebar.responsiveOpenButtonLabel' ,
162+ message : 'Open menu' ,
163+ description :
164+ 'The ARIA label for open button of mobile doc sidebar' ,
165+ } )
166+ }
167+ aria-haspopup = "true"
168+ className = { clsx ( 'sidebar-toggle--mobile' , styles . sidebarToggle ) }
169+ onClick = { showNavbarSidebar }
170+ >
171+ ⋮
172+ </ button >
173+ ) }
139174 </ div >
140- < Backdrop onClick = { hideSidebar } visible = { sidebarShown } />
175+ < Backdrop
176+ onClick = { hideSidebar && hideNavbarSidebar }
177+ visible = { sidebarOpen || navbarSidebarOpen }
178+ />
141179 < div className = "navbar-sidebar" >
142180 < div className = "navbar-sidebar__brand" >
143181 < Logo
@@ -146,7 +184,7 @@ function Navbar(): JSX.Element {
146184 titleClassName = "navbar__title"
147185 onClick = { hideSidebar }
148186 />
149- { ! disableColorModeSwitch && sidebarShown && (
187+ { ! disableColorModeSwitch && sidebarOpen && (
150188 < Toggle checked = { isDarkTheme } onChange = { onToggleChange } />
151189 ) }
152190 </ div >
0 commit comments