|
@@ -82,6 +82,9 @@ var Reveal = (function(){
|
|
// Transition speed
|
|
// Transition speed
|
|
transitionSpeed: 'default', // default/fast/slow
|
|
transitionSpeed: 'default', // default/fast/slow
|
|
|
|
|
|
|
|
+ // Transition style for full page slide backgrounds
|
|
|
|
+ backgroundTransition: 'default', // default/linear
|
|
|
|
+
|
|
// Script dependencies to load
|
|
// Script dependencies to load
|
|
dependencies: []
|
|
dependencies: []
|
|
},
|
|
},
|
|
@@ -189,6 +192,13 @@ var Reveal = (function(){
|
|
dom.wrapper = document.querySelector( '.reveal' );
|
|
dom.wrapper = document.querySelector( '.reveal' );
|
|
dom.slides = document.querySelector( '.reveal .slides' );
|
|
dom.slides = document.querySelector( '.reveal .slides' );
|
|
|
|
|
|
|
|
+ // Background element
|
|
|
|
+ if( !document.querySelector( '.reveal .backgrounds' ) ) {
|
|
|
|
+ dom.background = document.createElement( 'div' );
|
|
|
|
+ dom.background.classList.add( 'backgrounds' );
|
|
|
|
+ dom.wrapper.appendChild( dom.background );
|
|
|
|
+ }
|
|
|
|
+
|
|
// Progress bar
|
|
// Progress bar
|
|
if( !dom.wrapper.querySelector( '.progress' ) ) {
|
|
if( !dom.wrapper.querySelector( '.progress' ) ) {
|
|
var progressElement = document.createElement( 'div' );
|
|
var progressElement = document.createElement( 'div' );
|
|
@@ -208,11 +218,11 @@ var Reveal = (function(){
|
|
dom.wrapper.appendChild( controlsElement );
|
|
dom.wrapper.appendChild( controlsElement );
|
|
}
|
|
}
|
|
|
|
|
|
- // Presentation background element
|
|
|
|
|
|
+ // State background element [DEPRECATED]
|
|
if( !dom.wrapper.querySelector( '.state-background' ) ) {
|
|
if( !dom.wrapper.querySelector( '.state-background' ) ) {
|
|
- var backgroundElement = document.createElement( 'div' );
|
|
|
|
- backgroundElement.classList.add( 'state-background' );
|
|
|
|
- dom.wrapper.appendChild( backgroundElement );
|
|
|
|
|
|
+ var stateBackgroundElement = document.createElement( 'div' );
|
|
|
|
+ stateBackgroundElement.classList.add( 'state-background' );
|
|
|
|
+ dom.wrapper.appendChild( stateBackgroundElement );
|
|
}
|
|
}
|
|
|
|
|
|
// Overlay graphic which is displayed during the paused mode
|
|
// Overlay graphic which is displayed during the paused mode
|
|
@@ -240,6 +250,86 @@ var Reveal = (function(){
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
+ * Creates the slide background elements and appends them
|
|
|
|
+ * to the background container. One element is created per
|
|
|
|
+ * slide no matter if the given slide has visible background.
|
|
|
|
+ */
|
|
|
|
+ function createBackgrounds() {
|
|
|
|
+
|
|
|
|
+ if( isPrintingPDF() ) {
|
|
|
|
+ document.body.classList.add( 'print-pdf' );
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // Clear prior backgrounds
|
|
|
|
+ dom.background.innerHTML = '';
|
|
|
|
+ dom.background.classList.add( 'no-transition' );
|
|
|
|
+
|
|
|
|
+ // Helper method for creating a background element for the
|
|
|
|
+ // given slide
|
|
|
|
+ function _createBackground( slide, container ) {
|
|
|
|
+
|
|
|
|
+ var data = {
|
|
|
|
+ background: slide.getAttribute( 'data-background' ),
|
|
|
|
+ backgroundSize: slide.getAttribute( 'data-background-size' ),
|
|
|
|
+ backgroundColor: slide.getAttribute( 'data-background-color' ),
|
|
|
|
+ backgroundRepeat: slide.getAttribute( 'data-background-repeat' ),
|
|
|
|
+ backgroundPosition: slide.getAttribute( 'data-background-position' )
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ var element = document.createElement( 'div' );
|
|
|
|
+ element.className = 'slide-background';
|
|
|
|
+
|
|
|
|
+ if( data.background ) {
|
|
|
|
+ // Auto-wrap image urls in url(...)
|
|
|
|
+ if( /\.(png|jpg|jpeg|gif|bmp)$/gi.test( data.background ) ) {
|
|
|
|
+ element.style.backgroundImage = 'url('+ data.background +')';
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ element.style.background = data.background;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // Additional and optional background properties
|
|
|
|
+ if( data.backgroundSize ) element.style.backgroundSize = data.backgroundSize;
|
|
|
|
+ if( data.backgroundColor ) element.style.backgroundColor = data.backgroundColor;
|
|
|
|
+ if( data.backgroundRepeat ) element.style.backgroundRepeat = data.backgroundRepeat;
|
|
|
|
+ if( data.backgroundPosition ) element.style.backgroundPosition = data.backgroundPosition;
|
|
|
|
+
|
|
|
|
+ container.appendChild( element );
|
|
|
|
+
|
|
|
|
+ return element;
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // Iterate over all horizontal slides
|
|
|
|
+ toArray( document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) ).forEach( function( slideh ) {
|
|
|
|
+
|
|
|
|
+ var backgroundStack;
|
|
|
|
+
|
|
|
|
+ if( isPrintingPDF() ) {
|
|
|
|
+ backgroundStack = _createBackground( slideh, slideh );
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ backgroundStack = _createBackground( slideh, dom.background );
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // Iterate over all vertical slides
|
|
|
|
+ toArray( slideh.querySelectorAll( 'section' ) ).forEach( function( slidev ) {
|
|
|
|
+
|
|
|
|
+ if( isPrintingPDF() ) {
|
|
|
|
+ _createBackground( slidev, slidev );
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ _createBackground( slidev, backgroundStack );
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ } );
|
|
|
|
+
|
|
|
|
+ } );
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* Hides the address bar if we're on a mobile device.
|
|
* Hides the address bar if we're on a mobile device.
|
|
*/
|
|
*/
|
|
@@ -351,6 +441,7 @@ var Reveal = (function(){
|
|
dom.wrapper.classList.add( config.transition );
|
|
dom.wrapper.classList.add( config.transition );
|
|
|
|
|
|
dom.wrapper.setAttribute( 'data-transition-speed', config.transitionSpeed );
|
|
dom.wrapper.setAttribute( 'data-transition-speed', config.transitionSpeed );
|
|
|
|
+ dom.wrapper.setAttribute( 'data-background-transition', config.backgroundTransition );
|
|
|
|
|
|
if( dom.controls ) {
|
|
if( dom.controls ) {
|
|
dom.controls.style.display = ( config.controls && dom.controls ) ? 'block' : 'none';
|
|
dom.controls.style.display = ( config.controls && dom.controls ) ? 'block' : 'none';
|
|
@@ -570,6 +661,15 @@ var Reveal = (function(){
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
+ * Checks if this instance is being used to print a PDF.
|
|
|
|
+ */
|
|
|
|
+ function isPrintingPDF() {
|
|
|
|
+
|
|
|
|
+ return ( /print-pdf/gi ).test( window.location.search );
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* Causes the address bar to hide on mobile devices,
|
|
* Causes the address bar to hide on mobile devices,
|
|
* more vertical space ftw.
|
|
* more vertical space ftw.
|
|
@@ -770,7 +870,7 @@ var Reveal = (function(){
|
|
*/
|
|
*/
|
|
function layout() {
|
|
function layout() {
|
|
|
|
|
|
- if( dom.wrapper ) {
|
|
|
|
|
|
+ if( dom.wrapper && !isPrintingPDF() ) {
|
|
|
|
|
|
// Available space to scale within
|
|
// Available space to scale within
|
|
var availableWidth = dom.wrapper.offsetWidth,
|
|
var availableWidth = dom.wrapper.offsetWidth,
|
|
@@ -1262,7 +1362,8 @@ var Reveal = (function(){
|
|
}
|
|
}
|
|
|
|
|
|
// Dispatch an event if the slide changed
|
|
// Dispatch an event if the slide changed
|
|
- if( indexh !== indexhBefore || indexv !== indexvBefore ) {
|
|
|
|
|
|
+ var slideChanged = ( indexh !== indexhBefore || indexv !== indexvBefore );
|
|
|
|
+ if( slideChanged ) {
|
|
dispatchEvent( 'slidechanged', {
|
|
dispatchEvent( 'slidechanged', {
|
|
'indexh': indexh,
|
|
'indexh': indexh,
|
|
'indexv': indexv,
|
|
'indexv': indexv,
|
|
@@ -1299,11 +1400,14 @@ var Reveal = (function(){
|
|
}
|
|
}
|
|
|
|
|
|
// Handle embedded content
|
|
// Handle embedded content
|
|
- stopEmbeddedContent( previousSlide );
|
|
|
|
- startEmbeddedContent( currentSlide );
|
|
|
|
|
|
+ if( slideChanged ) {
|
|
|
|
+ stopEmbeddedContent( previousSlide );
|
|
|
|
+ startEmbeddedContent( currentSlide );
|
|
|
|
+ }
|
|
|
|
|
|
updateControls();
|
|
updateControls();
|
|
updateProgress();
|
|
updateProgress();
|
|
|
|
+ updateBackground();
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1327,8 +1431,12 @@ var Reveal = (function(){
|
|
// Start auto-sliding if it's enabled
|
|
// Start auto-sliding if it's enabled
|
|
cueAutoSlide();
|
|
cueAutoSlide();
|
|
|
|
|
|
|
|
+ // Re-create the slide backgrounds
|
|
|
|
+ createBackgrounds();
|
|
|
|
+
|
|
updateControls();
|
|
updateControls();
|
|
updateProgress();
|
|
updateProgress();
|
|
|
|
+ updateBackground();
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1385,6 +1493,9 @@ var Reveal = (function(){
|
|
element.classList.remove( 'present' );
|
|
element.classList.remove( 'present' );
|
|
element.classList.remove( 'future' );
|
|
element.classList.remove( 'future' );
|
|
|
|
|
|
|
|
+ // http://www.w3.org/html/wg/drafts/html/master/editing.html#the-hidden-attribute
|
|
|
|
+ element.setAttribute( 'hidden', '' );
|
|
|
|
+
|
|
if( i < index ) {
|
|
if( i < index ) {
|
|
// Any element previous to index is given the 'past' class
|
|
// Any element previous to index is given the 'past' class
|
|
element.classList.add( reverse ? 'future' : 'past' );
|
|
element.classList.add( reverse ? 'future' : 'past' );
|
|
@@ -1402,6 +1513,7 @@ var Reveal = (function(){
|
|
|
|
|
|
// Mark the current slide as present
|
|
// Mark the current slide as present
|
|
slides[index].classList.add( 'present' );
|
|
slides[index].classList.add( 'present' );
|
|
|
|
+ slides[index].removeAttribute( 'hidden' );
|
|
|
|
|
|
// If this slide has a state associated with it, add it
|
|
// If this slide has a state associated with it, add it
|
|
// onto the current state of the deck
|
|
// onto the current state of the deck
|
|
@@ -1533,6 +1645,37 @@ var Reveal = (function(){
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
+ * Updates the background elements to reflect the current
|
|
|
|
+ * slide.
|
|
|
|
+ */
|
|
|
|
+ function updateBackground() {
|
|
|
|
+
|
|
|
|
+ // Update the classes of all backgrounds to match the
|
|
|
|
+ // states of their slides (past/present/future)
|
|
|
|
+ toArray( dom.background.childNodes ).forEach( function( backgroundh, h ) {
|
|
|
|
+
|
|
|
|
+ // Reverse past/future classes when in RTL mode
|
|
|
|
+ var horizontalPast = config.rtl ? 'future' : 'past',
|
|
|
|
+ horizontalFuture = config.rtl ? 'past' : 'future';
|
|
|
|
+
|
|
|
|
+ backgroundh.className = 'slide-background ' + ( h < indexh ? horizontalPast : h > indexh ? horizontalFuture : 'present' );
|
|
|
|
+
|
|
|
|
+ toArray( backgroundh.childNodes ).forEach( function( backgroundv, v ) {
|
|
|
|
+
|
|
|
|
+ backgroundv.className = 'slide-background ' + ( v < indexv ? 'past' : v > indexv ? 'future' : 'present' );
|
|
|
|
+
|
|
|
|
+ } );
|
|
|
|
+
|
|
|
|
+ } );
|
|
|
|
+
|
|
|
|
+ // Allow the first background to apply without transition
|
|
|
|
+ setTimeout( function() {
|
|
|
|
+ dom.background.classList.remove( 'no-transition' );
|
|
|
|
+ }, 1 );
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* Determine what available routes there are for navigation.
|
|
* Determine what available routes there are for navigation.
|
|
*
|
|
*
|