@@ -2,11 +2,12 @@ const body = document.querySelector("body");
2
2
const slideNav = document . getElementById ( "slide-nav" ) ;
3
3
const main = document . querySelector ( "main" ) ;
4
4
let slideNavOpen = false ;
5
+ let openingModal = false ;
5
6
6
- function _ ( elRef ) {
7
+ function getElement ( elRef ) {
7
8
const firstChar = elRef . substring ( 0 , 1 ) ;
8
9
if ( firstChar === "." ) {
9
- return document . getElementsByClassName ( elRef . replace ( / \. / g , "" ) ) ;
10
+ return document . querySelector ( elRef ) ; // Changed to querySelector for consistency
10
11
} else {
11
12
return document . getElementById ( elRef ) ;
12
13
}
@@ -29,6 +30,12 @@ function closeSlideNav() {
29
30
}
30
31
31
32
function openModal ( modalId ) {
33
+ openingModal = true ;
34
+
35
+ setTimeout ( ( ) => {
36
+ openingModal = false ;
37
+ } , 100 ) ;
38
+
32
39
let pageOverlay = document . getElementById ( "overlay" ) ;
33
40
if ( ! pageOverlay ) {
34
41
const modalContainer = document . createElement ( "div" ) ;
@@ -41,7 +48,9 @@ function openModal(modalId) {
41
48
pageOverlay . setAttribute ( "style" , "z-index: 2" ) ;
42
49
body . prepend ( pageOverlay ) ;
43
50
44
- const targetModal = _ ( modalId ) ;
51
+ const targetModal = getElement ( modalId ) ;
52
+ if ( ! targetModal ) return ;
53
+
45
54
const targetModalContent = targetModal . innerHTML ;
46
55
targetModal . remove ( ) ;
47
56
@@ -52,11 +61,16 @@ function openModal(modalId) {
52
61
newModal . innerHTML = targetModalContent ;
53
62
modalContainer . appendChild ( newModal ) ;
54
63
55
- setTimeout ( ( ) => {
64
+ // Use requestAnimationFrame to ensure the modal is in the DOM before we try to show it
65
+ requestAnimationFrame ( ( ) => {
66
+ newModal . style . display = 'block' ;
56
67
newModal . style . opacity = 1 ;
57
68
newModal . style . marginTop = "12vh" ;
58
- } , 0 ) ;
69
+ } ) ;
70
+
71
+ return newModal ;
59
72
}
73
+ return null ;
60
74
}
61
75
62
76
function closeModal ( ) {
@@ -81,27 +95,52 @@ function closeModal() {
81
95
}
82
96
}
83
97
84
- const slideNavLinks = document . querySelector ( "#slide-nav ul" ) ;
85
- if ( slideNavLinks ) {
86
- const autoPopulateSlideNav = slideNavLinks . getAttribute ( "auto-populate" ) ;
87
- if ( autoPopulateSlideNav === "true" ) {
98
+ function autoPopulateSlideNav ( ) {
99
+ const slideNavLinks = document . querySelector ( "#slide-nav ul" ) ;
100
+ if ( slideNavLinks && slideNavLinks . getAttribute ( "auto-populate" ) === "true" ) {
88
101
const navLinks = document . querySelector ( "#top-nav" ) ;
89
102
if ( navLinks ) {
90
103
slideNavLinks . innerHTML = navLinks . innerHTML ;
91
104
}
92
105
}
106
+ }
93
107
94
- body . addEventListener ( "click" , ( ev ) => {
95
- if ( slideNavOpen && ev . target . id !== "open-btn" ) {
96
- if ( ! slideNav . contains ( ev . target ) ) {
97
- closeSlideNav ( ) ;
98
- }
99
- }
100
- } ) ;
108
+ function handleSlideNavClick ( event ) {
109
+ if ( slideNavOpen && event . target . id !== "open-btn" && ! slideNav . contains ( event . target ) ) {
110
+ closeSlideNav ( ) ;
111
+ }
101
112
}
102
113
103
- document . addEventListener ( 'keydown' , ( event ) => {
114
+ function handleEscapeKey ( event ) {
104
115
if ( event . key === 'Escape' ) {
105
- closeModal ( ) ;
116
+ const modalContainer = document . getElementById ( "modal-container" ) ;
117
+ if ( modalContainer ) {
118
+ closeModal ( ) ;
119
+ }
106
120
}
107
- } ) ;
121
+ }
122
+
123
+ function handleModalClick ( event ) {
124
+ if ( openingModal === true ) {
125
+ return ;
126
+ }
127
+
128
+ const modalContainer = document . getElementById ( "modal-container" ) ;
129
+ if ( modalContainer ) {
130
+ const modal = modalContainer . querySelector ( '.modal' ) ;
131
+ if ( modal && ! modal . contains ( event . target ) ) {
132
+ closeModal ( ) ;
133
+ }
134
+ }
135
+ }
136
+
137
+ // Initialize
138
+ autoPopulateSlideNav ( ) ;
139
+
140
+ // Add event listeners
141
+ body . addEventListener ( "click" , ( event ) => {
142
+ handleSlideNavClick ( event ) ;
143
+ handleModalClick ( event ) ;
144
+ } ) ;
145
+
146
+ document . addEventListener ( 'keydown' , handleEscapeKey ) ;
0 commit comments