jekyll-theme-conference 2.5.0 → 2.5.1

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: 85035d6385b1339b58d26c9aa7656bb63c390e82e59b995a954b032bda281b61
4
- data.tar.gz: 6cde36017cc9d2b667ea921edcb6ed8938fea8cf63b87169f2ea8399b0e42b53
3
+ metadata.gz: 7a6617ea192ab16d014da7430f23276860d7ecce37cdd591815103bb086efb65
4
+ data.tar.gz: a31e631388e20578008dcef761e416a5a53c53166b068ecb410ee0f75b1f9196
5
5
  SHA512:
6
- metadata.gz: 6ee86daa817de1f8ce650b73c8a1116a28293307da1cfe10abd775331251d88af1a33e6dbc425011cf5d4358e89978e2601cf5eaf35c22874222715f170c0a88
7
- data.tar.gz: 93606208e131a2d476732a828248cbdc7d58cf28ed0e6e678a585d677e18b6939721a6ca099a1f7805e0b431e2585989168aed5e45f009f7d35780b498d615ba
6
+ metadata.gz: ef931eb98d10bc467358f2948e76b15ac8d11a8abe1d7528688a5f672fcb8127a31cbe46165f41b355d58d186ca83a5d010d5b5cb0abfb41f685296c908421ae
7
+ data.tar.gz: a3ef7ee1df36b5280534f5819d10c21c2447f9430650e89d0aa4923243656d51d4e2483c888adfe2e30cfb18b0e0d40584add7dc4c3449ba997d604d1f6b9684
data/README.md CHANGED
@@ -89,6 +89,10 @@ The different talks, speakers and rooms are stored as a collection of files. Eac
89
89
 
90
90
  The actual schedule defining when and in which room a talk takes place is stored as a [YAML data file](https://jekyllrb.com/docs/datafiles/) under `_data/program.yml`. For further details about it see below in the section _Content_.
91
91
 
92
+ :warning: Please note that the generated website can be quite large containing many unnecessary whitespaces. It is recommended to minimize the generated output files before uploading them to a server (e.g. with [minify](https://github.com/tdewolff/minify)).
93
+
94
+ ### Jump Start
95
+
92
96
  In order to be up and running simply use the default content of this repository as an initial base for your new website. After having setup a new Jekyll website copy the following files and folders into the website's folder:
93
97
 
94
98
  - `_config.example.yml` -> `_config.yml`
@@ -102,11 +106,23 @@ In order to be up and running simply use the default content of this repository
102
106
  - `speakers/`
103
107
  - `talks/`
104
108
 
105
- There exists a Python file in this repository, `create_entries.py`, which can be used to import content from a CSV table and generate the different talk, speakers and room files automatically based on it. Just open your terminal and type `python create_entries.py --help` to show the help and get started.
109
+ ### Automatic Import
110
+
111
+ There exists a Python file in this repository, `create_entries.py`, which can be used to import content from a [frab](https://github.com/frab/frab/wiki/Manual#introduction) compatible JSON file or a CSV table and generate the different talk, speakers and room files automatically based on it. Just open your terminal and type `python create_entries.py --help` to show the help and get started.
112
+
113
+ ### Automatic Build
114
+
115
+ In case you do not want to install the entire Ruby/Jekyll toolchain on your machine you can make use of [GitHub Actions](https://github.com/features/actions), Github's continuous integration platform. This repository contains an example Github Action configuration file which automatically builds and minimizes the website upon adding a new tag. It then attaches the generated website as package to a release for easy downloading. Simply copy the following file to your repository and adapt it to your needs:
106
116
 
107
- In case you do not want to install the entire Ruby/Jekyll toolchain on your machine you can make use of [GitHub Actions](https://github.com/features/actions), Github's continuous integration platform. This repository contains an example Github Action configuration file which automatically builds the website upon adding a new tag. It then attaches the generated website as package to a release for easy downloading. Simply copy the following file to your repository and adapt it to your needs:
117
+ - `workflow-example.yml` -> `.github/workflows/main.yml`
108
118
 
109
- - `workflows.example.yml` -> `.github/workflows.main.yml`
119
+ Hidden rooms, speakers, or talks are automatically generated in way containing no content. In order to remove these empty files simply add a file called `delete_hidden.sh` to the root with the following content. It will automatically called by the Github Action workflow to delete the files.
120
+
121
+ ```markdown
122
+ ---
123
+ layout: delete_hidden
124
+ ---
125
+ ```
110
126
 
111
127
 
112
128
  ## Configuration
@@ -124,6 +140,8 @@ conference:
124
140
  show_errors: false
125
141
  ```
126
142
 
143
+ :warning: Please be sure to disable this parameter for your production system.
144
+
127
145
  ### Collection URLs
128
146
 
129
147
  The three required collections containing the files for the talks, speakers and rooms have to be specified in the `_config.yml` file. The first block declares them and sets the URL under which they will later be accessed. The second block defines the default layout for each of the collection.
@@ -1,4 +1,4 @@
1
- window.conference.live = (function() {
1
+ window.conference.live = (function() {
2
2
  {%- include partials/get_conf_time.html -%}
3
3
  {%- assign time_start = conf_start -%}
4
4
  {%- assign time_end = conf_end -%}
@@ -6,6 +6,7 @@ window.conference.live = (function() {
6
6
 
7
7
  let confStart = {{ timestamp_start }};
8
8
  let confEnd = {{ timestamp_end }};
9
+ let confDur = confEnd - confStart;
9
10
 
10
11
  let freezeTime = false;
11
12
  let timeFrozen = 0;
@@ -15,85 +16,126 @@ window.conference.live = (function() {
15
16
  let durDemo = 5*60; // in seconds
16
17
  let durPause = 10; // in seconds
17
18
 
19
+ let demoStart = confStart - confDur/durDemo*durPause;
20
+ let demoEnd = confEnd + confDur/durDemo*durPause;
21
+
18
22
  let liveTimer;
19
- let liveTimerCorr;
23
+ let streamTimer;
24
+
25
+ let mod = function (n, m) {
26
+ return ((n % m) + m) % m;
27
+ };
20
28
 
21
- let timeNowReal = function () {
22
- // Return UNIX timestamp in seconds
29
+ let timeNow = function () {
23
30
  return Math.floor(Date.now() / 1000);
24
31
  };
25
32
 
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;
33
+ let timeCont = function () {
34
+ return timeNow() - timeOffset;
35
+ };
36
+
37
+ let timeCycle = function () {
38
+ let actTime = timeNow();
39
+ let relTime = mod(actTime, durDemo + 2*durPause) / durDemo;
40
+ let cycleTime = mod((demoEnd - demoStart) * relTime - timeOffset, (demoEnd - demoStart)) + demoStart;
30
41
  return cycleTime;
31
42
  };
32
43
 
33
- let timeNow = function() {
44
+ let time = function () {
34
45
  if (freezeTime) {
35
46
  return timeFrozen;
36
47
  }
37
48
  else if (demo) {
38
- return timeNowCycle() - timeOffset;
49
+ return timeCycle();
39
50
  }
40
51
  else {
41
- return timeNowReal() - timeOffset;
52
+ return timeCont();
42
53
  }
43
54
  };
44
55
 
45
56
  let pauseTime = function () {
46
- timeFrozen = timeNow();
47
- freezeTime = true;
57
+ if (!freezeTime) {
58
+ timeFrozen = time();
59
+ freezeTime = true;
60
+
61
+ stopUpdate();
62
+ }
48
63
  };
49
64
 
50
65
  let continueTime = function () {
51
- if (demo) {
52
- timeOffset = timeNowCycle() - timeFrozen;
53
- }
54
- else {
55
- timeOffset = timeNow() - timeFrozen;
66
+ if (freezeTime) {
67
+ freezeTime = false;
68
+ timeOffset += time() - timeFrozen;
69
+ startUpdate();
56
70
  }
57
- freezeTime = false;
58
71
  };
59
72
 
60
73
  let resetTime = function (timeStr) {
61
- continueTime();
62
74
  timeOffset = 0;
75
+ freezeTime = false;
76
+
77
+ startUpdate();
63
78
  };
64
79
 
65
- let setTime = function (timeStr) {
80
+ let setTime = function (newTime) {
66
81
  pauseTime();
67
82
 
68
- let d = new Date(timeNow() * 1000);
69
- time = timeStr.split(':');
70
- d.setHours(time[0], time[1]);
83
+ let d = new Date(confStart * 1000);
84
+ newTime = newTime.split(':');
85
+ d.setHours(newTime[0], newTime[1]);
71
86
 
72
87
  timeFrozen = Math.floor(d.getTime() / 1000);
88
+
89
+ update();
73
90
  };
74
91
 
75
- let getTime = function () {
76
- let d = new Date(timeNow() * 1000);
92
+ let getTime = function (tConvert = time()) {
93
+ let d = new Date(tConvert * 1000);
77
94
  let h = d.getHours();
78
95
  let m = d.getMinutes();
79
96
 
80
97
  return h + ":" + (m < 10 ? "0" : "") + m;
81
98
  };
82
99
 
83
- let timeStart = function () {
84
- let tNow = timeNow();
85
- if (confStart - 60 > tNow) {
86
- // Start when conference start (-60s)
87
- return confStart - 60 - tNow;
100
+ let timeUnit = function () {
101
+ if (demo) {
102
+ return 0.1;
103
+ }
104
+ else {
105
+ return 60;
106
+ }
107
+ };
108
+
109
+ let delayStart = function (startTime) {
110
+ let tNow = time();
111
+ let tUnit = timeUnit();
112
+
113
+ if (demo) {
114
+ // Convert virtual duration to real duration
115
+ return mod(startTime - tNow, demoEnd - demoStart) / (demoEnd - demoStart) * (durDemo + 2*durPause);
88
116
  }
89
117
  else {
90
- // Start on the minute
91
- return (60 - (tNow % 60));
118
+ if (startTime > tNow) {
119
+ return startTime - tNow;
120
+ }
121
+ else {
122
+ // Start on the unit
123
+ return (tUnit - (tNow % tUnit));
124
+ }
92
125
  }
93
126
  };
94
127
 
95
- let updateLiveButtons = function() {
96
- let tNow = timeNow();
128
+ let toggleDemo = function () {
129
+ demo = !demo;
130
+ resetTime();
131
+ };
132
+
133
+ let demoOn = function () {
134
+ return demo;
135
+ };
136
+
137
+ let updateLive = function () {
138
+ let tNow = time();
97
139
  let liveShow = document.getElementsByClassName('live-show');
98
140
  let liveHide = document.getElementsByClassName('live-hide');
99
141
 
@@ -127,39 +169,32 @@ window.conference.live = (function() {
127
169
  }
128
170
  }
129
171
 
130
- if (timeNow() > confEnd && !demo) {
172
+ if (tNow > confEnd && !demo) {
131
173
  // Cancel timer after program is over
132
- clearInterval(liveTimer);
174
+ stopUpdateLive();
133
175
  }
134
176
  };
135
177
 
136
- let startUpdate = function () {
137
- if(typeof liveTimer !== "undefined") {
138
- clearInterval(liveTimer);
139
- }
140
- updateLiveButtons();
178
+ let startUpdateLive = function () {
179
+ stopUpdateLive();
180
+ updateLive();
141
181
 
142
182
  if (demo) {
143
- liveTimerCorr = (confEnd - confStart) / (durDemo - 2*durPause);
144
- liveTimer = setInterval(updateLiveButtons, 100);
183
+ // Immediate start required since delayStart would wait for next wrap around
184
+ liveTimer = setInterval(updateLive, timeUnit() * 1000);
145
185
  }
146
186
  else {
147
- liveTimerCorr = 1;
148
187
  setTimeout(function() {
149
- liveTimer = setInterval(updateLiveButtons, 60*1000);
150
- updateLiveButtons();
151
- }, timeStart() * 1000);
188
+ liveTimer = setInterval(updateLive, timeUnit() * 1000);
189
+ updateLive();
190
+ }, delayStart(confStart) * 1000);
152
191
  }
153
192
  };
154
193
 
155
- let toggleDemo = function () {
156
- demo = !demo;
157
- timeOffset = 0;
158
- startUpdate();
159
- };
160
-
161
- let demoOn = function() {
162
- return demo;
194
+ let stopUpdateLive = function () {
195
+ if (typeof liveTimer !== "undefined") {
196
+ clearInterval(liveTimer);
197
+ }
163
198
  };
164
199
 
165
200
  {% if site.conference.live.streaming -%}
@@ -198,65 +233,102 @@ window.conference.live = (function() {
198
233
  };
199
234
 
200
235
  let streamModal;
201
- let streamTimer;
202
236
 
203
- let preStartStream = function(href, startTime, endTime) {
237
+ let getRoom = function (roomName) {
238
+ if (roomName in rooms) {
239
+ return rooms[roomName];
240
+ }
241
+ else {
242
+ return rooms[Object.keys(rooms)[0]];
243
+ }
244
+ };
245
+
246
+ let preStartStream = function (roomName) {
247
+ let room = getRoom(roomName);
248
+
204
249
  streamModal.find('iframe').attr('src', '');
205
250
  streamModal.find('iframe').addClass('d-none');
206
251
  streamModal.find('#stream-placeholder > div').text('{{ site.data.lang[site.conference.lang].live.pre_stream | default: "Live stream has not started yet." }}');
207
252
  streamModal.find('#stream-placeholder').addClass('d-flex');
208
253
 
209
- if(typeof streamTimer !== "undefined") {
210
- clearTimeout(streamTimer);
254
+ stopUpdateStream();
255
+ if (!freezeTime) {
256
+ streamTimer = setTimeout(activeStream, delayStart(room.start) * 1000, roomName);
211
257
  }
212
- streamTimer = setTimeout(activeStream, (startTime - timeNow())/liveTimerCorr*1000, href, endTime);
213
- }
258
+ };
259
+
260
+ let activeStream = function (roomName) {
261
+ let room = getRoom(roomName);
214
262
 
215
- let activeStream = function(href, endTime) {
216
- streamModal.find('iframe').attr('src', href);
263
+ streamModal.find('iframe').attr('src', room.href);
217
264
  streamModal.find('#stream-placeholder').addClass('d-none').removeClass('d-flex');
218
265
  streamModal.find('iframe').removeClass('d-none');
219
266
 
220
- if(typeof streamTimer !== "undefined") {
221
- clearTimeout(streamTimer);
267
+ stopUpdateStream();
268
+ if (!freezeTime) {
269
+ streamTimer = setTimeout(postEndStream, delayStart(room.end) * 1000, roomName);
222
270
  }
223
- streamTimer = setTimeout(postEndStream, (endTime - timeNow())/liveTimerCorr*1000);
224
- }
271
+ };
272
+
273
+ let postEndStream = function (roomName) {
274
+ let room = getRoom(roomName);
225
275
 
226
- let postEndStream = function() {
227
276
  streamModal.find('iframe').attr('src', '');
228
277
  streamModal.find('iframe').addClass('d-none');
229
278
  streamModal.find('#stream-placeholder > div').text('{{ site.data.lang[site.conference.lang].live.post_stream | default: "Live stream has ended." }}');
230
279
  streamModal.find('#stream-placeholder').addClass('d-flex');
231
- }
232
280
 
233
- let setStream = function (roomName) {
234
- if (roomName in rooms) {
235
- room = rooms[roomName];
236
- }
237
- else {
238
- room = rooms[Object.keys(rooms)[0]];
281
+ stopUpdateStream();
282
+ if (!freezeTime && demo) {
283
+ streamTimer = setTimeout(preStartStream, delayStart(demoStart) * 1000, roomName);
239
284
  }
285
+ };
240
286
 
287
+ let setStream = function (roomName) {
241
288
  streamModal.find('.modal-footer .btn').removeClass('active');
242
- if (timeNow() < room.start) {
243
- preStartStream(room.href, room.start, room.end);
289
+ streamModal.find('#stream-select').selectedIndex = -1;
290
+
291
+ let room = getRoom(roomName);
292
+ let tNow = time();
293
+
294
+ if (tNow < room.start) {
295
+ preStartStream(roomName);
244
296
  }
245
- else if (timeNow() > room.end) {
246
- postEndStream();
297
+ else if (tNow > room.end) {
298
+ postEndStream(roomName);
247
299
  }
248
300
  else {
249
- activeStream(room.href, room.end);
301
+ activeStream(roomName);
250
302
  }
303
+
251
304
  streamModal.find('#stream-button' + room.id).addClass('active');
305
+ streamModal.find('#stream-select').selectedIndex = room.id;
306
+ };
307
+
308
+ let updateStream = function () {
309
+ if (streamModal.hasClass('show')) {
310
+ let activeButton = streamModal.find('.modal-footer .btn.active');
311
+ let roomName = activeButton.data('room');
312
+
313
+ if (typeof roomName !== "undefined") {
314
+ setStream(roomName);
315
+ }
316
+ }
317
+ };
318
+
319
+ let stopUpdateStream = function () {
320
+ if (typeof streamTimer !== "undefined") {
321
+ clearInterval(streamTimer);
322
+ }
252
323
  };
253
324
 
254
325
  let hideModal = function (event) {
255
326
  streamModal.find('iframe').attr('src', '');
256
327
  streamModal.find('.modal-footer .btn').removeClass('active');
328
+ streamModal.find('#stream-select').selectedIndex = -1;
257
329
  };
258
330
 
259
- let startStream = function() {
331
+ let setupStream = function () {
260
332
  streamModal = $('#stream-modal');
261
333
 
262
334
  streamModal.on('show.bs.modal', function (event) {
@@ -271,24 +343,60 @@ window.conference.live = (function() {
271
343
  streamModal.find('.modal-footer .btn').on('click', function(event) {
272
344
  event.preventDefault();
273
345
 
274
- let roomName = $(this).data('room')
346
+ let roomName = $(this).data('room');
347
+ setStream(roomName);
348
+ });
349
+
350
+ streamModal.find('#stream-select').on('change', function(event) {
351
+ event.preventDefault();
352
+
353
+ let roomName = $(this).children('option:selected').text();
275
354
  setStream(roomName);
276
355
  });
277
356
  };
278
357
 
358
+ let setup = function () {
359
+ startUpdateLive();
360
+ setupStream();
361
+ };
362
+
363
+ let update = function () {
364
+ updateLive();
365
+ updateStream();
366
+ };
367
+
368
+ let startUpdate = function () {
369
+ startUpdateLive();
370
+ updateStream();
371
+ };
372
+
373
+ let stopUpdate = function () {
374
+ stopUpdateLive();
375
+ stopUpdateStream();
376
+ };
377
+
279
378
  {%- else -%}
280
379
 
281
- let startStream = function() {};
380
+ let setup = function () {
381
+ startUpdateLive();
382
+ };
282
383
 
283
- {%- endif %}
384
+ let update = function () {
385
+ updateLive();
386
+ };
284
387
 
285
- let init = function () {
286
- startUpdate();
287
- startStream();
288
- };
388
+ let startUpdate = function () {
389
+ startUpdateLive();
390
+ };
391
+
392
+ let stopUpdate = function () {
393
+ stopUpdateLive();
394
+ };
395
+
396
+ {%- endif %}
289
397
 
290
398
  return {
291
- init: init,
399
+ init: setup,
292
400
 
293
401
  pauseTime: pauseTime,
294
402
  continueTime: continueTime,
@@ -297,7 +405,7 @@ window.conference.live = (function() {
297
405
  getTime: getTime,
298
406
 
299
407
  toggleDemo: toggleDemo,
300
- demoOn: demoOn,
408
+ demo: demoOn,
301
409
  durDemo: durDemo,
302
410
  durPause: durPause
303
411
  };
@@ -67,10 +67,10 @@
67
67
 
68
68
  {% capture link_tag -%}
69
69
  {%- if link.disabled -%}
70
- <a class="disabled{% if link_styleclass %} {{ link_styleclass }}{% endif %}">
70
+ <a class="disabled{% if link_styleclass %} {{ link_styleclass }}{% endif %}" href="#">
71
71
 
72
72
  {%- elsif link_iframe -%}
73
- <a class="cursor-pointer{% if link_styleclass %} {{ link_styleclass }}{% endif %}" title="{{ link.name }}" data-toggle="modal" data-target="#link-modal" data-href="{{ link_href }}" {% if modal_header -%}
73
+ <a {% if link_styleclass %}class="{{ link_styleclass }}"{% endif %} title="{{ link.name }}" data-toggle="modal" data-target="#link-modal" data-href="{{ link_href }}" href="#" {% if modal_header -%}
74
74
  data-header="{{ modal_header | strip_newlines | escape }}"
75
75
  {%- elsif modal_title -%}
76
76
  data-title="{{ modal_title }}"
@@ -8,8 +8,21 @@
8
8
  <title>
9
9
  {% unless page.name contains '.' %}{{ page.name }} - {% else %}{% if page.title %}{{ page.title }} - {% endif %}{% endunless %}{{ site.title }}
10
10
  </title>
11
+ <meta name="description" content="{{ site.description }}" />
11
12
 
12
13
  <link rel="stylesheet" href="{{ site.baseurl }}/assets/css/main.css" />
14
+
15
+ {%- if site.conference.live -%}
16
+ <link rel="prefetch" href="{{ site.baseurl }}/assets/icons/live.svg" />
17
+ {%- endif -%}
18
+
19
+ {%- if site.conference.live.streaming -%}
20
+ {%- for room in site.rooms -%}
21
+ {%- if room.live -%}
22
+ <link rel="preconnect" href="{{ room.live }}" />
23
+ {%- endif -%}
24
+ {%- endfor -%}
25
+ {%- endif -%}
13
26
  </head>
14
27
 
15
28
  <body class="pb-4">
@@ -19,10 +19,18 @@
19
19
  {% for r in site.data.program %}
20
20
  {% assign room = site.rooms | where: 'name', r.room | first %}
21
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 }}">
22
+ <a id="stream-button{{ forloop.index }}" href="#" class="btn btn-outline-primary d-none d-sm-inline {% unless room.live %}disabled{% endunless %}" role="button" data-room="{{ room.name }}">
23
23
  {{ room.name }}
24
24
  </a>
25
25
  {% endfor %}
26
+ <div class="form-group w-100 d-block d-sm-none">
27
+ <select class="form-control" id="stream-select">
28
+ {% for r in site.data.program %}
29
+ {% assign room = site.rooms | where: 'name', r.room | first %}
30
+ <option {% unless room.live %}disabled{% endunless %}>{{ room.name }}</option>
31
+ {% endfor %}
32
+ </select>
33
+ </div>
26
34
  </div>
27
35
  </div>
28
36
  </div>
@@ -4,11 +4,11 @@
4
4
  {% include partials/get_timestamp.html %}
5
5
 
6
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
7
+ <a title="{{ link.name }}" data-toggle="modal" data-target="#stream-modal" data-room="{{ r.room }}" href="#"
8
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>
9
+ <span
10
+ {%- endif %} class="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
12
  {{ site.data.lang[site.conference.lang].live.live | default: "Live" }}
13
13
  {%- if site.conference.live.streaming -%}
14
14
  </a>
@@ -40,7 +40,7 @@
40
40
 
41
41
  <li class="nav-item live-show d-none" data-start="{{ timestamp_start }}" data-end="{{ timestamp_end }}">
42
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="">
43
+ <a class="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="" href="#">
44
44
  {% else %}
45
45
  {% assign link_styleclass = "nav-link" %}
46
46
  {% include partials/get_link.html %}
@@ -50,7 +50,7 @@
50
50
  {{ link.name | default: "" }}
51
51
 
52
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>
53
+ <object data="{{ site.baseurl }}/assets/icons/live.svg" type="image/svg+xml">!</object>
54
54
  {{ site.data.lang[site.conference.lang].live.live | default: "Live" }}
55
55
  </span>
56
56
  </a>
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env bash
2
+
3
+ {% if site.conference.location.hide -%}
4
+ rm -r rooms
5
+ rm -r {{ site.conference.location.url | default: "location" }}
6
+ {% else -%}
7
+ {%- for room in site.rooms -%}
8
+ {%- if room.hide -%}
9
+ rm -r {{ room.url | slice: 1, room.url.size }}
10
+ {% endif -%}
11
+ {%- endfor -%}
12
+ {%- endif -%}
13
+
14
+ {%- for speaker in site.speakers -%}
15
+ {%- if speaker.hide -%}
16
+ rm -r {{ speaker.url | slice: 1, speaker.url.size }}
17
+ {% endif -%}
18
+ {%- endfor -%}
19
+
20
+ {%- for talk in site.talks -%}
21
+ {%- if talk.hide -%}
22
+ rm -r {{ talk.url | slice: 1, talk.url.size }}
23
+ {% endif -%}
24
+ {%- endfor %}
25
+ rm delete_hidden.sh
@@ -1,4 +1,7 @@
1
- {% include partials/header.html %}
1
+ {%- assign this_room = page -%}
2
+
3
+ {%- unless this_room.hide or site.conference.location.hide -%}
4
+ {%- include partials/header.html -%}
2
5
 
3
6
  <!-- title for print: -->
4
7
  <h1 class="display-5 mb-3 d-none d-print-inline">
@@ -10,7 +13,6 @@
10
13
  {{ site.data.lang[site.conference.lang].location.title | default: "Location" }}
11
14
  </h1>
12
15
 
13
- {% assign this_room = page %}
14
16
  {% include partials/navbar_rooms.html %}
15
17
 
16
18
  {{ content }}
@@ -60,4 +62,5 @@
60
62
 
61
63
  </ul>
62
64
 
63
- {% include partials/footer.html %}
65
+ {%- include partials/footer.html -%}
66
+ {%- endunless -%}
@@ -1,6 +1,7 @@
1
- {% include partials/header.html %}
1
+ {%- assign speaker = page -%}
2
2
 
3
- {% assign speaker = page %}
3
+ {%- unless speaker.hide -%}
4
+ {%- include partials/header.html -%}
4
5
 
5
6
  <p class="h6">
6
7
  {{ site.data.lang[site.conference.lang].speaker.title | default: "Speaker" }}
@@ -104,4 +105,5 @@
104
105
  </a>
105
106
  </p>
106
107
 
107
- {% include partials/footer.html %}
108
+ {%- include partials/footer.html -%}
109
+ {%- endunless -%}
@@ -46,7 +46,7 @@
46
46
  {% include partials/get_link.html %}
47
47
  {% if link_icon %}
48
48
  {{ link_tag -}}
49
- <i class="fas fa-{{ link_icon }} pr-1"></i></a>
49
+ <i class="fas fa-{{ link_icon }} p-1"></i></a>
50
50
  {% endif %}
51
51
  {% endfor %}
52
52
  </span>
@@ -1,6 +1,7 @@
1
- {% include partials/header.html %}
1
+ {%- assign talk = page -%}
2
2
 
3
- {% assign talk = page %}
3
+ {%- unless talk.hide -%}
4
+ {%- include partials/header.html -%}
4
5
 
5
6
  <div class="d-flex flex-lg-row flex-column container-fluid mb-2 p-0">
6
7
  <div class="h6 mt-2 mb-0 mr-1 pr-1 pb-1">
@@ -119,4 +120,5 @@
119
120
  </a>
120
121
  </p>
121
122
 
122
- {% include partials/footer.html %}
123
+ {%- include partials/footer.html -%}
124
+ {%- endunless -%}
@@ -67,11 +67,6 @@ $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
-
75
70
  // No bottom margin on info-bar
76
71
  .alert > p:last-of-type {
77
72
  margin-bottom: 0;
@@ -25,7 +25,7 @@
25
25
  attributeName="opacity"
26
26
  from="0"
27
27
  to="0"
28
- dur="0.5s"
28
+ dur="500ms"
29
29
  begin="0s;dot_animate.end+7.35s" />
30
30
  <animate
31
31
  id="dot_animate"
@@ -33,7 +33,7 @@
33
33
  attributeName="opacity"
34
34
  from="0"
35
35
  to="1"
36
- dur="0.15s"
36
+ dur="150ms"
37
37
  begin="dot_hide.end" />
38
38
  </path>
39
39
  <path
@@ -46,7 +46,7 @@
46
46
  attributeName="opacity"
47
47
  from="0"
48
48
  to="0"
49
- dur="0.65s"
49
+ dur="650ms"
50
50
  begin="dot_hide.begin" />
51
51
  <animate
52
52
  id="arc_small_animate"
@@ -54,7 +54,7 @@
54
54
  attributeName="opacity"
55
55
  from="0"
56
56
  to="1"
57
- dur="0.2s"
57
+ dur="200ms"
58
58
  begin="arc_small_hide.end" />
59
59
  </path>
60
60
  <path
@@ -67,7 +67,7 @@
67
67
  attributeName="opacity"
68
68
  from="0"
69
69
  to="0"
70
- dur="0.85s"
70
+ dur="850ms"
71
71
  begin="dot_hide.begin" />
72
72
  <animate
73
73
  id="arc_large_animate"
@@ -75,7 +75,7 @@
75
75
  attributeName="opacity"
76
76
  from="0"
77
77
  to="1"
78
- dur="0.25s"
78
+ dur="250ms"
79
79
  begin="arc_large_hide.end" />
80
80
  </path>
81
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.5.0
4
+ version: 2.5.1
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-08 00:00:00.000000000 Z
11
+ date: 2020-11-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jekyll
@@ -95,6 +95,7 @@ files:
95
95
  - _includes/partials/show_talk_duration.html
96
96
  - _includes/partials/show_talk_time.html
97
97
  - _layouts/default.html
98
+ - _layouts/delete_hidden.html
98
99
  - _layouts/home.html
99
100
  - _layouts/location.html
100
101
  - _layouts/page.html