/* ==============================================
   K+K (Kunst + Krempel) — Bavaria Entertainment
   Tool-spezifische Styles ueber Pico CSS + Tinte (Bavaria Design System).

   Palette, Pico-Overrides, Dark-/Light-Tokens (--t-*) und die ds-Body-
   Komponenten liefert die kanonische static/css/bavaria-theme.css aus dem
   tinte-Repo (NACH pico.min.css, VOR dieser Datei eingebunden, Reihenfolge
   ist load-bearing). Hier nur Chrome (Header/Footer/Nav/Login/Flash) und
   die wenigen tool-eigenen Zusatz-Tokens.
   ============================================== */

:root {
    /* JetBrains Mono fuer Code/IDs, vom gemeinsamen Theme nicht geliefert. */
    --f-mono: "JetBrains Mono", ui-monospace, monospace;
    /* Dunkleres Teal fuer Hover-/Active-Flaechen. */
    --t-teal-dark: #00566b;
    /* Scroll-Schatten-Affordance (BENT-1883): Farbe des Rand-Fades an horizontal
       scrollbaren Containern (Nav, Tabellen). Overlay-Technik statt background-
       attachment, damit opake Kind-Hintergruende (Tab-Aktiv, Tabellen-Header/
       Zebra) den Schatten nicht mehr verdecken. Dark-Mode etwas kraeftiger,
       weil der Fade auf dunklem Grund sonst kaum sichtbar ist. */
    --kk-scroll-shadow: rgba(15, 29, 34, 0.22);
    --kk-scroll-shadow-breite: 16px;
}
:root[data-theme="dark"] {
    --t-teal-dark: var(--t-teal-light);
    --kk-scroll-shadow: rgba(0, 0, 0, 0.55);
}

body {
    background-color: var(--t-bg);
    color: var(--t-ink);
    font-family: var(--f-sans);
}

/* ========================================
   HEADER (sticky, Card-BG: Brand + Logout, Tab-Bar)
   ======================================== */
.site-header {
    position: sticky;
    top: 0;
    z-index: 20;
    background: var(--t-card);
    border-bottom: 1px solid var(--t-rule);
    margin-bottom: 0;
}
.site-header__inner {
    /* Eine Quelle fuer den Header-Innenabstand: die Full-bleed-Tab-Nav zieht ihr
       negatives Margin ueber genau dieses Token wieder heraus (siehe .tab-nav).
       Wichtig: als Custom Property vererbt, damit die schmale Variante im
       @media-Block unten nicht von der spaeter im File stehenden .tab-nav-Regel
       ueberschrieben werden kann (gleiche Spezifitaet, Quellreihenfolge gewinnt
       sonst; genau das erzeugte den Seiten-Overflow, BENT-2037). */
    --kk-header-pad: 32px;
    max-width: 1400px;
    margin: 0 auto;
    padding: 0 var(--kk-header-pad);
}
.site-header__top {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 1rem;
    padding: 18px 0 0;
    flex-wrap: wrap;
}
.page-main {
    max-width: 1400px;
    margin: 0 auto;
    padding: 24px 32px 60px;
}
@media (max-width: 640px) {
    /* Schmalerer Innenabstand; die Tab-Nav zieht ihn ueber --kk-header-pad
       automatisch nach (kein zweiter Ort, an dem 18px stehen muss). */
    .site-header__inner { --kk-header-pad: 18px; }
    .page-main { padding: 18px 18px 40px; }
}

.brand-link {
    display: inline-flex;
    align-items: center;
    gap: 14px;
    text-decoration: none;
    color: var(--t-ink);
    transition: color .15s ease;
}
.brand-mark { display: inline-flex; flex-shrink: 0; }
.brand-mark__svg { display: block; }
.brand-text { display: flex; flex-direction: column; gap: 4px; }
.brand-title {
    font-family: var(--f-serif);
    font-size: 22px;
    font-weight: 600;
    letter-spacing: -0.01em;
    line-height: 1;
    color: var(--t-ink);
    white-space: nowrap;
}
.brand-link:hover .brand-title,
.brand-link:focus-visible .brand-title { color: var(--t-teal); }

/* Öffentliches Grundgerüst (BENT-2863): dieselbe Kopfleiste, anderer Inhalt.
   Die Bildmarke ist hier kein Link (die interne Startseite ist von einer
   öffentlichen Seite aus nicht das Ziel), braucht aber dieselbe Ausrichtung
   wie `.brand-link`. Und ohne die Navigationsleiste darunter fehlt der
   Kopfleiste ihr unterer Innenabstand: `.site-header__top` setzt ihn bewusst
   nur oben, weil sonst die Tab-Leiste folgt. */
.brand-static {
    display: inline-flex;
    align-items: center;
    gap: 14px;
    color: var(--t-ink);
}
.site-header--public .site-header__top { padding-bottom: 18px; }
/* Pico legt jedem `[role="group"]` volle Breite auf, und der Hell/Dunkel-
   Umschalter ist eine solche Gruppe. Im internen Kopf begrenzt ihn das
   Listenelement der Navigationsleiste, hier steht er frei und nähme sonst die
   ganze Zeile ein (am gerenderten Kopf gemessen: 1216 statt rund 120 px, und
   die Zeile brach dadurch um). */
.site-header--public .ds-theme-toggle { width: auto; flex: 0 0 auto; }

.eyebrow {
    font-family: var(--f-sans);
    font-size: 10.5px;
    font-weight: 600;
    letter-spacing: 0.18em;
    text-transform: uppercase;
    color: var(--t-muted);
    line-height: 1;
}

.site-header__user { display: inline-flex; align-items: center; gap: 14px; }
.user-role {
    font-size: 12px;
    letter-spacing: 0.04em;
    color: var(--t-ink-soft);
    white-space: nowrap;
}
.logout-pill {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    background: transparent;
    border: 1px solid var(--t-rule);
    color: var(--t-ink-soft);
    font-size: 12px;
    letter-spacing: 0.04em;
    padding: 6px 12px;
    border-radius: 999px;
    text-decoration: none;
    transition: border-color .15s, color .15s, background .15s;
}
.logout-pill:hover,
.logout-pill:focus-visible {
    border-color: var(--t-ink-soft);
    color: var(--t-ink);
    background: var(--t-bg);
}

/* ========================================
   KOPFLEISTEN-SUCHE (BENT-1659)
   Globale Objekt-Suche als dauerhaftes Suchfeld im Header. Nutzt die
   bestehende Route suche.suche_anzeigen (GET, Feld q). Der fruehere
   Such-Tab in der Tab-Nav ist damit entfallen.
   ======================================== */
.header-search {
    display: flex;
    align-items: center;
    gap: 6px;
    margin: 0;
    flex: 1 1 240px;
    max-width: 360px;
}
.header-search__input {
    flex: 1 1 auto;
    min-width: 0;
    margin: 0;
    height: 36px;
    padding: 0 12px;
    border: 1px solid var(--t-rule);
    border-radius: 999px;
    background: var(--t-bg);
    color: var(--t-ink);
    font-family: var(--f-sans);
    font-size: 13px;
    transition: border-color .15s, box-shadow .15s;
}
.header-search__input::placeholder { color: var(--t-muted); }
.header-search__input:focus,
.header-search__input:focus-visible {
    outline: none;
    border-color: var(--t-teal);
    box-shadow: 0 0 0 3px var(--t-teal-soft, rgba(0, 128, 128, 0.15));
}
.header-search__btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
    width: 36px;
    height: 36px;
    margin: 0;
    padding: 0;
    border: 1px solid var(--t-rule);
    border-radius: 999px;
    background: var(--t-card);
    color: var(--t-ink-soft);
    cursor: pointer;
    transition: border-color .15s, color .15s, background .15s;
}
.header-search__btn:hover,
.header-search__btn:focus-visible {
    border-color: var(--t-teal);
    color: var(--t-teal);
    background: var(--t-bg);
}
@media (max-width: 640px) {
    /* Kopfzeile nicht sprengen: Suchfeld bricht unter Marke/Nutzer auf volle Breite um. */
    .header-search { flex-basis: 100%; max-width: none; order: 3; }
}

/* ========================================
   TAB-NAV
   ======================================== */
/* Full-bleed-Scrollreihe: horizontales Padding = Header-Innenabstand, plus
   negatives Margin gleicher Groesse zieht den overflow-Container bis an die
   Header-Kante. So bleibt der erste Tab bündig mit der Brand-Flucht, hat aber
   Puffer zur Clip-Kante und wird beim horizontalen Scrollen sauber abgeschnitten
   statt am Rand zu kleben (BENT-1602-Nachbesserung).
   Padding und negatives Margin kommen aus --kk-header-pad (gesetzt auf
   .site-header__inner, schmalere Variante im @media-Block oben). Vorher standen
   hier feste 32px; die 18px-Regel im @media-Block hatte dieselbe Spezifitaet,
   stand aber frueher im File und verlor darum die Quellreihenfolge. Auf schmalen
   Viewports wuchs die Nav dadurch um 2x14px ueber den Viewport hinaus und die
   ganze Seite bekam horizontalen Scroll (BENT-2037). */
.tab-nav {
    padding: 20px var(--kk-header-pad) 0;
    margin: 0 calc(-1 * var(--kk-header-pad));
    overflow-x: auto;
    /* Scroll-Shadow-Affordance (BENT-1837, auf Overlay-Technik umgestellt in
       BENT-1883): der Rand-Fade signalisiert horizontal scrollbaren Inhalt.
       Die Schatten liegen als sticky Pseudo-Elemente UEBER dem Inhalt (siehe
       Block „SCROLL-SCHATTEN-OVERLAY" weiter unten) und werden nicht mehr vom
       aktiven Tab-Hintergrund verdeckt. Flex-Container, damit die Pseudo-
       Elemente als sticky Flex-Items am Rand haengen. */
    display: flex;
    background-color: var(--t-card);
}
/* ul fuellt die volle Breite (grow), schrumpft aber NIE unter die Tab-Breite
   (shrink 0): sonst quetscht der Flex-Container die Reihe in den Container und
   .tab-nav scrollt nicht mehr, sondern schneidet Tabs ab. Seit BENT-3500 traegt
   die Leiste nur noch Tabs; der Hell-Dunkel-Umschalter sass bis dahin als
   letztes Element darin und war damit das erste, was ein Ueberlauf verschluckte. */
.tab-nav > ul { flex: 1 0 auto; }
.tab-nav ul {
    list-style: none;
    padding: 0;
    margin: 0;
    display: flex;
    /* Kleinerer gap gleicht das neue horizontale Tab-Padding (10px je Seite)
       aus, sodass der Text-zu-Text-Abstand wie zuvor bei ~28px bleibt
       (BENT-1841). */
    gap: 8px;
    align-items: center;
}
/* Pico setzt auf `nav ul:first-of-type` ein negatives margin-left (Spezifitaet
   0,1,2), das den gesamten Tab-Streifen 7.5px nach links schob und das "S" von
   "Start" hinter die overflow-Clip-Kante zog. Der bisherige Reset `.tab-nav ul`
   (0,1,1) verlor gegen diese Regel; mit :first-of-type gleichgezogen. */
.tab-nav ul:first-of-type { margin-left: 0; }
/* Tabs behalten auf schmalen Viewports ihre Breite; die Reihe scrollt horizontal
   im .tab-nav statt einzelne Tabs abzuschneiden (BENT-1602). */
.tab-nav li { flex-shrink: 0; }
a.tab-btn {
    border-bottom: 2px solid transparent;
    /* Horizontales Padding, damit die aktive Hintergrund-Markierung (unten)
       Luft um den Text hat; Text-zu-Text-Abstand bleibt via kleinerem ul-gap
       stabil (BENT-1841). */
    padding: 0 10px 14px;
    font-weight: 500;
    color: var(--t-muted);
    font-family: var(--f-sans);
    font-size: 14px;
    text-decoration: none;
    margin-bottom: -1px;
    display: inline-flex;
    align-items: center;
    gap: 8px;
    white-space: nowrap;
    border-radius: 6px 6px 0 0;
    transition: color .15s, border-color .15s, background-color .15s;
}
a.tab-btn:hover,
a.tab-btn:focus-visible {
    color: var(--t-ink);
    background: var(--t-teal-tint);
}
/* Aktiver Tab deutlich markiert (BENT-1841): kräftige Markenfarbe, fett,
   dickere Unterstrich-Linie und ein sanfter Hintergrund-Pill. Die dünne,
   kontrastarme Linie allein war beim Seitenwechsel kaum zu erkennen. Wirkt in
   Light und Dark, weil alle Werte aus den Theme-Tokens kommen. */
a.tab-btn.active,
a.tab-btn.active:hover,
a.tab-btn.active:focus-visible {
    color: var(--t-teal);
    font-weight: 700;
    border-bottom: 3px solid var(--t-teal);
    background: var(--t-teal-tint);
}
/* Werkzeuge der Kopfzeile: Rollenanzeige, Abmelden und der Hell-Dunkel-
   Umschalter (BENT-3500). Sie stehen zusammen am rechten Rand, damit der
   Umschalter nicht mehr am Ende der scrollenden Tab-Leiste haengt. Pico legt
   jedem `[role="group"]` volle Breite auf, und der Umschalter ist eine solche
   Gruppe: ohne die Breiten-Korrektur naehme er die ganze Zeile (dieselbe Falle
   wie im oeffentlichen Kopf, siehe `.site-header--public .ds-theme-toggle`). */
.site-header__werkzeuge {
    display: inline-flex;
    align-items: center;
    gap: 14px;
    flex-wrap: wrap;
}
.site-header__werkzeuge .ds-theme-toggle { width: auto; flex: 0 0 auto; }

/* ========================================
   SEKUNDÄR-NAVIGATION DISPOSITION (BENT-1872)
   ======================================== */
/* Tab-Leiste unter dem Seitentitel der Dispositions-Seiten (Aufzeichnungen ·
   Expert:innen · Blockplanung · Drehplan). Kleinere Variante der Hauptnav; macht
   die zuvor versteckten Unterseiten überall sichtbar. Gleiches Scroll-Shadow-
   Muster wie .tab-nav/.ds-table-wrapper (BENT-1837/1838): auf schmalen Viewports
   scrollt die Leiste horizontal, der Rand-Fade signalisiert das. Kein JS. */
.ds-subtabs {
    display: flex;
    gap: 6px;
    align-items: center;
    margin: 0 0 1.5rem;
    padding-bottom: 2px;
    border-bottom: 1px solid var(--t-rule);
    overflow-x: auto;
    /* Scroll-Shadow-Overlay (BENT-1872, auf Overlay-Technik umgestellt in
       BENT-1883): gleicher Rand-Fade wie .tab-nav/.ds-table-wrapper, jetzt als
       sticky Pseudo-Elemente ueber dem Inhalt (Block „SCROLL-SCHATTEN-OVERLAY"). */
    background-color: var(--t-bg);
}
.ds-subtab {
    flex-shrink: 0;
    white-space: nowrap;
    padding: 8px 12px 10px;
    margin-bottom: -1px;
    font-family: var(--f-sans);
    font-size: 13px;
    font-weight: 500;
    color: var(--t-muted);
    text-decoration: none;
    border-bottom: 2px solid transparent;
    border-radius: 6px 6px 0 0;
    transition: color .15s, border-color .15s, background-color .15s;
}
.ds-subtab:hover,
.ds-subtab:focus-visible {
    color: var(--t-ink);
    background: var(--t-teal-tint);
}
.ds-subtab--active,
.ds-subtab--active:hover,
.ds-subtab--active:focus-visible {
    color: var(--t-teal);
    font-weight: 700;
    border-bottom-color: var(--t-teal);
    background: var(--t-teal-tint);
}

/* ========================================
   FOOTER
   ======================================== */
.site-footer {
    background-color: var(--t-card);
    color: var(--t-muted);
    margin-top: 3rem;
    padding: 20px 0;
    border-top: 1px solid var(--t-rule);
    font-size: 11px;
}
.site-footer__inner {
    max-width: 1400px;
    margin: 0 auto;
    padding: 0 32px;
}
.footer-content {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: 1rem;
}
.footer-brand { display: inline-flex; align-items: center; gap: 8px; color: var(--t-muted); }
.footer-name { color: var(--t-ink-soft); font-weight: 500; }
.footer-version { color: var(--t-faint); }
.footer-links { display: flex; gap: 1.25rem; }
.footer-links a { color: var(--t-muted); text-decoration: none; transition: color .15s ease; }
.footer-links a:hover, .footer-links a:focus-visible { color: var(--t-teal); }
.footer-copy small { color: var(--t-faint); font-size: 11px; }
@media (max-width: 576px) {
    .footer-content { flex-direction: column; text-align: center; }
}

/* ========================================
   FLASH-MELDUNGEN als schwebende Toasts (BENT-2042)

   Den Basis-Look der Meldung (.flash-error/-success/-warning/-info samt Praefix
   und .flash-dismiss) liefert das Design-System (tinte-base.css); hier liegt nur
   die Toast-Schicht: Position, Stapel, deckender Grund, Ein-/Ausblenden. Die
   frueher hier stehende Kopie der DS-Regeln ist bewusst entfallen (sie kannte
   .flash-warning nicht, Warnungen liefen dadurch ungestylt).

   Warum fixed: Die Meldungen standen oben in `page-main` und waren bei
   gescrollter Seite bzw. nach Anker-Redirects schlicht ausserhalb des Viewports;
   die Bestaetigung einer Aktion kam nie an. Als Toast erscheinen sie in jeder
   Scroll-Position.
   ======================================== */
.flash-toasts {
    position: fixed;
    /* Unter dem sticky Header. Die echte Header-Hoehe setzt flash-toasts.js als
       --kk-header-h; der Fallback traegt den ungescrollten Normalfall. */
    top: calc(var(--kk-header-h, 116px) + 14px);
    right: 24px;
    /* Ueber dem sticky Header (z-index 20), aber unter der Lightbox (1000). */
    z-index: 900;
    display: flex;
    flex-direction: column;
    gap: 10px;
    width: min(420px, calc(100vw - 48px));
    /* Der Stapel selbst faengt keine Klicks ab, nur die Toasts darin. */
    pointer-events: none;
}
.flash-toast {
    pointer-events: auto;
    /* Abstand im Stapel kommt aus dem gap, nicht mehr aus dem DS-margin. */
    margin: 0;
    box-shadow: 0 10px 30px rgba(0, 0, 0, 0.18), 0 2px 6px rgba(0, 0, 0, 0.10);
    transition: opacity .3s ease, transform .3s ease;
    /* Die Tint-Toene des DS sind im Dark Mode halbtransparent (rgba). Schwebend
       ueber dem Inhalt braucht der Toast eine deckende Grundflaeche, sonst
       scheint die Seite durch: Karten-Grund unten, Tint als Layer darueber. */
    background-color: var(--t-card);
}
.flash-toast.flash-error { background-image: linear-gradient(var(--t-red-tint), var(--t-red-tint)); }
.flash-toast.flash-success { background-image: linear-gradient(var(--t-green-tint), var(--t-green-tint)); }
.flash-toast.flash-warning { background-image: linear-gradient(var(--t-amber-tint), var(--t-amber-tint)); }
.flash-toast.flash-info { background-image: linear-gradient(var(--t-teal-hi-tint), var(--t-teal-hi-tint)); }
/* Sanftes Ausblenden (Auto-Hide bei Erfolg/Hinweis). */
.flash-toast.is-leaving { opacity: 0; transform: translateY(-6px); }
@media (max-width: 640px) {
    /* Schmale Viewports: volle Breite statt schmaler Saeule am Rand. */
    .flash-toasts { top: calc(var(--kk-header-h, 116px) + 10px); right: 12px; left: 12px; width: auto; }
}
@media (prefers-reduced-motion: reduce) {
    .flash-toast { transition: none; }
}

/* ========================================
   LOGIN-SEITE
   ======================================== */
.login-body {
    background: var(--t-bg);
    color: var(--t-ink);
    font-family: var(--f-sans);
    min-height: 100vh;
    margin: 0;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 32px;
}
.login-frame { width: 100%; max-width: 440px; display: flex; flex-direction: column; gap: 28px; }
.login-brand { display: flex; align-items: center; gap: 14px; }
.login-wordmark {
    font-family: var(--f-serif);
    font-size: 26px;
    font-weight: 600;
    letter-spacing: -0.01em;
    line-height: 1;
    color: var(--t-ink);
    margin-bottom: 4px;
}
.login-card {
    background: var(--t-card);
    border: 1px solid var(--t-rule);
    border-radius: 12px;
    padding: 32px;
}
.login-headline { font-size: 32px; line-height: 1.1; margin: 0 0 8px; font-weight: 500; }
.login-sub { font-size: 14px; color: var(--t-ink-soft); line-height: 1.55; margin: 0 0 20px; }
.login-error {
    background: var(--t-red-tint);
    color: var(--t-red);
    border-left: 3px solid var(--t-red);
    padding: 8px 12px;
    border-radius: 4px;
    font-size: 13px;
    margin-bottom: 12px;
}
.login-form { display: flex; flex-direction: column; gap: 8px; }
.login-label { font-size: 12px; font-weight: 600; color: var(--t-ink); margin: 4px 0 -2px; }
.login-form input[type="password"] {
    padding: 10px 14px;
    border: 1px solid var(--t-rule);
    border-radius: 8px;
    font-family: var(--f-sans);
    font-size: 14px;
    background: var(--t-card);
    color: var(--t-ink);
    margin-bottom: 8px;
}
.login-form input[type="password"]:focus { border-color: var(--t-teal-hi); outline: none; }
.login-cta {
    width: 100%;
    background: var(--t-teal);
    border: 1px solid var(--t-teal);
    color: #fff;
    font-family: var(--f-sans);
    font-size: 14px;
    font-weight: 600;
    padding: 12px 16px;
    border-radius: 8px;
    cursor: pointer;
    transition: background .15s, border-color .15s;
}
.login-cta:hover { background: var(--t-teal-dark); border-color: var(--t-teal-dark); }
.login-footer { display: flex; justify-content: center; gap: 12px; font-size: 11px; color: var(--t-muted); }
.login-footer a { color: var(--t-muted); text-decoration: none; }
.login-footer a:hover { color: var(--t-teal); }
.login-theme { display: flex; justify-content: center; }

/* ----------------------------------------------------------------------
   Foto-Upload: die Flaeche jeder Upload-Stelle ist seit BENT-3521 der
   kanonische Tinte-Baustein `drop-zone-pro` (static/css/tinte-base.css),
   die kompakte Dichte sein Modifikator `drop-zone-pro--compact`
   (BENT-3570). Das Markup dazu steht einmal in
   templates/_foto_dropzone.html.

   Tool-lokal bleibt hier genau eine Regel, und sie hat einen Grund: Die
   Referenzseite des Designsystems verbirgt ihr Datei-Feld mit `hidden`,
   und ein verborgenes Feld ist weder fokussierbar noch validierbar; das
   `required` des ersten Foto-Slots und die Pruefung des Browsers liefen
   damit ins Leere, und ohne JavaScript waere die Flaeche unbedienbar. Das
   Feld ist deshalb nur visuell verborgen (Klick auf das umschliessende
   Label oeffnet weiterhin den Dateidialog).

   Die frueheren tool-eigenen Regeln um die Klasse foto-dropzone sind
   ersatzlos entfallen: Sie waren die Grundform vor der Nachschaerfung vom
   13.08.2026, und jetzt liest sie niemand mehr; eine stehen gebliebene
   Regel waere die Vorlage fuer das naechste eigene Muster.
   ---------------------------------------------------------------------- */
.drop-zone-pro .foto-input {
    position: absolute;
    width: 1px;
    height: 1px;
    padding: 0;
    margin: -1px;
    overflow: hidden;
    clip: rect(0 0 0 0);
    white-space: nowrap;
    border: 0;
}

/* ----------------------------------------------------------------------
   Fehlende Pflichtangabe im Bewerbungsformular (BENT-3269).
   Gesetzt von static/js/bewerbung-pflichtfelder.js, wenn ein Absenden
   wegen einer fehlenden Angabe zurueckgehalten wurde. Bewusst ein Umriss
   statt eines Rahmens: dieselbe Regel traegt Eingabefeld, Menue,
   Textbereich, die Foto-Flaeche (deren Datei-Feld visuell verborgen ist)
   und das Einwilligungs-Label, ohne dass jede Form ihre eigene braucht.
   Die Farbe traegt die Aussage nie allein, der Sammelkasten oben nennt
   jedes fehlende Feld im Klartext.
   ---------------------------------------------------------------------- */
.ds-feld-fehlt {
    outline: 2px solid var(--t-red);
    outline-offset: 3px;
    border-radius: 4px;
}

/* ----------------------------------------------------------------------
   Merkmale-Tabelle im KI-Bericht (BENT): saubere Spaltenbreiten, damit
   die kurzen Spalten nicht zerquetscht werden und Ueberschriften nicht
   buchstabenweise umbrechen. Einschaetzung nimmt den Rest der Breite.
   ---------------------------------------------------------------------- */
.bericht-merkmale th { white-space: nowrap; }
.bericht-merkmale td:first-child { white-space: nowrap; }        /* Merkmal */
.bericht-merkmale td:nth-child(3) { white-space: nowrap; }       /* Quelle */
.bericht-merkmale th:last-child,
.bericht-merkmale td:last-child { white-space: nowrap; text-align: center; }  /* Konfidenz */
.bericht-merkmale td:nth-child(2) { width: 100%; }               /* Einschaetzung */

/* ======================================================================
   K+K-eigene ds-Bausteine (BENT-1594, Hybrid-Option c)
   Die breit wiederverwendbaren Klassen (ds-btn*, ds-alert*, ds-hint,
   ds-form-group/-label/-actions) liefert das gemeinsame Tinte-Theme
   (static/css/bavaria-theme.css). Hier nur die K+K-spezifischen Reste, die
   in den Templates verwendet, aber nirgends definiert waren.
   ====================================================================== */

/* --- Override: .ds-btn margin-neutral (BENT-1657) ---
   Die Button-Basis lebt in der Tinte-Kopie (bavaria-theme.css) und setzt kein
   eigenes Margin, erbt also den Pico-Default margin-bottom: 0.75rem. In
   align-items:center-Flex-Leisten (.ds-actionbar, Mail-Zeile, PDF/Drucken)
   zentriert der Browser die Margin-Box, wodurch der sichtbare Button nach oben
   rutscht und die Leiste asymmetrisch wirkt. Design-System-Buttons sind
   margin-neutral, den Abstand macht der Container (gap/actionbar). KK-lokal
   neutralisieren statt die Tinte-Kopie anzufassen (siehe CLAUDE.md). Dauerhaft
   gehoert margin:0 in die .ds-btn-Basis im Tinte-Quell-Repo (separat). */
.ds-btn { margin: 0; }

/* --- Pflichtfeld-Sternchen / optional-Marker im Bewerbungsformular --- */
.pflicht { color: var(--t-red); font-weight: 700; }
.ds-optional { color: var(--t-muted); font-weight: 400; font-size: 0.85em; }

/* --- Formular-Zeilen-Layouts (oeffentliches Bewerbungsformular) --- */
.ds-form-row { margin-bottom: 0.25rem; }
.ds-form-row--2col {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 1rem;
}
.ds-form-row--foto {
    display: grid;
    grid-template-columns: 1fr minmax(10rem, auto);
    gap: 1rem;
    align-items: start;
}
@media (max-width: 600px) {
    .ds-form-row--2col,
    .ds-form-row--foto { grid-template-columns: 1fr; }
}
.ds-form-inline {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.75rem;
}

/* --- Vollbreite Felder mit ds-Klasse (Pico stylt die Elemente selbst) --- */
.ds-select,
.ds-textarea { width: 100%; }

/* --- Fieldset mit Legende (Extraktions-Bestaetigung) --- */
.ds-fieldset {
    border: 1px solid var(--t-rule);
    border-radius: var(--be-radius);
    padding: 1.1rem 1.25rem 1.25rem;
    margin: 0 0 1.5rem;
}
.ds-fieldset > legend {
    font-weight: 600;
    font-size: 0.9rem;
    color: var(--t-ink);
    padding: 0 0.4rem;
}

/* --- Die zwei Foto-Wege des Eingangs, unverwechselbar (BENT-3271) ---
 *
 * Objektfotos und Personenfoto standen als zwei gleich aussehende Felder
 * untereinander; dem Tool-Test der Redaktion (BENT-3267) ist deshalb zweimal
 * beinahe das Portraet an das Objekt gerutscht. Die Ueberschriften nennen jetzt
 * die Folge, die farbige Kante trennt die Gruppen auch auf einen Blick. Die
 * Farbe traegt die Aussage dabei nie allein (Regel aus BENT-2772): Der Wortlaut
 * der Legende sagt dasselbe.
 *
 * Vergeben ist die Farbe passend zum Bestand: Teal ist die Arbeitsfarbe des
 * Werkzeugs, Violett steht im Objektbericht bereits fuer die einreichende
 * Person (`.ds-herkunft--einreicher`). */
.ds-fotogruppe { border-left-width: 4px; }
.ds-fotogruppe > legend { font-size: 0.95rem; line-height: 1.35; }
.ds-fotogruppe--objekt { border-left-color: var(--t-teal); }
.ds-fotogruppe--objekt > legend { color: var(--t-teal); }
.ds-fotogruppe--person { border-left-color: var(--kk-violett); }
.ds-fotogruppe--person > legend { color: var(--kk-violett); }

/* --- Einwilligungs-Checkbox: Kaestchen neben mehrzeiligem Text --- */
.ds-checkbox {
    display: flex;
    align-items: flex-start;
    gap: 0.6rem;
    margin: 0.6rem 0;
    font-size: 0.9rem;
    line-height: 1.5;
    cursor: pointer;
}
.ds-checkbox input[type="checkbox"] {
    margin-top: 0.15rem;
    flex-shrink: 0;
}

/* --- Info-Box (Foto-Typ-Hinweis im Bewerbungsformular) --- */
.ds-info-box {
    background: var(--t-teal-tint);
    border: 1px solid var(--t-rule);
    border-left: 3px solid var(--t-teal);
    border-radius: var(--be-radius);
    padding: 0.7rem 0.95rem;
    margin: 0.75rem 0;
    font-size: 0.88rem;
    color: var(--t-ink);
}
.ds-info-box[hidden] { display: none; }

/* --- Warteseite: Ladekarte mit Spinner (Extraktion) --- */
.ds-loading-card {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 1rem;
    text-align: center;
    background: var(--t-card);
    border: 1px solid var(--t-rule);
    border-radius: var(--be-radius-lg);
    padding: 2.5rem 1.5rem;
}
.ds-spinner {
    width: 2.5rem;
    height: 2.5rem;
    border: 3px solid var(--t-rule);
    border-top-color: var(--t-teal);
    border-radius: 50%;
    animation: ds-spin 0.8s linear infinite;
}
/* Kleiner Inline-Spinner fuer Buttons/Banner (BENT-1877, Job-Feedback). */
.ds-spinner--inline {
    display: inline-block;
    width: 1em;
    height: 1em;
    border-width: 2px;
    vertical-align: -0.15em;
    margin-right: 0.35em;
}
@keyframes ds-spin { to { transform: rotate(360deg); } }
@media (prefers-reduced-motion: reduce) {
    .ds-spinner { animation-duration: 2s; }
}

/* --- Erfolgskarte (Bewerbung eingegangen) --- */
.ds-success-card {
    text-align: center;
    background: var(--t-card);
    border: 1px solid var(--t-rule);
    border-radius: var(--be-radius-lg);
    padding: 2.5rem 1.75rem;
}
/* Warteliste am Einwilligungs-Gate (BENT-2860/2873): Das Aufklapp-Panel der
   Zeilen-Variante steht im Fluss (siehe `.ds-actiondrop--row`), und ein Panel
   ohne Breitenbegrenzung spreizt darum die Aktionsspalte, bis die Objektspalte
   daneben auf wenige Zeichen zusammenfaellt. Die Spalte bekommt deshalb eine
   feste Breite und das Panel eine eigene; die Tabelle behaelt ihre
   Spaltenverteilung, ob der Aufklapper offen ist oder nicht. */
.ds-warteliste .ds-col-aktion {
    width: 15rem;
}
.ds-warteliste .ds-actiondrop__panel {
    width: 22rem;
    max-width: 100%;
}
/* Frisch ausgestellter Bestätigungslink (BENT-2864). Die Zeile wird nach dem
   Ausstellen hervorgehoben, damit man sie unter vielen Wartefällen wiederfindet;
   dieselbe Technik wie die Sprungmarke im Verfügbarkeits-Grid (BENT-2054), also
   reine Orientierungshilfe und kein Zustand der Bewerbung. */
.ds-warteliste tbody tr.is-fokus > td {
    background: var(--t-teal-hi-tint);
}
.ds-warteliste tbody tr.is-fokus > td:first-child {
    box-shadow: inset 3px 0 0 0 var(--t-teal);
}
/* Der Link selbst steht sichtbar da, nicht nur hinter „Link kopieren“: Solange
   der automatische Versand aus ist, ist die Übergabe von Hand der einzige Weg
   nach draußen, und ein Link, den man erst aufdecken muss, sieht aus wie einer,
   der schon unterwegs ist. `overflow-wrap` statt Kürzung, weil ein halber Link
   nicht trägt: Er muss vollständig markierbar bleiben. */
.ds-warteliste .ds-linkfrisch {
    margin-top: .6rem;
}
.ds-warteliste .ds-linkfrisch__url {
    display: block;
    margin-top: .4rem;
    font-size: .82rem;
    line-height: 1.4;
    overflow-wrap: anywhere;
    user-select: all;
}

/* `.ds-lead` bringt aus der vendorten Theme-Schicht `max-width: 62ch` mit (eine
   Lesebreite, richtig so), aber kein auto-Margin. In einer zentrierten Karte
   sitzt der Block deshalb am linken Rand, waehrend sein Text mittig steht: Die
   Zeilen brechen dann sichtbar frueher um als der Rest der Karte und der Umbruch
   wirkt zufaellig (BENT-2872). Der Block gehoert hier in die Mitte, die
   Lesebreite bleibt. Bewusst KK-lokal und eng auf die zentrierte Karte gefasst,
   statt in `bavaria-theme.css`: dort gilt die Regel fuer alle Tools, und
   linksbuendige Karten (`.ds-card`) sollen den Absatz weiterhin links haben. */
.ds-success-card .ds-lead {
    margin-inline: auto;
}
.ds-success-icon {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 4rem;
    height: 4rem;
    border-radius: 50%;
    background: var(--t-green-tint);
    color: var(--t-green);
    margin-bottom: 0.5rem;
}

/* --- Definitionsliste (Ruecklauf-Status) --- */
.ds-definition-list {
    display: grid;
    grid-template-columns: max-content 1fr;
    gap: 0.4rem 1rem;
    margin: 0.5rem 0 0;
}
.ds-definition-list dt {
    font-weight: 600;
    color: var(--t-muted);
    font-size: 0.85rem;
}
.ds-definition-list dd { margin: 0; }

/* --- Ergebnis-Liste des Nachrichten-Eingangs (BENT-2040) ---
   Ein Eintrag pro Zeile. Vorher lief die Liste ueber .ds-definition-list, ein
   zweispaltiges Grid: die Eintraege quetschten sich nebeneinander, statt
   untereinander zu stehen. Darum eine eigene, bewusst einspaltige Karten-Liste. */
.ds-ergebnisliste {
    list-style: none;
    display: flex;
    flex-direction: column;
    gap: 0.6rem;
    margin: 1rem 0;
    padding: 0;
}
.ds-ergebnisliste__item {
    border: 1px solid var(--t-rule);
    border-radius: var(--be-radius);
    padding: 0.8rem 1rem;
    background: var(--t-card);
}
.ds-ergebnisliste__titel {
    margin: 0 0 0.2rem;
    font-weight: 600;
}
.ds-ergebnisliste__satz {
    margin: 0 0 0.5rem;
    color: var(--t-muted);
    font-size: 0.9rem;
}

/* --- Tabelle mit Rahmen-Wrapper (Endauswahl, Verfuegbarkeit) --- */
.ds-table-wrapper {
    overflow-x: auto;
    border: 1px solid var(--t-rule);
    border-radius: var(--be-radius);
    /* Scroll-Shadow-Affordance (BENT-1838, auf Overlay-Technik umgestellt in
       BENT-1883): Fade am linken/rechten Tabellenrand, solange horizontal
       ungescrollter Inhalt folgt. Die Schatten liegen als sticky Pseudo-Elemente
       UEBER der Tabelle (Block „SCROLL-SCHATTEN-OVERLAY" weiter unten) und werden
       nicht mehr von Tabellen-Header/Zebra-/Hover-Hintergruenden verdeckt.
       Flex-Container, damit die Pseudo-Elemente als sticky Flex-Items am
       Tabellenrand haengen; die Tabelle bleibt das fuellende Flex-Item. */
    display: flex;
    background-color: var(--t-card);
}
.ds-table-wrapper > .ds-table {
    /* fuellt die Wrapper-Breite, schrumpft aber nie unter die Spaltenbreite:
       bei Ueberlauf scrollt der Wrapper horizontal (statt Spalten zu quetschen). */
    flex: 1 0 auto;
}
.ds-table {
    width: 100%;
    border-collapse: collapse;
    margin: 0;
    font-size: 0.9rem;
}

/* ========================================
   SCROLL-SCHATTEN-OVERLAY (BENT-1883)
   ----------------------------------------
   Horizontal scrollbare Container (.tab-nav, .ds-subtabs, .ds-table-wrapper)
   zeigen am jeweiligen Rand einen Fade, solange dort ungescrollter Inhalt
   liegt. Robust gegen opake Kind-Hintergruende (anders als das alte
   background-attachment-Muster aus BENT-1837/1838, das der aktive Tab bzw.
   Tabellen-Header/Zebra verdeckten): die Schatten sind sticky Pseudo-Elemente
   UEBER dem Inhalt (z-index, pointer-events:none). Ihre Sichtbarkeit steuert
   static/js/scroll-shadow.js ueber die Klassen .is-scrollable-links /
   .is-scrollable-rechts. Voraussetzung: der Container ist ein Flex-Zeilen-
   container (die drei Container setzen display:flex). Kein background-attachment,
   damit auch Safari/iPad-Scrollcontainer verlaesslich rendern.
   ======================================== */
.tab-nav::before, .tab-nav::after,
.ds-subtabs::before, .ds-subtabs::after,
.ds-table-wrapper::before, .ds-table-wrapper::after {
    content: "";
    position: sticky;
    flex: 0 0 var(--kk-scroll-shadow-breite);
    width: var(--kk-scroll-shadow-breite);
    align-self: stretch;
    z-index: 4;
    pointer-events: none;
    opacity: 0;
    transition: opacity .15s ease;
}
/* Linker Rand-Schatten: haengt links, negatives Margin nach rechts hebt den
   Flex-Platzbedarf auf (Overlay statt Layout-Verschiebung). */
.tab-nav::before,
.ds-subtabs::before,
.ds-table-wrapper::before {
    order: -1;
    left: 0;
    margin-right: calc(-1 * var(--kk-scroll-shadow-breite));
    background: linear-gradient(to right, var(--kk-scroll-shadow), transparent);
}
/* Rechter Rand-Schatten. */
.tab-nav::after,
.ds-subtabs::after,
.ds-table-wrapper::after {
    order: 1;
    right: 0;
    margin-left: calc(-1 * var(--kk-scroll-shadow-breite));
    background: linear-gradient(to left, var(--kk-scroll-shadow), transparent);
}
.tab-nav.is-scrollable-links::before,
.ds-subtabs.is-scrollable-links::before,
.ds-table-wrapper.is-scrollable-links::before { opacity: 1; }
.tab-nav.is-scrollable-rechts::after,
.ds-subtabs.is-scrollable-rechts::after,
.ds-table-wrapper.is-scrollable-rechts::after { opacity: 1; }
.ds-table th,
.ds-table td {
    text-align: left;
    padding: 0.6rem 0.85rem;
    border-bottom: 1px solid var(--t-rule);
}
.ds-table th {
    font-weight: 600;
    color: var(--t-muted);
    font-size: 0.78rem;
    text-transform: uppercase;
    letter-spacing: 0.03em;
}
.ds-table tbody tr:last-child td { border-bottom: none; }

/* Klickbarer Zellen-Link (z. B. Themengebiet-Name -> Cockpit, BENT-1779):
   signalisiert per Farbe klar, dass die Zelle anklickbar ist. */
.ds-table-link {
  color: var(--t-teal);
  text-decoration: none;
}
.ds-table-link:hover,
.ds-table-link:focus-visible {
  text-decoration: underline;
}

/* Bulk-Leiste ueber einer Tabelle (BENT-2050): Sammel-Aktion fuer markierte
   Zeilen, erster Fall „An Expert:in senden" im Endauswahl-Cockpit. Das Formular
   steht bewusst AUSSERHALB der Tabelle (ein <form> im <tr> waere ungueltiges
   HTML, BENT-2056); die Zeilen-Checkboxen binden per form="…"-Attribut daran. */
.ds-bulkbar {
  display: flex;
  flex-wrap: wrap;
  gap: 0.6rem;
  align-items: center;
  margin: 1rem 0 0.6rem;
  padding: 0.6rem 0.8rem;
  border: 1px solid var(--t-border, #d8d8d8);
  border-radius: 8px;
  background: var(--t-surface-2, transparent);
}
.ds-bulkbar .ds-label {
  margin: 0;
  white-space: nowrap;
}
.ds-bulkbar .ds-hint {
  flex: 1 1 16rem;
  margin: 0;
}

/* --- Sortier- und Filter-Erweiterung fuer ds-table (BENT-1776) --- */
.ds-table-filter {
  display: flex;
  align-items: center;
  gap: 0.6rem;
  margin: 0 0 0.6rem;
  flex-wrap: wrap;
}
.ds-table-filter__input {
  width: 18rem;
  max-width: 100%;
  margin: 0;
}
.ds-table-filter__count {
  font-size: 0.8rem;
  color: var(--t-muted);
}
/* Sortierbare Kopfzelle: klickbar, mit Richtungs-Indikator. */
.ds-th-sortable {
  cursor: pointer;
  user-select: none;
  white-space: nowrap;
}
.ds-th-sortable::after {
  content: "↕";
  margin-left: 0.35em;
  opacity: 0.35;
  font-size: 0.9em;
}
.ds-th-sortable[aria-sort="ascending"]::after { content: "↑"; opacity: 0.9; }
.ds-th-sortable[aria-sort="descending"]::after { content: "↓"; opacity: 0.9; }
.ds-th-sortable:hover { color: var(--t-ink); }
.ds-th-sortable:focus-visible {
  outline: 2px solid var(--t-teal);
  outline-offset: -2px;
}
/* Vom Filter ausgeblendete Zeilen. */
.ds-table tbody tr.ds-row-hidden { display: none; }

/* ========================================
   ENDAUSWAHL-COCKPIT: Spaltenbreiten (BENT-2231)
   ----------------------------------------
   Das Cockpit hat neun Spalten und lief auf breiten Viewports trotzdem in
   horizontalen Scroll: die schmalen, im fruehen Prozess-Stadium fast leeren
   Inhalts-Spalten (Score, Relevanz, Pick, Votum, Status, Flags) spannten breite
   Spalten auf, waehrend die Objekt-Spalte so schmal blieb, dass Bezeichnungen
   ueber viele Zeilen umbrachen und die Aktionsspalte rechts abgeschnitten wurde.
   Fix: die schmalen Spalten auf Inhaltsbreite klemmen (width: 1% ist der
   Shrink-to-fit-Hinweis des auto-Table-Layouts, KEINE echte Prozentbreite), der
   frei werdende Platz faellt der Objekt-Spalte zu. Der Mobile-Scroll ueber den
   .ds-table-wrapper (BENT-2136 Punkt 3) bleibt unberuehrt: hier wird nur die
   Spaltenverteilung geregelt, nicht der Wrapper. Kein table-layout: fixed, damit
   die Zellen ihre Mindestbreite behalten und nichts gequetscht wird. */
.ds-cockpit .ds-col-check { width: 2rem; }
.ds-cockpit .ds-col-eng { width: 1%; }
/* Die Objekt-Spalte nimmt den frei werdenden Platz; die Mindestbreite haelt sie
   auch dann breit genug, wenn Aktions- und Inhalts-Spalten viel fordern. */
.ds-cockpit .ds-col-objekt { width: auto; min-width: 15rem; }
/* Die Aktionsspalte bekommt eine feste, ausreichende Breite; der Button-Cluster
   bricht darin um (siehe unten), statt die Spalte auf seine Summenbreite
   aufzuspannen und rechts aus dem Bild zu laufen. */
.ds-cockpit .ds-col-aktion { width: 15rem; }

/* Objektbezeichnung auf drei Zeilen klemmen (CSS line-clamp); der volle Text
   bleibt im title-Attribut des Links erreichbar. Ohne den Deckel triebe ein
   langer Titel die max-content-Breite der Objekt-Spalte hoch. overflow-wrap
   bricht zur Not auch ueberlange Einzelwoerter, damit kein Wort die Spalte
   sprengt. */
/* Der Text-Block der Objektzelle ist ein Flex-Kind neben dem Thumbnail; ohne
   min-width: 0 laesst er sich nicht unter seine Inhaltsbreite schrumpfen und der
   line-clamp der Bezeichnung greift nicht. */
.ds-cockpit-objektzelle { min-width: 0; }
/* Das Thumbnail (der Foto-Link) darf NICHT schrumpfen, sonst wird das Bild zum
   schmalen Streifen gequetscht (statt zu schrumpfen soll der Text weichen, siehe
   min-width: 0 oben). Feste Kantenlaenge + object-fit: cover stecken am <img>. */
.ds-cockpit .ds-col-objekt a.js-lightbox { flex: 0 0 auto; }

.ds-cockpit-titel {
  display: -webkit-box;
  -webkit-line-clamp: 3;
  line-clamp: 3;
  -webkit-box-orient: vertical;
  overflow: hidden;
  overflow-wrap: anywhere;
}

/* Der Entscheidungs-Button-Cluster (Auswaehlen, Reserve, Raus, Zuruecksetzen)
   darf umbrechen, statt in einer nicht umbrechenden Reihe die Aktionsspalte auf
   seine volle Summenbreite zu zwingen. Alle vier Slots bleiben erhalten
   (BENT-2135), sie wandern bei Bedarf nur in eine zweite Zeile. Nur im Cockpit
   angewandt. */
.ds-cockpit .ds-rowactions__cluster { flex-wrap: wrap; }
/* Anordnung der Zeilen-Aktionen (BENT-2874). Drei Regeln, alle drei aus dem
   gemessenen Bild heraus, nicht aus Geschmack:
   1. Der Cluster bricht in der 15rem-Spalte um (gewollt, BENT-2231). Beim
      Umbruch soll die zweite Reihe links anschliessen und nicht mittig
      schweben, sonst steht der „aktuell"-Slot allein in der Mitte und die
      Spalte wirkt zufaellig gesetzt.
   2. Der Aufklapper ist ein Flex-Geschwister des Clusters und landete darum
      NEBEN ihm; sein Panel schob sich seitlich aus der Spalte. Mit voller
      Flex-Basis bekommt er eine eigene Zeile, das Panel oeffnet darunter.
   3. Das Panel selbst braucht eine Breite, sonst spreizt es die Spalte (die
      Basis-Regel gibt ihm min-width: 20rem, die --row-Variante hebt das auf). */
.ds-cockpit .ds-rowactions { justify-content: flex-start; }
.ds-cockpit .ds-rowactions__cluster { justify-content: flex-start; }
.ds-cockpit .ds-rowactions .ds-actiondrop { flex: 0 0 100%; }
.ds-cockpit .ds-actiondrop__panel { width: 100%; }

/* ========================================
   VERFUEGBARKEITS-GRID (.ds-vgrid, BENT-2039)
   ----------------------------------------
   Das Experten-Grid der Aufzeichnungs-Detailseite hat pro Drehtag zwei
   Halbtags-Spalten; bei realistischen 5 Drehtagen sind das 10 Checkbox-Spalten
   plus Expert:in, Notiz und Speichern. Frueher war jede Spalte voll gepolstert
   (0.85rem links/rechts) und trug einen eigenen „Fr 15.10. VM"-Kopf, dazu je
   eine Spalte fuer Fachgebiet und Status: die Tabelle war damit breiter als
   jeder Monitor, die Speichern-Spalte fiel hinten aus dem Bild.

   Drei Massnahmen, damit 5 Drehtage auf 1440 px ohne horizontalen Scroll
   passen: (1) Fachgebiet, Status und die Aktions-Links stecken in der
   Expert:in-Zelle (zweizeilig), (2) der Drehtag steht einmal als Obertitel
   ueber seinen beiden VM/NM-Spalten, (3) die Checkbox-Spalten laufen auf
   Minimalbreite (schmales Padding, feste Breite). Der Wrapper bleibt
   horizontal scrollbar (Scroll-Schatten-Affordance) — das greift dann nur noch
   auf schmalen Viewports, nicht mehr am Arbeitsplatz.
   ======================================== */
.ds-vgrid {
  table-layout: auto;
}
/* Checkbox-/Halbtags-Spalten: so schmal wie moeglich. */
.ds-vgrid__slot {
  width: 2.75rem;
  padding-left: 0.2rem;
  padding-right: 0.2rem;
  text-align: center;
  white-space: nowrap;
}
.ds-vgrid thead .ds-vgrid__slot {
  font-size: 0.68rem;
  letter-spacing: 0.02em;
  padding-top: 0.25rem;
  padding-bottom: 0.4rem;
}
.ds-vgrid td.ds-vgrid__slot input[type="checkbox"] { margin: 0; }
.ds-vgrid__ja { color: var(--t-green); }
.ds-vgrid__nein { color: var(--t-muted); }
/* Drehtag-Obertitel ueber seinem VM/NM-Paar. */
.ds-vgrid__tag {
  text-align: center;
  white-space: nowrap;
  padding-bottom: 0.25rem;
  border-left: 1px solid var(--t-rule);
  border-bottom: none;
}
.ds-vgrid__tag + .ds-vgrid__tag { border-left: 1px solid var(--t-rule); }
/* Expert:in-Zelle traegt Name + Status-Badge und darunter Fachgebiet + Aktionen. */
.ds-vgrid__experte { min-width: 13rem; }
.ds-vgrid__name {
  display: flex;
  align-items: center;
  gap: 0.4rem;
  flex-wrap: wrap;
}
.ds-vgrid__meta {
  display: flex;
  align-items: baseline;
  gap: 0.55rem;
  flex-wrap: wrap;
  margin-top: 0.15rem;
  font-size: 0.78rem;
  color: var(--t-muted);
}
.ds-vgrid__meta a { color: var(--t-teal); text-decoration: none; }
.ds-vgrid__meta a:hover,
.ds-vgrid__meta a:focus-visible { text-decoration: underline; }
.ds-vgrid__fach { color: var(--t-muted); }
/* Notiz bleibt schmal, fuellt aber die Restbreite ihrer Spalte. */
.ds-vgrid__notiz { width: 12rem; }
.ds-vgrid__notiz-input {
  width: 100%;
  min-width: 6rem;
  margin: 0;
  font-size: 0.85rem;
  padding: 0.3rem 0.45rem;
  height: auto;
}
/* Speichern-Spalte: nur so breit wie der Button. */
.ds-vgrid__aktion {
  width: 1%;
  white-space: nowrap;
  text-align: right;
}
/* Zeile, auf die aus der Expert:innen-Liste gesprungen wurde (BENT-2054):
   Sprungmarke ist die Zeilen-ID (#experte-<id>), scroll-margin haelt sie unter
   der Kopfleiste frei. Reine Orientierungshilfe, kein Zustand. */
.ds-vgrid__zeile { scroll-margin-top: 6rem; }
.ds-vgrid tbody tr.is-fokus > td {
  background: var(--t-teal-hi-tint);
}
.ds-vgrid tbody tr.is-fokus > td:first-child {
  box-shadow: inset 3px 0 0 0 var(--t-teal);
}

/* ========================================
   AUFZEICHNUNGS-AUSWAHL (.ds-azliste, BENT-2054)
   ----------------------------------------
   Zwischenschritt des „Verfuegbarkeit"-Einstiegs aus der Expert:innen-Liste,
   wenn mehrere Aufzeichnungen zur Wahl stehen (bei genau einer springt die
   Route direkt durch). Fachlich passende Aufzeichnungen stehen oben.
   ======================================== */
.ds-azliste {
  list-style: none;
  margin: 0 0 1.5rem;
  padding: 0;
  display: grid;
  gap: 0.6rem;
}
/* Pico setzt den Marker am <li>, nicht an der <ul>: beides abraeumen, sonst
   haengt links neben jeder Karte ein Aufzaehlungspunkt. */
.ds-azliste__item { list-style: none; }
.ds-azliste__item::marker { content: ""; }
.ds-azliste__link {
  display: block;
  padding: 0.85rem 1rem;
  border: 1px solid var(--t-rule);
  border-radius: var(--be-radius);
  background: var(--t-card);
  color: inherit;
  text-decoration: none;
}
.ds-azliste__link:hover,
.ds-azliste__link:focus-visible {
  border-color: var(--t-teal);
  background: var(--t-teal-tint);
}
.ds-azliste__name {
  display: block;
  font-weight: 600;
  color: var(--t-ink);
}
.ds-azliste__meta {
  display: block;
  margin-top: 0.2rem;
  font-size: 0.82rem;
  color: var(--t-muted);
}

/* Anleitung/Prosa-Container (BENT-1802-Fix): NICHT .ds-help verwenden — das ist
   das kleine runde Hilfe-Icon (inline-flex, 1.1rem), das den gerenderten
   Markdown-Text sonst in ein Mini-Element quetscht. Hier: normaler Lesefluss. */
.ds-help-content {
  display: block;
  max-width: 72ch;
}
.ds-help-content h2 { margin-top: 1.9rem; }
.ds-help-content h3 { margin-top: 1.3rem; }
.ds-help-content p { margin: 0.6rem 0; }
.ds-help-content ul,
.ds-help-content ol { padding-left: 1.4rem; margin: 0.5rem 0; }
.ds-help-content li { margin: 0.2rem 0; }
.ds-help-content code { font-size: 0.85em; }

/* --- Fehlende Badge-Modifier (Ergaenzung zu den Semantik-Varianten oben) --- */
.ds-badge--primary { background: var(--t-teal-tint);   color: var(--t-teal); }
.ds-badge--error   { background: var(--t-red-tint);    color: var(--t-red); }
.ds-badge--small   { padding: 0.05rem 0.4rem; font-size: 0.7rem; }

/* ======================================================================
   K+K-lokale Bausteine, entwirrt aus der ungestempelten bavaria-theme.css
   (BENT-1759). Diese Klassen waren lokal in die vendored Theme-Kopie
   gemischt und sind NICHT im kanonischen tinte-Master (bavaria-theme.css
   v0.4.4 / tinte-base.css v0.5.1). Beim Re-Vendor hierher gezogen, damit
   nichts verloren geht. Rein K+K-spezifisch (Dashboard, Score, Flags,
   Aktionsleiste, Lightbox, semantische Badge-Modifier).
   ====================================================================== */

/* --- Dashboard: Einstiegs-Kachelraster fuer die Startseite --- */
.ds-section-title {
  font-family: var(--f-serif);
  font-size: 1.25rem;
  font-weight: 600;
  color: var(--t-ink);
  margin: 2.4rem 0 1rem;
}
.dash-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
  gap: 1rem;
}

.dash-card {
  position: relative;
  display: block;
  background: var(--t-card);
  border: 1px solid var(--t-rule);
  border-radius: var(--be-radius-lg);
  padding: 1.3rem 1.3rem 1.15rem;
  text-decoration: none;
  color: var(--t-ink);
  transition: border-color .15s ease, box-shadow .15s ease, transform .15s ease;
}
.dash-card:hover, .dash-card:focus-visible {
  border-color: var(--t-teal);
  box-shadow: 0 4px 18px rgba(0, 102, 128, 0.12);
  transform: translateY(-2px);
}
.dash-card__badge {
  position: absolute;
  top: 1.15rem;
  right: 1.15rem;
  min-width: 1.9rem;
  padding: 0.15rem 0.55rem;
  border-radius: 999px;
  background: var(--t-teal-tint);
  color: var(--t-teal);
  font-family: var(--f-mono, monospace);
  font-size: 0.95rem;
  font-weight: 600;
  text-align: center;
  line-height: 1.4;
}
.dash-card__title {
  display: block;
  font-family: var(--f-serif);
  font-size: 1.1rem;
  font-weight: 600;
  color: var(--t-ink);
  margin-right: 2.6rem;
  margin-bottom: 0.5rem;
}
.dash-card__desc {
  font-size: 0.9rem;
  color: var(--t-ink-soft);
  line-height: 1.5;
  margin: 0 0 0.8rem;
}
.dash-card__meta {
  font-size: 0.75rem;
  font-weight: 600;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--t-muted);
}
/* Karte mit offener Aufgabe (z. B. Provenienz-Flags) hebt sich ab.
   Nur der Rahmen markiert den Alert; der Badge bleibt bewusst im normalen
   Tint-Stil, damit er nicht mit den voll eingefaerbten Stufen-Nummern des
   gefuehrten Durchgangs verwechselt wird (Jan-Feedback zu BENT-2035). */
.dash-card--alert { border-color: var(--t-teal); }

/* --- Gefuehrter Durchgang (BENT-2035) ---
   Nummerierung per CSS-Counter, damit rollenbedingt ausgeblendete
   Schritte (z. B. Knock-out nur Objektkoordination) keine Luecke reissen. */
.dash-flow-hint {
  max-width: 62ch;
  margin: -0.4rem 0 1rem;
  font-size: 0.9rem;
  color: var(--t-ink-soft);
  line-height: 1.5;
}
.dash-flow { counter-reset: dash-step; }
.dash-flow .dash-card--step {
  counter-increment: dash-step;
  padding-left: 3.6rem;
}
.dash-flow .dash-card--step::before {
  content: counter(dash-step);
  position: absolute;
  top: 1.2rem;
  left: 1.1rem;
  width: 1.75rem;
  height: 1.75rem;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  background: var(--t-teal);
  color: #fff;
  font-family: var(--f-mono, monospace);
  font-size: 0.95rem;
  font-weight: 600;
  line-height: 1;
}

/* --- Semantische Farbrollen als Token (BENT-3275) --------------------------
 *
 * Die fuenf Farbpaare der Abzeichen standen bis dahin als feste Werte in den
 * `.ds-badge--*`-Regeln (und noch einmal als rgba-Literale im dunklen Modus).
 * Seit die Auswahl-Knopfreihe DIESELBE Farbe tragen muss wie das Abzeichen
 * desselben Zustands, braucht sie eine zweite Leserin: Ohne Token stuende jedes
 * Paar zweimal im Stylesheet, und eine Aenderung an einer Stelle liesse Abzeichen
 * und Knopfreihe auseinanderlaufen -- genau das, was BENT-3273 auf der Ebene der
 * Zuordnung Status-zu-Rolle abgeschafft hat. Die Werte sind unveraendert.
 *
 * Die Rollen-Zuordnung selbst (welcher Status welche Rolle bekommt) steht NICHT
 * hier, sondern in `config.AUSWAHL_STATUS_BADGE_KLASSEN`. Hier steht nur, wie
 * eine Rolle aussieht. */
:root {
  --kk-rolle-success-flaeche: var(--t-green-tint);
  --kk-rolle-success-schrift: var(--t-green);
  --kk-rolle-warning-flaeche: var(--t-amber-tint);
  --kk-rolle-warning-schrift: var(--t-amber);
  --kk-rolle-danger-flaeche:  var(--t-red-tint);
  --kk-rolle-danger-schrift:  var(--t-red);
  --kk-rolle-info-flaeche:    var(--t-teal-hi-tint);
  --kk-rolle-info-schrift:    var(--t-teal);
  --kk-rolle-neutral-flaeche: var(--t-hairline);
  --kk-rolle-neutral-schrift: var(--t-muted);
}
:root[data-theme="dark"] {
  --kk-rolle-success-flaeche: rgba(46, 125, 50, 0.22);
  --kk-rolle-success-schrift: #7fd487;
  --kk-rolle-warning-flaeche: rgba(184, 116, 42, 0.24);
  --kk-rolle-warning-schrift: #e0a86a;
  --kk-rolle-danger-flaeche:  rgba(162, 58, 44, 0.26);
  --kk-rolle-danger-schrift:  #e59485;
  --kk-rolle-neutral-flaeche: rgba(255, 255, 255, 0.07);
  --kk-rolle-neutral-schrift: var(--t-muted);
}

/* --- Semantische Badge-Varianten (BENT-1473, Werte seit BENT-3275 als Token) --- */
.ds-badge--success { background: var(--kk-rolle-success-flaeche); color: var(--kk-rolle-success-schrift); }
.ds-badge--warning { background: var(--kk-rolle-warning-flaeche); color: var(--kk-rolle-warning-schrift); }
.ds-badge--danger  { background: var(--kk-rolle-danger-flaeche);  color: var(--kk-rolle-danger-schrift); }
.ds-badge--info    { background: var(--kk-rolle-info-flaeche);    color: var(--kk-rolle-info-schrift); }
.ds-badge--neutral { background: var(--kk-rolle-neutral-flaeche); color: var(--kk-rolle-neutral-schrift); }

/* --- Marke als Sprungziel (BENT-3274) -----------------------------------
 *
 * Die beiden sprechenden Marken der Flags-Spalte (Provenienz, Knock-out) sind
 * Links an die Stelle, an der man den Fall bearbeitet. Ein `<a>` erbt vom
 * Grundgeruest Linkfarbe und Unterstreichung und saehe damit weder wie das
 * Badge daneben aus noch traege es die Farbe, die seine Aussage ist; die Marke
 * behaelt darum die Farbe ihres Modifiers (`color: inherit`) und zeigt die
 * Anfassbarkeit ueber den Zeiger und eine Unterstreichung erst beim Hover.
 *
 * Bewusst NUR die Link-Eigenschaften: Hintergrund, Form und Groesse kommen
 * unveraendert von `.ds-badge` und seinen semantischen Varianten, sonst gaebe es
 * zwei Auslegungen desselben Badges.
 */
.ds-marke {
  color: inherit;
  text-decoration: none;
  cursor: pointer;
}
.ds-marke:hover,
.ds-marke:focus-visible {
  text-decoration: underline;
}

/* --- Herkunft einer aussage-Zeile (BENT-2772) ---------------------------
 *
 * Wer hat diesen Wert zu verantworten? Die Farbzuordnung selbst steht als EINE
 * Quelle in `config.HERKUNFT_FARB_KLASSEN`, hier stehen nur die Farben dazu.
 *
 * Die Vergabe folgt dem Leitsatz „KI schlaegt vor, Mensch entscheidet": Jede
 * menschliche Aussage traegt Farbe und eine kraeftige linke Kante, die Maschine
 * tritt grau zurueck. Vorher leuchtete ausgerechnet die KI-Vermutung blau,
 * waehrend Expert:in, Einreicher:in und Experten-Korrektur alle drei im selben
 * Grau lagen.
 *
 * Die linke Kante traegt die Unterscheidung mit, nicht nur der Farbton: Fuenf
 * Kategorien auf vier Theme-Farben lassen sich per Farbe allein nicht sicher
 * trennen, und der Bericht wird gedruckt (siehe auch das Klartext-Label, das
 * neben der Farbe stehen bleibt).
 *
 * `--t-teal` gehoert der hoechsten fachlichen Autoritaet (Expert:in), weil es im
 * Tool ohnehin die Farbe der aktiven, tragenden Elemente ist. Die
 * Einreicher-Angabe (niedrigster Rang) bekommt einen eigenen, gedaempften
 * Violett-Ton: Das Theme liefert vier semantische Farben, unterschieden werden
 * muessen fuenf Herkuenfte, und gruen/gelb/rot sind im Tool bereits mit
 * Status-Bedeutung belegt.
 */
.ds-herkunft {
  border-left: 3px solid var(--t-faint);
  padding-left: 0.5rem;
  /* Links eckig: Der Radius der `.ds-badge`-Basis liesse die Farbkante als
   * runde Klammer erscheinen statt als klare Markierung. */
  border-top-left-radius: 0;
  border-bottom-left-radius: 0;
}
.ds-herkunft--experte    { background: var(--t-teal-tint);   color: var(--t-teal);  border-left-color: var(--t-teal); }
.ds-herkunft--belegt     { background: var(--t-green-tint);  color: var(--t-green); border-left-color: var(--t-green); }
.ds-herkunft--redaktion  { background: var(--t-amber-tint);  color: var(--t-amber); border-left-color: var(--t-amber); }
.ds-herkunft--einreicher { background: var(--kk-violett-tint); color: var(--kk-violett); border-left-color: var(--kk-violett); }
.ds-herkunft--ki         { background: var(--t-hairline);    color: var(--t-muted); border-left-color: var(--t-faint); }
.ds-herkunft--unbekannt  { background: var(--t-hairline);    color: var(--t-muted); border-left-color: var(--t-faint); }

:root {
  --kk-violett:      #6b4f9e;
  --kk-violett-tint: #efeaf7;
}
:root[data-theme="dark"] {
  --kk-violett:      #b9a3e0;
  --kk-violett-tint: rgba(185, 163, 224, 0.16);
}
:root[data-theme="dark"] .ds-herkunft--ki,
:root[data-theme="dark"] .ds-herkunft--unbekannt {
  background: rgba(255, 255, 255, 0.07);
  /* Etwas heller als `--t-muted`: Mit dem Token-Grau liegt der Kontrast im
   * Dunkeln bei 4,15 und damit unter WCAG AA (4,5) fuer kleinen Text. Die
   * KI-Vermutung soll zuruecktreten, aber lesbar bleiben. Gemessen: 4,9. */
  color: #9aa7ab;
}

/* Merkmal wurde nach dem KI-Lauf noch einmal angefasst (BENT-2772). Bewusst
 * ein eigener, farbneutraler Marker neben der Herkunfts-Farbe: „von wem" und
 * „ueberhaupt geaendert" sind zwei verschiedene Aussagen. */
.ds-herkunft-korrigiert {
  margin-left: 0.4rem;
  font-size: 0.78rem;
  color: var(--t-muted);
  white-space: nowrap;
}

/* Hinweis auf einen neueren, aber nicht massgeblichen Eintrag (BENT-3280).
   Steht als eigene Zeile UNTER dem Wert, nicht daneben: Er nennt einen zweiten
   Text, und zwei Texte nebeneinander in derselben Zelle liest niemand
   auseinander. Bewusst KEINE der vier semantischen Farben: Das ist kein
   Fehler und kein Status, sondern eine Auskunft, und Amber/Rot stehen im
   Bericht bereits fuer „etwas ist offen" bzw. „hier ist Schluss". Der gedaempfte
   Ton reicht, den Ausschlag gibt der Wortlaut. Im Ausdruck bleibt der Hinweis
   stehen: Wer den Bericht auf Papier liest, soll denselben Vorbehalt sehen. */
.ds-verdeckt {
  display: block;
  margin-top: 0.3rem;
  font-size: 0.78rem;
  line-height: 1.35;
  color: var(--t-muted);
  border-left: 2px solid var(--t-rule);
  padding-left: 0.5rem;
}

/* Der geaenderte Wert selbst wird fett gesetzt (BENT-2957, Entscheidung Jan:
 * „Geaenderter Text kann auch fett sein"). Bewusst KEINE weitere Farbe: die
 * vier semantischen Theme-Farben tragen bereits Status, die fuenf
 * Herkunfts-Farben aus BENT-2772 stehen unmittelbar daneben in derselben
 * Zeile, und Fettschrift ueberlebt zusaetzlich den Ausdruck und traegt bei
 * Farbsehschwaeche.
 *
 * Die Auszeichnung wirkt nur, solange sie in dieser Tabelle und in der
 * Historie sonst nichts bedeutet: `.ds-historie-wert` hat ihretwegen seine
 * pauschale Fettschrift verloren (siehe dort). Wer Fettschrift an einer
 * dritten Stelle des Berichts einfuehrt, nimmt ihr genau diese Aussage. */
.ds-wert-geaendert {
  font-weight: 700;
}

/* --- Meta-Raster: Label und Wert nebeneinander (BENT-1473) --- */
.ds-meta-grid {
  display: grid;
  grid-template-columns: minmax(9rem, max-content) 1fr;
  gap: 0; margin: 0;
}
/* Beide Zellen einer Zeile teilen sich die Unterkante, darum KEIN
   `align-self: start`: Label und Wert tragen verschiedene Schriftgroessen
   (0,72rem gegen 1rem), mit `start` schrumpft jede Box auf ihre eigene
   Inhaltshoehe und die beiden Trennlinien liegen sichtbar versetzt
   uebereinander (BENT-3037). Der Textfluss aendert sich dadurch nicht,
   der Inhalt beginnt in beiden Zellen weiterhin oben. */
.ds-meta-grid > dt,
.ds-meta-grid > dd {
  padding: 0.5rem 0;
  border-bottom: 1px solid var(--t-hairline);
}
.ds-meta-grid > dt {
  font-size: 0.72rem; text-transform: uppercase; letter-spacing: 0.05em;
  color: var(--t-muted); font-weight: 600; padding-right: 1.25rem;
  line-height: 1.5;
}
.ds-meta-grid > dd { margin: 0; color: var(--t-ink); line-height: 1.5; }
/* Letzte Zeile (letztes dt+dd-Paar) ohne Trennlinie. */
.ds-meta-grid > *:nth-last-child(-n+2) { border-bottom: none; padding-bottom: 0; }
@media (max-width: 560px) {
  .ds-meta-grid { grid-template-columns: 1fr; }
  .ds-meta-grid > dt { padding: 0.5rem 0 0.1rem; border-bottom: none; }
  .ds-meta-grid > dd { padding: 0 0 0.55rem; }
  .ds-meta-grid > dd { border-bottom: 1px solid var(--t-hairline); }
  .ds-meta-grid > *:nth-last-child(-n+2) { border-bottom: none; }
}

/* --- Score-Visualisierung: Bewertungs-Block (BENT-1473) --- */
.ds-score-hero {
  display: flex; align-items: baseline; flex-wrap: wrap; gap: 0.35rem 0.7rem;
  padding: 0.9rem 1.15rem; margin-bottom: 1.3rem;
  border: 1px solid var(--t-rule); border-radius: var(--be-radius-lg);
  background: var(--t-teal-tint);
}
.ds-score-hero__num {
  font-family: var(--f-serif); font-size: 2.4rem; font-weight: 700; line-height: 1;
  color: var(--t-teal); font-variant-numeric: tabular-nums;
}
.ds-score-hero__label {
  font-size: 0.72rem; text-transform: uppercase; letter-spacing: 0.08em;
  color: var(--t-muted); font-weight: 600;
}
.ds-score-hero__badges { margin-left: auto; display: inline-flex; gap: 0.4rem; flex-wrap: wrap; }

.ds-scorelist { display: grid; gap: 0.85rem; margin: 0 0 0.25rem; }
.ds-scoreitem {
  display: grid; grid-template-columns: minmax(8rem, 13rem) 1fr auto;
  align-items: center; gap: 0.75rem;
}
.ds-scoreitem__label { font-size: 0.82rem; color: var(--t-ink-soft); font-weight: 500; }
.ds-scoretrack {
  position: relative; height: 0.55rem; border-radius: 999px;
  background: var(--t-hairline); overflow: hidden;
}
.ds-scoretrack__fill {
  position: absolute; top: 0; bottom: 0; left: 0;
  border-radius: 999px; background: var(--t-teal); min-width: 0.55rem;
}
.ds-scoreitem__value {
  font-variant-numeric: tabular-nums; font-weight: 600; font-size: 0.85rem;
  color: var(--t-ink); white-space: nowrap; text-align: right;
}
.ds-scoreitem__value .ds-scoreitem__max { color: var(--t-faint); font-weight: 500; }
:root[data-theme="dark"] .ds-scoretrack { background: rgba(255, 255, 255, 0.08); }

/* Rechenweg-Zeile unter dem Gesamtscore (BENT-2229): die vier kalibrierbaren
   Gewichte live, Aufwand als Abzug. Ruhig gesetzt, damit sie den Score erklaert,
   ohne mit der Hero-Zahl zu konkurrieren. */
.ds-score-formel {
  display: flex; flex-wrap: wrap; align-items: baseline;
  gap: 0.2rem 0.55rem;
  margin: -0.9rem 0 1.15rem;
  font-size: 0.8rem; color: var(--t-ink-soft);
  font-variant-numeric: tabular-nums;
}
.ds-score-formel__trenner { color: var(--t-faint); }
.ds-score-formel__abzug { color: var(--t-amber); font-weight: 600; }

/* Aufwand ist ein ABZUG (BENT-2229): amberfarbener, schraffierter Balken und
   Minus-Wert statt der teal „Positiv"-Optik der uebrigen Kriterien, damit ein
   hoher Aufwand nicht wie ein positiver Score-Beitrag gelesen wird. */
.ds-scoreitem__hinweis { color: var(--t-amber); font-weight: 500; }
.ds-scoreitem--abzug .ds-scoreitem__value { color: var(--t-amber); }
.ds-scoretrack--abzug { background: var(--t-amber-tint); }
.ds-scoretrack--abzug .ds-scoretrack__fill {
  background-color: var(--t-amber);
  background-image: repeating-linear-gradient(
    -45deg,
    rgba(255, 255, 255, 0.30) 0, rgba(255, 255, 255, 0.30) 3px,
    transparent 3px, transparent 6px
  );
}
:root[data-theme="dark"] .ds-scoretrack--abzug { background: rgba(184, 116, 42, 0.22); }

@media (max-width: 560px) {
  .ds-scoreitem { grid-template-columns: 1fr auto; }
  .ds-scoreitem__label { grid-column: 1 / -1; }
}

/* --- Provenienz-Flag-Karten: Bericht-Block Flags/Risiken (BENT-1474) --- */
.ds-flaglist { display: grid; gap: 0.85rem; margin: 0 0 0.5rem; }
.ds-flagcard {
  border: 1px solid var(--t-rule); border-left: 3px solid var(--t-amber);
  border-radius: var(--be-radius); padding: 0.8rem 1rem; background: var(--t-card);
}
/* Die Kante folgt derselben Vergabe wie die Badge-Farbe (BENT-3273,
   config.PROVENIENZ_FLAG_STATUS_BADGE_KLASSEN): Rot gehört seither
   ausschließlich dem Ausgang „Herkunft zweifelhaft". Ein offenes Flag heisst
   „noch nicht entschieden" und traegt darum Gelb; vorher war es rot und damit
   von der einzigen Zeile, die wirklich „Nein" bedeutet, nicht zu unterscheiden.
   Wer die Farbe eines Zustands aendert, aendert BEIDE Stellen zusammen. */
.ds-flagcard--offen       { border-left-color: var(--t-amber); }
.ds-flagcard--in_klaerung { border-left-color: var(--t-teal); }
.ds-flagcard--geklaert    { border-left-color: var(--t-green); }
.ds-flagcard--bedenklich  { border-left-color: var(--t-red); }
.ds-flagcard__head {
  display: flex; align-items: center; gap: 0.5rem;
  margin-bottom: 0.6rem; flex-wrap: wrap;
}
.ds-flagcard__head strong { font-family: var(--f-serif); font-weight: 600; }

/* --- Recherche-Einträge am Provenienz-Flag (BENT-2961) ---
   Append-only Spur dessen, was schon nachgesehen wurde. Bewusst eine schlichte
   chronologische Liste und KEIN eigenes Historien-Bedienelement: die einheitliche
   Form dafür sind seit BENT-2963 die Makros in templates/_historie.html
   (Uhr-Icon mit Zähler, `.ds-historie-*`). Nur Tokens, damit Light und Dark Mode ohne
   Sonderregel funktionieren; die Einträge bleiben im Druck stehen (sie sind der
   Beleg), nur das Eintrags-Formular trägt `.no-print`. */
.ds-recherche { margin-top: 0.75rem; }
.ds-recherche__titel {
  display: flex; align-items: center; gap: 0.5rem; flex-wrap: wrap;
  margin: 0 0 0.5rem; font-weight: 600;
}
.ds-recherche__liste {
  list-style: none; margin: 0 0 0.6rem; padding: 0;
  display: grid; gap: 0.6rem;
}
.ds-recherche__eintrag {
  border-left: 2px solid var(--t-rule); padding-left: 0.7rem;
}
.ds-recherche__kopf { margin: 0; font-size: 0.9em; color: var(--t-muted); }
.ds-recherche__begriff { margin: 0.1rem 0 0; }
.ds-recherche__ergebnis { margin: 0.2rem 0 0; white-space: pre-wrap; }
.ds-recherche__form > form { margin-top: 0.6rem; max-width: 34rem; }

/* Suchbegriffe + Deep-Links am selben Flag (BENT-2954).
   Bewusst eine Liste und keine Tabelle: sie sitzt in der Beschreibungs-Spalte
   einer ohnehin breiten Tabelle, eine verschachtelte Tabelle spannte die Spalte
   auf. `.no-print` trägt der Aufklapper im Markup: die Links nützen nur am
   Bildschirm, der Begriffssatz fürs PDF steht im Objektbericht. */
.ds-recherche__begriffe { margin: 0 0 0.6rem; }
.ds-recherche__begriffe > .ds-hint { margin: 0.5rem 0 0.4rem; max-width: 44rem; }
.ds-recherche__begriffsliste {
  list-style: none; margin: 0; padding: 0;
  display: grid; gap: 0.35rem;
}
.ds-recherche__begriffsliste > li {
  display: flex; align-items: baseline; gap: 0.5rem; flex-wrap: wrap;
}
.ds-recherche__kategorie {
  color: var(--t-muted); font-size: 0.85em; min-width: 11rem;
}
.ds-recherche__portale { font-size: 0.9em; }

/* --- Rückfragen-Karte: offen vs. beantwortet (BENT-2046) ---
   Zwei Gruppen, sichtbar getrennt: offene Rückfragen (Bernstein-Kante) und die
   beantworteten Frage-Antwort-Paare (grüne Kante). Rein über Tokens, damit Light
   und Dark Mode ohne Sonderregel funktionieren; im Druck bleibt die Struktur
   (Titel + Einrückung) erhalten, die Farbkanten treten zurück. */
.ds-fragen-titel {
  display: flex; align-items: center; gap: 0.5rem; flex-wrap: wrap;
  margin: 1rem 0 0.4rem;
}
.ds-fragen { margin: 0 0 0.75rem; padding-left: 1.1rem; }
.ds-fragen--offen > li { margin-bottom: 0.25rem; }

/* Frage-Antwort-Paare: die Frage führt, die Antwort steht eingerückt darunter. */
.ds-qa { margin: 0 0 0.75rem; }
.ds-qa > dt {
  font-weight: 600;
  border-left: 3px solid var(--t-green);
  padding-left: 0.6rem;
  margin-top: 0.5rem;
}
.ds-qa > dd {
  margin: 0.15rem 0 0;
  padding-left: 0.6rem;
  border-left: 3px solid var(--t-rule);
  color: var(--t-ink-soft);
}

/* --- Bericht-Aktionsleiste + Druckansicht (BENT-1476) --- */
.ds-actionbar {
  display: flex; flex-wrap: wrap; align-items: center; gap: 0.6rem;
  margin: 0.25rem 0 0.35rem;
}

/* --- Gruppierte Aktionsleiste im Bericht-Kopf (BENT-1878) ---
   Eine Leiste, drei sichtbar getrennte Cluster (Dokument / Pipeline /
   Expert:in). Cluster durch einen vertikalen Trenner abgesetzt, gleiche
   Hoehe. Auf Mobile brechen die Cluster in eigene Zeilen um. */
.ds-actionbar--grouped {
  /* flex-start statt stretch (BENT-2228, Re-Spec): stretch zog jeden Cluster
     auf die Hoehe des hoechsten (Pipeline mit den zweizeiligen Erklaer-Buttons),
     wodurch die einzeiligen Dokument-/Expert:in-Buttons mittig in einem zu
     hohen Cluster schwammen -- das war die „grosse Leerflaeche" aus Jans
     Sichtung. flex-start laesst jeden Cluster seine natuerliche Hoehe behalten. */
  align-items: flex-start;
  gap: 0.5rem 1rem;
  margin: 0.25rem 0 1rem;
}
/* Kein Button streckt sich ueber den Container: Inhaltsbreite, feste Groesse
   (BENT-2228, Re-Spec Punkt 2). Gilt auch fuer die zweizeiligen Erklaer-Buttons
   und fuer den Mobile-Umbruch weiter unten. */
.ds-actionbar--grouped .ds-btn { flex: 0 0 auto; }
/* ...und dasselbe fuer die WRAPPER (BENT-2875). Die Regel darueber trifft nur
   Elemente mit .ds-btn. Die direkten Kinder eines Clusters sind aber meist
   Wrapper ohne diese Klasse: ein <form> um einen Absende-Knopf, ein <details>
   fuer einen Aufklapper. Als Flex-Items ohne Begrenzung teilen die sich die
   volle Leistenbreite untereinander auf, der Knopf sitzt links im gedehnten
   Wrapper und rechts davon klafft Leere. Am gerenderten Element gemessen:
   ein <form> mit einem einzigen Knopf war 662 px breit, ein Aufklapper 405 px,
   und die drei Cluster wurden dadurch je 1336 px breit, also drei volle Zeilen
   statt einer Reihe. Genau das war Jans „Kraut und Rueben". */
.ds-actionbar--grouped .ds-actiongroup > * { flex: 0 0 auto; }
/* Gleiche Hoehe fuer ALLE Aktions-Buttons (BENT-2228, Jan-Reihenfolge-Runde):
   „kein Button ist wichtiger als der andere". Die Hoehe gaben bis BENT-2955 die
   zweizeiligen Erklaer-Buttons vor, die einzeiligen zogen per min-height nach.
   Seit die Erklaerungen im Hilfe-Icon sitzen, ist kein Knopf mehr zweizeilig:
   3,2 rem ist bei 15 px Grundschrift genau die natuerliche Hoehe eines
   einzeiligen Knopfes (48 px, am gerenderten Markup gemessen). Der Wert bleibt
   als Untergrenze stehen, damit ein kuenftig hoeherer Knopf die Reihe nicht
   wieder ungleich macht. */
.ds-actionbar--grouped .ds-btn { min-height: 3.2rem; }
.ds-actiongroup {
  display: flex; flex-wrap: wrap; align-items: center; gap: 0.5rem;
}
.ds-actiongroup + .ds-actiongroup {
  padding-left: 1rem;
  border-left: 1px solid var(--t-rule);
}

@media (max-width: 640px) {
  /* Mobile: Cluster untereinander, aber die Buttons bleiben auf Inhaltsbreite
     (flex-start statt stretch) -- keine containerbreiten Riesen-Buttons. */
  .ds-actionbar--grouped { flex-direction: column; align-items: flex-start; }
  .ds-actiongroup + .ds-actiongroup {
    padding-left: 0; border-left: 0;
    margin-top: 0.5rem; padding-top: 0.6rem;
    border-top: 1px solid var(--t-rule);
  }
}

/* --- E-Mail-Versand als Aufklapp-Element (BENT-1878) --- */
.ds-actiondrop { position: relative; }
.ds-actiondrop > summary {
  list-style: none; cursor: pointer; user-select: none;
}
.ds-actiondrop > summary::-webkit-details-marker { display: none; }
.ds-actiondrop > summary::marker { content: ""; }
.ds-actiondrop__panel {
  position: absolute; z-index: 40; right: 0; margin-top: 0.45rem;
  min-width: 20rem; max-width: min(24rem, 90vw);
  padding: 0.85rem;
  background: var(--t-card);
  border: 1px solid var(--t-rule);
  border-radius: 10px;
  box-shadow: 0 8px 24px rgba(15, 29, 34, 0.16);
}
.ds-actiondrop__panel .ds-input { width: 100%; margin: 0.25rem 0 0.6rem; }
.ds-actiondrop__panel .ds-label { display: block; }
@media (max-width: 640px) {
  /* Auf Mobile das Panel voll ausrichten statt rechtsbuendig ueberlaufen. */
  .ds-actiondrop { width: 100%; }
  .ds-actiondrop > summary { width: 100%; }
  .ds-actiondrop__panel { left: 0; right: 0; min-width: 0; max-width: none; }
}

/* --- Sekundaerer Submit-Button in der Aktionsleiste (BENT-2228) ---
   Die Pipeline-Aktionen der Aktionsleiste („Komplett neu analysieren",
   „Provenienz-Check ...") sind <button type="submit"> in einem <form>. tinte-base
   faerbt aber JEDEN <button type="submit"> teal (Grundsatz „genau EINE
   Primaeraktion pro Kontext"), es sei denn, er traegt eine der PICO-Rollenklassen
   .outline/.secondary/.btn-secondary/.btn-ghost/.danger-btn. Das KK-Button-System
   benennt seine Rollen jedoch .ds-btn--secondary/--ghost/--danger, die in jener
   :not()-Liste NICHT stehen -- ein sekundaerer Submit-Button rendert dadurch als
   gefuellter Primaerbutton. Genau das sah „wirr" aus (Jan, Freigabe-Runde: mehrere
   Buttons wirkten primaer). Diese KK-lokale Regel stellt die Sekundaer-Farbe im
   Aktionsleisten-Kontext wieder her; die vier :not() plus der `.ds-actionbar`-
   Kontext heben die Spezifitaet ueber die (0,6,1) der vendorten Regel, sodass die
   eine echte Primaeraktion (.ds-btn--primary via `primaer_aktion`) unberuehrt
   teal bleibt. Der Grundsatz-Fix (KK-Klassen in die tinte-Quelle aufnehmen)
   gehoert in die kanonische tinte-Quelle, nicht hierher. */
.ds-actionbar button[type="submit"].ds-btn--secondary:not(.ds-btn--primary):not(.ds-btn--danger):not(.ds-btn--success):not(.ds-btn--ghost) {
  background: var(--t-card);
  border-color: var(--t-rule);
  color: var(--t-ink);
}
.ds-actionbar button[type="submit"].ds-btn--secondary:not(.ds-btn--primary):not(.ds-btn--danger):not(.ds-btn--success):not(.ds-btn--ghost):hover {
  background: var(--t-card);
  border-color: var(--t-teal);
  color: var(--t-teal);
}

/* --- Rollenklassen schlagen die teal-Färbung von button[type="submit"]
   ÜBERALL, nicht nur in der Aktionsleiste (BENT-2238, Grundsatz-Fix) ---
   tinte-base färbt JEDEN <button type="submit"> teal, außer er trägt eine der
   PICO-Rollenklassen (.outline/.secondary/.btn-secondary/.btn-ghost/.danger-btn).
   Die KK-Rollen heißen aber .ds-btn--secondary/--ghost/--danger/--success und
   stehen NICHT in jener :not()-Liste, ein sekundärer, destruktiver oder
   tertiärer Submit-Button rendert dadurch fälschlich als gefüllter
   Primärbutton (Jans „gefühlt 100 Primär-Buttons"). BENT-2228 hat das nur für
   die .ds-actionbar geheilt; die Entscheidungs-Cluster (.ds-rowactions) und jedes
   sonstige Formular blieben außen vor. Hier der Grundsatz-Fix für ALLE Kontexte.
   Spezifität: die vendorte tinte-base-Regel trägt SECHS :not()-Klassen und
   kommt damit auf (0,7,1). Ein Selektor mit nur vier :not() läge bei (0,6,1)
   und verlöre, unabhängig von der Ladereihenfolge; genau daran ist die erste
   Fassung gescheitert und im Endauswahl-Cockpit wirkungslos geblieben
   (BENT-2874, am gerenderten Element gemessen). Das zusätzliche :not(.chip)
   gleicht die Rechnung aus und ist inhaltlich richtig, ein Chip ist kein
   Button. In der .ds-actionbar fiel es nicht auf, weil dort das
   Klassen-Präfix die Spezifität ohnehin anhebt. style.css lädt zuletzt
   (pico -> bavaria-theme -> tinte-base -> style.css) und gewinnt darum den
   Cascade. Die eine echte Primäraktion (.ds-btn--primary) ist per :not()
   ausgenommen und bleibt teal. Kanonisch gehört das in die tinte-Quelle (die
   KK-Rollen in deren :not()-Liste); bis dahin KK-lokal. Wird per
   tests/test_button_leitfaden.py bewacht. */
button[type="submit"].ds-btn--secondary:not(.ds-btn--primary):not(.ds-btn--danger):not(.ds-btn--success):not(.ds-btn--ghost):not(.chip) {
  background: var(--t-card); border-color: var(--t-rule); color: var(--t-ink);
}
button[type="submit"].ds-btn--secondary:not(.ds-btn--primary):not(.ds-btn--danger):not(.ds-btn--success):not(.ds-btn--ghost):not(.chip):hover {
  border-color: var(--t-teal); color: var(--t-teal);
}
button[type="submit"].ds-btn--ghost:not(.ds-btn--primary):not(.ds-btn--secondary):not(.ds-btn--danger):not(.ds-btn--success):not(.chip) {
  background: transparent; border-color: transparent; color: var(--t-teal);
}
button[type="submit"].ds-btn--ghost:not(.ds-btn--primary):not(.ds-btn--secondary):not(.ds-btn--danger):not(.ds-btn--success):not(.chip):hover {
  background: var(--t-teal-tint); color: var(--t-teal);
}
button[type="submit"].ds-btn--danger:not(.ds-btn--primary):not(.ds-btn--secondary):not(.ds-btn--success):not(.ds-btn--ghost):not(.chip) {
  background: var(--t-red); border-color: var(--t-red); color: #fff;
}
button[type="submit"].ds-btn--danger:not(.ds-btn--primary):not(.ds-btn--secondary):not(.ds-btn--success):not(.ds-btn--ghost):not(.chip):hover {
  filter: brightness(0.93); border-color: var(--t-red);
}
button[type="submit"].ds-btn--success:not(.ds-btn--primary):not(.ds-btn--secondary):not(.ds-btn--danger):not(.ds-btn--ghost):not(.chip) {
  background: var(--t-green); border-color: var(--t-green); color: #fff;
}
button[type="submit"].ds-btn--success:not(.ds-btn--primary):not(.ds-btn--secondary):not(.ds-btn--danger):not(.ds-btn--ghost):not(.chip):hover {
  filter: brightness(0.93); border-color: var(--t-green);
}

/* --- Aktionsspalte im Endauswahl-Cockpit (BENT-2135) ---
   Feste Slots statt springender Buttons. Die vier Entscheidungs-Buttons stehen
   in JEDER Zeile in derselben Reihenfolge (Auswaehlen, Reserve, Raus,
   Zuruecksetzen); der Button, der dem aktuellen Status entspricht, faellt nicht
   weg, sondern haelt seinen Platz als deaktivierter „aktuell"-Slot. Vorher
   wurde er schlicht nicht gerendert, dadurch rutschte der jeweils erste
   sichtbare Button je nach Zeilen-Status nach links und die Spalte wirkte
   regellos. Zwei Cluster: Entscheidung + „Mehr …"-Overflow. */
.ds-rowactions {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.4rem 0.75rem;
}
.ds-rowactions__cluster {
  display: flex;
  align-items: center;
  gap: 0.3rem;
  margin: 0;
}
/* „Raus" (destruktiv) und das nachfolgende „Zuruecksetzen" (korrigierend) sind
   vom positiven Entscheidungs-Cluster abgesetzt, damit ein Fehlklick direkt
   neben „Auswaehlen" unwahrscheinlicher wird. */
.ds-rowactions__trenner {
  margin-left: 0.35rem;
  border-left: 1px solid var(--t-rule);
  padding-left: 0.95rem;
}
/* Der Slot des aktuellen Status: haelt die Position, sieht aus wie ein Badge,
   ist bewusst KEIN Knopf. Er darf nicht wie ein gesperrter Knopf aussehen (das
   ist „Auswaehlen" bei offenem Provenienz-Flag), darum volle Deckkraft gegen
   das ausgegraute .ds-btn:disabled und eine gestrichelte Kante als Zustands-,
   nicht Aktions-Signal. */
.ds-btn.ds-btn--aktuell:disabled {
  opacity: 1;
  cursor: default;
  box-shadow: none;
  color: var(--kk-slot-schrift, var(--t-ink-soft));
  background: var(--kk-slot-flaeche, var(--t-surface-2, transparent));
  border: 1px dashed var(--kk-slot-kante, var(--t-rule));
}
/* Der geltende Zustand traegt die Farbe seines Abzeichens (BENT-3275).
   Anlass ist der Tool-Test der Redaktion (BENT-3267): In einer Reihe aus vier
   Knoepfen war das Auffaelligste die Aktion, die man NICHT gewaehlt hatte, weil
   „Raus" als destruktive Aktion dauerhaft rot war und der gewaehlte Zustand nur
   einen unauffaelligen Slot bekam. Seither faerbt die Farbe den Zustand, und
   „Raus" ist erst rot, wenn es der geltende Zustand ist.

   Die Modifier setzen NUR die drei Eigenschaften der Regel darueber; Form,
   Deckkraft und die gestrichelte Kante bleiben unangetastet, denn der Slot ist
   weiterhin ein Zustand und kein Angebot (Muster BENT-2135). Die Kante nimmt
   `currentColor` und folgt damit der Schriftfarbe, ohne sie ein zweites Mal zu
   nennen. Welcher Status welche Rolle bekommt, entscheidet
   `config.auswahl_status_slot_klasse`, abgeleitet aus der Abzeichen-Zuordnung.

   Alle FUENF Rollen stehen hier, auch wenn die Auswahl-Zuordnung derzeit nur
   vier davon vergibt: Ein Modifier ohne Regel im Stylesheet faellt still auf die
   Grundform zurueck (BENT-3022), ein spaeter auf `info` gesetzter Status waere
   sonst unbemerkt grau. */
.ds-btn--aktuell-success {
  --kk-slot-flaeche: var(--kk-rolle-success-flaeche);
  --kk-slot-schrift: var(--kk-rolle-success-schrift);
  --kk-slot-kante: currentColor;
}
.ds-btn--aktuell-warning {
  --kk-slot-flaeche: var(--kk-rolle-warning-flaeche);
  --kk-slot-schrift: var(--kk-rolle-warning-schrift);
  --kk-slot-kante: currentColor;
}
.ds-btn--aktuell-danger {
  --kk-slot-flaeche: var(--kk-rolle-danger-flaeche);
  --kk-slot-schrift: var(--kk-rolle-danger-schrift);
  --kk-slot-kante: currentColor;
}
.ds-btn--aktuell-info {
  --kk-slot-flaeche: var(--kk-rolle-info-flaeche);
  --kk-slot-schrift: var(--kk-rolle-info-schrift);
  --kk-slot-kante: currentColor;
}
.ds-btn--aktuell-neutral {
  --kk-slot-flaeche: var(--kk-rolle-neutral-flaeche);
  --kk-slot-schrift: var(--kk-rolle-neutral-schrift);
  --kk-slot-kante: currentColor;
}
/* Zeilen-Variante des Aufklappers: in der Tabelle kann das Panel nicht
   schweben. Der .ds-table-wrapper traegt overflow-x: auto und ist damit ein
   Clipping-Kontext; ein position:absolute-Panel wuerde beschnitten bzw. erzeugte
   Scrollbalken. Das Panel steht hier darum IM FLUSS, die Zeile waechst beim
   Aufklappen. Gleiche Komponente, nur ohne Popover-Positionierung. */
/* Das <details> selbst ist in der Basis-Variante ein Flex-Container (der
   Aufklapper der Aktionsleiste steht dort in einer Reihe). In der Zeilen-
   Variante macht genau das den Knopf und sein Panel zu zwei Flex-Geschwistern
   NEBENEINANDER: Das Panel steht dann rechts vom „Mehr …" statt darunter und
   schiebt sich aus der Spalte (BENT-2874, am gerenderten Element gemessen:
   Knopf bei x=1186, Panel bei x=1279, gleiche Zeile). Als Block stapeln beide
   wieder normal, und `position: static` unten wirkt endlich so, wie es
   gemeint war. */
.ds-actiondrop--row {
  display: block;
}
.ds-actiondrop--row .ds-actiondrop__panel {
  position: static;
  margin-top: 0.5rem;
  min-width: 0;
  max-width: none;
  box-shadow: none;
}
/* Trennlinie zwischen zwei fachlich verschiedenen Anliegen IM Panel (BENT-2136):
   Stammdaten-Korrektur („Umsortieren") und Weiterleitung an eine Fachperson
   („An Expert:in") sassen ohne jeden Trenner untereinander. BENT-2135 hat die
   beiden bereits aus der Zeile ins Overflow geholt, die Linie zieht die Grenze
   jetzt auch innerhalb des Panels. */
.ds-actiondrop__trenner {
  margin-top: 0.7rem;
  padding-top: 0.7rem;
  border-top: 1px solid var(--t-rule);
}

/* --- Einheitliche Eignungs-Votum-Darstellung (BENT-1879) ---
   Sterne als reine Text-Glyphen (kein Icon-Font): erben ueber die Tokens die
   Farbe und sind dadurch dark-mode-fest. Wort + (n/5) daneben. */
.ds-votum {
  display: inline-flex; align-items: baseline; gap: 0.35rem;
  white-space: nowrap;
}
.ds-votum__sterne {
  color: var(--t-amber);
  letter-spacing: 0.06em;
  font-size: 0.95em;
}
.ds-votum__wort { font-weight: 600; }
.ds-votum__wert { color: var(--t-muted); font-variant-numeric: tabular-nums; }
.ds-votum--klein { gap: 0.25rem; font-size: 0.9em; }
.ds-votum--klein .ds-votum__sterne { font-size: 0.85em; }

.ds-votum-legende { margin-top: 0.35rem; }
.ds-votum-legende > summary {
  cursor: pointer; color: var(--t-teal); font-size: 0.9rem; width: fit-content;
}
.ds-votum-skala {
  list-style: none; margin: 0.35rem 0 0; padding: 0;
  display: flex; flex-direction: column; gap: 0.25rem;
}
.ds-votum-uebernahme__zeile {
  margin: 0 0 0.6rem;
  display: flex; flex-wrap: wrap; gap: 0.35rem 0.75rem; align-items: center;
}

/* ========================================
   Nachbarnavigation der Objektansicht (BENT-2351)
   Vorheriges/nächstes Objekt derselben Liste plus Positionsanzeige und
   Rücksprung zur Liste. Die Ränder der Liste bleiben als inaktiver
   Platzhalter stehen, damit die Knöpfe beim Durchblättern nicht springen.
   Nur Tokens, damit Light und Dark ohne Sonderregel tragen.
   ======================================== */
.ds-objektnav {
  margin: 0.5rem 0 0.25rem;
  display: flex;
  flex-wrap: wrap;
  gap: 0.5rem 0.75rem;
  align-items: center;
}
.ds-objektnav__pos {
  flex: 1 1 12rem;
  display: flex;
  flex-wrap: wrap;
  gap: 0.15rem 0.6rem;
  align-items: baseline;
  justify-content: center;
  text-align: center;
  font-size: 0.9rem;
}
/* Rand der Liste: kein Sprungziel, aber der Platz bleibt belegt. Bewusst
   kein `:disabled`-Look (das ist ein <span>, kein Button), sondern schlicht
   gedämpft. */
.ds-objektnav__rand {
  opacity: 0.45;
  cursor: default;
  pointer-events: none;
}

/* ========================================
   Objektbericht-Kopf: Objekt + Bewertung zuerst (BENT-2228)
   Seitenkopf mit Thumbnail/Bezeichnung/Themengebiet, kompakter Status-Zeile
   und schmaler Stationen-Leiste. Nur Tokens, damit Light und Dark ohne
   Sonderregel tragen.
   ======================================== */
.ds-objektkopf { margin-top: 1.25rem; }
.ds-objektkopf__haupt {
  display: flex;
  gap: 1rem;
  align-items: flex-start;
  flex-wrap: wrap;
}
.ds-objektkopf__thumb {
  flex: 0 0 auto;
  display: block;
  width: 96px;
  height: 96px;
  border-radius: 8px;
  overflow: hidden;
  border: 1px solid var(--t-rule);
}
.ds-objektkopf__thumb img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}
/* Titelbild samt Vermerk über die weiteren Aufnahmen (BENT-3279). Der Zähler
   steht unter dem Bild und ist selbst der Einstieg in die Galerie. */
.ds-objektkopf__bild { flex: 0 0 auto; display: flex; flex-direction: column; gap: 0.3rem; }
.ds-objektkopf__zaehler {
  font-size: 0.8rem; text-align: center; text-decoration: none;
  color: var(--t-muted); cursor: zoom-in;
}
.ds-objektkopf__zaehler:hover,
.ds-objektkopf__zaehler:focus-visible { color: var(--t-ink); text-decoration: underline; }

/* Platzhalter, der zugleich der Upload ist (BENT-3279): im Objektkopf ohne
   Foto und im Tresor ohne Personenfoto. Geschlossen ist er eine Fläche in
   Thumbnail-Größe, geöffnet steht das Formular darunter; ohne Skript, ein
   <details> genügt. */
.ds-kopfupload { flex: 0 0 auto; }
.ds-kopfupload__flaeche {
  /* Bewusst `display: block` und NICHT flex: Ein Flex-Container macht aus dem
     Aufklapp-Zeichen ein eigenes Flex-Element, das dann sichtbar unter dem Text
     steht (headless gemessen). Als Block-Element zeigt Chrome es gar nicht. */
  display: block; width: 96px; min-height: 96px; padding: 0.6rem 0.4rem;
  border: 1px dashed var(--t-rule); border-radius: 8px;
  font-size: 0.72rem; line-height: 1.2; text-align: center;
  color: var(--t-muted); cursor: pointer; list-style: none;
}
.ds-kopfupload__flaeche > span { display: block; }
/* Das Aufklapp-Zeichen wegnehmen. Es kommt NICHT vom Listen-Marker (der ist
   hier leer, headless nachgemessen), sondern aus Pico: `details summary::after`
   setzt ein Chevron als Hintergrundbild. Ohne diese Zeile steht es quer in der
   96 px schmalen Flaeche. */
.ds-kopfupload__flaeche::-webkit-details-marker { display: none; }
.ds-kopfupload__flaeche::after { display: none; }
.ds-kopfupload__flaeche:hover { border-color: var(--t-teal); color: var(--t-ink); }
.ds-kopfupload__zeichen { font-size: 1.3rem; line-height: 1; }
.ds-kopfupload__form {
  display: flex; flex-direction: column; gap: 0.4rem;
  margin-top: 0.5rem; max-width: 22rem;
}
.ds-kopfupload__form .ds-hint { margin: 0; }

/* Was mit einem einzelnen Foto passieren kann: verschieben, löschen
   (BENT-3279). Steht unter der Bildunterschrift und bricht auf schmalen
   Fenstern um, statt die Bildspalte aufzuspannen. */
.ds-fotoaktion {
  display: flex; flex-wrap: wrap; gap: 0.35rem; align-items: center;
  margin-top: 0.4rem;
}
.ds-fotoaktion form { display: flex; flex-wrap: wrap; gap: 0.35rem; align-items: center; margin: 0; }
.ds-fotoaktion .ds-select { min-width: 9rem; }

/* Themengebiet aus dem Bericht ändern (BENT-3280). Geschlossen nur ein
   Ghost-Knopf unter der Kopfzeile, geöffnet Menü plus Speichern; ohne Skript,
   ein <details> genügt. Das Chevron kommt wie beim Kopf-Upload aus Pico
   (`details summary::after`) und wird weggenommen, damit der Knopf wie ein
   Knopf aussieht. */
.ds-themenwechsel { margin-top: 0.5rem; }
.ds-themenwechsel > summary { display: inline-block; list-style: none; cursor: pointer; }
.ds-themenwechsel > summary::-webkit-details-marker { display: none; }
.ds-themenwechsel > summary::after { display: none; }
.ds-themenwechsel__form {
  display: flex; flex-wrap: wrap; gap: 0.5rem; align-items: center;
  margin-top: 0.6rem; max-width: 34rem;
}
.ds-themenwechsel__form .ds-label { margin: 0; }
.ds-themenwechsel__form .ds-select { min-width: 14rem; }
.ds-themenwechsel__form .ds-hint { flex: 1 1 100%; margin: 0; }

.ds-objektkopf__text { flex: 1 1 16rem; min-width: 0; }
/* Objektbezeichnung ist Fliesstext, nicht das globale h1-h3-Uppercase (Tinte,
   tinte_uppercase_exception): tool-lokal zuruecknehmen. */
.ds-objektkopf__titel {
  text-transform: none;
  margin: 0 0 0.4rem;
  font-size: 1.35rem;
  line-height: 1.25;
}
.ds-objektkopf__meta {
  margin: 0;
  display: flex;
  flex-wrap: wrap;
  gap: 0.4rem;
  align-items: center;
}

/* Kompakte Status-Zeile: Score (+ Votum-Chip), Auswahl, Station, Provenienz. */
.ds-statuszeile {
  margin-top: 1rem;
  padding-top: 0.85rem;
  border-top: 1px solid var(--t-rule);
  display: flex;
  flex-wrap: wrap;
  gap: 0.6rem 1.5rem;
  align-items: center;
}
.ds-statuszeile__item {
  display: inline-flex;
  align-items: center;
  gap: 0.4rem;
}
.ds-statuszeile__label {
  font-size: 0.75rem;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.03em;
  color: var(--t-ink-soft);
}
.ds-statuszeile__score { font-size: 1.15rem; line-height: 1; }
/* Kurzform-Detailtext neben einem Status-Badge (BENT-2230), z. B. die
   Provenienz-Prüfspur „geprüft am X, N offene / M geklärte Flags". */
.ds-statuszeile__detail {
  font-size: 0.8rem;
  color: var(--t-ink-soft);
}

/* Stationen-Leiste: schmale Prozess-Orientierung (erledigt/offen). */
.ds-stationen {
  list-style: none;
  margin: 1rem 0 0;
  padding: 0.75rem 0 0;
  border-top: 1px solid var(--t-rule);
  display: flex;
  flex-wrap: wrap;
  gap: 0.4rem 1.1rem;
}
.ds-station {
  display: inline-flex;
  align-items: center;
  gap: 0.35rem;
  font-size: 0.82rem;
  color: var(--t-ink-soft);
}
.ds-station__mark {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 1.2rem;
  height: 1.2rem;
  border-radius: 999px;
  font-size: 0.72rem;
  border: 1px solid var(--t-rule);
}
.ds-station--erledigt { color: var(--t-ink); font-weight: 500; }
.ds-station--erledigt .ds-station__mark {
  background: var(--t-green-tint);
  color: var(--t-green);
  border-color: transparent;
}
:root[data-theme="dark"] .ds-station--erledigt .ds-station__mark {
  background: rgba(46, 125, 50, 0.22);
  color: #7fd487;
}

/* Knopf plus Hilfe-Icon als EIN Element der Reihe (BENT-2955).
   Hier stand bis BENT-2955 die Sonderform .ds-btn--erklaert: ein zweizeiliger
   Knopf mit Wirkungs-Unterzeile (BENT-2228/BENT-2053). Am gerenderten Markup
   gemessen war er dadurch 62 bzw. 75 px hoch neben 48 px seiner Nachbarn und
   285 px breit; in EINER Reihe standen drei verschiedene Hoehen. Die Erklaerung
   sitzt jetzt in der Hilfe-Komponente des Themes (.ds-help, BENT-1249) NEBEN
   dem Knopf, nicht darin: ein <span tabindex="0"> darf nicht in einen <button>,
   und der Knopf bleibt so einzeilig wie jeder andere.
   Der Wrapper haelt beide zusammen, damit sie beim Umbruch nicht auseinander
   fallen; .ds-actiongroup > * (oben) gibt ihm die Inhaltsbreite. */
.ds-actionitem {
  display: inline-flex;
  align-items: center;
  gap: 0.1rem;
}

/* Zustandszeile UNTER der Aktionsleiste (BENT-2955).
   Der Ruecklauf-Zustand stand als Badge am Ende der Knopfreihe und sah dort wie
   ein deaktivierter vierter Knopf aus. Er steht jetzt in einer eigenen Zeile
   darunter: klein, in Fliesstext-Farbe und mit Beschriftung, damit er als
   Angabe und nicht als Bedienelement gelesen wird. */
.ds-leistenstatus {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.45rem;
  margin: -0.6rem 0 1rem;
  font-size: 0.82rem;
  color: var(--t-ink-soft);
}
/* Gleiche Beschriftungs-Optik wie die Status-Zeile im Seitenkopf: dieselbe
   Art Angabe soll auch gleich aussehen. */
.ds-leistenstatus__label {
  font-size: 0.75rem;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.03em;
  color: var(--t-ink-soft);
}

/* „Was möchtest du tun?" (BENT-3277).
   Die weiterführenden Wege stehen gebündelt am Ende des Objektberichts, in
   einer eigenen Karte. Innerhalb der Karte trägt die Knopfreihe (.ds-actionbar)
   ihre eigenen Abstände; sie darf hier oben keinen zweiten Aussenabstand
   aufsetzen, sonst klafft eine Lücke zwischen Überschrift und Knöpfen. */
.ds-handeln .ds-actionbar { margin-top: 0.4rem; }
/* Die beiden Bearbeiten-Aufklapper sind eine andere Art Handlung als die
   Knopfreihe darüber (sie ändern das Objekt, statt einen Weg zu öffnen) und
   bekommen darum eine Trennlinie statt nur eines Abstands. */
.ds-handeln__bearbeiten {
  margin-top: 1.1rem;
  padding-top: 0.9rem;
  border-top: 1px solid var(--t-rule);
}
.ds-handeln__bearbeiten > details + details { margin-top: 0.75rem; }

/* Sprungmarken landen unter der fixierten Kopfleiste, nicht dahinter
   (BENT-3277, Befund der Redaktion aus BENT-3267: „Wenn ich auf Zur
   Provenienz-Sichtung klicke, schiebt es zu weit runter").
   Ein Anker-Sprung stellt das Ziel an den oberen Rand des Fensters; die
   Kopfleiste ist aber `position: sticky` und liegt darüber, das angesprungene
   Kapitel steht also verdeckt. `scroll-margin-top` hält denselben Abstand frei,
   den der Toast-Stapel schon nutzt: die gemessene Kopfhöhe aus --kk-header-h
   (gesetzt von static/js/flash-toasts.js), mit Fallback für den Fall ohne JS.
   Bewusst für JEDE Sprungmarke im Seiteninhalt statt für eine Liste einzelner
   Kennungen: Der Fehler gilt für alle gleich, und eine Liste ginge beim
   nächsten neuen Anker still wieder auf. */
.ds-page__inner [id] {
  scroll-margin-top: calc(var(--kk-header-h, 116px) + 1rem);
}

/* Mitlaufendes Sprungmenü des Objektberichts (BENT-3278).
   Die Seite ist lang geworden, seit die Aktionen ans Ende gewandert sind
   (BENT-3277); die Leiste bringt den schnellen Zugriff zurück, den die
   Aktionsleiste oben bot. Sie steht im Markup am Ende des Inhalts (dort erst
   kennt die Vorlage ihre Einträge) und wird hier an den linken Rand gestellt.

   Warum `fixed` und nicht `sticky`: Ein klebendes Element bleibt nur innerhalb
   seines Elternteils stehen, und das ist hier die gesamte Seite -- ein Element
   am Ende des Inhalts klebte also erst am Seitenende. Der linke Rand wird über
   dieselbe Rechnung gefunden, die die Seite selbst benutzt (mittig, höchstens
   1400px breit, 32px Innenabstand aus .page-main), damit die Leiste bündig zum
   Inhalt steht statt am Fensterrand zu kleben.

   Auf schmalen Fenstern verschwindet die Leiste ganz, statt den Inhalt zu
   quetschen (Ticket-Vorgabe): unter der Schwelle bliebe für die Spalte kein
   Platz, ohne dem Bericht Breite zu nehmen. Im Ausdruck ist sie über .no-print
   ohnehin weg. */
:root { --kk-sprungmenue-w: 14.5rem; }

.ds-sprungmenue { display: none; }

@media (min-width: 1200px) {
  /* Der Inhalt rückt um die Spaltenbreite ein, damit die Leiste nicht über dem
     Bericht liegt. Die Einrückung hängt an der Bericht-Seite, nicht an
     .ds-page__inner: die Klasse tragen alle Seiten des Werkzeugs. */
  .ds-berichtseite { padding-left: calc(var(--kk-sprungmenue-w) + 2rem); }

  .ds-sprungmenue {
    display: block;
    position: fixed;
    left: calc(max(0px, (100vw - 1400px) / 2) + 32px);
    /* Die Leiste beginnt auf Höhe des ersten Inhaltsblocks statt bündig unter
       der Kopfleiste (Jans Sichtprobe 12.08.2026): Seitentitel und
       Nachbar-Leiste stehen darüber, und eine Leiste, die schon daneben
       anfängt, liest sich als Teil der Navigation statt als Begleiter des
       Berichts. Anker sind Titel und Nachbar-Leiste, nicht die erste Karte:
       Die steht je nach Warnhinweisen verschieden tief, ein fester Wert kann
       nur den Normalfall treffen, und das ist hier richtig.

       Der Versatz steht als EINE Größe, weil top und die Höhenbegrenzung ihn
       beide brauchen: Wird nur top erhöht, rechnet die Begrenzung weiter ab
       der Kopfleiste und die Leiste läuft unten aus dem Bild. */
    --kk-sprungmenue-versatz: 6.6rem;
    top: calc(var(--kk-header-h, 116px) + var(--kk-sprungmenue-versatz));
    width: var(--kk-sprungmenue-w);
    max-height: calc(
      100vh - var(--kk-header-h, 116px) - var(--kk-sprungmenue-versatz) - 1.5rem
    );
    overflow-y: auto;
    /* Unter der Kopfleiste (20) und weit unter Toasts (900) und Lightbox
       (1000): die Leiste ist Navigations-Chrome, keine Meldung. */
    z-index: 10;
    padding-right: 0.4rem;
  }
}

.ds-sprungmenue__titel {
  margin: 0 0 0.5rem;
  font-size: 0.78rem;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--t-muted);
}

/* Untereinander, nicht nebeneinander: Pico legt Listen INNERHALB eines <nav>
   in eine Reihe (`nav ol { display: flex }`, `nav li { display: inline-block }`)
   und würde die Abschnitte sonst über mehrere Zeilen verteilen. Die Leiste ist
   aber eine Spalte; das steht hier ausdrücklich, statt sich auf den Standard
   eines Listenelements zu verlassen. */
.ds-sprungmenue__liste {
  display: block;
  list-style: none;
  margin: 0;
  padding: 0;
  border-left: 2px solid var(--t-rule);
}

.ds-sprungmenue__liste > li {
  display: list-item;
  margin: 0;
  padding: 0;
}

.ds-sprungmenue__link {
  display: block;
  padding: 0.34rem 0.6rem;
  margin-left: -2px;
  border-left: 2px solid transparent;
  color: var(--t-ink-soft);
  text-decoration: none;
  font-size: 0.92rem;
  line-height: 1.35;
  transition: color .12s ease, border-color .12s ease;
}

.ds-sprungmenue__link:hover,
.ds-sprungmenue__link:focus-visible {
  color: var(--t-ink);
  border-left-color: var(--t-rule);
}

/* Der gerade gelesene Abschnitt. Die Farbe trägt die Aussage nicht allein: die
   kräftigere Schrift und die Farbkante links markieren ihn mit. */
.ds-sprungmenue__link.is-aktiv {
  color: var(--t-teal);
  border-left-color: var(--t-teal);
  font-weight: 600;
}

.ds-sprungmenue__zurueck {
  margin-top: 0.9rem;
  padding-top: 0.7rem;
  border-top: 1px solid var(--t-rule);
}

.ds-sprungmenue__rueckweg { padding-left: 0; margin-left: 0; border-left: 0; }

.ds-sprungmenue__pos {
  margin: 0.1rem 0 0.35rem;
  font-size: 0.8rem;
  color: var(--t-muted);
}

.ds-sprungmenue__nachbarn {
  display: flex;
  justify-content: space-between;
  gap: 0.5rem;
  margin: 0;
  font-size: 0.82rem;
}

.ds-sprungmenue__nachbarn a { color: var(--t-ink-soft); text-decoration: none; }
.ds-sprungmenue__nachbarn a:hover { color: var(--t-ink); }

/* Rand der Liste: gedämpfter Platzhalter statt eines fehlenden Knopfes, damit
   die beiden Wege nicht springen (Muster der Leiste über dem Titel). */
.ds-sprungmenue__rand { color: var(--t-faint); }

@media (max-width: 640px) {
  .ds-objektkopf__thumb { width: 72px; height: 72px; }
  .ds-statuszeile { gap: 0.5rem 1rem; }
}

/* --- Stichproben-Übersicht: zweispaltig, aber die Tabelle bestimmt die Breite
   (BENT-3037) ---
   Zweispaltig ist der Grundsatz (Stichwort ui grundsaetze), links steht hier
   aber eine Tabelle und rechts nur ein kurzes Formular. Mit den Vorgaben des
   Design-Systems (`.split-layout` deckelt auf 1040px, die rechte Spalte nimmt
   1fr) blieben der Tabelle 390px, und sie war auf JEDER Schirmbreite nur im
   waagerechten Scroll lesbar -- die Falle aus BENT-2564, die ein Screenshot
   nicht zeigt und erst die Messung findet (`scrollWidth` gegen `clientWidth`
   am Tabellen-Rahmen). Deshalb: kein Deckel, und die rechte Spalte bekommt eine
   Obergrenze, statt mit der linken zu wachsen. Gemessen bei 1440px: Rahmen
   1.336px, Tabelle passt hinein. */
.ds-stichprobe .split-layout {
  max-width: none;
  grid-template-columns: minmax(0, 1fr) minmax(18rem, 21rem);
}
/* Der Umbruch auf eine Spalte kommt aus tinte-base; diese Datei lädt später
   und mit höherer Spezifität, er muss hier also mitgezogen werden. */
@media (max-width: 768px) {
  .ds-stichprobe .split-layout { grid-template-columns: 1fr; }
}
/* Der Befund ist ein Satz, keine Spaltenangabe: Ohne Obergrenze zöge er die
   ganze Tabelle in die Breite (der Rahmen setzt `flex: 1 0 auto`, die Tabelle
   schrumpft also nie unter ihre Inhaltsbreite). */
.ds-stichprobe-befund { max-width: 30rem; }

@media print {
  /* Interaktive Chrome und markierte Elemente aus dem Ausdruck nehmen. */
  .ds-header, .ds-footer, .ds-theme-toggle, .ds-subtabs, .no-print { display: none !important; }
  /* Frage-Antwort-Paare (BENT-2046): Struktur bleibt, die Farbkante tritt zurück. */
  .ds-qa > dt, .ds-qa > dd { border-left-color: var(--t-rule); }
  .ds-qa { break-inside: avoid; }
  /* Volle Breite, keine Seitenränder-Verdopplung, weißer Grund. */
  body { background: #fff !important; }
  .ds-page, .ds-page__inner { max-width: none !important; padding: 0 !important; margin: 0 !important; }
  /* Karten ruhig und nicht über Seitenumbrüche zerreißen. */
  .ds-card {
    break-inside: avoid; box-shadow: none !important;
    border: 1px solid #ccc !important; margin-top: 1rem !important;
  }
  a[href] { color: inherit; text-decoration: none; }
  /* Scroll-Schatten sind eine reine Bildschirm-Affordance (BENT-1883). */
  .tab-nav::before, .tab-nav::after,
  .ds-table-wrapper::before, .ds-table-wrapper::after { display: none !important; }
}

/* --- Lightbox: Fotos im Overlay statt neuem Tab (BENT-1477) --- */
.js-lightbox { cursor: zoom-in; }
.ds-lightbox {
  position: fixed; inset: 0; z-index: 1000;
  display: flex; align-items: center; justify-content: center;
  padding: 2rem; cursor: zoom-out;
  background: rgba(15, 29, 34, 0.86);
}
.ds-lightbox[hidden] { display: none; }
.ds-lightbox__img {
  max-width: 92vw; max-height: 88vh; width: auto; height: auto;
  border-radius: var(--be-radius); background: var(--t-card);
  box-shadow: 0 10px 44px rgba(0, 0, 0, 0.55); cursor: default;
}
.ds-lightbox__close {
  position: absolute; top: 1rem; right: 1.25rem;
  width: 2.4rem; height: 2.4rem; border-radius: 50%; padding: 0;
  border: none; cursor: pointer; line-height: 1; font-size: 1.7rem;
  background: rgba(255, 255, 255, 0.16); color: #fff;
}
.ds-lightbox__close:hover,
.ds-lightbox__close:focus-visible { background: rgba(255, 255, 255, 0.3); }
/* Blätter-Leiste der Galerie (BENT-3279). Sie erscheint nur, wenn die Reihe
   mehr als ein Bild trägt; ein Einzelbild sieht damit unverändert aus. */
.ds-lightbox__nav {
  position: absolute; bottom: 1.25rem; left: 50%; transform: translateX(-50%);
  display: flex; align-items: center; gap: 0.75rem;
  padding: 0.35rem 0.6rem; border-radius: 999px; cursor: default;
  background: rgba(255, 255, 255, 0.16); color: #fff;
}
.ds-lightbox__nav[hidden] { display: none; }
.ds-lightbox__pfeil {
  width: 2.2rem; height: 2.2rem; border-radius: 50%; padding: 0;
  border: none; cursor: pointer; line-height: 1; font-size: 1.2rem;
  background: rgba(255, 255, 255, 0.2); color: #fff;
}
.ds-lightbox__pfeil:hover,
.ds-lightbox__pfeil:focus-visible { background: rgba(255, 255, 255, 0.36); }
.ds-lightbox__zaehler { font-size: 0.85rem; white-space: nowrap; }
/* Seiten-Scroll sperren, solange die Lightbox offen ist. */
body.ds-lightbox-open { overflow: hidden; }

/* Globale Suche: Treffer-Ausschnitt (snippet) + Fundort-Angabe (BENT-1870). */
.suche-snippet { margin-top: 0.25rem; line-height: 1.4; }
.suche-snippet mark {
  background: var(--be-accent-soft, rgba(255, 214, 0, 0.35));
  color: inherit; padding: 0 0.1em; border-radius: 3px;
}
.suche-fundort { margin-top: 0.2rem; font-style: italic; opacity: 0.85; }

/* ------------------------------------------------------------------ */
/* Inline-Edit der Merkmale + versionierte Story (BENT-1869).          */
/* Auto-Save: der Herkunfts-Chip ist die Speichern-Aktion.             */
/* ------------------------------------------------------------------ */
.ds-editable {
  cursor: text;
  border-bottom: 1px dashed var(--t-rule);
  padding: 0.05rem 0.15rem;
  border-radius: 3px;
  transition: background 0.12s ease;
  /* Defensiver Reset gegen die Button-Basisregeln des Themes (BENT-1887): die
     Elemente tragen kein role="button" mehr, doch dieser Reset haelt die
     Editierbarkeits-Affordance auch gegen kuenftige Theme-Drift ruhig -
     normaler linksbuendiger Text statt Teal-Fill mit weisser, zentrierter Schrift. */
  background: none;
  color: inherit;
  text-align: left;
  font: inherit;
}
.ds-editable:hover,
.ds-editable:focus-visible {
  background: var(--t-teal-soft, rgba(0, 128, 128, 0.12));
  outline: none;
}
.ds-editable.ds-editing {
  display: block;
  cursor: default;
  border-bottom: none;
  background: none;
  padding: 0;
}

.ds-inline-editor {
  display: flex;
  flex-wrap: wrap;
  gap: 0.4rem 0.5rem;
  align-items: center;
  padding: 0.5rem;
  border: 1px solid var(--t-teal);
  border-radius: 6px;
  background: var(--t-card);
}
.ds-inline-editor__input { flex: 1 1 14rem; min-width: 10rem; }
.ds-inline-editor__chips,
.ds-inline-editor__extra {
  display: flex;
  flex-wrap: wrap;
  gap: 0.35rem;
  flex-basis: 100%;
}
.ds-inline-editor__extra .ds-input { flex: 1 1 12rem; }
.ds-inline-editor__hint,
.ds-inline-feedback {
  flex-basis: 100%;
  font-size: 0.8rem;
  color: var(--t-muted);
}
.ds-inline-feedback--err { color: var(--t-danger, #b3261e); }
.ds-inline-feedback--hint { color: var(--t-teal-dark); }
.ds-inline-feedback--ok { color: var(--t-success, #1a7f37); }

/* Markierung einer Abweichung vom gespeicherten Stand (BENT-2958).
   Sie steht neben der Speicher-Aufforderung und traegt ihre Aussage im Text,
   nicht in der Farbe allein (Druck, Sehschwaeche); der Punkt davor ist
   Verstaerkung. Der Rahmen am Feld ist das zweite, ruhigere Signal fuer den
   Story-Editor, wo die Fusszeile beim langen Text ausserhalb des Blicks
   liegen kann. */
.ds-ungespeichert {
  font-size: 0.8rem;
  font-weight: 600;
  color: var(--t-amber);
  white-space: nowrap;
}
.ds-ungespeichert::before {
  content: "●";
  margin-right: 0.3rem;
  font-size: 0.7em;
  vertical-align: 0.1em;
}
.ds-feld-ungespeichert {
  border-color: var(--t-amber);
  box-shadow: 0 0 0 2px var(--t-amber-tint);
}

/* Herkunfts-Chip: kompakter Toggle-Button, klar antippbar. */
.ds-chip {
  font: inherit;
  font-size: 0.82rem;
  line-height: 1.2;
  padding: 0.28rem 0.6rem;
  border: 1px solid var(--t-teal);
  border-radius: 999px;
  background: var(--t-bg);
  color: var(--t-teal-dark);
  cursor: pointer;
  transition: background 0.12s ease, color 0.12s ease;
}
.ds-chip:hover,
.ds-chip:focus-visible {
  background: var(--t-teal);
  color: #fff;
  outline: none;
}

/* Themengebiete-Auswahl als Toggle-Chips (BENT-1871): Checkbox mit Chip-Optik,
   aktiv = gefuellt in Primaerfarbe, kein JS noetig (:has(:checked)). */
.ds-chip-group {
  display: flex;
  flex-wrap: wrap;
  gap: 0.45rem;
  margin-top: 0.35rem;
}
.ds-chip-toggle {
  position: relative;
  display: inline-flex;
  align-items: center;
  cursor: pointer;
}
/* Checkbox visuell verstecken, aber fokussierbar/screenreaderbar lassen. */
.ds-chip-toggle input {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: 0;
  padding: 0;
  border: 0;
  clip: rect(0 0 0 0);
  clip-path: inset(50%);
  overflow: hidden;
  white-space: nowrap;
}
.ds-chip-toggle > span {
  font-size: 0.85rem;
  line-height: 1.2;
  padding: 0.32rem 0.7rem;
  border: 1px solid var(--t-teal);
  border-radius: 999px;
  background: var(--t-bg);
  color: var(--t-teal-dark);
  transition: background 0.12s ease, color 0.12s ease;
}
.ds-chip-toggle:hover > span {
  background: color-mix(in srgb, var(--t-teal) 12%, var(--t-bg));
}
.ds-chip-toggle:has(input:checked) > span {
  background: var(--t-teal);
  border-color: var(--t-teal);
  color: #fff;
}
.ds-chip-toggle:has(input:focus-visible) > span {
  outline: 2px solid var(--t-teal-dark);
  outline-offset: 2px;
}

/* Drehtage-Picker (BENT-1871): eine Zeile je Drehtag, natives Date-Feld
   plus Entfernen-Knopf; Add-Button haengt neue Zeilen an (drehtage-picker.js). */
.ds-drehtage-rows {
  display: flex;
  flex-direction: column;
  gap: 0.4rem;
  margin-bottom: 0.5rem;
}
.ds-drehtag-row {
  display: flex;
  align-items: center;
  gap: 0.4rem;
}
.ds-drehtag-input {
  max-width: 220px;
}

.ds-saved-flash {
  display: inline-block;
  margin-left: 0.4rem;
  font-size: 0.8rem;
  color: var(--t-success, #1a7f37);
  animation: ds-fadeout 2.6s ease forwards;
}
@keyframes ds-fadeout {
  0%, 70% { opacity: 1; }
  100% { opacity: 0; }
}

/* --- Historien-Bedienelement (BENT-2963) ---
   EINE Form für alle Historien: Uhr-Icon mit Zähler, Panel im Fluss. Der
   Zähler ist der Teil, der vorher fehlte; ohne ihn sieht man dem Icon nicht
   an, ob sich das Öffnen lohnt. Ein schwebendes Panel gibt es nicht mehr, es
   verdeckte genau den Text, mit dem man die Version vergleichen will. */
.ds-historie-icon {
  display: inline-flex;
  align-items: center;
  gap: 0.15rem;
  font: inherit;
  font-size: 0.85rem;
  line-height: 1;
  padding: 0.1rem 0.25rem;
  margin-left: 0.3rem;
  border: none;
  background: none;
  cursor: pointer;
  opacity: 0.65;
}
.ds-historie-icon:hover,
.ds-historie-icon:focus-visible,
.ds-historie-icon[aria-expanded="true"] { opacity: 1; }
.ds-historie-icon__zahl {
  font-size: 0.78rem;
  font-variant-numeric: tabular-nums;
  color: var(--t-muted);
}

.ds-historie-panel {
  margin-top: 0.6rem;
  padding: 0.6rem 0.8rem;
  max-width: 44rem;
  border: 1px solid var(--t-rule);
  border-radius: 6px;
  background: var(--t-card);
}
.ds-historie-liste { list-style: none; margin: 0.4rem 0; padding: 0; }
.ds-historie-liste li {
  padding: 0.35rem 0;
  border-bottom: 1px solid var(--t-rule);
}
.ds-historie-liste li:last-child { border-bottom: none; }
/* Bewusst OHNE font-weight (BENT-2957). Vorher stand hier `font-weight: 600`
 * und damit war JEDER Eintrag der Historie fett, ob geaendert oder nicht.
 * Seit die Fettschrift in der Merkmals-Tabelle „hier hat jemand eingegriffen"
 * bedeutet (`.ds-wert-geaendert`), waere das ein zweiter Wortsinn und die
 * Auszeichnung damit wertlos. Die Historie setzt ihre Werte darum normal; sie
 * heben sich ueber die gedaempfte Meta-Zeile daneben genug ab. Das normale
 * Gewicht steht ausdruecklich da, statt die Regel wegzulassen: so ist die
 * Entscheidung an der Fundstelle lesbar und eine Theme-Regel kann sie nicht
 * unbemerkt zurueckdrehen. */
.ds-historie-wert { font-weight: 400; }
.ds-historie-meta { color: var(--t-muted); font-size: 0.82rem; }

/* Aenderungen zwischen zwei Fassungen (BENT-2964).
 *
 * Die Aussage traegt das semantische Element (<del>/<ins>), nicht die Farbe:
 * Eine reine CSS-Durchstreichung sagt ein Vorleseprogramm nicht an, und im
 * Ausdruck ist sie je nach Drucker kaum zu sehen. Die Farbe kommt zusaetzlich
 * (dieselbe Regel wie bei den Herkunfts-Farben, BENT-2772), die Textdekoration
 * steht ausdruecklich da statt sich auf den Browser-Default zu verlassen.
 *
 * Rot und Gruen sind hier bewusst NUR im Historien-Panel vergeben und
 * kollidieren darum nicht mit den Auswahl-Farben der Tabelle (BENT-2957): dort
 * sagt die Auszeichnung „dieser Wert wurde geaendert", hier steht sie an
 * einzelnen Woertern INNERHALB einer Fassung. */
/* Der kleine Innen- und Aussenabstand ist nicht Kosmetik, er ist an der
 * Sichtprobe entstanden: Ein ersetztes Wort steht als „vorher" direkt vor dem
 * „nachher", und ohne Abstand lasen sich die beiden getoenten Flaechen als ein
 * Wort („vom Opavon der Oma"). Der Leerraum gehoert beim Wortvergleich zum
 * jeweiligen Token, es steht dort also keiner zur Verfuegung. */
.ds-diff-entfernt {
  background: var(--t-red-tint);
  color: var(--t-red);
  text-decoration: line-through;
  padding: 0 0.15em;
  margin: 0 0.08em;
  border-radius: 3px;
}
.ds-diff-neu {
  background: var(--t-green-tint);
  color: var(--t-green);
  text-decoration: underline;
  padding: 0 0.15em;
  margin: 0 0.08em;
  border-radius: 3px;
}
:root[data-theme="dark"] .ds-diff-entfernt { background: rgba(162, 58, 44, 0.26); color: #e59485; }
:root[data-theme="dark"] .ds-diff-neu      { background: rgba(46, 125, 50, 0.22); color: #7fd487; }

/* Story-Editor: Chips ueber dem Feld. */
.js-story-edit { margin-top: 0.75rem; }
.js-story-edit .ds-inline-editor__chips,
.js-story-edit .ds-inline-editor__extra { margin-top: 0.5rem; }
.js-story-edit .ds-inline-editor__extra .ds-input { flex: 1 1 12rem; margin-top: 0.4rem; }
.ds-inline-editor__foot {
  display: flex;
  flex-wrap: wrap;
  gap: 0.5rem 1rem;
  align-items: center;
  margin-top: 0.5rem;
}
/* Hinweis, Markierung und Rueckmeldung stehen als Gruppe links, das Historien-
   Icon bleibt rechts (BENT-2958). Frueher trug die Fusszeile nur zwei Kinder
   und kam mit space-between aus; die beiden Text-Klassen bringen aus dem
   Merkmal-Editor ein flex-basis: 100% mit, das hier jede Zeile aufspannen
   wuerde. */
.ds-inline-editor__foot .ds-inline-editor__hint,
.ds-inline-editor__foot .ds-inline-feedback { flex-basis: auto; }
.ds-inline-editor__foot .ds-historie-icon { margin-left: auto; }

/* ------------------------------------------------------------------ */
/* Bearbeitungs-Board (Kanban-Sicht, BENT-1843)                        */
/* ------------------------------------------------------------------ */
.kanban-toolbar {
  display: flex;
  gap: 0.5rem;
  align-items: center;
  flex-wrap: wrap;
  margin: 1rem 0 1.25rem;
}

/* Desktop: Spalten horizontal, bei Bedarf scrollbar. */
.kanban-board {
  display: flex;
  gap: 1rem;
  align-items: flex-start;
  overflow-x: auto;
  padding-bottom: 0.5rem;
}

.kanban-col {
  flex: 0 0 clamp(240px, 22vw, 300px);
  background: var(--t-card);
  border: 1px solid var(--t-rule);
  border-radius: 10px;
  padding: 0.5rem;
}
.kanban-col[open] { padding-bottom: 0.75rem; }

.kanban-col__head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 0.5rem;
  padding: 0.35rem 0.4rem;
  cursor: pointer;
  list-style: none;
  font-weight: 600;
}
.kanban-col__head::-webkit-details-marker { display: none; }
.kanban-col__title { font-size: 0.95rem; }
.kanban-col__count { flex-shrink: 0; }

.kanban-col__body {
  display: flex;
  flex-direction: column;
  gap: 0.6rem;
  margin-top: 0.5rem;
}
.kanban-col__leer { margin: 0.4rem 0.4rem 0; }

.kanban-card {
  background: var(--t-bg);
  border: 1px solid var(--t-hairline);
  border-radius: 8px;
  padding: 0.55rem;
  display: flex;
  flex-direction: column;
  gap: 0.4rem;
}
.kanban-card--warn {
  border-color: var(--t-amber);
  background: var(--t-amber-tint);
}

/* Auswahl-Entscheidung oben rechts (BENT-3281). Bewusst eine eigene Zeile und
   kein drittes Flex-Kind im Titel-Link: Die Spalte ist schmal (clamp 240..300px),
   neben dem 46px-Vorschaubild bliebe dem Titel sonst kaum Platz und er braeche
   ueber mehrere Zeilen. Die Zeile entsteht nur, wenn es eine Entscheidung gibt;
   eine offene Karte sieht damit unveraendert aus. */
.kanban-card__auswahl {
  display: flex;
  justify-content: flex-end;
  margin-bottom: -0.15rem;
}

.kanban-card__link {
  display: flex;
  gap: 0.55rem;
  align-items: flex-start;
  text-decoration: none;
  color: inherit;
}
.kanban-card__thumb {
  width: 46px;
  height: 46px;
  object-fit: cover;
  border-radius: 6px;
  border: 1px solid var(--t-rule);
  flex-shrink: 0;
}
.kanban-card__thumb--leer {
  display: flex;
  align-items: center;
  justify-content: center;
  background: var(--t-faint);
  color: var(--t-muted);
}
.kanban-card__main { display: flex; flex-direction: column; gap: 0.15rem; min-width: 0; }
.kanban-card__titel { font-weight: 600; line-height: 1.25; }
.kanban-card__id { font-size: 0.78rem; color: var(--t-muted); }

.kanban-card__meta { display: flex; flex-wrap: wrap; gap: 0.3rem; }

/* Entscheidungs-Zeile (BENT-2041): KI-Score (Zahl) links, Experten-Votum
   (Sterne-Chip) rechts. Umbricht bei schmaler Spalte, statt sie zu sprengen:
   die Spaltenbreite (.kanban-col) bleibt unangetastet, die Karte wird nur
   hoeher. Das Votum-Chip selbst ist nowrap (.ds-votum) und wandert als Ganzes
   in die naechste Zeile. */
.kanban-card__bewertung {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  justify-content: space-between;
  gap: 0.2rem 0.5rem;
}
.kanban-card__score {
  font-size: 0.8rem;
  font-weight: 600;
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}
.kanban-card__score--leer { font-weight: 400; color: var(--t-muted); }
.kanban-card__votum { min-width: 0; }

.kanban-card__foot {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 0.5rem;
  flex-wrap: wrap;
}
.kanban-card__person { min-width: 0; overflow: hidden; text-overflow: ellipsis; }
.kanban-card__dauer { font-size: 0.78rem; color: var(--t-muted); white-space: nowrap; }
.kanban-card__dauer--warn { color: var(--t-amber); font-weight: 600; }

.kanban-card__disp {
  border-top: 1px solid var(--t-hairline);
  padding-top: 0.35rem;
  font-size: 0.8rem;
}

/* Mobile: Spalten untereinander als aufklappbare Gruppen. */
@media (max-width: 720px) {
  .kanban-board { flex-direction: column; overflow-x: visible; }
  .kanban-col { flex: 1 1 auto; width: 100%; }
}
