| <!doctype html> | |
| <html lang="en"> | |
| <head> | |
| <meta charset="utf-8"> | |
| <title>reveal.js - Slide Notes</title> | |
| <style> | |
| body { | |
| font-family: Helvetica; | |
| } | |
| #notes { | |
| font-size: 24px; | |
| width: 640px; | |
| margin-top: 5px; | |
| } | |
| #wrap-current-slide { | |
| width: 640px; | |
| height: 512px; | |
| float: left; | |
| overflow: hidden; | |
| } | |
| #current-slide { | |
| width: 1280px; | |
| height: 1024px; | |
| border: none; | |
| -webkit-transform-origin: 0 0; | |
| -moz-transform-origin: 0 0; | |
| -ms-transform-origin: 0 0; | |
| -o-transform-origin: 0 0; | |
| transform-origin: 0 0; | |
| -webkit-transform: scale(0.5); | |
| -moz-transform: scale(0.5); | |
| -ms-transform: scale(0.5); | |
| -o-transform: scale(0.5); | |
| transform: scale(0.5); | |
| } | |
| #wrap-next-slide { | |
| width: 448px; | |
| height: 358px; | |
| float: left; | |
| margin: 0 0 0 10px; | |
| overflow: hidden; | |
| } | |
| #next-slide { | |
| width: 1280px; | |
| height: 1024px; | |
| border: none; | |
| -webkit-transform-origin: 0 0; | |
| -moz-transform-origin: 0 0; | |
| -ms-transform-origin: 0 0; | |
| -o-transform-origin: 0 0; | |
| transform-origin: 0 0; | |
| -webkit-transform: scale(0.35); | |
| -moz-transform: scale(0.35); | |
| -ms-transform: scale(0.35); | |
| -o-transform: scale(0.35); | |
| transform: scale(0.35); | |
| } | |
| .slides { | |
| position: relative; | |
| margin-bottom: 10px; | |
| border: 1px solid black; | |
| border-radius: 2px; | |
| background: rgb(28, 30, 32); | |
| } | |
| .slides span { | |
| position: absolute; | |
| top: 3px; | |
| left: 3px; | |
| font-weight: bold; | |
| font-size: 14px; | |
| color: rgba( 255, 255, 255, 0.9 ); | |
| } | |
| .error { | |
| font-weight: bold; | |
| color: red; | |
| font-size: 1.5em; | |
| text-align: center; | |
| margin-top: 10%; | |
| } | |
| .error code { | |
| font-family: monospace; | |
| } | |
| .time { | |
| width: 448px; | |
| margin: 30px 0 0 10px; | |
| float: left; | |
| text-align: center; | |
| opacity: 0; | |
| -webkit-transition: opacity 0.4s; | |
| -moz-transition: opacity 0.4s; | |
| -o-transition: opacity 0.4s; | |
| transition: opacity 0.4s; | |
| } | |
| .elapsed, | |
| .clock { | |
| color: #333; | |
| font-size: 2em; | |
| text-align: center; | |
| display: inline-block; | |
| padding: 0.5em; | |
| background-color: #eee; | |
| border-radius: 10px; | |
| } | |
| .elapsed h2, | |
| .clock h2 { | |
| font-size: 0.8em; | |
| line-height: 100%; | |
| margin: 0; | |
| color: #aaa; | |
| } | |
| .elapsed .mute { | |
| color: #ddd; | |
| } | |
| </style> | |
| </head> | |
| <body> | |
| <div id="wrap-current-slide" class="slides"> | |
| <script>document.write( '<iframe width="1280" height="1024" id="current-slide" src="'+ window.opener.location.href +'"></iframe>' );</script> | |
| </div> | |
| <div id="wrap-next-slide" class="slides"> | |
| <script>document.write( '<iframe width="640" height="512" id="next-slide" src="'+ window.opener.location.href +'"></iframe>' );</script> | |
| <span>UPCOMING:</span> | |
| </div> | |
| <div class="time"> | |
| <div class="clock"> | |
| <h2>Time</h2> | |
| <span id="clock">0:00:00 AM</span> | |
| </div> | |
| <div class="elapsed"> | |
| <h2>Elapsed</h2> | |
| <span id="hours">00</span><span id="minutes">:00</span><span id="seconds">:00</span> | |
| </div> | |
| </div> | |
| <div id="notes"></div> | |
| <script src="../../plugin/markdown/showdown.js"></script> | |
| <script> | |
| window.addEventListener( 'load', function() { | |
| if( window.opener && window.opener.location && window.opener.location.href ) { | |
| var notes = document.getElementById( 'notes' ), | |
| currentSlide = document.getElementById( 'current-slide' ), | |
| nextSlide = document.getElementById( 'next-slide' ); | |
| window.addEventListener( 'message', function( event ) { | |
| var data = JSON.parse( event.data ); | |
| // No need for updating the notes in case of fragment changes | |
| if ( data.notes !== undefined) { | |
| if( data.markdown ) { | |
| notes.innerHTML = (new Showdown.converter()).makeHtml( data.notes ); | |
| } | |
| else { | |
| notes.innerHTML = data.notes; | |
| } | |
| } | |
| // Showing and hiding fragments | |
| if( data.fragment === 'next' ) { | |
| currentSlide.contentWindow.Reveal.nextFragment(); | |
| } | |
| else if( data.fragment === 'prev' ) { | |
| currentSlide.contentWindow.Reveal.prevFragment(); | |
| } | |
| else { | |
| // Update the note slides | |
| currentSlide.contentWindow.Reveal.slide( data.indexh, data.indexv ); | |
| nextSlide.contentWindow.Reveal.slide( data.nextindexh, data.nextindexv ); | |
| } | |
| }, false ); | |
| var start = new Date(), | |
| timeEl = document.querySelector( '.time' ), | |
| clockEl = document.getElementById( 'clock' ), | |
| hoursEl = document.getElementById( 'hours' ), | |
| minutesEl = document.getElementById( 'minutes' ), | |
| secondsEl = document.getElementById( 'seconds' ); | |
| setInterval( function() { | |
| timeEl.style.opacity = 1; | |
| var diff, hours, minutes, seconds, | |
| now = new Date(); | |
| diff = now.getTime() - start.getTime(); | |
| hours = parseInt( diff / ( 1000 * 60 * 60 ) ); | |
| minutes = parseInt( ( diff / ( 1000 * 60 ) ) % 60 ); | |
| seconds = parseInt( ( diff / 1000 ) % 60 ); | |
| clockEl.innerHTML = now.toLocaleTimeString(); | |
| hoursEl.innerHTML = zeroPadInteger( hours ); | |
| hoursEl.className = hours > 0 ? "" : "mute"; | |
| minutesEl.innerHTML = ":" + zeroPadInteger( minutes ); | |
| minutesEl.className = minutes > 0 ? "" : "mute"; | |
| secondsEl.innerHTML = ":" + zeroPadInteger( seconds ); | |
| }, 1000 ); | |
| // Navigate the main window when the notes slide changes | |
| currentSlide.contentWindow.Reveal.addEventListener( 'slidechanged', function( event ) { | |
| window.opener.Reveal.slide( event.indexh, event.indexv ); | |
| } ); | |
| } | |
| else { | |
| document.body.innerHTML = '<p class="error">Unable to access <code>window.opener.location</code>.<br>Make sure the presentation is running on a web server.</p>'; | |
| } | |
| }, false ); | |
| function zeroPadInteger( num ) { | |
| var str = "00" + parseInt( num ); | |
| return str.substring( str.length - 2 ); | |
| } | |
| </script> | |
| </body> | |
| </html> |