showoff 0.16.2 → 0.17.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.
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;