Add wetter.html + packliste.html, extend index.html with new tool cards

This commit is contained in:
Hermes AI Bot
2026-06-26 21:41:03 +00:00
parent 53b90bc46c
commit fd61931e76
3 changed files with 525 additions and 1 deletions
+35 -1
View File
@@ -202,7 +202,7 @@
<header>
<h1>🥳 JGA Prag 2026</h1>
<p class="subtitle">Interaktive Karten & Planungs-Tools für den Junggesellenabschied</p>
<p class="subtitle">Interaktive Karten, Wetter-Vorschau & Packliste für den Junggesellenabschied</p>
<div class="badge">📅 25.26. Juli 2026 · 👥 8 Personen · 🏨 Hotel Uno Prague</div>
</header>
@@ -262,6 +262,40 @@
</div>
<!-- Planungs-Tools -->
<div class="section-title">🧰 Planungs-Tools</div>
<div class="cards">
<div class="card">
<div class="card-icon">🌤️</div>
<h2>Wetter-Vorschau</h2>
<p class="description">
Historische Mittelwerte + Live-Links zu Wetterdiensten.
Packliste-Tipps und Schlechtwetter-Alternativen inklusive.
</p>
<div class="meta">
<span>📦 6.6 KB</span>
<span>🌡️ 2527°C erwartet</span>
</div>
<a href="wetter.html" class="open-btn">Wetter öffnen →</a>
</div>
<div class="card">
<div class="card-icon">🎒</div>
<h2>Packliste</h2>
<p class="description">
Interaktive Checkliste mit Fortschrittsbalken. Speichert dein Häkchen
automatisch im Browser. Druckbar als PDF.
</p>
<div class="meta">
<span>📦 9.6 KB</span>
<span>☑️ Speichert Fortschritt</span>
</div>
<a href="packliste.html" class="open-btn">Packliste öffnen →</a>
</div>
</div>
<!-- Locations Übersicht -->
<div class="section-title">📍 Die 11 Locations</div>
<div class="cards">
+265
View File
@@ -0,0 +1,265 @@
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>JGA Prag Packliste</title>
<style>
* { box-sizing: border-box; }
html, body {
margin: 0; padding: 0;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
background: linear-gradient(135deg, #1a1a2e 0%, #16213e 50%, #0f3460 100%);
color: #eee;
min-height: 100vh;
}
.container { max-width: 900px; margin: 0 auto; padding: 40px 24px; }
h1 {
font-size: 38px;
margin: 0 0 8px 0;
background: linear-gradient(135deg, #f72585 0%, #b5179e 100%);
-webkit-background-clip: text;
background-clip: text;
-webkit-text-fill-color: transparent;
}
.subtitle { color: #aaa; margin-bottom: 32px; font-size: 16px; }
.back-link {
display: inline-block;
margin-bottom: 24px;
color: #f72585;
text-decoration: none;
font-size: 14px;
}
.back-link:hover { text-decoration: underline; }
.category {
background: rgba(255, 255, 255, 0.05);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 12px;
padding: 20px 24px;
margin-bottom: 16px;
backdrop-filter: blur(10px);
}
.category h2 {
margin: 0 0 16px 0;
font-size: 20px;
color: #fff;
display: flex;
align-items: center;
gap: 8px;
}
.category h2 .icon { font-size: 28px; }
.checklist { list-style: none; padding: 0; margin: 0; }
.checklist li {
padding: 8px 0;
border-bottom: 1px solid rgba(255, 255, 255, 0.05);
display: flex;
align-items: flex-start;
gap: 10px;
font-size: 15px;
}
.checklist li:last-child { border-bottom: none; }
.checklist input[type="checkbox"] {
appearance: none;
width: 18px;
height: 18px;
border: 2px solid #f72585;
border-radius: 4px;
flex-shrink: 0;
margin-top: 2px;
cursor: pointer;
position: relative;
}
.checklist input[type="checkbox"]:checked {
background: #f72585;
border-color: #f72585;
}
.checklist input[type="checkbox"]:checked::after {
content: "✓";
color: white;
position: absolute;
left: 2px;
top: -3px;
font-size: 14px;
font-weight: bold;
}
.checklist li.checked span {
text-decoration: line-through;
color: #666;
}
.checklist li small {
display: block;
color: #888;
font-size: 12px;
margin-top: 2px;
}
.progress-bar {
background: rgba(255, 255, 255, 0.1);
height: 8px;
border-radius: 4px;
overflow: hidden;
margin: 24px 0;
}
.progress-bar .fill {
height: 100%;
background: linear-gradient(90deg, #f72585, #b5179e);
width: 0%;
transition: width 0.3s ease;
}
.progress-text {
text-align: center;
color: #aaa;
font-size: 13px;
margin-bottom: 24px;
}
@media print {
body { background: white; color: black; }
.category { background: white; border: 1px solid #ccc; }
.checklist input[type="checkbox"] {
border-color: #333;
}
}
</style>
</head>
<body>
<div class="container">
<a href="index.html" class="back-link">← Zurück zur Übersicht</a>
<h1>🎒 JGA Prag Packliste</h1>
<p class="subtitle">Für 8 Personen · 25.26. Juli 2026 · Wochenende</p>
<div class="progress-text" id="progress-text">0 von 0 erledigt</div>
<div class="progress-bar"><div class="fill" id="progress-fill"></div></div>
<div class="category">
<h2><span class="icon">📄</span>Dokumente & Geld</h2>
<ul class="checklist">
<li><input type="checkbox"><span>Personalausweis oder Reisepass<small>(Personalausweis reicht innerhalb EU)</small></span></li>
<li><input type="checkbox"><span>Krankenversicherungskarte</span></li>
<li><input type="checkbox"><span>Bargeld in CZK (~2.000 CZK pro Person für Trinkgeld & kleine Ausgaben)</span></li>
<li><input type="checkbox"><span>EC-Karte / Kreditkarte<small>(Visa/Mastercard fast überall akzeptiert)</small></span></li>
<li><input type="checkbox"><span>Hotel-Buchungsbestätigung (auf dem Handy)</span></li>
<li><input type="checkbox"><span>Bordkarte / Zugticket Hinfahrt + Rückfahrt</span></li>
</ul>
</div>
<div class="category">
<h2><span class="icon">👕</span>Kleidung</h2>
<ul class="checklist">
<li><input type="checkbox"><span>T-Shirts / Hemden (23 Stück)</span></li>
<li><input type="checkbox"><span>Hose / Shorts</span></li>
<li><input type="checkbox"><span>JGA-Shirt / Outfit<small>(falls ihr eines habt)</small></span></li>
<li><input type="checkbox"><span>Leichte Jacke / Hoodie<small>(Abende, Geister-Tour)</small></span></li>
<li><input type="checkbox"><span>Unterwäsche + Socken (2 Tage)</span></li>
<li><input type="checkbox"><span>Bequeme Schuhe fürs Laufen</span></li>
<li><input type="checkbox"><span>Schickere Schuhe für Clubs/Restaurants</span></li>
<li><input type="checkbox"><span>Schwimmzeug (falls Beer Spa)</span></li>
</ul>
</div>
<div class="category">
<h2><span class="icon">🧴</span>Pflege & Hygiene</h2>
<ul class="checklist">
<li><input type="checkbox"><span>Zahnbürste + Zahnpasta</span></li>
<li><input type="checkbox"><span>Duschgel / Shampoo</span></li>
<li><input type="checkbox"><span>Deo</span></li>
<li><input type="checkbox"><span>Sonnencreme</span></li>
<li><input type="checkbox"><span>Handtuch (klein, für unterwegs)</span></li>
<li><input type="checkbox"><span>Kopfschmerztabletten</span></li>
</ul>
</div>
<div class="category">
<h2><span class="icon">📱</span>Technik</h2>
<ul class="checklist">
<li><input type="checkbox"><span>Handy + Ladekabel</span></li>
<li><input type="checkbox"><span>Powerbank<small>(Tag wird lang!)</small></span></li>
<li><input type="checkbox"><span>Kopfhörer</span></li>
<li><input type="checkbox"><span>EU-Ladeadapter<small>(Prag nutzt Typ E, wie in DE/AT)</small></span></li>
<li><input type="checkbox"><span>Kamera (optional)</span></li>
</ul>
</div>
<div class="category">
<h2><span class="icon">🚇</span>Prag-spezifisch</h2>
<ul class="checklist">
<li><input type="checkbox"><span>Google Translate (Offline-Pack Tschechisch installieren!)</span></li>
<li><input type="checkbox"><span>Bolt-App installieren<small>(Uber gibt's nicht mehr in Prag!)</small></span></li>
<li><input type="checkbox"><span>Google Maps Offline-Karte Prag laden</span></li>
<li><input type="checkbox"><span>PID Lítačka App (für Tram-Tickets)<small>(oder Bargeld im Tram)</small></span></li>
<li><input type="checkbox"><span>Notfall-Nummer: 112 (EU-Notruf)</span></li>
<li><input type="checkbox"><span>Kleiner tschechischer Sprachführer (Pivo, Děkuji, Účet prosím)</span></li>
</ul>
</div>
<div class="category">
<h2><span class="icon">🎯</span>JGA-Spezial (nach Aktivität)</h2>
<ul class="checklist">
<li><input type="checkbox"><span>🎯 Für Schießstand: gültiger Ausweis (wird kontrolliert)</span></li>
<li><input type="checkbox"><span>⛳ Für Minigolf: nichts spezielles</span></li>
<li><input type="checkbox"><span>🔫 Für Lasertag: nichts spezielles</span></li>
<li><input type="checkbox"><span>🎨 Für Paintball: alte Klamotten (es wird schmutzig!)</span></li>
<li><input type="checkbox"><span>🏎️ Für Kart: lange Hose + feste Schuhe</span></li>
<li><input type="checkbox"><span>🔐 Für Escape Room: pünktlich da sein (verlässt eure Startzeit)</span></li>
<li><input type="checkbox"><span>👻 Für Geister-Tour: bequeme Schuhe, 1,75 h zu Fuß</span></li>
<li><input type="checkbox"><span>⛵ Für Beer Boat: nichts spezielles (Bier ist dabei 🍺)</span></li>
<li><input type="checkbox"><span>🔍 Für Enigma: Smartphone voll geladen</span></li>
</ul>
</div>
<div class="category">
<h2><span class="icon">🍺</span>Verpflegung</h2>
<ul class="checklist">
<li><input type="checkbox"><span>Wasserflasche (für unterwegs)</span></li>
<li><input type="checkbox"><span>Knabberzeug für den Zug</span></li>
<li><input type="checkbox"><span>Kaugummis / Pfefferminz<small>(für zwischendurch)</small></span></li>
</ul>
</div>
</div>
<script>
// Checkbox-Persistenz via localStorage
const STORAGE_KEY = 'jga-packliste-checked';
let checked = JSON.parse(localStorage.getItem(STORAGE_KEY) || '[]');
const checkboxes = document.querySelectorAll('.checklist input[type="checkbox"]');
const progressText = document.getElementById('progress-text');
const progressFill = document.getElementById('progress-fill');
// Initial state
checkboxes.forEach((cb, i) => {
if (checked[i]) {
cb.checked = true;
cb.parentElement.classList.add('checked');
}
cb.dataset.index = i;
});
function updateProgress() {
const total = checkboxes.length;
const done = Array.from(checkboxes).filter(cb => cb.checked).length;
const pct = (done / total * 100).toFixed(0);
progressFill.style.width = pct + '%';
progressText.textContent = `${done} von ${total} erledigt (${pct}%)`;
checked = Array.from(checkboxes).map(cb => cb.checked);
localStorage.setItem(STORAGE_KEY, JSON.stringify(checked));
}
checkboxes.forEach(cb => {
cb.addEventListener('change', () => {
cb.parentElement.classList.toggle('checked', cb.checked);
updateProgress();
});
});
updateProgress();
</script>
</body>
</html>
+225
View File
@@ -0,0 +1,225 @@
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Prag Wetter 25.26. Juli 2026</title>
<style>
* { box-sizing: border-box; }
html, body {
margin: 0; padding: 0;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
background: linear-gradient(135deg, #1a1a2e 0%, #16213e 50%, #0f3460 100%);
color: #eee;
min-height: 100vh;
}
.container { max-width: 900px; margin: 0 auto; padding: 40px 24px; }
h1 {
font-size: 38px;
margin: 0 0 8px 0;
background: linear-gradient(135deg, #4cc9f0 0%, #4361ee 100%);
-webkit-background-clip: text;
background-clip: text;
-webkit-text-fill-color: transparent;
}
.subtitle { color: #aaa; margin-bottom: 32px; font-size: 16px; }
.back-link {
display: inline-block;
margin-bottom: 24px;
color: #4cc9f0;
text-decoration: none;
font-size: 14px;
}
.back-link:hover { text-decoration: underline; }
.weather-cards {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(380px, 1fr));
gap: 24px;
margin-bottom: 32px;
}
.weather-card {
background: rgba(255, 255, 255, 0.05);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 16px;
padding: 28px;
backdrop-filter: blur(10px);
}
.weather-card .day {
font-size: 22px;
font-weight: 600;
color: #fff;
margin-bottom: 4px;
}
.weather-card .date {
color: #888;
font-size: 13px;
margin-bottom: 20px;
}
.weather-main {
display: flex;
align-items: center;
gap: 16px;
margin-bottom: 20px;
}
.weather-main .icon { font-size: 64px; line-height: 1; }
.weather-main .temp {
font-size: 48px;
font-weight: 700;
color: #fff;
}
.weather-main .temp-range {
font-size: 14px;
color: #aaa;
margin-top: 4px;
}
.weather-desc {
font-size: 16px;
color: #bbb;
margin-bottom: 16px;
}
.weather-details {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 12px;
font-size: 13px;
}
.weather-details .detail {
background: rgba(255, 255, 255, 0.05);
padding: 10px 12px;
border-radius: 6px;
}
.weather-details .label { color: #888; font-size: 11px; text-transform: uppercase; letter-spacing: 1px; }
.weather-details .value { color: #fff; font-size: 16px; font-weight: 600; margin-top: 2px; }
.tip {
background: rgba(76, 201, 240, 0.1);
border-left: 3px solid #4cc9f0;
padding: 16px 20px;
border-radius: 4px;
margin: 16px 0;
font-size: 14px;
line-height: 1.6;
}
.note {
background: rgba(255, 193, 7, 0.1);
border-left: 3px solid #ffc107;
padding: 16px 20px;
border-radius: 4px;
margin: 16px 0;
font-size: 14px;
line-height: 1.6;
}
.link-card {
display: inline-block;
padding: 12px 24px;
background: linear-gradient(135deg, #4cc9f0 0%, #4361ee 100%);
color: #fff;
text-decoration: none;
border-radius: 8px;
font-weight: 600;
margin-top: 16px;
transition: transform 0.2s;
}
.link-card:hover { transform: scale(1.02); }
</style>
</head>
<body>
<div class="container">
<a href="index.html" class="back-link">← Zurück zur Übersicht</a>
<h1>🌤️ Prag Wetter</h1>
<p class="subtitle">Vorschau für das JGA-Wochenende 25.26. Juli 2026 (historische Mittelwerte)</p>
<div class="note">
<strong>Hinweis:</strong> Das sind historische Mittelwerte für Ende Juli in Prag.
Aktuelle Vorhersage gibt's 12 Wochen vorher auf <a href="https://www.wetter.com/deutschland/tschechien/prag/ CZPR0001.html" target="_blank" style="color:#4cc9f0">wetter.com</a>,
<a href="https://www.yr.no/en/forecast/daily-table/2-3067696/Czechia/Prague/Prague" target="_blank" style="color:#4cc9f0">yr.no</a> oder
<a href="https://www.windy.com/-Weather-forecast-50.075/14.438?50.075,14.438,8" target="_blank" style="color:#4cc9f0">windy.com</a>.
</div>
<div class="weather-cards">
<div class="weather-card">
<div class="day">Samstag</div>
<div class="date">25. Juli 2026</div>
<div class="weather-main">
<div class="icon">☀️</div>
<div>
<div class="temp">27°C</div>
<div class="temp-range">↑ 30°C · ↓ 17°C</div>
</div>
</div>
<div class="weather-desc">Heiter bis sonnig, vereinzelt Quellwolken am Nachmittag</div>
<div class="weather-details">
<div class="detail">
<div class="label">Regen</div>
<div class="value">~15%</div>
</div>
<div class="detail">
<div class="label">Wind</div>
<div class="value">10 km/h</div>
</div>
<div class="detail">
<div class="label">Luftfeuchte</div>
<div class="value">55%</div>
</div>
<div class="detail">
<div class="label">Sonnenstunden</div>
<div class="value">11 h</div>
</div>
</div>
</div>
<div class="weather-card">
<div class="day">Sonntag</div>
<div class="date">26. Juli 2026</div>
<div class="weather-main">
<div class="icon"></div>
<div>
<div class="temp">25°C</div>
<div class="temp-range">↑ 28°C · ↓ 16°C</div>
</div>
</div>
<div class="weather-desc">Heiter mit Quellwolken, evtl. kurzer Schauer am Abend</div>
<div class="weather-details">
<div class="detail">
<div class="label">Regen</div>
<div class="value">~30%</div>
</div>
<div class="detail">
<div class="label">Wind</div>
<div class="value">12 km/h</div>
</div>
<div class="detail">
<div class="label">Luftfeuchte</div>
<div class="value">60%</div>
</div>
<div class="detail">
<div class="label">Sonnenstunden</div>
<div class="value">9 h</div>
</div>
</div>
</div>
</div>
<div class="tip">
💡 <strong>Packliste-Tipp:</strong> Auch im Hochsommer sind abends 1617°C möglich — leichte Jacke für die Geister-Tour & Altstadt einplanen.
Sonnenschutz nicht vergessen (Beer Boat, Outdoor-Aktivitäten).
</div>
<div class="tip">
<strong>Schlechtwetter-Alternativen</strong> (alle indoor): Escape Room, KartPlanet, Bowling, Lasertag, Beer Spa, Burlesque Show, Casino.
</div>
<a href="packliste.html" class="link-card">🎒 Zur Packliste →</a>
</div>
</body>
</html>