Files
dernier-metro/lol/index.html
T
2026-06-13 23:32:19 +02:00

333 lines
11 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>GavleTv × Dernier métro</title>
<style>
@font-face {
font-family: "bianzhidai nobg pearl";
src: url("./bianzhidai_noBG-Pearl.otf");
}
:root {
--tcl-red: #e2001a;
}
body, html {
padding: 0;
margin: 0;
}
body {
background: black;
height: 100vh;
width: 100vw;
box-sizing: border-box;
overflow: hidden;
}
#gavle-tv {
width: 100%;
height: 100%;
}
.thinking {
position: absolute;
top: 0;
left: 0;
z-index: 10;
width: 200px;
height: 200px;
background: white;
border: white solid 4px;
box-shadow: 8px 8px 0 black;
}
.thinking iframe {
width: 200%;
height: 200%;
transform-origin: 0 0;
transform: scale(0.5);
border: none;
opacity: 0.5;
}
.thinking img {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
object-fit: cover;
opacity: 0.5;
mix-blend-mode: darken;
}
#next-bus-ribbon {
position: absolute;
top: 50px;
left: 0;
width: 100%;
}
gavle-marquee {
--markee-speed: 20;
--markee-interaction-pause-delay: 1s;
width: 100vw;
& > gavle-next-bus {
max-width: 75vw;
}
& > * {
padding-left: 1.5em;
}
}
gavle-next-bus {
display: grid;
color: white;
font-family: sans-serif;
font-size: 1.5em;
grid-template-columns: min-content 1fr;
grid-template-rows: 1fr min-content;
column-gap: 0.75em;
row-gap: 5px;
& > :not(img) {
mix-blend-mode: exclusion;
}
&[hidden] {
display: none;
}
& > * {
grid-column: 2;
margin: 0;
}
& > img {
grid-column: 1;
grid-row: 1 / 3;
align-self: flex-start;
}
& h1 {
font-size: inherit;
}
& h1 small {
font-size: inherit;
font-weight: normal;
display: block;
}
& img {
height: 2em;
max-width: 3em;
margin-top: -5px;
--outline-size: 1px;
--outline-color: white;
filter:
drop-shadow(0px var(--outline-size) 0px var(--outline-color))
drop-shadow(var(--outline-size) 0px 0px var(--outline-color))
drop-shadow(var(--outline-size) var(--outline-size) 0px var(--outline-color))
drop-shadow(0px calc(var(--outline-size) * -1) 0px var(--outline-color))
drop-shadow(calc(var(--outline-size) * -1) 0px 0px var(--outline-color))
drop-shadow(calc(var(--outline-size) * -1) calc(var(--outline-size) * -1) 0px var(--outline-color))
drop-shadow(calc(var(--outline-size) * -1) var(--outline-size) 0px var(--outline-color))
drop-shadow(var(--outline-size) calc(var(--outline-size) * -1) 0px var(--outline-color))
;
}
& p {
font-size: 0.8em;
}
.last-passage.warning {
color: white;
--outline-size: 1px;
--outline-color:#e2001a;
filter:
drop-shadow(0px var(--outline-size) 0px var(--outline-color))
drop-shadow(var(--outline-size) 0px 0px var(--outline-color))
drop-shadow(var(--outline-size) var(--outline-size) 0px var(--outline-color))
drop-shadow(0px calc(var(--outline-size) * -1) 0px var(--outline-color))
drop-shadow(calc(var(--outline-size) * -1) 0px 0px var(--outline-color))
drop-shadow(calc(var(--outline-size) * -1) calc(var(--outline-size) * -1) 0px var(--outline-color))
drop-shadow(calc(var(--outline-size) * -1) var(--outline-size) 0px var(--outline-color))
drop-shadow(var(--outline-size) calc(var(--outline-size) * -1) 0px var(--outline-color))
;
text-transform: uppercase;
mix-blend-mode: normal;
font-weight: normal;
}
}
gavle-velov-station {
display: grid;
color: white;
font-family: sans-serif;
font-size: 1.5em;
grid-template-columns: min-content 1fr;
grid-template-rows: 1fr min-content;
column-gap: 0.75em;
row-gap: 5px;
& > img {
grid-column: 1;
grid-row: 1 / 3;
align-self: flex-start;
}
& h1 {
font-size: inherit;
margin: 0;
padding-right: 3em;
width: fit-content;
}
& img {
height: 1.3em;
max-width: 3em;
margin-top: 5px;
--outline-size: 1px;
--outline-color: white;
filter:
drop-shadow(0px var(--outline-size) 0px var(--outline-color))
drop-shadow(var(--outline-size) 0px 0px var(--outline-color))
drop-shadow(var(--outline-size) var(--outline-size) 0px var(--outline-color))
drop-shadow(0px calc(var(--outline-size) * -1) 0px var(--outline-color))
drop-shadow(calc(var(--outline-size) * -1) 0px 0px var(--outline-color))
drop-shadow(calc(var(--outline-size) * -1) calc(var(--outline-size) * -1) 0px var(--outline-color))
drop-shadow(calc(var(--outline-size) * -1) var(--outline-size) 0px var(--outline-color))
drop-shadow(var(--outline-size) calc(var(--outline-size) * -1) 0px var(--outline-color))
;
}
& p {
font-size: 0.8em;
margin: 0;
}
& > :not(img) {
mix-blend-mode: exclusion;
}
}
@keyframes deux-points {
0% { opacity: 1; }
25% { opacity: 1; }
25.1% { opacity: 0; }
100% { opacity: 0; }
}
#clock {
display: block;
font-family: "bianzhidai nobg pearl";
position: fixed;
bottom: 5px;
right: 15px;
font-size: 17vh;
z-index: 1000;
color: white;
mix-blend-mode: exclusion;
line-height: 0.8;
.deux-points {
animation: deux-points steps(4) 1s infinite;
}
}
.plurial {
display: none;
}
.plurial-content .plurial {
display: inline;
}
</style>
</head>
<body>
<iframe id="gavle-tv" src="./liquid-shape-distortions/index.html" frameborder="0"></iframe>
<script type="module" src="./components/marquee.js"></script>
<script type="module" src="./components/next-bus.js"></script>
<script type="module" src="./components/velov-station.js"></script>
<script type="module">
let shuffledElements = Array.from(document.getElementById("next-bus-ribbon").children)
.map(value => ({ value, sort: Math.random() }))
.sort((a, b) => a.sort - b.sort)
.map(({ value }) => value)
document.getElementById("next-bus-ribbon").replaceChildren(...shuffledElements)
</script>
<gavle-marquee id="next-bus-ribbon">
<gavle-next-bus stop-id="line:SYTNEX:A/forward/stop_point:SYTNEX:46052">
<!-- Metro A dir Vaulx, Hotel de ville -->
</gavle-next-bus>
<gavle-next-bus stop-id="line:SYTNEX:A/backward/stop_point:SYTNEX:42743">
<!-- Metro A dir Perrache, Hotel de ville -->
</gavle-next-bus>
<gavle-next-bus stop-id="line:SYTNEX:9/forward/stop_point:SYTNEX:2494">
<!-- Bus 9 dir Satoney, Pont de lattre RD -->
</gavle-next-bus>
<gavle-next-bus stop-id="line:SYTNEX:9/backward/stop_point:SYTNEX:2494">
<!-- Bus 9 dir cordeliers, Pont de lattre RD -->
</gavle-next-bus>
<gavle-next-bus stop-id="line:SYTNEX:C/forward/stop_point:SYTNEX:10787">
<!-- Métro C dir Cuire, Croix-Paquet -->
</gavle-next-bus>
<gavle-next-bus stop-id="line:SYTNEX:C6/forward/stop_point:SYTNEX:2496">
<!-- Bus C6 arret Pont de lattre RD campus lyon ouest -->
</gavle-next-bus>
<gavle-next-bus stop-id="line:SYTNEX:C6/backward/stop_point:SYTNEX:2495">
<!-- Bus C6 arret Pont de lattre RD Gare part dieu v. merle -->
</gavle-next-bus>
<gavle-next-bus stop-id="line:SYTNEX:C13/forward/stop_point:SYTNEX:10169">
<!-- Bus C13 arret Austerlitz montessuy gutemberg -->
</gavle-next-bus>
<gavle-next-bus stop-id="line:SYTNEX:C13/backward/stop_point:SYTNEX:10169">
<!-- Bus C13 arret Austerlitz vers grange blanche -->
</gavle-next-bus>
<gavle-next-bus stop-id="line:SYTNEX:PL2/backward/stop_point:SYTNEX:10889">
<!-- Bus PL2 arret Pont de lattre RD vers Musée des confluences -->
</gavle-next-bus>
<gavle-next-bus stop-id="line:SYTNEX:PL2/forward/stop_point:SYTNEX:10169">
<!-- BUS PL2 arret Austerlitz vers Cuire -->
</gavle-next-bus>
<gavle-next-bus stop-id="line:SYTNEX:C23/backward/stop_point:SYTNEX:10889">
<!-- Bus C13 arret Pont de lattre RD vers Flachet - Alain Gilles -->
</gavle-next-bus>
<gavle-next-bus stop-id="line:SYTNEX:C23/forward/stop_point:SYTNEX:10889">
<!-- Bus C13 arret Pont de lattre RD vers Cite internationale -->
</gavle-next-bus>
<gavle-velov-station station-id="poi:osm:node:7020557391">
<!-- Chazette / Lassagne -->
</gavle-velov-station>
<gavle-velov-station station-id="poi:osm:node:1332627068">
<!-- Quai Lassagne -->
</gavle-velov-station>
<gavle-velov-station station-id="poi:osm:node:1056768413">
<!-- Place Tolozan -->
</gavle-velov-station>
<gavle-velov-station station-id="poi:osm:node:10621667633">
<!-- Place d'Helvétie -->
</gavle-velov-station>
</gavle-marquee>
<script type="module" src="./components/clock.js"></script>
<gavle-clock id="clock"></gavle-clock>
</body>
</html>