Skip to content

Commit cf5947f

Browse files
Fix sidebar open/close on mobile (#2016)
1 parent 3fc3c23 commit cf5947f

File tree

1 file changed

+17
-10
lines changed

1 file changed

+17
-10
lines changed

assets/js/sidebar/sidebar-drawer.js

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,28 @@ import { isEmbedded } from '../globals'
66

77
const ANIMATION_DURATION = 300
88

9-
const CONTENT_SELECTOR = '.content'
109
const SIDEBAR_TOGGLE_SELECTOR = '.sidebar-toggle'
1110

1211
const smallScreenQuery = window.matchMedia(`screen and (max-width: ${SMALL_SCREEN_BREAKPOINT}px)`)
1312

1413
if (!isEmbedded) {
15-
update()
14+
setDefaultSidebarState()
1615

17-
window.addEventListener('swup:page:view', update)
16+
window.addEventListener('swup:page:view', setDefaultSidebarState)
1817

19-
qs(SIDEBAR_TOGGLE_SELECTOR).addEventListener('click', toggleSidebar)
18+
const sidebar = document.getElementById('sidebar')
19+
const sidebarToggle = qs(SIDEBAR_TOGGLE_SELECTOR)
20+
21+
sidebarToggle.addEventListener('click', toggleSidebar)
2022

2123
// Clicks outside small screen open sidebar should close it.
22-
qs(CONTENT_SELECTOR).addEventListener('click', () => {
23-
if (smallScreenQuery.matches && isSidebarOpen()) {
24+
document.body.addEventListener('click', (event) => {
25+
if (
26+
smallScreenQuery.matches &&
27+
isSidebarOpen() &&
28+
!sidebar.contains(event.target) &&
29+
!sidebarToggle.contains(event.target)
30+
) {
2431
toggleSidebar()
2532
}
2633
})
@@ -31,7 +38,7 @@ if (!isEmbedded) {
3138
window.addEventListener('resize', throttle(() => {
3239
if (lastWindowWidth === window.innerWidth) return
3340
lastWindowWidth = window.innerWidth
34-
update()
41+
setDefaultSidebarState()
3542
}, 100))
3643

3744
// Save sidebar width changes on user resize only.
@@ -43,15 +50,13 @@ if (!isEmbedded) {
4350
document.body.style.setProperty('--sidebarWidth', `${width}px`)
4451
})
4552
// We observe on mousedown because we only care about user resize.
46-
const sidebar = document.getElementById('sidebar')
4753
sidebar.addEventListener('mousedown', () => resizeObserver.observe(sidebar))
4854
sidebar.addEventListener('mouseup', () => resizeObserver.unobserve(sidebar))
4955
}
5056

51-
export function update () {
57+
function setDefaultSidebarState () {
5258
const pref = sessionStorage.getItem(SIDEBAR_STATE_KEY)
5359
const open = pref !== SIDEBAR_PREF_CLOSED && !smallScreenQuery.matches
54-
initializeList()
5560
updateSidebar(open)
5661
}
5762

@@ -79,6 +84,8 @@ export function isSidebarOpened () {
7984
}
8085

8186
function updateSidebar (open) {
87+
// Lazy init list. Only needed when open.
88+
if (open) initializeList()
8289
document.body.classList.toggle(SIDEBAR_CLASS_OPEN, open)
8390
qs(SIDEBAR_TOGGLE_SELECTOR).setAttribute('aria-expanded', open ? 'true' : 'false')
8491
}

0 commit comments

Comments
 (0)