MediaWiki:Common.js: Unterschied zwischen den Versionen
Admin (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung Markierung: Manuelle Zurücksetzung |
Admin (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
||
| Zeile 1.138: | Zeile 1.138: | ||
var intervalId = window.setInterval(updateTimer, 1000); | var intervalId = window.setInterval(updateTimer, 1000); | ||
}); | }); | ||
})(); | |||
/* ========================================================= | |||
ADOS XMAS: Timer-Bar & Snow (nur im Dezember) | |||
========================================================= */ | |||
(function () { | |||
'use strict'; | |||
// Nur im Browser, nicht im Parsoid/Server-Zeug | |||
if (typeof window === 'undefined' || typeof document === 'undefined') return; | |||
var now = new Date(); | |||
// Nur im Dezember aktiv (Monat 11 = Dezember) | |||
if (now.getMonth() !== 11) { | |||
return; | |||
} | |||
// Wenn der Nutzer reduzierte Animationen bevorzugt → Schneefall aus | |||
var prefersReducedMotion = false; | |||
try { | |||
prefersReducedMotion = window.matchMedia && | |||
window.matchMedia('(prefers-reduced-motion: reduce)').matches; | |||
} catch (e) {} | |||
/* ----------------------------- | |||
1) Timer-Bar DOM sicherstellen | |||
----------------------------- */ | |||
function ensureTimerBarDom() { | |||
var bar = document.getElementById('ados-timer-bar'); | |||
if (!bar) { | |||
bar = document.createElement('div'); | |||
bar.id = 'ados-timer-bar'; | |||
bar.innerHTML = | |||
'<div id="ados-timer-inner">' + | |||
'<span id="ados-timer-message"></span>' + | |||
'<span id="ados-timer-countdown"></span>' + | |||
'<button id="ados-timer-close" type="button" aria-label="Leiste schließen">×</button>' + | |||
'</div>'; | |||
document.body.prepend(bar); | |||
} | |||
return bar; | |||
} | |||
/* ----------------------------- | |||
2) Weihnachts-Timer initialisieren | |||
----------------------------- */ | |||
function initXmasTimer() { | |||
var bar = ensureTimerBarDom(); | |||
var msgEl = document.getElementById('ados-timer-message'); | |||
var cdEl = document.getElementById('ados-timer-countdown'); | |||
var close = document.getElementById('ados-timer-close'); | |||
if (!bar || !msgEl || !cdEl) return; | |||
// Weihnachts-Design aktivieren | |||
bar.classList.add('ados-xmas'); | |||
bar.style.display = 'block'; | |||
document.body.classList.add('has-ados-timer'); | |||
// Text | |||
msgEl.textContent = 'Frohe Feiertage vom ADOS-Wiki – genieße die Adventszeit mit einem guten Dram!'; | |||
// Countdown bis Heiligabend (24.12. dieses Jahres) | |||
var target = new Date(now.getFullYear(), 11, 24, 0, 0, 0, 0); | |||
function updateCountdown() { | |||
var now2 = new Date(); | |||
var diff = target - now2; | |||
if (diff <= 0) { | |||
cdEl.textContent = 'Heiligabend ist da ✨'; | |||
return; | |||
} | |||
var days = Math.floor(diff / (1000 * 60 * 60 * 24)); | |||
var hours = Math.floor((diff / (1000 * 60 * 60)) % 24); | |||
cdEl.textContent = 'Noch ' + days + ' Tag' + (days !== 1 ? 'e' : '') + | |||
' und ' + hours + ' Std.'; | |||
} | |||
updateCountdown(); | |||
setInterval(updateCountdown, 60 * 1000); // jede Minute | |||
// Schließen-Button | |||
if (close) { | |||
close.addEventListener('click', function () { | |||
bar.style.display = 'none'; | |||
document.body.classList.remove('has-ados-timer'); | |||
}); | |||
} | |||
} | |||
/* ----------------------------- | |||
3) Schneefall-Effekt | |||
----------------------------- */ | |||
function initSnow() { | |||
if (prefersReducedMotion) return; | |||
// Optional: auf sehr kleinen Geräten deaktivieren | |||
if (window.innerWidth < 600) return; | |||
// Container anlegen | |||
var container = document.createElement('div'); | |||
container.id = 'ados-snow'; | |||
document.body.appendChild(container); | |||
var flakeChars = ['❄', '✻', '✼', '✥', '✶']; | |||
var flakeCount = 60; // dezent halten | |||
for (var i = 0; i < flakeCount; i++) { | |||
var flake = document.createElement('span'); | |||
flake.className = 'ados-snowflake'; | |||
flake.textContent = flakeChars[Math.floor(Math.random() * flakeChars.length)]; | |||
// Zufällige Start-Parameter | |||
var startX = Math.random() * 100; // vw | |||
var drift = (Math.random() * 40) - 20; // -20 bis +20 vw | |||
var dur = 12 + Math.random() * 10; // 12–22 Sekunden | |||
var delay = Math.random() * 20; // bis zu 20 Sekunden | |||
flake.style.left = startX + 'vw'; | |||
flake.style.setProperty('--x-start', '0vw'); | |||
flake.style.setProperty('--x-end', drift.toFixed(1) + 'vw'); | |||
flake.style.animationDuration = dur.toFixed(1) + 's'; | |||
flake.style.animationDelay = delay.toFixed(1) + 's'; | |||
container.appendChild(flake); | |||
} | |||
} | |||
/* ----------------------------- | |||
4) Init nach DOM-Ready | |||
----------------------------- */ | |||
function onReady(fn) { | |||
if (document.readyState === 'loading') { | |||
document.addEventListener('DOMContentLoaded', fn, { once: true }); | |||
} else { | |||
fn(); | |||
} | |||
} | |||
onReady(function () { | |||
initXmasTimer(); | |||
initSnow(); | |||
}); | |||
})(); | })(); | ||