slideshow-service 0.2.0 → 0.3.0

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.
Files changed (77) hide show
  1. checksums.yaml +4 -4
  2. data/Manifest.txt +71 -0
  3. data/lib/slideshow/service/public/slideshow-csss/classList.js +116 -0
  4. data/lib/slideshow/service/public/slideshow-csss/logo.svg +52 -0
  5. data/lib/slideshow/service/public/slideshow-csss/plugins/code-highlight.js +114 -0
  6. data/lib/slideshow/service/public/slideshow-csss/plugins/css-controls.js +40 -0
  7. data/lib/slideshow/service/public/slideshow-csss/plugins/css-edit.js +132 -0
  8. data/lib/slideshow/service/public/slideshow-csss/plugins/css-snippets.js +89 -0
  9. data/lib/slideshow/service/public/slideshow-csss/plugins/incrementable.js +94 -0
  10. data/lib/slideshow/service/public/slideshow-csss/prefixfree.min.js +10 -0
  11. data/lib/slideshow/service/public/slideshow-csss/reusable.css +118 -0
  12. data/lib/slideshow/service/public/slideshow-csss/slides.html +90 -0
  13. data/lib/slideshow/service/public/slideshow-csss/slideshow.css +282 -0
  14. data/lib/slideshow/service/public/slideshow-csss/slideshow.js +508 -0
  15. data/lib/slideshow/service/public/slideshow-csss/style.css +45 -0
  16. data/lib/slideshow/service/public/slideshow-csss/theme.css +247 -0
  17. data/lib/slideshow/service/public/slideshow-slidy/graphics/bullet-fold-dim.gif +0 -0
  18. data/lib/slideshow/service/public/slideshow-slidy/graphics/bullet-fold-dim.png +0 -0
  19. data/lib/slideshow/service/public/slideshow-slidy/graphics/bullet-fold.gif +0 -0
  20. data/lib/slideshow/service/public/slideshow-slidy/graphics/bullet-fold.png +0 -0
  21. data/lib/slideshow/service/public/slideshow-slidy/graphics/bullet-nofold-dim.gif +0 -0
  22. data/lib/slideshow/service/public/slideshow-slidy/graphics/bullet-nofold-dim.png +0 -0
  23. data/lib/slideshow/service/public/slideshow-slidy/graphics/bullet-nofold.gif +0 -0
  24. data/lib/slideshow/service/public/slideshow-slidy/graphics/bullet-nofold.png +0 -0
  25. data/lib/slideshow/service/public/slideshow-slidy/graphics/bullet-unfold-dim.gif +0 -0
  26. data/lib/slideshow/service/public/slideshow-slidy/graphics/bullet-unfold-dim.png +0 -0
  27. data/lib/slideshow/service/public/slideshow-slidy/graphics/bullet-unfold.gif +0 -0
  28. data/lib/slideshow/service/public/slideshow-slidy/graphics/bullet-unfold.png +0 -0
  29. data/lib/slideshow/service/public/slideshow-slidy/graphics/bullet.png +0 -0
  30. data/lib/slideshow/service/public/slideshow-slidy/graphics/example.png +0 -0
  31. data/lib/slideshow/service/public/slideshow-slidy/graphics/example.svg +223 -0
  32. data/lib/slideshow/service/public/slideshow-slidy/graphics/face1.gif +0 -0
  33. data/lib/slideshow/service/public/slideshow-slidy/graphics/face2.gif +0 -0
  34. data/lib/slideshow/service/public/slideshow-slidy/graphics/face3.gif +0 -0
  35. data/lib/slideshow/service/public/slideshow-slidy/graphics/face4.gif +0 -0
  36. data/lib/slideshow/service/public/slideshow-slidy/graphics/fold-bright.gif +0 -0
  37. data/lib/slideshow/service/public/slideshow-slidy/graphics/fold-dim.bmp +0 -0
  38. data/lib/slideshow/service/public/slideshow-slidy/graphics/fold-dim.gif +0 -0
  39. data/lib/slideshow/service/public/slideshow-slidy/graphics/fold.bmp +0 -0
  40. data/lib/slideshow/service/public/slideshow-slidy/graphics/fold.gif +0 -0
  41. data/lib/slideshow/service/public/slideshow-slidy/graphics/icon-blue.png +0 -0
  42. data/lib/slideshow/service/public/slideshow-slidy/graphics/keys2.jpg +0 -0
  43. data/lib/slideshow/service/public/slideshow-slidy/graphics/nofold-dim.bmp +0 -0
  44. data/lib/slideshow/service/public/slideshow-slidy/graphics/nofold-dim.gif +0 -0
  45. data/lib/slideshow/service/public/slideshow-slidy/graphics/nofold.bmp +0 -0
  46. data/lib/slideshow/service/public/slideshow-slidy/graphics/unfold-bright.gif +0 -0
  47. data/lib/slideshow/service/public/slideshow-slidy/graphics/unfold-dim.bmp +0 -0
  48. data/lib/slideshow/service/public/slideshow-slidy/graphics/unfold-dim.gif +0 -0
  49. data/lib/slideshow/service/public/slideshow-slidy/graphics/unfold.bmp +0 -0
  50. data/lib/slideshow/service/public/slideshow-slidy/graphics/unfold.gif +0 -0
  51. data/lib/slideshow/service/public/slideshow-slidy/graphics/w3c-logo-blue.gif +0 -0
  52. data/lib/slideshow/service/public/slideshow-slidy/graphics/w3c-logo-blue.svg +14 -0
  53. data/lib/slideshow/service/public/slideshow-slidy/graphics/w3c-logo-slanted.jpg +0 -0
  54. data/lib/slideshow/service/public/slideshow-slidy/graphics/w3c-logo-white.gif +0 -0
  55. data/lib/slideshow/service/public/slideshow-slidy/graphics/w3c-logo-white.svg +14 -0
  56. data/lib/slideshow/service/public/slideshow-slidy/help/help.html +80 -0
  57. data/lib/slideshow/service/public/slideshow-slidy/help/help.html.ca +52 -0
  58. data/lib/slideshow/service/public/slideshow-slidy/help/help.html.de +96 -0
  59. data/lib/slideshow/service/public/slideshow-slidy/help/help.html.en +81 -0
  60. data/lib/slideshow/service/public/slideshow-slidy/help/help.html.es +52 -0
  61. data/lib/slideshow/service/public/slideshow-slidy/help/help.html.fr +118 -0
  62. data/lib/slideshow/service/public/slideshow-slidy/help/help.html.hu +98 -0
  63. data/lib/slideshow/service/public/slideshow-slidy/help/help.html.nl +82 -0
  64. data/lib/slideshow/service/public/slideshow-slidy/help/help.html.pl +76 -0
  65. data/lib/slideshow/service/public/slideshow-slidy/help/help.html.pt-br +95 -0
  66. data/lib/slideshow/service/public/slideshow-slidy/help/help.html.pt_br +95 -0
  67. data/lib/slideshow/service/public/slideshow-slidy/help/help.html.sv +75 -0
  68. data/lib/slideshow/service/public/slideshow-slidy/help/help.pt-br.html +95 -0
  69. data/lib/slideshow/service/public/slideshow-slidy/scripts/slidy.js +2952 -0
  70. data/lib/slideshow/service/public/slideshow-slidy/slides.blank.html +26 -0
  71. data/lib/slideshow/service/public/slideshow-slidy/slides.w3c.html +62 -0
  72. data/lib/slideshow/service/public/slideshow-slidy/styles/slidy.css +401 -0
  73. data/lib/slideshow/service/public/slideshow-slidy/styles/w3c-blue.css +493 -0
  74. data/lib/slideshow/service/version.rb +1 -2
  75. data/lib/slideshow/service/views/_editor.erb +7 -4
  76. data/lib/slideshow/service.rb +47 -19
  77. metadata +73 -2
@@ -0,0 +1,508 @@
1
+ /**
2
+ * CSSS javascript code
3
+ * @author Lea Verou (http://leaverou.me)
4
+ * @version 2.0
5
+ */
6
+
7
+ /**
8
+ * Make the environment a bit friendlier
9
+ */
10
+ function $(expr, con) { return (con || document).querySelector(expr); }
11
+ function $$(expr, con) { return [].slice.call((con || document).querySelectorAll(expr)); }
12
+
13
+ (function(head, body){
14
+
15
+ // Check for classList support and include the polyfill if it's not supported
16
+ if(!('classList' in body)) {
17
+ var thisScript = $('script[src$="slideshow.js"]'),
18
+ script = document.createElement('script');
19
+ script.src = thisScript.src.replace(/\bslideshow\.js/, 'classList.js');
20
+ thisScript.parentNode.insertBefore(script, thisScript);
21
+ }
22
+
23
+ // Cache <title> element, we may need it for slides that don't have titles
24
+ var documentTitle = document.title + '';
25
+
26
+ var self = window.SlideShow = function(container, slide) {
27
+ var me = this;
28
+
29
+ // Set instance
30
+ if(!window.slideshow) {
31
+ window.slideshow = this;
32
+ }
33
+
34
+ this.container = container = container || body;
35
+
36
+ // Current slide
37
+ this.index = this.slide = slide || 0;
38
+
39
+ // Current .delayed item in the slide
40
+ this.item = 0;
41
+
42
+ // Create timer, if needed
43
+ this.duration = container.getAttribute('data-duration');
44
+
45
+ if(this.duration > 0) {
46
+ var timer = document.createElement('div');
47
+
48
+ timer.id = 'timer';
49
+ timer.setAttribute('style', PrefixFree.prefixCSS('transition: ' + this.duration * 60 + 's linear;'));
50
+ container.appendChild(timer);
51
+
52
+ setTimeout(function() {
53
+ timer.className = 'end';
54
+ }, 1);
55
+ }
56
+
57
+ // Create slide indicator
58
+ this.indicator = document.createElement('div');
59
+
60
+ this.indicator.id = 'indicator';
61
+ container.appendChild(this.indicator);
62
+
63
+ // Get the slide elements into an array
64
+ this.slides = $$('.slide', container);
65
+
66
+ // Order of the slides
67
+ this.order = [];
68
+
69
+ for(var i=0; i<this.slides.length; i++) {
70
+ var slide = this.slides[i]; // to speed up references
71
+
72
+ // Asign ids to slides that don't have one
73
+ if(!slide.id) {
74
+ slide.id = 'slide' + (i+1);
75
+ }
76
+
77
+ // Set data-title attribute to the title of the slide
78
+ if(!slide.title) {
79
+ // no title attribute, fetch title from heading(s)
80
+ var heading = $('hgroup', slide) || $('h1,h2,h3,h4,h5,h6', slide);
81
+
82
+ if(heading && heading.textContent.trim()) {
83
+ slide.setAttribute('data-title', heading.textContent);
84
+ }
85
+ }
86
+ else {
87
+ // The title attribute is set, use that
88
+ slide.setAttribute('data-title', slide.title);
89
+ slide.removeAttribute('title');
90
+ }
91
+
92
+ slide.setAttribute('data-index', i);
93
+
94
+ var imp = slide.getAttribute('data-import'),
95
+ imported = imp? this.getSlideById(imp) : null;
96
+
97
+ this.order.push(imported? +imported.getAttribute('data-index') : i);
98
+ }
99
+
100
+ if(window.name === 'projector' && window.opener && opener.slideshow) {
101
+ document.body.classList.add('projector');
102
+ this.presenter = opener.slideshow;
103
+ this.presenter.projector = this;
104
+ }
105
+
106
+ // Adjust the font-size when the window is resized
107
+ addEventListener('resize', this, false);
108
+
109
+ // In some browsers DOMContentLoaded is too early, so try again onload
110
+ addEventListener('load', this, false);
111
+
112
+ addEventListener('hashchange', this, false);
113
+
114
+ // If there's already a hash, update current slide number...
115
+ this.handleEvent({type: 'hashchange'});
116
+
117
+ document.addEventListener('keyup', this, false);
118
+ document.addEventListener('keydown', this, false);
119
+
120
+ // Rudimentary style[scoped] polyfill
121
+ $$('style[scoped]', container).forEach(function(style) {
122
+ var rulez = style.sheet.cssRules,
123
+ parentid = style.parentNode.id || self.getSlide(style).id;
124
+
125
+ for(var j=rulez.length; j--;) {
126
+ var cssText = rulez[j].cssText.replace(/^|,/g, function($0) {
127
+ return '#' + parentid + ' ' + $0
128
+ });
129
+
130
+ style.sheet.deleteRule(0);
131
+ style.sheet.insertRule(cssText, 0);
132
+ }
133
+ });
134
+
135
+ // Process iframe slides
136
+ $$('.slide > iframe:only-child', container).forEach(function(iframe) {
137
+ var slide = iframe.parentNode,
138
+ h = document.createElement('h1'),
139
+ a = document.createElement('a'),
140
+ src = iframe.src || iframe.getAttribute('data-src');
141
+
142
+ slide.classList.add('iframe');
143
+ slide.classList.add('dont-resize');
144
+
145
+ var title = iframe.title || src.replace(/\/#?$/, '')
146
+ .replace(/^\w+:\/\/w{0,3}\.?/, '');
147
+
148
+ a.href = iframe.src;
149
+ a.target = '_blank';
150
+ a.textContent = title;
151
+ h.appendChild(a);
152
+
153
+ slide.appendChild(h);
154
+ });
155
+ }
156
+
157
+ self.prototype = {
158
+ handleEvent: function(evt) {
159
+ switch(evt.type) {
160
+ /**
161
+ Keyboard navigation
162
+ Ctrl+G : Go to slide...
163
+ Ctrl+H : Show thumbnails and go to slide
164
+ Ctrl+P : Presenter view
165
+ (Shift instead of Ctrl works too)
166
+ */
167
+ case 'keyup':
168
+ if(evt.ctrlKey || evt.shiftKey) {
169
+ switch(evt.keyCode) {
170
+ case 71: // G
171
+ var slide = prompt('Which slide?');
172
+ me.goto(+slide? slide - 1 : slide);
173
+ break;
174
+ case 72: // H
175
+ if(body.classList.contains('show-thumbnails')) {
176
+ body.classList.remove('show-thumbnails');
177
+ body.classList.remove('headers-only');
178
+ }
179
+ else {
180
+ body.classList.add('show-thumbnails');
181
+
182
+ if(!evt.shiftKey || !evt.ctrlKey) {
183
+ body.classList.add('headers-only');
184
+ }
185
+
186
+ body.addEventListener('click', function(evt) {
187
+ var slide = evt.target;
188
+
189
+ while(slide && !slide.classList.contains('slide')) {
190
+ slide = slide.parentNode;
191
+ }
192
+
193
+ if(slide) {
194
+ this.goto(slide.id);
195
+ setTimeout(function() { me.adjustFontSize(); }, 1000); // for Opera
196
+ }
197
+
198
+ body.classList.remove('show-thumbnails');
199
+ body.classList.remove('headers-only');
200
+ }, false);
201
+ }
202
+ break;
203
+ case 74: // J
204
+ if(body.classList.contains('hide-elements')) {
205
+ body.classList.remove('hide-elements');
206
+ }
207
+ else {
208
+ body.classList.add('hide-elements');
209
+ }
210
+ break;
211
+ case 80: // P
212
+ // Open new window for attendee view
213
+ this.projector = open(location, 'projector');
214
+
215
+ // Get the focus back
216
+ window.focus();
217
+
218
+ // Switch this one to presenter view
219
+ body.classList.add('presenter');
220
+ }
221
+ }
222
+ break;
223
+ case 'keydown':
224
+ /**
225
+ Keyboard navigation
226
+ Home : First slide
227
+ End : Last slide
228
+ Space/Up/Right arrow : Next item/slide
229
+ Ctrl + Space/Up/Right arrow : Next slide
230
+ Down/Left arrow : Previous item/slide
231
+ Ctrl + Down/Left arrow : Previous slide
232
+ (Shift instead of Ctrl works too)
233
+ */
234
+ if(evt.target === body || evt.target === body.parentNode || evt.altKey) {
235
+ if(evt.keyCode >= 32 && evt.keyCode <= 40) {
236
+ evt.preventDefault();
237
+ }
238
+
239
+ switch(evt.keyCode) {
240
+ case 33: //page up
241
+ this.previous();
242
+ break;
243
+ case 34: //page down
244
+ this.next();
245
+ break;
246
+ case 35: // end
247
+ this.end();
248
+ break;
249
+ case 36: // home
250
+ this.start();
251
+ break;
252
+ case 37: // <-
253
+ case 38: // up arrow
254
+ this.previous(evt.ctrlKey || evt.shiftKey);
255
+ break;
256
+ case 32: // space
257
+ case 39: // ->
258
+ case 40: // down arrow
259
+ this.next(evt.ctrlKey || evt.shiftKey);
260
+ break;
261
+ }
262
+ }
263
+ break;
264
+ case 'load':
265
+ case 'resize':
266
+ this.adjustFontSize();
267
+ break;
268
+ case 'hashchange':
269
+ this.goto(location.hash.substr(1) || 0);
270
+ }
271
+ },
272
+
273
+ start: function() {
274
+ this.goto(0);
275
+ },
276
+
277
+ end: function() {
278
+ this.goto(this.slides.length - 1);
279
+ },
280
+
281
+ /**
282
+ @param hard {Boolean} Whether to advance to the next slide (true) or
283
+ just the next step (which could very well be showing a list item)
284
+ */
285
+ next: function(hard) {
286
+ if(!hard && this.items.length) {
287
+ this.nextItem();
288
+ }
289
+ else {
290
+ this.goto(this.index + 1);
291
+
292
+ this.item = 0;
293
+
294
+ // Mark all items as not displayed, if there are any
295
+ if(this.items.length) {
296
+ for (var i=0; i<this.items.length; i++) {
297
+ if(this.items[i].classList) {
298
+ this.items[i].classList.remove('displayed');
299
+ this.items[i].classList.remove('current');
300
+ }
301
+ }
302
+ }
303
+ }
304
+ },
305
+
306
+ nextItem: function() {
307
+ if(this.item < this.items.length) {
308
+ this.gotoItem(++this.item);
309
+ }
310
+ else {
311
+ this.item = 0;
312
+ this.next(true);
313
+ }
314
+ },
315
+
316
+ previous: function(hard) {
317
+ if(!hard && this.item > 0) {
318
+ this.previousItem();
319
+ }
320
+ else {
321
+ this.goto(this.index - 1);
322
+
323
+ this.item = this.items.length;
324
+
325
+ // Mark all items as displayed, if there are any
326
+ if(this.items.length) {
327
+ for (var i=0; i<this.items.length; i++) {
328
+ if(this.items[i].classList) {
329
+ this.items[i].classList.add('displayed');
330
+ }
331
+ }
332
+
333
+ // Mark the last one as current
334
+ var lastItem = this.items[this.items.length - 1];
335
+
336
+ lastItem.classList.remove('displayed');
337
+ lastItem.classList.add('current');
338
+ }
339
+ }
340
+ },
341
+
342
+ previousItem: function() {
343
+ this.gotoItem(--this.item);
344
+ },
345
+
346
+ getSlideById: function(id) {
347
+ return $('.slide#' + id, this.container);
348
+ },
349
+
350
+ /**
351
+ Go to an aribtary slide
352
+ @param which {String|Integer} Which slide (identifier or slide number)
353
+ */
354
+ goto: function(which) {
355
+ var slide;
356
+
357
+ // We have to remove it to prevent multiple calls to goto messing up
358
+ // our current item (and there's no point either, so we save on performance)
359
+ window.removeEventListener('hashchange', this, false);
360
+
361
+ var id;
362
+
363
+ if(which + 0 === which && which in this.slides) {
364
+ // Argument is a valid slide number
365
+ this.index = which;
366
+ this.slide = this.order[which]
367
+
368
+ slide = this.slides[this.slide];
369
+
370
+ location.hash = '#' + slide.id;
371
+ }
372
+ else if(which + '' === which) { // Argument is a slide id
373
+ slide = this.getSlideById(which);
374
+
375
+ if(slide) {
376
+ this.slide = this.index = +slide.getAttribute('data-index');
377
+ location.hash = '#' + which;
378
+ }
379
+ }
380
+
381
+ if(slide) { // Slide actually changed, perform any other tasks needed
382
+ document.title = slide.getAttribute('data-title') || documentTitle;
383
+
384
+ this.adjustFontSize();
385
+
386
+ this.indicator.textContent = this.index;
387
+
388
+ // Update items collection
389
+ this.items = $$('.delayed, .delayed-children > *', this.slides[this.slide]);
390
+ this.item = 0;
391
+
392
+ this.projector && this.projector.goto(which);
393
+
394
+ // Update next/previous
395
+ for (var i=this.slides.length; i--;) {
396
+ this.slides[i].classList.remove('previous');
397
+ this.slides[i].classList.remove('next');
398
+ }
399
+
400
+ this.slides.previous = this.slides[this.order[this.index - 1]];
401
+ this.slides.next = this.slides[this.order[this.index + 1]];
402
+
403
+ this.slides.previous && this.slides.previous.classList.add('previous');
404
+ this.slides.next && this.slides.next.classList.add('next');
405
+ }
406
+
407
+ // If you attach the listener immediately again then it will catch the event
408
+ // We have to do it asynchronously
409
+ var me = this;
410
+ setTimeout(function() {
411
+ addEventListener('hashchange', me, false);
412
+ }, 1000);
413
+ },
414
+
415
+ gotoItem: function(which) {
416
+ this.item = which;
417
+
418
+ var items = this.items, classes;
419
+
420
+ for(var i=items.length; i-- > 0;) {
421
+ classes = this.items[i].classList;
422
+
423
+ classes.remove('current');
424
+ classes.remove('displayed');
425
+ }
426
+
427
+ for(var i=this.item - 1; i-- > 0;) {
428
+ this.items[i].classList.add('displayed');
429
+ }
430
+
431
+ if(this.item > 0) {
432
+ this.items[this.item - 1].classList.add('current');
433
+ }
434
+
435
+ this.projector && this.projector.gotoItem(which);
436
+ },
437
+
438
+ adjustFontSize: function() {
439
+ // Cache long lookup chains, for performance
440
+ var bodyStyle = body.style,
441
+ scrollRoot = document[document.documentElement.scrollHeight? 'documentElement' : 'body'],
442
+ innerHeight = window.innerHeight,
443
+ innerWidth = window.innerWidth,
444
+ slide = this.slides[this.slide];
445
+
446
+ // Clear previous styles
447
+ bodyStyle.fontSize = '';
448
+
449
+ if(body.classList.contains('show-thumbnails')
450
+ || slide.classList.contains('dont-resize')) {
451
+ return;
452
+ }
453
+
454
+ for(
455
+ var percent = 100;
456
+ (scrollRoot.scrollHeight > innerHeight || scrollRoot.scrollWidth > innerWidth) && percent >= 35;
457
+ percent-=5
458
+ ) {
459
+ bodyStyle.fontSize = percent + '%';
460
+ }
461
+
462
+ // Individual slide
463
+
464
+ if(slide.clientHeight && slide.clientWidth) {
465
+ // Strange FF bug: scrollHeight doesn't work properly with overflow:hidden
466
+ var previousStyle = slide.getAttribute('style');
467
+ slide.style.overflow = 'auto';
468
+
469
+ for(
470
+ ;
471
+ (slide.scrollHeight > slide.clientHeight || slide.scrollWidth > slide.clientWidth) && percent >= 35;
472
+ percent--
473
+ ) {
474
+ bodyStyle.fontSize = percent + '%';
475
+ }
476
+
477
+ slide.setAttribute('style', previousStyle);
478
+ }
479
+ },
480
+
481
+ // Is the element on the current slide?
482
+ onCurrent: function(element) {
483
+ var slide = self.getSlide(element);
484
+
485
+ if(slide) {
486
+ return '#' + slide.id === location.hash;
487
+ }
488
+
489
+ return false;
490
+ }
491
+ };
492
+
493
+ /**********************************************
494
+ * Static methods
495
+ **********************************************/
496
+
497
+ // Helper method for plugins
498
+ self.getSlide = function(element) {
499
+ var slide = element;
500
+
501
+ while (slide && slide.classList && !slide.classList.contains('slide')) {
502
+ slide = slide.parentNode;
503
+ }
504
+
505
+ return slide;
506
+ }
507
+
508
+ })(document.head || document.getElementsByTagName('head')[0], document.body);
@@ -0,0 +1,45 @@
1
+ #intro {
2
+ background: rgba(0,0,0,.7);
3
+ padding: 0;
4
+ border: 0;
5
+ }
6
+
7
+ #intro h1 {
8
+ width: 60%;
9
+ min-height: 500px;
10
+ margin: 5% auto 0;
11
+ }
12
+
13
+ #intro .attribution {
14
+ font-family: Helvetica, sans-serif;
15
+ font-weight: bold;
16
+ text-align: center;
17
+ font-size: 100%;
18
+ /* line-height: .3; */
19
+ /* color: rgba(0,0,0,.7); */
20
+ text-shadow: none;
21
+ /* background: url(img/rainbow-wood.jpg) bottom; */
22
+ padding:.6em 0 0;
23
+ overflow: hidden;
24
+ }
25
+
26
+
27
+ #css-controls-demo label {
28
+ display: block;
29
+ }
30
+
31
+ @media only screen and (-webkit-min-device-pixel-ratio:0) {
32
+ /* hack to avoid using the Object element in Safari/WebKit, due to WebKit Bug 27190 */
33
+ object[type="image/svg+xml"] {
34
+ display: none;
35
+ }
36
+
37
+ #intro h1 {
38
+ background: url(logo.svg) no-repeat center;
39
+ background-size:100% auto;
40
+ }
41
+ }
42
+
43
+ /*
44
+ {{ more_content_for_css }}
45
+ */