Files
hcrb/public/css/style.css
T
guyg1474andClaude Opus 5.5 486e6f6784 Spiel-Events, Kalenderdateien, Patches-Seite und neues Design
- Kalender: Termine als Spiel-Event markieren (nur diese zählen in der
  Statistik), optionale Uhrzeiten, Termine bearbeiten
- .ics-Download für einzelne und alle kommenden Termine
- Neue Seite Patches: Upload (PNG, JPEG, WebP, geprüftes SVG),
  Status "Gibt es schon" / "In Planung", Bilder in data/patches/
- Volle Seitenbreite mit Spaltenlayouts, neues Design mit selbst
  gehosteten Schriften, Startseite mit Zoom und drehendem Zahnrad
- Bestehende Daten werden beim Laden ergänzt, keine Migration nötig

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 00:13:52 +02:00

971 lines
35 KiB
CSS
Raw 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.
/* HCRB – Farben aus der Gruppenflagge: Marineblau #354173, Gold #e4b84a, Stahlgrau #cacaca
Layout: volle Breite mit flüssigem Seitenrand, mehrspaltig ab Tablet, abgeschrägte "taktische" Ecken statt Rundungen. */
@font-face { font-family: "Saira Stencil One"; src: url("/fonts/saira-stencil-one-latin-400-normal.woff2") format("woff2"); font-weight: 400; font-display: swap; }
@font-face { font-family: "Barlow"; src: url("/fonts/barlow-latin-400-normal.woff2") format("woff2"); font-weight: 400; font-display: swap; }
@font-face { font-family: "Barlow"; src: url("/fonts/barlow-latin-500-normal.woff2") format("woff2"); font-weight: 500; font-display: swap; }
@font-face { font-family: "Barlow"; src: url("/fonts/barlow-latin-600-normal.woff2") format("woff2"); font-weight: 600; font-display: swap; }
@font-face { font-family: "Barlow Condensed"; src: url("/fonts/barlow-condensed-latin-500-normal.woff2") format("woff2"); font-weight: 500; font-display: swap; }
@font-face { font-family: "Barlow Condensed"; src: url("/fonts/barlow-condensed-latin-700-normal.woff2") format("woff2"); font-weight: 700; font-display: swap; }
:root {
color-scheme: dark;
--flag: #354173;
--bg: #121730;
--bg-deep: #0d1126;
--card: #1a2142;
--card-2: #232b52;
--text: #eceef6;
--muted: #9ba2c3;
--border: #323c6c;
--accent: #e4b84a;
--accent-text: #121730;
--accent-soft: rgba(228, 184, 74, .13);
--steel: #cacaca;
--steel-soft: rgba(202, 202, 202, .1);
--warn: #ec7f6a;
--chip: #2c3563;
--grid-line: rgba(160, 172, 230, .045);
--radius: 0;
--cut: 14px;
--gutter: clamp(16px, 3.2vw, 56px);
--font-stencil: "Saira Stencil One", "Bahnschrift", "Arial Narrow", system-ui, sans-serif;
--font-head: "Barlow Condensed", "Bahnschrift", "Roboto Condensed", "Arial Narrow", system-ui, sans-serif;
--font-body: "Barlow", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
--ease-out: cubic-bezier(.16, 1, .3, 1);
}
* { box-sizing: border-box; }
[hidden] { display: none !important; }
html { scroll-padding-top: 80px; }
body {
margin: 0;
font-family: var(--font-body);
font-size: 1rem;
background-color: var(--bg);
/* feines Kartenraster wie auf einer Lagekarte */
background-image:
linear-gradient(var(--grid-line) 1px, transparent 1px),
linear-gradient(90deg, var(--grid-line) 1px, transparent 1px);
background-size: 56px 56px;
color: var(--text);
line-height: 1.5;
min-height: 100vh;
display: flex;
flex-direction: column;
}
a { color: var(--accent); text-underline-offset: 3px; }
:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
h1, h2, h3, .brand, .site-header nav a, .site-header nav button, button, .button, .badge, .cal-grid .dow, .eyebrow {
font-family: var(--font-head);
}
h1, h2, h3 { text-transform: uppercase; letter-spacing: .06em; text-wrap: balance; line-height: 1.1; }
/* ---------- Kopfzeile ---------- */
.site-header {
background: rgba(13, 17, 38, .86);
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
border-bottom: 1px solid var(--border);
padding: 10px var(--gutter);
position: sticky;
top: 0;
z-index: 20;
transition: background-color .3s, border-color .3s;
}
.site-header::after {
/* goldene Linie, die links beginnt und ausläuft */
content: "";
position: absolute;
left: 0; right: 0; bottom: -1px;
height: 2px;
background: linear-gradient(90deg, var(--accent) 0, var(--accent) 120px, transparent 60%);
}
/* Startseite: Kopfzeile liegt über der Flagge und wird beim Scrollen fest */
.site-header.overlay { position: fixed; left: 0; right: 0; background: transparent; border-color: transparent; backdrop-filter: none; -webkit-backdrop-filter: none; }
.site-header.overlay::after { opacity: 0; transition: opacity .3s; }
.site-header.overlay.scrolled { background: rgba(13, 17, 38, .9); border-color: var(--border); backdrop-filter: blur(10px); -webkit-backdrop-filter: blur(10px); }
.site-header.overlay.scrolled::after { opacity: 1; }
.site-header .inner {
display: flex;
align-items: center;
gap: 16px;
flex-wrap: wrap;
}
.brand {
display: inline-flex;
align-items: center;
font-family: var(--font-stencil);
font-size: 1.45rem;
letter-spacing: .12em;
color: var(--accent);
text-decoration: none;
}
.brand img { width: 40px; height: 40px; margin-right: 12px; flex: none; transition: transform .6s var(--ease-out); }
.brand:hover img { transform: rotate(30deg); }
.brand small {
font-family: var(--font-head);
font-size: .78rem;
font-weight: 500;
color: var(--steel);
letter-spacing: .2em;
text-transform: uppercase;
margin-left: 12px;
padding-left: 12px;
border-left: 1px solid var(--border);
}
.site-header nav { display: flex; gap: 4px; flex-wrap: wrap; margin-left: auto; }
.site-header nav a, .site-header nav button {
position: relative;
text-decoration: none;
color: var(--steel);
padding: 8px 12px;
text-transform: uppercase;
letter-spacing: .14em;
font-size: .92rem;
font-weight: 500;
background: none;
border: none;
border-radius: 0;
}
.site-header nav a::after, .site-header nav button::after {
content: "";
position: absolute;
left: 12px; right: 12px; bottom: 2px;
height: 2px;
background: var(--accent);
transform: scaleX(0);
transform-origin: left;
transition: transform .3s var(--ease-out);
}
.site-header nav a:hover, .site-header nav button:hover { color: var(--text); }
.site-header nav a:hover::after, .site-header nav button:hover::after { transform: scaleX(.4); }
.site-header nav a.active { color: var(--accent); }
.site-header nav a.active::after { transform: scaleX(1); }
main { width: 100%; padding: 28px var(--gutter) 48px; flex: 1 0 auto; }
main.login { max-width: 460px; margin: 0 auto; padding-top: 8vh; }
/* ---------- Seitenkopf ---------- */
.page-head {
display: flex;
align-items: flex-end;
justify-content: space-between;
gap: 16px 24px;
flex-wrap: wrap;
margin-bottom: 24px;
padding-bottom: 18px;
border-bottom: 1px solid var(--border);
}
.page-head h1 {
margin: 0;
font-size: clamp(2.2rem, 5vw, 3.6rem);
font-weight: 700;
letter-spacing: .04em;
}
.page-head p { margin: 6px 0 0; color: var(--muted); max-width: 62ch; }
.page-head .actions { display: flex; gap: 8px; flex-wrap: wrap; align-items: center; }
.page-head .actions select { width: auto; margin: 0; }
.eyebrow {
display: block;
font-size: .82rem;
font-weight: 500;
text-transform: uppercase;
letter-spacing: .28em;
color: var(--accent);
margin-bottom: 6px;
}
/* ---------- Spalten ---------- */
.split { display: grid; gap: 20px; align-items: start; }
.split > .col { display: grid; gap: 20px; min-width: 0; }
.split > .col > .card { margin: 0; }
@media (min-width: 1000px) {
.split { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); }
.split.wide-left { grid-template-columns: minmax(0, 1.65fr) minmax(340px, 1fr); }
.split.wide-right { grid-template-columns: minmax(340px, 1fr) minmax(0, 1.4fr); }
}
.span-all { grid-column: 1 / -1; }
/* ---------- Bausteine ---------- */
.card {
position: relative;
background: var(--card);
padding: 20px;
margin-bottom: 20px;
clip-path: polygon(0 0, calc(100% - var(--cut)) 0, 100% var(--cut), 100% 100%, var(--cut) 100%, 0 calc(100% - var(--cut)));
box-shadow: inset 0 0 0 1px var(--border);
}
.card::before {
/* Eckwinkel oben links */
content: "";
position: absolute;
top: 0; left: 0;
width: 18px; height: 18px;
border-top: 2px solid var(--accent);
border-left: 2px solid var(--accent);
pointer-events: none;
}
.card h2 {
font-size: 1.15rem;
font-weight: 700;
margin: 0 0 16px;
letter-spacing: .1em;
}
.card h3 { font-size: 1rem; font-weight: 700; letter-spacing: .08em; margin: 18px 0 10px; }
.card-head { display: flex; align-items: center; justify-content: space-between; gap: 8px; margin-bottom: 16px; flex-wrap: wrap; }
.card-head h2 { margin: 0; }
.card-head select { width: auto; margin-top: 0; }
label { display: block; margin-bottom: 12px; font-size: .94rem; color: var(--muted); }
label.inline { display: inline-flex; align-items: center; flex-wrap: wrap; gap: 4px 8px; color: var(--text); }
input[type=checkbox] { accent-color: var(--accent); width: 17px; height: 17px; }
input[type=text], input[type=password], input[type=number], input[type=date], input[type=time], select, textarea {
display: block;
width: 100%;
margin-top: 5px;
padding: 9px 11px;
font: inherit;
color: var(--text);
background: var(--bg-deep);
border: 1px solid var(--border);
border-radius: var(--radius);
transition: border-color .15s;
}
input:hover, select:hover, textarea:hover { border-color: #4a568e; }
input:focus, select:focus, textarea:focus { outline: 1px solid var(--accent); border-color: var(--accent); }
textarea { resize: vertical; min-height: 70px; }
.row input[type=text], .row input[type=number], .row select { width: auto; flex: 1 1 120px; margin-top: 0; }
.row input[type=number] { flex: 0 0 80px; }
/* Schalter mit Erklärung, z. B. "Spiel-Event" */
.toggle-field {
display: flex;
gap: 12px;
align-items: flex-start;
padding: 12px 14px;
margin-bottom: 12px;
background: var(--accent-soft);
border-left: 3px solid var(--accent);
color: var(--text);
cursor: pointer;
}
.toggle-field input { margin-top: 3px; flex: none; }
.toggle-field strong { display: block; font-family: var(--font-head); text-transform: uppercase; letter-spacing: .1em; }
.toggle-field span { color: var(--muted); font-size: .9rem; }
.toggle-field:has(input:not(:checked)) { background: var(--steel-soft); border-left-color: var(--steel); }
button, .button {
font-size: .92rem;
font-weight: 500;
text-transform: uppercase;
letter-spacing: .1em;
padding: 8px 16px;
border-radius: var(--radius);
border: 1px solid var(--border);
background: var(--card-2);
color: var(--text);
cursor: pointer;
display: inline-flex;
align-items: center;
justify-content: center;
gap: 8px;
margin: 0;
text-decoration: none;
transition: border-color .15s, background-color .15s, color .15s, transform .15s;
}
button:hover, .button:hover { border-color: var(--steel); }
button:active, .button:active { transform: translateY(1px); }
button:disabled { opacity: .45; cursor: default; }
button.primary, .button.primary {
background: var(--accent);
color: var(--accent-text);
border-color: var(--accent);
font-weight: 700;
clip-path: polygon(0 0, calc(100% - 9px) 0, 100% 9px, 100% 100%, 9px 100%, 0 calc(100% - 9px));
}
button.primary:hover, .button.primary:hover { background: #f0c75c; border-color: #f0c75c; }
button.danger { color: var(--warn); }
button.link { background: none; border: none; padding: 4px 6px; color: var(--muted); }
button.link:hover { color: var(--text); }
button.link.danger { color: var(--warn); opacity: .8; }
button.link.danger:hover { opacity: 1; }
button.small, .button.small { padding: 5px 11px; font-size: .82rem; }
.button svg, button svg { width: 16px; height: 16px; flex: none; }
.row { display: flex; gap: 8px; align-items: center; margin: 10px 0; }
.row.wrap { flex-wrap: wrap; }
.row.end { justify-content: flex-end; }
.grid2 { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
@media (max-width: 560px) { .grid2:not(.keep) { grid-template-columns: 1fr; } }
.muted { color: var(--muted); font-size: .94rem; }
.list { list-style: none; padding: 0; margin: 0; }
.list li {
display: flex;
align-items: center;
gap: 10px;
padding: 10px 0;
border-bottom: 1px solid var(--border);
flex-wrap: wrap;
}
.list li:last-child { border-bottom: none; }
/* Name behält Platz; reicht die Breite nicht, rutschen die Aktionen in die nächste Zeile */
.list .name { flex: 1 1 10rem; min-width: 0; }
/* Aktionen rücken nach rechts und brechen bei Platzmangel gemeinsam in die nächste Zeile um */
.list .actions { margin-left: auto; display: flex; align-items: center; gap: 6px; flex-wrap: wrap; justify-content: flex-end; }
.list li > .link:last-child { margin-left: auto; }
.list .meta { color: var(--muted); font-size: .9rem; }
.list label { margin: 0; }
.badge {
font-size: .78rem;
font-weight: 500;
text-transform: uppercase;
letter-spacing: .1em;
padding: 1px 8px;
border: 1px solid var(--border);
color: var(--steel);
white-space: nowrap;
}
.badge.game { color: var(--accent); border-color: var(--accent); background: var(--accent-soft); }
.badge.nogame { color: var(--steel); border-color: #5b6488; background: var(--steel-soft); }
.chips { display: flex; flex-wrap: wrap; gap: 6px; }
.chip { font-size: .9rem; padding: 3px 10px; background: var(--chip); }
.chip.me { background: var(--accent); color: var(--accent-text); font-weight: 600; }
.notice {
border-left: 4px solid var(--accent);
background: var(--accent-soft);
padding: 12px 14px;
margin-bottom: 20px;
}
.warn {
color: var(--warn);
border-left: 4px solid var(--warn);
background: rgba(236, 127, 106, .08);
padding: 10px 12px;
margin-top: 12px;
}
/* ---------- Startseite: Hero mit Zoom beim Scrollen ---------- */
.hero { position: relative; height: 175vh; background: var(--flag); }
.hero-stage {
position: sticky;
top: 0;
height: 100vh;
height: 100svh;
overflow: hidden;
display: grid;
place-items: center;
--p: 0; /* Scrollfortschritt 0 … 1, setzt home.js */
}
.hero-flag {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
object-fit: contain;
object-position: center;
/* Zahnrad sitzt bei 41 % Höhe, oberhalb des Titels; beim Scrollen geht es bis auf den Bären heran */
transform: translateY(-9%) scale(calc(.72 + var(--p) * 2));
transform-origin: 50% 50%;
will-change: transform;
}
/* Zahnrad: gleiche Lage und gleicher Zoom wie die Flagge, zusätzlich Drehung um die eigene Mitte */
.hero-gear { transform: translateY(-9%) scale(calc(.72 + var(--p) * 2)) rotate(calc(var(--p) * 150deg)); }
/* Vignette: Flaggenblau läuft an den Rändern in den Seitenhintergrund aus */
.hero-stage::after {
content: "";
position: absolute;
inset: 0;
background:
radial-gradient(ellipse 75% 70% at 50% 41%, transparent 55%, rgba(13, 17, 38, .55) 100%),
linear-gradient(to bottom, transparent 70%, var(--bg) 100%);
pointer-events: none;
}
.hero-shade {
/* dunkelt beim Heranzoomen ab, damit der Übergang zum Inhalt weich ist */
position: absolute;
inset: 0;
background: var(--bg);
opacity: calc(var(--p) * var(--p) * .85);
z-index: 2;
pointer-events: none;
}
.hud {
position: absolute;
inset: 84px var(--gutter) 32px;
pointer-events: none;
z-index: 3;
font-family: var(--font-head);
text-transform: uppercase;
letter-spacing: .22em;
font-size: .8rem;
color: var(--steel);
font-variant-numeric: tabular-nums;
}
.hud span { position: absolute; }
.hud .tl { top: 0; left: 0; }
.hud .tr { top: 0; right: 0; text-align: right; }
.hud .corner { width: 26px; height: 26px; border-color: var(--accent); border-style: solid; border-width: 0; }
.hud .corner.c1 { top: 22px; left: 0; border-top-width: 2px; border-left-width: 2px; }
.hud .corner.c2 { top: 22px; right: 0; border-top-width: 2px; border-right-width: 2px; }
.hud .corner.c3 { bottom: 0; left: 0; border-bottom-width: 2px; border-left-width: 2px; }
.hud .corner.c4 { bottom: 0; right: 0; border-bottom-width: 2px; border-right-width: 2px; }
.hero-title {
position: absolute;
left: var(--gutter);
right: var(--gutter);
bottom: 6vh;
z-index: 4;
text-align: center;
transform: translateY(calc(var(--p) * -14vh));
opacity: calc(1 - var(--p) * 1.7);
}
.hero-title h1 {
font-family: var(--font-stencil);
font-weight: 400;
font-size: clamp(3.4rem, 12vw, 7.5rem);
line-height: .9;
margin: 0;
letter-spacing: .14em;
margin-right: -.14em; /* gleicht letter-spacing am Ende aus */
color: var(--accent);
text-shadow: 0 6px 30px rgba(10, 13, 30, .55);
}
.hero-title .subtitle {
display: inline-flex;
gap: 14px;
align-items: center;
font-family: var(--font-head);
font-weight: 500;
text-transform: uppercase;
letter-spacing: .4em;
color: var(--text);
font-size: clamp(.85rem, 2.2vw, 1.25rem);
margin-top: 12px;
padding: 6px 4px 6px 18px;
background: rgba(13, 17, 38, .55);
}
/* Hochformat: Flagge größer, damit das Zahnrad die Breite füllt */
@media (max-aspect-ratio: 1/1) {
.hero-flag { transform: translateY(-8%) scale(calc(1.25 + var(--p) * 2.6)); }
.hero-gear { transform: translateY(-8%) scale(calc(1.25 + var(--p) * 2.6)) rotate(calc(var(--p) * 150deg)); }
}
/* Einstiegsanimation der Titelzeile */
@keyframes rise { from { transform: translateY(40px); opacity: 0; } to { transform: none; opacity: 1; } }
@keyframes wipe { from { clip-path: inset(0 100% 0 0); } to { clip-path: inset(0 0 0 0); } }
.hero-title h1 { animation: rise 1s var(--ease-out) both; }
.hero-title .subtitle { animation: wipe .9s .35s var(--ease-out) both; }
/* Inhalt der Startseite schiebt sich über das Ende des Heros */
.home main { position: relative; z-index: 5; margin-top: -30vh; padding-top: 32px; }
/* Nächster Einsatz */
.next-op {
display: grid;
gap: 24px;
align-items: end;
margin-bottom: 48px;
}
@media (min-width: 900px) { .next-op { grid-template-columns: minmax(0, 1.4fr) minmax(0, 1fr); } }
.next-op h2 {
margin: 0;
font-size: clamp(2.2rem, 6vw, 4.8rem);
font-weight: 700;
letter-spacing: .02em;
}
.next-op .when { font-family: var(--font-head); font-size: clamp(1.1rem, 2.4vw, 1.5rem); text-transform: uppercase; letter-spacing: .14em; color: var(--steel); margin-top: 10px; }
.countdown {
display: flex;
align-items: baseline;
gap: 14px;
justify-content: flex-start;
padding: 18px 22px;
background: var(--card);
box-shadow: inset 0 0 0 1px var(--border);
border-left: 4px solid var(--accent);
}
.countdown .big {
font-family: var(--font-head);
font-weight: 700;
font-size: clamp(3rem, 8vw, 5.5rem);
line-height: .9;
color: var(--accent);
font-variant-numeric: tabular-nums;
}
.countdown .unit { font-family: var(--font-head); text-transform: uppercase; letter-spacing: .14em; font-size: 1.05rem; }
.countdown .unit small { display: block; color: var(--muted); font-family: var(--font-body); text-transform: none; letter-spacing: 0; font-size: .92rem; }
/* Bereiche: eine große Kachel, drei kleine */
.areas {
display: grid;
gap: 16px;
margin-bottom: 48px;
grid-template-columns: 1fr;
}
@media (min-width: 700px) { .areas { grid-template-columns: 1fr 1fr; } }
@media (min-width: 1150px) {
.areas { grid-template-columns: 1.5fr 1fr 1fr; grid-template-rows: auto auto; }
.areas .tile.big { grid-row: span 2; }
}
.tile {
position: relative;
display: flex;
flex-direction: column;
gap: 10px;
text-decoration: none;
color: var(--text);
background: var(--card);
box-shadow: inset 0 0 0 1px var(--border);
padding: 22px 24px;
overflow: hidden;
clip-path: polygon(0 0, calc(100% - 22px) 0, 100% 22px, 100% 100%, 0 100%);
transition: background-color .2s;
}
.tile::after {
content: "";
position: absolute;
left: 0; bottom: 0;
height: 3px; width: 100%;
background: var(--accent);
transform: scaleX(.12);
transform-origin: left;
transition: transform .45s var(--ease-out);
}
.tile:hover { background: var(--card-2); }
.tile:hover::after { transform: scaleX(1); }
.tile svg { width: 34px; height: 34px; color: var(--accent); transition: transform .45s var(--ease-out); }
.tile:hover svg { transform: translateX(4px); }
.tile h2 { margin: 0; font-size: 1.5rem; font-weight: 700; letter-spacing: .08em; }
.tile p { margin: 0; color: var(--muted); }
.tile .go { margin-top: auto; font-family: var(--font-head); text-transform: uppercase; letter-spacing: .16em; font-size: .85rem; color: var(--accent); }
.tile.big { justify-content: flex-end; min-height: 280px; background: linear-gradient(160deg, var(--flag) 0%, var(--card) 70%); }
.tile.big svg { width: 54px; height: 54px; }
.tile.big h2 { font-size: clamp(2rem, 4vw, 3rem); }
.tile.big .bg-gear {
position: absolute;
right: -60px; top: -60px;
width: 300px; height: 300px;
opacity: .1;
transition: transform 1.2s var(--ease-out);
}
.tile.big:hover .bg-gear { transform: rotate(45deg); }
.tile .lock { position: absolute; top: 18px; right: 30px; color: var(--muted); font-family: var(--font-head); text-transform: uppercase; letter-spacing: .14em; font-size: .75rem; }
/* Handy: kleine Schaltflächen, zwei pro Reihe, Kalender über die volle Breite */
@media (max-width: 699px) {
.areas { grid-template-columns: 1fr 1fr; gap: 10px; margin-bottom: 36px; }
.areas .tile.big { grid-column: span 2; }
.tile, .tile.big {
flex-direction: row;
align-items: center;
justify-content: flex-start;
gap: 10px;
min-height: 0;
padding: 14px;
clip-path: polygon(0 0, calc(100% - 12px) 0, 100% 12px, 100% 100%, 0 100%);
}
.tile p, .tile .go, .tile.big .bg-gear { display: none; }
.tile svg, .tile.big svg { width: 22px; height: 22px; flex: none; }
.tile h2, .tile.big h2 { font-size: 1.05rem; letter-spacing: .06em; }
/* Patch-Vorschau nur ab Tablet */
#patch-section { display: none !important; }
}
.section-title {
display: flex;
align-items: baseline;
justify-content: space-between;
gap: 12px;
flex-wrap: wrap;
margin: 0 0 16px;
}
.section-title h2 { margin: 0; font-size: clamp(1.6rem, 3.4vw, 2.4rem); font-weight: 700; }
/* Patch-Leiste auf der Startseite: waagerecht wischen */
.patch-rail {
display: grid;
grid-auto-flow: column;
grid-auto-columns: minmax(180px, 220px);
gap: 16px;
overflow-x: auto;
scroll-snap-type: x mandatory;
padding-bottom: 12px;
margin-bottom: 48px;
scrollbar-color: var(--border) transparent;
}
.patch-rail a { scroll-snap-align: start; text-decoration: none; color: var(--text); }
.patch-rail figure { margin: 0; }
.patch-rail .patch-img { aspect-ratio: 1; }
.patch-rail figcaption { margin-top: 8px; font-family: var(--font-head); text-transform: uppercase; letter-spacing: .1em; font-weight: 700; }
.home-grid { display: grid; gap: 20px; margin-bottom: 48px; align-items: start; }
@media (min-width: 1000px) { .home-grid { grid-template-columns: minmax(0, 1.3fr) minmax(0, 1fr); } }
.home-grid .card { margin: 0; }
.about {
display: grid;
gap: 32px;
align-items: center;
padding: clamp(24px, 4vw, 56px);
background: linear-gradient(120deg, var(--card) 0%, var(--bg-deep) 100%);
box-shadow: inset 0 0 0 1px var(--border);
margin-bottom: 8px;
}
@media (min-width: 900px) { .about { grid-template-columns: auto minmax(0, 1fr); } }
.about img { width: clamp(120px, 16vw, 200px); height: auto; image-rendering: auto; }
.about h2 { margin: 0 0 10px; font-size: clamp(1.6rem, 3.4vw, 2.4rem); font-weight: 700; }
.about p { max-width: 65ch; color: var(--muted); }
.about p strong { color: var(--text); }
.social { display: flex; gap: 10px; flex-wrap: wrap; margin-top: 16px; }
.social svg { width: 18px; height: 18px; flex: none; }
/* Elemente gleiten beim ersten Sichtbarwerden herein (nur wenn home.js sie markiert) */
.reveal-pending { opacity: 0; transform: translateY(28px); }
.reveal-in { opacity: 1; transform: none; transition: opacity .8s var(--ease-out), transform .8s var(--ease-out); }
/* ---------- Kalender ---------- */
.cal-nav { display: flex; align-items: center; justify-content: space-between; gap: 8px; margin-bottom: 14px; }
.cal-nav h2 { margin: 0; font-size: clamp(1.1rem, 4.2vw, 1.5rem); text-align: center; flex: 1; }
.cal-nav button { font-size: 1.2rem; padding: 4px 14px; }
.cal-grid {
display: grid;
grid-template-columns: repeat(7, minmax(0, 1fr));
gap: 4px;
}
.cal-grid .dow {
text-align: center;
font-size: .85rem;
font-weight: 500;
color: var(--muted);
padding: 4px 0;
text-transform: uppercase;
letter-spacing: .14em;
}
.cal-day {
min-height: clamp(64px, 8.5vw, 124px);
border: 1px solid var(--border);
padding: 6px;
background: var(--bg-deep);
cursor: pointer;
text-align: left;
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: stretch;
gap: 3px;
font-family: var(--font-body);
font-size: .9rem;
text-transform: none;
letter-spacing: 0;
overflow: hidden;
}
.cal-day:hover { border-color: #56629c; background: #10152e; }
.cal-day.other { opacity: .35; }
.cal-day.weekend { background: #0f1430; }
.cal-day.today .num { background: var(--steel); color: var(--bg-deep); padding: 0 6px; }
.cal-day.selected { outline: 2px solid var(--accent); outline-offset: -1px; }
.cal-day .num { align-self: flex-start; font-weight: 600; font-variant-numeric: tabular-nums; }
.cal-day .ev {
font-size: .78rem;
background: var(--accent-soft);
border-left: 3px solid var(--accent);
padding: 2px 5px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.cal-day .ev.nogame { background: var(--steel-soft); border-left-color: var(--steel); color: var(--steel); }
.cal-day .ev.mine { background: var(--accent); color: var(--accent-text); font-weight: 600; }
.cal-day .ev.nogame.mine { background: var(--steel); color: var(--bg-deep); }
.cal-legend { display: flex; gap: 18px; flex-wrap: wrap; margin-top: 12px; font-size: .88rem; color: var(--muted); }
.cal-legend span { display: inline-flex; align-items: center; gap: 6px; }
.cal-legend i { width: 14px; height: 10px; display: inline-block; }
.cal-legend .l-game { background: var(--accent-soft); border-left: 3px solid var(--accent); }
.cal-legend .l-nogame { background: var(--steel-soft); border-left: 3px solid var(--steel); }
.cal-legend .l-mine { background: var(--accent); }
@media (max-width: 560px) {
.cal-day { min-height: 52px; padding: 3px; }
.cal-day .ev { font-size: 0; padding: 0; height: 6px; }
}
.events-grid { display: grid; gap: 14px; grid-template-columns: repeat(auto-fill, minmax(min(100%, 340px), 1fr)); align-items: start; }
.event {
position: relative;
border: 1px solid var(--border);
border-left: 3px solid var(--accent);
padding: 14px;
margin-bottom: 12px;
background: var(--bg-deep);
}
.events-grid .event { margin: 0; }
.event.nogame { border-left-color: var(--steel); }
.event-top { display: flex; gap: 10px; align-items: flex-start; justify-content: space-between; }
.event h3 { margin: 0; font-size: 1.15rem; }
.event .when { color: var(--muted); font-size: .92rem; margin: 4px 0 8px; }
.event .note { margin: 8px 0; white-space: pre-wrap; overflow-wrap: anywhere; }
/* ---------- Statistik ---------- */
.stats li { flex-wrap: nowrap; }
.stats .rank { color: var(--muted); min-width: 3ch; font-family: var(--font-head); font-size: 1.1rem; font-variant-numeric: tabular-nums; }
.stats li.top .rank { color: var(--accent); }
.stats .who { flex: 1; min-width: 0; display: grid; gap: 4px; }
.stats .who .name { font-weight: 600; }
.stat-bar { height: 8px; background: var(--steel-soft); position: relative; overflow: hidden; }
.stat-bar i {
position: absolute;
inset: 0 auto 0 0;
background: var(--accent);
border-radius: 0 4px 4px 0;
transform-origin: left;
animation: grow .9s var(--ease-out) both;
}
@keyframes grow { from { transform: scaleX(0); } }
.stat-total {
min-width: 3ch;
text-align: right;
font-family: var(--font-head);
font-size: 1.6rem;
font-weight: 700;
color: var(--text);
font-variant-numeric: tabular-nums;
}
.stats .actions { flex-wrap: nowrap; }
.facts { margin: 0; padding-left: 1.2em; display: grid; gap: 10px; color: var(--muted); }
.facts strong { color: var(--text); }
.facts li::marker { color: var(--accent); }
/* ---------- Patches ---------- */
.patch-grid {
display: grid;
gap: 20px;
grid-template-columns: repeat(auto-fill, minmax(min(100%, 230px), 1fr));
}
.patch {
position: relative;
display: flex;
flex-direction: column;
background: var(--card);
box-shadow: inset 0 0 0 1px var(--border);
clip-path: polygon(0 0, calc(100% - 16px) 0, 100% 16px, 100% 100%, 16px 100%, 0 calc(100% - 16px));
}
.patch-img {
display: grid;
place-items: center;
aspect-ratio: 1;
max-width: 100%;
padding: 18px;
background:
radial-gradient(circle at 50% 45%, #2a3466 0%, var(--bg-deep) 75%);
border: none;
width: 100%;
cursor: zoom-in;
overflow: hidden;
}
.patch-img img {
width: 100%;
height: 100%;
object-fit: contain;
filter: drop-shadow(0 10px 18px rgba(0, 0, 0, .45));
transition: transform .5s var(--ease-out);
}
.patch:hover .patch-img img, .patch-rail a:hover .patch-img img { transform: scale(1.06) rotate(-2deg); }
.patch-body { padding: 14px 16px 16px; display: grid; gap: 6px; }
.patch-body h3 { margin: 0; font-size: 1.15rem; }
.patch-body p { margin: 0; color: var(--muted); font-size: .94rem; white-space: pre-wrap; overflow-wrap: anywhere; }
.patch-body .actions { display: flex; gap: 4px; margin-top: 4px; }
.patch-group + .patch-group { margin-top: 40px; }
.patch-body .badge { justify-self: start; }
/* Geplante Patches: gestrichelter Rahmen, Bild leicht entsättigt */
.patch.planned { box-shadow: inset 0 0 0 1px #5b6488; }
.patch.planned .patch-img { background: repeating-linear-gradient(135deg, var(--bg-deep) 0 12px, #121834 12px 24px); }
.patch.planned .patch-img img { filter: saturate(.55) drop-shadow(0 10px 18px rgba(0, 0, 0, .45)); opacity: .85; }
.segmented { display: flex; gap: 0; border: none; padding: 0; margin: 0 0 12px; flex-wrap: wrap; }
.segmented legend { font-size: .94rem; color: var(--muted); margin-bottom: 5px; padding: 0; }
.segmented label { margin: 0; cursor: pointer; }
.segmented input { position: absolute; opacity: 0; pointer-events: none; }
.segmented label {
display: inline-flex;
align-items: center;
padding: 8px 16px;
border: 1px solid var(--border);
background: var(--bg-deep);
color: var(--muted);
font-family: var(--font-head);
text-transform: uppercase;
letter-spacing: .1em;
}
.segmented label + label { border-left: none; }
.segmented label:has(input:checked) { background: var(--accent); border-color: var(--accent); color: var(--accent-text); font-weight: 700; }
.segmented label:has(input:focus-visible) { outline: 2px solid var(--accent); outline-offset: 2px; }
.dropzone {
display: grid;
place-items: center;
gap: 8px;
text-align: center;
min-height: 190px;
padding: 18px;
margin-bottom: 14px;
border: 2px dashed var(--border);
background: var(--bg-deep);
color: var(--muted);
cursor: pointer;
transition: border-color .15s, background-color .15s;
}
.dropzone:hover, .dropzone.over { border-color: var(--accent); background: #10152e; }
.dropzone img { max-height: 220px; max-width: 100%; object-fit: contain; }
.dropzone strong { color: var(--text); font-family: var(--font-head); text-transform: uppercase; letter-spacing: .12em; }
.lightbox {
border: none;
padding: 0;
background: transparent;
max-width: min(92vw, 900px);
max-height: 92vh;
color: var(--text);
}
.lightbox::backdrop { background: rgba(8, 10, 24, .88); backdrop-filter: blur(4px); }
.lightbox img { display: block; max-width: 100%; max-height: 80vh; margin: 0 auto; object-fit: contain; }
.lightbox figcaption { text-align: center; margin-top: 12px; }
.lightbox figcaption strong { display: block; font-family: var(--font-head); text-transform: uppercase; letter-spacing: .12em; font-size: 1.3rem; }
.lightbox .close { position: absolute; top: 0; right: 0; }
.empty-state {
display: grid;
place-items: center;
gap: 8px;
text-align: center;
padding: 48px 16px;
color: var(--muted);
border: 1px dashed var(--border);
}
.empty-state svg { width: 56px; height: 56px; color: var(--border); }
/* ---------- Fahrtplaner ---------- */
.cars { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 260px), 1fr)); gap: 14px; margin-top: 14px; }
.car-meet { margin: 10px 0 4px; padding-top: 10px; border-top: 1px solid var(--border); }
.car-meet label { font-size: .85rem; margin-bottom: 6px; }
.car-meet .grid2 { gap: 8px; grid-template-columns: 1fr 1fr; }
.car {
border: 1px solid var(--border);
border-top: 3px solid var(--steel);
padding: 14px;
background: var(--bg-deep);
}
.car h3 { margin: 0 0 4px; font-size: 1.05rem; }
.car ol { margin: 6px 0 0; padding-left: 20px; }
.meeting { display: grid; grid-template-columns: max-content 1fr; gap: 2px 12px; margin: 8px 0 4px; }
.meeting dt { color: var(--muted); }
.meeting dd { margin: 0; font-weight: 600; }
.meeting dd small { display: block; font-weight: 400; color: var(--muted); }
/* ---------- Fußzeile ---------- */
footer {
display: flex;
gap: 16px 32px;
align-items: center;
justify-content: space-between;
flex-wrap: wrap;
color: var(--muted);
font-family: var(--font-head);
text-transform: uppercase;
letter-spacing: .2em;
font-size: .82rem;
padding: 28px var(--gutter);
border-top: 1px solid var(--border);
background: var(--bg-deep);
}
footer .f-brand { display: inline-flex; align-items: center; gap: 12px; }
footer .f-brand img { width: 32px; height: 32px; }
.footer-links { display: flex; gap: 20px; flex-wrap: wrap; }
.footer-links a { color: var(--muted); text-decoration: none; }
.footer-links a:hover { color: var(--accent); }
/* ---------- Responsiv ---------- */
.nav-toggle { display: none; }
@media (max-width: 960px) {
.site-header { padding: 8px var(--gutter); }
.site-header .inner { gap: 8px; }
.nav-toggle {
display: inline-flex;
margin-left: auto;
width: 44px;
height: 44px;
padding: 0;
background: none;
color: var(--steel);
}
.site-header.open { background: rgba(13, 17, 38, .97); }
.site-header.open .nav-toggle { color: var(--accent); border-color: var(--accent); }
.site-header nav { display: none; width: 100%; flex-direction: column; margin: 4px 0 0; gap: 0; }
.site-header.open nav { display: flex; }
.site-header nav a, .site-header nav button {
padding: 13px 4px;
text-align: left;
justify-content: flex-start;
border-bottom: 1px solid var(--border);
}
.site-header nav a::after, .site-header nav button::after { display: none; }
.site-header nav a:last-child, .site-header nav button:last-child { border-bottom: none; }
.site-header nav a.active { border-left: 3px solid var(--accent); padding-left: 10px; }
}
@media (max-width: 420px) {
.brand small { display: none; }
}
@media (max-width: 760px) {
main { padding-top: 20px; }
.card { padding: 16px; }
/* iOS zoomt bei Schrift unter 16px ins Feld */
input[type=text], input[type=password], input[type=number], input[type=date], input[type=time], select, textarea { font-size: 16px; }
.hero { height: 150vh; }
.hud .tr { display: none; }
/* Handy: Inhalt beginnt erst unter dem Logo-Bereich, keine Überlappung */
.home main { margin-top: 0; }
}
/* Touch-Geräte: ausreichend große Tippflächen */
@media (pointer: coarse) {
button.small, .button.small { min-height: 38px; min-width: 38px; }
button.link { padding: 8px 8px; }
input[type=checkbox] { width: 20px; height: 20px; }
}
/* Weniger Bewegung: kein Zoom, nichts bleibt unsichtbar */
@media (prefers-reduced-motion: reduce) {
*, *::before, *::after { animation: none !important; transition-duration: .01ms !important; }
.hero { height: auto; }
.hero-stage { position: relative; height: min(80vh, 720px); --p: 0 !important; }
.home main { margin-top: 0; padding-top: 28px; }
.reveal-pending { opacity: 1; transform: none; }
}
@media print {
.site-header, footer, .no-print { display: none !important; }
:root { --text: #000; --muted: #444; --border: #999; --bg-deep: #fff; --card: #fff; }
body { background: #fff; color: #000; }
.card { box-shadow: none; clip-path: none; padding: 0; }
.card::before { display: none; }
.split { display: block; }
main { padding: 0; }
}