jekyll-theme-conference 2.4.1 → 2.5.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 +4 -4
- data/README.md +39 -9
- data/_includes/js/conference-live.js +307 -0
- data/_includes/js/conference-map.js +31 -10
- data/_includes/js/conference-modal.js +38 -17
- data/_includes/js/conference.js +9 -1
- data/_includes/partials/checks.html +2 -2
- data/_includes/partials/footer.html +6 -2
- data/_includes/partials/get_conf_time.html +54 -0
- data/_includes/partials/get_link.html +6 -0
- data/_includes/partials/get_timestamp.html +4 -0
- data/_includes/partials/live-modal.html +29 -0
- data/_includes/partials/live_button.html +19 -0
- data/_includes/partials/navbar.html +30 -0
- data/_includes/partials/show_room.html +1 -1
- data/_includes/partials/show_talk_duration.html +1 -1
- data/_includes/partials/show_talk_time.html +1 -1
- data/_layouts/program.html +7 -47
- data/_layouts/room.html +3 -0
- data/_layouts/speaker.html +3 -1
- data/_layouts/talk-overview.html +7 -0
- data/_layouts/talk.html +12 -0
- data/_sass/conference.scss +28 -22
- data/assets/icons/live.svg +81 -0
- metadata +8 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 85035d6385b1339b58d26c9aa7656bb63c390e82e59b995a954b032bda281b61
|
4
|
+
data.tar.gz: 6cde36017cc9d2b667ea921edcb6ed8938fea8cf63b87169f2ea8399b0e42b53
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
-
###
|
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
|
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
|
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>
|
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
|
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
|
-
|
1
|
+
window.conference.mapConfig = (function() {
|
2
2
|
|
3
|
-
|
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
|
-
|
9
|
-
|
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
|
-
|
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.
|
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
|
-
|
6
|
-
|
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
|
-
|
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
|
-
|
37
|
-
|
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();
|
data/_includes/js/conference.js
CHANGED
@@ -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 <
|
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
|
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">×</span>
|
12
12
|
</button>
|
13
13
|
</div>
|
14
|
-
<div class="modal-body">
|
15
|
-
<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">×</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
|
-
<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>
|
data/_layouts/program.html
CHANGED
@@ -1,50 +1,7 @@
|
|
1
1
|
{% include partials/header.html %}
|
2
2
|
|
3
|
-
{%
|
4
|
-
|
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:
|
98
|
-
{% assign current_min = i | minus: 1 | times: site.conference.program.time_steps | plus:
|
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>
|
data/_layouts/room.html
CHANGED
@@ -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">
|
data/_layouts/speaker.html
CHANGED
@@ -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>
|
data/_layouts/talk-overview.html
CHANGED
@@ -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 %}
|
data/_layouts/talk.html
CHANGED
@@ -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" }}
|
data/_sass/conference.scss
CHANGED
@@ -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
|
+
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-
|
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
|