├── .gitignore ├── assets └── fonts │ └── leaguegothic │ ├── LICENSE │ └── league_gothic-webfont.ttf ├── LICENSE ├── css ├── reset.css └── main.css ├── lib ├── zenburn.css └── highlight.js ├── README.md ├── index.html └── js └── reveal.js /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | .svn 3 | log/*.log 4 | tmp/** 5 | -------------------------------------------------------------------------------- /assets/fonts/leaguegothic/LICENSE: -------------------------------------------------------------------------------- 1 | SIL Open Font License (OFL) 2 | http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL 3 | -------------------------------------------------------------------------------- /assets/fonts/leaguegothic/league_gothic-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/archive/reveal.js/master/assets/fonts/leaguegothic/league_gothic-webfont.ttf -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (C) 2011 Hakim El Hattab, http://hakim.se 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. -------------------------------------------------------------------------------- /css/reset.css: -------------------------------------------------------------------------------- 1 | /* http://meyerweb.com/eric/tools/css/reset/ 2 | v2.0 | 20110126 3 | License: none (public domain) 4 | */ 5 | 6 | html, body, div, span, applet, object, iframe, 7 | h1, h2, h3, h4, h5, h6, p, blockquote, pre, 8 | a, abbr, acronym, address, big, cite, code, 9 | del, dfn, em, img, ins, kbd, q, s, samp, 10 | small, strike, strong, sub, sup, tt, var, 11 | b, u, i, center, 12 | dl, dt, dd, ol, ul, li, 13 | fieldset, form, label, legend, 14 | table, caption, tbody, tfoot, thead, tr, th, td, 15 | article, aside, canvas, details, embed, 16 | figure, figcaption, footer, header, hgroup, 17 | menu, nav, output, ruby, section, summary, 18 | time, mark, audio, video { 19 | margin: 0; 20 | padding: 0; 21 | border: 0; 22 | font-size: 100%; 23 | font: inherit; 24 | vertical-align: baseline; 25 | } 26 | /* HTML5 display-role reset for older browsers */ 27 | article, aside, details, figcaption, figure, 28 | footer, header, hgroup, menu, nav, section { 29 | display: block; 30 | } 31 | body { 32 | line-height: 1; 33 | } 34 | ol, ul { 35 | list-style: none; 36 | } 37 | blockquote, q { 38 | quotes: none; 39 | } 40 | blockquote:before, blockquote:after, 41 | q:before, q:after { 42 | content: ''; 43 | content: none; 44 | } 45 | table { 46 | border-collapse: collapse; 47 | border-spacing: 0; 48 | } 49 | 50 | 51 | /* HTML5BP: 52 | These selection declarations have to be separate. 53 | No text-shadow: twitter.com/miketaylr/status/12228805301 54 | Also: hot pink. */ 55 | ::-moz-selection{ background: #FF5E99; color:#fff; text-shadow: none; } 56 | ::selection { background:#FF5E99; color:#fff; text-shadow: none; } 57 | 58 | -------------------------------------------------------------------------------- /lib/zenburn.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Zenburn style from voldmar.ru (c) Vladimir Epifanov 4 | based on dark.css by Ivan Sagalaev 5 | 6 | */ 7 | 8 | pre code { 9 | display: block; padding: 0.5em; 10 | background: #3F3F3F; 11 | color: #DCDCDC; 12 | } 13 | 14 | pre .keyword, 15 | pre .tag, 16 | pre .django .tag, 17 | pre .django .keyword, 18 | pre .css .class, 19 | pre .css .id, 20 | pre .lisp .title { 21 | color: #E3CEAB; 22 | } 23 | 24 | pre .django .template_tag, 25 | pre .django .variable, 26 | pre .django .filter .argument { 27 | color: #DCDCDC; 28 | } 29 | 30 | pre .number, 31 | pre .date { 32 | color: #8CD0D3; 33 | } 34 | 35 | pre .dos .envvar, 36 | pre .dos .stream, 37 | pre .variable, 38 | pre .apache .sqbracket { 39 | color: #EFDCBC; 40 | } 41 | 42 | pre .dos .flow, 43 | pre .diff .change, 44 | pre .python .exception, 45 | pre .python .built_in, 46 | pre .literal, 47 | pre .tex .special { 48 | color: #EFEFAF; 49 | } 50 | 51 | pre .diff .chunk, 52 | pre .ruby .subst { 53 | color: #8F8F8F; 54 | } 55 | 56 | pre .dos .keyword, 57 | pre .python .decorator, 58 | pre .class .title, 59 | pre .haskell .label, 60 | pre .function .title, 61 | pre .ini .title, 62 | pre .diff .header, 63 | pre .ruby .class .parent, 64 | pre .apache .tag, 65 | pre .nginx .built_in, 66 | pre .tex .command, 67 | pre .input_number { 68 | color: #efef8f; 69 | } 70 | 71 | pre .dos .winutils, 72 | pre .ruby .symbol, 73 | pre .ruby .symbol .string, 74 | pre .ruby .symbol .keyword, 75 | pre .ruby .symbol .keymethods, 76 | pre .ruby .string, 77 | pre .ruby .instancevar { 78 | color: #DCA3A3; 79 | } 80 | 81 | pre .diff .deletion, 82 | pre .string, 83 | pre .tag .value, 84 | pre .preprocessor, 85 | pre .built_in, 86 | pre .sql .aggregate, 87 | pre .javadoc, 88 | pre .smalltalk .class, 89 | pre .smalltalk .localvars, 90 | pre .smalltalk .array, 91 | pre .css .rules .value, 92 | pre .attr_selector, 93 | pre .pseudo, 94 | pre .apache .cbracket, 95 | pre .tex .formula { 96 | color: #CC9393; 97 | } 98 | 99 | pre .shebang, 100 | pre .diff .addition, 101 | pre .comment, 102 | pre .java .annotation, 103 | pre .template_comment, 104 | pre .pi, 105 | pre .doctype { 106 | color: #7F9F7F; 107 | } 108 | 109 | pre .xml .css, 110 | pre .xml .javascript, 111 | pre .xml .vbscript, 112 | pre .tex .formula { 113 | opacity: 0.5; 114 | } 115 | 116 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # reveal.js 2 | 3 | A CSS 3D slideshow tool for quickly creating good looking HTML presentations. Doesn't _rely_ on any external libraries but [highlight.js](http://softwaremaniacs.org/soft/highlight/en/description/) is included by default for code highlighting. 4 | 5 | Note that this requires a browser with support for CSS 3D transforms and ``classList``. If CSS 3D support is not detected, the presentation will degrade to less exciting 2D transitions. You could also use a polyfill for ``classList`` to make this work in < iOS 5 and < Safari 5.1, [here's one](https://github.com/remy/polyfills/blob/master/classList.js) from [@remy](https://github.com/remy). 6 | 7 | Curious about how this looks in action? [Check out the demo page](http://lab.hakim.se/reveal-js/). 8 | 9 | # Examples 10 | 11 | * http://lab.hakim.se/reveal-js/ (original) 12 | * http://www.ideapolisagency.com/ by [@achrafkassioui](http://twitter.com/achrafkassioui) 13 | * http://lucienfrelin.com/ by [@lucienfrelin](http://twitter.com/lucienfrelin) 14 | * http://creatorrr.github.com/ThePoet/ 15 | * http://moduscreate.com/ by [@ModusCreate](https://twitter.com/ModusCreate) 16 | * [Webapp Development Stack & Tooling](http://dl.dropbox.com/u/39519/talks/jquk-tooling%2Bappstack/index.html) by [@paul_irish](https://twitter.com/paul_irish) 17 | * http://idea.diwank.name/ by [Diwank Singh](http://diwank.name/) 18 | * http://concurrencykit.org/presentations/lockfree_introduction/ by Samy Al Bahra 19 | * http://www.thecssninja.com/talks/not_your_average_dnd/ by [@ryanseddon](http://twitter.com/ryanseddon) 20 | * http://spinscale.github.com/elasticsearch/2012-03-jugm.html by [@spinscale](http://twitter.com/spinscale) 21 | 22 | [Send me a link](http://hakim.se/about/contact) if you used reveal.js for a project or presentation. 23 | 24 | # Usage 25 | 26 | Markup heirarchy needs to be ``
`` where the ``
`` represents one slide and can be repeated indefinitely. If you place multiple ``
``'s inside of another ``
`` they will be shown as vertical slides. 27 | 28 | At the end of your page, after ````, you need to initialize reveal. Note that all config values are optional. 29 | 30 | ``` 31 | Reveal.initialize({ 32 | // Display controls in the bottom right corner 33 | controls: true, 34 | 35 | // Display a presentation progress bar 36 | progress: true, 37 | 38 | // If true; each slide will be pushed to the browser history 39 | history: true, 40 | 41 | // Flags if mouse wheel navigation should be enabled 42 | mouseWheel: true, 43 | 44 | // Apply a 3D roll to links on hover 45 | rollingLinks: true, 46 | 47 | // UI style 48 | theme: 'default', // default/neon 49 | 50 | // Transition style 51 | transition: 'default' // default/cube/page/concave/linear(2d) 52 | }); 53 | ``` 54 | 55 | # History 56 | 57 | #### 1.2 (master) 58 | 59 | - Big changes to DOM structure: 60 | - Previous #main wrapper is now called #reveal 61 | - Slides were moved one level deeper, into #reveal .slides 62 | - Controls and progress bar were moved into #reveal 63 | - CSS is now much more explicit, rooted at #reveal, to prevent conflicts 64 | - Config option for disabling updates to URL, defaults to true 65 | - Anchors with image children no longer rotate in 3D on hover 66 | - Support for mouse wheel navigation ([naugtur](https://github.com/naugtur)) 67 | 68 | #### 1.1 69 | 70 | - Added an optional presentation progress bar 71 | - Images wrapped in anchors no longer unexpectedly flip in 3D 72 | - Slides that contain other slides are given the 'stack' class 73 | - Added 'transition' option for specifying transition styles 74 | - Added 'theme' option for specifying UI styles 75 | - New transitions: 'box' & 'page' 76 | - New theme: 'neon' 77 | 78 | #### 1.0 79 | 80 | - New and improved style 81 | - Added controls in bottom right which indicate where you can navigate 82 | - Reveal views in iteratively by giving them the .fragment class 83 | - Code sample syntax highlighting thanks to [highlight.js](http://softwaremaniacs.org/soft/highlight/en/description/) 84 | - Initialization options (toggling controls, toggling rolling links, transition theme) 85 | 86 | #### 0.3 87 | 88 | - Added licensing terms 89 | - Fixed broken links on touch devices 90 | 91 | #### 0.2 92 | 93 | - Refactored code and added inline documentation 94 | - Slides now have unique URL's 95 | - A basic API to invoke navigation was added 96 | 97 | #### 0.1 98 | 99 | - First release 100 | - Transitions and a white theme 101 | 102 | # License 103 | 104 | MIT licensed 105 | 106 | Copyright (C) 2011 Hakim El Hattab, http://hakim.se -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | reveal.js 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 |
26 |
27 |

Reveal.js

28 |

A CSS 3D Slideshow

29 | 34 |
35 | 36 |
37 |

Heads Up

38 |

39 | reveal.js is an easy to use, HTML based, presentation tool. You'll need a modern browser with 40 | support for CSS 3D transforms to see it in its full glory. 41 |

42 |

43 | - Hakim El Hattab / @hakimel 44 |

45 |
46 | 47 | 48 |
49 |
50 |

Vertical Slides

51 |

52 | Slides can be nested inside of other slides,
53 | try pressing down. 54 |

55 | 56 | 57 | 58 |
59 |
60 |

Basement Level 1

61 |

Press down or up to navigate.

62 |
63 |
64 |

Basement Level 2

65 |

Cornify

66 | 67 | 68 | 69 |
70 |
71 |

Basement Level 3

72 |

That's it, time to go back up.

73 | 74 | 75 | 76 |
77 |
78 | 79 |
80 |

Holistic Overview

81 |

82 | Press SPACE to enter the slide overview. 83 |

84 |
85 | 86 |
87 |

Transition Styles

88 |

89 | You can select from different transitions, like: 90 |

91 | 96 |
97 | 98 |
99 |

Marvelous Unordered List

100 |
    101 |
  • No order here
  • 102 |
  • Or here
  • 103 |
  • Or here
  • 104 |
  • Or here
  • 105 |
106 |
107 | 108 |
109 |

Fantastic Ordered List

110 |
    111 |
  1. One is smaller than...
  2. 112 |
  3. Two is smaller than...
  4. 113 |
  5. Three!
  6. 114 |
115 |
116 | 117 |
118 |

Clever Quotes

119 |

120 | These guys come in two forms, inline: 121 | The nice thing about standards is that there are so many to choose from and block: 122 |

123 |
124 | For years there has been a theory that millions of monkeys typing at random on millions of typewriters would 125 | reproduce the entire works of Shakespeare. The Internet has proven this theory to be untrue. 126 |
127 |
128 | 129 |
130 |

Pretty Code

131 |

132 | 	var supports3DTransforms =  document.body.style['webkitPerspective'] !== undefined || 
133 | 					document.body.style['MozPerspective'] !== undefined ||
134 | 					document.body.style['perspective'] !== undefined;
135 | 
136 | 	function linkify( selector ) {
137 | 	    if( supports3DTransforms ) {
138 | 	        
139 | 	        var nodes = document.querySelectorAll( selector );
140 | 
141 | 	        for( var i = 0, len = nodes.length; i < len; i++ ) {
142 | 	            var node = nodes[i];
143 | 
144 | 	            if( !node.className || !node.className.match( /roll/g ) ) {
145 | 	                node.className += ' roll';
146 | 	                node.innerHTML = '' + node.innerHTML + '';
147 | 	            }
148 | 	        };
149 | 	    }
150 | 	}
151 | 
152 | 	linkify( 'a' );
153 | 					
154 |

Courtesy of highlight.js.

155 |
156 | 157 |
158 |

Intergalactic Interconnections

159 |

160 | You can link between slides internally,
161 | like this. 162 |

163 |
164 | 165 |
166 |

Fragmented Views

167 |

Hit the next arrow...

168 |

... to step through ...

169 |
    170 |
  1. any type
  2. 171 |
  3. of view
  4. 172 |
  5. fragments
  6. 173 |
174 |
175 | 176 |
177 |

Spectacular image!

178 | 179 | 180 | 181 |
182 | 183 |
184 |

Stellar Links

185 | 190 |
191 | 192 |
193 |

THE END

194 |

BY Hakim El Hattab / hakim.se

195 |
196 |
197 | 198 | 199 | 205 | 206 | 207 |
208 | 209 |
210 | 211 | 212 | 213 | 245 | 246 | 247 | -------------------------------------------------------------------------------- /js/reveal.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (C) 2011 Hakim El Hattab, http://hakim.se 3 | * 4 | * Permission is hereby granted, free of charge, to any person obtaining a copy 5 | * of this software and associated documentation files (the "Software"), to deal 6 | * in the Software without restriction, including without limitation the rights 7 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | * copies of the Software, and to permit persons to whom the Software is 9 | * furnished to do so, subject to the following conditions: 10 | * 11 | * The above copyright notice and this permission notice shall be included in 12 | * all copies or substantial portions of the Software. 13 | * 14 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 20 | * THE SOFTWARE. 21 | * 22 | * ############################################################################# 23 | * 24 | * Reveal.js is an easy to use HTML based slideshow enhanced by 25 | * sexy CSS 3D transforms. 26 | * 27 | * Slides are given unique hash based URL's so that they can be 28 | * opened directly. 29 | * 30 | * Public facing methods: 31 | * - Reveal.initialize( { ... options ... } ); 32 | * - Reveal.navigateTo( indexh, indexv ); 33 | * - Reveal.navigateLeft(); 34 | * - Reveal.navigateRight(); 35 | * - Reveal.navigateUp(); 36 | * - Reveal.navigateDown(); 37 | * 38 | * @author Hakim El Hattab | http://hakim.se 39 | * @version 1.2 40 | */ 41 | var Reveal = (function(){ 42 | 43 | var HORIZONTAL_SLIDES_SELECTOR = '#reveal .slides>section', 44 | VERTICAL_SLIDES_SELECTOR = '#reveal .slides>section.present>section', 45 | 46 | // The horizontal and verical index of the currently active slide 47 | indexh = 0, 48 | indexv = 0, 49 | 50 | // Configurations options, can be overridden at initialization time 51 | config = { 52 | controls: false, 53 | progress: false, 54 | history: false, 55 | transition: 'default', 56 | theme: 'default', 57 | mouseWheel: true, 58 | rollingLinks: true 59 | }, 60 | 61 | // Cached references to DOM elements 62 | dom = {}, 63 | 64 | // Detect support for CSS 3D transforms 65 | supports3DTransforms = document.body.style['perspectiveProperty'] !== undefined || 66 | document.body.style['WebkitPerspective'] !== undefined || 67 | document.body.style['MozPerspective'] !== undefined || 68 | document.body.style['msPerspective'] !== undefined, 69 | 70 | supports2DTransforms = document.body.style['transformProperty'] !== undefined || 71 | document.body.style['WebkitTransform'] !== undefined || 72 | document.body.style['MozTransform'] !== undefined || 73 | document.body.style['msTransform'] !== undefined || 74 | document.body.style['OTransform'] !== undefined, 75 | 76 | // Throttles mouse wheel navigation 77 | mouseWheelTimeout = 0; 78 | 79 | /** 80 | * Starts up the slideshow by applying configuration 81 | * options and binding various events. 82 | */ 83 | function initialize( options ) { 84 | 85 | if( !supports2DTransforms && !supports3DTransforms ) { 86 | document.body.setAttribute( 'class', 'no-transforms' ); 87 | 88 | // If the browser doesn't support transforms we won't be 89 | // using JavaScript to control the presentation 90 | return; 91 | } 92 | 93 | // Cache references to DOM elements 94 | dom.wrapper = document.querySelector( '#reveal' ); 95 | dom.progress = document.querySelector( '#reveal .progress' ); 96 | dom.progressbar = document.querySelector( '#reveal .progress span' ); 97 | dom.controls = document.querySelector( '#reveal .controls' ); 98 | dom.controlsLeft = document.querySelector( '#reveal .controls .left' ); 99 | dom.controlsRight = document.querySelector( '#reveal .controls .right' ); 100 | dom.controlsUp = document.querySelector( '#reveal .controls .up' ); 101 | dom.controlsDown = document.querySelector( '#reveal .controls .down' ); 102 | 103 | // Bind all view events 104 | document.addEventListener('keydown', onDocumentKeyDown, false); 105 | document.addEventListener('touchstart', onDocumentTouchStart, false); 106 | window.addEventListener('hashchange', onWindowHashChange, false); 107 | dom.controlsLeft.addEventListener('click', preventAndForward( navigateLeft ), false); 108 | dom.controlsRight.addEventListener('click', preventAndForward( navigateRight ), false); 109 | dom.controlsUp.addEventListener('click', preventAndForward( navigateUp ), false); 110 | dom.controlsDown.addEventListener('click', preventAndForward( navigateDown ), false); 111 | 112 | // Copy options over to our config object 113 | extend( config, options ); 114 | 115 | // Fall back on the 2D transform theme 'linear' 116 | if( supports3DTransforms === false ) { 117 | config.transition = 'linear'; 118 | } 119 | 120 | if( config.controls ) { 121 | dom.controls.style.display = 'block'; 122 | } 123 | 124 | if( config.progress ) { 125 | dom.progress.style.display = 'block'; 126 | } 127 | 128 | if( config.transition !== 'default' ) { 129 | dom.wrapper.classList.add( config.transition ); 130 | } 131 | 132 | if( config.theme !== 'default' ) { 133 | dom.wrapper.classList.add( config.theme ); 134 | } 135 | 136 | if( config.mouseWheel ) { 137 | document.addEventListener('DOMMouseScroll', onDocumentMouseScroll, false); // FF 138 | document.addEventListener('mousewheel', onDocumentMouseScroll, false); 139 | } 140 | 141 | if( config.rollingLinks ) { 142 | // Add some 3D magic to our anchors 143 | linkify(); 144 | } 145 | 146 | // Read the initial hash 147 | readURL(); 148 | } 149 | 150 | /** 151 | * Extend object a with the properties of object b. 152 | * If there's a conflict, object b takes precedence. 153 | */ 154 | function extend( a, b ) { 155 | for( var i in b ) { 156 | a[ i ] = b[ i ]; 157 | } 158 | } 159 | 160 | /** 161 | * Prevents an events defaults behavior calls the 162 | * specified delegate. 163 | * 164 | * @param {Function} delegate The method to call 165 | * after the wrapper has been executed 166 | */ 167 | function preventAndForward( delegate ) { 168 | return function( event ) { 169 | event.preventDefault(); 170 | delegate.call(); 171 | } 172 | } 173 | 174 | /** 175 | * Handler for the document level 'keydown' event. 176 | * 177 | * @param {Object} event 178 | */ 179 | function onDocumentKeyDown( event ) { 180 | // FFT: Use document.querySelector( ':focus' ) === null 181 | // instead of checking contentEditable? 182 | 183 | if( event.target.contentEditable === 'inherit' ) { 184 | if( event.keyCode >= 33 && event.keyCode <= 40 ) { 185 | 186 | switch( event.keyCode ) { 187 | case 33: navigateLeft(); break; // left for wireless presenter 188 | case 34: navigateRight(); break; // right for wireless presenter 189 | case 37: navigateLeft(); break; // left 190 | case 39: navigateRight(); break; // right 191 | case 38: navigateUp(); break; // up 192 | case 40: navigateDown(); break; // down 193 | } 194 | 195 | slide(); 196 | 197 | event.preventDefault(); 198 | 199 | } 200 | // Space bar 201 | else if ( event.keyCode === 32 && supports3DTransforms ) { 202 | if( overviewIsActive() ) { 203 | deactivateOverview(); 204 | } 205 | else { 206 | activateOverview(); 207 | } 208 | 209 | event.preventDefault(); 210 | } 211 | } 212 | } 213 | 214 | /** 215 | * Handler for the document level 'touchstart' event. 216 | * 217 | * This enables very basic tap interaction for touch 218 | * devices. Added mainly for performance testing of 3D 219 | * transforms on iOS but was so happily surprised with 220 | * how smoothly it runs so I left it in here. Apple +1 221 | * 222 | * @param {Object} event 223 | */ 224 | function onDocumentTouchStart( event ) { 225 | // We're only interested in one point taps 226 | if (event.touches.length === 1) { 227 | // Never prevent taps on anchors and images 228 | if( event.target.tagName.toLowerCase() === 'a' || event.target.tagName.toLowerCase() === 'img' ) { 229 | return; 230 | } 231 | 232 | event.preventDefault(); 233 | 234 | var point = { 235 | x: event.touches[0].clientX, 236 | y: event.touches[0].clientY 237 | }; 238 | 239 | // Define the extent of the areas that may be tapped 240 | // to navigate 241 | var wt = window.innerWidth * 0.3; 242 | var ht = window.innerHeight * 0.3; 243 | 244 | if( point.x < wt ) { 245 | navigateLeft(); 246 | } 247 | else if( point.x > window.innerWidth - wt ) { 248 | navigateRight(); 249 | } 250 | else if( point.y < ht ) { 251 | navigateUp(); 252 | } 253 | else if( point.y > window.innerHeight - ht ) { 254 | navigateDown(); 255 | } 256 | 257 | slide(); 258 | } 259 | } 260 | 261 | /** 262 | * Handles mouse wheel scrolling, throttled to avoid 263 | * skipping multiple slides. 264 | */ 265 | function onDocumentMouseScroll( event ){ 266 | clearTimeout( mouseWheelTimeout ); 267 | 268 | mouseWheelTimeout = setTimeout( function() { 269 | var delta = event.detail || -event.wheelDelta; 270 | if( delta > 0 ) { 271 | availableRoutes().down ? navigateDown() : navigateRight(); 272 | } 273 | else { 274 | availableRoutes().up ? navigateUp() : navigateLeft(); 275 | } 276 | }, 100 ); 277 | } 278 | 279 | /** 280 | * Handler for the window level 'hashchange' event. 281 | * 282 | * @param {Object} event 283 | */ 284 | function onWindowHashChange( event ) { 285 | readURL(); 286 | } 287 | 288 | /** 289 | * Wrap all links in 3D goodness. 290 | */ 291 | function linkify() { 292 | if( supports3DTransforms ) { 293 | var nodes = document.querySelectorAll( '#reveal .slides section a:not(.image)' ); 294 | 295 | for( var i = 0, len = nodes.length; i < len; i++ ) { 296 | var node = nodes[i]; 297 | 298 | if( node.textContent && !node.querySelector( 'img' ) && ( !node.className || !node.classList.contains( node, 'roll' ) ) ) { 299 | node.classList.add( 'roll' ); 300 | node.innerHTML = '' + node.innerHTML + ''; 301 | } 302 | }; 303 | } 304 | } 305 | 306 | /** 307 | * Displays the overview of slides (quick nav) by 308 | * scaling down and arranging all slide elements. 309 | * 310 | * Experimental feature, might be dropped if perf 311 | * can't be improved. 312 | */ 313 | function activateOverview() { 314 | dom.wrapper.classList.add( 'overview' ); 315 | 316 | var horizontalSlides = Array.prototype.slice.call( document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) ); 317 | 318 | for( var i = 0, len1 = horizontalSlides.length; i < len1; i++ ) { 319 | var hslide = horizontalSlides[i], 320 | htransform = 'translateZ(-2500px) translate(' + ( ( i - indexh ) * 105 ) + '%, 0%)'; 321 | 322 | hslide.setAttribute( 'data-index-h', i ); 323 | hslide.style.display = 'block'; 324 | hslide.style.WebkitTransform = htransform; 325 | hslide.style.MozTransform = htransform; 326 | hslide.style.msTransform = htransform; 327 | hslide.style.OTransform = htransform; 328 | hslide.style.transform = htransform; 329 | 330 | if( !hslide.classList.contains( 'stack' ) ) { 331 | // Navigate to this slide on click 332 | hslide.addEventListener( 'click', onOverviewSlideClicked, true ); 333 | } 334 | 335 | var verticalSlides = Array.prototype.slice.call( hslide.querySelectorAll( 'section' ) ); 336 | 337 | for( var j = 0, len2 = verticalSlides.length; j < len2; j++ ) { 338 | var vslide = verticalSlides[j], 339 | vtransform = 'translate(0%, ' + ( ( j - indexv ) * 105 ) + '%)'; 340 | 341 | vslide.setAttribute( 'data-index-h', i ); 342 | vslide.setAttribute( 'data-index-v', j ); 343 | vslide.style.display = 'block'; 344 | vslide.style.WebkitTransform = vtransform; 345 | vslide.style.MozTransform = vtransform; 346 | vslide.style.msTransform = vtransform; 347 | vslide.style.OTransform = vtransform; 348 | vslide.style.transform = vtransform; 349 | 350 | // Navigate to this slide on click 351 | vslide.addEventListener( 'click', onOverviewSlideClicked, true ); 352 | } 353 | } 354 | } 355 | 356 | /** 357 | * Exits the slide overview and enters the currently 358 | * active slide. 359 | */ 360 | function deactivateOverview() { 361 | dom.wrapper.classList.remove( 'overview' ); 362 | 363 | var slides = Array.prototype.slice.call( document.querySelectorAll( '#reveal .slides section' ) ); 364 | 365 | for( var i = 0, len = slides.length; i < len; i++ ) { 366 | var element = slides[i]; 367 | 368 | // Resets all transforms to use the external styles 369 | element.style.WebkitTransform = ''; 370 | element.style.MozTransform = ''; 371 | element.style.msTransform = ''; 372 | element.style.OTransform = ''; 373 | element.style.transform = ''; 374 | 375 | element.removeEventListener( 'click', onOverviewSlideClicked ); 376 | } 377 | 378 | slide(); 379 | } 380 | 381 | /** 382 | * Checks if the overview is currently active. 383 | * 384 | * @return {Boolean} true if the overview is active, 385 | * false otherwise 386 | */ 387 | function overviewIsActive() { 388 | return dom.wrapper.classList.contains( 'overview' ); 389 | } 390 | 391 | /** 392 | * Invoked when a slide is and we're in the overview. 393 | */ 394 | function onOverviewSlideClicked( event ) { 395 | // TODO There's a bug here where the event listeners are not 396 | // removed after deactivating the overview. 397 | if( overviewIsActive() ) { 398 | event.preventDefault(); 399 | 400 | deactivateOverview(); 401 | 402 | indexh = this.getAttribute( 'data-index-h' ); 403 | indexv = this.getAttribute( 'data-index-v' ); 404 | 405 | slide(); 406 | } 407 | } 408 | 409 | /** 410 | * Updates one dimension of slides by showing the slide 411 | * with the specified index. 412 | * 413 | * @param {String} selector A CSS selector that will fetch 414 | * the group of slides we are working with 415 | * @param {Number} index The index of the slide that should be 416 | * shown 417 | * 418 | * @return {Number} The index of the slide that is now shown, 419 | * might differ from the passed in index if it was out of 420 | * bounds. 421 | */ 422 | function updateSlides( selector, index ) { 423 | 424 | // Select all slides and convert the NodeList result to 425 | // an array 426 | var slides = Array.prototype.slice.call( document.querySelectorAll( selector ) ); 427 | 428 | if( slides.length ) { 429 | // Enforce max and minimum index bounds 430 | index = Math.max(Math.min(index, slides.length - 1), 0); 431 | 432 | slides[index].className = 'present'; 433 | 434 | for( var i = 0; i < slides.length; i++ ) { 435 | var slide = slides[i]; 436 | 437 | // Optimization; hide all slides that are three or more steps 438 | // away from the present slide 439 | if( overviewIsActive() === false ) { 440 | slide.style.display = Math.abs( index - i ) > 3 ? 'none' : 'block'; 441 | } 442 | 443 | if( i < index ) { 444 | // Any element previous to index is given the 'past' class 445 | slide.className = 'past'; 446 | } 447 | else if( i > index ) { 448 | // Any element subsequent to index is given the 'future' class 449 | slide.className = 'future'; 450 | } 451 | 452 | // If this element contains vertical slides 453 | if( slide.querySelector( 'section' ) ) { 454 | slide.classList.add( 'stack' ); 455 | } 456 | } 457 | } 458 | else { 459 | // Since there are no slides we can't be anywhere beyond the 460 | // zeroth index 461 | index = 0; 462 | } 463 | 464 | return index; 465 | 466 | } 467 | 468 | /** 469 | * Updates the visual slides to represent the currently 470 | * set indices. 471 | */ 472 | function slide() { 473 | indexh = updateSlides( HORIZONTAL_SLIDES_SELECTOR, indexh ); 474 | indexv = updateSlides( VERTICAL_SLIDES_SELECTOR, indexv ); 475 | 476 | // Update progress if enabled 477 | if( config.progress ) { 478 | dom.progressbar.style.width = ( indexh / ( document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ).length - 1 ) ) * window.innerWidth + 'px'; 479 | } 480 | 481 | // Close the overview if it's active 482 | if( overviewIsActive() ) { 483 | activateOverview(); 484 | } 485 | 486 | updateControls(); 487 | 488 | writeURL(); 489 | } 490 | 491 | /** 492 | * Updates the state and link pointers of the controls. 493 | */ 494 | function updateControls() { 495 | var routes = availableRoutes(); 496 | 497 | // Remove the 'enabled' class from all directions 498 | [ dom.controlsLeft, dom.controlsRight, dom.controlsUp, dom.controlsDown ].forEach( function( node ) { 499 | node.classList.remove( 'enabled' ); 500 | } ) 501 | 502 | if( routes.left ) dom.controlsLeft.classList.add( 'enabled' ); 503 | if( routes.right ) dom.controlsRight.classList.add( 'enabled' ); 504 | if( routes.up ) dom.controlsUp.classList.add( 'enabled' ); 505 | if( routes.down ) dom.controlsDown.classList.add( 'enabled' ); 506 | } 507 | 508 | /** 509 | * Determine what available routes there are for navigation. 510 | * 511 | * @return {Object} containing four booleans: left/right/up/down 512 | */ 513 | function availableRoutes() { 514 | var horizontalSlides = document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ); 515 | var verticalSlides = document.querySelectorAll( VERTICAL_SLIDES_SELECTOR ); 516 | 517 | return { 518 | left: indexh > 0, 519 | right: indexh < horizontalSlides.length - 1, 520 | up: indexv > 0, 521 | down: indexv < verticalSlides.length - 1 522 | }; 523 | } 524 | 525 | /** 526 | * Reads the current URL (hash) and navigates accordingly. 527 | */ 528 | function readURL() { 529 | // Break the hash down to separate components 530 | var bits = window.location.hash.slice(2).split('/'); 531 | 532 | // Read the index components of the hash 533 | indexh = parseInt( bits[0] ) || 0 ; 534 | indexv = parseInt( bits[1] ) || 0 ; 535 | 536 | navigateTo( indexh, indexv ); 537 | } 538 | 539 | /** 540 | * Updates the page URL (hash) to reflect the current 541 | * state. 542 | */ 543 | function writeURL() { 544 | if( config.history ) { 545 | var url = '/'; 546 | 547 | // Only include the minimum possible number of components in 548 | // the URL 549 | if( indexh > 0 || indexv > 0 ) url += indexh; 550 | if( indexv > 0 ) url += '/' + indexv; 551 | 552 | window.location.hash = url; 553 | } 554 | } 555 | 556 | /** 557 | * Navigate to the next slide fragment. 558 | * 559 | * @return {Boolean} true if there was a next fragment, 560 | * false otherwise 561 | */ 562 | function nextFragment() { 563 | // Vertical slides: 564 | if( document.querySelector( VERTICAL_SLIDES_SELECTOR + '.present' ) ) { 565 | var verticalFragments = document.querySelectorAll( VERTICAL_SLIDES_SELECTOR + '.present .fragment:not(.visible)' ); 566 | if( verticalFragments.length ) { 567 | verticalFragments[0].classList.add( 'visible' ); 568 | return true; 569 | } 570 | } 571 | // Horizontal slides: 572 | else { 573 | var horizontalFragments = document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR + '.present .fragment:not(.visible)' ); 574 | if( horizontalFragments.length ) { 575 | horizontalFragments[0].classList.add( 'visible' ); 576 | return true; 577 | } 578 | } 579 | 580 | return false; 581 | } 582 | 583 | /** 584 | * Navigate to the previous slide fragment. 585 | * 586 | * @return {Boolean} true if there was a previous fragment, 587 | * false otherwise 588 | */ 589 | function previousFragment() { 590 | // Vertical slides: 591 | if( document.querySelector( VERTICAL_SLIDES_SELECTOR + '.present' ) ) { 592 | var verticalFragments = document.querySelectorAll( VERTICAL_SLIDES_SELECTOR + '.present .fragment.visible' ); 593 | if( verticalFragments.length ) { 594 | verticalFragments[ verticalFragments.length - 1 ].classList.remove( 'visible' ); 595 | return true; 596 | } 597 | } 598 | // Horizontal slides: 599 | else { 600 | var horizontalFragments = document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR + '.present .fragment.visible' ); 601 | if( horizontalFragments.length ) { 602 | horizontalFragments[ horizontalFragments.length - 1 ].classList.remove( 'visible' ); 603 | return true; 604 | } 605 | } 606 | 607 | return false; 608 | } 609 | 610 | /** 611 | * Triggers a navigation to the specified indices. 612 | * 613 | * @param {Number} h The horizontal index of the slide to show 614 | * @param {Number} v The vertical index of the slide to show 615 | */ 616 | function navigateTo( h, v ) { 617 | indexh = h === undefined ? indexh : h; 618 | indexv = v === undefined ? indexv : v; 619 | 620 | slide(); 621 | } 622 | 623 | function navigateLeft() { 624 | // Prioritize hiding fragments 625 | if( overviewIsActive() || previousFragment() === false ) { 626 | indexh --; 627 | indexv = 0; 628 | slide(); 629 | } 630 | } 631 | function navigateRight() { 632 | // Prioritize revealing fragments 633 | if( overviewIsActive() || nextFragment() === false ) { 634 | indexh ++; 635 | indexv = 0; 636 | slide(); 637 | } 638 | } 639 | function navigateUp() { 640 | // Prioritize hiding fragments 641 | if( overviewIsActive() || previousFragment() === false ) { 642 | indexv --; 643 | slide(); 644 | } 645 | } 646 | function navigateDown() { 647 | // Prioritize revealing fragments 648 | if( overviewIsActive() || nextFragment() === false ) { 649 | indexv ++; 650 | slide(); 651 | } 652 | } 653 | 654 | // Expose some methods publicly 655 | return { 656 | initialize: initialize, 657 | navigateTo: navigateTo, 658 | navigateLeft: navigateLeft, 659 | navigateRight: navigateRight, 660 | navigateUp: navigateUp, 661 | navigateDown: navigateDown 662 | }; 663 | 664 | })(); 665 | 666 | -------------------------------------------------------------------------------- /lib/highlight.js: -------------------------------------------------------------------------------- 1 | /* 2 | Syntax highlighting with language autodetection. 3 | http://softwaremaniacs.org/soft/highlight/ 4 | */ 5 | var hljs=new function(){function m(p){return p.replace(/&/gm,"&").replace(/"}while(y.length||z.length){var v=u().splice(0,1)[0];w+=m(x.substr(r,v.offset-r));r=v.offset;if(v.event=="start"){w+=s(v.node);t.push(v.node)}else{if(v.event=="stop"){var q=t.length;do{q--;var p=t[q];w+=("")}while(p!=v.node);t.splice(q,1);while(q'+m(L[0])+""}else{N+=m(L[0])}P=O.lR.lastIndex;L=O.lR.exec(M)}N+=m(M.substr(P,M.length-P));return N}function K(r,M){if(M.sL&&d[M.sL]){var L=e(M.sL,r);t+=L.keyword_count;return L.value}else{return F(r,M)}}function I(M,r){var L=M.cN?'':"";if(M.rB){q+=L;M.buffer=""}else{if(M.eB){q+=m(r)+L;M.buffer=""}else{q+=L;M.buffer=r}}C.push(M);B+=M.r}function E(O,L,Q){var R=C[C.length-1];if(Q){q+=K(R.buffer+O,R);return false}var M=z(L,R);if(M){q+=K(R.buffer+O,R);I(M,L);return M.rB}var r=w(C.length-1,L);if(r){var N=R.cN?"":"";if(R.rE){q+=K(R.buffer+O,R)+N}else{if(R.eE){q+=K(R.buffer+O,R)+N+m(L)}else{q+=K(R.buffer+O+L,R)+N}}while(r>1){N=C[C.length-2].cN?"":"";q+=N;r--;C.length--}var P=C[C.length-1];C.length--;C[C.length-1].buffer="";if(P.starts){I(P.starts,"")}return R.rE}if(x(L,R)){throw"Illegal"}}var H=d[J];var C=[H.dM];var B=0;var t=0;var q="";try{var v=0;H.dM.buffer="";do{var y=s(D,v);var u=E(y[0],y[1],y[2]);v+=y[0].length;if(!u){v+=y[1].length}}while(!y[2]);if(C.length>1){throw"Illegal"}return{r:B,keyword_count:t,value:q}}catch(G){if(G=="Illegal"){return{r:0,keyword_count:0,value:m(D)}}else{throw G}}}function f(t){var r={keyword_count:0,r:0,value:m(t)};var q=r;for(var p in d){if(!d.hasOwnProperty(p)){continue}var s=e(p,t);s.language=p;if(s.keyword_count+s.r>q.keyword_count+q.r){q=s}if(s.keyword_count+s.r>r.keyword_count+r.r){q=r;r=s}}if(q.language){r.second_best=q}return r}function h(r,q,p){if(q){r=r.replace(/^((<[^>]+>|\t)+)/gm,function(t,w,v,u){return w.replace(/\t/g,q)})}if(p){r=r.replace(/\n/g,"
")}return r}function o(u,x,q){var y=g(u,q);var s=a(u);if(s=="no-highlight"){return}if(s){var w=e(s,y)}else{var w=f(y);s=w.language}var p=b(u);if(p.length){var r=document.createElement("pre");r.innerHTML=w.value;w.value=l(p,b(r),y)}w.value=h(w.value,x,q);var t=u.className;if(!t.match("(\\s|^)(language-)?"+s+"(\\s|$)")){t=t?(t+" "+s):s}if(/MSIE [678]/.test(navigator.userAgent)&&u.tagName=="CODE"&&u.parentNode.tagName=="PRE"){var r=u.parentNode;var v=document.createElement("div");v.innerHTML="
"+w.value+"
";u=v.firstChild.firstChild;v.firstChild.cN=r.cN;r.parentNode.replaceChild(v.firstChild,r)}else{u.innerHTML=w.value}u.className=t;u.result={language:s,kw:w.keyword_count,re:w.r};if(w.second_best){u.second_best={language:w.second_best.language,kw:w.second_best.keyword_count,re:w.second_best.r}}}function k(){if(k.called){return}k.called=true;var r=document.getElementsByTagName("pre");for(var p=0;p|>=|>>|>>=|>>>|>>>=|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~";this.BE={b:"\\\\.",r:0};this.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[this.BE],r:0};this.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[this.BE],r:0};this.CLCM={cN:"comment",b:"//",e:"$"};this.CBLCLM={cN:"comment",b:"/\\*",e:"\\*/"};this.HCM={cN:"comment",b:"#",e:"$"};this.NM={cN:"number",b:this.NR,r:0};this.CNM={cN:"number",b:this.CNR,r:0};this.inherit=function(p,s){var r={};for(var q in p){r[q]=p[q]}if(s){for(var q in s){r[q]=s[q]}}return r}}();hljs.LANGUAGES.cs={dM:{k:{"abstract":1,as:1,base:1,bool:1,"break":1,"byte":1,"case":1,"catch":1,"char":1,checked:1,"class":1,"const":1,"continue":1,decimal:1,"default":1,delegate:1,"do":1,"do":1,"double":1,"else":1,"enum":1,event:1,explicit:1,extern:1,"false":1,"finally":1,fixed:1,"float":1,"for":1,foreach:1,"goto":1,"if":1,implicit:1,"in":1,"int":1,"interface":1,internal:1,is:1,lock:1,"long":1,namespace:1,"new":1,"null":1,object:1,operator:1,out:1,override:1,params:1,"private":1,"protected":1,"public":1,readonly:1,ref:1,"return":1,sbyte:1,sealed:1,"short":1,sizeof:1,stackalloc:1,"static":1,string:1,struct:1,"switch":1,"this":1,"throw":1,"true":1,"try":1,"typeof":1,uint:1,ulong:1,unchecked:1,unsafe:1,ushort:1,using:1,virtual:1,"volatile":1,"void":1,"while":1,ascending:1,descending:1,from:1,get:1,group:1,into:1,join:1,let:1,orderby:1,partial:1,select:1,set:1,value:1,"var":1,where:1,yield:1},c:[{cN:"comment",b:"///",e:"$",rB:true,c:[{cN:"xmlDocTag",b:"///|"},{cN:"xmlDocTag",b:""}]},hljs.CLCM,hljs.CBLCLM,{cN:"string",b:'@"',e:'"',c:[{b:'""'}]},hljs.ASM,hljs.QSM,hljs.CNM]}};hljs.LANGUAGES.ruby=function(){var g="[a-zA-Z_][a-zA-Z0-9_]*(\\!|\\?)?";var a="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?";var n={keyword:{and:1,"false":1,then:1,defined:1,module:1,"in":1,"return":1,redo:1,"if":1,BEGIN:1,retry:1,end:1,"for":1,"true":1,self:1,when:1,next:1,until:1,"do":1,begin:1,unless:1,END:1,rescue:1,nil:1,"else":1,"break":1,undef:1,not:1,"super":1,"class":1,"case":1,require:1,yield:1,alias:1,"while":1,ensure:1,elsif:1,or:1,def:1},keymethods:{__id__:1,__send__:1,abort:1,abs:1,"all?":1,allocate:1,ancestors:1,"any?":1,arity:1,assoc:1,at:1,at_exit:1,autoload:1,"autoload?":1,"between?":1,binding:1,binmode:1,"block_given?":1,call:1,callcc:1,caller:1,capitalize:1,"capitalize!":1,casecmp:1,"catch":1,ceil:1,center:1,chomp:1,"chomp!":1,chop:1,"chop!":1,chr:1,"class":1,class_eval:1,"class_variable_defined?":1,class_variables:1,clear:1,clone:1,close:1,close_read:1,close_write:1,"closed?":1,coerce:1,collect:1,"collect!":1,compact:1,"compact!":1,concat:1,"const_defined?":1,const_get:1,const_missing:1,const_set:1,constants:1,count:1,crypt:1,"default":1,default_proc:1,"delete":1,"delete!":1,delete_at:1,delete_if:1,detect:1,display:1,div:1,divmod:1,downcase:1,"downcase!":1,downto:1,dump:1,dup:1,each:1,each_byte:1,each_index:1,each_key:1,each_line:1,each_pair:1,each_value:1,each_with_index:1,"empty?":1,entries:1,eof:1,"eof?":1,"eql?":1,"equal?":1,"eval":1,exec:1,exit:1,"exit!":1,extend:1,fail:1,fcntl:1,fetch:1,fileno:1,fill:1,find:1,find_all:1,first:1,flatten:1,"flatten!":1,floor:1,flush:1,for_fd:1,foreach:1,fork:1,format:1,freeze:1,"frozen?":1,fsync:1,getc:1,gets:1,global_variables:1,grep:1,gsub:1,"gsub!":1,"has_key?":1,"has_value?":1,hash:1,hex:1,id:1,include:1,"include?":1,included_modules:1,index:1,indexes:1,indices:1,induced_from:1,inject:1,insert:1,inspect:1,instance_eval:1,instance_method:1,instance_methods:1,"instance_of?":1,"instance_variable_defined?":1,instance_variable_get:1,instance_variable_set:1,instance_variables:1,"integer?":1,intern:1,invert:1,ioctl:1,"is_a?":1,isatty:1,"iterator?":1,join:1,"key?":1,keys:1,"kind_of?":1,lambda:1,last:1,length:1,lineno:1,ljust:1,load:1,local_variables:1,loop:1,lstrip:1,"lstrip!":1,map:1,"map!":1,match:1,max:1,"member?":1,merge:1,"merge!":1,method:1,"method_defined?":1,method_missing:1,methods:1,min:1,module_eval:1,modulo:1,name:1,nesting:1,"new":1,next:1,"next!":1,"nil?":1,nitems:1,"nonzero?":1,object_id:1,oct:1,open:1,pack:1,partition:1,pid:1,pipe:1,pop:1,popen:1,pos:1,prec:1,prec_f:1,prec_i:1,print:1,printf:1,private_class_method:1,private_instance_methods:1,"private_method_defined?":1,private_methods:1,proc:1,protected_instance_methods:1,"protected_method_defined?":1,protected_methods:1,public_class_method:1,public_instance_methods:1,"public_method_defined?":1,public_methods:1,push:1,putc:1,puts:1,quo:1,raise:1,rand:1,rassoc:1,read:1,read_nonblock:1,readchar:1,readline:1,readlines:1,readpartial:1,rehash:1,reject:1,"reject!":1,remainder:1,reopen:1,replace:1,require:1,"respond_to?":1,reverse:1,"reverse!":1,reverse_each:1,rewind:1,rindex:1,rjust:1,round:1,rstrip:1,"rstrip!":1,scan:1,seek:1,select:1,send:1,set_trace_func:1,shift:1,singleton_method_added:1,singleton_methods:1,size:1,sleep:1,slice:1,"slice!":1,sort:1,"sort!":1,sort_by:1,split:1,sprintf:1,squeeze:1,"squeeze!":1,srand:1,stat:1,step:1,store:1,strip:1,"strip!":1,sub:1,"sub!":1,succ:1,"succ!":1,sum:1,superclass:1,swapcase:1,"swapcase!":1,sync:1,syscall:1,sysopen:1,sysread:1,sysseek:1,system:1,syswrite:1,taint:1,"tainted?":1,tell:1,test:1,"throw":1,times:1,to_a:1,to_ary:1,to_f:1,to_hash:1,to_i:1,to_int:1,to_io:1,to_proc:1,to_s:1,to_str:1,to_sym:1,tr:1,"tr!":1,tr_s:1,"tr_s!":1,trace_var:1,transpose:1,trap:1,truncate:1,"tty?":1,type:1,ungetc:1,uniq:1,"uniq!":1,unpack:1,unshift:1,untaint:1,untrace_var:1,upcase:1,"upcase!":1,update:1,upto:1,"value?":1,values:1,values_at:1,warn:1,write:1,write_nonblock:1,"zero?":1,zip:1}};var h={cN:"yardoctag",b:"@[A-Za-z]+"};var d={cN:"comment",b:"#",e:"$",c:[h]};var c={cN:"comment",b:"^\\=begin",e:"^\\=end",c:[h],r:10};var b={cN:"comment",b:"^__END__",e:"\\n$"};var u={cN:"subst",b:"#\\{",e:"}",l:g,k:n};var p=[hljs.BE,u];var s={cN:"string",b:"'",e:"'",c:p,r:0};var r={cN:"string",b:'"',e:'"',c:p,r:0};var q={cN:"string",b:"%[qw]?\\(",e:"\\)",c:p,r:10};var o={cN:"string",b:"%[qw]?\\[",e:"\\]",c:p,r:10};var m={cN:"string",b:"%[qw]?{",e:"}",c:p,r:10};var l={cN:"string",b:"%[qw]?<",e:">",c:p,r:10};var k={cN:"string",b:"%[qw]?/",e:"/",c:p,r:10};var j={cN:"string",b:"%[qw]?%",e:"%",c:p,r:10};var i={cN:"string",b:"%[qw]?-",e:"-",c:p,r:10};var t={cN:"string",b:"%[qw]?\\|",e:"\\|",c:p,r:10};var e={cN:"function",b:"\\bdef\\s+",e:" |$|;",l:g,k:n,c:[{cN:"title",b:a,l:g,k:n},{cN:"params",b:"\\(",e:"\\)",l:g,k:n},d,c,b]};var f={cN:"identifier",b:g,l:g,k:n,r:0};var v=[d,c,b,s,r,q,o,m,l,k,j,i,t,{cN:"class",b:"\\b(class|module)\\b",e:"$|;",k:{"class":1,module:1},c:[{cN:"title",b:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?",r:0},{cN:"inheritance",b:"<\\s*",c:[{cN:"parent",b:"("+hljs.IR+"::)?"+hljs.IR}]},d,c,b]},e,{cN:"constant",b:"(::)?([A-Z]\\w*(::)?)+",r:0},{cN:"symbol",b:":",c:[s,r,q,o,m,l,k,j,i,t,f],r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{cN:"number",b:"\\?\\w"},{cN:"variable",b:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},f,{b:"("+hljs.RSR+")\\s*",c:[d,c,b,{cN:"regexp",b:"/",e:"/[a-z]*",i:"\\n",c:[hljs.BE]}],r:0}];u.c=v;e.c[1].c=v;return{dM:{l:g,k:n,c:v}}}();hljs.LANGUAGES.javascript={dM:{k:{keyword:{"in":1,"if":1,"for":1,"while":1,"finally":1,"var":1,"new":1,"function":1,"do":1,"return":1,"void":1,"else":1,"break":1,"catch":1,"instanceof":1,"with":1,"throw":1,"case":1,"default":1,"try":1,"this":1,"switch":1,"continue":1,"typeof":1,"delete":1},literal:{"true":1,"false":1,"null":1}},c:[hljs.ASM,hljs.QSM,hljs.CLCM,hljs.CBLCLM,hljs.CNM,{b:"("+hljs.RSR+"|case|return|throw)\\s*",k:{"return":1,"throw":1,"case":1},c:[hljs.CLCM,hljs.CBLCLM,{cN:"regexp",b:"/",e:"/[gim]*",c:[{b:"\\\\/"}]}],r:0},{cN:"function",b:"\\bfunction\\b",e:"{",k:{"function":1},c:[{cN:"title",b:"[A-Za-z$_][0-9A-Za-z$_]*"},{cN:"params",b:"\\(",e:"\\)",c:[hljs.ASM,hljs.QSM,hljs.CLCM,hljs.CBLCLM]}]}]}};hljs.LANGUAGES.css=function(){var a={cN:"function",b:hljs.IR+"\\(",e:"\\)",c:[{eW:true,eE:true,c:[hljs.NM,hljs.ASM,hljs.QSM]}]};return{cI:true,dM:{i:"[=/|']",c:[hljs.CBLCLM,{cN:"id",b:"\\#[A-Za-z0-9_-]+"},{cN:"class",b:"\\.[A-Za-z0-9_-]+",r:0},{cN:"attr_selector",b:"\\[",e:"\\]",i:"$"},{cN:"pseudo",b:":(:)?[a-zA-Z0-9\\_\\-\\+\\(\\)\\\"\\']+"},{cN:"at_rule",b:"@(font-face|page)",l:"[a-z-]+",k:{"font-face":1,page:1}},{cN:"at_rule",b:"@",e:"[{;]",eE:true,k:{"import":1,page:1,media:1,charset:1},c:[a,hljs.ASM,hljs.QSM,hljs.NM]},{cN:"tag",b:hljs.IR,r:0},{cN:"rules",b:"{",e:"}",i:"[^\\s]",r:0,c:[hljs.CBLCLM,{cN:"rule",b:"[^\\s]",rB:true,e:";",eW:true,c:[{cN:"attribute",b:"[A-Z\\_\\.\\-]+",e:":",eE:true,i:"[^\\s]",starts:{cN:"value",eW:true,eE:true,c:[a,hljs.NM,hljs.QSM,hljs.ASM,hljs.CBLCLM,{cN:"hexcolor",b:"\\#[0-9A-F]+"},{cN:"important",b:"!important"}]}}]}]}]}}}();hljs.LANGUAGES.xml=function(){var b="[A-Za-z0-9\\._:-]+";var a={eW:true,c:[{cN:"attribute",b:b,r:0},{b:'="',rB:true,e:'"',c:[{cN:"value",b:'"',eW:true}]},{b:"='",rB:true,e:"'",c:[{cN:"value",b:"'",eW:true}]},{b:"=",c:[{cN:"value",b:"[^\\s/>]+"}]}]};return{cI:true,dM:{c:[{cN:"pi",b:"<\\?",e:"\\?>",r:10},{cN:"doctype",b:"",r:10,c:[{b:"\\[",e:"\\]"}]},{cN:"comment",b:"",r:10},{cN:"cdata",b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{cN:"tag",b:"",k:{title:{style:1}},c:[a],starts:{cN:"css",e:"",rE:true,sL:"css"}},{cN:"tag",b:"",k:{title:{script:1}},c:[a],starts:{cN:"javascript",e:"<\/script>",rE:true,sL:"javascript"}},{cN:"vbscript",b:"<%",e:"%>",sL:"vbscript"},{cN:"tag",b:"",c:[{cN:"title",b:"[^ />]+"},a]}]}}}();hljs.LANGUAGES.java={dM:{k:{"false":1,"synchronized":1,"int":1,"abstract":1,"float":1,"private":1,"char":1,"interface":1,"boolean":1,"static":1,"null":1,"if":1,"const":1,"for":1,"true":1,"while":1,"long":1,"throw":1,strictfp:1,"finally":1,"protected":1,"extends":1,"import":1,"native":1,"final":1,"implements":1,"return":1,"void":1,"enum":1,"else":1,"break":1,"transient":1,"new":1,"catch":1,"instanceof":1,"byte":1,"super":1,"class":1,"volatile":1,"case":1,assert:1,"short":1,"package":1,"default":1,"double":1,"public":1,"try":1,"this":1,"switch":1,"continue":1,"throws":1},c:[{cN:"javadoc",b:"/\\*\\*",e:"\\*/",c:[{cN:"javadoctag",b:"@[A-Za-z]+"}],r:10},hljs.CLCM,hljs.CBLCLM,hljs.ASM,hljs.QSM,{cN:"class",b:"(class |interface )",e:"{",k:{"class":1,"interface":1},i:":",c:[{b:"(implements|extends)",k:{"extends":1,"implements":1},r:10},{cN:"title",b:hljs.UIR}]},hljs.CNM,{cN:"annotation",b:"@[A-Za-z]+"}]}};hljs.LANGUAGES.php={cI:true,dM:{k:{and:1,include_once:1,list:1,"abstract":1,global:1,"private":1,echo:1,"interface":1,as:1,"static":1,endswitch:1,array:1,"null":1,"if":1,endwhile:1,or:1,"const":1,"for":1,endforeach:1,self:1,"var":1,"while":1,isset:1,"public":1,"protected":1,exit:1,foreach:1,"throw":1,elseif:1,"extends":1,include:1,__FILE__:1,empty:1,require_once:1,"function":1,"do":1,xor:1,"return":1,"implements":1,parent:1,clone:1,use:1,__CLASS__:1,__LINE__:1,"else":1,"break":1,print:1,"eval":1,"new":1,"catch":1,__METHOD__:1,"class":1,"case":1,exception:1,php_user_filter:1,"default":1,die:1,require:1,__FUNCTION__:1,enddeclare:1,"final":1,"try":1,"this":1,"switch":1,"continue":1,endfor:1,endif:1,declare:1,unset:1,"true":1,"false":1,namespace:1},c:[hljs.CLCM,hljs.HCM,{cN:"comment",b:"/\\*",e:"\\*/",c:[{cN:"phpdoc",b:"\\s@[A-Za-z]+",r:10}]},hljs.CNM,hljs.inherit(hljs.ASM,{i:null}),hljs.inherit(hljs.QSM,{i:null}),{cN:"variable",b:"\\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*"},{cN:"preprocessor",b:"<\\?php",r:10},{cN:"preprocessor",b:"\\?>"}]}};hljs.LANGUAGES.python=function(){var c={cN:"string",b:"(u|b)?r?'''",e:"'''",r:10};var b={cN:"string",b:'(u|b)?r?"""',e:'"""',r:10};var a={cN:"string",b:"(u|r|ur|b|br)'",e:"'",c:[hljs.BE],r:10};var f={cN:"string",b:'(u|r|ur|b|br)"',e:'"',c:[hljs.BE],r:10};var d={cN:"title",b:hljs.UIR};var e={cN:"params",b:"\\(",e:"\\)",c:[c,b,a,f,hljs.ASM,hljs.QSM]};return{dM:{k:{keyword:{and:1,elif:1,is:1,global:1,as:1,"in":1,"if":1,from:1,raise:1,"for":1,except:1,"finally":1,print:1,"import":1,pass:1,"return":1,exec:1,"else":1,"break":1,not:1,"with":1,"class":1,assert:1,yield:1,"try":1,"while":1,"continue":1,del:1,or:1,def:1,lambda:1,nonlocal:10},built_in:{None:1,True:1,False:1,Ellipsis:1,NotImplemented:1}},i:"(|\\?)",c:[hljs.HCM,c,b,a,f,hljs.ASM,hljs.QSM,{cN:"function",b:"\\bdef ",e:":",i:"$",k:{def:1},c:[d,e],r:10},{cN:"class",b:"\\bclass ",e:":",i:"[${]",k:{"class":1},c:[d,e],r:10},hljs.CNM,{cN:"decorator",b:"@",e:"$"}]}}}();hljs.LANGUAGES.perl=function(){var c={getpwent:1,getservent:1,quotemeta:1,msgrcv:1,scalar:1,kill:1,dbmclose:1,undef:1,lc:1,ma:1,syswrite:1,tr:1,send:1,umask:1,sysopen:1,shmwrite:1,vec:1,qx:1,utime:1,local:1,oct:1,semctl:1,localtime:1,readpipe:1,"do":1,"return":1,format:1,read:1,sprintf:1,dbmopen:1,pop:1,getpgrp:1,not:1,getpwnam:1,rewinddir:1,qq:1,fileno:1,qw:1,endprotoent:1,wait:1,sethostent:1,bless:1,s:1,opendir:1,"continue":1,each:1,sleep:1,endgrent:1,shutdown:1,dump:1,chomp:1,connect:1,getsockname:1,die:1,socketpair:1,close:1,flock:1,exists:1,index:1,shmget:1,sub:1,"for":1,endpwent:1,redo:1,lstat:1,msgctl:1,setpgrp:1,abs:1,exit:1,select:1,print:1,ref:1,gethostbyaddr:1,unshift:1,fcntl:1,syscall:1,"goto":1,getnetbyaddr:1,join:1,gmtime:1,symlink:1,semget:1,splice:1,x:1,getpeername:1,recv:1,log:1,setsockopt:1,cos:1,last:1,reverse:1,gethostbyname:1,getgrnam:1,study:1,formline:1,endhostent:1,times:1,chop:1,length:1,gethostent:1,getnetent:1,pack:1,getprotoent:1,getservbyname:1,rand:1,mkdir:1,pos:1,chmod:1,y:1,substr:1,endnetent:1,printf:1,next:1,open:1,msgsnd:1,readdir:1,use:1,unlink:1,getsockopt:1,getpriority:1,rindex:1,wantarray:1,hex:1,system:1,getservbyport:1,endservent:1,"int":1,chr:1,untie:1,rmdir:1,prototype:1,tell:1,listen:1,fork:1,shmread:1,ucfirst:1,setprotoent:1,"else":1,sysseek:1,link:1,getgrgid:1,shmctl:1,waitpid:1,unpack:1,getnetbyname:1,reset:1,chdir:1,grep:1,split:1,require:1,caller:1,lcfirst:1,until:1,warn:1,"while":1,values:1,shift:1,telldir:1,getpwuid:1,my:1,getprotobynumber:1,"delete":1,and:1,sort:1,uc:1,defined:1,srand:1,accept:1,"package":1,seekdir:1,getprotobyname:1,semop:1,our:1,rename:1,seek:1,"if":1,q:1,chroot:1,sysread:1,setpwent:1,no:1,crypt:1,getc:1,chown:1,sqrt:1,write:1,setnetent:1,setpriority:1,foreach:1,tie:1,sin:1,msgget:1,map:1,stat:1,getlogin:1,unless:1,elsif:1,truncate:1,exec:1,keys:1,glob:1,tied:1,closedir:1,ioctl:1,socket:1,readlink:1,"eval":1,xor:1,readline:1,binmode:1,setservent:1,eof:1,ord:1,bind:1,alarm:1,pipe:1,atan2:1,getgrent:1,exp:1,time:1,push:1,setgrent:1,gt:1,lt:1,or:1,ne:1,m:1};var d={cN:"subst",b:"[$@]\\{",e:"}",k:c,r:10};var b={cN:"variable",b:"\\$\\d"};var a={cN:"variable",b:"[\\$\\%\\@\\*](\\^\\w\\b|#\\w+(\\:\\:\\w+)*|[^\\s\\w{]|{\\w+}|\\w+(\\:\\:\\w*)*)"};var g=[hljs.BE,d,b,a];var f={b:"->",c:[{b:hljs.IR},{b:"{",e:"}"}]};var e=[b,a,hljs.HCM,{cN:"comment",b:"^(__END__|__DATA__)",e:"\\n$",r:5},f,{cN:"string",b:"q[qwxr]?\\s*\\(",e:"\\)",c:g,r:5},{cN:"string",b:"q[qwxr]?\\s*\\[",e:"\\]",c:g,r:5},{cN:"string",b:"q[qwxr]?\\s*\\{",e:"\\}",c:g,r:5},{cN:"string",b:"q[qwxr]?\\s*\\|",e:"\\|",c:g,r:5},{cN:"string",b:"q[qwxr]?\\s*\\<",e:"\\>",c:g,r:5},{cN:"string",b:"qw\\s+q",e:"q",c:g,r:5},{cN:"string",b:"'",e:"'",c:[hljs.BE],r:0},{cN:"string",b:'"',e:'"',c:g,r:0},{cN:"string",b:"`",e:"`",c:[hljs.BE]},{cN:"string",b:"{\\w+}",r:0},{cN:"string",b:"-?\\w+\\s*\\=\\>",r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{cN:"regexp",b:"(s|tr|y)/(\\\\.|[^/])*/(\\\\.|[^/])*/[a-z]*",r:10},{cN:"regexp",b:"(m|qr)?/",e:"/[a-z]*",c:[hljs.BE],r:0},{cN:"sub",b:"\\bsub\\b",e:"(\\s*\\(.*?\\))?[;{]",k:{sub:1},r:5},{cN:"operator",b:"-\\w\\b",r:0},{cN:"pod",b:"\\=\\w",e:"\\=cut"}];d.c=e;f.c[1].c=e;return{dM:{k:c,c:e}}}();hljs.LANGUAGES.cpp=function(){var b={keyword:{"false":1,"int":1,"float":1,"while":1,"private":1,"char":1,"catch":1,"export":1,virtual:1,operator:2,sizeof:2,dynamic_cast:2,typedef:2,const_cast:2,"const":1,struct:1,"for":1,static_cast:2,union:1,namespace:1,unsigned:1,"long":1,"throw":1,"volatile":2,"static":1,"protected":1,bool:1,template:1,mutable:1,"if":1,"public":1,friend:2,"do":1,"return":1,"goto":1,auto:1,"void":2,"enum":1,"else":1,"break":1,"new":1,extern:1,using:1,"true":1,"class":1,asm:1,"case":1,typeid:1,"short":1,reinterpret_cast:2,"default":1,"double":1,register:1,explicit:1,signed:1,typename:1,"try":1,"this":1,"switch":1,"continue":1,wchar_t:1,inline:1,"delete":1,alignof:1,char16_t:1,char32_t:1,constexpr:1,decltype:1,noexcept:1,nullptr:1,static_assert:1,thread_local:1},built_in:{std:1,string:1,cin:1,cout:1,cerr:1,clog:1,stringstream:1,istringstream:1,ostringstream:1,auto_ptr:1,deque:1,list:1,queue:1,stack:1,vector:1,map:1,set:1,bitset:1,multiset:1,multimap:1,unordered_set:1,unordered_map:1,unordered_multiset:1,unordered_multimap:1,array:1,shared_ptr:1}};var a={cN:"stl_container",b:"\\b(deque|list|queue|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array)\\s*<",e:">",k:b,r:10};a.c=[a];return{dM:{k:b,i:"section, 450 | #reveal .slides>section>section { 451 | display: none; 452 | position: absolute; 453 | width: 100%; 454 | min-height: 600px; 455 | 456 | z-index: 10; 457 | 458 | -webkit-transform-style: preserve-3d; 459 | -moz-transform-style: preserve-3d; 460 | -ms-transform-style: preserve-3d; 461 | transform-style: preserve-3d; 462 | 463 | -webkit-transition: all 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985); 464 | -moz-transition: all 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985); 465 | -ms-transition: all 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985); 466 | -o-transition: all 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985); 467 | transition: all 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985); 468 | } 469 | 470 | #reveal .slides>section.present { 471 | display: block; 472 | z-index: 11; 473 | opacity: 1; 474 | } 475 | 476 | 477 | /********************************************* 478 | * DEFAULT TRANSITION 479 | *********************************************/ 480 | 481 | #reveal .slides>section.past { 482 | display: block; 483 | opacity: 0; 484 | 485 | -webkit-transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0); 486 | -moz-transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0); 487 | -ms-transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0); 488 | transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0); 489 | } 490 | #reveal .slides>section.future { 491 | display: block; 492 | opacity: 0; 493 | 494 | -webkit-transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0); 495 | -moz-transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0); 496 | -ms-transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0); 497 | transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0); 498 | } 499 | 500 | #reveal .slides>section>section.past { 501 | display: block; 502 | opacity: 0; 503 | 504 | -webkit-transform: translate3d(0, -50%, 0) rotateX(70deg) translate3d(0, -50%, 0); 505 | -moz-transform: translate3d(0, -50%, 0) rotateX(70deg) translate3d(0, -50%, 0); 506 | -ms-transform: translate3d(0, -50%, 0) rotateX(70deg) translate3d(0, -50%, 0); 507 | transform: translate3d(0, -50%, 0) rotateX(70deg) translate3d(0, -50%, 0); 508 | } 509 | #reveal .slides>section>section.future { 510 | display: block; 511 | opacity: 0; 512 | 513 | -webkit-transform: translate3d(0, 50%, 0) rotateX(-70deg) translate3d(0, 50%, 0); 514 | -moz-transform: translate3d(0, 50%, 0) rotateX(-70deg) translate3d(0, 50%, 0); 515 | -ms-transform: translate3d(0, 50%, 0) rotateX(-70deg) translate3d(0, 50%, 0); 516 | transform: translate3d(0, 50%, 0) rotateX(-70deg) translate3d(0, 50%, 0); 517 | } 518 | 519 | 520 | /********************************************* 521 | * CONCAVE TRANSITION 522 | *********************************************/ 523 | 524 | #reveal.concave .slides>section.past { 525 | -webkit-transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0); 526 | -moz-transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0); 527 | -ms-transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0); 528 | transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0); 529 | } 530 | #reveal.concave .slides>section.future { 531 | -webkit-transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0); 532 | -moz-transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0); 533 | -ms-transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0); 534 | transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0); 535 | } 536 | 537 | #reveal.concave .slides>section>section.past { 538 | -webkit-transform: translate3d(0, -80%, 0) rotateX(-70deg) translate3d(0, -80%, 0); 539 | -moz-transform: translate3d(0, -80%, 0) rotateX(-70deg) translate3d(0, -80%, 0); 540 | -ms-transform: translate3d(0, -80%, 0) rotateX(-70deg) translate3d(0, -80%, 0); 541 | transform: translate3d(0, -80%, 0) rotateX(-70deg) translate3d(0, -80%, 0); 542 | } 543 | #reveal.concave .slides>section>section.future { 544 | -webkit-transform: translate3d(0, 80%, 0) rotateX(70deg) translate3d(0, 80%, 0); 545 | -moz-transform: translate3d(0, 80%, 0) rotateX(70deg) translate3d(0, 80%, 0); 546 | -ms-transform: translate3d(0, 80%, 0) rotateX(70deg) translate3d(0, 80%, 0); 547 | transform: translate3d(0, 80%, 0) rotateX(70deg) translate3d(0, 80%, 0); 548 | } 549 | 550 | 551 | /********************************************* 552 | * LINEAR TRANSITION 553 | *********************************************/ 554 | 555 | #reveal.linear .slides>section.past { 556 | -webkit-transform: translate(-150%, 0); 557 | -moz-transform: translate(-150%, 0); 558 | -ms-transform: translate(-150%, 0); 559 | -o-transform: translate(-150%, 0); 560 | transform: translate(-150%, 0); 561 | } 562 | #reveal.linear .slides>section.future { 563 | -webkit-transform: translate(150%, 0); 564 | -moz-transform: translate(150%, 0); 565 | -ms-transform: translate(150%, 0); 566 | -o-transform: translate(150%, 0); 567 | transform: translate(150%, 0); 568 | } 569 | 570 | #reveal.linear .slides>section>section.past { 571 | -webkit-transform: translate(0, -150%); 572 | -moz-transform: translate(0, -150%); 573 | -ms-transform: translate(0, -150%); 574 | -o-transform: translate(0, -150%); 575 | transform: translate(0, -150%); 576 | } 577 | #reveal.linear .slides>section>section.future { 578 | -webkit-transform: translate(0, 150%); 579 | -moz-transform: translate(0, 150%); 580 | -ms-transform: translate(0, 150%); 581 | -o-transform: translate(0, 150%); 582 | transform: translate(0, 150%); 583 | } 584 | 585 | /********************************************* 586 | * BOX TRANSITION 587 | *********************************************/ 588 | 589 | #reveal.cube .slides { 590 | margin-top: -350px; 591 | 592 | -webkit-perspective-origin: 50% 25%; 593 | -moz-perspective-origin: 50% 25%; 594 | -ms-perspective-origin: 50% 25%; 595 | perspective-origin: 50% 25%; 596 | 597 | -webkit-perspective: 1300px; 598 | -moz-perspective: 1300px; 599 | -ms-perspective: 1300px; 600 | perspective: 1300px; 601 | } 602 | 603 | #reveal.cube .slides section { 604 | padding: 30px; 605 | 606 | -webkit-backface-visibility: hidden; 607 | -moz-backface-visibility: hidden; 608 | -ms-backface-visibility: hidden; 609 | backface-visibility: hidden; 610 | 611 | -webkit-box-sizing: border-box; 612 | -moz-box-sizing: border-box; 613 | box-sizing: border-box; 614 | } 615 | #reveal.cube .slides section:not(.stack):before { 616 | content: ''; 617 | position: absolute; 618 | display: block; 619 | width: 100%; 620 | height: 100%; 621 | left: 0; 622 | top: 0; 623 | background: #232628; 624 | border-radius: 4px; 625 | 626 | -webkit-transform: translateZ( -20px ); 627 | -moz-transform: translateZ( -20px ); 628 | -ms-transform: translateZ( -20px ); 629 | -o-transform: translateZ( -20px ); 630 | transform: translateZ( -20px ); 631 | } 632 | #reveal.cube .slides section:not(.stack):after { 633 | content: ''; 634 | position: absolute; 635 | display: block; 636 | width: 90%; 637 | height: 30px; 638 | left: 5%; 639 | bottom: 0; 640 | background: none; 641 | z-index: 1; 642 | 643 | border-radius: 4px; 644 | box-shadow: 0px 95px 25px rgba(0,0,0,0.2); 645 | 646 | -webkit-transform: translateZ(-90px) rotateX( 65deg ); 647 | -moz-transform: translateZ(-90px) rotateX( 65deg ); 648 | -ms-transform: translateZ(-90px) rotateX( 65deg ); 649 | -o-transform: translateZ(-90px) rotateX( 65deg ); 650 | transform: translateZ(-90px) rotateX( 65deg ); 651 | } 652 | 653 | #reveal.cube .slides>section.stack { 654 | padding: 0; 655 | background: none; 656 | } 657 | 658 | #reveal.cube .slides>section.past { 659 | -webkit-transform-origin: 100% 0%; 660 | -moz-transform-origin: 100% 0%; 661 | -ms-transform-origin: 100% 0%; 662 | transform-origin: 100% 0%; 663 | 664 | -webkit-transform: translate3d(-100%, 0, 0) rotateY(-90deg); 665 | -moz-transform: translate3d(-100%, 0, 0) rotateY(-90deg); 666 | -ms-transform: translate3d(-100%, 0, 0) rotateY(-90deg); 667 | transform: translate3d(-100%, 0, 0) rotateY(-90deg); 668 | } 669 | 670 | #reveal.cube .slides>section.future { 671 | -webkit-transform-origin: 0% 0%; 672 | -moz-transform-origin: 0% 0%; 673 | -ms-transform-origin: 0% 0%; 674 | transform-origin: 0% 0%; 675 | 676 | -webkit-transform: translate3d(100%, 0, 0) rotateY(90deg); 677 | -moz-transform: translate3d(100%, 0, 0) rotateY(90deg); 678 | -ms-transform: translate3d(100%, 0, 0) rotateY(90deg); 679 | transform: translate3d(100%, 0, 0) rotateY(90deg); 680 | } 681 | 682 | #reveal.cube .slides>section>section.past { 683 | -webkit-transform-origin: 0% 100%; 684 | -moz-transform-origin: 0% 100%; 685 | -ms-transform-origin: 0% 100%; 686 | transform-origin: 0% 100%; 687 | 688 | -webkit-transform: translate3d(0, -100%, 0) rotateX(90deg); 689 | -moz-transform: translate3d(0, -100%, 0) rotateX(90deg); 690 | -ms-transform: translate3d(0, -100%, 0) rotateX(90deg); 691 | transform: translate3d(0, -100%, 0) rotateX(90deg); 692 | } 693 | 694 | #reveal.cube .slides>section>section.future { 695 | -webkit-transform-origin: 0% 0%; 696 | -moz-transform-origin: 0% 0%; 697 | -ms-transform-origin: 0% 0%; 698 | transform-origin: 0% 0%; 699 | 700 | -webkit-transform: translate3d(0, 100%, 0) rotateX(-90deg); 701 | -moz-transform: translate3d(0, 100%, 0) rotateX(-90deg); 702 | -ms-transform: translate3d(0, 100%, 0) rotateX(-90deg); 703 | transform: translate3d(0, 100%, 0) rotateX(-90deg); 704 | } 705 | 706 | 707 | /********************************************* 708 | * PAGE TRANSITION 709 | *********************************************/ 710 | 711 | #reveal.page .slides { 712 | margin-top: -350px; 713 | 714 | -webkit-perspective-origin: 50% 50%; 715 | -moz-perspective-origin: 50% 50%; 716 | -ms-perspective-origin: 50% 50%; 717 | perspective-origin: 50% 50%; 718 | 719 | -webkit-perspective: 3000px; 720 | -moz-perspective: 3000px; 721 | -ms-perspective: 3000px; 722 | perspective: 3000px; 723 | } 724 | 725 | #reveal.page .slides section { 726 | padding: 30px; 727 | 728 | -webkit-box-sizing: border-box; 729 | -moz-box-sizing: border-box; 730 | box-sizing: border-box; 731 | } 732 | #reveal.page .slides section.past { 733 | z-index: 12; 734 | } 735 | #reveal.page .slides section:not(.stack):before { 736 | content: ''; 737 | position: absolute; 738 | display: block; 739 | width: 100%; 740 | height: 100%; 741 | left: 0; 742 | top: 0; 743 | background: #232628; 744 | 745 | -webkit-transform: translateZ( -20px ); 746 | -moz-transform: translateZ( -20px ); 747 | -ms-transform: translateZ( -20px ); 748 | -o-transform: translateZ( -20px ); 749 | transform: translateZ( -20px ); 750 | } 751 | #reveal.page .slides section:not(.stack):after { 752 | content: ''; 753 | position: absolute; 754 | display: block; 755 | width: 90%; 756 | height: 30px; 757 | left: 5%; 758 | bottom: 0; 759 | background: none; 760 | z-index: 1; 761 | 762 | border-radius: 4px; 763 | box-shadow: 0px 95px 25px rgba(0,0,0,0.2); 764 | 765 | -webkit-transform: translateZ(-90px) rotateX( 65deg ); 766 | } 767 | 768 | #reveal.page .slides>section.stack { 769 | padding: 0; 770 | background: none; 771 | } 772 | 773 | #reveal.page .slides>section.past { 774 | -webkit-transform-origin: 0% 0%; 775 | -moz-transform-origin: 0% 0%; 776 | -ms-transform-origin: 0% 0%; 777 | transform-origin: 0% 0%; 778 | 779 | -webkit-transform: translate3d(-40%, 0, 0) rotateY(-80deg); 780 | -moz-transform: translate3d(-40%, 0, 0) rotateY(-80deg); 781 | -ms-transform: translate3d(-40%, 0, 0) rotateY(-80deg); 782 | transform: translate3d(-40%, 0, 0) rotateY(-80deg); 783 | } 784 | 785 | #reveal.page .slides>section.future { 786 | -webkit-transform-origin: 100% 0%; 787 | -moz-transform-origin: 100% 0%; 788 | -ms-transform-origin: 100% 0%; 789 | transform-origin: 100% 0%; 790 | 791 | -webkit-transform: translate3d(0, 0, 0); 792 | -moz-transform: translate3d(0, 0, 0); 793 | -ms-transform: translate3d(0, 0, 0); 794 | transform: translate3d(0, 0, 0); 795 | } 796 | 797 | #reveal.page .slides>section>section.past { 798 | -webkit-transform-origin: 0% 0%; 799 | -moz-transform-origin: 0% 0%; 800 | -ms-transform-origin: 0% 0%; 801 | transform-origin: 0% 0%; 802 | 803 | -webkit-transform: translate3d(0, -40%, 0) rotateX(80deg); 804 | -moz-transform: translate3d(0, -40%, 0) rotateX(80deg); 805 | -ms-transform: translate3d(0, -40%, 0) rotateX(80deg); 806 | transform: translate3d(0, -40%, 0) rotateX(80deg); 807 | } 808 | 809 | #reveal.page .slides>section>section.future { 810 | -webkit-transform-origin: 0% 100%; 811 | -moz-transform-origin: 0% 100%; 812 | -ms-transform-origin: 0% 100%; 813 | transform-origin: 0% 100%; 814 | 815 | -webkit-transform: translate3d(0, 0, 0); 816 | -moz-transform: translate3d(0, 0, 0); 817 | -ms-transform: translate3d(0, 0, 0); 818 | transform: translate3d(0, 0, 0); 819 | } 820 | 821 | 822 | /********************************************* 823 | * NEON THEME 824 | *********************************************/ 825 | 826 | #reveal.neon a, 827 | #reveal.neon a:hover, 828 | #reveal.neon .controls a.enabled { 829 | color: #5de048; 830 | } 831 | 832 | #reveal.neon .progress span, 833 | #reveal.neon .roll span:after { 834 | background: #5de048; 835 | } 836 | 837 | #reveal.neon a.image:hover img { 838 | border-color: #5de048; 839 | } 840 | 841 | 842 | /********************************************* 843 | * OVERVIEW 844 | *********************************************/ 845 | 846 | #reveal.overview .slides { 847 | -webkit-perspective: 700px; 848 | -moz-perspective: 700px; 849 | -ms-perspective: 700px; 850 | perspective: 700px; 851 | } 852 | 853 | #reveal.overview .slides section { 854 | padding: 20px 0; 855 | opacity: 1; 856 | cursor: pointer; 857 | background: rgba(0,0,0,0.1); 858 | } 859 | #reveal.overview .slides section:after, 860 | #reveal.overview .slides section:before { 861 | display: none !important; 862 | } 863 | #reveal.overview .slides section>section { 864 | opacity: 1; 865 | cursor: pointer; 866 | } 867 | #reveal.overview .slides section:hover { 868 | background: rgba(0,0,0,0.3); 869 | } 870 | 871 | #reveal.overview .slides section.present { 872 | background: rgba(0,0,0,0.3); 873 | } 874 | #reveal.overview .slides>section.stack { 875 | background: none; 876 | padding: 0; 877 | } 878 | 879 | 880 | /********************************************* 881 | * FALLBACK 882 | *********************************************/ 883 | 884 | .no-transforms { 885 | overflow-y: auto; 886 | } 887 | 888 | .no-transforms .slides section { 889 | -webkit-transform: none; 890 | -moz-transform: none; 891 | -ms-transform: none; 892 | transform: none; 893 | 894 | display: block!important; 895 | opacity: 1!important; 896 | position: relative!important; 897 | } 898 | 899 | 900 | 901 | 902 | 903 | 904 | --------------------------------------------------------------------------------