/* ==========================================================================
   adminFormLayout - Formularraster der Bearbeitungsformulare

   Der Bestand benutzt <table class="filterTable"> nicht fuer Daten, sondern
   als Raster fuer Formularfelder: Beschriftung links, Feld rechts, in 41 der
   51 Ansichten zweimal je Zeile (Beschriftung, Feld, Beschriftung, Feld).

   Verbreitung: 51 der 88 Ansichten, 457 x filterCellHeader / 454 x
   filterCellContent. Alle geprueften Zeilen haben hoechstens VIER Zellen -
   beim Stapeln bleibt die Lesereihenfolge deshalb von selbst korrekt:
   Beschriftung, ihr Feld, naechste Beschriftung, ihr Feld.

   Diese Datei aendert kein Markup.

   ACHTUNG: Alle Angaben in PIXELN, nicht in rem. screen.css setzt die
   Wurzel-Schriftgroesse auf 9pt = 12px; jede rem-Angabe waere hier also ein
   Viertel kleiner als erwartet (55rem = 660px statt 880px).

   Spezifitaet: layout.css - wo frueher .filterTable, .filterCellHeader und
   .filterContainer definiert waren - ist geloescht. Zu diesen Klassen gibt
   es im Bestand KEINE Regel mehr; hier konkurriert nur noch inline style=.
   ========================================================================== */


/* ==========================================================================
   1. Der Container
   ==========================================================================
   Umgeschaltet wird nach dem Platz, den das FORMULAR hat, nicht nach der
   Fensterbreite - gleiches Muster wie .cs-liste in liste.css.

   Zwei Container mit demselben Namen, weil das Formular in zwei Tiefen
   vorkommt. Container Queries loesen immer gegen den NAECHSTEN benannten
   Vorfahren auf, damit greift automatisch der jeweils richtige:

   - .filterContainer umgibt 72 der 73 filterTable-Vorkommen. Er ist der
     tatsaechliche Platz, den ein Feldblock hat.
   - .cs-inhalt (#contentCell) faengt den Rest ab: die eine Ansicht ohne
     .filterContainer (calendar/edit-calendar-booking-ajax) und alles, was
     NEBEN den Bloecken steht - vor allem die Schaltflaechenreihe am
     Formularende.

   Geprueft, weil ein Container-Kontext zum umschliessenden Block fuer
   position:fixed werden kann: in den Views und in screen.css/admin/*.css
   steht kein position:fixed unterhalb von .cs-inhalt. Zur Laufzeit tut es
   genau eines - das Vollbild von TinyMCE im Kalender-Formular. Nachgemessen
   mit und ohne diese Datei: der Editor deckt in beiden Faellen 1440x900 ab,
   also das ganze Fenster. Kein Nebeneffekt. */
.cs-neu .cs-inhalt,
.cs-neu .filterContainer {
  container-type: inline-size;
  container-name: formular;
}


/* ==========================================================================
   2. Abschnitte als Bloecke - gilt in JEDER Breite
   ==========================================================================
   Die Formulare gliedern sich bereits ueber <h2> ("Kunden Details",
   "Tour Details", "Verursacher des Schadens"). Der zugehoerige Feldblock
   steht darunter in einem .filterContainer - der aber seit dem Wegfall von
   layout.css voellig ungestaltet war. Ueberschrift und Felder verschmolzen
   dadurch zu einer einzigen langen Kolonne (Gestaltgesetz der Naehe griff
   ins Leere). Der Block bekommt seine Flaeche zurueck. */

.cs-neu .cs-inhalt h2 {
  margin: var(--cs-abstand-5) 0 var(--cs-abstand-2);
  font-size: var(--cs-schrift-gross);
  line-height: 1.3;
}
.cs-neu .cs-inhalt h2:first-child { margin-top: 0; }

.cs-neu .filterContainer {
  margin-bottom: var(--cs-abstand-4);
  padding: var(--cs-abstand-2) var(--cs-abstand-3);
  background: var(--cs-flaeche);
  border: 1px solid var(--cs-linie);
  border-radius: var(--cs-radius);
}


/* ==========================================================================
   3. Grundlage des Rasters - gilt in JEDER Breite
   ========================================================================== */

.cs-neu table.filterTable { width: 100%; }

.cs-neu table.filterTable > tbody > tr > td,
.cs-neu table.filterTable > tr > td {
  /* Nur rechts Luft, und wenig davon: bei vier Zellen je Zeile geht jeder
     Millimeter viermal ab. Mit 12px brach die Filterleiste auf /touren bei
     1440px in eine zusaetzliche Zeile um - gemessen, deshalb 8px und rechts
     aussen nichts. */
  padding: var(--cs-abstand-1) var(--cs-abstand-2) var(--cs-abstand-1) 0;
  text-align: left;
  /* Buchungslinks und E-Mail-Adressen sind ein einziges "Wort" von ueber
     300px - ohne das schoebe eine einzige URL die ganze Zeile auf. */
  overflow-wrap: break-word;
}
.cs-neu table.filterTable > tbody > tr > td:last-child,
.cs-neu table.filterTable > tr > td:last-child { padding-right: 0; }

/* Beschriftung - eine Stimme in allen Breiten.
   Der Ausschluss ist noetig: partials/galleryupload und
   partials/tourgalleryupload missbrauchen filterCellHeader als Huelle fuer
   das komplette Upload-Widget (daher dort auch 1 Header / 0 Content). Ohne
   den Ausschluss bekaeme die ganze Ablageflaeche Beschriftungstypografie. */
.cs-neu table.filterTable td.filterCellHeader:not(:has(div, table, input, select, textarea)) {
  color: var(--cs-text-leise);
  font-size: var(--cs-schrift-klein);
  font-weight: 600;
  line-height: 1.35;
}
.cs-neu table.filterTable td.filterCellHeader:not(:has(div, table, input, select, textarea)) label {
  color: inherit;
  font-weight: inherit;
}

/* Pflichtfeldkennzeichnung.
   Das "(*)" steht heute als blanker Text IM Beschriftungstext, an 200+
   Stellen. CSS kann keinen Text auswaehlen - eine einheitliche Gestaltung
   des Zeichens selbst ist ohne Markup- oder Skriptaenderung nicht moeglich
   und wurde hier bewusst NICHT ueber einen Ratealgorithmus erzwungen.
   Was bleibt und hier passiert: die Beschriftung, in der das Zeichen steht,
   ist ueberall gleich gesetzt (Regel darueber), und fuer die spaetere
   Umstellung liegt der Haken schon bereit. Ein Umschreiben der Views kann
   dann <span class="cs-pflicht">(*)</span> setzen, ohne dass hier noch
   einmal etwas zu entscheiden waere. */
.cs-neu .cs-pflicht {
  margin-left: 2px;
  color: #b3261e;
  font-weight: 700;
  white-space: nowrap;
}

/* Felder: Hoehe, Schriftgroesse und Kastenmodell kommen aus base.css und
   gelten dort fuer die ganze Oberflaeche. Hier steht nur das Sicherheitsnetz
   fuer das Formularraster - falls eine Ansicht ein Feld ausserhalb der
   base.css-Auswahl mitbringt. 16px ist Pflicht: darunter zoomt Safari unter
   iOS beim Hineintippen die Seite auf.

   Ein Breitendeckel steht hier bewusst NICHT: diese Auswahl trifft auch die 51
   Bearbeitungsformulare, wo ein Feld ueber die ganze Zeile richtig ist. Der
   Deckel gilt nur fuer die Filterleiste, siehe "Filterfelder: Breitendeckel"
   weiter unten.

   Hier stand eine Zeit lang trotzdem max-width: min(100%, 320px) - ein Rest
   davon, dass der Deckel zuerst an dieser Stelle versucht wurde. Beim
   Zuruecknehmen wurde nur der Kommentar geaendert, nicht die Deklaration; die
   Felder ALLER Bearbeitungsformulare blieben dadurch gedeckelt. */
.cs-neu table.filterTable input:not([type=hidden]):not([type=checkbox]):not([type=radio]),
.cs-neu table.filterTable select,
.cs-neu table.filterTable textarea {
  min-height: var(--cs-ziel);
  font-size: var(--cs-schrift-feld);
  max-width: 100%;
  box-sizing: border-box;
}

/* ---- Schaltflaechen, die als <a class="button"> gebaut sind -------------
   Sechzehn Stellen im Admin: "Rechnung versenden",
   "Zahlungsbestaetigung versenden", "Gutscheinanschreiben versenden",
   "Abrechnung versenden", "zurueck zur Uebersicht".

   ZWEI Fehler, der erste ist der auffaellige:

   1. Die Symbolschrift verschlingt den Text. Die Klasse steht im Bestand als
      class="button far fa-envelope" - und `far` setzt
      font-family: "Font Awesome 5 Pro" auf das <a> SELBST. Diese Schrift
      enthaelt keine Buchstaben, also faellt der Browser fuer die Beschriftung
      auf seine Standardschrift zurueck: "Rechnung versenden" stand als
      Serifentext mitten in einer serifenlosen Oberflaeche. Gemessen an
      /gutscheine/tour-gutschein-bearbeiten und /touren/buchung-bearbeiten -
      font-family des Textes war dort tatsaechlich "Font Awesome 5 Pro".
      Gemeldet als "ungestylete links".

      Die Schrift kommt darum am Element zurueck, und das Symbol bekommt sie
      ausdruecklich am ::before - dort gehoert sie hin.

   2. Sie sahen aus wie aus einer anderen Anwendung: hellgruene Flaeche mit
      dunkelgruenem Rand aus screen.css, waehrend jede Liste daneben den
      Hausknopf zeigt. Jetzt dieselbe Bauform wie .cs-knopf.

   Ohne Markup-Aenderung: die Bestandsklassen bleiben, damit auch die zwoelf
   Stellen ohne Symbol (mytours, disclaimeradmin) mitgenommen werden. */
.cs-neu a.button,
.cs-neu a.button_disabled {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--cs-abstand-2);
  min-height: var(--cs-ziel);
  max-width: 100%;
  padding: 0 var(--cs-abstand-4);
  margin: 2px 4px 2px 0;
  border-radius: var(--cs-radius);
  font-family: var(--cs-schrift-ui);
  font-size: var(--cs-schrift-normal);
  text-decoration: none;
}

.cs-neu a.button {
  background: var(--cs-flaeche);
  border: 1px solid #cfd8c0;
  color: #4a6b0a;
}

/* Der gesperrte Zustand traegt im Bestand einen Durchstrich. Der macht die
   Beschriftung schlechter lesbar, ohne mehr zu sagen als die gedaempfte
   Farbe - er entfaellt. Anklickbar bleibt der Verweis: er hat kein href,
   aber ein onclick, das den Grund nennt ("Buchung muss bezahlt sein."). */
.cs-neu a.button_disabled {
  background: var(--cs-flaeche-leise);
  border: 1px solid var(--cs-linie);
  color: var(--cs-text-leise);
  cursor: not-allowed;
  text-decoration: none;
}

/* Das Symbol steht im ::before, das die Bestandsklasse fa-envelope fuellt.
   Nur die Schrift muss hier gesetzt werden - der Inhalt kommt von dort.
   font-weight 400 ist der Regular-Schnitt, passend zu `far`. */
.cs-neu a.button::before,
.cs-neu a.button_disabled::before {
  font-family: "Font Awesome 5 Pro";
  font-weight: 400;
  font-size: 16px;
  flex: none;
}

/* Beruehrung statt Hervorhebung: auf dem Handy gibt es kein Ueberfahren,
   darum nur ein leiser Zustand fuer Maus und Tastatur. */
.cs-neu a.button:hover,
.cs-neu a.button:focus-visible {
  background: #f2f6ea;
  border-color: var(--cs-gruen-hell);
}


/* Ein Link, der ALLEIN in einer Feldzelle steht, ist dort das Bedienelement
   und war 17px hoch. Links MITTEN im Fliesstext bleiben unberuehrt - sie
   auf 44px zu ziehen wuerde den Textfluss zerreissen. */
.cs-neu table.filterTable td.filterCellContent > a:only-child {
  display: inline-flex;
  align-items: center;
  min-height: var(--cs-ziel);
  max-width: 100%;
}

/* Die Schaltflaechenreihe am Formularende traegt im Bestand
   style="float: left|right" - inline, also nicht ueberschreibbar ohne
   !important. Statt dagegen anzukaempfen bekommt sie nur Luft, damit die
   Knoepfe nicht aneinanderkleben. */
.cs-neu .cs-inhalt form > input[type=submit],
.cs-neu .cs-inhalt form > input[type=button] {
  margin-bottom: var(--cs-abstand-2);
}


/* ==========================================================================
   4. Gestapelt - wenn dem Formular weniger als 880px Platz bleiben
   ==========================================================================
   880px ist derselbe Umschaltpunkt wie in liste.css und in shell.css fuer
   den einklappbaren Filterblock. Zwei Beschriftungs-/Feldpaare nebeneinander
   brauchen gemessen rund 860px; darunter faellt das Raster auf eine Spalte.

     390er Fenster  -> .filterContainer innen  364px -> gestapelt
    1440er Fenster  -> .filterContainer innen 1154px -> zweispaltig wie bisher
   (Container Queries messen den Inhaltskasten, die 12px Innenabstand des
   Blocks zaehlen also nicht mit.)
   ========================================================================== */
@container formular (max-width: 880px) {

  /* ---- Raster aufloesen -------------------------------------------------
     Nur die AEUSSERE Tabelle wird zu Bloecken. Die Kindkombinatoren halten
     verschachtelte Tabellen (4 Ansichten) bewusst in Tabellenform - sie sind
     nicht per CSS zu loesen und werden einzeln behandelt. */
  .cs-neu table.filterTable,
  .cs-neu table.filterTable > tbody,
  .cs-neu table.filterTable > tbody > tr,
  .cs-neu table.filterTable > tbody > tr > td,
  .cs-neu table.filterTable > tr,
  .cs-neu table.filterTable > tr > td {
    display: block;
    width: 100%;
    max-width: 100%;
  }

  /* Breitenangaben als HTML-Attribut (width="150") und feste Zellhoehen
     verlieren im Blockfluss ihren Sinn. */
  .cs-neu table.filterTable > tbody > tr > td,
  .cs-neu table.filterTable > tr > td {
    height: auto;
    padding: 0;
    border: 0;
    vertical-align: baseline;
  }

  /* ---- Beschriftung ueber ihrem Feld ------------------------------------
     Der Abstand sitzt bewusst an der Beschriftung, nicht an der Zeile: eine
     Zeile enthaelt oft ZWEI Paare, und getrennt werden muessen die Paare,
     nicht die Zeilen. */
  .cs-neu table.filterTable td.filterCellHeader {
    padding: var(--cs-abstand-4) 0 var(--cs-abstand-1);
    white-space: normal;
  }
  .cs-neu table.filterTable > tbody > tr:first-child > td.filterCellHeader:first-child,
  .cs-neu table.filterTable > tr:first-child > td.filterCellHeader:first-child {
    padding-top: var(--cs-abstand-2);
  }

  .cs-neu table.filterTable td.filterCellContent {
    padding: 0 0 var(--cs-abstand-2);
  }

  /* Leere Platzhalterzellen erzeugen sonst eine Luecke ohne Inhalt. */
  .cs-neu table.filterTable > tbody > tr > td:empty,
  .cs-neu table.filterTable > tr > td:empty {
    display: none;
  }

  /* ---- Felder fuellen die Breite -----------------------------------------
     !important ist hier noetig und bewusst gesetzt: der Bestand traegt 164
     inline-style-Breiten (bis 650px) direkt am Feld - allein edittour hat 32
     Stueck. Inline schlaegt jede Klassenregel; ohne !important bliebe ein
     650px breites Feld in einem 356px breiten Block stehen. Die Regel gilt
     ausschliesslich im gestapelten Zustand.

     Angesetzt wird an td, nicht an .filterCellContent: settings/editsetting
     legt seine 80-Spalten-Textarea in ein <td colspan="2"> OHNE Klasse
     (daher dort 5 Header / 4 Content). Das "> *:not(table) >" nimmt Felder
     EINER Huellebene mit und haelt verschachtelte Tabellen heraus.

     type=date ist ausgenommen. Ein Datumsfeld hat eine feste Form (TT.MM.JJJJ
     plus Kalendersymbol) und braucht gemessene 141px; auf die Zellbreite
     gestreckt stand es mit 320px da und sah aus, als koenne man mehr
     hineinschreiben. Die Zelle bleibt 320px breit - diese Spalte traegt auch
     die Auswahlfelder -, aber das Feld zeigt jetzt seine wahre Groesse.
     Ausgenommen wird HIER, statt eine eigene Regel dagegen zu schreiben:
     width steht mit !important, dagegen haette nur ein zweites !important
     geholfen. Alle Angaben in PIXELN (siehe oben). */
  .cs-neu table.filterTable > tbody > tr > td > input:not([type=hidden]):not([type=checkbox]):not([type=radio]):not([type=submit]):not([type=button]):not([type=image]):not([type=date]):not([type=time]),
  .cs-neu table.filterTable > tbody > tr > td > select,
  .cs-neu table.filterTable > tbody > tr > td > textarea,
  .cs-neu table.filterTable > tbody > tr > td > *:not(table) > input:not([type=hidden]):not([type=checkbox]):not([type=radio]):not([type=submit]):not([type=button]):not([type=image]):not([type=date]):not([type=time]),
  .cs-neu table.filterTable > tbody > tr > td > *:not(table) > select,
  .cs-neu table.filterTable > tbody > tr > td > *:not(table) > textarea,
  .cs-neu table.filterTable > tr > td > input:not([type=hidden]):not([type=checkbox]):not([type=radio]):not([type=submit]):not([type=button]):not([type=image]):not([type=date]):not([type=time]),
  .cs-neu table.filterTable > tr > td > select,
  .cs-neu table.filterTable > tr > td > textarea,
  .cs-neu table.filterTable > tr > td > *:not(table) > input:not([type=hidden]):not([type=checkbox]):not([type=radio]):not([type=submit]):not([type=button]):not([type=image]):not([type=date]):not([type=time]),
  .cs-neu table.filterTable > tr > td > *:not(table) > select,
  .cs-neu table.filterTable > tr > td > *:not(table) > textarea {
    width: 100% !important;
    max-width: 100%;
    margin-left: 0;
    margin-right: 0;
  }

  /* Textfelder behalten eine brauchbare Hoehe, verlieren aber die feste
     Breite (inline bis 650px). */
  .cs-neu table.filterTable td textarea { min-height: 120px; }

  /* ---- Mehrere Auswahllisten in einer Zelle ------------------------------
     Tag / Monat / Jahr stehen im Bestand als drei <select> nebeneinander.
     Drei volle Zeilen daraus zu machen waere auf sechs Datumsfeldern
     (meine-touren/abrechnung-uebersicht) achtzehn Zeilen hoch. Sie teilen
     sich deshalb die Breite und brechen erst um, wenn es eng wird. */
  .cs-neu table.filterTable td:has(> select ~ select) {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--cs-abstand-2);
  }
  .cs-neu table.filterTable td:has(> select ~ select) > select {
    flex: 1 1 96px;
    min-width: 0;
    width: auto !important;
  }

  /* VIER Auswahllisten in einer Zelle: die Uhrzeit ("von 10 00 bis 12 00
     Uhr") auf tour-bearbeiten. Mit der Grundbreite von 96px braucht sie
     4 x 96 + 3 Abstaende = 408px und bricht in einer 340px breiten Zelle auf
     zwei Zeilen um - gemessen 104px hoch. Vom Betreiber gefragt: "uhrzeiten
     von bis in eine zeile?"

     Die kleinere Grundbreite gilt AUSDRUECKLICH nur fuer den Vierer-Fall.
     Sie generell zu senken waere falsch: in der Dreier-Zelle steht ein
     Monatsfeld, und "September" braucht mit Pfeilabstand rund 136px - mit
     min-width: 0 wuerde es stillschweigend abgeschnitten.

     4 x 72 + 24 = 312px, die Felder wachsen dann auf rund 79px. Ein
     zweistelliger Wert braucht mit Innenabstand und Pfeil 66px. */
  .cs-neu table.filterTable td:has(> select ~ select ~ select ~ select) > select {
    flex: 1 1 72px;
  }

  /* ---- Auswahlknoepfe und Ankreuzfelder ----------------------------------
     Gemeldeter Mangel auf /meine-touren/abrechnung-uebersicht: drei Paare aus
     Auswahlknopf und Beschriftung standen in einer Zeile; die Beschriftung
     brach von ihrem Knopf getrennt um ("nach" oben, "Abgerechnet-Datum"
     darunter) oder lief rechts hinaus.

     Ein Paar je Zeile: die Beschriftung bekommt die Restbreite, damit daneben
     kein zweiter Knopf mehr Platz findet. Sie darf intern umbrechen, loest
     sich aber nie von ihrem Knopf.

     Ausdruecklich NUR direkte Kinder der aeusseren Zelle: edittour legt sein
     Guide-Raster ("Weitere Guides") in eine VERSCHACHTELTE Tabelle mit
     schrumpfenden Zellen. Dort ergibt calc(100% - 48px) eine Zirkelrechnung,
     und die Beschriftung brach unter ihr Ankreuzfeld. Im verschachtelten
     Raster bleibt der natuerliche Zeilenfluss stehen. */
  .cs-neu table.filterTable > tbody > tr > td > input[type=radio] + label,
  .cs-neu table.filterTable > tbody > tr > td > input[type=checkbox] + label,
  .cs-neu table.filterTable > tr > td > input[type=radio] + label,
  .cs-neu table.filterTable > tr > td > input[type=checkbox] + label {
    display: inline-block;
    width: calc(100% - 48px);
    vertical-align: middle;
    line-height: 1.35;
  }

  /* Der Abstand von 11px rundherum (base.css) ist im gestapelten Raster
     links zu viel - das Feld soll an der Beschriftung ausgerichtet stehen. */
  .cs-neu table.filterTable > tbody > tr > td > input[type=radio],
  .cs-neu table.filterTable > tbody > tr > td > input[type=checkbox],
  .cs-neu table.filterTable > tr > td > input[type=radio],
  .cs-neu table.filterTable > tr > td > input[type=checkbox] {
    margin-left: 0;
    margin-right: var(--cs-abstand-2);
    vertical-align: middle;
  }

  /* ---- Schaltflaechen im Formular ---------------------------------------- */
  .cs-neu table.filterTable > tbody > tr > td > input[type=submit],
  .cs-neu table.filterTable > tbody > tr > td > input[type=button],
  .cs-neu table.filterTable > tbody > tr > td > button,
  .cs-neu table.filterTable > tr > td > input[type=submit],
  .cs-neu table.filterTable > tr > td > input[type=button],
  .cs-neu table.filterTable > tr > td > button {
    width: auto;
    max-width: 100%;
  }

  /* ---- Verschachtelte Tabellen -------------------------------------------
     Ausdruecklich NICHT aufgeloest (4 Ansichten, siehe Bericht). Sie behalten
     ihre Tabellenform; damit sie die Seite nicht seitwaerts ziehen, scrollen
     sie in sich selbst. */
  .cs-neu table.filterTable td table { max-width: 100%; }
  .cs-neu table.filterTable td > div:has(> table) {
    overflow-x: auto;
    max-width: 100%;
  }
}

/* ---- Filterleiste: Tabellenform laenger halten --------------------------
   Der Block darueber loest das Formularraster ab 880px Container auf. Fuer
   BEARBEITUNGSformulare ist das richtig - ein Feld pro Zeile liest sich auf dem
   Tablet besser. Fuer die FILTERLEISTE der Listen ist es verschwenderisch:

   Gemessen an /touren/buchungen bei 860px Container:
     gestapelt      980px hoch, 12 der 15 Felder 834px breit
     Tabellenform   495px hoch  (Mindestbreite der Tabelle: 358px)

   Die Filterzeilen haben vier Zellen (Beschriftung, Feld, Beschriftung, Feld).
   Ein Kundennummernfeld braucht keine 834 Pixel. Darum bleibt die Filterleiste
   bis 480px in Tabellenform - darunter, also auf echten Telefonen, wird
   gestapelt. Die Grenze folgt der gemessenen Mindestbreite der Tabelle (358px)
   plus Reserve; ein erster Versuch mit 620px war zu vorsichtig, dort stand bei
   628px Container schon wieder der Stapel mit 980px Hoehe.

   Bewusst auf #filterForm begrenzt: das ist die etablierte Kennung der
   Filterformulare in den Listenansichten. Bearbeitungsformulare bleiben
   unberuehrt, ihre Schwelle wurde nicht gemessen. */
@container formular (min-width: 480px) and (max-width: 880px) {

  .cs-neu :is(#filterForm, .cs-filterbereich) table.filterTable { display: table; }
  .cs-neu :is(#filterForm, .cs-filterbereich) table.filterTable > tbody { display: table-row-group; }
  .cs-neu :is(#filterForm, .cs-filterbereich) table.filterTable > tbody > tr,
  .cs-neu :is(#filterForm, .cs-filterbereich) table.filterTable > tr { display: table-row; }
  .cs-neu :is(#filterForm, .cs-filterbereich) table.filterTable > tbody > tr > td,
  .cs-neu :is(#filterForm, .cs-filterbereich) table.filterTable > tr > td {
    display: table-cell;
    width: auto;
    vertical-align: middle;
  }

  /* Die Beschriftung steht wieder NEBEN dem Feld, nicht darueber. */
  .cs-neu :is(#filterForm, .cs-filterbereich) table.filterTable td.filterCellHeader { white-space: nowrap; }

  /* Felder duerfen hier schrumpfen. Ohne das behalten sie die volle
     Zellbreite und die Tabelle waechst ueber den Container hinaus. */
  /* type=date ausgenommen - siehe die Begruendung an der Regel "Felder fuellen
     die Breite" weiter oben. Diese Regel hier gewinnt wegen ihrer ID gegen
     jene; wer nur dort ausnimmt, sieht keine Wirkung. Genau das ist mir
     passiert: das Feld blieb 320px, obwohl die Ausnahme richtig war. */
  .cs-neu :is(#filterForm, .cs-filterbereich) table.filterTable input:not([type=hidden]):not([type=checkbox]):not([type=radio]):not([type=date]),
  .cs-neu :is(#filterForm, .cs-filterbereich) table.filterTable select {
    width: 100%;
    min-width: 0;
  }
}

/* ---- Zeitspanne "von ... bis ..." ----------------------------------------
   Zwei Zeitfelder mit ihren Beschriftungen in EINER Zeile. Vorher standen dort
   vier Auswahllisten, die bei 390px auf zwei Zeilen umbrachen (104px hoch).

   Der Deckel ist noetig, weil ein type=time seine Eigenbreite aus der
   Schriftgroesse und dem Bedienelement des Browsers zieht - gemessen 269px,
   also mehr als eine halbe Zellbreite fuer den Wert "10:00". Die Form ist
   fest, der Wert hat immer fuenf Zeichen; eine gedeckelte Breite schneidet
   also nichts ab.

   Die Ausnahme von der Regel "Felder fuellen die Breite" steht dort, wo diese
   Regel steht (:not([type=time])) - gegen ein !important hilft kein zweites,
   sondern nur die Aenderung der Regel selbst. */
.cs-neu .cs-zeitspanne {
  display: flex;
  align-items: center;
  gap: var(--cs-abstand-2);
  flex-wrap: wrap;
}
.cs-neu .cs-zeitspanne label,
.cs-neu .cs-zeitspanne__einheit {
  color: var(--cs-text-leise);
  flex: none;
}
.cs-neu .cs-zeitspanne input[type=time] {
  flex: 0 1 auto;
  width: auto;
  max-width: 130px;
  min-width: 0;
}

/* ---- Ueberschrift als Aufklapper -----------------------------------------
   "Tourbuchung auf andere Tour umbuchen oder neue Buchung fuer eine andere
   Tour erstellen" - der Text sah aus wie eine Ueberschrift und reagierte auf
   Klicks nicht; bedienbar waren nur die drei Pfeilbilder daneben.

   Jetzt ist die ganze Zeile der Schalter. Als <button> gebaut, damit er mit
   der Tastatur erreichbar ist und als Bedienelement angesagt wird - ein
   <h2 onclick> waere beides nicht. Er sieht aber weiter wie eine Ueberschrift
   aus: keine Knopfflaeche, keine Umrandung, die Schrift erbt er von der
   Ueberschrift.

   Die Pfeile stehen rechts und behalten ihre Bestands-Kennung, weil
   loadTours() ihr innerHTML austauscht. Ihre float-Angaben sind entfernt -
   in einer Flex-Zeile richten sie nur Schaden an. */
.cs-neu .cs-aufklapper {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--cs-abstand-3);
  width: 100%;
  min-height: var(--cs-ziel);
  padding: 0;
  border: 0;
  background: none;
  color: inherit;
  font: inherit;
  text-align: left;
  cursor: pointer;
}
/* Ein Winkel, wie bei einem Akkordeon - vorher waren es DREI gleiche
   Bitmaps (orderby_asc.gif) nebeneinander, zusammen rund 30x9 Pixel.

   Die Richtung kommt jetzt aus aria-expanded am Knopf, nicht mehr aus einem
   ausgetauschten innerHTML: ein Zustand, aus dem Optik UND Ansage entstehen.
   Vorher wusste nur das Bild, ob der Bereich offen ist - Hilfsmittel sagten
   den Knopf ohne Zustand an. */
.cs-neu .cs-aufklapper__pfeile {
  flex: none;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 24px;
  height: 24px;
  color: var(--cs-gruen-dunkel);
  font-size: var(--cs-schrift-gross);
  line-height: 1;
}
.cs-neu .cs-aufklapper[aria-expanded="true"] .cs-aufklapper__pfeile {
  transform: rotate(180deg);
}

/* Die Drehung nur animieren, wenn niemand widerspricht. */
@media (prefers-reduced-motion: no-preference) {
  .cs-neu .cs-aufklapper__pfeile {
    transition: transform .15s ease;
  }
}

/* ---- Verweise auf Dokumente ----------------------------------------------
   Drei Stellen im Buchungsformular fuehren zu einem Dokument: die Rechnungen,
   die Tour-Informationen und der Haftungsausschluss. Sie sahen alle gleich aus
   - blauer Text, bei den Rechnungen nur die Nummer (RE202515950-01), bei den
   beiden anderen die volle Adresse als 365px lange Zeichenkette.

   Jetzt traegt jeder ein Symbol, das sagt, was einen erwartet, und die
   Zielhoehe von 44px: die Rechnungsverweise waren 113x17px gross, also nicht
   zuverlaessig zu treffen.

   inline-flex statt inline: nur so wirkt min-height, und das Symbol steht auf
   der Textlinie statt darueber. */
.cs-neu .cs-dokument,
.cs-neu a.cs-dokument:link,
.cs-neu a.cs-dokument:visited {
  display: inline-flex;
  align-items: center;
  gap: var(--cs-abstand-2);
  min-height: var(--cs-ziel);
  color: var(--cs-gruen-dunkel);
  text-decoration: underline;
}
.cs-neu .cs-dokument i {
  flex: none;
  font-size: 18px;
}

/* Nur-Symbol-Fassung: in einer Tabellenspalte, die schon "pdf" heisst, waere
   ein Text daneben Wiederholung und wuerde die Spalte breiter machen. Braucht
   dieselbe Breite wie Hoehe, sonst bleibt das Ziel schmal. */
.cs-neu .cs-dokument--symbol {
  justify-content: center;
  min-width: var(--cs-ziel);
  text-decoration: none;
}

/* Untereinander statt durch <br> getrennt: eine Liste sagt auch ohne Augen,
   dass es zwei gleichrangige Ziele sind. */
.cs-neu .cs-linkliste {
  margin: 0;
  padding: 0;
  list-style: none;
}

/* ---- Stornierte Buchung -------------------------------------------------
   /touren/buchung-bearbeiten zeigt bei einer stornierten Buchung einen
   Hinweis und haengt "disabled" an den Inhaltsbehaelter. Beides wurde in der
   geloeschten layout.css gestaltet:

     .disabledBooking                 {border: 1px solid red; padding: 5px;
                                       color: red; font-weight: bold;}
     #contentContainer.disabled       {opacity: 0.7;}
     #contentContainer.disabled .back {opacity: unset; font-weight: bolder;}

   Seit deren Wegfall stand der Hinweis als gewoehnlicher Fließtext da - an
   einer Buchung, die man nicht mehr speichern kann (die Schaltflaechen sind
   im Markup ausgeblendet, nur "Zurueck" bleibt). Der Hinweis ist damit die
   einzige Stelle, die den Zustand ueberhaupt noch nennt.

   Die Deckkraft von 0.7 kommt NICHT zurueck. Sie hellt jede Farbe gegen den
   Untergrund auf: die leisen Beschriftungen (#666) landen bei rund #949494
   und damit bei 2.8:1 Kontrast - unter den geforderten 4.5:1. Sie war auch
   der Grund fuer die zweite Regel, die "Zurueck" wieder aufhellen musste;
   ohne die erste braucht es die zweite nicht. Der Zustand wird stattdessen
   dort gesagt, wo er hingehoert: im Hinweis.

   #8a3b00 statt Rot: dieselbe Warnfarbe wie .cs-status[data-art="warnung"]
   in liste.css, 7.8:1 auf Weiß. Reines Rot auf Weiß kommt auf 4.0:1 und
   faellt damit durch. */
.cs-neu .disabledBooking {
  display: flex;
  align-items: center;
  gap: var(--cs-abstand-2);
  margin: 0 0 var(--cs-abstand-4);
  padding: var(--cs-abstand-3) var(--cs-abstand-4);
  border: 1px solid currentColor;
  border-left-width: 4px;
  border-radius: var(--cs-radius);
  background: var(--cs-flaeche);
  color: #8a3b00;
  font-weight: 700;
}

/* Das Symbol steht im Inhalt, nicht im Markup: der Hinweis wird an genau
   einer Stelle erzeugt und traegt dort schon den vollstaendigen Text. */
.cs-neu .disabledBooking::before {
  flex: none;
  font-family: "Font Awesome 5 Pro";
  font-weight: 900;
  content: "\f071";
}

/* ---- PLZ und Ort in einer Zelle ------------------------------------------
   Beide stehen im Bestand in derselben Zelle, die PLZ als "inputTextShort",
   der Ort mit style="width: 180px" fest am Element. Auf dem Handy stapelte die
   Regel "Felder fuellen die Breite" sie zu zwei vollen Zeilen, auf dem
   Schreibtisch stand der Ort mit 180px in einer 393px breiten Spalte.
   Gewuenscht: "plz kleiner und ort daneben".

   Ein festes Verhaeltnis statt zweier fester Breiten: die PLZ ist immer
   fuenfstellig und braucht keine 393px, der Ort bekommt den Rest.

   !important ist hier noetig und ausnahmsweise richtig: die Breite des Ortes
   stand INLINE im Markup (dagegen hilft nur !important), und die Regel "Felder
   fuellen die Breite" setzt ihrerseits width: 100% !important. Die Inline-
   Angabe ist im Markup entfernt; das !important bleibt fuer die zweite. */
/* Ueber die POSITION, nicht ueber die IDs: die Regel hing an #zipCode und
   #city und war damit an ein einziges Formular gebunden. Im Guide-Formular
   heissen dieselben Felder guide_zipCode und guide_city - die Regel haette
   dort nie gegriffen, und ich haette sie beinahe ein zweites Mal gebaut.
   Erstes Kind ist immer die PLZ, zweites immer der Ort. */
.cs-neu .cs-plzort {
  display: flex;
  align-items: center;
  gap: var(--cs-abstand-2);
}
/* Ueber flex-basis, NICHT ueber width.
   Die erste Fassung setzte `flex: none; width: 92px !important` - und verlor
   trotzdem. Die Regel "Felder fuellen die Breite" weiter oben hat einen weit
   spezifischeren Selektor (zwei Klassen plus acht :not([type=...])), ihr
   `width: 100% !important` gewinnt also. Gemessen bei 390px: die PLZ nahm
   340px, der Ort wurde auf 26 Pixel gequetscht - unbenutzbar, und zwar genau
   in dem Zustand, fuer den diese Regel gedacht war.

   `flex: none` half nicht, weil das flex-basis auf `auto` laesst - und dann
   zieht die Flexbox doch wieder width heran. Ein AUSDRUECKLICHER flex-basis
   bestimmt die Hauptachse dagegen selbst; width ist dann gleichgueltig, ganz
   ohne zweites !important.

   In rem: die PLZ ist fuenfstellig, ihre Breite haengt an der Schrift. */
.cs-neu .cs-plzort > :first-child {
  flex: 0 0 5.75rem;
  min-width: 0;
}
.cs-neu .cs-plzort > :last-child {
  flex: 1 1 0;
  min-width: 0;
}

/* ---- Guide-Auswahl im Bearbeitungsformular -------------------------------
   24 Kaestchen in einer zweispaltigen Liste, im Bestand je Kaestchen plus
   danebenstehender Text. Zwei Maengel, beide gemessen bzw. im Bild gesehen:
   tippbar war nur das 22px grosse Kaestchen, und lange Namen brachen um und
   liefen unter die Nachbarspalte ("guide noch nicht festgelegt! hat unschönen
   umbruch").

   Das <label> in der Ansicht macht die ganze Zeile antippbar. Hier bekommt sie
   die Zielhoehe und der Name eine Kuerzung statt eines Umbruchs; der volle
   Name steht im title.

   flex statt inline: nur so laesst sich der Name kuerzen, ohne dass das
   Kaestchen mitschrumpft (flex: none am Kaestchen, min-width: 0 am Namen -
   ohne das ignoriert ein Flex-Element seine Kuerzung). */
/* Die Guide-Auswahl verteilt sich selbst auf Spalten - so viele, wie in die
   Breite passen. Vorher legte eine PHP-Schleife ($index % 2) fest, dass immer
   ZWEI nebeneinander stehen: auf dem Handy zu eng, auf dem Schreibtisch
   verschenkt. Vom Betreiber: "bitte verteile die Weitere Guides sauber auf
   mehrere spalten für desktop".

   auto-fill mit minmax(150px, 1fr): 150px sind die Breite, ab der ein
   durchschnittlicher Name ohne Kuerzung steht (Kaestchen 22 + Abstand 8 +
   rund 120px Text). Was breiter ist, wird verteilt; was schmaler waere,
   bekommt eine Spalte weniger. Bei 340px Zellbreite sind das zwei Spalten,
   bei rund 950px auf dem Schreibtisch sechs.

   Die frueher noetige Deckelung der Tabellenbreite entfaellt damit: ein
   Raster kann seine Spalte nicht ueberschreiten, eine Tabelle mit
   table-layout: auto schon - genau daran lag der Ueberstand von 89px ("die
   liste der zusätzlichen guides steht rechts über"). Alle Angaben in PIXELN
   (siehe oben). */
.cs-neu .cs-guideliste {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
  column-gap: var(--cs-abstand-4);
}

/* Ein Guide, der die Tour angefragt hat, stand im Bestand ueber
   style="font-weight: bold" am <td>. Die Zelle gibt es nicht mehr. */
.cs-neu .cs-guidewahl--angefragt { font-weight: 700; }

.cs-neu .cs-guidewahl {
  display: flex;
  align-items: center;
  gap: var(--cs-abstand-2);
  min-height: var(--cs-ziel);
  cursor: pointer;
}
.cs-neu .cs-guidewahl input[type=checkbox] {
  flex: none;
  margin: 0;
}
.cs-neu .cs-guidewahl__name {
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* ---- Bearbeitungsformular: ausgewogene Spalten auf dem Schreibtisch ------
   Gemeldet: "die desktop-view auf .../tour-bearbeiten?tourId=20334 ist noch
   nicht ausgewogen". Gemessen bei 1440px: die vier Spalten waren
   76 | 103 | 112 | 830 Pixel breit. Das linke Feld bekam 103px und schnitt
   "Bitte wählen Baden-Baden" ab, das rechte hatte 830px fuer "Ja/Nein".

   Ursache ist die Tabellenaufteilung "auto" in Verbindung mit den Zeilen, die
   ueber colspan="3" laufen (Tour-Datum, Uhrzeit, GPS-Track, Buchen-Link,
   Tour Information): sie binden keine einzelne Spalte, also faellt der ganze
   Ueberschuss der letzten zu. Frueher hielt die Textflaeche ueber ihren
   rowspan die Spalten 3 und 4 zusammen - der ist entfallen, seit Status und
   Preis sich eine Zeile teilen.

   table-layout: fixed nimmt der Tabelle das Verhandeln ab; die Breiten stehen
   dann in der ERSTEN Zeile. Beschriftung 15% (bei 1122px = 168px, "Tour Guide
   Anmeldung" braucht 140), Feld 35%.

   :has(> td:nth-child(4)) ist die Sicherung: nur Tabellen, deren erste Zeile
   wirklich vier Zellen hat, bekommen die Vorgabe. Im Buchungsformular gibt es
   Tabellen mit nur einer Zeile und weniger Zellen - fuer die waere eine feste
   Vierteilung falsch. Alle Angaben in PIXELN bzw. Prozent (siehe oben). */
@container formular (min-width: 881px) {
  .cs-neu #saveForm table.filterTable:has(> tbody > tr:first-child > td:nth-child(4)),
  .cs-neu #saveForm table.filterTable:has(> tr:first-child > td:nth-child(4)) {
    table-layout: fixed;
  }

  .cs-neu #saveForm table.filterTable > tbody > tr:first-child > td:nth-child(odd),
  .cs-neu #saveForm table.filterTable > tr:first-child > td:nth-child(odd) {
    width: 15%;
  }
  .cs-neu #saveForm table.filterTable > tbody > tr:first-child > td:nth-child(even),
  .cs-neu #saveForm table.filterTable > tr:first-child > td:nth-child(even) {
    width: 35%;
  }
}

/* ---- Bearbeitungsformular: ausgewaehlte Zeilen zweispaltig ---------------
   Der gestapelte Block oben loest das Formularraster unter 880px auf: eine
   Beschriftung, darunter ihr Feld, eines pro Zeile. Fuer lange Felder ist das
   richtig - ein Tour-Name oder eine Textflaeche braucht die volle Breite.
   Fuer KURZE Felder ist es verschwenderisch: gemessen an "Anzahl Geräte"
   belegt ein Feldblock 88px, davon sind 44px das Feld und 44px Beschriftung
   und Abstand. Zwei solche Bloecke nebeneinander sparen also 88px je Zeile.

   Welche Zeile das darf, entscheidet die Ansicht ueber die Klasse cs-paar -
   nicht eine Regel, die raet. Der Betreiber hat sie ausgewaehlt: "beginne
   damit tour-stadt und tour-guide in eine zeile zu stellen, anzahl geräte und
   guide-mail-versenden auch in eine zeile".

   Bauart wie in der Filterleiste: zwei Rasterzeilen, spaltenweise gefuellt.
   Damit landet Zelle 1 (Beschriftung) ueber Zelle 2 (ihr Feld), und Zelle 3
   ueber Zelle 4 - jedes Paar bleibt zusammen, ohne Markup-Umbau.

   KEINE Untergrenze. Ein erster Versuch begann bei 480px - der Betreiber
   arbeitet bei 422px Fenster, die Regel haette bei ihm nie gegriffen. Genau
   dieser Fehler ist mir in dieser Sitzung schon einmal unterlaufen. Der Preis
   auf schmalen Geraeten: eine lange Beschriftung wie "Guide Mail versenden"
   bricht in ihrer Haelfte auf zwei Zeilen um. Das kostet weniger, als beide
   Felder untereinander zu stellen. Alle Angaben in PIXELN (siehe oben). */
@container formular (max-width: 880px) {
  .cs-neu #saveForm table.filterTable > tbody > tr.cs-paar,
  .cs-neu #saveForm table.filterTable > tr.cs-paar {
    display: grid;
    grid-template-rows: auto auto;
    grid-auto-flow: column;
    grid-auto-columns: minmax(0, 1fr);
    column-gap: var(--cs-abstand-5);
    align-items: start;
  }

  /* Die Beschriftung sitzt UNTEN in ihrer Rasterzeile, direkt ueber ihrem Feld.
     Beide Beschriftungen einer Paar-Zeile teilen sich EINE Rasterzeile, deren
     Hoehe die laengere bestimmt. Bricht eine auf zwei Zeilen um
     ("Abteilung/Ansprechpartner", "Bestätigungs E-Mail versenden"), haengt die
     kuerzere mit align-items: start oben und laesst darunter Luft - gemessen
     sprang der Abstand zum eigenen Feld zwischen 5, 21 und 36px. Vom Betreiber
     gesehen: "die feld-namen sind nur in den ersten 4 feldern auf richtiger
     höhe".

     Mit align-self: end steht jede Beschriftung buendig ueber ihrem Feld,
     unabhaengig davon, wie hoch die Nachbarin ist. */
  .cs-neu #saveForm table.filterTable > tbody > tr.cs-paar > td.filterCellHeader,
  .cs-neu #saveForm table.filterTable > tr.cs-paar > td.filterCellHeader {
    align-self: end;
  }
}

/* ---- Filterfelder: Breitendeckel ----------------------------------------
   Ein <select> macht sich so breit wie seine breiteste Option. Gemeldet vom
   Betreiber: "kuerze das select der tourauswahl auf einen maximalwert" -
   gemeint ist select#tourTitleId auf /touren.

   Gemessen bei 1278px Fenster (986px Filterbreite): #tourTitleId hat 52
   Eintraege, der laengste braucht 598px. Das Feld stand mit 647px in einer
   655px breiten Zelle - EIN Feld nahm zwei Drittel der Zeile, die uebrigen
   sieben teilten sich 331px.

   320px sind der Punkt, an dem zwei Dinge zusammenfallen:
   - 51 der 52 Tour-Titel bleiben an ihren ersten Zeichen unterscheidbar. Bei
     280px sind es 50, bei 240px nur 46 - die 20 Titel, die alle mit
     "SEGWAY Tour " beginnen, sehen dann gleich aus. Das 52. Paar ist ein
     echtes Duplikat in tour_title, in keiner Breite zu trennen.
   - #tourGuideId braucht genau 320px und passt damit noch VOLLSTAENDIG.
   Der volle Titel steht im title jeder Option: auf dem Schreibtisch zeigt
   Chrome die Auswahlliste nur so breit wie das Feld und kuerzt den Text, unter
   iOS und Android oeffnet ein bildschirmbreiter Waehler mit vollem Text.

   Eine Einschraenkung mit Absicht: nur #filterForm. Dieselben Feldregeln
   gelten fuer 51 Bearbeitungsformulare, wo ein Feld ueber die ganze Zeile
   richtig ist.

   KEINE Schwelle. Zuerst stand hier @container formular (min-width: 881px) -
   das war falsch: der Betreiber arbeitet bei 1133px Fenster, das sind 841px
   Container, die Regel haette bei ihm nie gegriffen. Er sah weiter die
   gestreckte Leiste mit 407px breiten Feldern und schrieb: "wieso strecken,
   verkleinere sie, nur der inhalt soll so breit sein wie der laengste
   tournamen". Unter 480px bindet der Deckel ohnehin nicht - dort ist eine
   Rasterspalte rund 170px breit. Alle Angaben in PIXELN (siehe oben). */
.cs-neu :is(#filterForm, .cs-filterbereich) table.filterTable select,
.cs-neu :is(#filterForm, .cs-filterbereich) table.filterTable input:not([type=hidden]):not([type=checkbox]):not([type=radio]) {
  max-width: 320px;
}

/* Der Deckel allein genuegt nicht: table.filterTable steht auf width: 100%
   (siehe oben), und die Tabellenaufteilung verteilt den frei gewordenen Platz
   anteilig auf die Zellen. Gemessen bei 1200px Container: Feld 320px, Zelle
   aber 467px - der Leerraum wanderte nur, statt zu verschwinden.

   Mit width: auto folgt die Leiste ihrem Inhalt: Tabelle 824px statt 1174px,
   breiteste Zelle 328 statt 467, unabhaengig von der Containerbreite. Die
   Beschriftungen ruecken an ihre Felder (206 -> 145).

   Der Selektor braucht die ID: die Regel oben (.cs-neu table.filterTable,
   width: 100%) und die Feldregel im 880er-Block (width: 100% !important;
   max-width: 100%, (0,2,5)) wuerden sonst gewinnen. Mit #filterForm ist die
   Spezifitaet (1,2,2) und die ID entscheidet.

   Zwei Wege waren schlechter:
   - td:last-child { width: 100% } traf in der Zeile mit nur ZWEI Zellen die
     FELDspalte - die wuchs auf 906px.
   - Die Lupe war der Einwand gegen width: auto ("bitte setze das lupenicon
     recht unten in den filter"). Sie sitzt aber in div.cs-filter-aktionen,
     einem NACHBARN der Tabelle, nicht in ihr - eine schmalere Tabelle
     verschiebt sie nicht.

   max-width: 100% bleibt als Sicherung: eine Filterleiste mit mehr Spalten als
   /touren darf die Seite nicht seitwaerts ziehen. */
.cs-neu :is(#filterForm, .cs-filterbereich) table.filterTable {
  width: auto;
  max-width: 100%;
}

/* ---- Waagerechte Luft in der Filterleiste --------------------------------
   Vom Betreiber bei 768px entdeckt. Im Bild klebten "Stadt", "Status" und
   "Datum bis" unmittelbar am Feld links davon. Gemessen: JEDE Zelle hatte
   0px Innenabstand, "Stadt" begann exakt 0px nach dem Auswahlfeld, und die
   Beschriftungszelle war 137px breit bei einem Textbedarf von genau 137px.
   Es war also kein Ueberlauf und kein Breitenproblem, sondern ein fehlender
   Abstand - ein Defekt, nicht drei.

   Ursache: die Grundregel gibt jeder Zelle 8px rechts. Der 880er-Block setzt
   fuer den GESTAPELTEN Zustand td.filterCellHeader/Content auf padding 0 0 x
   - richtig, wenn Beschriftung und Feld uebereinander stehen. Die
   Filterleiste stellt in 480-880px aber ihre TABELLENFORM wieder her und hat
   den waagerechten Abstand dabei nie zurueckbekommen.

   Zwei verschiedene Werte, weil sie zwei verschiedene Aufgaben haben:
   -  8px zwischen Beschriftung und ZUGEHOERIGEM Feld - sie gehoeren zusammen.
   - 24px zwischen einem Feld und der NAECHSTEN Beschriftung - dort beginnt
     ein neues Paar. Ohne diesen Unterschied liest sich die Zeile als eine
     Reihe gleich weit entfernter Dinge, und man ordnet die Beschriftung dem
     falschen Feld zu.

   Die ID ist noetig, damit die Regel den 880er-Block schlaegt; nur
   padding-right wird gesetzt, die uebrigen Seiten bleiben wie dort bestimmt.
   Aufslag rund 48px auf die Tabellenbreite - bei 740px Container und 662px
   Tabelle reichlich Luft, und max-width: 100% deckelt den Rest.
   Alle Angaben in PIXELN (siehe oben). */
.cs-neu :is(#filterForm, .cs-filterbereich) table.filterTable > tbody > tr > td.filterCellHeader,
.cs-neu :is(#filterForm, .cs-filterbereich) table.filterTable > tr > td.filterCellHeader {
  padding-right: var(--cs-abstand-2);
}

/* Erst ab 480px. Die 24px trennen ein Feld von der NAECHSTEN Beschriftung -
   das ergibt nur Sinn, solange beide nebeneinander stehen. Darunter ist die
   Leiste ein zweispaltiges Raster, die naechste Beschriftung steht DARUNTER,
   und die 24px verschmaelern nur das Feld: gemessen bei 390px im Umbuchen-
   Filter ein Auswahlfeld von 89px in einer 113px breiten Spalte. */
@container formular (min-width: 480px) {
  .cs-neu :is(#filterForm, .cs-filterbereich) table.filterTable > tbody > tr > td.filterCellContent:not(:last-child),
  .cs-neu :is(#filterForm, .cs-filterbereich) table.filterTable > tr > td.filterCellContent:not(:last-child) {
    padding-right: var(--cs-abstand-5);
  }
}

/* ---- Beschriftungen in der Tabellenform gleich hoch ----------------------
   Vom Betreiber gemeldet: "der abstand vom filter Tour-Namen stimmt nicht mit
   den anderen filter-titeln überein". Gemessen: "Tour-Name" hatte
   padding-top 8px, alle sechs anderen 16px.

   Das ist im GESTAPELTEN Zustand richtig und Absicht: dort steht die
   Beschriftung UEBER ihrem Feld, die 16px trennen die Paare, und die
   allererste Beschriftung der Tabelle braucht weniger, weil ueber ihr nichts
   steht (Regel "Beschriftung ueber ihrem Feld" samt :first-child-Ausnahme).

   In der TABELLENFORM der Filterleiste steht die Beschriftung NEBEN ihrem
   Feld. Der Abstand trennt dort nichts, er schiebt die Beschriftung nur nach
   unten - und die Ausnahme fuer die erste Zeile wird als schiefe Zeile
   sichtbar. Hier gilt darum symmetrisch 4px oben und unten; die Beschriftung
   sitzt damit ueber vertical-align: middle mittig zum 44px hohen Feld.

   Erst ab 480px: darunter ist die Filterzeile ein zweispaltiges Raster, in dem
   die Beschriftung wieder UEBER ihrem Feld steht - dort sind die 16px richtig.
   Die ID schlaegt beide Bestandsregeln (0,2,1) und (0,2,4). */
@container formular (min-width: 480px) {
  .cs-neu :is(#filterForm, .cs-filterbereich) table.filterTable > tbody > tr > td.filterCellHeader,
  .cs-neu :is(#filterForm, .cs-filterbereich) table.filterTable > tr > td.filterCellHeader {
    padding-top: var(--cs-abstand-1);
    padding-bottom: var(--cs-abstand-1);
  }
}

/* Der Such-Ausloeser sitzt in der Luecke der letzten Filterzeile, rechts.

   Der Selektor spiegelt bewusst die Struktur der Bestandsregel
   (.cs-neu table.filterTable > tbody > tr > td { text-align: left }, (0,2,4)).
   Ein kuerzeres .cs-neu td.cs-filter-ausloeser (0,2,1) verliert dagegen - die
   Lupe blieb dann linksbuendig in ihrer 332px breiten Spalte stehen. */
.cs-neu table.filterTable > tbody > tr > td.cs-filter-ausloeser,
.cs-neu table.filterTable > tr > td.cs-filter-ausloeser {
  text-align: right;
  vertical-align: bottom;
}

/* ---- Filterleiste auf dem Handy: Paare zweispaltig -----------------------
   Unter 480px steht der Filter gestapelt (Block darueber). Jedes Paar aus
   Beschriftung und Feld nahm dort eine ganze Breite ein - 15 Felder ergaben
   980px Hoehe. Vom Betreiber gemeldet: "die selects können alle in zwei
   spalten, vor-/zuname auch, kkundennr und buchung auch".

   Jede Filterzeile traegt genau ZWEI Paare (Beschriftung, Feld, Beschriftung,
   Feld). Mit zwei Rasterzeilen und spaltenweiser Fuellung landet automatisch
   das richtige Paar untereinander:
     Zelle 1 -> Zeile 1 Spalte 1   (Beschriftung links)
     Zelle 2 -> Zeile 2 Spalte 1   (ihr Feld)
     Zelle 3 -> Zeile 1 Spalte 2   (Beschriftung rechts)
     Zelle 4 -> Zeile 2 Spalte 2   (ihr Feld)
   Also: Kundennummer neben Buchungsnummer, Vorname neben Rechnungsnummer,
   Nachname neben Zahlungsart, Stadt neben Bezahlt. Ohne Markup-Aenderung.

   Spezifitaet: die Stapelregel ist .cs-neu table.filterTable > tbody > tr
   (0,2,3). Mit #filterForm kommt diese hier auf (1,2,3) und gewinnt. */
@container formular (max-width: 479px) {

  .cs-neu :is(#filterForm, .cs-filterbereich) table.filterTable > tbody > tr,
  .cs-neu :is(#filterForm, .cs-filterbereich) table.filterTable > tr {
    display: grid;
    grid-template-rows: auto auto;
    grid-auto-flow: column;
    grid-auto-columns: minmax(0, 1fr);
    column-gap: var(--cs-abstand-3);
    align-items: start;
  }

  /* Die Datumszeilen behalten die VOLLE Breite: dort stecken drei
     Auswahlfelder (Tag, Monat, Jahr) in EINER Zelle. In halber Handybreite
     blieben je rund 55px - unbrauchbar. Erkannt daran, dass eine Zelle
     mehr als ein Auswahlfeld enthaelt. */
  .cs-neu :is(#filterForm, .cs-filterbereich) table.filterTable > tbody > tr:has(td select:nth-of-type(2)),
  .cs-neu :is(#filterForm, .cs-filterbereich) table.filterTable > tr:has(td select:nth-of-type(2)) {
    display: block;
  }

  /* Auch hier muss die :first-child-Ausnahme weg. Sie gibt der allerersten
     Beschriftung der Tabelle 8px oben statt 16px - im gestapelten Zustand
     richtig, weil ueber ihr nichts steht. In DIESEM Raster steht "Tour-Name"
     aber neben "Stadt" in derselben Rasterzeile: die Zellen beginnen gleich
     hoch (gemessen beide bei y=136), der TEXT darin sitzt dann 8px versetzt.
     Gemeldet als "der abstand vom filter Tour-Namen stimmt nicht mit den
     anderen filter-titeln überein". */
  .cs-neu :is(#filterForm, .cs-filterbereich) table.filterTable > tbody > tr:first-child > td.filterCellHeader:first-child,
  .cs-neu :is(#filterForm, .cs-filterbereich) table.filterTable > tr:first-child > td.filterCellHeader:first-child {
    padding-top: var(--cs-abstand-4);
  }

  /* Im Umbuchen-Filter steht die Lupe in einer Zeile, die BEREITS zwei
     vollstaendige Paare enthaelt - macht fuenf Zellen. Die spaltenweise
     Fuellung erzeugte daraus fuenf gleich breite Spalten zu je 90px, und der
     Guide-Select bekam davon 66px. Gemeldet: "select für tour-guide kann 50%
     erhalten, ist sehr schmal aktuell".

     Zwei Haelften plus eine Spalte, die nur so breit ist wie die Lupe.

     Gilt seit der Gutscheinuebersicht auch fuer #filterForm: dort steht die
     Lupe ebenfalls unten im Filter, neben der Rechnungsnummer. In den uebrigen
     Listenansichten sitzt sie weiter oben in der Ueberschrift - dort trifft
     der Selektor auf keine Zeile und die Regel bleibt wirkungslos. */
  .cs-neu :is(#filterForm, .cs-filterbereich) table.filterTable > tbody > tr:has(> td.cs-filter-ausloeser),
  .cs-neu :is(#filterForm, .cs-filterbereich) table.filterTable > tr:has(> td.cs-filter-ausloeser) {
    grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) auto;
    grid-auto-columns: auto;
  }

  /* Die 24px Innenabstand rechts trennen ein Feld von der NAECHSTEN
     Beschriftung - das ist in der Tabellenform richtig, wo beide nebeneinander
     stehen. Im Raster steht die naechste Beschriftung DARUNTER; die 24px
     verschmaelern dort nur das Feld. Gemessen bei 390px: Select 89px in einer
     113px breiten Spalte. Ohne den Abstand nutzt er die Spalte ganz.
     Die Regel dafuer steht hier nicht, sondern bei der 24px-Regel selbst -
     sie gilt jetzt erst ab 480px. */

  /* Die Lupe unten ausrichten. Vom Betreiber gefragt: "kann die lupe mobil
     unten ausgerichtet werden?"

     Sie sitzt in der Luecke der letzten Filterzeile, neben dem Paar
     "Tour-Guide Anmeldung" - und das ist ZWEI Rasterzeilen hoch
     (Beschriftung oben, Feld darunter). Die spaltenweise Fuellung setzt die
     Lupe in Rasterzeile 1, also auf Hoehe der BESCHRIFTUNG: gemessen bei
     390px stand sie bei y=708, waehrend das Auswahlfeld daneben bis 812
     reichte.

     Das vorhandene vertical-align: bottom an .cs-filter-ausloeser hilft hier
     nicht - in einem Raster ist die Eigenschaft ohne Wirkung. Sie spannt
     darum ueber beide Rasterzeilen und richtet sich an deren Ende aus, womit
     ihre Unterkante auf der des Feldes liegt.

     grid-row: 1 / -1 statt align-self allein: ohne die Spannung waere die
     Zelle nur so hoch wie Rasterzeile 1, und "unten" waere die Unterkante
     der Beschriftung. */
  .cs-neu :is(#filterForm, .cs-filterbereich) table.filterTable > tbody > tr > td.cs-filter-ausloeser,
  .cs-neu :is(#filterForm, .cs-filterbereich) table.filterTable > tr > td.cs-filter-ausloeser {
    grid-row: 1 / -1;
    align-self: end;
  }
}

/* ==========================================================================
   Meldungskasten, Ergebnisblock (Buchhaltung > Rechnungen)
   ==========================================================================
   .cs-meldung ist der allgemeine Kasten und wird ausserhalb der Rechnungen
   mitbenutzt - etwa in der Tournamen-Liste fuer den Hinweis, dass Ziehen die
   eigene Reihenfolge voraussetzt. Nur der Modifikator --fehler faerbt.

   Die Ansicht zeigt EIN Ergebnis, keine Liste: wie viele Rechnungen im
   gewaehlten Zeitraum liegen, und einen Knopf zum Versenden. Im Bestand stand
   dafuer eine <table class="resultTable"> mit einer Zeile und drei Zellen.

   Die Fehlermeldung teilt Farbe und Bauform mit .disabledBooking weiter oben -
   dort haengt sie an einem Bestands-Klassennamen, den ich fuer einen anderen
   Zweck nicht mitbenutzen wollte. #8a3b00 kommt auf 7.8:1 gegen Weiss; reines
   Rot schafft nur 4.0:1. Alle Angaben in PIXELN. */
.cs-neu .cs-meldung {
  display: flex;
  flex-direction: column;
  gap: var(--cs-abstand-2);
  margin: 0 0 var(--cs-abstand-4);
  padding: var(--cs-abstand-3) var(--cs-abstand-4);
  border: 1px solid currentColor;
  border-left-width: 4px;
  border-radius: var(--cs-radius);
  background: var(--cs-flaeche);
}
.cs-neu .cs-meldung--fehler { color: #8a3b00; }
.cs-neu .cs-meldung h3 {
  margin: 0;
  font-size: var(--cs-schrift-normal);
}

/* Zahl und Knopf nebeneinander, sobald Platz ist - auf dem Handy
   untereinander, damit die Zahl nicht auf zwei Zeichen zusammenschrumpft. */
.cs-neu .cs-ergebnis {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--cs-abstand-3);
  margin: var(--cs-abstand-3) 0;
  padding: var(--cs-abstand-3) var(--cs-abstand-4);
  border: 1px solid var(--cs-linie);
  border-radius: var(--cs-radius);
  background: var(--cs-flaeche);
}
.cs-neu .cs-ergebnis__zahl {
  flex: 1 1 200px;
  margin: 0;
  font-size: var(--cs-schrift-normal);
}
.cs-neu .cs-ergebnis__zahl span {
  font-size: var(--cs-schrift-gross);
  font-weight: 700;
}

/* Die beiden Datumsfelder sind jQuery-UI-Datepicker und erwarten dd.mm.yyyy -
   darum KEIN <input type="date">, das wuerde ein anderes Format an
   invoices_check() liefern. Sie bekommen aber die Zielhoehe und duerfen die
   Zelle fuellen, statt in Bestandsbreite dazustehen. */
.cs-neu #contentContent .datepicker {
  min-height: var(--cs-ziel);
  max-width: 200px;
  width: 100%;
}

/* ==========================================================================
   Ankreuzfelder als Gitter
   ==========================================================================
   Betreiber zu "Tour-Guide bearbeiten": "könnten doch die sprachen und städte
   zwei- bis dreispaltig sein".

   Vorher stand dort <input> Text <br/> - eine Spalte, und anklickbar war nur
   das rund 22px grosse Kaestchen. Der Name daneben war blosser Text.

   Das <label> um beides macht die ganze Zeile zum Ziel; die Mindesthoehe von
   44px ist dieselbe Trefferflaeche wie ueberall im Admin. Das Gitter richtet
   sich nach dem PLATZ statt nach einer festen Spaltenzahl.

   130px Mindestbreite, NICHT 150: auf dem Schreibtisch steht das Formular
   vierspaltig (Beschriftung|Feld|Beschriftung|Feld), die Feldzelle ist bei
   1280px Fenster darum nur 285px breit. Mit 150px kamen dort zwei Spalten
   nicht unter (2x150 > 285) und es blieb einspaltig - gemessen. 130px
   reichen: laengste Beschriftung 14 Zeichen (Sprachen) bzw. 12 (Staedte),
   dazu 18px Kaestchen und 8px Abstand.

   Alle Angaben in PIXELN. */
.cs-neu .cs-ankreuzgitter {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(130px, 1fr));
  gap: 0 var(--cs-abstand-3);
}

.cs-neu .cs-ankreuz {
  display: flex;
  align-items: center;
  gap: var(--cs-abstand-2);
  min-height: var(--cs-ziel);
  cursor: pointer;
}

/* Das Kaestchen selbst bleibt, wie der Browser es zeichnet - nur nicht mehr
   zusammengequetscht: ohne feste Groesse schrumpft es in einem Flex-Element. */
.cs-neu .cs-ankreuz input[type="checkbox"] {
  flex: none;
  width: 18px;
  height: 18px;
  margin: 0;
}

/* ---- Vorschaubilder in Formularen ---------------------------------------
   Gemeldet: "in tourbeschreibung-bearbeiten ist das titelbild mobil nicht
   verkleinert". Es trug style="max-width: 600px" fest am Element und stand
   damit bei 390px Geraetebreite 600px breit da - abgeschnitten, weil .cs-neu
   clippt.

   600px bleibt die Obergrenze (das Bild wird in der Uebersicht mit 640x370
   gezeigt, groesser bringt nichts), aber die Zelle deckelt jetzt zuerst. */
.cs-neu .cs-vorschaubild {
  display: block;
  width: auto;
  max-width: min(100%, 600px);
  height: auto;
}

/* ---- Summentabelle der Abrechnung ---------------------------------------
   Siebzehn Spalten mit Zahlen - eine Matrix, die man in Zeilen UND Spalten
   liest. Sie wird darum nicht zur Karte, sondern darf seitwaerts rollen; das
   uebernimmt der umgebende .resultContainer.

   Vorher stand an JEDER Zelle ein style="border: 1px solid black" und
   align="right". Das Schwarz war der einzige Rahmen im ganzen Admin, der
   nicht --cs-linie benutzte. Alle Angaben in PIXELN. */
.cs-neu .cs-summentabelle {
  border-collapse: collapse;
  /* Ohne feste Mindestbreite quetscht der Rollbehaelter die Spalten auf
     Zeichenbreite, statt rollen zu lassen. */
  min-width: max-content;
}
/* Knappes Polster: bei SIEBZEHN Spalten summiert sich jedes Pixel. Mit
   abstand-3 waagerecht wuchs die Tabelle von 967 auf 1530px und rollte auch
   auf dem Schreibtisch; mit abstand-1 bleibt sie unter 1000 und passt dort
   wieder ohne Rollen. */
.cs-neu .cs-summentabelle th,
.cs-neu .cs-summentabelle td {
  padding: var(--cs-abstand-1) var(--cs-abstand-2);
  border: 1px solid var(--cs-linie);
  text-align: right;
  white-space: nowrap;
}
.cs-neu .cs-summentabelle th {
  background: var(--cs-flaeche-leise);
  font-weight: 700;
}
/* Der Guide-Name ist keine Zahl - und die einzige Spalte, die umbrechen darf.
   Die Zahlenspalten muessen zusammenbleiben. */
.cs-neu .cs-summentabelle td:first-child,
.cs-neu .cs-summentabelle th:first-child {
  text-align: left;
  white-space: normal;
}
.cs-neu .cs-summentabelle td.cs-summe { font-weight: 700; }

/* ==========================================================================
   Galeriebilder als Raster
   ==========================================================================
   Betreiber: "mindestens zwei-spaltig oder drei-spaltig. die bilder haben
   schon eine lightbox, die dürfen also auch kleiner in der liste angezeigt
   werden."

   Vorher je Bild ein 170x220px-Kasten mit float: left. Gemessen an Galerie
   4705 (48 Bilder) bei 390px: EIN Bild je Zeile, Seitenhoehe 14046px, Seite
   lief auf 472px ueber.

   auto-fill mit 100px Mindestbreite: bei 310px Innenbreite drei Spalten, auf
   dem Schreibtisch entsprechend mehr. Alle Angaben in PIXELN. */
.cs-neu .cs-bildgitter {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));
  gap: var(--cs-abstand-2);
}

.cs-neu .cs-bildkachel {
  margin: 0;
  border-radius: var(--cs-radius);
  overflow: hidden;
  background: #000;
}

/* Quadratische Kachel: hoch- und querformatige Bilder fuellen dieselbe
   Flaeche. Das ersetzt die <table>, mit der liegende Bilder frueher senkrecht
   zentriert wurden. Das ganze Bild zeigt die Lightbox. */
.cs-neu .cs-bildkachel__verweis { display: block; }
.cs-neu .cs-bildkachel__bild {
  display: block;
  width: 100%;
  aspect-ratio: 1 / 1;
  object-fit: cover;
}

/* Die Leiste liegt UEBER dem unteren Bildrand, nicht darunter - sonst waere
   die Kachel bei drei Spalten zur Haelfte Bedienelement. */
.cs-neu .cs-bildkachel__leiste {
  display: flex;
  justify-content: space-around;
  align-items: center;
  gap: 2px;
  padding: 2px;
  background: rgba(0, 0, 0, .55);
}

.cs-neu .cs-bildkachel__knopf,
.cs-neu .cs-bildkachel__wahl {
  flex: 1 1 0;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: var(--cs-ziel);
  padding: 0;
  border: 0;
  border-radius: var(--cs-radius);
  background: none;
  color: #fff;
  font-size: var(--cs-schrift-normal);
  cursor: pointer;
}
.cs-neu .cs-bildkachel__knopf:hover,
.cs-neu .cs-bildkachel__wahl:hover { background: rgba(255, 255, 255, .18); }

/* Warnfarbe auf dunklem Grund: #ff8a4c statt #8a3b00, das auf Schwarz
   nicht traegt. */
.cs-neu .cs-bildkachel__knopf--warnung { color: #ff8a4c; }

/* Das Radiofeld selbst ist unsichtbar - sichtbar ist der Stern, und der
   zeigt durch seine Fuellung, ob dieses Bild die Vorschau ist. */
.cs-neu .cs-bildkachel__wahl input {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: -1px;
  overflow: hidden;
  clip-path: inset(50%);
}
.cs-neu .cs-bildkachel__wahl:has(input:checked) {
  color: var(--cs-gruen-hell);
}
.cs-neu .cs-bildkachel__wahl:has(input:checked) i { font-weight: 900; }

/* Sichtbarer Fokus - auf schwarzem Grund braucht es einen hellen Ring. */
.cs-neu .cs-bildkachel__knopf:focus-visible,
.cs-neu .cs-bildkachel__wahl:has(input:focus-visible) {
  outline: 2px solid #fff;
  outline-offset: -2px;
}

/* ==========================================================================
   Zustandszeichen statt Bitmaps
   ==========================================================================
   Drei Stellen trugen Zustaende als Bild: die Gutschein-Pruefung beim Anlegen
   einer Buchung (accept/exclamation/spacer), die Sanduhr am angefragten Guide
   im Kalender und der Haken auf dem gewaehlten Tag im Mehrtage-Waehler.

   Allen dreien fehlte eine Beschriftung - man sah ein Symbol und musste
   raten. Das Zeichen kommt jetzt aus der Hausschrift, der Text steht im title
   und in einer nur-sr-Zeile daneben.

   FARBE ALLEIN TRAEGT DIE AUSSAGE NICHT: Haken und Ausrufezeichen sind auch
   ohne Farbunterscheidung verschiedene Formen. */
.cs-neu .cs-pruefzeichen {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: var(--cs-ziel);
  min-height: var(--cs-ziel);
}
.cs-neu .cs-pruefzeichen::before {
  font-family: "Font Awesome 5 Pro";
  font-weight: 900;
  font-size: var(--cs-schrift-gross);
  line-height: 1;
}
/* \f058 = check-circle, \f06a = exclamation-circle. #4a6b0a und #8a3b00
   sind dieselben Werte wie am Hausknopf und am Warnabzeichen - beide ueber
   7:1 auf Weiss. Das gruene #5c5 aus screen.css schafft nur 1.8:1. */
.cs-neu .cs-pruefzeichen[data-stand="gut"]::before    { content: "\f058"; color: #4a6b0a; }
.cs-neu .cs-pruefzeichen[data-stand="fehler"]::before { content: "\f06a"; color: #8a3b00; }
.cs-neu .cs-pruefzeichen[data-stand="leer"]::before   { content: ""; }

/* Sanduhr am angefragten Guide - sie stand vorher absolut positioniert
   halb ueber dem Namen. */
.cs-neu .cs-angefragt {
  display: inline-flex;
  align-items: center;
  margin-left: var(--cs-abstand-2);
  color: #8a3b00;
}

/* Haken auf dem gewaehlten Tag im Mehrtage-Waehler. Die Bitmap war ueber
   negative Raender in die Zellenecke gezogen; hier genuegt die Verankerung. */
.cs-neu .cs-tagmarke {
  position: absolute;
  top: 2px;
  left: 2px;
  color: var(--cs-gruen-dunkel);
  font-size: var(--cs-schrift-normal);
}

/* ---- Ankreuzfeld allein in seiner Zelle ----------------------------------
   Die meisten Kaestchen im Admin sitzen in einem <label>, das Kaestchen UND
   Text umschliesst (.cs-ankreuz, .cs-guidewahl) - das Label traegt dann die
   Trefferflaeche, gemessen 44 bis 164px breit und 44px hoch. Das Kaestchen
   selbst darf dabei ruhig 22px bleiben.

   Vier Kaestchen im ganzen Admin haben kein solches Label um sich, weil ihre
   Beschriftung in der NACHBARZELLE des Formulars steht: guide_showabout und
   die drei Schalter in tournamen-bearbeiten. Gemessen bei 390px: 22x22 bzw.
   40x22 - die drei letzten hatten style="width:40px" am Element, was nur die
   Breite aufblies, nicht die Hoehe.

   Ein <label for> ist jetzt an allen vieren; damit ist der Text antippbar.
   Das Kaestchen daneben bleibt aber ein 22px-Ziel, und genau danach tippt
   man. Auf schmalen Geraeten bekommt es deshalb die volle Zielgroesse.

   NUR unter 880px: auf dem Schreibtisch wuerde ein 44px hohes Kaestchen jede
   Formularzeile auseinandertreiben, und dort zielt eine Maus genau.
   Alle Angaben in PIXELN (siehe oben). */
@container formular (max-width: 880px) {
  .cs-neu #saveForm td.filterCellContent > input[type=checkbox] {
    width: var(--cs-ziel);
    height: var(--cs-ziel);
  }
}

/* ---------------------------------------------------------------------------
   Nur-Lese-Werte und Feldhinweise ("Eigene Daten", 2026-08-22)
   ---------------------------------------------------------------------------
   Auf "Eigene Daten" stehen Angaben, die ein Guide sehen, aber nicht aendern
   darf: Vor- und Nachname, Geburts- und Eintrittsdatum, Bank und IBAN. Zuschnitt
   des Betreibers - an der Bankverbindung haengt die Auszahlung.

   BEWUSST KEIN gesperrtes Eingabefeld (<input disabled>): das sieht aus wie
   etwas, das man aufbekommen koennte, und faellt aus der Tastaturreihenfolge,
   ohne vorgelesen zu werden. Ein reiner Text ist ehrlicher.

   Die Sperre selbst liegt NICHT hier. SettingsController::profilSpeichern()
   liest diese Felder gar nicht erst aus dem Antrag; CSS ist Darstellung, kein
   Schutz. */
.cs-neu #saveForm .filterCellContent.cs-nurlesen {
  color: var(--cs-text-leise);
  font-size: var(--cs-schrift-feld);
  /* Auf der Grundlinie der Nachbarfelder bleiben: ein Eingabefeld traegt Rahmen
     und Innenabstand, ein blosser Text nicht. Ohne das saesse der Wert hoeher
     als das Feld daneben. */
  padding-top: calc(var(--cs-abstand-2) + 1px);
  padding-bottom: calc(var(--cs-abstand-2) + 1px);
}

/* Kurze Erlaeuterung UNTER einem Feld - etwa der Hinweis, dass an die
   persoenliche Adresse die Tourpost geht. Nicht als title-Attribut: das
   erscheint am Handy nie, und 94 % der Guides sind am Handy. */
.cs-neu #saveForm .cs-feldhinweis {
  margin-top: var(--cs-abstand-1);
  color: var(--cs-text-leise);
  font-size: var(--cs-schrift-klein);
  line-height: 1.4;
}

/* ---------------------------------------------------------------------------
   Feldbreiten auf dem Schreibtisch (2026-08-22)
   ---------------------------------------------------------------------------
   Betreiber: "die feldgrößen auf .../user/tourguide-bearbeiten sind eine
   katastrophe". Nachgemessen bei 1355px Fenster:

     inputTextShort  (PLZ)            92px Feld in  881px Zelle -> 789px leer
     inputTextMedium (E-Mail, Strasse) 140px Feld in 881px Zelle -> 741px leer
     inputTextMedium (Name, Telefon)   140px Feld in 363px Zelle -> 223px leer
     inputTextLong                     355px Feld in 363px Zelle ->   8px leer

   Ursache: screen.css gibt Medium 140px und Short 60px FEST, waehrend Long
   bereits width:100% traegt. Die Regel "Felder fuellen die Breite" weiter oben
   raeumt das auf - sie steht aber in der Medienabfrage fuer den gestapelten
   Zustand und greift auf dem Schreibtisch nie.

   Hier dieselbe Idee fuer breite Fenster, aber MIT Deckel: ein Namensfeld ueber
   die ganze 881px-Zelle zu ziehen waere die andere Uebertreibung. Das Feld
   folgt der Zelle bis zu einer Breite, die zum Inhalt passt.

   Bewusst an #saveForm gebunden: die drei Klassen stecken in 8 bis 21 Ansichten
   (auch in Filterleisten und Listen). Diese Regel soll die Bearbeitungs-
   formulare treffen, nicht jedes Vorkommen im Haus.

   In rem, nicht px - die Deckel richten sich nach der Schriftgroesse, weil sie
   von der Textlaenge herruehren, nicht von der Geraetebreite. */
/* @container, NICHT @media - die ganze Datei misst den CONTAINER, nicht das
   Fenster. Mein erster Entwurf nahm eine Medienabfrage; beide Schwellen liegen
   bei 880, aber der Container ist wegen der Seitenleiste schmaler als das
   Fenster. Dazwischen gab es ein Band, in dem die Zeilen schon gestapelt waren
   und die Schreibtisch-Deckel trotzdem galten.

   Nebenbei die Falle, die dabei auffiel: in einer @media-Abfrage bezieht sich
   rem auf die ANFANGSGROESSE (16px), in einer Deklaration dagegen auf die
   Wurzelgroesse (hier 12px). 55rem waren als Schwelle also 880px, waehrend
   max-width: 22rem 264px ergibt. Darum steht die Schwelle jetzt in Pixeln. */
@container formular (min-width: 881px) {

  /* EIN Deckel fuer alle - das ist der Punkt.
     Betreiber: "geht die ausrichtung noch einheitlich".

     Gemessen war das Zellraster schon buendig (jede Zeile beginnt bei 289 und
     445; vierspaltige zusaetzlich bei 807 und 963). Ungleich waren die RECHTEN
     Kanten: in den breiten colspan-Zellen stand die E-Mail 384px breit, die
     Strasse 288px, in den schmalen Zellen 288px. Das kam von meinem ersten
     Entwurf, der einzelnen Feldern einen groesseren Deckel gab.

     Damit alle Felder auf derselben Linie enden, muss der Deckel KLEINER sein
     als die schmalste Zelle (363px). 22rem = 352px erfuellt das: in der
     schmalen Zelle greift die Zellbreite, in der breiten der Deckel - beide
     Male dieselbe Kante. */
  .cs-neu #saveForm table.filterTable td > input[type=text],
  .cs-neu #saveForm table.filterTable td > input[type=password],
  .cs-neu #saveForm table.filterTable td > select,
  .cs-neu #saveForm table.filterTable td > textarea,
  .cs-neu #saveForm table.filterTable td > *:not(table) > input[type=text],
  .cs-neu #saveForm table.filterTable td > *:not(table) > input[type=password],
  .cs-neu #saveForm table.filterTable td > *:not(table) > select {
    width: 100%;
    box-sizing: border-box;
    max-width: 22rem;
  }

  /* Die PLZ-Ort-Zeile ist EIN Feld aus zwei Teilen und endet darum auf
     derselben Linie wie die anderen. Innen teilen sie sich nach .cs-plzort. */
  .cs-neu #saveForm table.filterTable td > .cs-plzort {
    max-width: 22rem;
  }
  .cs-neu #saveForm table.filterTable td > .cs-plzort > * {
    max-width: none;
  }

  /* Kurze, formgebundene Werte bleiben kurz: eine PLZ ist fuenfstellig, eine
     Anzahl zweistellig. Ein 352px breites Feld dafuer sieht aus, als koenne man
     mehr hineinschreiben. Das ist die einzige gewollte Ausnahme von der
     einheitlichen Kante. */
  .cs-neu #saveForm table.filterTable td > input.inputTextShort,
  .cs-neu #saveForm table.filterTable td > *:not(table) > input.inputTextShort {
    max-width: 7rem;
  }

  /* Ausnahme fuer Felder, deren INHALT die Breite verlangt: eine Adresse, ein
     Link. Als Klasse, nicht ueber die ID - eine ID-Regel gilt fuer genau ein
     Formular, und derselbe Fall kommt anderswo wieder (dieselbe Falle wie bei
     .cs-plzort, das erst an #zipCode hing).

     Betreiber zum Contao-Link: "bitte das input contao auf die ganze breite". */
  /* Das Element MUSS im Selektor stehen. Ohne das `input` hat die Regel ein
     Element weniger als die allgemeine darueber (…td > input[type=text]) und
     verliert - trotz zusaetzlicher Klasse. Genau derselbe Fehler wie bei
     .cs-plzort weiter oben; ich bin ein zweites Mal hineingelaufen. */
  .cs-neu #saveForm table.filterTable td > input.cs-breit,
  .cs-neu #saveForm table.filterTable td > select.cs-breit,
  .cs-neu #saveForm table.filterTable td > textarea.cs-breit,
  .cs-neu #saveForm table.filterTable td > *:not(table) > input.cs-breit,
  .cs-neu #saveForm table.filterTable td > *:not(table) > select.cs-breit {
    max-width: none;
  }

  /* Textfelder behalten die ganze Zelle. Der einheitliche Deckel gilt fuer
     EINGABEFELDER - ein Textfeld ist fuer Flaeche da, und 264px waeren fuer
     eine Langbeschreibung zu wenig. Der erste Entwurf deckelte sie mit und
     machte sie damit schmaler als vorher; das war ein Rueckschritt, kein
     Zugewinn an Ordnung. */
  .cs-neu #saveForm table.filterTable td > textarea {
    max-width: none;
    min-height: 7rem;
  }
}

/* ---------------------------------------------------------------------------
   "Datei auswaehlen" (2026-08-22)
   ---------------------------------------------------------------------------
   Betreiber: "das buttondesign von shortDescriptionImage und allen anderen
   'Datei auswählen' upload-buttons könnte noch modernisiert werden".

   Fuenf Felder im Haus: accidentPhoto (Unfallbericht), shortDescriptionImage
   (Tourbeschreibung), guide_uploadImage (Guide), dazu die beiden Galerie-
   Partials. Alle bekamen bisher den Systemknopf des Browsers - je nach Geraet
   grau, eckig, in Systemschrift, und auf dem Handy oft unter 30px hoch.

   Ueber ::file-selector-button, NICHT ueber ein verstecktes Feld mit
   danebenstehendem <label>. Der uebliche Trick (input verstecken, label
   gestalten) kostet die Tastaturbedienung und die Vorlesbarkeit, wenn man ihn
   nicht sehr sorgfaeltig macht - und er braucht Aenderungen in fuenf Ansichten
   plus zwei Partials. Das Pseudoelement braucht keine einzige.

   ::-webkit-file-upload-button steht als zweite Zeile dabei: die Kurzform ist
   die aeltere WebKit-Schreibweise. Beide zusammen decken auch aeltere Safari
   ab (Mindestziel iOS 16). Sie muessen GETRENNT stehen - kennt ein Browser
   einen Selektor der Liste nicht, verwirft er die ganze Regel. */
.cs-neu input[type="file"] {
  font-family: var(--cs-schrift-ui);
  font-size: var(--cs-schrift-klein);
  color: var(--cs-text-leise);
  /* Der Dateiname steht neben dem Knopf; ohne das klebt er daran. */
  line-height: var(--cs-ziel);
}

.cs-neu input[type="file"]::file-selector-button {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  /* Dieselbe Zielhoehe wie jeder andere Hausknopf - das war der zweite Mangel:
     der Systemknopf lag darunter und war am Handy schwer zu treffen. */
  min-height: var(--cs-ziel);
  margin-right: var(--cs-abstand-3);
  padding: 0 var(--cs-abstand-3);
  border: 1px solid #cfd8c0;
  border-radius: var(--cs-radius);
  background: #fff;
  font-family: var(--cs-schrift-ui);
  font-size: var(--cs-schrift-klein);
  color: #4a6b0a;
  cursor: pointer;
}

.cs-neu input[type="file"]::-webkit-file-upload-button {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: var(--cs-ziel);
  margin-right: var(--cs-abstand-3);
  padding: 0 var(--cs-abstand-3);
  border: 1px solid #cfd8c0;
  border-radius: var(--cs-radius);
  background: #fff;
  font-family: var(--cs-schrift-ui);
  font-size: var(--cs-schrift-klein);
  color: #4a6b0a;
  cursor: pointer;
}

.cs-neu input[type="file"]:hover::file-selector-button,
.cs-neu input[type="file"]:focus::file-selector-button {
  background: var(--cs-flaeche-leise);
}

/* Der Tastaturfokus liegt auf dem FELD, nicht auf dem Pseudoelement - der
   Rahmen gehoert darum auch dorthin, sonst sieht man beim Durchtabben nicht,
   wo man ist. */
.cs-neu input[type="file"]:focus-visible {
  outline: 2px solid var(--cs-gruen-dunkel);
  outline-offset: 2px;
}

/* ---------------------------------------------------------------------------
   Zeilen mit einem Textfeld oben ausrichten (2026-08-22)
   ---------------------------------------------------------------------------
   Betreiber zum Gaestebuch-Eintrag: "Tourtitel select oben ausrichten".

   Der Fall: eine Zeile traegt links ein sechszeiliges Textfeld und rechts ein
   einzeiliges Auswahlfeld. Tabellenzellen richten mittig aus, also stand das
   Auswahlfeld auf halber Hoehe des Textfeldes - neben seiner eigenen
   Beschriftung, die per Inline-Stil schon oben stand.

   Ueber :has(), nicht ueber Inline-Stile an den einzelnen Zellen: die Regel
   trifft damit JEDE Zeile mit einem Textfeld, auch die, die es noch nicht gibt.
   Kennt ein Browser :has() nicht, verwirft er die Regel und es bleibt beim
   heutigen Verhalten - kein Rueckschritt. (Mindestziel ist Safari iOS 16,
   :has() gibt es seit 15.4.)

   Nur Zeilen MIT Textfeld: alles oben auszurichten liesse einzeilige
   Beschriftungen neben ihren 44px hohen Feldern zu hoch stehen. */
.cs-neu #saveForm table.filterTable tr:has(textarea) > td {
  vertical-align: top;
}

/* ---------------------------------------------------------------------------
   Hochladeleiste der Galerie (2026-08-22)
   ---------------------------------------------------------------------------
   Betreiber: "bitte alle fileupload-buttonbar in einer schönen firmenfarbe und
   nichr mehr grau ... überall prüfen wo es verwendet wird".

   Geprueft: .fileinput-button steht in genau ZWEI Partials -
   partials/galleryupload.phtml (eingebunden in cms/editgallery.phtml:319) und
   partials/tourgalleryupload.phtml (NIRGENDS eingebunden, siehe todo.md).
   Im Bestand war die Leiste #ddd mit #999-Rahmen.

   ANDERER MECHANISMUS als bei den uebrigen Datei-Feldern: hier liegt ein
   <label class="fileinput-button"> ueber einem durchsichtigen Feld (jQuery
   File Upload). ::file-selector-button greift dort NICHT.

   ZURUECKHALTEND, nicht als Farbblock. Der erste Entwurf fuellte die ganze
   Leiste mit #007f00 - Betreiber: "nope, bitte etwas feinfühliger". Die Farbe
   traegt jetzt Rahmen und Schrift, die Flaeche bleibt eine leichte Toenung.
   Das ist auch die Hausform: .cs-knopf ist weiss mit gruener Schrift, gefuellt
   ist nur die Primaer-Variante.

   Nachgerechnet, nicht gegriffen:
     Schrift #007f00 auf #f2f7e6   4,76:1  reicht (>= 4,5)
     Rahmen  #007f00 auf #f2f7e6   4,76:1  deutlich sichtbar (>= 3)
     Toenung #f2f7e6 auf Weiss     1,09:1  eine Andeutung, kein Kasten
   Das mittlere Gruen kam als Rahmen nicht in Frage (2,86:1), das helle schon
   gar nicht - es traegt weisse Schrift nur mit 2,15:1 (eigener Punkt in
   todo.md fuer .cs-knopf--primaer).

   Gestrichelt, weil die Leiste zwei Dinge kann: anklicken ODER etwas
   hineinziehen. Genau das sagt ihr Text. Ein voller Rahmen sagte nur "Knopf".

   Layout NICHT umgebaut: das durchsichtige Feld im Label ist Klickflaeche und
   Ziel zugleich. Geaendert werden Farbe, Rahmen, Radius und die Zielhoehe. */
.cs-neu .fileupload-buttonbar {
  margin-bottom: var(--cs-abstand-3);
}

.cs-neu .fileinput-button {
  display: block;
  min-height: var(--cs-ziel);
  padding: var(--cs-abstand-3);
  border: 1px dashed var(--cs-gruen-dunkel);
  border-radius: var(--cs-radius);
  background-color: #f2f7e6;
  color: var(--cs-gruen-dunkel);
  font-family: var(--cs-schrift-ui);
  font-size: var(--cs-schrift-klein);
  text-align: center;
  cursor: pointer;
}

.cs-neu .fileinput-button:hover,
.cs-neu .fileinput-button:focus-within {
  background-color: #eaf2d9;
}

/* Das Feld liegt durchsichtig im Label - sein Fokusrahmen waere unsichtbar.
   Darum ans Label, sonst sieht man beim Durchtabben nicht, wo man steht. */
.cs-neu .fileinput-button:focus-within {
  outline: 2px solid var(--cs-gruen-dunkel);
  outline-offset: 2px;
}

/* ---------------------------------------------------------------------------
   Fortschrittsbalken des Uploads (2026-08-22)
   ---------------------------------------------------------------------------
   Betreiber: "ist ein 'progress' inital grau sichtbar, mach das auch etwas
   moderner".

   Zwei Maengel im Bestand (screen.css:198-220): der Balken steht auch dann da,
   wenn nichts laeuft - ein leerer grauer Kasten von 20px Hoehe -, und er traegt
   die Machart von damals: #f5f5f5 mit Innenschatten, #5cb85c als Fuellung.

   AUSBLENDEN, solange nichts laeuft: der Aufsatz setzt die Breite INLINE, und
   zwar erst beim ersten Fortschritt (progressall im Partial). Vorher hat der
   innere Balken KEIN style-Attribut - daran laesst er sich erkennen, ohne das
   JavaScript anzufassen. Nach dem Upload bleibt er auf 100% stehen; das ist
   gewollt, es ist die Rueckmeldung "fertig".

   Kennt ein Browser :has() nicht, bleibt der Balken sichtbar wie bisher -
   kein Rueckschritt. (Mindestziel Safari iOS 16, :has() gibt es seit 15.4.)

   Farbe wie bei der Hochladeleiste darueber: dunkles Firmengruen auf der
   leichten Toenung, 4,76:1 - gut sichtbar, ohne zu schreien. */
.cs-neu #progress:has(.progress-bar:not([style])) {
  display: none;
}

.cs-neu #progress.progress {
  height: 6px;
  margin: var(--cs-abstand-3) 0;
  border-radius: 999px;
  background-color: #f2f7e6;
  box-shadow: none;
  overflow: hidden;
}

.cs-neu #progress .progress-bar {
  height: 100%;
  border-radius: 999px;
  background-color: var(--cs-gruen-dunkel);
  box-shadow: none;
  /* Der Bestand animierte 0,6s linear. Etwas kuerzer und weicher wirkt
     unmittelbarer, ohne zu hetzen. */
  transition: width .25s ease-out;
}

@media (prefers-reduced-motion: reduce) {
  .cs-neu #progress .progress-bar { transition: none; }
}
