diff --git a/functions/_middleware.js b/functions/_middleware.js index 7627fcf..69df9a1 100644 --- a/functions/_middleware.js +++ b/functions/_middleware.js @@ -75,11 +75,17 @@ const OEFFENTLICHE_SEITEN = new Set([ von der Schranke blockiert (302 statt der Datei) — dadurch schlug u.a. die Service-Worker- Registrierung auf /admin/ mit einem echten Browserfehler fehl, sobald jemand /admin/ ohne gültige Haupt-Gate-Sitzung aufruft (z.B. direkt per Lesezeichen, ohne vorher die Haupt-Seite - besucht/eingeloggt zu haben). */ + besucht/eingeloggt zu haben). + /img/vanvan-portrait.png (04.08.2026 ergänzt): wird als Avatar-Foto direkt AUF der + Zugangscode-Seite selbst gezeigt (siehe gate.html) — ohne Freigabe zeigt das Foto dort nur einen + leeren Kreis, weil selbst dieses eine Bild noch hinter der Schranke lag, die es doch gerade + anzeigen soll. Kein Shop-/Kundendatum, sondern VanVans eigenes öffentliches Porträtfoto (wird + nach dem Öffentlich-Schalten ohnehin überall sichtbar sein, z.B. Startseite). */ function istOeffentlichErreichbar(pfad) { const ohneSlash = pfad.endsWith("/") && pfad.length > 1 ? pfad.slice(0, -1) : pfad; if (OEFFENTLICHE_SEITEN.has(ohneSlash)) return true; if (pfad.startsWith("/_astro/") && pfad.endsWith(".css")) return true; + if (pfad === "/img/vanvan-portrait.png") return true; if (/^\/(logo\.png|favicon\.ico|favicon-\d+x\d+\.png|apple-touch-icon\.png|icon-\d+(-maskable)?\.png|sw\.js|manifest\.webmanifest)$/.test(pfad)) return true; return false; } diff --git a/public/gate.html b/public/gate.html index e72de75..a82b8ee 100644 --- a/public/gate.html +++ b/public/gate.html @@ -16,6 +16,8 @@ --c-accent: #5fd3ec; --c-accent-hover: #3ca9c2; --c-purple-glow: #9b7fd6; + --c-gold: #e3b23c; + --c-gold-hover: #c99527; --radius-l: 22px; --radius-m: 16px; --ease: cubic-bezier(0.22, 1, 0.36, 1); @@ -73,26 +75,82 @@ to { transform: translate(-50%, -50%) rotate(360deg); } } @media (prefers-reduced-motion: reduce) { .gate-logo-bg { animation: none; } } - .gate-box { + + /* 04.08.2026, auf ausdrücklichen Wunsch: statt EINER gemeinsamen Zugangscode-Box (in der beide + einfach irgendeinen der beiden Codes eintippen konnten) jetzt zwei eigene "Fenster" — eins für + qciga, eins für VanVan — im Stil einer anderen, bereits bestehenden Zwei-Personen-Zugangsseite, + aber komplett an Van's eigene Marke angepasst (Farben/Schrift/Wasserzeichen unverändert, siehe + Branding.md: kein Babyblau/Rot-Look von anderen Projekten, sondern die eigene Lila/Anthrazit/ + Hellblau/Gold-Welt). Technisch ändert sich nichts: /gate-auth erkennt die Rolle ohnehin selbst + anhand DES CODES, nicht danach, welches Fenster benutzt wurde — die Aufteilung ist rein dafür + da, dass jede/r sofort das eigene Feld findet, statt raten zu müssen. */ + .gate-wrap { position: relative; - max-width: 430px; + z-index: 1; + max-width: 700px; width: 100%; text-align: center; - padding: 2.4rem 2rem; + } + .gate-header { margin-bottom: 1.6rem; } + .gate-eyebrow { + display: inline-block; + font-size: 0.78rem; + font-weight: 700; + letter-spacing: 0.06em; + text-transform: uppercase; + color: var(--c-gold); + background: color-mix(in srgb, var(--c-gold) 16%, transparent); + border: 1px solid color-mix(in srgb, var(--c-gold) 40%, transparent); + border-radius: 999px; + padding: 0.3rem 0.9rem; + margin-bottom: 1rem; + } + .gate-header h1 { + font-family: "Fraunces", "Playfair Display", Georgia, serif; + font-size: 1.7rem; + font-weight: 600; + margin: 0 0 0.6rem; + line-height: 1.2; + } + .gate-header p { + margin: 0; + color: var(--c-text-muted); + font-size: 0.96rem; + } + + .gate-cards { + display: flex; + flex-wrap: wrap; + justify-content: center; + gap: 1.1rem; + } + .gate-card { + position: relative; + overflow: hidden; + flex: 1 1 250px; + max-width: 300px; + padding: 1.8rem 1.5rem; border-radius: var(--radius-l); border: 1.5px solid transparent; - background: - linear-gradient(165deg, var(--c-anthracite-light), var(--c-anthracite)) padding-box, - linear-gradient(120deg, #9b7fd6, var(--c-accent), #e3b23c, #9b7fd6) border-box; background-size: 100% 100%, 300% 100%; animation: gate-border-shift 9s ease-in-out infinite; box-shadow: 0 20px 50px -20px rgba(0, 0, 0, 0.7); } + .gate-card-qciga { + background: + linear-gradient(165deg, var(--c-anthracite-light), var(--c-anthracite)) padding-box, + linear-gradient(120deg, var(--c-accent), var(--c-accent-hover), var(--c-purple-glow), var(--c-accent)) border-box; + } + .gate-card-vanvan { + background: + linear-gradient(165deg, var(--c-anthracite-light), var(--c-anthracite)) padding-box, + linear-gradient(120deg, var(--c-gold), var(--c-purple-glow), var(--c-accent), var(--c-gold)) border-box; + } @keyframes gate-border-shift { 0%, 100% { background-position: 0 0, 0% 50%; } 50% { background-position: 0 0, 100% 50%; } } - .gate-box::after { + .gate-card::after { content: ""; position: absolute; top: 0; @@ -105,75 +163,105 @@ pointer-events: none; border-radius: inherit; } + .gate-card-vanvan::after { animation-delay: 1.2s; } @keyframes gate-shine { 0% { left: -60%; } 35%, 100% { left: 130%; } } - .gate-box > * { position: relative; z-index: 1; } - @media (prefers-reduced-motion: reduce) { .gate-box, .gate-box::after { animation: none; } } - .gate-eyebrow { - display: inline-block; - font-size: 0.78rem; - font-weight: 700; - letter-spacing: 0.06em; - text-transform: uppercase; - color: #e3b23c; - background: color-mix(in srgb, #e3b23c 16%, transparent); - border: 1px solid color-mix(in srgb, #e3b23c 40%, transparent); - border-radius: 999px; - padding: 0.3rem 0.9rem; - margin-bottom: 1rem; + .gate-card > * { position: relative; z-index: 1; } + @media (prefers-reduced-motion: reduce) { .gate-card, .gate-card::after { animation: none; } } + + /* Avatar je Karte: dasselbe "Glow-Ring"-Prinzip wie beim .portrait-frame-Baustein auf der + restlichen Seite (siehe Branding.md), nur kompakt für ein kleines Zugangs-Fenster. VanVan + bekommt ihr echtes Porträtfoto, für qciga gibt es (noch) kein Foto in diesem Projekt — deshalb + ein passendes Icon in derselben Bildsprache statt eines geratenen/fremden Fotos. */ + .gate-avatar { + position: relative; + width: 84px; + height: 84px; + margin: 0 auto 1rem; } - .gate-box h1 { - font-family: "Fraunces", "Playfair Display", Georgia, serif; - font-size: 1.7rem; - font-weight: 600; - margin: 0 0 0.6rem; - line-height: 1.2; + .gate-avatar-glow { + position: absolute; + inset: -12px; + border-radius: 50%; + filter: blur(13px); + opacity: 0.6; + animation: gate-avatar-pulse 3.2s ease-in-out infinite; } - .gate-box p { - margin: 0 0 1.4rem; - color: var(--c-text-muted); - font-size: 0.96rem; + .gate-card-qciga .gate-avatar-glow { background: radial-gradient(circle, color-mix(in srgb, var(--c-accent) 70%, transparent), transparent 72%); } + .gate-card-vanvan .gate-avatar-glow { background: radial-gradient(circle, color-mix(in srgb, var(--c-gold) 70%, transparent), transparent 72%); } + @keyframes gate-avatar-pulse { + 0%, 100% { opacity: 0.45; transform: scale(1); } + 50% { opacity: 0.85; transform: scale(1.12); } } - .gate-box input { + @media (prefers-reduced-motion: reduce) { .gate-avatar-glow { animation: none; } } + .gate-avatar-photo, + .gate-avatar-icon { + position: relative; + display: flex; + align-items: center; + justify-content: center; width: 100%; - padding: 0.9rem 1rem; + height: 100%; + border-radius: 50%; + background: linear-gradient(160deg, var(--c-anthracite-light), var(--c-anthracite)); + } + .gate-avatar-photo { object-fit: cover; object-position: top center; } + .gate-card-qciga .gate-avatar-photo, + .gate-card-qciga .gate-avatar-icon { box-shadow: 0 0 0 3px color-mix(in srgb, var(--c-accent) 50%, transparent), 0 10px 26px -10px rgba(0, 0, 0, 0.7); } + .gate-card-vanvan .gate-avatar-photo, + .gate-card-vanvan .gate-avatar-icon { box-shadow: 0 0 0 3px color-mix(in srgb, var(--c-gold) 50%, transparent), 0 10px 26px -10px rgba(0, 0, 0, 0.7); } + .gate-avatar-icon { font-size: 2.1rem; } + + .gate-card h2 { + font-family: "Fraunces", "Playfair Display", Georgia, serif; + font-size: 1.2rem; + font-weight: 600; + margin: 0 0 1.1rem; + } + .gate-card-qciga h2 { color: var(--c-accent); } + .gate-card-vanvan h2 { color: var(--c-gold); } + + .gate-card input { + width: 100%; + padding: 0.85rem 0.9rem; border-radius: 12px; text-align: center; letter-spacing: 0.08em; - font-size: 1.05rem; - margin-bottom: 0.9rem; + font-size: 1rem; + margin-bottom: 0.8rem; background: rgba(244, 241, 247, 0.05); border: 1.5px solid rgba(244, 241, 247, 0.16); color: var(--c-text); font-family: inherit; } - .gate-box input:focus { - outline: none; - border-color: var(--c-accent); - box-shadow: 0 0 0 3px color-mix(in srgb, var(--c-accent) 25%, transparent); - } - .gate-box button { + .gate-card-qciga input:focus { outline: none; border-color: var(--c-accent); box-shadow: 0 0 0 3px color-mix(in srgb, var(--c-accent) 25%, transparent); } + .gate-card-vanvan input:focus { outline: none; border-color: var(--c-gold); box-shadow: 0 0 0 3px color-mix(in srgb, var(--c-gold) 25%, transparent); } + + .gate-card button { width: 100%; - padding: 0.85rem 1rem; + padding: 0.8rem 1rem; border-radius: 12px; border: none; - background: linear-gradient(120deg, var(--c-accent), var(--c-accent-hover)); - color: var(--c-black); font-weight: 800; - font-size: 1rem; + font-size: 0.96rem; cursor: pointer; transition: transform 0.2s var(--ease), box-shadow 0.2s var(--ease); } - .gate-box button:hover { transform: translateY(-2px); box-shadow: 0 10px 24px -10px color-mix(in srgb, var(--c-accent) 60%, transparent); } + .gate-card-qciga button { background: linear-gradient(120deg, var(--c-accent), var(--c-accent-hover)); color: var(--c-black); } + .gate-card-qciga button:hover { transform: translateY(-2px); box-shadow: 0 10px 24px -10px color-mix(in srgb, var(--c-accent) 60%, transparent); } + .gate-card-vanvan button { background: linear-gradient(120deg, var(--c-gold), var(--c-gold-hover)); color: var(--c-black); } + .gate-card-vanvan button:hover { transform: translateY(-2px); box-shadow: 0 10px 24px -10px color-mix(in srgb, var(--c-gold) 60%, transparent); } + .gate-fehler { color: #ff9a9a; - font-size: 0.88rem; - margin: 0.9rem 0 0; + font-size: 0.85rem; + margin: 0.8rem 0 0; display: none; } .gate-fehler.zeige { display: block; } + .gate-logo { font-family: "Fraunces", "Playfair Display", Georgia, serif; font-weight: 700; @@ -181,50 +269,86 @@ color: var(--c-text-muted); margin: 1.6rem 0 0; } + + @media (max-width: 560px) { + .gate-card { max-width: 100%; flex-basis: 100%; } + }
-Diese Seite ist gerade im Aufbau und noch nicht für die Öffentlichkeit freigegeben.
Zugangscode eingeben, um weiterzukommen.
Diese Seite ist gerade im Aufbau und noch nicht für die Öffentlichkeit freigegeben.
Zugangscode eingeben, um weiterzukommen.
🧶 Handgemacht mit Liebe