From f50505e297f0ea1f9993f0fd72287fc6c3b338b5 Mon Sep 17 00:00:00 2001 From: Helena Edelson Date: Fri, 4 Mar 2016 10:07:31 -0800 Subject: [PATCH] Basic generic setup. --- .gitignore | 2 + LICENSE | 19 + css/print/paper.css | 173 ++++ css/print/pdf.css | 159 +++ css/reveal.css | 1184 +++++++++++++++++++++++ css/shaders/tile-flip.fs | 64 ++ css/shaders/tile-flip.vs | 141 +++ css/theme/README.md | 5 + css/theme/beige.css | 163 ++++ css/theme/default.css | 163 ++++ css/theme/serif.css | 150 +++ css/theme/simple.css | 152 +++ css/theme/sky.css | 156 +++ css/theme/source/beige.scss | 50 + css/theme/source/default.scss | 42 + css/theme/source/serif.scss | 33 + css/theme/source/simple.scss | 38 + css/theme/source/sky.scss | 41 + css/theme/template/mixins.scss | 29 + css/theme/template/settings.scss | 33 + css/theme/template/theme.scss | 163 ++++ index.html | 379 ++++++++ js/reveal.js | 1385 +++++++++++++++++++++++++++ js/reveal.min.js | 83 ++ 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 + package.json | 10 +- plugin/highlight/highlight.js | 14 + plugin/markdown/markdown.js | 32 + plugin/markdown/showdown.js | 62 ++ plugin/notes-server/client.js | 57 ++ plugin/notes-server/index.js | 58 ++ plugin/notes-server/notes.html | 139 +++ plugin/notes/notes.html | 142 +++ plugin/notes/notes.js | 98 ++ plugin/zoom-js/zoom.js | 251 +++++ 43 files changed, 6029 insertions(+), 5 deletions(-) create mode 100644 LICENSE create mode 100644 css/print/paper.css create mode 100644 css/print/pdf.css create mode 100644 css/reveal.css create mode 100644 css/shaders/tile-flip.fs create mode 100644 css/shaders/tile-flip.vs 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/serif.css create mode 100644 css/theme/simple.css create mode 100644 css/theme/sky.css create mode 100644 css/theme/source/beige.scss create mode 100644 css/theme/source/default.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/template/mixins.scss create mode 100644 css/theme/template/settings.scss create mode 100644 css/theme/template/theme.scss create mode 100644 index.html create mode 100644 js/reveal.js create mode 100644 js/reveal.min.js 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 create mode 100644 plugin/highlight/highlight.js create mode 100644 plugin/markdown/markdown.js create mode 100644 plugin/markdown/showdown.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/zoom-js/zoom.js diff --git a/.gitignore b/.gitignore index 7285a78..7c02c85 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ reveal node_modules/ +*.iml +.idea/ diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..23a2d5a --- /dev/null +++ b/LICENSE @@ -0,0 +1,19 @@ +Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/css/print/paper.css b/css/print/paper.css new file mode 100644 index 0000000..61fa0a9 --- /dev/null +++ b/css/print/paper.css @@ -0,0 +1,173 @@ +/* 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.stack { + page-break-after: avoid !important; +} +.reveal section .fragment { + opacity: 1 !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..7c1a496 --- /dev/null +++ b/css/print/pdf.css @@ -0,0 +1,159 @@ +/* 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: auto; + height: auto; + border: 0; + margin: 0 5%; + padding: 0; + float: none !important; + overflow: visible; + background-image: none; +} + +html { + 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 { + 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; +} + + +/* 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 .slides { + position: static; + width: 100%; + 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: 100% !important; + height: auto !important; + min-height: initial !important; + display: block !important; + overflow: visible !important; + + left: 0% !important; + top: 0% !important; + margin-left: 0px !important; + margin-top: 50px !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.stack { + margin: 0px !important; + padding: 0px !important; + page-break-after: avoid !important; +} +.reveal section .fragment { + opacity: 1 !important; +} +.reveal img { + box-shadow: none; +} +.reveal .roll { + overflow: visible; + line-height: 1em; +} + +.reveal small a { + font-size: 16pt !important; +} + +pre { + font-size: 9pt !important; +} diff --git a/css/reveal.css b/css/reveal.css new file mode 100644 index 0000000..412e8ec --- /dev/null +++ b/css/reveal.css @@ -0,0 +1,1184 @@ +@charset "UTF-8"; + +/*! + * reveal.js + * http://lab.hakim.se/reveal-js + * MIT licensed + * + * Copyright (C) 2011-2012 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%; + min-height: 600px; + overflow: hidden; +} + +body { + position: relative; + line-height: 1; +} + +::selection { + background:#FF5E99; + color:#fff; + text-shadow: none; +} + +@media screen and (max-width: 900px) { + .reveal { + font-size: 30px; + } +} + +/********************************************* + * HEADERS + *********************************************/ + +.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.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.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 + *********************************************/ + +.reveal .slides section { + line-height: 1.2em; + font-weight: normal; +} + +.reveal img { + /* preserve aspect ratio and scale image so it's bound within the section */ + max-width: 100%; + max-height: 100%; +} + +.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:before { + content: '\201C'; + } + .reveal blockquote:after { + content: '\201D'; + } + +.reveal q { + font-style: italic; +} + .reveal q:before { + content: '\201C'; + } + .reveal q:after { + content: '\201D'; + } + +.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 pre code { + padding: 5px; +} + +.reveal code { + font-family: monospace; + overflow: auto; + max-height: 400px; +} + +.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.1; + width: 0; + height: 0; + border: 12px solid transparent; + + -webkit-transition: opacity 0.2s ease; + -moz-transition: opacity 0.2s ease; + -ms-transition: opacity 0.2s ease; + -o-transition: opacity 0.2s ease; + transition: opacity 0.2s ease; +} + +.reveal .controls div.enabled { + opacity: 0.6; + cursor: pointer; +} + +.reveal .controls div.enabled:active { + margin-top: 1px; +} + +.reveal .controls div.left { + top: 42px; + + border-right-width: 22px; + border-right-color: #eee; +} + +.reveal .controls div.right { + left: 74px; + top: 42px; + + border-left-width: 22px; + border-left-color: #eee; +} + +.reveal .controls div.up { + left: 42px; + + border-bottom-width: 22px; + border-bottom-color: #eee; +} + +.reveal .controls div.down { + left: 42px; + top: 74px; + + border-top-width: 22px; + border-top-color: #eee; +} + + +/********************************************* + * 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-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 .slides { + position: absolute; + max-width: 900px; + width: 80%; + height: 60%; + left: 50%; + top: 50%; + margin-top: -320px; + padding: 20px 0px; + 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% 25%; + -moz-perspective-origin: 0% 25%; + -ms-perspective-origin: 0% 25%; + perspective-origin: 0% 25%; +} + +.reveal .slides>section, +.reveal .slides>section>section { + display: none; + position: absolute; + width: 100%; + min-height: 600px; + + z-index: 10; + + -webkit-transform-style: preserve-3d; + -moz-transform-style: preserve-3d; + -ms-transform-style: preserve-3d; + transform-style: preserve-3d; + + -webkit-transition: all 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985); + -moz-transition: all 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985); + -ms-transition: all 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985); + -o-transition: all 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985); + transition: all 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985); +} + +.reveal .slides>section.present { + display: block; + z-index: 11; + opacity: 1; +} + +.reveal .slides>section { + margin-left: -50%; +} + + +/********************************************* + * DEFAULT TRANSITION + *********************************************/ + +.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.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.past { + display: block; + opacity: 0; + + -webkit-transform: translate3d(0, -50%, 0) rotateX(70deg) translate3d(0, -50%, 0); + -moz-transform: translate3d(0, -50%, 0) rotateX(70deg) translate3d(0, -50%, 0); + -ms-transform: translate3d(0, -50%, 0) rotateX(70deg) translate3d(0, -50%, 0); + transform: translate3d(0, -50%, 0) rotateX(70deg) translate3d(0, -50%, 0); +} +.reveal .slides>section>section.future { + display: block; + opacity: 0; + + -webkit-transform: translate3d(0, 50%, 0) rotateX(-70deg) translate3d(0, 50%, 0); + -moz-transform: translate3d(0, 50%, 0) rotateX(-70deg) translate3d(0, 50%, 0); + -ms-transform: translate3d(0, 50%, 0) rotateX(-70deg) translate3d(0, 50%, 0); + transform: translate3d(0, 50%, 0) rotateX(-70deg) translate3d(0, 50%, 0); +} + + +/********************************************* + * CONCAVE TRANSITION + *********************************************/ + +.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.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.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.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.zoom .slides>section, +.reveal.zoom .slides>section>section { + -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.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.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.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.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 .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.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.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.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-origin: 0% 25%; + -moz-perspective-origin: 0% 25%; + -ms-perspective-origin: 0% 25%; + perspective-origin: 0% 25%; + + -webkit-perspective: 1300px; + -moz-perspective: 1300px; + -ms-perspective: 1300px; + perspective: 1300px; +} + +.reveal.cube .slides section { + padding: 30px; + + -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.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; + + -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); +} + + +/********************************************* + * TILE-FLIP TRANSITION (CSS shader) + *********************************************/ + +.reveal.tileflip .slides section.present { + -webkit-transform: none; + -webkit-transition-duration: 800ms; + + -webkit-filter: custom( url(shaders/tile-flip.vs) mix(url(shaders/tile-flip.fs) multiply source-atop), 10 10 border-box detached, transform perspective(1000) scale(1) rotateX(0deg) rotateY(0deg) rotateZ(0deg), + amount 0, randomness 0, flipAxis 0 1 0, tileOutline 1 + ); +} + +.reveal.tileflip .slides section.past { + -webkit-transform: none; + -webkit-transition-duration: 800ms; + + -webkit-filter: custom( url(shaders/tile-flip.vs) mix(url(shaders/tile-flip.fs) multiply source-atop), 10 10 border-box detached, transform perspective(1000) scale(1) rotateX(0deg) rotateY(0deg) rotateZ(0deg), + amount 1, randomness 0, flipAxis 0 1 0, tileOutline 1 + ); +} + +.reveal.tileflip .slides section.future { + -webkit-transform: none; + -webkit-transition-duration: 800ms; + + -webkit-filter: custom( url(shaders/tile-flip.vs) mix(url(shaders/tile-flip.fs) multiply source-atop), 10 10 border-box detached, transform perspective(1000) scale(1) rotateX(0deg) rotateY(0deg) rotateZ(0deg), + amount 1, randomness 0, flipAxis 0 1 0, tileOutline 1 + ); +} + +.reveal.tileflip .slides>section>section.present { + -webkit-filter: custom( url(shaders/tile-flip.vs) mix(url(shaders/tile-flip.fs) multiply source-atop), 10 10 border-box detached, transform perspective(1000) scale(1) rotateX(0deg) rotateY(0deg) rotateZ(0deg), + amount 0, randomness 2, flipAxis 1 0 0, tileOutline 1 + ); +} + +.reveal.tileflip .slides>section>section.past { + -webkit-filter: custom( url(shaders/tile-flip.vs) mix(url(shaders/tile-flip.fs) multiply source-atop), 10 10 border-box detached, transform perspective(1000) scale(1) rotateX(0deg) rotateY(0deg) rotateZ(0deg), + amount 1, randomness 2, flipAxis 1 0 0, tileOutline 1 + ); +} + +.reveal.tileflip .slides>section>section.future { + -webkit-filter: custom( url(shaders/tile-flip.vs) mix(url(shaders/tile-flip.fs) multiply source-atop), 10 10 border-box detached, transform perspective(1000) scale(1) rotateX(0deg) rotateY(0deg) rotateZ(0deg), + amount 1, randomness 2, flipAxis 1 0 0, tileOutline 1 + ); +} + + +/********************************************* + * NO TRANSITION + *********************************************/ + +.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: 700px; + -moz-perspective: 700px; + -ms-perspective: 700px; + perspective: 700px; +} + +.reveal.overview .slides section { + padding: 20px 0; + max-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 { + background: none; + padding: 0; + 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 .slides section { + display: block!important; + opacity: 1!important; + position: relative!important; + height: auto; + min-height: auto; + margin-bottom: 100px; + + -webkit-transform: none; + -moz-transform: none; + -ms-transform: none; + transform: none; +} + + +/********************************************* + * BACKGROUND STATES + *********************************************/ + +.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 ); +} + + +/********************************************* + * 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/shaders/tile-flip.fs b/css/shaders/tile-flip.fs new file mode 100644 index 0000000..3481a48 --- /dev/null +++ b/css/shaders/tile-flip.fs @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2012 Adobe Systems Incorporated. All rights reserved. + * Copyright (c) 2012 Branislav Ulicny + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +precision mediump float; + +// Uniform values from CSS + +uniform float amount; +uniform float tileOutline; + +// Built-in uniforms + +uniform vec2 u_meshSize; +uniform vec2 u_textureSize; + +// Varyings passed in from vertex shader + +varying float v_depth; +varying vec2 v_uv; + +// Main + +void main() +{ + // FIXME: Must swap x and y as a workaround for: + // https://bugs.webkit.org/show_bug.cgi?id=96285 + vec2 u_meshSize = u_meshSize.yx; + + vec4 c = vec4(1.0); + + // Fade out. + c.a = 1.0 - v_depth; + + // Show grid outline. + if (tileOutline >= 0.5) { + float cell_width = u_textureSize.x / u_meshSize.y; + float cell_height = u_textureSize.y / u_meshSize.x; + float dd = 1.0; + + if (mod(v_uv.x * u_textureSize.x + dd, cell_width) < 2.0 + || mod(v_uv.y * u_textureSize.y + dd, cell_height) < 2.0) { + if (amount > 0.0) + c.rgb = vec3(1.0 - sqrt(amount)); + } + } + css_ColorMatrix = mat4(c.r, 0.0, 0.0, 0.0, + 0.0, c.g, 0.0, 0.0, + 0.0, 0.0, c.b, 0.0, + 0.0, 0.0, 0.0, c.a); +} diff --git a/css/shaders/tile-flip.vs b/css/shaders/tile-flip.vs new file mode 100644 index 0000000..498e446 --- /dev/null +++ b/css/shaders/tile-flip.vs @@ -0,0 +1,141 @@ +/* + * Copyright (c)2012 Adobe Systems Incorporated. All rights reserved. + * Copyright (c)2012 Branislav Ulicny + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +precision mediump float; + +// Built-in attributes + +attribute vec4 a_position; +attribute vec2 a_texCoord; +attribute vec3 a_triangleCoord; + +// Built-in uniforms + +uniform mat4 u_projectionMatrix; +uniform vec2 u_meshSize; +uniform vec2 u_textureSize; + +// Uniform passed in from CSS + +uniform mat4 transform; +uniform float amount; +uniform float randomness; +uniform vec3 flipAxis; + +// Varyings + +varying float v_depth; +varying vec2 v_uv; + +// Constants + +const float PI2 = 1.5707963267948966; + +// Create perspective matrix + +mat4 perspectiveMatrix(float p) +{ + float perspective = - 1.0 / p; + return mat4( + 1.0, 0.0, 0.0, 0.0, + 0.0, 1.0, 0.0, 0.0, + 0.0, 0.0, 1.0, perspective, + 0.0, 0.0, 0.0, 1.0 + ); +} + +// Rotate vector + +vec3 rotateVectorByQuaternion(vec3 v, vec4 q) +{ + vec3 dest = vec3(0.0); + + float x = v.x, y = v.y, z = v.z; + float qx = q.x, qy = q.y, qz = q.z, qw = q.w; + + // Calculate quaternion * vector. + + float ix = qw * x + qy * z - qz * y, + iy = qw * y + qz * x - qx * z, + iz = qw * z + qx * y - qy * x, + iw = -qx * x - qy * y - qz * z; + + // Calculate result * inverse quaternion. + + dest.x = ix * qw + iw * -qx + iy * -qz - iz * -qy; + dest.y = iy * qw + iw * -qy + iz * -qx - ix * -qz; + dest.z = iz * qw + iw * -qz + ix * -qy - iy * -qx; + + return dest; +} + +// Convert rotation. + +vec4 axisAngleToQuaternion(vec3 axis, float angle) +{ + vec4 dest = vec4(0.0); + + float halfAngle = angle / 2.0; + float s = sin(halfAngle); + + dest.x = axis.x * s; + dest.y = axis.y * s; + dest.z = axis.z * s; + dest.w = cos(halfAngle); + + return dest; +} + +// Random function based on the tile coordinate. +// This will return the same value for all the vertices in the same tile (i.e. two triangles). + +float random(vec2 scale) +{ + // Use the fragment position as a different seed per-pixel. + return fract(sin(dot(vec2(a_triangleCoord.x, a_triangleCoord.y), scale)) * 4000.0); +} + +// Main + +void main() +{ + // FIXME: We must swap x and y as a workaround for: + // https://bugs.webkit.org/show_bug.cgi?id=96285 + vec2 u_meshSize = u_meshSize.yx; + + vec4 pos = a_position; + float aspect = u_textureSize.x / u_textureSize.y; + + float cx = a_triangleCoord.x / u_meshSize.y - 0.5 + 0.5 / u_meshSize.y; + float cy = a_triangleCoord.y / u_meshSize.x - 0.5 + 0.5 / u_meshSize.x; + + vec3 centroid = vec3(cx, cy, 0.0); + float r = random(vec2(10.0, 80.0)); + float rr = mix(0.0, PI2, amount * (1.0 + randomness * r)); + + vec4 rotation = vec4(flipAxis, rr); + vec4 qRotation = axisAngleToQuaternion(normalize(rotation.xyz), rotation.w); + + vec3 newPosition = rotateVectorByQuaternion((pos.xyz - centroid)* vec3(aspect, 1., 1.0), qRotation) * vec3(1.0 / aspect, 1.0, 1.0) + centroid; + pos.xyz = newPosition; + + gl_Position = u_projectionMatrix * transform * pos; + + // Pass varyings to the fragment shader. + v_depth = abs(rr)/ PI2; + v_uv = a_texCoord; +} diff --git a/css/theme/README.md b/css/theme/README.md new file mode 100644 index 0000000..137bdf2 --- /dev/null +++ b/css/theme/README.md @@ -0,0 +1,5 @@ +Themes are written using Sass to keep things modular and reduce the need for repeated selectors across files. Find out how to install Sass here http://sass-lang.com/, once Sass is installed run the follwing command to start monitoring the source files for changes. + +``` +sass --watch css/theme/source/:css/theme --style expanded +``` \ No newline at end of file diff --git a/css/theme/beige.css b/css/theme/beige.css new file mode 100644 index 0000000..5e40883 --- /dev/null +++ b/css/theme/beige.css @@ -0,0 +1,163 @@ +@import url(http://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", Times, "Times New Roman", 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; + 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.left, +.reveal .controls div.left.enabled { + border-right-color: #8b743d; +} + +.reveal .controls div.right, +.reveal .controls div.right.enabled { + border-left-color: #8b743d; +} + +.reveal .controls div.up, +.reveal .controls div.up.enabled { + border-bottom-color: #8b743d; +} + +.reveal .controls div.down, +.reveal .controls div.down.enabled { + border-top-color: #8b743d; +} + +.reveal .controls div.left.enabled:hover { + border-right-color: #c0a86e; +} + +.reveal .controls div.right.enabled:hover { + border-left-color: #c0a86e; +} + +.reveal .controls div.up.enabled:hover { + border-bottom-color: #c0a86e; +} + +.reveal .controls div.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..28ed7d3 --- /dev/null +++ b/css/theme/default.css @@ -0,0 +1,163 @@ +@import url(http://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", Times, "Times New Roman", 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; + 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.left, +.reveal .controls div.left.enabled { + border-right-color: #13daec; +} + +.reveal .controls div.right, +.reveal .controls div.right.enabled { + border-left-color: #13daec; +} + +.reveal .controls div.up, +.reveal .controls div.up.enabled { + border-bottom-color: #13daec; +} + +.reveal .controls div.down, +.reveal .controls div.down.enabled { + border-top-color: #13daec; +} + +.reveal .controls div.left.enabled:hover { + border-right-color: #71e9f4; +} + +.reveal .controls div.right.enabled:hover { + border-left-color: #71e9f4; +} + +.reveal .controls div.up.enabled:hover { + border-bottom-color: #71e9f4; +} + +.reveal .controls div.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/serif.css b/css/theme/serif.css new file mode 100644 index 0000000..ece6124 --- /dev/null +++ b/css/theme/serif.css @@ -0,0 +1,150 @@ +/** + * 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; so is the theme - beige.css - that this is based off of. + */ +/********************************************* + * 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; + 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.left, +.reveal .controls div.left.enabled { + border-right-color: #51483d; +} + +.reveal .controls div.right, +.reveal .controls div.right.enabled { + border-left-color: #51483d; +} + +.reveal .controls div.up, +.reveal .controls div.up.enabled { + border-bottom-color: #51483d; +} + +.reveal .controls div.down, +.reveal .controls div.down.enabled { + border-top-color: #51483d; +} + +.reveal .controls div.left.enabled:hover { + border-right-color: #8b7c69; +} + +.reveal .controls div.right.enabled:hover { + border-left-color: #8b7c69; +} + +.reveal .controls div.up.enabled:hover { + border-bottom-color: #8b7c69; +} + +.reveal .controls div.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..6d0771a --- /dev/null +++ b/css/theme/simple.css @@ -0,0 +1,152 @@ +@import url(http://fonts.googleapis.com/css?family=News+Cycle:400,700); +@import url(http://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", Times, "Times New Roman", 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; + 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.left, +.reveal .controls div.left.enabled { + border-right-color: darkblue; +} + +.reveal .controls div.right, +.reveal .controls div.right.enabled { + border-left-color: darkblue; +} + +.reveal .controls div.up, +.reveal .controls div.up.enabled { + border-bottom-color: darkblue; +} + +.reveal .controls div.down, +.reveal .controls div.down.enabled { + border-top-color: darkblue; +} + +.reveal .controls div.left.enabled:hover { + border-right-color: #0000f1; +} + +.reveal .controls div.right.enabled:hover { + border-left-color: #0000f1; +} + +.reveal .controls div.up.enabled:hover { + border-bottom-color: #0000f1; +} + +.reveal .controls div.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..18a4863 --- /dev/null +++ b/css/theme/sky.css @@ -0,0 +1,156 @@ +@import url(http://fonts.googleapis.com/css?family=Quicksand:400,700,400italic,700italic); +@import url(http://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 + */ +/********************************************* + * 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; + 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.left, +.reveal .controls div.left.enabled { + border-right-color: #3b759e; +} + +.reveal .controls div.right, +.reveal .controls div.right.enabled { + border-left-color: #3b759e; +} + +.reveal .controls div.up, +.reveal .controls div.up.enabled { + border-bottom-color: #3b759e; +} + +.reveal .controls div.down, +.reveal .controls div.down.enabled { + border-top-color: #3b759e; +} + +.reveal .controls div.left.enabled:hover { + border-right-color: #74a7cb; +} + +.reveal .controls div.right.enabled:hover { + border-left-color: #74a7cb; +} + +.reveal .controls div.up.enabled:hover { + border-bottom-color: #74a7cb; +} + +.reveal .controls div.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/source/beige.scss b/css/theme/source/beige.scss new file mode 100644 index 0000000..177216f --- /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(http://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..da9b268 --- /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(http://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/serif.scss b/css/theme/source/serif.scss new file mode 100644 index 0000000..dc0935f --- /dev/null +++ b/css/theme/source/serif.scss @@ -0,0 +1,33 @@ +/** + * 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; so is the theme - beige.css - that this is based off of. + */ + + +// 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; + + + +// Theme template ------------------------------ +@import "../template/theme"; +// --------------------------------------------- \ No newline at end of file diff --git a/css/theme/source/simple.scss b/css/theme/source/simple.scss new file mode 100644 index 0000000..713ab44 --- /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(http://fonts.googleapis.com/css?family=News+Cycle:400,700); +@import url(http://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); + + +// Override theme settings (see ../template/settings.scss) +$mainFont: 'Lato', Times, 'Times New Roman', 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..77fd230 --- /dev/null +++ b/css/theme/source/sky.scss @@ -0,0 +1,41 @@ +/** + * 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(http://fonts.googleapis.com/css?family=Quicksand:400,700,400italic,700italic); +@import url(http://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; + +// Background generator +@mixin bodyBackground() { + @include radial-gradient( #add9e4, #f7fbfc ); +} + + + +// Theme template ------------------------------ +@import "../template/theme"; +// --------------------------------------------- \ No newline at end of file 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..bc9f138 --- /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', Times, 'Times New Roman', 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..6a80b62 --- /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; + 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.left, +.reveal .controls div.left.enabled { + border-right-color: $linkColor; +} + +.reveal .controls div.right, +.reveal .controls div.right.enabled { + border-left-color: $linkColor; +} + +.reveal .controls div.up, +.reveal .controls div.up.enabled { + border-bottom-color: $linkColor; +} + +.reveal .controls div.down, +.reveal .controls div.down.enabled { + border-top-color: $linkColor; +} + +.reveal .controls div.left.enabled:hover { + border-right-color: $linkColorHover; +} + +.reveal .controls div.right.enabled:hover { + border-left-color: $linkColorHover; +} + +.reveal .controls div.up.enabled:hover { + border-bottom-color: $linkColorHover; +} + +.reveal .controls div.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/index.html b/index.html new file mode 100644 index 0000000..08695db --- /dev/null +++ b/index.html @@ -0,0 +1,379 @@ + + + + + + + Sample Tuplejump Presentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+

Tuplejump

+

Presentation Template

+

+ Created by Your name / @tuplejump +

+
+ +
+

Built to Deliver

+

We understand the agile and fast changing nature of business. We understand “tomorrow is too late”, so we have built a system that delivers now!

+
+ +
+

Built for Speed

+

We take a holistic view of technology stack and so we built a well oiled machine with components optimized to perform at their best and tango with the rest. +

+
+ +
+

Built to Scale

+

We have designed a system that scales out on demand as your business grows. Scaling out from one system to huge clusters fast and easy.

+ + +
+ + +
+
+

Vertical Slides

+

+ Slides can be nested inside of other slides, + try pressing down. +

+ + Down arrow + +
+
+

Basement Level 1

+

Press down or up to navigate.

+
+
+

Basement Level 2

+

Cornify

+ + Unicorn + +
+
+

Basement Level 3

+

That's it, time to go back up.

+ + Up arrow + +
+
+ +
+

Point of View

+

+ Press ESC to enter the slide overview. Hold down alt and click on any element to zoom in on it using zoom.js. Alt + click anywhere to zoom back out. +

+
+ +
+

rvl.io

+

+ If you don't like writing slides in HTML you can use the online editor rvl.io. +

+
+ +
+

Works in Mobile Safari

+

+ Try it out! You can swipe through the slides and pinch your way to the overview. +

+
+ +
+

Marvelous Unordered List

+
    +
  • No order here
  • +
  • Or here
  • +
  • Or here
  • +
  • Or here
  • +
+
+ +
+

Fantastic Ordered List

+
    +
  1. One is smaller than...
  2. +
  3. Two is smaller than...
  4. +
  5. Three!
  6. +
+
+ +
+ +
+ +
+

Transition Styles

+

+ You can select from different transitions, like:
+ Cube - + Page - + Concave - + Zoom - + Linear - + None - + Default +

+
+ +
+

Themes

+

+ Reveal.js comes with a few themes built in:
+ Sky - + Beige - + Simple - + Serif - + Default +

+

+ + * Theme demos are loaded after the presentation which leads to flicker. In production you should load your theme in the <head> using a <link>. + +

+
+ +
+
+

Global State

+

+ Set data-state="something" on a slide and "something" + will be added as a class to the document element when the slide is open. This lets you + apply broader style changes, like switching the background. +

+ + Down arrow + +
+
+

"blackout"

+ + Down arrow + +
+
+

"soothe"

+ + Up arrow + +
+
+ +
+

Custom Events

+

+ Additionally custom events can be triggered on a per slide basis by binding to the data-state name. +

+
Reveal.addEventListener( 'customevent', function() {
+	console.log( '"customevent" has fired' );
+} );
+					
+
+ +
+

Clever Quotes

+

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

+
+ For years there has been a theory that millions of monkeys typing at random on millions of typewriters would + reproduce the entire works of Shakespeare. The Internet has proven this theory to be untrue. +
+
+ +
+

Pretty Code

+

+function linkify( selector ) {
+  if( supports3DTransforms ) {
+
+    var nodes = document.querySelectorAll( selector );
+
+    for( var i = 0, len = nodes.length; i < len; i++ ) {
+      var node = nodes[i];
+
+      if( !node.className ) ) {
+        node.className += ' roll';
+      }
+    };
+  }
+}
+					
+

Courtesy of highlight.js.

+
+ +
+

Intergalactic Interconnections

+

+ You can link between slides internally, + like this. +

+
+ +
+
+

Fragmented Views

+

Hit the next arrow...

+

... to step through ...

+
    +
  1. any type
  2. +
  3. of view
  4. +
  5. fragments
  6. +
+ + +
+
+

Fragment Styles

+

There's a few styles of fragments, like:

+

grow

+

shrink

+

roll-in

+

fade-out

+

highlight-red

+

highlight-green

+

highlight-blue

+
+
+ +
+

Spectacular image!

+ + Meny + +
+ +
+

Export to PDF

+

Presentations can be exported to PDF, below is an example that's been uploaded to SlideShare.

+ + +
+ +
+

Take a Moment

+

+ Press b or period on your keyboard to enter the 'paused' mode. This mode is helpful when you want to take disctracting slides off the screen + during a presentation. +

+
+ +
+

Stellar Links

+ +
+ +
+

It's free

+

+ reveal.js and rvl.io are entirely free but if you'd like to support the projects you can donate below. + Donations will go towards hosting and domain costs. +

+
+ + + + + + + + +
+
+ +
+

THE END

+

BY Hakim El Hattab / hakim.se

+
+ +
+ +
+ + + + + + + + diff --git a/js/reveal.js b/js/reveal.js new file mode 100644 index 0000000..d92ee76 --- /dev/null +++ b/js/reveal.js @@ -0,0 +1,1385 @@ +/*! + * reveal.js 2.1 r37 + * http://lab.hakim.se/reveal-js + * MIT licensed + * + * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se + */ +var Reveal = (function(){ + + 'use strict'; + + var HORIZONTAL_SLIDES_SELECTOR = '.reveal .slides>section', + VERTICAL_SLIDES_SELECTOR = '.reveal .slides>section.present>section', + + // Configurations defaults, can be overridden at initialization time + config = { + // 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, + + // Loop the presentation + loop: false, + + // 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: true, + + // Apply a 3D roll to links on hover + rollingLinks: true, + + // Transition style (see /css/theme) + theme: null, + + // Transition style + transition: 'default', // default/cube/page/concave/zoom/linear/none + + // Script dependencies to load + dependencies: [] + }, + + // Stores if the next slide should be shown automatically + // after n milliseconds + autoSlide = config.autoSlide, + + // The horizontal and verical 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 = [], + + // 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, + + 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 + mouseWheelTimeout = 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, + + // 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; + } + + // 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' ); + + // Progress bar + if( !dom.wrapper.querySelector( '.progress' ) && config.progress ) { + var progressElement = document.createElement( 'div' ); + progressElement.classList.add( 'progress' ); + progressElement.innerHTML = ''; + dom.wrapper.appendChild( progressElement ); + } + + // Arrow controls + if( !dom.wrapper.querySelector( '.controls' ) && config.controls ) { + var controlsElement = document.createElement( 'aside' ); + controlsElement.classList.add( 'controls' ); + controlsElement.innerHTML = '
' + + '
' + + '
' + + '
'; + dom.wrapper.appendChild( controlsElement ); + } + + // Presentation background element + if( !dom.wrapper.querySelector( '.state-background' ) ) { + var backgroundElement = document.createElement( 'div' ); + backgroundElement.classList.add( 'state-background' ); + dom.wrapper.appendChild( backgroundElement ); + } + + // 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' ); + dom.controlsLeft = document.querySelector( '.reveal .controls .left' ); + dom.controlsRight = document.querySelector( '.reveal .controls .right' ); + dom.controlsUp = document.querySelector( '.reveal .controls .up' ); + dom.controlsDown = document.querySelector( '.reveal .controls .down' ); + } + } + + /** + * Hides the address bar if we're on a mobile device. + */ + function hideAddressBar() { + if( navigator.userAgent.match( /(iphone|ipod|android)/i ) ) { + // Give the page some scrollable overflow + document.documentElement.style.overflow = 'scroll'; + document.body.style.height = '120%'; + + // 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_\-]*)\.?[^\\\/]*$/i )[0], s.callback ); + } + } + } + + // Called once synchronous scritps 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(); + + // Subscribe to input + addEventListeners(); + + // Updates the presentation to match the current configuration values + configure(); + + // Read the initial hash + readURL(); + + // Start auto-sliding if it's enabled + cueAutoSlide(); + + // 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. + */ + function configure() { + if( supports3DTransforms === false ) { + config.transition = 'linear'; + } + + if( config.controls && dom.controls ) { + dom.controls.style.display = 'block'; + } + + if( config.progress && dom.progress ) { + dom.progress.style.display = 'block'; + } + + if( config.transition !== 'default' ) { + dom.wrapper.classList.add( config.transition ); + } + + if( config.mouseWheel ) { + document.addEventListener( 'DOMMouseScroll', onDocumentMouseScroll, false ); // FF + document.addEventListener( 'mousewheel', onDocumentMouseScroll, false ); + } + + // 3D links + if( config.rollingLinks ) { + linkify(); + } + + // 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 ); + } + } + } + + /** + * Binds all event listeners. + */ + function addEventListeners() { + document.addEventListener( 'touchstart', onDocumentTouchStart, false ); + document.addEventListener( 'touchmove', onDocumentTouchMove, false ); + document.addEventListener( 'touchend', onDocumentTouchEnd, false ); + window.addEventListener( 'hashchange', onWindowHashChange, false ); + + if( config.keyboard ) { + document.addEventListener( 'keydown', onDocumentKeyDown, false ); + } + + if ( config.progress && dom.progress ) { + dom.progress.addEventListener( 'click', preventAndForward( onProgressClick ), false ); + } + + if ( config.controls && dom.controls ) { + dom.controlsLeft.addEventListener( 'click', preventAndForward( navigateLeft ), false ); + dom.controlsRight.addEventListener( 'click', preventAndForward( navigateRight ), false ); + dom.controlsUp.addEventListener( 'click', preventAndForward( navigateUp ), false ); + dom.controlsDown.addEventListener( 'click', preventAndForward( navigateDown ), false ); + } + } + + /** + * Unbinds all event listeners. + */ + function removeEventListeners() { + document.removeEventListener( 'keydown', onDocumentKeyDown, false ); + document.removeEventListener( 'touchstart', onDocumentTouchStart, false ); + document.removeEventListener( 'touchmove', onDocumentTouchMove, false ); + document.removeEventListener( 'touchend', onDocumentTouchEnd, false ); + window.removeEventListener( 'hashchange', onWindowHashChange, false ); + + if ( config.progress && dom.progress ) { + dom.progress.removeEventListener( 'click', preventAndForward( onProgressClick ), false ); + } + + if ( config.controls && dom.controls ) { + dom.controlsLeft.removeEventListener( 'click', preventAndForward( navigateLeft ), false ); + dom.controlsRight.removeEventListener( 'click', preventAndForward( navigateRight ), false ); + dom.controlsUp.removeEventListener( 'click', preventAndForward( navigateUp ), false ); + dom.controlsDown.removeEventListener( 'click', preventAndForward( navigateDown ), 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 ]; + } + } + + /** + * 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 ); + } + + /** + * Prevents an events defaults behavior calls the + * specified delegate. + * + * @param {Function} delegate The method to call + * after the wrapper has been executed + */ + function preventAndForward( delegate ) { + return function( event ) { + event.preventDefault(); + delegate.call( null, event ); + }; + } + + /** + * Causes the address bar to hide on mobile devices, + * more vertical space ftw. + */ + function removeAddressBar() { + setTimeout( function() { + window.scrollTo( 0, 1 ); + }, 0 ); + } + + /** + * 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 linkify() { + if( supports3DTransforms && !( 'msPerspective' in document.body.style ) ) { + var nodes = document.querySelectorAll( '.reveal .slides section a:not(.image)' ); + + for( var i = 0, len = nodes.length; i < len; i++ ) { + var node = nodes[i]; + + if( node.textContent && !node.querySelector( 'img' ) && ( !node.className || !node.classList.contains( node, 'roll' ) ) ) { + node.classList.add( 'roll' ); + node.innerHTML = '' + node.innerHTML + ''; + } + } + } + } + + /** + * 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 ) { + + dom.wrapper.classList.add( 'overview' ); + + var horizontalSlides = document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ); + + for( var i = 0, len1 = horizontalSlides.length; i < len1; i++ ) { + var hslide = horizontalSlides[i], + htransform = 'translateZ(-2500px) translate(' + ( ( i - indexh ) * 105 ) + '%, 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' ) ) { + // Navigate to this slide on click + hslide.addEventListener( 'click', onOverviewSlideClicked, true ); + } + + var verticalSlides = hslide.querySelectorAll( 'section' ); + + for( var j = 0, len2 = verticalSlides.length; j < len2; j++ ) { + var vslide = verticalSlides[j], + vtransform = 'translate(0%, ' + ( ( j - ( i === indexh ? indexv : 0 ) ) * 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 ); + } + + } + + } + + } + + /** + * Exits the slide overview and enters the currently + * active slide. + */ + function deactivateOverview() { + + // Only proceed if enabled in config + if( config.overview ) { + + dom.wrapper.classList.remove( 'overview' ); + + // Select all slides + var slides = Array.prototype.slice.call( document.querySelectorAll( '.reveal .slides section' ) ); + + for( var i = 0, len = slides.length; i < len; i++ ) { + var element = slides[i]; + + // 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 ); + } + + slide(); + + } + } + + /** + * 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 { + isOverviewActive() ? deactivateOverview() : activateOverview(); + } + } + + /** + * Checks if the overview is currently active. + * + * @return {Boolean} true if the overview is active, + * false otherwise + */ + function isOverviewActive() { + return dom.wrapper.classList.contains( 'overview' ); + } + + /** + * 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.mozRequestFullScreen || + element.msRequestFullScreen; + + if( requestMethod ) { + requestMethod.apply( element ); + } + } + + /** + * Enters the paused mode which fades everything on screen to + * black. + */ + function pause() { + dom.wrapper.classList.add( 'paused' ); + } + + /** + * Exits from the paused mode. + */ + function resume() { + dom.wrapper.classList.remove( 'paused' ); + } + + /** + * 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 + */ + function slide( h, v ) { + // Remember where we were at before + previousSlide = currentSlide; + + // 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 ); + + // 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 remaints of the previous state + while( stateBefore.length ) { + document.documentElement.classList.remove( stateBefore.pop() ); + } + + // Update progress if enabled + if( config.progress && dom.progress ) { + dom.progressbar.style.width = ( indexh / ( document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ).length - 1 ) ) * window.innerWidth + 'px'; + } + + // If the overview is active, re-activate it to update positions + if( isOverviewActive() ) { + activateOverview(); + } + + updateControls(); + + // Update the URL hash after a delay since updating it mid-transition + // is likely to cause visual lag + clearTimeout( writeURLTimeout ); + writeURLTimeout = setTimeout( writeURL, 1500 ); + + // Query all horizontal slides in the deck + var horizontalSlides = document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ); + + // 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; + + // Dispatch an event if the slide changed + if( indexh !== indexhBefore || indexv !== indexvBefore ) { + dispatchEvent( 'slidechanged', { + 'indexh': indexh, + 'indexv': indexv, + 'previousSlide': previousSlide, + 'currentSlide': currentSlide + } ); + } + 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' ); + } + } + + /** + * 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 = Array.prototype.slice.call( 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( isOverviewActive() === 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'; + } + + slides[i].classList.remove( 'past' ); + slides[i].classList.remove( 'present' ); + slides[i].classList.remove( 'future' ); + + if( i < index ) { + // Any element previous to index is given the 'past' class + slides[i].classList.add( 'past' ); + } + else if( i > index ) { + // Any element subsequent to index is given the 'future' class + slides[i].classList.add( 'future' ); + } + + // If this element contains vertical slides + if( element.querySelector( 'section' ) ) { + slides[i].classList.add( 'stack' ); + } + } + + // Mark the current slide as present + slides[index].classList.add( 'present' ); + + // 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 ); + } 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 state and link pointers of the controls. + */ + function updateControls() { + if ( config.controls && dom.controls ) { + + var routes = availableRoutes(); + + // Remove the 'enabled' class from all directions + [ dom.controlsLeft, dom.controlsRight, dom.controlsUp, dom.controlsDown ].forEach( function( node ) { + node.classList.remove( 'enabled' ); + } ); + + // Add the 'enabled' class to the available routes + if( routes.left ) dom.controlsLeft.classList.add( 'enabled' ); + if( routes.right ) dom.controlsRight.classList.add( 'enabled' ); + if( routes.up ) dom.controlsUp.classList.add( 'enabled' ); + if( routes.down ) dom.controlsDown.classList.add( 'enabled' ); + + } + } + + /** + * 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 ); + + return { + left: indexh > 0, + right: indexh < horizontalSlides.length - 1, + up: indexv > 0, + down: indexv < verticalSlides.length - 1 + }; + } + + /** + * 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. + */ + function writeURL() { + if( config.history ) { + var url = '/'; + + // Only include the minimum possible number of components in + // the URL + 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: } + */ + function getIndices( slide ) { + // By default, return the current indices + var h = indexh, + v = indexv; + + // If a slide is specified, return the indices of that slide + if( slide ) { + var isVertical = !!slide.parentNode.nodeName.match( /section/gi ); + var slideh = isVertical ? slide.parentNode : slide; + + // Select all horizontal slides + var horizontalSlides = Array.prototype.slice.call( 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( Array.prototype.slice.call( slide.parentNode.children ).indexOf( slide ), 0 ); + } + } + + return { h: h, v: v }; + } + + /** + * Navigate to the next slide fragment. + * + * @return {Boolean} true if there was a next fragment, + * false otherwise + */ + function nextFragment() { + // Vertical slides: + if( document.querySelector( VERTICAL_SLIDES_SELECTOR + '.present' ) ) { + var verticalFragments = document.querySelectorAll( VERTICAL_SLIDES_SELECTOR + '.present .fragment:not(.visible)' ); + if( verticalFragments.length ) { + verticalFragments[0].classList.add( 'visible' ); + + // Notify subscribers of the change + dispatchEvent( 'fragmentshown', { fragment: verticalFragments[0] } ); + return true; + } + } + // Horizontal slides: + else { + var horizontalFragments = document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR + '.present .fragment:not(.visible)' ); + if( horizontalFragments.length ) { + horizontalFragments[0].classList.add( 'visible' ); + + // Notify subscribers of the change + dispatchEvent( 'fragmentshown', { fragment: horizontalFragments[0] } ); + return true; + } + } + + return false; + } + + /** + * Navigate to the previous slide fragment. + * + * @return {Boolean} true if there was a previous fragment, + * false otherwise + */ + function previousFragment() { + // Vertical slides: + if( document.querySelector( VERTICAL_SLIDES_SELECTOR + '.present' ) ) { + var verticalFragments = document.querySelectorAll( VERTICAL_SLIDES_SELECTOR + '.present .fragment.visible' ); + if( verticalFragments.length ) { + verticalFragments[ verticalFragments.length - 1 ].classList.remove( 'visible' ); + + // Notify subscribers of the change + dispatchEvent( 'fragmenthidden', { fragment: verticalFragments[ verticalFragments.length - 1 ] } ); + return true; + } + } + // Horizontal slides: + else { + var horizontalFragments = document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR + '.present .fragment.visible' ); + if( horizontalFragments.length ) { + horizontalFragments[ horizontalFragments.length - 1 ].classList.remove( 'visible' ); + + // Notify subscribers of the change + dispatchEvent( 'fragmenthidden', { fragment: horizontalFragments[ horizontalFragments.length - 1 ] } ); + 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 ) { + autoSlideTimeout = setTimeout( navigateNext, autoSlide ); + } + } + + function navigateLeft() { + // Prioritize hiding fragments + if( availableRoutes().left && ( isOverviewActive() || previousFragment() === false ) ) { + slide( indexh - 1, 0 ); + } + } + + function navigateRight() { + // Prioritize revealing fragments + if( availableRoutes().right && ( isOverviewActive() || nextFragment() === false ) ) { + slide( indexh + 1, 0 ); + } + } + + function navigateUp() { + // Prioritize hiding fragments + if( availableRoutes().up && ( isOverviewActive() || previousFragment() === false ) ) { + slide( indexh, indexv - 1 ); + } + } + + function navigateDown() { + // Prioritize revealing fragments + if( availableRoutes().down && ( isOverviewActive() || nextFragment() === false ) ) { + 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( '.reveal .slides>section.past:nth-child(' + indexh + ')' ); + + if( previousSlide ) { + indexv = ( previousSlide.querySelectorAll( 'section' ).length + 1 ) || 0; + indexh --; + slide(); + } + } + } + } + + /** + * 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.altKey || event.ctrlKey || event.metaKey ) return; + + var 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: isOverviewActive() ? deactivateOverview() : navigateNext(); break; + // return + case 13: isOverviewActive() ? deactivateOverview() : triggered = false; break; + // b, period + case 66: case 190: 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 document level 'touchstart' event, + * enables support for swipe and pinch gestures. + */ + function onDocumentTouchStart( 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 document level 'touchmove' event. + */ + function onDocumentTouchMove( 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 document level 'touchend' event. + */ + function onDocumentTouchEnd( event ) { + touch.handled = false; + } + + /** + * Handles mouse wheel scrolling, throttled to avoid skipping + * multiple slides. + */ + function onDocumentMouseScroll( event ){ + clearTimeout( mouseWheelTimeout ); + + mouseWheelTimeout = setTimeout( function() { + var delta = event.detail || -event.wheelDelta; + if( delta > 0 ) { + navigateNext(); + } + else { + navigatePrev(); + } + }, 100 ); + } + + /** + * Clicking on the progress bar results in a navigation to the + * closest approximate horizontal slide using this equation: + * + * ( clickX / presentationWidth ) * numberOfSlides + */ + function onProgressClick( event ) { + var slidesTotal = Array.prototype.slice.call( document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) ).length; + var slideIndex = Math.floor( ( event.clientX / dom.wrapper.offsetWidth ) * slidesTotal ); + + slide( slideIndex ); + } + + /** + * Handler for the window level 'hashchange' event. + * + * @param {Object} event + */ + function onWindowHashChange( event ) { + readURL(); + } + + /** + * 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( isOverviewActive() ) { + event.preventDefault(); + + deactivateOverview(); + + indexh = this.getAttribute( 'data-index-h' ); + indexv = this.getAttribute( 'data-index-v' ); + + slide(); + } + } + + + // --------------------------------------------------------------------// + // ------------------------------- API --------------------------------// + // --------------------------------------------------------------------// + + + return { + initialize: initialize, + + // 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, + + // Toggles the overview mode on/off + toggleOverview: toggleOverview, + + // 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 previous slide element, may be null + getPreviousSlide: function() { + return previousSlide; + }, + + // Returns the current slide element + getCurrentSlide: function() { + return currentSlide; + }, + + // 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; + }, + + // 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 ); + } + } + }; + +})(); \ No newline at end of file diff --git a/js/reveal.min.js b/js/reveal.min.js new file mode 100644 index 0000000..e31d807 --- /dev/null +++ b/js/reveal.min.js @@ -0,0 +1,83 @@ +/*! + * reveal.js 2.1 r37 + * http://lab.hakim.se/reveal-js + * MIT licensed + * + * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se + */ +var Reveal=(function(){var l=".reveal .slides>section",b=".reveal .slides>section.present>section",R={controls:true,progress:true,history:false,keyboard:true,overview:true,loop:false,autoSlide:0,mouseWheel:true,rollingLinks:true,theme:null,transition:"default",dependencies:[]},Y=R.autoSlide,m=0,e=0,y,G,ak=[],f={},T="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,n="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,z=0,k=0,D=0,ac={startX:0,startY:0,startSpan:0,startCount:0,handled:false,threshold:80}; +function i(al){if((!n&&!T)){document.body.setAttribute("class","no-transforms");return;}t(R,al);d();V();}function P(){f.theme=document.querySelector("#theme"); +f.wrapper=document.querySelector(".reveal");if(!f.wrapper.querySelector(".progress")&&R.progress){var ao=document.createElement("div");ao.classList.add("progress"); +ao.innerHTML="";f.wrapper.appendChild(ao);}if(!f.wrapper.querySelector(".controls")&&R.controls){var an=document.createElement("aside");an.classList.add("controls"); +an.innerHTML='
';f.wrapper.appendChild(an);}if(!f.wrapper.querySelector(".state-background")){var am=document.createElement("div"); +am.classList.add("state-background");f.wrapper.appendChild(am);}if(!f.wrapper.querySelector(".pause-overlay")){var al=document.createElement("div");al.classList.add("pause-overlay"); +f.wrapper.appendChild(al);}f.progress=document.querySelector(".reveal .progress");f.progressbar=document.querySelector(".reveal .progress span");if(R.controls){f.controls=document.querySelector(".reveal .controls"); +f.controlsLeft=document.querySelector(".reveal .controls .left");f.controlsRight=document.querySelector(".reveal .controls .right");f.controlsUp=document.querySelector(".reveal .controls .up"); +f.controlsDown=document.querySelector(".reveal .controls .down");}}function d(){if(navigator.userAgent.match(/(iphone|ipod|android)/i)){document.documentElement.style.overflow="scroll"; +document.body.style.height="120%";window.addEventListener("load",ad,false);window.addEventListener("orientationchange",ad,false);}}function V(){var am=[],aq=[]; +for(var an=0,al=R.dependencies.length;an'+ao.innerHTML+"";}}}}function I(){if(R.overview){f.wrapper.classList.add("overview");var al=document.querySelectorAll(l); +for(var aq=0,ao=al.length;aq3?"none":"block"; +}am[aq].classList.remove("past");am[aq].classList.remove("present");am[aq].classList.remove("future");if(aqau){am[aq].classList.add("future"); +}}if(ar.querySelector("section")){am[aq].classList.add("stack");}}am[au].classList.add("present");var an=am[au].getAttribute("data-state");if(an){ak=ak.concat(an.split(" ")); +}var ap=am[au].getAttribute("data-autoslide");if(ap){Y=parseInt(ap);}else{Y=R.autoSlide;}}else{au=0;}return au;}function s(){if(R.controls&&f.controls){var al=g(); +[f.controlsLeft,f.controlsRight,f.controlsUp,f.controlsDown].forEach(function(am){am.classList.remove("enabled");});if(al.left){f.controlsLeft.classList.add("enabled"); +}if(al.right){f.controlsRight.classList.add("enabled");}if(al.up){f.controlsUp.classList.add("enabled");}if(al.down){f.controlsDown.classList.add("enabled"); +}}}function g(){var al=document.querySelectorAll(l),am=document.querySelectorAll(b);return{left:m>0,right:m0,down:e0||e>0){al+=m; +}if(e>0){al+="/"+e;}window.location.hash=al;}}function M(al){var ap=m,an=e;if(al){var aq=!!al.parentNode.nodeName.match(/section/gi);var ao=aq?al.parentNode:al; +var am=Array.prototype.slice.call(document.querySelectorAll(l));ap=Math.max(am.indexOf(ao),0);if(aq){an=Math.max(Array.prototype.slice.call(al.parentNode.children).indexOf(al),0); +}}return{h:ap,v:an};}function v(){if(document.querySelector(b+".present")){var am=document.querySelectorAll(b+".present .fragment:not(.visible)");if(am.length){am[0].classList.add("visible"); +r("fragmentshown",{fragment:am[0]});return true;}}else{var al=document.querySelectorAll(l+".present .fragment:not(.visible)");if(al.length){al[0].classList.add("visible"); +r("fragmentshown",{fragment:al[0]});return true;}}return false;}function Q(){if(document.querySelector(b+".present")){var am=document.querySelectorAll(b+".present .fragment.visible"); +if(am.length){am[am.length-1].classList.remove("visible");r("fragmenthidden",{fragment:am[am.length-1]});return true;}}else{var al=document.querySelectorAll(l+".present .fragment.visible"); +if(al.length){al[al.length-1].classList.remove("visible");r("fragmenthidden",{fragment:al[al.length-1]});return true;}}return false;}function O(){clearTimeout(k); +if(Y){k=setTimeout(x,Y);}}function B(){if(g().left&&(L()||Q()===false)){a(m-1,0);}}function j(){if(g().right&&(L()||v()===false)){a(m+1,0);}}function u(){if(g().up&&(L()||Q()===false)){a(m,e-1); +}}function F(){if(g().down&&(L()||v()===false)){a(m,e+1);}}function Z(){if(Q()===false){if(g().up){u();}else{var al=document.querySelector(".reveal .slides>section.past:nth-child("+m+")"); +if(al){e=(al.querySelectorAll("section").length+1)||0;m--;a();}}}}function x(){if(v()===false){g().down?F():j();}O();}function ah(an){var am=document.activeElement; +var ao=!!(document.activeElement&&(document.activeElement.type||document.activeElement.href||document.activeElement.contentEditable!=="inherit"));if(ao||an.shiftKey||an.altKey||an.ctrlKey||an.metaKey){return; +}var al=true;switch(an.keyCode){case 80:case 33:Z();break;case 78:case 34:x();break;case 72:case 37:B();break;case 76:case 39:j();break;case 75:case 38:u(); +break;case 74:case 40:F();break;case 36:a(0);break;case 35:a(Number.MAX_VALUE);break;case 32:L()?ae():x();break;case 13:L()?ae():al=false;break;case 66:case 190:aa(); +break;case 70:ab();break;default:al=false;}if(al){an.preventDefault();}else{if(an.keyCode===27&&T){X();an.preventDefault();}}O();}function A(al){ac.startX=al.touches[0].clientX; +ac.startY=al.touches[0].clientY;ac.startCount=al.touches.length;if(al.touches.length===2&&R.overview){ac.startSpan=S({x:al.touches[1].clientX,y:al.touches[1].clientY},{x:ac.startX,y:ac.startY}); +}}function af(aq){if(!ac.handled){var ao=aq.touches[0].clientX;var an=aq.touches[0].clientY;if(aq.touches.length===2&&ac.startCount===2&&R.overview){var ap=S({x:aq.touches[1].clientX,y:aq.touches[1].clientY},{x:ac.startX,y:ac.startY}); +if(Math.abs(ac.startSpan-ap)>ac.threshold){ac.handled=true;if(apac.threshold&&Math.abs(am)>Math.abs(al)){ac.handled=true;B();}else{if(am<-ac.threshold&&Math.abs(am)>Math.abs(al)){ac.handled=true;j();}else{if(al>ac.threshold){ac.handled=true; +u();}else{if(al<-ac.threshold){ac.handled=true;F();}}}}aq.preventDefault();}}}else{if(navigator.userAgent.match(/android/gi)){aq.preventDefault();}}}function W(al){ac.handled=false; +}function o(al){clearTimeout(z);z=setTimeout(function(){var am=al.detail||-al.wheelDelta;if(am>0){x();}else{Z();}},100);}function ai(am){var al=Array.prototype.slice.call(document.querySelectorAll(l)).length; +var an=Math.floor((am.clientX/f.wrapper.offsetWidth)*al);a(an);}function w(al){J();}function C(al){if(L()){al.preventDefault();ae();m=this.getAttribute("data-index-h"); +e=this.getAttribute("data-index-v");a();}}return{initialize:i,slide:a,left:B,right:j,up:u,down:F,prev:Z,next:x,prevFragment:Q,nextFragment:v,navigateTo:a,navigateLeft:B,navigateRight:j,navigateUp:u,navigateDown:F,navigatePrev:Z,navigateNext:x,toggleOverview:X,addEventListeners:E,removeEventListeners:U,getIndices:M,getPreviousSlide:function(){return y; +},getCurrentSlide:function(){return G;},getQueryHash:function(){var al={};location.search.replace(/[A-Z0-9]+?=(\w*)/gi,function(am){al[am.split("=").shift()]=am.split("=").pop(); +});return al;},addEventListener:function(am,an,al){if("addEventListener" in window){(f.wrapper||document.querySelector(".reveal")).addEventListener(am,an,al); +}},removeEventListener:function(am,an,al){if("addEventListener" in window){(f.wrapper||document.querySelector(".reveal")).removeEventListener(am,an,al); +}}};})(); \ No newline at end of file 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"}while(y.length||z.length){var v=u().splice(0,1)[0];w+=m(x.substr(r,v.offset-r));r=v.offset;if(v.event=="start"){w+=s(v.node);t.push(v.node)}else{if(v.event=="stop"){var q=t.length;do{q--;var p=t[q];w+=("")}while(p!=v.node);t.splice(q,1);while(q'+m(L[0])+""}else{N+=m(L[0])}P=O.lR.lastIndex;L=O.lR.exec(M)}N+=m(M.substr(P,M.length-P));return N}function K(r,M){if(M.sL&&d[M.sL]){var L=e(M.sL,r);t+=L.keyword_count;return L.value}else{return F(r,M)}}function I(M,r){var L=M.cN?'':"";if(M.rB){q+=L;M.buffer=""}else{if(M.eB){q+=m(r)+L;M.buffer=""}else{q+=L;M.buffer=r}}C.push(M);B+=M.r}function E(O,L,Q){var R=C[C.length-1];if(Q){q+=K(R.buffer+O,R);return false}var M=z(L,R);if(M){q+=K(R.buffer+O,R);I(M,L);return M.rB}var r=w(C.length-1,L);if(r){var N=R.cN?"":"";if(R.rE){q+=K(R.buffer+O,R)+N}else{if(R.eE){q+=K(R.buffer+O,R)+N+m(L)}else{q+=K(R.buffer+O+L,R)+N}}while(r>1){N=C[C.length-2].cN?"":"";q+=N;r--;C.length--}var P=C[C.length-1];C.length--;C[C.length-1].buffer="";if(P.starts){I(P.starts,"")}return R.rE}if(x(L,R)){throw"Illegal"}}var H=d[J];var C=[H.dM];var B=0;var t=0;var q="";try{var v=0;H.dM.buffer="";do{var y=s(D,v);var u=E(y[0],y[1],y[2]);v+=y[0].length;if(!u){v+=y[1].length}}while(!y[2]);if(C.length>1){throw"Illegal"}return{r:B,keyword_count:t,value:q}}catch(G){if(G=="Illegal"){return{r:0,keyword_count:0,value:m(D)}}else{throw G}}}function f(t){var r={keyword_count:0,r:0,value:m(t)};var q=r;for(var p in d){if(!d.hasOwnProperty(p)){continue}var s=e(p,t);s.language=p;if(s.keyword_count+s.r>q.keyword_count+q.r){q=s}if(s.keyword_count+s.r>r.keyword_count+r.r){q=r;r=s}}if(q.language){r.second_best=q}return r}function h(r,q,p){if(q){r=r.replace(/^((<[^>]+>|\t)+)/gm,function(t,w,v,u){return w.replace(/\t/g,q)})}if(p){r=r.replace(/\n/g,"
")}return r}function o(u,x,q){var y=g(u,q);var s=a(u);if(s=="no-highlight"){return}if(s){var w=e(s,y)}else{var w=f(y);s=w.language}var p=b(u);if(p.length){var r=document.createElement("pre");r.innerHTML=w.value;w.value=l(p,b(r),y)}w.value=h(w.value,x,q);var t=u.className;if(!t.match("(\\s|^)(language-)?"+s+"(\\s|$)")){t=t?(t+" "+s):s}if(/MSIE [678]/.test(navigator.userAgent)&&u.tagName=="CODE"&&u.parentNode.tagName=="PRE"){var r=u.parentNode;var v=document.createElement("div");v.innerHTML="
"+w.value+"
";u=v.firstChild.firstChild;v.firstChild.cN=r.cN;r.parentNode.replaceChild(v.firstChild,r)}else{u.innerHTML=w.value}u.className=t;u.result={language:s,kw:w.keyword_count,re:w.r};if(w.second_best){u.second_best={language:w.second_best.language,kw:w.second_best.keyword_count,re:w.second_best.r}}}function k(){if(k.called){return}k.called=true;var r=document.getElementsByTagName("pre");for(var p=0;p|>=|>>|>>=|>>>|>>>=|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~";this.BE={b:"\\\\.",r:0};this.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[this.BE],r:0};this.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[this.BE],r:0};this.CLCM={cN:"comment",b:"//",e:"$"};this.CBLCLM={cN:"comment",b:"/\\*",e:"\\*/"};this.HCM={cN:"comment",b:"#",e:"$"};this.NM={cN:"number",b:this.NR,r:0};this.CNM={cN:"number",b:this.CNR,r:0};this.inherit=function(p,s){var r={};for(var q in p){r[q]=p[q]}if(s){for(var q in s){r[q]=s[q]}}return r}}();hljs.LANGUAGES.cs={dM:{k:{"abstract":1,as:1,base:1,bool:1,"break":1,"byte":1,"case":1,"catch":1,"char":1,checked:1,"class":1,"const":1,"continue":1,decimal:1,"default":1,delegate:1,"do":1,"do":1,"double":1,"else":1,"enum":1,event:1,explicit:1,extern:1,"false":1,"finally":1,fixed:1,"float":1,"for":1,foreach:1,"goto":1,"if":1,implicit:1,"in":1,"int":1,"interface":1,internal:1,is:1,lock:1,"long":1,namespace:1,"new":1,"null":1,object:1,operator:1,out:1,override:1,params:1,"private":1,"protected":1,"public":1,readonly:1,ref:1,"return":1,sbyte:1,sealed:1,"short":1,sizeof:1,stackalloc:1,"static":1,string:1,struct:1,"switch":1,"this":1,"throw":1,"true":1,"try":1,"typeof":1,uint:1,ulong:1,unchecked:1,unsafe:1,ushort:1,using:1,virtual:1,"volatile":1,"void":1,"while":1,ascending:1,descending:1,from:1,get:1,group:1,into:1,join:1,let:1,orderby:1,partial:1,select:1,set:1,value:1,"var":1,where:1,yield:1},c:[{cN:"comment",b:"///",e:"$",rB:true,c:[{cN:"xmlDocTag",b:"///|"},{cN:"xmlDocTag",b:""}]},hljs.CLCM,hljs.CBLCLM,{cN:"string",b:'@"',e:'"',c:[{b:'""'}]},hljs.ASM,hljs.QSM,hljs.CNM]}};hljs.LANGUAGES.ruby=function(){var g="[a-zA-Z_][a-zA-Z0-9_]*(\\!|\\?)?";var a="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?";var n={keyword:{and:1,"false":1,then:1,defined:1,module:1,"in":1,"return":1,redo:1,"if":1,BEGIN:1,retry:1,end:1,"for":1,"true":1,self:1,when:1,next:1,until:1,"do":1,begin:1,unless:1,END:1,rescue:1,nil:1,"else":1,"break":1,undef:1,not:1,"super":1,"class":1,"case":1,require:1,yield:1,alias:1,"while":1,ensure:1,elsif:1,or:1,def:1},keymethods:{__id__:1,__send__:1,abort:1,abs:1,"all?":1,allocate:1,ancestors:1,"any?":1,arity:1,assoc:1,at:1,at_exit:1,autoload:1,"autoload?":1,"between?":1,binding:1,binmode:1,"block_given?":1,call:1,callcc:1,caller:1,capitalize:1,"capitalize!":1,casecmp:1,"catch":1,ceil:1,center:1,chomp:1,"chomp!":1,chop:1,"chop!":1,chr:1,"class":1,class_eval:1,"class_variable_defined?":1,class_variables:1,clear:1,clone:1,close:1,close_read:1,close_write:1,"closed?":1,coerce:1,collect:1,"collect!":1,compact:1,"compact!":1,concat:1,"const_defined?":1,const_get:1,const_missing:1,const_set:1,constants:1,count:1,crypt:1,"default":1,default_proc:1,"delete":1,"delete!":1,delete_at:1,delete_if:1,detect:1,display:1,div:1,divmod:1,downcase:1,"downcase!":1,downto:1,dump:1,dup:1,each:1,each_byte:1,each_index:1,each_key:1,each_line:1,each_pair:1,each_value:1,each_with_index:1,"empty?":1,entries:1,eof:1,"eof?":1,"eql?":1,"equal?":1,"eval":1,exec:1,exit:1,"exit!":1,extend:1,fail:1,fcntl:1,fetch:1,fileno:1,fill:1,find:1,find_all:1,first:1,flatten:1,"flatten!":1,floor:1,flush:1,for_fd:1,foreach:1,fork:1,format:1,freeze:1,"frozen?":1,fsync:1,getc:1,gets:1,global_variables:1,grep:1,gsub:1,"gsub!":1,"has_key?":1,"has_value?":1,hash:1,hex:1,id:1,include:1,"include?":1,included_modules:1,index:1,indexes:1,indices:1,induced_from:1,inject:1,insert:1,inspect:1,instance_eval:1,instance_method:1,instance_methods:1,"instance_of?":1,"instance_variable_defined?":1,instance_variable_get:1,instance_variable_set:1,instance_variables:1,"integer?":1,intern:1,invert:1,ioctl:1,"is_a?":1,isatty:1,"iterator?":1,join:1,"key?":1,keys:1,"kind_of?":1,lambda:1,last:1,length:1,lineno:1,ljust:1,load:1,local_variables:1,loop:1,lstrip:1,"lstrip!":1,map:1,"map!":1,match:1,max:1,"member?":1,merge:1,"merge!":1,method:1,"method_defined?":1,method_missing:1,methods:1,min:1,module_eval:1,modulo:1,name:1,nesting:1,"new":1,next:1,"next!":1,"nil?":1,nitems:1,"nonzero?":1,object_id:1,oct:1,open:1,pack:1,partition:1,pid:1,pipe:1,pop:1,popen:1,pos:1,prec:1,prec_f:1,prec_i:1,print:1,printf:1,private_class_method:1,private_instance_methods:1,"private_method_defined?":1,private_methods:1,proc:1,protected_instance_methods:1,"protected_method_defined?":1,protected_methods:1,public_class_method:1,public_instance_methods:1,"public_method_defined?":1,public_methods:1,push:1,putc:1,puts:1,quo:1,raise:1,rand:1,rassoc:1,read:1,read_nonblock:1,readchar:1,readline:1,readlines:1,readpartial:1,rehash:1,reject:1,"reject!":1,remainder:1,reopen:1,replace:1,require:1,"respond_to?":1,reverse:1,"reverse!":1,reverse_each:1,rewind:1,rindex:1,rjust:1,round:1,rstrip:1,"rstrip!":1,scan:1,seek:1,select:1,send:1,set_trace_func:1,shift:1,singleton_method_added:1,singleton_methods:1,size:1,sleep:1,slice:1,"slice!":1,sort:1,"sort!":1,sort_by:1,split:1,sprintf:1,squeeze:1,"squeeze!":1,srand:1,stat:1,step:1,store:1,strip:1,"strip!":1,sub:1,"sub!":1,succ:1,"succ!":1,sum:1,superclass:1,swapcase:1,"swapcase!":1,sync:1,syscall:1,sysopen:1,sysread:1,sysseek:1,system:1,syswrite:1,taint:1,"tainted?":1,tell:1,test:1,"throw":1,times:1,to_a:1,to_ary:1,to_f:1,to_hash:1,to_i:1,to_int:1,to_io:1,to_proc:1,to_s:1,to_str:1,to_sym:1,tr:1,"tr!":1,tr_s:1,"tr_s!":1,trace_var:1,transpose:1,trap:1,truncate:1,"tty?":1,type:1,ungetc:1,uniq:1,"uniq!":1,unpack:1,unshift:1,untaint:1,untrace_var:1,upcase:1,"upcase!":1,update:1,upto:1,"value?":1,values:1,values_at:1,warn:1,write:1,write_nonblock:1,"zero?":1,zip:1}};var h={cN:"yardoctag",b:"@[A-Za-z]+"};var d={cN:"comment",b:"#",e:"$",c:[h]};var c={cN:"comment",b:"^\\=begin",e:"^\\=end",c:[h],r:10};var b={cN:"comment",b:"^__END__",e:"\\n$"};var u={cN:"subst",b:"#\\{",e:"}",l:g,k:n};var p=[hljs.BE,u];var s={cN:"string",b:"'",e:"'",c:p,r:0};var r={cN:"string",b:'"',e:'"',c:p,r:0};var q={cN:"string",b:"%[qw]?\\(",e:"\\)",c:p,r:10};var o={cN:"string",b:"%[qw]?\\[",e:"\\]",c:p,r:10};var m={cN:"string",b:"%[qw]?{",e:"}",c:p,r:10};var l={cN:"string",b:"%[qw]?<",e:">",c:p,r:10};var k={cN:"string",b:"%[qw]?/",e:"/",c:p,r:10};var j={cN:"string",b:"%[qw]?%",e:"%",c:p,r:10};var i={cN:"string",b:"%[qw]?-",e:"-",c:p,r:10};var t={cN:"string",b:"%[qw]?\\|",e:"\\|",c:p,r:10};var e={cN:"function",b:"\\bdef\\s+",e:" |$|;",l:g,k:n,c:[{cN:"title",b:a,l:g,k:n},{cN:"params",b:"\\(",e:"\\)",l:g,k:n},d,c,b]};var f={cN:"identifier",b:g,l:g,k:n,r:0};var v=[d,c,b,s,r,q,o,m,l,k,j,i,t,{cN:"class",b:"\\b(class|module)\\b",e:"$|;",k:{"class":1,module:1},c:[{cN:"title",b:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?",r:0},{cN:"inheritance",b:"<\\s*",c:[{cN:"parent",b:"("+hljs.IR+"::)?"+hljs.IR}]},d,c,b]},e,{cN:"constant",b:"(::)?([A-Z]\\w*(::)?)+",r:0},{cN:"symbol",b:":",c:[s,r,q,o,m,l,k,j,i,t,f],r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{cN:"number",b:"\\?\\w"},{cN:"variable",b:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},f,{b:"("+hljs.RSR+")\\s*",c:[d,c,b,{cN:"regexp",b:"/",e:"/[a-z]*",i:"\\n",c:[hljs.BE]}],r:0}];u.c=v;e.c[1].c=v;return{dM:{l:g,k:n,c:v}}}();hljs.LANGUAGES.javascript={dM:{k:{keyword:{"in":1,"if":1,"for":1,"while":1,"finally":1,"var":1,"new":1,"function":1,"do":1,"return":1,"void":1,"else":1,"break":1,"catch":1,"instanceof":1,"with":1,"throw":1,"case":1,"default":1,"try":1,"this":1,"switch":1,"continue":1,"typeof":1,"delete":1},literal:{"true":1,"false":1,"null":1}},c:[hljs.ASM,hljs.QSM,hljs.CLCM,hljs.CBLCLM,hljs.CNM,{b:"("+hljs.RSR+"|case|return|throw)\\s*",k:{"return":1,"throw":1,"case":1},c:[hljs.CLCM,hljs.CBLCLM,{cN:"regexp",b:"/",e:"/[gim]*",c:[{b:"\\\\/"}]}],r:0},{cN:"function",b:"\\bfunction\\b",e:"{",k:{"function":1},c:[{cN:"title",b:"[A-Za-z$_][0-9A-Za-z$_]*"},{cN:"params",b:"\\(",e:"\\)",c:[hljs.ASM,hljs.QSM,hljs.CLCM,hljs.CBLCLM]}]}]}};hljs.LANGUAGES.css=function(){var a={cN:"function",b:hljs.IR+"\\(",e:"\\)",c:[{eW:true,eE:true,c:[hljs.NM,hljs.ASM,hljs.QSM]}]};return{cI:true,dM:{i:"[=/|']",c:[hljs.CBLCLM,{cN:"id",b:"\\#[A-Za-z0-9_-]+"},{cN:"class",b:"\\.[A-Za-z0-9_-]+",r:0},{cN:"attr_selector",b:"\\[",e:"\\]",i:"$"},{cN:"pseudo",b:":(:)?[a-zA-Z0-9\\_\\-\\+\\(\\)\\\"\\']+"},{cN:"at_rule",b:"@(font-face|page)",l:"[a-z-]+",k:{"font-face":1,page:1}},{cN:"at_rule",b:"@",e:"[{;]",eE:true,k:{"import":1,page:1,media:1,charset:1},c:[a,hljs.ASM,hljs.QSM,hljs.NM]},{cN:"tag",b:hljs.IR,r:0},{cN:"rules",b:"{",e:"}",i:"[^\\s]",r:0,c:[hljs.CBLCLM,{cN:"rule",b:"[^\\s]",rB:true,e:";",eW:true,c:[{cN:"attribute",b:"[A-Z\\_\\.\\-]+",e:":",eE:true,i:"[^\\s]",starts:{cN:"value",eW:true,eE:true,c:[a,hljs.NM,hljs.QSM,hljs.ASM,hljs.CBLCLM,{cN:"hexcolor",b:"\\#[0-9A-F]+"},{cN:"important",b:"!important"}]}}]}]}]}}}();hljs.LANGUAGES.xml=function(){var b="[A-Za-z0-9\\._:-]+";var a={eW:true,c:[{cN:"attribute",b:b,r:0},{b:'="',rB:true,e:'"',c:[{cN:"value",b:'"',eW:true}]},{b:"='",rB:true,e:"'",c:[{cN:"value",b:"'",eW:true}]},{b:"=",c:[{cN:"value",b:"[^\\s/>]+"}]}]};return{cI:true,dM:{c:[{cN:"pi",b:"<\\?",e:"\\?>",r:10},{cN:"doctype",b:"",r:10,c:[{b:"\\[",e:"\\]"}]},{cN:"comment",b:"",r:10},{cN:"cdata",b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{cN:"tag",b:"",k:{title:{style:1}},c:[a],starts:{cN:"css",e:"",rE:true,sL:"css"}},{cN:"tag",b:"",k:{title:{script:1}},c:[a],starts:{cN:"javascript",e:"<\/script>",rE:true,sL:"javascript"}},{cN:"vbscript",b:"<%",e:"%>",sL:"vbscript"},{cN:"tag",b:"",c:[{cN:"title",b:"[^ />]+"},a]}]}}}();hljs.LANGUAGES.java={dM:{k:{"false":1,"synchronized":1,"int":1,"abstract":1,"float":1,"private":1,"char":1,"interface":1,"boolean":1,"static":1,"null":1,"if":1,"const":1,"for":1,"true":1,"while":1,"long":1,"throw":1,strictfp:1,"finally":1,"protected":1,"extends":1,"import":1,"native":1,"final":1,"implements":1,"return":1,"void":1,"enum":1,"else":1,"break":1,"transient":1,"new":1,"catch":1,"instanceof":1,"byte":1,"super":1,"class":1,"volatile":1,"case":1,assert:1,"short":1,"package":1,"default":1,"double":1,"public":1,"try":1,"this":1,"switch":1,"continue":1,"throws":1},c:[{cN:"javadoc",b:"/\\*\\*",e:"\\*/",c:[{cN:"javadoctag",b:"@[A-Za-z]+"}],r:10},hljs.CLCM,hljs.CBLCLM,hljs.ASM,hljs.QSM,{cN:"class",b:"(class |interface )",e:"{",k:{"class":1,"interface":1},i:":",c:[{b:"(implements|extends)",k:{"extends":1,"implements":1},r:10},{cN:"title",b:hljs.UIR}]},hljs.CNM,{cN:"annotation",b:"@[A-Za-z]+"}]}};hljs.LANGUAGES.php={cI:true,dM:{k:{and:1,include_once:1,list:1,"abstract":1,global:1,"private":1,echo:1,"interface":1,as:1,"static":1,endswitch:1,array:1,"null":1,"if":1,endwhile:1,or:1,"const":1,"for":1,endforeach:1,self:1,"var":1,"while":1,isset:1,"public":1,"protected":1,exit:1,foreach:1,"throw":1,elseif:1,"extends":1,include:1,__FILE__:1,empty:1,require_once:1,"function":1,"do":1,xor:1,"return":1,"implements":1,parent:1,clone:1,use:1,__CLASS__:1,__LINE__:1,"else":1,"break":1,print:1,"eval":1,"new":1,"catch":1,__METHOD__:1,"class":1,"case":1,exception:1,php_user_filter:1,"default":1,die:1,require:1,__FUNCTION__:1,enddeclare:1,"final":1,"try":1,"this":1,"switch":1,"continue":1,endfor:1,endif:1,declare:1,unset:1,"true":1,"false":1,namespace:1},c:[hljs.CLCM,hljs.HCM,{cN:"comment",b:"/\\*",e:"\\*/",c:[{cN:"phpdoc",b:"\\s@[A-Za-z]+",r:10}]},hljs.CNM,hljs.inherit(hljs.ASM,{i:null}),hljs.inherit(hljs.QSM,{i:null}),{cN:"variable",b:"\\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*"},{cN:"preprocessor",b:"<\\?php",r:10},{cN:"preprocessor",b:"\\?>"}]}};hljs.LANGUAGES.python=function(){var c={cN:"string",b:"(u|b)?r?'''",e:"'''",r:10};var b={cN:"string",b:'(u|b)?r?"""',e:'"""',r:10};var a={cN:"string",b:"(u|r|ur|b|br)'",e:"'",c:[hljs.BE],r:10};var f={cN:"string",b:'(u|r|ur|b|br)"',e:'"',c:[hljs.BE],r:10};var d={cN:"title",b:hljs.UIR};var e={cN:"params",b:"\\(",e:"\\)",c:[c,b,a,f,hljs.ASM,hljs.QSM]};return{dM:{k:{keyword:{and:1,elif:1,is:1,global:1,as:1,"in":1,"if":1,from:1,raise:1,"for":1,except:1,"finally":1,print:1,"import":1,pass:1,"return":1,exec:1,"else":1,"break":1,not:1,"with":1,"class":1,assert:1,yield:1,"try":1,"while":1,"continue":1,del:1,or:1,def:1,lambda:1,nonlocal:10},built_in:{None:1,True:1,False:1,Ellipsis:1,NotImplemented:1}},i:"(|\\?)",c:[hljs.HCM,c,b,a,f,hljs.ASM,hljs.QSM,{cN:"function",b:"\\bdef ",e:":",i:"$",k:{def:1},c:[d,e],r:10},{cN:"class",b:"\\bclass ",e:":",i:"[${]",k:{"class":1},c:[d,e],r:10},hljs.CNM,{cN:"decorator",b:"@",e:"$"}]}}}();hljs.LANGUAGES.perl=function(){var c={getpwent:1,getservent:1,quotemeta:1,msgrcv:1,scalar:1,kill:1,dbmclose:1,undef:1,lc:1,ma:1,syswrite:1,tr:1,send:1,umask:1,sysopen:1,shmwrite:1,vec:1,qx:1,utime:1,local:1,oct:1,semctl:1,localtime:1,readpipe:1,"do":1,"return":1,format:1,read:1,sprintf:1,dbmopen:1,pop:1,getpgrp:1,not:1,getpwnam:1,rewinddir:1,qq:1,fileno:1,qw:1,endprotoent:1,wait:1,sethostent:1,bless:1,s:1,opendir:1,"continue":1,each:1,sleep:1,endgrent:1,shutdown:1,dump:1,chomp:1,connect:1,getsockname:1,die:1,socketpair:1,close:1,flock:1,exists:1,index:1,shmget:1,sub:1,"for":1,endpwent:1,redo:1,lstat:1,msgctl:1,setpgrp:1,abs:1,exit:1,select:1,print:1,ref:1,gethostbyaddr:1,unshift:1,fcntl:1,syscall:1,"goto":1,getnetbyaddr:1,join:1,gmtime:1,symlink:1,semget:1,splice:1,x:1,getpeername:1,recv:1,log:1,setsockopt:1,cos:1,last:1,reverse:1,gethostbyname:1,getgrnam:1,study:1,formline:1,endhostent:1,times:1,chop:1,length:1,gethostent:1,getnetent:1,pack:1,getprotoent:1,getservbyname:1,rand:1,mkdir:1,pos:1,chmod:1,y:1,substr:1,endnetent:1,printf:1,next:1,open:1,msgsnd:1,readdir:1,use:1,unlink:1,getsockopt:1,getpriority:1,rindex:1,wantarray:1,hex:1,system:1,getservbyport:1,endservent:1,"int":1,chr:1,untie:1,rmdir:1,prototype:1,tell:1,listen:1,fork:1,shmread:1,ucfirst:1,setprotoent:1,"else":1,sysseek:1,link:1,getgrgid:1,shmctl:1,waitpid:1,unpack:1,getnetbyname:1,reset:1,chdir:1,grep:1,split:1,require:1,caller:1,lcfirst:1,until:1,warn:1,"while":1,values:1,shift:1,telldir:1,getpwuid:1,my:1,getprotobynumber:1,"delete":1,and:1,sort:1,uc:1,defined:1,srand:1,accept:1,"package":1,seekdir:1,getprotobyname:1,semop:1,our:1,rename:1,seek:1,"if":1,q:1,chroot:1,sysread:1,setpwent:1,no:1,crypt:1,getc:1,chown:1,sqrt:1,write:1,setnetent:1,setpriority:1,foreach:1,tie:1,sin:1,msgget:1,map:1,stat:1,getlogin:1,unless:1,elsif:1,truncate:1,exec:1,keys:1,glob:1,tied:1,closedir:1,ioctl:1,socket:1,readlink:1,"eval":1,xor:1,readline:1,binmode:1,setservent:1,eof:1,ord:1,bind:1,alarm:1,pipe:1,atan2:1,getgrent:1,exp:1,time:1,push:1,setgrent:1,gt:1,lt:1,or:1,ne:1,m:1};var d={cN:"subst",b:"[$@]\\{",e:"}",k:c,r:10};var b={cN:"variable",b:"\\$\\d"};var a={cN:"variable",b:"[\\$\\%\\@\\*](\\^\\w\\b|#\\w+(\\:\\:\\w+)*|[^\\s\\w{]|{\\w+}|\\w+(\\:\\:\\w*)*)"};var g=[hljs.BE,d,b,a];var f={b:"->",c:[{b:hljs.IR},{b:"{",e:"}"}]};var e=[b,a,hljs.HCM,{cN:"comment",b:"^(__END__|__DATA__)",e:"\\n$",r:5},f,{cN:"string",b:"q[qwxr]?\\s*\\(",e:"\\)",c:g,r:5},{cN:"string",b:"q[qwxr]?\\s*\\[",e:"\\]",c:g,r:5},{cN:"string",b:"q[qwxr]?\\s*\\{",e:"\\}",c:g,r:5},{cN:"string",b:"q[qwxr]?\\s*\\|",e:"\\|",c:g,r:5},{cN:"string",b:"q[qwxr]?\\s*\\<",e:"\\>",c:g,r:5},{cN:"string",b:"qw\\s+q",e:"q",c:g,r:5},{cN:"string",b:"'",e:"'",c:[hljs.BE],r:0},{cN:"string",b:'"',e:'"',c:g,r:0},{cN:"string",b:"`",e:"`",c:[hljs.BE]},{cN:"string",b:"{\\w+}",r:0},{cN:"string",b:"-?\\w+\\s*\\=\\>",r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{cN:"regexp",b:"(s|tr|y)/(\\\\.|[^/])*/(\\\\.|[^/])*/[a-z]*",r:10},{cN:"regexp",b:"(m|qr)?/",e:"/[a-z]*",c:[hljs.BE],r:0},{cN:"sub",b:"\\bsub\\b",e:"(\\s*\\(.*?\\))?[;{]",k:{sub:1},r:5},{cN:"operator",b:"-\\w\\b",r:0},{cN:"pod",b:"\\=\\w",e:"\\=cut"}];d.c=e;f.c[1].c=e;return{dM:{k:c,c:e}}}();hljs.LANGUAGES.cpp=function(){var b={keyword:{"false":1,"int":1,"float":1,"while":1,"private":1,"char":1,"catch":1,"export":1,virtual:1,operator:2,sizeof:2,dynamic_cast:2,typedef:2,const_cast:2,"const":1,struct:1,"for":1,static_cast:2,union:1,namespace:1,unsigned:1,"long":1,"throw":1,"volatile":2,"static":1,"protected":1,bool:1,template:1,mutable:1,"if":1,"public":1,friend:2,"do":1,"return":1,"goto":1,auto:1,"void":2,"enum":1,"else":1,"break":1,"new":1,extern:1,using:1,"true":1,"class":1,asm:1,"case":1,typeid:1,"short":1,reinterpret_cast:2,"default":1,"double":1,register:1,explicit:1,signed:1,typename:1,"try":1,"this":1,"switch":1,"continue":1,wchar_t:1,inline:1,"delete":1,alignof:1,char16_t:1,char32_t:1,constexpr:1,decltype:1,noexcept:1,nullptr:1,static_assert:1,thread_local:1},built_in:{std:1,string:1,cin:1,cout:1,cerr:1,clog:1,stringstream:1,istringstream:1,ostringstream:1,auto_ptr:1,deque:1,list:1,queue:1,stack:1,vector:1,map:1,set:1,bitset:1,multiset:1,multimap:1,unordered_set:1,unordered_map:1,unordered_multiset:1,unordered_multimap:1,array:1,shared_ptr:1}};var a={cN:"stl_container",b:"\\b(deque|list|queue|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array)\\s*<",e:">",k:b,r:10};a.c=[a];return{dM:{k:b,i:" 0 ) { + text = text.replace( new RegExp('\\n?\\t{' + leadingTabs + '}','g'), '\n' ); + } + else if( leadingWs > 1 ) { + text = text.replace( new RegExp('\\n? {' + leadingWs + '}','g'), '\n' ); + } + + section.innerHTML = (new Showdown.converter()).makeHtml(text); + } + +})(); \ No newline at end of file diff --git a/plugin/markdown/showdown.js b/plugin/markdown/showdown.js new file mode 100644 index 0000000..3f280f4 --- /dev/null +++ b/plugin/markdown/showdown.js @@ -0,0 +1,62 @@ +// +// showdown.js -- A javascript port of Markdown. +// +// Copyright (c) 2007 John Fraser. +// +// Original Markdown Copyright (c) 2004-2005 John Gruber +// +// +// Redistributable under a BSD-style open source license. +// See license.txt for more information. +// +// The full source distribution is at: +// +// A A L +// T C A +// T K B +// +// +// +// +// Wherever possible, Showdown is a straight, line-by-line port +// of the Perl version of Markdown. +// +// This is not a normal parser design; it's basically just a +// series of string substitutions. It's hard to read and +// maintain this way, but keeping Showdown close to the original +// design makes it easier to port new features. +// +// More importantly, Showdown behaves like markdown.pl in most +// edge cases. So web applications can do client-side preview +// in Javascript, and then build identical HTML on the server. +// +// This port needs the new RegExp functionality of ECMA 262, +// 3rd Edition (i.e. Javascript 1.5). Most modern web browsers +// should do fine. Even with the new regular expression features, +// We do a lot of work to emulate Perl's regex functionality. +// The tricky changes in this file mostly have the "attacklab:" +// label. Major or self-explanatory changes don't. +// +// Smart diff tools like Araxis Merge will be able to match up +// this file with markdown.pl in a useful way. A little tweaking +// helps: in a copy of markdown.pl, replace "#" with "//" and +// replace "$text" with "text". Be sure to ignore whitespace +// and line endings. +// +// +// Showdown usage: +// +// var text = "Markdown *rocks*."; +// +// var converter = new Showdown.converter(); +// var html = converter.makeHtml(text); +// +// alert(html); +// +// Note: move the sample code to the bottom of this +// file before uncommenting it. +// +// +// Showdown namespace +// +var Showdown={};Showdown.converter=function(){var a,b,c,d=0;this.makeHtml=function(d){return a=new Array,b=new Array,c=new Array,d=d.replace(/~/g,"~T"),d=d.replace(/\$/g,"~D"),d=d.replace(/\r\n/g,"\n"),d=d.replace(/\r/g,"\n"),d="\n\n"+d+"\n\n",d=F(d),d=d.replace(/^[ \t]+$/mg,""),d=f(d),d=e(d),d=h(d),d=D(d),d=d.replace(/~D/g,"$$"),d=d.replace(/~T/g,"~"),d};var e=function(c){var c=c.replace(/^[ ]{0,3}\[(.+)\]:[ \t]*\n?[ \t]*?[ \t]*\n?[ \t]*(?:(\n*)["(](.+?)[")][ \t]*)?(?:\n+|\Z)/gm,function(c,d,e,f,g){return d=d.toLowerCase(),a[d]=z(e),f?f+g:(g&&(b[d]=g.replace(/"/g,""")),"")});return c},f=function(a){a=a.replace(/\n/g,"\n\n");var b="p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|ins|del",c="p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math";return a=a.replace(/^(<(p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|ins|del)\b[^\r]*?\n<\/\2>[ \t]*(?=\n+))/gm,g),a=a.replace(/^(<(p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math)\b[^\r]*?.*<\/\2>[ \t]*(?=\n+)\n)/gm,g),a=a.replace(/(\n[ ]{0,3}(<(hr)\b([^<>])*?\/?>)[ \t]*(?=\n{2,}))/g,g),a=a.replace(/(\n\n[ ]{0,3}[ \t]*(?=\n{2,}))/g,g),a=a.replace(/(?:\n\n)([ ]{0,3}(?:<([?%])[^\r]*?\2>)[ \t]*(?=\n{2,}))/g,g),a=a.replace(/\n\n/g,"\n"),a},g=function(a,b){var d=b;return d=d.replace(/\n\n/g,"\n"),d=d.replace(/^\n/,""),d=d.replace(/\n+$/g,""),d="\n\n~K"+(c.push(d)-1)+"K\n\n",d},h=function(a){a=o(a);var b=t("
");return a=a.replace(/^[ ]{0,2}([ ]?\*[ ]?){3,}[ \t]*$/gm,b),a=a.replace(/^[ ]{0,2}([ ]?\-[ ]?){3,}[ \t]*$/gm,b),a=a.replace(/^[ ]{0,2}([ ]?\_[ ]?){3,}[ \t]*$/gm,b),a=q(a),a=s(a),a=r(a),a=x(a),a=f(a),a=y(a),a},i=function(a){return a=u(a),a=j(a),a=A(a),a=m(a),a=k(a),a=B(a),a=z(a),a=w(a),a=a.replace(/ +\n/g,"
\n"),a},j=function(a){var b=/(<[a-z\/!$]("[^"]*"|'[^']*'|[^'">])*>|)/gi;return a=a.replace(b,function(a){var b=a.replace(/(.)<\/?code>(?=.)/g,"$1`");return b=G(b,"\\`*_"),b}),a},k=function(a){return a=a.replace(/(\[((?:\[[^\]]*\]|[^\[\]])*)\][ ]?(?:\n[ ]*)?\[(.*?)\])()()()()/g,l),a=a.replace(/(\[((?:\[[^\]]*\]|[^\[\]])*)\]\([ \t]*()?[ \t]*((['"])(.*?)\6[ \t]*)?\))/g,l),a=a.replace(/(\[([^\[\]]+)\])()()()()()/g,l),a},l=function(c,d,e,f,g,h,i,j){j==undefined&&(j="");var k=d,l=e,m=f.toLowerCase(),n=g,o=j;if(n==""){m==""&&(m=l.toLowerCase().replace(/ ?\n/g," ")),n="#"+m;if(a[m]!=undefined)n=a[m],b[m]!=undefined&&(o=b[m]);else{if(!(k.search(/\(\s*\)$/m)>-1))return k;n=""}}n=G(n,"*_");var p='",p},m=function(a){return a=a.replace(/(!\[(.*?)\][ ]?(?:\n[ ]*)?\[(.*?)\])()()()()/g,n),a=a.replace(/(!\[(.*?)\]\s?\([ \t]*()?[ \t]*((['"])(.*?)\6[ \t]*)?\))/g,n),a},n=function(c,d,e,f,g,h,i,j){var k=d,l=e,m=f.toLowerCase(),n=g,o=j;o||(o="");if(n==""){m==""&&(m=l.toLowerCase().replace(/ ?\n/g," ")),n="#"+m;if(a[m]==undefined)return k;n=a[m],b[m]!=undefined&&(o=b[m])}l=l.replace(/"/g,"""),n=G(n,"*_");var p=''+l+''+i(c)+"")}),a=a.replace(/^(.+)[ \t]*\n-+[ \t]*\n+/gm,function(a,c){return t('

'+i(c)+"

")}),a=a.replace(/^(\#{1,6})[ \t]*(.+?)[ \t]*\#*\n+/gm,function(a,c,d){var e=c.length;return t("'+i(d)+"")}),a},p,q=function(a){a+="~0";var b=/^(([ ]{0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(~0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/gm;return d?a=a.replace(b,function(a,b,c){var d=b,e=c.search(/[*+-]/g)>-1?"ul":"ol";d=d.replace(/\n{2,}/g,"\n\n\n");var f=p(d);return f=f.replace(/\s+$/,""),f="<"+e+">"+f+"\n",f}):(b=/(\n\n|^\n?)(([ ]{0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(~0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/g,a=a.replace(b,function(a,b,c,d){var e=b,f=c,g=d.search(/[*+-]/g)>-1?"ul":"ol",f=f.replace(/\n{2,}/g,"\n\n\n"),h=p(f);return h=e+"<"+g+">\n"+h+"\n",h})),a=a.replace(/~0/,""),a};p=function(a){return d++,a=a.replace(/\n{2,}$/,"\n"),a+="~0",a=a.replace(/(\n)?(^[ \t]*)([*+-]|\d+[.])[ \t]+([^\r]+?(\n{1,2}))(?=\n*(~0|\2([*+-]|\d+[.])[ \t]+))/gm,function(a,b,c,d,e){var f=e,g=b,j=c;return g||f.search(/\n{2,}/)>-1?f=h(E(f)):(f=q(E(f)),f=f.replace(/\n$/,""),f=i(f)),"
  • "+f+"
  • \n"}),a=a.replace(/~0/g,""),d--,a};var r=function(a){return a+="~0",a=a.replace(/(?:\n\n|^)((?:(?:[ ]{4}|\t).*\n+)+)(\n*[ ]{0,3}[^ \t\n]|(?=~0))/g,function(a,b,c){var d=b,e=c;return d=v(E(d)),d=F(d),d=d.replace(/^\n+/g,""),d=d.replace(/\n+$/g,""),d="
    "+d+"\n
    ",t(d)+e}),a=a.replace(/~0/,""),a},s=function(a){return a+="~0",a=a.replace(/\n```(.*)\n([^`]+)\n```/g,function(a,b,c){var d=b,e=c;return e=v(e),e=F(e),e=e.replace(/^\n+/g,""),e=e.replace(/\n+$/g,""),e="
    "+e+"\n
    ",t(e)}),a=a.replace(/~0/,""),a},t=function(a){return a=a.replace(/(^\n+|\n+$)/g,""),"\n\n~K"+(c.push(a)-1)+"K\n\n"},u=function(a){return a=a.replace(/(^|[^\\])(`+)([^\r]*?[^`])\2(?!`)/gm,function(a,b,c,d,e){var f=d;return f=f.replace(/^([ \t]*)/g,""),f=f.replace(/[ \t]*$/g,""),f=v(f),b+""+f+""}),a},v=function(a){return a=a.replace(/&/g,"&"),a=a.replace(//g,">"),a=G(a,"*_{}[]\\",!1),a},w=function(a){return a=a.replace(/(\*\*|__)(?=\S)([^\r]*?\S[*_]*)\1/g,"$2"),a=a.replace(/(\*|_)(?=\S)([^\r]*?\S)\1/g,"$2"),a},x=function(a){return a=a.replace(/((^[ \t]*>[ \t]?.+\n(.+\n)*\n*)+)/gm,function(a,b){var c=b;return c=c.replace(/^[ \t]*>[ \t]?/gm,"~0"),c=c.replace(/~0/g,""),c=c.replace(/^[ \t]+$/gm,""),c=h(c),c=c.replace(/(^|\n)/g,"$1 "),c=c.replace(/(\s*
    [^\r]+?<\/pre>)/gm,function(a,b){var c=b;return c=c.replace(/^  /mg,"~0"),c=c.replace(/~0/g,""),c}),t("
    \n"+c+"\n
    ")}),a},y=function(a){a=a.replace(/^\n+/g,""),a=a.replace(/\n+$/g,"");var b=a.split(/\n{2,}/g),d=new Array,e=b.length;for(var f=0;f=0?d.push(g):g.search(/\S/)>=0&&(g=i(g),g=g.replace(/^([ \t]*)/g,"

    "),g+="

    ",d.push(g))}e=d.length;for(var f=0;f=0){var h=c[RegExp.$1];h=h.replace(/\$/g,"$$$$"),d[f]=d[f].replace(/~K\d+K/,h)}return d.join("\n\n")},z=function(a){return a=a.replace(/&(?!#?[xX]?(?:[0-9a-fA-F]+|\w+);)/g,"&"),a=a.replace(/<(?![a-z\/?\$!])/gi,"<"),a},A=function(a){return a=a.replace(/\\(\\)/g,H),a=a.replace(/\\([`*_{}\[\]()>#+-.!])/g,H),a},B=function(a){return a=a.replace(/<((https?|ftp|dict):[^'">\s]+)>/gi,'
    $1'),a=a.replace(/<(?:mailto:)?([-.\w]+\@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+)>/gi,function(a,b){return C(D(b))}),a},C=function(a){function b(a){var b="0123456789ABCDEF",c=a.charCodeAt(0);return b.charAt(c>>4)+b.charAt(c&15)}var c=[function(a){return"&#"+a.charCodeAt(0)+";"},function(a){return"&#x"+b(a)+";"},function(a){return a}];return a="mailto:"+a,a=a.replace(/./g,function(a){if(a=="@")a=c[Math.floor(Math.random()*2)](a);else if(a!=":"){var b=Math.random();a=b>.9?c[2](a):b>.45?c[1](a):c[0](a)}return a}),a=''+a+"",a=a.replace(/">.+:/g,'">'),a},D=function(a){return a=a.replace(/~E(\d+)E/g,function(a,b){var c=parseInt(b);return String.fromCharCode(c)}),a},E=function(a){return a=a.replace(/^(\t|[ ]{1,4})/gm,"~0"),a=a.replace(/~0/g,""),a},F=function(a){return a=a.replace(/\t(?=\t)/g," "),a=a.replace(/\t/g,"~A~B"),a=a.replace(/~B(.+?)~A/g,function(a,b,c){var d=b,e=4-d.length%4;for(var f=0;f