es6 refactoring, overlay design tweaks
							parent
							
								
									fba914a0ab
								
							
						
					
					
						commit
						6ee1b9f2a2
					
				
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							|  | @ -1420,6 +1420,9 @@ $controlsArrowAngleActive: 36deg; | |||
|  * OVERLAY FOR LINK PREVIEWS AND HELP | ||||
|  *********************************************/ | ||||
| 
 | ||||
| $overlayHeaderHeight: 40px; | ||||
| $overlayHeaderPadding: 5px; | ||||
| 
 | ||||
| .reveal > .overlay { | ||||
| 	position: absolute; | ||||
| 	top: 0; | ||||
|  | @ -1428,14 +1431,8 @@ $controlsArrowAngleActive: 36deg; | |||
| 	height: 100%; | ||||
| 	z-index: 1000; | ||||
| 	background: rgba( 0, 0, 0, 0.9 ); | ||||
| 	opacity: 0; | ||||
| 	visibility: hidden; | ||||
| 	transition: all 0.3s ease; | ||||
| } | ||||
| 	.reveal > .overlay.visible { | ||||
| 		opacity: 1; | ||||
| 		visibility: visible; | ||||
| 	} | ||||
| 
 | ||||
| 	.reveal > .overlay .spinner { | ||||
| 		position: absolute; | ||||
|  | @ -1458,14 +1455,14 @@ $controlsArrowAngleActive: 36deg; | |||
| 		left: 0; | ||||
| 		top: 0; | ||||
| 		width: 100%; | ||||
| 		height: 40px; | ||||
| 		padding: $overlayHeaderPadding; | ||||
| 		z-index: 2; | ||||
| 		border-bottom: 1px solid #222; | ||||
| 		box-sizing: border-box; | ||||
| 	} | ||||
| 		.reveal > .overlay header a { | ||||
| 			display: inline-block; | ||||
| 			width: 40px; | ||||
| 			height: 40px; | ||||
| 			width: $overlayHeaderHeight; | ||||
| 			height: $overlayHeaderHeight; | ||||
| 			line-height: 36px; | ||||
| 			padding: 0 10px; | ||||
| 			float: right; | ||||
|  | @ -1495,7 +1492,7 @@ $controlsArrowAngleActive: 36deg; | |||
| 	.reveal > .overlay .viewport { | ||||
| 		position: absolute; | ||||
| 		display: flex; | ||||
| 		top: 40px; | ||||
| 		top: $overlayHeaderHeight + $overlayHeaderPadding*2; | ||||
| 		right: 0; | ||||
| 		bottom: 0; | ||||
| 		left: 0; | ||||
|  |  | |||
							
								
								
									
										244
									
								
								js/reveal.js
								
								
								
								
							
							
						
						
									
										244
									
								
								js/reveal.js
								
								
								
								
							|  | @ -592,7 +592,7 @@ | |||
| 	 */ | ||||
| 	function loadScript( url, callback ) { | ||||
| 
 | ||||
| 		let script = document.createElement( 'script' ); | ||||
| 		const script = document.createElement( 'script' ); | ||||
| 		script.type = 'text/javascript'; | ||||
| 		script.async = false; | ||||
| 		script.defer = false; | ||||
|  | @ -618,14 +618,14 @@ | |||
| 				// Kill event listeners
 | ||||
| 				script.onload = script.onreadystatechange = script.onerror = null; | ||||
| 
 | ||||
| 				callback( new Error( 'Failed loading script: ' + script.src + '\n' + err) ); | ||||
| 				callback( new Error( 'Failed loading script: ' + script.src + '\n' + err ) ); | ||||
| 
 | ||||
| 			}; | ||||
| 
 | ||||
| 		} | ||||
| 
 | ||||
| 		// Append the script at the end of <head>
 | ||||
| 		let head = document.querySelector( 'head' ); | ||||
| 		const head = document.querySelector( 'head' ); | ||||
| 		head.insertBefore( script, head.lastChild ); | ||||
| 
 | ||||
| 	} | ||||
|  | @ -661,7 +661,7 @@ | |||
| 
 | ||||
| 		// Notify listeners that the presentation is ready but use a 1ms
 | ||||
| 		// timeout to ensure it's not fired synchronously after #initialize()
 | ||||
| 		setTimeout( function() { | ||||
| 		setTimeout( () => { | ||||
| 			// Enable transitions now that we're loaded
 | ||||
| 			dom.slides.classList.remove( 'no-transition' ); | ||||
| 
 | ||||
|  | @ -723,10 +723,10 @@ | |||
| 
 | ||||
| 		// Arrow controls
 | ||||
| 		dom.controls = createSingletonNode( dom.wrapper, 'aside', 'controls', | ||||
| 			'<button class="navigate-left" aria-label="' + ( config.rtl ? 'next slide' : 'previous slide' ) + '"><div class="controls-arrow"></div></button>' + | ||||
| 			'<button class="navigate-right" aria-label="' + ( config.rtl ? 'previous slide' : 'next slide' ) + '"><div class="controls-arrow"></div></button>' + | ||||
| 			'<button class="navigate-up" aria-label="above slide"><div class="controls-arrow"></div></button>' + | ||||
| 			'<button class="navigate-down" aria-label="below slide"><div class="controls-arrow"></div></button>' ); | ||||
| 			`<button class="navigate-left" aria-label="${ config.rtl ? 'next slide' : 'previous slide' }"><div class="controls-arrow"></div></button>
 | ||||
| 			<button class="navigate-right" aria-label="${ config.rtl ? 'previous slide' : 'next slide' }"><div class="controls-arrow"></div></button> | ||||
| 			<button class="navigate-up" aria-label="above slide"><div class="controls-arrow"></div></button> | ||||
| 			<button class="navigate-down" aria-label="below slide"><div class="controls-arrow"></div></button>` ); | ||||
| 
 | ||||
| 		// Slide number
 | ||||
| 		dom.slideNumber = createSingletonNode( dom.wrapper, 'div', 'slide-number', '' ); | ||||
|  | @ -766,7 +766,7 @@ | |||
| 	 */ | ||||
| 	function createStatusDiv() { | ||||
| 
 | ||||
| 		var statusDiv = document.getElementById( 'aria-status-div' ); | ||||
| 		let statusDiv = document.getElementById( 'aria-status-div' ); | ||||
| 		if( !statusDiv ) { | ||||
| 			statusDiv = document.createElement( 'div' ); | ||||
| 			statusDiv.style.position = 'absolute'; | ||||
|  | @ -790,7 +790,7 @@ | |||
| 	 */ | ||||
| 	function getStatusText( node ) { | ||||
| 
 | ||||
| 		var text = ''; | ||||
| 		let text = ''; | ||||
| 
 | ||||
| 		// Text node
 | ||||
| 		if( node.nodeType === 3 ) { | ||||
|  | @ -799,11 +799,11 @@ | |||
| 		// Element node
 | ||||
| 		else if( node.nodeType === 1 ) { | ||||
| 
 | ||||
| 			var isAriaHidden = node.getAttribute( 'aria-hidden' ); | ||||
| 			var isDisplayHidden = window.getComputedStyle( node )['display'] === 'none'; | ||||
| 			let isAriaHidden = node.getAttribute( 'aria-hidden' ); | ||||
| 			let isDisplayHidden = window.getComputedStyle( node )['display'] === 'none'; | ||||
| 			if( isAriaHidden !== 'true' && !isDisplayHidden ) { | ||||
| 
 | ||||
| 				toArray( node.childNodes ).forEach( function( child ) { | ||||
| 				toArray( node.childNodes ).forEach( child => { | ||||
| 					text += getStatusText( child ); | ||||
| 				} ); | ||||
| 
 | ||||
|  | @ -811,7 +811,7 @@ | |||
| 
 | ||||
| 		} | ||||
| 
 | ||||
| 		return text; | ||||
| 		return text.trim(); | ||||
| 
 | ||||
| 	} | ||||
| 
 | ||||
|  | @ -995,7 +995,7 @@ | |||
| 	 */ | ||||
| 	function setupScrollPrevention() { | ||||
| 
 | ||||
| 		setInterval( function() { | ||||
| 		setInterval( () => { | ||||
| 			if( dom.wrapper.scrollTop !== 0 || dom.wrapper.scrollLeft !== 0 ) { | ||||
| 				dom.wrapper.scrollTop = 0; | ||||
| 				dom.wrapper.scrollLeft = 0; | ||||
|  | @ -1016,26 +1016,24 @@ | |||
| 	 * | ||||
| 	 * @return {HTMLElement} | ||||
| 	 */ | ||||
| 	function createSingletonNode( container, tagname, classname, innerHTML ) { | ||||
| 	function createSingletonNode( container, tagname, classname, innerHTML='' ) { | ||||
| 
 | ||||
| 		// Find all nodes matching the description
 | ||||
| 		var nodes = container.querySelectorAll( '.' + classname ); | ||||
| 		let nodes = container.querySelectorAll( '.' + classname ); | ||||
| 
 | ||||
| 		// Check all matches to find one which is a direct child of
 | ||||
| 		// the specified container
 | ||||
| 		for( var i = 0; i < nodes.length; i++ ) { | ||||
| 			var testNode = nodes[i]; | ||||
| 		for( let i = 0; i < nodes.length; i++ ) { | ||||
| 			let testNode = nodes[i]; | ||||
| 			if( testNode.parentNode === container ) { | ||||
| 				return testNode; | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		// If no node was found, create it now
 | ||||
| 		var node = document.createElement( tagname ); | ||||
| 		let node = document.createElement( tagname ); | ||||
| 		node.className = classname; | ||||
| 		if( typeof innerHTML === 'string' ) { | ||||
| 			node.innerHTML = innerHTML; | ||||
| 		} | ||||
| 		node.innerHTML = innerHTML; | ||||
| 		container.appendChild( node ); | ||||
| 
 | ||||
| 		return node; | ||||
|  | @ -1049,19 +1047,19 @@ | |||
| 	 */ | ||||
| 	function createBackgrounds() { | ||||
| 
 | ||||
| 		var printMode = isPrintingPDF(); | ||||
| 		let printMode = isPrintingPDF(); | ||||
| 
 | ||||
| 		// Clear prior backgrounds
 | ||||
| 		dom.background.innerHTML = ''; | ||||
| 		dom.background.classList.add( 'no-transition' ); | ||||
| 
 | ||||
| 		// Iterate over all horizontal slides
 | ||||
| 		toArray( dom.wrapper.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) ).forEach( function( slideh ) { | ||||
| 		toArray( dom.wrapper.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) ).forEach( slideh => { | ||||
| 
 | ||||
| 			var backgroundStack = createBackground( slideh, dom.background ); | ||||
| 			let backgroundStack = createBackground( slideh, dom.background ); | ||||
| 
 | ||||
| 			// Iterate over all vertical slides
 | ||||
| 			toArray( slideh.querySelectorAll( 'section' ) ).forEach( function( slidev ) { | ||||
| 			toArray( slideh.querySelectorAll( 'section' ) ).forEach( slidev => { | ||||
| 
 | ||||
| 				createBackground( slidev, backgroundStack ); | ||||
| 
 | ||||
|  | @ -1083,7 +1081,7 @@ | |||
| 			// needed for proper transitions to be set on the element via CSS. To remove
 | ||||
| 			// annoying background slide-in effect when the presentation starts, apply
 | ||||
| 			// these properties after short time delay
 | ||||
| 			setTimeout( function() { | ||||
| 			setTimeout( () => { | ||||
| 				dom.wrapper.classList.add( 'has-parallax-background' ); | ||||
| 			}, 1 ); | ||||
| 
 | ||||
|  | @ -1107,13 +1105,12 @@ | |||
| 	 */ | ||||
| 	function createBackground( slide, container ) { | ||||
| 
 | ||||
| 
 | ||||
| 		// Main slide background element
 | ||||
| 		var element = document.createElement( 'div' ); | ||||
| 		let element = document.createElement( 'div' ); | ||||
| 		element.className = 'slide-background ' + slide.className.replace( /present|past|future/, '' ); | ||||
| 
 | ||||
| 		// Inner background element that wraps images/videos/iframes
 | ||||
| 		var contentElement = document.createElement( 'div' ); | ||||
| 		let contentElement = document.createElement( 'div' ); | ||||
| 		contentElement.className = 'slide-background-content'; | ||||
| 
 | ||||
| 		element.appendChild( contentElement ); | ||||
|  | @ -1137,7 +1134,7 @@ | |||
| 	 */ | ||||
| 	function syncBackground( slide ) { | ||||
| 
 | ||||
| 		var element = slide.slideBackgroundElement, | ||||
| 		let element = slide.slideBackgroundElement, | ||||
| 			contentElement = slide.slideBackgroundContentElement; | ||||
| 
 | ||||
| 		// Reset the prior background state in case this is not the
 | ||||
|  | @ -1158,7 +1155,7 @@ | |||
| 		contentElement.style.opacity = ''; | ||||
| 		contentElement.innerHTML = ''; | ||||
| 
 | ||||
| 		var data = { | ||||
| 		let data = { | ||||
| 			background: slide.getAttribute( 'data-background' ), | ||||
| 			backgroundSize: slide.getAttribute( 'data-background-size' ), | ||||
| 			backgroundImage: slide.getAttribute( 'data-background-image' ), | ||||
|  | @ -1213,18 +1210,18 @@ | |||
| 		// If this slide has a background color, we add a class that
 | ||||
| 		// signals if it is light or dark. If the slide has no background
 | ||||
| 		// color, no class will be added
 | ||||
| 		var contrastColor = data.backgroundColor; | ||||
| 		let contrastColor = data.backgroundColor; | ||||
| 
 | ||||
| 		// If no bg color was found, check the computed background
 | ||||
| 		if( !contrastColor ) { | ||||
| 			var computedBackgroundStyle = window.getComputedStyle( element ); | ||||
| 			let computedBackgroundStyle = window.getComputedStyle( element ); | ||||
| 			if( computedBackgroundStyle && computedBackgroundStyle.backgroundColor ) { | ||||
| 				contrastColor = computedBackgroundStyle.backgroundColor; | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		if( contrastColor ) { | ||||
| 			var rgb = colorToRgb( contrastColor ); | ||||
| 			let rgb = colorToRgb( contrastColor ); | ||||
| 
 | ||||
| 			// Ignore fully transparent backgrounds. Some browsers return
 | ||||
| 			// rgba(0,0,0,0) when reading the computed background color of
 | ||||
|  | @ -1254,8 +1251,8 @@ | |||
| 	function setupPostMessage() { | ||||
| 
 | ||||
| 		if( config.postMessage ) { | ||||
| 			window.addEventListener( 'message', function ( event ) { | ||||
| 				var data = event.data; | ||||
| 			window.addEventListener( 'message', event => { | ||||
| 				const data = event.data; | ||||
| 
 | ||||
| 				// Make sure we're dealing with JSON
 | ||||
| 				if( typeof data === 'string' && data.charAt( 0 ) === '{' && data.charAt( data.length - 1 ) === '}' ) { | ||||
|  | @ -1292,7 +1289,7 @@ | |||
| 	 */ | ||||
| 	function configure( options ) { | ||||
| 
 | ||||
| 		var oldTransition = config.transition; | ||||
| 		const oldTransition = config.transition; | ||||
| 
 | ||||
| 		// New config options may be passed when this method
 | ||||
| 		// is invoked through the API after initialization
 | ||||
|  | @ -1303,7 +1300,7 @@ | |||
| 		// finishes
 | ||||
| 		if( loaded === false ) return; | ||||
| 
 | ||||
| 		var numberOfSlides = dom.wrapper.querySelectorAll( SLIDES_SELECTOR ).length; | ||||
| 		const numberOfSlides = dom.wrapper.querySelectorAll( SLIDES_SELECTOR ).length; | ||||
| 
 | ||||
| 		// Remove the previously configured transition class
 | ||||
| 		dom.wrapper.classList.remove( oldTransition ); | ||||
|  | @ -1397,7 +1394,7 @@ | |||
| 
 | ||||
| 		// Generate auto-slide controls if needed
 | ||||
| 		if( numberOfSlides > 1 && config.autoSlide && config.autoSlideStoppable ) { | ||||
| 			autoSlidePlayer = new Playback( dom.wrapper, function() { | ||||
| 			autoSlidePlayer = new Playback( dom.wrapper, () => { | ||||
| 				return Math.min( Math.max( ( Date.now() - autoSlideStartTime ) / autoSlide, 0 ), 1 ); | ||||
| 			} ); | ||||
| 
 | ||||
|  | @ -1407,14 +1404,14 @@ | |||
| 
 | ||||
| 		// When fragments are turned off they should be visible
 | ||||
| 		if( config.fragments === false ) { | ||||
| 			toArray( dom.slides.querySelectorAll( '.fragment' ) ).forEach( function( element ) { | ||||
| 			toArray( dom.slides.querySelectorAll( '.fragment' ) ).forEach( element => { | ||||
| 				element.classList.add( 'visible' ); | ||||
| 				element.classList.remove( 'current-fragment' ); | ||||
| 			} ); | ||||
| 		} | ||||
| 
 | ||||
| 		// Slide numbers
 | ||||
| 		var slideNumberDisplay = 'none'; | ||||
| 		let slideNumberDisplay = 'none'; | ||||
| 		if( config.slideNumber && !isPrintingPDF() ) { | ||||
| 			if( config.showSlideNumber === 'all' ) { | ||||
| 				slideNumberDisplay = 'block'; | ||||
|  | @ -1506,7 +1503,7 @@ | |||
| 
 | ||||
| 		// Listen to both touch and click events, in case the device
 | ||||
| 		// supports both
 | ||||
| 		var pointerEvents = [ 'touchstart', 'click' ]; | ||||
| 		let pointerEvents = [ 'touchstart', 'click' ]; | ||||
| 
 | ||||
| 		// Only support touch for Android, fixes double navigations in
 | ||||
| 		// stock browser
 | ||||
|  | @ -1753,7 +1750,7 @@ | |||
| 	 */ | ||||
| 	function injectStyleSheet( value ) { | ||||
| 
 | ||||
| 		var tag = document.createElement( 'style' ); | ||||
| 		let tag = document.createElement( 'style' ); | ||||
| 		tag.type = 'text/css'; | ||||
| 		if( tag.styleSheet ) { | ||||
| 			tag.styleSheet.cssText = value; | ||||
|  | @ -1778,14 +1775,14 @@ | |||
| 	 */ | ||||
| 	function closestParent( target, selector ) { | ||||
| 
 | ||||
| 		var parent = target.parentNode; | ||||
| 		let parent = target.parentNode; | ||||
| 
 | ||||
| 		while( parent ) { | ||||
| 
 | ||||
| 			// There's some overhead doing this each time, we don't
 | ||||
| 			// want to rewrite the element prototype but should still
 | ||||
| 			// be enough to feature detect once at startup...
 | ||||
| 			var matchesMethod = parent.matches || parent.matchesSelector || parent.msMatchesSelector; | ||||
| 			let matchesMethod = parent.matches || parent.matchesSelector || parent.msMatchesSelector; | ||||
| 
 | ||||
| 			// If we find a match, we're all set
 | ||||
| 			if( matchesMethod && matchesMethod.call( parent, selector ) ) { | ||||
|  | @ -1818,7 +1815,7 @@ | |||
| 	 */ | ||||
| 	function colorToRgb( color ) { | ||||
| 
 | ||||
| 		var hex3 = color.match( /^#([0-9a-f]{3})$/i ); | ||||
| 		let hex3 = color.match( /^#([0-9a-f]{3})$/i ); | ||||
| 		if( hex3 && hex3[1] ) { | ||||
| 			hex3 = hex3[1]; | ||||
| 			return { | ||||
|  | @ -1828,7 +1825,7 @@ | |||
| 			}; | ||||
| 		} | ||||
| 
 | ||||
| 		var hex6 = color.match( /^#([0-9a-f]{6})$/i ); | ||||
| 		let hex6 = color.match( /^#([0-9a-f]{6})$/i ); | ||||
| 		if( hex6 && hex6[1] ) { | ||||
| 			hex6 = hex6[1]; | ||||
| 			return { | ||||
|  | @ -1838,7 +1835,7 @@ | |||
| 			}; | ||||
| 		} | ||||
| 
 | ||||
| 		var rgb = color.match( /^rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/i ); | ||||
| 		let rgb = color.match( /^rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/i ); | ||||
| 		if( rgb ) { | ||||
| 			return { | ||||
| 				r: parseInt( rgb[1], 10 ), | ||||
|  | @ -1847,7 +1844,7 @@ | |||
| 			}; | ||||
| 		} | ||||
| 
 | ||||
| 		var rgba = color.match( /^rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\,\s*([\d]+|[\d]*.[\d]+)\s*\)$/i ); | ||||
| 		let rgba = color.match( /^rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\,\s*([\d]+|[\d]*.[\d]+)\s*\)$/i ); | ||||
| 		if( rgba ) { | ||||
| 			return { | ||||
| 				r: parseInt( rgba[1], 10 ), | ||||
|  | @ -1888,12 +1885,10 @@ | |||
| 	 * @param {HTMLElement} element | ||||
| 	 * @param {number} [height] | ||||
| 	 */ | ||||
| 	function getRemainingHeight( element, height ) { | ||||
| 
 | ||||
| 		height = height || 0; | ||||
| 	function getRemainingHeight( element, height = 0 ) { | ||||
| 
 | ||||
| 		if( element ) { | ||||
| 			var newHeight, oldHeight = element.style.height; | ||||
| 			let newHeight, oldHeight = element.style.height; | ||||
| 
 | ||||
| 			// Change the .stretch element height to 0 in order find the height of all
 | ||||
| 			// the other elements
 | ||||
|  | @ -1933,7 +1928,7 @@ | |||
| 	 */ | ||||
| 	function dispatchEvent( type, args ) { | ||||
| 
 | ||||
| 		var event = document.createEvent( 'HTMLEvents', 1, 2 ); | ||||
| 		let event = document.createEvent( 'HTMLEvents', 1, 2 ); | ||||
| 		event.initEvent( type, true, true ); | ||||
| 		extend( event, args ); | ||||
| 		dom.wrapper.dispatchEvent( event ); | ||||
|  | @ -1950,7 +1945,7 @@ | |||
| 	function dispatchPostMessage( type, data ) { | ||||
| 
 | ||||
| 		if( config.postMessageEvents && window.parent !== window.self ) { | ||||
| 			var message = { | ||||
| 			let message = { | ||||
| 				namespace: 'reveal', | ||||
| 				eventName: type, | ||||
| 				state: getState() | ||||
|  | @ -1968,11 +1963,9 @@ | |||
| 	 * | ||||
| 	 * @param {string} [selector=a] - selector for anchors | ||||
| 	 */ | ||||
| 	function enablePreviewLinks( selector ) { | ||||
| 	function enablePreviewLinks( selector = 'a' ) { | ||||
| 
 | ||||
| 		var anchors = toArray( document.querySelectorAll( selector ? selector : 'a' ) ); | ||||
| 
 | ||||
| 		anchors.forEach( function( element ) { | ||||
| 		toArray( document.querySelectorAll( selector ) ).forEach( element => { | ||||
| 			if( /^(http|www)/gi.test( element.getAttribute( 'href' ) ) ) { | ||||
| 				element.addEventListener( 'click', onPreviewLinkClicked, false ); | ||||
| 			} | ||||
|  | @ -1983,11 +1976,9 @@ | |||
| 	/** | ||||
| 	 * Unbind preview frame links. | ||||
| 	 */ | ||||
| 	function disablePreviewLinks( selector ) { | ||||
| 	function disablePreviewLinks( selector = 'a' ) { | ||||
| 
 | ||||
| 		var anchors = toArray( document.querySelectorAll( selector ? selector : 'a' ) ); | ||||
| 
 | ||||
| 		anchors.forEach( function( element ) { | ||||
| 		toArray( document.querySelectorAll( selector ) ).forEach( element => { | ||||
| 			if( /^(http|www)/gi.test( element.getAttribute( 'href' ) ) ) { | ||||
| 				element.removeEventListener( 'click', onPreviewLinkClicked, false ); | ||||
| 			} | ||||
|  | @ -2022,23 +2013,19 @@ | |||
| 				</small> | ||||
| 			</div>`; | ||||
| 
 | ||||
| 		dom.overlay.querySelector( 'iframe' ).addEventListener( 'load', function( event ) { | ||||
| 		dom.overlay.querySelector( 'iframe' ).addEventListener( 'load', event => { | ||||
| 			dom.overlay.classList.add( 'loaded' ); | ||||
| 		}, false ); | ||||
| 
 | ||||
| 		dom.overlay.querySelector( '.close' ).addEventListener( 'click', function( event ) { | ||||
| 		dom.overlay.querySelector( '.close' ).addEventListener( 'click', event => { | ||||
| 			closeOverlay(); | ||||
| 			event.preventDefault(); | ||||
| 		}, false ); | ||||
| 
 | ||||
| 		dom.overlay.querySelector( '.external' ).addEventListener( 'click', function( event ) { | ||||
| 		dom.overlay.querySelector( '.external' ).addEventListener( 'click', event => { | ||||
| 			closeOverlay(); | ||||
| 		}, false ); | ||||
| 
 | ||||
| 		setTimeout( function() { | ||||
| 			dom.overlay.classList.add( 'visible' ); | ||||
| 		}, 1 ); | ||||
| 
 | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
|  | @ -2077,7 +2064,7 @@ | |||
| 			dom.overlay.classList.add( 'overlay-help' ); | ||||
| 			dom.wrapper.appendChild( dom.overlay ); | ||||
| 
 | ||||
| 			var html = '<p class="title">Keyboard Shortcuts</p><br/>'; | ||||
| 			let html = '<p class="title">Keyboard Shortcuts</p><br/>'; | ||||
| 
 | ||||
| 			html += '<table><th>KEY</th><th>ACTION</th>'; | ||||
| 			for( var key in keyboardShortcuts ) { | ||||
|  | @ -2107,10 +2094,6 @@ | |||
| 				event.preventDefault(); | ||||
| 			}, false ); | ||||
| 
 | ||||
| 			requestAnimationFrame( function() { | ||||
| 				dom.overlay.classList.add( 'visible' ); | ||||
| 			} ); | ||||
| 
 | ||||
| 		} | ||||
| 
 | ||||
| 	} | ||||
|  | @ -2147,9 +2130,9 @@ | |||
| 					document.documentElement.style.setProperty( '--vh', ( window.innerHeight * 0.01 ) + 'px' ); | ||||
| 				} | ||||
| 
 | ||||
| 				var size = getComputedSlideSize(); | ||||
| 				const size = getComputedSlideSize(); | ||||
| 
 | ||||
| 				var oldScale = scale; | ||||
| 				const oldScale = scale; | ||||
| 
 | ||||
| 				// Layout the contents of the slides
 | ||||
| 				layoutSlideContents( config.width, config.height ); | ||||
|  | @ -2202,17 +2185,17 @@ | |||
| 				} | ||||
| 
 | ||||
| 				// Select all slides, vertical and horizontal
 | ||||
| 				var slides = toArray( dom.wrapper.querySelectorAll( SLIDES_SELECTOR ) ); | ||||
| 				const slides = toArray( dom.wrapper.querySelectorAll( SLIDES_SELECTOR ) ); | ||||
| 
 | ||||
| 				for( var i = 0, len = slides.length; i < len; i++ ) { | ||||
| 					var slide = slides[ i ]; | ||||
| 					const slide = slides[ i ]; | ||||
| 
 | ||||
| 					// Don't bother updating invisible slides
 | ||||
| 					if( slide.style.display === 'none' ) { | ||||
| 						continue; | ||||
| 					} | ||||
| 
 | ||||
| 					if( ( config.center || slide.classList.contains( 'center' ) ) ) { | ||||
| 					if( config.center || slide.classList.contains( 'center' ) ) { | ||||
| 						// Vertical stacks are not centred since their section
 | ||||
| 						// children will be
 | ||||
| 						if( slide.classList.contains( 'stack' ) ) { | ||||
|  | @ -2258,17 +2241,17 @@ | |||
| 	function layoutSlideContents( width, height ) { | ||||
| 
 | ||||
| 		// Handle sizing of elements with the 'stretch' class
 | ||||
| 		toArray( dom.slides.querySelectorAll( 'section > .stretch' ) ).forEach( function( element ) { | ||||
| 		toArray( dom.slides.querySelectorAll( 'section > .stretch' ) ).forEach( element => { | ||||
| 
 | ||||
| 			// Determine how much vertical space we can use
 | ||||
| 			var remainingHeight = getRemainingHeight( element, height ); | ||||
| 
 | ||||
| 			// Consider the aspect ratio of media elements
 | ||||
| 			if( /(img|video)/gi.test( element.nodeName ) ) { | ||||
| 				var nw = element.naturalWidth || element.videoWidth, | ||||
| 					nh = element.naturalHeight || element.videoHeight; | ||||
| 				const nw = element.naturalWidth || element.videoWidth, | ||||
| 					  nh = element.naturalHeight || element.videoHeight; | ||||
| 
 | ||||
| 				var es = Math.min( width / nw, remainingHeight / nh ); | ||||
| 				const es = Math.min( width / nw, remainingHeight / nh ); | ||||
| 
 | ||||
| 				element.style.width = ( nw * es ) + 'px'; | ||||
| 				element.style.height = ( nh * es ) + 'px'; | ||||
|  | @ -2293,7 +2276,7 @@ | |||
| 	 */ | ||||
| 	function getComputedSlideSize( presentationWidth, presentationHeight ) { | ||||
| 
 | ||||
| 		var size = { | ||||
| 		const size = { | ||||
| 			// Slide size
 | ||||
| 			width: config.width, | ||||
| 			height: config.height, | ||||
|  | @ -2348,7 +2331,7 @@ | |||
| 
 | ||||
| 		if( typeof stack === 'object' && typeof stack.setAttribute === 'function' && stack.classList.contains( 'stack' ) ) { | ||||
| 			// Prefer manually defined start-indexv
 | ||||
| 			var attributeName = stack.hasAttribute( 'data-start-indexv' ) ? 'data-start-indexv' : 'data-previous-indexv'; | ||||
| 			const attributeName = stack.hasAttribute( 'data-start-indexv' ) ? 'data-start-indexv' : 'data-previous-indexv'; | ||||
| 
 | ||||
| 			return parseInt( stack.getAttribute( attributeName ) || 0, 10 ); | ||||
| 		} | ||||
|  | @ -2378,15 +2361,15 @@ | |||
| 			dom.slides.appendChild( dom.background ); | ||||
| 
 | ||||
| 			// Clicking on an overview slide navigates to it
 | ||||
| 			toArray( dom.wrapper.querySelectorAll( SLIDES_SELECTOR ) ).forEach( function( slide ) { | ||||
| 			toArray( dom.wrapper.querySelectorAll( SLIDES_SELECTOR ) ).forEach( slide => { | ||||
| 				if( !slide.classList.contains( 'stack' ) ) { | ||||
| 					slide.addEventListener( 'click', onOverviewSlideClicked, true ); | ||||
| 				} | ||||
| 			} ); | ||||
| 
 | ||||
| 			// Calculate slide sizes
 | ||||
| 			var margin = 70; | ||||
| 			var slideSize = getComputedSlideSize(); | ||||
| 			const margin = 70; | ||||
| 			const slideSize = getComputedSlideSize(); | ||||
| 			overviewSlideWidth = slideSize.width + margin; | ||||
| 			overviewSlideHeight = slideSize.height + margin; | ||||
| 
 | ||||
|  | @ -2419,13 +2402,13 @@ | |||
| 	function layoutOverview() { | ||||
| 
 | ||||
| 		// Layout slides
 | ||||
| 		toArray( dom.wrapper.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) ).forEach( function( hslide, h ) { | ||||
| 		toArray( dom.wrapper.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) ).forEach( ( hslide, h ) => { | ||||
| 			hslide.setAttribute( 'data-index-h', h ); | ||||
| 			transformElement( hslide, 'translate3d(' + ( h * overviewSlideWidth ) + 'px, 0, 0)' ); | ||||
| 
 | ||||
| 			if( hslide.classList.contains( 'stack' ) ) { | ||||
| 
 | ||||
| 				toArray( hslide.querySelectorAll( 'section' ) ).forEach( function( vslide, v ) { | ||||
| 				toArray( hslide.querySelectorAll( 'section' ) ).forEach( ( vslide, v ) => { | ||||
| 					vslide.setAttribute( 'data-index-h', h ); | ||||
| 					vslide.setAttribute( 'data-index-v', v ); | ||||
| 
 | ||||
|  | @ -2436,10 +2419,10 @@ | |||
| 		} ); | ||||
| 
 | ||||
| 		// Layout slide backgrounds
 | ||||
| 		toArray( dom.background.childNodes ).forEach( function( hbackground, h ) { | ||||
| 		toArray( dom.background.childNodes ).forEach( ( hbackground, h ) => { | ||||
| 			transformElement( hbackground, 'translate3d(' + ( h * overviewSlideWidth ) + 'px, 0, 0)' ); | ||||
| 
 | ||||
| 			toArray( hbackground.querySelectorAll( '.slide-background' ) ).forEach( function( vbackground, v ) { | ||||
| 			toArray( hbackground.querySelectorAll( '.slide-background' ) ).forEach( ( vbackground, v ) => { | ||||
| 				transformElement( vbackground, 'translate3d(0, ' + ( v * overviewSlideHeight ) + 'px, 0)' ); | ||||
| 			} ); | ||||
| 		} ); | ||||
|  | @ -2483,7 +2466,7 @@ | |||
| 			// moving from slide to slide
 | ||||
| 			dom.wrapper.classList.add( 'overview-deactivating' ); | ||||
| 
 | ||||
| 			setTimeout( function () { | ||||
| 			setTimeout( () => { | ||||
| 				dom.wrapper.classList.remove( 'overview-deactivating' ); | ||||
| 			}, 1 ); | ||||
| 
 | ||||
|  | @ -2491,14 +2474,14 @@ | |||
| 			dom.wrapper.appendChild( dom.background ); | ||||
| 
 | ||||
| 			// Clean up changes made to slides
 | ||||
| 			toArray( dom.wrapper.querySelectorAll( SLIDES_SELECTOR ) ).forEach( function( slide ) { | ||||
| 			toArray( dom.wrapper.querySelectorAll( SLIDES_SELECTOR ) ).forEach( slide => { | ||||
| 				transformElement( slide, '' ); | ||||
| 
 | ||||
| 				slide.removeEventListener( 'click', onOverviewSlideClicked, true ); | ||||
| 			} ); | ||||
| 
 | ||||
| 			// Clean up changes made to backgrounds
 | ||||
| 			toArray( dom.background.querySelectorAll( '.slide-background' ) ).forEach( function( background ) { | ||||
| 			toArray( dom.background.querySelectorAll( '.slide-background' ) ).forEach( background => { | ||||
| 				transformElement( background, '' ); | ||||
| 			} ); | ||||
| 
 | ||||
|  | @ -2557,16 +2540,16 @@ | |||
| 	 */ | ||||
| 	function locationHash( slide ) { | ||||
| 
 | ||||
| 		var url = '/'; | ||||
| 		let url = '/'; | ||||
| 
 | ||||
| 		// Attempt to create a named link based on the slide's ID
 | ||||
| 		var s = slide || currentSlide; | ||||
| 		var id = s ? s.getAttribute( 'id' ) : null; | ||||
| 		let s = slide || currentSlide; | ||||
| 		let id = s ? s.getAttribute( 'id' ) : null; | ||||
| 		if( id ) { | ||||
| 			id = encodeURIComponent( id ); | ||||
| 		} | ||||
| 
 | ||||
| 		var index = getIndices( slide ); | ||||
| 		let index = getIndices( slide ); | ||||
| 		if( !config.fragmentInURL ) { | ||||
| 			index.f = undefined; | ||||
| 		} | ||||
|  | @ -2578,7 +2561,7 @@ | |||
| 		} | ||||
| 		// Otherwise use the /h/v index
 | ||||
| 		else { | ||||
| 			var hashIndexBase = config.hashOneBasedIndex ? 1 : 0; | ||||
| 			let hashIndexBase = config.hashOneBasedIndex ? 1 : 0; | ||||
| 			if( index.h > 0 || index.v > 0 || index.f !== undefined ) url += index.h + hashIndexBase; | ||||
| 			if( index.v > 0 || index.f !== undefined ) url += '/' + (index.v + hashIndexBase ); | ||||
| 			if( index.f !== undefined ) url += '/' + index.f; | ||||
|  | @ -2596,10 +2579,7 @@ | |||
| 	 * orientation of | ||||
| 	 * @return {Boolean} | ||||
| 	 */ | ||||
| 	function isVerticalSlide( slide ) { | ||||
| 
 | ||||
| 		// Prefer slide argument, otherwise use current slide
 | ||||
| 		slide = slide ? slide : currentSlide; | ||||
| 	function isVerticalSlide( slide = currentSlide ) { | ||||
| 
 | ||||
| 		return slide && slide.parentNode && !!slide.parentNode.nodeName.match( /section/i ); | ||||
| 
 | ||||
|  | @ -2613,10 +2593,10 @@ | |||
| 	 */ | ||||
| 	function enterFullscreen() { | ||||
| 
 | ||||
| 		var element = document.documentElement; | ||||
| 		let element = document.documentElement; | ||||
| 
 | ||||
| 		// Check which implementation is available
 | ||||
| 		var requestMethod = element.requestFullscreen || | ||||
| 		let requestMethod = element.requestFullscreen || | ||||
| 							element.webkitRequestFullscreen || | ||||
| 							element.webkitRequestFullScreen || | ||||
| 							element.mozRequestFullScreen || | ||||
|  | @ -2661,7 +2641,7 @@ | |||
| 	function pause() { | ||||
| 
 | ||||
| 		if( config.pause ) { | ||||
| 			var wasPaused = dom.wrapper.classList.contains( 'paused' ); | ||||
| 			const wasPaused = dom.wrapper.classList.contains( 'paused' ); | ||||
| 
 | ||||
| 			cancelAutoSlide(); | ||||
| 			dom.wrapper.classList.add( 'paused' ); | ||||
|  | @ -2678,7 +2658,7 @@ | |||
| 	 */ | ||||
| 	function resume() { | ||||
| 
 | ||||
| 		var wasPaused = dom.wrapper.classList.contains( 'paused' ); | ||||
| 		const wasPaused = dom.wrapper.classList.contains( 'paused' ); | ||||
| 		dom.wrapper.classList.remove( 'paused' ); | ||||
| 
 | ||||
| 		cueAutoSlide(); | ||||
|  | @ -2761,7 +2741,7 @@ | |||
| 		previousSlide = currentSlide; | ||||
| 
 | ||||
| 		// Query all horizontal slides in the deck
 | ||||
| 		var horizontalSlides = dom.wrapper.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ); | ||||
| 		const horizontalSlides = dom.wrapper.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ); | ||||
| 
 | ||||
| 		// Abort if there are no slides
 | ||||
| 		if( horizontalSlides.length === 0 ) return; | ||||
|  | @ -2779,12 +2759,12 @@ | |||
| 		} | ||||
| 
 | ||||
| 		// Remember the state before this slide
 | ||||
| 		var stateBefore = state.concat(); | ||||
| 		const stateBefore = state.concat(); | ||||
| 
 | ||||
| 		// Reset the state array
 | ||||
| 		state.length = 0; | ||||
| 
 | ||||
| 		var indexhBefore = indexh || 0, | ||||
| 		let indexhBefore = indexh || 0, | ||||
| 			indexvBefore = indexv || 0; | ||||
| 
 | ||||
| 		// Activate and transition to the new slide
 | ||||
|  | @ -2803,7 +2783,7 @@ | |||
| 
 | ||||
| 		// Find the current horizontal slide and any possible vertical slides
 | ||||
| 		// within it
 | ||||
| 		var currentHorizontalSlide = horizontalSlides[ indexh ], | ||||
| 		let currentHorizontalSlide = horizontalSlides[ indexh ], | ||||
| 			currentVerticalSlides = currentHorizontalSlide.querySelectorAll( 'section' ); | ||||
| 
 | ||||
| 		// Store references to the previous and current slides
 | ||||
|  | @ -2815,7 +2795,7 @@ | |||
| 		} | ||||
| 
 | ||||
| 		// Dispatch an event if the slide changed
 | ||||
| 		var slideChanged = ( indexh !== indexhBefore || indexv !== indexvBefore ); | ||||
| 		let slideChanged = ( indexh !== indexhBefore || indexv !== indexvBefore ); | ||||
| 		if (!slideChanged) { | ||||
| 			// Ensure that the previous slide is never the same as the current
 | ||||
| 			previousSlide = null; | ||||
|  | @ -2829,26 +2809,21 @@ | |||
| 			previousSlide.setAttribute( 'aria-hidden', 'true' ); | ||||
| 
 | ||||
| 			// Reset all slides upon navigate to home
 | ||||
| 			// Issue: #285
 | ||||
| 			if ( dom.wrapper.querySelector( HOME_SLIDE_SELECTOR ).classList.contains( 'present' ) ) { | ||||
| 			if( Reveal.isFirstSlide() ) { | ||||
| 				// Launch async task
 | ||||
| 				setTimeout( function () { | ||||
| 					var slides = toArray( dom.wrapper.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR + '.stack') ), i; | ||||
| 					for( i in slides ) { | ||||
| 						if( slides[i] ) { | ||||
| 							// Reset stack
 | ||||
| 							setPreviousVerticalIndex( slides[i], 0 ); | ||||
| 						} | ||||
| 					} | ||||
| 				setTimeout( () => { | ||||
| 					getVerticalStacks().forEach( slide => { | ||||
| 						setPreviousVerticalIndex( slide, 0 ); | ||||
| 					} ); | ||||
| 				}, 0 ); | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		// Apply the new state
 | ||||
| 		stateLoop: for( var i = 0, len = state.length; i < len; i++ ) { | ||||
| 		stateLoop: for( let i = 0, len = state.length; i < len; i++ ) { | ||||
| 			// Check if this state existed on the previous slide. If it
 | ||||
| 			// did, we will avoid adding it repeatedly
 | ||||
| 			for( var j = 0; j < stateBefore.length; j++ ) { | ||||
| 			for( let j = 0; j < stateBefore.length; j++ ) { | ||||
| 				if( stateBefore[j] === state[i] ) { | ||||
| 					stateBefore.splice( j, 1 ); | ||||
| 					continue stateLoop; | ||||
|  | @ -2906,7 +2881,7 @@ | |||
| 			if( previousSlide.hasAttribute( 'data-auto-animate' ) && currentSlide.hasAttribute( 'data-auto-animate' ) ) { | ||||
| 				dom.slides.classList.add( 'disable-slide-transitions' ); | ||||
| 
 | ||||
| 				setTimeout( function() { | ||||
| 				setTimeout( () => { | ||||
| 					dom.slides.classList.remove( 'disable-slide-transitions' ); | ||||
| 				}, 0 ); | ||||
| 
 | ||||
|  | @ -4976,6 +4951,15 @@ | |||
| 
 | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Returns all vertical stacks (each stack can contain multiple slides). | ||||
| 	 */ | ||||
| 	function getVerticalStacks() { | ||||
| 
 | ||||
| 		return toArray( dom.wrapper.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR + '.stack') ); | ||||
| 
 | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Returns true if there are at least two horizontal slides. | ||||
| 	 */ | ||||
|  | @ -6569,7 +6553,7 @@ | |||
| 
 | ||||
| 		// Returns true if we're currently on the first slide
 | ||||
| 		isFirstSlide: function() { | ||||
| 			return ( indexh === 0 && indexv === 0 ); | ||||
| 			return indexh === 0 && indexv === 0; | ||||
| 		}, | ||||
| 
 | ||||
| 		// Returns true if we're currently on the last slide
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Hakim El Hattab
						Hakim El Hattab