/* _content/HousingCatalog.Admin/Components/Badge.razor.rz.scp.css */
/* Scoped an Badge.razor -- die Basisform (.badge: Groesse, Radius, Abstaende) traegt bereits
   app.css, hier kommt nur die Farbe je Kind hinzu. */

.badge-none[b-7dtrez6l4i] {
    background: var(--color-surface-strong);
    color: var(--color-text-muted);
}

.badge-ok[b-7dtrez6l4i] {
    background: var(--color-ok-soft);
    color: var(--color-ok);
}

.badge-warn[b-7dtrez6l4i] {
    background: var(--color-warn-soft);
    color: var(--color-warn);
}

.badge-crit[b-7dtrez6l4i] {
    background: var(--color-crit-soft);
    color: var(--color-crit);
}

/* Auch der Akzent bleibt weich: in einer Listenzeile stehen bis zu drei Schilder nebeneinander,
   und ein gefuelltes darunter zieht den Blick vom Namen weg, um den es in der Zeile geht. */
.badge-accent[b-7dtrez6l4i] {
    background: var(--color-accent-soft);
    color: var(--color-accent);
}
/* _content/HousingCatalog.Admin/Components/ConfirmDialog.razor.rz.scp.css */
.confirm-dialog-backdrop[b-o2j0yz4qym] {
    position: fixed;
    inset: 0;
    background: rgba(0, 0, 0, 0.4);
    display: flex;
    align-items: center;
    justify-content: center;
    z-index: 50;
}

.confirm-dialog-box[b-o2j0yz4qym] {
    background: var(--color-surface);
    border-radius: var(--radius);
    box-shadow: var(--shadow-sm);
    padding: 1.5rem;
    max-width: 24rem;
    width: calc(100% - 2rem);
}

.confirm-dialog-text[b-o2j0yz4qym] {
    margin: 0 0 1.25rem;
    color: var(--color-text);
}

.confirm-dialog-actions[b-o2j0yz4qym] {
    display: flex;
    gap: 0.75rem;
    justify-content: flex-end;
}

/* .btn-danger ist im globalen app.css dieser Konsole nicht definiert (das kennt bislang nur
   .btn, .btn-primary, .btn-link) -- scoped hier, damit nur der Bestaetigungsknopf dieses Dialogs
   die Signalfarbe traegt, ohne app.css anzufassen. */
.btn-danger[b-o2j0yz4qym] {
    background: var(--color-crit);
    color: #fff;
}

.btn-danger:hover:not(:disabled)[b-o2j0yz4qym] {
    opacity: 0.9;
}

.btn-danger:disabled[b-o2j0yz4qym] {
    opacity: 0.6;
    cursor: not-allowed;
}
/* _content/HousingCatalog.Admin/Components/EditableField.razor.rz.scp.css */
/* Ein Feld ist eine Zeile, keine gestapelte Beschriftung: Bezeichnung links, Wert daneben,
   Zeichen rechts. Gestapelt braucht eine Gruppe aus vielen Feldern die doppelte Hoehe, und die
   Werte stehen nicht mehr untereinander -- man kann einen Datensatz dann nicht mehr ueberfliegen.
   Fehlermeldung und Sperrgrund laufen unter dem Wert ueber die volle Breite. */
.editable-field[b-xc3o8pt7wn] {
    display: grid;
    grid-template-columns: 11.5rem 1fr auto;
    align-items: center;
    gap: 0.15rem 0.625rem;
    padding: 0.5rem 0.75rem;
    border-bottom: 1px solid var(--color-border);
}

.editable-field:last-child[b-xc3o8pt7wn] {
    border-bottom: 0;
}

.editable-field:hover[b-xc3o8pt7wn] {
    background: var(--color-surface-alt);
}

.editable-field-label[b-xc3o8pt7wn] {
    grid-column: 1;
    font-size: 0.78rem;
    color: var(--color-text-muted);
}

.editable-field-value[b-xc3o8pt7wn] {
    grid-column: 2;
    justify-self: stretch;
    text-align: left;
    background: none;
    border: 0;
    border-radius: 5px;
    padding: 0.1rem 0;
    font: inherit;
    font-size: 0.845rem;
    color: var(--color-text);
    cursor: text;
    min-width: 0;
    overflow-wrap: anywhere;
}

.editable-field-value:disabled[b-xc3o8pt7wn] {
    cursor: default;
    color: var(--color-text-muted);
}

.editable-field-value:focus-visible[b-xc3o8pt7wn] {
    outline: 2px solid var(--color-accent);
    outline-offset: 2px;
}

/* Ein mehrzeiliger Text behaelt seine Umbrueche auch im zusammengeklappten Zustand -- sonst
   liest sich eine Beschreibung als ein einziger Absatz, und man sieht der Anzeige nicht an, wie
   der gespeicherte Text tatsaechlich aussieht. */
.editable-field-value-multiline[b-xc3o8pt7wn] {
    white-space: pre-wrap;
}

/* Quelltext -- z. B. ein Adapterschluessel oder ein Selektorausdruck. Angezeigt UND im
   Eingabefeld, sonst springt der Wert beim Anklicken in eine andere Schrift und die Zeile
   aendert ihre Breite. */
.editable-field-mono .editable-field-value[b-xc3o8pt7wn],
.editable-field-mono input[b-xc3o8pt7wn] {
    font-family: var(--font-mono);
    font-size: 0.78rem;
}

/* Das Eingabefeld nimmt den Platz des Werts ein, ohne dass die Zeile ihre Hoehe aendert --
   sonst springt beim Anklicken die halbe Gruppe nach unten. */
.editable-field select[b-xc3o8pt7wn],
.editable-field input[b-xc3o8pt7wn],
.editable-field textarea[b-xc3o8pt7wn] {
    grid-column: 2;
    width: 100%;
    min-width: 0;
}

.editable-field-mark[b-xc3o8pt7wn] {
    grid-column: 3;
    font-size: 0.7rem;
    color: var(--color-text-subtle);
    line-height: 1;
    /* Der Stift erscheint erst beim Ueberfahren: staendig sichtbar waeren es in einer Gruppe
       aus vielen Feldern ebenso viele Stifte, und das ist keine Auskunft mehr. */
    opacity: 0;
}

.editable-field:hover .editable-field-mark[b-xc3o8pt7wn] {
    opacity: 1;
}

/* Das Schloss steht dauerhaft -- es ist der Grund, warum bei einem Klick nichts passiert. */
.editable-field-mark-locked[b-xc3o8pt7wn] {
    opacity: 1;
}

/* Ein gesperrtes Feld ist schraffiert. Nur graue Schrift liest sich als "leer" oder als
   Darstellungsfehler; die Schraffur sagt, dass hier nichts zu holen ist, ohne den Wert zu
   verstecken -- er ist ja die Auskunft. */
.editable-field-locked[b-xc3o8pt7wn] {
    background: repeating-linear-gradient(-45deg,
        transparent, transparent 7px,
        var(--color-surface-alt) 7px, var(--color-surface-alt) 8px);
}

.editable-field-locked:hover[b-xc3o8pt7wn] {
    background: repeating-linear-gradient(-45deg,
        transparent, transparent 7px,
        var(--color-surface-alt) 7px, var(--color-surface-alt) 8px);
}

.editable-field-lock-reason[b-xc3o8pt7wn] {
    grid-column: 2 / -1;
    font-size: 0.72rem;
    color: var(--color-text-subtle);
}

/* Ein feldbezogener 400 landet hier, unter dem Feld, das ihn ausgeloest hat -- und nicht in
   einer Sammelmeldung oben, in der niemand mehr zuordnen kann, welches Feld gemeint ist. Die
   Zeile bekommt zusaetzlich den Signalrand links, damit sie im ueberflogenen Feldblock auffaellt. */
.editable-field-error[b-xc3o8pt7wn] {
    grid-column: 2 / -1;
    min-width: 0;
}

.editable-field:has(.editable-field-error)[b-xc3o8pt7wn] {
    background: var(--color-crit-soft);
    box-shadow: inset 2px 0 0 var(--color-crit);
}

/* Geaendert und noch nicht gespeichert. Die SaveBar zaehlt nur die Summe -- welches Feld
   gemeint ist, steht sonst nirgends, und nach dem Verwerfen bliebe unklar, was zurueckgenommen
   wurde. Der Punkt hinter der Bezeichnung traegt dieselbe Aussage nochmals in der Form, damit
   sie nicht allein von der Farbe abhaengt. */
.editable-field-dirty[b-xc3o8pt7wn],
.editable-field-dirty:hover[b-xc3o8pt7wn] {
    background: var(--color-warn-soft);
}

.editable-field-dirty .editable-field-label[b-xc3o8pt7wn]::after {
    content: " \2022";
    color: var(--color-warn);
}

/* Auf schmalen Geraeten ist fuer zwei Spalten kein Platz: dann doch gestapelt, aber dichter,
   und das Zeichen rechts entfaellt -- angetippt wird ohnehin, nicht ueberfahren. */
@media (max-width: 900px) {
    .editable-field[b-xc3o8pt7wn] {
        grid-template-columns: 1fr;
        gap: 0.15rem;
        padding: 0.6rem 0.75rem;
    }

    .editable-field-label[b-xc3o8pt7wn],
    .editable-field-value[b-xc3o8pt7wn],
    .editable-field-lock-reason[b-xc3o8pt7wn],
    .editable-field select[b-xc3o8pt7wn],
    .editable-field input[b-xc3o8pt7wn],
    .editable-field textarea[b-xc3o8pt7wn] {
        grid-column: 1;
    }

    .editable-field-mark[b-xc3o8pt7wn] {
        display: none;
    }
}
/* _content/HousingCatalog.Admin/Components/Expander.razor.rz.scp.css */
/* Ein aufklappbarer Block ist ein eigener Datensatz in einer Liste, kein Absatz: Rahmen,
   eigene Flaeche, deutlicher Kopf. Aneinandergereiht ergeben sie z. B. die Laufliste eines
   Sammellaufs. */
.expander[b-sl08bd4dhw] {
    border: 1px solid var(--color-border);
    border-radius: var(--radius);
    margin-bottom: 0.5rem;
    background: var(--color-surface);
    overflow: hidden;
}

/* Der Kopf ist die gesamte Zeile und in drei Zonen geteilt: Pfeil, Inhalt, und was der
   Aufrufer rechts anhaengt (Zustand, Zeitpunkt, Zahl). Der Inhalt bekommt min-width: 0,
   damit ein langer Titel abgeschnitten wird, statt die rechte Zone aus der Zeile zu draengen. */
.expander-header[b-sl08bd4dhw] {
    width: 100%;
    display: flex;
    align-items: center;
    gap: 0.6rem;
    background: none;
    border: none;
    padding: 0.6rem 0.75rem;
    text-align: left;
    cursor: pointer;
    font: inherit;
    font-size: 0.845rem;
    color: var(--color-text);
}

.expander-header:hover[b-sl08bd4dhw] {
    background: var(--color-surface-alt);
}

.expander-header:focus-visible[b-sl08bd4dhw] {
    outline: 2px solid var(--color-accent);
    outline-offset: -2px;
}

/* Der Pfeil ist die einzige Auskunft darueber, dass sich die Zeile ueberhaupt aufklappen
   laesst -- zu klein gesetzt liest er sich als Bindestrich und sagt gar nichts. */
.expander-caret[b-sl08bd4dhw] {
    color: var(--color-text-muted);
    font-size: 0.95rem;
    line-height: 1;
    width: 0.85rem;
    text-align: center;
    flex-shrink: 0;
}

/* Aufgeklappt ist der Kopf vom Rumpf getrennt -- sonst laufen die Felder darunter optisch in
   die Zeile hinein, und man sieht nicht mehr, wo ein Block endet und der naechste beginnt. */
.expander-body[b-sl08bd4dhw] {
    padding: 0.75rem;
    border-top: 1px solid var(--color-border);
    background: var(--color-surface-alt);
}

/* Ein weggefallener Eintrag bleibt sichtbar und aufklappbar, nur zurueckgenommen: "was ist
   weggefallen" ist bei einer unvollstaendigen Liste oft die erste Frage. Kursiv statt nur
   blass, damit die Kennzeichnung nicht allein an der Farbe haengt. */
.expander-muted[b-sl08bd4dhw] {
    opacity: 0.65;
}

.expander-muted .expander-header[b-sl08bd4dhw] {
    font-style: italic;
}
/* _content/HousingCatalog.Admin/Components/FieldList.razor.rz.scp.css */
/* Eine Gruppe ist ein zusammenhaengender Block mit einer Kopfleiste, keine Ueberschrift ueber
   losen Zeilen: die Felder darin gehoeren zusammen (z. B. "Quelle", "Rechte", "Betrieb"), und
   der Rahmen ist das, was diese Zugehoerigkeit zeigt. Die Trennlinien zwischen den Zeilen
   bringt EditableField selbst mit; overflow: hidden schneidet sie am Rundungsradius ab. */
.field-list[b-t5vpm9tcuw] {
    border: 1px solid var(--color-border);
    border-radius: var(--radius);
    overflow: hidden;
    margin-bottom: 1rem;
    background: var(--color-surface);
}

/* Versalien, klein, getoente Flaeche -- die Kopfleiste ordnet, sie konkurriert nicht mit dem
   Titel des Panels darueber. */
.field-list-title[b-t5vpm9tcuw] {
    margin: 0;
    padding: 0.5rem 0.75rem 0.4rem;
    font-size: 0.685rem;
    font-weight: 600;
    letter-spacing: 0.1em;
    text-transform: uppercase;
    color: var(--color-text-subtle);
    background: var(--color-surface-alt);
    border-bottom: 1px solid var(--color-border);
}
/* _content/HousingCatalog.Admin/Components/InseratDetailPane.razor.rz.scp.css */
/* Kopf des Detailpanels: Titel und Statusmarke links, die Loeschung als einzige Handlung rechts --
   dieselbe Aufteilung wie QuellenDetailPane.razor.css, hier ohne SaveBar, weil diese Flaeche nichts
   speichert. */
.inserat-detail-kopf[b-j4a080m15p] {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    gap: 1rem;
    padding: 1rem 0 0.75rem;
}

.inserat-detail-titel h2[b-j4a080m15p] {
    margin: 0 0 0.4rem;
    font-size: 1.1rem;
    font-weight: 700;
    color: var(--color-text);
}

.inserat-detail-abzeichen[b-j4a080m15p] {
    display: flex;
    gap: 0.35rem;
    flex-wrap: wrap;
}

/* .btn-danger ist im globalen app.css dieser Konsole nicht definiert -- dieselbe scoped Ausnahme
   wie in QuellenDetailPane.razor.css, hier noch einmal, weil eine scoped Regel nur innerhalb der
   Markup-Grenze der eigenen Komponente gilt. */
.btn-danger[b-j4a080m15p] {
    background: var(--color-crit);
    color: #fff;
    border-color: var(--color-crit);
}

.btn-danger:hover:not(:disabled)[b-j4a080m15p] {
    opacity: 0.9;
}

.btn-danger:disabled[b-j4a080m15p] {
    opacity: 0.6;
    cursor: not-allowed;
}

/* Zweispaltiges Datenblatt: Bezeichnung links, Wert rechts -- eine reine Anzeigefliste ohne
   EditableField, weil hier nichts bearbeitet wird. */
.inserat-detail-felder[b-j4a080m15p] {
    display: grid;
    grid-template-columns: max-content 1fr;
    gap: 0.35rem 1rem;
    margin: 0 0 1.25rem;
    font-size: 0.85rem;
}

.inserat-detail-felder dt[b-j4a080m15p] {
    color: var(--color-text-muted);
}

.inserat-detail-felder dd[b-j4a080m15p] {
    margin: 0;
    color: var(--color-text);
}

/* Fremdtext: Absaetze bleiben erhalten (siehe HousingTextSanitizer), aber es ist und bleibt reiner
   Text -- keine Regel dieser Datei behandelt ihn als Markup. */
.inserat-detail-beschreibung[b-j4a080m15p] {
    white-space: pre-line;
    color: var(--color-text);
    max-width: 60ch;
}
/* _content/HousingCatalog.Admin/Components/Layout/MainLayout.razor.rz.scp.css */
/* Volle Fensterhoehe als Flex-Zeile: Navigation links in fester Breite, .main-content nimmt den
   Rest. Das ist zugleich der Flex-Vorfahre mit eigener Hoehe, den SplitView.razor.css fuer sein
   eigenes flex:1 braucht (siehe die Bemerkung dort) -- ohne ihn haette die Split-Ansicht keine
   Hoehe, von der sie etwas abbekommen koennte. */
.app-shell[b-dn3qinvhzn] {
    display: flex;
    min-height: 100vh;
}

.app-nav[b-dn3qinvhzn] {
    flex-shrink: 0;
    width: 176px;
    display: flex;
    flex-direction: column;
    gap: 0.15rem;
    padding: 1.25rem 0.75rem;
    background: var(--color-surface);
    border-right: 1px solid var(--color-border);
}

.app-nav-link[b-dn3qinvhzn] {
    padding: 0.5rem 0.65rem;
    border-radius: 7px;
    font-size: 0.86rem;
    font-weight: 500;
    color: var(--color-text-muted);
    text-decoration: none;
}

.app-nav-link:hover[b-dn3qinvhzn] {
    background: var(--color-surface-alt);
    color: var(--color-text);
}

.app-nav-link.active[b-dn3qinvhzn] {
    background: var(--color-accent-soft);
    color: var(--color-accent-strong);
    font-weight: 600;
}

/* Der Abmeldeknopf sitzt am Fuss der Navigation und sieht aus wie ein Navigationspunkt -- ein
   <button> statt eines Links, aber ohne den Rahmen und die Flaeche, die der Browser ihm gaebe. */
.app-nav-abmelden[b-dn3qinvhzn] {
    margin-top: auto;
}

.app-nav-abmelden-knopf[b-dn3qinvhzn] {
    width: 100%;
    text-align: left;
    border: none;
    background: transparent;
    font-family: inherit;
    cursor: pointer;
}
/* _content/HousingCatalog.Admin/Components/ListPane.razor.rz.scp.css */
/* Der Listenstreifen ist 340px breit und traegt Titel, Zaehler, Suche und Filter -- alles
   davon zurueckhaltend, weil die Zeilen darunter der eigentliche Inhalt sind. */
.list-pane-inner[b-xqpegm8a1r] {
    display: flex;
    flex-direction: column;
    flex: 1;
    min-height: 0;
}

/* Der Kopf bleibt stehen, gescrollt wird nur die Zeilenliste darunter: bei einer langen Liste
   waere die Suche sonst nach dem ersten Scrollen ausser Sicht. */
.list-pane-top[b-xqpegm8a1r] {
    display: flex;
    flex-direction: column;
    gap: 0.6rem;
    padding: 0.875rem 0.875rem 0.625rem;
    border-bottom: 1px solid var(--color-border);
    flex-shrink: 0;
}

.list-pane-header[b-xqpegm8a1r] {
    display: flex;
    align-items: center;
    gap: 0.5rem;
}

.list-pane-title[b-xqpegm8a1r] {
    margin: 0;
    font-size: 0.94rem;
    font-weight: 600;
    letter-spacing: -0.01em;
    color: var(--color-text);
}

/* Der Zaehler steht neben dem Titel, nicht darunter, und in Ziffern gleicher Breite --
   sonst springt er bei jeder Eingabe in der Suche seitlich hin und her. */
.list-pane-count[b-xqpegm8a1r] {
    flex: 1;
    font-size: 0.75rem;
    font-weight: 400;
    color: var(--color-text-subtle);
    font-variant-numeric: tabular-nums;
}

.list-pane-create[b-xqpegm8a1r] {
    flex-shrink: 0;
    padding: 0.25rem 0.6rem;
    font-size: 0.76rem;
}

/* Die Suche ist ein getoentes Feld, kein umrandetes Formularelement: sie gehoert zum Kopf
   der Liste und nicht zu einem Formular, das jemand abschickt. */
.list-pane-search[b-xqpegm8a1r] {
    display: flex;
    align-items: center;
    gap: 0.45rem;
    background: var(--color-surface-alt);
    border: 1px solid var(--color-border);
    border-radius: 7px;
    padding: 0.4rem 0.55rem;
}

.list-pane-search:focus-within[b-xqpegm8a1r] {
    border-color: var(--color-accent);
}

.list-pane-search-icon[b-xqpegm8a1r] {
    color: var(--color-text-subtle);
    font-size: 0.8rem;
    line-height: 1;
}

.list-pane-search input[b-xqpegm8a1r] {
    border: 0;
    background: transparent;
    outline: 0;
    width: 100%;
    min-width: 0;
    font: inherit;
    font-size: 0.815rem;
    color: var(--color-text);
    -webkit-appearance: none;
}

.list-pane-filters[b-xqpegm8a1r] {
    display: flex;
    flex-wrap: wrap;
    gap: 0.35rem;
}

.list-pane-rows[b-xqpegm8a1r] {
    flex: 1;
    min-height: 0;
    overflow-y: auto;
}
/* _content/HousingCatalog.Admin/Components/ListRow.razor.rz.scp.css */
/* Zwei Spalten, zwei Zeilen. Alle vier Plaetze sind ausdruecklich vergeben und nicht dem
   automatischen Fluss ueberlassen: Untertitel und Kennzeichen sind beide freiwillig, und ohne
   feste Plaetze ruecken sie bei einer Zeile ohne Untertitel in die falsche Reihe. */
.list-row[b-1t8vlt88an] {
    display: grid;
    grid-template-columns: 1fr auto;
    gap: 0.25rem 0.625rem;
    align-items: center;
    padding: 0.7rem 0.875rem;
    border-bottom: 1px solid var(--color-border);
    text-decoration: none;
    color: inherit;
}

.list-row:hover[b-1t8vlt88an] {
    background: var(--color-surface-alt);
}

/* Die Auswahl traegt die weiche Akzentflaeche und den Balken innen -- dieselbe Kennzeichnung
   wie der aktive Navigationspunkt. box-shadow statt border-left, damit der Zeilentext beim
   Auswaehlen nicht um die Balkenbreite verspringt. */
.list-row-selected[b-1t8vlt88an] {
    background: var(--color-accent-soft);
    box-shadow: inset 2px 0 0 var(--color-accent);
}

.list-row-selected:hover[b-1t8vlt88an] {
    background: var(--color-accent-soft);
}

.list-row-title[b-1t8vlt88an] {
    grid-column: 1;
    grid-row: 1;
    min-width: 0;
    font-weight: 600;
    font-size: 0.845rem;
    letter-spacing: -0.005em;
    color: var(--color-text);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.list-row-meta[b-1t8vlt88an] {
    grid-column: 2;
    grid-row: 1;
    font-size: 0.72rem;
    color: var(--color-text-subtle);
    font-variant-numeric: tabular-nums;
    white-space: nowrap;
}

/* Der Untertitel traegt haeufig eine Adresse oder einen Adapterschluessel: er wird
   abgeschnitten statt umgebrochen, damit jede Zeile gleich hoch bleibt und die Liste sich
   ueberfliegen laesst. */
.list-row-subtitle[b-1t8vlt88an] {
    grid-column: 1;
    grid-row: 2;
    min-width: 0;
    font-size: 0.75rem;
    color: var(--color-text-muted);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.list-row-badges[b-1t8vlt88an] {
    grid-column: 2;
    grid-row: 2;
    display: flex;
    gap: 0.3rem;
    justify-content: flex-end;
    flex-shrink: 0;
}

@media (max-width: 900px) {
    /* Auf dem Handy ist die Zeile die einzige Trefferflaeche und darf hoeher sein. */
    .list-row[b-1t8vlt88an] {
        padding: 0.8rem 0.875rem;
    }
}
/* _content/HousingCatalog.Admin/Components/Pages/Bausteine.razor.rz.scp.css */
/* Ausserhalb eines Split-Panels hat SplitView keine vorgegebene Hoehe (flex: 1 wirkt nur
   innerhalb eines Flex-Vorfahren mit eigener Hoehe) -- dieser Block ist selbst ein
   Flex-Container mit einer Mindesthoehe, damit sich der Baustein auf dieser Seite sehen und
   bedienen laesst. */
.bausteine-split-demo[b-b2zkjtjl1d] {
    display: flex;
    min-height: 22rem;
    margin-bottom: 1.5rem;
}

.bausteine-hint[b-b2zkjtjl1d] {
    font-size: 0.78rem;
    color: var(--color-text-subtle);
}
/* _content/HousingCatalog.Admin/Components/Pages/Inserate.razor.rz.scp.css */
/* Hinweistext zum angewandten Zeitfenster -- muss auffallen, weil er der Grund ist, warum die
   Trefferzahl darueber nicht der ganze Bestand ist. */
.inserate-fenster-hinweis[b-o8tacx4ez7] {
    padding: 0.5rem 0.875rem;
    margin: 0;
    font-size: 0.78rem;
    color: var(--color-text-muted);
    border-top: 1px solid var(--color-border);
    flex-shrink: 0;
}

.inserate-fenster-feld[b-o8tacx4ez7] {
    display: flex;
    align-items: center;
    gap: 0.35rem;
    font-size: 0.78rem;
    color: var(--color-text-muted);
}

.inserate-fenster-feld input[b-o8tacx4ez7] {
    width: 4.5rem;
}

.inserate-seiten-navigation[b-o8tacx4ez7] {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 0.5rem;
    padding: 0.5rem 0.875rem;
    font-size: 0.8rem;
    color: var(--color-text-muted);
    border-top: 1px solid var(--color-border);
    flex-shrink: 0;
}
/* _content/HousingCatalog.Admin/Components/Pages/Quellen.razor.rz.scp.css */
/* "+ Neu" liegt ueber der eigentlichen Liste, nicht als CreateHref darin (siehe die Begruendung
   im Markup): ein eigener, schmaler Streifen mit dem Knopf und, aufgeklappt, dem Anlegeformular. */
.quellen-neu-bereich[b-hwimc2u8k5] {
    padding: 0.75rem 0.875rem;
    border-bottom: 1px solid var(--color-border);
    flex-shrink: 0;
}

.quellen-neu-formular[b-hwimc2u8k5] {
    display: flex;
    flex-direction: column;
    gap: 0.35rem;
    margin-top: 0.6rem;
}

.quellen-neu-formular label[b-hwimc2u8k5] {
    display: flex;
    flex-direction: column;
    gap: 0.2rem;
    font-size: 0.78rem;
    color: var(--color-text-muted);
}

.quellen-neu-formular input[b-hwimc2u8k5] {
    font: inherit;
}

.quellen-neu-knoepfe[b-hwimc2u8k5] {
    display: flex;
    justify-content: flex-end;
    gap: 0.5rem;
    margin-top: 0.35rem;
}
/* _content/HousingCatalog.Admin/Components/Pages/Sammellaeufe.razor.rz.scp.css */
/* Blaetterleiste unter der Liste -- derselbe Aufbau wie .inserate-seiten-navigation
   (Inserate.razor.css), nur ohne den Fensterhinweis, weil GET /admin/cycles kein Zeitfenster kennt. */
.sammellaeufe-seiten-navigation[b-y2p7wc511x] {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 0.5rem;
    padding: 0.5rem 0.875rem;
    font-size: 0.8rem;
    color: var(--color-text-muted);
    border-top: 1px solid var(--color-border);
    flex-shrink: 0;
}
/* _content/HousingCatalog.Admin/Components/Pages/Sperren.razor.rz.scp.css */
/* Erklaerender Absatz vor der Tabelle -- eine Sperre ist ein Begriff, den nicht jeder Bediener
   kennt, und der Knopf unten soll niemanden zum Loeschen einer harmlosen, aktiven Sperre verleiten. */
.sperren-erklaerung[b-lotn30q8r4] {
    max-width: 62ch;
    color: var(--color-text-muted);
    font-size: 0.88rem;
    margin: 0 0 1.25rem;
}

.sperren-tabelle[b-lotn30q8r4] {
    width: 100%;
    border-collapse: collapse;
    font-size: 0.85rem;
    background: var(--color-surface);
    border: 1px solid var(--color-border);
    border-radius: var(--radius);
    overflow: hidden;
}

.sperren-tabelle th[b-lotn30q8r4],
.sperren-tabelle td[b-lotn30q8r4] {
    padding: 0.55rem 0.75rem;
    text-align: left;
    border-bottom: 1px solid var(--color-border);
}

.sperren-tabelle th[b-lotn30q8r4] {
    color: var(--color-text-muted);
    font-weight: 600;
    font-size: 0.78rem;
    text-transform: uppercase;
    letter-spacing: 0.02em;
}

.sperren-tabelle tbody tr:last-child td[b-lotn30q8r4] {
    border-bottom: none;
}

/* HeldBy ist eine Prozesskennung, kein Fliesstext -- dieselbe Schreibmaschinenschrift wie ein
   Adapterschluessel oder ein Selektorausdruck. */
.sperren-halter[b-lotn30q8r4] {
    font-family: var(--font-mono);
    color: var(--color-text-muted);
}

/* .btn-danger ist im globalen app.css dieser Konsole nicht definiert -- dieselbe scoped Ausnahme
   wie in InseratDetailPane.razor.css und SammellaufDetailPane.razor.css. */
.btn-danger[b-lotn30q8r4] {
    background: var(--color-crit);
    color: #fff;
    border-color: var(--color-crit);
}

.btn-danger:hover:not(:disabled)[b-lotn30q8r4] {
    opacity: 0.9;
}

.btn-danger:disabled[b-lotn30q8r4] {
    opacity: 0.6;
    cursor: not-allowed;
}
/* _content/HousingCatalog.Admin/Components/Pages/Startseite.razor.rz.scp.css */
/* Vier gleich aufgebaute Abschnitte -- Abstand zwischen ihnen, Trennlinie am Fuss statt am Kopf,
   damit der erste Abschnitt direkt unter der Ueberschrift der Seite beginnt. */
.startseite-abschnitt[b-veuwxbzjgc] {
    padding-bottom: 1.5rem;
    margin-bottom: 1.5rem;
    border-bottom: 1px solid var(--color-border);
}

.startseite-abschnitt:last-child[b-veuwxbzjgc] {
    border-bottom: none;
    margin-bottom: 0;
    padding-bottom: 0;
}

.startseite-erklaerung[b-veuwxbzjgc] {
    max-width: 68ch;
    color: var(--color-text-muted);
    font-size: 0.85rem;
    margin: 0 0 1rem;
}

/* Die drei Kennzahlen des Zeitgebers -- kein FieldList, weil hier nichts bearbeitet wird, nur
   gezeigt: eine Definitionsliste genuegt fuer Bezeichnung und Wert nebeneinander. */
.startseite-kennzahlen[b-veuwxbzjgc] {
    display: flex;
    flex-wrap: wrap;
    gap: 1.5rem;
    margin: 0 0 1rem;
}

.startseite-kennzahlen dt[b-veuwxbzjgc] {
    color: var(--color-text-muted);
    font-size: 0.78rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.02em;
    margin: 0 0 0.25rem;
}

.startseite-kennzahlen dd[b-veuwxbzjgc] {
    margin: 0;
    font-size: 0.9rem;
}

/* Dieselbe Tabellenform wie Sperren.razor.css -- eine reine Uebersicht, kein zweites Muster. */
.startseite-tabelle[b-veuwxbzjgc] {
    width: 100%;
    border-collapse: collapse;
    font-size: 0.85rem;
    background: var(--color-surface);
    border: 1px solid var(--color-border);
    border-radius: var(--radius);
    overflow: hidden;
}

.startseite-tabelle th[b-veuwxbzjgc],
.startseite-tabelle td[b-veuwxbzjgc] {
    padding: 0.55rem 0.75rem;
    text-align: left;
    border-bottom: 1px solid var(--color-border);
}

.startseite-tabelle th[b-veuwxbzjgc] {
    color: var(--color-text-muted);
    font-weight: 600;
    font-size: 0.78rem;
    text-transform: uppercase;
    letter-spacing: 0.02em;
}

.startseite-tabelle tbody tr:last-child td[b-veuwxbzjgc] {
    border-bottom: none;
}

/* Die Zeile "ohne Kanton" ist gesondert ausgewiesen, nicht auf die 26 Kantone verteilt -- der
   zurueckgenommene Grund hebt sie optisch von den echten Kantonszeilen ab, ohne sie zu verstecken. */
.startseite-ohne-kanton td[b-veuwxbzjgc] {
    background: var(--color-surface-muted);
    color: var(--color-text-muted);
    font-style: italic;
}
/* _content/HousingCatalog.Admin/Components/QuellenDetailPane.razor.rz.scp.css */
/* Kopf des Detailpanels: Titel und Statusmarken links, die Loeschung als einzige Gefahrenhandlung
   rechts -- getrennt vom SaveBar-Speichern, weil sie unwiderruflich ist und einen eigenen
   Bestaetigungsschritt braucht (siehe ConfirmDialog weiter unten in der Seite). */
.quellen-detail-kopf[b-gwbspg9lon] {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    gap: 1rem;
    padding: 1rem 0 0.75rem;
}

.quellen-detail-titel h2[b-gwbspg9lon] {
    margin: 0 0 0.4rem;
    font-size: 1.1rem;
    font-weight: 700;
    color: var(--color-text);
}

.quellen-detail-abzeichen[b-gwbspg9lon] {
    display: flex;
    gap: 0.35rem;
    flex-wrap: wrap;
}

/* .btn-danger ist im globalen app.css dieser Konsole nicht definiert (das kennt bislang nur .btn,
   .btn-primary, .btn-link) -- dieselbe scoped Ausnahme wie in ConfirmDialog.razor.css, hier noch
   einmal, weil eine scoped Regel nur innerhalb der Markup-Grenze der eigenen Komponente gilt und
   der Loeschknopf im Kopf dieser Karte ausserhalb des Dialogs steht. */
.btn-danger[b-gwbspg9lon] {
    background: var(--color-crit);
    color: #fff;
    border-color: var(--color-crit);
}

.btn-danger:hover:not(:disabled)[b-gwbspg9lon] {
    opacity: 0.9;
}

.btn-danger:disabled[b-gwbspg9lon] {
    opacity: 0.6;
    cursor: not-allowed;
}

.quellen-adapter-feld[b-gwbspg9lon] {
    margin-bottom: 1rem;
}

.quellen-inline-meldung[b-gwbspg9lon] {
    margin: 0.4rem 0 0;
    font-size: 0.8rem;
    color: var(--color-text-muted);
}

.quellen-betrieb-aktionen[b-gwbspg9lon] {
    margin-bottom: 1rem;
}

.quellen-betrieb-info[b-gwbspg9lon] {
    display: flex;
    flex-direction: column;
    gap: 0.2rem;
    margin-bottom: 0.75rem;
    font-size: 0.8rem;
    color: var(--color-text-muted);
}

.quellen-betrieb-knoepfe[b-gwbspg9lon] {
    display: flex;
    gap: 0.5rem;
}
/* _content/HousingCatalog.Admin/Components/SammellaufDetailPane.razor.rz.scp.css */
/* Kopf des Detailpanels: Titel und Statusmarke links, die Loeschung als einzige Handlung rechts --
   dieselbe Aufteilung wie InseratDetailPane.razor.css, hier ohne SaveBar, weil diese Flaeche nichts
   speichert. */
.sammellauf-detail-kopf[b-e9zeuwbbdz] {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    gap: 1rem;
    padding: 1rem 0 0.75rem;
}

.sammellauf-detail-titel h2[b-e9zeuwbbdz] {
    margin: 0 0 0.4rem;
    font-size: 1.1rem;
    font-weight: 700;
    color: var(--color-text);
}

.sammellauf-detail-abzeichen[b-e9zeuwbbdz] {
    display: flex;
    gap: 0.35rem;
    flex-wrap: wrap;
}

/* .btn-danger ist im globalen app.css dieser Konsole nicht definiert -- dieselbe scoped Ausnahme wie
   in InseratDetailPane.razor.css, hier noch einmal, weil eine scoped Regel nur innerhalb der
   Markup-Grenze der eigenen Komponente gilt. */
.btn-danger[b-e9zeuwbbdz] {
    background: var(--color-crit);
    color: #fff;
    border-color: var(--color-crit);
}

.btn-danger:hover:not(:disabled)[b-e9zeuwbbdz] {
    opacity: 0.9;
}

.btn-danger:disabled[b-e9zeuwbbdz] {
    opacity: 0.6;
    cursor: not-allowed;
}

/* Zweispaltiges Datenblatt: Bezeichnung links, Wert rechts -- eine reine Anzeigeliste ohne
   EditableField, weil hier nichts bearbeitet wird. Dient sowohl dem Kopfblock des Sammellaufs
   als auch, innerhalb jedes Expanders, dem Kopfblock eines einzelnen Laufs. */
.sammellauf-detail-felder[b-e9zeuwbbdz] {
    display: grid;
    grid-template-columns: max-content 1fr;
    gap: 0.35rem 1rem;
    margin: 0 0 1.25rem;
    font-size: 0.85rem;
}

.sammellauf-detail-felder dt[b-e9zeuwbbdz] {
    color: var(--color-text-muted);
}

.sammellauf-detail-felder dd[b-e9zeuwbbdz] {
    margin: 0;
    color: var(--color-text);
}

/* Kopfzeile eines Expanders: Quellenschluessel, Statusmarke, Dauer -- derselbe Aufbau, den
   Expander.razor fuer HeaderContent vorsieht (Pfeil, Inhalt, rechts angehaengte Auskunft). */
.sammellauf-lauf-quelle[b-e9zeuwbbdz] {
    font-weight: 600;
    color: var(--color-text);
}

.sammellauf-lauf-meta[b-e9zeuwbbdz] {
    margin-left: auto;
    color: var(--color-text-muted);
    font-size: 0.8rem;
}
/* _content/HousingCatalog.Admin/Components/SaveBar.razor.rz.scp.css */
/* Die Leiste klebt am Fuss des Detail-Panels, nicht am Fuss des Fensters: fixiert lag sie auch
   ueber dem Listenstreifen links, der mit dem Speichern nichts zu tun hat. Klebend statt fixiert
   heisst ausserdem, dass sie eigenen Platz im Fluss belegt -- ein sonst noetiger
   Sicherheitsabstand unter dem letzten Feld entfaellt damit.

   Der negative seitliche Rand laesst sie bis an die Panelkanten reichen (--pane-pad, siehe
   SplitView.razor.css), damit ihre Trennlinie so breit ist wie das Panel. */
.save-bar[b-yvdrx94nts] {
    position: sticky;
    bottom: 0;
    z-index: 3;
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 1rem;
    margin: 1rem calc(var(--pane-pad) * -1) 0;
    padding: 0.7rem var(--pane-pad);
    background: var(--color-surface);
    border-top: 1px solid var(--color-border);
    box-shadow: 0 -8px 24px -18px rgba(17, 24, 32, 0.5);
    /* Sie erscheint erst mit der ersten Aenderung -- ohne die kurze Bewegung springt eine
       Leiste ins Bild, die eben noch nicht da war. */
    animation: save-bar-in-b-yvdrx94nts 0.22s ease;
}

@keyframes save-bar-in-b-yvdrx94nts {
    from { transform: translateY(100%); }
    to { transform: none; }
}

/* Im Fluss stehend, ohne Klebeverhalten: der Eintrag einer Unterliste traegt seine eigene
   Leiste, und mehrere geaenderte Eintraege stapeln sich damit nicht am unteren Rand. */
.save-bar-inline[b-yvdrx94nts] {
    position: static;
    z-index: auto;
    margin: 0.75rem 0 0;
    padding: 0.5rem 0.7rem;
    border: 1px solid var(--color-border);
    border-radius: var(--radius);
    box-shadow: none;
    background: var(--color-surface-alt);
    animation: none;
}

.save-bar-count[b-yvdrx94nts] {
    font-size: 0.815rem;
    color: var(--color-text-muted);
}

.save-bar-count b[b-yvdrx94nts] {
    color: var(--color-text);
    font-variant-numeric: tabular-nums;
}

.save-bar-actions[b-yvdrx94nts] {
    display: flex;
    gap: 0.5rem;
    flex-shrink: 0;
    align-items: center;
}

@media (prefers-reduced-motion: reduce) {
    .save-bar[b-yvdrx94nts] {
        animation: none;
    }
}
/* _content/HousingCatalog.Admin/Components/SplitView.razor.rz.scp.css */
/* Die Konsole fuellt den Rahmen, sie liegt nicht als gerundete Karte darin: der negative Rand
   hebt das Polster von .main-content exakt wieder auf (dieselben Variablen, damit beide nicht
   auseinanderlaufen), flex: 1 nimmt die verbleibende Hoehe. min-height: 0 ist noetig, weil ein
   Flex-Element sonst nicht unter seinen Inhalt schrumpft -- ohne das waere die feste Hoehe
   wirkungslos und eine lange Liste liesse das Dokument insgesamt wachsen, mit dem ausgewaehlten
   Datensatz ganz oben, waehrend man weit unten in der Liste geklickt hatte. */
.split-view[b-edtk627szd] {
    display: flex;
    align-items: stretch;
    flex: 1;
    min-height: 0;
    margin: calc(var(--content-pad-y) * -1) calc(var(--content-pad-x) * -1);
    background: var(--color-surface);
    border-top: 1px solid var(--color-border);
    overflow: hidden;
}

/* Gescrollt wird in den Panels, nicht in der Seite -- die Liste bleibt stehen, waehrend man
   rechts durch einen langen Datensatz faehrt. */
.split-view-list[b-edtk627szd] {
    width: 340px;
    flex-shrink: 0;
    border-right: 1px solid var(--color-border);
    display: flex;
    flex-direction: column;
    min-height: 0;
}

/* Das Detail-Panel ist der Scroll-Behaelter seines Inhalts -- daran haengt, dass die
   Reiterleiste beim Scrollen oben kleben bleibt und die SaveBar unten. Sein seitliches Polster
   heben Kopf und Reiterleiste mit demselben Wert wieder auf (--pane-pad), damit deren
   Trennlinien so breit sind wie das Panel. */
.split-view-detail[b-edtk627szd] {
    flex: 1;
    min-width: 0;
    overflow-y: auto;
    padding: 0 var(--pane-pad);
}

.split-view-empty[b-edtk627szd] {
    margin: 0;
    padding: 4rem 0;
    text-align: center;
    color: var(--color-text-subtle);
    font-size: 0.845rem;
}

/* Der Zurueck-Knopf existiert immer im Markup, ist aber nur unter 900px sichtbar -- oberhalb
   davon zeigt die Aufteilung ohnehin beide Panels nebeneinander und ein Zurueck ergibt keinen
   Sinn. */
.split-view-back[b-edtk627szd] {
    display: none;
    align-items: center;
    gap: 0.35rem;
    padding-top: 0.75rem;
    font-size: 0.815rem;
}

/* Unter 900px wird aus der Seitenaufteilung ein einzelnes Panel: ohne Auswahl die Liste, mit
   Auswahl das Detail. */
@media (max-width: 900px) {
    .split-view-list[b-edtk627szd],
    .split-view-detail[b-edtk627szd] {
        width: 100%;
        border-right: none;
    }

    .split-view:not(.split-view-has-selection) .split-view-detail[b-edtk627szd] {
        display: none;
    }

    .split-view.split-view-has-selection .split-view-list[b-edtk627szd] {
        display: none;
    }

    .split-view-back[b-edtk627szd] {
        display: inline-flex;
    }
}
/* _content/HousingCatalog.Admin/Components/TabStrip.razor.rz.scp.css */
/* Die Reiterleiste sitzt unmittelbar unter dem Kopf und traegt die Trennlinie zum Rumpf. Sie
   reicht bis an die Panelkanten (negativer Rand gegen --pane-pad des Detail-Panels), damit die
   Linie so breit ist wie das Panel und nicht so breit wie der Text darin.

   Sie klebt beim Scrollen oben: ein Datensatz mit vielen Unterpositionen ist laenger als das
   Panel, und ohne das waere der Wechsel zurueck auf den ersten Reiter erst nach dem Hochscrollen
   wieder erreichbar. Deckende Flaeche, weil der Inhalt darunter durchlaeuft. */
.tab-strip[b-qec5kyiqiq] {
    display: flex;
    gap: 0.125rem;
    position: sticky;
    top: 0;
    z-index: 2;
    margin: 0 calc(var(--pane-pad) * -1) 1.125rem;
    padding: 0 var(--pane-pad);
    background: var(--color-surface);
    border-bottom: 1px solid var(--color-border);
    overflow-x: auto;
}

.tab-strip-tab[b-qec5kyiqiq] {
    background: none;
    border: none;
    border-bottom: 2px solid transparent;
    padding: 0.55rem 0.75rem;
    font-size: 0.815rem;
    font-weight: 500;
    color: var(--color-text-muted);
    cursor: pointer;
    white-space: nowrap;
}

.tab-strip-tab:hover[b-qec5kyiqiq] {
    color: var(--color-text);
}

.tab-strip-tab-active[b-qec5kyiqiq] {
    color: var(--color-text);
    font-weight: 600;
    border-bottom-color: var(--color-accent);
}

.tab-strip-tab:focus-visible[b-qec5kyiqiq] {
    outline: 2px solid var(--color-accent);
    outline-offset: -2px;
}
