@charset "UTF-8";
/*
Theme Name: KGV Hahnenburg
Theme URI: https://www.kgv-hahnenburg.de/
Author: start42
Description: Schlankes Theme für den Kleingärtner-Verein Hahnenburg e.V. Keine externen Ressourcen, keine Tracker, keine Webfonts von fremden Servern. Vereinsfunktionen liegen bewusst im Plugin kgv-hahnenburg-core.
Version: 1.0.0
Requires at least: 6.7
Tested up to: 7.0
Requires PHP: 8.1
License: GPL-2.0-or-later
License URI: https://www.gnu.org/licenses/gpl-2.0.html
Text Domain: kgv-hahnenburg
*/

/* ==================================================================
   Schriften

   SELBST GEHOSTET, nicht von fonts.googleapis.com eingebunden. Ein
   Webfont von einem fremden Server überträgt bei jedem Seitenaufruf die
   IP-Adresse des Besuchers dorthin; das LG München hat das 2022 als
   Verstoß gegen die DSGVO gewertet (Az. 3 O 17493/20). Die Dateien
   liegen deshalb unter assets/fonts/, samt Lizenztext — beide Schriften
   stehen unter der SIL Open Font License 1.1.

   Zwei variable Schnitte, jeweils nur der lateinische Zeichenvorrat:
   Source Serif 4 für Überschriften, Inter für den Fließtext. Zusammen
   167 KB, danach ein Jahr im Browser-Cache (siehe .htaccess, Abschnitt 7).

   Variabel heißt: EINE Datei deckt alle Strichstärken von 400 bis 700 ab.
   Als einzelne Schnitte wären das vier Dateien je Familie.

   font-display: swap — der Text steht sofort in der Ersatzschrift da und
   wird ausgetauscht, sobald die eigene geladen ist. Ohne das bliebe die
   Seite auf einer langsamen Verbindung für einen Moment leer.

   unicode-range begrenzt die Schrift auf die Zeichen, die sie enthält.
   Alles darüber hinaus — griechische, kyrillische Zeichen in einem
   zitierten Namen etwa — holt der Browser aus der Ersatzschrift, statt
   ein leeres Kästchen zu zeichnen.
   ================================================================== */

@font-face {
	font-family: "Source Serif 4";
	font-style: normal;
	font-weight: 400 700;
	font-display: swap;
	src: url("assets/fonts/SourceSerif4-var-latin.woff2") format("woff2");
	unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC,
		U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212,
		U+2215, U+FEFF, U+FFFD;
}

@font-face {
	font-family: "Inter";
	font-style: normal;
	font-weight: 400 700;
	font-display: swap;
	src: url("assets/fonts/Inter-var-latin.woff2") format("woff2");
	unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC,
		U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212,
		U+2215, U+FEFF, U+FFFD;
}

/* ==================================================================
   Grundlagen
   Schriftgrößen bewusst großzügig: die Zielgruppe ist gemischt und
   reicht bis weit über 70.
   ================================================================== */

:root {
	--kgv-red: #c9403c;
	--kgv-red-dark: #a63330;
	--kgv-green: #2e7d32;
	--kgv-olive: #8f8e52;
	--kgv-text: #1f2421;
	--kgv-muted: #5d6660;
	--kgv-line: #e3e0d8;
	--kgv-area: #fff;
	--kgv-base: #fbfaf7;
	--kgv-radius: 10px;
	--kgv-width: 1200px;
	--kgv-text-width: 62rem;

	/* Schatten als Variablen: im Dunkelmodus braucht es andere Werte.
	   Ein schwarzer Schatten auf dunklem Grund ist unsichtbar — dort
	   arbeitet die Erhebung stattdessen über einen helleren Rand. */
	--kgv-shadow: 0 1px 2px rgba(20, 26, 18, 0.05);
	--kgv-shadow-high: 0 10px 26px rgba(20, 26, 18, 0.13);

	/* Eine Dauer und eine Kurve für die ganze Seite. Steht die Zeit an
	   fünfzehn Stellen einzeln, driftet sie mit jeder Änderung weiter
	   auseinander und die Oberfläche wirkt unruhig. */
	--kgv-duration: 160ms;
	--kgv-curve: cubic-bezier(0.2, 0, 0.2, 1);

	--kgv-serif: "Source Serif 4", Georgia, "Iowan Old Style", "Times New Roman", serif;
	--kgv-sans: "Inter", system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;

	/* Formularfelder, Bildlaufleisten und Auswahlpfeile zeichnet der
	   Browser selbst. Ohne diese Angabe blieben sie hell, während der
	   Rest der Seite dunkel ist. Der Umschalter setzt sie um. */
	color-scheme: light dark;
}

*, *::before, *::after { box-sizing: border-box; }

html { font-size: 106.25%; scroll-behavior: smooth; }
@media (prefers-reduced-motion: reduce) { html { scroll-behavior: auto; } }

body {
	margin: 0;
	background: var(--kgv-base);
	color: var(--kgv-text);
	font-family: var(--kgv-sans);
	line-height: 1.65;
	-webkit-text-size-adjust: 100%;
}

img, svg, iframe, video { max-width: 100%; height: auto; }
img { border-radius: var(--kgv-radius); }

a { color: var(--kgv-red-dark); text-underline-offset: 0.15em; transition: color var(--kgv-duration) var(--kgv-curve); }
a:hover { color: var(--kgv-red); }
a:focus-visible,
button:focus-visible { outline: 3px solid var(--kgv-green); outline-offset: 2px; border-radius: 3px; }

/* ------------------------------------------------------------------
   Bewegung

   Sparsam und kurz. 160 ms sind lang genug, dass eine Änderung als
   Bewegung wahrgenommen wird, und kurz genug, dass niemand darauf
   wartet. Alles darüber fühlt sich beim zehnten Klick zäh an.

   Bewegt wird nur, was der Browser auf der Grafikkarte erledigen kann:
   transform, opacity, box-shadow, Farben. Eine Animation auf height
   oder top zwingt ihn, das Layout neu zu rechnen, und ruckelt auf
   älteren Geräten sichtbar.

   Die Abschaltung für prefers-reduced-motion steht ganz unten in dieser
   Datei — sie muss nach allen Regeln kommen, die sie aufhebt.
   ------------------------------------------------------------------ */

button,
.kgv-btn,
.kgv-post-card,
.kgv-nav a {
	transition:
		background-color var(--kgv-duration) var(--kgv-curve),
		border-color var(--kgv-duration) var(--kgv-curve),
		color var(--kgv-duration) var(--kgv-curve),
		box-shadow var(--kgv-duration) var(--kgv-curve),
		transform var(--kgv-duration) var(--kgv-curve);
}

/* Knöpfe geben beim Drücken nach - die einzige Rückmeldung, die man
   auf einem Touchscreen ohne Zeigegerät überhaupt bekommt. */
button:active,
.kgv-btn:active { transform: translateY(1px); }

h1, h2, h3, h4 { font-family: var(--kgv-serif); line-height: 1.2; margin: 2rem 0 0.6rem; text-wrap: balance; }
h1 { font-size: clamp(1.9rem, 1.3rem + 2.4vw, 2.8rem); margin-top: 0; }
h2 { font-size: clamp(1.45rem, 1.1rem + 1.4vw, 1.9rem); }
h3 { font-size: 1.25rem; }
p, ul, ol { margin: 0 0 1.1rem; }
ul, ol { padding-left: 1.3rem; }
li + li { margin-top: 0.35rem; }
mark { background: #fff3cd; padding: 0.1em 0.3em; border-radius: 3px; }

blockquote {
	margin: 1.5rem 0;
	padding: 0.6rem 0 0.6rem 1.2rem;
	border-left: 4px solid var(--kgv-olive);
	color: var(--kgv-muted);
	font-style: italic;
}
hr { height: 1px; margin: 2.5rem 0; border: 0; background: var(--kgv-line); }

table { width: 100%; border-collapse: collapse; }
th, td { padding: 0.55rem 0.7rem; border-bottom: 1px solid var(--kgv-line); text-align: left; }

.kgv-sr-only {
	position: absolute !important;
	width: 1px; height: 1px;
	margin: -1px; padding: 0;
	overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0;
}
.kgv-skip {
	position: absolute; left: -9999px;
	z-index: 999; padding: 0.8rem 1.2rem;
	background: var(--kgv-green); color: #fff; font-weight: 700; text-decoration: none;
}
.kgv-skip:focus { left: 0.5rem; top: 0.5rem; }

/* ==================================================================
   Layout
   ================================================================== */

.kgv-wrapper { display: flex; flex-direction: column; min-height: 100vh; }
/* Maximalbreite 1200px: der Kipppunkt für das Karten-Raster. Darunter
   fallen die Karten (minmax 19rem) auf zwei Spalten zurück, darüber
   gewinnt man keine dritte Spalte mehr, nur Luft. Bei 1200px bleiben
   1104px nutzbar — Kalenderzellen 151px, Karten dreispaltig. */
.kgv-width {
	width: 100%;
	max-width: var(--kgv-width);
	padding-inline: clamp(1rem, 2.5vw, 3rem);
	margin-inline: auto;
}
.kgv-content { flex: 1 0 auto; padding: 2rem 0 3.5rem; }

/* ==================================================================
   Kopfbereich
   ================================================================== */

.kgv-head {
	position: sticky;
	top: 0;
	z-index: 100;
	background: var(--kgv-area);
	border-bottom: 3px solid var(--kgv-olive);
	transition: box-shadow var(--kgv-duration) var(--kgv-curve);
}

/* Angemeldet schiebt WordPress seine eigene Leiste fest an den oberen
   Bildschirmrand. Ohne diese Korrektur klebt der Seitenkopf bei top: 0
   DARUNTER: gemessen lag seine Oberkante auf 0, die Adminleiste ist 32px
   hoch — der Umschalter stand also zur Hälfte verdeckt, und wer ihn
   ansteuerte, wechselte bei der kleinsten Handbewegung zwischen Leiste
   und Knopf hin und her.
   Unter 601px ist die Adminleiste nicht fest, sondern scrollt mit; dort
   ist der Versatz falsch. */
.admin-bar .kgv-head { top: 32px; }
@media (max-width: 782px) { .admin-bar .kgv-head { top: 46px; } }
@media (max-width: 600px) { .admin-bar .kgv-head { top: 0; } }

.kgv-head.is-shrunk { box-shadow: var(--kgv-shadow-high); }
.kgv-head__line {
	display: flex; flex-wrap: wrap; gap: 0.6rem 1rem;
	align-items: center; justify-content: space-between;
	/* padding-block statt der Kurzschreibweise "padding: 0.9rem 0": diese
	   hätte padding-inline auf 0 gesetzt und damit den Innenabstand aus
	   .kgv-width überschrieben — der Kopf stünde dann breiter als der
	   restliche Inhalt. */
	padding-block: 0.9rem;
}

.kgv-brand { display: flex; gap: 0.85rem; align-items: center; text-decoration: none; color: inherit; }
.kgv-brand img { width: 48px; height: auto; border-radius: 0; }
.kgv-brand__name { font-family: var(--kgv-serif); font-size: 1.3rem; font-weight: 700; line-height: 1.15; }
.kgv-brand__suffix { display: block; color: var(--kgv-muted); font-family: var(--kgv-sans); font-size: 0.82rem; font-weight: 400; }

/* Der Kopf schrumpft beim Scrollen — aber NUR auf schmalen Bildschirmen.
 *
   Dort war er 151px hoch, ein Sechstel des Handybildschirms, bevor der
   erste Satz kam. Am Schreibtisch sind es 90px bei 900px Fensterhöhe;
   dort ist nichts zu gewinnen, was den Aufwand rechtfertigt.

   Und Aufwand ist es: die Höhe eines klebenden Kopfes zu verändern ändert
   die Höhe des gesamten Dokuments, während der Browser scrollt. Auf dem
   Handy ist das ein einmaliger Sprung am Anfang, am Schreibtisch mit
   Mausrad und Schwungscrollen kann es sichtbar unruhig werden. Deshalb
   springt die Höhe hier auch ohne Übergang: eine Bewegung, die das Layout
   umrechnet, sieht auf älteren Geräten schlechter aus als ein Sprung. */
@media (max-width: 1199px) {
	.kgv-head.is-shrunk .kgv-head__line { padding-block: 0.4rem; }
	.kgv-head.is-shrunk .kgv-brand img { width: 34px; }
	.kgv-head.is-shrunk .kgv-brand__suffix { display: none; }
}

.kgv-head__tools { display: flex; align-items: center; gap: 0.5rem; }

/* Umschalter Hell/Dunkel. Zeigt an, wohin er führt, nicht wo man ist —
   das ist die Lesart, die Leute von Lichtschaltern kennen. Beschriftet ist
   er trotzdem, sonst müsste man das Sinnbild raten; sichtbar bleibt die
   Beschriftung nur dort, wo Platz ist. */
.kgv-colorscheme {
	display: inline-flex; align-items: center; gap: 0.45rem;
	padding: 0.5rem 0.7rem;
	background: var(--kgv-area);
	border: 2px solid var(--kgv-line);
	border-radius: var(--kgv-radius);
	color: var(--kgv-text);
	font: inherit; font-size: 0.9rem; font-weight: 600;
	cursor: pointer;
	line-height: 1;
}
.kgv-colorscheme:hover { border-color: var(--kgv-olive); background: var(--kgv-base); }
.kgv-colorscheme svg { width: 1.15rem; height: 1.15rem; flex: none; }
/* Es sind zwei Sinnbilder im Knopf. Sichtbar ist immer nur das des
   Zielzustands; welches, entscheidet der Farbmodus. */
.kgv-colorscheme__sun { display: none; }
.kgv-colorscheme__moon { display: block; }
@media (prefers-color-scheme: dark) {
	:root:not([data-colorscheme="light"]) .kgv-colorscheme__sun { display: block; }
	:root:not([data-colorscheme="light"]) .kgv-colorscheme__moon { display: none; }
}
:root[data-colorscheme="dark"] .kgv-colorscheme__sun { display: block; }
:root[data-colorscheme="dark"] .kgv-colorscheme__moon { display: none; }
:root[data-colorscheme="light"] .kgv-colorscheme__sun { display: none; }
:root[data-colorscheme="light"] .kgv-colorscheme__moon { display: block; }

/* Auf dem Handy zählt jede Zeile im Kopf. Beide Knöpfe verlieren ihre
   Beschriftung und werden zu Sinnbildern; die Namen bleiben für
   Screenreader erhalten. Ohne das passen Wappen, „Ansicht" und „☰ Menü"
   nicht in 390 px, der Kopf bricht um und ist wieder 151 px hoch —
   genau das, was hier abgestellt werden soll. */
@media (max-width: 600px) {
	.kgv-colorscheme__text { display: none; }
	.kgv-colorscheme { padding-inline: 0.55rem; }
	.kgv-nav__toggle { padding-inline: 0.6rem; font-size: 1.15rem; }
	.kgv-nav__toggle .kgv-nav__toggle-text {
		position: absolute; width: 1px; height: 1px;
		margin: -1px; padding: 0; overflow: hidden;
		clip-path: inset(50%); white-space: nowrap;
	}
	/* Der Zusatz unter dem Vereinsnamen ist die zweite Zeile, die den Kopf
	   hoch macht. Auf dem Handy steht er ohnehin auf jeder Unterseite im
	   Text; hier trägt der Name allein. */
	.kgv-brand__suffix { display: none; }
	.kgv-brand { gap: 0.55rem; }
	.kgv-brand img { width: 38px; }
	.kgv-brand__name { font-size: 1.1rem; }
}

.kgv-nav { display: flex; align-items: center; gap: 0.6rem; width: 100%; }
.kgv-nav ul { display: flex; flex-wrap: wrap; gap: 0.1rem; margin: 0; padding: 0; list-style: none; }
.kgv-nav li { margin: 0; }
.kgv-nav a {
	display: block; padding: 0.45rem 0.6rem;
	border-radius: var(--kgv-radius);
	color: var(--kgv-text); font-size: 0.95rem; font-weight: 600; text-decoration: none;
}
.kgv-nav a:hover { background: var(--kgv-base); color: var(--kgv-red-dark); }
.kgv-nav .current-menu-item > a,
.kgv-nav .current_page_item > a { background: var(--kgv-green); color: #fff; }

/* Untermenüs. Öffnen bei Hover und bei Tastaturfokus (:focus-within),
   damit die Navigation ohne Maus bedienbar bleibt. */
.kgv-nav li { position: relative; }
.kgv-nav .sub-menu {
	position: absolute;
	top: 100%;
	left: 0;
	z-index: 50;
	display: none;
	min-width: 15rem;
	padding: 0.4rem;
	background: var(--kgv-area);
	border: 1px solid var(--kgv-line);
	border-radius: var(--kgv-radius);
	box-shadow: 0 12px 30px rgba(0, 0, 0, 0.14);
}
.kgv-nav li:hover > .sub-menu,
.kgv-nav li:focus-within > .sub-menu { display: block; }
.kgv-nav .sub-menu li { width: 100%; }
.kgv-nav .sub-menu a { white-space: nowrap; }
/* Kleiner Pfeil als Hinweis auf das Untermenü. */
.kgv-nav .menu-item-has-children > a::after {
	content: " \25be";
	font-size: 0.8em;
	opacity: 0.7;
}

/* Ab 1200px steht das Menü rechts oben neben dem Wappen statt in einer
   eigenen Zeile darunter.

   Die Liste bekommt hier bewusst „nowrap“: mit Umbruch wäre ihre
   Mindestbreite ein einzelner Punkt, und der Browser würde das Menü lieber
   zweizeilig neben das Wappen quetschen, als es als Ganzes in die nächste
   Zeile zu schieben. Mit nowrap ist die Mindestbreite das vollständige Menü —
   passt es nicht, wandert es geschlossen unter das Wappen. */
@media (min-width: 1200px) {
	.kgv-head__line { flex-wrap: wrap; }
	/* Reihenfolge im Kopf: Wappen — Menü — Umschalter. Im Quelltext steht
	   der Umschalter vor dem Menü, damit er auf dem Handy neben dem
	   Menüknopf sitzt; hier rückt er per order nach hinten. */
	.kgv-nav { width: auto; justify-content: flex-end; order: 2; flex: 1; }
	.kgv-head__tools { order: 3; }
	.kgv-nav ul { flex-wrap: nowrap; }
	/* Etwas engere und kleinere Schaltflächen: das Menü passt damit auch dann
	   neben den Vereinsnamen, wenn der Innenabstand von .kgv-width auf
	   breiten Bildschirmen sein Maximum von 3rem erreicht hat. */
	.kgv-nav a { padding-inline: 0.45rem; font-size: 0.9rem; white-space: nowrap; }
	/* Untermenüs der letzten Punkte nach innen öffnen, sonst ragen sie über
	   den rechten Rand hinaus. */
	.kgv-nav > .kgv-nav__list > ul > li:nth-last-child(-n+2) .sub-menu { left: auto; right: 0; }
}

.kgv-nav__toggle {
	display: none; align-items: center; gap: 0.5rem;
	padding: 0.55rem 0.9rem;
	background: var(--kgv-area); border: 2px solid var(--kgv-line); border-radius: var(--kgv-radius);
	font: inherit; font-weight: 600; cursor: pointer;
}

@media (max-width: 1199px) {
	.kgv-nav__toggle { display: inline-flex; }
	.kgv-nav__list { display: none; width: 100%; padding-bottom: 0.8rem; }
	.kgv-nav__list.is-open { display: block; }
	/* Wappen und Werkzeuge teilen sich die erste Zeile, das Menü klappt
	   darunter auf. Vorher stand die ganze Navigation - inklusive des
	   Menüknopfs - grundsätzlich in einer zweiten Zeile.
	 *
	   Das <nav> selbst wird ausgeblendet, nicht nur seine Liste: ein leeres
	   Element mit width 100% belegt sonst weiter eine Zeile im Umbruch und
	   der Kopf bliebe genauso hoch wie vorher. Die Klasse setzt theme.js
	   zusammen mit is-open auf der Liste. */
	.kgv-nav { display: none; width: 100%; order: 3; }
	.kgv-nav.is-menu-open { display: block; }
	.kgv-head__tools { order: 2; }
	.kgv-nav__list ul { flex-direction: column; gap: 0; }
	.kgv-nav__list a { padding: 0.7rem 0.8rem; border-bottom: 1px solid var(--kgv-line); border-radius: 0; }
	/* Auf dem Handy klappen Untermenüs eingerückt auf, statt als Ebene
	   über dem Inhalt zu schweben. */
	.kgv-nav .sub-menu {
		position: static;
		display: block;
		min-width: 0;
		padding: 0;
		border: 0;
		box-shadow: none;
		background: transparent;
	}
	.kgv-nav .sub-menu a { padding-left: 1.9rem; font-weight: 400; }
	.kgv-nav .menu-item-has-children > a::after { content: none; }
	.kgv-nav { flex-wrap: wrap; width: 100%; justify-content: flex-end; }
}

/* ==================================================================
   Seitenkopf / Hero
   ================================================================== */

/* Hero der Startseite. Der Farbverlauf sitzt zwischen Bild und Text, damit
   die Schrift auch über hellen Bildbereichen (Himmel, Rasen) lesbar bleibt —
   ohne den Verlauf reicht der Kontrast bei diesem Motiv nicht. */
.kgv-hero {
	position: relative;
	margin-bottom: 2rem;
	border-radius: var(--kgv-radius);
	overflow: hidden;
	background: #2b3126;
}
.kgv-hero img {
	display: block;
	width: 100%;
	height: clamp(14rem, 38vw, 26rem);
	object-fit: cover;
	object-position: center 60%;
	border-radius: 0;
}
.kgv-hero::after {
	content: "";
	position: absolute;
	inset: 0;
	background: linear-gradient(to top, rgba(15, 20, 14, 0.82) 0%, rgba(15, 20, 14, 0.45) 35%, rgba(15, 20, 14, 0) 65%);
}
.kgv-hero__text {
	position: absolute;
	inset-inline: 0;
	bottom: 0;
	z-index: 1;
	padding: clamp(1rem, 4vw, 2.2rem);
	color: #fff;
}
.kgv-hero__line {
	margin: 0 0 0.2rem;
	font-size: clamp(0.8rem, 0.7rem + 0.4vw, 1rem);
	font-weight: 600;
	letter-spacing: 0.06em;
	text-transform: uppercase;
	color: #d9e3d3;
}
.kgv-hero__title {
	margin: 0;
	font-size: clamp(1.5rem, 1rem + 2.6vw, 2.6rem);
	color: #fff;
	text-shadow: 0 2px 12px rgba(0, 0, 0, 0.45);
}

/* Einheitlicher Seitenkopf für alle Unterseiten.
   Mit Beitragsbild wird daraus ein Hero mit eingefasstem Titel, ohne Bild
   ein farbiges Titelband. Vorher schwebte auf manchen Seiten ein Bild ohne
   Bezug über dem Artikel, andere Seiten begannen unvermittelt mit Text. */
.kgv-pagehead {
	position: relative;
	display: flex;
	align-items: flex-end;
	min-height: 9rem;
	margin-bottom: 2rem;
	padding: clamp(1.1rem, 3vw, 2rem);
	background: linear-gradient(135deg, #2f3a2b 0%, #46523d 100%);
	border-radius: var(--kgv-radius);
	overflow: hidden;
	color: #fff;
}
.kgv-pagehead--image { min-height: clamp(11rem, 26vw, 18rem); }
.kgv-pagehead img {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	object-fit: cover;
	border-radius: 0;
}
.kgv-pagehead--image::after {
	content: "";
	position: absolute;
	inset: 0;
	background: linear-gradient(to top, rgba(15, 20, 14, 0.85) 0%, rgba(15, 20, 14, 0.35) 45%, rgba(15, 20, 14, 0) 78%);
}
.kgv-pagehead__text { position: relative; z-index: 1; max-width: var(--kgv-text-width); }
.kgv-pagehead__line {
	margin: 0 0 0.25rem;
	font-size: 0.85rem;
	font-weight: 600;
	letter-spacing: 0.06em;
	text-transform: uppercase;
	color: #cbd6c4;
}
.kgv-pagehead__title {
	margin: 0;
	color: #fff;
	font-size: clamp(1.7rem, 1.2rem + 1.8vw, 2.4rem);
	text-shadow: 0 2px 12px rgba(0, 0, 0, 0.4);
}
.kgv-pagehead .kgv-form { position: relative; z-index: 1; margin-top: 1rem; }

/* Altes Element, bleibt für den Fall, dass es noch irgendwo verwendet wird. */
.kgv-hero_image { position: relative; margin-bottom: 2rem; border-radius: var(--kgv-radius); overflow: hidden; }
.kgv-hero_image img { display: block; width: 100%; height: clamp(12rem, 30vw, 22rem); object-fit: cover; border-radius: 0; }

/* ==================================================================
   Inhalt
   ================================================================== */

.kgv-article { background: var(--kgv-area); padding: clamp(1.2rem, 4vw, 2.4rem); border-radius: var(--kgv-radius); border: 1px solid var(--kgv-line); }
.kgv-article > *:first-child { margin-top: 0; }
.kgv-article > *:last-child { margin-bottom: 0; }
/* Fließtext auf lesbare Zeilenlänge begrenzen — Kalender, Karten,
   Galerien, Formulare und Bildraster nutzen dagegen die volle Breite.
   Ohne diese Trennung stünde auf breiten Bildschirmen alles in einer
   schmalen Spalte links und rechts bliebe die halbe Seite leer. */
.kgv-article > p,
.kgv-article > ul,
.kgv-article > ol,
.kgv-article > h2,
.kgv-article > h3,
.kgv-article > h4,
.kgv-article > blockquote {
	/* 62rem entspricht bei 1200px Seitenbreite fast genau der nutzbaren
	   Artikelbreite — der Text füllt die Spalte also aus. Die Begrenzung
	   bleibt als Sicherung stehen, falls die Seitenbreite später wächst;
	   ohne sie würden Zeilen auf einem breiten Monitor unlesbar lang. */
	max-width: var(--kgv-text-width);
	margin-inline: auto;
}
/* Innerhalb von Spaltenlayouts gilt die Begrenzung nicht: dort füllt der
   Text seine Spalte. */
.kgv-columns .kgv-article > *,
.kgv-columns > * > p,
.kgv-columns > * > ul,
.kgv-columns > * > h2,
.kgv-columns > * > h3 { max-width: none; margin-inline: 0; }

/* Zweispaltiges Seitenlayout (Kontakt und ähnliche Seiten). */
.kgv-columns {
	display: grid;
	gap: clamp(1.5rem, 3vw, 3rem);
	grid-template-columns: minmax(0, 1.15fr) minmax(0, 1fr);
	align-items: start;
}
.kgv-columns > * { min-width: 0; }
.kgv-columns p, .kgv-columns ul, .kgv-columns h2, .kgv-columns h3 { max-width: none; }
@media (max-width: 900px) {
	.kgv-columns { grid-template-columns: 1fr; }
}

/* Info-Kasten, etwa für die Anschrift neben dem Kontaktformular. */
.kgv-callout {
	padding: 1.3rem 1.5rem;
	background: var(--kgv-base);
	border: 1px solid var(--kgv-line);
	border-radius: var(--kgv-radius);
}
.kgv-callout > *:first-child { margin-top: 0; }
.kgv-callout > *:last-child { margin-bottom: 0; }
.kgv-callout h2, .kgv-callout h3 { font-size: 1.15rem; margin-bottom: 0.5rem; }

.kgv-posts { display: grid; gap: 1.5rem; grid-template-columns: repeat(auto-fill, minmax(19rem, 1fr)); }
.kgv-post-card {
	display: flex; flex-direction: column;
	background: var(--kgv-area); border: 1px solid var(--kgv-line); border-radius: var(--kgv-radius);
	box-shadow: var(--kgv-shadow);
	overflow: hidden;
}
/* Die Karte hebt sich beim Überfahren leicht an und das Bild zoomt einen
   Hauch. Beides klein gehalten: 3 px und 4 % - genug, damit die Karte als
   anfassbar erkennbar wird, zu wenig, um vom Text abzulenken. Der Zoom
   sitzt auf dem Bild, nicht auf der Karte, sonst würde auch die Schrift
   mitwachsen und für die Dauer der Bewegung unscharf. */
@media (hover: hover) {
	.kgv-post-card:hover { transform: translateY(-3px); box-shadow: var(--kgv-shadow-high); border-color: var(--kgv-olive); }
	.kgv-post-card:hover img { transform: scale(1.04); }
}
.kgv-post-card:focus-within { border-color: var(--kgv-olive); box-shadow: var(--kgv-shadow-high); }
.kgv-post-card img {
	width: 100%; height: 11rem; object-fit: cover; border-radius: 0;
	transition: transform 400ms var(--kgv-curve);
}
/* Ohne Bild bekommt die Karte ein Band in derselben Höhe, damit die Reihe
   nicht ausfranst — und darin das Datum, statt bloßer Zierde. */
.kgv-post-card__ribbon {
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	gap: 0.1rem;
	height: 11rem;
	background: linear-gradient(135deg, #2f3a2b 0%, #46523d 100%);
	color: #fff;
	text-decoration: none;
	line-height: 1;
}
.kgv-post-card__day {
	font-family: var(--kgv-serif);
	font-size: 2.4rem;
	font-weight: 700;
	font-variant-numeric: tabular-nums;
}
.kgv-post-card__year {
	font-size: 0.95rem;
	letter-spacing: 0.12em;
	opacity: 0.8;
}
.kgv-post-card__text { padding: 1.1rem 1.2rem 1.3rem; }
.kgv-post-card__text h2 { margin: 0 0 0.35rem; font-size: 1.2rem; }
.kgv-post-card__text h2 a { text-decoration: none; }
.kgv-post-card__text h2 a:hover { text-decoration: underline; }
.kgv-meta { color: var(--kgv-muted); font-size: 0.88rem; }

.kgv-paginate { display: flex; justify-content: space-between; gap: 1rem; margin-top: 2rem; }

/* ==================================================================
   Startseite: der nächste Termin
   ================================================================== */

/* Die Farbe kommt aus der Terminart (--kgv-event-color, gesetzt in
   functions.php). Der Verlauf gibt der Kachel Tiefe, ohne dass ein Bild
   nötig wäre — und er funktioniert mit jeder Farbe, die der Vorstand im
   Backend einstellt. */
.kgv-next {
	margin-top: 2rem;
	padding: clamp(1.3rem, 4vw, 2.2rem);
	border-radius: var(--kgv-radius);
	background:
		linear-gradient(135deg,
			var(--kgv-event-color, var(--kgv-green)) 0%,
			color-mix(in srgb, var(--kgv-event-color, var(--kgv-green)) 78%, #000) 100%);
	color: var(--kgv-event-font, #fff);
	box-shadow: var(--kgv-shadow-high);
}
.kgv-next__line {
	margin: 0 0 0.3rem;
	font-size: 0.85rem; font-weight: 600;
	letter-spacing: 0.06em; text-transform: uppercase;
	opacity: 0.85;
}
.kgv-next__title {
	margin: 0 0 0.4rem;
	color: inherit;
	font-size: clamp(1.5rem, 1.1rem + 1.8vw, 2.2rem);
}
.kgv-next__when { margin: 0 0 0.9rem; font-size: 1.05rem; }
.kgv-next__link { margin: 0; }
/* Der Link steht auf farbiger Fläche — die Textfarbe der Kachel erben,
   sonst gilt das Rot aus a{}, und das ist auf Rot unsichtbar. */
.kgv-next__link a { color: inherit; font-weight: 600; }

/* ==================================================================
   Startseite: Zahlenzeile
   ================================================================== */

.kgv-numbers {
	display: grid; gap: 1rem;
	grid-template-columns: repeat(auto-fit, minmax(9rem, 1fr));
	margin: 1.8rem 0 0; padding: 1.4rem 0 0;
	border-top: 1px solid var(--kgv-line);
	list-style: none;
	/* Die Begrenzung auf Textbreite gilt hier nicht: die Zeile soll die
	   volle Artikelbreite nutzen. */
	max-width: none;
}
.kgv-numbers__entry { margin: 0; text-align: center; }
.kgv-numbers__value {
	display: block;
	font-family: var(--kgv-serif);
	font-size: clamp(1.6rem, 1.2rem + 1.4vw, 2.1rem);
	font-weight: 700;
	line-height: 1.1;
	color: var(--kgv-green);
}
.kgv-numbers__purpose { display: block; color: var(--kgv-muted); font-size: 0.92rem; }

/* ==================================================================
   Fuß
   ================================================================== */

.kgv-footer { background: #23281f; color: #d8dcd4; margin-top: auto; }
.kgv-footer a { color: #fff; }
.kgv-footer__grid {
	display: grid; gap: 2rem;
	grid-template-columns: repeat(auto-fit, minmax(14rem, 1fr));
	padding: 2.5rem 0 1.5rem;
}
.kgv-footer h2 { margin: 0 0 0.6rem; font-size: 1.05rem; color: #fff; }
.kgv-footer ul { margin: 0; padding: 0; list-style: none; }
.kgv-footer li + li { margin-top: 0.3rem; }
.kgv-footer__bottom {
	display: flex; flex-wrap: wrap; gap: 0.5rem 1.5rem; justify-content: space-between; align-items: center;
	padding: 1rem 0 1.6rem; border-top: 1px solid rgba(255, 255, 255, 0.15);
	font-size: 0.87rem;
}
.kgv-footer__bottom p { margin: 0; }
.kgv-footer__bottom ul { display: flex; flex-wrap: wrap; align-items: center; gap: 0.4rem 1.5rem; }
/* `li + li { margin-top }` ist für senkrechte Listen gedacht und schiebt in
   dieser waagerechten Liste jeden Eintrag außer dem ersten nach unten —
   genau das ließ „Impressum“ höher stehen.
   Der Reset muss dieselbe Form haben wie die Regel, die er aufhebt:
   `.kgv-footer li + li` hat die Spezifität (0,1,2), ein schlichtes
   `.kgv-footer__bottom li` nur (0,1,1) und verliert damit trotz späterer
   Position. */
.kgv-footer__bottom li,
.kgv-footer__bottom li + li { margin: 0; }

/* ==================================================================
   Dunkelmodus

   Zwei Wege führen hinein, und deshalb steht der Block zweimal da:

     1. Die Systemeinstellung des Geräts — solange niemand ausdrücklich
        „hell" gewählt hat.
     2. Die eigene Wahl über den Umschalter in der Kopfzeile.

   Die Wiederholung ist beabsichtigt. Beide Bedingungen in eine
   Selektorliste zu schreiben geht nicht: der eine Fall steht in einer
   @media-Abfrage, der andere nicht. Ein Verzeichnis für die dunklen
   Werte anzulegen und es zu referenzieren, kann CSS nicht. Und
   light-dark() käme mit einer Zeile aus, ist aber erst ab Chrome 123
   und Safari 17.5 da — bei einer Leserschaft mit älteren Geräten ist
   das der falsche Einsatz für eine neue Funktion.

   WER HIER ETWAS ÄNDERT, ÄNDERT ES AN BEIDEN STELLEN.
   ================================================================== */

@media (prefers-color-scheme: dark) {
	:root:not([data-colorscheme="light"]) {
		--kgv-text: #e8e6e0;
		--kgv-muted: #a6ada4;
		--kgv-line: #3a4038;
		--kgv-area: #22261f;
		--kgv-base: #191c17;
		--kgv-red-dark: #f08b87;
		--kgv-shadow: 0 1px 2px rgba(0, 0, 0, 0.4);
		--kgv-shadow-high: 0 10px 26px rgba(0, 0, 0, 0.5);
		color-scheme: dark;
	}
}

:root[data-colorscheme="dark"] {
	--kgv-text: #e8e6e0;
	--kgv-muted: #a6ada4;
	--kgv-line: #3a4038;
	--kgv-area: #22261f;
	--kgv-base: #191c17;
	--kgv-red-dark: #f08b87;
	--kgv-shadow: 0 1px 2px rgba(0, 0, 0, 0.4);
	--kgv-shadow-high: 0 10px 26px rgba(0, 0, 0, 0.5);
	color-scheme: dark;
}

:root[data-colorscheme="light"] { color-scheme: light; }

/* Was sich nicht allein über die Variablen erledigen lässt. Steht nur
   einmal da, weil es an den Variablen hängt und nicht am Modus. */
@media (prefers-color-scheme: dark) {
	:root:not([data-colorscheme="light"]) .kgv-message--ok { background: #1d3a20; color: #cfe8d1; }
	:root:not([data-colorscheme="light"]) .kgv-message--error { background: #40211f; color: #f3c9c7; }
	:root:not([data-colorscheme="light"]) .fc { --fc-today-bg-color: #2b3126; --fc-page-bg-color: transparent; }
}
:root[data-colorscheme="dark"] .kgv-message--ok { background: #1d3a20; color: #cfe8d1; }
:root[data-colorscheme="dark"] .kgv-message--error { background: #40211f; color: #f3c9c7; }
:root[data-colorscheme="dark"] .fc { --fc-today-bg-color: #2b3126; --fc-page-bg-color: transparent; }

body { background: var(--kgv-base); }
.kgv-head { background: var(--kgv-area); }
.kgv-nav a { color: var(--kgv-text); }
.kgv-dialog__box { background: var(--kgv-area); }

/* ==================================================================
   Wer keine Bewegung will, bekommt keine

   Steht am Dateiende, weil es alles aufheben muss, was darüber steht.
   Nicht auf 0 gesetzt, sondern auf 0.01ms: manche Skripte warten auf das
   Ende einer Bewegung (transitionend), und bei Dauer 0 feuert dieses
   Ereignis in einigen Browsern gar nicht.
   ================================================================== */

@media (prefers-reduced-motion: reduce) {
	*, *::before, *::after {
		animation-duration: 0.01ms !important;
		animation-iteration-count: 1 !important;
		transition-duration: 0.01ms !important;
		scroll-behavior: auto !important;
	}
	.kgv-post-card:hover { transform: none; }
	.kgv-post-card:hover img { transform: none; }
	button:active, .kgv-btn:active { transform: none; }
}

@media print {
	.kgv-head, .kgv-footer, .kgv-nav, .kgv-skip, .kgv-head__tools { display: none; }
	body { background: #fff; }
	.kgv-article { border: 0; padding: 0; }
}
