/* /Components/Fundsuche/FundItemDetailDialog.razor.rz.scp.css */
/* Farben laufen über die --app-*-Ebene (app.css), damit der Kontrastmodus sie mitdreht: Diese
   Datei ist scoped CSS und kann html.a11y-contrast nicht als Vorfahren adressieren.
   Der Dialog ist ein natives <dialog>, KEINE Bootstrap-.modal — die Regel
   html.a11y-contrast .modal in app.css greift hier also nicht. */
.fund-detail-dialog[b-zc0q9sc20g] {
    /* Breit wie Alt-Portal (~1140px), aber per 90vw responsiv auf kleinen Viewports. */
    width: min(90vw, 1140px);
    /* Ohne diese beiden Zeilen behält der Dialog die Browservorgaben Canvas/CanvasText und
       bleibt im Kontrastmodus eine weiße Insel. Im Normalmodus ist --app-page-bg weiß wie
       Canvas; der Text wird #212529 statt Schwarz, also derselbe Wert wie im Seitenfließtext. */
    background-color: var(--app-page-bg, Canvas);
    color: var(--app-page-text, CanvasText);
    border: 1px solid var(--app-border, var(--fbd-mono-mice, #ccc));
    border-radius: .5rem;
    padding: 1.5rem;
}

.fund-detail-dialog[b-zc0q9sc20g]::backdrop {
    background-color: rgba(0, 0, 0, .5);
}

.fund-detail-header[b-zc0q9sc20g] {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    gap: 1rem;
    margin-bottom: 1rem;
}

/* Titelzeile: Gegenstandstitel links, Nummer-Badge rechts (wie Alt-Portal). */
.fund-detail-titlebar[b-zc0q9sc20g] {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    flex-wrap: wrap;
    gap: .5rem 1rem;
    margin-bottom: 1rem;
}

.fund-detail-itemnumber[b-zc0q9sc20g] {
    font-size: .875rem;
    white-space: nowrap;
}

/* Dunkles Badge, damit die Gegenstandsnummer ins Auge fällt (neutrales Token, WCAG-sicher).
   Im Kontrastmodus dreht --app-badge-* die Füllung um (weiß mit schwarzer Schrift): Dunkel auf
   Schwarz bliebe lesbar, wäre aber keine Hervorhebung mehr. Beide Tokens sind nur in
   html.a11y-contrast definiert, im Normalmodus greifen die Fallbacks. */
.fund-detail-itemnumber-badge[b-zc0q9sc20g] {
    background: var(--app-badge-bg, var(--fbd-mono-nero, #222));
    color: var(--app-badge-text, var(--fbd-mono-white, #fff));
    padding: .1rem .4rem;
    border-radius: .25rem;
}

.fund-detail-facts[b-zc0q9sc20g] {
    margin-bottom: 1rem;
}

/* Label und Wert je Fakt in einer Zeile („Fundort: Bahnhof") — Paare per <div> gruppiert. */
.fund-detail-facts > div[b-zc0q9sc20g] {
    margin-bottom: .5rem;
}

.fund-detail-facts dt[b-zc0q9sc20g] {
    display: inline;
    font-weight: 600;
}

.fund-detail-facts dt[b-zc0q9sc20g]::after {
    content: ": ";
}

.fund-detail-facts dd[b-zc0q9sc20g] {
    display: inline;
    margin: 0;
}

.fund-detail-intro[b-zc0q9sc20g] {
    margin-bottom: 1rem;
}

.fund-detail-contact[b-zc0q9sc20g] {
    padding-top: 1rem;
    border-top: 1px solid var(--app-border, var(--fbd-mono-mice, #ccc));
}

.fund-detail-address[b-zc0q9sc20g] {
    font-style: normal;
}

/* Kontaktblock in Gruppen (Name/Person, Anschrift, Kontaktwege) mit Abstand — wie Alt-Portal. */
.fund-detail-address > * + *[b-zc0q9sc20g] {
    margin-top: .75rem;
}

.fund-detail-contact-methods > div[b-zc0q9sc20g] {
    display: flex;
    align-items: baseline;
}

/* Icons bündig ausrichten (feste Breite), etwas Abstand zum Text. */
.fund-detail-contact-methods i[b-zc0q9sc20g] {
    flex: none;
    width: 1.25rem;
    margin-right: .25rem;
}

.fund-detail-office-name[b-zc0q9sc20g] {
    font-weight: 600;
}

/* Sekundärtext über --app-muted-text — dasselbe Token wie .form-text und .text-muted in
   app.css. Gilt hier für drei Stellen (Ansprechpartner, Positionsanzeige, Leerzustand). Im
   Normalmodus wird daraus #595959 statt #222222 (7,0:1 statt 15,9:1, beide über AA), im
   Kontrastmodus #e6e6e6 statt eines auf Schwarz unlesbaren Dunkelgraus. */
.fund-detail-contact-person[b-zc0q9sc20g] {
    color: var(--app-muted-text, var(--fbd-mono-nero, #555));
}

.fund-detail-hours[b-zc0q9sc20g] {
    margin-top: .75rem;
}

/* Abstand zwischen Öffnungszeiten-Absätzen (z.B. vor dem Hinweissatz) — wie Alt-Portal. */
.fund-detail-hours-para + .fund-detail-hours-para[b-zc0q9sc20g] {
    margin-top: .75rem;
}

.fund-detail-nav[b-zc0q9sc20g] {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 1rem;
    margin-top: 1.5rem;
    padding-top: 1rem;
    border-top: 1px solid var(--app-border, var(--fbd-mono-mice, #ccc));
}

.fund-detail-position[b-zc0q9sc20g] {
    display: block;
    margin-top: .5rem;
    text-align: center;
    font-size: .875rem;
    color: var(--app-muted-text, var(--fbd-mono-nero, #555));
}

.fund-detail-empty[b-zc0q9sc20g] {
    margin: 0;
    color: var(--app-muted-text, var(--fbd-mono-nero, #555));
}
/* /Components/Fundsuche/FundPaginationComponent.razor.rz.scp.css */
/* Nicht abschneiden: bei Bedarf umbrechen, statt links aus dem Sichtbereich zu laufen
   (WCAG 1.4.10 Reflow). Durch die gekürzte Zahlenreihe + mobile Kompaktform tritt Überlauf
   praktisch nicht mehr auf; flex-wrap ist die Absicherung. */
.pagination[b-h9i5ke0vir] {
    flex-wrap: wrap;
    row-gap: .25rem;
}
/* /Components/Fundsuche/FundsucheResults.razor.rz.scp.css */
/* Ergebniszeilen sind aktivierbar (Maus + Tastatur) → als anklickbar kenntlich machen. */
.fundsuche-row[b-adcf015dl4] {
    cursor: pointer;
}

/* Dezenter, aus der Office-Primärfarbe abgeleiteter Blauton (pro Office korrekt, WCAG-sicher:
   dunkler Zeilentext auf ~90 % Weiß). Auf die Zellen (<td>) legen, weil Bootstrap den Zellen einen
   opaken Hintergrund (--bs-table-bg) gibt, der einen Hintergrund auf dem <tr> verdecken würde.

   Im Kontrastmodus trägt die Mischung nicht: --office-primary ist dort WEISS, beigemischt zu
   Weiß bleibt Weiß — und der Zeilentext ist weiß. Deshalb --app-row-hover, das nur in
   html.a11y-contrast definiert ist (app.css); im Normalmodus greift der Fallback und die
   Mischung bleibt unverändert. Diese Datei ist scoped CSS und kann html.a11y-contrast nicht
   als Vorfahren adressieren, ein Token ist hier also der einzige Weg. */
.fundsuche-row:hover > td[b-adcf015dl4] {
    background-color: var(--app-row-hover,
        color-mix(in srgb, var(--office-primary, #004987) 10%, white));
}

/* Titel-Auslöser als Text gestylt (kein Button-Chrome), aber echtes <button> für Tastatur/SR. */
.fundsuche-row-btn[b-adcf015dl4] {
    display: block;
    width: 100%;
    padding: 0;
    border: 0;
    background: none;
    text-align: left;
    color: inherit;
    font: inherit;
    cursor: pointer;
}

/* Sichtbarer Fokus-Indikator (WCAG 2.2). */
.fundsuche-row-btn:focus-visible[b-adcf015dl4] {
    outline: 2px solid var(--office-link, var(--fbd-blue-vois));
    outline-offset: 2px;
}
/* /Components/Layout/AccessibilityToggle.razor.rz.scp.css */
/* Kontrast-Toggle. Grundgedanke: Der Button zeichnet Rahmen, Text und Fokusring durchgehend
   in EINER Farbe (currentColor) und erbt sie von der Fläche, auf der er sitzt. Damit braucht er
   keinen Override im Kontrastmodus — die scoped CSS-Isolation kennt kein :global() für
   Vorfahren-Selektoren wie html.a11y-contrast, ein Override müsste also in die globale app.css
   wandern. Genau das wird hier vermieden.

   Zwei Umgebungen:
   - Standard: heller Seitengrund → Fließtextfarbe (--app-page-text, im Kontrastmodus weiß).
   - .a11y-toggle--brand: gefüllte Kopfleiste → Header-Schriftfarbe (--office-primary-fontcolor,
     im Kontrastmodus schwarz auf der dann weißen Leiste). */
.a11y-toggle[b-nzignem9ok] {
    display: inline-flex;
    align-items: center;
    gap: 0.35rem;
    flex: 0 0 auto; /* schrumpft nicht weg neben Office-Name oder Zurück-Link */
    background: transparent;
    color: var(--app-page-text, #212529);
    border: 1px solid currentColor; /* als Button erkennbar, Kontrast = Textkontrast */
    font-weight: 400;
    white-space: nowrap;
}

.a11y-toggle--brand[b-nzignem9ok] {
    color: var(--office-primary-fontcolor, var(--fbd-mono-white));
}

/* Hover: Unterstreichung statt Füllung — eine gefüllte Fläche müsste ihre Textfarbe umkehren
   und wäre damit wieder von der Umgebung abhängig. */
.a11y-toggle:hover[b-nzignem9ok] {
    background: transparent;
    color: inherit;
    text-decoration: underline;
}

/* Aktiver Zustand (Kontrast an): kräftigerer Rahmen + fett. Der zweite Rahmen kommt als
   inset-Schatten, damit die Kastenbreite gleich bleibt und der Text nicht springt.
   Bewusst zwei Unterscheidungsmerkmale (Rahmen UND Schriftstärke), nicht nur Farbe. */
.a11y-toggle[aria-pressed="true"][b-nzignem9ok] {
    box-shadow: inset 0 0 0 1px currentColor;
    font-weight: 600;
}

/* Sichtbarer Tastaturfokus: deckende outline statt Bootstraps halbtransparentem Innenschatten
   (der liegt bei ~3:1 exakt am Minimum von WCAG 1.4.11). box-shadow wird unterdrückt, damit
   im gedrückten Zustand nicht zwei Ringe entstehen. */
.a11y-toggle:focus-visible[b-nzignem9ok] {
    outline: 3px solid currentColor;
    outline-offset: 2px;
    box-shadow: none;
}

/* Wenig Platz: nur das Icon. Der Text bleibt als visually-hidden erhalten (zugänglicher Name
   für Screenreader) — display:none würde ihn auch dort entfernen, der Button hätte dann keinen
   Namen mehr. Der Tooltip (title) trägt die Bedeutung für sehende Mausnutzer. */
@media (max-width: 575.98px) {
    .a11y-toggle[b-nzignem9ok] {
        gap: 0;
    }

    .a11y-toggle-text[b-nzignem9ok] {
        position: absolute;
        width: 1px;
        height: 1px;
        padding: 0;
        margin: -1px;
        overflow: hidden;
        clip-path: inset(50%);
        white-space: nowrap;
        border: 0;
    }
}

/* Erzwingt der Browser die Farben selbst (Windows-Kontrastdesigns), hat er die Aufgabe des
   App-Kontrastmodus schon übernommen: Er ersetzt die Autorenfarben, der Token-Flip bliebe ohne
   sichtbare Wirkung. Ein Schalter, der sein Versprechen nicht halten kann, wird nicht angeboten.

   display:none nimmt ihn auch aus dem Accessibility-Tree — hier GEWOLLT und damit bewusst anders
   als beim Text im Schmalviewport oben, wo visually-hidden richtig ist, weil der Button dort
   weiter funktioniert.

   Browser ohne forced-colors (u.a. Safari, das "Kontrast erhöhen" auf prefers-contrast abbildet
   und keine Farben erzwingt): Die Regel greift nie, der Schalter bleibt sichtbar. Genau richtig,
   denn dort ersetzt niemand die Farben.

   Gegenstück in C#: AccessibilityPreferencesService.InitializeAsync schaltet unter forced-colors
   auch nicht automatisch ein. */
@media (forced-colors: active) {
    .a11y-toggle[b-nzignem9ok] {
        display: none;
    }
}
/* /Components/Layout/FundanzeigeLayout.razor.rz.scp.css */
.page[b-u4o3r4gg38] {
    position: relative;
    display: flex;
    flex-direction: column;
    border-radius: 5px;
/*    box-shadow: 0 10px 40px rgba(0, 0, 0, 0.1);
    background-color: #F5F5F5;*/
    max-width: 1200px;
    margin: 1rem auto;
    padding: 1rem;
}

main[b-u4o3r4gg38] {
    flex: 1;
}

/* Fläche und Rahmen über die --app-*-Ebene: Deren Defaults sind wörtlich die bisherigen Werte
   (--app-surface = --fbd-mono-gallery, --app-border = --fbd-mono-mice), im Normalmodus ändert
   sich also nichts. Im Kontrastmodus flippt die Sidebar damit mit, ohne dass diese Datei einen
   Vorfahren-Selektor bräuchte — den kennt die Blazor-CSS-Isolation nicht. */
.sidebar[b-u4o3r4gg38] {
    background-color: var(--app-surface, var(--fbd-mono-gallery));
    border-radius: 10px;
    border: 1px solid var(--app-border, var(--fbd-mono-mice)); /* monochromeMice - Rahmenfarbe */
    position: relative;
}

    .top-row[b-u4o3r4gg38]  a, .top-row[b-u4o3r4gg38]  .btn-link {
        white-space: nowrap;
        margin-left: 1.5rem;
        text-decoration: none;
    }

    .top-row[b-u4o3r4gg38]  a:hover, .top-row[b-u4o3r4gg38]  .btn-link:hover {
        text-decoration: underline;
    }

    .top-row[b-u4o3r4gg38]  a:first-child {
        overflow: hidden;
        text-overflow: ellipsis;
    }

@media (max-width: 768px) {
    .top-row[b-u4o3r4gg38] {
        justify-content: space-between;
    }

    .top-row[b-u4o3r4gg38]  a, .top-row[b-u4o3r4gg38]  .btn-link {
        margin-left: 0;
    }
}

@media (min-width: 769px) {
    .page[b-u4o3r4gg38] {
        flex-direction: row;
        gap: 1.5rem;
        align-items: flex-start;
        padding: 1.5rem;
    }

    .sidebar[b-u4o3r4gg38] {
        width: 250px;
        height: fit-content;
        position: sticky;
        top: 1rem;
        flex-shrink: 0;
    }

    main[b-u4o3r4gg38] {
        flex: 1;
        min-width: 0;
    }

    .top-row[b-u4o3r4gg38] {
        position: sticky;
        top: 0;
        z-index: 1;
    }

    .top-row.auth[b-u4o3r4gg38]  a:first-child {
        flex: 1;
        text-align: right;
        width: 0;
    }
}

/* Die Fehlerleiste bleibt bewusst immer hell (color-scheme: light only). Die Textfarbe muss
   deshalb ausdrücklich dastehen: Geerbt kam sie aus --app-page-text und wurde im Kontrastmodus
   weiß — weiß auf lightyellow, 1,07:1. Der Wert ist der, der im Normalmodus ohnehin geerbt wird.

   Der Link „Neu laden" braucht eine EIGENE Regel: color am div erreicht ihn nicht, Bootstrap
   färbt ihn über --bs-link-color-rgb, und das dreht der Kontrastblock auf #66ccff — 1,77:1 auf
   lightyellow, also genau das einzige Bedienelement der Leiste unlesbar. #0a58ca liegt bei
   6,33:1. Der Wert steht ausdrücklich da und wird nicht geerbt, weil Bootstraps #0d6efd auf
   lightyellow nur 4,42:1 erreicht und die AA-Schwelle schon im Normalmodus verfehlt.
   .dismiss erbt die Textfarbe des div und ist damit mitgelöst. */
#blazor-error-ui[b-u4o3r4gg38] {
    color-scheme: light only;
    color: #212529;
    background: lightyellow;
    bottom: 0;
    box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2);
    box-sizing: border-box;
    display: none;
    left: 0;
    padding: 0.6rem 1.25rem 0.7rem 1.25rem;
    position: fixed;
    width: 100%;
    z-index: 1000;
}

    #blazor-error-ui a[b-u4o3r4gg38] {
        color: #0a58ca;
    }

    #blazor-error-ui .dismiss[b-u4o3r4gg38] {
        cursor: pointer;
        position: absolute;
        right: 0.75rem;
        top: 0.5rem;
    }
/* /Components/Layout/FundanzeigeNavMenu.razor.rz.scp.css */
/* Rahmen, Füllton und Hamburger-Symbol kommen aus --app-toggler-* (app.css :root). Die
   Defaults dort sind die bisherigen Werte, im Normalmodus ändert sich nichts; im Kontrastmodus
   flippen sie auf weißen Rahmen und helles Symbol. Als Tokens und nicht als Override in
   app.css, weil ein Vorfahren-Selektor gegen diese scoped Regel per Spezifität verliert
   (html.a11y-contrast .navbar-toggler (0,1,1) < .navbar-toggler[b-…] (0,2,0)) und die
   CSS-Isolation kein :global() kennt. */
.navbar-toggler[b-xlohsr7v06] {
    appearance: none;
    cursor: pointer;
    width: 2.5rem;
    height: 2.5rem;
    position: absolute;
    top: 37px;
    right: 1rem;
    border: 1px solid var(--app-toggler-border, rgba(0, 0, 0, 0.2));
    border-radius: 4px;
    /* Fallback ist der bisherige Inline-data-URI: Ohne ihn wäre das ganze background-Shorthand
       „invalid at computed-value time", sobald das Token fehlt (Tippfehler, Umbenennung) — der
       Button verlöre Icon UND Füllton und stünde als leerer Kasten da, stumm und ohne 404. */
    background: var(--app-toggler-icon, url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")) no-repeat center/1.75rem var(--app-toggler-bg, rgba(0, 0, 0, 0.05));
    z-index: 1;
}

/* Aufgeklappt: derselbe Füllton eine Stufe kräftiger — unveränderter Bestand. Im Kontrastmodus
   trägt dieser Füllton nicht (er wäre schwarz auf schwarz), deshalb zusätzlich ein Ring, dessen
   Token NUR im Kontrastblock definiert ist: Im Normalmodus greift der Fallback transparent, und
   eine outline nimmt keinen Platz ein — die Darstellung bleibt dort exakt wie bisher.
   Nicht dagegen unter forced-colors: active — dort erzwingt der Browser eine Systemfarbe für
   outline-color, transparent hält also nicht, und der aufgeklappte Button bekommt einen Ring,
   den es vorher nicht gab. Optisch harmlos bis hilfreich; forced-colors behandelt Slice 05. */
.navbar-toggler:checked[b-xlohsr7v06] {
    background-color: rgba(0, 0, 0, 0.1);
    outline: 2px solid var(--app-toggler-ring-checked, transparent);
    outline-offset: 1px;
}

.top-row[b-xlohsr7v06] {
    min-height: 100px;
    padding-top: 1rem;
    padding-right: 4rem;
    padding-bottom: 0.5rem;
    gap: 1rem;
    flex-direction: row;
    align-items: center;
    justify-content: flex-start;
    flex-wrap: wrap;
    /* Mindestbreite, die der Office-Name neben dem Logo behalten will, bevor er
       auf eine eigene Zeile darunter umbricht (Kollisionsschutz zum navbar-toggler). */
    --office-name-wrap-threshold: 11rem;
}

.top-row .logo-container[b-xlohsr7v06] {
    display: flex;
    align-items: center;
    justify-content: center;
    max-height: 80px;
    max-width: 200px;
    padding: 4px 8px;
    background: var(--fbd-mono-white);
    border-radius: 4px;
    flex-shrink: 0;
    /* Fällt das Logo aus (Pfad in der DB gesetzt, Datei unter wwwroot/uploads fehlt), zeigt der
       Browser statt des Bildes den alt-Text — auf dieser bewusst weißen Fläche. Im Kontrastmodus
       erbt er das globale Weiß von html.a11y-contrast und wäre unsichtbar (1,00:1); das Token
       dreht ihn dort auf Schwarz. Bauart „Token ohne :root-Default": Diese Regel liegt in scoped
       CSS, das html.a11y-contrast nicht als Vorfahren adressieren kann — im Normalmodus greift
       der Fallback `inherit` und die Darstellung bleibt unverändert. */
    color: var(--app-logo-surface-text, inherit);
}

.top-row .logo-container img[b-xlohsr7v06] {
    max-height: 72px;
    max-width: 184px;
    width: auto;
    height: auto;
    object-fit: contain;
}

.office-name[b-xlohsr7v06] {
    /* Branding: Office-Name in der lesbar gehaltenen Primärfarbe (Brand-Tint auf grauer Sidebar). */
    color: var(--office-primary-readable, var(--bs-primary));
    font-weight: 600;
    line-height: 1.25;
    min-width: 0;
    flex: 1 1 var(--office-name-wrap-threshold);
    hyphens: auto;
    overflow-wrap: break-word;
}

.office-name-prefix[b-xlohsr7v06] {
    font-size: 0.875rem;
    font-weight: 500;
}

.office-name-value[b-xlohsr7v06] {
    font-size: 1rem;
}

@media (min-width: 769px) {
    .top-row[b-xlohsr7v06] {
        flex-direction: column;
        align-items: flex-start;
        padding-right: 1rem;
        flex-wrap: nowrap;
    }

    /* Wrap-Mechanismus ist nur im Mobile-row-Layout relevant; in der Spalte
       darf flex-grow den Namen nicht vertikal strecken. */
    .office-name[b-xlohsr7v06] {
        flex: 0 0 auto;
    }
}

.navbar-brand[b-xlohsr7v06] {
    font-size: 1.1rem;
}

.nav-link:hover .step-badge[b-xlohsr7v06] {
    background-color: var(--office-primary-hover, var(--fbd-blue-science));
    border-color: var(--office-primary-hover, var(--fbd-blue-science));
    color: var(--office-primary-fontcolor, var(--fbd-mono-white));
}

.nav-link:hover .step-label[b-xlohsr7v06] {
    text-decoration:underline;
}

.nav-item[b-xlohsr7v06] {
    font-size: 0.9rem;
    padding-bottom: 0.5rem;
}

    .nav-item:first-of-type[b-xlohsr7v06] {
        padding-top: 1rem;
    }

    .nav-item:last-of-type[b-xlohsr7v06] {
        padding-bottom: 1rem;
    }

    .nav-item[b-xlohsr7v06]  .nav-link {
        color: var(--office-primary-readable, var(--fbd-blue-vois));
        font-weight: bold;
        background: none;
        border: none;
        border-radius: 4px;
        height: 3rem;
        display: flex;
        align-items: center;
        line-height: 3rem;
        width: 100%;
    }

.nav-item[b-xlohsr7v06]  a.active {
    background-color: rgba(255,255,255,0.37);
    color: white;
}

/* Gethemter, sichtbarer Fokusindikator (nur Tastatur). outline-offset legt den Ring
   ausserhalb des Buttons auf die graue Sidebar → auch beim aktiven (gefüllten) Schritt sichtbar. */
.nav-item[b-xlohsr7v06]  .nav-link:focus-visible {
    outline: 3px solid var(--office-primary-readable, var(--fbd-blue-vois));
    outline-offset: 2px;
    box-shadow: none; /* Bootstraps blauen Innenschatten (rgba(13,110,253,.25)) unterdrücken */
}

.nav-item[b-xlohsr7v06]  .nav-link.disabled {
    opacity: 0.5;
    cursor: not-allowed;
    pointer-events: none;
}

.nav-item[b-xlohsr7v06]  .nav-link:hover {
    text-decoration: none;
}

.nav-scrollable[b-xlohsr7v06] {
    display: none;
}

.navbar-toggler:checked ~ .nav-scrollable[b-xlohsr7v06] {
    display: block;
}

@media (min-width: 769px) {
    .navbar-toggler[b-xlohsr7v06] {
        display: none;
    }

    .nav-scrollable[b-xlohsr7v06] {
        /* Never collapse the sidebar for wide screens */
        display: block;
    }
}
/* /Components/Layout/MainLayout.razor.rz.scp.css */
.page[b-rjxdxwep5x] {
    position: relative;
    display: flex;
    flex-direction: column;
}

main[b-rjxdxwep5x] {
    flex: 1;
}

/* Entfernt in Slice 05: die Regeln für .sidebar und .top-row samt ihrer Anteile in den beiden
   Media Queries. Beides sind Reste der Blazor-Projektvorlage — MainLayout.razor trägt nur .page,
   main und article.content, die Elemente gab es hier nie. Ihre Festfarben (rgb(145,145,145) und
   #f7f7f7) waren damit auch im Kontrastmodus unerreichbar; sie zu "reparieren" hätte nur den
   Eindruck erzeugt, hier gäbe es eine Leiste. */
@media (min-width: 641px) {
    .page[b-rjxdxwep5x] {
        flex-direction: row;
    }

    article[b-rjxdxwep5x] {
        padding-left: 2rem !important;
        padding-right: 1.5rem !important;
    }
}

/* color und die a-Regel gegen den Kontrastmodus — Begründung samt Kontrastwerten in
   FundanzeigeLayout.razor.css, wo dieselbe Leiste steht. */
#blazor-error-ui[b-rjxdxwep5x] {
    color-scheme: light only;
    color: #212529;
    background: lightyellow;
    bottom: 0;
    box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2);
    box-sizing: border-box;
    display: none;
    left: 0;
    padding: 0.6rem 1.25rem 0.7rem 1.25rem;
    position: fixed;
    width: 100%;
    z-index: 1000;
}

    #blazor-error-ui a[b-rjxdxwep5x] {
        color: #0a58ca;
    }

    #blazor-error-ui .dismiss[b-rjxdxwep5x] {
        cursor: pointer;
        position: absolute;
        right: 0.75rem;
        top: 0.5rem;
    }
/* /Components/Layout/PortalHeader.razor.rz.scp.css */
/* Testbetrieb-Banner: volle Breite oben, aber ein wenig Luft zur farbigen Kopfleiste. */
.portal-testmode-banner[b-cz3bwfj8ep] {
    margin-bottom: 0.75rem;
}

/* Farbige Kopfleiste (Branding via --office-*). Analog Alt-Portal .header/#Kopfzeile:
   dezenter Schatten, Inhalt in einer Zeile — Zurück-Link links, Office-Name rechts. */
.portal-header[b-cz3bwfj8ep] {
    display: flex;
    align-items: center;
    gap: 1rem;
    min-height: 3rem;
    padding: 0.5rem 1.5rem;
    background-color: var(--office-primary, var(--fbd-blue-vois));
    color: var(--office-primary-fontcolor, var(--fbd-mono-white));
    box-shadow: 0 1px 5px 0 rgba(100, 100, 100, 0.75);
}

/* Erzwungene Farben (Slice 05): Die Leiste hebt sich allein über ihre Füllung und den box-shadow
   vom Seiteninhalt ab. Ein aktives Kontrastdesign ersetzt die Füllung durch die Canvas-Farbe und
   verwirft den Schatten (gemessen, siehe app.css-Block "Erzwungene Farben") — die Kopfleiste
   verschwimmt dann mit der Seite. Rahmenbreite null lässt sich vom erzwungenen Modus nicht
   einfärben, deshalb kommt die Kante hier von Hand.

   Die Regel steht in dieser Datei und nicht in app.css, weil die scoped CSS-Isolation den
   Selektor sonst nicht an das Element bindet — dasselbe Insel-Muster wie in den Slices 02–04.
   Die schlanke Variante (.portal-header-slim) braucht keinen Eintrag: Sie hat keine Füllung,
   die verschmelzen könnte. */
@media (forced-colors: active) {
    .portal-header[b-cz3bwfj8ep] {
        border-bottom: 1px solid CanvasText;
    }
}

/* Office-Name und Kontrast-Toggle als Gruppe rechtsbündig — auch ohne Zurück-Link. Das
   margin-left: auto sitzt am Office-Namen, der Toggle folgt ihm über das flex-gap. */
.portal-header-office[b-cz3bwfj8ep] {
    margin-left: auto;
    font-size: 1.1rem;
    font-weight: 600;
}

.portal-header-back[b-cz3bwfj8ep] {
    color: var(--office-primary-fontcolor, var(--fbd-mono-white));
    text-decoration: none;
    white-space: nowrap;
    font-weight: 500;
}

    .portal-header-back:hover[b-cz3bwfj8ep],
    .portal-header-back:focus-visible[b-cz3bwfj8ep] {
        text-decoration: underline;
    }

/* Schlanke Variante: kein Branding sichtbar, nur der Zurück-Link. Ohne farbige Leiste steht der
   Link auf dem hellen Seitenhintergrund → Link-Farbe über --office-link (Auto-Kontrast gilt gegen
   Weiß). */
.portal-header-slim[b-cz3bwfj8ep] {
    display: flex;
    align-items: center;
    gap: 1rem;
    padding: 0.75rem 1.5rem 0;
}

.portal-header-back--slim[b-cz3bwfj8ep] {
    display: inline-block;
    color: var(--office-link, var(--fbd-blue-vois));
}

/* In der schlanken Leiste gibt es keinen Office-Namen, der die Gruppe nach rechts schiebt —
   das übernimmt hier der Toggle selbst. Greift auch im Zweig ohne Zurück-Link, wo er allein
   in der Leiste steht. */
.portal-header-slim .portal-header-toggle[b-cz3bwfj8ep] {
    margin-left: auto;
}
/* /Components/Layout/PortalLayout.razor.rz.scp.css */
/* Scoped Styling für das schlanke Portal-Layout. Enthält bewusst nur Grundlayout und die
   #blazor-error-ui-Regel: Ohne diese scoped Regel (sie liegt sonst in MainLayout/FundanzeigeLayout
   und gilt dort nur für die jeweilige Komponente) bliebe das Fehler-Div auf der Portal-Seite
   dauerhaft sichtbar ("Es ist ein unerwarteter Fehler aufgetreten."), obwohl gar kein Fehler vorliegt. */

.page[b-cjnw4lircc] {
    position: relative;
    display: flex;
    flex-direction: column;
}

main[b-cjnw4lircc] {
    flex: 1;
}

/* color und die a-Regel gegen den Kontrastmodus — Begründung samt Kontrastwerten in
   FundanzeigeLayout.razor.css, wo dieselbe Leiste steht. */
#blazor-error-ui[b-cjnw4lircc] {
    color-scheme: light only;
    color: #212529;
    background: lightyellow;
    bottom: 0;
    box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2);
    box-sizing: border-box;
    display: none;
    left: 0;
    padding: 0.6rem 1.25rem 0.7rem 1.25rem;
    position: fixed;
    width: 100%;
    z-index: 1000;
}

    #blazor-error-ui a[b-cjnw4lircc] {
        color: #0a58ca;
    }

    #blazor-error-ui .dismiss[b-cjnw4lircc] {
        cursor: pointer;
        position: absolute;
        right: 0.75rem;
        top: 0.5rem;
    }
/* /Components/Layout/PrefillItemBanner.razor.rz.scp.css */
.prefill-banner[b-stif15cqne] {
    position: sticky;
    top: 0;
    z-index: 100;
    background-color: var(--bs-info-bg-subtle, #cff4fc);
    border: 1px solid var(--bs-info-border-subtle, #9eeaf9);
    border-radius: 0.375rem;
    padding: 0.75rem 1rem;
    margin-bottom: 1rem;
    display: flex;
    align-items: center;
    gap: 0.75rem;
    color: var(--bs-info-text-emphasis, #055160);
}

.prefill-banner__text[b-stif15cqne] {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: 0.25rem 0.75rem;
}

.prefill-banner__separator[b-stif15cqne] {
    opacity: 0.6;
}

.prefill-banner i[b-stif15cqne] {
    font-size: 1.25rem;
    flex-shrink: 0;
}

@media (max-width: 575.98px) {
    .prefill-banner__separator[b-stif15cqne] {
        display: none;
    }
}
/* /Components/Layout/ReconnectModal.razor.rz.scp.css */
.components-reconnect-first-attempt-visible[b-mw5dq96cpe],
.components-reconnect-repeated-attempt-visible[b-mw5dq96cpe],
.components-reconnect-failed-visible[b-mw5dq96cpe],
.components-pause-visible[b-mw5dq96cpe],
.components-resume-failed-visible[b-mw5dq96cpe],
.components-rejoining-animation[b-mw5dq96cpe] {
    display: none;
}

#components-reconnect-modal.components-reconnect-show .components-reconnect-first-attempt-visible[b-mw5dq96cpe],
#components-reconnect-modal.components-reconnect-show .components-rejoining-animation[b-mw5dq96cpe],
#components-reconnect-modal.components-reconnect-paused .components-pause-visible[b-mw5dq96cpe],
#components-reconnect-modal.components-reconnect-resume-failed .components-resume-failed-visible[b-mw5dq96cpe],
#components-reconnect-modal.components-reconnect-retrying[b-mw5dq96cpe],
#components-reconnect-modal.components-reconnect-retrying .components-reconnect-repeated-attempt-visible[b-mw5dq96cpe],
#components-reconnect-modal.components-reconnect-retrying .components-rejoining-animation[b-mw5dq96cpe],
#components-reconnect-modal.components-reconnect-failed[b-mw5dq96cpe],
#components-reconnect-modal.components-reconnect-failed .components-reconnect-failed-visible[b-mw5dq96cpe] {
    display: block;
}


/* Kontrastmodus (Slice 05): Der Dialog war fest weiß, seine Textfarbe kam aus der Vererbung —
   im Modus also WEISS AUF WEISS (1,00:1), und zwar an der letzten Meldung, die ein Nutzer bei
   abreißender Verbindung überhaupt noch sieht. Kein Messpunkt hatte ihn vorher angefasst, weil er
   im Normalfall geschlossen ist.

   Flächen- und Textfarbe kommen deshalb aus der --app-*-Ebene (die hat einen :root-Default, der
   Normalmodus bleibt damit bei weiß/#212529). Die Textfarbe steht ausdrücklich da und wird NICHT
   geerbt: Genau die Vererbung war der Fehler.

   Der Rahmen ersetzt `border: 0`. --app-dialog-border ist bewusst ohne :root-Default (app.css) —
   im Normalmodus greift der Fallback `transparent`, der Dialog bleibt also randlos wie bisher, im
   Kontrastmodus ist der weiße Rahmen seine einzige Kante gegen die schwarze Seite. Dass die Kante
   überhaupt eine Breite hat, löst zugleich den forced-colors-Fall: Der erzwungene Modus färbt
   einen transparenten Rahmen sichtbar ein, eine Breite von null kann er dagegen nicht füllen —
   ohne diese Zeile stünde der Dialog dort unsichtbar auf weißem Grund (der box-shadow, der ihn
   sonst abhebt, wird verworfen; gemessen, siehe app.css-Block "Erzwungene Farben"). */
#components-reconnect-modal[b-mw5dq96cpe] {
    background-color: var(--app-page-bg, white);
    color: var(--app-page-text, #212529);
    width: 20rem;
    margin: 20vh auto;
    padding: 2rem;
    border: 1px solid var(--app-dialog-border, transparent);
    border-radius: 0.5rem;
    box-shadow: 0 3px 6px 2px rgba(0, 0, 0, 0.3);
    opacity: 0;
    transition: display 0.5s allow-discrete, overlay 0.5s allow-discrete;
    animation: components-reconnect-modal-fadeOutOpacity-b-mw5dq96cpe 0.5s both;
    &[open]

{
    animation: components-reconnect-modal-slideUp-b-mw5dq96cpe 1.5s cubic-bezier(.05, .89, .25, 1.02) 0.3s, components-reconnect-modal-fadeInOpacity-b-mw5dq96cpe 0.5s ease-in-out 0.3s;
    animation-fill-mode: both;
}

}

#components-reconnect-modal[b-mw5dq96cpe]::backdrop {
    background-color: rgba(0, 0, 0, 0.4);
    animation: components-reconnect-modal-fadeInOpacity-b-mw5dq96cpe 0.5s ease-in-out;
    opacity: 1;
}

@keyframes components-reconnect-modal-slideUp-b-mw5dq96cpe {
    0% {
        transform: translateY(30px) scale(0.95);
    }

    100% {
        transform: translateY(0);
    }
}

@keyframes components-reconnect-modal-fadeInOpacity-b-mw5dq96cpe {
    0% {
        opacity: 0;
    }

    100% {
        opacity: 1;
    }
}

@keyframes components-reconnect-modal-fadeOutOpacity-b-mw5dq96cpe {
    0% {
        opacity: 1;
    }

    100% {
        opacity: 0;
    }
}

.components-reconnect-container[b-mw5dq96cpe] {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 1rem;
}

#components-reconnect-modal p[b-mw5dq96cpe] {
    margin: 0;
    text-align: center;
}

/* Kontrast (WCAG 1.4.3): Die Template-Farben #6b9ed2 (normal UND :active) ergaben mit weißem Text
   nur 2,82:1. Jetzt auf die Theming-Tokens wie bei .btn-primary in app.css — der Fallback #004987
   kommt auf 9,12:1 gegen Weiß, mit Office-Kontext greift die Auto-Kontrast-Ableitung aus
   OfficeThemeStyle (schreibt global auf :root, gilt also auch im Top-Layer des <dialog>).

   Der Rahmen ersetzt `border: 0` und ist BEWUSST transparent, nicht farbig: Im Normal- und im
   Kontrastmodus soll sich am Aussehen nichts ändern (dort trägt die Füllung die Fläche), nur
   unter forced-colors braucht der Knopf eine Kante. Dort ersetzt der Browser die Füllung durch
   ButtonFace — in den gängigen Windows-Kontrastdesigns deckungsgleich mit Canvas —, färbt einen
   transparenten RAHMEN aber sichtbar ein; eine Breite von null kann er nicht füllen. Ohne diese
   Zeile bliebe vom einzigen Handlungsknopf des Dialogs nur Text ohne Fläche. Gleiche Bauart wie
   .btn bei Bootstrap, siehe den app.css-Block "Erzwungene Farben". */
#components-reconnect-modal button[b-mw5dq96cpe] {
    border: 1px solid transparent;
    background-color: var(--office-primary, var(--fbd-blue-vois));
    color: var(--office-primary-fontcolor, var(--fbd-mono-white));
    padding: 4px 24px;
    border-radius: 4px;
}

    #components-reconnect-modal button:hover[b-mw5dq96cpe] {
        background-color: var(--office-primary-hover, var(--fbd-blue-science));
    }

    #components-reconnect-modal button:active[b-mw5dq96cpe] {
        background-color: var(--office-primary-active, var(--fbd-blue-science));
    }

.components-rejoining-animation[b-mw5dq96cpe] {
    position: relative;
    width: 80px;
    height: 80px;
}

    .components-rejoining-animation div[b-mw5dq96cpe] {
        position: absolute;
        border: 3px solid #0087ff;
        opacity: 1;
        border-radius: 50%;
        animation: components-rejoining-animation-b-mw5dq96cpe 1.5s cubic-bezier(0, 0.2, 0.8, 1) infinite;
    }

        .components-rejoining-animation div:nth-child(2)[b-mw5dq96cpe] {
            animation-delay: -0.5s;
        }

@keyframes components-rejoining-animation-b-mw5dq96cpe {
    0% {
        top: 40px;
        left: 40px;
        width: 0;
        height: 0;
        opacity: 0;
    }

    4.9% {
        top: 40px;
        left: 40px;
        width: 0;
        height: 0;
        opacity: 0;
    }

    5% {
        top: 40px;
        left: 40px;
        width: 0;
        height: 0;
        opacity: 1;
    }

    100% {
        top: 0px;
        left: 0px;
        width: 80px;
        height: 80px;
        opacity: 0;
    }
}
/* /Components/Pages/Fundsuche.razor.rz.scp.css */
/* Farben laufen über die --app-*-Ebene (app.css), damit der Kontrastmodus sie mitdreht: Diese
   Datei ist scoped CSS und kann html.a11y-contrast nicht als Vorfahren adressieren.
   --app-border ist im Normalmodus --fbd-mono-mice, die Darstellung bleibt also gleich. */
.fundsuche-searchbox[b-f8quzbfp2g] {
    border: 1px solid var(--app-border, var(--fbd-mono-mice, #ccc));
    border-radius: .375rem;
    padding: 1rem;
}

/* Tabelle wird von der Kindkomponente FundsucheResults gerendert → ::deep. */
/* Diese Regel ist WIRKUNGSLOS und bleibt nur unverändert stehen, damit der Slice keine
   Darstellung ändert, die niemand bestellt hat: Bootstrap gibt jeder Zelle einen opaken
   Hintergrund (--bs-table-bg), der einen Hintergrund auf dem <tr> verdeckt — dieselbe
   Beobachtung, die unten die Hover-Fläche auf die <td> zwingt. Ein Zebra müsste also auf die
   Zellen wandern, und das wäre im Normalmodus eine sichtbare Änderung. Die Zeilen
   unterscheidet ohnehin die border-bottom darunter, im Kontrastmodus in Weiß (21:1) — das
   Kriterium „nicht allein über Hintergrundfarbe" ist damit erfüllt. */
[b-f8quzbfp2g] .fundsuche-table tbody tr:nth-of-type(odd) {
    background-color: var(--fbd-mono-gallery, #f0f0f0);
}

[b-f8quzbfp2g] .fundsuche-table th,
[b-f8quzbfp2g] .fundsuche-table td {
    border-bottom: 1px solid var(--app-border, var(--fbd-mono-mice, #ccc));
    vertical-align: top;
}

[b-f8quzbfp2g] .fundsuche-title {
    font-weight: 600;
    display: block;
}

/* Sekundärtext über --app-muted-text — dasselbe Token, das .form-text und .text-muted in
   app.css benutzen. Im Normalmodus wird die Kurzbeschreibung damit #595959 statt #222222
   (7,0:1 statt 15,9:1, beide über AA); das vereinheitlicht sie mit dem übrigen Hilfetext. */
[b-f8quzbfp2g] .fundsuche-desc {
    display: block;
    font-size: .875rem;
    color: var(--app-muted-text, var(--fbd-mono-nero, #555));
}
/* /Components/Pages/VersteigerungenVorOrtDetail.razor.rz.scp.css */
/* Rahmen über --app-border (app.css), damit der Kontrastmodus sie mitdreht: Diese Datei ist
   scoped CSS und kann html.a11y-contrast nicht als Vorfahren adressieren. Im Normalmodus ist
   das Token wertgleich zu --fbd-mono-mice (#919191), im Modus #ffffff. Der zweite Fallback
   bleibt für den Fall stehen, dass app.css nicht geladen ist. */
.offline-item-table th[b-h3pm28j8bh],
.offline-item-table td[b-h3pm28j8bh] {
    border-bottom: 1px solid var(--app-border, var(--fbd-mono-mice, #ccc));
    vertical-align: middle;
}

.offline-item-thumb-cell[b-h3pm28j8bh] {
    width: 120px;
}

.offline-item-thumb[b-h3pm28j8bh] {
    max-width: 100px;
    height: auto;
    border: 1px solid var(--app-border, var(--fbd-mono-mice, #ccc));
}

/* Platzhalter, wenn kein Bild vorhanden ist — gleiche Anmutung wie ein Vorschaubild. */
.offline-item-thumb-empty[b-h3pm28j8bh] {
    display: inline-flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    width: 100px;
    min-height: 64px;
    border: 1px solid var(--app-border, var(--fbd-mono-mice, #ccc));
    text-align: center;
}
/* /Components/Shared/CategorySearchComboBox.razor.rz.scp.css */
.category-combo[b-gt704b5xsn] {
    position: relative;
}

.category-combo__list[b-gt704b5xsn] {
    position: absolute;
    z-index: 1050;
    left: 0;
    right: 0;
    max-height: 20rem;
    overflow-y: auto;
    margin-top: 2px;
    padding: 0;
    list-style: none;
    /* Fläche über --app-surface-raised (nur in html.a11y-contrast definiert, app.css): im
       Normalmodus greift der Fallback und der Wert bleibt weiß, im Kontrastmodus flippt die
       Liste mit. Vorher war die Liste dort unsichtbar — weißer Grund, und der Listentext erbt
       --app-page-text, im Modus ebenfalls weiß. Der Rahmen bleibt --fbd-mono-mice: 6,5:1 auf
       Schwarz, über den 3:1 aus WCAG 1.4.11. */
    background: var(--app-surface-raised, var(--fbd-mono-white, #fff));
    border: 1px solid var(--fbd-mono-mice, #919191);
    border-radius: .375rem;
    box-shadow: 0 .5rem 1rem rgba(0, 0, 0, .15);
}

.category-combo__option[b-gt704b5xsn] {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: .1rem .5rem;
    padding: .5rem .75rem;
    cursor: pointer;
}

/* Aktive (per Pfeiltasten) und gehoverte Option teilen dieselbe Hervorhebung. Hover wirkt rein
   optisch: kein onmouseenter-Handler, also kein Serverzustand und keine ARIA-Markierung.

   Im Kontrastmodus taugt die gerechnete Fläche nicht: --office-primary ist dort weiß, das
   color-mix ergibt also wieder Weiß. Deshalb ein Token für die Fläche und ein zweites für einen
   Innenrahmen. Beide haben keinen :root-Default — im Normalmodus greifen die Fallbacks, und
   eine outline nimmt keinen Platz ein, die Zeile sieht dort genauso aus wie bisher.
   Nicht dagegen unter forced-colors: active — dort erzwingt der Browser eine Systemfarbe für
   outline-color, transparent hält also nicht, und jede gehoverte oder aktive Option bekommt
   einen Ring, den es vorher nicht gab. Optisch harmlos bis hilfreich; forced-colors behandelt
   Slice 05. */
.category-combo__option.active[b-gt704b5xsn],
.category-combo__option:hover[b-gt704b5xsn] {
    background-color: var(--app-surface-raised-active, color-mix(in srgb, var(--office-primary, #004987) 12%, white));
    outline: 2px solid var(--app-surface-raised-active-ring, transparent);
    outline-offset: -2px;
}

.category-combo__label :is(strong)[b-gt704b5xsn] {
    font-weight: 700;
}

/* --fbd-mono-nero wäre auf der im Kontrastmodus schwarzen Liste unlesbar; das Token liefert
   dort einen hellen Grauton (mit der opacity von .75 noch ~9:1 auf Schwarz). */
.category-combo__origin[b-gt704b5xsn] {
    font-size: .875em;
    color: var(--app-surface-raised-muted, var(--fbd-mono-nero, #222));
    opacity: .75;
}

/* Kennzeichnung einer gesperrten Kategorie. Die Information trägt der Text ("· nicht online
   meldbar"), die Farbe verstärkt sie nur (WCAG 1.4.1). Bewusst OHNE opacity wie beim
   Herkunftshinweis: #A80212 auf Weiß liegt bei ~8:1 und bleibt auch auf der hervorgehobenen
   Option (12 % --office-primary auf Weiß) deutlich über 4.5:1 — eine Abschwächung würde das
   angreifen. Semantische Farbe, deshalb --fbd-* und nicht --office-*.
   Im Kontrastmodus liegt #A80212 auf Schwarz bei 2,63:1; das Token liefert dort dieselbe helle
   Rotstufe, die auch .validation-message und der .alert-danger-Rahmen verwenden — Rot bleibt
   damit Bedeutungsträger. */
.category-combo__blocked[b-gt704b5xsn] {
    font-size: .875em;
    color: var(--app-surface-raised-danger, var(--fbd-red-carmine, #A80212));
}
/* /Components/Shared/ZipCityAutocomplete.razor.rz.scp.css */
/* Fläche und Hervorhebung über --app-surface-raised-* (definiert nur in html.a11y-contrast,
   app.css). Im Normalmodus greifen die Fallbacks und die Werte bleiben die bisherigen; im
   Kontrastmodus flippt die Liste mit, ohne dass diese Datei einen Vorfahren-Selektor bräuchte
   (die Blazor-CSS-Isolation kennt kein :global(), und ein Override aus app.css verlöre gegen
   die scoped Regel per Spezifität). Die Textfarbe braucht kein Token: Sie wird geerbt und wird
   durch den Flip der Fläche automatisch richtig. Der Rahmen bleibt #dee2e6 — auf Schwarz 14:1. */
.autocomplete-dropdown[b-gqekmjqinq] {
    position: absolute;
    z-index: 1050;
    min-width: 300px;
    max-height: 200px;
    overflow-y: auto;
    background: var(--app-surface-raised, white);
    border: 1px solid #dee2e6;
    border-radius: .375rem;
    box-shadow: 0 .5rem 1rem rgba(0,0,0,.15);
    list-style: none;
    padding: 0;
    margin-top: 2px;
}

.autocomplete-dropdown li[b-gqekmjqinq] {
    padding: .5rem .75rem;
    cursor: pointer;
}

/* Im Kontrastmodus trägt die Fläche allein nicht (ein heller Ton würde den Text verschlucken),
   deshalb zusätzlich ein Innenrahmen. Sein Token hat keinen :root-Default: Im Normalmodus
   greift der Fallback transparent, und eine outline nimmt keinen Platz ein — die Zeile sieht
   dort genauso aus wie bisher. Nicht dagegen unter forced-colors: active — dort erzwingt der
   Browser eine Systemfarbe für outline-color, transparent hält also nicht, und jede gehoverte
   oder aktive Zeile bekommt einen Ring, den es vorher nicht gab. Optisch harmlos bis hilfreich;
   forced-colors behandelt Slice 05. */
.autocomplete-dropdown li:hover[b-gqekmjqinq],
.autocomplete-dropdown li.active[b-gqekmjqinq] {
    background-color: var(--app-surface-raised-active, #e9ecef);
    outline: 2px solid var(--app-surface-raised-active-ring, transparent);
    outline-offset: -2px;
}
/* /Components/Versteigerungen/AuctionOfflineResults.razor.rz.scp.css */
/* Keine Zebra-Streifen und Hover OHNE Flächen-Tönung — analog der Online-Auktionsliste
   (AuctionResults.razor.css): Die Aktions-Lupe ist ein Office-farbiger Link (--office-link), dessen
   Auto-Kontrast-Garantie (OfficeThemeStyle) nur gegen Weiß gilt. Jede Tönung des Zellhintergrunds —
   auch neutrales Grau — kann den Link-Kontrast unter 4,5:1 drücken (axe prüft :hover nicht, der
   Verstoß bliebe unentdeckt). Hover daher kontrast-neutral: umlaufender, Office-farbiger Rahmen um die
   Zeile aus inset-box-shadows je Zelle; Zelle bleibt weiß. */
.offline-auction-table tbody tr:hover > td[b-10lzd5dvba] {
    box-shadow: inset 0 2px 0 0 var(--office-primary, #004987),
                inset 0 -2px 0 0 var(--office-primary, #004987);
}
.offline-auction-table tbody tr:hover > td:first-child[b-10lzd5dvba] {
    box-shadow: inset 0 2px 0 0 var(--office-primary, #004987),
                inset 0 -2px 0 0 var(--office-primary, #004987),
                inset 2px 0 0 0 var(--office-primary, #004987);
}
.offline-auction-table tbody tr:hover > td:last-child[b-10lzd5dvba] {
    box-shadow: inset 0 2px 0 0 var(--office-primary, #004987),
                inset 0 -2px 0 0 var(--office-primary, #004987),
                inset -2px 0 0 0 var(--office-primary, #004987);
}

/* Rahmen über --app-border (app.css) — Begründung wie in AuctionResults.razor.css: scoped CSS
   erreicht html.a11y-contrast nicht. Im Normalmodus wertgleich zu --fbd-mono-mice (#919191),
   im Kontrastmodus #ffffff. Im Modus ist dieser Trenner die einzige Kante zwischen zwei
   Zeilen, weil hier bewusst weder Zebra noch Hover-Tönung liegt (siehe oben). */
.offline-auction-table th[b-10lzd5dvba],
.offline-auction-table td[b-10lzd5dvba] {
    border-bottom: 1px solid var(--app-border, var(--fbd-mono-mice, #ccc));
    vertical-align: middle;
}
/* /Components/Versteigerungen/AuctionResults.razor.rz.scp.css */
/* Keine Zebra-Streifen: Titel-Links sind blau (--office-link) und blieben auf einem hellgrauen
   Streifen unter der WCAG-AA-Schwelle (4,5:1). Zeilen sitzen daher auf Weiß (wie die Fundsuche-
   Liste); die Trennung übernimmt der Zellen-Rahmen unten. */

/* Zeilen-Hover OHNE Flächen-Tönung: Die Titel-Zelle enthält einen blauen Link (--office-link),
   dessen Auto-Kontrast-Garantie (OfficeThemeStyle) nur gegen Weiß gilt. Jedes Abdunkeln des
   Zellhintergrunds — auch neutrales Grau — senkt den Link-Kontrast und kann bei hellerer
   Office-Link-Farbe unter 4,5:1 fallen (axe prüft :hover nicht, der Verstoß bliebe unentdeckt).
   Hover daher kontrast-neutral: ein umlaufender, Office-farbiger Rahmen um die Zeile, Zelle bleibt
   weiß. Der Rahmen entsteht aus inset-box-shadows je Zelle (oben/unten überall, links auf der
   ersten, rechts auf der letzten Zelle), weil ein echter Rahmen am <tr> in collapsed Tabellen nicht
   zuverlässig rendert. Unterschied zur Fundsuche-Liste (gleicher Tint dort): deren Titel ist dunkler
   Text (<button color:inherit>), kein blauer Link — dort ist die Tönung unbedenklich. */
.auction-table tbody tr:hover > td[b-x381phwe2k] {
    box-shadow: inset 0 2px 0 0 var(--office-primary, #004987),
                inset 0 -2px 0 0 var(--office-primary, #004987);
}
.auction-table tbody tr:hover > td:first-child[b-x381phwe2k] {
    box-shadow: inset 0 2px 0 0 var(--office-primary, #004987),
                inset 0 -2px 0 0 var(--office-primary, #004987),
                inset 2px 0 0 0 var(--office-primary, #004987);
}
.auction-table tbody tr:hover > td:last-child[b-x381phwe2k] {
    box-shadow: inset 0 2px 0 0 var(--office-primary, #004987),
                inset 0 -2px 0 0 var(--office-primary, #004987),
                inset -2px 0 0 0 var(--office-primary, #004987);
}

/* Rahmen über --app-border (app.css), damit der Kontrastmodus sie mitdreht: Diese Datei ist
   scoped CSS und kann html.a11y-contrast nicht als Vorfahren adressieren. Im Normalmodus ist
   das Token wertgleich zu --fbd-mono-mice (#919191), im Modus #ffffff. Der Hover-Ring darüber
   braucht das nicht — --office-primary wird im Modus selbst auf #ffffff neutralisiert. */
.auction-table th[b-x381phwe2k],
.auction-table td[b-x381phwe2k] {
    border-bottom: 1px solid var(--app-border, var(--fbd-mono-mice, #ccc));
    vertical-align: middle;
}

.auction-thumb-cell[b-x381phwe2k] {
    width: 100px;
}

.auction-thumb[b-x381phwe2k] {
    max-width: 84px;
    height: auto;
    border: 1px solid var(--app-border, var(--fbd-mono-mice, #ccc));
}

/* Platzhalter, wenn kein Bild vorhanden ist — gleiche Grundfläche wie ein Thumbnail. */
.auction-thumb-empty[b-x381phwe2k] {
    display: inline-flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    width: 84px;
    min-height: 60px;
    border: 1px solid var(--app-border, var(--fbd-mono-mice, #ccc));
    text-align: center;
}
/* /Components/Versteigerungen/OfflineItemGalleryDialog.razor.rz.scp.css */
/* Farben laufen über die --app-*-Ebene (app.css), damit der Kontrastmodus sie mitdreht: Diese
   Datei ist scoped CSS und kann html.a11y-contrast nicht als Vorfahren adressieren.
   Der Dialog ist ein natives <dialog>, KEINE Bootstrap-.modal — die Regel
   html.a11y-contrast .modal in app.css greift hier also nicht. Gemessen im Bestand: ohne die
   folgenden Farbdeklarationen behält er die Browservorgaben Canvas/CanvasText und bleibt im
   Kontrastmodus eine weiße Insel; der Platzhaltertext „Kein Bild vorhanden" stand dort mit
   1,25:1 (#e6e6e6 auf Weiß). Gleicher Aufbau wie FundItemDetailDialog.razor.css. */
.offline-gallery-dialog[b-qub67qv3ip] {
    width: min(720px, 92vw);
    background-color: var(--app-page-bg, Canvas);
    color: var(--app-page-text, CanvasText);
    /* Rahmen NUR im Kontrastmodus: --app-dialog-border hat bewusst keinen :root-Default, im
       Normalmodus greift also der Fallback `transparent` und der Dialog bleibt randlos wie
       bisher (--app-border würde hier einen grauen Rahmen einführen — eine sichtbare Änderung
       am Normalmodus). Der Rahmen ist im Modus die EINZIGE Kante des Dialogs: ::backdrop ist
       rgba(0, 0, 0, .5) über einer schwarzen Seite, also schwarz auf schwarz.
       Preis der Umstellung von `border: none`: bei box-sizing: border-box verliert der Inhalt
       1px pro Seite. */
    border: 1px solid var(--app-dialog-border, transparent);
    border-radius: .5rem;
    padding: 0;
}

.offline-gallery-dialog[b-qub67qv3ip]::backdrop {
    background: rgba(0, 0, 0, .5);
}

.offline-gallery[b-qub67qv3ip] {
    padding: 1rem 1.25rem 1.25rem;
}

.offline-gallery-header[b-qub67qv3ip] {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 1rem;
    margin-bottom: .75rem;
}

.offline-gallery-item-title[b-qub67qv3ip] {
    margin-bottom: .75rem;
}

.offline-gallery-main[b-qub67qv3ip] {
    text-align: center;
}

.offline-gallery-main-img[b-qub67qv3ip] {
    max-width: 100%;
    height: auto;
    border: 1px solid var(--app-border, var(--fbd-mono-mice, #ccc));
}

/* „Kein Bild"-Platzhalter — gleiche Anmutung wie in der Liste. */
.offline-gallery-noimage[b-qub67qv3ip] {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: .25rem;
    min-height: 120px;
    border: 1px solid var(--app-border, var(--fbd-mono-mice, #ccc));
}

.offline-gallery-thumbs[b-qub67qv3ip] {
    display: flex;
    flex-wrap: wrap;
    gap: .5rem;
    margin-top: .75rem;
}

/* Thumbnails sind echte Buttons (fokussierbar/tastaturbedienbar). Aktives Bild mit Office-Rahmen
   markiert — Auswahl nicht allein über Farbe (auch Rahmenstärke). */
.offline-gallery-thumb[b-qub67qv3ip] {
    padding: 0;
    background: none;
    border: 1px solid var(--app-border, var(--fbd-mono-mice, #ccc));
    cursor: pointer;
    line-height: 0;
}

.offline-gallery-thumb img[b-qub67qv3ip] {
    width: 64px;
    height: 64px;
    object-fit: cover;
}

.offline-gallery-thumb.active[b-qub67qv3ip] {
    border: 3px solid var(--office-primary, #004987);
}

.offline-gallery-description[b-qub67qv3ip] {
    margin-top: 1rem;
}

.offline-gallery-price[b-qub67qv3ip] {
    margin-top: 1rem;
}

.offline-gallery-price-label[b-qub67qv3ip] {
    font-weight: 600;
    margin-right: .25rem;
}
