// Transition style
transition: 'default', // default/cube/page/concave/zoom/linear/fade/none
+ // Transition speed
+ transitionSpeed: 'default', // default/fast/slow
+
// Script dependencies to load
dependencies: []
},
dom.slides = document.querySelector( '.reveal .slides' );
// Progress bar
- if( !dom.wrapper.querySelector( '.progress' ) && config.progress ) {
+ if( !dom.wrapper.querySelector( '.progress' ) ) {
var progressElement = document.createElement( 'div' );
progressElement.classList.add( 'progress' );
progressElement.innerHTML = '<span></span>';
}
// Arrow controls
- if( !dom.wrapper.querySelector( '.controls' ) && config.controls ) {
+ if( !dom.wrapper.querySelector( '.controls' ) ) {
var controlsElement = document.createElement( 'aside' );
controlsElement.classList.add( 'controls' );
controlsElement.innerHTML = '<div class="navigate-left"></div>' +
// Make sure we've got all the DOM elements we need
setupDOM();
- // Subscribe to input
- addEventListeners();
-
// Updates the presentation to match the current configuration values
configure();
dom.wrapper.classList.add( config.transition );
+ dom.wrapper.setAttribute( 'data-transition-speed', config.transitionSpeed );
+
if( dom.controls ) {
dom.controls.style.display = ( config.controls && dom.controls ) ? 'block' : 'none';
}
}
}
+ postConfigure();
+
+ }
+
+ /**
+ * Updates various parts of the presentatio after the
+ * configuration has changed.
+ */
+ function postConfigure() {
+
+ // Subscribe to input
+ removeEventListeners();
+ addEventListeners();
+
// Force a layout to make sure the current config is accounted for
layout();
window.removeEventListener( 'hashchange', onWindowHashChange, false );
window.removeEventListener( 'resize', onWindowResize, false );
- if( config.touch ) {
- dom.wrapper.removeEventListener( 'touchstart', onTouchStart, false );
- dom.wrapper.removeEventListener( 'touchmove', onTouchMove, false );
- dom.wrapper.removeEventListener( 'touchend', onTouchEnd, false );
+ dom.wrapper.removeEventListener( 'touchstart', onTouchStart, false );
+ dom.wrapper.removeEventListener( 'touchmove', onTouchMove, false );
+ dom.wrapper.removeEventListener( 'touchend', onTouchEnd, false );
- if( window.navigator.msPointerEnabled ) {
- dom.wrapper.removeEventListener( 'MSPointerDown', onPointerDown, false );
- dom.wrapper.removeEventListener( 'MSPointerMove', onPointerMove, false );
- dom.wrapper.removeEventListener( 'MSPointerUp', onPointerUp, false );
- }
+ if( window.navigator.msPointerEnabled ) {
+ dom.wrapper.removeEventListener( 'MSPointerDown', onPointerDown, false );
+ dom.wrapper.removeEventListener( 'MSPointerMove', onPointerMove, false );
+ dom.wrapper.removeEventListener( 'MSPointerUp', onPointerUp, false );
}
if ( config.progress && dom.progress ) {
* "data-fragment-index" attribute.
*
* Fragments will be revealed in the order that they are returned by
- * this function, so you can use the index attributes to control the
+ * this function, so you can use the index attributes to control the
* order of fragment appearance.
*
* To maintain a sensible default fragment order, fragments are presumed
return l.getAttribute( 'data-fragment-index' ) - r.getAttribute( 'data-fragment-index');
} );
- return a
+ return a;
}
function resume() {
var wasPaused = dom.wrapper.classList.contains( 'paused' );
+ dom.wrapper.classList.remove( 'paused' );
cueAutoSlide();
- dom.wrapper.classList.remove( 'paused' );
if( wasPaused ) {
dispatchEvent( 'resumed' );
* @param {int} v Vertical index of the target slide
* @param {int} f Optional index of a fragment within the
* target slide to activate
+ * @param {int} o Optional origin for use in multimaster environments
*/
- function slide( h, v, f ) {
+ function slide( h, v, f, o ) {
// Remember where we were at before
previousSlide = currentSlide;
'indexh': indexh,
'indexv': indexv,
'previousSlide': previousSlide,
- 'currentSlide': currentSlide
+ 'currentSlide': currentSlide,
+ 'origin': o
} );
}
else {
if( previousSlide ) {
indexv = ( previousSlide.querySelectorAll( 'section' ).length + 1 ) || undefined;
indexh --;
- slide();
+ slide( indexh, indexv );
}
}
}
// Disregard the event if there's a focused element or a
// keyboard modifier key is present
- if( hasFocus || event.shiftKey || event.altKey || event.ctrlKey || event.metaKey ) return;
+ if( hasFocus || (event.shiftKey && event.keyCode !== 32) || event.altKey || event.ctrlKey || event.metaKey ) return;
var triggered = true;
// end
case 35: slide( Number.MAX_VALUE ); break;
// space
- case 32: isOverview() ? deactivateOverview() : navigateNext(); break;
+ case 32: isOverview() ? deactivateOverview() : event.shiftKey ? navigatePrev() : navigateNext(); break;
// return
case 13: isOverview() ? deactivateOverview() : triggered = false; break;
// b, period, Logitech presenter tools "black screen" button
}
/**
- * Handler for the 'touchstart' event, enables support for
+ * Handler for the 'touchstart' event, enables support for
* swipe and pinch gestures.
*/
function onTouchStart( event ) {
// Forces an update in slide layout
layout: layout,
+ // Returns an object with the available routes as booleans (left/right/top/bottom)
+ availableRoutes: availableRoutes,
+
// Toggles the overview mode on/off
toggleOverview: toggleOverview,
return scale;
},
+ // Returns the current configuration object
+ getConfig: function() {
+ return config;
+ },
+
+ // Returns an index (1-based) of the current fragment
+ getCurrentFragmentIndex : function() {
+ if( currentSlide ) {
+ var visibleFragments = currentSlide.querySelectorAll( '.fragment.visible' );
+
+ if( visibleFragments.length ) {
+ return visibleFragments.length;
+ }
+ }
+ },
+
// Helper method, retrieves query string as a key/value hash
getQueryHash: function() {
var query = {};