showoff 0.16.2 → 0.17.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: bcb7404f722269ce7b4c571c0a7d34c72f76d684
4
- data.tar.gz: 7a2b4b825af14a88c58fccd9a851f51587894d9f
3
+ metadata.gz: 210a91a071a71b8ec4de4b9c128917eb19eb1f2c
4
+ data.tar.gz: f0cc7f2e1efc78af6bc92dfea9726d45db035425
5
5
  SHA512:
6
- metadata.gz: 180720b95f90f0948642258fca4c84327da441b85d7b23bb00203272ee05c7ed07c85af8665a5938c5c1b8ca683e98887aa1b98514ae4b59d32c9e8dde41af2e
7
- data.tar.gz: 38036fa41718cf12953dd2db5a32cdc2b05840c11fea9652dfe8a525b0a095238a97bffbf643ddd5d4ea1ac57b0b2ce5af89929c7710761467e6323169dd3167
6
+ metadata.gz: e62e8471ed1070766e8cf84d5387403d7a97ab245dabd5125595b5d986d73ab0b79ceb20ff0abfba06919b4ba9cfa45e45fcdea3b651a6a0fb4937ba17e6d239
7
+ data.tar.gz: 7c11b48e407c3fe975924e14a00a18ada6d74781029186f84e87d731ac5d0cd119272ff78a6ea0094c83e5fbb924bb017584ddb5271b76fce72caa2ee91050e5
data/lib/showoff.rb CHANGED
@@ -236,17 +236,6 @@ class ShowOff < Sinatra::Application
236
236
  end
237
237
 
238
238
  helpers do
239
- def load_section_files(section)
240
- section = File.join(settings.pres_dir, section)
241
- files = if File.directory? section
242
- Dir.glob("#{section}/**/*").sort
243
- else
244
- Array(section)
245
- end
246
- @logger.debug files
247
- files
248
- end
249
-
250
239
  def css_files
251
240
  Dir.glob("#{settings.pres_dir}/*.css").map { |path| File.basename(path) }
252
241
  end
@@ -297,7 +286,7 @@ class ShowOff < Sinatra::Application
297
286
  end
298
287
  end
299
288
 
300
- def process_markdown(name, content, opts={:static=>false, :pdf=>false, :print=>false, :toc=>false, :supplemental=>nil, :section=>nil})
289
+ def process_markdown(name, section, content, opts={:static=>false, :pdf=>false, :print=>false, :toc=>false, :supplemental=>nil, :section=>nil})
301
290
  if settings.encoding and content.respond_to?(:force_encoding)
302
291
  content.force_encoding(settings.encoding)
303
292
  end
@@ -393,7 +382,7 @@ class ShowOff < Sinatra::Application
393
382
 
394
383
  # create html for the slide
395
384
  classes = content_classes.join(' ')
396
- content = "<div"
385
+ content = "<div data-section=\"#{section}\" data-title=\"#{File.basename(name)}\""
397
386
  content += " id=\"#{id}\"" if id
398
387
  content += " style=\"background-image: url('file/#{slide.bg}');\"" if slide.bg
399
388
  content += " class=\"slide #{classes}\" data-transition=\"#{transition}\">"
@@ -625,7 +614,7 @@ class ShowOff < Sinatra::Application
625
614
  end
626
615
 
627
616
  # swap out the tag, if found, with the table of contents
628
- doc.at('p:contains("~~~TOC~~~")').replace(toc)
617
+ doc.at('p:contains("~~~TOC~~~")').replace(toc) rescue nil
629
618
  end
630
619
 
631
620
  doc.css('.slide.glossary .content').each do |glossary|
@@ -1017,28 +1006,26 @@ class ShowOff < Sinatra::Application
1017
1006
  def get_slides_html(opts={:static=>false, :pdf=>false, :toc=>false, :supplemental=>nil, :section=>nil})
1018
1007
 
1019
1008
  sections = ShowOffUtils.showoff_sections(settings.pres_dir, @logger)
1020
- files = []
1021
1009
  if sections
1022
1010
  data = ''
1023
- sections.each do |section|
1024
- if section =~ /^#/
1025
- name = section.each_line.first.gsub(/^#*/,'').strip
1026
- data << process_markdown(name, "<!SLIDE subsection>\n" + section, opts)
1027
- else
1028
- files = []
1029
- files << load_section_files(section)
1030
- files = files.flatten
1031
- files = files.select { |f| f =~ /.md$/ }
1032
- files.each do |f|
1033
- fname = f.gsub(settings.pres_dir + '/', '').gsub('.md', '')
1034
- begin
1035
- data << process_markdown(fname, File.read(f), opts)
1036
- rescue Errno::ENOENT => e
1037
- @logger.error e.message
1038
- data << process_markdown(fname, "!SLIDE\n# Missing File!\n## #{fname}", opts)
1039
- end
1011
+ sections.each do |section, slides|
1012
+ slides.each do |filename|
1013
+ next unless filename.end_with? '.md'
1014
+ path = filename.chomp('.md') # TODO: I don't know why we do this silly thing
1015
+ begin
1016
+ data << process_markdown(path, section, File.read(filename), opts)
1017
+ rescue Errno::ENOENT => e
1018
+ @logger.error e.message
1019
+ data << process_markdown(path, section, "!SLIDE\n# Missing File!\n## #{fname}", opts)
1040
1020
  end
1041
1021
  end
1022
+
1023
+ # I don't know what this part was supposed to do
1024
+ # if section =~ /^#/
1025
+ # name = section.each_line.first.gsub(/^#*/,'').strip
1026
+ # data << process_markdown(name, "<!SLIDE subsection>\n" + section, opts)
1027
+ # else
1028
+
1042
1029
  end
1043
1030
  end
1044
1031
  process_content_for_all_slides(data, @slide_count, opts)
@@ -1104,11 +1091,15 @@ class ShowOff < Sinatra::Application
1104
1091
  @edit = settings.showoff_config['edit'] if @review
1105
1092
 
1106
1093
  # store a cookie to tell clients apart. More reliable than using IP due to proxies, etc.
1107
- unless request.cookies['client_id']
1094
+ if request.nil? # when running showoff static
1108
1095
  @client_id = guid()
1109
- response.set_cookie('client_id', @client_id)
1110
1096
  else
1111
- @client_id = request.cookies['client_id']
1097
+ if request.cookies['client_id']
1098
+ @client_id = request.cookies['client_id']
1099
+ else
1100
+ @client_id = guid()
1101
+ response.set_cookie('client_id', @client_id)
1102
+ end
1112
1103
  end
1113
1104
 
1114
1105
  erb :index
@@ -1428,7 +1419,7 @@ class ShowOff < Sinatra::Application
1428
1419
  content = content.split(/^\<?!SLIDE/m).reject { |sl| sl.empty? }[num-1]
1429
1420
  end
1430
1421
 
1431
- html = process_markdown(slide, content, {})
1422
+ html = process_markdown(slide, '', content, {})
1432
1423
  doc = Nokogiri::HTML::DocumentFragment.parse(html)
1433
1424
 
1434
1425
  if index == 'all'
@@ -1,3 +1,3 @@
1
1
  # No namespace here since ShowOff is a class and I'd have to inherit from
2
2
  # Sinatra::Application (which we don't want to load here)
3
- SHOWOFF_VERSION = '0.16.2'
3
+ SHOWOFF_VERSION = '0.17.0'
data/lib/showoff_utils.rb CHANGED
@@ -76,7 +76,7 @@ class ShowOffUtils
76
76
  FileUtils.mkdir_p('_files/share')
77
77
  FileUtils.mkdir_p('_images')
78
78
 
79
- self.showoff_sections('.').each do |filename|
79
+ self.showoff_slide_files('.').each do |filename|
80
80
  next if File.exist? filename
81
81
 
82
82
  puts "Creating: #{filename}"
@@ -104,15 +104,7 @@ class ShowOffUtils
104
104
  errors = []
105
105
 
106
106
  # get a list of actual filenames
107
- self.showoff_sections('.').each do |section|
108
- if File.directory?(section)
109
- files << showoff.load_section_files(section)
110
- else
111
- files << section
112
- end
113
- end
114
-
115
- files.flatten!
107
+ files = self.showoff_slide_files('.')
116
108
  files.each do |filename|
117
109
  unless File.exist? filename
118
110
  errors << "Missing path: #{filename}"
@@ -405,57 +397,95 @@ class ShowOffUtils
405
397
  logger.level = Logger::WARN
406
398
  end
407
399
 
408
- index = File.join(dir, ShowOffUtils.presentation_config_file)
409
- sections = ["."] # default boring showoff.json
400
+ index = File.join(dir, ShowOffUtils.presentation_config_file)
401
+ begin
402
+ data = JSON.parse(File.read(index)) rescue ["."] # default boring showoff.json
403
+ logger.debug data
404
+ if data.is_a?(Hash)
405
+ sections = data['sections'] if data.include? 'sections'
406
+ else
407
+ sections = data
408
+ end
410
409
 
411
- if File.exist?(index)
412
- begin
413
- data = JSON.parse(File.read(index))
414
- logger.debug data
415
- if data.is_a?(Hash)
416
- sections = data['sections'] if data.include? 'sections'
417
- else
418
- sections = data
410
+ if sections.is_a? Array
411
+ sections = showoff_legacy_sections(sections)
412
+ elsif sections.is_a? Hash
413
+ raise "Named sections are unsupported on Ruby versions less than 1.9." if RUBY_VERSION.start_with? '1.8'
414
+ sections.each do |key, value|
415
+ next if value.is_a? Array
416
+ cwd = File.expand_path(dir)
417
+ path = File.dirname(value)
418
+ data = JSON.parse(File.read(value))
419
+ raise "The section file #{value} must contain an array of filenames." unless data.is_a? Array
420
+
421
+ # get relative paths to each slide in the array
422
+ sections[key] = data.map do |filename|
423
+ File.expand_path("#{path}/#{filename}").sub(/^#{cwd}\//, '')
424
+ end
419
425
  end
426
+ else
427
+ raise "The `sections` key must be an Array or Hash, not a #{sections.class}."
428
+ end
420
429
 
421
- # each entry in sections can be:
422
- # - "filename.md"
423
- # - { "section": "filename.md" }
424
- # - { "section": [ "array.md, "of.md, "files.md"] }
425
- # - { "include": "sections.json" }
426
- sections = sections.map do |entry|
427
- next entry if entry.is_a? String
428
- next nil unless entry.is_a? Hash
429
-
430
- next entry['section'] if entry.include? 'section'
431
-
432
- section = nil
433
- if entry.include? 'include'
434
- file = entry['include']
435
- path = File.dirname(file)
436
- data = JSON.parse(File.read(file))
437
- if data.is_a? Array
438
- if path == '.'
439
- section = data
440
- else
441
- section = data.map do |source|
442
- "#{path}/#{source}"
443
- end
444
- end
430
+ rescue => e
431
+ logger.error "There was a problem with the presentation file #{index}"
432
+ logger.error e.message
433
+ logger.debug e.backtrace
434
+ sections = {}
435
+ end
436
+
437
+ sections
438
+ end
439
+
440
+ def self.showoff_legacy_sections(data)
441
+ # each entry in sections can be:
442
+ # - "filename.md"
443
+ # - { "section": "filename.md" }
444
+ # - { "section": [ "array.md, "of.md, "files.md"] }
445
+ # - { "include": "sections.json" }
446
+ sections = {}
447
+ data.map do |entry|
448
+ if entry.is_a? String
449
+ if File.directory? entry
450
+ next Dir.glob("#{entry}/**/*.md").sort
451
+ else
452
+ next entry
453
+ end
454
+ end
455
+ next nil unless entry.is_a? Hash
456
+ next entry['section'] if entry.include? 'section'
457
+
458
+ section = nil
459
+ if entry.include? 'include'
460
+ file = entry['include']
461
+ path = File.dirname(file)
462
+ data = JSON.parse(File.read(file))
463
+ if data.is_a? Array
464
+ if path == '.'
465
+ section = data
466
+ else
467
+ section = data.map do |source|
468
+ "#{path}/#{source}"
445
469
  end
446
470
  end
447
-
448
- section
449
471
  end
450
- rescue => e
451
- logger.error "There was a problem with the presentation file #{index}"
452
- logger.error e.message
453
- logger.debug e.backtrace
454
- sections = []
455
472
  end
473
+
474
+ section
475
+ end.flatten.compact.each do |filename|
476
+ # We do this in two passes simply because most of it was already done
477
+ # and I don't want to waste time on legacy functionality.
478
+ path = File.dirname(filename)
479
+
480
+ sections[path] ||= []
481
+ sections[path] << filename
456
482
  end
483
+ sections
484
+ end
457
485
 
458
- sections.flatten.compact
486
+ def self.showoff_slide_files(dir, logger = nil)
487
+ data = showoff_sections(dir, logger)
488
+ data.map { |key, value| value }.flatten
459
489
  end
460
490
 
461
491
  def self.showoff_title(dir = '.')
@@ -13,54 +13,58 @@
13
13
  #timerSection,
14
14
  #statusbar,
15
15
  #questions,
16
- #notes {
16
+ #notes,
17
+ #topbar,
18
+ #presenterPopup {
17
19
  font-size: .8em;
18
20
  }
19
21
 
22
+ #topbar,
23
+ #topbar a,
24
+ #topbar .ui-widget,
25
+ #presenterPopup,
26
+ #notes-wrapper {
27
+ color: #ffffff;
28
+ background-color: #546E7A;
29
+ }
30
+
20
31
  #topbar {
21
32
  display: flex;
22
33
  flex-flow: row;
23
- line-height: 24px;
24
- height: 24px;
25
- background: #222222;
26
- font-size: .55em;
27
- color: #fff;
34
+ line-height: 3em;
35
+ height: 3em;
36
+ box-shadow:0 0 1em rgba(0,0,0,0.35);
37
+ z-index: 3;
28
38
  }
29
39
 
30
40
  #topbar a,
31
- #topbar select {
41
+ #topbar .ui-widget {
32
42
  text-decoration: none;
33
- color: #fff;
34
- background: #222222;
35
43
  }
36
44
 
37
- #topbar a:hover,
38
- #topbar select:hover {
39
- background-color: #555;
45
+ #topbar a i {
46
+ padding-left: .25em;
40
47
  }
41
48
 
42
- #topbar .fa {
43
- color: #8affeb;
49
+ #topbar a:hover,
50
+ #topbar .ui-widget:hover {
51
+ background-color: #263238;
44
52
  }
45
- #topbar #close-sidebar {
46
- font-size: 16px;
47
- padding: 3px 6px;
53
+
54
+ #close-sidebar {
55
+ padding: .25em;
48
56
  transition: all 200ms;
49
57
  }
50
- #topbar #close-sidebar.disabled {
58
+ #close-sidebar.disabled {
51
59
  color: grey;
52
60
  }
53
- #topbar #close-sidebar.disabled:hover {
61
+ #close-sidebar.disabled:hover {
54
62
  background-color: transparent;
55
63
  cursor: default;
56
64
  }
57
65
 
58
66
  #slideSource {
59
- display: flex;
60
- flex-shrink: 1;
61
- white-space: nowrap;
62
- overflow: hidden;
63
- margin: 0 0.5em;
67
+ float: right;
64
68
  }
65
69
 
66
70
  #links {
@@ -69,14 +73,22 @@
69
73
  margin: 0 0 0 auto;
70
74
  }
71
75
 
72
- #links a {
73
- border: 1px solid #ccc;
74
- border-radius: 0.5em;
75
- padding: .35em;
76
+ #links a,
77
+ #topbar .ui-widget {
78
+ display: inline-block;
79
+ padding: 0 1em;
80
+ }
81
+
82
+ #topbar .ui-button {
83
+ border: none;
84
+ border-radius: 0;
85
+ line-height: 3em;
86
+ margin-top: -1px; /* hell if I know why, but probably somewhere in jquery-ui */
76
87
  }
77
88
 
78
- #links a.enabled {
79
- background-color: #003d96;
89
+ #links a.enabled,
90
+ #topbar .ui-state-active {
91
+ background-color: #263238;
80
92
  }
81
93
  #links a.warning {
82
94
  background-color: #8e030a;
@@ -90,25 +102,20 @@
90
102
  margin: 0 0.5em;
91
103
  }
92
104
 
93
- #presenterPopup,
94
- #nextWindowConfirmation {
105
+ #presenterPopup {
95
106
  display: none;
96
107
  position: absolute;
97
108
  z-index: 2147483647;
98
- top: 24px;
109
+ top: 3em;
99
110
  left: 25%;
100
111
  max-height: 80%;
101
112
  width: 50%;
113
+ padding-bottom: 1em;
102
114
  border-radius: 0 0 .5em .5em;
103
- border-bottom: 8px solid #222222;
104
- background-color: #222222;
105
- color: #ffffff;
106
- font-size: .8em;
107
115
  overflow: auto;
108
116
  }
109
117
 
110
- #presenterPopup a,
111
- #nextWindowConfirmation a {
118
+ #presenterPopup a {
112
119
  color: #ffffff;
113
120
  }
114
121
 
@@ -116,20 +123,6 @@
116
123
  color: #000;
117
124
  }
118
125
 
119
- #nextWindowConfirmation {
120
- right: 0.25em;
121
- left: auto;
122
- width: 14em;
123
- }
124
- #nextWindowConfirmation p {
125
- margin: 0.25em;
126
- }
127
- #nextWindowConfirmation input {
128
- float: right;
129
- margin: 0.25em;
130
- }
131
-
132
-
133
126
  #main {
134
127
  display: -webkit-flex;
135
128
  display: flex;
@@ -153,7 +146,8 @@
153
146
  padding: 0;
154
147
  margin: 0;
155
148
  background-color: #fff;
156
- border-right: 1px solid #ccc;
149
+ box-shadow:0 0 1em rgba(0,0,0,0.35);
150
+ z-index: 3;
157
151
  }
158
152
  #timerSection {
159
153
  margin-bottom: 0.25em;
@@ -254,9 +248,7 @@
254
248
  min-width: 210px;
255
249
  min-height: 210px;
256
250
  height: 210px;
257
- background: #F5ED9B;
258
251
  border-top: 1px solid #ccc;
259
- border-right: 1px solid #ccc;
260
252
  overflow: auto;
261
253
  }
262
254
 
@@ -294,6 +286,7 @@
294
286
  order: 1;
295
287
  min-width: 0px;
296
288
  justify-content: space-between;
289
+ background-color: #ECEFF1;
297
290
  }
298
291
  #frame {
299
292
  display: -webkit-flex;
@@ -311,7 +304,6 @@
311
304
  -webkit-flex: 10;
312
305
  flex: 10;
313
306
  overflow: hidden;
314
- background: #eee;
315
307
  padding: 1em;
316
308
  }
317
309
 
@@ -323,9 +315,8 @@
323
315
  display: none;
324
316
  position: absolute;
325
317
  top: 0;
318
+ padding: 1em;
326
319
  }
327
- #preview .thumb .label {
328
- }
329
320
  #nextSlide.thumb .label {
330
321
  text-align: right;
331
322
  }
@@ -335,26 +326,22 @@
335
326
  height: 150px;
336
327
  width: 200px;
337
328
  top: 0;
338
- background-color: white;
339
- border-bottom: 2px solid #ccc;
329
+ background-color: #ffffff;
330
+ box-shadow:0 0 1em rgba(0,0,0,0.35);
340
331
  }
341
332
  #preview .thumb .content {
342
333
  transform: scale(.5);
343
334
  transform-origin: 0 0;
344
335
  width: 200%;
345
336
  }
337
+
346
338
  #prevSlide.thumb {
347
339
  left: 0;
348
340
  }
349
- #prevSlide.thumb .container {
350
- border-right: 2px solid #ccc;
351
- }
341
+
352
342
  #nextSlide.thumb {
353
343
  right: 0;
354
344
  }
355
- #nextSlide.thumb .container {
356
- border-left: 2px solid #ccc;
357
- }
358
345
 
359
346
  #preview.thumbs #preso {
360
347
  position: absolute;
@@ -375,10 +362,9 @@
375
362
  /* beside layout */
376
363
  #preview.beside .thumb {
377
364
  display: none;
378
- position: absolute;
379
365
  overflow: hidden;
380
366
  width: 34%;
381
- top: 1em;
367
+ padding: 1em;
382
368
  }
383
369
  #preview.beside .thumb .container {
384
370
  width: auto;
@@ -439,69 +425,30 @@
439
425
 
440
426
 
441
427
  #preso {
442
- -webkit-box-shadow:0 0 25px rgba(0,0,0,0.35);
443
- -moz-box-shadow:0 0 25px rgba(0,0,0,0.35);
444
- box-shadow:0 0 25px rgba(0,0,0,0.35);
428
+ box-shadow:0 0 1em rgba(0,0,0,0.35);
445
429
  position: absolute;
446
430
  }
447
431
 
448
432
  #statusbar {
449
- -webkit-flex: 0.5;
450
- flex: 0.5;
451
- height: 22px;
452
- max-height: 22px;
453
- line-height: 22px;
454
- text-transform: uppercase;
455
- vertical-align: middle;
456
- background: #fff;
433
+ padding: 0 1em;
457
434
  }
458
- #progress {
459
- float: left;
460
- width: 25%;
461
- height: 20px;
462
- background: #ededed;
463
- }
464
- #progress .label {
465
- position: absolute;
466
- padding: 0 0.25em;
467
- font-size: 10px;
468
- }
469
- #progress .ui-progressbar-value {
470
- border: 1px solid #ffa215;
471
- background: #ffb105;
472
- }
473
- #debugInfo {
474
- display: inline;
435
+ #progress {
436
+ width: 100%;
437
+ height: 8px;
438
+ background-color: transparent;
439
+ }
440
+ #progress.ui-widget.ui-widget-content{
441
+ border: none;
442
+ border-radius: 0;
475
443
  }
476
- .controls {
477
- float: right;
478
- margin-right: 5px;
479
- }
480
- .controls > .fa {
481
- font-size: 18px;
482
- text-decoration: none;
483
- }
484
- .controls > a {
485
- color: #222;
486
- }
487
- .controls > .notes-grippy {
488
- top: auto;
489
- position: relative;
490
- display: inline;
491
- }
492
- .controls > span {
493
- font-size: 10px;
494
- }
495
- .controls > span > label {
496
- margin-bottom: 4px;
497
- padding-bottom: 2px;
498
- }
499
- #enableRemote:checked {
500
- background-color: #fff8bf;
501
- -webkit-box-shadow: 0px 0px 15px 5px rgba(255, 255, 190, .75);
502
- -moz-box-shadow: 0px 0px 15px 5px rgba(255, 255, 190, .75);
503
- box-shadow: 0px 0px 15px 5px rgba(255, 255, 190, .75);
444
+ #progress .ui-progressbar-value {
445
+ border: none;
446
+ background: #f44336;
447
+ border-radius: 0;
504
448
  }
449
+ #debugInfo {
450
+ display: inline;
451
+ }
505
452
 
506
453
  #annotationToolbar {
507
454
  display: -webkit-flex;
@@ -548,48 +495,76 @@
548
495
  #annotationToolbar i.shapes.color4 { color: green }
549
496
 
550
497
 
498
+ #notes-wrapper {
499
+ box-shadow:0 0 1em rgba(0,0,0,0.35);
500
+ }
501
+
551
502
  #notes {
552
503
  overflow: auto;
553
504
  height: 210px;
554
505
  padding: 0 1em;
555
506
  display: block;
556
507
  position: relative;
557
- background: #F5ED9B;
558
- border-top: 1px solid #ccc;
559
508
  top: auto !important; /* jquery-ui-resizable mucks with this */
509
+ background-color: #ffffff;
510
+ color: #222;
560
511
  }
561
512
  #notes.hidden {
562
513
  display: none;
563
514
  }
564
515
 
565
- #notes ul.section-selector {
516
+ .section-selector {
517
+ display: inline-block;
566
518
  padding: 0;
567
- margin: 0 0 0 -1.25em; /* compensate for the border on #notes. 1/0.8 em */
519
+ margin: 0;
568
520
  text-align: center;
569
- border-bottom: 1px solid #ccc;
570
521
  font-size: 0.8em;
571
- position: absolute;
572
- background-color: #F5ED9B;
573
522
  }
574
- #notes ul.section-selector li {
575
- display: none;
576
- padding: 0 1em;
523
+ .section-selector li {
524
+ display: inline;
525
+ padding: .1em 1em;
577
526
  }
578
- #notes ul.section-selector li:hover {
579
- background-color: #b9b9b9;
580
- transition-duration: 0.5s;
527
+
528
+ .section-selector li a {
529
+ color: #ffffff;
530
+ text-decoration: none;
581
531
  }
582
- #notes ul.section-selector li.selected {
583
- display: inline;
584
- background-color: #ccc;
532
+
533
+ .section-selector li.selected {
534
+ border-top-left-radius: 3px;
535
+ border-top-right-radius: 3px;
536
+ background-color: #ffffff;
585
537
  }
586
- #notes ul.section-selector:hover li {
587
- display: inline;
538
+
539
+ .section-selector li.selected a {
540
+ color: #222;
588
541
  }
589
542
 
590
- #notes ul.section-selector li a {
591
- text-decoration: none;
543
+ .controls {
544
+ float: right;
545
+ margin-right: .5em;
592
546
  }
547
+ .controls .spacer {
548
+ display: inline-block;
549
+ width: 1em;
550
+ }
551
+ .controls .fa {
552
+ font-size: 1em;
553
+ text-decoration: none;
554
+ }
555
+ .controls a,
556
+ .controls i {
557
+ color: #fff;
558
+ }
559
+ .controls .small {
560
+ font-size: 0.75em;
561
+ vertical-align: 15%;
562
+ }
563
+ .controls .notes-grippy {
564
+ top: auto;
565
+ position: relative;
566
+ display: inline;
567
+ }
593
568
 
594
569
  #notes ol { list-style-type: decimal; }
595
570
  #notes ul { list-style-type: disc; }
@@ -642,13 +617,6 @@ a.controls {
642
617
  }
643
618
 
644
619
  /* hide some elements when the screen is too small */
645
- @media screen and (max-width: 1000px)
646
- {
647
- #slideSource label {
648
- display: none;
649
- }
650
- }
651
-
652
620
  @media screen and (max-width: 900px)
653
621
  {
654
622
  #topbar .fa {
@@ -683,7 +651,6 @@ a.controls {
683
651
  flex: 4;
684
652
  }
685
653
  #questions {
686
- border-bottom: 1px solid #ccc;
687
654
  -webkit-flex: 1;
688
655
  flex: 1;
689
656
  }
@@ -696,12 +663,7 @@ a.controls {
696
663
  margin: 0;
697
664
  padding: 0;
698
665
  }
699
- #slideSource {
700
- max-width: 256px;
701
- overflow: hidden;
702
- height: 16px;
703
- padding-left: 16px;
704
- }
666
+
705
667
  #slideFile {
706
668
  display: inline-block;
707
669
  width: 205px;