/**
 * Linux und Ich – Ergänzungen, die sich nicht über theme.json abbilden lassen.
 * Alle Grundwerte (Farben, Schrift, Abstände) kommen aus den Global Styles.
 *
 * Breakpoint-Skala (bewusst nur zwei Stufen, beide an WordPress-Kernwerte
 * angelehnt statt frei erfunden):
 *   599px  – "Smartphone": Inhalte ausdünnen (Teaser/Sidebar ausblenden).
 *            Liegt knapp unter dem festen 600px-Kollaps des Core-Nav-Blocks.
 *   781px  – "Tablet/darunter": Layout umbrechen (zweispaltig -> einspaltig,
 *            Header-Aktionen in eigene Zeile). Liegt knapp unter WordPress'
 *            eigenem Adminbar-Breakpoint (782px).
 * Beide Zahlen NICHT ohne Grund verschieben – sie vermeiden Overlap mit den
 * genannten Core-Schwellen bei 600px bzw. 782px.
 */

/* View Transitions: weicher Übergang statt hartem Seitenwechsel zwischen
   Dokumenten. Reines CSS, keine Abhängigkeit – Browser ohne Unterstützung
   navigieren einfach wie bisher (progressive enhancement). Das passende
   view-transition-name je Beitragsbild kommt aus functions.php, damit das
   Aufmacherbild einer Karte sichtbar in das große Artikelbild überblendet. */
@view-transition {
	navigation: auto;
}

/* Dark Mode – automatisch (prefers-color-scheme) ODER manuell über den
   Umschalter im Header, der data-theme="dark"/"light" an <html> setzt
   (siehe interactions.js sowie der früh im <head> laufende Inline-Snippet
   in functions.php, der das Attribut vor dem ersten Rendern anhand von
   localStorage setzt, damit die gewählte Vorliebe nicht kurz aufblitzt).

   Alle Block- und Theme-Styles greifen auf die --wp--preset--color--*
   Custom Properties zu (nicht auf feste Hex-Werte) – ein Überschreiben
   dieser Variablen an :root reicht daher aus, um die gesamte Seite
   umzufärben, ohne jede einzelne Regel doppelt pflegen zu müssen. Die
   Werte stehen zweimal (Media Query + Attribut-Selektor), weil CSS beides
   nicht in einer Bedingung kombinieren kann – die Media-Query greift nur,
   wenn kein manuelles data-theme="light" das System-Dunkel übersteuert. */
@media ( prefers-color-scheme: dark ) {
	:root:not( [data-theme="light"] ) {
		--wp--preset--color--base: #131313;
		--wp--preset--color--base-2: #1e1e1e;
		--wp--preset--color--border: #333333;
		--wp--preset--color--contrast: #f2f1ed;
		--wp--preset--color--muted: #a19e97;
		--wp--preset--color--accent-dark: #ff6600;
	}
	:root:not( [data-theme="light"] ) .lui-header .wp-block-search__input {
		background-color: var( --wp--preset--color--base-2 );
		color: var( --wp--preset--color--contrast );
	}
	:root:not( [data-theme="light"] ) .lui-header .wp-block-search__input::placeholder {
		color: var( --wp--preset--color--muted );
	}
	:root:not( [data-theme="light"] ) .wp-element-button,
	:root:not( [data-theme="light"] ) .wp-block-button:not( .is-style-lui-outline ) .wp-block-button__link {
		color: #ffffff !important;
	}
}
:root[data-theme="dark"] {
	--wp--preset--color--base: #131313;
	--wp--preset--color--base-2: #1e1e1e;
	--wp--preset--color--border: #333333;
	--wp--preset--color--contrast: #f2f1ed;
	--wp--preset--color--muted: #a19e97;
	--wp--preset--color--accent-dark: #ff6600;
}
:root[data-theme="dark"] .lui-header .wp-block-search__input {
	background-color: var( --wp--preset--color--base-2 );
	color: var( --wp--preset--color--contrast );
}
:root[data-theme="dark"] .lui-header .wp-block-search__input::placeholder {
	color: var( --wp--preset--color--muted );
}
:root[data-theme="dark"] .wp-element-button,
:root[data-theme="dark"] .wp-block-button:not( .is-style-lui-outline ) .wp-block-button__link {
	color: #ffffff !important;
}

/* Natives Aussehen von Formularelementen/Scrollbars je nach Modus. Der
   Platz für die vertikale Scrollbar wird IMMER reserviert (auch auf
   Seiten, die gar nicht scrollen, z. B. eine kurze Landingpage) – sonst
   verschiebt sich der nutzbare Breite zwischen einer kurzen und einer
   langen Seite um die Scrollbar-Breite (~15px), und rechtsbündige Elemente
   wie der Dark-Mode-Umschalter im Header springen sichtbar hin und her. */
html {
	color-scheme: light dark;
	scrollbar-gutter: stable;
}
:root[data-theme="dark"] {
	color-scheme: dark;
}
:root[data-theme="light"] {
	color-scheme: light;
}

/* Footer, Kategorie-Badges, Code-Blöcke & Co.: "contrast"/"base" werden
   hier nicht als aktuelle Text-/Hintergrundfarbe, sondern als feste dunkle
   Marken-Farbe verwendet – unabhängig vom Farbmodus der übrigen Seite
   (der Footer ist schon im Light Mode dunkel). Deshalb UNBEDINGT, nicht an
   Dark Mode gekoppelt: Die Werte entsprechen exakt dem, was die jeweiligen
   Grundregeln im Light Mode ohnehin ergeben – hier nur robust gegen das
   Umklappen der Farb-Tokens im Dark Mode gemacht. */
.lui-on-dark .has-base-color,
.lui-on-dark.has-base-color,
.lui-on-dark a,
.lui-on-dark h1,
.lui-on-dark h2,
.lui-on-dark h3,
.lui-on-dark h4,
.lui-on-dark .wp-block-site-title,
.lui-on-dark .wp-block-site-title a {
	/* !important nötig: WPs eigene has-*-color-Utility-Klassen setzen
	   selbst !important, eine normale Regel würde dagegen verlieren. */
	color: #ffffff !important;
}
.lui-on-dark .has-contrast-background-color,
.lui-on-dark.has-contrast-background-color {
	background-color: #1a1a1a !important;
}
.wp-block-post-terms.lui-badge {
	background: #1a1a1a !important;
	color: #ffffff !important;
}
.wp-block-post-terms.lui-badge a {
	color: #ffffff !important;
}
.lui-hero-overlay,
.lui-hero-overlay .wp-block-post-title,
.lui-hero-overlay .wp-block-post-title a {
	color: #ffffff !important;
}
.wp-block-code,
.wp-block-preformatted,
.lui-article-body pre {
	background-color: #1a1a1a !important;
	color: #f5f4f2 !important;
}
/* Tabellen (z. B. die Cookie-Übersicht in der Cookie-Richtlinie) sind in der
   schmalen Artikelspalte oft breiter als die verfügbare Breite – eigener
   Scroll-Container statt Überlauf in die Sidebar/über den Seitenrand
   hinaus. */
.lui-article-body .wp-block-table {
	overflow-x: auto;
	/* Nötig, damit der Scroll-Container innerhalb der Flex-Spalte
	   (.lui-article-col) tatsächlich schrumpft, statt sie aufzudrücken –
	   klassische Flexbox-Falle: ohne min-width:0 ignoriert ein Flex-Kind
	   sein eigenes overflow:auto und wächst stattdessen über den
	   verfügbaren Platz hinaus. */
	min-width: 0;
	max-width: 100%;
}
.lui-article-body .wp-block-table table {
	border-collapse: collapse;
	width: 100%;
}
.lui-article-body .wp-block-table th,
.lui-article-body .wp-block-table td {
	padding: 0.6em 0.8em;
	border: 1px solid var( --wp--preset--color--border );
	text-align: left;
	vertical-align: top;
}
.lui-article-body .wp-block-table th {
	background-color: var( --wp--preset--color--base-2 );
}
.entry-content a[href*='amzn.to']::after,
.entry-content a[href*='amazon.de']::after,
.wp-block-post-content a[href*='amzn.to']::after,
.wp-block-post-content a[href*='amazon.de']::after {
	color: #ffffff !important;
}
.skip-link {
	background: #1a1a1a !important;
	color: #ffffff !important;
}

/* Überschrift in orangefarbenen Boxen (Spenden-CTA, Sidebar): braucht helle
   statt der global dunklen Überschriftfarbe. Als CSS-Regel statt Inline-
   style="" + Block-Attribut – Letzteres serialisierte auf dieser WP-Version
   beim Zurückwandeln offenbar anders als gespeichert ("ungültiger Inhalt"). */
.has-accent-background-color .wp-block-heading {
	color: var( --wp--preset--color--base );
}

.lui-404-code {
	font-family: var( --wp--preset--font-family--mono );
	font-size: 3.5rem;
	font-weight: 700;
}

/* Hinweis-/Warnung-/Tipp-Kästen im Beitragsinhalt ------------------------- */
.lui-callout {
	border-left: 3px solid var( --wp--preset--color--border );
	border-radius: 0 6px 6px 0;
	padding: 1rem 1.25rem;
	margin: 1.75rem 0;
}
.lui-callout > *:first-child {
	margin-top: 0;
}
.lui-callout > *:last-child {
	margin-bottom: 0;
}
.lui-callout-label {
	font-family: var( --wp--preset--font-family--mono );
	font-weight: 700;
	text-transform: uppercase;
	font-size: var( --wp--preset--font-size--small );
	letter-spacing: 0.04em;
	margin: 0 0 0.5em !important;
}
.lui-callout.is-info {
	border-left-color: var( --wp--preset--color--info );
	background: color-mix( in srgb, var( --wp--preset--color--info ) 7%, var( --wp--preset--color--base ) );
}
.lui-callout.is-info .lui-callout-label {
	color: var( --wp--preset--color--info );
}
.lui-callout.is-warning {
	border-left-color: var( --wp--preset--color--warning );
	background: color-mix( in srgb, var( --wp--preset--color--warning ) 7%, var( --wp--preset--color--base ) );
}
.lui-callout.is-warning .lui-callout-label {
	color: var( --wp--preset--color--warning );
}
.lui-callout.is-tip {
	border-left-color: var( --wp--preset--color--tip );
	background: color-mix( in srgb, var( --wp--preset--color--tip ) 7%, var( --wp--preset--color--base ) );
}
.lui-callout.is-tip .lui-callout-label {
	color: var( --wp--preset--color--tip );
}

/* Alt-Beiträge (bis in aktuelle Artikel hinein, 56 Beiträge betroffen)
   markieren Hinweis-/Update-Absätze manuell mit einer WordPress-Standard-
   Palettenfarbe statt der theme-eigenen .lui-callout-Klasse – jeder Beitrag
   in eigenen, teils uneinheitlichen Farbtönen. Statt jeden einzeln zu
   bearbeiten, bilden wir die dabei verwendeten Kernfarben hier automatisch
   auf denselben Callout-Stil ab. Rein optisch, der Beitragsinhalt (Klassen)
   bleibt unverändert – funktioniert daher auch für zukünftige Beiträge mit
   derselben Angewohnheit. */
.lui-article-body p[class*='has-pale-cyan-blue-background-color'],
.lui-article-body p[class*='has-cyan-bluish-gray-background-color'],
.lui-article-body p[class*='has-vivid-red-background-color'],
.lui-article-body p[class*='has-vivid-green-cyan-background-color'],
.lui-article-body p[class*='has-light-green-cyan-background-color'],
.lui-article-body p[class*='has-luminous-vivid-amber-background-color'],
.lui-article-body p[class*='has-luminous-vivid-orange-background-color'] {
	border-left: 3px solid var( --wp--preset--color--info );
	border-radius: 0 6px 6px 0;
	padding: 1rem 1.25rem !important;
	margin: 1.75rem 0;
	background: color-mix( in srgb, var( --wp--preset--color--info ) 7%, var( --wp--preset--color--base ) ) !important;
	color: inherit !important;
}
.lui-article-body p[class*='has-vivid-red-background-color'] {
	border-left-color: var( --wp--preset--color--warning );
	background: color-mix( in srgb, var( --wp--preset--color--warning ) 7%, var( --wp--preset--color--base ) ) !important;
}
.lui-article-body p[class*='has-luminous-vivid-amber-background-color'],
.lui-article-body p[class*='has-luminous-vivid-orange-background-color'] {
	border-left-color: var( --wp--preset--color--warning );
	background: color-mix( in srgb, var( --wp--preset--color--warning ) 7%, var( --wp--preset--color--base ) ) !important;
}
.lui-article-body p[class*='has-vivid-green-cyan-background-color'],
.lui-article-body p[class*='has-light-green-cyan-background-color'] {
	border-left-color: var( --wp--preset--color--tip );
	background: color-mix( in srgb, var( --wp--preset--color--tip ) 7%, var( --wp--preset--color--base ) ) !important;
}
/* Der Absatztext wird oben per color:inherit lesbar – Links darin waren im
   alten Editor aber oft zusätzlich über eine eigene "Element"-Linkfarbe
   (has-link-color, WordPress erzeugt dafür eine eindeutig nummerierte
   .wp-elements-N a-Regel) auf Weiß gesetzt, passend zum ursprünglich
   satten Hintergrund. Bei unserem deutlich helleren Callout-Hintergrund
   wäre das kaum noch lesbar – hier unabhängig von der jeweiligen Element-
   Nummer auf die reguläre Akzentfarbe zurückgesetzt. */
.lui-article-body p[class*='has-pale-cyan-blue-background-color'] a,
.lui-article-body p[class*='has-cyan-bluish-gray-background-color'] a,
.lui-article-body p[class*='has-vivid-red-background-color'] a,
.lui-article-body p[class*='has-vivid-green-cyan-background-color'] a,
.lui-article-body p[class*='has-light-green-cyan-background-color'] a,
.lui-article-body p[class*='has-luminous-vivid-amber-background-color'] a,
.lui-article-body p[class*='has-luminous-vivid-orange-background-color'] a {
	color: var( --wp--preset--color--accent ) !important;
	text-decoration: underline;
}

/* Inline-Code im Fließtext (nicht die Code-Block-Anzeige, siehe theme.json core/code). */
:where( .wp-block-post-content, .entry-content ) :where( p, li, h1, h2, h3, h4, h5, h6 ) code {
	font-family: var( --wp--preset--font-family--mono );
	font-size: 0.875em;
	background: var( --wp--preset--color--base-2 );
	color: var( --wp--preset--color--accent-dark );
	padding: 0.15em 0.4em;
	border-radius: 4px;
}

/* Marken-Element: das "L" aus dem Logo, per CSS-Maske einfärbbar --------- */
/* Wird als wiederkehrendes Grafikelement genutzt: Eyebrow-Icons vor
   Sektionstiteln, Aufzählungspunkte in der Sidebar, Wasserzeichen in
   Footer/Zitaten, Leer-Zustände. Eine einzige SVG-Datei (assets/images/
   l-glyph.svg) statt – wie zuvor – vier separat handkodierter Data-URIs
   mit je fest einprogrammierter Farbe: Als Maske eingebunden lässt sich
   die Form an jeder Stelle einfach über background-color/opacity gemäß
   dem jeweiligen Farb-Token einfärben, auch pro Dark-Mode-Override. */
.lui-section-title::before,
.lui-sidebar .wp-block-categories li::before,
.lui-on-dark::after,
.wp-block-query-no-results::before,
.wp-block-quote::after {
	-webkit-mask-image: url( '../images/l-glyph.svg' );
	mask-image: url( '../images/l-glyph.svg' );
	-webkit-mask-size: contain;
	mask-size: contain;
	-webkit-mask-repeat: no-repeat;
	mask-repeat: no-repeat;
}
.lui-section-title {
	display: flex;
	align-items: center;
	gap: 0.5em;
}
.lui-section-title::before {
	content: '';
	display: inline-block;
	width: 0.7em;
	height: 0.7em;
	flex-shrink: 0;
	background-color: var( --wp--preset--color--accent );
}

/* Kategorie-Spotlight-Boxen: eigene Akzentfarbe je Sektion über die Custom
   Property --lui-spotlight-color. Bewusst per CSS-Klasse gesetzt und NICHT
   per Inline-style="" am Block: Ein Inline-Style ohne passendes Block-
   Attribut lässt den Block-Editor den Block als "ungültig" melden, weil er
   sich beim Nachbauen aus den gespeicherten Attributen nicht reproduzieren
   lässt. Eine neue Kategorie-Box braucht dadurch nur eine zusätzliche
   Klasse + eine Zeile CSS (siehe .is-android unten) statt einer kompletten
   Regel-Kopie wie früher. Ohne eigene Klasse greift automatisch die normale
   Akzentfarbe. */
.lui-category-spotlight {
	border-top: 3px solid var( --lui-spotlight-color, var( --wp--preset--color--accent ) );
}
.lui-category-spotlight .lui-section-title::before {
	background-color: var( --lui-spotlight-color, var( --wp--preset--color--accent ) );
}
.lui-category-spotlight.is-android {
	--lui-spotlight-color: #0099ff;
}

/* "Weitere Themen" (Startseite): je eine Kachel für Allgemein, Hardware,
   Netz-/Politik, Webdesign/-hosting. Anders als bei .lui-category-spotlight
   oben (eine Akzentfarbe für die ganze Sektion, da dort nur EINE Kategorie
   gezeigt wird) trägt hier jede Kachel ihre EIGENE Kategoriefarbe – dieselben
   Farbwerte wie beim Bild-Platzhalter weiter oben (.category-hardware etc.).
   Farbklasse bewusst DIREKT am Label (lui-topic-{slug}, siehe
   templates/front-page.html), nicht wie zunächst versucht über
   ".category-{slug} .lui-topic-label": Das Label steht als eigener Absatz
   VOR dem jeweiligen Query-Loop-Block, WordPress hängt die category-{slug}-
   Klasse aber nur an das <li> INNERHALB der Query-Loop-Ausgabe – Label und
   category-Klasse haben in diesem Aufbau gar keine Vorfahre-Nachfahre-
   Beziehung, der Ahnen-Selektor konnte hier also nie greifen. Der
   Farbbalken sitzt als Unterstreichung UNTER dem Text-Label (nicht als
   Rahmen am Kachelbild selbst) – dort sah er optisch wie eine unpassende
   Kante über dem Beitragsbild aus. */
.lui-topic-label {
	font-family: var( --wp--preset--font-family--mono );
	font-size: var( --wp--preset--font-size--small );
	font-weight: 700;
	text-transform: uppercase;
	letter-spacing: 0.03em;
	margin: 0 0 0.75em;
	padding-bottom: 0.5em;
	border-bottom: 3px solid var( --wp--preset--color--contrast-2 );
}
.lui-topic-label a {
	color: inherit;
	text-decoration: none;
}
.lui-topic-allgemein {
	color: #52525b;
	border-bottom-color: #52525b;
}
.lui-topic-hardware {
	color: #b45309;
	border-bottom-color: #b45309;
}
.lui-topic-politik {
	color: #2563eb;
	border-bottom-color: #2563eb;
}
.lui-topic-webhosting {
	color: #0693e3;
	border-bottom-color: #0693e3;
}

/* Bug: Im Querformat auf Smartphones standen die 4 "Weitere Themen"-Kacheln
   untereinander statt nebeneinander, obwohl für dieselbe Bildschirmbreite
   quer genug Platz für 2 pro Zeile da wäre – anders als bei den
   Grid-basierten 4er-Reihen weiter oben ("Aus der Kategorie GNU/Linux" /
   Android, wp:post-template mit layout:grid), die erst deutlich schmaler
   auf weniger Spalten reduzieren. Ursache: Diese Kacheln stecken in vier
   wp:column-Blöcken (core/columns), und Core selbst erzwingt für JEDEN
   wp:columns-Block ohne "isStackedOnMobile":false einen kompletten
   Ein-Spalten-Stack bereits ab 781px (siehe wp-includes/blocks/columns/
   style.min.css) – deutlich breiter als die 599px-Schwelle, die der Rest
   der Seite für "Smartphone" verwendet. Landscape-Handys liegen oft genau
   dazwischen (~700–780px CSS-Breite) und fielen dadurch schon unter Cores
   Stack-Regel, lange bevor die Seite selbst eng wird.
   Fix: In genau dieser Lücke (600–781px) alle 4 Kacheln in EINER Zeile
   erzwingen – wie bei den Grid-Sektionen darüber, und wie vom Nutzer
   bestätigt (4x1 statt 2x2). Echte Stapelung bleibt wie überall sonst auf
   der Seite erst unterhalb von 600px.
   Reines "25%" reichte dabei nicht: Der blockGap zwischen den Spalten
   (var:preset|spacing|30, siehe wp:columns-Attribut in front-page.html)
   zählt nicht zur Prozentbreite dazu – vier Kacheln à 25% PLUS drei Gaps
   dazwischen sind dadurch minimal breiter als die Zeile, wodurch der
   Flex-Umbruch trotzdem umbrach. Die drei Gaps (zwischen 4 Kacheln) müssen
   daher per calc() anteilig von jeder Kachel abgezogen werden. */
@media ( min-width: 600px ) and ( max-width: 781px ) {
	.lui-topic-row .wp-block-columns > .wp-block-column {
		flex-basis: calc( 25% - ( 3 * var( --wp--preset--spacing--30 ) / 4 ) ) !important;
	}
}

/* Vorschläge bei leerer Suche ([lui_search_suggestions], siehe functions.php)
   – im selben Karten-Stil wie "Ähnliche Beiträge" unter Artikeln
   (.lui-related-card, siehe templates/single.html), als festes 2x2-Raster
   statt der dortigen responsiven Spaltenzahl: Hier gibt es klar getrennt
   GENAU zwei Vier-Karten-Gruppen (Meistgelesen/Zum Entdecken), 2x2 macht
   diese Gruppierung visuell sofort erkennbar. Unter 600px (wie bei
   WordPress' eigenem Grid-Layout, siehe post-template/style.min.css)
   einspaltig, damit die Karten auf schmalen Bildschirmen nicht gequetscht
   werden. */
.lui-search-suggestions {
	margin-top: var( --wp--preset--spacing--50 );
	/* .wp-block-query-no-results (siehe "Leerer Zustand" weiter unten) setzt
	   text-align:center für den "keine Beiträge gefunden"-Hinweistext direkt
	   darüber – dieser Block hier sitzt im selben Container und hat das bisher
	   geerbt, wodurch Titel/Auszug in den Karten mittig statt wie beim Vorbild
	   linksbündig standen. */
	text-align: left;
}
.lui-search-suggestions-grid {
	display: grid;
	grid-template-columns: repeat( 2, 1fr );
	gap: var( --wp--preset--spacing--30 );
	margin-top: 0.75em;
}
@media ( max-width: 600px ) {
	.lui-search-suggestions-grid {
		grid-template-columns: 1fr;
	}
}

/* Bild-Platzhalter (.lui-media-frame / .lui-hero ohne Beitragsbild, siehe
   dort): Farbe je Kategorie über --lui-fallback-color, gesetzt anhand der
   category-{slug}-Klasse, die WordPress automatisch an das umschließende
   <li> jedes Beitrags in einer Query hängt. GNU/Linux und Allgemein bleiben
   bewusst ohne eigenen Eintrag (neutrales Anthrazit als Standard-/Marken-
   Look, da GNU/Linux die weit überwiegende Mehrheit der Beiträge stellt). */
.category-android .lui-media-frame:not( :has( img ) ),
.category-android .lui-hero:not( :has( img ) ) {
	--lui-fallback-color: #0099ff;
}
.category-hardware .lui-media-frame:not( :has( img ) ),
.category-hardware .lui-hero:not( :has( img ) ) {
	--lui-fallback-color: #b45309;
}
.category-politik .lui-media-frame:not( :has( img ) ),
.category-politik .lui-hero:not( :has( img ) ) {
	--lui-fallback-color: #2563eb;
}
.category-news .lui-media-frame:not( :has( img ) ),
.category-news .lui-hero:not( :has( img ) ) {
	--lui-fallback-color: #dc2626;
}
.category-raspberry-pi .lui-media-frame:not( :has( img ) ),
.category-raspberry-pi .lui-hero:not( :has( img ) ) {
	--lui-fallback-color: #c51a4a;
}
.category-spass .lui-media-frame:not( :has( img ) ),
.category-spass .lui-hero:not( :has( img ) ) {
	--lui-fallback-color: #9b51e0;
}
.category-sport-outdoor .lui-media-frame:not( :has( img ) ),
.category-sport-outdoor .lui-hero:not( :has( img ) ) {
	--lui-fallback-color: #16a34a;
}
.category-webhosting .lui-media-frame:not( :has( img ) ),
.category-webhosting .lui-hero:not( :has( img ) ) {
	--lui-fallback-color: #0693e3;
}
.category-webos .lui-media-frame:not( :has( img ) ),
.category-webos .lui-hero:not( :has( img ) ) {
	--lui-fallback-color: #6366f1;
}

/* Verlinkter Sektionstitel + "Mehr"-Link (Kategorie-Boxen, Neueste Artikel) */
.lui-section-title a {
	color: inherit;
	text-decoration: none;
}
.lui-section-title a:hover {
	color: var( --wp--preset--color--accent );
}
.lui-category-spotlight .lui-section-title a:hover {
	color: var( --lui-spotlight-color, var( --wp--preset--color--accent ) );
}
.lui-more-link {
	font-family: var( --wp--preset--font-family--mono );
	font-size: var( --wp--preset--font-size--small );
	font-weight: 600;
	text-transform: uppercase;
	letter-spacing: 0.02em;
}
.lui-more-link a {
	color: var( --wp--preset--color--accent );
	text-decoration: none;
}
.lui-more-link a:hover {
	text-decoration: underline;
}
.lui-category-spotlight .lui-more-link a {
	color: var( --lui-spotlight-color, var( --wp--preset--color--accent ) );
}

/* Barrierefreiheit: Skip-Link -------------------------------------------- */
.skip-link {
	background: var( --wp--preset--color--contrast );
	color: var( --wp--preset--color--base );
	padding: 0.75em 1.25em;
	position: fixed;
	top: -100px;
	left: 1rem;
	z-index: 100000;
	transition: top 0.2s ease;
	border-radius: 0 0 4px 4px;
}
.skip-link:focus {
	top: 0;
}

:focus-visible {
	outline: 3px solid var( --wp--preset--color--accent );
	outline-offset: 2px;
}

/* Zweispaltige Ansichten (Artikel/Blog/Archiv + Sidebar): die Breite kommt
   jetzt direkt über die native "align":"wide"-Klasse (der äußere <main>
   ist dafür "constrained", exakt wie .lui-header um .lui-header-row) –
   eine eigene max-width-Formel daneben hatte zuvor bei bestimmten
   Breiten ein paar Pixel abweichende Werte erzeugt (Header und Inhalt
   liefen dadurch leicht auseinander), weil sie root-padding anders
   berücksichtigte als WordPress' eigener alignwide-Mechanismus. */
@media ( max-width: 781px ) {
	.lui-two-col {
		flex-wrap: wrap !important;
	}
}

/* Artikel-/Listenspalte: proportionaler Flex-Anteil statt festem Breiten-
   deckel, damit Inhalt + Seitenleiste zusammen die volle Breite des
   Headers (wide-size) ausfüllen, nicht nur der äußere Container. Bewusst
   kein eigenes max-width auf inneren Blöcken mehr – nur hier, an einer
   Stelle. */
.lui-article-col {
	flex: 1 1 68%;
	min-width: 0;
}

/* Überschreibt Gutenbergs eigene, per verticalAlignment:"top" erzeugte
   Layout-Klasse (align-items:flex-start): Die Sidebar-Spalte soll auf die
   volle Höhe der (meist deutlich längeren) Artikelspalte gestreckt werden.
   Nötig, damit der "Blog unterstützen"-Kasten (position: sticky, siehe
   Sidebar-Regeln weiter unten) einen Rahmen hat, der bis zum Artikelende
   reicht – sonst würde er schon nach der eigenen, kurzen Sidebar-Höhe
   "andocken" statt bis zum Footer mitzuscrollen. Sichtbar ändert das
   nichts: Die einzelnen Sidebar-Kästen bleiben weiterhin oben ausgerichtet. */
.lui-two-col {
	align-items: stretch !important;
}
/* align-items:stretch allein reicht nicht: Zwischen dem gestreckten Flex-Item
   (.lui-sidebar-col, className am wp:group um den Sidebar-Template-Part in
   single.html/page.html) und dem eigentlichen .lui-sidebar liegt noch
   WordPress' eigener .wp-block-template-part-Wrapper. Ein Block-Kind erbt die
   gestreckte Höhe seines Flex-Eltern-Elements nicht automatisch (nur der
   Flex-Item selbst bekommt eine definierte Höhe) – die Kette muss über
   height:100% manuell bis zu .lui-sidebar durchgereicht werden, sonst bricht
   der sticky-Kontext schon bei der kurzen, natürlichen Sidebar-Höhe ab. */
.lui-sidebar-col > .wp-block-template-part,
.lui-sidebar-col > .wp-block-template-part > .lui-sidebar {
	height: 100%;
}

/* Container Query: horizontale Artikel-Karte (Bild links, Text rechts) -----
   Dieselbe Karte steckt in vier Templates (Startseite "Neueste Artikel",
   Blog-Übersicht, Archiv, Suche) mal neben einer Sidebar, mal ohne – die
   verfügbare Breite hängt also vom jeweiligen Template ab, nicht von der
   Viewport-Breite. Eine Viewport-Media-Query könnte das nicht abbilden;
   die Karte fragt daher ihre EIGENE gerenderte Breite ab und bricht bei
   echter Enge selbst um, unabhängig davon, wo sie eingebaut ist. */
/* Bild/Text-Aufteilung der Karte: als CSS-Regel statt über WordPress'
   Child-Layout-Attribute (style.layout.selfStretch/flexSize). Letzteres
   erzeugte auf dieser WP-Version beim Zurückserialisieren im Editor eine
   andere style="" als gespeichert -> "ungültiger Inhalt" bei jeder Karte
   der Query (das Post-Template steckt in jedem Ergebnis identisch). */
/* flex-shrink:0 + width (zusätzlich zu flex-basis) verhindert, dass die
   Bildspalte je nach Textlänge von Titel/Auszug im jeweiligen Beitrag
   unterschiedlich stark schrumpft – ohne das hätte z. B. ein Beitrag mit
   langem Titel ein sichtbar schmaleres Thumbnail als einer mit kurzem. */
.lui-list-card > .lui-media-frame {
	flex-basis: 240px;
	flex-shrink: 0;
	width: 240px;
}
.lui-list-card-body {
	flex-grow: 1;
}
/* Nutzerwunsch: Etwas mehr Abstand zwischen Thumbnail und Text (Titel/
   Meta/Auszug) – einheitlich überall, wo .lui-list-card zum Einsatz kommt
   (Blog-Übersicht, Kategorie-/Tag-/Autor-Archive, Suche, "Neueste
   Artikel" auf der Startseite: home.html, index.html, archive.html,
   author.html, search.html, page-blog.html, front-page.html nutzen alle
   dieselbe Klasse mit identischem blockGap). Der Standard-Abstand kommt
   aus dem Block-Attribut "blockGap":"var:preset|spacing|20" (1rem) als
   WordPress-generierte, spezifitätsgleiche Regel – !important nötig, um
   ihn unabhängig von der Lade-Reihenfolge zuverlässig zu überschreiben,
   ohne alle sieben Templates einzeln anfassen zu müssen. */
.lui-list-card {
	gap: var( --wp--preset--spacing--30 ) !important;
}
/* Basis-Flex-Layout hier explizit statt nur über WordPress' generierte
   is-layout-flex-Klassen (die nur bei echten Gutenberg-Blöcken entstehen):
   [lui_search_suggestions] baut dieselbe Kartenklasse auch als reines
   PHP-HTML auf (siehe functions.php) und braucht die Flex-Anordnung daher
   unabhängig von Block-Editor-Attributen. */
.lui-related-card {
	display: flex;
	flex-wrap: nowrap;
	align-items: flex-start;
	gap: var( --wp--preset--spacing--20 );
}
/* Textspalte explizit auf flex-grow schalten: Ohne eigenes flex-grow (Default
   0) bestimmt allein der Inhalt ihre Breite statt den verbleibenden Platz in
   der Zeile auszufüllen – Titel/Auszug hätten dadurch ungleichmäßig schmal
   umgebrochen und wirkten "unsauber" statt wie beim Vorbild in
   templates/single.html sauber bis zum Kartenrand zu laufen. min-width:0
   verhindert außerdem, dass ein einzelnes langes Wort im Titel die Spalte
   über die verfügbare Breite hinaus aufdrückt. margin-top:0 nimmt dem Titel
   den Standard-Absatz-Abstand einer Überschrift, damit er wirklich bündig
   mit der Bildoberkante beginnt statt sichtbar tiefer anzusetzen.
   margin-bottom:0 ebenso wichtig wie margin-top:0 – sonst bleibt trotz des
   knappen .lui-clamp-2-Abstands (0.25rem, siehe unten) eine große Lücke
   zwischen Titel und Auszug übrig, weil der Standard-Überschriftenabstand
   NACH dem Titel genauso groß ist wie DAVOR. */
.lui-related-card-body {
	flex: 1 1 0%;
	min-width: 0;
}
.lui-related-card-body .wp-block-post-title {
	margin-top: 0;
	margin-bottom: 0;
}
.lui-related-card > .lui-media-frame {
	flex-basis: 120px;
	flex-shrink: 0;
	width: 120px;
}

/* Datenschutzfreundliche Video-Vorschau (YouTube/Vimeo) ---------------------
   Ersetzt per PHP-Filter (lui_privacy_video_embed_facade()) den eigentlichen
   iframe durch dieses <button>-Element mit lokal zwischengespeichertem
   Thumbnail; nach Klick (interactions.js) durch einen echten <iframe
   class="lui-video-iframe"> ersetzt.
   Größe bewusst komplett EIGENSTÄNDIG per aspect-ratio, nicht über
   WordPress' .wp-has-aspect-ratio/.wp-block-embed__wrapper-Mechanismus:
   Der existiert nur bei per Gutenberg-Embed-Block eingefügten Videos, nicht
   bei klassischen Alt-Beiträgen mit einer bloßen Video-URL in eigenem
   Absatz (WP_Embed::autoembed() statt Block-Rendering) – dort blieb die
   Vorschau (und v. a. der nach Klick eingefügte iframe) mangels jeder
   Größenangabe unsichtbar/funktionslos. Bei Embed-Blöcken steckt dieses
   Markup zwar weiterhin im alten Wrapper, dessen eigener Höhen-Reservierungs-
   Trick (padding-top am ::before) wird über :has() weiter unten deaktiviert,
   damit nicht zusätzlich zur eigenen aspect-ratio noch einmal Höhe reserviert
   wird (sonst unschöner Extra-Leerraum). */
.lui-video-facade,
.lui-video-iframe {
	display: block;
	width: 100%;
	aspect-ratio: 16 / 9;
	margin: 0;
	border: 0;
	border-radius: 8px;
}
/* !important nötig: WordPress' eigene Core-Regel für Embed-Blöcke
   (".wp-embed-responsive .wp-has-aspect-ratio iframe", 2 Klassen + Element
   = höhere Spezifität als ".lui-video-iframe" allein) setzt den iframe nach
   dem Klick auf position:absolute + height:100% – gedacht, um die per
   padding-top am wrapper::before reservierte Höhe auszufüllen. Genau diese
   Reservierung wird aber weiter oben (".wp-block-embed__wrapper:has(
   .lui-video-embed )::before { display:none !important; }") bewusst
   abgeschaltet, damit die Fassade nicht zusätzlich zur eigenen aspect-ratio
   noch einmal Leerraum bekommt (siehe Kommentar dort). Ohne diesen
   Gegen-Override hier hätte der Wrapper dadurch aber keine tatsächliche
   Höhe mehr, gegen die sich height:100% auflösen könnte – der absolut
   positionierte iframe kollabierte auf 0px Höhe (Video unsichtbar, Ton lief
   trotzdem weiter, da der Player selbst technisch einwandfrei lädt).
   position:static holt den iframe zurück in den normalen Textfluss, wo er
   sich wie die Fassade eigenständig über aspect-ratio bemisst. */
.lui-video-iframe {
	position: static !important;
	height: auto !important;
	inset: auto !important;
}
/* !important nötig: Trotz höherer Selektor-Spezifität als WordPress' Core-
   Regel (.wp-has-aspect-ratio .wp-block-embed__wrapper::before) gewinnt auf
   der Live-Seite nachweislich weiterhin Cores eigene Regel (per
   getComputedStyle bestätigt: ::before blieb trotz dieser Regel auf
   display:block mit ~334px reserviertem padding-top) – vermutlich verändert
   WP Fastest Caches Combine/Minify-CSS die eigentliche Ladereihenfolge der
   Stylesheets. Nutzerbericht: großer Leerraum oberhalb der Video-Fassade in
   Artikeln mit per Gutenberg-Embed-Block eingebettetem Video, weil dieser
   Höhen-Reservierungs-Trick (für einen absolut positionierten <iframe>
   gedacht) bei unserer eigenständig per aspect-ratio dimensionierten
   Fassade (siehe Kommentar weiter oben) ungenutzt zusätzlichen Platz
   beanspruchte. */
.wp-block-embed__wrapper:has( .lui-video-embed )::before {
	display: none !important;
}
/* Reset des UA-Standardabstands auf <figure> (sonst zusätzlicher, hier
   unerwünschter Einzug/Abstand) – eigener, an die übrigen Absätze
   angeglichener Abstand stattdessen. */
.lui-video-embed {
	margin: 1.5em 0;
}
.lui-video-facade {
	position: relative;
	padding: 0;
	overflow: hidden;
	background: #000;
	cursor: pointer;
}
.lui-video-facade img {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	object-fit: cover;
	display: block;
}
.lui-video-facade-play {
	position: absolute;
	top: 50%;
	left: 50%;
	transform: translate( -50%, -50% );
	width: 68px;
	height: 68px;
	border-radius: 50%;
	background: var( --wp--preset--color--accent );
	display: flex;
	align-items: center;
	justify-content: center;
	transition: transform 0.2s ease;
}
.lui-video-facade-play::before {
	content: '';
	margin-left: 4px;
	border-style: solid;
	border-width: 12px 0 12px 20px;
	border-color: transparent transparent transparent #ffffff;
}
.lui-video-facade:hover .lui-video-facade-play,
.lui-video-facade:focus-visible .lui-video-facade-play {
	transform: translate( -50%, -50% ) scale( 1.08 );
}
.lui-video-facade-note {
	position: absolute;
	left: 0;
	right: 0;
	bottom: 0;
	margin: 0;
	padding: 0.5em 0.9em;
	font-size: 0.8rem;
	line-height: 1.3;
	color: #ffffff;
	text-align: left;
	background: linear-gradient( to top, rgba( 0, 0, 0, 0.75 ), rgba( 0, 0, 0, 0 ) );
}

/* container-type sitzt bewusst NICHT auf .lui-list-card selbst: Ein Element
   ist nie sein eigener Query-Container (Containment-Kontext gilt nur für
   Nachfahren) – die @container-Regel unten hätte dadurch NIE gegriffen,
   unabhängig von der tatsächlichen Breite. Sichtbar u. a. auf /blog/ und bei
   "Neueste Artikel" auf der Startseite: Auf schmalen Viewports blieb das
   Bild-neben-Text-Layout bestehen, Titel/Auszug/Meta quetschten sich in
   eine winzige Restspalte statt darunter umzubrechen. Fix: Containment eine
   Ebene höher am Query-Wrapper (per :has() nur dort, wo tatsächlich
   .lui-list-card drinsteckt) – .lui-list-card ist dessen Nachfahre und kann
   dagegen korrekt abgefragt werden. */
.wp-block-query:has( .lui-list-card ) {
	container-type: inline-size;
}
/* Schwelle bewusst bei 599px (Site-Breakpoint "Smartphone", siehe Skala
   oben) statt eines frei gewählten, engeren Werts: .lui-latest-articles-aside
   wird an genau dieser Stelle ausgeblendet und die Karte dadurch auf 100%
   Breite gesetzt – bei einer engeren Container-Schwelle (z. B. 480px) gäbe
   es sonst eine Zwischenzone knapp darüber, in der die Karte zwar schon
   volle Breite hat, aber noch im Bild-neben-Text-Layout verharrt und die
   Textspalte trotzdem zu schmal für Titel/Auszug/Meta ist (genau so auf
   einem ~500px breiten Viewport beobachtet). */
@container ( max-width: 599px ) {
	.lui-list-card {
		flex-direction: column;
	}
	.lui-list-card > .lui-media-frame {
		flex-basis: auto;
		width: 100%;
	}
}

/* Header --------------------------------------------------------------------
   position:sticky sitzt am umschließenden <header class="wp-block-template-part">,
   nicht am .lui-header selbst: WordPress' Template-Part-Wrapper ist exakt so
   hoch wie der Header und bietet dem inneren Element sonst keinen Raum zum
   "Kleben" – das Ergebnis wäre ein Header, der beim Scrollen sofort verschwindet. */
header.wp-block-template-part {
	position: sticky;
	top: var( --wp-admin--admin-bar--height, 0px );
	z-index: 999;
}
/* Smartphone quer gehalten: Die Navigation zeigt bei dieser Breite noch
   ihre echten Menüpunkte statt des Hamburgers (genug Platz in der Zeile),
   Menüzeile und Suchleiste/Icons passen dadurch aber nicht mehr mit dem
   Logo in eine Reihe und brechen in zwei zusätzliche Zeilen um – bei der
   knappen Bildschirmhöhe im Querformat frisst der dauerhaft angepinnte,
   dreizeilige Header dann einen Großteil der Lesefläche. Fix: Bei knapper
   Höhe im Querformat nicht mehr sticky, sondern normal im Textfluss –
   der Header scrollt beim Lesen wie gewohnt mit nach oben weg. */
@media ( max-height: 500px ) and ( orientation: landscape ) {
	header.wp-block-template-part {
		position: static;
	}
}
/* Nutzerwunsch: Im selben Querformat-Fall soll zusätzlich die Menüzeile
   (echte Menüpunkte, kein Hamburger – siehe oben) mit in die Zeile von
   Logo/Titel wandern statt eine eigene Zeile zu belegen, rechtsbündig, um
   weiter vertikalen Platz zu sparen. .lui-header-actions (umschließt Nav +
   Suchleiste/Icons) wird dafür per display:contents aus dem Layout
   "aufgelöst" – seine Kinder (Nav, .lui-header-tools) werden dadurch zu
   direkten Flex-Items von .lui-header-row, genau wie .lui-header-brand.
   .lui-header-row bekommt flex-wrap:wrap, damit Elemente, die nicht mehr
   passen, umbrechen dürfen; .lui-header-tools bekommt flex-basis:100% –
   ein volle-Breite-Flex-Item erzwingt zuverlässig einen Zeilenumbruch VOR
   sich selbst, ohne dass Nav (das bleibt daneben passen) mit umbricht. Die
   Nav selbst behält ihr bestehendes flex-grow:1 plus ihre eigene
   justifyContent:"right"-Ausrichtung (siehe parts/header.html) – sie füllt
   dadurch den verbleibenden Platz neben dem Logo und richtet ihre
   Menüpunkte darin nach rechts aus, ganz ohne zusätzliche Positionierung.
   Nutzerwunsch als Folge-Feinschliff: Auch die zweite Zeile (Suchfeld +
   Icons, .lui-header-tools) soll rechtsbündig stehen statt wie zuvor
   linksbündig unter dem Logo zu beginnen – dafür genügt
   justify-content:flex-end auf .lui-header-tools selbst (die Gruppe ist
   bereits ein eigener Flex-Container für ihre Kinder). */
@media ( max-height: 500px ) and ( orientation: landscape ) {
	.lui-header-row {
		flex-wrap: wrap !important;
	}
	.lui-header-actions {
		display: contents !important;
	}
	.lui-header-tools {
		flex-basis: 100% !important;
		justify-content: flex-end !important;
	}
}
.lui-header {
	background: var( --wp--preset--color--base );
	border-bottom: 1px solid var( --wp--preset--color--border );
	transition: box-shadow 0.2s ease;
}
.lui-header.is-scrolled {
	box-shadow: 0 4px 16px rgba( 0, 0, 0, 0.08 );
}
.lui-header .wp-block-navigation a {
	text-decoration: none;
}
.lui-header .wp-block-navigation-item.current-menu-item > a {
	color: var( --wp--preset--color--accent );
}

/* Logo + Claim dürfen nicht schrumpfen/umbrechen – sonst reißt "Linux und
   Ich" bei vollem Menü in zwei Zeilen. Der Nav-Block darf dafür wie gehabt
   umbrechen (er hat sein eigenes Verhalten für schmale Breiten). */
.lui-header-brand {
	flex-shrink: 0;
}
.lui-header-brand .wp-block-site-title,
.lui-header-brand .wp-block-site-title a {
	white-space: nowrap;
}

/* Logo verlinkt wie der Site-Titel daneben auf die Startseite. display:flex
   statt des <a>-Default-inline verhindert einen kleinen Inline-Baseline-
   Abstand unter dem SVG, der die 40px-Logohöhe sonst leicht verfälscht. */
.lui-logo-link {
	display: flex;
}

/* Social-Icons: immer in einer Zeile, nicht durch das is-layout-flex-Default
   (flex-wrap: wrap) untereinander gestapelt, wenn der Header eng wird. */
.lui-header .wp-block-social-links {
	flex-wrap: nowrap;
	flex-shrink: 0;
}
.lui-header .wp-block-social-links .wp-block-social-link {
	flex-shrink: 0;
}
/* Menü + Cmd-K-Hinweis + 320px-Suchfeld + Social-Icons + Dark-Mode-Button
   passen neben Logo/Titel nie zuverlässig in eine Zeile: die Kopfzeile ist
   "alignwide" und damit unabhängig von der Viewport-Breite immer auf
   theme.json's wideSize (1200px) gedeckelt – ein breiterer Bildschirm
   schafft hier also keinen zusätzlichen Platz. Die zweite Gruppe (Menü,
   Suche, Icons) bekommt deshalb grundsätzlich eine eigene, volle Zeile;
   das gibt ihr die vollen 1200px statt nur den Rest neben dem Logo. */
.lui-header-row {
	flex-wrap: wrap !important;
	row-gap: var( --wp--preset--spacing--20 );
}
.lui-header-actions {
	flex-basis: 100%;
	justify-content: space-between;
}

/* Innerhalb der Actions-Zeile konkurrieren Menü und die Gruppe aus
   Cmd-K-Hinweis/Suche/Icons/Dark-Mode-Button um denselben Platz. Passen
   beide nicht nebeneinander, soll das MENÜ als Ganzes in die nächste Zeile
   umbrechen (und dort die volle Breite für seine eigenen Links bekommen) –
   nicht jeder einzelne Menüpunkt für sich, was sonst eine unschöne,
   wortweise zerrissene Spalte ergibt. */
.lui-header-actions {
	flex-wrap: wrap;
	row-gap: var( --wp--preset--spacing--20 );
}
.lui-header-actions .wp-block-navigation {
	flex-grow: 1;
}

/* Nutzerwunsch: Der Menü-Button (Hamburger) soll auf Smartphones nicht in
   der zweiten Zeile bei Such-Icon/Social-Icons stehen, sondern oben rechts
   in derselben Zeile wie Logo/Titel. Bewusst NUR auf Smartphone-Breite
   (siehe Breakpoint-Skala oben) – auf breiteren Bildschirmen zeigt die
   Navigation ihre echten Menüpunkte (nicht den Hamburger) direkt in der
   zweiten Zeile, dort soll sich nichts ändern.
   Technik: Der Button wird nicht im DOM verschoben (er gehört weiterhin
   zur eigentlichen Navigation), sondern nur visuell per position:absolute
   relativ zu .lui-header-row nach oben rechts versetzt – WordPress selbst
   entscheidet weiterhin per JS (ResizeObserver, kein fester Breakpoint), ob
   der Button überhaupt sichtbar ist.
   .wp-block-navigation selbst hat von WordPress-Core position:relative
   (style.min.css) – das machte es zum tatsächlichen Bezugsrahmen statt
   .lui-header-row, der Button landete dadurch trotzdem nur knapp über
   seiner ursprünglichen Position in Zeile 2. Für das mobile Overlay-Menü
   selbst wird das nicht gebraucht (das nutzt sein eigenes
   position:fixed, unabhängig vom Bezugsrahmen des Buttons) – auf dieser
   Breite daher gefahrlos auf position:static zurückgesetzt. */
@media ( max-width: 599px ) {
	.lui-header-row {
		position: relative;
	}
	.lui-header-actions .wp-block-navigation {
		position: static;
	}
	.wp-block-navigation__responsive-container-open {
		position: absolute;
		top: 4px;
		right: 0;
	}
}

/* Mobiles Vollbild-Menü: WordPress-Core liefert dafür keinerlei eigene
   Optik – nur die vom Navigation-Block geerbte Ausrichtung
   (items-justified-right, siehe justifyContent:"right" in
   parts/header.html, dort für die Desktop-Zeile neben Logo/Suche gedacht).
   Im Vollbild-Overlay wirkte das rechtsbündig, unterschiedlich lang
   umbrechend und ohne jede Trennung zwischen den Einträgen wie "in der Luft
   schwebend". Fix: eigene Linksbündigkeit nur fürs offene Overlay (über
   die von Core selbst genutzte CSS-Variable, siehe
   --navigation-layout-justification-setting in wp-includes/blocks/
   navigation/style.min.css – so greift die Änderung automatisch überall
   dort, wo Core sie für die Ausrichtung heranzieht, ohne jede einzelne
   Regel einzeln zu überschreiben), volle Zeilenbreite pro Eintrag samt
   Trennlinie für klare Struktur, einheitliche Schriftgröße. Bewusst nur im
   offenen Overlay (.is-menu-open) und nur auf Smartphone-Breite – die
   Desktop-Zeile neben Logo/Suche bleibt unverändert rechtsbündig. */
@media ( max-width: 599px ) {
	.wp-block-navigation__responsive-container.is-menu-open {
		--navigation-layout-justification-setting: flex-start;
	}
	.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__container,
	.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item {
		width: 100%;
	}
	.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item {
		border-top: 1px solid var( --wp--preset--color--border );
	}
	.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item:last-child {
		border-bottom: 1px solid var( --wp--preset--color--border );
	}
	.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item__content {
		display: block;
		width: 100%;
		padding: 0.9em 0;
		font-size: var( --wp--preset--font-size--medium );
		font-weight: 600;
	}
	.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item__content:hover,
	.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item__content:focus-visible {
		color: var( --wp--preset--color--accent );
	}
	/* Untermenü (z. B. unter "Über Linux und Ich"): Core setzt dessen
	   Container im geöffneten Overlay per eigener, spezifischerer Regel auf
	   width:auto + beidseitiges 2rem-Padding – dadurch hing genau hier (u. a.
	   "Mein GnuPG-Key") die Trennlinie in der Luft statt über die volle
	   Zeilenbreite zu laufen wie bei den übrigen Einträgen. !important nötig,
	   da Cores eigene Regel trotz :where() (0 Spezifität) auf reinen Klassen
	   höher spezifisch bleibt als diese hier. Leichter Einzug + etwas
	   kleinere Schrift statt Zentrierung zeigt die Hierarchie an, bleibt aber
	   klar der vollen Zeile zugeordnet. */
	.wp-block-navigation__responsive-container.is-menu-open .has-child .wp-block-navigation__submenu-container {
		box-sizing: border-box !important;
		width: 100% !important;
		padding-left: 2.5rem !important;
		padding-right: 0 !important;
	}
	.wp-block-navigation__responsive-container.is-menu-open .has-child .wp-block-navigation__submenu-container .wp-block-navigation-item__content {
		font-size: var( --wp--preset--font-size--small );
		font-weight: 500;
	}
}

/* Suche generell (alle Breiten, nicht mehr nur echte schmale Smartphones):
   Nutzerwunsch – kein dauerhaft sichtbares Suchfeld mehr in der Kopfzeile,
   stattdessen nur noch ein Such-Icon GANZ RECHTS (rechts von Social-Icons
   und Dark-Mode-Button, siehe Reihenfolge in parts/header.html), das per
   Klick das ohnehin vorhandene Suchfeld aufklappt (JS setzt dafür die
   Klasse .is-search-open an .lui-header-tools, siehe interactions.js) –
   Social-Icons/Dark-Mode-Button weichen währenddessen, damit das Feld die
   volle Zeile bekommt. Vorher galt dasselbe Verhalten nur unterhalb 430px
   (darüber blieb ein dauerhaft ausgeschriebenes Suchfeld stehen, auf
   599px zusätzlich auf 180px verkleinert) – beides jetzt hinfällig, das
   Icon ersetzt das Suchfeld durchgängig auf jeder Breite.
   Der Button verlinkte anfangs (bei der ursprünglich nur auf schmale
   Smartphones begrenzten Fassung) direkt auf die Suchseite (`/?s=`) – vom
   Nutzer abgelehnt, da man dort erst noch tippen muss, statt gleich ein
   Eingabefeld zu bekommen; das Aufklapp-Verhalten blieb daher bestehen und
   wurde nur auf alle Breiten ausgeweitet. */
.lui-header .wp-block-search {
	display: none;
}
.lui-header-search-toggle {
	display: flex;
	align-items: center;
	justify-content: center;
	flex-shrink: 0;
	width: 40px;
	height: 40px;
	border-radius: 999px;
	background: var( --wp--preset--color--accent );
	color: #ffffff;
	border: none;
	cursor: pointer;
	padding: 0;
}
.lui-header-tools.is-search-open {
	flex: 1 1 auto;
}
.lui-header-tools.is-search-open .lui-header-search-toggle,
.lui-header-tools.is-search-open .wp-block-social-links,
.lui-header-tools.is-search-open .lui-theme-toggle {
	display: none;
}
.lui-header-tools.is-search-open .wp-block-search {
	display: flex;
	width: 100% !important;
	flex: 1 1 auto !important;
}

/* Suchfeld: auf Höhe des Logos (40px) begrenzen --------------------------- */
.lui-header .wp-block-search__inside-wrapper {
	height: 40px;
	align-items: center;
	gap: 0.5rem;
	overflow: visible;
	border: none !important;
	background: none !important;
}
.lui-header .wp-block-search__input {
	height: 40px;
	min-height: 0;
	box-sizing: border-box;
	padding-top: 0;
	padding-bottom: 0;
	padding-left: 0.85rem;
	padding-right: 0.85rem;
	line-height: 40px;
	border: 1px solid var( --wp--preset--color--border ) !important;
	border-radius: 999px !important;
}
.lui-header .wp-block-search__button {
	height: 40px;
	width: 40px;
	min-height: 0;
	box-sizing: border-box;
	flex-shrink: 0;
	padding: 0;
	margin: 0;
	display: flex;
	align-items: center;
	justify-content: center;
	line-height: 1;
	border: none !important;
	border-radius: 50% !important;
}
.lui-header .wp-block-search__button svg {
	width: 18px;
	height: 18px;
	display: block;
}

/* Kategorie-Badges auf Beitragsbildern ------------------------------------ */
.lui-media-frame {
	position: relative;
	overflow: hidden;
	display: block;
	border-radius: 8px;
	container-type: inline-size;
}
/* border-radius hier direkt am Rahmen (nicht nur wie sonst üblich am
   .wp-block-post-featured-image selbst, siehe weiter unten): Bei Beiträgen
   OHNE Beitragsbild rendert WordPress dieses Element gar nicht erst – der
   Platzhalter (Verlauf + Logo, Regel direkt darunter) sitzt daher direkt auf
   .lui-media-frame. Ohne eigenen Radius hier blieb der Platzhalter in
   Übersichten (Blog, Kategorien, Suche) eckig, während echte Beitragsbilder
   (dank .wp-block-post-featured-image { border-radius:8px } weiter unten)
   abgerundet waren. */
/* Fehlt das Beitragsbild, hat .lui-media-frame sonst keine eigene Höhe (die
   kommt nur vom img über aspect-ratio) und kollabiert auf 0px – das darin
   absolut positionierte Kategorie-Badge wird durch overflow:hidden dann mit
   weggeschnitten. Fallback-Fläche verhindert das, in denselben Marken-Farben
   wie der Hero-Platzhalter (.lui-hero:not(:has(img)) weiter unten), nur mit
   kleinerem Logo passend zur Kartengröße. Der Verlauf startet bei
   --lui-fallback-color statt einem festen Grauton, damit die Kategorie-
   Farben weiter unten greifen (WordPress' automatische category-{slug}-
   Klasse sitzt immer am umschließenden <li>, nicht an .lui-media-frame
   selbst) – ohne passende Kategorie-Regel bleibt es beim neutralen Anthrazit. */
.lui-media-frame:not( :has( img ) ),
.lui-hero:not( :has( img ) ) {
	cursor: pointer;
}
.lui-media-frame:not( :has( img ) ) {
	aspect-ratio: var( --lui-frame-ratio, 4 / 3 );
	background-color: var( --wp--preset--color--contrast );
	background-image:
		url( "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Cpath d='M45.42,12.5 L24.74,12.5 L24.74,87.5 L73.02,87.5 L75.28,66.91 L45.39,66.91 Z' fill='%23ff6600' fill-opacity='0.4'/%3E%3C/svg%3E" ),
		linear-gradient( 135deg, var( --lui-fallback-color, var( --wp--preset--color--contrast-2 ) ), var( --wp--preset--color--contrast ) );
	background-repeat: no-repeat;
	background-position: center;
	background-size: 35%, cover;
}
/* Für Kartengrids, deren echtes Beitragsbild quadratisch zugeschnitten wird
   (aspectRatio:"1" am wp:post-featured-image-Block, z. B. Kategorie-Grids
   und "Ähnliche Beiträge") – ohne diese Klasse bliebe der Platzhalter beim
   4:3-Standard und wäre dadurch niedriger als die echten Bilder daneben. */
.lui-frame-square {
	--lui-frame-ratio: 1;
}
/* Echtes Beitragsbild in einem quadratischen Rahmen quadratisch zuschneiden.
   In Gutenberg-Blöcken übernimmt das die "aspectRatio"-Einstellung am
   wp:post-featured-image-Block (eigenes Inline-style="aspect-ratio:1;
   object-fit:cover" am <img>) – für die per PHP gerenderten Vorschlags-
   Karten ([lui_search_suggestions], siehe functions.php) gibt es diese
   Block-Einstellung nicht, das Bild behielt bisher sein natürliches
   Seitenverhältnis (Querformat/Hochformat je nach Originalbild), wodurch
   die Kacheln nebeneinander uneinheitlich aussahen statt alle quadratisch
   wie beim Vorbild "Ähnliche Beiträge". */
.lui-frame-square img {
	aspect-ratio: 1;
	object-fit: cover;
	height: 100%;
}
.lui-media-frame img {
	transition: transform 0.4s ease;
	display: block;
	width: 100%;
	height: auto;
}
.lui-media-frame:hover img {
	transform: scale( 1.04 );
}

/* Eck-Klammern im Hover: zwei "L"-Formen (eine gespiegelt), Motiv aus dem
   Logo als wiederkehrendes Interaktions-Signal auf Bildern. */
.lui-media-frame::before,
.lui-media-frame::after,
.lui-hero::before,
.lui-hero::after {
	content: '';
	position: absolute;
	width: 22px;
	height: 22px;
	z-index: 3;
	opacity: 0;
	transition: opacity 0.25s ease, transform 0.25s ease;
	pointer-events: none;
}
.lui-media-frame::before,
.lui-hero::before {
	top: 10px;
	left: 10px;
	border-top: 3px solid var( --wp--preset--color--accent );
	border-left: 3px solid var( --wp--preset--color--accent );
	transform: translate( -6px, -6px );
}
.lui-media-frame::after,
.lui-hero::after {
	bottom: 10px;
	right: 10px;
	border-bottom: 3px solid var( --wp--preset--color--accent );
	border-right: 3px solid var( --wp--preset--color--accent );
	transform: translate( 6px, 6px );
}
.lui-media-frame:hover::before,
.lui-media-frame:hover::after,
.lui-hero:hover::before,
.lui-hero:hover::after {
	opacity: 1;
	transform: translate( 0, 0 );
}
.lui-hero:hover .wp-block-post-featured-image img {
	transform: scale( 1.04 );
}

/* :has() – größere, nachsichtigere Hover-Fläche: Bild-Zoom und Eck-Klammern
   reagieren jetzt auch, wenn der TITEL (ein Geschwister-Element des Bildes)
   gehovert wird, nicht nur bei direktem Hover auf dem Bild selbst. Ohne
   :has() unmöglich, weil CSS Geschwister nicht "nach oben" auf einen Elter
   wirken lassen kann – hier übernimmt :has() genau das. Browser ohne
   :has()-Unterstützung ignorieren die Regel; das bisherige Bild-Hover
   funktioniert unverändert weiter. */
article:has( .wp-block-post-title:hover ) .lui-media-frame::before,
article:has( .wp-block-post-title:hover ) .lui-media-frame::after {
	opacity: 1;
	transform: translate( 0, 0 );
}
article:has( .wp-block-post-title:hover ) .lui-media-frame img {
	transform: scale( 1.04 );
}
.lui-hero:has( .wp-block-post-title:hover )::before,
.lui-hero:has( .wp-block-post-title:hover )::after {
	opacity: 1;
	transform: translate( 0, 0 );
}
.lui-hero:has( .wp-block-post-title:hover ) .wp-block-post-featured-image img {
	transform: scale( 1.04 );
}

/* Bug (Nutzer-Screenshot): Auf Smartphone-Breite ist .lui-hero (die ganze,
   jetzt gepolsterte Karte mit eigenem Rahmen) eine andere, größere Fläche
   als .lui-media-frame (nur das eingerückte Thumbnail, siehe Umbau weiter
   unten) – vorher waren beide auf Desktop deckungsgleich, weshalb ihre
   identischen Eck-Klammern (.lui-hero::before/::after UND
   .lui-media-frame::before/::after, siehe oben) exakt übereinander lagen
   und wie EINE einzige aussahen. Auf Smartphone-Breite zeigten sich beide
   Klammern-Paare jetzt separat sichtbar an unterschiedlichen Ecken
   (Karte UND Bild) – wirkte wie verdoppelt. Nutzerwunsch: Die
   Eck-Klammer soll nur noch beim Hovern über das BILD erscheinen, nicht
   über die ganze Box. Auf dieser Breite daher die .lui-hero-eigene Klammer
   komplett abschalten, .lui-media-frame behält ihre unverändert. */
@media ( max-width: 599px ) {
	.lui-hero::before,
	.lui-hero::after {
		display: none;
	}
}

.wp-block-post-terms.lui-badge {
	display: inline-block;
	background: var( --wp--preset--color--contrast );
	color: var( --wp--preset--color--base );
	font-family: var( --wp--preset--font-family--mono );
	font-size: var( --wp--preset--font-size--small );
	font-weight: 600;
	letter-spacing: 0.02em;
	text-transform: uppercase;
	padding: 0.3em 0.65em;
	border-radius: 2px;
	margin-bottom: 0.5em;
}
.wp-block-post-terms.lui-badge a {
	/* Fest #ffffff statt var(--base): --base kippt im Dark Mode auf fast
	   Schwarz um (siehe Dark-Mode-Block oben in dieser Datei) – der Badge-
	   Hintergrund bleibt aber bewusst IMMER dunkel (#1a1a1a, siehe weiter
	   oben in dieser Datei), das hätte also fast schwarzen Text auf fast
	   schwarzem Grund ergeben. Diese Regel muss außerdem SPÄTER als die
	   frühere .wp-block-post-terms.lui-badge-Regel weiter oben stehen (bei
	   gleicher Spezifität + !important gewinnt in der Kaskade die später
	   stehende Regel) – deshalb hier und nicht dort korrigiert. */
	color: #ffffff !important;
	text-decoration: none !important;
}
.wp-block-post-terms.lui-badge::before {
	content: '//';
	opacity: 0.55;
	margin-right: 0.2em;
}
.wp-block-post-terms.lui-badge:hover {
	background: var( --wp--preset--color--accent );
}
/* Innerhalb eines Bildrahmens sitzt das Badge über dem Bild, mit etwas
   Abstand zur Eck-Klammer, die an genau dieser Ecke (10px) beim Hover
   eingeblendet wird – sonst würde die Klammer quer durchs Badge laufen. */
.lui-media-frame .wp-block-post-terms.lui-badge {
	position: absolute;
	top: 18px;
	left: 18px;
	z-index: 2;
	margin: 0;
	max-width: calc( 100% - 1.5rem );
	width: -moz-fit-content;
	width: fit-content;
	white-space: normal;
	overflow-wrap: break-word;
	line-height: 1.25;
	padding: 0.3em 0.55em;
	font-size: 0.6875rem;
}

/* Angeheftete Beiträge ("Sticky") + Post-Formate (Video/Galerie) -----------
   WordPress hängt automatisch .sticky bzw. format-{slug}-Klassen an das
   jeweilige Query-Loop-Element bzw. den Hero-Slide-<li>. Die Badges dürfen
   NICHT per ::before/::after direkt auf diesem Element sitzen: Im
   Hero-Slider bleibt das <li> immer im normalen Fluss, auch wenn sein
   Artikel-Kind gerade per display:none ausgeblendet ist (siehe
   .lui-hero-slide) – ein CSS-Pseudo-Element würde also für JEDEN Slide an
   derselben Stelle sichtbar bleiben, unabhängig davon, welcher Slide gerade
   aktiv ist. Stattdessen fügt interactions.js echte Badge-Elemente in
   .lui-media-frame/.lui-hero selbst ein – die werden zusammen mit ihrem
   Artikel korrekt aus- und eingeblendet. */
.lui-badge-sticky,
.lui-badge-format {
	position: absolute;
	right: 18px;
	z-index: 2;
	display: inline-block;
	/* Ohne diesen Reset hängt hier WordPress' automatischer Block-Abstand für
	   "flow"-Layout-Gruppen (:where(.is-layout-flow) > * + *) einen
	   margin-top an, den .lui-media-frame .wp-block-post-terms.lui-badge
	   (Kategorie-Badge) bereits per margin:0 losgeworden ist – ohne diese
	   Zeile hier saß das Angeheftet-Badge dadurch sichtbar tiefer als das
	   Kategorie-Badge, obwohl beide dasselbe top:18px haben. */
	margin: 0;
	font-family: var( --wp--preset--font-family--mono );
	font-size: 0.6875rem;
	font-weight: 600;
	letter-spacing: 0.02em;
	text-transform: uppercase;
	padding: 0.3em 0.55em;
	border-radius: 2px;
	line-height: 1.25;
	pointer-events: none;
}
/* Feste statt Token-Farben bei allen vier Badges (Kategorie/Angeheftet/
   Format/Kommentare): Sie sitzen direkt auf Beitragsbildern und sollen
   unabhängig vom Farbmodus der übrigen Seite immer dieselbe, garantiert
   kontraststarke Kombination zeigen – "contrast"/"base" kippen im Dark
   Mode um (siehe Dark-Mode-Block oben in dieser Datei) und hätten sonst
   z. B. das Angeheftet-Badge auf fast schwarzen Text auf Orange gedreht. */
.lui-badge-sticky {
	top: 18px;
	background: var( --wp--preset--color--accent );
	color: #ffffff;
}
.lui-badge-format {
	bottom: 18px;
	background: #1a1a1a;
	color: #ffffff;
}

/* Kommentaranzahl als Sprechblasen-Badge unten rechts im Thumbnail – gleiche
   Technik/gleiches Padding wie Angeheftet-/Format-Badge oben (echtes
   Element statt Pseudo-Element, siehe deren Begründung), nur über eine
   Block-Bindung (lui/comment-count-badge) statt per JS befüllt, weil die
   Kommentaranzahl anders als "sticky"/Format keine reine An/Aus-Klasse ist,
   sondern ein Wert, den WordPress ohnehin schon serverseitig kennt. */
.lui-badge-comments {
	position: absolute;
	bottom: 18px;
	right: 18px;
	z-index: 2;
	margin: 0;
	/* Fest wie beim Kategorie-Badge (dieselbe Kombination, wie gewünscht),
	   nicht var(--contrast)/var(--base): die kippen im Dark Mode um und
	   hätten dann Badge und Kategorie-Label unterschiedlich aussehen lassen. */
	background: #1a1a1a;
	color: #ffffff;
	font-family: var( --wp--preset--font-family--mono );
	font-size: 0.6875rem;
	font-weight: 600;
	letter-spacing: 0.02em;
	padding: 0.3em 0.55em;
	border-radius: 2px;
	line-height: 1.25;
}
.lui-badge-comments:empty {
	display: none;
}
/* Format-Badge sitzt an derselben Stelle (unten rechts) – bei Beiträgen mit
   sowohl Post-Format als auch Kommentaren rutscht der Kommentar-Badge eine
   Zeile höher, statt beide übereinanderzulegen. */
.lui-media-frame:has( .lui-badge-format ) .lui-badge-comments,
.lui-hero:has( .lui-badge-format ) .lui-badge-comments {
	bottom: 50px;
}

/* Sehr schmale Bildrahmen (z. B. .lui-related-card mit 120px) haben nicht
   genug Platz für Kategorie-Badge (oben links) und Angeheftet-Badge (oben
   rechts) nebeneinander, ohne dass sie sich überlappen. Ab hier wandert das
   Angeheftet-Badge unter das Kategorie-Badge, statt daneben. Betrifft nur
   .lui-badge-sticky, nicht .lui-badge-format/.lui-badge-comments: Die sitzen
   unten rechts und kollidieren dort nicht mit dem Kategorie-Badge oben. */
@container ( max-width: 220px ) {
	.lui-badge-sticky {
		top: 46px;
		right: auto;
		left: 18px;
	}
}

/* Meta-Zeile (Datum · Lesezeit · Autor) ----------------------------------- */
.lui-meta {
	color: var( --wp--preset--color--muted );
	font-family: var( --wp--preset--font-family--mono );
	font-size: var( --wp--preset--font-size--small );
	font-variant-numeric: tabular-nums;
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 0.5em;
	margin-top: 0.25rem;
}
.lui-meta > * {
	display: inline-flex;
	align-items: center;
}
/* Trennpunkt am jeweils EIGENEN Element (":not(:first-child)") statt am
   vorherigen (":not(:last-child)::after") – so hängt er nicht davon ab, ob
   ein SPÄTERES Geschwisterelement sichtbar ist. Wichtig, weil das letzte
   Element in dieser Zeile (Kommentaranzahl, siehe lui/comment-count-Bindung)
   bei 0 Kommentaren leer ist und per :empty komplett verschwindet – mit der
   alten Logik hätte das vorletzte Element trotzdem einen ins Leere
   zeigenden Trennpunkt behalten. ":not(:empty)" verhindert zusätzlich einen
   Trennpunkt VOR einem selbst leeren (ausgeblendeten) Element. */
.lui-meta > *:not( :first-child ):not( :empty )::before {
	content: '·';
	margin-right: 0.5em;
	color: var( --wp--preset--color--border );
}
.lui-meta > .lui-comment-count:empty {
	display: none;
}

/* Artikel-Ansicht: Kopfbereich (Titel/Meta/Auszug/Bild) vs. Fließtext ------ */
.lui-article-header {
	background: var( --wp--preset--color--base-2 );
	border: 1px solid var( --wp--preset--color--border );
	border-top: 4px solid var( --wp--preset--color--accent );
	border-radius: 10px;
	padding: clamp( 1.25rem, 4vw, 2rem );
	margin-bottom: var( --wp--preset--spacing--50 );
}
.lui-article-lead {
	font-style: normal;
	font-size: 1.125rem; /* 18px */
	line-height: 1.5;
	color: var( --wp--preset--color--muted );
	border-left: 3px solid var( --wp--preset--color--accent );
	padding: 0.15em 0 0.15em 1.1em;
	margin-top: var( --wp--preset--spacing--30 );
	margin-bottom: var( --wp--preset--spacing--30 ) !important;
}
.lui-article-hero {
	position: relative;
	border-radius: 8px;
	overflow: hidden;
	margin-bottom: 0 !important;
}
.lui-article-hero img {
	display: block;
	width: 100%;
}
/* Bildrechte-Hinweis (siehe lui_featured_image_credit_overlay in
   functions.php) – klein und dezent unten rechts im Bild, unabhängig vom
   Bildinhalt lesbar dank dunklem, halbtransparentem Hintergrund. */
.lui-image-credit {
	position: absolute;
	right: 0;
	bottom: 0;
	max-width: 80%;
	margin: 0.6em;
	padding: 0.2em 0.6em;
	background: rgba( 0, 0, 0, 0.55 );
	color: rgba( 255, 255, 255, 0.85 );
	font-size: 0.6875rem;
	line-height: 1.4;
	border-radius: 4px;
	text-align: right;
	/* immer einzeilig statt bei langen Bildunterschriften umzubrechen –
	   bei Überlänge (schmales Bild/schmaler Viewport) lieber sauber
	   abschneiden als den Hinweis über zwei Zeilen wachsen zu lassen. */
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}
.lui-image-credit a {
	/* display:inline gegen die Core-Regel .wp-block-post-featured-image a
	   { display: block }, die sonst jeden Link im Beitragsbild-Block auf
	   eine eigene Zeile zwingt – auch unsere beiden Credit-Links, obwohl sie
	   nichts mit dem verlinkten Beitragsbild selbst zu tun haben. */
	display: inline !important;
	color: inherit;
	text-decoration: underline;
}
.lui-image-credit a:hover {
	color: var( --wp--preset--color--accent );
}
/* Fließtext im Artikel: Basis 14px -> 16px, restliche Größen im Artikel
   harmonisch (in klaren rem-Schritten) mitgezogen. */
.lui-article-body {
	position: relative;
	margin-top: 0;
	font-size: 1rem; /* 16px, statt geerbter 0.875rem (14px) */
}
.lui-article-body h2 {
	font-size: 1.5rem; /* 24px */
}
.lui-article-body h3 {
	font-size: 1.25rem; /* 20px */
}
.lui-article-body h4 {
	font-size: 1.125rem; /* 18px */
}
.lui-article-body pre,
.lui-article-body code {
	font-size: 0.8125rem; /* 13px, bewusst kleiner als Fließtext (Mono wirkt optisch größer) */
}
/* Altbeiträge nutzen noch rohe <pre>-Tags statt des Gutenberg-Code-Blocks
   (.wp-block-code) – ohne eigenes Markup-Attribut bekommen sie dessen Look
   (Radius, Innenabstand, Zeilenumbruch) nicht automatisch aus theme.json.
   .wp-block-code/.wp-block-preformatted sind selbst <pre>-Elemente, der
   Selektor trifft daher ohnehin schon beide – hier nur das nachreichen, was
   sonst ausschließlich über theme.json käme. */
.lui-article-body pre {
	font-family: var( --wp--preset--font-family--mono );
	border-radius: 6px;
	padding: 1rem 1.25rem;
	overflow-x: auto;
	white-space: pre-wrap;
	word-break: break-word;
}

/* Klassische [gallery]-Shortcodes aus migrierten Altbeiträgen --------------
   Diese Beiträge nutzen noch das alte, unstrukturierte gallery-Markup statt
   des Gutenberg-Galerie-Blocks; ohne eigenes CSS (weder Theme noch WP-Core
   liefern dafür heute noch Styles) reihen sich die Bilder einfach unschön
   untereinander auf. Fester Grid-Look statt der von der Kurzform vorgegebenen
   .gallery-columns-N-Klasse – so sehen alle Alt-Galerien einheitlich und
   modern aus, unabhängig davon, wie viele Spalten damals eingestellt waren. */
.lui-article-body .gallery {
	display: grid;
	grid-template-columns: repeat( auto-fit, minmax( 200px, 1fr ) );
	gap: var( --wp--preset--spacing--30 );
	margin: var( --wp--preset--spacing--40 ) 0;
	list-style: none;
	padding: 0;
}
.lui-article-body .gallery-item {
	margin: 0;
}
.lui-article-body .gallery-icon {
	position: relative;
	overflow: hidden;
	border-radius: 8px;
	aspect-ratio: 4 / 3;
	display: block;
	background-color: var( --wp--preset--color--base-2 );
}
.lui-article-body .gallery-icon a {
	display: block;
	height: 100%;
	cursor: zoom-in;
}
.lui-article-body .gallery-icon img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	display: block;
	margin: 0;
	transition: transform 0.4s ease;
}
.lui-article-body .gallery-icon:hover img {
	transform: scale( 1.05 );
}
.lui-article-body .gallery-caption {
	font-size: var( --wp--preset--font-size--small );
	color: var( --wp--preset--color--muted );
	margin-top: 0.4em;
	text-align: center;
}

/* Lightbox zum Vergrößern – die Original-Links der Galerie führen sonst nur
   auf die rohe Bilddatei ohne jeden Kontext. */
.lui-gallery-lightbox {
	position: fixed;
	inset: 0;
	z-index: 2000;
	background: rgba( 0, 0, 0, 0.9 );
	display: flex;
	align-items: center;
	justify-content: center;
	padding: 2rem;
}
.lui-gallery-lightbox[hidden] {
	display: none;
}
.lui-gallery-lightbox img {
	max-width: 100%;
	max-height: 100%;
	object-fit: contain;
	border-radius: 4px;
}
.lui-gallery-lightbox-close,
.lui-gallery-lightbox-prev,
.lui-gallery-lightbox-next {
	position: absolute;
	background: rgba( 255, 255, 255, 0.1 );
	border: none;
	color: var( --wp--preset--color--base );
	cursor: pointer;
	display: flex;
	align-items: center;
	justify-content: center;
	border-radius: 999px;
	transition: background 0.2s ease;
}
.lui-gallery-lightbox-close:hover,
.lui-gallery-lightbox-prev:hover,
.lui-gallery-lightbox-next:hover {
	background: rgba( 255, 255, 255, 0.25 );
}
.lui-gallery-lightbox-close {
	top: 1rem;
	right: 1rem;
	width: 44px;
	height: 44px;
	font-size: 1.5rem;
}
.lui-gallery-lightbox-prev,
.lui-gallery-lightbox-next {
	top: 50%;
	transform: translateY( -50% );
	width: 52px;
	height: 52px;
	font-size: 1.75rem;
}
.lui-gallery-lightbox-prev {
	left: 1rem;
}
.lui-gallery-lightbox-next {
	right: 1rem;
}
.lui-gallery-lightbox-counter {
	position: absolute;
	bottom: 1rem;
	left: 50%;
	transform: translateX( -50% );
	color: rgba( 255, 255, 255, 0.75 );
	font-family: var( --wp--preset--font-family--mono );
	font-size: var( --wp--preset--font-size--small );
}
.lui-source-line {
	margin-top: var( --wp--preset--spacing--30 );
}
.lui-source-line:empty {
	display: none;
}
.lui-source-line a {
	color: inherit;
	text-decoration: underline;
}

/* Tags + Share-Buttons: eine Zeile, Tags links, Share rechts, statt zwei
   isoliert untereinander hängender Blöcke. */
.lui-tags-share {
	padding-top: var( --wp--preset--spacing--30 );
	align-items: center;
	column-gap: var( --wp--preset--spacing--30 );
}
.lui-tags-share .wp-block-post-terms {
	margin: 0;
}

/* Vorheriger/Nächster Beitrag ---------------------------------------------- */
.lui-post-nav {
	padding-top: var( --wp--preset--spacing--30 );
}
.lui-post-nav a {
	color: var( --wp--preset--color--contrast );
	text-decoration: none;
	font-family: var( --wp--preset--font-family--heading );
	font-weight: 600;
	font-size: var( --wp--preset--font-size--large );
}
.lui-post-nav a:hover {
	color: var( --wp--preset--color--accent );
}
.lui-post-nav .wp-block-post-navigation-link {
	display: flex;
	flex-direction: column;
	max-width: 45%;
}
/* Core liefert Pfeil + Titel ohne eigene "Vorheriger/Nächster Beitrag"-
   Caption – per generiertem Inhalt statt fixem Text im Markup ergänzt, da
   dieser sich sonst bei jeder erneuten Bearbeitung im Editor überschreiben
   ließe. */
.post-navigation-link-previous::before,
.post-navigation-link-next::before {
	display: block;
	font-family: var( --wp--preset--font-family--mono );
	font-size: var( --wp--preset--font-size--small );
	color: var( --wp--preset--color--muted );
	text-transform: uppercase;
	letter-spacing: 0.02em;
	margin-bottom: 0.25em;
}
.post-navigation-link-previous::before {
	content: 'Vorheriger Beitrag';
}
.post-navigation-link-next::before {
	content: 'Nächster Beitrag';
	text-align: right;
}
/* Der "Nächster Beitrag"-Block soll rechtsbündig sein, wenn kein "Vorheriger
   Beitrag" existiert (erster Beitrag im Blog) – sonst hängt er allein links. */
.lui-post-nav > .wp-block-post-navigation-link:last-child {
	margin-left: auto;
	text-align: right;
}

/* Autoren-Box unter dem Artikel -------------------------------------------- */
/* WordPress' Flex-Layout zentriert Kinder standardmäßig vertikal
   (align-items:center) – bei einer mehrzeiligen Bio hängt das Avatar dadurch
   mittig neben dem Text statt sauber neben dem Namen zu stehen. Oben
   ausrichten, damit Avatar und Name auf einer Höhe beginnen. */
.lui-author-box {
	align-items: flex-start;
}
.lui-author-box .wp-block-avatar {
	flex-shrink: 0;
}
.lui-author-box .wp-block-post-author-name {
	margin: 0 0 0.25em;
	font-size: var( --wp--preset--font-size--large );
	line-height: 1.2;
}

/* "Ähnliche Beiträge" / Kommentare: einheitlicher Trennstrich + Abstand
   zum Artikel-Ende und zur Autoren-Box, statt nur einem Freiraum – macht
   die einzelnen Abschnitte unter dem Artikel klar voneinander erkennbar. */
.lui-below-article-section > .lui-section-title,
.lui-below-article-section > .wp-block-comments-title {
	margin-top: 0;
}

/* Kommentare ----------------------------------------------------------------- */
.lui-comment {
	padding-bottom: var( --wp--preset--spacing--40 );
	margin-bottom: var( --wp--preset--spacing--40 ) !important;
	border-bottom: 1px solid var( --wp--preset--color--border );
}
.wp-block-comment-template > li:last-child > .lui-comment {
	border-bottom: none;
	margin-bottom: 0 !important;
	padding-bottom: 0;
}
.lui-comment-meta {
	column-gap: 0.6em;
	margin-bottom: 0.4em;
}
.lui-comment-meta .wp-block-comment-author-name {
	color: var( --wp--preset--color--contrast );
}
.lui-comment-meta .wp-block-comment-author-name a {
	color: inherit;
	text-decoration: none;
}
.lui-comment-meta .wp-block-comment-date,
.lui-comment-meta .wp-block-comment-date a {
	color: var( --wp--preset--color--muted );
	font-size: var( --wp--preset--font-size--small );
	font-weight: 400;
	text-decoration: none;
}
.wp-block-comment-content p {
	margin: 0 0 0.5em;
}
/* Von lui_render_comment_markdown() (functions.php) aus Markdown erzeugte
   Listen/Codeblöcke in Kommentaren. Höhere Spezifität als die weiter unten
   folgende .wp-block-comment-template li ol-Regel (Antworten-Verschachtelung)
   nötig, da genau dieselbe <li>-Verschachtelungstiefe sonst eine im
   Kommentartext geschriebene nummerierte Liste fälschlich wie einen
   Antworten-Thread aussehen ließe (keine Zahlen, Rahmenlinie statt Liste). */
.wp-block-comment-template li .wp-block-comment-content ul {
	list-style: disc;
	margin: 0 0 0.75em;
	padding-left: 1.25em;
}
.wp-block-comment-template li .wp-block-comment-content ol {
	list-style: decimal;
	margin: 0 0 0.75em;
	padding-left: 1.25em;
	border-left: none;
}
.wp-block-comment-content pre,
.wp-block-comment-content code {
	font-family: var( --wp--preset--font-family--mono );
	font-size: 0.8125rem;
}
.wp-block-comment-content pre {
	background-color: #1a1a1a;
	color: #f5f4f2;
	border-radius: 6px;
	padding: 1rem 1.25rem;
	margin: 0 0 0.75em;
	overflow-x: auto;
	white-space: pre-wrap;
	word-break: break-word;
}
.wp-block-comment-content pre code {
	background: none;
	padding: 0;
}
.wp-block-comment-content code {
	background-color: var( --wp--preset--color--base-2 );
	border-radius: 4px;
	padding: 0.1em 0.4em;
}
.wp-block-comment-reply-link a {
	font-family: var( --wp--preset--font-family--mono );
	font-size: var( --wp--preset--font-size--small );
	font-weight: 600;
	text-transform: uppercase;
	letter-spacing: 0.02em;
	text-decoration: none;
}
/* Verschachtelte Antworten optisch als "Unterhalb"-Ebene erkennbar machen,
   nicht nur durch die von WordPress bereits gesetzte Einrückung. Die
   Antworten-Liste einer Antwort steckt als eigenes <ol> (ohne eigene Klasse)
   direkt im <li> des übergeordneten Kommentars. */
.wp-block-comment-template li ol {
	list-style: none;
	margin: var( --wp--preset--spacing--40 ) 0 0;
	padding-left: var( --wp--preset--spacing--40 );
	border-left: 2px solid var( --wp--preset--color--border );
}

/* Kommentarformular: Markdown-Toolbar + Hinweistext -------------------------
   Toolbar wird nur per JS vor das Textfeld eingefügt (interactions.js),
   der Hinweistext dagegen serverseitig direkt im Feld-Markup (siehe
   lui_comment_form_markdown_hint() in functions.php) und bleibt daher auch
   ohne JavaScript sichtbar. */
.lui-comment-toolbar {
	display: flex;
	flex-wrap: wrap;
	gap: 0.4em;
	margin-bottom: 0.5em;
}
.lui-comment-toolbar-button {
	min-width: 2.25em;
	padding: 0.35em 0.6em;
	border: 1px solid var( --wp--preset--color--border );
	border-radius: 6px;
	background: var( --wp--preset--color--base-2 );
	color: var( --wp--preset--color--contrast );
	font-family: var( --wp--preset--font-family--mono );
	font-size: 0.85rem;
	line-height: 1;
	cursor: pointer;
	transition: background-color 0.15s ease, border-color 0.15s ease;
}
.lui-comment-toolbar-button:hover,
.lui-comment-toolbar-button:focus-visible {
	background: var( --wp--preset--color--accent );
	border-color: var( --wp--preset--color--accent );
	color: #ffffff;
}
.lui-comment-hint {
	font-size: var( --wp--preset--font-size--small );
	color: var( --wp--preset--color--muted );
	margin-top: 0.4em;
}
/* Hinweis nach dem Absenden eines noch nicht freigeschalteten Kommentars
   (siehe lui_pending_comment_notice() in functions.php) – deckungsgleicher
   Rahmen-Stil wie .lui-article-header/der Hero (1px Rahmen + dicker
   Akzentstreifen oben), damit der Hinweis als "besonders" auffällt statt
   im Formular unterzugehen. */
.lui-comment-pending-notice {
	margin-bottom: var( --wp--preset--spacing--30 );
	padding: 1em 1.25em;
	background: var( --wp--preset--color--base-2 );
	border: 1px solid var( --wp--preset--color--border );
	border-top: 4px solid var( --wp--preset--color--accent );
	border-radius: 8px;
}
/* Datenschutz-Hinweis (siehe lui_privacy_notice_markup() in functions.php):
   Erscheint nur, wenn tatsächlich ein Cookie/eine lokale Speicherung
   gesetzt wurde (Kommentar abgeschickt, Dark-Mode umgeschaltet, Video
   geladen, Aufrufe-Zähler neu gesetzt) – daher als dezente, unaufdringliche
   Bar am unteren Bildschirmrand statt als blockierendes Modal, mit
   "Verstanden"-Button statt Accept/Reject (keine dieser Fälle ist ein
   einwilligungspflichtiges Tracking-/Werbe-Cookie, siehe Kommentar in
   functions.php – reine Transparenz-Information).
   Bug (Nutzerhinweis: "Verstanden" wegklicken hatte keine sichtbare
   Wirkung): .lui-privacy-notice setzt unten "display:flex" UNBEDINGT,
   ohne das [hidden]-Attribut zu berücksichtigen – Browser wenden ihre
   eigene Default-Regel "[hidden]{display:none}" nur aus dem
   User-Agent-Stylesheet an, JEDE Autoren-Regel mit gleicher oder höherer
   Spezifität (hier: eine einzelne Klasse) gewinnt automatisch dagegen und
   hebelt das Attribut damit komplett aus – der Banner blieb dadurch immer
   sichtbar, unabhängig vom (korrekt gesetzten, per JS auch nachweisbaren)
   hidden-Attribut. Derselbe Explizit-Override wie bei den anderen
   hidden-gesteuerten Overlays dieses Themes (.lui-gallery-lightbox[hidden],
   .lui-cmdk-overlay[hidden]) behebt das. */
.lui-privacy-notice[hidden] {
	display: none;
}
.lui-privacy-notice {
	position: fixed;
	left: var( --wp--preset--spacing--20 );
	right: var( --wp--preset--spacing--20 );
	bottom: var( --wp--preset--spacing--20 );
	z-index: 1000;
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: var( --wp--preset--spacing--20 );
	max-width: 640px;
	margin: 0 auto;
	padding: 1em 1.25em;
	background: var( --wp--preset--color--contrast );
	color: var( --wp--preset--color--base );
	border-radius: 8px;
	border-top: 4px solid var( --wp--preset--color--accent );
	box-shadow: 0 4px 24px rgba( 0, 0, 0, 0.25 );
	font-size: var( --wp--preset--font-size--small );
}
.lui-privacy-notice p {
	flex: 1 1 240px;
	margin: 0;
}
.lui-privacy-notice a {
	color: inherit;
	text-decoration: underline;
}
.lui-privacy-notice-dismiss {
	flex-shrink: 0;
	padding: 0.5em 1.25em;
	background: var( --wp--preset--color--accent );
	color: #ffffff;
	border: none;
	border-radius: 6px;
	font-family: inherit;
	font-size: inherit;
	font-weight: 600;
	cursor: pointer;
}
.lui-privacy-notice-dismiss:hover,
.lui-privacy-notice-dismiss:focus-visible {
	background: var( --wp--preset--color--accent-dark );
}
/* Klick-zum-Laden-Fassade für die Google-Custom-Search-Einbindung (siehe
   lui_privacy_search_embed_facade() in functions.php) – derselbe
   Rahmen-Stil wie die übrigen Hinweis-Kästen dieser Session
   (.lui-comment-pending-notice, .lui-article-header: getönte Fläche,
   1px Rahmen, dicker Akzentstreifen oben), da hier (anders als beim
   Video) kein Vorschaubild als Gestaltungselement zur Verfügung steht. */
.lui-search-embed-facade {
	margin: var( --wp--preset--spacing--30 ) 0;
}
.lui-search-embed-toggle {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 0.75em;
	width: 100%;
	padding: var( --wp--preset--spacing--40 ) var( --wp--preset--spacing--30 );
	background: var( --wp--preset--color--base-2 );
	border: 1px solid var( --wp--preset--color--border );
	border-top: 4px solid var( --wp--preset--color--accent );
	border-radius: 8px;
	color: var( --wp--preset--color--contrast );
	font-family: inherit;
	text-align: center;
	cursor: pointer;
}
.lui-search-embed-toggle svg {
	color: var( --wp--preset--color--accent );
}
.lui-search-embed-text {
	max-width: 42ch;
	color: var( --wp--preset--color--muted );
	font-size: var( --wp--preset--font-size--small );
}
.lui-search-embed-cta {
	padding: 0.5em 1.25em;
	background: var( --wp--preset--color--accent );
	color: #ffffff;
	border-radius: 6px;
	font-weight: 600;
}
.lui-search-embed-toggle:hover .lui-search-embed-cta,
.lui-search-embed-toggle:focus-visible .lui-search-embed-cta {
	background: var( --wp--preset--color--accent-dark );
}
.lui-comment-hint code {
	font-size: inherit;
	background: var( --wp--preset--color--base-2 );
	border-radius: 4px;
	padding: 0.05em 0.35em;
}

/* Eigenen Kommentar 5 Minuten lang nachträglich bearbeiten können (siehe
   lui_comment_content_edit_ui() in functions.php) – bewusst dezent/klein,
   damit es unter fremden Kommentaren (für die dieses Element serverseitig
   ohnehin nie gerendert wird) keinen visuellen Unterschied gibt. */
.lui-comment-edit {
	margin-top: 0.5em;
	font-size: var( --wp--preset--font-size--small );
}
.lui-comment-edit-toggle {
	border: none;
	background: none;
	padding: 0;
	color: var( --wp--preset--color--accent );
	font-family: inherit;
	font-size: inherit;
	font-weight: 600;
	cursor: pointer;
	text-decoration: underline;
}
.lui-comment-edit-toggle:hover,
.lui-comment-edit-toggle:focus-visible {
	color: var( --wp--preset--color--accent-dark );
}
.lui-comment-edit-countdown {
	margin-left: 0.6em;
	color: var( --wp--preset--color--muted );
}
.lui-comment-edit-form {
	margin-top: 0.5em;
}
.lui-comment-edit-textarea {
	display: block;
	width: 100%;
	min-height: 6em;
	padding: 0.6em;
	border: 1px solid var( --wp--preset--color--border );
	border-radius: 6px;
	font-family: inherit;
	font-size: 1rem;
	resize: vertical;
}
.lui-comment-edit-actions {
	display: flex;
	align-items: center;
	gap: 0.6em;
	margin-top: 0.5em;
}
.lui-comment-edit-save,
.lui-comment-edit-cancel {
	padding: 0.4em 1em;
	border: 1px solid var( --wp--preset--color--border );
	border-radius: 6px;
	font-family: inherit;
	font-size: 0.9rem;
	cursor: pointer;
}
.lui-comment-edit-save {
	background: var( --wp--preset--color--accent );
	border-color: var( --wp--preset--color--accent );
	color: #ffffff;
}
.lui-comment-edit-save:hover,
.lui-comment-edit-save:focus-visible {
	background: var( --wp--preset--color--accent-dark );
	border-color: var( --wp--preset--color--accent-dark );
}
.lui-comment-edit-save:disabled {
	opacity: 0.6;
	cursor: default;
}
.lui-comment-edit-cancel {
	background: var( --wp--preset--color--base-2 );
	color: var( --wp--preset--color--contrast );
}
.lui-comment-edit-status {
	color: var( --wp--preset--color--muted );
}

/* Hero / Aufmacher --------------------------------------------------------- */
.lui-hero {
	position: relative;
	border-radius: 10px;
	overflow: hidden;
}
.lui-hero .wp-block-post-featured-image {
	margin: 0;
}
.lui-hero .wp-block-post-featured-image img {
	width: 100%;
	height: 62vh;
	min-height: 380px;
	max-height: 640px;
	object-fit: cover;
	display: block;
}
/* Hero ohne Beitragsbild: Der Fallback (Anthrazit + angedeutetes "L"-Logo
   aus Header/Footer, eingefärbt über dieselbe --lui-fallback-color wie
   normale .lui-media-frame-Kacheln, siehe Kategorie-Zuordnung weiter unten)
   sitzt auf .lui-media-frame – NICHT mehr auf .lui-hero selbst (das war
   möglich, solange .lui-hero NUR aus dem Bild bestand; seit dem
   Nicht-Overlay-Format auf Smartphone-Breite, siehe weiter unten, enthält
   .lui-hero zusätzlich den Titel/Teaser-Textblock, der dann fälschlich mit
   in dieselbe feste Bild-Höhe gequetscht bzw. vom overflow:hidden
   abgeschnitten worden wäre). .lui-media-frame bekommt dafür dieselbe große
   Aufmacher-Höhe wie zuvor .lui-hero – .lui-hero selbst wächst jetzt frei
   mit seinem Inhalt (Bild + Text darunter). */
.lui-hero .lui-media-frame:not( :has( img ) ) {
	/* width:100% + aspect-ratio:auto nötig: .lui-media-frame ist generell
	   (siehe Basis-Regel weiter oben, für alle "normalen" Karten gedacht)
	   IMMER mit "aspect-ratio:var(--lui-frame-ratio,4/3)" versehen, wenn kein
	   echtes Bild da ist. Für den Hero kommt aber zusätzlich eine feste
	   HÖHE dazu (62vh) – zusammen mit der geerbten aspect-ratio UND ganz
	   ohne eigene Breiten-Angabe berechnete der Browser die Breite aus
	   Höhe × 4/3 statt die volle Hero-Breite auszufüllen (rechts blieb ein
	   nackter, unbespielter Streifen). Auf Querformat-Handys/Desktop (wo die
	   Höhen-Vorgabe wirksam bleibt) besonders sichtbar. */
	width: 100%;
	aspect-ratio: auto;
	height: 62vh;
	min-height: 380px;
	max-height: 640px;
	background-color: var( --wp--preset--color--contrast );
	background-image:
		url( "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Cpath d='M45.42,12.5 L24.74,12.5 L24.74,87.5 L73.02,87.5 L75.28,66.91 L45.39,66.91 Z' fill='%23ff6600' fill-opacity='0.4'/%3E%3C/svg%3E" ),
		linear-gradient( 135deg, var( --lui-fallback-color, var( --wp--preset--color--contrast-2 ) ), var( --wp--preset--color--contrast ) );
	background-repeat: no-repeat;
	background-position: center;
	background-size: 280px, cover;
}
.lui-hero-overlay {
	position: absolute;
	inset: auto 0 0 0;
	padding: clamp( 1.25rem, 4vw, 3rem );
	background: linear-gradient( 0deg, rgba( 26, 26, 26, 0.92 ) 0%, rgba( 26, 26, 26, 0.6 ) 60%, rgba( 26, 26, 26, 0 ) 100% );
	color: var( --wp--preset--color--base );
}
.lui-hero-overlay .wp-block-post-title,
.lui-hero-overlay .wp-block-post-title a {
	color: var( --wp--preset--color--base );
	margin: 0.35em 0;
}
.lui-hero-overlay p {
	color: rgba( 255, 255, 255, 0.85 );
}
.lui-hero-overlay .lui-meta {
	color: rgba( 255, 255, 255, 0.75 );
}
.lui-hero-overlay .lui-meta > *:not( :first-child ):not( :empty )::before {
	color: rgba( 255, 255, 255, 0.4 );
}
/* Position deckt sich mit der Eck-Klammer (.lui-hero::before), die beim
   Hover eingeblendet wird. Gleiche Schriftgröße/Innenabstand wie das
   Kategorie-Label in Karten (.lui-media-frame weiter oben) – sonst wirkt
   das Label im Hero größer als z. B. das "Angeheftet"-Badge daneben, das
   immer die kleinere Karten-Größe nutzt. Sitzt jetzt in .lui-media-frame
   (siehe front-page.html) statt direkt in .lui-hero – Selektor daher nicht
   mehr auf direkte Kindschaft angewiesen, .lui-media-frame ist wie gehabt
   selbst position:relative und bietet denselben Bezugsrahmen. */
.lui-hero .wp-block-post-terms.lui-badge {
	position: absolute;
	top: 18px;
	left: 18px;
	z-index: 2;
	margin: 0;
	padding: 0.3em 0.55em;
	font-size: 0.6875rem;
	line-height: 1.25;
}
/* Nutzerwunsch (Screenshot Desktop/Querformat): Der Teaser nutzte bislang nur
   einen Bruchteil der Hero-Breite (60ch ≈ 530px), obwohl die Box auf breiten
   Bildschirmen bis zu 1200px (wideSize, siehe theme.json) misst – rechts blieb
   sichtbar Platz ungenutzt, während der Titel direkt darüber bereits die volle
   Breite ausnutzt. Ab 600px (oberhalb der eigenen Smartphone-Variante weiter
   unten) daher kein ch-Deckel mehr – der Teaser darf wie der Titel bis an den
   Rand der (ohnehin auf wideSize gedeckelten) Hero-Box reichen. Schriftgröße
   dabei einen Schritt größer als der Fließtext-Basiswert (medium, 14px) auf
   das nächste, bereits fluid definierte Preset (large, 15–17px) – sonst wirkt
   der jetzt viel breitere Teaser proportional zu klein für die prominente
   Aufmacher-Position. */
@media ( min-width: 600px ) {
	.lui-hero-overlay .wp-block-post-excerpt {
		max-width: none;
		font-size: var( --wp--preset--font-size--large );
	}
}

/* Bug (Nutzer-Screenshot, Smartphone Hochkant): Der Hero nutzt für sein
   Beitragsbild eine an der Viewport-HÖHE bemessene Größe (62vh, min. 380px,
   siehe .lui-hero .wp-block-post-featured-image img weiter oben) – auf
   schmalen Hochkant-Handys wird die Kachel dadurch fast quadratisch bis
   leicht hochkant statt in einem festen Seitenverhältnis wie bei den
   übrigen Kacheln der Seite. Fix: Auf Smartphone-Breite die
   Höhen-Vorgaben entfernen und stattdessen eine feste aspect-ratio greifen
   lassen. Nutzerwunsch: 4:3 statt des am Block selbst gesetzten
   "aspectRatio":"16/9" (siehe wp:post-featured-image in front-page.html) –
   passend zum 4:3-Format der 4er-Kachelreihen ("Im Fokus", "Neueste
   Artikel"). */
@media ( max-width: 599px ) {
	/* !important nötig: Der wp:post-featured-image-Block schreibt sein
	   "aspectRatio":"16/9" (siehe front-page.html) als INLINE style="" direkt
	   aufs <img> – eine externe Stylesheet-Regel ohne !important kann ein
	   Inline-Style grundsätzlich nie schlagen, unabhängig von Spezifität.
	   Ohne dieses !important blieb daher ausgerechnet das <img> bei echten
	   Beitragsbildern weiterhin bei 16:9, während der bildlose Platzhalter
	   (kein Inline-Style, da kein <img> vorhanden) korrekt auf 4:3 wechselte
	   – dadurch wich echte Bilder von der jetzt für die Pfeile/Punkte
	   angenommenen Bildhöhe ab (siehe .lui-hero-slider-controls weiter
	   unten), und die Steuerelemente schwebten sichtbar daneben. */
	.lui-hero .wp-block-post-featured-image img {
		height: auto;
		min-height: 0;
		max-height: none;
		aspect-ratio: 4 / 3 !important;
	}
	.lui-hero .lui-media-frame:not( :has( img ) ) {
		height: auto;
		min-height: 0;
		max-height: none;
		aspect-ratio: 4 / 3;
	}
}

/* Meta-Zeile im Hero brach auf Smartphone-Breite in zwei Zeilen um (Datum +
   Lesezeit + Aufrufe + Kommentare passen dort nicht mehr in eine Zeile).
   Nutzerwunsch: nur eine Zeile, kein Umbruch – Kommentare raus (bereits per
   Klasse .lui-comment-count auswählbar). Die Anzahl der Aufrufe war
   anfangs ebenfalls entfernt worden, auf Nutzerwunsch aber wieder ergänzt –
   Datum + Lesezeit + Aufrufe passen zu dritt weiterhin in eine Zeile.
   flex-wrap:nowrap allein verhinderte nur, dass die drei Einträge SELBST
   auf mehrere Zeilen umbrechen – ohne eigene Breiten-Angabe schrumpfte der
   Browser trotzdem jeden einzelnen Eintrag unter seine natürliche
   Textbreite, wodurch der TEXT INNERHALB jedes Eintrags umbrach ("9.
   September" / "2025" händisch untereinander). white-space:nowrap auf den
   Einträgen selbst verhindert das, macht die Zeile dadurch aber insgesamt
   breiter als die Karte – ohne eigene Schriftgröße/Lücke wurde "Aufrufe"
   am Kartenrand abgeschnitten (.lui-hero hat overflow:hidden). Etwas
   kleinere Schrift + engere Lücke schaffen genug Platz für alle drei
   Angaben ohne Abschneiden. */
@media ( max-width: 599px ) {
	.lui-hero-overlay .lui-meta {
		flex-wrap: nowrap;
		font-size: 0.6875rem;
		gap: 0.35em;
	}
	.lui-hero-overlay .lui-meta > * {
		white-space: nowrap;
	}
	.lui-hero-overlay .lui-meta > .lui-comment-count {
		display: none;
	}
}

/* "Neueste Artikel": 65/35-Aufteilung zwischen Artikelliste und Sidebar.
   Als CSS-Regel statt Inline-style="" am Block (wie zuvor): Ein Inline-Style
   ohne passendes Block-Attribut lässt den Block-Editor den Block als
   "ungültig" melden. */
.lui-latest-articles-main {
	flex: 1 1 65%;
}
.lui-latest-articles-aside {
	flex: 1 1 30%;
}

/* "Neueste Artikel": auf Smartphone-Breite nur die Liste zeigen, ohne Sidebar. */
@media ( max-width: 599px ) {
	.lui-latest-articles-aside {
		display: none;
	}
	.lui-latest-articles-main {
		flex: 1 1 100% !important;
	}
}

/* Nutzerwunsch (Screenshot: ein 3-zeiliger Titel überlappte auf schmaler
   Breite das Kategorie-Badge oben links): Auf Smartphone-Breite soll der
   Hero statt der Text-Overlay-über-dem-Bild-Optik (Titel/Meta/Teaser mit
   dunklem Verlauf über dem Bild, siehe .lui-hero-overlay oben – bleibt
   für Desktop unverändert) dasselbe Format wie "Im Fokus" & Co. bekommen:
   Bild oben (nur Kategorie-Badge behält seinen Platz darauf), Titel/
   Teaser/Meta normal darunter in Fließtext-Farben. Das behebt die
   Kollision unabhängig von der Titellänge, weil der Text dem Bild nie mehr
   in der Höhe "im Weg steht", sondern es nach unten wegdrückt. */
@media ( max-width: 599px ) {
	/* !important nötig: .lui-hero-overlay/.wp-block-post-title bekommen ganz
	   oben in dieser Datei bewusst FEST WEISSE Schrift per !important, extra
	   losgelöst vom Light-/Dark-Mode-Umschalter (Kommentar dort: "unabhängig
	   vom Farbmodus", da der Text sonst über dem dunklen Bild-Verlauf im
	   jeweils falschen Modus unlesbar wäre). Ohne eigenen dunklen Verlauf im
	   neuen Nicht-Overlay-Format greift dieser Grund nicht mehr – die
	   normale, an den aktuellen Modus angepasste Textfarbe muss hier aber
	   selbst mit !important erzwungen werden, sonst gewinnt weiterhin die
	   frühere !important-Regel. */
	.lui-hero-overlay {
		position: static;
		inset: auto;
		background: none;
		color: inherit !important;
	}
	.lui-hero-overlay p,
	.lui-hero-overlay .lui-meta {
		color: inherit !important;
	}
	.lui-hero-overlay .lui-meta > *:not( :first-child ):not( :empty )::before {
		color: var( --wp--preset--color--border );
	}
	/* Nutzerwunsch (Folge-Feinschliff): Der Titel soll wieder als Overlay
	   direkt im Thumbnail sitzen (wie ursprünglich auf Desktop), Meta-Zeile
	   und Auszugstext aber wie zuletzt eingerichtet unterhalb des Bildes
	   bleiben. Titel bleibt dafür weiterhin ein DOM-Kind von
	   .lui-hero-overlay (kein Markup-Umbau nötig) – position:absolute holt
	   ihn trotzdem aus deren Textfluss heraus, seine Positionierung bezieht
	   sich dann auf den nächsten POSITIONIERTEN Vorfahren, das ist .lui-hero
	   selbst (.lui-hero-overlay ist ja gerade auf position:static gesetzt).
	   Größe/Position exakt wie beim Bild selbst (dieselbe --lui-hero-pad-
	   Rechnung wie bei .lui-hero-slider-controls, dieselbe 4:3-aspect-ratio)
	   – deckt sich dadurch exakt mit dem Thumbnail, unabhängig von Meta-Zeile
	   und Auszug darunter. */
	.lui-hero-overlay .wp-block-post-title {
		position: absolute;
		top: calc( 1px + var( --lui-hero-pad ) );
		left: calc( 1px + var( --lui-hero-pad ) );
		width: calc( 100% - 2 * ( 1px + var( --lui-hero-pad ) ) );
		aspect-ratio: 4 / 3;
		margin: 0;
		padding: 1rem;
		display: flex;
		align-items: flex-end;
		background: linear-gradient( 0deg, rgba( 26, 26, 26, 0.85 ) 0%, rgba( 26, 26, 26, 0.55 ) 55%, rgba( 26, 26, 26, 0 ) 100% );
		border-radius: 0 0 8px 8px;
	}
	.lui-hero-overlay .wp-block-post-title a {
		color: #ffffff !important;
		/* "display"-Schriftgröße (siehe wp:post-title-Attribut in
		   front-page.html) ist für die volle Kartenbreite gedacht – im jetzt
		   schmaleren, eingerückten Thumbnail (siehe --lui-hero-pad weiter
		   oben) wirkte sie unproportional groß und drängte den Titel bei 3
		   Zeilen bis auf Höhe der Pfeile nach oben. Etwas kleiner plus
		   line-clamp:2 (analog zum Auszugstext darunter) hält den Titel
		   zuverlässig im unteren Bilddrittel, unabhängig von der Titellänge. */
		font-size: 1.375rem;
		display: -webkit-box;
		-webkit-box-orient: vertical;
		-webkit-line-clamp: 2;
		overflow: hidden;
	}
	/* War bislang ausgeblendet, weil er sonst im Overlay den Titel verdeckt
	   hätte (siehe Regel weiter oben) – im normalen Textfluss unterhalb des
	   Bildes gibt es dieses Problem nicht mehr, genau wie bei "Im Fokus". */
	.lui-hero-overlay .wp-block-post-excerpt {
		display: block;
	}
	/* Nutzerwunsch: Die Höhe der gesamten Hero-Box soll auf Smartphone-
	   Hochkant nicht mehr je nach Artikel schwanken – bisher variierte sie
	   sichtbar, je nachdem, ob der Auszugstext 2 oder (bei kurzen Wörtern
	   innerhalb der festen excerptLength:26) auch mal 3-4 Zeilen belegte.
	   -webkit-line-clamp kappt den Auszug unabhängig vom tatsächlichen
	   Text zuverlässig auf feste 2 Zeilen (mit "…"), wodurch die Box immer
	   dieselbe Höhe behält – dieselbe Technik, mit der Card-Auszüge auch
	   sonst in der Praxis üblich begrenzt werden. */
	.lui-hero-overlay .wp-block-post-excerpt p {
		display: -webkit-box;
		-webkit-box-orient: vertical;
		-webkit-line-clamp: 2;
		overflow: hidden;
	}
}

/* Nutzerwunsch als Folge-Feinschliff: Durch das neue Nicht-Overlay-Format
   (siehe oben) sieht der Hero auf Smartphone-Breite optisch nicht mehr
   anders aus als eine normale Karte ("Im Fokus" & Co.) – er soll sich aber
   klar als "besonderer" Aufmacher abheben. Erster Versuch mit dezentem
   Schatten (identischer Wert wie beim eingescrollten Header) wirkte dem
   Nutzer zufolge noch nicht "besonders genug gestaltet" – gewünscht ist
   stattdessen eine Anlehnung an den bereits etablierten Titelkasten der
   Artikelansicht (.lui-article-header, siehe oben): 1px Rahmen in der
   Standard-Rahmenfarbe, dicker 4px-Akzentstreifen oben in Markenfarbe,
   getönte Fläche hinter dem Text (dieselbe --base-2-Fläche, die auch die
   Kategorie-Sektionen weiter unten als Hintergrund nutzen). Dieselbe
   Wiedererkennung wie beim Artikel-Titelkasten, nur eben schon auf der
   Startseite als Vorschau auf den dortigen Stil. */
@media ( max-width: 599px ) {
	/* Eigene Custom Property statt der clamp()-Formel doppelt zu pflegen:
	   .lui-hero-slider-controls (siehe weiter unten) braucht denselben
	   Wert, um Pfeile/Punkte weiterhin exakt über dem jetzt eingerückten
	   Bild auszurichten – an .lui-hero-slider gesetzt (gemeinsamer Vorfahre
	   von .lui-hero und .lui-hero-slider-controls), damit beide Stellen sie
	   per Vererbung lesen können. */
	.lui-hero-slider {
		--lui-hero-pad: clamp( 1.25rem, 4vw, 2rem );
	}
	.lui-hero {
		background: var( --wp--preset--color--base-2 );
		border: 1px solid var( --wp--preset--color--border );
		border-top: 4px solid var( --wp--preset--color--accent );
		padding: var( --lui-hero-pad );
	}
	.lui-hero-overlay {
		/* Nur noch ein oberer Abstand zum Bild – links/rechts/unten kommt
		   jetzt einheitlich vom Padding auf .lui-hero selbst (wie beim
		   Artikel-Titelkasten: EIN Innenabstand für den gesamten Kasten,
		   nicht zwei verschachtelte). */
		padding: var( --wp--preset--spacing--20 ) 0 0;
	}
}

/* Hero-Slider: rotiert durch mehrere Aufmacher ----------------------------- */
.lui-hero-slider {
	position: relative;
}
/* Pfeile/Pause/Punkte sollen über dem BILD schweben, nicht über der ganzen
   (jetzt auf Smartphone-Breite durch Titel/Teaser/Meta darunter höheren,
   siehe .lui-hero-overlay oben) Karte. display:contents lässt die Kinder
   auf Desktop wie bisher direkt relativ zu .lui-hero-slider positionieren
   (dort bleibt der Hero unverändert eine reine Bildfläche mit Text-Overlay,
   Höhe = Bildhöhe). Auf Smartphone-Breite wird der Wrapper stattdessen
   selbst zur echten, eigenen absolut positionierten Fläche mit derselben
   16:9-aspect-ratio wie das Bild – deckt sich dadurch exakt mit dem Bild,
   unabhängig davon, wie viel Text darunter noch folgt. */
.lui-hero-slider-controls {
	display: contents;
}
@media ( max-width: 599px ) {
	.lui-hero-slider-controls {
		display: block;
		position: absolute;
		/* .lui-hero hat jetzt selbst Rahmen (1px) + Padding (--lui-hero-pad,
		   dieselbe Custom Property wie am Bild), das Bild rückt dadurch um
		   genau diesen Betrag von der Kante von .lui-hero-slider ein – ohne
		   den Versatz hier nachzuziehen, würden Pfeile/Punkte weiterhin an
		   der alten (Rand-)Position schweben statt über dem jetzt kleineren
		   Bild. */
		top: calc( 1px + var( --lui-hero-pad ) );
		left: calc( 1px + var( --lui-hero-pad ) );
		/* Ohne das hier: WordPress' globaler Block-Abstand (.is-layout-flow >
		   *:not(:first-child), da .lui-hero-slider-controls das zweite Kind
		   von .lui-hero-slider ist) setzt sonst automatisch einen
		   margin-top von ~18px – bei einem absolut positionierten Element
		   verschiebt dieser Margin trotzdem die tatsächliche Position (top:0
		   bezieht sich auf Kante + Margin), wodurch die Fläche nicht mehr mit
		   dem Bild übereinstimmte. */
		margin: 0;
		width: calc( 100% - 2 * ( 1px + var( --lui-hero-pad ) ) );
		/* Muss mit der aspect-ratio des Bildes übereinstimmen (siehe
		   .lui-hero .wp-block-post-featured-image img weiter oben), sonst
		   schweben Pfeile/Punkte nicht mehr exakt über dem Bild. */
		aspect-ratio: 4 / 3;
		pointer-events: none;
	}
	.lui-hero-slider-controls > * {
		pointer-events: auto;
	}
}
/* Fallback ohne/vor JavaScript: der erste Slide (neuester Artikel) ist
   immer sichtbar, rein per CSS – unabhängig davon, ob/wann das Slider-Skript
   läuft. Vorher hing die Sichtbarkeit ALLER Slides ausschließlich von der
   per JS gesetzten Klasse "is-active" ab (siehe interactions.js,
   goTo()) – lief das Skript aus irgendeinem Grund nicht (Nutzerbericht:
   auf der Live-Seite mit aktiviertem WP-Fastest-Cache-JS-Minify
   verschwand der komplette Hero-Banner spurlos, ohne Caching war alles
   korrekt – klassisches Symptom für ein early-erroring/verzögertes
   Skript, das den späteren Hero-Init-Code nie erreicht), blieben schlicht
   ALLE Slides bei display:none und die Box wirkte leer. Die Klasse
   "is-js-ready" (siehe unten) schaltet erst nach erfolgreichem JS-Start auf
   die volle, per Klasse gesteuerte Slider-Logik um.

   Stolperfalle beim ersten Versuch dieses Fixes: ":first-child" DIREKT auf
   ".lui-hero-slide" gesetzt traf auf JEDEN Slide zu, nicht nur den ersten –
   der Query-Loop-Block wickelt jeden Beitrag serverseitig in ein EIGENES
   <li class="wp-block-post"> (siehe core/post-template), wodurch jedes
   <article class="lui-hero-slide"> das JEWEILS EINZIGE und damit
   :first-child-matchende Kind SEINES EIGENEN <li> ist. Ergebnis live:
   alle 5 Slides gleichzeitig sichtbar, untereinander gestapelt. Fix:
   :first-child auf den <li>-Wrapper anwenden (die <li>-Elemente selbst
   SIND direkte Geschwister innerhalb von .lui-hero-slider-track), nicht
   auf das Slide-Element direkt. */
.lui-hero-slider-track .lui-hero-slide {
	display: none;
}
.lui-hero-slider-track > * > :first-child .lui-hero-slide {
	display: block;
}
/* :not(.is-active) statt einfach die Sichtbarkeit des ersten Slides zu
   kippen: Ist der erste Slide gerade selbst der aktive (Slider startet ja
   bei Index 0), soll er sichtbar bleiben – ohne dieses :not() würde die
   höhere Selektor-Spezifität dieser Regel sonst auch dann gewinnen, wenn
   .is-active (weiter unten, aber mit weniger Klassen) eigentlich
   display:block will. */
.lui-hero-slider.is-js-ready .lui-hero-slider-track > * > :first-child .lui-hero-slide:not(.is-active) {
	display: none;
}
.lui-hero-slider-track .lui-hero-slide.is-active {
	display: block;
	animation: lui-hero-fade 0.5s ease;
}
@keyframes lui-hero-fade {
	from { opacity: 0; }
	to { opacity: 1; }
}
.lui-hero-slider-arrow {
	position: absolute;
	top: 50%;
	z-index: 4;
	transform: translateY( -50% );
	width: 44px;
	height: 44px;
	display: flex;
	align-items: center;
	justify-content: center;
	border: none;
	border-radius: 999px;
	background: rgba( 26, 26, 26, 0.55 );
	color: var( --wp--preset--color--base );
	font-size: 1.5rem;
	line-height: 1;
	cursor: pointer;
	transition: background 0.2s ease;
}
.lui-hero-slider-arrow:hover {
	background: var( --wp--preset--color--accent );
}
.lui-hero-slider-arrow.is-prev {
	left: clamp( 0.5rem, 2vw, 1.25rem );
}
.lui-hero-slider-arrow.is-next {
	right: clamp( 0.5rem, 2vw, 1.25rem );
}
.lui-hero-slider-pause {
	position: absolute;
	bottom: clamp( 0.75rem, 2vw, 1.25rem );
	right: clamp( 0.5rem, 2vw, 1.25rem );
	z-index: 4;
	width: 32px;
	height: 32px;
	display: flex;
	align-items: center;
	justify-content: center;
	border: none;
	border-radius: 999px;
	background: rgba( 26, 26, 26, 0.55 );
	color: var( --wp--preset--color--base );
	font-size: 0.7rem;
	line-height: 1;
	cursor: pointer;
	transition: background 0.2s ease;
}
.lui-hero-slider-pause:hover {
	background: var( --wp--preset--color--accent );
}
.lui-hero-slider-dots {
	position: absolute;
	bottom: clamp( 0.75rem, 2vw, 1.25rem );
	left: 50%;
	z-index: 4;
	display: flex;
	gap: 0.5rem;
	transform: translateX( -50% );
}
.lui-hero-slider-dot {
	width: 9px;
	height: 9px;
	padding: 0;
	border: none;
	border-radius: 999px;
	background: rgba( 255, 255, 255, 0.5 );
	cursor: pointer;
	transition: background 0.2s ease, transform 0.2s ease;
}
.lui-hero-slider-dot.is-active {
	background: var( --wp--preset--color--accent );
	transform: scale( 1.2 );
}

/* Dunkle Flächen (Footer, Hero-Overlay): Linkfarben umkehren -------------- */
.lui-on-dark,
.lui-on-dark p,
.lui-on-dark li {
	color: rgba( 255, 255, 255, 0.82 );
}
.lui-on-dark a {
	color: var( --wp--preset--color--base );
}
.lui-on-dark a:hover {
	color: var( --wp--preset--color--accent );
}
.lui-on-dark h1,
.lui-on-dark h2,
.lui-on-dark h3,
.lui-on-dark h4,
.lui-on-dark .wp-block-site-title,
.lui-on-dark .wp-block-site-title a {
	color: var( --wp--preset--color--base );
}

/* Übergroßes, blasses Logo-"L" als Wasserzeichen im Hintergrund. */
.lui-on-dark {
	position: relative;
	overflow: hidden;
}
.lui-on-dark::after {
	content: '';
	position: absolute;
	right: -70px;
	top: 50%;
	transform: translateY( -50% );
	width: 360px;
	height: 360px;
	background-color: #ffffff;
	opacity: 0.045;
	pointer-events: none;
}
.lui-on-dark > * {
	position: relative;
	z-index: 1;
}

/* Footer: "Neueste Beiträge"-Zeile ------------------------------------------
   Terminal-/Log-Optik passend zum Mono-/"//"-Vokabular des restigen Themes:
   jeder Eintrag bekommt per CSS-Counter eine zweistellige "Zeilennummer"
   statt eines Bildes – Bilder wären in fünf schmalen Spalten auf dunklem
   Grund ohnehin kaum lesbar und würden die Zeile stark in die Höhe ziehen. */
.lui-footer-latest .lui-section-title {
	color: var( --wp--preset--color--base );
	margin-bottom: 0;
}
.lui-footer-latest .wp-block-post-template {
	list-style: none;
	margin: var( --wp--preset--spacing--30 ) 0 0;
	padding: 0;
	display: flex;
	flex-wrap: wrap;
	gap: var( --wp--preset--spacing--30 ) var( --wp--preset--spacing--40 );
	counter-reset: lui-footer-latest;
}
.lui-footer-latest .wp-block-post-template > li {
	counter-increment: lui-footer-latest;
	position: relative;
	flex: 1 1 180px;
	min-width: 0;
	padding-left: 1.9em;
}
.lui-footer-latest .wp-block-post-template > li::before {
	content: counter( lui-footer-latest, decimal-leading-zero );
	position: absolute;
	left: 0;
	top: 0.15em;
	font-family: var( --wp--preset--font-family--mono );
	font-size: var( --wp--preset--font-size--small );
	font-weight: 600;
	color: var( --wp--preset--color--accent );
}
.lui-footer-latest-date {
	display: block;
	font-family: var( --wp--preset--font-family--mono );
	color: rgba( 255, 255, 255, 0.5 );
	font-variant-numeric: tabular-nums;
	margin: 0 0 0.2em;
}
.lui-footer-latest .wp-block-post-title {
	margin: 0;
	font-weight: 600;
	line-height: 1.35;
}
.lui-footer-latest .wp-block-post-title a {
	color: var( --wp--preset--color--base );
}
.lui-footer-latest .wp-block-post-title a:hover {
	color: var( --wp--preset--color--accent );
}
.lui-footer-latest .lui-more-link a {
	color: var( --wp--preset--color--accent );
}

/* Footer-Spalten ------------------------------------------------------------
   Überschrift im selben Stil wie die Sidebar-Widget-Überschriften
   (.lui-sidebar h2/h3 weiter unten) – Akzent-Unterstrich statt Versalien,
   damit Sidebar und Footer dieselbe Überschriften-Sprache sprechen. Die
   Textfarbe kommt bewusst NICHT von dort mit (dunkel, für den hellen
   Sidebar-Hintergrund gedacht), sondern bleibt hell über .lui-on-dark h3. */
.lui-footer-columns .wp-block-heading {
	font-size: var( --wp--preset--font-size--medium );
	border-bottom: 2px solid var( --wp--preset--color--accent );
	padding-bottom: 0.5em;
	display: inline-block;
}
.lui-footer-columns ul {
	list-style: none;
	padding: 0;
}
/* Kein margin:0 fürs Kategorie-<ul> selbst (siehe ausführliche Begründung bei
   .lui-sidebar .wp-block-categories weiter unten): Es sitzt ohne
   umschließendes <div> direkt neben der "Themen"-Überschrift, WordPress'
   eigene Block-Gap-Regel braucht dafür ihr margin-block-start auf genau
   diesem Element. Der Reset betrifft nur noch das Social-Links-<ul>, dessen
   Abstand ohnehin separat per .lui-footer-social geregelt ist. */
.lui-footer-columns .wp-block-social-links {
	margin: 0;
}
.lui-footer-columns li {
	margin-bottom: 0.5em;
}
/* Kategorie-Liste ("Themen"): derselbe kleine Akzent-Punkt vor jedem Eintrag
   wie in der Sidebar (.lui-sidebar .wp-block-categories li::before) – ein
   wiederkehrendes Detail statt zweier unterschiedlicher Listen-Optiken. */
.lui-footer-columns .wp-block-categories li {
	display: flex;
	align-items: flex-start;
	gap: 0.55em;
}
.lui-footer-columns .wp-block-categories li::before {
	content: '';
	flex: 0 0 auto;
	width: 0.55em;
	height: 0.55em;
	margin-top: 0.4em;
	background-color: var( --wp--preset--color--accent );
}

/* Social-Icons im Footer: deutlich sichtbarer Abstand zum Beschreibungstext
   darüber und großzügigerer Abstand zwischen den Icons selbst. !important
   nötig: Der umschließende "constrained"-Layout-Block erzwingt sonst per
   margin-block-start (höhere Spezifität durch WordPress' eigene
   Block-Gap-Regel für aufeinanderfolgende Blöcke) den globalen blockGap-
   Wert der Spalte (1rem) – eine normale margin-top-Regel hier würde dagegen
   verlieren. */
.lui-footer-social {
	margin-top: var( --wp--preset--spacing--40 ) !important;
	gap: 0.85rem;
}

/* "Themen": zweispaltig statt einer langen Einzelliste – bei rund 10
   Kategorien sonst unnötig viel vertikale Höhe im Footer. margin-left:auto
   ist der zuverlässige Flexbox-Weg, ein Element bündig ans Ende einer Zeile
   zu schieben – unabhängig davon, wie viel Platz die Brand-Spalte daneben
   gerade beansprucht (justify-content:space-between allein reichte nicht
   zuverlässig bis zum tatsächlichen rechten Rand). */
.lui-footer-topics {
	flex: 0 1 340px;
	margin-left: auto;
}
.lui-footer-topics .wp-block-categories {
	column-count: 2;
	column-gap: 1.5rem;
}
.lui-footer-topics .wp-block-categories li {
	break-inside: avoid;
}

/* Sidebar-Widgetbereiche ---------------------------------------------------- */
.lui-sidebar > .wp-block-group {
	border: 1px solid var( --wp--preset--color--border );
	border-radius: 6px;
	padding: var( --wp--preset--spacing--30 );
	background: var( --wp--preset--color--base-2 );
}
.lui-sidebar > .wp-block-group.has-accent-background-color {
	border-color: var( --wp--preset--color--accent-dark );
}

/* "Blog unterstützen": reiht sich beim Laden ganz normal wie die anderen
   Sidebar-Kästen ein, klebt aber am unteren Viewport-Rand fest, sobald man
   dorthin gescrollt hat – und bleibt dort sichtbar, bis das Ende der (dank
   align-items:stretch auf .lui-two-col nun gleich hohen) Sidebar-Spalte
   erreicht ist, sich also am Artikelende/Footer löst.
   position:sticky mit "bottom" würde nur beim HOCHscrollen greifen (Pendant
   zu "top" beim Runterscrollen) – für das hier gewünschte Verhalten beim
   RUNTERscrollen bleibt daher nur "top", aber mit einem passend berechneten
   Wert: top wird per JS (siehe interactions.js) so gesetzt, dass er der
   Kastenhöhe entspricht, die gerade noch in den unteren Viewport-Rand passt
   (100vh minus eigene Höhe minus etwas Abstand). Dadurch verhält sich der
   Kasten technisch wie ein ganz normaler oben-andockender Sticky-Kasten
   (keine künstlich reservierte Vorab-Höhe wie bei einer flex/100vh-Hülle –
   genau das hatte vorher die unerwünschte Lücke vor dem Kasten erzeugt),
   visuell dockt er aber am UNTEREN Bildschirmrand an. */
.lui-sidebar-support-box {
	position: sticky;
	top: var( --lui-support-box-top, auto );
}
@media ( max-width: 781px ) {
	.lui-sidebar-support-box {
		position: static;
	}
}
.lui-sidebar h2,
.lui-sidebar h3 {
	font-size: var( --wp--preset--font-size--medium );
	border-bottom: 2px solid var( --wp--preset--color--accent );
	padding-bottom: 0.5em;
	display: inline-block;
}
.lui-sidebar .wp-block-categories,
.lui-sidebar .wp-block-latest-comments {
	list-style: none;
	/* Kein margin:0 hier: Diese Blöcke rendern ihre Liste als nacktes <ul>
	   ohne umschließendes <div>, WordPress' eigene Block-Gap-Regel setzt den
	   Abstand zur Überschrift also direkt über margin-block-start auf DIESEM
	   Element. Ein eigenes margin:0 hätte trotz niedrigerer Selektor-Präzedenz
	   von :where(.is-layout-constrained) > * Vorrang und hätte den Abstand
	   unter "Kategorien" (im Gegensatz zu den anderen, in ein <div>
	   verpackten Sidebar-Widgets) auf 0 reduziert. */
	padding: 0;
}
.lui-sidebar .wp-block-categories li {
	display: flex;
	align-items: flex-start;
	gap: 0.55em;
	margin-bottom: 0.5em;
}
/* "Zuletzt auf Mastodon"-Widget: der Shortcode [lui_latest_mastodon] gibt
   bei nicht erreichbarem/leerem Feed die komplette Box (siehe
   lui_latest_mastodon_shortcode() in functions.php) inklusive Wrapper-Div
   selbst aus oder eben gar nichts – hier ist daher nur die Optik nötig,
   kein zusätzliches Ausblenden. */
.lui-mastodon-post {
	white-space: pre-wrap;
}
.lui-mastodon-post-image {
	display: block;
	width: 100%;
	height: auto;
	border-radius: 6px;
	margin-bottom: var( --wp--preset--spacing--20 );
}

/* "Meistgelesen"-Widget: kompakte Liste ohne die üblichen großen
   Überschriften-Abstände, passend zur schmalen Sidebar-Spalte. */
.lui-sidebar-trending {
	list-style: none;
	counter-reset: lui-trending;
	margin: 0;
	padding: 0;
}
.lui-sidebar-trending > li {
	counter-increment: lui-trending;
	position: relative;
	padding-left: 1.6em;
}
.lui-sidebar-trending > li::before {
	content: counter( lui-trending );
	position: absolute;
	left: 0;
	top: 0.1em;
	font-family: var( --wp--preset--font-family--mono );
	font-weight: 700;
	color: var( --wp--preset--color--accent );
}
.lui-sidebar-trending .wp-block-post-title {
	margin: 0;
	line-height: 1.3;
}
.lui-sidebar-trending .wp-block-post-title a {
	color: var( --wp--preset--color--contrast );
	text-decoration: none;
}
.lui-sidebar-trending .wp-block-post-title a:hover {
	color: var( --wp--preset--color--accent );
}
.lui-sidebar-trending p {
	margin: 0.2em 0 0;
}
.lui-sidebar .wp-block-categories li::before {
	content: '';
	flex: 0 0 auto;
	width: 0.6em;
	height: 0.6em;
	margin-top: 0.35em;
	background-color: var( --wp--preset--color--accent );
}

/* Leerer Zustand (keine Suchergebnisse / keine Beiträge). ------------------- */
.wp-block-query-no-results {
	text-align: center;
	padding: var( --wp--preset--spacing--50 ) 0;
	color: var( --wp--preset--color--muted );
}
.wp-block-query-no-results::before {
	content: '';
	display: block;
	width: 56px;
	height: 56px;
	margin: 0 auto var( --wp--preset--spacing--20 );
	/* Farb-Token statt fixem Hex: kippt im Dark Mode automatisch mit
	   "border" mit, ganz ohne eigenen @media-Override (siehe oben). */
	background-color: var( --wp--preset--color--border );
}

/* Karten (Group-Block-Style "Karte") ---------------------------------------- */
.is-style-lui-card {
	border: 1px solid var( --wp--preset--color--border );
	border-radius: 8px;
	overflow: hidden;
	box-sizing: border-box;
	transition: box-shadow 0.2s ease, transform 0.2s ease;
}
/* Innerhalb von Spalten (z. B. Spenden-Karten) auf volle, durch Flexbox
   gestreckte Spaltenhöhe bringen, damit alle Karten einer Reihe gleich
   hoch sind – unabhängig von unterschiedlich viel Inhalt. */
.wp-block-column > .is-style-lui-card {
	height: 100%;
}
.is-style-lui-card:hover {
	box-shadow: 0 10px 30px rgba( 0, 0, 0, 0.1 );
	transform: translateY( -2px );
}

/* Button-Outline-Variante ---------------------------------------------------- */
.is-style-lui-outline .wp-block-button__link {
	background: transparent;
	color: var( --wp--preset--color--contrast );
	box-shadow: inset 0 0 0 2px var( --wp--preset--color--contrast );
}
.is-style-lui-outline .wp-block-button__link:hover {
	background: var( --wp--preset--color--contrast );
	color: var( --wp--preset--color--base );
	box-shadow: inset 0 0 0 2px var( --wp--preset--color--contrast );
}

/* Trennzeichen-Punkt --------------------------------------------------------- */
.is-style-lui-dot {
	border: none;
	text-align: center;
	height: auto;
}
.is-style-lui-dot::before {
	content: '● ● ●';
	color: var( --wp--preset--color--accent );
	letter-spacing: 0.5em;
	font-size: 0.75rem;
}

/* Affiliate-Kennzeichnung im Beitragsinhalt --------------------------------
   Die allgemeine externe-Link-Kennzeichnung (Pfeil-Icon) lief hier früher
   zusätzlich per CSS-Attributselektor auf einer fest verdrahteten Domain
   (linuxundich.de) – das kollidierte auf jeder anderen Domain (z. B. dieser
   Testinstanz) mit JEDEM internen Link und erzeugte zusammen mit der
   neueren, domain-unabhängigen JS-Lösung (.lui-external-link, siehe unten)
   sichtbar doppelte Pfeile. Diese CSS-Variante ist daher entfernt; nur die
   Amazon-Affiliate-Kennzeichnung bleibt (unabhängig von der Domain gültig). */
.entry-content a[href*='amzn.to'],
.entry-content a[href*='amazon.de'],
.wp-block-post-content a[href*='amzn.to'],
.wp-block-post-content a[href*='amazon.de'] {
	background-image: none;
	padding-right: 0;
	position: relative;
}
.entry-content a[href*='amzn.to']::after,
.entry-content a[href*='amazon.de']::after,
.wp-block-post-content a[href*='amzn.to']::after,
.wp-block-post-content a[href*='amazon.de']::after {
	content: 'Affiliate-Link';
	display: inline-block;
	margin-left: 0.4em;
	font-size: 0.7em;
	font-weight: 700;
	text-decoration: none;
	color: var( --wp--preset--color--base );
	background: var( --wp--preset--color--contrast-2 );
	padding: 0.1em 0.5em;
	border-radius: 3px;
	vertical-align: middle;
}

/* Query-Loop-Karten: konsistente Höhe der Textblöcke ------------------------ */
.wp-block-post-template {
	gap: 2rem 1.5rem;
}
.wp-block-post-excerpt {
	color: var( --wp--preset--color--muted );
}

/* Paginierung ---------------------------------------------------------------- */
.wp-block-query-pagination-numbers a,
.wp-block-query-pagination-numbers span,
.wp-block-query-pagination-next,
.wp-block-query-pagination-previous {
	font-family: var( --wp--preset--font-family--mono );
	font-weight: 500;
	text-decoration: none;
}
.page-numbers.current {
	color: var( --wp--preset--color--accent );
	font-weight: 700;
}

/* Auszugstext in kompakten Karten (z. B. "Ähnliche Beiträge") auf zwei
   Zeilen begrenzen, unabhängig von der tatsächlichen Auszugslänge. */
.lui-clamp-2 {
	display: -webkit-box;
	-webkit-line-clamp: 2;
	-webkit-box-orient: vertical;
	overflow: hidden;
	margin-top: 0.25rem !important;
}

/* Bild-Bildunterschrift im Beitragskopf (Featured Image) -------------------- */
.wp-block-post-featured-image {
	border-radius: 8px;
	overflow: hidden;
}

/* Artikeltext (post-content) ist als "constrained" Layout markiert, damit
   einzelne Inhalts-Blöcke breit ausgerichtet werden können – WordPress hängt
   dadurch aber automatisch eigenes Seiten-Padding an (.has-global-padding),
   das Titel, Auszug und Beitragsbild nicht bekommen. Ohne diese Korrektur
   wäre der Fließtext schmäler als der Rest des Artikels. */
.entry-content.has-global-padding {
	padding-left: 0;
	padding-right: 0;
}

/* Zitate: dezentes "L"-Wasserzeichen in der Ecke, statt Standard-Anführungszeichen. */
.wp-block-quote {
	position: relative;
	overflow: hidden;
}
.wp-block-quote::after {
	content: '';
	position: absolute;
	right: 14px;
	bottom: 10px;
	width: 46px;
	height: 46px;
	background-color: var( --wp--preset--color--accent );
	opacity: 0.12;
	pointer-events: none;
}

/* Theme-Umschalter im Header -------------------------------------------- */
.lui-theme-toggle {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 32px;
	height: 32px;
	padding: 0;
	flex-shrink: 0;
	border: none;
	border-radius: 999px;
	background: transparent;
	color: var( --wp--preset--color--contrast );
	cursor: pointer;
	transition: color 0.2s ease, background 0.2s ease;
}
.lui-theme-toggle:hover {
	color: var( --wp--preset--color--base );
	background: var( --wp--preset--color--accent );
}
.lui-theme-toggle-icon.is-sun {
	display: none;
}
.lui-theme-toggle.is-dark .lui-theme-toggle-icon.is-moon {
	display: none;
}
.lui-theme-toggle.is-dark .lui-theme-toggle-icon.is-sun {
	display: block;
}

/* Breadcrumbs -------------------------------------------------------------- */
.lui-breadcrumbs {
	display: flex;
	flex-wrap: wrap;
	gap: 0.4em;
	font-family: var( --wp--preset--font-family--mono );
	font-size: var( --wp--preset--font-size--small );
	color: var( --wp--preset--color--muted );
	margin-bottom: var( --wp--preset--spacing--20 );
}
.lui-breadcrumbs a {
	color: inherit;
	text-decoration: none;
}
.lui-breadcrumbs a:hover {
	color: var( --wp--preset--color--accent );
	text-decoration: underline;
}
.lui-breadcrumbs-sep {
	opacity: 0.5;
}
.lui-breadcrumbs [aria-current="page"] {
	color: var( --wp--preset--color--contrast );
}

/* Lese-Fortschrittsbalken ---------------------------------------------------- */
.lui-reading-progress {
	position: fixed;
	top: 0;
	left: 0;
	height: 3px;
	width: 0%;
	background: var( --wp--preset--color--accent );
	z-index: 1000;
	pointer-events: none;
}

/* Copy-Button an Code-Blöcken ------------------------------------------------ */
.lui-article-body pre {
	position: relative;
}
.lui-copy-code-button {
	position: absolute;
	top: 0.6em;
	right: 0.6em;
	font-size: 1.2rem;
	line-height: 1;
	color: #f5f4f2;
	background: rgba( 255, 255, 255, 0.08 );
	border: 1px solid rgba( 255, 255, 255, 0.25 );
	border-radius: 4px;
	padding: 0.25em 0.5em;
	cursor: pointer;
	opacity: 0;
	transition: opacity 0.15s ease, background 0.15s ease;
}
.lui-article-body pre:hover .lui-copy-code-button,
.lui-copy-code-button:focus-visible {
	opacity: 1;
}
.lui-copy-code-button:hover {
	background: rgba( 255, 255, 255, 0.2 );
}
.lui-copy-code-button.is-copied {
	background: var( --wp--preset--color--tip );
	border-color: var( --wp--preset--color--tip );
	color: #ffffff;
	opacity: 1;
}

/* Terminal-Codeblöcke: Befehl/Ausgabe/Kommentar optisch unterscheiden -------
   Aufgebaut von interactions.js aus einfachem "$ "/"# "/"### "-Präfix im
   Artikeltext. Farben bewusst als feste Hex-Werte statt Preset-Farb-Token:
   Der Codeblock-Hintergrund bleibt unabhängig vom Hell-/Dunkelmodus der
   Seite immer dunkel (#1a1a1a, siehe .wp-block-code weiter oben) – ein
   Preset-Token, das im Dark Mode der SEITE umspringt, könnte hier je nach
   Modus zu wenig Kontrast gegenüber diesem fixen Hintergrund ergeben. */
.lui-shell-line {
	white-space: pre-wrap;
	word-break: break-word;
}
.lui-shell-line--cmd {
	display: flex;
	align-items: baseline;
	gap: 0.6em;
}
.lui-shell-prompt {
	flex: 0 0 auto;
	color: #6ec98f;
	user-select: none;
}
.lui-shell-line--root .lui-shell-prompt {
	color: #ff8a65;
}
.lui-shell-cmd {
	flex: 1 1 auto;
	color: #ffffff;
	font-weight: 600;
}
.lui-shell-copy {
	flex: 0 0 auto;
	align-self: center;
	border: 0;
	background: none;
	color: #f5f4f2;
	opacity: 0.35;
	cursor: pointer;
	font-size: 1.3em;
	line-height: 1;
	padding: 0.15em 0.3em;
	border-radius: 4px;
	transition: opacity 0.15s ease, background-color 0.15s ease;
}
.lui-shell-line--cmd:hover .lui-shell-copy,
.lui-shell-copy:focus-visible {
	opacity: 1;
	background: rgba( 255, 255, 255, 0.1 );
}
.lui-shell-copy.is-copied {
	opacity: 1;
	color: var( --wp--preset--color--tip );
}
.lui-shell-line--output {
	color: #9a9a95;
}
.lui-shell-line--comment {
	color: #7a8fa6;
	font-style: italic;
}

/* Anchor-Links an Überschriften im Artikeltext ------------------------------- */
.lui-article-body :is( h2, h3, h4 ) {
	position: relative;
}
.lui-heading-anchor {
	position: absolute;
	left: -1.1em;
	top: 0;
	bottom: 0;
	display: flex;
	align-items: center;
	opacity: 0;
	color: var( --wp--preset--color--accent );
	text-decoration: none;
	font-weight: 400;
}
.lui-article-body :is( h2, h3, h4 ):hover .lui-heading-anchor,
.lui-heading-anchor:focus-visible {
	opacity: 1;
}

/* Inhaltsverzeichnis für lange Artikel ---------------------------------------- */
.lui-toc {
	background: var( --wp--preset--color--base-2 );
	border: 1px solid var( --wp--preset--color--border );
	border-radius: 8px;
	padding: 1rem 1.25rem;
	margin: 1.75rem 0;
}
.lui-toc summary {
	cursor: pointer;
	font-family: var( --wp--preset--font-family--mono );
	font-weight: 700;
	text-transform: uppercase;
	font-size: var( --wp--preset--font-size--small );
	letter-spacing: 0.04em;
	color: var( --wp--preset--color--contrast );
}
.lui-toc[open] summary {
	margin-bottom: 0.75em;
}
.lui-toc-list,
.lui-toc-list ol {
	list-style: none;
	margin: 0;
	padding: 0;
}
.lui-toc-list li {
	margin: 0.4em 0 0;
}
.lui-toc-list ol {
	margin-left: 1.1em;
	margin-top: 0.4em;
}
.lui-toc-list a {
	color: var( --wp--preset--color--muted );
	text-decoration: none;
}
.lui-toc-list a:hover {
	color: var( --wp--preset--color--accent );
	text-decoration: underline;
}

/* Altbeiträge (24 Stück, bis in aktuelle 2025er-Artikel hinein) haben ein
   von einem früher offenbar aktiven SEO-Plugin fest in den Inhalt
   eingefügtes Inhaltsverzeichnis (.wp-block-rank-math-toc-block) – optisch
   auf denselben Look wie .lui-toc gebracht, statt in mehreren
   Beitragsinhalten manuell aufzuräumen. */
.wp-block-rank-math-toc-block {
	background: var( --wp--preset--color--base-2 );
	border: 1px solid var( --wp--preset--color--border );
	border-radius: 8px;
	padding: 1rem 1.25rem;
	margin: 1.75rem 0;
}
.wp-block-rank-math-toc-block::before {
	content: 'Inhaltsverzeichnis';
	display: block;
	font-family: var( --wp--preset--font-family--mono );
	font-weight: 700;
	text-transform: uppercase;
	font-size: var( --wp--preset--font-size--small );
	letter-spacing: 0.04em;
	color: var( --wp--preset--color--contrast );
	margin-bottom: 0.75em;
}
.wp-block-rank-math-toc-block ul {
	list-style: none;
	margin: 0;
	padding: 0;
}
.wp-block-rank-math-toc-block ul ul {
	margin-left: 1.1em;
	margin-top: 0.4em;
}
.wp-block-rank-math-toc-block li {
	margin: 0.4em 0 0;
}
.wp-block-rank-math-toc-block a {
	color: var( --wp--preset--color--muted );
	text-decoration: none;
}
.wp-block-rank-math-toc-block a:hover {
	color: var( --wp--preset--color--accent );
	text-decoration: underline;
}

/* Externe Links im Artikeltext ------------------------------------------------ */
.lui-external-link::after {
	content: '\2197';
	display: inline-block;
	margin-left: 0.2em;
	font-size: 0.85em;
	text-decoration: none;
}

/* Mastodon/Bluesky-Share-Buttons --------------------------------------------- */
.lui-share-buttons {
	display: flex;
	flex-wrap: wrap;
	gap: 0.75rem;
	margin: var( --wp--preset--spacing--30 ) 0;
}
.lui-share-buttons a,
.lui-share-buttons button {
	display: inline-flex;
	align-items: center;
	gap: 0.4em;
	font-family: var( --wp--preset--font-family--mono );
	font-size: var( --wp--preset--font-size--small );
	font-weight: 600;
	text-transform: uppercase;
	letter-spacing: 0.02em;
	color: var( --wp--preset--color--contrast );
	background: var( --wp--preset--color--base-2 );
	border: 1px solid var( --wp--preset--color--border );
	border-radius: 999px;
	padding: 0.5em 1em;
	text-decoration: none;
	cursor: pointer;
	transition: background 0.2s ease, color 0.2s ease, border-color 0.2s ease;
}
.lui-share-buttons a:hover,
.lui-share-buttons button:hover {
	background: var( --wp--preset--color--accent );
	color: var( --wp--preset--color--base );
	border-color: var( --wp--preset--color--accent );
}
.lui-share-buttons svg {
	width: 16px;
	height: 16px;
}

/* Cmd+K-Schnellsuche ---------------------------------------------------------- */
.lui-cmdk-overlay {
	position: fixed;
	inset: 0;
	background: rgba( 0, 0, 0, 0.5 );
	z-index: 2000;
	display: flex;
	align-items: flex-start;
	justify-content: center;
	padding: 10vh 1rem 1rem;
}
.lui-cmdk-overlay[hidden] {
	display: none;
}
.lui-cmdk-panel {
	width: min( 600px, 100% );
	max-width: 100%;
	background: var( --wp--preset--color--base );
	color: var( --wp--preset--color--contrast );
	border-radius: 10px;
	overflow: hidden;
	box-shadow: 0 20px 60px rgba( 0, 0, 0, 0.35 );
}
.lui-cmdk-input {
	display: block;
	width: 100%;
	box-sizing: border-box;
	padding: 1rem 1.25rem;
	font-size: 1.05rem;
	font-family: var( --wp--preset--font-family--body );
	color: inherit;
	background: transparent;
	border: none;
	border-bottom: 1px solid var( --wp--preset--color--border );
}
.lui-cmdk-input:focus {
	outline: none;
}
.lui-cmdk-results {
	max-height: 50vh;
	overflow-y: auto;
}
.lui-cmdk-result {
	display: block;
	padding: 0.75rem 1.25rem;
	color: inherit;
	text-decoration: none;
	border-bottom: 1px solid var( --wp--preset--color--border );
}
.lui-cmdk-result:last-child {
	border-bottom: none;
}
.lui-cmdk-result.is-active,
.lui-cmdk-result:hover {
	background: var( --wp--preset--color--base-2 );
}
.lui-cmdk-empty {
	margin: 0;
	padding: 1.5rem 1.25rem;
	color: var( --wp--preset--color--muted );
	font-size: var( --wp--preset--font-size--small );
}

/* Google-Suchwidget auf /tuxsucht-linux-suche/ ------------------------------
   Das eingebettete Google-Programmable-Search-Element (siehe
   templates/page.html-Inhalt der Seite, #tuxsucht-form) rendert direkt als
   DOM (kein iframe) mit eigenem, teils per Inline-style gesetztem CSS
   (Arial, Google-Blau, eigene Eckenradien) – lässt sich daher über Googles
   dokumentierte gsc-/gs-Klassen umstyeln. !important überall nötig, weil
   Googles eigenes Stylesheet erst asynchron per cse.js nachlädt und manche
   Werte (Eingabefeld-Padding/-Hintergrund) direkt per Inline-style gesetzt
   werden – nur ein !important in einem externen Stylesheet gewinnt gegen
   eine nicht-!important-Inline-Angabe. Bewusst nur Farben/Radien/Abstände
   angefasst, keine Layout-Eigenschaften (Breite/Position/Display), damit
   Googles Autocomplete-Overlay-Positionierung per JS nicht durcheinander
   gerät. */
#tuxsucht-form,
#tuxsucht-form * {
	font-family: var( --wp--preset--font-family--body ) !important;
}

#tuxsucht-form .gsc-control-cse {
	padding: 0 !important;
	border: none !important;
	background-color: transparent !important;
}

/* Suchfeld. background-color statt background: Google legt auf .gsc-input-box
   und .gsib_a per Inline-style/eigenem CSS ein Hintergrundbild ab (Lupen-Icon,
   "Unterstützt durch Google"-Branding im leeren Feld) – das shorthand
   background würde dieses Bild mit löschen. */
#tuxsucht-form .gsc-input-box {
	border: 1px solid var( --wp--preset--color--border ) !important;
	border-radius: 8px !important;
	background-color: var( --wp--preset--color--base ) !important;
}
#tuxsucht-form table.gsc-input {
	background-color: transparent !important;
}
#tuxsucht-form input.gsc-input {
	background-color: transparent !important;
	color: var( --wp--preset--color--contrast ) !important;
	font-size: 1rem !important;
	padding: 0.6rem 0.75rem !important;
}
#tuxsucht-form .gscb_a {
	color: var( --wp--preset--color--muted ) !important;
}

/* Reiter (Alle Ergebnisse / Foren / Bücher / …): SOWOHL der umschließende
   Container (.gsc-refinementsArea) ALS AUCH jeder einzelne Tab
   (.gsc-refinementHeader) tragen bei Google jeweils ihren EIGENEN weißen
   Hintergrund – im Dark Mode ohne beide Overrides ein auffällig heller
   Balken mit einzelnen weißen Kacheln darauf, statt einer einheitlich
   dunklen Fläche. */
#tuxsucht-form .gsc-refinementsArea {
	background-color: transparent !important;
}
#tuxsucht-form .gsc-refinementHeader {
	font-family: var( --wp--preset--font-family--heading ) !important;
	font-size: var( --wp--preset--font-size--small ) !important;
	color: var( --wp--preset--color--muted ) !important;
	background-color: transparent !important;
	padding-bottom: 0.5em !important;
	border-bottom: 2px solid transparent !important;
}
#tuxsucht-form .gsc-refinementhActive {
	color: var( --wp--preset--color--contrast ) !important;
	border-bottom-color: var( --wp--preset--color--accent ) !important;
	font-weight: 700 !important;
}

/* Ergebnis-Info-Zeile ("Ungefähr X Ergebnisse …") */
#tuxsucht-form .gsc-result-info {
	color: var( --wp--preset--color--muted ) !important;
	font-size: var( --wp--preset--font-size--small ) !important;
	padding: 0.75em 0 !important;
}

/* Ergebnisliste */
#tuxsucht-form .gsc-webResult.gsc-result {
	background-color: transparent !important;
	border: none !important;
	padding: 1em 0 !important;
}
#tuxsucht-form .gsc-webResult-divider {
	border-top: 1px solid var( --wp--preset--color--border ) !important;
	margin: 0 !important;
}
#tuxsucht-form a.gs-title {
	color: var( --wp--preset--color--accent-dark ) !important;
	font-family: var( --wp--preset--font-family--heading ) !important;
	font-weight: 700 !important;
	font-size: 1.0625rem !important;
	text-decoration: none !important;
}
#tuxsucht-form a.gs-title:hover {
	color: var( --wp--preset--color--accent ) !important;
	text-decoration: underline !important;
}
/* Google hebt den gesuchten Begriff im Titel per <b> hervor und setzt dafür
   eine eigene, feste Linkfarbe (Google-Blau) – unabhängig von der Farbe des
   umschließenden a.gs-title-Links selbst, daher hier extra zurückgesetzt.
   Im Snippet/in der URL macht Google das nicht (dort erbt <b> bereits
   korrekt unsere Textfarbe), nur der Titel ist betroffen. */
#tuxsucht-form a.gs-title b {
	color: inherit !important;
}
#tuxsucht-form .gs-visibleUrl {
	color: var( --wp--preset--color--muted ) !important;
	font-size: var( --wp--preset--font-size--small ) !important;
}
#tuxsucht-form .gs-snippet {
	color: var( --wp--preset--color--contrast ) !important;
	font-size: var( --wp--preset--font-size--medium ) !important;
	line-height: 1.5 !important;
}

/* "Label"-Chip je Ergebnis (z. B. "Foren") */
#tuxsucht-form .gs-per-result-labels {
	margin-top: 0.4em !important;
}
#tuxsucht-form .gs-per-result-labels > span:first-child {
	display: none; /* das Wort "Label" selbst ist redundant, der Chip-Name reicht */
}
#tuxsucht-form a.gs-label {
	display: inline-block;
	color: var( --wp--preset--color--accent-dark ) !important;
	background: var( --wp--preset--color--base-2 ) !important;
	border-radius: 999px !important;
	padding: 0.15em 0.7em !important;
	text-decoration: none !important;
	font-size: var( --wp--preset--font-size--small ) !important;
}

/* Seitennummern */
#tuxsucht-form .gsc-cursor-page {
	color: var( --wp--preset--color--muted ) !important;
	border-radius: 4px !important;
	padding: 0.3em 0.6em !important;
}
#tuxsucht-form .gsc-cursor-current-page {
	color: var( --wp--preset--color--base ) !important;
	background: var( --wp--preset--color--accent ) !important;
	font-weight: 700 !important;
}

/* "… bei Google suchen" + Pflicht-Branding (nicht entfernt, nur dezenter) */
#tuxsucht-form .gcsc-find-more-on-google-text,
#tuxsucht-form .gcsc-find-more-on-google-query {
	color: var( --wp--preset--color--muted ) !important;
}
#tuxsucht-form .gcsc-find-more-on-google-magnifier path {
	fill: var( --wp--preset--color--muted ) !important;
}
#tuxsucht-form .gcsc-branding-img-noclear {
	opacity: 0.6;
}

/* Vorschlagsbox beim Tippen (Autocomplete) ----------------------------------
   Eigenständige Google-Komponente (.gssb_c) – anders als das restliche
   Such-Widget hängt Google sie direkt unter <body> statt in #tuxsucht-form
   ein, daher hier bewusst OHNE #tuxsucht-form-Scope. Nur die Optik; die
   Position/Breite berechnet Google selbst per JS anhand des Suchfelds und
   trifft das nach unseren CSS-Anpassungen am Suchfeld (Padding/Radius)
   nicht mehr zuverlässig – wird deshalb zusätzlich in interactions.js
   exakt am Suchfeld nachjustiert (siehe dort, alignTuxsuchtSuggestions). */
.gssb_c {
	background-color: var( --wp--preset--color--base ) !important;
	border: 1px solid var( --wp--preset--color--border ) !important;
	border-radius: 8px !important;
	box-shadow: 0 10px 30px rgba( 0, 0, 0, 0.1 );
	font-family: var( --wp--preset--font-family--body ) !important;
	overflow: hidden;
}
.gssb_c td {
	padding: 0.5em 0.9em !important;
	color: var( --wp--preset--color--contrast ) !important;
	font-size: var( --wp--preset--font-size--medium ) !important;
}
/* Google legt den eigentlichen Text jeder Vorschlagszeile in einen eigenen
   ".gsc-completion-container" mit fest WEISSEM Hintergrund ab (unabhängig
   von .gssb_c/.gssb_a, die schon oben/hier transparent gesetzt sind) – ohne
   diese Zeile blieb jede Zeile trotz dunklem .gssb_c-Rahmen innen weiß. */
.gsc-completion-container {
	background-color: transparent !important;
	color: inherit !important;
}
.gssb_c tr:hover td,
.gssb_c .gssb_i {
	background-color: var( --wp--preset--color--base-2 ) !important;
	color: var( --wp--preset--color--contrast ) !important;
}
/* Per Tastatur (Pfeiltasten) markierte Vorschlagszeile: Google setzt dafür
   eine eigene, für einen weißen Hintergrund gedachte 8%-Schwarz-Abdunklung
   (".gsc-completion-selected"), die auf unserem jetzt dunklen Hintergrund
   praktisch unsichtbar wäre – gleiche Hervorhebungsfarbe wie beim Hover
   oben (.gssb_c tr:hover td) für ein einheitliches Bild. */
.gsc-completion-selected {
	background-color: var( --wp--preset--color--base-2 ) !important;
}
.gssb_c b {
	color: var( --wp--preset--color--accent-dark ) !important;
}
.gssb_c img {
	opacity: 0.6;
}

/* Kontaktformular (siehe lui_contact_form_shortcode() in functions.php,
   ersetzt Torro Forms) -------------------------------------------------------
   Gleiche Bausteine wie an anderer Stelle im Theme bereits etabliert:
   Eingabefelder im Look von .lui-comment-edit-textarea, Erfolgs-/
   Fehlermeldung als Hinweis-Karte im Stil von .lui-comment-pending-notice
   (getönte Fläche, 1px Rahmen, dicker Akzentstreifen oben). */
.lui-contact-notice {
	margin-bottom: var( --wp--preset--spacing--30 );
	padding: 1em 1.25em;
	background: var( --wp--preset--color--base-2 );
	border: 1px solid var( --wp--preset--color--border );
	border-top: 4px solid var( --wp--preset--color--accent );
	border-radius: 8px;
}
.lui-contact-notice-error {
	border-top-color: var( --wp--preset--color--warning );
}
.lui-contact-form {
	max-width: 42rem;
}
.lui-contact-field {
	margin-bottom: var( --wp--preset--spacing--20 );
}
.lui-contact-field label {
	display: block;
	margin-bottom: 0.35em;
	font-family: var( --wp--preset--font-family--heading );
	font-weight: 700;
}
.lui-contact-field .required {
	color: var( --wp--preset--color--warning );
}
.lui-contact-field input[type="text"],
.lui-contact-field input[type="email"],
.lui-contact-field textarea {
	display: block;
	width: 100%;
	padding: 0.6em;
	border: 1px solid var( --wp--preset--color--border );
	border-radius: 6px;
	background: var( --wp--preset--color--base );
	color: var( --wp--preset--color--contrast );
	font-family: inherit;
	font-size: 1rem;
}
.lui-contact-field textarea {
	resize: vertical;
}
/* Honeypot: für Menschen (visuell + Screenreader) unsichtbar, für
   Formular-Bots weiterhin normal auffindbar/ausfüllbar – daher bewusst
   NICHT display:none/[hidden] (viele einfachere Bots meiden das gezielt),
   sondern aus dem sichtbaren Bereich verschoben. */
.lui-contact-field-honeypot {
	position: absolute;
	left: -9999px;
	width: 1px;
	height: 1px;
	overflow: hidden;
}
.lui-contact-submit {
	padding: 0.6em 1.4em;
	border: 1px solid var( --wp--preset--color--accent );
	border-radius: 6px;
	background: var( --wp--preset--color--accent );
	color: #ffffff;
	font-family: inherit;
	font-size: 1rem;
	font-weight: 700;
	cursor: pointer;
}
.lui-contact-submit:hover,
.lui-contact-submit:focus-visible {
	background: var( --wp--preset--color--accent-dark );
	border-color: var( --wp--preset--color--accent-dark );
}

/* Kontaktseite: Porträtfoto (siehe /uber-linux-und-ich/kontakt/) ------------
   Vorher ein nacktes, per align:right schwebendes <img> ohne jede
   Bildsprache des Themes (keine Rundung, kein Rahmen) – wirkte wie ein
   Fremdkörper neben den sonst durchgängig abgerundeten Karten/Bildern
   (.lui-media-frame, Kommentar-Avatare). Jetzt als Flex-Zeile mit dem
   einleitenden Absatz statt Text-Umfluss um ein rechtsbündiges Bild –
   fällt bei zu wenig Platz (flexWrap:wrap am Block) sauber auf eine
   eigene Zeile, statt den Fließtext auf mobilen Breiten zu stauchen. */
.lui-contact-intro {
	gap: var( --wp--preset--spacing--30 );
	margin-bottom: var( --wp--preset--spacing--30 );
}
.lui-contact-photo img {
	display: block;
	border-radius: 8px;
	border: 1px solid var( --wp--preset--color--border );
}
.lui-contact-intro-text {
	flex: 1 1 320px;
	min-width: 0;
}

/* Druckansicht (Artikel) -----------------------------------------------------
   Magazin-Stil statt 1:1-Ausdruck der Website: Navigation/Sidebar/Kommentare/
   Interaktionselemente verschwinden, der Fließtext läuft zweispaltig mit
   Initiale (Drop Cap) und Blocksatz wie in einem gedruckten Heft. Elemente,
   die über Spalten/Seiten hinweg brechen dürfen (Bilder, Code, Zitate,
   Überschriften), bekommen bewusst column-span/break-Regeln – sonst würde
   z. B. ein Codeblock mitten durch zwei Spalten oder über einen Seitenumbruch
   hinweg zerrissen. print-color-adjust:exact, damit die Akzentfarbe (Rahmen,
   Initiale, Rubrik) auch dann mitgedruckt wird, wenn der Browser/Treiber
   Hintergrundfarben standardmäßig unterdrückt – betrifft hier nur schmale
   Linien/Text, kein Tintenfresser wie eine großflächige Fläche. */
@media print {
	@page {
		margin: 2cm;
	}

	html {
		-webkit-print-color-adjust: exact;
		print-color-adjust: exact;
	}

	body {
		background: #fff;
		color: #000;
		font-size: 11pt;
		line-height: 1.5;
	}

	/* Website-Chrome und alles rein Interaktive ausblenden – auf Papier
	   ohne Funktion oder ohne Aussagekraft (Aufrufzahlen, Lesefortschritt,
	   Teilen-Buttons, Weiterlesen-Navigation, Kommentarformular …). */
	#wpadminbar,
	.skip-link,
	header.wp-block-template-part,
	footer.wp-block-template-part,
	.lui-breadcrumbs,
	.lui-reading-progress,
	.lui-cmdk-overlay,
	.lui-heading-anchor,
	.lui-copy-code-button,
	.lui-tags-share,
	.lui-post-nav,
	.lui-below-article-section,
	.lui-sidebar-trending-box,
	.lui-sidebar-categories-box,
	.lui-sidebar-tags-box,
	.wp-block-rank-math-toc-block,
	.lui-toc,
	.lui-meta > p:last-child {
		display: none !important;
	}

	/* Zweispaltiges Layout (Artikel + Sidebar) auf eine volle Druckspalte
	   zusammenfalten – die Sidebar ist bereits per display:none weg, hier
	   nur noch die Breitenvorgaben der verbleibenden Artikelspalte lösen. */
	.lui-two-col {
		display: block !important;
	}
	.lui-article-col {
		width: 100% !important;
		flex: none !important;
	}

	/* Artikelkopf: Karten-Optik (Hintergrund/Schatten/Radius) ist ein
	   Bildschirm-Konzept – auf Papier bleibt nur eine schlichte Kopflinie
	   in Akzentfarbe wie bei einem Zeitschriften-Rubrik-Aufmacher. */
	.lui-article-header {
		background: none;
		border: none;
		border-top: 2pt solid var( --wp--preset--color--accent );
		border-radius: 0;
		padding: 0.5cm 0 0.3cm;
		margin-bottom: 0.8cm;
	}
	.wp-block-post-terms.lui-badge {
		display: inline;
		background: none;
		color: var( --wp--preset--color--accent-dark );
		padding: 0;
	}
	.wp-block-post-terms.lui-badge a {
		color: inherit !important;
	}
	.lui-meta {
		color: #333;
		font-size: 9pt;
	}
	.lui-article-lead {
		font-size: 13pt;
		border-left-width: 2pt;
	}

	/* Aufmacherbild randscharf statt abgerundet (Print-Konvention), der
	   Bildrechte-Hinweis wird aus dem abgedunkelten Overlay auf dem Bild zu
	   einer klassischen kursiven Bildunterschrift darunter – ein dunkles
	   Overlay über dem Foto wäre auf Papier nur schlecht lesbarer Grauwert. */
	.lui-article-hero {
		border-radius: 0;
		break-inside: avoid;
	}
	.lui-image-credit {
		position: static;
		display: block;
		max-width: 100%;
		margin: 0.25cm 0 0;
		padding: 0;
		background: none;
		color: #555;
		font-size: 8.5pt;
		font-style: italic;
		white-space: normal;
		overflow: visible;
		text-overflow: clip;
		text-align: left;
	}
	.lui-image-credit a {
		color: inherit !important;
	}

	/* Fließtext: zweispaltiger Blocksatz mit Initiale auf dem ersten
	   Absatz – die eigentliche "Magazin"-Optik. Überschriften, Bilder,
	   Codeblöcke, Zitate und Tabellen spannen bewusst über beide Spalten
	   (column-span:all), damit sie nicht wie Fließtext mittendrin
	   umgebrochen werden. */
	.lui-article-body {
		column-count: 2;
		column-gap: 1cm;
		column-rule: 0.5pt solid #ccc;
		font-size: 10.5pt;
		text-align: justify;
		hyphens: auto;
		orphans: 3;
		widows: 3;
	}
	.lui-article-body > p:first-of-type::first-letter {
		float: left;
		font-family: var( --wp--preset--font-family--heading );
		font-size: 3.4em;
		font-weight: 700;
		line-height: 0.82;
		padding-right: 0.08em;
		color: var( --wp--preset--color--accent );
	}
	.lui-article-body h2,
	.lui-article-body h3,
	.lui-article-body h4,
	.lui-article-body figure,
	.lui-article-body .wp-block-image,
	.lui-article-body .wp-block-gallery,
	.lui-article-body pre,
	.lui-article-body table {
		column-span: all;
	}
	.lui-article-body h2,
	.lui-article-body h3,
	.lui-article-body h4 {
		break-after: avoid;
	}
	.lui-article-body figure,
	.lui-article-body .wp-block-image,
	.lui-article-body pre,
	.lui-article-body blockquote,
	.lui-article-body table {
		break-inside: avoid;
	}
	.lui-article-body pre {
		background: #f5f4f2;
		color: #000;
		border: 0.5pt solid #ccc;
	}
	/* Zitate als Auszeichnungselement ("Pull Quote") statt der
	   dezenten Bildschirm-Optik – ein typisches Magazin-Stilmittel. */
	.lui-article-body blockquote {
		font-family: var( --wp--preset--font-family--heading );
		font-size: 13pt;
		font-style: italic;
		text-align: left;
		border: none;
		border-top: 1pt solid #000;
		border-bottom: 1pt solid #000;
		padding: 0.3cm 0;
		margin: 0.5cm 0;
	}

	.lui-source-line {
		font-size: 8.5pt;
		color: #555;
	}

	/* Autoren-Box: schlichte Rahmenlinie statt Hintergrundfläche/Radius. */
	.lui-author-box {
		background: none;
		border: none;
		border-top: 0.5pt solid #000;
		border-radius: 0;
		padding: 0.4cm 0 0;
		break-inside: avoid;
	}

	a {
		color: inherit;
		text-decoration: underline;
	}

	/* Quellenangabe (siehe lui_print_colophon() in functions.php): am
	   Bildschirm unsichtbar, erscheint nur hier am Fuß des Ausdrucks. */
	.lui-print-colophon {
		display: block !important;
		margin-top: 1cm;
		padding-top: 0.3cm;
		border-top: 0.5pt solid #000;
		font-size: 8pt;
		color: #555;
	}
}

.lui-print-colophon {
	display: none;
}
