/*
 * Das Thema der Anwendung: stellt Bootstrap 5 auf Dichte und Erscheinung ein, die hier seit
 * jeher gelten.
 *
 * Bootstrap 5 ist für Webseiten gemacht und entsprechend großzügig: 16 px Grundschrift, 24 px
 * Zeilenhöhe, 38 px hohe Eingabefelder, helle Navigationsleiste. Diese Anwendung ist ein
 * Arbeitswerkzeug, in dem Formulare mit dreißig Feldern und Tabellen mit zwanzig Spalten normal
 * sind — mit den Vorgabewerten passt gut ein Drittel weniger auf den Bildschirm.
 *
 * Die Zahlen hier sind nicht geschätzt, sondern am Bootstrap-2-Stand gemessen (20.10.2026,
 * mandant/details):
 *
 *     Schrift        "Helvetica Neue", 14px, Zeilenhöhe 20px
 *     Eingabefeld    Innenabstand 4px 6px, Rahmen 1px #ccc, Radius 4px
 *     Feldgruppe     20px Abstand nach unten
 *     Beschriftung   14px, Gewicht 400, 120px breit, rechtsbündig
 *     Tabellenzelle  4px 5px
 *     Leiste         41px hoch, Hintergrund #1b1b1b
 *
 * Was bewusst von Bootstrap 5 bleibt: Fokusringe, Schatten, Abstufungen der Farben, die
 * Rasterlogik und die Barrierefreiheit. Es geht um Maße, nicht um einen Rückbau.
 */

:root {
    /* ---- Schrift ---- */
    --bs-font-sans-serif: "Helvetica Neue", Helvetica, Arial, sans-serif;
    --bs-body-font-family: var(--bs-font-sans-serif);
    --bs-body-font-size: 0.875rem;        /* 14px */
    --bs-body-line-height: 1.42857143;    /* 20px bei 14px */
    --bs-body-color: #333;
    --bs-body-bg: #fff;

    /* ---- Kanten ---- */
    --bs-border-radius: 0.25rem;          /* 4px, nicht 6px */
    --bs-border-radius-sm: 0.1875rem;
    --bs-border-radius-lg: 0.375rem;
    --bs-border-color: #ccc;
    --bs-border-color-translucent: #ddd;

    /* ---- Verweise ---- */
    --bs-link-color: #0088cc;
    --bs-link-hover-color: #005580;
    --bs-link-color-rgb: 0, 136, 204;
    --bs-link-hover-color-rgb: 0, 85, 128;

    /* ---- Hausfarbe ---- */
    --minerva-blau: #7BAAD4;
    --minerva-leiste: #1b1b1b;
    --minerva-leisten-hoehe: 3.5rem;
}

/* Überschriften.
 *
 * Bootstrap 5 skaliert h1 bis h3 mit der Fensterbreite (`calc(… + …vw)`), was auf einem breiten
 * Bildschirm riesige Zeilen ergibt. Feste Größen in der Staffelung der alten Oberfläche — dort
 * nachgemessen: h2 ist 31,5 px und fett, und das trägt die Seitenhierarchie. Ein erster Versuch
 * mit kleineren, mageren Überschriften hat die Seiten flach und zusammenhanglos wirken lassen. */
h1, .h1 { font-size: 2.40625rem; line-height: 2.5rem; }   /* 38,5 px */
h2, .h2 { font-size: 1.96875rem; line-height: 2.5rem; }   /* 31,5 px */
h3, .h3 { font-size: 1.53125rem; line-height: 2.5rem; }   /* 24,5 px */
h4, .h4 { font-size: 1.09375rem; line-height: 1.25rem; }  /* 17,5 px */
h5, .h5 { font-size: 0.875rem;   line-height: 1.25rem; }
h6, .h6 { font-size: 0.74375rem; line-height: 1.25rem; }

h1, .h1, h2, .h2, h3, .h3, h4, .h4, h5, .h5, h6, .h6 {
    font-weight: 700;
    color: inherit;
}

/* Legenden.
 *
 * Bootstrap 2 gab ihnen viel Luft und eine Trennlinie darunter; Bootstrap 5 nimmt beides weg,
 * womit eine Legende wie gewöhnlicher Text wirkt und der Abschnitt darunter an ihr klebt. Die
 * Werte stammen aus der alten Fassung: 21px auf 40px Zeile, 20px Abstand, Linie in #e5e5e5. */
legend {
    /* Auch nach oben Luft: die beiden Legenden der Anwendung (`mandant/_form.html`) beginnen
       jeweils einen Abschnitt unterhalb eines vorherigen Blocks und klebten sonst an dessen
       letzter Feldzeile. Am Anfang eines Formulars steht keine, das kann also nicht stören. */
    margin-top: 1.5rem;
    margin-bottom: 1.25rem;
    font-size: 1.3125rem;
    line-height: 2.5rem;
    color: #333;
    border-bottom: 1px solid #e5e5e5;
}

legend small {
    font-size: 0.9375rem;
    color: #999;
}


/* ---- Eingabefelder ------------------------------------------------------- */

.form-control,
.form-select {
    padding: 0.25rem 0.4375rem;           /* 4px 7px, wie zuvor */
    font-size: 0.875rem;
    line-height: 1.42857143;
    min-height: calc(1.42857143em + 0.5rem + 2px);
    color: #555;
    border-color: #ccc;
    border-radius: var(--bs-border-radius);
}

.form-select {
    padding-right: 1.75rem;
    background-size: 12px 9px;
}

.form-control:focus,
.form-select:focus {
    border-color: rgba(82, 168, 236, 0.8);
    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
}

.form-label {
    margin-bottom: 0.25rem;
    font-size: 0.875rem;
    font-weight: 400;
    color: #333;
}

.form-text {
    margin-top: 0.125rem;
    font-size: 0.8125rem;
}

.form-check-input {
    margin-top: 0.1875rem;
}

.input-group-text {
    padding: 0.25rem 0.4375rem;
    font-size: 0.875rem;
    /* Ohne das erbt der Zusatz Bootstraps Zeilenhöhe 1.5 — bei 14px sind das 21 statt 20 Pixel,
       und weil er der höchste Teil der Gruppe ist, zieht er das Feld daneben auf 31,2 px hoch.
       Felder in einer Zusatzgruppe waren dadurch einen Pixel höher als alle anderen. */
    line-height: 1.42857143;
    background-color: #eee;
    border-color: #ccc;
}


/* ---- Knöpfe -------------------------------------------------------------- */

.btn {
    --bs-btn-padding-y: 0.25rem;
    --bs-btn-padding-x: 0.75rem;
    --bs-btn-font-size: 0.875rem;
    --bs-btn-line-height: 1.42857143;
    --bs-btn-border-radius: var(--bs-border-radius);
}

.btn-sm {
    --bs-btn-padding-y: 0.125rem;
    --bs-btn-padding-x: 0.5rem;
    --bs-btn-font-size: 0.75rem;
}

.btn-lg {
    --bs-btn-padding-y: 0.5rem;
    --bs-btn-padding-x: 1rem;
    --bs-btn-font-size: 1.0625rem;
}

/*
 * Der graue Standardknopf.
 *
 * In Bootstrap 2 war ein nacktes `.btn` genau das; in Bootstrap 5 ist ein `.btn` ohne Variante
 * durchsichtig und randlos und damit nicht als Knopf zu erkennen. An 84 Stellen im Markup steht
 * aber genau das und meint einen gewöhnlichen Knopf — „hochladen" beim Datei-Upload etwa.
 * Der Satz gilt deshalb für beides: für `.btn-secondary` und für ein `.btn` ohne Variante.
 *
 * Die Varianten sind einzeln ausgeschlossen und nicht über `[class*="btn-"]` — dieser
 * Platzhalter träfe auch `btn-sm`, `btn-icon` und `btn-mini`, also Größen- und Hausklassen.
 */
.btn-secondary,
.btn:not(.btn-primary):not(.btn-secondary):not(.btn-success):not(.btn-danger):not(.btn-warning):not(.btn-info):not(.btn-light):not(.btn-dark):not(.btn-link):not([class*="btn-outline-"]) {
    --bs-btn-color: #333;
    --bs-btn-bg: #f5f5f5;
    --bs-btn-border-color: #ccc;
    --bs-btn-hover-color: #333;
    --bs-btn-hover-bg: #e6e6e6;
    --bs-btn-hover-border-color: #bbb;
    --bs-btn-active-color: #333;
    --bs-btn-active-bg: #d9d9d9;
    --bs-btn-active-border-color: #bbb;
    --bs-btn-disabled-color: #999;
    --bs-btn-disabled-bg: #f5f5f5;
    --bs-btn-disabled-border-color: #ccc;
}

/* Knöpfe, die nur ein Symbol tragen, brauchen keine Textbreite.
 *
 * Die Zeilenhöhe ist kein Beiwerk: 16px Symbol auf 20px Zeile ergibt dieselbe Zeilenbox wie
 * 14px Text auf 1.42857, der Knopf wird also genauso hoch wie einer mit Beschriftung. Mit
 * `line-height: 1` war er 3px niedriger — im Fußbereich des Vorschau-Dialogs standen
 * „Download" und „Schließen" deshalb auf unterschiedlicher Höhe.
 */
.btn-icon {
    --bs-btn-padding-x: 0.5rem;
    font-size: 1rem;
    line-height: 1.25;
}

/* In der kleinen Fassung ist die Zeilenbox eines Textknopfes 17px hoch. Dort trifft das Symbol
   mit Zeilenhöhe 1 genau; 1.25 wäre drei Pixel zu hoch. */
.btn-sm.btn-icon {
    line-height: 1;
}


/* ---- Tabellen ------------------------------------------------------------ */

.table {
    --bs-table-bg: transparent;
    --bs-table-striped-bg: #f9f9f9;
    --bs-table-striped-color: #333;
    --bs-table-color: #333;
    margin-bottom: 1rem;
    font-size: 0.875rem;
}

.table > :not(caption) > * > * {
    padding: 0.5rem;                      /* 8px, wie .table in Bootstrap 2 */
    border-bottom-width: 0;
    border-top: 1px solid #ddd;
}

.table > thead > tr > * {
    border-top: 0;
    border-bottom: 2px solid #ddd;
    font-weight: 700;
    vertical-align: bottom;
}

/* table-condensed hieß früher so; 4px/5px ist dessen gemessene Dichte. */
.table-sm > :not(caption) > * > * {
    padding: 0.25rem 0.3125rem;
}

.table-hover > tbody > tr:hover > * {
    --bs-table-accent-bg: #f5f5f5;
    background-color: #f5f5f5;
}


/* Muss hinter der Zellenregel oben stehen: die gibt jeder Zelle eine obere Linie, und
   Bootstraps `table-borderless` nimmt nur die untere weg. */
.table-borderless td {
    border: none;
}

.table-no-head > tbody > tr:first-child > td {
    border: none;
}

/* Ausgewählte Zeile (`tr.active`). */
.table tbody tr.active td,
.table-striped tbody tr.active:nth-child(odd) td {
    background-color: #E0E0E0;
}

.table tbody tr.active:hover td {
    background-color: #E4E4E4;
}


/* ---- Navigationsleiste ---------------------------------------------------
 *
 * Hell, wie zuvor — und **nur im Development-Modus dunkel**.
 *
 * Das war ein Messfehler: die Leistenfarbe ist an der lokalen Instanz abgenommen worden, und
 * die läuft im Development-Modus. Dort hängt `Navbar.scala` ein `navbar-inverse` an, das in
 * Bootstrap 2 die dunkle Fassung war (#1b1b1b gegen #fafafa). Das Dunkel war also der
 * Entwicklungsstand, nicht der normale — produktiv hätte die Leiste ihre Farbe gewechselt,
 * und die Unterscheidung „bin ich auf Dev oder auf Produktion" wäre verloren gewesen.
 */
.navbar {
    --bs-navbar-padding-y: 0.5rem;
    --bs-navbar-brand-font-size: 1.25rem;
    --bs-navbar-nav-link-padding-x: 0.75rem;
    /* Die Farbvariablen gehören an die Leiste, nicht an den einzelnen Verweis: Bootstrap löst
       `--bs-navbar-color` schon an `.navbar-nav` zu `--bs-nav-link-color` auf. Am `.nav-link`
       gesetzt kommt sie zu spät und bleibt wirkungslos — die helle Leiste hatte dadurch weiße
       Verweise auf hellem Grund. */
    --bs-navbar-color: #777;
    --bs-navbar-hover-color: #333;
    --bs-navbar-active-color: #333;
    min-height: var(--minerva-leisten-hoehe);
    background-color: #fafafa;
    border-bottom: 1px solid #d4d4d4;
}

.navbar .nav-link {
    padding-top: 0.625rem;
    padding-bottom: 0.625rem;
    font-size: 0.875rem;
}

/* Die dunkle Fassung des Development-Modus. `navbar-inverse` kommt aus Navbar.scala, zusammen
   mit `data-bs-theme="dark"`, das die übrigen Farben von Bootstrap umstellt. */
.navbar.navbar-inverse {
    --bs-navbar-color: #999;
    --bs-navbar-hover-color: #fff;
    --bs-navbar-active-color: #fff;
    background-color: var(--minerva-leiste);
    border-bottom-color: #000;
}

.navbar .dropdown-menu {
    font-size: 0.875rem;
}

/* So hoch wie das Suchfeld daneben (.navbar-suche .input-group), sonst stehen auf schmalen
   Bildschirmen zwei verschieden hohe Kästen nebeneinander. */
.navbar-toggler {
    display: flex;
    align-items: center;
    height: 2.125rem;
    padding: 0 0.5rem;
    font-size: 1rem;
    border-color: #ccc;
    color: #777;
}

.navbar.navbar-inverse .navbar-toggler {
    border-color: #444;
    color: #bbb;
}


/* ---- Suche in der Leiste -------------------------------------------------
 *
 * Steht außerhalb des Collapse und bleibt deshalb auf jeder Breite sichtbar; siehe navbar5.html.
 * Sie schrumpft mit, verschwindet aber nicht.
 */
.navbar-suche {
    flex: 0 1 20rem;
    min-width: 7rem;
    margin: 0;
}

/* Unterhalb des Umbruchpunkts teilt sich die Suche die erste Zeile mit Burger, „Neu" und
   Avatar. Mit den vollen 20rem passt das auf einem Telefon nicht und die Leiste bricht auf zwei
   Zeilen um — dann steht sie 91 statt 57 Pixel hoch, und der Rumpf, dessen Abstand an der
   einzeiligen Höhe hängt, verschwindet darunter. */
@media (max-width: 767.98px) {
    .navbar-suche {
        flex: 1 1 10rem;
        max-width: 20rem;
        margin: 0 0.75rem;
    }
}

.navbar-suche .input-group {
    flex-wrap: nowrap;
    width: 100%;
}

/* Hell auf beiden Fassungen der Leiste.
   Auf der dunklen Leiste färbt `data-bs-theme="dark"` sonst auch das Eingabefeld dunkel, und ein
   fast schwarzes Feld auf fast schwarzem Grund ist als Feld nicht mehr zu erkennen.

   Der Rahmen sitzt an der Gruppe, nicht an Lupe und Feld einzeln. Zwei aneinanderstoßende Kästen
   mit je eigenem Rahmen sehen bei einem Browser-Zoom ungleich 100 % versetzt aus: die Randbreite
   ist dann keine ganze Zahl (bei 90 % sind es 1,111 px), und jeder Kasten rundet für sich auf ein
   Gerätepixel. Ein Rechteck kann diesen Versatz nicht haben. */
.navbar .navbar-suche .input-group {
    min-height: 2.125rem;
    overflow: hidden;
    background-color: #fff;
    border: 1px solid rgba(0, 0, 0, 0.18);
    border-radius: var(--bs-border-radius);
}

.navbar .navbar-suche .form-control,
.navbar .navbar-suche .input-group-text {
    min-height: 0;
    background-color: transparent;
    border: 0;
    border-radius: 0;
    color: #555;
}

.navbar .navbar-suche .input-group-text {
    padding-right: 0.5rem;
    color: #888;
}

.navbar .navbar-suche .form-control {
    min-width: 0;
    padding-left: 0.25rem;
}

.navbar .navbar-suche .form-control::placeholder {
    color: #999;
}

/* Die Umrandung gehört jetzt der Gruppe, also auch der Fokusrahmen. */
.navbar .navbar-suche .input-group:focus-within {
    border-color: rgba(82, 168, 236, 0.8);
    box-shadow: 0 0 6px rgba(82, 168, 236, 0.5);
}

.navbar .navbar-suche .form-control:focus {
    box-shadow: none;
}


/* ---- Anordnung in der Leiste ---------------------------------------------
 *
 * Im Markup steht die Suche vor dem Collapse, damit auf schmalen Bildschirmen die erste Zeile
 * stimmt: Burger, Suche, rechte Seite — und das Menü darunter. Oberhalb des Umbruchpunkts
 * gehört sie aber in die Mitte, deshalb hier die Reihenfolge über `order`.
 */
.navbar-rechts {
    display: flex;
    align-items: center;
    gap: 0.25rem;
    margin-left: auto;
}

@media (min-width: 768px) {
    .navbar .navbar-collapse { order: 1; }
    .navbar .navbar-suche    { order: 2; margin-left: auto; }
    .navbar .navbar-rechts   { order: 3; margin-left: 0.75rem; }
}


/* Der Platz des Ajax-Kreisels in der Leiste. */
.navbar-ajax-spinner {
    margin-top: 8px;
    float: right;
}


/* ---- Plakette „Dev" -------------------------------------------------------
 *
 * Steht im Markup als letztes in .navbar-rechts und gehört an den rechten Fensterrand, nicht an
 * den des Containers. Absolut bezieht sie sich auf die feste Leiste, also auf die volle Breite
 * ohne Scrollbar. Erst ab 1280px: darunter reicht der Rand neben dem 1170px-Container nicht für
 * die Plakette, und sie läge über dem Avatar — dort bleibt sie an ihrem Platz daneben.
 */
@media (min-width: 1280px) {
    .navbar .dev-badge {
        position: absolute;
        top: 50%;
        right: 0.5rem;
        transform: translateY(-50%);
        margin-left: 0 !important;
    }
}


/* Im Development-Modus setzt Body.scala `body-dev`: „Dev" als Wasserzeichen im Hintergrund. */
.body-dev {
    background-image: url('/images/dev-background.svg');
}


/* ---- Benutzer-Avatar -----------------------------------------------------
 *
 * Das Bild aus webapp/images/avatare/, und wenn es keines gibt, die Initialen in einem Kreis.
 * Die beiden liegen übereinander: das Bild deckt die Initialen ab, sobald es geladen ist. Fehlt
 * die Datei, antwortet der Server mit 404 und js/bs5.js nimmt das Bild heraus.
 */
/* Mit `.navbar` davor, sonst gewinnt `.navbar .nav-link` mit seinen 0.625rem und der 32px hohe
   Avatar macht die Leiste 13 Pixel höher als beabsichtigt. 4px über und unter dem Kreis ergeben
   dieselben 40px, die auch ein Menüeintrag hoch ist. */
.navbar .benutzer-knopf {
    display: flex;
    align-items: center;
    padding-top: 0.25rem;
    padding-bottom: 0.25rem;
}

.benutzer-avatar {
    position: relative;
    display: inline-block;
    width: 2rem;
    height: 2rem;
    flex: 0 0 auto;
}

.benutzer-initialen {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 100%;
    height: 100%;
    font-size: 0.75rem;
    font-weight: 700;
    line-height: 1;
    color: #fff;
    letter-spacing: 0.02em;
    background-color: var(--minerva-blau);
    border-radius: 50%;
}

.benutzer-bild {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
    border-radius: 50%;
}


/* ---- Auswahlmenüs -------------------------------------------------------- */

.dropdown-menu {
    --bs-dropdown-font-size: 0.875rem;
    --bs-dropdown-padding-y: 0.25rem;
    --bs-dropdown-item-padding-y: 0.1875rem;
    --bs-dropdown-item-padding-x: 1rem;
    --bs-dropdown-border-radius: var(--bs-border-radius-lg);
}


/* ---- Reiter -------------------------------------------------------------- */

.nav-tabs {
    --bs-nav-tabs-border-color: #ddd;
    --bs-nav-link-padding-y: 0.375rem;
    --bs-nav-link-padding-x: 0.75rem;
    --bs-nav-link-font-size: 0.875rem;
    --bs-nav-tabs-link-active-color: #555;
    --bs-nav-tabs-link-active-border-color: #ddd #ddd #fff;
    margin-bottom: 1rem;
}

/* Reiter werden über `data-bs-toggle` geschaltet und haben deshalb kein `href`. Für den Browser
   ist ein `<a>` ohne `href` aber kein Verweis — der Mauszeiger bliebe der Textcursor.
   Bewusst nicht als `a:not([href])` allgemein: diese Seite hat auch echte Sprungmarken
   (`<a name="files">`), und die sind nicht anklickbar.
   `.disabled` bleibt ausgenommen, damit Bootstraps `cursor: default` dort gilt. */
.nav-link:not([href]):not(.disabled):not(:disabled) {
    cursor: pointer;
}


/* ---- Dialoge ------------------------------------------------------------- */

.modal {
    --bs-modal-border-radius: var(--bs-border-radius-lg);
    --bs-modal-header-padding: 0.625rem 0.9375rem;
    --bs-modal-padding: 0.9375rem;
    --bs-modal-footer-gap: 0.3125rem;
}

.modal-title {
    font-size: 1.3125rem;
    font-weight: 400;
    line-height: 1.5;
}

.modal-footer {
    background-color: #f5f5f5;
    border-top: 1px solid #ddd;
}

/* Breite wie zuvor: 600 px statt der 500 px von Bootstrap 5, und `modal-wide` 900 px.
 *
 * `modal-wide` kommt aus `Modal.dialogClass` und landet als Zeichenkette am `.modal`-Element —
 * im Markup steht sie nirgends. Sie war deshalb beim Abgleich der Bootstrap-2-Klassen nicht zu
 * sehen und blieb undefiniert; der E-Mail-Dialog war dadurch 500 statt 900 px breit.
 *
 * Die Deckelung auf die Fensterbreite entspricht dem alten `max-width: calc(100% - 40px)`. */
.modal-dialog {
    max-width: min(600px, calc(100% - 2.5rem));
}

.modal.modal-wide .modal-dialog {
    max-width: min(900px, calc(100% - 2.5rem));
}

/* Der Dialogkörper scrollt in sich. Ohne das wächst der ganze Dialog über das Fenster hinaus —
   der E-Mail-Dialog kam auf 1534 px Höhe. Der Wert ist der der alten Fassung. */
.modal-body {
    max-height: calc(90vh - 180px);
    overflow-y: auto;
}

/* Die Überschrift im Dialogkopf trägt keine eigenen Abstände. */
.modal-header h3 {
    margin: 0;
    line-height: 30px;
}


/* Die Dateivorschau füllt den Rumpf: das iframe darin rechnet mit `height: 100%` und braucht
   deshalb eine Höhe in Pixeln — das `max-height` am Rumpf allein gibt ihm keine. Es schließt
   die Polsterung ein (border-box); die Vorschau ist um genau diese Polsterung kleiner, sonst
   rollt der Rumpf zusätzlich zur PDF-Ansicht. */
.modal-body > .file-preview {
    height: calc(90vh - 180px - 2 * var(--bs-modal-padding));
}

.modal-footer {
    text-align: left !important;
}

.modal-footer .btn-group + .btn,
.modal-footer .btn + .btn-group {
    margin-left: 5px;
}


/* ---- Hinweise ------------------------------------------------------------ */

.alert {
    --bs-alert-padding-y: 0.5rem;
    --bs-alert-padding-x: 0.875rem;
    --bs-alert-border-radius: var(--bs-border-radius);
    margin-bottom: 1rem;
}

/* Ein `.alert` ohne Variante war in Bootstrap 2 gelb und in Bootstrap 5 ist es farblos — also
   unsichtbar. Mehrere Stellen erzeugen genau das (`renderAlertBox` ohne Zusatzklasse), und sie
   meinen dort eine Warnung. */
.alert:not([class*="alert-"]) {
    --bs-alert-color: #c09853;
    --bs-alert-bg: #fcf8e3;
    --bs-alert-border-color: #fbeed5;
    color: var(--bs-alert-color);
    background-color: var(--bs-alert-bg);
    border-color: var(--bs-alert-border-color);
}

.badge {
    --bs-badge-padding-y: 0.1875em;
    --bs-badge-padding-x: 0.5em;
    --bs-badge-font-size: 0.75em;
    --bs-badge-font-weight: 700;
    --bs-badge-border-radius: var(--bs-border-radius-sm);
}



/* Der letzte Absatz und die letzte Liste in einem Hinweis tragen keinen Abstand nach unten. */
.alert p:last-child,
div .alert ul:last-child {
    margin-bottom: 0;
}


/* ---- Formularaufbau ------------------------------------------------------
 *
 * `control-group`, `control-label` und `controls` stammen aus Bootstrap 2, sind hier aber
 * bewusst geblieben und werden ab Etappe 5 als eigene Klassen der Anwendung geführt — nicht
 * als Altlast.
 *
 * Der Grund: Bootstrap 5 baut waagerechte Formulare über das Raster, also
 * `<div class="row mb-3"><label class="col-sm-4 col-form-label">…</label><div class="col-sm-8">`.
 * Bei einem Formular mit dreißig Feldern — und davon gibt es hier mehrere — ist das dreimal so
 * viel Markup für dasselbe Ergebnis, und die Spaltenaufteilung müsste je Seite von Hand
 * stimmen. Drei Klassennamen, hier einmal definiert, sind die ruhigere Lösung.
 *
 * Wer das Raster braucht, benutzt es: `.row` und `.col-*` funktionieren daneben unverändert.
 */

.control-group {
    margin-bottom: 0.75rem;
}

.control-group:last-child {
    margin-bottom: 0;
}

.control-label {
    display: inline-block;
    margin-bottom: 0.25rem;
    font-size: 0.875rem;
    color: #333;
}

/*
 * Waagerecht: Beschriftung links neben dem Feld, rechtsbündig.
 *
 * Als Raster und nicht als Flexbox — ein `display: flex` mit `flex-wrap` bricht um, sobald die
 * Spalte schmaler wird als Beschriftung plus Feld, und dann steht die Beschriftung plötzlich
 * über dem Feld statt daneben. Beim Umbau ist genau das passiert, in den engen Spalten des
 * Mandantenformulars. Ein Raster mit zwei festen Spuren kann das nicht.
 */
.form-horizontal .control-group {
    display: grid;
    grid-template-columns: 160px minmax(0, 1fr);
    gap: 0 1.25rem;
    align-items: start;
}

.form-horizontal .control-label {
    margin-bottom: 0;
    padding-top: calc(0.25rem + 1px);
    text-align: right;
}

.form-horizontal .controls {
    min-width: 0;
}

/* Die Knöpfe stehen unter den Feldern, nicht unter den Beschriftungen — die Leiste selbst
   bleibt über die volle Breite. Bootstrap 2 tat das über die Polsterung, und weil die Leiste nie
   in einer `.control-group` steht, ist sie hier auch kein Teil des Rasters. */
.form-horizontal .form-actions {
    padding-left: 180px;
}

.form-horizontal.form-horizontal-slim .form-actions {
    padding-left: 140px;
}

/* Gruppen ohne eigene Beschriftung stehen in der Feldspur, nicht über beiden.
 *
 * Betrifft genau eine Stelle: das Ankreuzfeld „Vorgang gelöscht" im Mandantenformular. Über
 * beide Spuren gezogen stand es am linken Rand der Spalte statt unter den Feldern; Bootstrap 2
 * rückte dafür jede `.controls` um 140px ein, auch die ohne Beschriftung daneben. */
.form-horizontal .control-group > .controls:only-child {
    grid-column: 2;
}

/* Schmale Fassung für enge Spalten. */
.form-horizontal.form-horizontal-slim .control-group {
    grid-template-columns: 120px minmax(0, 1fr);
}


/* Ein Feld, das keine eigene Breite gesetzt bekommt, füllt seine Spalte. Eines mit
   Breitenklasse behält sie: ohne den Ausschluss gewinnt diese Regel über die Spezifität. */
.controls > .form-control:not([class*="input-"]),
.controls > .form-select:not([class*="input-"]),
.controls > .input-group {
    width: 100%;
}

/* Fehlerzustand an der Gruppe, wie ihn Notices.scala setzt. Bootstrap 5 kennt nur gültig und
   ungültig am Feld; Warnung und Hinweis gibt es dort nicht und werden hier ergänzt. */
.control-group.warning .control-label,
.control-group.warning .form-text { color: #c09853; }
.control-group.warning .form-control,
.control-group.warning .form-select { border-color: #c09853; }

.control-group.error .control-label,
.control-group.error .form-text { color: #b94a48; }
.control-group.error .form-control,
.control-group.error .form-select { border-color: #b94a48; }

.control-group.success .control-label,
.control-group.success .form-text { color: #468847; }
.control-group.success .form-control,
.control-group.success .form-select { border-color: #468847; }

.control-group.info .control-label,
.control-group.info .form-text { color: #3a87ad; }
.control-group.info .form-control,
.control-group.info .form-select { border-color: #3a87ad; }


/* Feldzustände für `.control-group-inline`. Bootstrap 2 bot sie nur für `.control-group`; die
   Werte stammen aus dessen Mixin .formFieldState(). */
.control-group-inline.warning .control-label,
.control-group-inline.warning .checkbox,
.control-group-inline.warning input,
.control-group-inline.warning select,
.control-group-inline.warning textarea { color: #c09853; }
.control-group-inline.warning input,
.control-group-inline.warning select,
.control-group-inline.warning textarea {
    border-color: #c09853;
    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
}
.control-group-inline.warning input:focus,
.control-group-inline.warning select:focus,
.control-group-inline.warning textarea:focus {
    border-color: #a47e3c;
    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
}

.control-group-inline.error .control-label,
.control-group-inline.error .checkbox,
.control-group-inline.error input,
.control-group-inline.error select,
.control-group-inline.error textarea { color: #b94a48; }
.control-group-inline.error input,
.control-group-inline.error select,
.control-group-inline.error textarea {
    border-color: #b94a48;
    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
}
.control-group-inline.error input:focus,
.control-group-inline.error select:focus,
.control-group-inline.error textarea:focus {
    border-color: #953b39;
    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
}

.control-group-inline.success .control-label,
.control-group-inline.success .checkbox,
.control-group-inline.success input,
.control-group-inline.success select,
.control-group-inline.success textarea { color: #468847; }
.control-group-inline.success input,
.control-group-inline.success select,
.control-group-inline.success textarea {
    border-color: #468847;
    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
}
.control-group-inline.success input:focus,
.control-group-inline.success select:focus,
.control-group-inline.success textarea:focus {
    border-color: #356635;
    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
}

.control-group-inline.info .control-label,
.control-group-inline.info .checkbox,
.control-group-inline.info input,
.control-group-inline.info select,
.control-group-inline.info textarea { color: #3a87ad; }
.control-group-inline.info input,
.control-group-inline.info select,
.control-group-inline.info textarea {
    border-color: #3a87ad;
    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
}
.control-group-inline.info input:focus,
.control-group-inline.info select:focus,
.control-group-inline.info textarea:focus {
    border-color: #2d6987;
    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3;
}

/* Fehlertext von LiftScreen. */
.field-error {
    color: #b94a48;
}

/* Felder in Dialogen laufen über die volle Breite (`.input-block-level`). Den Abstand zwischen
   den Feldern setzt dann allein `.control-group` — der eigene Außenabstand der Felder fällt weg,
   weil er sich je nach Feldtyp unterschiedlich verhält und die Zeilen dadurch ungleich weit
   auseinanderstehen. Steht hinter `.control-group:last-child`, damit auch die letzte Gruppe
   im Dialog ihren Abstand behält. */
.modal-body .control-group {
    margin-bottom: 15px;
}

.modal-body .control-group .controls > input,
.modal-body .control-group .controls > select,
.modal-body .control-group .controls > textarea {
    margin-bottom: 0;
}


/* ---- Felder des Wizard-Rahmenwerks --------------------------------------
 *
 * `field-inner` sitzt am Eingabefeld, das `view.field` erzeugt — Lift überträgt die Klasse von
 * der Vorlage auf das Element. Weil dort der Elementtyp erst zur Laufzeit feststeht, bekommt die
 * Klasse hier das Aussehen von `.form-control` beziehungsweise `.form-select`, statt dass jede
 * der rund dreißig Feldklassen in Scala das passende Attribut mitgeben müsste.
 */

input.field-inner,
textarea.field-inner,
select.field-inner {
    display: inline-block;
    width: 220px;          /* die Vorgabebreite von Bootstrap 2: 206 px plus Polsterung und Rahmen,
                              dort content-box gerechnet; Breitenklassen überschreiben sie */
    max-width: 100%;
    padding: 0.25rem 0.4375rem;
    font-size: 0.875rem;
    line-height: 1.42857143;
    color: #555;
    background-color: #fff;
    background-clip: padding-box;
    border: 1px solid #ccc;
    border-radius: var(--bs-border-radius);
    transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out;
}

textarea.field-inner {
    width: 100%;
}

/* `select.form-control` gehört hierher aus demselben Grund: in vielen Vorlagen steht
   `<input class="form-control">`, und erst das Snippet setzt ein `<select>` dafür ein. Bootstrap 5
   nimmt einem `.form-control` das Aussehen des Browsers (`appearance: none`), der Pfeil kommt
   aber nur mit `.form-select` — ohne diese Regel sahen fünfzig Auswahllisten auf dreizehn Seiten
   aus wie Textfelder. */
select.field-inner,
select.form-control {
    padding-right: 1.75rem;
    background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");
    background-repeat: no-repeat;
    background-position: right 0.5rem center;
    background-size: 12px 9px;
    appearance: none;
}

input.field-inner:focus,
textarea.field-inner:focus,
select.field-inner:focus {
    border-color: rgba(82, 168, 236, 0.8);
    outline: 0;
    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
}

input.field-inner[disabled],
textarea.field-inner[disabled],
select.field-inner[disabled] {
    background-color: #eee;
    opacity: 1;
}

input.field-inner[type="checkbox"],
input.field-inner[type="radio"] {
    display: inline-block;
    width: auto;
    padding: 0;
}

/* Ankreuzfelder im Wizard: Kästchen und Beschriftung in einer Zeile. */
.form-check-label.field-inner {
    display: flex;
    align-items: center;
    gap: 0.375rem;
    width: auto;
    padding: 0;
    border: 0;
}

/*
 * Zusatzfeld-Verbund: so breit wie sein Inhalt, nicht wie die Spalte. Bootstrap 5 macht
 * `.input-group` auf volle Breite — bei einem Datumsfeld neben einem Kalendersymbol ist das
 * zu viel, und das Feld behält seine Breitenklasse.
 */
.input-group {
    display: inline-flex;
    /* Bootstrap 2 brach `input-append` nie um: war die Spalte zu schmal, stand das Zusatzfeld
       über. Mit dem Umbruch von Bootstrap 5 rutschte das „€" unter das Feld — beim Betrag der
       Honorarnote, der in einer `col-1` steht wie zuvor in einer `span1`. */
    flex-wrap: nowrap;
    width: auto;
    vertical-align: top;
}

/* Ist die Gruppe selbst die `.controls`, gehört sie unter die Beschriftung, nicht daneben. */
.controls.input-group {
    display: flex;
}

.input-group > .field-inner {
    flex: 0 0 auto;
    border-top-right-radius: 0;
    border-bottom-right-radius: 0;
}


/* Abstände in `.form-fields`, den Formularen aus `view.field`. */
.form-fields legend {
    font-size: 16px;
    line-height: 24px;
}

.form-fields .field {
    display: inline-block;
    margin-bottom: 10px;
}

.form-fields .field-inner,
.form-fields .field-errors,
.form-fields .field-errors > * {
    margin-bottom: 0;
}

.form-fields .field-errors > :first-child,
.form-fields .field-button {
    margin-top: 2px;
}

/* Unter den rechts gefloateten „Zurücksetzen"-Link, nicht neben ihn: als Block liefe der Rahmen
   der Vorlagen-Liste sonst unter dem Link durch. In Bootstrap 2 war die Liste als `span9` selbst
   gefloatet und rutschte von allein darunter. Der Abstand als Polsterung, weil `clear` einen
   Außenabstand nach oben schluckt. */
.form-fields .field-extras {
    clear: both;
    padding-top: 10px;
}

.form-fields .controls > .checkbox:first-child {
    padding-top: unset;
}

.form-horizontal.form-fields .field {
    margin-bottom: 0;
}

.form-horizontal.form-fields .field-errors {
    margin-top: 0;
}


/* ---- Feldbreiten ---------------------------------------------------------
 *
 * Bootstrap 5 kennt keine Breitenklassen für Felder; es erwartet, dass man die Breite über
 * Rasterspalten regelt. In dichten Formularen ist das umständlich — eine Postleitzahl braucht
 * keine halbe Zeile. Die Namen stammen aus Bootstrap 2 und bleiben als eigene Hilfsklassen,
 * mit denselben Maßen wie zuvor.
 */

/* Ein Feld mit ausdrücklicher Breite soll neben anderem stehen können. Bootstrap 5 setzt
   `.form-control` und `.form-select` auf `display: block`, womit jedes Feld die Zeile für sich
   beansprucht; in Bootstrap 2 waren sie inline-block. Auf der Zielauswahl standen deshalb
   Knopf, Auswahlliste und Knopfgruppe untereinander statt nebeneinander.

   Der Platzhalter `[class*="input-"]` ist hier ungefährlich, anders als weiter unten bei den
   Breiten: er steht hinter einem Elementnamen, und Tom Selects Zustandsklassen `input-hidden`
   und `input-active` sitzen auf einem div, nicht auf input, select oder textarea. */
input[class*="input-"]:not([type="checkbox"]):not([type="radio"]),
select[class*="input-"],
textarea[class*="input-"] {
    display: inline-block;
    vertical-align: middle;
}

/* Element-qualifiziert, damit sie gegen `input.field-inner` und `.form-control` gewinnen —
   gleiche Spezifität, und sie stehen später in der Datei.

   Textfelder sind 14 px breiter als Auswahllisten derselben Klasse. Bootstrap 2 setzte dieselbe
   Zahl, rechnete bei `input` und `textarea` aber ohne Polsterung und Rahmen (content-box), bei
   `select` mit (border-box, die Vorgabe des Browsers). Nachgemessen auf der Freitexte-Seite:
   Titel 544 px, Kategorie 530 px — beide `input-xxlarge`. Bootstrap 5 rechnet überall mit
   border-box, deshalb stehen die Zuschläge hier ausgeschrieben. */
select.input-mini,    .ts-wrapper.input-mini    { width: 60px; }
select.input-small,   .ts-wrapper.input-small   { width: 90px; }
select.input-medium,  .ts-wrapper.input-medium  { width: 150px; }
select.input-large,   .ts-wrapper.input-large   { width: 210px; }
select.input-xlarge,  .ts-wrapper.input-xlarge  { width: 270px; }
select.input-xxlarge, .ts-wrapper.input-xxlarge { width: 530px; }

input.input-mini,    textarea.input-mini    { width: 74px; }
input.input-small,   textarea.input-small   { width: 104px; }
input.input-medium,  textarea.input-medium  { width: 164px; }
input.input-large,   textarea.input-large   { width: 224px; }
input.input-xlarge,  textarea.input-xlarge  { width: 284px; }
input.input-xxlarge, textarea.input-xxlarge { width: 544px; }

/* In einer Zusatzfeld-Gruppe setzt Bootstrap 5 `flex: 1 1 auto; width: 1%` auf das Feld. Weil
   die Gruppe hier auf Inhaltsbreite steht, zieht das ein leeres Feld auf wenige Pixel zusammen.
   Die Breitenklasse muss deshalb in diesem Zusammenhang eigens gewinnen — die
   element-qualifizierte Fassung oben hat dafür zu wenig Spezifität.
   Einzeln aufgezählt statt über [class*="input-"]: dieser Platzhalter greift auch auf
   Zustandsklassen von Tom Select (`input-hidden`, `input-active`). */
.input-group > .input-mini    { flex: 0 0 auto; width: 74px; }
.input-group > .input-small   { flex: 0 0 auto; width: 104px; }
.input-group > .input-medium  { flex: 0 0 auto; width: 164px; }
.input-group > .input-large   { flex: 0 0 auto; width: 224px; }
.input-group > .input-xlarge  { flex: 0 0 auto; width: 284px; }
.input-group > .input-xxlarge { flex: 0 0 auto; width: 544px; }
.input-group > select.input-mini    { width: 60px; }
.input-group > select.input-small   { width: 90px; }
.input-group > select.input-medium  { width: 150px; }
.input-group > select.input-large   { width: 210px; }
.input-group > select.input-xlarge  { width: 270px; }
.input-group > select.input-xxlarge { width: 530px; }

/* Ein natives Dateifeld besteht aus Knopf und Dateinamen nebeneinander. Eine feste Breite
   schneidet den Namen ab — aus „Keine ausgewählt" wurde „K…t", obwohl daneben Platz war. Die
   Breitenklassen stammen aus Bootstrap-2-Zeiten und meinten Textfelder, nicht dieses Bauteil. */
input[type="file"] {
    width: auto;
    max-width: 100%;
}

/* Spaltenklassen an Feldern meinen eine feste Breite, nicht einen Anteil der Zeile.
 *
 * Die Feldvorlagen (`FormScreen`) und einige Seiten setzen `col-N` direkt auf das Feld — beim
 * Umschreiben aus `spanN` entstanden. In Bootstrap 2 war `input.span3` schlicht 270 px breit,
 * gleich wo es stand. `col-3` ist dagegen ein Viertel des Elternelements, und das ist hier die
 * `.field`-Hülle, die als inline-block auf ihren Inhalt schrumpft: übrig blieb die Vorgabebreite
 * des Browsers. In den Wizards waren Auswahllisten 77 bis 363 px breit statt 270, die
 * Textfelder 262 statt 870, und das „€" rutschte unter das Feld.
 *
 * Die Breiten sind die des alten Rasters bei 1170 px (Spalte 70, Abstand 30), nachgemessen am
 * Bootstrap-2-Stand. `max-width` lässt ein Feld in einer schmaleren Spalte nicht überstehen —
 * die Wizard-Spalte ist heute 842 px breit, nicht mehr 870. Dafür braucht auch die
 * `.field`-Hülle die Begrenzung: ohne sie bezieht sich das `100 %` auf eine Hülle, die sich
 * selbst erst nach dem Feld richtet, und das Feld fällt auf seine Vorgabebreite zurück. */
.form-fields .field { max-width: 100%; }

input[class*="col-"]:not([type="checkbox"]):not([type="radio"]),
select[class*="col-"],
textarea[class*="col-"],
.ts-wrapper[class*="col-"] { max-width: 100%; }

input.col-1,  select.col-1,  textarea.col-1,  .ts-wrapper.col-1  { width: 70px; }
input.col-2,  select.col-2,  textarea.col-2,  .ts-wrapper.col-2  { width: 170px; }
input.col-3,  select.col-3,  textarea.col-3,  .ts-wrapper.col-3  { width: 270px; }
input.col-4,  select.col-4,  textarea.col-4,  .ts-wrapper.col-4  { width: 370px; }
input.col-5,  select.col-5,  textarea.col-5,  .ts-wrapper.col-5  { width: 470px; }
input.col-6,  select.col-6,  textarea.col-6,  .ts-wrapper.col-6  { width: 570px; }
input.col-7,  select.col-7,  textarea.col-7,  .ts-wrapper.col-7  { width: 670px; }
input.col-8,  select.col-8,  textarea.col-8,  .ts-wrapper.col-8  { width: 770px; }
input.col-9,  select.col-9,  textarea.col-9,  .ts-wrapper.col-9  { width: 870px; }
input.col-10, select.col-10, textarea.col-10, .ts-wrapper.col-10 { width: 970px; }
input.col-11, select.col-11, textarea.col-11, .ts-wrapper.col-11 { width: 1070px; }
input.col-12, select.col-12, textarea.col-12, .ts-wrapper.col-12 { width: 1170px; }

/* In der Zusatzfeld-Gruppe setzt Bootstrap 5 `flex: 1 1 auto; width: 1%` mit höherer
   Spezifität — wie bei den Breitenklassen oben muss die Spaltenbreite dort eigens gewinnen. */
.input-group > .col-3 { flex: 0 0 auto; width: 270px; }

/* Tom Select kopiert die Klassen des ursprünglichen `<select>` auf seine Hülle — also auch
   `form-select`, und das ist in Bootstrap 5 `display: block`. Mehrere Auswahllisten
   nebeneinander stapeln sich dadurch untereinander; auf der Tarif-Migration standen die drei
   Filter plötzlich in drei Zeilen. Bootstrap-select hat seine Hülle als `.btn-group`
   ausgeliefert, und die war `inline-block`. */
.ts-wrapper {
    display: inline-block;
    vertical-align: middle;
}

/* Höhe und Polsterung wie bei jedem anderen Feld.
 *
 * Tom Select polstert sein Bedienelement mit 8 px und setzt eine eigene, kleinere Schrift; die
 * Liste wurde dadurch 36 px hoch neben 30 px hohen Textfeldern. Die Werte hier sind dieselben
 * wie bei `.form-control` weiter oben — 14 px Schrift auf 20 px Zeile, 4/7 px Polsterung,
 * 1 px Rand, zusammen 30 px. Rechts bleibt Platz für den Pfeil, wie bei `.form-select`.
 */
.ts-wrapper .ts-control,
.ts-wrapper.single .ts-control {
    /* Dieselbe Mindesthöhe wie `.form-control` — sonst schwankt sie je nachdem, ob ein Eintrag
       gewählt ist oder der Platzhalter steht. */
    min-height: calc(1.42857143em + 0.5rem + 2px);
    padding: 0.25rem 1.75rem 0.25rem 0.4375rem;
    font-size: 0.875rem;
    line-height: 1.42857143;
    color: #555;
    border-color: #ccc;
    border-radius: var(--bs-border-radius);

    /* Tom Select rechnet seine rechte Polsterung selbst aus — `max(--ts-pr-min,
       --ts-pr-clear-button + --ts-pr-caret)` — und das schlägt eine schlichte Angabe.
       Über seine eigenen Variablen gesteuert, das ist die vorgesehene Stelle dafür. */
    --ts-pr-min: 1.75rem;
    --ts-pr-caret: 1.5rem;
}

/* Der Pfeil.
 *
 * Das Basis-Thema von Tom Select zeichnet keinen; bisher kam er von Bootstraps `form-select`,
 * das über die Klassenübernahme auf der Hülle landete — und damit nur dort, wo das Markup
 * zufällig `form-select` am `<select>` stehen hatte. Hier dasselbe Bild wie bei einer nativen
 * Auswahlliste, fest eingesetzt: `var(--bs-form-select-bg-img)` ist außerhalb eines
 * `.form-select` nicht definiert und ergäbe gar keinen Pfeil.
 *
 * Mit drei Klassen, weil `.ts-control { background: #fff }` als Kurzform `background-image`
 * mit zurücksetzt und sonst gewinnt. `background-color` steht deshalb hier mit dabei.
 */
.ts-wrapper.single .ts-control {
    background-color: #fff;
    background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");
    background-repeat: no-repeat;
    background-position: right 0.5rem center;
    background-size: 12px 9px;
}

/* `form-select` landet über die Klassenübernahme auch auf der Hülle und legt dort seine eigene
   Polsterung und den Pfeil-Hintergrund oben drauf — auf der Tarif-Migration kam die Liste so
   auf 46 px. Beides gehört an das innere Bedienelement, nicht an die Hülle. */
.ts-wrapper.form-select {
    min-height: 0;
    padding: 0;
    background-image: none;
    border: 0;
}

/* Auswahllisten sind 220 px breit, wie unter bootstrap-select — auch mit Breitenklasse.
   Dessen Regel `.bootstrap-select:not([class*="col-"]):not([class*="form-control"])` hat
   `input-large` und Verwandte über die Spezifität stets überstimmt; im Mandantenformular stehen
   so zwei Listen mit `input-large`, die immer 220 px breit waren und nicht 210. */
.ts-wrapper.selectpicker:not([class*="col-"]) {
    width: 220px;
}

.modal-body .ts-wrapper.selectpicker { width: 100%; }

/* Der Kalender liegt über allem und braucht eine eigene Schriftgröße, weil er im DOM unter dem
   Feld hängt und dort vom Zusatzfeld-Verbund `font-size: 0` erben könnte. */
.datepicker { font-size: 0.875rem; }
.datepicker-dropdown { z-index: 1100; }

.tab-content > .tab-pane:not(.active) { display: none; }
.tab-content > .tab-pane.active { display: block; }

/* Der Trenner im Auswahlmenü, siehe UserSnips. */
.dropdown-divider-wrap { padding: 0; margin: 0; list-style: none; }


/* ---- Seitengerüst --------------------------------------------------------
 *
 * Die Navigationsleiste steht fest oben; der Rumpf braucht entsprechend Luft. Der Wert folgt
 * der Leistenhöhe aus diesem Thema (2.5rem) plus etwas Abstand.
 */
body {
    /* Die Leiste steht fest oben; der Rumpf braucht ihre Höhe plus etwas Luft. */
    padding-top: calc(var(--minerva-leisten-hoehe) + 0.75rem);
}

html {
    height: 100%;
}

body {
    background-color: #eee;
    padding-bottom: 40px;
    /* In der LESS-Quelle stand `calc(100% - 80px)`. LESS rechnet in calc() mit, solange der
       Ausdruck nicht mit ~"..." geschützt ist, und hat daraus `calc(20%)` gemacht — das ist der
       Wert, der seit jeher ausgeliefert wird. Ob daraus die ursprünglich gemeinte Rechnung
       werden soll, ist eine eigene Entscheidung; siehe Frontend-Modernisierung.md. */
    min-height: calc(20%);
}

/* Die weiße Fläche um den Inhalt. Sie zieht sich bis an die Ränder des Containers; der Wert muss
   dessen Innenabstand entsprechen: in Bootstrap 2 waren das feste 20px, in Bootstrap 5 ist es
   die halbe Rinne. Mit den alten -20px stand die Fläche auf schmalen Bildschirmen 8px je Seite
   über und erzeugte einen waagerechten Rollbalken. */
.main-content {
    background-color: #fff;
    padding: 20px;
    margin: 0 calc(var(--bs-gutter-x) * -0.5);
    border-radius: 0 0 6px 6px;
    box-shadow: 0 1px 2px rgba(0, 0, 0, .15);
}

@media print {
    body { padding-top: 0; }
}

/* Druck: A4 hochkant, der Inhalt über die ganze bedruckbare Breite statt in der Bildschirmfläche
 * mit Rand und Schatten.
 *
 * Stand zuerst nur in zielauswahl.css. Dort setzte er außerdem `html`, `body` und `.main-content`
 * auf feste 210 × 297 mm — breiter als die bedruckbare Fläche nach Abzug des Seitenrands, die
 * Tabellen liefen rechts über. Diese Angaben sind deshalb nicht mitgekommen.
 */
@media print {
    @page {
        size: A4 portrait;
    }

    .container {
        width: auto !important;
        max-width: none !important;
        margin: 0 auto 0.5% auto !important;
        padding: 0 !important;
        background: transparent !important;
        border: none !important;
        box-shadow: none !important;
    }

    /* Die weiße Fläche ragt auf dem Bildschirm um die Polsterung des Containers über ihn hinaus;
       die gibt es im Druck nicht mehr, sie stünde sonst über den Seitenrand. */
    .main-content {
        margin: 0 !important;
        padding: 0 !important;
        box-shadow: none !important;
    }
}

/* Kompakter Druck für Seiten mit breiten Tabellen, bisher die Zielauswahl: 10 px Schrift und
 * schmalere Spalten, damit die Tariftabelle auf eine A4-Seite passt.
 *
 * Nachgebildet ist das `* { font-size: 10px }` aus zielauswahl.css. Es traf auch `<html>`, und
 * damit schrumpfte alles, was in rem rechnet — die Überschriften dieses Themas auf 10/16 ihrer
 * Größe. Daher die Wurzel über `:has`. Die Elemente selbst über `:where`, also ohne Spezifität
 * wie `*`: Regeln für einzelne Elemente, etwa die Überschriften, gewinnen weiterhin. */
@media print {
    html:has(.druck-kompakt),
    :where(.druck-kompakt, .druck-kompakt *) {
        font-size: 10px;
    }

    .druck-kompakt .tarif-name { width: 120px; }

    .druck-kompakt .tarif-mb,
    .druck-kompakt .tarif-jb,
    .druck-kompakt .tarif-sb { width: 50px; }

    /* Die beiden ersten Ersparnisse brauchen mehr: „? -535 (SB runter)" sind bei 10 px knapp
       80 px. */
    .druck-kompakt .tarif-ersparnis,
    .druck-kompakt .tarif-ersparnis-nachhaltig { width: 90px; }

    .druck-kompakt .tarif-ersparnis-nachhaltig-steuer,
    .druck-kompakt .tarif-ersparnis-nachhaltig-steuer-2 { width: 70px; }

    /* Die letzte Spalte nimmt im Druck den Rest. */
    .druck-kompakt .tarif-eai { width: auto; }

    /* Breiten nur aus der Kopfzeile, nicht aus dem Inhalt: sonst drückt ein langer Eintrag wie
       „? -102 (SB runter) ~> -582" seine Spalte auf, und die Tabellen je Zieltarif stehen nicht
       mehr untereinander. Der Inhalt bricht stattdessen in der Spalte um. */
    .druck-kompakt table { table-layout: fixed; }

    /* Was auf dem Bildschirm zusammenbleiben soll, darf im Druck umbrechen, bevor es über die
       Spalte hinausläuft. Doppelte Klasse, weil Bootstraps text-nowrap !important trägt. */
    .druck-kompakt .text-nowrap { white-space: normal !important; }
}


/* Seitenbreite.
 *
 * Bootstrap 5 lässt den Container bis 1320 px wachsen, Bootstrap 2 hörte bei 1170 px auf. Die
 * Spaltenaufteilung aller Seiten ist auf 1170 ausgelegt — insbesondere das Mandantenformular,
 * dessen zwei Spalten dort genau nebeneinander passen. Breiter zu werden ist kein Gewinn,
 * sondern verschiebt jede nachgemessene Breite.
 */
.container {
    max-width: 1170px;
}

/* Der Inhalt selbst ist 1170 px breit, nicht die weiße Fläche um ihn.
 *
 * In Bootstrap 2 hatte der Container keine Polsterung; `.main-content` ragte 20 px über ihn
 * hinaus und polsterte 20 px nach innen — Fläche 1210, Inhalt 1170. In Bootstrap 5 polstert
 * der Container selbst, die Fläche zieht sich nur um diese Polsterung heraus (`.main-content`
 * oben), und mit 1170 px Höchstbreite blieben 1130 px Inhalt. Alle Spalten waren dadurch
 * schmaler als die Breiten, auf die das Markup ausgelegt ist: die Wizard-Spalte 842 statt
 * 870 px, rechts ausgerichtete Knöpfe 35 bis 40 px weiter links. Die Fläche ist so breit wie der Container,
 * also 1210 px wie früher. Die Leiste behält ihre 1170 px. */
.container-main {
    max-width: 1210px;
}

/* Auf den breiten Seiten (`default5-wide-scrollable`) wächst die Fläche mit ihrer Tabelle. Die
   Seitenspalte darin war in Bootstrap 2 trotzdem 1170 px breit — `span12` war eine feste
   Breite, `col-12` ist die ganze Zeile. Auf Werbung und Tarifbeiträgen standen die Filter
   dadurch über die volle Fensterbreite verteilt, 570 statt 290 px auseinander. */
.main-content-wide > .row > .col-12 {
    flex: 0 0 auto;
    width: calc(1170px + var(--bs-gutter-x));
}


/* `well` — der graue Kasten.
 *
 * In Bootstrap 5 gestrichen, hier aber an 17 Stellen im Markup und inhaltlich gemeint: ein
 * abgesetzter Block. Die Werte sind die der alten Fassung (Polsterung 19 px, #f5f5f5).
 */
.well {
    min-height: 20px;
    padding: 19px;
    margin-bottom: 20px;
    background-color: #f5f5f5;
    border: 1px solid #e3e3e3;
    border-radius: var(--bs-border-radius);
    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
}

.well-sm { padding: 9px; }


/* ---- Spaltenbreiten in Tabellen -----------------------------------------
 *
 * In einigen Tabellenköpfen stehen Spaltenklassen als Breitenangabe — aus Bootstrap-2-Zeiten,
 * wo `span2` schlicht eine Breite setzte. In Bootstrap 5 sind das Flex-Angaben, die in einer
 * Tabelle nichts verloren haben. Hier bekommen sie ihre ursprüngliche Bedeutung zurück.
 */
th[class*="col-"], td[class*="col-"] { flex: none; }

th.col-1,  td.col-1  { width: 8.3333%; }
th.col-2,  td.col-2  { width: 16.6667%; }
th.col-3,  td.col-3  { width: 25%; }
th.col-4,  td.col-4  { width: 33.3333%; }
th.col-5,  td.col-5  { width: 41.6667%; }
th.col-6,  td.col-6  { width: 50%; }
th.col-7,  td.col-7  { width: 58.3333%; }
th.col-8,  td.col-8  { width: 66.6667%; }
th.col-9,  td.col-9  { width: 75%; }
th.col-11, td.col-11 { width: 91.6667%; }
th.col-12, td.col-12 { width: 100%; }

/* Eine Spalte, die zugleich Zeile ist — kommt in verschachtelten Rastern vor und soll dann
   keine doppelten negativen Ränder bekommen. */
[class*="col-"].row { margin-right: 0; margin-left: 0; }


/* ---- Was Bootstrap 5 ersatzlos gestrichen hat ----------------------------
 *
 * Diese Klassen stehen im Markup und sind dort inhaltlich gemeint; Bootstrap 5 kennt sie nur
 * nicht mehr. Ohne Regel sind es unsichtbare Container — beim Wizard waren das die graue
 * Knopfleiste und der Speichern-Bereich, die schlicht verschwunden waren.
 *
 * Die Werte stammen aus der nachgemessenen alten Fassung, nicht aus dem Gedächtnis.
 */

/* Ankreuzfeld mit Beschriftung: das Kästchen steht vorn, auch wenn es im Markup hinter dem
   Text steht — so auf der Honorarnote („Ratenzahlung", „Revision"). Werte aus Bootstrap 2. */
label.checkbox {
    display: block;
    min-height: 1.25rem;
    padding-left: 20px;
}

label.checkbox > input[type="checkbox"] {
    float: left;
    margin-left: -20px;
}

/* Knopfleiste am Fuß eines Formulars. */
.form-actions {
    padding: 19px 20px 20px;
    margin-top: 1.25rem;
    margin-bottom: 1.25rem;
    background-color: #f5f5f5;
    border-top: 1px solid #e5e5e5;
}


/* Seitenkopf mit Trennlinie. */
.page-header {
    padding-bottom: 0.5rem;
    margin: 1.25rem 0 1.875rem;
    border-bottom: 1px solid #eee;
}

/* Waagerechte Anordnung für Bedienelemente, die in einer Tabellenzelle oder Zeile stehen. */
.form-inline > .form-control,
.form-inline > .form-select,
.form-inline > .btn,
.form-inline > label {
    display: inline-block;
    width: auto;
    vertical-align: middle;
    margin-bottom: 0;
}

/* Die Zusatzfeld-Gruppe steht hier bewusst **nicht** in der Liste oben.
   Sie ist eine Flexbox; ein `display: inline-block` von außen macht aus ihren Kindern wieder
   Blöcke, und der Knopf rutscht unter das Feld — genau das ist bei „Neue VP … Import"
   passiert. Ausrichtung und Abstand ja, Anzeigeart und Breite nein: die regelt die
   allgemeine `.input-group`-Regel weiter oben. */
.form-inline > .input-group {
    vertical-align: middle;
    margin-bottom: 0;
}

/* Beschreibungsliste mit Begriff links. */
.dl-horizontal > dt {
    float: left;
    width: 160px;
    overflow: hidden;
    clear: left;
    text-align: right;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.dl-horizontal > dd {
    margin-left: 180px;
}

.dl-horizontal::after {
    display: table;
    clear: both;
    content: "";
}

/* Das Dreieck am Aufklappknopf. Bootstrap 5 zeichnet es selbst über `.dropdown-toggle::after`;
   das ausdrückliche <span class="caret"> im Markup wäre sonst ein zweites. Es bleibt stehen,
   damit die Vorlagen dafür nicht angefasst werden müssen. */
.dropdown-toggle .caret {
    display: none;
}

/* Menüeinträge in der alten Gliederung `<li><a>`. Bootstrap 5 erwartet `.dropdown-item`
   unmittelbar im Menü; wo das Markup noch das <li> dazwischen hat, greift sonst gar nichts. */
.dropdown-menu > li > a {
    display: block;
    width: 100%;
    padding: var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);
    clear: both;
    font-weight: 400;
    color: var(--bs-dropdown-link-color);
    text-align: inherit;
    text-decoration: none;
    white-space: nowrap;
    background-color: transparent;
    border: 0;
}

.dropdown-menu > li > a:hover,
.dropdown-menu > li > a:focus {
    color: var(--bs-dropdown-link-hover-color);
    background-color: var(--bs-dropdown-link-hover-bg);
}

/* Untermenü. In Bootstrap 2 öffnete es beim Überfahren, rein über CSS — ohne Skript. */
.dropdown-submenu {
    position: relative;
}

.dropdown-submenu > .dropdown-menu {
    top: 0;
    left: 100%;
    margin-top: -6px;
    margin-left: -1px;
}

.dropdown-submenu:hover > .dropdown-menu {
    display: block;
}

.dropdown-submenu > a::after {
    display: block;
    float: right;
    width: 0;
    height: 0;
    margin-top: 5px;
    margin-right: -10px;
    content: " ";
    border-color: transparent;
    border-left-color: #ccc;
    border-style: solid;
    border-width: 5px 0 5px 5px;
}

.dropdown-submenu:hover > a::after {
    border-left-color: var(--bs-dropdown-link-hover-color);
}

/* Akkordeon in der alten Gliederung. Bootstrap 5 kennt `.accordion` und `.accordion-body`,
   aber nicht die drei Klassen dazwischen. */
.accordion-group {
    margin-bottom: 0.125rem;
    border: 1px solid #e5e5e5;
    border-radius: var(--bs-border-radius);
}

.accordion-heading .accordion-toggle {
    display: block;
    padding: 0.5rem 0.9375rem;
    color: var(--bs-link-color);
    text-decoration: none;
    cursor: pointer;
}

.accordion-inner {
    padding: 0.5625rem 0.9375rem;
    border-top: 1px solid #e5e5e5;
}


/* ---- Hervorheben bei Fokus -----------------------------------------------
 *
 * Ein Bereich, der sich einfärbt, solange ein Feld darin den Fokus hat — so wie er dauerhaft
 * aussieht, sobald etwas eingetragen ist (`bg-warning-subtle text-warning-emphasis`). Für
 * `:focus-within` gibt es keine Bootstrap-Hilfsklasse. Bisher nur an der Wertberichtigung der
 * Honorarnote (HonorarnoteEdit.scala).
 */
.fokus-hervorheben:focus-within {
    background-color: var(--bs-warning-bg-subtle);
    color: var(--bs-warning-text-emphasis);
}


/* ---- Zusammenfassung im Wizard -------------------------------------------
 *
 * Die Einträge am Ende jedes Wizards (snippet/wizard/summaryitem/). Aufbau und Abstände kommen
 * aus Bootstrap-Klassen im Markup von SummaryItem.scala; hier stehen nur die eigenen Farben,
 * die bewusst geblieben sind, und der Hover-Effekt aufklappbarer Köpfe — für einen
 * Hover-Hintergrund gibt es keine Hilfsklasse.
 */
.summary-item-header {
    background: #E3E3FF;
}

.summary-item-header.with-content {
    transition: background 0.25s ease-out;
    cursor: pointer;
}

.summary-item-header.with-content:hover {
    background: #64daed;
}

.summary-item-content {
    background: aliceblue;
}

.print-label:hover {
    background: aliceblue;
}


/* ---- Eigene Hilfsklassen -------------------------------------------------
 *
 * Was Bootstrap 5 nicht hat: `text-break` bricht nur, wo es nötig ist, `text-break-all` an jeder
 * Stelle (lange Dateinamen ohne Trennstellen). `.link` ist ein klickbares Element, das kein
 * Verweis ist, in der alten Linkfarbe.
 */
.text-break-all {
    word-break: break-all;
}

.color-minerva {
    color: #7BAAD4;
}

a.disabled {
    color: gray;
    pointer-events: none;
}

.link {
    cursor: pointer;
    color: #0088cc;
    text-decoration: none;
}

.link:hover {
    color: #005580;
    text-decoration: underline;
}

/* Der Ladekreisel etwas kleiner und auf der Grundlinie, wie die frühere eigene Fassung. */
.spinner-border {
    display: inline-block;
    width: 1.3em;
    height: 1.3em;
    vertical-align: text-bottom;
    border: .2em solid currentColor;
    border-right-color: transparent;
    border-radius: 50%;
    animation: spinner-border .75s linear infinite;
}

@keyframes spinner-border {
    to { transform: rotate(360deg); }
}


/* ---- Kennfarben ----------------------------------------------------------
 *
 * Betreuungsgarantie, Problemfall und Vertragsbetreuung — als Plakette und als Zeilenfarbe in
 * Mandantenlisten (`contactRowClass` in snippet/package.scala). Fachliche Farben, keine
 * Bootstrap-Varianten.
 */
.badge.betreuungsgarantiePremium {
    background-color: #80DA80;
}

.badge.betreuungsgarantieBasis {
    background-color: #f7d646;
}

.badge.problematic {
    background-color: #B22222;
}

/* Vertragsbetreuung hatte nie eine eigene Farbe: das Badge lebte von der Vorgabe aus
   Bootstrap 2, wo `.label, .badge` grundsätzlich `background-color: #999` trug. Bootstrap 5
   gibt einem `.badge` ohne `text-bg-*` gar keine Fläche, also war es unsichtbar. */
.badge.vertragsbetreuung {
    background-color: #999;
}

tr.contact-problematic {
    background-color: #FFD5D5;
}

tr.contact-betreuungsgarantie-premium {
    background-color: #D5F3D5;
}

tr.contact-betreuungsgarantie-basis {
    background-color: rgba(247, 214, 70, 0.4);
}


/* ---- Vorprüfung ----------------------------------------------------------
 *
 * Das Ergebnis der Vorprüfung in den Mandantendetails, mit Popover.
 */
.contact-vorpruefung .popover {
    max-width: 560px;
    text-align: left;
}

.vorpruefung-summary:hover {
    text-decoration: underline;
    cursor: pointer;
}

.vorpruefung-summary.success {
    color: #7fc36f;
}

.vorpruefung-summary.info {
    color: #67b7df;
}


/* ---- E-Mails ---------------------------------------------------------------
 *
 * Die Vorschau einer E-Mail zeigt deren HTML so, wie ein Mailprogramm es täte: `all: revert`
 * nimmt Bootstrap und dieses Thema darin zurück.
 */
.email-preview-body {
    margin: 0;
    font: small/1.5 Arial, Helvetica, sans-serif;
}

.email-preview-body blockquote {
    padding: 0 0 0 15px;
    margin: 0 0 20px;
    border-left: 5px solid #eee;
}

.email-preview-body * {
    all: revert;
}

.email {
    width: 100%;
    height: 320px;
    border-width: 0 0 4px 0;
    border-style: double;
    border-color: lightgrey;
    margin: 0;
}

.email-log-entry:hover {
    cursor: pointer;
}


/* ---- Bildvorschau --------------------------------------------------------
 *
 * Das große Vorschaubild beim Überfahren (snippet/view/PreviewOverlay.scala).
 */
.preview-overlay {
    position: fixed;
    top: 10%;
    right: 0;
    width: 100%;
    height: 80%;
    visibility: hidden;
    pointer-events: none;
    z-index: 10000;
}

.preview-overlay > div {
    height: 100%;
    display: flex;
    justify-content: center;
    align-items: center;
}

.preview-overlay > div img {
    display: block;
    width: auto;
    height: auto;
    max-width: min(80%, 800px);
    max-height: 100%;
    margin: auto;
    visibility: visible;
    box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
}
