144 lines
3.7 KiB
HTML
144 lines
3.7 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<title>Doctor Who Season 2 Finale</title>
|
|
<script src="https://cdn.jsdelivr.net/npm/canvas-confetti@1.6.0/dist/confetti.browser.min.js"></script>
|
|
<style>
|
|
@import url('https://fonts.googleapis.com/css2?family=Orbitron:wght@500&display=swap');
|
|
|
|
body {
|
|
margin: 0;
|
|
padding: 0;
|
|
font-family: 'Orbitron', sans-serif;
|
|
background: linear-gradient(135deg, #0f2027, #203a43, #2c5364);
|
|
color: #ffffff;
|
|
display: flex;
|
|
flex-direction: column;
|
|
align-items: center;
|
|
justify-content: center;
|
|
height: 100vh;
|
|
text-align: center;
|
|
animation: fadeIn 1.5s ease-in;
|
|
}
|
|
|
|
h1 {
|
|
font-size: 2.5em;
|
|
margin-bottom: 0.5em;
|
|
color: #00ffc3;
|
|
text-shadow: 0 0 10px #00ffc3, 0 0 20px #00ffc3;
|
|
}
|
|
|
|
#countdown {
|
|
font-size: 4em;
|
|
font-weight: bold;
|
|
color: #ffffff;
|
|
text-shadow: 0 0 10px #00fff2, 0 0 20px #00d4ff;
|
|
background: rgba(255, 255, 255, 0.1);
|
|
border: 2px solid #00ffc3;
|
|
border-radius: 15px;
|
|
padding: 20px 60px;
|
|
margin-bottom: 1em;
|
|
animation: glow 2s infinite alternate;
|
|
}
|
|
|
|
#localTime {
|
|
font-size: 1.2em;
|
|
color: #ddd;
|
|
}
|
|
|
|
@keyframes fadeIn {
|
|
from { opacity: 0; transform: translateY(-20px); }
|
|
to { opacity: 1; transform: translateY(0); }
|
|
}
|
|
|
|
@keyframes glow {
|
|
from {
|
|
box-shadow: 0 0 10px #00ffc3;
|
|
}
|
|
to {
|
|
box-shadow: 0 0 25px #00ffc3, 0 0 35px #00d4ff;
|
|
}
|
|
}
|
|
|
|
@media (max-width: 600px) {
|
|
#countdown {
|
|
font-size: 2.5em;
|
|
padding: 15px 30px;
|
|
}
|
|
|
|
h1 {
|
|
font-size: 1.8em;
|
|
}
|
|
}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
|
|
<h1>🛸 Doctor Who Season 2 Finale</h1>
|
|
<div id="countdown">Loading...</div>
|
|
<div id="localTime"></div>
|
|
|
|
<audio id="themeMusic" preload="auto">
|
|
<source src="audio/doctor-who-remix-m1ck.wav" type="audio/wav">
|
|
Your browser does not support the audio element.
|
|
</audio>
|
|
|
|
<script>
|
|
const targetDateUTC = new Date(Date.UTC(2025, 4, 31, 17, 50, 0));
|
|
let countdownInterval;
|
|
const audio = document.getElementById("themeMusic");
|
|
|
|
function launchConfetti() {
|
|
confetti({
|
|
particleCount: 200,
|
|
spread: 100,
|
|
origin: { y: 0.6 },
|
|
colors: ['#00ffc3', '#00d4ff', '#ffffff']
|
|
});
|
|
}
|
|
|
|
function playThemeMusic() {
|
|
const playPromise = audio.play();
|
|
if (playPromise !== undefined) {
|
|
playPromise.catch(() => {
|
|
document.body.addEventListener('click', () => audio.play(), { once: true });
|
|
});
|
|
}
|
|
}
|
|
|
|
function updateCountdown() {
|
|
const now = new Date();
|
|
const diff = targetDateUTC - now;
|
|
|
|
if (diff <= 0) {
|
|
clearInterval(countdownInterval);
|
|
document.getElementById("countdown").textContent = "🎉 The episode is out — go watch now!";
|
|
document.getElementById("localTime").textContent = '';
|
|
launchConfetti();
|
|
playThemeMusic();
|
|
return;
|
|
}
|
|
|
|
const hours = Math.floor(diff / (1000 * 60 * 60));
|
|
const minutes = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60));
|
|
const seconds = Math.floor((diff % (1000 * 60)) / 1000);
|
|
|
|
document.getElementById("countdown").textContent =
|
|
`${hours.toString().padStart(2, '0')}h ` +
|
|
`${minutes.toString().padStart(2, '0')}m ` +
|
|
`${seconds.toString().padStart(2, '0')}s`;
|
|
|
|
const localTime = targetDateUTC.toLocaleString(undefined, {
|
|
dateStyle: 'full',
|
|
timeStyle: 'short',
|
|
});
|
|
document.getElementById("localTime").textContent = `🕒 Local Time: ${localTime}`;
|
|
}
|
|
|
|
updateCountdown();
|
|
countdownInterval = setInterval(updateCountdown, 1000);
|
|
</script>
|
|
</body>
|
|
</html>
|