aboutsummaryrefslogtreecommitdiff
path: root/js/reveal.js
diff options
context:
space:
mode:
authorHakim El Hattab <hakim.elhattab@gmail.com>2013-04-27 17:35:17 -0400
committerHakim El Hattab <hakim.elhattab@gmail.com>2013-04-27 17:35:17 -0400
commit6cfc6ecc49d40bb506c5b7ab7eca2b97324c9586 (patch)
tree67fa23696fcfeb8a3b3f12b79d4dce360765e5f2 /js/reveal.js
parent0ebda98735f0698e115a1ef1de495e67d8f65fd6 (diff)
downloadperl-software-in-gnu-guix-6cfc6ecc49d40bb506c5b7ab7eca2b97324c9586.tar
perl-software-in-gnu-guix-6cfc6ecc49d40bb506c5b7ab7eca2b97324c9586.tar.gz
available fragment routes reflected in control arrows (closes #411)
Diffstat (limited to 'js/reveal.js')
-rw-r--r--js/reveal.js52
1 files changed, 52 insertions, 0 deletions
diff --git a/js/reveal.js b/js/reveal.js
index eea243e..c58f3dc 100644
--- a/js/reveal.js
+++ b/js/reveal.js
@@ -1328,6 +1328,7 @@ var Reveal = (function(){
if ( config.controls && dom.controls ) {
var routes = availableRoutes();
+ var fragments = availableFragments();
// Remove the 'enabled' class from all directions
dom.controlsLeft.concat( dom.controlsRight )
@@ -1336,6 +1337,7 @@ var Reveal = (function(){
.concat( dom.controlsPrev )
.concat( dom.controlsNext ).forEach( function( node ) {
node.classList.remove( 'enabled' );
+ node.classList.remove( 'fragmented' );
} );
// Add the 'enabled' class to the available routes
@@ -1348,6 +1350,26 @@ var Reveal = (function(){
if( routes.left || routes.up ) dom.controlsPrev.forEach( function( el ) { el.classList.add( 'enabled' ); } );
if( routes.right || routes.down ) dom.controlsNext.forEach( function( el ) { el.classList.add( 'enabled' ); } );
+ // Highlight fragment directions
+ if( currentSlide ) {
+ var isVertical = !!currentSlide.parentNode.nodeName.match( /section/gi );
+
+ // Always apply fragment decorator to prev/next buttons
+ if( fragments.prev ) dom.controlsPrev.forEach( function( el ) { el.classList.add( 'fragmented', 'enabled' ); } );
+ if( fragments.next ) dom.controlsNext.forEach( function( el ) { el.classList.add( 'fragmented', 'enabled' ); } );
+
+ // Apply fragment decorators to directional buttons based on
+ // what slide axis they are in
+ if( isVertical ) {
+ if( fragments.prev ) dom.controlsUp.forEach( function( el ) { el.classList.add( 'fragmented', 'enabled' ); } );
+ if( fragments.next ) dom.controlsDown.forEach( function( el ) { el.classList.add( 'fragmented', 'enabled' ); } );
+ }
+ else {
+ if( fragments.prev ) dom.controlsLeft.forEach( function( el ) { el.classList.add( 'fragmented', 'enabled' ); } );
+ if( fragments.next ) dom.controlsRight.forEach( function( el ) { el.classList.add( 'fragmented', 'enabled' ); } );
+ }
+ }
+
}
}
@@ -1372,6 +1394,29 @@ var Reveal = (function(){
}
/**
+ * Returns an object describing the available fragment
+ * directions.
+ *
+ * @return {Object} two boolean properties: prev/next
+ */
+ function availableFragments() {
+
+ if( currentSlide ) {
+ var fragments = currentSlide.querySelectorAll( '.fragment' );
+ var hiddenFragments = currentSlide.querySelectorAll( '.fragment:not(.visible)' );
+
+ return {
+ prev: fragments.length - hiddenFragments.length > 0,
+ next: !!hiddenFragments.length
+ };
+ }
+ else {
+ return { prev: false, next: false };
+ }
+
+ }
+
+ /**
* Reads the current URL (hash) and navigates accordingly.
*/
function readURL() {
@@ -1506,6 +1551,8 @@ var Reveal = (function(){
// Notify subscribers of the change
dispatchEvent( 'fragmentshown', { fragment: fragments[0] } );
+
+ updateControls();
return true;
}
}
@@ -1530,6 +1577,8 @@ var Reveal = (function(){
// Notify subscribers of the change
dispatchEvent( 'fragmenthidden', { fragment: fragments[ fragments.length - 1 ] } );
+
+ updateControls();
return true;
}
}
@@ -1992,6 +2041,9 @@ var Reveal = (function(){
// Returns an object with the available routes as booleans (left/right/top/bottom)
availableRoutes: availableRoutes,
+ // Returns an object with the available fragments as booleans (prev/next)
+ availableFragments: availableFragments,
+
// Toggles the overview mode on/off
toggleOverview: toggleOverview,