/* ==========================================================================================
   Kontaktseite -- Gestaltung der Vorlage template-contact_form (posts 41 de, 40 en, 42 fr,
   43 tr, 95 es, 103 it)
   Grundlage: documentation/Entwurf-Kontakt-Varianten.html, Variante A

   REGEL FUER DIESE DATEI: Jeder Selektor beginnt mit .kt
   ------------------------------------------------------------------------------------------
   Das Element <main class="kt"> umschliesst die ganze Seite. Ohne diese Disziplin traefen
   Elementregeln (h1, h2, h3, p, ul ...) auch Kopfzeile, Fusszeile und jede andere Seite --
   bootstrap.min.css, global.css, header.css und footer.css liegen im selben Dokument.
   Dieselbe Regel gilt in store-seite.css, verteilerseite.css und rechtsseiten.css.

   WARUM EINE EIGENE DATEI UND NICHT rechtsseiten.css
   Der Auftraggeber wollte den Titelbereich "wie bei den anderen Rechtsseiten". Die Werte
   dafuer stehen unten wortgleich zu rechtsseiten.css -- die DATEI wird trotzdem nicht
   mitbenutzt: Sie ist 18 KB Rechtsseiten-Gestaltung (Wertepaare, Inhaltsverzeichnis,
   Paragrafenwerk) fuer eine Formularseite, und ihr Baustein contents/rechtsseiten/kopf
   liest `rt_`-Felder und kennt nur zwei Brotkrumenstufen. Die Kontaktseite ist keine
   Rechtsseite.

   ⚠ DAMIT STEHEN DIE TITELWERTE AN ZWEI STELLEN. Wer sie in rechtsseiten.css aendert, muss
   hier nachziehen -- und umgekehrt. Betroffen sind genau die vier Bloecke, die unten mit
   "wortgleich mit rechtsseiten.css" gekennzeichnet sind. Das ist der bewusst gezahlte Preis
   fuer die Entkopplung; er ist kleiner als der Preis, eine Formularseite an das
   Rechtsseiten-Stylesheet zu haengen.

   DER ENTWURF IST AUF JOST GESETZT, DER AUFTRITT LAEUFT AUF OVERPASS
   Overpass laeuft breiter (rund +6,4 %). Die Spaltenbreiten unten sind mit
   documentation/tools/ttfmess.py in Overpass nachgemessen, nicht aus dem Entwurf uebernommen.
   Kein Browser war daran beteiligt.

   SCHNITTE WERDEN BENANNT, NICHT GESCHALTET
   Overpass liegt als sieben eigenstaendige Familien vor. `font-weight: 200` des Entwurfs
   waehlt keinen Schnitt aus -- es laesst den Browser einen falschen synthetisieren.
   Uebersetzt nach der Hausregel: Entwurf 200 (h1) -> "Overpass-Thin", Entwurf 200 (h2) ->
   "Overpass-Light", Entwurf 300 -> "Overpass-Light", Entwurf 400 -> "Overpass-Regular".
   `font-weight: normal` steht ueberall daneben, damit nichts synthetisiert wird.
   ========================================================================================== */

.kt {
    /* wortgleich mit rechtsseiten.css -- siehe Kopf */
    --kt-ink: #14100E;
    --kt-paper: #FFFFFF;
    --kt-shell: #F4F2F0;
    --kt-line: #DDD9D5;
    --kt-muted: #6E6A66;
    --kt-pad: clamp(1.25rem, 5vw, 4rem);

    /* Zwei Breiten, anders als bei den Rechtsseiten: Titelbereich und Formular stehen im
       schmalen Satzspiegel (720px, wie dort), der Store-Abschnitt braucht die volle Breite
       fuer vier Spalten. Der Entwurf setzt 1180px. */
    --kt-max: 1180px;
    --kt-schmal: 720px;

    display: block;
    background: var(--kt-paper);
    color: var(--kt-ink);
    font-family: "Overpass-Light", sans-serif;
    font-weight: normal;
    font-size: 1.0625rem;
    line-height: 1.75;
    -webkit-font-smoothing: antialiased;

    /* Ausgleich fuer die feste Kopfzeile. .header ist projektweit position:fixed und steht
       ausserhalb des Textflusses; die bestehenden Seiten halten den Platz ueber page.css frei.
       Diese Vorlage laedt page.css bewusst nicht -- ohne diesen Ausgleich liegt die Brotkrume
       hinter Logo und Menueschalter. Gleicher Wert wie store-seite.css und rechtsseiten.css,
       damit der Abstand oben auf allen neuen Vorlagen derselbe ist. */
    padding-top: 100px;
}

/* ---------- Ruecksetzungen: nur innerhalb von .kt ----------
   In :where(), aus demselben Grund wie in store-seite.css und rechtsseiten.css: `.kt h1`
   haette die Spezifitaet (0,1,1) und schluege jede einklassige Regel auf denselben Elementen,
   unabhaengig von der Reihenfolge. `:where(.kt) h1` liegt bei (0,0,1) -- jede Klassenregel
   gewinnt von selbst, und das Praefixieren jeder einzelnen Regel entfaellt als Dauerpflicht.

   ⚠ DIE FORMULARELEMENTE SIND AUSGENOMMEN. Das Formular bringt seine eigene Gestaltung mit
   (siehe unten); ein Reset auf label, input oder button wuerde ihr in die Quere kommen.
   RESTRISIKO wie dort: In einem Browser ohne :where() entfaellt der Reset. Unterstuetzt seit
   Firefox 78, Safari 14 und Chrome/Edge 88. */
:where(.kt) h1,
:where(.kt) h2,
:where(.kt) h3,
:where(.kt) p,
:where(.kt) ul,
:where(.kt) ol {
    margin: 0;
    padding: 0;
}

:where(.kt) ul {
    list-style: none;
}

:where(.kt) a {
    color: inherit;
    text-decoration: none;
}

.kt :focus-visible {
    outline: 2px solid var(--kt-ink);
    outline-offset: 3px;
}

/* ---------- Rahmen ---------- */
.kt-wrap {
    max-width: var(--kt-max);
    margin: 0 auto;
    padding-left: var(--kt-pad);
    padding-right: var(--kt-pad);
}

/* Der schmale Satzspiegel. Er sitzt INNERHALB von .kt-wrap, nicht daneben -- so behalten
   Titelbereich, Formular und die Einleitung des Store-Abschnitts denselben linken Rand.
   Stuende er als eigener Rahmen daneben, liefen die beiden Raender bei jeder Breite
   auseinander, bei der die clamp() greift. */
.kt-schmal {
    max-width: var(--kt-schmal);
}

.kt-abschnitt {
    padding-top: clamp(2.4rem, 4.5vw, 3.8rem);
    padding-bottom: clamp(2.4rem, 4.5vw, 3.8rem);
}

/* Der Titelbereich schliesst nach unten nicht ab -- das Formular folgt dicht.
   wortgleich mit rechtsseiten.css (.rt-titel) */
.kt-titel {
    padding-bottom: 0;
}

/* ---------- Brotkrume ----------
   Zwei Stufen (Startseite > Kontakt), Entscheidung des Auftraggebers vom 18.08.2026. Die
   Vorlage trug bis dahin drei (Startseite > Kontakt > Kontaktformular); die Mittelstufe zeigte
   auf kein Ziel und die Endstufe benannte denselben Ort ein zweites Mal.
   Bauform und Beschriftung wie bei den uebrigen neuen Vorlagen (P-81): <nav> mit aria-label,
   Endstufe als <span aria-current="page"> ohne Verweis.
   wortgleich mit rechtsseiten.css (.rt-crumb) */
.kt-crumb {
    font-size: 0.72rem;
    letter-spacing: 0.16em;
    text-transform: uppercase;
    color: var(--kt-muted);
    padding-top: 1.6rem;
}

.kt-crumb ul {
    display: flex;
    flex-wrap: wrap;
    gap: 0.5rem;
}

.kt-crumb li + li::before {
    content: "\203A";
    margin-right: 0.5rem;
}

.kt-crumb a:hover {
    color: var(--kt-ink);
}

/* ---------- Typografie ----------
   wortgleich mit rechtsseiten.css (.rt-eyebrow, .rt h1, .rt h2, .rt-intro) */
.kt-eyebrow {
    display: block;
    font-family: "Overpass-Regular", sans-serif;
    font-weight: normal;
    font-size: 0.7rem;
    letter-spacing: 0.3em;
    text-transform: uppercase;
    color: var(--kt-muted);
    margin-bottom: 1.3rem;
}

.kt h1 {
    font-family: "Overpass-Thin", sans-serif;
    font-weight: normal;
    font-size: clamp(2.1rem, 5vw, 3.2rem);
    line-height: 1.1;
    letter-spacing: -0.015em;
}

/* GEMESSEN in Overpass-Thin bei 51,2px (Obergrenze der clamp) gegen die Inhaltsbreite des
   schmalen Satzspiegels: 720 - 2*64 = 592px. Alle sechs Seitentitel stehen einzeilig:
     Formulario de contacto   517,8px   <- der laengste, 74px Luft
     Formulaire de contact    489,2px
     Modulo di contatto       418,0px
     Kontaktformular          368,9px
     İletişim Formu           319,7px
     Contact Form             305,4px
   ttfmess rechnet ohne Kerning und liegt damit eher zu breit; der echte Wert ist knapper.
   Wer die clamp-Obergrenze anhebt, bricht zuerst den spanischen Titel um -- bei 58,6px. */

.kt h2 {
    font-family: "Overpass-Light", sans-serif;
    font-weight: normal;
    font-size: clamp(1.35rem, 2.4vw, 1.75rem);
    line-height: 1.25;
    letter-spacing: -0.01em;
}

.kt-intro {
    margin-top: 1.4rem;
}

/* ---------- Rueckmeldungen ueber dem Formular ----------
   Erfolg und Fehlschlag des Versands. Sie standen bisher als .text-success / .text-danger aus
   bootstrap.min.css da; hier bekommen sie einen eigenen Kasten, damit sie im ruhigen Satz der
   Seite nicht untergehen. Die Klassen bleiben zusaetzlich am Element -- P-49 hat gezeigt, dass
   an dieser Stelle die Sichtbarkeit einer Meldung ueber einen verlorenen Lead entscheidet. */
.kt-meldung {
    border-left: 2px solid var(--kt-ink);
    padding: 0.9rem 0 0.9rem 1.4rem;
    margin-bottom: 2rem;
    font-size: 1rem;
    line-height: 1.6;
}

.kt-meldung--fehler {
    border-left-color: #A32C2C;
    color: #A32C2C;
}

/* ---------- Formular ----------
   ⚠ FUNKTION UNVERAENDERT. Alle Klassen, die JavaScript oder die Validierung greifen, bleiben
   am Element: .needs-validation und .was-validated (form.js), .telmask und .iti* (intlTelInput
   und jquery.mask), .only-text (form.js), .form-control, .is-invalid und .invalid-feedback
   (bootstrap.min.css, gesetzt von form.js und vom Server), .form-check-input, .g-recaptcha.
   Geaendert ist allein, wie sie aussehen.

   WARUM form.css NICHT MEHR GELADEN WIRD: Es bemisst Schrift, Polster und Schaltflaeche in vw
   (.96vw Schriftgroesse, 23vw Mindestbreite der Schaltflaeche) und ist auf den alten
   Seitenrahmen gerechnet. Im 720px-Satzspiegel dieser Seite ergibt das eine Schaltflaeche, die
   ueber den Satz hinauslaeuft, und eine Schriftgroesse, die mit der Umgebung nicht
   zusammengeht. Die wenigen Regeln daraus, die wirklich gebraucht werden, stehen unten --
   allen voran `.iti { width: 100% }`. */
.kt-formular {
    margin-top: 2.2rem;
}

.kt-feld {
    margin-bottom: 1.2rem;
}

.kt-feld label {
    display: block;
    font-family: "Overpass-Regular", sans-serif;
    font-weight: normal;
    font-size: 0.72rem;
    letter-spacing: 0.16em;
    text-transform: uppercase;
    color: var(--kt-muted);
    margin-bottom: 0.45rem;
}

.kt-feld input,
.kt-feld textarea {
    width: 100%;
    border: 1px solid var(--kt-line);
    border-radius: 0;
    background: var(--kt-paper);
    padding: 0.75rem 0.9rem;
    font-family: "Overpass-Light", sans-serif;
    font-weight: normal;
    font-size: 1rem;
    line-height: 1.5;
    color: var(--kt-ink);
}

/* 16px Mindestgroesse auf dem Telefon: iOS zoomt in jedes Feld hinein, dessen Schrift
   kleiner ist, und kommt aus dem Zoom nicht von selbst zurueck. 1rem ist bereits 16px --
   die Regel steht als Sperre da, falls die Groesse oben je verkleinert wird. */
@media only screen and (max-width: 1023px) {
    .kt-feld input,
    .kt-feld textarea {
        font-size: max(1rem, 16px);
        min-height: 50px;
    }
}

.kt-feld textarea {
    min-height: 8rem;
    resize: vertical;
}

.kt-feld input:focus,
.kt-feld textarea:focus {
    outline: none;
    border-color: var(--kt-ink);
}

/* Zwei Felder nebeneinander ab 600px. Der Entwurf setzt diesen Bruch; er passt zum
   720px-Satzspiegel, in dem zwei Spalten ab hier je rund 340px behalten. */
.kt-paar {
    display: grid;
    grid-template-columns: 1fr;
    gap: 0;
}

@media (min-width: 600px) {
    .kt-paar {
        grid-template-columns: 1fr 1fr;
        gap: 0 1.2rem;
    }
}

/* ---------- Telefonfeld (intlTelInput) ----------
   Die einzige Regel aus form.css, ohne die das Feld sichtbar bricht: intlTelInput baut einen
   <div class="iti"> um das Feld, und dessen Vorgabe ist `display: inline-block` ohne Breite --
   das Telefonfeld stuende sonst als einziges schmal in der Reihe. */
.kt-formular .iti {
    width: 100%;
    display: block;
}

/* ⚠ DIESE REGEL DARF NICHT WEGFALLEN. intlTelInput laeuft mit `separateDialCode: true`
   (form.js); die Landesvorwahl liegt dann als eigenes Element IM Feld, und
   intlTelInput.min.css haelt ihr mit `padding-left: 52px` am Eingabefeld den Platz frei. Die
   Polster-Kurzschrift oben ueberschreibt das -- gleiche Spezifitaet (0,1,1), spaeter geladen.
   Ohne die Zeile hier laege die getippte Nummer unter der Vorwahl. */
.kt-formular .iti--separate-dial-code input.telmask {
    padding-left: 52px;
}

/* ---------- Einwilligung ----------
   Der Verweis im Text zeigt auf den Datenschutzhinweis; er kommt aus dem Uebersetzungs-
   schluessel form_kvkk_warning und wird mit {!! !!} ausgegeben. Deshalb traegt er hier eine
   sichtbare Unterstreichung -- ohne sie waere im Fliesstext nicht zu erkennen, dass die
   Einwilligung auf ein Dokument verweist (E-14). */
.kt-haken {
    display: flex;
    /* Umbruch, damit die Meldung (P-92) unter Kaestchen und Text auf eine eigene Zeile faellt.
       Ohne ihn stuende sie hinter dem Text in derselben Zeile. Sie bringt ihre `width: 100%`
       aus bootstrap.min.css mit und erzwingt den Umbruch damit selbst. */
    flex-wrap: wrap;
    gap: 0.7rem;
    align-items: flex-start;
    font-size: 0.92rem;
    line-height: 1.6;
    color: var(--kt-muted);
    margin: 1.4rem 0;
}

.kt-haken input {
    margin-top: 0.4rem;
    flex: none;
}

.kt-haken a {
    border-bottom: 1px solid currentColor;
}

.kt-haken a:hover {
    color: var(--kt-ink);
}

/* ---------- reCAPTCHA ----------
   Das Widget ist 304px breit und nicht skalierbar. Es steht linksbuendig im Satz, nicht
   zentriert: zentriert stuende es als einziges Element der Seite aus der Achse. */
.kt-captcha {
    margin: 1.6rem 0;
}

/* ---------- Absenden ---------- */
.kt-senden {
    display: inline-block;
    padding: 0.85rem 1.9rem;
    min-height: 2.75rem;
    border: 1px solid var(--kt-ink);
    background: var(--kt-ink);
    color: var(--kt-paper);
    font-family: "Overpass-Regular", sans-serif;
    font-weight: normal;
    font-size: 0.74rem;
    letter-spacing: 0.22em;
    text-transform: uppercase;
    cursor: pointer;
}

.kt-senden:hover {
    background: var(--kt-paper);
    color: var(--kt-ink);
}

/* ---------- Fehlermeldungen der Validierung ----------
   bootstrap.min.css blendet .invalid-feedback erst ein, wenn das Feld .is-invalid traegt oder
   das Formular .was-validated -- diese Mechanik bleibt unangetastet. Hier steht nur, wie die
   eingeblendete Meldung aussieht. */
/* ⚠ DIESE REGEL IST DER GRUND, AUS DEM DIE MELDUNG AM TELEFONFELD UEBERHAUPT ERSCHEINT
   (P-92, 18.08.2026). Bootstrap blendet .invalid-feedback ueber genau eine Regel ein:

       .is-invalid ~ .invalid-feedback,
       .was-validated :invalid ~ .invalid-feedback { display: block }

   Beide Zweige brauchen den GESCHWISTER-Bezug -- und den zerstoert intlTelInput zur Laufzeit:
   es setzt einen <div class="iti"> vor das Telefonfeld und zieht das Feld dann hinein
   (`insertBefore` gefolgt von `appendChild`). Danach liegt das Feld eine Ebene tiefer und ist
   kein Geschwister der Meldung mehr; ohne die Regel hier bliebe sie unsichtbar.

   Sie kommt ohne Geschwisterbezug aus und deckt deshalb jedes Feld ab, gleich wie tief es
   verschachtelt ist -- auch ein kuenftiges, das ein anderes Werkzeug umbaut. Bootstraps Regel
   bleibt daneben stehen; wo sie greift, greift sie weiter.

   ⚠ `:has()` gibt es seit Chrome 105, Safari 15.4 und Firefox 121. Wo es fehlt, bleibt es beim
   bisherigen Verhalten -- es faellt nichts zurueck.

   DER ROTE RAHMEN braucht hier NICHTS: Anders als im Wholesale-Formular traegt jedes Feld
   dieser Seite `form-control`, und Bootstraps Rahmenregel haengt am Element selbst, nicht an
   einem Geschwister. Sie greift also auch im iti-Rahmen. */
.was-validated .kt-feld:has(:invalid) .invalid-feedback,
.was-validated .kt-haken:has(:invalid) .invalid-feedback {
    display: block;
}

/* ⚠ `.kt-haken` STEHT HIER AUSDRUECKLICH DANEBEN und bekommt NICHT einfach die Klasse
   `kt-feld` dazu. Das waere der kuerzere Weg gewesen und haette den Einwilligungstext
   zerstoert: `.kt-feld label` setzt `display: block`, Versalien, 0.72rem und Sperrung -- aus
   dem Satz mit dem Verweis auf den Datenschutzhinweis wuerde eine Feldbeschriftung. */

.kt-feld .invalid-feedback {
    font-size: 0.85rem;
    margin-top: 0.35rem;
    color: #A32C2C;
}

.kt-feld .form-control.is-invalid,
.kt-formular .was-validated .form-control:invalid {
    border-color: #A32C2C;
}

/* ---------- Store-Abschnitt ----------
   Schalenfarbe ueber die volle Breite, der Inhalt bleibt im Rahmen -- deshalb sitzt .kt-wrap
   innerhalb von .kt-schale, nicht umgekehrt. Gleiche Bauform wie .rt-schale. */
.kt-schale {
    background: var(--kt-shell);
}

.kt-stores {
    display: grid;
    grid-template-columns: 1fr;
    gap: 1.6rem;
    margin-top: 2.4rem;
}

@media (min-width: 640px) {
    .kt-stores {
        grid-template-columns: 1fr 1fr;
    }
}

@media (min-width: 1024px) {
    .kt-stores {
        grid-template-columns: repeat(4, 1fr);
        gap: 1.4rem;
    }
}

/* DIE VIER SPALTEN SIND GEMESSEN, NICHT UEBERNOMMEN.
   Der enge Fall ist nicht die Obergrenze, sondern genau der Bruchpunkt 1024px: dort steht die
   Polsterung noch bei 5vw = 51,2px, die volle Breite ist aber noch nicht erreicht.
     1024px:  (1024 - 2*51,2 - 3*22,4) / 4 = 213,6px je Spalte
     1180px+: (1180 - 2*64   - 3*22,4) / 4 = 246,2px je Spalte
   Gemessen in Overpass-Light bei 15,04px (0.94rem), die vier laengsten Werte:
     muenchen@simacouture.com   196,7px   <- der laengste ueberhaupt, 16,9px Luft bei 1024px
     istanbul@simacouture.com   180,3px
     paris@simacouture.com      159,9px
     info@simacouture.com       152,4px
   Die Telefonnummern liegen alle unter 138px. Die Stadtnamen als H3 in Overpass-Light bei
   17,6px bleiben unter 81px ("Duisbourg", "Duisburgo").
   Wer eine laengere Mailadresse aufnimmt, prueft zuerst den 1024px-Fall, nicht die Obergrenze. */
.kt-store {
    border-top: 1px solid var(--kt-ink);
    padding-top: 1rem;
}

.kt-store h3 {
    font-family: "Overpass-Light", sans-serif;
    font-weight: normal;
    font-size: 1.1rem;
    line-height: 1.25;
    margin-bottom: 0.5rem;
}

.kt-store a,
.kt-store span {
    display: block;
    font-size: 0.94rem;
    line-height: 1.7;
    color: var(--kt-muted);
    /* Eine Mailadresse ohne Leerzeichen bricht sonst aus der Spalte heraus, statt umzubrechen.
       Der Fall tritt bei den vier gepflegten Adressen nicht ein (gemessen, siehe oben) -- die
       Regel faengt den ab, der spaeter dazukommt. */
    overflow-wrap: anywhere;
}

.kt-store a:hover {
    color: var(--kt-ink);
}

/* ---------- Verweis auf die Verteilerseite ---------- */
.kt-mehr {
    display: inline-block;
    margin-top: 2.4rem;
    font-family: "Overpass-Regular", sans-serif;
    font-weight: normal;
    font-size: 0.72rem;
    letter-spacing: 0.2em;
    text-transform: uppercase;
    border-bottom: 1px solid var(--kt-ink);
    padding-bottom: 0.2rem;
}

/* GEMESSEN in Overpass-Regular bei 11,52px (0.72rem) mit 0.2em Sperrung, gegen den ENGSTEN
   Rahmen: 320px Fenster, Polster 2 x 1,25rem -> 288px. Der Verweis steht in allen sechs
   Sprachen einzeilig, der laengste ist die italienische Fassung:
     Orari di apertura e come raggiungerci   276,5px   <- nur 11,5px Luft
     Horarios de apertura y cómo llegar      254,9px
     Horaires d’ouverture et accès           216,5px
     Opening hours and directions            213,6px
     Öffnungszeiten und Anfahrt              201,4px
     Açılış saatleri ve yol tarifi           193,9px
   ⚠ Die italienische Fassung ist der Massstab, nicht die deutsche. Wer die Beschriftung
   verlaengert oder die Sperrung erhoeht, prueft sie zuerst -- und zwar bei 320px, nicht bei
   der Obergrenze. Ein Umbruch waere hier sichtbar: die Unterstreichung liefe mit. */
.kt-mehr:hover {
    color: var(--kt-muted);
    border-bottom-color: var(--kt-muted);
}
