/* =========================================================================
   ZONING · Konstruktiv – gemeinsame Quelle für Schrift und Token
   Wird von JEDER Seite geladen, die im neuen Design läuft:
     index.html            -> konstruktiv-base.css + konstruktiv.css
     alle übrigen Seiten   -> styles.css + konstruktiv-base.css + konstruktiv-site.css
   Farben, Schriftgrössen, Abstände, Kurven stehen ausschliesslich hier.
   ========================================================================= */

/* ---------- Schriften, lokal gehostet (kein Abruf von Google-Servern) ----
   Unbounded (Gluk Fonts) und Manrope (Mikhail Sharanda), beide SIL OFL 1.1. */
@font-face{font-family:'Unbounded';font-style:normal;font-weight:200 900;font-display:swap;
  src:url('../fonts/unbounded-latin.woff2') format('woff2');
  unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:'Unbounded';font-style:normal;font-weight:200 900;font-display:swap;
  src:url('../fonts/unbounded-latin-ext.woff2') format('woff2');
  unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}
@font-face{font-family:'Manrope';font-style:normal;font-weight:200 800;font-display:swap;
  src:url('../fonts/manrope-latin.woff2') format('woff2');
  unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:'Manrope';font-style:normal;font-weight:200 800;font-display:swap;
  src:url('../fonts/manrope-latin-ext.woff2') format('woff2');
  unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}

:root{
  /* ---- Farbrollen. Knochenweiss trägt, Schwarz ordnet, Rot zeigt. ---- */
  --bone:#F0EFE9;      /* Grundfläche */
  --bone-2:#DEDCD3;    /* zweite Fläche, Rhythmuswechsel */
  --bone-3:#C9C7BE;    /* feine Linie auf hellem Grund */
  --black:#111111;     /* Masse und Fliesstext */
  --black-2:#2E2E2C;   /* Fliesstext auf heller Fläche */
  --grey:#58585B;      /* Sekundärtext, 6.2:1 auf --bone */
  --grey-d:#9A9A96;    /* Sekundärtext auf schwarzer Fläche, 6.7:1 */
  --red:#C4000F;       /* Signal als Fläche und als grosse Schrift */
  --red-t:#C4000F;     /* kleine Schrift auf hellem Grund. Seit dem Wechsel
                          auf #C4000F (18.08.2026) derselbe Wert: das Rot
                          erreicht auf --bone 8.3:1, der frueher noetige
                          dunklere Zweitton entfaellt. Token bleibt bestehen. */
  --green:#1D8A55;     /* nur Erfolgszustand */
  --focus:#111111;

  --disp:'Unbounded',system-ui,-apple-system,sans-serif;
  --body:'Manrope',system-ui,-apple-system,sans-serif;

  /* ---- Raum ---- */
  --gut:clamp(20px,5vw,66px);
  --sec:clamp(70px,8.5vw,132px);
  --hdrh:78px;
  --max:1400px;

  /* ---- Bewegung ---- */
  --ease:cubic-bezier(.23,1,.32,1);
  --ease-tile:cubic-bezier(.3,.9,.25,1);
}

/* =========================================================================
   BEWEGUNGSGRAMMATIK DER KOMPOSITIONEN
   Gilt für jede Wachstums-/Prozessgrafik der Marke, egal auf welcher Seite:
   Massen steigen ein, Linien zeichnen sich, Beschriftung blendet auf, ein
   roter Ring dreht dauerhaft. Startet erst, wenn die Grafik im Blick ist
   (Klasse `run` auf dem [data-seq]-Vorfahren). `--at` steuert den Einsatz.
   ========================================================================= */
.k-mass{opacity:0;transform-box:fill-box;transform-origin:center}
[data-seq].run .k-mass{animation:kin .68s var(--at,0s) var(--ease) forwards}
@keyframes kin{from{opacity:0;transform:translate(0,26px) rotate(-9deg) scale(.92)}to{opacity:1;transform:none}}
.k-line{stroke-dasharray:var(--L,300);stroke-dashoffset:var(--L,300)}
[data-seq].run .k-line{animation:kdr .7s var(--at,0s) cubic-bezier(.5,0,.2,1) forwards}
@keyframes kdr{to{stroke-dashoffset:0}}
.k-spin{transform-box:fill-box;transform-origin:center}
[data-seq].run .k-spin{animation:kspin 14s linear var(--at,0s) infinite}
@keyframes kspin{to{transform:rotate(360deg)}}
.k-txt{opacity:0}
[data-seq].run .k-txt{animation:kf .5s var(--at,0s) ease-out forwards}
@keyframes kf{to{opacity:1}}
.rm .k-mass,.rm .k-line,.rm .k-txt{animation:none!important;opacity:1;transform:none;stroke-dashoffset:0}
.rm .k-spin{animation:none!important}

/* =========================================================================
   FORMULARBOGEN  (gewählter Entwurf 01, Auswahl vom 07.08.2026)

   Eine Anfrage ist ein Dokument, keine Oberfläche. Kein Feld hat einen
   Rahmen; jede Eingabe sitzt auf einer Grundlinie, die Beschriftung steht
   im linken Rand wie ein Aktenzeichen. Den Zustand trägt allein die Linie:

       ruhend   2 px  --bone-3
       Fokus    3 px  --black   + Beschriftung wird schwarz
       Fehler   3 px  --red

   Gilt für alle vier Flächen mit diesem Formular: Kontakt-Modal,
   eingebettete Sektion (leistungen, ueber-uns), Bewerbungs-Modal und den
   Abschnitt #kontakt der Startseite (dort .form-s in konstruktiv.css).
   ========================================================================= */
.cf{display:grid}
.cf-zeile{display:grid;grid-template-columns:148px minmax(0,1fr);align-items:center;
  gap:0 22px;min-height:60px;position:relative;
  border-bottom:2px solid var(--bone-3)}
.cf-zeile:focus-within{border-bottom-color:var(--black);border-bottom-width:3px;margin-bottom:-1px}
.cf-zeile label{font-family:var(--body);font-size:.68rem;font-weight:800;letter-spacing:.15em;
  text-transform:uppercase;color:var(--grey);margin:0;transition:color .16s var(--ease)}
.cf-zeile:focus-within label{color:var(--black)}
.cf-zeile label i{font-style:normal;text-transform:none;letter-spacing:.02em;
  font-weight:600;color:var(--grey)}

.cf input,.cf select,.cf textarea,.cf .cmodal-datebtn{
  width:100%;border:0;background:transparent;border-radius:0;box-shadow:none;
  padding:14px 0;font-family:var(--body);font-size:1.02rem;color:var(--black);outline:0}
.cf input:focus,.cf select:focus,.cf textarea:focus,.cf .cmodal-datebtn:focus{
  border:0;box-shadow:none;background:transparent}
/* --grey, nicht --grey-d: letzteres ist laut Token für schwarze Flächen und
   erreicht auf --bone nur 2,45:1. Hier sind es 6,15:1. */
.cf input::placeholder,.cf textarea::placeholder{color:var(--grey);opacity:1}
.cf select{appearance:none;-webkit-appearance:none;cursor:pointer;padding-right:30px}
.cf select:has(option[value=""]:checked),.cf select:invalid{color:var(--grey)}
.cf .cmodal-datebtn{text-align:left;cursor:pointer;padding-right:30px}

/* Die Grundlinie zeigt den Fokus (2 px grau -> 3 px schwarz, Beschriftung
   grau -> schwarz). Das reicht fuer die Maus. Wer mit der Tastatur laeuft,
   bekommt zusaetzlich den Ring, den die Seite an jedem Knopf benutzt: ohne
   Rahmen am Feld ist eine Linienstaerke allein ein zu leiser Anker. */
.cf :focus-visible{outline:3px solid var(--red);outline-offset:4px}

.cf-caret{position:absolute;right:0;top:50%;transform:translateY(-50%);
  width:18px;height:18px;color:var(--grey);pointer-events:none}
.cf-caret svg{width:100%;height:100%;display:block}
.cf-zeile:focus-within .cf-caret{color:var(--black)}

/* Wunschtermin und Uhrzeit teilen sich eine Grundlinie. Nebeneinander blieben
   je Feld gut 200 px, und dort schnitt die Auswahl ihren eigenen Text ab:
   deshalb steht die Beschriftung im Paar über der Linie. */
.cf-paar{display:grid;grid-template-columns:1fr 1fr;gap:0 34px;
  border-bottom:2px solid var(--bone-3)}
.cf-paar:focus-within{border-bottom-color:var(--black);border-bottom-width:3px;margin-bottom:-1px}
.cf-zeile--eng{grid-template-columns:minmax(0,1fr);min-height:0;padding-top:10px;border-bottom:0}
.cf-zeile--eng label{margin-bottom:-6px}
.cf-zeile--eng:focus-within{border-bottom:0;margin-bottom:0}

/* Die Zeile mit dem Kalender muss ueber ihre Nachbarn steigen, solange er
   offen ist. Sonst faengt das Nachrichtenfeld darunter die Klicks auf die
   Tage ab. Die Klasse setzt js/main.js beim Oeffnen. */
.cf-paar.dp-above,.cf-zeile.dp-above{position:relative;z-index:5}

.cf-text{padding-top:22px;border-bottom:2px solid var(--bone-3)}
.cf-text:focus-within{border-bottom-color:var(--black);border-bottom-width:3px;margin-bottom:-1px}
.cf-text label{display:block;font-family:var(--body);font-size:.68rem;font-weight:800;
  letter-spacing:.15em;text-transform:uppercase;color:var(--grey);margin-bottom:8px}
.cf-text:focus-within label{color:var(--black)}
.cf textarea{min-height:104px;resize:vertical;padding:0 0 16px}

/* Der Knopf ist die Unterschrift: rechts am Ende des Bogens, kein Balken. */
.cf-fuss{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;
  gap:20px;margin-top:26px}

/* Fehler: die Linie zeigt ihn, der Satz benennt ihn. Rot auf --bone
   erreicht 5,18:1. */
.cf-zeile:has([aria-invalid="true"]),.cf-text:has([aria-invalid="true"]){
  border-bottom-color:var(--red);border-bottom-width:3px}
.cf-fehler{display:flex;align-items:center;gap:7px;margin:7px 0 0;
  font-family:var(--body);font-size:.78rem;font-weight:700;color:var(--red-t)}
.cf-fehler svg{width:14px;height:14px;flex:none}

@media (max-width:860px){
  .cf-zeile{grid-template-columns:minmax(0,1fr);min-height:0;padding-top:12px}
  .cf-zeile label{margin-bottom:-6px}
  .cf-paar{grid-template-columns:minmax(0,1fr);gap:0;border-bottom:0}
  .cf-zeile--eng{border-bottom:2px solid var(--bone-3)}
  .cf-zeile--eng:focus-within{border-bottom:3px solid var(--black);margin-bottom:-1px}
  .cf-fuss{flex-direction:column;align-items:stretch}
  .cf-fuss .btn,.cf-fuss button[type=submit]{width:100%}
  .cf-fuss .cmodal-note{max-width:none}
}
@media (prefers-reduced-motion:reduce){ .cf-zeile label{transition:none} }
