/* ============================================================
   Gemeinsames Stylesheet — Ausgangspunkt, pro Projekt anpassen

   Farben und Schriften stehen in site_config.py unter FARBEN; die
   :root-Variablen hier muessen dazu passen.

   Was hier definiert ist und im ausgelieferten HTML (noch) nicht vorkommt,
   sind Bausteine: Formular, Kontaktraster, Referenzkarten, Ablaufdiagramm,
   Rechtstexte, Fehlerseite. Sie werden benutzt, sobald die entsprechenden
   Seiten in internal/build/seiten.py entstehen.
   ============================================================ */

/* Die Namen stammen aus der Vorlage und bezeichnen Rollen, keine Farbtoene:
   --navy ist der dunkle Markenton (hier das Anthrazit der Wortmarke),
   --blue die Akzentfarbe (hier das Bronze des bisherigen Auftritts).
   Die Werte muessen zu FARBEN in site_config.py passen — von dort kommen
   theme-color, Manifest und die Platzhalter-Icons. */
:root{
  --navy:#2A2C35;
  --blue:#A8825E;
  --paper:#FFFFFF;
  --paper-2:#F6F4F1;
  --line:#E4E0DA;
  --text-2:#5F6169;
  --green:#2E9E5B;
}

*{ box-sizing:border-box; margin:0; padding:0; }
html{ scroll-behavior:smooth; }
body{
  background:var(--paper); color:var(--navy);
  font-family:'Inter', sans-serif; font-size:17px; line-height:1.7;
  -webkit-font-smoothing:antialiased;
}
/* height:auto ist hier nicht Kosmetik, sondern Pflicht. Jedes <img> traegt
   width- und height-Attribute (gegen CLS). Wird die Breite dann per CSS
   beschnitten — hier durch max-width:100% —, bleibt die Hoehe aus dem Attribut
   stehen und das Bild wird verzerrt. Im Ausgangsprojekt traf das ein Banner
   mit 1100x634: in einem 320 px breiten Viewport blieb die Hoehe bei 634 px
   und das Motiv war senkrecht gestreckt. Auf dem Desktop fiel es nicht auf,
   weil der Container dort fast der natuerlichen Breite entspricht.
   Regeln mit absichtlich fester Hoehe (.logo-img) sind spezifischer und
   gewinnen weiterhin. */
img{ max-width:100%; height:auto; display:block; }
a{ color:inherit; }

h1,h2,h3{
  font-family:'Source Serif 4', serif;
  font-weight:600;
  color:var(--navy);
  line-height:1.15;
  letter-spacing:-0.005em;
}

/* Deutsche Komposita sind lang: "Handwerksbetriebe", "Vermoegensschaden-
   haftpflichtversicherung". In einer grossen Ueberschrift passte so ein Wort
   auf 320 px nicht mehr in die Spalte und schob die ganze Seite um 10 px nach
   rechts, auf /agb/ um 25 px — ohne dass ein Element sichtbar herausragte,
   weshalb die uebliche Suche nach ueberstehenden Kaesten nichts fand.

   hyphens:auto trennt sauber nach deutschen Regeln, weil <html lang="de">
   gesetzt ist. overflow-wrap:break-word ist der Notnagel fuer den Fall, dass
   ein Wort selbst getrennt nicht passt; es greift nur dann und aendert das
   Schriftbild bei normaler Breite nicht. */
h1,h2,h3,h4,summary{ overflow-wrap:break-word; hyphens:auto; }
p,li,td,th,dd,figcaption{ overflow-wrap:break-word; }

:focus-visible{ outline:2px solid var(--blue); outline-offset:3px; }
@media (prefers-reduced-motion: reduce){
  *{ animation:none !important; transition:none !important; scroll-behavior:auto !important; }
}

.wrap{ max-width:1120px; margin:0 auto; padding:0 28px; }
.wrap-narrow{ max-width:760px; margin:0 auto; padding:0 28px; }
section{ padding:112px 0; }
@media (max-width:720px){ section{ padding:64px 0; } }
/* Abgesetzte Flaeche statt Rahmen, wenn ein Abschnitt sich vom Nachbarn
   loesen soll — Linien sind im Auftritt schon das Hauptmittel, zu viele
   davon lassen die Seite zappelig wirken. */
.flaeche{ background:var(--paper-2); }

/* Der Abschnittskopf: kurzes Wort in Bronze, darunter die Ueberschrift.
   Die Linie darueber greift den Rahmen der Wortmarke auf. */
.eyebrow{
  font-size:12.5px; color:var(--blue); font-weight:700;
  text-transform:uppercase; letter-spacing:0.1em;
  margin-bottom:14px;
}
.abschnitt-kopf{ max-width:640px; }
.abschnitt-kopf h2{ font-size:clamp(26px,3.4vw,38px); }
.abschnitt-kopf p{ color:var(--text-2); margin-top:16px; }

/* ---------- Header ---------- */
header{
  position:sticky; top:0; z-index:50;
  background:rgba(255,255,255,0.92); backdrop-filter:blur(6px);
  border-bottom:1px solid var(--line);
}
.header-inner{
  max-width:1120px; margin:0 auto; padding:18px 28px;
  display:flex; align-items:center; justify-content:space-between; gap:24px;
}
/* Der Logo-Link darf nicht schrumpfen. Ohne flex-shrink:0 gibt im Header
   ausgerechnet er nach, sobald die Navigation eng wird — das Logo wurde so
   bis auf 36 px zusammengedrueckt statt der vorgesehenen 87 px. */
.header-inner > a{ flex-shrink:0; }
/* Die vollstaendige Marke, Rahmen und Schriftzug. Sie ist hoch gebaut: der
   Schriftzug ist gut ein Neuntel der Gesamthoehe. Bei 64 px Logohoehe sind
   das rund 7 px Versalhoehe — die Untergrenze fuer Lesbarkeit. Deshalb ist
   die Kopfzeile hier hoeher als ueblich, und das Polster darum kleiner.

   Der Vorteil derselben Bauform: 1,94:1 ist schmal. Das Logo belegt nur
   124 px Breite und laesst dem Burger auch auf 320 px genug Platz. */
.logo-img{ height:64px; width:auto; display:block; }
.header-inner{ padding-top:12px; padding-bottom:12px; }
@media (max-width:480px){
  .header-inner{ padding-left:18px; padding-right:18px; }
  .logo-img{ height:52px; }
}
nav{ display:flex; align-items:center; gap:36px; }
.nav-links{ display:flex; gap:28px; }
/* Unterhalb dieser Breite uebernimmt das Burger-Menue. Wer die Navigation
   erweitert, prueft die Grenze neu: sobald Menue, Umschalter und CTA nicht
   mehr nebeneinander passen, schiebt der Header die Seite nach rechts. */
@media (max-width:1000px){ .nav-links{ display:none; } }
/* Auf schmalen Geraeten passen Logo, CTA-Button und Burger nicht nebeneinander
   — der Header schob die Seite nach rechts. Der CTA entfaellt hier, im
   Burger-Menue steht derselbe Button weiterhin bereit. */
@media (max-width:700px){ header nav > .btn-primary{ display:none; } }
/* In der Kopfzeile darf der Knopf kompakter sein als im Fliesstext: dort ist
   er das Ziel, hier nur eine Abkuerzung. */
header .btn{ padding:11px 18px; font-size:14px; }
nav a{ text-decoration:none; font-size:15px; color:var(--navy); font-weight:500; white-space:nowrap; }
nav a:hover, nav a.active{ color:var(--blue); }

/* Sprachumschalter. Erscheint nur, wenn in site_config.py mehr als eine
   Sprache steht — bei einer Sprache erzeugt shell.py den Block gar nicht. */
.lang-switch{ display:flex; align-items:center; gap:2px; flex-shrink:0; }
.lang-switch a{
  font-size:13px; font-weight:600; letter-spacing:0.04em; line-height:1;
  color:var(--text-2); padding:6px 9px; border-radius:0;
  transition:color 0.15s ease, background 0.15s ease;
}
.lang-switch a:hover{ color:var(--blue); background:var(--paper-2); }
/* aria-current markiert die laufende Sprache. Dieselbe Angabe liest auch ein
   Screenreader vor — eine zusaetzliche Klasse waere doppelt gepflegt. */
.lang-switch a[aria-current]{ color:var(--navy); background:var(--paper-2); }
/* Unter 600 px entfaellt bereits der CTA-Button aus Platzgruenden; hier
   zusaetzlich den Umschalter, sonst draengt sich der Header wieder. Im
   Burger-Menue steht er weiterhin. */
@media (max-width:600px){ header .lang-switch{ display:none; } }
/* Im Burger-Menue: die Regel fuer .mobile-nav a macht Links zu Bloecken mit
   Trennlinie — fuer zwei nebeneinanderstehende Sprachkuerzel zuruecknehmen. */
.mobile-nav .lang-switch{ margin-top:24px; justify-content:center; }
.mobile-nav .lang-switch a{
  display:inline-flex; border-bottom:none; font-size:15px; padding:10px 16px;
}

/* Knoepfe ohne Rundung und ohne Sprung beim Hover: der Auftritt lebt von
   geraden Kanten und ruhigen Flaechen, ein huepfender Knopf faellt darin auf
   wie ein Fremdkoerper. Der Wechsel passiert ueber die Farbe. */
.btn{
  font-weight:600; font-size:15px; padding:15px 28px; border-radius:0;
  text-decoration:none; display:inline-flex; align-items:center; gap:8px;
  border:1px solid transparent; cursor:pointer; letter-spacing:0.01em;
  transition:background 0.2s ease, color 0.2s ease, border-color 0.2s ease;
}
.btn-primary{ background:var(--navy); color:#fff; border-color:var(--navy); }
.btn-primary:hover{ background:var(--blue); border-color:var(--blue); }
.btn-ghost{ border-color:var(--navy); color:var(--navy); }
.btn-ghost:hover{ background:var(--navy); color:#fff; }
.btn:disabled{ opacity:0.6; cursor:not-allowed; }

.menu-btn{
  display:none; background:none; border:none; cursor:pointer;
  width:40px; height:40px; padding:0; align-items:center; justify-content:center;
  flex-direction:column; gap:5px;
}
.menu-btn span{ display:block; width:22px; height:2px; background:var(--navy); transition:transform 0.25s ease, opacity 0.25s ease; }
@media (max-width:1000px){ .menu-btn{ display:flex; } }
.menu-btn[aria-expanded="true"] span:nth-child(1){ transform:translateY(7px) rotate(45deg); }
.menu-btn[aria-expanded="true"] span:nth-child(2){ opacity:0; }
.menu-btn[aria-expanded="true"] span:nth-child(3){ transform:translateY(-7px) rotate(-45deg); }
.mobile-nav{ display:none; position:fixed; top:65px; left:0; right:0; bottom:0; background:#fff; z-index:49; padding:12px 28px 40px; overflow-y:auto; }
.mobile-nav.open{ display:block; }
.mobile-nav a{ display:block; padding:14px 0; font-size:18px; font-weight:600; color:var(--navy); text-decoration:none; border-bottom:1px solid var(--line); }
.mobile-nav .btn{ display:block; text-align:center; margin-top:24px; }

/* ---------- Hero (home) ---------- */
.hero{ padding:110px 0 100px; }
/* Die Textspalte ist die breitere: das Foto ist hochkant und darf nicht
   groesser laufen als seine 480 px Originalbreite, sonst wird es weich. */
.hero-grid{ display:grid; grid-template-columns:1.25fr 0.75fr; gap:64px; align-items:center; }
@media (max-width:900px){ .hero-grid{ grid-template-columns:1fr; gap:48px; } }
/* Grid-Kinder haben von Haus aus min-width:auto und koennen daher nicht
   unter die Breite ihres Inhalts schrumpfen. Auf 320 px erzwang der lange
   CTA-Text so eine 302 px breite Spalte in einem 264 px breiten Raster —
   die Seite lief um 10 px ueber. */
.hero-grid > *{ min-width:0; }
.hero-copy > *{ animation:fadeUp 0.7s ease both; }
.hero-copy > *:nth-child(1){ animation-delay:0.05s; }
.hero-copy > *:nth-child(2){ animation-delay:0.15s; }
.hero-copy > *:nth-child(3){ animation-delay:0.25s; }
.hero-copy > *:nth-child(4){ animation-delay:0.35s; }
.hero-copy > *:nth-child(5){ animation-delay:0.45s; }
@keyframes fadeUp{ from{ opacity:0; transform:translateY(18px); } to{ opacity:1; transform:none; } }
.hero h1{ font-size:clamp(34px, 4.6vw, 54px); margin:16px 0 24px; }
.hero h1 .hi{ color:var(--blue); }
.hero p.lede{ font-size:18px; color:var(--text-2); max-width:560px; margin-bottom:34px; }
.hero-ctas{ display:flex; gap:14px; flex-wrap:wrap; margin-bottom:36px; }
.hero-meta{ display:flex; gap:24px; flex-wrap:wrap; font-size:13.5px; color:var(--text-2); }
.hero-meta b{ color:var(--navy); font-weight:600; }

/* Das Motiv der Wortmarke: ein Rahmen aus Haarlinien, den der Inhalt
   durchbricht. Hier tritt das Foto aus dem Rahmen, der versetzt dahinter
   sitzt. Rein dekorativ und ohne eigenen Inhalt, deshalb ::before.

   max-width: die Originale der fertigen Raeume sind 480 px breit. Groesser
   gezogen werden sie weich, also darf die Spalte nicht mehr hergeben.
   Sobald bessere Aufnahmen vorliegen, steigt der Wert. */
.hero-art{ position:relative; justify-self:end; width:100%; max-width:420px;
  animation:fadeUp 0.9s ease 0.3s both; }
@media (max-width:900px){ .hero-art{ justify-self:start; } }
.hero-art::before{
  content:""; position:absolute; z-index:0;
  left:-22px; top:34px; bottom:34px; right:38px;
  border:1px solid var(--blue);
}
@media (max-width:520px){ .hero-art::before{ left:-12px; right:24px; } }
.hero-photo-frame{ position:relative; z-index:1; width:100%; overflow:hidden; }
.hero-photo-frame img{ width:100%; height:auto; display:block; }
/* Bildunterschrift statt Etikett im Bild: ein aufgesetzter Kasten verdeckt
   immer genau die Ecke, die man sehen will. */
.hero-bildzeile{ position:relative; z-index:1; margin-top:14px; font-size:13px;
  color:var(--text-2); letter-spacing:0.02em; }

/* ---------- Page header (inner pages) ---------- */
.page-hero{ padding:64px 0 48px; border-bottom:1px solid var(--line); }
.page-hero h1{ font-size:clamp(28px,4vw,42px); margin-top:12px; }
.page-hero p{ color:var(--text-2); font-size:16px; max-width:640px; margin-top:14px; }
.breadcrumb{ font-size:13px; color:var(--text-2); margin-bottom:10px; }
.breadcrumb a{ color:var(--blue); text-decoration:none; }
.breadcrumb a:hover{ text-decoration:underline; }

/* ---------- Trust bar ---------- */
.trust{ background:var(--paper-2); border-top:1px solid var(--line); border-bottom:1px solid var(--line); padding:40px 0; }
.trust-grid{ display:grid; grid-template-columns:repeat(4,1fr); gap:24px; text-align:center; }
@media (max-width:760px){ .trust-grid{ grid-template-columns:1fr 1fr; } }
.trust-grid .n{ font-family:'Source Serif 4', serif; font-size:32px; font-weight:700; color:var(--navy); }
.trust-grid .l{ font-size:13px; color:var(--text-2); margin-top:4px; }
.trust-grid .reveal:nth-child(2){ transition-delay:0.08s; }
.trust-grid .reveal:nth-child(3){ transition-delay:0.16s; }
.trust-grid .reveal:nth-child(4){ transition-delay:0.24s; }

/* ---------- Services list ---------- */
.services-list{ display:flex; flex-direction:column; margin-top:48px; }
.service-row{ display:grid; grid-template-columns:44px 1fr 1fr; gap:32px; padding:34px 0; border-top:1px solid var(--line); align-items:start; transition:background 0.25s ease, padding-left 0.25s ease; }
.service-row:last-child{ border-bottom:1px solid var(--line); }
.service-row:hover{ background:var(--paper-2); padding-left:16px; margin-left:-16px; padding-right:16px; margin-right:-16px; border-radius:0; }
@media (max-width:820px){ .service-row{ grid-template-columns:1fr; gap:10px; } }
.service-row .idx{ width:44px; height:44px; border-radius:0; background:var(--paper-2); color:var(--blue); font-weight:800; font-size:15px; display:flex; align-items:center; justify-content:center; font-family:'Inter',sans-serif; transition:background 0.25s ease, color 0.25s ease; }
.service-row:hover .idx{ background:var(--blue); color:#fff; }
.service-row h3{ font-size:21px; margin-bottom:8px; }
.service-row p{ color:var(--text-2); font-size:15px; }
.service-row a.more{ font-size:13.5px; font-weight:600; color:var(--blue); text-decoration:none; }
.service-row a.more:hover{ text-decoration:underline; }
.services-list .reveal:nth-child(2){ transition-delay:0.05s; }
.services-list .reveal:nth-child(3){ transition-delay:0.10s; }
.services-list .reveal:nth-child(4){ transition-delay:0.15s; }
.services-list .reveal:nth-child(5){ transition-delay:0.20s; }
.services-list .reveal:nth-child(6){ transition-delay:0.25s; }
.services-list .reveal:nth-child(7){ transition-delay:0.30s; }
.services-list .reveal:nth-child(8){ transition-delay:0.35s; }
.services-list .reveal:nth-child(9){ transition-delay:0.40s; }


/* ---------- Referenzen ---------- */
.ref-grid{ display:grid; grid-template-columns:repeat(3,1fr); gap:24px; margin-top:48px; }
@media (max-width:900px){ .ref-grid{ grid-template-columns:1fr; } }
/* Grid-Kinder haben per Default min-width:auto und koennen dadurch nicht
   unter ihre Inhaltsbreite schrumpfen — ohne min-width:0 laeuft die Spur
   ueber und die Seite bekommt einen horizontalen Scrollbalken. */
.ref-card{ min-width:0; border:1px solid var(--line); border-radius:0; padding:28px 24px; transition:border-color 0.25s ease; }
/* Screenshot der umgesetzten Website, randlos oben in der Karte. Die negativen
   Margins heben das Kartenpolster auf; der Radius ist 11px statt 12px, damit das
   Bild innerhalb des 1px-Rahmens sitzt und nicht darueber. */
.ref-shot{
  display:block; margin:-28px -24px 20px; overflow:hidden;
  border-radius:0; border-bottom:1px solid var(--line);
  background:var(--paper-2);
}
.ref-shot img{ display:block; width:100%; height:auto; }
/* Der Screenshot ist ein zweiter Link auf dasselbe Ziel wie "Zur Website" und
   traegt aria-hidden + tabindex=-1: fuer die Tastatur und Screenreader waere er
   eine reine Dopplung. Der Hover-Effekt bleibt als visueller Hinweis. */
.ref-shot img{ transition:transform 0.4s ease; }
.ref-card:hover .ref-shot img{ transform:scale(1.03); }
@media (prefers-reduced-motion: reduce){
  .ref-card:hover .ref-shot img{ transform:none; }
}
.ref-card:hover{ border-color:var(--blue); }
.ref-card .client{ font-weight:700; font-size:19px; color:var(--navy); margin-bottom:4px; font-family:'Source Serif 4',serif; }
.ref-card .sector{ font-size:12.5px; color:var(--blue); font-weight:600; margin-bottom:16px; display:block; text-transform:uppercase; letter-spacing:0.04em; }
.ref-card p{ font-size:14px; color:var(--text-2); margin-bottom:14px; }
/* margin-top fehlte: die Trennlinie sass ohne Abstand direkt unter der letzten
   Leistungsmarke. padding-top wirkt nur unterhalb der Linie, oberhalb braucht
   es einen eigenen Abstand. */
.ref-card .proof{ font-size:13px; color:var(--navy); font-weight:600; border-top:1px solid var(--line); margin-top:28px; padding-top:16px; }
/* Die Marken sind Flex-Elemente mit Zeilenumbruch. Ihre Unterkante ist nicht
   automatisch die Unterkante des Containers, sobald die letzte Zeile nur teilweise
   gefuellt ist — deshalb hier zusaetzlich Luft unter dem Markenblock statt sich
   allein auf das margin des naechsten Elements zu verlassen. */
.ref-grid .reveal:nth-child(2){ transition-delay:0.08s; }
.ref-grid .reveal:nth-child(3){ transition-delay:0.16s; }

/* ---------- FAQ ---------- */
.faq-list{ margin-top:40px; }
details{ border-bottom:1px solid var(--line); padding:22px 0; }
details:first-child{ border-top:1px solid var(--line); }
summary{ cursor:pointer; font-size:17px; color:var(--navy); font-weight:700; list-style:none; display:flex; justify-content:space-between; align-items:center; gap:20px; letter-spacing:-0.01em; font-family:'Source Serif 4',serif; }
summary::-webkit-details-marker{ display:none; }
summary::after{ content:"+"; font-size:20px; color:var(--blue); font-weight:400; flex-shrink:0; transition:transform 0.2s ease; font-family:'Inter',sans-serif; }
details[open] summary::after{ transform:rotate(45deg); }
details p{ margin-top:14px; font-size:14.5px; color:var(--text-2); max-width:680px; }
.faq-list details:nth-child(2){ transition-delay:0.05s; }
.faq-list details:nth-child(3){ transition-delay:0.10s; }
.faq-list details:nth-child(4){ transition-delay:0.15s; }

/* ---------- Process flow diagram ---------- */
.flow{ margin-top:56px; position:relative; }
.flow-line{ position:absolute; top:23px; left:0; right:0; height:2px; background:var(--line); z-index:0; }
.flow-line-fill{ position:absolute; top:0; left:0; height:100%; width:0%; background:var(--blue); transition:width 1.4s cubic-bezier(0.4,0,0.2,1) 0.2s; }
.flow.in-view .flow-line-fill{ width:100%; }
.flow-steps{ display:grid; grid-template-columns:repeat(4,1fr); gap:20px; position:relative; z-index:1; }
.flow-step{ text-align:center; }

/* Unter 760 px bricht das Raster auf zwei Spalten um. Die durchgehende
   .flow-line liegt aber absolut auf top:23px und trifft damit nur noch die
   erste Zeile — bei 03 und 04 fehlte die Verbindung ganz. Statt einer Linie
   fuer alles bekommt hier jeder Schritt seinen eigenen Verbinder nach rechts,
   und der letzte je Zeile keinen.

   Die Breite: Abstand zwischen zwei Punktmitten ist Spaltenbreite + 20 px Gap,
   davon gehen zweimal 24 px Punktradius ab — bleibt calc(100% - 28px). */
@media (max-width:760px){
  .flow-steps{ grid-template-columns:1fr 1fr; row-gap:36px; }
  .flow-line{ display:none; }
  .flow-step{ position:relative; }
  .flow-step::after{
    content:""; position:absolute; top:23px; left:calc(50% + 24px);
    width:calc(100% - 28px); height:2px; background:var(--line);
    transition:background-color 0.5s ease;
  }
  /* Jeder zweite Schritt schliesst eine Zeile ab und braucht keinen Verbinder. */
  .flow-step:nth-child(2n)::after{ content:none; }
  .flow.in-view .flow-step::after{ background:var(--blue); }
  .flow.in-view .flow-step:nth-child(1)::after{ transition-delay:0.3s; }
  .flow.in-view .flow-step:nth-child(3)::after{ transition-delay:1.1s; }
}
.flow-dot{ width:48px; height:48px; border-radius:0; background:#fff; border:2px solid var(--line); color:var(--text-2); display:flex; align-items:center; justify-content:center; margin:0 auto 16px; font-weight:700; font-family:'Source Serif 4',serif; font-size:17px; transition:border-color 0.5s ease, color 0.5s ease, background 0.5s ease, transform 0.4s ease; }
.flow.in-view .flow-dot{ border-color:var(--blue); color:#fff; background:var(--blue); }
.flow-step:nth-child(1) .flow-dot{ transition-delay:0.1s; }
.flow-step:nth-child(2) .flow-dot{ transition-delay:0.5s; }
.flow-step:nth-child(3) .flow-dot{ transition-delay:0.9s; }
.flow-step:nth-child(4) .flow-dot{ transition-delay:1.3s; }
.flow-step h3{ font-family:'Source Serif 4',serif; font-size:16px; font-weight:600; color:var(--navy); margin-bottom:6px; }
.flow-step p{ font-size:13px; color:var(--text-2); }

/* ---------- Final CTA ---------- */
.cta-final{ text-align:center; }
.cta-final h2{ font-size:clamp(28px,4vw,42px); margin-bottom:16px; }
.cta-final p{ color:var(--text-2); max-width:480px; margin:0 auto 34px; font-size:16px; }
.cta-final .hero-ctas{ justify-content:center; }

/* ---------- Contact page ---------- */
.contact-grid{ display:grid; grid-template-columns:1.1fr 0.9fr; gap:56px; align-items:start; }
@media (max-width:860px){ .contact-grid{ grid-template-columns:1fr; } }
/* Grid-Kinder haben von Haus aus min-width:auto und schrumpfen deshalb nicht
   unter die Breite ihres Inhalts. Hier war der Inhalt die E-Mail-Adresse:
   ein Wort, das nicht umbrechen kann. Bei 320 px lief die Kontaktseite
   dadurch 21 px ueber den Viewport hinaus — sichtbar nur als waagerechter
   Scrollbalken, nicht als ueberstehender Kasten. */
.contact-grid > *{ min-width:0; }
.contact-info-row{ flex-wrap:wrap; }
.contact-info-row a, .contact-info-row span{ overflow-wrap:anywhere; min-width:0; }
.form-field{ margin-bottom:20px; }
.form-field label{ display:block; font-size:13.5px; font-weight:600; color:var(--navy); margin-bottom:6px; }
.form-field input, .form-field select, .form-field textarea{
  width:100%; padding:12px 14px; border:1.5px solid var(--line); border-radius:0;
  font-family:'Inter',sans-serif; font-size:15px; color:var(--navy); background:#fff;
  transition:border-color 0.15s ease;
}
/* Maus-/Touch-Fokus: nur die Rahmenfarbe, kein Outline-Ring. */
.form-field input:focus, .form-field select:focus, .form-field textarea:focus{ border-color:var(--blue); outline:none; }
/* Tastaturfokus braucht einen sichtbaren Ring (WCAG 2.4.7). Ohne diese Regel
   gewinnt das obige outline:none durch hoehere Spezifitaet gegen :focus-visible. */
.form-field input:focus-visible, .form-field select:focus-visible, .form-field textarea:focus-visible{
  outline:2px solid var(--blue); outline-offset:2px;
}
.form-field textarea{ resize:vertical; min-height:130px; }
.form-row{ display:grid; grid-template-columns:1fr 1fr; gap:16px; }
@media (max-width:520px){ .form-row{ grid-template-columns:1fr; } }
.form-consent{ display:flex; gap:10px; align-items:flex-start; font-size:13px; color:var(--text-2); margin:18px 0 22px; }
.form-consent input{ margin-top:3px; }
.form-consent a{ color:var(--blue); text-decoration:underline; }
.form-note{ font-size:12.5px; color:var(--text-2); margin-top:10px; }
.form-status{ padding:14px 16px; border-radius:0; font-size:14px; margin-bottom:20px; display:none; }
.form-status.show{ display:block; }
.form-status.success{ background:#E7F6EC; color:var(--green); border:1px solid #BEE6CB; }
.form-status.error{ background:#FBE9E9; color:#B3261E; border:1px solid #F3C6C6; }

.contact-info-card{ background:var(--paper-2); border-radius:0; padding:32px; border:1px solid var(--line); }
.contact-info-card h2{ font-size:19px; margin-bottom:18px; }
.contact-info-row{ display:flex; gap:14px; padding:14px 0; border-top:1px solid var(--line); font-size:14.5px; }
.contact-info-row:first-of-type{ border-top:none; padding-top:0; }
.contact-info-row .label{ color:var(--text-2); min-width:90px; }
.contact-info-row a{ color:var(--navy); text-decoration:none; font-weight:600; }
.contact-info-row a:hover{ color:var(--blue); }

/* ---------- Legal / content pages (Impressum, Datenschutz, Cookies, AGB) ---------- */
.legal-content{ max-width:820px; }
.legal-content h2{ font-size:22px; margin-top:44px; margin-bottom:14px; }
.legal-content h2:first-child{ margin-top:0; }
.legal-content h3{ font-size:17px; margin-top:26px; margin-bottom:10px; }
.legal-content p{ font-size:15.5px; color:var(--text-2); margin-bottom:14px; }
.legal-content ul, .legal-content ol{ margin:0 0 16px 22px; color:var(--text-2); font-size:15.5px; }
.legal-content li{ margin-bottom:8px; }
.legal-content a{ color:var(--blue); text-decoration:underline; }
/* Vierspaltige Tabelle mit langen Zellinhalten (Cookie-Richtlinie): unter
   600 px passte sie nicht mehr und schob die Seite um bis zu 299 px nach
   rechts. Tabellen schrumpfen nicht unter ihre Mindestbreite, deshalb darf
   hier nur die Tabelle selbst scrollen, nie die Seite. display:block ist
   noetig, damit overflow an einem <table> ueberhaupt wirkt. */
.legal-content table{
  width:100%; border-collapse:collapse; margin:18px 0; font-size:14.5px;
  display:block; overflow-x:auto; -webkit-overflow-scrolling:touch;
}
/* Ab dieser Breite passt die Tabelle wieder und soll sich normal verhalten,
   damit die Spalten gleichmaessig ueber die volle Breite verteilt werden. */
@media (min-width:640px){
  .legal-content table{ display:table; overflow-x:visible; }
}
.legal-content th, .legal-content td{ text-align:left; padding:10px 12px; border:1px solid var(--line); vertical-align:top; }
.legal-content th{ background:var(--paper-2); color:var(--navy); font-weight:600; }
.legal-toc{ background:var(--paper-2); border:1px solid var(--line); border-radius:0; padding:20px 24px; margin-bottom:36px; }
.legal-toc p{ font-weight:700; color:var(--navy); margin-bottom:10px; font-size:14px; }
.legal-toc ol{ margin-left:18px; font-size:14px; }
.legal-toc a{ color:var(--navy); text-decoration:none; }
.legal-toc a:hover{ color:var(--blue); text-decoration:underline; }
.company-box{ background:var(--paper-2); border-radius:0; padding:24px 28px; margin-bottom:32px; border:1px solid var(--line); }
.company-box p{ margin-bottom:4px; color:var(--navy); font-size:15.5px; }
.company-box .muted{ color:var(--text-2); font-size:14px; }

/* ---------- Cookie banner ---------- */
#cookie-banner{
  position:fixed; left:0; right:0; bottom:0; z-index:100;
  background:var(--navy); color:#fff; padding:20px 28px;
  display:none; align-items:center; justify-content:space-between; gap:24px; flex-wrap:wrap;
  box-shadow:0 -8px 24px rgba(0,0,0,0.18);
}
#cookie-banner.show{ display:flex; }
#cookie-banner p{ font-size:13.5px; color:#D8D3CB; max-width:640px; margin:0; }
#cookie-banner a{ color:#fff; text-decoration:underline; }
#cookie-banner .cookie-actions{ display:flex; gap:10px; flex-wrap:wrap; }
.btn-cookie-accept{ background:var(--blue); color:#fff; border:none; padding:11px 20px; border-radius:0; font-weight:600; font-size:13.5px; cursor:pointer; }
.btn-cookie-decline{ background:transparent; color:#fff; border:1.5px solid rgba(255,255,255,0.4); padding:11px 20px; border-radius:0; font-weight:600; font-size:13.5px; cursor:pointer; }

/* ---------- 404 page ---------- */
.error-page{ min-height:60vh; display:flex; align-items:center; }
.error-code{ font-family:'Source Serif 4', serif; font-size:clamp(80px,14vw,160px); font-weight:700; color:var(--blue); line-height:0.9; margin-bottom:8px; }
.error-page h1{ font-size:clamp(24px,3.4vw,32px); margin-bottom:14px; }
.error-page p.lede{ color:var(--text-2); font-size:16px; max-width:480px; margin-bottom:32px; }
.error-links{ display:flex; flex-direction:column; gap:10px; margin-bottom:36px; }
.error-links a{ color:var(--blue); font-weight:600; text-decoration:none; font-size:15px; }
.error-links a:hover{ text-decoration:underline; }

/* ---------- Footer ---------- */
footer{ padding:56px 0 32px; border-top:1px solid var(--line); font-size:13px; color:var(--text-2); background:var(--paper-2); }
.footer-inner{ display:block; }
.footer-cols{ display:grid; grid-template-columns:repeat(4,1fr); gap:36px; margin-bottom:40px; }
.footer-col{ display:flex; flex-direction:column; gap:9px; align-items:flex-start; }
.footer-h{ font-family:'Source Serif 4',serif; font-size:14px; font-weight:600; color:var(--navy); margin-bottom:4px; }
.footer-col a{ color:var(--text-2); text-decoration:none; line-height:1.45; }
.footer-col a:hover{ color:var(--blue); text-decoration:underline; }
.footer-addr{ line-height:1.6; }
.footer-bottom{ display:flex; justify-content:space-between; flex-wrap:wrap; gap:16px; padding-top:24px; border-top:1px solid var(--line); }
.footer-links{ display:flex; gap:18px; flex-wrap:wrap; }
.footer-links a{ color:var(--text-2); text-decoration:none; }
/* Der Widerruf der Einwilligung ist ein <button>, weil er keine Seite
   aufruft. Optisch soll er sich aber nicht von den Footer-Links abheben. */
.footer-links .footer-linkbtn{
  background:none; border:0; padding:0; margin:0; cursor:pointer;
  font:inherit; color:var(--text-2); text-decoration:none;
}
.footer-links .footer-linkbtn:hover{ color:var(--blue); text-decoration:underline; }
.footer-links a:hover{ color:var(--blue); text-decoration:underline; }
@media (max-width:860px){
  .footer-cols{ grid-template-columns:repeat(2,1fr); gap:28px; }
}
@media (max-width:520px){
  .footer-cols{ grid-template-columns:1fr; gap:24px; }
}

/* Bild im Textfluss der Leistungs- und Branchenseiten. Bricht bewusst aus der
   Lesespalte aus (.legal-content ist schmal), bleibt aber innerhalb des wrap. */
.prose-img{ margin:32px 0; }
.prose-img img{
  display:block; width:100%; height:auto;
  border-radius:0; border:1px solid var(--line);
}
.prose-img figcaption{ margin-top:10px; font-size:13.5px; color:var(--text-2); }

/* ---------- Accessibility: Skip-Link ---------- */
.skip-link{
  position:absolute; left:-9999px; top:0; z-index:200;
  background:var(--navy); color:#fff; padding:12px 20px;
  font-size:14px; font-weight:600; text-decoration:none; border-radius:0;
}
.skip-link:focus{ left:0; }

/* <picture> muss sich wie das <img> darin verhalten (WebP-Fallback-Markup) */
picture{ display:block; }

/* Ergebnissatz auf Referenzkarten — das Wichtigste der Karte */
.ref-result{ margin-top:12px; padding-left:12px; border-left:3px solid var(--blue);
  font-size:15px; color:var(--navy); font-weight:500; }

/* ---------- Reveal-on-scroll (shared JS hook) ---------- */
.reveal{ opacity:0; transform:translateY(22px); transition:opacity 0.6s ease, transform 0.6s ease; }
.reveal.in-view{ opacity:1; transform:none; }

/* ============================================================
   Bausteine dieses Auftritts
   Alles darueber stammt aus der Vorlage, alles ab hier ist fuer PioNa
   entstanden. Leitmotiv ist der Rahmen der Wortmarke: Haarlinien in
   Anthrazit, die der Inhalt durchbricht — keine Schatten, keine Rundungen.
   ============================================================ */

/* ---------- Fliesstext in der Lesespalte ---------- */
.prosa p{ color:var(--text-2); margin-bottom:20px; }
.prosa h2{ font-size:clamp(23px,2.8vw,30px); margin:52px 0 18px; }
.prosa h3{ font-size:20px; margin:36px 0 12px; }
.prosa > *:first-child{ margin-top:0; }
.prosa ul{ margin:0 0 22px 0; padding:0; list-style:none; color:var(--text-2); }
.prosa ul li{ padding-left:26px; margin-bottom:10px; position:relative; }
/* Der Aufzaehlungspunkt als kleines Quadrat statt als Kugel — dieselbe
   gerade Geometrie wie im Rahmen der Wortmarke. */
.prosa ul li::before{
  content:""; position:absolute; left:0; top:0.62em;
  width:7px; height:7px; border:1px solid var(--blue);
}
.prosa .check-list li::before{ background:var(--blue); }
.prosa strong{ color:var(--navy); font-weight:600; }

/* ---------- Der Leitsatz ---------- */
/* Der Satz stammt vom bisherigen Auftritt und ist das Einzige daran, was
   sich niemand ausdenken muesste. Er steht deshalb fuer sich allein. */
.leitsatz{ border-top:1px solid var(--line); border-bottom:1px solid var(--line);
  padding:76px 0; }
.leitsatz blockquote{
  font-family:'Source Serif 4', serif; font-weight:600;
  font-size:clamp(24px,3.6vw,40px); line-height:1.25; color:var(--navy);
  max-width:820px; margin:0; hyphens:auto;
}
.leitsatz cite{ display:block; margin-top:22px; font-family:'Inter',sans-serif;
  font-style:normal; font-size:13px; letter-spacing:0.1em;
  text-transform:uppercase; color:var(--blue); font-weight:700; }

/* ---------- Leistungen als Kacheln ---------- */
.leistung-gitter{ display:grid; grid-template-columns:repeat(3,1fr); gap:1px;
  background:var(--line); border:1px solid var(--line); margin-top:56px; }
@media (max-width:900px){ .leistung-gitter{ grid-template-columns:1fr 1fr; } }
@media (max-width:620px){ .leistung-gitter{ grid-template-columns:1fr; } }
/* Die Fugen sind der Rasterabstand selbst: gap:1px auf einer Linienfarbe
   zeichnet die Trennlinien, ohne dass jede Kachel einen eigenen Rahmen
   braucht — sonst lagen an den Beruehrungskanten zwei Linien uebereinander. */
.leistung-kachel{ background:var(--paper); padding:38px 30px 34px; min-width:0;
  display:flex; flex-direction:column; text-decoration:none;
  transition:background 0.2s ease; }
.leistung-kachel:hover{ background:var(--paper-2); }
.leistung-kachel .nr{ font-size:12px; font-weight:700; letter-spacing:0.12em;
  color:var(--blue); margin-bottom:22px; }
.leistung-kachel h3{ font-size:22px; margin-bottom:12px; }
.leistung-kachel p{ font-size:15px; color:var(--text-2); margin-bottom:20px; }
.leistung-kachel .weiter{ margin-top:auto; font-size:14px; font-weight:600;
  color:var(--navy); }
.leistung-kachel:hover .weiter{ color:var(--blue); }

/* ---------- Zweispalter: Text und Bild ---------- */
.paar{ display:grid; grid-template-columns:1fr 1fr; gap:64px; align-items:center; }
.paar > *{ min-width:0; }
@media (max-width:860px){ .paar{ grid-template-columns:1fr; gap:36px; } }
/* Bild links, Text rechts — fuer den Wechsel von Abschnitt zu Abschnitt.
   Auf schmalen Geraeten steht das Bild wieder oben, weil sonst der Text
   zweier aufeinanderfolgender Abschnitte direkt aneinanderstoesst. */
.paar-gedreht .paar-bild{ order:-1; }
@media (max-width:860px){ .paar-gedreht .paar-bild{ order:-1; } }
.paar-bild img{ width:100%; height:auto; }

/* ---------- Vorher und nachher ---------- */
.vergleich{ display:grid; grid-template-columns:1fr 1fr; gap:32px; margin-top:48px; }
@media (max-width:760px){ .vergleich{ grid-template-columns:1fr; gap:24px; } }
.vergleich figure{ margin:0; min-width:0; }
.vergleich img{ width:100%; height:auto; }
.vergleich figcaption{ margin-top:12px; font-size:13px; letter-spacing:0.1em;
  text-transform:uppercase; font-weight:700; color:var(--text-2); }
.vergleich .ist-nachher figcaption{ color:var(--blue); }

/* ---------- Galerie fertiger Raeume ---------- */
.galerie{ display:grid; grid-template-columns:repeat(3,1fr); gap:24px; margin-top:48px; }
@media (max-width:860px){ .galerie{ grid-template-columns:1fr 1fr; gap:18px; } }
@media (max-width:560px){ .galerie{ grid-template-columns:1fr; } }
.galerie figure{ margin:0; min-width:0; }
.galerie img{ width:100%; height:auto; }
.galerie figcaption{ margin-top:10px; font-size:14px; color:var(--text-2); }

/* ---------- Zahlen und Fakten ---------- */
.fakten{ display:grid; grid-template-columns:repeat(3,1fr); gap:1px;
  background:var(--line); border:1px solid var(--line); }
@media (max-width:700px){ .fakten{ grid-template-columns:1fr; } }
.fakten div{ background:var(--paper); padding:32px 28px; }
.fakten dt{ font-size:13px; letter-spacing:0.08em; text-transform:uppercase;
  color:var(--text-2); margin-bottom:10px; }
.fakten dd{ font-family:'Source Serif 4',serif; font-size:21px; font-weight:600;
  color:var(--navy); margin:0; line-height:1.35; }

/* ---------- Abschlussband ---------- */
.band{ background:var(--navy); color:#fff; padding:96px 0; }
.band h2{ color:#fff; font-size:clamp(26px,3.6vw,40px); max-width:640px; }
.band p{ color:#CFCBC4; margin-top:18px; max-width:520px; }
.band .hero-ctas{ margin:38px 0 0; }
.band .btn-primary{ background:var(--blue); border-color:var(--blue); }
.band .btn-primary:hover{ background:#fff; color:var(--navy); border-color:#fff; }
.band .btn-ghost{ border-color:rgba(255,255,255,0.45); color:#fff; }
.band .btn-ghost:hover{ background:#fff; color:var(--navy); border-color:#fff; }

/* ---------- Kontaktzeile im Fliesstext ---------- */
.direktkontakt{ display:flex; flex-wrap:wrap; gap:12px 40px; margin-top:28px;
  padding-top:24px; border-top:1px solid var(--line); font-size:16px; }
.direktkontakt a{ color:var(--navy); font-weight:600; text-decoration:none;
  border-bottom:1px solid var(--blue); }
.direktkontakt a:hover{ color:var(--blue); }

/* ---------- WhatsApp in der Navigation ---------- */
/* Eigener Punkt neben der Navigation, kein Knopf: der CTA soll der einzige
   gefuellte Knopf in der Kopfzeile bleiben. Das Icon traegt currentColor und
   faerbt sich beim Hover mit. */
.nav-wa{
  display:inline-flex; align-items:center; gap:7px; white-space:nowrap;
  font-size:15px; font-weight:500; color:var(--navy); text-decoration:none;
  transition:color 0.15s ease;
}
.nav-wa:hover{ color:var(--blue); }
.nav-wa .wa-icon{ flex-shrink:0; }
/* Ab hier wird es in der Kopfzeile eng — dieselbe Grenze, an der auch der
   CTA-Knopf verschwindet. Im Burger-Menue bleibt der Punkt. */
@media (max-width:700px){ header .nav-wa{ display:none; } }
/* Im Burger-Menue gilt die Blockregel fuer .mobile-nav a; das Icon soll
   trotzdem neben dem Text stehen. */
.mobile-nav .nav-wa{ display:flex; }
