slide-em-up 0.3.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -46,6 +46,14 @@ Several themes are available: `io2012`, `shower`, `3d_slideshow`, `reveal`,
46
46
  presentation, edit the `presentation.json` file and change the `"theme"`
47
47
  element.
48
48
 
49
+ You can also create your own theme, for example, by copying the template:
50
+
51
+ ```sh
52
+ mkdir -p ~/.slide-em-up
53
+ cp -r themes/template ~/.slide-em-up/my-theme
54
+ $EDITOR ~/.slide-em-up/my-theme/README
55
+ ```
56
+
49
57
 
50
58
  Markup for the slides
51
59
  ---------------------
@@ -112,6 +120,18 @@ setting the `APIKEY` environment variable:
112
120
  APIKEY=foobar slide-em-up
113
121
 
114
122
 
123
+ Examples
124
+ --------
125
+
126
+ I'm using slide-em-up for my own presentations, so you can find some real
127
+ slides powered by slide-em-up on https://github.com/nono/Presentations.
128
+
129
+ For example, you can try the presentation "Welcome to the nice world of Golang"
130
+ on http://blog.menfin.info/Presentations/20120709_Golang_introduction/ and
131
+ see the sources of it on
132
+ https://github.com/nono/Presentations/tree/master/20120709_Golang_introduction.
133
+
134
+
115
135
  Issues or Suggestions
116
136
  ---------------------
117
137
 
@@ -71,8 +71,13 @@ module SlideEmUp
71
71
 
72
72
  def build_theme(title)
73
73
  Theme.new.tap do |t|
74
+ dir = File.expand_path("~/.slide-em-up/#{title}")
75
+ if File.exists?(dir)
76
+ t.dir = dir
77
+ else
78
+ t.dir = File.expand_path("../../../themes/#{title}", __FILE__)
79
+ end
74
80
  t.title = title
75
- t.dir = File.expand_path("../../../themes/#{title}", __FILE__)
76
81
  Dir.chdir(t.dir) do
77
82
  t.css = Dir["**/*.css"]
78
83
  t.js = Dir["**/*.js"]
@@ -1,3 +1,3 @@
1
1
  module SlideEmUp
2
- VERSION = "0.3.0"
2
+ VERSION = "0.3.1"
3
3
  end
@@ -43,13 +43,14 @@
43
43
  .slide:target,
44
44
  .slide.next {
45
45
  display: block;
46
- opacity:0;
46
+ visibility: hidden;
47
47
  overflow:hidden;
48
48
  }
49
49
 
50
50
  .slide:target {
51
51
  z-index:100;
52
52
  opacity:1;
53
+ visibility: visible;
53
54
  overflow: visible;
54
55
  }
55
56
 
@@ -100,6 +101,23 @@
100
101
  opacity: 1;
101
102
  }
102
103
 
104
+ /**
105
+ On-screen navigation
106
+ */
107
+
108
+ button.onscreen-nav {
109
+ position: absolute;
110
+ bottom: 1em;
111
+ right: 1em;
112
+ padding: .2em .4em;
113
+ border: 0;
114
+ border-radius: .3em;
115
+ background: rgba(0,0,0,.5);
116
+ color: white;
117
+ text-shadow: 0 -.05em .05em black;
118
+ text-transform: uppercase;
119
+ }
120
+
103
121
  /**
104
122
  iframe slides
105
123
  */
@@ -283,4 +301,4 @@
283
301
 
284
302
  .presenter .slide:target > .presenter-notes {
285
303
  display: block;
286
- }
304
+ }
@@ -226,3 +226,25 @@ section > header.slide {
226
226
  content: ' (' attr(href) ')';
227
227
  }
228
228
 
229
+ /* Syntax highlighting */
230
+
231
+ .comment {
232
+ color: #999;
233
+ }
234
+
235
+ .string {
236
+ color: yellow;
237
+ }
238
+
239
+ .keyword {
240
+ font-weight: bold;
241
+ color: deeppink;
242
+ }
243
+
244
+ .number, .boolean {
245
+ color: #0cf;
246
+ }
247
+
248
+ .regex {
249
+ color: orange;
250
+ }
@@ -8,7 +8,7 @@
8
8
  <link rel="stylesheet" href="<%= css%>">
9
9
  <% end %>
10
10
  <link rel="stylesheet" href="css/pygments/native.css">
11
- <script src="../prefixfree.min.js"></script>
11
+ <script src="js/prefixfree.min.js"></script>
12
12
  </head>
13
13
  <body data-duration="<%= meta.duration %>">
14
14
  <section>
File without changes
@@ -1,13 +1,5 @@
1
- // StyleFix 1.0.2 + PrefixFree 1.0.6 / Lea Verou / MIT license
2
- (function(){function h(a,b){return[].slice.call((b||document).querySelectorAll(a))}if(window.addEventListener){var e=window.StyleFix={link:function(a){try{if("stylesheet"!==a.rel||a.hasAttribute("data-noprefix"))return}catch(b){return}var c=a.href||a.getAttribute("data-href"),f=c.replace(/[^\/]+$/,""),i=a.parentNode,d=new XMLHttpRequest,g;d.onreadystatechange=function(){4===d.readyState&&g()};g=function(){var b=d.responseText;if(b&&a.parentNode&&(!d.status||400>d.status||600<d.status)){b=e.fix(b,
3
- !0,a);f&&(b=b.replace(/url\(\s*?((?:"|')?)(.+?)\1\s*?\)/gi,function(a,b,c){return!/^([a-z]{3,10}:|\/|#)/i.test(c)?'url("'+f+c+'")':a}),b=b.replace(RegExp("\\b(behavior:\\s*?url\\('?\"?)"+f,"gi"),"$1"));var c=document.createElement("style");c.textContent=b;c.media=a.media;c.disabled=a.disabled;c.setAttribute("data-href",a.getAttribute("href"));i.insertBefore(c,a);i.removeChild(a);c.media=a.media}};try{d.open("GET",c),d.send(null)}catch(k){"undefined"!=typeof XDomainRequest&&(d=new XDomainRequest,d.onerror=
4
- d.onprogress=function(){},d.onload=g,d.open("GET",c),d.send(null))}a.setAttribute("data-inprogress","")},styleElement:function(a){if(!a.hasAttribute("data-noprefix")){var b=a.disabled;a.textContent=e.fix(a.textContent,!0,a);a.disabled=b}},styleAttribute:function(a){var b=a.getAttribute("style"),b=e.fix(b,!1,a);a.setAttribute("style",b)},process:function(){h('link[rel="stylesheet"]:not([data-inprogress])').forEach(StyleFix.link);h("style").forEach(StyleFix.styleElement);h("[style]").forEach(StyleFix.styleAttribute)},
5
- register:function(a,b){(e.fixers=e.fixers||[]).splice(void 0===b?e.fixers.length:b,0,a)},fix:function(a,b){for(var c=0;c<e.fixers.length;c++)a=e.fixers[c](a,b)||a;return a},camelCase:function(a){return a.replace(/-([a-z])/g,function(a,c){return c.toUpperCase()}).replace("-","")},deCamelCase:function(a){return a.replace(/[A-Z]/g,function(a){return"-"+a.toLowerCase()})}};(function(){setTimeout(function(){h('link[rel="stylesheet"]').forEach(StyleFix.link)},10);document.addEventListener("DOMContentLoaded",
6
- StyleFix.process,!1)})()}})();
7
- (function(h){function e(b,c,f,i,d){b=a[b];b.length&&(b=RegExp(c+"("+b.join("|")+")"+f,"gi"),d=d.replace(b,i));return d}if(window.StyleFix&&window.getComputedStyle){var a=window.PrefixFree={prefixCSS:function(b,c){var f=a.prefix,b=e("functions","(\\s|:|,)","\\s*\\(","$1"+f+"$2(",b),b=e("keywords","(\\s|:)","(\\s|;|\\}|$)","$1"+f+"$2$3",b),b=e("properties","(^|\\{|\\s|;)","\\s*:","$1"+f+"$2:",b);if(a.properties.length)var i=RegExp("\\b("+a.properties.join("|")+")(?!:)","gi"),b=e("valueProperties","\\b",
8
- ":(.+?);",function(a){return a.replace(i,f+"$1")},b);c&&(b=e("selectors","","\\b",a.prefixSelector,b),b=e("atrules","@","\\b","@"+f+"$1",b));return b=b.replace(RegExp("-"+f,"g"),"-")},property:function(b){return(a.properties.indexOf(b)?a.prefix:"")+b},value:function(b){b=e("functions","(^|\\s|,)","\\s*\\(","$1"+a.prefix+"$2(",b);return b=e("keywords","(^|\\s)","(\\s|$)","$1"+a.prefix+"$2$3",b)},prefixSelector:function(b){return b.replace(/^:{1,2}/,function(b){return b+a.prefix})},prefixProperty:function(b,
9
- c){var f=a.prefix+b;return c?StyleFix.camelCase(f):f}};(function(){var b={},c=[],f=getComputedStyle(document.documentElement,null),i=document.createElement("div").style,d=function(a){if("-"===a.charAt(0)){c.push(a);var a=a.split("-"),d=a[1];for(b[d]=++b[d]||1;3<a.length;)a.pop(),d=a.join("-"),StyleFix.camelCase(d)in i&&-1===c.indexOf(d)&&c.push(d)}};if(0<f.length)for(var g=0;g<f.length;g++)d(f[g]);else for(var e in f)d(StyleFix.deCamelCase(e));var g=0,j,h;for(h in b)f=b[h],g<f&&(j=h,g=f);a.prefix=
10
- "-"+j+"-";a.Prefix=StyleFix.camelCase(a.prefix);a.properties=[];for(g=0;g<c.length;g++)e=c[g],0===e.indexOf(a.prefix)&&(j=e.slice(a.prefix.length),StyleFix.camelCase(j)in i||a.properties.push(j));"Ms"==a.Prefix&&(!("transform"in i)&&!("MsTransform"in i)&&"msTransform"in i)&&a.properties.push("transform","transform-origin");a.properties.sort()})();(function(){function b(a,b){e[b]="";e[b]=a;return!!e[b]}var c={"linear-gradient":{property:"backgroundImage",params:"red, teal"},calc:{property:"width",
11
- params:"1px + 5%"},element:{property:"backgroundImage",params:"#foo"},"cross-fade":{property:"backgroundImage",params:"url(a.png), url(b.png), 50%"}};c["repeating-linear-gradient"]=c["repeating-radial-gradient"]=c["radial-gradient"]=c["linear-gradient"];var f={initial:"color","zoom-in":"cursor","zoom-out":"cursor",box:"display",flexbox:"display","inline-flexbox":"display",flex:"display","inline-flex":"display"};a.functions=[];a.keywords=[];var e=document.createElement("div").style,d;for(d in c){var g=
12
- c[d],h=g.property,g=d+"("+g.params+")";!b(g,h)&&b(a.prefix+g,h)&&a.functions.push(d)}for(var j in f)h=f[j],!b(j,h)&&b(a.prefix+j,h)&&a.keywords.push(j)})();(function(){function b(a){e.textContent=a+"{}";return!!e.sheet.cssRules.length}var c={":read-only":null,":read-write":null,":any-link":null,"::selection":null},f={keyframes:"name",viewport:null,document:'regexp(".")'};a.selectors=[];a.atrules=[];var e=h.appendChild(document.createElement("style")),d;for(d in c){var g=d+(c[d]?"("+c[d]+")":"");!b(g)&&
13
- b(a.prefixSelector(g))&&a.selectors.push(d)}for(var k in f)g=k+" "+(f[k]||""),!b("@"+g)&&b("@"+a.prefix+g)&&a.atrules.push(k);h.removeChild(e)})();a.valueProperties=["transition","transition-property"];h.className+=" "+a.prefix;StyleFix.register(a.prefixCSS)}})(document.documentElement);
1
+ /**
2
+ * StyleFix 1.0.3 & PrefixFree 1.0.7
3
+ * @author Lea Verou
4
+ * MIT license
5
+ */(function(){function t(e,t){return[].slice.call((t||document).querySelectorAll(e))}if(!window.addEventListener)return;var e=window.StyleFix={link:function(t){try{if(t.rel!=="stylesheet"||t.hasAttribute("data-noprefix"))return}catch(n){return}var r=t.href||t.getAttribute("data-href"),i=r.replace(/[^\/]+$/,""),s=t.parentNode,o=new XMLHttpRequest,u;o.onreadystatechange=function(){o.readyState===4&&u()};u=function(){var n=o.responseText;if(n&&t.parentNode&&(!o.status||o.status<400||o.status>600)){n=e.fix(n,!0,t);if(i){n=n.replace(/url\(\s*?((?:"|')?)(.+?)\1\s*?\)/gi,function(e,t,n){return/^([a-z]{3,10}:|\/|#)/i.test(n)?e:'url("'+i+n+'")'});var r=i.replace(/([\\\^\$*+[\]?{}.=!:(|)])/g,"\\$1");n=n.replace(RegExp("\\b(behavior:\\s*?url\\('?\"?)"+r,"gi"),"$1")}var u=document.createElement("style");u.textContent=n;u.media=t.media;u.disabled=t.disabled;u.setAttribute("data-href",t.getAttribute("href"));s.insertBefore(u,t);s.removeChild(t);u.media=t.media}};try{o.open("GET",r);o.send(null)}catch(n){if(typeof XDomainRequest!="undefined"){o=new XDomainRequest;o.onerror=o.onprogress=function(){};o.onload=u;o.open("GET",r);o.send(null)}}t.setAttribute("data-inprogress","")},styleElement:function(t){if(t.hasAttribute("data-noprefix"))return;var n=t.disabled;t.textContent=e.fix(t.textContent,!0,t);t.disabled=n},styleAttribute:function(t){var n=t.getAttribute("style");n=e.fix(n,!1,t);t.setAttribute("style",n)},process:function(){t('link[rel="stylesheet"]:not([data-inprogress])').forEach(StyleFix.link);t("style").forEach(StyleFix.styleElement);t("[style]").forEach(StyleFix.styleAttribute)},register:function(t,n){(e.fixers=e.fixers||[]).splice(n===undefined?e.fixers.length:n,0,t)},fix:function(t,n,r){for(var i=0;i<e.fixers.length;i++)t=e.fixers[i](t,n,r)||t;return t},camelCase:function(e){return e.replace(/-([a-z])/g,function(e,t){return t.toUpperCase()}).replace("-","")},deCamelCase:function(e){return e.replace(/[A-Z]/g,function(e){return"-"+e.toLowerCase()})}};(function(){setTimeout(function(){t('link[rel="stylesheet"]').forEach(StyleFix.link)},10);document.addEventListener("DOMContentLoaded",StyleFix.process,!1)})()})();(function(e){function t(e,t,r,i,s){e=n[e];if(e.length){var o=RegExp(t+"("+e.join("|")+")"+r,"gi");s=s.replace(o,i)}return s}if(!window.StyleFix||!window.getComputedStyle)return;var n=window.PrefixFree={prefixCSS:function(e,r,i){var s=n.prefix;n.functions.indexOf("linear-gradient")>-1&&(e=e.replace(/(\s|:|,)(repeating-)?linear-gradient\(\s*(-?\d*\.?\d*)deg/ig,function(e,t,n,r){r=Math.abs(r-450)%360;return t+(n||"")+"linear-gradient("+r+"deg"}));e=t("functions","(\\s|:|,)","\\s*\\(","$1"+s+"$2(",e);e=t("keywords","(\\s|:)","(\\s|;|\\}|$)","$1"+s+"$2$3",e);e=t("properties","(^|\\{|\\s|;)","\\s*:","$1"+s+"$2:",e);if(n.properties.length){var o=RegExp("\\b("+n.properties.join("|")+")(?!:)","gi");e=t("valueProperties","\\b",":(.+?);",function(e){return e.replace(o,s+"$1")},e)}if(r){e=t("selectors","","\\b",n.prefixSelector,e);e=t("atrules","@","\\b","@"+s+"$1",e)}e=e.replace(RegExp("-"+s,"g"),"-");e=e.replace(/-\*-(?=[a-z]+)/gi,n.prefix);return e},property:function(e){return(n.properties.indexOf(e)?n.prefix:"")+e},value:function(e,r){e=t("functions","(^|\\s|,)","\\s*\\(","$1"+n.prefix+"$2(",e);e=t("keywords","(^|\\s)","(\\s|$)","$1"+n.prefix+"$2$3",e);return e},prefixSelector:function(e){return e.replace(/^:{1,2}/,function(e){return e+n.prefix})},prefixProperty:function(e,t){var r=n.prefix+e;return t?StyleFix.camelCase(r):r}};(function(){var e={},t=[],r={},i=getComputedStyle(document.documentElement,null),s=document.createElement("div").style,o=function(n){if(n.charAt(0)==="-"){t.push(n);var r=n.split("-"),i=r[1];e[i]=++e[i]||1;while(r.length>3){r.pop();var s=r.join("-");u(s)&&t.indexOf(s)===-1&&t.push(s)}}},u=function(e){return StyleFix.camelCase(e)in s};if(i.length>0)for(var a=0;a<i.length;a++)o(i[a]);else for(var f in i)o(StyleFix.deCamelCase(f));var l={uses:0};for(var c in e){var h=e[c];l.uses<h&&(l={prefix:c,uses:h})}n.prefix="-"+l.prefix+"-";n.Prefix=StyleFix.camelCase(n.prefix);n.properties=[];for(var a=0;a<t.length;a++){var f=t[a];if(f.indexOf(n.prefix)===0){var p=f.slice(n.prefix.length);u(p)||n.properties.push(p)}}n.Prefix=="Ms"&&!("transform"in s)&&!("MsTransform"in s)&&"msTransform"in s&&n.properties.push("transform","transform-origin");n.properties.sort()})();(function(){function i(e,t){r[t]="";r[t]=e;return!!r[t]}var e={"linear-gradient":{property:"backgroundImage",params:"red, teal"},calc:{property:"width",params:"1px + 5%"},element:{property:"backgroundImage",params:"#foo"},"cross-fade":{property:"backgroundImage",params:"url(a.png), url(b.png), 50%"}};e["repeating-linear-gradient"]=e["repeating-radial-gradient"]=e["radial-gradient"]=e["linear-gradient"];var t={initial:"color","zoom-in":"cursor","zoom-out":"cursor",box:"display",flexbox:"display","inline-flexbox":"display",flex:"display","inline-flex":"display"};n.functions=[];n.keywords=[];var r=document.createElement("div").style;for(var s in e){var o=e[s],u=o.property,a=s+"("+o.params+")";!i(a,u)&&i(n.prefix+a,u)&&n.functions.push(s)}for(var f in t){var u=t[f];!i(f,u)&&i(n.prefix+f,u)&&n.keywords.push(f)}})();(function(){function s(e){i.textContent=e+"{}";return!!i.sheet.cssRules.length}var t={":read-only":null,":read-write":null,":any-link":null,"::selection":null},r={keyframes:"name",viewport:null,document:'regexp(".")'};n.selectors=[];n.atrules=[];var i=e.appendChild(document.createElement("style"));for(var o in t){var u=o+(t[o]?"("+t[o]+")":"");!s(u)&&s(n.prefixSelector(u))&&n.selectors.push(o)}for(var a in r){var u=a+" "+(r[a]||"");!s("@"+u)&&s("@"+n.prefix+u)&&n.atrules.push(a)}e.removeChild(i)})();n.valueProperties=["transition","transition-property"];e.className+=" "+n.prefix;StyleFix.register(n.prefixCSS)})(document.documentElement);
@@ -3,7 +3,7 @@
3
3
  * @author Lea Verou (http://leaverou.me)
4
4
  * @version 2.0
5
5
  */
6
-
6
+
7
7
  /**
8
8
  * Make the environment a bit friendlier
9
9
  */
@@ -25,28 +25,28 @@ var documentTitle = document.title + '';
25
25
 
26
26
  var self = window.SlideShow = function(slide) {
27
27
  var me = this;
28
-
28
+
29
29
  // Set instance
30
30
  if(!window.slideshow) {
31
31
  window.slideshow = this;
32
32
  }
33
-
33
+
34
34
  // Current slide
35
35
  this.index = this.slide = slide || 0;
36
-
36
+
37
37
  // Current .delayed item in the slide
38
38
  this.item = 0;
39
-
39
+
40
40
  // Create timer, if needed
41
41
  this.duration = body.getAttribute('data-duration');
42
-
42
+
43
43
  if(this.duration > 0) {
44
44
  var timer = document.createElement('div');
45
-
45
+
46
46
  timer.id = 'timer';
47
47
  timer.setAttribute('style', PrefixFree.prefixCSS('transition-duration: ' + this.duration * 60 + 's;'));
48
48
  body.appendChild(timer);
49
-
49
+
50
50
  addEventListener('load', function() {
51
51
  timer.className = 'end';
52
52
 
@@ -55,32 +55,65 @@ var self = window.SlideShow = function(slide) {
55
55
  }, me.duration * 60000);
56
56
  });
57
57
  }
58
-
58
+
59
59
  // Create slide indicator
60
60
  this.indicator = document.createElement('div');
61
-
61
+
62
62
  this.indicator.id = 'indicator';
63
63
  body.appendChild(this.indicator);
64
-
64
+
65
65
  // Get the slide elements into an array
66
66
  this.slides = $$('.slide', body);
67
-
67
+
68
+ // Get the overview
69
+ this.overview = function(evt) {
70
+ if(body.classList.contains('show-thumbnails')) {
71
+ body.classList.remove('show-thumbnails');
72
+ body.classList.remove('headers-only');
73
+ }
74
+ else {
75
+ body.classList.add('show-thumbnails');
76
+
77
+ if(evt && (!evt.shiftKey || !evt.ctrlKey)) {
78
+ body.classList.add('headers-only');
79
+ }
80
+
81
+ body.addEventListener('click', function(evt) {
82
+ var slide = evt.target;
83
+
84
+ while(slide && !slide.classList.contains('slide')) {
85
+ slide = slide.parentNode;
86
+ }
87
+
88
+ if(slide) {
89
+ me.goto(slide.id);
90
+ setTimeout(function() { me.adjustFontSize(); }, 1000); // for Opera
91
+ }
92
+
93
+ body.classList.remove('show-thumbnails');
94
+ body.classList.remove('headers-only');
95
+
96
+ body.removeEventListener('click', arguments.callee);
97
+ }, false);
98
+ }
99
+ };
100
+
68
101
  // Order of the slides
69
102
  this.order = [];
70
-
103
+
71
104
  for(var i=0; i<this.slides.length; i++) {
72
105
  var slide = this.slides[i]; // to speed up references
73
-
106
+
74
107
  // Asign ids to slides that don't have one
75
108
  if(!slide.id) {
76
109
  slide.id = 'slide' + (i+1);
77
110
  }
78
-
111
+
79
112
  // Set data-title attribute to the title of the slide
80
113
  if(!slide.title) {
81
114
  // no title attribute, fetch title from heading(s)
82
115
  var heading = $('hgroup', slide) || $('h1,h2,h3,h4,h5,h6', slide);
83
-
116
+
84
117
  if(heading && heading.textContent.trim()) {
85
118
  slide.setAttribute('data-title', heading.textContent);
86
119
  }
@@ -90,73 +123,91 @@ var self = window.SlideShow = function(slide) {
90
123
  slide.setAttribute('data-title', slide.title);
91
124
  slide.removeAttribute('title');
92
125
  }
93
-
126
+
94
127
  slide.setAttribute('data-index', i);
95
-
128
+
96
129
  var imp = slide.getAttribute('data-import'),
97
130
  imported = imp? this.getSlideById(imp) : null;
98
-
131
+
99
132
  this.order.push(imported? +imported.getAttribute('data-index') : i);
100
133
  }
101
-
134
+
102
135
  if(window.name === 'projector' && window.opener && opener.slideshow) {
103
136
  body.classList.add('projector');
104
137
  this.presenter = opener.slideshow;
105
138
  this.presenter.projector = this;
106
139
  }
107
-
140
+
108
141
  // Adjust the font-size when the window is resized
109
142
  addEventListener('resize', this, false);
110
-
143
+
111
144
  // In some browsers DOMContentLoaded is too early, so try again onload
112
145
  addEventListener('load', this, false);
113
-
146
+
114
147
  addEventListener('hashchange', this, false);
115
-
148
+
116
149
  // If there's already a hash, update current slide number...
117
150
  this.handleEvent({type: 'hashchange'});
118
-
151
+
119
152
  document.addEventListener('keyup', this, false);
120
153
  document.addEventListener('keydown', this, false);
121
-
154
+
155
+ document.addEventListener('touchstart', this, false);
156
+ document.addEventListener('touchmove', this, false);
157
+ document.addEventListener('touchend', this, false);
158
+ document.addEventListener('touchcancel', this, false);
159
+
122
160
  this.startEventSourceHandler('/remote/sub/events');
123
161
 
124
162
  // Process iframe slides
125
163
  $$('.slide[data-src]:empty').forEach(function(slide) {
126
164
  var iframe = document.createElement('iframe');
127
-
165
+
128
166
  iframe.setAttribute('data-src', slide.getAttribute('data-src'));
129
167
  slide.removeAttribute('data-src');
130
-
168
+
131
169
  slide.appendChild(iframe);
132
170
  });
133
-
171
+
134
172
  $$('.slide > iframe:only-child').forEach(function(iframe) {
135
173
  var slide = iframe.parentNode,
136
174
  src = iframe.src || iframe.getAttribute('data-src');
137
-
175
+
138
176
  slide.classList.add('iframe');
139
-
177
+
140
178
  if(!slide.classList.contains('notitle')) {
141
179
  var h = document.createElement('h1'),
142
180
  a = document.createElement('a'),
143
181
  title = iframe.title || slide.title || slide.getAttribute('data-title') || src.replace(/\/#?$/, '')
144
182
  .replace(/^\w+:\/\/w{0,3}\.?/, '');
145
-
183
+
146
184
  a.href = src;
147
185
  a.target = '_blank';
148
186
  a.textContent = title;
149
187
  h.appendChild(a);
150
-
188
+
151
189
  slide.appendChild(h);
152
190
  }
191
+ else {
192
+ var b = document.createElement('button');
193
+ b.className = 'onscreen-nav next';
194
+ b.textContent = 'Next ▶';
195
+ b.type = 'button';
196
+ b.onclick = function() { me.next(); };
197
+
198
+ slide.appendChild(b);
199
+ }
153
200
  });
154
201
  };
155
202
 
203
+ var horizontalDistanceThreshold = 30, // Swipe horizontal displacement must be more than this.
204
+ verticalDistanceThreshold = 75, // Swipe vertical displacement must be less than this.
205
+ startTouch,
206
+ stopTouch;
207
+
156
208
  self.prototype = {
157
209
  handleEvent: function(evt) {
158
- var me = this;
159
-
210
+
160
211
  switch(evt.type) {
161
212
  /**
162
213
  Keyboard navigation
@@ -166,42 +217,14 @@ self.prototype = {
166
217
  (Shift instead of Ctrl works too)
167
218
  */
168
219
  case 'keyup':
169
- if((evt.ctrlKey || evt.shiftKey) && !evt.altKey) {
220
+ if((evt.ctrlKey || evt.shiftKey) && !evt.altKey && !/^(?:input|textarea)$/i.test(document.activeElement.nodeName)) {
170
221
  switch(evt.keyCode) {
171
222
  case 71: // G
172
223
  var slide = prompt('Which slide?');
173
- me.goto(+slide? slide - 1 : slide);
224
+ this.goto(+slide? slide - 1 : slide);
174
225
  break;
175
226
  case 72: // H
176
- if(body.classList.contains('show-thumbnails')) {
177
- body.classList.remove('show-thumbnails');
178
- body.classList.remove('headers-only');
179
- }
180
- else {
181
- body.classList.add('show-thumbnails');
182
-
183
- if(!evt.shiftKey || !evt.ctrlKey) {
184
- body.classList.add('headers-only');
185
- }
186
-
187
- body.addEventListener('click', function(evt) {
188
- var slide = evt.target;
189
-
190
- while(slide && !slide.classList.contains('slide')) {
191
- slide = slide.parentNode;
192
- }
193
-
194
- if(slide) {
195
- me.goto(slide.id);
196
- setTimeout(function() { me.adjustFontSize(); }, 1000); // for Opera
197
- }
198
-
199
- body.classList.remove('show-thumbnails');
200
- body.classList.remove('headers-only');
201
-
202
- body.removeEventListener('click', arguments.callee);
203
- }, false);
204
- }
227
+ this.overview(evt);
205
228
  break;
206
229
  case 74: // J
207
230
  if(body.classList.contains('hide-elements')) {
@@ -214,10 +237,10 @@ self.prototype = {
214
237
  case 80: // P
215
238
  // Open new window for attendee view
216
239
  this.projector = open(location, 'projector');
217
-
240
+
218
241
  // Get the focus back
219
242
  window.focus();
220
-
243
+
221
244
  // Switch this one to presenter view
222
245
  body.classList.add('presenter');
223
246
  }
@@ -231,14 +254,14 @@ self.prototype = {
231
254
  Space/Up/Right arrow : Next item/slide
232
255
  Ctrl + Space/Up/Right arrow : Next slide
233
256
  Down/Left arrow : Previous item/slide
234
- Ctrl + Down/Left arrow : Previous slide
257
+ Ctrl + Down/Left arrow : Previous slide
235
258
  (Shift instead of Ctrl works too)
236
259
  */
237
260
  if((evt.target === body || evt.target === body.parentNode) && !evt.altKey) {
238
261
  if(evt.keyCode >= 32 && evt.keyCode <= 40) {
239
262
  evt.preventDefault();
240
263
  }
241
-
264
+
242
265
  switch(evt.keyCode) {
243
266
  case 33: //page up
244
267
  this.previous();
@@ -264,6 +287,29 @@ self.prototype = {
264
287
  }
265
288
  }
266
289
  break;
290
+ case 'touchstart':
291
+ evt.preventDefault(); // prevent image drag
292
+ data = event.touches ? event.touches[0] : event;
293
+ startTouch = { X: data.pageX, Y: data.pageY };
294
+ break;
295
+ case 'touchmove':
296
+ data = event.touches ? event.touches[0] : event;
297
+ stopTouch = { X: data.pageX, Y: data.pageY };
298
+ break;
299
+ case 'touchend':
300
+ if (!startTouch || !stopTouch) break;
301
+ if (Math.abs(startTouch.X - stopTouch.X) < horizontalDistanceThreshold) break;
302
+ if (Math.abs(startTouch.Y - stopTouch.Y) > verticalDistanceThreshold) break;
303
+ if (startTouch.X > stopTouch.X) {
304
+ this.previous();
305
+ } else {
306
+ this.next();
307
+ }
308
+ startTouch = stopTouch = null;
309
+ break;
310
+ case 'touchcancel':
311
+ startTouch = stopTouch = null;
312
+ break;
267
313
  case 'load':
268
314
  case 'resize':
269
315
  this.adjustFontSize();
@@ -272,30 +318,30 @@ self.prototype = {
272
318
  this.goto(location.hash.substr(1) || 0);
273
319
  }
274
320
  },
275
-
321
+
276
322
  start: function() {
277
323
  this.goto(0);
278
324
  },
279
-
325
+
280
326
  end: function() {
281
327
  this.goto(this.slides.length - 1);
282
328
  },
283
-
329
+
284
330
  /**
285
- @param hard {Boolean} Whether to advance to the next slide (true) or
331
+ @param hard {Boolean} Whether to advance to the next slide (true) or
286
332
  just the next step (which could very well be showing a list item)
287
333
  */
288
334
  next: function(hard) {
289
335
  if(!hard && this.items.length) {
290
336
  this.nextItem();
291
337
  }
292
- else {
338
+ else {
293
339
  this.goto(this.index + 1);
294
-
340
+
295
341
  this.item = 0;
296
-
342
+
297
343
  // Mark all items as not displayed, if there are any
298
- if(this.items.length) {
344
+ if(this.items.length) {
299
345
  for (var i=0; i<this.items.length; i++) {
300
346
  if(this.items[i].classList) {
301
347
  this.items[i].classList.remove('displayed');
@@ -305,7 +351,7 @@ self.prototype = {
305
351
  }
306
352
  }
307
353
  },
308
-
354
+
309
355
  nextItem: function() {
310
356
  if(this.item < this.items.length) {
311
357
  this.gotoItem(++this.item);
@@ -315,78 +361,76 @@ self.prototype = {
315
361
  this.next(true);
316
362
  }
317
363
  },
318
-
364
+
319
365
  previous: function(hard) {
320
366
  if(!hard && this.item > 0) {
321
367
  this.previousItem();
322
368
  }
323
- else {
369
+ else {
324
370
  this.goto(this.index - 1);
325
-
371
+
326
372
  this.item = this.items.length;
327
373
 
328
374
  // Mark all items as displayed, if there are any
329
- if(this.items.length) {
375
+ if(this.items.length) {
330
376
  for (var i=0; i<this.items.length; i++) {
331
377
  if(this.items[i].classList) {
332
378
  this.items[i].classList.add('displayed');
333
379
  }
334
380
  }
335
-
381
+
336
382
  // Mark the last one as current
337
383
  var lastItem = this.items[this.items.length - 1];
338
-
384
+
339
385
  lastItem.classList.remove('displayed');
340
386
  lastItem.classList.add('current');
341
387
  }
342
388
  }
343
389
  },
344
-
390
+
345
391
  previousItem: function() {
346
392
  this.gotoItem(--this.item);
347
393
  },
348
-
394
+
349
395
  getSlideById: function(id) {
350
396
  return $('.slide#' + id);
351
397
  },
352
-
398
+
353
399
  /**
354
400
  Go to an aribtary slide
355
401
  @param which {String|Integer} Which slide (identifier or slide number)
356
402
  */
357
403
  goto: function(which) {
358
404
  var slide;
359
-
405
+
360
406
  // We have to remove it to prevent multiple calls to goto messing up
361
407
  // our current item (and there's no point either, so we save on performance)
362
408
  window.removeEventListener('hashchange', this, false);
363
-
364
- var id;
365
-
366
- if(which + 0 === which && which in this.slides) {
409
+
410
+ if(which + 0 === which && which in this.slides) {
367
411
  // Argument is a valid slide number
368
412
  this.index = which;
369
- this.slide = this.order[which]
370
-
413
+ this.slide = this.order[which];
414
+
371
415
  slide = this.slides[this.slide];
372
-
416
+
373
417
  location.hash = '#' + slide.id;
374
418
  }
375
419
  else if(which + '' === which) { // Argument is a slide id
376
420
  slide = this.getSlideById(which);
377
-
421
+
378
422
  if(slide) {
379
423
  this.slide = this.index = +slide.getAttribute('data-index');
380
- location.hash = '#' + which;
424
+ location.hash = '#' + which;
381
425
  }
382
426
  }
383
-
427
+
384
428
  if(slide) { // Slide actually changed, perform any other tasks needed
385
429
  document.title = slide.getAttribute('data-title') || documentTitle;
386
-
430
+
387
431
  if(slide.classList.contains('iframe')) {
388
432
  var iframe = $('iframe', slide), src;
389
-
433
+
390
434
  if(!iframe.hasAttribute('src') && (src = iframe.getAttribute('data-src'))) {
391
435
  iframe.setAttribute('src', src);
392
436
  }
@@ -394,31 +438,31 @@ self.prototype = {
394
438
  else {
395
439
  this.adjustFontSize();
396
440
  }
397
-
441
+
398
442
  this.indicator.textContent = this.index + 1;
399
-
443
+
400
444
  // Update items collection
401
445
  this.items = $$('.delayed, .delayed-children > *', this.slides[this.slide]);
402
446
  this.items.sort(function(a, b){
403
- return (a.getAttribute('data-index') || 0) - (b.getAttribute('data-index') || 0)
447
+ return (a.getAttribute('data-index') || 0) - (b.getAttribute('data-index') || 0);
404
448
  });
405
449
  this.item = 0;
406
-
450
+
407
451
  this.projector && this.projector.goto(which);
408
-
452
+
409
453
  // Update next/previous
410
454
  for (var i=this.slides.length; i--;) {
411
455
  this.slides[i].classList.remove('previous');
412
456
  this.slides[i].classList.remove('next');
413
457
  }
414
-
458
+
415
459
  this.slides.previous = this.slides[this.order[this.index - 1]];
416
460
  this.slides.next = this.slides[this.order[this.index + 1]];
417
-
461
+
418
462
  this.slides.previous && this.slides.previous.classList.add('previous');
419
463
  this.slides.next && this.slides.next.classList.add('next');
420
464
  }
421
-
465
+
422
466
  // If you attach the listener immediately again then it will catch the event
423
467
  // We have to do it asynchronously
424
468
  var me = this;
@@ -426,30 +470,30 @@ self.prototype = {
426
470
  addEventListener('hashchange', me, false);
427
471
  }, 1000);
428
472
  },
429
-
473
+
430
474
  gotoItem: function(which) {
431
475
  this.item = which;
432
-
476
+
433
477
  var items = this.items, classes;
434
-
478
+
435
479
  for(var i=items.length; i-- > 0;) {
436
480
  classes = this.items[i].classList;
437
-
481
+
438
482
  classes.remove('current');
439
483
  classes.remove('displayed');
440
484
  }
441
-
485
+
442
486
  for(var i=this.item - 1; i-- > 0;) {
443
487
  this.items[i].classList.add('displayed');
444
488
  }
445
-
489
+
446
490
  if(this.item > 0) {
447
491
  this.items[this.item - 1].classList.add('current');
448
492
  }
449
-
493
+
450
494
  this.projector && this.projector.gotoItem(which);
451
495
  },
452
-
496
+
453
497
  adjustFontSize: function() {
454
498
  // Cache long lookup chains, for performance
455
499
  var htmlStyle = html.style,
@@ -457,38 +501,38 @@ self.prototype = {
457
501
  innerHeight = window.innerHeight,
458
502
  innerWidth = window.innerWidth,
459
503
  slide = this.slides[this.slide];
460
-
504
+
461
505
  // Clear previous styles
462
506
  htmlStyle.fontSize = '';
463
-
464
- if(body.classList.contains('show-thumbnails')
507
+
508
+ if(body.classList.contains('show-thumbnails')
465
509
  || slide.classList.contains('dont-resize')) {
466
510
  return;
467
511
  }
468
512
 
469
513
  for(
470
- var percent = 100;
514
+ var percent = 100;
471
515
  (scrollRoot.scrollHeight > innerHeight || scrollRoot.scrollWidth > innerWidth) && percent >= 35;
472
516
  percent-=5
473
517
  ) {
474
518
  htmlStyle.fontSize = percent + '%';
475
519
  }
476
-
520
+
477
521
  // Individual slide
478
522
 
479
523
  if(slide.clientHeight && slide.clientWidth) {
480
524
  // Strange FF bug: scrollHeight doesn't work properly with overflow:hidden
481
525
  var previousStyle = slide.getAttribute('style');
482
526
  slide.style.overflow = 'auto';
483
-
527
+
484
528
  for(
485
- ;
529
+ ;
486
530
  (slide.scrollHeight > slide.clientHeight || slide.scrollWidth > slide.clientWidth) && percent >= 35;
487
531
  percent--
488
532
  ) {
489
533
  htmlStyle.fontSize = percent + '%';
490
534
  }
491
-
535
+
492
536
  slide.setAttribute('style', previousStyle);
493
537
  }
494
538
 
@@ -497,15 +541,15 @@ self.prototype = {
497
541
  htmlStyle.fontSize = '';
498
542
  }
499
543
  },
500
-
544
+
501
545
  // Is the element on the current slide?
502
546
  onCurrent: function(element) {
503
547
  var slide = self.getSlide(element);
504
-
548
+
505
549
  if(slide) {
506
550
  return '#' + slide.id === location.hash;
507
551
  }
508
-
552
+
509
553
  return false;
510
554
  },
511
555
 
@@ -538,19 +582,19 @@ self.prototype = {
538
582
  };
539
583
 
540
584
  /**********************************************
541
- * Static methods
585
+ * Static methods
542
586
  **********************************************/
543
-
587
+
544
588
  // Helper method for plugins
545
589
  self.getSlide = function(element) {
546
590
  var slide = element;
547
-
591
+
548
592
  while (slide && slide.classList && !slide.classList.contains('slide')) {
549
593
  slide = slide.parentNode;
550
594
  }
551
-
595
+
552
596
  return slide;
553
- }
597
+ };
554
598
 
555
599
  })(document.head || document.getElementsByTagName('head')[0], document.body, document.documentElement);
556
600
 
@@ -562,14 +606,14 @@ addEventListener('load', function(){ // no idea why the timeout is needed
562
606
 
563
607
  for(var j=rulez.length; j--;) {
564
608
  var selector = rulez[j].selectorText.replace(/^|,/g, function($0) {
565
- return '#' + parentid + ' ' + $0
609
+ return '#' + parentid + ' ' + $0;
566
610
  });
567
-
611
+
568
612
  var cssText = rulez[j].cssText.replace(/^.+?{/, selector + '{');
569
-
613
+
570
614
  style.sheet.deleteRule(j);
571
615
  style.sheet.insertRule(cssText, j);
572
616
  }
573
-
617
+
574
618
  });
575
619
  });
@@ -0,0 +1,5 @@
1
+ This theme is just a template for creating new ones:
2
+
3
+ 1. Edit the html markup in `index.erb`
4
+ 2. Place your stylesheet in the `css` directory
5
+ 3. Place your javascript in the `js` directory
@@ -0,0 +1,42 @@
1
+ html, body, div, span, applet, object, iframe,
2
+ h1, h2, h3, h4, h5, h6, p, blockquote, pre,
3
+ a, abbr, acronym, address, big, cite, code,
4
+ del, dfn, em, img, ins, kbd, q, s, samp,
5
+ small, strike, strong, sub, sup, tt, var,
6
+ b, u, i, center,
7
+ dl, dt, dd, ol, ul, li,
8
+ fieldset, form, label, legend,
9
+ table, caption, tbody, tfoot, thead, tr, th, td,
10
+ article, aside, canvas, details, embed,
11
+ figure, figcaption, footer, header, hgroup,
12
+ menu, nav, output, ruby, section, summary,
13
+ time, mark, audio, video {
14
+ margin:0;
15
+ padding:0;
16
+ border:0;
17
+ font-size:100%;
18
+ font:inherit;
19
+ vertical-align:baseline;
20
+ }
21
+ article, aside, details, figcaption, figure,
22
+ footer, header, hgroup, menu, nav, section {
23
+ display:block;
24
+ }
25
+ body {
26
+ line-height:1;
27
+ }
28
+ ol, ul {
29
+ list-style:none;
30
+ }
31
+ blockquote, q {
32
+ quotes:none;
33
+ }
34
+ blockquote:before, blockquote:after,
35
+ q:before, q:after {
36
+ content:'';
37
+ content:none;
38
+ }
39
+ table {
40
+ border-collapse:collapse;
41
+ border-spacing:0;
42
+ }
@@ -0,0 +1,35 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
6
+ <title><%= meta.title %></title>
7
+ <% (theme.css + meta.css).each do |css| %>
8
+ <link rel="stylesheet" href="<%= css%>">
9
+ <% end %>
10
+ <link rel="stylesheet" href="css/pygments/solarized.css">
11
+ </head>
12
+ <body data-duration="<%= meta.duration %>">
13
+ <section>
14
+ <header class="slide">
15
+ <h1><%= meta.title %></h1>
16
+ <h2><%= meta.author %></h2>
17
+ </header>
18
+ </section>
19
+ <% sections.each do |section| %>
20
+ <section>
21
+ <header class="slide">
22
+ <h1><%= section.title %></h1>
23
+ </header>
24
+ <% section.slides.each do |slide| %>
25
+ <section class="slide <%= slide.classes %>">
26
+ <%= slide.html %>
27
+ </section>
28
+ <% end %>
29
+ </section>
30
+ <% end %>
31
+ <% (theme.js + meta.js).each do |js| %>
32
+ <script src="<%= js %>"></script>
33
+ <% end %>
34
+ </body>
35
+ </html>
@@ -0,0 +1,13 @@
1
+ // StyleFix 1.0.2 + PrefixFree 1.0.6 / Lea Verou / MIT license
2
+ (function(){function h(a,b){return[].slice.call((b||document).querySelectorAll(a))}if(window.addEventListener){var e=window.StyleFix={link:function(a){try{if("stylesheet"!==a.rel||a.hasAttribute("data-noprefix"))return}catch(b){return}var c=a.href||a.getAttribute("data-href"),f=c.replace(/[^\/]+$/,""),i=a.parentNode,d=new XMLHttpRequest,g;d.onreadystatechange=function(){4===d.readyState&&g()};g=function(){var b=d.responseText;if(b&&a.parentNode&&(!d.status||400>d.status||600<d.status)){b=e.fix(b,
3
+ !0,a);f&&(b=b.replace(/url\(\s*?((?:"|')?)(.+?)\1\s*?\)/gi,function(a,b,c){return!/^([a-z]{3,10}:|\/|#)/i.test(c)?'url("'+f+c+'")':a}),b=b.replace(RegExp("\\b(behavior:\\s*?url\\('?\"?)"+f,"gi"),"$1"));var c=document.createElement("style");c.textContent=b;c.media=a.media;c.disabled=a.disabled;c.setAttribute("data-href",a.getAttribute("href"));i.insertBefore(c,a);i.removeChild(a);c.media=a.media}};try{d.open("GET",c),d.send(null)}catch(k){"undefined"!=typeof XDomainRequest&&(d=new XDomainRequest,d.onerror=
4
+ d.onprogress=function(){},d.onload=g,d.open("GET",c),d.send(null))}a.setAttribute("data-inprogress","")},styleElement:function(a){if(!a.hasAttribute("data-noprefix")){var b=a.disabled;a.textContent=e.fix(a.textContent,!0,a);a.disabled=b}},styleAttribute:function(a){var b=a.getAttribute("style"),b=e.fix(b,!1,a);a.setAttribute("style",b)},process:function(){h('link[rel="stylesheet"]:not([data-inprogress])').forEach(StyleFix.link);h("style").forEach(StyleFix.styleElement);h("[style]").forEach(StyleFix.styleAttribute)},
5
+ register:function(a,b){(e.fixers=e.fixers||[]).splice(void 0===b?e.fixers.length:b,0,a)},fix:function(a,b){for(var c=0;c<e.fixers.length;c++)a=e.fixers[c](a,b)||a;return a},camelCase:function(a){return a.replace(/-([a-z])/g,function(a,c){return c.toUpperCase()}).replace("-","")},deCamelCase:function(a){return a.replace(/[A-Z]/g,function(a){return"-"+a.toLowerCase()})}};(function(){setTimeout(function(){h('link[rel="stylesheet"]').forEach(StyleFix.link)},10);document.addEventListener("DOMContentLoaded",
6
+ StyleFix.process,!1)})()}})();
7
+ (function(h){function e(b,c,f,i,d){b=a[b];b.length&&(b=RegExp(c+"("+b.join("|")+")"+f,"gi"),d=d.replace(b,i));return d}if(window.StyleFix&&window.getComputedStyle){var a=window.PrefixFree={prefixCSS:function(b,c){var f=a.prefix,b=e("functions","(\\s|:|,)","\\s*\\(","$1"+f+"$2(",b),b=e("keywords","(\\s|:)","(\\s|;|\\}|$)","$1"+f+"$2$3",b),b=e("properties","(^|\\{|\\s|;)","\\s*:","$1"+f+"$2:",b);if(a.properties.length)var i=RegExp("\\b("+a.properties.join("|")+")(?!:)","gi"),b=e("valueProperties","\\b",
8
+ ":(.+?);",function(a){return a.replace(i,f+"$1")},b);c&&(b=e("selectors","","\\b",a.prefixSelector,b),b=e("atrules","@","\\b","@"+f+"$1",b));return b=b.replace(RegExp("-"+f,"g"),"-")},property:function(b){return(a.properties.indexOf(b)?a.prefix:"")+b},value:function(b){b=e("functions","(^|\\s|,)","\\s*\\(","$1"+a.prefix+"$2(",b);return b=e("keywords","(^|\\s)","(\\s|$)","$1"+a.prefix+"$2$3",b)},prefixSelector:function(b){return b.replace(/^:{1,2}/,function(b){return b+a.prefix})},prefixProperty:function(b,
9
+ c){var f=a.prefix+b;return c?StyleFix.camelCase(f):f}};(function(){var b={},c=[],f=getComputedStyle(document.documentElement,null),i=document.createElement("div").style,d=function(a){if("-"===a.charAt(0)){c.push(a);var a=a.split("-"),d=a[1];for(b[d]=++b[d]||1;3<a.length;)a.pop(),d=a.join("-"),StyleFix.camelCase(d)in i&&-1===c.indexOf(d)&&c.push(d)}};if(0<f.length)for(var g=0;g<f.length;g++)d(f[g]);else for(var e in f)d(StyleFix.deCamelCase(e));var g=0,j,h;for(h in b)f=b[h],g<f&&(j=h,g=f);a.prefix=
10
+ "-"+j+"-";a.Prefix=StyleFix.camelCase(a.prefix);a.properties=[];for(g=0;g<c.length;g++)e=c[g],0===e.indexOf(a.prefix)&&(j=e.slice(a.prefix.length),StyleFix.camelCase(j)in i||a.properties.push(j));"Ms"==a.Prefix&&(!("transform"in i)&&!("MsTransform"in i)&&"msTransform"in i)&&a.properties.push("transform","transform-origin");a.properties.sort()})();(function(){function b(a,b){e[b]="";e[b]=a;return!!e[b]}var c={"linear-gradient":{property:"backgroundImage",params:"red, teal"},calc:{property:"width",
11
+ params:"1px + 5%"},element:{property:"backgroundImage",params:"#foo"},"cross-fade":{property:"backgroundImage",params:"url(a.png), url(b.png), 50%"}};c["repeating-linear-gradient"]=c["repeating-radial-gradient"]=c["radial-gradient"]=c["linear-gradient"];var f={initial:"color","zoom-in":"cursor","zoom-out":"cursor",box:"display",flexbox:"display","inline-flexbox":"display",flex:"display","inline-flex":"display"};a.functions=[];a.keywords=[];var e=document.createElement("div").style,d;for(d in c){var g=
12
+ c[d],h=g.property,g=d+"("+g.params+")";!b(g,h)&&b(a.prefix+g,h)&&a.functions.push(d)}for(var j in f)h=f[j],!b(j,h)&&b(a.prefix+j,h)&&a.keywords.push(j)})();(function(){function b(a){e.textContent=a+"{}";return!!e.sheet.cssRules.length}var c={":read-only":null,":read-write":null,":any-link":null,"::selection":null},f={keyframes:"name",viewport:null,document:'regexp(".")'};a.selectors=[];a.atrules=[];var e=h.appendChild(document.createElement("style")),d;for(d in c){var g=d+(c[d]?"("+c[d]+")":"");!b(g)&&
13
+ b(a.prefixSelector(g))&&a.selectors.push(d)}for(var k in f)g=k+" "+(f[k]||""),!b("@"+g)&&b("@"+a.prefix+g)&&a.atrules.push(k);h.removeChild(e)})();a.valueProperties=["transition","transition-property"];h.className+=" "+a.prefix;StyleFix.register(a.prefixCSS)}})(document.documentElement);
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: slide-em-up
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,22 +9,22 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-07-14 00:00:00.000000000 Z
12
+ date: 2012-10-06 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: goliath
16
- requirement: &71825500 !ruby/object:Gem::Requirement
16
+ requirement: &83664580 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
20
20
  - !ruby/object:Gem::Version
21
- version: 1.0.0.beta.1
21
+ version: '1.0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *71825500
24
+ version_requirements: *83664580
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: redcarpet
27
- requirement: &71825150 !ruby/object:Gem::Requirement
27
+ requirement: &83664170 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '2.1'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *71825150
35
+ version_requirements: *83664170
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: erubis
38
- requirement: &71824560 !ruby/object:Gem::Requirement
38
+ requirement: &83733670 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '2.7'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *71824560
46
+ version_requirements: *83733670
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: yajl-ruby
49
- requirement: &71824250 !ruby/object:Gem::Requirement
49
+ requirement: &83732800 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '1.1'
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *71824250
57
+ version_requirements: *83732800
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: albino
60
- requirement: &71824000 !ruby/object:Gem::Requirement
60
+ requirement: &83732260 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ~>
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: '1.3'
66
66
  type: :runtime
67
67
  prerelease: false
68
- version_requirements: *71824000
68
+ version_requirements: *83732260
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: minitest
71
- requirement: &71823740 !ruby/object:Gem::Requirement
71
+ requirement: &83731910 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ~>
@@ -76,7 +76,7 @@ dependencies:
76
76
  version: '2.3'
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *71823740
79
+ version_requirements: *83731910
80
80
  description: Slide'em up is a presentation tool that displays markdown-formatted slides
81
81
  email: bruno.michel@af83.com
82
82
  executables:
@@ -171,6 +171,10 @@ files:
171
171
  - themes/common/css/pygments/colorful.css
172
172
  - themes/common/css/pygments/native.css
173
173
  - themes/common/css/pygments/solarized.css
174
+ - themes/template/index.erb
175
+ - themes/template/js/prefixfree.min.js
176
+ - themes/template/css/reset.css
177
+ - themes/template/README
174
178
  - themes/reveal/index.erb
175
179
  - themes/reveal/js/head.min.js
176
180
  - themes/reveal/js/classList.js
@@ -228,5 +232,8 @@ rubyforge_project:
228
232
  rubygems_version: 1.8.12
229
233
  signing_key:
230
234
  specification_version: 3
231
- summary: Slide'em up is a presentation tool that displays markdown-formatted slides
235
+ summary: Slide'em up is a presentation tool. You write some slides in markdown, choose
236
+ a style and it displays it in HTML5. With a browser in full-screen, you can make
237
+ amazing presentations!
232
238
  test_files: []
239
+ has_rdoc: