use real time
This commit is contained in:
parent
6f06075dfe
commit
748ba51910
|
@ -0,0 +1,93 @@
|
||||||
|
@import "../../fonts/fonts";
|
||||||
|
@import "../styles/_variables";
|
||||||
|
|
||||||
|
* {
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
margin: 0px;
|
||||||
|
padding: 0px;
|
||||||
|
color: white;
|
||||||
|
background: rgb(30,30,30);
|
||||||
|
}
|
||||||
|
|
||||||
|
.header {
|
||||||
|
margin: 0px;
|
||||||
|
|
||||||
|
padding-left: 60px;
|
||||||
|
padding-top: 30px;
|
||||||
|
padding-bottom: 30px;
|
||||||
|
|
||||||
|
margin-bottom: 40px;
|
||||||
|
|
||||||
|
// color: lavender;
|
||||||
|
// background: cornflowerblue;
|
||||||
|
// border-bottom: 12px solid royalblue;
|
||||||
|
|
||||||
|
// color: white;
|
||||||
|
// background: #217867;
|
||||||
|
// border-bottom: 12px solid #165044;
|
||||||
|
|
||||||
|
color: white;
|
||||||
|
background: mediumseagreen;
|
||||||
|
border-bottom: 12px solid seagreen;
|
||||||
|
|
||||||
|
font-family: 'Permanent Marker';
|
||||||
|
font-size: 5em;
|
||||||
|
font-weight: 400;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content {
|
||||||
|
margin-left: 60px;
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
margin-bottom: 10px;
|
||||||
|
|
||||||
|
font-family: 'Architects Daughter';
|
||||||
|
font-size: 2em;
|
||||||
|
font-weight: 400;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul {
|
||||||
|
list-style: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.infopointitem {
|
||||||
|
padding-bottom: 5px;
|
||||||
|
line-height: 20px;
|
||||||
|
|
||||||
|
// white-space: nowrap;
|
||||||
|
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bullet {
|
||||||
|
padding-right: 0.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ul li::before {
|
||||||
|
// content: "-> ";
|
||||||
|
// }
|
||||||
|
|
||||||
|
.infopoint {
|
||||||
|
padding-left: 0.5em;
|
||||||
|
text-decoration: none;
|
||||||
|
|
||||||
|
// color: #ff6600;
|
||||||
|
color: mediumaquamarine;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
// color: #d45500;
|
||||||
|
color: aquamarine;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.redirect {
|
||||||
|
font-size: 0.8rem;
|
||||||
|
|
||||||
|
li {
|
||||||
|
padding: 0px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
@import "../styles/_base";
|
|
@ -0,0 +1,4 @@
|
||||||
|
@import "../styles/_base";
|
||||||
|
|
||||||
|
@import "../styles/_schedule";
|
||||||
|
@import "../styles/_clock";
|
|
@ -0,0 +1,4 @@
|
||||||
|
@import "../styles/_base";
|
||||||
|
|
||||||
|
@import "../styles/_schedule";
|
||||||
|
@import "../styles/_clock";
|
|
@ -0,0 +1,3 @@
|
||||||
|
@import "../styles/_base";
|
||||||
|
|
||||||
|
@import "../styles/_banner-speaker";
|
|
@ -0,0 +1,3 @@
|
||||||
|
@import "../styles/_base";
|
||||||
|
|
||||||
|
@import "../styles/_banner-talk";
|
|
@ -0,0 +1,3 @@
|
||||||
|
@import "../styles/_base";
|
||||||
|
|
||||||
|
@import "../styles/_upcoming-talk";
|
|
@ -0,0 +1,3 @@
|
||||||
|
@import "../styles/_base";
|
||||||
|
|
||||||
|
@import "../styles/_voc-schedule";
|
|
@ -0,0 +1,3 @@
|
||||||
|
@import "../styles/_base";
|
||||||
|
|
||||||
|
@import "../styles/_voc-speaker";
|
|
@ -0,0 +1,3 @@
|
||||||
|
@import "../styles/_base";
|
||||||
|
|
||||||
|
@import "../styles/_voc-talks";
|
|
@ -0,0 +1,68 @@
|
||||||
|
@import "_variables";
|
||||||
|
@import "_base";
|
||||||
|
|
||||||
|
.slide {
|
||||||
|
background-color: $color-bg;
|
||||||
|
}
|
||||||
|
|
||||||
|
.speaker-box {
|
||||||
|
// position: absolute;
|
||||||
|
position: relative;
|
||||||
|
// top: 963px;
|
||||||
|
// top: 975px;
|
||||||
|
// top: 947px;
|
||||||
|
top: 910px;
|
||||||
|
|
||||||
|
// left: 50px;
|
||||||
|
left: 150px;
|
||||||
|
|
||||||
|
width: auto;
|
||||||
|
|
||||||
|
// max-width: 1350px;
|
||||||
|
// max-width: 1400px;
|
||||||
|
max-width: 1600px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.speaker {
|
||||||
|
background-color: $color-ci-green;
|
||||||
|
|
||||||
|
// border-width: 5px;
|
||||||
|
// border-style: solid;
|
||||||
|
// border-color: $color-ci-green;
|
||||||
|
|
||||||
|
// box-shadow: 0px 0px 5px 5px rgba(0,0,0,0.2);
|
||||||
|
box-shadow: 8px 6px 0px $color-bg;
|
||||||
|
|
||||||
|
// vertical-align: middle;
|
||||||
|
white-space: normal;
|
||||||
|
|
||||||
|
// padding: 10px 15px;
|
||||||
|
padding: 5px 15px;
|
||||||
|
|
||||||
|
font-family: 'Lato';
|
||||||
|
font-weight: 700;
|
||||||
|
font-size: 60px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.speaker .title {
|
||||||
|
// color: $color-ci-green;
|
||||||
|
}
|
||||||
|
|
||||||
|
.speaker .names {
|
||||||
|
display: -webkit-box;
|
||||||
|
-webkit-line-clamp: 1;
|
||||||
|
box-orient: vertical;
|
||||||
|
-webkit-box-orient: vertical;
|
||||||
|
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
|
||||||
|
white-space: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
img {
|
||||||
|
display: none;
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
}
|
|
@ -0,0 +1,82 @@
|
||||||
|
@import "_variables";
|
||||||
|
@import "_base";
|
||||||
|
|
||||||
|
.slide {
|
||||||
|
background-color: $color-bg;
|
||||||
|
}
|
||||||
|
|
||||||
|
.talk-box {
|
||||||
|
// position: absolute;
|
||||||
|
position: relative;
|
||||||
|
top: 975px;
|
||||||
|
// left: 50px;
|
||||||
|
left: 100px;
|
||||||
|
|
||||||
|
width: auto;
|
||||||
|
|
||||||
|
// max-width: 1350px;
|
||||||
|
max-width: 1400px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.talk {
|
||||||
|
background-color: $color-ci-green;
|
||||||
|
|
||||||
|
// border-width: 5px;
|
||||||
|
// border-style: solid;
|
||||||
|
// border-color: $color-ci-green;
|
||||||
|
|
||||||
|
// box-shadow: 0px 0px 5px 5px rgba(0,0,0,0.2);
|
||||||
|
|
||||||
|
// vertical-align: middle;
|
||||||
|
white-space: normal;
|
||||||
|
|
||||||
|
// padding: 10px 15px;
|
||||||
|
padding: 5px 10px;
|
||||||
|
|
||||||
|
font-family: 'Lato';
|
||||||
|
font-weight: 400;
|
||||||
|
}
|
||||||
|
|
||||||
|
.talk .title {
|
||||||
|
display: -webkit-box;
|
||||||
|
-webkit-line-clamp: 1;
|
||||||
|
box-orient: vertical;
|
||||||
|
-webkit-box-orient: vertical;
|
||||||
|
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
|
||||||
|
font-size: 25px;
|
||||||
|
|
||||||
|
// color: $color-ci-green;
|
||||||
|
|
||||||
|
&:before {
|
||||||
|
content: "«";
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:after {
|
||||||
|
content: "»";
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.talk .names {
|
||||||
|
display: -webkit-box;
|
||||||
|
-webkit-line-clamp: 1;
|
||||||
|
box-orient: vertical;
|
||||||
|
-webkit-box-orient: vertical;
|
||||||
|
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
|
||||||
|
font-size: 23px;
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
img {
|
||||||
|
display: none;
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
@import "../../fonts/fonts";
|
||||||
|
@import "_variables";
|
||||||
|
|
||||||
|
* {
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
color: $colod-fg;
|
||||||
|
background: rgb(25,25,25);
|
||||||
|
margin: 0px;
|
||||||
|
padding: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#main {
|
||||||
|
position: absolute;
|
||||||
|
top: 0px;
|
||||||
|
left: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slide {
|
||||||
|
position: relative;
|
||||||
|
width: $full-width;
|
||||||
|
height: $full-height;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
|
@ -0,0 +1,22 @@
|
||||||
|
#clock {
|
||||||
|
position: relative;
|
||||||
|
top: 0px;
|
||||||
|
left: 0px;
|
||||||
|
|
||||||
|
width: $full-width;
|
||||||
|
height: $full-height;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
|
z-index: 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
.clock {
|
||||||
|
position: absolute;
|
||||||
|
|
||||||
|
top: 240px;
|
||||||
|
left: 1144px;
|
||||||
|
|
||||||
|
font-family: 'Source Code Pro';
|
||||||
|
font-weight: 600;
|
||||||
|
font-size: 60px;
|
||||||
|
}
|
|
@ -0,0 +1,38 @@
|
||||||
|
.music-info {
|
||||||
|
font-family: 'Lato';
|
||||||
|
font-weight: 400;
|
||||||
|
font-size: 22px;
|
||||||
|
// background-color: magenta;
|
||||||
|
}
|
||||||
|
|
||||||
|
.music-track {
|
||||||
|
padding-left: 0.5em;
|
||||||
|
padding-right: 0.5em;
|
||||||
|
font-style: italic;
|
||||||
|
&:before {
|
||||||
|
content: "«";
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
&:after {
|
||||||
|
content: "»";
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.music-artist {
|
||||||
|
padding-left: 0.5em;
|
||||||
|
padding-right: 3em;
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
|
||||||
|
.music-licence {
|
||||||
|
padding-left: 0.5em;
|
||||||
|
padding-right: 3em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.music-link {
|
||||||
|
padding-left: 0.5em;
|
||||||
|
font-family: 'Source Code Pro';
|
||||||
|
font-weight: 400;
|
||||||
|
font-size: 20px;
|
||||||
|
}
|
|
@ -0,0 +1,220 @@
|
||||||
|
@import "_variables";
|
||||||
|
@import "_base";
|
||||||
|
@import "_music";
|
||||||
|
|
||||||
|
|
||||||
|
.slide {
|
||||||
|
background-color: $color-bg;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.header {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
z-index: 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.room-location {
|
||||||
|
position: absolute;
|
||||||
|
top: 260px;
|
||||||
|
left: 1448px;
|
||||||
|
|
||||||
|
z-index: 20;
|
||||||
|
|
||||||
|
font-family: 'Source Code Pro';
|
||||||
|
font-weight: 700;
|
||||||
|
font-size: 40px;
|
||||||
|
|
||||||
|
text-align: end;
|
||||||
|
color: white;
|
||||||
|
|
||||||
|
// box-align: center;
|
||||||
|
// -moz-box-align: center;
|
||||||
|
// -webkit-box-align: center;
|
||||||
|
|
||||||
|
// background-color: purple;
|
||||||
|
}
|
||||||
|
|
||||||
|
.schedule {
|
||||||
|
position: absolute;
|
||||||
|
top: 240px;
|
||||||
|
left: 65px;
|
||||||
|
// left: 50px;
|
||||||
|
|
||||||
|
/* 1920 - 2 * 65 */
|
||||||
|
width: 1790px;
|
||||||
|
/* 1920 - 2 * 50 */
|
||||||
|
// width: 1820px;
|
||||||
|
|
||||||
|
// background-color: orange;
|
||||||
|
}
|
||||||
|
|
||||||
|
.schedule .title {
|
||||||
|
// position: static;
|
||||||
|
|
||||||
|
font-family: 'Source Code Pro';
|
||||||
|
font-weight: 700;
|
||||||
|
font-size: 60px;
|
||||||
|
|
||||||
|
//text-align: bottom;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.events {
|
||||||
|
position: absolute;
|
||||||
|
top: 340px;
|
||||||
|
left: 65px;
|
||||||
|
|
||||||
|
width: 1790px;
|
||||||
|
// width: 1820px;
|
||||||
|
// 5 * 110 + 4 * 25
|
||||||
|
height: 650px;
|
||||||
|
|
||||||
|
overflow: hidden;
|
||||||
|
// background-color: red;
|
||||||
|
}
|
||||||
|
|
||||||
|
.event {
|
||||||
|
position: relative;
|
||||||
|
// left: 0px;
|
||||||
|
|
||||||
|
margin-bottom: 25px;
|
||||||
|
width: 100%;
|
||||||
|
|
||||||
|
// overflow: hidden;
|
||||||
|
// background-color: teal;
|
||||||
|
}
|
||||||
|
|
||||||
|
.event-time {
|
||||||
|
position: absolute;
|
||||||
|
// top: 0;
|
||||||
|
left: 0px;
|
||||||
|
|
||||||
|
font-family: 'Source Code Pro';
|
||||||
|
font-weight: 400;
|
||||||
|
font-size: 50px;
|
||||||
|
|
||||||
|
// background-color: crimson;
|
||||||
|
// max-width: 50px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.event-location {
|
||||||
|
position: absolute;
|
||||||
|
left: 200px;
|
||||||
|
|
||||||
|
font-family: 'Lato';
|
||||||
|
font-weight: 400;
|
||||||
|
font-size: 50px;
|
||||||
|
|
||||||
|
// width: 100px;
|
||||||
|
// max-width: 100px;
|
||||||
|
// background-color: purple;
|
||||||
|
}
|
||||||
|
|
||||||
|
.this-room {
|
||||||
|
font-style: italic;
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.event-info {
|
||||||
|
position: relative;
|
||||||
|
// left: 550px;
|
||||||
|
// width: 1240px;
|
||||||
|
left: 520px;
|
||||||
|
width: 1270px;
|
||||||
|
// width: 1280px;
|
||||||
|
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
white-space: normal;
|
||||||
|
|
||||||
|
// word-break: break-all;
|
||||||
|
// overflow-wrap: break-word;
|
||||||
|
|
||||||
|
font-family: 'Lato';
|
||||||
|
font-weight: 400;
|
||||||
|
font-size: 50px;
|
||||||
|
|
||||||
|
// max-width: 100px;
|
||||||
|
// background-color: dodgerblue;
|
||||||
|
}
|
||||||
|
|
||||||
|
.event-title {
|
||||||
|
display: -webkit-box;
|
||||||
|
-webkit-line-clamp: 1;
|
||||||
|
// -webkit-line-clamp: 2;
|
||||||
|
-webkit-box-orient: vertical;
|
||||||
|
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
|
|
||||||
|
.event-speaker {
|
||||||
|
display: -webkit-box;
|
||||||
|
-webkit-line-clamp: 1;
|
||||||
|
// -webkit-line-clamp: 2;
|
||||||
|
-webkit-box-orient: vertical;
|
||||||
|
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
|
||||||
|
font-style: italic;
|
||||||
|
font-size: 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.footer {
|
||||||
|
position: absolute;
|
||||||
|
left: 65px;
|
||||||
|
bottom: 0px;
|
||||||
|
|
||||||
|
width: 1790px;
|
||||||
|
// height: 65px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.track-info {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
justify-content: space-between;
|
||||||
|
// justify-content: space-around;
|
||||||
|
|
||||||
|
margin-bottom: 10px;
|
||||||
|
|
||||||
|
font-family: 'Source Code Pro';
|
||||||
|
font-weight: 600;
|
||||||
|
font-size: 22px;
|
||||||
|
|
||||||
|
// background-color: chartreuse;
|
||||||
|
}
|
||||||
|
|
||||||
|
.track {
|
||||||
|
// background-color: lightblue;
|
||||||
|
}
|
||||||
|
|
||||||
|
.track-0 {
|
||||||
|
color: #bbbbbb;
|
||||||
|
}
|
||||||
|
|
||||||
|
.track-1 {
|
||||||
|
color: #40a56a;
|
||||||
|
// color: #119633;
|
||||||
|
}
|
||||||
|
|
||||||
|
.track-2 {
|
||||||
|
color: #ffc91a;
|
||||||
|
// color: #91800d;
|
||||||
|
}
|
||||||
|
|
||||||
|
.track-3 {
|
||||||
|
color: #d92635;
|
||||||
|
// color: #af0c0c;
|
||||||
|
}
|
||||||
|
|
||||||
|
.track-4 {
|
||||||
|
color: #3caec3;
|
||||||
|
// color: #145e9a;
|
||||||
|
}
|
|
@ -0,0 +1,254 @@
|
||||||
|
@import "_variables";
|
||||||
|
@import "_base";
|
||||||
|
@import "_music";
|
||||||
|
|
||||||
|
|
||||||
|
.header {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
z-index: 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.slide {
|
||||||
|
background-color: $color-bg;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.upper {
|
||||||
|
position: absolute;
|
||||||
|
left: 200px;
|
||||||
|
top: 240px;
|
||||||
|
|
||||||
|
width: 1520px;
|
||||||
|
height: 250px;
|
||||||
|
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lower {
|
||||||
|
position: absolute;
|
||||||
|
top: 540px;
|
||||||
|
left: 200px;
|
||||||
|
|
||||||
|
width: 1520px;
|
||||||
|
height: 490px;
|
||||||
|
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
|
background-color: $color-ci-green;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.event-meta {
|
||||||
|
height: 250px;
|
||||||
|
|
||||||
|
background-color: $color-ci-green;
|
||||||
|
|
||||||
|
font-family: 'Lato';
|
||||||
|
font-weight: 600;
|
||||||
|
font-size: 50px;
|
||||||
|
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
white-space: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
.title {
|
||||||
|
display: -webkit-box;
|
||||||
|
-webkit-line-clamp: 2;
|
||||||
|
-webkit-box-orient: vertical;
|
||||||
|
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
|
||||||
|
padding: 0px 100px;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.subtitle {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.speakers {
|
||||||
|
display: -webkit-box;
|
||||||
|
-webkit-line-clamp: 1;
|
||||||
|
-webkit-box-orient: vertical;
|
||||||
|
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
|
||||||
|
padding-top: 10px;
|
||||||
|
padding-left: 15px;
|
||||||
|
|
||||||
|
font-weight: 400;
|
||||||
|
font-style: italic;
|
||||||
|
font-size: 30px;
|
||||||
|
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.starttime {
|
||||||
|
position: absolute;
|
||||||
|
right: 0px;
|
||||||
|
bottom: 0px;
|
||||||
|
|
||||||
|
padding-bottom: 15px;
|
||||||
|
padding-right: 25px;
|
||||||
|
|
||||||
|
font-family: 'Source Code Pro';
|
||||||
|
font-weight: 500;
|
||||||
|
font-size: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.event-content {
|
||||||
|
position: absolute;
|
||||||
|
left: 0px;
|
||||||
|
|
||||||
|
width: 735px;
|
||||||
|
hight: 490px;
|
||||||
|
|
||||||
|
font-family: 'Lato';
|
||||||
|
font-weight: 400;
|
||||||
|
}
|
||||||
|
|
||||||
|
.event-description {
|
||||||
|
}
|
||||||
|
|
||||||
|
.event-description-title {
|
||||||
|
padding-top: 10px;
|
||||||
|
padding-left: 15px;
|
||||||
|
|
||||||
|
margin-bottom: 20px;
|
||||||
|
|
||||||
|
font-size: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.event-description-text {
|
||||||
|
height: 420px;
|
||||||
|
|
||||||
|
display: -webkit-box;
|
||||||
|
-webkit-line-clamp: 14;
|
||||||
|
-webkit-box-orient: vertical;
|
||||||
|
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
|
||||||
|
padding-left: 50px;
|
||||||
|
padding-right: 50px;
|
||||||
|
|
||||||
|
font-size: 25px;
|
||||||
|
|
||||||
|
text-align: justify;
|
||||||
|
word-wrap: break-word;
|
||||||
|
word-break: break-word;
|
||||||
|
// word-break: break-all;
|
||||||
|
hyphens: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.speaker-meta {
|
||||||
|
position: absolute;
|
||||||
|
right: 0px;
|
||||||
|
|
||||||
|
width: 745px;
|
||||||
|
// width: 700px;
|
||||||
|
|
||||||
|
padding-top: 15px;
|
||||||
|
padding-right: 15px;
|
||||||
|
|
||||||
|
|
||||||
|
// background-color: navy;
|
||||||
|
}
|
||||||
|
|
||||||
|
.speaker-info {
|
||||||
|
margin-bottom: 20px;
|
||||||
|
|
||||||
|
font-family: 'Lato';
|
||||||
|
font-weight: 400;
|
||||||
|
font-size: 25px;
|
||||||
|
|
||||||
|
// background-color: red;
|
||||||
|
}
|
||||||
|
|
||||||
|
.speaker-name {
|
||||||
|
margin-bottom: 8px;
|
||||||
|
|
||||||
|
font-style: italic;
|
||||||
|
// font-size: 25px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.speaker-bio {
|
||||||
|
padding-left: 30px;
|
||||||
|
// padding-right: 50px;
|
||||||
|
|
||||||
|
font-size: 22px;
|
||||||
|
|
||||||
|
text-align: justify;
|
||||||
|
word-wrap: break-word;
|
||||||
|
word-break: break-word;
|
||||||
|
// word-break: break-all;
|
||||||
|
hyphens: auto;
|
||||||
|
// font-size: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.speaker-count-1 {
|
||||||
|
display: -webkit-box;
|
||||||
|
-webkit-line-clamp: 14;
|
||||||
|
-webkit-box-orient: vertical;
|
||||||
|
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
|
|
||||||
|
.speaker-count-2 {
|
||||||
|
display: -webkit-box;
|
||||||
|
-webkit-line-clamp: 6;
|
||||||
|
-webkit-box-orient: vertical;
|
||||||
|
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
|
|
||||||
|
.speaker-count-3 {
|
||||||
|
display: -webkit-box;
|
||||||
|
-webkit-line-clamp: 4;
|
||||||
|
-webkit-box-orient: vertical;
|
||||||
|
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
|
|
||||||
|
.speaker-count-4 {
|
||||||
|
display: -webkit-box;
|
||||||
|
-webkit-line-clamp: 3;
|
||||||
|
-webkit-box-orient: vertical;
|
||||||
|
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
|
|
||||||
|
.speaker-count-5 {
|
||||||
|
display: -webkit-box;
|
||||||
|
-webkit-line-clamp: 2;
|
||||||
|
-webkit-line-clamp: 7;
|
||||||
|
-webkit-box-orient: vertical;
|
||||||
|
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.footer {
|
||||||
|
position: absolute;
|
||||||
|
left: 200px;
|
||||||
|
bottom: 0px;
|
||||||
|
|
||||||
|
width: 1520px;
|
||||||
|
// height: 65px;
|
||||||
|
}
|
|
@ -0,0 +1,13 @@
|
||||||
|
$full-width: 1920px;
|
||||||
|
$full-height: 1080px;
|
||||||
|
|
||||||
|
$colod-fg: rgb(255,255,255);
|
||||||
|
$color-bg: rgb(30, 30, 30);
|
||||||
|
|
||||||
|
// Old CI
|
||||||
|
$color-ci-gray: rgb(101, 103, 103);
|
||||||
|
$color-ci-darkgreen: rgb(5, 114, 72);
|
||||||
|
$color-ci-lightgreen: rgb(0, 156, 71);
|
||||||
|
|
||||||
|
// New CI
|
||||||
|
$color-ci-green: rgb(78, 169, 63);
|
|
@ -0,0 +1,29 @@
|
||||||
|
@import "_variables";
|
||||||
|
@import "_base";
|
||||||
|
@import "_voc";
|
||||||
|
|
||||||
|
|
||||||
|
.speaker-cnt-1 {
|
||||||
|
color: lime;
|
||||||
|
}
|
||||||
|
|
||||||
|
.speaker-cnt-2 {
|
||||||
|
color: yellow;
|
||||||
|
}
|
||||||
|
|
||||||
|
.speaker-cnt-3 {
|
||||||
|
color: orangered;
|
||||||
|
}
|
||||||
|
|
||||||
|
.speaker-cnt-many {
|
||||||
|
color: red;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.dnr-true {
|
||||||
|
color: crimson;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dnr-false {
|
||||||
|
color: chartreuse;
|
||||||
|
}
|
|
@ -0,0 +1,3 @@
|
||||||
|
@import "_variables";
|
||||||
|
@import "_base";
|
||||||
|
@import "_voc";
|
|
@ -0,0 +1,3 @@
|
||||||
|
@import "_variables";
|
||||||
|
@import "_base";
|
||||||
|
@import "_voc";
|
|
@ -0,0 +1,11 @@
|
||||||
|
#main {
|
||||||
|
left: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
table {
|
||||||
|
border-spacing: 25px 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
th {
|
||||||
|
text-align: left;
|
||||||
|
}
|
|
@ -0,0 +1,8 @@
|
||||||
|
/* architects-daughter-regular - latin */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Architects Daughter';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 400;
|
||||||
|
src: url('./fonts/architects-daughter-v11-latin-regular.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */
|
||||||
|
url('./fonts/architects-daughter-v11-latin-regular.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
|
||||||
|
}
|
|
@ -0,0 +1,5 @@
|
||||||
|
@import "permanent-marker";
|
||||||
|
@import "architects-daughter";
|
||||||
|
|
||||||
|
@import "source-code-pro";
|
||||||
|
@import "lato";
|
|
@ -0,0 +1,89 @@
|
||||||
|
/* lato-100 - latin-ext_latin */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Lato';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 100;
|
||||||
|
src: url('./fonts/lato-v22-latin-ext_latin-100.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */
|
||||||
|
url('./fonts/lato-v22-latin-ext_latin-100.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* lato-300 - latin-ext_latin */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Lato';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 300;
|
||||||
|
src: url('./fonts/lato-v22-latin-ext_latin-300.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */
|
||||||
|
url('./fonts/lato-v22-latin-ext_latin-300.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* lato-100italic - latin-ext_latin */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Lato';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 100;
|
||||||
|
src: url('./fonts/lato-v22-latin-ext_latin-100italic.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */
|
||||||
|
url('./fonts/lato-v22-latin-ext_latin-100italic.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* lato-300italic - latin-ext_latin */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Lato';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 300;
|
||||||
|
src: url('./fonts/lato-v22-latin-ext_latin-300italic.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */
|
||||||
|
url('./fonts/lato-v22-latin-ext_latin-300italic.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* lato-regular - latin-ext_latin */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Lato';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 400;
|
||||||
|
src: url('./fonts/lato-v22-latin-ext_latin-regular.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */
|
||||||
|
url('./fonts/lato-v22-latin-ext_latin-regular.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* lato-italic - latin-ext_latin */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Lato';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 400;
|
||||||
|
src: url('./fonts/lato-v22-latin-ext_latin-italic.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */
|
||||||
|
url('./fonts/lato-v22-latin-ext_latin-italic.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* lato-700 - latin-ext_latin */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Lato';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 700;
|
||||||
|
src: url('./fonts/lato-v22-latin-ext_latin-700.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */
|
||||||
|
url('./fonts/lato-v22-latin-ext_latin-700.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* lato-700italic - latin-ext_latin */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Lato';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 700;
|
||||||
|
src: url('./fonts/lato-v22-latin-ext_latin-700italic.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */
|
||||||
|
url('./fonts/lato-v22-latin-ext_latin-700italic.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* lato-900 - latin-ext_latin */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Lato';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 900;
|
||||||
|
src: url('./fonts/lato-v22-latin-ext_latin-900.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */
|
||||||
|
url('./fonts/lato-v22-latin-ext_latin-900.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* lato-900italic - latin-ext_latin */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Lato';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 900;
|
||||||
|
src: url('./fonts/lato-v22-latin-ext_latin-900italic.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */
|
||||||
|
url('./fonts/lato-v22-latin-ext_latin-900italic.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Permanent Marker';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 400;
|
||||||
|
src: url('./fonts/permanent-marker-v10-latin-regular.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */
|
||||||
|
url('./fonts/permanent-marker-v10-latin-regular.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
|
||||||
|
}
|
|
@ -0,0 +1,143 @@
|
||||||
|
/* source-code-pro-200 - latin-ext_latin */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Code Pro';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 200;
|
||||||
|
src: url('./fonts/source-code-pro-v20-latin-ext_latin-200.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */
|
||||||
|
url('./fonts/source-code-pro-v20-latin-ext_latin-200.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* source-code-pro-300 - latin-ext_latin */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Code Pro';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 300;
|
||||||
|
src: url('./fonts/source-code-pro-v20-latin-ext_latin-300.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */
|
||||||
|
url('./fonts/source-code-pro-v20-latin-ext_latin-300.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* source-code-pro-regular - latin-ext_latin */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Code Pro';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 400;
|
||||||
|
src: url('./fonts/source-code-pro-v20-latin-ext_latin-regular.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */
|
||||||
|
url('./fonts/source-code-pro-v20-latin-ext_latin-regular.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* source-code-pro-500 - latin-ext_latin */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Code Pro';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 500;
|
||||||
|
src: url('./fonts/source-code-pro-v20-latin-ext_latin-500.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */
|
||||||
|
url('./fonts/source-code-pro-v20-latin-ext_latin-500.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* source-code-pro-600 - latin-ext_latin */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Code Pro';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 600;
|
||||||
|
src: url('./fonts/source-code-pro-v20-latin-ext_latin-600.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */
|
||||||
|
url('./fonts/source-code-pro-v20-latin-ext_latin-600.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* source-code-pro-700 - latin-ext_latin */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Code Pro';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 700;
|
||||||
|
src: url('./fonts/source-code-pro-v20-latin-ext_latin-700.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */
|
||||||
|
url('./fonts/source-code-pro-v20-latin-ext_latin-700.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* source-code-pro-800 - latin-ext_latin */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Code Pro';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 800;
|
||||||
|
src: url('./fonts/source-code-pro-v20-latin-ext_latin-800.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */
|
||||||
|
url('./fonts/source-code-pro-v20-latin-ext_latin-800.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* source-code-pro-900 - latin-ext_latin */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Code Pro';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 900;
|
||||||
|
src: url('./fonts/source-code-pro-v20-latin-ext_latin-900.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */
|
||||||
|
url('./fonts/source-code-pro-v20-latin-ext_latin-900.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* source-code-pro-200italic - latin-ext_latin */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Code Pro';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 200;
|
||||||
|
src: url('./fonts/source-code-pro-v20-latin-ext_latin-200italic.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */
|
||||||
|
url('./fonts/source-code-pro-v20-latin-ext_latin-200italic.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* source-code-pro-300italic - latin-ext_latin */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Code Pro';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 300;
|
||||||
|
src: url('./fonts/source-code-pro-v20-latin-ext_latin-300italic.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */
|
||||||
|
url('./fonts/source-code-pro-v20-latin-ext_latin-300italic.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* source-code-pro-500italic - latin-ext_latin */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Code Pro';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 500;
|
||||||
|
src: url('./fonts/source-code-pro-v20-latin-ext_latin-500italic.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */
|
||||||
|
url('./fonts/source-code-pro-v20-latin-ext_latin-500italic.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* source-code-pro-italic - latin-ext_latin */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Code Pro';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 400;
|
||||||
|
src: url('./fonts/source-code-pro-v20-latin-ext_latin-italic.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */
|
||||||
|
url('./fonts/source-code-pro-v20-latin-ext_latin-italic.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* source-code-pro-600italic - latin-ext_latin */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Code Pro';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 600;
|
||||||
|
src: url('./fonts/source-code-pro-v20-latin-ext_latin-600italic.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */
|
||||||
|
url('./fonts/source-code-pro-v20-latin-ext_latin-600italic.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* source-code-pro-700italic - latin-ext_latin */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Code Pro';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 700;
|
||||||
|
src: url('./fonts/source-code-pro-v20-latin-ext_latin-700italic.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */
|
||||||
|
url('./fonts/source-code-pro-v20-latin-ext_latin-700italic.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* source-code-pro-800italic - latin-ext_latin */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Code Pro';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 800;
|
||||||
|
src: url('./fonts/source-code-pro-v20-latin-ext_latin-800italic.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */
|
||||||
|
url('./fonts/source-code-pro-v20-latin-ext_latin-800italic.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* source-code-pro-900italic - latin-ext_latin */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Code Pro';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 900;
|
||||||
|
src: url('./fonts/source-code-pro-v20-latin-ext_latin-900italic.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */
|
||||||
|
url('./fonts/source-code-pro-v20-latin-ext_latin-900italic.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
import * as params from '@params';
|
||||||
|
|
||||||
|
// Values injected from Hugo configuration
|
||||||
|
window.infoBeamerConfig = new Map();
|
||||||
|
window.infoBeamerConfig.set('workerBaseURL', params.workerBaseURL);
|
||||||
|
|
||||||
|
window.infoBeamerConfig.set('scheduleURL', params.scheduleURL);
|
||||||
|
window.infoBeamerConfig.set('scheduleFetchInterval', params.scheduleFetchInterval);
|
||||||
|
|
||||||
|
window.infoBeamerConfig.set('twitterURL', params.twitterURL);
|
||||||
|
window.infoBeamerConfig.set('twitterFetchInterval', params.twitterFetchInterval);
|
||||||
|
|
||||||
|
window.infoBeamerConfig.set('mastodonURL', params.mastodonURL);
|
||||||
|
window.infoBeamerConfig.set('mastodonFetchInterval', params.mastodonFetchInterval);
|
||||||
|
|
||||||
|
window.infoBeamerConfig.set('musicURL', params.musicURL);
|
||||||
|
window.infoBeamerConfig.set('musicFetchInterval', params.musicFetchInterval);
|
||||||
|
|
||||||
|
window.infoBeamerConfig.set('cmsURL', params.cmsURL);
|
||||||
|
window.infoBeamerConfig.set('cmsFetchInterval', params.cmsFetchInterval);
|
||||||
|
|
||||||
|
console.log('Info Beamer Configuration: ');
|
||||||
|
console.log(window.infoBeamerConfig);
|
|
@ -0,0 +1,63 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
|
||||||
|
const configure = (configuration, service) => {
|
||||||
|
|
||||||
|
const fetchIt = (storage) => {
|
||||||
|
|
||||||
|
// Setup fetching in web workers
|
||||||
|
if (window.Worker) {
|
||||||
|
const workerBaseURL = window.infoBeamerConfig.get('workerBaseURL');
|
||||||
|
const fetchWorkerCode = workerBaseURL + "/generic_fetch_worker.js";
|
||||||
|
|
||||||
|
// Schedule fetch worker
|
||||||
|
const scheduleWorker = new Worker(fetchWorkerCode);
|
||||||
|
const scheduleType = 'Schedule';
|
||||||
|
const scheduleURL = window.infoBeamerConfig.get('scheduleURL');
|
||||||
|
const scheduleFetchInterval = window.infoBeamerConfig.get('scheduleFetchInterval');
|
||||||
|
|
||||||
|
// Configure schedule worker
|
||||||
|
scheduleWorker.postMessage({fetchType: scheduleType,
|
||||||
|
fetchURL: scheduleURL,
|
||||||
|
fetchInterval: scheduleFetchInterval
|
||||||
|
});
|
||||||
|
|
||||||
|
// Obtain schedule results and call back
|
||||||
|
scheduleWorker.onmessage = function(e) {
|
||||||
|
if (e.data.msgType === scheduleType) {
|
||||||
|
let jsonData = e.data.json;
|
||||||
|
|
||||||
|
console.log("Got it");
|
||||||
|
console.log(jsonData);
|
||||||
|
console.log("---");
|
||||||
|
|
||||||
|
|
||||||
|
let scheduleData = service.process_data(jsonData);
|
||||||
|
//let scheduleData = e.data.json;
|
||||||
|
|
||||||
|
console.log(scheduleData);
|
||||||
|
|
||||||
|
storage.scheduleData = scheduleData;
|
||||||
|
console.log("Got it");
|
||||||
|
console.log(storage);
|
||||||
|
console.log("---");
|
||||||
|
// update_screen();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// Add more workers here
|
||||||
|
} else {
|
||||||
|
console.log("Your browser doesn't support web workers.");
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
return fetchIt;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
export {
|
||||||
|
configure
|
||||||
|
};
|
|
@ -0,0 +1,36 @@
|
||||||
|
let fetchType;
|
||||||
|
let fetchInterval;
|
||||||
|
let fetchURL;
|
||||||
|
|
||||||
|
|
||||||
|
onmessage = function(e) {
|
||||||
|
let msgType = e.data.msgType;
|
||||||
|
|
||||||
|
// console.log("Configuration Message:");
|
||||||
|
console.log(e.data);
|
||||||
|
|
||||||
|
fetchType = e.data.fetchType;
|
||||||
|
fetchURL = e.data.fetchURL;
|
||||||
|
fetchInterval = 1000 * e.data.fetchInterval;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
function doFetch() {
|
||||||
|
let now = new Date();
|
||||||
|
|
||||||
|
if (fetchURL) {
|
||||||
|
fetch(fetchURL).then(
|
||||||
|
b => b.json()).then(
|
||||||
|
j => postMessage({msgType: fetchType,
|
||||||
|
json: j,
|
||||||
|
timestamp: now}))
|
||||||
|
.catch(e => console.log(e.message));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Periodic resource fetching
|
||||||
|
(function periodicFetch() {
|
||||||
|
doFetch();
|
||||||
|
setTimeout(periodicFetch, fetchInterval);
|
||||||
|
})();
|
|
@ -0,0 +1,14 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
let configure = () => undefined;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
export {
|
||||||
|
configure
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
|
||||||
|
function configure(service, view) {
|
||||||
|
|
||||||
|
const update_screen = (storage, time, config) => {
|
||||||
|
|
||||||
|
let now = time.now();
|
||||||
|
|
||||||
|
console.log('Updating Screen with:');
|
||||||
|
console.log(storage);
|
||||||
|
console.log(now);
|
||||||
|
console.log(config);
|
||||||
|
|
||||||
|
view.update_main_slide(
|
||||||
|
storage,
|
||||||
|
now,
|
||||||
|
config);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
return update_screen;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
export {
|
||||||
|
configure
|
||||||
|
}
|
|
@ -0,0 +1,22 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
// Fake 'now' date time for testing
|
||||||
|
const fakeNow = null;
|
||||||
|
|
||||||
|
// Test transitions
|
||||||
|
// const fakeNow = Date.parse("2024-10-31T19:05:00");
|
||||||
|
|
||||||
|
|
||||||
|
const fakeTimeDelta = fakeNow === null ? 0 : fakeNow - Date.now();
|
||||||
|
|
||||||
|
|
||||||
|
// Real 'now' date time for production
|
||||||
|
const nowJS = () => Date.now() + fakeTimeDelta;
|
||||||
|
|
||||||
|
// Real 'now' date time for production as luxon DateTime object
|
||||||
|
const now = () => luxon.DateTime.fromMillis(nowJS());
|
||||||
|
|
||||||
|
|
||||||
|
export {
|
||||||
|
now
|
||||||
|
}
|
|
@ -0,0 +1,21 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
const html = htm.bind(preact.h);
|
||||||
|
|
||||||
|
|
||||||
|
const update_main_slide = (data, time, config) => {
|
||||||
|
const hour = time.toFormat('HH');
|
||||||
|
const minute = time.toFormat('mm');
|
||||||
|
const sep = time.second % 2 === 0 ? ':' : '.';
|
||||||
|
|
||||||
|
const inner = html`<div class="clock">${hour}${sep}${minute}</div>`;
|
||||||
|
|
||||||
|
const anchorElId = "clock";
|
||||||
|
const el = document.getElementById(anchorElId);
|
||||||
|
preact.render(inner, el);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
export {
|
||||||
|
update_main_slide
|
||||||
|
};
|
|
@ -0,0 +1,38 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
import * as sol from "../../solight/sol.js";
|
||||||
|
|
||||||
|
import * as serv from "../services/service.js";
|
||||||
|
|
||||||
|
|
||||||
|
const html = htm.bind(preact.h);
|
||||||
|
|
||||||
|
|
||||||
|
const music_credits = (config) => {
|
||||||
|
let inner;
|
||||||
|
if (sol.defined(config.music)) {
|
||||||
|
inner = html`
|
||||||
|
<div class="music-info">
|
||||||
|
Musik:
|
||||||
|
<span class="music-track">${config.music.title}</span>
|
||||||
|
von
|
||||||
|
<span class="music-artist">${config.music.artist}</span>
|
||||||
|
Lizenz:
|
||||||
|
<span class="music-licence">
|
||||||
|
${config.music.licence}
|
||||||
|
</span>
|
||||||
|
Link:
|
||||||
|
<span class="music-link">
|
||||||
|
${config.music.url}
|
||||||
|
</span>
|
||||||
|
</div>`;
|
||||||
|
} else {
|
||||||
|
inner = html``;
|
||||||
|
}
|
||||||
|
return inner;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
export {
|
||||||
|
music_credits
|
||||||
|
}
|
|
@ -0,0 +1,170 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
import * as sol from "../../solight/sol.js";
|
||||||
|
|
||||||
|
import * as serv from "../services/service.js";
|
||||||
|
import * as music from "./music.js";
|
||||||
|
|
||||||
|
|
||||||
|
const html = htm.bind(preact.h);
|
||||||
|
|
||||||
|
const max_events = 5;
|
||||||
|
|
||||||
|
const title_string = 'Nächste Events:';
|
||||||
|
|
||||||
|
const local_room = 'Hier';
|
||||||
|
|
||||||
|
|
||||||
|
const this_room = (config) => sol.optional(config.roomName);
|
||||||
|
|
||||||
|
|
||||||
|
const this_location = (config) => {
|
||||||
|
const here = this_room(config);
|
||||||
|
return sol.defined(here) ? html`@${here}` : html``;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
const schedule_table_header = () =>
|
||||||
|
html`
|
||||||
|
<div class="schedule">
|
||||||
|
<div class="title">${title_string}</div>
|
||||||
|
</div>`;
|
||||||
|
|
||||||
|
|
||||||
|
const event_time = (event) => {
|
||||||
|
const esd = sol.eventStartDate(event);
|
||||||
|
const time = esd.setLocale('de').toLocaleString(luxon.DateTime.TIME_24_SIMPLE);
|
||||||
|
return html`<div class="event-time">${time}</div>`;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
const event_location = (event, config) => {
|
||||||
|
const here_room = this_room(config);
|
||||||
|
const event_room = sol.eventRoomName(event);
|
||||||
|
|
||||||
|
let inner;
|
||||||
|
if (sol.defined(here_room) && (event_room === here_room)) {
|
||||||
|
inner = html`<div class="event-location this-room">${local_room}</div>`;
|
||||||
|
} else {
|
||||||
|
inner = html`<div class="event-location">${event_room}</div>`;
|
||||||
|
}
|
||||||
|
return inner;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
const event_title = (event) => {
|
||||||
|
const title = serv.fix_dash(sol.eventTitle(event));
|
||||||
|
const ti = serv.track_index(sol.eventTrack(event));
|
||||||
|
return html`<div class="event-title track-${ti}">${title}</div>`;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
const event_speaker = (event) => {
|
||||||
|
const speaker = serv.fix_dash(serv.person_names_concat(sol.eventPersons(event)));
|
||||||
|
return html`<div class="event-speaker">${speaker}</div>`;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
const schedule_table_event = (event, config) =>
|
||||||
|
html`
|
||||||
|
<div class="event">
|
||||||
|
${event_time(event)}
|
||||||
|
${event_location(event, config)}
|
||||||
|
<div class="event-info">
|
||||||
|
${event_title(event)}
|
||||||
|
${event_speaker(event)}
|
||||||
|
</div>
|
||||||
|
</div>`;
|
||||||
|
|
||||||
|
|
||||||
|
const schedule_table_events = (events, config) =>
|
||||||
|
html`
|
||||||
|
<div class="events">
|
||||||
|
${events.map(e => schedule_table_event(e, config))}
|
||||||
|
</div>`;
|
||||||
|
|
||||||
|
|
||||||
|
const schedule_table = (events, config) =>
|
||||||
|
html`
|
||||||
|
${schedule_table_header()}
|
||||||
|
${schedule_table_events(events, config)}`;
|
||||||
|
|
||||||
|
|
||||||
|
const header = (config) =>
|
||||||
|
html`<div class="room-location">${this_location(config)}</div>`;
|
||||||
|
|
||||||
|
|
||||||
|
const list_track = (track) =>
|
||||||
|
html`<span class="track track-${serv.track_index(track)}">${track}</span>`;
|
||||||
|
|
||||||
|
|
||||||
|
const list_tracks = (tracks) =>
|
||||||
|
html`<div class="track-info">${tracks.map(t => list_track(t))}</div>`;
|
||||||
|
|
||||||
|
|
||||||
|
const footer = (tracks, config) =>
|
||||||
|
html`
|
||||||
|
<div class="footer">
|
||||||
|
${list_tracks(tracks)}
|
||||||
|
${music.music_credits(config)}
|
||||||
|
</div>`;
|
||||||
|
|
||||||
|
|
||||||
|
const update_main_slide = (data, time, config) => {
|
||||||
|
// console.log("Updating Main Slide with:");
|
||||||
|
// console.log(data);
|
||||||
|
// console.log(time);
|
||||||
|
// console.log(config);
|
||||||
|
|
||||||
|
if (sol.defined(data.scheduleData)) {
|
||||||
|
const schedule = data.scheduleData;
|
||||||
|
|
||||||
|
// const allDays = sol.allDays(schedule);
|
||||||
|
// const currentDays = sol.currentDays(allDays, time);
|
||||||
|
// const futureDays = sol.futureDays(allDays, time);
|
||||||
|
// const nextDays = currentDays.concat(futureDays);
|
||||||
|
|
||||||
|
// const nextDaysSorted = sol.sortDaysByStartDate(nextDays, time);
|
||||||
|
// Hack: if we do not have a next day, all days are in the past and it does not matter.
|
||||||
|
// const nextDay = nextDaysSorted.length > 0 ? nextDaysSorted[0] : allDays[0];
|
||||||
|
|
||||||
|
const allEvents = sol.allEvents(schedule);
|
||||||
|
const nextEvents = allEvents;
|
||||||
|
//const nextEvents = allEventssol.eventsByDay(allEvents, nextDay);
|
||||||
|
|
||||||
|
const dt = luxon.Duration.fromObject({minutes: 10});
|
||||||
|
|
||||||
|
const startedEvents = sol.startedEvents(nextEvents, time, dt);
|
||||||
|
const futureEvents = sol.futureEvents(nextEvents, time);
|
||||||
|
|
||||||
|
// const upcomingEvents = futureEvents;
|
||||||
|
// const upcomingEvents = sol.futureEvents(nextEvents, time);
|
||||||
|
const upcomingEvents = sol.distinctEvents(startedEvents.concat(futureEvents));
|
||||||
|
|
||||||
|
const upcomingEventsSorted = sol.sortEventsByStartDate(upcomingEvents);
|
||||||
|
|
||||||
|
const allTracks = sol.allTracks(schedule);
|
||||||
|
const tracks = serv.sort_tracks(allTracks.filter(t => t !== "Andere"));
|
||||||
|
|
||||||
|
// Take first n events
|
||||||
|
const events = upcomingEventsSorted.slice(0, max_events);
|
||||||
|
|
||||||
|
// Assemble dom
|
||||||
|
const inner = html`
|
||||||
|
<div class="slide">
|
||||||
|
${header(config)}
|
||||||
|
${schedule_table(events, config)}
|
||||||
|
${footer(tracks, config)}
|
||||||
|
</div>`;
|
||||||
|
|
||||||
|
// Add main slide to info beamer
|
||||||
|
const anchorElId = "main";
|
||||||
|
const el = document.getElementById(anchorElId);
|
||||||
|
preact.render(inner, el);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
export {
|
||||||
|
update_main_slide
|
||||||
|
};
|
|
@ -0,0 +1,51 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
import * as sol from "../../solight/sol.js";
|
||||||
|
|
||||||
|
import * as serv from "../services/service.js";
|
||||||
|
|
||||||
|
|
||||||
|
const html = htm.bind(preact.h);
|
||||||
|
|
||||||
|
|
||||||
|
const event_info = (event) =>
|
||||||
|
html`
|
||||||
|
<div class="speaker-box">
|
||||||
|
<div class="speaker">
|
||||||
|
<div class="names">${serv.fix_dash(serv.person_names_concat(sol.eventPersons(event)))}</div>
|
||||||
|
</div>
|
||||||
|
</div>`;
|
||||||
|
|
||||||
|
|
||||||
|
const update_main_slide = (data, time, config) => {
|
||||||
|
if (sol.defined(data.scheduleData)) {
|
||||||
|
const schedule = data.scheduleData;
|
||||||
|
|
||||||
|
const thisRoom = config.roomName;
|
||||||
|
|
||||||
|
// const dt = luxon.Duration.fromObject({minutes: 5});
|
||||||
|
|
||||||
|
const events = sol.allEvents(schedule);
|
||||||
|
const eventsHere = sol.eventsByRoomName(events, thisRoom);
|
||||||
|
|
||||||
|
// const startingEventsHere = sol.startingEvents(eventsHere, time, dt);
|
||||||
|
// const currentEventsHere = sol.currentEvents(eventsHere, time);
|
||||||
|
// const endedEventsHere = sol.endedEvents(eventsHere, time, dt);
|
||||||
|
// const upcomingEventsHere = sol.distinctEvents(startingEventsHere.concat(currentEventsHere, endedEventsHere));
|
||||||
|
|
||||||
|
const upcomingEventsHere = sol.currentEvents(eventsHere, time);
|
||||||
|
|
||||||
|
const inner = html`
|
||||||
|
${upcomingEventsHere.slice(0,1).map(e => event_info(e))}`;
|
||||||
|
|
||||||
|
// Add main slide to frame
|
||||||
|
const anchorElId = "main";
|
||||||
|
const el = document.getElementById(anchorElId);
|
||||||
|
preact.render(inner, el);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
export {
|
||||||
|
update_main_slide
|
||||||
|
};
|
|
@ -0,0 +1,56 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
import * as sol from "../../solight/sol.js";
|
||||||
|
|
||||||
|
import * as serv from "../services/service.js";
|
||||||
|
|
||||||
|
|
||||||
|
const html = htm.bind(preact.h);
|
||||||
|
|
||||||
|
|
||||||
|
const event_info = (event) => {
|
||||||
|
const title = serv.fix_dash(sol.eventTitle(event));
|
||||||
|
const names = serv.fix_dash(serv.person_names_concat(sol.eventPersons(event)));
|
||||||
|
return html`
|
||||||
|
<div class="talk-box">
|
||||||
|
<div class="talk">
|
||||||
|
<div class="title">${title}</div>
|
||||||
|
<div class="names">${names}</div>
|
||||||
|
</div>
|
||||||
|
</div>`;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
const update_main_slide = (data, time, config) => {
|
||||||
|
if (sol.defined(data.scheduleData)) {
|
||||||
|
const schedule = data.scheduleData;
|
||||||
|
|
||||||
|
const thisRoom = config.roomName;
|
||||||
|
|
||||||
|
// const dt = luxon.Duration.fromObject({minutes: 5});
|
||||||
|
|
||||||
|
const events = sol.allEvents(schedule);
|
||||||
|
const eventsHere = sol.eventsByRoomName(events, thisRoom);
|
||||||
|
|
||||||
|
// const startingEventsHere = sol.startingEvents(eventsHere, time, dt);
|
||||||
|
// const currentEventsHere = sol.currentEvents(eventsHere, time);
|
||||||
|
// const endedEventsHere = sol.endedEvents(eventsHere, time, dt);
|
||||||
|
// const upcomingEventsHere = sol.distinctEvents(startingEventsHere.concat(currentEventsHere, endedEventsHere));
|
||||||
|
|
||||||
|
const upcomingEventsHere = sol.currentEvents(eventsHere, time);
|
||||||
|
|
||||||
|
const inner = html`
|
||||||
|
${upcomingEventsHere.slice(0,1).map(e => event_info(e))}
|
||||||
|
`;
|
||||||
|
|
||||||
|
// Add main slide to frame
|
||||||
|
const anchorElId = "main";
|
||||||
|
const el = document.getElementById(anchorElId);
|
||||||
|
preact.render(inner, el);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
export {
|
||||||
|
update_main_slide
|
||||||
|
};
|
|
@ -0,0 +1,123 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
import * as sol from "../../solight/sol.js";
|
||||||
|
|
||||||
|
import * as serv from "../services/service.js";
|
||||||
|
import * as music from "./music.js";
|
||||||
|
|
||||||
|
|
||||||
|
const html = htm.bind(preact.h);
|
||||||
|
|
||||||
|
const nowString = 'Jetzt';
|
||||||
|
|
||||||
|
const minBioLength = 20;
|
||||||
|
|
||||||
|
const event_persons = (persons) =>
|
||||||
|
html`<div class="speakers">${serv.fix_dash(serv.person_names_concat(persons))}:</div>`;
|
||||||
|
|
||||||
|
const event_time = (event, time) => {
|
||||||
|
const esd = sol.eventStartDate(event);
|
||||||
|
const nowish = luxon.Interval.fromDateTimes(esd.minus({minutes: 1}), esd.plus({minutes: 1}));
|
||||||
|
const stime = nowish.contains(time) ?
|
||||||
|
nowString :
|
||||||
|
esd.setLocale('de').toRelative({base: time, unit: 'minutes'});
|
||||||
|
|
||||||
|
return html`<div class="starttime">${stime}</div>`;
|
||||||
|
};
|
||||||
|
|
||||||
|
const event_meta = (event, time) =>
|
||||||
|
html`
|
||||||
|
<div class="event-meta">
|
||||||
|
${event_persons(sol.eventPersons(event))}
|
||||||
|
<div class="title">${serv.fix_dash(sol.eventTitle(event))}</div>
|
||||||
|
<div class="subtitle">${sol.eventSubtitle(event)}</div>
|
||||||
|
${event_time(event, time)}
|
||||||
|
</div>`;
|
||||||
|
|
||||||
|
const event_description = (event) => {
|
||||||
|
const description = sol.eventAbstract(event);
|
||||||
|
const abstract = sol.eventAbstract(event);
|
||||||
|
|
||||||
|
const atext = sol.defined(abstract) ? abstract : "";
|
||||||
|
const dtext = sol.defined(description) ? description : "";
|
||||||
|
|
||||||
|
const text = atext.length >= dtext.length ? atext : dtext;
|
||||||
|
|
||||||
|
return html`
|
||||||
|
<div class="event-description">
|
||||||
|
<div class="event-description-title">Beschreibung:</div>
|
||||||
|
<div class="event-description-text" lang="de">${text}</div>
|
||||||
|
</div>`;
|
||||||
|
};
|
||||||
|
|
||||||
|
const event_content = (event) =>
|
||||||
|
html`<div class="event-content">${event_description(event)}</div>`;
|
||||||
|
|
||||||
|
const speaker_info = (speaker, count) => {
|
||||||
|
const name = serv.fix_dash(sol.personName(speaker));
|
||||||
|
const bio = sol.personBiography(speaker);
|
||||||
|
|
||||||
|
let inner;
|
||||||
|
if (sol.defined(bio) && bio.length >= minBioLength) {
|
||||||
|
inner = html`
|
||||||
|
<div class="speaker-info">
|
||||||
|
<div class="speaker-name">${name}</div>
|
||||||
|
<div class="speaker-bio speaker-count-${count}" lang="de">${bio}</div>
|
||||||
|
</div>`;
|
||||||
|
} else {
|
||||||
|
inner = html``;
|
||||||
|
}
|
||||||
|
return inner;
|
||||||
|
};
|
||||||
|
|
||||||
|
const speaker_meta = (event) => {
|
||||||
|
const speakers = sol.eventPersons(event);
|
||||||
|
const n = speakers.length;
|
||||||
|
return html`<div class="speaker-meta">${speakers.map(s => speaker_info(s, n))}</div>`;
|
||||||
|
};
|
||||||
|
|
||||||
|
const event_info = (event, time) =>
|
||||||
|
html`
|
||||||
|
<div class="upper">
|
||||||
|
${event_meta(event, time)}
|
||||||
|
</div>
|
||||||
|
<div class="lower">
|
||||||
|
${event_content(event)}
|
||||||
|
${speaker_meta(event)}
|
||||||
|
</div>`;
|
||||||
|
|
||||||
|
const footer = (config) =>
|
||||||
|
html`<div class="footer">${music.music_credits(config)}</div>`;
|
||||||
|
|
||||||
|
const update_main_slide = (data, time, config) => {
|
||||||
|
if (sol.defined(data.scheduleData)) {
|
||||||
|
const schedule = data.scheduleData;
|
||||||
|
|
||||||
|
const thisRoom = config.roomName;
|
||||||
|
|
||||||
|
const dt = luxon.Duration.fromObject({minutes: 6});
|
||||||
|
|
||||||
|
const events = sol.allEvents(schedule);
|
||||||
|
const eventsHere = sol.eventsByRoomName(events, thisRoom);
|
||||||
|
const startingEventsHere = sol.startingEvents(eventsHere, time, dt);
|
||||||
|
const currentEventsHere = sol.currentEvents(eventsHere, time);
|
||||||
|
const endedEventsHere = sol.endedEvents(eventsHere, time, dt);
|
||||||
|
const upcomingEventsHere = sol.distinctEvents(startingEventsHere.concat(currentEventsHere, endedEventsHere));
|
||||||
|
|
||||||
|
const inner = html`
|
||||||
|
<div class="slide">
|
||||||
|
${upcomingEventsHere.slice(0,1).map(e => event_info(e, time))}
|
||||||
|
${footer(config)}
|
||||||
|
</div>`;
|
||||||
|
|
||||||
|
// Add main slide to frame
|
||||||
|
const anchorElId = "main";
|
||||||
|
const el = document.getElementById(anchorElId);
|
||||||
|
preact.render(inner, el);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
export {
|
||||||
|
update_main_slide
|
||||||
|
};
|
|
@ -0,0 +1,112 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
import * as sol from "../../solight/sol.js";
|
||||||
|
|
||||||
|
import * as serv from "../services/service.js";
|
||||||
|
|
||||||
|
const html = htm.bind(preact.h);
|
||||||
|
|
||||||
|
|
||||||
|
const schedule_event_modus = (event) =>
|
||||||
|
html`${serv.event_modus_string(event)}`;
|
||||||
|
|
||||||
|
const schedule_persons = (persons) =>
|
||||||
|
html`${persons.map(p => sol.personName(p)).join(', ')}`;
|
||||||
|
|
||||||
|
const schedule_time = (event) =>
|
||||||
|
html`${sol.eventStartDate(event).toFormat('HH:mm')} – ${sol.eventEndDate(event).toFormat('HH:mm')}`;
|
||||||
|
|
||||||
|
const person_count_class = (count) => {
|
||||||
|
switch (true) {
|
||||||
|
case count === 1: return 'speaker-cnt-1';
|
||||||
|
case count === 2: return 'speaker-cnt-2';
|
||||||
|
case count === 3: return 'speaker-cnt-3';
|
||||||
|
default: return 'speaker-cnt-many';
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const schedule_event = (event) => {
|
||||||
|
const dnrString = sol.eventDoNotRecord(event) ? '✘' : '✔';
|
||||||
|
const dnrClass = sol.eventDoNotRecord(event) ? 'dnr-true' : 'dnr-false';
|
||||||
|
const speakerCnt = sol.eventPersonCount(event);
|
||||||
|
const speakerCntClass = person_count_class(speakerCnt);
|
||||||
|
return html`
|
||||||
|
<tr>
|
||||||
|
<td>${sol.eventTitle(event).slice(0, 30)}</td>
|
||||||
|
<td>${schedule_persons(sol.eventPersons(event))}</td>
|
||||||
|
<td class="${speakerCntClass}">${speakerCnt}</td>
|
||||||
|
<td>${sol.eventType(event)}</td>
|
||||||
|
<td>${schedule_time(event)}</td>
|
||||||
|
<td class="${dnrClass}">${dnrString}</td>
|
||||||
|
</tr>`;
|
||||||
|
};
|
||||||
|
|
||||||
|
const schedule_room = (events, room) => {
|
||||||
|
const rn = sol.roomName(room);
|
||||||
|
const evs = sol.eventsByRoomName(events, rn);
|
||||||
|
const evss = sol.sortEventsByStartDate(evs);
|
||||||
|
|
||||||
|
return html`
|
||||||
|
<h3>Room: ${rn}</h3>
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<th>Title</th>
|
||||||
|
<th>Speakers</th>
|
||||||
|
<th>#Speakers</th>
|
||||||
|
<th>Type</th>
|
||||||
|
<th>Time</th>
|
||||||
|
<th>Record?</th>
|
||||||
|
</tr>
|
||||||
|
${evss.map(e => schedule_event(e))}
|
||||||
|
</table>`;
|
||||||
|
};
|
||||||
|
|
||||||
|
const schedule_day = (con, events, room, day) => {
|
||||||
|
const dt = sol.dayStartDate(day);
|
||||||
|
const di = sol.dayIndex(day);
|
||||||
|
|
||||||
|
const evs = sol.eventsByDayIndex(events, di);
|
||||||
|
// const rms = sol.roomsByDayIndex(con, rooms, di);
|
||||||
|
|
||||||
|
return html`
|
||||||
|
<h2>Day ${di}: ${dt.setLocale('de-DE').toFormat('EEEE')}</h2>
|
||||||
|
${schedule_room(evs, room)}`;
|
||||||
|
};
|
||||||
|
|
||||||
|
const schedule_table = (schedule, thisRoomName) => {
|
||||||
|
const con = sol.conference(schedule);
|
||||||
|
|
||||||
|
const days = sol.allDays(schedule);
|
||||||
|
const events = sol.allEvents(schedule);
|
||||||
|
const rooms = sol.allRooms(schedule);
|
||||||
|
const room = sol.roomsByName(rooms, thisRoomName).at(0);
|
||||||
|
|
||||||
|
return html`
|
||||||
|
<h1>Schedule (v ${sol.scheduleVersion(schedule)})</h1>
|
||||||
|
${days.map(d => schedule_day(con, events, room, d))}`;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
const update_main_slide = (data, time, config) => {
|
||||||
|
console.log("Our data:");
|
||||||
|
console.log(data);
|
||||||
|
|
||||||
|
if (sol.defined(data.scheduleData)) {
|
||||||
|
const schedule = data.scheduleData;
|
||||||
|
|
||||||
|
const thisRoomName = config.roomName;
|
||||||
|
|
||||||
|
const inner = html`
|
||||||
|
${schedule_table(schedule, thisRoomName)}`;
|
||||||
|
|
||||||
|
// Add main slide to info beamer
|
||||||
|
const anchorElId = "main";
|
||||||
|
const el = document.getElementById(anchorElId);
|
||||||
|
preact.render(inner, el);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
export {
|
||||||
|
update_main_slide
|
||||||
|
};
|
|
@ -0,0 +1,109 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
import * as sol from "../../solight/sol.js";
|
||||||
|
|
||||||
|
import * as serv from "../services/service.js";
|
||||||
|
|
||||||
|
const html = htm.bind(preact.h);
|
||||||
|
|
||||||
|
|
||||||
|
const schedule_event_modus = (event) =>
|
||||||
|
html`${serv.event_modus_string(event)}`;
|
||||||
|
|
||||||
|
const schedule_persons = (persons) =>
|
||||||
|
html`${persons.map(p => sol.personName(p)).join(', ')}`;
|
||||||
|
|
||||||
|
const schedule_time = (event) =>
|
||||||
|
html`${sol.eventStartDate(event).toFormat('HH:mm')} – ${sol.eventEndDate(event).toFormat('HH:mm')}`;
|
||||||
|
|
||||||
|
const person_count_class = (count) => {
|
||||||
|
switch (true) {
|
||||||
|
case count === 1: return 'speaker-cnt-1';
|
||||||
|
case count === 2: return 'speaker-cnt-2';
|
||||||
|
case count === 3: return 'speaker-cnt-3';
|
||||||
|
default: return 'speaker-cnt-many';
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const schedule_event = (event) => {
|
||||||
|
const dnrString = sol.eventDoNotRecord(event) ? '✘' : '✔';
|
||||||
|
const dnrClass = sol.eventDoNotRecord(event) ? 'dnr-true' : 'dnr-false';
|
||||||
|
const speakerCnt = sol.eventPersonCount(event);
|
||||||
|
const speakerCntClass = person_count_class(speakerCnt);
|
||||||
|
return html`
|
||||||
|
<tr>
|
||||||
|
<td>${sol.eventTitle(event).slice(0, 30)}</td>
|
||||||
|
<td>${schedule_persons(sol.eventPersons(event))}</td>
|
||||||
|
<td class="${speakerCntClass}">${speakerCnt}</td>
|
||||||
|
<td>${sol.eventType(event)}</td>
|
||||||
|
<td>${schedule_time(event)}</td>
|
||||||
|
<td class="${dnrClass}">${dnrString}</td>
|
||||||
|
</tr>`;
|
||||||
|
};
|
||||||
|
|
||||||
|
const schedule_room = (events, room) => {
|
||||||
|
const rn = sol.roomName(room);
|
||||||
|
const evs = sol.eventsByRoomName(events, rn);
|
||||||
|
const evss = sol.sortEventsByStartDate(evs);
|
||||||
|
|
||||||
|
return html`
|
||||||
|
<h3>Room: ${rn}</h3>
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<th>Title</th>
|
||||||
|
<th>Speakers</th>
|
||||||
|
<th>#Speakers</th>
|
||||||
|
<th>Type</th>
|
||||||
|
<th>Time</th>
|
||||||
|
<th>Record?</th>
|
||||||
|
</tr>
|
||||||
|
${evss.map(e => schedule_event(e))}
|
||||||
|
</table>`;
|
||||||
|
};
|
||||||
|
|
||||||
|
const schedule_day = (con, events, rooms, day) => {
|
||||||
|
const dt = sol.dayStartDate(day);
|
||||||
|
const di = sol.dayIndex(day);
|
||||||
|
|
||||||
|
const evs = sol.eventsByDayIndex(events, di);
|
||||||
|
const rms = sol.roomsByDayIndex(con, rooms, di);
|
||||||
|
|
||||||
|
return html`
|
||||||
|
<h2>Day ${di}: ${dt.setLocale('de-DE').toFormat('EEEE')}</h2>
|
||||||
|
${rms.map(r => schedule_room(evs, r))}`;
|
||||||
|
};
|
||||||
|
|
||||||
|
const schedule_table = (schedule) => {
|
||||||
|
const con = sol.conference(schedule);
|
||||||
|
|
||||||
|
const days = sol.allDays(schedule);
|
||||||
|
const events = sol.allEvents(schedule);
|
||||||
|
const rooms = sol.allRooms(schedule);
|
||||||
|
|
||||||
|
return html`
|
||||||
|
<h1>Schedule (v ${sol.scheduleVersion(schedule)})</h1>
|
||||||
|
${days.map(d => schedule_day(con, events, rooms, d))}`;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
const update_main_slide = (data, time) => {
|
||||||
|
console.log("Our data:");
|
||||||
|
console.log(data);
|
||||||
|
|
||||||
|
if (sol.defined(data.scheduleData)) {
|
||||||
|
const schedule = data.scheduleData;
|
||||||
|
|
||||||
|
const inner = html`
|
||||||
|
${schedule_table(schedule)}`;
|
||||||
|
|
||||||
|
// Add main slide to info beamer
|
||||||
|
const anchorElId = "main";
|
||||||
|
const el = document.getElementById(anchorElId);
|
||||||
|
preact.render(inner, el);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
export {
|
||||||
|
update_main_slide
|
||||||
|
};
|
|
@ -0,0 +1,56 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
import * as sol from "../../solight/sol.js";
|
||||||
|
|
||||||
|
import * as serv from "../services/service.js";
|
||||||
|
|
||||||
|
const html = htm.bind(preact.h);
|
||||||
|
|
||||||
|
|
||||||
|
const person_row = (events, person) =>
|
||||||
|
html`
|
||||||
|
<tr>
|
||||||
|
<td>${sol.personName(person)}</td>
|
||||||
|
</tr>`;
|
||||||
|
|
||||||
|
|
||||||
|
const persons_table = (events, persons) => {
|
||||||
|
const ps = sol.sortPersonsByName(persons);
|
||||||
|
return html`
|
||||||
|
<h2>Persons (${ps.length})</h2>
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<th>Name</th>
|
||||||
|
</tr>
|
||||||
|
${ps.map(p => person_row(events, p))}
|
||||||
|
</table>`;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
const persons_overview = (schedule) => {
|
||||||
|
const persons = sol.allPersons(schedule);
|
||||||
|
const events = sol.allEvents(schedule);
|
||||||
|
return html`
|
||||||
|
<h1>Schedule (v ${sol.scheduleVersion(schedule)})</h1>
|
||||||
|
${persons_table(events, persons)}`;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
const update_main_slide = (data, time) => {
|
||||||
|
if (sol.defined(data.scheduleData)) {
|
||||||
|
const schedule = data.scheduleData;
|
||||||
|
|
||||||
|
const inner = html`
|
||||||
|
${persons_overview(schedule)}`;
|
||||||
|
|
||||||
|
// Add main slide to info beamer
|
||||||
|
const anchorElId = "main";
|
||||||
|
const el = document.getElementById(anchorElId);
|
||||||
|
preact.render(inner, el);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
export {
|
||||||
|
update_main_slide
|
||||||
|
};
|
|
@ -0,0 +1,68 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
import * as sol from "../../solight/sol.js";
|
||||||
|
|
||||||
|
import * as serv from "../services/service.js";
|
||||||
|
|
||||||
|
const html = htm.bind(preact.h);
|
||||||
|
|
||||||
|
|
||||||
|
const speaker = (event) => {
|
||||||
|
const speaker = sol.eventPersons(event);
|
||||||
|
const names = speaker.map(s => sol.personName(s)).join(", ");
|
||||||
|
return html`${names}`;
|
||||||
|
};
|
||||||
|
|
||||||
|
const num_speaker = (event) =>
|
||||||
|
sol.eventPersons(event).length;
|
||||||
|
|
||||||
|
const event_row = (event) =>
|
||||||
|
html`
|
||||||
|
<tr>
|
||||||
|
<td>${sol.eventTitle(event)}</td>
|
||||||
|
<td>${speaker(event)}</td>
|
||||||
|
<td>${num_speaker(event)}</td>
|
||||||
|
</tr>`;
|
||||||
|
|
||||||
|
|
||||||
|
const talks_table = (events) => {
|
||||||
|
const evs = sol.sortEventsByStartDate(events);
|
||||||
|
return html`
|
||||||
|
<h2>Events (${evs.length})</h2>
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<th>Event Title</th>
|
||||||
|
<th>Person(s)</th>
|
||||||
|
<th>#Person(s)</th>
|
||||||
|
</tr>
|
||||||
|
${evs.map(e => event_row(e))}
|
||||||
|
</table>`;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
const talks_overview = (schedule) => {
|
||||||
|
const events = sol.allEvents(schedule);
|
||||||
|
return html`
|
||||||
|
<h1>Schedule (v ${sol.scheduleVersion(schedule)})</h1>
|
||||||
|
${talks_table(events)}`;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
const update_main_slide = (data, time) => {
|
||||||
|
if (sol.defined(data.scheduleData)) {
|
||||||
|
const schedule = data.scheduleData;
|
||||||
|
|
||||||
|
const inner = html`
|
||||||
|
${talks_overview(schedule)}`;
|
||||||
|
|
||||||
|
// Add main slide to info beamer
|
||||||
|
const anchorElId = "main";
|
||||||
|
const el = document.getElementById(anchorElId);
|
||||||
|
preact.render(inner, el);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
export {
|
||||||
|
update_main_slide
|
||||||
|
};
|
|
@ -0,0 +1,49 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
|
||||||
|
import * as fe from "../core/fetcher.js";
|
||||||
|
|
||||||
|
import * as ti from "../core/time.js";
|
||||||
|
|
||||||
|
import * as sc from "../core/screen.js";
|
||||||
|
|
||||||
|
// Import services
|
||||||
|
import * as serv from "../services/service.js";
|
||||||
|
|
||||||
|
// Import views
|
||||||
|
import * as domman from "../dom/schedule.js";
|
||||||
|
import * as clk from "../dom/clock.js";
|
||||||
|
|
||||||
|
|
||||||
|
// Empty JSON lists for data
|
||||||
|
let storage = {
|
||||||
|
scheduleData: undefined
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
let do_fetch = fe.configure({}, serv);
|
||||||
|
|
||||||
|
do_fetch(storage);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Main Loop
|
||||||
|
let screen_update = sc.configure(serv, domman);
|
||||||
|
let clock_update = sc.configure(serv, clk);
|
||||||
|
|
||||||
|
|
||||||
|
let cfg = {
|
||||||
|
"roomName": "D002"
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// Just do it
|
||||||
|
function main_loop() {
|
||||||
|
screen_update(storage, ti, cfg);
|
||||||
|
clock_update(storage, ti, cfg);
|
||||||
|
// update_screen();
|
||||||
|
// setTimeout(main_loop, 1 * 1000);
|
||||||
|
setTimeout(main_loop, 1 * 50);
|
||||||
|
};
|
||||||
|
|
||||||
|
main_loop();
|
|
@ -0,0 +1,54 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
|
||||||
|
import * as fe from "../core/fetcher.js";
|
||||||
|
|
||||||
|
import * as ti from "../core/time.js";
|
||||||
|
|
||||||
|
import * as sc from "../core/screen.js";
|
||||||
|
|
||||||
|
// Import services
|
||||||
|
import * as serv from "../services/service.js";
|
||||||
|
|
||||||
|
// Import views
|
||||||
|
import * as domman from "../dom/schedule.js";
|
||||||
|
import * as clk from "../dom/clock.js";
|
||||||
|
|
||||||
|
|
||||||
|
// Empty JSON lists for data
|
||||||
|
let storage = {
|
||||||
|
scheduleData: undefined
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
let do_fetch = fe.configure({}, serv);
|
||||||
|
|
||||||
|
do_fetch(storage);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Main Loop
|
||||||
|
let screen_update = sc.configure(serv, domman);
|
||||||
|
let clock_update = sc.configure(serv, clk);
|
||||||
|
|
||||||
|
|
||||||
|
let cfg = {
|
||||||
|
"music": {
|
||||||
|
"artist": "luss",
|
||||||
|
"title": "dub techno session #5",
|
||||||
|
"licence": "CC-BY",
|
||||||
|
"url": "https://lussdub.bandcamp.com/"
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// Just do it
|
||||||
|
function main_loop() {
|
||||||
|
screen_update(storage, ti, cfg);
|
||||||
|
clock_update(storage, ti, cfg);
|
||||||
|
// update_screen();
|
||||||
|
// setTimeout(main_loop, 1 * 1000);
|
||||||
|
setTimeout(main_loop, 1 * 50);
|
||||||
|
};
|
||||||
|
|
||||||
|
main_loop();
|
|
@ -0,0 +1,42 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
|
||||||
|
import * as fe from "../core/fetcher.js";
|
||||||
|
|
||||||
|
import * as ti from "../core/time.js";
|
||||||
|
|
||||||
|
import * as sc from "../core/screen.js";
|
||||||
|
|
||||||
|
// Import services
|
||||||
|
import * as serv from "../services/service.js";
|
||||||
|
|
||||||
|
// Import views
|
||||||
|
import * as dom from "../dom/speaker-info.js";
|
||||||
|
|
||||||
|
|
||||||
|
// Empty JSON lists for data
|
||||||
|
let storage = {
|
||||||
|
scheduleData: undefined
|
||||||
|
};
|
||||||
|
|
||||||
|
let cfg = {
|
||||||
|
"roomName": "D002"
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
let do_fetch = fe.configure({}, serv);
|
||||||
|
|
||||||
|
do_fetch(storage);
|
||||||
|
|
||||||
|
|
||||||
|
// Main Loop
|
||||||
|
let screen_update = sc.configure(serv, dom);
|
||||||
|
|
||||||
|
// Just do it
|
||||||
|
function main_loop() {
|
||||||
|
screen_update(storage, ti, cfg);
|
||||||
|
setTimeout(main_loop, 1 * 1000);
|
||||||
|
};
|
||||||
|
|
||||||
|
main_loop();
|
|
@ -0,0 +1,42 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
|
||||||
|
import * as fe from "../core/fetcher.js";
|
||||||
|
|
||||||
|
import * as ti from "../core/time.js";
|
||||||
|
|
||||||
|
import * as sc from "../core/screen.js";
|
||||||
|
|
||||||
|
// Import services
|
||||||
|
import * as serv from "../services/service.js";
|
||||||
|
|
||||||
|
// Import views
|
||||||
|
import * as dom from "../dom/talk-info.js";
|
||||||
|
|
||||||
|
|
||||||
|
// Empty JSON lists for data
|
||||||
|
let storage = {
|
||||||
|
scheduleData: undefined
|
||||||
|
};
|
||||||
|
|
||||||
|
let cfg = {
|
||||||
|
"roomName": "D002"
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
let do_fetch = fe.configure({}, serv);
|
||||||
|
|
||||||
|
do_fetch(storage);
|
||||||
|
|
||||||
|
|
||||||
|
// Main Loop
|
||||||
|
let screen_update = sc.configure(serv, dom);
|
||||||
|
|
||||||
|
// Just do it
|
||||||
|
function main_loop() {
|
||||||
|
screen_update(storage, ti, cfg);
|
||||||
|
setTimeout(main_loop, 1 * 1000);
|
||||||
|
};
|
||||||
|
|
||||||
|
main_loop();
|
|
@ -0,0 +1,42 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
|
||||||
|
import * as fe from "../core/fetcher.js";
|
||||||
|
|
||||||
|
import * as ti from "../core/time.js";
|
||||||
|
|
||||||
|
import * as sc from "../core/screen.js";
|
||||||
|
|
||||||
|
// Import services
|
||||||
|
import * as serv from "../services/service.js";
|
||||||
|
|
||||||
|
// Import views
|
||||||
|
import * as dom from "../dom/upcoming-talk.js";
|
||||||
|
|
||||||
|
|
||||||
|
// Empty JSON lists for data
|
||||||
|
let storage = {
|
||||||
|
scheduleData: undefined
|
||||||
|
};
|
||||||
|
|
||||||
|
let cfg = {
|
||||||
|
"roomName": "D002"
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
let do_fetch = fe.configure({}, serv);
|
||||||
|
|
||||||
|
do_fetch(storage);
|
||||||
|
|
||||||
|
|
||||||
|
// Main Loop
|
||||||
|
let screen_update = sc.configure(serv, dom);
|
||||||
|
|
||||||
|
// Just do it
|
||||||
|
function main_loop() {
|
||||||
|
screen_update(storage, ti, cfg);
|
||||||
|
setTimeout(main_loop, 1 * 1000);
|
||||||
|
};
|
||||||
|
|
||||||
|
main_loop();
|
|
@ -0,0 +1,45 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
|
||||||
|
import * as fe from "../core/fetcher.js";
|
||||||
|
|
||||||
|
import * as ti from "../core/time.js";
|
||||||
|
|
||||||
|
import * as sc from "../core/screen.js";
|
||||||
|
|
||||||
|
// Import services
|
||||||
|
import * as serv from "../services/service.js";
|
||||||
|
|
||||||
|
// Import views
|
||||||
|
import * as domman from "../dom/voc-schedule-hall.js";
|
||||||
|
|
||||||
|
|
||||||
|
// Empty JSON lists for data
|
||||||
|
let storage = {
|
||||||
|
scheduleData: undefined
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
let do_fetch = fe.configure({}, serv);
|
||||||
|
|
||||||
|
do_fetch(storage);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Main Loop
|
||||||
|
let screen_update = sc.configure(serv, domman);
|
||||||
|
|
||||||
|
|
||||||
|
let cfg = {
|
||||||
|
"roomName": "D002"
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// Just do it
|
||||||
|
function main_loop() {
|
||||||
|
screen_update(storage, ti, cfg);
|
||||||
|
// update_screen();
|
||||||
|
setTimeout(main_loop, 1 * 100);
|
||||||
|
};
|
||||||
|
|
||||||
|
main_loop();
|
|
@ -0,0 +1,40 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
|
||||||
|
import * as fe from "../core/fetcher.js";
|
||||||
|
|
||||||
|
import * as ti from "../core/time.js";
|
||||||
|
|
||||||
|
import * as sc from "../core/screen.js";
|
||||||
|
|
||||||
|
// Import services
|
||||||
|
import * as serv from "../services/service.js";
|
||||||
|
|
||||||
|
// Import views
|
||||||
|
import * as domman from "../dom/voc-schedule.js";
|
||||||
|
|
||||||
|
|
||||||
|
// Empty JSON lists for data
|
||||||
|
let storage = {
|
||||||
|
scheduleData: undefined
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
let do_fetch = fe.configure({}, serv);
|
||||||
|
|
||||||
|
do_fetch(storage);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Main Loop
|
||||||
|
let screen_update = sc.configure(serv ,domman);
|
||||||
|
|
||||||
|
|
||||||
|
// Just do it
|
||||||
|
function main_loop() {
|
||||||
|
screen_update(storage, ti);
|
||||||
|
// update_screen();
|
||||||
|
setTimeout(main_loop, 1 * 100);
|
||||||
|
};
|
||||||
|
|
||||||
|
main_loop();
|
|
@ -0,0 +1,40 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
|
||||||
|
import * as fe from "../core/fetcher.js";
|
||||||
|
|
||||||
|
import * as ti from "../core/time.js";
|
||||||
|
|
||||||
|
import * as sc from "../core/screen.js";
|
||||||
|
|
||||||
|
// Import services
|
||||||
|
import * as serv from "../services/service.js";
|
||||||
|
|
||||||
|
// Import views
|
||||||
|
import * as domman from "../dom/voc-speaker.js";
|
||||||
|
|
||||||
|
|
||||||
|
// Empty JSON lists for data
|
||||||
|
let storage = {
|
||||||
|
scheduleData: undefined
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
let do_fetch = fe.configure({}, serv);
|
||||||
|
|
||||||
|
do_fetch(storage);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Main Loop
|
||||||
|
let screen_update = sc.configure(serv ,domman);
|
||||||
|
|
||||||
|
|
||||||
|
// Just do it
|
||||||
|
function main_loop() {
|
||||||
|
screen_update(storage, ti);
|
||||||
|
// update_screen();
|
||||||
|
setTimeout(main_loop, 1 * 100);
|
||||||
|
};
|
||||||
|
|
||||||
|
main_loop();
|
|
@ -0,0 +1,40 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
|
||||||
|
import * as fe from "../core/fetcher.js";
|
||||||
|
|
||||||
|
import * as ti from "../core/time.js";
|
||||||
|
|
||||||
|
import * as sc from "../core/screen.js";
|
||||||
|
|
||||||
|
// Import services
|
||||||
|
import * as serv from "../services/service.js";
|
||||||
|
|
||||||
|
// Import views
|
||||||
|
import * as domman from "../dom/voc-talks.js";
|
||||||
|
|
||||||
|
|
||||||
|
// Empty JSON lists for data
|
||||||
|
let storage = {
|
||||||
|
scheduleData: undefined
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
let do_fetch = fe.configure({}, serv);
|
||||||
|
|
||||||
|
do_fetch(storage);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Main Loop
|
||||||
|
let screen_update = sc.configure(serv ,domman);
|
||||||
|
|
||||||
|
|
||||||
|
// Just do it
|
||||||
|
function main_loop() {
|
||||||
|
screen_update(storage, ti);
|
||||||
|
// update_screen();
|
||||||
|
setTimeout(main_loop, 1 * 100);
|
||||||
|
};
|
||||||
|
|
||||||
|
main_loop();
|
|
@ -0,0 +1,55 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
import * as lodash from "../../lodash/lodash-core.js";
|
||||||
|
|
||||||
|
import * as sol from "../../solight/sol.js";
|
||||||
|
|
||||||
|
|
||||||
|
const process_data = (scheduleFile) =>
|
||||||
|
sol.processScheduleFile(scheduleFile);
|
||||||
|
|
||||||
|
|
||||||
|
const event_modus_string = (event) => {
|
||||||
|
const questionId = 1392;
|
||||||
|
const answers = sol.eventAnswers(event);
|
||||||
|
const answer = answers.filter(a => a.get('question') === questionId);
|
||||||
|
const modus = answer.length > 0 ? answer[0].get('answer') : '???';
|
||||||
|
return modus;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
const trackIndexMap = new Map([
|
||||||
|
['Andere', 0],
|
||||||
|
['Ethik, Wissenschaft, Kultur & Gesellschaft', 1],
|
||||||
|
['Recht & Politik', 2],
|
||||||
|
['Netzwerke, Security, Hard- & Software', 3],
|
||||||
|
['Digitale Selbstverteidigung', 4]]);
|
||||||
|
|
||||||
|
const track_index = (track) =>
|
||||||
|
trackIndexMap.get(track);
|
||||||
|
|
||||||
|
const sort_tracks = (tracks) =>
|
||||||
|
lodash.sortBy(tracks, track_index);
|
||||||
|
|
||||||
|
|
||||||
|
const person_names_concat = (persons) =>
|
||||||
|
// persons.map(p => sol.personName(p)).join(', ');
|
||||||
|
// persons.map(p => sol.personName(p)).join(' & ');
|
||||||
|
persons.map(p => sol.personName(p)).join(' · ');
|
||||||
|
|
||||||
|
|
||||||
|
const ndash_fix_regexp = RegExp('\\s+-\\s+');
|
||||||
|
const ndash_fix_replacement = ' – ';
|
||||||
|
|
||||||
|
const fix_dash = (string) =>
|
||||||
|
string.replace(ndash_fix_regexp, ndash_fix_replacement);
|
||||||
|
|
||||||
|
|
||||||
|
export {
|
||||||
|
process_data,
|
||||||
|
event_modus_string,
|
||||||
|
track_index,
|
||||||
|
sort_tracks,
|
||||||
|
person_names_concat,
|
||||||
|
fix_dash
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
declare const htm: {
|
||||||
|
bind<HResult>(
|
||||||
|
h: (type: any, props: Record<string, any>, ...children: any[]) => HResult
|
||||||
|
): (strings: TemplateStringsArray, ...values: any[]) => HResult | HResult[];
|
||||||
|
};
|
||||||
|
export default htm;
|
|
@ -0,0 +1 @@
|
||||||
|
!function(){var n=function(t,e,s,u){var r;e[0]=0;for(var h=1;h<e.length;h++){var p=e[h++],a=e[h]?(e[0]|=p?1:2,s[e[h++]]):e[++h];3===p?u[0]=a:4===p?u[1]=Object.assign(u[1]||{},a):5===p?(u[1]=u[1]||{})[e[++h]]=a:6===p?u[1][e[++h]]+=a+"":p?(r=t.apply(a,n(t,a,s,["",null])),u.push(r),a[0]?e[0]|=2:(e[h-2]=0,e[h]=r)):u.push(a)}return u},t=new Map,e=function(e){var s=t.get(this);return s||(s=new Map,t.set(this,s)),(s=n(this,s.get(e)||(s.set(e,s=function(n){for(var t,e,s=1,u="",r="",h=[0],p=function(n){1===s&&(n||(u=u.replace(/^\s*\n\s*|\s*\n\s*$/g,"")))?h.push(0,n,u):3===s&&(n||u)?(h.push(3,n,u),s=2):2===s&&"..."===u&&n?h.push(4,n,0):2===s&&u&&!n?h.push(5,0,!0,u):s>=5&&((u||!n&&5===s)&&(h.push(s,0,u,e),s=6),n&&(h.push(s,n,0,e),s=6)),u=""},a=0;a<n.length;a++){a&&(1===s&&p(),p(a));for(var o=0;o<n[a].length;o++)t=n[a][o],1===s?"<"===t?(p(),h=[h],s=3):u+=t:4===s?"--"===u&&">"===t?(s=1,u=""):u=t+u[0]:r?t===r?r="":u+=t:'"'===t||"'"===t?r=t:">"===t?(p(),s=1):s&&("="===t?(s=5,e=u,u=""):"/"===t&&(s<5||">"===n[a][o+1])?(p(),3===s&&(h=h[0]),s=h,(h=h[0]).push(2,0,s),s=0):" "===t||"\t"===t||"\n"===t||"\r"===t?(p(),s=2):u+=t),3===s&&"!--"===u&&(s=4,h=h[0])}return p(),h}(e)),s),arguments,[])).length>1?s:s[0]};"undefined"!=typeof module?module.exports=e:self.htm=e}();
|
|
@ -0,0 +1 @@
|
||||||
|
var n=function(t,s,r,e){var u;s[0]=0;for(var h=1;h<s.length;h++){var p=s[h++],a=s[h]?(s[0]|=p?1:2,r[s[h++]]):s[++h];3===p?e[0]=a:4===p?e[1]=Object.assign(e[1]||{},a):5===p?(e[1]=e[1]||{})[s[++h]]=a:6===p?e[1][s[++h]]+=a+"":p?(u=t.apply(a,n(t,a,r,["",null])),e.push(u),a[0]?s[0]|=2:(s[h-2]=0,s[h]=u)):e.push(a)}return e},t=new Map;export default function(s){var r=t.get(this);return r||(r=new Map,t.set(this,r)),(r=n(this,r.get(s)||(r.set(s,r=function(n){for(var t,s,r=1,e="",u="",h=[0],p=function(n){1===r&&(n||(e=e.replace(/^\s*\n\s*|\s*\n\s*$/g,"")))?h.push(0,n,e):3===r&&(n||e)?(h.push(3,n,e),r=2):2===r&&"..."===e&&n?h.push(4,n,0):2===r&&e&&!n?h.push(5,0,!0,e):r>=5&&((e||!n&&5===r)&&(h.push(r,0,e,s),r=6),n&&(h.push(r,n,0,s),r=6)),e=""},a=0;a<n.length;a++){a&&(1===r&&p(),p(a));for(var l=0;l<n[a].length;l++)t=n[a][l],1===r?"<"===t?(p(),h=[h],r=3):e+=t:4===r?"--"===e&&">"===t?(r=1,e=""):e=t+e[0]:u?t===u?u="":e+=t:'"'===t||"'"===t?u=t:">"===t?(p(),r=1):r&&("="===t?(r=5,s=e,e=""):"/"===t&&(r<5||">"===n[a][l+1])?(p(),3===r&&(h=h[0]),r=h,(h=h[0]).push(2,0,r),r=0):" "===t||"\t"===t||"\n"===t||"\r"===t?(p(),r=2):e+=t),3===r&&"!--"===e&&(r=4,h=h[0])}return p(),h}(s)),r),arguments,[])).length>1?r:r[0]}
|
|
@ -0,0 +1 @@
|
||||||
|
var n=function(t,s,r,e){var u;s[0]=0;for(var h=1;h<s.length;h++){var p=s[h++],a=s[h]?(s[0]|=p?1:2,r[s[h++]]):s[++h];3===p?e[0]=a:4===p?e[1]=Object.assign(e[1]||{},a):5===p?(e[1]=e[1]||{})[s[++h]]=a:6===p?e[1][s[++h]]+=a+"":p?(u=t.apply(a,n(t,a,r,["",null])),e.push(u),a[0]?s[0]|=2:(s[h-2]=0,s[h]=u)):e.push(a)}return e},t=new Map;export default function(s){var r=t.get(this);return r||(r=new Map,t.set(this,r)),(r=n(this,r.get(s)||(r.set(s,r=function(n){for(var t,s,r=1,e="",u="",h=[0],p=function(n){1===r&&(n||(e=e.replace(/^\s*\n\s*|\s*\n\s*$/g,"")))?h.push(0,n,e):3===r&&(n||e)?(h.push(3,n,e),r=2):2===r&&"..."===e&&n?h.push(4,n,0):2===r&&e&&!n?h.push(5,0,!0,e):r>=5&&((e||!n&&5===r)&&(h.push(r,0,e,s),r=6),n&&(h.push(r,n,0,s),r=6)),e=""},a=0;a<n.length;a++){a&&(1===r&&p(),p(a));for(var l=0;l<n[a].length;l++)t=n[a][l],1===r?"<"===t?(p(),h=[h],r=3):e+=t:4===r?"--"===e&&">"===t?(r=1,e=""):e=t+e[0]:u?t===u?u="":e+=t:'"'===t||"'"===t?u=t:">"===t?(p(),r=1):r&&("="===t?(r=5,s=e,e=""):"/"===t&&(r<5||">"===n[a][l+1])?(p(),3===r&&(h=h[0]),r=h,(h=h[0]).push(2,0,r),r=0):" "===t||"\t"===t||"\n"===t||"\r"===t?(p(),r=2):e+=t),3===r&&"!--"===e&&(r=4,h=h[0])}return p(),h}(s)),r),arguments,[])).length>1?r:r[0]}
|
|
@ -0,0 +1 @@
|
||||||
|
!function(n,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):n.htm=e()}(this,function(){var n=function(e,t,u,s){var r;t[0]=0;for(var p=1;p<t.length;p++){var h=t[p++],o=t[p]?(t[0]|=h?1:2,u[t[p++]]):t[++p];3===h?s[0]=o:4===h?s[1]=Object.assign(s[1]||{},o):5===h?(s[1]=s[1]||{})[t[++p]]=o:6===h?s[1][t[++p]]+=o+"":h?(r=e.apply(o,n(e,o,u,["",null])),s.push(r),o[0]?t[0]|=2:(t[p-2]=0,t[p]=r)):s.push(o)}return s},e=new Map;return function(t){var u=e.get(this);return u||(u=new Map,e.set(this,u)),(u=n(this,u.get(t)||(u.set(t,u=function(n){for(var e,t,u=1,s="",r="",p=[0],h=function(n){1===u&&(n||(s=s.replace(/^\s*\n\s*|\s*\n\s*$/g,"")))?p.push(0,n,s):3===u&&(n||s)?(p.push(3,n,s),u=2):2===u&&"..."===s&&n?p.push(4,n,0):2===u&&s&&!n?p.push(5,0,!0,s):u>=5&&((s||!n&&5===u)&&(p.push(u,0,s,t),u=6),n&&(p.push(u,n,0,t),u=6)),s=""},o=0;o<n.length;o++){o&&(1===u&&h(),h(o));for(var f=0;f<n[o].length;f++)e=n[o][f],1===u?"<"===e?(h(),p=[p],u=3):s+=e:4===u?"--"===s&&">"===e?(u=1,s=""):s=e+s[0]:r?e===r?r="":s+=e:'"'===e||"'"===e?r=e:">"===e?(h(),u=1):u&&("="===e?(u=5,t=s,s=""):"/"===e&&(u<5||">"===n[o][f+1])?(h(),3===u&&(p=p[0]),u=p,(p=p[0]).push(2,0,u),u=0):" "===e||"\t"===e||"\n"===e||"\r"===e?(h(),u=2):s+=e),3===u&&"!--"===s&&(u=4,p=p[0])}return h(),p}(t)),u),arguments,[])).length>1?u:u[0]}});
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,20 @@
|
||||||
|
baseURL = "https://dhcp24.winkekatze.tv/"
|
||||||
|
languageCode = 'de-DE'
|
||||||
|
title = 'DHCP24'
|
||||||
|
|
||||||
|
defaultContentLanguage = "en"
|
||||||
|
|
||||||
|
disableHugoGeneratorInject = true
|
||||||
|
enableRobotsTXT = false
|
||||||
|
disableKinds = ["taxonomy", "term", "RSS", "sitemap", "robotsTXT", "404"]
|
||||||
|
|
||||||
|
[outputs]
|
||||||
|
home = ["HTML"]
|
||||||
|
page = ["HTML"]
|
||||||
|
|
||||||
|
|
||||||
|
[params]
|
||||||
|
workerBaseURL = '/js/custom/core/'
|
||||||
|
|
||||||
|
scheduleURL = '/schedule.json'
|
||||||
|
scheduleFetchInterval = 60
|
|
@ -0,0 +1,8 @@
|
||||||
|
baseURL = "https://dhcp24.winkekatze.tv/"
|
||||||
|
|
||||||
|
|
||||||
|
[params]
|
||||||
|
workerBaseURL = '/js/custom/core/'
|
||||||
|
|
||||||
|
scheduleURL = '/schedule.json'
|
||||||
|
scheduleFetchInterval = 60
|
|
@ -0,0 +1,2 @@
|
||||||
|
---
|
||||||
|
---
|
|
@ -0,0 +1,4 @@
|
||||||
|
---
|
||||||
|
title: "Schedule D002: Vortragssaal"
|
||||||
|
type: schedule-hall1
|
||||||
|
---
|
|
@ -0,0 +1,4 @@
|
||||||
|
---
|
||||||
|
title: "Schedule"
|
||||||
|
type: schedule
|
||||||
|
---
|
|
@ -0,0 +1,4 @@
|
||||||
|
---
|
||||||
|
title: "Speaker Info D002: Vortragssaal"
|
||||||
|
type: speaker-info-hall1
|
||||||
|
---
|
|
@ -0,0 +1,4 @@
|
||||||
|
---
|
||||||
|
title: "Talk Info D002: Vortragssaal"
|
||||||
|
type: talk-info-hall1
|
||||||
|
---
|
|
@ -0,0 +1,4 @@
|
||||||
|
---
|
||||||
|
title: "Upcoming Talk D002: Vortragssaal"
|
||||||
|
type: upcoming-talk-hall1
|
||||||
|
---
|
|
@ -0,0 +1,4 @@
|
||||||
|
---
|
||||||
|
title: "VOC Schedule D002: Vortragssaal"
|
||||||
|
type: voc-schedule-hall1
|
||||||
|
---
|
|
@ -0,0 +1,4 @@
|
||||||
|
---
|
||||||
|
title: "VOC Schedule"
|
||||||
|
type: voc-schedule
|
||||||
|
---
|
|
@ -0,0 +1,4 @@
|
||||||
|
---
|
||||||
|
title: "VOC Speaker"
|
||||||
|
type: voc-speaker
|
||||||
|
---
|
|
@ -0,0 +1,4 @@
|
||||||
|
---
|
||||||
|
title: "VOC Talks"
|
||||||
|
type: voc-talks
|
||||||
|
---
|
Loading…
Reference in New Issue