@@ -6,21 +6,28 @@ import { isEmbedded } from '../globals'
6
6
7
7
const ANIMATION_DURATION = 300
8
8
9
- const CONTENT_SELECTOR = '.content'
10
9
const SIDEBAR_TOGGLE_SELECTOR = '.sidebar-toggle'
11
10
12
11
const smallScreenQuery = window . matchMedia ( `screen and (max-width: ${ SMALL_SCREEN_BREAKPOINT } px)` )
13
12
14
13
if ( ! isEmbedded ) {
15
- update ( )
14
+ setDefaultSidebarState ( )
16
15
17
- window . addEventListener ( 'swup:page:view' , update )
16
+ window . addEventListener ( 'swup:page:view' , setDefaultSidebarState )
18
17
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 )
20
22
21
23
// 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
+ ) {
24
31
toggleSidebar ( )
25
32
}
26
33
} )
@@ -31,7 +38,7 @@ if (!isEmbedded) {
31
38
window . addEventListener ( 'resize' , throttle ( ( ) => {
32
39
if ( lastWindowWidth === window . innerWidth ) return
33
40
lastWindowWidth = window . innerWidth
34
- update ( )
41
+ setDefaultSidebarState ( )
35
42
} , 100 ) )
36
43
37
44
// Save sidebar width changes on user resize only.
@@ -43,15 +50,13 @@ if (!isEmbedded) {
43
50
document . body . style . setProperty ( '--sidebarWidth' , `${ width } px` )
44
51
} )
45
52
// We observe on mousedown because we only care about user resize.
46
- const sidebar = document . getElementById ( 'sidebar' )
47
53
sidebar . addEventListener ( 'mousedown' , ( ) => resizeObserver . observe ( sidebar ) )
48
54
sidebar . addEventListener ( 'mouseup' , ( ) => resizeObserver . unobserve ( sidebar ) )
49
55
}
50
56
51
- export function update ( ) {
57
+ function setDefaultSidebarState ( ) {
52
58
const pref = sessionStorage . getItem ( SIDEBAR_STATE_KEY )
53
59
const open = pref !== SIDEBAR_PREF_CLOSED && ! smallScreenQuery . matches
54
- initializeList ( )
55
60
updateSidebar ( open )
56
61
}
57
62
@@ -79,6 +84,8 @@ export function isSidebarOpened () {
79
84
}
80
85
81
86
function updateSidebar ( open ) {
87
+ // Lazy init list. Only needed when open.
88
+ if ( open ) initializeList ( )
82
89
document . body . classList . toggle ( SIDEBAR_CLASS_OPEN , open )
83
90
qs ( SIDEBAR_TOGGLE_SELECTOR ) . setAttribute ( 'aria-expanded' , open ? 'true' : 'false' )
84
91
}
0 commit comments