jekyll-theme-conference 2.4.1 → 2.5.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
  SHA256:
3
- metadata.gz: 4b4a68d1ce4697568c8582882600a0373e99ffc2f2fb71200d1cbaee33a8850c
4
- data.tar.gz: 6abbc6c552d5df4a1bf0f126c9c01573887e101904fd9321e17000ecf68a8fd8
3
+ metadata.gz: 85035d6385b1339b58d26c9aa7656bb63c390e82e59b995a954b032bda281b61
4
+ data.tar.gz: 6cde36017cc9d2b667ea921edcb6ed8938fea8cf63b87169f2ea8399b0e42b53
5
5
  SHA512:
6
- metadata.gz: 11dc593b0689b0834a22c61c28735ed343d5bc17e0663ed7269b1ebf435a9895642be0d25d3f95944048e290d23cfffdac0cd72f0c674e5b311fa2bba10cf8ff
7
- data.tar.gz: 4914fca74c4dac1b34ae4e764716a91a6256da5d02e78463d5769ff47221a6a6ecee4219c09ea806461cccbe5215be7b35c3908927b0e7f25d7c528278714a6c
6
+ metadata.gz: 6ee86daa817de1f8ce650b73c8a1116a28293307da1cfe10abd775331251d88af1a33e6dbc425011cf5d4358e89978e2601cf5eaf35c22874222715f170c0a88
7
+ data.tar.gz: 93606208e131a2d476732a828248cbdc7d58cf28ed0e6e678a585d677e18b6939721a6ca099a1f7805e0b431e2585989168aed5e45f009f7d35780b498d615ba
data/README.md CHANGED
@@ -185,7 +185,8 @@ The navigation bar is located at the top and visible on every site. On the right
185
185
 
186
186
  Additionally, a navigation bar link can also have the following properties:
187
187
 
188
- - `menu` containing another list of links. This creates a dropdown menu of multiple sublinks. The sublinks have the same properties as regular links (see the _Content_ > _Links_ section).
188
+ - `menu` containing another list of links. This creates a dropdown menu of multiple sublinks. The sublinks have the same properties as regular links (see the _Content_ > _Links_ section), or
189
+ - `live` making the link only visible during the conference and adds a live indication. The `name` property can be omitted. If streaming is enabled and any URL property is omitted, a click on the link will open the streaming modal (see section _Live Indications_ below).
189
190
 
190
191
  Example:
191
192
 
@@ -195,6 +196,7 @@ conference:
195
196
  links:
196
197
  - name: Program
197
198
  relative_url: /program/
199
+ - live: true
198
200
  - name: Previous Editions
199
201
  menu:
200
202
  - name: 2020 (current)
@@ -224,7 +226,7 @@ conference:
224
226
 
225
227
  The main landing page is shown at the root of the website to greet new visitors. In order to show it you need to create a `index.md` file in the root of your website's folder and specify its layout as `layout: main`. The remaining customizations are specified in the `_config.yml` file.
226
228
 
227
- The main page states your site's title (`site.title`) or a logo instead. The logo can be configured through the `logo` property under the `main` property containing:
229
+ The main page states your site's title (`site.title`) or a logo instead. The logo can be configured through the `logo` property under the `main` property containing
228
230
 
229
231
  - a `img` property specifying the path to the image file relative to the `/assets/images/` folder.
230
232
 
@@ -286,7 +288,31 @@ conference:
286
288
  Try again next year.
287
289
  ```
288
290
 
289
- ### Talk Settings: Main Categories and Icons
291
+ ### Live Indications & Streaming
292
+
293
+ In order to help users navigating the program during the congress, a _Live_ indication can be shown next to talks which are currently taking place. A small JavaScript functions keeps the site automatically up-to-date (without the need to refresh) showing the indication as soon as the talk has started and hiding it once it is over (according to the timetable indicated in the `_data/program.yml` file).
294
+
295
+ This can be further extended if some of the talks have an associated live stream: Upon clicking one of the live indications a modal will open containing the corresponding live stream embedded. The URL to the live stream has to be set via `live` property in each room (see the _Content_ > _Room_ section below).
296
+
297
+ In order to activate the functionality the `live` property has to be set containing
298
+
299
+ - the date of the day at which the conference takes place (`date`),
300
+ - the timezone in which the conference takes place (`timezone`),
301
+ - optionally if streaming is enabled (`streaming`) with indications how many minutes early the stream will begin and end, and
302
+ - optionally a demo mode setting, whereby the JavaScript function cycles through the entire program in five minutes for demonstration purposes (`demo: true`, default: `false`).
303
+
304
+ ```yaml
305
+ conference:
306
+ live:
307
+ date: 01.01.2020
308
+ timezone: GMT+1
309
+ streaming:
310
+ start_early: 15 # in minutes
311
+ end_late: 0 # in minutes
312
+ demo: false
313
+ ```
314
+
315
+ ### Talk Settings
290
316
 
291
317
  Each talk can have one or multiple categories associated via FrontMatter (see the _Individual Pages: Talks_ section below for more details). Some of these categories can be elevated to so called main categories". These are used to color group the talks across the entire website, particularly in the program. In order to do so add the `main_categories` property under the `talks` property. It consists of a list of all main categories. Each main category consists of:
292
318
 
@@ -314,11 +340,12 @@ conference:
314
340
  color: info
315
341
  - name: Cat B
316
342
  color: success
343
+
317
344
  # Hide icons on talk overview page
318
345
  hide_icons: false
319
346
  ```
320
347
 
321
- ### Speaker Settings: First name
348
+ ### Speaker Settings
322
349
 
323
350
  In the program as well as the speaker's overview the speaker's first name can be abbreviated to its first letter. Of course, you also have the option to not specify a first name for each speaker in the first place. In order to shorten the first name add the `show_firstname: true` setting (default: `false`) to the `speakers` property.
324
351
 
@@ -330,7 +357,7 @@ conference:
330
357
  show_firstname: false
331
358
  ```
332
359
 
333
- ### Location Settings: Hide all and configure map
360
+ ### Location Settings
334
361
 
335
362
  In case the location of your rooms is obvious (e.g. on a campus) you can decide to disable the location page and links to all the rooms. You still need to create the different rooms as files in the `_rooms/` directory, since they are needed as a reference. But there will not be any link pointing to it (effectively hiding them).
336
363
  In order to hide all rooms add the `hide: true` setting (default: `false`) to the `location` property.
@@ -353,7 +380,7 @@ conference:
353
380
  map_provider: "OpenStreetMap.Mapnik"
354
381
  ```
355
382
 
356
- The map is based on the JavaScript Library [Leaflet](https://leafletjs.com/) and can be customized by editing the `assets/js/main.js` file, e.g. adding additional layers with markers, text, or shapes to the map. To start, copy simply the file from this repository and make use of the initialized global variable `map` pointing to the Leaflet container.
383
+ The map is based on the JavaScript Library [Leaflet](https://leafletjs.com/) and can be customized by editing the `assets/js/main.js` file, e.g. adding additional layers with markers, text, or shapes to the map. To start, copy simply the file from this repository and make use of the initialized global variable `window.conference.map` pointing to the Leaflet container.
357
384
 
358
385
  Example:
359
386
 
@@ -364,11 +391,13 @@ Example:
364
391
  {% include js/conference.js %}
365
392
 
366
393
  (function() {
394
+ let map = window.conference.map;
395
+
367
396
  if (typeof map !== 'undefined') {
368
397
  var main_station = L.marker([47.37785, 8.54035], {
369
398
  icon: L.divIcon({
370
399
  className: '',
371
- html: '<span class="fas fa-train"></span> Bahnhof Zürich',
400
+ html: '<span class="fas fa-train"></span> Main Station',
372
401
  iconSize: [120, 56]
373
402
  })
374
403
  }).addTo(map);
@@ -454,8 +483,9 @@ Each speaker is represented by a file in the `_speakers/` directory. It must beg
454
483
 
455
484
  Each room is represented by a file in the `_rooms/` directory. It must begin with valid [YAML Front Matter](https://jekyllrb.com/docs/frontmatter/) containing
456
485
 
457
- - the room's `name`, and
458
- - optionally `hide: true` if the room's page should not be linked to.
486
+ - the room's `name`
487
+ - optionally `hide: true` if the room's page should not be linked to, and
488
+ - optionally a URL pointing to a live stream for the given room during the conference (`live`, see the section _Live Indications & Streaming_ above).
459
489
 
460
490
  ### Links
461
491
 
@@ -0,0 +1,307 @@
1
+ window.conference.live = (function() {
2
+ {%- include partials/get_conf_time.html -%}
3
+ {%- assign time_start = conf_start -%}
4
+ {%- assign time_end = conf_end -%}
5
+ {%- include partials/get_timestamp.html -%}
6
+
7
+ let confStart = {{ timestamp_start }};
8
+ let confEnd = {{ timestamp_end }};
9
+
10
+ let freezeTime = false;
11
+ let timeFrozen = 0;
12
+ let timeOffset = 0;
13
+
14
+ let demo = {{ site.conference.live.demo | default: "false" }};
15
+ let durDemo = 5*60; // in seconds
16
+ let durPause = 10; // in seconds
17
+
18
+ let liveTimer;
19
+ let liveTimerCorr;
20
+
21
+ let timeNowReal = function () {
22
+ // Return UNIX timestamp in seconds
23
+ return Math.floor(Date.now() / 1000);
24
+ };
25
+
26
+ let timeNowCycle = function() {
27
+ // Cycle time over program for a fixed duration
28
+ let relTime = (Math.floor(Date.now() / 1000) % durDemo - durPause) / (durDemo - 2*durPause);
29
+ let cycleTime = (confEnd - confStart) * relTime + confStart;
30
+ return cycleTime;
31
+ };
32
+
33
+ let timeNow = function() {
34
+ if (freezeTime) {
35
+ return timeFrozen;
36
+ }
37
+ else if (demo) {
38
+ return timeNowCycle() - timeOffset;
39
+ }
40
+ else {
41
+ return timeNowReal() - timeOffset;
42
+ }
43
+ };
44
+
45
+ let pauseTime = function () {
46
+ timeFrozen = timeNow();
47
+ freezeTime = true;
48
+ };
49
+
50
+ let continueTime = function () {
51
+ if (demo) {
52
+ timeOffset = timeNowCycle() - timeFrozen;
53
+ }
54
+ else {
55
+ timeOffset = timeNow() - timeFrozen;
56
+ }
57
+ freezeTime = false;
58
+ };
59
+
60
+ let resetTime = function (timeStr) {
61
+ continueTime();
62
+ timeOffset = 0;
63
+ };
64
+
65
+ let setTime = function (timeStr) {
66
+ pauseTime();
67
+
68
+ let d = new Date(timeNow() * 1000);
69
+ time = timeStr.split(':');
70
+ d.setHours(time[0], time[1]);
71
+
72
+ timeFrozen = Math.floor(d.getTime() / 1000);
73
+ };
74
+
75
+ let getTime = function () {
76
+ let d = new Date(timeNow() * 1000);
77
+ let h = d.getHours();
78
+ let m = d.getMinutes();
79
+
80
+ return h + ":" + (m < 10 ? "0" : "") + m;
81
+ };
82
+
83
+ let timeStart = function () {
84
+ let tNow = timeNow();
85
+ if (confStart - 60 > tNow) {
86
+ // Start when conference start (-60s)
87
+ return confStart - 60 - tNow;
88
+ }
89
+ else {
90
+ // Start on the minute
91
+ return (60 - (tNow % 60));
92
+ }
93
+ };
94
+
95
+ let updateLiveButtons = function() {
96
+ let tNow = timeNow();
97
+ let liveShow = document.getElementsByClassName('live-show');
98
+ let liveHide = document.getElementsByClassName('live-hide');
99
+
100
+ for (let i = 0; i < liveShow.length; i++) {
101
+ let tStart = liveShow[i].dataset.start;
102
+ let tEnd = liveShow[i].dataset.end;
103
+
104
+ if (tNow >= tStart && tNow < tEnd) {
105
+ // Show when active
106
+ liveShow[i].classList.remove('d-none');
107
+ }
108
+ else if (!liveShow[i].classList.contains('d-none')) {
109
+ // Hide otherwise
110
+ liveShow[i].classList.add('d-none');
111
+ }
112
+ }
113
+
114
+ for (let i = 0; i < liveHide.length; i++) {
115
+ let tStart = liveHide[i].dataset.start;
116
+ let tEnd = liveHide[i].dataset.end;
117
+
118
+ if (tNow >= tStart && tNow < tEnd) {
119
+ // Hide when active
120
+ if (!liveHide[i].classList.contains('d-none')) {
121
+ liveHide[i].classList.add('d-none');
122
+ }
123
+ }
124
+ else {
125
+ // Show otherwise
126
+ liveHide[i].classList.remove('d-none');
127
+ }
128
+ }
129
+
130
+ if (timeNow() > confEnd && !demo) {
131
+ // Cancel timer after program is over
132
+ clearInterval(liveTimer);
133
+ }
134
+ };
135
+
136
+ let startUpdate = function () {
137
+ if(typeof liveTimer !== "undefined") {
138
+ clearInterval(liveTimer);
139
+ }
140
+ updateLiveButtons();
141
+
142
+ if (demo) {
143
+ liveTimerCorr = (confEnd - confStart) / (durDemo - 2*durPause);
144
+ liveTimer = setInterval(updateLiveButtons, 100);
145
+ }
146
+ else {
147
+ liveTimerCorr = 1;
148
+ setTimeout(function() {
149
+ liveTimer = setInterval(updateLiveButtons, 60*1000);
150
+ updateLiveButtons();
151
+ }, timeStart() * 1000);
152
+ }
153
+ };
154
+
155
+ let toggleDemo = function () {
156
+ demo = !demo;
157
+ timeOffset = 0;
158
+ startUpdate();
159
+ };
160
+
161
+ let demoOn = function() {
162
+ return demo;
163
+ };
164
+
165
+ {% if site.conference.live.streaming -%}
166
+
167
+ let rooms = {
168
+ {%- for r in site.data.program -%}
169
+ {%- assign room = site.rooms | where: 'name', r.room | first -%}
170
+ {%- if room.live -%}
171
+
172
+ {%- assign t = r.talks | first -%}
173
+ {%- include partials/get_talk_time.html -%}
174
+ {%- assign time_start = talk_start -%}
175
+ {%- assign time_end = talk_end -%}
176
+ {%- include partials/get_timestamp.html -%}
177
+
178
+ {%- assign offset_start = site.conference.live.streaming.start_early | default: 0 -%}
179
+ {%- assign room_ts_start = offset_start | times: -60 | plus: timestamp_start -%}
180
+
181
+ {%- assign t = r.talks | last -%}
182
+ {%- include partials/get_talk_time.html -%}
183
+ {%- assign time_start = talk_start -%}
184
+ {%- assign time_end = talk_end -%}
185
+ {%- include partials/get_timestamp.html -%}
186
+
187
+ {%- assign offset_end = site.conference.live.streaming.end_late | default: 0 -%}
188
+ {%- assign room_ts_end = offset_end | times: 60 | plus: timestamp_end -%}
189
+
190
+ "{{ room.name }}": {
191
+ "id": {{ forloop.index }},
192
+ "href": "{{ room.live }}",
193
+ "start": {{ room_ts_start }},
194
+ "end": {{ room_ts_end }}
195
+ },
196
+ {%- endif -%}
197
+ {%- endfor -%}
198
+ };
199
+
200
+ let streamModal;
201
+ let streamTimer;
202
+
203
+ let preStartStream = function(href, startTime, endTime) {
204
+ streamModal.find('iframe').attr('src', '');
205
+ streamModal.find('iframe').addClass('d-none');
206
+ streamModal.find('#stream-placeholder > div').text('{{ site.data.lang[site.conference.lang].live.pre_stream | default: "Live stream has not started yet." }}');
207
+ streamModal.find('#stream-placeholder').addClass('d-flex');
208
+
209
+ if(typeof streamTimer !== "undefined") {
210
+ clearTimeout(streamTimer);
211
+ }
212
+ streamTimer = setTimeout(activeStream, (startTime - timeNow())/liveTimerCorr*1000, href, endTime);
213
+ }
214
+
215
+ let activeStream = function(href, endTime) {
216
+ streamModal.find('iframe').attr('src', href);
217
+ streamModal.find('#stream-placeholder').addClass('d-none').removeClass('d-flex');
218
+ streamModal.find('iframe').removeClass('d-none');
219
+
220
+ if(typeof streamTimer !== "undefined") {
221
+ clearTimeout(streamTimer);
222
+ }
223
+ streamTimer = setTimeout(postEndStream, (endTime - timeNow())/liveTimerCorr*1000);
224
+ }
225
+
226
+ let postEndStream = function() {
227
+ streamModal.find('iframe').attr('src', '');
228
+ streamModal.find('iframe').addClass('d-none');
229
+ streamModal.find('#stream-placeholder > div').text('{{ site.data.lang[site.conference.lang].live.post_stream | default: "Live stream has ended." }}');
230
+ streamModal.find('#stream-placeholder').addClass('d-flex');
231
+ }
232
+
233
+ let setStream = function (roomName) {
234
+ if (roomName in rooms) {
235
+ room = rooms[roomName];
236
+ }
237
+ else {
238
+ room = rooms[Object.keys(rooms)[0]];
239
+ }
240
+
241
+ streamModal.find('.modal-footer .btn').removeClass('active');
242
+ if (timeNow() < room.start) {
243
+ preStartStream(room.href, room.start, room.end);
244
+ }
245
+ else if (timeNow() > room.end) {
246
+ postEndStream();
247
+ }
248
+ else {
249
+ activeStream(room.href, room.end);
250
+ }
251
+ streamModal.find('#stream-button' + room.id).addClass('active');
252
+ };
253
+
254
+ let hideModal = function (event) {
255
+ streamModal.find('iframe').attr('src', '');
256
+ streamModal.find('.modal-footer .btn').removeClass('active');
257
+ };
258
+
259
+ let startStream = function() {
260
+ streamModal = $('#stream-modal');
261
+
262
+ streamModal.on('show.bs.modal', function (event) {
263
+ let button = $(event.relatedTarget);
264
+ let roomName = button.data('room');
265
+ setStream(roomName);
266
+ });
267
+ streamModal.on('hide.bs.modal', function (event) {
268
+ hideModal(event);
269
+ });
270
+
271
+ streamModal.find('.modal-footer .btn').on('click', function(event) {
272
+ event.preventDefault();
273
+
274
+ let roomName = $(this).data('room')
275
+ setStream(roomName);
276
+ });
277
+ };
278
+
279
+ {%- else -%}
280
+
281
+ let startStream = function() {};
282
+
283
+ {%- endif %}
284
+
285
+ let init = function () {
286
+ startUpdate();
287
+ startStream();
288
+ };
289
+
290
+ return {
291
+ init: init,
292
+
293
+ pauseTime: pauseTime,
294
+ continueTime: continueTime,
295
+ resetTime: resetTime,
296
+ setTime: setTime,
297
+ getTime: getTime,
298
+
299
+ toggleDemo: toggleDemo,
300
+ demoOn: demoOn,
301
+ durDemo: durDemo,
302
+ durPause: durPause
303
+ };
304
+
305
+ })();
306
+
307
+ window.conference.live.init();
@@ -1,17 +1,18 @@
1
- var map;
1
+ window.conference.mapConfig = (function() {
2
2
 
3
- (function() {
4
- var map_provider = "{{ site.conference.location.map.map_provider | default: 'OpenStreetMap.Mapnik' }}";
5
- var home_coord = [{{ site.conference.location.map.home_coord }}];
6
- var default_zoom = {{ site.conference.location.map.default_zoom | default: 17 }};
3
+ let map;
7
4
 
8
- if (document.getElementById('map')) {
9
- map = L.map('map').setView(home_coord, default_zoom);
5
+ let mapProvider = "{{ site.conference.location.map.map_provider | default: 'OpenStreetMap.Mapnik' }}";
6
+ let homeCoord = [{{ site.conference.location.map.home_coord }}];
7
+ let zoomLevel = {{ site.conference.location.map.default_zoom | default: 17 }};
10
8
 
11
- L.tileLayer.provider(map_provider).addTo(map);
9
+ let setup = function (elId) {
10
+ map = L.map(elId).setView(homeCoord, zoomLevel);
11
+
12
+ L.tileLayer.provider(mapProvider).addTo(map);
12
13
 
13
14
  L.easyButton('far fa-star', function(){
14
- map.setView(home_coord, default_zoom);
15
+ map.flyTo(homeCoord, zoomLevel);
15
16
  }, '{{ site.data.lang[site.conference.lang].location.focus_conf | default: "Center map on conference location" }}').addTo(map);
16
17
 
17
18
  L.control.locate({
@@ -20,5 +21,25 @@ var map;
20
21
  title: '{{ site.data.lang[site.conference.lang].location.focus_me | default: "Show me where I am" }}'
21
22
  }
22
23
  }).addTo(map);
23
- }
24
+ };
25
+
26
+ let init = function () {
27
+ elId = 'map';
28
+
29
+ if (document.getElementById(elId)) {
30
+ setup(elId);
31
+ window.conference.map = map;
32
+ }
33
+ };
34
+
35
+ return {
36
+ init: init,
37
+ default: {
38
+ mapProvider: mapProvider,
39
+ homeCoord: homeCoord,
40
+ zoomLevel: zoomLevel
41
+ }
42
+ };
24
43
  })();
44
+
45
+ window.conference.mapConfig.init();
@@ -1,14 +1,15 @@
1
- (function() {
2
- $('#link-modal').on('show.bs.modal', function (event) {
3
- var button = $(event.relatedTarget);
1
+ window.conference.modal = (function () {
4
2
 
5
- var href = button.data('href');
6
- var header = button.data('header');
7
- var title = button.data('title');
8
- var footer = button.data('footer');
9
- var desc = button.data('desc');
3
+ let show = function (el, event) {
4
+ let button = $(event.relatedTarget);
10
5
 
11
- var modal = $(this);
6
+ let href = button.data('href');
7
+ let header = button.data('header');
8
+ let title = button.data('title');
9
+ let footer = button.data('footer');
10
+ let desc = button.data('desc');
11
+
12
+ let modal = $(el);
12
13
  modal.find('iframe').attr('src', href);
13
14
 
14
15
  if (header) {
@@ -18,25 +19,45 @@
18
19
  modal.find('.modal-title').text(title);
19
20
  }
20
21
  else {
21
- modal.find('.modal-title').text('')
22
+ modal.find('.modal-title').text('');
22
23
  }
23
24
 
24
25
  if (footer) {
25
- modal.find('.modal-footer').removeClass('d-none')
26
+ modal.find('.modal-footer').removeClass('d-none');
26
27
  modal.find('.modal-description').html(footer);
27
28
  }
28
29
  else if (desc) {
29
- modal.find('.modal-footer').removeClass('d-none')
30
+ modal.find('.modal-footer').removeClass('d-none');
30
31
  modal.find('.modal-description').text(desc);
31
32
  }
32
33
  else {
33
- modal.find('.modal-footer').addClass('d-none')
34
+ modal.find('.modal-footer').addClass('d-none');
34
35
  }
35
- });
36
- $('#link-modal').on('hide.bs.modal', function (event) {
37
- var modal = $(this);
36
+ };
37
+
38
+ let hide = function (el, event) {
39
+ let modal = $(el);
40
+
38
41
  modal.find('.modal-title').text('');
39
42
  modal.find('iframe').attr('src', '');
40
43
  modal.find('.modal-description').html('');
41
- });
44
+ };
45
+
46
+ let init = function() {
47
+ elSel = '#link-modal';
48
+
49
+ $(elSel).on('show.bs.modal', function (event) {
50
+ show(this, event);
51
+ });
52
+ $(elSel).on('hide.bs.modal', function (event) {
53
+ hide(this, event);
54
+ });
55
+ };
56
+
57
+ return {
58
+ init: init
59
+ };
60
+
42
61
  })();
62
+
63
+ window.conference.modal.init();
@@ -9,8 +9,11 @@
9
9
  // Vertical Scroll Sync: Syncscroll
10
10
  {% include js/syncscroll.js %}
11
11
 
12
+ // Global app variable
13
+ window.conference = {};
14
+
15
+ // Map Display Framework: Leaflet
12
16
  {% if site.conference.location.hide != true and site.conference.location.map.enable %}
13
- // Map Display Framework: Leaflet
14
17
  {% include js/leaflet.js %}
15
18
  {% include js/leaflet-easybutton.js %}
16
19
  {% include js/leaflet-locatecontrol.js %}
@@ -21,3 +24,8 @@
21
24
 
22
25
  // Bootstrap Extension: Modals
23
26
  {% include js/conference-modal.js %}
27
+
28
+ // Live
29
+ {% if site.conference.live %}
30
+ {% include js/conference-live.js %}
31
+ {% endif %}
@@ -4,7 +4,7 @@
4
4
  {% unless site.conference.lang == "en" %}
5
5
  {% assign errors = errors | push : "The internationalization file containing different strings for this template seems to be missing. Have you copied the `_data/lang.yml` file from the [theme's repository](https://github.com/DigitaleGesellschaft/jekyll-theme-conference/blob/master/_data/lang.yml) to you local website folder?" %}
6
6
  {% endunless %}
7
- {% elsif site.data.lang.version < 2 %}
7
+ {% elsif site.data.lang.version < 3 %}
8
8
  {% assign errors = errors | push : "The internationalization file in `_data/lang.yml` seems to be outdated and does not correspond to the current version of the theme. Grab the current version from the [theme's repository](https://github.com/DigitaleGesellschaft/jekyll-theme-conference/blob/master/_data/lang.yml)." %}
9
9
  {% endunless %}
10
10
  {% unless site.conference.lang == "en" or site.conference.lang == "de" or site.conference.lang == "fr" or site.conference.lang == "pt" %}
@@ -30,5 +30,5 @@
30
30
 
31
31
  {% assign main_category_size = site.conference.talks.main_categories | size %}
32
32
  {% if main_category_size == 0 %}
33
- {% assign errors = errors | push : "Your `_config.yml` configuration file does not define any main category for your talks. Have you set the `conference.talks.main_categories` property? See also [Talk Settings](https://github.com/DigitaleGesellschaft/jekyll-theme-conference/#talk-settings-main-categories-and-icons) section in the theme's README file." %}
33
+ {% assign errors = errors | push : "Your `_config.yml` configuration file does not define any main category for your talks. Have you set the `conference.talks.main_categories` property? See also [Talk Settings](https://github.com/DigitaleGesellschaft/jekyll-theme-conference/#talk-settings) section in the theme's README file." %}
34
34
  {% endif %}
@@ -11,8 +11,8 @@
11
11
  <span aria-hidden="true">&times;</span>
12
12
  </button>
13
13
  </div>
14
- <div class="modal-body">
15
- <iframe src="" frameborder="0" allowfullscreen></iframe>
14
+ <div class="modal-body embed-responsive embed-responsive-16by9">
15
+ <iframe class="embed-responsive-item" src="" allowfullscreen></iframe>
16
16
  </div>
17
17
  <div class="modal-footer justify-content-start">
18
18
  <p class="modal-description"></p>
@@ -21,6 +21,10 @@
21
21
  </div>
22
22
  </div>
23
23
 
24
+ {% if site.conference.live.streaming %}
25
+ {% include partials/live-modal.html %}
26
+ {% endif %}
27
+
24
28
  <script src="{{ site.baseurl }}/assets/js/main.js"></script>
25
29
 
26
30
  </body>
@@ -0,0 +1,54 @@
1
+ {% for room in site.data.program %}
2
+ {% assign t = room.talks | first %}
3
+ {% include partials/get_talk_time.html %}
4
+
5
+ {% assign update_var = false %}
6
+
7
+ {% unless conf_start_hour %}
8
+ {% assign update_var = true %}
9
+ {% else %}
10
+ {% if talk_start_hour < conf_start_hour %}
11
+ {% assign update_var = true %}
12
+ {% elsif talk_start_hour == conf_start_hour and talk_start_min < conf_start_min %}
13
+ {% assign update_var = true %}
14
+ {% endif %}
15
+ {% endunless %}
16
+
17
+ {% if update_var %}
18
+ {% assign conf_start_hour = talk_start_hour %}
19
+ {% assign conf_start_min = talk_start_min %}
20
+ {% endif %}
21
+
22
+ {% assign t = room.talks | last %}
23
+ {% include partials/get_talk_time.html %}
24
+
25
+ {% assign update_var = false %}
26
+
27
+ {% unless conf_end_hour %}
28
+ {% assign update_var = true %}
29
+ {% else %}
30
+ {% if talk_end_hour > conf_end_hour %}
31
+ {% assign update_var = true %}
32
+ {% elsif talk_end_hour == conf_end_hour and talk_end_min > conf_end_min %}
33
+ {% assign update_var = true %}
34
+ {% endif %}
35
+ {% endunless %}
36
+
37
+ {% if update_var %}
38
+ {% assign conf_end_hour = talk_end_hour %}
39
+ {% assign conf_end_min = talk_end_min %}
40
+ {% endif %}
41
+ {% endfor %}
42
+
43
+ {% if conf_start_min < 10 %}
44
+ {% assign conf_start = conf_start_hour | append: ":0" | append: conf_start_min %}
45
+ {% else %}
46
+ {% assign conf_start = conf_start_hour | append: ":" | append: conf_start_min %}
47
+ {% endif %}
48
+ {% if conf_end_min < 10 %}
49
+ {% assign conf_end = conf_end_hour | append: ":0" | append: conf_end_min %}
50
+ {% else %}
51
+ {% assign conf_end = conf_end_hour | append: ":" | append: conf_end_min %}
52
+ {% endif %}
53
+
54
+ {% assign conf_duration_min = conf_end_hour | minus: conf_start_hour | times: 60 | minus: conf_start_min | plus: conf_end_min %}
@@ -1,4 +1,5 @@
1
1
 
2
+ {% assign link_disabled = link.disabled %}
2
3
  {% assign link_icon = link.icon %}
3
4
  {% assign link_iframe = link.iframe %}
4
5
 
@@ -59,6 +60,9 @@
59
60
 
60
61
  {% endif %}
61
62
 
63
+ {% else %}
64
+ {% assign link_disabled = true %}
65
+
62
66
  {% endif %}
63
67
 
64
68
  {% capture link_tag -%}
@@ -85,3 +89,5 @@
85
89
 
86
90
  {%- endif -%}
87
91
  {%- endcapture %}
92
+
93
+ {% assign link_styleclass = "" %}
@@ -0,0 +1,4 @@
1
+ {% assign datetime_start = site.conference.live.date | append: " " | append: time_start | append: " " | append: site.conference.live.timezone %}
2
+ {% assign timestamp_start = datetime_start | date: "%s" %}
3
+ {% assign datetime_end = site.conference.live.date | append: " " | append: time_end | append: " " | append: site.conference.live.timezone %}
4
+ {% assign timestamp_end = datetime_end | date: "%s" %}
@@ -0,0 +1,29 @@
1
+ <div class="modal fade" id="stream-modal" tabindex="-1" role="dialog" aria-labelledby="link-modal-label" aria-hidden="true">
2
+ <div class="modal-dialog modal-dialog-centered modal-lg" role="document">
3
+ <div class="modal-content">
4
+ <div class="modal-header">
5
+ <h5 class="modal-title">
6
+ {{ site.data.lang[site.conference.lang].live.streaming | default: "Live Stream" }}
7
+ </h5>
8
+ <button type="button" class="close" data-dismiss="modal" aria-label="Close">
9
+ <span aria-hidden="true">&times;</span>
10
+ </button>
11
+ </div>
12
+ <div class="modal-body embed-responsive embed-responsive-16by9">
13
+ <iframe class="embed-responsive-item" src="" allowfullscreen></iframe>
14
+ <div id="stream-placeholder" class="embed-responsive-item d-none justify-content-center align-items-center">
15
+ <div></div>
16
+ </div>
17
+ </div>
18
+ <div class="modal-footer justify-content-around">
19
+ {% for r in site.data.program %}
20
+ {% assign room = site.rooms | where: 'name', r.room | first %}
21
+
22
+ <a id="stream-button{{ forloop.index }}" href="#" class="btn btn-outline-primary {% unless room.live %}disabled{% endunless %}" role="button" data-room="{{ room.name }}">
23
+ {{ room.name }}
24
+ </a>
25
+ {% endfor %}
26
+ </div>
27
+ </div>
28
+ </div>
29
+ </div>
@@ -0,0 +1,19 @@
1
+ {% if site.conference.live %}
2
+ {% assign time_start = t.time_start %}
3
+ {% assign time_end = t.time_end %}
4
+ {% include partials/get_timestamp.html %}
5
+
6
+ {%- if site.conference.live.streaming -%}
7
+ <a title="{{ link.name }}" data-toggle="modal" data-target="#stream-modal" data-room="{{ r.room }}" class="cursor-pointer
8
+ {%- else -%}
9
+ <span class="
10
+ {%- endif %} live-show live-button badge badge-dark font-weight-normal text-left d-none {{ live_button_styleclass }}" data-start="{{ timestamp_start }}" data-end="{{ timestamp_end }}">
11
+ <object data="{{ site.baseurl }}/assets/icons/live.svg" type="image/svg+xml"></object>
12
+ {{ site.data.lang[site.conference.lang].live.live | default: "Live" }}
13
+ {%- if site.conference.live.streaming -%}
14
+ </a>
15
+ {%- else -%}
16
+ </span>
17
+ {%- endif -%}
18
+ {% assign live_button_styleclass = "" %}
19
+ {% endif %}
@@ -26,6 +26,36 @@
26
26
  {% endfor %}
27
27
  </div>
28
28
  </li>
29
+
30
+ {% elsif link.live %}
31
+ {% include partials/get_conf_time.html %}
32
+ {% assign time_start = conf_start %}
33
+ {% assign time_end = conf_end %}
34
+ {% include partials/get_timestamp.html %}
35
+
36
+ {% assign offset_start = site.conference.live.streaming.start_early | default: 0 %}
37
+ {% assign offset_end = site.conference.live.streaming.end_late | default: 0 %}
38
+ {% assign timestamp_start = offset_start | times: -60 | plus: timestamp_start %}
39
+ {% assign timestamp_end = offset_end | times: 60 | plus: timestamp_end %}
40
+
41
+ <li class="nav-item live-show d-none" data-start="{{ timestamp_start }}" data-end="{{ timestamp_end }}">
42
+ {% if site.conference.live.streaming %}
43
+ <a class="cursor-pointer nav-link" title="{% if link.name %}{{ link.name }}{% else %}{{ site.data.lang[site.conference.lang].live.streaming | default: "Live Stream" }}{% endif %}" data-toggle="modal" data-target="#stream-modal" data-room="">
44
+ {% else %}
45
+ {% assign link_styleclass = "nav-link" %}
46
+ {% include partials/get_link.html %}
47
+ {{ link_tag }}
48
+ {% endif %}
49
+
50
+ {{ link.name | default: "" }}
51
+
52
+ <span class="live-button badge badge-dark font-weight-normal text-left">
53
+ <object data="{{ site.baseurl }}/assets/icons/live.svg" type="image/svg+xml"></object>
54
+ {{ site.data.lang[site.conference.lang].live.live | default: "Live" }}
55
+ </span>
56
+ </a>
57
+ </li>
58
+
29
59
  {% else %}
30
60
  <li class="nav-item {% if page.url contains link.relative_url %}active{% endif %}">
31
61
  {% assign link_styleclass = "nav-link" %}
@@ -1,5 +1,5 @@
1
1
  {% if room.hide or site.conference.location.hide %}
2
- <span class="badge badge-light font-weight-normal"><i class="far fa-square"></i> {{ room.name }}</span><!--
2
+ <span class="badge badge-light font-weight-normal text-left"><i class="far fa-square"></i> {{ room.name }}</span><!--
3
3
  {% else %}
4
4
  <a href="{{ room.url | prepend: site.baseurl }}" class="badge badge-light font-weight-normal"><i class="far fa-square"></i> {{ room.name }}</a><!--
5
5
  {% endif %}-->
@@ -1,3 +1,3 @@
1
- <span class="badge badge-light font-weight-normal">
1
+ <span class="badge badge-light font-weight-normal text-left">
2
2
  <i class="fas fa-stopwatch"></i> {{ talk_duration_min }}min
3
3
  </span>
@@ -1,3 +1,3 @@
1
- <a href="{{ site.conference.program.url | prepend: site.baseurl }}" class="badge badge-light font-weight-normal">
1
+ <a href="{{ site.conference.program.url | prepend: site.baseurl }}" class="badge badge-light font-weight-normal text-left">
2
2
  <i class="far fa-clock"></i> {{ talk_start_hour }}:{% if talk_start_min == 0 %}0{%endif %}{{ talk_start_min }}
3
3
  </a>
@@ -1,50 +1,7 @@
1
1
  {% include partials/header.html %}
2
2
 
3
- {% for room in site.data.program %}
4
- {% assign t = room.talks | first %}
5
- {% include partials/get_talk_time.html %}
6
-
7
- {% assign update_var = false %}
8
-
9
- {% unless start_hour %}
10
- {% assign update_var = true %}
11
- {% else %}
12
- {% if talk_start_hour < start_hour %}
13
- {% assign update_var = true %}
14
- {% elsif talk_start_hour == start_hour and talk_start_min < start_min %}
15
- {% assign update_var = true %}
16
- {% endif %}
17
- {% endunless %}
18
-
19
- {% if update_var %}
20
- {% assign start_hour = talk_start_hour %}
21
- {% assign start_min = talk_start_min %}
22
- {% endif %}
23
-
24
- {% assign t = room.talks | last %}
25
- {% include partials/get_talk_time.html %}
26
-
27
- {% assign update_var = false %}
28
-
29
- {% unless end_hour %}
30
- {% assign update_var = true %}
31
- {% else %}
32
- {% if talk_end_hour > end_hour %}
33
- {% assign update_var = true %}
34
- {% elsif talk_end_hour == end_hour and talk_end_min > end_min %}
35
- {% assign update_var = true %}
36
- {% endif %}
37
- {% endunless %}
38
-
39
- {% if update_var %}
40
- {% assign end_hour = talk_end_hour %}
41
- {% assign end_min = talk_end_min %}
42
- {% endif %}
43
- {% endfor %}
44
-
45
- {% assign total_duration_min = end_hour | minus: start_hour | times: 60 | minus: start_min | plus: end_min %}
46
- {% assign nbr_steps = total_duration_min | divided_by: site.conference.program.time_steps %}
47
-
3
+ {% include partials/get_conf_time.html %}
4
+ {% assign nbr_steps = conf_duration_min | divided_by: site.conference.program.time_steps %}
48
5
 
49
6
  <h1 class="display-5 mb-4">
50
7
  {% if page.title %}
@@ -94,8 +51,8 @@
94
51
  {% assign z-index-max = 999 %}
95
52
 
96
53
  {% for i in (1..nbr_steps) %}
97
- {% assign current_hour = i | minus: 1 | times: site.conference.program.time_steps | plus: start_min | divided_by: 60 | floor | plus: start_hour | modulo: 24 %}
98
- {% assign current_min = i | minus: 1 | times: site.conference.program.time_steps | plus: start_min | modulo: 60 %}
54
+ {% assign current_hour = i | minus: 1 | times: site.conference.program.time_steps | plus: conf_start_min | divided_by: 60 | floor | plus: conf_start_hour | modulo: 24 %}
55
+ {% assign current_min = i | minus: 1 | times: site.conference.program.time_steps | plus: conf_start_min | modulo: 60 %}
99
56
  {% if current_min < 10 %}
100
57
  {% assign current_time = current_hour | append: ':0' | append: current_min %}
101
58
  {% else %}
@@ -157,6 +114,9 @@
157
114
  {% include partials/get_main_category.html %}
158
115
  <td rowspan="{{ talk_nbr_steps }}" class="alert alert-{{ main_cat_color }} shadow-sm" style="z-index: {{ z-index-max | minus: i }}">
159
116
 
117
+ {% assign live_button_styleclass = "mb-2" %}
118
+ {% include partials/live_button.html %}
119
+
160
120
  <p class="mb-2">
161
121
  {% include partials/show_talk.html %}
162
122
  </p>
@@ -31,6 +31,9 @@
31
31
  <div class="flex-column">
32
32
  {% include partials/get_talk_time.html %}
33
33
  {% include partials/show_talk_time.html %}
34
+
35
+ {% assign live_button_styleclass = "mb-1" %}
36
+ {% include partials/live_button.html %}
34
37
  </div>
35
38
  <div class="flex-column ml-2 pl-2 mb-2 border-soft-{{ main_cat_color }}">
36
39
  <p class="mb-0">
@@ -17,7 +17,6 @@
17
17
  {% if has_icon_links %}
18
18
  <ul class="list-unstyled">
19
19
  {% for link in speaker.links %}
20
- {% assign link_styleclass = "" %}
21
20
  {% include partials/get_link.html %}
22
21
 
23
22
  {% if link_icon %}
@@ -83,6 +82,9 @@
83
82
  <div class="flex-column ml-2 pl-2 mb-2 border-soft-{{ main_cat_color }}">
84
83
  <p class="mb-0">
85
84
  {% include partials/show_talk.html %}
85
+
86
+ {% assign live_button_styleclass = "ml-2" %}
87
+ {% include partials/live_button.html %}
86
88
  </p>
87
89
  </div>
88
90
  </li>
@@ -29,6 +29,13 @@
29
29
  {% include partials/list_speakers.html %}
30
30
  </p>
31
31
  <p class="mb-0">
32
+ {% for r in site.data.program %}
33
+ {% for t in r.talks %}
34
+ {% if talk.name == t.name %}
35
+ {% include partials/live_button.html %}
36
+ {% endif %}
37
+ {% endfor %}
38
+ {% endfor %}
32
39
  {% include partials/list_sub_categories.html %}
33
40
 
34
41
  {% include partials/get_link_types.html %}
@@ -32,12 +32,24 @@
32
32
  {% for t in r.talks %}
33
33
  {% if talk.name == t.name %}
34
34
 
35
+ {% if site.conference.live %}
36
+ {% assign time_start = t.time_start %}
37
+ {% assign time_end = t.time_end %}
38
+ {% include partials/get_timestamp.html %}
39
+ <span class="live-hide" data-start="{{ timestamp_start }}" data-end="{{ timestamp_end }}">
40
+ {% endif %}
41
+
35
42
  {% include partials/get_talk_time.html %}
36
43
  <span class="d-none d-sm-inline">
37
44
  {{ site.data.lang[site.conference.lang].pronoun.at | default: "at" }}
38
45
  </span>
39
46
  {% include partials/show_talk_time.html %}
40
47
 
48
+ {% if site.conference.live %}
49
+ </span>
50
+ {% include partials/live_button.html %}
51
+ {% endif %}
52
+
41
53
  {% assign room = site.rooms | where: 'name', r.room | first %}
42
54
  <span class="d-none d-sm-inline ml-1">
43
55
  {{ site.data.lang[site.conference.lang].pronoun.in | default: "in" }}
@@ -67,11 +67,27 @@ $fa-font-path: '/assets/webfonts' !default;
67
67
 
68
68
  // General
69
69
 
70
+ // Show pointer cursor on links opening modals
71
+ .cursor-pointer {
72
+ cursor: pointer;
73
+ }
74
+
70
75
  // No bottom margin on info-bar
71
76
  .alert > p:last-of-type {
72
77
  margin-bottom: 0;
73
78
  }
74
79
 
80
+ // Live button icon
81
+ .live-button > object {
82
+ width: 0.85em;
83
+ height: 0.85em;
84
+ color: white;
85
+ }
86
+ // Live button font size in navigation bar
87
+ .nav-link .live-button {
88
+ font-size: 1em;
89
+ }
90
+
75
91
  // Program
76
92
 
77
93
  // Sticky header and first column
@@ -140,6 +156,10 @@ $fa-font-path: '/assets/webfonts' !default;
140
156
  // Program per Room
141
157
  .list-program li > div.flex-column:first-of-type {
142
158
  width: 4em;
159
+
160
+ & > * {
161
+ width: 4.6em;
162
+ }
143
163
  }
144
164
 
145
165
  // Speaker
@@ -163,28 +183,6 @@ $fa-font-path: '/assets/webfonts' !default;
163
183
  }
164
184
  }
165
185
 
166
- // Modal Iframe
167
- // Adapt iframe size to window while preserving video ratio
168
- .modal-body {
169
- position: relative;
170
- width: 100%;
171
- height: 0;
172
- padding-bottom: 56.25%;
173
-
174
- iframe {
175
- position: absolute;
176
- width: 100%;
177
- height: 100%;
178
- left: 0;
179
- top: 0;
180
- }
181
- }
182
-
183
- // Add pointer cursor to links opening modals
184
- .cursor-pointer {
185
- cursor: pointer;
186
- }
187
-
188
186
 
189
187
  // Print
190
188
  @media print {
@@ -214,4 +212,12 @@ $fa-font-path: '/assets/webfonts' !default;
214
212
  .table th {
215
213
  position: inherit;
216
214
  }
215
+
216
+ // Remove live buttons
217
+ .live-show {
218
+ display: none;
219
+ }
220
+ .live-hide {
221
+ display: inline-block !important;
222
+ }
217
223
  }
@@ -0,0 +1,81 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <!--
3
+ Original source of icon:
4
+ Font Awesome Free 5.15.1 by @fontawesome
5
+ https://fontawesome.com/license/free
6
+ CC BY 4.0 https://creativecommons.org/licenses/by/4.0/
7
+
8
+ Modified as following:
9
+ - Original path split from one into three separate paths (for each of the visual distinctive shapes)
10
+ - Animation of each path
11
+ - Removed attributes from SVG element to pass W3 validator
12
+ -->
13
+ <svg
14
+ focusable="false"
15
+ role="img"
16
+ viewBox="0 0 448 512"
17
+ xmlns="http://www.w3.org/2000/svg">
18
+ <path
19
+ id="dot"
20
+ fill="white"
21
+ d="M 128.081,415.959 C 128.081,451.328 99.409,480 64.04,480 28.671,480 0,451.328 0,415.959 0,380.59 28.672,351.918 64.041,351.918 c 35.369,0 64.04,28.673 64.04,64.041 z">
22
+ <animate
23
+ id="dot_hide"
24
+ attributeType="CSS"
25
+ attributeName="opacity"
26
+ from="0"
27
+ to="0"
28
+ dur="0.5s"
29
+ begin="0s;dot_animate.end+7.35s" />
30
+ <animate
31
+ id="dot_animate"
32
+ attributeType="CSS"
33
+ attributeName="opacity"
34
+ from="0"
35
+ to="1"
36
+ dur="0.15s"
37
+ begin="dot_hide.end" />
38
+ </path>
39
+ <path
40
+ id="arc_small"
41
+ fill="white"
42
+ d="M 303.741,463.209 C 295.387,308.609 171.556,184.622 16.791,176.259 7.656,175.765 0,183.105 0,192.253 v 48.069 c 0,8.415 6.49,15.472 14.887,16.018 111.832,7.284 201.473,96.702 208.772,208.772 0.547,8.397 7.604,14.887 16.018,14.887 h 48.069 c 9.149,10e-4 16.489,-7.655 15.995,-16.79 z">
43
+ <animate
44
+ id="arc_small_hide"
45
+ attributeType="CSS"
46
+ attributeName="opacity"
47
+ from="0"
48
+ to="0"
49
+ dur="0.65s"
50
+ begin="dot_hide.begin" />
51
+ <animate
52
+ id="arc_small_animate"
53
+ attributeType="CSS"
54
+ attributeName="opacity"
55
+ from="0"
56
+ to="1"
57
+ dur="0.2s"
58
+ begin="arc_small_hide.end" />
59
+ </path>
60
+ <path
61
+ id="arc_large"
62
+ fill="white"
63
+ d="M 447.99,463.497 C 439.596,229.677 251.465,40.445 16.503,32.01 7.473,31.686 0,38.981 0,48.016 v 48.068 c 0,8.625 6.835,15.645 15.453,15.999 191.179,7.839 344.627,161.316 352.465,352.465 0.353,8.618 7.373,15.453 15.999,15.453 h 48.068 c 9.034,-10e-4 16.329,-7.474 16.005,-16.504 z">
64
+ <animate
65
+ id="arc_large_hide"
66
+ attributeType="CSS"
67
+ attributeName="opacity"
68
+ from="0"
69
+ to="0"
70
+ dur="0.85s"
71
+ begin="dot_hide.begin" />
72
+ <animate
73
+ id="arc_large_animate"
74
+ attributeType="CSS"
75
+ attributeName="opacity"
76
+ from="0"
77
+ to="1"
78
+ dur="0.25s"
79
+ begin="arc_large_hide.end" />
80
+ </path>
81
+ </svg>
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jekyll-theme-conference
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.4.1
4
+ version: 2.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lorenz Schmid
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-11-03 00:00:00.000000000 Z
11
+ date: 2020-11-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jekyll
@@ -62,6 +62,7 @@ files:
62
62
  - LICENSE.md
63
63
  - README.md
64
64
  - _includes/js/bootstrap.js
65
+ - _includes/js/conference-live.js
65
66
  - _includes/js/conference-map.js
66
67
  - _includes/js/conference-modal.js
67
68
  - _includes/js/conference.js
@@ -74,15 +75,19 @@ files:
74
75
  - _includes/js/syncscroll.js
75
76
  - _includes/partials/checks.html
76
77
  - _includes/partials/footer.html
78
+ - _includes/partials/get_conf_time.html
77
79
  - _includes/partials/get_link.html
78
80
  - _includes/partials/get_link_types.html
79
81
  - _includes/partials/get_main_category.html
80
82
  - _includes/partials/get_talk_time.html
83
+ - _includes/partials/get_timestamp.html
81
84
  - _includes/partials/header.html
82
85
  - _includes/partials/info_bar.html
83
86
  - _includes/partials/list_categories.html
84
87
  - _includes/partials/list_speakers.html
85
88
  - _includes/partials/list_sub_categories.html
89
+ - _includes/partials/live-modal.html
90
+ - _includes/partials/live_button.html
86
91
  - _includes/partials/navbar.html
87
92
  - _includes/partials/navbar_rooms.html
88
93
  - _includes/partials/show_room.html
@@ -230,6 +235,7 @@ files:
230
235
  - _sass/leaflet/leaflet-locatecontrol.css
231
236
  - _sass/leaflet/leaflet.css
232
237
  - assets/css/main.scss
238
+ - assets/icons/live.svg
233
239
  - assets/js/main.js
234
240
  - assets/webfonts/fa-brands-400.eot
235
241
  - assets/webfonts/fa-brands-400.svg