diff --git a/packages/docusaurus-theme-classic/src/theme/Navbar/Layout/index.tsx b/packages/docusaurus-theme-classic/src/theme/Navbar/Layout/index.tsx index bc05e51542..7c57e5c378 100644 --- a/packages/docusaurus-theme-classic/src/theme/Navbar/Layout/index.tsx +++ b/packages/docusaurus-theme-classic/src/theme/Navbar/Layout/index.tsx @@ -5,7 +5,7 @@ * LICENSE file in the root directory of this source tree. */ -import React, {type ComponentProps, type ReactNode} from 'react'; +import React, {type ReactNode} from 'react'; import clsx from 'clsx'; import {ThemeClassNames, useThemeConfig} from '@docusaurus/theme-common'; import { @@ -18,16 +18,6 @@ import type {Props} from '@theme/Navbar/Layout'; import styles from './styles.module.css'; -function NavbarBackdrop(props: ComponentProps<'div'>) { - return ( -
- ); -} - export default function NavbarLayout({children}: Props): ReactNode { const { navbar: {hideOnScroll, style}, @@ -57,7 +47,6 @@ export default function NavbarLayout({children}: Props): ReactNode { }, )}> {children} - ); diff --git a/packages/docusaurus-theme-classic/src/theme/Navbar/Layout/styles.module.css b/packages/docusaurus-theme-classic/src/theme/Navbar/Layout/styles.module.css index 8258c17f2c..b55753e113 100644 --- a/packages/docusaurus-theme-classic/src/theme/Navbar/Layout/styles.module.css +++ b/packages/docusaurus-theme-classic/src/theme/Navbar/Layout/styles.module.css @@ -5,10 +5,16 @@ * LICENSE file in the root directory of this source tree. */ -.navbarHideable { - transition: transform var(--ifm-transition-fast) ease; +.navbar-sidebar { + inset: 0; + margin: 0; + padding: 0; + bottom: 0; + border: 0; + height: 100%; + max-height: 100%; } -.navbarHidden { - transform: translate3d(0, calc(-100% - 2px), 0); +.navbar-sidebar::backdrop { + background-color: #0009; } diff --git a/packages/docusaurus-theme-classic/src/theme/Navbar/MobileSidebar/Layout/index.tsx b/packages/docusaurus-theme-classic/src/theme/Navbar/MobileSidebar/Layout/index.tsx index 7afe2f823c..8b2cb61232 100644 --- a/packages/docusaurus-theme-classic/src/theme/Navbar/MobileSidebar/Layout/index.tsx +++ b/packages/docusaurus-theme-classic/src/theme/Navbar/MobileSidebar/Layout/index.tsx @@ -5,9 +5,12 @@ * LICENSE file in the root directory of this source tree. */ -import React, {version, type ReactNode} from 'react'; +import React, {useEffect, useRef, version, type ReactNode} from 'react'; import clsx from 'clsx'; -import {useNavbarSecondaryMenu} from '@docusaurus/theme-common/internal'; +import { + useNavbarMobileSidebar, + useNavbarSecondaryMenu, +} from '@docusaurus/theme-common/internal'; import {ThemeClassNames} from '@docusaurus/theme-common'; import type {Props} from '@theme/Navbar/MobileSidebar/Layout'; @@ -47,12 +50,47 @@ export default function NavbarMobileSidebarLayout({ secondaryMenu, }: Props): ReactNode { const {shown: secondaryMenuShown} = useNavbarSecondaryMenu(); + const navbarModalDialog = useRef(null); + const {shown, toggle} = useNavbarMobileSidebar(); + + useEffect(() => { + const {current: dialogEl} = navbarModalDialog; + + if (!dialogEl) { + return; + } + if (shown) { + dialogEl.showModal(); + } else { + dialogEl.close(); + } + }); + + useEffect(() => { + const {current: dialogEl} = navbarModalDialog; + + function toggleOnEscape(e: {key: string}) { + if (e.key === 'Escape') { + if (shown) { + toggle(); + } + } + } + + dialogEl?.addEventListener('keydown', toggleOnEscape); + + return () => { + dialogEl?.removeEventListener('keydown', toggleOnEscape); + }; + }, [shown, toggle]); + return ( -
+ )} + ref={navbarModalDialog}> {header}
-
+ ); }