1
- const ASPECT_RATIO =
2
- window . BIG_ASPECT_RATIO === undefined ? 1.6 : window . BIG_ASPECT_RATIO ;
1
+ let ASPECT_RATIO = window . BIG_ASPECT_RATIO === undefined ? 1.6 : window . BIG_ASPECT_RATIO ;
3
2
4
3
function parseHash ( ) {
5
4
return parseInt ( window . location . hash . substring ( 1 ) , 10 ) ;
6
5
}
7
6
7
+ function emptyNode ( node ) {
8
+ while ( node . hasChildNodes ( ) ) node . removeChild ( node . lastChild ) ;
9
+ }
10
+
8
11
function ce ( type , klass = "" ) {
9
- const element = document . createElement ( type ) ;
12
+ let element = document . createElement ( type ) ;
10
13
element . className = klass ;
11
14
return element ;
12
15
}
13
16
14
17
addEventListener ( "load" , function ( ) {
15
- let slideDivs = Array . from ( document . querySelectorAll ( "body > div" ) ) ,
16
- timeoutInterval ;
17
-
18
- const forward = ( ) => go ( big . current + 1 ) ;
19
- const reverse = ( ) => go ( big . current - 1 ) ;
20
- const { body } = document ,
21
- { className : initialBodyClass } = body ,
22
- notes = slideDivs . map ( slide =>
23
- Array . from ( slide . querySelectorAll ( "notes" ) , noteElement => {
24
- noteElement . parentNode . removeChild ( noteElement ) ;
25
- return noteElement . innerHTML . trim ( ) ;
26
- } )
27
- ) ,
28
- big = {
29
- current : - 1 ,
30
- mode : "talk" ,
31
- forward : forward ,
32
- reverse : reverse ,
33
- go : go ,
34
- length : slideDivs . length
35
- } ,
36
- pc = body . appendChild ( ce ( "div" , "presentation-container" ) ) ;
37
-
38
- slideDivs = slideDivs . map ( slide => {
18
+ let slideDivs = Array . from ( document . querySelectorAll ( "body > div" ) ) ;
19
+ let pc = document . body . appendChild ( ce ( "div" , "presentation-container" ) ) ;
20
+ slideDivs = slideDivs . map ( ( slide , _i ) => {
39
21
slide . setAttribute ( "tabindex" , 0 ) ;
40
22
slide . classList . add ( "slide" ) ;
41
23
42
24
if ( slide . hasAttribute ( "data-background-image" ) ) {
43
- const preloadLink = document . createElement ( "link" ) ;
25
+ let preloadLink = document . createElement ( "link" ) ;
44
26
preloadLink . href = slide . getAttribute ( "data-background-image" ) ;
45
27
preloadLink . rel = "preload" ;
46
28
preloadLink . as = "image" ;
47
29
document . head . appendChild ( preloadLink ) ;
48
30
}
49
31
50
- const sc = pc . appendChild ( ce ( "div" , "slide-container" ) ) ;
32
+ let sc = pc . appendChild ( ce ( "div" , "slide-container" ) ) ;
51
33
sc . appendChild ( slide ) ;
52
- return sc ;
34
+ return Object . assign ( sc , {
35
+ _notes : Array . from ( slide . querySelectorAll ( "notes" ) , noteElement => {
36
+ noteElement . parentNode . removeChild ( noteElement ) ;
37
+ return noteElement . innerHTML . trim ( ) ;
38
+ } ) ,
39
+ _i
40
+ } ) ;
53
41
} ) ;
42
+ let timeoutInterval ,
43
+ { body } = document ,
44
+ { className : initialBodyClass } = body ,
45
+ big = ( window . big = {
46
+ current : - 1 ,
47
+ mode : "talk" ,
48
+ forward : forward ,
49
+ reverse : reverse ,
50
+ go : go ,
51
+ length : slideDivs . length
52
+ } ) ;
53
+ function forward ( ) {
54
+ go ( big . current + 1 ) ;
55
+ }
56
+ function reverse ( ) {
57
+ go ( big . current - 1 ) ;
58
+ }
54
59
55
60
body . className = "talk-mode " + initialBodyClass ;
56
61
window . matchMedia ( "print" ) . addListener ( onPrint ) ;
@@ -60,18 +65,13 @@ addEventListener("load", function() {
60
65
addEventListener ( "hashchange" , onHashChange ) ;
61
66
addEventListener ( "resize" , onResize ) ;
62
67
window . big = big ;
63
- console . log (
64
- "This is a big presentation. You can: \n\n* press j to jump to a slide\n" +
65
- "* press p to see the print view\n* press t to go back to the talk view"
66
- ) ;
68
+ console . log ( "This is a big presentation. You can: \n\n* press j to jump to a slide\n" + "* press p to see the print view\n* press t to go back to the talk view" ) ;
67
69
go ( parseHash ( ) || big . current ) ;
68
70
69
71
function useDataImageAsBackground ( sc ) {
70
- const { firstChild } = sc ;
72
+ let { firstChild } = sc ;
71
73
if ( firstChild . hasAttribute ( "data-background-image" ) ) {
72
- sc . style . backgroundImage = `url("${ firstChild . getAttribute (
73
- "data-background-image"
74
- ) } ")`;
74
+ sc . style . backgroundImage = `url("${ firstChild . getAttribute ( "data-background-image" ) } ")` ;
75
75
return firstChild . classList . add ( "imageText" ) ;
76
76
}
77
77
sc . style . backgroundImage = "" ;
@@ -82,59 +82,40 @@ addEventListener("load", function() {
82
82
n = Math . max ( 0 , Math . min ( big . length - 1 , n ) ) ;
83
83
if ( ! force && big . current === n ) return ;
84
84
big . current = n ;
85
- const sc = slideDivs [ n ] ;
86
- const slideDiv = sc . firstChild ;
87
- if ( notes [ n ] . length ) {
85
+ let sc = slideDivs [ n ] ,
86
+ slideDiv = sc . firstChild ;
87
+ if ( sc . _notes . length ) {
88
88
console . group ( n ) ;
89
- for ( const note of notes [ n ] ) {
90
- console . log (
91
- "%c%s" ,
92
- "padding:5px;font-family:serif;font-size:18px;line-height:150%;" ,
93
- note
94
- ) ;
95
- }
89
+ for ( let note of sc . _notes ) console . log ( "%c%s" , "padding:5px;font-family:serif;font-size:18px;line-height:150%;" , note ) ;
96
90
console . groupEnd ( ) ;
97
91
}
98
92
slideDivs . forEach ( ( slide , i ) => {
99
93
slide . style . display = i === n ? "flex" : "none" ;
100
94
} ) ;
101
- body . className = `talk-mode ${ slideDiv . getAttribute ( "data-bodyclass" ) ||
102
- "" } ${ initialBodyClass } `;
95
+ body . className = `talk-mode ${ slideDiv . getAttribute ( "data-bodyclass" ) || "" } ${ initialBodyClass } ` ;
103
96
useDataImageAsBackground ( sc ) ;
104
- if ( timeoutInterval !== undefined ) {
105
- window . clearInterval ( timeoutInterval ) ;
106
- timeoutInterval = undefined ;
107
- }
108
- if ( slideDiv . hasAttribute ( "data-time-to-next" ) ) {
109
- const timeToNext = parseFloat ( slideDiv . getAttribute ( "data-time-to-next" ) ) ;
110
- timeoutInterval = window . setTimeout ( forward , timeToNext * 1000 ) ;
111
- }
112
- slideDiv . focus ( ) ;
97
+ window . clearInterval ( timeoutInterval ) ;
98
+ if ( slideDiv . hasAttribute ( "data-time-to-next" ) ) timeoutInterval = window . setTimeout ( forward , parseFloat ( slideDiv . getAttribute ( "data-time-to-next" ) ) * 1000 ) ;
113
99
onResize ( ) ;
114
100
if ( window . location . hash !== n ) window . location . hash = n ;
115
- document . title = slideDiv . textContent || slideDiv . innerText ;
101
+ document . title = slideDiv . textContent ;
116
102
}
117
103
118
104
function resizeTo ( sc , width , height ) {
119
- const slideDiv = sc . firstChild ;
120
- const padding = Math . min ( width * 0.04 ) ;
121
- let fontSize = height ;
105
+ let slideDiv = sc . firstChild ,
106
+ padding = Math . min ( width * 0.04 ) ,
107
+ fontSize = height ;
122
108
sc . style . width = `${ width } px` ;
123
109
sc . style . height = `${ height } px` ;
124
110
slideDiv . style . padding = `${ padding } px` ;
125
- if ( getComputedStyle ( slideDiv ) . display === "grid" )
126
- slideDiv . style . height = `${ height - padding * 2 } px` ;
127
- for ( const step of [ 100 , 50 , 10 , 2 ] ) {
111
+ if ( getComputedStyle ( slideDiv ) . display === "grid" ) slideDiv . style . height = `${ height - padding * 2 } px` ;
112
+ for ( let step of [ 100 , 50 , 10 , 2 ] ) {
128
113
for ( ; fontSize > 0 ; fontSize -= step ) {
129
114
slideDiv . style . fontSize = `${ fontSize } px` ;
130
115
if (
131
116
slideDiv . scrollWidth <= width &&
132
117
slideDiv . offsetHeight <= height &&
133
- Array . from ( slideDiv . querySelectorAll ( "div" ) ) . every (
134
- elem =>
135
- elem . scrollWidth <= elem . clientWidth &&
136
- elem . scrollHeight <= elem . clientHeight
137
- )
118
+ Array . from ( slideDiv . querySelectorAll ( "div" ) ) . every ( elem => elem . scrollWidth <= elem . clientWidth && elem . scrollHeight <= elem . clientHeight )
138
119
) {
139
120
break ;
140
121
}
@@ -143,31 +124,24 @@ addEventListener("load", function() {
143
124
}
144
125
}
145
126
146
- function emptyNode ( node ) {
147
- while ( node . hasChildNodes ( ) ) node . removeChild ( node . lastChild ) ;
148
- }
149
-
150
127
function onPrint ( ) {
151
128
if ( big . mode === "print" ) return ;
152
129
body . className = `print-mode ${ initialBodyClass } ` ;
153
130
emptyNode ( pc ) ;
154
- slideDivs . forEach ( ( sc , i ) => {
155
- const subContainer = pc . appendChild ( ce ( "div" , "sub-container" ) ) ,
156
- sbc = subContainer . appendChild (
157
- ce ( "div" , sc . firstChild . getAttribute ( "data-bodyclass" ) || "" )
158
- ) ;
131
+ for ( let sc of slideDivs ) {
132
+ let subContainer = pc . appendChild ( ce ( "div" , "sub-container" ) ) ,
133
+ sbc = subContainer . appendChild ( ce ( "div" , sc . firstChild . getAttribute ( "data-bodyclass" ) || "" ) ) ;
159
134
sbc . appendChild ( sc ) ;
160
135
sc . style . display = "flex" ;
161
136
useDataImageAsBackground ( sc ) ;
162
137
resizeTo ( sc , 512 , 320 ) ;
163
- if ( notes [ i ] . length ) {
164
- const notesUl = subContainer . appendChild ( ce ( "ul" , "notes-list" ) ) ;
165
- for ( const note of notes [ i ] ) {
166
- const li = notesUl . appendChild ( ce ( "li" ) ) ;
167
- li . innerText = note ;
168
- }
138
+ if ( ! sc . _notes . length ) return ;
139
+ let notesUl = subContainer . appendChild ( ce ( "ul" , "notes-list" ) ) ;
140
+ for ( let note of sc . _notes ) {
141
+ let li = notesUl . appendChild ( ce ( "li" ) ) ;
142
+ li . innerText = note ;
169
143
}
170
- } ) ;
144
+ }
171
145
big . mode = "print" ;
172
146
}
173
147
@@ -176,29 +150,25 @@ addEventListener("load", function() {
176
150
big . mode = "talk" ;
177
151
body . className = `talk-mode ${ initialBodyClass } ` ;
178
152
emptyNode ( pc ) ;
179
- for ( const sc of slideDivs ) pc . appendChild ( sc ) ;
180
- let goTo = big . current ;
181
- if ( typeof i === "number" ) goTo = i ;
182
- go ( goTo , true ) ;
153
+ for ( let sc of slideDivs ) pc . appendChild ( sc ) ;
154
+ go ( i , true ) ;
183
155
}
184
156
185
157
function onJump ( ) {
186
158
if ( big . mode === "jump" ) return ;
187
159
big . mode = "jump" ;
188
160
body . className = "jump-mode " + initialBodyClass ;
189
161
emptyNode ( pc ) ;
190
- slideDivs . forEach ( ( sc , i ) => {
191
- const subContainer = pc . appendChild ( ce ( "div" , "sub-container" ) ) ;
162
+ slideDivs . forEach ( sc => {
163
+ let subContainer = pc . appendChild ( ce ( "div" , "sub-container" ) ) ;
192
164
subContainer . addEventListener ( "keypress" , e => {
193
165
if ( e . key !== "Enter" ) return ;
194
166
subContainer . removeEventListener ( "click" , onClickSlide ) ;
195
167
e . stopPropagation ( ) ;
196
168
e . preventDefault ( ) ;
197
- onTalk ( i ) ;
169
+ onTalk ( sc . _i ) ;
198
170
} ) ;
199
- const sbc = subContainer . appendChild (
200
- ce ( "div" , sc . firstChild . getAttribute ( "data-bodyclass" ) || "" )
201
- ) ;
171
+ let sbc = subContainer . appendChild ( ce ( "div" , sc . firstChild . getAttribute ( "data-bodyclass" ) || "" ) ) ;
202
172
sbc . appendChild ( sc ) ;
203
173
sc . style . display = "flex" ;
204
174
useDataImageAsBackground ( sc ) ;
@@ -207,7 +177,7 @@ addEventListener("load", function() {
207
177
subContainer . removeEventListener ( "click" , onClickSlide ) ;
208
178
e . stopPropagation ( ) ;
209
179
e . preventDefault ( ) ;
210
- onTalk ( i ) ;
180
+ onTalk ( sc . _ ) ;
211
181
}
212
182
subContainer . addEventListener ( "click" , onClickSlide ) ;
213
183
} ) ;
@@ -236,17 +206,17 @@ addEventListener("load", function() {
236
206
onPrint ( ) ;
237
207
break ;
238
208
case "t" :
239
- onTalk ( ) ;
209
+ onTalk ( big . current ) ;
240
210
break ;
241
211
case "j" :
242
212
onJump ( ) ;
243
213
break ;
244
214
}
245
215
if ( big . mode !== "jump" ) return ;
246
- const { activeElement } = document ;
216
+ let { activeElement } = document ;
247
217
if ( activeElement && activeElement . classList . contains ( "slide" ) ) {
248
- const startIndex = slideDivs . indexOf ( activeElement . parentNode ) ;
249
- const columnIndexes = getColumnIndexes ( activeElement ) ;
218
+ let startIndex = slideDivs . indexOf ( activeElement . parentNode ) ,
219
+ columnIndexes = getColumnIndexes ( activeElement ) ;
250
220
jumpFocus (
251
221
e ,
252
222
{
@@ -262,8 +232,8 @@ addEventListener("load", function() {
262
232
}
263
233
264
234
function getColumnIndexes ( activeElement ) {
265
- const { left } = activeElement . getBoundingClientRect ( ) ;
266
- let lastIndex ,
235
+ let { left } = activeElement . getBoundingClientRect ( ) ,
236
+ lastIndex ,
267
237
foundSelf = false ;
268
238
for ( let i = 0 ; i < slideDivs . length ; i ++ ) {
269
239
if ( slideDivs [ i ] . firstChild . getBoundingClientRect ( ) . left === left ) {
@@ -279,24 +249,25 @@ addEventListener("load", function() {
279
249
}
280
250
281
251
function jumpFocus ( e , i ) {
282
- if ( slideDivs [ i ] ) {
283
- e . preventDefault ( ) ;
284
- slideDivs [ i ] . firstChild . focus ( ) ;
285
- }
252
+ if ( ! slideDivs [ i ] ) return ;
253
+ e . preventDefault ( ) ;
254
+ slideDivs [ i ] . firstChild . focus ( ) ;
286
255
}
287
256
288
257
function onTouchStart ( e ) {
289
258
if ( big . mode !== "talk" ) return ;
290
- const { pageX : startingPageX } = e . changedTouches [ 0 ] ;
291
- document . addEventListener ( "touchend" , onTouchEnd , { once : true } ) ;
292
-
293
- function onTouchEnd ( e2 ) {
294
- const distanceTraveled = e2 . changedTouches [ 0 ] . pageX - startingPageX ;
295
- // Don't navigate if the person didn't swipe by fewer than 4 pixels
296
- if ( Math . abs ( distanceTraveled ) < 4 ) return ;
297
- if ( distanceTraveled < 0 ) forward ( ) ;
298
- else reverse ( ) ;
299
- }
259
+ let { pageX : startingPageX } = e . changedTouches [ 0 ] ;
260
+ document . addEventListener (
261
+ "touchend" ,
262
+ function ( e2 ) {
263
+ let distanceTraveled = e2 . changedTouches [ 0 ] . pageX - startingPageX ;
264
+ // Don't navigate if the person didn't swipe by fewer than 4 pixels
265
+ if ( Math . abs ( distanceTraveled ) < 4 ) return ;
266
+ if ( distanceTraveled < 0 ) forward ( ) ;
267
+ else reverse ( ) ;
268
+ } ,
269
+ { once : true }
270
+ ) ;
300
271
}
301
272
302
273
function onHashChange ( ) {
0 commit comments