From c780cb741f70864b3ad378ab14f97edb1d0972d5 Mon Sep 17 00:00:00 2001 From: Josh Miller Date: Mon, 21 Oct 2013 16:55:18 -0400 Subject: [PATCH 1/2] make it run --- css/print/paper.css | 176 ++ css/print/pdf.css | 190 +++ css/reveal.css | 1607 ++++++++++++++++++ css/reveal.min.css | 7 + css/theme/README.md | 23 + css/theme/beige.css | 142 ++ css/theme/default.css | 142 ++ css/theme/moon.css | 142 ++ css/theme/night.css | 130 ++ css/theme/serif.css | 132 ++ css/theme/simple.css | 132 ++ css/theme/sky.css | 139 ++ css/theme/solarized.css | 142 ++ css/theme/source/beige.scss | 50 + css/theme/source/default.scss | 42 + css/theme/source/moon.scss | 68 + css/theme/source/night.scss | 35 + css/theme/source/serif.scss | 35 + css/theme/source/simple.scss | 38 + css/theme/source/sky.scss | 46 + css/theme/source/solarized.scss | 74 + css/theme/template/mixins.scss | 29 + css/theme/template/settings.scss | 33 + css/theme/template/theme.scss | 163 ++ js/reveal.js | 2577 +++++++++++++++++++++++++++++ js/reveal.min.js | 8 + plugin/highlight/highlight.js | 31 + plugin/markdown/example.html | 97 ++ plugin/markdown/example.md | 29 + plugin/markdown/markdown.js | 190 +++ plugin/markdown/marked.js | 37 + plugin/multiplex/client.js | 13 + plugin/multiplex/index.js | 56 + plugin/multiplex/master.js | 50 + plugin/notes-server/client.js | 57 + plugin/notes-server/index.js | 59 + plugin/notes-server/notes.html | 142 ++ plugin/notes/notes.html | 253 +++ plugin/notes/notes.js | 100 ++ plugin/postmessage/example.html | 39 + plugin/postmessage/postmessage.js | 42 + plugin/print-pdf/print-pdf.js | 44 + plugin/remotes/remotes.js | 39 + plugin/search/search.js | 196 +++ plugin/zoom-js/zoom.js | 256 +++ 45 files changed, 8032 insertions(+) create mode 100644 css/print/paper.css create mode 100644 css/print/pdf.css create mode 100644 css/reveal.css create mode 100644 css/reveal.min.css create mode 100644 css/theme/README.md create mode 100644 css/theme/beige.css create mode 100644 css/theme/default.css create mode 100644 css/theme/moon.css create mode 100644 css/theme/night.css create mode 100644 css/theme/serif.css create mode 100644 css/theme/simple.css create mode 100644 css/theme/sky.css create mode 100644 css/theme/solarized.css create mode 100644 css/theme/source/beige.scss create mode 100644 css/theme/source/default.scss create mode 100644 css/theme/source/moon.scss create mode 100644 css/theme/source/night.scss create mode 100644 css/theme/source/serif.scss create mode 100644 css/theme/source/simple.scss create mode 100644 css/theme/source/sky.scss create mode 100644 css/theme/source/solarized.scss create mode 100644 css/theme/template/mixins.scss create mode 100644 css/theme/template/settings.scss create mode 100644 css/theme/template/theme.scss create mode 100644 js/reveal.js create mode 100644 js/reveal.min.js create mode 100644 plugin/highlight/highlight.js create mode 100644 plugin/markdown/example.html create mode 100644 plugin/markdown/example.md create mode 100755 plugin/markdown/markdown.js create mode 100644 plugin/markdown/marked.js create mode 100644 plugin/multiplex/client.js create mode 100644 plugin/multiplex/index.js create mode 100644 plugin/multiplex/master.js create mode 100644 plugin/notes-server/client.js create mode 100644 plugin/notes-server/index.js create mode 100644 plugin/notes-server/notes.html create mode 100644 plugin/notes/notes.html create mode 100644 plugin/notes/notes.js create mode 100644 plugin/postmessage/example.html create mode 100644 plugin/postmessage/postmessage.js create mode 100644 plugin/print-pdf/print-pdf.js create mode 100644 plugin/remotes/remotes.js create mode 100644 plugin/search/search.js create mode 100644 plugin/zoom-js/zoom.js diff --git a/css/print/paper.css b/css/print/paper.css new file mode 100644 index 0000000..f902dea --- /dev/null +++ b/css/print/paper.css @@ -0,0 +1,176 @@ +/* Default Print Stylesheet Template + by Rob Glazebrook of CSSnewbie.com + Last Updated: June 4, 2008 + + Feel free (nay, compelled) to edit, append, and + manipulate this file as you see fit. */ + + +/* SECTION 1: Set default width, margin, float, and + background. This prevents elements from extending + beyond the edge of the printed page, and prevents + unnecessary background images from printing */ +body { + background: #fff; + font-size: 13pt; + width: auto; + height: auto; + border: 0; + margin: 0 5%; + padding: 0; + float: none !important; + overflow: visible; +} +html { + background: #fff; + width: auto; + height: auto; + overflow: visible; +} + +/* SECTION 2: Remove any elements not needed in print. + This would include navigation, ads, sidebars, etc. */ +.nestedarrow, +.controls, +.reveal .progress, +.reveal.overview, +.fork-reveal, +.share-reveal, +.state-background { + display: none !important; +} + +/* SECTION 3: Set body font face, size, and color. + Consider using a serif font for readability. */ +body, p, td, li, div, a { + font-size: 16pt!important; + font-family: Georgia, "Times New Roman", Times, serif !important; + color: #000; +} + +/* SECTION 4: Set heading font face, sizes, and color. + Diffrentiate your headings from your body text. + Perhaps use a large sans-serif for distinction. */ +h1,h2,h3,h4,h5,h6 { + color: #000!important; + height: auto; + line-height: normal; + font-family: Georgia, "Times New Roman", Times, serif !important; + text-shadow: 0 0 0 #000 !important; + text-align: left; + letter-spacing: normal; +} +/* Need to reduce the size of the fonts for printing */ +h1 { font-size: 26pt !important; } +h2 { font-size: 22pt !important; } +h3 { font-size: 20pt !important; } +h4 { font-size: 20pt !important; font-variant: small-caps; } +h5 { font-size: 19pt !important; } +h6 { font-size: 18pt !important; font-style: italic; } + +/* SECTION 5: Make hyperlinks more usable. + Ensure links are underlined, and consider appending + the URL to the end of the link for usability. */ +a:link, +a:visited { + color: #000 !important; + font-weight: bold; + text-decoration: underline; +} +/* +.reveal a:link:after, +.reveal a:visited:after { + content: " (" attr(href) ") "; + color: #222 !important; + font-size: 90%; +} +*/ + + +/* SECTION 6: more reveal.js specific additions by @skypanther */ +ul, ol, div, p { + visibility: visible; + position: static; + width: auto; + height: auto; + display: block; + overflow: visible; + margin: auto; + text-align: left !important; +} +.reveal .slides { + position: static; + width: auto; + height: auto; + + left: auto; + top: auto; + margin-left: auto; + margin-top: auto; + padding: auto; + + overflow: visible; + display: block; + + text-align: center; + -webkit-perspective: none; + -moz-perspective: none; + -ms-perspective: none; + perspective: none; + + -webkit-perspective-origin: 50% 50%; /* there isn't a none/auto value but 50-50 is the default */ + -moz-perspective-origin: 50% 50%; + -ms-perspective-origin: 50% 50%; + perspective-origin: 50% 50%; +} +.reveal .slides>section, +.reveal .slides>section>section { + + visibility: visible !important; + position: static !important; + width: 90% !important; + height: auto !important; + display: block !important; + overflow: visible !important; + + left: 0% !important; + top: 0% !important; + margin-left: 0px !important; + margin-top: 0px !important; + padding: 20px 0px !important; + + opacity: 1 !important; + + -webkit-transform-style: flat !important; + -moz-transform-style: flat !important; + -ms-transform-style: flat !important; + transform-style: flat !important; + + -webkit-transform: none !important; + -moz-transform: none !important; + -ms-transform: none !important; + transform: none !important; +} +.reveal section { + page-break-after: always !important; + display: block !important; +} +.reveal section .fragment { + opacity: 1 !important; + visibility: visible !important; + + -webkit-transform: none !important; + -moz-transform: none !important; + -ms-transform: none !important; + transform: none !important; +} +.reveal section:last-of-type { + page-break-after: avoid !important; +} +.reveal section img { + display: block; + margin: 15px 0px; + background: rgba(255,255,255,1); + border: 1px solid #666; + box-shadow: none; +} \ No newline at end of file diff --git a/css/print/pdf.css b/css/print/pdf.css new file mode 100644 index 0000000..9094ef1 --- /dev/null +++ b/css/print/pdf.css @@ -0,0 +1,190 @@ +/* Default Print Stylesheet Template + by Rob Glazebrook of CSSnewbie.com + Last Updated: June 4, 2008 + + Feel free (nay, compelled) to edit, append, and + manipulate this file as you see fit. */ + + +/* SECTION 1: Set default width, margin, float, and + background. This prevents elements from extending + beyond the edge of the printed page, and prevents + unnecessary background images from printing */ + +* { + -webkit-print-color-adjust: exact; +} + +body { + font-size: 18pt; + width: 297mm; + height: 229mm; + margin: 0 auto !important; + border: 0; + padding: 0; + float: none !important; + overflow: visible; +} + +html { + width: 100%; + height: 100%; + overflow: visible; +} + +@page { + size: letter landscape; + margin: 0; +} + +/* SECTION 2: Remove any elements not needed in print. + This would include navigation, ads, sidebars, etc. */ +.nestedarrow, +.controls, +.reveal .progress, +.reveal.overview, +.fork-reveal, +.share-reveal, +.state-background { + display: none !important; +} + +/* SECTION 3: Set body font face, size, and color. + Consider using a serif font for readability. */ +body, p, td, li, div { + font-size: 18pt; +} + +/* SECTION 4: Set heading font face, sizes, and color. + Diffrentiate your headings from your body text. + Perhaps use a large sans-serif for distinction. */ +h1,h2,h3,h4,h5,h6 { + text-shadow: 0 0 0 #000 !important; +} + +/* SECTION 5: Make hyperlinks more usable. + Ensure links are underlined, and consider appending + the URL to the end of the link for usability. */ +a:link, +a:visited { + font-weight: bold; + text-decoration: underline; +} + +.reveal pre code { + overflow: hidden !important; + font-family: monospace !important; +} + + +/* SECTION 6: more reveal.js specific additions by @skypanther */ +ul, ol, div, p { + visibility: visible; + position: static; + width: auto; + height: auto; + display: block; + overflow: visible; + margin: auto; +} +.reveal { + width: auto !important; + height: auto !important; + overflow: hidden !important; +} +.reveal .slides { + position: static; + width: 100%; + height: auto; + + left: auto; + top: auto; + margin: 0 !important; + padding: 0 !important; + + overflow: visible; + display: block; + + text-align: center; + + -webkit-perspective: none; + -moz-perspective: none; + -ms-perspective: none; + perspective: none; + + -webkit-perspective-origin: 50% 50%; /* there isn't a none/auto value but 50-50 is the default */ + -moz-perspective-origin: 50% 50%; + -ms-perspective-origin: 50% 50%; + perspective-origin: 50% 50%; +} +.reveal .slides section { + + page-break-after: always !important; + + visibility: visible !important; + position: relative !important; + width: 100% !important; + height: 229mm !important; + min-height: 229mm !important; + display: block !important; + overflow: hidden !important; + + left: 0 !important; + top: 0 !important; + margin: 0 !important; + padding: 2cm 2cm 0 2cm !important; + box-sizing: border-box !important; + + opacity: 1 !important; + + -webkit-transform-style: flat !important; + -moz-transform-style: flat !important; + -ms-transform-style: flat !important; + transform-style: flat !important; + + -webkit-transform: none !important; + -moz-transform: none !important; + -ms-transform: none !important; + transform: none !important; +} +.reveal section.stack { + margin: 0 !important; + padding: 0 !important; + page-break-after: avoid !important; + height: auto !important; + min-height: auto !important; +} +.reveal .absolute-element { + margin-left: 2.2cm; + margin-top: 1.8cm; +} +.reveal section .fragment { + opacity: 1 !important; + visibility: visible !important; + + -webkit-transform: none !important; + -moz-transform: none !important; + -ms-transform: none !important; + transform: none !important; +} +.reveal section .slide-background { + position: absolute; + top: 0; + left: 0; + width: 100%; + z-index: 0; +} +.reveal section>* { + position: relative; + z-index: 1; +} +.reveal img { + box-shadow: none; +} +.reveal .roll { + overflow: visible; + line-height: 1em; +} +.reveal small a { + font-size: 16pt !important; +} diff --git a/css/reveal.css b/css/reveal.css new file mode 100644 index 0000000..ad55cf8 --- /dev/null +++ b/css/reveal.css @@ -0,0 +1,1607 @@ +@charset "UTF-8"; + +/*! + * reveal.js + * http://lab.hakim.se/reveal-js + * MIT licensed + * + * Copyright (C) 2013 Hakim El Hattab, http://hakim.se + */ + + +/********************************************* + * RESET STYLES + *********************************************/ + +html, body, .reveal div, .reveal span, .reveal applet, .reveal object, .reveal iframe, +.reveal h1, .reveal h2, .reveal h3, .reveal h4, .reveal h5, .reveal h6, .reveal p, .reveal blockquote, .reveal pre, +.reveal a, .reveal abbr, .reveal acronym, .reveal address, .reveal big, .reveal cite, .reveal code, +.reveal del, .reveal dfn, .reveal em, .reveal img, .reveal ins, .reveal kbd, .reveal q, .reveal s, .reveal samp, +.reveal small, .reveal strike, .reveal strong, .reveal sub, .reveal sup, .reveal tt, .reveal var, +.reveal b, .reveal u, .reveal i, .reveal center, +.reveal dl, .reveal dt, .reveal dd, .reveal ol, .reveal ul, .reveal li, +.reveal fieldset, .reveal form, .reveal label, .reveal legend, +.reveal table, .reveal caption, .reveal tbody, .reveal tfoot, .reveal thead, .reveal tr, .reveal th, .reveal td, +.reveal article, .reveal aside, .reveal canvas, .reveal details, .reveal embed, +.reveal figure, .reveal figcaption, .reveal footer, .reveal header, .reveal hgroup, +.reveal menu, .reveal nav, .reveal output, .reveal ruby, .reveal section, .reveal summary, +.reveal time, .reveal mark, .reveal audio, video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; +} + +.reveal article, .reveal aside, .reveal details, .reveal figcaption, .reveal figure, +.reveal footer, .reveal header, .reveal hgroup, .reveal menu, .reveal nav, .reveal section { + display: block; +} + + +/********************************************* + * GLOBAL STYLES + *********************************************/ + +html, +body { + width: 100%; + height: 100%; + overflow: hidden; +} + +body { + position: relative; + line-height: 1; +} + +::selection { + background: #FF5E99; + color: #fff; + text-shadow: none; +} + + +/********************************************* + * HEADERS + *********************************************/ + +.reveal h1, +.reveal h2, +.reveal h3, +.reveal h4, +.reveal h5, +.reveal h6 { + -webkit-hyphens: auto; + -moz-hyphens: auto; + hyphens: auto; + + word-wrap: break-word; + line-height: 1; +} + +.reveal h1 { font-size: 3.77em; } +.reveal h2 { font-size: 2.11em; } +.reveal h3 { font-size: 1.55em; } +.reveal h4 { font-size: 1em; } + + +/********************************************* + * VIEW FRAGMENTS + *********************************************/ + +.reveal .slides section .fragment { + opacity: 0; + + -webkit-transition: all .2s ease; + -moz-transition: all .2s ease; + -ms-transition: all .2s ease; + -o-transition: all .2s ease; + transition: all .2s ease; +} + .reveal .slides section .fragment.visible { + opacity: 1; + } + +.reveal .slides section .fragment.grow { + opacity: 1; +} + .reveal .slides section .fragment.grow.visible { + -webkit-transform: scale( 1.3 ); + -moz-transform: scale( 1.3 ); + -ms-transform: scale( 1.3 ); + -o-transform: scale( 1.3 ); + transform: scale( 1.3 ); + } + +.reveal .slides section .fragment.shrink { + opacity: 1; +} + .reveal .slides section .fragment.shrink.visible { + -webkit-transform: scale( 0.7 ); + -moz-transform: scale( 0.7 ); + -ms-transform: scale( 0.7 ); + -o-transform: scale( 0.7 ); + transform: scale( 0.7 ); + } + +.reveal .slides section .fragment.zoom-in { + opacity: 0; + + -webkit-transform: scale( 0.1 ); + -moz-transform: scale( 0.1 ); + -ms-transform: scale( 0.1 ); + -o-transform: scale( 0.1 ); + transform: scale( 0.1 ); +} + + .reveal .slides section .fragment.zoom-in.visible { + opacity: 1; + + -webkit-transform: scale( 1 ); + -moz-transform: scale( 1 ); + -ms-transform: scale( 1 ); + -o-transform: scale( 1 ); + transform: scale( 1 ); + } + +.reveal .slides section .fragment.roll-in { + opacity: 0; + + -webkit-transform: rotateX( 90deg ); + -moz-transform: rotateX( 90deg ); + -ms-transform: rotateX( 90deg ); + -o-transform: rotateX( 90deg ); + transform: rotateX( 90deg ); +} + .reveal .slides section .fragment.roll-in.visible { + opacity: 1; + + -webkit-transform: rotateX( 0 ); + -moz-transform: rotateX( 0 ); + -ms-transform: rotateX( 0 ); + -o-transform: rotateX( 0 ); + transform: rotateX( 0 ); + } + +.reveal .slides section .fragment.fade-out { + opacity: 1; +} + .reveal .slides section .fragment.fade-out.visible { + opacity: 0; + } + +.reveal .slides section .fragment.semi-fade-out { + opacity: 1; +} + .reveal .slides section .fragment.semi-fade-out.visible { + opacity: 0.5; + } + +.reveal .slides section .fragment.highlight-red, +.reveal .slides section .fragment.highlight-green, +.reveal .slides section .fragment.highlight-blue { + opacity: 1; +} + .reveal .slides section .fragment.highlight-red.visible { + color: #ff2c2d + } + .reveal .slides section .fragment.highlight-green.visible { + color: #17ff2e; + } + .reveal .slides section .fragment.highlight-blue.visible { + color: #1b91ff; + } + + +/********************************************* + * DEFAULT ELEMENT STYLES + *********************************************/ + +/* Fixes issue in Chrome where italic fonts did not appear when printing to PDF */ +.reveal:after { + content: ''; + font-style: italic; +} + +/* Ensure certain elements are never larger than the slide itself */ +.reveal img, +.reveal video, +.reveal iframe { + max-width: 95%; + max-height: 95%; +} + +/** Prevents layering issues in certain browser/transition combinations */ +.reveal a { + position: relative; +} + +.reveal strong, +.reveal b { + font-weight: bold; +} + +.reveal em, +.reveal i { + font-style: italic; +} + +.reveal ol, +.reveal ul { + display: inline-block; + + text-align: left; + margin: 0 0 0 1em; +} + +.reveal ol { + list-style-type: decimal; +} + +.reveal ul { + list-style-type: disc; +} + +.reveal ul ul { + list-style-type: square; +} + +.reveal ul ul ul { + list-style-type: circle; +} + +.reveal ul ul, +.reveal ul ol, +.reveal ol ol, +.reveal ol ul { + display: block; + margin-left: 40px; +} + +.reveal p { + margin-bottom: 10px; + line-height: 1.2em; +} + +.reveal q, +.reveal blockquote { + quotes: none; +} + +.reveal blockquote { + display: block; + position: relative; + width: 70%; + margin: 5px auto; + padding: 5px; + + font-style: italic; + background: rgba(255, 255, 255, 0.05); + box-shadow: 0px 0px 2px rgba(0,0,0,0.2); +} + .reveal blockquote p:first-child, + .reveal blockquote p:last-child { + display: inline-block; + } + +.reveal q { + font-style: italic; +} + +.reveal pre { + display: block; + position: relative; + width: 90%; + margin: 15px auto; + + text-align: left; + font-size: 0.55em; + font-family: monospace; + line-height: 1.2em; + + word-wrap: break-word; + + box-shadow: 0px 0px 6px rgba(0,0,0,0.3); +} +.reveal code { + font-family: monospace; +} +.reveal pre code { + padding: 5px; + overflow: auto; + max-height: 400px; + word-wrap: normal; +} + +.reveal table th, +.reveal table td { + text-align: left; + padding-right: .3em; +} + +.reveal table th { + text-shadow: rgb(255,255,255) 1px 1px 2px; +} + +.reveal sup { + vertical-align: super; +} +.reveal sub { + vertical-align: sub; +} + +.reveal small { + display: inline-block; + font-size: 0.6em; + line-height: 1.2em; + vertical-align: top; +} + +.reveal small * { + vertical-align: top; +} + + +/********************************************* + * CONTROLS + *********************************************/ + +.reveal .controls { + display: none; + position: fixed; + width: 110px; + height: 110px; + z-index: 30; + right: 10px; + bottom: 10px; +} + +.reveal .controls div { + position: absolute; + opacity: 0.05; + width: 0; + height: 0; + border: 12px solid transparent; + + -moz-transform: scale(.9999); + + -webkit-transition: all 0.2s ease; + -moz-transition: all 0.2s ease; + -ms-transition: all 0.2s ease; + -o-transition: all 0.2s ease; + transition: all 0.2s ease; +} + +.reveal .controls div.enabled { + opacity: 0.7; + cursor: pointer; +} + +.reveal .controls div.enabled:active { + margin-top: 1px; +} + + .reveal .controls div.navigate-left { + top: 42px; + + border-right-width: 22px; + border-right-color: #eee; + } + .reveal .controls div.navigate-left.fragmented { + opacity: 0.3; + } + + .reveal .controls div.navigate-right { + left: 74px; + top: 42px; + + border-left-width: 22px; + border-left-color: #eee; + } + .reveal .controls div.navigate-right.fragmented { + opacity: 0.3; + } + + .reveal .controls div.navigate-up { + left: 42px; + + border-bottom-width: 22px; + border-bottom-color: #eee; + } + .reveal .controls div.navigate-up.fragmented { + opacity: 0.3; + } + + .reveal .controls div.navigate-down { + left: 42px; + top: 74px; + + border-top-width: 22px; + border-top-color: #eee; + } + .reveal .controls div.navigate-down.fragmented { + opacity: 0.3; + } + + +/********************************************* + * PROGRESS BAR + *********************************************/ + +.reveal .progress { + position: fixed; + display: none; + height: 3px; + width: 100%; + bottom: 0; + left: 0; + z-index: 10; +} + .reveal .progress:after { + content: ''; + display: 'block'; + position: absolute; + height: 20px; + width: 100%; + top: -20px; + } + .reveal .progress span { + display: block; + height: 100%; + width: 0px; + + -webkit-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985); + -moz-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985); + -ms-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985); + -o-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985); + transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985); + } + + +/********************************************* + * ROLLING LINKS + *********************************************/ + +.reveal .roll { + display: inline-block; + line-height: 1.2; + overflow: hidden; + + vertical-align: top; + + -webkit-perspective: 400px; + -moz-perspective: 400px; + -ms-perspective: 400px; + perspective: 400px; + + -webkit-perspective-origin: 50% 50%; + -moz-perspective-origin: 50% 50%; + -ms-perspective-origin: 50% 50%; + perspective-origin: 50% 50%; +} + .reveal .roll:hover { + background: none; + text-shadow: none; + } +.reveal .roll span { + display: block; + position: relative; + padding: 0 2px; + + pointer-events: none; + + -webkit-transition: all 400ms ease; + -moz-transition: all 400ms ease; + -ms-transition: all 400ms ease; + transition: all 400ms ease; + + -webkit-transform-origin: 50% 0%; + -moz-transform-origin: 50% 0%; + -ms-transform-origin: 50% 0%; + transform-origin: 50% 0%; + + -webkit-transform-style: preserve-3d; + -moz-transform-style: preserve-3d; + -ms-transform-style: preserve-3d; + transform-style: preserve-3d; + + -webkit-backface-visibility: hidden; + -moz-backface-visibility: hidden; + backface-visibility: hidden; +} + .reveal .roll:hover span { + background: rgba(0,0,0,0.5); + + -webkit-transform: translate3d( 0px, 0px, -45px ) rotateX( 90deg ); + -moz-transform: translate3d( 0px, 0px, -45px ) rotateX( 90deg ); + -ms-transform: translate3d( 0px, 0px, -45px ) rotateX( 90deg ); + transform: translate3d( 0px, 0px, -45px ) rotateX( 90deg ); + } +.reveal .roll span:after { + content: attr(data-title); + + display: block; + position: absolute; + left: 0; + top: 0; + padding: 0 2px; + + -webkit-backface-visibility: hidden; + -moz-backface-visibility: hidden; + backface-visibility: hidden; + + -webkit-transform-origin: 50% 0%; + -moz-transform-origin: 50% 0%; + -ms-transform-origin: 50% 0%; + transform-origin: 50% 0%; + + -webkit-transform: translate3d( 0px, 110%, 0px ) rotateX( -90deg ); + -moz-transform: translate3d( 0px, 110%, 0px ) rotateX( -90deg ); + -ms-transform: translate3d( 0px, 110%, 0px ) rotateX( -90deg ); + transform: translate3d( 0px, 110%, 0px ) rotateX( -90deg ); +} + + +/********************************************* + * SLIDES + *********************************************/ + +.reveal { + position: relative; + width: 100%; + height: 100%; + + -ms-touch-action: none; +} + +.reveal .slides { + position: absolute; + width: 100%; + height: 100%; + left: 50%; + top: 50%; + + overflow: visible; + z-index: 1; + text-align: center; + + -webkit-transition: -webkit-perspective .4s ease; + -moz-transition: -moz-perspective .4s ease; + -ms-transition: -ms-perspective .4s ease; + -o-transition: -o-perspective .4s ease; + transition: perspective .4s ease; + + -webkit-perspective: 600px; + -moz-perspective: 600px; + -ms-perspective: 600px; + perspective: 600px; + + -webkit-perspective-origin: 0px -100px; + -moz-perspective-origin: 0px -100px; + -ms-perspective-origin: 0px -100px; + perspective-origin: 0px -100px; +} + +.reveal .slides>section, +.reveal .slides>section>section { + display: none; + position: absolute; + width: 100%; + padding: 20px 0px; + + z-index: 10; + line-height: 1.2em; + font-weight: normal; + + -webkit-transform-style: preserve-3d; + -moz-transform-style: preserve-3d; + -ms-transform-style: preserve-3d; + transform-style: preserve-3d; + + -webkit-transition: -webkit-transform-origin 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985), + -webkit-transform 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985), + visibility 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985), + opacity 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985); + -moz-transition: -moz-transform-origin 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985), + -moz-transform 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985), + visibility 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985), + opacity 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985); + -ms-transition: -ms-transform-origin 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985), + -ms-transform 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985), + visibility 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985), + opacity 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985); + -o-transition: -o-transform-origin 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985), + -o-transform 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985), + visibility 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985), + opacity 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985); + transition: transform-origin 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985), + transform 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985), + visibility 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985), + opacity 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985); +} + +/* Global transition speed settings */ +.reveal[data-transition-speed="fast"] .slides section { + -webkit-transition-duration: 400ms; + -moz-transition-duration: 400ms; + -ms-transition-duration: 400ms; + transition-duration: 400ms; +} +.reveal[data-transition-speed="slow"] .slides section { + -webkit-transition-duration: 1200ms; + -moz-transition-duration: 1200ms; + -ms-transition-duration: 1200ms; + transition-duration: 1200ms; +} + +/* Slide-specific transition speed overrides */ +.reveal .slides section[data-transition-speed="fast"] { + -webkit-transition-duration: 400ms; + -moz-transition-duration: 400ms; + -ms-transition-duration: 400ms; + transition-duration: 400ms; +} +.reveal .slides section[data-transition-speed="slow"] { + -webkit-transition-duration: 1200ms; + -moz-transition-duration: 1200ms; + -ms-transition-duration: 1200ms; + transition-duration: 1200ms; +} + +.reveal .slides>section { + left: -50%; + top: -50%; +} + +.reveal .slides>section.stack { + padding-top: 0; + padding-bottom: 0; +} + +.reveal .slides>section.present, +.reveal .slides>section>section.present { + display: block; + z-index: 11; + opacity: 1; +} + +.reveal.center, +.reveal.center .slides, +.reveal.center .slides section { + min-height: auto !important; +} + + + +/********************************************* + * DEFAULT TRANSITION + *********************************************/ + +.reveal .slides>section[data-transition=default].past, +.reveal .slides>section.past { + display: block; + opacity: 0; + + -webkit-transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0); + -moz-transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0); + -ms-transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0); +} +.reveal .slides>section[data-transition=default].future, +.reveal .slides>section.future { + display: block; + opacity: 0; + + -webkit-transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0); + -moz-transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0); + -ms-transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0); +} + +.reveal .slides>section>section[data-transition=default].past, +.reveal .slides>section>section.past { + display: block; + opacity: 0; + + -webkit-transform: translate3d(0, -300px, 0) rotateX(70deg) translate3d(0, -300px, 0); + -moz-transform: translate3d(0, -300px, 0) rotateX(70deg) translate3d(0, -300px, 0); + -ms-transform: translate3d(0, -300px, 0) rotateX(70deg) translate3d(0, -300px, 0); + transform: translate3d(0, -300px, 0) rotateX(70deg) translate3d(0, -300px, 0); +} +.reveal .slides>section>section[data-transition=default].future, +.reveal .slides>section>section.future { + display: block; + opacity: 0; + + -webkit-transform: translate3d(0, 300px, 0) rotateX(-70deg) translate3d(0, 300px, 0); + -moz-transform: translate3d(0, 300px, 0) rotateX(-70deg) translate3d(0, 300px, 0); + -ms-transform: translate3d(0, 300px, 0) rotateX(-70deg) translate3d(0, 300px, 0); + transform: translate3d(0, 300px, 0) rotateX(-70deg) translate3d(0, 300px, 0); +} + + +/********************************************* + * CONCAVE TRANSITION + *********************************************/ + +.reveal .slides>section[data-transition=concave].past, +.reveal.concave .slides>section.past { + -webkit-transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0); + -moz-transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0); + -ms-transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0); +} +.reveal .slides>section[data-transition=concave].future, +.reveal.concave .slides>section.future { + -webkit-transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0); + -moz-transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0); + -ms-transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0); +} + +.reveal .slides>section>section[data-transition=concave].past, +.reveal.concave .slides>section>section.past { + -webkit-transform: translate3d(0, -80%, 0) rotateX(-70deg) translate3d(0, -80%, 0); + -moz-transform: translate3d(0, -80%, 0) rotateX(-70deg) translate3d(0, -80%, 0); + -ms-transform: translate3d(0, -80%, 0) rotateX(-70deg) translate3d(0, -80%, 0); + transform: translate3d(0, -80%, 0) rotateX(-70deg) translate3d(0, -80%, 0); +} +.reveal .slides>section>section[data-transition=concave].future, +.reveal.concave .slides>section>section.future { + -webkit-transform: translate3d(0, 80%, 0) rotateX(70deg) translate3d(0, 80%, 0); + -moz-transform: translate3d(0, 80%, 0) rotateX(70deg) translate3d(0, 80%, 0); + -ms-transform: translate3d(0, 80%, 0) rotateX(70deg) translate3d(0, 80%, 0); + transform: translate3d(0, 80%, 0) rotateX(70deg) translate3d(0, 80%, 0); +} + + +/********************************************* + * ZOOM TRANSITION + *********************************************/ + +.reveal .slides>section[data-transition=zoom].past, +.reveal.zoom .slides>section.past { + opacity: 0; + visibility: hidden; + + -webkit-transform: scale(16); + -moz-transform: scale(16); + -ms-transform: scale(16); + -o-transform: scale(16); + transform: scale(16); +} +.reveal .slides>section[data-transition=zoom].future, +.reveal.zoom .slides>section.future { + opacity: 0; + visibility: hidden; + + -webkit-transform: scale(0.2); + -moz-transform: scale(0.2); + -ms-transform: scale(0.2); + -o-transform: scale(0.2); + transform: scale(0.2); +} + +.reveal .slides>section>section[data-transition=zoom].past, +.reveal.zoom .slides>section>section.past { + -webkit-transform: translate(0, -150%); + -moz-transform: translate(0, -150%); + -ms-transform: translate(0, -150%); + -o-transform: translate(0, -150%); + transform: translate(0, -150%); +} +.reveal .slides>section>section[data-transition=zoom].future, +.reveal.zoom .slides>section>section.future { + -webkit-transform: translate(0, 150%); + -moz-transform: translate(0, 150%); + -ms-transform: translate(0, 150%); + -o-transform: translate(0, 150%); + transform: translate(0, 150%); +} + + +/********************************************* + * LINEAR TRANSITION + *********************************************/ + +.reveal.linear section { + -webkit-backface-visibility: hidden; + -moz-backface-visibility: hidden; + -ms-backface-visibility: hidden; + backface-visibility: hidden; +} + +.reveal .slides>section[data-transition=linear].past, +.reveal.linear .slides>section.past { + -webkit-transform: translate(-150%, 0); + -moz-transform: translate(-150%, 0); + -ms-transform: translate(-150%, 0); + -o-transform: translate(-150%, 0); + transform: translate(-150%, 0); +} +.reveal .slides>section[data-transition=linear].future, +.reveal.linear .slides>section.future { + -webkit-transform: translate(150%, 0); + -moz-transform: translate(150%, 0); + -ms-transform: translate(150%, 0); + -o-transform: translate(150%, 0); + transform: translate(150%, 0); +} + +.reveal .slides>section>section[data-transition=linear].past, +.reveal.linear .slides>section>section.past { + -webkit-transform: translate(0, -150%); + -moz-transform: translate(0, -150%); + -ms-transform: translate(0, -150%); + -o-transform: translate(0, -150%); + transform: translate(0, -150%); +} +.reveal .slides>section>section[data-transition=linear].future, +.reveal.linear .slides>section>section.future { + -webkit-transform: translate(0, 150%); + -moz-transform: translate(0, 150%); + -ms-transform: translate(0, 150%); + -o-transform: translate(0, 150%); + transform: translate(0, 150%); +} + + +/********************************************* + * CUBE TRANSITION + *********************************************/ + +.reveal.cube .slides { + -webkit-perspective: 1300px; + -moz-perspective: 1300px; + -ms-perspective: 1300px; + perspective: 1300px; +} + +.reveal.cube .slides section { + padding: 30px; + min-height: 700px; + + -webkit-backface-visibility: hidden; + -moz-backface-visibility: hidden; + -ms-backface-visibility: hidden; + backface-visibility: hidden; + + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + .reveal.center.cube .slides section { + min-height: auto; + } + .reveal.cube .slides section:not(.stack):before { + content: ''; + position: absolute; + display: block; + width: 100%; + height: 100%; + left: 0; + top: 0; + background: rgba(0,0,0,0.1); + border-radius: 4px; + + -webkit-transform: translateZ( -20px ); + -moz-transform: translateZ( -20px ); + -ms-transform: translateZ( -20px ); + -o-transform: translateZ( -20px ); + transform: translateZ( -20px ); + } + .reveal.cube .slides section:not(.stack):after { + content: ''; + position: absolute; + display: block; + width: 90%; + height: 30px; + left: 5%; + bottom: 0; + background: none; + z-index: 1; + + border-radius: 4px; + box-shadow: 0px 95px 25px rgba(0,0,0,0.2); + + -webkit-transform: translateZ(-90px) rotateX( 65deg ); + -moz-transform: translateZ(-90px) rotateX( 65deg ); + -ms-transform: translateZ(-90px) rotateX( 65deg ); + -o-transform: translateZ(-90px) rotateX( 65deg ); + transform: translateZ(-90px) rotateX( 65deg ); + } + +.reveal.cube .slides>section.stack { + padding: 0; + background: none; +} + +.reveal.cube .slides>section.past { + -webkit-transform-origin: 100% 0%; + -moz-transform-origin: 100% 0%; + -ms-transform-origin: 100% 0%; + transform-origin: 100% 0%; + + -webkit-transform: translate3d(-100%, 0, 0) rotateY(-90deg); + -moz-transform: translate3d(-100%, 0, 0) rotateY(-90deg); + -ms-transform: translate3d(-100%, 0, 0) rotateY(-90deg); + transform: translate3d(-100%, 0, 0) rotateY(-90deg); +} + +.reveal.cube .slides>section.future { + -webkit-transform-origin: 0% 0%; + -moz-transform-origin: 0% 0%; + -ms-transform-origin: 0% 0%; + transform-origin: 0% 0%; + + -webkit-transform: translate3d(100%, 0, 0) rotateY(90deg); + -moz-transform: translate3d(100%, 0, 0) rotateY(90deg); + -ms-transform: translate3d(100%, 0, 0) rotateY(90deg); + transform: translate3d(100%, 0, 0) rotateY(90deg); +} + +.reveal.cube .slides>section>section.past { + -webkit-transform-origin: 0% 100%; + -moz-transform-origin: 0% 100%; + -ms-transform-origin: 0% 100%; + transform-origin: 0% 100%; + + -webkit-transform: translate3d(0, -100%, 0) rotateX(90deg); + -moz-transform: translate3d(0, -100%, 0) rotateX(90deg); + -ms-transform: translate3d(0, -100%, 0) rotateX(90deg); + transform: translate3d(0, -100%, 0) rotateX(90deg); +} + +.reveal.cube .slides>section>section.future { + -webkit-transform-origin: 0% 0%; + -moz-transform-origin: 0% 0%; + -ms-transform-origin: 0% 0%; + transform-origin: 0% 0%; + + -webkit-transform: translate3d(0, 100%, 0) rotateX(-90deg); + -moz-transform: translate3d(0, 100%, 0) rotateX(-90deg); + -ms-transform: translate3d(0, 100%, 0) rotateX(-90deg); + transform: translate3d(0, 100%, 0) rotateX(-90deg); +} + + +/********************************************* + * PAGE TRANSITION + *********************************************/ + +.reveal.page .slides { + -webkit-perspective-origin: 0% 50%; + -moz-perspective-origin: 0% 50%; + -ms-perspective-origin: 0% 50%; + perspective-origin: 0% 50%; + + -webkit-perspective: 3000px; + -moz-perspective: 3000px; + -ms-perspective: 3000px; + perspective: 3000px; +} + +.reveal.page .slides section { + padding: 30px; + min-height: 700px; + + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + .reveal.page .slides section.past { + z-index: 12; + } + .reveal.page .slides section:not(.stack):before { + content: ''; + position: absolute; + display: block; + width: 100%; + height: 100%; + left: 0; + top: 0; + background: rgba(0,0,0,0.1); + + -webkit-transform: translateZ( -20px ); + -moz-transform: translateZ( -20px ); + -ms-transform: translateZ( -20px ); + -o-transform: translateZ( -20px ); + transform: translateZ( -20px ); + } + .reveal.page .slides section:not(.stack):after { + content: ''; + position: absolute; + display: block; + width: 90%; + height: 30px; + left: 5%; + bottom: 0; + background: none; + z-index: 1; + + border-radius: 4px; + box-shadow: 0px 95px 25px rgba(0,0,0,0.2); + + -webkit-transform: translateZ(-90px) rotateX( 65deg ); + } + +.reveal.page .slides>section.stack { + padding: 0; + background: none; +} + +.reveal.page .slides>section.past { + -webkit-transform-origin: 0% 0%; + -moz-transform-origin: 0% 0%; + -ms-transform-origin: 0% 0%; + transform-origin: 0% 0%; + + -webkit-transform: translate3d(-40%, 0, 0) rotateY(-80deg); + -moz-transform: translate3d(-40%, 0, 0) rotateY(-80deg); + -ms-transform: translate3d(-40%, 0, 0) rotateY(-80deg); + transform: translate3d(-40%, 0, 0) rotateY(-80deg); +} + +.reveal.page .slides>section.future { + -webkit-transform-origin: 100% 0%; + -moz-transform-origin: 100% 0%; + -ms-transform-origin: 100% 0%; + transform-origin: 100% 0%; + + -webkit-transform: translate3d(0, 0, 0); + -moz-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); +} + +.reveal.page .slides>section>section.past { + -webkit-transform-origin: 0% 0%; + -moz-transform-origin: 0% 0%; + -ms-transform-origin: 0% 0%; + transform-origin: 0% 0%; + + -webkit-transform: translate3d(0, -40%, 0) rotateX(80deg); + -moz-transform: translate3d(0, -40%, 0) rotateX(80deg); + -ms-transform: translate3d(0, -40%, 0) rotateX(80deg); + transform: translate3d(0, -40%, 0) rotateX(80deg); +} + +.reveal.page .slides>section>section.future { + -webkit-transform-origin: 0% 100%; + -moz-transform-origin: 0% 100%; + -ms-transform-origin: 0% 100%; + transform-origin: 0% 100%; + + -webkit-transform: translate3d(0, 0, 0); + -moz-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); +} + + +/********************************************* + * FADE TRANSITION + *********************************************/ + +.reveal .slides section[data-transition=fade], +.reveal.fade .slides section, +.reveal.fade .slides>section>section { + -webkit-transform: none; + -moz-transform: none; + -ms-transform: none; + -o-transform: none; + transform: none; + + -webkit-transition: opacity 0.5s; + -moz-transition: opacity 0.5s; + -ms-transition: opacity 0.5s; + -o-transition: opacity 0.5s; + transition: opacity 0.5s; +} + + +.reveal.fade.overview .slides section, +.reveal.fade.overview .slides>section>section, +.reveal.fade.exit-overview .slides section, +.reveal.fade.exit-overview .slides>section>section { + -webkit-transition: none; + -moz-transition: none; + -ms-transition: none; + -o-transition: none; + transition: none; +} + + +/********************************************* + * NO TRANSITION + *********************************************/ + +.reveal .slides section[data-transition=none], +.reveal.none .slides section { + -webkit-transform: none; + -moz-transform: none; + -ms-transform: none; + -o-transform: none; + transform: none; + + -webkit-transition: none; + -moz-transition: none; + -ms-transition: none; + -o-transition: none; + transition: none; +} + + +/********************************************* + * OVERVIEW + *********************************************/ + +.reveal.overview .slides { + -webkit-perspective-origin: 0% 0%; + -moz-perspective-origin: 0% 0%; + -ms-perspective-origin: 0% 0%; + perspective-origin: 0% 0%; + + -webkit-perspective: 700px; + -moz-perspective: 700px; + -ms-perspective: 700px; + perspective: 700px; +} + +.reveal.overview .slides section { + height: 600px; + overflow: hidden; + opacity: 1!important; + visibility: visible!important; + cursor: pointer; + background: rgba(0,0,0,0.1); +} +.reveal.overview .slides section .fragment { + opacity: 1; +} +.reveal.overview .slides section:after, +.reveal.overview .slides section:before { + display: none !important; +} +.reveal.overview .slides section>section { + opacity: 1; + cursor: pointer; +} + .reveal.overview .slides section:hover { + background: rgba(0,0,0,0.3); + } + .reveal.overview .slides section.present { + background: rgba(0,0,0,0.3); + } +.reveal.overview .slides>section.stack { + padding: 0; + background: none; + overflow: visible; +} + + +/********************************************* + * PAUSED MODE + *********************************************/ + +.reveal .pause-overlay { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: black; + visibility: hidden; + opacity: 0; + z-index: 100; + + -webkit-transition: all 1s ease; + -moz-transition: all 1s ease; + -ms-transition: all 1s ease; + -o-transition: all 1s ease; + transition: all 1s ease; +} +.reveal.paused .pause-overlay { + visibility: visible; + opacity: 1; +} + + +/********************************************* + * FALLBACK + *********************************************/ + +.no-transforms { + overflow-y: auto; +} + +.no-transforms .reveal .slides { + position: relative; + width: 80%; + height: auto !important; + top: 0; + left: 50%; + margin: 0; + text-align: center; +} + +.no-transforms .reveal .controls, +.no-transforms .reveal .progress { + display: none !important; +} + +.no-transforms .reveal .slides section { + display: block !important; + opacity: 1 !important; + position: relative !important; + height: auto; + min-height: auto; + top: 0; + left: -50%; + margin: 70px 0; + + -webkit-transform: none; + -moz-transform: none; + -ms-transform: none; + -o-transform: none; + transform: none; +} + +.no-transforms .reveal .slides section section { + left: 0; +} + +.reveal .no-transition, +.reveal .no-transition * { + -webkit-transition: none !important; + -moz-transition: none !important; + -ms-transition: none !important; + -o-transition: none !important; + transition: none !important; +} + + +/********************************************* + * BACKGROUND STATES [DEPRECATED] + *********************************************/ + +.reveal .state-background { + position: absolute; + width: 100%; + height: 100%; + background: rgba( 0, 0, 0, 0 ); + + -webkit-transition: background 800ms ease; + -moz-transition: background 800ms ease; + -ms-transition: background 800ms ease; + -o-transition: background 800ms ease; + transition: background 800ms ease; +} +.alert .reveal .state-background { + background: rgba( 200, 50, 30, 0.6 ); +} +.soothe .reveal .state-background { + background: rgba( 50, 200, 90, 0.4 ); +} +.blackout .reveal .state-background { + background: rgba( 0, 0, 0, 0.6 ); +} +.whiteout .reveal .state-background { + background: rgba( 255, 255, 255, 0.6 ); +} +.cobalt .reveal .state-background { + background: rgba( 22, 152, 213, 0.6 ); +} +.mint .reveal .state-background { + background: rgba( 22, 213, 75, 0.6 ); +} +.submerge .reveal .state-background { + background: rgba( 12, 25, 77, 0.6); +} +.lila .reveal .state-background { + background: rgba( 180, 50, 140, 0.6 ); +} +.sunset .reveal .state-background { + background: rgba( 255, 122, 0, 0.6 ); +} + + +/********************************************* + * PER-SLIDE BACKGROUNDS + *********************************************/ + +.reveal>.backgrounds { + position: absolute; + width: 100%; + height: 100%; +} + .reveal .slide-background { + position: absolute; + width: 100%; + height: 100%; + opacity: 0; + visibility: hidden; + + background-color: rgba( 0, 0, 0, 0 ); + background-position: 50% 50%; + background-repeat: no-repeat; + background-size: cover; + + -webkit-transition: all 600ms cubic-bezier(0.260, 0.860, 0.440, 0.985); + -moz-transition: all 600ms cubic-bezier(0.260, 0.860, 0.440, 0.985); + -ms-transition: all 600ms cubic-bezier(0.260, 0.860, 0.440, 0.985); + -o-transition: all 600ms cubic-bezier(0.260, 0.860, 0.440, 0.985); + transition: all 600ms cubic-bezier(0.260, 0.860, 0.440, 0.985); + } + .reveal .slide-background.present { + opacity: 1; + visibility: visible; + } + + .print-pdf .reveal .slide-background { + opacity: 1 !important; + visibility: visible !important; + } + +/* Linear sliding transition style */ +.reveal[data-background-transition=slide]>.backgrounds .slide-background, +.reveal>.backgrounds .slide-background[data-background-transition=slide] { + opacity: 1; + + -webkit-backface-visibility: hidden; + -moz-backface-visibility: hidden; + -ms-backface-visibility: hidden; + backface-visibility: hidden; + + -webkit-transition-duration: 800ms; + -moz-transition-duration: 800ms; + -ms-transition-duration: 800ms; + -o-transition-duration: 800ms; + transition-duration: 800ms; +} + .reveal[data-background-transition=slide]>.backgrounds .slide-background.past, + .reveal>.backgrounds .slide-background.past[data-background-transition=slide] { + -webkit-transform: translate(-100%, 0); + -moz-transform: translate(-100%, 0); + -ms-transform: translate(-100%, 0); + -o-transform: translate(-100%, 0); + transform: translate(-100%, 0); + } + .reveal[data-background-transition=slide]>.backgrounds .slide-background.future, + .reveal>.backgrounds .slide-background.future[data-background-transition=slide] { + -webkit-transform: translate(100%, 0); + -moz-transform: translate(100%, 0); + -ms-transform: translate(100%, 0); + -o-transform: translate(100%, 0); + transform: translate(100%, 0); + } + + .reveal[data-background-transition=slide]>.backgrounds .slide-background>.slide-background.past, + .reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=slide] { + -webkit-transform: translate(0, -100%); + -moz-transform: translate(0, -100%); + -ms-transform: translate(0, -100%); + -o-transform: translate(0, -100%); + transform: translate(0, -100%); + } + .reveal[data-background-transition=slide]>.backgrounds .slide-background>.slide-background.future, + .reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=slide] { + -webkit-transform: translate(0, 100%); + -moz-transform: translate(0, 100%); + -ms-transform: translate(0, 100%); + -o-transform: translate(0, 100%); + transform: translate(0, 100%); + } + + +/* Global transition speed settings */ +.reveal[data-transition-speed="fast"]>.backgrounds .slide-background { + -webkit-transition-duration: 400ms; + -moz-transition-duration: 400ms; + -ms-transition-duration: 400ms; + transition-duration: 400ms; +} +.reveal[data-transition-speed="slow"]>.backgrounds .slide-background { + -webkit-transition-duration: 1200ms; + -moz-transition-duration: 1200ms; + -ms-transition-duration: 1200ms; + transition-duration: 1200ms; +} + + +/********************************************* + * RTL SUPPORT + *********************************************/ + +.reveal.rtl .slides, +.reveal.rtl .slides h1, +.reveal.rtl .slides h2, +.reveal.rtl .slides h3, +.reveal.rtl .slides h4, +.reveal.rtl .slides h5, +.reveal.rtl .slides h6 { + direction: rtl; + font-family: sans-serif; +} + +.reveal.rtl pre, +.reveal.rtl code { + direction: ltr; +} + +.reveal.rtl ol, +.reveal.rtl ul { + text-align: right; +} + +.reveal.rtl .progress span { + float: right +} + + +/********************************************* + * LINK PREVIEW OVERLAY + *********************************************/ + + .reveal .preview-link-overlay { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 1000; + background: rgba( 0, 0, 0, 0.9 ); + opacity: 0; + visibility: hidden; + + -webkit-transition: all 0.3s ease; + -moz-transition: all 0.3s ease; + -ms-transition: all 0.3s ease; + transition: all 0.3s ease; + } + .reveal .preview-link-overlay.visible { + opacity: 1; + visibility: visible; + } + + .reveal .preview-link-overlay .spinner { + position: absolute; + display: block; + top: 50%; + left: 50%; + width: 32px; + height: 32px; + margin: -16px 0 0 -16px; + z-index: 10; + background-image: url(data:image/gif;base64,R0lGODlhIAAgAPMAAJmZmf%2F%2F%2F6%2Bvr8nJybW1tcDAwOjo6Nvb26ioqKOjo7Ozs%2FLy8vz8%2FAAAAAAAAAAAACH%2FC05FVFNDQVBFMi4wAwEAAAAh%2FhpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh%2BQQJCgAAACwAAAAAIAAgAAAE5xDISWlhperN52JLhSSdRgwVo1ICQZRUsiwHpTJT4iowNS8vyW2icCF6k8HMMBkCEDskxTBDAZwuAkkqIfxIQyhBQBFvAQSDITM5VDW6XNE4KagNh6Bgwe60smQUB3d4Rz1ZBApnFASDd0hihh12BkE9kjAJVlycXIg7CQIFA6SlnJ87paqbSKiKoqusnbMdmDC2tXQlkUhziYtyWTxIfy6BE8WJt5YJvpJivxNaGmLHT0VnOgSYf0dZXS7APdpB309RnHOG5gDqXGLDaC457D1zZ%2FV%2FnmOM82XiHRLYKhKP1oZmADdEAAAh%2BQQJCgAAACwAAAAAIAAgAAAE6hDISWlZpOrNp1lGNRSdRpDUolIGw5RUYhhHukqFu8DsrEyqnWThGvAmhVlteBvojpTDDBUEIFwMFBRAmBkSgOrBFZogCASwBDEY%2FCZSg7GSE0gSCjQBMVG023xWBhklAnoEdhQEfyNqMIcKjhRsjEdnezB%2BA4k8gTwJhFuiW4dokXiloUepBAp5qaKpp6%2BHo7aWW54wl7obvEe0kRuoplCGepwSx2jJvqHEmGt6whJpGpfJCHmOoNHKaHx61WiSR92E4lbFoq%2BB6QDtuetcaBPnW6%2BO7wDHpIiK9SaVK5GgV543tzjgGcghAgAh%2BQQJCgAAACwAAAAAIAAgAAAE7hDISSkxpOrN5zFHNWRdhSiVoVLHspRUMoyUakyEe8PTPCATW9A14E0UvuAKMNAZKYUZCiBMuBakSQKG8G2FzUWox2AUtAQFcBKlVQoLgQReZhQlCIJesQXI5B0CBnUMOxMCenoCfTCEWBsJColTMANldx15BGs8B5wlCZ9Po6OJkwmRpnqkqnuSrayqfKmqpLajoiW5HJq7FL1Gr2mMMcKUMIiJgIemy7xZtJsTmsM4xHiKv5KMCXqfyUCJEonXPN2rAOIAmsfB3uPoAK%2B%2BG%2Bw48edZPK%2BM6hLJpQg484enXIdQFSS1u6UhksENEQAAIfkECQoAAAAsAAAAACAAIAAABOcQyEmpGKLqzWcZRVUQnZYg1aBSh2GUVEIQ2aQOE%2BG%2BcD4ntpWkZQj1JIiZIogDFFyHI0UxQwFugMSOFIPJftfVAEoZLBbcLEFhlQiqGp1Vd140AUklUN3eCA51C1EWMzMCezCBBmkxVIVHBWd3HHl9JQOIJSdSnJ0TDKChCwUJjoWMPaGqDKannasMo6WnM562R5YluZRwur0wpgqZE7NKUm%2BFNRPIhjBJxKZteWuIBMN4zRMIVIhffcgojwCF117i4nlLnY5ztRLsnOk%2BaV%2BoJY7V7m76PdkS4trKcdg0Zc0tTcKkRAAAIfkECQoAAAAsAAAAACAAIAAABO4QyEkpKqjqzScpRaVkXZWQEximw1BSCUEIlDohrft6cpKCk5xid5MNJTaAIkekKGQkWyKHkvhKsR7ARmitkAYDYRIbUQRQjWBwJRzChi9CRlBcY1UN4g0%2FVNB0AlcvcAYHRyZPdEQFYV8ccwR5HWxEJ02YmRMLnJ1xCYp0Y5idpQuhopmmC2KgojKasUQDk5BNAwwMOh2RtRq5uQuPZKGIJQIGwAwGf6I0JXMpC8C7kXWDBINFMxS4DKMAWVWAGYsAdNqW5uaRxkSKJOZKaU3tPOBZ4DuK2LATgJhkPJMgTwKCdFjyPHEnKxFCDhEAACH5BAkKAAAALAAAAAAgACAAAATzEMhJaVKp6s2nIkolIJ2WkBShpkVRWqqQrhLSEu9MZJKK9y1ZrqYK9WiClmvoUaF8gIQSNeF1Er4MNFn4SRSDARWroAIETg1iVwuHjYB1kYc1mwruwXKC9gmsJXliGxc%2BXiUCby9ydh1sOSdMkpMTBpaXBzsfhoc5l58Gm5yToAaZhaOUqjkDgCWNHAULCwOLaTmzswadEqggQwgHuQsHIoZCHQMMQgQGubVEcxOPFAcMDAYUA85eWARmfSRQCdcMe0zeP1AAygwLlJtPNAAL19DARdPzBOWSm1brJBi45soRAWQAAkrQIykShQ9wVhHCwCQCACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiRMDjI0Fd30%2FiI2UA5GSS5UDj2l6NoqgOgN4gksEBgYFf0FDqKgHnyZ9OX8HrgYHdHpcHQULXAS2qKpENRg7eAMLC7kTBaixUYFkKAzWAAnLC7FLVxLWDBLKCwaKTULgEwbLA4hJtOkSBNqITT3xEgfLpBtzE%2FjiuL04RGEBgwWhShRgQExHBAAh%2BQQJCgAAACwAAAAAIAAgAAAE7xDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfZiCqGk5dTESJeaOAlClzsJsqwiJwiqnFrb2nS9kmIcgEsjQydLiIlHehhpejaIjzh9eomSjZR%2BipslWIRLAgMDOR2DOqKogTB9pCUJBagDBXR6XB0EBkIIsaRsGGMMAxoDBgYHTKJiUYEGDAzHC9EACcUGkIgFzgwZ0QsSBcXHiQvOwgDdEwfFs0sDzt4S6BK4xYjkDOzn0unFeBzOBijIm1Dgmg5YFQwsCMjp1oJ8LyIAACH5BAkKAAAALAAAAAAgACAAAATwEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GGl6NoiPOH16iZKNlH6KmyWFOggHhEEvAwwMA0N9GBsEC6amhnVcEwavDAazGwIDaH1ipaYLBUTCGgQDA8NdHz0FpqgTBwsLqAbWAAnIA4FWKdMLGdYGEgraigbT0OITBcg5QwPT4xLrROZL6AuQAPUS7bxLpoWidY0JtxLHKhwwMJBTHgPKdEQAACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GAULDJCRiXo1CpGXDJOUjY%2BYip9DhToJA4RBLwMLCwVDfRgbBAaqqoZ1XBMHswsHtxtFaH1iqaoGNgAIxRpbFAgfPQSqpbgGBqUD1wBXeCYp1AYZ19JJOYgH1KwA4UBvQwXUBxPqVD9L3sbp2BNk2xvvFPJd%2BMFCN6HAAIKgNggY0KtEBAAh%2BQQJCgAAACwAAAAAIAAgAAAE6BDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfYIDMaAFdTESJeaEDAIMxYFqrOUaNW4E4ObYcCXaiBVEgULe0NJaxxtYksjh2NLkZISgDgJhHthkpU4mW6blRiYmZOlh4JWkDqILwUGBnE6TYEbCgevr0N1gH4At7gHiRpFaLNrrq8HNgAJA70AWxQIH1%2BvsYMDAzZQPC9VCNkDWUhGkuE5PxJNwiUK4UfLzOlD4WvzAHaoG9nxPi5d%2BjYUqfAhhykOFwJWiAAAIfkECQoAAAAsAAAAACAAIAAABPAQyElpUqnqzaciSoVkXVUMFaFSwlpOCcMYlErAavhOMnNLNo8KsZsMZItJEIDIFSkLGQoQTNhIsFehRww2CQLKF0tYGKYSg%2BygsZIuNqJksKgbfgIGepNo2cIUB3V1B3IvNiBYNQaDSTtfhhx0CwVPI0UJe0%2Bbm4g5VgcGoqOcnjmjqDSdnhgEoamcsZuXO1aWQy8KAwOAuTYYGwi7w5h%2BKr0SJ8MFihpNbx%2B4Erq7BYBuzsdiH1jCAzoSfl0rVirNbRXlBBlLX%2BBP0XJLAPGzTkAuAOqb0WT5AH7OcdCm5B8TgRwSRKIHQtaLCwg1RAAAOwAAAAAAAAAAAA%3D%3D); + + visibility: visible; + opacity: 0.6; + + -webkit-transition: all 0.3s ease; + -moz-transition: all 0.3s ease; + -ms-transition: all 0.3s ease; + transition: all 0.3s ease; + } + + .reveal .preview-link-overlay header { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 40px; + z-index: 2; + border-bottom: 1px solid #222; + } + .reveal .preview-link-overlay header a { + display: inline-block; + width: 40px; + height: 40px; + padding: 0 10px; + float: right; + opacity: 0.6; + + box-sizing: border-box; + } + .reveal .preview-link-overlay header a:hover { + opacity: 1; + } + .reveal .preview-link-overlay header a .icon { + display: inline-block; + width: 20px; + height: 20px; + + background-position: 50% 50%; + background-size: 100%; + background-repeat: no-repeat; + } + .reveal .preview-link-overlay header a.close .icon { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABkklEQVRYR8WX4VHDMAxG6wnoJrABZQPYBCaBTWAD2g1gE5gg6OOsXuxIlr40d81dfrSJ9V4c2VLK7spHuTJ/5wpM07QXuXc5X0opX2tEJcadjHuV80li/FgxTIEK/5QBCICBD6xEhSMGHgQPgBgLiYVAB1dpSqKDawxTohFw4JSEA3clzgIBPCURwE2JucBR7rhPJJv5OpJwDX+SfDjgx1wACQeJG1aChP9K/IMmdZ8DtESV1WyP3Bt4MwM6sj4NMxMYiqUWHQu4KYA/SYkIjOsm3BXYWMKFDwU2khjCQ4ELJUJ4SmClRArOCmSXGuKma0fYD5CbzHxFpCSGAhfAVSSUGDUk2BWZaff2g6GE15BsBQ9nwmpIGDiyHQddwNTMKkbZaf9fajXQca1EX44puJZUsnY0ObGmITE3GVLCbEhQUjGVt146j6oasWN+49Vph2w1pZ5EansNZqKBm1txbU57iRRcZ86RWMDdWtBJUHBHwoQPi1GV+JCbntmvok7iTX4/Up9mgyTc/FJYDTcndgH/AA5A/CHsyEkVAAAAAElFTkSuQmCC); + } + .reveal .preview-link-overlay header a.external .icon { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAcElEQVRYR+2WSQoAIQwEzf8f7XiOMkUQxUPlGkM3hVmiQfQR9GYnH1SsAQlI4DiBqkCMoNb9y2e90IAEJPAcgdznU9+engMaeJ7Azh5Y1U67gAho4DqBqmB1buAf0MB1AlVBek83ZPkmJMGc1wAR+AAqod/B97TRpQAAAABJRU5ErkJggg==); + } + + .reveal .preview-link-overlay .viewport { + position: absolute; + top: 40px; + right: 0; + bottom: 0; + left: 0; + } + + .reveal .preview-link-overlay .viewport iframe { + width: 100%; + height: 100%; + max-width: 100%; + max-height: 100%; + border: 0; + + opacity: 0; + visibility: hidden; + + -webkit-transition: all 0.3s ease; + -moz-transition: all 0.3s ease; + -ms-transition: all 0.3s ease; + transition: all 0.3s ease; + } + + .reveal .preview-link-overlay.loaded .viewport iframe { + opacity: 1; + visibility: visible; + } + + .reveal .preview-link-overlay.loaded .spinner { + opacity: 0; + visibility: hidden; + + -webkit-transform: scale(0.2); + -moz-transform: scale(0.2); + -ms-transform: scale(0.2); + transform: scale(0.2); + } + + +/********************************************* + * SPEAKER NOTES + *********************************************/ + +.reveal aside.notes { + display: none; +} + + +/********************************************* + * ZOOM PLUGIN + *********************************************/ + +.zoomed .reveal *, +.zoomed .reveal *:before, +.zoomed .reveal *:after { + -webkit-transform: none !important; + -moz-transform: none !important; + -ms-transform: none !important; + transform: none !important; + + -webkit-backface-visibility: visible !important; + -moz-backface-visibility: visible !important; + -ms-backface-visibility: visible !important; + backface-visibility: visible !important; +} + +.zoomed .reveal .progress, +.zoomed .reveal .controls { + opacity: 0; +} + +.zoomed .reveal .roll span { + background: none; +} + +.zoomed .reveal .roll span:after { + visibility: hidden; +} + + diff --git a/css/reveal.min.css b/css/reveal.min.css new file mode 100644 index 0000000..874eda9 --- /dev/null +++ b/css/reveal.min.css @@ -0,0 +1,7 @@ +@charset "UTF-8";/*! + * reveal.js + * http://lab.hakim.se/reveal-js + * MIT licensed + * + * Copyright (C) 2013 Hakim El Hattab, http://hakim.se + */ html,body,.reveal div,.reveal span,.reveal applet,.reveal object,.reveal iframe,.reveal h1,.reveal h2,.reveal h3,.reveal h4,.reveal h5,.reveal h6,.reveal p,.reveal blockquote,.reveal pre,.reveal a,.reveal abbr,.reveal acronym,.reveal address,.reveal big,.reveal cite,.reveal code,.reveal del,.reveal dfn,.reveal em,.reveal img,.reveal ins,.reveal kbd,.reveal q,.reveal s,.reveal samp,.reveal small,.reveal strike,.reveal strong,.reveal sub,.reveal sup,.reveal tt,.reveal var,.reveal b,.reveal u,.reveal i,.reveal center,.reveal dl,.reveal dt,.reveal dd,.reveal ol,.reveal ul,.reveal li,.reveal fieldset,.reveal form,.reveal label,.reveal legend,.reveal table,.reveal caption,.reveal tbody,.reveal tfoot,.reveal thead,.reveal tr,.reveal th,.reveal td,.reveal article,.reveal aside,.reveal canvas,.reveal details,.reveal embed,.reveal figure,.reveal figcaption,.reveal footer,.reveal header,.reveal hgroup,.reveal menu,.reveal nav,.reveal output,.reveal ruby,.reveal section,.reveal summary,.reveal time,.reveal mark,.reveal audio,video{margin:0;padding:0;border:0;font-size:100%;font:inherit;vertical-align:baseline}.reveal article,.reveal aside,.reveal details,.reveal figcaption,.reveal figure,.reveal footer,.reveal header,.reveal hgroup,.reveal menu,.reveal nav,.reveal section{display:block}html,body{width:100%;height:100%;overflow:hidden}body{position:relative;line-height:1}::selection{background:#FF5E99;color:#fff;text-shadow:none}.reveal h1,.reveal h2,.reveal h3,.reveal h4,.reveal h5,.reveal h6{-webkit-hyphens:auto;-moz-hyphens:auto;hyphens:auto;word-wrap:break-word;line-height:1}.reveal h1{font-size:3.77em}.reveal h2{font-size:2.11em}.reveal h3{font-size:1.55em}.reveal h4{font-size:1em}.reveal .slides section .fragment{opacity:0;-webkit-transition:all .2s ease;-moz-transition:all .2s ease;-ms-transition:all .2s ease;-o-transition:all .2s ease;transition:all .2s ease}.reveal .slides section .fragment.visible{opacity:1}.reveal .slides section .fragment.grow{opacity:1}.reveal .slides section .fragment.grow.visible{-webkit-transform:scale(1.3);-moz-transform:scale(1.3);-ms-transform:scale(1.3);-o-transform:scale(1.3);transform:scale(1.3)}.reveal .slides section .fragment.shrink{opacity:1}.reveal .slides section .fragment.shrink.visible{-webkit-transform:scale(0.7);-moz-transform:scale(0.7);-ms-transform:scale(0.7);-o-transform:scale(0.7);transform:scale(0.7)}.reveal .slides section .fragment.zoom-in{opacity:0;-webkit-transform:scale(0.1);-moz-transform:scale(0.1);-ms-transform:scale(0.1);-o-transform:scale(0.1);transform:scale(0.1)}.reveal .slides section .fragment.zoom-in.visible{opacity:1;-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}.reveal .slides section .fragment.roll-in{opacity:0;-webkit-transform:rotateX(90deg);-moz-transform:rotateX(90deg);-ms-transform:rotateX(90deg);-o-transform:rotateX(90deg);transform:rotateX(90deg)}.reveal .slides section .fragment.roll-in.visible{opacity:1;-webkit-transform:rotateX(0);-moz-transform:rotateX(0);-ms-transform:rotateX(0);-o-transform:rotateX(0);transform:rotateX(0)}.reveal .slides section .fragment.fade-out{opacity:1}.reveal .slides section .fragment.fade-out.visible{opacity:0}.reveal .slides section .fragment.semi-fade-out{opacity:1}.reveal .slides section .fragment.semi-fade-out.visible{opacity:.5}.reveal .slides section .fragment.highlight-red,.reveal .slides section .fragment.highlight-green,.reveal .slides section .fragment.highlight-blue{opacity:1}.reveal .slides section .fragment.highlight-red.visible{color:#ff2c2d}.reveal .slides section .fragment.highlight-green.visible{color:#17ff2e}.reveal .slides section .fragment.highlight-blue.visible{color:#1b91ff}.reveal:after{content:'';font-style:italic}.reveal img,.reveal video,.reveal iframe{max-width:95%;max-height:95%}.reveal a{position:relative}.reveal strong,.reveal b{font-weight:700}.reveal em,.reveal i{font-style:italic}.reveal ol,.reveal ul{display:inline-block;text-align:left;margin:0 0 0 1em}.reveal ol{list-style-type:decimal}.reveal ul{list-style-type:disc}.reveal ul ul{list-style-type:square}.reveal ul ul ul{list-style-type:circle}.reveal ul ul,.reveal ul ol,.reveal ol ol,.reveal ol ul{display:block;margin-left:40px}.reveal p{margin-bottom:10px;line-height:1.2em}.reveal q,.reveal blockquote{quotes:none}.reveal blockquote{display:block;position:relative;width:70%;margin:5px auto;padding:5px;font-style:italic;background:rgba(255,255,255,.05);box-shadow:0 0 2px rgba(0,0,0,.2)}.reveal blockquote p:first-child,.reveal blockquote p:last-child{display:inline-block}.reveal q{font-style:italic}.reveal pre{display:block;position:relative;width:90%;margin:15px auto;text-align:left;font-size:.55em;font-family:monospace;line-height:1.2em;word-wrap:break-word;box-shadow:0 0 6px rgba(0,0,0,.3)}.reveal code{font-family:monospace}.reveal pre code{padding:5px;overflow:auto;max-height:400px;word-wrap:normal}.reveal table th,.reveal table td{text-align:left;padding-right:.3em}.reveal table th{text-shadow:#fff 1px 1px 2px}.reveal sup{vertical-align:super}.reveal sub{vertical-align:sub}.reveal small{display:inline-block;font-size:.6em;line-height:1.2em;vertical-align:top}.reveal small *{vertical-align:top}.reveal .controls{display:none;position:fixed;width:110px;height:110px;z-index:30;right:10px;bottom:10px}.reveal .controls div{position:absolute;opacity:.05;width:0;height:0;border:12px solid transparent;-moz-transform:scale(.9999);-webkit-transition:all .2s ease;-moz-transition:all .2s ease;-ms-transition:all .2s ease;-o-transition:all .2s ease;transition:all .2s ease}.reveal .controls div.enabled{opacity:.7;cursor:pointer}.reveal .controls div.enabled:active{margin-top:1px}.reveal .controls div.navigate-left{top:42px;border-right-width:22px;border-right-color:#eee}.reveal .controls div.navigate-left.fragmented{opacity:.3}.reveal .controls div.navigate-right{left:74px;top:42px;border-left-width:22px;border-left-color:#eee}.reveal .controls div.navigate-right.fragmented{opacity:.3}.reveal .controls div.navigate-up{left:42px;border-bottom-width:22px;border-bottom-color:#eee}.reveal .controls div.navigate-up.fragmented{opacity:.3}.reveal .controls div.navigate-down{left:42px;top:74px;border-top-width:22px;border-top-color:#eee}.reveal .controls div.navigate-down.fragmented{opacity:.3}.reveal .progress{position:fixed;display:none;height:3px;width:100%;bottom:0;left:0;z-index:10}.reveal .progress:after{content:'';display:'block';position:absolute;height:20px;width:100%;top:-20px}.reveal .progress span{display:block;height:100%;width:0;-webkit-transition:width 800ms cubic-bezier(0.26,.86,.44,.985);-moz-transition:width 800ms cubic-bezier(0.26,.86,.44,.985);-ms-transition:width 800ms cubic-bezier(0.26,.86,.44,.985);-o-transition:width 800ms cubic-bezier(0.26,.86,.44,.985);transition:width 800ms cubic-bezier(0.26,.86,.44,.985)}.reveal .roll{display:inline-block;line-height:1.2;overflow:hidden;vertical-align:top;-webkit-perspective:400px;-moz-perspective:400px;-ms-perspective:400px;perspective:400px;-webkit-perspective-origin:50% 50%;-moz-perspective-origin:50% 50%;-ms-perspective-origin:50% 50%;perspective-origin:50% 50%}.reveal .roll:hover{background:0;text-shadow:none}.reveal .roll span{display:block;position:relative;padding:0 2px;pointer-events:none;-webkit-transition:all 400ms ease;-moz-transition:all 400ms ease;-ms-transition:all 400ms ease;transition:all 400ms ease;-webkit-transform-origin:50% 0;-moz-transform-origin:50% 0;-ms-transform-origin:50% 0;transform-origin:50% 0;-webkit-transform-style:preserve-3d;-moz-transform-style:preserve-3d;-ms-transform-style:preserve-3d;transform-style:preserve-3d;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;backface-visibility:hidden}.reveal .roll:hover span{background:rgba(0,0,0,.5);-webkit-transform:translate3d(0px,0,-45px) rotateX(90deg);-moz-transform:translate3d(0px,0,-45px) rotateX(90deg);-ms-transform:translate3d(0px,0,-45px) rotateX(90deg);transform:translate3d(0px,0,-45px) rotateX(90deg)}.reveal .roll span:after{content:attr(data-title);display:block;position:absolute;left:0;top:0;padding:0 2px;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform-origin:50% 0;-moz-transform-origin:50% 0;-ms-transform-origin:50% 0;transform-origin:50% 0;-webkit-transform:translate3d(0px,110%,0) rotateX(-90deg);-moz-transform:translate3d(0px,110%,0) rotateX(-90deg);-ms-transform:translate3d(0px,110%,0) rotateX(-90deg);transform:translate3d(0px,110%,0) rotateX(-90deg)}.reveal{position:relative;width:100%;height:100%;-ms-touch-action:none}.reveal .slides{position:absolute;width:100%;height:100%;left:50%;top:50%;overflow:visible;z-index:1;text-align:center;-webkit-transition:-webkit-perspective .4s ease;-moz-transition:-moz-perspective .4s ease;-ms-transition:-ms-perspective .4s ease;-o-transition:-o-perspective .4s ease;transition:perspective .4s ease;-webkit-perspective:600px;-moz-perspective:600px;-ms-perspective:600px;perspective:600px;-webkit-perspective-origin:0 -100px;-moz-perspective-origin:0 -100px;-ms-perspective-origin:0 -100px;perspective-origin:0 -100px}.reveal .slides>section,.reveal .slides>section>section{display:none;position:absolute;width:100%;padding:20px 0;z-index:10;line-height:1.2em;font-weight:400;-webkit-transform-style:preserve-3d;-moz-transform-style:preserve-3d;-ms-transform-style:preserve-3d;transform-style:preserve-3d;-webkit-transition:-webkit-transform-origin 800ms cubic-bezier(0.26,.86,.44,.985),-webkit-transform 800ms cubic-bezier(0.26,.86,.44,.985),visibility 800ms cubic-bezier(0.26,.86,.44,.985),opacity 800ms cubic-bezier(0.26,.86,.44,.985);-moz-transition:-moz-transform-origin 800ms cubic-bezier(0.26,.86,.44,.985),-moz-transform 800ms cubic-bezier(0.26,.86,.44,.985),visibility 800ms cubic-bezier(0.26,.86,.44,.985),opacity 800ms cubic-bezier(0.26,.86,.44,.985);-ms-transition:-ms-transform-origin 800ms cubic-bezier(0.26,.86,.44,.985),-ms-transform 800ms cubic-bezier(0.26,.86,.44,.985),visibility 800ms cubic-bezier(0.26,.86,.44,.985),opacity 800ms cubic-bezier(0.26,.86,.44,.985);-o-transition:-o-transform-origin 800ms cubic-bezier(0.26,.86,.44,.985),-o-transform 800ms cubic-bezier(0.26,.86,.44,.985),visibility 800ms cubic-bezier(0.26,.86,.44,.985),opacity 800ms cubic-bezier(0.26,.86,.44,.985);transition:transform-origin 800ms cubic-bezier(0.26,.86,.44,.985),transform 800ms cubic-bezier(0.26,.86,.44,.985),visibility 800ms cubic-bezier(0.26,.86,.44,.985),opacity 800ms cubic-bezier(0.26,.86,.44,.985)}.reveal[data-transition-speed=fast] .slides section{-webkit-transition-duration:400ms;-moz-transition-duration:400ms;-ms-transition-duration:400ms;transition-duration:400ms}.reveal[data-transition-speed=slow] .slides section{-webkit-transition-duration:1200ms;-moz-transition-duration:1200ms;-ms-transition-duration:1200ms;transition-duration:1200ms}.reveal .slides section[data-transition-speed=fast]{-webkit-transition-duration:400ms;-moz-transition-duration:400ms;-ms-transition-duration:400ms;transition-duration:400ms}.reveal .slides section[data-transition-speed=slow]{-webkit-transition-duration:1200ms;-moz-transition-duration:1200ms;-ms-transition-duration:1200ms;transition-duration:1200ms}.reveal .slides>section{left:-50%;top:-50%}.reveal .slides>section.stack{padding-top:0;padding-bottom:0}.reveal .slides>section.present,.reveal .slides>section>section.present{display:block;z-index:11;opacity:1}.reveal.center,.reveal.center .slides,.reveal.center .slides section{min-height:auto!important}.reveal .slides>section[data-transition=default].past,.reveal .slides>section.past{display:block;opacity:0;-webkit-transform:translate3d(-100%,0,0) rotateY(-90deg) translate3d(-100%,0,0);-moz-transform:translate3d(-100%,0,0) rotateY(-90deg) translate3d(-100%,0,0);-ms-transform:translate3d(-100%,0,0) rotateY(-90deg) translate3d(-100%,0,0);transform:translate3d(-100%,0,0) rotateY(-90deg) translate3d(-100%,0,0)}.reveal .slides>section[data-transition=default].future,.reveal .slides>section.future{display:block;opacity:0;-webkit-transform:translate3d(100%,0,0) rotateY(90deg) translate3d(100%,0,0);-moz-transform:translate3d(100%,0,0) rotateY(90deg) translate3d(100%,0,0);-ms-transform:translate3d(100%,0,0) rotateY(90deg) translate3d(100%,0,0);transform:translate3d(100%,0,0) rotateY(90deg) translate3d(100%,0,0)}.reveal .slides>section>section[data-transition=default].past,.reveal .slides>section>section.past{display:block;opacity:0;-webkit-transform:translate3d(0,-300px,0) rotateX(70deg) translate3d(0,-300px,0);-moz-transform:translate3d(0,-300px,0) rotateX(70deg) translate3d(0,-300px,0);-ms-transform:translate3d(0,-300px,0) rotateX(70deg) translate3d(0,-300px,0);transform:translate3d(0,-300px,0) rotateX(70deg) translate3d(0,-300px,0)}.reveal .slides>section>section[data-transition=default].future,.reveal .slides>section>section.future{display:block;opacity:0;-webkit-transform:translate3d(0,300px,0) rotateX(-70deg) translate3d(0,300px,0);-moz-transform:translate3d(0,300px,0) rotateX(-70deg) translate3d(0,300px,0);-ms-transform:translate3d(0,300px,0) rotateX(-70deg) translate3d(0,300px,0);transform:translate3d(0,300px,0) rotateX(-70deg) translate3d(0,300px,0)}.reveal .slides>section[data-transition=concave].past,.reveal.concave .slides>section.past{-webkit-transform:translate3d(-100%,0,0) rotateY(90deg) translate3d(-100%,0,0);-moz-transform:translate3d(-100%,0,0) rotateY(90deg) translate3d(-100%,0,0);-ms-transform:translate3d(-100%,0,0) rotateY(90deg) translate3d(-100%,0,0);transform:translate3d(-100%,0,0) rotateY(90deg) translate3d(-100%,0,0)}.reveal .slides>section[data-transition=concave].future,.reveal.concave .slides>section.future{-webkit-transform:translate3d(100%,0,0) rotateY(-90deg) translate3d(100%,0,0);-moz-transform:translate3d(100%,0,0) rotateY(-90deg) translate3d(100%,0,0);-ms-transform:translate3d(100%,0,0) rotateY(-90deg) translate3d(100%,0,0);transform:translate3d(100%,0,0) rotateY(-90deg) translate3d(100%,0,0)}.reveal .slides>section>section[data-transition=concave].past,.reveal.concave .slides>section>section.past{-webkit-transform:translate3d(0,-80%,0) rotateX(-70deg) translate3d(0,-80%,0);-moz-transform:translate3d(0,-80%,0) rotateX(-70deg) translate3d(0,-80%,0);-ms-transform:translate3d(0,-80%,0) rotateX(-70deg) translate3d(0,-80%,0);transform:translate3d(0,-80%,0) rotateX(-70deg) translate3d(0,-80%,0)}.reveal .slides>section>section[data-transition=concave].future,.reveal.concave .slides>section>section.future{-webkit-transform:translate3d(0,80%,0) rotateX(70deg) translate3d(0,80%,0);-moz-transform:translate3d(0,80%,0) rotateX(70deg) translate3d(0,80%,0);-ms-transform:translate3d(0,80%,0) rotateX(70deg) translate3d(0,80%,0);transform:translate3d(0,80%,0) rotateX(70deg) translate3d(0,80%,0)}.reveal .slides>section[data-transition=zoom].past,.reveal.zoom .slides>section.past{opacity:0;visibility:hidden;-webkit-transform:scale(16);-moz-transform:scale(16);-ms-transform:scale(16);-o-transform:scale(16);transform:scale(16)}.reveal .slides>section[data-transition=zoom].future,.reveal.zoom .slides>section.future{opacity:0;visibility:hidden;-webkit-transform:scale(0.2);-moz-transform:scale(0.2);-ms-transform:scale(0.2);-o-transform:scale(0.2);transform:scale(0.2)}.reveal .slides>section>section[data-transition=zoom].past,.reveal.zoom .slides>section>section.past{-webkit-transform:translate(0,-150%);-moz-transform:translate(0,-150%);-ms-transform:translate(0,-150%);-o-transform:translate(0,-150%);transform:translate(0,-150%)}.reveal .slides>section>section[data-transition=zoom].future,.reveal.zoom .slides>section>section.future{-webkit-transform:translate(0,150%);-moz-transform:translate(0,150%);-ms-transform:translate(0,150%);-o-transform:translate(0,150%);transform:translate(0,150%)}.reveal.linear section{-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;backface-visibility:hidden}.reveal .slides>section[data-transition=linear].past,.reveal.linear .slides>section.past{-webkit-transform:translate(-150%,0);-moz-transform:translate(-150%,0);-ms-transform:translate(-150%,0);-o-transform:translate(-150%,0);transform:translate(-150%,0)}.reveal .slides>section[data-transition=linear].future,.reveal.linear .slides>section.future{-webkit-transform:translate(150%,0);-moz-transform:translate(150%,0);-ms-transform:translate(150%,0);-o-transform:translate(150%,0);transform:translate(150%,0)}.reveal .slides>section>section[data-transition=linear].past,.reveal.linear .slides>section>section.past{-webkit-transform:translate(0,-150%);-moz-transform:translate(0,-150%);-ms-transform:translate(0,-150%);-o-transform:translate(0,-150%);transform:translate(0,-150%)}.reveal .slides>section>section[data-transition=linear].future,.reveal.linear .slides>section>section.future{-webkit-transform:translate(0,150%);-moz-transform:translate(0,150%);-ms-transform:translate(0,150%);-o-transform:translate(0,150%);transform:translate(0,150%)}.reveal.cube .slides{-webkit-perspective:1300px;-moz-perspective:1300px;-ms-perspective:1300px;perspective:1300px}.reveal.cube .slides section{padding:30px;min-height:700px;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;backface-visibility:hidden;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.reveal.center.cube .slides section{min-height:auto}.reveal.cube .slides section:not(.stack):before{content:'';position:absolute;display:block;width:100%;height:100%;left:0;top:0;background:rgba(0,0,0,.1);border-radius:4px;-webkit-transform:translateZ(-20px);-moz-transform:translateZ(-20px);-ms-transform:translateZ(-20px);-o-transform:translateZ(-20px);transform:translateZ(-20px)}.reveal.cube .slides section:not(.stack):after{content:'';position:absolute;display:block;width:90%;height:30px;left:5%;bottom:0;background:0;z-index:1;border-radius:4px;box-shadow:0 95px 25px rgba(0,0,0,.2);-webkit-transform:translateZ(-90px) rotateX(65deg);-moz-transform:translateZ(-90px) rotateX(65deg);-ms-transform:translateZ(-90px) rotateX(65deg);-o-transform:translateZ(-90px) rotateX(65deg);transform:translateZ(-90px) rotateX(65deg)}.reveal.cube .slides>section.stack{padding:0;background:0}.reveal.cube .slides>section.past{-webkit-transform-origin:100% 0;-moz-transform-origin:100% 0;-ms-transform-origin:100% 0;transform-origin:100% 0;-webkit-transform:translate3d(-100%,0,0) rotateY(-90deg);-moz-transform:translate3d(-100%,0,0) rotateY(-90deg);-ms-transform:translate3d(-100%,0,0) rotateY(-90deg);transform:translate3d(-100%,0,0) rotateY(-90deg)}.reveal.cube .slides>section.future{-webkit-transform-origin:0 0;-moz-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translate3d(100%,0,0) rotateY(90deg);-moz-transform:translate3d(100%,0,0) rotateY(90deg);-ms-transform:translate3d(100%,0,0) rotateY(90deg);transform:translate3d(100%,0,0) rotateY(90deg)}.reveal.cube .slides>section>section.past{-webkit-transform-origin:0 100%;-moz-transform-origin:0 100%;-ms-transform-origin:0 100%;transform-origin:0 100%;-webkit-transform:translate3d(0,-100%,0) rotateX(90deg);-moz-transform:translate3d(0,-100%,0) rotateX(90deg);-ms-transform:translate3d(0,-100%,0) rotateX(90deg);transform:translate3d(0,-100%,0) rotateX(90deg)}.reveal.cube .slides>section>section.future{-webkit-transform-origin:0 0;-moz-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translate3d(0,100%,0) rotateX(-90deg);-moz-transform:translate3d(0,100%,0) rotateX(-90deg);-ms-transform:translate3d(0,100%,0) rotateX(-90deg);transform:translate3d(0,100%,0) rotateX(-90deg)}.reveal.page .slides{-webkit-perspective-origin:0 50%;-moz-perspective-origin:0 50%;-ms-perspective-origin:0 50%;perspective-origin:0 50%;-webkit-perspective:3000px;-moz-perspective:3000px;-ms-perspective:3000px;perspective:3000px}.reveal.page .slides section{padding:30px;min-height:700px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.reveal.page .slides section.past{z-index:12}.reveal.page .slides section:not(.stack):before{content:'';position:absolute;display:block;width:100%;height:100%;left:0;top:0;background:rgba(0,0,0,.1);-webkit-transform:translateZ(-20px);-moz-transform:translateZ(-20px);-ms-transform:translateZ(-20px);-o-transform:translateZ(-20px);transform:translateZ(-20px)}.reveal.page .slides section:not(.stack):after{content:'';position:absolute;display:block;width:90%;height:30px;left:5%;bottom:0;background:0;z-index:1;border-radius:4px;box-shadow:0 95px 25px rgba(0,0,0,.2);-webkit-transform:translateZ(-90px) rotateX(65deg)}.reveal.page .slides>section.stack{padding:0;background:0}.reveal.page .slides>section.past{-webkit-transform-origin:0 0;-moz-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translate3d(-40%,0,0) rotateY(-80deg);-moz-transform:translate3d(-40%,0,0) rotateY(-80deg);-ms-transform:translate3d(-40%,0,0) rotateY(-80deg);transform:translate3d(-40%,0,0) rotateY(-80deg)}.reveal.page .slides>section.future{-webkit-transform-origin:100% 0;-moz-transform-origin:100% 0;-ms-transform-origin:100% 0;transform-origin:100% 0;-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.reveal.page .slides>section>section.past{-webkit-transform-origin:0 0;-moz-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translate3d(0,-40%,0) rotateX(80deg);-moz-transform:translate3d(0,-40%,0) rotateX(80deg);-ms-transform:translate3d(0,-40%,0) rotateX(80deg);transform:translate3d(0,-40%,0) rotateX(80deg)}.reveal.page .slides>section>section.future{-webkit-transform-origin:0 100%;-moz-transform-origin:0 100%;-ms-transform-origin:0 100%;transform-origin:0 100%;-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.reveal .slides section[data-transition=fade],.reveal.fade .slides section,.reveal.fade .slides>section>section{-webkit-transform:none;-moz-transform:none;-ms-transform:none;-o-transform:none;transform:none;-webkit-transition:opacity .5s;-moz-transition:opacity .5s;-ms-transition:opacity .5s;-o-transition:opacity .5s;transition:opacity .5s}.reveal.fade.overview .slides section,.reveal.fade.overview .slides>section>section,.reveal.fade.exit-overview .slides section,.reveal.fade.exit-overview .slides>section>section{-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none}.reveal .slides section[data-transition=none],.reveal.none .slides section{-webkit-transform:none;-moz-transform:none;-ms-transform:none;-o-transform:none;transform:none;-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none}.reveal.overview .slides{-webkit-perspective-origin:0 0;-moz-perspective-origin:0 0;-ms-perspective-origin:0 0;perspective-origin:0 0;-webkit-perspective:700px;-moz-perspective:700px;-ms-perspective:700px;perspective:700px}.reveal.overview .slides section{height:600px;overflow:hidden;opacity:1!important;visibility:visible!important;cursor:pointer;background:rgba(0,0,0,.1)}.reveal.overview .slides section .fragment{opacity:1}.reveal.overview .slides section:after,.reveal.overview .slides section:before{display:none!important}.reveal.overview .slides section>section{opacity:1;cursor:pointer}.reveal.overview .slides section:hover{background:rgba(0,0,0,.3)}.reveal.overview .slides section.present{background:rgba(0,0,0,.3)}.reveal.overview .slides>section.stack{padding:0;background:0;overflow:visible}.reveal .pause-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background:#000;visibility:hidden;opacity:0;z-index:100;-webkit-transition:all 1s ease;-moz-transition:all 1s ease;-ms-transition:all 1s ease;-o-transition:all 1s ease;transition:all 1s ease}.reveal.paused .pause-overlay{visibility:visible;opacity:1}.no-transforms{overflow-y:auto}.no-transforms .reveal .slides{position:relative;width:80%;height:auto!important;top:0;left:50%;margin:0;text-align:center}.no-transforms .reveal .controls,.no-transforms .reveal .progress{display:none!important}.no-transforms .reveal .slides section{display:block!important;opacity:1!important;position:relative!important;height:auto;min-height:auto;top:0;left:-50%;margin:70px 0;-webkit-transform:none;-moz-transform:none;-ms-transform:none;-o-transform:none;transform:none}.no-transforms .reveal .slides section section{left:0}.reveal .no-transition,.reveal .no-transition *{-webkit-transition:none!important;-moz-transition:none!important;-ms-transition:none!important;-o-transition:none!important;transition:none!important}.reveal .state-background{position:absolute;width:100%;height:100%;background:rgba(0,0,0,0);-webkit-transition:background 800ms ease;-moz-transition:background 800ms ease;-ms-transition:background 800ms ease;-o-transition:background 800ms ease;transition:background 800ms ease}.alert .reveal .state-background{background:rgba(200,50,30,.6)}.soothe .reveal .state-background{background:rgba(50,200,90,.4)}.blackout .reveal .state-background{background:rgba(0,0,0,.6)}.whiteout .reveal .state-background{background:rgba(255,255,255,.6)}.cobalt .reveal .state-background{background:rgba(22,152,213,.6)}.mint .reveal .state-background{background:rgba(22,213,75,.6)}.submerge .reveal .state-background{background:rgba(12,25,77,.6)}.lila .reveal .state-background{background:rgba(180,50,140,.6)}.sunset .reveal .state-background{background:rgba(255,122,0,.6)}.reveal>.backgrounds{position:absolute;width:100%;height:100%}.reveal .slide-background{position:absolute;width:100%;height:100%;opacity:0;visibility:hidden;background-color:rgba(0,0,0,0);background-position:50% 50%;background-repeat:no-repeat;background-size:cover;-webkit-transition:all 600ms cubic-bezier(0.26,.86,.44,.985);-moz-transition:all 600ms cubic-bezier(0.26,.86,.44,.985);-ms-transition:all 600ms cubic-bezier(0.26,.86,.44,.985);-o-transition:all 600ms cubic-bezier(0.26,.86,.44,.985);transition:all 600ms cubic-bezier(0.26,.86,.44,.985)}.reveal .slide-background.present{opacity:1;visibility:visible}.print-pdf .reveal .slide-background{opacity:1!important;visibility:visible!important}.reveal[data-background-transition=slide]>.backgrounds .slide-background,.reveal>.backgrounds .slide-background[data-background-transition=slide]{opacity:1;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;backface-visibility:hidden;-webkit-transition-duration:800ms;-moz-transition-duration:800ms;-ms-transition-duration:800ms;-o-transition-duration:800ms;transition-duration:800ms}.reveal[data-background-transition=slide]>.backgrounds .slide-background.past,.reveal>.backgrounds .slide-background.past[data-background-transition=slide]{-webkit-transform:translate(-100%,0);-moz-transform:translate(-100%,0);-ms-transform:translate(-100%,0);-o-transform:translate(-100%,0);transform:translate(-100%,0)}.reveal[data-background-transition=slide]>.backgrounds .slide-background.future,.reveal>.backgrounds .slide-background.future[data-background-transition=slide]{-webkit-transform:translate(100%,0);-moz-transform:translate(100%,0);-ms-transform:translate(100%,0);-o-transform:translate(100%,0);transform:translate(100%,0)}.reveal[data-background-transition=slide]>.backgrounds .slide-background>.slide-background.past,.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=slide]{-webkit-transform:translate(0,-100%);-moz-transform:translate(0,-100%);-ms-transform:translate(0,-100%);-o-transform:translate(0,-100%);transform:translate(0,-100%)}.reveal[data-background-transition=slide]>.backgrounds .slide-background>.slide-background.future,.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=slide]{-webkit-transform:translate(0,100%);-moz-transform:translate(0,100%);-ms-transform:translate(0,100%);-o-transform:translate(0,100%);transform:translate(0,100%)}.reveal[data-transition-speed=fast]>.backgrounds .slide-background{-webkit-transition-duration:400ms;-moz-transition-duration:400ms;-ms-transition-duration:400ms;transition-duration:400ms}.reveal[data-transition-speed=slow]>.backgrounds .slide-background{-webkit-transition-duration:1200ms;-moz-transition-duration:1200ms;-ms-transition-duration:1200ms;transition-duration:1200ms}.reveal.rtl .slides,.reveal.rtl .slides h1,.reveal.rtl .slides h2,.reveal.rtl .slides h3,.reveal.rtl .slides h4,.reveal.rtl .slides h5,.reveal.rtl .slides h6{direction:rtl;font-family:sans-serif}.reveal.rtl pre,.reveal.rtl code{direction:ltr}.reveal.rtl ol,.reveal.rtl ul{text-align:right}.reveal.rtl .progress span{float:right}.reveal .preview-link-overlay{position:absolute;top:0;left:0;width:100%;height:100%;z-index:1000;background:rgba(0,0,0,.9);opacity:0;visibility:hidden;-webkit-transition:all .3s ease;-moz-transition:all .3s ease;-ms-transition:all .3s ease;transition:all .3s ease}.reveal .preview-link-overlay.visible{opacity:1;visibility:visible}.reveal .preview-link-overlay .spinner{position:absolute;display:block;top:50%;left:50%;width:32px;height:32px;margin:-16px 0 0 -16px;z-index:10;background-image:url(data:image/gif;base64,R0lGODlhIAAgAPMAAJmZmf%2F%2F%2F6%2Bvr8nJybW1tcDAwOjo6Nvb26ioqKOjo7Ozs%2FLy8vz8%2FAAAAAAAAAAAACH%2FC05FVFNDQVBFMi4wAwEAAAAh%2FhpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh%2BQQJCgAAACwAAAAAIAAgAAAE5xDISWlhperN52JLhSSdRgwVo1ICQZRUsiwHpTJT4iowNS8vyW2icCF6k8HMMBkCEDskxTBDAZwuAkkqIfxIQyhBQBFvAQSDITM5VDW6XNE4KagNh6Bgwe60smQUB3d4Rz1ZBApnFASDd0hihh12BkE9kjAJVlycXIg7CQIFA6SlnJ87paqbSKiKoqusnbMdmDC2tXQlkUhziYtyWTxIfy6BE8WJt5YJvpJivxNaGmLHT0VnOgSYf0dZXS7APdpB309RnHOG5gDqXGLDaC457D1zZ%2FV%2FnmOM82XiHRLYKhKP1oZmADdEAAAh%2BQQJCgAAACwAAAAAIAAgAAAE6hDISWlZpOrNp1lGNRSdRpDUolIGw5RUYhhHukqFu8DsrEyqnWThGvAmhVlteBvojpTDDBUEIFwMFBRAmBkSgOrBFZogCASwBDEY%2FCZSg7GSE0gSCjQBMVG023xWBhklAnoEdhQEfyNqMIcKjhRsjEdnezB%2BA4k8gTwJhFuiW4dokXiloUepBAp5qaKpp6%2BHo7aWW54wl7obvEe0kRuoplCGepwSx2jJvqHEmGt6whJpGpfJCHmOoNHKaHx61WiSR92E4lbFoq%2BB6QDtuetcaBPnW6%2BO7wDHpIiK9SaVK5GgV543tzjgGcghAgAh%2BQQJCgAAACwAAAAAIAAgAAAE7hDISSkxpOrN5zFHNWRdhSiVoVLHspRUMoyUakyEe8PTPCATW9A14E0UvuAKMNAZKYUZCiBMuBakSQKG8G2FzUWox2AUtAQFcBKlVQoLgQReZhQlCIJesQXI5B0CBnUMOxMCenoCfTCEWBsJColTMANldx15BGs8B5wlCZ9Po6OJkwmRpnqkqnuSrayqfKmqpLajoiW5HJq7FL1Gr2mMMcKUMIiJgIemy7xZtJsTmsM4xHiKv5KMCXqfyUCJEonXPN2rAOIAmsfB3uPoAK%2B%2BG%2Bw48edZPK%2BM6hLJpQg484enXIdQFSS1u6UhksENEQAAIfkECQoAAAAsAAAAACAAIAAABOcQyEmpGKLqzWcZRVUQnZYg1aBSh2GUVEIQ2aQOE%2BG%2BcD4ntpWkZQj1JIiZIogDFFyHI0UxQwFugMSOFIPJftfVAEoZLBbcLEFhlQiqGp1Vd140AUklUN3eCA51C1EWMzMCezCBBmkxVIVHBWd3HHl9JQOIJSdSnJ0TDKChCwUJjoWMPaGqDKannasMo6WnM562R5YluZRwur0wpgqZE7NKUm%2BFNRPIhjBJxKZteWuIBMN4zRMIVIhffcgojwCF117i4nlLnY5ztRLsnOk%2BaV%2BoJY7V7m76PdkS4trKcdg0Zc0tTcKkRAAAIfkECQoAAAAsAAAAACAAIAAABO4QyEkpKqjqzScpRaVkXZWQEximw1BSCUEIlDohrft6cpKCk5xid5MNJTaAIkekKGQkWyKHkvhKsR7ARmitkAYDYRIbUQRQjWBwJRzChi9CRlBcY1UN4g0%2FVNB0AlcvcAYHRyZPdEQFYV8ccwR5HWxEJ02YmRMLnJ1xCYp0Y5idpQuhopmmC2KgojKasUQDk5BNAwwMOh2RtRq5uQuPZKGIJQIGwAwGf6I0JXMpC8C7kXWDBINFMxS4DKMAWVWAGYsAdNqW5uaRxkSKJOZKaU3tPOBZ4DuK2LATgJhkPJMgTwKCdFjyPHEnKxFCDhEAACH5BAkKAAAALAAAAAAgACAAAATzEMhJaVKp6s2nIkolIJ2WkBShpkVRWqqQrhLSEu9MZJKK9y1ZrqYK9WiClmvoUaF8gIQSNeF1Er4MNFn4SRSDARWroAIETg1iVwuHjYB1kYc1mwruwXKC9gmsJXliGxc%2BXiUCby9ydh1sOSdMkpMTBpaXBzsfhoc5l58Gm5yToAaZhaOUqjkDgCWNHAULCwOLaTmzswadEqggQwgHuQsHIoZCHQMMQgQGubVEcxOPFAcMDAYUA85eWARmfSRQCdcMe0zeP1AAygwLlJtPNAAL19DARdPzBOWSm1brJBi45soRAWQAAkrQIykShQ9wVhHCwCQCACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiRMDjI0Fd30%2FiI2UA5GSS5UDj2l6NoqgOgN4gksEBgYFf0FDqKgHnyZ9OX8HrgYHdHpcHQULXAS2qKpENRg7eAMLC7kTBaixUYFkKAzWAAnLC7FLVxLWDBLKCwaKTULgEwbLA4hJtOkSBNqITT3xEgfLpBtzE%2FjiuL04RGEBgwWhShRgQExHBAAh%2BQQJCgAAACwAAAAAIAAgAAAE7xDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfZiCqGk5dTESJeaOAlClzsJsqwiJwiqnFrb2nS9kmIcgEsjQydLiIlHehhpejaIjzh9eomSjZR%2BipslWIRLAgMDOR2DOqKogTB9pCUJBagDBXR6XB0EBkIIsaRsGGMMAxoDBgYHTKJiUYEGDAzHC9EACcUGkIgFzgwZ0QsSBcXHiQvOwgDdEwfFs0sDzt4S6BK4xYjkDOzn0unFeBzOBijIm1Dgmg5YFQwsCMjp1oJ8LyIAACH5BAkKAAAALAAAAAAgACAAAATwEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GGl6NoiPOH16iZKNlH6KmyWFOggHhEEvAwwMA0N9GBsEC6amhnVcEwavDAazGwIDaH1ipaYLBUTCGgQDA8NdHz0FpqgTBwsLqAbWAAnIA4FWKdMLGdYGEgraigbT0OITBcg5QwPT4xLrROZL6AuQAPUS7bxLpoWidY0JtxLHKhwwMJBTHgPKdEQAACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GAULDJCRiXo1CpGXDJOUjY%2BYip9DhToJA4RBLwMLCwVDfRgbBAaqqoZ1XBMHswsHtxtFaH1iqaoGNgAIxRpbFAgfPQSqpbgGBqUD1wBXeCYp1AYZ19JJOYgH1KwA4UBvQwXUBxPqVD9L3sbp2BNk2xvvFPJd%2BMFCN6HAAIKgNggY0KtEBAAh%2BQQJCgAAACwAAAAAIAAgAAAE6BDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfYIDMaAFdTESJeaEDAIMxYFqrOUaNW4E4ObYcCXaiBVEgULe0NJaxxtYksjh2NLkZISgDgJhHthkpU4mW6blRiYmZOlh4JWkDqILwUGBnE6TYEbCgevr0N1gH4At7gHiRpFaLNrrq8HNgAJA70AWxQIH1%2BvsYMDAzZQPC9VCNkDWUhGkuE5PxJNwiUK4UfLzOlD4WvzAHaoG9nxPi5d%2BjYUqfAhhykOFwJWiAAAIfkECQoAAAAsAAAAACAAIAAABPAQyElpUqnqzaciSoVkXVUMFaFSwlpOCcMYlErAavhOMnNLNo8KsZsMZItJEIDIFSkLGQoQTNhIsFehRww2CQLKF0tYGKYSg%2BygsZIuNqJksKgbfgIGepNo2cIUB3V1B3IvNiBYNQaDSTtfhhx0CwVPI0UJe0%2Bbm4g5VgcGoqOcnjmjqDSdnhgEoamcsZuXO1aWQy8KAwOAuTYYGwi7w5h%2BKr0SJ8MFihpNbx%2B4Erq7BYBuzsdiH1jCAzoSfl0rVirNbRXlBBlLX%2BBP0XJLAPGzTkAuAOqb0WT5AH7OcdCm5B8TgRwSRKIHQtaLCwg1RAAAOwAAAAAAAAAAAA%3D%3D);visibility:visible;opacity:.6;-webkit-transition:all .3s ease;-moz-transition:all .3s ease;-ms-transition:all .3s ease;transition:all .3s ease}.reveal .preview-link-overlay header{position:absolute;left:0;top:0;width:100%;height:40px;z-index:2;border-bottom:1px solid #222}.reveal .preview-link-overlay header a{display:inline-block;width:40px;height:40px;padding:0 10px;float:right;opacity:.6;box-sizing:border-box}.reveal .preview-link-overlay header a:hover{opacity:1}.reveal .preview-link-overlay header a .icon{display:inline-block;width:20px;height:20px;background-position:50% 50%;background-size:100%;background-repeat:no-repeat}.reveal .preview-link-overlay header a.close .icon{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABkklEQVRYR8WX4VHDMAxG6wnoJrABZQPYBCaBTWAD2g1gE5gg6OOsXuxIlr40d81dfrSJ9V4c2VLK7spHuTJ/5wpM07QXuXc5X0opX2tEJcadjHuV80li/FgxTIEK/5QBCICBD6xEhSMGHgQPgBgLiYVAB1dpSqKDawxTohFw4JSEA3clzgIBPCURwE2JucBR7rhPJJv5OpJwDX+SfDjgx1wACQeJG1aChP9K/IMmdZ8DtESV1WyP3Bt4MwM6sj4NMxMYiqUWHQu4KYA/SYkIjOsm3BXYWMKFDwU2khjCQ4ELJUJ4SmClRArOCmSXGuKma0fYD5CbzHxFpCSGAhfAVSSUGDUk2BWZaff2g6GE15BsBQ9nwmpIGDiyHQddwNTMKkbZaf9fajXQca1EX44puJZUsnY0ObGmITE3GVLCbEhQUjGVt146j6oasWN+49Vph2w1pZ5EansNZqKBm1txbU57iRRcZ86RWMDdWtBJUHBHwoQPi1GV+JCbntmvok7iTX4/Up9mgyTc/FJYDTcndgH/AA5A/CHsyEkVAAAAAElFTkSuQmCC)}.reveal .preview-link-overlay header a.external .icon{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAcElEQVRYR+2WSQoAIQwEzf8f7XiOMkUQxUPlGkM3hVmiQfQR9GYnH1SsAQlI4DiBqkCMoNb9y2e90IAEJPAcgdznU9+engMaeJ7Azh5Y1U67gAho4DqBqmB1buAf0MB1AlVBek83ZPkmJMGc1wAR+AAqod/B97TRpQAAAABJRU5ErkJggg==)}.reveal .preview-link-overlay .viewport{position:absolute;top:40px;right:0;bottom:0;left:0}.reveal .preview-link-overlay .viewport iframe{width:100%;height:100%;max-width:100%;max-height:100%;border:0;opacity:0;visibility:hidden;-webkit-transition:all .3s ease;-moz-transition:all .3s ease;-ms-transition:all .3s ease;transition:all .3s ease}.reveal .preview-link-overlay.loaded .viewport iframe{opacity:1;visibility:visible}.reveal .preview-link-overlay.loaded .spinner{opacity:0;visibility:hidden;-webkit-transform:scale(0.2);-moz-transform:scale(0.2);-ms-transform:scale(0.2);transform:scale(0.2)}.reveal aside.notes{display:none}.zoomed .reveal *,.zoomed .reveal :before,.zoomed .reveal :after{-webkit-transform:none!important;-moz-transform:none!important;-ms-transform:none!important;transform:none!important;-webkit-backface-visibility:visible!important;-moz-backface-visibility:visible!important;-ms-backface-visibility:visible!important;backface-visibility:visible!important}.zoomed .reveal .progress,.zoomed .reveal .controls{opacity:0}.zoomed .reveal .roll span{background:0}.zoomed .reveal .roll span:after{visibility:hidden} \ No newline at end of file diff --git a/css/theme/README.md b/css/theme/README.md new file mode 100644 index 0000000..28ded29 --- /dev/null +++ b/css/theme/README.md @@ -0,0 +1,23 @@ +## Dependencies + +Themes are written using Sass to keep things modular and reduce the need for repeated selectors across files. Make sure that you have the reveal.js development environment including the Grunt dependencies installed before proceding: https://github.com/hakimel/reveal.js#full-setup + + + +## Creating a Theme + +To create your own theme, start by duplicating any ```.scss``` file in [/css/theme/source](https://github.com/hakimel/reveal.js/blob/master/css/theme/source) and adding it to the compilation list in the [Gruntfile](https://github.com/hakimel/reveal.js/blob/master/Gruntfile.js). + +Each theme file does four things in the following order: + +1. **Include [/css/theme/template/mixins.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/mixins.scss)** +Shared utility functions. + +2. **Include [/css/theme/template/settings.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/settings.scss)** +Declares a set of custom variables that the template file (step 4) expects. Can be overridden in step 3. + +3. **Override** +This is where you override the default theme. Either by specifying variables (see [settings.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/settings.scss) for reference) or by adding full selectors with hardcoded styles. + +4. **Include [/css/theme/template/theme.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/theme.scss)** +The template theme file which will generate final CSS output based on the currently defined variables. diff --git a/css/theme/beige.css b/css/theme/beige.css new file mode 100644 index 0000000..1d9a886 --- /dev/null +++ b/css/theme/beige.css @@ -0,0 +1,142 @@ +@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); +/** + * Beige theme for reveal.js. + * + * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se + */ +@font-face { + font-family: 'League Gothic'; + src: url("../../lib/font/league_gothic-webfont.eot"); + src: url("../../lib/font/league_gothic-webfont.eot?#iefix") format("embedded-opentype"), url("../../lib/font/league_gothic-webfont.woff") format("woff"), url("../../lib/font/league_gothic-webfont.ttf") format("truetype"), url("../../lib/font/league_gothic-webfont.svg#LeagueGothicRegular") format("svg"); + font-weight: normal; + font-style: normal; } + +/********************************************* + * GLOBAL STYLES + *********************************************/ +body { + background: #f7f2d3; + background: -moz-radial-gradient(center, circle cover, white 0%, #f7f2d3 100%); + background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%, white), color-stop(100%, #f7f2d3)); + background: -webkit-radial-gradient(center, circle cover, white 0%, #f7f2d3 100%); + background: -o-radial-gradient(center, circle cover, white 0%, #f7f2d3 100%); + background: -ms-radial-gradient(center, circle cover, white 0%, #f7f2d3 100%); + background: radial-gradient(center, circle cover, white 0%, #f7f2d3 100%); + background-color: #f7f3de; } + +.reveal { + font-family: "Lato", sans-serif; + font-size: 36px; + font-weight: 200; + letter-spacing: -0.02em; + color: #333333; } + +::selection { + color: white; + background: rgba(79, 64, 28, 0.99); + text-shadow: none; } + +/********************************************* + * HEADERS + *********************************************/ +.reveal h1, +.reveal h2, +.reveal h3, +.reveal h4, +.reveal h5, +.reveal h6 { + margin: 0 0 20px 0; + color: #333333; + font-family: "League Gothic", Impact, sans-serif; + line-height: 0.9em; + letter-spacing: 0.02em; + text-transform: uppercase; + text-shadow: none; } + +.reveal h1 { + text-shadow: 0 1px 0 #cccccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbbbbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaaaaa, 0 6px 1px rgba(0, 0, 0, 0.1), 0 0 5px rgba(0, 0, 0, 0.1), 0 1px 3px rgba(0, 0, 0, 0.3), 0 3px 5px rgba(0, 0, 0, 0.2), 0 5px 10px rgba(0, 0, 0, 0.25), 0 20px 20px rgba(0, 0, 0, 0.15); } + +/********************************************* + * LINKS + *********************************************/ +.reveal a:not(.image) { + color: #8b743d; + text-decoration: none; + -webkit-transition: color .15s ease; + -moz-transition: color .15s ease; + -ms-transition: color .15s ease; + -o-transition: color .15s ease; + transition: color .15s ease; } + +.reveal a:not(.image):hover { + color: #c0a86e; + text-shadow: none; + border: none; } + +.reveal .roll span:after { + color: #fff; + background: #564826; } + +/********************************************* + * IMAGES + *********************************************/ +.reveal section img { + margin: 15px 0px; + background: rgba(255, 255, 255, 0.12); + border: 4px solid #333333; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); + -webkit-transition: all .2s linear; + -moz-transition: all .2s linear; + -ms-transition: all .2s linear; + -o-transition: all .2s linear; + transition: all .2s linear; } + +.reveal a:hover img { + background: rgba(255, 255, 255, 0.2); + border-color: #8b743d; + box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); } + +/********************************************* + * NAVIGATION CONTROLS + *********************************************/ +.reveal .controls div.navigate-left, +.reveal .controls div.navigate-left.enabled { + border-right-color: #8b743d; } + +.reveal .controls div.navigate-right, +.reveal .controls div.navigate-right.enabled { + border-left-color: #8b743d; } + +.reveal .controls div.navigate-up, +.reveal .controls div.navigate-up.enabled { + border-bottom-color: #8b743d; } + +.reveal .controls div.navigate-down, +.reveal .controls div.navigate-down.enabled { + border-top-color: #8b743d; } + +.reveal .controls div.navigate-left.enabled:hover { + border-right-color: #c0a86e; } + +.reveal .controls div.navigate-right.enabled:hover { + border-left-color: #c0a86e; } + +.reveal .controls div.navigate-up.enabled:hover { + border-bottom-color: #c0a86e; } + +.reveal .controls div.navigate-down.enabled:hover { + border-top-color: #c0a86e; } + +/********************************************* + * PROGRESS BAR + *********************************************/ +.reveal .progress { + background: rgba(0, 0, 0, 0.2); } + +.reveal .progress span { + background: #8b743d; + -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + -ms-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + -o-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); } diff --git a/css/theme/default.css b/css/theme/default.css new file mode 100644 index 0000000..9a2f7c6 --- /dev/null +++ b/css/theme/default.css @@ -0,0 +1,142 @@ +@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); +/** + * Default theme for reveal.js. + * + * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se + */ +@font-face { + font-family: 'League Gothic'; + src: url("../../lib/font/league_gothic-webfont.eot"); + src: url("../../lib/font/league_gothic-webfont.eot?#iefix") format("embedded-opentype"), url("../../lib/font/league_gothic-webfont.woff") format("woff"), url("../../lib/font/league_gothic-webfont.ttf") format("truetype"), url("../../lib/font/league_gothic-webfont.svg#LeagueGothicRegular") format("svg"); + font-weight: normal; + font-style: normal; } + +/********************************************* + * GLOBAL STYLES + *********************************************/ +body { + background: #1c1e20; + background: -moz-radial-gradient(center, circle cover, #555a5f 0%, #1c1e20 100%); + background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%, #555a5f), color-stop(100%, #1c1e20)); + background: -webkit-radial-gradient(center, circle cover, #555a5f 0%, #1c1e20 100%); + background: -o-radial-gradient(center, circle cover, #555a5f 0%, #1c1e20 100%); + background: -ms-radial-gradient(center, circle cover, #555a5f 0%, #1c1e20 100%); + background: radial-gradient(center, circle cover, #555a5f 0%, #1c1e20 100%); + background-color: #2b2b2b; } + +.reveal { + font-family: "Lato", sans-serif; + font-size: 36px; + font-weight: 200; + letter-spacing: -0.02em; + color: #eeeeee; } + +::selection { + color: white; + background: #ff5e99; + text-shadow: none; } + +/********************************************* + * HEADERS + *********************************************/ +.reveal h1, +.reveal h2, +.reveal h3, +.reveal h4, +.reveal h5, +.reveal h6 { + margin: 0 0 20px 0; + color: #eeeeee; + font-family: "League Gothic", Impact, sans-serif; + line-height: 0.9em; + letter-spacing: 0.02em; + text-transform: uppercase; + text-shadow: 0px 0px 6px rgba(0, 0, 0, 0.2); } + +.reveal h1 { + text-shadow: 0 1px 0 #cccccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbbbbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaaaaa, 0 6px 1px rgba(0, 0, 0, 0.1), 0 0 5px rgba(0, 0, 0, 0.1), 0 1px 3px rgba(0, 0, 0, 0.3), 0 3px 5px rgba(0, 0, 0, 0.2), 0 5px 10px rgba(0, 0, 0, 0.25), 0 20px 20px rgba(0, 0, 0, 0.15); } + +/********************************************* + * LINKS + *********************************************/ +.reveal a:not(.image) { + color: #13daec; + text-decoration: none; + -webkit-transition: color .15s ease; + -moz-transition: color .15s ease; + -ms-transition: color .15s ease; + -o-transition: color .15s ease; + transition: color .15s ease; } + +.reveal a:not(.image):hover { + color: #71e9f4; + text-shadow: none; + border: none; } + +.reveal .roll span:after { + color: #fff; + background: #0d99a5; } + +/********************************************* + * IMAGES + *********************************************/ +.reveal section img { + margin: 15px 0px; + background: rgba(255, 255, 255, 0.12); + border: 4px solid #eeeeee; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); + -webkit-transition: all .2s linear; + -moz-transition: all .2s linear; + -ms-transition: all .2s linear; + -o-transition: all .2s linear; + transition: all .2s linear; } + +.reveal a:hover img { + background: rgba(255, 255, 255, 0.2); + border-color: #13daec; + box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); } + +/********************************************* + * NAVIGATION CONTROLS + *********************************************/ +.reveal .controls div.navigate-left, +.reveal .controls div.navigate-left.enabled { + border-right-color: #13daec; } + +.reveal .controls div.navigate-right, +.reveal .controls div.navigate-right.enabled { + border-left-color: #13daec; } + +.reveal .controls div.navigate-up, +.reveal .controls div.navigate-up.enabled { + border-bottom-color: #13daec; } + +.reveal .controls div.navigate-down, +.reveal .controls div.navigate-down.enabled { + border-top-color: #13daec; } + +.reveal .controls div.navigate-left.enabled:hover { + border-right-color: #71e9f4; } + +.reveal .controls div.navigate-right.enabled:hover { + border-left-color: #71e9f4; } + +.reveal .controls div.navigate-up.enabled:hover { + border-bottom-color: #71e9f4; } + +.reveal .controls div.navigate-down.enabled:hover { + border-top-color: #71e9f4; } + +/********************************************* + * PROGRESS BAR + *********************************************/ +.reveal .progress { + background: rgba(0, 0, 0, 0.2); } + +.reveal .progress span { + background: #13daec; + -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + -ms-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + -o-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); } diff --git a/css/theme/moon.css b/css/theme/moon.css new file mode 100644 index 0000000..5aa2866 --- /dev/null +++ b/css/theme/moon.css @@ -0,0 +1,142 @@ +@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); +/** + * Solarized Dark theme for reveal.js. + * Author: Achim Staebler + */ +@font-face { + font-family: 'League Gothic'; + src: url("../../lib/font/league_gothic-webfont.eot"); + src: url("../../lib/font/league_gothic-webfont.eot?#iefix") format("embedded-opentype"), url("../../lib/font/league_gothic-webfont.woff") format("woff"), url("../../lib/font/league_gothic-webfont.ttf") format("truetype"), url("../../lib/font/league_gothic-webfont.svg#LeagueGothicRegular") format("svg"); + font-weight: normal; + font-style: normal; } + +/** + * Solarized colors by Ethan Schoonover + */ +html * { + color-profile: sRGB; + rendering-intent: auto; } + +/********************************************* + * GLOBAL STYLES + *********************************************/ +body { + background: #002b36; + background-color: #002b36; } + +.reveal { + font-family: "Lato", sans-serif; + font-size: 36px; + font-weight: 200; + letter-spacing: -0.02em; + color: #93a1a1; } + +::selection { + color: white; + background: #d33682; + text-shadow: none; } + +/********************************************* + * HEADERS + *********************************************/ +.reveal h1, +.reveal h2, +.reveal h3, +.reveal h4, +.reveal h5, +.reveal h6 { + margin: 0 0 20px 0; + color: #eee8d5; + font-family: "League Gothic", Impact, sans-serif; + line-height: 0.9em; + letter-spacing: 0.02em; + text-transform: uppercase; + text-shadow: none; } + +.reveal h1 { + text-shadow: 0px 0px 6px rgba(0, 0, 0, 0.2); } + +/********************************************* + * LINKS + *********************************************/ +.reveal a:not(.image) { + color: #268bd2; + text-decoration: none; + -webkit-transition: color .15s ease; + -moz-transition: color .15s ease; + -ms-transition: color .15s ease; + -o-transition: color .15s ease; + transition: color .15s ease; } + +.reveal a:not(.image):hover { + color: #78b9e6; + text-shadow: none; + border: none; } + +.reveal .roll span:after { + color: #fff; + background: #1a6091; } + +/********************************************* + * IMAGES + *********************************************/ +.reveal section img { + margin: 15px 0px; + background: rgba(255, 255, 255, 0.12); + border: 4px solid #93a1a1; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); + -webkit-transition: all .2s linear; + -moz-transition: all .2s linear; + -ms-transition: all .2s linear; + -o-transition: all .2s linear; + transition: all .2s linear; } + +.reveal a:hover img { + background: rgba(255, 255, 255, 0.2); + border-color: #268bd2; + box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); } + +/********************************************* + * NAVIGATION CONTROLS + *********************************************/ +.reveal .controls div.navigate-left, +.reveal .controls div.navigate-left.enabled { + border-right-color: #268bd2; } + +.reveal .controls div.navigate-right, +.reveal .controls div.navigate-right.enabled { + border-left-color: #268bd2; } + +.reveal .controls div.navigate-up, +.reveal .controls div.navigate-up.enabled { + border-bottom-color: #268bd2; } + +.reveal .controls div.navigate-down, +.reveal .controls div.navigate-down.enabled { + border-top-color: #268bd2; } + +.reveal .controls div.navigate-left.enabled:hover { + border-right-color: #78b9e6; } + +.reveal .controls div.navigate-right.enabled:hover { + border-left-color: #78b9e6; } + +.reveal .controls div.navigate-up.enabled:hover { + border-bottom-color: #78b9e6; } + +.reveal .controls div.navigate-down.enabled:hover { + border-top-color: #78b9e6; } + +/********************************************* + * PROGRESS BAR + *********************************************/ +.reveal .progress { + background: rgba(0, 0, 0, 0.2); } + +.reveal .progress span { + background: #268bd2; + -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + -ms-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + -o-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); } diff --git a/css/theme/night.css b/css/theme/night.css new file mode 100644 index 0000000..2ea3fc4 --- /dev/null +++ b/css/theme/night.css @@ -0,0 +1,130 @@ +@import url(https://fonts.googleapis.com/css?family=Montserrat:700); +@import url(https://fonts.googleapis.com/css?family=Open+Sans:400,700,400italic,700italic); +/** + * Black theme for reveal.js. + * + * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se + */ +/********************************************* + * GLOBAL STYLES + *********************************************/ +body { + background: #111111; + background-color: #111111; } + +.reveal { + font-family: "Open Sans", sans-serif; + font-size: 30px; + font-weight: 200; + letter-spacing: -0.02em; + color: #eeeeee; } + +::selection { + color: white; + background: #e7ad52; + text-shadow: none; } + +/********************************************* + * HEADERS + *********************************************/ +.reveal h1, +.reveal h2, +.reveal h3, +.reveal h4, +.reveal h5, +.reveal h6 { + margin: 0 0 20px 0; + color: #eeeeee; + font-family: "Montserrat", Impact, sans-serif; + line-height: 0.9em; + letter-spacing: -0.03em; + text-transform: none; + text-shadow: none; } + +.reveal h1 { + text-shadow: 0px 0px 6px rgba(0, 0, 0, 0.2); } + +/********************************************* + * LINKS + *********************************************/ +.reveal a:not(.image) { + color: #e7ad52; + text-decoration: none; + -webkit-transition: color .15s ease; + -moz-transition: color .15s ease; + -ms-transition: color .15s ease; + -o-transition: color .15s ease; + transition: color .15s ease; } + +.reveal a:not(.image):hover { + color: #f3d7ac; + text-shadow: none; + border: none; } + +.reveal .roll span:after { + color: #fff; + background: #d08a1d; } + +/********************************************* + * IMAGES + *********************************************/ +.reveal section img { + margin: 15px 0px; + background: rgba(255, 255, 255, 0.12); + border: 4px solid #eeeeee; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); + -webkit-transition: all .2s linear; + -moz-transition: all .2s linear; + -ms-transition: all .2s linear; + -o-transition: all .2s linear; + transition: all .2s linear; } + +.reveal a:hover img { + background: rgba(255, 255, 255, 0.2); + border-color: #e7ad52; + box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); } + +/********************************************* + * NAVIGATION CONTROLS + *********************************************/ +.reveal .controls div.navigate-left, +.reveal .controls div.navigate-left.enabled { + border-right-color: #e7ad52; } + +.reveal .controls div.navigate-right, +.reveal .controls div.navigate-right.enabled { + border-left-color: #e7ad52; } + +.reveal .controls div.navigate-up, +.reveal .controls div.navigate-up.enabled { + border-bottom-color: #e7ad52; } + +.reveal .controls div.navigate-down, +.reveal .controls div.navigate-down.enabled { + border-top-color: #e7ad52; } + +.reveal .controls div.navigate-left.enabled:hover { + border-right-color: #f3d7ac; } + +.reveal .controls div.navigate-right.enabled:hover { + border-left-color: #f3d7ac; } + +.reveal .controls div.navigate-up.enabled:hover { + border-bottom-color: #f3d7ac; } + +.reveal .controls div.navigate-down.enabled:hover { + border-top-color: #f3d7ac; } + +/********************************************* + * PROGRESS BAR + *********************************************/ +.reveal .progress { + background: rgba(0, 0, 0, 0.2); } + +.reveal .progress span { + background: #e7ad52; + -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + -ms-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + -o-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); } diff --git a/css/theme/serif.css b/css/theme/serif.css new file mode 100644 index 0000000..734de56 --- /dev/null +++ b/css/theme/serif.css @@ -0,0 +1,132 @@ +/** + * A simple theme for reveal.js presentations, similar + * to the default theme. The accent color is brown. + * + * This theme is Copyright (C) 2012-2013 Owen Versteeg, http://owenversteeg.com - it is MIT licensed. + */ +.reveal a:not(.image) { + line-height: 1.3em; } + +/********************************************* + * GLOBAL STYLES + *********************************************/ +body { + background: #f0f1eb; + background-color: #f0f1eb; } + +.reveal { + font-family: "Palatino Linotype", "Book Antiqua", Palatino, FreeSerif, serif; + font-size: 36px; + font-weight: 200; + letter-spacing: -0.02em; + color: black; } + +::selection { + color: white; + background: #26351c; + text-shadow: none; } + +/********************************************* + * HEADERS + *********************************************/ +.reveal h1, +.reveal h2, +.reveal h3, +.reveal h4, +.reveal h5, +.reveal h6 { + margin: 0 0 20px 0; + color: #383d3d; + font-family: "Palatino Linotype", "Book Antiqua", Palatino, FreeSerif, serif; + line-height: 0.9em; + letter-spacing: 0.02em; + text-transform: none; + text-shadow: none; } + +.reveal h1 { + text-shadow: 0px 0px 6px rgba(0, 0, 0, 0.2); } + +/********************************************* + * LINKS + *********************************************/ +.reveal a:not(.image) { + color: #51483d; + text-decoration: none; + -webkit-transition: color .15s ease; + -moz-transition: color .15s ease; + -ms-transition: color .15s ease; + -o-transition: color .15s ease; + transition: color .15s ease; } + +.reveal a:not(.image):hover { + color: #8b7c69; + text-shadow: none; + border: none; } + +.reveal .roll span:after { + color: #fff; + background: #25211c; } + +/********************************************* + * IMAGES + *********************************************/ +.reveal section img { + margin: 15px 0px; + background: rgba(255, 255, 255, 0.12); + border: 4px solid black; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); + -webkit-transition: all .2s linear; + -moz-transition: all .2s linear; + -ms-transition: all .2s linear; + -o-transition: all .2s linear; + transition: all .2s linear; } + +.reveal a:hover img { + background: rgba(255, 255, 255, 0.2); + border-color: #51483d; + box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); } + +/********************************************* + * NAVIGATION CONTROLS + *********************************************/ +.reveal .controls div.navigate-left, +.reveal .controls div.navigate-left.enabled { + border-right-color: #51483d; } + +.reveal .controls div.navigate-right, +.reveal .controls div.navigate-right.enabled { + border-left-color: #51483d; } + +.reveal .controls div.navigate-up, +.reveal .controls div.navigate-up.enabled { + border-bottom-color: #51483d; } + +.reveal .controls div.navigate-down, +.reveal .controls div.navigate-down.enabled { + border-top-color: #51483d; } + +.reveal .controls div.navigate-left.enabled:hover { + border-right-color: #8b7c69; } + +.reveal .controls div.navigate-right.enabled:hover { + border-left-color: #8b7c69; } + +.reveal .controls div.navigate-up.enabled:hover { + border-bottom-color: #8b7c69; } + +.reveal .controls div.navigate-down.enabled:hover { + border-top-color: #8b7c69; } + +/********************************************* + * PROGRESS BAR + *********************************************/ +.reveal .progress { + background: rgba(0, 0, 0, 0.2); } + +.reveal .progress span { + background: #51483d; + -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + -ms-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + -o-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); } diff --git a/css/theme/simple.css b/css/theme/simple.css new file mode 100644 index 0000000..b8f31bc --- /dev/null +++ b/css/theme/simple.css @@ -0,0 +1,132 @@ +@import url(https://fonts.googleapis.com/css?family=News+Cycle:400,700); +@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); +/** + * A simple theme for reveal.js presentations, similar + * to the default theme. The accent color is darkblue. + * + * This theme is Copyright (C) 2012 Owen Versteeg, https://github.com/StereotypicalApps. It is MIT licensed. + * reveal.js is Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se + */ +/********************************************* + * GLOBAL STYLES + *********************************************/ +body { + background: white; + background-color: white; } + +.reveal { + font-family: "Lato", sans-serif; + font-size: 36px; + font-weight: 200; + letter-spacing: -0.02em; + color: black; } + +::selection { + color: white; + background: rgba(0, 0, 0, 0.99); + text-shadow: none; } + +/********************************************* + * HEADERS + *********************************************/ +.reveal h1, +.reveal h2, +.reveal h3, +.reveal h4, +.reveal h5, +.reveal h6 { + margin: 0 0 20px 0; + color: black; + font-family: "News Cycle", Impact, sans-serif; + line-height: 0.9em; + letter-spacing: 0.02em; + text-transform: none; + text-shadow: none; } + +.reveal h1 { + text-shadow: 0px 0px 6px rgba(0, 0, 0, 0.2); } + +/********************************************* + * LINKS + *********************************************/ +.reveal a:not(.image) { + color: darkblue; + text-decoration: none; + -webkit-transition: color .15s ease; + -moz-transition: color .15s ease; + -ms-transition: color .15s ease; + -o-transition: color .15s ease; + transition: color .15s ease; } + +.reveal a:not(.image):hover { + color: #0000f1; + text-shadow: none; + border: none; } + +.reveal .roll span:after { + color: #fff; + background: #00003f; } + +/********************************************* + * IMAGES + *********************************************/ +.reveal section img { + margin: 15px 0px; + background: rgba(255, 255, 255, 0.12); + border: 4px solid black; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); + -webkit-transition: all .2s linear; + -moz-transition: all .2s linear; + -ms-transition: all .2s linear; + -o-transition: all .2s linear; + transition: all .2s linear; } + +.reveal a:hover img { + background: rgba(255, 255, 255, 0.2); + border-color: darkblue; + box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); } + +/********************************************* + * NAVIGATION CONTROLS + *********************************************/ +.reveal .controls div.navigate-left, +.reveal .controls div.navigate-left.enabled { + border-right-color: darkblue; } + +.reveal .controls div.navigate-right, +.reveal .controls div.navigate-right.enabled { + border-left-color: darkblue; } + +.reveal .controls div.navigate-up, +.reveal .controls div.navigate-up.enabled { + border-bottom-color: darkblue; } + +.reveal .controls div.navigate-down, +.reveal .controls div.navigate-down.enabled { + border-top-color: darkblue; } + +.reveal .controls div.navigate-left.enabled:hover { + border-right-color: #0000f1; } + +.reveal .controls div.navigate-right.enabled:hover { + border-left-color: #0000f1; } + +.reveal .controls div.navigate-up.enabled:hover { + border-bottom-color: #0000f1; } + +.reveal .controls div.navigate-down.enabled:hover { + border-top-color: #0000f1; } + +/********************************************* + * PROGRESS BAR + *********************************************/ +.reveal .progress { + background: rgba(0, 0, 0, 0.2); } + +.reveal .progress span { + background: darkblue; + -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + -ms-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + -o-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); } diff --git a/css/theme/sky.css b/css/theme/sky.css new file mode 100644 index 0000000..35d048e --- /dev/null +++ b/css/theme/sky.css @@ -0,0 +1,139 @@ +@import url(https://fonts.googleapis.com/css?family=Quicksand:400,700,400italic,700italic); +@import url(https://fonts.googleapis.com/css?family=Open+Sans:400italic,700italic,400,700); +/** + * Sky theme for reveal.js. + * + * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se + */ +.reveal a:not(.image) { + line-height: 1.3em; } + +/********************************************* + * GLOBAL STYLES + *********************************************/ +body { + background: #add9e4; + background: -moz-radial-gradient(center, circle cover, #f7fbfc 0%, #add9e4 100%); + background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%, #f7fbfc), color-stop(100%, #add9e4)); + background: -webkit-radial-gradient(center, circle cover, #f7fbfc 0%, #add9e4 100%); + background: -o-radial-gradient(center, circle cover, #f7fbfc 0%, #add9e4 100%); + background: -ms-radial-gradient(center, circle cover, #f7fbfc 0%, #add9e4 100%); + background: radial-gradient(center, circle cover, #f7fbfc 0%, #add9e4 100%); + background-color: #f7fbfc; } + +.reveal { + font-family: "Open Sans", sans-serif; + font-size: 36px; + font-weight: 200; + letter-spacing: -0.02em; + color: #333333; } + +::selection { + color: white; + background: #134674; + text-shadow: none; } + +/********************************************* + * HEADERS + *********************************************/ +.reveal h1, +.reveal h2, +.reveal h3, +.reveal h4, +.reveal h5, +.reveal h6 { + margin: 0 0 20px 0; + color: #333333; + font-family: "Quicksand", sans-serif; + line-height: 0.9em; + letter-spacing: -0.08em; + text-transform: uppercase; + text-shadow: none; } + +.reveal h1 { + text-shadow: 0px 0px 6px rgba(0, 0, 0, 0.2); } + +/********************************************* + * LINKS + *********************************************/ +.reveal a:not(.image) { + color: #3b759e; + text-decoration: none; + -webkit-transition: color .15s ease; + -moz-transition: color .15s ease; + -ms-transition: color .15s ease; + -o-transition: color .15s ease; + transition: color .15s ease; } + +.reveal a:not(.image):hover { + color: #74a7cb; + text-shadow: none; + border: none; } + +.reveal .roll span:after { + color: #fff; + background: #264c66; } + +/********************************************* + * IMAGES + *********************************************/ +.reveal section img { + margin: 15px 0px; + background: rgba(255, 255, 255, 0.12); + border: 4px solid #333333; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); + -webkit-transition: all .2s linear; + -moz-transition: all .2s linear; + -ms-transition: all .2s linear; + -o-transition: all .2s linear; + transition: all .2s linear; } + +.reveal a:hover img { + background: rgba(255, 255, 255, 0.2); + border-color: #3b759e; + box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); } + +/********************************************* + * NAVIGATION CONTROLS + *********************************************/ +.reveal .controls div.navigate-left, +.reveal .controls div.navigate-left.enabled { + border-right-color: #3b759e; } + +.reveal .controls div.navigate-right, +.reveal .controls div.navigate-right.enabled { + border-left-color: #3b759e; } + +.reveal .controls div.navigate-up, +.reveal .controls div.navigate-up.enabled { + border-bottom-color: #3b759e; } + +.reveal .controls div.navigate-down, +.reveal .controls div.navigate-down.enabled { + border-top-color: #3b759e; } + +.reveal .controls div.navigate-left.enabled:hover { + border-right-color: #74a7cb; } + +.reveal .controls div.navigate-right.enabled:hover { + border-left-color: #74a7cb; } + +.reveal .controls div.navigate-up.enabled:hover { + border-bottom-color: #74a7cb; } + +.reveal .controls div.navigate-down.enabled:hover { + border-top-color: #74a7cb; } + +/********************************************* + * PROGRESS BAR + *********************************************/ +.reveal .progress { + background: rgba(0, 0, 0, 0.2); } + +.reveal .progress span { + background: #3b759e; + -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + -ms-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + -o-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); } diff --git a/css/theme/solarized.css b/css/theme/solarized.css new file mode 100644 index 0000000..17c3205 --- /dev/null +++ b/css/theme/solarized.css @@ -0,0 +1,142 @@ +@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); +/** + * Solarized Light theme for reveal.js. + * Author: Achim Staebler + */ +@font-face { + font-family: 'League Gothic'; + src: url("../../lib/font/league_gothic-webfont.eot"); + src: url("../../lib/font/league_gothic-webfont.eot?#iefix") format("embedded-opentype"), url("../../lib/font/league_gothic-webfont.woff") format("woff"), url("../../lib/font/league_gothic-webfont.ttf") format("truetype"), url("../../lib/font/league_gothic-webfont.svg#LeagueGothicRegular") format("svg"); + font-weight: normal; + font-style: normal; } + +/** + * Solarized colors by Ethan Schoonover + */ +html * { + color-profile: sRGB; + rendering-intent: auto; } + +/********************************************* + * GLOBAL STYLES + *********************************************/ +body { + background: #fdf6e3; + background-color: #fdf6e3; } + +.reveal { + font-family: "Lato", sans-serif; + font-size: 36px; + font-weight: 200; + letter-spacing: -0.02em; + color: #657b83; } + +::selection { + color: white; + background: #d33682; + text-shadow: none; } + +/********************************************* + * HEADERS + *********************************************/ +.reveal h1, +.reveal h2, +.reveal h3, +.reveal h4, +.reveal h5, +.reveal h6 { + margin: 0 0 20px 0; + color: #586e75; + font-family: "League Gothic", Impact, sans-serif; + line-height: 0.9em; + letter-spacing: 0.02em; + text-transform: uppercase; + text-shadow: none; } + +.reveal h1 { + text-shadow: 0px 0px 6px rgba(0, 0, 0, 0.2); } + +/********************************************* + * LINKS + *********************************************/ +.reveal a:not(.image) { + color: #268bd2; + text-decoration: none; + -webkit-transition: color .15s ease; + -moz-transition: color .15s ease; + -ms-transition: color .15s ease; + -o-transition: color .15s ease; + transition: color .15s ease; } + +.reveal a:not(.image):hover { + color: #78b9e6; + text-shadow: none; + border: none; } + +.reveal .roll span:after { + color: #fff; + background: #1a6091; } + +/********************************************* + * IMAGES + *********************************************/ +.reveal section img { + margin: 15px 0px; + background: rgba(255, 255, 255, 0.12); + border: 4px solid #657b83; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); + -webkit-transition: all .2s linear; + -moz-transition: all .2s linear; + -ms-transition: all .2s linear; + -o-transition: all .2s linear; + transition: all .2s linear; } + +.reveal a:hover img { + background: rgba(255, 255, 255, 0.2); + border-color: #268bd2; + box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); } + +/********************************************* + * NAVIGATION CONTROLS + *********************************************/ +.reveal .controls div.navigate-left, +.reveal .controls div.navigate-left.enabled { + border-right-color: #268bd2; } + +.reveal .controls div.navigate-right, +.reveal .controls div.navigate-right.enabled { + border-left-color: #268bd2; } + +.reveal .controls div.navigate-up, +.reveal .controls div.navigate-up.enabled { + border-bottom-color: #268bd2; } + +.reveal .controls div.navigate-down, +.reveal .controls div.navigate-down.enabled { + border-top-color: #268bd2; } + +.reveal .controls div.navigate-left.enabled:hover { + border-right-color: #78b9e6; } + +.reveal .controls div.navigate-right.enabled:hover { + border-left-color: #78b9e6; } + +.reveal .controls div.navigate-up.enabled:hover { + border-bottom-color: #78b9e6; } + +.reveal .controls div.navigate-down.enabled:hover { + border-top-color: #78b9e6; } + +/********************************************* + * PROGRESS BAR + *********************************************/ +.reveal .progress { + background: rgba(0, 0, 0, 0.2); } + +.reveal .progress span { + background: #268bd2; + -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + -ms-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + -o-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); } diff --git a/css/theme/source/beige.scss b/css/theme/source/beige.scss new file mode 100644 index 0000000..c31956c --- /dev/null +++ b/css/theme/source/beige.scss @@ -0,0 +1,50 @@ +/** + * Beige theme for reveal.js. + * + * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se + */ + + +// Default mixins and settings ----------------- +@import "../template/mixins"; +@import "../template/settings"; +// --------------------------------------------- + + + +// Include theme-specific fonts +@font-face { + font-family: 'League Gothic'; + src: url('../../lib/font/league_gothic-webfont.eot'); + src: url('../../lib/font/league_gothic-webfont.eot?#iefix') format('embedded-opentype'), + url('../../lib/font/league_gothic-webfont.woff') format('woff'), + url('../../lib/font/league_gothic-webfont.ttf') format('truetype'), + url('../../lib/font/league_gothic-webfont.svg#LeagueGothicRegular') format('svg'); + + font-weight: normal; + font-style: normal; +} + +@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); + + +// Override theme settings (see ../template/settings.scss) +$mainColor: #333; +$headingColor: #333; +$headingTextShadow: none; +$backgroundColor: #f7f3de; +$linkColor: #8b743d; +$linkColorHover: lighten( $linkColor, 20% ); +$selectionBackgroundColor: rgba(79, 64, 28, 0.99); +$heading1TextShadow: 0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaa, 0 6px 1px rgba(0,0,0,.1), 0 0 5px rgba(0,0,0,.1), 0 1px 3px rgba(0,0,0,.3), 0 3px 5px rgba(0,0,0,.2), 0 5px 10px rgba(0,0,0,.25), 0 20px 20px rgba(0,0,0,.15); + +// Background generator +@mixin bodyBackground() { + @include radial-gradient( rgba(247,242,211,1), rgba(255,255,255,1) ); +} + + + +// Theme template ------------------------------ +@import "../template/theme"; +// --------------------------------------------- \ No newline at end of file diff --git a/css/theme/source/default.scss b/css/theme/source/default.scss new file mode 100644 index 0000000..1117b65 --- /dev/null +++ b/css/theme/source/default.scss @@ -0,0 +1,42 @@ +/** + * Default theme for reveal.js. + * + * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se + */ + + +// Default mixins and settings ----------------- +@import "../template/mixins"; +@import "../template/settings"; +// --------------------------------------------- + + + +// Include theme-specific fonts +@font-face { + font-family: 'League Gothic'; + src: url('../../lib/font/league_gothic-webfont.eot'); + src: url('../../lib/font/league_gothic-webfont.eot?#iefix') format('embedded-opentype'), + url('../../lib/font/league_gothic-webfont.woff') format('woff'), + url('../../lib/font/league_gothic-webfont.ttf') format('truetype'), + url('../../lib/font/league_gothic-webfont.svg#LeagueGothicRegular') format('svg'); + + font-weight: normal; + font-style: normal; +} + +@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); + +// Override theme settings (see ../template/settings.scss) +$heading1TextShadow: 0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaa, 0 6px 1px rgba(0,0,0,.1), 0 0 5px rgba(0,0,0,.1), 0 1px 3px rgba(0,0,0,.3), 0 3px 5px rgba(0,0,0,.2), 0 5px 10px rgba(0,0,0,.25), 0 20px 20px rgba(0,0,0,.15); + +// Background generator +@mixin bodyBackground() { + @include radial-gradient( rgba(28,30,32,1), rgba(85,90,95,1) ); +} + + + +// Theme template ------------------------------ +@import "../template/theme"; +// --------------------------------------------- \ No newline at end of file diff --git a/css/theme/source/moon.scss b/css/theme/source/moon.scss new file mode 100644 index 0000000..a722adc --- /dev/null +++ b/css/theme/source/moon.scss @@ -0,0 +1,68 @@ +/** + * Solarized Dark theme for reveal.js. + * Author: Achim Staebler + */ + + +// Default mixins and settings ----------------- +@import "../template/mixins"; +@import "../template/settings"; +// --------------------------------------------- + + + +// Include theme-specific fonts +@font-face { + font-family: 'League Gothic'; + src: url('../../lib/font/league_gothic-webfont.eot'); + src: url('../../lib/font/league_gothic-webfont.eot?#iefix') format('embedded-opentype'), + url('../../lib/font/league_gothic-webfont.woff') format('woff'), + url('../../lib/font/league_gothic-webfont.ttf') format('truetype'), + url('../../lib/font/league_gothic-webfont.svg#LeagueGothicRegular') format('svg'); + + font-weight: normal; + font-style: normal; +} + +@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); + +/** + * Solarized colors by Ethan Schoonover + */ +html * { + color-profile: sRGB; + rendering-intent: auto; +} + +// Solarized colors +$base03: #002b36; +$base02: #073642; +$base01: #586e75; +$base00: #657b83; +$base0: #839496; +$base1: #93a1a1; +$base2: #eee8d5; +$base3: #fdf6e3; +$yellow: #b58900; +$orange: #cb4b16; +$red: #dc322f; +$magenta: #d33682; +$violet: #6c71c4; +$blue: #268bd2; +$cyan: #2aa198; +$green: #859900; + +// Override theme settings (see ../template/settings.scss) +$mainColor: $base1; +$headingColor: $base2; +$headingTextShadow: none; +$backgroundColor: $base03; +$linkColor: $blue; +$linkColorHover: lighten( $linkColor, 20% ); +$selectionBackgroundColor: $magenta; + + + +// Theme template ------------------------------ +@import "../template/theme"; +// --------------------------------------------- diff --git a/css/theme/source/night.scss b/css/theme/source/night.scss new file mode 100644 index 0000000..b0cb57f --- /dev/null +++ b/css/theme/source/night.scss @@ -0,0 +1,35 @@ +/** + * Black theme for reveal.js. + * + * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se + */ + + +// Default mixins and settings ----------------- +@import "../template/mixins"; +@import "../template/settings"; +// --------------------------------------------- + + +// Include theme-specific fonts +@import url(https://fonts.googleapis.com/css?family=Montserrat:700); +@import url(https://fonts.googleapis.com/css?family=Open+Sans:400,700,400italic,700italic); + + +// Override theme settings (see ../template/settings.scss) +$backgroundColor: #111; + +$mainFont: 'Open Sans', sans-serif; +$linkColor: #e7ad52; +$linkColorHover: lighten( $linkColor, 20% ); +$headingFont: 'Montserrat', Impact, sans-serif; +$headingTextShadow: none; +$headingLetterSpacing: -0.03em; +$headingTextTransform: none; +$selectionBackgroundColor: #e7ad52; +$mainFontSize: 30px; + + +// Theme template ------------------------------ +@import "../template/theme"; +// --------------------------------------------- \ No newline at end of file diff --git a/css/theme/source/serif.scss b/css/theme/source/serif.scss new file mode 100644 index 0000000..404b8bf --- /dev/null +++ b/css/theme/source/serif.scss @@ -0,0 +1,35 @@ +/** + * A simple theme for reveal.js presentations, similar + * to the default theme. The accent color is brown. + * + * This theme is Copyright (C) 2012-2013 Owen Versteeg, http://owenversteeg.com - it is MIT licensed. + */ + + +// Default mixins and settings ----------------- +@import "../template/mixins"; +@import "../template/settings"; +// --------------------------------------------- + + + +// Override theme settings (see ../template/settings.scss) +$mainFont: 'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif; +$mainColor: #000; +$headingFont: 'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif; +$headingColor: #383D3D; +$headingTextShadow: none; +$headingTextTransform: none; +$backgroundColor: #F0F1EB; +$linkColor: #51483D; +$linkColorHover: lighten( $linkColor, 20% ); +$selectionBackgroundColor: #26351C; + +.reveal a:not(.image) { + line-height: 1.3em; +} + + +// Theme template ------------------------------ +@import "../template/theme"; +// --------------------------------------------- diff --git a/css/theme/source/simple.scss b/css/theme/source/simple.scss new file mode 100644 index 0000000..84c7d9b --- /dev/null +++ b/css/theme/source/simple.scss @@ -0,0 +1,38 @@ +/** + * A simple theme for reveal.js presentations, similar + * to the default theme. The accent color is darkblue. + * + * This theme is Copyright (C) 2012 Owen Versteeg, https://github.com/StereotypicalApps. It is MIT licensed. + * reveal.js is Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se + */ + + +// Default mixins and settings ----------------- +@import "../template/mixins"; +@import "../template/settings"; +// --------------------------------------------- + + + +// Include theme-specific fonts +@import url(https://fonts.googleapis.com/css?family=News+Cycle:400,700); +@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); + + +// Override theme settings (see ../template/settings.scss) +$mainFont: 'Lato', sans-serif; +$mainColor: #000; +$headingFont: 'News Cycle', Impact, sans-serif; +$headingColor: #000; +$headingTextShadow: none; +$headingTextTransform: none; +$backgroundColor: #fff; +$linkColor: #00008B; +$linkColorHover: lighten( $linkColor, 20% ); +$selectionBackgroundColor: rgba(0, 0, 0, 0.99); + + + +// Theme template ------------------------------ +@import "../template/theme"; +// --------------------------------------------- \ No newline at end of file diff --git a/css/theme/source/sky.scss b/css/theme/source/sky.scss new file mode 100644 index 0000000..72a3a90 --- /dev/null +++ b/css/theme/source/sky.scss @@ -0,0 +1,46 @@ +/** + * Sky theme for reveal.js. + * + * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se + */ + + +// Default mixins and settings ----------------- +@import "../template/mixins"; +@import "../template/settings"; +// --------------------------------------------- + + + +// Include theme-specific fonts +@import url(https://fonts.googleapis.com/css?family=Quicksand:400,700,400italic,700italic); +@import url(https://fonts.googleapis.com/css?family=Open+Sans:400italic,700italic,400,700); + + +// Override theme settings (see ../template/settings.scss) +$mainFont: 'Open Sans', sans-serif; +$mainColor: #333; +$headingFont: 'Quicksand', sans-serif; +$headingColor: #333; +$headingLetterSpacing: -0.08em; +$headingTextShadow: none; +$backgroundColor: #f7fbfc; +$linkColor: #3b759e; +$linkColorHover: lighten( $linkColor, 20% ); +$selectionBackgroundColor: #134674; + +// Fix links so they are not cut off +.reveal a:not(.image) { + line-height: 1.3em; +} + +// Background generator +@mixin bodyBackground() { + @include radial-gradient( #add9e4, #f7fbfc ); +} + + + +// Theme template ------------------------------ +@import "../template/theme"; +// --------------------------------------------- diff --git a/css/theme/source/solarized.scss b/css/theme/source/solarized.scss new file mode 100644 index 0000000..8217b8f --- /dev/null +++ b/css/theme/source/solarized.scss @@ -0,0 +1,74 @@ +/** + * Solarized Light theme for reveal.js. + * Author: Achim Staebler + */ + + +// Default mixins and settings ----------------- +@import "../template/mixins"; +@import "../template/settings"; +// --------------------------------------------- + + + +// Include theme-specific fonts +@font-face { + font-family: 'League Gothic'; + src: url('../../lib/font/league_gothic-webfont.eot'); + src: url('../../lib/font/league_gothic-webfont.eot?#iefix') format('embedded-opentype'), + url('../../lib/font/league_gothic-webfont.woff') format('woff'), + url('../../lib/font/league_gothic-webfont.ttf') format('truetype'), + url('../../lib/font/league_gothic-webfont.svg#LeagueGothicRegular') format('svg'); + + font-weight: normal; + font-style: normal; +} + +@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); + + +/** + * Solarized colors by Ethan Schoonover + */ +html * { + color-profile: sRGB; + rendering-intent: auto; +} + +// Solarized colors +$base03: #002b36; +$base02: #073642; +$base01: #586e75; +$base00: #657b83; +$base0: #839496; +$base1: #93a1a1; +$base2: #eee8d5; +$base3: #fdf6e3; +$yellow: #b58900; +$orange: #cb4b16; +$red: #dc322f; +$magenta: #d33682; +$violet: #6c71c4; +$blue: #268bd2; +$cyan: #2aa198; +$green: #859900; + +// Override theme settings (see ../template/settings.scss) +$mainColor: $base00; +$headingColor: $base01; +$headingTextShadow: none; +$backgroundColor: $base3; +$linkColor: $blue; +$linkColorHover: lighten( $linkColor, 20% ); +$selectionBackgroundColor: $magenta; + +// Background generator +// @mixin bodyBackground() { +// @include radial-gradient( rgba($base3,1), rgba(lighten($base3, 20%),1) ); +// } + + + +// Theme template ------------------------------ +@import "../template/theme"; +// --------------------------------------------- diff --git a/css/theme/template/mixins.scss b/css/theme/template/mixins.scss new file mode 100644 index 0000000..e0c5606 --- /dev/null +++ b/css/theme/template/mixins.scss @@ -0,0 +1,29 @@ +@mixin vertical-gradient( $top, $bottom ) { + background: $top; + background: -moz-linear-gradient( top, $top 0%, $bottom 100% ); + background: -webkit-gradient( linear, left top, left bottom, color-stop(0%,$top), color-stop(100%,$bottom) ); + background: -webkit-linear-gradient( top, $top 0%, $bottom 100% ); + background: -o-linear-gradient( top, $top 0%, $bottom 100% ); + background: -ms-linear-gradient( top, $top 0%, $bottom 100% ); + background: linear-gradient( top, $top 0%, $bottom 100% ); +} + +@mixin horizontal-gradient( $top, $bottom ) { + background: $top; + background: -moz-linear-gradient( left, $top 0%, $bottom 100% ); + background: -webkit-gradient( linear, left top, right top, color-stop(0%,$top), color-stop(100%,$bottom) ); + background: -webkit-linear-gradient( left, $top 0%, $bottom 100% ); + background: -o-linear-gradient( left, $top 0%, $bottom 100% ); + background: -ms-linear-gradient( left, $top 0%, $bottom 100% ); + background: linear-gradient( left, $top 0%, $bottom 100% ); +} + +@mixin radial-gradient( $outer, $inner, $type: circle ) { + background: $outer; + background: -moz-radial-gradient( center, $type cover, $inner 0%, $outer 100% ); + background: -webkit-gradient( radial, center center, 0px, center center, 100%, color-stop(0%,$inner), color-stop(100%,$outer) ); + background: -webkit-radial-gradient( center, $type cover, $inner 0%, $outer 100% ); + background: -o-radial-gradient( center, $type cover, $inner 0%, $outer 100% ); + background: -ms-radial-gradient( center, $type cover, $inner 0%, $outer 100% ); + background: radial-gradient( center, $type cover, $inner 0%, $outer 100% ); +} \ No newline at end of file diff --git a/css/theme/template/settings.scss b/css/theme/template/settings.scss new file mode 100644 index 0000000..7e9ffd8 --- /dev/null +++ b/css/theme/template/settings.scss @@ -0,0 +1,33 @@ +// Base settings for all themes that can optionally be +// overridden by the super-theme + +// Background of the presentation +$backgroundColor: #2b2b2b; + +// Primary/body text +$mainFont: 'Lato', sans-serif; +$mainFontSize: 36px; +$mainColor: #eee; + +// Headings +$headingFont: 'League Gothic', Impact, sans-serif; +$headingColor: #eee; +$headingLineHeight: 0.9em; +$headingLetterSpacing: 0.02em; +$headingTextTransform: uppercase; +$headingTextShadow: 0px 0px 6px rgba(0,0,0,0.2); +$heading1TextShadow: $headingTextShadow; + +// Links and actions +$linkColor: #13DAEC; +$linkColorHover: lighten( $linkColor, 20% ); + +// Text selection +$selectionBackgroundColor: #FF5E99; +$selectionColor: #fff; + +// Generates the presentation background, can be overridden +// to return a background image or gradient +@mixin bodyBackground() { + background: $backgroundColor; +} \ No newline at end of file diff --git a/css/theme/template/theme.scss b/css/theme/template/theme.scss new file mode 100644 index 0000000..96148e3 --- /dev/null +++ b/css/theme/template/theme.scss @@ -0,0 +1,163 @@ +// Base theme template for reveal.js + +/********************************************* + * GLOBAL STYLES + *********************************************/ + +body { + @include bodyBackground(); + background-color: $backgroundColor; +} + +.reveal { + font-family: $mainFont; + font-size: $mainFontSize; + font-weight: 200; + letter-spacing: -0.02em; + color: $mainColor; +} + +::selection { + color: $selectionColor; + background: $selectionBackgroundColor; + text-shadow: none; +} + +/********************************************* + * HEADERS + *********************************************/ + +.reveal h1, +.reveal h2, +.reveal h3, +.reveal h4, +.reveal h5, +.reveal h6 { + margin: 0 0 20px 0; + color: $headingColor; + + font-family: $headingFont; + line-height: $headingLineHeight; + letter-spacing: $headingLetterSpacing; + + text-transform: $headingTextTransform; + text-shadow: $headingTextShadow; +} + +.reveal h1 { + text-shadow: $heading1TextShadow; +} + + +/********************************************* + * LINKS + *********************************************/ + +.reveal a:not(.image) { + color: $linkColor; + text-decoration: none; + + -webkit-transition: color .15s ease; + -moz-transition: color .15s ease; + -ms-transition: color .15s ease; + -o-transition: color .15s ease; + transition: color .15s ease; +} + .reveal a:not(.image):hover { + color: $linkColorHover; + + text-shadow: none; + border: none; + } + +.reveal .roll span:after { + color: #fff; + background: darken( $linkColor, 15% ); +} + + +/********************************************* + * IMAGES + *********************************************/ + +.reveal section img { + margin: 15px 0px; + background: rgba(255,255,255,0.12); + border: 4px solid $mainColor; + + box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); + + -webkit-transition: all .2s linear; + -moz-transition: all .2s linear; + -ms-transition: all .2s linear; + -o-transition: all .2s linear; + transition: all .2s linear; +} + + .reveal a:hover img { + background: rgba(255,255,255,0.2); + border-color: $linkColor; + + box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); + } + + +/********************************************* + * NAVIGATION CONTROLS + *********************************************/ + +.reveal .controls div.navigate-left, +.reveal .controls div.navigate-left.enabled { + border-right-color: $linkColor; +} + +.reveal .controls div.navigate-right, +.reveal .controls div.navigate-right.enabled { + border-left-color: $linkColor; +} + +.reveal .controls div.navigate-up, +.reveal .controls div.navigate-up.enabled { + border-bottom-color: $linkColor; +} + +.reveal .controls div.navigate-down, +.reveal .controls div.navigate-down.enabled { + border-top-color: $linkColor; +} + +.reveal .controls div.navigate-left.enabled:hover { + border-right-color: $linkColorHover; +} + +.reveal .controls div.navigate-right.enabled:hover { + border-left-color: $linkColorHover; +} + +.reveal .controls div.navigate-up.enabled:hover { + border-bottom-color: $linkColorHover; +} + +.reveal .controls div.navigate-down.enabled:hover { + border-top-color: $linkColorHover; +} + + +/********************************************* + * PROGRESS BAR + *********************************************/ + +.reveal .progress { + background: rgba(0,0,0,0.2); +} + .reveal .progress span { + background: $linkColor; + + -webkit-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985); + -moz-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985); + -ms-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985); + -o-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985); + transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985); + } + + diff --git a/js/reveal.js b/js/reveal.js new file mode 100644 index 0000000..033fe31 --- /dev/null +++ b/js/reveal.js @@ -0,0 +1,2577 @@ +/*! + * reveal.js + * http://lab.hakim.se/reveal-js + * MIT licensed + * + * Copyright (C) 2013 Hakim El Hattab, http://hakim.se + */ +var Reveal = (function(){ + + 'use strict'; + + var SLIDES_SELECTOR = '.reveal .slides section', + HORIZONTAL_SLIDES_SELECTOR = '.reveal .slides>section', + VERTICAL_SLIDES_SELECTOR = '.reveal .slides>section.present>section', + HOME_SLIDE_SELECTOR = '.reveal .slides>section:first-child', + + // Configurations defaults, can be overridden at initialization time + config = { + + // The "normal" size of the presentation, aspect ratio will be preserved + // when the presentation is scaled to fit different resolutions + width: 960, + height: 700, + + // Factor of the display size that should remain empty around the content + margin: 0.1, + + // Bounds for smallest/largest possible scale to apply to content + minScale: 0.2, + maxScale: 1.0, + + // Display controls in the bottom right corner + controls: true, + + // Display a presentation progress bar + progress: true, + + // Push each slide change to the browser history + history: false, + + // Enable keyboard shortcuts for navigation + keyboard: true, + + // Enable the slide overview mode + overview: true, + + // Vertical centring of slides + center: true, + + // Enables touch navigation on devices with touch input + touch: true, + + // Loop the presentation + loop: false, + + // Change the presentation direction to be RTL + rtl: false, + + // Turns fragments on and off globally + fragments: true, + + // Number of milliseconds between automatically proceeding to the + // next slide, disabled when set to 0, this value can be overwritten + // by using a data-autoslide attribute on your slides + autoSlide: 0, + + // Enable slide navigation via mouse wheel + mouseWheel: false, + + // Apply a 3D roll to links on hover + rollingLinks: true, + + // Opens links in an iframe preview overlay + previewLinks: false, + + // Theme (see /css/theme) + theme: null, + + // Transition style + transition: 'default', // default/cube/page/concave/zoom/linear/fade/none + + // Transition speed + transitionSpeed: 'default', // default/fast/slow + + // Transition style for full page slide backgrounds + backgroundTransition: 'default', // default/linear + + // Script dependencies to load + dependencies: [] + }, + + // The current auto-slide duration + autoSlide = 0, + + // The horizontal and vertical index of the currently active slide + indexh = 0, + indexv = 0, + + // The previous and current slide HTML elements + previousSlide, + currentSlide, + + // Slides may hold a data-state attribute which we pick up and apply + // as a class to the body. This list contains the combined state of + // all current slides. + state = [], + + // The current scale of the presentation (see width/height config) + scale = 1, + + // Cached references to DOM elements + dom = {}, + + // Detect support for CSS 3D transforms + supports3DTransforms = 'WebkitPerspective' in document.body.style || + 'MozPerspective' in document.body.style || + 'msPerspective' in document.body.style || + 'OPerspective' in document.body.style || + 'perspective' in document.body.style, + + // Detect support for CSS 2D transforms + supports2DTransforms = 'WebkitTransform' in document.body.style || + 'MozTransform' in document.body.style || + 'msTransform' in document.body.style || + 'OTransform' in document.body.style || + 'transform' in document.body.style, + + // Throttles mouse wheel navigation + lastMouseWheelStep = 0, + + // An interval used to automatically move on to the next slide + autoSlideTimeout = 0, + + // Delays updates to the URL due to a Chrome thumbnailer bug + writeURLTimeout = 0, + + // A delay used to activate the overview mode + activateOverviewTimeout = 0, + + // A delay used to deactivate the overview mode + deactivateOverviewTimeout = 0, + + // Flags if the interaction event listeners are bound + eventsAreBound = false, + + // Holds information about the currently ongoing touch input + touch = { + startX: 0, + startY: 0, + startSpan: 0, + startCount: 0, + handled: false, + threshold: 80 + }; + + /** + * Starts up the presentation if the client is capable. + */ + function initialize( options ) { + + if( !supports2DTransforms && !supports3DTransforms ) { + document.body.setAttribute( 'class', 'no-transforms' ); + + // If the browser doesn't support core features we won't be + // using JavaScript to control the presentation + return; + } + + // Force a layout when the whole page, incl fonts, has loaded + window.addEventListener( 'load', layout, false ); + + // Copy options over to our config object + extend( config, options ); + + // Hide the address bar in mobile browsers + hideAddressBar(); + + // Loads the dependencies and continues to #start() once done + load(); + + } + + /** + * Finds and stores references to DOM elements which are + * required by the presentation. If a required element is + * not found, it is created. + */ + function setupDOM() { + + // Cache references to key DOM elements + dom.theme = document.querySelector( '#theme' ); + dom.wrapper = document.querySelector( '.reveal' ); + 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 + if( !dom.wrapper.querySelector( '.progress' ) ) { + var progressElement = document.createElement( 'div' ); + progressElement.classList.add( 'progress' ); + progressElement.innerHTML = ''; + dom.wrapper.appendChild( progressElement ); + } + + // Arrow controls + if( !dom.wrapper.querySelector( '.controls' ) ) { + var controlsElement = document.createElement( 'aside' ); + controlsElement.classList.add( 'controls' ); + controlsElement.innerHTML = '' + + '' + + '' + + ''; + dom.wrapper.appendChild( controlsElement ); + } + + // State background element [DEPRECATED] + if( !dom.wrapper.querySelector( '.state-background' ) ) { + var stateBackgroundElement = document.createElement( 'div' ); + stateBackgroundElement.classList.add( 'state-background' ); + dom.wrapper.appendChild( stateBackgroundElement ); + } + + // Overlay graphic which is displayed during the paused mode + if( !dom.wrapper.querySelector( '.pause-overlay' ) ) { + var pausedElement = document.createElement( 'div' ); + pausedElement.classList.add( 'pause-overlay' ); + dom.wrapper.appendChild( pausedElement ); + } + + // Cache references to elements + dom.progress = document.querySelector( '.reveal .progress' ); + dom.progressbar = document.querySelector( '.reveal .progress span' ); + + if ( config.controls ) { + dom.controls = document.querySelector( '.reveal .controls' ); + + // There can be multiple instances of controls throughout the page + dom.controlsLeft = toArray( document.querySelectorAll( '.navigate-left' ) ); + dom.controlsRight = toArray( document.querySelectorAll( '.navigate-right' ) ); + dom.controlsUp = toArray( document.querySelectorAll( '.navigate-up' ) ); + dom.controlsDown = toArray( document.querySelectorAll( '.navigate-down' ) ); + dom.controlsPrev = toArray( document.querySelectorAll( '.navigate-prev' ) ); + dom.controlsNext = toArray( document.querySelectorAll( '.navigate-next' ) ); + } + + } + + /** + * 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' ), + backgroundImage: slide.getAttribute( 'data-background-image' ), + backgroundColor: slide.getAttribute( 'data-background-color' ), + backgroundRepeat: slide.getAttribute( 'data-background-repeat' ), + backgroundPosition: slide.getAttribute( 'data-background-position' ), + backgroundTransition: slide.getAttribute( 'data-background-transition' ) + }; + + var element = document.createElement( 'div' ); + element.className = 'slide-background'; + + if( data.background ) { + // Auto-wrap image urls in url(...) + if( /^(http|file|\/\/)/gi.test( data.background ) || /\.(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.backgroundImage ) element.style.backgroundImage = 'url("' + data.backgroundImage + '")'; + if( data.backgroundColor ) element.style.backgroundColor = data.backgroundColor; + if( data.backgroundRepeat ) element.style.backgroundRepeat = data.backgroundRepeat; + if( data.backgroundPosition ) element.style.backgroundPosition = data.backgroundPosition; + if( data.backgroundTransition ) element.setAttribute( 'data-background-transition', data.backgroundTransition ); + + 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. + */ + function hideAddressBar() { + + if( /iphone|ipod|android/gi.test( navigator.userAgent ) && !/crios/gi.test( navigator.userAgent ) ) { + // Events that should trigger the address bar to hide + window.addEventListener( 'load', removeAddressBar, false ); + window.addEventListener( 'orientationchange', removeAddressBar, false ); + } + + } + + /** + * Loads the dependencies of reveal.js. Dependencies are + * defined via the configuration option 'dependencies' + * and will be loaded prior to starting/binding reveal.js. + * Some dependencies may have an 'async' flag, if so they + * will load after reveal.js has been started up. + */ + function load() { + + var scripts = [], + scriptsAsync = []; + + for( var i = 0, len = config.dependencies.length; i < len; i++ ) { + var s = config.dependencies[i]; + + // Load if there's no condition or the condition is truthy + if( !s.condition || s.condition() ) { + if( s.async ) { + scriptsAsync.push( s.src ); + } + else { + scripts.push( s.src ); + } + + // Extension may contain callback functions + if( typeof s.callback === 'function' ) { + head.ready( s.src.match( /([\w\d_\-]*)\.?js$|[^\\\/]*$/i )[0], s.callback ); + } + } + } + + // Called once synchronous scripts finish loading + function proceed() { + if( scriptsAsync.length ) { + // Load asynchronous scripts + head.js.apply( null, scriptsAsync ); + } + + start(); + } + + if( scripts.length ) { + head.ready( proceed ); + + // Load synchronous scripts + head.js.apply( null, scripts ); + } + else { + proceed(); + } + + } + + /** + * Starts up reveal.js by binding input events and navigating + * to the current URL deeplink if there is one. + */ + function start() { + + // Make sure we've got all the DOM elements we need + setupDOM(); + + // Updates the presentation to match the current configuration values + configure(); + + // Read the initial hash + readURL(); + + // Notify listeners that the presentation is ready but use a 1ms + // timeout to ensure it's not fired synchronously after #initialize() + setTimeout( function() { + dispatchEvent( 'ready', { + 'indexh': indexh, + 'indexv': indexv, + 'currentSlide': currentSlide + } ); + }, 1 ); + + } + + /** + * Applies the configuration settings from the config + * object. May be called multiple times. + */ + function configure( options ) { + + dom.wrapper.classList.remove( config.transition ); + + // New config options may be passed when this method + // is invoked through the API after initialization + if( typeof options === 'object' ) extend( config, options ); + + // Force linear transition based on browser capabilities + if( supports3DTransforms === false ) config.transition = 'linear'; + + dom.wrapper.classList.add( config.transition ); + + dom.wrapper.setAttribute( 'data-transition-speed', config.transitionSpeed ); + dom.wrapper.setAttribute( 'data-background-transition', config.backgroundTransition ); + + if( dom.controls ) { + dom.controls.style.display = ( config.controls && dom.controls ) ? 'block' : 'none'; + } + + if( dom.progress ) { + dom.progress.style.display = ( config.progress && dom.progress ) ? 'block' : 'none'; + } + + if( config.rtl ) { + dom.wrapper.classList.add( 'rtl' ); + } + else { + dom.wrapper.classList.remove( 'rtl' ); + } + + if( config.center ) { + dom.wrapper.classList.add( 'center' ); + } + else { + dom.wrapper.classList.remove( 'center' ); + } + + if( config.mouseWheel ) { + document.addEventListener( 'DOMMouseScroll', onDocumentMouseScroll, false ); // FF + document.addEventListener( 'mousewheel', onDocumentMouseScroll, false ); + } + else { + document.removeEventListener( 'DOMMouseScroll', onDocumentMouseScroll, false ); // FF + document.removeEventListener( 'mousewheel', onDocumentMouseScroll, false ); + } + + // Rolling 3D links + if( config.rollingLinks ) { + enableRollingLinks(); + } + else { + disableRollingLinks(); + } + + // Iframe link previews + if( config.previewLinks ) { + enablePreviewLinks(); + } + else { + disablePreviewLinks(); + enablePreviewLinks( '[data-preview-link]' ); + } + + // Load the theme in the config, if it's not already loaded + if( config.theme && dom.theme ) { + var themeURL = dom.theme.getAttribute( 'href' ); + var themeFinder = /[^\/]*?(?=\.css)/; + var themeName = themeURL.match(themeFinder)[0]; + + if( config.theme !== themeName ) { + themeURL = themeURL.replace(themeFinder, config.theme); + dom.theme.setAttribute( 'href', themeURL ); + } + } + + sync(); + + } + + /** + * Binds all event listeners. + */ + function addEventListeners() { + + eventsAreBound = true; + + window.addEventListener( 'hashchange', onWindowHashChange, false ); + window.addEventListener( 'resize', onWindowResize, false ); + + if( config.touch ) { + dom.wrapper.addEventListener( 'touchstart', onTouchStart, false ); + dom.wrapper.addEventListener( 'touchmove', onTouchMove, false ); + dom.wrapper.addEventListener( 'touchend', onTouchEnd, false ); + + // Support pointer-style touch interaction as well + if( window.navigator.msPointerEnabled ) { + dom.wrapper.addEventListener( 'MSPointerDown', onPointerDown, false ); + dom.wrapper.addEventListener( 'MSPointerMove', onPointerMove, false ); + dom.wrapper.addEventListener( 'MSPointerUp', onPointerUp, false ); + } + } + + if( config.keyboard ) { + document.addEventListener( 'keydown', onDocumentKeyDown, false ); + } + + if ( config.progress && dom.progress ) { + dom.progress.addEventListener( 'click', onProgressClicked, false ); + } + + if ( config.controls && dom.controls ) { + [ 'touchstart', 'click' ].forEach( function( eventName ) { + dom.controlsLeft.forEach( function( el ) { el.addEventListener( eventName, onNavigateLeftClicked, false ); } ); + dom.controlsRight.forEach( function( el ) { el.addEventListener( eventName, onNavigateRightClicked, false ); } ); + dom.controlsUp.forEach( function( el ) { el.addEventListener( eventName, onNavigateUpClicked, false ); } ); + dom.controlsDown.forEach( function( el ) { el.addEventListener( eventName, onNavigateDownClicked, false ); } ); + dom.controlsPrev.forEach( function( el ) { el.addEventListener( eventName, onNavigatePrevClicked, false ); } ); + dom.controlsNext.forEach( function( el ) { el.addEventListener( eventName, onNavigateNextClicked, false ); } ); + } ); + } + + } + + /** + * Unbinds all event listeners. + */ + function removeEventListeners() { + + eventsAreBound = false; + + document.removeEventListener( 'keydown', onDocumentKeyDown, false ); + window.removeEventListener( 'hashchange', onWindowHashChange, false ); + window.removeEventListener( 'resize', onWindowResize, 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 ( config.progress && dom.progress ) { + dom.progress.removeEventListener( 'click', onProgressClicked, false ); + } + + if ( config.controls && dom.controls ) { + [ 'touchstart', 'click' ].forEach( function( eventName ) { + dom.controlsLeft.forEach( function( el ) { el.removeEventListener( eventName, onNavigateLeftClicked, false ); } ); + dom.controlsRight.forEach( function( el ) { el.removeEventListener( eventName, onNavigateRightClicked, false ); } ); + dom.controlsUp.forEach( function( el ) { el.removeEventListener( eventName, onNavigateUpClicked, false ); } ); + dom.controlsDown.forEach( function( el ) { el.removeEventListener( eventName, onNavigateDownClicked, false ); } ); + dom.controlsPrev.forEach( function( el ) { el.removeEventListener( eventName, onNavigatePrevClicked, false ); } ); + dom.controlsNext.forEach( function( el ) { el.removeEventListener( eventName, onNavigateNextClicked, false ); } ); + } ); + } + + } + + /** + * Extend object a with the properties of object b. + * If there's a conflict, object b takes precedence. + */ + function extend( a, b ) { + + for( var i in b ) { + a[ i ] = b[ i ]; + } + + } + + /** + * Converts the target object to an array. + */ + function toArray( o ) { + + return Array.prototype.slice.call( o ); + + } + + /** + * Measures the distance in pixels between point a + * and point b. + * + * @param {Object} a point with x/y properties + * @param {Object} b point with x/y properties + */ + function distanceBetween( a, b ) { + + var dx = a.x - b.x, + dy = a.y - b.y; + + return Math.sqrt( dx*dx + dy*dy ); + + } + + /** + * Retrieves the height of the given element by looking + * at the position and height of its immediate children. + */ + function getAbsoluteHeight( element ) { + + var height = 0; + + if( element ) { + var absoluteChildren = 0; + + toArray( element.childNodes ).forEach( function( child ) { + + if( typeof child.offsetTop === 'number' && child.style ) { + // Count # of abs children + if( child.style.position === 'absolute' ) { + absoluteChildren += 1; + } + + height = Math.max( height, child.offsetTop + child.offsetHeight ); + } + + } ); + + // If there are no absolute children, use offsetHeight + if( absoluteChildren === 0 ) { + height = element.offsetHeight; + } + + } + + return height; + + } + + /** + * 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, + * more vertical space ftw. + */ + function removeAddressBar() { + + if( window.orientation === 0 ) { + document.documentElement.style.overflow = 'scroll'; + document.body.style.height = '120%'; + } + else { + document.documentElement.style.overflow = ''; + document.body.style.height = '100%'; + } + + setTimeout( function() { + window.scrollTo( 0, 1 ); + }, 10 ); + + } + + /** + * Dispatches an event of the specified type from the + * reveal DOM element. + */ + function dispatchEvent( type, properties ) { + + var event = document.createEvent( "HTMLEvents", 1, 2 ); + event.initEvent( type, true, true ); + extend( event, properties ); + dom.wrapper.dispatchEvent( event ); + + } + + /** + * Wrap all links in 3D goodness. + */ + function enableRollingLinks() { + + if( supports3DTransforms && !( 'msPerspective' in document.body.style ) ) { + var anchors = document.querySelectorAll( SLIDES_SELECTOR + ' a:not(.image)' ); + + for( var i = 0, len = anchors.length; i < len; i++ ) { + var anchor = anchors[i]; + + if( anchor.textContent && !anchor.querySelector( '*' ) && ( !anchor.className || !anchor.classList.contains( anchor, 'roll' ) ) ) { + var span = document.createElement('span'); + span.setAttribute('data-title', anchor.text); + span.innerHTML = anchor.innerHTML; + + anchor.classList.add( 'roll' ); + anchor.innerHTML = ''; + anchor.appendChild(span); + } + } + } + + } + + /** + * Unwrap all 3D links. + */ + function disableRollingLinks() { + + var anchors = document.querySelectorAll( SLIDES_SELECTOR + ' a.roll' ); + + for( var i = 0, len = anchors.length; i < len; i++ ) { + var anchor = anchors[i]; + var span = anchor.querySelector( 'span' ); + + if( span ) { + anchor.classList.remove( 'roll' ); + anchor.innerHTML = span.innerHTML; + } + } + + } + + /** + * Bind preview frame links. + */ + function enablePreviewLinks( selector ) { + + var anchors = toArray( document.querySelectorAll( selector ? selector : 'a' ) ); + + anchors.forEach( function( element ) { + if( /^(http|www)/gi.test( element.getAttribute( 'href' ) ) ) { + element.addEventListener( 'click', onPreviewLinkClicked, false ); + } + } ); + + } + + /** + * Unbind preview frame links. + */ + function disablePreviewLinks() { + + var anchors = toArray( document.querySelectorAll( 'a' ) ); + + anchors.forEach( function( element ) { + if( /^(http|www)/gi.test( element.getAttribute( 'href' ) ) ) { + element.removeEventListener( 'click', onPreviewLinkClicked, false ); + } + } ); + + } + + /** + * Opens a preview window for the target URL. + */ + function openPreview( url ) { + + closePreview(); + + dom.preview = document.createElement( 'div' ); + dom.preview.classList.add( 'preview-link-overlay' ); + dom.wrapper.appendChild( dom.preview ); + + dom.preview.innerHTML = [ + '
', + '', + '', + '
', + '
', + '
', + '', + '
' + ].join(''); + + dom.preview.querySelector( 'iframe' ).addEventListener( 'load', function( event ) { + dom.preview.classList.add( 'loaded' ); + }, false ); + + dom.preview.querySelector( '.close' ).addEventListener( 'click', function( event ) { + closePreview(); + event.preventDefault(); + }, false ); + + dom.preview.querySelector( '.external' ).addEventListener( 'click', function( event ) { + closePreview(); + }, false ); + + setTimeout( function() { + dom.preview.classList.add( 'visible' ); + }, 1 ); + + } + + /** + * Closes the iframe preview window. + */ + function closePreview() { + + if( dom.preview ) { + dom.preview.setAttribute( 'src', '' ); + dom.preview.parentNode.removeChild( dom.preview ); + dom.preview = null; + } + + } + + /** + * Return a sorted fragments list, ordered by an increasing + * "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 + * order of fragment appearance. + * + * To maintain a sensible default fragment order, fragments are presumed + * to be passed in document order. This function adds a "fragment-index" + * attribute to each node if such an attribute is not already present, + * and sets that attribute to an integer value which is the position of + * the fragment within the fragments list. + */ + function sortFragments( fragments ) { + + var a = toArray( fragments ); + + a.forEach( function( el, idx ) { + if( !el.hasAttribute( 'data-fragment-index' ) ) { + el.setAttribute( 'data-fragment-index', idx ); + } + } ); + + a.sort( function( l, r ) { + return l.getAttribute( 'data-fragment-index' ) - r.getAttribute( 'data-fragment-index'); + } ); + + return a; + + } + + /** + * Applies JavaScript-controlled layout rules to the + * presentation. + */ + function layout() { + + if( dom.wrapper && !isPrintingPDF() ) { + + // Available space to scale within + var availableWidth = dom.wrapper.offsetWidth, + availableHeight = dom.wrapper.offsetHeight; + + // Reduce available space by margin + availableWidth -= ( availableHeight * config.margin ); + availableHeight -= ( availableHeight * config.margin ); + + // Dimensions of the content + var slideWidth = config.width, + slideHeight = config.height; + + // Slide width may be a percentage of available width + if( typeof slideWidth === 'string' && /%$/.test( slideWidth ) ) { + slideWidth = parseInt( slideWidth, 10 ) / 100 * availableWidth; + } + + // Slide height may be a percentage of available height + if( typeof slideHeight === 'string' && /%$/.test( slideHeight ) ) { + slideHeight = parseInt( slideHeight, 10 ) / 100 * availableHeight; + } + + dom.slides.style.width = slideWidth + 'px'; + dom.slides.style.height = slideHeight + 'px'; + + // Determine scale of content to fit within available space + scale = Math.min( availableWidth / slideWidth, availableHeight / slideHeight ); + + // Respect max/min scale settings + scale = Math.max( scale, config.minScale ); + scale = Math.min( scale, config.maxScale ); + + // Prefer applying scale via zoom since Chrome blurs scaled content + // with nested transforms + if( typeof dom.slides.style.zoom !== 'undefined' && !navigator.userAgent.match( /(iphone|ipod|ipad|android)/gi ) ) { + dom.slides.style.zoom = scale; + } + // Apply scale transform as a fallback + else { + var transform = 'translate(-50%, -50%) scale('+ scale +') translate(50%, 50%)'; + + dom.slides.style.WebkitTransform = transform; + dom.slides.style.MozTransform = transform; + dom.slides.style.msTransform = transform; + dom.slides.style.OTransform = transform; + dom.slides.style.transform = transform; + } + + // Select all slides, vertical and horizontal + var slides = toArray( document.querySelectorAll( SLIDES_SELECTOR ) ); + + for( var i = 0, len = slides.length; i < len; i++ ) { + var slide = slides[ i ]; + + // Don't bother updating invisible slides + if( slide.style.display === 'none' ) { + continue; + } + + if( config.center ) { + // Vertical stacks are not centred since their section + // children will be + if( slide.classList.contains( 'stack' ) ) { + slide.style.top = 0; + } + else { + slide.style.top = Math.max( - ( getAbsoluteHeight( slide ) / 2 ) - 20, -slideHeight / 2 ) + 'px'; + } + } + else { + slide.style.top = ''; + } + + } + + updateProgress(); + + } + + } + + /** + * Stores the vertical index of a stack so that the same + * vertical slide can be selected when navigating to and + * from the stack. + * + * @param {HTMLElement} stack The vertical stack element + * @param {int} v Index to memorize + */ + function setPreviousVerticalIndex( stack, v ) { + + if( typeof stack === 'object' && typeof stack.setAttribute === 'function' ) { + stack.setAttribute( 'data-previous-indexv', v || 0 ); + } + + } + + /** + * Retrieves the vertical index which was stored using + * #setPreviousVerticalIndex() or 0 if no previous index + * exists. + * + * @param {HTMLElement} stack The vertical stack element + */ + function getPreviousVerticalIndex( stack ) { + + if( typeof stack === 'object' && typeof stack.setAttribute === 'function' && stack.classList.contains( 'stack' ) ) { + // Prefer manually defined start-indexv + var attributeName = stack.hasAttribute( 'data-start-indexv' ) ? 'data-start-indexv' : 'data-previous-indexv'; + + return parseInt( stack.getAttribute( attributeName ) || 0, 10 ); + } + + return 0; + + } + + /** + * Displays the overview of slides (quick nav) by + * scaling down and arranging all slide elements. + * + * Experimental feature, might be dropped if perf + * can't be improved. + */ + function activateOverview() { + + // Only proceed if enabled in config + if( config.overview ) { + + // Don't auto-slide while in overview mode + cancelAutoSlide(); + + var wasActive = dom.wrapper.classList.contains( 'overview' ); + + dom.wrapper.classList.add( 'overview' ); + dom.wrapper.classList.remove( 'exit-overview' ); + + clearTimeout( activateOverviewTimeout ); + clearTimeout( deactivateOverviewTimeout ); + + // Not the pretties solution, but need to let the overview + // class apply first so that slides are measured accurately + // before we can position them + activateOverviewTimeout = setTimeout( function(){ + + var horizontalSlides = document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ); + + for( var i = 0, len1 = horizontalSlides.length; i < len1; i++ ) { + var hslide = horizontalSlides[i], + hoffset = config.rtl ? -105 : 105, + htransform = 'translateZ(-2500px) translate(' + ( ( i - indexh ) * hoffset ) + '%, 0%)'; + + hslide.setAttribute( 'data-index-h', i ); + hslide.style.display = 'block'; + hslide.style.WebkitTransform = htransform; + hslide.style.MozTransform = htransform; + hslide.style.msTransform = htransform; + hslide.style.OTransform = htransform; + hslide.style.transform = htransform; + + if( hslide.classList.contains( 'stack' ) ) { + + var verticalSlides = hslide.querySelectorAll( 'section' ); + + for( var j = 0, len2 = verticalSlides.length; j < len2; j++ ) { + var verticalIndex = i === indexh ? indexv : getPreviousVerticalIndex( hslide ); + + var vslide = verticalSlides[j], + vtransform = 'translate(0%, ' + ( ( j - verticalIndex ) * 105 ) + '%)'; + + vslide.setAttribute( 'data-index-h', i ); + vslide.setAttribute( 'data-index-v', j ); + vslide.style.display = 'block'; + vslide.style.WebkitTransform = vtransform; + vslide.style.MozTransform = vtransform; + vslide.style.msTransform = vtransform; + vslide.style.OTransform = vtransform; + vslide.style.transform = vtransform; + + // Navigate to this slide on click + vslide.addEventListener( 'click', onOverviewSlideClicked, true ); + } + + } + else { + + // Navigate to this slide on click + hslide.addEventListener( 'click', onOverviewSlideClicked, true ); + + } + } + + layout(); + + if( !wasActive ) { + // Notify observers of the overview showing + dispatchEvent( 'overviewshown', { + 'indexh': indexh, + 'indexv': indexv, + 'currentSlide': currentSlide + } ); + } + + }, 10 ); + + } + + } + + /** + * Exits the slide overview and enters the currently + * active slide. + */ + function deactivateOverview() { + + // Only proceed if enabled in config + if( config.overview ) { + + clearTimeout( activateOverviewTimeout ); + clearTimeout( deactivateOverviewTimeout ); + + dom.wrapper.classList.remove( 'overview' ); + + // Temporarily add a class so that transitions can do different things + // depending on whether they are exiting/entering overview, or just + // moving from slide to slide + dom.wrapper.classList.add( 'exit-overview' ); + + deactivateOverviewTimeout = setTimeout( function () { + dom.wrapper.classList.remove( 'exit-overview' ); + }, 10); + + // Select all slides + var slides = toArray( document.querySelectorAll( SLIDES_SELECTOR ) ); + + for( var i = 0, len = slides.length; i < len; i++ ) { + var element = slides[i]; + + element.style.display = ''; + + // Resets all transforms to use the external styles + element.style.WebkitTransform = ''; + element.style.MozTransform = ''; + element.style.msTransform = ''; + element.style.OTransform = ''; + element.style.transform = ''; + + element.removeEventListener( 'click', onOverviewSlideClicked, true ); + } + + slide( indexh, indexv ); + + cueAutoSlide(); + + // Notify observers of the overview hiding + dispatchEvent( 'overviewhidden', { + 'indexh': indexh, + 'indexv': indexv, + 'currentSlide': currentSlide + } ); + + } + } + + /** + * Toggles the slide overview mode on and off. + * + * @param {Boolean} override Optional flag which overrides the + * toggle logic and forcibly sets the desired state. True means + * overview is open, false means it's closed. + */ + function toggleOverview( override ) { + + if( typeof override === 'boolean' ) { + override ? activateOverview() : deactivateOverview(); + } + else { + isOverview() ? deactivateOverview() : activateOverview(); + } + + } + + /** + * Checks if the overview is currently active. + * + * @return {Boolean} true if the overview is active, + * false otherwise + */ + function isOverview() { + + return dom.wrapper.classList.contains( 'overview' ); + + } + + /** + * Checks if the current or specified slide is vertical + * (nested within another slide). + * + * @param {HTMLElement} slide [optional] The slide to check + * orientation of + */ + function isVerticalSlide( slide ) { + + // Prefer slide argument, otherwise use current slide + slide = slide ? slide : currentSlide; + + return slide && !!slide.parentNode.nodeName.match( /section/i ); + + } + + /** + * Handling the fullscreen functionality via the fullscreen API + * + * @see http://fullscreen.spec.whatwg.org/ + * @see https://developer.mozilla.org/en-US/docs/DOM/Using_fullscreen_mode + */ + function enterFullscreen() { + + var element = document.body; + + // Check which implementation is available + var requestMethod = element.requestFullScreen || + element.webkitRequestFullscreen || + element.webkitRequestFullScreen || + element.mozRequestFullScreen || + element.msRequestFullScreen; + + if( requestMethod ) { + requestMethod.apply( element ); + } + + } + + /** + * Enters the paused mode which fades everything on screen to + * black. + */ + function pause() { + + var wasPaused = dom.wrapper.classList.contains( 'paused' ); + + cancelAutoSlide(); + dom.wrapper.classList.add( 'paused' ); + + if( wasPaused === false ) { + dispatchEvent( 'paused' ); + } + + } + + /** + * Exits from the paused mode. + */ + function resume() { + + var wasPaused = dom.wrapper.classList.contains( 'paused' ); + dom.wrapper.classList.remove( 'paused' ); + + cueAutoSlide(); + + if( wasPaused ) { + dispatchEvent( 'resumed' ); + } + + } + + /** + * Toggles the paused mode on and off. + */ + function togglePause() { + + if( isPaused() ) { + resume(); + } + else { + pause(); + } + + } + + /** + * Checks if we are currently in the paused mode. + */ + function isPaused() { + + return dom.wrapper.classList.contains( 'paused' ); + + } + + /** + * Steps from the current point in the presentation to the + * slide which matches the specified horizontal and vertical + * indices. + * + * @param {int} h Horizontal index of the target slide + * @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, o ) { + + // Remember where we were at before + previousSlide = currentSlide; + + // Query all horizontal slides in the deck + var horizontalSlides = document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ); + + // If no vertical index is specified and the upcoming slide is a + // stack, resume at its previous vertical index + if( v === undefined ) { + v = getPreviousVerticalIndex( horizontalSlides[ h ] ); + } + + // If we were on a vertical stack, remember what vertical index + // it was on so we can resume at the same position when returning + if( previousSlide && previousSlide.parentNode && previousSlide.parentNode.classList.contains( 'stack' ) ) { + setPreviousVerticalIndex( previousSlide.parentNode, indexv ); + } + + // Remember the state before this slide + var stateBefore = state.concat(); + + // Reset the state array + state.length = 0; + + var indexhBefore = indexh, + indexvBefore = indexv; + + // Activate and transition to the new slide + indexh = updateSlides( HORIZONTAL_SLIDES_SELECTOR, h === undefined ? indexh : h ); + indexv = updateSlides( VERTICAL_SLIDES_SELECTOR, v === undefined ? indexv : v ); + + layout(); + + // Apply the new state + stateLoop: for( var i = 0, len = state.length; i < len; i++ ) { + // Check if this state existed on the previous slide. If it + // did, we will avoid adding it repeatedly + for( var j = 0; j < stateBefore.length; j++ ) { + if( stateBefore[j] === state[i] ) { + stateBefore.splice( j, 1 ); + continue stateLoop; + } + } + + document.documentElement.classList.add( state[i] ); + + // Dispatch custom event matching the state's name + dispatchEvent( state[i] ); + } + + // Clean up the remains of the previous state + while( stateBefore.length ) { + document.documentElement.classList.remove( stateBefore.pop() ); + } + + // If the overview is active, re-activate it to update positions + if( isOverview() ) { + activateOverview(); + } + + // Update the URL hash after a delay since updating it mid-transition + // is likely to cause visual lag + writeURL( 1500 ); + + // Find the current horizontal slide and any possible vertical slides + // within it + var currentHorizontalSlide = horizontalSlides[ indexh ], + currentVerticalSlides = currentHorizontalSlide.querySelectorAll( 'section' ); + + // Store references to the previous and current slides + currentSlide = currentVerticalSlides[ indexv ] || currentHorizontalSlide; + + + // Show fragment, if specified + if( typeof f !== 'undefined' ) { + var fragments = sortFragments( currentSlide.querySelectorAll( '.fragment' ) ); + + toArray( fragments ).forEach( function( fragment, indexf ) { + if( indexf < f ) { + fragment.classList.add( 'visible' ); + } + else { + fragment.classList.remove( 'visible' ); + } + } ); + } + + // Dispatch an event if the slide changed + var slideChanged = ( indexh !== indexhBefore || indexv !== indexvBefore ); + if( slideChanged ) { + dispatchEvent( 'slidechanged', { + 'indexh': indexh, + 'indexv': indexv, + 'previousSlide': previousSlide, + 'currentSlide': currentSlide, + 'origin': o + } ); + } + else { + // Ensure that the previous slide is never the same as the current + previousSlide = null; + } + + // Solves an edge case where the previous slide maintains the + // 'present' class when navigating between adjacent vertical + // stacks + if( previousSlide ) { + previousSlide.classList.remove( 'present' ); + + // Reset all slides upon navigate to home + // Issue: #285 + if ( document.querySelector( HOME_SLIDE_SELECTOR ).classList.contains( 'present' ) ) { + // Launch async task + setTimeout( function () { + var slides = toArray( document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR + '.stack') ), i; + for( i in slides ) { + if( slides[i] ) { + // Reset stack + setPreviousVerticalIndex( slides[i], 0 ); + } + } + }, 0 ); + } + } + + // Handle embedded content + if( slideChanged ) { + stopEmbeddedContent( previousSlide ); + startEmbeddedContent( currentSlide ); + } + + updateControls(); + updateProgress(); + updateBackground(); + + } + + /** + * Syncs the presentation with the current DOM. Useful + * when new slides or control elements are added or when + * the configuration has changed. + */ + function sync() { + + // Subscribe to input + removeEventListeners(); + addEventListeners(); + + // Force a layout to make sure the current config is accounted for + layout(); + + // Reflect the current autoSlide value + autoSlide = config.autoSlide; + + // Start auto-sliding if it's enabled + cueAutoSlide(); + + // Re-create the slide backgrounds + createBackgrounds(); + + updateControls(); + updateProgress(); + updateBackground(); + + } + + /** + * Updates one dimension of slides by showing the slide + * with the specified index. + * + * @param {String} selector A CSS selector that will fetch + * the group of slides we are working with + * @param {Number} index The index of the slide that should be + * shown + * + * @return {Number} The index of the slide that is now shown, + * might differ from the passed in index if it was out of + * bounds. + */ + function updateSlides( selector, index ) { + + // Select all slides and convert the NodeList result to + // an array + var slides = toArray( document.querySelectorAll( selector ) ), + slidesLength = slides.length; + + if( slidesLength ) { + + // Should the index loop? + if( config.loop ) { + index %= slidesLength; + + if( index < 0 ) { + index = slidesLength + index; + } + } + + // Enforce max and minimum index bounds + index = Math.max( Math.min( index, slidesLength - 1 ), 0 ); + + for( var i = 0; i < slidesLength; i++ ) { + var element = slides[i]; + + // Optimization; hide all slides that are three or more steps + // away from the present slide + if( isOverview() === false ) { + // The distance loops so that it measures 1 between the first + // and last slides + var distance = Math.abs( ( index - i ) % ( slidesLength - 3 ) ) || 0; + + element.style.display = distance > 3 ? 'none' : 'block'; + } + + var reverse = config.rtl && !isVerticalSlide( element ); + + element.classList.remove( 'past' ); + element.classList.remove( 'present' ); + element.classList.remove( 'future' ); + + // http://www.w3.org/html/wg/drafts/html/master/editing.html#the-hidden-attribute + element.setAttribute( 'hidden', '' ); + + if( i < index ) { + // Any element previous to index is given the 'past' class + element.classList.add( reverse ? 'future' : 'past' ); + } + else if( i > index ) { + // Any element subsequent to index is given the 'future' class + element.classList.add( reverse ? 'past' : 'future' ); + } + + // If this element contains vertical slides + if( element.querySelector( 'section' ) ) { + element.classList.add( 'stack' ); + } + } + + // Mark the current slide as present + slides[index].classList.add( 'present' ); + slides[index].removeAttribute( 'hidden' ); + + // If this slide has a state associated with it, add it + // onto the current state of the deck + var slideState = slides[index].getAttribute( 'data-state' ); + if( slideState ) { + state = state.concat( slideState.split( ' ' ) ); + } + + // If this slide has a data-autoslide attribtue associated use this as + // autoSlide value otherwise use the global configured time + var slideAutoSlide = slides[index].getAttribute( 'data-autoslide' ); + if( slideAutoSlide ) { + autoSlide = parseInt( slideAutoSlide, 10 ); + } + else { + autoSlide = config.autoSlide; + } + + } + else { + // Since there are no slides we can't be anywhere beyond the + // zeroth index + index = 0; + } + + return index; + + } + + /** + * Updates the progress bar to reflect the current slide. + */ + function updateProgress() { + + // Update progress if enabled + if( config.progress && dom.progress ) { + + var horizontalSlides = toArray( document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) ); + + // The number of past and total slides + var totalCount = document.querySelectorAll( SLIDES_SELECTOR + ':not(.stack)' ).length; + var pastCount = 0; + + // Step through all slides and count the past ones + mainLoop: for( var i = 0; i < horizontalSlides.length; i++ ) { + + var horizontalSlide = horizontalSlides[i]; + var verticalSlides = toArray( horizontalSlide.querySelectorAll( 'section' ) ); + + for( var j = 0; j < verticalSlides.length; j++ ) { + + // Stop as soon as we arrive at the present + if( verticalSlides[j].classList.contains( 'present' ) ) { + break mainLoop; + } + + pastCount++; + + } + + // Stop as soon as we arrive at the present + if( horizontalSlide.classList.contains( 'present' ) ) { + break; + } + + // Don't count the wrapping section for vertical slides + if( horizontalSlide.classList.contains( 'stack' ) === false ) { + pastCount++; + } + + } + + dom.progressbar.style.width = ( pastCount / ( totalCount - 1 ) ) * window.innerWidth + 'px'; + + } + + } + + /** + * Updates the state of all control/navigation arrows. + */ + function updateControls() { + + if ( config.controls && dom.controls ) { + + var routes = availableRoutes(); + var fragments = availableFragments(); + + // Remove the 'enabled' class from all directions + dom.controlsLeft.concat( dom.controlsRight ) + .concat( dom.controlsUp ) + .concat( dom.controlsDown ) + .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 + if( routes.left ) dom.controlsLeft.forEach( function( el ) { el.classList.add( 'enabled' ); } ); + if( routes.right ) dom.controlsRight.forEach( function( el ) { el.classList.add( 'enabled' ); } ); + if( routes.up ) dom.controlsUp.forEach( function( el ) { el.classList.add( 'enabled' ); } ); + if( routes.down ) dom.controlsDown.forEach( function( el ) { el.classList.add( 'enabled' ); } ); + + // Prev/next buttons + 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 ) { + + // 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( isVerticalSlide( currentSlide ) ) { + 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' ); } ); + } + } + + } + + } + + /** + * 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. + * + * @return {Object} containing four booleans: left/right/up/down + */ + function availableRoutes() { + + var horizontalSlides = document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ), + verticalSlides = document.querySelectorAll( VERTICAL_SLIDES_SELECTOR ); + + var routes = { + left: indexh > 0 || config.loop, + right: indexh < horizontalSlides.length - 1 || config.loop, + up: indexv > 0, + down: indexv < verticalSlides.length - 1 + }; + + // reverse horizontal controls for rtl + if( config.rtl ) { + var left = routes.left; + routes.left = routes.right; + routes.right = left; + } + + return routes; + + } + + /** + * Returns an object describing the available fragment + * directions. + * + * @return {Object} two boolean properties: prev/next + */ + function availableFragments() { + + if( currentSlide && config.fragments ) { + 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 }; + } + + } + + /** + * Start playback of any embedded content inside of + * the targeted slide. + */ + function startEmbeddedContent( slide ) { + + if( slide ) { + // HTML5 media elements + toArray( slide.querySelectorAll( 'video, audio' ) ).forEach( function( el ) { + if( el.hasAttribute( 'data-autoplay' ) ) { + el.play(); + } + } ); + + // YouTube embeds + toArray( slide.querySelectorAll( 'iframe[src*="youtube.com/embed/"]' ) ).forEach( function( el ) { + if( el.hasAttribute( 'data-autoplay' ) ) { + el.contentWindow.postMessage('{"event":"command","func":"playVideo","args":""}', '*'); + } + }); + } + + } + + /** + * Stop playback of any embedded content inside of + * the targeted slide. + */ + function stopEmbeddedContent( slide ) { + + if( slide ) { + // HTML5 media elements + toArray( slide.querySelectorAll( 'video, audio' ) ).forEach( function( el ) { + if( !el.hasAttribute( 'data-ignore' ) ) { + el.pause(); + } + } ); + + // YouTube embeds + toArray( slide.querySelectorAll( 'iframe[src*="youtube.com/embed/"]' ) ).forEach( function( el ) { + if( !el.hasAttribute( 'data-ignore' ) && typeof el.contentWindow.postMessage === 'function' ) { + el.contentWindow.postMessage('{"event":"command","func":"pauseVideo","args":""}', '*'); + } + }); + } + + } + + /** + * Reads the current URL (hash) and navigates accordingly. + */ + function readURL() { + + var hash = window.location.hash; + + // Attempt to parse the hash as either an index or name + var bits = hash.slice( 2 ).split( '/' ), + name = hash.replace( /#|\//gi, '' ); + + // If the first bit is invalid and there is a name we can + // assume that this is a named link + if( isNaN( parseInt( bits[0], 10 ) ) && name.length ) { + // Find the slide with the specified name + var element = document.querySelector( '#' + name ); + + if( element ) { + // Find the position of the named slide and navigate to it + var indices = Reveal.getIndices( element ); + slide( indices.h, indices.v ); + } + // If the slide doesn't exist, navigate to the current slide + else { + slide( indexh, indexv ); + } + } + else { + // Read the index components of the hash + var h = parseInt( bits[0], 10 ) || 0, + v = parseInt( bits[1], 10 ) || 0; + + slide( h, v ); + } + + } + + /** + * Updates the page URL (hash) to reflect the current + * state. + * + * @param {Number} delay The time in ms to wait before + * writing the hash + */ + function writeURL( delay ) { + + if( config.history ) { + + // Make sure there's never more than one timeout running + clearTimeout( writeURLTimeout ); + + // If a delay is specified, timeout this call + if( typeof delay === 'number' ) { + writeURLTimeout = setTimeout( writeURL, delay ); + } + else { + var url = '/'; + + // If the current slide has an ID, use that as a named link + if( currentSlide && typeof currentSlide.getAttribute( 'id' ) === 'string' ) { + url = '/' + currentSlide.getAttribute( 'id' ); + } + // Otherwise use the /h/v index + else { + if( indexh > 0 || indexv > 0 ) url += indexh; + if( indexv > 0 ) url += '/' + indexv; + } + + window.location.hash = url; + } + } + + } + + /** + * Retrieves the h/v location of the current, or specified, + * slide. + * + * @param {HTMLElement} slide If specified, the returned + * index will be for this slide rather than the currently + * active one + * + * @return {Object} { h: , v: , f: } + */ + function getIndices( slide ) { + + // By default, return the current indices + var h = indexh, + v = indexv, + f; + + // If a slide is specified, return the indices of that slide + if( slide ) { + var isVertical = isVerticalSlide( slide ); + var slideh = isVertical ? slide.parentNode : slide; + + // Select all horizontal slides + var horizontalSlides = toArray( document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) ); + + // Now that we know which the horizontal slide is, get its index + h = Math.max( horizontalSlides.indexOf( slideh ), 0 ); + + // If this is a vertical slide, grab the vertical index + if( isVertical ) { + v = Math.max( toArray( slide.parentNode.querySelectorAll( 'section' ) ).indexOf( slide ), 0 ); + } + } + + if( !slide && currentSlide ) { + var visibleFragments = currentSlide.querySelectorAll( '.fragment.visible' ); + if( visibleFragments.length ) { + f = visibleFragments.length; + } + } + + return { h: h, v: v, f: f }; + + } + + /** + * Navigate to the next slide fragment. + * + * @return {Boolean} true if there was a next fragment, + * false otherwise + */ + function nextFragment() { + + if( currentSlide && config.fragments ) { + var fragments = sortFragments( currentSlide.querySelectorAll( '.fragment:not(.visible)' ) ); + + if( fragments.length ) { + // Find the index of the next fragment + var index = fragments[0].getAttribute( 'data-fragment-index' ); + + // Find all fragments with the same index + fragments = currentSlide.querySelectorAll( '.fragment[data-fragment-index="'+ index +'"]' ); + + toArray( fragments ).forEach( function( element ) { + element.classList.add( 'visible' ); + } ); + + // Notify subscribers of the change + dispatchEvent( 'fragmentshown', { fragment: fragments[0], fragments: fragments } ); + + updateControls(); + return true; + } + } + + return false; + + } + + /** + * Navigate to the previous slide fragment. + * + * @return {Boolean} true if there was a previous fragment, + * false otherwise + */ + function previousFragment() { + + if( currentSlide && config.fragments ) { + var fragments = sortFragments( currentSlide.querySelectorAll( '.fragment.visible' ) ); + + if( fragments.length ) { + // Find the index of the previous fragment + var index = fragments[ fragments.length - 1 ].getAttribute( 'data-fragment-index' ); + + // Find all fragments with the same index + fragments = currentSlide.querySelectorAll( '.fragment[data-fragment-index="'+ index +'"]' ); + + toArray( fragments ).forEach( function( f ) { + f.classList.remove( 'visible' ); + } ); + + // Notify subscribers of the change + dispatchEvent( 'fragmenthidden', { fragment: fragments[0], fragments: fragments } ); + + updateControls(); + return true; + } + } + + return false; + + } + + /** + * Cues a new automated slide if enabled in the config. + */ + function cueAutoSlide() { + + clearTimeout( autoSlideTimeout ); + + // Cue the next auto-slide if enabled + if( autoSlide && !isPaused() && !isOverview() ) { + autoSlideTimeout = setTimeout( navigateNext, autoSlide ); + } + + } + + /** + * Cancels any ongoing request to auto-slide. + */ + function cancelAutoSlide() { + + clearTimeout( autoSlideTimeout ); + + } + + function navigateLeft() { + + // Reverse for RTL + if( config.rtl ) { + if( ( isOverview() || nextFragment() === false ) && availableRoutes().left ) { + slide( indexh + 1 ); + } + } + // Normal navigation + else if( ( isOverview() || previousFragment() === false ) && availableRoutes().left ) { + slide( indexh - 1 ); + } + + } + + function navigateRight() { + + // Reverse for RTL + if( config.rtl ) { + if( ( isOverview() || previousFragment() === false ) && availableRoutes().right ) { + slide( indexh - 1 ); + } + } + // Normal navigation + else if( ( isOverview() || nextFragment() === false ) && availableRoutes().right ) { + slide( indexh + 1 ); + } + + } + + function navigateUp() { + + // Prioritize hiding fragments + if( ( isOverview() || previousFragment() === false ) && availableRoutes().up ) { + slide( indexh, indexv - 1 ); + } + + } + + function navigateDown() { + + // Prioritize revealing fragments + if( ( isOverview() || nextFragment() === false ) && availableRoutes().down ) { + slide( indexh, indexv + 1 ); + } + + } + + /** + * Navigates backwards, prioritized in the following order: + * 1) Previous fragment + * 2) Previous vertical slide + * 3) Previous horizontal slide + */ + function navigatePrev() { + + // Prioritize revealing fragments + if( previousFragment() === false ) { + if( availableRoutes().up ) { + navigateUp(); + } + else { + // Fetch the previous horizontal slide, if there is one + var previousSlide = document.querySelector( HORIZONTAL_SLIDES_SELECTOR + '.past:nth-child(' + indexh + ')' ); + + if( previousSlide ) { + var v = ( previousSlide.querySelectorAll( 'section' ).length - 1 ) || undefined; + var h = indexh - 1; + slide( h, v ); + } + } + } + + } + + /** + * Same as #navigatePrev() but navigates forwards. + */ + function navigateNext() { + + // Prioritize revealing fragments + if( nextFragment() === false ) { + availableRoutes().down ? navigateDown() : navigateRight(); + } + + // If auto-sliding is enabled we need to cue up + // another timeout + cueAutoSlide(); + + } + + + // --------------------------------------------------------------------// + // ----------------------------- EVENTS -------------------------------// + // --------------------------------------------------------------------// + + + /** + * Handler for the document level 'keydown' event. + * + * @param {Object} event + */ + function onDocumentKeyDown( event ) { + + // Check if there's a focused element that could be using + // the keyboard + var activeElement = document.activeElement; + var hasFocus = !!( document.activeElement && ( document.activeElement.type || document.activeElement.href || document.activeElement.contentEditable !== 'inherit' ) ); + + // Disregard the event if there's a focused element or a + // keyboard modifier key is present + if( hasFocus || (event.shiftKey && event.keyCode !== 32) || event.altKey || event.ctrlKey || event.metaKey ) return; + + // While paused only allow "unpausing" keyboard events (b and .) + if( isPaused() && [66,190,191].indexOf( event.keyCode ) === -1 ) { + return false; + } + + var triggered = false; + + // 1. User defined key bindings + if( typeof config.keyboard === 'object' ) { + + for( var key in config.keyboard ) { + + // Check if this binding matches the pressed key + if( parseInt( key, 10 ) === event.keyCode ) { + + var value = config.keyboard[ key ]; + + // Calback function + if( typeof value === 'function' ) { + value.apply( null, [ event ] ); + } + // String shortcuts to reveal.js API + else if( typeof value === 'string' && typeof Reveal[ value ] === 'function' ) { + Reveal[ value ].call(); + } + + triggered = true; + + } + + } + + } + + // 2. System defined key bindings + if( triggered === false ) { + + // Assume true and try to prove false + triggered = true; + + switch( event.keyCode ) { + // p, page up + case 80: case 33: navigatePrev(); break; + // n, page down + case 78: case 34: navigateNext(); break; + // h, left + case 72: case 37: navigateLeft(); break; + // l, right + case 76: case 39: navigateRight(); break; + // k, up + case 75: case 38: navigateUp(); break; + // j, down + case 74: case 40: navigateDown(); break; + // home + case 36: slide( 0 ); break; + // end + case 35: slide( Number.MAX_VALUE ); break; + // space + 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 + case 66: case 190: case 191: togglePause(); break; + // f + case 70: enterFullscreen(); break; + default: + triggered = false; + } + + } + + // If the input resulted in a triggered action we should prevent + // the browsers default behavior + if( triggered ) { + event.preventDefault(); + } + else if ( event.keyCode === 27 && supports3DTransforms ) { + toggleOverview(); + + event.preventDefault(); + } + + // If auto-sliding is enabled we need to cue up + // another timeout + cueAutoSlide(); + + } + + /** + * Handler for the 'touchstart' event, enables support for + * swipe and pinch gestures. + */ + function onTouchStart( event ) { + + touch.startX = event.touches[0].clientX; + touch.startY = event.touches[0].clientY; + touch.startCount = event.touches.length; + + // If there's two touches we need to memorize the distance + // between those two points to detect pinching + if( event.touches.length === 2 && config.overview ) { + touch.startSpan = distanceBetween( { + x: event.touches[1].clientX, + y: event.touches[1].clientY + }, { + x: touch.startX, + y: touch.startY + } ); + } + + } + + /** + * Handler for the 'touchmove' event. + */ + function onTouchMove( event ) { + + // Each touch should only trigger one action + if( !touch.handled ) { + var currentX = event.touches[0].clientX; + var currentY = event.touches[0].clientY; + + // If the touch started off with two points and still has + // two active touches; test for the pinch gesture + if( event.touches.length === 2 && touch.startCount === 2 && config.overview ) { + + // The current distance in pixels between the two touch points + var currentSpan = distanceBetween( { + x: event.touches[1].clientX, + y: event.touches[1].clientY + }, { + x: touch.startX, + y: touch.startY + } ); + + // If the span is larger than the desire amount we've got + // ourselves a pinch + if( Math.abs( touch.startSpan - currentSpan ) > touch.threshold ) { + touch.handled = true; + + if( currentSpan < touch.startSpan ) { + activateOverview(); + } + else { + deactivateOverview(); + } + } + + event.preventDefault(); + + } + // There was only one touch point, look for a swipe + else if( event.touches.length === 1 && touch.startCount !== 2 ) { + + var deltaX = currentX - touch.startX, + deltaY = currentY - touch.startY; + + if( deltaX > touch.threshold && Math.abs( deltaX ) > Math.abs( deltaY ) ) { + touch.handled = true; + navigateLeft(); + } + else if( deltaX < -touch.threshold && Math.abs( deltaX ) > Math.abs( deltaY ) ) { + touch.handled = true; + navigateRight(); + } + else if( deltaY > touch.threshold ) { + touch.handled = true; + navigateUp(); + } + else if( deltaY < -touch.threshold ) { + touch.handled = true; + navigateDown(); + } + + event.preventDefault(); + + } + } + // There's a bug with swiping on some Android devices unless + // the default action is always prevented + else if( navigator.userAgent.match( /android/gi ) ) { + event.preventDefault(); + } + + } + + /** + * Handler for the 'touchend' event. + */ + function onTouchEnd( event ) { + + touch.handled = false; + + } + + /** + * Convert pointer down to touch start. + */ + function onPointerDown( event ) { + + if( event.pointerType === event.MSPOINTER_TYPE_TOUCH ) { + event.touches = [{ clientX: event.clientX, clientY: event.clientY }]; + onTouchStart( event ); + } + + } + + /** + * Convert pointer move to touch move. + */ + function onPointerMove( event ) { + + if( event.pointerType === event.MSPOINTER_TYPE_TOUCH ) { + event.touches = [{ clientX: event.clientX, clientY: event.clientY }]; + onTouchMove( event ); + } + + } + + /** + * Convert pointer up to touch end. + */ + function onPointerUp( event ) { + + if( event.pointerType === event.MSPOINTER_TYPE_TOUCH ) { + event.touches = [{ clientX: event.clientX, clientY: event.clientY }]; + onTouchEnd( event ); + } + + } + + /** + * Handles mouse wheel scrolling, throttled to avoid skipping + * multiple slides. + */ + function onDocumentMouseScroll( event ) { + + if( Date.now() - lastMouseWheelStep > 600 ) { + + lastMouseWheelStep = Date.now(); + + var delta = event.detail || -event.wheelDelta; + if( delta > 0 ) { + navigateNext(); + } + else { + navigatePrev(); + } + + } + + } + + /** + * Clicking on the progress bar results in a navigation to the + * closest approximate horizontal slide using this equation: + * + * ( clickX / presentationWidth ) * numberOfSlides + */ + function onProgressClicked( event ) { + + event.preventDefault(); + + var slidesTotal = toArray( document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) ).length; + var slideIndex = Math.floor( ( event.clientX / dom.wrapper.offsetWidth ) * slidesTotal ); + + slide( slideIndex ); + + } + + /** + * Event handler for navigation control buttons. + */ + function onNavigateLeftClicked( event ) { event.preventDefault(); navigateLeft(); } + function onNavigateRightClicked( event ) { event.preventDefault(); navigateRight(); } + function onNavigateUpClicked( event ) { event.preventDefault(); navigateUp(); } + function onNavigateDownClicked( event ) { event.preventDefault(); navigateDown(); } + function onNavigatePrevClicked( event ) { event.preventDefault(); navigatePrev(); } + function onNavigateNextClicked( event ) { event.preventDefault(); navigateNext(); } + + /** + * Handler for the window level 'hashchange' event. + */ + function onWindowHashChange( event ) { + + readURL(); + + } + + /** + * Handler for the window level 'resize' event. + */ + function onWindowResize( event ) { + + layout(); + + } + + /** + * Invoked when a slide is and we're in the overview. + */ + function onOverviewSlideClicked( event ) { + + // TODO There's a bug here where the event listeners are not + // removed after deactivating the overview. + if( eventsAreBound && isOverview() ) { + event.preventDefault(); + + var element = event.target; + + while( element && !element.nodeName.match( /section/gi ) ) { + element = element.parentNode; + } + + if( element && !element.classList.contains( 'disabled' ) ) { + + deactivateOverview(); + + if( element.nodeName.match( /section/gi ) ) { + var h = parseInt( element.getAttribute( 'data-index-h' ), 10 ), + v = parseInt( element.getAttribute( 'data-index-v' ), 10 ); + + slide( h, v ); + } + + } + } + + } + + /** + * Handles clicks on links that are set to preview in the + * iframe overlay. + */ + function onPreviewLinkClicked( event ) { + + var url = event.target.getAttribute( 'href' ); + if( url ) { + openPreview( url ); + event.preventDefault(); + } + + } + + + // --------------------------------------------------------------------// + // ------------------------------- API --------------------------------// + // --------------------------------------------------------------------// + + + return { + initialize: initialize, + configure: configure, + sync: sync, + + // Navigation methods + slide: slide, + left: navigateLeft, + right: navigateRight, + up: navigateUp, + down: navigateDown, + prev: navigatePrev, + next: navigateNext, + prevFragment: previousFragment, + nextFragment: nextFragment, + + // Deprecated aliases + navigateTo: slide, + navigateLeft: navigateLeft, + navigateRight: navigateRight, + navigateUp: navigateUp, + navigateDown: navigateDown, + navigatePrev: navigatePrev, + navigateNext: navigateNext, + + // Forces an update in slide layout + layout: layout, + + // 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, + + // Toggles the "black screen" mode on/off + togglePause: togglePause, + + // State checks + isOverview: isOverview, + isPaused: isPaused, + + // Adds or removes all internal event listeners (such as keyboard) + addEventListeners: addEventListeners, + removeEventListeners: removeEventListeners, + + // Returns the indices of the current, or specified, slide + getIndices: getIndices, + + // Returns the slide at the specified index, y is optional + getSlide: function( x, y ) { + var horizontalSlide = document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR )[ x ]; + var verticalSlides = horizontalSlide && horizontalSlide.querySelectorAll( 'section' ); + + if( typeof y !== 'undefined' ) { + return verticalSlides ? verticalSlides[ y ] : undefined; + } + + return horizontalSlide; + }, + + // Returns the previous slide element, may be null + getPreviousSlide: function() { + return previousSlide; + }, + + // Returns the current slide element + getCurrentSlide: function() { + return currentSlide; + }, + + // Returns the current scale of the presentation content + getScale: function() { + return scale; + }, + + // Returns the current configuration object + getConfig: function() { + return config; + }, + + // Helper method, retrieves query string as a key/value hash + getQueryHash: function() { + var query = {}; + + location.search.replace( /[A-Z0-9]+?=(\w*)/gi, function(a) { + query[ a.split( '=' ).shift() ] = a.split( '=' ).pop(); + } ); + + return query; + }, + + // Returns true if we're currently on the first slide + isFirstSlide: function() { + return document.querySelector( SLIDES_SELECTOR + '.past' ) == null ? true : false; + }, + + // Returns true if we're currently on the last slide + isLastSlide: function() { + if( currentSlide && currentSlide.classList.contains( '.stack' ) ) { + return currentSlide.querySelector( SLIDES_SELECTOR + '.future' ) == null ? true : false; + } + else { + return document.querySelector( SLIDES_SELECTOR + '.future' ) == null ? true : false; + } + }, + + // Forward event binding to the reveal DOM element + addEventListener: function( type, listener, useCapture ) { + if( 'addEventListener' in window ) { + ( dom.wrapper || document.querySelector( '.reveal' ) ).addEventListener( type, listener, useCapture ); + } + }, + removeEventListener: function( type, listener, useCapture ) { + if( 'addEventListener' in window ) { + ( dom.wrapper || document.querySelector( '.reveal' ) ).removeEventListener( type, listener, useCapture ); + } + } + }; + +})(); diff --git a/js/reveal.min.js b/js/reveal.min.js new file mode 100644 index 0000000..e9d124f --- /dev/null +++ b/js/reveal.min.js @@ -0,0 +1,8 @@ +/*! + * reveal.js 2.5.0 (2013-06-22, 19:21) + * http://lab.hakim.se/reveal-js + * MIT licensed + * + * Copyright (C) 2013 Hakim El Hattab, http://hakim.se + */ +var Reveal=function(){"use strict";function e(e){return zt||Yt?(window.addEventListener("load",k,!1),l(Pt,e),r(),o(),void 0):(document.body.setAttribute("class","no-transforms"),void 0)}function t(){if(Ot.theme=document.querySelector("#theme"),Ot.wrapper=document.querySelector(".reveal"),Ot.slides=document.querySelector(".reveal .slides"),document.querySelector(".reveal .backgrounds")||(Ot.background=document.createElement("div"),Ot.background.classList.add("backgrounds"),Ot.wrapper.appendChild(Ot.background)),!Ot.wrapper.querySelector(".progress")){var e=document.createElement("div");e.classList.add("progress"),e.innerHTML="",Ot.wrapper.appendChild(e)}if(!Ot.wrapper.querySelector(".controls")){var t=document.createElement("aside");t.classList.add("controls"),t.innerHTML='',Ot.wrapper.appendChild(t)}if(!Ot.wrapper.querySelector(".state-background")){var n=document.createElement("div");n.classList.add("state-background"),Ot.wrapper.appendChild(n)}if(!Ot.wrapper.querySelector(".pause-overlay")){var r=document.createElement("div");r.classList.add("pause-overlay"),Ot.wrapper.appendChild(r)}Ot.progress=document.querySelector(".reveal .progress"),Ot.progressbar=document.querySelector(".reveal .progress span"),Pt.controls&&(Ot.controls=document.querySelector(".reveal .controls"),Ot.controlsLeft=d(document.querySelectorAll(".navigate-left")),Ot.controlsRight=d(document.querySelectorAll(".navigate-right")),Ot.controlsUp=d(document.querySelectorAll(".navigate-up")),Ot.controlsDown=d(document.querySelectorAll(".navigate-down")),Ot.controlsPrev=d(document.querySelectorAll(".navigate-prev")),Ot.controlsNext=d(document.querySelectorAll(".navigate-next")))}function n(){function e(e,t){var n={background:e.getAttribute("data-background"),backgroundSize:e.getAttribute("data-background-size"),backgroundImage:e.getAttribute("data-background-image"),backgroundColor:e.getAttribute("data-background-color"),backgroundRepeat:e.getAttribute("data-background-repeat"),backgroundPosition:e.getAttribute("data-background-position"),backgroundTransition:e.getAttribute("data-background-transition")},r=document.createElement("div");return r.className="slide-background",n.background&&(/^(http|file|\/\/)/gi.test(n.background)||/\.(png|jpg|jpeg|gif|bmp)$/gi.test(n.background)?r.style.backgroundImage="url("+n.background+")":r.style.background=n.background),n.backgroundSize&&(r.style.backgroundSize=n.backgroundSize),n.backgroundImage&&(r.style.backgroundImage='url("'+n.backgroundImage+'")'),n.backgroundColor&&(r.style.backgroundColor=n.backgroundColor),n.backgroundRepeat&&(r.style.backgroundRepeat=n.backgroundRepeat),n.backgroundPosition&&(r.style.backgroundPosition=n.backgroundPosition),n.backgroundTransition&&r.setAttribute("data-background-transition",n.backgroundTransition),t.appendChild(r),r}v()&&document.body.classList.add("print-pdf"),Ot.background.innerHTML="",Ot.background.classList.add("no-transition"),d(document.querySelectorAll(xt)).forEach(function(t){var n;n=v()?e(t,t):e(t,Ot.background),d(t.querySelectorAll("section")).forEach(function(t){v()?e(t,t):e(t,n)})})}function r(){/iphone|ipod|android/gi.test(navigator.userAgent)&&!/crios/gi.test(navigator.userAgent)&&(window.addEventListener("load",p,!1),window.addEventListener("orientationchange",p,!1))}function o(){function e(){n.length&&head.js.apply(null,n),a()}for(var t=[],n=[],r=0,o=Pt.dependencies.length;o>r;r++){var i=Pt.dependencies[r];(!i.condition||i.condition())&&(i.async?n.push(i.src):t.push(i.src),"function"==typeof i.callback&&head.ready(i.src.match(/([\w\d_\-]*)\.?js$|[^\\\/]*$/i)[0],i.callback))}t.length?(head.ready(e),head.js.apply(null,t)):e()}function a(){t(),i(),K(),setTimeout(function(){m("ready",{indexh:Dt,indexv:Ct,currentSlide:At})},1)}function i(e){if(Ot.wrapper.classList.remove(Pt.transition),"object"==typeof e&&l(Pt,e),Yt===!1&&(Pt.transition="linear"),Ot.wrapper.classList.add(Pt.transition),Ot.wrapper.setAttribute("data-transition-speed",Pt.transitionSpeed),Ot.wrapper.setAttribute("data-background-transition",Pt.backgroundTransition),Ot.controls&&(Ot.controls.style.display=Pt.controls&&Ot.controls?"block":"none"),Ot.progress&&(Ot.progress.style.display=Pt.progress&&Ot.progress?"block":"none"),Pt.rtl?Ot.wrapper.classList.add("rtl"):Ot.wrapper.classList.remove("rtl"),Pt.center?Ot.wrapper.classList.add("center"):Ot.wrapper.classList.remove("center"),Pt.mouseWheel?(document.addEventListener("DOMMouseScroll",ft,!1),document.addEventListener("mousewheel",ft,!1)):(document.removeEventListener("DOMMouseScroll",ft,!1),document.removeEventListener("mousewheel",ft,!1)),Pt.rollingLinks?g():h(),Pt.previewLinks?y():(b(),y("[data-preview-link]")),Pt.theme&&Ot.theme){var t=Ot.theme.getAttribute("href"),n=/[^\/]*?(?=\.css)/,r=t.match(n)[0];Pt.theme!==r&&(t=t.replace(n,Pt.theme),Ot.theme.setAttribute("href",t))}Y()}function s(){Ft=!0,window.addEventListener("hashchange",wt,!1),window.addEventListener("resize",Lt,!1),Pt.touch&&(Ot.wrapper.addEventListener("touchstart",it,!1),Ot.wrapper.addEventListener("touchmove",st,!1),Ot.wrapper.addEventListener("touchend",ct,!1),window.navigator.msPointerEnabled&&(Ot.wrapper.addEventListener("MSPointerDown",lt,!1),Ot.wrapper.addEventListener("MSPointerMove",dt,!1),Ot.wrapper.addEventListener("MSPointerUp",ut,!1))),Pt.keyboard&&document.addEventListener("keydown",at,!1),Pt.progress&&Ot.progress&&Ot.progress.addEventListener("click",vt,!1),Pt.controls&&Ot.controls&&["touchstart","click"].forEach(function(e){Ot.controlsLeft.forEach(function(t){t.addEventListener(e,pt,!1)}),Ot.controlsRight.forEach(function(t){t.addEventListener(e,mt,!1)}),Ot.controlsUp.forEach(function(t){t.addEventListener(e,gt,!1)}),Ot.controlsDown.forEach(function(t){t.addEventListener(e,ht,!1)}),Ot.controlsPrev.forEach(function(t){t.addEventListener(e,yt,!1)}),Ot.controlsNext.forEach(function(t){t.addEventListener(e,bt,!1)})})}function c(){Ft=!1,document.removeEventListener("keydown",at,!1),window.removeEventListener("hashchange",wt,!1),window.removeEventListener("resize",Lt,!1),Ot.wrapper.removeEventListener("touchstart",it,!1),Ot.wrapper.removeEventListener("touchmove",st,!1),Ot.wrapper.removeEventListener("touchend",ct,!1),window.navigator.msPointerEnabled&&(Ot.wrapper.removeEventListener("MSPointerDown",lt,!1),Ot.wrapper.removeEventListener("MSPointerMove",dt,!1),Ot.wrapper.removeEventListener("MSPointerUp",ut,!1)),Pt.progress&&Ot.progress&&Ot.progress.removeEventListener("click",vt,!1),Pt.controls&&Ot.controls&&["touchstart","click"].forEach(function(e){Ot.controlsLeft.forEach(function(t){t.removeEventListener(e,pt,!1)}),Ot.controlsRight.forEach(function(t){t.removeEventListener(e,mt,!1)}),Ot.controlsUp.forEach(function(t){t.removeEventListener(e,gt,!1)}),Ot.controlsDown.forEach(function(t){t.removeEventListener(e,ht,!1)}),Ot.controlsPrev.forEach(function(t){t.removeEventListener(e,yt,!1)}),Ot.controlsNext.forEach(function(t){t.removeEventListener(e,bt,!1)})})}function l(e,t){for(var n in t)e[n]=t[n]}function d(e){return Array.prototype.slice.call(e)}function u(e,t){var n=e.x-t.x,r=e.y-t.y;return Math.sqrt(n*n+r*r)}function f(e){var t=0;if(e){var n=0;d(e.childNodes).forEach(function(e){"number"==typeof e.offsetTop&&e.style&&("absolute"===e.style.position&&(n+=1),t=Math.max(t,e.offsetTop+e.offsetHeight))}),0===n&&(t=e.offsetHeight)}return t}function v(){return/print-pdf/gi.test(window.location.search)}function p(){0===window.orientation?(document.documentElement.style.overflow="scroll",document.body.style.height="120%"):(document.documentElement.style.overflow="",document.body.style.height="100%"),setTimeout(function(){window.scrollTo(0,1)},10)}function m(e,t){var n=document.createEvent("HTMLEvents",1,2);n.initEvent(e,!0,!0),l(n,t),Ot.wrapper.dispatchEvent(n)}function g(){if(Yt&&!("msPerspective"in document.body.style))for(var e=document.querySelectorAll(qt+" a:not(.image)"),t=0,n=e.length;n>t;t++){var r=e[t];if(!(!r.textContent||r.querySelector("*")||r.className&&r.classList.contains(r,"roll"))){var o=document.createElement("span");o.setAttribute("data-title",r.text),o.innerHTML=r.innerHTML,r.classList.add("roll"),r.innerHTML="",r.appendChild(o)}}}function h(){for(var e=document.querySelectorAll(qt+" a.roll"),t=0,n=e.length;n>t;t++){var r=e[t],o=r.querySelector("span");o&&(r.classList.remove("roll"),r.innerHTML=o.innerHTML)}}function y(e){var t=d(document.querySelectorAll(e?e:"a"));t.forEach(function(e){/^(http|www)/gi.test(e.getAttribute("href"))&&e.addEventListener("click",kt,!1)})}function b(){var e=d(document.querySelectorAll("a"));e.forEach(function(e){/^(http|www)/gi.test(e.getAttribute("href"))&&e.removeEventListener("click",kt,!1)})}function w(e){L(),Ot.preview=document.createElement("div"),Ot.preview.classList.add("preview-link-overlay"),Ot.wrapper.appendChild(Ot.preview),Ot.preview.innerHTML=["
",'','',"
",'
','
','',"
"].join(""),Ot.preview.querySelector("iframe").addEventListener("load",function(){Ot.preview.classList.add("loaded")},!1),Ot.preview.querySelector(".close").addEventListener("click",function(e){L(),e.preventDefault()},!1),Ot.preview.querySelector(".external").addEventListener("click",function(){L()},!1),setTimeout(function(){Ot.preview.classList.add("visible")},1)}function L(){Ot.preview&&(Ot.preview.setAttribute("src",""),Ot.preview.parentNode.removeChild(Ot.preview),Ot.preview=null)}function E(e){var t=d(e);return t.forEach(function(e,t){e.hasAttribute("data-fragment-index")||e.setAttribute("data-fragment-index",t)}),t.sort(function(e,t){return e.getAttribute("data-fragment-index")-t.getAttribute("data-fragment-index")}),t}function k(){if(Ot.wrapper&&!v()){var e=Ot.wrapper.offsetWidth,t=Ot.wrapper.offsetHeight;e-=t*Pt.margin,t-=t*Pt.margin;var n=Pt.width,r=Pt.height;if("string"==typeof n&&/%$/.test(n)&&(n=parseInt(n,10)/100*e),"string"==typeof r&&/%$/.test(r)&&(r=parseInt(r,10)/100*t),Ot.slides.style.width=n+"px",Ot.slides.style.height=r+"px",It=Math.min(e/n,t/r),It=Math.max(It,Pt.minScale),It=Math.min(It,Pt.maxScale),void 0===Ot.slides.style.zoom||navigator.userAgent.match(/(iphone|ipod|ipad|android)/gi)){var o="translate(-50%, -50%) scale("+It+") translate(50%, 50%)";Ot.slides.style.WebkitTransform=o,Ot.slides.style.MozTransform=o,Ot.slides.style.msTransform=o,Ot.slides.style.OTransform=o,Ot.slides.style.transform=o}else Ot.slides.style.zoom=It;for(var a=d(document.querySelectorAll(qt)),i=0,s=a.length;s>i;i++){var c=a[i];"none"!==c.style.display&&(c.style.top=Pt.center?c.classList.contains("stack")?0:Math.max(-(f(c)/2)-20,-r/2)+"px":"")}H()}}function S(e,t){"object"==typeof e&&"function"==typeof e.setAttribute&&e.setAttribute("data-previous-indexv",t||0)}function A(e){if("object"==typeof e&&"function"==typeof e.setAttribute&&e.classList.contains("stack")){var t=e.hasAttribute("data-start-indexv")?"data-start-indexv":"data-previous-indexv";return parseInt(e.getAttribute(t)||0,10)}return 0}function q(){if(Pt.overview){G();var e=Ot.wrapper.classList.contains("overview");Ot.wrapper.classList.add("overview"),Ot.wrapper.classList.remove("exit-overview"),clearTimeout(Ut),clearTimeout(jt),Ut=setTimeout(function(){for(var t=document.querySelectorAll(xt),n=0,r=t.length;r>n;n++){var o=t[n],a=Pt.rtl?-105:105,i="translateZ(-2500px) translate("+(n-Dt)*a+"%, 0%)";if(o.setAttribute("data-index-h",n),o.style.display="block",o.style.WebkitTransform=i,o.style.MozTransform=i,o.style.msTransform=i,o.style.OTransform=i,o.style.transform=i,o.classList.contains("stack"))for(var s=o.querySelectorAll("section"),c=0,l=s.length;l>c;c++){var d=n===Dt?Ct:A(o),u=s[c],f="translate(0%, "+105*(c-d)+"%)";u.setAttribute("data-index-h",n),u.setAttribute("data-index-v",c),u.style.display="block",u.style.WebkitTransform=f,u.style.MozTransform=f,u.style.msTransform=f,u.style.OTransform=f,u.style.transform=f,u.addEventListener("click",Et,!0)}else o.addEventListener("click",Et,!0)}k(),e||m("overviewshown",{indexh:Dt,indexv:Ct,currentSlide:At})},10)}}function x(){if(Pt.overview){clearTimeout(Ut),clearTimeout(jt),Ot.wrapper.classList.remove("overview"),Ot.wrapper.classList.add("exit-overview"),jt=setTimeout(function(){Ot.wrapper.classList.remove("exit-overview")},10);for(var e=d(document.querySelectorAll(qt)),t=0,n=e.length;n>t;t++){var r=e[t];r.style.display="",r.style.WebkitTransform="",r.style.MozTransform="",r.style.msTransform="",r.style.OTransform="",r.style.transform="",r.removeEventListener("click",Et,!0)}O(Dt,Ct),B(),m("overviewhidden",{indexh:Dt,indexv:Ct,currentSlide:At})}}function T(e){"boolean"==typeof e?e?q():x():M()?x():q()}function M(){return Ot.wrapper.classList.contains("overview")}function P(e){return e=e?e:At,e&&!!e.parentNode.nodeName.match(/section/i)}function N(){var e=document.body,t=e.requestFullScreen||e.webkitRequestFullscreen||e.webkitRequestFullScreen||e.mozRequestFullScreen||e.msRequestFullScreen;t&&t.apply(e)}function D(){var e=Ot.wrapper.classList.contains("paused");G(),Ot.wrapper.classList.add("paused"),e===!1&&m("paused")}function C(){var e=Ot.wrapper.classList.contains("paused");Ot.wrapper.classList.remove("paused"),B(),e&&m("resumed")}function R(){I()?C():D()}function I(){return Ot.wrapper.classList.contains("paused")}function O(e,t,n,r){St=At;var o=document.querySelectorAll(xt);void 0===t&&(t=A(o[e])),St&&St.parentNode&&St.parentNode.classList.contains("stack")&&S(St.parentNode,Ct);var a=Rt.concat();Rt.length=0;var i=Dt,s=Ct;Dt=z(xt,void 0===e?Dt:e),Ct=z(Tt,void 0===t?Ct:t),k();e:for(var c=0,l=Rt.length;l>c;c++){for(var u=0;a.length>u;u++)if(a[u]===Rt[c]){a.splice(u,1);continue e}document.documentElement.classList.add(Rt[c]),m(Rt[c])}for(;a.length;)document.documentElement.classList.remove(a.pop());M()&&q(),$(1500);var f=o[Dt],v=f.querySelectorAll("section");if(At=v[Ct]||f,n!==void 0){var p=E(At.querySelectorAll(".fragment"));d(p).forEach(function(e,t){n>t?e.classList.add("visible"):e.classList.remove("visible")})}var g=Dt!==i||Ct!==s;g?m("slidechanged",{indexh:Dt,indexv:Ct,previousSlide:St,currentSlide:At,origin:r}):St=null,St&&(St.classList.remove("present"),document.querySelector(Mt).classList.contains("present")&&setTimeout(function(){var e,t=d(document.querySelectorAll(xt+".stack"));for(e in t)t[e]&&S(t[e],0)},0)),g&&(_(St),F(At)),X(),H(),W()}function Y(){c(),s(),k(),Nt=Pt.autoSlide,B(),n(),X(),H(),W()}function z(e,t){var n=d(document.querySelectorAll(e)),r=n.length;if(r){Pt.loop&&(t%=r,0>t&&(t=r+t)),t=Math.max(Math.min(t,r-1),0);for(var o=0;r>o;o++){var a=n[o];if(M()===!1){var i=Math.abs((t-o)%(r-3))||0;a.style.display=i>3?"none":"block"}var s=Pt.rtl&&!P(a);a.classList.remove("past"),a.classList.remove("present"),a.classList.remove("future"),a.setAttribute("hidden",""),t>o?a.classList.add(s?"future":"past"):o>t&&a.classList.add(s?"past":"future"),a.querySelector("section")&&a.classList.add("stack")}n[t].classList.add("present"),n[t].removeAttribute("hidden");var c=n[t].getAttribute("data-state");c&&(Rt=Rt.concat(c.split(" ")));var l=n[t].getAttribute("data-autoslide");Nt=l?parseInt(l,10):Pt.autoSlide}else t=0;return t}function H(){if(Pt.progress&&Ot.progress){var e=d(document.querySelectorAll(xt)),t=document.querySelectorAll(qt+":not(.stack)").length,n=0;e:for(var r=0;e.length>r;r++){for(var o=e[r],a=d(o.querySelectorAll("section")),i=0;a.length>i;i++){if(a[i].classList.contains("present"))break e;n++}if(o.classList.contains("present"))break;o.classList.contains("stack")===!1&&n++}Ot.progressbar.style.width=n/(t-1)*window.innerWidth+"px"}}function X(){if(Pt.controls&&Ot.controls){var e=U(),t=j();Ot.controlsLeft.concat(Ot.controlsRight).concat(Ot.controlsUp).concat(Ot.controlsDown).concat(Ot.controlsPrev).concat(Ot.controlsNext).forEach(function(e){e.classList.remove("enabled"),e.classList.remove("fragmented")}),e.left&&Ot.controlsLeft.forEach(function(e){e.classList.add("enabled")}),e.right&&Ot.controlsRight.forEach(function(e){e.classList.add("enabled")}),e.up&&Ot.controlsUp.forEach(function(e){e.classList.add("enabled")}),e.down&&Ot.controlsDown.forEach(function(e){e.classList.add("enabled")}),(e.left||e.up)&&Ot.controlsPrev.forEach(function(e){e.classList.add("enabled")}),(e.right||e.down)&&Ot.controlsNext.forEach(function(e){e.classList.add("enabled")}),At&&(t.prev&&Ot.controlsPrev.forEach(function(e){e.classList.add("fragmented","enabled")}),t.next&&Ot.controlsNext.forEach(function(e){e.classList.add("fragmented","enabled")}),P(At)?(t.prev&&Ot.controlsUp.forEach(function(e){e.classList.add("fragmented","enabled")}),t.next&&Ot.controlsDown.forEach(function(e){e.classList.add("fragmented","enabled")})):(t.prev&&Ot.controlsLeft.forEach(function(e){e.classList.add("fragmented","enabled")}),t.next&&Ot.controlsRight.forEach(function(e){e.classList.add("fragmented","enabled")})))}}function W(){d(Ot.background.childNodes).forEach(function(e,t){var n=Pt.rtl?"future":"past",r=Pt.rtl?"past":"future";e.className="slide-background "+(Dt>t?n:t>Dt?r:"present"),d(e.childNodes).forEach(function(e,t){e.className="slide-background "+(Ct>t?"past":t>Ct?"future":"present")})}),setTimeout(function(){Ot.background.classList.remove("no-transition")},1)}function U(){var e=document.querySelectorAll(xt),t=document.querySelectorAll(Tt),n={left:Dt>0||Pt.loop,right:e.length-1>Dt||Pt.loop,up:Ct>0,down:t.length-1>Ct};if(Pt.rtl){var r=n.left;n.left=n.right,n.right=r}return n}function j(){if(At&&Pt.fragments){var e=At.querySelectorAll(".fragment"),t=At.querySelectorAll(".fragment:not(.visible)");return{prev:e.length-t.length>0,next:!!t.length}}return{prev:!1,next:!1}}function F(e){e&&(d(e.querySelectorAll("video, audio")).forEach(function(e){e.hasAttribute("data-autoplay")&&e.play()}),d(e.querySelectorAll('iframe[src*="youtube.com/embed/"]')).forEach(function(e){e.hasAttribute("data-autoplay")&&e.contentWindow.postMessage('{"event":"command","func":"playVideo","args":""}',"*")}))}function _(e){e&&(d(e.querySelectorAll("video, audio")).forEach(function(e){e.hasAttribute("data-ignore")||e.pause()}),d(e.querySelectorAll('iframe[src*="youtube.com/embed/"]')).forEach(function(e){e.hasAttribute("data-ignore")||"function"!=typeof e.contentWindow.postMessage||e.contentWindow.postMessage('{"event":"command","func":"pauseVideo","args":""}',"*")}))}function K(){var e=window.location.hash,t=e.slice(2).split("/"),n=e.replace(/#|\//gi,"");if(isNaN(parseInt(t[0],10))&&n.length){var r=document.querySelector("#"+n);if(r){var o=Reveal.getIndices(r);O(o.h,o.v)}else O(Dt,Ct)}else{var a=parseInt(t[0],10)||0,i=parseInt(t[1],10)||0;O(a,i)}}function $(e){if(Pt.history)if(clearTimeout(Wt),"number"==typeof e)Wt=setTimeout($,e);else{var t="/";At&&"string"==typeof At.getAttribute("id")?t="/"+At.getAttribute("id"):((Dt>0||Ct>0)&&(t+=Dt),Ct>0&&(t+="/"+Ct)),window.location.hash=t}}function V(e){var t,n=Dt,r=Ct;if(e){var o=P(e),a=o?e.parentNode:e,i=d(document.querySelectorAll(xt));n=Math.max(i.indexOf(a),0),o&&(r=Math.max(d(e.parentNode.querySelectorAll("section")).indexOf(e),0))}if(!e&&At){var s=At.querySelectorAll(".fragment.visible");s.length&&(t=s.length)}return{h:n,v:r,f:t}}function Z(){if(At&&Pt.fragments){var e=E(At.querySelectorAll(".fragment:not(.visible)"));if(e.length){var t=e[0].getAttribute("data-fragment-index");return e=At.querySelectorAll('.fragment[data-fragment-index="'+t+'"]'),d(e).forEach(function(e){e.classList.add("visible"),m("fragmentshown",{fragment:e})}),X(),!0}}return!1}function Q(){if(At&&Pt.fragments){var e=E(At.querySelectorAll(".fragment.visible"));if(e.length){var t=e[e.length-1].getAttribute("data-fragment-index");return e=At.querySelectorAll('.fragment[data-fragment-index="'+t+'"]'),d(e).forEach(function(e){e.classList.remove("visible"),m("fragmenthidden",{fragment:e})}),X(),!0}}return!1}function B(){clearTimeout(Xt),!Nt||I()||M()||(Xt=setTimeout(ot,Nt))}function G(){clearTimeout(Xt)}function J(){Pt.rtl?(M()||Z()===!1)&&U().left&&O(Dt+1):(M()||Q()===!1)&&U().left&&O(Dt-1)}function et(){Pt.rtl?(M()||Q()===!1)&&U().right&&O(Dt-1):(M()||Z()===!1)&&U().right&&O(Dt+1)}function tt(){(M()||Q()===!1)&&U().up&&O(Dt,Ct-1)}function nt(){(M()||Z()===!1)&&U().down&&O(Dt,Ct+1)}function rt(){if(Q()===!1)if(U().up)tt();else{var e=document.querySelector(xt+".past:nth-child("+Dt+")");if(e){var t=e.querySelectorAll("section").length-1||void 0,n=Dt-1;O(n,t)}}}function ot(){Z()===!1&&(U().down?nt():et()),B()}function at(e){document.activeElement;var t=!(!document.activeElement||!document.activeElement.type&&!document.activeElement.href&&"inherit"===document.activeElement.contentEditable);if(!(t||e.shiftKey&&32!==e.keyCode||e.altKey||e.ctrlKey||e.metaKey)){if(I()&&-1===[66,190,191].indexOf(e.keyCode))return!1;var n=!1;if("object"==typeof Pt.keyboard)for(var r in Pt.keyboard)if(parseInt(r,10)===e.keyCode){var o=Pt.keyboard[r];"function"==typeof o?o.apply(null,[e]):"string"==typeof o&&"function"==typeof Reveal[o]&&Reveal[o].call(),n=!0}if(n===!1)switch(n=!0,e.keyCode){case 80:case 33:rt();break;case 78:case 34:ot();break;case 72:case 37:J();break;case 76:case 39:et();break;case 75:case 38:tt();break;case 74:case 40:nt();break;case 36:O(0);break;case 35:O(Number.MAX_VALUE);break;case 32:M()?x():e.shiftKey?rt():ot();break;case 13:M()?x():n=!1;break;case 66:case 190:case 191:R();break;case 70:N();break;default:n=!1}n?e.preventDefault():27===e.keyCode&&Yt&&(T(),e.preventDefault()),B()}}function it(e){_t.startX=e.touches[0].clientX,_t.startY=e.touches[0].clientY,_t.startCount=e.touches.length,2===e.touches.length&&Pt.overview&&(_t.startSpan=u({x:e.touches[1].clientX,y:e.touches[1].clientY},{x:_t.startX,y:_t.startY}))}function st(e){if(_t.handled)navigator.userAgent.match(/android/gi)&&e.preventDefault();else{var t=e.touches[0].clientX,n=e.touches[0].clientY;if(2===e.touches.length&&2===_t.startCount&&Pt.overview){var r=u({x:e.touches[1].clientX,y:e.touches[1].clientY},{x:_t.startX,y:_t.startY});Math.abs(_t.startSpan-r)>_t.threshold&&(_t.handled=!0,_t.startSpan>r?q():x()),e.preventDefault()}else if(1===e.touches.length&&2!==_t.startCount){var o=t-_t.startX,a=n-_t.startY;o>_t.threshold&&Math.abs(o)>Math.abs(a)?(_t.handled=!0,J()):-_t.threshold>o&&Math.abs(o)>Math.abs(a)?(_t.handled=!0,et()):a>_t.threshold?(_t.handled=!0,tt()):-_t.threshold>a&&(_t.handled=!0,nt()),e.preventDefault()}}}function ct(){_t.handled=!1}function lt(e){e.pointerType===e.MSPOINTER_TYPE_TOUCH&&(e.touches=[{clientX:e.clientX,clientY:e.clientY}],it(e))}function dt(e){e.pointerType===e.MSPOINTER_TYPE_TOUCH&&(e.touches=[{clientX:e.clientX,clientY:e.clientY}],st(e))}function ut(e){e.pointerType===e.MSPOINTER_TYPE_TOUCH&&(e.touches=[{clientX:e.clientX,clientY:e.clientY}],ct(e))}function ft(e){if(Date.now()-Ht>600){Ht=Date.now();var t=e.detail||-e.wheelDelta;t>0?ot():rt()}}function vt(e){e.preventDefault();var t=d(document.querySelectorAll(xt)).length,n=Math.floor(e.clientX/Ot.wrapper.offsetWidth*t);O(n)}function pt(e){e.preventDefault(),J()}function mt(e){e.preventDefault(),et()}function gt(e){e.preventDefault(),tt()}function ht(e){e.preventDefault(),nt()}function yt(e){e.preventDefault(),rt()}function bt(e){e.preventDefault(),ot()}function wt(){K()}function Lt(){k()}function Et(e){if(Ft&&M()){e.preventDefault();for(var t=e.target;t&&!t.nodeName.match(/section/gi);)t=t.parentNode;if(t&&!t.classList.contains("disabled")&&(x(),t.nodeName.match(/section/gi))){var n=parseInt(t.getAttribute("data-index-h"),10),r=parseInt(t.getAttribute("data-index-v"),10);O(n,r)}}}function kt(e){var t=e.target.getAttribute("href");t&&(w(t),e.preventDefault())}var St,At,qt=".reveal .slides section",xt=".reveal .slides>section",Tt=".reveal .slides>section.present>section",Mt=".reveal .slides>section:first-child",Pt={width:960,height:700,margin:.1,minScale:.2,maxScale:1,controls:!0,progress:!0,history:!1,keyboard:!0,overview:!0,center:!0,touch:!0,loop:!1,rtl:!1,fragments:!0,autoSlide:0,mouseWheel:!1,rollingLinks:!0,previewLinks:!1,theme:null,transition:"default",transitionSpeed:"default",backgroundTransition:"default",dependencies:[]},Nt=0,Dt=0,Ct=0,Rt=[],It=1,Ot={},Yt="WebkitPerspective"in document.body.style||"MozPerspective"in document.body.style||"msPerspective"in document.body.style||"OPerspective"in document.body.style||"perspective"in document.body.style,zt="WebkitTransform"in document.body.style||"MozTransform"in document.body.style||"msTransform"in document.body.style||"OTransform"in document.body.style||"transform"in document.body.style,Ht=0,Xt=0,Wt=0,Ut=0,jt=0,Ft=!1,_t={startX:0,startY:0,startSpan:0,startCount:0,handled:!1,threshold:80};return{initialize:e,configure:i,sync:Y,slide:O,left:J,right:et,up:tt,down:nt,prev:rt,next:ot,prevFragment:Q,nextFragment:Z,navigateTo:O,navigateLeft:J,navigateRight:et,navigateUp:tt,navigateDown:nt,navigatePrev:rt,navigateNext:ot,layout:k,availableRoutes:U,availableFragments:j,toggleOverview:T,togglePause:R,isOverview:M,isPaused:I,addEventListeners:s,removeEventListeners:c,getIndices:V,getSlide:function(e,t){var n=document.querySelectorAll(xt)[e],r=n&&n.querySelectorAll("section");return t!==void 0?r?r[t]:void 0:n},getPreviousSlide:function(){return St},getCurrentSlide:function(){return At},getScale:function(){return It},getConfig:function(){return Pt},getQueryHash:function(){var e={};return location.search.replace(/[A-Z0-9]+?=(\w*)/gi,function(t){e[t.split("=").shift()]=t.split("=").pop()}),e},isFirstSlide:function(){return null==document.querySelector(qt+".past")?!0:!1},isLastSlide:function(){return At&&At.classList.contains(".stack")?null==At.querySelector(qt+".future")?!0:!1:null==document.querySelector(qt+".future")?!0:!1},addEventListener:function(e,t,n){"addEventListener"in window&&(Ot.wrapper||document.querySelector(".reveal")).addEventListener(e,t,n)},removeEventListener:function(e,t,n){"addEventListener"in window&&(Ot.wrapper||document.querySelector(".reveal")).removeEventListener(e,t,n)}}}(); \ No newline at end of file diff --git a/plugin/highlight/highlight.js b/plugin/highlight/highlight.js new file mode 100644 index 0000000..3f3bea6 --- /dev/null +++ b/plugin/highlight/highlight.js @@ -0,0 +1,31 @@ +// START CUSTOM REVEAL.JS INTEGRATION +(function() { + if( typeof window.addEventListener === 'function' ) { + var hljs_nodes = document.querySelectorAll( 'pre code' ); + + for( var i = 0, len = hljs_nodes.length; i < len; i++ ) { + var element = hljs_nodes[i]; + + // trim whitespace if data-trim attribute is present + if( element.hasAttribute( 'data-trim' ) && typeof element.innerHTML.trim === 'function' ) { + element.innerHTML = element.innerHTML.trim(); + } + + // Now escape html unless prevented by author + if( ! element.hasAttribute( 'data-noescape' )) { + element.innerHTML = element.innerHTML.replace(//g,">"); + } + + // re-highlight when focus is lost (for edited code) + element.addEventListener( 'focusout', function( event ) { + hljs.highlightBlock( event.currentTarget ); + }, false ); + } + } +})(); +// END CUSTOM REVEAL.JS INTEGRATION + +// highlight.js build includes support for: +// Bash, C#, C++, CSS, Diff, HTML, XML, HTTP, Ini, JSON, Java, JavaScript, PHP, Perl, Python, Ruby, SQL, Clojure, GLSL, Lua, Scala, CoffeeScript, Go, Objective C, ActionScript, Markdown + +var hljs=new function(){function l(o){return o.replace(/&/gm,"&").replace(//gm,">")}function b(p){for(var o=p.firstChild;o;o=o.nextSibling){if(o.nodeName=="CODE"){return o}if(!(o.nodeType==3&&o.nodeValue.match(/\s+/))){break}}}function h(p,o){return Array.prototype.map.call(p.childNodes,function(q){if(q.nodeType==3){return o?q.nodeValue.replace(/\n/g,""):q.nodeValue}if(q.nodeName=="BR"){return"\n"}return h(q,o)}).join("")}function a(q){var p=(q.className+" "+q.parentNode.className).split(/\s+/);p=p.map(function(r){return r.replace(/^language-/,"")});for(var o=0;o"}while(x.length||v.length){var u=t().splice(0,1)[0];y+=l(w.substr(p,u.offset-p));p=u.offset;if(u.event=="start"){y+=s(u.node);r.push(u.node)}else{if(u.event=="stop"){var o,q=r.length;do{q--;o=r[q];y+=("")}while(o!=u.node);r.splice(q,1);while(q'+L[0]+""}else{r+=L[0]}N=A.lR.lastIndex;L=A.lR.exec(K)}return r+K.substr(N)}function z(){if(A.sL&&!e[A.sL]){return l(w)}var r=A.sL?d(A.sL,w):g(w);if(A.r>0){v+=r.keyword_count;B+=r.r}return''+r.value+""}function J(){return A.sL!==undefined?z():G()}function I(L,r){var K=L.cN?'':"";if(L.rB){x+=K;w=""}else{if(L.eB){x+=l(r)+K;w=""}else{x+=K;w=r}}A=Object.create(L,{parent:{value:A}});B+=L.r}function C(K,r){w+=K;if(r===undefined){x+=J();return 0}var L=o(r,A);if(L){x+=J();I(L,r);return L.rB?0:r.length}var M=s(A,r);if(M){if(!(M.rE||M.eE)){w+=r}x+=J();do{if(A.cN){x+=""}A=A.parent}while(A!=M.parent);if(M.eE){x+=l(r)}w="";if(M.starts){I(M.starts,"")}return M.rE?0:r.length}if(t(r,A)){throw"Illegal"}w+=r;return r.length||1}var F=e[D];f(F);var A=F;var w="";var B=0;var v=0;var x="";try{var u,q,p=0;while(true){A.t.lastIndex=p;u=A.t.exec(E);if(!u){break}q=C(E.substr(p,u.index-p),u[0]);p=u.index+q}C(E.substr(p));return{r:B,keyword_count:v,value:x,language:D}}catch(H){if(H=="Illegal"){return{r:0,keyword_count:0,value:l(E)}}else{throw H}}}function g(s){var o={keyword_count:0,r:0,value:l(s)};var q=o;for(var p in e){if(!e.hasOwnProperty(p)){continue}var r=d(p,s);r.language=p;if(r.keyword_count+r.r>q.keyword_count+q.r){q=r}if(r.keyword_count+r.r>o.keyword_count+o.r){q=o;o=r}}if(q.language){o.second_best=q}return o}function i(q,p,o){if(p){q=q.replace(/^((<[^>]+>|\t)+)/gm,function(r,v,u,t){return v.replace(/\t/g,p)})}if(o){q=q.replace(/\n/g,"
")}return q}function m(r,u,p){var v=h(r,p);var t=a(r);if(t=="no-highlight"){return}var w=t?d(t,v):g(v);t=w.language;var o=c(r);if(o.length){var q=document.createElement("pre");q.innerHTML=w.value;w.value=j(o,c(q),v)}w.value=i(w.value,u,p);var s=r.className;if(!s.match("(\\s|^)(language-)?"+t+"(\\s|$)")){s=s?(s+" "+t):t}r.innerHTML=w.value;r.className=s;r.result={language:t,kw:w.keyword_count,re:w.r};if(w.second_best){r.second_best={language:w.second_best.language,kw:w.second_best.keyword_count,re:w.second_best.r}}}function n(){if(n.called){return}n.called=true;Array.prototype.map.call(document.getElementsByTagName("pre"),b).filter(Boolean).forEach(function(o){m(o,hljs.tabReplace)})}function k(){window.addEventListener("DOMContentLoaded",n,false);window.addEventListener("load",n,false)}var e={};this.LANGUAGES=e;this.highlight=d;this.highlightAuto=g;this.fixMarkup=i;this.highlightBlock=m;this.initHighlighting=n;this.initHighlightingOnLoad=k;this.IR="[a-zA-Z][a-zA-Z0-9_]*";this.UIR="[a-zA-Z_][a-zA-Z0-9_]*";this.NR="\\b\\d+(\\.\\d+)?";this.CNR="(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)";this.BNR="\\b(0b[01]+)";this.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|\\.|-|-=|/|/=|:|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~";this.BE={b:"\\\\[\\s\\S]",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.BNM={cN:"number",b:this.BNR,r:0};this.inherit=function(q,r){var o={};for(var p in q){o[p]=q[p]}if(r){for(var p in r){o[p]=r[p]}}return o}}();hljs.LANGUAGES.bash=function(a){var g="true false";var e="if then else elif fi for break continue while in do done echo exit return set declare";var c={cN:"variable",b:"\\$[a-zA-Z0-9_#]+"};var b={cN:"variable",b:"\\${([^}]|\\\\})+}"};var h={cN:"string",b:'"',e:'"',i:"\\n",c:[a.BE,c,b],r:0};var d={cN:"string",b:"'",e:"'",c:[{b:"''"}],r:0};var f={cN:"test_condition",b:"",e:"",c:[h,d,c,b],k:{literal:g},r:0};return{k:{keyword:e,literal:g},c:[{cN:"shebang",b:"(#!\\/bin\\/bash)|(#!\\/bin\\/sh)",r:10},c,b,a.HCM,h,d,a.inherit(f,{b:"\\[ ",e:" \\]",r:0}),a.inherit(f,{b:"\\[\\[ ",e:" \\]\\]"})]}}(hljs);hljs.LANGUAGES.cs=function(a){return{k:"abstract as base bool break byte case catch char checked class const continue decimal default delegate do double else enum event explicit extern false finally fixed float for foreach goto if implicit in int interface internal is lock long namespace new null object operator out override params private protected public readonly ref return sbyte sealed short sizeof stackalloc static string struct switch this throw true try typeof uint ulong unchecked unsafe ushort using virtual volatile void while ascending descending from get group into join let orderby partial select set value var where yield",c:[{cN:"comment",b:"///",e:"$",rB:true,c:[{cN:"xmlDocTag",b:"///|"},{cN:"xmlDocTag",b:""}]},a.CLCM,a.CBLCLM,{cN:"preprocessor",b:"#",e:"$",k:"if else elif endif define undef warning error line region endregion pragma checksum"},{cN:"string",b:'@"',e:'"',c:[{b:'""'}]},a.ASM,a.QSM,a.CNM]}}(hljs);hljs.LANGUAGES.ruby=function(e){var a="[a-zA-Z_][a-zA-Z0-9_]*(\\!|\\?)?";var j="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?";var g={keyword:"and false then defined module in return redo if BEGIN retry end for true self when next until do begin unless END rescue nil else break undef not super class case require yield alias while ensure elsif or include"};var c={cN:"yardoctag",b:"@[A-Za-z]+"};var k=[{cN:"comment",b:"#",e:"$",c:[c]},{cN:"comment",b:"^\\=begin",e:"^\\=end",c:[c],r:10},{cN:"comment",b:"^__END__",e:"\\n$"}];var d={cN:"subst",b:"#\\{",e:"}",l:a,k:g};var i=[e.BE,d];var b=[{cN:"string",b:"'",e:"'",c:i,r:0},{cN:"string",b:'"',e:'"',c:i,r:0},{cN:"string",b:"%[qw]?\\(",e:"\\)",c:i},{cN:"string",b:"%[qw]?\\[",e:"\\]",c:i},{cN:"string",b:"%[qw]?{",e:"}",c:i},{cN:"string",b:"%[qw]?<",e:">",c:i,r:10},{cN:"string",b:"%[qw]?/",e:"/",c:i,r:10},{cN:"string",b:"%[qw]?%",e:"%",c:i,r:10},{cN:"string",b:"%[qw]?-",e:"-",c:i,r:10},{cN:"string",b:"%[qw]?\\|",e:"\\|",c:i,r:10}];var h={cN:"function",bWK:true,e:" |$|;",k:"def",c:[{cN:"title",b:j,l:a,k:g},{cN:"params",b:"\\(",e:"\\)",l:a,k:g}].concat(k)};var f=k.concat(b.concat([{cN:"class",bWK:true,e:"$|;",k:"class module",c:[{cN:"title",b:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?",r:0},{cN:"inheritance",b:"<\\s*",c:[{cN:"parent",b:"("+e.IR+"::)?"+e.IR}]}].concat(k)},h,{cN:"constant",b:"(::)?(\\b[A-Z]\\w*(::)?)+",r:0},{cN:"symbol",b:":",c:b.concat([{b:j}]),r:0},{cN:"symbol",b:a+":",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+))"},{b:"("+e.RSR+")\\s*",c:k.concat([{cN:"regexp",b:"/",e:"/[a-z]*",i:"\\n",c:[e.BE,d]}]),r:0}]));d.c=f;h.c[1].c=f;return{l:a,k:g,c:f}}(hljs);hljs.LANGUAGES.diff=function(a){return{c:[{cN:"chunk",b:"^\\@\\@ +\\-\\d+,\\d+ +\\+\\d+,\\d+ +\\@\\@$",r:10},{cN:"chunk",b:"^\\*\\*\\* +\\d+,\\d+ +\\*\\*\\*\\*$",r:10},{cN:"chunk",b:"^\\-\\-\\- +\\d+,\\d+ +\\-\\-\\-\\-$",r:10},{cN:"header",b:"Index: ",e:"$"},{cN:"header",b:"=====",e:"=====$"},{cN:"header",b:"^\\-\\-\\-",e:"$"},{cN:"header",b:"^\\*{3} ",e:"$"},{cN:"header",b:"^\\+\\+\\+",e:"$"},{cN:"header",b:"\\*{5}",e:"\\*{5}$"},{cN:"addition",b:"^\\+",e:"$"},{cN:"deletion",b:"^\\-",e:"$"},{cN:"change",b:"^\\!",e:"$"}]}}(hljs);hljs.LANGUAGES.javascript=function(a){return{k:{keyword:"in if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const",literal:"true false null undefined NaN Infinity"},c:[a.ASM,a.QSM,a.CLCM,a.CBLCLM,a.CNM,{b:"("+a.RSR+"|\\b(case|return|throw)\\b)\\s*",k:"return throw case",c:[a.CLCM,a.CBLCLM,{cN:"regexp",b:"/",e:"/[gim]*",i:"\\n",c:[{b:"\\\\/"}]},{b:"<",e:">;",sL:"xml"}],r:0},{cN:"function",bWK:true,e:"{",k:"function",c:[{cN:"title",b:"[A-Za-z$_][0-9A-Za-z$_]*"},{cN:"params",b:"\\(",e:"\\)",c:[a.CLCM,a.CBLCLM],i:"[\"'\\(]"}],i:"\\[|%"}]}}(hljs);hljs.LANGUAGES.glsl=function(a){return{k:{keyword:"atomic_uint attribute bool break bvec2 bvec3 bvec4 case centroid coherent const continue default discard dmat2 dmat2x2 dmat2x3 dmat2x4 dmat3 dmat3x2 dmat3x3 dmat3x4 dmat4 dmat4x2 dmat4x3 dmat4x4 do double dvec2 dvec3 dvec4 else flat float for highp if iimage1D iimage1DArray iimage2D iimage2DArray iimage2DMS iimage2DMSArray iimage2DRect iimage3D iimageBuffer iimageCube iimageCubeArray image1D image1DArray image2D image2DArray image2DMS image2DMSArray image2DRect image3D imageBuffer imageCube imageCubeArray in inout int invariant isampler1D isampler1DArray isampler2D isampler2DArray isampler2DMS isampler2DMSArray isampler2DRect isampler3D isamplerBuffer isamplerCube isamplerCubeArray ivec2 ivec3 ivec4 layout lowp mat2 mat2x2 mat2x3 mat2x4 mat3 mat3x2 mat3x3 mat3x4 mat4 mat4x2 mat4x3 mat4x4 mediump noperspective out patch precision readonly restrict return sample sampler1D sampler1DArray sampler1DArrayShadow sampler1DShadow sampler2D sampler2DArray sampler2DArrayShadow sampler2DMS sampler2DMSArray sampler2DRect sampler2DRectShadow sampler2DShadow sampler3D samplerBuffer samplerCube samplerCubeArray samplerCubeArrayShadow samplerCubeShadow smooth struct subroutine switch uimage1D uimage1DArray uimage2D uimage2DArray uimage2DMS uimage2DMSArray uimage2DRect uimage3D uimageBuffer uimageCube uimageCubeArray uint uniform usampler1D usampler1DArray usampler2D usampler2DArray usampler2DMS usampler2DMSArray usampler2DRect usampler3D usamplerBuffer usamplerCube usamplerCubeArray uvec2 uvec3 uvec4 varying vec2 vec3 vec4 void volatile while writeonly",built_in:"gl_BackColor gl_BackLightModelProduct gl_BackLightProduct gl_BackMaterial gl_BackSecondaryColor gl_ClipDistance gl_ClipPlane gl_ClipVertex gl_Color gl_DepthRange gl_EyePlaneQ gl_EyePlaneR gl_EyePlaneS gl_EyePlaneT gl_Fog gl_FogCoord gl_FogFragCoord gl_FragColor gl_FragCoord gl_FragData gl_FragDepth gl_FrontColor gl_FrontFacing gl_FrontLightModelProduct gl_FrontLightProduct gl_FrontMaterial gl_FrontSecondaryColor gl_InstanceID gl_InvocationID gl_Layer gl_LightModel gl_LightSource gl_MaxAtomicCounterBindings gl_MaxAtomicCounterBufferSize gl_MaxClipDistances gl_MaxClipPlanes gl_MaxCombinedAtomicCounterBuffers gl_MaxCombinedAtomicCounters gl_MaxCombinedImageUniforms gl_MaxCombinedImageUnitsAndFragmentOutputs gl_MaxCombinedTextureImageUnits gl_MaxDrawBuffers gl_MaxFragmentAtomicCounterBuffers gl_MaxFragmentAtomicCounters gl_MaxFragmentImageUniforms gl_MaxFragmentInputComponents gl_MaxFragmentUniformComponents gl_MaxFragmentUniformVectors gl_MaxGeometryAtomicCounterBuffers gl_MaxGeometryAtomicCounters gl_MaxGeometryImageUniforms gl_MaxGeometryInputComponents gl_MaxGeometryOutputComponents gl_MaxGeometryOutputVertices gl_MaxGeometryTextureImageUnits gl_MaxGeometryTotalOutputComponents gl_MaxGeometryUniformComponents gl_MaxGeometryVaryingComponents gl_MaxImageSamples gl_MaxImageUnits gl_MaxLights gl_MaxPatchVertices gl_MaxProgramTexelOffset gl_MaxTessControlAtomicCounterBuffers gl_MaxTessControlAtomicCounters gl_MaxTessControlImageUniforms gl_MaxTessControlInputComponents gl_MaxTessControlOutputComponents gl_MaxTessControlTextureImageUnits gl_MaxTessControlTotalOutputComponents gl_MaxTessControlUniformComponents gl_MaxTessEvaluationAtomicCounterBuffers gl_MaxTessEvaluationAtomicCounters gl_MaxTessEvaluationImageUniforms gl_MaxTessEvaluationInputComponents gl_MaxTessEvaluationOutputComponents gl_MaxTessEvaluationTextureImageUnits gl_MaxTessEvaluationUniformComponents gl_MaxTessGenLevel gl_MaxTessPatchComponents gl_MaxTextureCoords gl_MaxTextureImageUnits gl_MaxTextureUnits gl_MaxVaryingComponents gl_MaxVaryingFloats gl_MaxVaryingVectors gl_MaxVertexAtomicCounterBuffers gl_MaxVertexAtomicCounters gl_MaxVertexAttribs gl_MaxVertexImageUniforms gl_MaxVertexOutputComponents gl_MaxVertexTextureImageUnits gl_MaxVertexUniformComponents gl_MaxVertexUniformVectors gl_MaxViewports gl_MinProgramTexelOffsetgl_ModelViewMatrix gl_ModelViewMatrixInverse gl_ModelViewMatrixInverseTranspose gl_ModelViewMatrixTranspose gl_ModelViewProjectionMatrix gl_ModelViewProjectionMatrixInverse gl_ModelViewProjectionMatrixInverseTranspose gl_ModelViewProjectionMatrixTranspose gl_MultiTexCoord0 gl_MultiTexCoord1 gl_MultiTexCoord2 gl_MultiTexCoord3 gl_MultiTexCoord4 gl_MultiTexCoord5 gl_MultiTexCoord6 gl_MultiTexCoord7 gl_Normal gl_NormalMatrix gl_NormalScale gl_ObjectPlaneQ gl_ObjectPlaneR gl_ObjectPlaneS gl_ObjectPlaneT gl_PatchVerticesIn gl_PerVertex gl_Point gl_PointCoord gl_PointSize gl_Position gl_PrimitiveID gl_PrimitiveIDIn gl_ProjectionMatrix gl_ProjectionMatrixInverse gl_ProjectionMatrixInverseTranspose gl_ProjectionMatrixTranspose gl_SampleID gl_SampleMask gl_SampleMaskIn gl_SamplePosition gl_SecondaryColor gl_TessCoord gl_TessLevelInner gl_TessLevelOuter gl_TexCoord gl_TextureEnvColor gl_TextureMatrixInverseTranspose gl_TextureMatrixTranspose gl_Vertex gl_VertexID gl_ViewportIndex gl_in gl_out EmitStreamVertex EmitVertex EndPrimitive EndStreamPrimitive abs acos acosh all any asin asinh atan atanh atomicCounter atomicCounterDecrement atomicCounterIncrement barrier bitCount bitfieldExtract bitfieldInsert bitfieldReverse ceil clamp cos cosh cross dFdx dFdy degrees determinant distance dot equal exp exp2 faceforward findLSB findMSB floatBitsToInt floatBitsToUint floor fma fract frexp ftransform fwidth greaterThan greaterThanEqual imageAtomicAdd imageAtomicAnd imageAtomicCompSwap imageAtomicExchange imageAtomicMax imageAtomicMin imageAtomicOr imageAtomicXor imageLoad imageStore imulExtended intBitsToFloat interpolateAtCentroid interpolateAtOffset interpolateAtSample inverse inversesqrt isinf isnan ldexp length lessThan lessThanEqual log log2 matrixCompMult max memoryBarrier min mix mod modf noise1 noise2 noise3 noise4 normalize not notEqual outerProduct packDouble2x32 packHalf2x16 packSnorm2x16 packSnorm4x8 packUnorm2x16 packUnorm4x8 pow radians reflect refract round roundEven shadow1D shadow1DLod shadow1DProj shadow1DProjLod shadow2D shadow2DLod shadow2DProj shadow2DProjLod sign sin sinh smoothstep sqrt step tan tanh texelFetch texelFetchOffset texture texture1D texture1DLod texture1DProj texture1DProjLod texture2D texture2DLod texture2DProj texture2DProjLod texture3D texture3DLod texture3DProj texture3DProjLod textureCube textureCubeLod textureGather textureGatherOffset textureGatherOffsets textureGrad textureGradOffset textureLod textureLodOffset textureOffset textureProj textureProjGrad textureProjGradOffset textureProjLod textureProjLodOffset textureProjOffset textureQueryLod textureSize transpose trunc uaddCarry uintBitsToFloat umulExtended unpackDouble2x32 unpackHalf2x16 unpackSnorm2x16 unpackSnorm4x8 unpackUnorm2x16 unpackUnorm4x8 usubBorrow gl_TextureMatrix gl_TextureMatrixInverse",literal:"true false"},i:'"',c:[a.CLCM,a.CBLCLM,a.CNM,{cN:"preprocessor",b:"#",e:"$"}]}}(hljs);hljs.LANGUAGES.lua=function(b){var a="\\[=*\\[";var e="\\]=*\\]";var c={b:a,e:e,c:["self"]};var d=[{cN:"comment",b:"--(?!"+a+")",e:"$"},{cN:"comment",b:"--"+a,e:e,c:[c],r:10}];return{l:b.UIR,k:{keyword:"and break do else elseif end false for if in local nil not or repeat return then true until while",built_in:"_G _VERSION assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall coroutine debug io math os package string table"},c:d.concat([{cN:"function",bWK:true,e:"\\)",k:"function",c:[{cN:"title",b:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"},{cN:"params",b:"\\(",eW:true,c:d}].concat(d)},b.CNM,b.ASM,b.QSM,{cN:"string",b:a,e:e,c:[c],r:10}])}}(hljs);hljs.LANGUAGES.xml=function(a){var c="[A-Za-z0-9\\._:-]+";var b={eW:true,c:[{cN:"attribute",b:c,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,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:"|$)",e:">",k:{title:"style"},c:[b],starts:{e:"",rE:true,sL:"css"}},{cN:"tag",b:"|$)",e:">",k:{title:"script"},c:[b],starts:{e:"<\/script>",rE:true,sL:"javascript"}},{b:"<%",e:"%>",sL:"vbscript"},{cN:"tag",b:"",c:[{cN:"title",b:"[^ />]+"},b]}]}}(hljs);hljs.LANGUAGES.markdown=function(a){return{c:[{cN:"header",b:"^#{1,3}",e:"$"},{cN:"header",b:"^.+?\\n[=-]{2,}$"},{b:"<",e:">",sL:"xml",r:0},{cN:"bullet",b:"^([*+-]|(\\d+\\.))\\s+"},{cN:"strong",b:"[*_]{2}.+?[*_]{2}"},{cN:"emphasis",b:"\\*.+?\\*"},{cN:"emphasis",b:"_.+?_",r:0},{cN:"blockquote",b:"^>\\s+",e:"$"},{cN:"code",b:"`.+?`"},{cN:"code",b:"^ ",e:"$",r:0},{cN:"horizontal_rule",b:"^-{3,}",e:"$"},{b:"\\[.+?\\]\\(.+?\\)",rB:true,c:[{cN:"link_label",b:"\\[.+\\]"},{cN:"link_url",b:"\\(",e:"\\)",eB:true,eE:true}]}]}}(hljs);hljs.LANGUAGES.css=function(a){var b={cN:"function",b:a.IR+"\\(",e:"\\)",c:[a.NM,a.ASM,a.QSM]};return{cI:true,i:"[=/|']",c:[a.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 page"},{cN:"at_rule",b:"@",e:"[{;]",eE:true,k:"import page media charset",c:[b,a.ASM,a.QSM,a.NM]},{cN:"tag",b:a.IR,r:0},{cN:"rules",b:"{",e:"}",i:"[^\\s]",r:0,c:[a.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:[b,a.NM,a.QSM,a.ASM,a.CBLCLM,{cN:"hexcolor",b:"\\#[0-9A-F]+"},{cN:"important",b:"!important"}]}}]}]}]}}(hljs);hljs.LANGUAGES.http=function(a){return{i:"\\S",c:[{cN:"status",b:"^HTTP/[0-9\\.]+",e:"$",c:[{cN:"number",b:"\\b\\d{3}\\b"}]},{cN:"request",b:"^[A-Z]+ (.*?) HTTP/[0-9\\.]+$",rB:true,e:"$",c:[{cN:"string",b:" ",e:" ",eB:true,eE:true}]},{cN:"attribute",b:"^\\w",e:": ",eE:true,i:"\\n|\\s|=",starts:{cN:"string",e:"$"}},{b:"\\n\\n",starts:{sL:"",eW:true}}]}}(hljs);hljs.LANGUAGES.java=function(a){return{k:"false synchronized int abstract float private char boolean static null if const for true while long throw strictfp finally protected import native final return void enum else break transient new catch instanceof byte super volatile case assert short package default double public try this switch continue throws",c:[{cN:"javadoc",b:"/\\*\\*",e:"\\*/",c:[{cN:"javadoctag",b:"@[A-Za-z]+"}],r:10},a.CLCM,a.CBLCLM,a.ASM,a.QSM,{cN:"class",bWK:true,e:"{",k:"class interface",i:":",c:[{bWK:true,k:"extends implements",r:10},{cN:"title",b:a.UIR}]},a.CNM,{cN:"annotation",b:"@[A-Za-z]+"}]}}(hljs);hljs.LANGUAGES.php=function(a){var e={cN:"variable",b:"\\$+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*"};var b=[a.inherit(a.ASM,{i:null}),a.inherit(a.QSM,{i:null}),{cN:"string",b:'b"',e:'"',c:[a.BE]},{cN:"string",b:"b'",e:"'",c:[a.BE]}];var c=[a.BNM,a.CNM];var d={cN:"title",b:a.UIR};return{cI:true,k:"and include_once list abstract global private echo interface as static endswitch array null if endwhile or const for endforeach self var while isset public protected exit foreach throw elseif include __FILE__ empty require_once do xor return implements parent clone use __CLASS__ __LINE__ else break print eval new catch __METHOD__ case exception php_user_filter default die require __FUNCTION__ enddeclare final try this switch continue endfor endif declare unset true false namespace trait goto instanceof insteadof __DIR__ __NAMESPACE__ __halt_compiler",c:[a.CLCM,a.HCM,{cN:"comment",b:"/\\*",e:"\\*/",c:[{cN:"phpdoc",b:"\\s@[A-Za-z]+"}]},{cN:"comment",eB:true,b:"__halt_compiler.+?;",eW:true},{cN:"string",b:"<<<['\"]?\\w+['\"]?$",e:"^\\w+;",c:[a.BE]},{cN:"preprocessor",b:"<\\?php",r:10},{cN:"preprocessor",b:"\\?>"},e,{cN:"function",bWK:true,e:"{",k:"function",i:"\\$|\\[|%",c:[d,{cN:"params",b:"\\(",e:"\\)",c:["self",e,a.CBLCLM].concat(b).concat(c)}]},{cN:"class",bWK:true,e:"{",k:"class",i:"[:\\(\\$]",c:[{bWK:true,eW:true,k:"extends",c:[d]},d]},{b:"=>"}].concat(b).concat(c)}}(hljs);hljs.LANGUAGES.python=function(a){var f={cN:"prompt",b:"^(>>>|\\.\\.\\.) "};var c=[{cN:"string",b:"(u|b)?r?'''",e:"'''",c:[f],r:10},{cN:"string",b:'(u|b)?r?"""',e:'"""',c:[f],r:10},{cN:"string",b:"(u|r|ur)'",e:"'",c:[a.BE],r:10},{cN:"string",b:'(u|r|ur)"',e:'"',c:[a.BE],r:10},{cN:"string",b:"(b|br)'",e:"'",c:[a.BE]},{cN:"string",b:'(b|br)"',e:'"',c:[a.BE]}].concat([a.ASM,a.QSM]);var e={cN:"title",b:a.UIR};var d={cN:"params",b:"\\(",e:"\\)",c:["self",a.CNM,f].concat(c)};var b={bWK:true,e:":",i:"[${=;\\n]",c:[e,d],r:10};return{k:{keyword:"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda nonlocal|10",built_in:"None True False Ellipsis NotImplemented"},i:"(|\\?)",c:c.concat([f,a.HCM,a.inherit(b,{cN:"function",k:"def"}),a.inherit(b,{cN:"class",k:"class"}),a.CNM,{cN:"decorator",b:"@",e:"$"},{b:"\\b(print|exec)\\("}])}}(hljs);hljs.LANGUAGES.actionscript=function(a){var d="[a-zA-Z_$][a-zA-Z0-9_$]*";var c="([*]|[a-zA-Z_$][a-zA-Z0-9_$]*)";var e={cN:"rest_arg",b:"[.]{3}",e:d,r:10};var b={cN:"title",b:d};return{k:{keyword:"as break case catch class const continue default delete do dynamic each else extends final finally for function get if implements import in include instanceof interface internal is namespace native new override package private protected public return set static super switch this throw try typeof use var void while with",literal:"true false null undefined"},c:[a.ASM,a.QSM,a.CLCM,a.CBLCLM,a.CNM,{cN:"package",bWK:true,e:"{",k:"package",c:[b]},{cN:"class",bWK:true,e:"{",k:"class interface",c:[{bWK:true,k:"extends implements"},b]},{cN:"preprocessor",bWK:true,e:";",k:"import include"},{cN:"function",bWK:true,e:"[{;]",k:"function",i:"\\S",c:[b,{cN:"params",b:"\\(",e:"\\)",c:[a.ASM,a.QSM,a.CLCM,a.CBLCLM,e]},{cN:"type",b:":",e:c,r:10}]}]}}(hljs);hljs.LANGUAGES.sql=function(a){return{cI:true,c:[{cN:"operator",b:"(begin|start|commit|rollback|savepoint|lock|alter|create|drop|rename|call|delete|do|handler|insert|load|replace|select|truncate|update|set|show|pragma|grant)\\b(?!:)",e:";",eW:true,k:{keyword:"all partial global month current_timestamp using go revoke smallint indicator end-exec disconnect zone with character assertion to add current_user usage input local alter match collate real then rollback get read timestamp session_user not integer bit unique day minute desc insert execute like ilike|2 level decimal drop continue isolation found where constraints domain right national some module transaction relative second connect escape close system_user for deferred section cast current sqlstate allocate intersect deallocate numeric public preserve full goto initially asc no key output collation group by union session both last language constraint column of space foreign deferrable prior connection unknown action commit view or first into float year primary cascaded except restrict set references names table outer open select size are rows from prepare distinct leading create only next inner authorization schema corresponding option declare precision immediate else timezone_minute external varying translation true case exception join hour default double scroll value cursor descriptor values dec fetch procedure delete and false int is describe char as at in varchar null trailing any absolute current_time end grant privileges when cross check write current_date pad begin temporary exec time update catalog user sql date on identity timezone_hour natural whenever interval work order cascade diagnostics nchar having left call do handler load replace truncate start lock show pragma exists number",aggregate:"count sum min max avg"},c:[{cN:"string",b:"'",e:"'",c:[a.BE,{b:"''"}],r:0},{cN:"string",b:'"',e:'"',c:[a.BE,{b:'""'}],r:0},{cN:"string",b:"`",e:"`",c:[a.BE]},a.CNM]},a.CBLCLM,{cN:"comment",b:"--",e:"$"}]}}(hljs);hljs.LANGUAGES.ini=function(a){return{cI:true,i:"[^\\s]",c:[{cN:"comment",b:";",e:"$"},{cN:"title",b:"^\\[",e:"\\]"},{cN:"setting",b:"^[a-z0-9\\[\\]_-]+[ \\t]*=[ \\t]*",e:"$",c:[{cN:"value",eW:true,k:"on off true false yes no",c:[a.QSM,a.NM]}]}]}}(hljs);hljs.LANGUAGES.perl=function(e){var a="getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qqfileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmgetsub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedirioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when";var d={cN:"subst",b:"[$@]\\{",e:"\\}",k:a,r:10};var b={cN:"variable",b:"\\$\\d"};var i={cN:"variable",b:"[\\$\\%\\@\\*](\\^\\w\\b|#\\w+(\\:\\:\\w+)*|[^\\s\\w{]|{\\w+}|\\w+(\\:\\:\\w*)*)"};var f=[e.BE,d,b,i];var h={b:"->",c:[{b:e.IR},{b:"{",e:"}"}]};var g={cN:"comment",b:"^(__END__|__DATA__)",e:"\\n$",r:5};var c=[b,i,e.HCM,g,{cN:"comment",b:"^\\=\\w",e:"\\=cut",eW:true},h,{cN:"string",b:"q[qwxr]?\\s*\\(",e:"\\)",c:f,r:5},{cN:"string",b:"q[qwxr]?\\s*\\[",e:"\\]",c:f,r:5},{cN:"string",b:"q[qwxr]?\\s*\\{",e:"\\}",c:f,r:5},{cN:"string",b:"q[qwxr]?\\s*\\|",e:"\\|",c:f,r:5},{cN:"string",b:"q[qwxr]?\\s*\\<",e:"\\>",c:f,r:5},{cN:"string",b:"qw\\s+q",e:"q",c:f,r:5},{cN:"string",b:"'",e:"'",c:[e.BE],r:0},{cN:"string",b:'"',e:'"',c:f,r:0},{cN:"string",b:"`",e:"`",c:[e.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},{b:"("+e.RSR+"|\\b(split|return|print|reverse|grep)\\b)\\s*",k:"split return print reverse grep",r:0,c:[e.HCM,g,{cN:"regexp",b:"(s|tr|y)/(\\\\.|[^/])*/(\\\\.|[^/])*/[a-z]*",r:10},{cN:"regexp",b:"(m|qr)?/",e:"/[a-z]*",c:[e.BE],r:0}]},{cN:"sub",bWK:true,e:"(\\s*\\(.*?\\))?[;{]",k:"sub",r:5},{cN:"operator",b:"-\\w\\b",r:0}];d.c=c;h.c[1].c=c;return{k:a,c:c}}(hljs);hljs.LANGUAGES.scala=function(a){var c={cN:"annotation",b:"@[A-Za-z]+"};var b={cN:"string",b:'u?r?"""',e:'"""',r:10};return{k:"type yield lazy override def with val var false true sealed abstract private trait object null if for while throw finally protected extends import final return else break new catch super class case package default try this match continue throws",c:[{cN:"javadoc",b:"/\\*\\*",e:"\\*/",c:[{cN:"javadoctag",b:"@[A-Za-z]+"}],r:10},a.CLCM,a.CBLCLM,a.ASM,a.QSM,b,{cN:"class",b:"((case )?class |object |trait )",e:"({|$)",i:":",k:"case class trait object",c:[{bWK:true,k:"extends with",r:10},{cN:"title",b:a.UIR},{cN:"params",b:"\\(",e:"\\)",c:[a.ASM,a.QSM,b,c]}]},a.CNM,c]}}(hljs);hljs.LANGUAGES.objectivec=function(a){var b={keyword:"int float while private char catch export sizeof typedef const struct for union unsigned long volatile static protected bool mutable if public do return goto void enum else break extern class asm case short default double throw register explicit signed typename try this switch continue wchar_t inline readonly assign property protocol self synchronized end synthesize id optional required implementation nonatomic interface super unichar finally dynamic IBOutlet IBAction selector strong weak readonly",literal:"false true FALSE TRUE nil YES NO NULL",built_in:"NSString NSDictionary CGRect CGPoint UIButton UILabel UITextView UIWebView MKMapView UISegmentedControl NSObject UITableViewDelegate UITableViewDataSource NSThread UIActivityIndicator UITabbar UIToolBar UIBarButtonItem UIImageView NSAutoreleasePool UITableView BOOL NSInteger CGFloat NSException NSLog NSMutableString NSMutableArray NSMutableDictionary NSURL NSIndexPath CGSize UITableViewCell UIView UIViewController UINavigationBar UINavigationController UITabBarController UIPopoverController UIPopoverControllerDelegate UIImage NSNumber UISearchBar NSFetchedResultsController NSFetchedResultsChangeType UIScrollView UIScrollViewDelegate UIEdgeInsets UIColor UIFont UIApplication NSNotFound NSNotificationCenter NSNotification UILocalNotification NSBundle NSFileManager NSTimeInterval NSDate NSCalendar NSUserDefaults UIWindow NSRange NSArray NSError NSURLRequest NSURLConnection class UIInterfaceOrientation MPMoviePlayerController dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once"};return{k:b,i:""}]},{cN:"preprocessor",b:"#",e:"$"},{cN:"class",bWK:true,e:"({|$)",k:"interface class protocol implementation",c:[{cN:"id",b:a.UIR}]},{cN:"variable",b:"\\."+a.UIR}]}}(hljs);hljs.LANGUAGES.coffeescript=function(c){var b={keyword:"in if for while finally new do return else break catch instanceof throw try this switch continue typeof delete debugger super then unless until loop of by when and or is isnt not",literal:"true false null undefined yes no on off ",reserved:"case default function var void with const let enum export import native __hasProp __extends __slice __bind __indexOf"};var a="[A-Za-z$_][0-9A-Za-z$_]*";var e={cN:"title",b:a};var d={cN:"subst",b:"#\\{",e:"}",k:b,c:[c.BNM,c.CNM]};return{k:b,c:[c.BNM,c.CNM,c.ASM,{cN:"string",b:'"""',e:'"""',c:[c.BE,d]},{cN:"string",b:'"',e:'"',c:[c.BE,d],r:0},{cN:"comment",b:"###",e:"###"},c.HCM,{cN:"regexp",b:"///",e:"///",c:[c.HCM]},{cN:"regexp",b:"//[gim]*"},{cN:"regexp",b:"/\\S(\\\\.|[^\\n])*/[gim]*"},{b:"`",e:"`",eB:true,eE:true,sL:"javascript"},{cN:"function",b:a+"\\s*=\\s*(\\(.+\\))?\\s*[-=]>",rB:true,c:[e,{cN:"params",b:"\\(",e:"\\)"}]},{cN:"class",bWK:true,k:"class",e:"$",i:":",c:[{bWK:true,k:"extends",eW:true,i:":",c:[e]},e]},{cN:"property",b:"@"+a}]}}(hljs);hljs.LANGUAGES.json=function(a){var e={literal:"true false null"};var d=[a.QSM,a.CNM];var c={cN:"value",e:",",eW:true,eE:true,c:d,k:e};var b={b:"{",e:"}",c:[{cN:"attribute",b:'\\s*"',e:'"\\s*:\\s*',eB:true,eE:true,c:[a.BE],i:"\\n",starts:c}],i:"\\S"};var f={b:"\\[",e:"\\]",c:[a.inherit(c,{cN:null})],i:"\\S"};d.splice(d.length,0,b,f);return{c:d,k:e,i:"\\S"}}(hljs);hljs.LANGUAGES.cpp=function(a){var b={keyword:"false int float while private char catch export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const struct for static_cast|10 union namespace unsigned long throw volatile static protected bool template mutable if public friend do return goto auto void enum else break new extern using true class asm case typeid short reinterpret_cast|10 default double register explicit signed typename try this switch continue wchar_t inline delete alignof char16_t char32_t constexpr decltype noexcept nullptr static_assert thread_local restrict _Bool complex",built_in:"std string cin cout cerr clog stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap array shared_ptr"};return{k:b,i:"",k:b,r:10,c:["self"]}]}}(hljs);hljs.LANGUAGES.clojure=function(l){var e={built_in:"def cond apply if-not if-let if not not= = < < > <= <= >= == + / * - rem quot neg? pos? delay? symbol? keyword? true? false? integer? empty? coll? list? set? ifn? fn? associative? sequential? sorted? counted? reversible? number? decimal? class? distinct? isa? float? rational? reduced? ratio? odd? even? char? seq? vector? string? map? nil? contains? zero? instance? not-every? not-any? libspec? -> ->> .. . inc compare do dotimes mapcat take remove take-while drop letfn drop-last take-last drop-while while intern condp case reduced cycle split-at split-with repeat replicate iterate range merge zipmap declare line-seq sort comparator sort-by dorun doall nthnext nthrest partition eval doseq await await-for let agent atom send send-off release-pending-sends add-watch mapv filterv remove-watch agent-error restart-agent set-error-handler error-handler set-error-mode! error-mode shutdown-agents quote var fn loop recur throw try monitor-enter monitor-exit defmacro defn defn- macroexpand macroexpand-1 for doseq dosync dotimes and or when when-not when-let comp juxt partial sequence memoize constantly complement identity assert peek pop doto proxy defstruct first rest cons defprotocol cast coll deftype defrecord last butlast sigs reify second ffirst fnext nfirst nnext defmulti defmethod meta with-meta ns in-ns create-ns import intern refer keys select-keys vals key val rseq name namespace promise into transient persistent! conj! assoc! dissoc! pop! disj! import use class type num float double short byte boolean bigint biginteger bigdec print-method print-dup throw-if throw printf format load compile get-in update-in pr pr-on newline flush read slurp read-line subvec with-open memfn time ns assert re-find re-groups rand-int rand mod locking assert-valid-fdecl alias namespace resolve ref deref refset swap! reset! set-validator! compare-and-set! alter-meta! reset-meta! commute get-validator alter ref-set ref-history-count ref-min-history ref-max-history ensure sync io! new next conj set! memfn to-array future future-call into-array aset gen-class reduce merge map filter find empty hash-map hash-set sorted-map sorted-map-by sorted-set sorted-set-by vec vector seq flatten reverse assoc dissoc list disj get union difference intersection extend extend-type extend-protocol int nth delay count concat chunk chunk-buffer chunk-append chunk-first chunk-rest max min dec unchecked-inc-int unchecked-inc unchecked-dec-inc unchecked-dec unchecked-negate unchecked-add-int unchecked-add unchecked-subtract-int unchecked-subtract chunk-next chunk-cons chunked-seq? prn vary-meta lazy-seq spread list* str find-keyword keyword symbol gensym force rationalize"};var f="[a-zA-Z_0-9\\!\\.\\?\\-\\+\\*\\/\\<\\=\\>\\&\\#\\$';]+";var a="[\\s:\\(\\{]+\\d+(\\.\\d+)?";var d={cN:"number",b:a,r:0};var j={cN:"string",b:'"',e:'"',c:[l.BE],r:0};var o={cN:"comment",b:";",e:"$",r:0};var n={cN:"collection",b:"[\\[\\{]",e:"[\\]\\}]"};var c={cN:"comment",b:"\\^"+f};var b={cN:"comment",b:"\\^\\{",e:"\\}"};var h={cN:"attribute",b:"[:]"+f};var m={cN:"list",b:"\\(",e:"\\)",r:0};var g={eW:true,eE:true,k:{literal:"true false nil"},r:0};var i={k:e,l:f,cN:"title",b:f,starts:g};m.c=[{cN:"comment",b:"comment"},i];g.c=[m,j,c,b,o,h,n,d];n.c=[m,j,c,o,h,n,d];return{i:"\\S",c:[o,m]}}(hljs);hljs.LANGUAGES.go=function(a){var b={keyword:"break default func interface select case map struct chan else goto package switch const fallthrough if range type continue for import return var go defer",constant:"true false iota nil",typename:"bool byte complex64 complex128 float32 float64 int8 int16 int32 int64 string uint8 uint16 uint32 uint64 int uint uintptr rune",built_in:"append cap close complex copy imag len make new panic print println real recover delete"};return{k:b,i:" + + + + + + reveal.js - Markdown Demo + + + + + + + +
+ +
+ + +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ +
+
+ + + + + + + + diff --git a/plugin/markdown/example.md b/plugin/markdown/example.md new file mode 100644 index 0000000..e988dd9 --- /dev/null +++ b/plugin/markdown/example.md @@ -0,0 +1,29 @@ +# Markdown Demo + + + +## External 1.1 + +Content 1.1 + + +## External 1.2 + +Content 1.2 + + + +## External 2 + +Content 2.1 + + + +## External 3.1 + +Content 3.1 + + +## External 3.2 + +Content 3.2 diff --git a/plugin/markdown/markdown.js b/plugin/markdown/markdown.js new file mode 100755 index 0000000..473666b --- /dev/null +++ b/plugin/markdown/markdown.js @@ -0,0 +1,190 @@ +// From https://gist.github.com/1343518 +// Modified by Hakim to handle Markdown indented with tabs +(function(){ + + if( typeof marked === 'undefined' ) { + throw 'The reveal.js Markdown plugin requires marked to be loaded'; + } + + var stripLeadingWhitespace = function(section) { + + var template = section.querySelector( 'script' ); + + // strip leading whitespace so it isn't evaluated as code + var text = ( template || section ).textContent; + + var leadingWs = text.match(/^\n?(\s*)/)[1].length, + leadingTabs = text.match(/^\n?(\t*)/)[1].length; + + if( leadingTabs > 0 ) { + text = text.replace( new RegExp('\\n?\\t{' + leadingTabs + '}','g'), '\n' ); + } + else if( leadingWs > 1 ) { + text = text.replace( new RegExp('\\n? {' + leadingWs + '}','g'), '\n' ); + } + + return text; + + }; + + var twrap = function(el) { + return ''; + }; + + var getForwardedAttributes = function(section) { + var attributes = section.attributes; + var result = []; + + for( var i = 0, len = attributes.length; i < len; i++ ) { + var name = attributes[i].name, + value = attributes[i].value; + + // disregard attributes that are used for markdown loading/parsing + if( /data\-(markdown|separator|vertical)/gi.test( name ) ) continue; + + if( value ) { + result.push( name + '=' + value ); + } + else { + result.push( name ); + } + } + + return result.join( ' ' ); + } + + var slidifyMarkdown = function(markdown, separator, vertical, attributes) { + + separator = separator || '^\n---\n$'; + + var reSeparator = new RegExp(separator + (vertical ? '|' + vertical : ''), 'mg'), + reHorSeparator = new RegExp(separator), + matches, + lastIndex = 0, + isHorizontal, + wasHorizontal = true, + content, + sectionStack = [], + markdownSections = ''; + + // iterate until all blocks between separators are stacked up + while( matches = reSeparator.exec(markdown) ) { + + // determine direction (horizontal by default) + isHorizontal = reHorSeparator.test(matches[0]); + + if( !isHorizontal && wasHorizontal ) { + // create vertical stack + sectionStack.push([]); + } + + // pluck slide content from markdown input + content = markdown.substring(lastIndex, matches.index); + + if( isHorizontal && wasHorizontal ) { + // add to horizontal stack + sectionStack.push(content); + } else { + // add to vertical stack + sectionStack[sectionStack.length-1].push(content); + } + + lastIndex = reSeparator.lastIndex; + wasHorizontal = isHorizontal; + + } + + // add the remaining slide + (wasHorizontal ? sectionStack : sectionStack[sectionStack.length-1]).push(markdown.substring(lastIndex)); + + // flatten the hierarchical stack, and insert
tags + for( var k = 0, klen = sectionStack.length; k < klen; k++ ) { + // horizontal + if( typeof sectionStack[k] === 'string' ) { + markdownSections += '
' + twrap( sectionStack[k] ) + '
'; + } + // vertical + else { + markdownSections += '
' + + '
' + sectionStack[k].map(twrap).join('
') + '
' + + '
'; + } + } + + return markdownSections; + }; + + var querySlidingMarkdown = function() { + + var sections = document.querySelectorAll( '[data-markdown]'), + section; + + for( var j = 0, jlen = sections.length; j < jlen; j++ ) { + + section = sections[j]; + + if( section.getAttribute('data-markdown').length ) { + + var xhr = new XMLHttpRequest(), + url = section.getAttribute('data-markdown'); + + xhr.onreadystatechange = function () { + if( xhr.readyState === 4 ) { + if (xhr.status >= 200 && xhr.status < 300) { + section.outerHTML = slidifyMarkdown( xhr.responseText, section.getAttribute('data-separator'), section.getAttribute('data-vertical'), getForwardedAttributes(section) ); + } else { + section.outerHTML = '
ERROR: The attempt to fetch ' + url + ' failed with the HTTP status ' + xhr.status + + '. Check your browser\'s JavaScript console for more details.' + + '

Remember that you need to serve the presentation HTML from a HTTP server and the Markdown file must be there too.

'; + } + } + }; + + xhr.open('GET', url, false); + try { + xhr.send(); + } catch (e) { + alert('Failed to get the Markdown file ' + url + '. Make sure that the presentation and the file are served by a HTTP server and the file can be found there. ' + e); + } + + } else if( section.getAttribute('data-separator') ) { + + var markdown = stripLeadingWhitespace(section); + section.outerHTML = slidifyMarkdown( markdown, section.getAttribute('data-separator'), section.getAttribute('data-vertical'), getForwardedAttributes(section) ); + + } + } + + }; + + var queryMarkdownSlides = function() { + + var sections = document.querySelectorAll( '[data-markdown]'); + + for( var j = 0, jlen = sections.length; j < jlen; j++ ) { + + makeHtml(sections[j]); + + } + + }; + + var makeHtml = function(section) { + + var notes = section.querySelector( 'aside.notes' ); + + var markdown = stripLeadingWhitespace(section); + + section.innerHTML = marked(markdown); + + if( notes ) { + section.appendChild( notes ); + } + + }; + + querySlidingMarkdown(); + + queryMarkdownSlides(); + +})(); diff --git a/plugin/markdown/marked.js b/plugin/markdown/marked.js new file mode 100644 index 0000000..ca558fb --- /dev/null +++ b/plugin/markdown/marked.js @@ -0,0 +1,37 @@ +/** + * marked - a markdown parser + * Copyright (c) 2011-2013, Christopher Jeffrey. (MIT Licensed) + * https://github.com/chjj/marked + */ + +(function(){var block={newline:/^\n+/,code:/^( {4}[^\n]+\n*)+/,fences:noop,hr:/^( *[-*_]){3,} *(?:\n+|$)/,heading:/^ *(#{1,6}) *([^\n]+?) *#* *(?:\n+|$)/,nptable:noop,lheading:/^([^\n]+)\n *(=|-){3,} *\n*/,blockquote:/^( *>[^\n]+(\n[^\n]+)*\n*)+/,list:/^( *)(bull) [\s\S]+?(?:hr|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,html:/^ *(?:comment|closed|closing) *(?:\n{2,}|\s*$)/,def:/^ *\[([^\]]+)\]: *]+)>?(?: +["(]([^\n]+)[")])? *(?:\n+|$)/,table:noop,paragraph:/^((?:[^\n]+\n?(?!hr|heading|lheading|blockquote|tag|def))+)\n*/, +text:/^[^\n]+/};block.bullet=/(?:[*+-]|\d+\.)/;block.item=/^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/;block.item=replace(block.item,"gm")(/bull/g,block.bullet)();block.list=replace(block.list)(/bull/g,block.bullet)("hr",/\n+(?=(?: *[-*_]){3,} *(?:\n+|$))/)();block._tag="(?!(?:"+"a|em|strong|small|s|cite|q|dfn|abbr|data|time|code"+"|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo"+"|span|br|wbr|ins|del|img)\\b)\\w+(?!:/|@)\\b";block.html=replace(block.html)("comment",/\x3c!--[\s\S]*?--\x3e/)("closed", +/<(tag)[\s\S]+?<\/\1>/)("closing",/])*?>/)(/tag/g,block._tag)();block.paragraph=replace(block.paragraph)("hr",block.hr)("heading",block.heading)("lheading",block.lheading)("blockquote",block.blockquote)("tag","<"+block._tag)("def",block.def)();block.normal=merge({},block);block.gfm=merge({},block.normal,{fences:/^ *(`{3,}|~{3,}) *(\S+)? *\n([\s\S]+?)\s*\1 *(?:\n+|$)/,paragraph:/^/});block.gfm.paragraph=replace(block.paragraph)("(?!","(?!"+block.gfm.fences.source.replace("\\1", +"\\2")+"|")();block.tables=merge({},block.gfm,{nptable:/^ *(\S.*\|.*)\n *([-:]+ *\|[-| :]*)\n((?:.*\|.*(?:\n|$))*)\n*/,table:/^ *\|(.+)\n *\|( *[-:]+[-| :]*)\n((?: *\|.*(?:\n|$))*)\n*/});function Lexer(options){this.tokens=[];this.tokens.links={};this.options=options||marked.defaults;this.rules=block.normal;if(this.options.gfm)if(this.options.tables)this.rules=block.tables;else this.rules=block.gfm}Lexer.rules=block;Lexer.lex=function(src,options){var lexer=new Lexer(options);return lexer.lex(src)}; +Lexer.prototype.lex=function(src){src=src.replace(/\r\n|\r/g,"\n").replace(/\t/g," ").replace(/\u00a0/g," ").replace(/\u2424/g,"\n");return this.token(src,true)};Lexer.prototype.token=function(src,top){var src=src.replace(/^ +$/gm,""),next,loose,cap,bull,b,item,space,i,l;while(src){if(cap=this.rules.newline.exec(src)){src=src.substring(cap[0].length);if(cap[0].length>1)this.tokens.push({type:"space"})}if(cap=this.rules.code.exec(src)){src=src.substring(cap[0].length);cap=cap[0].replace(/^ {4}/gm, +"");this.tokens.push({type:"code",text:!this.options.pedantic?cap.replace(/\n+$/,""):cap});continue}if(cap=this.rules.fences.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"code",lang:cap[2],text:cap[3]});continue}if(cap=this.rules.heading.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"heading",depth:cap[1].length,text:cap[2]});continue}if(top&&(cap=this.rules.nptable.exec(src))){src=src.substring(cap[0].length);item={type:"table",header:cap[1].replace(/^ *| *\| *$/g, +"").split(/ *\| */),align:cap[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:cap[3].replace(/\n$/,"").split("\n")};for(i=0;i ?/gm,"");this.token(cap,top);this.tokens.push({type:"blockquote_end"});continue}if(cap=this.rules.list.exec(src)){src=src.substring(cap[0].length); +bull=cap[2];this.tokens.push({type:"list_start",ordered:bull.length>1});cap=cap[0].match(this.rules.item);next=false;l=cap.length;i=0;for(;i1&&b.length>1)){src=cap.slice(i+ +1).join("\n")+src;i=l-1}}loose=next||/\n\n(?!\s*$)/.test(item);if(i!==l-1){next=item[item.length-1]==="\n";if(!loose)loose=next}this.tokens.push({type:loose?"loose_item_start":"list_item_start"});this.token(item,false);this.tokens.push({type:"list_item_end"})}this.tokens.push({type:"list_end"});continue}if(cap=this.rules.html.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:this.options.sanitize?"paragraph":"html",pre:cap[1]==="pre"||cap[1]==="script",text:cap[0]});continue}if(top&& +(cap=this.rules.def.exec(src))){src=src.substring(cap[0].length);this.tokens.links[cap[1].toLowerCase()]={href:cap[2],title:cap[3]};continue}if(top&&(cap=this.rules.table.exec(src))){src=src.substring(cap[0].length);item={type:"table",header:cap[1].replace(/^ *| *\| *$/g,"").split(/ *\| */),align:cap[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:cap[3].replace(/(?: *\| *)?\n$/,"").split("\n")};for(i=0;i])/,autolink:/^<([^ >]+(@|:\/)[^ >]+)>/,url:noop,tag:/^\x3c!--[\s\S]*?--\x3e|^<\/?\w+(?:"[^"]*"|'[^']*'|[^'">])*?>/,link:/^!?\[(inside)\]\(href\)/,reflink:/^!?\[(inside)\]\s*\[([^\]]*)\]/,nolink:/^!?\[((?:\[[^\]]*\]|[^\[\]])*)\]/,strong:/^__([\s\S]+?)__(?!_)|^\*\*([\s\S]+?)\*\*(?!\*)/,em:/^\b_((?:__|[\s\S])+?)_\b|^\*((?:\*\*|[\s\S])+?)\*(?!\*)/, +code:/^(`+)\s*([\s\S]*?[^`])\s*\1(?!`)/,br:/^ {2,}\n(?!\s*$)/,del:noop,text:/^[\s\S]+?(?=[\\?(?:\s+['"]([\s\S]*?)['"])?\s*/;inline.link=replace(inline.link)("inside",inline._inside)("href",inline._href)();inline.reflink=replace(inline.reflink)("inside",inline._inside)();inline.normal=merge({},inline);inline.pedantic=merge({},inline.normal,{strong:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/, +em:/^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/});inline.gfm=merge({},inline.normal,{escape:replace(inline.escape)("])","~|])")(),url:/^(https?:\/\/[^\s<]+[^<.,:;"')\]\s])/,del:/^~~(?=\S)([\s\S]*?\S)~~/,text:replace(inline.text)("]|","~]|")("|","|https?://|")()});inline.breaks=merge({},inline.gfm,{br:replace(inline.br)("{2,}","*")(),text:replace(inline.gfm.text)("{2,}","*")()});function InlineLexer(links,options){this.options=options||marked.defaults;this.links=links;this.rules=inline.normal; +if(!this.links)throw new Error("Tokens array requires a `links` property.");if(this.options.gfm)if(this.options.breaks)this.rules=inline.breaks;else this.rules=inline.gfm;else if(this.options.pedantic)this.rules=inline.pedantic}InlineLexer.rules=inline;InlineLexer.output=function(src,links,options){var inline=new InlineLexer(links,options);return inline.output(src)};InlineLexer.prototype.output=function(src){var out="",link,text,href,cap;while(src){if(cap=this.rules.escape.exec(src)){src=src.substring(cap[0].length); +out+=cap[1];continue}if(cap=this.rules.autolink.exec(src)){src=src.substring(cap[0].length);if(cap[2]==="@"){text=cap[1][6]===":"?this.mangle(cap[1].substring(7)):this.mangle(cap[1]);href=this.mangle("mailto:")+text}else{text=escape(cap[1]);href=text}out+=''+text+"";continue}if(cap=this.rules.url.exec(src)){src=src.substring(cap[0].length);text=escape(cap[1]);href=text;out+=''+text+"";continue}if(cap=this.rules.tag.exec(src)){src=src.substring(cap[0].length); +out+=this.options.sanitize?escape(cap[0]):cap[0];continue}if(cap=this.rules.link.exec(src)){src=src.substring(cap[0].length);out+=this.outputLink(cap,{href:cap[2],title:cap[3]});continue}if((cap=this.rules.reflink.exec(src))||(cap=this.rules.nolink.exec(src))){src=src.substring(cap[0].length);link=(cap[2]||cap[1]).replace(/\s+/g," ");link=this.links[link.toLowerCase()];if(!link||!link.href){out+=cap[0][0];src=cap[0].substring(1)+src;continue}out+=this.outputLink(cap,link);continue}if(cap=this.rules.strong.exec(src)){src= +src.substring(cap[0].length);out+=""+this.output(cap[2]||cap[1])+"";continue}if(cap=this.rules.em.exec(src)){src=src.substring(cap[0].length);out+=""+this.output(cap[2]||cap[1])+"";continue}if(cap=this.rules.code.exec(src)){src=src.substring(cap[0].length);out+=""+escape(cap[2],true)+"";continue}if(cap=this.rules.br.exec(src)){src=src.substring(cap[0].length);out+="
";continue}if(cap=this.rules.del.exec(src)){src=src.substring(cap[0].length);out+=""+ +this.output(cap[1])+"";continue}if(cap=this.rules.text.exec(src)){src=src.substring(cap[0].length);out+=escape(cap[0]);continue}if(src)throw new Error("Infinite loop on byte: "+src.charCodeAt(0));}return out};InlineLexer.prototype.outputLink=function(cap,link){if(cap[0][0]!=="!")return'"+this.output(cap[1])+"";else return''+escape(cap[1])+'"};InlineLexer.prototype.smartypants=function(text){if(!this.options.smartypants)return text;return text.replace(/--/g,"\u2014").replace(/'([^']*)'/g,"\u2018$1\u2019").replace(/"([^"]*)"/g,"\u201c$1\u201d").replace(/\.{3}/g,"\u2026")};InlineLexer.prototype.mangle=function(text){var out="",l=text.length,i=0,ch;for(;i0.5)ch="x"+ch.toString(16);out+="&#"+ch+";"}return out};function Parser(options){this.tokens=[];this.token=null; +this.options=options||marked.defaults}Parser.parse=function(src,options){var parser=new Parser(options);return parser.parse(src)};Parser.prototype.parse=function(src){this.inline=new InlineLexer(src.links,this.options);this.tokens=src.reverse();var out="";while(this.next())out+=this.tok();return out};Parser.prototype.next=function(){return this.token=this.tokens.pop()};Parser.prototype.peek=function(){return this.tokens[this.tokens.length-1]||0};Parser.prototype.parseText=function(){var body=this.token.text; +while(this.peek().type==="text")body+="\n"+this.next().text;return this.inline.output(body)};Parser.prototype.tok=function(){switch(this.token.type){case "space":return"";case "hr":return"
\n";case "heading":return""+this.inline.output(this.token.text)+"\n";case "code":if(this.options.highlight){var code=this.options.highlight(this.token.text,this.token.lang);if(code!=null&&code!==this.token.text){this.token.escaped=true;this.token.text=code}}if(!this.token.escaped)this.token.text= +escape(this.token.text,true);return"
"+this.token.text+"
\n";case "table":var body="",heading,i,row,cell,j;body+="\n\n";for(i=0;i'+heading+"\n":""+heading+"\n"}body+="\n\n";body+="\n";for(i=0;i'+cell+"\n":""+cell+"\n"}body+="\n"}body+="\n";return"\n"+body+"
\n";case "blockquote_start":var body="";while(this.next().type!=="blockquote_end")body+=this.tok();return"
\n"+body+"
\n";case "list_start":var type=this.token.ordered?"ol":"ul",body="";while(this.next().type!=="list_end")body+= +this.tok();return"<"+type+">\n"+body+"\n";case "list_item_start":var body="";while(this.next().type!=="list_item_end")body+=this.token.type==="text"?this.parseText():this.tok();return"
  • "+body+"
  • \n";case "loose_item_start":var body="";while(this.next().type!=="list_item_end")body+=this.tok();return"
  • "+body+"
  • \n";case "html":return!this.token.pre&&!this.options.pedantic?this.inline.output(this.token.text):this.token.text;case "paragraph":return"

    "+this.inline.output(this.token.text)+ +"

    \n";case "text":return"

    "+this.parseText()+"

    \n"}};function escape(html,encode){return html.replace(!encode?/&(?!#?\w+;)/g:/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function replace(regex,opt){regex=regex.source;opt=opt||"";return function self(name,val){if(!name)return new RegExp(regex,opt);val=val.source||val;val=val.replace(/(^|[^\[])\^/g,"$1");regex=regex.replace(name,val);return self}}function noop(){}noop.exec=noop;function merge(obj){var i= +1,target,key;for(;iAn error occured:

    "+escape(e.message+"",true)+"
    ";throw e;}}marked.options=marked.setOptions=function(opt){merge(marked.defaults,opt);return marked};marked.defaults={gfm:true,tables:true,breaks:false,pedantic:false,sanitize:false,smartLists:false,silent:false,highlight:null,langPrefix:""};marked.Parser=Parser;marked.parser=Parser.parse;marked.Lexer=Lexer;marked.lexer=Lexer.lex;marked.InlineLexer=InlineLexer;marked.inlineLexer=InlineLexer.output; +marked.parse=marked;if(typeof exports==="object")module.exports=marked;else if(typeof define==="function"&&define.amd)define(function(){return marked});else this.marked=marked}).call(function(){return this||(typeof window!=="undefined"?window:global)}()); diff --git a/plugin/multiplex/client.js b/plugin/multiplex/client.js new file mode 100644 index 0000000..e6179f6 --- /dev/null +++ b/plugin/multiplex/client.js @@ -0,0 +1,13 @@ +(function() { + var multiplex = Reveal.getConfig().multiplex; + var socketId = multiplex.id; + var socket = io.connect(multiplex.url); + + socket.on(multiplex.id, function(data) { + // ignore data from sockets that aren't ours + if (data.socketId !== socketId) { return; } + if( window.location.host === 'localhost:1947' ) return; + + Reveal.slide(data.indexh, data.indexv, data.indexf, 'remote'); + }); +}()); diff --git a/plugin/multiplex/index.js b/plugin/multiplex/index.js new file mode 100644 index 0000000..6f5d8b1 --- /dev/null +++ b/plugin/multiplex/index.js @@ -0,0 +1,56 @@ +var express = require('express'); +var fs = require('fs'); +var io = require('socket.io'); +var crypto = require('crypto'); + +var app = express.createServer(); +var staticDir = express.static; + +io = io.listen(app); + +var opts = { + port: 1948, + baseDir : __dirname + '/../../' +}; + +io.sockets.on('connection', function(socket) { + socket.on('slidechanged', function(slideData) { + if (typeof slideData.secret == 'undefined' || slideData.secret == null || slideData.secret === '') return; + if (createHash(slideData.secret) === slideData.socketId) { + slideData.secret = null; + socket.broadcast.emit(slideData.socketId, slideData); + }; + }); +}); + +app.configure(function() { + [ 'css', 'js', 'plugin', 'lib' ].forEach(function(dir) { + app.use('/' + dir, staticDir(opts.baseDir + dir)); + }); +}); + +app.get("/", function(req, res) { + res.writeHead(200, {'Content-Type': 'text/html'}); + fs.createReadStream(opts.baseDir + '/index.html').pipe(res); +}); + +app.get("/token", function(req,res) { + var ts = new Date().getTime(); + var rand = Math.floor(Math.random()*9999999); + var secret = ts.toString() + rand.toString(); + res.send({secret: secret, socketId: createHash(secret)}); +}); + +var createHash = function(secret) { + var cipher = crypto.createCipher('blowfish', secret); + return(cipher.final('hex')); +}; + +// Actually listen +app.listen(opts.port || null); + +var brown = '\033[33m', + green = '\033[32m', + reset = '\033[0m'; + +console.log( brown + "reveal.js:" + reset + " Multiplex running on port " + green + opts.port + reset ); \ No newline at end of file diff --git a/plugin/multiplex/master.js b/plugin/multiplex/master.js new file mode 100644 index 0000000..deb39cd --- /dev/null +++ b/plugin/multiplex/master.js @@ -0,0 +1,50 @@ +(function() { + // don't emit events from inside the previews themselves + if ( window.location.search.match( /receiver/gi ) ) { return; } + var multiplex = Reveal.getConfig().multiplex; + + var socket = io.connect(multiplex.url); + + var notify = function( slideElement, indexh, indexv, origin ) { + if( typeof origin === 'undefined' && origin !== 'remote' ) { + var nextindexh; + var nextindexv; + + var fragmentindex = Reveal.getIndices().f; + if (typeof fragmentindex == 'undefined') { + fragmentindex = 0; + } + + if (slideElement.nextElementSibling && slideElement.parentNode.nodeName == 'SECTION') { + nextindexh = indexh; + nextindexv = indexv + 1; + } else { + nextindexh = indexh + 1; + nextindexv = 0; + } + + var slideData = { + indexh : indexh, + indexv : indexv, + indexf : fragmentindex, + nextindexh : nextindexh, + nextindexv : nextindexv, + secret: multiplex.secret, + socketId : multiplex.id + }; + + socket.emit('slidechanged', slideData); + } + } + + Reveal.addEventListener( 'slidechanged', function( event ) { + notify( event.currentSlide, event.indexh, event.indexv, event.origin ); + } ); + + var fragmentNotify = function( event ) { + notify( Reveal.getCurrentSlide(), Reveal.getIndices().h, Reveal.getIndices().v, event.origin ); + }; + + Reveal.addEventListener( 'fragmentshown', fragmentNotify ); + Reveal.addEventListener( 'fragmenthidden', fragmentNotify ); +}()); \ No newline at end of file diff --git a/plugin/notes-server/client.js b/plugin/notes-server/client.js new file mode 100644 index 0000000..156cb9a --- /dev/null +++ b/plugin/notes-server/client.js @@ -0,0 +1,57 @@ +(function() { + // don't emit events from inside the previews themselves + if ( window.location.search.match( /receiver/gi ) ) { return; } + + var socket = io.connect(window.location.origin); + var socketId = Math.random().toString().slice(2); + + console.log('View slide notes at ' + window.location.origin + '/notes/' + socketId); + window.open(window.location.origin + '/notes/' + socketId, 'notes-' + socketId); + + // Fires when a fragment is shown + Reveal.addEventListener( 'fragmentshown', function( event ) { + var fragmentData = { + fragment : 'next', + socketId : socketId + }; + socket.emit('fragmentchanged', fragmentData); + } ); + + // Fires when a fragment is hidden + Reveal.addEventListener( 'fragmenthidden', function( event ) { + var fragmentData = { + fragment : 'previous', + socketId : socketId + }; + socket.emit('fragmentchanged', fragmentData); + } ); + + // Fires when slide is changed + Reveal.addEventListener( 'slidechanged', function( event ) { + var nextindexh; + var nextindexv; + var slideElement = event.currentSlide; + + if (slideElement.nextElementSibling && slideElement.parentNode.nodeName == 'SECTION') { + nextindexh = event.indexh; + nextindexv = event.indexv + 1; + } else { + nextindexh = event.indexh + 1; + nextindexv = 0; + } + + var notes = slideElement.querySelector('aside.notes'); + var slideData = { + notes : notes ? notes.innerHTML : '', + indexh : event.indexh, + indexv : event.indexv, + nextindexh : nextindexh, + nextindexv : nextindexv, + socketId : socketId, + markdown : notes ? typeof notes.getAttribute('data-markdown') === 'string' : false + + }; + + socket.emit('slidechanged', slideData); + } ); +}()); diff --git a/plugin/notes-server/index.js b/plugin/notes-server/index.js new file mode 100644 index 0000000..5535c90 --- /dev/null +++ b/plugin/notes-server/index.js @@ -0,0 +1,59 @@ +var express = require('express'); +var fs = require('fs'); +var io = require('socket.io'); +var _ = require('underscore'); +var Mustache = require('mustache'); + +var app = express.createServer(); +var staticDir = express.static; + +io = io.listen(app); + +var opts = { + port : 1947, + baseDir : __dirname + '/../../' +}; + +io.sockets.on('connection', function(socket) { + socket.on('slidechanged', function(slideData) { + socket.broadcast.emit('slidedata', slideData); + }); + socket.on('fragmentchanged', function(fragmentData) { + socket.broadcast.emit('fragmentdata', fragmentData); + }); +}); + +app.configure(function() { + [ 'css', 'js', 'images', 'plugin', 'lib' ].forEach(function(dir) { + app.use('/' + dir, staticDir(opts.baseDir + dir)); + }); +}); + +app.get("/", function(req, res) { + res.writeHead(200, {'Content-Type': 'text/html'}); + fs.createReadStream(opts.baseDir + '/index.html').pipe(res); +}); + +app.get("/notes/:socketId", function(req, res) { + + fs.readFile(opts.baseDir + 'plugin/notes-server/notes.html', function(err, data) { + res.send(Mustache.to_html(data.toString(), { + socketId : req.params.socketId + })); + }); + // fs.createReadStream(opts.baseDir + 'notes-server/notes.html').pipe(res); +}); + +// Actually listen +app.listen(opts.port || null); + +var brown = '\033[33m', + green = '\033[32m', + reset = '\033[0m'; + +var slidesLocation = "http://localhost" + ( opts.port ? ( ':' + opts.port ) : '' ); + +console.log( brown + "reveal.js - Speaker Notes" + reset ); +console.log( "1. Open the slides at " + green + slidesLocation + reset ); +console.log( "2. Click on the link your JS console to go to the notes page" ); +console.log( "3. Advance through your slides and your notes will advance automatically" ); diff --git a/plugin/notes-server/notes.html b/plugin/notes-server/notes.html new file mode 100644 index 0000000..25d1a62 --- /dev/null +++ b/plugin/notes-server/notes.html @@ -0,0 +1,142 @@ + + + + + + + + reveal.js - Slide Notes + + + + + + +
    + +
    + +
    + + UPCOMING: +
    +
    + + + + + + + + diff --git a/plugin/notes/notes.html b/plugin/notes/notes.html new file mode 100644 index 0000000..8af43fb --- /dev/null +++ b/plugin/notes/notes.html @@ -0,0 +1,253 @@ + + + + + + reveal.js - Slide Notes + + + + + + +
    + +
    + +
    + + UPCOMING: +
    + +
    +
    +

    Time

    + 0:00:00 AM +
    +
    +

    Elapsed

    + 00:00:00 +
    +
    + +
    + + + + + diff --git a/plugin/notes/notes.js b/plugin/notes/notes.js new file mode 100644 index 0000000..63de05a --- /dev/null +++ b/plugin/notes/notes.js @@ -0,0 +1,100 @@ +/** + * Handles opening of and synchronization with the reveal.js + * notes window. + */ +var RevealNotes = (function() { + + function openNotes() { + var jsFileLocation = document.querySelector('script[src$="notes.js"]').src; // this js file path + jsFileLocation = jsFileLocation.replace(/notes\.js(\?.*)?$/, ''); // the js folder path + var notesPopup = window.open( jsFileLocation + 'notes.html', 'reveal.js - Notes', 'width=1120,height=850' ); + + // Fires when slide is changed + Reveal.addEventListener( 'slidechanged', function( event ) { + post('slidechanged'); + } ); + + // Fires when a fragment is shown + Reveal.addEventListener( 'fragmentshown', function( event ) { + post('fragmentshown'); + } ); + + // Fires when a fragment is hidden + Reveal.addEventListener( 'fragmenthidden', function( event ) { + post('fragmenthidden'); + } ); + + /** + * Posts the current slide data to the notes window + * + * @param {String} eventType Expecting 'slidechanged', 'fragmentshown' + * or 'fragmenthidden' set in the events above to define the needed + * slideDate. + */ + function post( eventType ) { + var slideElement = Reveal.getCurrentSlide(), + messageData; + + if( eventType === 'slidechanged' ) { + var notes = slideElement.querySelector( 'aside.notes' ), + indexh = Reveal.getIndices().h, + indexv = Reveal.getIndices().v, + nextindexh, + nextindexv; + + if( slideElement.nextElementSibling && slideElement.parentNode.nodeName == 'SECTION' ) { + nextindexh = indexh; + nextindexv = indexv + 1; + } else { + nextindexh = indexh + 1; + nextindexv = 0; + } + + messageData = { + notes : notes ? notes.innerHTML : '', + indexh : indexh, + indexv : indexv, + nextindexh : nextindexh, + nextindexv : nextindexv, + markdown : notes ? typeof notes.getAttribute( 'data-markdown' ) === 'string' : false + }; + } + else if( eventType === 'fragmentshown' ) { + messageData = { + fragment : 'next' + }; + } + else if( eventType === 'fragmenthidden' ) { + messageData = { + fragment : 'prev' + }; + } + + notesPopup.postMessage( JSON.stringify( messageData ), '*' ); + } + + // Navigate to the current slide when the notes are loaded + notesPopup.addEventListener( 'load', function( event ) { + post('slidechanged'); + }, false ); + } + + // If the there's a 'notes' query set, open directly + if( window.location.search.match( /(\?|\&)notes/gi ) !== null ) { + openNotes(); + } + + // Open the notes when the 's' key is hit + document.addEventListener( 'keydown', function( event ) { + // Disregard the event if the target is editable or a + // modifier is present + if ( document.querySelector( ':focus' ) !== null || event.shiftKey || event.altKey || event.ctrlKey || event.metaKey ) return; + + if( event.keyCode === 83 ) { + event.preventDefault(); + openNotes(); + } + }, false ); + + return { open: openNotes }; +})(); diff --git a/plugin/postmessage/example.html b/plugin/postmessage/example.html new file mode 100644 index 0000000..cc57a7b --- /dev/null +++ b/plugin/postmessage/example.html @@ -0,0 +1,39 @@ + + + + + +
    + + + +
    + + + + + diff --git a/plugin/postmessage/postmessage.js b/plugin/postmessage/postmessage.js new file mode 100644 index 0000000..d0f4140 --- /dev/null +++ b/plugin/postmessage/postmessage.js @@ -0,0 +1,42 @@ +/* + + simple postmessage plugin + + Useful when a reveal slideshow is inside an iframe. + It allows to call reveal methods from outside. + + Example: + var reveal = window.frames[0]; + + // Reveal.prev(); + reveal.postMessage(JSON.stringify({method: 'prev', args: []}), '*'); + // Reveal.next(); + reveal.postMessage(JSON.stringify({method: 'next', args: []}), '*'); + // Reveal.slide(2, 2); + reveal.postMessage(JSON.stringify({method: 'slide', args: [2,2]}), '*'); + + Add to the slideshow: + + dependencies: [ + ... + { src: 'plugin/postmessage/postmessage.js', async: true, condition: function() { return !!document.body.classList; } } + ] + +*/ + +(function (){ + + window.addEventListener( "message", function ( event ) { + var data = JSON.parse( event.data ), + method = data.method, + args = data.args; + + if( typeof Reveal[method] === 'function' ) { + Reveal[method].apply( Reveal, data.args ); + } + }, false); + +}()); + + + diff --git a/plugin/print-pdf/print-pdf.js b/plugin/print-pdf/print-pdf.js new file mode 100644 index 0000000..6b6cad6 --- /dev/null +++ b/plugin/print-pdf/print-pdf.js @@ -0,0 +1,44 @@ +/** + * phantomjs script for printing presentations to PDF. + * + * Example: + * phantomjs print-pdf.js "http://lab.hakim.se/reveal-js?print-pdf" reveal-demo.pdf + * + * By Manuel Bieh (https://github.com/manuelbieh) + */ + +// html2pdf.js +var page = new WebPage(); +var system = require( 'system' ); + +page.viewportSize = { + width: 1024, + height: 768 +}; + +page.paperSize = { + format: 'letter', + orientation: 'landscape', + margin: { + left: '0', + right: '0', + top: '0', + bottom: '0' + } +}; + +var revealFile = system.args[1] || 'index.html?print-pdf'; +var slideFile = system.args[2] || 'slides.pdf'; + +if( slideFile.match( /\.pdf$/gi ) === null ) { + slideFile += '.pdf'; +} + +console.log( 'Printing PDF...' ); + +page.open( revealFile, function( status ) { + console.log( 'Printed succesfully' ); + page.render( slideFile ); + phantom.exit(); +} ); + diff --git a/plugin/remotes/remotes.js b/plugin/remotes/remotes.js new file mode 100644 index 0000000..694e9c0 --- /dev/null +++ b/plugin/remotes/remotes.js @@ -0,0 +1,39 @@ +/** + * Touch-based remote controller for your presentation courtesy + * of the folks at http://remotes.io + */ + +(function(window){ + + /** + * Detects if we are dealing with a touch enabled device (with some false positives) + * Borrowed from modernizr: https://github.com/Modernizr/Modernizr/blob/master/feature-detects/touch.js + */ + var hasTouch = (function(){ + return ('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch; + })(); + + /** + * Detects if notes are enable and the current page is opened inside an /iframe + * this prevents loading Remotes.io several times + */ + var remotesAndIsNotes = (function(){ + return !(window.RevealNotes && self == top); + })(); + + if(!hasTouch && !remotesAndIsNotes){ + head.ready( 'remotes.ne.min.js', function() { + new Remotes("preview") + .on("swipe-left", function(e){ Reveal.right(); }) + .on("swipe-right", function(e){ Reveal.left(); }) + .on("swipe-up", function(e){ Reveal.down(); }) + .on("swipe-down", function(e){ Reveal.up(); }) + .on("tap", function(e){ Reveal.next(); }) + .on("zoom-out", function(e){ Reveal.toggleOverview(true); }) + .on("zoom-in", function(e){ Reveal.toggleOverview(false); }) + ; + } ); + + head.js('https://raw.github.com/Remotes/Remotes/master/dist/remotes.ne.min.js'); + } +})(window); \ No newline at end of file diff --git a/plugin/search/search.js b/plugin/search/search.js new file mode 100644 index 0000000..ae6582e --- /dev/null +++ b/plugin/search/search.js @@ -0,0 +1,196 @@ +/* + * Handles finding a text string anywhere in the slides and showing the next occurrence to the user + * by navigatating to that slide and highlighting it. + * + * By Jon Snyder , February 2013 + */ + +var RevealSearch = (function() { + + var matchedSlides; + var currentMatchedIndex; + var searchboxDirty; + var myHilitor; + +// Original JavaScript code by Chirp Internet: www.chirp.com.au +// Please acknowledge use of this code by including this header. +// 2/2013 jon: modified regex to display any match, not restricted to word boundaries. + +function Hilitor(id, tag) +{ + + var targetNode = document.getElementById(id) || document.body; + var hiliteTag = tag || "EM"; + var skipTags = new RegExp("^(?:" + hiliteTag + "|SCRIPT|FORM|SPAN)$"); + var colors = ["#ff6", "#a0ffff", "#9f9", "#f99", "#f6f"]; + var wordColor = []; + var colorIdx = 0; + var matchRegex = ""; + var matchingSlides = []; + + this.setRegex = function(input) + { + input = input.replace(/^[^\w]+|[^\w]+$/g, "").replace(/[^\w'-]+/g, "|"); + matchRegex = new RegExp("(" + input + ")","i"); + } + + this.getRegex = function() + { + return matchRegex.toString().replace(/^\/\\b\(|\)\\b\/i$/g, "").replace(/\|/g, " "); + } + + // recursively apply word highlighting + this.hiliteWords = function(node) + { + if(node == undefined || !node) return; + if(!matchRegex) return; + if(skipTags.test(node.nodeName)) return; + + if(node.hasChildNodes()) { + for(var i=0; i < node.childNodes.length; i++) + this.hiliteWords(node.childNodes[i]); + } + if(node.nodeType == 3) { // NODE_TEXT + if((nv = node.nodeValue) && (regs = matchRegex.exec(nv))) { + //find the slide's section element and save it in our list of matching slides + var secnode = node.parentNode; + while (secnode.nodeName != 'SECTION') { + secnode = secnode.parentNode; + } + + var slideIndex = Reveal.getIndices(secnode); + var slidelen = matchingSlides.length; + var alreadyAdded = false; + for (var i=0; i < slidelen; i++) { + if ( (matchingSlides[i].h === slideIndex.h) && (matchingSlides[i].v === slideIndex.v) ) { + alreadyAdded = true; + } + } + if (! alreadyAdded) { + matchingSlides.push(slideIndex); + } + + if(!wordColor[regs[0].toLowerCase()]) { + wordColor[regs[0].toLowerCase()] = colors[colorIdx++ % colors.length]; + } + + var match = document.createElement(hiliteTag); + match.appendChild(document.createTextNode(regs[0])); + match.style.backgroundColor = wordColor[regs[0].toLowerCase()]; + match.style.fontStyle = "inherit"; + match.style.color = "#000"; + + var after = node.splitText(regs.index); + after.nodeValue = after.nodeValue.substring(regs[0].length); + node.parentNode.insertBefore(match, after); + } + } + }; + + // remove highlighting + this.remove = function() + { + var arr = document.getElementsByTagName(hiliteTag); + while(arr.length && (el = arr[0])) { + el.parentNode.replaceChild(el.firstChild, el); + } + }; + + // start highlighting at target node + this.apply = function(input) + { + if(input == undefined || !input) return; + this.remove(); + this.setRegex(input); + this.hiliteWords(targetNode); + return matchingSlides; + }; + +} + + function openSearch() { + //ensure the search term input dialog is visible and has focus: + var inputbox = document.getElementById("searchinput"); + inputbox.style.display = "inline"; + inputbox.focus(); + inputbox.select(); + } + + function toggleSearch() { + var inputbox = document.getElementById("searchinput"); + if (inputbox.style.display !== "inline") { + openSearch(); + } + else { + inputbox.style.display = "none"; + myHilitor.remove(); + } + } + + function doSearch() { + //if there's been a change in the search term, perform a new search: + if (searchboxDirty) { + var searchstring = document.getElementById("searchinput").value; + + //find the keyword amongst the slides + myHilitor = new Hilitor("slidecontent"); + matchedSlides = myHilitor.apply(searchstring); + currentMatchedIndex = 0; + } + + //navigate to the next slide that has the keyword, wrapping to the first if necessary + if (matchedSlides.length && (matchedSlides.length <= currentMatchedIndex)) { + currentMatchedIndex = 0; + } + if (matchedSlides.length > currentMatchedIndex) { + Reveal.slide(matchedSlides[currentMatchedIndex].h, matchedSlides[currentMatchedIndex].v); + currentMatchedIndex++; + } + } + + var dom = {}; + dom.wrapper = document.querySelector( '.reveal' ); + + if( !dom.wrapper.querySelector( '.searchbox' ) ) { + var searchElement = document.createElement( 'div' ); + searchElement.id = "searchinputdiv"; + searchElement.classList.add( 'searchdiv' ); + searchElement.style.position = 'absolute'; + searchElement.style.top = '10px'; + searchElement.style.left = '10px'; + //embedded base64 search icon Designed by Sketchdock - http://www.sketchdock.com/: + searchElement.innerHTML = ''; + dom.wrapper.appendChild( searchElement ); + } + + document.getElementById("searchbutton").addEventListener( 'click', function(event) { + doSearch(); + }, false ); + + document.getElementById("searchinput").addEventListener( 'keyup', function( event ) { + switch (event.keyCode) { + case 13: + event.preventDefault(); + doSearch(); + searchboxDirty = false; + break; + default: + searchboxDirty = true; + } + }, false ); + + // Open the search when the 's' key is hit (yes, this conflicts with the notes plugin, disabling for now) + /* + document.addEventListener( 'keydown', function( event ) { + // Disregard the event if the target is editable or a + // modifier is present + if ( document.querySelector( ':focus' ) !== null || event.shiftKey || event.altKey || event.ctrlKey || event.metaKey ) return; + + if( event.keyCode === 83 ) { + event.preventDefault(); + openSearch(); + } + }, false ); +*/ + return { open: openSearch }; +})(); diff --git a/plugin/zoom-js/zoom.js b/plugin/zoom-js/zoom.js new file mode 100644 index 0000000..b67ae16 --- /dev/null +++ b/plugin/zoom-js/zoom.js @@ -0,0 +1,256 @@ +// Custom reveal.js integration +(function(){ + var isEnabled = true; + + document.querySelector( '.reveal' ).addEventListener( 'mousedown', function( event ) { + if( event.altKey && isEnabled ) { + event.preventDefault(); + zoom.to({ element: event.target, pan: false }); + } + } ); + + Reveal.addEventListener( 'overviewshown', function() { isEnabled = false; } ); + Reveal.addEventListener( 'overviewhidden', function() { isEnabled = true; } ); +})(); + +/*! + * zoom.js 0.2 (modified version for use with reveal.js) + * http://lab.hakim.se/zoom-js + * MIT licensed + * + * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se + */ +var zoom = (function(){ + + // The current zoom level (scale) + var level = 1; + + // The current mouse position, used for panning + var mouseX = 0, + mouseY = 0; + + // Timeout before pan is activated + var panEngageTimeout = -1, + panUpdateInterval = -1; + + var currentOptions = null; + + // Check for transform support so that we can fallback otherwise + var supportsTransforms = 'WebkitTransform' in document.body.style || + 'MozTransform' in document.body.style || + 'msTransform' in document.body.style || + 'OTransform' in document.body.style || + 'transform' in document.body.style; + + if( supportsTransforms ) { + // The easing that will be applied when we zoom in/out + document.body.style.transition = 'transform 0.8s ease'; + document.body.style.OTransition = '-o-transform 0.8s ease'; + document.body.style.msTransition = '-ms-transform 0.8s ease'; + document.body.style.MozTransition = '-moz-transform 0.8s ease'; + document.body.style.WebkitTransition = '-webkit-transform 0.8s ease'; + } + + // Zoom out if the user hits escape + document.addEventListener( 'keyup', function( event ) { + if( level !== 1 && event.keyCode === 27 ) { + zoom.out(); + } + }, false ); + + // Monitor mouse movement for panning + document.addEventListener( 'mousemove', function( event ) { + if( level !== 1 ) { + mouseX = event.clientX; + mouseY = event.clientY; + } + }, false ); + + /** + * Applies the CSS required to zoom in, prioritizes use of CSS3 + * transforms but falls back on zoom for IE. + * + * @param {Number} pageOffsetX + * @param {Number} pageOffsetY + * @param {Number} elementOffsetX + * @param {Number} elementOffsetY + * @param {Number} scale + */ + function magnify( pageOffsetX, pageOffsetY, elementOffsetX, elementOffsetY, scale ) { + + if( supportsTransforms ) { + var origin = pageOffsetX +'px '+ pageOffsetY +'px', + transform = 'translate('+ -elementOffsetX +'px,'+ -elementOffsetY +'px) scale('+ scale +')'; + + document.body.style.transformOrigin = origin; + document.body.style.OTransformOrigin = origin; + document.body.style.msTransformOrigin = origin; + document.body.style.MozTransformOrigin = origin; + document.body.style.WebkitTransformOrigin = origin; + + document.body.style.transform = transform; + document.body.style.OTransform = transform; + document.body.style.msTransform = transform; + document.body.style.MozTransform = transform; + document.body.style.WebkitTransform = transform; + } + else { + // Reset all values + if( scale === 1 ) { + document.body.style.position = ''; + document.body.style.left = ''; + document.body.style.top = ''; + document.body.style.width = ''; + document.body.style.height = ''; + document.body.style.zoom = ''; + } + // Apply scale + else { + document.body.style.position = 'relative'; + document.body.style.left = ( - ( pageOffsetX + elementOffsetX ) / scale ) + 'px'; + document.body.style.top = ( - ( pageOffsetY + elementOffsetY ) / scale ) + 'px'; + document.body.style.width = ( scale * 100 ) + '%'; + document.body.style.height = ( scale * 100 ) + '%'; + document.body.style.zoom = scale; + } + } + + level = scale; + + if( level !== 1 && document.documentElement.classList ) { + document.documentElement.classList.add( 'zoomed' ); + } + else { + document.documentElement.classList.remove( 'zoomed' ); + } + } + + /** + * Pan the document when the mosue cursor approaches the edges + * of the window. + */ + function pan() { + var range = 0.12, + rangeX = window.innerWidth * range, + rangeY = window.innerHeight * range, + scrollOffset = getScrollOffset(); + + // Up + if( mouseY < rangeY ) { + window.scroll( scrollOffset.x, scrollOffset.y - ( 1 - ( mouseY / rangeY ) ) * ( 14 / level ) ); + } + // Down + else if( mouseY > window.innerHeight - rangeY ) { + window.scroll( scrollOffset.x, scrollOffset.y + ( 1 - ( window.innerHeight - mouseY ) / rangeY ) * ( 14 / level ) ); + } + + // Left + if( mouseX < rangeX ) { + window.scroll( scrollOffset.x - ( 1 - ( mouseX / rangeX ) ) * ( 14 / level ), scrollOffset.y ); + } + // Right + else if( mouseX > window.innerWidth - rangeX ) { + window.scroll( scrollOffset.x + ( 1 - ( window.innerWidth - mouseX ) / rangeX ) * ( 14 / level ), scrollOffset.y ); + } + } + + function getScrollOffset() { + return { + x: window.scrollX !== undefined ? window.scrollX : window.pageXOffset, + y: window.scrollY !== undefined ? window.scrollY : window.pageXYffset + } + } + + return { + /** + * Zooms in on either a rectangle or HTML element. + * + * @param {Object} options + * - element: HTML element to zoom in on + * OR + * - x/y: coordinates in non-transformed space to zoom in on + * - width/height: the portion of the screen to zoom in on + * - scale: can be used instead of width/height to explicitly set scale + */ + to: function( options ) { + // Due to an implementation limitation we can't zoom in + // to another element without zooming out first + if( level !== 1 ) { + zoom.out(); + } + else { + options.x = options.x || 0; + options.y = options.y || 0; + + // If an element is set, that takes precedence + if( !!options.element ) { + // Space around the zoomed in element to leave on screen + var padding = 20; + + options.width = options.element.getBoundingClientRect().width + ( padding * 2 ); + options.height = options.element.getBoundingClientRect().height + ( padding * 2 ); + options.x = options.element.getBoundingClientRect().left - padding; + options.y = options.element.getBoundingClientRect().top - padding; + } + + // If width/height values are set, calculate scale from those values + if( options.width !== undefined && options.height !== undefined ) { + options.scale = Math.max( Math.min( window.innerWidth / options.width, window.innerHeight / options.height ), 1 ); + } + + if( options.scale > 1 ) { + options.x *= options.scale; + options.y *= options.scale; + + var scrollOffset = getScrollOffset(); + + if( options.element ) { + scrollOffset.x -= ( window.innerWidth - ( options.width * options.scale ) ) / 2; + } + + magnify( scrollOffset.x, scrollOffset.y, options.x, options.y, options.scale ); + + if( options.pan !== false ) { + + // Wait with engaging panning as it may conflict with the + // zoom transition + panEngageTimeout = setTimeout( function() { + panUpdateInterval = setInterval( pan, 1000 / 60 ); + }, 800 ); + + } + } + + currentOptions = options; + } + }, + + /** + * Resets the document zoom state to its default. + */ + out: function() { + clearTimeout( panEngageTimeout ); + clearInterval( panUpdateInterval ); + + var scrollOffset = getScrollOffset(); + + if( currentOptions && currentOptions.element ) { + scrollOffset.x -= ( window.innerWidth - ( currentOptions.width * currentOptions.scale ) ) / 2; + } + + magnify( scrollOffset.x, scrollOffset.y, 0, 0, 1 ); + + level = 1; + }, + + // Alias + magnify: function( options ) { this.to( options ) }, + reset: function() { this.out() }, + + zoomLevel: function() { + return level; + } + } + +})(); + From e1dd821c56d8f2bf5e690aa6610e21c358f2e1a5 Mon Sep 17 00:00:00 2001 From: Josh Miller Date: Mon, 21 Oct 2013 17:01:13 -0400 Subject: [PATCH 2/2] making it work --- lib/css/zenburn.css | 115 ++++++++++++++ lib/font/league_gothic-webfont.eot | Bin 0 -> 18485 bytes lib/font/league_gothic-webfont.svg | 230 ++++++++++++++++++++++++++++ lib/font/league_gothic-webfont.ttf | Bin 0 -> 42324 bytes lib/font/league_gothic-webfont.woff | Bin 0 -> 21288 bytes lib/font/league_gothic_license | 2 + lib/js/classList.js | 2 + lib/js/head.min.js | 8 + lib/js/html5shiv.js | 7 + 9 files changed, 364 insertions(+) create mode 100644 lib/css/zenburn.css create mode 100755 lib/font/league_gothic-webfont.eot create mode 100644 lib/font/league_gothic-webfont.svg create mode 100644 lib/font/league_gothic-webfont.ttf create mode 100644 lib/font/league_gothic-webfont.woff create mode 100644 lib/font/league_gothic_license create mode 100644 lib/js/classList.js create mode 100644 lib/js/head.min.js create mode 100644 lib/js/html5shiv.js diff --git a/lib/css/zenburn.css b/lib/css/zenburn.css new file mode 100644 index 0000000..f4070ca --- /dev/null +++ b/lib/css/zenburn.css @@ -0,0 +1,115 @@ +/* + +Zenburn style from voldmar.ru (c) Vladimir Epifanov +based on dark.css by Ivan Sagalaev + +*/ + +pre code { + display: block; padding: 0.5em; + background: #3F3F3F; + color: #DCDCDC; +} + +pre .keyword, +pre .tag, +pre .django .tag, +pre .django .keyword, +pre .css .class, +pre .css .id, +pre .lisp .title { + color: #E3CEAB; +} + +pre .django .template_tag, +pre .django .variable, +pre .django .filter .argument { + color: #DCDCDC; +} + +pre .number, +pre .date { + color: #8CD0D3; +} + +pre .dos .envvar, +pre .dos .stream, +pre .variable, +pre .apache .sqbracket { + color: #EFDCBC; +} + +pre .dos .flow, +pre .diff .change, +pre .python .exception, +pre .python .built_in, +pre .literal, +pre .tex .special { + color: #EFEFAF; +} + +pre .diff .chunk, +pre .ruby .subst { + color: #8F8F8F; +} + +pre .dos .keyword, +pre .python .decorator, +pre .class .title, +pre .haskell .label, +pre .function .title, +pre .ini .title, +pre .diff .header, +pre .ruby .class .parent, +pre .apache .tag, +pre .nginx .built_in, +pre .tex .command, +pre .input_number { + color: #efef8f; +} + +pre .dos .winutils, +pre .ruby .symbol, +pre .ruby .symbol .string, +pre .ruby .symbol .keyword, +pre .ruby .symbol .keymethods, +pre .ruby .string, +pre .ruby .instancevar { + color: #DCA3A3; +} + +pre .diff .deletion, +pre .string, +pre .tag .value, +pre .preprocessor, +pre .built_in, +pre .sql .aggregate, +pre .javadoc, +pre .smalltalk .class, +pre .smalltalk .localvars, +pre .smalltalk .array, +pre .css .rules .value, +pre .attr_selector, +pre .pseudo, +pre .apache .cbracket, +pre .tex .formula { + color: #CC9393; +} + +pre .shebang, +pre .diff .addition, +pre .comment, +pre .java .annotation, +pre .template_comment, +pre .pi, +pre .doctype { + color: #7F9F7F; +} + +pre .xml .css, +pre .xml .javascript, +pre .xml .vbscript, +pre .tex .formula { + opacity: 0.5; +} + diff --git a/lib/font/league_gothic-webfont.eot b/lib/font/league_gothic-webfont.eot new file mode 100755 index 0000000000000000000000000000000000000000..598dcbc06100e2c6ac5dcbcb7446bd1a15133550 GIT binary patch literal 18485 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 literal 0 HcmV?d00001 diff --git a/lib/font/league_gothic-webfont.svg b/lib/font/league_gothic-webfont.svg new file mode 100644 index 0000000..201cfe1 --- /dev/null +++ b/lib/font/league_gothic-webfont.svg @@ -0,0 +1,230 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/lib/font/league_gothic-webfont.ttf b/lib/font/league_gothic-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..29f896a79312c4959c4ccb4a24c5dfd043d3d8de GIT binary patch literal 42324 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 TS^&-34QK_lsMldv((L*NAAbr4 literal 0 HcmV?d00001 diff --git a/lib/font/league_gothic-webfont.woff b/lib/font/league_gothic-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..71117fb7f0c324aa8b2a810041c27d3da3ee4ca7 GIT binary patch literal 21288 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 + Copyright Tero Piirainen (tipiirai) + License MIT / http://bit.ly/mit-license + Version 0.96 + + http://headjs.com +*/(function(a){function z(){d||(d=!0,s(e,function(a){p(a)}))}function y(c,d){var e=a.createElement("script");e.type="text/"+(c.type||"javascript"),e.src=c.src||c,e.async=!1,e.onreadystatechange=e.onload=function(){var a=e.readyState;!d.done&&(!a||/loaded|complete/.test(a))&&(d.done=!0,d())},(a.body||b).appendChild(e)}function x(a,b){if(a.state==o)return b&&b();if(a.state==n)return k.ready(a.name,b);if(a.state==m)return a.onpreload.push(function(){x(a,b)});a.state=n,y(a.url,function(){a.state=o,b&&b(),s(g[a.name],function(a){p(a)}),u()&&d&&s(g.ALL,function(a){p(a)})})}function w(a,b){a.state===undefined&&(a.state=m,a.onpreload=[],y({src:a.url,type:"cache"},function(){v(a)}))}function v(a){a.state=l,s(a.onpreload,function(a){a.call()})}function u(a){a=a||h;var b;for(var c in a){if(a.hasOwnProperty(c)&&a[c].state!=o)return!1;b=!0}return b}function t(a){return Object.prototype.toString.call(a)=="[object Function]"}function s(a,b){if(!!a){typeof a=="object"&&(a=[].slice.call(a));for(var c=0;c