jagd-apps/portal/index.html

280 lines
7.6 KiB
HTML
Raw Permalink 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="de">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="theme-color" content="#2d6a2d" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="default" />
<meta name="apple-mobile-web-app-title" content="Jagd Apps" />
<meta name="mobile-web-app-capable" content="yes" />
<link rel="manifest" href="/manifest.json" />
<meta name="description" content="Jagd Apps Heidekreis Nachsuche, Drohnenführer, Stöberhunde" />
<title>Jagd Apps Heidekreis</title>
<style>
*, *::before, *::after { box-sizing: border-box; }
:root {
--green: #1a3d1a;
--green-mid: #2d5a2d;
--green-accent: #3a7a3a;
--text: #1a1a1a;
--muted: #666;
--bg: #e8e8e2;
--card-bg: #f4f4ee;
--border: #bbbba8;
--shadow: 0 1px 3px rgba(0,0,0,0.15);
--radius: 2px;
}
html, body {
margin: 0;
padding: 0;
background: var(--bg);
color: var(--text);
font-family: Georgia, 'Times New Roman', serif;
min-height: 100vh;
}
header {
background: var(--green);
color: #e8e8d8;
padding: 1.5rem 1.5rem 1.2rem;
border-bottom: 3px solid var(--green-accent);
}
header h1 {
margin: 0;
font-size: 1.25rem;
font-weight: normal;
letter-spacing: 0.06em;
text-transform: uppercase;
}
header p {
margin: 0.4rem 0 0;
font-size: 0.78rem;
opacity: 0.7;
letter-spacing: 0.04em;
text-transform: uppercase;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
}
main {
max-width: 520px;
margin: 0 auto;
padding: 2rem 1rem 3rem;
display: flex;
flex-direction: column;
gap: 0;
border-left: 1px solid var(--border);
border-right: 1px solid var(--border);
background: var(--card-bg);
}
.app-card {
background: var(--card-bg);
border-bottom: 1px solid var(--border);
border-left: 4px solid var(--green-mid);
border-radius: var(--radius);
box-shadow: var(--shadow);
display: flex;
align-items: center;
gap: 1rem;
padding: 1.1rem 1.25rem;
text-decoration: none;
color: var(--text);
transition: background 0.1s, border-left-color 0.1s;
-webkit-tap-highlight-color: transparent;
}
.app-card:first-child {
border-top: 1px solid var(--border);
}
.app-card:active {
background: #eaeae2;
}
@media (hover: hover) {
.app-card:hover {
background: #ececdf;
border-left-color: var(--green-accent);
}
}
.app-icon {
display: none;
}
.app-info {
flex: 1;
}
.app-name {
font-size: 1rem;
font-weight: bold;
margin: 0 0 0.15rem;
letter-spacing: 0.01em;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
}
.app-desc {
font-size: 0.8rem;
color: var(--muted);
margin: 0;
line-height: 1.4;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
}
.app-arrow {
color: var(--green-mid);
font-size: 1.1rem;
flex-shrink: 0;
}
footer {
max-width: 520px;
margin: 0 auto;
text-align: center;
padding: 1.2rem 1rem;
font-size: 0.72rem;
color: var(--muted);
letter-spacing: 0.04em;
text-transform: uppercase;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
border-left: 1px solid var(--border);
border-right: 1px solid var(--border);
}
/* Install banner */
#install-banner {
display: none;
position: sticky;
top: 0;
z-index: 100;
background: var(--green);
color: #fff;
padding: 0.6rem 1rem;
font-size: 0.88rem;
align-items: center;
gap: 0.75rem;
flex-wrap: wrap;
}
#install-banner.visible { display: flex; }
#install-banner span { flex: 1; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; }
#install-btn {
background: #fff;
color: var(--green);
border: none;
border-radius: 4px;
padding: 0.3rem 0.8rem;
font-weight: 600;
font-size: 0.85rem;
cursor: pointer;
white-space: nowrap;
}
#dismiss-btn {
background: transparent;
border: none;
color: rgba(255,255,255,0.8);
font-size: 1rem;
cursor: pointer;
padding: 0.2rem 0.3rem;
flex-shrink: 0;
}
</style>
</head>
<body>
<div id="install-banner" role="banner">
<span id="install-text">App auf dem Homescreen installieren</span>
<button id="install-btn">Installieren</button>
<button id="dismiss-btn" aria-label="Schließen"></button>
</div>
<header>
<h1>Jagd Apps Heidekreis</h1>
<p>Jägerschaft Fallingbostel e.V.</p>
</header>
<main>
<a href="/nachsuche/" class="app-card">
<div class="app-info">
<p class="app-name">Nachsuche</p>
<p class="app-desc">Nachsuchenstation Heidekreis &ndash; Verfügbare Nachsuchenführer und Kontaktdaten</p>
</div>
<span class="app-arrow">&rsaquo;</span>
</a>
<a href="/drohnenfuehrer/" class="app-card">
<div class="app-info">
<p class="app-name">Drohnenführer</p>
<p class="app-desc">Drohnenführer Heidekreis &ndash; Zertifizierte Drohnenführer für den jagdlichen Einsatz</p>
</div>
<span class="app-arrow">&rsaquo;</span>
</a>
<a href="/stoeberhunde/" class="app-card">
<div class="app-info">
<p class="app-name">Stöberhunde</p>
<p class="app-desc">Stöberhunde Heidekreis &ndash; Stöberhundleiter und Verfügbarkeit für die Drückjagd</p>
</div>
<span class="app-arrow">&rsaquo;</span>
</a>
</main>
<footer>Jägerschaft Fallingbostel e.V.</footer>
<script>
// Register service worker
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/sw.js').catch(() => {});
}
// PWA install banner
const banner = document.getElementById('install-banner');
const installBtn = document.getElementById('install-btn');
const dismissBtn = document.getElementById('dismiss-btn');
const installText = document.getElementById('install-text');
const DISMISSED_KEY = 'portal-pwa-dismissed';
let deferredPrompt = null;
const isInStandalone = () =>
window.matchMedia('(display-mode: standalone)').matches ||
window.navigator.standalone === true;
const isIOS = () =>
/iphone|ipad|ipod/i.test(navigator.userAgent) && !window.MSStream;
if (!isInStandalone() && !localStorage.getItem(DISMISSED_KEY)) {
if (isIOS()) {
installText.textContent = 'Zum Homescreen hinzufügen: Teilen → „Zum Home-Bildschirm"';
installBtn.style.display = 'none';
banner.classList.add('visible');
} else {
window.addEventListener('beforeinstallprompt', (e) => {
e.preventDefault();
deferredPrompt = e;
banner.classList.add('visible');
});
}
}
installBtn.addEventListener('click', async () => {
if (!deferredPrompt) return;
deferredPrompt.prompt();
const { outcome } = await deferredPrompt.userChoice;
if (outcome === 'accepted') banner.classList.remove('visible');
deferredPrompt = null;
});
dismissBtn.addEventListener('click', () => {
localStorage.setItem(DISMISSED_KEY, '1');
banner.classList.remove('visible');
});
</script>
</body>
</html>