/* ============================================================================
   ARMSTARK · Serviceanfrage – Stylesheet der Extension armstark_kundenbereich
   ----------------------------------------------------------------------------
   Grundlage : serviceanfrage-overrides.css der Vorlage (ohne deren erste,
               versehentliche TypoScript-Zeile) sowie der verbindliche
               Prototyp armstark-serviceanfrage-prototyp.html.
   Unterschied zur Vorlage: Die Overrides mussten ein fremdes Theme OHNE
               Template-Änderung biegen (Selektoren wie .page__wrap,
               .input-background, form[id^="…"], viele :has()-Notlösungen).
               Diese Extension bringt ihre EIGENEN Fluid-Templates mit, deshalb
               hier saubere, sprechende Klassennamen (deutsch, herstellerneutral)
               statt Fremd-Theme-Haken.
   Tokens    : 1:1 aus dem Prototyp übernommen – KEINE eigenen Hexwerte, auch
               nicht als Rückfallwert.
   Geltung   : Alle Regeln sind unter .serviceanfrage gekapselt, damit sie das
               übrige TYPO3-Theme nicht berühren. Der :root-Block mit den Tokens
               ist bewusst global (wie im Prototyp). Sollte das Wirts-Theme
               eigene gleichnamige Variablen führen (z. B. --red), den :root-Block
               auf .serviceanfrage umziehen – die Komponenten lesen alle Tokens
               ohnehin nur innerhalb von .serviceanfrage.
   ============================================================================ */


/* ============================================================================
   §1  DESIGN-TOKENS  (Kapitel 3, unverändert aus dem Prototyp)
   ============================================================================ */
:root{
  /* --- Farbe (CI, unverändert) --- */
  --red:#BC2222;
  --red-dark:#9E1C1C;
  --red-tint:rgba(188,34,34,.06);
  --grey:#575756;          /* Fließtext · 7,2:1 auf Weiß */
  --ink:#1A1A1A;           /* Überschriften, Eingabetext */
  --grey-mid:#DADAD9;      /* NUR dekorative Trenner · 1,4:1 */
  --border-ui:#878786;     /* Rahmen interaktiver Elemente · 3,6:1 → WCAG 1.4.11 */
  --grey-light:#F2F2F2;    /* Flächen */
  --white:#fff;
  --ok:#1B7C45;  --ok-bg:#E8F3EC;
  --warn-bg:#FBF3E2; --warn-br:#E4CA95; --warn-tx:#6B4A00;
  --info-bg:#EEF3F7; --info-br:#C9D8E4; --info-tx:#2A4A63; /* 7,0:1 auf --info-bg */

  /* --- Abstands-Skala (4er-Basis) --- */
  --s1:4px; --s2:8px; --s3:12px; --s4:16px; --s5:24px;
  --s6:32px; --s7:48px; --s8:64px; --s9:96px;

  /* --- Formular-Rhythmus (abgeleitet, Verhältnis 1:4:8, Kapitel 3.3) --- */
  /* 23.09.2026 nach der Schriftvergrößerung nachgezogen: bei 13,5 px Frage
     trugen 6px und 24px; bei 20 px klebt die Frage am Feld, und der Sprung von
     einer Gruppe zur nächsten wird zu leise. Entscheidend ist der ABSTAND der
     Abstände - innerhalb der Gruppe muss deutlich enger sein als dazwischen.
     24.09.2026, Rückschritt auf 18 px: beide Werte bleiben. Sie gehören zu
     einer lauten Frage, nicht zu genau 20 px, und 18 px liegt viel näher an
     20 px als an den 13,5 px, aus denen 6px/24px stammten. In Vielfachen der
     Schrift gerechnet ändert sich kaum etwas: 10px sind bei 20 px 0,50 em und
     bei 18 px 0,56 em - weiterhin klar enger als die 32px zum nächsten Feld
     (Verhältnis 1:3,2). Ein Zurückdrehen auf 6px/24px wäre der alte Zustand
     einer viel kleineren Schrift und würde die Trennung wieder einebnen. */
  --ff-label-gap:10px;       /* Frage → Feld   (war 6px bei 13,5 px Schrift) */
  --ff-help-gap:6px;         /* Feld → Hilfetext / Fehler - bleibt eng am Feld */
  --ff-field-gap:var(--s6);  /* Feld → Feld = 32px (war 24px) */
  --ff-group-gap:var(--s7);  /* Gruppe → Gruppe = 48px */
  --ff-legend-gap:var(--s4); /* Legende → erstes Feld = 16px */
  --ff-control:52px;         /* Mindesthöhe aller Bedienelemente */

  /* --- Radius / Schatten / Maße --- */
  --radius:8px; --radius-lg:14px; --pill:100px;
  --shadow-s:0 2px 8px rgba(26,26,26,.06);
  --shadow-m:0 8px 30px rgba(26,26,26,.10);
  --shadow-l:0 20px 60px rgba(26,26,26,.18);
  --max:1240px;
  --max-form:640px;          /* max. Zeilenlänge im Formular */
  /* Das Kachelraster nimmt die Spalte des Themes, statt sich selbst zu begrenzen.
     Eine feste Breite war hier der Fehler: die Theme-Spalte ist je nach
     Raster-Einstellung des Containers 1240px oder 1360px breit, das Raster stand mit
     960px immer schmaler darin und klebte links - unabhängig davon, ob die Spalte
     selbst zentriert war. Gemessen am 23.09.2026 an /kundenservice/, wo das
     bestehende Formular die volle Spaltenbreite nutzt. */
  --max-tiles:100%;

  /* --- Typografie --- */
  --font:"Helvetica Neue",Helvetica,Arial,sans-serif;
  --fs-h1:clamp(26px,3.4vw,34px);
  --fs-h2:21px;
  --fs-h3:22.5px;            /* H3-Stufe der Website – Maß der Abschnitts-Legenden */
  --fs-legend:12.5px;
  /* 23.09.2026 Meindl: die Frage war mit 13,5 px kleiner als der Text, den der
     Kunde hineinschreibt (16 px), und kleiner als die Kacheltitel. Deshalb auf
     20 px gehoben - deutlich lauter, aber unter der Abschnittsüberschrift
     (22,5 px), damit die Rangfolge Überschrift > Frage > Eingabe erhalten
     bleibt. 24.09.2026 Meindl dazu: "könnte eine Spur kleiner sein" - jetzt
     18 px. Das ist die Stufe dazwischen und hält beide Grenzen ein: noch
     deutlich über der Eingabe (16 px), noch unter der Abschnittsüberschrift.
     Gilt für alle vier Fragestellen: Feldbeschriftung, Theme-Label (Ruhe und
     Fokus) sowie die Legenden der Kachel- und Chip-Gruppen. Keine eigene Stufe
     für Mobil - die Größen stehen in keiner Mediaabfrage, Telefon und Rechner
     sind gleich. */
  --fs-label:18px;
  --fs-input:16px;           /* nie kleiner – iOS zoomt sonst beim Fokus */
  --fs-body:16px;
  --fs-help:13px;
  --fs-micro:12.5px;

  /* --- Bewegung --- */
  --dur-fast:120ms; --dur:180ms; --dur-slow:320ms;
  --ease:cubic-bezier(.2,.7,.3,1);
}


/* ============================================================================
   §2  GRUNDLAGEN  (Kapitel 8 – Fokus, Bewegung)
   ============================================================================ */
.serviceanfrage,
.serviceanfrage *,
.serviceanfrage *::before,
.serviceanfrage *::after{
  box-sizing:border-box;
}

.serviceanfrage{
  font-family:var(--font);
  color:var(--grey);
  font-size:var(--fs-body);
  line-height:1.6;
}

/* Sichtbarer Fokus-Ring auf jedem bedienbaren Element (Kapitel 8.2). */
.serviceanfrage :focus-visible{
  outline:3px solid var(--ink);
  outline-offset:2px;
  border-radius:4px;
}

/* Bewegung abschalten, wenn der Nutzer das wünscht (Kapitel 8.6). */
@media (prefers-reduced-motion:reduce){
  .serviceanfrage *,
  .serviceanfrage *::before,
  .serviceanfrage *::after{
    animation-duration:.01ms !important;
    animation-iteration-count:1 !important;
    transition-duration:.01ms !important;
  }
}

/* Nur für Screenreader – sichtbar ausgeblendet, aber vorlesbar. */
.serviceanfrage .nur-sr{
  position:absolute;
  width:1px;height:1px;
  padding:0;margin:-1px;
  overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);
  white-space:nowrap;border:0;
}


/* ============================================================================
   §3  FORMULARSPALTE  (Kapitel 5.1 – begrenzte Zeilenlänge)
   Feldbreite ist das Signal, wie viel Eingabe erwartet wird. Deshalb hart auf
   640px begrenzt, unabhängig von der Fensterbreite.
   ============================================================================ */
.serviceanfrage__spalte{
  max-width:var(--max-form);
}


/* ============================================================================
   §4  RHYTHMUS / FELDGRUPPE  (Kapitel 3.3 – Nähe-Prinzip 1:4:8)
   Der Abstand transportiert die Zusammengehörigkeit:
     Label → Feld       10px  (--ff-label-gap)
     Feld  → Hilfetext  6px   (--ff-help-gap)
     Feld  → Feld       32px  (--ff-field-gap)
     Gruppe→ Gruppe     48px  (--ff-group-gap)
   Der Feld-zu-Feld-Abstand kommt über gap am Spaltencontainer, nicht über
   margin an den Feldern – so trifft er auch das letzte Feld nicht.
   ============================================================================ */
.serviceanfrage__spalte{
  display:flex;
  flex-direction:column;
  gap:var(--ff-field-gap);
}

.serviceanfrage .feldgruppe{
  display:flex;
  flex-direction:column;
  margin:0;
  /* min-width:0 hebt die Browser-Vorgabe min-width:min-content am fieldset
     auf. Ohne sie wurde das fieldset so breit wie sein breitester Inhalt:
     gemessen 25.09.2026 bei 375px mit drei Chips (Lieferung/Einbau) 603px
     statt 306px, der dritte Knopf lag außerhalb des Bildschirms. */
  min-width:0;
}

.serviceanfrage .feldgruppe__label{
  order:-1;                          /* Label immer vor dem Feld */
  display:block;
  font-size:var(--fs-label);
  font-weight:700;
  line-height:1.35;
  color:var(--ink);
  margin:0 0 var(--ff-label-gap);
  white-space:normal;                /* lange Fragen dürfen umbrechen */
}

/* Pflichtkennzeichen und "(optional)" – (optional) ist Nebeninfo, nicht fett. */
.serviceanfrage .feldgruppe__pflicht{
  color:var(--red);
  font-weight:700;
}
.serviceanfrage .feldgruppe__optional{
  font-weight:400;
  color:var(--grey);
}

.serviceanfrage .feldgruppe__hilfe{
  margin:var(--ff-help-gap) 0 0;
  font-size:var(--fs-help);
  line-height:1.45;
  color:var(--grey);
}

/* Fehlertext dicht am Feld, rot und fett. */
.serviceanfrage .feldgruppe__fehler{
  margin:var(--ff-help-gap) 0 0;
  font-size:var(--fs-help);
  font-weight:700;
  line-height:1.45;
  color:var(--red);
  list-style:none;
  padding:0;
}


/* ============================================================================
   §5  EINGABEFELDER  (Kapitel 5.2 / 5.3)
   Rahmen bewusst --border-ui (3,6:1) und nicht --grey-mid (1,4:1): ein
   Control-Rahmen muss WCAG 1.4.11 erfüllen.
   ============================================================================ */
.serviceanfrage .eingabefeld,
.serviceanfrage input[type="text"],
.serviceanfrage input[type="email"],
.serviceanfrage input[type="tel"],
.serviceanfrage input[type="number"],
.serviceanfrage input[type="date"],
.serviceanfrage textarea,
.serviceanfrage select{
  width:100%;
  font:inherit;
  font-size:var(--fs-input);
  line-height:1.4;
  color:var(--ink);
  background:var(--white);
  border:2px solid var(--border-ui);
  border-radius:var(--radius);
  padding:14px 15px;
  min-height:var(--ff-control);
  box-shadow:none;
  transition:border-color var(--dur-fast), box-shadow var(--dur-fast);
}

.serviceanfrage textarea{
  min-height:112px;             /* signalisiert: mehrere Sätze erwartet */
  resize:vertical;              /* nicht auto-grow – verhindert Sprünge beim Tippen */
  line-height:1.55;
}

.serviceanfrage .eingabefeld:hover,
.serviceanfrage input:hover,
.serviceanfrage textarea:hover,
.serviceanfrage select:hover{
  border-color:var(--ink);
}

.serviceanfrage .eingabefeld:focus,
.serviceanfrage input:focus,
.serviceanfrage textarea:focus,
.serviceanfrage select:focus{
  outline:none;
  border-color:var(--ink);
  box-shadow:0 0 0 3px rgba(87,87,86,.18);
}

/* Fehlerzustand – sowohl über aria-invalid als auch über die Zustandsklasse. */
.serviceanfrage [aria-invalid="true"],
.serviceanfrage .feldgruppe--fehler .eingabefeld,
.serviceanfrage .feldgruppe--fehler input,
.serviceanfrage .feldgruppe--fehler textarea,
.serviceanfrage .feldgruppe--fehler select{
  border-color:var(--red);
  background:rgba(188,34,34,.04);
}

/* Auswahlfeld: eigener Pfeil statt System-Widget (Kapitel 5.2). */
.serviceanfrage select,
.serviceanfrage .eingabefeld--auswahl{
  appearance:none;
  -webkit-appearance:none;
  padding-right:44px;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' fill='none' stroke='%231A1A1A' stroke-width='2' stroke-linecap='round'%3E%3Cpath d='M5 8l5 5 5-5'/%3E%3C/svg%3E");
  background-repeat:no-repeat;
  background-position:right 14px center;
}

/* PLZ schmaler als Ort – Feldbreite als Erwartungssignal (Kapitel 5.2). */
.serviceanfrage .eingabefeld--plz{
  max-width:180px;
}


/* ============================================================================
   §6  ABSCHNITT  (fieldset/legend mit Nummernkreis, Kapitel 5.1)
   Gruppen fassen zusammengehörige Felder. Abstand Gruppe→Gruppe = 48px.
   ============================================================================ */
.serviceanfrage .abschnitt{
  border:0;
  margin:0 0 var(--ff-group-gap);
  padding:0;
  min-width:0;                  /* Firefox: fieldset schrumpft sonst nicht */
}
.serviceanfrage .abschnitt:last-of-type{
  margin-bottom:0;
}

.serviceanfrage .abschnitt__legende{
  display:flex;
  align-items:center;
  gap:var(--s2);
  width:100%;
  padding:0 0 var(--s3);
  margin:0 0 var(--ff-legend-gap);
  font-size:var(--fs-legend);
  font-weight:700;
  letter-spacing:.08em;
  text-transform:uppercase;
  color:var(--grey);
  border-bottom:1px solid var(--grey-mid);
}

/* Nummernkreis vor der Legende. */
.serviceanfrage .abschnitt__nummer{
  flex:none;
  width:20px;height:20px;
  border-radius:50%;
  background:var(--ink);
  color:var(--white);
  display:grid;place-items:center;
  font-size:11px;
  letter-spacing:0;
}

/* Der abschnittsinterne Feldrhythmus wie in der Spalte. */
.serviceanfrage .abschnitt > .feldgruppe + .feldgruppe{
  margin-top:var(--ff-field-gap);
}


/* ============================================================================
   §7  CHIPS statt Auswahlfeld  (Kapitel 5.4)
   Ersetzt jedes Auswahlfeld mit wenigen Optionen und jede Ja/Nein-Frage durch
   echte, angetippte Radio-/Checkbox-Inputs. Das Input wird über opacity:0
   versteckt – NICHT display:none, sonst ist es nicht fokussierbar (Kapitel 8.3).
   Der sichtbare Fokus liegt am Chip-Label, nicht am unsichtbaren Input.
   ============================================================================ */
/* Gleich breite Chips je Frage.
   War: display:flex mit flex-wrap. Jeder Chip wuchs mit seinem Text, also
   stand in „Ist das Gerät noch nutzbar?" ein 60px schmales „Ja" neben einem
   180px breiten „Nein, steht still" – eine unruhige Reihe mit lauter
   verschiedenen Kanten.
   Ist: ein Raster mit gleich breiten Spalten (1fr), Text mittig im Knopf.
   Entscheidung Schultheiß/Salamon vom 24.09.2026: „bei worum geht die
   chips__option gleich breit und innerhalb der button centriert".

   Gleich breit bezogen auf die GRUPPE, nicht auf das ganze Formular: die acht
   Chip-Gruppen haben sehr verschiedene Beschriftungen (längste je Gruppe
   gemessen am 24.09.2026 aus der Konfiguration: Kontaktkanal 8 Zeichen,
   Gerät-nutzbar 17, Aufstellort 19, Zubehörbereiche 21, Zeitplan 22,
   Rechnungsthema 22, Lieferthema 31, Montage 64). Eine formularweit gleiche
   Breite müsste sich am längsten Text überhaupt orientieren und würde aus
   „Ja" einen halbseitigen Knopf machen. Je Frage eine ruhige Reihe ist das,
   was gemeint war.

   Warum repeat(auto-fit, minmax(22ch, 1fr)) und keine feste width: die Zahl
   der Spalten ergibt sich aus dem Platz, nicht aus der Zahl der Optionen. Auf
   dem Telefon fällt die Reihe von selbst auf eine Spalte zurück – gleich breit
   heißt ausdrücklich nicht „alle in eine Zeile quetschen". Die 22ch sind die
   Untergrenze einer Spalte; 1fr sorgt dafür, dass alle tatsächlich belegten
   Spalten exakt gleich breit werden.

   Warum max-width:var(--max-form): ohne Begrenzung füllt das Raster die ganze
   Theme-Spalte (gemessen bis 1360px), und drei Optionen würden zu drei
   448px-Knöpfen. Mit den 640px der Formular-Zeilenlänge ergeben sich drei
   Spalten zu rund 208px – breit genug für 17 bis 22 Zeichen in einer Zeile.

   Offen: „Würde es gerne selbst einbauen, benötige aber telefonische Hilfe"
   (64 Zeichen, Liste montage) passt in 208px nicht in eine Zeile und läuft auf
   rund vier Zeilen; das Raster bleibt gleichmäßig, aber die ganze Reihe wird
   entsprechend hoch. Das ist eine Textlänge, keine Gestaltungsfrage. */
.serviceanfrage .chips{
  display:grid;
  /* min(22ch, 100%): das Spalten-Minimum wird nie breiter als der Container. */
  grid-template-columns:repeat(auto-fit, minmax(min(22ch, 100%), 1fr));
  gap:var(--s2);
  max-width:var(--max-form);
  border:0;
  margin:0;
  padding:0;
}

.serviceanfrage .chips__option{
  /* flex statt inline-flex: als Raster-Element füllt der Chip seine Spalte,
     die Breite kommt jetzt von der Spalte und nicht mehr vom Text.
     justify-content/text-align zentrieren die Beschriftung im Knopf – auch
     dann noch, wenn sie über zwei Zeilen läuft. */
  display:flex;
  align-items:center;
  justify-content:center;
  text-align:center;
  gap:var(--s2);
  cursor:pointer;
  min-height:48px;               /* Touch-Ziel ≥ 44px (Kapitel 8.5) */
  padding:11px 16px;
  margin:0;
  border:2px solid var(--border-ui);
  border-radius:var(--pill);
  background:var(--white);
  color:var(--ink);
  font-size:15px;
  font-weight:700;
  line-height:1.2;
  transition:border-color var(--dur-fast), background var(--dur-fast),
             color var(--dur-fast);
}
.serviceanfrage .chips__option:hover{
  border-color:var(--ink);
}

.serviceanfrage .chips__eingabe{
  position:absolute;
  opacity:0;                     /* versteckt, aber fokussierbar */
  width:1px;height:1px;
  margin:0;
  pointer-events:none;
}

.serviceanfrage .chips__option:has(.chips__eingabe:checked){
  border-color:var(--red);
  background:var(--red);
  color:var(--white);
}
.serviceanfrage .chips__option:has(.chips__eingabe:focus-visible){
  outline:3px solid var(--ink);
  outline-offset:2px;
}


/* ============================================================================
   §8  ANLIEGEN-KACHELN  (Kapitel 4 – Kachelauswahl)
   ----------------------------------------------------------------------------
   Raster 3 / 2 / 1 Spalten, Umbruchpunkte 901px und 521px; unter 521px liegt
   die Kachel waagerecht (Bild/Icon links, Text rechts).

   BILDKONZEPT (ausdrücklicher Wunsch des Auftraggebers):
   Jede Kachel trägt ein Hintergrundbild; das Icon bleibt Zweitsignal. Das Bild
   wird je Anliegen über die Custom-Property --anliegen-bild gesetzt – inline
   vom Partial AnliegenKacheln.html aus der Konfiguration (JSON), NICHT im
   Stylesheet (siehe Kommentar am Ende dieses Abschnitts).

   RÜCKFALL OHNE BILD – so ist es gebaut, damit "nichts kaputt" aussieht:
   Der Bildbereich .anliegen-kachel__bild hat als GRUNDFLÄCHE --grey-light und
   legt das Bild NUR als background-image darüber. Fehlt die Bilddatei (404) oder
   ist --anliegen-bild nicht gesetzt, bleibt schlicht die graue Fläche stehen –
   also genau die bisherige Icon-Optik. Der Titeltext steht IMMER auf der weißen
   Kartenfläche darunter (dunkle Schrift), nie über dem Bild. Dadurch ist der
   Kontrast in JEDEM Fall erfüllt (Kapitel 8.1), ganz ohne zu wissen, ob ein
   Bild geladen wurde. Das Icon sitzt in einem hellen Chip mit Schatten und ist
   sowohl auf Grau als auch auf jedem Foto lesbar.
   Bild austauschen = Datei ablegen UND ihren Pfad in der Konfiguration (JSON)
   eintragen; das reine Ablegen genügt nicht mehr (Namenskonvention siehe
   Resources/Public/Images/README.md).
   ============================================================================ */
.serviceanfrage .anliegen-auswahl{
  max-width:var(--max-tiles);
  border:0;
  /* LINKSBÜNDIG, nicht zentriert (gemessen 22.09.2026 an /ausstellungen/):
     Die Website setzt ihren Inhalt in eine Spalte von 1360px, die bei x=186
     beginnt - Überschrift, Inhalt und Fußnavigation fluchten alle dort.
     Ein zentrierter Block fällt aus dieser Ordnung heraus. */
  margin:0;
  padding:0;
}

.serviceanfrage .anliegen-auswahl__legende{
  display:block;
  width:100%;
  padding:0;
  margin:0 0 var(--s4);
  font-size:var(--fs-legend);
  font-weight:700;
  letter-spacing:.08em;
  text-transform:uppercase;
  color:var(--grey);
}

/* Hinweis "Bitte wählen Sie …" VOR das Raster (Kapitel 4.1). */
.serviceanfrage .anliegen-auswahl__hinweis{
  margin:0 0 var(--s5);
  font-size:16px;
  color:var(--grey);
}

.serviceanfrage .anliegen-auswahl__raster{
  display:grid;
  grid-template-columns:repeat(3, 1fr);
  gap:var(--s4);
  /* Breitenbegrenzung nach Kapitel 4.1 der Spezifikation: 1020px, also rund
     330px je Kachel. Ohne sie zieht das Raster über die volle Zeilenbreite -
     gemessen 22.09.2026 waren es 453px je Kachel, deutlich zu groß.
     margin-inline:auto zentriert das Raster in der Spalte des Themes; ohne das
     klebt es links und rechts bleibt ein breiter Rest leer. */
  max-width:var(--max-tiles);
}

.serviceanfrage .anliegen-kachel{
  position:relative;
  display:flex;
  flex-direction:column;
  margin:0;
  cursor:pointer;
  background:var(--white);
  border:2px solid var(--border-ui);
  border-radius:var(--radius-lg);
  box-shadow:var(--shadow-s);
  overflow:hidden;
  transition:border-color var(--dur) var(--ease),
             box-shadow  var(--dur) var(--ease),
             transform   var(--dur) var(--ease),
             background  var(--dur) var(--ease);
}
.serviceanfrage .anliegen-kachel:hover{
  border-color:var(--ink);
  box-shadow:var(--shadow-m);
  transform:translateY(-2px);
}

/* Radio versteckt, aber fokussierbar (Kapitel 8.3). */
.serviceanfrage .anliegen-kachel__eingabe{
  position:absolute;
  opacity:0;
  width:1px;height:1px;
  margin:0;
  pointer-events:none;
}

/* Bildbereich: graue Grundfläche + optionales Hintergrundbild darüber. */
.serviceanfrage .anliegen-kachel__bild{
  position:relative;
  /* 2:1 statt 16:10 - bei 240px Kachelbreite sind das 120px Bildhöhe.
     Zusammen mit dem Textteil landet die Kachel bei rund 220px, dem Format
     der Produktkacheln (Wunsch Schultheiß 22.09.2026). */
  aspect-ratio:2 / 1;
  background-color:var(--grey-light);
  background-image:var(--anliegen-bild, none);
  background-size:cover;
  background-position:center;
  background-repeat:no-repeat;
  /* Kein Innenabstand und keine Ausrichtung mehr: der Bildbereich hatte genau
     ein Kind, das Symbol, und das ist seit dem 24.09.2026 weg. Die Höhe hängt
     am aspect-ratio, nicht am Inhalt – der Bereich bleibt also unverändert. */
}
/* Abdunklung nach unten, nur noch als Hauch (.2 statt .45). Auf dem Bild steht
   kein Text – Titel und Beschreibung sitzen darunter im weißen Kartenteil –,
   die starke Abdunklung war ein Rest eines früheren Entwurfs und hat die Fotos
   am unteren Rand nur vermatscht. Der kleine Rest bleibt als Abschluss der
   Bildfläche zur Karte hin. Die ursprüngliche Begründung – der weiße
   Icon-Chip verliert auf sehr hellen Fotos die Kante (Kapitel 8.1) – trägt
   seit dem 24.09.2026 nicht mehr, weil es keinen Icon-Chip mehr gibt. */
.serviceanfrage .anliegen-kachel__bild::after{
  content:"";
  position:absolute;
  inset:0;
  background:linear-gradient(to top, rgba(0,0,0,.2), rgba(0,0,0,0) 62%);
  pointer-events:none;
}

/* Das Symbol auf der Anliegen-Kachel ist am 24.09.2026 entfallen (Schultheiß
   und Salamon: „Diese Kachel-Icons generell … die müssen raus für alle acht.
   Dann ist es auch einheitlich“).
   War: heller Chip 44x44px mit rotem Symbol, im gewählten Zustand rot mit
   weißem Symbol – als Zweitsignal neben dem Foto.
   Ist: keine Gestaltung mehr an dieser Stelle. Das Ausblenden steht gesammelt
   im Block „KEINE SYMBOLE AUF DEN KACHELN“ am Dateiende, zusammen mit den
   Produktkacheln – ein Ort, eine Begründung.
   Warum gelöscht statt überschrieben: eine Regel, die nichts mehr bewirkt,
   liest sich beim nächsten Mal wie eine, die noch etwas bewirkt. */

.serviceanfrage .anliegen-kachel__inhalt{
  padding:var(--s4) var(--s5) var(--s5);
}
.serviceanfrage .anliegen-kachel__titel{
  display:block;
  font-size:17px;
  font-weight:700;
  line-height:1.25;
  color:var(--ink);
  margin:0 0 var(--s2);
}
.serviceanfrage .anliegen-kachel__text{
  display:block;
  font-size:14px;
  line-height:1.45;
  color:var(--grey);
}

/* Gewählt: roter Rahmen, roter Anriss, Schatten.
   War zusätzlich: der Icon-Chip wurde rot mit weißem Symbol. Diese Regel ist
   am 24.09.2026 mit dem Symbol entfallen – sie hätte auf ein ausgeblendetes
   Element gezeigt. Die Auswahl bleibt an Rahmen, Fläche und Schatten
   erkennbar, genau wie bei den Produktkacheln. */
.serviceanfrage .anliegen-kachel:has(.anliegen-kachel__eingabe:checked){
  border-color:var(--red);
  background:var(--red-tint);
  box-shadow:var(--shadow-m);
}

/* Tastaturfokus sichtbar an der Kachel, nicht am versteckten Input. */
.serviceanfrage .anliegen-kachel:has(.anliegen-kachel__eingabe:focus-visible){
  outline:3px solid var(--ink);
  outline-offset:2px;
}

/* ---- Kein Bildpfad im Stylesheet mehr -----------------------------------
   Die Custom-Property --anliegen-bild wird vom Partial AnliegenKacheln.html
   inline am Kachel-Element gesetzt, gespeist aus der Konfiguration (JSON).
   Das Stylesheet kennt bewusst KEINE einzelne Kachel mehr: ein neues Anliegen
   entsteht allein durch einen Eintrag in der Konfiguration, ohne CSS-Änderung.
   Fehlt der Pfad oder die Datei, greift oben der Rückfall auf die graue
   Grundfläche in .anliegen-kachel__bild. Seit dem Wegfall der Symbole am
   24.09.2026 ist das eine leere graue Fläche und keine Icon-Optik mehr –
   ein fehlendes Bild fällt damit stärker auf als vorher. */


/* ============================================================================
   §9  PRODUKT-KACHELN  (Produktbild statt reinem Piktogramm)
   Gleiche Rückfall-Logik wie bei den Anliegen: graue Grundfläche +
   --produkt-bild darüber; fehlt das Bild, bleibt seit dem Wegfall der Symbole
   (24.09.2026) die leere graue Fläche, nicht mehr die Icon-Optik. Kompakter,
   Raster 4 / 3 / 2 Spalten. Auswahl über verstecktes Radio/Checkbox.
   ============================================================================ */
.serviceanfrage .produkt-auswahl{
  display:grid;
  grid-template-columns:repeat(4, 1fr);
  gap:var(--s3);
  border:0;
  margin:0;
  padding:0;
}

.serviceanfrage .produkt-kachel{
  position:relative;
  display:flex;
  flex-direction:column;
  margin:0;
  cursor:pointer;
  background:var(--white);
  border:2px solid var(--border-ui);
  border-radius:var(--radius);
  box-shadow:var(--shadow-s);
  overflow:hidden;
  transition:border-color var(--dur) var(--ease),
             box-shadow  var(--dur) var(--ease),
             transform   var(--dur) var(--ease);
}
.serviceanfrage .produkt-kachel:hover{
  border-color:var(--ink);
  box-shadow:var(--shadow-m);
  transform:translateY(-2px);
}

.serviceanfrage .produkt-kachel__eingabe{
  position:absolute;
  opacity:0;
  width:1px;height:1px;
  margin:0;
  pointer-events:none;
}

.serviceanfrage .produkt-kachel__bild{
  position:relative;
  aspect-ratio:4 / 3;
  background-color:var(--grey-light);
  background-image:var(--produkt-bild, none);
  background-size:cover;
  background-position:center;
  background-repeat:no-repeat;
  display:grid;
  place-items:center;
}
.serviceanfrage .produkt-kachel__bild::after{
  content:"";
  position:absolute;
  inset:0;
  background:linear-gradient(to top, rgba(0,0,0,.2), rgba(0,0,0,0) 60%);
  pointer-events:none;
}
.serviceanfrage .produkt-kachel__icon{
  position:relative;
  z-index:1;
  width:40px;height:40px;
  border-radius:10px;
  background:var(--white);
  color:var(--red);
  display:grid;
  place-items:center;
  box-shadow:var(--shadow-s);
}
.serviceanfrage .produkt-kachel__icon svg{
  width:24px;height:24px;
}

.serviceanfrage .produkt-kachel__titel{
  display:block;
  padding:var(--s3);
  text-align:center;
  font-size:13px;
  font-weight:700;
  line-height:1.3;
  color:var(--ink);
}

.serviceanfrage .produkt-kachel:has(.produkt-kachel__eingabe:checked){
  border-color:var(--red);
  background:var(--red-tint);
  box-shadow:var(--shadow-m);
}
.serviceanfrage .produkt-kachel:has(.produkt-kachel__eingabe:checked) .produkt-kachel__icon{
  background:var(--red);
  color:var(--white);
}
.serviceanfrage .produkt-kachel:has(.produkt-kachel__eingabe:focus-visible){
  outline:3px solid var(--ink);
  outline-offset:2px;
}

/* ---- Kein Produktbildpfad im Stylesheet mehr ----------------------------
   Wie bei den Anliegen: die Custom-Property --produkt-bild wird vom Partial
   ProduktKacheln.html inline am Kachel-Element gesetzt, gespeist aus der
   Konfiguration (JSON). Das Stylesheet kennt bewusst KEINE einzelne Kachel
   mehr. Fehlt der Pfad oder die Datei, bleibt oben die graue Grundfläche in
   .produkt-kachel__bild stehen (Icon-Optik). */


/* ============================================================================
   §10  DATEI-ABLAGE  (mehrere Dateien, Kapitel 5.7)
   Das <input type="file" multiple> liegt in einer gestrichelten Drop-Zone.
   ============================================================================ */
.serviceanfrage .datei-ablage{
  border:2px dashed var(--border-ui);
  border-radius:var(--radius);
  background:var(--grey-light);
  padding:var(--s4);
  transition:border-color var(--dur-fast), background var(--dur-fast);
}
.serviceanfrage .datei-ablage:hover,
.serviceanfrage .datei-ablage:focus-within{
  border-color:var(--red);
  background:var(--red-tint);
}
.serviceanfrage .datei-ablage__eingabe{
  font-size:14.5px;
  color:var(--grey);
  border:0;
  background:none;
  padding:0;
  min-height:0;
  width:100%;
}
.serviceanfrage .datei-ablage__eingabe::file-selector-button{
  font:inherit;
  font-weight:700;
  color:var(--ink);
  background:var(--white);
  border:2px solid var(--border-ui);
  border-radius:var(--pill);
  padding:10px 18px;
  min-height:44px;
  margin-right:var(--s3);
  cursor:pointer;
  transition:border-color var(--dur-fast), color var(--dur-fast);
}
.serviceanfrage .datei-ablage__eingabe::file-selector-button:hover{
  border-color:var(--red);
  color:var(--red);
}
.serviceanfrage .datei-ablage__hinweis{
  margin:var(--s2) 0 0;
  font-size:var(--fs-help);
  color:var(--grey);
}


/* ============================================================================
   §11  HINWEISBOXEN  (warn / info / ok, Kapitel 5.8)
   Symbol als Maske in currentColor, damit es die Textfarbe der Box übernimmt.
   ============================================================================ */
.serviceanfrage .hinweisbox{
  display:flex;
  gap:var(--s3);
  align-items:flex-start;
  border-radius:var(--radius);
  padding:var(--s3) var(--s4);
  font-size:14px;
  line-height:1.5;
  margin:0 0 var(--s5);
}
.serviceanfrage .hinweisbox p{ margin:0; }
.serviceanfrage .hinweisbox p + p{ margin-top:var(--s2); }
.serviceanfrage .hinweisbox b{ color:inherit; }

.serviceanfrage .hinweisbox--warn{
  background:var(--warn-bg);
  border:1px solid var(--warn-br);
  color:var(--warn-tx);
}
.serviceanfrage .hinweisbox--info{
  background:var(--info-bg);
  border:1px solid var(--info-br);
  color:var(--info-tx);
}
.serviceanfrage .hinweisbox--ok{
  background:var(--ok-bg);
  border:1px solid #BEDDCA;
  color:#155F35;
}

.serviceanfrage .hinweisbox__symbol{
  flex:none;
  width:20px;height:20px;
  margin-top:2px;
  color:inherit;
}
.serviceanfrage .hinweisbox__symbol svg{
  width:20px;height:20px;
}


/* ============================================================================
   §11a  VERWEIS-KNOPF  (abgesetzter Weg nach draußen, mitten im Formular)
   ----------------------------------------------------------------------------
   Der Verweis auf den Zubehörshop stand bis zum 24.09.2026 als Hinweisbox ganz
   oben über dem Formular und wurde übersehen. Eine Hinweisbox ist auch die
   falsche Form: ihre Farben (--info-*) sagen „Randbemerkung", hier soll aber
   ein Weg angeboten werden, den viele nehmen sollen. Deshalb eine eigene
   Fläche im Fluss – Rot-Anriss links, zarte Rot-Tönung als Hintergrund – und
   darunter ein echter Knopf statt eines unterstrichenen Wortes.

   Farben ausschließlich aus §1: --red, --red-dark, --red-tint, --ink, --white.
   ============================================================================ */
.serviceanfrage .verweis-knopf{
  display:flex;
  flex-direction:column;
  align-items:flex-start;
  gap:var(--s4);
  max-width:var(--max-form);
  margin:0;
  padding:var(--s5);
  background:var(--red-tint);
  border-left:4px solid var(--red);
  border-radius:var(--radius);
}
.serviceanfrage .verweis-knopf__text{
  margin:0;
  font-size:var(--fs-body);
  line-height:1.5;
  color:var(--ink);
}

/* Der Knopf erbt Form und Maße von .knopf (§13) – damit sieht er aus wie die
   Knöpfe der Aktionsleiste und nicht wie ein zweites, eigenes Bedienelement.
   Kein order/flex wie bei --primär: der steht in einer Leiste, dieser nicht. */
.serviceanfrage .knopf--verweis{
  max-width:100%;
  background:var(--red);
  color:var(--white);
  text-decoration:none;
  text-align:center;
  box-shadow:var(--shadow-m);
}
.serviceanfrage .knopf--verweis:hover{
  background:var(--red-dark);
  transform:translateY(-1px);
}

/* Schmaler Schirm: der Knopf nimmt die volle Breite und darf die Beschriftung
   umbrechen – sonst schiebt „Zum Armstark Zubehörshop" samt Pfeil die Fläche
   über den Rand hinaus. */
@media (max-width:521px){
  .serviceanfrage .verweis-knopf{
    padding:var(--s4);
    align-items:stretch;
  }
  .serviceanfrage .knopf--verweis{
    width:100%;
    padding-left:var(--s4);
    padding-right:var(--s4);
  }
}


/* ============================================================================
   §12  ERFOLGS-SCHIRM  (Kapitel 5.10 – Bestätigung nach dem Absenden)
   ============================================================================ */
.serviceanfrage .erfolg{
  max-width:var(--max-form);
  margin:0 auto;
  text-align:center;
  background:var(--white);
  border-radius:var(--radius-lg);
  box-shadow:var(--shadow-m);
  padding:var(--s8) var(--s5);
}
.serviceanfrage .erfolg__symbol{
  width:64px;height:64px;
  margin:0 auto var(--s4);
  border-radius:50%;
  background:var(--ok-bg);
  color:var(--ok);
  display:grid;
  place-items:center;
}
.serviceanfrage .erfolg__symbol svg{
  width:34px;height:34px;
}
.serviceanfrage .erfolg__titel{
  font-size:var(--fs-h2);
  font-weight:700;
  color:var(--ink);
  margin:0 0 var(--s3);
}
.serviceanfrage .erfolg__text{
  margin:0 auto;
  max-width:46ch;
  font-size:16px;
  color:var(--grey);
}


/* ============================================================================
   §13  AKTIONSLEISTE / SCHALTFLÄCHEN  (Kapitel 5.9)
   "Zurück" links, "Absenden" rechts und breit: der Primärknopf gewinnt über
   Fläche und Farbe. Auf Mobil wird die Leiste unten fixiert (Sticky), damit der
   Absende-Knopf nicht drei Bildschirme entfernt ist.
   ============================================================================ */
.serviceanfrage .aktionsleiste{
  display:flex;
  align-items:center;
  gap:var(--s3);
  width:100%;
  max-width:var(--max-form);
  margin-top:var(--s6);
  padding-top:var(--s5);
  border-top:1px solid var(--grey-mid);
}

.serviceanfrage .knopf{
  display:inline-flex;
  align-items:center;
  justify-content:center;
  gap:var(--s2);
  min-height:var(--ff-control);
  padding:14px 28px;
  border-radius:var(--pill);
  border:2px solid transparent;
  font:inherit;
  font-size:16px;
  font-weight:700;
  cursor:pointer;
  transition:background var(--dur-fast), border-color var(--dur-fast),
             transform var(--dur-fast), box-shadow var(--dur-fast);
}
.serviceanfrage .knopf svg{ width:20px;height:20px; }

.serviceanfrage .knopf--sekundaer{
  order:1;
  flex:none;
  background:transparent;
  color:var(--ink);
  border-color:var(--border-ui);
}
.serviceanfrage .knopf--sekundaer:hover{
  border-color:var(--ink);
}

.serviceanfrage .knopf--primaer{
  order:2;
  flex:1;
  background:var(--red);
  color:var(--white);
  box-shadow:0 6px 18px rgba(188,34,34,.26);
}
.serviceanfrage .knopf--primaer:hover{
  background:var(--red-dark);
  transform:translateY(-1px);
  box-shadow:0 10px 24px rgba(188,34,34,.32);
}
.serviceanfrage .knopf--primaer:disabled,
.serviceanfrage .knopf--primaer[disabled]{
  background:var(--grey-mid);
  color:var(--grey);
  box-shadow:none;
  transform:none;
  cursor:not-allowed;
}

/* Ladezustand am Absende-Knopf: Text ausblenden, Spinner zeigen, sperren.
   Ohne Rückmeldung klickt man beim Datei-Upload zweimal → Doppel-Tickets. */
.serviceanfrage .knopf--laedt{
  color:transparent !important;
  pointer-events:none;
  position:relative;
}
.serviceanfrage .knopf--laedt::after{
  content:"";
  position:absolute;
  width:20px;height:20px;
  border:2.5px solid rgba(255,255,255,.5);
  border-top-color:var(--white);
  border-radius:50%;
  animation:serviceanfrage-drehen .7s linear infinite;
}
@keyframes serviceanfrage-drehen{
  to{ transform:rotate(360deg); }
}


/* ============================================================================
   §14  RESPONSIVE  (Kapitel 10 – Umbruchpunkte 901px und 521px)
   ============================================================================ */

/* ---- ab 901px abwärts: Anliegen 2 Spalten, Produkte 3 Spalten ---- */
@media (max-width:901px){
  .serviceanfrage .anliegen-auswahl__raster{
    grid-template-columns:repeat(2, 1fr);
  }
  .serviceanfrage .produkt-auswahl{
    grid-template-columns:repeat(3, 1fr);
  }
}

/* ---- ab 521px abwärts: 1 Spalte; Anliegen-Kachel waagerecht ---- */
@media (max-width:521px){
  .serviceanfrage{
    --ff-field-gap:28px;   /* mitgezogen, siehe oben */
    --ff-group-gap:var(--s6);
  }
  .serviceanfrage .anliegen-auswahl__raster{
    grid-template-columns:1fr;
  }
  .serviceanfrage .produkt-auswahl{
    grid-template-columns:repeat(2, 1fr);
  }

  /* Chips untereinander, jeder in voller Breite (Wunsch Schultheiß nach dem
     Mobiltest vom 25.09.2026). Gilt für alle Chip-Gruppen. */
  .serviceanfrage .chips{
    grid-template-columns:1fr;
  }

  /* Kachel waagerecht: Bild/Icon links, Text rechts. */
  .serviceanfrage .anliegen-kachel{
    flex-direction:row;
    align-items:stretch;
  }
  .serviceanfrage .anliegen-kachel__bild{
    flex:none;
    width:120px;
    aspect-ratio:1 / 1;
  }
  .serviceanfrage .anliegen-kachel__inhalt{
    flex:1;
    display:flex;
    flex-direction:column;
    justify-content:center;
    padding:var(--s4);
  }
}

/* ---- Mobil: Absendeleiste unten fixieren ---- */
@media (max-width:720px){
  .serviceanfrage .aktionsleiste{
    flex-wrap:wrap;
  }
  .serviceanfrage .aktionsleiste--haftend{
    position:fixed;
    inset:auto 0 0 0;
    z-index:50;
    max-width:none;
    margin:0;
    padding:var(--s3) var(--s4);
    background:var(--white);
    border-top:1px solid var(--grey-mid);
    box-shadow:0 -6px 24px rgba(26,26,26,.10);
  }
  /* Damit die fixierte Leiste den Seitenfuß nicht verdeckt. */
  body:has(.serviceanfrage .aktionsleiste--haftend){
    padding-bottom:104px;
  }
}


/* ============================================================================
   Platz im Theme-Grid (gemessen 22.09.2026)
   ----------------------------------------------------------------------------
   EINZIGE Regel dieses Stylesheets, die außerhalb von .serviceanfrage greift -
   sie muss es, weil sie den Wrapper adressiert, den das Form-Framework um
   unseren Container legt.

   Befund: Das Theme rendert Formularfelder in ein CSS-Grid mit 12 Spalten
   (.field__wrap.col-wrapper, gemessen 12 x 77,58px). Der Wrapper unseres
   Elements trägt zwar .col-12, bekommt aber grid-column: auto - er belegt also
   EINE Spalte statt zwölf. Ergebnis: das Kachelraster war 78px breit, drei
   Spalten a 15px. Das Stylesheet war geladen und griff korrekt, der Platz fehlte.

   Mit grid-column: 1 / -1 nimmt der Wrapper die volle Breite, das Raster stellt
   sich auf seine 1020px (--max-tiles) ein.

   Der Selektor adressiert das direkte Grid-Kind: es trägt col-12, col-sm-12 usw.,
   aber KEINE Klasse .col - ein Selektor darauf greift ins Leere (Fehlversuch
   22.09.2026). :has() greift nur, wenn unser Container wirklich darin liegt - fremde
   Formulare des Themes bleiben unberührt.
   ========================================================================== */
.field__wrap > *:has(.serviceanfrage){
  grid-column: 1 / -1;
}

/* Die Überschrift des Inhaltselements steht in einem <header> NEBEN unserem
   Container, gehört also dem Seitenlayout und nicht uns. Sie ist deshalb über
   die volle Spaltenbreite gesetzt (gemessen 1360px), während unser Block auf
   --max-tiles begrenzt und zentriert ist - die Überschrift stand dadurch 304px
   weiter links als die Kacheln. Gleiche Breite und gleiche Zentrierung bringen
   beide in eine Flucht. Greift nur, wo unser Container daneben liegt. */


/* ===========================================================================
   PFLICHTFELDER: STERN AN DER PFLICHT, KEIN "(optional)"
   ---------------------------------------------------------------------------
   Das theme hängt "(optional)" bedingungslos an JEDE Beschriftung
   (Templates/Forms/Base/Partials/Field/Field.html) und blendet es nur bei
   [required] per CSS wieder aus. Das ergab einen Mischzustand: die meisten
   Felder trugen gar keinen Zusatz, genau eine Gruppe ein Sternchen, und eine
   Legende gab es nirgends - ein Sternchen ohne Erklärung in einem Formular,
   in dem sonst keines vorkommt.

   Entscheidung Schultheiß, 23.09.2026: Stern an der Pflicht, "(optional)"
   entfällt vollständig.

   Der Selektor folgt dem Aufbau des themes: das Feld steht VOR
   .input-background, die Beschriftung darin.
   =========================================================================== */
/* ACHTUNG, gemessen am 23.09.2026: .serviceanfrage taugt hier NICHT als Anker.
   Das <div class="serviceanfrage"> wird je Baustein einzeln ausgegeben (jedes
   Adapter-Partial setzt eines), die Felder des themes liegen als GESCHWISTER
   daneben - nicht darin. Regeln unter .serviceanfrage erreichen sie deshalb
   prinzipiell nie. Der engste echte gemeinsame Rahmen ist das Formular selbst;
   die Präfix-Form ist nötig, weil TYPO3 die UID anhängt (…Neu-22973). */
form[id^="ArmstarkServiceanfrageNeu"] .optional { display: none !important; }

form[id^="ArmstarkServiceanfrageNeu"] .form-group .input :is(input, select, textarea)[required] + .input-background .control-label::after {
  content: " *";
  color: var(--red);
  font-weight: 700;
}

/* Unsere eigenen Gruppen (Kacheln, Chips) bringen ihre Beschriftung als
   <legend> mit - dort setzt das Partial den Stern selbst, weil eine Legende
   kein zugehöriges [required]-Feld als Geschwister hat. */
.serviceanfrage .pflicht-stern {
  color: var(--red);
  font-weight: 700;
}

/* Die Erklärung dazu, einmal pro Schritt über der ersten Gruppe. */
.serviceanfrage .pflicht-legende {
  margin: 0 0 var(--s4);
  font-size: var(--fs-help);
  color: var(--grey);
}


/* ===========================================================================
   §13  SCHRIFTGRÖSSEN IM THEME-GERENDERTEN TEIL DES FORMULARS
   ---------------------------------------------------------------------------
   Gemessen am 23.09.2026: Eingabefeld 14,4px, Bemerkung darunter 18px – die
   Hilfe war größer als das, was der Kunde tippt. Ursache: Die normalen Felder
   rendert nicht unsere Extension, sondern das theme
   (theme/…/Forms/Base/Partials/Field/Field.html) mit dieser Struktur:

       div.form-group > div.input > (input|select|textarea)
                                  + div.input-background > label.control-label
       div.form-group > div.help-block > span          (Beschreibungstext)
       fieldset.form-element-fieldset > legend         (Abschnittsüberschrift)

   Unsere Klassen .feldgruppe__label und .feldgruppe__hilfe kommen darin gar
   nicht vor – alle darauf gebauten Regeln liefen ins Leere.

   Warum der Anker hier die Form-ID ist und nicht .serviceanfrage: Unsere
   eigenen Bausteine (Kacheln, Chips, Hinweisboxen) bringen den Wrapper
   <div class="serviceanfrage"> JE BAUSTEIN mit; die theme-Felder liegen als
   Geschwister DANEBEN, nicht darin. .serviceanfrage ist also kein gemeinsamer
   Vorfahr und kann diese Felder prinzipiell nicht erreichen. Die Form-ID ist
   der engste vorhandene Rahmen und hält die Regeln genauso strikt auf DIESES
   Formular begrenzt – Suche, Kontaktformular und Händlersuche bleiben
   unberührt. Der Präfix-Vergleich ist nötig, weil TYPO3 an die ID die UID des
   Inhaltselements hängt (ArmstarkServiceanfrageNeu-22973).
   =========================================================================== */

/* Bemerkung unter dem Feld: Das theme gibt .help-block gar keine Größe mit,
   sie erbte damit die 18px des Fließtextes und drängte sich vor die Eingabe.
   Fehlermeldungen sind bewusst ausgenommen – .error.help-block trägt das theme
   rot und in eigener Größe, das ist eine Warnung und keine Nebeninfo. */
form[id^="ArmstarkServiceanfrageNeu"] .form-group .help-block:not(.error){
  margin:var(--ff-help-gap) 0 0;
  font-size:var(--fs-help);
  line-height:1.45;
  color:var(--grey);
}

/* Abschnittsüberschriften auf die H3-Stufe der Website. Das theme gibt der
   <legend> nur einen Außenabstand mit, sie erbte 18px/400 in Grau – damit war
   der Hauptabschnitt schwächer als die kleinen Gruppenlabels (12,5px/700) IN
   ihm und die Treppe H1 > H2 > Abschnitt stand auf dem Kopf. H1 und H2
   bleiben unangetastet, die teilt sich das Formular mit der ganzen Website.
   Der eigene Außenabstand ersetzt den des themes, der in em der Legende
   gerechnet ist und beim Vergrößern sonst mitwandert. */
form[id^="ArmstarkServiceanfrageNeu"] fieldset.form-element-fieldset > legend{
  font-size:var(--fs-h3);
  font-weight:700;
  line-height:1.25;
  color:var(--ink);
  margin:0 0 var(--ff-legend-gap);
}


/* ===========================================================================
   FRAGE ÜBER DEM FELD - FEST, IMMER SICHTBAR UND IM NORMALEN FLUSS
   ---------------------------------------------------------------------------
   Vorgabe Meindl, 23.09.2026: "Die Frage steht klar formuliert und dauerhaft
   lesbar ÜBER dem Antwortfeld. Darunter das Antwortfeld." Das Formular soll
   jemand bedienen können, der 80 ist - eine Beschriftung, die im Feld liegt,
   beim Tippen wandert und schrumpft, ist dafür untauglich.

   ERSTE FASSUNG (verworfen): Das Label blieb absolut positioniert und wurde
   mit bottom: calc(100% + 6px) über den Feldkasten gehoben. Absolut heißt:
   es nimmt keinen Platz ein. Solange die Frage 13,5px klein und einzeilig war,
   trug der margin-top von 32px das noch. Bei den damals gesetzten 20px war
   ein zweizeiliges Label 54px hoch und ragte in das, was darüber steht.
   (Der Wert steht seit 24.09.2026 auf 18px - an der Rechnung ändert das
   nichts, ein zweizeiliges Label ist dann 49px hoch statt 54px.)
   Gemessen am 23.09.2026 an "Fehlermeldung oder Code am Display": Label
   beginnt bei y 1170, das vorhergehende Feld endet bei y 1180 - 10px
   Überlappung. Ein größerer margin-top ist keine Lösung, weil er dann
   auch bei einzeiligen Labels wirkt und dort 30px Leere erzeugt: der Abstand
   hängt an der Zeilenzahl, also muss das Label selbst Platz beanspruchen.

   WARUM DAS JETZT OHNE SCHADEN GEHT - am 23.09.2026 in base/forms.css des
   themes nachgelesen statt geraten. Der sichtbare Feldkasten besteht aus drei
   Teilen, die alle dieselbe Fläche belegen:

     .form-group .input            position:relative; display:block;
                                   background:weiss; border-radius:4px
     .form-group .input input|select|textarea
                                   display:block; width:100%;
                                   padding:14px 22px;
                                   min-height:calc(1.5em + 28px) = 52px;
                                   background:transparent; border:0
     .form-group .input .input-background
                                   position:absolute; top/left:0; 100% x 100%;
                                   border-radius:4px;
                                   box-shadow:inset 0 0 0 1px  <- DIE RAHMENLINIE

   Der Rahmen liegt also auf einem absolut ausgelegten Element, das das
   Eingabefeld deckungsgleich überzieht - und die Beschriftung sitzt DARIN.
   Das war der Grund der Warnung: wer .input-background verschiebt oder
   polstert, löscht den Rahmen.

   Deckungsgleich heißt aber auch: Rahmen, Fläche und Radius lassen sich
   1:1 auf das Eingabeelement selbst umhängen - es ist bereits width:100%,
   hat die Polsterung und die Mindesthöhe. Danach wird .input-background
   nicht mehr für den Rahmen gebraucht und darf display:contents werden;
   dann fällt seine Box weg, und die Beschriftung wird ein normales
   Flusselement in .input. Mit flex-direction:column und order:-1 steht sie
   über dem Feld und nimmt ihre echte Höhe ein - ein-, zwei- oder
   dreizeilig, völlig gleich.
   =========================================================================== */

/* Abstand von einem Feld zum nächsten. Er kann jetzt bei 32px bleiben, weil
   die Beschriftung ihren Platz selbst mitbringt und ihn nicht mehr aufzehrt. */
form[id^="ArmstarkServiceanfrageNeu"] .form-group {
  margin-top: var(--ff-field-gap);
}

/* .input trägt nichts Sichtbares mehr, sondern stapelt nur noch Frage und
   Feld. Fläche und Radius sind an das Eingabeelement gewandert. */
form[id^="ArmstarkServiceanfrageNeu"] .form-group .input {
  display: flex;
  flex-direction: column;
  background: none;
  border-radius: 0;
}

/* Die Hülle der Beschriftung löst sich auf - ihre Box wird nicht mehr
   gebraucht, seit der Rahmen am Eingabeelement hängt. */
form[id^="ArmstarkServiceanfrageNeu"] .form-group .input .input-background {
  display: contents;
}

/* Rahmen, Fläche und Radius, wie sie vorher .input und .input-background
   gemeinsam ergaben - jetzt auf dem Eingabeelement, also genau so breit wie
   das Feld selbst. --border-ui statt der Theme-Farbe: 3,6:1 auf Weiß und
   damit WCAG 1.4.11 für Bedienelement-Rahmen. */
form[id^="ArmstarkServiceanfrageNeu"] .form-group .input :is(input, select, textarea) {
  background-color: var(--white);
  border-radius: 4px;
  box-shadow: inset 0 0 0 1px var(--border-ui);
  /* Eingabe nie unter 16px: darunter zoomt iOS beim Antippen in die Seite
     hinein und der Kunde muss nach jedem Feld von Hand herauszoomen. Das
     theme setzt .8em (=14,4px) und wiederholt das in seinem Breakpoint ab
     64em - der Attribut-Anker hebt uns über beide, ohne !important. */
  font-size: var(--fs-input);
  /* Das theme blendet die Felder aus (opacity:0), bis sie Fokus haben oder
     gefüllt sind. Da die Frage jetzt dauerhaft über dem Feld steht, muss
     das Feld selbst von Anfang an sichtbar sein. */
  opacity: 1;
}

/* Die Rückmeldung beim Hineinklicken lag ebenfalls auf .input-background
   (inset 0 0 0 2px). Sie zieht mit um, in CI-Rot statt der Theme-Farbe. */
form[id^="ArmstarkServiceanfrageNeu"] .form-group .input :is(input, select, textarea):focus {
  box-shadow: inset 0 0 0 2px var(--red);
}

/* Der Fehlerfall färbte Fläche und Rahmen von .input-background. Auch das
   zieht auf das Eingabeelement um, sonst fällt die Fehlermarkierung weg. */
form[id^="ArmstarkServiceanfrageNeu"] .form-group.-error .input :is(input, select, textarea),
form[id^="ArmstarkServiceanfrageNeu"] .form-group.hat-fehler .input :is(input, select, textarea) {
  box-shadow: inset 0 0 0 1px var(--red);
}

/* Die Frage selbst: erstes Element im Stapel, im Fluss, mit echter Höhe.
   position:static hebt die absolute Lage des themes auf; transform:none ist
   nötig, weil das theme für :focus und .-filled ein
   translateY(-50%) scale(.75) setzt - das wirkt auch auf ein statisches
   Element und würde die Beschriftung beim Hineinklicken zusammenschrumpfen.
   pointer-events:auto, weil .input-background pointer-events:none vererbt und
   ein Klick auf die Frage sonst nicht mehr ins Feld springt. */
form[id^="ArmstarkServiceanfrageNeu"] .form-group .input .input-background label,
form[id^="ArmstarkServiceanfrageNeu"] .form-group .input .input-background > label {
  order: -1;
  position: static;
  transform: none;
  display: block;
  margin: 0 0 var(--ff-label-gap);
  padding: 0;
  max-width: none;
  white-space: normal;          /* lange Fragen dürfen umbrechen */
  overflow: visible;
  text-overflow: clip;
  background: none;
  box-shadow: none;
  pointer-events: auto;
  font-size: var(--fs-label);
  font-weight: 700;
  line-height: 1.35;
  color: var(--ink);
}

/* Dieselben Werte noch einmal für Fokus und gefülltes Feld: das theme hat
   dafür eigene, spezifischere Regeln (top:0, translateY(-50%) scale(.75),
   Farbwechsel). Ohne Gegenregel hüpft und schrumpft die Beschriftung, sobald
   jemand ins Feld klickt - genau das Wandern, das hier nicht gewollt ist. */
form[id^="ArmstarkServiceanfrageNeu"] .form-group .input :is(input, select, textarea):focus + .input-background > label,
form[id^="ArmstarkServiceanfrageNeu"] .form-group .input :is(input, select, textarea).-filled + .input-background > label,
form[id^="ArmstarkServiceanfrageNeu"] .form-group .input :is(input, select, textarea):focus + .input-background label,
form[id^="ArmstarkServiceanfrageNeu"] .form-group .input :is(input, select, textarea).-filled + .input-background label {
  position: static;
  top: auto;
  transform: none;
  font-size: var(--fs-label);
  font-weight: 700;
  line-height: 1.35;
  color: var(--ink);
  background: none;
  box-shadow: none;
}

/* Im Fehlerfall färbt das theme die Beschriftung und setzt einen Schatten,
   der zur alten Lage im Kasten gehörte. Farbe ja, Schatten nein. */
form[id^="ArmstarkServiceanfrageNeu"] .form-group.-error .input .input-background label {
  box-shadow: none;
  background: none;
}

/* Der Pfeil der Auswahlliste saß als ::after auf .form-group.selectbox, auf
   halber Höhe der GANZEN Gruppe. Das ging, solange die Gruppe nur aus dem
   Feld bestand. Jetzt stehen Frage, Feld und Bemerkung darin - die Mitte der
   Gruppe liegt nicht mehr in der Mitte des Feldes. Der Pfeil wandert deshalb
   auf .input und rechnet von dessen Unterkante: .input endet mit dem Feld,
   und das Feld ist min-height 52px hoch, also sitzt die Pfeilmitte 26px
   darüber. Das Zeichen ist das des themes (icomoon \e901). */
form[id^="ArmstarkServiceanfrageNeu"] .form-group.selectbox::after {
  content: none;
}
form[id^="ArmstarkServiceanfrageNeu"] .form-group.selectbox .input {
  position: relative;
}
form[id^="ArmstarkServiceanfrageNeu"] .form-group.selectbox .input::after {
  position: absolute;
  top: auto;
  bottom: 26px;
  right: 22px;
  transform: translateY(50%);
  content: "\e901";
  font-family: icomoon;
  speak: none;
  font-style: normal;
  font-weight: 400;
  font-variant: normal;
  text-transform: none;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  color: var(--ink);
  pointer-events: none;
  font-size: var(--fs-help);
}


/* ---------------------------------------------------------------------------
   ALLE FELDER GLEICH BREIT
   Bis zum 24.09.2026 war die Breite gestaffelt: 14ch für Kundennummer, PLZ und
   Baujahr, 28ch für Telefon und Belegnummern, 44ch für Name und E-Mail. Der
   Gedanke war, dass die Breite ansagt, wie viel Eingabe erwartet wird – ein
   Feld für sechs Ziffern sollte nicht über die halbe Seite laufen.

   Entscheidung Schultheiß/Salamon vom 24.09.2026 dagegen: „So sieht es dann
   für alle gleich aus … es müsste so lang sein wie Vor- und Nachname oder
   E-Mail. Ja, so lange machen wir jetzt auch die Kundennummer und die
   Telefonnummer, dann gibt es nicht dieses Gezappel in der Länge."
   Die Staffelung kostete also mehr an Ruhe, als sie an Führung brachte: eine
   Kante links, aber drei verschiedene Kanten rechts.

   Ist jetzt: EINE Obergrenze für alle, 44ch – das Maß, das vorher schon für
   Vor- und Nachname und E-Mail galt. Weiterhin in ch, damit sie der
   Schriftgröße folgt.

   AM 24.09.2026 AM AUSGELIEFERTEN HTML NACHGEMESSEN (Schritt 2 „Störung", über
   docker exec + curl geholt), weil die Felder inzwischen paarweise
   nebeneinander liegen und die Frage war, ob 44ch in einer halben Spalte
   überhaupt noch greift:
     - Die Felder stehen im 12-Spalten-Raster des Themes
       (.field__wrap.col-wrapper), der Container ist
       .-max-width-limited-b0 = höchstens 1360px breit.
     - Eine halbe Spalte (grid-b0-1-7) misst Containerbreite/2 minus halber
       Spaltenabstand, am Desktop also rund 660px.
     - 44ch sind bei --fs-input 16px in Helvetica/Arial rund 390px.
   Die Grenze greift in der halben Spalte also wirklich. Erst wenn der Container
   unter etwa 800px fällt (Fenster rund 930px), ist die halbe Spalte von sich
   aus schmaler als 44ch – in diesem schmalen Band läuft die Regel leer, ohne
   dass es auffällt, weil dann ohnehin alle Felder gleich breit sind. Ab 720px
   abwärts stellt das Theme-Raster die Paare wieder untereinander.

   Der <select> für das Baujahr ist bewusst mit aufgenommen. Die alte Regel
   hing an input[name*="baujahr"] und hat ihn NIE erwischt: das Baujahr ist im
   ausgelieferten HTML ein <select>, kein <input>. Sie war von Anfang an
   wirkungslos – ohne den <select> hätte das Gezappel genau dort weitergelebt.

   Die <textarea> für die Problembeschreibung bleibt bewusst ausgenommen: dort
   sagt die Höhe, wie viel erwartet wird, nicht die Breite.

   Die namensweise Aufzählung ist ersatzlos entfallen. Sie musste bei jedem
   neuen Feld gepflegt werden, und ein vergessener Name hieß: wieder ein Feld,
   das aus der Reihe fällt.
   --------------------------------------------------------------------------- */
form[id^="ArmstarkServiceanfrageNeu"] .form-group .input input,
form[id^="ArmstarkServiceanfrageNeu"] .form-group .input select {
  max-width: 44ch;
}


/* ---------------------------------------------------------------------------
   KEIN ABSTAND UNTER DEN FELDGRUPPEN
   Das Theme gibt jeder Feldgruppe einen Abstand nach unten
   (base/forms.css: .form .field__wrap.col-wrapper, form .field__wrap.col-wrapper
   { margin-bottom: 1em }). Der kam zu dem Abstand hinzu, den wir selbst setzen,
   und addierte sich auf 48px, wo 32px gemeint waren.

   Entscheidung Schultheiß/Salamon vom 24.09.2026, Wortlaut zu dieser Regel:
   „besser überall" – also nicht nur bei den beiden Haken am Ende, sondern
   durchgehend 0. Damit entfällt jede Ausnahme, und die beiden Haken-Zeilen
   (Zustimmung und Kopie) schließen unten wieder zu dem einen Kasten zusammen,
   als der sie gemeint sind – die 16px standen bisher genau zwischen den beiden
   Rahmenhälften.

   AM 24.09.2026 NACHGEMESSEN, was den Abstand danach noch trägt: Jedes Feld
   liegt in einem eigenen .field__wrap.col-wrapper, darin ein .col als
   Raster-Element. Raster-Elemente bilden einen eigenen Formatierungskontext,
   der margin-top von 32px (--ff-field-gap, Regel .form-group weiter oben)
   fällt also nicht heraus, sondern bleibt wirksam. Feld zu Feld sind es damit
   32px statt vorher 48px. Die Felder kleben nicht aneinander.

   Welche der beiden Selektorformen zieht: das <form> trägt im ausgelieferten
   HTML gar kein class-Attribut, und kein Vorfahre führt die Klasse .form
   (vorhanden sind nur .form-group, .form-element, .module-search-form – andere
   Klassennamen). Wirksam ist also allein die Element-Form `form ...`. Die
   .form-Variante steht nur mit, weil sie im Theme so steht und das Formular
   später in einem .form-Container landen kann.

   Auf der Seite gemessen: 13 .field__wrap.col-wrapper, alle im
   Serviceanfrage-Formular, keiner außerhalb. Die Regel ist bewusst nicht auf
   unsere Formular-Id eingeengt – so steht sie als glatte Gegenregel zum Theme
   da –, trifft auf dieser Seite aber ausschließlich unsere Felder.
   --------------------------------------------------------------------------- */
.form .field__wrap.col-wrapper,
form .field__wrap.col-wrapper {
  margin-bottom: 0em;
}


/* ---------------------------------------------------------------------------
   ZUSTIMMUNG UND KOPIE GEHÖREN ZUSAMMEN
   Beide sind Kästchen zum Ankreuzen, beide betreffen dasselbe: was nach dem
   Absenden passiert. Gemessen standen sie 104 px auseinander, in zwei
   verschiedenen Gruppen - das sah aus wie zwei unabhängige Abschnitte. Sie
   werden als EIN umschlossener Block gesetzt: ein durchgehender Rahmen, keine
   Fläche. Einen gemeinsamen Elternteil gibt es nicht - das theme legt jede
   Zeile in ein eigenes .field__wrap -, der Rahmen entsteht deshalb weiterhin
   aus oberer und unterer Hälfte.

   AM 23.09.2026 AM AUSGELIEFERTEN HTML NACHGEMESSEN (Schritt 2 des Formulars,
   über docker exec + curl geholt). Der Baum sieht anders aus als bisher
   angenommen:

     div.field__wrap.col-wrapper > div.col
       div.form-group.form-checkbox            <- ZUSTIMMUNG
         div.checkbox > fieldset.checkbox-group > label
     div.field__wrap.col-wrapper > div.col
       fieldset.form-group
         div.form-group.form-checkbox          <- KOPIE
           div.checkbox > label

   BEIDE Zeilen tragen .form-group.form-checkbox, und .field__wrap sitzt an
   einem ganz anderen Element. Das bisherige :not(.field__wrap) konnte die
   beiden deshalb nie auseinanderhalten: die untere Rahmenhälfte samt unterem
   Radius UND der padding-top von 20px landeten auf BEIDEN Zeilen. Daher der
   schiefe Sitz und die doppelte Kante mitten im Kasten.

   Unterschieden wird jetzt an dem, was die Zeilen wirklich unterscheidet: nur
   die Zustimmung enthält ein fieldset.checkbox-group.

   Innenabstände bewusst symmetrisch gerechnet:
     Rahmen oben     -> Text Zustimmung   16px  (--s4)
     Text Zustimmung -> Text Kopie        16px  (8 unten + 8 oben, 2x --s2)
     Text Kopie      -> Rahmen unten      16px  (--s4)
   Jede Zeile steht damit gleich weit von der Kante, und der Abstand der Zeilen
   untereinander ist genauso groß wie der Rand - ein ruhiger Kasten statt
   zweier zusammengeschobener Zeilen.
   --------------------------------------------------------------------------- */

/* Alles, was ZWISCHEN den beiden Zeilen liegt, trägt nichts mehr. Das
   Hüllen-fieldset der Kopie holt sich sonst die 32px margin-top der
   allgemeinen .form-group-Regel (Block "FRAGE ÜBER DEM FELD") und reißt den
   Kasten in der Mitte auseinander; ein fieldset bringt zudem den
   Browser-Standardrahmen und dessen Polster mit. */
form[id^="ArmstarkServiceanfrageNeu"] fieldset.form-group:has(> .form-group.form-checkbox),
form[id^="ArmstarkServiceanfrageNeu"] .form-group.form-checkbox > .checkbox,
form[id^="ArmstarkServiceanfrageNeu"] .checkbox-group {
  margin: 0;
  padding: 0;
  border: 0;
  background: none;
}

/* Gemeinsam für beide Zeilen: seitlicher Innenabstand und die Kante. Keine
   Fläche - der Block soll allein durch die Linie zusammenhalten. */
form[id^="ArmstarkServiceanfrageNeu"] .form-group.form-checkbox {
  border: 1px solid var(--grey-mid);
  padding-left: var(--s4);
  padding-right: var(--s4);
  background: transparent;
}

/* Obere Hälfte - die Zustimmung, erkennbar am fieldset.checkbox-group darin. */
form[id^="ArmstarkServiceanfrageNeu"] .form-group.form-checkbox:has(.checkbox-group) {
  margin: var(--s6) 0 0;
  padding-top: var(--s4);
  padding-bottom: var(--s2);
  border-bottom: 0;
  border-radius: var(--radius) var(--radius) 0 0;
}

/* Untere Hälfte - die Kopie. */
form[id^="ArmstarkServiceanfrageNeu"] .form-group.form-checkbox:not(:has(.checkbox-group)) {
  margin: 0 0 var(--s6);
  padding-top: var(--s2);
  padding-bottom: var(--s4);
  border-top: 0;
  border-radius: 0 0 var(--radius) var(--radius);
}

/* Die Zeilen selbst dürfen ruhig dicht stehen - es sind zwei Sätze. Das
   margin:0 nimmt dem label den Außenabstand, den das theme ihm mitgibt;
   sonst wäre die gerechnete Symmetrie wieder dahin. */
form[id^="ArmstarkServiceanfrageNeu"] .checkbox-group label,
form[id^="ArmstarkServiceanfrageNeu"] .form-group.form-checkbox label {
  font-size: var(--fs-help);
  line-height: 1.45;
  margin: 0;
}

/* Das angekreuzte Kästchen in CI-Rot.
   Gemessen am 23.09.2026: das theme füllt es mit rgb(111,111,111), seiner
   --color-text (base/forms.css, Regel .checkbox.-checked label.form-check-label
   :before). Im selben Formular ist die gewählte Produktkachel rot - ein graues
   Häkchen daneben liest sich wie "nicht aktiv". Gezeichnet wird das Kästchen
   über ::before (18px, Radius 4px); die echte Checkbox steht absichtlich auf
   opacity 0 und wird NICHT angefasst. Der Attribut-Anker hebt uns über die
   Theme-Regel, !important ist dafür nicht nötig. */
form[id^="ArmstarkServiceanfrageNeu"] .form-group .checkbox.-checked label.form-check-label::before {
  background-color: var(--red);
  border-color: var(--red);
}


/* ---------------------------------------------------------------------------
   ABSCHNITTE BRAUCHEN LUFT - UND NUR ZWEI EBENEN
   Gemessen am 23.09.2026: sämtliche Legenden standen auf margin-top 0, die
   Abschnittsüberschriften klebten also an dem, was darüber endete. Dazu drei
   verschiedene Größen (22,5 / 13,5 / 12,5 px) für zwei inhaltliche Ebenen.

   Jetzt: Abschnitt (22,5) mit Luft davor, Frage-Gruppe auf derselben Stufe wie
   eine Feldbeschriftung - denn genau das ist sie.
   --------------------------------------------------------------------------- */
form[id^="ArmstarkServiceanfrageNeu"] fieldset > legend {
  margin-top: var(--s7);
}

/* Der erste Abschnitt einer Seite braucht die Luft nicht - darüber steht
   nichts, wovon er sich absetzen müsste. */
form[id^="ArmstarkServiceanfrageNeu"] fieldset:first-of-type > legend {
  margin-top: 0;
}

/* Unsere Kachel- und Chip-Gruppen sind Fragen, keine Abschnitte: gleiche
   Größe wie eine Feldbeschriftung, keine Versalien, kein Sperrsatz. */
form[id^="ArmstarkServiceanfrageNeu"] .anliegen-auswahl__legende {
  font-size: var(--fs-label);
  font-weight: 700;
  line-height: 1.35;
  color: var(--ink);
  text-transform: none;
  letter-spacing: normal;
  margin-bottom: var(--s3);
}


/* ===========================================================================
   DAS KÄSTCHEN UNTER DER KUNDENNUMMER
   ---------------------------------------------------------------------------
   Seit 14.10.2026 steht „Keine Kundennummer zur Hand" bei der Kundennummer
   statt schräg darunter (Schultheiß: „Das Kästchen gehört ja zur
   Kundennummer"). Vorher paarte das Raster es mit der E-Mail-Adresse, weil es
   in der Feldreihenfolge hinter dem Namen stand.

   Es sitzt dabei IN der Spalte des Kundennummernfeldes, nicht daneben: EXT:form
   rendert ein Kästchen mit Beschriftung als fieldset, und das landet im
   form-group des Feldes darüber - die rechte Rasterspalte aus der
   Formulardefinition erscheint im HTML gar nicht. Das ist hier richtig so, denn
   Feld und Kästchen gehören zusammen.

   Zwei Regeln des Zustimmungskastens ganz unten griffen trotzdem: Das Kästchen
   bekam dessen Rahmen, und von der Regel für die untere Kastenhälfte
   zusätzlich border-top: 0 mit unten runden Ecken - Kante an drei Seiten, oben
   keine. Hier gilt: gar kein Rahmen, und nur der Abstand, der es an das Feld
   darüber bindet.
   =========================================================================== */
form[id^="ArmstarkServiceanfrageNeu"] .form-group.form-checkbox:has([id*="kundennummer_unbekannt"]) {
  border: 0;
  border-radius: 0;
  margin: 0;
  /* Derselbe Abstand, den der Hilfetext zum Feld hält - das Kästchen schließt
     an diese Zeile an und bildet mit ihr den Fuß des Feldes. */
  padding: var(--ff-help-gap) 0 0;
}


/* ===========================================================================
   AUF DEM TELEFON UNTEREINANDER
   ---------------------------------------------------------------------------
   Die halben Spalten (grid-b0-1-7 / grid-b0-7-13) gelten ab dem Basis-
   Breakpoint - also auch auf dem Handy. PLZ und Ort ständen dort in zwei
   Spalten von je rund 170 px: die PLZ ginge gerade noch, der Ortsname wird
   abgeschnitten. Unterhalb von 720 px deshalb wieder volle Breite,
   untereinander.
   =========================================================================== */
@media (max-width: 720px) {
  form[id^="ArmstarkServiceanfrageNeu"] .col-wrapper > [class*="grid-b0-1-7"],
  form[id^="ArmstarkServiceanfrageNeu"] .col-wrapper > [class*="grid-b0-7-13"] {
    grid-column: 1 / 13;
  }

  /* Hier stand bis zum 24.09.2026 eine Ausnahme: fünf namentlich genannte
     Felder durften auf dem Telefon auf volle Breite, die reinen Zahlenfelder
     blieben schmal. Sie ist mit der Staffelung entfallen – sie hätte das
     Gezappel, das oben abgeschafft wurde, auf schmalen Geräten wieder
     eingeführt. Unter 720px ist die Spalte ohnehin schmaler als die 44ch
     (rund 390px), die Obergrenze läuft dort also von selbst leer. */

  /* Abstände zwischen den Abschnitten kleiner - 48 px sind auf einem Telefon
     ein halber Bildschirm. */
  form[id^="ArmstarkServiceanfrageNeu"] fieldset > legend {
    margin-top: var(--s5);
  }
}

/* ---------------------------------------------------------------------------
   KEINE SYMBOLE AUF DEN KACHELN
   Das weiße Kästchen mit dem Symbol saß mittig auf der Bildfläche. Solange dort
   Platzhalter lagen, war es die einzige Aussage der Kachel; seit dem 23.09.2026
   tragen die Kacheln echte Fotos, und das Symbol legt sich nur noch darüber.

   23.09.2026: zuerst nur bei den PRODUKTkacheln ausgeblendet.
   24.09.2026, Schultheiß und Salamon: „Wir wollen keine Icons. Diese
   Kachel-Icons generell, die dem ersten Schritt, die müssen raus für alle acht.
   Dann ist es auch einheitlich." Damit fallen auch die Symbole der
   ANLIEGEN-Kacheln auf Schritt 1 weg. Beide stehen jetzt in einer Regel, weil
   es dieselbe Entscheidung ist.

   Die Auswahl bleibt erkennbar: die gewählte Kachel bekommt roten Rahmen,
   roten Grundton und einen Schatten (Regeln :has(:checked) weiter oben). Das
   Symbol war eine zweite, jetzt entbehrliche Rückmeldung.

   ZWEIMAL AM AUSGELIEFERTEN HTML NACHGEMESSEN (Schritt 1, über docker exec +
   curl), weil sich der Befund zwischendurch geändert hat:
     vormittags   8 Kacheln mit span.anliegen-kachel__icon > svg > use
     nach Einbau  0 Treffer – das Partial AnliegenKacheln.html gibt die
                  Symbole nicht mehr aus (gleiche Entscheidung, parallel
                  umgesetzt).
   Für die ANLIEGEN-Kacheln steht hier deshalb keine Regel: es gäbe nichts
   mehr auszublenden, und eine Regel auf ein Element, das es nicht gibt, liest
   sich beim nächsten Mal wie eine wirksame. Die Gestaltung der Symbole ist
   oben in §8 gelöscht.
   Für die PRODUKTkacheln bleibt die Regel: dort steht das Markup noch im
   Partial ProduktKacheln.html, gemessen am 24.09.2026 in Schritt 2.
   --------------------------------------------------------------------------- */
form[id^="ArmstarkServiceanfrageNeu"] .produkt-kachel__icon {
  display: none;
}

/* ---------------------------------------------------------------------------
   SONSTIGES IST EIN SYMBOL, KEIN FOTO
   Die sieben anderen Produktkacheln tragen Aufnahmen; für "Sonstiges" gibt es
   naturgemäß kein Motiv. Dort steht deshalb ein Zeichen auf der ruhigen
   Grundfläche. Der dunkle Verlauf, der Fotos unten Tiefe gibt, wirkt darauf
   wie Schmutz - für diese eine Kachel entfällt er.
   --------------------------------------------------------------------------- */
form[id^="ArmstarkServiceanfrageNeu"] .produkt-kachel--sonstiges .produkt-kachel__bild::after {
  display: none;
}






/* ===========================================================================
   BESTÄTIGUNG NACH DEM ABSENDEN
   ---------------------------------------------------------------------------
   Meindl am 23.09.2026 nach einem Testlauf: "nach dem Absenden hüpft die
   Position nach oben. keine Bestätigung dass abfrage abgesendet wurde".

   Nachgemessen: Die Bestätigung kommt vom Confirmation-Finisher des
   Form-Frameworks. Dessen Vorlage
   (vendor/typo3/cms-form/.../Finishers/Confirmation/Confirmation.html) gibt
   genau das aus:

       <div id="{form.identifier}">  Vielen Dank für Ihre Anfrage.
                                     Ihre Vorgangsnummer lautet 17830.
                                     Wir melden uns bei Ihnen.  </div>

   Ein nacktes div ohne jede Klasse, der Text als reiner Textknoten darin.
   Ergebnis auf dem Schirm: eine kleine graue Fließtextzeile, optisch nicht
   von normalem Seitentext zu unterscheiden. Wer fünf Minuten ein Formular
   ausgefüllt und ein Foto hochgeladen hat, sieht nach dem Klick eine Seite,
   die aussieht wie vorher - und sendet im Zweifel ein zweites Mal ab. Das
   kostet den Kundendienst doppelte Tickets.

   Anker ist deshalb die id, denn eine Klasse gibt es nicht. Die Präfix-Form
   ist nötig, weil TYPO3 die UID des Inhaltselements anhängt
   (ArmstarkServiceanfrageNeu-22973). div[id^=...] statt nur [id^=...]:
   dasselbe Präfix trägt auch das <form> der Schritte davor.

   KEINE GRÜNE FARBE: Die Datei führt keine, und erfunden wird hier nichts.
   Die Erfolgsmeldung trägt stattdessen über Form, was sie über Farbe nicht
   sagen kann - eine eigene Fläche, eine breite CI-rote Kante links, ein
   großes Hakenzeichen und Schriftgröße auf H3-Stufe. Damit ist sie als
   Ergebnis erkennbar und nicht mehr als Fließtext lesbar.
   =========================================================================== */
div[id^="ArmstarkServiceanfrageNeu"] {
  position: relative;
  max-width: var(--max-form);
  margin: var(--s6) 0 var(--s7);
  /* links Platz für das Hakenzeichen, das absolut darüber liegt */
  padding: var(--s5) var(--s5) var(--s5) var(--s8);
  background: var(--grey-light);
  border: 1px solid var(--grey-mid);
  border-left: var(--s1) solid var(--red);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-s);
  font-family: var(--font);
  font-size: var(--fs-h3);
  line-height: 1.45;
  color: var(--ink);
}

/* Das Zeichen liegt absolut, damit es den mehrzeiligen Text nicht einrückt.
   Rot ist hier der CI-Akzent, kein Warnton: Fehler zeigt dieses Formular als
   roten TEXT und roten Feldrahmen, nie als Fläche mit Haken. */
div[id^="ArmstarkServiceanfrageNeu"]::before {
  content: "\2713";
  position: absolute;
  top: var(--s5);
  left: var(--s5);
  font-size: var(--fs-h1);
  line-height: 1;
  font-weight: 700;
  color: var(--red);
}

/* Die Vorgangsnummer ist das Einzige, was der Kunde sich merken oder notieren
   muss. Im Quelltext steht sie als bloßer Text mitten im Satz - das Skript
   klammert sie in dieses Element ein. Ohne Skript bleibt der Satz vollständig
   lesbar, nur eben ohne Hervorhebung. */
div[id^="ArmstarkServiceanfrageNeu"] .bestaetigung__nummer {
  font-weight: 700;
  color: var(--red);
  white-space: nowrap;
}


/* ===========================================================================
   FEHLERMELDUNG AM FELD
   ---------------------------------------------------------------------------
   Meindl am 23.09.2026: "wenn ein pflichtfeld fehlt dann hupft Position hin
   und man sieht den text was fehlt: dieser sollte rot sein so was hatten wir".

   Nachgemessen am Fehlerfall (Absenden mit leeren Pflichtfeldern, einmal per
   curl gegen den Container, einmal im Browser): Das theme gibt die Meldung als
   <span class="error help-block"> im div.form-group.-error aus und färbt sie
   in base/forms.css mit seiner --color-error. Sie IST also rot - aber:

     - 11,52 px groß (Theme-Regel .64em), bei 16 px Eingabetext und 20 px
       Frage. Sie ist damit die kleinste Schrift im ganzen Formular. Eine
       Fehlermeldung, die kleiner ist als jede andere Schrift, ist keine.
     - rgb(236,16,16) - ein Fremdrot. Direkt darüber sitzt seit dem Umbau der
       Feldrahmen im CI-Rot rgb(188,34,34). Zwei verschiedene Rot übereinander
       sehen nach Zufall aus, nicht nach Absicht.

   Beide Klassen (.error und .help-block) hängen am selben Element; beide
   zusammen sind der eindeutigere Anker, weil .help-block allein auch den
   harmlosen Bemerkungstext darunter trifft.
   =========================================================================== */
form[id^="ArmstarkServiceanfrageNeu"] .form-group.-error .error.help-block,
form[id^="ArmstarkServiceanfrageNeu"] .form-group.hat-fehler .error.help-block {
  display: block;
  margin: var(--ff-help-gap) 0 0;
  font-size: var(--fs-input);
  font-weight: 700;
  line-height: 1.45;
  color: var(--red);
}

/* Und sie verschwindet, sobald der Fehler behoben ist.
   Geprüft im Theme-Skript (Assets/js/598.*.js): sobald ein Feld einen Wert
   hat, nimmt das theme die Klasse -error vom .form-group - Punkt 3 ist dort
   also schon erledigt und wird hier NICHT nachgebaut. Was fehlt, ist nur die
   Folge daraus: die Meldung selbst bleibt stehen. Das theme setzt ihr
   display:block ausschließlich UNTER .-error, ihr Grundzustand ist der eines
   <span>, also inline - und damit weiterhin sichtbar. Der Text "Bitte füllen
   Sie dieses Feld aus." stand also noch unter einem Feld, das der Kunde
   längst ausgefüllt hatte. Deshalb hier der Grundzustand: unsichtbar, und
   nur die Regel darüber holt sie im Fehlerfall zurück. */
/* 24.09.2026 nachgezogen: ".-error allein" trug nicht. Das theme-Skript nimmt
   die Klasse beim Laden von JEDEM gefüllten Feld wieder weg (598.*.js,
   function i) - nach einer serverseitigen Abweisung steht der falsche Wert aber
   noch im Feld. Die Meldung zur zweistelligen Kundennummer war damit
   unsichtbar, die zum leeren Pflichtfeld nicht. Deshalb zusätzlich unsere
   eigene Klasse "hat-fehler", die serviceanfrage.js am Dasein des
   Meldungs-Elements festmacht und beim ersten Tastendruck im Feld selbst
   wieder wegnimmt. Beide Klassen zusammen: die Meldung bleibt stehen, solange
   der Fehler besteht - und verschwindet, sobald der Kunde korrigiert. */
form[id^="ArmstarkServiceanfrageNeu"] .form-group:not(.-error):not(.hat-fehler) .error.help-block {
  display: none;
}


/* ===========================================================================
   KOPFZEILE AUF SCHRITT 2 (23.09.2026)
   ---------------------------------------------------------------------------
   Links steht, was der Kunde gewählt hat, rechts in derselben Ebene der Weg
   zurück. Vorher sagte Schritt 2 nirgends, welches Anliegen offen ist, und
   der Zurück-Knopf saß ganz unten in der Aktionsleiste.

   Nur Anordnung, keine eigene Optik: der Knopf trägt die Klassen des themes
   (btn -btn-alpha-inverted) und sieht damit genauso aus wie der untere. Alle
   Werte hier kommen aus der Abstands- und Farbskala am Kopf dieser Datei -
   nichts ist erfunden.
   =========================================================================== */
.serviceanfrage .anliegen-kopfzeile{
  display:flex;
  align-items:center;
  justify-content:space-between;
  gap:var(--s4);
  margin:0 0 var(--s3);
  padding:0 0 var(--s3);
  border-bottom:1px solid var(--grey-mid);
}
.serviceanfrage .anliegen-kopfzeile__titel{
  margin:0;
  font-size:var(--fs-h3);
  font-weight:700;
  line-height:1.2;
  color:var(--ink);
}
/* Der Knopf darf nicht schrumpfen - die Beschriftung bleibt einzeilig, auch
   wenn der Titel lang ist. */
.serviceanfrage .anliegen-kopfzeile__zurueck{
  flex:none;
}

/* Die Zeile darunter: was als Nächstes passiert. Sie stand bisher im Modell,
   kam aber nie im HTML an (siehe Adapter Form/AnliegenKopfzeile). */
.serviceanfrage .anliegen-subline{
  margin:0 0 var(--s5);
  font-size:var(--fs-body);
  line-height:1.45;
  color:var(--grey);
}
