slide-em-up 0.3.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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: