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