Skip to content

Commit a4f8113

Browse files
committed
feat(): Switch navbar-sidebar and sidebar toggles
1 parent b9c90c9 commit a4f8113

File tree

5 files changed

+63
-63
lines changed

5 files changed

+63
-63
lines changed

docusaurus-theme/src/theme/SidebarToggle/index.tsx

Lines changed: 0 additions & 40 deletions
This file was deleted.

docusaurus-theme/src/theme/SidebarToggle/styles.module.scss

Lines changed: 0 additions & 8 deletions
This file was deleted.

docusaurus-theme/src/theme/UserPreferencesProvider/index.tsx

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@ import React, { useState } from 'react';
99

1010
import useTabGroupChoice from '@theme/hooks/useTabGroupChoice';
1111
import UserPreferencesContext from '@theme/UserPreferencesContext';
12-
import type {Props} from '@theme/UserPreferencesProvider';
12+
import type { Props } from '@theme/UserPreferencesProvider';
1313

1414
function UserPreferencesProvider(props: Props): JSX.Element {
15-
const {tabGroupChoices, setTabGroupChoices} = useTabGroupChoice();
15+
const { tabGroupChoices, setTabGroupChoices } = useTabGroupChoice();
1616
const [sidebarOpen, setSidebarOpen] = useState(false);
1717

1818
return (
@@ -21,8 +21,9 @@ function UserPreferencesProvider(props: Props): JSX.Element {
2121
tabGroupChoices,
2222
setTabGroupChoices,
2323
sidebarOpen,
24-
setSidebarOpen
25-
}}>
24+
setSidebarOpen,
25+
}}
26+
>
2627
{props.children}
2728
</UserPreferencesContext.Provider>
2829
);

src/theme/Navbar/index.tsx

Lines changed: 49 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,12 @@ import useThemeContext from '@theme/hooks/useThemeContext';
1414
import { useThemeConfig } from '@docusaurus/theme-common';
1515
import useHideableNavbar from '@theme/hooks/useHideableNavbar';
1616
import useLockBodyScroll from '@theme/hooks/useLockBodyScroll';
17+
import useUserPreferencesContext from '@theme/hooks/useUserPreferencesContext';
1718
import useWindowSize, { windowSizes } from '@theme/hooks/useWindowSize';
1819
import NavbarItem from '@theme/NavbarItem';
1920
import Logo from '@theme/Logo';
2021
import IconMenu from '@theme/IconMenu';
22+
import { translate } from '@docusaurus/Translate';
2123

2224
import styles from './styles.module.scss';
2325
import 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>

src/theme/Navbar/styles.module.scss

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,15 @@ html[data-theme='dark'] {
167167
transform: translate3d(0, calc(-100% - 2px), 0);
168168
}
169169

170+
.sidebarToggle {
171+
border: none;
172+
background: transparent;
173+
174+
color: inherit;
175+
font-size: 2.125rem;
176+
font-weight: bold;
177+
}
178+
170179
//#region -------- MEDIUM STYLES ---------
171180
@media (min-width: 997px) and (max-width: 1215px) {
172181
:global {

0 commit comments

Comments
 (0)