/*
 * Nav — ported from the standalone mockup (home-mockup.BACKUP-liked-version.html), fixed
 * frosted-glass bar shown at all times (no scroll-position switching). Reuses the same
 * --hero-* token pattern as hero.css/cta-band.css, self-contained since .nn-nav isn't a
 * descendant of either of those sections.
 *
 * The logo is Custom HTML (two <img> tags, light/dark swapped via media query — see
 * .nn-logo-img below) rather than core/site-title: since the Hero pattern already has its
 * own <h1>, core/site-title's default h1 output would create a second h1 on the front page,
 * which the site-title block doesn't avoid on its own. Files: assets/images/logo-*.png,
 * sourced from nonoise-mockups/logo-*.png (not in git, local reference only).
 *
 * Links reuse the real core/navigation block (ref 21, the DB-managed Navigation entity —
 * see CLAUDE.md Abschnitt 5) styled to match, instead of hardcoding <a> tags — keeps the
 * nav editable in the Site Editor like the rest of the project's navigation. Mobile: WP's
 * own responsive hamburger/overlay behaviour is left as-is (the mockup itself never solved
 * mobile nav, it just hid the links below 720px with nothing to replace them) — only the
 * toggle icon colour is themed here.
 */
.nn-nav,
.nn-nav *,
.nn-nav *::before,
.nn-nav *::after {
	box-sizing: border-box;
}

.nn-nav {
	/* raw palette values for both themes, always available regardless of which is active —
	   see the "Light/Dark-Konvention" block below for why light is the unconditional
	   default and dark is the guarded/explicit variant */
	--ground: #0a1410;
	--ink: #e7e9ec;
	--ink-muted: #b0b5bf;
	--line: #22362c;
	--jade-light: #b7e5ba;
	--paper: #f7f9f7;
	--ink-on-paper: #12211a;
	--ink-on-paper-muted: #5c6d64;
	--line-light: #dfe8e2;
	--jade-dark: #1a5140;

	--hero-bg: var(--paper);
	--hero-ink: var(--ink-on-paper);
	--hero-ink-muted: var(--ink-on-paper-muted);
	--hero-line: var(--line-light);
	--hero-accent: var(--jade-dark);
	--hero-text-shadow: rgba(255, 255, 255, 0.5);

	position: fixed;
	top: 0;
	left: 0;
	right: 0;
	/* war 20 — die klebende Ankernavigation auf den Leistungsseiten (.anchors in cro.css,
	   seo-geo.css usw.) sitzt bei z-index:30, sobald sie einrastet. Die Haupt-Nav lag damit
	   darunter, wodurch ihr aufgeklapptes "Leistungen"-Untermenü hinter der Ankerleiste
	   verschwand statt darüber zu liegen. Die Haupt-Nav (samt Untermenü und mobilem
	   Overlay, beides Nachfahren in derselben Stacking-Context) muss immer über jeder
	   Seiten-eigenen Sticky-Leiste liegen. */
	z-index: 40;
	display: flex;
	align-items: center;
	justify-content: space-between;
	/* war 1.75rem / clamp(1.25rem,3vw,1.75rem) oben/unten — auf Wunsch schlanker, damit die
	   Nav insgesamt weniger Höhe frisst. Seitliche Abstände unverändert. */
	padding: 1.1rem clamp(1.5rem, 5vw, 4rem) clamp(0.85rem, 2.2vw, 1.1rem);
	text-shadow: 0 1px 12px var(--hero-text-shadow);
	border-bottom: 1px solid var(--hero-line);
	/* Light: reines Glas, keine Farbschicht hinter dem Blur (war color-mix mit --paper/
	   #f7f9f7, gab der Nav einen leicht cremigen Weißstich — auf Wunsch entfernt). Der
	   dunkle Tönungs-Layer bleibt bewusst bestehen, siehe Dark-Override unten — nur die
	   Light-Variante war als störend gemeldet. .nn-nav--solid (Ankerleisten-Einrast-Zustand
	   auf den Leistungsseiten) ist davon bewusst unberührt, nutzt weiterhin --hero-bg direkt. */
	background: transparent;
	backdrop-filter: blur(16px);
	-webkit-backdrop-filter: blur(16px);
	margin: 0;
}

@media (prefers-color-scheme: dark) {
	html:not([data-theme="light"]) .nn-nav {
		--hero-bg: var(--ground);
		--hero-ink: var(--ink);
		--hero-ink-muted: var(--ink-muted);
		--hero-line: var(--line);
		--hero-accent: #288760;
		--hero-text-shadow: rgba(0, 0, 0, 0.45);
		background: color-mix(in srgb, var(--hero-bg) 10%, transparent);
	}
}
html[data-theme="dark"] .nn-nav {
	--hero-bg: var(--ground);
	--hero-ink: var(--ink);
	--hero-ink-muted: var(--ink-muted);
	--hero-line: var(--line);
	--hero-accent: #288760;
	--hero-text-shadow: rgba(0, 0, 0, 0.45);
	background: color-mix(in srgb, var(--hero-bg) 10%, transparent);
}

/*
 * ============================================================================
 * Light/Dark-Konvention — jedes künftige themable Pattern sollte diesem Muster folgen:
 *
 *   .nn-x { --token: <light-wert>; ... }                          (Basis, ungeschützt)
 *   @media (prefers-color-scheme: dark) {
 *     html:not([data-theme="light"]) .nn-x { --token: <dark-wert>; }
 *   }
 *   html[data-theme="dark"] .nn-x { --token: <dark-wert>; }
 *
 * Immer Hell als unbedingte Basis, Dunkel als einzige Variante (system- oder
 * explizit-gesteuert) — dadurch reicht IMMER nur eine Bewachung (":not([data-theme=light])"),
 * nie zwei sich widersprechende. `[data-theme]` sitzt auf <html>, gesetzt von
 * assets/js/theme-switcher.js (Klick) + der Inline-Bootstrap in functions.php (verhindert
 * Flackern beim ersten Laden). Ohne gespeicherte Präferenz bleibt das Attribut komplett
 * weg, dann entscheidet ausschließlich prefers-color-scheme.
 * ============================================================================
 */

/* Solide, nicht-transparente Nav — von assets/js/seo-geo.js gesetzt, sobald die klebende
   Ankernavigation einer Leistungsseite (seo-geo-hero.php) unter der Nav einrastet. Der
   normale 10%-Glaslook ist fürs Bild/Farbfeld des Heros gedacht; sobald direkt darunter
   noch ein zweiter geblurrter Streifen (die Ankerleiste) hängt, wirken zwei übereinander
   liegende Transparenz-Ebenen unruhig. Deckend dahinter bleibt die Ankerleiste lesbar.
   Selektor mit `html`-Präfix (statt nur zwei Klassen): die beiden Dark-Mode-Regeln oben
   (html:not([data-theme="light"]) .nn-nav / html[data-theme="dark"] .nn-nav) sind mit
   Spezifität (0,2,1) sonst spezifischer als .nn-nav.nn-nav--solid (0,2,0) und gewinnen im
   Dark Mode immer — die Nav blieb dort dauerhaft im 10%-Glaslook hängen, komplett unabhängig
   vom eingerastet-Zustand der Ankerleiste. Mit `html` zieht die Spezifität gleich (0,2,1),
   die Regel-Reihenfolge (diese Regel steht im File nach den Dark-Blöcken) entscheidet dann
   zugunsten von .nn-nav--solid. */
html .nn-nav.nn-nav--solid {
	background: var(--hero-bg);
}

.nn-logo {
	display: inline-flex;
	align-items: center;
	white-space: nowrap;
}
/* two raster logo files (logo-white.png / logo-dark.png, see nonoise-mockups) swapped via
   the same light-default/dark-guarded-and-explicit pattern as --hero-bg above, since the
   nav bar itself flips between a near-white and a near-black background. */
.nn-logo-img {
	height: 33px;
	width: auto;
	display: block;
}
.nn-logo-img--light {
	display: none;
}
@media (prefers-color-scheme: dark) {
	html:not([data-theme="light"]) .nn-logo-img--light {
		display: block;
	}
	html:not([data-theme="light"]) .nn-logo-img--dark {
		display: none;
	}
}
html[data-theme="dark"] .nn-logo-img--light {
	display: block;
}
html[data-theme="dark"] .nn-logo-img--dark {
	display: none;
}

/* icon-only mark (favicon-white-square.png / favicon-dark-square.png) — shown only below the
   mobile breakpoint (see .nn-nav-mobile-bp comment further down), replacing the full
   wordmark so the compact mobile header has room for the hamburger + envelope button.
   display:none by default on all viewports; the mobile media query below both reveals
   the correct one of this pair (light/dark, same guarded convention as .nn-logo-img
   above) and hides the wordmark pair instead. */
.nn-logo-icon {
	/* war 32px, dann 40px, dann 44px, dann 50px (zwei parallele Sessions haben das Logo
	   unabhängig voneinander vergrößert — 50px aus der jeweils letzten Anpassung
	   übernommen, damit Header und aufgeklapptes Mobile-Menü gleich groß bleiben, siehe
	   .nn-nav-mobile-logo .nn-logo-icon unten). Beide Varianten nutzen jetzt dieselbe
	   quadratisch gepadfelte Grafik (favicon-dark-square.png / favicon-white-square.png),
	   sind also von Haus aus gleich groß in Light und Dark Mode. */
	height: 50px;
	width: 50px;
	/* hidden on every viewport by default; the mobile breakpoint block near the end of this
	   file is the only place either variant is ever revealed (with its own light/dark swap
	   nested inside), so no light/dark distinction is needed at this base rule. */
	display: none;
}

/* right-hand cluster (nav links, CTA button) — grouped into one flex container so
   .nn-nav's own space-between only ever has two things to split (logo left, this group
   right), instead of unevenly spreading three+ independent flex children. The theme
   toggle used to live in here too; it's now in the footer (see footer.css) instead. */
.nn-nav-right {
	display: flex;
	align-items: center;
	/* war clamp(1.25rem, 3vw, 2rem) — auf Wunsch vergrößert, damit Menü und Kontakt-Button
	   sichtbar getrennte Gruppen bilden statt eng aneinanderzurücken. Gilt gleichermaßen für
	   den Abstand vor UND nach dem neuen .nn-nav-sep-Trenner unten (einziger Gap-Wert für
	   alle drei Flex-Kinder: Menü, Trenner, Button). */
	gap: clamp(1.75rem, 4vw, 2.75rem);
}

/* Trennzeichen zwischen Menü und Kontakt-Button (2026-08-29) — rein dekorativ
   (aria-hidden), gedämpfter Ton statt voller Textfarbe, damit es als Trenner statt als
   drittes Wort wirkt. Nur auf Desktop: unterhalb des Mobile-Breakpoints steht hier nur
   noch der Hamburger neben dem Icon-only-Kontakt-Button, ein Pipe dazwischen wäre
   bedeutungslos (siehe Ausblendung im Mobile-Header-Block weiter unten). */
.nn-nav-sep {
	color: var(--hero-ink-muted);
	font-size: 1.2rem;
	line-height: 1;
	font-weight: 400;
}

/* solid button, deliberately FIXED jade (#288760) in both themes rather than the
   theme-swapped --hero-accent — same reasoning as Leistungen's hover-arrow (see CLAUDE.md):
   a solid coloured background with fixed dark text needs a colour that stays readable
   against itself, not one tuned to alternate between a dark and a light background. */
.nn-nav-cta {
	display: inline-flex;
	align-items: center;
	/* Abstand zwischen Text und Icon — vorher kein Gap nötig, da das Icon bis 2026-08-28
	   nur im mobilen Icon-only-Zustand sichtbar war (kein zweites sichtbares Kind). Jetzt,
	   wo das Icon auch auf Desktop neben dem Text steht, braucht es einen Abstand. */
	gap: 0.5rem;
	white-space: nowrap;
	background: #288760;
	color: #06110c;
	/* gleiche Größe wie die Menüpunkte daneben (.nn-nav .nn-links, 1.1rem) — bewusst
	   derselbe Wert, damit Button und Menü in einer Zeile optisch gleichwertig wirken. */
	font-size: 1.1rem;
	font-weight: 700;
	padding: 0.6rem 1.35rem;
	border-radius: 999px;
	text-decoration: none;
	text-shadow: none;
	/* <button> statt <a> seit 2026-08-28 (siehe .nn-nav-cta-details unten) — Browser geben
	   <button> sonst einen eigenen UA-Rand, Hintergrund und Systemfont, die hier nicht
	   gewollt sind; background/color/font-* oben überschreiben das meiste bereits, border
	   und font-family brauchen trotzdem einen expliziten Reset. */
	border: none;
	font-family: inherit;
	cursor: pointer;
	transition: background 0.2s ease, transform 0.2s ease, box-shadow 0.2s ease;
}
.nn-nav-cta:hover,
.nn-nav-cta:focus-visible {
	background: #b7e5ba;
	transform: translateY(-1px);
	box-shadow: 0 8px 20px rgba(183, 229, 186, 0.3);
}
.nn-nav-cta:focus-visible {
	outline: 2px solid #b7e5ba;
	outline-offset: 3px;
}
/* Chat-Sprechblase neben "Kontakt" — seit 2026-08-28 auf JEDER Breite sichtbar (vorher nur
   unterhalb des Mobile-Breakpoints, wo Text UND Icon nie gleichzeitig sichtbar waren).
   Unterhalb des Breakpoints (siehe der dedizierte Block am Dateiende) bleibt der bekannte
   Rollentausch: Text verschwindet, nur das Icon bleibt, Padding schrumpft auf ein rundes
   Tap-Target. currentColor folgt .nn-nav-ctas fixer dunkler Textfarbe oben, braucht daher
   keine eigene Light/Dark-Behandlung. */
.nn-nav-cta-icon {
	display: block;
	width: 1.3rem;
	height: 1.3rem;
}
/* Kontakt-Flyout — seit 2026-08-28 öffnet der Nav-Button keinen Direktlink mehr, sondern
   dieses Vier-Optionen-Menü (WhatsApp/E-Mail/Telefon/Kontakt). Klassen-Toggle (.is-open)
   per assets/js/nav-cta-menu.js statt <details>/<summary>: ein erster Anlauf mit nativem
   <details> scheiterte, weil Browser dessen Inhalt intern wie content-visibility:hidden
   behandeln und Kind-Elementen selbst bei offenem [open]-Attribut keine echte
   Style-Neuberechnung geben (nicht mal inline style="opacity:1 !important" griff) — für
   die gestaffelte Einzel-Animation unten war das ein Sackgassen-Detail des
   Browser-internen Rendering-Modells, kein CSS-Bug. */
.nn-nav-cta-details {
	position: relative;
}
/* 2026-08-28, zweiter Anlauf: bewusst NICHT dieselbe Glas-Karte wie das Leistungen-
   Dropdown — auf Wunsch ein eigenständiger Look. Kein gemeinsamer Container-Hintergrund
   mehr; jede der vier Optionen ist ihr eigener freistehender, farbiger Pill (dasselbe
   fixe Jade wie .nn-cta/.nn-nav-cta selbst — siehe CLAUDE.md "CTA-Buttons sind theme-weit
   vereinheitlicht": solide Buttons bleiben bewusst FIX statt theme-abhängig), mit
   sichtbarem Abstand dazwischen statt einer durchgehenden Liste. */
.nn-nav-cta-menu {
	position: absolute;
	top: calc(100% + 0.75rem);
	right: 0;
	z-index: 5;
	display: flex;
	flex-direction: column;
	/* war flex-end (jede Pill nur so breit wie ihr eigener Text, "Treppen"-Optik) — auf
	   Wunsch einheitlich breit. Ohne eigene width bemisst sich die Breite des (position:
	   absolute) Containers am breitesten Kind; stretch zieht dann alle übrigen Pills auf
	   genau diese Breite hoch, right:0 hält die rechte Kante dabei unverändert fix. */
	align-items: stretch;
	gap: 0.6rem;
	visibility: hidden;
	pointer-events: none;
	/* Sichtbarkeit selbst bleibt ein harter Sprung (nicht animierbar), aber verzögert bis
	   NACH dem Ausblenden der Pills (siehe Kommentar bei .nn-nav-cta-menu a unten) — beim
	   Öffnen dagegen sofort sichtbar (0s), damit die Pills ab Frame 1 einblenden können. */
	transition: visibility 0s linear 0.5s;
}
.nn-nav-cta-details.is-open .nn-nav-cta-menu {
	visibility: visible;
	pointer-events: auto;
	transition: visibility 0s linear 0s;
}
.nn-nav-cta-menu a {
	display: inline-flex;
	align-items: center;
	/* Text linksbündig, Pfeil (falls vorhanden, siehe .nn-nav-cta-menu-arrow) rechtsbündig.
	   Bei nur einem Kind (kein Pfeil, z. B. "Kontakt") landet der Text laut Spezifikation
	   trotzdem am Start-Rand — space-between degeneriert dann von selbst zu flex-start,
	   kein Sonderfall nötig. */
	justify-content: space-between;
	white-space: nowrap;
	padding: 0.7rem 1.3rem;
	border-radius: 999px;
	background: #288760;
	color: #06110c;
	font-size: 0.98rem;
	font-weight: 700;
	text-decoration: none;
	text-shadow: none;
	box-shadow: 0 10px 26px rgba(0, 0, 0, 0.28);
	/* Ruhezustand (Menü geschlossen): unsichtbar und leicht nach oben versetzt — von hier
	   aus faded/rutscht jede Pill einzeln in ihre Endposition, siehe die
	   .is-open-nth-child-Kaskade unten. Deutlich langsamer als die übrigen 0.2s-Hovers im
	   Theme, auf ausdrücklichen Wunsch ("einzeln langsamer erscheinen lassen"). */
	opacity: 0;
	transform: translateY(-14px);
	transition: background 0.2s ease, box-shadow 0.2s ease, opacity 0.45s ease, transform 0.45s ease;
}
/* schräger Pfeil oben rechts bei E-Mail/Telefon/WhatsApp — klassisches "verlässt die
   Seite"-Zeichen für externe Kanäle (öffnet Mail-/Telefon-/WhatsApp-App). "Kontakt" hat
   keinen (führt intern zu /kontakt/), braucht daher auch keine flex:none-Sonderregel. */
.nn-nav-cta-menu-arrow {
	flex: none;
	width: 1rem;
	height: 1rem;
}
/* Offen: jede Pill blendet einzeln ein, gestaffelt von oben (Kontakt, zuerst im DOM) nach
   unten (WhatsApp, zuletzt) — nth-child folgt der visuellen Reihenfolge 1:1, da
   .nn-nav-cta-menu eine simple column-Flexbox ohne reorder ist. */
.nn-nav-cta-details.is-open .nn-nav-cta-menu a {
	opacity: 1;
	transform: translateY(0);
}
.nn-nav-cta-details.is-open .nn-nav-cta-menu a:nth-child(1) {
	transition-delay: 0s;
}
.nn-nav-cta-details.is-open .nn-nav-cta-menu a:nth-child(2) {
	transition-delay: 0.12s;
}
.nn-nav-cta-details.is-open .nn-nav-cta-menu a:nth-child(3) {
	transition-delay: 0.24s;
}
.nn-nav-cta-details.is-open .nn-nav-cta-menu a:nth-child(4) {
	transition-delay: 0.36s;
}
.nn-nav-cta-menu a:hover,
.nn-nav-cta-menu a:focus-visible {
	background: #b7e5ba;
	transform: translateY(-1px);
	box-shadow: 0 12px 28px rgba(0, 0, 0, 0.32);
}
.nn-nav-cta-details.is-open .nn-nav-cta-menu a:hover,
.nn-nav-cta-details.is-open .nn-nav-cta-menu a:focus-visible {
	/* hebt den offenen Zustand über die nth-child-Verzögerungen hinweg auf, sonst würde
	   ein Hover kurz nach dem Öffnen durch die verbleibende transition-delay der Pill
	   ausgebremst wirken. */
	transition-delay: 0s;
}
.nn-nav-cta-menu a:focus-visible {
	outline: 2px solid #b7e5ba;
	outline-offset: 3px;
}

.nn-nav .nn-links.wp-block-navigation {
	/* !important: same recurring WP core specificity issue — the block can carry its own
	   saved font-size preset (e.g. "large") from the Navigation entity's block data, which
	   otherwise wins over a plain rule here. */
	font-size: 1.1rem !important;
	color: var(--hero-ink);
}
.nn-nav .nn-links .wp-block-navigation__container {
	/* descendant selector, not child (>): the visible list isn't a direct child of <nav> —
	   it's nested several levels deep inside .wp-block-navigation__responsive-container,
	   the SAME wrapper structure WP reuses for the mobile modal (see below). A child
	   combinator here silently matches nothing, which was the actual cause of the vertical/
	   huge-text staging bug, not a specificity fight like the other rules in this file. */
	display: flex !important;
	flex-direction: row !important;
	flex-wrap: wrap;
	align-items: center;
	gap: clamp(1.25rem, 3vw, 2.25rem);
	list-style: none;
	margin: 0;
	padding: 0;
}
.nn-nav .nn-links .wp-block-navigation-item__content {
	/* !important: same WP core specificity/print-order issue as the submenu background
	   below — without it the default black link colour wins, most visible inside the
	   submenu dropdown. */
	/* voller Kontrast statt des gedeckten Tons: --hero-ink ist im Light Mode das Schwarz
	   (#12211a) und im Dark Mode das Weiß (#e7e9ec). Bewusst das Token und kein hartes
	   #000 — sonst wäre die Nav im Dark Mode schwarz auf fast schwarz. */
	color: var(--hero-ink) !important;
	/* !important aus demselben Grund wie die Farbe darüber: das Navigation-Block-Markup
	   kann eine eigene, gespeicherte Schriftstärke aus der Entity mitbringen. */
	font-weight: 700 !important;
	text-decoration: none;
}
/* Transition nur auf der Hover-Regel, nicht auf der Basis — siehe Konventions-Kommentar in
   assets/css/leistungen.css bei .nn-service-num (sonst bleibt die Farbe beim Umschalten
   von Light/Dark auf dem alten Wert hängen). */
.nn-nav .nn-links .wp-block-navigation-item__content:hover,
.nn-nav .nn-links .wp-block-navigation-item__content:focus-visible {
	/* Hover geht jetzt auf den Jade-Akzent — der bisherige Hover-Wert (--hero-ink) ist seit
	   der Umstellung oben der Normalzustand, der Hover wäre sonst wirkungslos. */
	color: var(--hero-accent) !important;
	transition: color 0.2s ease;
}
.nn-links .wp-block-navigation-item__content:focus-visible {
	outline: 2px solid var(--hero-accent);
	outline-offset: 4px;
	border-radius: 2px;
}

/* the mockup's nav never had a submenu (it was 3 flat links) — this only exists because
   the real DB-managed navigation entity (ref 21) has grown a "Leistungen" submenu since;
   WP's default is a plain white dropdown panel, themed here to match the frosted-glass
   look of the nav bar itself instead of leaving it as an unstyled sore thumb.

   2026-08-28: komplett überarbeitet — war bis dahin ein sehr knapper, eckiger Kasten (8px
   Radius, 200px Mindestbreite, 0.5rem Innenabstand) ohne jede Öffnungs-Animation (WPs
   eigenes Zeig/Verstecken-CSS toggelt opacity/visibility/height/width hart, ohne
   `transition`, siehe die Regeln unten). Jetzt: größerer Radius (passend zur restlichen
   Karten-/Pill-Sprache der Seite, siehe .nn-kf-info-col/.nn-nav-cta), mehr Luft, deutlich
   breiter, plus ein reines CSS-Slide+Fade beim Öffnen. */
.nn-nav .nn-links.wp-block-navigation .wp-block-navigation__submenu-container {
	/* 2026-08-29, endgültig: KEIN 1:1-Kopieren des Nav-Effekts mehr — Ursache geklärt, das
	   Dropdown ist ein Nachfahre von .nn-nav, das selbst schon backdrop-filter trägt.
	   Verschachteltes backdrop-filter ist über Browser hinweg unzuverlässig (dieselbe
	   Grundursache wie beim "Auf einen Blick"-Karten-Bug auf den Leistungsseiten) — das
	   Dropdown kann strukturell nie so sauber weichzeichnen wie die Nav-Leiste selbst,
	   unabhängig vom Blur-Wert. Bewusste Kompromiss-Entscheidung statt einer weiteren
	   Blur-Anpassung: höhere Tönung (94%) kompensiert, was der Blur nicht zuverlässig
	   schafft. !important: WP core prints a more specific/later block-support style for
	   the default white dropdown background, plain selector specificity doesn't win. */
	background: color-mix(in srgb, var(--hero-bg) 94%, transparent) !important;
	backdrop-filter: blur(20px);
	-webkit-backdrop-filter: blur(20px);
	border: 1px solid var(--hero-line);
	border-radius: 1.25rem;
	padding: 0.85rem;
	/* !important: WPs eigene "geöffnet"-Selektoren (aria-expanded/:focus-within, siehe
	   unten) tragen mehr Klassen/Pseudoklassen und würden ihr eigenes min-width:200px
	   sonst gegen unseren Wunsch nach einer breiteren Karte gewinnen. */
	min-width: 280px !important;
	box-shadow: 0 20px 45px rgba(0, 0, 0, 0.28);
	/* Slide+Fade-Öffnung: WP togglet opacity/visibility bereits selbst (siehe die
	   aria-expanded/:focus-within-Regeln weiter unten, die das eigentliche Zeigen/
	   Verstecken übernehmen) — hier kommt nur die Bewegung/Weichheit dazu, die WP nicht
	   mitbringt. `visibility` bekommt eine eigene, verzögerte Transition, damit sie beim
	   Schließen erst NACH dem Opacity-Fade auf hidden springt (0.28s), beim Öffnen aber
	   sofort auf visible (0s Delay unten in der offenen Regel) — sonst wäre der Inhalt
	   während des gesamten Fade-outs schon unsichtbar/nicht interagierbar. */
	transform: translateY(-10px);
	transition: opacity 0.28s ease, transform 0.28s ease, visibility 0s linear 0.28s;
}
/* Offener Zustand — dieselben zwei Trigger-Selektoren, die WP selbst für
   opacity/visibility/height/width benutzt (siehe die inline gedruckten Core-Regeln),
   hier nur um `transform` und eine verzögerungsfreie visibility-Transition ergänzt. Kein
   Specificity-Konflikt nötig: WP setzt an dieser Stelle kein eigenes `transform`. */
.nn-nav .nn-links .wp-block-navigation-submenu__toggle[aria-expanded="true"] ~ .wp-block-navigation__submenu-container,
.nn-nav .nn-links .has-child:not(.open-on-click):not(.open-on-hover-click):focus-within > .wp-block-navigation__submenu-container {
	transform: translateY(0);
	transition: opacity 0.28s ease, transform 0.28s ease, visibility 0s linear 0s;
}
/* WP core gibt jedem <li> per Inline-Style `background-color: inherit` mit (siehe
   .wp-block-navigation-item in der von WP selbst gedruckten Basis-CSS) — dadurch malt
   jede Zeile die Glas-Farbe des Panels ein zweites Mal auf sich selbst, ohne dessen
   backdrop-filter:blur. Zwei übereinandergestapelte durchscheinende Ebenen wirken
   sichtbar solider/weißer als die eine "echte" Glas-Ebene in den Lücken dazwischen —
   genau der gemeldete Effekt. Fix: Zeilen-Hintergrund auf transparent, damit überall
   nur die eine Panel-Ebene durchscheint. */
.nn-links .wp-block-navigation__submenu-container .wp-block-navigation-item {
	background-color: transparent;
}
.nn-links .wp-block-navigation__submenu-container .wp-block-navigation-item__content {
	padding: 0.7rem 0.9rem;
	border-radius: 0.7rem;
	font-size: 1rem;
}
.nn-links .wp-block-navigation__submenu-container .wp-block-navigation-item__content:hover,
.nn-links .wp-block-navigation__submenu-container .wp-block-navigation-item__content:focus-visible {
	background: color-mix(in srgb, var(--hero-ink) 8%, transparent);
}

/* CTA-Zeile am Ende des Leistungen-Untermenüs ("→ Zur Übersicht", verlinkt /leistungen/) —
   className kommt aus der Navigation-Entity selbst (ref 21, DB-Content, siehe CLAUDE.md
   Abschnitt 5), .nn-submenu-cta landet dadurch automatisch auf dem <li>. Deutlich mehr
   Abstand nach oben (Trennlinie statt der normalen 0-Gap-Liste) und ein eigener,
   jade-getönter Pill-Hintergrund statt der neutralen Hover-Zeile der übrigen Punkte —
   grenzt den "weg von hier"-Charakter klar von den sechs Leistungs-Links ab. */
.nn-links .wp-block-navigation__submenu-container .nn-submenu-cta {
	margin-top: 0.6rem;
	padding-top: 0.75rem;
	border-top: 1px solid var(--hero-line);
}
.nn-links .wp-block-navigation__submenu-container .nn-submenu-cta .wp-block-navigation-item__content {
	justify-content: center;
	text-align: center;
	font-weight: 700;
	color: var(--jade-dark) !important;
	background: color-mix(in srgb, var(--jade-light) 45%, transparent);
	border-radius: 999px;
}
.nn-links .wp-block-navigation__submenu-container .nn-submenu-cta .wp-block-navigation-item__content:hover,
.nn-links .wp-block-navigation__submenu-container .nn-submenu-cta .wp-block-navigation-item__content:focus-visible {
	/* explizit statt sich auf die Cascade-Reihenfolge gegen die allgemeine Hover-Farbregel
	   weiter oben (.nn-nav .nn-links .wp-block-navigation-item__content:hover) zu
	   verlassen — beide Regeln landen sonst auf derselben Spezifität (0,4,0), und ein
	   späterer, unabhängiger Edit an dieser Datei könnte die Reihenfolge-Abhängigkeit
	   stillschweigend kippen. */
	color: var(--jade-dark) !important;
	background: var(--jade-light);
}
@media (prefers-color-scheme: dark) {
	html:not([data-theme="light"]) .nn-links .wp-block-navigation__submenu-container .nn-submenu-cta .wp-block-navigation-item__content {
		color: var(--jade-light) !important;
		background: color-mix(in srgb, var(--jade-dark) 55%, transparent);
	}
	html:not([data-theme="light"]) .nn-links .wp-block-navigation__submenu-container .nn-submenu-cta .wp-block-navigation-item__content:hover,
	html:not([data-theme="light"]) .nn-links .wp-block-navigation__submenu-container .nn-submenu-cta .wp-block-navigation-item__content:focus-visible {
		color: var(--jade-light) !important;
		background: var(--jade-dark);
	}
}
html[data-theme="dark"] .nn-links .wp-block-navigation__submenu-container .nn-submenu-cta .wp-block-navigation-item__content {
	color: var(--jade-light) !important;
	background: color-mix(in srgb, var(--jade-dark) 55%, transparent);
}
html[data-theme="dark"] .nn-links .wp-block-navigation__submenu-container .nn-submenu-cta .wp-block-navigation-item__content:hover,
html[data-theme="dark"] .nn-links .wp-block-navigation__submenu-container .nn-submenu-cta .wp-block-navigation-item__content:focus-visible {
	color: var(--jade-light) !important;
	background: var(--jade-dark);
}
.nn-links .wp-block-navigation__submenu-icon path {
	fill: currentColor;
}

.nn-nav .wp-block-navigation__responsive-container-open,
.nn-nav .wp-block-navigation__responsive-container-close {
	color: var(--hero-ink);
	background: none;
	border: 0;
}

/* mobile overlay menu — WP's default here is a small unstyled corner box, not a proper
   full-screen menu, so this needs real styling rather than just the toggle-icon tint above */
.nn-nav .wp-block-navigation__responsive-container.is-menu-open {
	/* !important throughout: same WP core specificity/print-order issue as the submenu
	   background/link colour above — WP's own responsive-menu styles set explicit
	   width/height/background that a plain override doesn't win against */
	position: fixed !important;
	top: 0 !important;
	right: 0 !important;
	bottom: 0 !important;
	left: 0 !important;
	width: 100vw !important;
	height: 100vh !important;
	/* dvh/dvw NACH dem vh/vw-Fallback: 100vh auf Mobile bemisst sich an der größtmöglichen
	   Viewport-Höhe (Adressleiste ausgeblendet) — blendet der Browser die Adressleiste beim
	   Öffnen des Menüs ein/aus, ändert sich die tatsächlich sichtbare Höhe, das Overlay (und
	   damit alles darin, inkl. Logo) springt sichtbar mit. dvh/dvw folgen stattdessen der
	   jeweils AKTUELLEN sichtbaren Größe. */
	width: 100dvw !important;
	height: 100dvh !important;
	z-index: 30;
	background: var(--hero-bg) !important;
}
.nn-nav .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-dialog {
	height: 100%;
	display: flex;
	flex-direction: column;
	padding: 1.75rem clamp(1.5rem, 5vw, 4rem);
}
/* margin-top von 2.5rem auf 0.75rem reduziert, padding-top von WPs eigenem Core-Style
   (56px) auf 0 überschrieben — zusammen sorgten beide für ~7.5rem Leerraum zwischen Logo
   und "Home"/"Leistungen", wodurch "Kontakt" (letzter Menüpunkt) und "Follow us" darunter
   auf kleineren Screens erst nach Scrollen sichtbar waren. */
.nn-nav .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content {
	margin-top: 0.75rem;
	padding-top: 0 !important;
}

/* the <ul> here is the SAME element the desktop row-layout rule above targets — WP doesn't
   render two separate copies, it reuses one DOM structure for both and repositions it via
   the .is-menu-open state class. Scoping on .is-menu-open (not just nesting) is what makes
   this rule win over the desktop one only while the mobile modal is actually open — a bare
   descendant selector here previously fought the desktop rule unconditionally. */
.nn-nav .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__container {
	flex-direction: column !important;
	align-items: flex-start !important;
	gap: 1.5rem !important;
	font-size: 1.5rem !important;
}
.nn-nav .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__submenu-container {
	position: static !important;
	margin-top: 1rem;
	margin-left: 1rem;
	/* !important: das mobile Overlay zeigt Untermenüs immer offen, unabhängig von
	   aria-expanded/:focus-within (core forciert opacity:1/visibility:visible hier
	   bedingungslos) — unser neues min-width:280px !important auf der Desktop-Dropdown-
	   Regel (siehe oben) würde die volle Breite hier sonst gegen dieses min-width:0
	   gewinnen, weil !important immer vor Specificity/Reihenfolge entscheidet. */
	min-width: 0 !important;
	box-shadow: none;
	/* dito: unsere neue Slide-Animation ist rein für den Desktop-Hover-/Focus-Trigger
	   gedacht (translateY(-10px) im Ruhezustand); das mobile Overlay hat weder diesen
	   Trigger-Zustand noch eine Öffnungs-Animation nötig, da es ohnehin immer expandiert
	   im Fluss steht. */
	transform: none;
}

/* Logo/Home-Button oben im mobilen Overlay-Menü (2026-08-28) — aus demselben Grund wie
   "Follow us" unten per JS eingehängt (assets/js/nav-mobile-logo.js), diesmal als erstes
   Kind von .wp-block-navigation__responsive-dialog. Der native Schließen-Button
   (.wp-block-navigation__responsive-container-close) ist position:absolute und damit aus
   dem Flex-Fluss der Dialog-Spalte raus — das Logo landet dadurch als normales,
   linksbündiges erstes Flex-Item oben, während das X unabhängig davon oben rechts sitzen
   bleibt, ganz ohne eigene Row-Konstruktion. Wiederverwendet dieselben
   .nn-logo-icon/--light/--dark-Klassen wie der Header-Icon-Logo (siehe .nn-logo weiter
   oben) — deren Sichtbarkeits-/Light-Dark-Regeln sind bewusst NICHT auf .nn-logo gescoped,
   greifen hier also unverändert mit.

   Bug gefunden 2026-08-29: die Basis-Regel stand hier ursprünglich auf
   `display:inline-flex` OHNE .is-menu-open-Bewachung — verlassen hatte ich mich darauf,
   dass die beiden <img>-Kinder ja ohnehin per .nn-logo-icon{display:none} unsichtbar sind.
   .wp-block-navigation__responsive-dialog ist auf Desktop aber KEIN Flex-Column (das ist
   nur unsere eigene, auf .is-menu-open gescopte Regel weiter unten) — dort gilt WPs
   eigenes display:block, in dem Kind-Elemente im normalen Blockfluss stehen. Ein leeres,
   aber sichtbares inline-flex-Element erzeugt darin trotzdem eine eigene Zeile/Strut und
   schob dadurch die eigentliche Menüzeile (.wp-block-navigation__responsive-container-
   content) sichtbar nach unten — genau der vom Nutzer gemeldete Versatz zum Kontakt-
   Button. Fix: dieselbe .is-menu-open-Bewachung wie bei .nn-nav-mobile-follow, nicht nur
   auf die Kind-Bilder verlassen. */
.nn-nav-mobile-logo {
	display: none;
}
.nn-nav .wp-block-navigation__responsive-container.is-menu-open .nn-nav-mobile-logo {
	display: inline-flex;
	align-self: flex-start;
}
.nn-nav-mobile-logo .nn-logo-icon {
	/* war 2.5rem (40px) — auf 50px angeglichen, damit Header und aufgeklapptes Menü
	   dieselbe Logo-Größe zeigen */
	width: 50px;
	height: 50px;
}

/* "Follow us" + LinkedIn am Ende des mobilen Overlay-Menüs (2026-08-28) — analog zum
   Footer (siehe .nn-footer-linkedin in footer.css), aber es gibt im core/navigation-Block
   selbst keine Stelle für zusätzlichen, nur-mobilen Content: dieselbe <ul> wird 1:1 für
   Desktop-Zeile UND mobiles Overlay wiederverwendet (siehe Kommentar oben bei
   .wp-block-navigation__container). Deshalb hängt assets/js/nav-mobile-follow.js dieses
   Element einmalig per JS an .wp-block-navigation__responsive-container-content an — genau
   dieser Wrapper ist bei geschlossenem Menü nicht per display:none versteckt (nur die
   Übergröße/Position des Overlays ist es), weshalb die Sichtbarkeit hier explizit an
   .is-menu-open gebunden werden muss, sonst erschiene der Block auch inline in der
   Desktop-Zeile. */
.nn-nav-mobile-follow {
	display: none;
}
.nn-nav .wp-block-navigation__responsive-container.is-menu-open .nn-nav-mobile-follow {
	display: block;
	margin-top: 2.5rem;
	padding-top: 1.5rem;
	border-top: 1px solid var(--hero-line);
}
.nn-nav-mobile-follow-h {
	font-weight: 700;
	font-size: 0.95rem;
	text-transform: uppercase;
	letter-spacing: 0.02em;
	color: var(--hero-ink-muted);
	margin: 0 0 0.85rem;
}
.nn-nav-mobile-follow-link {
	display: inline-flex;
	align-items: center;
	gap: 0.5rem;
	color: var(--hero-ink);
	text-decoration: none;
	font-size: 1.1rem;
	font-weight: 700;
}
.nn-nav-mobile-follow-link:hover,
.nn-nav-mobile-follow-link:focus-visible {
	color: var(--hero-accent);
	transition: color 0.2s ease;
}
.nn-nav-mobile-follow-icon {
	width: 1.1rem;
	height: 1.1rem;
	display: block;
	flex: none;
}

/*
 * ============================================================================
 * Mobile header layout — icon-only logo, hamburger, envelope-icon contact button.
 *
 * Breakpoint: 37.5em (600px). Core's own responsive-container-open/-close toggle isn't
 * driven by a CSS media query at all (WP's view.js uses a ResizeObserver against the
 * nav's own content width, so the hamburger can appear at different viewport widths
 * depending on how many nav items exist / how long their labels are). 600px is the
 * conventional small-phone cutoff used elsewhere for this kind of compact-header
 * treatment; it was chosen as a reasonable, testable default rather than measured
 * against the live nav item count — re-check against the actual rendered breakpoint
 * during the separate visual QA pass and adjust this single value if it doesn't line up.
 *
 * DOM order note: .nn-links (core/navigation, which core itself renders the hamburger
 * toggle button INSIDE of) already precedes .nn-nav-cta as a sibling inside
 * .nn-nav-right in parts/header.html — so the required left-to-right order (hamburger,
 * then envelope button) falls out of normal source order with no `order:` override
 * needed here.
 * ============================================================================
 */
@media (max-width: 37.5em) {
	/* Nav wirkte auf Mobile weiterhin zu hoch, auch nach der allgemeinen Padding-Reduktion
	   oben (1.1rem/clamp(0.85rem,2.2vw,1.1rem), gilt für alle Breiten) — hier zusätzlich
	   gezielt für Mobile nochmal verkleinert, Desktop/Tablet bleiben bei den Werten oben. */
	.nn-nav {
		padding-top: 0.75rem;
		padding-bottom: 0.75rem;
	}
	.nn-logo-img {
		display: none !important;
	}
	/* Light ist die unbedingte Basis (dunkles Icon auf hellem Grund), Dunkel die einzig
	   bewachte Variante — dieselbe Konvention wie bei .nn-logo-img oben, hier nur
	   versehentlich verkehrt herum implementiert gewesen (das helle Icon blieb dadurch
	   auch im Light Mode sichtbar und das dunkle Icon war nie erreichbar). */
	.nn-logo-icon--dark {
		display: block;
	}
	.nn-logo-icon--light {
		display: none;
	}
	@media (prefers-color-scheme: dark) {
		html:not([data-theme="light"]) .nn-logo-icon--light {
			display: block;
		}
		html:not([data-theme="light"]) .nn-logo-icon--dark {
			display: none;
		}
	}
	html[data-theme="dark"] .nn-logo-icon--light {
		display: block;
	}
	html[data-theme="dark"] .nn-logo-icon--dark {
		display: none;
	}

	.nn-nav-right {
		gap: 0.75rem;
	}

	/* der Menü-Trenner trennt hier nichts mehr Sinnvolles: sichtbar sind nur noch
	   Hamburger und der Icon-only-Kontakt-Button, die Menüpunkte selbst sind erst im
	   aufgeklappten Overlay zu sehen. */
	.nn-nav-sep {
		display: none;
	}

	/* text pill -> round icon-only button; href/aria-label/.nn-sr-only text are unchanged
	   in the markup, only the visual presentation collapses down. */
	.nn-nav-cta {
		padding: 0.6rem;
		border-radius: 50%;
		width: 2.75rem;
		height: 2.75rem;
		justify-content: center;
	}
	.nn-nav-cta-text {
		display: none;
	}
	.nn-nav-cta-icon {
		display: block;
	}
}
