Commits

Anonymous committed c8bba45

Initial commit

  • Participants

Comments (0)

Files changed (73)

File MIT-license.txt

+The MIT License
+
+Copyright (c) 2011 Caleb Troughton
+
+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.

File atlassian.css

+@charset "UTF-8";
+p.note {
+  text-align: right;
+  font-style: italic;
+}
+
+.deck-container {
+  font-family: 'PT Sans';
+  font-size: 1.5em;
+  background-image: url('images/atlassian_logo.svg');
+  background-position: 0px 0px;
+  background-repeat: no-repeat;
+  background-attachment: fixed;
+  background-position: 10px 10px;
+  background-size: 12%;
+}
+.deck-container > .slide {
+  text-shadow: 1px 1px 1px rgba(255, 255, 255, 0.5);
+}
+.deck-container .slide h1, .deck-container .slide h2, .deck-container .slide h3, .deck-container .slide h4, .deck-container .slide h5, .deck-container .slide h6 {
+  font-family: 'PT Sans Narrow';
+}
+.deck-container .slide h1 {
+  color: #08455f;
+}
+.deck-container .slide h2 {
+  color: #0b7495;
+  border-bottom: 0;
+}
+.cssreflections .deck-container .slide h1, .cssreflections .deck-container .slide h2 {
+  line-height: 1;
+  -webkit-box-reflect: below -.4em -webkit-gradient(linear, left top, left bottom, from(transparent), color-stop(0.3, transparent), color-stop(0.7, rgba(255, 255, 255, 0.1)), to(transparent));
+  -moz-box-reflect: below -.4em -moz-linear-gradient(top, transparent 0%, transparent 30%, rgba(255, 255, 255, 0.3) 100%);
+}
+.deck-container .slide h3 {
+  color: #000;
+}
+.deck-container .slide p {
+  margin-bottom: 0.5em;
+}
+.deck-container .slide pre {
+  border-color: #cde;
+  background: #fff;
+  position: relative;
+  z-index: auto;
+  /* http://nicolasgallagher.com/css-drop-shadows-without-images/ */
+}
+.deck-container .slide code, .deck-container .slide pre {
+  font-size: 0.9em;
+  font-family: 'Ubuntu Mono';
+}
+.borderradius .deck-container .slide pre {
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+  border-radius: 5px;
+}
+.csstransforms.boxshadow .deck-container .slide pre > :first-child:before {
+  content: "";
+  position: absolute;
+  z-index: -1;
+  background: #fff;
+  top: 0;
+  bottom: 0;
+  left: 0;
+  right: 0;
+}
+.csstransforms.boxshadow .deck-container .slide pre:before, .csstransforms.boxshadow .deck-container .slide pre:after {
+  content: "";
+  position: absolute;
+  z-index: -2;
+  bottom: 15px;
+  width: 50%;
+  height: 20%;
+  max-width: 300px;
+  -webkit-box-shadow: 0 15px 10px rgba(0, 0, 0, 0.7);
+  -moz-box-shadow: 0 15px 10px rgba(0, 0, 0, 0.7);
+  box-shadow: 0 15px 10px rgba(0, 0, 0, 0.7);
+}
+.csstransforms.boxshadow .deck-container .slide pre:before {
+  left: 10px;
+  -webkit-transform: rotate(-3deg);
+  -moz-transform: rotate(-3deg);
+  -ms-transform: rotate(-3deg);
+  -o-transform: rotate(-3deg);
+  transform: rotate(-3deg);
+}
+.csstransforms.boxshadow .deck-container .slide pre:after {
+  right: 10px;
+  -webkit-transform: rotate(3deg);
+  -moz-transform: rotate(3deg);
+  -ms-transform: rotate(3deg);
+  -o-transform: rotate(3deg);
+  transform: rotate(3deg);
+}
+.deck-container .slide code {
+  color: #789;
+}
+.deck-container .slide blockquote {
+  font-family: 'PT Sans';
+  font-size: 1.5em;
+  padding: 1em 2em .5em 2em;
+  color: #000;
+  background: #fff;
+  position: relative;
+  border: 1px solid #cde;
+  z-index: auto;
+}
+.borderradius .deck-container .slide blockquote {
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+  border-radius: 5px;
+}
+.boxshadow .deck-container .slide blockquote > :first-child:before {
+  content: "";
+  position: absolute;
+  z-index: -1;
+  background: #fff;
+  top: 0;
+  bottom: 0;
+  left: 0;
+  right: 0;
+}
+.boxshadow .deck-container .slide blockquote:after {
+  content: "";
+  position: absolute;
+  z-index: -2;
+  top: 10px;
+  bottom: 10px;
+  left: 0;
+  right: 50%;
+  -moz-border-radius: 10px/100px;
+  border-radius: 10px/100px;
+  -webkit-box-shadow: 0 0 15px rgba(0, 0, 0, 0.6);
+  -moz-box-shadow: 0 0 15px rgba(0, 0, 0, 0.6);
+  box-shadow: 0 0 15px rgba(0, 0, 0, 0.6);
+}
+.deck-container .slide blockquote cite {
+  font-size: .7em;
+  font-style: normal;
+  font-weight: bold;
+  color: #888;
+}
+.deck-container .slide blockquote:before {
+  content: "“";
+  position: absolute;
+  top: 0;
+  left: 0;
+  font-size: 5em;
+  line-height: 1;
+  color: #ccf0f0;
+  z-index: 1;
+}
+.deck-container .slide ::-moz-selection {
+  background: #08455f;
+  color: #fff;
+}
+.deck-container .slide ::selection {
+  background: #08455f;
+  color: #fff;
+}
+.deck-container .slide a, .deck-container .slide a:hover, .deck-container .slide a:focus, .deck-container .slide a:active, .deck-container .slide a:visited {
+  color: #599;
+  text-decoration: none;
+}
+.deck-container .slide a:hover, .deck-container .slide a:focus {
+  text-decoration: underline;
+}
+.deck-container .deck-prev-link, .deck-container .deck-next-link {
+  background: #fff;
+  opacity: 0.5;
+}
+.deck-container .deck-prev-link, .deck-container .deck-prev-link:hover, .deck-container .deck-prev-link:focus, .deck-container .deck-prev-link:active, .deck-container .deck-prev-link:visited, .deck-container .deck-next-link, .deck-container .deck-next-link:hover, .deck-container .deck-next-link:focus, .deck-container .deck-next-link:active, .deck-container .deck-next-link:visited {
+  color: #599;
+}
+.deck-container .deck-prev-link:hover, .deck-container .deck-prev-link:focus, .deck-container .deck-next-link:hover, .deck-container .deck-next-link:focus {
+  opacity: 1;
+  text-decoration: none;
+}
+.deck-container .deck-status {
+  font-size: 0.6666em;
+}
+.deck-container.deck-menu .slide {
+  background: transparent;
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+  border-radius: 5px;
+}
+.rgba .deck-container.deck-menu .slide {
+  background: rgba(0, 0, 0, 0.1);
+}
+.deck-container.deck-menu .slide.deck-current, .rgba .deck-container.deck-menu .slide.deck-current, .no-touch .deck-container.deck-menu .slide:hover {
+  background: #fff;
+}
+.deck-container .goto-form {
+  background: #fff;
+  border: 1px solid #cde;
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+  border-radius: 5px;
+}
+.boxshadow .deck-container .goto-form {
+  -webkit-box-shadow: 0 15px 10px -10px rgba(0, 0, 0, 0.5), 0 1px 4px rgba(0, 0, 0, 0.3), 0 0 40px rgba(0, 0, 0, 0.1) inset;
+  -moz-box-shadow: 0 15px 10px -10px rgba(0, 0, 0, 0.5), 0 1px 4px rgba(0, 0, 0, 0.3), 0 0 40px rgba(0, 0, 0, 0.1) inset;
+  box-shadow: 0 15px 10px -10px rgba(0, 0, 0, 0.5), 0 1px 4px rgba(0, 0, 0, 0.3), 0 0 40px rgba(0, 0, 0, 0.1) inset;
+}

File core/deck.core.css

+html {
+  height: 100%;
+}
+
+.deck-container {
+  position: relative;
+  height: 100%;
+  width: 70%;
+  margin: 0 auto;
+  padding: 0 48px;
+  font-size: 16px;
+  line-height: 1.25;
+  overflow: hidden;
+  /* Resets and base styles from HTML5 Boilerplate */
+  /* End HTML5 Boilerplate adaptations */
+}
+.js .deck-container {
+  visibility: hidden;
+}
+.ready .deck-container {
+  visibility: visible;
+}
+.touch .deck-container {
+  -webkit-text-size-adjust: none;
+}
+.deck-container div, .deck-container span, .deck-container object, .deck-container iframe,
+.deck-container h1, .deck-container h2, .deck-container h3, .deck-container h4, .deck-container h5, .deck-container h6, .deck-container p, .deck-container blockquote, .deck-container pre,
+.deck-container abbr, .deck-container address, .deck-container cite, .deck-container code, .deck-container del, .deck-container dfn, .deck-container em, .deck-container img, .deck-container ins, .deck-container kbd, .deck-container q, .deck-container samp,
+.deck-container small, .deck-container strong, .deck-container sub, .deck-container sup, .deck-container var, .deck-container b, .deck-container i, .deck-container dl, .deck-container dt, .deck-container dd, .deck-container ol, .deck-container ul, .deck-container li,
+.deck-container fieldset, .deck-container form, .deck-container label, .deck-container legend,
+.deck-container table, .deck-container caption, .deck-container tbody, .deck-container tfoot, .deck-container thead, .deck-container tr, .deck-container th, .deck-container td,
+.deck-container article, .deck-container aside, .deck-container canvas, .deck-container details, .deck-container figcaption, .deck-container figure,
+.deck-container footer, .deck-container header, .deck-container hgroup, .deck-container menu, .deck-container nav, .deck-container section, .deck-container summary,
+.deck-container time, .deck-container mark, .deck-container audio, .deck-container video {
+  margin: 0;
+  padding: 0;
+  border: 0;
+  font-size: 100%;
+  font: inherit;
+  vertical-align: baseline;
+}
+.deck-container article, .deck-container aside, .deck-container details, .deck-container figcaption, .deck-container figure,
+.deck-container footer, .deck-container header, .deck-container hgroup, .deck-container menu, .deck-container nav, .deck-container section {
+  display: block;
+}
+.deck-container blockquote, .deck-container q {
+  quotes: none;
+}
+.deck-container blockquote:before, .deck-container blockquote:after, .deck-container q:before, .deck-container q:after {
+  content: "";
+  content: none;
+}
+.deck-container ins {
+  background-color: #ff9;
+  color: #000;
+  text-decoration: none;
+}
+.deck-container mark {
+  background-color: #ff9;
+  color: #000;
+  font-style: italic;
+  font-weight: bold;
+}
+.deck-container del {
+  text-decoration: line-through;
+}
+.deck-container abbr[title], .deck-container dfn[title] {
+  border-bottom: 1px dotted;
+  cursor: help;
+}
+.deck-container table {
+  border-collapse: collapse;
+  border-spacing: 0;
+}
+.deck-container hr {
+  display: block;
+  height: 1px;
+  border: 0;
+  border-top: 1px solid #ccc;
+  margin: 1em 0;
+  padding: 0;
+}
+.deck-container input, .deck-container select {
+  vertical-align: middle;
+}
+.deck-container select, .deck-container input, .deck-container textarea, .deck-container button {
+  font: 99% sans-serif;
+}
+.deck-container pre, .deck-container code, .deck-container kbd, .deck-container samp {
+  font-family: monospace, sans-serif;
+}
+.deck-container a {
+  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+}
+.deck-container a:hover, .deck-container a:active {
+  outline: none;
+}
+.deck-container ul, .deck-container ol {
+  margin-left: 2em;
+  vertical-align: top;
+}
+.deck-container ol {
+  list-style-type: decimal;
+}
+.deck-container nav ul, .deck-container nav li {
+  margin: 0;
+  list-style: none;
+  list-style-image: none;
+}
+.deck-container small {
+  font-size: 85%;
+}
+.deck-container strong, .deck-container th {
+  font-weight: bold;
+}
+.deck-container td {
+  vertical-align: top;
+}
+.deck-container sub, .deck-container sup {
+  font-size: 75%;
+  line-height: 0;
+  position: relative;
+}
+.deck-container sup {
+  top: -0.5em;
+}
+.deck-container sub {
+  bottom: -0.25em;
+}
+.deck-container textarea {
+  overflow: auto;
+}
+.ie6 .deck-container legend, .ie7 .deck-container legend {
+  margin-left: -7px;
+}
+.deck-container input[type="radio"] {
+  vertical-align: text-bottom;
+}
+.deck-container input[type="checkbox"] {
+  vertical-align: bottom;
+}
+.ie7 .deck-container input[type="checkbox"] {
+  vertical-align: baseline;
+}
+.ie6 .deck-container input {
+  vertical-align: text-bottom;
+}
+.deck-container label, .deck-container input[type="button"], .deck-container input[type="submit"], .deck-container input[type="image"], .deck-container button {
+  cursor: pointer;
+}
+.deck-container button, .deck-container input, .deck-container select, .deck-container textarea {
+  margin: 0;
+}
+.deck-container input:invalid, .deck-container textarea:invalid {
+  border-radius: 1px;
+  -moz-box-shadow: 0px 0px 5px red;
+  -webkit-box-shadow: 0px 0px 5px red;
+  box-shadow: 0px 0px 5px red;
+}
+.deck-container input:invalid .no-boxshadow, .deck-container textarea:invalid .no-boxshadow {
+  background-color: #f0dddd;
+}
+.deck-container button {
+  width: auto;
+  overflow: visible;
+}
+.ie7 .deck-container img {
+  -ms-interpolation-mode: bicubic;
+}
+.deck-container, .deck-container select, .deck-container input, .deck-container textarea {
+  color: #444;
+}
+.deck-container a {
+  color: #607890;
+}
+.deck-container a:hover, .deck-container a:focus {
+  color: #036;
+}
+.deck-container a:link {
+  -webkit-tap-highlight-color: #fff;
+}
+.deck-container.deck-loading {
+  display: none;
+}
+
+.slide {
+  width: auto;
+  min-height: 100%;
+  position: relative;
+}
+.slide h1 {
+  font-size: 4.5em;
+}
+.slide h1, .slide .vcenter {
+  font-weight: bold;
+  text-align: center;
+  padding-top: 1em;
+  max-height: 100%;
+}
+.csstransforms .slide h1, .csstransforms .slide .vcenter {
+  padding: 0 48px;
+  position: absolute;
+  left: 0;
+  right: 0;
+  top: 50%;
+  -webkit-transform: translate(0, -50%);
+  -moz-transform: translate(0, -50%);
+  -ms-transform: translate(0, -50%);
+  -o-transform: translate(0, -50%);
+  transform: translate(0, -50%);
+}
+.slide .vcenter h1 {
+  position: relative;
+  top: auto;
+  padding: 0;
+  -webkit-transform: none;
+  -moz-transform: none;
+  -ms-transform: none;
+  -o-transform: none;
+  transform: none;
+}
+.slide h2 {
+  font-size: 2.25em;
+  font-weight: bold;
+  padding-top: .5em;
+  margin: 0 0 .66666em 0;
+  border-bottom: 3px solid #888;
+}
+.slide h3 {
+  font-size: 1.4375em;
+  font-weight: bold;
+  margin-bottom: .30435em;
+}
+.slide h4 {
+  font-size: 1.25em;
+  font-weight: bold;
+  margin-bottom: .25em;
+}
+.slide h5 {
+  font-size: 1.125em;
+  font-weight: bold;
+  margin-bottom: .2222em;
+}
+.slide h6 {
+  font-size: 1em;
+  font-weight: bold;
+}
+.slide img, .slide iframe, .slide video {
+  display: block;
+  max-width: 100%;
+}
+.slide video, .slide iframe, .slide img {
+  display: block;
+  margin: 0 auto;
+}
+.slide p, .slide blockquote, .slide iframe, .slide img, .slide ul, .slide ol, .slide pre, .slide video {
+  margin-bottom: 1em;
+}
+.slide pre {
+  white-space: pre;
+  white-space: pre-wrap;
+  word-wrap: break-word;
+  padding: 1em;
+  border: 1px solid #888;
+}
+.slide em {
+  font-style: italic;
+}
+.slide li {
+  padding: .25em 0;
+  vertical-align: middle;
+}
+
+.deck-before, .deck-previous, .deck-next, .deck-after {
+  position: absolute;
+  left: -999em;
+  top: -999em;
+}
+
+.deck-current {
+  z-index: 2;
+}
+
+.slide .slide {
+  visibility: hidden;
+  position: static;
+  min-height: 0;
+}
+
+.deck-child-current {
+  position: static;
+  z-index: 2;
+}
+.deck-child-current .slide {
+  visibility: hidden;
+}
+.deck-child-current .deck-previous, .deck-child-current .deck-before, .deck-child-current .deck-current {
+  visibility: visible;
+}
+
+body.deck-container {
+  overflow: visible;
+}
+
+@media screen and (max-device-width: 480px) {
+  /* html { -webkit-text-size-adjust:none; -ms-text-size-adjust:none; } */
+}
+@media print {
+  * {
+    background: transparent !important;
+    color: black !important;
+    text-shadow: none !important;
+    filter: none !important;
+    -ms-filter: none !important;
+    -webkit-box-reflect: none !important;
+    -moz-box-reflect: none !important;
+    -webkit-box-shadow: none !important;
+    -moz-box-shadow: none !important;
+    box-shadow: none !important;
+  }
+  * :before, * :after {
+    display: none !important;
+  }
+
+  a, a:visited {
+    color: #444 !important;
+    text-decoration: underline;
+  }
+
+  a[href]:after {
+    content: " (" attr(href) ")";
+  }
+
+  abbr[title]:after {
+    content: " (" attr(title) ")";
+  }
+
+  .ir a:after, a[href^="javascript:"]:after, a[href^="#"]:after {
+    content: "";
+  }
+
+  pre, blockquote {
+    border: 1px solid #999;
+    page-break-inside: avoid;
+  }
+
+  thead {
+    display: table-header-group;
+  }
+
+  tr, img {
+    page-break-inside: avoid;
+  }
+
+  @page {
+    margin: 0.5cm;
+}
+
+  p, h2, h3 {
+    orphans: 3;
+    widows: 3;
+  }
+
+  h2, h3 {
+    page-break-after: avoid;
+  }
+
+  .slide {
+    position: static !important;
+    visibility: visible !important;
+    display: block !important;
+    -webkit-transform: none !important;
+    -moz-transform: none !important;
+    -o-transform: none !important;
+    -ms-transform: none !important;
+    transform: none !important;
+    opacity: 1 !important;
+  }
+
+  h1, .vcenter {
+    -webkit-transform: none !important;
+    -moz-transform: none !important;
+    -o-transform: none !important;
+    -ms-transform: none !important;
+    transform: none !important;
+    padding: 0 !important;
+    position: static !important;
+  }
+
+  .deck-container > .slide {
+    page-break-after: always;
+  }
+
+  .deck-container {
+    width: 100% !important;
+    height: auto !important;
+    padding: 0 !important;
+    display: block !important;
+  }
+
+  script {
+    display: none;
+  }
+}

File core/deck.core.html

+<!DOCTYPE html>
+<html>
+<head>
+	<meta charset="utf-8">
+	<title>Deck Skeleton</title>
+	<meta name="viewport" content="width=1024, user-scalable=no">
+	
+	<!-- Replace path with correct path to deck.core.css. -->
+	<link rel="stylesheet" href="/PATH/TO/CSS/deck.core.css" type="text/css">
+	
+	<!-- Any other extension CSS files go here. -->
+	
+	<!-- Replace path with correct path to Modernizr file. -->
+	<script src="/PATH/TO/JS/modernizr.custom.js"></script>
+</head>
+<body class="deck-container">
+
+<!-- Create any number of elements with class slide within the container -->
+<section class="slide">
+	<!-- Slide content HTML goes here! -->
+</section>
+	
+<!-- Other extension HTML snippets go here, at the bottom of the deck container. -->
+
+<!-- Update these paths to point to the correct files. -->
+<script src="/PATH/TO/JS/jquery.min.js"></script>
+<script src="/PATH/TO/JS/deck.core.js"></script>
+
+<!-- Add any other extension JS files here -->
+
+
+<!-- Initialize the deck. You can put this in an external file if desired. -->
+<script>
+	$(function() {
+		$.deck('.slide');
+	});
+</script>
+</body>
+</html>

File core/deck.core.js

+/*!
+Deck JS - deck.core
+Copyright (c) 2011 Caleb Troughton
+Dual licensed under the MIT license and GPL license.
+https://github.com/imakewebthings/deck.js/blob/master/MIT-license.txt
+https://github.com/imakewebthings/deck.js/blob/master/GPL-license.txt
+*/
+
+/*
+The deck.core module provides all the basic functionality for creating and
+moving through a deck.  It does so by applying classes to indicate the state of
+the deck and its slides, allowing CSS to take care of the visual representation
+of each state.  It also provides methods for navigating the deck and inspecting
+its state, as well as basic key bindings for going to the next and previous
+slides.  More functionality is provided by wholly separate extension modules
+that use the API provided by core.
+*/
+(function($, deck, document, undefined) {
+	var slides, // Array of all the uh, slides...
+	current, // Array index of the current slide
+	$container, // Keeping this cached
+	
+	events = {
+		/*
+		This event fires whenever the current slide changes, whether by way of
+		next, prev, or go. The callback function is passed two parameters, from
+		and to, equal to the indices of the old slide and the new slide
+		respectively. If preventDefault is called on the event within this handler
+		the slide change does not occur.
+		
+		$(document).bind('deck.change', function(event, from, to) {
+		   alert('Moving from slide ' + from + ' to ' + to);
+		});
+		*/
+		change: 'deck.change',
+		
+		/*
+		This event fires at the beginning of deck initialization, after the options
+		are set but before the slides array is created.  This event makes a good hook
+		for preprocessing extensions looking to modify the deck.
+		*/
+		beforeInitialize: 'deck.beforeInit',
+		
+		/*
+		This event fires at the end of deck initialization. Extensions should
+		implement any code that relies on user extensible options (key bindings,
+		element selectors, classes) within a handler for this event. Native
+		events associated with Deck JS should be scoped under a .deck event
+		namespace, as with the example below:
+		
+		var $d = $(document);
+		$.deck.defaults.keys.myExtensionKeycode = 70; // 'h'
+		$d.bind('deck.init', function() {
+		   $d.bind('keydown.deck', function(event) {
+		      if (event.which === $.deck.getOptions().keys.myExtensionKeycode) {
+		         // Rock out
+		      }
+		   });
+		});
+		*/
+		initialize: 'deck.init' 
+	},
+	
+	options = {},
+	$d = $(document),
+	
+	/*
+	Internal function. Updates slide and container classes based on which
+	slide is the current slide.
+	*/
+	updateStates = function() {
+		var oc = options.classes,
+		osc = options.selectors.container,
+		old = $container.data('onSlide'),
+		$all = $();
+		
+		// Container state
+		$container.removeClass(oc.onPrefix + old)
+			.addClass(oc.onPrefix + current)
+			.data('onSlide', current);
+		
+		// Remove and re-add child-current classes for nesting
+		$('.' + oc.current).parentsUntil(osc).removeClass(oc.childCurrent);
+		slides[current].parentsUntil(osc).addClass(oc.childCurrent);
+		
+		// Remove previous states
+		$.each(slides, function(i, el) {
+			$all = $all.add(el);
+		});
+		$all.removeClass([
+			oc.before,
+			oc.previous,
+			oc.current,
+			oc.next,
+			oc.after
+		].join(" "));
+		
+		// Add new states back in
+		slides[current].addClass(oc.current);
+		if (current > 0) {
+			slides[current-1].addClass(oc.previous);
+		}
+		if (current + 1 < slides.length) {
+			slides[current+1].addClass(oc.next);
+		}
+		if (current > 1) {
+			$.each(slides.slice(0, current - 1), function(i, el) {
+				el.addClass(oc.before);
+			});
+		}
+		if (current + 2 < slides.length) {
+			$.each(slides.slice(current+2), function(i, el) {
+				el.addClass(oc.after);
+			});
+		}
+	},
+	
+	/* Methods exposed in the jQuery.deck namespace */
+	methods = {
+		
+		/*
+		jQuery.deck(selector, options)
+		
+		selector: string | jQuery | array
+		options: object, optional
+				
+		Initializes the deck, using each element matched by selector as a slide.
+		May also be passed an array of string selectors or jQuery objects, in
+		which case each selector in the array is considered a slide. The second
+		parameter is an optional options object which will extend the default
+		values.
+		
+		$.deck('.slide');
+		
+		or
+		
+		$.deck([
+		   '#first-slide',
+		   '#second-slide',
+		   '#etc'
+		]);
+		*/	
+		init: function(elements, opts) {
+			var startTouch,
+			tolerance,
+			esp = function(e) {
+				e.stopPropagation();
+			};
+			
+			options = $.extend(true, {}, $[deck].defaults, opts);
+			slides = [];
+			current = 0;
+			$container = $(options.selectors.container);
+			tolerance = options.touch.swipeTolerance;
+			
+			// Pre init event for preprocessing hooks
+			$d.trigger(events.beforeInitialize);
+			
+			// Hide the deck while states are being applied to kill transitions
+			$container.addClass(options.classes.loading);
+			
+			// Fill slides array depending on parameter type
+			if ($.isArray(elements)) {
+				$.each(elements, function(i, e) {
+					slides.push($(e));
+				});
+			}
+			else {
+				$(elements).each(function(i, e) {
+					slides.push($(e));
+				});
+			}
+			
+			/* Remove any previous bindings, and rebind key events */
+			$d.unbind('keydown.deck').bind('keydown.deck', function(e) {
+				if (e.which === options.keys.next || $.inArray(e.which, options.keys.next) > -1) {
+					methods.next();
+					e.preventDefault();
+				}
+				else if (e.which === options.keys.previous || $.inArray(e.which, options.keys.previous) > -1) {
+					methods.prev();
+					e.preventDefault();
+				}
+			});
+			
+			/* Bind touch events for swiping between slides on touch devices */
+			$container.unbind('touchstart.deck').bind('touchstart.deck', function(e) {
+				if (!startTouch) {
+					startTouch = $.extend({}, e.originalEvent.targetTouches[0]);
+				}
+			})
+			.unbind('touchmove.deck').bind('touchmove.deck', function(e) {
+				$.each(e.originalEvent.changedTouches, function(i, t) {
+					if (startTouch && t.identifier === startTouch.identifier) {
+						if (t.screenX - startTouch.screenX > tolerance || t.screenY - startTouch.screenY > tolerance) {
+							$[deck]('prev');
+							startTouch = undefined;
+						}
+						else if (t.screenX - startTouch.screenX < -1 * tolerance || t.screenY - startTouch.screenY < -1 * tolerance) {
+							$[deck]('next');
+							startTouch = undefined;
+						}
+						return false;
+					}
+				});
+				e.preventDefault();
+			})
+			.unbind('touchend.deck').bind('touchend.deck', function(t) {
+				$.each(t.originalEvent.changedTouches, function(i, t) {
+					if (startTouch && t.identifier === startTouch.identifier) {
+						startTouch = undefined;
+					}
+				});
+			})
+			.scrollLeft(0).scrollTop(0)
+			/* Stop propagation of key events within editable elements of slides */
+			.undelegate('input, textarea, select, button, meter, progress, [contentEditable]', 'keydown', esp)
+			.delegate('input, textarea, select, button, meter, progress, [contentEditable]', 'keydown', esp);
+			
+			/*
+			Kick iframe videos, which dont like to redraw w/ transforms.
+			Remove this if Webkit ever fixes it.
+			 */
+			$.each(slides, function(i, $el) {
+				$el.unbind('webkitTransitionEnd.deck').bind('webkitTransitionEnd.deck',
+				function(event) {
+					if ($el.hasClass($[deck]('getOptions').classes.current)) {
+						var embeds = $(this).find('iframe').css('opacity', 0);
+						window.setTimeout(function() {
+							embeds.css('opacity', 1);
+						}, 100);
+					}
+				});
+			});
+			
+			if (slides.length) {
+				updateStates();
+			}
+			
+			// Show deck again now that slides are in place
+			$container.removeClass(options.classes.loading);
+			$d.trigger(events.initialize);
+		},
+		
+		/*
+		jQuery.deck('go', index)
+		
+		index: integer | string
+		
+		Moves to the slide at the specified index if index is a number. Index is
+		0-based, so $.deck('go', 0); will move to the first slide. If index is a
+		string this will move to the slide with the specified id. If index is out
+		of bounds or doesn't match a slide id the call is ignored.
+		*/
+		go: function(index) {
+			var e = $.Event(events.change),
+			ndx;
+			
+			/* Number index, easy. */
+			if (typeof index === 'number' && index >= 0 && index < slides.length) {
+				ndx = index;
+			}
+			/* Id string index, search for it and set integer index */
+			else if (typeof index === 'string') {
+				$.each(slides, function(i, $slide) {
+					if ($slide.attr('id') === index) {
+						ndx = i;
+						return false;
+					}
+				});
+			};
+			
+			/* Out of bounds, id doesn't exist, illegal input, eject */
+			if (typeof ndx === 'undefined') return;
+			
+			$d.trigger(e, [current, ndx]);
+			if (e.isDefaultPrevented()) {
+				/* Trigger the event again and undo the damage done by extensions. */
+				$d.trigger(events.change, [ndx, current]);
+			}
+			else {
+				current = ndx;
+				updateStates();
+			}
+		},
+		
+		/*
+		jQuery.deck('next')
+		
+		Moves to the next slide. If the last slide is already active, the call
+		is ignored.
+		*/
+		next: function() {
+			methods.go(current+1);
+		},
+		
+		/*
+		jQuery.deck('prev')
+		
+		Moves to the previous slide. If the first slide is already active, the
+		call is ignored.
+		*/
+		prev: function() {
+			methods.go(current-1);
+		},
+		
+		/*
+		jQuery.deck('getSlide', index)
+		
+		index: integer, optional
+		
+		Returns a jQuery object containing the slide at index. If index is not
+		specified, the current slide is returned.
+		*/
+		getSlide: function(index) {
+			var i = typeof index !== 'undefined' ? index : current;
+			if (typeof i != 'number' || i < 0 || i >= slides.length) return null;
+			return slides[i];
+		},
+		
+		/*
+		jQuery.deck('getSlides')
+		
+		Returns all slides as an array of jQuery objects.
+		*/
+		getSlides: function() {
+			return slides;
+		},
+		
+		/*
+		jQuery.deck('getContainer')
+		
+		Returns a jQuery object containing the deck container as defined by the
+		container option.
+		*/
+		getContainer: function() {
+			return $container;
+		},
+		
+		/*
+		jQuery.deck('getOptions')
+		
+		Returns the options object for the deck, including any overrides that
+		were defined at initialization.
+		*/
+		getOptions: function() {
+			return options;
+		},
+		
+		/*
+		jQuery.deck('extend', name, method)
+		
+		name: string
+		method: function
+		
+		Adds method to the deck namespace with the key of name. This doesn’t
+		give access to any private member data — public methods must still be
+		used within method — but lets extension authors piggyback on the deck
+		namespace rather than pollute jQuery.
+		
+		$.deck('extend', 'alert', function(msg) {
+		   alert(msg);
+		});
+
+		// Alerts 'boom'
+		$.deck('alert', 'boom');
+		*/
+		extend: function(name, method) {
+			methods[name] = method;
+		}
+	};
+	
+	/* jQuery extension */
+	$[deck] = function(method, arg) {
+		if (methods[method]) {
+			return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
+		}
+		else {
+			return methods.init(method, arg);
+		}
+	};
+	
+	/*
+	The default settings object for a deck. All deck extensions should extend
+	this object to add defaults for any of their options.
+	
+	options.classes.after
+		This class is added to all slides that appear after the 'next' slide.
+	
+	options.classes.before
+		This class is added to all slides that appear before the 'previous'
+		slide.
+		
+	options.classes.childCurrent
+		This class is added to all elements in the DOM tree between the
+		'current' slide and the deck container. For standard slides, this is
+		mostly seen and used for nested slides.
+		
+	options.classes.current
+		This class is added to the current slide.
+		
+	options.classes.loading
+		This class is applied to the deck container during loading phases and is
+		primarily used as a way to short circuit transitions between states
+		where such transitions are distracting or unwanted.  For example, this
+		class is applied during deck initialization and then removed to prevent
+		all the slides from appearing stacked and transitioning into place
+		on load.
+		
+	options.classes.next
+		This class is added to the slide immediately following the 'current'
+		slide.
+		
+	options.classes.onPrefix
+		This prefix, concatenated with the current slide index, is added to the
+		deck container as you change slides.
+		
+	options.classes.previous
+		This class is added to the slide immediately preceding the 'current'
+		slide.
+		
+	options.selectors.container
+		Elements matched by this CSS selector will be considered the deck
+		container. The deck container is used to scope certain states of the
+		deck, as with the onPrefix option, or with extensions such as deck.goto
+		and deck.menu.
+		
+	options.keys.next
+		The numeric keycode used to go to the next slide.
+		
+	options.keys.previous
+		The numeric keycode used to go to the previous slide.
+		
+	options.touch.swipeTolerance
+		The number of pixels the users finger must travel to produce a swipe
+		gesture.
+	*/
+	$[deck].defaults = {
+		classes: {
+			after: 'deck-after',
+			before: 'deck-before',
+			childCurrent: 'deck-child-current',
+			current: 'deck-current',
+			loading: 'deck-loading',
+			next: 'deck-next',
+			onPrefix: 'on-slide-',
+			previous: 'deck-previous'
+		},
+		
+		selectors: {
+			container: '.deck-container'
+		},
+		
+		keys: {
+			// enter, space, page down, right arrow, down arrow,
+			next: [13, 32, 34, 39, 40],
+			// backspace, page up, left arrow, up arrow
+			previous: [8, 33, 37, 38]
+		},
+		
+		touch: {
+			swipeTolerance: 60
+		}
+	};
+	
+	$d.ready(function() {
+		$('html').addClass('ready');
+	});
+	
+	/*
+	FF + Transforms + Flash video don't get along...
+	Firefox will reload and start playing certain videos after a
+	transform.  Blanking the src when a previously shown slide goes out
+	of view prevents this.
+	*/
+	$d.bind('deck.change', function(e, from, to) {
+		var oldFrames = $[deck]('getSlide', from).find('iframe'),
+		newFrames = $[deck]('getSlide', to).find('iframe');
+		
+		oldFrames.each(function() {
+	    	var $this = $(this),
+	    	curSrc = $this.attr('src');
+            
+            if(curSrc) {
+            	$this.data('deck-src', curSrc).attr('src', '');
+            }
+		});
+		
+		newFrames.each(function() {
+			var $this = $(this),
+			originalSrc = $this.data('deck-src');
+			
+			if (originalSrc) {
+				$this.attr('src', originalSrc);
+			}
+		});
+	});
+})(jQuery, 'deck', document);

File core/deck.core.scss

+html {
+	height:100%;
+}
+
+.deck-container {
+	position:relative;
+	height:100%;
+	width:70%;
+	margin:0 auto;
+	padding:0 48px;
+	font-size:16px;
+	line-height:1.25;
+	overflow:hidden;
+	
+	.js & {
+		visibility:hidden;
+	}
+	
+	.ready & {
+		visibility:visible;
+	}
+	
+	.touch & {
+		-webkit-text-size-adjust:none;
+	}
+	
+	/* Resets and base styles from HTML5 Boilerplate */
+	div, span, object, iframe,
+	h1, h2, h3, h4, h5, h6, p, blockquote, pre,
+	abbr, address, cite, code, del, dfn, em, img, ins, kbd, q, samp,
+	small, strong, sub, sup, var, b, i, dl, dt, dd, ol, ul, li,
+	fieldset, form, label, legend,
+	table, caption, tbody, tfoot, thead, tr, th, td,
+	article, aside, canvas, details, figcaption, figure,
+	footer, header, hgroup, menu, nav, section, summary,
+	time, mark, audio, video {
+	  margin: 0;
+	  padding: 0;
+	  border: 0;
+	  font-size: 100%;
+	  font: inherit;
+	  vertical-align: baseline;
+	}
+
+	article, aside, details, figcaption, figure,
+	footer, header, hgroup, menu, nav, section {
+	  display: block;
+	}
+	
+	blockquote, q {
+		quotes:none;
+		
+		&:before, &:after {
+			content:"";
+			content:none;
+		}
+	}
+	
+	ins {
+		background-color:#ff9;
+		color:#000;
+		text-decoration:none;
+	}
+	
+	mark {
+		background-color:#ff9;
+		color:#000;
+		font-style:italic;
+		font-weight:bold;
+	}
+	
+	del {
+		text-decoration:line-through;
+	}
+	
+	abbr[title], dfn[title] {
+		border-bottom:1px dotted;
+		cursor:help;
+	}
+	
+	table {
+		border-collapse:collapse;
+		border-spacing:0;
+	}
+	
+	hr {
+		display:block;
+		height:1px;
+		border:0;
+		border-top:1px solid #ccc;
+		margin:1em 0;
+		padding:0;
+	}
+	
+	input, select {
+		vertical-align:middle;
+	}
+	
+	select, input, textarea, button {
+		font:99% sans-serif;
+	}
+	
+	pre, code, kbd, samp {
+		font-family:monospace, sans-serif;
+	}
+	
+	a {
+		-webkit-tap-highlight-color:rgba(0,0,0,0);
+		
+		&:hover, &:active {
+			outline:none;
+		}
+	}
+	
+	ul, ol {
+		margin-left:2em;
+		vertical-align:top;
+	}
+	
+	ol {
+		list-style-type:decimal;
+	}
+	
+	nav {
+		ul, li {
+			margin:0;
+			list-style:none;
+			list-style-image:none;
+		}
+	}
+	
+	small {
+		font-size:85%;
+	}
+	
+	strong, th {
+		font-weight:bold;
+	}
+	
+	td {
+		vertical-align:top;
+	}
+	
+	sub, sup {
+		font-size:75%;
+		line-height:0;
+		position:relative;
+	}
+	
+	sup {
+		top:-0.5em;
+	}
+	
+	sub { bottom: -0.25em; }
+	
+	textarea {
+		overflow:auto;
+	}
+	
+	legend {
+		.ie6 &, .ie7 & {
+			margin-left:-7px;
+		}
+	}
+	
+	input[type="radio"] {
+		vertical-align:text-bottom;
+	}
+	
+	input[type="checkbox"] {
+		vertical-align:bottom;
+	}
+	
+	.ie7 & input[type="checkbox"] {
+		vertical-align:baseline;
+	}
+	
+	.ie6 & input {
+		vertical-align:text-bottom;
+	}
+	
+	label, input[type="button"], input[type="submit"], input[type="image"], button {
+		cursor:pointer;
+	}
+	
+	button, input, select, textarea {
+		margin: 0;
+	}
+	
+	input, textarea {
+		&:invalid {
+			border-radius:1px;
+			-moz-box-shadow:0px 0px 5px red;
+			-webkit-box-shadow:0px 0px 5px red;
+			box-shadow: 0px 0px 5px red;
+			
+			.no-boxshadow {
+				background-color: #f0dddd;
+			}
+		}
+	}
+	
+	button {
+		width:auto;
+		overflow:visible;
+	}
+	
+	.ie7 & img {
+		-ms-interpolation-mode: bicubic; }
+	
+	&, select, input, textarea {
+		color:#444;
+	}
+	
+	a {
+		color:#607890;
+		
+		&:hover, &:focus {
+			color:#036;
+		}
+		
+		&:link {
+			-webkit-tap-highlight-color: #fff;
+		}
+	}
+	/* End HTML5 Boilerplate adaptations */
+	
+	&.deck-loading {
+		display:none;
+	}
+}
+
+.slide {
+	width:auto;
+	min-height:100%;
+	position:relative;
+	
+	h1 {
+		font-size:4.5em;
+	}
+
+	h1, .vcenter {
+		font-weight:bold;
+		text-align:center;
+		padding-top:1em;
+		max-height:100%;
+		
+		.csstransforms & {
+			padding:0 48px;
+			position:absolute;
+			left:0;
+			right:0;
+			top:50%;
+			-webkit-transform:translate(0, -50%);
+			-moz-transform:translate(0, -50%);
+			-ms-transform:translate(0, -50%);
+			-o-transform:translate(0, -50%);
+			transform:translate(0, -50%);
+		}
+	}
+
+	.vcenter h1 {
+		position:relative;
+		top:auto;
+		padding:0;
+		-webkit-transform:none;
+		-moz-transform:none;
+		-ms-transform:none;
+		-o-transform:none;
+		transform:none;
+	}
+
+	h2 {
+		font-size:2.25em;
+		font-weight:bold;
+		padding-top:.5em;
+		margin:0 0 .66666em 0;
+		border-bottom:3px solid #888;
+	}
+
+	h3 {
+		font-size:1.4375em;
+		font-weight:bold;
+		margin-bottom:.30435em;
+	}
+
+	h4 {
+		font-size:1.25em;
+		font-weight:bold;
+		margin-bottom:.25em;
+	}
+
+	h5 {
+		font-size:1.125em;
+		font-weight:bold;
+		margin-bottom:.2222em;
+	}
+
+	h6 {
+		font-size:1em;
+		font-weight:bold;
+	}
+
+	img, iframe, video {
+		display:block;
+		max-width:100%;
+	}
+
+	video, iframe, img {
+		display:block;
+		margin:0 auto;
+	}
+
+	p, blockquote, iframe, img, ul, ol, pre, video {
+		margin-bottom:1em;
+	}
+
+	pre {
+		white-space:pre;
+		white-space:pre-wrap;
+		word-wrap:break-word;
+		padding: 1em;
+		border:1px solid #888;
+	}
+
+	em {
+		font-style:italic;
+	}
+	
+	li {
+		padding:.25em 0;
+		vertical-align:middle;
+	}
+}
+
+.deck-before, .deck-previous, .deck-next, .deck-after {
+	position:absolute;
+	left:-999em;
+	top:-999em;
+}
+
+.deck-current {
+	z-index:2;
+}
+
+.slide .slide {
+	visibility:hidden;
+	position:static;
+	min-height:0;
+}
+
+.deck-child-current {
+	position:static;
+	z-index:2;
+	
+	.slide {
+		visibility:hidden;
+	}
+	
+	.deck-previous, .deck-before, .deck-current {
+		visibility:visible;
+	}
+}
+
+body.deck-container {
+	overflow:visible;
+}
+
+@media all and (orientation:portrait) {
+
+}
+
+@media all and (orientation:landscape) {
+
+}
+
+@media screen and (max-device-width: 480px) {
+  
+  /* html { -webkit-text-size-adjust:none; -ms-text-size-adjust:none; } */
+}
+
+
+@media print {
+  * {
+	background: transparent !important;
+	color: black !important;
+	text-shadow: none !important;
+	filter:none !important;
+	-ms-filter: none !important;
+	-webkit-box-reflect:none !important;
+	-moz-box-reflect:none !important;
+	-webkit-box-shadow:none !important;
+	-moz-box-shadow:none !important;
+	box-shadow:none !important;
+	
+	:before, :after {
+		display:none !important;
+	}
+} 
+  a, a:visited { color: #444 !important; text-decoration: underline; }
+  a[href]:after { content: " (" attr(href) ")"; }
+  abbr[title]:after { content: " (" attr(title) ")"; }
+  .ir a:after, a[href^="javascript:"]:after, a[href^="#"]:after { content: ""; }  
+  pre, blockquote { border: 1px solid #999; page-break-inside: avoid; }
+  thead { display: table-header-group; } 
+  tr, img { page-break-inside: avoid; }
+  @page { margin: 0.5cm; }
+  p, h2, h3 { orphans: 3; widows: 3; }
+  h2, h3{ page-break-after: avoid; }
+
+ 	.slide {
+		position:static !important;
+		visibility:visible !important;
+		display:block !important;
+		-webkit-transform:none !important;
+		-moz-transform:none !important;
+		-o-transform:none !important;
+		-ms-transform:none !important;
+		transform:none !important;
+		opacity:1 !important;
+	}
+	
+	h1, .vcenter {
+		-webkit-transform:none !important;
+		-moz-transform:none !important;
+		-o-transform:none !important;
+		-ms-transform:none !important;
+		transform:none !important;
+		padding:0 !important;
+		position:static !important;
+	}
+	
+	.deck-container > .slide {
+		page-break-after: always;
+	}
+	
+	.deck-container {
+		width:100% !important;
+		height:auto !important;
+		padding:0 !important;
+		display:block !important;
+	}
+	
+	script {
+		display:none;
+	}
+}

File extensions/goto/deck.goto.css

+.deck-container .goto-form {
+  position: absolute;
+  z-index: 3;
+  bottom: 10px;
+  left: 50%;
+  height: 1.75em;
+  margin: 0 0 0 -9.125em;
+  line-height: 1.75em;
+  padding: 0.625em;
+  display: none;
+  background: #ccc;
+  overflow: hidden;
+}
+.borderradius .deck-container .goto-form {
+  -webkit-border-radius: 10px;
+  -moz-border-radius: 10px;
+  border-radius: 10px;
+}
+.deck-container .goto-form label {
+  font-weight: bold;
+}
+.deck-container .goto-form label, .deck-container .goto-form input {
+  display: inline-block;
+  font-family: inherit;
+}
+
+.deck-goto .goto-form {
+  display: block;
+}
+
+#goto-slide {
+  width: 8.375em;
+  margin: 0 0.625em;
+  height: 1.4375em;
+}
+
+@media print {
+  .goto-form, #goto-slide {
+    display: none !important;
+  }
+}

File extensions/goto/deck.goto.html

+<!-- Place the following snippet at the bottom of the deck container. -->
+<form action="." method="get" class="goto-form">
+	<label for="goto-slide">Go to slide:</label>
+	<input type="text" name="slidenum" id="goto-slide" list="goto-datalist">
+	<datalist id="goto-datalist"></datalist>
+	<input type="submit" value="Go">
+</form>

File extensions/goto/deck.goto.js

+/*!
+Deck JS - deck.goto
+Copyright (c) 2011 Caleb Troughton
+Dual licensed under the MIT license and GPL license.
+https://github.com/imakewebthings/deck.js/blob/master/MIT-license.txt
+https://github.com/imakewebthings/deck.js/blob/master/GPL-license.txt
+*/
+
+/*
+This module adds the necessary methods and key bindings to show and hide a form
+for jumping to any slide number/id in the deck (and processes that form
+accordingly). The form-showing state is indicated by the presence of a class on
+the deck container.
+*/
+(function($, deck, undefined) {
+	var $d = $(document);
+	
+	/*
+	Extends defaults/options.
+	
+	options.classes.goto
+		This class is added to the deck container when showing the Go To Slide
+		form.
+		
+	options.selectors.gotoDatalist
+		The element that matches this selector is the datalist element that will
+		be populated with options for each of the slide ids.  In browsers that
+		support the datalist element, this provides a drop list of slide ids to
+		aid the user in selecting a slide.
+		
+	options.selectors.gotoForm
+		The element that matches this selector is the form that is submitted
+		when a user hits enter after typing a slide number/id in the gotoInput
+		element.
+	
+	options.selectors.gotoInput
+		The element that matches this selector is the text input field for
+		entering a slide number/id in the Go To Slide form.
+		
+	options.keys.goto
+		The numeric keycode used to show the Go To Slide form.
+		
+	options.countNested
+		If false, only top level slides will be counted when entering a
+		slide number.
+	*/
+	$.extend(true, $[deck].defaults, {
+		classes: {
+			goto: 'deck-goto'
+		},
+		
+		selectors: {
+			gotoDatalist: '#goto-datalist',
+			gotoForm: '.goto-form',
+			gotoInput: '#goto-slide'
+		},
+		
+		keys: {
+			goto: 71 // g
+		},
+		
+		countNested: true
+	});
+
+	/*
+	jQuery.deck('showGoTo')
+	
+	Shows the Go To Slide form by adding the class specified by the goto class
+	option to the deck container.
+	*/
+	$[deck]('extend', 'showGoTo', function() {
+		$[deck]('getContainer').addClass($[deck]('getOptions').classes.goto);
+		$($[deck]('getOptions').selectors.gotoInput).focus();
+	});
+
+	/*
+	jQuery.deck('hideGoTo')
+	
+	Hides the Go To Slide form by removing the class specified by the goto class
+	option from the deck container.
+	*/
+	$[deck]('extend', 'hideGoTo', function() {
+		$($[deck]('getOptions').selectors.gotoInput).blur();
+		$[deck]('getContainer').removeClass($[deck]('getOptions').classes.goto);
+	});
+
+	/*
+	jQuery.deck('toggleGoTo')
+	
+	Toggles between showing and hiding the Go To Slide form.
+	*/
+	$[deck]('extend', 'toggleGoTo', function() {
+		$[deck]($[deck]('getContainer').hasClass($[deck]('getOptions').classes.goto) ? 'hideGoTo' : 'showGoTo');
+	});
+	
+	$d.bind('deck.init', function() {
+		var opts = $[deck]('getOptions'),
+		$datalist = $(opts.selectors.gotoDatalist),
+		slideTest = $.map([
+			opts.classes.before,
+			opts.classes.previous,
+			opts.classes.current,
+			opts.classes.next,
+			opts.classes.after
+		], function(el, i) {
+			return '.' + el;
+		}).join(', '),
+		rootCounter = 1;
+		
+		// Bind key events
+		$d.unbind('keydown.deckgoto').bind('keydown.deckgoto', function(e) {
+			var key = $[deck]('getOptions').keys.goto;
+			
+			if (e.which === key || $.inArray(e.which, key) > -1) {
+				e.preventDefault();
+				$[deck]('toggleGoTo');
+			}
+		});
+		
+		/* Populate datalist and work out countNested*/
+		$.each($[deck]('getSlides'), function(i, $slide) {
+			var id = $slide.attr('id'),
+			$parentSlides = $slide.parentsUntil(opts.selectors.container, slideTest);
+			
+			if (id) {
+				$datalist.append('<option value="' + id + '">');
+			}
+			
+			if ($parentSlides.length) {
+				$slide.removeData('rootIndex');
+			}
+			else if (!opts.countNested) {
+				$slide.data('rootIndex', rootCounter);
+				++rootCounter;
+			}
+		});
+		
+		// Process form submittal, go to the slide entered
+		$(opts.selectors.gotoForm)
+		.unbind('submit.deckgoto')
+		.bind('submit.deckgoto', function(e) {
+			var $field = $($[deck]('getOptions').selectors.gotoInput),
+			ndx = parseInt($field.val(), 10);
+			
+			if (!$[deck]('getOptions').countNested) {
+			  if (ndx >= rootCounter) return false;
+				$.each($[deck]('getSlides'), function(i, $slide) {
+					if ($slide.data('rootIndex') === ndx) {
+						ndx = i + 1;
+						return false;
+					}
+				});
+			}
+			
+			$[deck]('go', isNaN(ndx) ? $field.val() : ndx - 1);
+			$[deck]('hideGoTo');
+			$field.val('');
+			
+			e.preventDefault();
+		});
+		
+		// Dont let keys in the input trigger deck actions
+		$(opts.selectors.gotoInput)
+		.unbind('keydown.deckgoto')
+		.bind('keydown.deckgoto', function(e) {
+			e.stopPropagation();
+		});
+	});
+})(jQuery, 'deck');
+

File extensions/goto/deck.goto.scss

+.deck-container {	
+	.goto-form {
+		position:absolute;
+		z-index:3;
+		bottom:10px;
+		left:50%;
+		height:1.75em;
+		margin:0 0 0 -9.125em;
+		line-height:1.75em;
+		padding:0.625em;
+		display:none;
+		background:#ccc;
+		overflow:hidden;
+	
+		.borderradius & {
+			-webkit-border-radius:10px;
+			-moz-border-radius:10px;
+			border-radius:10px;
+		}
+	
+		label {
+			font-weight:bold;
+		}
+	
+		label, input {
+			display:inline-block;
+			font-family:inherit;
+		}
+	}
+}
+
+.deck-goto .goto-form {
+	display:block;
+}
+
+#goto-slide {
+	width:8.375em;
+	margin:0 0.625em;
+	height:1.4375em;
+}
+
+@media print {
+	.goto-form, #goto-slide {
+		display:none !important;
+	}
+}

File extensions/hash/deck.hash.css

+.deck-container .deck-permalink {
+  display: none;
+  position: absolute;
+  z-index: 4;
+  bottom: 30px;
+  right: 0;
+  width: 48px;
+  text-align: center;
+}
+
+.no-history .deck-container:hover .deck-permalink {
+  display: block;
+}

File extensions/hash/deck.hash.html

+<!-- Place the following snippet at the bottom of the deck container. -->
+<a href="." title="Permalink to this slide" class="deck-permalink">#</a>

File extensions/hash/deck.hash.js

+/*!
+Deck JS - deck.hash
+Copyright (c) 2011 Caleb Troughton
+Dual licensed under the MIT license and GPL license.
+https://github.com/imakewebthings/deck.js/blob/master/MIT-license.txt
+https://github.com/imakewebthings/deck.js/blob/master/GPL-license.txt
+*/
+
+/*
+This module adds deep linking to individual slides, enables internal links
+to slides within decks, and updates the address bar with the hash as the user
+moves through the deck. A permalink anchor is also updated. Standard themes
+hide this link in browsers that support the History API, and show it for
+those that do not. Slides that do not have an id are assigned one according to
+the hashPrefix option. In addition to the on-slide container state class
+kept by core, this module adds an on-slide state class that uses the id of each
+slide.
+*/
+(function ($, deck, window, undefined) {
+	var $d = $(document),
+	$window = $(window),
+	
+	/* Collection of internal fragment links in the deck */
+	$internals,
+	
+	/*
+	Internal only function.  Given a string, extracts the id from the hash,
+	matches it to the appropriate slide, and navigates there.
+	*/
+	goByHash = function(str) {
+		var id = str.substr(str.indexOf("#") + 1),
+		slides = $[deck]('getSlides');
+		
+		$.each(slides, function(i, $el) {
+			if ($el.attr('id') === id) {
+				$[deck]('go', i);
+				return false;
+			}
+		});
+		
+		// If we don't set these to 0 the container scrolls due to hashchange
+		$[deck]('getContainer').scrollLeft(0).scrollTop(0);
+	};
+	
+	/*
+	Extends defaults/options.
+	
+	options.selectors.hashLink
+		The element matching this selector has its href attribute updated to
+		the hash of the current slide as the user navigates through the deck.
+		
+	options.hashPrefix
+		Every slide that does not have an id is assigned one at initialization.
+		Assigned ids take the form of hashPrefix + slideIndex, e.g., slide-0,
+		slide-12, etc.
+	*/
+	$.extend(true, $[deck].defaults, {
+		selectors: {
+			hashLink: '.deck-permalink'
+		},
+		
+		hashPrefix: 'slide-'
+	});
+	
+	
+	$d.bind('deck.init', function() {
+	   var opts = $[deck]('getOptions');
+		$internals = $(),
+		slides = $[deck]('getSlides');
+		
+		$.each(slides, function(i, $el) {
+			var hash;
+			
+			/* Hand out ids to the unfortunate slides born without them */
+			if (!$el.attr('id') || $el.data('deckAssignedId') === $el.attr('id')) {
+				$el.attr('id', opts.hashPrefix + i);
+				$el.data('deckAssignedId', opts.hashPrefix + i);
+			}
+			
+			hash ='#' + $el.attr('id');
+			
+			/* Deep link to slides on init */
+			if (hash === window.location.hash) {
+				$[deck]('go', i);
+			}
+			
+			/* Add internal links to this slide */
+			$internals = $internals.add('a[href="' + hash + '"]');
+		});
+		
+		if (!Modernizr.hashchange) {
+			/* Set up internal links using click for the poor browsers
+			without a hashchange event. */
+			$internals.unbind('click.deckhash').bind('click.deckhash', function(e) {
+				goByHash($(this).attr('href'));
+			});
+		}
+		
+		/* Set up first id container state class */
+		if (slides.length) {
+			$[deck]('getContainer').addClass(opts.classes.onPrefix + $[deck]('getSlide').attr('id'));
+		};
+	})
+	/* Update permalink, address bar, and state class on a slide change */
+	.bind('deck.change', function(e, from, to) {
+		var hash = '#' + $[deck]('getSlide', to).attr('id'),
+		opts = $[deck]('getOptions'),
+		osp = opts.classes.onPrefix,
+		$c = $[deck]('getContainer');
+		
+		$c.removeClass(osp + $[deck]('getSlide', from).attr('id'));
+		$c.addClass(osp + $[deck]('getSlide', to).attr('id'));
+		
+		$(opts.selectors.hashLink).attr('href', hash);
+		if (Modernizr.history) {
+			window.history.replaceState({}, "", hash);
+		}
+	});
+	
+	/* Deals with internal links in modern browsers */
+	$window.bind('hashchange.deckhash', function(e) {
+		if (e.originalEvent && e.originalEvent.newURL) {
+			goByHash(e.originalEvent.newURL);
+		}
+		else {
+			goByHash(window.location.hash);
+		}
+	});
+})(jQuery, 'deck', this);

File extensions/hash/deck.hash.scss

+.deck-container {
+	.deck-permalink {
+		display:none;
+		position:absolute;
+		z-index:4;
+		bottom:30px;
+		right:0;
+		width:48px;
+		text-align:center;
+	}
+}
+
+.no-history .deck-container:hover .deck-permalink {
+	display:block;
+}

File extensions/menu/deck.menu.css

+.deck-menu .slide {
+  background: #eee;
+  position: relative;
+  left: 0;
+  top: 0;
+  visibility: visible;
+  cursor: pointer;
+}
+.no-csstransforms .deck-menu > .slide {
+  float: left;
+  width: 22%;
+  height: 22%;
+  min-height: 0;
+  margin: 1%;
+  font-size: 0.22em;
+  overflow: hidden;
+  padding: 0 0.5%;
+}
+.csstransforms .deck-menu > .slide {
+  -webkit-transform: scale(0.22) !important;
+  -moz-transform: scale(0.22) !important;
+  -o-transform: scale(0.22) !important;
+  -ms-transform: scale(0.22) !important;
+  transform: scale(0.22) !important;
+  -webkit-transform-origin: 0 0;
+  -moz-transform-origin: 0 0;
+  -o-transform-origin: 0 0;
+  -ms-transform-origin: 0 0;
+  transform-origin: 0 0;