use real time

This commit is contained in:
L3D 2024-10-30 22:30:09 +01:00
parent 6f06075dfe
commit 748ba51910
Signed by: L3D
GPG Key ID: CD08445BFF4313D1
78 changed files with 23060 additions and 0 deletions

View File

@ -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;
}
}
}

View File

@ -0,0 +1 @@
@import "../styles/_base";

View File

@ -0,0 +1,4 @@
@import "../styles/_base";
@import "../styles/_schedule";
@import "../styles/_clock";

View File

@ -0,0 +1,4 @@
@import "../styles/_base";
@import "../styles/_schedule";
@import "../styles/_clock";

View File

@ -0,0 +1,3 @@
@import "../styles/_base";
@import "../styles/_banner-speaker";

View File

@ -0,0 +1,3 @@
@import "../styles/_base";
@import "../styles/_banner-talk";

View File

@ -0,0 +1,3 @@
@import "../styles/_base";
@import "../styles/_upcoming-talk";

View File

@ -0,0 +1,3 @@
@import "../styles/_base";
@import "../styles/_voc-schedule";

View File

@ -0,0 +1,3 @@
@import "../styles/_base";
@import "../styles/_voc-speaker";

View File

@ -0,0 +1,3 @@
@import "../styles/_base";
@import "../styles/_voc-talks";

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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);

View File

@ -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;
}

View File

@ -0,0 +1,3 @@
@import "_variables";
@import "_base";
@import "_voc";

View File

@ -0,0 +1,3 @@
@import "_variables";
@import "_base";
@import "_voc";

View File

@ -0,0 +1,11 @@
#main {
left: 20px;
}
table {
border-spacing: 25px 2px;
}
th {
text-align: left;
}

View File

@ -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+ */
}

View File

@ -0,0 +1,5 @@
@import "permanent-marker";
@import "architects-daughter";
@import "source-code-pro";
@import "lato";

89
assets/css/fonts/lato.css Normal file
View File

@ -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+ */
}

View File

@ -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+ */
}

View File

@ -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+ */
}

View File

@ -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);

View File

@ -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
};

View File

@ -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);
})();

View File

@ -0,0 +1,14 @@
'use strict';
let configure = () => undefined;
export {
configure
}

View File

@ -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
}

View File

@ -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
}

View File

@ -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
};

View File

@ -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
}

View File

@ -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
};

View File

@ -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
};

View File

@ -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
};

View File

@ -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
};

View File

@ -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
};

View File

@ -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
};

View File

@ -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
};

View File

@ -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
};

View File

@ -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();

View File

@ -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();

View File

@ -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();

View File

@ -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();

View File

@ -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();

View File

@ -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();

View File

@ -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();

View File

@ -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();

View File

@ -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();

View File

@ -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
}

6
assets/js/htm/htm.d.ts vendored Normal file
View File

@ -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;

1
assets/js/htm/htm.js Normal file
View File

@ -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}();

1
assets/js/htm/htm.mjs Normal file
View File

@ -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]}

View File

@ -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]}

1
assets/js/htm/htm.umd.js Normal file
View File

@ -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

6978
assets/js/luxon/luxon.es6.js Normal file

File diff suppressed because it is too large Load Diff

1
assets/js/luxon/luxon.es6.min.js vendored Normal file

File diff suppressed because one or more lines are too long

8478
assets/js/luxon/luxon.js Normal file

File diff suppressed because it is too large Load Diff

1
assets/js/luxon/luxon.min.js vendored Normal file

File diff suppressed because one or more lines are too long

2
assets/js/preact/preact.min.js vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

1089
assets/js/solight/sol.js Normal file

File diff suppressed because it is too large Load Diff

View File

@ -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

View File

@ -0,0 +1,8 @@
baseURL = "https://dhcp24.winkekatze.tv/"
[params]
workerBaseURL = '/js/custom/core/'
scheduleURL = '/schedule.json'
scheduleFetchInterval = 60

2
content/_index.md Normal file
View File

@ -0,0 +1,2 @@
---
---

View File

@ -0,0 +1,4 @@
---
title: "Schedule D002: Vortragssaal"
type: schedule-hall1
---

View File

@ -0,0 +1,4 @@
---
title: "Schedule"
type: schedule
---

View File

@ -0,0 +1,4 @@
---
title: "Speaker Info D002: Vortragssaal"
type: speaker-info-hall1
---

View File

@ -0,0 +1,4 @@
---
title: "Talk Info D002: Vortragssaal"
type: talk-info-hall1
---

View File

@ -0,0 +1,4 @@
---
title: "Upcoming Talk D002: Vortragssaal"
type: upcoming-talk-hall1
---

View File

@ -0,0 +1,4 @@
---
title: "VOC Schedule D002: Vortragssaal"
type: voc-schedule-hall1
---

View File

@ -0,0 +1,4 @@
---
title: "VOC Schedule"
type: voc-schedule
---

View File

@ -0,0 +1,4 @@
---
title: "VOC Speaker"
type: voc-speaker
---

View File

@ -0,0 +1,4 @@
---
title: "VOC Talks"
type: voc-talks
---